Build branch build/main with version build_main (fab3d7d)
Build pipeline: openpipelines-bio.openpipeline-spatial.build-main-kc6j9
Source commit: fab3d7dbd8
Source message: deploy: 595b7db03ab2dd1bd0de16f217e3e634ef016c59
This commit is contained in:
@@ -12,6 +12,8 @@
|
||||
|
||||
* `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_cells2stats_to_h5mu`: Added a component to convert data resulting from Aviti Teton sequencers processed by Cells2Stats into an H5MU file (PR #15).
|
||||
|
||||
* `workflows/qc/qc`: Added a pipeline for calculating qc metrics of spatial omics samples (PR #5).
|
||||
|
||||
* `workflows/multiomics/spatial_process_samples`: Added a pipeline to pre-process multiple spatial omics samples (PR #7).
|
||||
|
||||
116
resources_test_scripts/aviti_teton_tiny.sh
Normal file
116
resources_test_scripts/aviti_teton_tiny.sh
Normal file
@@ -0,0 +1,116 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
# get the root of the directory
|
||||
REPO_ROOT=$(git rev-parse --show-toplevel)
|
||||
|
||||
# ensure that the command below is run from the root of the repository
|
||||
cd "$REPO_ROOT"
|
||||
|
||||
ID=aviti
|
||||
DIR=resources_test/$ID/
|
||||
OUT=$DIR/teton_cells2stats_tiny/
|
||||
|
||||
# Create directories
|
||||
[ -d "$DIR" ] || mkdir -p "$DIR"
|
||||
[ -d "$OUT" ] || mkdir -p "$OUT"
|
||||
|
||||
echo "> Downloading Aviti Teton data"
|
||||
wget "https://go.elementbiosciences.com/l/938263/28kddnj7/d59cp" -O "${DIR}/PLUT-0105.tar.gz"
|
||||
tar -xzf "${DIR}/PLUT-0105.tar.gz" -C "$DIR"
|
||||
rm "${DIR}/PLUT-0105.tar.gz"
|
||||
|
||||
echo "> Processing and subsetting Aviti Teton data"
|
||||
python <<HEREDOC
|
||||
import os
|
||||
import shutil
|
||||
import pandas as pd
|
||||
import glob
|
||||
import json
|
||||
|
||||
src_dir = "${DIR}/PLUT-0105"
|
||||
dest_dir = "${OUT}"
|
||||
subset_image_dirs = False
|
||||
wells_to_keep = ["A1"]
|
||||
max_cells_per_well = 1000
|
||||
|
||||
os.makedirs(dest_dir, exist_ok=True)
|
||||
|
||||
print(f"Processing data from {src_dir} to {dest_dir}")
|
||||
|
||||
# Copy images
|
||||
if subset_image_dirs:
|
||||
image_dirs = ["CellSegmentation", "Projection"]
|
||||
for image_dir in image_dirs:
|
||||
image_dir_path = os.path.join(src_dir, image_dir)
|
||||
if not os.path.exists(image_dir_path):
|
||||
print(f"Warning: Image directory not found: {image_dir_path}")
|
||||
continue
|
||||
if not os.path.isdir(image_dir_path):
|
||||
print(f"Warning: Path exists but is not a directory: {image_dir_path}")
|
||||
continue
|
||||
print(f"Processing image directory: {image_dir}")
|
||||
|
||||
for well in wells_to_keep:
|
||||
dest_path = f"{dest_dir}/{image_dir}/Well{well}"
|
||||
os.makedirs(dest_path, exist_ok=True)
|
||||
src_path = glob.glob(os.path.join(src_dir, image_dir, f"Well{well}"))
|
||||
if len(src_path) != 1:
|
||||
print(f"Warning: Expected 1 path for Well{well}, found {len(src_path)}")
|
||||
continue
|
||||
shutil.copytree(src_path[0], os.path.join(dest_path), dirs_exist_ok=True)
|
||||
|
||||
# Copy count matrix
|
||||
src_path = os.path.join(src_dir, "Cytoprofiling", "Instrument", "RawCellStats.parquet")
|
||||
if os.path.exists(src_path):
|
||||
print(f"Processing count matrix: {src_path}")
|
||||
df = pd.read_parquet(src_path)
|
||||
print(f"Original data: {len(df)} rows")
|
||||
|
||||
# Filter by wells
|
||||
df = df[df["Well"].isin(wells_to_keep)]
|
||||
print(f"After well filtering: {len(df)} rows")
|
||||
|
||||
if max_cells_per_well:
|
||||
# Limit the number of cells per well
|
||||
df = df.head(max_cells_per_well)
|
||||
print(f"After cell limit: {len(df)} rows")
|
||||
|
||||
dest_path = os.path.join(dest_dir, "Cytoprofiling", "Instrument")
|
||||
os.makedirs(dest_path, exist_ok=True)
|
||||
dest_file = os.path.join(dest_path, "RawCellStats.parquet")
|
||||
df.to_parquet(dest_file, engine="pyarrow")
|
||||
print(f"Saved processed count matrix to {dest_file}")
|
||||
else:
|
||||
print(f"Warning: Count matrix not found at {src_path}")
|
||||
|
||||
# Copy Panel Metadata
|
||||
panel_src_path = os.path.join(src_dir, "Panel.json")
|
||||
if os.path.exists(panel_src_path):
|
||||
panel_dest_path = os.path.join(dest_dir, "Panel.json")
|
||||
shutil.copy2(panel_src_path, panel_dest_path)
|
||||
print(f"Copied Panel.json")
|
||||
else:
|
||||
print(f"Warning: Panel.json not found at {panel_src_path}")
|
||||
print("Processing complete!")
|
||||
HEREDOC
|
||||
|
||||
echo "> Removing original aviti_teton folder"
|
||||
rm -rf "$DIR/PLUT-0105"
|
||||
|
||||
echo "> Aviti Teton tiny dataset created successfully at $OUT"
|
||||
|
||||
viash run src/convert/from_cells2stats_to_h5mu/config.vsh.yaml -- \
|
||||
--input "${OUT}" \
|
||||
--output "$DIR/aviti_teton_tiny.h5mu" \
|
||||
--output_compression "gzip"
|
||||
|
||||
echo "> Conversion to H5MU complete"
|
||||
|
||||
aws s3 sync \
|
||||
--profile di \
|
||||
"$DIR" \
|
||||
s3://openpipelines-bio/openpipeline_spatial/resources_test/aviti \
|
||||
--delete \
|
||||
--dryrun
|
||||
128
src/convert/from_cells2stats_to_h5mu/config.vsh.yaml
Normal file
128
src/convert/from_cells2stats_to_h5mu/config.vsh.yaml
Normal file
@@ -0,0 +1,128 @@
|
||||
name: from_cells2stats_to_h5mu
|
||||
namespace: convert
|
||||
scope: public
|
||||
description: |
|
||||
Convert spatial data resulting from Aviti Teton sequencers that have been processed by the Element Biosciences cells2stats workflow to H5MU format.
|
||||
|
||||
This component processes cells2stats count matrices to create a standardized H5MU file for downstream analysis.
|
||||
|
||||
The component reads:
|
||||
- Parquet file containing the count matrix and metadata
|
||||
- Panel.json with target and batch information
|
||||
|
||||
And outputs an H5MU file with:
|
||||
- Count data as the main .X matrix
|
||||
- Spatial coordinates in obsm
|
||||
- Cell Paint intensities in obsm (optional)
|
||||
- Nuclear count data as a layer (optional)
|
||||
- CellProfiler morphology metrics in obsm (optional)
|
||||
- Unassigned targets in obsm (optional)
|
||||
|
||||
authors:
|
||||
- __merge__: /src/authors/dorien_roosen.yaml
|
||||
roles: [ maintainer ]
|
||||
|
||||
argument_groups:
|
||||
- name: Inputs
|
||||
arguments:
|
||||
- name: --input
|
||||
type: file
|
||||
direction: input
|
||||
required: true
|
||||
description: |
|
||||
Path to the cells2stats output bundle.
|
||||
Expected folder structure (showing required files only):
|
||||
├── Cytoprofiling/
|
||||
│ └── Instrument/
|
||||
│ └── RawCellStats.parquet
|
||||
└── Panel.json
|
||||
example: path/to/aviti_output/
|
||||
|
||||
- name: Outputs
|
||||
arguments:
|
||||
- name: --output
|
||||
type: file
|
||||
direction: output
|
||||
required: true
|
||||
description: Output H5MU file path.
|
||||
example: output.h5mu
|
||||
__merge__: [., /src/base/h5_compression_argument.yaml]
|
||||
|
||||
- name: Options
|
||||
arguments:
|
||||
- name: --modality
|
||||
type: string
|
||||
default: rna
|
||||
description: The modality to which the processed data will be written to in the H5MU file.
|
||||
- name: --obsm_coordinates
|
||||
type: string
|
||||
description: |
|
||||
Key name to store the spatial coordinates (in pixels) in obsm.
|
||||
If present, spatial coordinates in micrometers will be stored under {obsm_coordinates}_um.
|
||||
The column names will be stored in uns.
|
||||
default: spatial
|
||||
- name: --layer_nuclear_counts
|
||||
type: string
|
||||
description: |
|
||||
Name for nuclear counts layer. If specified, nuclear count data
|
||||
will be stored as a separate layer in the AnnData object.
|
||||
example: nuclear_counts
|
||||
- name: --obsm_cell_paint
|
||||
type: string
|
||||
description: |
|
||||
Key name for storing Cell Paint target intensities in obsm.
|
||||
If provided, Cell Paint target intensity data will be stored as a separate matrix in the obsm field.
|
||||
The column names will be stored in uns.
|
||||
example: cell_paint
|
||||
- name: --obsm_cell_paint_nuclear
|
||||
type: string
|
||||
description: |
|
||||
Key name for storing Nuclear Cell Paint target intensities in obsm.
|
||||
If provided, Nuclear Cell Paint target intensity data will be stored as a separate matrix in the obsm field.
|
||||
The column names will be stored in uns.
|
||||
example: cell_paint_nuclear
|
||||
- name: --obsm_cell_profiler
|
||||
type: string
|
||||
description: |
|
||||
Key name for storing CellProfiler morphology metrics in obsm.
|
||||
If provided, CellProfiler morphology metrics will be stored as a separate matrix in the obsm field.
|
||||
The column names will be stored in uns.
|
||||
example: cell_profiler
|
||||
- name: --obsm_unassigned_targets
|
||||
type: string
|
||||
description: |
|
||||
Key name for storing any unassigned target data in obsm.
|
||||
If provided, unassigned target data will be stored as a separate matrix in the obsm field.
|
||||
The column names will be stored in uns.
|
||||
example: cell_profiler
|
||||
|
||||
resources:
|
||||
- type: python_script
|
||||
path: script.py
|
||||
- path: /src/utils/setup_logger.py
|
||||
|
||||
test_resources:
|
||||
- type: python_script
|
||||
path: test.py
|
||||
- path: /resources_test/aviti/
|
||||
|
||||
engines:
|
||||
- type: docker
|
||||
image: python:3.13-slim
|
||||
setup:
|
||||
- type: apt
|
||||
packages:
|
||||
- procps
|
||||
- type: python
|
||||
__merge__: [/src/base/requirements/anndata_mudata.yaml, .]
|
||||
packages:
|
||||
- pyarrow
|
||||
test_setup:
|
||||
- type: python
|
||||
__merge__: [ /src/base/requirements/viashpy.yaml, .]
|
||||
|
||||
runners:
|
||||
- type: executable
|
||||
- type: nextflow
|
||||
directives:
|
||||
label: [lowmem, lowcpu]
|
||||
285
src/convert/from_cells2stats_to_h5mu/script.py
Normal file
285
src/convert/from_cells2stats_to_h5mu/script.py
Normal file
@@ -0,0 +1,285 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
import scipy.sparse as sp
|
||||
import pandas as pd
|
||||
import mudata as mu
|
||||
import anndata as ad
|
||||
import re
|
||||
import json
|
||||
|
||||
## VIASH START
|
||||
par = {
|
||||
"input": "./resources_test/aviti/aviti_teton_tiny_2",
|
||||
"modality": "rna",
|
||||
"output": "aviti_tiny_test.h5mu",
|
||||
"output_compression": "gzip",
|
||||
"layer_nuclear_counts": "nuclear_counts",
|
||||
"obsm_coordinates": "spatial",
|
||||
"obsm_cell_paint": "cell_paint",
|
||||
"obsm_cell_paint_nuclear": "cell_paint_nuclear",
|
||||
"obsm_cell_profiler": "cell_profiler",
|
||||
"obsm_unassigned_targets": "unassigned_targets",
|
||||
}
|
||||
meta = {"resources_dir": "src/utils"}
|
||||
## VIASH END
|
||||
|
||||
sys.path.append(meta["resources_dir"])
|
||||
from setup_logger import setup_logger
|
||||
|
||||
logger = setup_logger()
|
||||
|
||||
|
||||
def assert_matching_order(var_names, count_columns, split_pattern=None):
|
||||
for var, col in zip(var_names, count_columns):
|
||||
count_var = col if not split_pattern else col.split("_Nuclear")[0]
|
||||
assert var == count_var, "Orders do not match"
|
||||
|
||||
|
||||
def categorize_columns(column_list, target_panel):
|
||||
# Extract imaging and barcoding information from Panel.json
|
||||
imaging_batches = [tube["BatchName"] for tube in target_panel["ImagingPrimerTubes"]]
|
||||
barcoding_batches = [
|
||||
tube["BatchName"] for tube in target_panel["BarcodingPrimerTubes"]
|
||||
]
|
||||
|
||||
# Extract target information
|
||||
cellpaint_targets = [target["Target"] for target in target_panel["ImagingTargets"]]
|
||||
barcoding_targets = [
|
||||
target["Target"] for target in target_panel["BarcodingTargets"]
|
||||
]
|
||||
|
||||
# METADATA (for .obs and .obsm)
|
||||
# Fixed columns
|
||||
columns_fixed = [
|
||||
"Area",
|
||||
"AreaUm",
|
||||
"Cell",
|
||||
"NuclearArea",
|
||||
"NuclearAreaUm",
|
||||
"Tile",
|
||||
"Well",
|
||||
"WellLabel",
|
||||
]
|
||||
obs_columns_fixed = list(set(columns_fixed) & set(column_list))
|
||||
|
||||
# Coordinate columns
|
||||
coordinate_columns = ["X", "Y", "Xum", "Yum"]
|
||||
obsm_coordinate_columns = list(set(coordinate_columns) & set(column_list))
|
||||
|
||||
# Cell Paint target intensity columns (format: {cell_paint_target.batch})
|
||||
cell_paint_columns = [
|
||||
col
|
||||
for col in column_list
|
||||
if any(
|
||||
col.startswith(f"{target}.") and col.endswith(f".{batch}")
|
||||
for target in cellpaint_targets
|
||||
for batch in imaging_batches
|
||||
)
|
||||
]
|
||||
|
||||
# Cell Paint nuclear target intensity columns (format: {cell_paint_target_Nuclear.batch})
|
||||
cell_paint_nuclear_columns = [
|
||||
col
|
||||
for col in column_list
|
||||
if any(
|
||||
col.startswith(f"{target}_Nuclear") and col.endswith(f".{batch}")
|
||||
for target in cellpaint_targets
|
||||
for batch in imaging_batches
|
||||
)
|
||||
]
|
||||
|
||||
# CellProfiler morphology metrics
|
||||
morphology_patterns = [
|
||||
r"^AreaShape_",
|
||||
r"^Granularity_",
|
||||
r"^Texture_",
|
||||
r"^Intensity_",
|
||||
r"^Location_",
|
||||
r"^RadialDistribution_",
|
||||
]
|
||||
cell_profiler_columns = [
|
||||
col
|
||||
for col in column_list
|
||||
for pattern in morphology_patterns
|
||||
if re.match(pattern, col)
|
||||
]
|
||||
|
||||
# COUNT MATRICES (for .X and layers)
|
||||
# Feature Count Matrix - barcoding targets (format: {target.batch})
|
||||
# Includes cellular and nuclear counts
|
||||
count_columns = [
|
||||
col
|
||||
for col in column_list
|
||||
if any(
|
||||
col.startswith(f"{target}.") and col.endswith(f".{batch}")
|
||||
for target in barcoding_targets
|
||||
for batch in barcoding_batches
|
||||
)
|
||||
]
|
||||
|
||||
# Nuclear Feature Count Matrix - barcoding targets (format: {target_Nuclear.batch})
|
||||
# Includes only nuclear counts
|
||||
nuclear_count_columns = [
|
||||
col
|
||||
for col in column_list
|
||||
if any(
|
||||
col.startswith(f"{target}_Nuclear") and col.endswith(f".{batch}")
|
||||
for target in barcoding_targets
|
||||
for batch in barcoding_batches
|
||||
)
|
||||
]
|
||||
|
||||
# Unassigned columns (format: {Unassigned_*.*})
|
||||
unassigned_columns = [col for col in column_list if col.startswith("Unassigned")]
|
||||
|
||||
# Make sure all columns have been categorized and have expected sizes
|
||||
assert len(count_columns) == len(nuclear_count_columns), (
|
||||
"Cellular and nuclear count columns do not match."
|
||||
)
|
||||
all_categorized_columns = (
|
||||
obs_columns_fixed
|
||||
+ obsm_coordinate_columns
|
||||
+ cell_paint_columns
|
||||
+ cell_paint_nuclear_columns
|
||||
+ cell_profiler_columns
|
||||
+ count_columns
|
||||
+ nuclear_count_columns
|
||||
+ unassigned_columns
|
||||
)
|
||||
assert len(column_list) == len(all_categorized_columns), (
|
||||
"Column categorization incomplete."
|
||||
)
|
||||
|
||||
return (
|
||||
obs_columns_fixed,
|
||||
obsm_coordinate_columns,
|
||||
cell_paint_columns,
|
||||
cell_paint_nuclear_columns,
|
||||
cell_profiler_columns,
|
||||
count_columns,
|
||||
nuclear_count_columns,
|
||||
unassigned_columns,
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
# Read data from Aviti Teton output bundle
|
||||
# Expected folder structure (showing only relevant files):
|
||||
# ├── Cytoprofiling/
|
||||
# │ └── Instrument/
|
||||
# │ └── RawCellStats.parquet
|
||||
# └── Panel.json
|
||||
|
||||
logger.info("Reading input data...")
|
||||
input_dir = Path(par["input"])
|
||||
input_data = {
|
||||
"count_matrix": input_dir
|
||||
/ "Cytoprofiling"
|
||||
/ "Instrument"
|
||||
/ "RawCellStats.parquet",
|
||||
"target_panel": input_dir / "Panel.json",
|
||||
}
|
||||
|
||||
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()}."
|
||||
)
|
||||
with open(input_data["target_panel"], "r") as f:
|
||||
target_panel = json.load(f)
|
||||
df = pd.read_parquet(input_data["count_matrix"], engine="pyarrow")
|
||||
df_columns = df.columns.tolist()
|
||||
|
||||
logger.info("Categorizing input data...")
|
||||
(
|
||||
obs_columns_fixed,
|
||||
coordinate_columns,
|
||||
cell_paint_columns,
|
||||
cell_paint_nuclear_columns,
|
||||
cell_profiler_columns,
|
||||
count_columns,
|
||||
nuclear_count_columns,
|
||||
unassigned_columns,
|
||||
) = categorize_columns(df_columns, target_panel)
|
||||
|
||||
df = df.set_index(df["Cell"].astype(str), drop=False)
|
||||
df.index_name = None
|
||||
|
||||
# var and obs names
|
||||
var_names = [var.split(".")[0] for var in count_columns]
|
||||
obs_names = df["Cell"].astype(str).tolist()
|
||||
|
||||
# Count matrix
|
||||
logger.info("Creating count matrix...")
|
||||
count_df = df[count_columns].copy()
|
||||
count_matrix_sparse = sp.csr_matrix(count_df.values)
|
||||
|
||||
# Obs field
|
||||
logger.info(f"Creating obs field with columns {obs_columns_fixed}")
|
||||
obs_df = df[obs_columns_fixed].copy()
|
||||
|
||||
# Create AnnData object
|
||||
logger.info("Creating AnnData object...")
|
||||
adata = ad.AnnData(
|
||||
X=count_matrix_sparse,
|
||||
obs=obs_df,
|
||||
var=pd.DataFrame(index=var_names),
|
||||
)
|
||||
|
||||
adata.obs_names = obs_names
|
||||
adata.var_names = var_names
|
||||
|
||||
# Spatial coordinates
|
||||
coordinate_sets = {
|
||||
par["obsm_coordinates"]: ["X", "Y"],
|
||||
f"{par['obsm_coordinates']}_um": ["Xum", "Yum"],
|
||||
}
|
||||
|
||||
for obsm_key, coord_cols in coordinate_sets.items():
|
||||
if all(col in coordinate_columns for col in coord_cols):
|
||||
coordinates = df[coord_cols].copy()
|
||||
adata.obsm[obsm_key] = coordinates.values
|
||||
adata.uns[obsm_key] = coord_cols
|
||||
logger.info(f"Added {obsm_key} coordinates ({coord_cols}) to obsm")
|
||||
else:
|
||||
missing_cols = [col for col in coord_cols if col not in coordinate_columns]
|
||||
logger.warning(
|
||||
f"Skipping {obsm_key}: missing coordinate columns {missing_cols}"
|
||||
)
|
||||
|
||||
# Add (optional) .obsm fields
|
||||
if par["obsm_cell_paint"]:
|
||||
logger.info(f"Adding {par['obsm_cell_paint']} to obsm")
|
||||
adata.obsm[par["obsm_cell_paint"]] = df[cell_paint_columns].copy()
|
||||
adata.uns[par["obsm_cell_paint"]] = cell_paint_columns
|
||||
if par["obsm_cell_paint_nuclear"]:
|
||||
logger.info(f"Adding {par['obsm_cell_paint_nuclear']} to obsm")
|
||||
adata.obsm[par["obsm_cell_paint_nuclear"]] = df[
|
||||
cell_paint_nuclear_columns
|
||||
].copy()
|
||||
adata.uns[par["obsm_cell_paint_nuclear"]] = cell_paint_nuclear_columns
|
||||
if par["obsm_cell_profiler"]:
|
||||
logger.info(f"Adding {par['obsm_cell_profiler']} to obsm")
|
||||
adata.obsm[par["obsm_cell_profiler"]] = df[cell_profiler_columns].copy()
|
||||
adata.uns[par["obsm_cell_profiler"]] = cell_profiler_columns
|
||||
if par["obsm_unassigned_targets"]:
|
||||
logger.info(f"Adding {par['obsm_unassigned_targets']} to obsm")
|
||||
adata.obsm["unassigned_targets"] = df[unassigned_columns].copy()
|
||||
adata.uns["unassigned_targets"] = unassigned_columns
|
||||
|
||||
# Add (optional) nuclear count layer
|
||||
if par["layer_nuclear_counts"]:
|
||||
assert_matching_order(
|
||||
var_names, nuclear_count_columns, split_pattern="_Nuclear"
|
||||
)
|
||||
logger.info(f"Adding {par['layer_nuclear_counts']} to layers")
|
||||
nuclear_count_df = df[nuclear_count_columns].copy()
|
||||
nuclear_count_matrix_sparse = sp.csr_matrix(nuclear_count_df.values)
|
||||
adata.layers[par["layer_nuclear_counts"]] = nuclear_count_matrix_sparse
|
||||
|
||||
# Write output MuData
|
||||
logger.info("Writing MuData object...")
|
||||
mdata = mu.MuData({par["modality"]: adata})
|
||||
mdata.write_h5mu(par["output"], compression=par["output_compression"])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
106
src/convert/from_cells2stats_to_h5mu/test.py
Normal file
106
src/convert/from_cells2stats_to_h5mu/test.py
Normal file
@@ -0,0 +1,106 @@
|
||||
import pytest
|
||||
import sys
|
||||
import mudata as mu
|
||||
|
||||
## VIASH START
|
||||
meta = {
|
||||
"executable": "./target/executable/convert/from_cells2stats_to_h5mu/from_cells2stats_to_h5mu",
|
||||
"resources_dir": "resources_test/aviti/",
|
||||
}
|
||||
## VIASH END
|
||||
|
||||
input = f"{meta['resources_dir']}/aviti/teton_cells2stats_tiny/"
|
||||
|
||||
|
||||
def test_simple_execution(run_component, tmp_path):
|
||||
output = tmp_path / "aviti.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 adata.X.dtype.kind == "f"
|
||||
expected_obs_keys = [
|
||||
"AreaUm",
|
||||
"Area",
|
||||
"Tile",
|
||||
"WellLabel",
|
||||
"Well",
|
||||
"Cell",
|
||||
"NuclearAreaUm",
|
||||
"NuclearArea",
|
||||
]
|
||||
assert all([obs in expected_obs_keys for obs in adata.obs.columns])
|
||||
obs_counts = ["Area", "Cell", "NuclearArea"]
|
||||
assert all([adata.obs[obs].dtype.kind == "u" for obs in obs_counts])
|
||||
obs_areas = ["AreaUm", "NuclearAreaUm"]
|
||||
assert all([adata.obs[obs].dtype.kind == "f" for obs in obs_areas])
|
||||
obs_categories = ["Tile", "WellLabel", "Well"]
|
||||
assert all([adata.obs[obs].dtype.kind == "O" for obs in obs_categories])
|
||||
|
||||
expected_obsm_keys = ["spatial", "spatial_um"]
|
||||
assert list(adata.obsm.keys()) == expected_obsm_keys
|
||||
assert list(adata.uns.keys()) == expected_obsm_keys
|
||||
assert all(adata.obsm[obsm].dtype.kind == "f" for obsm in expected_obsm_keys)
|
||||
|
||||
|
||||
def test_extended_parameters(run_component, tmp_path):
|
||||
output = tmp_path / "aviti_ext.h5mu"
|
||||
|
||||
# run component
|
||||
run_component(
|
||||
[
|
||||
"--input",
|
||||
input,
|
||||
"--modality",
|
||||
"mod1",
|
||||
"--output",
|
||||
str(output),
|
||||
"--layer_nuclear_counts",
|
||||
"nuclear_counts",
|
||||
"--obsm_coordinates",
|
||||
"coords",
|
||||
"--obsm_cell_paint",
|
||||
"cell_paint",
|
||||
"--obsm_cell_paint_nuclear",
|
||||
"cell_paint_nuclear",
|
||||
"--obsm_cell_profiler",
|
||||
"cell_profiler",
|
||||
"--obsm_unassigned_targets",
|
||||
"unassigned_targets",
|
||||
"--output_compression",
|
||||
"gzip",
|
||||
]
|
||||
)
|
||||
|
||||
assert output.is_file(), "output file was not created"
|
||||
|
||||
mdata = mu.read_h5mu(output)
|
||||
assert list(mdata.mod.keys()) == ["mod1"]
|
||||
adata = mdata.mod["mod1"]
|
||||
|
||||
assert list(adata.layers) == ["nuclear_counts"]
|
||||
assert adata.layers["nuclear_counts"].dtype.kind == "f"
|
||||
|
||||
expected_obsm_keys = [
|
||||
"cell_paint",
|
||||
"cell_paint_nuclear",
|
||||
"cell_profiler",
|
||||
"coords",
|
||||
"coords_um",
|
||||
"unassigned_targets",
|
||||
]
|
||||
|
||||
assert list(adata.uns.keys()) == expected_obsm_keys
|
||||
assert list(adata.obsm.keys()) == expected_obsm_keys
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(pytest.main([__file__]))
|
||||
@@ -0,0 +1,329 @@
|
||||
name: "from_cells2stats_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: "Inputs"
|
||||
arguments:
|
||||
- type: "file"
|
||||
name: "--input"
|
||||
description: "Path to the cells2stats output bundle. \nExpected folder structure\
|
||||
\ (showing required files only):\n├── Cytoprofiling/\n│ └── Instrument/\n│\
|
||||
\ └── RawCellStats.parquet\n└── Panel.json\n"
|
||||
info: null
|
||||
example:
|
||||
- "path/to/aviti_output"
|
||||
must_exist: true
|
||||
create_parent: true
|
||||
required: true
|
||||
direction: "input"
|
||||
multiple: false
|
||||
multiple_sep: ";"
|
||||
- name: "Outputs"
|
||||
arguments:
|
||||
- type: "file"
|
||||
name: "--output"
|
||||
description: "Output H5MU file path."
|
||||
info: null
|
||||
example:
|
||||
- "output.h5mu"
|
||||
must_exist: true
|
||||
create_parent: true
|
||||
required: true
|
||||
direction: "output"
|
||||
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: ";"
|
||||
- name: "Options"
|
||||
arguments:
|
||||
- type: "string"
|
||||
name: "--modality"
|
||||
description: "The modality to which the processed data will be written to in the\
|
||||
\ H5MU file."
|
||||
info: null
|
||||
default:
|
||||
- "rna"
|
||||
required: false
|
||||
direction: "input"
|
||||
multiple: false
|
||||
multiple_sep: ";"
|
||||
- type: "string"
|
||||
name: "--obsm_coordinates"
|
||||
description: "Key name to store the spatial coordinates (in pixels) in obsm.\n\
|
||||
If present, spatial coordinates in micrometers will be stored under {obsm_coordinates}_um.\n\
|
||||
The column names will be stored in uns.\n"
|
||||
info: null
|
||||
default:
|
||||
- "spatial"
|
||||
required: false
|
||||
direction: "input"
|
||||
multiple: false
|
||||
multiple_sep: ";"
|
||||
- type: "string"
|
||||
name: "--layer_nuclear_counts"
|
||||
description: "Name for nuclear counts layer. If specified, nuclear count data\
|
||||
\ \nwill be stored as a separate layer in the AnnData object.\n"
|
||||
info: null
|
||||
example:
|
||||
- "nuclear_counts"
|
||||
required: false
|
||||
direction: "input"
|
||||
multiple: false
|
||||
multiple_sep: ";"
|
||||
- type: "string"
|
||||
name: "--obsm_cell_paint"
|
||||
description: "Key name for storing Cell Paint target intensities in obsm. \nIf\
|
||||
\ provided, Cell Paint target intensity data will be stored as a separate matrix\
|
||||
\ in the obsm field.\nThe column names will be stored in uns.\n"
|
||||
info: null
|
||||
example:
|
||||
- "cell_paint"
|
||||
required: false
|
||||
direction: "input"
|
||||
multiple: false
|
||||
multiple_sep: ";"
|
||||
- type: "string"
|
||||
name: "--obsm_cell_paint_nuclear"
|
||||
description: "Key name for storing Nuclear Cell Paint target intensities in obsm.\n\
|
||||
If provided, Nuclear Cell Paint target intensity data will be stored as a separate\
|
||||
\ matrix in the obsm field.\nThe column names will be stored in uns.\n"
|
||||
info: null
|
||||
example:
|
||||
- "cell_paint_nuclear"
|
||||
required: false
|
||||
direction: "input"
|
||||
multiple: false
|
||||
multiple_sep: ";"
|
||||
- type: "string"
|
||||
name: "--obsm_cell_profiler"
|
||||
description: "Key name for storing CellProfiler morphology metrics in obsm.\n\
|
||||
If provided, CellProfiler morphology metrics will be stored as a separate matrix\
|
||||
\ in the obsm field.\nThe column names will be stored in uns.\n"
|
||||
info: null
|
||||
example:
|
||||
- "cell_profiler"
|
||||
required: false
|
||||
direction: "input"
|
||||
multiple: false
|
||||
multiple_sep: ";"
|
||||
- type: "string"
|
||||
name: "--obsm_unassigned_targets"
|
||||
description: "Key name for storing any unassigned target data in obsm.\nIf provided,\
|
||||
\ unassigned target data will be stored as a separate matrix in the obsm field.\n\
|
||||
The column names will be stored in uns.\n"
|
||||
info: null
|
||||
example:
|
||||
- "cell_profiler"
|
||||
required: false
|
||||
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: "Convert spatial data resulting from Aviti Teton sequencers that have\
|
||||
\ been processed by the Element Biosciences cells2stats workflow to H5MU format.\n\
|
||||
\nThis component processes cells2stats count matrices to create a standardized H5MU\
|
||||
\ file for downstream analysis.\n\nThe component reads:\n- Parquet file containing\
|
||||
\ the count matrix and metadata\n- Panel.json with target and batch information\n\
|
||||
\nAnd outputs an H5MU file with:\n- Count data as the main .X matrix\n- Spatial\
|
||||
\ coordinates in obsm\n- Cell Paint intensities in obsm (optional)\n- Nuclear count\
|
||||
\ data as a layer (optional)\n- CellProfiler morphology metrics in obsm (optional)\n\
|
||||
- Unassigned targets in obsm (optional)\n"
|
||||
test_resources:
|
||||
- type: "python_script"
|
||||
path: "test.py"
|
||||
is_executable: true
|
||||
- type: "file"
|
||||
path: "aviti"
|
||||
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"
|
||||
- "lowcpu"
|
||||
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.13-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"
|
||||
- "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_cells2stats_to_h5mu/config.vsh.yaml"
|
||||
runner: "executable"
|
||||
engine: "docker|native"
|
||||
output: "target/executable/convert/from_cells2stats_to_h5mu"
|
||||
executable: "target/executable/convert/from_cells2stats_to_h5mu/from_cells2stats_to_h5mu"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
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"
|
||||
1584
target/executable/convert/from_cells2stats_to_h5mu/from_cells2stats_to_h5mu
Executable file
1584
target/executable/convert/from_cells2stats_to_h5mu/from_cells2stats_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
|
||||
@@ -229,7 +229,7 @@ build_info:
|
||||
output: "target/executable/convert/from_cosmx_to_h5mu"
|
||||
executable: "target/executable/convert/from_cosmx_to_h5mu/from_cosmx_to_h5mu"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
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.description="Companion container for running component convert from_cosmx_to_h5mu"
|
||||
LABEL org.opencontainers.image.created="2025-08-19T11:57:43Z"
|
||||
LABEL org.opencontainers.image.created="2025-08-21T08:53:53Z"
|
||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
LABEL org.opencontainers.image.revision="fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
LABEL org.opencontainers.image.version="build_main"
|
||||
|
||||
VIASHDOCKER
|
||||
|
||||
@@ -236,7 +236,7 @@ build_info:
|
||||
output: "target/executable/convert/from_cosmx_to_spatialexperiment"
|
||||
executable: "target/executable/convert/from_cosmx_to_spatialexperiment/from_cosmx_to_spatialexperiment"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
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.description="Companion container for running component convert from_cosmx_to_spatialexperiment"
|
||||
LABEL org.opencontainers.image.created="2025-08-19T11:57:42Z"
|
||||
LABEL org.opencontainers.image.created="2025-08-21T08:53:52Z"
|
||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
LABEL org.opencontainers.image.revision="fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
LABEL org.opencontainers.image.version="build_main"
|
||||
|
||||
VIASHDOCKER
|
||||
|
||||
@@ -224,7 +224,7 @@ build_info:
|
||||
output: "target/executable/convert/from_spatialdata_to_h5mu"
|
||||
executable: "target/executable/convert/from_spatialdata_to_h5mu/from_spatialdata_to_h5mu"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
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.description="Companion container for running component convert from_spatialdata_to_h5mu"
|
||||
LABEL org.opencontainers.image.created="2025-08-19T11:57:42Z"
|
||||
LABEL org.opencontainers.image.created="2025-08-21T08:53:52Z"
|
||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
LABEL org.opencontainers.image.revision="fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
LABEL org.opencontainers.image.version="build_main"
|
||||
|
||||
VIASHDOCKER
|
||||
|
||||
@@ -237,7 +237,7 @@ build_info:
|
||||
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_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
name: "openpipeline_spatial"
|
||||
|
||||
@@ -458,9 +458,9 @@ RUN pip install --upgrade pip && \
|
||||
|
||||
LABEL org.opencontainers.image.authors="Dorien Roosen"
|
||||
LABEL org.opencontainers.image.description="Companion container for running component convert from_xenium_to_h5mu"
|
||||
LABEL org.opencontainers.image.created="2025-08-19T11:57:42Z"
|
||||
LABEL org.opencontainers.image.created="2025-08-21T08:53:52Z"
|
||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
LABEL org.opencontainers.image.revision="fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
LABEL org.opencontainers.image.version="build_main"
|
||||
|
||||
VIASHDOCKER
|
||||
|
||||
@@ -318,7 +318,7 @@ build_info:
|
||||
output: "target/executable/convert/from_xenium_to_spatialdata"
|
||||
executable: "target/executable/convert/from_xenium_to_spatialdata/from_xenium_to_spatialdata"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
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.description="Companion container for running component convert from_xenium_to_spatialdata"
|
||||
LABEL org.opencontainers.image.created="2025-08-19T11:57:43Z"
|
||||
LABEL org.opencontainers.image.created="2025-08-21T08:53:52Z"
|
||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
LABEL org.opencontainers.image.revision="fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
LABEL org.opencontainers.image.version="build_main"
|
||||
|
||||
VIASHDOCKER
|
||||
|
||||
@@ -226,7 +226,7 @@ build_info:
|
||||
output: "target/executable/convert/from_xenium_to_spatialexperiment"
|
||||
executable: "target/executable/convert/from_xenium_to_spatialexperiment/from_xenium_to_spatialexperiment"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
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.description="Companion container for running component convert from_xenium_to_spatialexperiment"
|
||||
LABEL org.opencontainers.image.created="2025-08-19T11:57:42Z"
|
||||
LABEL org.opencontainers.image.created="2025-08-21T08:53:52Z"
|
||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
LABEL org.opencontainers.image.revision="fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
LABEL org.opencontainers.image.version="build_main"
|
||||
|
||||
VIASHDOCKER
|
||||
|
||||
@@ -231,7 +231,7 @@ build_info:
|
||||
output: "target/executable/filter/subset_cosmx"
|
||||
executable: "target/executable/filter/subset_cosmx/subset_cosmx"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
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.description="Companion container for running component filter subset_cosmx"
|
||||
LABEL org.opencontainers.image.created="2025-08-19T11:57:42Z"
|
||||
LABEL org.opencontainers.image.created="2025-08-21T08:53:51Z"
|
||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
LABEL org.opencontainers.image.revision="fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
LABEL org.opencontainers.image.version="build_main"
|
||||
|
||||
VIASHDOCKER
|
||||
|
||||
@@ -430,7 +430,7 @@ build_info:
|
||||
output: "target/executable/mapping/spaceranger_count"
|
||||
executable: "target/executable/mapping/spaceranger_count/spaceranger_count"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
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.description="Companion container for running component mapping spaceranger_count"
|
||||
LABEL org.opencontainers.image.created="2025-08-19T11:57:43Z"
|
||||
LABEL org.opencontainers.image.created="2025-08-21T08:53:53Z"
|
||||
LABEL org.opencontainers.image.source="https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
LABEL org.opencontainers.image.revision="33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
LABEL org.opencontainers.image.revision="fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
LABEL org.opencontainers.image.version="build_main"
|
||||
|
||||
VIASHDOCKER
|
||||
|
||||
@@ -0,0 +1,329 @@
|
||||
name: "from_cells2stats_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: "Inputs"
|
||||
arguments:
|
||||
- type: "file"
|
||||
name: "--input"
|
||||
description: "Path to the cells2stats output bundle. \nExpected folder structure\
|
||||
\ (showing required files only):\n├── Cytoprofiling/\n│ └── Instrument/\n│\
|
||||
\ └── RawCellStats.parquet\n└── Panel.json\n"
|
||||
info: null
|
||||
example:
|
||||
- "path/to/aviti_output"
|
||||
must_exist: true
|
||||
create_parent: true
|
||||
required: true
|
||||
direction: "input"
|
||||
multiple: false
|
||||
multiple_sep: ";"
|
||||
- name: "Outputs"
|
||||
arguments:
|
||||
- type: "file"
|
||||
name: "--output"
|
||||
description: "Output H5MU file path."
|
||||
info: null
|
||||
example:
|
||||
- "output.h5mu"
|
||||
must_exist: true
|
||||
create_parent: true
|
||||
required: true
|
||||
direction: "output"
|
||||
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: ";"
|
||||
- name: "Options"
|
||||
arguments:
|
||||
- type: "string"
|
||||
name: "--modality"
|
||||
description: "The modality to which the processed data will be written to in the\
|
||||
\ H5MU file."
|
||||
info: null
|
||||
default:
|
||||
- "rna"
|
||||
required: false
|
||||
direction: "input"
|
||||
multiple: false
|
||||
multiple_sep: ";"
|
||||
- type: "string"
|
||||
name: "--obsm_coordinates"
|
||||
description: "Key name to store the spatial coordinates (in pixels) in obsm.\n\
|
||||
If present, spatial coordinates in micrometers will be stored under {obsm_coordinates}_um.\n\
|
||||
The column names will be stored in uns.\n"
|
||||
info: null
|
||||
default:
|
||||
- "spatial"
|
||||
required: false
|
||||
direction: "input"
|
||||
multiple: false
|
||||
multiple_sep: ";"
|
||||
- type: "string"
|
||||
name: "--layer_nuclear_counts"
|
||||
description: "Name for nuclear counts layer. If specified, nuclear count data\
|
||||
\ \nwill be stored as a separate layer in the AnnData object.\n"
|
||||
info: null
|
||||
example:
|
||||
- "nuclear_counts"
|
||||
required: false
|
||||
direction: "input"
|
||||
multiple: false
|
||||
multiple_sep: ";"
|
||||
- type: "string"
|
||||
name: "--obsm_cell_paint"
|
||||
description: "Key name for storing Cell Paint target intensities in obsm. \nIf\
|
||||
\ provided, Cell Paint target intensity data will be stored as a separate matrix\
|
||||
\ in the obsm field.\nThe column names will be stored in uns.\n"
|
||||
info: null
|
||||
example:
|
||||
- "cell_paint"
|
||||
required: false
|
||||
direction: "input"
|
||||
multiple: false
|
||||
multiple_sep: ";"
|
||||
- type: "string"
|
||||
name: "--obsm_cell_paint_nuclear"
|
||||
description: "Key name for storing Nuclear Cell Paint target intensities in obsm.\n\
|
||||
If provided, Nuclear Cell Paint target intensity data will be stored as a separate\
|
||||
\ matrix in the obsm field.\nThe column names will be stored in uns.\n"
|
||||
info: null
|
||||
example:
|
||||
- "cell_paint_nuclear"
|
||||
required: false
|
||||
direction: "input"
|
||||
multiple: false
|
||||
multiple_sep: ";"
|
||||
- type: "string"
|
||||
name: "--obsm_cell_profiler"
|
||||
description: "Key name for storing CellProfiler morphology metrics in obsm.\n\
|
||||
If provided, CellProfiler morphology metrics will be stored as a separate matrix\
|
||||
\ in the obsm field.\nThe column names will be stored in uns.\n"
|
||||
info: null
|
||||
example:
|
||||
- "cell_profiler"
|
||||
required: false
|
||||
direction: "input"
|
||||
multiple: false
|
||||
multiple_sep: ";"
|
||||
- type: "string"
|
||||
name: "--obsm_unassigned_targets"
|
||||
description: "Key name for storing any unassigned target data in obsm.\nIf provided,\
|
||||
\ unassigned target data will be stored as a separate matrix in the obsm field.\n\
|
||||
The column names will be stored in uns.\n"
|
||||
info: null
|
||||
example:
|
||||
- "cell_profiler"
|
||||
required: false
|
||||
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: "Convert spatial data resulting from Aviti Teton sequencers that have\
|
||||
\ been processed by the Element Biosciences cells2stats workflow to H5MU format.\n\
|
||||
\nThis component processes cells2stats count matrices to create a standardized H5MU\
|
||||
\ file for downstream analysis.\n\nThe component reads:\n- Parquet file containing\
|
||||
\ the count matrix and metadata\n- Panel.json with target and batch information\n\
|
||||
\nAnd outputs an H5MU file with:\n- Count data as the main .X matrix\n- Spatial\
|
||||
\ coordinates in obsm\n- Cell Paint intensities in obsm (optional)\n- Nuclear count\
|
||||
\ data as a layer (optional)\n- CellProfiler morphology metrics in obsm (optional)\n\
|
||||
- Unassigned targets in obsm (optional)\n"
|
||||
test_resources:
|
||||
- type: "python_script"
|
||||
path: "test.py"
|
||||
is_executable: true
|
||||
- type: "file"
|
||||
path: "aviti"
|
||||
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"
|
||||
- "lowcpu"
|
||||
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.13-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"
|
||||
- "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_cells2stats_to_h5mu/config.vsh.yaml"
|
||||
runner: "nextflow"
|
||||
engine: "docker|native"
|
||||
output: "target/nextflow/convert/from_cells2stats_to_h5mu"
|
||||
executable: "target/nextflow/convert/from_cells2stats_to_h5mu/main.nf"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
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"
|
||||
4261
target/nextflow/convert/from_cells2stats_to_h5mu/main.nf
Normal file
4261
target/nextflow/convert/from_cells2stats_to_h5mu/main.nf
Normal file
File diff suppressed because it is too large
Load Diff
126
target/nextflow/convert/from_cells2stats_to_h5mu/nextflow.config
Normal file
126
target/nextflow/convert/from_cells2stats_to_h5mu/nextflow.config
Normal file
@@ -0,0 +1,126 @@
|
||||
manifest {
|
||||
name = 'convert/from_cells2stats_to_h5mu'
|
||||
mainScript = 'main.nf'
|
||||
nextflowVersion = '!>=20.12.1-edge'
|
||||
version = 'build_main'
|
||||
description = 'Convert spatial data resulting from Aviti Teton sequencers that have been processed by the Element Biosciences cells2stats workflow to H5MU format.\n\nThis component processes cells2stats count matrices to create a standardized H5MU file for downstream analysis.\n\nThe component reads:\n- Parquet file containing the count matrix and metadata\n- Panel.json with target and batch information\n\nAnd outputs an H5MU file with:\n- Count data as the main .X matrix\n- Spatial coordinates in obsm\n- Cell Paint intensities in obsm (optional)\n- Nuclear count data as a layer (optional)\n- CellProfiler morphology metrics in obsm (optional)\n- Unassigned targets in obsm (optional)\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,115 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"title": "from_cells2stats_to_h5mu",
|
||||
"description": "Convert spatial data resulting from Aviti Teton sequencers that have been processed by the Element Biosciences cells2stats workflow to H5MU format.\n\nThis component processes cells2stats count matrices to create a standardized H5MU file for downstream analysis.\n\nThe component reads:\n- Parquet file containing the count matrix and metadata\n- Panel.json with target and batch information\n\nAnd outputs an H5MU file with:\n- Count data as the main .X matrix\n- Spatial coordinates in obsm\n- Cell Paint intensities in obsm (optional)\n- Nuclear count data as a layer (optional)\n- CellProfiler morphology metrics in obsm (optional)\n- Unassigned targets in obsm (optional)\n",
|
||||
"type": "object",
|
||||
"$defs": {
|
||||
"inputs": {
|
||||
"title": "Inputs",
|
||||
"type": "object",
|
||||
"description": "No description",
|
||||
"properties": {
|
||||
"input": {
|
||||
"type": "string",
|
||||
"format": "path",
|
||||
"exists": true,
|
||||
"description": "Path to the cells2stats output bundle",
|
||||
"help_text": "Type: `file`, multiple: `False`, required, direction: `input`, example: `\"path/to/aviti_output\"`. "
|
||||
}
|
||||
}
|
||||
},
|
||||
"outputs": {
|
||||
"title": "Outputs",
|
||||
"type": "object",
|
||||
"description": "No description",
|
||||
"properties": {
|
||||
"output": {
|
||||
"type": "string",
|
||||
"format": "path",
|
||||
"description": "Output H5MU file path.",
|
||||
"help_text": "Type: `file`, multiple: `False`, required, default: `\"$id.$key.output.h5mu\"`, direction: `output`, example: `\"output.h5mu\"`. ",
|
||||
"default": "$id.$key.output.h5mu"
|
||||
},
|
||||
"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"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"title": "Options",
|
||||
"type": "object",
|
||||
"description": "No description",
|
||||
"properties": {
|
||||
"modality": {
|
||||
"type": "string",
|
||||
"description": "The modality to which the processed data will be written to in the H5MU file.",
|
||||
"help_text": "Type: `string`, multiple: `False`, default: `\"rna\"`. ",
|
||||
"default": "rna"
|
||||
},
|
||||
"obsm_coordinates": {
|
||||
"type": "string",
|
||||
"description": "Key name to store the spatial coordinates (in pixels) in obsm.\nIf present, spatial coordinates in micrometers will be stored under {obsm_coordinates}_um.\nThe column names will be stored in uns.\n",
|
||||
"help_text": "Type: `string`, multiple: `False`, default: `\"spatial\"`. ",
|
||||
"default": "spatial"
|
||||
},
|
||||
"layer_nuclear_counts": {
|
||||
"type": "string",
|
||||
"description": "Name for nuclear counts layer",
|
||||
"help_text": "Type: `string`, multiple: `False`, example: `\"nuclear_counts\"`. "
|
||||
},
|
||||
"obsm_cell_paint": {
|
||||
"type": "string",
|
||||
"description": "Key name for storing Cell Paint target intensities in obsm",
|
||||
"help_text": "Type: `string`, multiple: `False`, example: `\"cell_paint\"`. "
|
||||
},
|
||||
"obsm_cell_paint_nuclear": {
|
||||
"type": "string",
|
||||
"description": "Key name for storing Nuclear Cell Paint target intensities in obsm.\nIf provided, Nuclear Cell Paint target intensity data will be stored as a separate matrix in the obsm field.\nThe column names will be stored in uns.\n",
|
||||
"help_text": "Type: `string`, multiple: `False`, example: `\"cell_paint_nuclear\"`. "
|
||||
},
|
||||
"obsm_cell_profiler": {
|
||||
"type": "string",
|
||||
"description": "Key name for storing CellProfiler morphology metrics in obsm.\nIf provided, CellProfiler morphology metrics will be stored as a separate matrix in the obsm field.\nThe column names will be stored in uns.\n",
|
||||
"help_text": "Type: `string`, multiple: `False`, example: `\"cell_profiler\"`. "
|
||||
},
|
||||
"obsm_unassigned_targets": {
|
||||
"type": "string",
|
||||
"description": "Key name for storing any unassigned target data in obsm.\nIf provided, unassigned target data will be stored as a separate matrix in the obsm field.\nThe column names will be stored in uns.\n",
|
||||
"help_text": "Type: `string`, multiple: `False`, example: `\"cell_profiler\"`. "
|
||||
}
|
||||
}
|
||||
},
|
||||
"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/inputs"
|
||||
},
|
||||
{
|
||||
"$ref": "#/$defs/outputs"
|
||||
},
|
||||
{
|
||||
"$ref": "#/$defs/options"
|
||||
},
|
||||
{
|
||||
"$ref": "#/$defs/nextflow input-output arguments"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
@@ -229,7 +229,7 @@ build_info:
|
||||
output: "target/nextflow/convert/from_cosmx_to_h5mu"
|
||||
executable: "target/nextflow/convert/from_cosmx_to_h5mu/main.nf"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
name: "openpipeline_spatial"
|
||||
|
||||
@@ -3337,7 +3337,7 @@ meta = [
|
||||
"engine" : "docker|native",
|
||||
"output" : "/workdir/root/repo/target/nextflow/convert/from_cosmx_to_h5mu",
|
||||
"viash_version" : "0.9.4",
|
||||
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||
"git_commit" : "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8",
|
||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
},
|
||||
"package_config" : {
|
||||
|
||||
@@ -236,7 +236,7 @@ build_info:
|
||||
output: "target/nextflow/convert/from_cosmx_to_spatialexperiment"
|
||||
executable: "target/nextflow/convert/from_cosmx_to_spatialexperiment/main.nf"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
name: "openpipeline_spatial"
|
||||
|
||||
@@ -3328,7 +3328,7 @@ meta = [
|
||||
"engine" : "docker|native",
|
||||
"output" : "/workdir/root/repo/target/nextflow/convert/from_cosmx_to_spatialexperiment",
|
||||
"viash_version" : "0.9.4",
|
||||
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||
"git_commit" : "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8",
|
||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
},
|
||||
"package_config" : {
|
||||
|
||||
@@ -224,7 +224,7 @@ build_info:
|
||||
output: "target/nextflow/convert/from_spatialdata_to_h5mu"
|
||||
executable: "target/nextflow/convert/from_spatialdata_to_h5mu/main.nf"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
name: "openpipeline_spatial"
|
||||
|
||||
@@ -3336,7 +3336,7 @@ meta = [
|
||||
"engine" : "docker|native",
|
||||
"output" : "/workdir/root/repo/target/nextflow/convert/from_spatialdata_to_h5mu",
|
||||
"viash_version" : "0.9.4",
|
||||
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||
"git_commit" : "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8",
|
||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
},
|
||||
"package_config" : {
|
||||
|
||||
@@ -237,7 +237,7 @@ build_info:
|
||||
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_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
name: "openpipeline_spatial"
|
||||
|
||||
@@ -3337,7 +3337,7 @@ meta = [
|
||||
"engine" : "docker|native",
|
||||
"output" : "/workdir/root/repo/target/nextflow/convert/from_xenium_to_h5mu",
|
||||
"viash_version" : "0.9.4",
|
||||
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||
"git_commit" : "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8",
|
||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
},
|
||||
"package_config" : {
|
||||
|
||||
@@ -318,7 +318,7 @@ build_info:
|
||||
output: "target/nextflow/convert/from_xenium_to_spatialdata"
|
||||
executable: "target/nextflow/convert/from_xenium_to_spatialdata/main.nf"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
name: "openpipeline_spatial"
|
||||
|
||||
@@ -3431,7 +3431,7 @@ meta = [
|
||||
"engine" : "docker|native",
|
||||
"output" : "/workdir/root/repo/target/nextflow/convert/from_xenium_to_spatialdata",
|
||||
"viash_version" : "0.9.4",
|
||||
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||
"git_commit" : "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8",
|
||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
},
|
||||
"package_config" : {
|
||||
|
||||
@@ -226,7 +226,7 @@ build_info:
|
||||
output: "target/nextflow/convert/from_xenium_to_spatialexperiment"
|
||||
executable: "target/nextflow/convert/from_xenium_to_spatialexperiment/main.nf"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
name: "openpipeline_spatial"
|
||||
|
||||
@@ -3317,7 +3317,7 @@ meta = [
|
||||
"engine" : "docker|native",
|
||||
"output" : "/workdir/root/repo/target/nextflow/convert/from_xenium_to_spatialexperiment",
|
||||
"viash_version" : "0.9.4",
|
||||
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||
"git_commit" : "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8",
|
||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
},
|
||||
"package_config" : {
|
||||
|
||||
@@ -231,7 +231,7 @@ build_info:
|
||||
output: "target/nextflow/filter/subset_cosmx"
|
||||
executable: "target/nextflow/filter/subset_cosmx/main.nf"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
name: "openpipeline_spatial"
|
||||
|
||||
@@ -3339,7 +3339,7 @@ meta = [
|
||||
"engine" : "docker|native",
|
||||
"output" : "/workdir/root/repo/target/nextflow/filter/subset_cosmx",
|
||||
"viash_version" : "0.9.4",
|
||||
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||
"git_commit" : "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8",
|
||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
},
|
||||
"package_config" : {
|
||||
|
||||
@@ -430,7 +430,7 @@ build_info:
|
||||
output: "target/nextflow/mapping/spaceranger_count"
|
||||
executable: "target/nextflow/mapping/spaceranger_count/main.nf"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
package_config:
|
||||
name: "openpipeline_spatial"
|
||||
|
||||
@@ -3554,7 +3554,7 @@ meta = [
|
||||
"engine" : "docker|native",
|
||||
"output" : "/workdir/root/repo/target/nextflow/mapping/spaceranger_count",
|
||||
"viash_version" : "0.9.4",
|
||||
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||
"git_commit" : "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8",
|
||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
},
|
||||
"package_config" : {
|
||||
|
||||
@@ -648,7 +648,7 @@ build_info:
|
||||
output: "target/nextflow/workflows/multiomics/spatial_process_samples"
|
||||
executable: "target/nextflow/workflows/multiomics/spatial_process_samples/main.nf"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
dependencies:
|
||||
- "target/dependencies/github/openpipelines-bio/openpipeline/disable-scrublet_build/nextflow/workflows/multiomics/process_samples"
|
||||
|
||||
@@ -3819,7 +3819,7 @@ meta = [
|
||||
"engine" : "native",
|
||||
"output" : "/workdir/root/repo/target/nextflow/workflows/multiomics/spatial_process_samples",
|
||||
"viash_version" : "0.9.4",
|
||||
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||
"git_commit" : "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8",
|
||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
},
|
||||
"package_config" : {
|
||||
|
||||
@@ -391,7 +391,7 @@ build_info:
|
||||
output: "target/nextflow/workflows/qc/spatial_qc"
|
||||
executable: "target/nextflow/workflows/qc/spatial_qc/main.nf"
|
||||
viash_version: "0.9.4"
|
||||
git_commit: "33c1a3afb0dfebceff25b0a0104bf16582611716"
|
||||
git_commit: "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8"
|
||||
git_remote: "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
dependencies:
|
||||
- "target/dependencies/github/openpipelines-bio/openpipeline/2.1.2/nextflow/workflows/qc/qc"
|
||||
|
||||
@@ -3511,7 +3511,7 @@ meta = [
|
||||
"engine" : "native",
|
||||
"output" : "/workdir/root/repo/target/nextflow/workflows/qc/spatial_qc",
|
||||
"viash_version" : "0.9.4",
|
||||
"git_commit" : "33c1a3afb0dfebceff25b0a0104bf16582611716",
|
||||
"git_commit" : "fab3d7dbd86e169a9e3b736c0d7b5bb76b22a1e8",
|
||||
"git_remote" : "https://github.com/openpipelines-bio/openpipeline_spatial"
|
||||
},
|
||||
"package_config" : {
|
||||
|
||||
Reference in New Issue
Block a user