Table of Contents
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
- dcm2bids: https://pypi.org/project/dcm2bids/
- Freesurfer: https://surfer.nmr.mgh.harvard.edu/
- fmriprep: https://fmriprep.org/en/stable/
- dicom3tools: https://www.dclunie.com/dicom3tools.html (no estrictamente necesario pero conveniente)
DB
El primer punto a considerar es la separacion correcta entre el software y los datos. Cada proyecto se caracteriza por,
- NAME: El nombre del proyecto
- SRC_PATH: La ruta donde se encuentran los archivos fuentes del proyecto (DICOMs)
- PROJ_PATH: La ruta donde se ejecuta el procesamiento, se guardan archivos intemedios y resultados.
Cada sujeto se caracteriza por,
- PID: identificador dentro del proyecto. Enlaza todos los datos del sujeto entre si.
- NID: identificador dentro del procesamiento de neuroimagen. Identifica los datos de cada sujeto dentro del proyecto.
- 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,
- make_proj.pl → creacion del proyecto
- update_mri_db.pl → creacion y actualizacion de la DB del proyecto.
- 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/
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.
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 . O a lo mejor no!
[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!
DTI preproc
El procesamiento no cambia mucho del que se realiza en la version anterior. No obstante, al tomar los archivos del formato BIDS, la estructura en que se guarda es por completo abstracta del software y la comprobaicon de los archivos (y posterior toma de decisiones) se puede individualizar en una subrutina externa.
Nota: deben existirlos archivos acqparams.txt y dti_index.txt. Ver como hacer el index.txt y el acqparams.txt
El registro es ahora un poco mas sencillo
Los procedimientos individuales de registro si han de cambiarse poco, mas que nada el input, lo demas es estrictamente igual
[tester@detritus ptest]$ dti_reg.pl ptest [tester@detritus ptest]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 114225 cuda dti_reg_ tester PD 0:00 1 (Resources) 114226 cuda dti_reg_ tester PD 0:00 1 (Priority) 114227 cuda dti_reg_ tester PD 0:00 1 (Priority) 114228 cuda dti_reg_ tester PD 0:00 1 (Priority) 114229 cuda dti_reg_ tester PD 0:00 1 (Priority) 114230 cuda dti_reg_ tester PD 0:00 1 (Priority) 114231 devel dti_reg_ tester PD 0:00 1 (Dependency) 114223 cuda dti_reg_ tester R 0:05 1 brick01 114224 cuda dti_reg_ tester R 0:05 1 brick01 [tester@detritus ptest]$ ls working/0001_* working/0001_brain.nii.gz working/0001_dti_L1.nii.gz working/0001_dti_MO.nii.gz working/0001_dti_V3.nii.gz working/0001_mni_to_b0.nii.gz working/0001_dti_brain_mask.nii.gz working/0001_dti_L2.nii.gz working/0001_dti_S0.nii.gz working/0001_hifi_b0.nii.gz working/0001_t1_b0.nii.gz working/0001_dti_data.nii.gz working/0001_dti_L3.nii.gz working/0001_dti_V1.nii.gz working/0001_JHU_labels.nii.gz working/0001_t1_reoriented.nii.gz working/0001_dti_FA.nii.gz working/0001_dti_MD.nii.gz working/0001_dti_V2.nii.gz working/0001_JHU_tracts.nii.gz
Probando el -cut (que esta reescrito completo),
[tester@detritus ptest]$ cat repdti.txt 0004 [tester@detritus ptest]$ dti_reg.pl -cut repdti.txt ptest [tester@detritus ptest]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 114233 devel dti_reg_ tester PD 0:00 1 (Dependency) 114232 cuda dti_reg_ tester R 6:25:12 1 brick01
DTI registro, QC
DTI metrics (Atlas)
[tester@detritus ptest]$ dti_metrics.pl -a1 ptest [tester@detritus ptest]$ dti_metrics.pl -a2 ptest [tester@detritus ptest]$ ls ptest_dti_* ptest_dti_labels.csv ptest_dti_labels_results.tgz ptest_dti_tracts.csv ptest_dti_tracts_results.tgz
DTI Tractography
La tractografia puede hacerse utilizando regiones definidas en la reconstruccion de FS o un atlas externo. En este caso el atlas externo escogido es el de la UofM.
Voy a simplificar un poco el procesamiento anterior porque hay muchas cosas que no se usan. En caso de necesitarlas ya se volveran a implementar.
Primero el bedpostx y el probtrackx.
- Los dos modos de procesamiento que hay implementados tienen identico resultado. Basta con dejar uno (el mas rapido o sencillo) y nos quitamos una variable de encima.
- Pasamos el registro de ANTS a la nueva sintaxis, ya que hemos cambiado el registro y las matrices son otras
Vamos a probar uno,
[tester@brick01 ptest]$ cat dti_track.seed 10 49 [tester@brick01 ptest]$ dti_bedtrack_cuda.sh ptest 0001 /nas/data/ptest/working Copying files Making bedpostx [Tue Dec 10 10:36:45 CET 2019] --------------------------------------------- ------------ BedpostX GPU Version ----------- --------------------------------------------- subjectdir is /nas/data/ptest/working/.tmp_0001/bedpostx Making bedpostx directory structure Copying files to bedpost directory Pre-processing stage Queuing parallel processing stage ----- Bedpostx Monitor ----- 1 parts processed out of 4 2 parts processed out of 4 3 parts processed out of 4 ..... ..... ..... Done loading samples. Volume seeds volume 1 volume 2 time spent tracking: 1708 seconds save results finished Done [Tue Dec 10 11:39:22 CET 2019] [tester@brick01 ptest]$ ls /nas/data/ptest/working/0001_probtrack_out/ fdt_paths.nii.gz probtrackx.log waytotal
Esto es eterno, asi que paciencia.
Ahora con el UofM,
[tester@brick01 ptest]$ dti_bedtrack_nodes.sh ptest 0001 /nas/data/ptest/working/ /nas/software/neuro_4_0/lib/uofm/Nodes/LN/ Copying files Making bedpostx [Tue Dec 10 15:53:58 CET 2019] --------------------------------------------- ------------ BedpostX GPU Version ----------- --------------------------------------------- subjectdir is /nas/data/ptest/working/.tmp_0001/bedpostx /nas/data/ptest/working/.tmp_0001/bedpostx has already been processed: /nas/data/ptest/working/.tmp_0001/bedpostx.bedpostX. Delete or rename /nas/data/ptest/working/.tmp_0001/bedpostx.bedpostX before repeating the process. So far, so good [Tue Dec 10 15:53:58 CET 2019] Getting nodes and making masks ..... ..... ..... Done loading samples. Volume seeds volume 1 volume 2 volume 3 volume 4 volume 5 volume 6 volume 7 time spent tracking: 3714 seconds save results finished Done [Tue Dec 10 17:03:25 CET 2019] [tester@brick01 ptest]$ ls /nas/data/ptest/working/0001_probtrack_out/ fdt_paths.nii.gz probtrackx.log waytotal
Nota: Ya tengo el bedpostx hecho asi que demorara menos, pero igual son varios nodos a registrar al DTI.
Parece que todo funciona asi que nos vamos al wrapper,
[tester@detritus ptest]$ dti_track.pl ptest [tester@detritus ptest]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 114236 cuda dti_trac tester PD 0:00 1 (Resources) 114237 cuda dti_trac tester PD 0:00 1 (Priority) 114238 cuda dti_trac tester PD 0:00 1 (Priority) 114239 cuda dti_trac tester PD 0:00 1 (Priority) 114240 cuda dti_trac tester PD 0:00 1 (Priority) 114241 devel dti_trac tester PD 0:00 1 (Dependency) 114234 cuda dti_trac tester R 0:03 1 brick01 114235 cuda dti_trac tester R 0:03 1 brick01
Importante: : Al terminar, mover los directorios al path correcto,ejemplo,
for x in `ls -d working/*_probtrack_out`; do mv $x `echo $x | sed 's/out/DMN/'`;done
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
ICA individual
El procedimiento para ICA de un sujeto fue descrito ampliamente usando el protocolo MOPEAD. Aqui hay que cambiar el input y alguna cosa mas,
Ahora a probarlo,
[tester@detritus ptest]$ rs_ica_one.pl ptest Collecting needed files sbatch /nas/data/ptest/working/0001_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114303 /nas/data/ptest/working/0001_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114304 /nas/data/ptest/working/0001_rs.ica/scripts/feat4.sh sbatch /nas/data/ptest/working/0002_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114306 /nas/data/ptest/working/0002_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114307 /nas/data/ptest/working/0002_rs.ica/scripts/feat4.sh sbatch /nas/data/ptest/working/0003_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114309 /nas/data/ptest/working/0003_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114310 /nas/data/ptest/working/0003_rs.ica/scripts/feat4.sh sbatch /nas/data/ptest/working/0004_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114312 /nas/data/ptest/working/0004_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114313 /nas/data/ptest/working/0004_rs.ica/scripts/feat4.sh sbatch /nas/data/ptest/working/0005_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114315 /nas/data/ptest/working/0005_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114316 /nas/data/ptest/working/0005_rs.ica/scripts/feat4.sh sbatch /nas/data/ptest/working/0006_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114318 /nas/data/ptest/working/0006_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114319 /nas/data/ptest/working/0006_rs.ica/scripts/feat4.sh sbatch /nas/data/ptest/working/0007_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114321 /nas/data/ptest/working/0007_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114322 /nas/data/ptest/working/0007_rs.ica/scripts/feat4.sh sbatch /nas/data/ptest/working/0008_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114324 /nas/data/ptest/working/0008_rs.ica/scripts/feat2.sh sbatch --depend=afterok:114325 /nas/data/ptest/working/0008_rs.ica/scripts/feat4.sh Submitted batch job 114327 [tester@detritus ptest]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 114304 devel feat-pte tester PD 0:00 1 (Dependency) 114305 devel feat-pte tester PD 0:00 1 (Dependency) 114307 devel feat-pte tester PD 0:00 1 (Dependency) 114308 devel feat-pte tester PD 0:00 1 (Dependency) 114310 devel feat-pte tester PD 0:00 1 (Dependency) 114311 devel feat-pte tester PD 0:00 1 (Dependency) 114313 devel feat-pte tester PD 0:00 1 (Dependency) 114314 devel feat-pte tester PD 0:00 1 (Dependency) 114316 devel feat-pte tester PD 0:00 1 (Dependency) 114317 devel feat-pte tester PD 0:00 1 (Dependency) 114319 devel feat-pte tester PD 0:00 1 (Dependency) 114320 devel feat-pte tester PD 0:00 1 (Dependency) 114322 devel feat-pte tester PD 0:00 1 (Dependency) 114323 devel feat-pte tester PD 0:00 1 (Dependency) 114325 devel feat-pte tester PD 0:00 1 (Dependency) 114326 devel feat-pte tester PD 0:00 1 (Dependency) 114327 devel feat-pte tester PD 0:00 1 (Dependency) 114303 devel feat-pte tester R 0:16 1 brick01 114306 devel feat-pte tester R 0:13 1 brick01 114309 devel feat-pte tester R 0:13 1 brick01 114312 devel feat-pte tester R 0:10 1 brick01 114315 devel feat-pte tester R 0:07 1 brick01 114318 devel feat-pte tester R 0:07 1 brick01 114321 devel feat-pte tester R 0:04 1 brick01 114324 devel feat-pte tester R 0:01 1 brick01 [tester@detritus ptest]$ ls -d working/*rs.ica working/0001_rs.ica working/0002_rs.ica working/0003_rs.ica working/0004_rs.ica working/0005_rs.ica working/0006_rs.ica working/0007_rs.ica working/0008_rs.ica
so far so good
ICA grupal
Este procedimiento es mucho mas complicado pero por esa misma razon esta escrito mucho mas abstracto.
Asi que apenas hay que cambiar nada
[tester@detritus ptest]$ rs_ica_group.pl ptest Collecting needed files Counting available subjects Getting info from images Checking images and excluding wrong subjects Copying FSL files and setting directories Making global .fsf file Making individual .fsf files and scripts sbatch /nas/data/ptest/working/0001_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114328 /nas/data/ptest/working/0001_rs.ica/scripts/feat2.sh sbatch /nas/data/ptest/working/0002_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114330 /nas/data/ptest/working/0002_rs.ica/scripts/feat2.sh sbatch /nas/data/ptest/working/0003_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114332 /nas/data/ptest/working/0003_rs.ica/scripts/feat2.sh sbatch /nas/data/ptest/working/0004_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114334 /nas/data/ptest/working/0004_rs.ica/scripts/feat2.sh sbatch /nas/data/ptest/working/0005_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114336 /nas/data/ptest/working/0005_rs.ica/scripts/feat2.sh sbatch /nas/data/ptest/working/0006_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114338 /nas/data/ptest/working/0006_rs.ica/scripts/feat2.sh sbatch /nas/data/ptest/working/0007_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114340 /nas/data/ptest/working/0007_rs.ica/scripts/feat2.sh sbatch /nas/data/ptest/working/0008_rs.ica/scripts/feat1.sh sbatch --depend=afterok:114342 /nas/data/ptest/working/0008_rs.ica/scripts/feat2.sh Making global script sbatch --depend=afterok:114329,114331,114333,114335,114337,114339,114341,114343 /nas/data/ptest/working/rs.gica/scripts/feat4_ica.sh Submitted batch job 114344 [tester@detritus ptest]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 114344 devel feat-pte tester PD 0:00 1 (Dependency) 114329 devel feat-pte tester R 0:05 1 brick02 114331 devel feat-pte tester R 0:11 1 brick01 114333 devel feat-pte tester R 0:11 1 brick01 114335 devel feat-pte tester R 0:05 1 brick01 114337 devel feat-pte tester R 0:05 1 brick02 114339 devel feat-pte tester R 0:05 1 brick01 114341 devel feat-pte tester R 0:05 1 brick02 114343 devel feat-pte tester R 0:05 1 brick01
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 ..... ..... .....
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,
- Tomando la imagen integrada en el tiempo durante 20min
- 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
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,
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.
Aplicamos las mascaras predefinidas
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.
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.
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)