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:49]
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 101: Line 101:
 <code> <code>
 * Launch pipeline automatically when session is archived * Launch pipeline automatically when session is archived
-ovewrite: Y 
 </code> </code>
  
-La primera 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). La segunda, que es propia de este pipeline, le indica éste que si la imagen convertida en Nifty ya existía, se rescriba.+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 completadose 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á 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_derivedpara 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]}" >&
 + ;; 
 + *) 
 + 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.1571435366.txt.gz · Last modified: 2020/08/04 10:45 (external edit)