User Tools

Site Tools


neuroimagen:altcorrdti

This is an old revision of the document!


Nueva version de procesamiento de DTI (FACEHBI)

Nota: Evaluar la posibilidad de utilizar epi_reg para el paso de T1 a B0. No es probable que funcione bien dado el corte de los DTI pero habria que intentarlo.

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 :-D 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,

 dti reg OK

Ejemplo de imagen mal registrada,

 dti reg KO

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. 8-o (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

Nota: Conversion de formato de resultados (local)

$ scp -r -P 20022 detritus.fundacioace.com:/nas/data/facehbi/facehbi_dti_labels.csv facehbi_dti_labels_v0.csv
$ sed 's/0/F0/; s/Subject/FACEHBI/' facehbi_dti_labels_v0.csv > facehbi_dti_a1_v0.csv
$ join -t";" facehbi_mri_v0_date_a.csv facehbi_dti_a1_v0.csv > facehbi_dti_labels_v0.csv
$ scp -r -P 20022 detritus.fundacioace.com:/nas/data/facehbi/facehbi_dti_tracts.csv facehbi_dti_tracts_v0.csv
$ sed 's/0/F/; s/Subject/FACEHBI/' facehbi_dti_tracts_v0.csv > facehbi_dti_a2_v0.csv
$ join -t";" facehbi_mri_v0_date_a.csv facehbi_dti_a2_v0.csv > facehbi_dti_tracts_v0.csv
$ ./csv2xls_dti.pl 
$ mv facehbi_dti_v0_data.xlsx facehbi_dti_v0_data_new_protocol.xlsx

Tractografia

Seleccionando regiones segun segmentacion de FS. (dti_track_seed) Nota: Se ha de aumentar el tiempo manualmente. Los procesos de corregistro y conversion requieren alrededor de 6 o 7 horas. Poner un maximo de 12 para prevenir TIME_OUT.

[osotolongo@detritus facehbi]$ dti_track.pl -cut dti_reg_review.csv -time 12:0:0 -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,

[osotolongo@detritus facehbi]$ for x in `ls -d working/smc0*_probtrack_out`; do y=$(echo ${x} | sed 's/out/FPCustom/'); mv ${x} ${y}; done
[osotolongo@detritus facehbi]$ dti_metrics_alt.pl -cut dti_reg_review.csv -path FPCustom facehbi

Usando atlas UofM

[osotolongo@detritus bin]$ dti_track.pl -cut dti_reg_review.csv -time 12:0:0 -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)
......

y las metricas se sacan de manera similar.

[osotolongo@detritus facehbi]$ for x in `ls -d working/smc0*_probtrack_out`; do y=$(echo ${x} | sed 's/out/DMN/'); mv ${x} ${y}; done
[osotolongo@detritus facehbi]$ dti_metrics_alt.pl -cut dti_reg_review.csv -path DMN facehbi
[osotolongo@detritus facehbi]$ head facehbi_dti_DMN.csv
Subject;DMN_FA;DMN_MD
0002;0.281107;0.001016
0004;0.267536;0.001043
0005;0.253714;0.001032
0007;0.264982;0.000998
0008;0.256444;0.000994
0011;0.263024;0.000991
0013;0.262677;0.001046
0015;0.276047;0.000996
0017;0.267434;0.001024

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

m( 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

info aqui: https://github.com/ANTsX/ANTs/wiki/Forward-and-inverse-warps-for-warping-images,-pointsets-and-Jacobians

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 8-) . 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. m(

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.

1)
Se supone que antes hice algo asi,
$FSLDIR/bin/bet ${out}/${b_in}_t1_reoriented ${out}/${b_in}_t1_reoriented_brain
neuroimagen/altcorrdti.1573724815.txt.gz · Last modified: 2020/08/04 10:45 (external edit)