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.
Ver Notas sobre corregistro de DTI
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.
- dti_proc_x.sh
#!/bin/sh
debug=1
in=`${FSLDIR}/bin/remove_ext $1`
shift
t1=`${FSLDIR}/bin/remove_ext $1`
shift
b_in=$1
shift
out=`${FSLDIR}/bin/remove_ext $1`
shift
td=${out}'/.tmp_'${b_in}
if [ ! -d "$td" ]; then
mkdir $td
fi
if [ ! -d "$out" ]; then
mkdir $out
fi
echo "DTI preproccessing begins ..."
echo [`date`]
echo
${FSLDIR}/bin/fslroi ${in} ${out}/${b_in}_dti_b0 0 1
echo "Copying files for ${b_in} to ${td}/"
echo
${FSLDIR}/bin/imcp ${in} ${td}/${b_in}
cp ${in}.bval ${td}/bvals
cp ${in}.bvec ${td}/bvecs
echo "Doing correction on ${td}/${b_in}"
echo
${FSLDIR}/bin/eddy_correct ${td}/${b_in} ${td}/data 0
echo "Doing BET on ${td}/data now"
echo
${FSLDIR}/bin/bet ${td}/data ${td}/nodif_brain -f 0.3 -g 0 -n -m
echo "Running dtifit on ${td}/data"
echo
${FSLDIR}/bin/dtifit --data=${td}/data --out=${td}/dti --mask=${td}/nodif_brain_mask --bvecs=${td}/bvecs --bvals=${td}/bvals
echo "I will copy all output files to ${out}/${b_in}_XXXXX"
echo
for x in ${td}/dti*; do ${FSLDIR}/bin/imcp ${x} ${out}/${b_in}_$(basename $x); done;
${FSLDIR}/bin/imcp ${td}/nodif_brain_mask ${out}/${b_in}_nodif_brain_mask
${FSLDIR}/bin/imcp ${td}/data ${out}/${b_in}_data
echo "I need the T1 image"
${FSLDIR}/bin/fslreorient2std ${t1} ${out}/${b_in}_t1_reoriented
echo "and brain extracted too"
$FSLDIR/bin/bet ${out}/${b_in}_t1_reoriented ${out}/${b_in}_t1_reoriented_brain
echo "Registering FA to FMRIB58"
${FSLDIR}/bin/flirt -ref ${FSLDIR}/data/standard/FMRIB58_FA_1mm.nii.gz -in ${out}/${b_in}_dti_FA.nii.gz -omat ${td}/${b_in}_dti_affine.mat
${FSLDIR}/bin/fnirt --in=${out}/${b_in}_dti_FA.nii.gz --aff=${td}/${b_in}_dti_affine.mat --cout=${td}/${b_in}_dti_warp --config=FA_2_FMRIB58_1mm
${FSLDIR}/bin/applywarp --ref=${FSLDIR}/data/standard/FMRIB58_FA_1mm.nii.gz --in=${out}/${b_in}_dti_FA.nii.gz --warp=${td}/${b_in}_dti_warp --out=${td}/${b_in}_fa_std
echo "Moving B0 to MNI space and making B0 mask"
${FSLDIR}/bin/applywarp --ref=${FSLDIR}/data/standard/MNI152_T1_1mm.nii.gz --in=${out}/${b_in}_dti_b0 --warp=${td}/${b_in}_dti_warp --out=${td}/${b_in}_b0_std
${FSLDIR}/bin/fslmaths ${td}/${b_in}_b0_std -bin ${td}/${b_in}_b0_std_mask
${FSLDIR}/bin/fslmaths ${FSLDIR}/data/standard/MNI152_T1_1mm.nii.gz -mas ${td}/${b_in}_b0_std_mask.nii.gz ${td}/${b_in}_mni_masked
echo "Registering MNI choped template to Native Space now ...."
ANTS 3 -m CC[${out}/${b_in}_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 ${td}/${b_in}_dti_mni_t1.nii.gz
WarpImageMultiTransform 3 ${td}/${b_in}_mni_masked.nii.gz ${td}/mni_mask_warped_tmp.nii.gz -R ${out}/${b_in}_t1_reoriented.nii.gz ${td}/${b_in}_dti_mni_t1Warp.nii.gz ${td}/${b_in}_dti_mni_t1Affine.txt
echo "Calculating choped T1"
${FSLDIR}/bin/fslmaths ${out}/${b_in}_t1_reoriented.nii.gz -mas ${td}/mni_mask_warped_tmp.nii.gz ${td}/t1_mask_warped_tmp.nii.gz
echo "Registering B0 to choped T1"
antsRegistrationSyN.sh -d 3 -f ${td}/t1_mask_warped_tmp.nii.gz -m ${td}/${b_in}_dti_b0.nii.gz -o ${out}/${b_in}_t1_dti_warp -t s -j 1
echo "Lets begin now"
########### Voy a mover el template MNI a B0 para chequear despues #############
########### aunque no es necesario para el calculo #############################
echo "Registering MNI template to T1"
antsRegistrationSyN.sh -d 3 -f ${out}/${b_in}_t1_reoriented.nii.gz -m ${FSLDIR}/data/standard/MNI152_T1_1mm.nii.gz -o ${td}/${b_in}_mni_t1_warp
antsApplyTransforms -d 3 -i ${FSLDIR}/data/standard/MNI152_T1_1mm.nii.gz -r ${out}/${b_in}_t1_reoriented.nii.gz -t ${td}/${b_in}_mni_t1_warp1Warp.nii.gz -t ${td}/${b_in}_mni_t1_warp0GenericAffine.mat -o ${out}/${b_in}_mni_t1_warped.nii.gz
echo "Registering warped MNI to B0"
antsApplyTransforms -d 3 -i ${out}/${b_in}_mni_t1_warped.nii.gz -r ${td}/${b_in}_dti_b0.nii.gz -t [${out}/${b_in}_t1_dti_warp0GenericAffine.mat, 1] -t ${out}/${b_in}_t1_dti_warp1InverseWarp.nii.gz -o ${out}/${b_in}_mni_to_b0.nii.gz
############ Ahora le toca a los atlas ####################
echo "Warping Atlases to B0"
antsApplyTransforms -d 3 -i ${FSLDIR}/data/atlases/JHU/JHU-ICBM-labels-1mm.nii.gz -r ${out}/${b_in}_t1_reoriented.nii.gz -t ${td}/${b_in}_mni_t1_warp1Warp.nii.gz -t ${td}/${b_in}_mni_t1_warp0GenericAffine.mat -o ${td}/${b_in}_JHU_labels_tmp.nii.gz
antsApplyTransforms -d 3 -i ${td}/${b_in}_JHU_labels_tmp.nii.gz -r ${td}/${b_in}_dti_b0.nii.gz -t [${out}/${b_in}_t1_dti_warp0GenericAffine.mat, 1] -t ${out}/${b_in}_t1_dti_warp1InverseWarp.nii.gz -n GenericLabel[Linear] -o ${out}/${b_in}_JHU_labels.nii.gz
antsApplyTransforms -d 3 -i ${FSLDIR}/data/atlases/JHU/JHU-ICBM-tracts-maxprob-thr25-1mm.nii.gz -r ${out}/${b_in}_t1_reoriented.nii.gz -t ${td}/${b_in}_mni_t1_warp1Warp.nii.gz -t ${td}/${b_in}_mni_t1_warp0GenericAffine.mat -o ${td}/${b_in}_JHU_tracts_tmp.nii.gz
antsApplyTransforms -d 3 -i ${td}/${b_in}_JHU_tracts_tmp.nii.gz -r ${td}/${b_in}_dti_b0.nii.gz -t [${out}/${b_in}_t1_dti_warp0GenericAffine.mat, 1] -t ${out}/${b_in}_t1_dti_warp1InverseWarp.nii.gz -n GenericLabel[Linear] -o ${out}/${b_in}_JHU_tracts.nii.gz
###########################################################
if [ $debug = 0 ] ; then
echo "Removing temporary files"
echo
rm -rf ${td}
# rm -rf ${out}/${b_in}_tmp_*
fi
exit 0
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.
- make_dti_report_x.pl
#!/usr/bin/perl
use strict; use warnings;
use File::Slurp qw(read_file);
use File::Find::Rule;
use File::Basename qw(basename);
use Data::Dump qw(dump);
use File::Copy::Recursive qw(dirmove);
use NEURO qw(load_study print_help achtung shit_done);
@ARGV = ("-h") unless @ARGV;
while (@ARGV and $ARGV[0] =~ /^-/) {
$_ = shift;
last if /^--$/;
if (/^-h/) { print_help $ENV{'PIPEDIR'}.'/doc/fsl2fs.hlp'; exit;}
}
my $study = shift;
unless ($study) { print_help $ENV{'PIPEDIR'}.'/doc/make_pet_report.hlp'; exit;}
my %std = load_study($study);
#Run this script ONLY on "Detritus"
#or change the paths to the correct ones
my $w_dir=$std{'WORKING'};
my $d_dir=$std{'DATA'};
# Redirect ouput to logfile (do it only when everything is fine)
#my $debug = "$d_dir/.debug_report.log";
#open STDOUT, ">$debug" or die "Can't redirect stdout";
#open STDERR, ">&STDOUT" or die "Can't dup stdout";
my $order = "slicesdir -o ";
my @names = find(file => 'name' => "*_b0_to_t1.nii.gz", in => $w_dir);
foreach my $name (sort @names){
(my $tmpl = $name) =~ s/_b0_to_t1/_t1_reoriented/;
$order .= $name.' '.$tmpl." ";
}
chdir $w_dir;
system($order);
print "$order\n";
dirmove('slicesdir', 'dtis');
Aqui estoy haciendo dos reports en uno para poder revisar mejor los resultados.
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
- dti_bedtrack_cuda_t1.sh
#!/bin/sh
Usage() {
echo ""
echo "Usage: dti_bedtrack.sh <project> <name> <working dir> <mode>"
echo ""
echo "You must have FSL installed in order to run this script"
echo ""
exit 1
}
[ "$3" = "" ] && Usage
debug=1
prj=$1
shift
pollo=$1
shift
w_dir=$1
shift
mode=$1
shift
td=${w_dir}'/.tmp_'${pollo}
bd=${td}'/bedpostx'
list=${w_dir}'/../dti_track.seed'
if [ ! -d "$bd" ]; then
mkdir $bd
fi
echo "Copying files"
${FSLDIR}/bin/imcp ${td}/data ${bd}/data
${FSLDIR}/bin/imcp ${td}/nodif_brain_mask ${bd}/nodif_brain_mask
cp ${td}/bvecs ${bd}/bvecs
cp ${td}/bvals ${bd}/bvals
echo "Making bedpostx"
echo [`date`]
${FSLDIR}/bin/bedpostx_gpu ${bd}
echo "So far, so good"
echo [`date`]
echo "Getting aseg"
${PIPEDIR}/bin/get_aparc.sh ${prj} ${pollo} ${w_dir}
#WarpImageMultiTransform 3 ${w_dir}/${pollo}_aseg.nii.gz ${td}/${pollo}_aseg_warped.nii.gz -R ${td}/hifi_b0.nii.gz ${td}/${pollo}_dti_t1_b0Warp.nii.gz ${td}/${pollo}_dti_t1_b0Affine.txt
antsApplyTransforms -d 3 -i ${w_dir}/${pollo}_aseg.nii.gz -r ${w_dir}/${pollo}_dti_b0.nii.gz -t [${w_dir}/${pollo}_t1_dti_warp0GenericAffine.mat, 1] -t ${w_dir}/${pollo}_t1_dti_warp1InverseWarp.nii.gz -n GenericLabel[Linear] -o ${td}/${pollo}_aseg_warped.nii.gz
###########################################
######## Falta calcular las mascaras ######
###########################################
if [ ${mode} = 0 ]; then
for x in `awk NF $list`; do
${FSLDIR}/bin/fslmaths ${td}/${pollo}_aseg_warped -uthr ${x} -thr ${x} -div ${x} ${td}/${pollo}_mask_${x};
echo "${td}/${pollo}_mask_${x}.nii.gz" >> ${td}/${pollo}_mask.list;
done;
else
count=0
for x in `awk NF $list`; do
${FSLDIR}/bin/fslmaths ${td}/${pollo}_aseg_warped -uthr ${x} -thr ${x} -div ${x} ${td}/${pollo}_mask_${x};
if [ ${count} = 0 ]; then
${FSLDIR}/bin/imcp ${td}/${pollo}_mask_${x} ${td}/${pollo}_mask_seed;
else
${FSLDIR}/bin/fslmaths ${td}/${pollo}_mask_seed -add ${td}/${pollo}_mask_${x} ${td}/${pollo}_mask_tmp;
${FSLDIR}/bin/imcp ${td}/${pollo}_mask_tmp ${td}/${pollo}_mask_seed;
fi;
((count++));
done;
echo "${td}/${pollo}_mask_seed.nii.gz" > ${td}/${pollo}_mask.list;
fi
###########################################
echo "Doing probtrackx"
probtrackx2 --opd --forcedir -s ${bd}.bedpostX/merged -m ${td}/nodif_brain_mask -x ${td}/${pollo}_mask.list --dir=${td}/probtrack_out
rm ${td}/${pollo}_mask.list;
mv ${td}/probtrack_out ${w_dir}/${pollo}_probtrack_out
echo "Done"
echo [`date`]
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
#!/bin/sh
Usage() {
echo ""
echo "Usage: dti_bedtrack.sh <project> <name> <working dir> <network dir> <mode>"
echo ""
echo "You must have FSL installed in order to run this script"
echo ""
exit 1
}
[ "$4" = "" ] && Usage
debug=1
prj=$1
shift
pollo=$1
shift
w_dir=$1
shift
net_dir=$1
shift
mode=$1
shift
td=${w_dir}'/.tmp_'${pollo}
bd=${td}'/bedpostx'
list=${w_dir}'/../dti_track.seed'
if [ ! -d "$bd" ]; then
mkdir $bd
fi
echo "Copying files"
${FSLDIR}/bin/imcp ${td}/data ${bd}/data
${FSLDIR}/bin/imcp ${td}/nodif_brain_mask ${bd}/nodif_brain_mask
cp ${td}/bvecs ${bd}/bvecs
cp ${td}/bvals ${bd}/bvals
echo "Making bedpostx"
echo [`date`]
${FSLDIR}/bin/bedpostx_gpu ${bd}
echo "So far, so good"
echo [`date`]
###########################################
echo "Getting nodes and making masks"
if [ ${mode} = 0 ]; then
for x in `find ${net_dir} -name "*.nii"`; do
node=`${FSLDIR}/bin/remove_ext $(basename ${x})`;
# WarpImageMultiTransform 3 ${x} ${td}/${node}_warped.nii.gz -R ${w_dir}/${pollo}_t1_reoriented.nii.gz ${td}/${pollo}_dti_mni_t1Warp.nii.gz ${td}/${pollo}_dti_mni_t1Affine.txt;
# WarpImageMultiTransform 3 ${td}/${node}_warped.nii.gz ${td}/${pollo}_${node}.nii.gz -R ${td}/hifi_b0.nii.gz ${td}/${pollo}_dti_t1_b0Warp.nii.gz ${td}/${pollo}_dti_t1_b0Affine.txt;
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
echo "${td}/${pollo}_${node}.nii.gz" >> ${td}/${pollo}_mask.list;
done;
else
count=0;
for x in `find ${net_dir} -name "*.nii"`; do
x=`find ${net_dir} -name "${seed}"`;
node=`${FSLDIR}/bin/remove_ext $(basename ${x})`;
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}/${pollo}_t1_dti_warp1InverseWarp.nii.gz -n GenericLabel[Linear] -o ${td}/${pollo}_${node}.nii.gz
if [ ${count} -gt 0 ]; then
${FSLDIR}/bin/fslmaths ${td}/${pollo}_mask_seed -add ${td}/${pollo}_${node} ${td}/${pollo}_mask_tmp;
${FSLDIR}/bin/imcp ${td}/${pollo}_mask_tmp ${td}/${pollo}_mask_seed;
else
${FSLDIR}/bin/imcp ${td}/${pollo}_${node} ${td}/${pollo}_mask_seed;
fi
((count++));
done
echo "${td}/${pollo}_mask_seed.nii.gz" > ${td}/${pollo}_mask.list;
fi
###########################################
echo "Doing probtrackx"
${FSLDIR}/bin/probtrackx2 --opd --forcedir -s ${bd}.bedpostX/merged -m ${td}/nodif_brain_mask -x ${td}/${pollo}_mask.list --dir=${td}/probtrack_out
rm ${td}/${pollo}_mask.list;
mv ${td}/probtrack_out ${w_dir}/${pollo}_probtrack_out
echo "Done"
echo [`date`]
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