User Tools

Site Tools


neuroimagen:pipe05

Pipeline de Procesamiento de FACE v0.5

Nueva version en etapa de planificacion.

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. (de momento no parece ser necesario y los containers de FSL o Fs pueden ser mas complicados de lo que parecen)
  • Modularizacion de las llamadas a SLURM. Los script sbatch han de crearse y lanzarse a traves del modulo SLURM.pm. Deben reescribirse los scripts. DONE
  • Reparalelizar los procesos de registro, y extraccion de metricas PET en modulos mas pequeños
  • Integracion del proyecto en github DONE (https://github.com/asqwerty666/acenip)
  • Revisar y escribir documentacion que falta. Las ayudas estan casi vacias, Hay que retorceder un paso y escribir lo que hace cada script para evitar la duplicacion de esfuerzo. DONE
  • Mejorar la integracion con XNAT. Integrar el QC de Freesurfer a XNAT y al pipeline en lugar de ejecutar procesos de matlab.
  • Usar Freesurfer 7.2 Release Notes DONE (Update Freesurfer 7.2)

TODO

  1. acenip Containers?

DTI

TRACULA

La implementacion de Tracula en FS7.2 ha cambiado para pemitir la correcion por topup. Asi que hay que hacer un dmri.rc distinto. Entonce ahora hay que correr 7 scripts,

  • ctrac_dmri.pl –> Crear el dmri.rc
  • ctrac_prep.pl –> Preprocesamiento DTI
  • ctrac_bedp.pl –> bedtrack
  • ctrac_path.pl –> probtrack
  • ctrac_stat.pl –> Estadisticas globales
  • ctrac_metrics.pl –> Metricas medias de los principales tractos
  • ctrac_report.pl –> QC report

Aumentar la integración con XNAT

La idea funadamental aqui es que el procesamiento básico (Segmentación FS, Centiloide-FBB) va a pasar a estar automatizado en XNAT

Informe final en formato de entrega a partir de XNAT (MRI)

Necesitamos varias entradas para crear el archivo final

resultados de FS

[osotolongo@brick03 facehbi]$ ls fsrecon/*.csv
fsrecon/aparc_area_lh.csv  fsrecon/aparc_thickness_lh.csv  fsrecon/aparc_volume_lh.csv	fsrecon/aseg_stats.csv
fsrecon/aparc_area_rh.csv  fsrecon/aparc_thickness_rh.csv  fsrecon/aparc_volume_rh.csv	fsrecon/wmparc_stats.csv

a ver como podemos bajarnos esto de XNAT,

[osotolongo@brick03 facehbi]$ xnatapic list_subjects --project_id facehbi --label > xnat_subjects.csv
[osotolongo@brick03 facehbi]$ while read -r line; do stag=$(echo ${line} | awk -F"," '{print $1}'); slab=$(echo ${line} | awk -F"," '{print $2}'); xtag=$(xnatapic list_experiments --project_id facehbi --subject_id ${stag} --modality MRI --date); echo "${slab},${xtag}"; done < xnat_subjects.csv > exps_withdate.csv
[osotolongo@brick03 facehbi]$ while read -r line; do xp=$(echo ${line} | awk -F"," '{print $2}'); slab=$(echo ${line} | awk -F"," '{print $1}'); mkdir -p test_xnatfs/${xp}/stats; xnatapic get_fsresults --experiment_id ${xp} --all-stats test_xnatfs/${xp}/stats; done < exps_withdate.csv

Y ahi esta todo pero ahora hay que parsear cada archivo. Por ejemplo para asegs habria que hacer,

[osotolongo@brick03 facehbi]$ ls test_xnatfs/ > test_subjects.txt
[osotolongo@brick03 facehbi]$ asegstats2table --sd=/nas/data/facehbi/test_xnatfs/ --subjectsfile=test_subjects.txt -t test_asegs.txt
[osotolongo@brick03 facehbi]$ sed 's/\t/,/g' test_asegs.txt > test_asegs.csv

La función fs_file_metrics() en las bibliotecas del pipeline, define los archivos y comandos correspondientes para sacar los resultados. Asi que una manera es hacer esto en Perl y ejecutar todo en un espacio “no real” con todo escrito en directorios temporales. Albert Laporra

Vayamos por partes Jack the ripper,

Primero obtenemos los sujetos del proyecto,

my $subjects_list = mktemp($tmp_dir.'/sbjsfileXXXXX');
my $order = 'xnatapic list_subjects --project_id '.$study.' --label > '.$subjects_list;

ahora recorremos esta lista y sacamos las MRI asociadas y las fechas en que se han hecho,

        my ($stag, $slab) = /(.*),(.*)/;
        chomp($slab);
        $guys{$slab}{'XNATSBJ'} = $stag;
        my $xnat_order = 'xnatapic list_experiments --project_id '.$study.' --subject_id '.$stag.' --modality MRI --date';
        my $xtag = qx/$xnat_order/;
        chomp($xtag);
        my ($xnam, $xdate) = $xtag =~ /(.*),(.*)/;
        $guys{$slab}{'XNATEXP'} = $xnam;
        $guys{$slab}{'DATE'} = $xdate;

y para cada experiento gurdamos los resultados del analisis de FS en un directorio,

        my $outdir = $fsoutput.'/'.$plab.'/stats';
        make_path $outdir;
        $order = 'xnatapic get_fsresults --experiment_id '.$guys{$plab}{'XNATEXP'}.' --all-stats '.$outdir;
        system($order);

Si ahora engañamos al sistema, cambiado de sitio el SUBJECTS_DIR,

my %stats = fs_file_metrics();
$ENV{'SUBJECTS_DIR'} = $fsoutput;
my $fsout = $fsoutput.'/fsrecon';
make_path $fsout;
</code perl>
 
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]]//.
 
<code perl>
        if(exists($stats{$stat}{'active'}) && $stats{$stat}{'active'}){
                (my $order = $stats{$stat}{'order'}) =~ s/<list>/$fslist/;
                 $order =~ s/<fs_output>/$fsout/;
                system("$order");
                (my $opatt = $stat) =~ s/_/./g;
                $opatt =~ s/(.*)\.rh$/rh\.$1/;
                $opatt =~ s/(.*)\.lh$/lh\.$1/;
                $order = 'sed \'s/\t/,/g; s/^Measure:volume\|^'.$opatt.'/Subject/\' '.$fsout.'/'.$stat.'.txt > '.$fsout.'/'.$stat.'.csv'."\n";
                system($order);
        }

Ahora tenemos que bajarnos el QC, pero esto ya lo tenemos implementado en xnatapic.

my $fsqcfile = $fsoutput.'/fsqc.csv';
$order = 'xnatapic get_fsqc --project_id '.$study.' --output '.$fsqcfile;
system($order);
open QCF, "<$fsqcfile";
while (<QCF>) {
        my ($sbj, $qcok, $qcnotes) = /(.*), "(.*)", "(.*)"/;
        $qcok =~ tr/ODILg/odilG/;
        $guys{$sbj}{'FSQC'} = $qcok;
        $guys{$sbj}{'Notes'} = $qcnotes;
}
close QCF;

Ya tenemos toda la info asi que ahora lo metemos en un spreadsheet y se acabo. Ver codigo completo en github

Para sacar el report solo hay que suministrar la lista de internos y el nombre del proyecto en XNAT,

$ fs_metrics_xnat.pl -i internos.csv facehbi

El archivo de resultados tiene un nombre del estilo: facehbi_fsmetrics_20211020_170114.xls

Informe final en formato de entrega a partir de XNAT (PET-FBB)

En la nueva versión del pipeline, el procesamiento básico del FBB se hace dentro de XNAT. Todo lo necesario para realizar el informe final, excepto los codigos internos se guarda dentro de la DB de XNAT, asi que utilizando xnatapic y con un poco de organizacion se puede elaborar directamente el informe final.

Primero sacamos la lista de sujetos del proyecto,

my $subjects_list = mktemp($tmp_dir.'/sbjsfileXXXXX');
my $order = 'xnatapic list_subjects --project_id '.$study.' --label > '.$subjects_list;
system($order);

y para cada sujeto encontramos el experimento FBB correspondiente, y al mismo tiempo guardamos la fecha en que se hizo,

open SLF, "<$subjects_list";
while(<SLF>){
        my ($stag, $slab) = /(.*),(.*)/;
        chomp($slab);
        $guys{$slab}{'XNATSBJ'} = $stag;
        my $xnat_order = 'xnatapic list_experiments --project_id '.$study.' --subject_id '.$stag.' --modality PET --date';
        my $xtag = qx/$xnat_order/;
        chomp($xtag);
        if($xtag){
                my ($xnam, $xdate) = $xtag =~ /(.*),(.*)/;
                $guys{$slab}{'XNATEXP'} = $xnam;
                #$xdate =~ s/-/./g;
                $guys{$slab}{'DATE'} = $xdate;
        }
}
close SLF;
unlink $subjects_list;

Ahora leemos los codigos internos,

        if ($internos){
                open IIF, "<$internos";
                while (<IIF>){
                        if (/.*,\d{8}$/){
                                my ($sbj, $interno) = /(.*),(\d{8})$/;
                                $guys{$sbj}{'INTERNO'} = $interno;
                        }
                }
                close IIF;
                print GDF "Subject,Interno,Date\n";
                foreach my $plab (sort keys %guys){
                        if (exists($guys{$plab}{'INTERNO'}) and exists($guys{$plab}{'DATE'})){
                                print GDF "$plab,$guys{$plab}{'INTERNO'},$guys{$plab}{'DATE'}\n";
                                print "$plab,$guys{$plab}{'INTERNO'},$guys{$plab}{'DATE'}\n";
                        }
                }
        }

y la info del procesamiento,

my $fbbout = tempdir(TEMPLATE => $tmp_dir.'/fsout.XXXXX', CLEANUP => 1);
my $fbfile = $fbbout.'/fbbcl.csv';
$order = 'xnatapic get_fbbcl --project_id '.$study.' --output '.$fbfile;
system($order);
open CLF, "<$fbfile";
while(<CLF>){
        if(/, \d$/){
                my ($sbj, $suvr, $cl, $qc) = /(.*), (.*), (.*), (.*)$/;
                $guys{$sbj}{'SUVR'} = $suvr;
                $guys{$sbj}{'CL'} = $cl;
                $guys{$sbj}{'QC'} = $qcpass[$qc];
        }
}
close CLF;

Todo junto lo guardamos en formato de MS Excel,

my $info = csv (in => $info_page);
my $workbook = Spreadsheet::Write->new(file => $ofile, sheet => 'Info');
for my $i (0 .. $#{$info}) {
        my $row = $info->[$i];
        $workbook->addrow($row);
}
#now regroup data
$workbook->addsheet('FBB Centiloid');
my @drow;
if($internos){
        @drow = split ',', "Subject,Interno,Date,SUVR,CL,QC";
}else{
        @drow = split ',', "Subject,Date,SUVR,CL,QC";
}
$workbook->addrow(\@drow);
foreach my $sbj (sort keys %guys){
        if(exists($guys{$sbj}) and exists($guys{$sbj}{'SUVR'}) and $guys{$sbj}{'SUVR'} and ($guys{$sbj}{'SUVR'} ne 'null')){
                 if($internos){
                         @drow = split ',', "$sbj,$guys{$sbj}{'INTERNO'},$guys{$sbj}{'DATE'},$guys{$sbj}{'SUVR'},$guys{$sbj}{'CL'},$guys{$sbj}{'QC'}";
                }else{
                        @drow = split ',', "$sbj,$guys{$sbj}{'DATE'},$guys{$sbj}{'SUVR'},$guys{$sbj}{'CL'},$guys{$sbj}{'QC'}";
                }
                $workbook->addrow(\@drow);
        }
}
$workbook->close();

El codigo completo, incluyendo algun tratamiento de excepciones extra en github.

Para ejecutarlo es tan simple como hacer algo asi,

$ fbb_cl_metrics_xnat.pl -i internos.csv f5cehbi

El resultado es un archivo conun nombre como: f5cehbi_fbb_cl_metrics_20211001_110802.xls

neuroimagen/pipe05.txt · Last modified: 2021/11/16 08:53 by osotolongo