User Tools

Site Tools


neuroimagen:hack_fslvbm

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

:WIP: 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
neuroimagen/hack_fslvbm.txt · Last modified: 2021/04/01 15:08 by osotolongo