Table of Contents
Hacking FSLVBM
BET
La extraccion de cerebro de BET es bastante mala, da muchos problemas y se pierde mucho tiempo. Vamos a usar la segmentacion de FS para obtener los cerebros extraidos,
- get_fs_brain.sh
#!/bin/sh study=$1 shift id=$1 shift dir=$1 shift debug=0 #First get the freesurfer processed MRIs ${FREESURFER_HOME}/bin/mri_convert --in_type mgz --out_type nii ${SUBJECTS_DIR}/${study}_${id}/mri/nu.mgz ${dir}/${id}_tmp.nii.gz ${FSLDIR}/bin/fslreorient2std ${dir}/${id}_tmp ${dir}/${id}_struc ${FREESURFER_HOME}/bin/mri_convert --in_type mgz --out_type nii ${SUBJECTS_DIR}/${study}_${id}/mri/brain.mgz ${dir}/${id}_tmp_brain.nii.gz ${FSLDIR}/bin/fslreorient2std ${dir}/${id}_tmp_brain ${dir}/${id}_struc_brain if [ $debug = 0 ] ; then rm ${dir}/${id}_tmp* fi
y se ejecuta como,
[osotolongo@detritus vbmlang]$ for x in `cat subjects.list`; do get_fsbrain.sh facehbi ${x} struc; done
Template
Tengo problemas con fslvbm_2_template en algunos sujetos. Ejemplo,
[osotolongo@detritus temp]$ $FSLDIR/bin/fast -R 0.3 -H 0.1 0013_struc_brain
no esta segmentando bien.
La imagen correcta para la materia gris, es de este tipo,
La solucion sera traer la segmentacion de FS y obtener de ahi la mascara de GM. Pero FS no guarda una segmentaccion separada para GM, asi que hay que usar la de WM para obtenerla. Los pasos,
- Obtenemos el aseg.mgz
- Segmentamos de aqui la sustancia blanca del cerebelo y hacemos una mascara (cwm)
- Obtenemos el wm.mgz
- Hacemos mascaras de ambos (fslmaths -bin)
- Restamos las mascaras (aseg-wm-cwm) y obtenemos las mascara de GM
- Aplicamos esta mascara al struc
- get_gm.sh
#!/bin/sh study=$1 shift id=$1 shift dir=$1 shift debug=0 #First get the freesurfer processed aseg.mgz ${FREESURFER_HOME}/bin/mri_label2vol --seg ${SUBJECTS_DIR}/${study}_${id}/mri/aseg.mgz --temp ${SUBJECTS_DIR}/${study}_${id}/mri/nu.mgz --o ${dir}/${id}_tmp_aseg.mgz --regheader ${SUBJECTS_DIR}/${study}_${id}/mri/aseg.mgz ${FREESURFER_HOME}/bin/mri_convert --in_type mgz --out_type nii ${dir}/${id}_tmp_aseg.mgz ${dir}/${id}_tmp_aseg.nii.gz ${FSLDIR}/bin/fslreorient2std ${dir}/${id}_tmp_aseg ${dir}/${id}_aseg #Where is the cerebellum #cm=(6 7 8 45 46 47) cm=(7 46) tada="" first=1 for acm in "${cm[@]}"; do ${FSLDIR}/bin/fslmaths ${dir}/${id}_aseg -uthr ${acm} -thr ${acm} -div ${acm} ${dir}/${id}_tmp_cb_${acm}; if [[ "$tada" == "" ]]; then tada="${tada}${dir}/${id}_tmp_cb_${acm}"; else tada="${tada} -add ${dir}/${id}_tmp_cb_${acm}"; fi; done tada="$tada ${dir}/${id}_cmask" ${FSLDIR}/bin/fslmaths $tada #Now get thw WM ${FREESURFER_HOME}/bin/mri_label2vol --seg ${SUBJECTS_DIR}/${study}_${id}/mri/wm.mgz --temp ${SUBJECTS_DIR}/${study}_${id}/mri/nu.mgz --o ${dir}/${id}_tmp_wm.mgz --regheader ${SUBJECTS_DIR}/${study}_${id}/mri/wm.mgz ${FREESURFER_HOME}/bin/mri_convert --in_type mgz --out_type nii ${dir}/${id}_tmp_wm.mgz ${dir}/${id}_tmp_wm.nii.gz ${FSLDIR}/bin/fslreorient2std ${dir}/${id}_tmp_wm ${dir}/${id}_wm #And get the masks ${FSLDIR}/bin/fslmaths ${dir}/${id}_aseg -bin ${dir}/${id}_aseg_mask ${FSLDIR}/bin/fslmaths ${dir}/${id}_wm -bin ${dir}/${id}_wm_mask ${FSLDIR}/bin/fslmaths ${dir}/${id}_aseg_mask -sub ${dir}/${id}_wm_mask ${dir}/${id}_gm_mask_wc ${FSLDIR}/bin/fslmaths ${dir}/${id}_gm_mask_wc -sub ${dir}/${id}_cmask ${dir}/${id}_gm_mask ${FSLDIR}/bin/fslmaths ${dir}/${id}_struc -mas ${dir}/${id}_gm_mask ${dir}/${id}_struc_GM if [ $debug = 0 ] ; then rm ${dir}/${id}_tmp* fi
Y ahora lo ejecutamos correctamente,
[osotolongo@detritus vbmmem]$ for x in `awk -F"," {'print $2'} bioface_data.csv | tail -n +2`; do get_gm.sh bioface ${x} /home/osotolongo/bioface/vbmmem/struc; done
Nota: Esto demora un rato. Se podria ver de integrar en el cluster pero mas tarde, cuando sepamos que todo funciona OK
Lo que se obtiene no es exactamente lo mismo pero si bastante parecido. La diferencia es la que hay entre la segmentacion de FSL y FS.
Como ya tenemos la GM, voy a comentar esta parte en fslvbm_2_template,
### segmentation #Voy a comentar esta parte porque no me funciona bien # le hago un hack afuera y me quedo con la GM /bin/rm -f fslvbm2a #for g in `$FSLDIR/bin/imglob *_struc.*` ; do # echo $g # echo "$FSLDIR/bin/fast -R 0.3 -H 0.1 ${g}_brain ; \ # $FSLDIR/bin/immv ${g}_brain_pve_1 ${g}_GM" >> fslvbm2a #done #chmod a+x fslvbm2a #fslvbm2a_id=`$FSLDIR/bin/fsl_sub -T 30 -N fslvbm2a -t ./fslvbm2a` #echo Running segmentation: ID=$fslvbm2a_id
y otro pequeño cambio mas abajo, (eliminar la dependencia con lo que he quitado)
#fslvbm2b_id=`$FSLDIR/bin/fsl_sub -j $fslvbm2a_id -T $HOWLONG -N fslvbm2b -t ./fslvbm2b` fslvbm2b_id=`$FSLDIR/bin/fsl_sub -T $HOWLONG -N fslvbm2b -t ./fslvbm2b`
lo salvo como /usr/local/fsl/bin/fslvbm_2_template_alt (para no romper nada) y lo ejecuto igual que el procedimiento normal de FSL.
[osotolongo@detritus vbmmem]$ fslvbm_2_template_alt -n
A partir d eaqui, el registro deberia funcionar correctamente,
Pero no lo hace
Sin embargo, el flirt si que es capaz de hacerlo,
[osotolongo@detritus vbmmem]$ flirt -in struc/0010_GM -ref /usr/local/fsl/data/standard/tissuepriors/avg152T1_gray -out struc/0010_GM_to_T_manual
entonces voy a intentar cambiar el sistema de registro, a ver que pasa. Cambiamos fsl_reg por ANTs. Pero en lugar de utilizar un template de materia gris, voy a registrar la imagen T1 a espacio MNI y con esa informacion, mover la materia gris.
#T=${FSLDIR}/data/standard/tissuepriors/avg152T1_gray T=${FSLDIR}/data/standard/MNI152_T1_2mm.nii.gz
Ahora cambio todos los registros de fsl_reg,
for g in `$FSLDIR/bin/imglob *_struc.*` ; do #echo "${FSLDIR}/bin/fsl_reg ${g}_GM $T ${g}_GM_to_T -a" >> fslvbm2b echo "${ANTS_PATH}/antsRegistrationSyNQuick.sh -d 3 -f ${T} -m ${g}.nii.gz -t s -o ${g}_GM_to_T_move_" >> fslvbm2b echo "${ANTS_PATH}/antsApplyTransforms -d 3 -r ${T} -i ${g}_GM.nii.gz -t ${g}_GM_to_T_move_0GenericAffine.mat -t ${g}_GM_to_T_move_1Warp.nii.gz -o ${g}_GM_to_T.nii.gz" >> fslvbm2b done
y tambien el registro al template,
T=template_GM_init for g in `$FSLDIR/bin/imglob *_struc.*` ; do #echo "${FSLDIR}/bin/fsl_reg ${g}_GM $T ${g}_GM_to_T_init $REG -fnirt \"--config=GM_2_MNI152GM_2mm.cnf\"" >> fslvbm2d echo "${ANTS_PATH}/antsRegistrationSyNQuick.sh -d 3 -f ${T}.nii.gz -m ${g}_GM.nii.gz -t s -o ${g}_GM_to_T_init_" >> fslvbm2d echo "${ANTS_PATH}/antsApplyTransforms -d 3 -r ${T}.nii.gz -i ${g}_GM.nii.gz -t ${g}_GM_to_T_init_0GenericAffine.mat -t ${g}_GM_to_T_init_1Warp.nii.gz -o ${g}_GM_to_T_init.nii.gz" >> fslvbm2d done
Ahora lo que voy a hacer es construir la plantilla con el script modificado,
[osotolongo@detritus vbmmem]$ fslvbm_2_template_alt -n
y ahora voy a cambiar el paso 3,
for g in `$FSLDIR/bin/imglob *_struc.*` ; do echo $g #echo "${FSLDIR}/bin/fsl_reg ${g}_GM template_GM ${g}_GM_to_template_GM -fnirt \"--config=GM_2_MNI152GM_2mm.cnf --jout=${g}_JAC_nl\"; \ echo "${ANTS_PATH}/antsRegistrationSyNQuick.sh -d 3 -f template_GM.nii.gz -m ${g}_GM.nii.gz -t s -o ${g}_GM_to_template_GM_ ; \ ${ANTS_PATH}/antsApplyTransforms -d 3 -r template_GM.nii.gz -i ${g}_GM.nii.gz -t ${g}_GM_to_template_GM_0GenericAffine.mat ${g}_GM_to_template_GM_1Warp.nii.gz -o ${g}_GM_to_template_GM.nii.gz; \ ${ANTS_PATH}/CreateJacobianDeterminantImage 3 ${g}_GM_to_template_GM_1Warp.nii.gz ${g}_JAC_nl.nii.gz 0 1; \ $FSLDIR/bin/fslmaths ${g}_GM_to_template_GM -mul ${g}_JAC_nl ${g}_GM_to_template_GM_mod -odt float" >> fslvbm3a done
y esto lo ejecuto como,
[osotolongo@detritus vbmmem]$ fslvbm_3_proc_alt
que pasa con los jacobianos?
Entendiendo los jacobianos
[osotolongo@brick03 testj]$ fsl_reg 0001_struc.nii.gz /usr/local/fsl/data/standard/MNI152_T1_2mm.nii.gz 0001_struc_to_mni -fnirt --jout=0001_struc_JAC_nl