User Tools

Site Tools


mbstring extension must be loaded in order to run mPDF
neuroimagen:visualqc_freesurfer

QC de Freesurfer con VisualQC CLI

Protocolo y criterios de QC

Para publicar cualquier tipo de resultados, ya sea dentro o fuera de ACE, deberá hacerse antes este QC. Los resultados publicados sin QC previo, no son válidos.

Solo reportaremos dos tipos de resultados:

  1. Fail: errores graves, movimiento excesivo, falta parte de la imagen, etc
  2. Good: el resto

Una vez en posesión del CSV con las calificaciones, debemos filtrar los archivos de resultados a los que esten calificados como Good o acompañar los resutlados con este archivo, a modo de advertencia.

Para obtener el FSQC almacenado en XNAT hacemos, por ejemplo,

$ xnatapic get_fsqc --project_id facehbi

siendo en esta caso facehbi el nombre del proyecto en XNAT.

Traer los sujetos de XNAT

La segmentacion de Freesurfer actual se hace con XNAT, asi que hay que sistematizar una manera para bajar los sujetos, hacer el QC, subir esta info a XNAT y borrar los que hemos bajado.

Preparando el QC del proyecto

Antes de ejecutar el QC del proyecto necesitamos,

- Una lista de los sujetos que vamos a visualizar
- Los directorios de output de cada sujeto, colocados en la misma ubicacion

Ejemplo, tengo algunos sujetos de la V5 de facehbi que quiero revisar,

[osotolongo@brick03 f5cehbi]$ ls -d /nas/data/subjects/f5cehbi*
/nas/data/subjects/f5cehbi_0001  /nas/data/subjects/f5cehbi_0012  /nas/data/subjects/f5cehbi_0023
/nas/data/subjects/f5cehbi_0002  /nas/data/subjects/f5cehbi_0013  /nas/data/subjects/f5cehbi_0024
/nas/data/subjects/f5cehbi_0003  /nas/data/subjects/f5cehbi_0014  /nas/data/subjects/f5cehbi_0025
/nas/data/subjects/f5cehbi_0004  /nas/data/subjects/f5cehbi_0015  /nas/data/subjects/f5cehbi_0026
/nas/data/subjects/f5cehbi_0005  /nas/data/subjects/f5cehbi_0016  /nas/data/subjects/f5cehbi_0027
/nas/data/subjects/f5cehbi_0006  /nas/data/subjects/f5cehbi_0017  /nas/data/subjects/f5cehbi_0028
/nas/data/subjects/f5cehbi_0007  /nas/data/subjects/f5cehbi_0018  /nas/data/subjects/f5cehbi_0029
/nas/data/subjects/f5cehbi_0008  /nas/data/subjects/f5cehbi_0019  /nas/data/subjects/f5cehbi_0030
/nas/data/subjects/f5cehbi_0009  /nas/data/subjects/f5cehbi_0020  /nas/data/subjects/f5cehbi_0031
/nas/data/subjects/f5cehbi_0010  /nas/data/subjects/f5cehbi_0021  /nas/data/subjects/f5cehbi_0032
/nas/data/subjects/f5cehbi_0011  /nas/data/subjects/f5cehbi_0022  /nas/data/subjects/f5cehbi_0033

obtener la lista es tan sencillo como,

[osotolongo@brick03 f5cehbi]$ ls -d /nas/data/subjects/f5cehbi* | awk -F"/" '{print $5}' > fs_subject.list
[osotolongo@brick03 f5cehbi]$ head fs_subject.list
f5cehbi_0001
f5cehbi_0002
f5cehbi_0003
f5cehbi_0004
f5cehbi_0005
f5cehbi_0006
f5cehbi_0007
f5cehbi_0008
f5cehbi_0009
f5cehbi_0010

Lanzando el CLI

Con todo preparado podemos lanzar el CLI con las opciones basicas,

[fsluser@FSLVm7_64 ~]$ visualqc_freesurfer -i /nas/data/f5cehbi/fs_subject.list  -f /nas/data/subjects -o /nas/data/f5cehbi/vfsqc

Demora en procesar, asi que si ponemos una lista de un proyecto grande mejor nos damos una vuelta. La parte buena es que el procesamiento solo se ejecuta una vez y se guarda en el directorio de output asi que podemos volver a lanzarlo en cualquier momento y sera mas rapido.

[osotolongo@brick03 f5cehbi]$ ls vfsqc/
annot_visualizations  ratings
[osotolongo@brick03 f5cehbi]$ ls vfsqc/annot_visualizations/
f5cehbi_0001_left_lateral.tif	   f5cehbi_0012_left_medial.tif       f5cehbi_0023_left_transverse.tif
f5cehbi_0001_left_medial.tif	   f5cehbi_0012_left_transverse.tif   f5cehbi_0023_right_lateral.tif
f5cehbi_0001_left_transverse.tif   f5cehbi_0012_right_lateral.tif     f5cehbi_0023_right_medial.tif
f5cehbi_0001_right_lateral.tif	   f5cehbi_0012_right_medial.tif      f5cehbi_0023_right_transverse.tif
f5cehbi_0001_right_medial.tif	   f5cehbi_0012_right_transverse.tif  f5cehbi_0024_left_lateral.tif
...

Tras el procesamiento se muestra la apntalla principal donde podemos evaluar y puntuar la calidad de la segmentacion (haciendo doble click en una imagen se amplia). La interfaz es intuitiva y bastante agil.

Tras evaluar los sujetos, los resultados quedan almacenados en el directorio de output,

[osotolongo@brick03 f5cehbi]$ ls vfsqc/ratings/
cortical_contour_rate_freesurfer_orig.mgz_ratings.all.csv  id_list_rating_i_m_tired.txt
id_list_rating_good.txt					   id_list_rating_minor_error.txt
[osotolongo@brick03 f5cehbi]$ cat vfsqc/ratings/cortical_contour_rate_freesurfer_orig.mgz_ratings.all.csv
f5cehbi_0001,gOOD,None
f5cehbi_0002,gOOD,None
f5cehbi_0003,I'M TIREd,None
f5cehbi_0004,MInOR error,None

El script

tl;dr

$ review_vqcfs.pl -i experiments.list -d fsresults facehbi

La explicacion

Primero que todo, esto hay que hacerlo en un entorno grafico. Así que vamos a hace un chequeo simple al inicio,

die "Should run this under X!\n" unless $ENV{'DISPLAY'};

Luego, las variables. Necesito una lista de los experimentos que quiero bajarme de XNAT (opcional), un directorio donde voy a procesar (opcional) y el nombre del proyecto en XNAT.

Si hay lista inicial, proceso solo los experimento listados, si no hay, todos los experimentos del proyecto.

my @pollos;
$efile=$wdir.'/'.$xprj.'_experiment.list';
if ($ifile and -f $ifile){
        $efile=$wdir.'/'.$xprj.'_experiment_custom.list';
        open IDF, "<$ifile";
        @pollos = <IDF>; chomp @pollos;
        close IDF;
        open TDF, ">$efile";
        foreach my $pollo (@pollos){
                my $look = "xnatapic list_experiments --project_id $xprj --subject_id $pollo --modality MRI";
                my $epollo = qx/$look/;
                chomp $epollo;
                print TDF "$epollo\n";
        }
        close TDF;
}

Ahora, si hay directorio a procesar, y este existe, entonces asumo que ya he procesado algunos y lo que hago es continuar el trabajo lo deje. Pero si no doy el nombre del directorio y este existe, entonces asumo que quiero reprocesar y muevo el directorio antiguo a otro sitio.

 unless ($odir and -d $odir) {
        $odir=$wdir.'/'.$xprj.'_fsresults';
        if ( -d $odir ){
                $odir = $odir.'_'.getLoggingTime();
        }
        mkdir $odir;
        if ($ifile and -f $ifile){
                foreach my $pollo (@pollos){
                        my $pre = "xnatapic prepare_fsqc --project_id $xprj --outdir $odir --subject_id $pollo";
                        system($pre);
                }
        }else{
                my $pre = "xnatapic prepare_fsqc --project_id $xprj --outdir $odir";
                system($pre);
        }
}

Esto puede demorar un poco :-) pero después que tengo todo en su lugar puedo lanzar el vqcfs,

if ($ifile and -f $ifile){
        my $order = "vqcfs -i $efile -f $odir -o $vqcd";
        system($order);
}else{
        my $order = "vqcfs -f $odir -o $vqcd";
        system($order);
}

Y cuando termine, se suben los resultados

my $post = "xnatapic upload_fsqc --qcdir $vqcd";
system($post);
neuroimagen/visualqc_freesurfer.txt · Last modified: 2021/09/14 07:19 by osotolongo