User Tools

Site Tools


neuroimagen:dando_formato_a_las_resultados

Formato de entrega de los resultados de analisis

MRI

El primer paso es sacar las fechas de los DICOM.

Ejemplo con FACEHBI,

[osotolongo@detritus facehbi]$ for x in /nas/corachan/facehbi/*;do n=$(echo ${x} | awk -F"/" {'print $5'}); f=$(find ${x} -type f |grep -v "DTI"| head -1); d=$(dckey -k "AcquisitionDate" ${f} 2>&1); echo ${n},${d}; done > dates_mri.csv
[osotolongo@detritus facehbi]$ sed -i '1iPSubject,Date' dates_mri.csv
[osotolongo@detritus facehbi]$ head dates_mri.csv
PSubject,Date
F001,20141205
F002,20141205
F003,20141211
F004,20141212
F005,20150107
F006,20141223
F007,20141219
F008,20141220
F009,20150110

Ademas necesitamos un archivo con el numero de historia clinica interno, pues es necesario para el procesamiento de otras variables (no aqui!). Esto se recibirá en cualquier formato pero es necesario convertirlo en algo asi,

[osotolongo@detritus facehbi]$ head internos.csv
PSubject,Interno
F001,20090806
F002,20131084
F003,20130456
F004,20080130
F005,20141272
F006,20141107
F007,20080716
F008,20131483
F009,20141277

Vamos a unirlos ahora,

[osotolongo@detritus facehbi]$ join -t, internos.csv dates_mri.csv > info_mri.csv
[osotolongo@detritus facehbi]$ head info_mri.csv
PSubject,Interno,Date
F001,20090806,20141205
F002,20131084,20141205
F003,20130456,20141211
F004,20080130,20141212
F005,20141272,20150107
F006,20141107,20141223
F007,20080716,20141219
F008,20131483,20141220
F009,20141277,20150110

Ahora la fecha hay que ponerla en el formato correcto. digamos, DD/MM/YYYY. Yo prefiero eloriginal YYYYMMDD pero lo que piden es esto. Voy a hacer un script perl sencillo para esto,

format_date.pl
#!/usr/bin/perl
# Formatear las fechas
# Copyright O.Sotolongo (asqwerty@gmail.com) 2020
use strict;
use warnings;
my $num_args = $#ARGV + 1;
die "Should supply input filename\n" unless $num_args;
my $ifile=$ARGV[0];
my $ofile;
if ($num_args == 2){
        $ofile=$ARGV[1];
}else{
        ($ofile = $ifile) =~ s/\.\w{2,4}$/_proper/;
        $ofile =$ofile.'.csv';
}
open IDF, "<$ifile";
open ODF, ">$ofile";
while (<IDF>) {
        if(/^.*,.*,\d{8}$/) {
                my ($shit, $date) = /^(.*),(\d{8})$/;
                (my $cdate = $date) =~ s/(\d{4})(\d{2})(\d{2})/$3.$2.$1/;
                print ODF "$shit,$cdate\n";
        }else{
                print ODF;
        }
}
close ODF;
close IDF;

y vamos a probar,

[osotolongo@detritus facehbi]$ ./format_date.pl info_mri.csv
[osotolongo@detritus facehbi]$ head info_mri_proper.csv
PSubject,Interno,Date
F001,20090806,05.12.2014
F002,20131084,05.12.2014
F003,20130456,11.12.2014
F004,20080130,12.12.2014
F005,20141272,07.01.2015
F006,20141107,23.12.2014
F007,20080716,19.12.2014
F008,20131483,20.12.2014
F009,20141277,10.01.2015

Ahora empieza lo bueno.Tenemos que ligar este archivo con los sujetos de neuroimagen. Para esto usamos el archivo guia que debe existir en cada proyecto, en este caso, facehbi_mri.csv. Este archivo se debe copiar a otro para garantizar dos cosas,

  1. Poder modificarlo sin problemas (sustituir ; por ,, añadir header, etc)
  2. Que la segunda columna este en el formato correcto, esto es, que contenga los codigos de sujeto del proyecto correctos, sin ningun añadido que pueden tener los directorios.
[osotolongo@detritus facehbi]$ sed 's/;/,/' facehbi_mri.csv > guia_mri.csv
[osotolongo@detritus facehbi]$ sed -i '1iSubject,PSubject' guia_mri.csv

Una vez garantizado que la union va a ser correcta,

[osotolongo@detritus facehbi]$ join -t, -1 2 -2 1 guia_mri.csv info_mri_proper.csv > gdata_mri.csv
[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

FS output

Para organizar el output en un archivo de MS Excel necesito una primera pagina con info general. Esta debe ser el primer sheet del archivo excel.

[osotolongo@detritus facehbi]$ cat info_page.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
,,
,lh,left hemisphere
,rh,right hemisphere

Todo el output esta en el directorio fsrecon y hay que cargarlo en Sheets individuales.

fsrecon2xls.pl
#!/usr/bin/perl
 
use strict;
use warnings;
use Data::Dump qw(dump);
use Text::CSV qw( csv );
use Excel::Writer::XLSX;
my $guide = $ARGV[0];
my $ofile = $ARGV[1];
my $idir = 'fsrecon';
my $info = csv (in => "info_page.csv");
$ofile =~ s/\.(\w*)?$/.xlsx/;
my $workbook = Excel::Writer::XLSX->new($ofile);
my $worksheet = $workbook->add_worksheet('Info');
for my $i (0 .. $#{$info}) {
        my $row = $info->[$i];
        for my $j (0 .. $#{$row}){
                $worksheet->write( $i, $j, $row->[$j]);
        }
}
opendir (DIR, $idir);
my @ifiles = grep(/\.csv/, readdir(DIR));
close DIR;
foreach my $ifile (@ifiles){
        my $tmpf = 'tmp_'.$ifile;
        my $order = 'join -t, -1 2 -2 1 '.$guide.' '.$idir.'/'.$ifile.' > '.$tmpf;
        system($order);
        my $idata = csv (in => $tmpf); # as array of array
        (my $shname = $ifile) =~ s/\.csv$//;
        $worksheet = $workbook->add_worksheet($shname);
        for my $i (0 .. $#{$idata}) {
                my $row = $idata->[$i];
                for my $j (0 .. $#{$row}){
                        $worksheet->write( $i, $j, $row->[$j]);
                }
        }
        unlink $tmpf;
}

El input debe ser el archivo ya preparado con los datos genericos del proyecto (IDs, Fechas, numero HC) y el nombre del archivo de salida.

[osotolongo@detritus facehbi]$ ./fsrecon2xls.pl gdata_mri.csv facehbi_recon_results.xlsx
[osotolongo@detritus facehbi]$ ls -l facehbi_recon_results.xlsx
-rw-rw---- 1 osotolongo osotolongo 490261 Jan  5 17:07 facehbi_recon_results.xlsx

El resultado es un spreadsheet, listo para enviar, que puede ser abierto con MS Office, Open Office o con Google Sheets (o cualquier cosa compatible).

Nota: El script de conversion es facilmente exportable a otros tipos de procesamientos como DTI o PET. El archivo de informacion general es reutilizable y facil de editar. El archivo de datos generales (gdata_mri.csv) sirve para DTI o fMRI. En el caso de PET habria que rehacerlo pero el procedimiento es el mismo.

PET

Como quiero poner todos los resultados juntos voy a ponerlos todos en un mismo directorio y a hacer el excel de ahi,

[osotolongo@detritus facehbi]$ mkdir fbb_results
[osotolongo@detritus facehbi]$ sed 's/;/,/g' facehbi_fbb_cl.csv > fbb_results/fbb_centiloid.csv
[osotolongo@detritus facehbi]$ sed 's/;/,/g' facehbi_fbb_fs_suvr_rois.csv > fbb_results/fbb_landau_method.csv

Edito la info_page,

[osotolongo@detritus facehbi]$ cat info_page.csv
,,
,,
Base de datos:,O. Sotolongo-Grau,asqwerty@gmail.com
Extracción de métricas:,O. Sotolongo-Grau,asqwerty@gmail.com
col. Externa:,Andrés Perissinotti,aperissi@clinic.cat
,Aida Ninerola,ninerola@clinic.cat
,,

Y voy y saco las fechas de cada scan,

[osotolongo@detritus facehbi]$ for x in /nas/clinic/facehbi/*; do f=$(find ${x} -type f | head -1); d=$(dckey -k "AcquisitionDate" ${f} 2>&1); n=$(echo $x | awk -F"/" {'print $5'} | sed 's/FACEHBI-\(.*\)B/\1/' ); echo ${n},${d}; done > dates_fbb.csv
[osotolongo@detritus facehbi]$ sed -i '1iPSubject,Date' dates_fbb.csv
[osotolongo@detritus facehbi]$ head dates_fbb.csv
PSubject,Date
F001,20141211
F002,20141211
F003,20141218
F004,20141218
F005,20150122
F006,20150115
F007,20150115
F008,20150115
F009,20150129

Lo pego a los codigos internos y doy formato a las fechas (con el mismo script!!!)

[osotolongo@detritus facehbi]$ join -t, internos.csv dates_fbb.csv > info_fbb.csv
[osotolongo@detritus facehbi]$ ./format_date.pl info_fbb.csv
[osotolongo@detritus facehbi]$ head info_fbb_proper.csv
PSubject,Interno,Date
F001,20090806,11.12.2014
F002,20131084,11.12.2014
F003,20130456,18.12.2014
F004,20080130,18.12.2014
F005,20141272,22.01.2015
F006,20141107,15.01.2015
F007,20080716,15.01.2015
F008,20131483,15.01.2015
F009,20141277,29.01.2015

ahora tengo que dar formato a la guia_fbb.

[osotolongo@detritus facehbi]$ sed 's/;/,/;s/FACEHBI-\(.*\)B/\1/' facehbi_pet.csv > guia_fbb.csv
[osotolongo@detritus facehbi]$ sed -i '1iSubject,PSubject' guia_fbb.csv
[osotolongo@detritus facehbi]$ head guia_fbb.csv
Subject,PSubject
0001,F001
0002,F002
0003,F003
0004,F004
0005,F005
0006,F006
0007,F007
0008,F008
0009,F009

Y ya puedo pegar todos los datos preliminares,

[osotolongo@detritus facehbi]$ join -t, -1 2 -2 1 guia_fbb.csv info_fbb_proper.csv > gdata_fbb.csv
[osotolongo@detritus facehbi]$ head gdata_fbb.csv
PSubject,Subject,Interno,Date
F001,0001,20090806,11.12.2014
F002,0002,20131084,11.12.2014
F003,0003,20130456,18.12.2014
F004,0004,20080130,18.12.2014
F005,0005,20141272,22.01.2015
F006,0006,20141107,15.01.2015
F007,0007,20080716,15.01.2015
F008,0008,20131483,15.01.2015
F009,0009,20141277,29.01.2015

Voy cambiar un poco el script de formatear los resultados de MRI, porque el metodo es muy parecido. Nota: De verdad que tengo que pensar como abstraer esto,

fbb2xls.pl
#!/usr/bin/perl
 
use strict;
use warnings;
use Data::Dump qw(dump);
use Text::CSV qw( csv );
use Excel::Writer::XLSX;
my $num_args = $#ARGV + 1;
die "Should supply input filename!!!\n" unless $num_args;
my $idir = 'fbb_results';
my $guide = $ARGV[0];
my $ofile;
if ($num_args == 2){
        $ofile = $ARGV[1];
}else{
        $ofile = $idir.'.xlsx';
}
my $info = csv (in => "info_page.csv");
$ofile =~ s/\.(\w*)?$/.xlsx/;
my $workbook = Excel::Writer::XLSX->new($ofile);
my $worksheet = $workbook->add_worksheet('Info');
for my $i (0 .. $#{$info}) {
        my $row = $info->[$i];
        for my $j (0 .. $#{$row}){
                $worksheet->write( $i, $j, $row->[$j]);
        }
}
opendir (DIR, $idir);
my @ifiles = grep(/\.csv/, readdir(DIR));
close DIR;
foreach my $ifile (@ifiles){
        my $tmpf = 'tmp_'.$ifile;
        my $order = 'join -t, -1 2 -2 1 '.$guide.' '.$idir.'/'.$ifile.' > '.$tmpf;
        system($order);
        my $idata = csv (in => $tmpf); # as array of array
        (my $shname = $ifile) =~ s/\.csv$//;
        $worksheet = $workbook->add_worksheet($shname);
        for my $i (0 .. $#{$idata}) {
                my $row = $idata->[$i];
                for my $j (0 .. $#{$row}){
                        $worksheet->write( $i, $j, $row->[$j]);
                }
        }
        unlink $tmpf;
}

Y corremos,

[osotolongo@detritus facehbi]$ ./fbb2xls.pl gdata_fbb.csv fbb_results.xlsx
[osotolongo@detritus facehbi]$ ls -lh fbb_results.xlsx
-rw-rw---- 1 osotolongo osotolongo 33K Jan  7 11:52 fbb_results.xlsx

Y nos queda el archivo excel correcto,

neuroimagen/dando_formato_a_las_resultados.txt · Last modified: 2020/08/04 10:58 (external edit)