Table of Contents
Pipeline de procesamiento de neuroimagen de ACE (acenip v0.6)
Porqué la nueva versión
Básicamente, estamos enfocando todo hacia XNAT.
- Gran parte del procesamiento se ha desplazado a XNAT. Los procedimientos para Freesurfer, pgsWHM y PET-FBB son obsoletos.
- El almacenamiento de resultados debe hacerse en XNAT. Los archivos intermedios deben poder borrarse. Los informes finales de procesamiento deben salir de XNAT.
- Luego, el procesamiento no basico como DTI, fMRI o cosas mas complejas como el el analisis de hipocampo o los SBM si que han de hacerse fuera de XNAT. Hay que describir bien como organizar una estructura BIDS a partir de las imagenes guardadas en XNAT y documentar el procesamiento posterior.
- Todo el procedimiento inicial alredededor de crear la base de datos del proyecto y el posterior procesamiento de resultados es obsoleto. La DB de trabajo debe generarse dinamicamente a partir de XNAT y puede ser para el proyecto completo o para un procesamiento parcial. Asi, el procesamiento es independiente por completo de la estructura de proyecto.
Una parte muy importante de este esfuerzo es la biblioteca de interaccion con la API de XNAT que permite construir facilmente scripts de interaccion con los proyectos solo ensamblando los bloques necesarios.
Dependencias
- XNAT: http://www.xnat.org/
- dcm2bids: https://pypi.org/project/dcm2bids/
- Freesurfer: https://surfer.nmr.mgh.harvard.edu/
- fmriprep: https://fmriprep.org/en/stable/
- dicom3tools: https://www.dclunie.com/dicom3tools.html (no estrictamente necesario pero conveniente)
Flujo planeado
TO DO
- Reescribir toda la documentacion para enfocar el flujo de trabajo basico hacia XNAT
- Dar la posibilidad de Crear projectos locales al vuelo. Esto es, el proyecto local no necesita coincidir con un proyecto de XNAT, puede ser un subconjunto de este o incluso una interseccion entre varios proyectos de XNAT. (Esto ultimo puede ser complicado!)
- Limpiar la libreria de interaccion con la API de XNAT, dejando solo las funciones necesarias
- El codigo necestia ser mantenible. Hay reescribir los distintos procedimientos a un estilo unico.
- XNAT to BIDS: Bajar directamente los archivos DICOM necesarios, convertir a estructura BIDS y borrar archivos intermedios
interactuando con XNAT
interfaz WEB
La interfaz web de XNAT en ACE esta en la direccion http://xnat.fundacioace.com:8088/. En principio el frontend se intenta mantener medianamente actualizado y toda la documentacion que puede encontrarse en https://wiki.xnat.org/ es aplicable.
En particular, para obtener resultados agilmente, es interesante la API: https://wiki.xnat.org/display/XAPI
xnatapic
Aunque el funcionamiento del pipeline es completamente independiente de xnatapic (https://github.com/asqwerty666/xnatapic), si que es una herramienta interesante para hace consultas rapidas a XNAT y crear reportrs independientes.
Aunque tambien podemos obtener muchos de estos reports desde la interfaz web de XNAT, es mucho mas rapido y sencillo usar xnatapic la mayoria de las veces. Por ejemplo, para obtener el listado de sujetos en un proyecto podemos ir a la interfaz web, buscar el proyecto y bajar un CSV con la lista de sujetos. O simplemente escribir,
[osotolongo@brick03 mri_face]$ xnatapic list_subjects --project_id mriface --label | awk -F',' '{print $2}'> mriface_sujetos.list [osotolongo@brick03 mri_face]$ head mriface_sujetos.list 20211480 20211611 20210716 20211438 20211637 20211281 20200484 20211401 20211683 20211595
Esto nos permite ademas interacciones complejas con otras herramientas como la DB de Ekon.
Ejemplo, el siguiente script es una consulta a Ekon sobre las valores de tau medidos en puncion lumbar para un sujeto con un NHC determinado,
#!/bin/bash nhc=$1 shift sqlcmd -U osotolongo -P *********** -S 172.26.2.161 -s "," -W -Q "SELECT ficha.his_interno as Interno, pr.xdtform as FechaLCR, pr.xlcr_ttau as T_tau_LCR, pr.xlcr_ptau as P_tau_LCR, pr.xlcr_abeta40 as Ratio_Abeta42_40_LCR FROM [UNIT4_DATA].[imp].[his_pr_lcr] as pr JOIN [UNIT4_DATA].[imp].[vh_pac_gral] as ficha ON (ficha.xpaciente_id = pr.xpaciente_id) WHERE ficha.his_interno = '"${nhc}"';"
En el caso concreto que nos interesa, este NHC coincide con el identificar de sujeto del proyecto (mriface), pero en cualquier caso no es dificil hacer una traslacion directa. Asi que basta con bajar la lista de sujetos del proyecto y directamente preguntar a Ekon por cada uno de ellos.
[osotolongo@brick03 mri_face]$ for x in `xnatapic list_subjects --project_id mriface --label | awk -F',' '{print $2}'`; do ./query_pl.sh ${x} | head -n 3 | tail -n 1 | grep -v "^$"; done > mriface_lcr.csv [osotolongo@brick03 mri_face]$ head mriface_lcr.csv 20211480,2021-11-22 17:13:08.000,924,165,.0470 20211611,2021-12-10 10:33:12.000,270,39,.0560 20211438,2021-10-21 11:03:58.000,1410,268,.0370 20211637,2021-12-02 15:45:29.000,998,168,.0440 20211281,2021-11-22 16:55:27.000,813,142,.0420 20211401,2021-11-26 14:52:52.000,1301,208,.0510 20211683,2022-01-10 16:45:57.000,550,90,.0420 20211595,2021-12-17 13:25:06.000,532,88,.0500 20211627,2022-02-04 10:52:39.000,697,120,.0380 20211720,2021-12-22 12:38:02.000,460,92,.0410
MRI en XNAT
Hay dos pipelines incluidos en XNAT que realizan el tratamiento basico de las imagenes T1w y T2w. Para casi todos los proyectos esto es mas que suficiente. Sin embargo, el procesamiento mas avanzado, aqune puede resultar mas interesante, no se hace por defecto pues requiere interaccion con el investigador.
Freesurfer
Para el procesamiento general con FS no hay que hacer mas que incluir y configurar correctamente en el proyecto el pipeline RunFreesurfer. Si se configura correctamente, este pipeline se lanzara cada vez que se sube una MRI y los resultados se almacenan como un resource en el pexperimento correspondiente.
No obstante, en caso de ocurrir algun error, es posible relanzar el pipeline. Esto puede hacerse directamente en la web o usando xnatapic,
[osotolongo@brick03 mri_face]$ xnatapic run_pipeline --project_id unidad --pipeline RunFreesurfer --experiment_id XNAT_E00635 --dcmT1tag tfl3d1_16 --dcmT2tag spcir_220ns
pgs WMH
Ver WMH pgs
Este pipeline ejecuta un proceso muy intensivo y, en principio, se recomienda no ejecutarlo automaticamente. Pero puede cpnfigurarse para que asi sea.
Para ejecutar el pipeline se han de averiguar primero los sujetos que no se han hecho (opcional pero recomendable), y lanzarlo solo sobre estos.
[osotolongo@brick03 mri_face]$ for x in `xnatapic list_experiments --project_id mriface --modality MRI`; do if [[ -z `curl -f -X GET -b "JSESSIONID=FE98FA6B6AB5520A3A329757C3BC1127" "http://detritus.fundacioace.com:8088/data/experiments/${x}/files?format=json" 2>/dev/null| jq '.ResultSet.Result[].Name' | grep wmh.json` ]]; then echo ${x}; fi; done > falta_wmh.list [osotolongo@brick03 mri_face]$ for x in `cat falta_wmh.list`; do xnatapic run_pipeline --project_id mriface --pipeline pgsWMH --experiment_id ${x}; done
Los resultados quedan almacenados en el resource WMH/wmh.json.
FSQC en XNAT
This part is obsolete and will be remove in further releases
Read Integrando ENIGMA Freesurfer QC instead.
Obteniendo resultados
Bajando resultados de Freesurfer
El pipeline de Freesurfer, deja los resultados en forma de archivos stats en el recurso FS. Uilizando la interfaz XNATACE es muy sencillo construir un script que baje y ordene estos recursos.
El script xnat_pullfs.pl es capaz de bajar estos archivos.
[osotolongo@brick03 mix_all]$ xnat_pullfs.pl -s aseg -d -x mriface -o mriface_aseg.csv [osotolongo@brick03 mix_all]$ xnat_pullfs.pl -s aparc -x mriface -o mriface_aparc.csv [osotolongo@brick03 mix_all]$ join -t, mriface_aseg.csv mriface_aparc.csv > mriface_mri.csv
Bajando WMH
Los resultados de WMH quedan almacenados en su propio recurso como un archivo json. Es asi muy sencillo obtenerlos directamente. El script xnat_get_wmh.pl baja y organiza estos valores.
[osotolongo@brick03 mri_face]$ xnat_get_wmh.pl -x mriface -o mriface_wmh.csv
PET-FBB en XNAT
Este pipeline tampoco se recomienda ejecutarlo automaticamente ya que depende de las imagenes PET y MRI y estas se entregan en fechas no relacionadas por dos proveedores distintos.
Ejecucion
Primero encontramos los experimentos correctos,
[osotolongo@brick03 facehbi]$ xnatapic list_experiments --project_id facehbi --type | grep petSessionData | awk -F"," {'print $1'} > xnat_pet_experiments.list [osotolongo@brick03 facehbi]$ head xnat_pet_experiments.list XNAT5_E00276 XNAT5_E00278 XNAT5_E00283 XNAT5_E00296 XNAT5_E00299 XNAT5_E00308 XNAT5_E00316 XNAT5_E00318 XNAT5_E00319 XNAT5_E00323
Y ahora mandamos todo,
[osotolongo@brick03 facehbi]$ for x in `cat xnat_pet_experiments.list`; do xnatapic run_pipeline --project_id facehbi --pipeline RegisterPETwithMRImatch --experiment_id ${x}; done
Extraer resultados
TL;DR: $ xnat_pullcl.pl -p <project> -d -o <output_file.csv>
La idea fundamental aqui es obtener los valores de SUVR y centiloide calculados en XNAT. Estos pueden obtenerse con,
$ xnatapic get_registration_report --project_id f5cehbi --output xnat_pet_results.csv
y esto vamos a limpiarlo un poco,
$ awk -F"," '{print $2","$6","$7}' xnat_pet_results.csv | sed 's/"//g' | tail -n +2 | sort -t, -k 1 > pet.results
La lista de sujetos del proyecto se obtiene con,
$ xnatapic list_subjects --project_id f5cehbi --label > xnat_subjects.list
Esto se puede ordenar rapidamente haciendo,
$ sort -t, -k 1 xnat_subjects.list > xnat_subjects_sorted.list
Y entonces podemos integrar los ID de proyecto con los resultaos, a traves de los ID de XNAT, y seleccionar los datos que queremos guardar,
$ join -t, xnat_subjects_sorted.list pet.results | sort -t, -k 2 | awk -F"," '{if ($3) print $2";"$3";"$4}' | sed '1iSubject;SUVR;Centiloid'"
Todo esto se resume en el script xnat_pullcl.pl. Los archivos intermedios se borran una vez que se obtienen los resultados. Las opciones son,
- -p : nombre del proyecto local
- -x : nombre del proyecto en XNAT
- -o : archivo de salida (default STDOUT)
Troubleshooting
Sacando los PET a ejecutar
¿Que sujetos tengo en el proyecto?
[osotolongo@brick03 f5cehbi]$ xnatapic list_subjects --project_id f5cehbi --label > xnat_subjects.list
¿De aqui, que sujetos tienen MRI?
[osotolongo@brick03 f5cehbi]$ for x in `awk -F"," {'print $1'} xnat_subjects.list`; do e=$(xnatapic list_experiments --project_id f5cehbi --subject_id ${x} --modality MRI); if [[ ${e} ]]; then echo "${x},${e}"; fi; done > xnat_subject_mri.list
¿De estos, cuales tiene PET?
[osotolongo@brick03 f5cehbi]$ for x in `awk -F"," {'print $1'} xnat_subject_mri.list`; do e=$(xnatapic list_experiments --project_id f5cehbi --subject_id ${x} --modality PET); if [[ ${e} ]]; then echo "${x},${e}"; fi; done > xnat_subjects_mri_pet.list
¿De estos PET, cuantos ha sido calculados?
[osotolongo@brick03 f5cehbi]$ awk -F',' '{if($6!="") print $3}' xnat_pet_results.csv | sed 's/"//g' | tail -n +2 > already_done.txt
Y por ultimo, ¿Cuales me falta por calcular?
[osotolongo@brick03 f5cehbi]$ grep -v "`cat already_done.txt`" xnat_subjects_mri_pet.list | awk -F',' '{print $2}' > pet2do.list
Vamos a hacerlos entonces!
[osotolongo@brick03 f5cehbi]$ for x in `cat pet2do.list`; do xnatapic run_pipeline --project_id f5cehbi --pipeline RegisterPETwithMRImatch --experiment_id ${x}; done [osotolongo@brick03 f5cehbi]$ queue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 13027 fast RunFreesurfer.XNAT5_E00001 xnat R 4:35:39 1 brick01 13028 fast RegisterPETwithMRImatch.XNAT5_E00710 xnat R 0:15 1 brick01 13029 fast RegisterPETwithMRImatch.XNAT5_E00729 xnat R 0:15 1 brick01 13030 fast RegisterPETwithMRImatch.XNAT5_E00733 xnat R 0:15 1 brick01 13031 fast RegisterPETwithMRImatch.XNAT5_E00735 xnat R 0:12 1 brick01 13032 fast RegisterPETwithMRImatch.XNAT5_E00737 xnat R 0:12 1 brick01 13033 fast RegisterPETwithMRImatch.XNAT5_E00742 xnat R 0:12 1 brick01 13034 fast RegisterPETwithMRImatch.XNAT5_E00743 xnat R 0:12 1 brick02 13035 fast RegisterPETwithMRImatch.XNAT5_E00746 xnat R 0:12 1 brick02 13036 fast RegisterPETwithMRImatch.XNAT5_E00751 xnat R 0:12 1 brick02 13037 fast RegisterPETwithMRImatch.XNAT5_E00752 xnat R 0:12 1 brick02 13038 fast RegisterPETwithMRImatch.XNAT5_E00753 xnat R 0:12 1 brick02
PET con tag erroneo
Si el tag con que estan etiquetadas las imagenes es incorrecto, el registro de PET dara error. Tipicamente recibes un email con un subject como:
XNAT update: Processing failed for F082A
Habria que revisar el sujeto, mirar como se ha etiquetado la imagen,
y relanzar algo como,
[osotolongo@brick03 f5cehbi]$ xnatapic run_pipeline --project_id f5cehbi --pipeline RegisterPETwithMRImatch --experiment_id XNAT5_E00752 --dcmFBBtag PETNAC_Standard [osotolongo@brick03 f5cehbi]$ queue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 13039 fast RegisterPETwithMRImatch.XNAT5_E00752 xnat R 0:03 1 brick01
failsafe PET
Un escenario que puede ocurrir es cuando el DICOM PET no se convierte correctamente con las herramientas automaticas. Es posible entonces, subir el PET en formato NIfTI-1 y ejecutar un pipeline para que registre este ultimo archivo.
[osotolongo@brick03 f2cehbi]$ xnatapic upload_nifti --project_id f2cehbi --subject_id F043 --experiment_id F043F --scan_id 5 /nas/clinic/nii/v2/F043/PET.nii PET.json
El archivo nifti debe ser el correspondiente al total de tiempo integrado,
[osotolongo@brick03 f2cehbi]$ fslinfo /nas/clinic/nii/v2/F043/PET.nii data_type FLOAT32 dim1 400 dim2 400 dim3 109 dim4 1 datatype 16 pixdim1 1.018210 pixdim2 1.018210 pixdim3 2.027008 pixdim4 0.000000 cal_max 0.0000 cal_min 0.0000 file_type NIFTI-1+
El archivo json debe contener la info minima para identificar el protocolo correcto,
[osotolongo@brick03 f2cehbi]$ cat PET.json { "SeriesDescription": "FACEHBI_Florbetaben_20min", "ProtocolName": "FACEHBI_Florbetaben_20min" }
ambos archivos deben tener el mismo nombre.
Tras esto ya es posible lanzar el pipeline RegisterPETwithMRI,
[osotolongo@brick03 f2cehbi]$ xnatapic run_pipeline --project_id f2cehbi --pipeline RegisterPETwithMRI --experiment_id F043F --dcmT1tag tfl3d1_16 --dcmFBBtag _20min
PET FBB QC interactuando con XNAT
Making of
El procesamiento de las FBB en XNAT genera una imagen para evaluar la calidad del registro de FBB a espacio MNI.
lo que necesitamos es una herramienta sencilla capaz de leer la información de XNAT, mostrar las imagenes, permitir evaluar el QC y volcar de regreso la info en XNAT.
TIMTOWTDI, pero voy a hacerlo a la old fashion con CGI.pm.
Necesito leer tres cosas por cada sujeto, experiment_ID, imagen de QA y estado del QA. Primero la lista de sujetos del proyecto, con la REST API,
curl -X GET -u "$USER:$PASSWD" "$HOST/data/projects/$PROJECT/subjects?format=json" | jq ".ResultSet.Result[].ID" | sed \'s/"/,/g\'
Ahora por cada sujeto saco el experimento PET que le corresponde,
curl -X GET -u "$USER:$PASSWD" "$HOST/data/projects/$PROJECT/subjects/$SUBJECT/experiments?xsiType=xnat:petSessionData" 2>/dev/null | jq ".ResultSet.Result[].ID" | sed \'s/"//g\'
Para este experimento obtengo el QA,
curl -X GET -u "$USER:$PASSWD" "$HOST/data/experiments/$EXPERIMENT/resources/MRI/files/mriSessionMatch.json" 2>/dev/null | jq ".ResultSet.Result[].qa"
y me bajo la imagen a un directorio temporal,
curl -X GET -u "$USER:$PASSWD" "$HOST/data/experiments/$EXPERIMENT/resources/MRI/files/$SUBJECT_fbb_mni.gif" -o $TMP_IMAGE
Todo esto lo voy metiendo en un hash y lo pongo en un formulario con la CGI. Cuando se envia el formulario tengo que crear el json con la info y luego subirlo. Pero lo que voy a hacer es bajar el json existente, cambiar el valor de QA y volverlo a subir. Algo asi,
curl -X GET -u "$USER:$PASSWD" "$HOST/data/experiments/$EXPERIMENT/resources/MRI/files/mriSessionMatch.json" 2>/dev/null
esto lo meto en una variable y le hago,
$resp =~ s/,"qa":\d,/"qa":$qcs{$xpx},/;
la escribo a un archivo temporal y la subo con,
curl -X PUT -u "$USER:$PASSWD" "$HOST/data/experiments/$EXPERIMENT/resources/MRI/files/mriSessionMatch.json?overwrite=true" -F file="@$TMP_FILE"
y ya esta!!!!! ponemos un smiley o algo. el codigo en github.
Usando esto
El output es feo y lento, pero facil de usar. Primero hay que suministrar el nombre del proyecto en XNAt y los datos de login para XNAT.
La aplicacion se conectara entonces usando la REST API y mostrara el resultado del QC que tenemos. Aqui se modifica los necesario, se le da a submit y ya esta.
Nota: no hay que ser muy exigente con el resutado del registro. Hay mucho smooth y ROIs grandes para compensar los pequeños desplazamiento. on que la cabeza este mas o menos en su sitio ya nos vale.
Trabajando en local
Manipular las rutas
La configuración del proyecto puede ser modificada editando el archivo de configuración directamente o utilizando la herramienta pipeconf.pl, que puede mostrar, editar una variable o incluso crear un nuevo archivo con los valores por defecto. Ejemplos:,
- Mostrar configuración
$ pipeconf.pl -p f5cehbi -r BIDS = /old_nas/f5cehbi/bids DATA = /old_nas/f5cehbi PET = /nas/data/f5cehbi/raw_tau/PI2620 SRC = /nas/data/f5cehbi/raw WORKING = /old_nas/f5cehbi/working XNAME = f5cehbi
- Editar configuración
$ pipeconf.pl -p f5cehbi -a XNAME=f2cehbi $ pipeconf.pl -p f5cehbi -r BIDS = /old_nas/f5cehbi/bids DATA = /old_nas/f5cehbi PET = /nas/data/f5cehbi/raw_tau/PI2620 SRC = /nas/data/f5cehbi/raw WORKING = /old_nas/f5cehbi/working XNAME = f2cehbi
- Crear nuevo archivo
$ pipeconf.pl -p test -c /nas/data/test [osotolongo@brick03 acenip]$ pipeconf.pl -p test -r BIDS = /nas/data/test/bids DATA = /nas/data/test SRC = /nas/data/test/raw WORKING = /nas/data/test/working XNAME = test
Con este conjunto de operaciones basta para manipular la configuración de cualquier proyecto.
de XNAT a local
Aunque se supone que tenemos todos los DICOM en el server, lo cierto es que lo que nos suben puede estar muy desordenado. Para llevar las imagenes a XNAT ya nos hemos tomado el trabajo de ordenar todo y en XNAT deberia estar el proyecto muy ordenado.
Luego, la idea es que una vez que el proyecto en XNAT este cerrado, podemos recrear la colección de DICOMs en el directorio SRC del proyecto local. El script xnat2raw.pl recorre los sujetos del projecto XNAT y baja los DICOM de cada experimento (MRI o PET) y los guarda en un directorio diferenciado utilizando la funcion xget_dicom de la biblioteca de interacción con la API (Ver markdown docs).
Por ejemplo, para el proyecto local unidad, el archivo de configuración,
[osotolongo@brick03 mri_face]$ cat ~/.config/neuro/unidad.cfg BIDS = /old_nas/mri_face/bids DATA = /old_nas/mri_face SRC = /old_nas/mri_face/raw WORKING = /old_nas/mri_face/working XNAME = tester
nos dice que debe enlazarse con el proyecto XNAT tester. Asi que al ejecutar,
[osotolongo@brick03 mri_face]$ xnat2raw.pl -p unidad
se crea un directorio por sujeto del proyecto dentro del SRC,
[osotolongo@brick03 mri_face]$ ls raw/ 20050456 20081210 20100678
y el archivo CSV, unidad_MRI.csv,
[osotolongo@brick03 mri_face]$ cat unidad_MRI.csv 0001,20081210 0002,20100678 0003,20050456
que podemos utilizar para crear facilmente la DB del proyecto y ejecutar la conversion a BIDS.
DCM2BIDS
El proceso de conversion de los DICOM a formato BIDS ha de hacerse manualmente. Esto es, aunque con ayuda de herramientas (Convertir DICOMs a BIDS), la conversion necesita que se realicen ciertos pasos no automatizados. Dado la disimilitud de los proyectos, los archivos han de editarse y el proceso de conversion de al menos uno de los sujetos ha de revisarse para automatizar el resto.
El primer paso para la conversión ha de ser ejecutar dcm2bids_scaffold dentro del directorio bids del proyecto. Esto crea la estructura necesaria para la ejecucion.
[tester@detritus bids]$ dcm2bids_scaffold [tester@detritus bids]$ ls CHANGES code dataset_description.json derivatives participants.json participants.tsv README sourcedata
El archivo dataset_description.json ha de editarse manualmente, pero es bastante sencillo,
[tester@detritus bids]$ cat dataset_description.json { "Name": "PTEST", "BIDSVersion": "1.2.0", "License": "CC0" }
Ahora debemos escoger un sujeto del proyecto para examinar la estructura de los datos,
[tester@detritus bids]$ dcm2bids_helper -d /nas/tester/testproj/032-00001-SCR-GLOBAL/ Example in: /nas/data/ptest/bids/tmp_dcm2bids/helper
La estructura dejada por este comando, junto al protocolo de maquina permite llenar el archivo de configuracion necesario para la conversion de los sujetos. Esto ha de hacerse con cuidado, pero una vez rellenado correctamente la conversion es sencilla.
Ejemplo basado en el protocolo de EPAD
En este punto ya podemos ejecutar la conversion de cualquier sujeto usando dcm2bids,
$ dcm2bids -d /src_path/ -p subj_id -c config_file.json -o proj_path/bids/
Lo que es deseable es ejecutar la conversion de todos los sujetos del proyecto usando el cluster. ahora bien,una vez que el archivo de configuracion se ha editado correctamente ya se puede utilizar una herramienta generica.
Lo programamos entonces en el pipeline
[tester@detritus ptest]$ bulk2bids.pl ptest [tester@detritus ptest]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 114181 devel fs_recon tester PD 0:00 1 (Dependency) 114191 devel dcm2bids tester PD 0:00 1 (Dependency) 114184 devel dcm2bids tester R 0:42 1 brick01 114185 devel dcm2bids tester R 0:42 1 brick01 114186 devel dcm2bids tester R 0:42 1 brick01 114187 devel dcm2bids tester R 0:42 1 brick01 114188 devel dcm2bids tester R 0:42 1 brick01 114189 devel dcm2bids tester R 0:42 1 brick01 [tester@detritus ptest]$ tail -f slurm/dcm2bids0002-114184 INFO:dcm2bids.dcm2bids:--- dcm2bids start --- INFO:dcm2bids.dcm2bids:OS:version: Linux-3.10.0-862.11.6.el7.x86_64-x86_64-with-centos-7.5.1804-Core INFO:dcm2bids.dcm2bids:python:version: 3.6.8 (default, Aug 7 2019, 17:28:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] INFO:dcm2bids.dcm2bids:dcm2bids:version: 2.1.4 INFO:dcm2bids.dcm2bids:dcm2niix:version: v1.0.20191031 INFO:dcm2bids.dcm2bids:participant: sub-0002 INFO:dcm2bids.dcm2bids:session: INFO:dcm2bids.dcm2bids:config: /home/data/ptest/bids/conversion.json INFO:dcm2bids.dcm2bids:BIDS directory: /home/data/ptest/bids INFO:dcm2bids.utils:Running dcm2niix -b y -ba y -z y -f '%3s_%f_%p_%t' -o /nas/data/ptest/bids/tmp_dcm2bids/sub-0002 /nas/tester/testproj/032-00002-SCR-GLOBAL/ .........
Issues
A veces dmc2niix falla y se interrumpe la ejecucion de dcm2bids. Workaround: Separar los procesos de dcm2niix y dcm2bids. Primero convierto y despues organizo.De paso tengo mas control sobre como convierto (Ver respuesta de Chris Rorden)
my $order = "mkdir -p $std{'DATA'}/bids/tmp_dcm2bids/sub-$subject; dcm2niix -i y -b y -ba y -z y -f '%3s_%f_%p_%t' -o $std{'DATA'}/bids/tmp_dcm2bids/sub-$subject $std{'SRC'}/$guys{$subject}/; dcm2bids -d $std{'SRC'}/$guys{$subject}/ -p $subject -c $std{'DATA'}/$cfile -o $std{'DATA'}/bids/";
Preparando el proyecto local
Para ejecutar tareas complejas necesitamos crear un proyecto local. Este puede corresponder a un proyecto completo de XNAT o a un subconjunto.
Lo primero es crear la configuracion y el esqueleto del proyecto con algunos valores por defecto,
[osotolongo@brick03 ~]$ make_proj.pl example /old_nas/osotolongo/example
Ahora podemos utilizar la utilidad de edicion de proyectos, ya sea para leer la configuracion,
[osotolongo@brick03 ~]$ pipeconf.pl -r -p example DATA = /ruby/neuroimagen/example SRC = /old_nas/osotolongo/example WORKING = /ruby/neuroimagen/example/working BIDS = /ruby/neuroimagen/example/bids
o, por ejemplo, para añadir el proyecto de XNAT que debemos enlazar,
[osotolongo@brick03 ~]$ pipeconf.pl -a XNAME=unidad -p example [osotolongo@brick03 ~]$ pipeconf.pl -r -p example BIDS = /ruby/neuroimagen/example/bids DATA = /ruby/neuroimagen/example SRC = /old_nas/osotolongo/example WORKING = /ruby/neuroimagen/example/working XNAME = unidad
Ahora debemos preparar el esqueleto de la conversion a BIDS,
[osotolongo@brick03 ~]$ cd /ruby/neuroimagen/example/bids [osotolongo@brick03 bids]$ dcm2bids_scaffold [osotolongo@brick03 bids]$ ls CHANGES code dataset_description.json derivatives participants.json participants.tsv README sourcedata
y deberiamos crear el archivo conversion.json con los datos de los scans que querramos convertir a BIDS. Esto es bastante simple mirando la informacion de la MRI en XNAT,
Por ejemplo, si de estos experimentos queremos los T1w y T2w, creamos el archivo,
- conversion.json
{ "descriptions" :[ { "dataType": "anat", "modalityLabel": "T1w", "criteria" : { "SeriesDescription" : "t1_mprage_sag_p2_iso" } }, { "dataType": "anat", "modalityLabel": "T2w", "criteria" : { "SeriesDescription": "t2_space_FLAIR_sag_p2_ns-t2prep" } } ] }
Entonces, de aqui puedo leer directamente los scans que tengo que bajar por cada experimento haciendo algo como,
[osotolongo@brick03 bids]$ cat conversion.json | jq '.descriptions[].criteria.SeriesDescription' "t1_mprage_sag_p2_iso" "t2_space_FLAIR_sag_p2_ns-t2prep"
XNAT to BIDS
Para llevar un grupo de sujetos de XNAT a un proyecto local vamos a establecer un procedimiento operativo sencillo. Primero, vamos a asumir que todos los sujetos pertenecen al mismo proyecto de XNAT y que hemos ya configurado correctamente el proyecto local (lee mas arriba, anda).
[osotolongo@brick03 example]$ pipeconf.pl -r -p example BIDS = /ruby/neuroimagen/example/bids DATA = /ruby/neuroimagen/example SRC = /old_nas/osotolongo/example WORKING = /ruby/neuroimagen/example/working XNAME = unidad
ahora voy a hacer una lista de los sujetos del proyecto XNAT que quiero incluir en el proyecto local.
[osotolongo@brick03 example]$ cat sbj.list 20070391 20081210 20100678
En principio esto es todo lo que necesitaria para empezar. El esquema de trabajo es mas o menos asi,
Para hacer esto basta con enviar,
[osotolongo@brick03 example]$ xnat2bids.pl -p example -i sbj.list -j bids/conversion.json
Y, al filtrar los campos de Series Description y pasarlos a la funcion xget_dicom() se bajan solamente los archivos correspondientes a T1w y T2w (en este caso).
[osotolongo@brick03 example]$ ls -l /old_nas/osotolongo/example/*/*/scans /old_nas/osotolongo/example/20070391/1D22133126/scans: total 8 drwx------ 3 osotolongo osotolongo 4096 Dec 23 09:10 5001-t1_mprage_sag_p2_iso drwx------ 3 osotolongo osotolongo 4096 Dec 23 09:10 6001-t2_space_FLAIR_sag_p2_ns_t2prep /old_nas/osotolongo/example/20081210/1D21146858/scans: total 8 drwx------ 3 osotolongo osotolongo 4096 Dec 23 09:10 5001-t1_mprage_sag_p2_iso drwx------ 3 osotolongo osotolongo 4096 Dec 23 09:10 6001-t2_space_FLAIR_sag_p2_ns_t2prep /old_nas/osotolongo/example/20100678/1D22003736/scans: total 16 drwx------ 3 osotolongo osotolongo 4096 Dec 23 09:10 10-t1_mprage_sag_p2_iso drwx------ 3 osotolongo osotolongo 4096 Dec 23 09:10 11-t2_space_FLAIR_sag_p2_ns_t2prep drwx------ 3 osotolongo osotolongo 4096 Dec 23 09:10 19-t1_mprage_sag_p2_iso drwx------ 3 osotolongo osotolongo 4096 Dec 23 09:10 5-t1_mprage_sag_p2_iso
Tras esto se lanza la conversion a BIDS en el schedule manager.
[osotolongo@brick03 example]$ ls -l bids/sub-000*/anat bids/sub-0001/anat: total 20072 -rw-rw-r-- 1 osotolongo osotolongo 1572 Dec 23 09:10 sub-0001_T1w.json -rw-rw-r-- 1 osotolongo osotolongo 13451620 Dec 23 09:10 sub-0001_T1w.nii.gz -rw-rw-r-- 1 osotolongo osotolongo 1674 Dec 23 09:10 sub-0001_T2w.json -rw-rw-r-- 1 osotolongo osotolongo 7089107 Dec 23 09:10 sub-0001_T2w.nii.gz bids/sub-0002/anat: total 48400 -rw-rw-r-- 1 osotolongo osotolongo 1586 Dec 23 09:10 sub-0002_run-01_T1w.json -rw-rw-r-- 1 osotolongo osotolongo 13485861 Dec 23 09:10 sub-0002_run-01_T1w.nii.gz -rw-rw-r-- 1 osotolongo osotolongo 1570 Dec 23 09:10 sub-0002_run-02_T1w.json -rw-rw-r-- 1 osotolongo osotolongo 14063513 Dec 23 09:10 sub-0002_run-02_T1w.nii.gz -rw-rw-r-- 1 osotolongo osotolongo 1570 Dec 23 09:10 sub-0002_run-03_T1w.json -rw-rw-r-- 1 osotolongo osotolongo 14433653 Dec 23 09:10 sub-0002_run-03_T1w.nii.gz -rw-rw-r-- 1 osotolongo osotolongo 1673 Dec 23 09:10 sub-0002_T2w.json -rw-rw-r-- 1 osotolongo osotolongo 7556939 Dec 23 09:10 sub-0002_T2w.nii.gz bids/sub-0003/anat: total 19220 -rw-rw-r-- 1 osotolongo osotolongo 1582 Dec 23 09:10 sub-0003_T1w.json -rw-rw-r-- 1 osotolongo osotolongo 13091825 Dec 23 09:10 sub-0003_T1w.nii.gz -rw-rw-r-- 1 osotolongo osotolongo 1685 Dec 23 09:10 sub-0003_T2w.json -rw-rw-r-- 1 osotolongo osotolongo 6576547 Dec 23 09:10 sub-0003_T2w.nii.gz
Ademas, el archivo que enlaza los ID de procesamiento con los ID del proyecto en XNAT queda correctamente configurado,
[osotolongo@brick03 example]$ cat example_mri.csv 0001;20081210 0002;20100678 0003;20070391
Además, los archivos bids/participants.tsv y bids/participants.json se rellenan con toda la informacion necesaria para conectar la estructura BIDS con los datos de XNAT,
[osotolongo@brick03 example]$ cat bids/participants.tsv 0001 20081210 0002 20100678 0003 20070391 [osotolongo@brick03 example]$ cat bids/participants.json | jq '.' { "0001": { "XNAT_experiment_ID": "XNAT05_E00046", "XNAT_ID": "XNAT05_S00033", "XNAT_label": "20081210" }, "0002": { "XNAT_experiment_ID": "XNAT05_E00094", "XNAT_label": "20100678", "XNAT_ID": "XNAT05_S00081" }, "0003": { "XNAT_ID": "XNAT_S00722", "XNAT_label": "20070391", "XNAT_experiment_ID": "XNAT_E00839" } }
Nota: Al reducir tanto el download como la conversion a los archivos que realmente necesitamos, el tiempo de procesamiento a BIDS disminuye dramaticamente.
GET fake FS subject's pool
Mucho del procesamiento avanzado, por ejemplo el procesamiento DTI, necesita no solo la estructura BIDS sino que toma la MRI postprocesada de Freesurfer. No hemos de ejecutar de nuevo la segmentacion ya que todos los archivos del procesamiento estan almacenados en XNAT. Asi que nos bajamos todo y lo organizamos.
Basicamente lo unico que habria que hacer es leer el archivo de enlaces del proyecto (example_mri.csv) y para cada linea, tomar el ID del sujeto de XNAT, buscar el MRI correspondiente, y bajar el tgxz eu esta dentro del resource FS a descomprimir en ${SUBJECTS_DIR}. Bueno y algun tratamiento de strings por el camino.
El problema seria el tiempo que tarda en descomprimir esto cuando son muchos sujetos. Asi que vamos a ver como enviamos las tareas a SLURM. El uso de SLURM aqui no solo cambia el como se va a usar la interaccion con XNAT sino el uso de directorios temporal.
- No es util usar xget_res_file() desde Perl y enviar a SLURM el untar porque es casi igualmente lento. Tengo que ver como paso la orden a SLURM (o sea a bash)
- No puedo hacer un directorio temporal desde un nodo y usarlo desde otro ya que no sera accesible (esto sin importar el path!)
Puedo escribir directamente la interaccion con la API pero en lugar de eso voy a usar la funcion xget_res_file pero pasandole un parametro extra para que no ejecute sino que exporte la orden a ejecutar –> undocumented features
ahora, al hacer esto,
[osotolongo@brick03 example]$ xnat_getfs.pl -p example -ovw Getting XNAT subject list OK, now I'm going on Downloading and extracting D21582920.tar.gz -> /old_nas/subjects/example_0001 D22013217.tar.gz -> /old_nas/subjects/example_0002 D22488864.tar.gz -> /old_nas/subjects/example_0003
se crean los archivos sbatch como,
[osotolongo@brick03 example]$ cat slurm/0001.sh #!/bin/bash #SBATCH -J fake_FS_example #SBATCH -o /ruby/neuroimagen/example/slurm/0001.out-%j #SBATCH --mail-user=osotolongo #SBATCH --mail-type=FAIL,TIME_LIMIT,STAGE_OUT mkdir /ruby/user_data/osotolongo/tmp/example_0001 curl -f -X GET -b JSESSIONID=DCC76CADC18614B01DD7DFB16CDF31D7 "http://detritus.fundacioace.com:8088/data/experiments/XNAT05_E00046/resources/FS/files/D21582920.tar.gz" -o /ruby/user_data/osotolongo/tmp/example_0001/XNAT05_S00033.tar.gz tar xzf /ruby/user_data/osotolongo/tmp/example_0001/XNAT05_S00033.tar.gz -C /old_nas/subjects/example_0001/ --transform='s/XNAT05_S00033//' --exclude='fsaverage' rm -rf /ruby/user_data/osotolongo/tmp/example_0001
que son los encargados de,
- crear el directorio temporal
- bajar el archivo comprimido de FS
- descompactarlo en la ruta final
- borrar el directorio temporal
y despues ponemos el warning usual para que avise cuando termine. La ejecucion queda como,
[osotolongo@brick03 example]$ queue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 326038 fast fake_FS_example osotolon PD 0:00 1 (Dependency) 326035 fast fake_FS_example osotolon R 0:03 1 brick01 326036 fast fake_FS_example osotolon R 0:03 1 brick01 326037 fast fake_FS_example osotolon R 0:03 1 brick01
y nos debe dejar todo el procesamiento de FS en su lugar,
[osotolongo@brick03 example]$ ls /old_nas/subjects/example_* /old_nas/subjects/example_0001: label mri scripts stats surf tmp touch trash /old_nas/subjects/example_0002: label mri scripts stats surf tmp touch trash /old_nas/subjects/example_0003: label mri scripts stats surf tmp touch trash
Hippocampal Subfields
(detalles en Segmentacion del hipocampo)
A esta version se le ha añadido la capacidad de extraer la segmentacion del hipocampo y la amigdala. Primero debemos tener el proyecto creado y la segmentacion de FS en local.
Ahora solo hacemos,
[osotolongo@brick03 mri_face]$ hsfrecon.pl mriface [osotolongo@brick03 acenip]$ queue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 218945 fast hsf_recon_mriface osotolon R 2:16 1 brick02 218946 fast hsf_recon_mriface osotolon R 2:06 1 brick02 218947 fast hsf_recon_mriface osotolon R 1:56 1 brick02 218948 fast hsf_recon_mriface osotolon R 1:46 1 brick02 218949 fast hsf_recon_mriface osotolon R 1:36 1 brick02 218950 fast hsf_recon_mriface osotolon R 1:26 1 brick02 218951 fast hsf_recon_mriface osotolon R 1:16 1 brick02 218952 fast hsf_recon_mriface osotolon R 1:06 1 brick02 218953 fast hsf_recon_mriface osotolon R 0:56 1 brick02 218954 fast hsf_recon_mriface osotolon R 0:46 1 brick02 218955 fast hsf_recon_mriface osotolon R 0:36 1 brick02 218956 fast hsf_recon_mriface osotolon R 0:26 1 brick02 218957 fast hsf_recon_mriface osotolon R 0:16 1 brick02 218958 fast hsf_recon_mriface osotolon R 0:06 1 brick02 ... ... ...
y, tras recibir el aviso de finalización,
se sacan las métricas,
[osotolongo@brick03 mri_face]$ hsf_metrics.pl mriface
con lo que los resultados quedan en mriface_hsf_metrics.csv.
[osotolongo@brick03 mri_face]$ head mriface_hsf_metrics.csv Subject,lh.CA1-body,lh.CA1-head,lh.CA3-body,lh.CA3-head,lh.CA4-body,lh.CA4-head,lh.GC-ML-DG-body,lh.GC-ML-DG-head,lh.HATA,lh.Hippocampal_tail,lh.Whole_hippocampal_body,lh.Whole_hippocampal_head,lh.Whole_hippocampus,lh.fimbria,lh.hippocampal-fissure,lh.molecular_layer_HP-body,lh.molecular_layer_HP-head,lh.parasubiculum,lh.presubiculum-body,lh.presubiculum-head,lh.subiculum-body,lh.subiculum-head,rh.CA1-body,rh.CA1-head,rh.CA3-body,rh.CA3-head,rh.CA4-body,rh.CA4-head,rh.GC-ML-DG-body,rh.GC-ML-DG-head,rh.HATA,rh.Hippocampal_tail,rh.Whole_hippocampal_body,rh.Whole_hippocampal_head,rh.Whole_hippocampus,rh.fimbria,rh.hippocampal-fissure,rh.molecular_layer_HP-body,rh.molecular_layer_HP-head,rh.parasubiculum,rh.presubiculum-body,rh.presubiculum-head,rh.subiculum-body,rh.subiculum-head,whole.CA1-body,whole.CA1-head,whole.CA3-body,whole.CA3-head,whole.CA4-body,whole.CA4-head,whole.GC-ML-DG-body,whole.GC-ML-DG-head,whole.HATA,whole.Hippocampal_tail,whole.Whole_hippocampal_body,whole.Whole_hippocampal_head,whole.Whole_hippocampus,whole.fimbria,whole.hippocampal-fissure,whole.molecular_layer_HP-body,whole.molecular_layer_HP-head,whole.parasubiculum,whole.presubiculum-body,whole.presubiculum-head,whole.subiculum-body,whole.subiculum-head mriface_0001,160.140423,643.111512,121.733859,181.450963,136.089629,176.885647,142.768001,214.595877,75.325365,675.274931,1293.282294,2090.659074,4059.216299,74.752421,188.162283,249.214902,399.634974,65.916415,147.868612,140.671683,260.714447,193.066639,160.417880,557.584677,144.919215,150.610933,158.435914,146.932857,167.188920,174.063578,58.895612,646.290298,1294.041853,1785.289454,3725.621605,64.672166,186.310011,244.291453,344.342486,61.677945,112.838806,121.130778,241.277501,170.050586,320.558303,1200.696189,266.653074,332.061896,294.525543,323.818504,309.956921,388.659455,134.220977,1321.565229,2587.324147,3875.948528,7784.837904,139.424587,374.472294,493.506355,743.97746,127.59436,260.707418,261.802461,501.991948,363.117225 mriface_0002,103.287906,482.663069,70.404188,136.628715,108.229725,130.864657,123.395396,154.621026,59.824302,483.804995,1049.338826,1653.070021,3186.213842,77.842256,135.308845,188.309856,312.397416,75.537688,143.016055,140.327036,234.853444,160.206112,94.023260,490.761234,91.329668,133.129240,126.997684,132.734252,141.050346,152.248955,60.223939,448.709529,1104.744740,1655.016815,3208.471084,61.685305,166.993028,202.158720,317.133128,73.087146,146.284817,132.921255,241.214940,162.777666,197.311166,973.424303,161.733856,269.757955,235.227409,263.598909,264.445742,306.869981,120.048241,932.514524,2154.083566,3308.086836,6394.684926,139.527561,302.301873,390.468576,629.530544,148.624834,289.300872,273.248291,476.068384,322.983778 mriface_0003,93.472053,292.211426,63.399442,75.138635,83.350543,79.036618,89.423755,86.168844,28.511534,351.012237,744.342056,991.830003,2087.184295,27.602650,125.530329,142.094642,188.495860,53.322443,103.487495,80.480452,141.511475,108.464190,106.828836,342.747996,71.336504,75.118041,90.448081,86.619239,95.673876,95.907348,32.929040,404.474760,846.803326,1187.683959,2438.962045,30.090636,164.192786,160.769831,228.038129,68.750950,119.683304,102.904924,171.972258,154.668293,200.300889,634.959422,134.735946,150.256676,173.798624,165.655857,185.097631,182.076192,61.440574,755.486997,1591.145382,2179.513962,4526.14634,57.693286,289.723115,302.864473,416.533989,122.073393,223.170799,183.385376,313.483733,263.132483 mriface_0004,90.025085,425.035298,61.411596,95.384809,85.516784,100.256754,93.233374,112.652146,55.431434,376.308526,872.067514,1349.532440,2597.908481,41.677259,159.021456,159.268126,242.911788,69.730972,134.091369,110.008671,206.843921,138.120570,110.674897,370.394924,62.026268,95.396101,92.756480,97.983884,102.218936,105.636656,52.204311,385.544462,849.524182,1210.263846,2445.332491,34.370706,176.590676,159.272561,218.078316,58.590188,103.594471,85.746939,184.609864,126.232527,200.699982,795.430222,123.437864,190.78091,178.273264,198.240638,195.45231,218.288802,107.635745,761.852988,1721.591696,2559.796286,5043.240972,76.047965,335.612132,318.540687,460.990104,128.32116,237.68584,195.75561,391.453785,264.353097 mriface_0005,93.859758,324.806652,77.916251,83.807912,89.245013,87.995024,94.582035,96.679923,49.024978,414.336672,810.804979,1157.485099,2382.626750,37.909804,141.689681,154.416912,208.037965,68.748935,98.145165,107.828875,164.730041,130.554836,119.825141,406.823919,85.275754,95.169639,94.333964,107.044569,102.725566,121.103714,48.089261,506.876257,921.452891,1405.736164,2834.065313,37.298695,155.083729,182.466672,265.513688,81.957020,102.535701,121.564807,196.991399,158.469547,213.684899,731.630571,163.192005,178.977551,183.578977,195.039593,197.307601,217.783637,97.114239,921.212929,1732.25787,2563.221263,5216.692063,75.208499,296.77341,336.883584,473.551653,150.705955,200.680866,229.393682,361.72144,289.024383
Preprocesamiento SBM
El analisis SBM debe prepararse y hacerse independientemente del flujo de proyecto ya que requiere preparar una DB independiente con datos externos a neuroimagen. No obstante, pueden preprocesarse las MRI dentro de la estructura general del proyecto.
Para esto basta con ejecutar un recon_all -qcache -subjid project_subjectid. Asi que es tan simple como recorrer la DB y ejecutar esto en paralelo con,
$ pqcache.pl proyecto
y ahi quedan todas las medias preparadas para distintos valores de FWHM,
[osotolongo@brick03 ~]$ ls /old_nas/subjects/bioface_0001/surf/*fwhm* /old_nas/subjects/bioface_0001/surf/lh.area.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.volume.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.jacobian_white.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.area.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.volume.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.jacobian_white.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.area.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.w-g.pct.mgh.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.jacobian_white.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.area.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.w-g.pct.mgh.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.jacobian_white.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.area.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.w-g.pct.mgh.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.sulc.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.area.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.w-g.pct.mgh.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.sulc.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.area.pial.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.w-g.pct.mgh.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.sulc.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.area.pial.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.w-g.pct.mgh.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.sulc.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.area.pial.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.white.H.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.sulc.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.area.pial.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.white.H.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.sulc.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.area.pial.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.white.H.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.thickness.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.area.pial.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.white.H.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.thickness.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.curv.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.white.H.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.thickness.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.curv.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.white.H.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.thickness.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.curv.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.white.K.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.thickness.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.curv.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.white.K.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.thickness.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.curv.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.white.K.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.volume.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.curv.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.white.K.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.volume.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.jacobian_white.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.white.K.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.volume.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.jacobian_white.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.white.K.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.volume.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.jacobian_white.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.area.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.volume.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.jacobian_white.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.area.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.volume.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.jacobian_white.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.area.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.w-g.pct.mgh.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.jacobian_white.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.area.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.w-g.pct.mgh.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.sulc.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.area.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.w-g.pct.mgh.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.sulc.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.area.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.w-g.pct.mgh.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.sulc.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.area.pial.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.w-g.pct.mgh.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.sulc.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.area.pial.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.w-g.pct.mgh.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.sulc.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.area.pial.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.white.H.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.sulc.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.area.pial.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.white.H.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.thickness.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.area.pial.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.white.H.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.thickness.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.area.pial.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.white.H.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.thickness.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.curv.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.white.H.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.thickness.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.curv.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.white.H.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.thickness.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.curv.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.white.K.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.thickness.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.curv.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.white.K.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.volume.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.curv.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.white.K.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.volume.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.curv.fwhm5.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.white.K.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.volume.fwhm15.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.jacobian_white.fwhm0.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.white.K.fwhm25.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/lh.volume.fwhm20.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.jacobian_white.fwhm10.fsaverage.mgh /old_nas/subjects/bioface_0001/surf/rh.white.K.fwhm5.fsaverage.mgh
Ver https://github.com/asqwerty666/acenip/blob/main/bin/pqcache.pl
DTI preproc
El procesamiento no cambia mucho del que se realiza en la version anterior. No obstante, al tomar los archivos del formato BIDS, la estructura en que se guarda es por completo abstracta del software y la comprobaicon de los archivos (y posterior toma de decisiones) se puede individualizar en una subrutina externa.
Nota: deben existirlos archivos acqparams.txt y dti_index.txt. Ver como hacer el index.txt y el acqparams.txt
El registro es ahora un poco mas sencillo
Los procedimientos individuales de registro si han de cambiarse poco, mas que nada el input, lo demas es estrictamente igual
[tester@detritus ptest]$ dti_reg.pl ptest [tester@detritus ptest]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 114225 cuda dti_reg_ tester PD 0:00 1 (Resources) 114226 cuda dti_reg_ tester PD 0:00 1 (Priority) 114227 cuda dti_reg_ tester PD 0:00 1 (Priority) 114228 cuda dti_reg_ tester PD 0:00 1 (Priority) 114229 cuda dti_reg_ tester PD 0:00 1 (Priority) 114230 cuda dti_reg_ tester PD 0:00 1 (Priority) 114231 devel dti_reg_ tester PD 0:00 1 (Dependency) 114223 cuda dti_reg_ tester R 0:05 1 brick01 114224 cuda dti_reg_ tester R 0:05 1 brick01 [tester@detritus ptest]$ ls working/0001_* working/0001_brain.nii.gz working/0001_dti_L1.nii.gz working/0001_dti_MO.nii.gz working/0001_dti_V3.nii.gz working/0001_mni_to_b0.nii.gz working/0001_dti_brain_mask.nii.gz working/0001_dti_L2.nii.gz working/0001_dti_S0.nii.gz working/0001_hifi_b0.nii.gz working/0001_t1_b0.nii.gz working/0001_dti_data.nii.gz working/0001_dti_L3.nii.gz working/0001_dti_V1.nii.gz working/0001_JHU_labels.nii.gz working/0001_t1_reoriented.nii.gz working/0001_dti_FA.nii.gz working/0001_dti_MD.nii.gz working/0001_dti_V2.nii.gz working/0001_JHU_tracts.nii.gz
Probando el -cut (que esta reescrito completo),
[tester@detritus ptest]$ cat repdti.txt 0004 [tester@detritus ptest]$ dti_reg.pl -cut repdti.txt ptest [tester@detritus ptest]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 114233 devel dti_reg_ tester PD 0:00 1 (Dependency) 114232 cuda dti_reg_ tester R 6:25:12 1 brick01
DTI metrics (Atlas)
[tester@detritus ptest]$ dti_metrics.pl -a1 ptest [tester@detritus ptest]$ dti_metrics.pl -a2 ptest [tester@detritus ptest]$ ls ptest_dti_* ptest_dti_labels.csv ptest_dti_labels_results.tgz ptest_dti_tracts.csv ptest_dti_tracts_results.tgz
TRACULA
La implementacion de Tracula en FS7.2 ha cambiado para pemitir la correcion por topup. Asi que hay que hacer un dmri.rc distinto. Entonces, ahora hay que correr 7 scripts,
- ctrac_dmri.pl –> Crear el dmri.rc
- ctrac_prep.pl –> Preprocesamiento DTI
- ctrac_bedp.pl –> bedtrack
- ctrac_path.pl –> probtrack
- ctrac_stat.pl –> Estadisticas globales
- ctrac_metrics.pl –> Metricas medias de los principales tractos
- ctrac_report.pl –> QC report
DTI metrics VOIs
Las metricas de DTI pueden extraerse en cualquiera de los tractos definidos, ya sea mediante atlas o a traves de TRACULA. Lo que ocurre es que en la realidad estos tractos son demasiado específicos. Es decir, no nos interesa la FA en el Genu of corpus callosum sino mas bien en el Corpus callosum en su totalidad. Hay dos enfoques validos para conseguir esto ultimo.
ICBM VOIs
Para calcular una mascara de los tractos completos (VOI) basta con tomar las mascaras de los trozos individuales y sumarlos todos juntos en una mscara binaria. Esta mascara es la que luego se aplicara a la imagen FA y se calculara el valor medio dentro.
Para esto necesitamos saber que trozos componen cada VOI. Esto lo voy a almacenar en un archivo de texto ya que no cambiara nunca. Ejemplo, para el atlas ICBM-DTI-81,
Corpus_callosum:3,4,5 Internal_capsule:17,18,19,20,21,22 Corona_radiata:23,24,25,26,27,28 Superior_longitudinal_fasciculus:41,42 Fornix:6,39,40 Cingulum:35,36,37,38 Uncinate_fasciculus:45,46
Este archivo lo he de leer y tomar cada archivo XXXX_JHU_labels individual y calcular ahi la porcion con la que he de fabricar la mascara. Luego se suman y se saca el valor deseado.
foreach my $subject (@dtis){ my $dti_fa = $w_dir.'/'.$subject.'_dti_FA.nii.gz'; my $dti_md = $w_dir.'/'.$subject.'_dti_MD.nii.gz'; if($subject && -e $dti_fa){ foreach my $rmask (sort keys %masks){ my @chunks = split /,/,$masks{$rmask}; my @orarg; foreach my $chunk (@chunks){ my $order = "fslmaths ".$w_dir."/".$subject."_JHU_".$lort{$atlas}." -uthr ".$chunk." -thr ".$chunk." -div ".$chunk." ".$w_dir."/.tmp_".$subject."/JHU_".$chunk."_tmp"; print "$order\n"; system($order); my $tmpstr = $w_dir."/.tmp_".$subject."/JHU_".$chunk."_tmp"; push @orarg, $tmpstr; } my $strarg = join " -add ", @orarg; my $order = "fslmaths ".$strarg." ".$w_dir."/.tmp_".$subject."/JHU_".$rmask."_tmp"; print "$order\n"; system($order); } print OF "$subject"; foreach my $rmask (sort keys %masks){ my $order = "fslstats ".$dti_fa." -k ".$w_dir."/.tmp_".$subject."/JHU_".$rmask."_tmp -M -S"; print "$order\n"; (my $mean, my $std) = map{/(\d+\.\d*)\s*(\d+\.\d*)/} qx/$order/; if($with_sd){ print OF ";$mean",";$std"; }else{ print OF ";$mean"; } $order = "fslstats ".$dti_md." -k ".$w_dir."/.tmp_".$subject."/JHU_".$rmask."_tmp -M -S"; print "$order\n"; ($mean, $std) = map{/(\d+\.\d*)\s*(\d+\.\d*)/} qx/$order/; if($with_sd){ print OF ";$mean",";$std"; }else{ print OF ";$mean"; } } print OF "\n"; } } close OF;
El codigo completo puede encontrarse en github y
para ejecutarlo basta con hacer,
$ dti_metrics_comp.pl project
o,
$ dti_metrics_comp.pl -a1 project
para hacerlo con el atlas JHU-WM-tractography (on development).
En el primer caso los resultados quedarian en el archivo bioface_dti_icbm_comp.csv,
[osotolongo@brick03 bioface]$ head bioface_dti_icbm_comp.csv Subject;Cingulum_FA;Cingulum_MD;Corona_radiata_FA;Corona_radiata_MD;Corpus_callosum_FA;Corpus_callosum_MD;Fornix_FA;Fornix_MD;Internal_capsule_FA;Internal_capsule_MD;Superior_longitudinal_fasciculus_FA;Superior_longitudinal_fasciculus_MD;Uncinate_fasciculus_FA;Uncinate_fasciculus_MD 0002;0.477487;0.000786;0.433740;0.000744;0.647378;0.000841;0.554593;0.000944;0.556976;0.000720;0.474224;0.000726;0.566348;0.000788 0003;0.494214;0.000800;0.439710;0.000787;0.616569;0.000850;0.577302;0.000925;0.560079;0.000730;0.425376;0.000787;0.431516;0.000902 0004;0.416937;0.000813;0.398660;0.000779;0.595173;0.000903;0.490137;0.001118;0.559346;0.000735;0.410975;0.000748;0.468427;0.000809 0005;0.427343;0.000794;0.404245;0.000765;0.591447;0.000888;0.460360;0.001119;0.563446;0.000757;0.426342;0.000773;0.510532;0.000755 0006;0.475403;0.000801;0.431013;0.000781;0.596390;0.000889;0.521160;0.001085;0.560720;0.000742;0.474176;0.000756;0.471718;0.000817 0007;0.474952;0.000768;0.460331;0.000757;0.575729;0.000977;0.407189;0.001516;0.581289;0.000731;0.465529;0.000735;0.521556;0.000757 0008;0.437555;0.000801;0.416142;0.000778;0.596577;0.000866;0.497081;0.001035;0.554840;0.000767;0.426218;0.000771;0.518556;0.000786 0009;0.442004;0.000812;0.431805;0.000747;0.630885;0.000814;0.499554;0.001055;0.539465;0.000748;0.470043;0.000736;0.537202;0.000756 0010;0.473434;0.000748;0.447876;0.000740;0.626619;0.000852;0.511838;0.001002;0.601466;0.000712;0.470705;0.000716;0.529629;0.000725
TRACULA VOIs
Los valores de FA y MD de los tractos completos tambien puede derivarse de TRACULA. En este caso no reconstruiremos el tracto como tal sino que tomaremos los valores de FA individuales y asumiremos que,
$$ {FA}_{VOI} \approx \frac{\sum{{FA}_{i}*V_{i}}}{\sum{V_{i}}} $$
donde ${FA}_{i}$ son los valores de FA y $V_{i}$ el volumen, de los tractos individuales, respectivamente.
Asi que primero tengo que tener almacenado en un fichero que variables forman cada VOI,
Fornix:lh.fx,rh.fx Cingulum:lh.cbd,lh.cbv,rh.cbd,rh.cbv Uncinate_fasciculus:lh.uf,rh.uf Superior_longitudinal_fasciculus:lh.slf1,lh.slf2,lh.slf3,rh.slf1,rh.slf2,rh.slf3 Inferior_longitudinal_fasciculus:lh.ilf,rh.ilf Corpus_callosum:cc.bodyc,cc.bodyp,cc.bodypf,cc.bodypm,cc.bodyt,cc.genu,cc.rostrum,cc.splenium
y esto lo leo directamente de los resultados de tracula para cada individuo. Podria leerlo de los achivos de FS pero lo que voy a hacer es,
- Cambiar el script de metricas de TRACULA para incluir el volumen de los tractos
- Asumir que he ejecutado las metrcas de TRACULA y leer directamente este archivo para calcular los resultados (mucho mas rapido)
El resultado de esto es el script en github que se ejecuta como,
[osotolongo@brick03 bioface]$ ctrac_translate.pl bioface
y deja los resultados en bioface_dti_tracula_composed.csv,
Subject,Cingulum_FA,Cingulum_MD,Corpus_callosum_FA,Corpus_callosum_MD,Fornix_FA,Fornix_MD,Inferior_longitudinal_fasciculus_FA,Inferior_longitudinal_fasciculus_MD,Superior_longitudinal_fasciculus_FA,Superior_longitudinal_fasciculus_MD,Uncinate_fasciculus_FA,Uncinate_fasciculus_MD 0001,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA 0002,0.500092918105356,0.000781457339530766,0.519852793601731,0.000781114487752106,0.466710179411765,0.00105999035294118,0.504764250681199,0.000813264,0.436700603806417,0.000742181515280044,0.468751002475248,0.000772750495874587 0003,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA 0004,0.471647589821662,0.000811000234449761,0.512361431638802,0.00081236424127981,0.386831987261146,0.000992012576433121,0.452685824742268,0.000871269313402062,0.417407322635963,0.00077327638510534,0.419668255865922,0.000848094241340782 0005,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA 0006,0.486058795640327,0.000798137305177112,0.52619407984211,0.000808463441643492,0.449970944306931,0.000960078674504951,0.496323946902655,0.000859897426548673,0.44573164370485,0.000777395058565531,0.463258846660395,0.000819830761994355 0007,0.476584601431981,0.000773005742243437,0.525463044190302,0.000778800766056725,0.308487,0.00163514,0.517803210059172,0.000801609260946746,0.451237894539822,0.00074905124422357,0.467696353195164,0.000769760035405872 0008,0.470472873369794,0.000793977488851493,0.501802720765106,0.000807642284451529,0.433634495232041,0.00100513844373808,0.461641992471769,0.000858071812630698,0.402474214795654,0.000775522433212623,0.442492631840796,0.00079464460199005 0009,0.513032479578393,0.000781708291172596,0.524635845259849,0.000773339304509904,0.437998623059867,0.00105553261640798,0.479583220908231,0.000831665455061495,0.447428453367876,0.00074106617074894,0.461369545135846,0.00078089697283085
Comparando ICBM vs TRACULA
DTI Tractography
La tractografia puede hacerse utilizando regiones definidas en la reconstruccion de FS o un atlas externo. En este caso el atlas externo escogido es el de la UofM.
Voy a simplificar un poco el procesamiento anterior porque hay muchas cosas que no se usan. En caso de necesitarlas ya se volveran a implementar.
Primero el bedpostx y el probtrackx.
- Los dos modos de procesamiento que hay implementados tienen identico resultado. Basta con dejar uno (el mas rapido o sencillo) y nos quitamos una variable de encima.
- Pasamos el registro de ANTS a la nueva sintaxis, ya que hemos cambiado el registro y las matrices son otras
Vamos a probar uno,
[tester@brick01 ptest]$ cat dti_track.seed 10 49 [tester@brick01 ptest]$ dti_bedtrack_cuda.sh ptest 0001 /nas/data/ptest/working Copying files Making bedpostx [Tue Dec 10 10:36:45 CET 2019] --------------------------------------------- ------------ BedpostX GPU Version ----------- --------------------------------------------- subjectdir is /nas/data/ptest/working/.tmp_0001/bedpostx Making bedpostx directory structure Copying files to bedpost directory Pre-processing stage Queuing parallel processing stage ----- Bedpostx Monitor ----- 1 parts processed out of 4 2 parts processed out of 4 3 parts processed out of 4 ..... ..... ..... Done loading samples. Volume seeds volume 1 volume 2 time spent tracking: 1708 seconds save results finished Done [Tue Dec 10 11:39:22 CET 2019] [tester@brick01 ptest]$ ls /nas/data/ptest/working/0001_probtrack_out/ fdt_paths.nii.gz probtrackx.log waytotal
Esto es eterno, asi que paciencia.
Ahora con el UofM,
[tester@brick01 ptest]$ dti_bedtrack_nodes.sh ptest 0001 /nas/data/ptest/working/ /nas/software/neuro_4_0/lib/uofm/Nodes/LN/ Copying files Making bedpostx [Tue Dec 10 15:53:58 CET 2019] --------------------------------------------- ------------ BedpostX GPU Version ----------- --------------------------------------------- subjectdir is /nas/data/ptest/working/.tmp_0001/bedpostx /nas/data/ptest/working/.tmp_0001/bedpostx has already been processed: /nas/data/ptest/working/.tmp_0001/bedpostx.bedpostX. Delete or rename /nas/data/ptest/working/.tmp_0001/bedpostx.bedpostX before repeating the process. So far, so good [Tue Dec 10 15:53:58 CET 2019] Getting nodes and making masks ..... ..... ..... Done loading samples. Volume seeds volume 1 volume 2 volume 3 volume 4 volume 5 volume 6 volume 7 time spent tracking: 3714 seconds save results finished Done [Tue Dec 10 17:03:25 CET 2019] [tester@brick01 ptest]$ ls /nas/data/ptest/working/0001_probtrack_out/ fdt_paths.nii.gz probtrackx.log waytotal
Nota: Ya tengo el bedpostx hecho asi que demorara menos, pero igual son varios nodos a registrar al DTI.
Parece que todo funciona asi que nos vamos al wrapper,
[tester@detritus ptest]$ dti_track.pl ptest [tester@detritus ptest]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 114236 cuda dti_trac tester PD 0:00 1 (Resources) 114237 cuda dti_trac tester PD 0:00 1 (Priority) 114238 cuda dti_trac tester PD 0:00 1 (Priority) 114239 cuda dti_trac tester PD 0:00 1 (Priority) 114240 cuda dti_trac tester PD 0:00 1 (Priority) 114241 devel dti_trac tester PD 0:00 1 (Dependency) 114234 cuda dti_trac tester R 0:03 1 brick01 114235 cuda dti_trac tester R 0:03 1 brick01
Importante: : Al terminar, mover los directorios al path correcto,ejemplo,
for x in `ls -d working/*_probtrack_out`; do mv $x `echo $x | sed 's/out/DMN/'`;done
ICA individual
El procedimiento para ICA de un sujeto fue descrito ampliamente usando el protocolo MOPEAD. Aqui hay que cambiar el input y alguna cosa mas,
Ahora a probarlo,
[tester@detritus ptest]$ rs_ica_one.pl ptest Collecting needed files sbatch /nas/data/ptest/working/0001_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114303 /nas/data/ptest/working/0001_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114304 /nas/data/ptest/working/0001_rs.ica/scripts/feat4.sh sbatch /nas/data/ptest/working/0002_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114306 /nas/data/ptest/working/0002_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114307 /nas/data/ptest/working/0002_rs.ica/scripts/feat4.sh sbatch /nas/data/ptest/working/0003_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114309 /nas/data/ptest/working/0003_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114310 /nas/data/ptest/working/0003_rs.ica/scripts/feat4.sh sbatch /nas/data/ptest/working/0004_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114312 /nas/data/ptest/working/0004_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114313 /nas/data/ptest/working/0004_rs.ica/scripts/feat4.sh sbatch /nas/data/ptest/working/0005_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114315 /nas/data/ptest/working/0005_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114316 /nas/data/ptest/working/0005_rs.ica/scripts/feat4.sh sbatch /nas/data/ptest/working/0006_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114318 /nas/data/ptest/working/0006_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114319 /nas/data/ptest/working/0006_rs.ica/scripts/feat4.sh sbatch /nas/data/ptest/working/0007_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114321 /nas/data/ptest/working/0007_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114322 /nas/data/ptest/working/0007_rs.ica/scripts/feat4.sh sbatch /nas/data/ptest/working/0008_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114324 /nas/data/ptest/working/0008_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114325 /nas/data/ptest/working/0008_rs.ica/scripts/feat4.sh Submitted batch job 114327 [tester@detritus ptest]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 114304 devel feat-pte tester PD 0:00 1 (Dependency) 114305 devel feat-pte tester PD 0:00 1 (Dependency) 114307 devel feat-pte tester PD 0:00 1 (Dependency) 114308 devel feat-pte tester PD 0:00 1 (Dependency) 114310 devel feat-pte tester PD 0:00 1 (Dependency) 114311 devel feat-pte tester PD 0:00 1 (Dependency) 114313 devel feat-pte tester PD 0:00 1 (Dependency) 114314 devel feat-pte tester PD 0:00 1 (Dependency) 114316 devel feat-pte tester PD 0:00 1 (Dependency) 114317 devel feat-pte tester PD 0:00 1 (Dependency) 114319 devel feat-pte tester PD 0:00 1 (Dependency) 114320 devel feat-pte tester PD 0:00 1 (Dependency) 114322 devel feat-pte tester PD 0:00 1 (Dependency) 114323 devel feat-pte tester PD 0:00 1 (Dependency) 114325 devel feat-pte tester PD 0:00 1 (Dependency) 114326 devel feat-pte tester PD 0:00 1 (Dependency) 114327 devel feat-pte tester PD 0:00 1 (Dependency) 114303 devel feat-pte tester R 0:16 1 brick01 114306 devel feat-pte tester R 0:13 1 brick01 114309 devel feat-pte tester R 0:13 1 brick01 114312 devel feat-pte tester R 0:10 1 brick01 114315 devel feat-pte tester R 0:07 1 brick01 114318 devel feat-pte tester R 0:07 1 brick01 114321 devel feat-pte tester R 0:04 1 brick01 114324 devel feat-pte tester R 0:01 1 brick01 [tester@detritus ptest]$ ls -d working/*rs.ica working/0001_rs.ica working/0002_rs.ica working/0003_rs.ica working/0004_rs.ica working/0005_rs.ica working/0006_rs.ica working/0007_rs.ica working/0008_rs.ica
so far so good
ICA grupal
Este procedimiento es mucho mas complicado pero por esa misma razon esta escrito mucho mas abstracto.
Asi que apenas hay que cambiar nada
[tester@detritus ptest]$ rs_ica_group.pl ptest Collecting needed files Counting available subjects Getting info from images Checking images and excluding wrong subjects Copying FSL files and setting directories Making global .fsf file Making individual .fsf files and scripts sbatch /nas/data/ptest/working/0001_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114328 /nas/data/ptest/working/0001_rs.ica/scripts/feat2.sh sbatch /nas/data/ptest/working/0002_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114330 /nas/data/ptest/working/0002_rs.ica/scripts/feat2.sh sbatch /nas/data/ptest/working/0003_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114332 /nas/data/ptest/working/0003_rs.ica/scripts/feat2.sh sbatch /nas/data/ptest/working/0004_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114334 /nas/data/ptest/working/0004_rs.ica/scripts/feat2.sh sbatch /nas/data/ptest/working/0005_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114336 /nas/data/ptest/working/0005_rs.ica/scripts/feat2.sh sbatch /nas/data/ptest/working/0006_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114338 /nas/data/ptest/working/0006_rs.ica/scripts/feat2.sh sbatch /nas/data/ptest/working/0007_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114340 /nas/data/ptest/working/0007_rs.ica/scripts/feat2.sh sbatch /nas/data/ptest/working/0008_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114342 /nas/data/ptest/working/0008_rs.ica/scripts/feat2.sh Making global script sbatch --depend=afterok:114329,114331,114333,114335,114337,114339,114341,114343 /nas/data/ptest/working/rs.gica/scripts/feat4_ica.sh Submitted batch job 114344 [tester@detritus ptest]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 114344 devel feat-pte tester PD 0:00 1 (Dependency) 114329 devel feat-pte tester R 0:05 1 brick02 114331 devel feat-pte tester R 0:11 1 brick01 114333 devel feat-pte tester R 0:11 1 brick01 114335 devel feat-pte tester R 0:05 1 brick01 114337 devel feat-pte tester R 0:05 1 brick02 114339 devel feat-pte tester R 0:05 1 brick01 114341 devel feat-pte tester R 0:05 1 brick02 114343 devel feat-pte tester R 0:05 1 brick01