User Tools

Site Tools


neuroimagen:dando_formato_a_las_resultados

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
neuroimagen:dando_formato_a_las_resultados [2020/01/04 13:24]
osotolongo [MRI]
neuroimagen:dando_formato_a_las_resultados [2020/01/07 10:59]
osotolongo [PET]
Line 54: Line 54:
 </code> </code>
  
 +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,
 +
 +<code perl 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;
 +</code>
 +y vamos a probar,
 +<code bash>
 +[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
 +</code>
 +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,
 +  - Poder modificarlo sin problemas (sustituir **;** por **,**, añadir header, etc)
 +  - 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.
 +<code bash>
 +[osotolongo@detritus facehbi]$ sed 's/;/,/' facehbi_mri.csv > guia_mri.csv
 +[osotolongo@detritus facehbi]$ sed -i '1iSubject,PSubject' guia_mri.csv
 +</code>
 +Una  vez garantizado que la union va a ser correcta,
 +<code bash>
 +[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
 +</code>
 +==== 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.
 +<code bash>
 +[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
 +</code>
 +Todo el output esta en el directorio //fsrecon// y hay que cargarlo en Sheets individuales. 
 +
 +<code perl 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;
 +}
 +</code>
 +
 +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**.
 +<code bash>
 +[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
 +
 +</code>
 +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).
 +{{:neuroimagen:2020-01-05-172425_grim.png|}}
 +{{:neuroimagen:2020-01-05-171702_grim.png|}}
 +
 +**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,
 +<code bash>
 +[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
 +</code>
 +Edito la //info_page//,
 +<code bash>
 +[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
 +,,
 +</code>
 +Y voy y saco las fechas de cada scan,
 +<code bash>
 +[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
 +
 +</code>
 +Lo pego a los codigos internos y doy formato a las fechas (con el mismo script!!!)
 +<code bash>
 +[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
 +</code>
 +
 +ahora tengo que dar formato a la //guia_fbb//.
 +<code bash>
 +[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
 +</code>
 +
 +Y ya puedo pegar todos los datos preliminares,
 +
 +<code bash>[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
 +</code>
 +
 +
 +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,
 +
 +<code perl 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;
 +}
 +</code>
 +Y corremos,
 +<code bash>
 +[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
 +</code>
 +Y nos queda el archivo excel correcto,
 +{{:neuroimagen:2020-01-07-115603_grim.png|}}
 +{{:neuroimagen:2020-01-07-115632_grim.png|}}
 +{{:neuroimagen:2020-01-07-115822_grim.png|}}
neuroimagen/dando_formato_a_las_resultados.txt · Last modified: 2020/08/04 10:58 (external edit)