I don't know how to use MRIcrotome very well, but on the other hand there doesn't seem to be a Wiki page for this, so I'm starting one. I've copied the basics from Making pretty figures using MRIcrotome (githack.com), where Jason Lerch wrote some good instructions:
Jason Lerch
2018-06-30
Load the required data from a file; for the moment, this contains two 3D volumes; anatVol and stats containing the anatomy to use in the background and the output of some statistical computations. (Note for RMINC users: in these examples anatVol and stats would be the output of mincArray)
load("sliceData.RData")
The best way to use MRIcrotome is through pipes; let’s load the full tidyverse for now (though only pipes are actively used). Also, the graphics subsystem is grid graphics, so let’s go ahead and load that as well.
library(tidyverse)
## Loading tidyverse: ggplot2
## Loading tidyverse: tibble
## Loading tidyverse: tidyr
## Loading tidyverse: readr
## Loading tidyverse: purrr
## Loading tidyverse: dplyr
## Conflicts with tidy packages ----------------------------------------------
## filter(): dplyr, stats
## lag(): dplyr, stats
## slice(): dplyr, .GlobalEnv, MRIcrotome
library(grid)
library(MRIcrotome)
That’s it for the set-up. On to actual package usage.
Simple figures
Starting off with the simplest figure; a coronal slice through the brain.
sliceSeries(nrow = 1, slices=200) %>%
anatomy(anatVol, low=700, high=1400) %>%
draw()
That’s the basic anatomy of displaying MRI anatomy. It always begins with a call to sliceSeries, following by a call to anatomy, and finally the command to draw the results.
Let’s prettify it, and overlay the stats.
sliceSeries(nrow = 1, slices=200) %>%
anatomy(anatVol, low=700, high=1400) %>%
overlay(stats, low=2, high=6, symmetric = T) %>%
draw()
So far, so good. A legend would be nice, though.
sliceSeries(nrow = 1, begin=200, end=300) %>%
anatomy(anatVol, low=700, high=1400) %>%
overlay(stats, low=2, high=6, symmetric = T) %>%
legend("t-statistics") %>%
draw()
The command is called sliceSeries for a reason …
sliceSeries(nrow = 5, ncol=5, begin=100, end=350) %>%
anatomy(anatVol, low=700, high=1400) %>%
overlay(stats, low=2, high=6, symmetric = T) %>%
legend("t-statistics") %>%
draw()
You can also have more than one slice series:
sliceSeries(nrow = 8, begin=100, end=350) %>%
anatomy(anatVol, low=700, high=1400) %>%
sliceSeries() %>% # if no arguments are specified, reuse previous sliceSeries args
anatomy() %>% # if no arguments are specified, reuse previous anatomy call
overlay(stats, low=2, high=6, symmetric = T) %>%
legend("t-statistics") %>%
draw()
And with some titles:
sliceSeries(nrow = 8, begin=100, end=350) %>%
anatomy(anatVol, low=700, high=1400) %>%
addtitle("Anatomy") %>%
sliceSeries() %>%
anatomy() %>%
overlay(stats, low=2, high=6, symmetric = T) %>%
addtitle("Stats") %>%
legend("t-statistics") %>%
draw()
And change the layout orientation
sliceSeries(ncol = 8, begin=100, end=350) %>%
anatomy(anatVol, low=700, high=1400) %>%
addtitle("Anatomy") %>%
sliceSeries() %>%
anatomy() %>%
overlay(stats, low=2, high=6, symmetric = T) %>%
addtitle("Stats") %>%
legend("t-statistics") %>%
draw(layout = "row")
Multiple legends
sliceSeries(ncol = 8, begin=100, end=350) %>%
anatomy(anatVol, low=700, high=1400) %>%
addtitle("Anatomy") %>%
legend() %>%
sliceSeries() %>%
anatomy() %>%
overlay(stats, low=2, high=6, symmetric = T) %>%
addtitle("Stats") %>%
legend("t-statistics") %>%
draw(layout = "row")
Let’s do multiple legends on the same slice series, going with a column layout
TODO: cannot use no-args version of anatomy() if asking for a legend
sliceSeries(nrow = 8, begin=100, end=350) %>%
anatomy(anatVol, low=700, high=1400) %>%
addtitle("Anatomy") %>%
sliceSeries() %>%
anatomy(anatVol, low=700, high=1400) %>%
legend() %>%
overlay(stats, low=2, high=6, symmetric = T) %>%
addtitle("Stats") %>%
legend("t-statistics") %>%
draw()
It can also do contours
sliceSeries(nrow = 1, begin=200, end=300) %>%
anatomy(anatVol, low=700, high=1400) %>%
contours(anatVol, levels=c(1000, 1400), col="blue") %>%
draw()
Of course contours can be mixed with sliceSeries as you please
sliceSeries(nrow = 1, begin=200, end=300) %>%
anatomy(anatVol, low=700, high=1400) %>%
sliceSeries() %>%
anatomy() %>%
contours(anatVol, levels=c(1000, 1400), col="blue") %>%
sliceSeries() %>%
contours(anatVol, levels=c(1000, 1400), col="blue") %>%
draw()
Contours can be given different colours, linetypes, and widths
sliceSeries(nrow = 1, begin=200, end=300) %>%
contours(anatVol, levels=c(1000, 1400), col=c("blue", "red"), lwd=1:2, lty=c(1,3)) %>%
draw()
The most likely use is combined with stats - let’s highlight the most significant:
sliceSeries(nrow = 1, begin=200, end=300) %>%
anatomy(anatVol, low=700, high=1400) %>%
overlay(stats, low=2, high=6, symmetric = T) %>%
legend("t-statistics") %>%
contours(abs(stats), levels=c(3,5), lwd=2, lty=c(3,1), col="green") %>%
draw()
Contours can of course have legends, too.
sliceSeries(nrow = 1, begin=200, end=300) %>%
anatomy(anatVol, low=700, high=1400) %>%
overlay(stats, low=2, high=6, symmetric = T) %>%
legend("t-statistics") %>%
contours(abs(stats), levels=c(3,5), lwd=2, lty=c(3,1), col="green") %>%
legend("Most sig.") %>%
draw()
And contours can take on any colour scale
sliceSeries(nrow = 1, begin=200, end=300) %>%
anatomy(anatVol, low=700, high=1400) %>%
contours(abs(stats), levels=2:6, col=topo.colors(255), lty=3) %>%
legend("t statistics") %>%
draw()
And of course works in slice series with multiple slices too
sliceSeries(nrow=5, ncol=6, begin=70, end=400) %>%
contours(anatVol, levels=c(1000, 1200, 1500), col=gray.colors(255)) %>%
draw()
Opacity can be controlled with the alpha parameter to anatomy and overlay:
sliceSeries(nrow=5, begin=150, end=250) %>%
anatomy(anatVol, low=700, high=1400) %>%
overlay(stats, 2, 6, symmetric = T, alpha=0.1) %>%
addtitle("alpha=0.1") %>%
sliceSeries() %>% anatomy() %>%
overlay(stats, 2, 6, symmetric = T, alpha=0.5) %>%
addtitle("alpha=0.5") %>%
sliceSeries() %>% anatomy() %>%
overlay(stats, 2, 6, symmetric = T, alpha=0.9) %>%
addtitle("alpha=0.9") %>%
draw()
And you can add indicators of your slice selection
sliceSeries(nrow=5, begin=150, end=250) %>%
anatomy(anatVol, low=700, high=1400) %>%
overlay(stats, 2, 6, symmetric = T, alpha=0.1) %>%
addtitle("alpha=0.1") %>%
sliceSeries() %>% anatomy() %>%
overlay(stats, 2, 6, symmetric = T, alpha=0.5) %>%
addtitle("alpha=0.5") %>%
sliceSeries() %>% anatomy() %>%
overlay(stats, 2, 6, symmetric = T, alpha=0.9) %>%
addtitle("alpha=0.9") %>%
legend("t-statistics") %>%
contourSliceIndicator(anatVol, c(700, 1400)) %>%
draw()
If you’d rather display a slice underneath the slice indicators, you can do that too
sliceSeries(nrow=5, begin=150, end=250) %>%
anatomy(anatVol, low=700, high=1400) %>%
overlay(stats, 2, 6, symmetric = T, alpha=0.1) %>%
addtitle("alpha=0.1") %>%
sliceSeries() %>% anatomy() %>%
overlay(stats, 2, 6, symmetric = T, alpha=0.5) %>%
addtitle("alpha=0.5") %>%
sliceSeries() %>% anatomy() %>%
overlay(stats, 2, 6, symmetric = T, alpha=0.9) %>%
addtitle("alpha=0.9") %>%
legend("t-statistics") %>%
anatomySliceIndicator(anatVol, 700, 1400) %>%
draw()
Let’s see some possible permutations of slice dimensions and sliceIndicator dimensions
sliceSeries(nrow=5, begin=150, end=250) %>%
anatomy(anatVol, low=700, high=1400) %>%
legend("t-statistics") %>%
contourSliceIndicator(anatVol,c(700, 1400)) %>%
draw()
sliceSeries(nrow=5, begin=150, end=250, dimension = 1) %>%
anatomy(anatVol, low=700, high=1400) %>%
legend("t-statistics") %>%
contourSliceIndicator(anatVol, c(700, 1400)) %>%
draw()
sliceSeries(nrow=5, begin=50, end=150, dimension = 3) %>%
anatomy(anatVol, low=700, high=1400) %>%
legend("t-statistics") %>%
contourSliceIndicator(anatVol, c(700, 1400)) %>%
draw()
sliceSeries(nrow=5, begin=50, end=150, dimension = 3) %>%
anatomy(anatVol, low=700, high=1400) %>%
legend("t-statistics") %>%
contourSliceIndicator(anatVol, c(700, 1400), dimension = 2) %>%
draw()
Here are some addition things I've learned by trial-and-error and/or harassing people:
The brain slices are by default shown in posterior-anterior order, which I find infuriating. In order to have them appear in anterior-posterior order, as they should always be, put the larger slice number first, like so: sliceSeries(begin=150, end=50).