This is an old revision of the document!
Table of Contents
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,
- 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.
[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
[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); @ifiles = grep(/\.csv/, readdir(DIR)); close DIR; foreach $ifile (@ifiles){ my $tmpf = 'tmp_'.$ifile; my $order = 'join -t, -1 2 -2 1 '.$guide.' '.$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.