User Tools

Site Tools


neuroimagen:pipe05

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
neuroimagen:pipe05 [2022/01/12 10:07] – [Segmentación Freesurfer] osotolongoneuroimagen:pipe05 [2022/06/17 07:43] (current) – [Non image data] osotolongo
Line 1: Line 1:
 ====== Pipeline de Procesamiento de FACE v0.5 ====== ====== Pipeline de Procesamiento de FACE v0.5 ======
  
-Nueva version en etapa de planificacion. 
  
 ===== Porque una nueva version? ===== ===== Porque una nueva version? =====
  
-  * // Introducir containers. Preparar el pipeline para utilizarlo en Microsoft Azure, AWS o similar. Todas las llamadas a FSL, Freesurfer o ANTs deben sustituirse por una llamada a containers. // **Nota: De momento no parece ser necesario y los containers de FSL o Fs pueden ser mas complicados de lo que parecen** DELETEME 
   * <del>Modularizacion de las llamadas a SLURM. Los script sbatch han de crearse y lanzarse a traves del modulo SLURM.pm. Deben reescribirse los scripts.</del> DONE ([[neuroimagen:neuro4.pm|Modulos del pipeline]])   * <del>Modularizacion de las llamadas a SLURM. Los script sbatch han de crearse y lanzarse a traves del modulo SLURM.pm. Deben reescribirse los scripts.</del> DONE ([[neuroimagen:neuro4.pm|Modulos del pipeline]])
   * Reparalelizar los procesos de registro, y extraccion de metricas PET en modulos mas pequeños :?:   * Reparalelizar los procesos de registro, y extraccion de metricas PET en modulos mas pequeños :?:
Line 13: Line 11:
   * <del>Usar Freesurfer 7.2 [[https://surfer.nmr.mgh.harvard.edu/fswiki/ReleaseNotes|Release Notes]]</del> DONE ([[neuroimagen:freesurfer7|Update Freesurfer 7.2]])   * <del>Usar Freesurfer 7.2 [[https://surfer.nmr.mgh.harvard.edu/fswiki/ReleaseNotes|Release Notes]]</del> DONE ([[neuroimagen:freesurfer7|Update Freesurfer 7.2]])
  
-===== TODO =====  
  
-  - acenip Containers? DELETEME 
- 
-{{ :neuroimagen:map_container_build.png?600 |}} 
  
 ===== Dependencias ===== ===== Dependencias =====
Line 28: Line 22:
   * fmriprep: https://fmriprep.org/en/stable/   * fmriprep: https://fmriprep.org/en/stable/
   * dicom3tools: https://www.dclunie.com/dicom3tools.html (//no estrictamente necesario pero conveniente//)   * dicom3tools: https://www.dclunie.com/dicom3tools.html (//no estrictamente necesario pero conveniente//)
-  * xnatapic: https://github.com/asqwerty666/xnatapic (para las operaciones con XNAT)+  * xnatapic: https://github.com/asqwerty666/xnatapic (para las operaciones con XNAT). Intentando eliminar estas dependencias
  
 ===== DB ===== ===== DB =====
Line 166: Line 160:
 </code> </code>
  
 +==== Manipular las rutas ====
 +
 +La configuración del proyecto puede ser modificada editando el archivo de configuración directamente o utilizando la herramienta //pipeconf.pl//, que puede mostrar, editar una variable o incluso crear un nuevo archivo con los valores por defecto. **Ejemplos:**,
 +
 +  * Mostrar configuración
 +<code bash>
 +$ pipeconf.pl -p f5cehbi -r
 +BIDS = /old_nas/f5cehbi/bids
 +DATA = /old_nas/f5cehbi
 +PET = /nas/data/f5cehbi/raw_tau/PI2620
 +SRC = /nas/data/f5cehbi/raw
 +WORKING = /old_nas/f5cehbi/working
 +XNAME = f5cehbi
 +</code>
 +  * Editar configuración
 +<code bash>
 +$ pipeconf.pl -p f5cehbi -a XNAME=f2cehbi
 +$ pipeconf.pl -p f5cehbi -r
 +BIDS = /old_nas/f5cehbi/bids
 +DATA = /old_nas/f5cehbi
 +PET = /nas/data/f5cehbi/raw_tau/PI2620
 +SRC = /nas/data/f5cehbi/raw
 +WORKING = /old_nas/f5cehbi/working
 +XNAME = f2cehbi
 +</code>
 +  * Crear nuevo archivo
 +<code bash>
 +$ pipeconf.pl -p test -c /nas/data/test
 +[osotolongo@brick03 acenip]$ pipeconf.pl -p test -r
 +BIDS = /nas/data/test/bids
 +DATA = /nas/data/test
 +SRC = /nas/data/test/raw
 +WORKING = /nas/data/test/working
 +XNAME = test
 +</code>
 +
 +Con este conjunto de operaciones basta para manipular la configuración de cualquier proyecto.
 +
 +==== Recuperar DICOMs de XNAT ====
 +
 +Aunque se supone que tenemos todos los DICOM en el server, lo cierto es que lo que nos suben puede estar muy desordenado. Para llevar las imagenes a XNAT ya nos hemos tomado el trabajo de ordenar todo y en XNAT deberia estar el proyecto muy ordenado.
 +
 +Luego, la idea es que una vez que el proyecto en XNAT este cerrado, podemos recrear la colección de DICOMs en el directorio SRC del proyecto //local//. El script [[https://github.com/asqwerty666/acenip/blob/main/bin/xnat2raw.pl|xnat2raw.pl]] recorre los sujetos del projecto XNAT y baja los DICOM de cada experimento (MRI **o** PET) y los guarda en un directorio diferenciado utilizando la funcion //xget_dicom// de la biblioteca [[https://github.com/asqwerty666/acenip/blob/main/lib/XNATACE.pm|de interacción con la API]] (Ver [[https://github.com/asqwerty666/acenip/blob/main/doc/XNATACE.md|markdown docs]]).
 +
 +Por ejemplo, para el proyecto local //unidad//, el archivo de configuración,
 +
 +<code>
 +[osotolongo@brick03 mri_face]$ cat ~/.config/neuro/unidad.cfg
 +BIDS = /old_nas/mri_face/bids
 +DATA = /old_nas/mri_face
 +SRC = /old_nas/mri_face/raw
 +WORKING = /old_nas/mri_face/working
 +XNAME = tester
 +</code>
 +
 +nos dice que debe enlazarse con el proyecto XNAT //tester//. Asi que al ejecutar,
 +
 +<code bash>
 +[osotolongo@brick03 mri_face]$ xnat2raw.pl -p unidad
 +</code>
 +
 +se crea un directorio por sujeto del proyecto dentro del //SRC//,
 +
 +<code bash>
 +[osotolongo@brick03 mri_face]$ ls raw/
 +20050456  20081210  20100678
 +</code>
 +
 +y el archivo CSV, //unidad_MRI.csv//,
 +
 +<code>
 +[osotolongo@brick03 mri_face]$ cat unidad_MRI.csv
 +0001,20081210
 +0002,20100678
 +0003,20050456
 +</code>
  
 +que podemos utilizar para crear facilmente la DB del proyecto y ejecutar la conversion a BIDS.
 ===== DCM2BIDS ===== ===== DCM2BIDS =====
  
Line 506: Line 577:
 [[neuroimagen:visualqc_freesurfer_xnat|Realizar el QC a la segmentacion de Freesurfer de los sujetos analizados en XNAT]] [[neuroimagen:visualqc_freesurfer_xnat|Realizar el QC a la segmentacion de Freesurfer de los sujetos analizados en XNAT]]
  
-===== Bajar proyecto de XNAT =====+==== Bajar proyecto de XNAT ====
  
 Una a vez procesada la segmentación de Freesurfer, si queremos hacer algo mas complejo, hemos de bajar ordenadamente el directorio de procesamiento de cada sujeto. El primer paso sería crear el proyecto local, pero no es necesario (al menos en principio) identificar la posicion de las imagenes RAW. Es decir que practicamente se puede hacer a mano a partir del listado de XNAT. Una a vez procesada la segmentación de Freesurfer, si queremos hacer algo mas complejo, hemos de bajar ordenadamente el directorio de procesamiento de cada sujeto. El primer paso sería crear el proyecto local, pero no es necesario (al menos en principio) identificar la posicion de las imagenes RAW. Es decir que practicamente se puede hacer a mano a partir del listado de XNAT.
Line 2092: Line 2163:
 [osotolongo@brick03 facehbi]$ for x in `cat xnat_pet_experiments.list`; do xnatapic run_pipeline --project_id facehbi --pipeline RegisterPETwithMRImatch --experiment_id ${x}; done [osotolongo@brick03 facehbi]$ for x in `cat xnat_pet_experiments.list`; do xnatapic run_pipeline --project_id facehbi --pipeline RegisterPETwithMRImatch --experiment_id ${x}; done
 </code> </code>
 +
 +==== Extraer resultados ====
 +
 +La idea fundamental aqui es obtener los valores de SUVR y centiloide calculados en XNAT. Estos pueden obtenerse con,
 +
 +<code bash>
 +$ xnatapic get_registration_report --project_id f5cehbi --output xnat_pet_results.csv
 +</code>
 +
 +y esto vamos a limpiarlo un poco,
 +
 +<code bash>
 +$ awk -F"," '{print $2","$6","$7}' xnat_pet_results.csv | sed 's/"//g' | tail -n +2 | sort -t, -k 1 > pet.results
 +</code>
 +
 +La lista de sujetos del proyecto se obtiene con,
 +
 +<code bash>
 +$  xnatapic list_subjects --project_id f5cehbi --label > xnat_subjects.list
 +</code>
 +
 +Esto se puede ordenar rapidamente haciendo,
 +
 +<code bash>
 +$ sort -t, -k 1 xnat_subjects.list > xnat_subjects_sorted.list
 +</code>
 +
 +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,
 +
 +<code bash>
 +$ join -t, xnat_subjects_sorted.list pet.results | sort -t, -k 2 | awk -F"," '{if ($3) print $2";"$3";"$4}' | sed '1iSubject;SUVR;Centiloid'"
 +</code>
 +
 +Todo esto se resume en el script [[https://github.com/asqwerty666/acenip/blob/main/bin/xnat_pullcl.pl | 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)
 +
  
  
Line 2288: Line 2398:
 ---- ----
  
-==== Extraer resultados ==== 
- 
-La idea fundamental aqui es obtener los valores de SUVR y centiloide calculados en XNAT. Estos pueden obtenerse con, 
- 
-<code bash> 
-$ xnatapic get_registration_report --project_id f5cehbi --output xnat_pet_results.csv 
-</code> 
- 
-y esto vamos a limpiarlo un poco, 
- 
-<code bash> 
-$ awk -F"," '{print $2","$6","$7}' xnat_pet_results.csv | sed 's/"//g' | tail -n +2 | sort -t, -k 1 > pet.results 
-</code> 
- 
-La lista de sujetos del proyecto se obtiene con, 
- 
-<code bash> 
-$  xnatapic list_subjects --project_id f5cehbi --label > xnat_subjects.list 
-</code> 
- 
-Esto se puede ordenar rapidamente haciendo, 
- 
-<code bash> 
-$ sort -t, -k 1 xnat_subjects.list > xnat_subjects_sorted.list 
-</code> 
- 
-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, 
- 
-<code bash> 
-$ join -t, xnat_subjects_sorted.list pet.results | sort -t, -k 2 | awk -F"," '{if ($3) print $2";"$3";"$4}' | sed '1iSubject;SUVR;Centiloid'" 
-</code> 
- 
-Todo esto se resume en el script [[https://github.com/asqwerty666/acenip/blob/main/bin/xnat_pullcl.pl | 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) 
  
 ===== PET-tau ===== ===== PET-tau =====
Line 2385: Line 2458:
 </code> </code>
  
-y para cada experiento gurdamos los resultados del analisis de FS en un directorio,+y para cada experiento guardamos los resultados del analisis de FS en un directorio,
  
 <code perl> <code perl>
Line 2401: Line 2474:
 my $fsout = $fsoutput.'/fsrecon'; my $fsout = $fsoutput.'/fsrecon';
 make_path $fsout; make_path $fsout;
-</code perl>+</code>
  
 podemos utilizar las sintaxis de la funcion //fs_file_metrics()// almacenadas en [[neuroimagen:neuro4.pm#fsmetricspm|FSMetrics.pm]]. //L ultima version actualizada, siempre [[https://github.com/asqwerty666/acenip/blob/main/lib/FSMetrics.pm|en github]]//. podemos utilizar las sintaxis de la funcion //fs_file_metrics()// almacenadas en [[neuroimagen:neuro4.pm#fsmetricspm|FSMetrics.pm]]. //L ultima version actualizada, siempre [[https://github.com/asqwerty666/acenip/blob/main/lib/FSMetrics.pm|en github]]//.
Line 2713: Line 2786:
 {{:neuroimagen:2020-01-15-112519_grim.png|}} {{:neuroimagen:2020-01-15-112519_grim.png|}}
  
 +===== Non image data =====
  
 +==== Datos demograficos ====
  
 +Una de las cosas que hace a XNAT una buena herramienta es la capacidad de guardar datos de cualquier tipo. Vamos a intentar guardar los datos mas relevantes para el procesamiento.
  
 +Por ejemplo, los [[neuroimagen:mriface_reports#datos_demograficos|datos demograficos basicos pueden guardarse usando un CSV]]
  
 +Para recuperar la edad debemos utilizar la API. 
  
 +<code perl xnat_get_age.pl>
 +use strict;
 +use warnings;
 +use XNATACE qw(xget_session xget_subjects xget_mri xget_exp_data xget_sbj_demog);
 +use JSON;
 +use Date::Manip;
 +use Math::Round;
  
 +my $xprj;
 +my $oxfile;
 +while (@ARGV and $ARGV[0] =~ /^-/) {
 +        $_ = shift;
 +        last if /^--$/;
 +        if (/^-o/) {$oxfile = shift; chomp($oxfile);}
 +        if (/^-x/) {$xprj = shift; chomp($xprj);}
 +}
 +die "Should supply XNAT project" unless $xprj;
 +$oxfile = $xprj.'_age_data.csv' unless $oxfile;
 +my %xconf = xget_session();
 +my $jid = $xconf{'JSESSION'};
 +my %subjects = xget_subjects($xconf{'HOST'}, $xconf{'JSESSION'}, $xprj);
 +foreach my $sbj (sort keys %subjects){
 +        $subjects{$sbj}{'experiment'} = xget_mri($xconf{'HOST'}, $xconf{'JSESSION'}, $xprj, $sbj);
 +        my $mri_date = xget_exp_data($xconf{'HOST'}, $xconf{'JSESSION'}, $subjects{$sbj}{'experiment'}, 'date');
 +        my $dob = xget_sbj_demog($xconf{'HOST'}, $xconf{'JSESSION'}, $sbj, 'dob');
 +                if ($mri_date and $dob){
 +                        my $ddif = Delta_Format(DateCalc(ParseDate($dob),ParseDate($mri_date)),2,"%hh")/(24*365.2425);
 +                        $subjects{$sbj}{'age'} = nearest(0.1, $ddif);
 +                        print "$subjects{$sbj}{'label'}, $subjects{$sbj}{'age'}\n";
 +                }
 +}
 +open ODF, ">$oxfile";
 +print ODF "Subject_ID,AGE\n";
 +foreach my $subject (sort keys %subjects){
 +        if(exists($subjects{$subject}{'age'})){
 +                print ODF "$subjects{$subject}{'label'},$subjects{$subject}{'age'}\n";
 +        }
 +}
 +close ODF;
 +</code>
  
  
 +La magia aqui la hace la función //xget_sbj_demog// de la biblioteca [[https://github.com/asqwerty666/acenip/blob/main/lib/XNATACE.pm|XNATACE.pm]],
 +
 +<code perl>
 +sub xget_sbj_demog {
 +        my @xdata = @_;
 +        my $crd = 'curl -f -X GET -b "JSESSIONID='.$xdata[1].'" "'.$xdata[0].'/data/subjects/'.$xdata[2].'?format=json" 2>/dev/null';
 +        my $jres = qx/$crd/;
 +        my $xfres = decode_json $jres;
 +        #dump $xfres->{items}[0];
 +        return $xfres->{items}[0]{children}[0]{items}[0]{data_fields}{$xdata[3]};
 +}
 +</code>
  
 +que permite recuperar los datos demograficos que esten almacenados. En este caso es el //dob// pero podria ser //gender// o cualquier otro que hayamos almacenado.
  
 +==== Resultados de procesamiento ====
  
 +Tambien podemos almacenar los resultados del procesamiento de imagen que se hayan hecho con herramientas ajenas a XNAT. Por ejemplo vamos a ver como almacenamos los [[neuroimagen:pgs|valores WMH calculados desde T2w]].
  
  
neuroimagen/pipe05.1641982031.txt.gz · Last modified: 2022/01/12 10:07 by osotolongo