User Tools

Site Tools


neuroimagen:pipe04

Pipeline de Procesamiento de FACE v0.4

Developer Guide (ver guia de usuario aqui)

Ahora mismo esta versión es la version de produccion. Puede haber todavia algun error en la ejecución pero al menos en MRI y PET-FBB ha sido ampliamente probada.

¿Porqué una nueva versión?

  • EL protocolo de envio de las imagenes MRI ha cambiado. EL software nuevo ha de cambiarse para adaptarse al nuevo protocolo. El algoritmo de conversion actual tiene demasiado peso en recursos.
  • BIDS: El procesamiento de fMRI que se ha puesto a punto requiere una estructura BIDS para funcionar. Ahora mismo hay que realizar la conversion dos veces para procesar el fMRI. Es mas barato hacerla una sola vez y adaptar el pipeline para que use el mismo input. Es más la transformación directa de DICOM a BIDS resulta menos dada al error y mas flexible, aunque requiera un analisis inicial para cada proyecto.
  • backwards compatibility: La necesidad de proporcionar compatibilidad a los procedimientos anteriores ha provocado que haya procedimientos que se hagan de manera muy compleja sin necesidad. Todos los dirty hacks y archivos de config extra necesitan limpiarse.
  • Nuevos proyectos: La inclusion masiva de nuevos proyectos trae la necesidad de intentar aumentar la velocidad de procesamiento. Eliminar una serie de arboles de decisiones y opciones no necesarias es indispensable para esto.
  • XNAT: Ha de buscarse la integracion del nuevo pipeline con la nueva plataforma XNAT en la medida de lo posible.
  • Se debe separa la DB del proyecto de la DB de procesamiento de neuroimagen. Esto es indispensable para los proyectos europeos. Ahora mismo se hace manualmente. Debe sistematizarse.

Dependencias

DB

El primer punto a considerar es la separacion correcta entre el software y los datos. Cada proyecto se caracteriza por,

  1. NAME: El nombre del proyecto
  2. SRC_PATH: La ruta donde se encuentran los archivos fuentes del proyecto (DICOMs)
  3. PROJ_PATH: La ruta donde se ejecuta el procesamiento, se guardan archivos intemedios y resultados.

Cada sujeto se caracteriza por,

  1. PID: identificador dentro del proyecto. Enlaza todos los datos del sujeto entre si.
  2. NID: identificador dentro del procesamiento de neuroimagen. Identifica los datos de cada sujeto dentro del proyecto.
  3. SUB_PATH: Identifica la ubicacion de los datos (DICOMs) dentro del proyecto. Puede ser mas de uno. MRI_PATH, PET_PATH. Si hay mas de una fecha (longitudinal) tambien debe distinguirse.

Teniendo esto en cuenta podemos abstraer dos procedimientos,

  1. make_proj.pl → creacion del proyecto
  2. update_mri_db.pl → creacion y actualizacion de la DB del proyecto.
  3. update_pet_db.pl → actualizacion de la DB del proyecto para PET.

Bien organizado, la creacion del proyecto queda reducida a un script simple,

El manejo de la base de datos es algo mas complicado pero no demasiado

Testing

[tester@detritus ~]$ mkdir /nas/data/ptest
[tester@detritus ~]$ mkdir -p ~/.config/neuro
[tester@detritus ~]$ make_proj.pl ptest /nas/tester/testproj
[tester@detritus ~]$ tree /nas/data/ptest/
/nas/data/ptest/
├── bids
└── working
 
2 directories, 0 files
[tester@detritus ~]$ cat ~/.config/neuro/ptest.cfg 
DATA = /nas/data/ptest
SRC = /nas/tester/testproj
WORKING = /nas/data/ptest/working
BIDS = /nas/data/ptest/bids
[tester@detritus ~]$ update_mri_db.pl ptest
[tester@detritus ~]$ cat /nas/data/ptest/ids.csv
032-00001-SCR-GLOBAL,1
032-00002-SCR-GLOBAL,2
032-00003-SCR,3
032-00004-SCR,4
032-00005-SCR-GLOBAL,5
032-00007-SCR-GLOBAL,6
032-00008-SCR,7
032-00009,8
[tester@detritus ~]$ cat /nas/data/ptest/ptest_mri.csv
0001;032-00001-SCR-GLOBAL
0002;032-00002-SCR-GLOBAL
0003;032-00003-SCR
0004;032-00004-SCR
0005;032-00005-SCR-GLOBAL
0006;032-00007-SCR-GLOBAL
0007;032-00008-SCR
0008;032-00009

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/

Ejemplo

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/";

Freesurfer

Con la estructura BIDS esahora mas sencillo encontrar los archivos source para Freesurfer ya que tienen un sitio fijo. Basicamente lo unico necesario es el nombre del proyecto, revisar si existen los archivos y ejecutar recon-all. Nos podemos saltar el paso de conversion entre estructuras de datos.

En conjunto queda un arbol de decisiones mas simple

[tester@detritus ptest]$ precon.pl ptest
Submitted batch job 114192
Submitted batch job 114193
Submitted batch job 114194
Submitted batch job 114195
Submitted batch job 114196
Submitted batch job 114197
Submitted batch job 114198
Submitted batch job 114199
[tester@detritus ptest]$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
            114199     devel fs_recon   tester PD       0:00      1 (Dependency)
            114192      fast fs_recon   tester  R       0:03      1 brick01
            114193      fast fs_recon   tester  R       0:03      1 brick01
            114194      fast fs_recon   tester  R       0:03      1 brick01
            114195      fast fs_recon   tester  R       0:00      1 brick01
            114196      fast fs_recon   tester  R       0:00      1 brick01
            114197      fast fs_recon   tester  R       0:00      1 brick01
            114198      fast fs_recon   tester  R       0:00      1 brick01

metricas

Voy a reescribir todo elprocedimiento de sacar las metricas de la reconstruccion usando herramientas propias de freesurfer para estar seguro de no comenter ningun error.

Ver:

Probemos algo,

[tester@detritus ptest]$ awk -F";" {'print "ptest_"$1'} ptest_mri.csv | sed ':a;N;$!ba;s/\n/ /g'
ptest_0001 ptest_0002 ptest_0003 ptest_0004 ptest_0005 ptest_0006 ptest_0007 ptest_0008
[tester@detritus ptest]$ asegstats2table --subjects `awk -F";" {'print "ptest_"$1'} ptest_mri.csv | sed ':a;N;$!ba;s/\n/ /g'` --meas volume --skip --statsfile wmparc.stats --all-segs --tablefile
 wmparc_stats.txt
SUBJECTS_DIR : /nas/data/subjects
Parsing the .stats files 
Skipping /nas/data/subjects/ptest_0006/stats/wmparc.stats
Building the table..
Writing the table to wmparc_stats.txt
[tester@detritus ptest]$ cat wmparc_stats.txt | sed 's/\t/;/g; s/ptest_//; s/Measure:volume;/Subject;/'
Subject;wm-lh-bankssts;wm-lh-caudalanteriorcingulate;wm-lh-caudalmiddlefrontal;wm-lh-cuneus;wm-lh-entorhinal;wm-lh-fusiform;wm-lh-inferiorparietal;wm-lh-inferiortemporal;wm-lh-isthmuscingulate;wm-lh-lateraloccipital;wm-lh-lateralorbitofrontal;wm-lh-lingual;wm-lh-medialorbitofrontal;wm-lh-middletemporal;wm-lh-parahippocampal;wm-lh-paracentral;wm-lh-parsopercularis;wm-lh-parsorbitalis;wm-lh-parstriangularis;wm-lh-pericalcarine;wm-lh-postcentral;wm-lh-posteriorcingulate;wm-lh-precentral;wm-lh-precuneus;wm-lh-rostralanteriorcingulate;wm-lh-rostralmiddlefrontal;wm-lh-superiorfrontal;wm-lh-superiorparietal;wm-lh-superiortemporal;wm-lh-supramarginal;wm-lh-frontalpole;wm-lh-temporalpole;wm-lh-transversetemporal;wm-lh-insula;wm-rh-bankssts;wm-rh-caudalanteriorcingulate;wm-rh-caudalmiddlefrontal;wm-rh-cuneus;wm-rh-entorhinal;wm-rh-fusiform;wm-rh-inferiorparietal;wm-rh-inferiortemporal;wm-rh-isthmuscingulate;wm-rh-lateraloccipital;wm-rh-lateralorbitofrontal;wm-rh-lingual;wm-rh-medialorbitofrontal;wm-rh-middletemporal;wm-rh-parahippocampal;wm-rh-paracentral;wm-rh-parsopercularis;wm-rh-parsorbitalis;wm-rh-parstriangularis;wm-rh-pericalcarine;wm-rh-postcentral;wm-rh-posteriorcingulate;wm-rh-precentral;wm-rh-precuneus;wm-rh-rostralanteriorcingulate;wm-rh-rostralmiddlefrontal;wm-rh-superiorfrontal;wm-rh-superiorparietal;wm-rh-superiortemporal;wm-rh-supramarginal;wm-rh-frontalpole;wm-rh-temporalpole;wm-rh-transversetemporal;wm-rh-insula;Left-UnsegmentedWhiteMatter;Right-UnsegmentedWhiteMatter;lhCerebralWhiteMatterVol;rhCerebralWhiteMatterVol;CerebralWhiteMatterVol;MaskVol;EstimatedTotalIntraCranialVol
0001;1445.0;3090.4;8445.1;3240.7;105.8;5930.3;9589.6;6034.9;3807.4;10632.2;7984.6;5642.6;3733.9;5366.9;769.9;2898.3;4587.3;1159.0;3833.9;4440.2;10086.4;8924.8;14569.2;8739.2;3333.7;12201.7;20058.9;14698.8;8873.3;9864.0;491.3;632.0;1135.2;12709.5;1410.8;1703.8;5688.7;3535.8;1136.2;6038.9;12115.1;5516.1;4699.2;11715.4;7252.2;8899.5;4445.6;6506.5;2672.3;5810.4;5410.2;1443.5;3624.9;3609.5;12154.0;3348.6;17544.5;10387.8;1163.1;13306.1;17967.1;13972.7;8841.9;8461.0;426.5;727.0;1858.5;10530.6;33907.6;36176.8;249971.759032;257778.302002;507750.061034;1773057.0;1694425.92138
0002;1771.2;2329.2;4950.5;2430.3;121.6;5027.0;8436.6;5020.1;3298.2;8711.6;5720.7;5251.7;2341.0;3575.6;737.2;2176.9;2764.1;736.2;3572.1;3575.6;8389.1;5957.7;8989.1;8606.5;2154.6;9906.0;13661.9;9497.3;5871.7;5846.9;358.9;636.0;614.8;9369.7;1705.7;1174.8;4428.1;3414.5;695.6;4447.3;9360.0;3023.8;4104.6;8854.5;5386.3;6926.3;3025.3;5397.3;1948.1;3870.5;2071.2;1124.7;3134.9;3408.9;7772.5;2614.8;9769.8;9630.1;1007.2;9158.1;12605.7;11640.5;6170.6;5801.7;284.3;414.3;1760.9;7291.6;20802.4;21178.3;182960.37874;183990.426404;366950.805144;1340584.0;1278644.19804
0003;2508.4;1938.6;4599.4;2458.2;394.6;4789.9;7752.2;6259.7;3410.2;8533.3;5302.1;4342.9;2593.0;4702.9;596.1;2313.7;2516.3;703.7;2571.2;3547.0;7177.1;7110.2;10842.9;6582.9;2306.7;8582.6;15692.5;10421.0;6520.7;5864.1;463.0;540.9;764.7;9535.8;1811.0;1572.4;4115.4;2717.1;868.7;5769.7;6798.9;4170.4;3483.1;9828.2;5557.5;6415.2;2764.1;5609.8;2557.2;4518.7;2985.0;1088.8;1812.5;2481.5;8882.4;3091.6;11188.4;8087.3;1021.3;8686.6;13614.4;10831.9;6881.3;6177.8;245.1;694.9;1377.5;6787.2;28264.7;28236.2;192935.499217;193112.147687;386047.646904;1243899.0;1220440.16153
0004;2741.7;3355.9;6024.7;2980.3;546.8;5856.1;13892.7;8253.1;3878.2;8971.9;8007.2;4930.9;3306.8;6785.3;714.8;4196.3;3876.9;1059.7;3396.2;3681.4;9615.8;9324.7;13131.1;10161.8;2765.2;12831.0;20639.6;13375.5;8666.0;11323.7;401.5;779.8;1180.7;12078.3;2427.3;1314.9;5575.9;2822.8;1272.4;8192.9;14995.1;5973.4;4065.6;10173.3;7667.9;8033.2;3888.0;7969.1;2655.2;7833.5;4774.8;1696.7;4566.0;2980.8;9951.0;3205.7;13119.7;13032.7;1396.1;12951.0;18558.6;13566.9;10421.2;8003.8;414.8;707.8;2109.6;10318.3;32209.1;33318.0;253464.880694;259690.742703;513155.623396;1722362.0;1710215.1488
0005;2700.9;2721.6;5626.1;2161.9;226.1;5383.7;10324.9;6917.0;3968.4;6658.5;6705.2;4096.3;3001.2;5992.8;681.4;3044.0;3222.2;807.3;3350.6;2504.6;8509.6;6116.7;10313.5;8123.2;2911.2;11526.2;16675.0;11947.7;7491.5;7526.4;516.7;739.9;741.3;10219.8;1945.3;1728.9;4617.7;2893.5;1050.2;5625.4;9789.9;5454.7;4308.0;8211.1;7122.3;6502.4;3608.4;6859.5;3105.8;5201.1;3795.3;1212.6;2980.5;2476.7;7588.2;3375.1;11040.0;9890.6;1598.8;10779.8;15549.4;9230.5;7119.4;8097.7;264.1;680.7;1555.8;7718.2;26452.4;27351.5;210873.755632;210771.794749;421645.55038;1516041.0;1344553.00626
0007;1705.0;3360.9;6095.9;3846.3;221.8;7375.8;9764.7;6152.2;2924.6;8951.5;6968.3;5247.6;3264.0;5404.7;792.1;3649.2;3398.3;887.6;4148.5;4475.5;9452.0;7114.2;13829.4;7185.6;2643.0;12398.6;18606.6;11260.1;7987.7;7243.1;430.0;581.9;1054.0;11985.0;1269.1;2059.9;5919.2;2931.9;1082.9;5138.1;10617.7;5367.3;4883.6;10973.4;7566.1;8497.8;3553.0;6648.7;3568.3;6175.5;2942.8;1648.4;3305.5;3559.0;9895.2;2708.3;14095.6;9034.7;1623.1;10785.3;17285.3;9370.4;8923.1;7454.5;357.8;1025.2;1890.6;8870.0;30440.5;29746.0;230554.825524;229588.08915;460142.914674;1563202.0;1461099.44322
0008;1992.4;2193.7;4241.7;3812.5;210.7;4716.9;8945.2;5460.0;2879.7;8101.5;5113.5;4202.1;2453.9;4912.9;732.1;2461.1;2472.4;527.5;2485.3;2758.8;6231.5;5871.0;10516.2;6217.8;2107.4;8531.1;13189.1;8107.5;5743.0;6245.7;394.0;502.7;681.3;8280.7;1310.9;1452.2;3370.6;2006.7;791.2;4267.2;7213.2;2622.9;3359.6;8134.8;4353.3;5755.7;2451.9;3965.7;2341.1;3954.0;3741.9;837.8;2139.0;2197.1;8571.6;1518.4;10632.7;8876.2;826.0;7125.8;10678.5;7869.3;6596.6;4689.8;270.1;643.2;1339.3;6521.5;21399.2;18966.9;173417.812499;158479.487927;331897.300426;1280852.0;1307213.55521

Si, mas o menos eso es lo que quiero. Ahora hay que pensarlo para todos los archivos y despues bastara hacer un join.

Pero por ahora voy a dejar el report en solo algunos archivos, los voy a meter en un directorio y me envio todo por email.

Nota: la definicion de los valores a extraer se carga desde un modulo. En caso de desear otras metricas solo hay que editar estas variables en FSMetrics.

El call,

[tester@detritus ptest]$ fs_metrics.pl ptest
SUBJECTS_DIR : /nas/data/subjects
Parsing the .stats files 
Building the table..
Writing the table to /nas/data/ptest/fsrecon/aparc_area_lh.txt
SUBJECTS_DIR : /nas/data/subjects
Parsing the .stats files 
Building the table..
Writing the table to /nas/data/ptest/fsrecon/aparc_area_rh.txt
SUBJECTS_DIR : /nas/data/subjects
Parsing the .stats files 
Building the table..
Writing the table to /nas/data/ptest/fsrecon/aparc_thickness_lh.txt
SUBJECTS_DIR : /nas/data/subjects
Parsing the .stats files 
Building the table..
Writing the table to /nas/data/ptest/fsrecon/aparc_thickness_rh.txt
SUBJECTS_DIR : /nas/data/subjects
Parsing the .stats files
Building the table..
Writing the table to /nas/data/ptest/fsrecon/aparc_volume_lh.txt
SUBJECTS_DIR : /nas/data/subjects
Parsing the .stats files
Building the table..
Writing the table to /nas/data/ptest/fsrecon/aparc_volume_rh.txt
SUBJECTS_DIR : /nas/data/subjects
Parsing the .stats files
Building the table..
Writing the table to /nas/data/ptest/fsrecon/aseg_stats.txt
SUBJECTS_DIR : /nas/data/subjects
Parsing the .stats files
Building the table..
Writing the table to /nas/data/ptest/fsrecon/wmparc_stats.txt
tar: Removing leading `/' from member names

Los resultados,

[tester@detritus ptest]$ ls fsrecon/
aparc_area_lh.csv  aparc_area_rh.csv  aparc_thickness_lh.csv  aparc_thickness_rh.csv  aparc_volume_lh.csv  aparc_volume_rh.csv  aseg_stats.csv  wmparc_stats.csv
aparc_area_lh.txt  aparc_area_rh.txt  aparc_thickness_lh.txt  aparc_thickness_rh.txt  aparc_volume_lh.txt  aparc_volume_rh.txt  aseg_stats.txt  wmparc_stats.txt
[tester@detritus ptest]$ cat fsrecon/aparc_area_lh.csv
Subject,lh_bankssts_area,lh_caudalanteriorcingulate_area,lh_caudalmiddlefrontal_area,lh_cuneus_area,lh_entorhinal_area,lh_fusiform_area,lh_inferiorparietal_area,lh_inferiortemporal_area,lh_isthmuscingulate_area,lh_lateraloccipital_area,lh_lateralorbitofrontal_area,lh_lingual_area,lh_medialorbitofrontal_area,lh_middletemporal_area,lh_parahippocampal_area,lh_paracentral_area,lh_parsopercularis_area,lh_parsorbitalis_area,lh_parstriangularis_area,lh_pericalcarine_area,lh_postcentral_area,lh_posteriorcingulate_area,lh_precentral_area,lh_precuneus_area,lh_rostralanteriorcingulate_area,lh_rostralmiddlefrontal_area,lh_superiorfrontal_area,lh_superiorparietal_area,lh_superiortemporal_area,lh_supramarginal_area,lh_frontalpole_area,lh_temporalpole_area,lh_transversetemporal_area,lh_insula_area,lh_WhiteSurfArea_area,BrainSegVolNotVent,eTIV
0001,645.0,891.0,2743.0,1399.0,84.0,2909.0,4444.0,3036.0,890.0,6046.0,3033.0,3141.0,2171.0,3451.0,312.0,1206.0,1770.0,875.0,1288.0,1583.0,4429.0,1773.0,5236.0,3821.0,973.0,5013.0,7770.0,6202.0,4694.0,4267.0,256.0,385.0,646.0,3788.0,91169.5,1175453.0,1694425.92138
0002,831.0,591.0,1886.0,1258.0,76.0,2559.0,3718.0,2606.0,754.0,5127.0,2558.0,3065.0,1494.0,2624.0,282.0,1094.0,1246.0,607.0,1291.0,1442.0,3863.0,1321.0,3654.0,3811.0,880.0,4464.0,5787.0,4533.0,3479.0,2800.0,245.0,449.0,446.0,2814.0,73657.3,934832.0,1278644.19804
0003,847.0,523.0,1542.0,1013.0,215.0,2046.0,3437.0,2544.0,755.0,4486.0,2040.0,2343.0,1403.0,2622.0,223.0,1019.0,1066.0,510.0,869.0,1086.0,3228.0,1349.0,3731.0,2798.0,601.0,3645.0,5977.0,4424.0,3231.0,2651.0,232.0,373.0,418.0,2619.0,65862.9,927070.0,1220440.16153
0004,1130.0,767.0,2112.0,1218.0,272.0,2937.0,5514.0,3682.0,950.0,4921.0,3036.0,2829.0,1841.0,3765.0,264.0,1758.0,1634.0,768.0,1167.0,1132.0,4138.0,1823.0,4701.0,4284.0,1028.0,5444.0,8349.0,5872.0,4738.0,4916.0,283.0,518.0,677.0,3366.0,91832.4,1177364.0,1710215.1488
0005,1283.0,661.0,1938.0,999.0,138.0,2548.0,4110.0,3606.0,842.0,4060.0,2926.0,2340.0,1839.0,3668.0,257.0,1371.0,1388.0,633.0,1208.0,932.0,3903.0,1315.0,3816.0,3639.0,854.0,5073.0,6987.0,5568.0,4074.0,3625.0,272.0,513.0,490.0,3042.0,79912.8,1074622.0,1344553.00626
0006,1169.0,738.0,1740.0,1221.0,150.0,2691.0,4684.0,3303.0,1118.0,4594.0,2801.0,2613.0,1713.0,3303.0,265.0,1420.0,1405.0,574.0,1242.0,1301.0,3546.0,1478.0,4411.0,3840.0,829.0,4594.0,6373.0,5146.0,4117.0,3938.0,154.0,485.0,536.0,3515.0,81009.3,1102036.0,1574763.38424
0007,976.0,767.0,1905.0,1546.0,131.0,3053.0,4096.0,3155.0,672.0,4934.0,2635.0,2873.0,1815.0,3367.0,307.0,1525.0,1401.0,604.0,1252.0,1599.0,4126.0,1332.0,4943.0,3342.0,906.0,5332.0,7045.0,5006.0,4378.0,3436.0,275.0,366.0,616.0,3701.0,83414.9,1092034.0,1461099.44322
0008,658.0,540.0,1420.0,1386.0,113.0,2201.0,3843.0,2661.0,629.0,4276.0,2160.0,2306.0,1360.0,2562.0,257.0,1159.0,1064.0,412.0,888.0,986.0,3060.0,1183.0,3816.0,2668.0,745.0,3390.0,5329.0,3831.0,2972.0,2843.0,192.0,362.0,390.0,2396.0,64057.6,828521.0,1307213.55521

QC

Seguir este protocolo: http://enigma.ini.usc.edu/protocols/imaging-protocols/

De momento no voy a generalizarlo porque esto esta en pruebas. Voy a probarlo con FACEHBI.

Paso 0: Preparando

$ mkdir /nas/data/facehbi/qc
$ cd /nas/data/facehbi/qc
$ wget http://enigma.ini.usc.edu/wp-content/uploads/CORTEX/extract.sh
$ wget http://enigma.ini.usc.edu/wp-content/uploads/CORTEX/outliers.R
$ wget http://enigma.ini.usc.edu/wp-content/uploads/2018/06/ENIGMA_Cortical_QC_2.0.tar.gz
$ wget http://enigma.ini.usc.edu/wp-content/uploads/CORTEX/fsqc.sh
$ tar xzvf ENIGMA_Cortical_QC_2.0.tar.gz

Paso 1: extraccion de metricas.

No tiene dificultad. Edito el script extract.sh

for subj_id in $(ls -d /nas/data/subjects/facehbi_* | grep -v smc); do #may need to change this so that it selects subjects with FS output

lo ejecuto y obtengo los resultados,

[osotolongo@detritus qc]$ ls *.csv
CorticalMeasuresENIGMA_SurfAvg.csv  CorticalMeasuresENIGMA_ThickAvg.csv

Paso 2: outliers

[osotolongo@detritus qc]$ R --no-save --slave  < outliers.R > outliers.log
[osotolongo@detritus qc]$ cat outliers.log
Please check the following subjects closely using the QC methods provided in Step 2 of the cortical protocols.
Subject /nas/data/subjects/facehbi_0003 has THICKNESS values too HIGH for the following structures: L_caudalmiddlefrontal_thickavg
 Subject /nas/data/subjects/facehbi_0003 has THICKNESS values too HIGH for the following structures: L_precentral_thickavg
Subject /nas/data/subjects/facehbi_0005 has THICKNESS values too HIGH for the following structures: R_parsorbitalis_thickavg
 Subject /nas/data/subjects/facehbi_0005 has THICKNESS values too HIGH for the following structures: R_frontalpole_thickavg
Subject /nas/data/subjects/facehbi_0009 has THICKNESS values too LOW for the following structures: R_temporalpole_thickavg
Subject /nas/data/subjects/facehbi_0012 has THICKNESS values too LOW for the following structures: L_caudalmiddlefrontal_thickavg
 Subject /nas/data/subjects/facehbi_0012 has THICKNESS values too LOW for the following structures: L_parsopercularis_thickavg
 Subject /nas/data/subjects/facehbi_0012 has THICKNESS values too LOW for the following structures: L_parstriangularis_thickavg
 Subject /nas/data/subjects/facehbi_0012 has THICKNESS values too LOW for the following structures: L_precentral_thickavg
 Subject /nas/data/subjects/facehbi_0012 has THICKNESS values too LOW for the following structures: L_precuneus_thickavg
 Subject /nas/data/subjects/facehbi_0012 has THICKNESS values too LOW for the following structures: L_rostralmiddlefrontal_thickavg
 Subject /nas/data/subjects/facehbi_0012 has THICKNESS values too LOW for the following structures: L_superiorfrontal_thickavg
 Subject /nas/data/subjects/facehbi_0012 has THICKNESS values too LOW for the following structures: L_superiortemporal_thickavg
 Subject /nas/data/subjects/facehbi_0012 has THICKNESS values too LOW for the following structures: L_supramarginal_thickavg
.....

Devuelve los sujetos que han de chequearse.

Paso 3: QC Internal Surface Method

Requiere MATLAB y el Image Processing Toolbox. Ha de hacerse en brick03. Me edito este script. Abro Matlab desde el directorio qc y lo llamo directamente.


Nota: en caso de error hacer :

>> restoredefaultpath 
>> rehash toolboxcache

y claro, a esperar.

Una vez que ha terminado esto (hay que irlo mirando porque no avisa de nada), hay que hacer la pagina web para poder mirar las figuras.

[osotolongo@detritus qc]$ cd ENIGMA_Cortical_QC_2.0
[osotolongo@detritus ENIGMA_Cortical_QC_2.0]$ ./make_ENIGMA_QC_webpage.sh /nas/data/facehbi/qc/mout/

Esto hace una pagina (ENIGMA_Cortical_QC.html) que muestra todos las imagenes de los cortes que se han hecho.

$ firefox /nas/data/facehbi/qc/mout/ENIGMA_Cortical_QC.html

Paso 4: QC External Surface Method

Edito fsqc.sh,

#for sub in $(ls ${SUBJECTS_DIR});
for sub in $(ls -d /nas/data/subjects/facehbi_* | grep -v smc | awk -F"/" {'print $5'});

Requiere entorno grafico. Entro en brick03 por VNC. Como conectar a VNC por tunel SSH.

$ mkdir /nas/data/facehbi/qc/fsqcdir
$ cd /nas/data/facehbi/qc/fsqcdir
$ source /nas/data/facehbi/qc/fsqc.sh

y espero un rato (que son 200 pollos),

Y ahora necesitamos un browser que lea TIFF m( . O a lo mejor no! 8-)

[osotolongo@detritus fsqcdir]$ for x in *hr.tif; do convert ${x} ${x%.tif}.png; done
[osotolongo@detritus fsqcdir]$ mv index.html index_tif.html
[osotolongo@detritus fsqcdir]$ sed 's/\.lr\.tif/\.hr\.png/g' index_tif.html > index.html
[osotolongo@detritus fsqcdir]$ chmod a+r *

TADA

TADA!

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 :ALERT:


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

con epi_reg

[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 registro, QC

El QC no cambia

[tester@detritus ptest]$ make_dti_report.pl ptest

DTI metrics (Atlas)

Esto tampoco cambia demasiado, pero se aprovechan las subs nuevas y se simplifica la ubicacion de los archivos

[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

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

Queda bastante sencillo ahora

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. bedtrack_hippocampus

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.

bedtrack_LN

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

DTI metrics (tractography)

ahora toca sacar los valores de FA y MD en los tractos calculados. LA parte buena aqui es que ya no hay que hacer QC. El registro es el mismo del preprocesamiento.

Asi que vamos directo a sacar las metricas

El nombre del script ha cambiado ahora a dti_metrics_tracks.pl. El threshold por defecto sigue siendo el 25%.

Lo primero es tomar los resultados de probtrackx y moverlos a un path con otro nombre,

[tester@detritus ptest]$ for x in `ls -d working/*_probtrack_out`; do mv $x `echo $x | sed 's/out/fs_hippo/'`;done
[tester@detritus ptest]$ ls -d working/*_probtrack*
working/0001_probtrack_fs_hippo  working/0003_probtrack_fs_hippo  working/0006_probtrack_fs_hippo  working/0008_probtrack_fs_hippo
working/0002_probtrack_fs_hippo  working/0005_probtrack_fs_hippo  working/0007_probtrack_fs_hippo

Ahora a sacar las metricas,

[tester@detritus ptest]$ dti_metrics_tracks.pl -path fs_hippo ptest
Collecting needed files
/nas/software/neuro_4_0/bin/track2mask.sh /nas/data/ptest/working/0001_probtrack_fs_hippo/fdt_paths.nii.gz 0.25
fslstats /nas/data/ptest/working/0001_dti_FA.nii.gz -k /nas/data/ptest/working/0001_probtrack_fs_hippo/fdt_paths_mask.nii.gz -M -S
fslstats /nas/data/ptest/working/0001_dti_MD.nii.gz -k /nas/data/ptest/working/0001_probtrack_fs_hippo/fdt_paths_mask.nii.gz -M -S
/nas/software/neuro_4_0/bin/track2mask.sh /nas/data/ptest/working/0002_probtrack_fs_hippo/fdt_paths.nii.gz 0.25
fslstats /nas/data/ptest/working/0002_dti_FA.nii.gz -k /nas/data/ptest/working/0002_probtrack_fs_hippo/fdt_paths_mask.nii.gz -M -S
fslstats /nas/data/ptest/working/0002_dti_MD.nii.gz -k /nas/data/ptest/working/0002_probtrack_fs_hippo/fdt_paths_mask.nii.gz -M -S
/nas/software/neuro_4_0/bin/track2mask.sh /nas/data/ptest/working/0003_probtrack_fs_hippo/fdt_paths.nii.gz 0.25
fslstats /nas/data/ptest/working/0003_dti_FA.nii.gz -k /nas/data/ptest/working/0003_probtrack_fs_hippo/fdt_paths_mask.nii.gz -M -S
fslstats /nas/data/ptest/working/0003_dti_MD.nii.gz -k /nas/data/ptest/working/0003_probtrack_fs_hippo/fdt_paths_mask.nii.gz -M -S
/nas/software/neuro_4_0/bin/track2mask.sh /nas/data/ptest/working/0005_probtrack_fs_hippo/fdt_paths.nii.gz 0.25
fslstats /nas/data/ptest/working/0005_dti_FA.nii.gz -k /nas/data/ptest/working/0005_probtrack_fs_hippo/fdt_paths_mask.nii.gz -M -S
fslstats /nas/data/ptest/working/0005_dti_MD.nii.gz -k /nas/data/ptest/working/0005_probtrack_fs_hippo/fdt_paths_mask.nii.gz -M -S
/nas/software/neuro_4_0/bin/track2mask.sh /nas/data/ptest/working/0006_probtrack_fs_hippo/fdt_paths.nii.gz 0.25
fslstats /nas/data/ptest/working/0006_dti_FA.nii.gz -k /nas/data/ptest/working/0006_probtrack_fs_hippo/fdt_paths_mask.nii.gz -M -S
fslstats /nas/data/ptest/working/0006_dti_MD.nii.gz -k /nas/data/ptest/working/0006_probtrack_fs_hippo/fdt_paths_mask.nii.gz -M -S
/nas/software/neuro_4_0/bin/track2mask.sh /nas/data/ptest/working/0007_probtrack_fs_hippo/fdt_paths.nii.gz 0.25
fslstats /nas/data/ptest/working/0007_dti_FA.nii.gz -k /nas/data/ptest/working/0007_probtrack_fs_hippo/fdt_paths_mask.nii.gz -M -S
fslstats /nas/data/ptest/working/0007_dti_MD.nii.gz -k /nas/data/ptest/working/0007_probtrack_fs_hippo/fdt_paths_mask.nii.gz -M -S
/nas/software/neuro_4_0/bin/track2mask.sh /nas/data/ptest/working/0008_probtrack_fs_hippo/fdt_paths.nii.gz 0.25
fslstats /nas/data/ptest/working/0008_dti_FA.nii.gz -k /nas/data/ptest/working/0008_probtrack_fs_hippo/fdt_paths_mask.nii.gz -M -S
fslstats /nas/data/ptest/working/0008_dti_MD.nii.gz -k /nas/data/ptest/working/0008_probtrack_fs_hippo/fdt_paths_mask.nii.gz -M -S
tar: Removing leading `/' from member names
tester@detritus ptest]$ cat ptest_dti_fs_hippo.csv
Subject;fs_hippo_FA;fs_hippo_MD
0001;0.420759;0.000997
0002;0.439835;0.000897
0003;0.418651;0.000884
0005;0.436677;0.000838
0006;0.452380;0.000893
0007;0.405995;0.000916
0008;0.394436;0.000999

TRACULA

Tracula es una herramienta para la reconstruccion de los principales tractos de materia blanca incluida dentro de Freesurfer 6.0. Lo que se ha hecho es implementar esta herramienta dentro del cluster de FACE.

Nota: El preprocesamiento es tipicamente el incluido en la version 5.1 de FSL. El procesamiento actual de FSL(6.0) es bastante mas extensivo pero quiza no necesario si se utilizan las herramientas de FS para el registro y la correcion de movimiento. En cualquier caso es una herramienta que proporciona resultados para comparar y/o corregir las observaciones hechas con FSL en nuestro pipeline.

Hay una pagina aparte para esto: TRACULA, integrando en el cluster

Basicamente se corren 6 scripts, en orden,

  • /opt/neuro.dev/bin/ctrac_prep.pl –> Preprocesamiento DTI
  • /opt/neuro.dev/bin/ctrac_bedp.pl –> bedtrack
  • /opt/neuro.dev/bin/ctrac_path.pl –> probtrack
  • /opt/neuro.dev/bin/ctrac_stat.pl –> Estadisticas globales
  • /opt/neuro.dev/bin/ctrac_metrics.pl –> Metricas medias de los principales tractos
  • /opt/neuro.dev/bin/ctrac_report.pl –> QC report

Cada script ha de ejecutarse, esperar aque termine y seguir con el proximo. El procesamiento total son algunos dias para un proyecto grande por lo que habra que programarlo cuidadosamente.

QC

Quiero una forma rapida de ver si el registro ha quedado bien.

Incorrecto Correcto

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,

Todo muy basico

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 :-P

ica_rs_0001

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

fmriprep

Las pruebas con fmriprep estan resumidas en un pagina separada. Lo unico que se ha de hacer es escribir y probar el wrapper. Pero como siempre hay problemas de permisos se ha de hacer alguna prueba,

[tester@brick02 ~]$ srun docker run --rm -v /nas/usr/local/opt/freesurfer/.license:/opt/freesurfer/license.txt:ro -v /nas/data/ptest/bids:/data:ro -v /nas/data/ptest/fmriprep_nofs_out:/out poldracklab/fmriprep:1.5.0 /data /out participant --participant-label 0001 --ignore slicetiming --skip_bids_validation --fs-no-reconall
srun: job 114254 queued and waiting for resources
srun: job 114254 has been allocated resources
Unable to find image 'poldracklab/fmriprep:1.5.0' locally
1.5.0: Pulling from poldracklab/fmriprep
.....
.....
.....

rapidito el wrapper ahora

queda probarlo,

[tester@detritus ptest]$ dfmriprep.pl ptest
Submitted batch job 114345
Submitted batch job 114346
Submitted batch job 114347
Submitted batch job 114348
Submitted batch job 114349
Submitted batch job 114350
Submitted batch job 114351
Submitted batch job 114352
Submitted batch job 114353
[tester@detritus ptest]$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
            114353      fast fmriprep   tester PD       0:00      1 (Dependency)
            114345      fast fmriprep   tester  R       0:28      1 brick01
            114346      fast fmriprep   tester  R       0:25      1 brick01
            114347      fast fmriprep   tester  R       0:22      1 brick01
            114348      fast fmriprep   tester  R       0:22      1 brick01
            114349      fast fmriprep   tester  R       0:19      1 brick02
            114350      fast fmriprep   tester  R       0:16      1 brick02
            114351      fast fmriprep   tester  R       0:16      1 brick02
            114352      fast fmriprep   tester  R       0:13      1 brick02

Mirando en brick01,

[osotolongo@brick01 ~]$ ps ax | grep fmriprep
  9723 ?        S      0:00 /bin/sh -c N4BiasFieldCorrection --bspline-fitting [ 200 ] -d 3 --input-image /data/sub-0002/anat/sub-0002_T1w.nii.gz --convergence [ 50x50x50x50x50, 1e-07 ] --output [ sub-0002_T1w_corrected.nii.gz, sub-0002_T1w_bias.nii.gz ] -r --shrink-factor 4 --weight-image /tmp/work/fmriprep_wf/single_subject_0002_wf/anat_preproc_wf/brain_extraction_wf/atropos_wf/copy_xform/09_relabel_wm_maths_xform.nii.gz
  9724 ?        R      1:58 N4BiasFieldCorrection --bspline-fitting [ 200 ] -d 3 --input-image /data/sub-0002/anat/sub-0002_T1w.nii.gz --convergence [ 50x50x50x50x50, 1e-07 ] --output [ sub-0002_T1w_corrected.nii.gz, sub-0002_T1w_bias.nii.gz ] -r --shrink-factor 4 --weight-image /tmp/work/fmriprep_wf/single_subject_0002_wf/anat_preproc_wf/brain_extraction_wf/atropos_wf/copy_xform/09_relabel_wm_maths_xform.nii.gz
 10895 ?        S      0:00 /bin/sh -c N4BiasFieldCorrection --bspline-fitting [ 200 ] -d 3 --input-image /data/sub-0001/anat/sub-0001_T1w.nii.gz --convergence [ 50x50x50x50x50, 1e-07 ] --output [ sub-0001_T1w_corrected.nii.gz, sub-0001_T1w_bias.nii.gz ] -r --shrink-factor 4 --weight-image /tmp/work/fmriprep_wf/single_subject_0001_wf/anat_preproc_wf/brain_extraction_wf/atropos_wf/copy_xform/09_relabel_wm_maths_xform.nii.gz
 10896 ?        R      1:41 N4BiasFieldCorrection --bspline-fitting [ 200 ] -d 3 --input-image /data/sub-0001/anat/sub-0001_T1w.nii.gz --convergence [ 50x50x50x50x50, 1e-07 ] --output [ sub-0001_T1w_corrected.nii.gz, sub-0001_T1w_bias.nii.gz ] -r --shrink-factor 4 --weight-image /tmp/work/fmriprep_wf/single_subject_0001_wf/anat_preproc_wf/brain_extraction_wf/atropos_wf/copy_xform/09_relabel_wm_maths_xform.nii.gz
 11518 ?        S      0:00 /bin/sh -c N4BiasFieldCorrection --bspline-fitting [ 200 ] -d 3 --input-image /data/sub-0003/anat/sub-0003_T1w.nii.gz --convergence [ 50x50x50x50x50, 1e-07 ] --output [ sub-0003_T1w_corrected.nii.gz, sub-0003_T1w_bias.nii.gz ] -r --shrink-factor 4 --weight-image /tmp/work/fmriprep_wf/single_subject_0003_wf/anat_preproc_wf/brain_extraction_wf/atropos_wf/copy_xform/09_relabel_wm_maths_xform.nii.gz
 11523 ?        R      1:36 N4BiasFieldCorrection --bspline-fitting [ 200 ] -d 3 --input-image /data/sub-0003/anat/sub-0003_T1w.nii.gz --convergence [ 50x50x50x50x50, 1e-07 ] --output [ sub-0003_T1w_corrected.nii.gz, sub-0003_T1w_bias.nii.gz ] -r --shrink-factor 4 --weight-image /tmp/work/fmriprep_wf/single_subject_0003_wf/anat_preproc_wf/brain_extraction_wf/atropos_wf/copy_xform/09_relabel_wm_maths_xform.nii.gz
 11937 ?        S      0:00 /bin/sh -c N4BiasFieldCorrection --bspline-fitting [ 200 ] -d 3 --input-image /data/sub-0004/anat/sub-0004_T1w.nii.gz --convergence [ 50x50x50x50x50, 1e-07 ] --output [ sub-0004_T1w_corrected.nii.gz, sub-0004_T1w_bias.nii.gz ] -r --shrink-factor 4 --weight-image /tmp/work/fmriprep_wf/single_subject_0004_wf/anat_preproc_wf/brain_extraction_wf/atropos_wf/copy_xform/09_relabel_wm_maths_xform.nii.gz
 11938 ?        R      1:36 N4BiasFieldCorrection --bspline-fitting [ 200 ] -d 3 --input-image /data/sub-0004/anat/sub-0004_T1w.nii.gz --convergence [ 50x50x50x50x50, 1e-07 ] --output [ sub-0004_T1w_corrected.nii.gz, sub-0004_T1w_bias.nii.gz ] -r --shrink-factor 4 --weight-image /tmp/work/fmriprep_wf/single_subject_0004_wf/anat_preproc_wf/brain_extraction_wf/atropos_wf/copy_xform/09_relabel_wm_maths_xform.nii.gz
 55016 pts/0    S+     0:00 grep --color=auto fmriprep
131569 ?        Sl     0:00 srun docker run --rm -v /nas/usr/local/opt/freesurfer/.license:/opt/freesurfer/license.txt:ro -v /nas/data/ptest/bids:/data:ro -v /nas/data/ptest/fmriprep_nofs_out:/out poldracklab/fmriprep:1.5.0 /data /out participant --participant-label 0002 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131570 ?        Sl     0:00 srun docker run --rm -v /nas/usr/local/opt/freesurfer/.license:/opt/freesurfer/license.txt:ro -v /nas/data/ptest/bids:/data:ro -v /nas/data/ptest/fmriprep_nofs_out:/out poldracklab/fmriprep:1.5.0 /data /out participant --participant-label 0001 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131571 ?        S      0:00 srun docker run --rm -v /nas/usr/local/opt/freesurfer/.license:/opt/freesurfer/license.txt:ro -v /nas/data/ptest/bids:/data:ro -v /nas/data/ptest/fmriprep_nofs_out:/out poldracklab/fmriprep:1.5.0 /data /out participant --participant-label 0002 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131572 ?        S      0:00 srun docker run --rm -v /nas/usr/local/opt/freesurfer/.license:/opt/freesurfer/license.txt:ro -v /nas/data/ptest/bids:/data:ro -v /nas/data/ptest/fmriprep_nofs_out:/out poldracklab/fmriprep:1.5.0 /data /out participant --participant-label 0001 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131590 ?        Sl     0:00 /bin/docker run --rm -v /nas/usr/local/opt/freesurfer/.license:/opt/freesurfer/license.txt:ro -v /nas/data/ptest/bids:/data:ro -v /nas/data/ptest/fmriprep_nofs_out:/out poldracklab/fmriprep:1.5.0 /data /out participant --participant-label 0001 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131599 ?        Sl     0:00 /bin/docker run --rm -v /nas/usr/local/opt/freesurfer/.license:/opt/freesurfer/license.txt:ro -v /nas/data/ptest/bids:/data:ro -v /nas/data/ptest/fmriprep_nofs_out:/out poldracklab/fmriprep:1.5.0 /data /out participant --participant-label 0002 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131737 ?        Sl     0:00 srun docker run --rm -v /nas/usr/local/opt/freesurfer/.license:/opt/freesurfer/license.txt:ro -v /nas/data/ptest/bids:/data:ro -v /nas/data/ptest/fmriprep_nofs_out:/out poldracklab/fmriprep:1.5.0 /data /out participant --participant-label 0003 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131740 ?        S      0:00 srun docker run --rm -v /nas/usr/local/opt/freesurfer/.license:/opt/freesurfer/license.txt:ro -v /nas/data/ptest/bids:/data:ro -v /nas/data/ptest/fmriprep_nofs_out:/out poldracklab/fmriprep:1.5.0 /data /out participant --participant-label 0003 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131743 ?        Sl     0:00 srun docker run --rm -v /nas/usr/local/opt/freesurfer/.license:/opt/freesurfer/license.txt:ro -v /nas/data/ptest/bids:/data:ro -v /nas/data/ptest/fmriprep_nofs_out:/out poldracklab/fmriprep:1.5.0 /data /out participant --participant-label 0004 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131749 ?        S      0:00 srun docker run --rm -v /nas/usr/local/opt/freesurfer/.license:/opt/freesurfer/license.txt:ro -v /nas/data/ptest/bids:/data:ro -v /nas/data/ptest/fmriprep_nofs_out:/out poldracklab/fmriprep:1.5.0 /data /out participant --participant-label 0004 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131759 ?        Sl     0:00 /bin/docker run --rm -v /nas/usr/local/opt/freesurfer/.license:/opt/freesurfer/license.txt:ro -v /nas/data/ptest/bids:/data:ro -v /nas/data/ptest/fmriprep_nofs_out:/out poldracklab/fmriprep:1.5.0 /data /out participant --participant-label 0003 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131769 ?        Sl     0:00 /bin/docker run --rm -v /nas/usr/local/opt/freesurfer/.license:/opt/freesurfer/license.txt:ro -v /nas/data/ptest/bids:/data:ro -v /nas/data/ptest/fmriprep_nofs_out:/out poldracklab/fmriprep:1.5.0 /data /out participant --participant-label 0004 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131933 ?        Ssl    2:45 /usr/local/miniconda/bin/python /usr/local/miniconda/bin/fmriprep /data /out participant --participant-label 0001 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131939 ?        Ssl    2:53 /usr/local/miniconda/bin/python /usr/local/miniconda/bin/fmriprep /data /out participant --participant-label 0002 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131972 ?        Ssl    2:41 /usr/local/miniconda/bin/python /usr/local/miniconda/bin/fmriprep /data /out participant --participant-label 0004 --ignore slicetiming --skip_bids_validation --fs-no-reconall
131985 ?        Ssl    2:38 /usr/local/miniconda/bin/python /usr/local/miniconda/bin/fmriprep /data /out participant --participant-label 0003 --ignore slicetiming --skip_bids_validation --fs-no-reconall

Los procesos estan lanzados correctamente. El resultado,

[tester@detritus ptest]$ ls fmriprep_nofs_out/fmriprep/
dataset_description.json  sub-0001       sub-0002       sub-0003       sub-0004       sub-0005       sub-0006       sub-0007       sub-0008
logs                      sub-0001.html  sub-0002.html  sub-0003.html  sub-0004.html  sub-0005.html  sub-0006.html  sub-0007.html  sub-0008.html

PETDB

La manipulacion de las imagenes PET tiene una problematica distinta y que no puede ser automatizada. Cada imagen PET debe parearse con su correspondiente imagen MRI. Esto puede ser complicado, dependiendo de como hayan subido los DICOM de cada site, asi que voy a ir paso por paso.

Elaborando ejemplo

Voy a hacer un miniproyecto nuevo como ejemplo. Primero me voy a copiar los archivos,

[tester@detritus ~]$ mkdir testpet
[tester@detritus ~]$ mkdir testpet/mri
[tester@detritus ~]$ mkdir testpet/pet
[tester@detritus ~]$ ls /nas/clinic/facehbi_2/
FACEHBI-F001F  FACEHBI-F023F  FACEHBI-F043F  FACEHBI-F063F  FACEHBI-F082F  FACEHBI-F105   FACEHBI-F126F  FACEHBI-F145F  FACEHBI-F166F  FACEHBI-F189F  FACEHBI-F213F  FACEHBI-F230F
FACEHBI-F002F  FACEHBI-F024F  FACEHBI-F044   FACEHBI-F064F  FACEHBI-F083F  FACEHBI-F105F  FACEHBI-F127F  FACEHBI-F146F  FACEHBI-F167F  FACEHBI-F190F  FACEHBI-F214F  FACEHBI-F231
FACEHBI-F003F  FACEHBI-F025F  FACEHBI-F044F  FACEHBI-F065F  FACEHBI-F084F  FACEHBI-F106F  FACEHBI-F128F  FACEHBI-F149F  FACEHBI-F169F  FACEHBI-F192F  FACEHBI-F215F  FACEHBI-F232F
FACEHBI-F005F  FACEHBI-F026F  FACEHBI-F047F  FACEHBI-F066F  FACEHBI-F085F  FACEHBI-F107F  FACEHBI-F129F  FACEHBI-F150F  FACEHBI-F170F  FACEHBI-F193F  FACEHBI-F216F  FACEHBI-F233
FACEHBI-F006F  FACEHBI-F027F  FACEHBI-F048F  FACEHBI-F068F  FACEHBI-F086F  FACEHBI-F111F  FACEHBI-F130F  FACEHBI-F151F  FACEHBI-F171F  FACEHBI-F194F  FACEHBI-F217F  FACEHBI-F234
FACEHBI-F007F  FACEHBI-F028F  FACEHBI-F049F  FACEHBI-F069   FACEHBI-F087F  FACEHBI-F112F  FACEHBI-F131F  FACEHBI-F152F  FACEHBI-F173F  FACEHBI-F195F  FACEHBI-F218F  FACEHBI-F235F
FACEHBI-F008F  FACEHBI-F029F  FACEHBI-F050F  FACEHBI-F069F  FACEHBI-F088F  FACEHBI-F115F  FACEHBI-F132F  FACEHBI-F154F  FACEHBI-F175F  FACEHBI-F196F  FACEHBI-F219F  FACEHBI-F236F
FACEHBI-F009F  FACEHBI-F030F  FACEHBI-F052F  FACEHBI-F070F  FACEHBI-F089F  FACEHBI-F116F  FACEHBI-F133F  FACEHBI-F155F  FACEHBI-F177F  FACEHBI-F197F  FACEHBI-F220F  FACEHBI-F237
FACEHBI-F010F  FACEHBI-F033F  FACEHBI-F053F  FACEHBI-F071F  FACEHBI-F090F  FACEHBI-F117F  FACEHBI-F134F  FACEHBI-F156F  FACEHBI-F178F  FACEHBI-F198F  FACEHBI-F221F  FACEHBI-F238F
FACEHBI-F011F  FACEHBI-F035F  FACEHBI-F054F  FACEHBI-F072F  FACEHBI-F091F  FACEHBI-F118F  FACEHBI-F135F  FACEHBI-F157F  FACEHBI-F179F  FACEHBI-F199F  FACEHBI-F222F  FACEHBI-F239
FACEHBI-F014F  FACEHBI-F036F  FACEHBI-F055F  FACEHBI-F073F  FACEHBI-F092F  FACEHBI-F119F  FACEHBI-F137F  FACEHBI-F158F  FACEHBI-F181F  FACEHBI-F201F  FACEHBI-F223F  FACEHBI-F240
FACEHBI-F015F  FACEHBI-F038F  FACEHBI-F056F  FACEHBI-F074F  FACEHBI-F094F  FACEHBI-F120F  FACEHBI-F139F  FACEHBI-F159F  FACEHBI-F182F  FACEHBI-F203F  FACEHBI-F224F  FACEHBI_F241
FACEHBI-F018F  FACEHBI-F039F  FACEHBI-F057F  FACEHBI-F075F  FACEHBI-F096F  FACEHBI-F121F  FACEHBI-F140F  FACEHBI-F160F  FACEHBI-F183F  FACEHBI-F204F  FACEHBI-F225F  FACEHBI-F243
FACEHBI-F019F  FACEHBI-F040F  FACEHBI-F058F  FACEHBI-F076F  FACEHBI-F097F  FACEHBI-F122F  FACEHBI-F141F  FACEHBI-F161F  FACEHBI-F184F  FACEHBI-F207F  FACEHBI-F226F  FACEHBI-F244
FACEHBI-F020F  FACEHBI-F041F  FACEHBI-F059F  FACEHBI-F077F  FACEHBI-F098F  FACEHBI-F123F  FACEHBI-F142F  FACEHBI-F163F  FACEHBI-F185F  FACEHBI-F208F  FACEHBI-F227   FACEHBI-F245
FACEHBI-F021F  FACEHBI-F042F  FACEHBI-F061F  FACEHBI-F078F  FACEHBI-F099F  FACEHBI-F124F  FACEHBI-F143F  FACEHBI-F164F  FACEHBI-F186F  FACEHBI-F211F  FACEHBI-F228   FACEHBI-F246
FACEHBI-F022F  FACEHBI-F043   FACEHBI-F062F  FACEHBI-F080F  FACEHBI-F100F  FACEHBI-F125F  FACEHBI-F144F  FACEHBI-F165F  FACEHBI-F188F  FACEHBI-F212F  FACEHBI-F229F  FACEHBI_newupload
[tester@detritus ~]$ cp -r /nas/clinic/facehbi_2/FACEHBI-F00* testpet/pet/
[tester@detritus ~]$ ls /nas/corachan/facehbi_2/
F001                   F029                   F061_._._(1D17047719)  F087_._._(1D17072691)  F120_._(1D17097661)    F146                   F174                   F201  F230
F002                   F030_._._(1D17045416)  F062_._._(1D17043157)  F088_._._(1D17057916)  F121_._._(1D17099054)  F149                   F175                   F203  F231
F003                   F033_._._(1D17043762)  F063_._._(1D17068894)  F089_._._(1D17066207)  F122                   F150                   F176_._._(1D15025720)  F204  F232
F005                   F035                   F064_._._(1D17059919)  F090_._._(1D17067613)  F123_._._(1D17105848)  F151                   F177                   F207  F233
F006                   F036                   F065_._(1D17055534)    F091_._._(1D17097810)  F124                   F152                   F178                   F208  F234
F007                   F038                   F066_._._(1D17070691)  F092_._._(1D17081902)  F125_._._(1D17104104)  F154                   F179                   F211  F235
F008                   F039                   F068_._._(1D17056669)  F093_._._(1D17060183)  F126_._._(1D17101385)  F155                   F181                   F212  F236
F009                   F040                   F069_._._(1D17062785)  F094_._._(1D17060793)  F127                   F156                   F182                   F213  F237
F010                   F041                   F070_._._(1D17059462)  F095_._._(1D17065289)  F128                   F157                   F183                   F214  F238
F011                   F042                   F071_._._(1D17046645)  F096_._._(1D17067822)  F129_._._(1D17100662)  F158                   F184                   F215  F239
F013                   F043_._._(1D17061809)  F072                   F097_._._(1D17065875)  F130                   F159                   F185                   F216  F240
F014                   F044_._._(1D17059657)  F073_._._(1D17057021)  F098                   F131                   F160                   F186                   F217  F241
F015                   F047                   F074_._._(1D17068052)  F099_._(1D17071916)    F132                   F161                   F188                   F218  F243
F018                   F048                   F075_._(1D17104485)    F100_._._(1D17069777)  F133                   F162                   F189                   F219  F244
F019_._._(1D17046017)  F049_._._(1D17070290)  F076_._._(1D17056420)  F105_._._(1D17057658)  F134                   F163                   F190                   F220  F245
F020                   F050_._._(1D17051698)  F077_._._(1D17057706)  F106_._._(1D17069488)  F135                   F164                   F191_._._(1D15035467)  F221  F246
F021                   F052_._._(1D17045054)  F078_._._(1D17059453)  F107_._._(1D17062930)  F137                   F165                   F192                   F222  FACEHBIS_repe
F022_._._(1D17044369)  F053                   F079_._._(1D17056765)  F111_._._(1D17073054)  F139                   F166                   F193                   F223
F023_._._(SID_1)       F054_._(1D17058650)    F080_._._(1D17064975)  F112_(1D17071444)      F140                   F167                   F194                   F224
F024                   F055_._._(1D17066731)  F082_._._(1D17071447)  F115                   F141                   F169                   F195                   F225
F025_._._(1D17042426)  F056_._._(1D17044618)  F083_._._(1D17075879)  F116                   F142                   F170                   F196                   F226
F026_(1D17042357)      F057                   F084_._(1D17074139)    F117_._._(1D17097339)  F143                   F171                   F197                   F227
F027_._._(1D17043460)  F058_._._(1D17042332)  F085_._._(1D17057345)  F118_._._(1D17098249)  F144                   F172_._._(1D15025521)  F198                   F228
F028                   F059                   F086                   F119_._._(1D17101709)  F145                   F173                   F199                   F229
[tester@detritus ~]$ cp -r /nas/corachan/facehbi_2/F00* testpet/mri/

El primer problema es que cada proveedor de imagenes ha nombrado de manera diferente (e inconsistentemente) los archivos. Uno pensaria que basta cambiar los nombres de directorio (es facil, se puede hacer en bulk), pero los DICOM pueden tener tambien esta info, asi que no valdria de nada.

Empiezo creando el proyecto. Aqui la guia es siempre el MRI,

[tester@detritus ~]$ make_proj.pl ftest /nas/tester/testpet/mri
[tester@detritus ~]$ tree /nas/data/ftest/
/nas/data/ftest/
├── bids
└── working
[tester@detritus ~]$ update_mri_db.pl ftest
[tester@detritus bids]$ cd /nas/data/ftest/bids/
[tester@detritus bids]$ dcm2bids_scaffold
[tester@detritus bids]$ ls
CHANGES  code  dataset_description.json  derivatives  participants.json  participants.tsv  README  sourcedata
[tester@detritus bids]$ cat dataset_description.json
{
    "Name": "FTEST"
    "BIDSVersion": "1.2.0",
    "License": "CCO",
    "Authors": [
        "O. Sotolongo"
    ]
}
[tester@detritus bids]$ dcm2bids_helper -d /nas/tester/testpet/mri/F001/
Example in:
/nas/data/ftest/bids/tmp_dcm2bids/helper
[tester@detritus bids]$ ls /nas/data/ftest/bids/tmp_dcm2bids/helper
001_F001_AAHead_Scout_20170124170329.json                 009_F001_t2_spc_flair_sag_p2_iso_1.0_20170124170329.nii.gz   020_F001_ep2d_diff_mddw_64_p2_20170124170329.json
001_F001_AAHead_Scout_20170124170329.nii.gz               010_F001_t2_spc_flair_sag_p2_iso_1.0_20170124170329.json     020_F001_ep2d_diff_mddw_64_p2_20170124170329.nii.gz
002_F001_AAHead_Scout_20170124170329_i00001.json          010_F001_t2_spc_flair_sag_p2_iso_1.0_20170124170329.nii.gz   021_F001_ep2d_diff_mddw_64_p2_20170124170329.json
002_F001_AAHead_Scout_20170124170329_i00001.nii.gz        011_F001_pd+t2_tse_tra_p2_320_4mm_20170124170329_e1.json     021_F001_ep2d_diff_mddw_64_p2_20170124170329.nii.gz
002_F001_AAHead_Scout_20170124170329_i00002.json          011_F001_pd+t2_tse_tra_p2_320_4mm_20170124170329_e1.nii.gz   022_F001_ep2d_diff_mddw_64_p2_20170124170329.bval
002_F001_AAHead_Scout_20170124170329_i00002.nii.gz        011_F001_pd+t2_tse_tra_p2_320_4mm_20170124170329_e2.json     022_F001_ep2d_diff_mddw_64_p2_20170124170329.bvec
002_F001_AAHead_Scout_20170124170329_i00003.json          011_F001_pd+t2_tse_tra_p2_320_4mm_20170124170329_e2.nii.gz   022_F001_ep2d_diff_mddw_64_p2_20170124170329.json
002_F001_AAHead_Scout_20170124170329_i00003.nii.gz        012_F001_t2_fl2d_tra_4mm_hemo_20170124170329.json            022_F001_ep2d_diff_mddw_64_p2_20170124170329.nii.gz
002_F001_AAHead_Scout_20170124170329_i00004.json          012_F001_t2_fl2d_tra_4mm_hemo_20170124170329.nii.gz          023_F001_ep2d_diff_mddw_64_p2_20170124170329.json
002_F001_AAHead_Scout_20170124170329_i00004.nii.gz        013_F001_t2_swi3d_tra_p2_320_1.6mm_20170124170329.json       023_F001_ep2d_diff_mddw_64_p2_20170124170329.nii.gz
003_F001_AAHead_Scout_20170124170329_i00001.json          013_F001_t2_swi3d_tra_p2_320_1.6mm_20170124170329.nii.gz     024_F001_ep2d_diff_mddw_64_p2_20170124170329.json
003_F001_AAHead_Scout_20170124170329_i00001.nii.gz        014_F001_t2_swi3d_tra_p2_320_1.6mm_20170124170329_ph.json    024_F001_ep2d_diff_mddw_64_p2_20170124170329.nii.gz
003_F001_AAHead_Scout_20170124170329_i00002.json          014_F001_t2_swi3d_tra_p2_320_1.6mm_20170124170329_ph.nii.gz  026_F001_ep2d_pace_moco_p2_20170124170329.json
003_F001_AAHead_Scout_20170124170329_i00002.nii.gz        015_F001_t2_swi3d_tra_p2_320_1.6mm_20170124170329.json       026_F001_ep2d_pace_moco_p2_20170124170329.nii.gz
003_F001_AAHead_Scout_20170124170329_i00003.json          015_F001_t2_swi3d_tra_p2_320_1.6mm_20170124170329.nii.gz     027_F001_ep2d_pace_moco_p2_MoCo_20170124170329.json
003_F001_AAHead_Scout_20170124170329_i00003.nii.gz        016_F001_t2_swi3d_tra_p2_320_1.6mm_20170124170329.json       027_F001_ep2d_pace_moco_p2_MoCo_20170124170329.nii.gz
004_F001_AAHead_Scout_20170124170329_i00001.json          016_F001_t2_swi3d_tra_p2_320_1.6mm_20170124170329.nii.gz     028_F001_ep2d_pace_moco_p2_20170124170329.json
004_F001_AAHead_Scout_20170124170329_i00001.nii.gz        017_F001_ep2d_diff_3scan_trace_p2_20170124170329.bval        028_F001_ep2d_pace_moco_p2_20170124170329.nii.gz
004_F001_AAHead_Scout_20170124170329_i00002.json          017_F001_ep2d_diff_3scan_trace_p2_20170124170329.bvec        029_F001_ep2d_pace_moco_p2_MoCo_20170124170329.json
004_F001_AAHead_Scout_20170124170329_i00002.nii.gz        017_F001_ep2d_diff_3scan_trace_p2_20170124170329.json        029_F001_ep2d_pace_moco_p2_MoCo_20170124170329.nii.gz
004_F001_AAHead_Scout_20170124170329_i00003.json          017_F001_ep2d_diff_3scan_trace_p2_20170124170329.nii.gz      030_F001_ep2d_pace_moco_p2_MoCo_20170124170329.json
004_F001_AAHead_Scout_20170124170329_i00003.nii.gz        018_F001_ep2d_diff_3scan_trace_p2_20170124170329.bval        030_F001_ep2d_pace_moco_p2_MoCo_20170124170329.nii.gz
005_F001_t1_mprage_sag_p2_iso_1.0_20170124170329.json     018_F001_ep2d_diff_3scan_trace_p2_20170124170329.bvec        031_F001_vessels_head_20170124170329.json
005_F001_t1_mprage_sag_p2_iso_1.0_20170124170329.nii.gz   018_F001_ep2d_diff_3scan_trace_p2_20170124170329.json        031_F001_vessels_head_20170124170329.nii.gz
006_F001_t1_mprage_sag_p2_iso_1.0_20170124170329.json     018_F001_ep2d_diff_3scan_trace_p2_20170124170329.nii.gz      032_F001_ASL_3D_tra_iso_20170124170329.json
006_F001_t1_mprage_sag_p2_iso_1.0_20170124170329.nii.gz   019_F001_ep2d_diff_3scan_trace_p2_20170124170329.bval        032_F001_ASL_3D_tra_iso_20170124170329.nii.gz
007_F001_t1_mprage_sag_p2_iso_1.0_20170124170329.json     019_F001_ep2d_diff_3scan_trace_p2_20170124170329.bvec        033_F001_ASL_3D_tra_iso_20170124170329.json
007_F001_t1_mprage_sag_p2_iso_1.0_20170124170329.nii.gz   019_F001_ep2d_diff_3scan_trace_p2_20170124170329.json        033_F001_ASL_3D_tra_iso_20170124170329.nii.gz
008_F001_t1_mprage_sag_p2_iso_1.0_20170124170329.json     019_F001_ep2d_diff_3scan_trace_p2_20170124170329.nii.gz      1040_F001_t1_mprage_sag_p2_iso_1.0_20170124170329.json
008_F001_t1_mprage_sag_p2_iso_1.0_20170124170329.nii.gz   020_F001_ep2d_diff_mddw_64_p2_20170124170329.bval            1040_F001_t1_mprage_sag_p2_iso_1.0_20170124170329.nii.gz
009_F001_t2_spc_flair_sag_p2_iso_1.0_20170124170329.json  020_F001_ep2d_diff_mddw_64_p2_20170124170329.bvec

Hasta aqui he creado el proyecto, la base de datos de mri, preparado la conversion a BIDS, editado manualmente el archivo dataset_description.json y lanzado el helper. Ahora debo crear el archivo de configuracion de la conversion basandome el ejemplo que tengo.

[tester@detritus bids]$ cat conversion.json
{
        "descriptions": [
                {
                        "dataType": "anat",
                        "modalityLabel": "T1w",
                        "criteria": {
                                "SeriesDescription": "t1_mprage_sag_p2_iso_1.0",
                                "ImageType": ["ORIGINAL", "PRIMARY", "M", "ND", "NORM", "FM3", "2", "FIL"]
                        }
                },
                {
                        "dataType": "anat",
                        "modalityLabel": "T2w",
                        "criteria": {
                                "SeriesDescription": "t2_spc_flair_sag_p2_iso_1.0",
                                "ImageType": ["ORIGINAL", "PRIMARY", "M", "ND", "NORM", "FM3", "2", "FIL"]
                        }
                },
                {
                        "dataType": "dwi",
                        "modalityLabel": "dwi",
                        "criteria": {
                                "SeriesDescription": "ep2d_diff_mddw_64_p2",
                                "ImageType": ["ORIGINAL", "PRIMARY", "DIFFUSION", "NONE", "ND", "MOSAIC"]
                        }
                },
                {
                        "dataType": "func",
                        "modalityLabel": "bold",
                        "customLabels": "task-rest",
                        "criteria": {
                                "SeriesDescription": "ep2d_pace_moco_p2",
                                "ImageType": ["ORIGINAL", "PRIMARY", "FMRI", "NONE", "ND", "MOSAIC"]
                        }
                }
        ]
}

Ahora a convertir,

[tester@detritus ftest]$ bulk2bids.pl ftest
Submitted batch job 114363
Submitted batch job 114364
Submitted batch job 114365
Submitted batch job 114366
Submitted batch job 114367
Submitted batch job 114368
Submitted batch job 114369
Submitted batch job 114370
Submitted batch job 114371
[tester@detritus ftest]$ squeue | grep bids
            114371     devel dcm2bids   tester PD       0:00      1 (Dependency)
            114363      fast dcm2bids   tester  R       0:15      1 brick02
            114364      fast dcm2bids   tester  R       0:15      1 brick02
            114365      fast dcm2bids   tester  R       0:15      1 brick02
            114366      fast dcm2bids   tester  R       0:15      1 brick02
            114367      fast dcm2bids   tester  R       0:15      1 brick02
            114368      fast dcm2bids   tester  R       0:15      1 brick02
            114369      fast dcm2bids   tester  R       0:15      1 brick02
            114370      fast dcm2bids   tester  R       0:15      1 brick02

tipicamente, obtenemos esto,

[tester@detritus ftest]$ tree bids/sub-0001/
bids/sub-0001/
├── anat
│   ├── sub-0001_T1w.json
│   ├── sub-0001_T1w.nii.gz
│   ├── sub-0001_T2w.json
│   └── sub-0001_T2w.nii.gz
├── dwi
│   ├── sub-0001_dwi.bval
│   ├── sub-0001_dwi.bvec
│   ├── sub-0001_dwi.json
│   └── sub-0001_dwi.nii.gz
└── func
    ├── sub-0001_task-rest_bold.json
    └── sub-0001_task-rest_bold.nii.gz
 
3 directories, 10 files

Nota: Ojo con el formato, la minima coma mal puesta hace que no funcione la conversion.

Seguimos, para procesar los PET necesitare la reconstruccion FS, asi que hay que lanzar los recon-all,

[tester@detritus ftest]$ precon.pl ftest
Submitted batch job 114372
Submitted batch job 114373
Submitted batch job 114374
Submitted batch job 114375
Submitted batch job 114376
Submitted batch job 114377
Submitted batch job 114378
Submitted batch job 114379
Submitted batch job 114380
[tester@detritus ftest]$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
            114380     devel fs_recon   tester PD       0:00      1 (Dependency)
            114372      fast fs_recon   tester  R       0:06      1 brick01
            114373      fast fs_recon   tester  R       0:06      1 brick01
            114374      fast fs_recon   tester  R       0:06      1 brick01
            114375      fast fs_recon   tester  R       0:06      1 brick01
            114376      fast fs_recon   tester  R       0:06      1 brick01
            114377      fast fs_recon   tester  R       0:06      1 brick01
            114378      fast fs_recon   tester  R       0:06      1 brick01
            114379      fast fs_recon   tester  R       0:06      1 brick01

DB

Para elaborar la base de datos de las imagenes PET, debemos primeramente darnos cuenta que la unica conexion entre las imagenes MRI y PET es el ID del sujeto asignado en el proyecto. Hemos de buscar un patron que nos permita extraer los id de sujeto a partir de los paths. Ejemplo,

[tester@detritus ftest]$ ls /nas/tester/testpet/pet/ | sed 's/.*-\(F.*\)F/\1/'
F001
F002
F003
F005
F006
F007
F008
F009

Lo mismo ha de hacerse para la base de datos MRI. En esta caso no es necesario ya que los directorios de MRI son simplemente el subject ID,

[tester@detritus ftest]$ ls /nas/tester/testpet/mri/
F001  F002  F003  F005  F006  F007  F008  F009

Asi que podemos enlazar ambas bases de datos a traves del subject ID,

[tester@detritus ftest]$ cat ftest_mri.csv 
0001;F001
0002;F002
0003;F003
0004;F005
0005;F006
0006;F007
0007;F008
0008;F009
[tester@detritus ftest]$ ls /nas/tester/testpet/pet/ | sed 's/.*-\(F.*\)F/\1;\0/'
F001;FACEHBI-F001F
F002;FACEHBI-F002F
F003;FACEHBI-F003F
F005;FACEHBI-F005F
F006;FACEHBI-F006F
F007;FACEHBI-F007F
F008;FACEHBI-F008F
F009;FACEHBI-F009F
[tester@detritus ftest]$ join -t";" -1 2 -2 1 ftest_mri.csv temp.csv | awk -F";" '{print $2";"$3}' > ftest_pet.csv

Con lo que nos queda la DB apropiada

[tester@detritus ftest]$ cat ftest_pet.csv
0001;FACEHBI-F001F
0002;FACEHBI-F002F
0003;FACEHBI-F003F
0004;FACEHBI-F005F
0005;FACEHBI-F006F
0006;FACEHBI-F007F
0007;FACEHBI-F008F
0008;FACEHBI-F009F

PET2BIDS

Para añadir los PET a la estructura BIDS se ha de modificar el archivo de conversion.Pero primeramente ha de estudiarse la estructura de los PET. Se ha de borrar el directorio helper para evitar confusiones con los archivos previos.

[tester@brick03 bids]$ rm -rf tmp_dcm2bids/helper
[tester@brick03 bids]$ dcm2bids_helper -d /nas/tester/testpet/pet/FACEHBI-F001F/
Example in:
/home/data/ftest/bids/tmp_dcm2bids/helper
003_FACEHBI-F001F__20170126133952.json           005_FACEHBI-F001F__20170126133952.json                             006_FACEHBI-F001F__20170126133952.json
003_FACEHBI-F001F__20170126133952.nii.gz         005_FACEHBI-F001F__20170126133952.nii.gz                           006_FACEHBI-F001F__20170126133952.nii.gz
003_FACEHBI-F001F_FACEHBI_20170126133952.json    005_FACEHBI-F001F_FACEHBI_Florbetaben_20min_20170126133952.json    006_FACEHBI-F001F_FACEHBI_Florbetaben_4x5min_20170126133952.json
003_FACEHBI-F001F_FACEHBI_20170126133952.nii.gz  005_FACEHBI-F001F_FACEHBI_Florbetaben_20min_20170126133952.nii.gz  006_FACEHBI-F001F_FACEHBI_Florbetaben_4x5min_20170126133952.nii.gz

En principio bastaria añadir los nuevos tipo de archivo al mismo config,

[tester@brick03 bids]$ cat conversion.json
{
        "descriptions": [
                {
                        "dataType": "anat",
                        "modalityLabel": "T1w",
                        "criteria": {
                                "SeriesDescription": "t1_mprage_sag_p2_iso_1.0",
                                "ImageType": ["ORIGINAL", "PRIMARY", "M", "ND", "NORM", "FM3", "2", "FIL"]
                        }
                },
                {
                        "dataType": "anat",
                        "modalityLabel": "T2w",
                        "criteria": {
                                "SeriesDescription": "t2_spc_flair_sag_p2_iso_1.0",
                                "ImageType": ["ORIGINAL", "PRIMARY", "M", "ND", "NORM", "FM3", "2", "FIL"]
                        }
                },
                {
                        "dataType": "dwi",
                        "modalityLabel": "dwi",
                        "criteria": {
                                "SeriesDescription": "ep2d_diff_mddw_64_p2",
                                "ImageType": ["ORIGINAL", "PRIMARY", "DIFFUSION", "NONE", "ND", "MOSAIC"]
                        }
                },
                {
                        "dataType": "func",
                        "modalityLabel": "bold",
                        "customLabels": "task-rest",
                        "criteria": {
                                "SeriesDescription": "ep2d_pace_moco_p2",
                                "ImageType": ["ORIGINAL", "PRIMARY", "FMRI", "NONE", "ND", "MOSAIC"]
                        }
                },
                {
                        "dataType": "pet",
                        "modalityLabel": "fbb",
                        "customLabels": "single",
                        "criteria": {
                                "SeriesDescription": "FACEHBI_Florbetaben_4x5min",
                                "ImageType": ["ORIGINAL", "PRIMARY"]
                        }
                },
                {
                        "dataType": "pet",
                        "modalityLabel": "fbb",
                        "customLabels": "combined",
                        "criteria": {
                                "SeriesDescription": "FACEHBI_Florbetaben_20min",
                                "ImageType": ["ORIGINAL", "PRIMARY"]
                        }
                }
        ]
}

Ahora, para que la conversion funcione adecuadamente se ha de definir a nivel de proyecto donde se encuentran los DICOM PET,

[tester@brick03 ftest]$ cat ~/.config/neuro/ftest.cfg 
DATA = /nas/data/ftest
SRC = /nas/tester/testpet/mri
PET = /nas/tester/testpet/pet
WORKING = /nas/data/ftest/working
BIDS = /nas/data/ftest/bids

Nota: de no definirse el proceso de conversion fallara.

Ya esta todo listo,

[tester@detritus ftest]$ pet2bids.pl ftest
Submitted batch job 114435
Submitted batch job 114436
Submitted batch job 114437
Submitted batch job 114438
Submitted batch job 114439
Submitted batch job 114440
Submitted batch job 114441
Submitted batch job 114442
Submitted batch job 114443
[tester@detritus ftest]$ squeue | grep dcm
            114443     devel dcm2bids   tester PD       0:00      1 (Dependency)
            114435      fast dcm2bids   tester  R       0:10      1 brick01
            114436      fast dcm2bids   tester  R       0:10      1 brick01
            114437      fast dcm2bids   tester  R       0:10      1 brick01
            114438      fast dcm2bids   tester  R       0:10      1 brick01
            114439      fast dcm2bids   tester  R       0:10      1 brick01
            114440      fast dcm2bids   tester  R       0:10      1 brick01
            114441      fast dcm2bids   tester  R       0:10      1 brick01
            114442      fast dcm2bids   tester  R       0:10      1 brick01

Y nos quedan los PET dentro de la estructura,

[tester@detritus ftest]$ tree bids/sub-0001/
bids/sub-0001/
├── anat
│   ├── sub-0001_T1w.json
│   ├── sub-0001_T1w.nii.gz
│   ├── sub-0001_T2w.json
│   └── sub-0001_T2w.nii.gz
├── dwi
│   ├── sub-0001_dwi.bval
│   ├── sub-0001_dwi.bvec
│   ├── sub-0001_dwi.json
│   └── sub-0001_dwi.nii.gz
├── func
│   ├── sub-0001_task-rest_bold.json
│   └── sub-0001_task-rest_bold.nii.gz
└── pet
    ├── sub-0001_combined_fbb.json
    ├── sub-0001_combined_fbb.nii.gz
    ├── sub-0001_single_fbb.json
    └── sub-0001_single_fbb.nii.gz
 
4 directories, 14 files

PET registro

Hemos comparado los resultados de SUVR haciendo el registro de dos maneras distintas,

  1. Tomando la imagen integrada en el tiempo durante 20min
  2. Tomando la imagen de 4 integraciones por 5min, registrandolas independientement y combinandolas

Los resultados son exactamente los mismos , por lo que decidimos utlizar el primero de los metodos ya que es mucho mas rapido. No obstante, voy a dejar en el software la posibilidad de hacer el segundo metodo.

automagicamente se decide que hacer,

El QC de este registro lo metemos en un script

Y esto lo podemos poner al final del registro.

Pues ahora toca hacer el wrapper para todo esto,

Y deja el QC listo en working/fbbs/

Notas por si la cosa no esta bien

Opcion 1

[osotolongo@detritus facehbi]$ cat bad_reg.txt
0070
0077
0088
0133
0140
0189
[osotolongo@detritus facehbi]$ for x in `cat bad_reg.txt`; do srun /usr/local/fsl/bin/flirt -ref /nas/data/facehbi/working/${x}_struc -in /nas/data/facehbi/bids/sub-${x}/pet/sub-${x}_combined_fbb -out /nas/data/facehbi/working/${x}_fbb; done

Opcion 2

[osotolongo@detritus facehbi]$ ANTS 3 -m CC[/nas/data/facehbi/working/0088_struc.nii.gz, /nas/data/facehbi/bids/sub-0088/pet/sub-0088_combined_fbb.nii.gz, 1, 4] -r Gauss[0,3] -t Elast[1.5] -i 30x20x10 -o /nas/data/facehbi/working/0088_fbb_2t1.nii.gz
[osotolongo@detritus facehbi]$ WarpImageMultiTransform 3 /nas/data/facehbi/bids/sub-0088/pet/sub-0088_combined_fbb.nii.gz /nas/data/facehbi/working/0088_fbb.nii.gz -R /nas/data/facehbi/working/0088_struc.nii.gz /nas/data/facehbi/working/0088_fbb_2t1Warp.nii.gz /nas/data/facehbi/working/0088_fbb_2t1Affine.txt

PET metrics

El proceso de extraccion de metricas de FBB ha de calibrarse con los datos de GAAIN. calibracion.

Hay dos maneras distinta de sacar el SUVR (o Centiloid),

Ya hemos visto que ambas maneras son equivalentes. Pero porque escoger si podemos tener las dos por el doble de dinero :-P

ADNI way

Se necesita disponer la segmentacion de FS, escoger de aqui un conjunto de ROIs, superponerla encima del FBB ya registrado y determinar el valor medio del SUVR.

Hay dos partes que hay que hacer por separado.

primero, hacer las mascaras para cada sujeto,

y luego aplicar las mascaras,

Puesto asi, solo queda meter todo en un wrapper y lanzarlo apropiadamente al cluster,

Hacemos alguna pruebilla,

[tester@detritus ftest]$ fbb_rois_metrics.pl ftest
[tester@detritus ftest]$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
            114493      fast fbb_mroi   tester PD       0:00      1 (Dependency)
            114485      fast fbb_mroi   tester  R       0:14      1 brick01
            114486      fast fbb_mroi   tester  R       0:14      1 brick01
            114487      fast fbb_mroi   tester  R       0:14      1 brick01
            114488      fast fbb_mroi   tester  R       0:14      1 brick01
            114489      fast fbb_mroi   tester  R       0:14      1 brick01
            114490      fast fbb_mroi   tester  R       0:14      1 brick01
            114491      fast fbb_mroi   tester  R       0:14      1 brick01
            114492      fast fbb_mroi   tester  R       0:11      1 brick01
[tester@detritus ftest]$ cat ftest_fbb_fs_suvr_rois.csv
Subject;Frontal;Global;Centiloid;PPCLP
0001;1.01285267656264;0.99550830042264;-2.18902671516696;0.992399638154096
0002;0.987084029651387;1.00385071861752;-0.909299764073126;1.01534775351546
0003;0.963931385170854;0.979548593406697;-4.63724577141272;0.980808489752354
0004;0.974966631595325;0.977777337434607;-4.90895643753126;0.978115374409824
0005;1.33521185585939;1.26799989440405;39.6111838015813;1.21307182669439
0006;1.53732318694519;1.58482250830462;88.211772773928;1.61446288907802
0007;0.971322850431195;0.975548352304736;-5.25088275645354;0.972351827083167
0008;1.02231152375569;1.04967028241657;6.11942132270235;1.07588401009506

Pittsburgh way

Este metodo se basa en tomar mascaras ya predefinidas en el espacio MNI y aplicarlas al PET.

Movemos el FBB a espacio MNI

Aplicamos las mascaras predefinidas

wrapper aqui

Probando,

[tester@detritus ftest]$ fbb_cl_metrics.pl ftest
Submitted batch job 114494
Submitted batch job 114495
Submitted batch job 114496
Submitted batch job 114497
Submitted batch job 114498
Submitted batch job 114499
Submitted batch job 114500
Submitted batch job 114501
Submitted batch job 114502
[tester@detritus ftest]$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
            114502      fast fbb_metr   tester PD       0:00      1 (Dependency)
            114494      fast fbb_metr   tester  R       0:05      1 brick01
            114495      fast fbb_metr   tester  R       0:05      1 brick01
            114496      fast fbb_metr   tester  R       0:05      1 brick01
            114497      fast fbb_metr   tester  R       0:05      1 brick01
            114498      fast fbb_metr   tester  R       0:05      1 brick01
            114499      fast fbb_metr   tester  R       0:05      1 brick01
            114500      fast fbb_metr   tester  R       0:05      1 brick01
            114501      fast fbb_metr   tester  R       0:05      1 brick01
[tester@detritus ftest]$ cat ftest_fbb_cl.csv 
Subject; SUVR; Centilod
0001;1.00271096299574;-1.0841382764531
0002;1.08167189095349;11.0284680722648
0003;0.963942873898553;-7.031163143962
0004;0.933378913630616;-11.7196746490635
0005;1.27457104078858;40.6191976569684
0006;1.53901720157991;81.1852387223582
0007;0.87767935765707;-20.2639865354055
0008;1.05472229765736;6.89440046063902

Formato de Resultados

Aqui se trata de sintetizar las ideas de Formato de entrega de los resultados de analisis

El objetivo es proporcionar los resultados finales del analisis en el formato de intercambio para neurologia. Basicamente un archivo de MS excel con los datos de ID en proyecto, numero de historia clinica, fecha del scan y datos generales del procesamiento.

Datos del sujeto

Es necesario diponer primero de un archivo con este formato,

[osotolongo@detritus facehbi]$ head gdata_mri.csv
PSubject,Subject,Interno,Date
F001,0001,20090806,05.12.2014
F002,0002,20131084,05.12.2014
F003,0003,20130456,11.12.2014
F004,0004,20080130,12.12.2014
F005,0005,20141272,07.01.2015
F006,0006,20141107,23.12.2014
F007,0007,20080716,19.12.2014
F008,0008,20131483,20.12.2014
F009,0009,20141277,10.01.2015

Este es el archivo guia para enlazar los resultados. Los datos son, en orden,

  • PSubject: ID del sujeto en el proyecto
  • Subject: ID de procesamiento
  • Interno: Numero de hisoria clinica
  • Date: Fecha del scanner

Informacion del procesamiento

La informacion del procesamiento consiste en datos de contacto de quien realiza el procesamiento, datos de contacto de quien realiza el scanner, info de general de las variables y demas notas que se quieran agregar. Esta sera la portada del archivo de datos.

Ejemplo,

[osotolongo@detritus facehbi]$ cat info_page_dti.csv
,,
,,
Base de datos:,O. Sotolongo-Grau,asqwerty@gmail.com
Extracción de métricas:,O. Sotolongo-Grau,asqwerty@gmail.com
col. Externa:,Assumpta Vivas-Larruy,assumpta.vivas@gmail.com
,Miguel Ángel Tejero,mtejeroc@corachan.com

Directorio de resultados

Todos los resultados que se deseen incluir en el archivo de salida deben estar dentro del mismo directorio, creado exprofeso, y en correcto formato CSV. Elnombre del archivo sera el nombre de la hojka de datos. Los archivos de salida del pipeline no salen en este formato por lo que habra que convertirlos. Ejemplo,

[osotolongo@detritus facehbi]$ sed 's/;/,/g' facehbi_dti_DMN.csv > dti_results/DMN.csv
[osotolongo@detritus facehbi]$ sed 's/;/,/g' facehbi_dti_FPCustom.csv > dti_results/FPCustom.csv

Uniendo todo

Lo que se debe hacer ahora es unir todos los datos y convertirlos ordenados.

el procedimiento es sencillo pero lleva mucho control de errores

Call

Para ejecutarlo se deben incluir todos los datos en la linea de comandos,

  • -i: directorio con los resultados (obligatorio)
  • -o: nombre del rchivo de salida
  • -g: nombre del archivo guia (obligatorio)
  • -s: nombre del archivo de informacion general
  • nombre del proyecto (obligatorio)

Ejemplo,

[osotolongo@detritus facehbi]$ metrics2xls.pl -i dti_results -g gdata_mri.csv -o dti_tracks.xlsx -s info_page_dti.csv facehbi

y ya esta, la salida en un archivo excel con todos los datos.

Interactuando con XNAT

Operaciones mas comunes

Ver la pagina de Operaciones con XNAT para los metodos integrados en el pipeline. :IMPORTANT:

Otras notas y metodos

Uno de los objetivos de la nueva version del pipeline es permitir una interaccion con la plataforma de XNAT de Fundacio ACE. Lo primero que se ha hecho con el XNAT es implementar el procesamiento de FS automatizado.

Primero, si no se ha corrido el procesamiento FS, se ha de hacer algo como,

[osotolongo@detritus ~]$ xnatapic run_pipeline --project_id epad --pipeline RunFreesurfer

Nota: los procesos de XNAT estan consumiendo una cantidad muy grande de memoria. He tenido que poner cada procesamiento FS con 16 CPUs. Esto está en revision, deberia poedr cambiarse a 4 o 2 pronto.

Debuging XNAT

Y ahora es cuando debemos de intentar bajar los datos de XNAT. Hay dos posibilidades, bajar los resultados de la segmentacion o bajar el procesamiento completo, que esta almacenado en un archivo comprimido.

Integrando resultados de XNAT con el pipeline

Para operar con los resultados hay que presentarlos de la manera usual. Es decir, tener los resultados no por experimento, si no por sujeto. Empiezo por obtener una lista de los sujetos del proyecto.

[osotolongo@brick03 mopead]$ xnatapic list_subjects --project_id facemopead --label > xnat_subjects.list 

Ahora puedo tener el experimento que quiero vincular con cada sujeto

[osotolongo@brick03 mopead]$ for x in `awk -F"," '{print $2}' xnat_subjects.list`; do e=$(xnatapic list_experiments --project_id facemopead --subject_id ${x} --modality MRI --label); echo "${x},${e}"; done > xnat_sub_exp.list

Intento bajar ahora uno de los archivos de estadistica,

[osotolongo@brick03 mopead]$ for l in `cat xnat_sub_exp.list`; do s=$(echo ${l} | awk -F"," '{print $1}'); e=$(echo ${l} | awk -F"," '{print $2}'); mkdir -p fsresults/${s}; xnatapic get_fsresults --experiment_id ${e} --stats aseg fsresults/${s}/; done

y ya puedo obtener los datos de los que se han procesados con exito,

[osotolongo@brick03 mopead]$ ls fsresults/*/aseg.stats | head
fsresults/4NKAYEW6/aseg.stats
fsresults/4THMLQBG/aseg.stats
fsresults/52JAYALW/aseg.stats
fsresults/58H3I76A/aseg.stats
fsresults/5DBJ2MX6/aseg.stats
fsresults/6599YP5C/aseg.stats
fsresults/6HBBACWP/aseg.stats
fsresults/6WYXPIKZ/aseg.stats
fsresults/8BMXAD87/aseg.stats

Ahora digamos que quiero uno de los volumenes calculados,

[osotolongo@brick03 mopead]$ for x in `ls fsresults/*/aseg.stats`; do s=$(echo ${x} | awk -F"/" '{print $2}'); v=$(grep "Left-Hippocampus" ${x} | awk '{print $4}'); echo "${s},${v}"; done | sed '1i"Subject,Left-Hippocampus"' > Left-Hippocampus.csv
[osotolongo@brick03 mopead]$ head Left-Hippocampus.csv
"Subject,Left-Hippocampus"
4NKAYEW6,3589.8
4THMLQBG,3312.0
52JAYALW,3326.9
58H3I76A,4106.6
5DBJ2MX6,3605.8
6599YP5C,2830.5
6HBBACWP,3470.4
6WYXPIKZ,4654.0
8BMXAD87,3592.4

Sujetos no procesados

Nota: Para quee sto funcione hay que ir a la web, editar el pipeline integrado en el proyecto y desmarcar la opcion de ejecutar automaticamente.

Para sacar los sujetos no procesados,

[osotolongo@brick03 mopead]$ grep -v "`cat fs_done.txt`"  xnat_sub_exp.list
24A8DVSH,XNAT5_E01002,D18333315
24N223T4,XNAT5_E01003,D18576983
2Y5ZIMKM,XNAT5_E01008,D18321055
6AIIS7D5,XNAT5_E01009,D18588951
6VP6N35Q,XNAT5_E01010,D19153162
8ENC33XS,XNAT5_E01011,D19233893
NZK7C6UM,XNAT5_E01025,D18566445
VC89973N,XNAT5_E01033,D19166883
U9Q6VGEC,XNAT5_E01103,D18357795
ZCJHU7Z7,XNAT5_E01109,D18310934
27FAKA55,XNAT5_E01004,D18323257
XX8KXDHY,XNAT5_E01130,D19155452

y para lanzarlos,

[osotolongo@brick03 mopead]$ grep -v "`cat fs_done.txt`"  xnat_sub_exp.list | awk -F"," '{print $2}'> faltan.txt
[osotolongo@brick03 mopead]$ for x in `cat faltan.txt`; do xnatapic run_pipeline --project_id facemopead --pipeline RunFreesurfer --experiment_id ${x}; done 
[osotolongo@brick03 mopead]$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON) 
             12969      fast RunFrees     xnat  R      52:20      1 brick01 
             12970      fast RunFrees     xnat  R       0:09      1 brick01 
             12971      fast RunFrees     xnat  R       0:05      1 brick01 
             12972      fast RunFrees     xnat  R       0:05      1 brick01 
             12973      fast RunFrees     xnat  R       0:05      1 brick01 
             12974      fast RunFrees     xnat  R       0:05      1 brick02 
             12975      fast RunFrees     xnat  R       0:05      1 brick02 
             12976      fast RunFrees     xnat  R       0:05      1 brick02 
             12977      fast RunFrees     xnat  R       0:05      1 brick02 
             12978      fast RunFrees     xnat  R       0:05      1 brick02 
             12979      fast RunFrees     xnat  R       0:05      1 brick05 
             12980      fast RunFrees     xnat  R       0:05      1 brick05 
             12981      fast RunFrees     xnat  R       0:05      1 brick05

Obtener la estructura de archivos de FS

Primero tengo que obtener, para cada sujeto, el experiment_id. Esto se hace escogiendo uno cualquiera de los DCMs del sujeto y obteniendo el “PatientID” con dckey.

osotolongo@detritus:f5cehbi$ find /nas/corachan/f5cehbi/F001 -type f | head -1
/nas/corachan/f5cehbi/F001/F001____.SR.RM_CRANEO_PROT_.1.1.2020.03.07.15.56.02.523.38529109.dcm
osotolongo@detritus:f5cehbi$ dckey -k "PatientID" /nas/corachan/f5cehbi/F001/F001____.SR.RM_CRANEO_PROT_.1.1.2020.03.07.15.56.02.523.38529109.dcm
D99338338 

ahora obtenemos el ID de XNAT,

osotolongo@detritus:f5cehbi$ xnatapic list_experiments --project_id f5cehbi --label | grep D99338338
XNAT_E00104,D99338338

entonces ya podemos descargar el tgz sin problemas,

osotolongo@detritus:f5cehbi$ xnatapic get_fsresults --experiment_id XNAT_E00104 --all-tgz ./
osotolongo@detritus:f5cehbi$ ls D99338338.tar.gz 
D99338338.tar.gz

y tendriamos que descomprimir esto en /nas/data/subjects/f5cehbi_0001 .

Procesos YA Integrados en XNAT

Los procedimientos de segmentacion de Freesurfer y obtención de centiloide a partir del PET se delegan en XNAT. Estos pueden hacerse aun en el pipeline tradicional (y no esta planificado eliminarlos de ahi) pero en XNAT puede hacerse mas desatendido. Lo unico que ha de buscarse e una forma facil de extraer los resultados e interactuar con los datos.

Segmentación Freesurfer

La segmentacion de Freesurfer se realiza automaticamente por medio del pipeline RunFreesurfer al subir las MRI. O se lanza mediante algo como,

$ xnatapic run_pipeline --project_id f5cehbi --pipeline RunFreesurfer --experiment_id XNAT5_E00752

Los resultados quedan almacenados en el servidor de XNAT.

Obtener estadisticas

Para obtener las estadisticas de un proceso utilizamos xnat_pullfs.pl.

Las opciones de input del script son,

  • -s : indica que estadisticas queremos sacar (default: aseg)
  • -p : nombre del proyecto, igual a -x, se mantiene por compatibilidad
  • -x : nombre del proyecto
  • -o : archivo de output (default: STDOUT)

Lo primero que hace el script es sacar los sujetos que estan definidos en XNAT,

$ xnatapic list_subjects --project_id f5cehbi --label > xnat_subjects.list

e intentar averiguar los ID de los experimentos para cada MRI correspondiente

$ 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

Ahora hago un join de xnat_subjects.list y xnat_subject_mri.list y este es el archivo base segun el cual interrogare a XNAT y guardare los resultados.

Ahora, para cada experimento de XNAT debo pedir el archivo de estadisticas que deseo, y guardarlas por separado para cada sujeto.

$ xnatapic get_fsresults --experiment_id ${var_experimento} --stats ${var_stats} ${tmp_subject_dir}

Ya solo tengo que parsear el archivo para sacar los datos que me interesan. Esto no es complicado y lo he hecho con greps directamente pero el formato cambia entre archivos por lo que hay que parsear distinto cada vez. A lo mejor no lo mas eficiente pero si lo mas sencillo, es añadir los trozos en dependencia de que estadisticas se pidan. ( quizas lo suyo seria meter cada parser en subrutinas?)

De momento se pueden bajar la segmentacion subcortical (aseg.stats) y la parcelacion cortical (aparc.stats), no obstante el proceso para bajar otras stats no deberia diferir mucho y puede irse añadiendo a demanda, ya que tenemos estas de plantilla.

Obtener directorio completo de FS

Para hacer esto debemos tener creado el proyecto local con la configuracion definida en $HOME/.config/neuro y un archivo project_mri.csv definiendo los ID y label de los sujetos. Ejemplo,

[osotolongo@brick03 f5cehbi]$ head f5cehbi_mri.csv 
0001;F001
0002;F005
0003;F006
0004;F007
0005;F009
0006;F010
0007;F014
0008;F015
0009;F023
0010;F024

A veces quereoms hacer procedimientos que dependen de tener la segmentacion de FS. Para ello podemos utlizar el script xnat_getfs.pl

Despues de tener enlazados el sujeto local con el experiemento local, se trata de bajar todo el directorio de procesamiento de FS y descomprimirlo a un directorio local. El directorio local debe ser el que se espera que exista si ha ejecutado el pipeline de FS localmente.

Deberia ser algo como: ${SUBJECTS_DIR}/${project_name}_${img_ID}/.

Asi que hay que hacer,

$ xnatapic get_fsresults --experiment_id ${var_experimento} --all-tgz ${tmp_subject_dir}
$ tar xzvf ${tmp_subject_dir}/*.tgz -C ${SUBJECTS_DIR}/${project_name}_${img_ID}/ --transform='s/${XNAT_subject_ID}//' --exclude=fsaverage

y quedan todos los archivos de FS en su lugar.


Para poner un ejemplo concreto, si miramos los datos del sujeto F014 en el proyecto local f5cehbi,

[osotolongo@brick03 f5cehbi]$ grep F014 f5cehbi_mri.csv
0007;F014

al ejecutar el script nos quedarian los datos de la segmentacion del experimento XNAT_E00110 en el directorio /nas/data/subjects/f5cehbi_0007/ .

[osotolongo@brick03 f5cehbi]$ ls /nas/data/subjects/f5cehbi_0007/
label  mri  scripts  stats  surf  tmp  touch  trash

registro PET y calculo del centiloide

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 en XNAT, se ignora si existe -x. Solo existe por compatibilidad.
  • -x : nombre del proyecto en XNAT
  • -o : archivo de salida (default STDOUT)
neuroimagen/pipe04.txt · Last modified: 2021/07/30 10:46 by osotolongo