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 revisionPrevious revision
Next revision
Previous revision
neuroimagen:mriface_reports [2022/07/08 07:37] osotolongoneuroimagen:mriface_reports [2023/07/14 09:57] (current) – [Evaluando neurodegeneración] osotolongo
Line 1: Line 1:
-===== Logistica de reclamacion ===== 
- 
-Para  pedir las  MRI que faltan a Corachan, lo primero es bajar [[ https://fundacioace-my.sharepoint.com/:x:/g/personal/carso_fundacioace_org/EeqoXyoZJUZPuHhJ22K5RgABS2zimbvqvMerxTwFpVA8tw?e=Cc8bBf | el listado de solicitudes de administracion]]. Aqui hay un monton de datos que no nos interesan asi que lo que hacemos es tomar las columnas de  //NHC//, //Nombre// y //Fecha MRI//, copiarlas  a otro sitio y salvar el documento como CSV.  
- 
-Ahora, esto esta con el encoding mal asi que hay que hacer, 
- 
-<code bash> 
-$ tr -d '\r' < mriface_faltan_raw.csv > mriface_faltan_tr.csv 
-</code>  
- 
-y para acomodar un poco la lista y facilitar la conversion de //singovia//, 
- 
-<code bash> 
-$ while read line; do simp=$(echo ${line} | sed 's/"//g; s/\([0-9]*\),\(.*\),[0-9]*\/[0-9]*\/[0-9]*/\1;\2_NHC_\1/; s/,//g; s/ /_/g'); echo "${simp}"; done < mriface_faltan_tr.csv | sed 's/;/,/' > mri_face_faltan_encode.csv 
-$ sort -t, -k 1 -n mri_face_faltan_encode.csv > mri_face_faltan_encode_sorted.csv 
-$ sort -t, -k 1 -n mriface_faltan_tr.csv > mriface_faltan_sorted.csv 
-$ join -t, mri_face_faltan_encode_sorted.csv mriface_faltan_sorted.csv > mriface_faltan_20220707.csv 
-$ ./csv2xls.pl mriface_faltan_20220707.csv 
-</code> 
- 
-El archivo resultante, //mriface_faltan_20220707.xls// es el que se envia a Corachan para reclamar las imagenes. 
  
 ====== Extrayendo los datos de los informes de MRI FACE ====== ====== Extrayendo los datos de los informes de MRI FACE ======
  
-===== Obteniendo los PatientID =====+===== Obteniendo los StudyID =====
  
-Lo primero es sacar los //Patient ID// de cada MRI. Primero saco los sujetos del proyecto y los asocio a los //IDs// almacenados como //label// del experimento.+Lo primero es sacar los //Study ID// de cada MRI. Primero saco los sujetos del proyecto y los asocio a los //IDs// almacenados como //label// del experimento.
  
 <code bash> <code bash>
Line 43: Line 22:
  
 </code> </code>
 +
 +**Nota:** Revisar el codigo y cambiar los ID, que no son estos.
 +
 +Estoy migrando de PatientID a StudyID, :BACKLOG:
 +
 +<code bash>
 +[osotolongo@brick03 mri_face]$ for x in reports_archive/*.txt; do p=$(grep "^D[0-9]*$" ${x}); r=$(basename ${x} | sed 's/\.txt//'); a=$(grep "^[0-9]D[0-9]*$" ${x}); echo "${r},${p},${a}"; done > accesion_ids.csv
 +[osotolongo@brick03 mri_face]$ xnatapic get_jsession
 +65F92C34AC318AB2A6A7D1BE3506A317
 +[osotolongo@brick03 mri_face]$ while read -r line; do s=$(echo ${line} | awk -F',' '{print $1}'); aid=$(echo ${line} | awk -F',' '{print $3}'); eid=$(xnatapic list_experiments --project_id mriface --subject_id ${s} --modality MRI); curl -f -X PUT -b "JSESSIONID=65F92C34AC318AB2A6A7D1BE3506A317" "http://detritus.fundacioace.com:8088/data/projects/mriface/subjects/${s}/experiments/${eid}?label=${aid}"; echo "${s}, ${aid} --> done"; done < accesion_ids.csv
 +</code>
 +
  
  
Line 48: Line 39:
  
   - Entrar en https://impax.corachan.com/   - Entrar en https://impax.corachan.com/
-  - Buscar por PatientID+  - Buscar por AccesionID
   - Salvar el report como pdf con el numero interno   - Salvar el report como pdf con el numero interno
  
Line 173: Line 164:
 </code> </code>
 ++++ ++++
 +
 +++++ Procedimiento antiguo |
  
 y entonces, y entonces,
Line 193: Line 186:
 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 621: Line 616:
 # 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 651: Line 648:
 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 660: Line 666:
                 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 684: Line 693:
 } }
 close ODF; close ODF;
- 
 </code> </code>
 ++++ ++++
 +
 +-----
 +
 +** Para construir el CSV con los datos demograficos de todo el proyecto basta hacer, **
 +
 +** Nota: ** procedimiento obsoleto ver preanon.sh y update_sbj.pl dentro de /old_nas/mri_face
 +
 +<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 946: Line 982:
 </code> </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 ===== ===== Evaluando neurodegeneración =====
  
Line 952: Line 1083:
 Primero obtener los datos, Primero obtener los datos,
 <code bash> <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 aseg -p mriface -o base_aseg.csv 
-[osotolongo@brick03 mri_face]$ xnat_pullfs.pl -s aparc -p unidad -o base_aparc.csv +[osotolongo@brick03 mri_face]$ xnat_pullfs.pl -s aparc -p mriface -o base_aparc.csv 
-[osotolongo@brick03 mri_face]$ join -t, base_aseg.csv base_aparc.csv > base_full.csv +[osotolongo@brick03 mri_face]$ awk -F',' '{print $1"_"$2","$0}' base_aseg.csv > tmp_aseg.csv 
-[osotolongo@brick03 mri_face]$ ./xnat_get_age.pl -x unidad+[osotolongo@brick03 mri_face]$ awk -F',' '{print $1"_"$2","$0}' base_aparc.csv > tmp_aparc.csv 
 +[osotolongo@brick03 mri_face]$ join -t, tmp_aseg.csv tmp_aparc.csv | awk -F',' '{$1=$50=$51=""; print $0}' | sed 's/^ //;s/ /,/g;s/,,,/,/g' >  base_full.csv 
 +[osotolongo@brick03 mri_face]$ (head -n 1 base_full.csv && tail -n +2 base_full.csv | sort -t,) > base_full_sorted.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]$ 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+[osotolongo@brick03 mri_face]$ awk -F',' '{print $1"_"$2","$0}' unidad_age_data_sorted.csv > tmp_age.csv 
 +[osotolongo@brick03 mri_face]$ awk -F',' '{print $1"_"$2","$0}' base_full_sorted.csv > tmp_base.csv 
 +[osotolongo@brick03 mri_face]$ join -t, tmp_age.csv tmp_base.csv | awk -F',' '{$1=$5=$6=""; print $0}' | sed 's/^ //;s/ /,/g;s/,,,/,/g'> input_data.csv
 </code> </code>
  
Line 985: Line 1121:
  
 {{:neuroimagen:unidad_classifier_output_middletemporal.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, y la densidad de probabilidades de presentar neurodegeneracion perteneciendo a este grupo sería algo como,
  
 {{:neuroimagen:unidad_posterior_probs.png?600|}} {{:neuroimagen:unidad_posterior_probs.png?600|}}
 +
 +
 +===== Comparando neurodegeneración con LCR =====
 +
 +Aqui hay dos puntos a tener en cuenta,
 +
 +1.- El algoritmo utilizado es correcto solamente para los pacientes preclínicos. Por construcción se supone que todos los sujetos diagnosticados con demencia tienen una probabilidad cierta (=1) de neurodegeneración. 
 +
 +2.- 
 +
 +<code bash>
 +awk -F',' '{if ($3!='3') print}' dxs_20230629.csv > dxs_20230629_notdemented.csv
 +awk -F',' '{print $2}' dxs_20230629_notdemented.csv > selected.csv
 +./get_lcr.pl -i selected.csv > nondemented_lcr.csv
 +awk -F',' '{print $2","$4","$5","$6}' nondemented_lcr.csv | sed 's/label/Subject_ID/' > lcr_data.csv
 +(head -n 1 lcr_data.csv && tail -n +2 lcr_data.csv | sort -t,) > lcr_data_sorted.csv
 +</code>
 +
 +En este punto solo hay que unir los valores de LCR con los de Nplus.
 +
 +<code bash>
 +join -t, classifier_output.csv lcr_data_sorted.csv > mriface_compare_data.csv
 +</code>
neuroimagen/mriface_reports.1657265838.txt.gz · Last modified: 2022/07/08 07:37 by osotolongo