Automatizacion con xnatapic
Felizmente tenemos ya un cliente de xnat para manipulacion basica de archivos y pipelines. Vamos a aprender a usarlo para las tareas comunes.
Subiendo un sujeto
Esto ahora es bastante simple de hacer. Necesitamos el nombre del proyecto, el nombre que queremos dar al sujeto y el directorio donde estan las imagenes. Con el formato nuevo, que tiene todos los DICOM en la misma carpeta esto sera muy sencillo.
Primero necesitamos sacar el PatientID de los DICOM pues este sera el nombre del experimento de XNAT. Esto es mas o menos sencillo,
PTID=$(dckey -k "PatientID" ${DIR}/$(ls ${DIR}/ | head -n 1) 2>&1 | sed 's/[ \t]$//g')
Aqui DIR es la variable donde guardamos el directorio DICOM y el sed se usa para quitar algun espacio extra del tag.
En aquellos casos en que los archivos DICOM se encuentren en subdirectorios, tendremos que cambiar el ls por un find:
PTID=$(dckey -k "PatientID" "$(find "${DIR}/" -type f | head -n 1)" 2>&1 | sed 's/[ \t]$//g')
Por último, también es posible que justo el primer archivo de la serie no tenga PatientID, así que complicamos un poco el código y buscamos el primer archivo que tenga ese dato:
for f in $(find "$DIR/" -type f); do if PTID=$(dckey -k "PatientID" 2>&1 | sed 's/[ \t]$//g') && ! [ -z "$PTID" ] ; then break fi done Ahora he de crear proyecto y sujeto pero solo en caso de que no existan, <code bash> f [[ -z $(xnatapic list_projects --project_id ${PROY}) ]]; then xnatapic create_project --project_id ${PROY}; fi if [[ -z $(xnatapic list_subjects --project_id ${PROY} --subject_id ${SUBJECT}) ]]; then xnatapic create_subject --project_id ${PROY} --subject_id ${SUBJECT}; fi
y luego subir los archivos,
xnatapic upload_dicom --project_id ${PROY} --subject_id ${SUBJECT} --experiment_id ${PTID} ${DIR}
Por ultimo, la ejecución automática de los pipelines esta desactivada (por ahora) por problemas de sincronizacion de las subidas. Voy a ejecutar el pipeline de conversion a NIfTI. Antes debo comprobar que el pipeline esta cargado en el proyecto:
DCMC=$(xnatapic list_pipelines --project_id ${PROY} | grep DicomToNifti_Y) if [[ $DCMC == DicomToNifti_X ]]; then xnatapic run_pipeline --project_id ${PROY} --pipeline DicomToNifti_Y --experiment_id ${PTID}; fi
Nota: el DicomToNifti_Y es una adaptación del DicomToNifti_X para ajustar la nomenclatura del archivo que se genera y otras cosas.
El output,
[osotolongo@detritus mopead]$ /upload_subject.sh Test3 PJBQEK3J /nas/corachan/MOPEAD/NYQTFWH6 PROY=Test3 SUBJECT=PJBQEK3J DIR=/nas/corachan/MOPEAD/NYQTFWH6 PTID=D18475994 curl -f -X POST -u admin:fundacioace http://detritus.fundacioace.com:8088/data/services/import?import-handler=SI&dest=/archive/projects/Test3/subjects/PJBQEK3J/experiments/D18475994&overwrite=delete&triggerPipelines=false -F file.tar.gz=@/tmp/tmp.qVL30cuwWw-10001.tar.gz curl -f -X POST -u admin:fundacioace http://detritus.fundacioace.com:8088/data/services/import?import-handler=SI&dest=/archive/projects/Test3/subjects/PJBQEK3J/experiments/D18475994&overwrite=delete&triggerPipelines=false -F file.tar.gz=@/tmp/tmp.GMVZq9R2G6-11001.tar.gz curl -f -X POST -u admin:fundacioace http://detritus.fundacioace.com:8088/data/services/import?import-handler=SI&dest=/archive/projects/Test3/subjects/PJBQEK3J/experiments/D18475994&overwrite=delete&triggerPipelines=false -F file.tar.gz=@/tmp/tmp.OzBboB3wJh-12001.tar.gz ... curl -f -X POST -u admin:fundacioace http://detritus.fundacioace.com:8088/data/services/import?import-handler=SI&dest=/archive/projects/Test3/subjects/PJBQEK3J/experiments/D18475994&overwrite=delete&triggerPipelines=false -F file.tar.gz=@/tmp/tmp.81ZTkjURKC-1037.tar.gz Error: could not upload /nas/corachan/MOPEAD/NYQTFWH6
Nota: El error final lo producen algunas series que no se cargan correctamente (¡razón por determinar!).
Y, desde la UI se ve que las va subiendo de una en una:
… y una hora después …
¿Que pasa si le quito el mixed-series?
xnatapic upload_dicom --project_id ${PROY} --subject_id ${SUBJECT} --experiment_id ${PTID} ${DIR}
[osotolongo@detritus mopead]$ upload_subject.sh Test3 PJBKQK2P /nas/corachan/MOPEAD/PJBKQK2P PROY=Test3 SUBJECT=PJBKQK2P DIR=/nas/corachan/MOPEAD/PJBKQK2P PTID=D19115384 curl -f -X POST -u admin:fundacioace http://detritus.fundacioace.com:8088/data/services/import?import-handler=SI&dest=/archive/projects/Test3/subjects/PJBKQK2P/experiments/D19115384&overwrite=delete&triggerPipelines=false -F file.tar.gz=@/tmp/tmp.vTA51qEYJI.tar.gz
Parece que tan sólo las sube en una única vez (y tarda mucho menos).
Y en ambos caso, al final, ejecuta el pipeline: