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

Next revision
Previous revision
neuroimagen:dando_formato_a_las_resultados [2020/01/04 13:08]
osotolongo created
neuroimagen:dando_formato_a_las_resultados [2020/08/04 10:58] (current)
Line 22: Line 22:
 </code> </code>
  
 +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,
 +
 +<code bash>
 +[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
 +</code>
 +
 +Vamos a unirlos ahora,
 +<code bash>
 +[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
 +</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.1578143337.txt.gz · Last modified: 2020/08/04 10:47 (external edit)