User Tools

Site Tools


neuroimagen:notas_f5cehbi

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 ( LOL 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,

8-o 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. 8-)

[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 :-D . 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.

neuroimagen/notas_f5cehbi.txt · Last modified: 2021/07/23 09:20 by osotolongo