$FSLDIR/bin/bet ${out}/${b_in}_t1_reoriented ${out}/${b_in}_t1_reoriented_brain
This is an old revision of the document!
Table of Contents
Nueva version de procesamiento de DTI (FACEHBI)
Corregistro
El corregistro de imagenes DTI usando ANTs en el proyecto MOPEAD funciona correctamente.
No obstante en FACEHBI las imagenes DTI estan cortadas por el frontal y por el cerebelo. El soft de corregistro es muchas cosas pero definitivamente no es magico.
Lo que voy a intentar es combinar los dos metodos utilizados hasta ahora, el de la vesion 0.2 del pipeline (viejo) y el de la version 0.3 del pipeline (nuevo). El primero usa flirt y fnirt y hace su trabajo pero no con demasiado lustro, el segundo usa ANTs y es espectacular poniendo la nariz en el cuello.
El primer metodo consiste en registrar la FA a la plantilla de FA de FSL. Esto funciona mas o menos bien y nos da una base para mover el B0 al espacio MNI y de ahi al espacio T1. Lo que voy a hacer es utilizar este B0 trasladado al espacio T1 para hacer una mascara. Aplico esta mascara al T1 y con este T1 chopeado puedo utilizar ANTs. O sea, registro el B0 al T1 cortado.
Despues de muchas vueltas esta es la mejor aproximacion que he logrado.
Para meter esto en el dti_reg tengo que definir un modo nuevo,
if (/^-chop/) {$old=1; $chop=1;}
y añadir el procedimiento,
if($chop){ $order = $pipe_dir."/bin/dti_proc_x.sh ".$names[0]." ".$t1_names[0]." ".$dtis{$subject}.$subject." ".$w_dir; }else{
Esta cosa funciona mas o menos.
Ahora el report. Es muy complicado identificar un buen registro en el espacio nativo DTI dada la baja resolucion de las imagenes. Lo mejor es hacer la comprobacion en el espacio nativo T1, que es el mayor resolucion. He comprobado que la deformacion inversa funciona correctamente asi que si esta bien registrado en T1 debe quedar correcto en DTI.
Voy a hacer un report con los B0 trasladados a espacio de T1.
Ahora vamos a probarlo,
[osotolongo@detritus facehbi]$ dti_reg.pl -chop facehbi ... [osotolongo@detritus facehbi]$ make_dti_report_x.pl facehbi
Tras esto toca hacer una revision visual de los regitros. Primero apunto los sujetos que he proceso, en el formato necesario para utilizar posteriormente este archivo,
[osotolongo@detritus facehbi]$ for x in working/dtis/*reoriented.png; do y=$(echo ${x} | awk -F"_" '{print $6}'); echo $y; done | sed 's/smc\(.*\)/\1;smc/' > dti_regs.csv
Ahora edito el archivo y BORRO los sujetos mal registrados. Los restante sujetos son lso suceptibles de ser tratados mediante tractografia.
De las 198 imagenes tengo 125 correctamente registradas. No es niguna maravilla pero dados los problemas en la adquisicion es casi magico.
Ejemplo de imagen bien registrada,
Ejemplo de imagen mal registrada,
Resumen: Debo hacer inspeccion visual del report y hacer un csv con los sujetos bien registrados. Para esto basta con hacer,
[osotolongo@detritus facehbi]$ ls working/dtis/*_reoriented.png | awk -F"smc" {'print $3'} | awk -F"_" {'print $1'} | sed 's/\(.*\)/\1;smc/' > dti_reg_review.csv
y despues editar el archivo dti_reg_review.csv para borrar los sujetos con registro erroneo.
De esta manera quedaria todo preparado para las metricas, bastaria superponer los archivos,
XXXX_dti_FA.nii.gz XXXX_dti_MD.nii.gz XXXX_JHU_labels.nii.gz XXXX_JHU_tracts.nii.gz
Tractografia
Tanto bedpostx como probtrackx funcionan en espacio nativo DTI. Esto nosha obligado a mover todo al espacio DTI pero ya tenemos las matrices necesarias, provenientes del registro.
Hay dos tipos de tractoggrafia que deseamos hacer. Primero, suministrando las regiones, segun la segmentacion de Freesurfer, en el archivo dti_track.seed.
Aqui he escrito un nuevo procedimiento, cambiando el registro de aseg (mas bien aparc) para que use la matriz warp inversa de ANTs.
Suena raro pero en el codigo se entiende mejor
La segunda opcion es usar un atlas (por ahora el de la UofM),
No todas las ROI del atlas estan en el mismo formato. Hay que chequear cada ROI que se añada y en caso necesario registrarla usando 1mm o 2mm segun sea apropiado.
Algo asi,
dim1=$(fslinfo ${x} | grep "^dim1" | awk {'print $2'}); if [ ${dim1} = 91 ]; then if [ ! -e ${td}/${pollo}_dti_mni_t121Warp.nii.gz ]; then antsRegistrationSyNQuick.sh -d 3 -f ${w_dir}/${pollo}_t1_reoriented.nii.gz -m ${FSLDIR}/data/standard/MNI152_T1_2mm.nii.gz -o ${td}/${pollo}_dti_mni_t12 -t s; fi; antsApplyTransforms -d 3 -i ${x} -r ${w_dir}/${pollo}_t1_reoriented.nii.gz -t ${td}/${pollo}_dti_mni_t121Warp.nii.gz -t ${td}/${pollo}_dti_mni_t120GenericAffine.mat -o ${td}/${node}_warped.nii.gz; else antsApplyTransforms -d 3 -i ${x} -r ${w_dir}/${pollo}_t1_reoriented.nii.gz -t ${td}/${pollo}_mni_t1_warp1Warp.nii.gz -t ${td}/${pollo}_mni_t1_warp0GenericAffine.mat -o ${td}/${node}_warped.nii.gz; fi; antsApplyTransforms -d 3 -i ${td}/${node}_warped.nii.gz -r ${td}/${pollo}_dti_b0.nii.gz -t [${w_dir}/${pollo}_t1_dti_warp0GenericAffine.mat, 1] -t ${w_dir}/${b_in}_t1_dti_warp1InverseWarp.nii.gz -n GenericLabel[Linear] -o ${td}/${pollo}_${node}.nii.gz
Esto tengo que añadirloal codigo nuevo pero ademas tengo que revisar el codigo anterior para asegurarme que se tiene en cuenta. (Probado con MOPEAD OK)
Aqui hay que hacer dos trasnformaciones
Probando la primera opcion, (FPCustom)
[osotolongo@detritus facehbi]$ cat dti_track.seed 1003 1008 1015 1018 1020 1022 1024 1028 1029 1030 1031 2003 2008 2015 2018 2020 2022 2024 2028 2029 2030 2031 [osotolongo@detritus facehbi]$ dti_track.pl -cut test_t.csv -t1 facehbi [osotolongo@detritus facehbi]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 26994 cuda dti_trac osotolon PD 0:00 1 (Resources) 26995 devel dti_trac osotolon PD 0:00 1 (Dependency) 26991 cuda dti_trac osotolon R 0:02 1 brick01 26992 cuda dti_trac osotolon R 0:02 1 brick01 26993 cuda dti_trac osotolon R 0:02 1 detritus
Nota: Estas son las fibras que conectan las regiones especificadas en el archivo dti_track.seed. Para conocer el valor medio de FA o MD en estas fibras solo habria que hacer una mascara con ellas y aplicarla a la imagen correspondiente que ya tenemos despues del dti_fit.
Aqui probando la segunda opcion, (Atlas UofM)
[osotolongo@detritus facehbi]$ cat test_t.csv 0001;smc 0003;smc 0004;smc 0006;smc [osotolongo@detritus facehbi]$ dti_track.pl -cut test_t.csv -t1 -uofm DMN facehbi [osotolongo@detritus facehbi]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 25671 devel dti_trac osotolon PD 0:00 1 (Dependency) 25668 cuda dti_trac osotolon R 0:02 1 brick01 25669 cuda dti_trac osotolon R 0:02 1 brick01 25670 cuda dti_trac osotolon R 0:02 1 detritus
Procedimiento individual para FACEHBI
Corregistro
[osotolongo@detritus facehbi]$ dti_reg.pl -chop facehbi [osotolongo@detritus facehbi]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 25410 devel dti_reg- osotolon PD 0:00 1 (Resources) 25411 devel dti_reg- osotolon PD 0:00 1 (Priority) 25412 devel dti_reg- osotolon PD 0:00 1 (Priority) 25413 devel dti_reg- osotolon PD 0:00 1 (Priority) 25414 devel dti_reg- osotolon PD 0:00 1 (Priority) 25415 devel dti_reg- osotolon PD 0:00 1 (Priority) 25416 devel dti_reg- osotolon PD 0:00 1 (Priority) 25417 devel dti_reg- osotolon PD 0:00 1 (Priority) 25418 devel dti_reg- osotolon PD 0:00 1 (Priority) 25419 devel dti_reg- osotolon PD 0:00 1 (Priority) [osotolongo@detritus facehbi]$ make_dti_report_x.pl facehbi
y revisar los corregistros visualmente.
Metricas
[osotolongo@detritus facehbi]$ dti_metrics.pl -cut dti_reg_review.csv -a1 facehbi
Tractografia
Seleccionando regiones segun segmentacion de FS. (dti_track_seed)
[osotolongo@detritus facehbi]$ dti_track.pl -cut dti_reg_review.csv -t1 facehbi [osotolongo@detritus facehbi]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 27210 cuda dti_trac osotolon PD 0:00 1 (Resources) 27211 cuda dti_trac osotolon PD 0:00 1 (Priority) 27212 cuda dti_trac osotolon PD 0:00 1 (Priority) 27213 cuda dti_trac osotolon PD 0:00 1 (Priority) 27214 cuda dti_trac osotolon PD 0:00 1 (Priority) 27215 cuda dti_trac osotolon PD 0:00 1 (Priority) 27216 cuda dti_trac osotolon PD 0:00 1 (Priority) 27217 cuda dti_trac osotolon PD 0:00 1 (Priority) 27218 cuda dti_trac osotolon PD 0:00 1 (Priority) ... 27332 devel dti_trac osotolon PD 0:00 1 (Dependency) 27207 cuda dti_trac osotolon R 0:07 1 brick01 27208 cuda dti_trac osotolon R 0:07 1 brick01 27209 cuda dti_trac osotolon R 0:07 1 detritus
y sacar las metricas,
$ dti_metrics_alt.pl -cut dti_reg_review.csv facehbi
Usando atlas UofM
[osotolongo@detritus bin]$ dti_track.pl -t1 -uofm DMN facehbi [osotolongo@detritus bin]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 25473 cuda dti_trac osotolon PD 0:00 1 (Resources) 25474 cuda dti_trac osotolon PD 0:00 1 (Priority) 25475 cuda dti_trac osotolon PD 0:00 1 (Priority) 25476 cuda dti_trac osotolon PD 0:00 1 (Priority) 25477 cuda dti_trac osotolon PD 0:00 1 (Priority) 25478 cuda dti_trac osotolon PD 0:00 1 (Priority) 25479 cuda dti_trac osotolon PD 0:00 1 (Priority) 25480 cuda dti_trac osotolon PD 0:00 1 (Priority) 25481 cuda dti_trac osotolon PD 0:00 1 (Priority) 25482 cuda dti_trac osotolon PD 0:00 1 (Priority) 25483 cuda dti_trac osotolon PD 0:00 1 (Priority) 25484 cuda dti_trac osotolon PD 0:00 1 (Priority) 25485 cuda dti_trac osotolon PD 0:00 1 (Priority) ......
Notas
MNI → T1
[osotolongo@detritus facehbi]$ ANTS 3 -m CC[working/smc0177_t1_reoriented.nii.gz, ${FSLDIR}/data/standard/MNI152_T1_1mm.nii.gz, 1, 4] -r Gauss[0,3] -t Elast[1.5] -i 30x20x10 -o working/.tmp_smc0177/smc0177_dti_mni_t1.nii.gz [osotolongo@detritus facehbi]$ WarpImageMultiTransform 3 /usr/local/fsl/data/standard/MNI152_T1_1mm.nii.gz working/.tmp_smc0177/mni_warped_tmp.nii.gz -R working/smc0177_t1_reoriented.nii.gz working/.tmp_smc0177/smc0177_dti_mni_t1Warp.nii.gz working/.tmp_smc0177/smc0177_dti_mni_t1Affine.txt
T1 → DTI
Sacar el B0,
[osotolongo@detritus facehbi]$ fslroi dti/smc0177s0020.nii.gz working/.tmp_smc0177/smc0177_b0.nii.gz 0 1
Transformacion,
[osotolongo@detritus facehbi]$ ANTS 3 -m CC[working/.tmp_smc0177/smc0177_b0.nii.gz, working/smc0177_t1_reoriented.nii.gz, 1, 4] -r Gauss[0,3] -t Elast[1.5] -i 30x20x10 -o working/smc0177_dti_t1_b0.nii.gz [osotolongo@detritus facehbi]$ WarpImageMultiTransform 3 working/smc0177_t1_reoriented.nii.gz working/.tmp_smc0177/smc0177_t1_to_b0.nii.gz -R working/.tmp_smc0177/smc0177_b0.nii.gz working/.tmp_smc0177/smc0177_dti_t1_b0Warp.nii.gz working/.tmp_smc0177/smc0177_dti_t1_b0Affine.txt
Aqui esta el problema , el T1 no se puede transformar correctamente al B0. Hay que dar una vuelta mas aqui.
Vamos a intentar registrar el DTI a T1 con epi_reg e invertir la transformación, 1)
[osotolongo@detritus facehbi]$ ${FSLDIR}/bin/epi_reg --epi=working/smc0177_data.nii.gz --t1=working/smc0177_t1_reoriented --t1brain=working/smc0177_t1_reoriented_brain --out=working/smc0177_tmp_diff2std [osotolongo@detritus facehbi]$ convert_xfm -omat working/smc0177_tmp_std2diff.mat -inverse working/smc0177_tmp_diff2std.mat [osotolongo@detritus facehbi]$ flirt -in working/smc0177_t1_reoriented.nii.gz -ref working/.tmp_smc0177/smc0177_b0.nii.gz -out working/smc0177_t12b0 -init working/smc0177_tmp_std2diff.mat -applyxfm
EH! esto queda mucho mejor. A ver si se puede mejorar mas,
[osotolongo@detritus facehbi]$ ANTS 3 -m CC[working/.tmp_smc0177/smc0177_b0.nii.gz, working/smc0177_t12b0.nii.gz, 1, 4] -r Gauss[0,3] -t Elast[1.5] -i 30x20x10 -o working/smc0177_dti_t1_b0.nii.gz [osotolongo@detritus facehbi]$ WarpImageMultiTransform 3 working/smc0177_t12b0.nii.gz working/.tmp_smc0177/smc0177_t1_to_b0.nii.gz -R working/.tmp_smc0177/smc0177_b0.nii.gz working/.tmp_smc0177/smc0177_dti_t1_b0Warp.nii.gz working/.tmp_smc0177/smc0177_dti_t1_b0Affine.txt
AArrgH! ANTs falla al hacer la transformacion. La alternativa puede ser mover todo al T1 que es la imagen con mas informacion y calcular los valores de FA en el espacio nativo del T1
A ver que pasa si hago el warp al reves, del DTI al T1,
[osotolongo@detritus facehbi]$ ANTS 3 -m CC[working/smc0177_t1_reoriented.nii.gz, working/.tmp_smc0177/smc0177_b0.nii.gz, 1, 4] -r Gauss[0,3] -t Elast[1.5] -i 30x20x10 -o working/smc0177_t1_dti_warped_one.nii.gz [osotolongo@detritus facehbi]$ WarpImageMultiTransform 3 working/.tmp_smc0177/smc0177_b0.nii.gz working/smc0177_t1_to_b0.nii.gz -R working/smc0177_t1_reoriented.nii.gz working/smc0177_t1_dti_warped_oneWarp.nii.gz working/smc0177_t1_dti_warped_oneAffine.txt
un desastre!
Vamos a intentar usando primero epi_reg,
[osotolongo@detritus facehbi]$ ${FSLDIR}/bin/epi_reg --epi=working/smc0177_data.nii.gz --t1=working/smc0177_t1_reoriented --t1brain=working/smc0177_t1_reoriented_brain --out=working/smc0177_tmp_diff2std [osotolongo@detritus facehbi]$ flirt -in working/.tmp_smc0177/smc0177_b0.nii.gz -ref working/smc0177_t1_reoriented.nii.gz -out working/smc0177_tmp_diff2std.nii.gz -init working/smc0177_tmp_diff2std.mat -applyxfm
El B0 queda bastante bien para ser una transformacion lineal, cualquiera diria que con un empujocito mas ya queda OK.
[osotolongo@detritus facehbi]$ ANTS 3 -m CC[working/smc0177_t1_reoriented.nii.gz, working/smc0177_tmp_diff2std.nii.gz, 1, 4] -r Gauss[0,3] -t Elast[1.5] -i 30x20x10 -o working/smc0177_t1_dti_warped_two.nii.gz [osotolongo@detritus facehbi]$ WarpImageMultiTransform 3 working/smc0177_tmp_diff2std.nii.gz working/smc0177_b0_to_t1.nii.gz -R working/smc0177_t1_reoriented.nii.gz working/smc0177_t1_dti_warped_twoWarp.nii.gz working/smc0177_t1_dti_warped_twoAffine.txt
Pero no!. ANTs no hace caso de la imagen inicial, solo intenta cualquier tipo de transformacion que encaje el B0 en el T1. Este approach es tan malo como el anterior.
A ver que pasa con un enfoque pure FSL.
[osotolongo@detritus facehbi]$ fnirt --in=working/.tmp_smc0177/smc0177_b0.nii.gz --aff=working/smc0177_tmp_diff2std.mat --cout=working/smc0177_tmp_nonlinear_diff2std --ref=working/smc0177_t1_reoriented.nii.gz [osotolongo@detritus facehbi]$ applywarp -r working/smc0177_t1_reoriented.nii.gz -i working/.tmp_smc0177/smc0177_b0.nii.gz -w working/smc0177_tmp_nonlinear_diff2std -o working/smc0177_dif2std_warped
Desastrozo.
DTI → T1
La mejor opcion parece ser un corregstro lineal del DTi a espacio nativo T1, usando epi_reg, y medir en el espacio T1.
[osotolongo@detritus facehbi]$ flirt -ref working/smc0177_t1_reoriented.nii.gz -in working/.tmp_smc0177/smc0177_b0.nii.gz -out working/smc0177_b02t1 -init working/smc0177_tmp_diff2std.mat -applyxfm
Todas las transformaciones al espacio T1 parecen funcionar apropiadamente. Se pueden pasar los atlas a espacio T1 y la imagen FA a espacio T1.
No obstante, al hacer lo mismo con los atlas se puede ver que la cosa no funciona OK. Quedan demasiado desplazados.
DTI → MNI
La mejor opcion parece ser el protocolo antiguo,
[osotolongo@detritus facehbi]$ flirt -ref /usr/local/fsl/data/standard/FMRIB58_FA_1mm.nii.gz -in working/smc0177_dti_FA.nii.gz -omat working/smc0177_dti_affine.mat [osotolongo@detritus facehbi]$ fnirt --in=working/smc0177_dti_FA.nii.gz --aff=working/smc0177_dti_affine.mat --cout=working/smc0177_dti_warp --config=FA_2_FMRIB58_1mm [osotolongo@detritus facehbi]$ applywarp --ref=/usr/local/fsl/data/standard/FMRIB58_FA_1mm.nii.gz --in=working/smc0177_dti_FA.nii.gz --warp=working/smc0177_dti_warp --out=working/smc0177_fa_std
Lo que puedo hacer es llevar el B0 a espacio MNI con esta info, de ahi al T1 sin problemas,recortar el T1 segun el tamaño del B0 que me quede y registrar el B0 con ANTs a un T1 recortado,
[osotolongo@detritus facehbi]$ applywarp --ref=/usr/local/fsl/data/standard/MNI152_T1_1mm.nii.gz --in=working/smc0177_dti_b0 --warp=working/smc0177_dti_warp --out=working/smc0177_b0_std [osotolongo@detritus facehbi]$ fslmaths working/smc0177_b0_std -bin working/smc0177_b0_std_mask [osotolongo@detritus facehbi]$ fslmaths /usr/local/fsl/data/standard/MNI152_T1_1mm.nii.gz -mas working/smc0177_b0_std_mask.nii.gz working/smc0177_mni_masked [osotolongo@detritus facehbi]$ WarpImageMultiTransform 3 working/smc0177_mni_masked.nii.gz working/.tmp_smc0177/mni_mask_warped_tmp.nii.gz -R working/smc0177_t1_reoriented.nii.gz working/.tmp_smc0177/smc0177_dti_mni_t1Warp.nii.gz working/.tmp_smc0177/smc0177_dti_mni_t1Affine.txt [osotolongo@detritus facehbi]$ fslmaths working/smc0177_t1_reoriented.nii.gz -mas working/.tmp_smc0177/mni_mask_warped_tmp.nii.gz working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz [osotolongo@detritus facehbi]$ ANTS 3 -m CC[working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz, working/.tmp_smc0177/smc0177_b0.nii.gz, 1, 4] -r Gauss[0,3] -t Elast[1.5] -i 30x20x10 -o working/smc0177_t1_dti_warped.nii.gz [osotolongo@detritus facehbi]$ WarpImageMultiTransform 3 working/.tmp_smc0177/smc0177_b0.nii.gz working/smc0177_b0_to_t1.nii.gz -R working/smc0177_t1_reoriented.nii.gz working/smc0177_t1_dti_warpedWarp.nii.gz working/smc0177_t1_dti_warpedAffine.txt
intentando guardar la transformacion inversa
Hay un problema con el procesamientoen espacio T1. Aunque las metricas usuales de FA y/o MD pueden calcularse sin problemas, la tractografia ha de hacerse en espacio DTI. por lo que las mascaras han de llevarse de espacio MNI a espacio nativo T1 a espacio nativo DTI. Y aqui tenemos un problema pues no hemos logrado obtener esta transformatcion adecuadamente.
Voy a intentar cambiar la transformacion de ANTs, utilizando los scripts de ANTs. Intentare la mas sencilla primero.
[osotolongo@detritus facehbi]$ antsRegistrationSyNQuick.sh -d 3 -f working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz -m working/.tmp_smc0177/smc0177_b0.nii.gz -o working/smc0177_t1_dti_warped_quick -t s -------------------------------------------------------------------------------------- Mapping parameters -------------------------------------------------------------------------------------- ANTSPATH is /nas/usr/local/opt/bin/ants/bin Dimensionality: 3 Output name prefix: working/smc0177_t1_dti_warped_quick Fixed images: working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz Moving images: working/.tmp_smc0177/smc0177_b0.nii.gz Mask images: Initial transforms: Number of threads: 1 Spline distance: 26 Transform type: s MI histogram bins: 32 Precision: d Use histogram matching 0 ====================================================================================== antsRegistration call: -------------------------------------------------------------------------------------- /nas/usr/local/opt/bin/ants/bin/antsRegistration --verbose 1 --dimensionality 3 --float 0 --collapse-output-transforms 1 --output [ working/smc0177_t1_dti_warped_quick,working/smc0177_t1_dti_warped_quickWarped.nii.gz,working/smc0177_t1_dti_warped_quickInverseWarped.nii.gz ] --interpolation Linear --use-histogram-matching 0 --winsorize-image-intensities [ 0.005,0.995 ] --initial-moving-transform [ working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz,working/.tmp_smc0177/smc0177_b0.nii.gz,1 ] --transform Rigid[ 0.1 ] --metric MI[ working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz,working/.tmp_smc0177/smc0177_b0.nii.gz,1,32,Regular,0.25 ] --convergence [ 1000x500x250x0,1e-6,10 ] --shrink-factors 8x4x2x1 --smoothing-sigmas 3x2x1x0vox --transform Affine[ 0.1 ] --metric MI[ working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz,working/.tmp_smc0177/smc0177_b0.nii.gz,1,32,Regular,0.25 ] --convergence [ 1000x500x250x0,1e-6,10 ] --shrink-factors 8x4x2x1 --smoothing-sigmas 3x2x1x0vox --transform SyN[ 0.1,3,0 ] --metric MI[ working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz,working/.tmp_smc0177/smc0177_b0.nii.gz,1,32] --convergence [ 100x70x50x0,1e-6,10 ] --shrink-factors 8x4x2x1 --smoothing-sigmas 3x2x1x0vox -------------------------------------------------------------------------------------- All_Command_lines_OK .....
El script nos da unas opciones de input muy simples y ademas muestra cual seria el call de antsRegistration apropiado
. en caso de necesidad podria modificarse esta linea y ejecutarla directamente.
Los archivos de output contienen las transformaciones directas e inversas,
[osotolongo@detritus facehbi]$ ls working/smc0177_t1_dti_warped_quick* working/smc0177_t1_dti_warped_quick0GenericAffine.mat working/smc0177_t1_dti_warped_quick1Warp.nii.gz working/smc0177_t1_dti_warped_quickWarped.nii.gz working/smc0177_t1_dti_warped_quick1InverseWarp.nii.gz working/smc0177_t1_dti_warped_quickInverseWarped.nii.gz
Para aplicar la transformacion directa,
[osotolongo@detritus facehbi]$ antsApplyTransforms -d 3 -i working/.tmp_smc0177/smc0177_b0.nii.gz -r working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz -t working/smc0177_t1_dti_warped_quick1Warp.nii.gz -t working/smc0177_t1_dti_warped_quick0GenericAffine.mat -o working/smc0177_b0_to_t1_quick.nii.gz
o
[osotolongo@detritus facehbi]$ antsApplyTransforms -d 3 -i working/.tmp_smc0177/smc0177_b0.nii.gz -r working/smc0177_t1_reoriented.nii.gz -t working/smc0177_t1_dti_warped_quick1Warp.nii.gz -t working/smc0177_t1_dti_warped_quick0GenericAffine.mat -o working/smc0177_b0_to_t1_quick.nii.gz
que funcionan mas o menos igual. Existe una ligera deformacion en la parte superior por lo que hay que explorar las opciones del registro para mejorarlo. Voy a intentat quitar el quick y usar el histogram matching.
[osotolongo@detritus facehbi]$ antsRegistrationSyN.sh -d 3 -f working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz -m working/.tmp_smc0177/smc0177_b0.nii.gz -o working/smc0177_t1_dti_warped_quick -t s -j 1 -------------------------------------------------------------------------------------- Mapping parameters -------------------------------------------------------------------------------------- ANTSPATH is /nas/usr/local/opt/bin/ants/bin Dimensionality: 3 Output name prefix: working/smc0177_t1_dti_warped_quick Fixed images: working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz Moving images: working/.tmp_smc0177/smc0177_b0.nii.gz Mask images: Initial transforms: Number of threads: 1 Spline distance: 26 Transform type: s CC radius: 4 Precision: d Use histogram matching 1 ====================================================================================== antsRegistration call: -------------------------------------------------------------------------------------- /nas/usr/local/opt/bin/ants/bin/antsRegistration --verbose 1 --dimensionality 3 --float 0 --collapse-output-transforms 1 --output [ working/smc0177_t1_dti_warped_quick,working/smc0177_t -------------------------------------------------------------------------------------- Mapping parameters -------------------------------------------------------------------------------------- ANTSPATH is /nas/usr/local/opt/bin/ants/bin Dimensionality: 3 Output name prefix: working/smc0177_t1_dti_warped_quick Fixed images: working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz Moving images: working/.tmp_smc0177/smc0177_b0.nii.gz Mask images: Initial transforms: Number of threads: 1 Spline distance: 26 Transform type: s CC radius: 4 Precision: d Use histogram matching 1 ====================================================================================== antsRegistration call: -------------------------------------------------------------------------------------- /nas/usr/local/opt/bin/ants/bin/antsRegistration --verbose 1 --dimensionality 3 --float 0 --collapse-output-transforms 1 --output [ working/smc0177_t1_dti_warped_quick,working/smc0177_t1_dti_warped_quickWarped.nii.gz,working/smc0177_t1_dti_warped_quickInverseWarped.nii.gz ] --interpolation Linear --use-histogram-matching 1 --winsorize-image-intensities [ 0.005,0.995 ] --initial-moving-transform [ working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz,working/.tmp_smc0177/smc0177_b0.nii.gz,1 ] --transform Rigid[ 0.1 ] --metric MI[ working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz,working/.tmp_smc0177/smc0177_b0.nii.gz,1,32,Regular,0.25 ] --convergence [ 1000x500x250x100,1e-6,10 ] --shrink-factors 8x4x2x1 --smoothing-sigmas 3x2x1x0vox --transform Affine[ 0.1 ] --metric MI[ working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz,working/.tmp_smc0177/smc0177_b0.nii.gz,1,32,Regular,0.25 ] --convergence [ 1000x500x250x100,1e-6,10 ] --shrink-factors 8x4x2x1 --smoothing-sigmas 3x2x1x0vox --transform SyN[ 0.1,3,0 ] --metric CC[ working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz,working/.tmp_smc0177/smc0177_b0.nii.gz,1,4 ] --convergence [ 100x70x50x20,1e-6,10 ] --shrink-factors 8x4x2x1 --smoothing-sigmas 3x2x1x0vox -------------------------------------------------------------------------------------- All_Command_lines_OK 1_dti_warped_quickWarped.nii.gz,working/smc0177_t1_dti_warped_quickInverseWarped.nii.gz ] --interpolation Linear --use-histogram-matching 1 --winsorize-image-intensities [ 0.005,0.995 ] --initial-moving-transform [ working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz,working/.tmp_smc0177/smc0177_b0.nii.gz,1 ] --transform Rigid[ 0.1 ] --metric MI[ working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz,working/.tmp_smc0177/smc0177_b0.nii.gz,1,32,Regular,0.25 ] --convergence [ 1000x500x250x100,1e-6,10 ] --shrink-factors 8x4x2x1 --smoothing-sigmas 3x2x1x0vox --transform Affine[ 0.1 ] --metric MI[ working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz,working/.tmp_smc0177/smc0177_b0.nii.gz,1,32,Regular,0.25 ] --convergence [ 1000x500x250x100,1e-6,10 ] --shrink-factors 8x4x2x1 --smoothing-sigmas 3x2x1x0vox --transform SyN[ 0.1,3,0 ] --metric CC[ working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz,working/.tmp_smc0177/smc0177_b0.nii.gz,1,4 ] --convergence [ 100x70x50x20,1e-6,10 ] --shrink-factors 8x4x2x1 --smoothing-sigmas 3x2x1x0vox -------------------------------------------------------------------------------------- All_Command_lines_OK [osotolongo@detritus facehbi]$ antsApplyTransforms -d 3 -i working/.tmp_smc0177/smc0177_b0.nii.gz -r working/smc0177_t1_reoriented.nii.gz -t working/smc0177_t1_dti_warped_quick1Warp.nii.gz -t working/smc0177_t1_dti_warped_quick0GenericAffine.mat -o working/smc0177_b0_to_t1_quick.nii.gz [osotolongo@detritus facehbi]$ ls -l working/smc0177_t1_dti_warped_quick* -rw-rw---- 1 osotolongo imagen 193 Aug 14 21:19 working/smc0177_t1_dti_warped_quick0GenericAffine.mat -rw-rw---- 1 osotolongo imagen 235516784 Aug 14 21:20 working/smc0177_t1_dti_warped_quick1InverseWarp.nii.gz -rw-rw---- 1 osotolongo imagen 234821906 Aug 14 21:20 working/smc0177_t1_dti_warped_quick1Warp.nii.gz -rw-rw---- 1 osotolongo imagen 1718930 Aug 14 21:20 working/smc0177_t1_dti_warped_quickInverseWarped.nii.gz -rw-rw---- 1 osotolongo imagen 37764628 Aug 14 21:20 working/smc0177_t1_dti_warped_quickWarped.nii.gz
Mucho mejor. Me voy a quear con esto. Ahora tengo que aplicar la inversa a ver que pasa.
[osotolongo@detritus facehbi]$ antsApplyTransforms -d 3 -i working/smc0177_t1_reoriented.nii.gz -r working/.tmp_smc0177/smc0177_b0.nii.gz -t [working/smc0177_t1_dti_warped_quick0GenericAffine.mat, 1] -t working/smc0177_t1_dti_warped_quick1InverseWarp.nii.gz -o working/smc0177_t1_to_b0_quick.nii.gz
Este es de lejos el mejor registro en espacio nativo DTI que hemos conseguido hasta ahora asi que me voy a quedar con este. Hay que cambiar todos los scripts para utilizar este metodo.
La posibilidad de deformacion en el ajuste no parece ser necesaria para transformar el espacio nativo DTI al espacio nativo T1. A fin de cuentas es el mismo cerebro por lo que con una transformacion mas sencilla deberia, no solo bastar, sino hacer bien.
[osotolongo@detritus facehbi]$ antsRegistrationSyN.sh -d 3 -f working/.tmp_smc0177/t1_mask_warped_tmp.nii.gz -m working/.tmp_smc0177/smc0177_b0.nii.gz -o working/smc0177_t1_dti_warped_quick -t a -j 1 [osotolongo@detritus facehbi]$ antsApplyTransforms -d 3 -i working/.tmp_smc0177/smc0177_b0.nii.gz -r working/smc0177_t1_reoriented.nii.gz -t working/smc0177_t1_dti_warped_quick0GenericAffine.mat -o working/smc0177_b0_to_t1_quick.nii.gz
y la inversa, (esta queda en working/smc0177_t1_dti_warped_quickInverseWarped.nii.gz)
Nota: solo cambia el parametro -t pero es mucho mas rapido ya que ahora la transformacion es a: rigid + affine (2 stages) en lugar de s: rigid + affine + deformable syn (3 stages). Ademas,la transformacion no tiene ningun Warp, solo la matriz de Affine.