User Tools

Site Tools


neuroimagen:xnat_pipelines

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
neuroimagen:xnat_pipelines [2019/10/18 21:52]
daniel
neuroimagen:xnat_pipelines [2020/08/04 10:58] (current)
Line 87: Line 87:
 </code> </code>
  
-==== Comprobación de la instalación ====+=== Comprobación de la instalación ===
  
 Accediendo a XNat, en el menú Administer > Pipelines, seleccionar el enlace a “Add pipeline to repository”. En la página que se abre, se debe introducir en el campo “Enter path to pipeline descriptor xml =>” la ruta absoluta a la descripción XML del pipeline que queremos usar: Accediendo a XNat, en el menú Administer > Pipelines, seleccionar el enlace a “Add pipeline to repository”. En la página que se abre, se debe introducir en el campo “Enter path to pipeline descriptor xml =>” la ruta absoluta a la descripción XML del pipeline que queremos usar:
Line 104: Line 104:
  
 Esta opción nos recuerda que el procesamiento se lleva a cabo una vez se cargan las imágenes en el proyecto (o, si se cargan como “pre-archivo”, cuando se selecciona archivar éste). Esta opción nos recuerda que el procesamiento se lleva a cabo una vez se cargan las imágenes en el proyecto (o, si se cargan como “pre-archivo”, cuando se selecciona archivar éste).
 +
 +Para comprobar que la conversión se ha completado, se puede seleccionar “Actions > Download images”. En la página que se carga, se verá en la columna central con los “Scan formats” un apartado “NIFTY”.
 +
 +===== Ejemplos de pipelines =====
 +
 +A continuación se explica cuál es la estructura de un pipeline y se dan ejemplos de modificación de un pipeline y de construcción de otro.
 +
 +==== Estructura de un pipeline ====
 +
 +Un //pipeline// se define en un archivo XML dentro de un subdirectorio de ''pipeline/catalog'' que se crea al instalar el //pipeline engine// (dentro de ''/nas/data/xnat''). En el subdirectorio se recomienda la siguiente estructura:
 +  * descripción XML del //pipeline//
 +  * ''resources'': subdirectorio con definiciones XML para llamar a programas externos
 +  * ''scripts'': subdirectorio con los scripts o programas externos propios del //pipeline//
 +
 +La descripción del //pipeline// se hace en un documento XML con la siguiente estructura:
 +
 +<code xml>
 +<?xml version="1.0" encoding="UTF-8"?>
 +
 +<Pipeline xmlns="http://nrg.wustl.edu/pipeline"
 +          xmlns:xi="http://www.w3.org/2001/XInclude"
 +          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 +          xsi:schemaLocation="http://nrg.wustl.edu/pipeline ..\schema\pipeline.xsd"
 +          xmlns:fileUtils="http://www.xnat.org/java/org.nrg.imagingtools.utils.FileUtils">
 +
 + <name>Name of the Pileline</name>
 + <location>Directory</location>
 + <description>A brief description</description>
 +
 + <resourceRequirements>...</resourceRequirements>
 +
 + <!-- info about the pipeline and input parameters received from Xnat -->
 + <documentation>
 + <authors>...</authors>
 + <version>0</version>
 + <input-parameters>
 + <parameter>...</parameter>
 + ...
 + </input-parameters>
 + </documentation>
 +
 + <!-- what sort of data the pipeline applies to -->
 + <xnatInfo appliesTo="xnat:mrSessionData"/>
 +
 + <!-- directory where log output is written -->
 + <outputFileNamePrefix>...</outputFileNamePrefix>
 +
 + <!-- parameter on which to iterate steps through PIPELINE_LOOPON(iter) -->
 + <loop id="iter" xpath="..."/>
 +
 + <!-- other parameters defined in the pipeline -->
 + <parameters>
 + <parameter>...</parameter>
 + ...
 + </parameters>
 +
 + <!-- processing steps -->
 + <steps>
 + <!-- first step (workdirectory and flow control options are shown as an example) -->
 + <step id="1" description="Step 1" workdirectory="..." continueOnFailure="false" precondition="EXISTS(...)">
 + <!-- command to be run (described as a resource XML) -->
 + <resource name="command" location="directory" >
 + <argument id="arg">
 + <value>arg value</value>
 + </argument>
 + </resource>
 + </step>
 + ...
 + </steps>
 +
 +</Pipeline>
 +
 +
 +</code>
 +
 +==== Ejemplo: modificación del pipeline dcm2nii/DicomToNifti_X.xml ====
 +
 +Queremos cambiar el modo en que se llama a dcm2niix desde este pipeline, de manera que se agreguen en los nombres de los archivos NII generados el nombre del paciente (%n), el número de adquisición de la serie (%s) y la descripción o tipo de serie (%d).
 +
 +Para ello, primero definimos un //input-parameter// con la cadena de formato que se pasará a dcm2niix desde Xnat (que, en teoría, podríamos modificar al llamar al pipeline):
 +
 +<code xml>
 +<input-parameters>
 + ...
 + <parameter>
 + <name>output_nifti_filename_format</name>
 + <values>
 + <csv>%n_%s_%d</csv>
 + </values>
 + <description>Filename format</description>
 + </parameter>
 +</input-parameters>
 +</code>
 +
 +Luego, modificaremos la llamada a dcm2niix en el //step// "CONVERT" seleccionando nuestro argumento output_filename_format (usando la sintaxis XPath). Aprovechamos para añadir el nuevo argumento ignore_derived, para que en el procesamiento se ignoren las imágenes derivadas, los localizers y las imágenes 2D.
 +
 +<code xml>
 +
 + <step id="CONVERT" description="Convert each DICOM series into a 4d NIFTI file" precondition="EXISTS(^concat(/Pipeline/parameters/parameter[name='niidir']/values/unique/text(),'/',PIPELINE_LOOPON(series))^)" continueOnFailure="true">
 + <resource name="dcm2niix" location="dcm2niix/resources">
 + <argument id="gzip">
 + <value>y</value><!-- compress -->
 + </argument>
 + <argument id="ignore_derived"><!-- new argument -->
 + <value>y</value>
 + </argument>
 + <argument id="output_filename_format">
 + <value>^/Pipeline/parameters/parameter[name='output_nifti_filename_format']/values/unique/text()^</value><!-- selection from parameters -->
 + </argument>
 + <argument id="output">
 + <value>^concat(/Pipeline/parameters/parameter[name='niidir']/values/unique/text(),'/',PIPELINE_LOOPON(series))^</value>
 + </argument>
 + <argument id="input">
 + <value>^concat(/Pipeline/parameters/parameter[name='rawdir']/values/unique/text(),'/',PIPELINE_LOOPON(series))^</value>
 + </argument>
 + </resource>
 + </step>
 +
 +</code>
 +
 +Lo que sucede es que el //resource// dcm2niix/resources/dcm2niix.xml no contempla el argumento ignore_derived, así que tenemos que añadírselo:
 +
 +<code xml>
 + <argument id="ignore_derived">
 + <name>i</name>
 + <description>ignore derived [y|n]</description>
 + </argument>
 +</code>
 +
 +
 +++++ El código del nuevo DicomToNifti_Y.xml queda así |
 +<file xml DicomToNifti_Y.xml>
 +<?xml version="1.0" encoding="UTF-8"?>
 +<Pipeline xmlns="http://nrg.wustl.edu/pipeline" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://nrg.wustl.edu/pipeline ..\schema\pipeline.xsd" xmlns:fileUtils="http://www.xnat.org/java/org.nrg.imagingtools.utils.FileUtils">
 +
 +<name>DicomToNifti_Y</name>
 +
 +<location>dcm2niix</location>
 +
 +<description>Pipeline creates NIFTI files from DICOM files using dcm2niix (modified).</description>
 +
 +<documentation>
 + <authors>
 + <author>
 + <lastname>Flavin</lastname>
 + <firstname>John</firstname>
 + <contact>
 + <email>flavinj@mir.wustl.edu</email>
 + </contact>
 + </author>
 + </authors>
 + <version>20180811</version>
 + <input-parameters>
 + <parameter>
 + <name>scanids</name>
 + <values>
 + <schemalink>xnat:imageSessionData/scans/scan/ID</schemalink>
 + </values>
 + <description>Scan ids of all the scans of the session</description>
 + </parameter>
 + <parameter>
 + <name>output_nifti_filename_format</name>
 + <values>
 + <csv>%n_%s_%d</csv>
 + </values>
 + <description>Filename format</description>
 + </parameter>
 + </input-parameters>
 +</documentation>
 +
 +<outputFileNamePrefix>^concat(/Pipeline/parameters/parameter[name='logdir']/values/unique/text(),'/',/Pipeline/parameters/parameter[name='label']/values/unique/text())^</outputFileNamePrefix>
 +
 +<loop id="series" xpath="^/Pipeline/parameters/parameter[name='scanids']/values/list^"/>
 +
 +<parameters>
 + <parameter>
 + <name>workdir</name>
 + <values>
 + <unique>^concat(/Pipeline/parameters/parameter[name='builddir']/values/unique/text(),'/',/Pipeline/parameters/parameter[name='label']/values/unique/text())^</unique>
 + </values>
 + </parameter>
 + <parameter>
 + <name>logdir</name>
 + <values>
 + <unique>^concat(/Pipeline/parameters/parameter[name='workdir']/values/unique/text(),'/LOGS')^</unique>
 + </values>
 + </parameter>
 + <parameter>
 + <name>rawdir</name>
 + <values>
 + <unique>^concat(/Pipeline/parameters/parameter[name='workdir']/values/unique/text(),'/RAW')^</unique>
 + </values>
 + </parameter>
 + <parameter>
 + <name>niidir</name>
 + <values>
 + <unique>^concat(/Pipeline/parameters/parameter[name='workdir']/values/unique/text(),'/NIFTI')^</unique>
 + </values>
 + </parameter>
 +</parameters>
 +
 +<steps>
 + <step id="MKDIR_RAW" description="Create RAW folder">
 + <resource name="mkdir" location="commandlineTools">
 + <argument id="dirname">
 + <value>^/Pipeline/parameters/parameter[name='rawdir']/values/unique/text()^</value>
 + </argument>
 + </resource>
 + </step>
 +
 + <step id="MKDIR_NII" description="Create NIFTI folder">
 + <resource name="mkdir" location="commandlineTools">
 + <argument id="dirname">
 + <value>^/Pipeline/parameters/parameter[name='niidir']/values/unique/text()^</value>
 + </argument>
 + </resource>
 + </step>
 +
 + <step id="MKDIR_RAW_SCAN" description="Create folder for each series in RAW subfolder" workdirectory="^/Pipeline/parameters/parameter[name='rawdir']/values/unique/text()^">
 + <resource name="mkdir" location="commandlineTools">
 + <argument id="dirname">
 + <value>^PIPELINE_LOOPON(series)^</value>
 + </argument>
 + </resource>
 + </step>
 +
 + <step id="GET_SCANS" description="Download scan DICOMs" workdirectory="^concat(/Pipeline/parameters/parameter[name='rawdir']/values/unique/text(),'/',PIPELINE_LOOPON(series))^">
 + <resource name="XnatDataClient" location="xnat_tools">
 + <argument id="sessionId">
 + <value>^fileUtils:getJSESSION('DUMMY')^</value>
 + </argument>
 + <argument id="absolutePath"/>
 + <argument id="batch"/>
 + <argument id="method">
 + <value>GET</value>
 + </argument>
 + <argument id="remote">
 + <value>^concat('"',/Pipeline/parameters/parameter[name='host']/values/unique/text(),'/data/experiments/',/Pipeline/parameters/parameter[name='id']/values/unique/text(),'/scans/',PIPELINE_LOOPON(series),'/resources/DICOM/files"')^</value>
 + </argument>
 + </resource>
 + </step>
 + <step id="RMEMPTYDIRS" description="Removes empty dirs" precondition="EXISTS(^concat(/Pipeline/parameters/parameter[name='rawdir']/values/unique/text(),'/',PIPELINE_LOOPON(series))^)" continueOnFailure="true">
 + <!-- rmdir ../$SERIES -->
 + <resource name="rmdir" location="commandlineTools" >
 + <!-- resource not in standard xnat pipelines catalog -->
 + <argument id="dir">
 + <value>^concat(/Pipeline/parameters/parameter[name='rawdir']/values/unique/text(),'/',PIPELINE_LOOPON(series))^</value>
 + </argument>
 + </resource>
 + </step>
 +
 + <step id="MKDIR_NII_SCAN" description="Create folder for each series in NIFTI subfolder" precondition="EXISTS(^concat(/Pipeline/parameters/parameter[name='rawdir']/values/unique/text(),'/',PIPELINE_LOOPON(series))^)" workdirectory="^/Pipeline/parameters/parameter[name='niidir']/values/unique/text()^">
 + <resource name="mkdir" location="commandlineTools">
 + <argument id="dirname">
 + <value>^PIPELINE_LOOPON(series)^</value>
 + </argument>
 + </resource>
 + </step>
 + <step id="CONVERT" description="Convert each DICOM series into a 4d NIFTI file" precondition="EXISTS(^concat(/Pipeline/parameters/parameter[name='niidir']/values/unique/text(),'/',PIPELINE_LOOPON(series))^)" continueOnFailure="true">
 + <resource name="dcm2niix" location="dcm2niix/resources">
 + <argument id="gzip">
 + <value>y</value>
 + </argument>
 + <argument id="ignore_derived"><!-- new argument -->
 + <value>y</value>
 + </argument>
 + <argument id="output_filename_format">
 + <value>^/Pipeline/parameters/parameter[name='output_nifti_filename_format']/values/unique/text()^</value>
 + </argument>
 + <argument id="output">
 + <value>^concat(/Pipeline/parameters/parameter[name='niidir']/values/unique/text(),'/',PIPELINE_LOOPON(series))^</value>
 + </argument>
 + <argument id="input">
 + <value>^concat(/Pipeline/parameters/parameter[name='rawdir']/values/unique/text(),'/',PIPELINE_LOOPON(series))^</value>
 + </argument>
 + </resource>
 + </step>
 + <step id="UPLOAD" description="Upload NIFTI files" precondition="EXISTS(^concat(/Pipeline/parameters/parameter[name='niidir']/values/unique/text(),'/',PIPELINE_LOOPON(series))^)" continueOnFailure="true">
 + <resource name="XnatDataClient" location="xnat_tools">
 + <argument id="sessionId">
 + <value>^fileUtils:getJSESSION('DUMMY')^</value>
 + </argument>
 + <argument id="method">
 + <value>PUT</value>
 + </argument>
 + <argument id="remote">
 + <value>^concat('"',/Pipeline/parameters/parameter[name='host']/values/unique/text(),'/data/experiments/',/Pipeline/parameters/parameter[name='id']/values/unique/text(),'/scans/',PIPELINE_LOOPON(series),'/resources/NIFTI/files?overwrite=true&amp;format=NIFTI&amp;content=NIFTI_RAW&amp;reference=',/Pipeline/parameters/parameter[name='niidir']/values/unique/text(),'/',PIPELINE_LOOPON(series),'&amp;event_id=',/Pipeline/parameters/parameter[name='workflowid']/values/unique/text(),'"')^</value>
 + </argument>
 + </resource>
 + </step>
 +</steps>
 +
 +</Pipeline>
 +</file>
 +++++
 +
 +++++ El código de dcm2niix.xml queda así |
 +<file xml dcm2niix.xml>
 +<?xml version="1.0" encoding="UTF-8"?>
 +<Resource xmlns="http://nrg.wustl.edu/pipeline">
 + <name>dcm2niix</name>
 +    <commandPrefix>source /nas/data/xnat/pipeline/scripts/dcm2niix_setup.sh;</commandPrefix>
 + <type>Executable</type>
 + <description>Generates NIFTI files from DICOM</description>
 + <input>
 + <argument id="gzip">
 + <name>z</name>
 + <description>gzip [y|n]</description>
 + </argument>
 + <argument id="ignore_derived">
 + <name>i</name>
 + <description>ignore derived [y|n]</description>
 + </argument>
 + <argument id="output_filename_format">
 + <name>f</name>
 + <description>Output filename format string. (%c=comments %f=folder name %i ID of patient %m=manufacturer %n=name of patient %p=protocol %s=series, %t=time; default 'N')</description>
 + </argument>
 + <argument id="output">
 + <name>o</name>
 + <description>Output Folder</description>
 + </argument>
 + <argument id="input"/>
 + </input>
 +</Resource>
 +</file>
 +++++
 +
 +==== Ejemplo: resource nuevo para llamar al programa tar ====
 +
 +En algunos pipelines puede interesar comprimir varios ficheros resultantes en un archivo tar.gz, usando el muy común programa tar de UNIX. Los //pipelines// de ejemplo no incluyen este programa como uno de los //resources// en commandlineTools, pero es muy fácil de escribirlo con las opciones básicas para comprimir archivos como
 +<code bash>
 +$ tar -z -cf archivo.tar.gz fichero1.ext fichero2.ext ...
 +</code>
 +
 +++++El código de tar.xml sería así |
 +<file xml tar.xml>
 +<?xml version="1.0" encoding="UTF-8"?>
 +<Resource xmlns="http://nrg.wustl.edu/pipeline">
 + <name>tar</name>
 + <type>Executable</type>
 + <description>TAR a dir/file</description>
 + <estimated_time>00:00:01</estimated_time>
 + <input>
 + <argument id="compress">
 + <name>z</name>
 + <description>apply gzip</description>
 + </argument>
 + <argument id="archive">
 + <name>cf</name>
 + <description>Archive name</description>
 + </argument>
 + <argument id="files">
 + <description>Dir/files to tar</description>
 + </argument>
 + </input>
 +</Resource>
 +</file>
 +++++
 +
 +==== Ejemplo: pipeline nuevo para limpieza de las series en una sesión DICOM ====
 +
 +Partiendo de un //pipeline// de ejemplo, creamos el pipeline ''CleanMRSession.xml'' que lleva a cabo la selección de los scans de una serie DICOM de forma análoga a la descrita en la página [[neuroimagen:xnat_api|Usar la API de XNAT]].
 +
 +Este //pipeline// consta de los siguientes archivos:
 +
 +  * ''CleanMRSession.xml'': la descripción de los pasos de procesamiento
 +  * ''resources/cleanMRSession.xml'': el //resource// que describe cómo se llama al script Bash siguiente
 +  * ''scripts/cleanMRSession.sh'': el script Bash
 +
 +
 +++++El código de CleanMRSession.xml es así |
 +<file xml CleanMRSession.xml>
 +
 +<?xml version="1.0" encoding="UTF-8"?>
 +<Pipeline xmlns="http://nrg.wustl.edu/pipeline" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://nrg.wustl.edu/pipeline ..\schema\pipeline.xsd"  xmlns:fileUtils="http://www.xnat.org/java/org.nrg.imagingtools.utils.FileUtils">
 + <name>RunCommand</name>
 + <location>CleanMRSession</location>
 + <description>Leave only valid series in a session</description>
 +
 +<!-- Standard input parameters -->
 + <documentation>
 + <authors>
 +     <author>
 +     <lastname>Rodriguez-Perez</lastname>
 + <firstname>Daniel</firstname>
 +     </author>
 + </authors>
 + <version>0</version>
 + <input-parameters>
 + <parameter>
 + <name>scanIDs</name>
 + <values><schemalink>xnat:mrSessionData/scans/scan/ID</schemalink></values>
 + <description>The scan ids of all the scans of the session</description>
 + </parameter>
 + <parameter>
 + <name>sessionID</name>
 + <values><schemalink>xnat:mrSessionData/ID</schemalink></values>
 + <description>Xnat session ID</description>
 + </parameter>
 + <parameter>
 + <name>sessionName</name>
 + <values><schemalink>xnat:mrSessionData/label</schemalink></values>
 + <description>Xnat session label</description>
 + </parameter>
 + <parameter>
 + <name>projectID</name>
 + <values><schemalink>xnat:mrSessionData/project</schemalink></values>
 + <description>Project</description>
 + </parameter>
 + <parameter>
 + <name>subjectID</name>
 + <values><schemalink>xnat:mrSessionData/subject_ID</schemalink></values>
 + <description>Subject ID</description>
 + </parameter>
 + </input-parameters>
 + </documentation>
 +
 + <xnatInfo appliesTo="xnat:mrSessionData"/>
 +
 + <outputFileNamePrefix>^concat(/Pipeline/parameters/parameter[name='workdir']/values/unique/text(),'/LOG')^</outputFileNamePrefix>
 +
 +<!-- Pipeline loop -->
 + <loop id="series" xpath="^/Pipeline/parameters/parameter[name='scanIDs']/values/list^"/>
 +
 +<!-- Other computed parameters -->
 + <parameters>
 + <parameter>
 + <name>workdir</name>
 + <values>
 + <unique>^concat(/Pipeline/parameters/parameter[name='builddir']/values/unique/text(),'/',/Pipeline/parameters/parameter[name='sessionName']/values/unique/text())^</unique>
 + </values>
 + </parameter>
 + </parameters>
 +
 + <steps>
 +<!-- Download session series -->
 + <step id="MKDIRS" description="Make DICOM folders" workdirectory="^/Pipeline/parameters/parameter[name='workdir']/values/unique/text()^">
 + <!-- mkdir -p $WORKDIR/RAW/series -->
 + <resource name="mkdir" location="commandlineTools" >
 + <argument id="p"/>
 + <argument id="dirname">
 + <value>^concat(/Pipeline/parameters/parameter[name='workdir']/values/unique/text(),'/RAW/',PIPELINE_LOOPON(series))^</value>
 + </argument>
 + </resource>
 + </step>
 + <step id="DOWNLOAD" description="Download scan DICOMs" workdirectory="^concat(/Pipeline/parameters/parameter[name='workdir']/values/unique/text(), '/RAW/',PIPELINE_LOOPON(series))^">
 + <!-- XnatDataClient -username $USER -password $PASSWORD -useAbsolutePAth -batch -method GET "$HOST/data/experiments/$SESSIONID/scans/$SERIES/resources/DICOM/files" -->
 + <resource name="XnatDataClient" location="xnat_tools">
 + <argument id="user">
 + <value>^/Pipeline/parameters/parameter[name='user']/values/unique/text()^</value>
 + </argument>
 + <argument id="password">
 + <value>^/Pipeline/parameters/parameter[name='pwd']/values/unique/text()^</value>
 + </argument>
 + <argument id="absolutePath"/>
 + <argument id="batch"/>
 + <argument id="method">
 + <value>GET</value>
 + </argument>
 + <argument id="remote">
 + <value>^concat('"',/Pipeline/parameters/parameter[name='host']/values/unique/text(),'/data/experiments/',/Pipeline/parameters/parameter[name='sessionID']/values/unique/text(),'/scans/',PIPELINE_LOOPON(series),'/resources/DICOM/files"')^</value>
 + </argument>
 + </resource>
 + </step>
 +<!-- Check and delete unfit series -->
 + <step id="CLEAN" description="Run clean script" workdirectory="^concat(/Pipeline/parameters/parameter[name='workdir']/values/unique/text(),'/RAW')^" continueOnFailure="true" >
 + <resource name="cleanMRSession" location="CleanMRSession/resources">
 + <!--- cleanMRSession RAW/$series -->
 + <argument id="user">
 + <value>^/Pipeline/parameters/parameter[name='user']/values/unique/text()^</value>
 + </argument>
 + <argument id="password">
 + <value>^/Pipeline/parameters/parameter[name='pwd']/values/unique/text()^</value>
 + </argument>
 + <argument id="URL">
 + <value>^concat('"',/Pipeline/parameters/parameter[name='host']/values/unique/text(),'/data/experiments/',/Pipeline/parameters/parameter[name='sessionID']/values/unique/text(),'/scans/"')^</value>
 + </argument>
 + <argument id="series">
 + <value>^PIPELINE_LOOPON(series)^</value>
 + </argument>
 + </resource>
 + </step> 
 +<!-- Delete all files -->
 + <step id="RMDIRS" description="Remove all DICOMs" workdirectory="^/Pipeline/parameters/parameter[name='workdir']/values/unique/text()^">
 + <!-- rm -rf $WORKDIR/RAW/series $WORKDIR/CLS/series -->
 + <resource name="rm" location="commandlineTools" >
 + <argument id="r"/>
 + <argument id="f"/>
 + <argument id="file">
 + <value>^concat(/Pipeline/parameters/parameter[name='workdir']/values/unique/text(),'/noRAW')^</value>
 + </argument>
 + </resource>
 + </step>
 +<!-- The end -->
 + </steps>
 +</Pipeline>
 +
 +</file>
 +++++
 +
 +++++ El código de cleanMRSession.xml (descripción de cleamMRSession.sh) es así |
 +<file xml cleanMRSession.xml>
 +
 +<?xml version="1.0" encoding="UTF-8"?>
 +<!-- -->
 +<Resource xmlns="http://nrg.wustl.edu/pipeline">
 + <name>cleanMRSession.sh</name>
 + <location>CleanMRSession/scripts</location>
 + <commandPrefix>bash</commandPrefix>
 + <type>Executable</type>
 + <description>Moves admissible series from one folder to another</description>
 + <estimated_time>00:01:00</estimated_time>
 + <input>
 + <argument id="user">
 + <name>u</name>
 + <description>User</description>
 + </argument>
 + <argument id="password">
 + <name>p</name>
 + <description>Password</description>
 + </argument>
 + <argument id="URL">
 + <name>U</name>
 + <description>URL</description>
 + </argument>
 + <argument id="series">
 + <description>Series</description>
 + </argument>
 + </input>
 +</Resource>
 +
 +</file>
 +++++
 +
 +
 +++++ El código de cleanMRSession.sh (script que realiza el borrado) es así |
 +<file bash cleanMRSession.sh>
 +
 +#!/bin/bash
 +
 +#NOTA: requires dicom3tools' dcmkey
 +
 +ARGS=( "$@" )
 +
 +#parse arguments
 +USER=""
 +PASSWORD=""
 +URL=""
 +SERIES=""
 +for ((n=0; n<${#ARGS[@]}; n++)) ; do
 + case "${ARGS[$n]}" in
 + -u)
 + let n=n+1
 + USER="${ARGS[$n]}"
 + ;;
 + -p)
 + let n=n+1
 + PASSWORD="${ARGS[$n]}"
 + ;;
 + -U)
 + let n=n+1
 + URL="${ARGS[$n]}"
 + ;;
 + -*) echo "Skipping option ${ARGS[$n]}" >&2
 + ;;
 + *)
 + SERIES="${ARGS[$n]}"
 + ;;
 + esac
 +done
 +
 +echo "USER=$USER"
 +echo "PASSWORD=$PASSWORD"
 +echo "URL=$URL"
 +echo "SERIES=$SERIES"
 +
 +#temporaries
 +TMP_PRO=$(mktemp)
 +
 +#Tipos de estudios
 +cat > $TMP_PRO <<.EOF
 +ep2d_bold_p2_resting_state
 +ep2d_fid_basic_bold_p2_AP 
 +ep2d_fid_basic_bold_p2_PA 
 +asl_3d_tra_iso_3.0_highres
 +DTIep2d_diff_mddw_48dir_p3_AP 
 +DTIep2d_diff_mddw_4b0_PA
 +t1_mprage_sag_p2_iso
 +t2_space_dark-fluid_sag_p2_iso
 +.EOF
 +
 +#Archivos de la misma serie ($4 único), con fechas y descripciones, filtrados por tipo de estudio
 +DCM="$(ls "$SERIES" | head -n 1)"
 +dckey -k "AcquisitionDate" "$SERIES/$DCM" 2>&1 | grep -v Error &&\
 +dckey -k "SeriesDescription" "$SERIES/$DCM" 2>&1 | grep -v Error | grep -v -f $TMP_PRO &&\
 +$HOME/pipeline/xnat-tools/XnatDataClient -u $USER -p $PASSWORD -r "$URL/$SERIES" -m DELETE
 +
 +#Dejar todo limpio
 +rm -f  $TMP_PRO
 +
 +</file>
 +++++
  
  
neuroimagen/xnat_pipelines.1571435543.txt.gz · Last modified: 2020/08/04 10:46 (external edit)