Build branch build/main with version build_main (408cceb)
Build pipeline: openpipelines-bio.openpipeline-spatial.build-main-cvdhc
Source commit: 408cceb53b
Source message: deploy: bbebaa1a26a30c55af33fa6818c12123f9fe4824
This commit is contained in:
6
.gitignore
vendored
6
.gitignore
vendored
@@ -56,3 +56,9 @@ trace*.txt
|
|||||||
# vscode
|
# vscode
|
||||||
.vscode/launch.json
|
.vscode/launch.json
|
||||||
.vscode/settings.json
|
.vscode/settings.json
|
||||||
|
|
||||||
|
# linting
|
||||||
|
ruff.toml
|
||||||
|
renv.lock
|
||||||
|
.Rprofile
|
||||||
|
renv/
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# openpipeline_spatial 0.0.0
|
# openpipeline_spatial 0.1.0
|
||||||
|
|
||||||
## NEW FUNCTIONALITY
|
## NEW FUNCTIONALITY
|
||||||
|
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ links:
|
|||||||
docker_registry: ghcr.io
|
docker_registry: ghcr.io
|
||||||
repositories:
|
repositories:
|
||||||
- name: openpipeline
|
- name: openpipeline
|
||||||
repo: openpipelines-bio/openpipeline
|
repo: openpipeline
|
||||||
type: github
|
type: vsh
|
||||||
tag: 2.1.2
|
tag: v3.0.0
|
||||||
info:
|
info:
|
||||||
test_resources:
|
test_resources:
|
||||||
- type: s3
|
- type: s3
|
||||||
|
|||||||
43
ruff.toml
43
ruff.toml
@@ -1,43 +0,0 @@
|
|||||||
# Exclude a variety of commonly ignored directories.
|
|
||||||
exclude = [
|
|
||||||
".git",
|
|
||||||
".pyenv",
|
|
||||||
".pytest_cache",
|
|
||||||
".ruff_cache",
|
|
||||||
".venv",
|
|
||||||
".vscode",
|
|
||||||
"__pypackages__",
|
|
||||||
"_build",
|
|
||||||
"build",
|
|
||||||
"dist",
|
|
||||||
"node_modules",
|
|
||||||
"site-packages",
|
|
||||||
]
|
|
||||||
|
|
||||||
builtins = ["meta"]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[format]
|
|
||||||
# Like Black, use double quotes for strings.
|
|
||||||
quote-style = "double"
|
|
||||||
|
|
||||||
# Like Black, indent with spaces, rather than tabs.
|
|
||||||
indent-style = "space"
|
|
||||||
|
|
||||||
# Like Black, respect magic trailing commas.
|
|
||||||
skip-magic-trailing-comma = false
|
|
||||||
|
|
||||||
# Like Black, automatically detect the appropriate line ending.
|
|
||||||
line-ending = "auto"
|
|
||||||
|
|
||||||
[lint.flake8-pytest-style]
|
|
||||||
fixture-parentheses = false
|
|
||||||
mark-parentheses = false
|
|
||||||
|
|
||||||
[lint]
|
|
||||||
ignore = [
|
|
||||||
# module level import not at top of file
|
|
||||||
"E402"
|
|
||||||
]
|
|
||||||
@@ -295,13 +295,7 @@ argument_groups:
|
|||||||
dependencies:
|
dependencies:
|
||||||
- name: workflows/multiomics/process_samples
|
- name: workflows/multiomics/process_samples
|
||||||
alias: spatial_sample_processing
|
alias: spatial_sample_processing
|
||||||
repository: openpipeline_scrublet
|
repository: openpipeline
|
||||||
|
|
||||||
repositories:
|
|
||||||
- name: openpipeline_scrublet
|
|
||||||
repo: openpipelines-bio/openpipeline
|
|
||||||
type: github
|
|
||||||
tag: disable-scrublet_build
|
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
- type: nextflow_script
|
- type: nextflow_script
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ workflow run_wf {
|
|||||||
"output": state.workflow_output
|
"output": state.workflow_output
|
||||||
]},
|
]},
|
||||||
args: [
|
args: [
|
||||||
"skip_scrublet_filtering": "true",
|
"skip_scrublet_doublet_detection": "true",
|
||||||
],
|
],
|
||||||
toState: [
|
toState: [
|
||||||
"output": "output"
|
"output": "output"
|
||||||
|
|||||||
@@ -1,318 +0,0 @@
|
|||||||
name: "grep_annotation_column"
|
|
||||||
namespace: "metadata"
|
|
||||||
version: "2.1.2"
|
|
||||||
authors:
|
|
||||||
- name: "Dries Schaumont"
|
|
||||||
roles:
|
|
||||||
- "maintainer"
|
|
||||||
info:
|
|
||||||
role: "Core Team Member"
|
|
||||||
links:
|
|
||||||
email: "dries@data-intuitive.com"
|
|
||||||
github: "DriesSchaumont"
|
|
||||||
orcid: "0000-0002-4389-0440"
|
|
||||||
linkedin: "dries-schaumont"
|
|
||||||
organizations:
|
|
||||||
- name: "Data Intuitive"
|
|
||||||
href: "https://www.data-intuitive.com"
|
|
||||||
role: "Data Scientist"
|
|
||||||
argument_groups:
|
|
||||||
- name: "Inputs"
|
|
||||||
description: "Arguments related to the input dataset."
|
|
||||||
arguments:
|
|
||||||
- type: "file"
|
|
||||||
name: "--input"
|
|
||||||
alternatives:
|
|
||||||
- "-i"
|
|
||||||
description: "Path to the input .h5mu."
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "sample_path"
|
|
||||||
must_exist: true
|
|
||||||
create_parent: true
|
|
||||||
required: true
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--input_column"
|
|
||||||
description: "Column to query. If not specified, use .var_names or .obs_names,\
|
|
||||||
\ depending on the value of --matrix"
|
|
||||||
info: null
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--input_layer"
|
|
||||||
description: "Input data to use when calculating fraction of observations that\
|
|
||||||
\ match with the query. \nOnly used when --output_fraction_column is provided.\
|
|
||||||
\ If not specified, .X is used.\n"
|
|
||||||
info: null
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--modality"
|
|
||||||
description: "Which modality to get the annotation matrix from.\n"
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "rna"
|
|
||||||
required: true
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--matrix"
|
|
||||||
description: "Matrix to fetch the column from that will be searched."
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "var"
|
|
||||||
required: false
|
|
||||||
choices:
|
|
||||||
- "var"
|
|
||||||
- "obs"
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- name: "Outputs"
|
|
||||||
description: "Arguments related to how the output will be written."
|
|
||||||
arguments:
|
|
||||||
- type: "file"
|
|
||||||
name: "--output"
|
|
||||||
alternatives:
|
|
||||||
- "-o"
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "output.h5mu"
|
|
||||||
must_exist: true
|
|
||||||
create_parent: true
|
|
||||||
required: false
|
|
||||||
direction: "output"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_compression"
|
|
||||||
description: "The compression format to be used on the output h5mu object."
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "gzip"
|
|
||||||
required: false
|
|
||||||
choices:
|
|
||||||
- "gzip"
|
|
||||||
- "lzf"
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_match_column"
|
|
||||||
description: "Name of the column to write the result to."
|
|
||||||
info: null
|
|
||||||
required: true
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_fraction_column"
|
|
||||||
description: "For the opposite axis, name of the column to write the fraction\
|
|
||||||
\ of \nobservations that matches to the pattern.\n"
|
|
||||||
info: null
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- name: "Query options"
|
|
||||||
description: "Options related to the query"
|
|
||||||
arguments:
|
|
||||||
- type: "string"
|
|
||||||
name: "--regex_pattern"
|
|
||||||
description: "Regex to use to match with the input column."
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "^[mM][tT]-"
|
|
||||||
required: true
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
resources:
|
|
||||||
- type: "python_script"
|
|
||||||
path: "script.py"
|
|
||||||
is_executable: true
|
|
||||||
- type: "file"
|
|
||||||
path: "setup_logger.py"
|
|
||||||
- type: "file"
|
|
||||||
path: "compress_h5mu.py"
|
|
||||||
- type: "file"
|
|
||||||
path: "nextflow_labels.config"
|
|
||||||
dest: "nextflow_labels.config"
|
|
||||||
description: "Perform a regex lookup on a column from the annotation matrices .obs\
|
|
||||||
\ or .var.\nThe annotation matrix can originate from either a modality, or all modalities\
|
|
||||||
\ (global .var or .obs).\n"
|
|
||||||
test_resources:
|
|
||||||
- type: "python_script"
|
|
||||||
path: "test.py"
|
|
||||||
is_executable: true
|
|
||||||
- type: "file"
|
|
||||||
path: "e18_mouse_brain_fresh_5k_filtered_feature_bc_matrix_subset_unique_obs.h5mu"
|
|
||||||
info: null
|
|
||||||
status: "enabled"
|
|
||||||
scope:
|
|
||||||
image: "public"
|
|
||||||
target: "public"
|
|
||||||
license: "MIT"
|
|
||||||
links:
|
|
||||||
repository: "https://github.com/openpipelines-bio/openpipeline"
|
|
||||||
docker_registry: "ghcr.io"
|
|
||||||
runners:
|
|
||||||
- type: "executable"
|
|
||||||
id: "executable"
|
|
||||||
docker_setup_strategy: "ifneedbepullelsecachedbuild"
|
|
||||||
- type: "nextflow"
|
|
||||||
id: "nextflow"
|
|
||||||
directives:
|
|
||||||
label:
|
|
||||||
- "singlecpu"
|
|
||||||
- "lowmem"
|
|
||||||
tag: "$id"
|
|
||||||
auto:
|
|
||||||
simplifyInput: true
|
|
||||||
simplifyOutput: false
|
|
||||||
transcript: false
|
|
||||||
publish: false
|
|
||||||
config:
|
|
||||||
labels:
|
|
||||||
mem1gb: "memory = 1000000000.B"
|
|
||||||
mem2gb: "memory = 2000000000.B"
|
|
||||||
mem5gb: "memory = 5000000000.B"
|
|
||||||
mem10gb: "memory = 10000000000.B"
|
|
||||||
mem20gb: "memory = 20000000000.B"
|
|
||||||
mem50gb: "memory = 50000000000.B"
|
|
||||||
mem100gb: "memory = 100000000000.B"
|
|
||||||
mem200gb: "memory = 200000000000.B"
|
|
||||||
mem500gb: "memory = 500000000000.B"
|
|
||||||
mem1tb: "memory = 1000000000000.B"
|
|
||||||
mem2tb: "memory = 2000000000000.B"
|
|
||||||
mem5tb: "memory = 5000000000000.B"
|
|
||||||
mem10tb: "memory = 10000000000000.B"
|
|
||||||
mem20tb: "memory = 20000000000000.B"
|
|
||||||
mem50tb: "memory = 50000000000000.B"
|
|
||||||
mem100tb: "memory = 100000000000000.B"
|
|
||||||
mem200tb: "memory = 200000000000000.B"
|
|
||||||
mem500tb: "memory = 500000000000000.B"
|
|
||||||
mem1gib: "memory = 1073741824.B"
|
|
||||||
mem2gib: "memory = 2147483648.B"
|
|
||||||
mem4gib: "memory = 4294967296.B"
|
|
||||||
mem8gib: "memory = 8589934592.B"
|
|
||||||
mem16gib: "memory = 17179869184.B"
|
|
||||||
mem32gib: "memory = 34359738368.B"
|
|
||||||
mem64gib: "memory = 68719476736.B"
|
|
||||||
mem128gib: "memory = 137438953472.B"
|
|
||||||
mem256gib: "memory = 274877906944.B"
|
|
||||||
mem512gib: "memory = 549755813888.B"
|
|
||||||
mem1tib: "memory = 1099511627776.B"
|
|
||||||
mem2tib: "memory = 2199023255552.B"
|
|
||||||
mem4tib: "memory = 4398046511104.B"
|
|
||||||
mem8tib: "memory = 8796093022208.B"
|
|
||||||
mem16tib: "memory = 17592186044416.B"
|
|
||||||
mem32tib: "memory = 35184372088832.B"
|
|
||||||
mem64tib: "memory = 70368744177664.B"
|
|
||||||
mem128tib: "memory = 140737488355328.B"
|
|
||||||
mem256tib: "memory = 281474976710656.B"
|
|
||||||
mem512tib: "memory = 562949953421312.B"
|
|
||||||
cpu1: "cpus = 1"
|
|
||||||
cpu2: "cpus = 2"
|
|
||||||
cpu5: "cpus = 5"
|
|
||||||
cpu10: "cpus = 10"
|
|
||||||
cpu20: "cpus = 20"
|
|
||||||
cpu50: "cpus = 50"
|
|
||||||
cpu100: "cpus = 100"
|
|
||||||
cpu200: "cpus = 200"
|
|
||||||
cpu500: "cpus = 500"
|
|
||||||
cpu1000: "cpus = 1000"
|
|
||||||
script:
|
|
||||||
- "includeConfig(\"nextflow_labels.config\")"
|
|
||||||
debug: false
|
|
||||||
container: "docker"
|
|
||||||
engines:
|
|
||||||
- type: "docker"
|
|
||||||
id: "docker"
|
|
||||||
image: "python:3.11-slim"
|
|
||||||
target_tag: "2.1.0"
|
|
||||||
namespace_separator: "/"
|
|
||||||
setup:
|
|
||||||
- type: "apt"
|
|
||||||
packages:
|
|
||||||
- "procps"
|
|
||||||
interactive: false
|
|
||||||
- type: "python"
|
|
||||||
user: false
|
|
||||||
packages:
|
|
||||||
- "anndata~=0.11.1"
|
|
||||||
- "mudata~=0.3.1"
|
|
||||||
script:
|
|
||||||
- "exec(\"try:\\n import awkward\\nexcept ModuleNotFoundError:\\n exit(0)\\\
|
|
||||||
nelse: exit(1)\")"
|
|
||||||
upgrade: true
|
|
||||||
test_setup:
|
|
||||||
- type: "apt"
|
|
||||||
packages:
|
|
||||||
- "git"
|
|
||||||
interactive: false
|
|
||||||
- type: "python"
|
|
||||||
user: false
|
|
||||||
packages:
|
|
||||||
- "viashpy==0.8.0"
|
|
||||||
github:
|
|
||||||
- "openpipelines-bio/core#subdirectory=packages/python/openpipeline_testutils"
|
|
||||||
upgrade: true
|
|
||||||
entrypoint: []
|
|
||||||
cmd: null
|
|
||||||
build_info:
|
|
||||||
config: "src/metadata/grep_annotation_column/config.vsh.yaml"
|
|
||||||
runner: "nextflow"
|
|
||||||
engine: "docker"
|
|
||||||
output: "target/nextflow/metadata/grep_annotation_column"
|
|
||||||
executable: "target/nextflow/metadata/grep_annotation_column/main.nf"
|
|
||||||
viash_version: "0.9.4"
|
|
||||||
git_commit: "a0c9522486585774f76416150f8a3291409b5363"
|
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline"
|
|
||||||
git_tag: "2.1.1-2-ga0c95224865"
|
|
||||||
package_config:
|
|
||||||
name: "openpipeline"
|
|
||||||
summary: "Best-practice workflows for single-cell multi-omics analyses.\n"
|
|
||||||
description: "OpenPipelines are extensible single cell analysis pipelines for reproducible\
|
|
||||||
\ and large-scale single cell processing using [Viash](https://viash.io) and [Nextflow](https://www.nextflow.io/).\n\
|
|
||||||
\nIn terms of workflows, the following has been made available, but keep in mind\
|
|
||||||
\ that\nindividual tools and functionality can be executed as standalone components\
|
|
||||||
\ as well.\n\n * Demultiplexing: conversion of raw sequencing data to FASTQ objects.\n\
|
|
||||||
\ * Ingestion: Read mapping and generating a count matrix.\n * Single sample\
|
|
||||||
\ processing: cell filtering and doublet detection.\n * Multisample processing:\
|
|
||||||
\ Count transformation, normalization, QC metric calulations.\n * Integration:\
|
|
||||||
\ Clustering, integration and batch correction using single and multimodal methods.\n\
|
|
||||||
\ * Downstream analysis workflows\n"
|
|
||||||
info:
|
|
||||||
test_resources:
|
|
||||||
- type: "s3"
|
|
||||||
path: "s3://openpipelines-data"
|
|
||||||
dest: "resources_test"
|
|
||||||
viash_version: "0.9.4"
|
|
||||||
source: "src"
|
|
||||||
target: "target"
|
|
||||||
config_mods:
|
|
||||||
- ".resources += {path: '/src/workflows/utils/labels.config', dest: 'nextflow_labels.config'}\n\
|
|
||||||
.runners[.type == 'nextflow'].config.script := 'includeConfig(\"nextflow_labels.config\"\
|
|
||||||
)'"
|
|
||||||
- ".version := \"2.1.2\""
|
|
||||||
- ".engines[.type == 'docker'].target_tag := '2.1.0'"
|
|
||||||
keywords:
|
|
||||||
- "single-cell"
|
|
||||||
- "multimodal"
|
|
||||||
license: "MIT"
|
|
||||||
organization: "openpipelines-bio"
|
|
||||||
links:
|
|
||||||
repository: "https://github.com/openpipelines-bio/openpipeline"
|
|
||||||
docker_registry: "ghcr.io"
|
|
||||||
homepage: "https://openpipelines.bio"
|
|
||||||
documentation: "https://openpipelines.bio/fundamentals"
|
|
||||||
issue_tracker: "https://github.com/openpipelines-bio/openpipeline/issues"
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,21 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
input: # please fill in - example: "sample_path"
|
|
||||||
# input_column: "foo"
|
|
||||||
# input_layer: "foo"
|
|
||||||
modality: # please fill in - example: "rna"
|
|
||||||
# matrix: "var"
|
|
||||||
|
|
||||||
# Outputs
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
# output_compression: "gzip"
|
|
||||||
output_match_column: # please fill in - example: "foo"
|
|
||||||
# output_fraction_column: "foo"
|
|
||||||
|
|
||||||
# Query options
|
|
||||||
regex_pattern: # please fill in - example: "^[mM][tT]-"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,200 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema",
|
|
||||||
"title": "grep_annotation_column",
|
|
||||||
"description": "Perform a regex lookup on a column from the annotation matrices .obs or .var.\nThe annotation matrix can originate from either a modality, or all modalities (global .var or .obs).\n",
|
|
||||||
"type": "object",
|
|
||||||
"definitions": {
|
|
||||||
|
|
||||||
|
|
||||||
"Dataset input": {
|
|
||||||
"title": "Dataset input",
|
|
||||||
"type": "object",
|
|
||||||
"description": "Dataset input using nf-tower \"dataset\" or \"data explorer\". Allows for the input of multiple parameter sets to initialise a Nextflow channel.",
|
|
||||||
"properties": {
|
|
||||||
"param_list": {
|
|
||||||
"description": "Dataset input can either be a list of maps, a csv file, a json file, a yaml file, or simply a yaml blob. The names of the input fields (e.g. csv columns, json keys) need to be an exact match with the workflow input parameters.",
|
|
||||||
"default": "",
|
|
||||||
"format": "file-path",
|
|
||||||
"mimetype": "text/csv",
|
|
||||||
"pattern": "^\\S+\\.csv$"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"inputs" : {
|
|
||||||
"title": "Inputs",
|
|
||||||
"type": "object",
|
|
||||||
"description": "Arguments related to the input dataset.",
|
|
||||||
"properties": {
|
|
||||||
|
|
||||||
|
|
||||||
"input": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `file`, required, example: `sample_path`. Path to the input ",
|
|
||||||
"help_text": "Type: `file`, required, example: `sample_path`. Path to the input .h5mu."
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"input_column": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`. Column to query",
|
|
||||||
"help_text": "Type: `string`. Column to query. If not specified, use .var_names or .obs_names, depending on the value of --matrix"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"input_layer": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`. Input data to use when calculating fraction of observations that match with the query",
|
|
||||||
"help_text": "Type: `string`. Input data to use when calculating fraction of observations that match with the query. \nOnly used when --output_fraction_column is provided. If not specified, .X is used.\n"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"modality": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, required, example: `rna`. Which modality to get the annotation matrix from",
|
|
||||||
"help_text": "Type: `string`, required, example: `rna`. Which modality to get the annotation matrix from.\n"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"matrix": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, example: `var`, choices: ``var`, `obs``. Matrix to fetch the column from that will be searched",
|
|
||||||
"help_text": "Type: `string`, example: `var`, choices: ``var`, `obs``. Matrix to fetch the column from that will be searched.",
|
|
||||||
"enum": ["var", "obs"]
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"outputs" : {
|
|
||||||
"title": "Outputs",
|
|
||||||
"type": "object",
|
|
||||||
"description": "Arguments related to how the output will be written.",
|
|
||||||
"properties": {
|
|
||||||
|
|
||||||
|
|
||||||
"output": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `file`, default: `$id.$key.output.h5mu`, example: `output.h5mu`. ",
|
|
||||||
"help_text": "Type: `file`, default: `$id.$key.output.h5mu`, example: `output.h5mu`. "
|
|
||||||
,
|
|
||||||
"default":"$id.$key.output.h5mu"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_compression": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, example: `gzip`, choices: ``gzip`, `lzf``. The compression format to be used on the output h5mu object",
|
|
||||||
"help_text": "Type: `string`, example: `gzip`, choices: ``gzip`, `lzf``. The compression format to be used on the output h5mu object.",
|
|
||||||
"enum": ["gzip", "lzf"]
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_match_column": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, required. Name of the column to write the result to",
|
|
||||||
"help_text": "Type: `string`, required. Name of the column to write the result to."
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_fraction_column": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`. For the opposite axis, name of the column to write the fraction of \nobservations that matches to the pattern",
|
|
||||||
"help_text": "Type: `string`. For the opposite axis, name of the column to write the fraction of \nobservations that matches to the pattern.\n"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"query options" : {
|
|
||||||
"title": "Query options",
|
|
||||||
"type": "object",
|
|
||||||
"description": "Options related to the query",
|
|
||||||
"properties": {
|
|
||||||
|
|
||||||
|
|
||||||
"regex_pattern": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, required, example: `^[mM][tT]-`. Regex to use to match with the input column",
|
|
||||||
"help_text": "Type: `string`, required, example: `^[mM][tT]-`. Regex to use to match with the input column."
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"nextflow input-output arguments" : {
|
|
||||||
"title": "Nextflow input-output arguments",
|
|
||||||
"type": "object",
|
|
||||||
"description": "Input/output parameters for Nextflow itself. Please note that both publishDir and publish_dir are supported but at least one has to be configured.",
|
|
||||||
"properties": {
|
|
||||||
|
|
||||||
|
|
||||||
"publish_dir": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, required, example: `output/`. Path to an output directory",
|
|
||||||
"help_text": "Type: `string`, required, example: `output/`. Path to an output directory."
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"allOf": [
|
|
||||||
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/inputs"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/outputs"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/query options"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/nextflow input-output arguments"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,376 +0,0 @@
|
|||||||
name: "calculate_qc_metrics"
|
|
||||||
namespace: "qc"
|
|
||||||
version: "2.1.2"
|
|
||||||
authors:
|
|
||||||
- name: "Dries Schaumont"
|
|
||||||
roles:
|
|
||||||
- "author"
|
|
||||||
info:
|
|
||||||
role: "Core Team Member"
|
|
||||||
links:
|
|
||||||
email: "dries@data-intuitive.com"
|
|
||||||
github: "DriesSchaumont"
|
|
||||||
orcid: "0000-0002-4389-0440"
|
|
||||||
linkedin: "dries-schaumont"
|
|
||||||
organizations:
|
|
||||||
- name: "Data Intuitive"
|
|
||||||
href: "https://www.data-intuitive.com"
|
|
||||||
role: "Data Scientist"
|
|
||||||
argument_groups:
|
|
||||||
- name: "Inputs"
|
|
||||||
arguments:
|
|
||||||
- type: "file"
|
|
||||||
name: "--input"
|
|
||||||
description: "Input h5mu file"
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "input.h5mu"
|
|
||||||
must_exist: true
|
|
||||||
create_parent: true
|
|
||||||
required: true
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--modality"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "rna"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--layer"
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "raw_counts"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- name: "Metrics added to .obs"
|
|
||||||
arguments:
|
|
||||||
- type: "string"
|
|
||||||
name: "--var_qc_metrics"
|
|
||||||
description: "Keys to select a boolean (containing only True or False) column\
|
|
||||||
\ from .var.\nFor each cell, calculate the proportion of total values for genes\
|
|
||||||
\ which are labeled 'True', \ncompared to the total sum of the values for all\
|
|
||||||
\ genes.\n"
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "ercc,highly_variable,mitochondrial"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: true
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "boolean"
|
|
||||||
name: "--var_qc_metrics_fill_na_value"
|
|
||||||
description: "Fill any 'NA' values found in the columns specified with --var_qc_metrics\
|
|
||||||
\ to 'True' or 'False'.\nas False.\n"
|
|
||||||
info: null
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "integer"
|
|
||||||
name: "--top_n_vars"
|
|
||||||
description: "Number of top vars to be used to calculate cumulative proportions.\n\
|
|
||||||
If not specified, proportions are not calculated. `--top_n_vars 20;50` finds\n\
|
|
||||||
cumulative proportion to the 20th and 50th most expressed vars.\n"
|
|
||||||
info: null
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: true
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_obs_num_nonzero_vars"
|
|
||||||
description: "Name of column in .obs describing, for each observation, the number\
|
|
||||||
\ of stored values\n(including explicit zeroes). In other words, the name of\
|
|
||||||
\ the column that counts\nfor each row the number of columns that contain data.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "num_nonzero_vars"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_obs_total_counts_vars"
|
|
||||||
description: "Name of the column for .obs describing, for each observation (row),\n\
|
|
||||||
the sum of the stored values in the columns.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "total_counts"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- name: "Metrics added to .var"
|
|
||||||
arguments:
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_var_num_nonzero_obs"
|
|
||||||
description: "Name of column describing, for each feature, the number of stored\
|
|
||||||
\ values\n(including explicit zeroes). In other words, the name of the column\
|
|
||||||
\ that counts\nfor each column the number of rows that contain data.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "num_nonzero_obs"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_var_total_counts_obs"
|
|
||||||
description: "Name of the column in .var describing, for each feature (column),\n\
|
|
||||||
the sum of the stored values in the rows.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "total_counts"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_var_obs_mean"
|
|
||||||
description: "Name of the column in .obs providing the mean of the values in each\
|
|
||||||
\ row.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "obs_mean"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_var_pct_dropout"
|
|
||||||
description: "Name of the column in .obs providing for each feature the percentage\
|
|
||||||
\ of\nobservations the feature does not appear on (i.e. is missing). Same as\
|
|
||||||
\ `--num_nonzero_obs`\nbut percentage based.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "pct_dropout"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- name: "Outputs"
|
|
||||||
arguments:
|
|
||||||
- type: "file"
|
|
||||||
name: "--output"
|
|
||||||
description: "Output h5mu file."
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "output.h5mu"
|
|
||||||
must_exist: true
|
|
||||||
create_parent: true
|
|
||||||
required: false
|
|
||||||
direction: "output"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_compression"
|
|
||||||
description: "The compression format to be used on the output h5mu object."
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "gzip"
|
|
||||||
required: false
|
|
||||||
choices:
|
|
||||||
- "gzip"
|
|
||||||
- "lzf"
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
resources:
|
|
||||||
- type: "python_script"
|
|
||||||
path: "script.py"
|
|
||||||
is_executable: true
|
|
||||||
- type: "file"
|
|
||||||
path: "setup_logger.py"
|
|
||||||
- type: "file"
|
|
||||||
path: "compress_h5mu.py"
|
|
||||||
- type: "file"
|
|
||||||
path: "nextflow_labels.config"
|
|
||||||
dest: "nextflow_labels.config"
|
|
||||||
description: "Add basic quality control metrics to an .h5mu file.\n\nThe metrics are\
|
|
||||||
\ comparable to what scanpy.pp.calculate_qc_metrics output,\nalthough they have\
|
|
||||||
\ slightly different names:\n\nVar metrics (name in this component -> name in scanpy):\n\
|
|
||||||
\ - pct_dropout -> pct_dropout_by_{expr_type}\n - num_nonzero_obs -> n_cells_by_{expr_type}\n\
|
|
||||||
\ - obs_mean -> mean_{expr_type}\n - total_counts -> total_{expr_type}\n\n Obs\
|
|
||||||
\ metrics:\n - num_nonzero_vars -> n_genes_by_{expr_type}\n - pct_{var_qc_metrics}\
|
|
||||||
\ -> pct_{expr_type}_{qc_var}\n - total_counts_{var_qc_metrics} -> total_{expr_type}_{qc_var}\n\
|
|
||||||
\ - pct_of_counts_in_top_{top_n_vars}_vars -> pct_{expr_type}_in_top_{n}_{var_type}\n\
|
|
||||||
\ - total_counts -> total_{expr_type}\n \n"
|
|
||||||
test_resources:
|
|
||||||
- type: "python_script"
|
|
||||||
path: "test.py"
|
|
||||||
is_executable: true
|
|
||||||
- type: "file"
|
|
||||||
path: "pbmc_1k_protein_v3_filtered_feature_bc_matrix.h5mu"
|
|
||||||
info: null
|
|
||||||
status: "enabled"
|
|
||||||
scope:
|
|
||||||
image: "public"
|
|
||||||
target: "public"
|
|
||||||
license: "MIT"
|
|
||||||
links:
|
|
||||||
repository: "https://github.com/openpipelines-bio/openpipeline"
|
|
||||||
docker_registry: "ghcr.io"
|
|
||||||
runners:
|
|
||||||
- type: "executable"
|
|
||||||
id: "executable"
|
|
||||||
docker_setup_strategy: "ifneedbepullelsecachedbuild"
|
|
||||||
- type: "nextflow"
|
|
||||||
id: "nextflow"
|
|
||||||
directives:
|
|
||||||
label:
|
|
||||||
- "singlecpu"
|
|
||||||
- "midmem"
|
|
||||||
tag: "$id"
|
|
||||||
auto:
|
|
||||||
simplifyInput: true
|
|
||||||
simplifyOutput: false
|
|
||||||
transcript: false
|
|
||||||
publish: false
|
|
||||||
config:
|
|
||||||
labels:
|
|
||||||
mem1gb: "memory = 1000000000.B"
|
|
||||||
mem2gb: "memory = 2000000000.B"
|
|
||||||
mem5gb: "memory = 5000000000.B"
|
|
||||||
mem10gb: "memory = 10000000000.B"
|
|
||||||
mem20gb: "memory = 20000000000.B"
|
|
||||||
mem50gb: "memory = 50000000000.B"
|
|
||||||
mem100gb: "memory = 100000000000.B"
|
|
||||||
mem200gb: "memory = 200000000000.B"
|
|
||||||
mem500gb: "memory = 500000000000.B"
|
|
||||||
mem1tb: "memory = 1000000000000.B"
|
|
||||||
mem2tb: "memory = 2000000000000.B"
|
|
||||||
mem5tb: "memory = 5000000000000.B"
|
|
||||||
mem10tb: "memory = 10000000000000.B"
|
|
||||||
mem20tb: "memory = 20000000000000.B"
|
|
||||||
mem50tb: "memory = 50000000000000.B"
|
|
||||||
mem100tb: "memory = 100000000000000.B"
|
|
||||||
mem200tb: "memory = 200000000000000.B"
|
|
||||||
mem500tb: "memory = 500000000000000.B"
|
|
||||||
mem1gib: "memory = 1073741824.B"
|
|
||||||
mem2gib: "memory = 2147483648.B"
|
|
||||||
mem4gib: "memory = 4294967296.B"
|
|
||||||
mem8gib: "memory = 8589934592.B"
|
|
||||||
mem16gib: "memory = 17179869184.B"
|
|
||||||
mem32gib: "memory = 34359738368.B"
|
|
||||||
mem64gib: "memory = 68719476736.B"
|
|
||||||
mem128gib: "memory = 137438953472.B"
|
|
||||||
mem256gib: "memory = 274877906944.B"
|
|
||||||
mem512gib: "memory = 549755813888.B"
|
|
||||||
mem1tib: "memory = 1099511627776.B"
|
|
||||||
mem2tib: "memory = 2199023255552.B"
|
|
||||||
mem4tib: "memory = 4398046511104.B"
|
|
||||||
mem8tib: "memory = 8796093022208.B"
|
|
||||||
mem16tib: "memory = 17592186044416.B"
|
|
||||||
mem32tib: "memory = 35184372088832.B"
|
|
||||||
mem64tib: "memory = 70368744177664.B"
|
|
||||||
mem128tib: "memory = 140737488355328.B"
|
|
||||||
mem256tib: "memory = 281474976710656.B"
|
|
||||||
mem512tib: "memory = 562949953421312.B"
|
|
||||||
cpu1: "cpus = 1"
|
|
||||||
cpu2: "cpus = 2"
|
|
||||||
cpu5: "cpus = 5"
|
|
||||||
cpu10: "cpus = 10"
|
|
||||||
cpu20: "cpus = 20"
|
|
||||||
cpu50: "cpus = 50"
|
|
||||||
cpu100: "cpus = 100"
|
|
||||||
cpu200: "cpus = 200"
|
|
||||||
cpu500: "cpus = 500"
|
|
||||||
cpu1000: "cpus = 1000"
|
|
||||||
script:
|
|
||||||
- "includeConfig(\"nextflow_labels.config\")"
|
|
||||||
debug: false
|
|
||||||
container: "docker"
|
|
||||||
engines:
|
|
||||||
- type: "docker"
|
|
||||||
id: "docker"
|
|
||||||
image: "python:3.11-slim"
|
|
||||||
target_tag: "2.1.0"
|
|
||||||
namespace_separator: "/"
|
|
||||||
setup:
|
|
||||||
- type: "apt"
|
|
||||||
packages:
|
|
||||||
- "procps"
|
|
||||||
interactive: false
|
|
||||||
- type: "python"
|
|
||||||
user: false
|
|
||||||
packages:
|
|
||||||
- "anndata~=0.11.1"
|
|
||||||
- "mudata~=0.3.1"
|
|
||||||
- "scipy"
|
|
||||||
script:
|
|
||||||
- "exec(\"try:\\n import awkward\\nexcept ModuleNotFoundError:\\n exit(0)\\\
|
|
||||||
nelse: exit(1)\")"
|
|
||||||
upgrade: true
|
|
||||||
test_setup:
|
|
||||||
- type: "apt"
|
|
||||||
packages:
|
|
||||||
- "git"
|
|
||||||
interactive: false
|
|
||||||
- type: "python"
|
|
||||||
user: false
|
|
||||||
packages:
|
|
||||||
- "viashpy==0.8.0"
|
|
||||||
github:
|
|
||||||
- "openpipelines-bio/core#subdirectory=packages/python/openpipeline_testutils"
|
|
||||||
upgrade: true
|
|
||||||
- type: "python"
|
|
||||||
user: false
|
|
||||||
packages:
|
|
||||||
- "scanpy"
|
|
||||||
upgrade: true
|
|
||||||
entrypoint: []
|
|
||||||
cmd: null
|
|
||||||
build_info:
|
|
||||||
config: "src/qc/calculate_qc_metrics/config.vsh.yaml"
|
|
||||||
runner: "nextflow"
|
|
||||||
engine: "docker"
|
|
||||||
output: "target/nextflow/qc/calculate_qc_metrics"
|
|
||||||
executable: "target/nextflow/qc/calculate_qc_metrics/main.nf"
|
|
||||||
viash_version: "0.9.4"
|
|
||||||
git_commit: "a0c9522486585774f76416150f8a3291409b5363"
|
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline"
|
|
||||||
git_tag: "2.1.1-2-ga0c95224865"
|
|
||||||
package_config:
|
|
||||||
name: "openpipeline"
|
|
||||||
summary: "Best-practice workflows for single-cell multi-omics analyses.\n"
|
|
||||||
description: "OpenPipelines are extensible single cell analysis pipelines for reproducible\
|
|
||||||
\ and large-scale single cell processing using [Viash](https://viash.io) and [Nextflow](https://www.nextflow.io/).\n\
|
|
||||||
\nIn terms of workflows, the following has been made available, but keep in mind\
|
|
||||||
\ that\nindividual tools and functionality can be executed as standalone components\
|
|
||||||
\ as well.\n\n * Demultiplexing: conversion of raw sequencing data to FASTQ objects.\n\
|
|
||||||
\ * Ingestion: Read mapping and generating a count matrix.\n * Single sample\
|
|
||||||
\ processing: cell filtering and doublet detection.\n * Multisample processing:\
|
|
||||||
\ Count transformation, normalization, QC metric calulations.\n * Integration:\
|
|
||||||
\ Clustering, integration and batch correction using single and multimodal methods.\n\
|
|
||||||
\ * Downstream analysis workflows\n"
|
|
||||||
info:
|
|
||||||
test_resources:
|
|
||||||
- type: "s3"
|
|
||||||
path: "s3://openpipelines-data"
|
|
||||||
dest: "resources_test"
|
|
||||||
viash_version: "0.9.4"
|
|
||||||
source: "src"
|
|
||||||
target: "target"
|
|
||||||
config_mods:
|
|
||||||
- ".resources += {path: '/src/workflows/utils/labels.config', dest: 'nextflow_labels.config'}\n\
|
|
||||||
.runners[.type == 'nextflow'].config.script := 'includeConfig(\"nextflow_labels.config\"\
|
|
||||||
)'"
|
|
||||||
- ".version := \"2.1.2\""
|
|
||||||
- ".engines[.type == 'docker'].target_tag := '2.1.0'"
|
|
||||||
keywords:
|
|
||||||
- "single-cell"
|
|
||||||
- "multimodal"
|
|
||||||
license: "MIT"
|
|
||||||
organization: "openpipelines-bio"
|
|
||||||
links:
|
|
||||||
repository: "https://github.com/openpipelines-bio/openpipeline"
|
|
||||||
docker_registry: "ghcr.io"
|
|
||||||
homepage: "https://openpipelines.bio"
|
|
||||||
documentation: "https://openpipelines.bio/fundamentals"
|
|
||||||
issue_tracker: "https://github.com/openpipelines-bio/openpipeline/issues"
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,27 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
# layer: "raw_counts"
|
|
||||||
|
|
||||||
# Metrics added to .obs
|
|
||||||
# var_qc_metrics: ["ercc,highly_variable,mitochondrial"]
|
|
||||||
# var_qc_metrics_fill_na_value: true
|
|
||||||
# top_n_vars: [123]
|
|
||||||
output_obs_num_nonzero_vars: "num_nonzero_vars"
|
|
||||||
output_obs_total_counts_vars: "total_counts"
|
|
||||||
|
|
||||||
# Metrics added to .var
|
|
||||||
output_var_num_nonzero_obs: "num_nonzero_obs"
|
|
||||||
output_var_total_counts_obs: "total_counts"
|
|
||||||
output_var_obs_mean: "obs_mean"
|
|
||||||
output_var_pct_dropout: "pct_dropout"
|
|
||||||
|
|
||||||
# Outputs
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,259 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema",
|
|
||||||
"title": "calculate_qc_metrics",
|
|
||||||
"description": "Add basic quality control metrics to an .h5mu file.\n\nThe metrics are comparable to what scanpy.pp.calculate_qc_metrics output,\nalthough they have slightly different names:\n\nVar metrics (name in this component -\u003e name in scanpy):\n - pct_dropout -\u003e pct_dropout_by_{expr_type}\n - num_nonzero_obs -\u003e n_cells_by_{expr_type}\n - obs_mean -\u003e mean_{expr_type}\n - total_counts -\u003e total_{expr_type}\n\n Obs metrics:\n - num_nonzero_vars -\u003e n_genes_by_{expr_type}\n - pct_{var_qc_metrics} -\u003e pct_{expr_type}_{qc_var}\n - total_counts_{var_qc_metrics} -\u003e total_{expr_type}_{qc_var}\n - pct_of_counts_in_top_{top_n_vars}_vars -\u003e pct_{expr_type}_in_top_{n}_{var_type}\n - total_counts -\u003e total_{expr_type}\n \n",
|
|
||||||
"type": "object",
|
|
||||||
"definitions": {
|
|
||||||
|
|
||||||
|
|
||||||
"Dataset input": {
|
|
||||||
"title": "Dataset input",
|
|
||||||
"type": "object",
|
|
||||||
"description": "Dataset input using nf-tower \"dataset\" or \"data explorer\". Allows for the input of multiple parameter sets to initialise a Nextflow channel.",
|
|
||||||
"properties": {
|
|
||||||
"param_list": {
|
|
||||||
"description": "Dataset input can either be a list of maps, a csv file, a json file, a yaml file, or simply a yaml blob. The names of the input fields (e.g. csv columns, json keys) need to be an exact match with the workflow input parameters.",
|
|
||||||
"default": "",
|
|
||||||
"format": "file-path",
|
|
||||||
"mimetype": "text/csv",
|
|
||||||
"pattern": "^\\S+\\.csv$"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"inputs" : {
|
|
||||||
"title": "Inputs",
|
|
||||||
"type": "object",
|
|
||||||
"description": "No description",
|
|
||||||
"properties": {
|
|
||||||
|
|
||||||
|
|
||||||
"input": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `file`, required, example: `input.h5mu`. Input h5mu file",
|
|
||||||
"help_text": "Type: `file`, required, example: `input.h5mu`. Input h5mu file"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"modality": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `rna`. ",
|
|
||||||
"help_text": "Type: `string`, default: `rna`. "
|
|
||||||
,
|
|
||||||
"default":"rna"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"layer": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, example: `raw_counts`. ",
|
|
||||||
"help_text": "Type: `string`, example: `raw_counts`. "
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"outputs" : {
|
|
||||||
"title": "Outputs",
|
|
||||||
"type": "object",
|
|
||||||
"description": "No description",
|
|
||||||
"properties": {
|
|
||||||
|
|
||||||
|
|
||||||
"output": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `file`, default: `$id.$key.output.h5mu`, example: `output.h5mu`. Output h5mu file",
|
|
||||||
"help_text": "Type: `file`, default: `$id.$key.output.h5mu`, example: `output.h5mu`. Output h5mu file."
|
|
||||||
,
|
|
||||||
"default":"$id.$key.output.h5mu"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_compression": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, example: `gzip`, choices: ``gzip`, `lzf``. The compression format to be used on the output h5mu object",
|
|
||||||
"help_text": "Type: `string`, example: `gzip`, choices: ``gzip`, `lzf``. The compression format to be used on the output h5mu object.",
|
|
||||||
"enum": ["gzip", "lzf"]
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"metrics added to .obs" : {
|
|
||||||
"title": "Metrics added to .obs",
|
|
||||||
"type": "object",
|
|
||||||
"description": "No description",
|
|
||||||
"properties": {
|
|
||||||
|
|
||||||
|
|
||||||
"var_qc_metrics": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: List of `string`, example: `ercc,highly_variable,mitochondrial`, multiple_sep: `\";\"`. Keys to select a boolean (containing only True or False) column from ",
|
|
||||||
"help_text": "Type: List of `string`, example: `ercc,highly_variable,mitochondrial`, multiple_sep: `\";\"`. Keys to select a boolean (containing only True or False) column from .var.\nFor each cell, calculate the proportion of total values for genes which are labeled \u0027True\u0027, \ncompared to the total sum of the values for all genes.\n"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"var_qc_metrics_fill_na_value": {
|
|
||||||
"type":
|
|
||||||
"boolean",
|
|
||||||
"description": "Type: `boolean`. Fill any \u0027NA\u0027 values found in the columns specified with --var_qc_metrics to \u0027True\u0027 or \u0027False\u0027",
|
|
||||||
"help_text": "Type: `boolean`. Fill any \u0027NA\u0027 values found in the columns specified with --var_qc_metrics to \u0027True\u0027 or \u0027False\u0027.\nas False.\n"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"top_n_vars": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: List of `integer`, multiple_sep: `\";\"`. Number of top vars to be used to calculate cumulative proportions",
|
|
||||||
"help_text": "Type: List of `integer`, multiple_sep: `\";\"`. Number of top vars to be used to calculate cumulative proportions.\nIf not specified, proportions are not calculated. `--top_n_vars 20;50` finds\ncumulative proportion to the 20th and 50th most expressed vars.\n"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_obs_num_nonzero_vars": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `num_nonzero_vars`. Name of column in ",
|
|
||||||
"help_text": "Type: `string`, default: `num_nonzero_vars`. Name of column in .obs describing, for each observation, the number of stored values\n(including explicit zeroes). In other words, the name of the column that counts\nfor each row the number of columns that contain data.\n"
|
|
||||||
,
|
|
||||||
"default":"num_nonzero_vars"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_obs_total_counts_vars": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `total_counts`. Name of the column for ",
|
|
||||||
"help_text": "Type: `string`, default: `total_counts`. Name of the column for .obs describing, for each observation (row),\nthe sum of the stored values in the columns.\n"
|
|
||||||
,
|
|
||||||
"default":"total_counts"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"metrics added to .var" : {
|
|
||||||
"title": "Metrics added to .var",
|
|
||||||
"type": "object",
|
|
||||||
"description": "No description",
|
|
||||||
"properties": {
|
|
||||||
|
|
||||||
|
|
||||||
"output_var_num_nonzero_obs": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `num_nonzero_obs`. Name of column describing, for each feature, the number of stored values\n(including explicit zeroes)",
|
|
||||||
"help_text": "Type: `string`, default: `num_nonzero_obs`. Name of column describing, for each feature, the number of stored values\n(including explicit zeroes). In other words, the name of the column that counts\nfor each column the number of rows that contain data.\n"
|
|
||||||
,
|
|
||||||
"default":"num_nonzero_obs"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_var_total_counts_obs": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `total_counts`. Name of the column in ",
|
|
||||||
"help_text": "Type: `string`, default: `total_counts`. Name of the column in .var describing, for each feature (column),\nthe sum of the stored values in the rows.\n"
|
|
||||||
,
|
|
||||||
"default":"total_counts"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_var_obs_mean": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `obs_mean`. Name of the column in ",
|
|
||||||
"help_text": "Type: `string`, default: `obs_mean`. Name of the column in .obs providing the mean of the values in each row.\n"
|
|
||||||
,
|
|
||||||
"default":"obs_mean"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_var_pct_dropout": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `pct_dropout`. Name of the column in ",
|
|
||||||
"help_text": "Type: `string`, default: `pct_dropout`. Name of the column in .obs providing for each feature the percentage of\nobservations the feature does not appear on (i.e. is missing). Same as `--num_nonzero_obs`\nbut percentage based.\n"
|
|
||||||
,
|
|
||||||
"default":"pct_dropout"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"nextflow input-output arguments" : {
|
|
||||||
"title": "Nextflow input-output arguments",
|
|
||||||
"type": "object",
|
|
||||||
"description": "Input/output parameters for Nextflow itself. Please note that both publishDir and publish_dir are supported but at least one has to be configured.",
|
|
||||||
"properties": {
|
|
||||||
|
|
||||||
|
|
||||||
"publish_dir": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, required, example: `output/`. Path to an output directory",
|
|
||||||
"help_text": "Type: `string`, required, example: `output/`. Path to an output directory."
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"allOf": [
|
|
||||||
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/inputs"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/outputs"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/metrics added to .obs"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/metrics added to .var"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/nextflow input-output arguments"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,406 +0,0 @@
|
|||||||
name: "qc"
|
|
||||||
namespace: "workflows/qc"
|
|
||||||
version: "2.1.2"
|
|
||||||
authors:
|
|
||||||
- name: "Dries Schaumont"
|
|
||||||
roles:
|
|
||||||
- "author"
|
|
||||||
- "maintainer"
|
|
||||||
info:
|
|
||||||
role: "Core Team Member"
|
|
||||||
links:
|
|
||||||
email: "dries@data-intuitive.com"
|
|
||||||
github: "DriesSchaumont"
|
|
||||||
orcid: "0000-0002-4389-0440"
|
|
||||||
linkedin: "dries-schaumont"
|
|
||||||
organizations:
|
|
||||||
- name: "Data Intuitive"
|
|
||||||
href: "https://www.data-intuitive.com"
|
|
||||||
role: "Data Scientist"
|
|
||||||
argument_groups:
|
|
||||||
- name: "Inputs"
|
|
||||||
arguments:
|
|
||||||
- type: "string"
|
|
||||||
name: "--id"
|
|
||||||
description: "ID of the sample."
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "foo"
|
|
||||||
required: true
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "file"
|
|
||||||
name: "--input"
|
|
||||||
alternatives:
|
|
||||||
- "-i"
|
|
||||||
description: "Path to the sample."
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "input.h5mu"
|
|
||||||
must_exist: true
|
|
||||||
create_parent: true
|
|
||||||
required: true
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--modality"
|
|
||||||
description: "Which modality to process."
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "rna"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--layer"
|
|
||||||
description: "Layer to calculate qc metrics for."
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "raw_counts"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- name: "Mitochondrial & Ribosomal Gene Detection"
|
|
||||||
arguments:
|
|
||||||
- type: "string"
|
|
||||||
name: "--var_gene_names"
|
|
||||||
description: ".var column name to be used to detect mitochondrial/ribosomal genes\
|
|
||||||
\ instead of .var_names (default if not set).\nGene names matching with the\
|
|
||||||
\ regex value from --mitochondrial_gene_regex or --ribosomal_gene_regex will\
|
|
||||||
\ be \nidentified as mitochondrial or ribosomal genes, respectively.\n"
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "gene_symbol"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--var_name_mitochondrial_genes"
|
|
||||||
description: "In which .var slot to store a boolean array corresponding the mitochondrial\
|
|
||||||
\ genes.\n"
|
|
||||||
info: null
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--obs_name_mitochondrial_fraction"
|
|
||||||
description: ".Obs slot to store the fraction of reads found to be mitochondrial.\
|
|
||||||
\ Defaults to 'fraction_' suffixed by the value of --var_name_mitochondrial_genes\n"
|
|
||||||
info: null
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--mitochondrial_gene_regex"
|
|
||||||
description: "Regex string that identifies mitochondrial genes from --var_gene_names.\n\
|
|
||||||
By default will detect human and mouse mitochondrial genes from a gene symbol.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "^[mM][tT]-"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--var_name_ribosomal_genes"
|
|
||||||
description: "In which .var slot to store a boolean array corresponding the ribosomal\
|
|
||||||
\ genes.\n"
|
|
||||||
info: null
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--obs_name_ribosomal_fraction"
|
|
||||||
description: "When specified, write the fraction of counts originating from ribosomal\
|
|
||||||
\ genes \n(based on --ribosomal_gene_regex) to an .obs column with the specified\
|
|
||||||
\ name.\nRequires --var_name_ribosomal_genes.\n"
|
|
||||||
info: null
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--ribosomal_gene_regex"
|
|
||||||
description: "Regex string that identifies ribosomal genes from --var_gene_names.\n\
|
|
||||||
By default will detect human and mouse ribosomal genes from a gene symbol.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "^[Mm]?[Rr][Pp][LlSs]"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- name: "QC metrics calculation options"
|
|
||||||
arguments:
|
|
||||||
- type: "string"
|
|
||||||
name: "--var_qc_metrics"
|
|
||||||
description: "Keys to select a boolean (containing only True or False) column\
|
|
||||||
\ from .var.\nFor each cell, calculate the proportion of total values for genes\
|
|
||||||
\ which are labeled 'True', \ncompared to the total sum of the values for all\
|
|
||||||
\ genes. Defaults to the value from\n--var_name_mitochondrial_genes.\n"
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "ercc,highly_variable"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: true
|
|
||||||
multiple_sep: ","
|
|
||||||
- type: "integer"
|
|
||||||
name: "--top_n_vars"
|
|
||||||
description: "Number of top vars to be used to calculate cumulative proportions.\n\
|
|
||||||
If not specified, proportions are not calculated. `--top_n_vars 20,50` finds\n\
|
|
||||||
cumulative proportion to the 20th and 50th most expressed vars.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- 50
|
|
||||||
- 100
|
|
||||||
- 200
|
|
||||||
- 500
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: true
|
|
||||||
multiple_sep: ","
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_obs_num_nonzero_vars"
|
|
||||||
description: "Name of column in .obs describing, for each observation, the number\
|
|
||||||
\ of stored values\n(including explicit zeroes). In other words, the name of\
|
|
||||||
\ the column that counts\nfor each row the number of columns that contain data.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "num_nonzero_vars"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_obs_total_counts_vars"
|
|
||||||
description: "Name of the column for .obs describing, for each observation (row),\n\
|
|
||||||
the sum of the stored values in the columns.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "total_counts"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_var_num_nonzero_obs"
|
|
||||||
description: "Name of column describing, for each feature, the number of stored\
|
|
||||||
\ values\n(including explicit zeroes). In other words, the name of the column\
|
|
||||||
\ that counts\nfor each column the number of rows that contain data.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "num_nonzero_obs"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_var_total_counts_obs"
|
|
||||||
description: "Name of the column in .var describing, for each feature (column),\n\
|
|
||||||
the sum of the stored values in the rows.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "total_counts"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_var_obs_mean"
|
|
||||||
description: "Name of the column in .obs providing the mean of the values in each\
|
|
||||||
\ row.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "obs_mean"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- type: "string"
|
|
||||||
name: "--output_var_pct_dropout"
|
|
||||||
description: "Name of the column in .obs providing for each feature the percentage\
|
|
||||||
\ of\nobservations the feature does not appear on (i.e. is missing). Same as\
|
|
||||||
\ `--output_var_num_nonzero_obs`\nbut percentage based.\n"
|
|
||||||
info: null
|
|
||||||
default:
|
|
||||||
- "pct_dropout"
|
|
||||||
required: false
|
|
||||||
direction: "input"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
- name: "Outputs"
|
|
||||||
arguments:
|
|
||||||
- type: "file"
|
|
||||||
name: "--output"
|
|
||||||
description: "Destination path to the output."
|
|
||||||
info: null
|
|
||||||
example:
|
|
||||||
- "output.h5mu"
|
|
||||||
must_exist: true
|
|
||||||
create_parent: true
|
|
||||||
required: true
|
|
||||||
direction: "output"
|
|
||||||
multiple: false
|
|
||||||
multiple_sep: ";"
|
|
||||||
resources:
|
|
||||||
- type: "nextflow_script"
|
|
||||||
path: "main.nf"
|
|
||||||
is_executable: true
|
|
||||||
entrypoint: "run_wf"
|
|
||||||
- type: "file"
|
|
||||||
path: "utils"
|
|
||||||
- type: "file"
|
|
||||||
path: "nextflow_labels.config"
|
|
||||||
dest: "nextflow_labels.config"
|
|
||||||
description: "A pipeline to add basic qc statistics to a MuData "
|
|
||||||
test_resources:
|
|
||||||
- type: "nextflow_script"
|
|
||||||
path: "test.nf"
|
|
||||||
is_executable: true
|
|
||||||
entrypoint: "test_wf"
|
|
||||||
- type: "file"
|
|
||||||
path: "concat_test_data"
|
|
||||||
- type: "file"
|
|
||||||
path: "pbmc_1k_protein_v3"
|
|
||||||
info:
|
|
||||||
test_dependencies:
|
|
||||||
- name: "qc_test"
|
|
||||||
namespace: "test_workflows/qc"
|
|
||||||
status: "enabled"
|
|
||||||
scope:
|
|
||||||
image: "public"
|
|
||||||
target: "public"
|
|
||||||
dependencies:
|
|
||||||
- name: "metadata/grep_annotation_column"
|
|
||||||
repository:
|
|
||||||
type: "local"
|
|
||||||
- name: "qc/calculate_qc_metrics"
|
|
||||||
repository:
|
|
||||||
type: "local"
|
|
||||||
license: "MIT"
|
|
||||||
links:
|
|
||||||
repository: "https://github.com/openpipelines-bio/openpipeline"
|
|
||||||
docker_registry: "ghcr.io"
|
|
||||||
runners:
|
|
||||||
- type: "nextflow"
|
|
||||||
id: "nextflow"
|
|
||||||
directives:
|
|
||||||
tag: "$id"
|
|
||||||
auto:
|
|
||||||
simplifyInput: true
|
|
||||||
simplifyOutput: false
|
|
||||||
transcript: false
|
|
||||||
publish: false
|
|
||||||
config:
|
|
||||||
labels:
|
|
||||||
mem1gb: "memory = 1000000000.B"
|
|
||||||
mem2gb: "memory = 2000000000.B"
|
|
||||||
mem5gb: "memory = 5000000000.B"
|
|
||||||
mem10gb: "memory = 10000000000.B"
|
|
||||||
mem20gb: "memory = 20000000000.B"
|
|
||||||
mem50gb: "memory = 50000000000.B"
|
|
||||||
mem100gb: "memory = 100000000000.B"
|
|
||||||
mem200gb: "memory = 200000000000.B"
|
|
||||||
mem500gb: "memory = 500000000000.B"
|
|
||||||
mem1tb: "memory = 1000000000000.B"
|
|
||||||
mem2tb: "memory = 2000000000000.B"
|
|
||||||
mem5tb: "memory = 5000000000000.B"
|
|
||||||
mem10tb: "memory = 10000000000000.B"
|
|
||||||
mem20tb: "memory = 20000000000000.B"
|
|
||||||
mem50tb: "memory = 50000000000000.B"
|
|
||||||
mem100tb: "memory = 100000000000000.B"
|
|
||||||
mem200tb: "memory = 200000000000000.B"
|
|
||||||
mem500tb: "memory = 500000000000000.B"
|
|
||||||
mem1gib: "memory = 1073741824.B"
|
|
||||||
mem2gib: "memory = 2147483648.B"
|
|
||||||
mem4gib: "memory = 4294967296.B"
|
|
||||||
mem8gib: "memory = 8589934592.B"
|
|
||||||
mem16gib: "memory = 17179869184.B"
|
|
||||||
mem32gib: "memory = 34359738368.B"
|
|
||||||
mem64gib: "memory = 68719476736.B"
|
|
||||||
mem128gib: "memory = 137438953472.B"
|
|
||||||
mem256gib: "memory = 274877906944.B"
|
|
||||||
mem512gib: "memory = 549755813888.B"
|
|
||||||
mem1tib: "memory = 1099511627776.B"
|
|
||||||
mem2tib: "memory = 2199023255552.B"
|
|
||||||
mem4tib: "memory = 4398046511104.B"
|
|
||||||
mem8tib: "memory = 8796093022208.B"
|
|
||||||
mem16tib: "memory = 17592186044416.B"
|
|
||||||
mem32tib: "memory = 35184372088832.B"
|
|
||||||
mem64tib: "memory = 70368744177664.B"
|
|
||||||
mem128tib: "memory = 140737488355328.B"
|
|
||||||
mem256tib: "memory = 281474976710656.B"
|
|
||||||
mem512tib: "memory = 562949953421312.B"
|
|
||||||
cpu1: "cpus = 1"
|
|
||||||
cpu2: "cpus = 2"
|
|
||||||
cpu5: "cpus = 5"
|
|
||||||
cpu10: "cpus = 10"
|
|
||||||
cpu20: "cpus = 20"
|
|
||||||
cpu50: "cpus = 50"
|
|
||||||
cpu100: "cpus = 100"
|
|
||||||
cpu200: "cpus = 200"
|
|
||||||
cpu500: "cpus = 500"
|
|
||||||
cpu1000: "cpus = 1000"
|
|
||||||
script:
|
|
||||||
- "includeConfig(\"nextflow_labels.config\")"
|
|
||||||
debug: false
|
|
||||||
container: "docker"
|
|
||||||
build_info:
|
|
||||||
config: "src/workflows/qc/qc/config.vsh.yaml"
|
|
||||||
runner: "nextflow"
|
|
||||||
engine: "native"
|
|
||||||
output: "target/nextflow/workflows/qc/qc"
|
|
||||||
executable: "target/nextflow/workflows/qc/qc/main.nf"
|
|
||||||
viash_version: "0.9.4"
|
|
||||||
git_commit: "a0c9522486585774f76416150f8a3291409b5363"
|
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline"
|
|
||||||
git_tag: "2.1.1-2-ga0c95224865"
|
|
||||||
dependencies:
|
|
||||||
- "target/nextflow/metadata/grep_annotation_column"
|
|
||||||
- "target/nextflow/qc/calculate_qc_metrics"
|
|
||||||
package_config:
|
|
||||||
name: "openpipeline"
|
|
||||||
summary: "Best-practice workflows for single-cell multi-omics analyses.\n"
|
|
||||||
description: "OpenPipelines are extensible single cell analysis pipelines for reproducible\
|
|
||||||
\ and large-scale single cell processing using [Viash](https://viash.io) and [Nextflow](https://www.nextflow.io/).\n\
|
|
||||||
\nIn terms of workflows, the following has been made available, but keep in mind\
|
|
||||||
\ that\nindividual tools and functionality can be executed as standalone components\
|
|
||||||
\ as well.\n\n * Demultiplexing: conversion of raw sequencing data to FASTQ objects.\n\
|
|
||||||
\ * Ingestion: Read mapping and generating a count matrix.\n * Single sample\
|
|
||||||
\ processing: cell filtering and doublet detection.\n * Multisample processing:\
|
|
||||||
\ Count transformation, normalization, QC metric calulations.\n * Integration:\
|
|
||||||
\ Clustering, integration and batch correction using single and multimodal methods.\n\
|
|
||||||
\ * Downstream analysis workflows\n"
|
|
||||||
info:
|
|
||||||
test_resources:
|
|
||||||
- type: "s3"
|
|
||||||
path: "s3://openpipelines-data"
|
|
||||||
dest: "resources_test"
|
|
||||||
viash_version: "0.9.4"
|
|
||||||
source: "src"
|
|
||||||
target: "target"
|
|
||||||
config_mods:
|
|
||||||
- ".resources += {path: '/src/workflows/utils/labels.config', dest: 'nextflow_labels.config'}\n\
|
|
||||||
.runners[.type == 'nextflow'].config.script := 'includeConfig(\"nextflow_labels.config\"\
|
|
||||||
)'"
|
|
||||||
- ".version := \"2.1.2\""
|
|
||||||
keywords:
|
|
||||||
- "single-cell"
|
|
||||||
- "multimodal"
|
|
||||||
license: "MIT"
|
|
||||||
organization: "openpipelines-bio"
|
|
||||||
links:
|
|
||||||
repository: "https://github.com/openpipelines-bio/openpipeline"
|
|
||||||
docker_registry: "ghcr.io"
|
|
||||||
homepage: "https://openpipelines.bio"
|
|
||||||
documentation: "https://openpipelines.bio/fundamentals"
|
|
||||||
issue_tracker: "https://github.com/openpipelines-bio/openpipeline/issues"
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,33 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
id: # please fill in - example: "foo"
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
# layer: "raw_counts"
|
|
||||||
|
|
||||||
# Mitochondrial & Ribosomal Gene Detection
|
|
||||||
# var_gene_names: "gene_symbol"
|
|
||||||
# var_name_mitochondrial_genes: "foo"
|
|
||||||
# obs_name_mitochondrial_fraction: "foo"
|
|
||||||
mitochondrial_gene_regex: "^[mM][tT]-"
|
|
||||||
# var_name_ribosomal_genes: "foo"
|
|
||||||
# obs_name_ribosomal_fraction: "foo"
|
|
||||||
ribosomal_gene_regex: "^[Mm]?[Rr][Pp][LlSs]"
|
|
||||||
|
|
||||||
# QC metrics calculation options
|
|
||||||
# var_qc_metrics: ["ercc,highly_variable"]
|
|
||||||
top_n_vars: [50, 100, 200, 500]
|
|
||||||
output_obs_num_nonzero_vars: "num_nonzero_vars"
|
|
||||||
output_obs_total_counts_vars: "total_counts"
|
|
||||||
output_var_num_nonzero_obs: "num_nonzero_obs"
|
|
||||||
output_var_total_counts_obs: "total_counts"
|
|
||||||
output_var_obs_mean: "obs_mean"
|
|
||||||
output_var_pct_dropout: "pct_dropout"
|
|
||||||
|
|
||||||
# Outputs
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,320 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema",
|
|
||||||
"title": "qc",
|
|
||||||
"description": "A pipeline to add basic qc statistics to a MuData ",
|
|
||||||
"type": "object",
|
|
||||||
"definitions": {
|
|
||||||
|
|
||||||
|
|
||||||
"Dataset input": {
|
|
||||||
"title": "Dataset input",
|
|
||||||
"type": "object",
|
|
||||||
"description": "Dataset input using nf-tower \"dataset\" or \"data explorer\". Allows for the input of multiple parameter sets to initialise a Nextflow channel.",
|
|
||||||
"properties": {
|
|
||||||
"param_list": {
|
|
||||||
"description": "Dataset input can either be a list of maps, a csv file, a json file, a yaml file, or simply a yaml blob. The names of the input fields (e.g. csv columns, json keys) need to be an exact match with the workflow input parameters.",
|
|
||||||
"default": "",
|
|
||||||
"format": "file-path",
|
|
||||||
"mimetype": "text/csv",
|
|
||||||
"pattern": "^\\S+\\.csv$"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"inputs" : {
|
|
||||||
"title": "Inputs",
|
|
||||||
"type": "object",
|
|
||||||
"description": "No description",
|
|
||||||
"properties": {
|
|
||||||
|
|
||||||
|
|
||||||
"id": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, required, example: `foo`. ID of the sample",
|
|
||||||
"help_text": "Type: `string`, required, example: `foo`. ID of the sample."
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"input": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `file`, required, example: `input.h5mu`. Path to the sample",
|
|
||||||
"help_text": "Type: `file`, required, example: `input.h5mu`. Path to the sample."
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"modality": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `rna`. Which modality to process",
|
|
||||||
"help_text": "Type: `string`, default: `rna`. Which modality to process."
|
|
||||||
,
|
|
||||||
"default":"rna"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"layer": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, example: `raw_counts`. Layer to calculate qc metrics for",
|
|
||||||
"help_text": "Type: `string`, example: `raw_counts`. Layer to calculate qc metrics for."
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"outputs" : {
|
|
||||||
"title": "Outputs",
|
|
||||||
"type": "object",
|
|
||||||
"description": "No description",
|
|
||||||
"properties": {
|
|
||||||
|
|
||||||
|
|
||||||
"output": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `file`, required, default: `$id.$key.output.h5mu`, example: `output.h5mu`. Destination path to the output",
|
|
||||||
"help_text": "Type: `file`, required, default: `$id.$key.output.h5mu`, example: `output.h5mu`. Destination path to the output."
|
|
||||||
,
|
|
||||||
"default":"$id.$key.output.h5mu"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"mitochondrial & ribosomal gene detection" : {
|
|
||||||
"title": "Mitochondrial & Ribosomal Gene Detection",
|
|
||||||
"type": "object",
|
|
||||||
"description": "No description",
|
|
||||||
"properties": {
|
|
||||||
|
|
||||||
|
|
||||||
"var_gene_names": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, example: `gene_symbol`. ",
|
|
||||||
"help_text": "Type: `string`, example: `gene_symbol`. .var column name to be used to detect mitochondrial/ribosomal genes instead of .var_names (default if not set).\nGene names matching with the regex value from --mitochondrial_gene_regex or --ribosomal_gene_regex will be \nidentified as mitochondrial or ribosomal genes, respectively.\n"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"var_name_mitochondrial_genes": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`. In which ",
|
|
||||||
"help_text": "Type: `string`. In which .var slot to store a boolean array corresponding the mitochondrial genes.\n"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"obs_name_mitochondrial_fraction": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`. ",
|
|
||||||
"help_text": "Type: `string`. .Obs slot to store the fraction of reads found to be mitochondrial. Defaults to \u0027fraction_\u0027 suffixed by the value of --var_name_mitochondrial_genes\n"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"mitochondrial_gene_regex": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `^[mM][tT]-`. Regex string that identifies mitochondrial genes from --var_gene_names",
|
|
||||||
"help_text": "Type: `string`, default: `^[mM][tT]-`. Regex string that identifies mitochondrial genes from --var_gene_names.\nBy default will detect human and mouse mitochondrial genes from a gene symbol.\n"
|
|
||||||
,
|
|
||||||
"default":"^[mM][tT]-"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"var_name_ribosomal_genes": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`. In which ",
|
|
||||||
"help_text": "Type: `string`. In which .var slot to store a boolean array corresponding the ribosomal genes.\n"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"obs_name_ribosomal_fraction": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`. When specified, write the fraction of counts originating from ribosomal genes \n(based on --ribosomal_gene_regex) to an ",
|
|
||||||
"help_text": "Type: `string`. When specified, write the fraction of counts originating from ribosomal genes \n(based on --ribosomal_gene_regex) to an .obs column with the specified name.\nRequires --var_name_ribosomal_genes.\n"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"ribosomal_gene_regex": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `^[Mm]?[Rr][Pp][LlSs]`. Regex string that identifies ribosomal genes from --var_gene_names",
|
|
||||||
"help_text": "Type: `string`, default: `^[Mm]?[Rr][Pp][LlSs]`. Regex string that identifies ribosomal genes from --var_gene_names.\nBy default will detect human and mouse ribosomal genes from a gene symbol.\n"
|
|
||||||
,
|
|
||||||
"default":"^[Mm]?[Rr][Pp][LlSs]"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"qc metrics calculation options" : {
|
|
||||||
"title": "QC metrics calculation options",
|
|
||||||
"type": "object",
|
|
||||||
"description": "No description",
|
|
||||||
"properties": {
|
|
||||||
|
|
||||||
|
|
||||||
"var_qc_metrics": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: List of `string`, example: `ercc,highly_variable`, multiple_sep: `\",\"`. Keys to select a boolean (containing only True or False) column from ",
|
|
||||||
"help_text": "Type: List of `string`, example: `ercc,highly_variable`, multiple_sep: `\",\"`. Keys to select a boolean (containing only True or False) column from .var.\nFor each cell, calculate the proportion of total values for genes which are labeled \u0027True\u0027, \ncompared to the total sum of the values for all genes. Defaults to the value from\n--var_name_mitochondrial_genes.\n"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"top_n_vars": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: List of `integer`, default: `50,100,200,500`, multiple_sep: `\",\"`. Number of top vars to be used to calculate cumulative proportions",
|
|
||||||
"help_text": "Type: List of `integer`, default: `50,100,200,500`, multiple_sep: `\",\"`. Number of top vars to be used to calculate cumulative proportions.\nIf not specified, proportions are not calculated. `--top_n_vars 20,50` finds\ncumulative proportion to the 20th and 50th most expressed vars.\n"
|
|
||||||
,
|
|
||||||
"default":"50,100,200,500"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_obs_num_nonzero_vars": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `num_nonzero_vars`. Name of column in ",
|
|
||||||
"help_text": "Type: `string`, default: `num_nonzero_vars`. Name of column in .obs describing, for each observation, the number of stored values\n(including explicit zeroes). In other words, the name of the column that counts\nfor each row the number of columns that contain data.\n"
|
|
||||||
,
|
|
||||||
"default":"num_nonzero_vars"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_obs_total_counts_vars": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `total_counts`. Name of the column for ",
|
|
||||||
"help_text": "Type: `string`, default: `total_counts`. Name of the column for .obs describing, for each observation (row),\nthe sum of the stored values in the columns.\n"
|
|
||||||
,
|
|
||||||
"default":"total_counts"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_var_num_nonzero_obs": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `num_nonzero_obs`. Name of column describing, for each feature, the number of stored values\n(including explicit zeroes)",
|
|
||||||
"help_text": "Type: `string`, default: `num_nonzero_obs`. Name of column describing, for each feature, the number of stored values\n(including explicit zeroes). In other words, the name of the column that counts\nfor each column the number of rows that contain data.\n"
|
|
||||||
,
|
|
||||||
"default":"num_nonzero_obs"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_var_total_counts_obs": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `total_counts`. Name of the column in ",
|
|
||||||
"help_text": "Type: `string`, default: `total_counts`. Name of the column in .var describing, for each feature (column),\nthe sum of the stored values in the rows.\n"
|
|
||||||
,
|
|
||||||
"default":"total_counts"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_var_obs_mean": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `obs_mean`. Name of the column in ",
|
|
||||||
"help_text": "Type: `string`, default: `obs_mean`. Name of the column in .obs providing the mean of the values in each row.\n"
|
|
||||||
,
|
|
||||||
"default":"obs_mean"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
"output_var_pct_dropout": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, default: `pct_dropout`. Name of the column in ",
|
|
||||||
"help_text": "Type: `string`, default: `pct_dropout`. Name of the column in .obs providing for each feature the percentage of\nobservations the feature does not appear on (i.e. is missing). Same as `--output_var_num_nonzero_obs`\nbut percentage based.\n"
|
|
||||||
,
|
|
||||||
"default":"pct_dropout"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"nextflow input-output arguments" : {
|
|
||||||
"title": "Nextflow input-output arguments",
|
|
||||||
"type": "object",
|
|
||||||
"description": "Input/output parameters for Nextflow itself. Please note that both publishDir and publish_dir are supported but at least one has to be configured.",
|
|
||||||
"properties": {
|
|
||||||
|
|
||||||
|
|
||||||
"publish_dir": {
|
|
||||||
"type":
|
|
||||||
"string",
|
|
||||||
"description": "Type: `string`, required, example: `output/`. Path to an output directory",
|
|
||||||
"help_text": "Type: `string`, required, example: `output/`. Path to an output directory."
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"allOf": [
|
|
||||||
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/inputs"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/outputs"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/mitochondrial & ribosomal gene detection"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/qc metrics calculation options"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/nextflow input-output arguments"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
obsp_connectivities: "connectivities"
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
obsm_name: "leiden"
|
|
||||||
resolution: # please fill in - example: [1.0]
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: ["sample_paths"]
|
|
||||||
# modality: ["foo"]
|
|
||||||
# input_id: ["foo"]
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
obs_sample_name: "sample_id"
|
|
||||||
other_axis_mode: "move"
|
|
||||||
uns_merge_mode: "make_unique"
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: ["sample_paths"]
|
|
||||||
# output: "output.h5mu"
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: "sample_path"
|
|
||||||
# output: "$id.$key.output"
|
|
||||||
# output_types: "$id.$key.output_types.csv"
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
# layer: "foo"
|
|
||||||
# var_input: "filter_with_hvg"
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
obsm_output: "X_pca"
|
|
||||||
varm_output: "pca_loadings"
|
|
||||||
uns_output: "pca_variance"
|
|
||||||
# num_components: 25
|
|
||||||
overwrite: false
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
uns_neighbors: "neighbors"
|
|
||||||
|
|
||||||
# Outputs
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
obsm_output: "umap"
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
min_dist: 0.5
|
|
||||||
spread: 1.0
|
|
||||||
num_components: 2
|
|
||||||
# max_iter: 123
|
|
||||||
alpha: 1.0
|
|
||||||
gamma: 1.0
|
|
||||||
negative_sample_rate: 5
|
|
||||||
init_pos: "spectral"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
# layer: "foo"
|
|
||||||
# var_input: "foo"
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
var_name_filter: "filter_with_hvg"
|
|
||||||
varm_name: "hvg"
|
|
||||||
flavor: "seurat"
|
|
||||||
# n_top_features: 123
|
|
||||||
min_mean: 0.0125
|
|
||||||
max_mean: 3.0
|
|
||||||
min_disp: 0.5
|
|
||||||
# max_disp: 123.0
|
|
||||||
span: 0.3
|
|
||||||
n_bins: 20
|
|
||||||
# obs_batch_key: "foo"
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
obs_fraction_column: # please fill in - example: "fraction_mitochondrial"
|
|
||||||
|
|
||||||
# Outputs
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
obs_name_filter: # please fill in - example: "foo"
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
min_fraction: 0.0
|
|
||||||
max_fraction: 1.0
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
# obs_filter: ["filter_with_x"]
|
|
||||||
# var_filter: ["filter_with_x"]
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
# layer: "raw_counts"
|
|
||||||
|
|
||||||
# Outputs
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
do_subset: false
|
|
||||||
obs_name_filter: "filter_with_counts"
|
|
||||||
var_name_filter: "filter_with_counts"
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
# min_counts: 200
|
|
||||||
# max_counts: 5000000
|
|
||||||
# min_genes_per_cell: 200
|
|
||||||
# max_genes_per_cell: 1500000
|
|
||||||
# min_cells_per_gene: 3
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
# layer: "foo"
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
obs_name_filter: "filter_with_scrublet"
|
|
||||||
do_subset: false
|
|
||||||
obs_name_doublet_score: "scrublet_doublet_score"
|
|
||||||
# expected_doublet_rate: 123.0
|
|
||||||
# stdev_doublet_rate: 123.0
|
|
||||||
# n_neighbors: 123
|
|
||||||
# sim_doublet_ratio: 123.0
|
|
||||||
min_counts: 2
|
|
||||||
min_cells: 3
|
|
||||||
min_gene_variablity_percent: 85.0
|
|
||||||
num_pca_components: 30
|
|
||||||
distance_metric: "euclidean"
|
|
||||||
allow_automatic_threshold_detection_fail: false
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: "sample_path"
|
|
||||||
input_id: # please fill in - example: "foo"
|
|
||||||
obs_output: "sample_id"
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
make_observation_keys_unique: false
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
manifest {
|
|
||||||
name = 'metadata/grep_annotation_column'
|
|
||||||
mainScript = 'main.nf'
|
|
||||||
nextflowVersion = '!>=20.12.1-edge'
|
|
||||||
version = 'disable-scrublet_build'
|
|
||||||
description = 'Perform a regex lookup on a column from the annotation matrices .obs or .var.\nThe annotation matrix can originate from either a modality, or all modalities (global .var or .obs).\n'
|
|
||||||
author = 'Dries Schaumont'
|
|
||||||
}
|
|
||||||
|
|
||||||
process.container = 'nextflow/bash:latest'
|
|
||||||
|
|
||||||
// detect tempdir
|
|
||||||
tempDir = java.nio.file.Paths.get(
|
|
||||||
System.getenv('NXF_TEMP') ?:
|
|
||||||
System.getenv('VIASH_TEMP') ?:
|
|
||||||
System.getenv('TEMPDIR') ?:
|
|
||||||
System.getenv('TMPDIR') ?:
|
|
||||||
'/tmp'
|
|
||||||
).toAbsolutePath()
|
|
||||||
|
|
||||||
profiles {
|
|
||||||
no_publish {
|
|
||||||
process {
|
|
||||||
withName: '.*' {
|
|
||||||
publishDir = [
|
|
||||||
enabled: false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mount_temp {
|
|
||||||
docker.temp = tempDir
|
|
||||||
podman.temp = tempDir
|
|
||||||
charliecloud.temp = tempDir
|
|
||||||
}
|
|
||||||
docker {
|
|
||||||
docker.enabled = true
|
|
||||||
// docker.userEmulation = true
|
|
||||||
singularity.enabled = false
|
|
||||||
podman.enabled = false
|
|
||||||
shifter.enabled = false
|
|
||||||
charliecloud.enabled = false
|
|
||||||
}
|
|
||||||
singularity {
|
|
||||||
singularity.enabled = true
|
|
||||||
singularity.autoMounts = true
|
|
||||||
docker.enabled = false
|
|
||||||
podman.enabled = false
|
|
||||||
shifter.enabled = false
|
|
||||||
charliecloud.enabled = false
|
|
||||||
}
|
|
||||||
podman {
|
|
||||||
podman.enabled = true
|
|
||||||
docker.enabled = false
|
|
||||||
singularity.enabled = false
|
|
||||||
shifter.enabled = false
|
|
||||||
charliecloud.enabled = false
|
|
||||||
}
|
|
||||||
shifter {
|
|
||||||
shifter.enabled = true
|
|
||||||
docker.enabled = false
|
|
||||||
singularity.enabled = false
|
|
||||||
podman.enabled = false
|
|
||||||
charliecloud.enabled = false
|
|
||||||
}
|
|
||||||
charliecloud {
|
|
||||||
charliecloud.enabled = true
|
|
||||||
docker.enabled = false
|
|
||||||
singularity.enabled = false
|
|
||||||
podman.enabled = false
|
|
||||||
shifter.enabled = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
process{
|
|
||||||
withLabel: mem1gb { memory = 1000000000.B }
|
|
||||||
withLabel: mem2gb { memory = 2000000000.B }
|
|
||||||
withLabel: mem5gb { memory = 5000000000.B }
|
|
||||||
withLabel: mem10gb { memory = 10000000000.B }
|
|
||||||
withLabel: mem20gb { memory = 20000000000.B }
|
|
||||||
withLabel: mem50gb { memory = 50000000000.B }
|
|
||||||
withLabel: mem100gb { memory = 100000000000.B }
|
|
||||||
withLabel: mem200gb { memory = 200000000000.B }
|
|
||||||
withLabel: mem500gb { memory = 500000000000.B }
|
|
||||||
withLabel: mem1tb { memory = 1000000000000.B }
|
|
||||||
withLabel: mem2tb { memory = 2000000000000.B }
|
|
||||||
withLabel: mem5tb { memory = 5000000000000.B }
|
|
||||||
withLabel: mem10tb { memory = 10000000000000.B }
|
|
||||||
withLabel: mem20tb { memory = 20000000000000.B }
|
|
||||||
withLabel: mem50tb { memory = 50000000000000.B }
|
|
||||||
withLabel: mem100tb { memory = 100000000000000.B }
|
|
||||||
withLabel: mem200tb { memory = 200000000000000.B }
|
|
||||||
withLabel: mem500tb { memory = 500000000000000.B }
|
|
||||||
withLabel: mem1gib { memory = 1073741824.B }
|
|
||||||
withLabel: mem2gib { memory = 2147483648.B }
|
|
||||||
withLabel: mem4gib { memory = 4294967296.B }
|
|
||||||
withLabel: mem8gib { memory = 8589934592.B }
|
|
||||||
withLabel: mem16gib { memory = 17179869184.B }
|
|
||||||
withLabel: mem32gib { memory = 34359738368.B }
|
|
||||||
withLabel: mem64gib { memory = 68719476736.B }
|
|
||||||
withLabel: mem128gib { memory = 137438953472.B }
|
|
||||||
withLabel: mem256gib { memory = 274877906944.B }
|
|
||||||
withLabel: mem512gib { memory = 549755813888.B }
|
|
||||||
withLabel: mem1tib { memory = 1099511627776.B }
|
|
||||||
withLabel: mem2tib { memory = 2199023255552.B }
|
|
||||||
withLabel: mem4tib { memory = 4398046511104.B }
|
|
||||||
withLabel: mem8tib { memory = 8796093022208.B }
|
|
||||||
withLabel: mem16tib { memory = 17592186044416.B }
|
|
||||||
withLabel: mem32tib { memory = 35184372088832.B }
|
|
||||||
withLabel: mem64tib { memory = 70368744177664.B }
|
|
||||||
withLabel: mem128tib { memory = 140737488355328.B }
|
|
||||||
withLabel: mem256tib { memory = 281474976710656.B }
|
|
||||||
withLabel: mem512tib { memory = 562949953421312.B }
|
|
||||||
withLabel: cpu1 { cpus = 1 }
|
|
||||||
withLabel: cpu2 { cpus = 2 }
|
|
||||||
withLabel: cpu5 { cpus = 5 }
|
|
||||||
withLabel: cpu10 { cpus = 10 }
|
|
||||||
withLabel: cpu20 { cpus = 20 }
|
|
||||||
withLabel: cpu50 { cpus = 50 }
|
|
||||||
withLabel: cpu100 { cpus = 100 }
|
|
||||||
withLabel: cpu200 { cpus = 200 }
|
|
||||||
withLabel: cpu500 { cpus = 500 }
|
|
||||||
withLabel: cpu1000 { cpus = 1000 }
|
|
||||||
}
|
|
||||||
|
|
||||||
includeConfig("nextflow_labels.config")
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
input: # please fill in - example: "sample_path"
|
|
||||||
# input_column: "foo"
|
|
||||||
# input_layer: "foo"
|
|
||||||
modality: # please fill in - example: "rna"
|
|
||||||
# matrix: "var"
|
|
||||||
|
|
||||||
# Outputs
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
output_match_column: # please fill in - example: "foo"
|
|
||||||
# output_fraction_column: "foo"
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Query options
|
|
||||||
regex_pattern: # please fill in - example: "^[mM][tT]-"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# MuData Input
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
obsm_key: # please fill in - example: "foo"
|
|
||||||
|
|
||||||
# MuData Output
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
obsm_input: "X_pca"
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
uns_output: "neighbors"
|
|
||||||
obsp_distances: "distances"
|
|
||||||
obsp_connectivities: "connectivities"
|
|
||||||
metric: "euclidean"
|
|
||||||
num_neighbors: 15
|
|
||||||
seed: 0
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
manifest {
|
|
||||||
name = 'qc/calculate_qc_metrics'
|
|
||||||
mainScript = 'main.nf'
|
|
||||||
nextflowVersion = '!>=20.12.1-edge'
|
|
||||||
version = 'disable-scrublet_build'
|
|
||||||
description = 'Add basic quality control metrics to an .h5mu file.\n\nThe metrics are comparable to what scanpy.pp.calculate_qc_metrics output,\nalthough they have slightly different names:\n\nVar metrics (name in this component -> name in scanpy):\n - pct_dropout -> pct_dropout_by_{expr_type}\n - num_nonzero_obs -> n_cells_by_{expr_type}\n - obs_mean -> mean_{expr_type}\n - total_counts -> total_{expr_type}\n\n Obs metrics:\n - num_nonzero_vars -> n_genes_by_{expr_type}\n - pct_{var_qc_metrics} -> pct_{expr_type}_{qc_var}\n - total_counts_{var_qc_metrics} -> total_{expr_type}_{qc_var}\n - pct_of_counts_in_top_{top_n_vars}_vars -> pct_{expr_type}_in_top_{n}_{var_type}\n - total_counts -> total_{expr_type}\n \n'
|
|
||||||
author = 'Dries Schaumont'
|
|
||||||
}
|
|
||||||
|
|
||||||
process.container = 'nextflow/bash:latest'
|
|
||||||
|
|
||||||
// detect tempdir
|
|
||||||
tempDir = java.nio.file.Paths.get(
|
|
||||||
System.getenv('NXF_TEMP') ?:
|
|
||||||
System.getenv('VIASH_TEMP') ?:
|
|
||||||
System.getenv('TEMPDIR') ?:
|
|
||||||
System.getenv('TMPDIR') ?:
|
|
||||||
'/tmp'
|
|
||||||
).toAbsolutePath()
|
|
||||||
|
|
||||||
profiles {
|
|
||||||
no_publish {
|
|
||||||
process {
|
|
||||||
withName: '.*' {
|
|
||||||
publishDir = [
|
|
||||||
enabled: false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mount_temp {
|
|
||||||
docker.temp = tempDir
|
|
||||||
podman.temp = tempDir
|
|
||||||
charliecloud.temp = tempDir
|
|
||||||
}
|
|
||||||
docker {
|
|
||||||
docker.enabled = true
|
|
||||||
// docker.userEmulation = true
|
|
||||||
singularity.enabled = false
|
|
||||||
podman.enabled = false
|
|
||||||
shifter.enabled = false
|
|
||||||
charliecloud.enabled = false
|
|
||||||
}
|
|
||||||
singularity {
|
|
||||||
singularity.enabled = true
|
|
||||||
singularity.autoMounts = true
|
|
||||||
docker.enabled = false
|
|
||||||
podman.enabled = false
|
|
||||||
shifter.enabled = false
|
|
||||||
charliecloud.enabled = false
|
|
||||||
}
|
|
||||||
podman {
|
|
||||||
podman.enabled = true
|
|
||||||
docker.enabled = false
|
|
||||||
singularity.enabled = false
|
|
||||||
shifter.enabled = false
|
|
||||||
charliecloud.enabled = false
|
|
||||||
}
|
|
||||||
shifter {
|
|
||||||
shifter.enabled = true
|
|
||||||
docker.enabled = false
|
|
||||||
singularity.enabled = false
|
|
||||||
podman.enabled = false
|
|
||||||
charliecloud.enabled = false
|
|
||||||
}
|
|
||||||
charliecloud {
|
|
||||||
charliecloud.enabled = true
|
|
||||||
docker.enabled = false
|
|
||||||
singularity.enabled = false
|
|
||||||
podman.enabled = false
|
|
||||||
shifter.enabled = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
process{
|
|
||||||
withLabel: mem1gb { memory = 1000000000.B }
|
|
||||||
withLabel: mem2gb { memory = 2000000000.B }
|
|
||||||
withLabel: mem5gb { memory = 5000000000.B }
|
|
||||||
withLabel: mem10gb { memory = 10000000000.B }
|
|
||||||
withLabel: mem20gb { memory = 20000000000.B }
|
|
||||||
withLabel: mem50gb { memory = 50000000000.B }
|
|
||||||
withLabel: mem100gb { memory = 100000000000.B }
|
|
||||||
withLabel: mem200gb { memory = 200000000000.B }
|
|
||||||
withLabel: mem500gb { memory = 500000000000.B }
|
|
||||||
withLabel: mem1tb { memory = 1000000000000.B }
|
|
||||||
withLabel: mem2tb { memory = 2000000000000.B }
|
|
||||||
withLabel: mem5tb { memory = 5000000000000.B }
|
|
||||||
withLabel: mem10tb { memory = 10000000000000.B }
|
|
||||||
withLabel: mem20tb { memory = 20000000000000.B }
|
|
||||||
withLabel: mem50tb { memory = 50000000000000.B }
|
|
||||||
withLabel: mem100tb { memory = 100000000000000.B }
|
|
||||||
withLabel: mem200tb { memory = 200000000000000.B }
|
|
||||||
withLabel: mem500tb { memory = 500000000000000.B }
|
|
||||||
withLabel: mem1gib { memory = 1073741824.B }
|
|
||||||
withLabel: mem2gib { memory = 2147483648.B }
|
|
||||||
withLabel: mem4gib { memory = 4294967296.B }
|
|
||||||
withLabel: mem8gib { memory = 8589934592.B }
|
|
||||||
withLabel: mem16gib { memory = 17179869184.B }
|
|
||||||
withLabel: mem32gib { memory = 34359738368.B }
|
|
||||||
withLabel: mem64gib { memory = 68719476736.B }
|
|
||||||
withLabel: mem128gib { memory = 137438953472.B }
|
|
||||||
withLabel: mem256gib { memory = 274877906944.B }
|
|
||||||
withLabel: mem512gib { memory = 549755813888.B }
|
|
||||||
withLabel: mem1tib { memory = 1099511627776.B }
|
|
||||||
withLabel: mem2tib { memory = 2199023255552.B }
|
|
||||||
withLabel: mem4tib { memory = 4398046511104.B }
|
|
||||||
withLabel: mem8tib { memory = 8796093022208.B }
|
|
||||||
withLabel: mem16tib { memory = 17592186044416.B }
|
|
||||||
withLabel: mem32tib { memory = 35184372088832.B }
|
|
||||||
withLabel: mem64tib { memory = 70368744177664.B }
|
|
||||||
withLabel: mem128tib { memory = 140737488355328.B }
|
|
||||||
withLabel: mem256tib { memory = 281474976710656.B }
|
|
||||||
withLabel: mem512tib { memory = 562949953421312.B }
|
|
||||||
withLabel: cpu1 { cpus = 1 }
|
|
||||||
withLabel: cpu2 { cpus = 2 }
|
|
||||||
withLabel: cpu5 { cpus = 5 }
|
|
||||||
withLabel: cpu10 { cpus = 10 }
|
|
||||||
withLabel: cpu20 { cpus = 20 }
|
|
||||||
withLabel: cpu50 { cpus = 50 }
|
|
||||||
withLabel: cpu100 { cpus = 100 }
|
|
||||||
withLabel: cpu200 { cpus = 200 }
|
|
||||||
withLabel: cpu500 { cpus = 500 }
|
|
||||||
withLabel: cpu1000 { cpus = 1000 }
|
|
||||||
}
|
|
||||||
|
|
||||||
includeConfig("nextflow_labels.config")
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
# layer: "raw_counts"
|
|
||||||
|
|
||||||
# Metrics added to .obs
|
|
||||||
# var_qc_metrics: ["ercc,highly_variable,mitochondrial"]
|
|
||||||
# var_qc_metrics_fill_na_value: true
|
|
||||||
# top_n_vars: [123]
|
|
||||||
output_obs_num_nonzero_vars: "num_nonzero_vars"
|
|
||||||
output_obs_total_counts_vars: "total_counts"
|
|
||||||
|
|
||||||
# Metrics added to .var
|
|
||||||
output_var_num_nonzero_obs: "num_nonzero_obs"
|
|
||||||
output_var_total_counts_obs: "total_counts"
|
|
||||||
output_var_obs_mean: "obs_mean"
|
|
||||||
output_var_pct_dropout: "pct_dropout"
|
|
||||||
|
|
||||||
# Outputs
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "prot"
|
|
||||||
# output: "output.h5mu"
|
|
||||||
# input_layer: "foo"
|
|
||||||
# output_layer: "foo"
|
|
||||||
axis: 0
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
layer: # please fill in - example: ["foo"]
|
|
||||||
# output: "output.h5mu"
|
|
||||||
missing_ok: false
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
# input_layer: "foo"
|
|
||||||
# output_layer: "foo"
|
|
||||||
# output: "output.h5mu"
|
|
||||||
# base: 2.0
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
import shutil
|
|
||||||
from anndata import AnnData
|
|
||||||
from mudata import write_h5ad
|
|
||||||
from h5py import File as H5File
|
|
||||||
from h5py import Group, Dataset
|
|
||||||
from pathlib import Path
|
|
||||||
from typing import Union, Literal
|
|
||||||
from functools import partial
|
|
||||||
|
|
||||||
|
|
||||||
def compress_h5mu(
|
|
||||||
input_path: Union[str, Path],
|
|
||||||
output_path: Union[str, Path],
|
|
||||||
compression: Union[Literal["gzip"], Literal["lzf"]],
|
|
||||||
):
|
|
||||||
input_path, output_path = str(input_path), str(output_path)
|
|
||||||
|
|
||||||
def copy_attributes(in_object, out_object):
|
|
||||||
for key, value in in_object.attrs.items():
|
|
||||||
out_object.attrs[key] = value
|
|
||||||
|
|
||||||
def visit_path(
|
|
||||||
output_h5: H5File,
|
|
||||||
compression: Union[Literal["gzip"], Literal["lzf"]],
|
|
||||||
name: str,
|
|
||||||
object: Union[Group, Dataset],
|
|
||||||
):
|
|
||||||
if isinstance(object, Group):
|
|
||||||
new_group = output_h5.create_group(name)
|
|
||||||
copy_attributes(object, new_group)
|
|
||||||
elif isinstance(object, Dataset):
|
|
||||||
# Compression only works for non-scalar Dataset objects
|
|
||||||
# Scalar objects dont have a shape defined
|
|
||||||
if not object.compression and object.shape not in [None, ()]:
|
|
||||||
new_dataset = output_h5.create_dataset(
|
|
||||||
name, data=object, compression=compression
|
|
||||||
)
|
|
||||||
copy_attributes(object, new_dataset)
|
|
||||||
else:
|
|
||||||
output_h5.copy(object, name)
|
|
||||||
else:
|
|
||||||
raise NotImplementedError(
|
|
||||||
f"Could not copy element {name}, "
|
|
||||||
f"type has not been implemented yet: {type(object)}"
|
|
||||||
)
|
|
||||||
|
|
||||||
with (
|
|
||||||
H5File(input_path, "r") as input_h5,
|
|
||||||
H5File(output_path, "w", userblock_size=512) as output_h5,
|
|
||||||
):
|
|
||||||
copy_attributes(input_h5, output_h5)
|
|
||||||
input_h5.visititems(partial(visit_path, output_h5, compression))
|
|
||||||
|
|
||||||
with open(input_path, "rb") as input_bytes:
|
|
||||||
# Mudata puts metadata like this in the first 512 bytes:
|
|
||||||
# MuData (format-version=0.1.0;creator=muon;creator-version=0.2.0)
|
|
||||||
# See mudata/_core/io.py, read_h5mu() function
|
|
||||||
starting_metadata = input_bytes.read(100)
|
|
||||||
# The metadata is padded with extra null bytes up until 512 bytes
|
|
||||||
truncate_location = starting_metadata.find(b"\x00")
|
|
||||||
starting_metadata = starting_metadata[:truncate_location]
|
|
||||||
with open(output_path, "br+") as f:
|
|
||||||
nbytes = f.write(starting_metadata)
|
|
||||||
f.write(b"\0" * (512 - nbytes))
|
|
||||||
|
|
||||||
|
|
||||||
def write_h5ad_to_h5mu_with_compression(
|
|
||||||
output_file: Union[str, Path],
|
|
||||||
h5mu: Union[str, Path],
|
|
||||||
modality_name: str,
|
|
||||||
modality_data: AnnData,
|
|
||||||
output_compression=None,
|
|
||||||
):
|
|
||||||
output_file = Path(output_file)
|
|
||||||
h5mu = Path(h5mu)
|
|
||||||
output_file_uncompressed = (
|
|
||||||
output_file.with_name(output_file.stem + "_uncompressed.h5mu")
|
|
||||||
if output_compression
|
|
||||||
else output_file
|
|
||||||
)
|
|
||||||
shutil.copyfile(h5mu, output_file_uncompressed)
|
|
||||||
write_h5ad(filename=output_file_uncompressed, mod=modality_name, data=modality_data)
|
|
||||||
if output_compression:
|
|
||||||
compress_h5mu(
|
|
||||||
output_file_uncompressed, output_file, compression=output_compression
|
|
||||||
)
|
|
||||||
output_file_uncompressed.unlink()
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
# input_layer: "foo"
|
|
||||||
# output: "output.h5mu"
|
|
||||||
# output_layer: "foo"
|
|
||||||
# target_sum: 123
|
|
||||||
exclude_highly_expressed: false
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
def setup_logger():
|
|
||||||
import logging
|
|
||||||
from sys import stdout
|
|
||||||
|
|
||||||
logger = logging.getLogger()
|
|
||||||
logger.setLevel(logging.INFO)
|
|
||||||
console_handler = logging.StreamHandler(stdout)
|
|
||||||
logFormatter = logging.Formatter("%(asctime)s %(levelname)-8s %(message)s")
|
|
||||||
console_handler.setFormatter(logFormatter)
|
|
||||||
logger.addHandler(console_handler)
|
|
||||||
|
|
||||||
return logger
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
import shutil
|
|
||||||
from anndata import AnnData
|
|
||||||
from mudata import write_h5ad
|
|
||||||
from h5py import File as H5File
|
|
||||||
from h5py import Group, Dataset
|
|
||||||
from pathlib import Path
|
|
||||||
from typing import Union, Literal
|
|
||||||
from functools import partial
|
|
||||||
|
|
||||||
|
|
||||||
def compress_h5mu(
|
|
||||||
input_path: Union[str, Path],
|
|
||||||
output_path: Union[str, Path],
|
|
||||||
compression: Union[Literal["gzip"], Literal["lzf"]],
|
|
||||||
):
|
|
||||||
input_path, output_path = str(input_path), str(output_path)
|
|
||||||
|
|
||||||
def copy_attributes(in_object, out_object):
|
|
||||||
for key, value in in_object.attrs.items():
|
|
||||||
out_object.attrs[key] = value
|
|
||||||
|
|
||||||
def visit_path(
|
|
||||||
output_h5: H5File,
|
|
||||||
compression: Union[Literal["gzip"], Literal["lzf"]],
|
|
||||||
name: str,
|
|
||||||
object: Union[Group, Dataset],
|
|
||||||
):
|
|
||||||
if isinstance(object, Group):
|
|
||||||
new_group = output_h5.create_group(name)
|
|
||||||
copy_attributes(object, new_group)
|
|
||||||
elif isinstance(object, Dataset):
|
|
||||||
# Compression only works for non-scalar Dataset objects
|
|
||||||
# Scalar objects dont have a shape defined
|
|
||||||
if not object.compression and object.shape not in [None, ()]:
|
|
||||||
new_dataset = output_h5.create_dataset(
|
|
||||||
name, data=object, compression=compression
|
|
||||||
)
|
|
||||||
copy_attributes(object, new_dataset)
|
|
||||||
else:
|
|
||||||
output_h5.copy(object, name)
|
|
||||||
else:
|
|
||||||
raise NotImplementedError(
|
|
||||||
f"Could not copy element {name}, "
|
|
||||||
f"type has not been implemented yet: {type(object)}"
|
|
||||||
)
|
|
||||||
|
|
||||||
with (
|
|
||||||
H5File(input_path, "r") as input_h5,
|
|
||||||
H5File(output_path, "w", userblock_size=512) as output_h5,
|
|
||||||
):
|
|
||||||
copy_attributes(input_h5, output_h5)
|
|
||||||
input_h5.visititems(partial(visit_path, output_h5, compression))
|
|
||||||
|
|
||||||
with open(input_path, "rb") as input_bytes:
|
|
||||||
# Mudata puts metadata like this in the first 512 bytes:
|
|
||||||
# MuData (format-version=0.1.0;creator=muon;creator-version=0.2.0)
|
|
||||||
# See mudata/_core/io.py, read_h5mu() function
|
|
||||||
starting_metadata = input_bytes.read(100)
|
|
||||||
# The metadata is padded with extra null bytes up until 512 bytes
|
|
||||||
truncate_location = starting_metadata.find(b"\x00")
|
|
||||||
starting_metadata = starting_metadata[:truncate_location]
|
|
||||||
with open(output_path, "br+") as f:
|
|
||||||
nbytes = f.write(starting_metadata)
|
|
||||||
f.write(b"\0" * (512 - nbytes))
|
|
||||||
|
|
||||||
|
|
||||||
def write_h5ad_to_h5mu_with_compression(
|
|
||||||
output_file: Union[str, Path],
|
|
||||||
h5mu: Union[str, Path],
|
|
||||||
modality_name: str,
|
|
||||||
modality_data: AnnData,
|
|
||||||
output_compression=None,
|
|
||||||
):
|
|
||||||
output_file = Path(output_file)
|
|
||||||
h5mu = Path(h5mu)
|
|
||||||
output_file_uncompressed = (
|
|
||||||
output_file.with_name(output_file.stem + "_uncompressed.h5mu")
|
|
||||||
if output_compression
|
|
||||||
else output_file
|
|
||||||
)
|
|
||||||
shutil.copyfile(h5mu, output_file_uncompressed)
|
|
||||||
write_h5ad(filename=output_file_uncompressed, mod=modality_name, data=modality_data)
|
|
||||||
if output_compression:
|
|
||||||
compress_h5mu(
|
|
||||||
output_file_uncompressed, output_file, compression=output_compression
|
|
||||||
)
|
|
||||||
output_file_uncompressed.unlink()
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
# Arguments
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
# input_layer: "foo"
|
|
||||||
# output_layer: "foo"
|
|
||||||
# max_value: 123.0
|
|
||||||
zero_center: true
|
|
||||||
# output: "output.h5mu"
|
|
||||||
# output_compression: "gzip"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
def setup_logger():
|
|
||||||
import logging
|
|
||||||
from sys import stdout
|
|
||||||
|
|
||||||
logger = logging.getLogger()
|
|
||||||
logger.setLevel(logging.INFO)
|
|
||||||
console_handler = logging.StreamHandler(stdout)
|
|
||||||
logFormatter = logging.Formatter("%(asctime)s %(levelname)-8s %(message)s")
|
|
||||||
console_handler.setFormatter(logFormatter)
|
|
||||||
logger.addHandler(console_handler)
|
|
||||||
|
|
||||||
return logger
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
# Input
|
|
||||||
id: # please fill in - example: "foo"
|
|
||||||
input: # please fill in - example: "dataset.h5mu"
|
|
||||||
# layer: "foo"
|
|
||||||
|
|
||||||
# Output
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
|
|
||||||
# Filtering options
|
|
||||||
# min_counts: 200
|
|
||||||
# max_counts: 5000000
|
|
||||||
# min_guides_per_cell: 200
|
|
||||||
# max_guides_per_cell: 1500000
|
|
||||||
# min_cells_per_guide: 3
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
id: # please fill in - example: "foo"
|
|
||||||
input: # please fill in - example: "dataset.h5mu"
|
|
||||||
layer: "log_normalized"
|
|
||||||
modality: "rna"
|
|
||||||
|
|
||||||
# Outputs
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
|
|
||||||
# PCA options
|
|
||||||
obsm_pca: "X_pca"
|
|
||||||
# var_pca_feature_selection: "foo"
|
|
||||||
# pca_loadings_varm_output: "foo"
|
|
||||||
# pca_variance_uns_output: "foo"
|
|
||||||
pca_overwrite: false
|
|
||||||
|
|
||||||
# Neighbour calculation
|
|
||||||
uns_neighbors: "neighbors"
|
|
||||||
obsp_neighbor_distances: "distances"
|
|
||||||
obsp_neighbor_connectivities: "connectivities"
|
|
||||||
|
|
||||||
# Umap options
|
|
||||||
obsm_umap: "X_umap"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
input: # please fill in - example: "dataset.h5mu"
|
|
||||||
obsm_input: # please fill in - example: "foo"
|
|
||||||
modality: "rna"
|
|
||||||
|
|
||||||
# Outputs
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
|
|
||||||
# Neighbour calculation
|
|
||||||
uns_neighbors: # please fill in - example: "foo"
|
|
||||||
obsp_neighbor_distances: # please fill in - example: "foo"
|
|
||||||
obsp_neighbor_connectivities: # please fill in - example: "foo"
|
|
||||||
|
|
||||||
# Clustering options
|
|
||||||
# obs_cluster: "foo"
|
|
||||||
leiden_resolution: [1.0]
|
|
||||||
|
|
||||||
# Umap options
|
|
||||||
# obsm_umap: "foo"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
id: # please fill in - example: "foo"
|
|
||||||
input: # please fill in - example: ["input.h5mu"]
|
|
||||||
# rna_layer: "foo"
|
|
||||||
# prot_layer: "foo"
|
|
||||||
|
|
||||||
# Outputs
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
|
|
||||||
# Highly variable features detection
|
|
||||||
highly_variable_features_var_output: "filter_with_hvg"
|
|
||||||
highly_variable_features_obs_batch_key: "sample_id"
|
|
||||||
|
|
||||||
# QC metrics calculation options
|
|
||||||
var_qc_metrics: ["filter_with_hvg"]
|
|
||||||
top_n_vars: [50, 100, 200, 500]
|
|
||||||
|
|
||||||
# PCA options
|
|
||||||
pca_overwrite: false
|
|
||||||
|
|
||||||
# CLR options
|
|
||||||
clr_axis: 0
|
|
||||||
|
|
||||||
# RNA Scaling options
|
|
||||||
rna_enable_scaling: false
|
|
||||||
rna_scaling_output_layer: "scaled"
|
|
||||||
rna_scaling_pca_obsm_output: "scaled_pca"
|
|
||||||
rna_scaling_pca_loadings_varm_output: "scaled_pca_loadings"
|
|
||||||
rna_scaling_pca_variance_uns_output: "scaled_pca_variance"
|
|
||||||
rna_scaling_umap_obsm_output: "scaled_umap"
|
|
||||||
# rna_scaling_max_value: 123.0
|
|
||||||
rna_scaling_zero_center: true
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
id: # please fill in - example: "foo"
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
# rna_layer: "foo"
|
|
||||||
# prot_layer: "foo"
|
|
||||||
# gdo_layer: "foo"
|
|
||||||
|
|
||||||
# Outputs
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
|
|
||||||
# Sample ID options
|
|
||||||
add_id_to_obs: true
|
|
||||||
add_id_obs_output: "sample_id"
|
|
||||||
add_id_make_observation_keys_unique: true
|
|
||||||
|
|
||||||
# RNA filtering options
|
|
||||||
# rna_min_counts: 200
|
|
||||||
# rna_max_counts: 5000000
|
|
||||||
# rna_min_genes_per_cell: 200
|
|
||||||
# rna_max_genes_per_cell: 1500000
|
|
||||||
# rna_min_cells_per_gene: 3
|
|
||||||
# rna_min_fraction_mito: 0.0
|
|
||||||
# rna_max_fraction_mito: 0.2
|
|
||||||
# rna_min_fraction_ribo: 0.0
|
|
||||||
# rna_max_fraction_ribo: 0.2
|
|
||||||
skip_scrublet_filtering: false
|
|
||||||
|
|
||||||
# CITE-seq filtering options
|
|
||||||
# prot_min_counts: 3
|
|
||||||
# prot_max_counts: 5000000
|
|
||||||
# prot_min_proteins_per_cell: 200
|
|
||||||
# prot_max_proteins_per_cell: 100000000
|
|
||||||
# prot_min_cells_per_protein: 3
|
|
||||||
|
|
||||||
# GDO filtering options
|
|
||||||
# gdo_min_counts: 3
|
|
||||||
# gdo_max_counts: 5000000
|
|
||||||
# gdo_min_guides_per_cell: 200
|
|
||||||
# gdo_max_guides_per_cell: 100000000
|
|
||||||
# gdo_min_cells_per_guide: 3
|
|
||||||
|
|
||||||
# Highly variable features detection
|
|
||||||
highly_variable_features_var_output: "filter_with_hvg"
|
|
||||||
highly_variable_features_obs_batch_key: "sample_id"
|
|
||||||
|
|
||||||
# Mitochondrial & Ribosomal Gene Detection
|
|
||||||
# var_gene_names: "gene_symbol"
|
|
||||||
# var_name_mitochondrial_genes: "foo"
|
|
||||||
# obs_name_mitochondrial_fraction: "foo"
|
|
||||||
mitochondrial_gene_regex: "^[mM][tT]-"
|
|
||||||
# var_name_ribosomal_genes: "foo"
|
|
||||||
# obs_name_ribosomal_fraction: "foo"
|
|
||||||
ribosomal_gene_regex: "^[Mm]?[Rr][Pp][LlSs]"
|
|
||||||
|
|
||||||
# QC metrics calculation options
|
|
||||||
# var_qc_metrics: ["ercc,highly_variable"]
|
|
||||||
top_n_vars: [50, 100, 200, 500]
|
|
||||||
|
|
||||||
# PCA options
|
|
||||||
pca_overwrite: false
|
|
||||||
|
|
||||||
# CLR options
|
|
||||||
clr_axis: 0
|
|
||||||
|
|
||||||
# RNA Scaling options
|
|
||||||
rna_enable_scaling: false
|
|
||||||
rna_scaling_output_layer: "scaled"
|
|
||||||
rna_scaling_pca_obsm_output: "scaled_pca"
|
|
||||||
rna_scaling_pca_loadings_varm_output: "scaled_pca_loadings"
|
|
||||||
rna_scaling_pca_variance_uns_output: "scaled_pca_variance"
|
|
||||||
rna_scaling_umap_obsm_output: "scaled_umap"
|
|
||||||
# rna_scaling_max_value: 123.0
|
|
||||||
rna_scaling_zero_center: true
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
id: # please fill in - example: "concatenated"
|
|
||||||
input: # please fill in - example: "dataset.h5mu"
|
|
||||||
# layer: "foo"
|
|
||||||
|
|
||||||
# Outputs
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
|
|
||||||
# QC metrics calculation options
|
|
||||||
# var_qc_metrics: ["ercc,highly_variable"]
|
|
||||||
top_n_vars: [50, 100, 200, 500]
|
|
||||||
output_obs_num_nonzero_vars: "num_nonzero_vars"
|
|
||||||
output_obs_total_counts_vars: "total_counts"
|
|
||||||
output_var_num_nonzero_obs: "num_nonzero_obs"
|
|
||||||
output_var_total_counts_obs: "total_counts"
|
|
||||||
output_var_obs_mean: "obs_mean"
|
|
||||||
output_var_pct_dropout: "pct_dropout"
|
|
||||||
|
|
||||||
# CLR arguments
|
|
||||||
clr_axis: 0
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
# Input
|
|
||||||
id: # please fill in - example: "foo"
|
|
||||||
input: # please fill in - example: "dataset.h5mu"
|
|
||||||
# layer: "foo"
|
|
||||||
|
|
||||||
# Output
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
|
|
||||||
# Filtering options
|
|
||||||
# min_counts: 200
|
|
||||||
# max_counts: 5000000
|
|
||||||
# min_proteins_per_cell: 200
|
|
||||||
# max_proteins_per_cell: 1500000
|
|
||||||
# min_cells_per_protein: 3
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
manifest {
|
|
||||||
name = 'workflows/qc/qc'
|
|
||||||
mainScript = 'main.nf'
|
|
||||||
nextflowVersion = '!>=20.12.1-edge'
|
|
||||||
version = 'disable-scrublet_build'
|
|
||||||
description = 'A pipeline to add basic qc statistics to a MuData '
|
|
||||||
author = 'Dries Schaumont'
|
|
||||||
}
|
|
||||||
|
|
||||||
process.container = 'nextflow/bash:latest'
|
|
||||||
|
|
||||||
// detect tempdir
|
|
||||||
tempDir = java.nio.file.Paths.get(
|
|
||||||
System.getenv('NXF_TEMP') ?:
|
|
||||||
System.getenv('VIASH_TEMP') ?:
|
|
||||||
System.getenv('TEMPDIR') ?:
|
|
||||||
System.getenv('TMPDIR') ?:
|
|
||||||
'/tmp'
|
|
||||||
).toAbsolutePath()
|
|
||||||
|
|
||||||
profiles {
|
|
||||||
no_publish {
|
|
||||||
process {
|
|
||||||
withName: '.*' {
|
|
||||||
publishDir = [
|
|
||||||
enabled: false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mount_temp {
|
|
||||||
docker.temp = tempDir
|
|
||||||
podman.temp = tempDir
|
|
||||||
charliecloud.temp = tempDir
|
|
||||||
}
|
|
||||||
docker {
|
|
||||||
docker.enabled = true
|
|
||||||
// docker.userEmulation = true
|
|
||||||
singularity.enabled = false
|
|
||||||
podman.enabled = false
|
|
||||||
shifter.enabled = false
|
|
||||||
charliecloud.enabled = false
|
|
||||||
}
|
|
||||||
singularity {
|
|
||||||
singularity.enabled = true
|
|
||||||
singularity.autoMounts = true
|
|
||||||
docker.enabled = false
|
|
||||||
podman.enabled = false
|
|
||||||
shifter.enabled = false
|
|
||||||
charliecloud.enabled = false
|
|
||||||
}
|
|
||||||
podman {
|
|
||||||
podman.enabled = true
|
|
||||||
docker.enabled = false
|
|
||||||
singularity.enabled = false
|
|
||||||
shifter.enabled = false
|
|
||||||
charliecloud.enabled = false
|
|
||||||
}
|
|
||||||
shifter {
|
|
||||||
shifter.enabled = true
|
|
||||||
docker.enabled = false
|
|
||||||
singularity.enabled = false
|
|
||||||
podman.enabled = false
|
|
||||||
charliecloud.enabled = false
|
|
||||||
}
|
|
||||||
charliecloud {
|
|
||||||
charliecloud.enabled = true
|
|
||||||
docker.enabled = false
|
|
||||||
singularity.enabled = false
|
|
||||||
podman.enabled = false
|
|
||||||
shifter.enabled = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
process{
|
|
||||||
withLabel: mem1gb { memory = 1000000000.B }
|
|
||||||
withLabel: mem2gb { memory = 2000000000.B }
|
|
||||||
withLabel: mem5gb { memory = 5000000000.B }
|
|
||||||
withLabel: mem10gb { memory = 10000000000.B }
|
|
||||||
withLabel: mem20gb { memory = 20000000000.B }
|
|
||||||
withLabel: mem50gb { memory = 50000000000.B }
|
|
||||||
withLabel: mem100gb { memory = 100000000000.B }
|
|
||||||
withLabel: mem200gb { memory = 200000000000.B }
|
|
||||||
withLabel: mem500gb { memory = 500000000000.B }
|
|
||||||
withLabel: mem1tb { memory = 1000000000000.B }
|
|
||||||
withLabel: mem2tb { memory = 2000000000000.B }
|
|
||||||
withLabel: mem5tb { memory = 5000000000000.B }
|
|
||||||
withLabel: mem10tb { memory = 10000000000000.B }
|
|
||||||
withLabel: mem20tb { memory = 20000000000000.B }
|
|
||||||
withLabel: mem50tb { memory = 50000000000000.B }
|
|
||||||
withLabel: mem100tb { memory = 100000000000000.B }
|
|
||||||
withLabel: mem200tb { memory = 200000000000000.B }
|
|
||||||
withLabel: mem500tb { memory = 500000000000000.B }
|
|
||||||
withLabel: mem1gib { memory = 1073741824.B }
|
|
||||||
withLabel: mem2gib { memory = 2147483648.B }
|
|
||||||
withLabel: mem4gib { memory = 4294967296.B }
|
|
||||||
withLabel: mem8gib { memory = 8589934592.B }
|
|
||||||
withLabel: mem16gib { memory = 17179869184.B }
|
|
||||||
withLabel: mem32gib { memory = 34359738368.B }
|
|
||||||
withLabel: mem64gib { memory = 68719476736.B }
|
|
||||||
withLabel: mem128gib { memory = 137438953472.B }
|
|
||||||
withLabel: mem256gib { memory = 274877906944.B }
|
|
||||||
withLabel: mem512gib { memory = 549755813888.B }
|
|
||||||
withLabel: mem1tib { memory = 1099511627776.B }
|
|
||||||
withLabel: mem2tib { memory = 2199023255552.B }
|
|
||||||
withLabel: mem4tib { memory = 4398046511104.B }
|
|
||||||
withLabel: mem8tib { memory = 8796093022208.B }
|
|
||||||
withLabel: mem16tib { memory = 17592186044416.B }
|
|
||||||
withLabel: mem32tib { memory = 35184372088832.B }
|
|
||||||
withLabel: mem64tib { memory = 70368744177664.B }
|
|
||||||
withLabel: mem128tib { memory = 140737488355328.B }
|
|
||||||
withLabel: mem256tib { memory = 281474976710656.B }
|
|
||||||
withLabel: mem512tib { memory = 562949953421312.B }
|
|
||||||
withLabel: cpu1 { cpus = 1 }
|
|
||||||
withLabel: cpu2 { cpus = 2 }
|
|
||||||
withLabel: cpu5 { cpus = 5 }
|
|
||||||
withLabel: cpu10 { cpus = 10 }
|
|
||||||
withLabel: cpu20 { cpus = 20 }
|
|
||||||
withLabel: cpu50 { cpus = 50 }
|
|
||||||
withLabel: cpu100 { cpus = 100 }
|
|
||||||
withLabel: cpu200 { cpus = 200 }
|
|
||||||
withLabel: cpu500 { cpus = 500 }
|
|
||||||
withLabel: cpu1000 { cpus = 1000 }
|
|
||||||
}
|
|
||||||
|
|
||||||
includeConfig("nextflow_labels.config")
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
id: # please fill in - example: "foo"
|
|
||||||
input: # please fill in - example: "input.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
# layer: "raw_counts"
|
|
||||||
|
|
||||||
# Mitochondrial & Ribosomal Gene Detection
|
|
||||||
# var_gene_names: "gene_symbol"
|
|
||||||
# var_name_mitochondrial_genes: "foo"
|
|
||||||
# obs_name_mitochondrial_fraction: "foo"
|
|
||||||
mitochondrial_gene_regex: "^[mM][tT]-"
|
|
||||||
# var_name_ribosomal_genes: "foo"
|
|
||||||
# obs_name_ribosomal_fraction: "foo"
|
|
||||||
ribosomal_gene_regex: "^[Mm]?[Rr][Pp][LlSs]"
|
|
||||||
|
|
||||||
# QC metrics calculation options
|
|
||||||
# var_qc_metrics: ["ercc,highly_variable"]
|
|
||||||
top_n_vars: [50, 100, 200, 500]
|
|
||||||
output_obs_num_nonzero_vars: "num_nonzero_vars"
|
|
||||||
output_obs_total_counts_vars: "total_counts"
|
|
||||||
output_var_num_nonzero_obs: "num_nonzero_obs"
|
|
||||||
output_var_total_counts_obs: "total_counts"
|
|
||||||
output_var_obs_mean: "obs_mean"
|
|
||||||
output_var_pct_dropout: "pct_dropout"
|
|
||||||
|
|
||||||
# Outputs
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# Inputs
|
|
||||||
id: # please fill in - example: "concatenated"
|
|
||||||
input: # please fill in - example: "dataset.h5mu"
|
|
||||||
modality: "rna"
|
|
||||||
# layer: "foo"
|
|
||||||
|
|
||||||
# Output
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
|
|
||||||
# Filtering highly variable features
|
|
||||||
highly_variable_features_var_output: "filter_with_hvg"
|
|
||||||
highly_variable_features_obs_batch_key: "sample_id"
|
|
||||||
highly_variable_features_flavor: "seurat"
|
|
||||||
# highly_variable_features_n_top_features: 123
|
|
||||||
|
|
||||||
# QC metrics calculation options
|
|
||||||
var_qc_metrics: ["filter_with_hvg"]
|
|
||||||
top_n_vars: [50, 100, 200, 500]
|
|
||||||
output_obs_num_nonzero_vars: "num_nonzero_vars"
|
|
||||||
output_obs_total_counts_vars: "total_counts"
|
|
||||||
output_var_num_nonzero_obs: "num_nonzero_obs"
|
|
||||||
output_var_total_counts_obs: "total_counts"
|
|
||||||
output_var_obs_mean: "obs_mean"
|
|
||||||
output_var_pct_dropout: "pct_dropout"
|
|
||||||
|
|
||||||
# RNA Scaling options
|
|
||||||
enable_scaling: false
|
|
||||||
scaling_output_layer: "scaled"
|
|
||||||
# scaling_max_value: 123.0
|
|
||||||
scaling_zero_center: true
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
# Input
|
|
||||||
id: # please fill in - example: "foo"
|
|
||||||
input: # please fill in - example: "dataset.h5mu"
|
|
||||||
# layer: "foo"
|
|
||||||
|
|
||||||
# Output
|
|
||||||
# output: "$id.$key.output.h5mu"
|
|
||||||
|
|
||||||
# Filtering options
|
|
||||||
# min_counts: 200
|
|
||||||
# max_counts: 5000000
|
|
||||||
# min_genes_per_cell: 200
|
|
||||||
# max_genes_per_cell: 1500000
|
|
||||||
# min_cells_per_gene: 3
|
|
||||||
# min_fraction_mito: 0.0
|
|
||||||
# max_fraction_mito: 0.2
|
|
||||||
# min_fraction_ribo: 0.0
|
|
||||||
# max_fraction_ribo: 0.2
|
|
||||||
skip_scrublet_filtering: false
|
|
||||||
|
|
||||||
# Mitochondrial & Ribosomal Gene Detection
|
|
||||||
# var_gene_names: "gene_symbol"
|
|
||||||
# var_name_mitochondrial_genes: "foo"
|
|
||||||
# obs_name_mitochondrial_fraction: "foo"
|
|
||||||
mitochondrial_gene_regex: "^[mM][tT]-"
|
|
||||||
# var_name_ribosomal_genes: "foo"
|
|
||||||
# obs_name_ribosomal_fraction: "foo"
|
|
||||||
ribosomal_gene_regex: "^[Mm]?[Rr][Pp][LlSs]"
|
|
||||||
|
|
||||||
# Nextflow input-output arguments
|
|
||||||
publish_dir: # please fill in - example: "output/"
|
|
||||||
# param_list: "my_params.yaml"
|
|
||||||
|
|
||||||
# Arguments
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
process.errorStrategy = 'ignore'
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
profiles {
|
|
||||||
|
|
||||||
// detect tempdir
|
|
||||||
tempDir = java.nio.file.Paths.get(
|
|
||||||
System.getenv('NXF_TEMP') ?:
|
|
||||||
System.getenv('VIASH_TEMP') ?:
|
|
||||||
System.getenv('TEMPDIR') ?:
|
|
||||||
System.getenv('TMPDIR') ?:
|
|
||||||
'/tmp'
|
|
||||||
).toAbsolutePath()
|
|
||||||
|
|
||||||
mount_temp {
|
|
||||||
docker.temp = tempDir
|
|
||||||
podman.temp = tempDir
|
|
||||||
charliecloud.temp = tempDir
|
|
||||||
}
|
|
||||||
|
|
||||||
no_publish {
|
|
||||||
process {
|
|
||||||
withName: '.*' {
|
|
||||||
publishDir = [
|
|
||||||
enabled: false
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
docker {
|
|
||||||
docker.enabled = true
|
|
||||||
// docker.userEmulation = true
|
|
||||||
singularity.enabled = false
|
|
||||||
podman.enabled = false
|
|
||||||
shifter.enabled = false
|
|
||||||
charliecloud.enabled = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
process {
|
|
||||||
// Default resources for components that hardly do any processing
|
|
||||||
memory = { 2.GB * task.attempt }
|
|
||||||
cpus = 1
|
|
||||||
|
|
||||||
// Retry for exit codes that have something to do with memory issues
|
|
||||||
errorStrategy = { task.exitStatus in 137..140 ? 'retry' : 'terminate' }
|
|
||||||
maxRetries = 3
|
|
||||||
maxMemory = null
|
|
||||||
|
|
||||||
// CPU resources
|
|
||||||
withLabel: singlecpu { cpus = 1 }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midcpu { cpus = 10 }
|
|
||||||
withLabel: highcpu { cpus = 20 }
|
|
||||||
|
|
||||||
// Memory resources
|
|
||||||
withLabel: lowmem { memory = { get_memory( 4.GB * task.attempt ) } }
|
|
||||||
withLabel: midmem { memory = { get_memory( 25.GB * task.attempt ) } }
|
|
||||||
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
|
||||||
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
|
||||||
|
|
||||||
// Disk space
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: The above labels intentionally do not have an effect by default.
|
|
||||||
// The user should set the disk space requirements by adding the following
|
|
||||||
// to the compute environment:
|
|
||||||
//
|
|
||||||
// withLabel: lowdisk { disk = { 20.GB * task.attempt } }
|
|
||||||
// withLabel: middisk { disk = { 100.GB * task.attempt } }
|
|
||||||
// withLabel: highdisk { disk = { 200.GB * task.attempt } }
|
|
||||||
// withLabel: veryhighdisk { disk = { 500.GB * task.attempt } }
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_memory(to_compare) {
|
|
||||||
if (!process.containsKey("maxMemory") || !process.maxMemory) {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (process.containsKey("maxRetries") && process.maxRetries && task.attempt == (process.maxRetries as int)) {
|
|
||||||
return process.maxMemory
|
|
||||||
}
|
|
||||||
else if (to_compare.compareTo(process.maxMemory as nextflow.util.MemoryUnit) == 1) {
|
|
||||||
return max_memory as nextflow.util.MemoryUnit
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return to_compare
|
|
||||||
}
|
|
||||||
} catch (all) {
|
|
||||||
println "Error processing memory resources. Please check that process.maxMemory '${process.maxMemory}' and process.maxRetries '${process.maxRetries}' are valid!"
|
|
||||||
System.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
process {
|
|
||||||
withLabel: lowmem { memory = 13.Gb }
|
|
||||||
withLabel: lowcpu { cpus = 4 }
|
|
||||||
withLabel: midmem { memory = 13.Gb }
|
|
||||||
withLabel: midcpu { cpus = 4 }
|
|
||||||
withLabel: highmem { memory = 13.Gb }
|
|
||||||
withLabel: highcpu { cpus = 4 }
|
|
||||||
withLabel: veryhighmem { memory = 13.Gb }
|
|
||||||
withLabel: lowdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: middisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: highdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
withLabel: veryhighdisk {
|
|
||||||
disk = {process.disk ? process.disk : null}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
env.NUMBA_CACHE_DIR = '/tmp'
|
|
||||||
|
|
||||||
trace {
|
|
||||||
enabled = true
|
|
||||||
overwrite = true
|
|
||||||
}
|
|
||||||
dag {
|
|
||||||
overwrite = true
|
|
||||||
}
|
|
||||||
|
|
||||||
process.maxForks = 1
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
name: "split_modalities"
|
name: "split_modalities"
|
||||||
namespace: "workflows/multiomics"
|
namespace: "workflows/multiomics"
|
||||||
version: "disable-scrublet_build"
|
version: "v3.0.0"
|
||||||
authors:
|
authors:
|
||||||
- name: "Dries Schaumont"
|
- name: "Dries Schaumont"
|
||||||
roles:
|
roles:
|
||||||
@@ -173,6 +173,9 @@ runners:
|
|||||||
- "includeConfig(\"nextflow_labels.config\")"
|
- "includeConfig(\"nextflow_labels.config\")"
|
||||||
debug: false
|
debug: false
|
||||||
container: "docker"
|
container: "docker"
|
||||||
|
engines:
|
||||||
|
- type: "native"
|
||||||
|
id: "native"
|
||||||
build_info:
|
build_info:
|
||||||
config: "src/workflows/multiomics/split_modalities/config.vsh.yaml"
|
config: "src/workflows/multiomics/split_modalities/config.vsh.yaml"
|
||||||
runner: "nextflow"
|
runner: "nextflow"
|
||||||
@@ -180,13 +183,14 @@ build_info:
|
|||||||
output: "target/_private/nextflow/workflows/multiomics/split_modalities"
|
output: "target/_private/nextflow/workflows/multiomics/split_modalities"
|
||||||
executable: "target/_private/nextflow/workflows/multiomics/split_modalities/main.nf"
|
executable: "target/_private/nextflow/workflows/multiomics/split_modalities/main.nf"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "07297b53180b28c8e198414328683e941eec7ed0"
|
git_commit: "e92e56b49125af8ef2ebb11586191a6cbf9a8457"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline"
|
||||||
git_tag: "0.2.0-2044-g07297b53180"
|
git_tag: "0.2.0-2059-ge92e56b4"
|
||||||
dependencies:
|
dependencies:
|
||||||
- "target/nextflow/dataflow/split_modalities"
|
- "target/nextflow/dataflow/split_modalities"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline"
|
name: "openpipeline"
|
||||||
|
version: "v3.0.0"
|
||||||
summary: "Best-practice workflows for single-cell multi-omics analyses.\n"
|
summary: "Best-practice workflows for single-cell multi-omics analyses.\n"
|
||||||
description: "OpenPipelines are extensible single cell analysis pipelines for reproducible\
|
description: "OpenPipelines are extensible single cell analysis pipelines for reproducible\
|
||||||
\ and large-scale single cell processing using [Viash](https://viash.io) and [Nextflow](https://www.nextflow.io/).\n\
|
\ and large-scale single cell processing using [Viash](https://viash.io) and [Nextflow](https://www.nextflow.io/).\n\
|
||||||
@@ -203,6 +207,10 @@ package_config:
|
|||||||
- type: "s3"
|
- type: "s3"
|
||||||
path: "s3://openpipelines-data"
|
path: "s3://openpipelines-data"
|
||||||
dest: "resources_test"
|
dest: "resources_test"
|
||||||
|
nextflow_labels_ci:
|
||||||
|
- path: "src/workflows/utils/labels_ci.config"
|
||||||
|
description: "Adds the correct memory and CPU labels when running on the Viash\
|
||||||
|
\ Hub CI."
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
source: "src"
|
source: "src"
|
||||||
target: "target"
|
target: "target"
|
||||||
@@ -210,12 +218,14 @@ package_config:
|
|||||||
- ".resources += {path: '/src/workflows/utils/labels.config', dest: 'nextflow_labels.config'}\n\
|
- ".resources += {path: '/src/workflows/utils/labels.config', dest: 'nextflow_labels.config'}\n\
|
||||||
.runners[.type == 'nextflow'].config.script := 'includeConfig(\"nextflow_labels.config\"\
|
.runners[.type == 'nextflow'].config.script := 'includeConfig(\"nextflow_labels.config\"\
|
||||||
)'"
|
)'"
|
||||||
- ".version := \"disable-scrublet_build\""
|
- ".engines += { type: \"native\" }"
|
||||||
|
- ".engines[.type == 'docker'].target_registry := 'images.viash-hub.com'"
|
||||||
|
- ".engines[.type == 'docker'].target_tag := 'v3.0.0'"
|
||||||
keywords:
|
keywords:
|
||||||
- "single-cell"
|
- "single-cell"
|
||||||
- "multimodal"
|
- "multimodal"
|
||||||
license: "MIT"
|
license: "MIT"
|
||||||
organization: "openpipelines-bio"
|
organization: "vsh"
|
||||||
links:
|
links:
|
||||||
repository: "https://github.com/openpipelines-bio/openpipeline"
|
repository: "https://github.com/openpipelines-bio/openpipeline"
|
||||||
docker_registry: "ghcr.io"
|
docker_registry: "ghcr.io"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// split_modalities disable-scrublet_build
|
// split_modalities v3.0.0
|
||||||
//
|
//
|
||||||
// This wrapper script is auto-generated by viash 0.9.4 and is thus a derivative
|
// This wrapper script is auto-generated by viash 0.9.4 and is thus a derivative
|
||||||
// work thereof. This software comes with ABSOLUTELY NO WARRANTY from Data
|
// work thereof. This software comes with ABSOLUTELY NO WARRANTY from Data
|
||||||
@@ -3035,7 +3035,7 @@ meta = [
|
|||||||
"config": processConfig(readJsonBlob('''{
|
"config": processConfig(readJsonBlob('''{
|
||||||
"name" : "split_modalities",
|
"name" : "split_modalities",
|
||||||
"namespace" : "workflows/multiomics",
|
"namespace" : "workflows/multiomics",
|
||||||
"version" : "disable-scrublet_build",
|
"version" : "v3.0.0",
|
||||||
"authors" : [
|
"authors" : [
|
||||||
{
|
{
|
||||||
"name" : "Dries Schaumont",
|
"name" : "Dries Schaumont",
|
||||||
@@ -3269,17 +3269,18 @@ meta = [
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"build_info" : {
|
"build_info" : {
|
||||||
"config" : "/home/runner/work/openpipeline/openpipeline/src/workflows/multiomics/split_modalities/config.vsh.yaml",
|
"config" : "/workdir/root/repo/src/workflows/multiomics/split_modalities/config.vsh.yaml",
|
||||||
"runner" : "nextflow",
|
"runner" : "nextflow",
|
||||||
"engine" : "native",
|
"engine" : "native",
|
||||||
"output" : "/home/runner/work/openpipeline/openpipeline/target/_private/nextflow/workflows/multiomics/split_modalities",
|
"output" : "/workdir/root/repo/target/_private/nextflow/workflows/multiomics/split_modalities",
|
||||||
"viash_version" : "0.9.4",
|
"viash_version" : "0.9.4",
|
||||||
"git_commit" : "07297b53180b28c8e198414328683e941eec7ed0",
|
"git_commit" : "e92e56b49125af8ef2ebb11586191a6cbf9a8457",
|
||||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline",
|
"git_remote" : "https://github.com/openpipelines-bio/openpipeline",
|
||||||
"git_tag" : "0.2.0-2044-g07297b53180"
|
"git_tag" : "0.2.0-2059-ge92e56b4"
|
||||||
},
|
},
|
||||||
"package_config" : {
|
"package_config" : {
|
||||||
"name" : "openpipeline",
|
"name" : "openpipeline",
|
||||||
|
"version" : "v3.0.0",
|
||||||
"summary" : "Best-practice workflows for single-cell multi-omics analyses.\n",
|
"summary" : "Best-practice workflows for single-cell multi-omics analyses.\n",
|
||||||
"description" : "OpenPipelines are extensible single cell analysis pipelines for reproducible and large-scale single cell processing using [Viash](https://viash.io) and [Nextflow](https://www.nextflow.io/).\n\nIn terms of workflows, the following has been made available, but keep in mind that\nindividual tools and functionality can be executed as standalone components as well.\n\n * Demultiplexing: conversion of raw sequencing data to FASTQ objects.\n * Ingestion: Read mapping and generating a count matrix.\n * Single sample processing: cell filtering and doublet detection.\n * Multisample processing: Count transformation, normalization, QC metric calulations.\n * Integration: Clustering, integration and batch correction using single and multimodal methods.\n * Downstream analysis workflows\n",
|
"description" : "OpenPipelines are extensible single cell analysis pipelines for reproducible and large-scale single cell processing using [Viash](https://viash.io) and [Nextflow](https://www.nextflow.io/).\n\nIn terms of workflows, the following has been made available, but keep in mind that\nindividual tools and functionality can be executed as standalone components as well.\n\n * Demultiplexing: conversion of raw sequencing data to FASTQ objects.\n * Ingestion: Read mapping and generating a count matrix.\n * Single sample processing: cell filtering and doublet detection.\n * Multisample processing: Count transformation, normalization, QC metric calulations.\n * Integration: Clustering, integration and batch correction using single and multimodal methods.\n * Downstream analysis workflows\n",
|
||||||
"info" : {
|
"info" : {
|
||||||
@@ -3289,21 +3290,29 @@ meta = [
|
|||||||
"path" : "s3://openpipelines-data",
|
"path" : "s3://openpipelines-data",
|
||||||
"dest" : "resources_test"
|
"dest" : "resources_test"
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"nextflow_labels_ci" : [
|
||||||
|
{
|
||||||
|
"path" : "src/workflows/utils/labels_ci.config",
|
||||||
|
"description" : "Adds the correct memory and CPU labels when running on the Viash Hub CI."
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"viash_version" : "0.9.4",
|
"viash_version" : "0.9.4",
|
||||||
"source" : "/home/runner/work/openpipeline/openpipeline/src",
|
"source" : "/workdir/root/repo/src",
|
||||||
"target" : "/home/runner/work/openpipeline/openpipeline/target",
|
"target" : "/workdir/root/repo/target",
|
||||||
"config_mods" : [
|
"config_mods" : [
|
||||||
".resources += {path: '/src/workflows/utils/labels.config', dest: 'nextflow_labels.config'}\n.runners[.type == 'nextflow'].config.script := 'includeConfig(\\"nextflow_labels.config\\")'",
|
".resources += {path: '/src/workflows/utils/labels.config', dest: 'nextflow_labels.config'}\n.runners[.type == 'nextflow'].config.script := 'includeConfig(\\"nextflow_labels.config\\")'",
|
||||||
".version := \\"disable-scrublet_build\\""
|
".engines += { type: \\"native\\" }",
|
||||||
|
".engines[.type == 'docker'].target_registry := 'images.viash-hub.com'",
|
||||||
|
".engines[.type == 'docker'].target_tag := 'v3.0.0'"
|
||||||
],
|
],
|
||||||
"keywords" : [
|
"keywords" : [
|
||||||
"single-cell",
|
"single-cell",
|
||||||
"multimodal"
|
"multimodal"
|
||||||
],
|
],
|
||||||
"license" : "MIT",
|
"license" : "MIT",
|
||||||
"organization" : "openpipelines-bio",
|
"organization" : "vsh",
|
||||||
"links" : {
|
"links" : {
|
||||||
"repository" : "https://github.com/openpipelines-bio/openpipeline",
|
"repository" : "https://github.com/openpipelines-bio/openpipeline",
|
||||||
"docker_registry" : "ghcr.io",
|
"docker_registry" : "ghcr.io",
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user