Build branch build/main with version build_main (33c1a3a)
Build pipeline: openpipelines-bio.openpipeline-spatial.build-main-rtgd7
Source commit: 33c1a3afb0
Source message: deploy: a14a97d04951b3cd02cf6a5dff6ee4c539b3aae8
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
* `mapping/spaceranger_count`: Added a spaceranger count component (PR #2).
|
* `mapping/spaceranger_count`: Added a spaceranger count component (PR #2).
|
||||||
|
|
||||||
* `convert/from_spatialdata_to_h5mu`, `convert/from_xenium_to_spatialdata`: Added converter components for xenium data (PR #1).
|
* `convert/from_spatialdata_to_h5mu`, `convert/from_xenium_to_spatialdata`, `convert/from_xenium_to_h5mu`: Added converter components for xenium data (PR #1, #10).
|
||||||
|
|
||||||
* `convert/from_xenium_to_spatialexperiment`, `convert/from_cosmx_to_spatialexperiment`: Added converter components for Xenium or CosMx data to SpatialExperiment objects (PR #9).
|
* `convert/from_xenium_to_spatialexperiment`, `convert/from_cosmx_to_spatialexperiment`: Added converter components for Xenium or CosMx data to SpatialExperiment objects (PR #9).
|
||||||
|
|
||||||
|
|||||||
9
src/base/h5_compression_argument.yaml
Normal file
9
src/base/h5_compression_argument.yaml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
arguments:
|
||||||
|
- name: "--output_compression"
|
||||||
|
description: |
|
||||||
|
Compression format to use for the output AnnData and/or Mudata objects.
|
||||||
|
By default no compression is applied.
|
||||||
|
type: string
|
||||||
|
choices: ["gzip", "lzf"]
|
||||||
|
required: false
|
||||||
|
example: "gzip"
|
||||||
69
src/convert/from_xenium_to_h5mu/config.vsh.yaml
Normal file
69
src/convert/from_xenium_to_h5mu/config.vsh.yaml
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
name: "from_xenium_to_h5mu"
|
||||||
|
namespace: "convert"
|
||||||
|
scope: "public"
|
||||||
|
description: |
|
||||||
|
Converts the output from Xenium to a single .h5mu file, where the count matrix is written to the `rna` modality.
|
||||||
|
The following files are expected to be present in the Xenium output bundle:
|
||||||
|
├── cell_feature_matrix.h5
|
||||||
|
├── cells.parquet
|
||||||
|
├── experiment.xenium
|
||||||
|
└── metrics_summary.csv
|
||||||
|
|
||||||
|
authors:
|
||||||
|
- __merge__: /src/authors/dorien_roosen.yaml
|
||||||
|
roles: [ maintainer ]
|
||||||
|
arguments:
|
||||||
|
- name: "--input"
|
||||||
|
alternatives: ["-i"]
|
||||||
|
type: file
|
||||||
|
description: Input folder. Must contain the output from a Xenium run.
|
||||||
|
example: xenium_output_bundle
|
||||||
|
direction: input
|
||||||
|
required: true
|
||||||
|
- name: "--output"
|
||||||
|
alternatives: ["-o"]
|
||||||
|
type: file
|
||||||
|
description: Output .h5mu file.
|
||||||
|
example: "xenium.h5mu"
|
||||||
|
direction: output
|
||||||
|
- name: "--obsm_coordinates"
|
||||||
|
type: string
|
||||||
|
description: Name of the .obsm slot under which to store the cell centroid coordinates.
|
||||||
|
default: "spatial"
|
||||||
|
- name: "--uns_experiment"
|
||||||
|
type: string
|
||||||
|
description: Name of the .uns slot under which to store the Xenium experiment specifications.
|
||||||
|
default: "xenium_experiment"
|
||||||
|
- name: "--uns_metrics"
|
||||||
|
type: string
|
||||||
|
description: Name of the .uns slot under which to store the summary QC metrics.
|
||||||
|
default: "xenium_metrics"
|
||||||
|
__merge__: [., /src/base/h5_compression_argument.yaml]
|
||||||
|
|
||||||
|
resources:
|
||||||
|
- type: python_script
|
||||||
|
path: script.py
|
||||||
|
- path: /src/utils/setup_logger.py
|
||||||
|
test_resources:
|
||||||
|
- type: python_script
|
||||||
|
path: test.py
|
||||||
|
- path: /resources_test/xenium/xenium_tiny
|
||||||
|
engines:
|
||||||
|
- type: docker
|
||||||
|
image: python:3.12-slim
|
||||||
|
setup:
|
||||||
|
- type: apt
|
||||||
|
packages:
|
||||||
|
- procps
|
||||||
|
- type: python
|
||||||
|
__merge__: [/src/base/requirements/anndata_mudata.yaml, /src/base/requirements/scanpy.yaml, .]
|
||||||
|
packages:
|
||||||
|
- pyarrow
|
||||||
|
test_setup:
|
||||||
|
- type: python
|
||||||
|
__merge__: [ /src/base/requirements/viashpy.yaml, .]
|
||||||
|
runners:
|
||||||
|
- type: executable
|
||||||
|
- type: nextflow
|
||||||
|
directives:
|
||||||
|
label: [lowmem, singlecpu]
|
||||||
75
src/convert/from_xenium_to_h5mu/script.py
Normal file
75
src/convert/from_xenium_to_h5mu/script.py
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
import scanpy as sc
|
||||||
|
import pandas as pd
|
||||||
|
import mudata as mu
|
||||||
|
import json
|
||||||
|
|
||||||
|
## VIASH START
|
||||||
|
par = {
|
||||||
|
"input": "./resources_test/xenium/xenium_tiny",
|
||||||
|
"output": "xenium_tiny_test.h5mu",
|
||||||
|
"output_compression": "gzip",
|
||||||
|
"obsm_coordinates": "spatial",
|
||||||
|
"uns_experiment": "xenium_experiment",
|
||||||
|
"uns_metrics": "xenium_metrics",
|
||||||
|
}
|
||||||
|
meta = {"resources_dir": "src/utils"}
|
||||||
|
## VIASH END
|
||||||
|
|
||||||
|
sys.path.append(meta["resources_dir"])
|
||||||
|
from setup_logger import setup_logger
|
||||||
|
|
||||||
|
logger = setup_logger()
|
||||||
|
|
||||||
|
# Expected folder structure (showing only relevant files):
|
||||||
|
# ├── cell_feature_matrix.h5
|
||||||
|
# ├── cells.parquet
|
||||||
|
# ├── experiment.xenium
|
||||||
|
# └── metrics_summary.csv
|
||||||
|
input_dir = Path(par["input"])
|
||||||
|
input_data = {
|
||||||
|
"count_matrix": input_dir / "cell_feature_matrix.h5",
|
||||||
|
"cells_metadata": input_dir / "cells.parquet",
|
||||||
|
"experiment": input_dir / "experiment.xenium",
|
||||||
|
"metrics_summary": input_dir / "metrics_summary.csv",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def _format_cell_id_column(cell_id_column: pd.Series) -> pd.Series:
|
||||||
|
"""Convert cell IDs to string format, decoding bytes if necessary."""
|
||||||
|
return cell_id_column.apply(
|
||||||
|
lambda x: x.decode("utf-8") if isinstance(x, bytes) else str(x)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Read data from Xenium output bundle
|
||||||
|
logger.info("Reading input data...")
|
||||||
|
|
||||||
|
assert all([file.exists() for file in input_data.values()]), (
|
||||||
|
f"Not all required input files are found. Make sure that {par['input']} contains {input_data.values()}."
|
||||||
|
)
|
||||||
|
|
||||||
|
adata = sc.read_10x_h5(input_data["count_matrix"])
|
||||||
|
metadata = pd.read_parquet(input_data["cells_metadata"], engine="pyarrow")
|
||||||
|
with open(input_data["experiment"], "r") as f:
|
||||||
|
specs = json.load(f)
|
||||||
|
metrics_summary = pd.read_csv(
|
||||||
|
input_data["metrics_summary"], decimal=".", quotechar='"', thousands=","
|
||||||
|
)
|
||||||
|
|
||||||
|
# Extract and format required columns
|
||||||
|
cell_ids = _format_cell_id_column(metadata["cell_id"])
|
||||||
|
coordinates = metadata[["x_centroid", "y_centroid"]].to_numpy()
|
||||||
|
metadata.drop(["cell_id", "x_centroid", "y_centroid"], axis=1, inplace=True)
|
||||||
|
|
||||||
|
# Updata AnnData with metadata
|
||||||
|
adata.obs = metadata
|
||||||
|
adata.obs_names = cell_ids
|
||||||
|
adata.obsm[par["obsm_coordinates"]] = coordinates
|
||||||
|
adata.uns[par["uns_experiment"]] = specs
|
||||||
|
adata.uns[par["uns_metrics"]] = metrics_summary
|
||||||
|
|
||||||
|
# Write output MuData
|
||||||
|
mdata = mu.MuData({"rna": adata})
|
||||||
|
mdata.write_h5mu(par["output"], compression=par["output_compression"])
|
||||||
97
src/convert/from_xenium_to_h5mu/test.py
Normal file
97
src/convert/from_xenium_to_h5mu/test.py
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
import pytest
|
||||||
|
import sys
|
||||||
|
import mudata as mu
|
||||||
|
|
||||||
|
## VIASH START
|
||||||
|
meta = {
|
||||||
|
"executable": "./target/executable/convert/from_cellranger_multi_to_h5mu/from_cellranger_multi_to_h5mu",
|
||||||
|
"resources_dir": "resources_test/",
|
||||||
|
"config": "src/convert/from_cellranger_multi_to_h5mu/config.vsh.yaml",
|
||||||
|
}
|
||||||
|
## VIASH END
|
||||||
|
|
||||||
|
input = f"{meta['resources_dir']}/xenium_tiny"
|
||||||
|
|
||||||
|
|
||||||
|
def test_simple_execution(run_component, tmp_path):
|
||||||
|
output = tmp_path / "xenium.h5mu"
|
||||||
|
|
||||||
|
# run component
|
||||||
|
run_component(
|
||||||
|
["--input", input, "--output", str(output), "--output_compression", "gzip"]
|
||||||
|
)
|
||||||
|
|
||||||
|
assert output.is_file(), "output file was not created"
|
||||||
|
|
||||||
|
mdata = mu.read_h5mu(output)
|
||||||
|
assert list(mdata.mod.keys()) == ["rna"], "Expected modality rna"
|
||||||
|
adata = mdata.mod["rna"]
|
||||||
|
|
||||||
|
assert list(adata.obs.keys()) == [
|
||||||
|
"transcript_counts",
|
||||||
|
"control_probe_counts",
|
||||||
|
"genomic_control_counts",
|
||||||
|
"control_codeword_counts",
|
||||||
|
"unassigned_codeword_counts",
|
||||||
|
"deprecated_codeword_counts",
|
||||||
|
"total_counts",
|
||||||
|
"cell_area",
|
||||||
|
"nucleus_area",
|
||||||
|
"nucleus_count",
|
||||||
|
"segmentation_method",
|
||||||
|
]
|
||||||
|
|
||||||
|
assert list(adata.uns.keys()) == ["xenium_experiment", "xenium_metrics"]
|
||||||
|
assert list(adata.obsm.keys()) == ["spatial"]
|
||||||
|
assert list(adata.var.keys()) == ["gene_ids", "feature_types", "genome"]
|
||||||
|
|
||||||
|
assert adata.X.dtype.kind == "f"
|
||||||
|
assert all(adata.var["feature_types"] == "Gene Expression")
|
||||||
|
assert adata.obsm["spatial"].dtype == "float"
|
||||||
|
obs_counts = [
|
||||||
|
"transcript_counts",
|
||||||
|
"control_probe_counts",
|
||||||
|
"genomic_control_counts",
|
||||||
|
"unassigned_codeword_counts",
|
||||||
|
"deprecated_codeword_counts",
|
||||||
|
"total_counts",
|
||||||
|
"nucleus_count",
|
||||||
|
]
|
||||||
|
assert all([adata.obs[obs].dtype == "int" for obs in obs_counts])
|
||||||
|
obs_areas = ["cell_area", "nucleus_area"]
|
||||||
|
assert all([adata.obs[obs].dtype == "float" for obs in obs_areas])
|
||||||
|
|
||||||
|
|
||||||
|
def test_rename_fields(run_component, tmp_path):
|
||||||
|
output = tmp_path / "xenium.h5mu"
|
||||||
|
|
||||||
|
# run component
|
||||||
|
run_component(
|
||||||
|
[
|
||||||
|
"--input",
|
||||||
|
input,
|
||||||
|
"--output",
|
||||||
|
str(output),
|
||||||
|
"--obsm_coordinates",
|
||||||
|
"test_coord",
|
||||||
|
"--uns_experiment",
|
||||||
|
"test_experiment",
|
||||||
|
"--uns_metrics",
|
||||||
|
"test_metrics",
|
||||||
|
"--output_compression",
|
||||||
|
"gzip",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
assert output.is_file(), "output file was not created"
|
||||||
|
|
||||||
|
mdata = mu.read_h5mu(output)
|
||||||
|
assert list(mdata.mod.keys()) == ["rna"]
|
||||||
|
adata = mdata.mod["rna"]
|
||||||
|
|
||||||
|
assert list(adata.uns.keys()) == ["test_experiment", "test_metrics"]
|
||||||
|
assert list(adata.obsm.keys()) == ["test_coord"]
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(pytest.main([__file__]))
|
||||||
@@ -229,7 +229,7 @@ build_info:
|
|||||||
output: "target/executable/convert/from_cosmx_to_h5mu"
|
output: "target/executable/convert/from_cosmx_to_h5mu"
|
||||||
executable: "target/executable/convert/from_cosmx_to_h5mu/from_cosmx_to_h5mu"
|
executable: "target/executable/convert/from_cosmx_to_h5mu/from_cosmx_to_h5mu"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline_spatial"
|
name: "openpipeline_spatial"
|
||||||
|
|||||||
@@ -459,9 +459,9 @@ RUN pip install --upgrade pip && \
|
|||||||
|
|
||||||
LABEL org.opencontainers.image.authors="Dorien Roosen, Weiwei Schultz"
|
LABEL org.opencontainers.image.authors="Dorien Roosen, Weiwei Schultz"
|
||||||
LABEL org.opencontainers.image.description="Companion container for running component convert from_cosmx_to_h5mu"
|
LABEL org.opencontainers.image.description="Companion container for running component convert from_cosmx_to_h5mu"
|
||||||
LABEL org.opencontainers.image.created="2025-08-18T07:54:17Z"
|
LABEL org.opencontainers.image.created="2025-08-19T11:57:43Z"
|
||||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
LABEL org.opencontainers.image.revision="226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
LABEL org.opencontainers.image.version="build_main"
|
LABEL org.opencontainers.image.version="build_main"
|
||||||
|
|
||||||
VIASHDOCKER
|
VIASHDOCKER
|
||||||
|
|||||||
@@ -236,7 +236,7 @@ build_info:
|
|||||||
output: "target/executable/convert/from_cosmx_to_spatialexperiment"
|
output: "target/executable/convert/from_cosmx_to_spatialexperiment"
|
||||||
executable: "target/executable/convert/from_cosmx_to_spatialexperiment/from_cosmx_to_spatialexperiment"
|
executable: "target/executable/convert/from_cosmx_to_spatialexperiment/from_cosmx_to_spatialexperiment"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline_spatial"
|
name: "openpipeline_spatial"
|
||||||
|
|||||||
@@ -457,9 +457,9 @@ RUN Rscript -e 'options(warn = 2); if (!requireNamespace("BiocManager", quietly
|
|||||||
|
|
||||||
LABEL org.opencontainers.image.authors="Dorien Roosen"
|
LABEL org.opencontainers.image.authors="Dorien Roosen"
|
||||||
LABEL org.opencontainers.image.description="Companion container for running component convert from_cosmx_to_spatialexperiment"
|
LABEL org.opencontainers.image.description="Companion container for running component convert from_cosmx_to_spatialexperiment"
|
||||||
LABEL org.opencontainers.image.created="2025-08-18T07:54:16Z"
|
LABEL org.opencontainers.image.created="2025-08-19T11:57:42Z"
|
||||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
LABEL org.opencontainers.image.revision="226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
LABEL org.opencontainers.image.version="build_main"
|
LABEL org.opencontainers.image.version="build_main"
|
||||||
|
|
||||||
VIASHDOCKER
|
VIASHDOCKER
|
||||||
|
|||||||
@@ -224,7 +224,7 @@ build_info:
|
|||||||
output: "target/executable/convert/from_spatialdata_to_h5mu"
|
output: "target/executable/convert/from_spatialdata_to_h5mu"
|
||||||
executable: "target/executable/convert/from_spatialdata_to_h5mu/from_spatialdata_to_h5mu"
|
executable: "target/executable/convert/from_spatialdata_to_h5mu/from_spatialdata_to_h5mu"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline_spatial"
|
name: "openpipeline_spatial"
|
||||||
|
|||||||
@@ -459,9 +459,9 @@ RUN pip install --upgrade pip && \
|
|||||||
|
|
||||||
LABEL org.opencontainers.image.authors="Dorien Roosen, Weiwei Schultz"
|
LABEL org.opencontainers.image.authors="Dorien Roosen, Weiwei Schultz"
|
||||||
LABEL org.opencontainers.image.description="Companion container for running component convert from_spatialdata_to_h5mu"
|
LABEL org.opencontainers.image.description="Companion container for running component convert from_spatialdata_to_h5mu"
|
||||||
LABEL org.opencontainers.image.created="2025-08-18T07:54:16Z"
|
LABEL org.opencontainers.image.created="2025-08-19T11:57:42Z"
|
||||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
LABEL org.opencontainers.image.revision="226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
LABEL org.opencontainers.image.version="build_main"
|
LABEL org.opencontainers.image.version="build_main"
|
||||||
|
|
||||||
VIASHDOCKER
|
VIASHDOCKER
|
||||||
|
|||||||
272
target/executable/convert/from_xenium_to_h5mu/.config.vsh.yaml
Normal file
272
target/executable/convert/from_xenium_to_h5mu/.config.vsh.yaml
Normal file
@@ -0,0 +1,272 @@
|
|||||||
|
name: "from_xenium_to_h5mu"
|
||||||
|
namespace: "convert"
|
||||||
|
version: "build_main"
|
||||||
|
authors:
|
||||||
|
- name: "Dorien Roosen"
|
||||||
|
roles:
|
||||||
|
- "maintainer"
|
||||||
|
info:
|
||||||
|
role: "Core Team Member"
|
||||||
|
links:
|
||||||
|
email: "dorien@data-intuitive.com"
|
||||||
|
github: "dorien-er"
|
||||||
|
linkedin: "dorien-roosen"
|
||||||
|
organizations:
|
||||||
|
- name: "Data Intuitive"
|
||||||
|
href: "https://www.data-intuitive.com"
|
||||||
|
role: "Data Scientist"
|
||||||
|
argument_groups:
|
||||||
|
- name: "Arguments"
|
||||||
|
arguments:
|
||||||
|
- type: "file"
|
||||||
|
name: "--input"
|
||||||
|
alternatives:
|
||||||
|
- "-i"
|
||||||
|
description: "Input folder. Must contain the output from a Xenium run."
|
||||||
|
info: null
|
||||||
|
example:
|
||||||
|
- "xenium_output_bundle"
|
||||||
|
must_exist: true
|
||||||
|
create_parent: true
|
||||||
|
required: true
|
||||||
|
direction: "input"
|
||||||
|
multiple: false
|
||||||
|
multiple_sep: ";"
|
||||||
|
- type: "file"
|
||||||
|
name: "--output"
|
||||||
|
alternatives:
|
||||||
|
- "-o"
|
||||||
|
description: "Output .h5mu file."
|
||||||
|
info: null
|
||||||
|
example:
|
||||||
|
- "xenium.h5mu"
|
||||||
|
must_exist: true
|
||||||
|
create_parent: true
|
||||||
|
required: false
|
||||||
|
direction: "output"
|
||||||
|
multiple: false
|
||||||
|
multiple_sep: ";"
|
||||||
|
- type: "string"
|
||||||
|
name: "--obsm_coordinates"
|
||||||
|
description: "Name of the .obsm slot under which to store the cell centroid coordinates."
|
||||||
|
info: null
|
||||||
|
default:
|
||||||
|
- "spatial"
|
||||||
|
required: false
|
||||||
|
direction: "input"
|
||||||
|
multiple: false
|
||||||
|
multiple_sep: ";"
|
||||||
|
- type: "string"
|
||||||
|
name: "--uns_experiment"
|
||||||
|
description: "Name of the .uns slot under which to store the Xenium experiment\
|
||||||
|
\ specifications."
|
||||||
|
info: null
|
||||||
|
default:
|
||||||
|
- "xenium_experiment"
|
||||||
|
required: false
|
||||||
|
direction: "input"
|
||||||
|
multiple: false
|
||||||
|
multiple_sep: ";"
|
||||||
|
- type: "string"
|
||||||
|
name: "--uns_metrics"
|
||||||
|
description: "Name of the .uns slot under which to store the summary QC metrics."
|
||||||
|
info: null
|
||||||
|
default:
|
||||||
|
- "xenium_metrics"
|
||||||
|
required: false
|
||||||
|
direction: "input"
|
||||||
|
multiple: false
|
||||||
|
multiple_sep: ";"
|
||||||
|
- type: "string"
|
||||||
|
name: "--output_compression"
|
||||||
|
description: "Compression format to use for the output AnnData and/or Mudata objects.\n\
|
||||||
|
By default no compression is applied.\n"
|
||||||
|
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: "nextflow_labels.config"
|
||||||
|
dest: "nextflow_labels.config"
|
||||||
|
description: "Converts the output from Xenium to a single .h5mu file, where the count\
|
||||||
|
\ matrix is written to the `rna` modality.\nThe following files are expected to\
|
||||||
|
\ be present in the Xenium output bundle:\n├── cell_feature_matrix.h5\n├── cells.parquet\n\
|
||||||
|
├── experiment.xenium\n└── metrics_summary.csv\n"
|
||||||
|
test_resources:
|
||||||
|
- type: "python_script"
|
||||||
|
path: "test.py"
|
||||||
|
is_executable: true
|
||||||
|
- type: "file"
|
||||||
|
path: "xenium_tiny"
|
||||||
|
info: null
|
||||||
|
status: "enabled"
|
||||||
|
scope:
|
||||||
|
image: "public"
|
||||||
|
target: "public"
|
||||||
|
repositories:
|
||||||
|
- type: "github"
|
||||||
|
name: "openpipeline"
|
||||||
|
repo: "openpipelines-bio/openpipeline"
|
||||||
|
tag: "2.1.2"
|
||||||
|
- type: "vsh"
|
||||||
|
name: "openpipeline_incubator"
|
||||||
|
repo: "openpipeline_incubator"
|
||||||
|
tag: "build/main"
|
||||||
|
links:
|
||||||
|
repository: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
|
docker_registry: "ghcr.io"
|
||||||
|
runners:
|
||||||
|
- type: "executable"
|
||||||
|
id: "executable"
|
||||||
|
docker_setup_strategy: "ifneedbepullelsecachedbuild"
|
||||||
|
- type: "nextflow"
|
||||||
|
id: "nextflow"
|
||||||
|
directives:
|
||||||
|
label:
|
||||||
|
- "lowmem"
|
||||||
|
- "singlecpu"
|
||||||
|
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.12-slim"
|
||||||
|
target_registry: "images.viash-hub.com"
|
||||||
|
target_tag: "build_main"
|
||||||
|
namespace_separator: "/"
|
||||||
|
setup:
|
||||||
|
- type: "apt"
|
||||||
|
packages:
|
||||||
|
- "procps"
|
||||||
|
interactive: false
|
||||||
|
- type: "python"
|
||||||
|
user: false
|
||||||
|
packages:
|
||||||
|
- "anndata~=0.11.1"
|
||||||
|
- "mudata~=0.3.1"
|
||||||
|
- "scanpy~=1.10.4"
|
||||||
|
- "pyarrow"
|
||||||
|
script:
|
||||||
|
- "exec(\"try:\\n import awkward\\nexcept ModuleNotFoundError:\\n exit(0)\\\
|
||||||
|
nelse: exit(1)\")"
|
||||||
|
upgrade: true
|
||||||
|
test_setup:
|
||||||
|
- type: "python"
|
||||||
|
user: false
|
||||||
|
packages:
|
||||||
|
- "viashpy==0.9.0"
|
||||||
|
upgrade: true
|
||||||
|
entrypoint: []
|
||||||
|
cmd: null
|
||||||
|
- type: "native"
|
||||||
|
id: "native"
|
||||||
|
build_info:
|
||||||
|
config: "src/convert/from_xenium_to_h5mu/config.vsh.yaml"
|
||||||
|
runner: "executable"
|
||||||
|
engine: "docker|native"
|
||||||
|
output: "target/executable/convert/from_xenium_to_h5mu"
|
||||||
|
executable: "target/executable/convert/from_xenium_to_h5mu/from_xenium_to_h5mu"
|
||||||
|
viash_version: "0.9.4"
|
||||||
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
|
package_config:
|
||||||
|
name: "openpipeline_spatial"
|
||||||
|
version: "build_main"
|
||||||
|
info:
|
||||||
|
test_resources:
|
||||||
|
- type: "s3"
|
||||||
|
path: "s3://openpipelines-bio/openpipeline_spatial/resources_test"
|
||||||
|
dest: "resources_test"
|
||||||
|
repositories:
|
||||||
|
- type: "github"
|
||||||
|
name: "openpipeline"
|
||||||
|
repo: "openpipelines-bio/openpipeline"
|
||||||
|
tag: "2.1.2"
|
||||||
|
- type: "vsh"
|
||||||
|
name: "openpipeline_incubator"
|
||||||
|
repo: "openpipeline_incubator"
|
||||||
|
tag: "build/main"
|
||||||
|
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\"\
|
||||||
|
)'"
|
||||||
|
- ".engines += { type: \"native\" }"
|
||||||
|
- ".engines[.type == 'docker'].target_registry := 'images.viash-hub.com'"
|
||||||
|
- ".engines[.type == 'docker'].target_tag := 'build_main'"
|
||||||
|
organization: "vsh"
|
||||||
|
links:
|
||||||
|
repository: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
|
docker_registry: "ghcr.io"
|
||||||
1289
target/executable/convert/from_xenium_to_h5mu/from_xenium_to_h5mu
Executable file
1289
target/executable/convert/from_xenium_to_h5mu/from_xenium_to_h5mu
Executable file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,68 @@
|
|||||||
|
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( 50.GB * task.attempt ) } }
|
||||||
|
withLabel: midmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
||||||
|
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
||||||
|
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
||||||
|
|
||||||
|
// Disk space
|
||||||
|
// Nextflow apparently can't handle empty directives, i.e.
|
||||||
|
// withLabel: lowdisk {}
|
||||||
|
// so for that reason we have to add a dummy directive
|
||||||
|
withLabel: lowdisk {
|
||||||
|
dummyDirective = "dummyValue"
|
||||||
|
}
|
||||||
|
withLabel: middisk {
|
||||||
|
dummyDirective = "dummyValue"
|
||||||
|
}
|
||||||
|
withLabel: highdisk {
|
||||||
|
dummyDirective = "dummyValue"
|
||||||
|
}
|
||||||
|
withLabel: veryhighdisk {
|
||||||
|
dummyDirective = "dummyValue"
|
||||||
|
}
|
||||||
|
// 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
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
|
||||||
@@ -318,7 +318,7 @@ build_info:
|
|||||||
output: "target/executable/convert/from_xenium_to_spatialdata"
|
output: "target/executable/convert/from_xenium_to_spatialdata"
|
||||||
executable: "target/executable/convert/from_xenium_to_spatialdata/from_xenium_to_spatialdata"
|
executable: "target/executable/convert/from_xenium_to_spatialdata/from_xenium_to_spatialdata"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline_spatial"
|
name: "openpipeline_spatial"
|
||||||
|
|||||||
@@ -458,9 +458,9 @@ RUN pip install --upgrade pip && \
|
|||||||
|
|
||||||
LABEL org.opencontainers.image.authors="Dorien Roosen, Weiwei Schultz"
|
LABEL org.opencontainers.image.authors="Dorien Roosen, Weiwei Schultz"
|
||||||
LABEL org.opencontainers.image.description="Companion container for running component convert from_xenium_to_spatialdata"
|
LABEL org.opencontainers.image.description="Companion container for running component convert from_xenium_to_spatialdata"
|
||||||
LABEL org.opencontainers.image.created="2025-08-18T07:54:17Z"
|
LABEL org.opencontainers.image.created="2025-08-19T11:57:43Z"
|
||||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
LABEL org.opencontainers.image.revision="226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
LABEL org.opencontainers.image.version="build_main"
|
LABEL org.opencontainers.image.version="build_main"
|
||||||
|
|
||||||
VIASHDOCKER
|
VIASHDOCKER
|
||||||
|
|||||||
@@ -226,7 +226,7 @@ build_info:
|
|||||||
output: "target/executable/convert/from_xenium_to_spatialexperiment"
|
output: "target/executable/convert/from_xenium_to_spatialexperiment"
|
||||||
executable: "target/executable/convert/from_xenium_to_spatialexperiment/from_xenium_to_spatialexperiment"
|
executable: "target/executable/convert/from_xenium_to_spatialexperiment/from_xenium_to_spatialexperiment"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline_spatial"
|
name: "openpipeline_spatial"
|
||||||
|
|||||||
@@ -457,9 +457,9 @@ RUN Rscript -e 'options(warn = 2); if (!requireNamespace("BiocManager", quietly
|
|||||||
|
|
||||||
LABEL org.opencontainers.image.authors="Dorien Roosen"
|
LABEL org.opencontainers.image.authors="Dorien Roosen"
|
||||||
LABEL org.opencontainers.image.description="Companion container for running component convert from_xenium_to_spatialexperiment"
|
LABEL org.opencontainers.image.description="Companion container for running component convert from_xenium_to_spatialexperiment"
|
||||||
LABEL org.opencontainers.image.created="2025-08-18T07:54:16Z"
|
LABEL org.opencontainers.image.created="2025-08-19T11:57:42Z"
|
||||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
LABEL org.opencontainers.image.revision="226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
LABEL org.opencontainers.image.version="build_main"
|
LABEL org.opencontainers.image.version="build_main"
|
||||||
|
|
||||||
VIASHDOCKER
|
VIASHDOCKER
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ build_info:
|
|||||||
output: "target/executable/filter/subset_cosmx"
|
output: "target/executable/filter/subset_cosmx"
|
||||||
executable: "target/executable/filter/subset_cosmx/subset_cosmx"
|
executable: "target/executable/filter/subset_cosmx/subset_cosmx"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline_spatial"
|
name: "openpipeline_spatial"
|
||||||
|
|||||||
@@ -458,9 +458,9 @@ RUN pip install --upgrade pip && \
|
|||||||
|
|
||||||
LABEL org.opencontainers.image.authors="Dorien Roosen, Weiwei Schultz"
|
LABEL org.opencontainers.image.authors="Dorien Roosen, Weiwei Schultz"
|
||||||
LABEL org.opencontainers.image.description="Companion container for running component filter subset_cosmx"
|
LABEL org.opencontainers.image.description="Companion container for running component filter subset_cosmx"
|
||||||
LABEL org.opencontainers.image.created="2025-08-18T07:54:16Z"
|
LABEL org.opencontainers.image.created="2025-08-19T11:57:42Z"
|
||||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
LABEL org.opencontainers.image.revision="226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
LABEL org.opencontainers.image.version="build_main"
|
LABEL org.opencontainers.image.version="build_main"
|
||||||
|
|
||||||
VIASHDOCKER
|
VIASHDOCKER
|
||||||
|
|||||||
@@ -430,7 +430,7 @@ build_info:
|
|||||||
output: "target/executable/mapping/spaceranger_count"
|
output: "target/executable/mapping/spaceranger_count"
|
||||||
executable: "target/executable/mapping/spaceranger_count/spaceranger_count"
|
executable: "target/executable/mapping/spaceranger_count/spaceranger_count"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline_spatial"
|
name: "openpipeline_spatial"
|
||||||
|
|||||||
@@ -453,9 +453,9 @@ apt upgrade -y && apt install -y procps && rm -rf /var/lib/apt/lists/*
|
|||||||
|
|
||||||
LABEL org.opencontainers.image.authors="Jakub Majercik"
|
LABEL org.opencontainers.image.authors="Jakub Majercik"
|
||||||
LABEL org.opencontainers.image.description="Companion container for running component mapping spaceranger_count"
|
LABEL org.opencontainers.image.description="Companion container for running component mapping spaceranger_count"
|
||||||
LABEL org.opencontainers.image.created="2025-08-18T07:54:17Z"
|
LABEL org.opencontainers.image.created="2025-08-19T11:57:43Z"
|
||||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
LABEL org.opencontainers.image.revision="226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
LABEL org.opencontainers.image.version="build_main"
|
LABEL org.opencontainers.image.version="build_main"
|
||||||
|
|
||||||
VIASHDOCKER
|
VIASHDOCKER
|
||||||
|
|||||||
@@ -229,7 +229,7 @@ build_info:
|
|||||||
output: "target/nextflow/convert/from_cosmx_to_h5mu"
|
output: "target/nextflow/convert/from_cosmx_to_h5mu"
|
||||||
executable: "target/nextflow/convert/from_cosmx_to_h5mu/main.nf"
|
executable: "target/nextflow/convert/from_cosmx_to_h5mu/main.nf"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline_spatial"
|
name: "openpipeline_spatial"
|
||||||
|
|||||||
@@ -3337,7 +3337,7 @@ meta = [
|
|||||||
"engine" : "docker|native",
|
"engine" : "docker|native",
|
||||||
"output" : "/workdir/root/repo/target/nextflow/convert/from_cosmx_to_h5mu",
|
"output" : "/workdir/root/repo/target/nextflow/convert/from_cosmx_to_h5mu",
|
||||||
"viash_version" : "0.9.4",
|
"viash_version" : "0.9.4",
|
||||||
"git_commit" : "226d7de695d56f116dd1ba8e08a51ebf63b153b3",
|
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
},
|
},
|
||||||
"package_config" : {
|
"package_config" : {
|
||||||
|
|||||||
@@ -236,7 +236,7 @@ build_info:
|
|||||||
output: "target/nextflow/convert/from_cosmx_to_spatialexperiment"
|
output: "target/nextflow/convert/from_cosmx_to_spatialexperiment"
|
||||||
executable: "target/nextflow/convert/from_cosmx_to_spatialexperiment/main.nf"
|
executable: "target/nextflow/convert/from_cosmx_to_spatialexperiment/main.nf"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline_spatial"
|
name: "openpipeline_spatial"
|
||||||
|
|||||||
@@ -3328,7 +3328,7 @@ meta = [
|
|||||||
"engine" : "docker|native",
|
"engine" : "docker|native",
|
||||||
"output" : "/workdir/root/repo/target/nextflow/convert/from_cosmx_to_spatialexperiment",
|
"output" : "/workdir/root/repo/target/nextflow/convert/from_cosmx_to_spatialexperiment",
|
||||||
"viash_version" : "0.9.4",
|
"viash_version" : "0.9.4",
|
||||||
"git_commit" : "226d7de695d56f116dd1ba8e08a51ebf63b153b3",
|
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
},
|
},
|
||||||
"package_config" : {
|
"package_config" : {
|
||||||
|
|||||||
@@ -224,7 +224,7 @@ build_info:
|
|||||||
output: "target/nextflow/convert/from_spatialdata_to_h5mu"
|
output: "target/nextflow/convert/from_spatialdata_to_h5mu"
|
||||||
executable: "target/nextflow/convert/from_spatialdata_to_h5mu/main.nf"
|
executable: "target/nextflow/convert/from_spatialdata_to_h5mu/main.nf"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline_spatial"
|
name: "openpipeline_spatial"
|
||||||
|
|||||||
@@ -3336,7 +3336,7 @@ meta = [
|
|||||||
"engine" : "docker|native",
|
"engine" : "docker|native",
|
||||||
"output" : "/workdir/root/repo/target/nextflow/convert/from_spatialdata_to_h5mu",
|
"output" : "/workdir/root/repo/target/nextflow/convert/from_spatialdata_to_h5mu",
|
||||||
"viash_version" : "0.9.4",
|
"viash_version" : "0.9.4",
|
||||||
"git_commit" : "226d7de695d56f116dd1ba8e08a51ebf63b153b3",
|
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
},
|
},
|
||||||
"package_config" : {
|
"package_config" : {
|
||||||
|
|||||||
272
target/nextflow/convert/from_xenium_to_h5mu/.config.vsh.yaml
Normal file
272
target/nextflow/convert/from_xenium_to_h5mu/.config.vsh.yaml
Normal file
@@ -0,0 +1,272 @@
|
|||||||
|
name: "from_xenium_to_h5mu"
|
||||||
|
namespace: "convert"
|
||||||
|
version: "build_main"
|
||||||
|
authors:
|
||||||
|
- name: "Dorien Roosen"
|
||||||
|
roles:
|
||||||
|
- "maintainer"
|
||||||
|
info:
|
||||||
|
role: "Core Team Member"
|
||||||
|
links:
|
||||||
|
email: "dorien@data-intuitive.com"
|
||||||
|
github: "dorien-er"
|
||||||
|
linkedin: "dorien-roosen"
|
||||||
|
organizations:
|
||||||
|
- name: "Data Intuitive"
|
||||||
|
href: "https://www.data-intuitive.com"
|
||||||
|
role: "Data Scientist"
|
||||||
|
argument_groups:
|
||||||
|
- name: "Arguments"
|
||||||
|
arguments:
|
||||||
|
- type: "file"
|
||||||
|
name: "--input"
|
||||||
|
alternatives:
|
||||||
|
- "-i"
|
||||||
|
description: "Input folder. Must contain the output from a Xenium run."
|
||||||
|
info: null
|
||||||
|
example:
|
||||||
|
- "xenium_output_bundle"
|
||||||
|
must_exist: true
|
||||||
|
create_parent: true
|
||||||
|
required: true
|
||||||
|
direction: "input"
|
||||||
|
multiple: false
|
||||||
|
multiple_sep: ";"
|
||||||
|
- type: "file"
|
||||||
|
name: "--output"
|
||||||
|
alternatives:
|
||||||
|
- "-o"
|
||||||
|
description: "Output .h5mu file."
|
||||||
|
info: null
|
||||||
|
example:
|
||||||
|
- "xenium.h5mu"
|
||||||
|
must_exist: true
|
||||||
|
create_parent: true
|
||||||
|
required: false
|
||||||
|
direction: "output"
|
||||||
|
multiple: false
|
||||||
|
multiple_sep: ";"
|
||||||
|
- type: "string"
|
||||||
|
name: "--obsm_coordinates"
|
||||||
|
description: "Name of the .obsm slot under which to store the cell centroid coordinates."
|
||||||
|
info: null
|
||||||
|
default:
|
||||||
|
- "spatial"
|
||||||
|
required: false
|
||||||
|
direction: "input"
|
||||||
|
multiple: false
|
||||||
|
multiple_sep: ";"
|
||||||
|
- type: "string"
|
||||||
|
name: "--uns_experiment"
|
||||||
|
description: "Name of the .uns slot under which to store the Xenium experiment\
|
||||||
|
\ specifications."
|
||||||
|
info: null
|
||||||
|
default:
|
||||||
|
- "xenium_experiment"
|
||||||
|
required: false
|
||||||
|
direction: "input"
|
||||||
|
multiple: false
|
||||||
|
multiple_sep: ";"
|
||||||
|
- type: "string"
|
||||||
|
name: "--uns_metrics"
|
||||||
|
description: "Name of the .uns slot under which to store the summary QC metrics."
|
||||||
|
info: null
|
||||||
|
default:
|
||||||
|
- "xenium_metrics"
|
||||||
|
required: false
|
||||||
|
direction: "input"
|
||||||
|
multiple: false
|
||||||
|
multiple_sep: ";"
|
||||||
|
- type: "string"
|
||||||
|
name: "--output_compression"
|
||||||
|
description: "Compression format to use for the output AnnData and/or Mudata objects.\n\
|
||||||
|
By default no compression is applied.\n"
|
||||||
|
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: "nextflow_labels.config"
|
||||||
|
dest: "nextflow_labels.config"
|
||||||
|
description: "Converts the output from Xenium to a single .h5mu file, where the count\
|
||||||
|
\ matrix is written to the `rna` modality.\nThe following files are expected to\
|
||||||
|
\ be present in the Xenium output bundle:\n├── cell_feature_matrix.h5\n├── cells.parquet\n\
|
||||||
|
├── experiment.xenium\n└── metrics_summary.csv\n"
|
||||||
|
test_resources:
|
||||||
|
- type: "python_script"
|
||||||
|
path: "test.py"
|
||||||
|
is_executable: true
|
||||||
|
- type: "file"
|
||||||
|
path: "xenium_tiny"
|
||||||
|
info: null
|
||||||
|
status: "enabled"
|
||||||
|
scope:
|
||||||
|
image: "public"
|
||||||
|
target: "public"
|
||||||
|
repositories:
|
||||||
|
- type: "github"
|
||||||
|
name: "openpipeline"
|
||||||
|
repo: "openpipelines-bio/openpipeline"
|
||||||
|
tag: "2.1.2"
|
||||||
|
- type: "vsh"
|
||||||
|
name: "openpipeline_incubator"
|
||||||
|
repo: "openpipeline_incubator"
|
||||||
|
tag: "build/main"
|
||||||
|
links:
|
||||||
|
repository: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
|
docker_registry: "ghcr.io"
|
||||||
|
runners:
|
||||||
|
- type: "executable"
|
||||||
|
id: "executable"
|
||||||
|
docker_setup_strategy: "ifneedbepullelsecachedbuild"
|
||||||
|
- type: "nextflow"
|
||||||
|
id: "nextflow"
|
||||||
|
directives:
|
||||||
|
label:
|
||||||
|
- "lowmem"
|
||||||
|
- "singlecpu"
|
||||||
|
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.12-slim"
|
||||||
|
target_registry: "images.viash-hub.com"
|
||||||
|
target_tag: "build_main"
|
||||||
|
namespace_separator: "/"
|
||||||
|
setup:
|
||||||
|
- type: "apt"
|
||||||
|
packages:
|
||||||
|
- "procps"
|
||||||
|
interactive: false
|
||||||
|
- type: "python"
|
||||||
|
user: false
|
||||||
|
packages:
|
||||||
|
- "anndata~=0.11.1"
|
||||||
|
- "mudata~=0.3.1"
|
||||||
|
- "scanpy~=1.10.4"
|
||||||
|
- "pyarrow"
|
||||||
|
script:
|
||||||
|
- "exec(\"try:\\n import awkward\\nexcept ModuleNotFoundError:\\n exit(0)\\\
|
||||||
|
nelse: exit(1)\")"
|
||||||
|
upgrade: true
|
||||||
|
test_setup:
|
||||||
|
- type: "python"
|
||||||
|
user: false
|
||||||
|
packages:
|
||||||
|
- "viashpy==0.9.0"
|
||||||
|
upgrade: true
|
||||||
|
entrypoint: []
|
||||||
|
cmd: null
|
||||||
|
- type: "native"
|
||||||
|
id: "native"
|
||||||
|
build_info:
|
||||||
|
config: "src/convert/from_xenium_to_h5mu/config.vsh.yaml"
|
||||||
|
runner: "nextflow"
|
||||||
|
engine: "docker|native"
|
||||||
|
output: "target/nextflow/convert/from_xenium_to_h5mu"
|
||||||
|
executable: "target/nextflow/convert/from_xenium_to_h5mu/main.nf"
|
||||||
|
viash_version: "0.9.4"
|
||||||
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
|
package_config:
|
||||||
|
name: "openpipeline_spatial"
|
||||||
|
version: "build_main"
|
||||||
|
info:
|
||||||
|
test_resources:
|
||||||
|
- type: "s3"
|
||||||
|
path: "s3://openpipelines-bio/openpipeline_spatial/resources_test"
|
||||||
|
dest: "resources_test"
|
||||||
|
repositories:
|
||||||
|
- type: "github"
|
||||||
|
name: "openpipeline"
|
||||||
|
repo: "openpipelines-bio/openpipeline"
|
||||||
|
tag: "2.1.2"
|
||||||
|
- type: "vsh"
|
||||||
|
name: "openpipeline_incubator"
|
||||||
|
repo: "openpipeline_incubator"
|
||||||
|
tag: "build/main"
|
||||||
|
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\"\
|
||||||
|
)'"
|
||||||
|
- ".engines += { type: \"native\" }"
|
||||||
|
- ".engines[.type == 'docker'].target_registry := 'images.viash-hub.com'"
|
||||||
|
- ".engines[.type == 'docker'].target_tag := 'build_main'"
|
||||||
|
organization: "vsh"
|
||||||
|
links:
|
||||||
|
repository: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
|
docker_registry: "ghcr.io"
|
||||||
4000
target/nextflow/convert/from_xenium_to_h5mu/main.nf
Normal file
4000
target/nextflow/convert/from_xenium_to_h5mu/main.nf
Normal file
File diff suppressed because it is too large
Load Diff
126
target/nextflow/convert/from_xenium_to_h5mu/nextflow.config
Normal file
126
target/nextflow/convert/from_xenium_to_h5mu/nextflow.config
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
manifest {
|
||||||
|
name = 'convert/from_xenium_to_h5mu'
|
||||||
|
mainScript = 'main.nf'
|
||||||
|
nextflowVersion = '!>=20.12.1-edge'
|
||||||
|
version = 'build_main'
|
||||||
|
description = 'Converts the output from Xenium to a single .h5mu file, where the count matrix is written to the `rna` modality.\nThe following files are expected to be present in the Xenium output bundle:\n├── cell_feature_matrix.h5\n├── cells.parquet\n├── experiment.xenium\n└── metrics_summary.csv\n'
|
||||||
|
author = 'Dorien Roosen'
|
||||||
|
}
|
||||||
|
|
||||||
|
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")
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
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( 50.GB * task.attempt ) } }
|
||||||
|
withLabel: midmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
||||||
|
withLabel: highmem { memory = { get_memory( 50.GB * task.attempt ) } }
|
||||||
|
withLabel: veryhighmem { memory = { get_memory( 75.GB * task.attempt ) } }
|
||||||
|
|
||||||
|
// Disk space
|
||||||
|
// Nextflow apparently can't handle empty directives, i.e.
|
||||||
|
// withLabel: lowdisk {}
|
||||||
|
// so for that reason we have to add a dummy directive
|
||||||
|
withLabel: lowdisk {
|
||||||
|
dummyDirective = "dummyValue"
|
||||||
|
}
|
||||||
|
withLabel: middisk {
|
||||||
|
dummyDirective = "dummyValue"
|
||||||
|
}
|
||||||
|
withLabel: highdisk {
|
||||||
|
dummyDirective = "dummyValue"
|
||||||
|
}
|
||||||
|
withLabel: veryhighdisk {
|
||||||
|
dummyDirective = "dummyValue"
|
||||||
|
}
|
||||||
|
// 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"title": "from_xenium_to_h5mu",
|
||||||
|
"description": "Converts the output from Xenium to a single .h5mu file, where the count matrix is written to the `rna` modality.\nThe following files are expected to be present in the Xenium output bundle:\n├── cell_feature_matrix.h5\n├── cells.parquet\n├── experiment.xenium\n└── metrics_summary.csv\n",
|
||||||
|
"type": "object",
|
||||||
|
"$defs": {
|
||||||
|
"arguments": {
|
||||||
|
"title": "Arguments",
|
||||||
|
"type": "object",
|
||||||
|
"description": "No description",
|
||||||
|
"properties": {
|
||||||
|
"input": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "path",
|
||||||
|
"exists": true,
|
||||||
|
"description": "Input folder",
|
||||||
|
"help_text": "Type: `file`, multiple: `False`, required, direction: `input`, example: `\"xenium_output_bundle\"`. "
|
||||||
|
},
|
||||||
|
"output": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "path",
|
||||||
|
"description": "Output .h5mu file.",
|
||||||
|
"help_text": "Type: `file`, multiple: `False`, default: `\"$id.$key.output.h5mu\"`, direction: `output`, example: `\"xenium.h5mu\"`. ",
|
||||||
|
"default": "$id.$key.output.h5mu"
|
||||||
|
},
|
||||||
|
"obsm_coordinates": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Name of the .obsm slot under which to store the cell centroid coordinates.",
|
||||||
|
"help_text": "Type: `string`, multiple: `False`, default: `\"spatial\"`. ",
|
||||||
|
"default": "spatial"
|
||||||
|
},
|
||||||
|
"uns_experiment": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Name of the .uns slot under which to store the Xenium experiment specifications.",
|
||||||
|
"help_text": "Type: `string`, multiple: `False`, default: `\"xenium_experiment\"`. ",
|
||||||
|
"default": "xenium_experiment"
|
||||||
|
},
|
||||||
|
"uns_metrics": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Name of the .uns slot under which to store the summary QC metrics.",
|
||||||
|
"help_text": "Type: `string`, multiple: `False`, default: `\"xenium_metrics\"`. ",
|
||||||
|
"default": "xenium_metrics"
|
||||||
|
},
|
||||||
|
"output_compression": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Compression format to use for the output AnnData and/or Mudata objects.\nBy default no compression is applied.\n",
|
||||||
|
"help_text": "Type: `string`, multiple: `False`, example: `\"gzip\"`, choices: ``gzip`, `lzf``. ",
|
||||||
|
"enum": [
|
||||||
|
"gzip",
|
||||||
|
"lzf"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"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": "Path to an output directory.",
|
||||||
|
"help_text": "Type: `string`, multiple: `False`, required, example: `\"output/\"`. "
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/$defs/arguments"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$ref": "#/$defs/nextflow input-output arguments"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
12
target/nextflow/convert/from_xenium_to_h5mu/setup_logger.py
Normal file
12
target/nextflow/convert/from_xenium_to_h5mu/setup_logger.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
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
|
||||||
@@ -318,7 +318,7 @@ build_info:
|
|||||||
output: "target/nextflow/convert/from_xenium_to_spatialdata"
|
output: "target/nextflow/convert/from_xenium_to_spatialdata"
|
||||||
executable: "target/nextflow/convert/from_xenium_to_spatialdata/main.nf"
|
executable: "target/nextflow/convert/from_xenium_to_spatialdata/main.nf"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline_spatial"
|
name: "openpipeline_spatial"
|
||||||
|
|||||||
@@ -3431,7 +3431,7 @@ meta = [
|
|||||||
"engine" : "docker|native",
|
"engine" : "docker|native",
|
||||||
"output" : "/workdir/root/repo/target/nextflow/convert/from_xenium_to_spatialdata",
|
"output" : "/workdir/root/repo/target/nextflow/convert/from_xenium_to_spatialdata",
|
||||||
"viash_version" : "0.9.4",
|
"viash_version" : "0.9.4",
|
||||||
"git_commit" : "226d7de695d56f116dd1ba8e08a51ebf63b153b3",
|
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
},
|
},
|
||||||
"package_config" : {
|
"package_config" : {
|
||||||
|
|||||||
@@ -226,7 +226,7 @@ build_info:
|
|||||||
output: "target/nextflow/convert/from_xenium_to_spatialexperiment"
|
output: "target/nextflow/convert/from_xenium_to_spatialexperiment"
|
||||||
executable: "target/nextflow/convert/from_xenium_to_spatialexperiment/main.nf"
|
executable: "target/nextflow/convert/from_xenium_to_spatialexperiment/main.nf"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline_spatial"
|
name: "openpipeline_spatial"
|
||||||
|
|||||||
@@ -3317,7 +3317,7 @@ meta = [
|
|||||||
"engine" : "docker|native",
|
"engine" : "docker|native",
|
||||||
"output" : "/workdir/root/repo/target/nextflow/convert/from_xenium_to_spatialexperiment",
|
"output" : "/workdir/root/repo/target/nextflow/convert/from_xenium_to_spatialexperiment",
|
||||||
"viash_version" : "0.9.4",
|
"viash_version" : "0.9.4",
|
||||||
"git_commit" : "226d7de695d56f116dd1ba8e08a51ebf63b153b3",
|
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
},
|
},
|
||||||
"package_config" : {
|
"package_config" : {
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ build_info:
|
|||||||
output: "target/nextflow/filter/subset_cosmx"
|
output: "target/nextflow/filter/subset_cosmx"
|
||||||
executable: "target/nextflow/filter/subset_cosmx/main.nf"
|
executable: "target/nextflow/filter/subset_cosmx/main.nf"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline_spatial"
|
name: "openpipeline_spatial"
|
||||||
|
|||||||
@@ -3339,7 +3339,7 @@ meta = [
|
|||||||
"engine" : "docker|native",
|
"engine" : "docker|native",
|
||||||
"output" : "/workdir/root/repo/target/nextflow/filter/subset_cosmx",
|
"output" : "/workdir/root/repo/target/nextflow/filter/subset_cosmx",
|
||||||
"viash_version" : "0.9.4",
|
"viash_version" : "0.9.4",
|
||||||
"git_commit" : "226d7de695d56f116dd1ba8e08a51ebf63b153b3",
|
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
},
|
},
|
||||||
"package_config" : {
|
"package_config" : {
|
||||||
|
|||||||
@@ -430,7 +430,7 @@ build_info:
|
|||||||
output: "target/nextflow/mapping/spaceranger_count"
|
output: "target/nextflow/mapping/spaceranger_count"
|
||||||
executable: "target/nextflow/mapping/spaceranger_count/main.nf"
|
executable: "target/nextflow/mapping/spaceranger_count/main.nf"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
package_config:
|
package_config:
|
||||||
name: "openpipeline_spatial"
|
name: "openpipeline_spatial"
|
||||||
|
|||||||
@@ -3554,7 +3554,7 @@ meta = [
|
|||||||
"engine" : "docker|native",
|
"engine" : "docker|native",
|
||||||
"output" : "/workdir/root/repo/target/nextflow/mapping/spaceranger_count",
|
"output" : "/workdir/root/repo/target/nextflow/mapping/spaceranger_count",
|
||||||
"viash_version" : "0.9.4",
|
"viash_version" : "0.9.4",
|
||||||
"git_commit" : "226d7de695d56f116dd1ba8e08a51ebf63b153b3",
|
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
},
|
},
|
||||||
"package_config" : {
|
"package_config" : {
|
||||||
|
|||||||
@@ -648,7 +648,7 @@ build_info:
|
|||||||
output: "target/nextflow/workflows/multiomics/spatial_process_samples"
|
output: "target/nextflow/workflows/multiomics/spatial_process_samples"
|
||||||
executable: "target/nextflow/workflows/multiomics/spatial_process_samples/main.nf"
|
executable: "target/nextflow/workflows/multiomics/spatial_process_samples/main.nf"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
dependencies:
|
dependencies:
|
||||||
- "target/dependencies/github/openpipelines-bio/openpipeline/disable-scrublet_build/nextflow/workflows/multiomics/process_samples"
|
- "target/dependencies/github/openpipelines-bio/openpipeline/disable-scrublet_build/nextflow/workflows/multiomics/process_samples"
|
||||||
|
|||||||
@@ -3819,7 +3819,7 @@ meta = [
|
|||||||
"engine" : "native",
|
"engine" : "native",
|
||||||
"output" : "/workdir/root/repo/target/nextflow/workflows/multiomics/spatial_process_samples",
|
"output" : "/workdir/root/repo/target/nextflow/workflows/multiomics/spatial_process_samples",
|
||||||
"viash_version" : "0.9.4",
|
"viash_version" : "0.9.4",
|
||||||
"git_commit" : "226d7de695d56f116dd1ba8e08a51ebf63b153b3",
|
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
},
|
},
|
||||||
"package_config" : {
|
"package_config" : {
|
||||||
|
|||||||
@@ -391,7 +391,7 @@ build_info:
|
|||||||
output: "target/nextflow/workflows/qc/spatial_qc"
|
output: "target/nextflow/workflows/qc/spatial_qc"
|
||||||
executable: "target/nextflow/workflows/qc/spatial_qc/main.nf"
|
executable: "target/nextflow/workflows/qc/spatial_qc/main.nf"
|
||||||
viash_version: "0.9.4"
|
viash_version: "0.9.4"
|
||||||
git_commit: "226d7de695d56f116dd1ba8e08a51ebf63b153b3"
|
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
dependencies:
|
dependencies:
|
||||||
- "target/dependencies/github/openpipelines-bio/openpipeline/2.1.2/nextflow/workflows/qc/qc"
|
- "target/dependencies/github/openpipelines-bio/openpipeline/2.1.2/nextflow/workflows/qc/qc"
|
||||||
|
|||||||
@@ -3511,7 +3511,7 @@ meta = [
|
|||||||
"engine" : "native",
|
"engine" : "native",
|
||||||
"output" : "/workdir/root/repo/target/nextflow/workflows/qc/spatial_qc",
|
"output" : "/workdir/root/repo/target/nextflow/workflows/qc/spatial_qc",
|
||||||
"viash_version" : "0.9.4",
|
"viash_version" : "0.9.4",
|
||||||
"git_commit" : "226d7de695d56f116dd1ba8e08a51ebf63b153b3",
|
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||||
},
|
},
|
||||||
"package_config" : {
|
"package_config" : {
|
||||||
|
|||||||
Reference in New Issue
Block a user