User Tools

Site Tools


neuroimagen:mriface_reports

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:mriface_reports [2022/04/05 08:06]
osotolongo [Sacando edad de XNAT]
neuroimagen:mriface_reports [2022/11/04 10:16] (current)
osotolongo [Sacar info]
Line 1: Line 1:
 +
 ====== Extrayendo los datos de los informes de MRI FACE ====== ====== Extrayendo los datos de los informes de MRI FACE ======
  
Line 22: Line 23:
 </code> </code>
  
-===== Bajar PDFs =====+ 
 +==== Bajar PDFs =====
  
   - Entrar en https://impax.corachan.com/   - Entrar en https://impax.corachan.com/
Line 150: Line 152:
 </code> </code>
 ++++ ++++
 +
 +++++ Procedimiento antiguo |
  
 y entonces, y entonces,
Line 170: Line 174:
 20211611,NA,NA,NA,0,0,0,0,0 20211611,NA,NA,NA,0,0,0,0,0
 </code> </code>
 +
 +++++ DELETEME
  
 Y cuando casi eres feliz, **te cambian la estructura de los informes** LOL Y cuando casi eres feliz, **te cambian la estructura de los informes** LOL
Line 598: Line 604:
 # Get input # Get input
 my $xprj = 'unidad'; my $xprj = 'unidad';
 +my $ilist;
 while (@ARGV and $ARGV[0] =~ /^-/) { while (@ARGV and $ARGV[0] =~ /^-/) {
         $_ = shift;         $_ = shift;
         last if /^--$/;         last if /^--$/;
         if (/^-x/) {$xprj = shift; chomp($xprj);}         if (/^-x/) {$xprj = shift; chomp($xprj);}
 +        if (/^-i/) {$ilist = shift; chomp($ilist);}
 } }
 die "Should supply XNAT project" unless $xprj; die "Should supply XNAT project" unless $xprj;
Line 628: Line 636:
 my $tmp_dir = tempdir(TEMPLATE => $ENV{TMPDIR}.'/xnat_data.XXXXXX', CLEANUP => 1); my $tmp_dir = tempdir(TEMPLATE => $ENV{TMPDIR}.'/xnat_data.XXXXXX', CLEANUP => 1);
 my $sbj_file = $tmp_dir.'/all_subjects.csv'; my $sbj_file = $tmp_dir.'/all_subjects.csv';
 +# me conecto y genero mi JSESSIONID
 +my $q = 'curl -f -X POST -u "'.$xconf{'USER'}.':'.$xconf{'PASSWORD'}.'" "'.$xconf{'HOST'}.'/data/JSESSION" 2>/dev/null';
 +my $jid = qx/$q/;
 # Saco los sujetos del proyecto # Saco los sujetos del proyecto
-my $q = 'curl -f -X GET  -u "'.$xconf{'USER'}.':'.$xconf{'PASSWORD'}.'" "'.$xconf{'HOST'}.'/data/projects/unidad/subjects?format=csv" > '.$sbj_file;+$q = 'curl -f -b JSESSIONID='.$jid.' "'.$xconf{'HOST'}.'/data/projects/unidad/subjects?format=csv" > '.$sbj_file.' 2>/dev/null';
 system($q); system($q);
 +my @slist;
 +if ($ilist) {
 +        open IDF, "<$ilist";
 +        @slist = <IDF>;
 +        close IDF;
 +}
 my %subjects; my %subjects;
 open IDF, "<$sbj_file"; open IDF, "<$sbj_file";
Line 637: Line 654:
                 my ($xid,$xlabel) = /(XNAT.*),.*,(\d*),.*,.*,.*$/;                 my ($xid,$xlabel) = /(XNAT.*),.*,(\d*),.*,.*,.*$/;
                 #print "$xid -> $xlabel\n";                 #print "$xid -> $xlabel\n";
-                $subjects{$xid}{'label'} = $xlabel;+                if(!$ilist or grep( /^$xlabel$/, @slist)){ 
 +                        $subjects{$xid}{'label'} = $xlabel; 
 +                        print "$xlabel\n"; 
 +                }
         }         }
 } }
 close IDF; close IDF;
 +#dump %subjects;
 foreach my $subject (sort keys %subjects){ foreach my $subject (sort keys %subjects){
         my $sconn = 'sqlcmd -U '.$sqlconf{'USER'}.' -P '.$sqlconf{'PASSWORD'}.' -S '.$sqlconf{'HOST'}.' -s "," -W -Q "SELECT his_interno, xfecha_nac, xsexo_id FROM [UNIT4_DATA].[imp].[vh_pac_gral] WHERE his_interno = \'"'.$subjects{$subject}{'label'}.'"\';" | grep '.$subjects{$subject}{'label'};         my $sconn = 'sqlcmd -U '.$sqlconf{'USER'}.' -P '.$sqlconf{'PASSWORD'}.' -S '.$sqlconf{'HOST'}.' -s "," -W -Q "SELECT his_interno, xfecha_nac, xsexo_id FROM [UNIT4_DATA].[imp].[vh_pac_gral] WHERE his_interno = \'"'.$subjects{$subject}{'label'}.'"\';" | grep '.$subjects{$subject}{'label'};
Line 661: Line 681:
 } }
 close ODF; close ODF;
- 
 </code> </code>
 ++++ ++++
 +
 +-----
 +
 +** Para construir el CSV con los datos demograficos de todo el proyecto basta hacer, **
 +
 +<code bash>
 +
 +$ ./make_csv.pl -x proyecto
 +
 +</code>
 +
 +** (si no se pone el nombre de proyecto toma como default //unidad//) **
 +
 +** Si solo quiero hacer unos pocos, **
 +
 +<code bash>
 +$ cat newones.list
 +20220534
 +20210104
 +20210474
 +20171653
 +$ ./make_csv.pl -i newones.list
 +
 +</code>
 +
 +----- 
  
 Y ahora puedo usar este [[https://wiki.xnat.org/documentation/how-to-use-xnat/upload-experiment-data-via-spreadsheet | metodo para subir el CSV]] Y ahora puedo usar este [[https://wiki.xnat.org/documentation/how-to-use-xnat/upload-experiment-data-via-spreadsheet | metodo para subir el CSV]]
Line 794: Line 839:
  
  
-La forma correcta de parsear el //json// para sacar la edad es mas o menos asi,+La forma correcta de parsear el //json// para sacar la fecha de nacimiento es mas o menos asi,
  
 <code> <code>
Line 800: Line 845:
 </code> </code>
  
 +y para sacar la fecha del primer MRI asignado a sujeto es,
 +
 +<code>
 +[osotolongo@brick03 ~]$ curl -b JSESSIONID=1709B38DD3BD206D00C3389592A4FC9E -X GET 'http://detritus.fundacioace.com:8088/data/projects/unidad/subjects/XNAT05_S00052/experiments?format=json' | jq '.ResultSet.Result[0].date'
 +</code>
 +
 +o si se conoce el experimento,
 +
 +<code>
 +[osotolongo@brick03 ~]$ curl -b JSESSIONID=1709B38DD3BD206D00C3389592A4FC9E -X GET 'http://detritus.fundacioace.com:8088/data/projects/unidad/subjects/XNAT05_S00052/experiments/XNAT05_E00065?format=json' | jq '.items[0].data_fields.date'
 +</code>
 +
 +
 +++++ Asi que esto es un poco ir engranado todo |
 +
 +<code perl xnat_get_age.pl>
 +#!/usr/bin/perl
 +#
 +# This is for getting age at MRI date
 +# Intended for MRIFACE protocol
 +# All info is XNAT stored.
 +#
 +# Copyleft 2022 <asqwerty@gmail.com>
 +#
 +use strict;
 +use warnings;
 +use JSON;
 +use Date::Manip;
 +use Math::Round;
 +
 +my $xprj;
 +my $oxfile;
 +while (@ARGV and $ARGV[0] =~ /^-/) {
 +        $_ = shift;
 +        last if /^--$/;
 +        if (/^-o/) {$oxfile = shift; chomp($oxfile);}
 +        if (/^-x/) {$xprj = shift; chomp($xprj);}
 +}
 +die "Should supply XNAT project" unless $xprj;
 +$oxfile = $xprj.'_age_data.csv' unless $oxfile;
 +#Read xnat user config
 +my $xconf_file = $ENV{'HOME'}.'/.xnatapic/xnat.conf';
 +my %xconf;
 +open IDF, "<$xconf_file";
 +while (<IDF>){
 +        if (/^#.*/ or /^\s*$/) { next; }
 +        my ($n, $v) = /(.*)=(.*)/;
 +        $xconf{$n} = $v;
 +}
 +#get the jsessionid
 +my $q = 'curl -f -X POST -u "'.$xconf{'USER'}.':'.$xconf{'PASSWORD'}.'" "'.$xconf{'HOST'}.'/data/JSESSION" 2>/dev/null';
 +my $jid = qx/$q/;
 +my %subjects;
 +$q = 'curl -f -b JSESSIONID='.$jid.' -X GET "'.$xconf{'HOST'}.'/data/projects/'.$xprj.'/subjects?format=csv&columns=ID,label" 2>/dev/null';
 +my @sbj_res = split '\n', qx/$q/;
 +
 +foreach my $sbj_prop (@sbj_res){
 +        if ($sbj_prop =~ /^XNAT/){
 +                my ($sid,$slabel) = $sbj_prop =~ /^(XNAT.+),(\S+),(.*)$/;
 +                $subjects{$sid}{'label'} = $slabel;
 +                my $qe = 'curl -f -b JSESSIONID='.$jid.' -X GET "'.$xconf{'HOST'}.'/data/projects/'.$xprj.'/subjects/'.$sid.'/experiments?format=json&xsiType=xnat:mrSessionData" 2>/dev/null';
 +                my $json_res = qx/$qe/;
 +                my $exp_prop = decode_json $json_res;
 +                foreach my $experiment (@{$exp_prop->{'ResultSet'}{'Result'}}){
 +                        $subjects{$sid}{'experimentID'} = $experiment->{'ID'};
 +                }
 +                my $mri_date;
 +                if (exists($subjects{$sid}{'experimentID'}) and $subjects{$sid}{'experimentID'}){
 +                        my $qr = 'curl -f -b JSESSIONID='.$jid.' -X GET "'.$xconf{'HOST'}.'/data/projects/'.$xprj.'/experiments/'.$subjects{$sid}{'experimentID'}.'?format=json" 2>/dev/null | jq ".items[0].data_fields.date"';
 +                        $mri_date = qx/$qr/; chomp $mri_date;
 +                        $mri_date =~ s/.*(\d{4})-(\d{2})-(\d{2}).*/$2\/$3\/$1/;
 +                        #print "MRI date: $mri_date\n";
 +                }
 +                my $qs = 'curl -f -b JSESSIONID='.$jid.' -X GET "'.$xconf{'HOST'}.'/data/projects/'.$xprj.'/subjects/'.$sid.'?format=json" 2>/dev/null | jq ".items[0].children[] | select(.field==\"demographics\") | .items[0].data_fields.dob"';
 +                #print "$qs\n";
 +                my $dob = qx/$qs/; chomp $dob;
 +                $dob =~ s/.*(\d{4})-(\d{2})-(\d{2}).*/$2\/$3\/$1/;
 +                #print "DoB: $dob\n";
 +                if ($mri_date and $dob){
 +                        #my $d1 = ParseDate($dob);
 +                        #my $d2 = ParseDate($mri_date);
 +                        #print "$d1 - $d2\n";
 +                        my $ddif = Delta_Format(DateCalc(ParseDate($dob),ParseDate($mri_date)),2,"%hh")/(24*365.2425);
 +                        $subjects{$sid}{'age'} = nearest(0.1, $ddif);
 +                        print "$subjects{$sid}{'label'}, $subjects{$sid}{'age'}\n";
 +                }
 +        }
 +}
 +open ODF, ">$oxfile";
 +print ODF "Subject,Age\n";
 +foreach my $subject (sort keys %subjects){
 +        if(exists($subjects{$subject}{'age'})){
 +                print ODF "$subjects{$subject}{'label'},$subjects{$subject}{'age'}\n";
 +        }
 +}
 +close ODF;
 +</code>
 +++++
 +
 +**Ejem**, me ha costado un poco darme cuenta que debo poner las echas como // MM/DD/YYYY // para que //ParseDate()// las agarre bien, pero en fin,que no es tan complicado.
 +
 +luego se hace algo como
 +
 +<code>
 +$./xnat_get_age.pl -x unidad
 +</code>
 +
 +y el archivo de ouput es obviamente
 +
 +<code bash>
 +$ head unidad_age_data.csv
 +Subject,Age
 +20151338,87.7
 +20211523,70.3
 +20211401,63.1
 +20211281,79.4
 +20210716,74.2
 +20081210,82.9
 +20211524,77.1
 +20211269,65
 +20211482,75
 +</code>
 +
 +
 +===== Haciendo Update de la DB =====
 +
 +Cuando he subido los sujetos nuevos, no me interesa subir todos los datos. Solo de los nuevos. Xnat permite bajarse un CSV con los datos fundamentales de los sujetos. Ejemplo,
 +
 +<code bash>
 +[osotolongo@brick03 mri_face]$ head osotolongo_9_9_2022_14_20_45.csv
 +Subject,M/F,YOB,MR Sessions,Inserted
 +20040526,F,1943,1,2022-08-15 14:50:34.733
 +20050456,F,1940,1,2022-03-21 10:07:58.79
 +20050604,U,,1,2022-09-09 11:03:42.296
 +20071018,F,1937,1,2022-06-01 11:26:55.319
 +20081210,F,1939,1,2021-12-18 18:36:35.746
 +20090461,M,1944,1,2022-02-02 10:18:49.364
 +20090567,F,1951,1,2022-08-16 11:46:09.795
 +20100147,F,1943,1,2022-08-16 10:24:22.267
 +20100678,M,1943,1,2022-02-02 10:53:02.929
 +</code>
 +
 +Lo primero es mirar aqui quienes no tienen Genero o Fecha de nacimiento,
 +
 +<code bash>
 +[osotolongo@brick03 mri_face]$ awk -F"," '{if ($2=="U") print $1 }' osotolongo_9_9_2022_14_20_45.csv | sort -n > newones.list
 +[osotolongo@brick03 mri_face]$ cat newones.list
 +20050604
 +20181621
 +20191940
 +20220120
 +20220144
 +20220205
 +20221002
 +20221079
 +20221124
 +2021020051
 +2021020062
 +2021020098
 +</code>
 +
 +Por supuesto que aqui habra tambien los errores previos (// ver las ultimas lineas//) pero no importa porque estos no se procesaran. Hago,
 +
 +<code bash>
 +[osotolongo@brick03 mri_face]$ ./make_csv.pl -i newones.list
 +</code>
 +
 +y el archivo resultante,
 +
 +<code bash>
 +[osotolongo@brick03 mri_face]$ cat unidad_dob_gender.csv
 +ID,label,dob,gender
 +XNAT_S00611,20050604,1946-11-18,female
 +XNAT_S00612,20220144,1948-04-10,female
 +XNAT_S00613,20220120,1950-12-31,female
 +XNAT_S00614,20220205,1938-10-06,female
 +XNAT_S00615,20221002,1955-02-19,female
 +XNAT_S00616,20181621,1941-10-23,female
 +XNAT_S00617,20221079,1949-07-25,female
 +XNAT_S00618,20191940,1943-11-09,female
 +XNAT_S00619,20221124,1969-03-17,male
 +</code>
 +
 +se utiliza para hacer un update subiendo el spreadsheet directamente a XNAT.
 +
 +ahora, quiero ver los reports que faltan, asi que hago,
 +
 +<code bash>
 +[osotolongo@brick03 mri_face]$ xnat_get_rvr.pl -x mriface
 +[osotolongo@brick03 mri_face]$ head mriface_rvr_data.csv
 +Subject_ID,Date,Fazekas,GCA_D,GCA_I,Kipps_A_D,Kipps_A_I,Kipps_F_D,Kipps_F_I,Kipps_P_D,Kipps_P_I,Koedam_D,Koedam_I,Scheltens_D,Scheltens_I
 +20151338,2021-12-04,1,2,2,1,1,1,1,1,1,2,2,2,2
 +20211523,2021-12-05,2,1,1,NA,NA,NA,NA,NA,NA,1,1,1,2
 +2021020098,2021-12-04,1,2,2,2,2,2,2,1,1,1,2,2,2
 +20211401,2021-12-04,1,1,1,1,1,1,1,2,2,1,1,0,1
 +20211281,2021-12-01,1,3,3,NA,NA,NA,NA,NA,NA,2,3,3,3
 +20210716,2021-12-16,1,1,1,1,1,1,1,1,1,1,1,1,1
 +20081210,2021-12-02,1,1,1,NA,NA,NA,NA,NA,NA,1,1,0,0
 +20211524,2021-12-02,2,2,2,1,1,3,3,1,1,2,2,1,1
 +20211482,2021-12-02,2,2,2,3,3,2,2,2,2,2,2,4,4
 +[osotolongo@brick03 mri_face]$ awk -F"," '{print $1}' mriface_rvr_data.csv > reports_done.list
 +[osotolongo@brick03 mri_face]$ awk -F"," '{print $1}' osotolongo_9_9_2022_14_20_45.csv > all.list
 +[osotolongo@brick03 mri_face]$ grep -v "`cat reports_done.list`" all.list > noreports.list
 +[osotolongo@brick03 mri_face]$ while read -r line; do xpr=$(xnatapic list_experiments --project_id unidad --subject_id ${line} --modality MRI --label); echo "${line},${xpr}"; done < noreports.list | awk -F"," '{print $1","$3}' > sbj_ids.csv
 +[osotolongo@brick03 mri_face]$ head sbj_ids.csv
 +20050604,D22362317
 +20181621,D22407522
 +20191940,D22402332
 +20211269,D18290542
 +20220053,D22038623
 +20220120,D22363608
 +20220144,D22402314
 +20220205,D99365341
 +20220460,D99297208
 +20220581,D22362247
 +</code>
 +
 +y ahora regresamos a [[neuroimagen:mriface_reports#bajar_pdfs| bajar los PDFs y procesarlos]]
 +===== Evaluando neurodegeneración =====
 +
 +Ahora, como determinar la N.
 +
 +Primero obtener los datos,
 +<code bash>
 +[osotolongo@brick03 mri_face]$ xnat_pullfs.pl -s aseg -p unidad -o base_aseg.csv
 +[osotolongo@brick03 mri_face]$ xnat_pullfs.pl -s aparc -p unidad -o base_aparc.csv
 +[osotolongo@brick03 mri_face]$ join -t, base_aseg.csv base_aparc.csv > base_full.csv
 +[osotolongo@brick03 mri_face]$ ./xnat_get_age.pl -x unidad
 +[osotolongo@brick03 mri_face]$ sort -t, -n unidad_age_data.csv > unidad_age_data_sorted.csv
 +[osotolongo@brick03 mri_face]$ join -t, base_full.csv unidad_age_data_sorted.csv > input_data.csv
 +</code>
 +
 +y ahora me bajo el [[https://github.com/asqwerty666/acenip/tree/main/neuroass|script para calcular la N]] y,
 +
 +<code bash>
 +[osotolongo@brick03 mri_face]$ Rscript nplus.r
 +</code>
 +
 +Y tenemos como resultado la estimacion de presencia de neurodegeneracion asi como la probailidad de pertenecer a cada grupo.
 +
 +<code bash>
 +[osotolongo@brick03 mri_face]$ head classifier_output.csv
 +Subject_ID,ND,posterior.0,posterior.1
 +20050456,1,1.535472e-03,9.984645e-01
 +20081210,0,7.683998e-01,2.316002e-01
 +20090461,1,2.417535e-03,9.975825e-01
 +20100678,1,1.268098e-04,9.998732e-01
 +20140947,1,6.505165e-02,9.349483e-01
 +20150926,1,3.967107e-07,9.999996e-01
 +20151338,1,2.415657e-04,9.997584e-01
 +20160418,1,2.258146e-07,9.999998e-01
 +20170735,1,4.166497e-03,9.958335e-01
 +</code>
 +
 +{{:neuroimagen:unidad_classifier_output_hippocampus.png?600|}}
 +
 +{{:neuroimagen:unidad_classifier_output_middletemporal.png?600|}}
 +
 +{{:neuroimagen:unidad_classifier_output_entorhinal.png?600|}}
 +
 +y la densidad de probabilidades de presentar neurodegeneracion perteneciendo a este grupo sería algo como,
 +
 +{{:neuroimagen:unidad_posterior_probs.png?600|}}
 +
 +===== Juntando todo en un mismo output =====
  
neuroimagen/mriface_reports.1649145962.txt.gz · Last modified: 2022/04/05 08:06 by osotolongo