diff --git a/.nf-core.yml b/.nf-core.yml index 4b29f5c7..76c9d634 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -9,11 +9,11 @@ lint: - assets/nf-core-pixelator_logo_light.png - .github/PULL_REQUEST_TEMPLATE.md multiqc_config: false -nf_core_version: 3.5.1 +nf_core_version: 3.5.2 repository_type: pipeline template: author: Pixelgen Technologies AB - description: Pipeline for analysis of Molecular Pixelation assays + description: Pipeline for analysis of Proximity Network Assay data force: false is_nfcore: true name: pixelator @@ -23,4 +23,4 @@ template: - fastqc - multiqc - igenomes - version: 2.3.1 + version: 3.0.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 937ddb79..66c046ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,83 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [[2.3.1](https://github.com/nf-core/pixelator/releases/tag/2.3.1)] - 2025-01-14 +## [[3.0.0](https://github.com/nf-core/pixelator/releases/tag/3.0.0)] - 2026-02-23 + +### Changed + +- Set default pna_graph_component_size_min_threshold to 8000 instead of null (i.e. automatic) by @ptajvar [#183](https://github.com/nf-core/pixelator/pull/183). + +### Removed + +- Support for MPX in the pipeline by @johandahlberg [#182](https://github.com/nf-core/pixelator/pull/182) + +### Enhancements & fixes + +- Update schema files (e.g. explicitly use integer types for integers, rather than numbers) by @johandahlberg [#184](https://github.com/nf-core/pixelator/pull/184), [#186](https://github.com/nf-core/pixelator/pull/186) +- Add option to select custom containers for the experiment summary by @Aratz [#186](https://github.com/nf-core/pixelator/pull/186) + +### Parameters + +| Old parameter | New parameter | +| ---------------------------------------- | -------------------------------- | +| | `--experiment_summary_container` | +| `--save_amplicon_reads` | | +| `--trim_front` | | +| `--trim_tail` | | +| `--max_length` | | +| `--min_length` | | +| `--max_n_bases` | | +| `--avg_qual` | | +| `--dedup` | | +| `--remove_polyg` | | +| `--adapterqc_mismatches` | | +| `--save_qc_passed_reads` | | +| `--save_qc_failed_reads` | | +| `--demux_mismatches` | | +| `--demux_min_length` | | +| `--save_demux_processed_reads` | | +| `--save_demux_failed_reads` | | +| `--markers_ignore` | | +| `--algorithm` | | +| `--max_neighbours` | | +| `--collapse_mismatches` | | +| `--collapse_min_count` | | +| `--save_collapsed_reads` | | +| `--multiplet_recovery` | | +| `--graph_max_refinement_recursion_depth` | | +| `--graph_max_edges_to_split` | | +| `--graph_min_count` | | +| `--save_edgelist` | | +| `--min_size` | | +| `--max_size` | | +| `--dynamic_filter` | | +| `--aggregate_calling` | | +| `--save_raw_component_metrics` | | +| `--save_annotate_dataset` | | +| `--skip_analysis` | | +| `--compute_polarization` | | +| `--compute_colocalization` | | +| `--use_full_bipartite` | | +| `--polarization_transformation` | | +| `--polarization_n_permutations` | | +| `--polarization_min_marker_count` | | +| `--colocalization_transformation` | | +| `--colocalization_neighbourhood_size` | | +| `--colocalization_n_permutations` | | +| `--colocalization_min_region_count` | | +| `--colocalization_min_marker_count` | | +| `--save_analysis_dataset` | | +| `--skip_layout` | | +| `--no_node_marker_counts` | | +| `--layout_algorithm` | | +| `--skip_report` | | + +> [!NOTE] +> Parameter has been **updated** if both old and new parameter information is present. +> Parameter has been **added** if just the new parameter information is present. +> Parameter has been **removed** if new parameter information isn't present. + +## [[2.3.1](https://github.com/nf-core/pixelator/releases/tag/2.3.1)] - 2026-01-14 - Update usage documentation by @vincent-van-hoef [#176](https://github.com/nf-core/pixelator/pull/176) - Use PNA data in test profile by @Aratz [#177](https://github.com/nf-core/pixelator/pull/177) diff --git a/CITATIONS.md b/CITATIONS.md index 4d7355ef..cb8dd47f 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -12,7 +12,7 @@ - [pixelator](https://doi.org/10.1038/s41592-024-02268-9) - > Karlsson, F., Kallas, T., Thiagarajan, D. et al. “Molecular pixelation: spatial proteomics of single cells by sequencing.“ Nat Methods 21, 1044–1052 (2024). https://doi.org/10.1038/s41592-024-02268-9 + > Karlsson, F., Simonetti, M.,Galonska, C. et al. "Single-Cell Protein Interactomes by the Proximity Network Assay". _bioRxiv_ 2025.06.19.660329; doi: [10.1101/2025.06.19.660329](https://doi.org/10.1101/2025.06.19.660329) - [cutadapt](http://dx.doi.org/10.14806/ej.17.1.200) diff --git a/README.md b/README.md index 032396bd..ec345b64 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) [![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) -[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.2) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) @@ -24,14 +24,12 @@ ## Introduction **nf-core/pixelator** is a bioinformatics best-practice analysis pipeline for analysis of data from the -Molecular Pixelation (MPX) and Proximity Network (PNA) assays. It takes a samplesheet as input and will process your data +Proximity Network (PNA) assay. It takes a samplesheet as input and will process your data using `pixelator` to produce a PXL file containing single-cell protein abundance and protein interactomics data. ![](./docs/images/nf-core-pixelator-metromap.svg) -Depending on the input data the pipeline will run different steps. - -For PNA data, the pipeline will run the following steps: +The pipeline will run the following steps: 1. Do quality control checks of input reads and build amplicons ([`pixelator single-cell-pna amplicon`](https://github.com/PixelgenTechnologies/pixelator)) 2. Create groups of amplicons based on their marker assignments ([`pixelator single-cell-pna demux`](https://github.com/PixelgenTechnologies/pixelator)) @@ -42,17 +40,9 @@ For PNA data, the pipeline will run the following steps: 7. Generate 3D graph layouts for visualization of cells ([`pixelator single-cell-pna layout`](https://github.com/PixelgenTechnologies/pixelator)) 8. Proxiome Experiment Summary generation using [PixelatorES](https://github.com/PixelgenTechnologies/pixelatorES) -For MPX data, the pipeline will run the following steps: - -1. Build an amplicons from the input reads ([`pixelator single-cell-mpx amplicon`](https://github.com/PixelgenTechnologies/pixelator)) -2. Read QC and filtering, correctness of the pixel binding sequence sequences ([`pixelator single-cell-mpx preqc | pixelator adapterqc`](https://github.com/PixelgenTechnologies/pixelator)) -3. Assign a marker (barcode) to each read ([`pixelator single-cell-mpx demux`](https://github.com/PixelgenTechnologies/pixelator)) -4. Error correction, duplicate removal, compute read counts ([`pixelator single-cell-mpx collapse`](https://github.com/PixelgenTechnologies/pixelator)) -5. Compute the components of the graph from the edge list in order to create putative cells ([`pixelator single-cell-mpx graph`](https://github.com/PixelgenTechnologies/pixelator)) -6. Call and annotate cells ([`pixelator single-cell-mpx annotate`](https://github.com/PixelgenTechnologies/pixelator)) -7. Analyze the cells for polarization and colocalization ([`pixelator single-cell-mpx analysis`](https://github.com/PixelgenTechnologies/pixelator)) -8. Generate 3D graph layouts for visualization of cells ([`pixelator single-cell-mpx layout`](https://github.com/PixelgenTechnologies/pixelator)) -9. Report generation ([`pixelator single-cell-mpx report`](https://github.com/PixelgenTechnologies/pixelator)) +> [!NOTE] +> If you are looking to run the pipeline with Molecular Pixelation (MPX) data. Please refer to the [release 2.3.1](https://nf-co.re/pixelator/2.3.1/), +> which is the last version to support that data type. > [!WARNING] > Since Nextflow 23.07.0-edge, Nextflow no longer mounts the host's home directory when using Apptainer or Singularity. @@ -128,13 +118,7 @@ You can cite the `nf-core` publication as follows: > > _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x). -You can cite the molecular pixelation technology as follows: - -> **Molecular pixelation: spatial proteomics of single cells by sequencing.** -> -> Filip Karlsson, Tomasz Kallas, Divya Thiagarajan, Max Karlsson, Maud Schweitzer, Jose Fernandez Navarro, Louise Leijonancker, Sylvain Geny, Erik Pettersson, Jan Rhomberg-Kauert, Ludvig Larsson, Hanna van Ooijen, Stefan Petkov, Marcela González-Granillo, Jessica Bunz, Johan Dahlberg, Michele Simonetti, Prajakta Sathe, Petter Brodin, Alvaro Martinez Barrio & Simon Fredriksson -> -> _Nat Methods._ 2024 May 08. doi: [10.1038/s41592-024-02268-9](https://doi.org/10.1038/s41592-024-02268-9) +You can cite the Proximity Network Technology as follows: > **Single-Cell Protein Interactomes by the Proximity Network Assay.** > diff --git a/assets/email_template.html b/assets/email_template.html index 53b708ad..46902e6f 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -4,7 +4,7 @@ - + nf-core/pixelator Pipeline Report diff --git a/assets/schema_input.json b/assets/schema_input.json index 5dbf2922..96d38d3e 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -7,45 +7,66 @@ "items": { "type": "object", "required": ["sample", "design", "fastq_1"], + "additionalProperties": false, "properties": { "sample": { "type": "string", "pattern": "^\\S+$", "errorMessage": "Sample name must be provided and cannot contain spaces", + "description": "Sample name (no spaces).", "meta": ["id"] }, "design": { "type": "string", - "meta": ["design"], - "errorMessage": "Design must be specified" + "pattern": "^\\S+$", + "errorMessage": "Design must be specified", + "description": "Design identifier (no spaces).", + "meta": ["design"] }, "panel": { - "errorMessage": "Panel name must be specified", "type": "string", + "pattern": "^\\S+$", + "description": "Panel identifier (no spaces).", + "errorMessage": "panel or panel_file must be specified", "meta": ["panel"] }, "panel_file": { + "type": "string", + "description": "Optional panel file path. Empty string allowed. If set, must end with .csv, .tsv, .yaml, or .yml and contain no spaces.", "errorMessage": "Panel file must either be left empty or cannot contain spaces and must have extension '.csv', '.tsv' or '.yaml'", - "anyOf": [ - { - "type": "string", - "pattern": "^\\S+.(csv|tsv|ya?ml)$" - }, - { - "type": "string", - "maxLength": 0 - } - ] + "pattern": "^$|^\\S+\\.(csv|tsv|ya?ml)$" }, "fastq_1": { "type": "string", "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "description": "FASTQ(.gz) path for read 1 (no spaces).", "errorMessage": "FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" }, "fastq_2": { "type": "string", "pattern": "^\\S+\\.f(ast)?q\\.gz$", - "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" + "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'", + "description": "Optional FASTQ(.gz) path for read 2 (no spaces)." + }, + "condition": { + "type": "string", + "description": "Optional experimental condition for the sample.", + "meta": ["condition"] + }, + "reference_condition": { + "type": "string", + "description": "Optional reference condition for differential analysis.", + "meta": ["reference_condition"] + }, + "sample_alias": { + "type": "string", + "description": "Optional alternative sample name.", + "meta": ["sample_alias"] + }, + "alternative_condition": { + "type": "string", + "description": "Optional alternative condition for the sample.", + "meta": ["alternative_condition"] } } } diff --git a/conf/modules.config b/conf/modules.config index 1cf9c595..0e80b750 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -46,339 +46,9 @@ process { publishDir = [ enabled: false ] } - - // use explicit (params.my_option instanceof Integer) checks to avoid issues with 0 evaluating false - // since most pixelator flags do accept zero as a value - - withName: PIXELATOR_AMPLICON { - ext.args = { ["--design ${meta.design}"].join(' ').trim() } - - publishDir = [ - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: 'amplicon/*.merged.{fq,fastq}.gz', - saveAs: { (params.save_amplicon_reads || params.save_all) ? it : null } - ], - [ - path: { "${params.outdir}/pixelator/logs/${meta.id}" }, - mode: params.publish_dir_mode, - pattern: "*.log" - ], - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: '**/*.{report,meta}.json', - saveAs: { params.save_json || params.save_all ? it : null } - ] - ] - } - - withName: PIXELATOR_QC { - // Options for pixelator preqc - ext.args = { - [ - "--design ${meta.design}", - (params.trim_front instanceof Integer)? "--trim-front ${params.trim_front}": '', - (params.trim_tail instanceof Integer) ? "--trim-tail ${params.trim_tail}": '', - (params.max_length instanceof Integer) ? "--max-length ${params.max_length}": '', - (params.min_length instanceof Integer) ? "--min-length ${params.min_length}": '', - (params.max_n_bases instanceof Integer) ? "--max-n-bases ${params.max_n_bases}": '', - (params.avg_qual instanceof Integer)? "--avg-qual ${params.avg_qual}": '', - params.dedup ? "--dedup": '', - params.remove_polyg ? "--remove_polyg": '', - ].join(' ').trim() - } - - // Options for pixelator adapterqc - ext.args2 = { [ - "--design ${meta.design}", - params.adapterqc_mismatches ? "--mismatches ${params.adapterqc_mismatches}": '', - ].join(' ').trim() - } - - publishDir = [ - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: '{preqc,adapterqc}/*.processed.{fq,fastq}.gz', - saveAs: { (params.save_qc_passed_reads || params.save_all) ? it : null } - ], - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: '{preqc,adapterqc}/*.failed.{fq,fastq}.gz', - saveAs: { (params.save_qc_failed_reads || params.save_all) ? it : null } - ], - [ - path: { "${params.outdir}/pixelator/logs/${meta.id}" }, - mode: params.publish_dir_mode, - pattern: '*.log' - ], - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: '**/*.{report,meta}.json', - saveAs: { params.save_json || params.save_all ? it : null } - ], - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: '**/*.qc-report.html', - saveAs: { (params.save_all) ? it : null } - ] - ] - } - - withName: PIXELATOR_DEMUX { - ext.args = { - [ - "--design ${meta.design}", - (params.demux_mismatches != null) ? "--mismatches ${params.demux_mismatches}": '', - (params.demux_min_length instanceof Integer) ? "--mismatches ${params.demux_min_length}": '', - ].join(' ').trim() - } - - publishDir = [ - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: 'demux/*.processed-*.{fq,fastq}.gz', - saveAs: { (params.save_demux_processed_reads || params.save_all) ? it : null } - ], - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: 'demux/*failed.{fq,fastq}.gz', - saveAs: { (params.save_demux_failed_reads || params.save_all) ? it : null } - ], - [ - path: { "${params.outdir}/pixelator/logs/${meta.id}" }, - mode: params.publish_dir_mode, - pattern: '*.log' - ], - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: '**/*.{report,meta}.json', - saveAs: { params.save_json || params.save_all ? it : null } - ] - ] - } - - withName: PIXELATOR_COLLAPSE { - ext.args = { - [ - params.markers_ignore ? "--markers_ignore ${params.markers_ignore}": - params.algorithm ? "--algorithm ${params.algorithm}": '', - params.max_neighbours ? "--max-neighbours ${params.max_neighbours}": '', - params.collapse_mismatches ? "--mismatches ${params.collapse_mismatches}": '', - params.collapse_min_count ? "--min-count ${params.collapse_min_count}": '', - ].join(' ').trim() - } - - publishDir = [ - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: 'collapse/*.collapsed.parquet', - saveAs: { (params.save_collapsed_reads || params.save_all) ? it : null } - ], - [ - path: { "${params.outdir}/pixelator/logs/${meta.id}" }, - mode: params.publish_dir_mode, - pattern: '*.log' - ], - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: '**/*.{report,meta}.json', - saveAs: { params.save_json || params.save_all ? it : null } - ] - ] - } - - withName: PIXELATOR_GRAPH { - ext.args = { - [ - params.multiplet_recovery ? "--multiplet-recovery" : '', - params.graph_min_count ? "--min-count ${params.graph_min_count}" : '', - params.graph_max_refinement_recursion_depth ? "--max-refinement-recursion-depth ${params.graph_max_refinement_recursion_depth}" : '', - params.graph_max_edges_to_split ? "--max-edges-to-split ${params.graph_max_edges_to_split}" : '', - ].join(' ').trim() - } - - publishDir = [ - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: 'graph/*edgelist.parquet', - saveAs: { (params.save_edgelist || params.save_all) ? it : null } - ], - [ - path: { "${params.outdir}/pixelator/logs/${meta.id}" }, - mode: params.publish_dir_mode, - pattern: '*.log' - ], - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: '**/*.{report,meta}.json', - saveAs: { params.save_json || params.save_all ? it : null } - ] - ] - } - - withName: PIXELATOR_ANNOTATE { - ext.args = { - [ - (params.min_size instanceof Integer) ? "--min-size ${params.min_size}" : '', - (params.max_size instanceof Integer) ? "--max-size ${params.max_size}" : '', - params.dynamic_filter ? "--dynamic-filter ${params.dynamic_filter}" : '', - params.aggregate_calling ? "--aggregate-calling" : '', - ].join(' ').trim() - } - - publishDir = [ - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: 'annotate/*.dataset.pxl', - saveAs: { - if (params.skip_layout && params.skip_analysis) { - // Trim the annotate directory prefix from the output name - return new File(it).name - } - else if (params.save_annotate_dataset || params.save_all) { - return it - } - return null - } - ], - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: '**/*.{report,meta}.json', - saveAs: { (params.save_raw_component_metrics || params.save_all) ? it : null } - ], - [ - path: { "${params.outdir}/pixelator/logs/${meta.id}" }, - mode: params.publish_dir_mode, - pattern: '*.log' - ], - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: '**/*.{report,meta}.json', - saveAs: { params.save_json || params.save_all ? it : null } - ] - ] - } - - withName: PIXELATOR_ANALYSIS { - ext.when = { !params.skip_analysis } - ext.args = { - [ - params.compute_polarization ? "--compute-polarization" : '', - params.compute_colocalization ? "--compute-colocalization" : '', - params.use_full_bipartite ? "--use-full-bipartite " : '', - params.polarization_min_marker_count ? "--polarization-min-marker-count ${params.polarization_min_marker_count}" : '', - params.polarization_transformation ? "--polarization-transformation ${params.polarization_transformation}" : '', - params.colocalization_transformation ? "--colocalization-transformation ${params.colocalization_transformation}" : '', - params.polarization_n_permutations ? "--polarization-n-permutations ${params.polarization_n_permutations}" : '', - (params.colocalization_neighbourhood_size instanceof Integer) ? "--colocalization-neighbourhood-size ${params.colocalization_neighbourhood_size}" : '', - (params.colocalization_n_permutations instanceof Integer) ? "--colocalization-n-permutations ${params.colocalization_n_permutations}" : '', - (params.colocalization_min_region_count instanceof Integer) ? "--colocalization-min-region-count ${params.colocalization_min_region_count}" : '', - (params.colocalization_min_marker_count instanceof Integer) ? "--colocalization-min-marker-count ${params.colocalization_min_marker_count}" : '' - ].join(' ').trim() + withName: "EXPERIMENT_SUMMARY" { + if (params.experiment_summary_container) { + container = params.experiment_summary_container } - - publishDir = [ - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: 'analysis/*.dataset.pxl', - saveAs: { - if (params.skip_layout) { - // Trim the annotate directory prefix from the output name - return new File(it).name - } - else if (params.save_analysis_dataset || params.save_all) { - return it - } - return null - } - ], - [ - path: { "${params.outdir}/pixelator/logs/${meta.id}" }, - mode: params.publish_dir_mode, - pattern: '*.log' - ], - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: '**/*.{report,meta}.json', - saveAs: { params.save_json || params.save_all ? it : null } - ] - ] - } - - withName: PIXELATOR_LAYOUT { - ext.when = { !params.skip_layout } - ext.args = { - [ - params.no_node_marker_counts ? "--no-node-marker-counts" : '', - params.layout_algorithm ? "--layout-algorithm ${params.layout_algorithm} " : '', - ].join(' ').trim() - } - - publishDir = [ - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: 'layout/*.dataset.pxl', - saveAs: { - // Trim the annotate directory prefix from the output name - new File(it).name - } - ], - [ - path: { "${params.outdir}/pixelator/logs/${meta.id}" }, - mode: params.publish_dir_mode, - pattern: '*.log' - ], - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: '**/*.{report,meta}.json', - saveAs: { params.save_json || params.save_all ? it : null } - ] - ] - } - - withName: PIXELATOR_REPORT { - ext.when = { !params.skip_report } - publishDir = [ - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: 'report/*.html', - saveAs: { - // Trim the annotate directory prefix from the output name - new File(it).name - } - ], - [ - path: { "${params.outdir}/pixelator/logs/${meta.id}" }, - mode: params.publish_dir_mode, - pattern: '*.log' - ], - [ - path: { "${params.outdir}/pixelator" }, - mode: params.publish_dir_mode, - pattern: '**/*.{report,meta}.json', - saveAs: { params.save_json || params.save_all ? it : null } - ] - ] } } diff --git a/conf/modules.pna.config b/conf/modules.pna.config index 4a17e9eb..5b601a94 100644 --- a/conf/modules.pna.config +++ b/conf/modules.pna.config @@ -102,7 +102,7 @@ process { path: { "${params.outdir}/pixelator" }, mode: params.publish_dir_mode, pattern: 'collapse/*.parquet', - saveAs: { params.save_collapsed_reads || params.save_all ? it : null }, + saveAs: { params.save_pna_collapsed_reads || params.save_all ? it : null }, ], [ path: { "${params.outdir}/pixelator/logs/${meta.id}" }, diff --git a/conf/test_full.config b/conf/test_full.config index 106e2708..e9621480 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -1,19 +1,37 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running full-size tests + Nextflow config file for running minimal tests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a full size pipeline test. + Defines input files and everything required to run a fast and simple pipeline test + for the pna pipline Use as follows: - nextflow run nf-core/pixelator -profile test_full, --outdir + nextflow run nf-core/pixelator -profile test_pna, --outdir ---------------------------------------------------------------------------------------- */ +process { + resourceLimits = [ + cpus: 4, + memory: '15.GB', + time: '1.h', + ] + + // Run a smaller experiment summary for testing + withName: EXPERIMENT_SUMMARY { + ext.args = '-P test_mode="TRUE"' + } +} params { - config_profile_name = 'Full test profile' - config_profile_description = 'Full test dataset to check pipeline function' + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' + + // Input data + input = params.pipelines_testdata_base_path + '/samplesheet/pna/samplesheet_pna.csv' + input_basedir = params.pipelines_testdata_base_path + '/testdata/pna' + + pna_graph_component_size_min_threshold = 100 - input = params.pipelines_testdata_base_path + "/samplesheet/mpx/samplesheet_full.csv" - input_basedir = "s3://pixelgen-technologies-datasets/nf-core-pixelator/testdata/full/" + skip_layout = false } diff --git a/conf/test_mpx.config b/conf/test_mpx.config deleted file mode 100644 index ff089546..00000000 --- a/conf/test_mpx.config +++ /dev/null @@ -1,44 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running minimal tests -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a fast and simple pipeline test. - - Use as follows: - nextflow run nf-core/pixelator -profile test, --outdir - ----------------------------------------------------------------------------------------- -*/ - -process { - resourceLimits = [ - cpus: 4, - memory: '15.GB', - time: '1.h', - ] -} - -aws.client.downloadParallel = true - - -params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function' - - // Input data - input = params.pipelines_testdata_base_path + '/samplesheet/mpx/samplesheet.csv' - input_basedir = params.pipelines_testdata_base_path + '/testdata/mpx' - - multiplet_recovery = true - min_size = null - max_size = 100000 - dynamic_filter = null - compute_polarization = true - use_full_bipartite = true - colocalization_min_region_count = 0 - colocalization_n_permutations = 10 - colocalization_neighbourhood_size = 1 - - // using this since the default pmds_3d does not work on very small graphs - layout_algorithm = "fruchterman_reingold_3d" -} diff --git a/conf/test_panel_v2.config b/conf/test_panel_v2.config deleted file mode 100644 index 703fb58d..00000000 --- a/conf/test_panel_v2.config +++ /dev/null @@ -1,48 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running minimal tests -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a fast and simple pipeline test - using the v2 panel. - - Use as follows: - nextflow run nf-core/pixelator -profile test_panel_v2, --outdir - ----------------------------------------------------------------------------------------- -*/ - - -aws.client.downloadParallel = true - -process { - resourceLimits = [ - cpus: 4, - memory: '15.GB', - time: '1.h', - ] -} - -params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function' - - // Input data - input = params.pipelines_testdata_base_path + '/samplesheet/mpx/samplesheet_v2.csv' - input_basedir = params.pipelines_testdata_base_path + '' - - multiplet_recovery = true - min_size = 1 - max_size = 100000 - dynamic_filter = null - compute_polarization = true - use_full_bipartite = true - colocalization_min_region_count = 0 - colocalization_n_permutations = 10 - colocalization_neighbourhood_size = 1 - - // For now skip the layout step since it is very slow on these - // small test datasets - skip_layout = false - // using this since the default pmds_3d does not work on very small graphs - layout_algorithm = "fruchterman_reingold_3d" -} diff --git a/conf/test_scsp_v1_immunology_v1.config b/conf/test_scsp_v1_immunology_v1.config deleted file mode 100644 index 3dd878c4..00000000 --- a/conf/test_scsp_v1_immunology_v1.config +++ /dev/null @@ -1,46 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running minimal tests -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a fast and simple pipeline test - using the v2 panel. - - Use as follows: - nextflow run nf-core/-profile test_panel_v2, --outdir - ----------------------------------------------------------------------------------------- -*/ - - -process { - resourceLimits = [ - cpus: 4, - memory: '15.GB', - time: '1.h', - ] -} - -params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function with MPX SCSP v1 | Immunology-I data' - - // Input data - input = params.pipelines_testdata_base_path + '/samplesheet/mpx/samplesheet_mpx_scsp_v1_immunology1.csv' - input_basedir = params.pipelines_testdata_base_path - - multiplet_recovery = true - min_size = 1 - max_size = 100000 - dynamic_filter = null - compute_polarization = true - use_full_bipartite = true - colocalization_min_region_count = 0 - colocalization_n_permutations = 10 - colocalization_neighbourhood_size = 1 - - // For now skip the layout step since it is very slow on these - // small test datasets - skip_layout = false - // using this since the default pmds_3d does not work on very small graphs - layout_algorithm = "fruchterman_reingold_3d" -} diff --git a/docs/images/nf-core-pixelator-metromap.svg b/docs/images/nf-core-pixelator-metromap.svg index ecafdf0f..3eb27166 100644 --- a/docs/images/nf-core-pixelator-metromap.svg +++ b/docs/images/nf-core-pixelator-metromap.svg @@ -1,489 +1,373 @@ - + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - + + + + + + - + - - - - - - - - + + + + + + + - - - - - - - - - - - + + - - - - - - + + - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - + + - - + + - - + + - + - - - - - - - - - - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - + + + + + - - + - - + + - + - - - - - + + - - - - - - + + + + + + - - - - - - - - + + + + + + + + - - - - - + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - - - - - + + - - + + - - + + - + - + - - - - - - - + - - + + - - + + - - + + diff --git a/docs/output.md b/docs/output.md index 12b69829..d74ef1c9 100644 --- a/docs/output.md +++ b/docs/output.md @@ -9,13 +9,6 @@ of [`pixelator`](https://github.com/PixelgenTechnologies/pixelator). The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. -The pipeline will create different output files depending on the type of run: - -1. [Molecular Pixelation (MPX)](#molecular-pixelation-mpx) -2. [Proximity Network Assay (PNA)](#proximity-network-assay-pna) - -Please refer to the correct section below, depending on the type of samples you are analyzing. - ## Proximity Network Assay (PNA) ### Pipeline overview @@ -251,317 +244,3 @@ Below is an example output structure for a pipeline run using the default settin - `pbmcs_unstimulated.qc-report.html` - `uropod_control.layout.pxl` - `uropod_control.qc-report.html` - -## Molecular Pixelation (MPX) - -### Pipeline overview - -The MPX pipeline consists of the following steps: - -- [Preprocessing](#Preprocessing) -- [Quality control](#quality-control) -- [Demultiplexing](#demultiplexing) -- [Duplicate removal and error correction](#duplicate-removal-and-error-correction) -- [Compute connected components](#compute-connected-components) -- [Filtering, annotation, cell-calling](#cell-calling-filtering-and-annotation) -- [Downstream analysis](#downstream-analysis) -- [Generate layouts for visualization](#compute-layouts-for-visualization) -- [Generate reports](#generate-reports) -- [Pipeline information](#pipeline-information) - -#### Preprocessing - -The preprocessing step uses `pixelator single-cell-mpx amplicon` to create full-length amplicon sequences from both single-end and paired-end data. -It returns a single FASTQ file per sample containing fixed length amplicons. -This step will also calculate Q30 quality scores for different regions of the library. - -These amplicon FASTQ files are intermediate and by default not placed in the output folder with the final files delivered to users. -Set `--save_amplicon_reads` or `--save_all` to enable publishing of these files to: - -
-Output files - -- `pixelator` - - `amplicon` - - `.merged.fastq.gz`: - Combine R1 and R2 reads into full amplicon reads and calculate Q30 scores for the amplicon regions. - - `.report.json`: Q30 metrics of the amplicon. - - `.meta.json`: Command invocation metadata. - - - `logs` - - `.pixelator-amplicon.log`: pixelator log output. - -
- -#### Quality control - -Quality control is performed using `pixelator single-cell-mpx preqc` and `pixelator single-cell-mpx adapterqc`. - -The preqc step performs QC and quality filtering of the raw sequencing data using [Fastp](https://github.com/OpenGene/fastp) internally. -It generates a QC report in HTML and JSON formats. It saves processed reads as well as reads that were -discarded (i.e. were too short, had too many Ns, or too low quality, etc.). Internally `preqc` - -The `adapterqc` stage checks for the presence and correctness of the pixel binding sequences, -using [Cutadapt](https://cutadapt.readthedocs.io/en/stable/) internally. -It also generates a QC report in JSON format. It saves processed reads as well as discarded reads (i.e. reads that did not have a match for both pixel binding sequences). - -These processed and discarded FASTQ reads are intermediate and by default not placed in the output folder with the final files delivered to users. -Set `--save_qc_passed_reads` and/or `--save_qc_passed_reads` to enable publishing of these files. -Alternatively, set `--save_all` to keep all intermediary outputs of all steps. - -
-Output files - -- `pixelator` - - `preqc` - - `.processed.fastq.gz`: Processed reads. - - `.failed.fastq.gz`: Discarded reads. - - `.report.json`: Fastp json report. - - `.qc-report.html`: Fastp html report. - - `.meta.json`: Command invocation metadata. - - - `adapterqc` - - `.processed.fastq.gz`: Processed reads. - - `.failed.fastq.gz`: Discarded reads. - - `.report.json`: Cutadapt json report. - - `.meta.json`: Command invocation metadata. - - - `logs` - - `.pixelator-preqc.log`: pixelator log output. - -
- -#### Demultiplexing - -The `pixelator single-cell-mpx demux` command assigns each read to a marker (with a certain barcode) file. It also generates QC report in -JSON format. It saves processed reads (one file per antibody) as well as discarded reads (in a different file) with no match to the -given barcodes/antibodies. - -These processed and discarded FASTQ reads are intermediate and by default not placed in the output folder with the final files delivered to users. -Set `--save_demux_failed_reads` and/or `--save_demux_processed_reads` to enable publishing of these files. -Alternatively, set `--save_all` to keep all intermediary outputs of all steps. - -
-Output files - -- `pixelator` - - `demux` - - `.processed-.fastq.gz`: Reads demultiplexed per antibody. - - `.failed.fastq.gz`: Discarded reads that do not match an antibody barcode. - - `.report.json`: Cutadapt json report. - - `.meta.json`: Command invocation metadata. - - - `logs` - - `.pixelator-demultiplex.log`: pixelator log output. - -
- -#### Duplicate removal and error correction - -This step uses the `pixelator single-cell-mpx collapse` command. - -The `collapse` command quantifies molecules by performing error correction and detecting PCR duplicates. -This is achieved using the unique pixel identifier and unique molecular identifier sequences to check for uniqueness, collapse and compute a read count. -The command generates a QC report in JSON format. -Errors are allowed when collapsing reads if `--algorithm` is set to `adjacency` (this is the default option). - -The output format of this command is a parquet file containing deduplicated and error-corrected molecules. - -The collapsed reads are intermediate and by default not placed in the output folder with the final files delivered to users. -Set `--save_collapsed_reads` to enable publishing of these files. -Alternatively, set `--save_all` to keep all intermediary outputs of all steps. - -
-Output files - -- `pixelator` - - `collapse` - - `.collapsed.parquet`: Edge list of the graph. - - `.report.json`: Statistics for the collapse step. - - `.meta.json`: Command invocation metadata. - - - `logs` - - `.pixelator-collapse.log`: pixelator log output. - -
- -#### Compute connected components - -This step uses the `pixelator single-cell-mpx graph` command. -The input is the edge list parquet file generated in the collapse step. -The molecules from edge list are filtered by count (`--graph_min_count`) to form the edges of the connected components of the graph. -When graphs are computed and identified, their ID names are added back to the edge list in a column called "component". - -The graph command has the option to recover components (technical multiplets) into smaller -components using community detection to find and remove problematic edges -(see `--multiplet_recovery`). - -The edge list is intermediate and by default not placed in the output folder with the final files delivered to users. -Set `--save_edgelist` to enable publishing of these file. - -Alternatively, set `--save_all` to keep all intermediary outputs of all steps. - -
-Output files - -- `pixelator` - - `graph` - - `.edgelist.parquet`: - Edge list dataframe after recovering technical multiplets. - - `.components_recovered.csv`: - List of new components recovered (when using `--multiple-recovery`) - - `.meta.json`: Command invocation metadata. - - `.report.json`: Metrics with useful information about the clustering. - - `*.meta.json`: Command invocation metadata. - - - `logs` - - `.pixelator-cluster.log`: pixelator log output. - -
- -#### Cell-calling, filtering, and annotation - -This step uses the `pixelator single-cell-mpx annotate` command. - -The annotate command takes as input the molecule list file generated in the graph command. It parses, and filters the -molecules grouped by "component" ID to find putative cells, and it will generate a PXL file containing the edges of the graphs in an edge list, and an -(AnnData object)[https://anndata.readthedocs.io/en/latest/] as well as some useful metadata. - -Some summary statistics before filtering are stored in `raw_components_metrics.csv.gz`. -This file is not included in the output folder by default, but can be included by passing `--save_raw_component_metrics`. - -By default, the PXL file after annotate will not be saved to the results directory unless `--skip_analysis` and `--skip_layout` is passed. -Set `--save_annotate_dataset` to include these files. - -
-Output files - -- `pixelator` - - `annotate` - - `.annotate.dataset.pxl`: The annotated PXL dataset, - - `.meta.json`: Command invocation metadata. - - `.raw_components_metrics.csv.gz` - - `.report.json`: Statistics for the analysis step. - - - `logs` - - `.pixelator-annotate.log`: pixelator log output. - -
- -### Downstream analysis - -This step uses the `pixelator single-cell-mpx analysis` command. -Downstream analyses are performed on the PXL file generated by the previous stage. -The results of the analysis are added to the PXL file produced in this stage. - -Currently, the following analyses are performed: - -- polarization scores (enable with `--compute_polarization`) -- co-localization scores (enable with `--compute_colocalization`) - -Each analysis can be disabled by using respectively `--compute_polarization false` or `--compute_colocalization false`. -This entire step can also be skipped using the `--skip_analysis` option. - -By default, the PXL file after analysis will not be saved to the results directory unless `--skip_layout` is passed. -Set `--save_analysis_dataset` to include these files. - -Alternatively, set `--save_all` to keep all intermediary outputs of all steps. - -
-Output files - -- `pixelator` - - `analysis` - - `.analysis.dataset.pxl`: PXL file with the analysis results added to it. - - `.meta.json`: Command invocation metadata. - - `.report.json`: Statistics for the analysis step. - - - `logs` - - `.pixelator-analysis.log`: pixelator log output. - -
- -#### Compute layouts for visualization - -This step uses the `pixelator single-cell-mpx layout` command. -It will generate precomputed layouts that can be used to visualize cells -as part of the downstream analysis. This data will be appended to a PXL file. - -This entire step can also be skipped using the `--skip_layout` option. - -Set `--save_all` to keep all intermediary outputs of all steps. - -
-Output files - -- `pixelator` - - `layout` - - `.layout.dataset.pxl`: PXL file with the layout results added to it. - - `.meta.json`: Command invocation metadata. - - `.report.json`: Statistics for the layout step. - - - `logs` - - `.pixelator-layout.log`: pixelator log output. - -
- -#### Generate reports - -This step uses the `pixelator single-cell-mpx report` command. -This step will collect metrics and outputs generated by previous stages -and generate a report in HTML format for each sample. - -This step can be skipped using the `--skip_report` option. - -More information on the report can be found in the [pixelator documentation](https://software.pixelgen.com/pixelator/outputs/qc-report/) - -
-Output files - -- `pixelator` - - `report` - - `_report.html`: Pixelator summary report. - - `logs` - - `.pixelator-report.log`: Pixelator log output. - -
- -#### Pipeline information - -
-Output files - -- `pipeline_info/` - - Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - - Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. - - Metadata file with software versions, environment information and pipeline configuration for debugging: `metadata.json` - - Parameters used by the pipeline run: `params.json`. - -
- -[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. - -### Output directory structure - -With default parameters, the pixelator pipeline output directory will only include the latest PXL file -generated by the pipeline (with the most "complete" information) and an interactive HTML report per sample. -The PXL dataset files can be from either the `annotate`, `analysis` or `layout` step. - -With default parameters, the `.layout.datasets.pxl` will be copied to the output directory. -If the `layout` stage is skipped (using `--skip_layout`) the `.analysis.datasets.pxl` files will be included and -if the `analysis` stage is skipped (using `--skip_analysis`) the `.annotate.datasets.pxl` will be copied. - -Various flags are available to store intermediate files and are described in the input parameter documentation. Alternatively, you can keep all intermediate files using `--save_all`. - -Below is an example output structure for a pipeline run using the default settings. - -- `pipeline_info/` -- `pixelator/` - - `logs/` - - `/`: - - `*.log` - - - `pbmcs_unstimulated.layout.dataset.pxl` - - `pbmcs_unstimulated.qc-report.html` - - `uropod_control.layout.dataset.pxl` - - `uropod_control.qc-report.html` diff --git a/docs/usage.md b/docs/usage.md index ae54c1db..1c1e05c2 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -15,7 +15,7 @@ Use this parameter to specify its location. --input '[path to samplesheet file]' ``` -We provide example samplesheets for [MPX data](../assets/samplesheet_mpx.csv) and for [PNA data](../assets/samplesheet_pna.csv), +We provide an example samplesheet for [PNA data](../assets/samplesheet_pna.csv), that can be used as a template to create your own samplesheet. ### Format @@ -114,12 +114,9 @@ The `design` column specifies the name of the pixelator assay design configurati A list of available designs can be listed by running following command: ```shell -pixelator single-cell-mpx --list-designs pixelator single-cell-pna --list-designs ``` -Currently, a single design is available for MPX (`D21`) and one for PNA (`pna-2`). - ### Panels The panel file contains all information used to link antibodies barcodes to their respective targets. @@ -134,21 +131,9 @@ Every sample should have either `panel` or `panel_file` specified. A list of available panels can be listed by running following command: ```shell -pixelator single-cell-mpx --list-panels pixelator single-cell-pna --list-panels ``` -Currently, two built-in panels are available for MPX: - -- `human-sc-immunology-spatial-proteomics-1` -- `human-sc-immunology-spatial-proteomics-2` - -And three for PNA: - -- `proxiome-immuno-155` -- `proxiome-immuno-156-FMC63` -- `proxiome-immuno-156-FLAG` - ## Running the pipeline The typical command for running the pipeline is as follows: diff --git a/modules.json b/modules.json index f03826d2..526f0b40 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "cat/fastq": { "branch": "master", - "git_sha": "f4743b089085121497b7c1c81a28810ce2740dde", + "git_sha": "5d28ea7cfaebcfae6f74d1067ea766d8ff19dff3", "installed_by": ["modules"] } } @@ -26,7 +26,7 @@ }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "ff506dcada6fc826ed0c641dc2ed1e98f7345fbe", + "git_sha": "fdc08b8b1ae74f56686ce21f7ea11ad11990ce57", "installed_by": ["subworkflows"] } } diff --git a/modules/local/pixelator/list_options/main.nf b/modules/local/pixelator/list_options/main.nf index ee086236..b3945806 100644 --- a/modules/local/pixelator/list_options/main.nf +++ b/modules/local/pixelator/list_options/main.nf @@ -21,9 +21,6 @@ process PIXELATOR_LIST_OPTIONS { def args2 = task.ext.args2 ?: '' """ - pixelator single-cell-mpx --list-designs ${args} > design_options.txt - pixelator single-cell-mpx --list-panels ${args2} > panel_options.txt - pixelator single-cell-pna --list-designs ${args} >> design_options.txt pixelator single-cell-pna --list-panels ${args2} >> panel_options.txt """ @@ -31,14 +28,10 @@ process PIXELATOR_LIST_OPTIONS { stub: """ cat <<-END_DESIGN > design_options.txt - D21 pna-2 END_DESIGN cat <<-END_PANELS > panel_options.txt - human-sc-immunology-spatial-proteomics-1 - human-sc-immunology-spatial-proteomics-2 - human-sc-immunology-spatial-proteomics proxiome-immuno-155-v2 END_PANELS """ diff --git a/modules/local/pixelator/single-cell-mpx/amplicon/environment.yml b/modules/local/pixelator/single-cell-mpx/amplicon/environment.yml deleted file mode 100644 index 21a756c8..00000000 --- a/modules/local/pixelator/single-cell-mpx/amplicon/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::pixelator=0.19.0 diff --git a/modules/local/pixelator/single-cell-mpx/amplicon/main.nf b/modules/local/pixelator/single-cell-mpx/amplicon/main.nf deleted file mode 100644 index d6e0f7c3..00000000 --- a/modules/local/pixelator/single-cell-mpx/amplicon/main.nf +++ /dev/null @@ -1,72 +0,0 @@ -process PIXELATOR_AMPLICON { - tag "${meta.id}" - label 'process_low' - label 'process_long' - - // TODO: Add conda back - // conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'quay.io/pixelgen-technologies/pixelator:0.23.0' - : 'quay.io/pixelgen-technologies/pixelator:0.23.0'}" - - input: - tuple val(meta), path(reads) - - output: - tuple val(meta), path("amplicon/*.merged.{fq,fastq}.gz"), emit: merged - tuple val(meta), path("amplicon/*.report.json"), emit: report_json - tuple val(meta), path("amplicon/*.meta.json"), emit: metadata - tuple val(meta), path("*pixelator-amplicon.log"), emit: log - - tuple val("${task.process}"), val('pixelator'), eval("pixelator --version 2>/dev/null | sed 's/pixelator, version //g'"), emit: versions_pixelator, topic: versions - - when: - task.ext.when == null || task.ext.when - - script: - def prefix = task.ext.prefix ?: "${meta.id}" - def args = task.ext.args ?: '' - - // Make list of old name and new name pairs to use for renaming - // Use R1/R2 style suffixes for limited backward compatibility with pixelator<0.17 - def old_new_pairs = reads instanceof Path || reads.size() == 1 - ? [[reads, "${prefix}${getFileSuffix(reads)}"]] - : reads.withIndex().collect { entry, index -> [entry, "${prefix}_R${index + 1}${getFileSuffix(entry)}"] } - - def rename_to = old_new_pairs*.join(' ').join(' ') - def renamed_reads = old_new_pairs.collect { old_name, new_name -> new_name }.join(' ') - - """ - printf "%s %s\\n" ${rename_to} | while read old_name new_name; do - [ -f "\${new_name}" ] || ln -s \$old_name \$new_name - done - - pixelator \\ - --cores ${task.cpus} \\ - --log-file ${prefix}.pixelator-amplicon.log \\ - --verbose \\ - single-cell-mpx \\ - amplicon \\ - --output . \\ - ${args} \\ - ${renamed_reads} - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - mkdir amplicon - touch "${prefix}.pixelator-amplicon.log" - echo "" | gzip >> amplicon/${prefix}.merged.fq.gz - touch amplicon/${prefix}.report.json - touch amplicon/${prefix}.meta.json - """ -} - - -// for .gz files also include the second to last extension if it is present. E.g., .fasta.gz -// Source: nf-core/modules/cat/cat -def getFileSuffix(filename) { - def match = filename =~ /^.*?((\.\w{1,5})?(\.\w{1,5}\.gz$))/ - return match ? match[0][1] : filename.substring(filename.lastIndexOf('.')) -} diff --git a/modules/local/pixelator/single-cell-mpx/amplicon/tests/main.nf.test b/modules/local/pixelator/single-cell-mpx/amplicon/tests/main.nf.test deleted file mode 100644 index 95f33f7f..00000000 --- a/modules/local/pixelator/single-cell-mpx/amplicon/tests/main.nf.test +++ /dev/null @@ -1,74 +0,0 @@ -nextflow_process { - - name "Test Process PIXELATOR_AMPLICON" - script "../main.nf" - process "PIXELATOR_AMPLICON" - tag "modules" - tag "pixelator" - tag "pixelator/mpx" - tag "pixelator/single_cell_mpx_amplicon" - - - test("Test MPX amplicon - stub") { - - options "-stub" - - when { - params { - save_all = true - } - process { - """ - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/fastq/v1/sample01_1k_pbmcs_scsp_v1_immunology1_R1.fastq.gz', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/fastq/v1/sample01_1k_pbmcs_scsp_v1_immunology1_R2.fastq.gz', checkIfExists: true) - ] - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("Test MPX amplicon - SCSP v1 | Immunology-I") { - when { - params { - save_all = true - outdir = "$outputDir" - } - process { - """ - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/fastq/v1/sample01_1k_pbmcs_scsp_v1_immunology1_R1.fastq.gz', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/fastq/v1/sample01_1k_pbmcs_scsp_v1_immunology1_R2.fastq.gz', checkIfExists: true) - ] - ] - """ - } - } - - then { - def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) - assertAll( - { assert workflow.success }, - { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), - // All stable path name, with a relative path - stable_name, - process.out.versions_pixelator, - ).match() } - ) - } - } -} diff --git a/modules/local/pixelator/single-cell-mpx/amplicon/tests/main.nf.test.snap b/modules/local/pixelator/single-cell-mpx/amplicon/tests/main.nf.test.snap deleted file mode 100644 index 7b3e6f17..00000000 --- a/modules/local/pixelator/single-cell-mpx/amplicon/tests/main.nf.test.snap +++ /dev/null @@ -1,142 +0,0 @@ -{ - "Test MPX amplicon - SCSP v1 | Immunology-I": { - "content": [ - 1, - [ - "pixelator", - "pixelator/amplicon", - "pixelator/amplicon/sample01_1k_pbmcs_scsp_v1_immunology1.merged.fastq.gz", - "pixelator/amplicon/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json", - "pixelator/amplicon/sample01_1k_pbmcs_scsp_v1_immunology1.report.json", - "pixelator/logs", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1/sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-amplicon.log" - ], - [ - [ - "PIXELATOR_AMPLICON", - "pixelator", - "0.23.0" - ] - ] - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T13:57:45.470938153" - }, - "Test MPX amplicon - stub": { - "content": [ - { - "0": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.merged.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "1": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-amplicon.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "4": [ - [ - "PIXELATOR_AMPLICON", - "pixelator", - "0.23.0" - ] - ], - "log": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-amplicon.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "merged": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.merged.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "metadata": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "report_json": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_pixelator": [ - [ - "PIXELATOR_AMPLICON", - "pixelator", - "0.23.0" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T13:57:19.192368769" - } -} \ No newline at end of file diff --git a/modules/local/pixelator/single-cell-mpx/analysis/environment.yml b/modules/local/pixelator/single-cell-mpx/analysis/environment.yml deleted file mode 100644 index 21a756c8..00000000 --- a/modules/local/pixelator/single-cell-mpx/analysis/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::pixelator=0.19.0 diff --git a/modules/local/pixelator/single-cell-mpx/analysis/main.nf b/modules/local/pixelator/single-cell-mpx/analysis/main.nf deleted file mode 100644 index 198816d5..00000000 --- a/modules/local/pixelator/single-cell-mpx/analysis/main.nf +++ /dev/null @@ -1,52 +0,0 @@ -process PIXELATOR_ANALYSIS { - tag "${meta.id}" - label 'process_medium' - - // TODO: Add conda back - // conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'quay.io/pixelgen-technologies/pixelator:0.23.0' - : 'quay.io/pixelgen-technologies/pixelator:0.23.0'}" - - input: - tuple val(meta), path(data) - - output: - tuple val(meta), path("analysis/*dataset.pxl"), emit: dataset - tuple val(meta), path("analysis/*report.json"), emit: report_json - tuple val(meta), path("analysis/*.meta.json"), emit: metadata - tuple val(meta), path("analysis/*"), emit: all_results - tuple val(meta), path("*pixelator-analysis.log"), emit: log - - tuple val("${task.process}"), val('pixelator'), eval("pixelator --version 2>/dev/null | sed 's/pixelator, version //g'"), emit: versions_pixelator, topic: versions - - when: - task.ext.when == null || task.ext.when - - script: - def prefix = task.ext.prefix ?: "${meta.id}" - def args = task.ext.args ?: '' - - """ - pixelator \\ - --cores ${task.cpus} \\ - --log-file ${prefix}.pixelator-analysis.log \\ - --verbose \\ - single-cell-mpx \\ - analysis \\ - --output . \\ - ${args} \\ - ${data} - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - - """ - mkdir analysis - touch "${prefix}.pixelator-analysis.log" - touch "analysis/${prefix}.dataset.pxl" - touch "analysis/${prefix}.report.json" - touch "analysis/${prefix}.meta.json" - """ -} diff --git a/modules/local/pixelator/single-cell-mpx/analysis/tests/main.nf.test b/modules/local/pixelator/single-cell-mpx/analysis/tests/main.nf.test deleted file mode 100644 index d43514df..00000000 --- a/modules/local/pixelator/single-cell-mpx/analysis/tests/main.nf.test +++ /dev/null @@ -1,65 +0,0 @@ -nextflow_process { - - name "Test Process PIXELATOR_ANALYSIS" - script "../main.nf" - process "PIXELATOR_ANALYSIS" - tag "modules" - tag "pixelator" - tag "pixelator/mpx" - tag "pixelator/single_cell_mpx_analysis" - - - test("Test MPX analysis - stub") { - - options "-stub" - - when { - process { - """ - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.annotate.dataset.pxl', checkIfExists: true) - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("Test MPX analysis - SCSP v1 | Immunology-I") { - when { - params { - save_all = true - outdir = "$outputDir" - } - process { - """ - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.annotate.dataset.pxl', checkIfExists: true) - ] - """ - } - } - - then { - def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) - assertAll( - { assert workflow.success }, - { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), - // All stable path name, with a relative path - stable_name, - process.out.versions_pixelator, - ).match() } - ) - } - } -} diff --git a/modules/local/pixelator/single-cell-mpx/analysis/tests/main.nf.test.snap b/modules/local/pixelator/single-cell-mpx/analysis/tests/main.nf.test.snap deleted file mode 100644 index dca17e1e..00000000 --- a/modules/local/pixelator/single-cell-mpx/analysis/tests/main.nf.test.snap +++ /dev/null @@ -1,172 +0,0 @@ -{ - "Test MPX analysis - SCSP v1 | Immunology-I": { - "content": [ - 1, - [ - "pixelator", - "pixelator/analysis", - "pixelator/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.analysis.dataset.pxl", - "pixelator/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json", - "pixelator/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.report.json", - "pixelator/logs", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1/sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-analysis.log" - ], - [ - [ - "PIXELATOR_ANALYSIS", - "pixelator", - "0.23.0" - ] - ] - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T13:59:07.122504291" - }, - "Test MPX analysis - stub": { - "content": [ - { - "0": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.dataset.pxl:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.dataset.pxl:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "4": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-analysis.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "5": [ - [ - "PIXELATOR_ANALYSIS", - "pixelator", - "0.23.0" - ] - ], - "all_results": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.dataset.pxl:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "dataset": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.dataset.pxl:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "log": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-analysis.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "metadata": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "report_json": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_pixelator": [ - [ - "PIXELATOR_ANALYSIS", - "pixelator", - "0.23.0" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T13:57:59.957741675" - } -} \ No newline at end of file diff --git a/modules/local/pixelator/single-cell-mpx/annotate/environment.yml b/modules/local/pixelator/single-cell-mpx/annotate/environment.yml deleted file mode 100644 index 21a756c8..00000000 --- a/modules/local/pixelator/single-cell-mpx/annotate/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::pixelator=0.19.0 diff --git a/modules/local/pixelator/single-cell-mpx/annotate/main.nf b/modules/local/pixelator/single-cell-mpx/annotate/main.nf deleted file mode 100644 index 2ffeec4c..00000000 --- a/modules/local/pixelator/single-cell-mpx/annotate/main.nf +++ /dev/null @@ -1,58 +0,0 @@ -process PIXELATOR_ANNOTATE { - tag "${meta.id}" - label 'process_high' - - // TODO: Add conda back - // conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'quay.io/pixelgen-technologies/pixelator:0.23.0' - : 'quay.io/pixelgen-technologies/pixelator:0.23.0'}" - - input: - tuple val(meta), path(dataset), path(panel_file), val(panel) - - output: - tuple val(meta), path("annotate/*.dataset.pxl"), emit: dataset - tuple val(meta), path("annotate/*.report.json"), emit: report_json - tuple val(meta), path("annotate/*.meta.json"), emit: metadata - tuple val(meta), path("annotate/*"), emit: all_results - tuple val(meta), path("*pixelator-annotate.log"), emit: log - - tuple val("${task.process}"), val('pixelator'), eval("pixelator --version 2>/dev/null | sed 's/pixelator, version //g'"), emit: versions_pixelator, topic: versions - - when: - task.ext.when == null || task.ext.when - - script: - def prefix = task.ext.prefix ?: "${meta.id}" - def args = task.ext.args ?: '' - def panelOpt = (panel - ? "--panel ${panel}" - : panel_file - ? "--panel ${panel_file}" - : "") - - """ - pixelator \\ - --cores ${task.cpus} \\ - --log-file ${prefix}.pixelator-annotate.log \\ - --verbose \\ - single-cell-mpx \\ - annotate \\ - --output . \\ - ${panelOpt} \\ - ${args} \\ - ${dataset} \\ - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - - """ - mkdir annotate - touch "${prefix}.pixelator-annotate.log" - touch "annotate/${prefix}.dataset.pxl" - touch "annotate/${prefix}.report.json" - touch "annotate/${prefix}.meta.json" - """ -} diff --git a/modules/local/pixelator/single-cell-mpx/annotate/tests/main.nf.test b/modules/local/pixelator/single-cell-mpx/annotate/tests/main.nf.test deleted file mode 100644 index fee34173..00000000 --- a/modules/local/pixelator/single-cell-mpx/annotate/tests/main.nf.test +++ /dev/null @@ -1,72 +0,0 @@ -nextflow_process { - - name "Test Process PIXELATOR_ANNOTATE" - script "../main.nf" - process "PIXELATOR_ANNOTATE" - tag "modules" - tag "pixelator" - tag "pixelator/mpx" - tag "pixelator/single_cell_mpx_annotate" - - - test("Test MPX annotate - stub") { - - options "-stub" - - when { - process { - """ - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/graph/sample01_1k_pbmcs_scsp_v1_immunology1.edgelist.parquet', checkIfExists: true), - [], - "human-sc-immunology-spatial-proteomics-1" - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() }, - - ) - } - } - - test("Test MPX annotate - SCSP v1 | Immunology-I") { - options "--save_all" - - when { - params { - save_all = true - outdir = "$outputDir" - } - process { - """ - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/graph/sample01_1k_pbmcs_scsp_v1_immunology1.edgelist.parquet', checkIfExists: true), - [], - "human-sc-immunology-spatial-proteomics-1" - ] - """ - } - } - - then { - def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) - assertAll( - { assert workflow.success }, - { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), - // All stable path name, with a relative path - stable_name, - process.out.versions_pixelator, - ).match() } - ) - } - } -} diff --git a/modules/local/pixelator/single-cell-mpx/annotate/tests/main.nf.test.snap b/modules/local/pixelator/single-cell-mpx/annotate/tests/main.nf.test.snap deleted file mode 100644 index c6431994..00000000 --- a/modules/local/pixelator/single-cell-mpx/annotate/tests/main.nf.test.snap +++ /dev/null @@ -1,172 +0,0 @@ -{ - "Test MPX annotate - SCSP v1 | Immunology-I": { - "content": [ - 1, - [ - "pixelator", - "pixelator/annotate", - "pixelator/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.annotate.dataset.pxl", - "pixelator/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json", - "pixelator/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.report.json", - "pixelator/logs", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1/sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-annotate.log" - ], - [ - [ - "PIXELATOR_ANNOTATE", - "pixelator", - "0.23.0" - ] - ] - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T14:00:18.248269201" - }, - "Test MPX annotate - stub": { - "content": [ - { - "0": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.dataset.pxl:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.dataset.pxl:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "4": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-annotate.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "5": [ - [ - "PIXELATOR_ANNOTATE", - "pixelator", - "0.23.0" - ] - ], - "all_results": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.dataset.pxl:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "dataset": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.dataset.pxl:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "log": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-annotate.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "metadata": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "report_json": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_pixelator": [ - [ - "PIXELATOR_ANNOTATE", - "pixelator", - "0.23.0" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T13:59:23.959912816" - } -} \ No newline at end of file diff --git a/modules/local/pixelator/single-cell-mpx/collapse/environment.yml b/modules/local/pixelator/single-cell-mpx/collapse/environment.yml deleted file mode 100644 index 21a756c8..00000000 --- a/modules/local/pixelator/single-cell-mpx/collapse/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::pixelator=0.19.0 diff --git a/modules/local/pixelator/single-cell-mpx/collapse/main.nf b/modules/local/pixelator/single-cell-mpx/collapse/main.nf deleted file mode 100644 index 14c5135b..00000000 --- a/modules/local/pixelator/single-cell-mpx/collapse/main.nf +++ /dev/null @@ -1,62 +0,0 @@ -process PIXELATOR_COLLAPSE { - tag "${meta.id}" - label 'process_medium' - label 'process_long' - - // TODO: Add conda back - // conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'quay.io/pixelgen-technologies/pixelator:0.23.0' - : 'quay.io/pixelgen-technologies/pixelator:0.23.0'}" - - input: - tuple val(meta), path(reads), path(panel_file), val(panel) - - output: - tuple val(meta), path("collapse/*.collapsed.parquet"), emit: collapsed - tuple val(meta), path("collapse/*.report.json"), emit: report_json - tuple val(meta), path("collapse/*.meta.json"), emit: metadata - tuple val(meta), path("*pixelator-collapse.log"), emit: log - - tuple val("${task.process}"), val('pixelator'), eval("pixelator --version 2>/dev/null | sed 's/pixelator, version //g'"), emit: versions_pixelator, topic: versions - - when: - task.ext.when == null || task.ext.when - - script: - assert meta.design != null - - def prefix = task.ext.prefix ?: "${meta.id}" - def args = task.ext.args ?: '' - def reads_arg = reads.join(' ') - def panel_opt = (panel - ? "--panel ${panel}" - : panel_file - ? "--panel ${panel_file}" - : "") - - """ - pixelator \\ - --cores ${task.cpus} \\ - --log-file ${prefix}.pixelator-collapse.log \\ - --verbose \\ - single-cell-mpx \\ - collapse \\ - --output . \\ - --design ${meta.design} \\ - ${panel_opt} \\ - ${args} \\ - ${reads_arg} - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - - """ - mkdir collapse - touch "${prefix}.pixelator-collapse.log" - touch "collapse/${prefix}.collapsed.parquet" - touch "collapse/${prefix}.report.json" - touch "collapse/${prefix}.meta.json" - """ -} diff --git a/modules/local/pixelator/single-cell-mpx/collapse/tests/main.nf.test b/modules/local/pixelator/single-cell-mpx/collapse/tests/main.nf.test deleted file mode 100644 index 158df014..00000000 --- a/modules/local/pixelator/single-cell-mpx/collapse/tests/main.nf.test +++ /dev/null @@ -1,84 +0,0 @@ -nextflow_process { - name "Test Process PIXELATOR_COLLAPSE" - script "../main.nf" - process "PIXELATOR_COLLAPSE" - tag "modules" - tag "pixelator" - tag "pixelator/mpx" - tag "pixelator/single_cell_mpx_collapse" - - - test("Test MPX collapse - stub") { - - options "-stub" - - when { - process { - """ - demuxed_input = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AAAGCAAC.fastq.gz', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AACAAGAC.fastq.gz', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AACCTTCC.fastq.gz', checkIfExists: true) - ] - - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel: "human-sc-immunology-spatial-proteomics-1", technology:'mpx' ], - demuxed_input, - [], - "human-sc-immunology-spatial-proteomics-1" - ] - input.dump() - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - - test("Test MPX collapse - - SCSP v1 | Immunology-I") { - when { - params { - save_all = true - outdir = "$outputDir" - } - process { - """ - demuxed_input = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AAAGCAAC.fastq.gz', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AACAAGAC.fastq.gz', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AACCTTCC.fastq.gz', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AACGGCTA.fastq.gz', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AAGCATAG.fastq.gz', checkIfExists: true), - ] - - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel: "human-sc-immunology-spatial-proteomics-1", technology:'mpx' ], - demuxed_input, - [], - "human-sc-immunology-spatial-proteomics-1" - ] - """ - } - } - - then { - def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) - assertAll( - { assert workflow.success }, - { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), - // All stable path name, with a relative path - stable_name, - process.out.versions_pixelator, - ).match() } - ) - } - } -} diff --git a/modules/local/pixelator/single-cell-mpx/collapse/tests/main.nf.test.snap b/modules/local/pixelator/single-cell-mpx/collapse/tests/main.nf.test.snap deleted file mode 100644 index 631ec14e..00000000 --- a/modules/local/pixelator/single-cell-mpx/collapse/tests/main.nf.test.snap +++ /dev/null @@ -1,142 +0,0 @@ -{ - "Test MPX collapse - - SCSP v1 | Immunology-I": { - "content": [ - 1, - [ - "pixelator", - "pixelator/collapse", - "pixelator/collapse/sample01_1k_pbmcs_scsp_v1_immunology1.collapsed.parquet", - "pixelator/collapse/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json", - "pixelator/collapse/sample01_1k_pbmcs_scsp_v1_immunology1.report.json", - "pixelator/logs", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1/sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-collapse.log" - ], - [ - [ - "PIXELATOR_COLLAPSE", - "pixelator", - "0.23.0" - ] - ] - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T14:01:06.452863376" - }, - "Test MPX collapse - stub": { - "content": [ - { - "0": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.collapsed.parquet:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-collapse.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "4": [ - [ - "PIXELATOR_COLLAPSE", - "pixelator", - "0.23.0" - ] - ], - "collapsed": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.collapsed.parquet:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "log": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-collapse.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "metadata": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "report_json": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_pixelator": [ - [ - "PIXELATOR_COLLAPSE", - "pixelator", - "0.23.0" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T14:00:36.097828773" - } -} \ No newline at end of file diff --git a/modules/local/pixelator/single-cell-mpx/demux/environment.yml b/modules/local/pixelator/single-cell-mpx/demux/environment.yml deleted file mode 100644 index 21a756c8..00000000 --- a/modules/local/pixelator/single-cell-mpx/demux/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::pixelator=0.19.0 diff --git a/modules/local/pixelator/single-cell-mpx/demux/main.nf b/modules/local/pixelator/single-cell-mpx/demux/main.nf deleted file mode 100644 index a1c4ab67..00000000 --- a/modules/local/pixelator/single-cell-mpx/demux/main.nf +++ /dev/null @@ -1,61 +0,0 @@ -process PIXELATOR_DEMUX { - tag "${meta.id}" - label 'process_medium' - - // TODO: Add conda back - // conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'quay.io/pixelgen-technologies/pixelator:0.23.0' - : 'quay.io/pixelgen-technologies/pixelator:0.23.0'}" - - input: - tuple val(meta), path(reads), path(panel_file), val(panel) - - output: - tuple val(meta), path("demux/*processed*.{fq,fastq}.gz"), emit: processed - tuple val(meta), path("demux/*failed.{fq,fastq}.gz"), emit: failed - tuple val(meta), path("demux/*.report.json"), emit: report_json - tuple val(meta), path("demux/*.meta.json"), emit: metadata - tuple val(meta), path("*pixelator-demux.log"), emit: log - - tuple val("${task.process}"), val('pixelator'), eval("pixelator --version 2>/dev/null | sed 's/pixelator, version //g'"), emit: versions_pixelator, topic: versions - - when: - task.ext.when == null || task.ext.when - - script: - // --design is passed in meta and added to args through modules.conf - - def prefix = task.ext.prefix ?: "${meta.id}" - def args = task.ext.args ?: '' - def panelOpt = (panel - ? "--panel ${panel}" - : panel_file - ? "--panel ${panel_file}" - : "") - - """ - pixelator \\ - --cores ${task.cpus} \\ - --log-file ${prefix}.pixelator-demux.log \\ - --verbose \\ - single-cell-mpx \\ - demux \\ - --output . \\ - ${panelOpt} \\ - ${args} \\ - ${reads} - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - - """ - mkdir demux - touch "${prefix}.pixelator-demux.log" - touch "demux/${prefix}.report.json" - touch "demux/${prefix}.meta.json" - echo "" | gzip >> "demux/${prefix}.processed.fq.gz" - echo "" | gzip >> "demux/${prefix}.failed.fq.gz" - """ -} diff --git a/modules/local/pixelator/single-cell-mpx/demux/tests/main.nf.test b/modules/local/pixelator/single-cell-mpx/demux/tests/main.nf.test deleted file mode 100644 index 1796584d..00000000 --- a/modules/local/pixelator/single-cell-mpx/demux/tests/main.nf.test +++ /dev/null @@ -1,69 +0,0 @@ -nextflow_process { - - name "Test Process PIXELATOR_DEMUX" - script "../main.nf" - process "PIXELATOR_DEMUX" - tag "modules" - tag "pixelator" - tag "pixelator/mpx" - tag "pixelator/single_cell_mpx_demux" - - - test("Test MPX demux - stub") { - - options "-stub" - - when { - process { - """ - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/adapterqc/sample01_1k_pbmcs_scsp_v1_immunology1.processed.fastq.gz', checkIfExists: true), - [], - "human-sc-immunology-spatial-proteomics-1" - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("Test MPX demux - SCSP v1 | Immunology-I") { - when { - params { - save_all = true - outdir = "$outputDir" - } - process { - """ - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/adapterqc/sample01_1k_pbmcs_scsp_v1_immunology1.processed.fastq.gz', checkIfExists: true), - [], - "human-sc-immunology-spatial-proteomics-1" - ] - """ - } - } - - then { - def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) - assertAll( - { assert workflow.success }, - { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), - // All stable path name, with a relative path - stable_name, - process.out.versions_pixelator, - ).match() } - ) - } - } -} diff --git a/modules/local/pixelator/single-cell-mpx/demux/tests/main.nf.test.snap b/modules/local/pixelator/single-cell-mpx/demux/tests/main.nf.test.snap deleted file mode 100644 index 5b6eecf0..00000000 --- a/modules/local/pixelator/single-cell-mpx/demux/tests/main.nf.test.snap +++ /dev/null @@ -1,244 +0,0 @@ -{ - "Test MPX demux - stub": { - "content": [ - { - "0": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.processed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "1": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.failed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "2": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "4": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-demux.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "5": [ - [ - "PIXELATOR_DEMUX", - "pixelator", - "0.23.0" - ] - ], - "failed": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.failed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "log": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-demux.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "metadata": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "processed": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.processed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "report_json": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_pixelator": [ - [ - "PIXELATOR_DEMUX", - "pixelator", - "0.23.0" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T14:01:24.471171823" - }, - "Test MPX demux - SCSP v1 | Immunology-I": { - "content": [ - 1, - [ - "pixelator", - "pixelator/demux", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.failed.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AAAGCAAC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AACAAGAC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AACCTTCC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AACGGCTA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AAGCATAG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AAGTAGCT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AAGTCGTG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-ACATTGAC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-ACCAGTAC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-ACCTTGTG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-ACTCGGAA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-ACTCTCAC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-ACTGTGTC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AGAGGCTC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AGCCCGAA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AGCTACTA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AGGATGTT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AGGGCAGT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-AGTTATCG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-ATAGGGGA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-ATGACTGC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-ATTCGCCT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-ATTGGCAC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-ATTTCGAG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CAATCGGC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CACACGGT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CACGTTTC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CAGATCCG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CAGTCAGT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CATGGGCA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CCAGACAC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CCAGCATG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CCGATATC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CCTAAGAA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CTACGACG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CTACTCGC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CTCAAGAG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CTCAGATG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CTGACCAT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CTGTAGGA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CTTCTTGA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-CTTGCACC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GAAAGTCA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GAATCCCG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GACCACTC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GACTGGGA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GAGGTTAG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GATAGGGT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GATTGTGC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GCACTTAG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GCATTCTG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GCCGGACG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GCGCAACT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GCTATTGA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GCTGAACC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GGAGCCAA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GGTTTACC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GTAGGACC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GTATCGGT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GTCTTTGT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GTGAGTAG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GTGCATTC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GTTCAGAC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-GTTGTCCG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TACTCTTG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TATCCCTT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TCAACGCT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TCAGGGTG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TCCCAGTG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TCCCTTGC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TCCGTAAC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TCGTAACG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TCTGCTCC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TGATAGAA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TGCATGTC.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TGGGGCTT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TTCTGGGT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TTGTCCAA.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TTTCTGGT.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.processed-TTTGGAAG.fastq.gz", - "pixelator/demux/sample01_1k_pbmcs_scsp_v1_immunology1.report.json", - "pixelator/logs", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1/sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-demux.log" - ], - [ - [ - "PIXELATOR_DEMUX", - "pixelator", - "0.23.0" - ] - ] - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T14:01:53.324974355" - } -} \ No newline at end of file diff --git a/modules/local/pixelator/single-cell-mpx/graph/environment.yml b/modules/local/pixelator/single-cell-mpx/graph/environment.yml deleted file mode 100644 index 21a756c8..00000000 --- a/modules/local/pixelator/single-cell-mpx/graph/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::pixelator=0.19.0 diff --git a/modules/local/pixelator/single-cell-mpx/graph/main.nf b/modules/local/pixelator/single-cell-mpx/graph/main.nf deleted file mode 100644 index 8bed8008..00000000 --- a/modules/local/pixelator/single-cell-mpx/graph/main.nf +++ /dev/null @@ -1,53 +0,0 @@ -process PIXELATOR_GRAPH { - tag "${meta.id}" - label 'process_high' - - // TODO: Add conda back - // conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'quay.io/pixelgen-technologies/pixelator:0.23.0' - : 'quay.io/pixelgen-technologies/pixelator:0.23.0'}" - - input: - tuple val(meta), path(edge_list) - - output: - tuple val(meta), path("graph/*.edgelist.parquet"), emit: edgelist - tuple val(meta), path("graph/*.report.json"), emit: report_json - tuple val(meta), path("graph/*.meta.json"), emit: metadata - tuple val(meta), path("graph/*"), emit: all_results - tuple val(meta), path("*pixelator-graph.log"), emit: log - - tuple val("${task.process}"), val('pixelator'), eval("pixelator --version 2>/dev/null | sed 's/pixelator, version //g'"), emit: versions_pixelator, topic: versions - - when: - task.ext.when == null || task.ext.when - - script: - - def prefix = task.ext.prefix ?: "${meta.id}" - def args = task.ext.args ?: '' - - """ - pixelator \\ - --cores ${task.cpus} \\ - --log-file ${prefix}.pixelator-graph.log \\ - --verbose \\ - single-cell-mpx \\ - graph \\ - --output . \\ - ${args} \\ - ${edge_list} - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - - """ - mkdir graph - touch "${prefix}.pixelator-graph.log" - touch "graph/${prefix}.edgelist.parquet" - touch "graph/${prefix}.report.json" - touch "graph/${prefix}.meta.json" - """ -} diff --git a/modules/local/pixelator/single-cell-mpx/graph/tests/main.nf.test b/modules/local/pixelator/single-cell-mpx/graph/tests/main.nf.test deleted file mode 100644 index 1e1e0519..00000000 --- a/modules/local/pixelator/single-cell-mpx/graph/tests/main.nf.test +++ /dev/null @@ -1,67 +0,0 @@ -nextflow_process { - - name "Test Process PIXELATOR_GRAPH" - script "../main.nf" - process "PIXELATOR_GRAPH" - tag "modules" - tag "pixelator" - tag "pixelator/mpx" - tag "pixelator/single_cell_mpx_graph" - - - test("Test MPX graph - stub") { - - options "-stub" - - when { - process { - """ - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/collapse/sample01_1k_pbmcs_scsp_v1_immunology1.collapsed.parquet', checkIfExists: true) - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() }, - - ) - } - } - - test("Test MPX graph - SCSP v1 | Immunology-I") { - - when { - params { - save_all = true - outdir = "$outputDir" - } - process { - """ - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/collapse/sample01_1k_pbmcs_scsp_v1_immunology1.collapsed.parquet', checkIfExists: true) - ] - """ - } - } - - then { - def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) - assertAll( - { assert workflow.success }, - { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), - // All stable path name, with a relative path - stable_name, - process.out.versions_pixelator, - ).match() } - ) - } - } -} diff --git a/modules/local/pixelator/single-cell-mpx/graph/tests/main.nf.test.snap b/modules/local/pixelator/single-cell-mpx/graph/tests/main.nf.test.snap deleted file mode 100644 index a92d9bdd..00000000 --- a/modules/local/pixelator/single-cell-mpx/graph/tests/main.nf.test.snap +++ /dev/null @@ -1,173 +0,0 @@ -{ - "Test MPX graph - SCSP v1 | Immunology-I": { - "content": [ - 1, - [ - "pixelator", - "pixelator/graph", - "pixelator/graph/sample01_1k_pbmcs_scsp_v1_immunology1.discarded_edgelist.parquet", - "pixelator/graph/sample01_1k_pbmcs_scsp_v1_immunology1.edgelist.parquet", - "pixelator/graph/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json", - "pixelator/graph/sample01_1k_pbmcs_scsp_v1_immunology1.report.json", - "pixelator/logs", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1/sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-graph.log" - ], - [ - [ - "PIXELATOR_GRAPH", - "pixelator", - "0.23.0" - ] - ] - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T14:02:41.28759429" - }, - "Test MPX graph - stub": { - "content": [ - { - "0": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.edgelist.parquet:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.edgelist.parquet:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "4": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-graph.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "5": [ - [ - "PIXELATOR_GRAPH", - "pixelator", - "0.23.0" - ] - ], - "all_results": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.edgelist.parquet:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "edgelist": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.edgelist.parquet:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "log": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-graph.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "metadata": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "report_json": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_pixelator": [ - [ - "PIXELATOR_GRAPH", - "pixelator", - "0.23.0" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T14:02:14.582267898" - } -} \ No newline at end of file diff --git a/modules/local/pixelator/single-cell-mpx/layout/environment.yml b/modules/local/pixelator/single-cell-mpx/layout/environment.yml deleted file mode 100644 index 21a756c8..00000000 --- a/modules/local/pixelator/single-cell-mpx/layout/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::pixelator=0.19.0 diff --git a/modules/local/pixelator/single-cell-mpx/layout/main.nf b/modules/local/pixelator/single-cell-mpx/layout/main.nf deleted file mode 100644 index d33747b1..00000000 --- a/modules/local/pixelator/single-cell-mpx/layout/main.nf +++ /dev/null @@ -1,53 +0,0 @@ -process PIXELATOR_LAYOUT { - tag "${meta.id}" - label 'process_medium' - - // TODO: Add conda back - // conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'quay.io/pixelgen-technologies/pixelator:0.23.0' - : 'quay.io/pixelgen-technologies/pixelator:0.23.0'}" - - input: - tuple val(meta), path(data) - - output: - tuple val(meta), path("layout/*dataset.pxl"), emit: dataset - tuple val(meta), path("layout/*report.json"), emit: report_json - tuple val(meta), path("layout/*.meta.json"), emit: metadata - tuple val(meta), path("layout/*"), emit: all_results - tuple val(meta), path("*pixelator-layout.log"), emit: log - - tuple val("${task.process}"), val('pixelator'), eval("pixelator --version 2>/dev/null | sed 's/pixelator, version //g'"), emit: versions_pixelator, topic: versions - - when: - task.ext.when == null || task.ext.when - - script: - - def prefix = task.ext.prefix ?: "${meta.id}" - def args = task.ext.args ?: '' - - """ - pixelator \\ - --cores ${task.cpus} \\ - --log-file ${prefix}.pixelator-layout.log \\ - --verbose \\ - single-cell-mpx \\ - layout \\ - --output . \\ - ${args} \\ - ${data} - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - - """ - mkdir layout - touch "${prefix}.pixelator-layout.log" - touch "layout/${prefix}.layout.dataset.pxl" - touch "layout/${prefix}.report.json" - touch "layout/${prefix}.meta.json" - """ -} diff --git a/modules/local/pixelator/single-cell-mpx/layout/tests/main.nf.test b/modules/local/pixelator/single-cell-mpx/layout/tests/main.nf.test deleted file mode 100644 index 9fa01130..00000000 --- a/modules/local/pixelator/single-cell-mpx/layout/tests/main.nf.test +++ /dev/null @@ -1,71 +0,0 @@ -nextflow_process { - - name "Test Process PIXELATOR_LAYOUT" - script "../main.nf" - process "PIXELATOR_LAYOUT" - tag "modules" - tag "pixelator" - tag "pixelator/mpx" - tag "pixelator/single_cell_mpx_layout" - - - test("Test MPX layout - stub") { - - options "-stub" - - when { - params { - layout_algorithm = "fruchterman_reingold_3d" - skip_layout = false - } - process { - """ - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design: 'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.analysis.dataset.pxl', checkIfExists: true) - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("Test MPX layout - SCSP v1 | Immunology-I") { - when { - params { - save_all = true - layout_algorithm = "fruchterman_reingold_3d" - skip_layout = false - outdir = "$outputDir" - } - process { - """ - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design: 'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.analysis.dataset.pxl', checkIfExists: true) - ] - """ - } - } - - then { - def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) - assertAll( - { assert workflow.success }, - { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), - // All stable path name, with a relative path - stable_name, - process.out.versions_pixelator, - ).match() } - ) - } - } -} diff --git a/modules/local/pixelator/single-cell-mpx/layout/tests/main.nf.test.snap b/modules/local/pixelator/single-cell-mpx/layout/tests/main.nf.test.snap deleted file mode 100644 index fc2c58a5..00000000 --- a/modules/local/pixelator/single-cell-mpx/layout/tests/main.nf.test.snap +++ /dev/null @@ -1,172 +0,0 @@ -{ - "Test MPX layout - SCSP v1 | Immunology-I": { - "content": [ - 1, - [ - "pixelator", - "pixelator/layout", - "pixelator/layout/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json", - "pixelator/layout/sample01_1k_pbmcs_scsp_v1_immunology1.report.json", - "pixelator/logs", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1/sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-layout.log", - "pixelator/sample01_1k_pbmcs_scsp_v1_immunology1.layout.dataset.pxl" - ], - [ - [ - "PIXELATOR_LAYOUT", - "pixelator", - "0.23.0" - ] - ] - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T14:03:37.289007385" - }, - "Test MPX layout - stub": { - "content": [ - { - "0": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.layout.dataset.pxl:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.layout.dataset.pxl:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "4": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-layout.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "5": [ - [ - "PIXELATOR_LAYOUT", - "pixelator", - "0.23.0" - ] - ], - "all_results": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.layout.dataset.pxl:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "dataset": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.layout.dataset.pxl:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "log": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-layout.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "metadata": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "report_json": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_pixelator": [ - [ - "PIXELATOR_LAYOUT", - "pixelator", - "0.23.0" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T14:02:58.572931026" - } -} \ No newline at end of file diff --git a/modules/local/pixelator/single-cell-mpx/qc/environment.yml b/modules/local/pixelator/single-cell-mpx/qc/environment.yml deleted file mode 100644 index 21a756c8..00000000 --- a/modules/local/pixelator/single-cell-mpx/qc/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::pixelator=0.19.0 diff --git a/modules/local/pixelator/single-cell-mpx/qc/main.nf b/modules/local/pixelator/single-cell-mpx/qc/main.nf deleted file mode 100644 index 5b399247..00000000 --- a/modules/local/pixelator/single-cell-mpx/qc/main.nf +++ /dev/null @@ -1,97 +0,0 @@ -process PIXELATOR_QC { - tag "${meta.id}" - label 'process_medium' - - // TODO: Add conda back - // conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'quay.io/pixelgen-technologies/pixelator:0.23.0' - : 'quay.io/pixelgen-technologies/pixelator:0.23.0'}" - - input: - tuple val(meta), path(reads) - - output: - tuple val(meta), path("adapterqc/*.processed.{fq,fastq}.gz"), emit: processed - - tuple val(meta), path("adapterqc/*.processed.{fq,fastq}.gz"), emit: adapterqc_processed - tuple val(meta), path("preqc/*.processed.{fq,fastq}.gz"), emit: preqc_processed - - tuple val(meta), path("adapterqc/*.failed.{fq,fastq}.gz"), emit: adapterqc_failed - tuple val(meta), path("preqc/*.failed.{fq,fastq}.gz"), emit: preqc_failed - tuple val(meta), path("{adapterqc,preqc}/*.failed.{fq,fastq}.gz"), emit: failed - - tuple val(meta), path("adapterqc/*.report.json"), emit: adapterqc_report_json - tuple val(meta), path("preqc/*.report.json"), emit: preqc_report_json - tuple val(meta), path("{adapterqc,preqc}/*.report.json"), emit: report_json - - tuple val(meta), path("preqc/*.qc-report.html"), emit: preqc_report_html - - tuple val(meta), path("adapterqc/*.meta.json"), emit: adapterqc_metadata - tuple val(meta), path("preqc/*.meta.json"), emit: preqc_metadata - tuple val(meta), path("{adapterqc,preqc}/*.meta.json"), emit: metadata - - tuple val(meta), path("*pixelator-preqc.log"), emit: preqc_log - tuple val(meta), path("*pixelator-adapterqc.log"), emit: adapterqc_log - tuple val(meta), path("*pixelator-*.log"), emit: log - - tuple val("${task.process}"), val('pixelator'), eval("pixelator --version 2>/dev/null | sed 's/pixelator, version //g'"), emit: versions_pixelator, topic: versions - - when: - task.ext.when == null || task.ext.when - - script: - assert meta.design - - def prefix = task.ext.prefix ?: "${meta.id}" - def preqc_args = task.ext.args ?: '' - def adapterqc_args = task.ext.args2 ?: '' - - // --design is passed in meta and added to args and args2 through modules.conf - """ - pixelator \\ - --cores ${task.cpus} \\ - --log-file ${prefix}.pixelator-preqc.log \\ - --verbose \\ - single-cell-mpx \\ - preqc \\ - --output . \\ - ${preqc_args} \\ - ${reads} - - shopt -s nullglob - preqc_results=( preqc/*.processed.* ) - echo \${preqc_results[@]} - shopt -u nullglob # Turn off nullglob to make sure it doesn't interfere with anything later - - pixelator \\ - --cores ${task.cpus} \\ - --log-file ${prefix}.pixelator-adapterqc.log \\ - --verbose \\ - single-cell-mpx \\ - adapterqc \\ - --output . \\ - ${adapterqc_args} \\ - \${preqc_results[@]} - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - - """ - mkdir preqc - echo "" | gzip >> "preqc/${prefix}.processed.fq.gz" - echo "" | gzip >> "preqc/${prefix}.failed.fq.gz" - touch "preqc/${prefix}.report.json" - touch "preqc/${prefix}.meta.json" - touch "preqc/${prefix}.qc-report.html" - touch "${prefix}.pixelator-preqc.log" - - mkdir adapterqc - echo "" | gzip >> "adapterqc/${prefix}.processed.fq.gz" - echo "" | gzip >> "adapterqc/${prefix}.failed.fq.gz" - touch "adapterqc/${prefix}.report.json" - touch "adapterqc/${prefix}.meta.json" - touch "${prefix}.pixelator-adapterqc.log" - """ -} diff --git a/modules/local/pixelator/single-cell-mpx/qc/tests/main.nf.test b/modules/local/pixelator/single-cell-mpx/qc/tests/main.nf.test deleted file mode 100644 index 8e7f0bcf..00000000 --- a/modules/local/pixelator/single-cell-mpx/qc/tests/main.nf.test +++ /dev/null @@ -1,69 +0,0 @@ -nextflow_process { - - name "Test Process PIXELATOR_QC" - script "../main.nf" - process "PIXELATOR_QC" - tag "modules" - tag "pixelator" - tag "pixelator/mpx" - tag "pixelator/single_cell_mpx_qc" - - - test("Test MPX qc - stub") { - - options "-stub" - - when { - process { - """ - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/amplicon/sample01_1k_pbmcs_scsp_v1_immunology1.merged.fastq.gz', checkIfExists: true), - ] - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("Test MPX qc - SCSP v1 | Immunology-I") { - when { - params { - save_all = true - outdir = "$outputDir" - } - process { - """ - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/amplicon/sample01_1k_pbmcs_scsp_v1_immunology1.merged.fastq.gz', checkIfExists: true), - ] - ] - """ - } - } - - then { - def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) - assertAll( - { assert workflow.success }, - { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), - // All stable path name, with a relative path - stable_name, - process.out.versions_pixelator, - ).match() } - ) - } - } -} diff --git a/modules/local/pixelator/single-cell-mpx/qc/tests/main.nf.test.snap b/modules/local/pixelator/single-cell-mpx/qc/tests/main.nf.test.snap deleted file mode 100644 index 34d837b3..00000000 --- a/modules/local/pixelator/single-cell-mpx/qc/tests/main.nf.test.snap +++ /dev/null @@ -1,438 +0,0 @@ -{ - "Test MPX qc - SCSP v1 | Immunology-I": { - "content": [ - 1, - [ - "pixelator", - "pixelator/adapterqc", - "pixelator/adapterqc/sample01_1k_pbmcs_scsp_v1_immunology1.failed.fastq.gz", - "pixelator/adapterqc/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json", - "pixelator/adapterqc/sample01_1k_pbmcs_scsp_v1_immunology1.processed.fastq.gz", - "pixelator/adapterqc/sample01_1k_pbmcs_scsp_v1_immunology1.report.json", - "pixelator/logs", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1/sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-adapterqc.log", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1/sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-preqc.log", - "pixelator/preqc", - "pixelator/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.failed.fastq.gz", - "pixelator/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json", - "pixelator/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.processed.fastq.gz", - "pixelator/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.qc-report.html", - "pixelator/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.report.json" - ], - [ - [ - "PIXELATOR_QC", - "pixelator", - "0.23.0" - ] - ] - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T14:04:28.901860146" - }, - "Test MPX qc - stub": { - "content": [ - { - "0": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.processed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "1": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.processed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "10": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "11": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "12": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "13": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-preqc.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "14": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-adapterqc.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "15": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-adapterqc.log:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-preqc.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "16": [ - [ - "PIXELATOR_QC", - "pixelator", - "0.23.0" - ] - ], - "2": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.processed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "3": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.failed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "4": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.failed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "5": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.failed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "sample01_1k_pbmcs_scsp_v1_immunology1.failed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ] - ], - "6": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "7": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "8": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "9": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.qc-report.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "adapterqc_failed": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.failed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "adapterqc_log": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-adapterqc.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "adapterqc_metadata": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "adapterqc_processed": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.processed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "adapterqc_report_json": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "failed": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.failed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "sample01_1k_pbmcs_scsp_v1_immunology1.failed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ] - ], - "log": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-adapterqc.log:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-preqc.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "metadata": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "preqc_failed": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.failed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "preqc_log": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-preqc.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "preqc_metadata": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "preqc_processed": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.processed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "preqc_report_html": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.qc-report.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "preqc_report_json": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "processed": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.processed.fq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "report_json": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - [ - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "versions_pixelator": [ - [ - "PIXELATOR_QC", - "pixelator", - "0.23.0" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T14:03:55.658411692" - } -} \ No newline at end of file diff --git a/modules/local/pixelator/single-cell-mpx/report/environment.yml b/modules/local/pixelator/single-cell-mpx/report/environment.yml deleted file mode 100644 index 21a756c8..00000000 --- a/modules/local/pixelator/single-cell-mpx/report/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::pixelator=0.19.0 diff --git a/modules/local/pixelator/single-cell-mpx/report/main.nf b/modules/local/pixelator/single-cell-mpx/report/main.nf deleted file mode 100644 index 336218e0..00000000 --- a/modules/local/pixelator/single-cell-mpx/report/main.nf +++ /dev/null @@ -1,62 +0,0 @@ -process PIXELATOR_REPORT { - tag "${meta.id}" - label 'process_low' - - // TODO: Add conda back - // conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'quay.io/pixelgen-technologies/pixelator:0.23.0' - : 'quay.io/pixelgen-technologies/pixelator:0.23.0'}" - - input: - tuple val(meta), path(panel_file), val(panel) - path amplicon_data, stageAs: "results/amplicon/*" - path preqc_data, stageAs: "results/preqc/*" - path adapterqc_data, stageAs: "results/adapterqc/*" - path demux_data, stageAs: "results/demux/*" - path collapse_data, stageAs: "results/collapse/*" - path graph_data, stageAs: "results/graph/*" - path annotate_data, stageAs: "results/annotate/*" - path analysis_data, stageAs: "results/analysis/*" - path layout_data, stageAs: "results/layout/*" - - output: - tuple val(meta), path("report/*.html"), emit: reports - tuple val(meta), path("*pixelator-*.log"), emit: log - tuple val("${task.process}"), val('pixelator'), eval("pixelator --version 2>/dev/null | sed 's/pixelator, version //g'"), emit: versions_pixelator, topic: versions - - when: - task.ext.when == null || task.ext.when - - script: - def prefix = task.ext.prefix ?: "${meta.id}" - def args = task.ext.args ?: '' - def panelOpt = (panel - ? "--panel ${panel}" - : panel_file - ? "--panel ${panel_file}" - : "") - - """ - pixelator \\ - --cores ${task.cpus} \\ - --log-file ${prefix}.pixelator-report.log \\ - --verbose \\ - single-cell-mpx \\ - report \\ - --output . \\ - ${panelOpt} \\ - ${args} \\ - results - """ - - stub: - - def prefix = task.ext.prefix ?: "${meta.id}" - - """ - mkdir report - touch "${prefix}.pixelator-report.log" - touch "report/${prefix}.html" - """ -} diff --git a/modules/local/pixelator/single-cell-mpx/report/tests/main.nf.test b/modules/local/pixelator/single-cell-mpx/report/tests/main.nf.test deleted file mode 100644 index 18f20df7..00000000 --- a/modules/local/pixelator/single-cell-mpx/report/tests/main.nf.test +++ /dev/null @@ -1,154 +0,0 @@ -nextflow_process { - - name "Test Process PIXELATOR_REPORT" - script "../main.nf" - process "PIXELATOR_REPORT" - tag "modules" - tag "pixelator" - tag "pixelator/mpx" - tag "pixelator/single_cell_mpx_report" - - test("Test MPX report - stub") { - - options "-stub" - - when { - process { - """ - def meta = - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - [], - "human-sc-immunology-spatial-proteomics-1" - ] - - input[1] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/amplicon/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/amplicon/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - input[2] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.processed.fastq.gz', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - input[3] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/adapterqc/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/adapterqc/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - input[4] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - input[5] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/collapse/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/collapse/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - input[6] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/graph/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/graph/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/graph/sample01_1k_pbmcs_scsp_v1_immunology1.edgelist.parquet', checkIfExists: true), - ] - input[7] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.annotate.dataset.pxl', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.raw_components_metrics.csv.gz', checkIfExists: true), - ] - input[8] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.analysis.dataset.pxl', checkIfExists: true), - ] - input[9] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/layout/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/layout/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/layout/sample01_1k_pbmcs_scsp_v1_immunology1.layout.dataset.pxl', checkIfExists: true), - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("Test MPX report - SCSP v1 | Immunology-I") { - when { - params { - save_all = true - outdir = "$outputDir" - } - process { - """ - def meta = - input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], - [], - "human-sc-immunology-spatial-proteomics-1" - ] - - input[1] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/amplicon/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/amplicon/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - input[2] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.processed.fastq.gz', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - input[3] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/adapterqc/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/adapterqc/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - input[4] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - input[5] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/collapse/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/collapse/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - input[6] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/graph/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/graph/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/graph/sample01_1k_pbmcs_scsp_v1_immunology1.edgelist.parquet', checkIfExists: true), - ] - input[7] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.annotate.dataset.pxl', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.raw_components_metrics.csv.gz', checkIfExists: true), - ] - input[8] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.analysis.dataset.pxl', checkIfExists: true), - ] - input[9] = [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/layout/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/layout/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/layout/sample01_1k_pbmcs_scsp_v1_immunology1.layout.dataset.pxl', checkIfExists: true), - ] - """ - } - } - - then { - def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) - assertAll( - { assert workflow.success }, - { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), - // All stable path name, with a relative path - stable_name, - process.out.versions_pixelator, - ).match() } - ) - } - } -} diff --git a/modules/local/pixelator/single-cell-mpx/report/tests/main.nf.test.snap b/modules/local/pixelator/single-cell-mpx/report/tests/main.nf.test.snap deleted file mode 100644 index ea218de9..00000000 --- a/modules/local/pixelator/single-cell-mpx/report/tests/main.nf.test.snap +++ /dev/null @@ -1,95 +0,0 @@ -{ - "Test MPX report - stub": { - "content": [ - { - "0": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-report.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - "PIXELATOR_REPORT", - "pixelator", - "0.23.0" - ] - ], - "log": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-report.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "reports": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_pixelator": [ - [ - "PIXELATOR_REPORT", - "pixelator", - "0.23.0" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T14:04:44.266292774" - }, - "Test MPX report - SCSP v1 | Immunology-I": { - "content": [ - 1, - [ - "pixelator", - "pixelator/logs", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1/sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-report.log", - "pixelator/sample01_1k_pbmcs_scsp_v1_immunology1.qc-report.html" - ], - [ - [ - "PIXELATOR_REPORT", - "pixelator", - "0.23.0" - ] - ] - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T14:05:00.791927512" - } -} \ No newline at end of file diff --git a/modules/local/pixelator/single-cell-pna/layout/tests/main.nf.test b/modules/local/pixelator/single-cell-pna/layout/tests/main.nf.test index cdab8496..2fdc8524 100644 --- a/modules/local/pixelator/single-cell-pna/layout/tests/main.nf.test +++ b/modules/local/pixelator/single-cell-pna/layout/tests/main.nf.test @@ -5,8 +5,8 @@ nextflow_process { process "PIXELATOR_PNA_LAYOUT" tag "modules" tag "pixelator" - tag "pixelator/mpx" - tag "pixelator/single_cell_mpx_layout" + tag "pixelator/pna" + tag "pixelator/single_cell_pna_layout" test("Test PNA layout - stub") { @@ -16,13 +16,13 @@ nextflow_process { when { params { save_all = true - layout_algorithm = "fruchterman_reingold_3d" + layout_algorithm = "pmds_3d" skip_layout = false } process { """ input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design: 'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], + [ id:'PNA055_Sample07_filtered_S7', design: 'pna-2', panel:'proxiome-immuno-155-v2', technology:'pna' ], file(params.pipelines_testdata_base_path + 'testdata/pna/modules/analysis/PNA055_Sample07_filtered_S7.analysis.pxl', checkIfExists: true) ] """ @@ -41,14 +41,14 @@ nextflow_process { when { params { save_all = true - layout_algorithm = "fruchterman_reingold_3d" + layout_algorithm = "pmds_3d" skip_layout = false outdir = "$outputDir" } process { """ input[0] = [ - [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design: 'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ], + [ id:'PNA055_Sample07_filtered_S7', design: 'pna-2', panel:'proxiome-immuno-155-v2', technology:'pna' ], file(params.pipelines_testdata_base_path + 'testdata/pna/modules/analysis/PNA055_Sample07_filtered_S7.analysis.pxl', checkIfExists: true) ] """ diff --git a/modules/local/pixelator/single-cell-pna/layout/tests/main.nf.test.snap b/modules/local/pixelator/single-cell-pna/layout/tests/main.nf.test.snap index 13323783..96a3b9eb 100644 --- a/modules/local/pixelator/single-cell-pna/layout/tests/main.nf.test.snap +++ b/modules/local/pixelator/single-cell-pna/layout/tests/main.nf.test.snap @@ -9,8 +9,8 @@ "pixelator/layout/PNA055_Sample07_filtered_S7.meta.json", "pixelator/layout/PNA055_Sample07_filtered_S7.report.json", "pixelator/logs", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1/sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-layout.log" + "pixelator/logs/PNA055_Sample07_filtered_S7", + "pixelator/logs/PNA055_Sample07_filtered_S7/PNA055_Sample07_filtered_S7.pixelator-layout.log" ], [ [ @@ -21,10 +21,10 @@ ] ], "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2025-12-11T14:07:14.696827931" + "timestamp": "2026-02-04T13:06:34.606588167" }, "Test PNA layout - stub": { "content": [ @@ -32,60 +32,60 @@ "0": [ [ { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" + "id": "PNA055_Sample07_filtered_S7", + "design": "pna-2", + "panel": "proxiome-immuno-155-v2", + "technology": "pna" }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pxl:md5,d41d8cd98f00b204e9800998ecf8427e" + "PNA055_Sample07_filtered_S7.pxl:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "1": [ [ { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" + "id": "PNA055_Sample07_filtered_S7", + "design": "pna-2", + "panel": "proxiome-immuno-155-v2", + "technology": "pna" }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" + "PNA055_Sample07_filtered_S7.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "2": [ [ { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" + "id": "PNA055_Sample07_filtered_S7", + "design": "pna-2", + "panel": "proxiome-immuno-155-v2", + "technology": "pna" }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" + "PNA055_Sample07_filtered_S7.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "3": [ [ { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" + "id": "PNA055_Sample07_filtered_S7", + "design": "pna-2", + "panel": "proxiome-immuno-155-v2", + "technology": "pna" }, [ - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.pxl:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" + "PNA055_Sample07_filtered_S7.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e", + "PNA055_Sample07_filtered_S7.pxl:md5,d41d8cd98f00b204e9800998ecf8427e", + "PNA055_Sample07_filtered_S7.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" ] ] ], "4": [ [ { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" + "id": "PNA055_Sample07_filtered_S7", + "design": "pna-2", + "panel": "proxiome-immuno-155-v2", + "technology": "pna" }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-layout.log:md5,d41d8cd98f00b204e9800998ecf8427e" + "PNA055_Sample07_filtered_S7.pixelator-layout.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "5": [ @@ -98,60 +98,60 @@ "all_results": [ [ { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" + "id": "PNA055_Sample07_filtered_S7", + "design": "pna-2", + "panel": "proxiome-immuno-155-v2", + "technology": "pna" }, [ - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.pxl:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" + "PNA055_Sample07_filtered_S7.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e", + "PNA055_Sample07_filtered_S7.pxl:md5,d41d8cd98f00b204e9800998ecf8427e", + "PNA055_Sample07_filtered_S7.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" ] ] ], "log": [ [ { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" + "id": "PNA055_Sample07_filtered_S7", + "design": "pna-2", + "panel": "proxiome-immuno-155-v2", + "technology": "pna" }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-layout.log:md5,d41d8cd98f00b204e9800998ecf8427e" + "PNA055_Sample07_filtered_S7.pixelator-layout.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "metadata_json": [ [ { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" + "id": "PNA055_Sample07_filtered_S7", + "design": "pna-2", + "panel": "proxiome-immuno-155-v2", + "technology": "pna" }, - "sample01_1k_pbmcs_scsp_v1_immunology1.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" + "PNA055_Sample07_filtered_S7.meta.json:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "pixelfile": [ [ { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" + "id": "PNA055_Sample07_filtered_S7", + "design": "pna-2", + "panel": "proxiome-immuno-155-v2", + "technology": "pna" }, - "sample01_1k_pbmcs_scsp_v1_immunology1.pxl:md5,d41d8cd98f00b204e9800998ecf8427e" + "PNA055_Sample07_filtered_S7.pxl:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "report_json": [ [ { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" + "id": "PNA055_Sample07_filtered_S7", + "design": "pna-2", + "panel": "proxiome-immuno-155-v2", + "technology": "pna" }, - "sample01_1k_pbmcs_scsp_v1_immunology1.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" + "PNA055_Sample07_filtered_S7.report.json:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "versions_pixelator": [ @@ -164,9 +164,9 @@ } ], "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2025-12-11T14:06:55.333469128" + "timestamp": "2026-02-04T13:06:03.163681958" } } \ No newline at end of file diff --git a/modules/nf-core/cat/fastq/main.nf b/modules/nf-core/cat/fastq/main.nf index 8480e383..e70af3d1 100644 --- a/modules/nf-core/cat/fastq/main.nf +++ b/modules/nf-core/cat/fastq/main.nf @@ -19,11 +19,12 @@ process CAT_FASTQ { script: def prefix = task.ext.prefix ?: "${meta.id}" - def readList = reads instanceof List ? reads.collect { it.toString() } : [reads.toString()] + def readList = reads instanceof List ? reads.collect { item -> item.toString() } : [reads.toString()] + def compress = readList[0]?.endsWith('.gz') ? '' : '| gzip' if (meta.single_end) { if (readList.size >= 1) { """ - cat ${readList.join(' ')} > ${prefix}.merged.fastq.gz + cat ${readList.join(' ')} ${compress} > ${prefix}.merged.fastq.gz """ } else { error("Could not find any FASTQ files to concatenate in the process input") @@ -35,8 +36,8 @@ process CAT_FASTQ { def read2 = [] readList.eachWithIndex { v, ix -> (ix & 1 ? read2 : read1) << v } """ - cat ${read1.join(' ')} > ${prefix}_1.merged.fastq.gz - cat ${read2.join(' ')} > ${prefix}_2.merged.fastq.gz + cat ${read1.join(' ')} ${compress} > ${prefix}_1.merged.fastq.gz + cat ${read2.join(' ')} ${compress} > ${prefix}_2.merged.fastq.gz """ } else { error("Could not find any FASTQ file pairs to concatenate in the process input") @@ -45,7 +46,7 @@ process CAT_FASTQ { stub: def prefix = task.ext.prefix ?: "${meta.id}" - def readList = reads instanceof List ? reads.collect { it.toString() } : [reads.toString()] + def readList = reads instanceof List ? reads.collect { item -> item.toString() } : [reads.toString()] if (meta.single_end) { if (readList.size >= 1) { """ diff --git a/modules/nf-core/cat/fastq/meta.yml b/modules/nf-core/cat/fastq/meta.yml index 8fc03bdc..6fefd6e0 100644 --- a/modules/nf-core/cat/fastq/meta.yml +++ b/modules/nf-core/cat/fastq/meta.yml @@ -1,9 +1,10 @@ name: cat_fastq -description: Concatenates fastq files +description: Concatenates fastq files. Supports both compressed (.gz) and uncompressed inputs; uncompressed files are automatically gzip-compressed during concatenation. keywords: - cat - fastq - concatenate + - compress tools: - cat: description: | @@ -21,6 +22,7 @@ input: type: file description: | List of input FastQ files to be concatenated. + Accepts both gzip-compressed (.fastq.gz) and uncompressed (.fastq) files. ontologies: [] output: reads: diff --git a/modules/nf-core/cat/fastq/tests/main.nf.test b/modules/nf-core/cat/fastq/tests/main.nf.test index 013c1d0f..21052d90 100644 --- a/modules/nf-core/cat/fastq/tests/main.nf.test +++ b/modules/nf-core/cat/fastq/tests/main.nf.test @@ -7,6 +7,7 @@ nextflow_process { tag "modules_nfcore" tag "cat" tag "cat/fastq" + tag "gunzip" test("test_cat_fastq_single_end") { @@ -100,6 +101,76 @@ nextflow_process { } } + test("test_cat_fastq_single_end_uncompressed") { + + setup { + run("GUNZIP") { + script "../../../gunzip/main.nf" + process { + """ + input[0] = Channel.of( + [[ id:'r1' ], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true)], + [[ id:'r2' ], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true)] + ) + """ + } + } + } + + when { + process { + """ + input[0] = GUNZIP.out.gunzip + .toSortedList { a, b -> a[0].id <=> b[0].id } + .map { items -> [[ id: 'test', single_end: true ], items.collect { it[1] }] } + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_cat_fastq_paired_end_uncompressed") { + + setup { + run("GUNZIP") { + script "../../../gunzip/main.nf" + process { + """ + input[0] = Channel.of( + [[ id:'a' ], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true)], + [[ id:'b' ], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true)], + [[ id:'c' ], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_1.fastq.gz', checkIfExists: true)], + [[ id:'d' ], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_2.fastq.gz', checkIfExists: true)] + ) + """ + } + } + } + + when { + process { + """ + input[0] = GUNZIP.out.gunzip + .toSortedList { a, b -> a[0].id <=> b[0].id } + .map { items -> [[ id: 'test', single_end: false ], items.collect { it[1] }] } + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + test("test_cat_fastq_single_end_single_file") { when { diff --git a/modules/nf-core/cat/fastq/tests/main.nf.test.snap b/modules/nf-core/cat/fastq/tests/main.nf.test.snap index e2a94249..6375b2ab 100644 --- a/modules/nf-core/cat/fastq/tests/main.nf.test.snap +++ b/modules/nf-core/cat/fastq/tests/main.nf.test.snap @@ -150,6 +150,98 @@ }, "timestamp": "2025-12-10T14:32:06.262192935" }, + "test_cat_fastq_single_end_uncompressed": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": true + }, + "test.merged.fastq.gz:md5,ee314a9bd568d06617171b0c85f508da" + ] + ], + "1": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": true + }, + "test.merged.fastq.gz:md5,ee314a9bd568d06617171b0c85f508da" + ] + ], + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-09T10:03:24.344628" + }, + "test_cat_fastq_paired_end_uncompressed": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.merged.fastq.gz:md5,3ad9406595fafec8172368f9cd0b6a22", + "test_2.merged.fastq.gz:md5,a52cab0b840c7178b0ea83df1fdbe8d5" + ] + ] + ], + "1": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] + ], + "reads": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test_1.merged.fastq.gz:md5,3ad9406595fafec8172368f9cd0b6a22", + "test_2.merged.fastq.gz:md5,a52cab0b840c7178b0ea83df1fdbe8d5" + ] + ] + ], + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-09T10:03:37.568053" + }, "test_cat_fastq_single_end": { "content": [ { diff --git a/nextflow.config b/nextflow.config index 1ae0598d..bf37d4d8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,88 +11,13 @@ params { // Input options - input = null - input_basedir = null - - /* - =============================================================== - MPX options - =============================================================== - */ - - // Preqc options - trim_front = 0 - trim_tail = 0 - max_length = null - min_length = null - max_n_bases = 0 - avg_qual = 20 - dedup = false - remove_polyg = false - - // adapterqc options - adapterqc_mismatches = 0.1 - - // demux options - demux_mismatches = 0.1 - demux_min_length = null - - // collapse options - markers_ignore = null - algorithm = 'adjacency' - max_neighbours = 60 - collapse_mismatches = 2 - collapse_min_count = 2 - - // graph options - multiplet_recovery = true - graph_max_refinement_recursion_depth = 5 - graph_max_edges_to_split = 5 - graph_min_count = 2 - - // annotate options - min_size = null - max_size = null - dynamic_filter = 'min' - aggregate_calling = true - - // analysis options - compute_polarization = true - compute_colocalization = true - use_full_bipartite = false - polarization_transformation = "log1p" - polarization_min_marker_count = 5 - polarization_n_permutations = 50 - colocalization_transformation = "rate-diff" - colocalization_neighbourhood_size = 1 - colocalization_n_permutations = 50 - colocalization_min_region_count = 5 - colocalization_min_marker_count = 5 - - // Output options - save_amplicon_reads = false - save_qc_passed_reads = false - save_qc_failed_reads = false - save_demux_processed_reads = false - save_demux_failed_reads = false - save_collapsed_reads = false - save_edgelist = false - save_annotate_dataset = false - save_raw_component_metrics = false - save_analysis_dataset = false - - // layout options - no_node_marker_counts = false - layout_algorithm = "wpmds_3d" - - // skip options - skip_report = false - skip_denoise = false - skip_analysis = false - skip_layout = false + input = null + input_basedir = null // Main pixelator container override - pixelator_container = null + pixelator_container = null + experiment_summary_container = null + /* @@ -100,108 +25,110 @@ params { PNA options =============================================================== */ - save_pna_amplicon_reads = false - save_pna_demux_parquet = false - save_pna_demux_passed_reads = false - save_pna_demux_failed_reads = false - save_pna_collapsed_reads = false - save_pna_graph_pixelfile = false - save_pna_denoise_pixelfile = false - save_pna_analysis_pixelfile = false + save_pna_amplicon_reads = false + save_pna_demux_parquet = false + save_pna_demux_passed_reads = false + save_pna_demux_failed_reads = false + save_pna_collapsed_reads = false + save_pna_graph_pixelfile = false + save_pna_denoise_pixelfile = false + save_pna_analysis_pixelfile = false // PNA amplicon - pna_amplicon_mismatches = 0.1 - pna_amplicon_remove_polyg = true - pna_amplicon_quality_cutoff = 20 - pna_amplicon_low_complexity_filter = true - pna_amplicon_low_complexity_threshold = 0.8 - pna_amplicon_lbs_filter = true - pna_amplicon_lbs_filter_min_overlap = 8 - pna_amplicon_lbs_filter_error_rate = 0.1 + pna_amplicon_mismatches = 0.1 + pna_amplicon_remove_polyg = true + pna_amplicon_quality_cutoff = 20 + pna_amplicon_low_complexity_filter = true + pna_amplicon_low_complexity_threshold = 0.8 + pna_amplicon_lbs_filter = true + pna_amplicon_lbs_filter_min_overlap = 8 + pna_amplicon_lbs_filter_error_rate = 0.1 // PNA demux - pna_demux_mismatches = 1 - pna_demux_output_chunk_reads = '50M' - pna_demux_output_max_chunks = 8 - pna_demux_strategy = "independent" + pna_demux_mismatches = 1 + pna_demux_output_chunk_reads = '50M' + pna_demux_output_max_chunks = 8 + pna_demux_strategy = "independent" // PNA collapse - pna_collapse_mismatches = 2 - pna_collapse_algorithm = 'directional' + pna_collapse_mismatches = 2 + pna_collapse_algorithm = 'directional' // PNA graph - pna_graph_multiplet_recovery = true - pna_graph_leiden_iterations = 1 - pna_graph_initial_stage_leiden_resolution = 1.0 - pna_graph_refinement_stage_leiden_resolution = 0.01 - pna_graph_min_count = 1 - pna_graph_min_component_size_in_refinement = 1000 - pna_graph_max_refinement_recursion_depth = 5 - pna_graph_initial_stage_max_edges_to_remove = null - pna_graph_refinement_stage_max_edges_to_remove = 4 - pna_graph_initial_stage_max_edges_to_remove_relative = null - pna_graph_refinement_stage_max_edges_to_remove_relative = null - pna_graph_graph_min_component_size_to_prune = 100 - pna_graph_component_size_min_threshold = null + pna_graph_multiplet_recovery = true + pna_graph_leiden_iterations = 1 + pna_graph_initial_stage_leiden_resolution = 1.0 + pna_graph_refinement_stage_leiden_resolution = 0.01 + pna_graph_min_count = 1 + pna_graph_min_component_size_in_refinement = 1000 + pna_graph_max_refinement_recursion_depth = 5 + pna_graph_initial_stage_max_edges_to_remove = null + pna_graph_refinement_stage_max_edges_to_remove = 4 + pna_graph_initial_stage_max_edges_to_remove_relative = null + pna_graph_refinement_stage_max_edges_to_remove_relative = null + pna_graph_graph_min_component_size_to_prune = 100 + pna_graph_component_size_min_threshold = 8000 // PNA denoise pna_denoise_run_one_core_graph_denoising = true pna_denoise_pval_threshold = 0.05 pna_denoise_inflate_factor = 1.5 + skip_denoise = false // PNA analysis - pna_analysis_compute_proximity = true - pna_analysis_proximity_nbr_of_permutations = 100 - pna_analysis_compute_k_cores = true - pna_analysis_compute_svd_var_explained = true - pna_analysis_svd_nbr_of_pivots = 50 + pna_analysis_compute_proximity = true + pna_analysis_proximity_nbr_of_permutations = 100 + pna_analysis_compute_k_cores = true + pna_analysis_compute_svd_var_explained = true + pna_analysis_svd_nbr_of_pivots = 50 + skip_analysis = false // PNA layout - pna_layout_no_node_marker_counts = false - pna_layout_layout_algorithm = "wpmds_3d" - pna_layout_pmds_pivots = 50 - pna_layout_wpmds_k = 5 + pna_layout_no_node_marker_counts = false + pna_layout_layout_algorithm = "wpmds_3d" + pna_layout_pmds_pivots = 50 + pna_layout_wpmds_k = 5 + skip_layout = false // Experiment summary - skip_experiment_summary = false + skip_experiment_summary = false // Common output options - save_json = true - save_all = false + save_json = true + save_all = false // Boilerplate options - outdir = null - publish_dir_mode = 'copy' - email = null - email_on_fail = null - plaintext_email = false - monochrome_logs = false - hook_url = System.getenv('HOOK_URL') - help = false - help_full = false - show_hidden = false - version = false - pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/pixelator/' - trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') + outdir = null + publish_dir_mode = 'copy' + email = null + email_on_fail = null + plaintext_email = false + monochrome_logs = false + hook_url = System.getenv('HOOK_URL') + help = false + help_full = false + show_hidden = false + version = false + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/pixelator/' + trace_report_suffix = new java.util.Date().format('yyyy-MM-dd_HH-mm-ss') // Config options - config_profile_name = null - config_profile_description = null + config_profile_name = null + config_profile_description = null - custom_config_version = 'master' - custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - config_profile_contact = null - config_profile_url = null + custom_config_version = 'master' + custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" + config_profile_contact = null + config_profile_url = null // Schema validation default options - validate_params = true + validate_params = true } // Load base.config by default for all pipelines includeConfig 'conf/base.config' - def container_env_options = [ "MPLCONFIGDIR": '/tmp/.config/matplotlib', "NUMBA_CACHE_DIR": "/tmp/.numba_cache", @@ -216,41 +143,41 @@ def container_env_options = [ profiles { debug { - dumpHashes = true - process.beforeScript = 'echo $HOSTNAME' - cleanup = false + dumpHashes = true + process.beforeScript = 'echo $HOSTNAME' + cleanup = false nextflow.enable.configProcessNamesValidation = true } conda { - conda.enabled = true - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - conda.channels = ['conda-forge', 'bioconda'] - apptainer.enabled = false + conda.enabled = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + conda.channels = ['conda-forge', 'bioconda'] + apptainer.enabled = false } mamba { - conda.enabled = true - conda.useMamba = true - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + conda.enabled = true + conda.useMamba = true + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false } docker { - docker.enabled = true - conda.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false - docker.runOptions = '-u $(id -u):$(id -g)' - env = container_env_options + docker.enabled = true + conda.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false + docker.runOptions = '-u $(id -u):$(id -g)' + env = container_env_options } arm64 { process.arch = 'arm64' @@ -264,7 +191,7 @@ profiles { wave.strategy = 'conda,container' } emulate_amd64 { - docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' + docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' } singularity { singularity.enabled = true @@ -278,46 +205,46 @@ profiles { env = container_env_options } podman { - podman.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false - podman.runOptions = '--userns=keep-id' - env = container_env_options + podman.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + shifter.enabled = false + charliecloud.enabled = false + apptainer.enabled = false + podman.runOptions = '--userns=keep-id' + env = container_env_options } shifter { - shifter.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - charliecloud.enabled = false - apptainer.enabled = false - env = container_env_options + shifter.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + charliecloud.enabled = false + apptainer.enabled = false + env = container_env_options } charliecloud { - charliecloud.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - apptainer.enabled = false - env = container_env_options + charliecloud.enabled = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + apptainer.enabled = false + env = container_env_options } apptainer { - apptainer.enabled = true - apptainer.autoMounts = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - env = container_env_options + apptainer.enabled = true + apptainer.autoMounts = true + conda.enabled = false + docker.enabled = false + singularity.enabled = false + podman.enabled = false + shifter.enabled = false + charliecloud.enabled = false + env = container_env_options } wave { apptainer.ociAutoPull = true @@ -327,17 +254,18 @@ profiles { wave.strategy = 'conda,container' } gpu { - docker.runOptions = '-u $(id -u):$(id -g) --gpus all' - apptainer.runOptions = '--nv' - singularity.runOptions = '--nv' + docker.runOptions = '-u $(id -u):$(id -g) --gpus all' + apptainer.runOptions = '--nv' + singularity.runOptions = '--nv' } - test { includeConfig 'conf/test_pna.config' } - test_full { includeConfig 'conf/test_full.config' } - test_panel_v2 { includeConfig 'conf/test_panel_v2.config' } - test_scsp_v1_immunology_v1 { includeConfig 'conf/test_scsp_v1_immunology_v1.config' } - test_mpx { includeConfig 'conf/test_mpx.config' } - test_pna { includeConfig 'conf/test_pna.config' } + test { + includeConfig 'conf/test_pna.config' + } + + test_full { + includeConfig 'conf/test_full.config' + } } // Load nf-core custom profiles from different institutions includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" @@ -395,51 +323,52 @@ dag { manifest { name = 'nf-core/pixelator' // Keep both author and contributors fields for compatibility with Nextflow versions < 24.10.0 - author = """Pixelgen Technologies AB""" // The author field is deprecated from Nextflow version 24.10.0, use contributors instead + author = """Pixelgen Technologies AB""" + // The author field is deprecated from Nextflow version 24.10.0, use contributors instead contributors = [ [ name: 'Florian De Temmerman', affiliation: 'Pixelgen Technologies AB', email: 'florian.detemmerman@pixelgen.com', github: '@fbdtemme', - contribution: ["author", "maintainer"], // List of contribution types ('author', 'maintainer' or 'contributor') - orcid: '0009-0006-0086-2470' + contribution: ["author", "maintainer"], + orcid: '0009-0006-0086-2470', ], [ name: 'Johan Dahlberg', affiliation: 'Pixelgen Technologies AB', email: 'johan.dahlberg@pixelgen.com', github: '@johandahlberg', - contribution: ["contributor"], // List of contribution types ('author', 'maintainer' or 'contributor') - orcid: '0000-0001-6962-1460' + contribution: ["contributor"], + orcid: '0000-0001-6962-1460', ], [ name: 'Alvaro Martinez Barrio', affiliation: 'Pixelgen Technologies AB', email: 'alvaro.martinez.barrio@pixelgen.com', github: '@ambarrio', - contribution: ["contributor"], // List of contribution types ('author', 'maintainer' or 'contributor') - orcid: '0000-0001-5064-2093' + contribution: ["contributor"], + orcid: '0000-0001-5064-2093', ], ] homePage = 'https://github.com/nf-core/pixelator' - description = """Pipeline for analysis of Molecular Pixelation assays""" + description = """Pipeline for analysis of Proximity Network Assay data""" mainScript = 'main.nf' defaultBranch = 'master' nextflowVersion = '!>=25.04.0' - version = '2.3.1' + version = '3.0.0' doi = '10.1101/2023.06.05.543770' } // Nextflow plugins plugins { - id 'nf-schema@2.5.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.5.1' } validation { defaultIgnoreParams = ["genomes"] - monochromeLogs = params.monochrome_logs + monochromeLogs = params.monochrome_logs } // Load modules.config for DSL2 module specific options diff --git a/nextflow_schema.json b/nextflow_schema.json index 99c2bae6..d0fac578 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -2,7 +2,7 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/nf-core/pixelator/master/nextflow_schema.json", "title": "nf-core/pixelator pipeline parameters", - "description": "Pipeline for analysis of Molecular Pixelation assays", + "description": "Pipeline for analysis of Proximity Network Assay data", "type": "object", "$defs": { "input_output_options": { @@ -44,20 +44,6 @@ } } }, - "amplicon_options": { - "title": "Amplicon generation options", - "type": "object", - "fa_icon": "fas fa-circle", - "properties": { - "save_amplicon_reads": { - "fa_icon": "fas fa-save", - "type": "boolean", - "default": false, - "description": "Save intermediate amplicon reads generated from the raw input reads.", - "help": "By default, generated amplicon FastQ files will not be saved to the results directory. Specify this flag (or set it to `true` in your config file) to copy these files to the results directory when complete." - } - } - }, "pna_amplicon_options": { "title": "Amplicon generation options", "type": "object", @@ -66,20 +52,21 @@ "save_pna_amplicon_reads": { "fa_icon": "fas fa-save", "type": "boolean", - "default": false, "description": "Save intermediate amplicon reads generated from the raw input reads.", "help": "By default, generated amplicon FastQ files will not be saved to the results directory. Specify this flag (or set it to `true` in your config file) to copy these files to the results directory when complete." }, "pna_amplicon_mismatches": { "type": "number", - "minimum": 0.0, + "minimum": 0, "maximum": 0.5, - "description": "The number of mismatches allowed while anchoring reads using LBS sequences (in percentage of seen LBS length) [default: 0.1; 0.0<=x<=0.5]" + "description": "The number of mismatches allowed while anchoring reads using LBS sequences (in percentage of seen LBS length) [default: 0.1; 0.0<=x<=0.5]", + "default": 0.1 }, "pna_amplicon_remove_polyg": { "fa_icon": "fas g", "description": "Remove PolyG sequences (length of 10 or more)", - "type": "boolean" + "type": "boolean", + "default": true }, "pna_amplicon_quality_cutoff": { "fa_icon": "fas gauge", @@ -96,7 +83,7 @@ "type": "number", "default": 0.8, "minimum": 0.5, - "maximum": 1.0, + "maximum": 1, "description": "The threshold for determining if a UMI sequence is of low complexity and will be removed. [0.5<=x<=1.0]" }, "pna_amplicon_lbs_filter": { @@ -114,122 +101,12 @@ "pna_amplicon_lbs_filter_error_rate": { "type": "number", "default": 0.1, - "minimum": 0.0, - "maximum": 1.0, + "minimum": 0, + "maximum": 1, "description": "The allowed error-rate in a semi-global alignment of a UMI sequence with the LBS regions. The error rate is defined as a percentage of UMI length. [0.0<=x<=1.0]" } } }, - "qc_options": { - "title": "QC/Filtering/Trimming options", - "type": "object", - "fa_icon": "fas fa-terminal", - "properties": { - "trim_front": { - "fa_icon": "fas backward-step", - "type": "integer", - "description": "Trim N bases from the front of the reads", - "default": 0 - }, - "trim_tail": { - "fa_icon": "fas forward-step", - "type": "integer", - "description": "Trim N bases from the tail of the reads", - "default": 0 - }, - "max_length": { - "fa_icon": "fas up-right-and-down-left-from-center", - "type": "integer", - "description": "The maximum length of a read", - "help_text": "Reads longer then given length will be trimmed to the given length. If you set this argument it will overrule the value from the chosen design" - }, - "min_length": { - "fa_icon": "fas down-left-and-up-right-to-center", - "type": "integer", - "description": "The minimum length (bases) of a read", - "help_text": "Reads shorter then given length will be discarded. If you set this argument it will overrule the value from the chosen design." - }, - "max_n_bases": { - "fa_icon": "fas n", - "description": "The maximum number of Ns allowed in a read", - "help_text": "The default value of 0 means any reads with N in it will be filtered out", - "type": "integer", - "default": 0 - }, - "avg_qual": { - "fa_icon": "fas gauge", - "description": "Minimum avg. quality a read must have (0 will disable the filter)", - "type": "integer", - "default": 20 - }, - "dedup": { - "fa_icon": "fas clone", - "description": "Remove duplicated reads (exact same sequence)", - "type": "boolean" - }, - "remove_polyg": { - "fa_icon": "fas g", - "description": "Remove PolyG sequences (length of 10 or more)", - "type": "boolean" - }, - "adapterqc_mismatches": { - "fa_icon": "fas not-equal", - "description": "The number of mismatches allowed (in percentage) [default: 0.1; 0.0<=x<=0.9]", - "type": "number", - "default": 0.1, - "minimum": 0.0, - "maximum": 0.9 - }, - "save_qc_passed_reads": { - "fa_icon": "fas fa-save", - "type": "boolean", - "default": false, - "description": "Save intermediate QC read files containing all reads that passed the filters.", - "help": "By default, filtered read FastQ files after QC will not be saved to the results directory. Specify this flag (or set it to `true` in your config file) to copy these files to the results directory when complete." - }, - "save_qc_failed_reads": { - "fa_icon": "fas fa-save", - "type": "boolean", - "default": false, - "description": "Save intermediate QC read files containing all reads that failed the filters.", - "help": "By default, FastQ files with reads that failed QC will not be saved to the results directory. Specify this flag (or set to `true` in your config file) to copy these files to the results directory when complete." - } - } - }, - "demux_options": { - "title": "Demux options", - "type": "object", - "properties": { - "demux_mismatches": { - "fa_icon": "fas not-equal", - "description": "The number of mismatches allowed (as a fraction)", - "type": "number", - "default": 0.1, - "minimum": 0.0, - "maximum": 0.9 - }, - "demux_min_length": { - "fa_icon": "fas down-left-and-up-right-to-center", - "description": "The minimum length of the barcode that must overlap when matching", - "help_text": "If you set this argument it will overrule the value from the chosen design", - "type": "integer" - }, - "save_demux_processed_reads": { - "fa_icon": "fas fa-save", - "type": "boolean", - "default": false, - "description": "Save intermediate QC read files containing all reads that contain valid antibody barcodes.", - "help": "By default, FastQ files containing reads with valid antibody barcodes will not be saved to the results directory. Specify this flag (or set to `true` in your config file) to copy these files to the results directory when complete." - }, - "save_demux_failed_reads": { - "fa_icon": "fas fa-save", - "type": "boolean", - "default": false, - "description": "Save intermediate QC read files containing all reads that failed the filters.", - "help": "By default, FastQ files containing reads without valid antibody barcodes will not be saved to the results directory. Specify this flag (or set to `true` in your config file) to copy these files to the results directory when complete." - } - } - }, "pna_demux_options": { "title": "Demux options for PNA data", "type": "object", @@ -237,7 +114,7 @@ "pna_demux_mismatches": { "fa_icon": "fas not-equal", "description": "The number of mismatches allowed in marker barcodes.", - "type": "number", + "type": "integer", "default": 1, "minimum": 0, "maximum": 2 @@ -251,7 +128,7 @@ }, "pna_demux_output_max_chunks": { "fa_icon": "fas fa-arrows-alt-h", - "type": "number", + "type": "integer", "minimum": 1, "maximum": 32, "default": 8, @@ -269,76 +146,23 @@ "save_pna_demux_parquet": { "fa_icon": "fas fa-save", "type": "boolean", - "default": false, "description": "Save intermediate parquet files containing embeddings of all reads that contain valid antibody barcodes.", "help": "By default, parquet files containing embeddings of reads with valid antibody barcodes will not be saved to the results directory. Specify this flag (or set to `true` in your config file) to copy these files to the results directory when complete." }, "save_pna_demux_passed_reads": { "fa_icon": "fas fa-save", "type": "boolean", - "default": false, "description": "Save intermediate FASTQC read files containing all reads that contain valid antibody barcodes.", "help": "By default, FastQ files containing reads with valid antibody barcodes will not be saved to the results directory. Specify this flag (or set to `true` in your config file) to copy these files to the results directory when complete." }, "save_pna_demux_failed_reads": { "fa_icon": "fas fa-save", "type": "boolean", - "default": false, "description": "Save intermediate FASTQC read files containing all reads that do not contain valid antibody barcodes.", "help": "By default, FastQ files containing reads without valid antibody barcodes will not be saved to the results directory. Specify this flag (or set to `true` in your config file) to copy these files to the results directory when complete." } } }, - "collapse_options": { - "title": "Collapse options", - "type": "object", - "properties": { - "markers_ignore": { - "fa_icon": "fas fa-list", - "description": "A list of comma separated antibodies to discard", - "type": "string", - "pattern": "(\\S+)?(,\\S+)*" - }, - "algorithm": { - "fa_icon": "fas code-fork", - "description": "The algorithm to use for collapsing (adjacency will perform error correction using the number of mismatches given)", - "default": "adjacency", - "enum": ["adjacency", "unique"], - "type": "string" - }, - "max_neighbours": { - "fa_icon": "fas circle-nodes", - "description": "The maximum number of neighbors to use when searching for similar sequences. This number depends on the sequence depth and the ratio of erroneous molecules expected. A high value can make the algorithm slower. This is only used when algorithm is set to 'adjacency'", - "default": 60, - "minimum": 1, - "maximum": 250, - "type": "integer", - "hidden": true - }, - "collapse_mismatches": { - "fa_icon": "fas not-equal", - "description": "The number of mismatches allowed when collapsing (adjacency)", - "type": "integer", - "default": 2, - "minimum": 0, - "maximum": 5 - }, - "collapse_min_count": { - "fa_icon": "fas more-than-equal", - "description": "Discard molecules with with a count (reads) lower than this value", - "default": 2, - "minimum": 1, - "type": "integer" - }, - "save_collapsed_reads": { - "fa_icon": "fas fa-save", - "type": "boolean", - "default": false, - "description": "Save an intermediate parquet file containing collapsed read information.", - "help": "By default, intermediate collapsed reads will not be saved to the results directory. Specify this flag (or set to `true` in your config file) to copy these files to the results directory when complete." - } - } - }, "pna_collapse_options": { "title": "Collapse options", "type": "object", @@ -349,7 +173,7 @@ "default": "directional", "enum": ["cluster", "directional"], "type": "string", - "help": "**cluster:** Form networks of connected UMIs (based on hamming distance threshold). Each connected component is a read group. In the above example, all the UMIs are contained in a single connected component and thus there is one read group containing all reads, with ACGT as the ‘selected’ UMI.\n\n**directional (default):** Form networks with edges defined based on hamming distance threshold and node A counts >= (2 * node B counts) - 1. Each connected component is a read group, with the node with the highest counts selected as the top node for the component." + "help": "**cluster:** Form networks of connected UMIs (based on hamming distance threshold). Each connected component is a read group. In the above example, all the UMIs are contained in a single connected component and thus there is one read group containing all reads, with ACGT as the `selected` UMI.\n\n**directional (default):** Form networks with edges defined based on hamming distance threshold and node A counts >= (2 * node B counts) - 1. Each connected component is a read group, with the node with the highest counts selected as the top node for the component." }, "pna_collapse_mismatches": { "fa_icon": "fas not-equal", @@ -362,104 +186,17 @@ "save_pna_collapsed_reads": { "fa_icon": "fas fa-save", "type": "boolean", - "default": false, "description": "Save an intermediate parquet file containing collapsed read information.", "help": "By default, intermediate collapsed reads will not be saved to the results directory. Specify this flag (or set to `true` in your config file) to copy these files to the results directory when complete." } } }, - "graph_options": { - "title": "Options for pixelator graph command.", - "type": "object", - "properties": { - "multiplet_recovery": { - "description": "Activate the multiplet recovery using leiden community detection", - "type": "boolean", - "default": true - }, - "graph_max_refinement_recursion_depth": { - "fa_icon": "fas less-than-equal", - "description": "The number of times a component can be broken down into smaller components during the multiplet recovery process.", - "type": "integer", - "default": 5, - "minimum": 1, - "maximum": 100, - "hidden": true - }, - "graph_max_edges_to_split": { - "fa_icon": "fas less-than-equal", - "description": "Maximum number of edges between the produced components as a result of a component split operation during the multiplet recovery process.", - "type": "integer", - "default": 5, - "minimum": 1, - "maximum": 1000, - "hidden": true - }, - "graph_min_count": { - "fa_icon": "fas less-than-equal", - "description": "Discard edges (pixels) with a count (reads) lower than this, use 1 to disable", - "type": "integer", - "default": 2, - "minimum": 1, - "maximum": 50, - "hidden": true - }, - "save_edgelist": { - "fa_icon": "fas fa-save", - "type": "boolean", - "default": false, - "description": "Save an intermediate CSV file containing the unfiltered graph edge list.", - "help": "By default, the unfiltered edge list will not be saved to the results directory. Specify this flag (or set to `true` in your config file) to copy these files to the results directory when complete." - } - } - }, - "annotate_options": { - "title": "Options for pixelator annotate command.", - "type": "object", - "properties": { - "min_size": { - "description": "The minimum size (pixels) a component/cell can have (disabled by default)", - "type": "integer" - }, - "max_size": { - "description": "The maximum size (pixels) a component/cell can have (disabled by default)", - "type": "integer" - }, - "dynamic_filter": { - "description": "Enable the estimation of dynamic size filters using a log-rank approach.", - "help_text": "Following options are available:\n- both: estimates both minimum and maximum component size\n- min: estimates the minimum component size (or uses {MINIMUM_N_EDGES_CELL_SIZE} edges, whichever is smallest)\n- max: estimates the maximum component size.\n\nNote that this cannot be set at the same time as `--min-size` or `--max-size`.", - "type": "string", - "enum": ["both", "min", "max"], - "default": "min" - }, - "aggregate_calling": { - "description": "Enable aggregate calling, information on potential aggregates will be added to the output data", - "type": "boolean", - "default": true - }, - "save_raw_component_metrics": { - "fa_icon": "fas fa-save", - "type": "boolean", - "default": false, - "description": "Save the raw_component_metrics.csv file from the annotate stage.", - "help": "By default, the raw_component_metrics CSV file after annotate will not be saved to the results directory. Specify this flag (or set to `true` in your config file) to copy these files to the results directory when complete." - }, - "save_annotate_dataset": { - "fa_icon": "fas fa-save", - "type": "boolean", - "default": false, - "description": "Save the PXL dataset after the annotate stage.", - "help": "By default, the PXL file after annotate will not be saved to the results directory unless `--skip_analysis` and `--skip_layout` is passed. Specify this flag (or set to `true` in your config file) to copy these files to the results directory when complete." - } - } - }, "pna_graph_options": { "title": "Options for pixelator graph command on PNA data.", "type": "object", "properties": { "save_pna_graph_pixelfile": { "type": "boolean", - "default": false, "description": "Save the PXL dataset after the graph stage.", "help": "By default, the PXL file after graph will not be saved to the results directory unless `--skip_analysis` and `--skip_layout` is passed. Specify this flag (or set to `true` in your config file) to copy these files to the results directory when complete." }, @@ -469,21 +206,21 @@ "default": true }, "pna_graph_leiden_iterations": { - "type": "number", + "type": "integer", "default": 1, "description": "Number of iterations for the leiden algorithm.", "help": "High values will decrease the variance of the results but increase the runtime" }, "pna_graph_initial_stage_leiden_resolution": { - "default": 1.0, - "minimum": 0.0, + "default": 1, + "minimum": 0, "type": "number", "description": "The resolution parameter for the leiden algorithm at the initial stage.", "help": "This should typically be set higher than the refinement stage resolution." }, "pna_graph_refinement_stage_leiden_resolution": { "default": 0.01, - "minimum": 0.0, + "minimum": 0, "type": "number", "description": "The resolution parameter for the leiden algorithm at the refinement stage.", "help": "This should typically be set lower than the initial stage resolution." @@ -496,49 +233,50 @@ "description": "Discard edges with a read count below given value. Set to 1 to disable filtering." }, "pna_graph_min_component_size_in_refinement": { - "type": "number", + "type": "integer", "default": 1000, "minimum": 1, "description": "The minimum component size to consider for refinement" }, "pna_graph_max_refinement_recursion_depth": { - "type": "number", + "type": "integer", "default": 5, "minimum": 1, "maximum": 100, "description": "The maximum recursion depth for the refinement algorithm. Set to 1 to disable refinement." }, "pna_graph_initial_stage_max_edges_to_remove": { - "type": "number", + "type": "integer", "minimum": 1, "description": "The maximum number of edges to remove between components during the initial stage (iteration == 0) of multiplet recovery." }, "pna_graph_refinement_stage_max_edges_to_remove": { - "type": "number", + "type": "integer", "default": 4, "minimum": 1, "description": "The maximum number of edges to remove between components during the refinement stage (iteration > 0) of multiplet recovery." }, "pna_graph_initial_stage_max_edges_to_remove_relative": { "type": "number", - "minimum": 0.0, + "minimum": 0, "description": "The maximum number of edges to remove between two components relative to the number of nodes in the smaller of the two when during the initial stage (iteration == 0) of multiplet recovery." }, "pna_graph_refinement_stage_max_edges_to_remove_relative": { "type": "number", - "minimum": 0.0, + "minimum": 0, "description": "The maximum number of edges to remove between two components relative to the number of nodes in the smaller of the two when during the refinement stage (iteration > 0) of multiplet recovery." }, "pna_graph_graph_min_component_size_to_prune": { - "type": "number", + "type": "integer", "minimum": 1, "default": 100, "description": "The minimum number of nodes in an potential new components in order for it to be pruned." }, "pna_graph_component_size_min_threshold": { - "type": "number", + "type": "integer", "minimum": 1, - "description": "Components with fewer nodes than this will be filtered from the output data. This is typically not needed. Setting this will disable the automatic size filtering." + "default": 8000, + "description": "Components with fewer nodes than this will be filtered from the output data. Set to null to enable automatic size filtering based on the data." } } }, @@ -553,7 +291,6 @@ "save_pna_denoise_pixelfile": { "fa_icon": "fas fa-save", "type": "boolean", - "default": false, "description": "Save the PXL dataset after the denoise stage.", "help": "By default, the PXL file after denoise will not be saved to the results directory." }, @@ -566,17 +303,17 @@ "type": "number", "description": "The p-value threshold for the a marker to be considered significantly over-expressed in the one-core layer of a component", "default": 0.05, - "minimum": 0.0 + "minimum": 0 }, "pna_denoise_inflate_factor": { "type": "number", "description": "The inflate factor for the number of nodes from over-expressed markers to be removed from the one-core layer of a component", "default": 1.5, - "minimum": 1.0 + "minimum": 1 } } }, - "analysis_options": { + "pna_analysis_options": { "title": "Options for pixelator analysis command.", "type": "object", "properties": { @@ -584,86 +321,9 @@ "description": "Skip analysis step", "type": "boolean" }, - "compute_polarization": { - "description": "Compute polarization scores matrix (clusters by markers)", - "type": "boolean", - "default": true - }, - "compute_colocalization": { - "description": " Compute colocalization scores (marker by marker) for each component", - "type": "boolean", - "default": true - }, - "use_full_bipartite": { - "description": "Use the bipartite graph instead of the one-node projection when computing polarization, coabundance and colocalization scores", - "type": "boolean" - }, - "polarization_transformation": { - "description": "Which transformation to use for the antibody counts when calculating polarity scores.", - "help_text": "- `raw`: use the raw counts.\n- `log1p`: use the log1p-transformed counts.\n", - "type": "string", - "enum": ["raw", "log1p"], - "default": "log1p" - }, - "polarization_n_permutations": { - "type": "integer", - "description": "Set the number of permutations use to compute the empirical z- and p-values for the polarity score", - "default": 50, - "minimum": 5 - }, - "polarization_min_marker_count": { - "type": "integer", - "description": "The minimum number of counts of a marker to calculate the polarity score in the component", - "default": 5, - "minimum": 2 - }, - "colocalization_transformation": { - "type": "string", - "enum": ["raw", "log1p", "rate-diff"], - "default": "rate-diff", - "description": "Select the type of transformation to use on the node by antibody counts matrix when computing colocalization" - }, - "colocalization_neighbourhood_size": { - "type": "integer", - "description": "Select the size of the neighborhood to use when computing colocalization metrics on each component", - "default": 1, - "minimum": 0 - }, - "colocalization_n_permutations": { - "type": "integer", - "description": "Set the number of permutations use to compute the empirical p-value for the colocalization score", - "default": 50, - "minimum": 5 - }, - "colocalization_min_region_count": { - "type": "integer", - "description": "The minimum number of counts in a region for it to be considered valid for computing colocalization", - "default": 5, - "minimum": 0 - }, - "colocalization_min_marker_count": { - "type": "integer", - "description": "The minimum number of counts in a component for it to be considered valid for computing colocalization", - "default": 5, - "minimum": 0 - }, - "save_analysis_dataset": { - "fa_icon": "fas fa-save", - "type": "boolean", - "default": false, - "description": "Save the PXL dataset after the analysis stage.", - "help": "By default, the PXL dataset after the analysis stage will only be saved be saved when `--skip_layout` is passed. Specify this flag (or set to `true` in your config file) to copy these files to the results directory when complete." - } - } - }, - "pna_analysis_options": { - "title": "Options for pixelator analysis command.", - "type": "object", - "properties": { "save_pna_analysis_pixelfile": { "fa_icon": "fas fa-save", "type": "boolean", - "default": false, "description": "Save the PXL dataset after the analysis stage.", "help": "By default, the PXL dataset after the analysis stage will only be saved be saved when `--skip_layout` is passed. Specify this flag (or set to `true` in your config file) to copy these files to the results directory when complete." }, @@ -674,7 +334,8 @@ }, "pna_analysis_compute_k_cores": { "description": "Compute k-core summary tables for each component", - "type": "boolean" + "type": "boolean", + "default": true }, "pna_analysis_proximity_nbr_of_permutations": { "type": "integer", @@ -696,44 +357,17 @@ } } }, - "layout_options": { - "title": "Options for pixelator layout command.", + "pna_layout_options": { + "title": "Options for pixelator single-cell-pna layout command.", "type": "object", "properties": { "skip_layout": { "description": "Skip layout step", "type": "boolean" }, - "no_node_marker_counts": { - "description": "Skip adding marker counts to the layout.", - "type": "boolean", - "default": false - }, - "layout_algorithm": { - "description": "Select a layout algorithm to use. This can be specified as a comma separated list to compute multiple layouts. Possible values are: fruchterman_reingold, fruchterman_reingold_3d, kamada_kawai, kamada_kawai_3d, pmds, pmds_3d, wpmds, wpmds_3d", - "type": "string", - "enum": [ - "fruchterman_reingold", - "fruchterman_reingold_3d", - "kamada_kawai", - "kamada_kawai_3d", - "pmds", - "pmds_3d", - "wpmds", - "wpmds_3d" - ], - "default": "wpmds_3d" - } - } - }, - "pna_layout_options": { - "title": "Options for pixelator single-cell-pna layout command.", - "type": "object", - "properties": { "pna_layout_no_node_marker_counts": { "description": "Skip adding marker counts to the layout.", - "type": "boolean", - "default": false + "type": "boolean" }, "pna_layout_layout_algorithm": { "description": "Select a layout algorithm to use. This can be specified as a comma separated list to compute multiple layouts. Possible values are: pmds, pmds_3d, wpmds, wpmds_3d.", @@ -756,16 +390,6 @@ } } }, - "report_options": { - "title": "Options for pixelator report command.", - "type": "object", - "properties": { - "skip_report": { - "description": "Skip report generation", - "type": "boolean" - } - } - }, "experiment_summary_options": { "title": "Options for experiment summary.", "type": "object", @@ -786,10 +410,14 @@ "description": "Override the container image reference to use for all steps using the `pixelator` command.", "help_text": "Use this to force the pipeline to use a different image version in all steps that use the pixelator command.\nThe pipeline is not guaranteed to work when using different pixelator versions." }, + "experiment_summary_container": { + "type": "string", + "description": "Override the container image to use for the experiment summary step.", + "help_text": "Use this to force the pipeline to use a different image version for the experiment summary step.\nThe pipeline is not guaranteed to work when using different experiment summary versions." + }, "save_all": { "fa_icon": "fas fa-save", "type": "boolean", - "default": false, "description": "Save all intermediate results.", "help": "This option is equivalent of passing all: `--save_* and --save_pna_*` options." }, @@ -937,54 +565,27 @@ { "$ref": "#/$defs/input_output_options" }, - { - "$ref": "#/$defs/amplicon_options" - }, { "$ref": "#/$defs/pna_amplicon_options" }, - { - "$ref": "#/$defs/qc_options" - }, - { - "$ref": "#/$defs/demux_options" - }, { "$ref": "#/$defs/pna_demux_options" }, - { - "$ref": "#/$defs/collapse_options" - }, { "$ref": "#/$defs/pna_collapse_options" }, - { - "$ref": "#/$defs/graph_options" - }, { "$ref": "#/$defs/pna_graph_options" }, { "$ref": "#/$defs/pna_denoise_options" }, - { - "$ref": "#/$defs/annotate_options" - }, - { - "$ref": "#/$defs/analysis_options" - }, { "$ref": "#/$defs/pna_analysis_options" }, - { - "$ref": "#/$defs/layout_options" - }, { "$ref": "#/$defs/pna_layout_options" }, - { - "$ref": "#/$defs/report_options" - }, { "$ref": "#/$defs/experiment_summary_options" }, diff --git a/nf-test.config b/nf-test.config index fc8042d8..d84fa287 100644 --- a/nf-test.config +++ b/nf-test.config @@ -15,7 +15,7 @@ config { profile "test" // list of filenames or patterns that should be trigger a full test run - triggers 'nextflow.config', 'nf-test.config', 'conf/test.config', 'tests/nextflow.config', 'tests/.nftignore' + triggers 'nextflow.config', 'nf-test.config', 'conf/test.config', 'tests/nextflow.config', 'tests/.nftignore', 'assets/schema_input.json', 'nextflow_schema.json' // load the necessary plugins plugins { diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index b7895e64..22cf3cd8 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "Stable", - "datePublished": "2026-01-14T13:21:04+00:00", - "description": "

\n \n \n \"nf-core/pixelator\"\n \n

\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/pixelator)\n[![GitHub Actions CI Status](https://github.com/nf-core/pixelator/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/pixelator/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/pixelator/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/pixelator/actions/workflows/linting.yml)\n[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/pixelator/results)\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.10015112-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.10015112)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/pixelator)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23pixelator-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/pixelator)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/pixelator** is a bioinformatics best-practice analysis pipeline for analysis of data from the\nMolecular Pixelation (MPX) and Proximity Network (PNA) assays. It takes a samplesheet as input and will process your data\nusing `pixelator` to produce a PXL file containing single-cell protein abundance and protein interactomics data.\n\n![](./docs/images/nf-core-pixelator-metromap.svg)\n\nDepending on the input data the pipeline will run different steps.\n\nFor PNA data, the pipeline will run the following steps:\n\n1. Do quality control checks of input reads and build amplicons ([`pixelator single-cell-pna amplicon`](https://github.com/PixelgenTechnologies/pixelator))\n2. Create groups of amplicons based on their marker assignments ([`pixelator single-cell-pna demux`](https://github.com/PixelgenTechnologies/pixelator))\n3. Derive original molecules to use as edge list downstream by error correcting, and counting input amplicons ([`pixelator single-cell-pna collapse`](https://github.com/PixelgenTechnologies/pixelator))\n4. Compute the components of the graph from the edge list in order to create putative cells ([`pixelator single-cell-pna graph`](https://github.com/PixelgenTechnologies/pixelator))\n5. Denoise the cell graphs ([`pixelator single-cell-pna denoise`](https://github.com/PixelgenTechnologies/pixelator))\n6. Analyze the spatial information in the cell graphs ([`pixelator single-cell-pna analysis`](https://github.com/PixelgenTechnologies/pixelator))\n7. Generate 3D graph layouts for visualization of cells ([`pixelator single-cell-pna layout`](https://github.com/PixelgenTechnologies/pixelator))\n8. Proxiome Experiment Summary generation using [PixelatorES](https://github.com/PixelgenTechnologies/pixelatorES)\n\nFor MPX data, the pipeline will run the following steps:\n\n1. Build an amplicons from the input reads ([`pixelator single-cell-mpx amplicon`](https://github.com/PixelgenTechnologies/pixelator))\n2. Read QC and filtering, correctness of the pixel binding sequence sequences ([`pixelator single-cell-mpx preqc | pixelator adapterqc`](https://github.com/PixelgenTechnologies/pixelator))\n3. Assign a marker (barcode) to each read ([`pixelator single-cell-mpx demux`](https://github.com/PixelgenTechnologies/pixelator))\n4. Error correction, duplicate removal, compute read counts ([`pixelator single-cell-mpx collapse`](https://github.com/PixelgenTechnologies/pixelator))\n5. Compute the components of the graph from the edge list in order to create putative cells ([`pixelator single-cell-mpx graph`](https://github.com/PixelgenTechnologies/pixelator))\n6. Call and annotate cells ([`pixelator single-cell-mpx annotate`](https://github.com/PixelgenTechnologies/pixelator))\n7. Analyze the cells for polarization and colocalization ([`pixelator single-cell-mpx analysis`](https://github.com/PixelgenTechnologies/pixelator))\n8. Generate 3D graph layouts for visualization of cells ([`pixelator single-cell-mpx layout`](https://github.com/PixelgenTechnologies/pixelator))\n9. Report generation ([`pixelator single-cell-mpx report`](https://github.com/PixelgenTechnologies/pixelator))\n\n> [!WARNING]\n> Since Nextflow 23.07.0-edge, Nextflow no longer mounts the host's home directory when using Apptainer or Singularity.\n> This causes issues in some dependencies. As a workaround, you can revert to the old behavior by setting the environment variable\n> `NXF_APPTAINER_HOME_MOUNT` or `NXF_SINGULARITY_HOME_MOUNT` to `true` in the machine from which you launch the pipeline.\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst, prepare a samplesheet with your input data that looks as follows (the exact values you need to input depend on the design and panel you are using - please see [https://nf-co.re/pixelator/usage](https://nf-co.re/pixelator/usage) for more details):\n\n`samplesheet.csv`:\n\n```csv\nsample,sample_alias,condition,design,panel,fastq_1,fastq_2\nsample1,s1,control,pna-2,proxiome-immuno-155-v2,sample1_R1_001.fastq.gz,sample1_R2_001.fastq.gz\n```\n\nEach row represents a sample and gives the design, a panel file and the input fastq files.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/pixelator \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> This version of the pipeline does not support conda environments, due to issues with upstream dependencies.\n> This means you cannot use the `conda` and `mamba` profiles. Please use `docker` or `singularity` instead.\n> We hope to add support for conda environments in the future.\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/pixelator/usage) and the [parameter documentation](https://nf-co.re/pixelator/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/pixelator/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/pixelator/output).\n\n## Credits\n\nnf-core/pixelator was originally written for [Pixelgen Technologies AB](https://www.pixelgen.com/) by:\n\n- Florian De Temmerman\n- Johan Dahlberg\n- Alvaro Martinez Barrio\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#pixelator` channel](https://nfcore.slack.com/channels/pixelator) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/pixelator for your analysis, please cite it using the following doi: [10.5281/zenodo.10015112](https://doi.org/10.5281/zenodo.10015112)\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n\nYou can cite the molecular pixelation technology as follows:\n\n> **Molecular pixelation: spatial proteomics of single cells by sequencing.**\n>\n> Filip Karlsson, Tomasz Kallas, Divya Thiagarajan, Max Karlsson, Maud Schweitzer, Jose Fernandez Navarro, Louise Leijonancker, Sylvain Geny, Erik Pettersson, Jan Rhomberg-Kauert, Ludvig Larsson, Hanna van Ooijen, Stefan Petkov, Marcela Gonz\u00e1lez-Granillo, Jessica Bunz, Johan Dahlberg, Michele Simonetti, Prajakta Sathe, Petter Brodin, Alvaro Martinez Barrio & Simon Fredriksson\n>\n> _Nat Methods._ 2024 May 08. doi: [10.1038/s41592-024-02268-9](https://doi.org/10.1038/s41592-024-02268-9)\n\n> **Single-Cell Protein Interactomes by the Proximity Network Assay.**\n>\n> Filip Karlsson, Michele Simonetti, Christina Galonska, Max Karlsson, Hanna van Ooijen, Tomasz Kallas, Divya Thiagarajan, Maud Schweitzer, Ludvig Larsson, Vincent van Hoef, Pouria Tajvar, Johan Dahlberg, Florian De Temmerman, Louise Leijonancker, Sylvain Geny, Rikard Forlin, Erika Negrini, Stefan Petkov, Lovisa Franz\u00e9n, Jessica Bunz, Christine Moge, Henrik Everberg, Petter Brodin, Alvaro Martinez Barrio, Simon Fredriksson\n>\n> _bioRxiv_ 2025.06.19.660329; doi: [10.1101/2025.06.19.660329](https://doi.org/10.1101/2025.06.19.660329)\n", + "datePublished": "2026-02-23T07:30:51+00:00", + "description": "

\n \n \n \"nf-core/pixelator\"\n \n

\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/pixelator)\n[![GitHub Actions CI Status](https://github.com/nf-core/pixelator/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/pixelator/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/pixelator/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/pixelator/actions/workflows/linting.yml)\n[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/pixelator/results)\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.10015112-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.10015112)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/pixelator)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23pixelator-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/pixelator)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/pixelator** is a bioinformatics best-practice analysis pipeline for analysis of data from the\nProximity Network (PNA) assay. It takes a samplesheet as input and will process your data\nusing `pixelator` to produce a PXL file containing single-cell protein abundance and protein interactomics data.\n\n![](./docs/images/nf-core-pixelator-metromap.svg)\n\nThe pipeline will run the following steps:\n\n1. Do quality control checks of input reads and build amplicons ([`pixelator single-cell-pna amplicon`](https://github.com/PixelgenTechnologies/pixelator))\n2. Create groups of amplicons based on their marker assignments ([`pixelator single-cell-pna demux`](https://github.com/PixelgenTechnologies/pixelator))\n3. Derive original molecules to use as edge list downstream by error correcting, and counting input amplicons ([`pixelator single-cell-pna collapse`](https://github.com/PixelgenTechnologies/pixelator))\n4. Compute the components of the graph from the edge list in order to create putative cells ([`pixelator single-cell-pna graph`](https://github.com/PixelgenTechnologies/pixelator))\n5. Denoise the cell graphs ([`pixelator single-cell-pna denoise`](https://github.com/PixelgenTechnologies/pixelator))\n6. Analyze the spatial information in the cell graphs ([`pixelator single-cell-pna analysis`](https://github.com/PixelgenTechnologies/pixelator))\n7. Generate 3D graph layouts for visualization of cells ([`pixelator single-cell-pna layout`](https://github.com/PixelgenTechnologies/pixelator))\n8. Proxiome Experiment Summary generation using [PixelatorES](https://github.com/PixelgenTechnologies/pixelatorES)\n\n> [!NOTE]\n> If you are looking to run the pipeline with Molecular Pixelation (MPX) data. Please refer to the [release 2.3.1](https://nf-co.re/pixelator/2.3.1/),\n> which is the last version to support that data type.\n\n> [!WARNING]\n> Since Nextflow 23.07.0-edge, Nextflow no longer mounts the host's home directory when using Apptainer or Singularity.\n> This causes issues in some dependencies. As a workaround, you can revert to the old behavior by setting the environment variable\n> `NXF_APPTAINER_HOME_MOUNT` or `NXF_SINGULARITY_HOME_MOUNT` to `true` in the machine from which you launch the pipeline.\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nFirst, prepare a samplesheet with your input data that looks as follows (the exact values you need to input depend on the design and panel you are using - please see [https://nf-co.re/pixelator/usage](https://nf-co.re/pixelator/usage) for more details):\n\n`samplesheet.csv`:\n\n```csv\nsample,sample_alias,condition,design,panel,fastq_1,fastq_2\nsample1,s1,control,pna-2,proxiome-immuno-155-v2,sample1_R1_001.fastq.gz,sample1_R2_001.fastq.gz\n```\n\nEach row represents a sample and gives the design, a panel file and the input fastq files.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/pixelator \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> This version of the pipeline does not support conda environments, due to issues with upstream dependencies.\n> This means you cannot use the `conda` and `mamba` profiles. Please use `docker` or `singularity` instead.\n> We hope to add support for conda environments in the future.\n\n> [!WARNING]\n> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; see [docs](https://nf-co.re/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/pixelator/usage) and the [parameter documentation](https://nf-co.re/pixelator/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/pixelator/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/pixelator/output).\n\n## Credits\n\nnf-core/pixelator was originally written for [Pixelgen Technologies AB](https://www.pixelgen.com/) by:\n\n- Florian De Temmerman\n- Johan Dahlberg\n- Alvaro Martinez Barrio\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#pixelator` channel](https://nfcore.slack.com/channels/pixelator) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/pixelator for your analysis, please cite it using the following doi: [10.5281/zenodo.10015112](https://doi.org/10.5281/zenodo.10015112)\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n\nYou can cite the Proximity Network Technology as follows:\n\n> **Single-Cell Protein Interactomes by the Proximity Network Assay.**\n>\n> Filip Karlsson, Michele Simonetti, Christina Galonska, Max Karlsson, Hanna van Ooijen, Tomasz Kallas, Divya Thiagarajan, Maud Schweitzer, Ludvig Larsson, Vincent van Hoef, Pouria Tajvar, Johan Dahlberg, Florian De Temmerman, Louise Leijonancker, Sylvain Geny, Rikard Forlin, Erika Negrini, Stefan Petkov, Lovisa Franz\u00e9n, Jessica Bunz, Christine Moge, Henrik Everberg, Petter Brodin, Alvaro Martinez Barrio, Simon Fredriksson\n>\n> _bioRxiv_ 2025.06.19.660329; doi: [10.1101/2025.06.19.660329](https://doi.org/10.1101/2025.06.19.660329)\n", "hasPart": [ { "@id": "main.nf" @@ -102,7 +102,7 @@ }, "mentions": [ { - "@id": "#24d1244e-92b7-4266-8edf-d55eb69ec6b0" + "@id": "#9f9abf50-29d2-4cd8-be9c-9f2623f36243" } ], "name": "nf-core/pixelator" @@ -131,17 +131,17 @@ ], "creator": [ { - "@id": "https://orcid.org/0000-0003-2702-1103" + "@id": "https://orcid.org/0009-0006-0086-2470" }, { - "@id": "https://orcid.org/0009-0006-0086-2470" + "@id": "https://orcid.org/0000-0003-2702-1103" }, { "@id": "#johan.dahlberg@pixelgen.tech" } ], "dateCreated": "", - "dateModified": "2026-01-14T14:21:04Z", + "dateModified": "2026-02-23T08:30:51Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -175,10 +175,10 @@ }, "url": [ "https://github.com/nf-core/pixelator", - "https://nf-co.re/pixelator/2.3.1/" + "https://nf-co.re/pixelator/3.0.0/" ], "version": [ - "2.3.1" + "3.0.0" ] }, { @@ -194,11 +194,11 @@ "version": "!>=25.04.0" }, { - "@id": "#24d1244e-92b7-4266-8edf-d55eb69ec6b0", + "@id": "#9f9abf50-29d2-4cd8-be9c-9f2623f36243", "@type": "TestSuite", "instance": [ { - "@id": "#48e43019-b9d7-4fae-a981-99fed04b7987" + "@id": "#941d74f8-288a-4b81-828b-bb4ed6d64d62" } ], "mainEntity": { @@ -207,7 +207,7 @@ "name": "Test suite for nf-core/pixelator" }, { - "@id": "#48e43019-b9d7-4fae-a981-99fed04b7987", + "@id": "#941d74f8-288a-4b81-828b-bb4ed6d64d62", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/pixelator", "resource": "repos/nf-core/pixelator/actions/workflows/nf-test.yml", @@ -340,18 +340,18 @@ "name": "nf-core", "url": "https://nf-co.re/" }, - { - "@id": "https://orcid.org/0000-0003-2702-1103", - "@type": "Person", - "email": "adrien.coulier@pixelgen.com", - "name": "Adrien Coulier" - }, { "@id": "https://orcid.org/0009-0006-0086-2470", "@type": "Person", "email": "florian.detemmerman@pixelgen.com", "name": "Florian De Temmerman" }, + { + "@id": "https://orcid.org/0000-0003-2702-1103", + "@type": "Person", + "email": "adrien.coulier@pixelgen.com", + "name": "Adrien Coulier" + }, { "@id": "#johan.dahlberg@pixelgen.tech", "@type": "Person", diff --git a/subworkflows/local/generate_reports/main.nf b/subworkflows/local/generate_reports/main.nf deleted file mode 100644 index cf208f1e..00000000 --- a/subworkflows/local/generate_reports/main.nf +++ /dev/null @@ -1,134 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IMPORT MODULES / SUBWORKFLOWS / FUNCTIONS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -include { PIXELATOR_REPORT } from '../../../modules/local/pixelator/single-cell-mpx/report/main' - - -/* -======================================================================================== - SUBWORKFLOW TO GENERATE PIXELATOR REPORTS -======================================================================================== -*/ - -workflow GENERATE_REPORTS { - take: - panel_files // channel: [meta, path(panel_file) | []] - amplicon_data // channel: [meta, [path, ...]] - preqc_data // channel: [meta, [path, ...]] - adapterqc_data // channel: [meta, [path, ...]] - demux_data // channel: [meta, [path, ...]] - collapse_data // channel: [meta, [path, ...]] - graph_data // channel: [meta, [path, ...]] - annotate_data // channel: [meta, [path, ...]] - analysis_data // channel: [meta, [path, ...]] - layout_data // channel: [meta, [path, ...]] - - main: - // Combine meta maps for all input samples - ch_meta_col = panel_files - .map { meta, _path -> [meta.id, meta] } - .groupTuple() - .map { id, data -> - if (data instanceof List) { - def newMeta = [:] - data.forEach { newMeta += it } - return [id, newMeta] - } - return [id, data] - } - - ch_panel_col = panel_files.map { meta, data -> [meta.id, data] } - - // - // These first subcommands each return two files per sample used by the reporting - // A json file with stats and a command invocation metadata json file - // - ch_amplicon_col = amplicon_data.map { meta, data -> [meta.id, data] } - ch_preqc_col = preqc_data.map { meta, data -> [meta.id, data] } - ch_adapterqc_col = adapterqc_data.map { meta, data -> [meta.id, data] } - ch_demux_col = demux_data.map { meta, data -> [meta.id, data] } - ch_collapse_col = collapse_data.map { meta, data -> [meta.id, data] } - ch_graph_col = graph_data.map { meta, data -> [meta.id, data] } - ch_annotate_col = annotate_data.map { meta, data -> [meta.id, data] } - ch_analysis_col = analysis_data.map { meta, data -> [meta.id, data] } - ch_layout_col = layout_data.map { meta, data -> [meta.id, data] } - - // - // Combine all inputs and group them, then split them up again. - // This is needed to have the per subcommand outputs in the sample order - // - // ch_report_data: [ - // [ - // meta, panel_files, - // [amplicon files...], - // [preqc files...], - // [adapterqc files...], - // [demux files...], - // [collapse files...], - // [cluster files], - // [annotate files...], - // [analysis files...] - // ], - // [ same structure repeated for each sample ] - // ] - - ch_report_data = ch_meta_col - .concat(ch_panel_col) - .concat(ch_amplicon_col) - .concat(ch_preqc_col) - .concat(ch_adapterqc_col) - .concat(ch_demux_col) - .concat(ch_collapse_col) - .concat(ch_graph_col) - .concat(ch_annotate_col) - .concat(ch_analysis_col) - .concat(ch_layout_col) - .groupTuple(size: 10) - - // - // Split up everything per stage so we can recreate the expected directory structure for - // `pixelator single-cell report` using stageAs for each stage - // - // These ch__grouped channels all emit a list of input files for each sample in the samplesheet - // The channels will emit values in the same order so eg. the first list of files from each ch__grouped - // channel will match the same sample from the samplesheet. - - // If no `panel_file` (data[1]) is given we need to pass in `panel` from the samplesheet instead - // - ch_report_inputs = ch_report_data.multiMap { _id, data -> - panels: [data[0], data[1], data[1] ? null : data[0].panel] - amplicon: data[2] ? data[2].flatten() : [] - preqc: data[3] ? data[3].flatten() : [] - adapterqc: data[4] ? data[4].flatten() : [] - demux: data[5] ? data[5].flatten() : [] - collapse: data[6] ? data[6].flatten() : [] - graph: data[7] ? data[7].flatten() : [] - annotate: data[8] ? data[8].flatten() : [] - analysis: data[9] ? data[9].flatten() : [] - layout: data[10] ? data[10].flatten() : [] - } - - // - // MODULE: Run pixelator single-cell report for each samples - // - // NB: These channels need to be split per stage to allow PIXELATOR_REPORT to - // use stageAs directives to reorder the inputs and prevent filename collisions - PIXELATOR_REPORT( - ch_report_inputs.panels, - ch_report_inputs.amplicon, - ch_report_inputs.preqc, - ch_report_inputs.adapterqc, - ch_report_inputs.demux, - ch_report_inputs.collapse, - ch_report_inputs.graph, - ch_report_inputs.annotate, - ch_report_inputs.analysis, - ch_report_inputs.layout - ) - - emit: - pixelator_reports = PIXELATOR_REPORT.out.reports -} diff --git a/subworkflows/local/generate_reports/tests/main.nf.test b/subworkflows/local/generate_reports/tests/main.nf.test deleted file mode 100644 index cccd8dd8..00000000 --- a/subworkflows/local/generate_reports/tests/main.nf.test +++ /dev/null @@ -1,203 +0,0 @@ -nextflow_workflow { - name "Test Subworkflow GENERATE_REPORTS" - script "../main.nf" - workflow "GENERATE_REPORTS" - - test("Test MPX Generate reports - stub") { - - options "-stub" - - when { - workflow { - """ - def meta = [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ] - - input[0] = Channel.of([ - meta, - [] - ]) - - input[1] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/amplicon/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/amplicon/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - ]) - input[2] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.processed.fastq.gz', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - ]) - input[3] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/adapterqc/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/adapterqc/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - ]) - input[4] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - ]) - input[5] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/collapse/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/collapse/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - ]) - input[6] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/graph/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/graph/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/graph/sample01_1k_pbmcs_scsp_v1_immunology1.edgelist.parquet', checkIfExists: true), - ] - ]) - input[7] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.annotate.dataset.pxl', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.raw_components_metrics.csv.gz', checkIfExists: true), - ] - ]) - input[8] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.analysis.dataset.pxl', checkIfExists: true), - ] - ]) - input[9] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/layout/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/layout/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/layout/sample01_1k_pbmcs_scsp_v1_immunology1.layout.dataset.pxl', checkIfExists: true), - ] - ]) - """ - } - } - - then { - assertAll( - { assert workflow.success}, - { assert snapshot(workflow.out).match() } - ) - } - } - - test("Test MPX Generate reports - SCSP v1 | Immunology-I") { - when { - params { - save_all = true - outdir = "$outputDir" - } - workflow { - """ - def meta = [ id:'sample01_1k_pbmcs_scsp_v1_immunology1', design:'D21', panel:'human-sc-immunology-spatial-proteomics-1', technology:'mpx' ] - - input[0] = Channel.of([ - meta, - [] - ]) - - input[1] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/amplicon/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/amplicon/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - ]) - input[2] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.processed.fastq.gz', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/preqc/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - ]) - input[3] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/adapterqc/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/adapterqc/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - ]) - input[4] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/demux/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - ]) - input[5] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/collapse/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/collapse/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - ] - ]) - input[6] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/graph/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/graph/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/graph/sample01_1k_pbmcs_scsp_v1_immunology1.edgelist.parquet', checkIfExists: true), - ] - ]) - input[7] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.annotate.dataset.pxl', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/annotate/sample01_1k_pbmcs_scsp_v1_immunology1.raw_components_metrics.csv.gz', checkIfExists: true), - ] - ]) - input[8] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/analysis/sample01_1k_pbmcs_scsp_v1_immunology1.analysis.dataset.pxl', checkIfExists: true), - ] - ]) - input[9] = Channel.of([ - meta, - [ - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/layout/sample01_1k_pbmcs_scsp_v1_immunology1.meta.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/layout/sample01_1k_pbmcs_scsp_v1_immunology1.report.json', checkIfExists: true), - file(params.pipelines_testdata_base_path + 'testdata/mpx/modules/layout/sample01_1k_pbmcs_scsp_v1_immunology1.layout.dataset.pxl', checkIfExists: true), - ] - ]) - """ - } - } - - then { - def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) - assertAll( - { assert workflow.success }, - { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), - // All stable path name, with a relative path - stable_name, - removeNextflowVersion("$outputDir/pipeline_info/nf_core_pixelator_software_mqc_versions.yml"), - ).match() } - ) - } - } -} diff --git a/subworkflows/local/generate_reports/tests/main.nf.test.snap b/subworkflows/local/generate_reports/tests/main.nf.test.snap deleted file mode 100644 index 9dccf52d..00000000 --- a/subworkflows/local/generate_reports/tests/main.nf.test.snap +++ /dev/null @@ -1,53 +0,0 @@ -{ - "Test MPX Generate reports - SCSP v1 | Immunology-I": { - "content": [ - 1, - [ - "pixelator", - "pixelator/logs", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1", - "pixelator/logs/sample01_1k_pbmcs_scsp_v1_immunology1/sample01_1k_pbmcs_scsp_v1_immunology1.pixelator-report.log", - "pixelator/sample01_1k_pbmcs_scsp_v1_immunology1.qc-report.html" - ], - null - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.0" - }, - "timestamp": "2025-11-07T10:11:08.957283626" - }, - "Test MPX Generate reports - stub": { - "content": [ - { - "0": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "pixelator_reports": [ - [ - { - "id": "sample01_1k_pbmcs_scsp_v1_immunology1", - "design": "D21", - "panel": "human-sc-immunology-spatial-proteomics-1", - "technology": "mpx" - }, - "sample01_1k_pbmcs_scsp_v1_immunology1.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-11T13:57:27.54448776" - } -} \ No newline at end of file diff --git a/subworkflows/local/mpx/main.nf b/subworkflows/local/mpx/main.nf deleted file mode 100644 index 174c07da..00000000 --- a/subworkflows/local/mpx/main.nf +++ /dev/null @@ -1,188 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IMPORT MODULES / SUBWORKFLOWS / FUNCTIONS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ -include { paramsSummaryMap } from 'plugin/nf-schema' -include { paramsSummaryMultiqc } from '../../nf-core/utils_nfcore_pipeline' -include { softwareVersionsToYAML } from '../../nf-core/utils_nfcore_pipeline' -include { methodsDescriptionText } from '../../local/utils_nfcore_pixelator_pipeline' - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - CONFIG FILES -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IMPORT LOCAL MODULES/SUBWORKFLOWS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -// -// SUBWORKFLOW: Consisting of a mix of local and nf-core/modules -// -include { GENERATE_REPORTS } from '../../local/generate_reports/main' - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IMPORT NF-CORE MODULES/SUBWORKFLOWS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -// -// MODULE: Installed directly from nf-core/modules -// - -/* -======================================================================================== - IMPORT CUSTOM MODULES/SUBWORKFLOWS -======================================================================================== -*/ - -// -// MODULE: Defined locally -// -include { PIXELATOR_AMPLICON } from '../../../modules/local/pixelator/single-cell-mpx/amplicon' -include { PIXELATOR_QC } from '../../../modules/local/pixelator/single-cell-mpx/qc' -include { PIXELATOR_DEMUX } from '../../../modules/local/pixelator/single-cell-mpx/demux' -include { PIXELATOR_COLLAPSE } from '../../../modules/local/pixelator/single-cell-mpx/collapse' -include { PIXELATOR_GRAPH } from '../../../modules/local/pixelator/single-cell-mpx/graph' -include { PIXELATOR_ANALYSIS } from '../../../modules/local/pixelator/single-cell-mpx/analysis' -include { PIXELATOR_ANNOTATE } from '../../../modules/local/pixelator/single-cell-mpx/annotate' -include { PIXELATOR_LAYOUT } from '../../../modules/local/pixelator/single-cell-mpx/layout' - -/* -======================================================================================== - RUN MAIN WORKFLOW -======================================================================================== -*/ - -workflow MPX { - take: - fastq // channel: [ meta, [path(sample_1.fq), path(sample_2.fq)] ] - panel_files // channel [ meta, path(panel_file) | ] - - main: - - ch_amplicon_input = fastq.map { meta, reads -> - { - [meta, reads] - } - } - - // - // MODULE: Run pixelator single-cell-mpx amplicon - // - PIXELATOR_AMPLICON ( fastq ) - ch_merged = PIXELATOR_AMPLICON.out.merged - - ch_input_reads = ch_merged - - // - // MODULE: Run pixelator single-cell-mpx preqc & pixelator single-cell-mpx adapterqc - // - PIXELATOR_QC ( ch_input_reads ) - ch_qc = PIXELATOR_QC.out.processed - - ch_fq_and_panel = ch_qc - .join(panel_files, failOnMismatch:true, failOnDuplicate:true) - .map { meta, fq, panel_file -> [meta, fq, panel_file, panel_file ? null : meta.panel ] } - - // - // MODULE: Run pixelator single-cell-mpx demux - // - PIXELATOR_DEMUX ( ch_fq_and_panel ) - ch_demuxed = PIXELATOR_DEMUX.out.processed - - ch_demuxed_and_panel = ch_demuxed - .join(panel_files, failOnMismatch:true, failOnDuplicate:true) - .map { meta, demuxed, panel_file -> [meta, demuxed, panel_file, panel_file ? null : meta.panel ] } - - // - // MODULE: Run pixelator single-cell-mpx collapse - // - PIXELATOR_COLLAPSE ( ch_demuxed_and_panel ) - ch_collapsed = PIXELATOR_COLLAPSE.out.collapsed - - // - // MODULE: Run pixelator single-cell-mpx graph - // - PIXELATOR_GRAPH ( ch_collapsed ) - ch_clustered = PIXELATOR_GRAPH.out.edgelist - - ch_clustered_and_panel = ch_clustered - .join(panel_files, failOnMismatch:true, failOnDuplicate:true) - .map { meta, clustered, panel_file -> [meta, clustered, panel_file, panel_file ? null : meta.panel ] } - - // - // MODULE: Run pixelator single-cell-mpx annotate - // - PIXELATOR_ANNOTATE ( ch_clustered_and_panel ) - ch_annotated = PIXELATOR_ANNOTATE.out.dataset - - // - // MODULE: Run pixelator single-cell-mpx analysis - // - PIXELATOR_ANALYSIS ( ch_annotated ) - ch_analysed = PIXELATOR_ANALYSIS.out.dataset - - - // - // MODULE: Run pixelator single-cell-mpx layout - // - ch_layout_input = params.skip_analysis ? ch_annotated : ch_analysed - PIXELATOR_LAYOUT ( ch_layout_input ) - _ch_layout = PIXELATOR_LAYOUT.out.dataset - - // Prepare all data needed by reporting for each pixelator step - - ch_amplicon_data = PIXELATOR_AMPLICON.out.report_json - .concat(PIXELATOR_AMPLICON.out.metadata) - .groupTuple(size: 2) - - ch_preqc_data = PIXELATOR_QC.out.preqc_report_json - .concat(PIXELATOR_QC.out.preqc_metadata) - .groupTuple(size: 2) - - ch_adapterqc_data = PIXELATOR_QC.out.adapterqc_report_json - .concat(PIXELATOR_QC.out.adapterqc_metadata) - .groupTuple(size: 2) - - ch_demux_data = PIXELATOR_DEMUX.out.report_json - .concat(PIXELATOR_DEMUX.out.metadata) - .groupTuple(size: 2) - - ch_collapse_data = PIXELATOR_COLLAPSE.out.report_json - .concat(PIXELATOR_COLLAPSE.out.metadata) - .groupTuple(size: 2) - - ch_cluster_data = PIXELATOR_GRAPH.out.all_results - ch_annotate_data = PIXELATOR_ANNOTATE.out.all_results - ch_analysis_data = PIXELATOR_ANALYSIS.out.all_results - ch_layout_data = PIXELATOR_LAYOUT.out.report_json - .concat(PIXELATOR_LAYOUT.out.metadata) - .groupTuple(size: 2) - - GENERATE_REPORTS( - panel_files, - ch_amplicon_data, - ch_preqc_data, - ch_adapterqc_data, - ch_demux_data, - ch_collapse_data, - ch_cluster_data, - ch_annotate_data, - ch_analysis_data, - ch_layout_data - ) - - // TODO: Add MultiQC when plugins are ready -} - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - THE END -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ diff --git a/subworkflows/local/utils_nfcore_pixelator_pipeline/main.nf b/subworkflows/local/utils_nfcore_pixelator_pipeline/main.nf index ca5b063d..805172af 100644 --- a/subworkflows/local/utils_nfcore_pixelator_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_pixelator_pipeline/main.nf @@ -46,7 +46,7 @@ workflow PIPELINE_INITIALISATION { // Thrown an error if the pipeline is run with conda or mamba // as this is not supported in the pipeline at the moment if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - exit(1, "ERROR: Conda and Mamba are not supported in the pipeline at the moment. Please use docker or singularity.") + error("ERROR: Conda and Mamba are not supported in the pipeline at the moment. Please use docker or singularity.") } // @@ -355,7 +355,7 @@ def validate_panel(LinkedHashMap meta, HashSet options) { if (!options.contains(meta.panel)) { def options_list_str = " - ${options.join("\n - ")}" - exit(1, "Please check input samplesheet -> panel field does not contains a valid key!\n\nInput: ${meta.panel}\nValid options:\n${options_list_str}") + error("Please check input samplesheet -> panel field does not contains a valid key!\n\nInput: ${meta.panel}\nValid options:\n${options_list_str}") } return meta @@ -372,7 +372,7 @@ def validate_design(LinkedHashMap meta, HashSet options) { if (!options.contains(meta.design)) { def options_list_str = " - ${options.join("\n - ")}" - exit(1, "Please check input samplesheet -> design field does not contains a valid key!\n\nInput: ${meta.design}\nValid options:\n${options_list_str}") + error("Please check input samplesheet -> design field does not contains a valid key!\n\nInput: ${meta.design}\nValid options:\n${options_list_str}") } return meta @@ -409,7 +409,7 @@ def get_data_basedir(URI samplesheet, String input_basedir) { def f = file(input_basedir) if (!f.exists()) { - exit(1, "ERROR: data path passed with --input_basedir does not exist!") + error("ERROR: data path passed with --input_basedir does not exist!") } def data_root = null @@ -437,11 +437,11 @@ def validate_input_samplesheet(URI samplesheetUrl, items) { def fq1_abs = resolve_relative_path(fq[0], samplesheetUrl) if (panel_file_abs && !file(panel_file_abs).exists()) { - exit(1, "ERROR: Please check input samplesheet -> panel_file does not exist!\n${panel_file_abs}") + error("ERROR: Please check input samplesheet -> panel_file does not exist!\n${panel_file_abs}") } if (!file(fq1_abs).exists()) { - exit(1, "ERROR: Please check input samplesheet -> fastq_1 does not exist!\n${fq1_abs}") + error("ERROR: Please check input samplesheet -> fastq_1 does not exist!\n${fq1_abs}") } def reads = [fq1_abs] @@ -450,7 +450,7 @@ def validate_input_samplesheet(URI samplesheetUrl, items) { def fq2_abs = resolve_relative_path(fq[1], samplesheetUrl) if (fq2_abs && !file(fq2_abs).exists()) { - exit(1, "ERROR: Please check input samplesheet -> fastq_2 does not exist!\n${fq2_abs}") + error("ERROR: Please check input samplesheet -> fastq_2 does not exist!\n${fq2_abs}") } reads += [fq2_abs] @@ -468,7 +468,9 @@ def detect_technology(LinkedHashMap meta) { newMeta = meta + [technology: 'pna'] } else { - newMeta = meta + [technology: 'mpx'] + error("ERROR: unsupported design: ${meta.design}") } + // TODO For now keep this around, in order to introduce + // other technology choices later. return newMeta } diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf index acb39724..1df8b76f 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -38,7 +38,7 @@ workflow UTILS_NFSCHEMA_PLUGIN { } log.info paramsHelp( help_options, - params.help instanceof String ? params.help : "", + (params.help instanceof String && params.help != "true") ? params.help : "", ) exit 0 } diff --git a/tests/mpx.nf.test b/tests/mpx.nf.test deleted file mode 100644 index 9307c080..00000000 --- a/tests/mpx.nf.test +++ /dev/null @@ -1,64 +0,0 @@ -nextflow_pipeline { - - name "Test MPX pipeline" - script "../main.nf" - - test("Params: default") { - - when { - params { - pipelines_testdata_base_path = "https://raw.githubusercontent.com/nf-core/test-datasets/pixelator/" - input = "$pipelines_testdata_base_path/samplesheet/mpx/samplesheet_mpx_scsp_v1_immunology1.csv" - input_basedir = "$pipelines_testdata_base_path/testdata/mpx/" - outdir = "$outputDir" - save_all = true - } - } - - then { - // stable_name: All files + folders in ${params.outdir}/ with a stable name - def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) - - assertAll( - { assert workflow.success}, - { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), - // pipeline versions.yml file for multiqc from which Nextflow version is removed because we tests pipelines on multiple Nextflow versions - removeNextflowVersion("$outputDir/pipeline_info/nf_core_pixelator_software_mqc_versions.yml"), - // All stable path name, with a relative path - stable_name - ).match() } - ) - } - } - - test("Params: default - stub") { - - options "-stub" - - when { - params { - pipelines_testdata_base_path = "https://raw.githubusercontent.com/nf-core/test-datasets/pixelator/" - input = "$pipelines_testdata_base_path/samplesheet/mpx/samplesheet_mpx_scsp_v1_immunology1.csv" - input_basedir = "$pipelines_testdata_base_path/testdata/mpx/" - outdir = "$outputDir" - } - } - - then { - // stable_name: All files + folders in ${params.outdir}/ with a stable name - def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) - assertAll( - { assert workflow.success}, - { assert snapshot( - // Number of successful tasks - workflow.trace.succeeded().size(), - // All stable path name, with a relative path - stable_name, - removeNextflowVersion("$outputDir/pipeline_info/nf_core_pixelator_software_mqc_versions.yml"), - ).match() } - ) - } - } -} diff --git a/tests/mpx.nf.test.snap b/tests/mpx.nf.test.snap deleted file mode 100644 index d05ac875..00000000 --- a/tests/mpx.nf.test.snap +++ /dev/null @@ -1,278 +0,0 @@ -{ - "Params: default - stub": { - "content": [ - 10, - [ - "pipeline_info", - "pipeline_info/nf_core_pixelator_software_mqc_versions.yml", - "pipeline_info/samplesheet_mpx_scsp_v1_immunology1.csv", - "pixelator", - "pixelator/adapterqc", - "pixelator/adapterqc/sample01.meta.json", - "pixelator/adapterqc/sample01.report.json", - "pixelator/amplicon", - "pixelator/amplicon/sample01.meta.json", - "pixelator/amplicon/sample01.report.json", - "pixelator/analysis", - "pixelator/analysis/sample01.meta.json", - "pixelator/analysis/sample01.report.json", - "pixelator/annotate", - "pixelator/annotate/sample01.meta.json", - "pixelator/annotate/sample01.report.json", - "pixelator/collapse", - "pixelator/collapse/sample01.meta.json", - "pixelator/collapse/sample01.report.json", - "pixelator/demux", - "pixelator/demux/sample01.meta.json", - "pixelator/demux/sample01.report.json", - "pixelator/graph", - "pixelator/graph/sample01.meta.json", - "pixelator/graph/sample01.report.json", - "pixelator/layout", - "pixelator/layout/sample01.meta.json", - "pixelator/layout/sample01.report.json", - "pixelator/logs", - "pixelator/logs/sample01", - "pixelator/logs/sample01/sample01.pixelator-adapterqc.log", - "pixelator/logs/sample01/sample01.pixelator-amplicon.log", - "pixelator/logs/sample01/sample01.pixelator-analysis.log", - "pixelator/logs/sample01/sample01.pixelator-annotate.log", - "pixelator/logs/sample01/sample01.pixelator-collapse.log", - "pixelator/logs/sample01/sample01.pixelator-demux.log", - "pixelator/logs/sample01/sample01.pixelator-graph.log", - "pixelator/logs/sample01/sample01.pixelator-layout.log", - "pixelator/logs/sample01/sample01.pixelator-preqc.log", - "pixelator/logs/sample01/sample01.pixelator-report.log", - "pixelator/preqc", - "pixelator/preqc/sample01.meta.json", - "pixelator/preqc/sample01.report.json", - "pixelator/sample01.html", - "pixelator/sample01.layout.dataset.pxl" - ], - { - "PIXELATOR_AMPLICON": { - "pixelator": "0.23.0" - }, - "PIXELATOR_ANALYSIS": { - "pixelator": "0.23.0" - }, - "PIXELATOR_ANNOTATE": { - "pixelator": "0.23.0" - }, - "PIXELATOR_COLLAPSE": { - "pixelator": "0.23.0" - }, - "PIXELATOR_DEMUX": { - "pixelator": "0.23.0" - }, - "PIXELATOR_GRAPH": { - "pixelator": "0.23.0" - }, - "PIXELATOR_LAYOUT": { - "pixelator": "0.23.0" - }, - "PIXELATOR_LIST_OPTIONS": { - "pixelator": "0.23.0" - }, - "PIXELATOR_QC": { - "pixelator": "0.23.0" - }, - "PIXELATOR_REPORT": { - "pixelator": "0.23.0" - }, - "Workflow": { - "nf-core/pixelator": "v2.3.1" - } - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-01-14T15:08:13.476744195" - }, - "Params: default": { - "content": [ - 10, - { - "PIXELATOR_AMPLICON": { - "pixelator": "0.23.0" - }, - "PIXELATOR_ANALYSIS": { - "pixelator": "0.23.0" - }, - "PIXELATOR_ANNOTATE": { - "pixelator": "0.23.0" - }, - "PIXELATOR_COLLAPSE": { - "pixelator": "0.23.0" - }, - "PIXELATOR_DEMUX": { - "pixelator": "0.23.0" - }, - "PIXELATOR_GRAPH": { - "pixelator": "0.23.0" - }, - "PIXELATOR_LAYOUT": { - "pixelator": "0.23.0" - }, - "PIXELATOR_LIST_OPTIONS": { - "pixelator": "0.23.0" - }, - "PIXELATOR_QC": { - "pixelator": "0.23.0" - }, - "PIXELATOR_REPORT": { - "pixelator": "0.23.0" - }, - "Workflow": { - "nf-core/pixelator": "v2.3.1" - } - }, - [ - "pipeline_info", - "pipeline_info/nf_core_pixelator_software_mqc_versions.yml", - "pipeline_info/samplesheet_mpx_scsp_v1_immunology1.csv", - "pixelator", - "pixelator/adapterqc", - "pixelator/adapterqc/sample01.failed.fastq.gz", - "pixelator/adapterqc/sample01.meta.json", - "pixelator/adapterqc/sample01.processed.fastq.gz", - "pixelator/adapterqc/sample01.report.json", - "pixelator/amplicon", - "pixelator/amplicon/sample01.merged.fastq.gz", - "pixelator/amplicon/sample01.meta.json", - "pixelator/amplicon/sample01.report.json", - "pixelator/analysis", - "pixelator/analysis/sample01.analysis.dataset.pxl", - "pixelator/analysis/sample01.meta.json", - "pixelator/analysis/sample01.report.json", - "pixelator/annotate", - "pixelator/annotate/sample01.annotate.dataset.pxl", - "pixelator/annotate/sample01.meta.json", - "pixelator/annotate/sample01.report.json", - "pixelator/collapse", - "pixelator/collapse/sample01.collapsed.parquet", - "pixelator/collapse/sample01.meta.json", - "pixelator/collapse/sample01.report.json", - "pixelator/demux", - "pixelator/demux/sample01.failed.fastq.gz", - "pixelator/demux/sample01.meta.json", - "pixelator/demux/sample01.processed-AAAGCAAC.fastq.gz", - "pixelator/demux/sample01.processed-AACAAGAC.fastq.gz", - "pixelator/demux/sample01.processed-AACCTTCC.fastq.gz", - "pixelator/demux/sample01.processed-AACGGCTA.fastq.gz", - "pixelator/demux/sample01.processed-AAGCATAG.fastq.gz", - "pixelator/demux/sample01.processed-AAGTAGCT.fastq.gz", - "pixelator/demux/sample01.processed-AAGTCGTG.fastq.gz", - "pixelator/demux/sample01.processed-ACATTGAC.fastq.gz", - "pixelator/demux/sample01.processed-ACCAGTAC.fastq.gz", - "pixelator/demux/sample01.processed-ACCTTGTG.fastq.gz", - "pixelator/demux/sample01.processed-ACTCGGAA.fastq.gz", - "pixelator/demux/sample01.processed-ACTCTCAC.fastq.gz", - "pixelator/demux/sample01.processed-ACTGTGTC.fastq.gz", - "pixelator/demux/sample01.processed-AGAGGCTC.fastq.gz", - "pixelator/demux/sample01.processed-AGCCCGAA.fastq.gz", - "pixelator/demux/sample01.processed-AGCTACTA.fastq.gz", - "pixelator/demux/sample01.processed-AGGATGTT.fastq.gz", - "pixelator/demux/sample01.processed-AGGGCAGT.fastq.gz", - "pixelator/demux/sample01.processed-AGTTATCG.fastq.gz", - "pixelator/demux/sample01.processed-ATAGGGGA.fastq.gz", - "pixelator/demux/sample01.processed-ATGACTGC.fastq.gz", - "pixelator/demux/sample01.processed-ATTCGCCT.fastq.gz", - "pixelator/demux/sample01.processed-ATTGGCAC.fastq.gz", - "pixelator/demux/sample01.processed-ATTTCGAG.fastq.gz", - "pixelator/demux/sample01.processed-CAATCGGC.fastq.gz", - "pixelator/demux/sample01.processed-CACACGGT.fastq.gz", - "pixelator/demux/sample01.processed-CACGTTTC.fastq.gz", - "pixelator/demux/sample01.processed-CAGATCCG.fastq.gz", - "pixelator/demux/sample01.processed-CAGTCAGT.fastq.gz", - "pixelator/demux/sample01.processed-CATGGGCA.fastq.gz", - "pixelator/demux/sample01.processed-CCAGACAC.fastq.gz", - "pixelator/demux/sample01.processed-CCAGCATG.fastq.gz", - "pixelator/demux/sample01.processed-CCGATATC.fastq.gz", - "pixelator/demux/sample01.processed-CCTAAGAA.fastq.gz", - "pixelator/demux/sample01.processed-CTACGACG.fastq.gz", - "pixelator/demux/sample01.processed-CTACTCGC.fastq.gz", - "pixelator/demux/sample01.processed-CTCAAGAG.fastq.gz", - "pixelator/demux/sample01.processed-CTCAGATG.fastq.gz", - "pixelator/demux/sample01.processed-CTGACCAT.fastq.gz", - "pixelator/demux/sample01.processed-CTGTAGGA.fastq.gz", - "pixelator/demux/sample01.processed-CTTCTTGA.fastq.gz", - "pixelator/demux/sample01.processed-CTTGCACC.fastq.gz", - "pixelator/demux/sample01.processed-GAAAGTCA.fastq.gz", - "pixelator/demux/sample01.processed-GAATCCCG.fastq.gz", - "pixelator/demux/sample01.processed-GACCACTC.fastq.gz", - "pixelator/demux/sample01.processed-GACTGGGA.fastq.gz", - "pixelator/demux/sample01.processed-GAGGTTAG.fastq.gz", - "pixelator/demux/sample01.processed-GATAGGGT.fastq.gz", - "pixelator/demux/sample01.processed-GATTGTGC.fastq.gz", - "pixelator/demux/sample01.processed-GCACTTAG.fastq.gz", - "pixelator/demux/sample01.processed-GCATTCTG.fastq.gz", - "pixelator/demux/sample01.processed-GCCGGACG.fastq.gz", - "pixelator/demux/sample01.processed-GCGCAACT.fastq.gz", - "pixelator/demux/sample01.processed-GCTATTGA.fastq.gz", - "pixelator/demux/sample01.processed-GCTGAACC.fastq.gz", - "pixelator/demux/sample01.processed-GGAGCCAA.fastq.gz", - "pixelator/demux/sample01.processed-GGTTTACC.fastq.gz", - "pixelator/demux/sample01.processed-GTAGGACC.fastq.gz", - "pixelator/demux/sample01.processed-GTATCGGT.fastq.gz", - "pixelator/demux/sample01.processed-GTCTTTGT.fastq.gz", - "pixelator/demux/sample01.processed-GTGAGTAG.fastq.gz", - "pixelator/demux/sample01.processed-GTGCATTC.fastq.gz", - "pixelator/demux/sample01.processed-GTTCAGAC.fastq.gz", - "pixelator/demux/sample01.processed-GTTGTCCG.fastq.gz", - "pixelator/demux/sample01.processed-TACTCTTG.fastq.gz", - "pixelator/demux/sample01.processed-TATCCCTT.fastq.gz", - "pixelator/demux/sample01.processed-TCAACGCT.fastq.gz", - "pixelator/demux/sample01.processed-TCAGGGTG.fastq.gz", - "pixelator/demux/sample01.processed-TCCCAGTG.fastq.gz", - "pixelator/demux/sample01.processed-TCCCTTGC.fastq.gz", - "pixelator/demux/sample01.processed-TCCGTAAC.fastq.gz", - "pixelator/demux/sample01.processed-TCGTAACG.fastq.gz", - "pixelator/demux/sample01.processed-TCTGCTCC.fastq.gz", - "pixelator/demux/sample01.processed-TGATAGAA.fastq.gz", - "pixelator/demux/sample01.processed-TGCATGTC.fastq.gz", - "pixelator/demux/sample01.processed-TGGGGCTT.fastq.gz", - "pixelator/demux/sample01.processed-TTCTGGGT.fastq.gz", - "pixelator/demux/sample01.processed-TTGTCCAA.fastq.gz", - "pixelator/demux/sample01.processed-TTTCTGGT.fastq.gz", - "pixelator/demux/sample01.processed-TTTGGAAG.fastq.gz", - "pixelator/demux/sample01.report.json", - "pixelator/graph", - "pixelator/graph/sample01.discarded_edgelist.parquet", - "pixelator/graph/sample01.edgelist.parquet", - "pixelator/graph/sample01.meta.json", - "pixelator/graph/sample01.report.json", - "pixelator/layout", - "pixelator/layout/sample01.meta.json", - "pixelator/layout/sample01.report.json", - "pixelator/logs", - "pixelator/logs/sample01", - "pixelator/logs/sample01/sample01.pixelator-adapterqc.log", - "pixelator/logs/sample01/sample01.pixelator-amplicon.log", - "pixelator/logs/sample01/sample01.pixelator-analysis.log", - "pixelator/logs/sample01/sample01.pixelator-annotate.log", - "pixelator/logs/sample01/sample01.pixelator-collapse.log", - "pixelator/logs/sample01/sample01.pixelator-demux.log", - "pixelator/logs/sample01/sample01.pixelator-graph.log", - "pixelator/logs/sample01/sample01.pixelator-layout.log", - "pixelator/logs/sample01/sample01.pixelator-preqc.log", - "pixelator/logs/sample01/sample01.pixelator-report.log", - "pixelator/preqc", - "pixelator/preqc/sample01.failed.fastq.gz", - "pixelator/preqc/sample01.meta.json", - "pixelator/preqc/sample01.processed.fastq.gz", - "pixelator/preqc/sample01.qc-report.html", - "pixelator/preqc/sample01.report.json", - "pixelator/sample01.layout.dataset.pxl", - "pixelator/sample01.qc-report.html" - ] - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-01-14T15:06:46.245556348" - } -} \ No newline at end of file diff --git a/tests/pna.nf.test.snap b/tests/pna.nf.test.snap index 9a9d0274..193c79bc 100644 --- a/tests/pna.nf.test.snap +++ b/tests/pna.nf.test.snap @@ -109,7 +109,7 @@ "pixelator": "0.23.0" }, "Workflow": { - "nf-core/pixelator": "v2.3.1" + "nf-core/pixelator": "v3.0.0" } } ], @@ -117,7 +117,7 @@ "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-01-14T15:12:26.050430157" + "timestamp": "2026-01-19T08:54:43.966539669" }, "Params: all": { "content": [ @@ -154,7 +154,7 @@ "pixelator": "0.23.0" }, "Workflow": { - "nf-core/pixelator": "v2.3.1" + "nf-core/pixelator": "v3.0.0" } }, [ @@ -253,6 +253,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-01-14T15:11:30.155171934" + "timestamp": "2026-01-19T08:53:47.664150319" } } \ No newline at end of file diff --git a/tests/scripts/run_tests_parallel.sh b/tests/scripts/run_tests_parallel.sh index 3005a671..f339c774 100755 --- a/tests/scripts/run_tests_parallel.sh +++ b/tests/scripts/run_tests_parallel.sh @@ -10,12 +10,6 @@ nf-test test --profile test,docker $ARGS \ &> /tmp/pixelator_es_tests.txt \ && echo "Completed tests: experiment summary" & -echo Running tests: MPX modules... -nf-test test --profile test,docker $ARGS \ - modules/local/pixelator/single-cell-mpx/ \ - &> /tmp/pixelator_mpx_modules_tests.txt \ - && echo "Completed tests: MPX modules" & - echo Running tests: PNA modules... nf-test test --profile test,docker $ARGS \ modules/local/pixelator/single-cell-pna/ \ @@ -34,17 +28,9 @@ nf-test test --profile test,docker $ARGS \ &> /tmp/pixelator_pna_pipeline_tests.txt \ && echo "Completed tests: PNA pipeline" & -echo Running tests: MPX pipeline... -nf-test test --profile test,docker $ARGS \ - tests/mpx.nf.test \ - &> /tmp/pixelator_mpx_pipeline_tests.txt \ - && echo "Completed tests: MPX pipeline" & - wait cat /tmp/pixelator_es_tests.txt \ - /tmp/pixelator_mpx_modules_tests.txt \ /tmp/pixelator_pna_modules_tests.txt \ /tmp/pixelator_subworkflow_tests.txt \ /tmp/pixelator_pna_pipeline_tests.txt \ - /tmp/pixelator_mpx_pipeline_tests.txt diff --git a/workflows/pixelator.nf b/workflows/pixelator.nf index e90a2ce9..72378ca3 100644 --- a/workflows/pixelator.nf +++ b/workflows/pixelator.nf @@ -28,7 +28,6 @@ if (params.input) { // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -include { MPX } from '../subworkflows/local/mpx' include { PNA } from '../subworkflows/local/pna' /* @@ -112,8 +111,6 @@ workflow PIXELATOR { ch_fastq_technology_split = ch_cat_fastq .branch { meta, data -> - mpx: meta.technology == 'mpx' - return [ meta, data ] pna: meta.technology == 'pna' return [ meta, data ] } @@ -121,17 +118,10 @@ workflow PIXELATOR { ch_panel_files_technology_split = ch_cat_panel_files .branch { meta, data -> - mpx: meta.technology == 'mpx' - return [ meta, data ] pna: meta.technology == 'pna' return [ meta, data ] } - MPX( - ch_fastq_technology_split.mpx, - ch_panel_files_technology_split.mpx - ) - PNA( ch_fastq_technology_split.pna, ch_panel_files_technology_split.pna