User Tools

Site Tools


neuroimagen:fsqc_enigma

Integrando ENIGMA Freesurfer QC

Para casi todos los proyectos de colaboracion, los procedimientos de ENIGMA se han tomado como el standard a seguir. Asi que vamos a intentar integrar estos procedimientos en el pipeline, sobre todo en el proyecto MRIFACE, que es el mas extenso y dificil de manipular. A partir de aqui deberia ser simple aplicar el procedimeinto al resto de proyectos.

Nota: El procedimiento es bastante básico y tiene dos evaluaciones simples: Good, Fail. Los minor errors pasaran como buenos, los major errors como malos, en general. No obstante, el objetivo es guardar todas las imagenes en XNAT como recurso del experimento, asi que si es necesario basta bajar las imagenes y volver a revisar el QC. Esto es muchisimo mas sencillo y rapido que volver a ejecutar todo el procedimiento para un puñado de MRIs cuyos resultados se quieran compartir a algun proyecto.

Arreglando scripts

Primero, hay que obtener los scripts y documentación de trabajo de los protocolos de enigma.

Bajando resultados de Freesurfer

El paso previo a ejecutar el QC es obtener los resultados del procesamiento y ordenarlos en un directorio. Para poder evaluar paulatinamente los sujetos, hay que permitir dos cosas,

  1. elegir el directorio donde vamos a guardar los resultados
  2. suministrar una lista de los sujetos a evaluar

Esto se hace tomando estos valores desde la linea de comandos (opcional),

while (@ARGV and $ARGV[0] =~ /^-/) {
        $_ = shift;
        last if /^--$/;
#...
        if (/^-i/) { $ifile = shift; chomp($ifile);}
        if (/^-o/) { $odir = shift; chomp($odir);}       
#...
}

Luego, de la posible lista de sujetos (o del proyecto completo), debo obtener los experimentos correspondientes. Cada experimento procesado debe tener el directorio completo de FS compactado y asociado como recurso. Este lo bajamos y lo descomprimimos en su sitio.

Todo esto lo hacemos reutilizando las bibiotecas del pipeline

Las opciones del script get_fs_data.pl son,

  • -p prj : nombre local del proyecto (OBLIGATORIO)
  • -x xprj : nombre en XNAT del proyecto (Opcional si el proyecto local esta configurado correctamente)
  • -o output_dir : directorio de output (Opcional)
  • -i subjects.list : archivo con la lista de sujetos a bajar (Opcional)

tl;dr

[osotolongo@brick03 mri_face]$ ./get_fs_data.pl -p mriface

extract data

Basicamente es usar el script de ENIGMA para sacar SurfAVG y ThicAVG de los resultados individuales y ponerlos en una tabla, pero voy poner esto un poco mas amigable y voy a añadir un par de lineas al inicio del script para poder ejecutarlo desde cualquier sitio y me guarde los CSV en el directorio de trabajo.

#!/bin/bash
idir=$(realpath $1);
rdir=$(pwd);
 
[[ -z ${idir} ]] && { echo "Should supply input directory"; exit 1; }
[[ -d ${idir} ]] || { echo "Directory not found"; exit 404; }
cd ${idir};

El script queda mas o menos igual con alguna pequeña modificacion,

y entonces podemos ejecutar desde cualquier parte e indicando el directorio de trabajo,

[osotolongo@brick03 mri_face]$ qc_scripts/extract.sh mriface_fsresults

y obtenemos,

[osotolongo@brick03 mri_face]$ ls CorticalMeasuresENIGMA*.csv
CorticalMeasuresENIGMA_SurfAvg.csv
CorticalMeasuresENIGMA_ThickAvg.csv

que seran nuestros archivos de trabajo para detectar los sujetos problematicos

outliers

Pues entonces vamos a buscar los outliers dentro de todos estos datos. Lo que hacemos es copir el script outliers.R en el directorio de trabajo,

[osotolongo@brick03 mri_face]$ cp qc_scripts/outliers.R ./

y ejecutar,

[osotolongo@brick03 mri_face]$ R --no-save --slave < outliers.R > outliers.log  

que nos da un archivo bastante largo con los vaores que no encajan dentro de una distribucion normal,

[osotolongo@brick03 mri_face]$ head outliers.log
Please check the following subjects closely using the QC methods provided in Step 2 of the cortical protocols.
Subject XNAT05_E00042 has THICKNESS values too HIGH for the following structures: L_cuneus_thickavg
 Subject XNAT05_E00042 has THICKNESS values too HIGH for the following structures: R_cuneus_thickavg
 Subject XNAT05_E00042 has THICKNESS values too HIGH for the following structures: R_postcentral_thickavg
Subject XNAT05_E00047 has THICKNESS values too LOW for the following structures: L_caudalanteriorcingulate_thickavg
 Subject XNAT05_E00047 has THICKNESS values too LOW for the following structures: L_posteriorcingulate_thickavg
 Subject XNAT05_E00047 has THICKNESS values too LOW for the following structures: L_rostralanteriorcingulate_thickavg
 Subject XNAT05_E00047 has THICKNESS values too LOW for the following structures: R_posteriorcingulate_thickavg
Subject XNAT05_E00050 has THICKNESS values too HIGH for the following structures: L_superiorparietal_thickavg
Subject XNAT05_E00051 has THICKNESS values too LOW for the following structures: R_insula_thickavg

Ahora vamos a ver quien esta aqui,

[osotolongo@brick03 mri_face]$ grep "THICKNESS\|\|AREA" outliers.log | awk '{print $2}' | sort | uniq > outliers.list
[osotolongo@brick03 mri_face]$ wc -l outliers.list 
289 outliers.list

Y estos son los sujetos que tenemos que mirar. Aquellos que estan fuera de esta lista tienen todas las medidas dentro de la norma y no deberian tener problemas con la segmentacion.

So, lo primero que voy a hacer es marcar estos como OK poniendo este archivo como un resource en XNAT,

[osotolongo@brick03 mri_face]$ cat rating.json 
{"ResultSet":{"Result":[{"rating":"good","notes":"None"}]}

Asi que hacemos un code refactorization,

y podemos subir rapidamente un archivo json compatible con los QC antiguos.

External Surface Method

VM

Ahora vamos a ejecutar el primer metodo de QC para producir las imagenes de la segmentacion cortical. Este metodo necesita ejecutar los visores de Freesurfer (con GLX), que no funcionan por VNC directamente al server. Asi qeu vamos a eejcutarlo en una VM. Asi que la VM debe estar ejecutandose,

[root@brick03 ~]# virsh list
 Id   Name        State
---------------------------
 1    FSLVm7_64   running

y la redireccion de puertos para el no_vnc activa,

[root@brick03 ~]# ./novnc_ws.sh 
WebSocket server settings:
  - Listen on :6080
  - Web server. Web root: /usr/share/novnc
  - SSL/TLS support
  - Backgrounding (daemon)

y desde la maquina local ha de hacerse un tunel ssh al 6080,

alias vnc_tunnel="~/vpn_ace.sh; ssh -C -L 6080:localhost:6080 osotolongo@172.26.2.43"

Tras esto, se supone que accediendo a la url http://localhost:6080/vnc.html tenemos acceso a la maquina virtual,

Ejecutando

Nota: Antes de ejecutar el script para preparar las imagenes en la VM, debemos crear el directorio fsqcdir y asegurarnos que el propietario es el user de la VM.

Por alguna razon hay prblemas para salvar algunas imagenes en baja resolucion. Aprovechando que tengo problemas con la visualizacion de los TIF, voy a editar el script original de ENIGMA,

  1. En la pagina web voy a utilizar PNGs y no TIFFs porque no puedo verlos con Firefox
  2. Solo voy a crear las imagenes TIFF de alta resolucion con tksurfer
  3. Voy a usar ImageMagick (implica que lo necesitas instalado) para convertir las imagenes TIFF a formato PNG, tanto en alta como en baja resolucion

El script modificado queda entonces,

Y, en la VM, hacemos algo como,

[fsluser@fslvm7_64 mri_face] qc_scripts/fsqc.sh mriface_fsresults/

y voila, se lanza el procesamiento de los directorios de FS,

el output final de todo este laaaargo proceso es la pagina fsqcdir/index.html, y, mas importante aun, las imagenes para cada experimento, por ejemplo,

[osotolongo@brick03 mri_face]$ ls fsqcdir/XNAT05_E00065*
fsqcdir/XNAT05_E00065.lh.lat.hr.png  fsqcdir/XNAT05_E00065.rh.lat.hr.png
fsqcdir/XNAT05_E00065.lh.lat.hr.tif  fsqcdir/XNAT05_E00065.rh.lat.hr.tif
fsqcdir/XNAT05_E00065.lh.lat.lr.png  fsqcdir/XNAT05_E00065.rh.lat.lr.png
fsqcdir/XNAT05_E00065.lh.med.hr.png  fsqcdir/XNAT05_E00065.rh.med.hr.png
fsqcdir/XNAT05_E00065.lh.med.hr.tif  fsqcdir/XNAT05_E00065.rh.med.hr.tif
fsqcdir/XNAT05_E00065.lh.med.lr.png  fsqcdir/XNAT05_E00065.rh.med.lr.png

Al final de todo basta con un,

~ # firefox fsqcdir/index.html

Internal Surface Method

Para producir las imagenes restantes necesitamos,

  1. MATLAB

Y ahora hemos de acomodar y preparar todo. El paquete de ENIGMA lo dejo en /old_nas/mri_face/ENIGMA_scripts/, y edito el archivo de matlab para reflejar la ubicacion de mis imagenes y archivos.

FS_directory='/old_nas/mri_face/mriface_fsresults/';
QC_output_directory='/old_nas/mri_face/ENIGMA_QC/';
ENIGMA_QC_folder='/old_nas/mri_face/ENIGMA_scripts/';

Ahora ya puedo abrir MATLAB. Aqui selecciono los directorios /old_nas/mri_face/ENIGMA_scripts/ y /old_nas/mri_face/qc_scripts/ y los añado al path con click derecho. Este ultimo directorio es donde tengo el script que voy a correr (cortical_qc.m). Y entonces voy al prompt de matlab y escribo,

>> cortical_qc

y si todo va bien me tengo que esperar un rato largo a que esten todas las imagenes para evaluar el QC.

Al final de este proceso hemos de construir la pagina web para poder mirar los slices de QC,

[osotolongo@brick03 mri_face]$ chmod +x ENIGMA_scripts/make_ENIGMA_QC_webpage.sh 
[osotolongo@brick03 mri_face]$ ENIGMA_scripts/make_ENIGMA_QC_webpage.sh /old_nas/mri_face/ENIGMA_QC/

Uploading QC results and images

Ahora, lo primero que se ha de hacer es guardar las imagenes para evaluar el QC cmo un recurso del experimento en XNAT.

Si reutilizo las funciones de mi biblioteca esto puede hacerse con relativa facilidad,

y queda un archivo compactado con todas las imagenes de ambos QC,

The rest of them

Ahora, solo quedan 289 MRI por evaluar, lo que haré es construir una web conjunta para evaluar el QC de estas imagenes. Entonces , leyendo el archivo outliers.list puedo escoger solo las imagenes que me faltan por evaluar,

El script es bastante sencillo,

y una vez ejecutado,

[osotolongo@brick03 mri_face]$ ./make_fsqc_web.sh 

nos quedan, la pagina web para revisar,

y un archivo CSV, donde debemos escribir los resultados,

[osotolongo@brick03 mri_face]$ head fsqc.csv
XNAT05_E00042,fail,None
XNAT05_E00043,fail,None
XNAT05_E00047,fail,None
XNAT05_E00049,fail,None
XNAT05_E00050,fail,None
XNAT05_E00051,fail,None
XNAT05_E00057,fail,None
XNAT05_E00059,fail,None
XNAT05_E00060,fail,None
XNAT05_E00062,fail,None

Por defecto, es solo una lista de los outliers, indicando la MRI como fail y las notas a ecribir como None. Durante la posterior revision ha de editarse,

[osotolongo@brick03 mri_face]$ head fsqc.csv
XNAT05_E00042,good,None
XNAT05_E00043,good,None
XNAT05_E00047,fail,inner fail, too much lessions?
XNAT05_E00049,good,None
XNAT05_E00050,fail,None
XNAT05_E00051,good,None
XNAT05_E00057,good,None
XNAT05_E00059,good,None
XNAT05_E00060,good,None
XNAT05_E00062,good,None

Y una vez revisados todos los outliers y editado el CSV, hay que subir el json correspondiente al recurso del experimento.

El script para subir los resultados es muy similar al de los no outliers

y la ejecucion igual de sencilla,

[osotolongo@brick03 mri_face]$ ./check_bad_qc.pl -p mriface

Los datos deberian quedar entonces almacenados como recurso para todos los experimentos y disponibles para bajar, revisar y manipular posteriormente,

Bajando los resutados a una tabla

No pain. Lo hemos hecho backwards compatible.

[osotolongo@brick03 mri_face]$ xnat_get_fsqc.pl -x mriface
[osotolongo@brick03 mri_face]$ head mriface_fsqc_data.csv
Subject,Date,FSQC,Notes
19990095,2022-10-18,Good,None
20040526,2022-07-05,Good,None
20050456,2022-03-06,Good,None
20050604,2022-09-02,Good,None
20070391,2022-10-25,Good,None
20070711,2023-02-28,Good,None
20070841,2023-01-25,Good,None
20071018,2022-04-10,Good,None
20080792,2022-11-04,Good,None

=) ;-)

neuroimagen/fsqc_enigma.txt · Last modified: 2023/08/16 10:22 by osotolongo