changeset 0:95d79f1134f0 draft default tip

planemo upload commit 0264c359f1d638bbbbab515a3502231f679cdcf6
author ebi-gxa
date Sat, 02 Mar 2024 10:40:08 +0000
parents
children
files extra/macro_mapper_seurat.yaml get_test_data.sh scripts/seurat-scale-data.R seurat_macros.xml seurat_plot.xml
diffstat 5 files changed, 1412 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extra/macro_mapper_seurat.yaml	Sat Mar 02 10:40:08 2024 +0000
@@ -0,0 +1,90 @@
+---
+- option_group:
+    - input-object-file
+    - input-format
+  pre_command_macros:
+    - INPUT_OBJ_PREAMBLE
+  post_command_macros:
+    - INPUT_OBJECT
+  input_declaration_macros:
+    - input_object_params
+- option_group:
+    - output-object-file
+    - output-format
+  post_command_macros:
+    - OUTPUT_OBJECT
+  input_declaration_macros:
+    - output_object_params
+  output_declaration_macros:
+    - output_files
+- option_group:
+    - input-object-files
+    - input-format
+  pre_command_macros:
+    - INPUT_OBJS_PREAMBLE
+  post_command_macros:
+    - INPUT_OBJECTS
+  input_declaration_macros:
+    - input_object_params:
+        multiple: true
+- option_group:
+    - reference-object-files
+    - reference-format
+  pre_command_macros:
+    - REFERENCE_OBJS_PREAMBLE
+  post_command_macros:
+    - REFERENCE_OBJECTS
+  input_declaration_macros:
+    - input_object_params:
+        varname: reference
+        multiple: true
+        optional: true
+- option_group:
+    - reference-object-file
+    - reference-format
+  pre_command_macros:
+    - REFERENCE_OBJ_PREAMBLE
+  post_command_macros:
+    - REFERENCE_OBJECT
+  input_declaration_macros:
+    - input_object_params:
+        varname: reference
+- option_group:
+    - anchors-object-file
+    - anchors-format
+  pre_command_macros:
+    - ANCHORS_OBJ_PREAMBLE
+  post_command_macros:
+    - ANCHORS_OBJECT
+  input_declaration_macros:
+    - input_object_params:
+        varname: anchors
+- option_group:
+    - query-object-file
+    - query-format
+  pre_command_macros:
+    - QUERY_OBJ_PREAMBLE
+  post_command_macros:
+    - QUERY_OBJECT
+  input_declaration_macros:
+    - input_object_params:
+        varname: query
+- option_group:
+    - plot-out
+  post_command_macros:
+    - OUTPUT_PLOT
+  output_declaration_macros:
+    - plot_output_files_format:
+        format: png
+    - plot_output_files_format:
+        format: pdf
+    - plot_output_files_format:
+        format: eps
+    - plot_output_files_format:
+        format: jpg
+    - plot_output_files_format:
+        format: ps
+    - plot_output_files_format:
+        format: tiff
+    - plot_output_files_format:
+        format: svg
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/get_test_data.sh	Sat Mar 02 10:40:08 2024 +0000
@@ -0,0 +1,77 @@
+#!/usr/bin/env bash
+
+BASENAME_FILE='E-MTAB-6077-3k_features_90_cells'
+
+MTX_LINK='https://drive.google.com/uc?export=download&id=1-1ejn7scP80xsbrG0FtWzsozjg0hhc23'
+RDS_LINK='https://drive.google.com/uc?export=download&id=1KW_GX6xznSUpWRWUykpNaSbAhyClf7_n'
+NORM_LINK='https://drive.google.com/uc?export=download&id=1mvo3ENkBvEAOyWG6ejApzQTPDLX5yBKU'
+FVG_LINK='https://drive.google.com/uc?export=download&id=13Fhruuj-vEEo1WM138ahtAYqfHc7LsaZ'
+SCALED_LINK='https://drive.google.com/uc?export=download&id=18TK8us235LWNajarWDBAtASUXMYAxvw0'
+PCA_LINK='https://drive.google.com/uc?export=download&id=1gf3BTB4dygDsom1TzjsBfgZnZepcoG5c'
+NEIGHBOURS_LINK='https://drive.google.com/uc?export=download&id=1N2lHoKRBZ7pmAYGfghLWB9KUrLA5WoNX'
+CLUSTERS_LINK='https://drive.google.com/uc?export=download&id=1HWxZWHbNUNo4z__9PhhL_CJOLzec_ETa'
+TSNE_LINK='https://drive.google.com/uc?export=download&id=1qsvMr_GkCSp1dyTJt1BZ6cElJwFFX2zO'
+MARKERS_LINK='https://drive.google.com/uc?export=download&id=18OmWNc7mF-4pzH6DQkPp1eKunN4BfvxD'
+
+LOOM_LINK='https://drive.google.com/uc?export=download&id=1qNk5cg8hJG3Nv1ljTKmUEnxTOf11EEZX'
+H5AD_LINK='https://drive.google.com/uc?export=download&id=1YpE0H_t_dkh17P-WBhPijKvRiGP0BlBz'
+
+H5AD_SC182_LINK='https://drive.google.com/uc?export=download&id=16PUJ2KAkXT8F1UkfqU-9LWoOJUkUG1rp'
+SCE_LINK='https://drive.google.com/uc?export=download&id=1UKdyf3M01uAt7oBg93JfmRvNVB_jlUKe'
+
+# Seurat v4 exclusives
+IFNB_BASE_FILE='ifnb_'
+
+IFNB_CTRL_INT_LINK='https://drive.google.com/uc?export=download&id=15E_MLz-UclJYInNaA7YKLhLo5W-qlykL'
+IFNB_STIM_INT_LINK='https://drive.google.com/uc?export=download&id=14iKgCJGPk16dEmpJJF-Gp_lBDcOdo-54'
+
+## Classify and UMAP mapping
+CLASSIFY_QUERY_LINK='https://oc.ebi.ac.uk/s/MlEDILFYRrvkS6E/download'
+CLASSIFY_RESULTS_ANCHORS_OBJECT_LINK='https://drive.google.com/uc?export=download&id=1Xtv4K_CxIU1cJ8RjJ7NTvzLQkLvc8a3i'
+# UMAP_RESULT_OBJECT_LINK='https://oc.ebi.ac.uk/s/k4MdM07y9DAnurp/download'
+UMAP_RESULT_OBJECT_LINK='https://oc.ebi.ac.uk/s/D1z4z2ef1e3dyc3/download'
+
+
+function get_data {
+  local link=$1
+  local fname=$2
+
+  if [ ! -f $fname ]; then
+    echo "$fname not available locally, downloading.."
+    wget -O $fname --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 -t 3 $link
+  fi
+}
+
+# get matrix data
+mkdir -p test-data
+pushd test-data
+get_data $MTX_LINK mtx.zip
+unzip mtx.zip
+rm -f mtx.zip
+
+get_data $RDS_LINK $BASENAME_FILE".rds"
+get_data $NORM_LINK $BASENAME_FILE"-normalised.rds"
+get_data $FVG_LINK $BASENAME_FILE"-fvg.rds"
+get_data $SCALED_LINK $BASENAME_FILE"-scaled.rds"
+get_data $PCA_LINK $BASENAME_FILE"-pca.rds"
+get_data $NEIGHBOURS_LINK $BASENAME_FILE"-neighbours.rds"
+get_data $CLUSTERS_LINK $BASENAME_FILE"-clusters.rds"
+get_data $TSNE_LINK $BASENAME_FILE"-tsne.rds"
+get_data $MARKERS_LINK $BASENAME_FILE"-markers.csv.zip"
+
+unzip $BASENAME_FILE"-markers.csv.zip"
+rm -f $BASENAME_FILE"-markers.csv.zip"
+
+get_data $LOOM_LINK $BASENAME_FILE"_loom.h5"
+get_data $SCE_LINK $BASENAME_FILE"_sce.rds"
+get_data $H5AD_LINK $BASENAME_FILE".h5ad"
+
+get_data $H5AD_SC182_LINK $BASENAME_FILE"_sc182.h5ad"
+
+get_data $IFNB_CTRL_INT_LINK $IFNB_BASE_FILE"ctrl_norm_fvg.rds"
+get_data $IFNB_STIM_INT_LINK $IFNB_BASE_FILE"stim_norm_fvg.rds"
+
+get_data $CLASSIFY_QUERY_LINK "Classify_query.rds"
+get_data $CLASSIFY_RESULTS_ANCHORS_OBJECT_LINK "Classify_anchors.rds"
+get_data $UMAP_RESULT_OBJECT_LINK "UMAP_result_integrated.rds"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/seurat-scale-data.R	Sat Mar 02 10:40:08 2024 +0000
@@ -0,0 +1,165 @@
+#!/usr/bin/env Rscript 
+
+# Load optparse we need to check inputs
+
+suppressPackageStartupMessages(require(optparse))
+
+# Load common functions
+
+suppressPackageStartupMessages(require(workflowscriptscommon))
+
+# parse options
+
+option_list = list(
+  make_option(
+    c("-i", "--input-object-file"),
+    action = "store",
+    default = NA,
+    type = 'character',
+    help = "File name in which a serialized R matrix object may be found."
+  ),
+  make_option(
+    c("--input-format"),
+    action = "store",
+    default = "seurat",
+    type = 'character',
+    help = "Either loom, seurat, anndata or singlecellexperiment for the input format to read."
+  ),
+  make_option(
+    c("--output-format"),
+    action = "store",
+    default = "seurat",
+    type = 'character',
+    help = "Either loom, seurat, anndata or singlecellexperiment for the output format."
+  ),
+  make_option(
+    c("-e", "--genes-use"),
+    action = "store",
+    default = NULL,
+    type = 'character',
+    help = "File with gene names to scale/center (one gene per line). Default is all genes in object@data."
+  ),
+  make_option(
+    c("-v", "--vars-to-regress"),
+    action = "store",
+    default = NULL,
+    type = 'character',
+    help = "Comma-separated list of variables to regress out (previously latent.vars in RegressOut). For example, nUMI, or percent.mito."
+  ),
+  make_option(
+    c("-m", "--model-use"),
+    action = "store",
+    default = 'linear',
+    type = 'character',
+    help = "Use a linear model or generalized linear model (poisson, negative binomial) for the regression. Options are 'linear' (default), 'poisson', and 'negbinom'."
+  ),
+  make_option(
+    c("-u", "--use-umi"),
+    action = "store",
+    default = FALSE,
+    type = 'logical',
+    help = "Regress on UMI count data. Default is FALSE for linear modeling, but automatically set to TRUE if model.use is 'negbinom' or 'poisson'."
+  ),
+  make_option(
+    c("-s", "--do-not-scale"),
+    action = "store_true",
+    default = FALSE,
+    type = 'logical',
+    help = "Skip the data scale."
+  ),
+  make_option(
+    c("-c", "--do-not-center"),
+    action = "store_true",
+    default = FALSE,
+    type = 'logical',
+    help = "Skip data centering."
+  ),  
+  make_option(
+    c("-x", "--scale-max"),
+    action = "store",
+    default = 10,
+    type = 'double',
+    help = "Max value to return for scaled data. The default is 10. Setting this can help reduce the effects of genes that are only expressed in a very small number of cells. If regressing out latent variables and using a non-linear model, the default is 50."
+  ),
+  make_option(
+    c("-b", "--block-size"),
+    action = "store",
+    default = 1000,
+    type = 'integer',
+    help = "Default size for number of genes to scale at in a single computation. Increasing block.size may speed up calculations but at an additional memory cost."
+  ),
+  make_option(
+    c("-d", "--min-cells-to-block"),
+    action = "store",
+    default = 1000,
+    type = 'integer',
+    help = "If object contains fewer than this number of cells, don't block for scaling calculations."
+  ),
+  make_option(
+    c("-n", "--check-for-norm"),
+    action = "store",
+    default = TRUE,
+    type = 'logical',
+    help = "Check to see if data has been normalized, if not, output a warning (TRUE by default)."
+  ),
+  make_option(
+    c("-o", "--output-object-file"),
+    action = "store",
+    default = NA,
+    type = 'character',
+    help = "File name in which to store serialized R object of type 'Seurat'.'"
+  )
+)
+
+opt <- wsc_parse_args(option_list, mandatory = c('input_object_file', 'output_object_file'))
+
+# Check parameter values
+
+if ( ! file.exists(opt$input_object_file)){
+  stop((paste('File', opt$input_object_file, 'does not exist')))
+}
+
+if (! is.null(opt$genes_use)){
+  if (! file.exists(opt$genes_use)){
+    stop((paste('Supplied genes file', opt$genes_use, 'does not exist')))
+  }else{
+    genes_use <- readLines(opt$genes_use)
+  }
+}else{
+  genes_use <- NULL
+}
+
+# break up opt$vars_to_regress into a list if it has commas
+opt$vars_to_regress <- unlist(strsplit(opt$vars_to_regress, ","))
+
+# Now we're hapy with the arguments, load Seurat and do the work
+
+suppressPackageStartupMessages(require(Seurat))
+if(opt$input_format == "loom" | opt$output_format == "loom") {
+  suppressPackageStartupMessages(require(SeuratDisk))
+} else if(opt$input_format == "singlecellexperiment" | opt$output_format == "singlecellexperiment") {
+  suppressPackageStartupMessages(require(scater))
+}
+
+# Input from serialized R object
+
+seurat_object <- read_seurat4_object(input_path = opt$input_object_file, format = opt$input_format)
+# https://stackoverflow.com/questions/9129673/passing-list-of-named-parameters-to-function
+# might be useful
+scaled_seurat_object <- ScaleData(seurat_object, 
+                                  features = genes_use, 
+                                  vars.to.regress = opt$vars_to_regress, 
+                                  model.use = opt$model_use, 
+                                  use.umi = opt$use_umi, 
+                                  do.scale = !opt$do_not_scale, 
+                                  do.center = !opt$do_not_center, 
+                                  scale.max = opt$scale_max, 
+                                  block.size = opt$block_size, 
+                                  min.cells.to.block = opt$min_cells_to_block, 
+                                  verbose = FALSE)
+
+
+# Output to a serialized R object
+write_seurat4_object(seurat_object = scaled_seurat_object, 
+                     output_path = opt$output_object_file,
+                     format = opt$output_format)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/seurat_macros.xml	Sat Mar 02 10:40:08 2024 +0000
@@ -0,0 +1,354 @@
+<?xml version="1.0"?>
+<macros>
+    <token name="@VERSION@">4.0.0</token>
+    <token name="@SEURAT_VERSION@">4.0.4</token>
+    <xml name="requirements">
+        <requirements>
+            <requirement type="package" version="@VERSION@">seurat-scripts</requirement>
+        </requirements>
+    </xml>
+    <xml name="version">
+    	<version_command><![CDATA[
+echo $(R --version | grep version | grep -v GNU)", seurat version" $(R --vanilla --slave -e "library(seurat); cat(sessionInfo()\$otherPkgs\$seurat\$Version)" 2> /dev/null | grep -v -i "WARNING: ")
+    ]]></version_command>
+    </xml>
+
+   <xml name="input_object_params" token_multiple="False" token_varname="input" token_optional="False">
+     <conditional name="@VARNAME@" label="Input format">
+       <param type="select" name="format" label="Choose the format of the @VARNAME@" help="Seurat RDS, Seurat H5, Single Cell Experiment RDS, Loom or AnnData">
+         <option value="rds_seurat" selected="true">RDS with a Seurat object</option>
+         <option value="loom">Loom</option>
+         <option value="h5seurat">Seurat HDF5</option>
+         <option value="anndata">AnnData</option>
+         <option value="rds_sce">RDS with a Single Cell Experiment object</option>
+       </param>
+       <when value="anndata">
+         <param type="data" name="anndata_file" multiple="@MULTIPLE@" optional="@OPTIONAL@" label="AnnData file" help="Select AnnData files for @VARNAME@" format="h5,h5ad"/>
+       </when>
+       <when value="loom">
+         <param type="data" name="loom_file" multiple="@MULTIPLE@" optional="@OPTIONAL@" label="Loom file" help="Select Loom file(s) for @VARNAME@" format="h5,h5loom"/>
+       </when>
+       <when value="rds_seurat">
+         <param type="data" name="rds_seurat_file" multiple="@MULTIPLE@" optional="@OPTIONAL@" label="RDS file" help="Select RDS file(s) with Seurat object for @VARNAME@" format="rdata"/>
+       </when>
+       <when value="rds_sce">
+         <param type="data" name="rds_sce_file" multiple="@MULTIPLE@" optional="@OPTIONAL@" label="RDS file" help="Select RDS file(s) with Single Cell Experiment object for @VARNAME@" format="rdata"/>
+       </when>
+       <when value="h5seurat">
+         <param type="data" name="h5seurat_file" multiple="@MULTIPLE@" optional="@OPTIONAL@" label="Seurat HDF5" help="Select Seurat HDF5 file(s) for @VARNAME" format="h5"/>
+       </when>
+     </conditional>
+   </xml>
+
+   <token name="@INPUT_OBJ_PREAMBLE@">
+     #if $input.format == 'loom'
+     ln -s '$input.loom_file' input.loom;
+     #else if $input.format == 'h5seurat'
+     ln -s '$input.h5seurat_file' input.h5seurat;
+     #else if $input.format == 'anndata'
+     ## it complains when using links for AnnData...
+     cp '$input.anndata_file' input.h5ad;
+     #end if
+   </token>
+
+   <token name="@INPUT_OBJECT@">
+    #if $input.format == "anndata"
+        --input-object-file input.h5ad --input-format anndata
+    #else if $input.format == "loom"
+        --input-object-file input.loom --input-format loom
+    #else if $input.format == "rds_seurat"
+        --input-object-file '$input.rds_seurat_file' --input-format seurat
+    #else if $input.format == "rds_sce"
+        --input-object-file '$input.rds_sce_file' --input-format singlecellexperiment
+    #else if $input.format == "h5seurat"
+        --input-object-file input.h5seurat --input-format h5seurat
+    #end if
+   </token>
+
+   <token name="@QUERY_OBJ_PREAMBLE@">
+     #if $query.format == 'loom'
+     ln -s '$query.loom_file' query.loom;
+     #else if $query.format == 'h5seurat'
+     ln -s '$query.h5seurat_file' query.h5seurat;
+     #else if $query.format == 'anndata'
+     ## it complains when using links for AnnData...
+     cp '$query.anndata_file' query.h5ad;
+     #end if
+   </token>
+
+   <token name="@QUERY_OBJECT@">
+    #if $query.format == "anndata"
+        --query-object-file query.h5ad --query-format anndata
+    #else if $query.format == "loom"
+        --query-object-file query.loom --query-format loom
+    #else if $query.format == "rds_seurat"
+        --query-object-file '$query.rds_seurat_file' --query-format seurat
+    #else if $query.format == "rds_sce"
+        --query-object-file '$query.rds_sce_file' --query-format singlecellexperiment
+    #else if $query.format == "h5seurat"
+        --query-object-file query.h5seurat --query-format h5seurat
+    #end if
+  </token>
+
+  <token name="@ANCHORS_OBJ_PREAMBLE@">
+    #if $anchors.format == 'loom'
+    ln -s '$anchors.loom_file' anchors.loom;
+    #else if $anchors.format == 'h5seurat'
+    ln -s '$anchors.h5seurat_file' anchors.h5seurat;
+    #else if $anchors.format == 'anndata'
+    ## it complains when using links for AnnData...
+    cp '$anchors.anndata_file' anchors.h5ad;
+    #end if
+  </token>
+
+  <token name="@ANCHORS_OBJECT@">
+   #if $anchors.format == "anndata"
+       --anchors-object-file anchors.h5ad --anchors-format anndata
+   #else if $anchors.format == "loom"
+       --anchors-object-file anchors.loom --anchors-format loom
+   #else if $anchors.format == "rds_seurat"
+       --anchors-object-file '$anchors.rds_seurat_file' --anchors-format seurat
+   #else if $anchors.format == "rds_sce"
+       --anchors-object-file '$anchors.rds_sce_file' --anchors-format singlecellexperiment
+   #else if $anchors.format == "h5seurat"
+       --anchors-object-file anchors.h5seurat --anchors-format h5seurat
+   #end if
+ </token>
+
+ <token name="@REFERENCE_OBJ_PREAMBLE@">
+   #if $reference.format == 'loom'
+   ln -s '$reference.loom_file' reference.loom;
+   #else if $reference.format == 'h5seurat'
+   ln -s '$reference.h5seurat_file' reference.h5seurat;
+   #else if $reference.format == 'anndata'
+   ## it complains when using links for AnnData...
+   cp '$reference.anndata_file' reference.h5ad;
+   #end if
+ </token>
+
+ <token name="@REFERENCE_OBJECT@">
+  #if $reference.format == "anndata"
+      --reference-object-file reference.h5ad --reference-format anndata
+  #else if $reference.format == "loom"
+      --reference-object-file reference.loom --reference-format loom
+  #else if $reference.format == "rds_seurat"
+      --reference-object-file '$reference.rds_seurat_file' --reference-format seurat
+  #else if $reference.format == "rds_sce"
+      --reference-object-file '$reference.rds_sce_file' --reference-format singlecellexperiment
+  #else if $reference.format == "h5seurat"
+      --reference-object-file reference.h5seurat --reference-format h5seurat
+  #end if
+ </token>
+
+   <token name="@INPUT_OBJS_PREAMBLE@">
+     #if $input.format == 'loom'
+     #for $i, $fh in enumerate($input.loom_file):
+        ln -s '$fh' input.${i}.loom;
+     #end for
+     #else if $input.format == 'h5seurat'
+     #for $i, $fh in enumerate($input.h5seurat_file):
+        ln -s '$fh' input.${i}.h5seurat;
+     #end for
+     #else if $input.format == 'anndata'
+     ## it complains when using links for AnnData...
+     #for $i, $fh in enumerate($input.anndata_file):
+        cp '$fh' input.${i}.h5ad;
+     #end for
+     #end if
+   </token>
+
+   <token name="@INPUT_OBJECTS@">
+    #if $input.format == "anndata"
+        --input-object-files
+    #set file_array = [ "input."+str($i)+".h5ad" for $i, $fh in enumerate($input.anndata_file)]
+    #set files = ",".join($file_array)
+        ${files}
+         --input-format anndata
+    #else if $input.format == "loom"
+        --input-object-files
+    #set file_array = [ "input."+str($i)+".loom" for $i, $fh in enumerate($input.loom_file)]
+    #set files = ",".join($file_array)
+        ${files}
+         --input-format loom
+    #else if $input.format == "rds_seurat"
+        --input-object-files
+    #set file_array = $input.rds_seurat_file
+    #set files = ",".join([ str($fh) for $fh in $file_array ])
+        ${files}
+        --input-format seurat
+    #else if $input.format == "rds_sce"
+        --input-object-files
+    #set file_array = $input.rds_sce_file
+    #set files = ",".join([ str($fh) for $fh in $file_array ])
+        ${files}
+        --input-format singlecellexperiment
+    #else if $input.format == "h5seurat"
+        --input-object-files
+    #set file_array = [ "input."+str($i)+".h5seurat" for $i, $fh in enumerate($input.h5seurat)]
+    #set files = ",".join($file_array)
+        ${files}
+        --input-format h5seurat
+    #end if
+   </token>
+
+   <token name="@REFERENCE_OBJS_PREAMBLE@">
+     #if $reference.format == 'loom'
+     #for $i, $fh in enumerate($reference.loom_file):
+        ln -s '$fh' reference.${i}.loom;
+     #end for
+     #else if $reference.format == 'h5seurat'
+     #for $i, $fh in enumerate($reference.h5seurat_file):
+        ln -s '$fh' reference.${i}.h5seurat;
+     #end for
+     #else if $reference.format == 'anndata'
+     ## it complains when using links for AnnData...
+     #for $i, $fh in enumerate($reference.anndata_file):
+        cp '$fh' reference.${i}.h5ad;
+     #end for
+     #end if
+   </token>
+
+   <token name="@REFERENCE_OBJECTS@">
+    #if $reference.format == "anndata" and $reference.anndata_file:
+        --reference-object-files
+    #set file_array = [ "reference."+str($i)+".h5ad" for $i, $fh in enumerate($reference.anndata_file)]
+    #set files = ",".join($file_array)
+        ${files}
+         --reference-format anndata
+    #else if $reference.format == "loom" and $reference.loom_file:
+        --reference-object-files
+    #set file_array = [ "reference."+str($i)+".loom" for $i, $fh in enumerate($reference.loom_file)]
+    #set files = ",".join($file_array)
+        ${files}
+         --reference-format loom
+    #else if $reference.format == "rds_seurat" and $reference.rds_seurat_file:
+        --reference-object-files
+    #set files = ",".join([ str($fh) for $fh in $reference.rds_seurat_file ])
+        ${files}
+        --reference-format seurat
+    #else if $reference.format == "rds_sce" and $reference.rds_sce_file:
+        --reference-object-files
+    #set files = ",".join([ str($fh) for $fh in $reference.rds_sce_file ])
+        ${files}
+        --reference-format singlecellexperiment
+    #else if $reference.format == "h5seurat" and $reference.h5seurat:
+        --reference-object-files
+    #set file_array = [ "reference."+str($i)+".h5seurat" for $i, $fh in enumerate($reference.h5seurat)]
+    #set files = ",".join($file_array)
+        ${files}
+        --reference-format h5seurat
+    #end if
+   </token>
+
+   <xml name="output_object_params">
+     <param type="select" name="format" label="Choose the format of the output" help="Seurat, Single Cell Experiment, AnnData or Loom">
+       <option value="rds_seurat" selected="true">RDS with a Seurat object</option>
+       <option value="anndata">AnnData written by Seurat</option>
+       <option value="loom">Loom</option>
+       <option value="rds_sce">RDS with a Single Cell Experiment object</option>
+     </param>
+   </xml>
+
+   <xml name="output_files">
+    <data name="loom_file" from_work_dir="seurat_obj.loom" format="h5" label="${tool.name} on ${on_string}: Seurat Loom">
+      <filter>format == 'loom'</filter>
+    </data>
+    <data name="rds_seurat_file" format="rdata" label="${tool.name} on ${on_string}: Seurat RDS">
+      <filter>format == 'rds_seurat'</filter>
+    </data>
+    <data name="anndata_file" format="h5ad" label="${tool.name} on ${on_string}: AnnData from Seurat">
+        <filter>format == 'anndata'</filter>
+    </data>
+    <data name="rds_sce_file" format="rdata" label="${tool.name} on ${on_string}: Seurat Single Cell Experiment RDS">
+      <filter>format == 'rds_sce'</filter>
+    </data>
+   </xml>
+
+   <token name="@OUTPUT_OBJECT@">
+    #if $format == "anndata"
+        --output-object-file '$anndata_file' --output-format anndata
+    #else if $format == "loom"
+        --output-object-file seurat_obj.loom --output-format loom
+    #else if $format == "rds_seurat"
+        --output-object-file '$rds_seurat_file' --output-format seurat
+    #else if $format == "rds_sce"
+        --output-object-file '$rds_sce_file' --output-format singlecellexperiment
+    #end if
+   </token>
+
+   <xml name="plot_output_files_format" token_format="png">
+     <data label="Seurat ${plot_type.plot_type_selector} on ${on_string}: @FORMAT@ plot" name="plot_out_@FORMAT@" format='@FORMAT@' >
+       <filter>plot_format == '@FORMAT@'</filter>
+     </data>
+   </xml>
+
+   <token name="@OUTPUT_PLOT@">
+    #if $plot_format == "png"
+        --plot-out '$plot_out_png'
+    #else if $plot_format == "pdf"
+        --plot-out '$plot_out_pdf'
+    #else if $plot_format == "eps"
+        --plot-out '$plot_out_eps'
+    #else if $plot_format == "ps"
+        --plot-out '$plot_out_ps'
+    #else if $plot_format == "jpg"
+        --plot-out '$plot_out_jpg'
+    #else if $plot_format == "tiff"
+        --plot-out '$plot_out_tiff'
+    #else if $plot_format == "svg"
+        --plot-out '$plot_out_svg'
+    #end if
+   </token>
+
+    <xml name="genes-use-input">
+      <param name="genes_use" argument="--genes-use" optional="true" type="data" format="tsv,txt,tabular" label="Genes to use" help="A file with gene names to use in construction of SNN graph if building directly based on expression data rather than a dimensionally reduced representation (i.e. PCs)."/>
+    </xml>
+    <xml name="dims-use-input">
+      <param name="dims_use" argument="--dims-use" min="1" optional="true" type="integer" label="PCA Dimensions to use" help="Number of PCs (dimensions) to use in construction of the SNN graph."/>
+    </xml>
+
+    <token name="@SEURAT_INTRO@"><![CDATA[
+Seurat_ is a toolkit for quality control, analysis, and exploration of single cell RNA sequencing data.
+It is developed and maintained by the `Satija Lab`_ at NYGC. 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.
+      ]]></token>
+
+    <token name="@VERSION_HISTORY@"><![CDATA[
+**Version history**
+4.0.0: Moves to Seurat 4.0.0, introducing a number of methods for merging datasets, plus the whole suite of Seurat plots. Pablo Moreno with funding from AstraZeneca.
+
+3.2.3+galaxy0: Moves to Seurat 3.2.3 and introduce convert method, improving format interconversion support.
+
+3.1.2_0.0.8: Update metadata parsing
+
+3.1.1_0.0.7: Exposes perplexity and enables tab input.
+
+3.1.1_0.0.6+galaxy0: Moved to Seurat 3.
+
+  Find clusters: removed dims-use, k-param, prune-snn.
+
+2.3.1+galaxy0: Improved documentation and further exposition of all script's options. Pablo Moreno, Jonathan Manning and Ni Huang, Expression Atlas team https://www.ebi.ac.uk/gxa/home  at
+EMBL-EBI https://www.ebi.ac.uk/. Parts obtained from wrappers from Christophe Antoniewski (GitHub drosofff) and Lea Bellenger (GitHub bellenger-l).
+
+0.0.1: Initial contribution. Maria Doyle (GitHub mblue9).
+      ]]></token>
+
+
+    <xml name="citations">
+        <citations>
+            <citation type="doi">10.1038/s41592-021-01102-w</citation>
+            <citation type="doi">10.1038/nbt.4096</citation>
+            <citation type="bibtex">
+              @misc{r-seurat-scripts.git,
+              author = {Jonathan Manning, Pablo Moreno, EBI Gene Expression Team},
+              year = {2018},
+              title = {Seurat-scripts: command line interface for Seurat},
+              publisher = {GitHub},
+              journal = {GitHub repository},
+              url = {https://github.com/ebi-gene-expression-group/r-seurat-scripts.git},
+            }
+            </citation>
+        </citations>
+    </xml>
+</macros>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/seurat_plot.xml	Sat Mar 02 10:40:08 2024 +0000
@@ -0,0 +1,726 @@
+<tool id="seurat_plot" name="Plot" profile="18.01" version="@SEURAT_VERSION@+galaxy0">
+    <description>with Seurat</description>
+    <macros>
+        <import>seurat_macros.xml</import>
+    </macros>
+    <expand macro="requirements" />
+    <expand macro="version" />
+    <command detect_errors="exit_code"><![CDATA[
+    @INPUT_OBJ_PREAMBLE@
+    seurat-plot.R
+    @INPUT_OBJECT@
+    @OUTPUT_PLOT@
+    --plot-type '$plot_type.plot_type_selector'
+
+
+    #if str($plot_type.plot_type_selector) == 'DimPlot':
+
+    #if $plot_type.dims
+    --dims '$plot_type.dims'
+    #end if
+
+
+    #if $plot_type.cells
+    --cells '$plot_type.cells'
+    #end if
+
+
+    #if $plot_type.cols
+    --cols '$plot_type.cols'
+    #end if
+
+
+    #if $plot_type.pt_size
+    --pt-size '$plot_type.pt_size'
+    #end if
+
+
+    #if $plot_type.reduction
+    --reduction '$plot_type.reduction'
+    #end if
+
+
+    #if $plot_type.group_by
+    --group-by '$plot_type.group_by'
+    #end if
+
+
+    #if $plot_type.split_by
+    --split-by '$plot_type.split_by'
+    #end if
+
+
+    #if $plot_type.shape_by
+    --shape-by '$plot_type.shape_by'
+    #end if
+
+
+    #if $plot_type.order
+    --order '$plot_type.order'
+    #end if
+
+        $plot_type.shuffle
+
+
+    --seed '$plot_type.seed'
+
+        $plot_type.label
+
+
+    --label-size '$plot_type.label_size'
+
+
+    --label-color '$plot_type.label_color'
+
+        $plot_type.label_box
+
+        $plot_type.repel
+
+
+    #if $plot_type.cells_highlight
+    --cells-highlight '$plot_type.cells_highlight'
+    #end if
+
+
+    #if $plot_type.cols_highlight
+    --cols-highlight '$plot_type.cols_highlight'
+    #end if
+
+
+    #if $plot_type.sizes_highlight
+    --sizes-highlight '$plot_type.sizes_highlight'
+    #end if
+
+
+    #if $plot_type.na_value
+    --na-value '$plot_type.na_value'
+    #end if
+
+
+    #if $plot_type.ncol
+    --ncol '$plot_type.ncol'
+    #end if
+
+    #elif str($plot_type.plot_type_selector) == 'DoHeatmap':
+
+    #if $plot_type.features
+    --features '$plot_type.features'
+    #end if
+
+
+    #if $plot_type.cells
+    --cells '$plot_type.cells'
+    #end if
+
+
+    #if $plot_type.group_by
+    --group-by '$plot_type.group_by'
+    #end if
+
+        $plot_type.group_bar
+
+
+    #if $plot_type.group_colors
+    --group-colors '$plot_type.group_colors'
+    #end if
+
+
+    #if $plot_type.disp_min
+    --disp-min '$plot_type.disp_min'
+    #end if
+
+
+    #if $plot_type.disp_max
+    --disp-max '$plot_type.disp_max'
+    #end if
+
+
+    --slot '$plot_type.slot'
+
+
+    #if $plot_type.assay
+    --assay '$plot_type.assay'
+    #end if
+
+        $plot_type.label
+
+
+    #if $plot_type.size
+    --size '$plot_type.size'
+    #end if
+
+
+    #if $plot_type.hjust
+    --hjust '$plot_type.hjust'
+    #end if
+
+
+    #if $plot_type.angle
+    --angle '$plot_type.angle'
+    #end if
+
+        $plot_type.raster
+
+        $plot_type.draw_lines
+
+
+    #if $plot_type.lines_width
+    --lines-width '$plot_type.lines_width'
+    #end if
+
+
+    #if $plot_type.group_bar_height
+    --group-bar-height '$plot_type.group_bar_height'
+    #end if
+
+        $plot_type.combine
+
+    #elif str($plot_type.plot_type_selector) == 'RidgePlot':
+
+    --features '$plot_type.features'
+
+
+    #if $plot_type.cols_ridgeplot
+    --cols-ridgeplot '$plot_type.cols_ridgeplot'
+    #end if
+
+
+    #if $plot_type.idents
+    --idents '$plot_type.idents'
+    #end if
+
+        $plot_type.sort
+
+
+    #if $plot_type.assay
+    --assay '$plot_type.assay'
+    #end if
+
+
+    #if $plot_type.group_by
+    --group-by '$plot_type.group_by'
+    #end if
+
+        $plot_type.same_y_lims
+
+        $plot_type.log
+
+
+    #if $plot_type.ncol
+    --ncol '$plot_type.ncol'
+    #end if
+
+
+    #if $plot_type.slot
+    --slot '$plot_type.slot'
+    #end if
+
+        $plot_type.stack
+
+
+    #if $plot_type.fill_by
+    --fill-by '$plot_type.fill_by'
+    #end if
+
+    #elif str($plot_type.plot_type_selector) == 'FeaturePlot':
+
+    --features '$plot_type.features'
+
+
+    #if $plot_type.dims
+    --dims '$plot_type.dims'
+    #end if
+
+
+    #if $plot_type.cells
+    --cells '$plot_type.cells'
+    #end if
+
+
+    #if $plot_type.cols_feature_plot
+    --cols-feature-plot '$plot_type.cols_feature_plot'
+    #end if
+
+
+    #if $plot_type.pt_size
+    --pt-size '$plot_type.pt_size'
+    #end if
+
+        $plot_type.order
+
+
+    #if $plot_type.min_cutoff
+    --min-cutoff '$plot_type.min_cutoff'
+    #end if
+
+
+    #if $plot_type.max_cutoff
+    --max-cutoff '$plot_type.max_cutoff'
+    #end if
+
+
+    #if $plot_type.reduction
+    --reduction '$plot_type.reduction'
+    #end if
+
+
+    #if $plot_type.split_by
+    --split-by '$plot_type.split_by'
+    #end if
+
+
+    --keep-scale '$plot_type.keep_scale'
+
+
+    #if $plot_type.shape_by
+    --shape-by '$plot_type.shape_by'
+    #end if
+
+
+    #if $plot_type.slot
+    --slot '$plot_type.slot'
+    #end if
+
+        $plot_type.blend
+
+
+    #if $plot_type.blend_threshold
+    --blend-threshold '$plot_type.blend_threshold'
+    #end if
+
+        $plot_type.label
+
+
+    #if $plot_type.label_size
+    --label-size '$plot_type.label_size'
+    #end if
+
+        $plot_type.repel
+
+
+    #if $plot_type.ncol
+    --ncol '$plot_type.ncol'
+    #end if
+
+        $plot_type.coord_fixed
+
+        $plot_type.by_col
+
+    #elif str($plot_type.plot_type_selector) == 'VlnPlot':
+
+    --features '$plot_type.features'
+
+
+    #if $plot_type.cols
+    --cols '$plot_type.cols'
+    #end if
+
+
+    #if $plot_type.pt_size
+    --pt-size '$plot_type.pt_size'
+    #end if
+
+
+    #if $plot_type.idents
+    --idents '$plot_type.idents'
+    #end if
+
+        $plot_type.sort
+
+
+    #if $plot_type.assay
+    --assay '$plot_type.assay'
+    #end if
+
+
+    #if $plot_type.group_by
+    --group-by '$plot_type.group_by'
+    #end if
+
+
+    #if $plot_type.split_by
+    --split-by '$plot_type.split_by'
+    #end if
+
+
+    #if $plot_type.adjust
+    --adjust '$plot_type.adjust'
+    #end if
+
+        $plot_type.same_y_lims
+
+        $plot_type.log
+
+
+    #if $plot_type.ncol
+    --ncol '$plot_type.ncol'
+    #end if
+
+
+    #if $plot_type.slot
+    --slot '$plot_type.slot'
+    #end if
+
+        $plot_type.split_plot
+
+        $plot_type.stack
+
+
+    #if $plot_type.fill_by
+    --fill-by '$plot_type.fill_by'
+    #end if
+
+        $plot_type.flip
+
+    #elif str($plot_type.plot_type_selector) == 'DotPlot':
+
+    #if $plot_type.assay
+    --assay '$plot_type.assay'
+    #end if
+
+
+    --features '$plot_type.features'
+
+
+    #if $plot_type.cols_dot_plot
+    --cols-dot-plot '$plot_type.cols_dot_plot'
+    #end if
+
+
+    #if $plot_type.col_min
+    --col-min '$plot_type.col_min'
+    #end if
+
+
+    #if $plot_type.col_max
+    --col-max '$plot_type.col_max'
+    #end if
+
+
+    #if $plot_type.dot_min
+    --dot-min '$plot_type.dot_min'
+    #end if
+
+
+    #if $plot_type.dot_scale
+    --dot-scale '$plot_type.dot_scale'
+    #end if
+
+
+    #if $plot_type.idents
+    --idents '$plot_type.idents'
+    #end if
+
+
+    #if $plot_type.group_by
+    --group-by '$plot_type.group_by'
+    #end if
+
+
+    #if $plot_type.split_by
+    --split-by '$plot_type.split_by'
+    #end if
+
+        $plot_type.cluster_idents
+
+        $plot_type.scale
+
+
+    #if $plot_type.scale_by
+    --scale-by '$plot_type.scale_by'
+    #end if
+
+    #end if
+
+
+    #if $enable_output_rds_file
+    --output-rds-file '$output_rds_file'
+    #end if
+
+
+    --plot-format '$plot_format'
+
+
+    --units '$units'
+
+
+    --dpi '$dpi'
+
+    $limitsize
+
+
+    #if $bg
+    --bg '$bg'
+    #end if
+
+
+
+    ]]></command>
+    <inputs>
+        <expand macro="input_object_params" />
+        <conditional name="plot_type">
+        <param label="Plot_type_selector" name="plot_type_selector" argument="--plot_type_selector" type="select"  help="Either FeaturePlot, RidgePlot, DimPlot, VlnPlot or DotPlot.">
+            <option value="DimPlot">DimPlot</option>
+            <option value="DoHeatmap">DoHeatmap</option>
+            <option value="RidgePlot">RidgePlot</option>
+            <option value="FeaturePlot" selected="true">FeaturePlot</option>
+            <option value="VlnPlot">VlnPlot</option>
+            <option value="DotPlot">DotPlot</option>
+        </param>
+        <when value="DimPlot">
+            <param label="Dims" optional='true' value='1,2' name="dims" argument="--dims" type="text"   help="Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions"/>
+            <param label="Cells" optional='true' name="cells" argument="--cells" type="text"   help="Vector of cells to plot (default is all cells)"/>
+            <param label="Cols" optional='true' name="cols" argument="--cols" type="text"   help="Vector of colors, each color corresponds to an identity class. This may also be a single character or numeric value corresponding to a palette as specified by brewer.pal.info. By default, ggplot2 assigns colors. We also include a number of palettes from the pals package. See 'DiscretePalette' for details."/>
+            <param label="Pt size" optional='true' name="pt_size" argument="--pt-size" type="integer"   help="Adjust point size for plotting"/>
+            <param label="Reduction" optional='true' name="reduction" argument="--reduction" type="text"   help="Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca"/>
+            <param label="Group by" optional='true' name="group_by" argument="--group-by" type="text"   help="Name of one or more metadata columns to group (color) cells by (for example, orig.ident); pass 'ident' to group by identity class"/>
+            <param label="Split by" optional='true' name="split_by" argument="--split-by" type="text"   help="Name of a metadata column to split plot by; see 'FetchData' for more details"/>
+            <param label="Shape by" optional='true' name="shape_by" argument="--shape-by" type="text"   help="If NULL, all points are circles (default). You can specify any cell attribute (that can be pulled with FetchData) allowing for both different colors and different shapes on cells.  Only applicable if raster is FALSE."/>
+            <param label="Order" optional='true' name="order" argument="--order" type="text"   help="Specify the order of plotting for the idents. This can be useful for crowded plots if points of interest are being buried. Provide either a full list of valid idents or a subset to be plotted last (on top)"/>
+            <param label="Shuffle" optional='true' value='false' name="shuffle" argument="--shuffle" type="boolean"  truevalue='--shuffle' falsevalue='' checked='false' help="Whether to randomly shuffle the order of points. This can be useful for crowded plots if points of interest are being buried. (default is FALSE)"/>
+            <param label="Seed" optional='true' value='1' name="seed" argument="--seed" type="integer"   help="Sets the seed if randomly shuffling the order of points."/>
+            <param label="Label" optional='true' value='false' name="label" argument="--label" type="boolean"  truevalue='--label' falsevalue='' checked='false' help="Whether to label the clusters"/>
+            <param label="Label size" optional='true' value='4' name="label_size" argument="--label-size" type="integer"   help="Sets size of labels"/>
+            <param label="Label color" optional='true' value='black' name="label_color" argument="--label-color" type="text"   help="Sets the color of the label text"/>
+            <param label="Label box" optional='true' value='false' name="label_box" argument="--label-box" type="boolean"  truevalue='--label-box' falsevalue='' checked='false' help="Whether to put a box around the label text (geom_text vs geom_label)"/>
+            <param label="Repel" optional='true' value='false' name="repel" argument="--repel" type="boolean"  truevalue='--repel' falsevalue='' checked='false' help="Repel labels"/>
+            <param label="Cells highlight" optional='true' name="cells_highlight" argument="--cells-highlight" type="text"   help="A list of character or numeric vectors of cells to highlight. If only one group of cells desired, can simply pass a vector instead of a list. If set, colors selected cells to the color(s) in  'cols.highlight'  and other cells black (white if dark.theme = TRUE); will also resize to the size(s) passed to 'sizes.highlight'."/>
+            <param label="Cols highlight" optional='true' value='#DE2D26' name="cols_highlight" argument="--cols-highlight" type="text"   help="A vector of colors to highlight the cells as; will repeat to the length groups in cells.highlight. Comma separated."/>
+            <param label="Sizes highlight" optional='true' value='1' name="sizes_highlight" argument="--sizes-highlight" type="integer"   help="Size of highlighted cells; will repeat to the length groups in cells.highlight"/>
+            <param label="Na value" optional='true' value='grey50' name="na_value" argument="--na-value" type="text"   help="Color value for NA points when using custom scale"/>
+            <param label="Ncol" optional='true' name="ncol" argument="--ncol" type="integer"   help="Number of columns for display when combining plots"/>
+        </when>
+        <when value="DoHeatmap">
+            <param label="Features" optional='true' name="features" argument="--features" type="text"   help="A vector of features to plot, defaults to VariableFeatures of the object."/>
+            <param label="Cells" optional='true' name="cells" argument="--cells" type="text"   help="A vector of cells to plot, comma separated"/>
+            <param label="Group by" optional='true' value='ident' name="group_by" argument="--group-by" type="text"   help="A vector of variables to group cells by; pass 'ident' to group by cell identity classes"/>
+            <param label="Group bar" optional='true' value='true' name="group_bar" argument="--do-not-group-bar" type="boolean"  truevalue='' falsevalue='--do-not-group-bar' checked='true' help="Add a color bar showing group status for cells"/>
+            <param label="Group colors" optional='true' name="group_colors" argument="--group-colors" type="text"   help="Colors to use for the color bar, comma separated."/>
+            <param label="Disp min" optional='true' value='-2' name="disp_min" argument="--disp-min" type="integer"   help="Minimum display value (all values below are clipped)"/>
+            <param label="Disp max" optional='true' name="disp_max" argument="--disp-max" type="integer"   help="Maximum display value (all values above are clipped); defaults to 2.5 if slot is 'scale.data', 6 otherwise"/>
+            <param label="Slot" name="slot" argument="--slot" type="select"  help="Data slot to use, choose from raw.data, data, or scale.data">
+            <option value="scale.data" selected="true">Scale data</option>
+            <option value="data">Data</option>
+            <option value="raw.data">Raw data</option>
+        </param>
+            <param label="Assay" optional='true' name="assay" argument="--assay" type="text"   help="Assay to pull from"/>
+            <param label="Label" optional='true' value='true' name="label" argument="--do-not-label" type="boolean"  truevalue='' falsevalue='--do-not-label' checked='true' help="Label the cell identies above the color bar"/>
+            <param label="Size" optional='true' value='5' name="size" argument="--size" type="integer"   help="Size of text above color bar"/>
+            <param label="Hjust" optional='true' value='0' name="hjust" argument="--hjust" type="integer"   help="Horizontal justification of text above color bar"/>
+            <param label="Angle" optional='true' value='45' name="angle" argument="--angle" type="integer"   help="Angle of text above color bar"/>
+            <param label="Raster" optional='true' value='true' name="raster" argument="--do-not-raster" type="boolean"  truevalue='' falsevalue='--do-not-raster' checked='true' help="If true, plot with geom_raster, else use geom_tile. geom_raster may look blurry on some viewing applications such as Preview due to how the raster is interpolated. Set this to FALSE if you are encountering that issue (note that plots may take longer to produce/render)."/>
+            <param label="Draw lines" optional='true' value='true' name="draw_lines" argument="--do-not-draw-lines" type="boolean"  truevalue='' falsevalue='--do-not-draw-lines' checked='true' help="Include white lines to separate the groups"/>
+            <param label="Lines width" optional='true' name="lines_width" argument="--lines-width" type="integer"   help="Integer number to adjust the width of the separating white lines. Corresponds to the number of cells between each group."/>
+            <param label="Group bar height" optional='true' value='0' name="group_bar_height" argument="--group-bar-height" type="integer"   help="Scale the height of the color bar"/>
+            <param label="Combine" optional='true' value='true' name="combine" argument="--do-not-combine" type="boolean"  truevalue='' falsevalue='--do-not-combine' checked='true' help="Combine plots into a single patchwork or ed ggplot object. If FALSE return a list of ggplot objects."/>
+        </when>
+        <when value="RidgePlot">
+            <param label="Features" optional='true' value='' name="features" argument="--features" type="text"   help="Features to plot (gene expression, metrics, PC scores, anything that can be retreived by FetchData)"/>
+            <param label="Cols-ridgeplot" optional='true' name="cols_ridgeplot" argument="--cols-ridgeplot" type="text"   help="Colors to use for plotting, comma separated"/>
+            <param label="Idents" optional='true' name="idents" argument="--idents" type="text"   help="Which classes to include in the plot (default is all)"/>
+            <param label="Sort" optional='true' value='false' name="sort" argument="--sort" type="boolean"  truevalue='--sort' falsevalue='' checked='false' help="Sort identity classes (on the x-axis) by the average expression of the attribute being potted, can also pass 'increasing' or 'decreasing' to change sort direction"/>
+            <param label="Assay" optional='true' name="assay" argument="--assay" type="text"   help="Name of assay to use, defaults to the active assay"/>
+            <param label="Group by" optional='true' name="group_by" argument="--group-by" type="text"   help="Group (color) cells in different ways (for example, orig.ident)"/>
+            <param label="Same y lims" optional='true' value='false' name="same_y_lims" argument="--same-y-lims" type="boolean"  truevalue='--same-y-lims' falsevalue='' checked='false' help="Set all the y-axis limits to the same values"/>
+            <param label="Log" optional='true' value='false' name="log" argument="--log" type="boolean"  truevalue='--log' falsevalue='' checked='false' help="plot the feature axis on log scale"/>
+            <param label="Ncol" optional='true' name="ncol" argument="--ncol" type="integer"   help="Number of columns if multiple plots are displayed"/>
+            <param label="Slot" optional='true' value='data' name="slot" argument="--slot" type="text"   help="Use non-normalized counts data for plotting"/>
+            <param label="Stack" optional='true' value='false' name="stack" argument="--stack" type="boolean"  truevalue='--stack' falsevalue='' checked='false' help="Horizontally stack plots for each feature"/>
+            <param label="Fill by" optional='true' value='feature' name="fill_by" argument="--fill-by" type="text"   help="Color violins/ridges based on either 'feature' or 'ident'"/>
+        </when>
+        <when value="FeaturePlot">
+            <param label="Features"  name="features" argument="--features" type="text"   help="Vector of features to plot. Features can come from: an assay feature (e.g. a gene name - MS4A1), a column name from meta.data (e.g. mitochondrial percentage - percent.mito), a column name from a DimReduc object corresponding to the cell embedding values (e.g. the PC 1 scores - PC_1)."/>
+            <param label="Dims" optional='true' value='1,2' name="dims" argument="--dims" type="text"   help="Dimensions to plot, must be a two-length numeric vector specifying x- and y-dimensions"/>
+            <param label="Cells" optional='true' name="cells" argument="--cells" type="text"   help="Vector of cells to plot (default is all cells)"/>
+            <param label="Cols-feature-plot" optional='true' value='lightgrey,blue' name="cols_feature_plot" argument="--cols-feature-plot" type="text"   help="The two colors to form the gradient over. Provide as string vector with the first color corresponding to low values, the second to high. Also accepts a Brewer color scale or vector of colors."/>
+            <param label="Pt size" optional='true' name="pt_size" argument="--pt-size" type="integer"   help="Adjust point size for plotting"/>
+            <param label="Order" optional='true' value='false' name="order" argument="--order" type="boolean"  truevalue='--order' falsevalue='' checked='false' help="Boolean determining whether to plot cells in order of expression. Can be useful if cells expressing given feature are getting buried."/>
+            <param label="Min cutoff" optional='true' name="min_cutoff" argument="--min-cutoff" type="text"   help="Vector of minimum cutoff values for each feature, may specify quantile in the form of 'q##' where '##' is the quantile (eg, 'q1', 'q10')"/>
+            <param label="Max cutoff" optional='true' name="max_cutoff" argument="--max-cutoff" type="text"   help="Vector of maximum cutoff values for each feature, may specify quantile in the form of 'q##' where '##' is the quantile (eg, 'q1', 'q10')"/>
+            <param label="Reduction" optional='true' name="reduction" argument="--reduction" type="text"   help="Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca"/>
+            <param label="Split by" optional='true' name="split_by" argument="--split-by" type="text"   help="A factor in object metadata to split the feature plot by, pass ident to split by cell identity; similar to the old FeatureHeatmap."/>
+            <param label="Keep scale" name="keep_scale" argument="--keep-scale" type="select"  help="How to handle the color scale across multiple plots.">
+            <option value="feature" selected="true">By row/feature scaling: The plots for each individual feature are scaled to the maximum expression of the feature across the conditions provided to 'split.by'.</option>
+            <option value="all">Universal scaling: The plots for all features and conditions are scaled to the maximum expression value for the feature with the highest overall expression.</option>
+            <option value="None">No scaling: Each individual plot is scaled to the maximum expression value of the feature in the condition provided to 'split.by'. Be aware setting NULL will result in color scales that are not comparable between plots.</option>
+        </param>
+            <param label="Shape by" optional='true' name="shape_by" argument="--shape-by" type="text"   help="If NULL, all points are circles (default). You can specify any cell attribute (that can be pulled with FetchData) allowing for both different colors and different shapes on cells.  Only applicable if 'raster' is FALSE) ."/>
+            <param label="Slot" optional='true' value='data' name="slot" argument="--slot" type="text"   help="Which slot to pull expression data from?"/>
+            <param label="Blend" optional='true' value='false' name="blend" argument="--blend" type="boolean"  truevalue='--blend' falsevalue='' checked='false' help="Scale and blend expression values to visualize coexpression of two features"/>
+            <param label="Blend threshold" optional='true' value='0' name="blend_threshold" argument="--blend-threshold" type="integer"   help="The color cutoff from weak signal to strong signal; ranges from 0 to 1."/>
+            <param label="Label" optional='true' value='false' name="label" argument="--label" type="boolean"  truevalue='--label' falsevalue='' checked='false' help="Whether to label the clusters"/>
+            <param label="Label size" optional='true' value='4' name="label_size" argument="--label-size" type="integer"   help="Sets size of labels"/>
+            <param label="Repel" optional='true' value='false' name="repel" argument="--repel" type="boolean"  truevalue='--repel' falsevalue='' checked='false' help="Repel labels"/>
+            <param label="Ncol" optional='true' name="ncol" argument="--ncol" type="integer"   help="Number of columns to combine multiple feature plots to, ignored if split.by is not NULL"/>
+            <param label="Coord fixed" optional='true' value='false' name="coord_fixed" argument="--coord-fixed" type="boolean"  truevalue='--coord-fixed' falsevalue='' checked='false' help="Plot cartesian coordinates with fixed aspect ratio"/>
+            <param label="By col" optional='true' value='true' name="by_col" argument="--do-not-by-col" type="boolean"  truevalue='' falsevalue='--do-not-by-col' checked='true' help="If splitting by a factor, plot the splits per column with the features as rows; ignored if blend = TRUE."/>
+        </when>
+        <when value="VlnPlot">
+            <param label="Features" optional='true' value='' name="features" argument="--features" type="text"   help="Features to plot (gene expression, metrics, PC scores, anything that can be retreived by FetchData)"/>
+            <param label="Cols" optional='true' name="cols" argument="--cols" type="text"   help="Colors to use for plotting, comma separated."/>
+            <param label="Pt size" optional='true' name="pt_size" argument="--pt-size" type="integer"   help="Point size for geom_violin"/>
+            <param label="Idents" optional='true' name="idents" argument="--idents" type="text"   help="Which classes to include in the plot (default is all)"/>
+            <param label="Sort" optional='true' value='false' name="sort" argument="--sort" type="boolean"  truevalue='--sort' falsevalue='' checked='false' help="Sort identity classes (on the x-axis) by the average expression of the attribute being potted, can also pass 'increasing' or 'decreasing' to change sort direction"/>
+            <param label="Assay" optional='true' name="assay" argument="--assay" type="text"   help="Name of assay to use, defaults to the active assay"/>
+            <param label="Group by" optional='true' name="group_by" argument="--group-by" type="text"   help="Group (color) cells in different ways (for example, orig.ident)"/>
+            <param label="Split by" optional='true' name="split_by" argument="--split-by" type="text"   help="A variable to split the violin plots by,"/>
+            <param label="Adjust" optional='true' value='1' name="adjust" argument="--adjust" type="integer"   help="Adjust parameter for geom_violin"/>
+            <param label="Same y lims" optional='true' value='false' name="same_y_lims" argument="--same-y-lims" type="boolean"  truevalue='--same-y-lims' falsevalue='' checked='false' help="Set all the y-axis limits to the same values"/>
+            <param label="Log" optional='true' value='false' name="log" argument="--log" type="boolean"  truevalue='--log' falsevalue='' checked='false' help="plot the feature axis on log scale"/>
+            <param label="Ncol" optional='true' name="ncol" argument="--ncol" type="integer"   help="Number of columns if multiple plots are displayed"/>
+            <param label="Slot" optional='true' value='data' name="slot" argument="--slot" type="text"   help="Use non-normalized counts data for plotting"/>
+            <param label="Split plot" optional='true' value='false' name="split_plot" argument="--split-plot" type="boolean"  truevalue='--split-plot' falsevalue='' checked='false' help="plot each group of the split violin plots by multiple or single violin shapes."/>
+            <param label="Stack" optional='true' value='false' name="stack" argument="--stack" type="boolean"  truevalue='--stack' falsevalue='' checked='false' help="Horizontally stack plots for each feature"/>
+            <param label="Fill by" optional='true' value='feature' name="fill_by" argument="--fill-by" type="text"   help="Color violins/ridges based on either 'feature' or 'ident'"/>
+            <param label="Flip" optional='true' value='false' name="flip" argument="--flip" type="boolean"  truevalue='--flip' falsevalue='' checked='false' help="flip plot orientation (identities on x-axis)"/>
+        </when>
+        <when value="DotPlot">
+            <param label="Assay" optional='true' name="assay" argument="--assay" type="text"   help="Name of assay to use, defaults to the active assay"/>
+            <param label="Features" optional='true' value='' name="features" argument="--features" type="text"   help="Input vector of features, or named list of feature vectors if feature-grouped panels are desired (replicates the functionality of the old SplitDotPlotGG)"/>
+            <param label="Cols-dot-plot" optional='true' value='yellow,lightgrey,blue' name="cols_dot_plot" argument="--cols-dot-plot" type="text"   help="Colors to plot: the name of a palette from RColorBrewer::brewer.pal.info , a pair of colors defining a gradient, or 3+ colors defining multiple gradients (if split.by is set)"/>
+            <param label="Col min" optional='true' value='-2' name="col_min" argument="--col-min" type="integer"   help="Minimum scaled average expression threshold (everything smaller will be set to this)"/>
+            <param label="Col max" optional='true' value='2' name="col_max" argument="--col-max" type="integer"   help="Maximum scaled average expression threshold (everything larger will be set to this)"/>
+            <param label="Dot min" optional='true' value='0' name="dot_min" argument="--dot-min" type="integer"   help="The fraction of cells at which to draw the smallest dot (default is 0). All cell groups with less than this expressing the given gene will have no dot drawn."/>
+            <param label="Dot scale" optional='true' value='6' name="dot_scale" argument="--dot-scale" type="integer"   help="Scale the size of the points, similar to cex"/>
+            <param label="Idents" optional='true' name="idents" argument="--idents" type="text"   help="Identity classes to include in plot (default is all)"/>
+            <param label="Group by" optional='true' name="group_by" argument="--group-by" type="text"   help="Factor to group the cells by"/>
+            <param label="Split by" optional='true' name="split_by" argument="--split-by" type="text"   help="Factor to split the groups by (replicates the functionality of the old SplitDotPlotGG); see  'FetchData' for more details."/>
+            <param label="Cluster idents" optional='true' value='false' name="cluster_idents" argument="--cluster-idents" type="boolean"  truevalue='--cluster-idents' falsevalue='' checked='false' help="Whether to order identities by hierarchical clusters based on given features, default is FALSE"/>
+            <param label="Scale" optional='true' value='true' name="scale" argument="--do-not-scale" type="boolean"  truevalue='' falsevalue='--do-not-scale' checked='true' help="Determine whether the data is scaled, will be done by default"/>
+            <param label="Scale by" name="scale_by" argument="--scale-by" type="select"  help="Scale the size of the points by 'size' or by 'radius'">
+            <option value="size">Size</option>
+            <option value="radius" selected="true">Radius</option>
+        </param>
+        </when>
+    </conditional>
+        <param label="Plot-format" name="plot_format" argument="--plot-format" type="select"  help="Format to use, either PNG, EPS, PostScript, TeX, PDF, JPEG, TIFF or SVG">
+            <option value="png" selected="true">PNG</option>
+            <option value="eps">EPS</option>
+            <option value="ps">PostScript</option>
+            <option value="tex">TeX (pictex)</option>
+            <option value="pdf">PDF</option>
+            <option value="jpg">JPG</option>
+            <option value="tiff">TIFF</option>
+            <option value="svg">SVG</option>
+        </param>
+        <param label="Units" name="units" argument="--units" type="select"  help="Units for the plot dimensions.">
+            <option value="cm" selected="true">Centimeters</option>
+            <option value="in">Inches</option>
+            <option value="mm">Milimeters</option>
+            <option value="px">Pixels</option>
+        </param>
+        <param label="Dpi" name="dpi" argument="--dpi" type="select"  help="Plot resolution. Also accepts a string input: retina (320), print (300), or screen (72). Applies only to raster output types.">
+            <option value="320">Retina</option>
+            <option value="300" selected="true">Print</option>
+            <option value="72">screen</option>
+        </param>
+        <param label="Limitsize" optional='true' value='true' name="limitsize" argument="--do-not-limitsize" type="boolean"  truevalue='' falsevalue='--do-not-limitsize' checked='true' help="When TRUE (the default) ggsave() will not save images larger than 50x50 inches, to prevent the common error of specifying dimensions in pixels."/>
+        <param label="Bg" optional='true' name="bg" argument="--bg" type="text"   help="Background colour. If NULL, uses the plot.background fill value from the plot theme."/>
+        <param label="Enable_output_rds_file" optional='true' value='false' name="enable_output_rds_file" argument="--enable_output_rds_file" type="boolean"  truevalue='--enable_output_rds_file' falsevalue='' checked='false' help="Enable output output_rds_file"/>
+
+    </inputs>
+    <outputs>
+        <expand macro="plot_output_files_format" format="png"  />
+        <expand macro="plot_output_files_format" format="pdf"  />
+        <expand macro="plot_output_files_format" format="eps"  />
+        <expand macro="plot_output_files_format" format="jpg"  />
+        <expand macro="plot_output_files_format" format="ps"  />
+        <expand macro="plot_output_files_format" format="tiff"  />
+        <expand macro="plot_output_files_format" format="svg"  />
+
+        <data label="${tool.name} on ${on_string}: Output-rds-file" name="output_rds_file" format='?'>
+        <filter>enable_output_rds_file</filter>
+    </data>
+    </outputs>
+    <tests>
+      <!-- MANUAL TESTS -->
+      <test>
+        <param name="rds_seurat_file" ftype="rdata" value="UMAP_result_integrated.rds"/>
+        <param name="plot_type_selector" value="FeaturePlot"/>
+        <param name="features" value="GPC5-AS1,MAFB,FAP,PPY"/>
+        <output name="plot_out_png" ftype="png" >
+          <assert_contents>
+            <has_size value="195414" delta="32000"/>
+          </assert_contents>
+        </output>
+      </test>
+      <test>
+        <param name="rds_seurat_file" ftype="rdata" value="UMAP_result_integrated.rds"/>
+        <param name="plot_type_selector" value="VlnPlot"/>
+        <param name="features" value="GPC5-AS1,MAFB,FAP,PPY"/>
+        <param name="plot_format" value="pdf"/>
+        <output name="plot_out_pdf" ftype="pdf" >
+          <assert_contents>
+            <has_size value="1239200" delta="123000"/>
+          </assert_contents>
+        </output>
+      </test>
+      <test>
+        <param name="rds_seurat_file" ftype="rdata" value="UMAP_result_integrated.rds"/>
+        <param name="plot_type_selector" value="RidgePlot"/>
+        <param name="features" value="GPC5-AS1,MAFB,FAP,PPY"/>
+        <param name="plot_format" value="eps"/>
+        <output name="plot_out_eps" ftype="eps" >
+          <assert_contents>
+            <has_size value="84892" delta="8400"/>
+          </assert_contents>
+        </output>
+      </test>
+      <test>
+        <param name="rds_seurat_file" ftype="rdata" value="UMAP_result_integrated.rds"/>
+        <param name="plot_type_selector" value="DotPlot"/>
+        <param name="features" value="GPC5-AS1,MAFB,FAP,PPY"/>
+        <param name="plot_format" value="ps"/>
+        <output name="plot_out_ps" ftype="ps" >
+          <assert_contents>
+            <has_size value="16615" delta="1600"/>
+          </assert_contents>
+        </output>
+      </test>
+      <test>
+        <param name="rds_seurat_file" ftype="rdata" value="UMAP_result_integrated.rds"/>
+        <param name="plot_type_selector" value="DoHeatmap"/>
+        <param name="features" value="GPC5-AS1,MAFB,FAP,PPY"/>
+        <output name="plot_out_png" ftype="png" >
+          <assert_contents>
+            <has_size value="83227" delta="8600"/>
+          </assert_contents>
+        </output>
+      </test>
+      <!-- END MANUAL TESTS -->
+    </tests>
+<help>
+<!-- MANUAL HELP -->
+<![CDATA[
+.. class:: infomark
+
+**What it does**
+
+@SEURAT_INTRO@
+
+This tool produces the different plots available on Seurat.
+
+-----
+
+**Inputs**
+
+* Seurat object or compatible (can be specified in different formats)
+* Plot type (can be specified in different formats)
+* Potential compulsory options for each plot type
+
+All the rest of the parameters are optional.
+
+-----
+
+**Outputs**
+
+* A plot in the specified format
+* Optionally, an RDS object with the ggplo2 plot.
+
+@VERSION_HISTORY@
+
+]]>
+<!-- END MANUAL HELP -->
+</help>
+    <expand macro="citations" />
+</tool>