From 9a5f963925440e9f560b2ae2e7b4dfd440e0d7f4 Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Mon, 19 Jan 2026 09:03:57 +0100 Subject: [PATCH 01/32] Bump version 2.4.0dev --- .nf-core.yml | 2 +- CHANGELOG.md | 2 ++ nextflow.config | 2 +- ro-crate-metadata.json | 38 +++++++++++++++++++------------------- tests/mpx.nf.test.snap | 8 ++++---- tests/pna.nf.test.snap | 8 ++++---- 6 files changed, 31 insertions(+), 29 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 4b29f5c7..d9cf1cbb 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -23,4 +23,4 @@ template: - fastqc - multiqc - igenomes - version: 2.3.1 + version: 2.4.0dev diff --git a/CHANGELOG.md b/CHANGELOG.md index 937ddb79..2de9154d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ 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). +## dev - xxxx-xx-xx + ## [[2.3.1](https://github.com/nf-core/pixelator/releases/tag/2.3.1)] - 2025-01-14 - Update usage documentation by @vincent-van-hoef [#176](https://github.com/nf-core/pixelator/pull/176) diff --git a/nextflow.config b/nextflow.config index 1ae0598d..434e6834 100644 --- a/nextflow.config +++ b/nextflow.config @@ -428,7 +428,7 @@ manifest { mainScript = 'main.nf' defaultBranch = 'master' nextflowVersion = '!>=25.04.0' - version = '2.3.1' + version = '2.4.0dev' doi = '10.1101/2023.06.05.543770' } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index b7895e64..35f16e0d 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -21,8 +21,8 @@ { "@id": "./", "@type": "Dataset", - "creativeWorkStatus": "Stable", - "datePublished": "2026-01-14T13:21:04+00:00", + "creativeWorkStatus": "InProgress", + "datePublished": "2026-01-19T07:42:58+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", "hasPart": [ { @@ -102,7 +102,7 @@ }, "mentions": [ { - "@id": "#24d1244e-92b7-4266-8edf-d55eb69ec6b0" + "@id": "#ccc15f3d-39b2-4ec1-8238-0c28d6bd71be" } ], "name": "nf-core/pixelator" @@ -134,14 +134,14 @@ "@id": "https://orcid.org/0000-0003-2702-1103" }, { - "@id": "https://orcid.org/0009-0006-0086-2470" + "@id": "#johan.dahlberg@pixelgen.tech" }, { - "@id": "#johan.dahlberg@pixelgen.tech" + "@id": "https://orcid.org/0009-0006-0086-2470" } ], "dateCreated": "", - "dateModified": "2026-01-14T14:21:04Z", + "dateModified": "2026-01-19T08:42:58Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -158,10 +158,10 @@ ], "maintainer": [ { - "@id": "https://orcid.org/0009-0006-0086-2470" + "@id": "#johan.dahlberg@pixelgen.tech" }, { - "@id": "#johan.dahlberg@pixelgen.tech" + "@id": "https://orcid.org/0009-0006-0086-2470" } ], "name": [ @@ -175,10 +175,10 @@ }, "url": [ "https://github.com/nf-core/pixelator", - "https://nf-co.re/pixelator/2.3.1/" + "https://nf-co.re/pixelator/dev/" ], "version": [ - "2.3.1" + "2.4.0dev" ] }, { @@ -194,11 +194,11 @@ "version": "!>=25.04.0" }, { - "@id": "#24d1244e-92b7-4266-8edf-d55eb69ec6b0", + "@id": "#ccc15f3d-39b2-4ec1-8238-0c28d6bd71be", "@type": "TestSuite", "instance": [ { - "@id": "#48e43019-b9d7-4fae-a981-99fed04b7987" + "@id": "#4de04360-b061-475f-88a2-eb387ad5975c" } ], "mainEntity": { @@ -207,7 +207,7 @@ "name": "Test suite for nf-core/pixelator" }, { - "@id": "#48e43019-b9d7-4fae-a981-99fed04b7987", + "@id": "#4de04360-b061-475f-88a2-eb387ad5975c", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/pixelator", "resource": "repos/nf-core/pixelator/actions/workflows/nf-test.yml", @@ -346,17 +346,17 @@ "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": "#johan.dahlberg@pixelgen.tech", "@type": "Person", "email": "johan.dahlberg@pixelgen.tech", "name": "Johan Dahlberg" + }, + { + "@id": "https://orcid.org/0009-0006-0086-2470", + "@type": "Person", + "email": "florian.detemmerman@pixelgen.com", + "name": "Florian De Temmerman" } ] } \ No newline at end of file diff --git a/tests/mpx.nf.test.snap b/tests/mpx.nf.test.snap index d05ac875..92d41e13 100644 --- a/tests/mpx.nf.test.snap +++ b/tests/mpx.nf.test.snap @@ -81,7 +81,7 @@ "pixelator": "0.23.0" }, "Workflow": { - "nf-core/pixelator": "v2.3.1" + "nf-core/pixelator": "v2.4.0dev" } } ], @@ -89,7 +89,7 @@ "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-01-14T15:08:13.476744195" + "timestamp": "2026-01-19T08:50:26.362038761" }, "Params: default": { "content": [ @@ -126,7 +126,7 @@ "pixelator": "0.23.0" }, "Workflow": { - "nf-core/pixelator": "v2.3.1" + "nf-core/pixelator": "v2.4.0dev" } }, [ @@ -273,6 +273,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-01-14T15:06:46.245556348" + "timestamp": "2026-01-19T08:48:55.37075587" } } \ No newline at end of file diff --git a/tests/pna.nf.test.snap b/tests/pna.nf.test.snap index 9a9d0274..2d80021f 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": "v2.4.0dev" } } ], @@ -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": "v2.4.0dev" } }, [ @@ -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 From 37815c53388ec4b91a48ac9545fd50f2a7e97b77 Mon Sep 17 00:00:00 2001 From: Johan Dahlberg Date: Wed, 4 Feb 2026 13:26:21 +0100 Subject: [PATCH 02/32] Drop support for MPX --- CHANGELOG.md | 4 + README.md | 27 +- conf/test_full.config | 32 +- conf/test_mpx.config | 44 -- conf/test_panel_v2.config | 48 -- conf/test_pna.config | 37 -- conf/test_scsp_v1_immunology_v1.config | 46 -- docs/output.md | 321 ------------- docs/usage.md | 17 +- modules/local/pixelator/list_options/main.nf | 7 - .../single-cell-mpx/amplicon/environment.yml | 7 - .../single-cell-mpx/amplicon/main.nf | 72 --- .../amplicon/tests/main.nf.test | 74 --- .../amplicon/tests/main.nf.test.snap | 142 ------ .../single-cell-mpx/analysis/environment.yml | 7 - .../single-cell-mpx/analysis/main.nf | 52 --- .../analysis/tests/main.nf.test | 65 --- .../analysis/tests/main.nf.test.snap | 172 ------- .../single-cell-mpx/annotate/environment.yml | 7 - .../single-cell-mpx/annotate/main.nf | 58 --- .../annotate/tests/main.nf.test | 72 --- .../annotate/tests/main.nf.test.snap | 172 ------- .../single-cell-mpx/collapse/environment.yml | 7 - .../single-cell-mpx/collapse/main.nf | 62 --- .../collapse/tests/main.nf.test | 84 ---- .../collapse/tests/main.nf.test.snap | 142 ------ .../single-cell-mpx/demux/environment.yml | 7 - .../pixelator/single-cell-mpx/demux/main.nf | 61 --- .../single-cell-mpx/demux/tests/main.nf.test | 69 --- .../demux/tests/main.nf.test.snap | 244 ---------- .../single-cell-mpx/graph/environment.yml | 7 - .../pixelator/single-cell-mpx/graph/main.nf | 53 --- .../single-cell-mpx/graph/tests/main.nf.test | 67 --- .../graph/tests/main.nf.test.snap | 173 ------- .../single-cell-mpx/layout/environment.yml | 7 - .../pixelator/single-cell-mpx/layout/main.nf | 53 --- .../single-cell-mpx/layout/tests/main.nf.test | 71 --- .../layout/tests/main.nf.test.snap | 172 ------- .../single-cell-mpx/qc/environment.yml | 7 - .../pixelator/single-cell-mpx/qc/main.nf | 97 ---- .../single-cell-mpx/qc/tests/main.nf.test | 69 --- .../qc/tests/main.nf.test.snap | 438 ------------------ .../single-cell-mpx/report/environment.yml | 7 - .../pixelator/single-cell-mpx/report/main.nf | 62 --- .../single-cell-mpx/report/tests/main.nf.test | 154 ------ .../report/tests/main.nf.test.snap | 95 ---- .../single-cell-pna/layout/tests/main.nf.test | 12 +- .../layout/tests/main.nf.test.snap | 124 ++--- nextflow.config | 380 ++++++--------- ro-crate-metadata.json | 14 +- subworkflows/local/generate_reports/main.nf | 134 ------ .../local/generate_reports/tests/main.nf.test | 203 -------- .../generate_reports/tests/main.nf.test.snap | 53 --- subworkflows/local/mpx/main.nf | 188 -------- .../utils_nfcore_pixelator_pipeline/main.nf | 5 +- tests/mpx.nf.test | 64 --- tests/mpx.nf.test.snap | 278 ----------- tests/scripts/run_tests_parallel.sh | 14 - workflows/pixelator.nf | 10 - 59 files changed, 261 insertions(+), 4909 deletions(-) delete mode 100644 conf/test_mpx.config delete mode 100644 conf/test_panel_v2.config delete mode 100644 conf/test_pna.config delete mode 100644 conf/test_scsp_v1_immunology_v1.config delete mode 100644 modules/local/pixelator/single-cell-mpx/amplicon/environment.yml delete mode 100644 modules/local/pixelator/single-cell-mpx/amplicon/main.nf delete mode 100644 modules/local/pixelator/single-cell-mpx/amplicon/tests/main.nf.test delete mode 100644 modules/local/pixelator/single-cell-mpx/amplicon/tests/main.nf.test.snap delete mode 100644 modules/local/pixelator/single-cell-mpx/analysis/environment.yml delete mode 100644 modules/local/pixelator/single-cell-mpx/analysis/main.nf delete mode 100644 modules/local/pixelator/single-cell-mpx/analysis/tests/main.nf.test delete mode 100644 modules/local/pixelator/single-cell-mpx/analysis/tests/main.nf.test.snap delete mode 100644 modules/local/pixelator/single-cell-mpx/annotate/environment.yml delete mode 100644 modules/local/pixelator/single-cell-mpx/annotate/main.nf delete mode 100644 modules/local/pixelator/single-cell-mpx/annotate/tests/main.nf.test delete mode 100644 modules/local/pixelator/single-cell-mpx/annotate/tests/main.nf.test.snap delete mode 100644 modules/local/pixelator/single-cell-mpx/collapse/environment.yml delete mode 100644 modules/local/pixelator/single-cell-mpx/collapse/main.nf delete mode 100644 modules/local/pixelator/single-cell-mpx/collapse/tests/main.nf.test delete mode 100644 modules/local/pixelator/single-cell-mpx/collapse/tests/main.nf.test.snap delete mode 100644 modules/local/pixelator/single-cell-mpx/demux/environment.yml delete mode 100644 modules/local/pixelator/single-cell-mpx/demux/main.nf delete mode 100644 modules/local/pixelator/single-cell-mpx/demux/tests/main.nf.test delete mode 100644 modules/local/pixelator/single-cell-mpx/demux/tests/main.nf.test.snap delete mode 100644 modules/local/pixelator/single-cell-mpx/graph/environment.yml delete mode 100644 modules/local/pixelator/single-cell-mpx/graph/main.nf delete mode 100644 modules/local/pixelator/single-cell-mpx/graph/tests/main.nf.test delete mode 100644 modules/local/pixelator/single-cell-mpx/graph/tests/main.nf.test.snap delete mode 100644 modules/local/pixelator/single-cell-mpx/layout/environment.yml delete mode 100644 modules/local/pixelator/single-cell-mpx/layout/main.nf delete mode 100644 modules/local/pixelator/single-cell-mpx/layout/tests/main.nf.test delete mode 100644 modules/local/pixelator/single-cell-mpx/layout/tests/main.nf.test.snap delete mode 100644 modules/local/pixelator/single-cell-mpx/qc/environment.yml delete mode 100644 modules/local/pixelator/single-cell-mpx/qc/main.nf delete mode 100644 modules/local/pixelator/single-cell-mpx/qc/tests/main.nf.test delete mode 100644 modules/local/pixelator/single-cell-mpx/qc/tests/main.nf.test.snap delete mode 100644 modules/local/pixelator/single-cell-mpx/report/environment.yml delete mode 100644 modules/local/pixelator/single-cell-mpx/report/main.nf delete mode 100644 modules/local/pixelator/single-cell-mpx/report/tests/main.nf.test delete mode 100644 modules/local/pixelator/single-cell-mpx/report/tests/main.nf.test.snap delete mode 100644 subworkflows/local/generate_reports/main.nf delete mode 100644 subworkflows/local/generate_reports/tests/main.nf.test delete mode 100644 subworkflows/local/generate_reports/tests/main.nf.test.snap delete mode 100644 subworkflows/local/mpx/main.nf delete mode 100644 tests/mpx.nf.test delete mode 100644 tests/mpx.nf.test.snap diff --git a/CHANGELOG.md b/CHANGELOG.md index 2de9154d..d4f9732c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## dev - xxxx-xx-xx +### Removed + +- Support for MPX in the pipeline + ## [[2.3.1](https://github.com/nf-core/pixelator/releases/tag/2.3.1)] - 2025-01-14 - Update usage documentation by @vincent-van-hoef [#176](https://github.com/nf-core/pixelator/pull/176) diff --git a/README.md b/README.md index 032396bd..2e3f6d52 100644 --- a/README.md +++ b/README.md @@ -23,15 +23,14 @@ ## 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 +**nf-core/pixelator** is a bioinformatics best-practice analysis pipeline for analysis of data from tthe +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. +TODO! Rework the metro map! ![](./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,18 +41,6 @@ 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)) - > [!WARNING] > Since Nextflow 23.07.0-edge, Nextflow no longer mounts the host's home directory when using Apptainer or Singularity. > This causes issues in some dependencies. As a workaround, you can revert to the old behavior by setting the environment variable @@ -130,12 +117,6 @@ You can cite the `nf-core` publication as follows: 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) - > **Single-Cell Protein Interactomes by the Proximity Network Assay.** > > 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én, Jessica Bunz, Christine Moge, Henrik Everberg, Petter Brodin, Alvaro Martinez Barrio, Simon Fredriksson 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_pna.config b/conf/test_pna.config deleted file mode 100644 index e9621480..00000000 --- a/conf/test_pna.config +++ /dev/null @@ -1,37 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running minimal tests -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 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_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 = '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 - - skip_layout = false -} 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/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..0bc8ac97 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 samplesheets 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/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/nextflow.config b/nextflow.config index 434e6834..b2dc1e54 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,88 +11,11 @@ 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 /* @@ -100,50 +23,50 @@ 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 = null // PNA denoise pna_denoise_run_one_core_graph_denoising = true @@ -151,57 +74,56 @@ params { pna_denoise_inflate_factor = 1.5 // 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 // 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 // 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 +138,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 +186,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 +200,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 +249,14 @@ 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' + } } // 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,36 +314,37 @@ 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' @@ -434,12 +354,12 @@ manifest { // 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/ro-crate-metadata.json b/ro-crate-metadata.json index 35f16e0d..572f2624 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2026-01-19T07:42:58+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-04T12:24:13+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 tthe\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\nTODO! Rework the metro map!\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> [!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> **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": "#ccc15f3d-39b2-4ec1-8238-0c28d6bd71be" + "@id": "#0300674b-c845-41c3-a1cc-d3d97a27b5f9" } ], "name": "nf-core/pixelator" @@ -141,7 +141,7 @@ } ], "dateCreated": "", - "dateModified": "2026-01-19T08:42:58Z", + "dateModified": "2026-02-04T13:24:13Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -194,11 +194,11 @@ "version": "!>=25.04.0" }, { - "@id": "#ccc15f3d-39b2-4ec1-8238-0c28d6bd71be", + "@id": "#0300674b-c845-41c3-a1cc-d3d97a27b5f9", "@type": "TestSuite", "instance": [ { - "@id": "#4de04360-b061-475f-88a2-eb387ad5975c" + "@id": "#e492cfeb-b357-4511-8e27-b94a9fd77523" } ], "mainEntity": { @@ -207,7 +207,7 @@ "name": "Test suite for nf-core/pixelator" }, { - "@id": "#4de04360-b061-475f-88a2-eb387ad5975c", + "@id": "#e492cfeb-b357-4511-8e27-b94a9fd77523", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/pixelator", "resource": "repos/nf-core/pixelator/actions/workflows/nf-test.yml", 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..8b43694a 100644 --- a/subworkflows/local/utils_nfcore_pixelator_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_pixelator_pipeline/main.nf @@ -467,8 +467,7 @@ def detect_technology(LinkedHashMap meta) { if (meta.design.startsWith('pna')) { newMeta = meta + [technology: 'pna'] } - else { - newMeta = meta + [technology: 'mpx'] - } + // TODO For now keep this around, in order to introduce + // other technology choices later. return newMeta } 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 92d41e13..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.4.0dev" - } - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-01-19T08:50:26.362038761" - }, - "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.4.0dev" - } - }, - [ - "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-19T08:48:55.37075587" - } -} \ 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 From 51a1fecdec81fe3bc9d35d35b3a6f1d2de483c61 Mon Sep 17 00:00:00 2001 From: Johan Dahlberg Date: Wed, 4 Feb 2026 13:31:46 +0100 Subject: [PATCH 03/32] Add back accidentally removed file --- conf/test_pna.config | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 conf/test_pna.config diff --git a/conf/test_pna.config b/conf/test_pna.config new file mode 100644 index 00000000..e9621480 --- /dev/null +++ b/conf/test_pna.config @@ -0,0 +1,37 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for running minimal tests +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 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_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 = '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 + + skip_layout = false +} From b5d9cbe4b8c6b00388fba154dcd35909a5523d45 Mon Sep 17 00:00:00 2001 From: Johan Dahlberg Date: Wed, 4 Feb 2026 13:36:09 +0100 Subject: [PATCH 04/32] Remove MPX options from schema --- nextflow_schema.json | 406 ------------------------------------------- 1 file changed, 406 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 99c2bae6..281f14d3 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -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", @@ -120,116 +106,6 @@ } } }, - "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", @@ -289,56 +165,6 @@ } } }, - "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", @@ -368,91 +194,6 @@ } } }, - "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", @@ -576,86 +317,6 @@ } } }, - "analysis_options": { - "title": "Options for pixelator analysis command.", - "type": "object", - "properties": { - "skip_analysis": { - "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", @@ -696,36 +357,6 @@ } } }, - "layout_options": { - "title": "Options for pixelator 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", @@ -756,16 +387,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", @@ -937,54 +558,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" }, From 01d440c39b0afa3a51debd6261034a320c33e7ce Mon Sep 17 00:00:00 2001 From: Johan Dahlberg Date: Wed, 4 Feb 2026 13:44:31 +0100 Subject: [PATCH 05/32] Fix up modules and conf files --- conf/modules.config | 336 ------------------------------------------- nextflow.config | 2 + nextflow_schema.json | 4 + 3 files changed, 6 insertions(+), 336 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1cf9c595..a4e39625 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -45,340 +45,4 @@ process { withName: "CAT_FASTQ" { 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() - } - - 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/nextflow.config b/nextflow.config index b2dc1e54..11f3010a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -72,6 +72,7 @@ params { 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 @@ -85,6 +86,7 @@ params { 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 diff --git a/nextflow_schema.json b/nextflow_schema.json index 281f14d3..d581a3b1 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -361,6 +361,10 @@ "title": "Options for pixelator single-cell-pna layout command.", "type": "object", "properties": { + "skip_layout": { + "description": "Skip layout step", + "type": "boolean" + }, "pna_layout_no_node_marker_counts": { "description": "Skip adding marker counts to the layout.", "type": "boolean", From 3e40c6dc8eff6f4172886fbc0144aabe521be748 Mon Sep 17 00:00:00 2001 From: Johan Dahlberg Date: Wed, 4 Feb 2026 13:51:58 +0100 Subject: [PATCH 06/32] Remove more MPX references --- .nf-core.yml | 2 +- CITATIONS.md | 2 ++ README.md | 2 +- assets/email_template.html | 2 +- nextflow_schema.json | 2 +- ro-crate-metadata.json | 14 +++++++------- 6 files changed, 13 insertions(+), 11 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index d9cf1cbb..a9d45b19 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -13,7 +13,7 @@ nf_core_version: 3.5.1 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 diff --git a/CITATIONS.md b/CITATIONS.md index 4d7355ef..6d9e57d7 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -14,6 +14,8 @@ > 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) > Martin, Marcel. “Cutadapt Removes Adapter Sequences from High-Throughput Sequencing Reads.” EMBnet.Journal 17, no. 1 (May 2, 2011): 10–12. https://doi.org/10.14806/ej.17.1.200. diff --git a/README.md b/README.md index 2e3f6d52..e120c5ed 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,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: +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/nextflow_schema.json b/nextflow_schema.json index d581a3b1..d94fc7e6 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": { diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 572f2624..1083a835 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2026-02-04T12:24:13+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 tthe\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\nTODO! Rework the metro map!\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> [!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> **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-04T12:51:23+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 tthe\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\nTODO! Rework the metro map!\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> [!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": "#0300674b-c845-41c3-a1cc-d3d97a27b5f9" + "@id": "#0ce8f01e-9fa4-4ccb-9d88-4d07ab3e03a4" } ], "name": "nf-core/pixelator" @@ -141,7 +141,7 @@ } ], "dateCreated": "", - "dateModified": "2026-02-04T13:24:13Z", + "dateModified": "2026-02-04T13:51:23Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -194,11 +194,11 @@ "version": "!>=25.04.0" }, { - "@id": "#0300674b-c845-41c3-a1cc-d3d97a27b5f9", + "@id": "#0ce8f01e-9fa4-4ccb-9d88-4d07ab3e03a4", "@type": "TestSuite", "instance": [ { - "@id": "#e492cfeb-b357-4511-8e27-b94a9fd77523" + "@id": "#8c0039e9-375f-4252-a1aa-d60583460b02" } ], "mainEntity": { @@ -207,7 +207,7 @@ "name": "Test suite for nf-core/pixelator" }, { - "@id": "#e492cfeb-b357-4511-8e27-b94a9fd77523", + "@id": "#8c0039e9-375f-4252-a1aa-d60583460b02", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/pixelator", "resource": "repos/nf-core/pixelator/actions/workflows/nf-test.yml", From 07ba1c35f69e2c4839f6397a961d05f8a3a4a2b0 Mon Sep 17 00:00:00 2001 From: Johan Dahlberg Date: Wed, 4 Feb 2026 13:55:52 +0100 Subject: [PATCH 07/32] Add missing params back --- conf/modules.pna.config | 2 +- nextflow.config | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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/nextflow.config b/nextflow.config index 11f3010a..5fbab318 100644 --- a/nextflow.config +++ b/nextflow.config @@ -80,6 +80,7 @@ params { 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 From f2c0aa3e1e517f81cfb44e72c78db80d8ee00dcb Mon Sep 17 00:00:00 2001 From: Johan Dahlberg Date: Wed, 4 Feb 2026 13:58:27 +0100 Subject: [PATCH 08/32] Add missing parameter to schema --- nextflow_schema.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index d94fc7e6..5cf49f27 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -321,6 +321,10 @@ "title": "Options for pixelator analysis command.", "type": "object", "properties": { + "skip_analysis": { + "description": "Skip analysis step", + "type": "boolean" + }, "save_pna_analysis_pixelfile": { "fa_icon": "fas fa-save", "type": "boolean", From ba3f6b9fd357d2d8d5c9eff85b5d7c0e69d3b961 Mon Sep 17 00:00:00 2001 From: Johan Dahlberg Date: Wed, 4 Feb 2026 15:23:59 +0100 Subject: [PATCH 09/32] Reference 2.3.1 for MPX, update metromap 3.0 --- README.md | 7 +- docs/images/nf-core-pixelator-metromap.svg | 466 ++++++++------------- 2 files changed, 180 insertions(+), 293 deletions(-) diff --git a/README.md b/README.md index e120c5ed..519dd122 100644 --- a/README.md +++ b/README.md @@ -23,11 +23,10 @@ ## Introduction -**nf-core/pixelator** is a bioinformatics best-practice analysis pipeline for analysis of data from tthe +**nf-core/pixelator** is a bioinformatics best-practice analysis pipeline for analysis of data from the 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. -TODO! Rework the metro map! ![](./docs/images/nf-core-pixelator-metromap.svg) The pipeline will run the following steps: @@ -41,6 +40,10 @@ 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) +> [!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. > This causes issues in some dependencies. As a workaround, you can revert to the old behavior by setting the environment variable 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 @@ - + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - + + + + + + - + - - - - - - - - + + + + + + + - - - - - - - - - - - + + - - - - - - + + - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - + + - - + + - - + + - + - - - - - - - - - - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - + + + + + - - + - - + + - + - - - - - + + - - - - - - + + + + + + - - - - - - - - + + + + + + + + - - - - - + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - - - - - + + - - + + - - + + - + - + - - - - - - - + - - + + - - + + - - + + From 77dea435d69d381bbe3025ac9cb6aff5cf9ae538 Mon Sep 17 00:00:00 2001 From: Johan Dahlberg Date: Mon, 9 Feb 2026 08:36:51 +0100 Subject: [PATCH 10/32] Update docs/usage.md Co-authored-by: Adrien Coulier --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 0bc8ac97..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 an example samplesheets 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 From a9daeea6d51defcb40878644307a7688aa067aa4 Mon Sep 17 00:00:00 2001 From: ptajvar Date: Thu, 12 Feb 2026 09:51:21 +0100 Subject: [PATCH 11/32] default to 8000 UMIs as minimum component size --- nextflow.config | 2 +- nextflow_schema.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index 5fbab318..d2e00257 100644 --- a/nextflow.config +++ b/nextflow.config @@ -66,7 +66,7 @@ params { 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_component_size_min_threshold = 8000 // PNA denoise pna_denoise_run_one_core_graph_denoising = true diff --git a/nextflow_schema.json b/nextflow_schema.json index 5cf49f27..5e326fd8 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -279,7 +279,8 @@ "pna_graph_component_size_min_threshold": { "type": "number", "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." } } }, From 566a6d2facf480495f94ad2488b6f438ab1f1dae Mon Sep 17 00:00:00 2001 From: ptajvar Date: Thu, 12 Feb 2026 13:10:16 +0100 Subject: [PATCH 12/32] update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4f9732c..dcc306e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## dev - xxxx-xx-xx +### Changed + +- Set default pna_graph_component_size_min_threshold to 8000 instead of null (i.e. automatic). + ### Removed - Support for MPX in the pipeline From 176e0731f06a86c99afe258c27037594bbe73cc0 Mon Sep 17 00:00:00 2001 From: Johan Dahlberg Date: Wed, 11 Feb 2026 17:05:28 +0100 Subject: [PATCH 13/32] Fix types in json schemas --- assets/schema_input.json | 32 ++++++++++++++++++-------------- nextflow_schema.json | 18 +++++++++--------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index 5dbf2922..295d220a 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -7,45 +7,49 @@ "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", + "format": "file-path", + "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", + "format": "file-path", "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", + "format": "file-path", "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)." } } } diff --git a/nextflow_schema.json b/nextflow_schema.json index 5e326fd8..6e95e986 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -113,7 +113,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 @@ -127,7 +127,7 @@ }, "pna_demux_output_max_chunks": { "fa_icon": "fas fa-arrows-alt-h", - "type": "number", + "type": "integer", "minimum": 1, "maximum": 32, "default": 8, @@ -210,7 +210,7 @@ "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" @@ -237,25 +237,25 @@ "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." @@ -271,13 +271,13 @@ "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, "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." From 90b51ec4682cc1a7819f4f96cf51f34926c9b609 Mon Sep 17 00:00:00 2001 From: Johan Dahlberg Date: Thu, 12 Feb 2026 14:42:07 +0100 Subject: [PATCH 14/32] Schema touch-ups with creation tool --- nextflow_schema.json | 45 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 6e95e986..8d4f9727 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -52,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", @@ -82,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": { @@ -100,8 +101,8 @@ "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]" } } @@ -145,21 +146,18 @@ "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." } @@ -175,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", @@ -188,7 +186,6 @@ "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." } @@ -200,7 +197,6 @@ "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." }, @@ -216,15 +212,15 @@ "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." @@ -262,12 +258,12 @@ }, "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": { @@ -295,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." }, @@ -308,13 +303,13 @@ "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 } } }, @@ -329,7 +324,6 @@ "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." }, @@ -340,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", @@ -372,8 +367,7 @@ }, "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.", @@ -419,7 +413,6 @@ "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." }, From 7236f59cdb5f7f5094792719225e9346556e9ec9 Mon Sep 17 00:00:00 2001 From: Johan Dahlberg Date: Thu, 12 Feb 2026 14:47:16 +0100 Subject: [PATCH 15/32] Update CHANGELOG --- CHANGELOG.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcc306e2..0455ec4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,11 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Set default pna_graph_component_size_min_threshold to 8000 instead of null (i.e. automatic). +- 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 +- Support for MPX in the pipeline by @johandahlberg [#182](https://github.com/nf-core/pixelator/pull/182) + +### Enhancements & fixes + +- Schema file files (e.g. expliclitly use integer types for integers, rather than numbers) by @johandahlberg [#184](https://github.com/nf-core/pixelator/pull/184) ## [[2.3.1](https://github.com/nf-core/pixelator/releases/tag/2.3.1)] - 2025-01-14 From 20b3a9d48354f6488c34adbf5662ea8da5ed5317 Mon Sep 17 00:00:00 2001 From: Johan Dahlberg Date: Tue, 17 Feb 2026 14:25:25 +0100 Subject: [PATCH 16/32] Update CHANGELOG.md Co-authored-by: Adrien Coulier --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0455ec4d..5c761247 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes -- Schema file files (e.g. expliclitly use integer types for integers, rather than numbers) by @johandahlberg [#184](https://github.com/nf-core/pixelator/pull/184) +- Update schema files (e.g. expliclitly use integer types for integers, rather than numbers) by @johandahlberg [#184](https://github.com/nf-core/pixelator/pull/184) ## [[2.3.1](https://github.com/nf-core/pixelator/releases/tag/2.3.1)] - 2025-01-14 From 7ce4e1e7d6c680e2de2aa32c4328aa6f5e70e6cf Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Tue, 24 Feb 2026 09:02:54 +0100 Subject: [PATCH 17/32] Add override for experiment summary container --- conf/modules.config | 6 ++++++ nextflow.config | 2 ++ nextflow_schema.json | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index a4e39625..0e80b750 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -45,4 +45,10 @@ process { withName: "CAT_FASTQ" { publishDir = [ enabled: false ] } + + withName: "EXPERIMENT_SUMMARY" { + if (params.experiment_summary_container) { + container = params.experiment_summary_container + } + } } diff --git a/nextflow.config b/nextflow.config index d2e00257..8909eac7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -16,6 +16,8 @@ params { // Main pixelator container override pixelator_container = null + experiment_summary_container = null + /* diff --git a/nextflow_schema.json b/nextflow_schema.json index 8d4f9727..d0fac578 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -410,6 +410,11 @@ "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", From 56b329f10ba854427776213284bdcc041ce95fed Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Tue, 24 Feb 2026 09:10:21 +0100 Subject: [PATCH 18/32] Update changelog --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c761247..c19f8014 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes - Update schema files (e.g. expliclitly use integer types for integers, rather than numbers) by @johandahlberg [#184](https://github.com/nf-core/pixelator/pull/184) +- 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` | + +> [!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)] - 2025-01-14 From b3c8f0a0277b58b20497747e3e40c7471873d917 Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Tue, 24 Feb 2026 10:45:42 +0100 Subject: [PATCH 19/32] Add schemas to nf-test triggers --- nf-test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 { From 29a23bd6aa070136ea8f12c9e25f535ae4583e37 Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Tue, 24 Feb 2026 14:01:09 +0100 Subject: [PATCH 20/32] Add schema for missing optional columns --- assets/schema_input.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/assets/schema_input.json b/assets/schema_input.json index 295d220a..c59fb981 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -50,6 +50,26 @@ "pattern": "^\\S+\\.f(ast)?q\\.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"] } } } From f74e03b4510ef84f44fdcca7490bc1fdeeaa6c18 Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Tue, 24 Feb 2026 16:14:00 +0100 Subject: [PATCH 21/32] Remove format field for fastq_1 and fastq_2 `file-path` checks the path is not a directory, which doesn't work well with `pipelines_testdata_base_path`. --- assets/schema_input.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index c59fb981..96d38d3e 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -32,21 +32,18 @@ }, "panel_file": { "type": "string", - "format": "file-path", "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'", "pattern": "^$|^\\S+\\.(csv|tsv|ya?ml)$" }, "fastq_1": { "type": "string", - "format": "file-path", "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", - "format": "file-path", "pattern": "^\\S+\\.f(ast)?q\\.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)." From 5a552b0a3b64467f98384fc9beaee0670e0beb4c Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Thu, 26 Feb 2026 10:01:18 +0100 Subject: [PATCH 22/32] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c19f8014..c4d6ee9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes -- Update schema files (e.g. expliclitly use integer types for integers, rather than numbers) by @johandahlberg [#184](https://github.com/nf-core/pixelator/pull/184) +- Update schema files (e.g. expliclitly 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 From 5375c3b7445d3cfb2eab4ed450f857c1b5375df9 Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Mon, 23 Feb 2026 08:27:49 +0100 Subject: [PATCH 23/32] Update dependencies --- .nf-core.yml | 2 +- modules.json | 4 +- modules/nf-core/cat/fastq/main.nf | 11 ++- modules/nf-core/cat/fastq/meta.yml | 4 +- modules/nf-core/cat/fastq/tests/main.nf.test | 71 ++++++++++++++ .../nf-core/cat/fastq/tests/main.nf.test.snap | 92 +++++++++++++++++++ ro-crate-metadata.json | 2 +- .../nf-core/utils_nfschema_plugin/main.nf | 2 +- 8 files changed, 177 insertions(+), 11 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index a9d45b19..491fc480 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -9,7 +9,7 @@ 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 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/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/ro-crate-metadata.json b/ro-crate-metadata.json index 1083a835..23841469 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "InProgress", "datePublished": "2026-02-04T12:51:23+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 tthe\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\nTODO! Rework the metro map!\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> [!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", + "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" 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 } From 2321b8cf190297efb62d34517956c89ad2b48cca Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Mon, 23 Feb 2026 08:31:04 +0100 Subject: [PATCH 24/32] Bump version to 3.0.0 --- .nf-core.yml | 2 +- CHANGELOG.md | 2 +- nextflow.config | 2 +- ro-crate-metadata.json | 40 ++++++++++++++++++++-------------------- tests/pna.nf.test.snap | 4 ++-- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 491fc480..76c9d634 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -23,4 +23,4 @@ template: - fastqc - multiqc - igenomes - version: 2.4.0dev + version: 3.0.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index c4d6ee9e..e20103fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ 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). -## dev - xxxx-xx-xx +## [[3.0.0](https://github.com/nf-core/pixelator/releases/tag/3.0.0)] - 2025-02-23 ### Changed diff --git a/nextflow.config b/nextflow.config index 8909eac7..5225e463 100644 --- a/nextflow.config +++ b/nextflow.config @@ -353,7 +353,7 @@ manifest { mainScript = 'main.nf' defaultBranch = 'master' nextflowVersion = '!>=25.04.0' - version = '2.4.0dev' + version = '3.0.0' doi = '10.1101/2023.06.05.543770' } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 23841469..22cf3cd8 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -21,8 +21,8 @@ { "@id": "./", "@type": "Dataset", - "creativeWorkStatus": "InProgress", - "datePublished": "2026-02-04T12:51:23+00:00", + "creativeWorkStatus": "Stable", + "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": [ { @@ -102,7 +102,7 @@ }, "mentions": [ { - "@id": "#0ce8f01e-9fa4-4ccb-9d88-4d07ab3e03a4" + "@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": "#johan.dahlberg@pixelgen.tech" + "@id": "https://orcid.org/0000-0003-2702-1103" }, { - "@id": "https://orcid.org/0009-0006-0086-2470" + "@id": "#johan.dahlberg@pixelgen.tech" } ], "dateCreated": "", - "dateModified": "2026-02-04T13:51:23Z", + "dateModified": "2026-02-23T08:30:51Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -158,10 +158,10 @@ ], "maintainer": [ { - "@id": "#johan.dahlberg@pixelgen.tech" + "@id": "https://orcid.org/0009-0006-0086-2470" }, { - "@id": "https://orcid.org/0009-0006-0086-2470" + "@id": "#johan.dahlberg@pixelgen.tech" } ], "name": [ @@ -175,10 +175,10 @@ }, "url": [ "https://github.com/nf-core/pixelator", - "https://nf-co.re/pixelator/dev/" + "https://nf-co.re/pixelator/3.0.0/" ], "version": [ - "2.4.0dev" + "3.0.0" ] }, { @@ -194,11 +194,11 @@ "version": "!>=25.04.0" }, { - "@id": "#0ce8f01e-9fa4-4ccb-9d88-4d07ab3e03a4", + "@id": "#9f9abf50-29d2-4cd8-be9c-9f2623f36243", "@type": "TestSuite", "instance": [ { - "@id": "#8c0039e9-375f-4252-a1aa-d60583460b02" + "@id": "#941d74f8-288a-4b81-828b-bb4ed6d64d62" } ], "mainEntity": { @@ -207,7 +207,7 @@ "name": "Test suite for nf-core/pixelator" }, { - "@id": "#8c0039e9-375f-4252-a1aa-d60583460b02", + "@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,6 +340,12 @@ "name": "nf-core", "url": "https://nf-co.re/" }, + { + "@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", @@ -351,12 +357,6 @@ "@type": "Person", "email": "johan.dahlberg@pixelgen.tech", "name": "Johan Dahlberg" - }, - { - "@id": "https://orcid.org/0009-0006-0086-2470", - "@type": "Person", - "email": "florian.detemmerman@pixelgen.com", - "name": "Florian De Temmerman" } ] } \ No newline at end of file diff --git a/tests/pna.nf.test.snap b/tests/pna.nf.test.snap index 2d80021f..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.4.0dev" + "nf-core/pixelator": "v3.0.0" } } ], @@ -154,7 +154,7 @@ "pixelator": "0.23.0" }, "Workflow": { - "nf-core/pixelator": "v2.4.0dev" + "nf-core/pixelator": "v3.0.0" } }, [ From 626a10b1b0b245dc4795e142d2ba802af1ba4e91 Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Mon, 23 Feb 2026 10:32:02 +0100 Subject: [PATCH 25/32] Restore `test_full` profile --- nextflow.config | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nextflow.config b/nextflow.config index 5225e463..bf37d4d8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -262,6 +262,10 @@ profiles { 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" From 14c2b95a9d5ee2e7b66be0ff989aab35095576fe Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Tue, 3 Mar 2026 13:40:35 +0100 Subject: [PATCH 26/32] Fix release dates --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e20103fd..a914d093 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ 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). -## [[3.0.0](https://github.com/nf-core/pixelator/releases/tag/3.0.0)] - 2025-02-23 +## [[3.0.0](https://github.com/nf-core/pixelator/releases/tag/3.0.0)] - 2026-02-23 ### Changed @@ -29,7 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 > 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)] - 2025-01-14 +## [[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) From 6b76682b3b103569d484dde5e1d5aef9d9c1aee3 Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Tue, 3 Mar 2026 13:40:43 +0100 Subject: [PATCH 27/32] Remove MPX from citations --- CITATIONS.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index 6d9e57d7..cb8dd47f 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -12,8 +12,6 @@ - [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) From b9037208d5feeb1f73d198ad3f6fc76ef545d8f5 Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Tue, 3 Mar 2026 16:03:42 +0100 Subject: [PATCH 28/32] Raise error when unsupported design is encountered --- subworkflows/local/utils_nfcore_pixelator_pipeline/main.nf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/subworkflows/local/utils_nfcore_pixelator_pipeline/main.nf b/subworkflows/local/utils_nfcore_pixelator_pipeline/main.nf index 8b43694a..717b317b 100644 --- a/subworkflows/local/utils_nfcore_pixelator_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_pixelator_pipeline/main.nf @@ -467,6 +467,9 @@ def detect_technology(LinkedHashMap meta) { if (meta.design.startsWith('pna')) { newMeta = meta + [technology: 'pna'] } + else { + exit(1, "ERROR: unsupported design: ${meta.design}") + } // TODO For now keep this around, in order to introduce // other technology choices later. return newMeta From 7d1bc0c76109ec06b1fc26dca4f4b15152300edb Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Tue, 3 Mar 2026 16:28:01 +0100 Subject: [PATCH 29/32] Add removed parameters to changelog --- CHANGELOG.md | 56 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a914d093..251fc2e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,9 +20,59 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Parameters -| Old parameter | New parameter | -| ------------- | -------------------------------- | -| | `--experiment_summary_container` | +| 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. From cf960edc9c98af58c9e50876d11bc87d99c3504c Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Tue, 3 Mar 2026 16:29:05 +0100 Subject: [PATCH 30/32] Fix typo --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 251fc2e3..66c046ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Enhancements & fixes -- Update schema files (e.g. expliclitly 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) +- 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 From abd1747c13645a6d5b1e0ec4511ca79174d8a35a Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Tue, 3 Mar 2026 16:29:56 +0100 Subject: [PATCH 31/32] Update template version in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 519dd122..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/) From cb384c17c13dadb66f53f5c9589dea42ab2963fd Mon Sep 17 00:00:00 2001 From: Adrien Coulier Date: Tue, 3 Mar 2026 16:50:33 +0100 Subject: [PATCH 32/32] Use `error(...)` instead of `exit(1, ...)` Co-Authored-By: Friederike Hanssen --- .../utils_nfcore_pixelator_pipeline/main.nf | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/subworkflows/local/utils_nfcore_pixelator_pipeline/main.nf b/subworkflows/local/utils_nfcore_pixelator_pipeline/main.nf index 717b317b..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,7 @@ def detect_technology(LinkedHashMap meta) { newMeta = meta + [technology: 'pna'] } else { - exit(1, "ERROR: unsupported design: ${meta.design}") + error("ERROR: unsupported design: ${meta.design}") } // TODO For now keep this around, in order to introduce // other technology choices later.