changeset 0:4341b8ff2a46 draft default tip

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/seurat_v5 commit a9214c07b0cc929a51fd92a369bb89c675b6c88d
author iuc
date Wed, 11 Sep 2024 10:20:51 +0000
parents
children
files integrate.xml macros.xml
diffstat 2 files changed, 793 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/integrate.xml	Wed Sep 11 10:20:51 2024 +0000
@@ -0,0 +1,356 @@
+<tool id="seurat_integrate" name="Seurat Integrate" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@PROFILE@">
+    <description> and manipulate layers </description>
+    <macros>
+        <import>macros.xml</import>
+    </macros>
+    <expand macro="requirements"/>
+    <expand macro="version_command"/>
+    <command detect_errors="exit_code"><![CDATA[
+@CMD@
+    ]]></command>
+    <configfiles>
+        <configfile name="script_file"><![CDATA[
+@CMD_imports@
+@CMD_read_inputs@
+
+#if $method.method == 'SplitLayers'
+    seurat_obj[['$method.assay']]<-split(
+        seurat_obj[['$method.assay']], 
+        f = seurat_obj[['$method.factor', drop = TRUE]]
+    )
+
+#else if $method.method == 'IntegrateLayers'
+
+    #if $method.features
+    features_list<-paste(readLines('$method.features'), collapse=",")
+    #end if
+
+    seurat_obj<-IntegrateLayers(
+        seurat_obj, 
+        method = $method.integration.integration_method,
+        #if $method.integration.integration_method == 'CCAIntegration'
+            #if $method.integration.adv.k_filter
+            k.filter = $method.integration.adv.k_filter,
+            #else           
+            k.filter = NA,
+            #end if
+            dims = 1:$method.integration.adv.dims,
+            #if $method.integration.adv.dims_to_integrate
+            dims.to.integrate = $method.integration.adv.dims_to_integrate,
+            #end if
+            k.weight = $method.integration.adv.k_weight,
+            #if $method.integration.adv.weight_reduction != ''
+            weight.reduction = c(unlist(strsplit(gsub(" ", "", '$method.integration.adv.weight_reduction'), ","))),
+            #end if
+            sd.weight = $method.integration.adv.sd_weight,
+            preserve.order = $method.integration.adv.preserve_order,
+        #else if $method.integration.integration_method == 'HarmonyIntegration'
+            npcs = $method.integration.adv.npcs,
+            key = '$method.integration.adv.key',
+            #if $method.integration.adv.theta
+            theta = $method.integration.adv.theta,
+            #end if
+            #if $method.integration.adv.lambda
+            lambda = $method.integration.adv.lambda,
+            #end if
+            sigma = $method.integration.adv.sigma,
+            #if $method.integration.adv.nclust
+            nclust = $method.integration.adv.nclust,
+            #end if
+            max_iter = $method.integration.adv.max_iter,
+        #else if $method.integration.integration_method == 'JointPCAIntegration'
+            k.anchor = $method.integration.adv.k_anchor,
+            dims = 1:$method.integration.adv.dims,
+            #if $method.integration.adv.dims_to_integrate
+            dims.to.integrate = $method.integration.adv.dims_to_integrate,
+            #end if
+            k.weight = $method.integration.adv.k_weight,
+            #if $method.integration.adv.weight_reduction != ''
+            weight.reduction = c(unlist(strsplit(gsub(" ", "", '$method.integration.adv.weight_reduction'), ","))),
+            #end if
+            sd.weight = $method.integration.adv.sd_weight,
+            preserve.order = $method.integration.adv.preserve_order,
+        #else if $method.integration.integration_method == 'RPCAIntegration'
+            #if $method.integration.adv.k_filter
+            k.filter = $method.integration.adv.k_filter,
+            #else           
+            k.filter = NA,
+            #end if
+            dims = 1:$method.integration.adv.dims,
+            #if $method.integration.adv.dims_to_integrate
+            dims.to.integrate = $method.integration.adv.dims_to_integrate,
+            #end if
+            k.weight = $method.integration.adv.k_weight,
+            #if $method.integration.adv.weight_reduction != ''
+            weight.reduction = c(unlist(strsplit(gsub(" ", "", '$method.integration.adv.weight_reduction'), ","))),
+            #end if
+            sd.weight = $method.integration.adv.sd_weight,
+            preserve.order = $method.integration.adv.preserve_order,
+        #end if
+        orig.reduction = '$method.orig_reduction', 
+        new.reduction = '$method.new_reduction',
+        #if $method.assay != ''
+        assay = '$method.assay',
+        #end if
+        #if $method.features
+        features = c(unlist(strsplit(features_list, ","))),
+        #end if
+        #if $method.layers != ''
+        layers = c(unlist(strsplit(gsub(" ", "", '$method.layers'), ","))),
+        #end if
+        #if $method.scale_layers != ''
+        scale_layers = c(unlist(strsplit(gsub(" ", "", '$method.scale_layers'), ","))),
+        #end if
+        #if $method.normalization_method == 'true'
+        normalization.method = 'SCT'
+        #end if
+    )
+
+#else if $method.method == 'JoinLayers'
+    seurat_obj[['$method.assay']]<-JoinLayers(
+        seurat_obj[['$method.assay']]
+    )
+
+#else if $method.method == 'PrepSCTFindMarkers'
+    seurat_obj<-PrepSCTFindMarkers(
+        seurat_obj,
+        assay = '$method.assay'
+    )
+
+#end if
+
+@CMD_rds_write_outputs@
+
+]]></configfile>
+    </configfiles>
+    <inputs>
+        <expand macro="input_rds"/>
+        <conditional name="method">
+            <param name="method" type="select" label="Method used">
+                <option value="SplitLayers">Split data into layers using 'split'</option>
+                <option value="IntegrateLayers" selected="true">Apply integration methods with 'IntegrateLayers'</option>
+                <option value="JoinLayers">Join layers with 'JoinLayers'</option>
+                <option value="PrepSCTFindMarkers">Prepare to run DE on SCT Assay with 'PrepSCTFindMarkers'</option>
+            </param>
+            <when value="SplitLayers">
+                <param argument="assay" type="text" value="RNA" label="Name of assay to use">
+                    <expand macro="valid_name"/>
+                </param>
+                <param name="factor" type="text" value="" label="Factor or group to use to split data" help="(f)">
+                    <expand macro="valid_name"/>
+                </param>
+            </when>
+            <when value="IntegrateLayers">
+                <conditional name="integration">
+                    <param name="integration_method" type="select" label="Integration method to use" help="(method)">
+                        <option value="CCAIntegration">CCA Integration</option>
+                        <option value="HarmonyIntegration">Harmony Integration</option>
+                        <option value="JointPCAIntegration">Joint PCA Integration</option>
+                        <option value="RPCAIntegration">RPCA Integration</option>
+                    </param>
+                    <when value="CCAIntegration">
+                        <section name="adv" title="Advanced Options">
+                        <param name="k_filter" type="integer" optional="true" value="" label="Number of anchors to filter" help="leave blank to use all (k.filter)"/>
+                        <expand macro="integration_inputs"/>
+                        </section>
+                    </when>
+                    <when value="HarmonyIntegration">
+                        <section name="adv" title="Advanced Options">
+                            <param argument="npcs" type="integer" optional="true" value="50" label="Number of PCs to compute if doing PCA on input matrix"/>
+                            <param argument="key" type="text" value="harmony_" label="Dimensional reduction key" help="specifies the string before the number for the dimension names (reduction.key)">
+                                <expand macro="valid_reduction_key"/>
+                            </param>
+                            <param argument="theta" type="float" optional="true" value="" label="Diversity clustering penalty parameter"/>
+                            <param argument="lambda" type="float" optional="true" value="" label="Ridge regression penalty parameter"/>
+                            <param argument="sigma" type="float" value="0.1" label="Width of soft kmeans clusters"/>
+                            <param argument="nclust" type="integer" optional="true" value="" label="Number of clusters in model"/>
+                            <param argument="max_iter" type="integer" value="10" label="Maximum number of rounds to run Harmony"/>
+                        </section>
+                    </when>
+                    <when value="JointPCAIntegration">
+                        <section name="adv" title="Advanced Options">
+                            <param name="k_anchor" type="integer" value="20" label="How many neighbors (k) to use when picking anchors"/>
+                            <expand macro="integration_inputs"/>
+                        </section>
+                    </when>
+                    <when value="RPCAIntegration">
+                        <section name="adv" title="Advanced Options">
+                            <param name="k_filter" type="integer" optional="true" value="" label="Number of anchors to filter" help="leave blank to use all (k.filter)"/>
+                            <expand macro="integration_inputs"/>
+                        </section>
+                    </when>
+                </conditional>
+                <param name="orig_reduction" type="text" value="pca" label="Dimensional reduction to use for correction" help="(orig.reduction)">
+                    <expand macro="valid_name"/>
+                </param>
+                <param name="new_reduction" type="text" value="integrated.dr" label="Name for new dimensional reduction" help="(new.reduction)">
+                   <expand macro="valid_name"/>
+                </param>
+                <expand macro="select_assay"/>
+                <param argument="features" type="data" format="txt,tabular" optional="true" label="List of features to use for integration" help="text file with one feature on each line"/>
+                <param argument="layers" type="text" optional="true" value="" label="Names of normalized layer(s) in assay">
+                    <expand macro="valid_list"/>
+                </param>
+                <param name="scale_layers" type="text" optional="true" value="" label="Names of scaled layer(s) in assay" help="(scale.layer)">
+                    <expand macro="valid_list"/>
+                </param>
+                <param name="normalization_method" type="boolean" truevalue="true" falsevalue="false" label="Use SCT as Normalization Method" help="after using SCTransform (normalization.method)"/>
+            </when>
+            <when value="JoinLayers">
+                <param argument="assay" type="text" value="RNA" label="Name of assay to join">
+                   <expand macro="valid_name"/>
+                </param>
+            </when>
+            <when value="PrepSCTFindMarkers">
+                <param argument="assay" type="text" value="SCT" label="Name of Assay where SCT objects are stored">
+                   <expand macro="valid_name"/>
+                </param>
+            </when>
+        </conditional>
+        <expand macro="inputs_common_advanced"/>
+    </inputs>
+    <outputs>
+        <expand macro="seurat_outputs"/>
+    </outputs>
+   <tests>
+        <test expect_num_outputs="2">
+            <!-- test1:  SplitLayers -->
+            <param name="seurat_rds" location="https://zenodo.org/records/13732784/files/added_metadata.rds"/>
+            <conditional name="method">
+                <param name="method" value="SplitLayers"/>
+                <param name="assay" value="RNA"/>
+                <param name="factor" value="Group"/>                 
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="split"/>
+                </assert_contents>
+            </output>
+            <output name="rds_out" location="https://zenodo.org/records/13732784/files/splitdata.rds" ftype="rds"/>
+        </test>
+        <test expect_num_outputs="2">
+            <!-- test2:  IntegrateLayers-->
+            <param name="seurat_rds" location="https://zenodo.org/records/13732784/files/unintegrated_umap.rds"/>
+            <conditional name="method">
+                <param name="method" value="IntegrateLayers"/>
+                <conditional name="integration">
+                    <param name="integration_method" value="CCAIntegration"/>
+                </conditional>
+                <param name="orig_reduction" value="pca"/>
+                <param name="new_reduction" value="integrated.cca"/>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="IntegrateLayers"/>
+                </assert_contents>
+            </output>
+            <output name="rds_out" location="https://zenodo.org/records/13732784/files/cca_integrated.rds" ftype="rds"/>
+        </test>
+        <test expect_num_outputs="2">
+            <!-- test3:  IntegrateLayers - Harmony Installed-->
+            <param name="seurat_rds" location="https://zenodo.org/records/13732784/files/unintegrated_umap.rds"/>
+            <conditional name="method">
+                <param name="method" value="IntegrateLayers"/>
+                <conditional name="integration">
+                    <param name="integration_method" value="HarmonyIntegration"/>
+                </conditional>
+                <param name="orig_reduction" value="pca"/>
+                <param name="new_reduction" value="integrated.harm"/>            
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="IntegrateLayers"/>
+                </assert_contents>
+            </output>
+            <output name="rds_out" location="https://zenodo.org/records/13732784/files/harm_integrated.rds" ftype="rds" compare="sim_size"/>
+        </test>
+        <test expect_num_outputs="2">
+            <!-- test4:  JoinLayers-->
+            <param name="seurat_rds" location="https://zenodo.org/records/13732784/files/integrated_umap.rds"/>
+            <conditional name="method">
+                <param name="method" value="JoinLayers"/>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="JoinLayers"/>
+                </assert_contents>
+            </output>
+            <output name="rds_out" location="https://zenodo.org/records/13732784/files/joined.rds" ftype="rds"/>
+        </test>
+        <test expect_num_outputs="2">
+            <!-- test5:  PrepSCTFindMarkers-->
+            <param name="seurat_rds" location="https://zenodo.org/records/13732784/files/SCT_integrated_umap.rds"/>
+            <conditional name="method">
+                <param name="method" value="PrepSCTFindMarkers"/>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="PrepSCTFindMarkers"/>
+                </assert_contents>
+            </output>
+            <output name="rds_out" location="https://zenodo.org/records/13732784/files/PrepSCTFindMarkers.rds" ftype="rds"/>
+        </test>
+    </tests>
+    <help><![CDATA[
+Seurat
+======
+
+Seurat is an R package designed for QC, analysis, and exploration of single-cell RNA-seq data. 
+
+Seurat aims to enable users to identify and interpret sources of heterogeneity from single-cell transcriptomic measurements, and to integrate diverse types of single-cell data.
+
+
+Split
+=====
+
+The split function is used here to split the data into separate layers based on the groups defined by f. Each group becomes its own layer in the Seurat Object.
+
+More details on the `R documentation
+<https://rdrr.io/r/base/split.html>`__
+
+
+Integrate
+=========
+
+Multiple layers are integrated to enable them to be analysed together. 
+
+Available methods are: CCA, Harmony, JointPCA, RPCA, FastMNN and scVI.
+
+More details on the `seurat documentation
+<https://satijalab.github.io/seurat-object/reference/CreateSeuratObject.html>`__
+
+JoinLayers
+==========
+
+Multiple layers (e.g. those created using the split function) can be joined together in a single layer. No integration is performed by this function.
+
+More details on the `seurat documentation
+<https://satijalab.github.io/seurat-object/reference/SplitLayers.html>`__
+
+PrepSCTFindMarkers
+==================
+
+Given a merged object with multiple SCT models, this function uses minimum of the median UMI (calculated using the raw UMI counts) of individual objects to reverse the individual SCT regression model using minimum of median UMI as the sequencing depth covariate. 
+The counts slot of the SCT assay is replaced with recorrected counts and the data slot is replaced with log1p of recorrected counts.
+
+More details on the `seurat documentation
+<https://satijalab.org/seurat/reference/prepsctfindmarkers>`__
+
+    ]]></help>
+    <expand macro="citations"/>
+</tool>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/macros.xml	Wed Sep 11 10:20:51 2024 +0000
@@ -0,0 +1,437 @@
+<macros>
+    <token name="@TOOL_VERSION@">5.0</token>
+    <token name="@VERSION_SUFFIX@">0</token>
+    <token name="@PROFILE@">23.0</token>
+    <xml name="requirements">
+        <requirements>
+            <requirement type="package" version="@TOOL_VERSION@">r-seurat</requirement>
+            <requirement type="package" version="1.2.1">fit-sne</requirement>
+            <requirement type="package" version="3.58.1">bioconductor-limma</requirement>
+            <requirement type="package" version="1.28.0">bioconductor-mast</requirement>
+            <requirement type="package" version="1.42.0">bioconductor-deseq2</requirement>
+            <requirement type="package" version="2.1.3">r-svglite</requirement>
+            <requirement type="package" version="1.1">r-metap</requirement>
+            <requirement type="package" version="1.14.0">bioconductor-glmGamPoi</requirement>
+            <requirement type="package" version="0.5.3">umap-learn</requirement> <!-- https://github.com/satijalab/seurat/issues/8283 -->
+            <requirement type="package" version="0.10.2">leidenalg</requirement>
+            <requirement type="package" version="1.2.0">r-harmony</requirement>
+            <requirement type="package" version="1.18.0">bioconductor-batchelor</requirement>
+            <requirement type="package" version="2.0.0">numpy</requirement>
+            <requirement type="package" version="2.2.2">pandas</requirement>
+        </requirements>
+    </xml>
+    <xml name="citations">
+        <citations>
+            <citation type="doi">10.1038/s41587-023-01767-y</citation>
+        </citations>
+    </xml>
+    <xml name="sanitize_query" token_validinitial="string.printable">
+        <sanitizer>
+            <valid initial="@VALIDINITIAL@">
+                <remove value="&apos;" />
+            </valid>
+       </sanitizer>
+    </xml>
+    <xml name="sanitize_vectors" token_validinitial="string.digits">
+        <sanitizer>
+            <valid initial="@VALIDINITIAL@">
+                <add value=","/>
+            </valid>
+        </sanitizer>
+    </xml>
+    <xml name="version_command">
+        <version_command><![CDATA[
+echo $(R --version | grep version | grep -v GNU)", Seurat version" $(R --vanilla --slave -e "library(Seurat); cat(sessionInfo()\$otherPkgs\$DESeq2\$Version)" 2> /dev/null | grep -v -i "WARNING: ")
+        ]]></version_command>
+    </xml>
+
+    <token name="@CMD_imports@"><![CDATA[
+library(Seurat)
+    ]]>
+    </token>
+    <token name="@reticulate_hack@"><![CDATA[
+library(reticulate)
+## HACK: CI biocontainers do not contain a useable conda binary, just the env.
+##  see: https://github.com/galaxyproject/tools-iuc/issues/5585#issuecomment-1803773923
+is_biocontainer = grepl("^# cmd: /opt/conda/bin/",
+                        paste0(reticulate:::python_info_condaenv_find("/usr/local/"),
+                               "-none"))
+if (is_biocontainer) {
+   ## conda detection false positive
+   assignInNamespace("is_conda_python", function(x) FALSE, ns="reticulate")
+   use_python("/usr/local/bin/python")
+} else {
+   conda_path = Sys.getenv("CONDA_PREFIX")
+   if (conda_path != "") {
+      ## Active conda env found
+      use_python(file.path(conda_path, "bin", "python3"))
+   } else {
+      ## Not biocontainer or conda, assume system python
+      use_python("/usr/bin/python3")
+   }
+}]]>
+    </token>
+    <xml name="input_rds">
+        <param name="seurat_rds" type="data" format="rds" label="Input file with the Seurat object"/>
+    </xml>
+    <token name="@CMD_read_inputs@"><![CDATA[
+seurat_obj = readRDS('seurat.rds')
+        ]]>
+    </token>
+    <token name="@CMD_read_expression_matrix@"><![CDATA[
+counts<-read.table("matrix.tab", header=TRUE, row.names=1, sep="\t")
+    ]]>]
+    </token>
+    <token name="@CMD@"><![CDATA[
+cp '$seurat_rds' seurat.rds &&
+cat '$script_file' > $hidden_output &&
+Rscript '$script_file' >> $hidden_output
+    ]]>
+    </token>
+    <xml name="inputs_common_advanced">
+        <section name="advanced_common" title="Advanced Output" expanded="false">
+            <param name="show_log" type="boolean" checked="false" label="Output Log?" />
+        </section>
+    </xml>
+    <xml name="outputs_common_advanced">
+        <data name="hidden_output" format="txt" label="Log file" >
+            <filter>advanced_common['show_log']</filter>
+        </data>
+    </xml>
+    <xml name="seurat_outputs">
+        <data name="rds_out" format="rds" from_work_dir="seurat.rds" label="${tool.name} (${method.method}) on ${on_string}: RDS">
+             <filter>method['method'] != 'Inspect'</filter>
+        </data>
+        <expand macro="outputs_common_advanced"/>
+    </xml>
+    <token name="@CMD_rds_write_outputs@"><![CDATA[
+saveRDS(seurat_obj, 'seurat.rds')
+        ]]>
+    </token>
+    <xml name="variable_out">
+        <data name="variable_tabular" format="txt" from_work_dir="variable_out.txt" label="${tool.name} (${method.method}) on ${on_string}: Top variable features list">
+            <filter>method['method'] == 'FindVariableFeatures' or method['method'] == 'SCTransform'</filter>
+            <filter>method['output_topN']['output_topN'] == 'true'</filter>
+        </data>
+    </xml>
+    <token name="@CMD_write_variable_tab@"><![CDATA[
+write.table(top_N, 'variable_out.txt', sep= "\t", col.names = FALSE, quote = FALSE)
+    ]]>
+    </token>
+    <xml name="markers_out">
+        <data name="markers_tabular" format="csv" from_work_dir="markers_out.csv" label="${tool.name} (${method.method}) on ${on_string}: Markers list">
+            <filter>method['method'] == 'FindAllMarkers' or method['method'] == 'FindMarkers' or method['method'] == 'FindConservedMarkers'</filter>
+        </data>
+    </xml>
+    <token name="@CMD_write_markers_tab@"><![CDATA[
+write.csv(seurat_obj, 'markers_out.csv', quote = FALSE)
+    ]]>
+    </token>
+    <xml name="print_top_pcs">
+        <data name="top_pcs" format="txt" from_work_dir="print_pcs.txt" label="${tool.name} Print PCs on ${on_string}">
+            <filter>method['method'] == 'RunPCA' and method['print_pcs']['print_pcs'] == 'true'</filter>
+        </data>
+    </xml>
+    <xml name="inspect_out">
+        <data name="inspect_tabular" format="tabular" from_work_dir="inspect_out.tab" label="${tool.name} Inspect (${method.inspect.inspect}) on ${on_string}">
+            <filter>method['method'] == 'Inspect' and method['inspect']['inspect'] != 'General'</filter>
+        </data>
+        <data name="inspect_general" format="txt" from_work_dir="inspect.txt" label="${tool.name} Inspect General on ${on_string}">
+            <filter>method['method'] == 'Inspect' and method['inspect']['inspect'] == 'General'</filter>
+        </data>
+    </xml>
+    <token name="@CMD_inspect_rds_outputs@"><![CDATA[
+write.table(inspect, 'inspect_out.tab', sep="\t", col.names = col.names, row.names = row.names, quote = FALSE)    
+    ]]>
+    </token>
+    <xml name="plot_out">
+        <data name="plot_out_png" format="png" from_work_dir="plot.png" label="${tool.name} (${method.method}) on ${on_string}: png plot">
+            <filter>plot_format == 'png'</filter>
+        </data>
+        <data name="plot_out_pdf" format="pdf" from_work_dir="plot.pdf" label="${tool.name} (${method.method}) on ${on_string}: pdf plot">
+            <filter>plot_format == 'pdf'</filter>
+        </data>
+        <data name="plot_out_svg" format="svg" from_work_dir="plot.svg" label="${tool.name} (${method.method}) on ${on_string}: svg plot">
+            <filter>plot_format == 'svg'</filter>
+        </data>
+        <data name="plot_out_jpeg" format="jpeg" from_work_dir="plot.jpeg" label="${tool.name} (${method.method}) on ${on_string}: jpeg plot">
+            <filter>plot_format == 'jpeg'</filter>
+        </data>
+        <data name="plot_out_tex" format="tex" from_work_dir="plot.tex" label="${tool.name} (${method.method}) on ${on_string}: tex plot">
+            <filter>plot_format == 'tex'</filter>
+        </data>
+        <data name="plot_out_tiff" format="tiff" from_work_dir="plot.tiff" label="${tool.name} (${method.method}) on ${on_string}: tiff plot">
+            <filter>plot_format == 'tiff'</filter>
+        </data>
+        <data name="plot_out_eps" format="eps" from_work_dir="plot.eps" label="${tool.name} (${method.method}) on ${on_string}: eps plot">
+            <filter>plot_format == 'eps'</filter>
+        </data>
+    </xml>
+    <xml name="param_eps" tokens="eps_value">
+        <param argument="eps" type="float" value="@EPS_VALUE@"  label="Small number to avoid numerical errors"/>
+    </xml>
+    <xml name="valid_name">
+        <validator type="regex" message="Please only use letters, numbers, or _ - .">^[\w\-.]+$</validator>
+    </xml>
+    <xml name="valid_reduction_key">
+        <validator type="regex" message="Please only use letters and _">^[A-Za-z_]+$</validator>
+    </xml>
+    <xml name="valid_list">
+        <validator type="regex" message="Please only use letters, numbers, or _ - . ,">^[\w\-., ]+$</validator>
+    </xml>
+    <xml name="valid_cell_name">
+        <validator type="regex" message="Please only use letters, numbers, or punctuation marks">^[\w[:punct:]]+$</validator>
+    </xml>
+    <xml name="valid_cell_list">
+        <validator type="regex" message="Please only use letters, numbers, or punctuation marks">^[\w[:punct:]]+$</validator>
+    </xml>
+    <xml name="select_assay">
+        <param argument="assay" type="text" optional="true" value="" label="Name of assay to use" help="leave blank to use default assay">
+            <expand macro="valid_name"/>
+        </param>
+    </xml>
+    <xml name="select_assay_RNA">
+        <param argument="assay" type="text" value="RNA" label="Name of assay to use">
+            <expand macro="valid_name"/>
+        </param>
+    </xml>
+    <xml name="select_slot_data">
+        <param argument="slot" type="select" label="Slot to pull data from">
+                    <option value="counts">counts</option>
+                    <option value="data" selected="true">data</option>
+                    <option value="scale.data">scale.data</option>
+                    <option value="raw.data">raw.data</option>
+        </param>
+    </xml>
+    <xml name="select_slot_scale">
+        <param argument="slot" type="select" label="Slot to pull data from">
+                    <option value="counts">counts</option>
+                    <option value="data">data</option>
+                    <option value="scale.data" selected="true">scale.data</option>
+                    <option value="raw.data">raw.data</option>
+        </param>
+    </xml>
+    <xml name="select_slot_counts">
+        <param argument="slot" type="select" label="Slot to pull data from">
+                    <option value="counts" selected="true">counts</option>
+                    <option value="data">data</option>
+                    <option value="scale.data">scale.data</option>
+                    <option value="raw.data">raw.data</option>
+        </param>
+    </xml>
+    <xml name="select_layer">
+        <param argument="layer" type="text" optional="true" value="" label="Layer to pull data from" help="leave blank to use default">
+            <expand macro="valid_name"/>
+        </param>
+    </xml>
+    <xml name="select_reduction_pca">
+        <param argument="reduction" type="text" value="pca" label="Name of reduction to use" help="default is pca">
+            <expand macro="valid_name"/>
+        </param>
+    </xml>
+    <xml name="select_reduction_umap">
+        <param argument="reduction" type="text" value="umap" label="Name of reduction to use" help="first defaults to umap, then tsne, then pca">
+            <expand macro="valid_name"/>
+        </param>
+    </xml>
+    <xml name="set_topN">
+        <param name="topN" type="integer" value="10" label="Number to show"/>
+    </xml>
+    <xml name="set_dims">
+        <param argument="dims" type="integer" optional="true" value="10" label="Number of dimensions from reduction to use as input"/>
+    </xml>
+    <xml name="normalize">
+        <conditional name="normalization_method">
+                    <param name="normalization_method" type="select" label="Method for normalization" help="(normalization.method)">
+                        <option value="LogNormalize" selected="true">LogNormalize</option>
+                        <option value="CLR">CLR</option>
+                        <option value="RC">RC</option>
+                    </param>
+                    <when value="LogNormalize"></when>
+                    <when value="CLR">
+                        <param argument="margin" type="select" checked="true" label="Normalize across features (1) or cells (2)">
+                            <option value="1" selected="true">features</option>
+                            <option value="2">cells</option>
+                        </param>
+                    </when>
+                    <when value="RC"></when>
+                </conditional>
+                <param name="scale_factor" type="integer" value="10000" label="Set scale factor for normalization" help="(scale.factor)"/>
+                <param name="block_size" type="integer" optional="true" value="" label="Number of cells to run in each block" help="(block.size)"/>
+    </xml>
+    <xml name="integration_inputs">
+        <param argument="dims" type="integer" value="30" label="Number of dimensions from reduction to use for integration"/>
+        <param name="dims_to_integrate" type="integer" optional="true" value="" label="Number of dimensions to return integrated values for" help="(dims.to.integrate)"/>
+        <param name="k_weight" type="integer" value="100" label="Number of neighbors to consider when weighting anchors" help="(k.weight)"/>
+        <param name="weight_reduction" type="text" optional="true" value="" label="Name of reduction(s) to use for calculating anchor weights" help="leave blank to use full corrected space (weight.reduction)">
+            <expand macro="valid_list"/>
+        </param>
+        <param name="sd_weight" type="float" value="1" label="Controls bandwidth of Gaussian kernel for weighting"/>
+        <param name="preserve_order" type="boolean" truevalue="TRUE" falsevalue="FALSE" checked="false" label="Preserve order" help="do not reorder objects based on size for each pairwise integration (preserve.order)"/>
+    </xml>
+    <xml name="markers_inputs">
+        <param argument="features" type="data" format="txt,tabular" optional="true" value="" label="Features to test" help="text file with one feature on each line, leave empty to use all genes"/>
+        <param name="logfc_threshold" type="float" value="0.1" label="Minimum log-fold difference to test" help="(logfc.threshold)"/>
+        <conditional name="test_use">
+            <param name="test_use" type="select" label="Select test to run" help="(test.use)">
+                <option value="wilcox" selected="true">wilcox</option>
+                <option value="wilcox_limma">wilcox_limma</option>
+                <option value="bimod">bimod</option>
+                <option value="roc">roc</option>
+                <option value="t">t</option>
+                <option value="negbinom">negbinom</option>
+                <option value="poisson">poisson</option>
+                <option value="LR">LR</option>
+                <option value="MAST">MAST</option>
+                <option value="DESeq2">DESeq2</option>
+            </param>
+            <when value="wilcox">
+                <expand macro="select_slot_data"/>
+            </when>
+            <when value="wilcox_limma">
+                <expand macro="select_slot_data"/>
+            </when>
+            <when value="bimod">
+                <expand macro="select_slot_data"/>
+            </when>
+            <when value="roc">
+                <expand macro="select_slot_data"/>
+                <param name="return_thresh" type="float" value="0.01" min="0.0" max="1.0" label="Only return markers with a p-value below or power above this threshold" help="(return.thresh)"/>
+            </when>
+            <when value="t">
+                <expand macro="select_slot_data"/>
+            </when>
+            <when value="negbinom">
+                <expand macro="select_slot_counts"/>
+                <param name="latent_vars" type="text" optional="true" value="" label="Select variables to test" help="(latent.vars)"/>
+                <param name="min_cells_feature" type="integer" value="3" label="Minimum number of cells expressing the feature in at least one cluster" help="(min.cells.feature)"/>
+            </when>
+            <when value="poisson">
+                <expand macro="select_slot_counts"/>
+                <param name="latent_vars" type="text" optional="true" value="" label="Select variables to test" help="(latent.vars)"/>
+                <param name="min_cells_feature" type="integer" value="3" label="Minimum number of cells expressing the feature in at least one cluster" help="(min.cells.feature)"/>
+            </when>
+            <when value="LR">
+                <expand macro="select_slot_data"/>
+                <param name="latent_vars" type="text" optional="true" value="" label="Select variables to test" help="(latent.vars)"/>
+            </when>
+            <when value="MAST">
+                <expand macro="select_slot_data"/>
+                <param name="latent_vars" type="text" optional="true" value="" label="Select variables to test" help="(latent.vars)"/>
+            </when>
+            <when value="DESeq2">
+                <expand macro="select_slot_counts"/>
+            </when>
+        </conditional>
+    </xml>
+    <xml name="advanced_markers_inputs">
+        <expand macro="select_assay"/>
+        <param name="fc_name" type="text" optional="true" value="" label="Choose a name for the fold change, average difference, or custom function column" help="(fc.name)">
+            <expand macro="valid_name"/>
+        </param>
+        <param name="min_pct" type="float" value="0.01" min="0" max="100" label="Minimum percentage of cells genes must be present in to be tested" help="(min.pct)"/>
+        <param name="min_diff_pct" type="float" optional="true" value="" label="Minimum difference in percentage of expression between groups for genes to be tested" help="defaults to -Inf (min.diff.pct)"/>
+        <param name="only_pos" type="boolean" truevalue="TRUE" falsevalue="FALSE" checked="false" label="Only return positive markers" help="(only.pos)"/>
+        <param name="max_cells_per_ident" type="integer" optional="true" value="" label="Downsample each identity class to a max number of cells" help="defaults to Inf for no downsampling (max.cells.per.ident)"/>
+        <param name="random_seed" type="integer" optional = "true" value="1" label="Set a random seed for downsampling" help="(random.seed)"/>
+        <param name="min_cells_group" type="integer" value="3" label="Minimum number of cells in one group" help="(min.cells.group)"/>
+        <param argument="densify" type="boolean" truevalue="TRUE" falsevalue="FALSE" checked="false" label="Convert to dense matrix before running DE test"/>
+    </xml>
+    <xml name="plot_types">
+        <param name="plot_format" type="select" label="Format of plot to produce">
+        <option value="png">png</option>
+        <option value="pdf">pdf</option>
+        <option value="svg">svg</option>
+        <option value="jpeg">jpeg</option>
+        <option value="tex">tex</option>
+        <option value="tiff">tiff</option>
+        <option value="eps">eps</option>
+        </param>
+    </xml>
+    <xml name="plot_sizes">
+        <conditional name="resize">
+        <param name="resize" type="select" label="Change size of plot">
+            <option value="false" selected="true">No</option>
+            <option value="true">Yes</option>
+        </param>
+        <when value="false"></when>
+        <when value="true">
+            <param argument="width" type="integer" value="2100" label="Width of plot in pixels"/>
+            <param argument="height" type="integer" value="2100" label="Height of plot in pixels"/>
+        </when>
+        </conditional>
+    </xml>
+    <xml name="plot_cols">
+        <param argument="cols" type="text" optional="true" value="" label="Colours to use for plotting" help="comma separated list">
+            <expand macro="valid_list"/>
+        </param>
+    </xml>
+    <xml name="plot_log_scale">
+        <param argument="log" type="boolean" truevalue="TRUE" falsevalue="FALSE" checked="false" label="Plot on a log scale"/>
+    </xml>
+    <xml name="plot_2_dims">
+        <param name="dims_1" type="integer" value="1" label="Dimension to plot on x axis"/>
+        <param name="dims_2" type="integer" value="2" label="Dimension to plot on y axis"/>
+    </xml>
+    <xml name="plot_projected_and_balanced">
+        <param argument="projected" type="boolean" truevalue="TRUE" falsevalue="FALSE" checked="false" label="Use reduction values for full dataset" help="i.e. projected dimensional reduction values"/>
+        <param argument="balanced" type="boolean" truevalue="TRUE" falsevalue="FALSE" checked="false" label="Return an equal number of genes with + and - scores"/>
+    </xml>
+    <xml name="plot_disp_min_max">
+        <param name="disp_min" type="float" optional="true" value="-2.5" label="Minimum display value" help="all values below are clipped (disp.min)"/>
+        <param name="disp_max" type="float" optional="true" value="" label="Maximum display value" help="all values above are clipped. Defaults to 2.5 if slot is scale.data, otherwise defaults to 6 (disp.max)"/>
+    </xml>
+    <xml name="plot_shuffle_and_seed">
+        <conditional name="shuffle">
+            <param argument="shuffle" type="select" label="Randomly shuffle order of points" help="can help with crowded plots if points of interest are hidden">
+                <option value="TRUE">Yes</option>
+                <option value="FALSE" selected="true">No</option>
+            </param>
+            <when value="TRUE">
+                <param argument="seed" type="integer" value="1" label="Set random seed for shuffling"/>
+            </when>
+            <when value="FALSE"></when>
+        </conditional>
+    </xml>
+    <xml name="plot_order">
+        <param argument="order" type="text" optional="true" value="" label="Specify the order of plotting for the idents" help="a full comma-separated list or the ident to be plotted last on the top">
+            <expand macro="valid_list"/>
+        </param>
+    </xml>
+    <xml name="plot_group_by">
+        <param name="group_by" type="text" optional="true" value="" label="Factor to group cells by" help="(group.by)"/>
+    </xml>
+    <xml name="plot_split_by">
+        <param name="split_by" type="text" optional="true" value="" label="Factor or identity to split the plot by" help="(split.by)"/>
+    </xml>
+    <xml name="plot_alpha">
+        <param argument="alpha" type="integer" value="1" label="Alpha value for points"/>
+    </xml>
+    <xml name="plot_pt_size">
+        <param name="pt_size" type="float" optional="true" value="" label="Point size for plot" help="(pt.size)"/>
+    </xml>
+    <xml name="plot_smooth">
+        <param argument="smooth" type="boolean" truevalue="TRUE" falsevalue="FALSE" checked="false" label="Smooth the graph"/>
+    </xml>
+    <xml name="plot_ncol">
+        <param argument="ncol" type="integer" optional="true" value="" label="Number of columns to display"/>
+    </xml>
+    <xml name="raster_select">
+        <conditional name="raster">
+            <param argument="raster" type="select" label="Convert points to raster format" help="NULL will automatically use raster if more than 100,000 points plotted">
+                <option value="NULL" selected="true">NULL</option>
+                <option value="TRUE">TRUE</option>
+                <option value="FALSE">FALSE</option>
+            </param>
+            <when value="NULL"></when>
+            <when value="TRUE">
+                <param name="raster_x" type="integer" value="512" label="Horizontal length of raster plot (pixels)"/>
+                <param name="raster_y" type="integer" value="512" label="Vertical height of raster plot (pixels)"/>
+            </when>
+            <when value="FALSE"></when>
+        </conditional>
+    </xml>
+    <xml name="raster_boolean">
+        <param argument="raster" type="boolean" truevalue="TRUE" falsevalue="FALSE" checked="true" label="Convert to raster format"/>
+    </xml>
+</macros>