changeset 17:18262103fa61 draft default tip

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/scanpy/ commit 91121b1e72696f17478dae383badaa71e9f96dbb
author iuc
date Sat, 14 Sep 2024 12:45:03 +0000
parents c0a80a16560f
children
files README.md inspect.xml macros.xml test-data/cosg.rank_genes_groups.newton-cg.pbmc68k_highly_reduced_1.h5ad test-data/external.pp.bbknn.krumsiek11.h5ad test-data/external.pp.magic.all_genes.krumsiek11.h5ad test-data/external.pp.magic.pca_only.krumsiek11.h5ad test-data/pbmc68k_reduced.h5ad test-data/pl.clustermap.krumsiek11.png test-data/pl.diffmap.neighbors_gauss_braycurtis.recipe_weinreb17.paul15_subsample.png test-data/pl.dotplot.krumsiek11.png test-data/pl.dpt_timeseries.dpt.diffmap.neighbors_gauss_braycurtis.recipe_weinreb17.paul15_subsample.png test-data/pl.draw_graph.png test-data/pl.embedding_density.pbmc68k_reduced.png test-data/pl.heatmap.krumsiek11.png test-data/pl.highest_expr_genes.filter_genes_dispersion.krumsiek11-seurat.png test-data/pl.highly_variable_genes.seurat.blobs.png test-data/pl.matrixplot.krumsiek11.png test-data/pl.paga.paul15_gauss_braycurtis.png test-data/pl.paga_compare.paul15_gauss_braycurtis.png test-data/pl.pca.pbmc68k_reduced.CD3D_CD79A_components_2d.pdf test-data/pl.pca_loadings.pp.pca.krumsiek11.png test-data/pl.pca_overview.pp.pca.krumsiek11.png test-data/pl.pca_variance_ratio.pp.pca.krumsiek11.png test-data/pl.rank_genes_groups.newton-cg.pbmc68k_highly_reduced_marker_1.png test-data/pl.rank_genes_groups.newton-cg.pbmc68k_highly_reduced_marker_filtered_1.png test-data/pl.rank_genes_groups.rank_genes_groups.krumsiek11.png test-data/pl.rank_genes_groups_dotplot.rank_genes_groups.krumsiek11.png test-data/pl.rank_genes_groups_heatmap.rank_genes_groups.krumsiek11.png test-data/pl.rank_genes_groups_matrixplot.rank_genes_groups.krumsiek11.png test-data/pl.rank_genes_groups_stacked_violin.rank_genes_groups.krumsiek11.png test-data/pl.rank_genes_groups_tracksplot.newton-cg.pbmc68k_highly_reduced_marker_filtered_1.png test-data/pl.rank_genes_groups_violin.Ery.png test-data/pl.rank_genes_groups_violin.Mk.png test-data/pl.rank_genes_groups_violin.Mo.png test-data/pl.rank_genes_groups_violin.Neu.png test-data/pl.rank_genes_groups_violin.progenitor.png test-data/pl.scatter.krumsiek11.png test-data/pl.scatter.pbmc68k_reduced.png test-data/pl.scatter.umap.pbmc68k_reduced.png test-data/pl.scrublet_score_distribution.png test-data/pl.stacked_violin.krumsiek11.png test-data/pl.stacked_violin_pp.filter_genes_dispersion.krumsiek11-seurat.png test-data/pl.tsne.krumsiek11.png test-data/pl.umap.neighbors_umap_euclidean.recipe_weinreb17.paul15_subsample.png test-data/pl.violin.pbmc68k_reduced_custom.png test-data/pp.calculate_qc_metrics.sparce_csr_matrix.h5ad test-data/pp.downsample_counts.random-randint.h5ad test-data/pp.filter_cells.krumsiek11-max_genes.h5ad test-data/pp.filter_cells.krumsiek11-min_counts.h5ad test-data/pp.filter_genes.krumsiek11-min_counts.h5ad test-data/pp.filter_rank_genes_groups.h5ad test-data/pp.highly_variable_genes.krumsiek11-cell_ranger.h5ad test-data/pp.log1p.krumsiek11.h5ad test-data/pp.normalize_total.krumsiek11.h5ad test-data/pp.pca.krumsiek11.batch.h5ad test-data/pp.pca.krumsiek11_chunk.h5ad test-data/pp.recipe_seurat.recipe_zheng17.h5ad test-data/pp.recipe_weinreb17.paul15_subsample.updated.h5ad test-data/pp.recipe_zheng17.random-randint.h5ad test-data/pp.scale.krumsiek11.h5ad test-data/pp.scale_max_value.krumsiek11.h5ad test-data/pp.scrublet.krumsiek11.h5ad test-data/pp.sqrt.krumsiek11.h5ad test-data/pp.subsample.krumsiek11_fraction.h5ad test-data/pp.subsample.krumsiek11_n_obs.h5ad test-data/random-randint.h5ad test-data/sparce_csr_matrix.h5ad test-data/tl.embedding_density.umap.neighbors_umap_euclidean.recipe_weinreb17.paul15_subsample.h5ad test-data/tl.embedding_density.umap.pbmc68k_reduced.h5ad test-data/tl.leiden.neighbors_gauss_braycurtis.recipe_weinreb17.paul15_subsample.h5ad test-data/tl.louvain.neighbors_gauss_braycurtis.recipe_weinreb17.paul15_subsample.h5ad test-data/tl.paga.neighbors_gauss_braycurtis.recipe_weinreb17.paul15_subsample.h5ad test-data/tl.rank_genes_groups.liblinear.krumsiek11.h5ad test-data/tl.rank_genes_groups.newton-cg.pbmc68k_reduced.h5ad test-data/tl.score_genes.krumsiek11.h5ad test-data/tl.score_genes_cell_cycle.krumsiek11.h5ad
diffstat 77 files changed, 1498 insertions(+), 1235 deletions(-) [+]
line wrap: on
line diff
--- a/README.md	Tue Aug 20 09:50:59 2024 +0000
+++ b/README.md	Sat Sep 14 12:45:03 2024 +0000
@@ -25,6 +25,7 @@
     `pp.highly_variable_genes` | Extract highly variable genes
     `pp.subsample` | Subsample to a fraction of the number of observations
     `pp.downsample_counts` | Downsample counts so that each cell has no more than target_counts
+    `pp.scrublet` | Predict doublets
 
 3. Normalize (`normalize.xml`)
 
@@ -34,14 +35,18 @@
     `pp.recipe_zheng17` | Normalization and filtering as of [Zheng17]
     `pp.recipe_weinreb17` | Normalization and filtering as of [Weinreb17]
     `pp.recipe_seurat` | Normalization and filtering as of Seurat [Satija15]
+    `external.pp.magic` | Denoising using Markov Affinity-based Graph Imputation of Cells (MAGIC) API
 
 4. Remove confounders (`remove_confounder.xml`)
 
     Methods | Description
     --- | ---
    `pp.regress_out` | Regress out unwanted sources of variation
-   `pp.mnn_correct` | Correct batch effects by matching mutual nearest neighbors
+   <!-- `pp.mnn_correct` | Correct batch effects by matching mutual nearest neighbors -->
    `pp.combat` | ComBat function for batch effect correction
+    `external.pp.bbknn` | Batch effect removal with Batch balanced KNN (BBKNN)
+    `external.pp.harmony_integrate` | Integrate multiple single-cell experiments with Harmony
+    `external.pp.scanorama_integrate` | Integrate multiple single-cell experiments with Scanorama
 
 5. Clustering, embedding and trajectory inference (`cluster_reduce_dimension.xml`)
 
@@ -49,14 +54,14 @@
     --- | ---
     `tl.louvain` | Cluster cells into subgroups
     `tl.leiden` | Cluster cells into subgroups
-    `tl.pca` | Principal component analysis
-    `pp.pca` | Principal component analysis (appears to be the same func...)
+    `pp.pca` | Principal component analysis
     `tl.diffmap` | Diffusion Maps
     `tl.tsne` | t-SNE
     `tl.umap` | Embed the neighborhood graph using UMAP
     `tl.draw_graph` | Force-directed graph drawing
     `tl.dpt` | Infer progression of cells through geodesic distance along the graph
     `tl.paga` | Mapping out the coarse-grained connectivity structures of complex manifolds
+    `tl.embedding_density` | Calculate the density of cells in an embedding (per condition)
 
 6. Plot (`plot.xml`)
 
@@ -66,18 +71,20 @@
         --- | ---
         `pl.scatter` | Scatter plot along observations or variables axes
         `pl.heatmap` | Heatmap of the expression values of set of genes
+        `pl.tracksplot` | Tracks plot of the expression values per cell
         `pl.dotplot` | Makes a dot plot of the expression values
         `pl.violin` | Violin plot
         `pl.stacked_violin` | Stacked violin plots
         `pl.matrixplot` | Heatmap of the mean expression values per cluster
         `pl.clustermap` | Hierarchically-clustered heatmap
-    
+
     2. Preprocessing
 
         Methods | Description
         --- | ---
         `pl.highest_expr_genes` | Plot the fraction of counts assigned to each gene over all cells
         `pl.highly_variable_genes` | Plot dispersions versus means for genes
+        `pl.scrublet_score_distribution` | Histogram of doublet scores
 
     3. PCA
 
@@ -96,12 +103,13 @@
         `pl.umap` | Scatter plot in UMAP basis
         `pl.diffmap` | Scatter plot in Diffusion Map basis
         `pl.draw_graph` | Scatter plot in graph-drawing basis
+        `pl.embedding_density` | Density of cells in an embedding (per condition)
 
     5. Branching trajectories and pseudotime, clustering
 
         Methods | Description
         --- | ---
-        `pl.dpt_groups_pseudotime` | Plot groups and pseudotime
+        <!-- `pl.dpt_groups_pseudotime` | Plot groups and pseudotime -->
         `pl.dpt_timeseries` | Heatmap of pseudotime series
         `pl.paga` | Plot the abstracted graph through thresholding low-connectivity edges
         `pl.paga_compare` | Scatter and PAGA graph side-by-side
@@ -113,3 +121,8 @@
         --- | ---
         `pl.rank_genes_groups` | Plot ranking of genes using dotplot plot
         `pl.rank_genes_groups_violin` | Plot ranking of genes for all tested comparisons
+        `pl.rank_genes_groups_stacked_violin` | Plot ranking of genes as stacked violin plot
+        `pl.rank_genes_groups_heatmap` | Plot ranking of genes as heatmap plot
+        `pl.rank_genes_groups_dotplot` | Plot ranking of genes as dotplot plot
+        `pl.rank_genes_groups_matrixplot` | Plot ranking of genes as matrixplot plot
+        `pl.rank_genes_groups_tracksplot` | Plot ranking of genes as tracksplot plot
--- a/inspect.xml	Tue Aug 20 09:50:59 2024 +0000
+++ b/inspect.xml	Sat Sep 14 12:45:03 2024 +0000
@@ -1,102 +1,121 @@
-<tool id="scanpy_inspect" name="Inspect and manipulate" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@profile@">
-    <description> with scanpy</description>
+<tool id="scanpy_inspect" name="Scanpy Inspect and manipulate" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@PROFILE@">
     <macros>
         <import>macros.xml</import>
-        <xml name="score_genes_params">
-            <param argument="n_bins" type="integer" value="25" label="Number of expression level bins for sampling" help=""/>
-            <param argument="random_state" type="integer" value="0" label="Random seed for sampling" help=""/>
+        <xml name="params_score_genes">
+            <param argument="n_bins" type="integer" value="25" label="Number of expression level bins for sampling"/>
+            <param argument="random_state" type="integer" value="0" label="Random seed for sampling"/>
             <expand macro="param_use_raw"/>
         </xml>
-        <token name="@CMD_score_genes_inputs@"><![CDATA[
+        <token name="@CMD_PARAMS_SCORE_GENES@"><![CDATA[
     n_bins=$method.n_bins,
     random_state=$method.random_state,
     use_raw=$method.use_raw,
     copy=False
-        ]]></token>
+        ]]>
+        </token>
         <xml name="corr_method">
             <param argument="corr_method" type="select" label="P-value correction method">
-                <option value="benjamini-hochberg">Benjamini-Hochberg</option>
+                <option value="benjamini-hochberg" selected="true">Benjamini-Hochberg</option>
                 <option value="bonferroni">Bonferroni</option>
             </param>
         </xml>
         <xml name="fit_intercept">
-            <param argument="fit_intercept" type="boolean" truevalue="True" falsevalue="False" checked="true"
-                label="Should a constant (a.k.a. bias or intercept) be added to the decision function?" help=""/>
+            <param argument="fit_intercept" type="boolean" truevalue="True" falsevalue="False" checked="true" label="Should a constant (a.k.a. bias or intercept) be added to the decision function?"/>
         </xml>
         <xml name="max_iter">
-            <param argument="max_iter" type="integer" min="0" value="100" label="Maximum number of iterations taken for the solvers to converge" help=""/>
+            <param argument="max_iter" type="integer" min="0" value="100" label="Maximum number of iterations taken for the solvers to converge"/>
         </xml>
         <xml name="multi_class">
-            <param argument="multi_class" type="select" label="Multi class" help="">
+            <param argument="multi_class" type="select" label="Multi class">
+                <option value="auto" selected="true">auto: selects ‘ovr’ if the data is binary and otherwise selects ‘multinomial’</option>
                 <option value="ovr">ovr: a binary problem is fit for each label</option>
                 <option value="multinomial">multinomial: the multinomial loss fit across the entire probability distribution, even when the data is binary</option>
-                <option value="auto">auto: selects ‘ovr’ if the data is binary and otherwise selects ‘multinomial’</option>
             </param>
         </xml>
         <xml name="penalty">
-            <param argument="penalty" type="select" label="Norm used in the penalization" help="">
+            <param argument="penalty" type="select" label="Norm used in the penalization">
+                <option value="l2" selected="true">l2</option>
                 <option value="l1">l1</option>
-                <option value="l2">l2</option>
-                <option value="customized">customized</option>
-            </param>
-        </xml>
-        <xml name="custom_penalty">
-            <param argument="pen" type="text" value="" label="Norm used in the penalization" help="">
-                <expand macro="sanitize_query" />
+                <yield/>
             </param>
         </xml>
         <xml name="random_state">
-            <param argument="random_state" type="integer" value="" optional="true"
-                label="The seed of the pseudo random number generator to use when shuffling the data" help=""/>
+            <param argument="random_state" type="integer" value="" optional="true" label="The seed of the pseudo random number generator to use when shuffling the data"/>
         </xml>
     </macros>
     <expand macro="bio_tools"/>
-    <expand macro="requirements"/>
+    <expand macro="requirements">
+        <requirement type="package" version="1.5.1">scikit-learn</requirement>
+    </expand>
     <expand macro="version_command"/>
     <command detect_errors="exit_code"><![CDATA[
 @CMD@
       ]]></command>
     <configfiles>
         <configfile name="script_file"><![CDATA[
-@CMD_imports@
-@CMD_read_inputs@
+@CMD_IMPORTS@
+@CMD_READ_INPUTS@
 
-#if $method.method == "pp.calculate_qc_metrics"
+#if str($method.method) == 'pp.calculate_qc_metrics':
 sc.pp.calculate_qc_metrics(
     adata=adata,
     expr_type='$method.expr_type',
     var_type='$method.var_type',
-    #if $method.qc_vars
+    #if str($method.qc_vars) != '':
         #set $qc_vars = [str(x.strip()) for x in str($method.qc_vars).split(',')]
     qc_vars=$qc_vars,
     #end if
-    #if $method.percent_top
+    #if str($method.percent_top) != '':
         #set $percent_top = [int(x.strip()) for x in str($method.percent_top).split(',')]
-        percent_top=$percent_top,
+    percent_top=$percent_top,
     #end if
+    #if str($method.layer) != '':
+    layer='$method.layer',
+    #end if
+    use_raw=$method.use_raw,
+    log1p=$method.log1p,
     inplace=True)
 
-#else if $method.method == "tl.score_genes"
+#else if str($method.method) == 'pp.neighbors':
+sc.pp.neighbors(
+    adata=adata,
+    n_neighbors=$method.n_neighbors,
+    #if str($method.n_pcs) != '':
+    n_pcs=$method.n_pcs,
+    #end if
+    #if str($method.use_rep) != '':
+    use_rep='$method.use_rep',
+    #end if
+    knn=$method.knn,
+    method='$method.pp_neighbors_method',
+    metric='$method.metric',
+    random_state=$method.random_state,
+    #if str($method.key_added) != '':
+    key_added='$method.key_added',
+    #end if
+    copy=False)
+
+#else if str($method.method) == 'tl.score_genes':
 sc.tl.score_genes(
     adata=adata,
     #set $gene_list = [str(x.strip()) for x in str($method.gene_list).split(',')]
     gene_list=$gene_list,
     ctrl_size=$method.ctrl_size,
-    score_name='$method.score_name',
-    #if $method.gene_pool
-        #set $gene_pool = [str(x.strip()) for x in $method.gene_pool.split(',')]
+    #if str($method.gene_pool) != '':
+        #set $gene_pool = [str(x.strip()) for x in str($method.gene_pool).split(',')]
     gene_pool=$gene_pool,
     #end if
-    @CMD_score_genes_inputs@)
+    score_name='$method.score_name',
+    @CMD_PARAMS_SCORE_GENES@)
 
-#else if $method.method == "tl.score_genes_cell_cycle"
-    #if str($method.s_genes.format) == 'file'
+#else if str($method.method) == 'tl.score_genes_cell_cycle':
+    #if str($method.s_genes.format) == 'file':
 with open('$method.s_genes.file', 'r') as s_genes_f:
     s_genes = [str(x.strip()) for x in s_genes_f.readlines()]
 print(s_genes)
     #end if
 
-    #if str($method.g2m_genes.format) == 'file'
+    #if str($method.g2m_genes.format) == 'file':
 with open('$method.g2m_genes.file', 'r') as g2m_genes_f:
     g2m_genes = [str(x.strip()) for x in g2m_genes_f.readlines()]
 print(g2m_genes)
@@ -104,155 +123,182 @@
 
 sc.tl.score_genes_cell_cycle(
     adata=adata,
-    #if str($method.s_genes.format) == 'text'
-        #set $s_genes = [str(x.strip()) for x in $method.s_genes.text.split(',')]
+    #if str($method.s_genes.format) == 'text':
+        #set $s_genes = [str(x.strip()) for x in str($method.s_genes.text).split(',')]
     s_genes=$s_genes,
-    #else if str($method.s_genes.format) == 'file'
+    #else if str($method.s_genes.format) == 'file':
     s_genes=s_genes,
     #end if
-    #if str($method.g2m_genes.format) == 'text'
-        #set $g2m_genes = [str(x.strip()) for x in $method.g2m_genes.text.split(',')]
+    #if str($method.g2m_genes.format) == 'text':
+        #set $g2m_genes = [str(x.strip()) for x in str($method.g2m_genes.text).split(',')]
     g2m_genes=$g2m_genes,
-    #else if str($method.g2m_genes.format) == 'file'
+    #else if str($method.g2m_genes.format) == 'file':
     g2m_genes=g2m_genes,
     #end if
-    @CMD_score_genes_inputs@)
+    @CMD_PARAMS_SCORE_GENES@)
 
-#else if $method.method == 'pp.neighbors'
-sc.pp.neighbors(
-    adata=adata,
-    n_neighbors=$method.n_neighbors,
-    #if str($method.n_pcs) != ''
-    n_pcs=$method.n_pcs,
-    #end if
-    #if $method.use_rep
-    use_rep='$method.use_rep',
-    #end if
-    knn=$method.knn,
-    random_state=$method.random_state,
-    method='$method.pp_neighbors_method',
-    metric='$method.metric',
-    copy=False)
-
-#else if $method.method == 'tl.rank_genes_groups'
+#else if str($method.method) == 'tl.rank_genes_groups':
 sc.tl.rank_genes_groups(
     adata=adata,
+    #if str($method.groupby) != '':
     groupby='$method.groupby',
-    #if $method.groups
+    #end if
+    use_raw=$method.use_raw,
+    #if str($method.groups) != '':
     #set $group=[x.strip() for x in str($method.groups).split(',')]
-    groups=$group,
+    groups='$group',
     #end if
-    #if $method.ref.rest == 'rest'
+    #if str($method.layer) != '':
+    layer='$method.layer',
+    #end if
+    #if str($method.ref.rest) == 'rest':
     reference='$method.ref.rest',
     #else
     reference='$method.ref.reference',
     #end if
+    #if str($method.n_genes) != '':
     n_genes=$method.n_genes,
+    #end if
     method='$method.tl_rank_genes_groups_method.method',
-    #if $method.tl_rank_genes_groups_method.method != 'logreg'
+    #if str($method.tl_rank_genes_groups_method.method) != 'logreg':
     corr_method='$method.tl_rank_genes_groups_method.corr_method',
-    #else
+    #end if
+    #if str($method.tl_rank_genes_groups_method.method) == 'wilcoxon':
+    tie_correct=$method.tl_rank_genes_groups_method.tie_correct,
+    #end if
+    #if str($method.tl_rank_genes_groups_method.method) == 'logreg':
     solver='$method.tl_rank_genes_groups_method.solver.solver',
-        #if $method.tl_rank_genes_groups_method.solver.solver == 'newton-cg'
-    penalty='l2',
+        #if str($method.tl_rank_genes_groups_method.solver.solver) == 'lbfgs':
+    penalty='$method.tl_rank_genes_groups_method.solver.penalty',
     fit_intercept=$method.tl_rank_genes_groups_method.solver.fit_intercept,
     max_iter=$method.tl_rank_genes_groups_method.solver.max_iter,
     multi_class='$method.tl_rank_genes_groups_method.solver.multi_class',
-        #else if $method.tl_rank_genes_groups_method.solver.solver == 'lbfgs'
-    penalty='l2',
+        #else if str($method.tl_rank_genes_groups_method.solver.solver) == 'newton-cg':
+    penalty='$method.tl_rank_genes_groups_method.solver.penalty',
     fit_intercept=$method.tl_rank_genes_groups_method.solver.fit_intercept,
     max_iter=$method.tl_rank_genes_groups_method.solver.max_iter,
     multi_class='$method.tl_rank_genes_groups_method.solver.multi_class',
-        #else if $method.tl_rank_genes_groups_method.solver.solver == 'liblinear'
-            #if $method.tl_rank_genes_groups_method.solver.penalty.penalty == 'l1'
+        #else if str($method.tl_rank_genes_groups_method.solver.solver) == 'liblinear':
+            #if str($method.tl_rank_genes_groups_method.solver.penalty.penalty) == 'l1':
     penalty='l1',
-            #else if $method.tl_rank_genes_groups_method.solver.penalty.penalty == 'l2'
+            #else:
     penalty='l2',
     dual=$method.tl_rank_genes_groups_method.solver.penalty.dual,
-            #else
-    penalty='$method.tl_rank_genes_groups_method.solver.penalty.pen',
             #end if
     fit_intercept=$method.tl_rank_genes_groups_method.solver.intercept_scaling.fit_intercept,
-            #if $method.tl_rank_genes_groups_method.solver.intercept_scaling.fit_intercept == 'True'
+            #if str($method.tl_rank_genes_groups_method.solver.intercept_scaling.fit_intercept) == 'True':
     intercept_scaling=$method.tl_rank_genes_groups_method.solver.intercept_scaling.intercept_scaling,
             #end if
-            #if str($method.tl_rank_genes_groups_method.solver.random_state) != ''
+            #if str($method.tl_rank_genes_groups_method.solver.random_state) != '':
     random_state=$method.tl_rank_genes_groups_method.solver.random_state,
             #end if
-        #else if $method.tl_rank_genes_groups_method.solver.solver == 'sag'
-    penalty='l2',
+        #else if str($method.tl_rank_genes_groups_method.solver.solver) == 'sag':
+    penalty='$method.tl_rank_genes_groups_method.solver.penalty.penalty',
     fit_intercept=$method.tl_rank_genes_groups_method.solver.fit_intercept,
-            #if str($method.tl_rank_genes_groups_method.solver.random_state) != ''
+            #if str($method.tl_rank_genes_groups_method.solver.random_state) != '':
     random_state=$method.tl_rank_genes_groups_method.solver.random_state,
             #end if
     max_iter=$method.tl_rank_genes_groups_method.solver.max_iter,
-    multi_class='$method.tl_rank_genes_groups_method.solver.multi_class',
-        #else if $method.tl_rank_genes_groups_method.solver.solver == 'saga'
-            #if $method.tl_rank_genes_groups_method.solver.penalty.penalty == 'l1'
+    multi_class=$method.tl_rank_genes_groups_method.solver.multi_class,
+        #else if str($method.tl_rank_genes_groups_method.solver.solver) == 'saga':
+            #if str($method.tl_rank_genes_groups_method.solver.penalty.penalty) == 'l1':
     penalty='l1',
-            #else if $method.tl_rank_genes_groups_method.solver.penalty.penalty == 'l2'
+            #else if str($method.tl_rank_genes_groups_method.solver.penalty.penalty) == 'l2':
     penalty='l2',
-            #else
-    penalty='$method.tl_rank_genes_groups_method.solver.penalty.pen',
+            #else if str($method.tl_rank_genes_groups_method.solver.penalty.penalty) == 'elasticnet':
+    penalty='elasticnet',
+            #else:
+    penalty='None',
             #end if
     fit_intercept=$method.tl_rank_genes_groups_method.solver.fit_intercept,
-    multi_class='$method.tl_rank_genes_groups_method.solver.multi_class',
+    multi_class=$method.tl_rank_genes_groups_method.solver.multi_class,
         #end if
     tol=$method.tl_rank_genes_groups_method.tol,
     C=$method.tl_rank_genes_groups_method.c,
     #end if
-    use_raw=$method.use_raw)
+    #if str($method.key_added) != '':
+    key_added='$method.key_added',
+    #end if
+    copy=False)
 
-#else if $method.method == "tl.marker_gene_overlap"
+#else if str($method.method) == "tl.marker_gene_overlap":
 reference_markers = {}
 #for $i, $s in enumerate($method.reference_markers)
     #set $list=[x.strip() for x in str($s.values).split(',')]
 reference_markers['$s.key'] = $list
 #end for
 
-sc.tl.marker_gene_overlap(
-    adata,
-    reference_markers,
-    #if $method.key
-    key='$method.key',
-    #end if
-    method='$method.overlap.method',
-    #if $method.overlap.method == 'overlap_count' and str($method.overlap.normalize) != 'None'
-    normalize='$method.overlap.normalize',
-    #end if
-    #if str($method.top_n_markers) != ''
-    top_n_markers=$method.top_n_markers,
-    #end if
-    #if str($method.adj_pval_threshold) != ''
-    adj_pval_threshold=$method.adj_pval_threshold,
-    #end if
-    #if $method.key_added
-    key_added='$method.key_added',
-    #end if
-    inplace=True)
+# Temporary fix for the issue with "inplace=True" for Pandas dataframes.
+# see here: https://github.com/scverse/scanpy/blob/b6193502e11b84fc1b4a011ee9cf08a19da22ebf/src/scanpy/tools/_marker_gene_overlap.py#L167
+marker_overlap_result = sc.tl.marker_gene_overlap(
+                            adata,
+                            reference_markers,
+                            #if str($method.key) != '':
+                            key='$method.key',
+                            #end if
+                            method='$method.overlap.method',
+                            #if str($method.overlap.method) == 'overlap_count' and str($method.overlap.normalize) != 'None':
+                            normalize='$method.overlap.normalize',
+                            #end if
+                            #if str($method.top_n_markers) != '':
+                            top_n_markers=$method.top_n_markers,
+                            #end if
+                            #if str($method.adj_pval_threshold) != '':
+                            adj_pval_threshold=$method.adj_pval_threshold,
+                            #end if
+                            #if $method.key_added:
+                            key_added='$method.key_added',
+                            #end if
+                            inplace=False)
 
-#else if $method.method == "pp.log1p"
+adata.uns['marker_gene_overlap'] = marker_overlap_result
+
+#else if str($method.method) == "pp.log1p":
 sc.pp.log1p(
     adata,
+    #if str($method.base) != '':
+    base=$method.base,
+    #end if
+    #if str($method.layer) != '':
+    layer='$method.layer',
+    #end if
+    #if str($method.obsm) != '':
+    obsm='$method.obsm',
+    #end if
     copy=False)
 
-#else if $method.method == "pp.scale"
+#else if str($method.method) == "pp.scale":
 sc.pp.scale(
     adata,
     zero_center=$method.zero_center,
-    #if str($method.max_value) != ''
+    #if str($method.max_value) != '':
     max_value=$method.max_value,
     #end if
+    #if str($method.layer) != '':
+    layer='$method.layer',
+    #end if
+    #if str($method.obsm) != '':
+    obsm='$method.obsm',
+    #end if
+    #if str($method.mask_obs) != '':
+    mask_obs='$method.mask_obs',
+    #end if
     copy=False)
 
-#else if $method.method == "pp.sqrt"
+#else if str($method.method) == "pp.sqrt":
+
+print("stats before sqrt:", "min=", adata.X.min(), "max=", adata.X.max(), "mean=", adata.X.mean())
+
 sc.pp.sqrt(
     adata,
     copy=False)
 #end if
 
-@CMD_anndata_write_outputs@
-]]></configfile>
+print("stats after sqrt:", "min=", adata.X.min(), "max=", adata.X.max(), "mean=", adata.X.mean())
+
+@CMD_ANNDATA_WRITE_OUTPUTS@
+        ]]>
+        </configfile>
     </configfiles>
     <inputs>
         <expand macro="inputs_anndata"/>
@@ -263,66 +309,66 @@
                 <option value="tl.score_genes">Score a set of genes, using 'tl.score_genes'</option>
                 <option value="tl.score_genes_cell_cycle">Score cell cycle genes, using 'tl.score_genes_cell_cycle'</option>
                 <option value="tl.rank_genes_groups">Rank genes for characterizing groups, using 'tl.rank_genes_groups'</option>
-                <!--<option value="tl.marker_gene_overlap">Calculate an overlap score between data-deriven marker genes and provided markers, using 'tl.marker_gene_overlap'</option>-->
+                <option value="tl.marker_gene_overlap">Calculate an overlap score between data-deriven marker genes and provided markers, using 'tl.marker_gene_overlap'</option>
                 <option value="pp.log1p">Logarithmize the data matrix, using 'pp.log1p'</option>
                 <option value="pp.scale">Scale data to unit variance and zero mean, using 'pp.scale'</option>
                 <option value="pp.sqrt">Square root the data matrix, using 'pp.sqrt'</option>
             </param>
             <when value="pp.calculate_qc_metrics">
                 <param argument="expr_type" type="text" value="counts" label="Name of kind of values in X">
-                    <expand macro="sanitize_query" />
+                    <expand macro="sanitize_query"/>
                 </param>
                 <param argument="var_type" type="text" value="genes" label="The kind of thing the variables are">
-                    <expand macro="sanitize_query" />
+                    <expand macro="sanitize_query"/>
                 </param>
-                <param argument="qc_vars" type="text" value="" label="Keys for boolean columns of '.var' which identify variables you could want to control for" help="Keys separated by a comma">
-                    <expand macro="sanitize_query" />
+                <param argument="qc_vars" type="text" optional="true" value="" label="Keys for boolean columns of '.var' which identify variables you could want to control for" help="Keys separated by a comma">
+                    <expand macro="sanitize_query"/>
                 </param>
-                <param argument="percent_top" type="text" value="" label="Proportions of top genes to cover" 
+                <param argument="percent_top" type="text" value="" optional="true" label="Proportions of top genes to cover"
                     help=" Values (integers) are considered 1-indexed, '50' finds cumulative proportion to the 50th most expressed genes. Values separated by a comma. If empty don't calculate">
-                    <expand macro="sanitize_vectors" />
+                    <expand macro="sanitize_vectors"/>
                 </param>
+                <expand macro="param_layer"/>
+                <expand macro="param_use_raw"/>
+                <param argument="log1p" type="boolean" truevalue="True" falsevalue="False" checked="true" label="Compute log1p transformed annotations"/>
             </when>
             <when value="pp.neighbors">
                 <param argument="n_neighbors" type="integer" min="0" value="15" label="The size of local neighborhood (in terms of number of neighboring data points) used for manifold approximation" help="Larger values result in more global views of the manifold, while smaller values result in more local data being preserved. In general values should be in the range 2 to 100. If 'knn' is 'True', number of nearest neighbors to be searched. If 'knn' is 'False', a Gaussian kernel width is set to the distance of the 'n_neighbors' neighbor."/>
-                <param argument="n_pcs" type="integer" min="0" value="" optional="true" label="Number of PCs to use" help=""/>
-                <param argument="use_rep" type="text" value="" optional="true" label="Indicated representation to use" help="If not set, the representation is chosen automatically: for n_vars below 50, X is used, otherwise X_pca (uns) is used. If X_pca is not present, it's computed with default parameter">
-                    <expand macro="sanitize_query" />
-                </param>
+                <param argument="n_pcs" type="integer" min="0" value="" optional="true" label="Number of PCs to use"/>
+                <expand macro="param_use_rep"/>
                 <param argument="knn" type="boolean" truevalue="True" falsevalue="False" checked="true" label="Use a hard threshold to restrict the number of neighbors to n_neighbors?" help="If true, it considers a knn graph. Otherwise, it uses a Gaussian Kernel to assign low weights to neighbors more distant than the 'n_neighbors' nearest neighbor."/>
-                <param argument="random_state" type="integer" value="0" label="Numpy random seed" help=""/>
-                <param name="pp_neighbors_method" argument="method" type="select" label="Method for computing connectivities" help="">
-                    <option value="umap">umap (McInnes et al, 2018)</option>
+                <param name="pp_neighbors_method" argument="method" type="select" label="Method for computing connectivities">
+                    <option value="umap" selected="true">umap (McInnes et al, 2018)</option>
                     <option value="gauss">gauss: Gauss kernel following (Coifman et al 2005) with adaptive width (Haghverdi et al 2016)</option>
                 </param>
-                <param argument="metric" type="select" label="Distance metric" help="">
+                <param argument="metric" type="select" label="Distance metric">
                     <expand macro="distance_metric_options"/>
                 </param>
+                <param argument="random_state" type="integer" value="0" label="Numpy random seed"/>
+                <param argument="key_added" type="text" value="" optional="true" label="Key to store neighbors, distances and connectivities" help="If specified, the neighbors data is added to .uns[key_added], distances are stored in .obsp[key_added+'_distances'] and connectivities in .obsp[key_added+'_connectivities']"/>
             </when>
             <when value="tl.score_genes">
-                <param argument="gene_list" type="text" value="" label="The list of gene names used for score calculation" help="Genes separated by a comma">
-                    <expand macro="sanitize_query" />
+                <param argument="gene_list" type="text" value="" optional="false" label="The list of gene names used for score calculation" help="Genes separated by a comma">
+                    <expand macro="sanitize_query"/>
                 </param>
-                <param argument="ctrl_size" type="integer" value="50" label="Number of reference genes to be sampled"
-                    help="If 'len(gene_list)' is not too low, you can set 'ctrl_size=len(gene_list)'."/>
-                <param argument="gene_pool" type="text" value="" optional="true" label="Genes for sampling the reference set"
-                       help="Default is all genes. Genes separated by a comma">
-                    <expand macro="sanitize_query" />
+                <param argument="ctrl_size" type="integer" value="50" label="Number of reference genes to be sampled" help="If 'len(gene_list)' is not too low, you can set 'ctrl_size=len(gene_list)'."/>
+                <param argument="gene_pool" type="text" value="" optional="true" label="Genes for sampling the reference set" help="Default is all genes. Genes separated by a comma">
+                    <expand macro="sanitize_query"/>
                 </param>
-                <expand macro="score_genes_params"/>
-                <param argument="score_name" type="text" value="score" label="Name of the field to be added in '.obs'" help="">
-                    <expand macro="sanitize_query" />
+                <param argument="score_name" type="text" value="score" label="Name of the field to be added in '.obs'">
+                    <expand macro="sanitize_query"/>
                 </param>
+                <expand macro="params_score_genes"/>
             </when>
             <when value="tl.score_genes_cell_cycle">
                 <conditional name='s_genes'>
                     <param name="format" type="select" label="Format for the list of genes associated with S phase">
+                        <option value="text" selected="true">Text</option>
                         <option value="file">File</option>
-                        <option value="text" selected="true">Text</option>
                     </param>
                     <when value="text">
                         <param name="text" type="text" value="" label="List of genes associated with S phase" help="Genes separated by a comma">
-                            <expand macro="sanitize_query" />
+                            <expand macro="sanitize_query"/>
                         </param>
                     </when>
                     <when value="file">
@@ -331,41 +377,44 @@
                 </conditional>
                 <conditional name='g2m_genes'>
                     <param name="format" type="select" label="Format for the list of genes associated with G2M phase">
+                        <option value="text" selected="true">Text</option>
                         <option value="file">File</option>
-                        <option value="text" selected="true">Text</option>
                     </param>
                     <when value="text">
                         <param name="text" type="text" value="" label="List of genes associated with G2M phase" help="Genes separated by a comma">
-                            <expand macro="sanitize_query" />
+                            <expand macro="sanitize_query"/>
                         </param>
                     </when>
                     <when value="file">
                         <param name="file" type="data" format="txt" label="File with the list of genes associated with G2M phase" help="One gene per line"/>
                     </when>
                 </conditional>
-                <expand macro="score_genes_params"/>
+                <expand macro="params_score_genes"/>
             </when>
             <when value="tl.rank_genes_groups">
-                <param argument="groupby" type="text" value="" label="The key of the observations grouping to consider" help="">
-                    <expand macro="sanitize_query" />
+                <param argument="groupby" type="text" value="" label="The key of the observations grouping to consider">
+                    <expand macro="sanitize_query"/>
                 </param>
                 <expand macro="param_use_raw"/>
                 <param argument="groups" type="text" value="" label="Subset of groups to which comparison shall be restricted" help="e.g. ['g1', 'g2', 'g3']. If not passed, a ranking will be generated for all groups.">
-                    <expand macro="sanitize_query" />
+                    <expand macro="sanitize_query"/>
+                </param>
+                <param argument="layer" type="text" value="" label="Key from adata.layers whose value will be used to perform tests on">
+                    <expand macro="sanitize_query"/>
                 </param>
                 <conditional name="ref">
                     <param name="rest" type="select" label="Comparison">
-                        <option value="rest">Compare each group to the union of the rest of the group</option>
+                        <option value="rest" selected="true">Compare each group to the union of the rest of the group</option>
                         <option value="group_id">Compare with respect to a specific group</option>
                     </param>
                     <when value="rest"/>
                     <when value="group_id">
                         <param argument="reference" type="text" value="" label="Group identifier with respect to which compare">
-                            <expand macro="sanitize_query" />
+                            <expand macro="sanitize_query"/>
                         </param>
                     </when>
                 </conditional>
-                <param argument="n_genes" type="integer" min="0" value="100" label="The number of genes that appear in the returned tables" help=""/>
+                <param argument="n_genes" type="integer" min="0" value="" optional="true" label="The number of genes that appear in the returned tables" help="Defaults to all genes"/>
                 <conditional name="tl_rank_genes_groups_method">
                     <param argument="method" type="select" label="Method">
                         <option value="t-test" selected="true">t-test</option>
@@ -378,6 +427,7 @@
                     </when>
                     <when value="wilcoxon">
                         <expand macro="corr_method"/>
+                        <param argument="tie_correct" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Use tie correction for 'wilcoxon' scores"/>
                     </when>
                     <when value="t-test_overestim_var">
                         <expand macro="corr_method"/>
@@ -385,18 +435,20 @@
                     <when value="logreg">
                         <conditional name="solver">
                             <param argument="solver" type="select" label="Algorithm to use in the optimization problem" help="For small datasets, ‘liblinear’ is a good choice, whereas ‘sag’ and ‘saga’ are faster for large ones. For multiclass problems, only ‘newton-cg’, ‘sag’, ‘saga’ and ‘lbfgs’ handle multinomial loss; ‘liblinear’ is limited to one-versus-rest schemes. ‘newton-cg’, ‘lbfgs’ and ‘sag’ only handle L2 penalty, whereas ‘liblinear’ and ‘saga’ handle L1 penalty.">
+                                <option value="lbfgs" selected="true">lbfgs</option>
                                 <option value="newton-cg">newton-cg</option>
-                                <option value="lbfgs">lbfgs</option>
                                 <option value="liblinear">liblinear</option>
                                 <option value="sag">sag</option>
                                 <option value="saga">saga</option>
                             </param>
-                            <when value="newton-cg">
+                            <when value="lbfgs">
+                                <param name="penalty" type="boolean" truevalue="l2" falsevalue="None" checked="true" label="use l2 penalty?"/>
                                 <expand macro="fit_intercept"/>
                                 <expand macro="max_iter"/>
                                 <expand macro="multi_class"/>
-                            </when>
-                            <when value="lbfgs">
+                            </when>                            
+                            <when value="newton-cg">
+                                <param name="penalty" type="boolean" truevalue="l2" falsevalue="None" checked="true" label="use l2 penalty?"/>
                                 <expand macro="fit_intercept"/>
                                 <expand macro="max_iter"/>
                                 <expand macro="multi_class"/>
@@ -409,26 +461,21 @@
                                         <param argument="dual" type="boolean" truevalue="True" falsevalue="False" checked="false"
                                             label="Dual (not primal) formulation?" help="Prefer primal when n_samples > n_features"/>
                                     </when>
-                                    <when value="customized">
-                                        <expand macro="custom_penalty"/>
-                                    </when>
                                 </conditional>
                                 <conditional name="intercept_scaling">
-                                    <param argument="fit_intercept" type="select"
-                                        label="Should a constant (a.k.a. bias or intercept) be added to the decision function?" help="">
-                                        <option value="True">Yes</option>
+                                    <param argument="fit_intercept" type="select" label="Should a constant (a.k.a. bias or intercept) be added to the decision function?">
+                                        <option value="True" selected="true">Yes</option>
                                         <option value="False">No</option>
                                     </param>
                                     <when value="True">
-                                        <param argument="intercept_scaling" type="float" value="1.0"
-                                            label="Intercept scaling"
-                                            help="x becomes [x, self.intercept_scaling], i.e. a 'synthetic' feature with constant value equal to intercept_scaling is appended to the instance vector. The intercept becomes intercept_scaling * synthetic_feature_weight."/>
+                                        <param argument="intercept_scaling" type="float" value="1.0" label="Intercept scaling" help="x becomes [x, self.intercept_scaling], i.e. a 'synthetic' feature with constant value equal to intercept_scaling is appended to the instance vector. The intercept becomes intercept_scaling * synthetic_feature_weight."/>
                                     </when>
                                     <when value="False"/>
                                 </conditional>
                                 <expand macro="random_state"/>
                             </when>
                             <when value="sag">
+                                <param name="penalty" type="boolean" truevalue="l2" falsevalue="None" checked="true" label="use l2 penalty?"/>
                                 <expand macro="fit_intercept"/>
                                 <expand macro="random_state"/>
                                 <expand macro="max_iter"/>
@@ -436,39 +483,42 @@
                             </when>
                             <when value="saga">
                                 <conditional name="penalty">
-                                    <expand macro="penalty"/>
+                                    <expand macro="penalty">
+                                        <option value="elasticnet">elasticnet</option>
+                                        <option value="None">None</option>
+                                    </expand>
                                     <when value="l1"/>
                                     <when value="l2"/>
-                                    <when value="customized">
-                                        <expand macro="custom_penalty"/>
-                                    </when>
+                                    <when value="elasticnet"/>
+                                    <when value="None"/>
                                 </conditional>
                                 <expand macro="fit_intercept"/>
                                 <expand macro="multi_class"/>
                             </when>
                         </conditional>
-                        <param argument="tol" type="float" value="1e-4" label="Tolerance for stopping criteria" help=""/>
-                        <param argument="c" type="float" value="1.0" label="Inverse of regularization strength"
-                            help="It must be a positive float. Like in support vector machines, smaller values specify stronger regularization."/>
+                        <param argument="tol" type="float" value="1e-4" label="Tolerance for stopping criteria"/>
+                        <param argument="c" type="float" value="1.0" label="Inverse of regularization strength" help="It must be a positive float. Like in support vector machines, smaller values specify stronger regularization."/>
                     </when>
                 </conditional>
+                <param argument="key_added" type="text" value="" optional="true" label="The key in adata.uns information is saved to"/>
             </when>
             <!-- With inplace=True, NotImplementedError: Writing Pandas dataframes to h5ad is currently under development. Please use `inplace=False`. -->
-            <!-- <when value="tl.marker_gene_overlap">
+            <!-- Issue is fixed in the script -->
+            <when value="tl.marker_gene_overlap">
                 <repeat name="reference_markers" title="Marker genes">
-                    <param name="key" type="text" value="" label="Cell identity name" help=""/>
+                    <param name="key" type="text" value="" label="Cell identity name"/>
                     <param name="values" type="text" value="" label="List of genes" help="Comma-separated names from 'var'"/>
                 </repeat>
                 <param argument="key" type="text" value="rank_genes_groups" label="Key in adata.uns where the rank_genes_groups output is stored"/>
                 <conditional name="overlap">
                     <param argument="method" type="select" label="Method to calculate marker gene overlap">
-                        <option value="overlap_count">overlap_count: Intersection of the gene set</option>
+                        <option value="overlap_count" selected="true">overlap_count: Intersection of the gene set</option>
                         <option value="overlap_coef">overlap_coef: Overlap coefficient</option>
                         <option value="jaccard">jaccard: Jaccard index</option>
                     </param>
                     <when value="overlap_count">
                         <param argument="normalize" type="select" label="Normalization option for the marker gene overlap output">
-                            <option value="None">None</option>
+                            <option value="None" selected="true">None</option>
                             <option value="reference">reference: Normalization of the data by the total number of marker genes given in the reference annotation per group</option>
                             <option value="data">data: Normalization of the data by the total number of marker genes used for each cluster</option>
                         </param>
@@ -476,16 +526,31 @@
                     <when value="overlap_coef"/>
                     <when value="jaccard"/>
                 </conditional>
-                <param argument="top_n_markers" type="integer" optional="true" label="Number of top data-derived marker genes to use" help="By default all calculated marker genes are used. If adj_pval_threshold is set along with top_n_markers, then adj_pval_threshold is ignored."/>
-                <param argument="adj_pval_threshold" type="float" optional="true" label="Significance threshold on the adjusted p-values to select marker genes" help=" This can only be used when adjusted p-values are calculated by 'tl.rank_genes_groups'. If adj_pval_threshold is set along with top_n_markers, then adj_pval_threshold is ignored."/>
-                <param argument="key_added" type="text" value="marker_gene_overlap" optional="true" label="Key that will contain the marker overlap scores in 'uns'"/>
-            </when>-->
-            <when value="pp.log1p"/>
+                <param argument="top_n_markers" type="integer" optional="true" value="" label="Number of top data-derived marker genes to use" help="By default all calculated marker genes are used. If adj_pval_threshold is set along with top_n_markers, then adj_pval_threshold is ignored."/>
+                <param argument="adj_pval_threshold" type="float" optional="true" value="" label="Significance threshold on the adjusted p-values to select marker genes" help=" This can only be used when adjusted p-values are calculated by 'tl.rank_genes_groups'. If adj_pval_threshold is set along with top_n_markers, then adj_pval_threshold is ignored."/>
+                <param argument="key_added" type="text" optional="true" value="" label="Key that will contain the marker overlap scores in 'uns'"/>
+            </when>
+            <when value="pp.log1p">
+                <param argument="base" type="integer" value="" optional="true" label="Base of the logarithm." help="Natural logarithm is used by default."/>
+                <param argument="layer" type="text" value="" optional="true" label="Entry of layers to transform">
+                    <expand macro="sanitize_query"/>
+                </param>
+                <param argument="obsm" type="text" value="" optional="true" label="Entry of obsm to transform">
+                    <expand macro="sanitize_query"/>
+                </param>
+            </when>
             <when value="pp.scale">
-                <param argument="zero_center" type="boolean" truevalue="True" falsevalue="False" checked="true"
-                    label="Zero center?" help="If not, it omits zero-centering variables, which allows to handle sparse input efficiently."/>
-                <param argument="max_value" type="float" value="" optional="true" label="Maximum value"
-                    help="Clip (truncate) to this value after scaling. If not set, it does not clip."/>
+                <param argument="zero_center" type="boolean" truevalue="True" falsevalue="False" checked="true" label="Zero center?" help="If not, it omits zero-centering variables, which allows to handle sparse input efficiently."/>
+                <param argument="max_value" type="float" value="" optional="true" label="Maximum value" help="Clip (truncate) to this value after scaling. If not set, it does not clip."/>
+                <param argument="layer" type="text" value="" label="Which element of layers to scale">
+                    <expand macro="sanitize_query"/>
+                </param>
+                <param argument="obsm" type="text" value="" label="Which element of obsm to scale">
+                    <expand macro="sanitize_query"/>
+                </param>
+                <param argument="mask_obs" type="text" value="" label="Restrict both the derivation of scaling parameters and the scaling itself to a certain set of observations.">
+                    <expand macro="sanitize_query"/>
+                </param>
             </when>
             <when value="pp.sqrt"/>
         </conditional>
@@ -495,387 +560,38 @@
         <expand macro="anndata_outputs"/>
     </outputs>
     <tests>
+
+        <!-- test 1 -->
         <test expect_num_outputs="2">
-            <!-- test 1 -->
-            <param name="adata" value="sparce_csr_matrix.h5ad" />
+            <param name="adata" value="sparce_csr_matrix.h5ad"/>
             <conditional name="method">
                 <param name="method" value="pp.calculate_qc_metrics"/>
-                <param name="expr_type" value="counts"/>
-                <param name="var_type" value="genes"/>
                 <param name="qc_vars" value="mito,negative"/>
-                <param name="percent_top" value=""/>
-            </conditional>
-            <section name="advanced_common">
-                <param name="show_log" value="true" />
-            </section>
-            <output name="hidden_output">
-                <assert_contents>
-                    <has_text_matching expression="sc.pp.calculate_qc_metrics" />
-                    <has_text_matching expression="expr_type='counts'" />
-                    <has_text_matching expression="var_type='genes'" />
-                    <has_text_matching expression="qc_vars=\['mito', 'negative'\]" />
-                </assert_contents>
-            </output>
-            <output name="anndata_out" file="pp.calculate_qc_metrics.sparce_csr_matrix.h5ad" ftype="h5ad" compare="sim_size"/>
-        </test>
-        <test expect_num_outputs="2">
-            <!-- test 2 -->
-            <param name="adata" value="pp.recipe_weinreb17.paul15_subsample.h5ad" />
-            <conditional name="method">
-                <param name="method" value="pp.neighbors"/>
-                <param name="n_neighbors" value="15"/>
-                <param name="knn" value="True"/>
-                <param name="random_state" value="0"/>
-                <param name="pp_neighbors_method" value="umap"/>
-                <param name="metric" value="euclidean"/>
-            </conditional>
-            <section name="advanced_common">
-                <param name="show_log" value="true" />
-            </section>
-            <output name="hidden_output">
-                <assert_contents>
-                    <has_text_matching expression="sc.pp.neighbors"/>
-                    <has_text_matching expression="n_neighbors=15"/>
-                    <has_text_matching expression="knn=True"/>
-                    <has_text_matching expression="random_state=0"/>
-                    <has_text_matching expression="method='umap'"/>
-                    <has_text_matching expression="metric='euclidean'"/>
-                </assert_contents>
-            </output>
-            <output name="anndata_out" file="pp.neighbors_umap_euclidean.recipe_weinreb17.paul15_subsample.h5ad" ftype="h5ad" compare="sim_size">
-                <assert_contents>
-                    <has_h5_keys keys="X, obs, obsm, uns, var" />
-                </assert_contents>
-            </output>
-        </test>
-        <test expect_num_outputs="2">
-            <!-- test 3 -->
-            <param name="adata" value="pp.recipe_weinreb17.paul15_subsample.h5ad" />
-            <conditional name="method">
-                <param name="method" value="pp.neighbors"/>
-                <param name="n_neighbors" value="15"/>
-                <param name="knn" value="True"/>
-                <param name="pp_neighbors_method" value="gauss"/>
-                <param name="metric" value="braycurtis"/>
             </conditional>
             <section name="advanced_common">
-                <param name="show_log" value="true" />
-            </section>
-            <output name="hidden_output">
-                <assert_contents>
-                    <has_text_matching expression="sc.pp.neighbors"/>
-                    <has_text_matching expression="n_neighbors=15"/>
-                    <has_text_matching expression="knn=True"/>
-                    <has_text_matching expression="random_state=0"/>
-                    <has_text_matching expression="method='gauss'"/>
-                    <has_text_matching expression="metric='braycurtis'"/>
-                </assert_contents>
-            </output>
-            <output name="anndata_out" file="pp.neighbors_gauss_braycurtis.recipe_weinreb17.paul15_subsample.h5ad" ftype="h5ad" compare="sim_size"/>
-        </test>
-        <test expect_num_outputs="2">
-            <!-- test 4 -->
-            <param name="adata" value="krumsiek11.h5ad" />
-            <conditional name="method">
-                <param name="method" value="tl.score_genes"/>
-                <param name="gene_list" value="Gata2, Fog1"/>
-                <param name="ctrl_size" value="2"/>
-                <param name="n_bins" value="2"/>
-                <param name="random_state" value="2"/>
-                <param name="use_raw" value="False"/>
-                <param name="score_name" value="score"/>
-            </conditional>
-            <section name="advanced_common">
-                <param name="show_log" value="true" />
-            </section>
-            <output name="hidden_output">
-                <assert_contents>
-                    <has_text_matching expression="sc.tl.score_genes" />
-                    <has_text_matching expression="gene_list=\['Gata2', 'Fog1'\]" />
-                    <has_text_matching expression="ctrl_size=2" />
-                    <has_text_matching expression="score_name='score'" />
-                    <has_text_matching expression="n_bins=2" />
-                    <has_text_matching expression="random_state=2" />
-                    <has_text_matching expression="use_raw=False" />
-                    <has_text_matching expression="copy=False" />
-                </assert_contents>
-            </output>
-            <output name="anndata_out" file="tl.score_genes.krumsiek11.h5ad" ftype="h5ad" compare="sim_size"/>
-        </test>
-        <test expect_num_outputs="2">
-            <!-- test 5 -->
-            <param name="adata" value="krumsiek11.h5ad" />
-            <conditional name="method">
-                <param name="method" value="tl.score_genes_cell_cycle"/>
-                <conditional name='s_genes'>
-                    <param name="format" value="text"/>
-                    <param name="text" value="Gata2, Fog1, EgrNab"/>
-                </conditional>
-                <conditional name='g2m_genes'>
-                    <param name="format" value="text"/>
-                    <param name="text" value="Gata2, Fog1, EgrNab"/>
-                </conditional>
-                <param name="n_bins" value="2"/>
-                <param name="random_state" value="1"/>
-                <param name="use_raw" value="False"/>
-            </conditional>
-            <section name="advanced_common">
-                <param name="show_log" value="true" />
-            </section>
-            <output name="hidden_output">
-                <assert_contents>
-                    <has_text_matching expression="sc.tl.score_genes_cell_cycle"/>
-                    <has_text_matching expression="s_genes=\['Gata2', 'Fog1', 'EgrNab'\]"/>
-                    <has_text_matching expression="g2m_genes=\['Gata2', 'Fog1', 'EgrNab'\]"/>
-                    <has_text_matching expression="n_bins=2"/>
-                    <has_text_matching expression="random_state=1"/>
-                    <has_text_matching expression="use_raw=False"/>
-                </assert_contents>
-            </output>
-            <output name="anndata_out" file="tl.score_genes_cell_cycle.krumsiek11.h5ad" ftype="h5ad" compare="sim_size"/>
-        </test>
-        <test expect_num_outputs="2">
-            <!-- test 6 -->
-            <param name="adata" value="krumsiek11.h5ad" />
-            <conditional name="method">
-                <param name="method" value="tl.rank_genes_groups"/>
-                <param name="groupby" value="cell_type"/>
-                <param name="use_raw" value="False"/>
-                <conditional name="ref">
-                    <param name="rest" value="rest"/>
-                </conditional>
-                <param name="n_genes" value="100"/>
-                <conditional name="tl_rank_genes_groups_method">
-                    <param name="method" value="t-test_overestim_var"/>
-                    <param name="corr_method" value="benjamini-hochberg"/>
-                </conditional>
-            </conditional>
-            <section name="advanced_common">
-                <param name="show_log" value="true" />
+                <param name="show_log" value="true"/>
             </section>
             <output name="hidden_output">
                 <assert_contents>
-                    <has_text_matching expression="sc.tl.rank_genes_groups"/>
-                    <has_text_matching expression="groupby='cell_type'"/>
-                    <has_text_matching expression="use_raw=False"/>
-                    <has_text_matching expression="reference='rest'"/>
-                    <has_text_matching expression="n_genes=100"/>
-                    <has_text_matching expression="method='t-test_overestim_var'"/>
-                    <has_text_matching expression="corr_method='benjamini-hochberg'"/>
+                    <has_text_matching expression="sc.pp.calculate_qc_metrics"/>
+                    <has_text_matching expression="expr_type='counts'"/>
+                    <has_text_matching expression="var_type='genes'"/>
+                    <has_text_matching expression="qc_vars=\['mito', 'negative'\]"/>
                 </assert_contents>
             </output>
-            <output name="anndata_out" file="tl.rank_genes_groups.krumsiek11.h5ad" ftype="h5ad" compare="sim_size"/>
-        </test>
-        <test expect_num_outputs="2">
-            <!-- test 7 -->
-            <param name="adata" value="pbmc68k_reduced.h5ad" />
-            <conditional name="method">
-                <param name="method" value="tl.rank_genes_groups"/>
-                <param name="groupby" value="louvain"/>
-                <param name="use_raw" value="True"/>
-                <conditional name="ref">
-                    <param name="rest" value="rest"/>
-                </conditional>
-                <param name="n_genes" value="100"/>
-                <conditional name="tl_rank_genes_groups_method">
-                    <param name="method" value="logreg"/>
-                    <conditional name="solver">
-                        <param name="solver" value="newton-cg"/>
-                        <param name="fit_intercept" value="True"/>
-                        <param name="max_iter" value="100"/>
-                        <param name="multi_class" value="auto"/>
-                    </conditional>
-                    <param name="tol" value="1e-4"/>
-                    <param name="c" value="1.0"/>
-                </conditional>
-            </conditional>
-            <section name="advanced_common">
-                <param name="show_log" value="true" />
-            </section>
-            <output name="hidden_output">
+            <output name="anndata_out" ftype="h5ad">
                 <assert_contents>
-                    <has_text_matching expression="sc.tl.rank_genes_groups"/>
-                    <has_text_matching expression="groupby='louvain'"/>
-                    <has_text_matching expression="use_raw=True"/>
-                    <has_text_matching expression="reference='rest'"/>
-                    <has_text_matching expression="n_genes=100"/>
-                    <has_text_matching expression="method='logreg'"/>
-                    <has_text_matching expression="solver='newton-cg'"/>
-                    <has_text_matching expression="penalty='l2'"/>
-                    <has_text_matching expression="fit_intercept=True"/>
-                    <has_text_matching expression="max_iter=100"/>
-                    <has_text_matching expression="multi_class='auto'"/>
-                    <has_text_matching expression="tol=0.0001"/>
-                    <has_text_matching expression="C=1.0"/>
-                </assert_contents>
-            </output>
-            <output name="anndata_out" file="tl.rank_genes_groups.newton-cg.pbmc68k_reduced.h5ad" ftype="h5ad" compare="sim_size" delta="1000000" delta_frac="0.15">
-                <assert_contents>
-                    <has_h5_keys keys="X, obs, obsm, raw/X, raw/var, uns, var" />
+                    <has_h5_keys keys="obs/n_genes_by_counts,obs/log1p_n_genes_by_counts,obs/total_counts,obs/log1p_total_counts,obs/pct_counts_in_top_50_genes,obs/pct_counts_in_top_100_genes,obs/pct_counts_in_top_200_genes,obs/pct_counts_in_top_500_genes,obs/total_counts_mito,obs/log1p_total_counts_mito,obs/pct_counts_mito,obs/total_counts_negative,obs/log1p_total_counts_negative,obs/pct_counts_negative"/>
+                    <has_h5_keys keys="var/n_cells_by_counts,var/mean_counts,var/log1p_mean_counts,var/pct_dropout_by_counts,var/total_counts,var/log1p_total_counts"/>
                 </assert_contents>
             </output>
         </test>
+
+        <!-- test 2 -->
         <test expect_num_outputs="2">
-            <!-- test 8 -->
-            <param name="adata" value="pbmc68k_reduced.h5ad" />
-            <conditional name="method">
-                <param name="method" value="tl.rank_genes_groups"/>
-                <param name="groupby" value="louvain"/>
-                <param name="use_raw" value="True"/>
-                <conditional name="ref">
-                    <param name="rest" value="rest"/>
-                </conditional>
-                <param name="n_genes" value="100"/>
-                <conditional name="tl_rank_genes_groups_method">
-                    <param name="method" value="logreg"/>
-                    <conditional name="solver">
-                        <param name="solver" value="liblinear"/>
-                        <conditional name="penalty">
-                            <param name="penalty" value="l2"/>
-                            <param name="dual" value="False"/>
-                            <conditional name="intercept_scaling">
-                                <param name="fit_intercept" value="True"/>
-                                <param name="intercept_scaling" value="1.0" />
-                            </conditional>
-                            <param name="random_state" value="1"/>
-                        </conditional>
-                    </conditional>
-                    <param name="tol" value="1e-4"/>
-                    <param name="c" value="1.0"/>
-                </conditional>
-            </conditional>
-            <section name="advanced_common">
-                <param name="show_log" value="true" />
-            </section>
-            <output name="hidden_output">
-                <assert_contents>
-                    <has_text_matching expression="sc.tl.rank_genes_groups"/>
-                    <has_text_matching expression="groupby='louvain'"/>
-                    <has_text_matching expression="use_raw=True"/>
-                    <has_text_matching expression="reference='rest'"/>
-                    <has_text_matching expression="n_genes=100"/>
-                    <has_text_matching expression="method='logreg'"/>
-                    <has_text_matching expression="solver='liblinear'"/>
-                    <has_text_matching expression="penalty='l2'"/>
-                    <has_text_matching expression="dual=False"/>
-                    <has_text_matching expression="fit_intercept=True"/>
-                    <has_text_matching expression="intercept_scaling=1.0"/>
-                    <has_text_matching expression="tol=0.0001"/>
-                    <has_text_matching expression="C=1.0"/>
-                </assert_contents>
-            </output>
-            <output name="anndata_out" file="tl.rank_genes_groups.liblinear.krumsiek11.h5ad" ftype="h5ad" compare="sim_size" delta="1000000" delta_frac="0.15">
-                <assert_contents>
-                    <has_h5_keys keys="X, obs, obsm, raw/X, raw/var, uns, var" />
-                </assert_contents>
-            </output>
-        </test>
-        <!-- test expect_num_outputs="2">
-            < test 9  tl.marker_gene_overlap function was commented because inpace=True does not work>
-            <param name="adata" value="tl.rank_genes_groups.newton-cg.pbmc68k_reduced.h5ad" />
-            <conditional name="method">
-                <param name="method" value="tl.marker_gene_overlap"/>
-                <repeat name="reference_markers">
-                    <param name="key" value="CD4 T cells"/>
-                    <param name="value" value="IL7R"/>
-                </repeat>
-                <repeat name="reference_markers">
-                    <param name="key" value="CD14+ Monocytes"/>
-                    <param name="value" value="CD14,LYZ"/>
-                </repeat>
-                <repeat name="reference_markers">
-                    <param name="key" value="B cells"/>
-                    <param name="value" value="MS4A1"/>
-                </repeat>
-                <conditional name="overlap">
-                    <param name="method" value="overlap_count"/>
-                    <param name="normalize" value="None"/>
-                </conditional>
-            </conditional>
-            <assert_stdout>
-                <has_text_matching expression="tl.marker_gene_overlap"/>
-                <has_text_matching expression="key='rank_genes_groups'"/>
-                <has_text_matching expression="method='overlap_count'"/>
-            </assert_stdout>
-            <output name="anndata_out" file="tl.marker_gene_overlap.pbmc68k_reduced.h5ad" ftype="h5ad" compare="sim_size"/>
-        </test> -->
-        <test expect_num_outputs="2">
-            <!-- test 10 -->
-            <param name="adata" value="krumsiek11.h5ad" />
-            <conditional name="method">
-                <param name="method" value="pp.log1p"/>
-            </conditional>
-            <section name="advanced_common">
-                <param name="show_log" value="true" />
-            </section>
-            <output name="hidden_output">
-                <assert_contents>
-                    <has_text_matching expression="sc.pp.log1p"/>
-                </assert_contents>
-            </output>
-            <output name="anndata_out" file="pp.log1p.krumsiek11.h5ad" ftype="h5ad" compare="sim_size"/>
-        </test>
-        <test expect_num_outputs="2">
-            <!-- test 11 -->
-            <param name="adata" value="krumsiek11.h5ad" />
-            <conditional name="method">
-                <param name="method" value="pp.scale"/>
-                <param name="zero_center" value="true"/>
-            </conditional>
-            <section name="advanced_common">
-                <param name="show_log" value="true" />
-            </section>
-            <output name="hidden_output">
-                <assert_contents>
-                    <has_text_matching expression="sc.pp.scale"/>
-                    <has_text_matching expression="zero_center=True"/>
-                </assert_contents>
-            </output>
-            <output name="anndata_out" file="pp.scale.krumsiek11.h5ad" ftype="h5ad" compare="sim_size"/>
-        </test>
-        <test expect_num_outputs="2">
-            <!-- test 12 -->
-            <param name="adata" value="krumsiek11.h5ad" />
-            <conditional name="method">
-                <param name="method" value="pp.scale"/>
-                <param name="zero_center" value="true"/>
-                <param name="max_value" value="10"/>
-            </conditional>
-            <section name="advanced_common">
-                <param name="show_log" value="true" />
-            </section>
-            <output name="hidden_output">
-                <assert_contents>
-                    <has_text_matching expression="sc.pp.scale"/>
-                    <has_text_matching expression="zero_center=True"/>
-                    <has_text_matching expression="max_value=10.0"/>
-                </assert_contents>
-            </output>
-            <output name="anndata_out" file="pp.scale_max_value.krumsiek11.h5ad" ftype="h5ad" compare="sim_size"/>
-        </test>
-        <test expect_num_outputs="2">
-            <!-- test 13 -->
-            <param name="adata" value="krumsiek11.h5ad" />
-            <conditional name="method">
-                <param name="method" value="pp.sqrt"/>
-            </conditional>
-            <section name="advanced_common">
-                <param name="show_log" value="true" />
-            </section>
-            <output name="hidden_output">
-                <assert_contents>
-                    <has_text_matching expression="sc.pp.sqrt"/>
-                </assert_contents>
-            </output>
-            <output name="anndata_out" file="pp.sqrt.krumsiek11.h5ad" ftype="h5ad" compare="sim_size"/>
-        </test>
-        <test expect_num_outputs="2">
-            <!-- test 13 -->
-            <param name="adata" value="sparce_csr_matrix.h5ad" />
+            <param name="adata" value="sparce_csr_matrix.h5ad"/>
             <conditional name="method">
                 <param name="method" value="pp.calculate_qc_metrics"/>
-                <param name="expr_type" value="counts"/>
-                <param name="var_type" value="genes"/>
                 <param name="qc_vars" value="mito,negative"/>
                 <param name="percent_top" value="50,100,200,300"/>
             </conditional>
@@ -891,14 +607,382 @@
                     <has_text_matching expression="percent_top=\[50, 100, 200, 300\]" />
                 </assert_contents>
             </output>
-            <output name="anndata_out" file="pp.calculate_qc_metrics.sparce_csr_matrix.h5ad" ftype="h5ad" compare="sim_size"/>
+            <output name="anndata_out" ftype="h5ad">
+                <assert_contents>
+                    <has_h5_keys keys="obs/n_genes_by_counts,obs/log1p_n_genes_by_counts,obs/total_counts,obs/log1p_total_counts,obs/pct_counts_in_top_50_genes,obs/pct_counts_in_top_100_genes,obs/pct_counts_in_top_200_genes,obs/pct_counts_in_top_300_genes,obs/total_counts_mito,obs/log1p_total_counts_mito,obs/pct_counts_mito,obs/total_counts_negative,obs/log1p_total_counts_negative,obs/pct_counts_negative"/>
+                    <has_h5_keys keys="var/mito,var/negative,var/n_cells_by_counts,var/mean_counts,var/log1p_mean_counts,var/pct_dropout_by_counts,var/total_counts,var/log1p_total_counts"/>
+                </assert_contents>
+            </output>
+        </test>
+        
+        <!-- test 3 -->
+        <test expect_num_outputs="2">
+            <param name="adata" value="pp.recipe_weinreb17.paul15_subsample.h5ad"/>
+            <conditional name="method">
+                <param name="method" value="pp.neighbors"/>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="sc.pp.neighbors"/>
+                    <has_text_matching expression="n_neighbors=15"/>
+                    <has_text_matching expression="knn=True"/>
+                    <has_text_matching expression="random_state=0"/>
+                    <has_text_matching expression="method='umap'"/>
+                    <has_text_matching expression="metric='euclidean'"/>
+                </assert_contents>
+            </output>
+            <output name="anndata_out" ftype="h5ad">
+                <assert_contents>
+                    <has_h5_keys keys="uns/neighbors"/>
+                    <has_h5_keys keys="obsp/connectivities,obsp/distances"/>
+                </assert_contents>
+            </output>
+        </test>
+
+        <!-- test 4 -->
+        <test expect_num_outputs="2">
+            <param name="adata" value="pp.recipe_weinreb17.paul15_subsample.h5ad"/>
+            <conditional name="method">
+                <param name="method" value="pp.neighbors"/>
+                <param name="pp_neighbors_method" value="gauss"/>
+                <param name="metric" value="braycurtis"/>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="sc.pp.neighbors"/>
+                    <has_text_matching expression="n_neighbors=15"/>
+                    <has_text_matching expression="knn=True"/>
+                    <has_text_matching expression="random_state=0"/>
+                    <has_text_matching expression="method='gauss'"/>
+                    <has_text_matching expression="metric='braycurtis'"/>
+                </assert_contents>
+            </output>
+            <output name="anndata_out" ftype="h5ad">
+                <assert_contents>
+                    <has_h5_keys keys="obsp/connectivities,obsp/distances"/>
+                </assert_contents>
+            </output>
+        </test>
+
+        <!-- test 5 -->
+        <test expect_num_outputs="2">
+            <param name="adata" value="krumsiek11.h5ad"/>
+            <conditional name="method">
+                <param name="method" value="tl.score_genes"/>
+                <param name="gene_list" value="Gata2, Fog1"/>
+                <param name="ctrl_size" value="2"/>
+                <param name="n_bins" value="2"/>
+                <param name="random_state" value="2"/>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="sc.tl.score_genes"/>
+                    <has_text_matching expression="gene_list=\['Gata2', 'Fog1'\]"/>
+                    <has_text_matching expression="ctrl_size=2"/>
+                    <has_text_matching expression="score_name='score'"/>
+                    <has_text_matching expression="n_bins=2"/>
+                    <has_text_matching expression="random_state=2"/>
+                    <has_text_matching expression="use_raw=False"/>
+                    <has_text_matching expression="copy=False"/>
+                </assert_contents>
+            </output>
+            <output name="anndata_out" ftype="h5ad">
+                <assert_contents>
+                    <has_h5_keys keys="obs/score"/>
+                </assert_contents>
+            </output>
+        </test>
+
+        <!-- test 6 -->
+        <test expect_num_outputs="2">
+            <param name="adata" value="krumsiek11.h5ad"/>
+            <conditional name="method">
+                <param name="method" value="tl.score_genes_cell_cycle"/>
+                <conditional name='s_genes'>
+                    <param name="format" value="text"/>
+                    <param name="text" value="Gata2, Fog1, EgrNab"/>
+                </conditional>
+                <conditional name='g2m_genes'>
+                    <param name="format" value="text"/>
+                    <param name="text" value="Gata2, Fog1, EgrNab"/>
+                </conditional>
+                <param name="n_bins" value="2"/>
+                <param name="random_state" value="1"/>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="sc.tl.score_genes_cell_cycle"/>
+                    <has_text_matching expression="s_genes=\['Gata2', 'Fog1', 'EgrNab'\]"/>
+                    <has_text_matching expression="g2m_genes=\['Gata2', 'Fog1', 'EgrNab'\]"/>
+                    <has_text_matching expression="n_bins=2"/>
+                    <has_text_matching expression="random_state=1"/>
+                    <has_text_matching expression="use_raw=False"/>
+                </assert_contents>
+            </output>
+            <output name="anndata_out" ftype="h5ad">
+                <assert_contents>
+                    <has_h5_keys keys="obs/S_score,obs/G2M_score,obs/phase"/>
+                </assert_contents>
+            </output>
+        </test>
+
+        <!-- test 7 -->
+        <test expect_num_outputs="2">
+            <param name="adata" value="krumsiek11.h5ad"/>
+            <conditional name="method">
+                <param name="method" value="tl.rank_genes_groups"/>
+                <param name="groupby" value="cell_type"/>
+                <param name="n_genes" value="100"/>
+                <conditional name="tl_rank_genes_groups_method">
+                    <param name="method" value="t-test_overestim_var"/>
+                </conditional>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="sc.tl.rank_genes_groups"/>
+                    <has_text_matching expression="groupby='cell_type'"/>
+                    <has_text_matching expression="use_raw=False"/>
+                    <has_text_matching expression="reference='rest'"/>
+                    <has_text_matching expression="n_genes=100"/>
+                    <has_text_matching expression="method='t-test_overestim_var'"/>
+                    <has_text_matching expression="corr_method='benjamini-hochberg'"/>
+                </assert_contents>
+            </output>
+            <output name="anndata_out" ftype="h5ad">
+                <assert_contents>
+                    <has_h5_keys keys="uns/rank_genes_groups"/>
+                </assert_contents>
+            </output>
+        </test>
+
+        <!-- test 8 -->
+        <test expect_num_outputs="2">
+            <param name="adata" value="krumsiek11.h5ad"/>
+            <conditional name="method">
+                <param name="method" value="tl.rank_genes_groups"/>
+                <param name="groupby" value="cell_type"/>
+                <param name="n_genes" value="100"/>
+                <conditional name="tl_rank_genes_groups_method">
+                    <param name="method" value="logreg"/>
+                </conditional>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="sc.tl.rank_genes_groups"/>
+                    <has_text_matching expression="groupby='cell_type'"/>
+                    <has_text_matching expression="use_raw=False"/>
+                    <has_text_matching expression="reference='rest'"/>
+                    <has_text_matching expression="n_genes=100"/>
+                    <has_text_matching expression="method='logreg'"/>
+                    <has_text_matching expression="solver='lbfgs'"/>
+                    <has_text_matching expression="penalty='l2'"/>
+                    <has_text_matching expression="fit_intercept=True"/>
+                    <has_text_matching expression="max_iter=100"/>
+                    <has_text_matching expression="multi_class='auto'"/>
+                    <has_text_matching expression="tol=0.0001"/>
+                    <has_text_matching expression="C=1.0"/>
+                </assert_contents>
+            </output>
+            <output name="anndata_out" ftype="h5ad">
+                <assert_contents>
+                    <has_h5_keys keys="uns/rank_genes_groups"/>
+                </assert_contents>
+            </output>
+        </test>
+
+        <!-- test 9 -->
+        <test expect_num_outputs="2">
+            <param name="adata" value="krumsiek11.h5ad"/>
+            <conditional name="method">
+                <param name="method" value="tl.rank_genes_groups"/>
+                <param name="groupby" value="cell_type"/>
+                <param name="n_genes" value="100"/>
+                <conditional name="tl_rank_genes_groups_method">
+                    <param name="method" value="logreg"/>
+                    <conditional name="solver">
+                        <param name="solver" value="liblinear"/>
+                        <conditional name="penalty">
+                            <param name="penalty" value="l2"/>
+                            <param name="random_state" value="1"/>
+                        </conditional>
+                    </conditional>
+                </conditional>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="sc.tl.rank_genes_groups"/>
+                    <has_text_matching expression="groupby='cell_type'"/>
+                    <has_text_matching expression="use_raw=False"/>
+                    <has_text_matching expression="reference='rest'"/>
+                    <has_text_matching expression="n_genes=100"/>
+                    <has_text_matching expression="method='logreg'"/>
+                    <has_text_matching expression="solver='liblinear'"/>
+                    <has_text_matching expression="penalty='l2'"/>
+                    <has_text_matching expression="dual=False"/>
+                    <has_text_matching expression="fit_intercept=True"/>
+                    <has_text_matching expression="intercept_scaling=1.0"/>
+                    <has_text_matching expression="tol=0.0001"/>
+                    <has_text_matching expression="C=1.0"/>
+                </assert_contents>
+            </output>
+            <output name="anndata_out" ftype="h5ad">
+                <assert_contents>
+                    <has_h5_keys keys="uns/rank_genes_groups"/>
+                </assert_contents>
+            </output>
+        </test> 
+
+        <!-- test 10 -->
+        <test expect_num_outputs="2">
+            <param name="adata" value="tl.rank_genes_groups.newton-cg.pbmc68k_reduced.h5ad"/>
+            <conditional name="method">
+                <param name="method" value="tl.marker_gene_overlap"/>
+                <repeat name="reference_markers">
+                    <param name="key" value="CD4 T cells"/>
+                    <param name="values" value="IL7R"/>
+                </repeat>
+                <repeat name="reference_markers">
+                    <param name="key" value="CD14+ Monocytes"/>
+                    <param name="values" value="CD14,LYZ"/>
+                </repeat>
+                <repeat name="reference_markers">
+                    <param name="key" value="B cells"/>
+                    <param name="values" value="MS4A1"/>
+                </repeat>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <assert_stdout>
+                <has_text_matching expression="marker_gene_overlap"/>
+            </assert_stdout>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="sc.tl.marker_gene_overlap"/>
+                </assert_contents>
+            </output>
+            <output name="anndata_out" ftype="h5ad">
+                <assert_contents>
+                    <has_h5_keys keys="uns/rank_genes_groups"/>
+                </assert_contents>
+            </output>
+        </test>
+
+        <!-- test 11 -->
+        <test expect_num_outputs="2">
+            <param name="adata" value="krumsiek11.h5ad"/>
+            <conditional name="method">
+                <param name="method" value="pp.log1p"/>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="sc.pp.log1p"/>
+                </assert_contents>
+            </output>
+            <output name="anndata_out" ftype="h5ad">
+                <assert_contents>
+                    <has_h5_keys keys="uns/log1p"/>
+                </assert_contents>
+            </output>
+        </test>
+
+        <!-- test 12 -->
+        <test expect_num_outputs="2">
+            <param name="adata" value="krumsiek11.h5ad"/>
+            <conditional name="method">
+                <param name="method" value="pp.scale"/>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="sc.pp.scale"/>
+                    <has_text_matching expression="zero_center=True"/>
+                </assert_contents>
+            </output>
+            <output name="anndata_out" ftype="h5ad">
+                <assert_contents>
+                    <has_h5_keys keys="var/mean,var/std"/>
+                </assert_contents>
+            </output>        </test>
+
+        <!-- test 13 -->
+        <test expect_num_outputs="2">
+            <param name="adata" value="krumsiek11.h5ad"/>
+            <conditional name="method">
+                <param name="method" value="pp.scale"/>
+                <param name="max_value" value="10"/>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="sc.pp.scale"/>
+                    <has_text_matching expression="zero_center=True"/>
+                    <has_text_matching expression="max_value=10.0"/>
+                </assert_contents>
+            </output>
+            <output name="anndata_out" ftype="h5ad">
+                <assert_contents>
+                    <has_h5_keys keys="var/mean,var/std"/>
+                </assert_contents>
+            </output>
+        </test>
+
+        <!-- test 14 -->
+        <test expect_num_outputs="2">
+            <param name="adata" value="random-randint.h5ad"/>
+            <conditional name="method">
+                <param name="method" value="pp.sqrt"/>
+            </conditional>
+            <section name="advanced_common">
+                <param name="show_log" value="true"/>
+            </section>
+            <output name="hidden_output">
+                <assert_contents>
+                    <has_text_matching expression="sc.pp.sqrt"/>
+                    <has_text_matching expression="stats before sqrt: min= 0.0 max= 999.0 mean= 499.83777"/>
+                    <has_text_matching expression="stats after sqrt: min= 0.0 max= 31.606962 mean= 21.079018"/>
+                </assert_contents>
+            </output>
+            <output name="anndata_out" ftype="h5ad">
+                <assert_contents>
+                    <has_h5_keys keys="obs/index"/>
+                </assert_contents>
+            </output>
         </test>
     </tests>
     <help><![CDATA[
 Calculate quality control metrics., using `pp.calculate_qc_metrics`
 ===================================================================
 
-Calculates a number of qc metrics for an AnnData object, largely based on calculateQCMetrics from scater. 
+Calculates a number of qc metrics for an AnnData object, largely based on calculateQCMetrics from scater.
 Currently is most efficient on a sparse CSR or dense matrix.
 
 It updates the observation level metrics with
@@ -983,6 +1067,8 @@
 
 Marker gene overlap scores can be quoted as overlap counts, overlap coefficients, or jaccard indices. The method returns a pandas dataframe which can be used to annotate clusters based on marker gene overlaps.
 
+More details on the `scanpy documentation
+<https://scanpy.readthedocs.io/en/stable/generated/scanpy.tl.marker_gene_overlap.html>`__
 
 Logarithmize the data matrix (`pp.log1p`)
 =========================================
--- a/macros.xml	Tue Aug 20 09:50:59 2024 +0000
+++ b/macros.xml	Sat Sep 14 12:45:03 2024 +0000
@@ -1,17 +1,15 @@
 <macros>
-    <token name="@TOOL_VERSION@">1.9.6</token>
-    <token name="@VERSION_SUFFIX@">4</token>
-    <token name="@profile@">21.09</token>
+    <token name="@TOOL_VERSION@">1.10.2</token>
+    <token name="@VERSION_SUFFIX@">0</token>
+    <token name="@PROFILE@">21.09</token>
     <xml name="requirements">
         <requirements>
             <requirement type="package" version="@TOOL_VERSION@">scanpy</requirement>
-            <requirement type="package" version="3.0.6">loompy</requirement>
-            <requirement type="package" version="0.10.1">leidenalg</requirement>
-            <requirement type="package" version="0.8.1">louvain</requirement>
-            <requirement type="package" version="1.5.3">pandas</requirement>
-            <requirement type="package" version="3.7">matplotlib</requirement>
-            <requirement type="package" version="0.12.2">seaborn</requirement>
-            <requirement type="package" version="3.0.0">magic-impute</requirement>
+            <requirement type="package" version="0.10.3">anndata</requirement>
+            <requirement type="package" version="1.26.4">numpy</requirement>
+            <requirement type="package" version="2.2.2">pandas</requirement>
+            <requirement type="package" version="1.14.1">scipy</requirement>
+            <requirement type="package" version="0.14.2">statsmodels</requirement>           
             <yield />
         </requirements>
     </xml>
@@ -22,7 +20,7 @@
     </xml>
     <xml name="creators">
         <creator>
-            <organization name="European Galaxy Team" url="https://galaxyproject.org/eu/" />
+            <organization name="European Galaxy Team" url="https://galaxyproject.org/eu/"/>
         </creator>
     </xml>
     <xml name="citations">
@@ -31,28 +29,13 @@
             <citation type="doi">10.1093/gigascience/giaa102</citation>
         </citations>
     </xml>
-    <xml name="version_command">
-        <version_command><![CDATA[python -c "import scanpy as sc;print('scanpy version: %s' % sc.__version__)"]]></version_command>
-    </xml>
-    <token name="@CMD@"><![CDATA[
-cp '$adata' 'anndata.h5ad' &&
-cat '$script_file' > '$hidden_output' &&
-python '$script_file' >> '$hidden_output' &&
-ls . >> '$hidden_output' &&
-touch 'anndata_info.txt' &&
-cat 'anndata_info.txt' @CMD_prettify_stdout@
-    ]]>
-    </token>
-    <token name="@CMD_imports@"><![CDATA[
-import scanpy as sc
-import pandas as pd
-import numpy as np
-    ]]>
-    </token>
+    
+    
+    <!-- param macros -->
     <xml name="sanitize_query" token_validinitial="string.printable">
         <sanitizer>
             <valid initial="@VALIDINITIAL@">
-                <remove value="&apos;" />
+                <remove value="&apos;"/>
             </valid>
        </sanitizer>
     </xml>
@@ -62,58 +45,55 @@
                 <add value=","/>
             </valid>
         </sanitizer>
-    </xml>
+    </xml>      
     <xml name="inputs_anndata">
         <param name="adata" type="data" format="h5ad" label="Annotated data matrix"/>
     </xml>
-    <token name="@CMD_read_inputs@"><![CDATA[
-adata = sc.read_h5ad('anndata.h5ad')
-]]>
-    </token>
     <xml name="inputs_common_advanced">
         <section name="advanced_common" title="Advanced Options" expanded="false">
-            <param name="show_log" type="boolean" checked="false" label="Output Log?" />
+            <param name="show_log" type="boolean" checked="false" label="Output Log?"/>
         </section>
     </xml>
     <xml name="anndata_outputs">
-        <data name="anndata_out" format="h5ad" from_work_dir="anndata.h5ad" label="${tool.name} (${method.method}) on ${on_string}: Annotated data matrix"/>
-            <data name="hidden_output" format="txt" label="Log file" >
+        <data name="anndata_out" format="h5ad" from_work_dir="anndata.h5ad" label="${tool.name} (${method.method}) on ${on_string}: Annotated data matrix">
+            <yield />
+        </data>
+        <data name="hidden_output" format="txt" label="Log file" >
             <filter>advanced_common['show_log']</filter>
         </data>
+    </xml>    
+    <xml name="param_use_rep">
+        <param argument="use_rep" type="text" value="" optional="true" label="Use the indicated representation" help="If not set, the representation is chosen automatically: for n_vars below 50, X is used, otherwise X_pca (uns) is used. If X_pca is not present, it's computed with default parameter">
+                <expand macro="sanitize_query"/>
+        </param>
     </xml>
-    <token name="@CMD_anndata_write_outputs@"><![CDATA[
-adata.write_h5ad('anndata.h5ad')
-with open('anndata_info.txt','w', encoding='utf-8') as ainfo:
-    print(adata, file=ainfo)
-]]>
-    </token>
-    <token name="@CMD_prettify_stdout@"><![CDATA[ | sed -r '1 s|AnnData object with (.+) = (.*)\s*|\1: \2|g' | sed "s|'||g"  | sed -r 's|^\s*(.*):\s(.*)|[\1]\n-    \2|g' | sed 's|, |\n-    |g'
-    ]]></token>
     <xml name="svd_solver">
-        <param name="svd_solver" type="select" label="SVD solver to use" help="">
+        <param name="svd_solver" type="select" optional="true" label="SVD solver to use">
             <option value="auto">Automatically chosen depending on the size of the problem</option>
             <option value="arpack">ARPACK wrapper in SciPy</option>
             <option value="randomized">Randomized algorithm due to Halko (2009)</option>
+            <option value="lobpcg">An alternative SciPy solver. Not available with dask arrays.</option>
+            <option value="tsqr">Only available with dask arrays. “tsqr” algorithm from Benson et. al. (2013).</option>
         </param>
     </xml>
     <xml name="pca_random_state">
-        <param name="random_state" type="integer" value="0" label="Initial states for the optimization" help=""/>
+        <param name="random_state" type="integer" value="0" label="Initial states for the optimization"/>
     </xml>
     <xml name="param_plot_format">
         <param name="format" type="select" label="Format for saving figures">
-            <option value="png">png</option>
+            <option value="png" selected="true">png</option>
             <option value="pdf">pdf</option>
             <option value="svg">svg</option>
         </param>
     </xml>
     <xml name="numeric_distance_metric_options">
+    	<option value="euclidean" selected="true">euclidean</option>
         <option value="braycurtis">braycurtis</option>
         <option value="canberra">canberra</option>
         <option value="chebyshev">chebyshev</option>
         <option value="cityblock">cityblock</option>
         <option value="correlation">correlation</option>
         <option value="cosine">cosine</option>
-        <option value="euclidean" selected="true">euclidean</option>
         <option value="mahalanobis">mahalanobis</option>
         <option value="matching">matching</option>
         <option value="minkowski">minkowski</option>
@@ -393,141 +373,6 @@
         <option value="nipy_spectral">nipy_spectral (Miscellaneous)</option>
         <option value="gist_ncar">gist_ncar (Miscellaneous)</option>
     </xml>
-    <xml name="param_groupby">
-        <param argument="groupby" type="text" value="" optional="true" label="The key of the observation grouping to consider" help="If it is given, the plot is ordered by the respective group. It is expected that to be a categorical. If it is not a categorical observation, it would be subdivided into 'num_categories'.">
-            <expand macro="sanitize_query" />
-        </param>
-    </xml>
-    <xml name="param_use_raw">
-        <param argument="use_raw" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Use 'raw' attribute of input if present" help=""/>
-    </xml>
-    <xml name="param_log">
-        <param argument="log" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Use the log of the values?"/>
-    </xml>
-    <xml name="pl_figsize">
-        <conditional name="figsize">
-            <param name="test" type="select" label="Custom figure size" >
-                <option value="yes">Yes</option>
-                <option value="no" selected="true">No: the figure width is set based on the number of variable names and the height is set to 10.</option>
-            </param>
-            <when value="yes">
-                <param argument="width" type="integer" min="0" value="10" label="Figure width" help=""/>
-                <param argument="height" type="integer" min="0" value="10" label="Figure height" help=""/>
-            </when>
-            <when value="no"/>
-        </conditional>
-    </xml>
-    <token name="@CMD_params_figsize@"><![CDATA[
-
-    ]]></token>
-    <xml name="pl_var_names">
-        <conditional name="var_names">
-            <param name="type" type="select" label="Variables to plot (columns of the heatmaps)" >
-                <option value="all">All variables in 'adata.var_names'</option>
-                <option value="custom">Subset of variables in 'adata.var_names'</option>
-                <option value="customfile">Subset of variables as a tabular file</option>
-            </param>
-            <when value="all"/>
-            <when value="custom">
-                <param argument="var_names" type="text" value="" label="List of variables to plot" help="They should be a valid subset of 'adata.var_names', and separated by comma">
-                    <expand macro="sanitize_query" />
-                </param>
-            </when>
-            <when value="customfile">
-                <param argument="var_names" type="data" format="tabular" label="List of variables to plot" help="This should be a tsv where row = group (e.g. celltypes) and columns = variables."></param>
-                <param name="header" type="select" label="Header in the list of markers?">
-                    <option value="included">Header incldued</option>
-                    <option value="not_included">Header not included</option>
-                </param>
-            </when>
-        </conditional>
-    </xml>
-    <xml name="param_num_categories">
-        <param argument="num_categories" type="integer" min="0" value="7" label="Number of categories" help="It is only used if groupby observation is not categorical. This value determines the number of groups into which the groupby observation should be subdivided."/>
-    </xml>
-    <xml name="param_dendrogram">
-        <param argument="dendrogram" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Compute and plot a dendrogram?" help="groupby categories are reordered accoring to the dendrogram order. If groups of var_names are set and those groups correspond to the groupby categories, those groups are also reordered. The ‘person’ method is used to compute the pairwise correlation between categories using all var_names in raw if use_raw is None, otherwise all adata.var_names are used. The linkage method used is complete."/>
-    </xml>
-    <xml name="pl_var_group_positions">
-        <repeat name="var_group_positions" title="Group of variables to highlight" help="This will draw a 'bracket' on top of the plot between the given start and end positions. If a label is given, it will be added on top of the bracket. ">
-            <param name="start" type="integer" min="0" value="" label="Start" help=""/>
-            <param name="end" type="integer" min="0" value="" label="End" help=""/>
-            <param argument="label" type="text" value="" label="Label" help="">
-                <expand macro="sanitize_query" />
-            </param>
-        </repeat>
-    </xml>
-    <xml name="param_var_group_rotation">
-        <param argument="var_group_rotation" type="float" value="" optional="true" label="Label rotation degrees" help="By default, labels larger than 4 characters are rotated 90 degrees"/>
-    </xml>
-    <xml name="param_layer">
-        <param argument="layer" type="text" value="" label="Name of the AnnData object layer that wants to be plotted" help="By default 'adata.raw.X' is plotted. If 'use_raw=False' is set, then 'adata.X' is plotted. If layer is set to a valid layer name, then the layer is plotted. layer takes precedence over 'use_raw'.">
-            <expand macro="sanitize_query" />
-        </param>
-    </xml>
-    <token name="@CMD_param_plot_inputs@"><![CDATA[
-    adata,
-    save='.$format',
-    show=False,
-    ]]></token>
-    <xml name="params_inputs">
-        <expand macro="pl_var_names"/>
-        <expand macro="param_groupby"/>
-        <expand macro="param_num_categories"/>
-    </xml>
-    <token name="@CMD_var_names_header_check@"><![CDATA[
-header='infer'
-#if $method.var_names.type == 'customfile' and $method.var_names.header == 'not_included' :
-header=None
-#end if
-    ]]></token>
-    <token name="@CMD_params_inputs@"><![CDATA[
-    #if $method.var_names.type == 'custom'
-    #set $var_names = ([x.strip() for x in str($method.var_names.var_names).split(',')])
-    var_names=$var_names,
-    #else if $method.var_names.type == 'customfile'
-    var_names={key: [v for v in list(value.values()) if pd.notna(v)] for key, value in pd.read_csv('$var_names', sep='\t', index_col=0).to_dict(orient='index').items()},
-    #else
-    var_names=adata.var_names,
-    #end if
-    #if $method.groupby
-    groupby='$method.groupby',
-    #end if
-    num_categories=$method.num_categories,
-    ]]></token>
-    <xml name="params_plots">
-        <expand macro="param_log"/>
-        <expand macro="param_use_raw"/>
-        <expand macro="param_dendrogram"/>
-        <expand macro="pl_var_group_positions"/>
-        <expand macro="param_var_group_rotation"/>
-        <expand macro="pl_figsize"/>
-        <expand macro="param_layer"/>
-    </xml>
-    <token name="@CMD_params_plots@"><![CDATA[
-    log=$method.log,
-    use_raw=$method.use_raw,
-    dendrogram=$method.dendrogram,
-    #if len($method.var_group_positions) > 0:
-        #set $var_group_positions=[]
-        #set $var_group_labels=[]
-        #for $i, $s in enumerate($method.var_group_positions)
-            #silent $var_group_positions.append((int($s.start), int($s.end)))
-            #silent $var_group_labels.append(str($s.label))
-        #end for
-    var_group_positions=$var_group_positions,
-    var_group_labels=$var_group_labels,
-    #end if
-    #if str($method.var_group_rotation) != ''
-        var_group_rotation=$method.var_group_rotation,
-    #end if
-    #if $method.figsize.test == 'yes'
-        figsize=($method.figsize.width, $method.figsize.height),
-    #end if
-    #if $method.layer
-        layer='$method.layer',
-    #end if
-    ]]></token>
     <xml name="matplotlib_color">
         <option value="AliceBlue">AliceBlue</option>
         <option value="AntiqueWhite">AntiqueWhite</option>
@@ -679,500 +524,298 @@
         <option value="YellowGreen">YellowGreen</option>
     </xml>
     <xml name="param_matplotlib_pyplot_edgecolors">
-        <param argument="edgecolors" type="select" optional="true" label="Edge color of the marker" help="">
+        <param argument="edgecolors" type="select" optional="true" label="Edge color of the marker">
             <option value="face">The edge color will always be the same as the face color</option>
             <expand macro="matplotlib_color"/>
         </param>
     </xml>
-    <xml name="param_alpha">
-        <param argument="alpha" type="float" value="" min="0" max="1" optional="true" label="Alpha blending value" help="Between 0 (transparent) and 1 (opaque)"/>
-    </xml>
-    <xml name="param_vmin">
-        <param argument="vmin" type="float" value="" optional="true" label="Minimum value to normalize luminance data" help="If not set, it is inferred from the data and other keyword arguments"/>
-    </xml>
-    <xml name="param_vmax">
-        <param argument="vmax" type="float" value="" optional="true" label="Maximum value to normalize luminance data" help="If not set, it is inferred from the data and other keyword arguments"/>
-    </xml>
-    <xml name="section_matplotlib_pyplot_scatter">
-        <section name="matplotlib_pyplot_scatter" title="Parameters for matplotlib.pyplot.scatter">
-            <!--<param argument="marker" type="select" label="Marker style" help="">
-                <option value="o">o</option>
-                <option value="v">v</option>
-                <option value="^">^</option>
-                <option value="8">8</option>
-                <option value="s">s</option>
-                <option value="p">p</option>
-                <option value="*">*</option>
-                <option value="h">h</option>
-                <option value="H">H</option>
-                <option value="D">D</option>
-                <option value="d">d</option>
-                <option value="P">P</option>
-                <option value="X">X</option>
-            </param>-->
-            <expand macro="param_alpha"/>
-            <expand macro="param_vmin"/>
-            <expand macro="param_vmax"/>
-            <param argument="linewidths" type="float" value="0" label="Linewidth of the marker edges" help=""/>
-            <expand macro="param_matplotlib_pyplot_edgecolors"/>
-        </section>
+    <xml name="param_swap_axes">
+        <param argument="swap_axes" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Swap axes?" help="By default, the x axis contains 'var_names' (e.g. genes) and the y axis the 'groupby' categories (if any). By setting 'swap_axes' then x are the 'groupby' categories and y the 'var_names'."/>
     </xml>
-    <token name="@CMD_params_matplotlib_pyplot_scatter@"><![CDATA[
-    #if str($method.matplotlib_pyplot_scatter.vmin) != ''
-    vmin=$method.matplotlib_pyplot_scatter.vmin,
-    #end if
-    #if str($method.matplotlib_pyplot_scatter.vmax) != ''
-    vmax=$method.matplotlib_pyplot_scatter.vmax,
-    #end if
-    #if str($method.matplotlib_pyplot_scatter.alpha) != ''
-    alpha=$method.matplotlib_pyplot_scatter.alpha,
-    #end if
-    lw=$method.matplotlib_pyplot_scatter.linewidths,
-    #if $method.matplotlib_pyplot_scatter.edgecolors
-    ec='$method.matplotlib_pyplot_scatter.edgecolors'
-    #end if
-    ]]></token>
-    <xml name="conditional_stripplot">
-        <conditional name="stripplot">
-            <param argument="stripplot" type="select" label="Add a stripplot on top of the violin plot" help="">
-                <option value="True">Yes</option>
-                <option value="False">No</option>
-            </param>
-            <when value="True">
-                <conditional name="jitter">
-                    <param argument="jitter" type="select" label="Add a jitter to the stripplot" help="">
-                        <option value="True">Yes</option>
-                        <option value="False">No</option>
-                    </param>
-                    <when value="True">
-                        <param argument="size" type="float" min="0" value="1" label="Size of the jitter points" help=""/>
-                    </when>
-                    <when value="False"/>
-                </conditional>
-            </when>
-            <when value="False"/>
-        </conditional>
-    </xml>
-    <token name="@CMD_conditional_stripplot@"><![CDATA[
-    stripplot=$method.violin_plot.stripplot.stripplot,
-#if $method.violin_plot.stripplot.stripplot == "True"
-    jitter=$method.violin_plot.stripplot.jitter.jitter,
-    #if $method.violin_plot.stripplot.jitter.jitter == "True"
-    size=$method.violin_plot.stripplot.jitter.size,
-    #end if
-#end if
-    ]]></token>
-    <xml name="param_scale">
-        <param argument="scale" type="select" label="Method used to scale the width of each violin">
-            <option value="area">area: each violin will have the same area</option>
-            <option value="count">count: the width of the violins will be scaled by the number of observations in that bin</option>
-            <option value="width" selected="true">width: each violin will have the same width</option>
+    <xml name="param_cmap">
+        <param argument="cmap" type="select" optional="true" label="Colors to use for plotting categorical annotation groups">
+            <expand macro="matplotlib_pyplot_colormap"/>
         </param>
     </xml>
-    <token name="@CMD_params_violin_plots@"><![CDATA[
-    @CMD_conditional_stripplot@
+    <xml name="param_sort_order">
+        <param argument="sort_order" type="boolean" truevalue="True" falsevalue="False" checked="true" label="Sort order?" help="For continuous annotations used as color parameter, plot data points with higher values on top of others."/>
+    </xml>
+    <xml name="param_arrows">
+        <param argument="arrows" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Show arrows?" help="It requires to run 'tl.rna_velocity' before."/>
+    </xml>
+    <!-- param macros -->
+
+
+    
+    <!-- command macros -->
+    <xml name="version_command">
+        <version_command><![CDATA[python -c "import scanpy as sc;print('scanpy version: %s' % sc.__version__)"]]></version_command>
+    </xml>
+    <token name="@CMD_PRETTIFY_STDOUT@"><![CDATA[
+| sed -r '1 s|AnnData object with (.+) = (.*)\s*|\1: \2|g' | sed "s|'||g"  | sed -r 's|^\s*(.*):\s(.*)|[\1]\n-    \2|g' | sed 's|, |\n-    |g'
+    ]]>
+    </token>
+    <token name="@CMD_READ_INPUTS@"><![CDATA[
+adata = sc.read_h5ad('anndata.h5ad')
+    ]]>
+    </token>
+    <!-- ln -s doesn't work here because the output is overwritten to the same file -->
+    <token name="@CMD@"><![CDATA[
+cp '$adata' 'anndata.h5ad' &&
+cat '$script_file' > '$hidden_output' &&
+python '$script_file' >> '$hidden_output' &&
+ls . >> '$hidden_output' &&
+touch 'anndata_info.txt' &&
+cat 'anndata_info.txt' @CMD_PRETTIFY_STDOUT@
+    ]]>
+    </token>
+    <token name="@CMD_IMPORTS@"><![CDATA[
+import scanpy as sc
+import pandas as pd
+import numpy as np
+    ]]>
+    </token>
+    <token name="@CMD_ANNDATA_WRITE_OUTPUTS@"><![CDATA[
+adata.write_h5ad('anndata.h5ad', compression='gzip')
+with open('anndata_info.txt','w', encoding='utf-8') as ainfo:
+    print(adata, file=ainfo)
+    ]]>
+    </token>
+    <token name="@CMD_PARAM_PLOT_INPUTS@"><![CDATA[
+    adata,
+    save='.$format',
+    ]]>
+    </token>
+    <token name="@CMD_SHOW_NONE@"><![CDATA[
+        show=None
+        ]]>
+    </token>
+    <token name="@CMD_VAR_NAMES_HEADER_CHECK@"><![CDATA[
+header='infer'
+#if $method.var_names.type == 'customfile' and $method.var_names.header == 'not_included' :
+header=None
+#end if
+    ]]>
+    </token>
+    <token name="@CMD_PARAMS_VIOLIN_PLOTS@"><![CDATA[
+    @CMD_CONDITIONAL_STRIPPLOT@
     multi_panel=$method.violin_plot.multi_panel.multi_panel,
 #if $method.multi_panel.violin_plot.multi_panel == "True" and str($method.violin_plot.multi_panel.width) != '' and str($method.violin_plot.multi_panel.height) != ''
     figsize=($method.violin_plot.multi_panel.width, $method.violin_plot.multi_panel.height)
 #end if
-    scale='$method.violin_plot.scale',
-    ]]></token>
-    <xml name="seaborn_violinplot">
-        <section name="seaborn_violinplot" title="Parameters for seaborn.violinplot">
-            <param argument="bw" type="select" label="Name of a reference rule when computing the kernel bandwidth">
-                <option value="scott">scott</option>
-                <option value="silverman">silverman</option>
-            </param>
-            <param argument="orient" type="select" optional="true" label="Orientation of the plot">
-                <option value="v">vertical</option>
-                <option value="h">horizontal</option>
-            </param>
-            <param argument="linewidth" type="float" value="0" label="Width of the gray lines that frame the plot elements" help=""/>
-            <param argument="color" type="select" optional="true" label="Color for all of the elements" help="">
-                <expand macro="matplotlib_color"/>
-            </param>
-            <param argument="saturation" type="float" value="0.75" min="0" max="1" label="Proportion of the original saturation to draw colors at" help=""/>
-        </section>
-    </xml>
-    <token name="@CMD_params_seaborn_violinplot@"><![CDATA[
-    bw='$method.seaborn_violinplot.bw',
-#if $method.seaborn_violinplot.orient
-    orient='$method.seaborn_violinplot.orient',
-#end if
-    linewidth=$method.seaborn_violinplot.linewidth,
-    #if $method.seaborn_violinplot.color
-    color='$method.seaborn_violinplot.color',
-    #end if
-    saturation=$method.seaborn_violinplot.saturation
-    ]]></token>
-    <xml name="param_color">
-        <param argument="color" type="text" value="" optional="true" label="Keys for annotations of observations/cells or variables/genes" help="One or a list of comma-separated index or key from either '.obs' or '.var'">
-            <expand macro="sanitize_query" />
-        </param>
-    </xml>
-    <token name="@CMD_param_color@"><![CDATA[
-#if $method.color
-    #set $color = ([x.strip() for x in str($method.color).split(',')])
-    color=$color,
-#end if
-    ]]></token>
-    <xml name="param_groups">
-        <param argument="groups" type="text" value="" optional="true" label="Categorical observation annotations to plot" help="Comma-separated">
-            <expand macro="sanitize_query" />
+    density_norm='$method.violin_plot.density_norm',
+    ]]>
+    </token>
+    <!-- command macros -->
+
+
+
+    <!-- param and cmd macros -->
+    <xml name="param_standard_scale">
+        <param argument="standard_scale" type="select" label="Standardize a dimension between 0 and 1" help="Each variable or observation is subtracted by the minimum and divided each by its maximum.">
+            <option value="None" selected="true">No standardization</option>
+            <option value="var">Standardization on variable</option>
+            <option value="obs">Standardization on observation</option>
         </param>
     </xml>
-    <token name="@CMD_params_groups@"><![CDATA[
-#if $method.groups
-    #set $groups=([x.strip() for x in str($method.groups).split(',')])
-    groups=$groups,
-#end if
-    ]]></token>
-    <xml name="pl_components">
-        <repeat name="components" title="Component">
-            <param argument="axis1" type="text" value="1" label="X-Axis" help="">
-                <expand macro="sanitize_query" />
-            </param>
-            <param argument="axis2" type="text" value="2" label="Y-Axis" help="">
-                <expand macro="sanitize_query" />
-            </param>
-        </repeat>
-    </xml>
-    <token name="@CMD_params_pl_components@"><![CDATA[
-#if len($method.plot.components) > 0
-    #set $components=[]
-    #for $i, $s in enumerate($method.plot.components)
-        #silent $components.append(str($s.axis1) + ',' + str($s.axis2))
-    #end for
-    components=$components,
-#end if
-    ]]>
-    </token>
-    <xml name="param_projection">
-        <param argument="projection" type="select" label="Projection of plot" help="">
-            <option value="2d">2d</option>
-            <option value="3d">3d</option>
-        </param>
-    </xml>
-    <xml name="param_legend_loc">
-        <param argument="legend_loc" type="select" label="Location of legend" help="">
-            <option value="none">none</option>
-            <option value="right margin" selected="true">right margin</option>
-            <option value="on data">on data</option>
-            <option value="on data export">on data export</option>
-            <option value="best">best</option>
-            <option value="upper right">upper right</option>
-            <option value="upper left">upper left</option>
-            <option value="lower left">lower left</option>
-            <option value="lower right">lower right</option>
-            <option value="center left">center left</option>
-            <option value="center right">center right</option>
-            <option value="lower center">lower center</option>
-            <option value="upper center">upper center</option>
-            <option value="center">center</option>
-        </param>
-    </xml>
-    <xml name="param_legend_fontsize">
-        <param argument="legend_fontsize" type="integer" optional="true" value="" label="Legend font size" help=""/>
-    </xml>
-    <token name="@CMD_param_legend_fontsize@"><![CDATA[
-    #if str($method.plot.legend_fontsize) != ''
-    legend_fontsize=$method.plot.legend_fontsize,
+    <token name="@CMD_STANDARD_SCALE@"><![CDATA[
+    #if str($method.standard_scale) != 'None':
+    standard_scale='$method.standard_scale',
     #end if
     ]]>
     </token>
-    <xml name="param_legend_fontweight">
-        <param argument="legend_fontweight" type="select" label="Legend font weight" help="">
-            <option value="light">light</option>
-            <option value="normal" selected="true">normal</option>
-            <option value="medium">medium</option>
-            <option value="semibold">semibold</option>
-            <option value="bold">bold</option>
-            <option value="heavy">heavy</option>
-            <option value="black">black</option>
-        </param>
-    </xml>
-    <xml name="param_palette">
-        <param argument="palette" type="select" optional="true" label="Colors to use for plotting categorical annotation groups" help="">
-            <expand macro="matplotlib_pyplot_colormap"/>
+
+    <xml name="param_layer" token_optional="true" token_label="If provided, use adata.layers[layer] for expression values instead of adata.X." token_help="">
+        <param argument="layer" type="text" value="" optional="@OPTIONAL@" label="@LABEL@">
+            <expand macro="sanitize_query"/>
         </param>
     </xml>
-    <xml name="param_color_map">
-        <param argument="color_map" type="select" optional="true" label="Color map to use for continous variables" help="">
-            <expand macro="matplotlib_pyplot_colormap"/>
-        </param>
-    </xml>
-    <xml name="param_frameon">
-        <param argument="frameon" type="boolean" truevalue="True" falsevalue="False" checked="true" label="Draw a frame around the scatter plot?" help=""/>
-    </xml>
-    <xml name="param_right_margin">
-        <param argument="right_margin" type="float" value="1" label="Width of the space right of each plotting panel" help=""/>
-    </xml>
-    <xml name="param_left_margin">
-        <param argument="left_margin" type="float" value="1" label="Width of the space left of each plotting panel" help=""/>
-    </xml>
-    <xml name="param_size">
-        <param argument="size" type="float" optional="true" value="" label="Point size" help=""/>
-    </xml>
-    <token name="@CMD_param_size@"><![CDATA[
-    #if str($method.plot.size) != ''
-    size=$method.plot.size,
+    <token name="@CMD_PARAM_LAYER@"><![CDATA[
+    #if str($method.layer) != '':
+    layer='$method.layer',
     #end if
     ]]>
     </token>
-    <xml name="param_title">
-        <param argument="title" type="text" value="" optional="true" label="Title for panels" help="Titles must be separated by a comma">
-            <expand macro="sanitize_query" />
+
+    <xml name="param_neighbors_key">
+        <param argument="neighbors_key" type="text" value="" label="Key to look for neighbors settings and connectivities" help="If not specified, looks .uns[‘neighbors’] for neighbors settings and .obsp[‘connectivities’] for connectivities (default storage places for pp.neighbors).">
+            <expand macro="sanitize_query"/>
         </param>
     </xml>
-    <token name="@CMD_param_title@"><![CDATA[
-    #if $method.plot.title
-    title='$method.plot.title',
+    <token name="@CMD_PARAM_NEIGHBORS_KEY@"><![CDATA[
+    #if $method.neighbors_key != ''
+    neighbors_key='$method.neighbors_key',
     #end if
     ]]>
     </token>
-    <xml name="param_sort_order">
-        <param argument="sort_order" type="boolean" truevalue="True" falsevalue="False" checked="true" label="Sort order?" help="For continuous annotations used as color parameter, plot data points with higher values on top of others."/>
-    </xml>
-    <xml name="param_sort_order">
-        <param argument="sort_order" type="boolean" truevalue="True" falsevalue="False" checked="true" label="Sort order?" help="For continuous annotations used as color parameter, plot data points with higher values on top of others."/>
-    </xml>
-    <xml name="param_ncols">
-        <param argument="ncols" type="integer" min="0" value="4" label="Number of panels per row" help=""/>
-    </xml>
-    <xml name="param_wspace">
-        <param argument="wspace" type="float" min="0" value="0.1" label="Width of the space between multiple panels" help=""/>
-    </xml>
-    <xml name="param_hspace">
-        <param argument="hspace" type="float" min="0" value="0.25" label="Height of the space between multiple panels" help=""/>
-    </xml>
-    <xml name="pl_edges">
-        <conditional name="edges">
-            <param argument="edges" type="select" label="Show edges?">
-                <option value="True">Yes</option>
-                <option value="False" selected="true">No</option>
+
+    <xml name="pl_var_names">
+        <conditional name="var_names">
+            <param name="type" type="select" label="Variables to plot (columns of the heatmaps)" >
+                <option value="all" selected="true">All variables in 'adata.var_names'</option>
+                <option value="custom">Subset of variables in 'adata.var_names'</option>
+                <option value="customfile">Subset of variables as a tabular file</option>
             </param>
-            <when value="True">
-                <param argument="edges_width" type="float" min="0" value="0.1" label="Width of edges"/>
-                <param argument="edges_color" type="select" optional="true" label="Color of edges">
-                    <expand macro="matplotlib_color"/>
+            <when value="all"/>
+            <when value="custom">
+                <param argument="var_names" type="text" value="" label="List of variables to plot" help="They should be a valid subset of 'adata.var_names', and separated by comma">
+                    <expand macro="sanitize_query"/>
                 </param>
             </when>
-            <when value="False"/>
+            <when value="customfile">
+                <param argument="var_names" type="data" format="tabular" label="List of variables to plot" help="This should be a tsv where row = group (e.g. celltypes) and columns = variables."></param>
+                <param name="header" type="boolean" truevalue="included" falsevalue="not_included" checked="true" label="Header is included in the list of markers?"/>
+            </when>
         </conditional>
     </xml>
-    <token name="@CMD_pl_edges@"><![CDATA[
-#if str($method.edges.edges) == 'True'
-    edges=True,
-    edges_width=$method.edges.edges_width,
-    #if $method.edges.edges_color
-    edges_color='$method.edges.edges_color',
-    #end if
-#else
-    edges=False,
-#end if
-    ]]>
-    </token>
-    <xml name="param_arrows">
-        <param argument="arrows" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Show arrows?" help="It requires to run 'tl.rna_velocity' before."/>
-    </xml>
-    <xml name="param_cmap">
-        <param argument="cmap" type="select" optional="true" label="Colors to use for plotting categorical annotation groups" help="">
-            <expand macro="matplotlib_pyplot_colormap"/>
-        </param>
-    </xml>
-    <xml name="pl_attribute_section">
-        <section name="plot" title="Plot attributes">
-            <expand macro="pl_components"/>
-            <expand macro="param_projection"/>
-            <expand macro="param_legend_loc"/>
-            <expand macro="param_legend_fontsize"/>
-            <expand macro="param_legend_fontweight"/>
-            <expand macro="param_size"/>
-            <expand macro="param_color_map"/>
-            <expand macro="param_palette"/>
-            <expand macro="param_frameon"/>
-            <expand macro="param_ncols"/>
-            <expand macro="param_wspace"/>
-            <expand macro="param_hspace"/>
-            <expand macro="param_title"/>
-        </section>
-    </xml>
-    <token name="@CMD_pl_attribute_section@"><![CDATA[
-    projection='$method.plot.projection',
-    legend_loc='$method.plot.legend_loc',
-    @CMD_param_legend_fontsize@
-    legend_fontweight='$method.plot.legend_fontweight',
-    @CMD_param_size@
-    #if $method.plot.color_map
-    color_map='$method.plot.color_map',
-    #end if
-    #if $method.plot.palette
-    palette='$method.plot.palette',
-    #end if
-    frameon=$method.plot.frameon,
-    ncols=$method.plot.ncols,
-    wspace=$method.plot.wspace,
-    hspace=$method.plot.hspace,
-    @CMD_param_title@
-    ]]>
-    </token>
-    <xml name="options_layout">
-        <option value="fa">fa: ForceAtlas2</option>
-        <option value="fr">fr: Fruchterman-Reingold</option>
-        <option value="grid_fr">grid_fr: Grid Fruchterman Reingold, faster than "fr"</option>
-        <option value="kk">kk: Kamadi Kawai’, slower than "fr"</option>
-        <option value="drl">drl: Distributed Recursive Layout, pretty fast</option>
-        <option value="rt">rt: Reingold Tilford tree layout</option>
-        <option value="eq_tree">eq_tree: Equally spaced tree</option>
-    </xml>
-    <xml name="param_layout">
-        <param argument="layout" type="select" label="Plotting layout" optional="false" help="">
-            <expand macro="options_layout"/>
-        </param>
-    </xml>
-    <xml name="param_root">
-        <param argument="root" type="text" value="" label="Comma-separated roots" help="If choosing a tree layout, this is the index of the root node or a list of root node indices. If this is a non-empty vector then the supplied node IDs are used as the roots of the trees (or a single tree if the graph is connected). If this is 'None' or an empty list, the root vertices are automatically calculated based on topological sorting.">
-            <expand macro="sanitize_query" />
+    <xml name="param_groupby">
+        <param argument="groupby" type="text" value="" optional="true" label="The key of the observation grouping to consider" help="If it is given, the plot is ordered by the respective group. It is expected that to be a categorical. If it is not a categorical observation, it would be subdivided into 'num_categories'.">
+            <expand macro="sanitize_query"/>
         </param>
     </xml>
-    <xml name="param_random_state">
-        <param argument="random_state" type="integer" value="0" label="Random state" help="For layouts with random initialization like 'fr', change this to use different intial states for the optimization. If 'None', the initial state is not reproducible."/>
+    <xml name="param_num_categories">
+        <param argument="num_categories" type="integer" min="0" value="7" label="Number of categories" help="It is only used if groupby observation is not categorical. This value determines the number of groups into which the groupby observation should be subdivided."/>
     </xml>
-    <xml name="inputs_paga">
-        <param argument="threshold" type="float" min="0" value="0.01" label="Threshold to draw edges" help="Do not draw edges for weights below this threshold. Set to 0 if you want all edges. Discarding low-connectivity edges helps in getting a much clearer picture of the graph."/>
-        <expand macro="param_groups"/>
-        <param argument="color" type="text" value="" label="The node colors" help="Gene name or obs. annotation, and also plots the degree of the abstracted graph when passing 'degree_dashed', 'degree_solid'.">
-            <expand macro="sanitize_query" />
-        </param>
-        <param argument="pos" type="data" format="tabular,csv,tsv" optional="true" label="Two-column tabular file storing the x and y coordinates for drawing" help=""/>
-        <param argument="labels" type="text" value="" label="Comma-separated node labels" help="If none is provided, this defaults to the group labels stored in the categorical for which 'tl.paga' has been computed.">
-            <expand macro="sanitize_query" />
-        </param>
-        <expand macro="param_layout"/>
-        <param argument="init_pos" type="data" format="tabular,csv,tsv" optional="true" label="Two-column tabular file storing the x and y coordinates for initializing the layout" help=""/>
-        <expand macro="param_random_state"/>
-        <expand macro="param_root"/>
-        <param argument="transitions" type="text" value="" label="Key corresponding to the matrix storing the arrows" help="Key for '.uns['paga']', e.g. 'transistions_confidence'">
-            <expand macro="sanitize_query" />
-        </param>
-        <param argument="solid_edges" type="text" value="connectivities" label="Key corresponding to the matrix storing the edges to be drawn solid black" help="Key for uns/paga">
-            <expand macro="sanitize_query" />
-        </param>
-        <param argument="dashed_edges" type="text" value="" optional="true" label="Key corresponding to the matrix storing the edges to be drawn dashed grey" help="Key for uns/paga. If not set, no dashed edges are drawn.">
-            <expand macro="sanitize_query" />
-        </param>
-        <param argument="single_component" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Restrict to largest connected component?" help=""/>
-        <param argument="fontsize" type="integer" min="0" value="1" label="Font size for node labels" help=""/>
-        <param argument="node_size_scale" type="float" min="0" value="1.0" label="Size of the nodes" help=""/>
-        <param argument="node_size_power" type="float" min="0" value="0.5" label="Power with which groups sizes influence the radius of the nodes" help=""/>
-        <param argument="edge_width_scale" type="float" min="0" value="5" label="Scale for edge width" help=""/>
-        <param argument="min_edge_width" type="float" min="0" value="" optional="true" label="Min width of solid edges" help=""/>
-        <param argument="max_edge_width" type="float" min="0" value="" optional="true" label="Max width of solid and dashed edges" help=""/>
-        <param argument="arrowsize" type="integer" min="0" value="30" label="Arrow size" help="For directed graphs, choose the size of the arrow head head's length and width."/>
-        <param argument="normalize_to_color" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Normalize categorical plots to color or the underlying grouping?" help=""/>
-        <expand macro="param_cmap"/>
-        <expand macro="param_title"/>
-        <expand macro="param_frameon"/>
+
+    <xml name="params_inputs">
+        <expand macro="pl_var_names"/>
+        <expand macro="param_groupby"/>
+        <expand macro="param_num_categories"/>
     </xml>
-    <token name="@CMD_params_pl_paga@"><![CDATA[
-    threshold=$method.threshold,
-#if $method.groups
-    #set $groups=([x.strip() for x in str($method.groups).split(',')])
-    groups=$groups,
-#end if
-#if $method.color
-    #set $color=([x.strip() for x in str($method.color).split(',')])
-    color=$color,
-#end if
-#if $method.pos
-    pos=np.fromfile($method.pos, dtype=dt),
-#end if
-#if $method.labels
-    #set $labels=([x.strip() for x in str($method.labels).split(',')])
-    labels=$labels,
-#end if
-    layout='$method.layout',
-#if $method.init_pos
-    init_pos=np.fromfile($method.init_pos, dtype=dt),
-#end if
-    random_state=$method.random_state,
-#if $method.root
-    #set $root=([int(x.strip()) for x in str($method.root).split(',')])
-    root=$root,
-#end if
-#if $method.transitions
-    transitions='$method.transitions',
-#end if
-    solid_edges='$method.solid_edges',
-#if $method.dashed_edges
-    dashed_edges='$method.dashed_edges',
-#end if
-    single_component=$method.single_component,
-    fontsize=$method.fontsize,
-    node_size_scale=$method.node_size_scale,
-    node_size_power=$method.node_size_power,
-    edge_width_scale=$method.edge_width_scale,
-#if str($method.min_edge_width) != ''
-    min_edge_width=$method.min_edge_width,
-#end if
-#if str($method.max_edge_width) != ''
-    max_edge_width=$method.max_edge_width,
-#end if
-    arrowsize=$method.arrowsize,
-    normalize_to_color=$method.normalize_to_color,
-    #if $method.cmap
-    cmap='$method.cmap',
+    <token name="@CMD_PARAMS_INPUTS@"><![CDATA[
+    #if str($method.var_names.type) == 'custom':
+    #set $var_names = ([x.strip() for x in str($method.var_names.var_names).split(',')])
+    var_names=$var_names,
+    #else if str($method.var_names.type) == 'customfile':
+    var_names={key: [v for v in list(value.values()) if pd.notna(v)] for key, value in pd.read_csv('$var_names', sep='\t', index_col=0, header=header).to_dict(orient='index').items()},
+    #else
+    var_names=adata.var_names,
+    #end if
+    #if str($method.groupby) != '':
+    groupby='$method.groupby',
     #end if
-#if $method.title
-    title='$method.title',
-#end if
-    frameon=$method.frameon,
+    num_categories=$method.num_categories,
+    ]]>
+    </token>
+
+    <xml name="pl_figsize">
+        <conditional name="figsize">
+            <param name="custom" type="select" label="Custom figure size" >
+                <option value="no" selected="true">No: the figure width is set based on the number of variable names and the height is set to 10.</option>
+                <option value="yes">Yes</option>
+            </param>
+            <when value="yes">
+                <param argument="width" type="integer" min="0" value="10" label="Figure width"/>
+                <param argument="height" type="integer" min="0" value="10" label="Figure height"/>
+            </when>
+            <when value="no"/>
+        </conditional>
+    </xml>
+    <token name="@CMD_PARAMS_FIGSIZE@"><![CDATA[
+    #if $method.figsize.custom == 'yes':
+        figsize=($method.figsize.width, $method.figsize.height),
+    #end if
     ]]>
     </token>
-    <xml name="param_swap_axes">
-        <param argument="swap_axes" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Swap axes?" help="By default, the x axis contains 'var_names' (e.g. genes) and the y axis the 'groupby' categories (if any). By setting 'swap_axes' then x are the 'groupby' categories and y the 'var_names'."/>
+
+    <xml name="param_log" token_checked="false">
+        <param argument="log" type="boolean" truevalue="True" falsevalue="False" checked="@CHECKED@" label="Use the log of the values?"/>
+    </xml>
+    <xml name="param_use_raw" token_falsevalue="False">
+        <param argument="use_raw" type="boolean" truevalue="True" falsevalue="@FALSEVALUE@" checked="false" label="Use 'raw' attribute of input if present"/>
+    </xml>
+    <xml name="param_dendrogram">
+        <param argument="dendrogram" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Compute and plot a dendrogram?" help="groupby categories are reordered accoring to the dendrogram order. If groups of var_names are set and those groups correspond to the groupby categories, those groups are also reordered. The ‘person’ method is used to compute the pairwise correlation between categories using all var_names in raw if use_raw is None, otherwise all adata.var_names are used. The linkage method used is complete."/>
     </xml>
-    <xml name="gene_symbols">
-        <param argument="gene_symbols" type="text" value="" optional="true" label="Key for field in '.var' that stores gene symbols">
-            <expand macro="sanitize_query" />
-        </param>
+    <xml name="pl_var_group_positions">
+        <repeat name="var_group_positions" title="Group of variables to highlight" help="This will draw a 'bracket' on top of the plot between the given start and end positions. If a label is given, it will be added on top of the bracket. ">
+            <param name="start" type="integer" min="0" value="" label="Start"/>
+            <param name="end" type="integer" min="0" value="" label="End"/>
+            <param argument="label" type="text" value="" label="Label">
+                <expand macro="sanitize_query"/>
+            </param>
+        </repeat>
     </xml>
-    <xml name="param_n_genes">
-        <param argument="n_genes" type="integer" min="0" value="10" label="Number of genes to show" help="It is only used if you are not specifying certain variable names"/>
+    <xml name="param_var_group_rotation">
+        <param argument="var_group_rotation" type="float" value="" optional="true" label="Label rotation degrees" help="By default, labels larger than 4 characters are rotated 90 degrees"/>
     </xml>
-    <xml name="pl_dotplot">
-        <param argument="color_map" type="select" optional="true" label="Color palette">
-            <expand macro="matplotlib_pyplot_colormap"/>
-        </param>
-        <param argument="dot_max" type="float" value="" min="0" max="1" optional="true" label="Maximum dot size" help="If none, the maximum dot size is set to the maximum fraction value found (e.g. 0.6). If given, the value should be a number between 0 and 1. All fractions larger than dot_max are clipped to this value."/>
-        <param argument="dot_min" type="float" value="" min="0" max="1" optional="true" label="Minimum dot size" help="If none, the minimum dot size is set to 0. If given, the value should be a number between 0 and 1. All fractions smaller than dot_min are clipped to this value."/>
-        <expand macro="section_matplotlib_pyplot_scatter"/>
+    <xml name="params_plots">
+        <expand macro="param_log"/>
+        <expand macro="param_use_raw" falsevalue="None"/>
+        <expand macro="param_dendrogram"/>
+        <expand macro="pl_var_group_positions"/>
+        <expand macro="param_var_group_rotation"/>
+        <expand macro="pl_figsize"/>
+        <expand macro="param_layer" optional="true" label="Name of the AnnData object layer that wants to be plotted" help="By default 'adata.raw.X' is plotted. If 'use_raw=False' is set, then 'adata.X' is plotted. If layer is set to a valid layer name, then the layer is plotted. layer takes precedence over 'use_raw'."/>
     </xml>
-    <token name="@CMD_pl_dotplot@"><![CDATA[
-    #if $method.color_map
-    color_map='$method.color_map',
+    <token name="@CMD_PARAMS_PLOTS@"><![CDATA[
+    log=$method.log,
+    use_raw=$method.use_raw,
+    dendrogram=$method.dendrogram,
+    #if len($method.var_group_positions) > 0:
+        #set $var_group_positions=[]
+        #set $var_group_labels=[]
+        #for $i, $s in enumerate($method.var_group_positions)
+            #silent $var_group_positions.append((int($s.start), int($s.end)))
+            #silent $var_group_labels.append(str($s.label))
+        #end for
+    var_group_positions=$var_group_positions,
+    var_group_labels=$var_group_labels,
     #end if
-    #if str($method.dot_max) != ''
-    dot_max=$method.dot_max,
+    #if str($method.var_group_rotation) != '':
+        var_group_rotation=$method.var_group_rotation,
     #end if
-    #if str($method.dot_min) != ''
-    dot_min=$method.dot_min,
-    #end if
-    @CMD_params_matplotlib_pyplot_scatter@
+    @CMD_PARAMS_FIGSIZE@
+    @CMD_PARAM_LAYER@
     ]]>
     </token>
-    <xml name="param_key">
-        <param argument="key" type="text" value="" label="Key used to store the ranking results in 'uns'">
-            <expand macro="sanitize_query" />
-        </param>
+
+    <xml name="param_alpha">
+        <param argument="alpha" type="float" value="" min="0" max="1" optional="true" label="Alpha blending value" help="Between 0 (transparent) and 1 (opaque)"/>
+    </xml>
+    <xml name="param_vmin" token_label="Minimum value to normalize luminance data" token_help="If not set, it is inferred from the data and other keyword arguments">
+        <param argument="vmin" type="float" value="" optional="true" label="@LABEL@" help="@HELP@"/>
+    </xml>
+    <xml name="param_vmax" token_label="Maximum value to normalize luminance data" token_help="If not set, it is inferred from the data and other keyword arguments">
+        <param argument="vmax" type="float" value="" optional="true" label="@LABEL@" help="@HELP@"/>
+    </xml>
+    <xml name="param_vcenter">
+        <param argument="vcenter" type="float" value="" optional="true" label="The value representing the center of the color scale" help="Useful for diverging colormaps."/>
     </xml>
-    <xml name="pl_heatmap">
+    <xml name="section_matplotlib_pyplot_scatter">
+        <section name="matplotlib_pyplot_scatter" title="Parameters for matplotlib.pyplot.scatter">
+            <expand macro="param_alpha"/>
+            <expand macro="param_vmin"/>
+            <expand macro="param_vmax"/>
+            <param argument="linewidths" type="float" value="0" label="Linewidth of the marker edges"/>
+            <expand macro="param_matplotlib_pyplot_edgecolors"/>
+        </section>
+    </xml>
+    <token name="@CMD_SECTION_MATPLOTLIB_PYPLOT_SCATTER@"><![CDATA[
+    #if str($method.matplotlib_pyplot_scatter.vmin) != '':
+    vmin=$method.matplotlib_pyplot_scatter.vmin,
+    #end if
+    #if str($method.matplotlib_pyplot_scatter.vmax) != '':
+    vmax=$method.matplotlib_pyplot_scatter.vmax,
+    #end if
+    #if str($method.matplotlib_pyplot_scatter.alpha) != '':
+    alpha=$method.matplotlib_pyplot_scatter.alpha,
+    #end if
+    linewidth=$method.matplotlib_pyplot_scatter.linewidths,
+    #if $method.matplotlib_pyplot_scatter.edgecolors:
+    edgecolor='$method.matplotlib_pyplot_scatter.edgecolors',
+    #end if
+    ]]>
+    </token>
+
+    <xml name="params_pl_heatmap">
         <expand macro="param_swap_axes"/>
         <param argument="show_gene_labels" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Show gene labels?" help="By default gene labels are shown when there are 50 or less genes. Otherwise the labels are removed."/>
+        <expand macro="param_standard_scale"/>
         <section name="matplotlib_pyplot_imshow" title="Parameters for matplotlib.pyplot.imshow">
             <expand macro="param_cmap"/>
-            <param name="interpolation" type="select" label="Interpolation method" help="">
-                <option value="None">none</option>
+            <param name="interpolation" type="select" label="Interpolation method">
+                <option value="None" selected="true">none</option>
                 <option value="nearest">nearest</option>
                 <option value="bilinear">bilinear</option>
                 <option value="bicubic">bicubic</option>
@@ -1194,106 +837,627 @@
             <expand macro="param_vmin"/>
             <expand macro="param_vmax"/>
             <param name="origin" type="select" label="Place the [0,0] index of the array in the upper left or lower left corner of the axes" help=" The convention 'upper' is typically used for matrices and images.">
-                <option value="upper">Upper</option>
+                <option value="upper" selected="true">Upper</option>
                 <option value="lower">Lower</option>
             </param>
         </section>
     </xml>
-    <token name="@CMD_pl_heatmap@"><![CDATA[
+    <token name="@CMD_PARAMS_PL_HEATMAP@"><![CDATA[
     swap_axes=$method.swap_axes,
     show_gene_labels=$method.show_gene_labels,
-    #if $method.matplotlib_pyplot_imshow.cmap
+    @CMD_STANDARD_SCALE@
+    #if $method.matplotlib_pyplot_imshow.cmap:
     cmap='$method.matplotlib_pyplot_imshow.cmap',
     #end if
-    #if str($method.matplotlib_pyplot_imshow.interpolation) != 'None'
+    #if str($method.matplotlib_pyplot_imshow.interpolation) != 'None':
     interpolation='$method.matplotlib_pyplot_imshow.interpolation',
     #end if
-    #if str($method.matplotlib_pyplot_imshow.alpha) != ''
+    #if str($method.matplotlib_pyplot_imshow.alpha) != '':
     alpha=$method.matplotlib_pyplot_imshow.alpha,
     #end if
-    #if str($method.matplotlib_pyplot_imshow.vmin) != ''
+    #if str($method.matplotlib_pyplot_imshow.vmin) != '':
     vmin=$method.matplotlib_pyplot_imshow.vmin,
     #end if
-    #if str($method.matplotlib_pyplot_imshow.vmax) != ''
+    #if str($method.matplotlib_pyplot_imshow.vmax) != '':
     vmax=$method.matplotlib_pyplot_imshow.vmax,
     #end if
-    origin='$method.matplotlib_pyplot_imshow.origin'
+    origin='$method.matplotlib_pyplot_imshow.origin',
     ]]>
     </token>
-    <xml name="pl_rank_genes_groups_ext">
-        <expand macro="param_groups"/>
-        <expand macro="param_n_genes"/>
-        <expand macro="param_key"/>
-    </xml>
-    <token name="@CMD_pl_rank_genes_groups_ext@"><![CDATA[
-    @CMD_params_groups@
-    n_genes=$method.n_genes,
-    #if $method.key
-    key='$method.key',
-    #end if
-    ]]>
-    </token>
-    <xml name="pl_matrixplot">
+
+    <xml name="params_pl_matrixplot">
         <expand macro="param_swap_axes"/>
         <section name="matplotlib_pyplot_pcolor" title="Parameters for matplotlib.pyplot.pcolor">
             <param argument="cmap" type="select" optional="true" label="Color palette">
                 <expand macro="seaborn_color_palette_options"/>
             </param>
-            <param argument="vmin" type="float" value="" optional="true" label="Minimum value to anchor the colormap" help=""/>
-            <param argument="vmax" type="float" value="" optional="true" label="Maximum value to anchor the colormap" help=""/>
             <expand macro="param_matplotlib_pyplot_edgecolors"/>
             <expand macro="param_alpha"/>
-            <param argument="snap" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Snap the mesh to pixel boundaries?" help=""/>
+            <param argument="snap" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Snap the mesh to pixel boundaries?"/>
         </section>
+        <expand macro="param_standard_scale"/>
+        <expand macro="param_vmin" label="The value representing the lower limit of the color scale" help="Values smaller than vmin are plotted with the same color as vmin."/>
+        <expand macro="param_vmax" label="The value representing the upper limit of the color scale" help="Values larger than vmax are plotted with the same color as vmax."/>
+        <expand macro="param_vcenter"/>
     </xml>
-    <token name="@CMD_pl_matrixplot@"><![CDATA[
+    <token name="@CMD_PARAMS_PL_MATRIXPLOT@"><![CDATA[
     swap_axes=$method.swap_axes,
-    #if $method.matplotlib_pyplot_pcolor.cmap
+    #if $method.matplotlib_pyplot_pcolor.cmap:
     cmap='$method.matplotlib_pyplot_pcolor.cmap',
     #end if
-    #if str($method.matplotlib_pyplot_pcolor.vmin) != ''
-    vmin=$method.matplotlib_pyplot_pcolor.vmin,
+    #if $method.matplotlib_pyplot_pcolor.edgecolors:
+    edgecolor='$method.matplotlib_pyplot_pcolor.edgecolors',
     #end if
-    #if str($method.matplotlib_pyplot_pcolor.vmax) != ''
-    vmax=$method.matplotlib_pyplot_pcolor.vmax,
-    #end if
-    #if $method.matplotlib_pyplot_pcolor.edgecolors
-    ec='$method.matplotlib_pyplot_pcolor.edgecolors',
-    #end if
-    #if str($method.matplotlib_pyplot_pcolor.alpha) != ''
+    #if str($method.matplotlib_pyplot_pcolor.alpha) != '':
     alpha=$method.matplotlib_pyplot_pcolor.alpha,
     #end if
-    snap=$method.matplotlib_pyplot_pcolor.snap
+    snap=$method.matplotlib_pyplot_pcolor.snap,
+    #if str($method.vmin) != '':
+    vmin=$method.vmin,
+    #end if
+    #if str($method.vmax) != '':
+    vmax=$method.vmax,
+    #end if
+    #if str($method.vcenter) != '':
+    vcenter=$method.vcenter,
+    #end if
+    @CMD_STANDARD_SCALE@
+    ]]>
+    </token>
+
+    <xml name="conditional_stripplot">
+        <conditional name="stripplot">
+            <param argument="stripplot" type="select" label="Add a stripplot on top of the violin plot">
+                <option value="True" selected="true">Yes</option>
+                <option value="False">No</option>
+            </param>
+            <when value="True">
+                <conditional name="jitter">
+                    <param argument="jitter" type="select" label="Add a jitter to the stripplot">
+                        <option value="True" selected="true">Yes</option>
+                        <option value="False">No</option>
+                    </param>
+                    <when value="True">
+                        <param argument="size" type="float" min="0" value="1" label="Size of the jitter points"/>
+                    </when>
+                    <when value="False"/>
+                </conditional>
+            </when>
+            <when value="False"/>
+        </conditional>
+    </xml>
+    <token name="@CMD_CONDITIONAL_STRIPPLOT@"><![CDATA[
+    stripplot=$method.violin_plot.stripplot.stripplot,
+#if str($method.violin_plot.stripplot.stripplot) == 'True':
+    jitter=$method.violin_plot.stripplot.jitter.jitter,
+    #if str($method.violin_plot.stripplot.jitter.jitter) == 'True':
+    size=$method.violin_plot.stripplot.jitter.size,
+    #end if
+#end if
+    ]]>
+    </token>
+    
+    <xml name="params_seaborn_violinplot">
+        <section name="seaborn_violinplot" title="Parameters for seaborn.violinplot">
+            <param argument="bw_method" type="select" label="Name of a reference rule when computing the kernel bandwidth">
+                <option value="scott" selected="true">scott</option>
+                <option value="silverman">silverman</option>
+            </param>
+            <param argument="bw_adjust" type="float" value="1" label="Factor that scales the bandwidth to use more or less smoothing."/>
+            <param argument="orient" type="select" optional="true" label="Orientation of the plot">
+                <option value="v">vertical</option>
+                <option value="h">horizontal</option>
+            </param>
+            <param argument="linewidth" type="float" value="" optional="true" label="Width of the gray lines that frame the plot elements"/>
+            <param argument="color" type="select" optional="true" label="Color for all of the elements">
+                <expand macro="matplotlib_color"/>
+            </param>
+            <param argument="saturation" type="float" value="0.75" min="0" max="1" label="Proportion of the original saturation to draw colors at"/>
+        </section>
+    </xml>
+    <token name="@CMD_PARAMS_SEABORN_VIOLINPLOT@"><![CDATA[
+    bw_method='$method.seaborn_violinplot.bw_method',
+    bw_adjust=$method.seaborn_violinplot.bw_adjust,
+    #if $method.seaborn_violinplot.orient:
+    orient='$method.seaborn_violinplot.orient',
+    #end if
+    #if str($method.seaborn_violinplot.linewidth) != '':
+    linewidth=$method.seaborn_violinplot.linewidth,
+    #end if
+    #if $method.seaborn_violinplot.color:
+    color='$method.seaborn_violinplot.color',
+    #end if
+    saturation=$method.seaborn_violinplot.saturation,
+    ]]></token>
+   
+    <xml name="param_color">
+        <param argument="color" type="text" value="" optional="true" label="Keys for annotations of observations/cells or variables/genes" help="One or a list of comma-separated index or key from either '.obs' or '.var'">
+            <expand macro="sanitize_query"/>
+        </param>
+    </xml>
+    <token name="@CMD_PARAM_COLOR@"><![CDATA[
+#if str($method.color) != '':
+    #set $color = ([x.strip() for x in str($method.color).split(',')])
+    color=$color,
+#end if
+    ]]>
+    </token>
+
+    <xml name="param_groups">
+        <param argument="groups" type="text" value="" optional="true" label="Categorical observation annotations to plot" help="Comma-separated">
+            <expand macro="sanitize_query"/>
+        </param>
+    </xml>
+    <token name="@CMD_PARAM_GROUPS@"><![CDATA[
+#if str($method.groups) != '':
+    #set $groups=([x.strip() for x in str($method.groups).split(',')])
+    groups=$groups,
+#end if
+    ]]>
+    </token>
+
+
+    <xml name="param_pl_components">
+        <repeat name="components" title="Component">
+            <param argument="axis1" type="text" value="1" label="X-Axis">
+                <expand macro="sanitize_query"/>
+            </param>
+            <param argument="axis2" type="text" value="2" label="Y-Axis">
+                <expand macro="sanitize_query"/>
+            </param>
+        </repeat>
+    </xml>
+    <token name="@CMD_PARAM_PL_COMPONENTS@"><![CDATA[
+#if len($method.plot.components) > 0:
+    #set $components=[]
+    #for $i, $s in enumerate($method.plot.components)
+        #silent $components.append(str($s.axis1) + ',' + str($s.axis2))
+    #end for
+    components=$components,
+#end if
+    ]]>
+    </token>
+    
+    <xml name="param_legend_fontsize">
+        <param argument="legend_fontsize" type="integer" optional="true" value="" label="Legend font size"/>
+    </xml>
+    <token name="@CMD_PARAM_LEGEND_FONTSIZE@"><![CDATA[
+    #if str($method.plot.legend_fontsize) != '':
+    legend_fontsize=$method.plot.legend_fontsize,
+    #end if
+    ]]>
+    </token>
+
+    <xml name="param_size">
+        <param argument="size" type="float" optional="true" value="" label="Point size"/>
+    </xml>
+    <token name="@CMD_PARAM_SIZE@"><![CDATA[
+    #if str($method.plot.size) != '':
+    size=$method.plot.size,
+    #end if
+    ]]>
+    </token>
+
+    <xml name="param_title">
+        <param argument="title" type="text" value="" optional="true" label="Title for panels" help="Titles must be separated by a comma">
+            <expand macro="sanitize_query"/>
+        </param>
+    </xml>
+    <token name="@CMD_PARAM_TITLE@"><![CDATA[
+    #if str($method.plot.title) != '':
+    title='$method.plot.title',
+    #end if
     ]]>
     </token>
-    <xml name="pl_stacked_violin">
+
+    <xml name="param_projection">
+        <param argument="projection" type="select" label="Projection of plot">
+            <option value="2d" selected="true">2d</option>
+            <option value="3d">3d</option>
+        </param>
+    </xml>
+    <xml name="param_legend_loc">
+        <param argument="legend_loc" type="select" label="Location of legend">
+            <yield />
+            <option value="none">none</option>
+            <option value="on data export">on data export</option>
+            <option value="best">best</option>
+            <option value="upper right">upper right</option>
+            <option value="upper left">upper left</option>
+            <option value="lower left">lower left</option>
+            <option value="lower right">lower right</option>
+            <option value="right">right</option>
+            <option value="center left">center left</option>
+            <option value="center right">center right</option>
+            <option value="lower center">lower center</option>
+            <option value="upper center">upper center</option>
+            <option value="center">center</option>
+        </param>
+    </xml>
+    <xml name="param_legend_fontweight">
+        <param argument="legend_fontweight" type="select" label="Legend font weight">
+            <option value="bold" selected="true">bold</option>
+            <option value="normal">normal</option>
+            <option value="light">light</option>
+            <option value="medium">medium</option>
+            <option value="semibold">semibold</option>
+            <option value="heavy">heavy</option>
+            <option value="black">black</option>
+        </param>
+    </xml>
+    <xml name="param_color_map">
+        <param argument="color_map" type="select" optional="true" label="Color map to use for continous variables">
+            <expand macro="matplotlib_pyplot_colormap"/>
+        </param>
+    </xml>
+    <xml name="param_palette">
+        <param argument="palette" type="select" optional="true" label="Colors to use for plotting categorical annotation groups">
+            <expand macro="matplotlib_pyplot_colormap"/>
+        </param>
+    </xml>
+    <xml name="param_frameon">
+        <param argument="frameon" type="boolean" truevalue="True" falsevalue="False" checked="true" label="Draw a frame around the scatter plot?"/>
+    </xml>
+    <xml name="param_ncols">
+        <param argument="ncols" type="integer" min="0" value="4" label="Number of panels per row"/>
+    </xml>
+    <xml name="param_wspace">
+        <param argument="wspace" type="float" min="0" value="0.1" label="Width of the space between multiple panels"/>
+    </xml>
+    <xml name="param_hspace">
+        <param argument="hspace" type="float" min="0" value="0.25" label="Height of the space between multiple panels"/>
+    </xml>
+
+    <xml name="params_pl_attribute_section">
+        <section name="plot" title="Plot attributes">
+            <expand macro="param_pl_components"/>
+            <expand macro="param_projection"/>
+            <expand macro="param_legend_loc">
+                <option value="right margin">right margin</option>
+                <option value="on data">on data</option>
+            </expand>
+            <expand macro="param_legend_fontsize"/>
+            <expand macro="param_legend_fontweight"/>
+            <expand macro="param_size"/>
+            <expand macro="param_color_map"/>
+            <expand macro="param_palette"/>
+            <expand macro="param_frameon"/>
+            <expand macro="param_ncols"/>
+            <expand macro="param_wspace"/>
+            <expand macro="param_hspace"/>
+            <expand macro="param_title"/>
+        </section>
+    </xml>
+    <token name="@CMD_PARAMS_PL_ATTRIBUTE_SECTION@"><![CDATA[
+    @CMD_PARAM_PL_COMPONENTS@
+    projection='$method.plot.projection',
+    #if str($method.plot.legend_loc) != '':
+    legend_loc='$method.plot.legend_loc',
+    #end if
+    @CMD_PARAM_LEGEND_FONTSIZE@
+    legend_fontweight='$method.plot.legend_fontweight',
+    @CMD_PARAM_SIZE@
+    #if $method.plot.color_map:
+    color_map='$method.plot.color_map',
+    #end if
+    #if $method.plot.palette:
+    palette='$method.plot.palette',
+    #end if
+    frameon=$method.plot.frameon,
+    ncols=$method.plot.ncols,
+    wspace=$method.plot.wspace,
+    hspace=$method.plot.hspace,
+    @CMD_PARAM_TITLE@
+    ]]>
+    </token>
+
+    <xml name="pl_edges">
+        <conditional name="edges">
+            <param argument="edges" type="select" label="Show edges?">
+            	<option value="False" selected="true">No</option>
+                <option value="True">Yes</option>
+            </param>
+            <when value="True">
+                <param argument="edges_width" type="float" min="0" value="0.1" label="Width of edges"/>
+                <param argument="edges_color" type="select" optional="true" label="Color of edges">
+                    <expand macro="matplotlib_color"/>
+                </param>
+            </when>
+            <when value="False"/>
+        </conditional>
+    </xml>
+    <token name="@CMD_PL_EDGES@"><![CDATA[
+#if str($method.edges.edges) == 'True':
+    edges=True,
+    edges_width=$method.edges.edges_width,
+    #if $method.edges.edges_color:
+    edges_color='$method.edges.edges_color',
+    #end if
+#else
+    edges=False,
+#end if
+    ]]>
+    </token>
+
+
+    <xml name="options_layout">
+    	<option value="fa" selected="true">fa: ForceAtlas2</option>
+        <option value="drl">drl: Distributed Recursive Layout, pretty fast</option>
+        <option value="fr">fr: Fruchterman-Reingold</option>
+        <option value="grid_fr">grid_fr: Grid Fruchterman Reingold, faster than "fr"</option>
+        <option value="kk">kk: Kamadi Kawai’, slower than "fr"</option>
+        <option value="lgl">Large Graph, very fast</option>
+        <option value="rt">rt: Reingold Tilford tree layout</option>
+        <option value="rt_circular">rt_circular: Reingold Tilford tree circular</option>
+    </xml>
+    <xml name="param_layout">
+        <param argument="layout" type="select" label="Plotting layout" optional="false">
+            <expand macro="options_layout"/>
+        </param>
+    </xml>
+    <xml name="params_pl_paga">
+        <param argument="threshold" type="float" min="0" value="" optional="true" label="Threshold to draw edges" help="Do not draw edges for weights below this threshold. Set to 0 if you want all edges. Discarding low-connectivity edges helps in getting a much clearer picture of the graph."/>
+        <expand macro="param_groups"/>
+        <param argument="color" type="text" value="" label="The node colors" help="Gene name or obs. annotation, and also plots the degree of the abstracted graph when passing 'degree_dashed', 'degree_solid'.">
+            <expand macro="sanitize_query"/>
+        </param>
+        <param argument="pos" type="data" format="tabular,csv,tsv" optional="true" label="Two-column tabular file storing the x and y coordinates for drawing"/>
+        <param argument="labels" type="text" value="" label="Comma-separated node labels" help="If none is provided, this defaults to the group labels stored in the categorical for which 'tl.paga' has been computed.">
+            <expand macro="sanitize_query"/>
+        </param>
+        <expand macro="param_layout"/>
+        <param argument="init_pos" type="data" format="tabular,csv,tsv" optional="true" label="Two-column tabular file storing the x and y coordinates for initializing the layout"/>
+        <param argument="random_state" type="integer" value="0" label="For layouts with random initialization like 'fr', change this to use different intial states for the optimization. If 'None', the initial state is not reproducible."/>
+        <param argument="root" type="text" value="0" label="Comma-separated roots" help="If choosing a tree layout, this is the index of the root node or a list of root node indices. If this is a non-empty vector then the supplied node IDs are used as the roots of the trees (or a single tree if the graph is connected). If this is 'None' or an empty list, the root vertices are automatically calculated based on topological sorting.">
+            <expand macro="sanitize_query"/>
+        </param>
+        <param argument="transitions" type="text" value="" label="Key corresponding to the matrix storing the arrows" help="Key for '.uns['paga']', e.g. 'transistions_confidence'">
+            <expand macro="sanitize_query"/>
+        </param>
+        <param argument="solid_edges" type="text" value="connectivities" label="Key corresponding to the matrix storing the edges to be drawn solid black" help="Key for uns/paga">
+            <expand macro="sanitize_query"/>
+        </param>
+        <param argument="dashed_edges" type="text" value="" optional="true" label="Key corresponding to the matrix storing the edges to be drawn dashed grey" help="Key for uns/paga. If not set, no dashed edges are drawn.">
+            <expand macro="sanitize_query"/>
+        </param>
+        <param argument="single_component" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Restrict to largest connected component?"/>
+        <param argument="fontsize" type="integer" min="0" value="" optional="true" label="Font size for node labels"/>
+        <param argument="node_size_scale" type="float" min="0" value="1.0" label="Size of the nodes"/>
+        <param argument="node_size_power" type="float" min="0" value="0.5" label="Power with which groups sizes influence the radius of the nodes"/>
+        <param argument="edge_width_scale" type="float" min="0" value="1.0" label="Scale for edge width"/>
+        <param argument="min_edge_width" type="float" min="0" value="" optional="true" label="Min width of solid edges"/>
+        <param argument="max_edge_width" type="float" min="0" value="" optional="true" label="Max width of solid and dashed edges"/>
+        <param argument="arrowsize" type="integer" min="0" value="30" label="Arrow size" help="For directed graphs, choose the size of the arrow head head's length and width."/>
+        <param argument="normalize_to_color" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Normalize categorical plots to color or the underlying grouping?"/>
+        <expand macro="param_cmap"/>
+        <expand macro="param_title"/>
+        <expand macro="param_frameon"/>
+    </xml>
+    <token name="@CMD_PARAMS_PL_PAGA@"><![CDATA[
+        #if str($method.threshold) != '':
+    threshold=$method.threshold,
+        #end if
+        #if str($method.groups) != '':
+            #set $groups=([x.strip() for x in str($method.groups).split(',')])
+    groups=$groups,
+        #end if
+        #if str($method.color) != '':
+            #set $color=([x.strip() for x in str($method.color).split(',')])
+    color=$color,
+        #end if
+        #if $method.pos:
+    pos=np.fromfile($method.pos, dtype=dt),
+        #end if
+        #if str($method.labels) != '':
+            #set $labels=([x.strip() for x in str($method.labels).split(',')])
+    labels=$labels,
+        #end if
+    layout='$method.layout',
+        #if $method.init_pos:
+    init_pos=np.fromfile($method.init_pos, dtype=dt),
+        #end if
+    random_state=$method.random_state,
+        #if str($method.root) != '':
+            #set $root=([int(x.strip()) for x in str($method.root).split(',')])
+    root=$root,
+        #end if
+        #if str($method.transitions) != '':
+    transitions='$method.transitions',
+        #end if
+    solid_edges='$method.solid_edges',
+        #if str($method.dashed_edges) != '':
+    dashed_edges='$method.dashed_edges',
+        #end if
+    single_component=$method.single_component,
+    fontsize=$method.fontsize,
+    node_size_scale=$method.node_size_scale,
+    node_size_power=$method.node_size_power,
+    edge_width_scale=$method.edge_width_scale,
+        #if str($method.min_edge_width) != '':
+    min_edge_width=$method.min_edge_width,
+        #end if
+        #if str($method.max_edge_width) != '':
+    max_edge_width=$method.max_edge_width,
+        #end if
+    arrowsize=$method.arrowsize,
+    normalize_to_color=$method.normalize_to_color,
+    #if $method.cmap:
+    cmap='$method.cmap',
+    #end if
+        #if str($method.title) != '':
+    title='$method.title',
+        #end if
+    frameon=$method.frameon,
+    ]]>
+    </token>
+
+    <xml name="param_gene_symbols">
+        <param argument="gene_symbols" type="text" value="" optional="true" label="Key for field in '.var' that stores gene symbols" help="By default 'var_names' refer to the index column of the '.var' DataFrame">
+            <expand macro="sanitize_query"/>
+        </param>
+    </xml>
+    <token name="@CMD_PARAM_GENE_SYMBOLS@"><![CDATA[
+    #if str($method.gene_symbols) != '':
+    gene_symbols='$method.gene_symbols',
+    #end if
+    ]]>
+    </token>
+
+    <xml name="params_pl_dotplot">
+        <param argument="color_map" type="select" optional="true" label="Color palette">
+            <expand macro="matplotlib_pyplot_colormap"/>
+        </param>
+        <param argument="dot_max" type="float" value="" min="0" max="1" optional="true" label="Maximum dot size" help="If none, the maximum dot size is set to the maximum fraction value found (e.g. 0.6). If given, the value should be a number between 0 and 1. All fractions larger than dot_max are clipped to this value."/>
+        <param argument="dot_min" type="float" value="" min="0" max="1" optional="true" label="Minimum dot size" help="If none, the minimum dot size is set to 0. If given, the value should be a number between 0 and 1. All fractions smaller than dot_min are clipped to this value."/>
+        <expand macro="param_standard_scale"/>
+        <param argument="expression_cutoff" type="float" min="0.0" value="0.0" label="Expression cutoff that is used for binarizing the gene expression and determining the fraction of cells expressing given genes" help="A gene is expressed only if the expression value is greater than this threshold."/>
+        <param argument="mean_only_expressed" type="boolean" truevalue="True" falsevalue="False" checked="false" label="average the gene expression only over the cells expressing the given genes"/>
+        <expand macro="section_matplotlib_pyplot_scatter"/>
+    </xml>
+    <token name="@CMD_PL_DOTPLOT@"><![CDATA[
+    #if $method.color_map:
+    color_map='$method.color_map',
+    #end if
+    #if str($method.dot_max) != '':
+    dot_max=$method.dot_max,
+    #end if
+    #if str($method.dot_min) != '':
+    dot_min=$method.dot_min,
+    #end if
+    @CMD_STANDARD_SCALE@
+    expression_cutoff=$method.expression_cutoff,
+    mean_only_expressed=$method.mean_only_expressed,
+    @CMD_SECTION_MATPLOTLIB_PYPLOT_SCATTER@
+    ]]>
+    </token>
+
+    <xml name="values_to_plot">
+        <param argument="values_to_plot" type="select" optional="true" label="Values to plot" help="Defualt: plots mean expression. When plotting logfoldchanges a divergent colormap is recommended.">
+            <option value="scores">Scores</option>
+            <option value="logfoldchanges">Log foldchanges</option>
+            <option value="pvals">P-values</option>
+            <option value="pvals_adj">Adjusted p-values</option>
+            <option value="log10_pvals">log10 of p-values</option>
+            <option value="log10_pvals_adj">log10 of adjusted p-values</option>
+        </param>
+    </xml>
+    <token name="@CMD_VALUES_TO_PLOT@"><![CDATA[
+    #if $method.values_to_plot:
+    values_to_plot='$method.values_to_plot',
+    colorbar_title='$method.values_to_plot',
+    #end if
+    ]]>
+    </token>
+
+
+    <xml name="param_n_genes" token_value="">
+        <param argument="n_genes" type="integer" min="0" value="@VALUE@" optional="true" label="Number of genes to show" help="It is only used if you are not specifying certain variable names"/>
+    </xml>
+    <xml name="param_key">
+        <param argument="key" type="text" value="" label="Key used to store the ranking results in 'uns'">
+            <expand macro="sanitize_query"/>
+        </param>
+    </xml>
+
+    <xml name="pl_rank_genes_groups_ext">
+        <expand macro="pl_var_names"/>
+        <expand macro="param_groups"/>
+        <expand macro="param_n_genes" value=""/>
+        <expand macro="param_key"/>
+        <param argument="min_logfoldchange" type="integer" optional="true" value="" label="Value to filter genes in groups if their logfoldchange is less than this value"/>
+    </xml>
+    <token name="@CMD_PL_RANK_GENES_GROUPS_EXT@"><![CDATA[
+    #if str($method.var_names.type) == 'custom':
+    #set $var_names = ([x.strip() for x in str($method.var_names.var_names).split(',')])
+    var_names=$var_names,
+    #else if str($method.var_names.type) == 'customfile':
+    var_names={key: [v for v in list(value.values()) if pd.notna(v)] for key, value in pd.read_csv('$var_names', sep='\t', index_col=0, header=header).to_dict(orient='index').items()},
+    #end if
+    @CMD_PARAM_GROUPS@
+    #if str($method.n_genes) != '':
+    n_genes=$method.n_genes,
+    #end if
+    #if str($method.key) != '':
+    key='$method.key',
+    #end if
+    #if str($method.min_logfoldchange) != '':
+    min_logfoldchange=$method.min_logfoldchange,
+    #end if
+    ]]>
+    </token>
+
+    <xml name="param_density_norm">
+        <param argument="density_norm" type="select" label="Method used to scale the width of each violin">
+        	<option value="area" selected="true">area: each violin will have the same area</option>
+            <option value="width">width: each violin will have the same width</option>
+            <option value="count">count: the width of the violins will be scaled by the number of observations in that bin</option>
+        </param>
+    </xml>
+    <xml name="params_pl_stacked_violin">
         <expand macro="param_swap_axes"/>
         <section name="violin_plot" title="Violin plot attributes">
             <expand macro="conditional_stripplot"/>
-            <expand macro="param_scale"/>
+            <expand macro="param_density_norm"/>
         </section>
         <param argument="row_palette" type="select" optional="true" label="Colors to use in each of the stacked violin plots">
             <option value="muted">muted</option>
             <expand macro="seaborn_color_palette_options"/>
         </param>
-        <param argument="standard_scale" type="select" label="Standardize a dimension between 0 and 1" help="Each variable or observation is subtracted by the minimum and divided each by its maximum.">
-            <option value="None">No standardization</option>
-            <option value="var">Standardization on variable</option>
-            <option value="obs">Standardization on observation</option>
-        </param>
-        <expand macro="seaborn_violinplot"/>
+        <expand macro="param_standard_scale"/>
+        <expand macro="params_seaborn_violinplot"/>
+        <param argument="yticklabels" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Set to view the y tick labels"/>
+        <expand macro="param_vmin" label="The value representing the lower limit of the color scale" help="Values smaller than vmin are plotted with the same color as vmin."/>
+        <expand macro="param_vmax" label="The value representing the upper limit of the color scale" help="Values larger than vmax are plotted with the same color as vmax."/>
+        <expand macro="param_vcenter"/>
     </xml>
-    <token name="@CMD_pl_stacked_violin@"><![CDATA[
+    <token name="@CMD_PARAMS_PL_STACKED_VIOLIN@"><![CDATA[
     swap_axes=$method.swap_axes,
-    @CMD_conditional_stripplot@
-    scale='$method.violin_plot.scale',
-    #if $method.row_palette
+    @CMD_CONDITIONAL_STRIPPLOT@
+    density_norm='$method.violin_plot.density_norm',
+    #if $method.row_palette:
     row_palette='$method.row_palette',
     #end if
-    #if str($method.standard_scale) != 'None'
-    standard_scale='$method.standard_scale',
+    @CMD_STANDARD_SCALE@
+    @CMD_PARAMS_SEABORN_VIOLINPLOT@
+    yticklabels=$method.yticklabels,
+    #if str($method.vmin) != '':
+    vmin=$method.vmin,
     #end if
-    @CMD_params_seaborn_violinplot@
+    #if str($method.vmax) != '':
+    vmax=$method.vmax,
+    #end if
+    #if str($method.vcenter) != '':
+    vcenter=$method.vcenter,
+    #end if
     ]]>
     </token>
+
+    <xml name="params_scatter_outine">
+        <param argument="add_outline" type="boolean" truevalue="True" falsevalue="False" checked="false" label="Add a thin border around groups of dots" help="In some situations this can enhance the aesthetics of the resulting image"/>
+        <param name="outline_color_border" type="select" optional="true" label="Border color around the scatter dot" help="Default: black">
+            <expand macro="matplotlib_color"/>
+        </param>
+        <param name="outline_color_gap" type="select" optional="true" label="Gap color between the border color and the scatter dot" help="Default: white">
+            <expand macro="matplotlib_color"/>
+        </param>
+        <param argument="outline_width_border" type="float" value="0.3" optional="true" label=" width of the border color as a fraction of the scatter dot size "/>
+        <param argument="outline_width_gap" type="float" value="0.05" optional="true" label="The width of the gap color"/>
+    </xml>
+    <token name="@CMD_SCATTER_OUTINE@"><![CDATA[
+    add_outline=$method.add_outline,
+    #if $method.outline_color_border and $method.outline_color_gap:
+    outline_color=($method.outline_color_border, $method.outline_color_gap),
+    #end if
+    outline_width=($method.outline_width_border, $method.outline_width_gap),
+    ]]>
+    </token>
+
+
+    <!-- unused macros -->
+    <!-- <xml name="param_right_margin">
+        <param argument="right_margin" type="float" value="1" label="Width of the space right of each plotting panel"/>
+    </xml>
+    <xml name="param_left_margin">
+        <param argument="left_margin" type="float" value="1" label="Width of the space left of each plotting panel"/>
+    </xml> -->
 </macros>
Binary file test-data/cosg.rank_genes_groups.newton-cg.pbmc68k_highly_reduced_1.h5ad has changed
Binary file test-data/external.pp.bbknn.krumsiek11.h5ad has changed
Binary file test-data/external.pp.magic.all_genes.krumsiek11.h5ad has changed
Binary file test-data/external.pp.magic.pca_only.krumsiek11.h5ad has changed
Binary file test-data/pbmc68k_reduced.h5ad has changed
Binary file test-data/pl.clustermap.krumsiek11.png has changed
Binary file test-data/pl.diffmap.neighbors_gauss_braycurtis.recipe_weinreb17.paul15_subsample.png has changed
Binary file test-data/pl.dotplot.krumsiek11.png has changed
Binary file test-data/pl.dpt_timeseries.dpt.diffmap.neighbors_gauss_braycurtis.recipe_weinreb17.paul15_subsample.png has changed
Binary file test-data/pl.draw_graph.png has changed
Binary file test-data/pl.embedding_density.pbmc68k_reduced.png has changed
Binary file test-data/pl.heatmap.krumsiek11.png has changed
Binary file test-data/pl.highest_expr_genes.filter_genes_dispersion.krumsiek11-seurat.png has changed
Binary file test-data/pl.highly_variable_genes.seurat.blobs.png has changed
Binary file test-data/pl.matrixplot.krumsiek11.png has changed
Binary file test-data/pl.paga.paul15_gauss_braycurtis.png has changed
Binary file test-data/pl.paga_compare.paul15_gauss_braycurtis.png has changed
Binary file test-data/pl.pca.pbmc68k_reduced.CD3D_CD79A_components_2d.pdf has changed
Binary file test-data/pl.pca_loadings.pp.pca.krumsiek11.png has changed
Binary file test-data/pl.pca_overview.pp.pca.krumsiek11.png has changed
Binary file test-data/pl.pca_variance_ratio.pp.pca.krumsiek11.png has changed
Binary file test-data/pl.rank_genes_groups.newton-cg.pbmc68k_highly_reduced_marker_1.png has changed
Binary file test-data/pl.rank_genes_groups.newton-cg.pbmc68k_highly_reduced_marker_filtered_1.png has changed
Binary file test-data/pl.rank_genes_groups.rank_genes_groups.krumsiek11.png has changed
Binary file test-data/pl.rank_genes_groups_dotplot.rank_genes_groups.krumsiek11.png has changed
Binary file test-data/pl.rank_genes_groups_heatmap.rank_genes_groups.krumsiek11.png has changed
Binary file test-data/pl.rank_genes_groups_matrixplot.rank_genes_groups.krumsiek11.png has changed
Binary file test-data/pl.rank_genes_groups_stacked_violin.rank_genes_groups.krumsiek11.png has changed
Binary file test-data/pl.rank_genes_groups_tracksplot.newton-cg.pbmc68k_highly_reduced_marker_filtered_1.png has changed
Binary file test-data/pl.rank_genes_groups_violin.Ery.png has changed
Binary file test-data/pl.rank_genes_groups_violin.Mk.png has changed
Binary file test-data/pl.rank_genes_groups_violin.Mo.png has changed
Binary file test-data/pl.rank_genes_groups_violin.Neu.png has changed
Binary file test-data/pl.rank_genes_groups_violin.progenitor.png has changed
Binary file test-data/pl.scatter.krumsiek11.png has changed
Binary file test-data/pl.scatter.pbmc68k_reduced.png has changed
Binary file test-data/pl.scatter.umap.pbmc68k_reduced.png has changed
Binary file test-data/pl.scrublet_score_distribution.png has changed
Binary file test-data/pl.stacked_violin.krumsiek11.png has changed
Binary file test-data/pl.stacked_violin_pp.filter_genes_dispersion.krumsiek11-seurat.png has changed
Binary file test-data/pl.tsne.krumsiek11.png has changed
Binary file test-data/pl.umap.neighbors_umap_euclidean.recipe_weinreb17.paul15_subsample.png has changed
Binary file test-data/pl.violin.pbmc68k_reduced_custom.png has changed
Binary file test-data/pp.calculate_qc_metrics.sparce_csr_matrix.h5ad has changed
Binary file test-data/pp.downsample_counts.random-randint.h5ad has changed
Binary file test-data/pp.filter_cells.krumsiek11-max_genes.h5ad has changed
Binary file test-data/pp.filter_cells.krumsiek11-min_counts.h5ad has changed
Binary file test-data/pp.filter_genes.krumsiek11-min_counts.h5ad has changed
Binary file test-data/pp.filter_rank_genes_groups.h5ad has changed
Binary file test-data/pp.highly_variable_genes.krumsiek11-cell_ranger.h5ad has changed
Binary file test-data/pp.log1p.krumsiek11.h5ad has changed
Binary file test-data/pp.normalize_total.krumsiek11.h5ad has changed
Binary file test-data/pp.pca.krumsiek11.batch.h5ad has changed
Binary file test-data/pp.pca.krumsiek11_chunk.h5ad has changed
Binary file test-data/pp.recipe_seurat.recipe_zheng17.h5ad has changed
Binary file test-data/pp.recipe_weinreb17.paul15_subsample.updated.h5ad has changed
Binary file test-data/pp.recipe_zheng17.random-randint.h5ad has changed
Binary file test-data/pp.scale.krumsiek11.h5ad has changed
Binary file test-data/pp.scale_max_value.krumsiek11.h5ad has changed
Binary file test-data/pp.scrublet.krumsiek11.h5ad has changed
Binary file test-data/pp.sqrt.krumsiek11.h5ad has changed
Binary file test-data/pp.subsample.krumsiek11_fraction.h5ad has changed
Binary file test-data/pp.subsample.krumsiek11_n_obs.h5ad has changed
Binary file test-data/random-randint.h5ad has changed
Binary file test-data/sparce_csr_matrix.h5ad has changed
Binary file test-data/tl.embedding_density.umap.neighbors_umap_euclidean.recipe_weinreb17.paul15_subsample.h5ad has changed
Binary file test-data/tl.embedding_density.umap.pbmc68k_reduced.h5ad has changed
Binary file test-data/tl.leiden.neighbors_gauss_braycurtis.recipe_weinreb17.paul15_subsample.h5ad has changed
Binary file test-data/tl.louvain.neighbors_gauss_braycurtis.recipe_weinreb17.paul15_subsample.h5ad has changed
Binary file test-data/tl.paga.neighbors_gauss_braycurtis.recipe_weinreb17.paul15_subsample.h5ad has changed
Binary file test-data/tl.rank_genes_groups.liblinear.krumsiek11.h5ad has changed
Binary file test-data/tl.rank_genes_groups.newton-cg.pbmc68k_reduced.h5ad has changed
Binary file test-data/tl.score_genes.krumsiek11.h5ad has changed
Binary file test-data/tl.score_genes_cell_cycle.krumsiek11.h5ad has changed