User Tools

Site Tools


neuroimagen:xnat_pipelines_freesurfer

Pipeline para procesamiento con Freesurfer en cluster

Llamada a Freesurfer

Queremos hacer una llamada a Freesurfer para realizar un -autorecon-all () usando los volúmenes NIFTI de T1 y T2 (si este último existen) de una sesión de un sujeto. Esto se hace invocando:

$ recon-all -autorecon-all -i imgT1.nii -T2 imgT2.nii -subjid SUBJ_ID 

Implementación del pipeline

Se implementa un pipeline que lleve a cabo los siguientes pasos:

  1. descargar los NII del repositorio Xnat: se asume que estos archivos han sido creados en un proceso anterior con el pipeline DicomToNifti_Y
  2. si éstos no existen en el repositorio Xnat, generarlos a partir de las series DICOM correspondientes, es decir
    1. descargar las series DICOM del repositorio Xnat
    2. ejecutar la conversión dcm2niix tal como se ejecuta desde DicomToNifti_Y
  3. detectar cuáles son los volúmenes NIFTI correspondientes a T1 y T2 (si existe) y llamar a recon-all
  4. comprimir en un archivo tar.gz los resultados
  5. subirlos al repositorio Xnat como recursos del “experimento”

Nota: la estructura del pipeline es similar a los otros descritos en Plataforma XNAT - Pipelines, la única novedad son los resources añadidos para las instrucciones de línea de comandos tar.xml y rmdir.xml, y el uso de los atributos precondition y continueOnFailure para asegurar que los pasos de procesamiento se ejecutan cuando existen los archivos necesarios o que no detienen el pipeline en caso de error (respectivamente).

La llamada al programa recon-all se lleva a cabo en el step RUNFREESURFER

	<step id="RUNFREESURFER" description="Run freesurfer" workdirectory="^/Pipeline/parameters/parameter[name='workdir']/values/unique/text()^" continueOnFailure="false" >
		<!-- mkdir -p $WORKDIR/FS -->
		<resource name="mkdir" location="commandlineTools" >
			<argument id="dirname">
				<value>^/Pipeline/parameters/parameter[name='fsdir']/values/unique/text()^</value>
			</argument>
		</resource>
 
		<resource name="runFreesurfer" location="RunFreesurfer/resources">
			<argument id="dirNII">
				<value>^/Pipeline/parameters/parameter[name='niidir']/values/unique/text()^</value>
			</argument>
			<argument id="tagT1">
				<value>^/Pipeline/parameters/parameter[name='dcmT1tag']/values/unique/text()^</value>
			</argument>
			<argument id="tagT2">
				<value>^/Pipeline/parameters/parameter[name='dcmT2tag']/values/unique/text()^</value>
			</argument>
			<argument id="dirFS">
				<value>^/Pipeline/parameters/parameter[name='fsdir']/values/unique/text()^</value>
			</argument>
			<argument id="subjectID">
				<value>^/Pipeline/parameters/parameter[name='subjectID']/values/unique/text()^</value>
			</argument>
		</resource>
	</step>

El código del pipeline RunFreesurfer.xml es así

El resource runFreesurfer.xml describe el comportamiento del script Bash runFreesurfer.sh que selecciona los archivos NII a partir del tipo de secuencia que se puede leer en los JSON asociados a ellos. Ese identificador de secuencia (uno para las secuencias T1 y otro para las T2) se le pasan al pipeline como parámetros desde Xnat (los parameters dcmT1tag y dcmT2tag).

El código de runFreesurfer.xml es así

El código del script Bash runFreesurfer.sh es así

Ejecución del pipeline desde la GUI de Xnat

El pipeline se puede añadir a un proyecto de Xnat usando la interfaz gráfica. Edición de opciones de un pipeline. Desde el diálogo de configuración se puede seleccionar que se ejecute al cargar un nuevo estudio. También se pueden indicar los nombres de las secuencias que se reconocerán como T1 y T2.

Una vez se ha ejecutado el pipeline los resultados se pueden encontrar en los “resources” del experimento, bajo la “carpeta” FS. Estructura de imágenes y recursos de un estudio procesado.

Ejecución del pipeline en el cluster usando Slurm

El mecanismo de pipelines de Xnat contempla la posibilidad de utilizar un scheduler para ejecutar los pipelines aprovechando una arquitectura cluster (o grid). No obstante, aunque la especificación existe, no existe una implementación (al menos, no una funcional para Slurm ).

La especificación en los pipelines de Xnat consta de dos partes: los resourceRequirements del pipeline y el script schedule mediante el que se ejecuta el comando PipelineRunner que interpreta y lleva a cabo los pasos del procesamiento.

Los resourceRequirements del pipeline

Se trata de un elemento XML que se inserta antes de la <documentation> del pipeline y que define una serie de propiedades (pares clave-valor) que debería interpretar el scheduler en el que se ejecutase el pipeline; por esta razón, estas propiedades y sus valores son específicos de dicho scheduler.

Éste sería un ejemplo del código que usaremos para ejecutarlo en slurm:

<resourceRequirements><!-- to be interpreted by the schedule script -->
   <property name="srun_args">-p fast --cpus-per-task=4 --mem-per-cpu=4G</property>
</resourceRequirements>

El script schedule

El script schedule (que se halla en $PIPELINE_HOME/bin) contiene solamente

#!/bin/bash
$@

Es decir, se limita a ejecutar los argumentos que se le pasan.

Un schedule más inteligente, que identifica el archivo XML del pipeline que es pasado mediante la opción -pipeline al programa PipelineRunner, lee en los resourceRequirements el srun_args y ejecuta el comando srun de acuerdo a ellos se incluye en el siguiente código:

schedule
#!/bin/bash
 
ARGS=( "$@" )
for ((n=0; n<${#ARGS[@]}; n++)) ; do
	case "${ARGS[$n]}" in
	-pipeline)
		let n=n+1
		XMLfile="${ARGS[$n]}"
	;;
	esac
done
 
if ! [ -z "$XMLfile" ] &&\
	SARGS=( $( grep '<property name="srun_args">' "$XMLfile" | sed 's/^.*<property name="srun_args">//' | sed 's/<\/property>//' ) ) ; then
	srun ${SARGS[@]} $@
else
	$@
fi
neuroimagen/xnat_pipelines_freesurfer.txt · Last modified: 2020/08/04 10:58 (external edit)