|
Size: 4414
Comment: Added coordinate system entry from TosasFaq
|
Size: 8483
Comment: changed index formatting
|
| Deletions are marked like this. | Additions are marked like this. |
| Line 1: | Line 1: |
| #pragma section-numbers on [[Navigation(children)]] '''Index''' [[TableOfContents]] |
|
| Line 2: | Line 10: |
Freesurfer uses at least 4 voxel coordinate systems and 4 "RAS" coordinate systems. |
|
| Line 3: | Line 13: |
| Freesurfer uses at least 4 voxel coordinate systems and 4 "RAS" coordinate systems. |
|
| Line 19: | Line 27: |
| }}} | |
| Line 20: | Line 29: |
| The functional analysis stream uses another coordinate system to map from the src volume. | |
| Line 21: | Line 31: |
| Functional analysis(fMRI) part uses another coordinate system to map from the src volume. |
{{{ |
| Line 34: | Line 42: |
| }}} | |
| Line 39: | Line 47: |
| {{{ | |
| Line 44: | Line 52: |
| }}} | |
| Line 47: | Line 55: |
| The transform 4 (surfaceRASFromConformedVoxel) is fixed as | The transform 4 (surface``RAS``From``Conformed``Voxel) is fixed as |
| Line 49: | Line 57: |
| {{{ | |
| Line 54: | Line 62: |
| }}} | |
| Line 55: | Line 64: |
| The transform 1 (conformedVoxelFromVoxel) is calculated by (in a matrix sense) | The transform 1 (conformed``Voxel``From``Voxel) is calculated by (in a matrix sense) |
| Line 57: | Line 66: |
| {{{ | |
| Line 62: | Line 71: |
| }}} The transform 3(Surface``RAS``From``RAS) is calculated by (in a matrix sense). Note that it is independent of conformed voxel size S and the length L: |
|
| Line 63: | Line 74: |
| The transform 3(SurfaceRASFromRAS) is calculated by (in a matrix sense). Note that it is independent of conformed voxel size S and the length L: |
{{{ |
| Line 70: | Line 79: |
| }}} Because of the xform3 (changing only translation part), it is easy to calculate Surface``RAS``From``Voxel (xform3*xform0) and is given by |
|
| Line 71: | Line 82: |
| Because of the xform3 (changing only translation part), it is easy to calculate SurfaceRASFromVoxel (xform3*xform0) and is given by |
{{{ |
| Line 78: | Line 87: |
| }}} | |
| Line 83: | Line 92: |
| {{{ | |
| Line 88: | Line 97: |
| }}} | |
| Line 91: | Line 100: |
| = Relationship between lores and hires surfaceRAS = {{{ conformed vol -------------> surfRAS | | | | surfRASToRAS V V high res ------------> RAS | | | | Xfm V V low res ------------> RAS | | | | RASToSurfRAS V V conformed vol -------------> surfRAS |
|
| Line 92: | Line 116: |
| Therefore, the map from the high res surfaceRAS to the low res surfaceRAS is given by {{{ highresSurfRASTolowresSurfRAS = RASTosurfRAS(lowres) * Xfm * sufRASToRAS(highres) }}} which is not equal to Xfm. In fact, {{{ RASTosurfRAS(lowres) = 1 0 0 -c_r(lowres) surfRASTORAS(highres) = 1 0 0 c_r(highres) 0 1 0 -c_a(lowres) 0 1 0 c_a(highres) 0 0 1 -c_s(lowres) 0 0 1 c_s(highres) 0 0 0 1 0 0 0 1 }}} or write these as {{{ RASToSurfRAS(lowres) = [ 1 -C(lowres)] surfRASToRAS(highres) = [ 1 C(highres)] [ 0 1 ] [ 0 1 ] Xfm = [ R T ] [ 0 1 ] }}} Then, {{{ highresSurfRASTolowresSurfRAS = [ 1 -C(lowres)] x [ R T ] x [ 1 C(highres)] [ 0 1 ] [ 0 1 ] [ 0 1 ] = [ R R*C(highres)-C(lowres) + T ] [ 0 1 ] }}} The conclusion is that the transform is non-trivial. Even when R = 1 and T = 0 (no rotation), we have {{{ highresSurfRASTolowresSurfRAS = [ 1 C(highres)-C(lowres)] [ 0 1 ] }}} Therefore, when translating highres vertex positions into lowres vertex position, we must make sure that c_(ras) for highres and lowres must match exactly. = Direction cosines = Each volume format stores information in each own way. COR volume (COR-001, ...) stores it in COR-.info file. ["DICOM"] stores it in the file. Note that Analyze file (.img)stores it in .mat file, meanwhile bflort (.bfloat or .bshort) stores it in .bhdr file. For these formats it is essential to have these files. = MNI Talairach in tkmedit = ["tkmedit"] shows a non-identity Talairach even though talairach.xfm is an identity matrix. The reason is described in [http://www.mrc-cbu.cam.ac.uk/Imaging/Common/mnispace.shtml Cambride Imagers-MNI space]. ["tkmedit"] uses Approach 2 described in the web page. There are two talairach transformed used in ["tksurfer"]. One is MNI talairach and the other is modified talairach. The modified talairach is done in `tksurfer.c conv_initialize()`: {{{ For Z < 0: conv_mnital_to_tal_m_ltz = MatrixIdentity (4, NULL); stuff_four_by_four (conv_mnital_to_tal_m_ltz, 0.99, 0, 0, 0, 0.00, 0.9688, 0.042, 0, 0.00, -0.0485, 0.839, 0, 0.00, 0, 0, 1); }}} {{{ For Z > 0: conv_mnital_to_tal_m_gtz = MatrixIdentity (4, NULL); stuff_four_by_four (conv_mnital_to_tal_m_gtz, 0.99, 0, 0, 0, 0.00, 0.9688, 0.046, 0, 0.00, -0.0485, 0.9189, 0, 0.00, 0, 0, 1); }}} |
Index
1. Coordinate systems
Freesurfer uses at least 4 voxel coordinate systems and 4 "RAS" coordinate systems.
0. Stored in volume file
original volume ========> RAS ("scanner RAS", c_(r,a,s)!=0 in general)
| |
| 1. calculated | identity
| |
V 2. calculated V
conformed volume ========> RAS (to have the same c_(r,a,s) as above)
L^3 with S mm voxel |
| |
| identity | 3. calculated (translation)
| |
V 4. fixed(standard) V
conformed volume ========> SurfaceRAS with c_(r,a,s) = 0
L^3 with S mm voxel The functional analysis stream uses another coordinate system to map from the src volume.
original volume ========> RAS ("scanner RAS", c_(r,a,s) != 0 in general)
| |
| identity | calculated
V 5. fixed("standard") V
original volume ========> tkregRAS where c_(r,a,s) = 0
| |
| 6. calculated | mri2fmri (registration will give this)
| |
V 7. fixed("standard") V
overlay volume ========> fRAS where c_(r,a,s) = 0All these coordinate systems make it a rather difficult task to trace to the original source volume voxel index from surface or functional index. If you can follow the arrows, you can get the necessary transforms easily.
The transform 2 (CORONAL coordinates) is calculated so that the following equation holds. That is, the direction cosine part is fixed, but not the translation part. In this way, the conformed volume always in the CORONAL orientation.
[-1 0 0 s1][S 0 0 0][L/2] [c_r] s1 = c_r + S*L/2
[ 0 0 1 s2][0 S 0 0][L/2] = [c_a] ==> s2 = c_a - S*L/2
[ 0 -1 0 s3][0 0 S 0][L/2] [c_s] s3 = c_s + S*L/2
[ 0 0 0 1][0 0 0 1][ 1 ] [ 1 ]where c_(r,a,s) is from the "scanner RAS". This "scanner RAS" has the physical meaning of "Right-Anterior-Superior" directions of the head.
The transform 4 (surfaceRASFromConformedVoxel) is fixed as
[-1 0 0 S*L/2][S 0 0 0]
[ 0 0 1 -S*L/2][0 S 0 0]
[ 0 -1 0 S*L/2][0 0 S 0]
[ 0 0 0 1 ][0 0 0 1]The transform 1 (conformedVoxelFromVoxel) is calculated by (in a matrix sense)
xform1 = inv(xform2) * xform0 = [1/S 0 0 0][-1 0 0 s1] * xform0
[ 0 1/S 0 0][ 0 0 -1 s3]
[ 0 0 1/S 0][ 0 1 0 -s2]
[ 0 0 0 1][ 0 0 0 1 ] The transform 3(SurfaceRASFromRAS) is calculated by (in a matrix sense). Note that it is independent of conformed voxel size S and the length L:
xform3 = xform4 * inv(xform2) = [ 1 0 0 -c_r]
[ 0 1 0 -c_a]
[ 0 0 1 -c_s]
[ 0 0 0 1 ]Because of the xform3 (changing only translation part), it is easy to calculate SurfaceRASFromVoxel (xform3*xform0) and is given by
SurfaceRASFromVoxel = [ 3x3 part (t1 - c_r)]
[ same as (t2 - c_a)]
[ xform0 (t3 - c_s)]
[ 0 1 ]where t1,t2,t3 are the translation part of xform0.
The transform 5 and the transform 7 are calculated by the requirement
[-1 0 0 s1][xsize 0 0 0][width/2 ] [0]
[ 0 0 1 s2][ 0 ysize 0 0][height/2] = [0]
[ 0 -1 0 s3][ 0 0 zsize 0][depth/2 ] [0]
[ 0 0 0 1][ 0 0 0 1][ 1 ] [1]Here the name "RAS" lost the meaning completely. This "RAS" is just to be used for alignment purpose only. The width/height/depth are for the appropriate volume. The reason is that the original volume could be sagittal or horizontal.
2. Relationship between lores and hires surfaceRAS
conformed vol -------------> surfRAS
| |
| | surfRASToRAS
V V
high res ------------> RAS
| |
| | Xfm
V V
low res ------------> RAS
| |
| | RASToSurfRAS
V V
conformed vol -------------> surfRAS Therefore, the map from the high res surfaceRAS to the low res surfaceRAS is given by
highresSurfRASTolowresSurfRAS = RASTosurfRAS(lowres) * Xfm * sufRASToRAS(highres)
which is not equal to Xfm. In fact,
RASTosurfRAS(lowres) = 1 0 0 -c_r(lowres) surfRASTORAS(highres) = 1 0 0 c_r(highres)
0 1 0 -c_a(lowres) 0 1 0 c_a(highres)
0 0 1 -c_s(lowres) 0 0 1 c_s(highres)
0 0 0 1 0 0 0 1or write these as
RASToSurfRAS(lowres) = [ 1 -C(lowres)] surfRASToRAS(highres) = [ 1 C(highres)]
[ 0 1 ] [ 0 1 ]
Xfm = [ R T ]
[ 0 1 ]Then,
highresSurfRASTolowresSurfRAS = [ 1 -C(lowres)] x [ R T ] x [ 1 C(highres)]
[ 0 1 ] [ 0 1 ] [ 0 1 ]
= [ R R*C(highres)-C(lowres) + T ]
[ 0 1 ]The conclusion is that the transform is non-trivial. Even when R = 1 and T = 0 (no rotation), we have
highresSurfRASTolowresSurfRAS = [ 1 C(highres)-C(lowres)]
[ 0 1 ]Therefore, when translating highres vertex positions into lowres vertex position, we must make sure that c_(ras) for highres and lowres must match exactly.
3. Direction cosines
Each volume format stores information in each own way. COR volume (COR-001, ...) stores it in COR-.info file. ["DICOM"] stores it in the file. Note that Analyze file (.img)stores it in .mat file, meanwhile bflort (.bfloat or .bshort) stores it in .bhdr file. For these formats it is essential to have these files.
4. MNI Talairach in tkmedit
["tkmedit"] shows a non-identity Talairach even though talairach.xfm is an identity matrix. The reason is described in [http://www.mrc-cbu.cam.ac.uk/Imaging/Common/mnispace.shtml Cambride Imagers-MNI space]. ["tkmedit"] uses Approach 2 described in the web page.
There are two talairach transformed used in ["tksurfer"]. One is MNI talairach and the other is modified talairach. The modified talairach is done in tksurfer.c conv_initialize():
For Z < 0:
conv_mnital_to_tal_m_ltz = MatrixIdentity (4, NULL);
stuff_four_by_four (conv_mnital_to_tal_m_ltz,
0.99, 0, 0, 0,
0.00, 0.9688, 0.042, 0,
0.00, -0.0485, 0.839, 0,
0.00, 0, 0, 1);For Z > 0:
conv_mnital_to_tal_m_gtz = MatrixIdentity (4, NULL);
stuff_four_by_four (conv_mnital_to_tal_m_gtz,
0.99, 0, 0, 0,
0.00, 0.9688, 0.046, 0,
0.00, -0.0485, 0.9189, 0,
0.00, 0, 0, 1);