Table of Contents
Notas para FACEHBI visita 5
Adquisicion PET-FBB
Tags PET-FBB
- “CTAC” Imagen del TC para realizar la Atenuation Correction.
- “PETAC_Read” Imagen sumatoria de 20 minutos que es la que nos piden desde AMYPAD para realizar la valoración visual (que hago yo mediante una web en cada uno de los casos.
- “PETAC_Standard” Estudio dinámico de adquisición PET en modo LIST que hace reconstrucciones de 5m x 4 = 20 min CON orrección de atenuación y con los parámetros de reconstrucción solicitados por AMYPAD
- “PETNAC_Standard” Estudio dinámico de adquisición PET en modo LIST que hace reconstrucciones de 5m x 4 = 20 min SIN corrección de atenuación y con los parámetros de reconstrucción solicitados por AMYPAD
- “PETAC_Standard_FACEHBI” Estudio dinámico de adquisición PET en modo LIST que hace reconstrucciones de 5m x 4 = 20 min CON corrección de atenuación y con los parámetros de reconstrucción definidos para el estudio FACEHBI y que se vienen usando desde que comenzó el estudio en el 2015.
Artefactos adquisicion
Lamento comunicaros que, a pesar de haber enviado las imágenes de los sujetos de 032-10156, 10129, 10100 y 10080 a Siemens, nos dicen que los estudios son insalvables ya que el problema estaba en una línea de detectores y por lo tanto la re-reconstrucción de imágenes también ha salido artefactuada. Os muestro una imagen de ejemplo donde se pueden ver unas líneas verticales.
Correccion de movimiento
Con el nuevo protocolo de la visita 5 se ha eliminado la imagen de 20min que teniamos en las visitas anteriores. La opcion que tenemos ahora para eliminar la correccion de movimiento es hacer un Tmean a la imagen de 4x5min y registrar o registrar cada una por separado y hacer el Tmean luego
Pero vamos que no importa mucho. Ni para el SUVR,
Ni para el Centiloide ( por supuesto),
Esto esta hecho con XNAT. El pipeline original no hacia la correccion de movimiento pero el actual la hace. En la v5 hay pocos casos pero si hago lo mismo en v0 y v2 juntas tengo los mismo, aunque en este caso he utilizado el pipeline pero es la misma comparacion,
Resumiendo: Voy a dejar la correccion de movimiento en XNAT porque es lo correcto “formalmente” peroe sta claro que es igual una cosa que otra. El pipeline del cluster tiene la opcion de hacerlo (-wcorr) o no (por defecto) asi que todo OK.
Correspondencia AMYPAD - FACEHBI
Debo tener una correspondencia en tre los dos estudios,
[osotolongo@brick03 f5cehbi]$ head amypad_facehbi.list 032-10001,F005 032-10002,F015 032-10003,F001 032-10004,F024 032-10005,F010 032-10006,F023 032-10007,F013 032-10008,F030 032-10009,F009 032-10010,F039
A partir de aqui,
[osotolongo@brick03 f5cehbi]$ for x in `cat amypad_facehbi.list`; do a=$(echo ${x} | awk -F"," '{print $1}'); f=$(echo ${x} | awk -F"," '{print $2}'); echo "${f},FACEHBI_${a}-FBB"; done | sed '1iF007,FACEHBI-F007v5' | sort -t, -k 1 > imgdirs.csv [osotolongo@brick03 f5cehbi]$ head imgdirs.csv F001,FACEHBI_032-10003-FBB F005,FACEHBI_032-10001-FBB F007,FACEHBI-F007v5 F008,FACEHBI_032-11008-FBB F009,FACEHBI_032-10009-FBB F010,FACEHBI_032-10005-FBB F013,FACEHBI_032-10007-FBB F014,FACEHBI_032-10017-FBB F015,FACEHBI_032-10002-FBB F018,FACEHBI_032-11018-FBB
y saco las fechas,
[osotolongo@brick03 f5cehbi]$ for x in `cat imgdirs.csv`; do p=$(echo ${x} | awk -F"," '{print $2}'); f=$(find /nas/clinic/facehbi_5/${p} -type f | head -n 1); d=$(dckey -k "AcquisitionDate" ${f} 2>&1); echo "${x},${d}"; done > imgdates.csv [osotolongo@brick03 f5cehbi]$ head imgdates.csv F001,FACEHBI_032-10003-FBB,20200206 F005,FACEHBI_032-10001-FBB,20200206 F007,FACEHBI-F007v5,20191219 F008,FACEHBI_032-11008-FBB,20201112 F009,FACEHBI_032-10009-FBB,20200213 F010,FACEHBI_032-10005-FBB,20200213 F013,FACEHBI_032-10007-FBB,20200910 F014,FACEHBI_032-10017-FBB,20200903 F015,FACEHBI_032-10002-FBB,20200206 F018,FACEHBI_032-11018-FBB,20201008
Subiendo a XNAT por pedazos
Primero me bajo el CSV de xnat que contiene la lista de los sujetos del proyecto,
[osotolongo@brick03 f5cehbi]$ head xnat_up.csv Subject,M/F,Hand,YOB,MR Sessions,PET Sessions F001,U,,,1,1 F005,U,,,1,1 F006,U,,,1, F007,U,,,1,1 F008,U,,,,1 F009,U,,,1,1 F010,U,,,1,1 F013,U,,,1,1 F014,U,,,1,1
ahora,
[osotolongo@brick03 f5cehbi]$ awk -F"," '{if($6=="") print $1}' xnat_up.csv > nopetyet.list [osotolongo@brick03 f5cehbi]$ grep -f nopetyet.list amypad_id_traslations.csv > nopetyet_amypad.csv [osotolongo@brick03 f5cehbi]$ for x in `cat nopetyet_amypad.csv`; do f=$(echo ${x} | awk -F"," '{print $1}'); a=$(echo ${x} | awk -F"," '{print $2}'); if [[ -e /nas/clinic/facehbi_5/FACEHBI_${a}-FBB ]]; then echo ${x}; fi; done > sube_esto.csv
Ya tenemos para subir a XNAT y ejecutar el pipeline,
[osotolongo@brick03 f5cehbi]$ for x in `cat sube_esto.csv`; do f=$(echo ${x} | awk -F"," '{print $1}'); a=$(echo ${x} | awk -F"," '{print $2}'); xnatapic upload_dicom --project_id f5cehbi --subject_id ${f} --experiment_id ${f}A --pipelines /nas/clinic/facehbi_5/FACEHBI_${a}-FBB; done [osotolongo@brick03 f5cehbi]$ for x in `cat sube_esto.csv`; do f=$(echo ${x} | awk -F"," '{print $1}'); xnatapic run_pipeline --pipeline RegisterPETwithMRImatch --project_id f5cehbi --experiment_id ${f}A; done [osotolongo@brick03 f5cehbi]$ queue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 35924 fast RegisterPETwithMRImatch.XNAT5_E01203 xnat R 1:03 1 brick01 35925 fast RegisterPETwithMRImatch.XNAT5_E01204 xnat R 1:03 1 brick01 35926 fast RegisterPETwithMRImatch.XNAT5_E01205 xnat R 1:03 1 brick01 35927 fast RegisterPETwithMRImatch.XNAT5_E01206 xnat R 1:03 1 brick01 35928 fast RegisterPETwithMRImatch.XNAT5_E01207 xnat R 1:03 1 brick01 35929 fast RegisterPETwithMRImatch.XNAT5_E01208 xnat R 1:02 1 brick01 35930 fast RegisterPETwithMRImatch.XNAT5_E01209 xnat R 1:02 1 brick01 35931 fast RegisterPETwithMRImatch.XNAT5_E01210 xnat R 1:02 1 brick01 35932 fast RegisterPETwithMRImatch.XNAT5_E01211 xnat R 1:02 1 brick02 35933 fast RegisterPETwithMRImatch.XNAT5_E01212 xnat R 1:02 1 brick02 35934 fast RegisterPETwithMRImatch.XNAT5_E01213 xnat R 0:59 1 brick02 35935 fast RegisterPETwithMRImatch.XNAT5_E01214 xnat R 0:59 1 brick02 35936 fast RegisterPETwithMRImatch.XNAT5_E01215 xnat R 0:59 1 brick02
Dando output a los resultados
Lo arreglo un poco y lo uno con los codigos internos,
[osotolongo@brick03 f5cehbi]$ sed -i '1iPSubject,Directory,Date' imgdates.csv [osotolongo@brick03 f5cehbi]$ join -t, internos.csv imgdates.csv | awk -F"," '{print $1","$2","$4}' > info_pet.csv [osotolongo@brick03 f5cehbi]$ ./format_date.pl info_pet.csv [osotolongo@brick03 f5cehbi]$ head info_pet_proper.csv PSubject,Interno,Date F001,20090806,06.02.2020 F005,20141272,06.02.2020 F007,20080716,19.12.2019 F008,20131483,12.11.2020 F009,20141277,13.02.2020 F010,20141280,13.02.2020 F013,20070303,10.09.2020 F014,20100381,03.09.2020 F015,20141087,06.02.2020
Hago el archivo de guia,
[osotolongo@brick03 f5cehbi]$ sed 's/;/,/' f5cehbi_mri.csv | sort -t, -k 2 | sed '1iSubject,PSubject' > guia_mri.csv [osotolongo@brick03 f5cehbi]$ join -t, -1 2 -2 1 guia_mri.csv info_pet_proper.csv > gdata_pet.csv [osotolongo@brick03 f5cehbi]$ head gdata_pet.csv PSubject,Subject,Interno,Date F001,0001,20090806,06.02.2020 F005,0002,20141272,06.02.2020 F007,0004,20080716,19.12.2019 F009,0005,20141277,13.02.2020 F010,0006,20141280,13.02.2020 F013,0017,20070303,10.09.2020 F014,0007,20100381,03.09.2020 F015,0008,20141087,06.02.2020 F023,0009,20150075,12.03.2020
Ahora organizo,
[osotolongo@brick03 f5cehbi]$ mkdir fbb_results [osotolongo@brick03 f5cehbi]$ sed 's/;/,/g' xnat_fbb_cl.csv > fbb_results/xnat_fbb_cl.csv [osotolongo@brick03 f5cehbi]$ cat info_page_pet.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 ,, ,Centiloid,https://link.springer.com/article/10.1007/s00259-017-3749-6 ,info:,http://detritus.fundacioace.com/files/metodos_FBB.pdf
Ejecuto el formateador,
[osotolongo@brick03 f5cehbi]$ metrics2xls.pl -i fbb_results -g gdata_pet.csv -o fbb_results.xls -s info_page_pet.csv f5cehbi
y ya esta,
Seguimiento de las MRI
Tengo que ver cuantas MRI me faltan segun el plan de visitas. Tengo que abrir el archivo compartido. Sacar la columna de codigos de proyecto y de fecha de MRI (hay que copiar todo el rango a un archivo nuevo y despues borrar las intermedias).
Idealmente bastaria con convertir esto a un CSV pero el nuevo y mas moderno MSExcel no parece tener esa opcion. Asi que guardamos el .xlsx y vamos a ver como los convertimos.
Y aqui despotricamos un poco sobre las nuevas features del office365 que mola mucho pero o nos deja hacer nada que ellos no quieran
Asi que tenemos que pensar un poco antes de darnos por vencidos y lo que voy a hacer es escribir un script facil que me lleve una hoja de .xlsx a CSV. mmmmm,
- xls2csv.pl
#!/usr/bin/perl use strict; use warnings; use Spreadsheet::XLSX; my $ifile = shift; die "Should supply input file!!!!!\n\n" unless $ifile; my $excel = Spreadsheet::XLSX -> new ($ifile); foreach my $sheet (@{$excel -> {Worksheet}}) { $sheet -> {MaxRow} ||= $sheet -> {MinRow}; foreach my $row ($sheet -> {MinRow} .. $sheet -> {MaxRow}) { $sheet -> {MaxCol} ||= $sheet -> {MinCol}; foreach my $col ($sheet -> {MinCol} .. $sheet -> {MaxCol}) { my $cell = $sheet -> {Cells} [$row] [$col]; if($cell -> {Val}) {print($cell -> {Val});} print ","; } print "\n"; } print "\n"; }
y ahora,
[osotolongo@brick03 f5cehbi]$ ./xls2csv.pl mri_status_20210707.xlsx > mri_status_20210707.csv
y a ver,
[osotolongo@brick03 f5cehbi]$ head -n 40 mri_status_20210707.csv F001,27/01/2020 - 14:00, F002,, F003,, F004,, F005,03/02/2020 - 18:00, F006,08/01/2020 - 14:45, F007,10/12/19 - 13:30, F008,22/06/2020 - 7:00, F009,23/01/2020 - 11:30, F010,22/01/2020 - 13:00, F011,, F012,, F013,13/06/2020 - 9:00, F014,12/03/2020 - 11:30, F015,30/01/2020 - 12:45, F016,, F017,, F018,22/06/2020 - 18:00, F019,, F020,15/06/2020 - 20:00, F021,NO HACE RM POR CLAUSTROFOBIA,
que sucio esta esto, ala,
[osotolongo@brick03 f5cehbi]$ awk -F"," '{if ($2) print }' mri_status_20210707.csv | awk -F" -" '{print $1}' | grep -i -v "no\|retira" > mri_status_20210707_almostclean.csv [osotolongo@brick03 f5cehbi]$ head -n 40 mri_status_20210707_almostclean.csv F001,27/01/2020 F005,03/02/2020 F006,08/01/2020 F007,10/12/19 F008,22/06/2020 F009,23/01/2020 F010,22/01/2020 F013,13/06/2020 F014,12/03/2020 F015,30/01/2020 F018,22/06/2020 F020,15/06/2020 F023,17/02/2020 F024,13/02/2020 F025,22/02/2020 F027,1/7/2020 F028,29/06/2020 F029,28/02/2020 F030,20/02/2020 F033,19/06/2020 F036,27/02/2020 F039,24/02/2020 F041,25/06/2020 F043,3/7/2020 F044,17/07/2020 F048,23/06/12 F052,6/7/2020 F053,10/07/2020 F054,30/07/2020 F055,16/07/2020- 12:15, F056,03/07/2020 F058,21/09/2020 F061,09/03/2020 F063,25/06/20 F065,28/09/2020 F068,9/9/2020 F069,30/06/2020 F070,31/7/2020 F071,20/06/2020 F072,14/07/2020
bueno no gana ningun premio pero se puede trabajar.
[osotolongo@brick03 f5cehbi]$ wc -l mri_status_20210707_almostclean.csv 154 mri_status_20210707_almostclean.csv
A ver los que hay bajados
[osotolongo@brick03 f5cehbi]$ ls /nas/corachan/FACEHBI_V5_OSCAR_ZIP/*.zip | grep -v "-" | awk -F"/" '{print $5}' | sed 's/\.zip//' > downloaded.list [osotolongo@brick03 f5cehbi]$ wc -l downloaded.list 125 downloaded.list
y vamos a ver cuales no estan en el server,
[osotolongo@brick03 f5cehbi]$ grep -v "`cat downloaded.list`" mri_status_20210707_almostclean.csv F044,17/07/2020 F158,2021-07-15, F178,10/05/2021 F182,1/06/2021 F185,28/04/2021 F189,21/06/2021 F192,31/03/2021 F194,6/4/2021 F195,03/06/2021 F196,22/06/2021 F203,07/05/2021 F208,18/06/2021 F216,13/05/2021 F219,14/05/2021 F220,10/05/2021 F223,07/05/2021 F226,07/05/2021 F228,2021-09-01, F229,1/6/2021 F231,12/05/2021 F233,15/06/2021 F234,15/06/2021 F236,14/05/2021 F238,06/05/2021 F239,12/05/2021 F241,12/05/2021 F243,12/05/2021 F245,5/7/2021 F246,30/07/2021
Vaya unas 29 que me faltan,
Pues copias esta lista y se la mandas a quien ya sabes para que los suba . Pero antes miras las fechas que estan eln el futuro y no les pides esos!!!!!
Seguimiento de los PET
Para ir chequeando los PET que se van subiendo podemos bajarnos el csv de los sujetos de del proyecto directamente de XNAT y despues sacar la lista de PETs que se han subido,
[osotolongo@brick03 f5cehbi]$ awk -F"," '{if($6==1) print $1}' xnat_f5cehbi_list_7_23_2021_9_27_52.csv > pets_uploaded.list [osotolongo@brick03 f5cehbi]$ wc -l pets_uploaded.list 105 pets_uploaded.list
Ahora voy a quitarlos de la lista de AMYPAD,
[osotolongo@brick03 f5cehbi]$ grep -v "^`cat pets_uploaded.list`" amypad_id_traslations.csv > amypad_not_uploaded.csv
Voy a sacar ahora una lista de los IDs de los PET que tengo en disco,
[osotolongo@brick03 f5cehbi]$ ls /nas/clinic/facehbi_5/ | awk -F"_" '{print $2}' | awk -F"-" '{print $2}' > they_are_here.list
y ahora viene la parte tricky, cuantos debo subir?
[osotolongo@brick03 f5cehbi]$ grep "032-`cat they_are_here.list`" amypad_not_uploaded.csv > go.csv
a ver como queda esto en un loop,
[osotolongo@brick03 f5cehbi]$ while read guy; do sbj=$(echo ${guy} | awk -F"," '{print $1}'); ind=$(echo ${guy} | awk -F"-" '{print $2}'); tgd=$(ls /nas/clinic/facehbi_5/ | grep ${ind}); xnatapic upload_dicom --project_id f5cehbi --subject_id ${sbj} --experiment_id ${sbj}A /nas/clinic/facehbi_5/${tgd}; done < go.csv
y esto demora un poco pues compacta cada PET y lo sube a XNAT.
FIX para las MRI viejas y la web de IXICO
Si la web de IXICO no encuentra ningun DICOM en el directorio de Corachand, hay que correr dcmconv sobre cada dicom. (Ver https://github.com/DCMTK/dcmtk)
Ejemplo,
[osotolongo@brick03 F099]$ for x in `find /nas/corachan/facehbi/F099/ -type f`; do y=$(echo ${x} | sed 's/.*F099\/\(.*\)/\1/;s/(/_/;s/)/_/'); d=$(echo ${y} | awk -F"/" '{print $1}'); f=$(echo ${y} | awk -F"/" '{print $2}'); if [ ! -d ${d} ]; then mkdir ${d}; fi; dcmconv ${x} ${d}/${f}; done