From 8be8cd6ab3a4015dd2476aeaebbb297386f15681 Mon Sep 17 00:00:00 2001 From: Matteo Bonfanti Date: Tue, 4 Mar 2025 17:28:45 +0100 Subject: [PATCH 01/82] modified samplesheet parsing for cellrangeratac --- .../utils_nfcore_scrnaseq_pipeline/main.nf | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf index e0731c54..b300c702 100644 --- a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf @@ -92,6 +92,24 @@ workflow PIPELINE_INITIALISATION { return [ meta, fastqs.flatten() ] } .set { ch_samplesheet } + } else if (params.aligner == 'cellrangerarc') { // the cellrangerarc sub-workflow logic needs that channels have a meta, type, subsample, fastqs structure. + Channel + .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) + .map { + meta, fastq_1, fastq_2 -> + if (!fastq_2) { + return [ meta.id, meta + [ single_end:true ], [ fastq_1 ] ] + } else { + return [ meta.id, meta + [ single_end:false ], [ fastq_1, fastq_2 ] ] + } + } + .groupTuple() + .view() + .map { + cellrangerarcStructure(it) + } + .view() + .set { ch_samplesheet } } else { Channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) @@ -194,6 +212,37 @@ def validateInputSamplesheet(input) { return [ metas[0], fastqs ] } // +// cellrangerarc structure for samplesheet channel +// +def cellrangerarcStructure(input) { + def (metas, fastqs) = input[1..2] + + // Check that multiple runs of the same sample are of the same datatype i.e. single-end / paired-end + def endedness_ok = metas.collect{ meta -> meta.single_end }.unique().size == 1 + if (!endedness_ok) { + error("Please check input samplesheet -> Multiple runs of a sample must be of the same datatype i.e. single-end or paired-end: ${metas[0].id}") + } + + // Define a new common meta for all the fastqs in this channel instance + def sampleMeta = metas[0].clone() + sampleMeta.remove("sample_type") + sampleMeta.remove("feature_type") + + // Create a list with all the entries of meta.sample_type + def sampletypes = metas.collect { meta -> meta.sample_type } + + // Create a list with all the base name of the fastq files + def subsamples = fastqs.collect { fastq -> + def match = (fastq[0].baseName =~ /^(.*?)_S\d+_L\d+_R\d+_\d+\.fastq(\.gz)?$/) + if (!match) { + error("Filename does not follow the expected FASTQ filename convention (SampleName_S1_L001_R1_001.fastq.gz): ${fastq[0]}") + } + return match[0][1] + } + + return [ sampleMeta, sampletypes, subsamples, fastqs ] +} +// // Get attribute from genome config file e.g. fasta // def getGenomeAttribute(attribute) { From 6edee1c1b1a74e514bdd74674169dee962d630c2 Mon Sep 17 00:00:00 2001 From: Matteo Bonfanti Date: Wed, 5 Mar 2025 15:45:48 +0100 Subject: [PATCH 02/82] process fastq_barcode from input samplesheet --- assets/schema_input.json | 7 ++++++ .../utils_nfcore_scrnaseq_pipeline/main.nf | 23 +++++++++++-------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index 3954dbca..3db4cca3 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -27,6 +27,13 @@ "pattern": "^\\S+\\.f(ast)?q\\.gz$", "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" }, + "fastq_barcode": { + "type": "string", + "format": "file-path", + "exists": true, + "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "errorMessage": "FastQ file for reads 3 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" + }, "expected_cells": { "type": "integer", "errorMessage": "Expected cells must be an Integer", diff --git a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf index b300c702..8b55ed1d 100644 --- a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf @@ -95,20 +95,16 @@ workflow PIPELINE_INITIALISATION { } else if (params.aligner == 'cellrangerarc') { // the cellrangerarc sub-workflow logic needs that channels have a meta, type, subsample, fastqs structure. Channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) - .map { - meta, fastq_1, fastq_2 -> - if (!fastq_2) { - return [ meta.id, meta + [ single_end:true ], [ fastq_1 ] ] - } else { - return [ meta.id, meta + [ single_end:false ], [ fastq_1, fastq_2 ] ] - } + .map { meta, fastq_1, fastq_2, fastq_barcode -> + if (!fastq_2 || (meta.sample_type == "atac" && !fastq_barcode)) { + error("Please check input samplesheet -> cellrangerarc requires both paired-end reads and barcode fastq files: ${meta.id}") + } + return [ meta.id, meta + [ single_end:false ], [ fastq_1, fastq_2, fastq_barcode ] ] } .groupTuple() - .view() .map { cellrangerarcStructure(it) } - .view() .set { ch_samplesheet } } else { Channel @@ -223,6 +219,13 @@ def cellrangerarcStructure(input) { error("Please check input samplesheet -> Multiple runs of a sample must be of the same datatype i.e. single-end or paired-end: ${metas[0].id}") } + // Validate that the property "sample_type" is present and has valid values + def valid_sample_types = ["gex", "atac"] + def sample_type_ok = metas.collect { meta -> meta.sample_type }.unique().every { it in valid_sample_types } + if (!sample_type_ok) { + error("Please check input samplesheet -> The property 'sample_type' is required and can only be 'gex' or 'atac'.") + } + // Define a new common meta for all the fastqs in this channel instance def sampleMeta = metas[0].clone() sampleMeta.remove("sample_type") @@ -240,7 +243,7 @@ def cellrangerarcStructure(input) { return match[0][1] } - return [ sampleMeta, sampletypes, subsamples, fastqs ] + return [ sampleMeta, sampletypes, subsamples, fastqs.flatten() ] } // // Get attribute from genome config file e.g. fasta From 4de1e0d2da3b2630479956b442b3330f152d5ba7 Mon Sep 17 00:00:00 2001 From: Matteo Bonfanti Date: Wed, 5 Mar 2025 15:47:44 +0100 Subject: [PATCH 03/82] get raw and filtered matrices from cellrangerarc output --- subworkflows/local/align_cellrangerarc.nf | 24 ++++++++++++++++++++++- workflows/scrnaseq.nf | 2 +- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/align_cellrangerarc.nf b/subworkflows/local/align_cellrangerarc.nf index 6de84e7b..4992fd86 100644 --- a/subworkflows/local/align_cellrangerarc.nf +++ b/subworkflows/local/align_cellrangerarc.nf @@ -50,7 +50,29 @@ workflow CELLRANGERARC_ALIGN { ) ch_versions = ch_versions.mix(CELLRANGERARC_COUNT.out.versions) + // Parse the output channels to obtain filtered and raw matrices + ch_matrices_filtered = parse_demultiplexed_output_channels( CELLRANGERARC_COUNT.out.outs, "filtered_feature_bc_matrix" ) + ch_matrices_raw = parse_demultiplexed_output_channels( CELLRANGERARC_COUNT.out.outs, "raw_feature_bc_matrix" ) + emit: ch_versions - cellranger_arc_out = CELLRANGERARC_COUNT.out.outs + cellrangerarc_out = CELLRANGERARC_COUNT.out.outs + cellrangerarc_mtx_filtered = ch_matrices_filtered + cellrangerarc_mtx_raw = ch_matrices_raw +} + +// Filter the desired files based on the pattern from an input channel +def parse_demultiplexed_output_channels(in_ch, pattern) { + + def out_ch = in_ch.map { meta, mtx_files -> + // Set the matrix type raw/filtered in the metadata based on the pattern + def meta_clone = meta.clone() + meta_clone.input_type = pattern.contains('raw_') ? 'raw' : 'filtered' + // Iterate over the matrix files and add the ones matching the pattern to the desired files list + def desired_files = [] + mtx_files.each{ if ( it.toString().contains("${pattern}") ) { desired_files.add( it ) } } + [ meta_clone, desired_files ] + } + + return out_ch } diff --git a/workflows/scrnaseq.nf b/workflows/scrnaseq.nf index ee2c8d46..c1b4aded 100644 --- a/workflows/scrnaseq.nf +++ b/workflows/scrnaseq.nf @@ -205,7 +205,7 @@ workflow SCRNASEQ { ch_cellrangerarc_config ) ch_versions = ch_versions.mix(CELLRANGERARC_ALIGN.out.ch_versions) - ch_mtx_matrices = ch_mtx_matrices.mix(CELLRANGERARC_ALIGN.out.cellranger_arc_out) + ch_mtx_matrices = ch_mtx_matrices.mix( CELLRANGERARC_ALIGN.out.cellrangerarc_mtx_raw, CELLRANGERARC_ALIGN.out.cellrangerarc_mtx_filtered ) } // Run cellrangermulti pipeline From ec5cc946b736752ec04025efde513ca93d7b0646 Mon Sep 17 00:00:00 2001 From: Matteo Bonfanti Date: Wed, 5 Mar 2025 16:36:17 +0100 Subject: [PATCH 04/82] fastq_barcode read through meta --- assets/schema_input.json | 5 +---- subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index 3db4cca3..be65f0fa 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -29,10 +29,7 @@ }, "fastq_barcode": { "type": "string", - "format": "file-path", - "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", - "errorMessage": "FastQ file for reads 3 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" + "meta": ["fastq_barcode"] }, "expected_cells": { "type": "integer", diff --git a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf index 8b55ed1d..1cc6e322 100644 --- a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf @@ -95,11 +95,11 @@ workflow PIPELINE_INITIALISATION { } else if (params.aligner == 'cellrangerarc') { // the cellrangerarc sub-workflow logic needs that channels have a meta, type, subsample, fastqs structure. Channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) - .map { meta, fastq_1, fastq_2, fastq_barcode -> - if (!fastq_2 || (meta.sample_type == "atac" && !fastq_barcode)) { + .map { meta, fastq_1, fastq_2 -> + if (!fastq_2 || (meta.sample_type == "atac" && !meta.fastq_barcode)) { error("Please check input samplesheet -> cellrangerarc requires both paired-end reads and barcode fastq files: ${meta.id}") } - return [ meta.id, meta + [ single_end:false ], [ fastq_1, fastq_2, fastq_barcode ] ] + return [ meta.id, meta + [ single_end:false ], [ fastq_1, fastq_2, file(meta.fastq_barcode, checkIfExists: true) ] ] } .groupTuple() .map { From 156991c2e12f8abdca04537dbd0b941f112cfbc3 Mon Sep 17 00:00:00 2001 From: Matteo Bonfanti Date: Wed, 5 Mar 2025 16:40:06 +0100 Subject: [PATCH 05/82] use file only when meta.fastq_barcode is defined --- subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf index 1cc6e322..772d4227 100644 --- a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf @@ -99,7 +99,11 @@ workflow PIPELINE_INITIALISATION { if (!fastq_2 || (meta.sample_type == "atac" && !meta.fastq_barcode)) { error("Please check input samplesheet -> cellrangerarc requires both paired-end reads and barcode fastq files: ${meta.id}") } - return [ meta.id, meta + [ single_end:false ], [ fastq_1, fastq_2, file(meta.fastq_barcode, checkIfExists: true) ] ] + if (meta.sample_type == "atac") { + return [ meta.id, meta + [ single_end:false ], [ fastq_1, fastq_2, file(meta.fastq_barcode, checkIfExists: true) ] ] + } else { + return [ meta.id, meta + [ single_end:false ], [ fastq_1, fastq_2 ] ] + } } .groupTuple() .map { From 980f5c69761be1bbf09e823d443fc37e779378da Mon Sep 17 00:00:00 2001 From: Matteo Bonfanti Date: Thu, 6 Mar 2025 18:00:48 +0100 Subject: [PATCH 06/82] draft of the cellrangerarc test added --- assets/cellrangerarc_samplesheet.csv | 2 ++ tests/main_pipeline_cellrangerarc.nf.test | 26 +++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 assets/cellrangerarc_samplesheet.csv create mode 100644 tests/main_pipeline_cellrangerarc.nf.test diff --git a/assets/cellrangerarc_samplesheet.csv b/assets/cellrangerarc_samplesheet.csv new file mode 100644 index 00000000..fc7df174 --- /dev/null +++ b/assets/cellrangerarc_samplesheet.csv @@ -0,0 +1,2 @@ +sample,fastq_1,fastq_2,fastq_barcode,sample_type +test_scATAC,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/10xgenomics/cellranger-atac/test_scATAC_S1_L001_R1_001.fastq.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/10xgenomics/cellranger-atac/test_scATAC_S1_L001_R2_001.fastq.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/10xgenomics/cellranger-atac/test_scATAC_S1_L001_R3_001.fastq.gz,atac diff --git a/tests/main_pipeline_cellrangerarc.nf.test b/tests/main_pipeline_cellrangerarc.nf.test new file mode 100644 index 00000000..a51493e1 --- /dev/null +++ b/tests/main_pipeline_cellrangerarc.nf.test @@ -0,0 +1,26 @@ +nextflow_pipeline { + + name "Test Workflow main.nf" + script "main.nf" + + test("test-dataset_cellrangerarc_aligner") { + + when { + params { + aligner = 'cellrangerarc' + outdir = "${outputDir}/results_cellrangerarc" + input = "${baseDir}/assets/cellrangerarc_samplesheet.csv" + fb_reference = "${baseDir}/assets/fb_reference.csv" + fasta = 'https://ftp.ensembl.org/pub/release-110/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.chromosome.1.fa.gz' + gtf = 'https://ftp.ensembl.org/pub/release-110/gtf/homo_sapiens/Homo_sapiens.GRCh38.110.gtf.gz' + protocol = 'auto' + } + } + + then { + assert workflow.success + } + + } + +} From 0575182efcfb27df75b53169a1bf8c7655aa91ee Mon Sep 17 00:00:00 2001 From: Felipe Marques de Almeida Date: Tue, 11 Mar 2025 08:10:19 +0000 Subject: [PATCH 07/82] bumpt dev branch version --- CHANGELOG.md | 2 ++ assets/multiqc_config.yml | 4 +-- nextflow.config | 2 +- ro-crate-metadata.json | 76 +++++++++++++++++++-------------------- 4 files changed, 43 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23d53f16..b883fa42 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). +## v4.1.0dev + ## v4.0.0 - 2025-03-10 - Move `txp2gene` to `reference_genome_options` in schema as it is required by `kb_python` and `alevin` ([434](https://github.com/nf-core/scrnaseq/pull/434)) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index de5a6e15..c7623303 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,7 @@ report_comment: > - This report has been generated by the nf-core/scrnaseq analysis pipeline. For information about how - to interpret these results, please see the documentation. report_section_order: "nf-core-scrnaseq-methods-description": diff --git a/nextflow.config b/nextflow.config index f7667ad9..c9b8acb9 100644 --- a/nextflow.config +++ b/nextflow.config @@ -346,7 +346,7 @@ manifest { mainScript = 'main.nf' defaultBranch = 'master' nextflowVersion = '!>=24.04.2' - version = '4.0.0' + version = '4.1.0dev' doi = '10.5281/zenodo.3568187' } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 86bb34f7..fcb0f3c0 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -21,8 +21,8 @@ { "@id": "./", "@type": "Dataset", - "creativeWorkStatus": "Stable", - "datePublished": "2025-03-10T08:38:26+00:00", + "creativeWorkStatus": "InProgress", + "datePublished": "2025-03-11T08:09:41+00:00", "description": "

\n \n \n \"nf-core/scrnaseq\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/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/scrnaseq/results)\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.3568187-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.3568187)\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/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\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/scrnaseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![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/scrnaseq** is a bioinformatics best-practice analysis pipeline for processing 10x Genomics single-cell RNA-seq data.\n\nThis is a community effort in building a pipeline capable to support:\n\n- SimpleAF(Alevin-Fry) + AlevinQC\n- STARSolo\n- Kallisto + BUStools\n- Cellranger\n\n> [!IMPORTANT]\n> Cellranger is a commercial tool from 10X Genomics Inc. and falls under the EULA from 10X Genomics Inc. The container provided for the CellRanger functionality in this pipeline has been built by the nf-core community and is therefore _not supported by 10X genomics_ directly. We are in discussions with 10X on how to improve the user experience and licence situation for both us as a community as well as 10X and end users and will update this statement here accordingly.\n\n## Documentation\n\nThe nf-core/scrnaseq pipeline comes with documentation about the pipeline [usage](https://nf-co.re/scrnaseq/usage), [parameters](https://nf-co.re/scrnaseq/parameters) and [output](https://nf-co.re/scrnaseq/output).\n\n![scrnaseq workflow](docs/images/scrnaseq_pipeline_V3.0-metro_clean.png)\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:\n\n`samplesheet.csv`:\n\n```csv\nsample,fastq_1,fastq_2,expected_cells\npbmc8k,pbmc8k_S1_L007_R1_001.fastq.gz,pbmc8k_S1_L007_R2_001.fastq.gz,10000\npbmc8k,pbmc8k_S1_L008_R1_001.fastq.gz,pbmc8k_S1_L008_R2_001.fastq.gz,10000\n```\n\nEach row represents a fastq file (single-end) or a pair of fastq files (paired end).\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/scrnaseq \\\n -profile \\\n --input samplesheet.csv \\\n --fasta GRCm38.p6.genome.chr19.fa \\\n --gtf gencode.vM19.annotation.chr19.gtf \\\n --protocol 10XV2 \\\n --aligner \\\n --outdir \n```\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/scrnaseq/usage) and the [parameter documentation](https://nf-co.re/scrnaseq/parameters).\n\n## Decision Tree for users\n\nThe nf-core/scrnaseq pipeline features several paths to analyze your single cell data. Future additions will also be done soon, e.g. the addition of multi-ome analysis types. To aid users in analyzing their data, we have added a decision tree to help people decide on what type of analysis they want to run and how to choose appropriate parameters for that.\n\n```mermaid\ngraph TD\n A[sc RNA] -->|alevin-fry| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|CellRanger| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|kbpython| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|STARsolo| B(h5ad/seurat/mtx matrices)\n```\n\nOptions for the respective alignment method can be found [here](https://github.com/nf-core/scrnaseq/blob/dev/docs/usage.md#aligning-options) to choose between methods.\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/scrnaseq/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/scrnaseq/output).\n\n## Credits\n\nnf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Gabernet G, Peltzer A, Sturm G.\n\nWe thank the following people and teams for their extensive assistance in the development of this pipeline:\n\n- @heylf\n- @KevinMenden\n- @FloWuenne\n- @rob-p\n- [GHGA](https://www.ghga.de/)\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 `#scrnaseq` channel](https://nfcore.slack.com/channels/scrnaseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/scrnaseq for your analysis, please cite it using the following doi: [10.5281/zenodo.3568187](https://doi.org/10.5281/zenodo.3568187)\n\nThe basic benchmarks that were used as motivation for incorporating the available modular workflows can be found in [this publication](https://www.biorxiv.org/content/10.1101/673285v2).\n\nWe offer all three paths for the processing of scRNAseq data so it remains up to the user to decide which pipeline workflow is chosen for a particular analysis question.\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n", "hasPart": [ { @@ -108,7 +108,7 @@ }, "mentions": [ { - "@id": "#03eed890-2941-4457-8014-6c7b9c27414f" + "@id": "#93e3b50c-a8ef-45f8-986a-494c649624ee" } ], "name": "nf-core/scrnaseq" @@ -137,32 +137,32 @@ ], "creator": [ { - "@id": "https://orcid.org/0000-0003-4412-7970" + "@id": "https://orcid.org/0000-0001-5010-9539" }, { - "@id": "#felipemarques89@gmail.com" + "@id": "https://orcid.org/0000-0003-4412-7970" }, { - "@id": "https://orcid.org/0000-0001-9584-7842" + "@id": "https://orcid.org/0000-0002-6503-2180" }, { - "@id": "https://orcid.org/0000-0001-5010-9539" + "@id": "https://orcid.org/0000-0002-4639-0935" }, { - "@id": "https://orcid.org/0000-0002-4639-0935" + "@id": "https://orcid.org/0000-0001-9584-7842" }, { - "@id": "#rob.syme@gmail.com" + "@id": "#drpatelhh@gmail.com" }, { - "@id": "https://orcid.org/0000-0002-6503-2180" + "@id": "#felipemarques89@gmail.com" }, { - "@id": "#drpatelhh@gmail.com" + "@id": "#rob.syme@gmail.com" } ], "dateCreated": "", - "dateModified": "2025-03-10T08:38:26Z", + "dateModified": "2025-03-11T08:09:41Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -191,10 +191,10 @@ }, "url": [ "https://github.com/nf-core/scrnaseq", - "https://nf-co.re/scrnaseq/4.0.0/" + "https://nf-co.re/scrnaseq/dev/" ], "version": [ - "4.0.0" + "4.1.0dev" ] }, { @@ -210,11 +210,11 @@ "version": "!>=24.04.2" }, { - "@id": "#03eed890-2941-4457-8014-6c7b9c27414f", + "@id": "#93e3b50c-a8ef-45f8-986a-494c649624ee", "@type": "TestSuite", "instance": [ { - "@id": "#b1db8755-9499-4b1b-a610-7de68cea11f6" + "@id": "#ec91c6c3-aa71-4260-9902-c0030fa4f49b" } ], "mainEntity": { @@ -223,7 +223,7 @@ "name": "Test suite for nf-core/scrnaseq" }, { - "@id": "#b1db8755-9499-4b1b-a610-7de68cea11f6", + "@id": "#ec91c6c3-aa71-4260-9902-c0030fa4f49b", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/scrnaseq", "resource": "repos/nf-core/scrnaseq/actions/workflows/ci.yml", @@ -366,6 +366,12 @@ "name": "nf-core", "url": "https://nf-co.re/" }, + { + "@id": "https://orcid.org/0000-0001-5010-9539", + "@type": "Person", + "email": "sangramsahu15@gmail.com", + "name": "Sangram Keshari Sahu" + }, { "@id": "https://orcid.org/0000-0003-4412-7970", "@type": "Person", @@ -373,10 +379,16 @@ "name": "Olga Botvinnik" }, { - "@id": "#felipemarques89@gmail.com", + "@id": "https://orcid.org/0000-0002-6503-2180", "@type": "Person", - "email": "felipemarques89@gmail.com", - "name": "Felipe Marques de Almeida" + "email": "apeltzer@users.noreply.github.com", + "name": "Alexander Peltzer" + }, + { + "@id": "https://orcid.org/0000-0002-4639-0935", + "@type": "Person", + "email": "nictru32@gmail.com", + "name": "Nico Trummer" }, { "@id": "https://orcid.org/0000-0001-9584-7842", @@ -385,34 +397,22 @@ "name": "Gregor Sturm" }, { - "@id": "https://orcid.org/0000-0001-5010-9539", + "@id": "#drpatelhh@gmail.com", "@type": "Person", - "email": "sangramsahu15@gmail.com", - "name": "Sangram Keshari Sahu" + "email": "drpatelhh@gmail.com", + "name": "Harshil Patel" }, { - "@id": "https://orcid.org/0000-0002-4639-0935", + "@id": "#felipemarques89@gmail.com", "@type": "Person", - "email": "nictru32@gmail.com", - "name": "Nico Trummer" + "email": "felipemarques89@gmail.com", + "name": "Felipe Marques de Almeida" }, { "@id": "#rob.syme@gmail.com", "@type": "Person", "email": "rob.syme@gmail.com", "name": "Rob Syme" - }, - { - "@id": "https://orcid.org/0000-0002-6503-2180", - "@type": "Person", - "email": "apeltzer@users.noreply.github.com", - "name": "Alexander Peltzer" - }, - { - "@id": "#drpatelhh@gmail.com", - "@type": "Person", - "email": "drpatelhh@gmail.com", - "name": "Harshil Patel" } ] } \ No newline at end of file From 950ed95e22b9bc65bdba99c521a768e7b4911fa7 Mon Sep 17 00:00:00 2001 From: milos7250 <56844787+milos7250@users.noreply.github.com> Date: Fri, 21 Mar 2025 16:41:17 +0000 Subject: [PATCH 08/82] Change simpleaf protocol name from 10xv4 to 10xv4-3p --- assets/multiqc_config.yml | 4 +-- assets/protocols.json | 2 +- nextflow.config | 2 +- ro-crate-metadata.json | 63 ++++++++++++++++++++------------------- 4 files changed, 37 insertions(+), 34 deletions(-) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index de5a6e15..2c167d48 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,7 @@ report_comment: > - This report has been generated by the nf-core/scrnaseq analysis pipeline. For information about how - to interpret these results, please see the documentation. report_section_order: "nf-core-scrnaseq-methods-description": diff --git a/assets/protocols.json b/assets/protocols.json index 34979228..ddfd41bf 100644 --- a/assets/protocols.json +++ b/assets/protocols.json @@ -13,7 +13,7 @@ "whitelist": "assets/whitelist/10x_V3_barcode_whitelist.txt.gz" }, "10XV4": { - "protocol": "10xv4", + "protocol": "10xv4-3p", "whitelist": "assets/whitelist/10x_V4_barcode_whitelist.txt.gz" }, "dropseq": { diff --git a/nextflow.config b/nextflow.config index f7667ad9..c72b0e8b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -346,7 +346,7 @@ manifest { mainScript = 'main.nf' defaultBranch = 'master' nextflowVersion = '!>=24.04.2' - version = '4.0.0' + version = '4.0.1' doi = '10.5281/zenodo.3568187' } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 86bb34f7..f6ad1afa 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,7 +22,7 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "Stable", - "datePublished": "2025-03-10T08:38:26+00:00", + "datePublished": "2025-03-21T16:40:10+00:00", "description": "

\n \n \n \"nf-core/scrnaseq\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/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/scrnaseq/results)\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.3568187-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.3568187)\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/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\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/scrnaseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![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/scrnaseq** is a bioinformatics best-practice analysis pipeline for processing 10x Genomics single-cell RNA-seq data.\n\nThis is a community effort in building a pipeline capable to support:\n\n- SimpleAF(Alevin-Fry) + AlevinQC\n- STARSolo\n- Kallisto + BUStools\n- Cellranger\n\n> [!IMPORTANT]\n> Cellranger is a commercial tool from 10X Genomics Inc. and falls under the EULA from 10X Genomics Inc. The container provided for the CellRanger functionality in this pipeline has been built by the nf-core community and is therefore _not supported by 10X genomics_ directly. We are in discussions with 10X on how to improve the user experience and licence situation for both us as a community as well as 10X and end users and will update this statement here accordingly.\n\n## Documentation\n\nThe nf-core/scrnaseq pipeline comes with documentation about the pipeline [usage](https://nf-co.re/scrnaseq/usage), [parameters](https://nf-co.re/scrnaseq/parameters) and [output](https://nf-co.re/scrnaseq/output).\n\n![scrnaseq workflow](docs/images/scrnaseq_pipeline_V3.0-metro_clean.png)\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:\n\n`samplesheet.csv`:\n\n```csv\nsample,fastq_1,fastq_2,expected_cells\npbmc8k,pbmc8k_S1_L007_R1_001.fastq.gz,pbmc8k_S1_L007_R2_001.fastq.gz,10000\npbmc8k,pbmc8k_S1_L008_R1_001.fastq.gz,pbmc8k_S1_L008_R2_001.fastq.gz,10000\n```\n\nEach row represents a fastq file (single-end) or a pair of fastq files (paired end).\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/scrnaseq \\\n -profile \\\n --input samplesheet.csv \\\n --fasta GRCm38.p6.genome.chr19.fa \\\n --gtf gencode.vM19.annotation.chr19.gtf \\\n --protocol 10XV2 \\\n --aligner \\\n --outdir \n```\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/scrnaseq/usage) and the [parameter documentation](https://nf-co.re/scrnaseq/parameters).\n\n## Decision Tree for users\n\nThe nf-core/scrnaseq pipeline features several paths to analyze your single cell data. Future additions will also be done soon, e.g. the addition of multi-ome analysis types. To aid users in analyzing their data, we have added a decision tree to help people decide on what type of analysis they want to run and how to choose appropriate parameters for that.\n\n```mermaid\ngraph TD\n A[sc RNA] -->|alevin-fry| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|CellRanger| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|kbpython| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|STARsolo| B(h5ad/seurat/mtx matrices)\n```\n\nOptions for the respective alignment method can be found [here](https://github.com/nf-core/scrnaseq/blob/dev/docs/usage.md#aligning-options) to choose between methods.\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/scrnaseq/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/scrnaseq/output).\n\n## Credits\n\nnf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Gabernet G, Peltzer A, Sturm G.\n\nWe thank the following people and teams for their extensive assistance in the development of this pipeline:\n\n- @heylf\n- @KevinMenden\n- @FloWuenne\n- @rob-p\n- [GHGA](https://www.ghga.de/)\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 `#scrnaseq` channel](https://nfcore.slack.com/channels/scrnaseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/scrnaseq for your analysis, please cite it using the following doi: [10.5281/zenodo.3568187](https://doi.org/10.5281/zenodo.3568187)\n\nThe basic benchmarks that were used as motivation for incorporating the available modular workflows can be found in [this publication](https://www.biorxiv.org/content/10.1101/673285v2).\n\nWe offer all three paths for the processing of scRNAseq data so it remains up to the user to decide which pipeline workflow is chosen for a particular analysis question.\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n", "hasPart": [ { @@ -108,7 +108,7 @@ }, "mentions": [ { - "@id": "#03eed890-2941-4457-8014-6c7b9c27414f" + "@id": "#f48924df-710d-4794-b36c-9430e60c18f4" } ], "name": "nf-core/scrnaseq" @@ -137,7 +137,10 @@ ], "creator": [ { - "@id": "https://orcid.org/0000-0003-4412-7970" + "@id": "https://orcid.org/0000-0002-6503-2180" + }, + { + "@id": "#rob.syme@gmail.com" }, { "@id": "#felipemarques89@gmail.com" @@ -152,17 +155,17 @@ "@id": "https://orcid.org/0000-0002-4639-0935" }, { - "@id": "#rob.syme@gmail.com" - }, - { - "@id": "https://orcid.org/0000-0002-6503-2180" + "@id": "#drpatelhh@gmail.com" }, { - "@id": "#drpatelhh@gmail.com" + "@id": "https://orcid.org/0000-0003-4412-7970" } ], - "dateCreated": "", - "dateModified": "2025-03-10T08:38:26Z", + "dateCreated": [ + "", + "2025-03-11T08:37:36Z" + ], + "dateModified": "2025-03-21T16:40:10Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -191,10 +194,10 @@ }, "url": [ "https://github.com/nf-core/scrnaseq", - "https://nf-co.re/scrnaseq/4.0.0/" + "https://nf-co.re/scrnaseq/4.0.1/" ], "version": [ - "4.0.0" + "4.0.1" ] }, { @@ -210,11 +213,11 @@ "version": "!>=24.04.2" }, { - "@id": "#03eed890-2941-4457-8014-6c7b9c27414f", + "@id": "#f48924df-710d-4794-b36c-9430e60c18f4", "@type": "TestSuite", "instance": [ { - "@id": "#b1db8755-9499-4b1b-a610-7de68cea11f6" + "@id": "#0f25408b-fafe-4a00-be09-5a4cc5871e35" } ], "mainEntity": { @@ -223,7 +226,7 @@ "name": "Test suite for nf-core/scrnaseq" }, { - "@id": "#b1db8755-9499-4b1b-a610-7de68cea11f6", + "@id": "#0f25408b-fafe-4a00-be09-5a4cc5871e35", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/scrnaseq", "resource": "repos/nf-core/scrnaseq/actions/workflows/ci.yml", @@ -367,10 +370,16 @@ "url": "https://nf-co.re/" }, { - "@id": "https://orcid.org/0000-0003-4412-7970", + "@id": "https://orcid.org/0000-0002-6503-2180", "@type": "Person", - "email": "olga.botvinnik@gmail.com", - "name": "Olga Botvinnik" + "email": "apeltzer@users.noreply.github.com", + "name": "Alexander Peltzer" + }, + { + "@id": "#rob.syme@gmail.com", + "@type": "Person", + "email": "rob.syme@gmail.com", + "name": "Rob Syme" }, { "@id": "#felipemarques89@gmail.com", @@ -396,23 +405,17 @@ "email": "nictru32@gmail.com", "name": "Nico Trummer" }, - { - "@id": "#rob.syme@gmail.com", - "@type": "Person", - "email": "rob.syme@gmail.com", - "name": "Rob Syme" - }, - { - "@id": "https://orcid.org/0000-0002-6503-2180", - "@type": "Person", - "email": "apeltzer@users.noreply.github.com", - "name": "Alexander Peltzer" - }, { "@id": "#drpatelhh@gmail.com", "@type": "Person", "email": "drpatelhh@gmail.com", "name": "Harshil Patel" + }, + { + "@id": "https://orcid.org/0000-0003-4412-7970", + "@type": "Person", + "email": "olga.botvinnik@gmail.com", + "name": "Olga Botvinnik" } ] } \ No newline at end of file From 5d015ff277305ac69fd0b2518efa8f4df13ee80d Mon Sep 17 00:00:00 2001 From: milos7250 <56844787+milos7250@users.noreply.github.com> Date: Mon, 24 Mar 2025 14:30:17 +0000 Subject: [PATCH 09/82] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23d53f16..493cc0d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ 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). +## v4.0.1 - 2025-03-24 + +- Fix simpleaf protocol name for 10xv4 ([#452](https://github.com/nf-core/scrnaseq/pull/452)) + ## v4.0.0 - 2025-03-10 - Move `txp2gene` to `reference_genome_options` in schema as it is required by `kb_python` and `alevin` ([434](https://github.com/nf-core/scrnaseq/pull/434)) From bc91f60cd1b8ef35296bade9d2e84a495914a6cf Mon Sep 17 00:00:00 2001 From: Alex Bartlett Date: Mon, 24 Mar 2025 14:03:32 -0400 Subject: [PATCH 10/82] update nextflow schema --- nextflow_schema.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 6ecbf557..4298beb0 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -32,7 +32,7 @@ "type": "string", "description": "Email address for completion summary.", "fa_icon": "fas fa-envelope", - "help_text": "Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.", + "help_text": "Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`), then you don't need to specify this on the command line for every run.", "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" }, "multiqc_title": { @@ -66,7 +66,7 @@ "protocol": { "type": "string", "description": "The protocol that was used to generate the single cell data, e.g. 10x Genomics v2 Chemistry.\n\n Can be 'auto' (cellranger only), '10XV1', '10XV2', '10XV3', '10XV4', or any other protocol string that will get directly passed the respective aligner.", - "help_text": "The default is to auto-detect the protocol when running cellranger. For all other aligners the protocol MUST be manually specified. \n\n The following protocols are recognized by the pipeline and mapped to the corresponding protocol name of the respective aligner: '10XV1', '10XV2', '10XV3', '10XV4'. \n\nAny other protocol value is passed to the aligner in verbatim to support other sequencing platforms. See the [kallisto](https://pachterlab.github.io/kallisto/manual#bus), [simpleaf](https://simpleaf.readthedocs.io/en/latest/quant-command.html#a-note-on-the-chemistry-flag), [starsolo](https://gensoft.pasteur.fr/docs/STAR/2.7.9a/STARsolo.html)", + "help_text": "The default is to auto-detect the protocol when running cellranger. For all other aligners, the protocol MUST be manually specified. \n\n The following protocols are recognized by the pipeline and mapped to the corresponding protocol name of the respective aligner: '10XV1', '10XV2', '10XV3', '10XV4'. \n\nAny other protocol value is passed to the aligner verbatim to support other sequencing platforms. See the [kallisto](https://pachterlab.github.io/kallisto/manual#bus), [simpleaf](https://simpleaf.readthedocs.io/en/latest/quant-command.html#a-note-on-the-chemistry-flag), [starsolo](https://gensoft.pasteur.fr/docs/STAR/2.7.9a/STARsolo.html)", "default": "auto", "fa_icon": "fas fa-cogs" } @@ -76,7 +76,7 @@ "skip_tools": { "title": "Skip Tools", "type": "object", - "description": "This section can be used to disable certain tools in the pipeline", + "description": "This section can be used to disable certain tools in the pipeline", "default": "", "fa_icon": "fas fa-forward", "properties": { @@ -118,7 +118,7 @@ "mimetype": "text/plain", "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", "description": "Path to FASTA genome file.", - "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", + "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available, this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", "fa_icon": "far fa-file-code" }, "igenomes_ignore": { @@ -334,12 +334,12 @@ "type": "string", "description": "Provide a panel description for targeted sequencing.", "format": "file-path", - "exists": "true" + "exists": true }, "gex_cmo_set": { "type": "string", "format": "file-path", - "exists": "true", + "exists": true, "description": "Provide a Cell Multiplexing Oligo (CMO) description file when working with multiplexed samples. This is only necessary if you with to override Cell Ranger's default CMO-set. Please refer to the [10x documentation](https://www.10xgenomics.com/support/software/cell-ranger/latest/analysis/running-pipelines/cr-3p-multi#cmo-ref) about CMO references for more details." }, "fb_reference": { @@ -359,7 +359,7 @@ "format": "file-path", "mimetype": "text/csv", "exists": true, - "description": "This is only necessary to override Cell Ranger's default cell calling and tag calling steps. In most cases you need to only use the `cellranger_multi_barcodes` parameter. Please refer to the [10x documentation](https://www.10xgenomics.com/support/software/cell-ranger/latest/analysis/running-pipelines/cr-3p-multi#barcode-asst) for more information about this file." + "description": "This is only necessary to override Cell Ranger's default cell calling and tag calling steps. In most cases, you need to only use the `cellranger_multi_barcodes` parameter. Please refer to the [10x documentation](https://www.10xgenomics.com/support/software/cell-ranger/latest/analysis/running-pipelines/cr-3p-multi#barcode-asst) for more information about this file." }, "cellranger_multi_barcodes": { "type": "string", From 0f8d949394ce64aab0622437f08169810e383671 Mon Sep 17 00:00:00 2001 From: Alex Bartlett Date: Mon, 24 Mar 2025 14:06:40 -0400 Subject: [PATCH 11/82] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b883fa42..fed3727c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,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). ## v4.1.0dev +- Update nextflow_schema.json ## v4.0.0 - 2025-03-10 From 932fa1c4bc8160a7455da66b3a802d756953d37c Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 25 Mar 2025 07:01:27 +0000 Subject: [PATCH 12/82] [automated] Fix code linting --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fed3727c..e5abdb7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,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). ## v4.1.0dev + - Update nextflow_schema.json ## v4.0.0 - 2025-03-10 From 6983615f142a295cd319ac1d8e897330a19418b7 Mon Sep 17 00:00:00 2001 From: Matteo Bonfanti Date: Wed, 26 Mar 2025 16:25:27 +0100 Subject: [PATCH 13/82] added cellrangerarc test --- .github/workflows/ci.yml | 2 +- assets/cellrangerarc_samplesheet.csv | 3 +- tests/main_pipeline_cellrangerarc.nf.test | 71 +++++++++++++++++-- .../main_pipeline_cellrangerarc.nf.test.snap | 26 +++++++ 4 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 tests/main_pipeline_cellrangerarc.nf.test.snap diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b7020ad5..203080ee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,7 +38,7 @@ jobs: NXF_VER: - "24.04.2" - "latest-everything" - profile: ["simpleaf", "cellranger", "cellrangermulti", "kallisto", "star"] + profile: ["simpleaf", "cellranger", "cellrangermulti", "kallisto", "star", "cellrangerarc"] steps: - name: Disk space cleanup diff --git a/assets/cellrangerarc_samplesheet.csv b/assets/cellrangerarc_samplesheet.csv index fc7df174..47ac16a4 100644 --- a/assets/cellrangerarc_samplesheet.csv +++ b/assets/cellrangerarc_samplesheet.csv @@ -1,2 +1,3 @@ sample,fastq_1,fastq_2,fastq_barcode,sample_type -test_scATAC,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/10xgenomics/cellranger-atac/test_scATAC_S1_L001_R1_001.fastq.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/10xgenomics/cellranger-atac/test_scATAC_S1_L001_R2_001.fastq.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/homo_sapiens/10xgenomics/cellranger-atac/test_scATAC_S1_L001_R3_001.fastq.gz,atac +10k_PBMC,"https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger-arc/10x_pbmc_multiome/fastqs/10k_PBMC_Multiome_nextgem_Chromium_X_gex_chr21_subsample_S2_L001_R1_001.fastq.gz","https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger-arc/10x_pbmc_multiome/fastqs/10k_PBMC_Multiome_nextgem_Chromium_X_gex_chr21_subsample_S2_L001_R2_001.fastq.gz",,gex +10k_PBMC,"https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger-arc/10x_pbmc_multiome/fastqs/10k_PBMC_Multiome_nextgem_Chromium_X_atac_chr21_subsample_S2_L001_R1_001.fastq.gz","https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger-arc/10x_pbmc_multiome/fastqs/10k_PBMC_Multiome_nextgem_Chromium_X_atac_chr21_subsample_S2_L001_R2_001.fastq.gz","https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger-arc/10x_pbmc_multiome/fastqs/10k_PBMC_Multiome_nextgem_Chromium_X_atac_chr21_subsample_S2_L001_R3_001.fastq.gz",atac diff --git a/tests/main_pipeline_cellrangerarc.nf.test b/tests/main_pipeline_cellrangerarc.nf.test index a51493e1..60a7a2f0 100644 --- a/tests/main_pipeline_cellrangerarc.nf.test +++ b/tests/main_pipeline_cellrangerarc.nf.test @@ -6,21 +6,82 @@ nextflow_pipeline { test("test-dataset_cellrangerarc_aligner") { when { + // the rest is taken from shared config params { aligner = 'cellrangerarc' outdir = "${outputDir}/results_cellrangerarc" input = "${baseDir}/assets/cellrangerarc_samplesheet.csv" - fb_reference = "${baseDir}/assets/fb_reference.csv" - fasta = 'https://ftp.ensembl.org/pub/release-110/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.chromosome.1.fa.gz' - gtf = 'https://ftp.ensembl.org/pub/release-110/gtf/homo_sapiens/Homo_sapiens.GRCh38.110.gtf.gz' + fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/genome/chr21/sequence/genome.fasta' + gtf = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/genome/chr21/sequence/chr21_gencode.gtf' protocol = 'auto' + skip_cellbender = true } } then { - assert workflow.success - } + assertAll( + + // + // General assertions + // + + // Did it finish successfully? + {assert workflow.success}, + + // How many tasks were executed? + {assert workflow.trace.tasks().size() == 14}, + + // How many results were produced? + {assert path("${outputDir}/results_cellrangerarc").list().size() == 4}, + {assert path("${outputDir}/results_cellrangerarc/cellrangerarc").list().size() == 4}, + {assert path("${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions").list().size() == 7}, + {assert path("${outputDir}/results_cellrangerarc/cellrangerarc/count").list().size() == 3}, + {assert path("${outputDir}/results_cellrangerarc/fastqc").list().size() == 10}, + {assert path("${outputDir}/results_cellrangerarc/multiqc").list().size() == 3}, + + // + // Check if files were produced + // + {assert new File( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_raw_matrix.h5ad" ).exists()}, + {assert new File( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_filtered_matrix.h5ad" ).exists()}, + {assert new File( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/combined_raw_matrix.h5ad" ).exists()}, + {assert new File( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/combined_filtered_matrix.h5ad" ).exists()}, + + // + // Check if files are the same + // + {assert snapshot( + // barcodes.tsv.gz files + path( "${outputDir}/results_cellrangerarc/cellrangerarc/count/10k_PBMC/outs/filtered_feature_bc_matrix/barcodes.tsv.gz" ), + path( "${outputDir}/results_cellrangerarc/cellrangerarc/count/10k_PBMC/outs/raw_feature_bc_matrix/barcodes.tsv.gz" ), + + // features.tsv.gz files + path( "${outputDir}/results_cellrangerarc/cellrangerarc/count/10k_PBMC/outs/filtered_feature_bc_matrix/features.tsv.gz" ), + path( "${outputDir}/results_cellrangerarc/cellrangerarc/count/10k_PBMC/outs/raw_feature_bc_matrix/features.tsv.gz" ), + + // matrix.mtx.gz files + path( "${outputDir}/results_cellrangerarc/cellrangerarc/count/10k_PBMC/outs/filtered_feature_bc_matrix/matrix.mtx.gz" ), + path( "${outputDir}/results_cellrangerarc/cellrangerarc/count/10k_PBMC/outs/raw_feature_bc_matrix/matrix.mtx.gz" ), + + // metrics_summary.csv files + path( "${outputDir}/results_cellrangerarc/cellrangerarc/count/10k_PBMC/outs/summary.csv" ), + + // .rds files + path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_raw_matrix.sce.rds" ), + path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_filtered_matrix.sce.rds" ), + path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_raw_matrix.seurat.rds" ), + path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_filtered_matrix.seurat.rds" ), + path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/combined_raw_matrix.sce.rds" ), + path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/combined_filtered_matrix.sce.rds" ), + path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/combined_raw_matrix.seurat.rds" ), + path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/combined_filtered_matrix.seurat.rds" ), + + ).match()} + + ) // end of assertAll() + + } } } diff --git a/tests/main_pipeline_cellrangerarc.nf.test.snap b/tests/main_pipeline_cellrangerarc.nf.test.snap new file mode 100644 index 00000000..b74d0a81 --- /dev/null +++ b/tests/main_pipeline_cellrangerarc.nf.test.snap @@ -0,0 +1,26 @@ +{ + "test-dataset_cellrangerarc_aligner": { + "content": [ + "barcodes.tsv.gz:md5,b5499384bbd9ecbd448c90dd73d9e84c", + "barcodes.tsv.gz:md5,dc8ef24c54122529bdb2c7cd5969c805", + "features.tsv.gz:md5,456af0e5fa4a7bcb3968400f300d12e9", + "features.tsv.gz:md5,456af0e5fa4a7bcb3968400f300d12e9", + "matrix.mtx.gz:md5,83c4b3e84668282fbe55d02d84256b3f", + "matrix.mtx.gz:md5,4b3aa16b720d414f5df50c533052d360", + "summary.csv:md5,90da383cd94786c0a3810b903c8de8f6", + "10k_PBMC_raw_matrix.sce.rds:md5,196adfcb230f9ba9bb7d0aba36e7e261", + "10k_PBMC_filtered_matrix.sce.rds:md5,359160d80821c5dbf1ebc7a88dbe8400", + "10k_PBMC_raw_matrix.seurat.rds:md5,8ff4d68d88a6a7e3528147e06aeaa4dd", + "10k_PBMC_filtered_matrix.seurat.rds:md5,ca44f68f2ea255bfd556c71a6b91423e", + "combined_raw_matrix.sce.rds:md5,4846edfc332c65c129b554c27a357dc7", + "combined_filtered_matrix.sce.rds:md5,4c1dee683e3d0e602556a69b9b64b3a5", + "combined_raw_matrix.seurat.rds:md5,8900e93d58f613d56f02a4243769498a", + "combined_filtered_matrix.seurat.rds:md5,91f83560d80b7b1ab238161d73c64831" + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-03-26T16:19:15.398105567" + } +} \ No newline at end of file From 23ad77bc2f8a8f5ae2d8f0002dc9e7d0aefa6f47 Mon Sep 17 00:00:00 2001 From: nick-youngblut Date: Wed, 26 Mar 2025 08:43:37 -0700 Subject: [PATCH 14/82] updated --cellranger_index docs --- docs/usage.md | 5 +++-- nextflow_schema.json | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 180e8018..d5d9e5a2 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -139,8 +139,9 @@ test_scARC,path/test_scARC_gex_S1_L002_R1_001.fastq.gz,path/test_scARC_gex_S1_L0 #### Config file and index -Cellranger-arc needs a reference index directory that you can provide with `--cellranger_index`. Be aware, you can use -for cellranger-arc the same index you use for cellranger ([see](https://kb.10xgenomics.com/hc/en-us/articles/4408281606797-Are-the-references-interchangeable-between-pipelines)). +Cellranger-arc needs a reference index directory that you can provide with `--cellranger_index`. +Besure to provide the base path of the index (e.g., `--cellranger_index /PATH/TO/10X_REF/refdata-gex-GRCh38-2024-A/`). +Be aware, you can use for cellranger-arc the same index you use for cellranger ([see](https://kb.10xgenomics.com/hc/en-us/articles/4408281606797-Are-the-references-interchangeable-between-pipelines)). Yet, a cellranger-arc index might include additional data (e.g., TF binding motifs). Therefore, please first check if you have to create a new cellranger-arc index ([see here](https://support.10xgenomics.com/single-cell-multiome-atac-gex/software/pipelines/latest/advanced/references) for more information) diff --git a/nextflow_schema.json b/nextflow_schema.json index 6ecbf557..ebf24132 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -278,7 +278,7 @@ "properties": { "cellranger_index": { "type": "string", - "description": "Specify a pre-calculated cellranger index. Readily prepared indexes can be obtained from the 10x Genomics website. ", + "description": "Specify a pre-calculated cellranger index. Readily prepared indexes can be obtained from the 10x Genomics website. Provide the base directory of the index (e.g., '/PATH/TO/10X_REF/refdata-gex-GRCh38-2024-A/')", "format": "path", "exists": true }, From fb3ae403c7cb1984e5331292580b36fc20fc2681 Mon Sep 17 00:00:00 2001 From: Matteo Bonfanti Date: Wed, 26 Mar 2025 21:47:04 +0100 Subject: [PATCH 15/82] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59992a29..991f4def 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Update nextflow_schema.json - Fix simpleaf protocol name for 10xv4 ([#452](https://github.com/nf-core/scrnaseq/pull/452)) +- Fix the workflow for cellranger-arc alignment and add new test with 10x multiome dataset ([#441](https://github.com/nf-core/scrnaseq/pull/441)) ## v4.0.0 - 2025-03-10 From 2aacd6488de76cac4142e6a9e8a04ce33e057235 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 27 Mar 2025 08:47:11 +0000 Subject: [PATCH 16/82] [automated] Fix code linting --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index d5d9e5a2..62b5aae1 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -139,7 +139,7 @@ test_scARC,path/test_scARC_gex_S1_L002_R1_001.fastq.gz,path/test_scARC_gex_S1_L0 #### Config file and index -Cellranger-arc needs a reference index directory that you can provide with `--cellranger_index`. +Cellranger-arc needs a reference index directory that you can provide with `--cellranger_index`. Besure to provide the base path of the index (e.g., `--cellranger_index /PATH/TO/10X_REF/refdata-gex-GRCh38-2024-A/`). Be aware, you can use for cellranger-arc the same index you use for cellranger ([see](https://kb.10xgenomics.com/hc/en-us/articles/4408281606797-Are-the-references-interchangeable-between-pipelines)). Yet, a cellranger-arc index might include additional data (e.g., TF binding motifs). Therefore, please first check if From b3dbad3ed577f9cfe5fb9305479168924a2f3956 Mon Sep 17 00:00:00 2001 From: nictru Date: Thu, 27 Mar 2025 17:50:08 +0100 Subject: [PATCH 17/82] Update protocol documentation --- README.md | 2 +- docs/usage.md | 51 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index b21aed46..95fd2ce8 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ graph TD A[sc RNA] -->|STARsolo| B(h5ad/seurat/mtx matrices) ``` -Options for the respective alignment method can be found [here](https://github.com/nf-core/scrnaseq/blob/dev/docs/usage.md#aligning-options) to choose between methods. +Options for the respective alignment method can be found [here](https://nf-co.re/scrnaseq/docs/usage/#aligning-options) to choose between methods. ## Pipeline output diff --git a/docs/usage.md b/docs/usage.md index 180e8018..62a787c0 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -79,18 +79,35 @@ As a sanity check, we verify that filenames of a pair of FASTQ files only differ ### Support for different scRNA-seq protocols The single-cell protocol used in the experiment can be specified using the `--protocol` flag. -For cellranger, it is recommended to stick with the default value `'auto'` for automatic detection of the protocol. -For all other aligner, you need to specify the protocol manually. +Note that the nf-core/scrnaseq pipeline is designed to support only barcode-based protocols. +An overview of unsupported protocols can be found in the [unsupported protocols](#unsupported-protocols) section. -The three 10x Genomics protocols 3' v1 (`10XV1`), 3' v2 (`10XV2`), 3' v3 (`10XV3`), and 3' v4 (`10XV4`) are universally supported -by all aligners in the pipeline and mapped to the correct options automatically. If the protocol is unknown to the -nf-core pipeline, the value specified to `--protocol` is passed to the aligner _in verbatim_ to support additional protocols. +The four 10x Genomics protocols 3' v1, 3' v2, 3' v3, and 3' v4 are universally supported +by all aligners in the pipeline and mapped to the correct options automatically. +A full overview of the protocols supported by each aligner is given below. +If the protocol is unknown to the pipeline, the value specified to `--protocol` is passed to the aligner _in verbatim_ to support additional protocols. -Here are some hints on running the various aligners with different protocols +| Protocol | Accession | Cellranger | Simpleaf | STARsolo | Kallisto/bustools | Cellranger-arc | +|----------|-----------|------------|-----------|-----------|------------------|----------------| +| 10x V1 | `10XV1` | ✅ | ✅ | ✅ | ✅ | ❌ | +| 10x V2 | `10XV2` | ✅ | ✅ | ✅ | ✅ | ❌ | +| 10x V3 | `10XV3` | ✅ | ✅ | ✅ | ✅ | ❌ | +| 10x V4 | `10XV4` | ✅ | ✅ | ✅ | ✅ | ❌ | +| Drop-seq | `dropseq` | ❌ | ✅ | ✅ | ✅ | ❌ | +| Smart-seq3 | `smartseq` | ❌ | ❌ | ✅ | ✅ | ❌ | +| auto | `auto` | ✅ | ❌ | ❌ | ❌ | ✅ | +| custom | custom string | ❌ | ✅ | ✅ | ✅ | ❌ | + +Here are some hints on running the various aligners with different protocols: + +#### Cell Ranger + +Cell Ranger only supports the processing of 10x Genomics protocols. +It is recommended to stick with the default value `'auto'` for the `--protocol` flag for automatic detection of the protocol. #### Kallisto/bustools -The command `kb --list` shows all supported, preconfigured protocols. Additionally, a custom technology string such as +The command `kb --list` shows all supported, preconfigured protocols. All of these can be used with the `--protocol` flag and will be directly passed to the aligner. Additionally, a custom technology string such as `0,0,16:0,16,26:1,0,0` can be speficied: > Additionally kallisto bus will accept a string specifying a new technology in the format of bc:umi:seq where each of bc,umi and seq are a triplet of integers separated by a comma, denoting the file index, start and stop of the sequence used. For example to specify the 10xV2 technology we would use 0,0,16:0,16,26:1,0,0 @@ -103,11 +120,11 @@ Simpleaf has the ability to pass custom chemistries to Alevin-fry, in a slightly For more details, see Simpleaf's paper, [He _et al._ 2023](https://doi.org/10.1093/bioinformatics/btad614) and the [detailed description](https://hackmd.io/@PI7Og0l1ReeBZu_pjQGUQQ/rJMgmvr13). -### If using cellranger-arc +#### Cell Ranger ARC -#### Automatic file name detection +##### Automatic file name detection -This pipeline currently **does not** automatically renames input FASTQ files to follow the +This pipeline currently **does not** automatically rename input FASTQ files to follow the [naming convention by 10x](https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/using/fastq-input): ``` @@ -116,7 +133,7 @@ This pipeline currently **does not** automatically renames input FASTQ files to Thus please make sure your files follow this naming convention. -#### Sample sheet definition +##### Sample sheet definition If you are using cellranger-arc you have to add the column _sample_type_ (atac for scATAC or gex for scRNA) and _fastq_barcode_ (part of the scATAC data) to your samplesheet as an input. @@ -137,7 +154,7 @@ test_scARC,path/test_scARC_gex_S1_L001_R1_001.fastq.gz,path/test_scARC_gex_S1_L0 test_scARC,path/test_scARC_gex_S1_L002_R1_001.fastq.gz,path/test_scARC_gex_S1_L002_R2_001.fastq.gz,,gex ``` -#### Config file and index +##### Config file and index Cellranger-arc needs a reference index directory that you can provide with `--cellranger_index`. Be aware, you can use for cellranger-arc the same index you use for cellranger ([see](https://kb.10xgenomics.com/hc/en-us/articles/4408281606797-Are-the-references-interchangeable-between-pipelines)). @@ -150,6 +167,16 @@ can do this autmatically for you if you provide a `--fasta`, `--gtf`, and an opt also decide to provide your own config file with `--cellrangerarc_config`, then you also have to specify with `--cellrangerarc_reference` the reference genome name that you have used and stated as _genome:_ in your config file. +#### Unsupported protocols + +nf-core/scrnaseq is designed specifically for barcode-based single-cell RNA sequencing protocols. Several types of protocols are currently not supported: + +##### Smart-seq2 +Smart-seq2 data should be processed with [nf-core/rnaseq](https://nf-co.re/rnaseq) pipeline instead, as it is better suited for plate-based full-length transcript sequencing without UMIs. + +##### Cell hashing and genotype-based demultiplexing +For cell hashing or genetic demultiplexing of pooled samples, we recommend using the [hadge pipeline](https://hadge.readthedocs.io/en/latest/). While not currently part of nf-core, hadge is being prepared for integration. You can follow its development progress [in the nf-core Slack](https://nfcore.slack.com/archives/C067K2P6GUV). + ## Running the pipeline The minimum typical command for running the pipeline is as follows: From efce2aa30f2cce4665de5f972ae0fbdd69a82875 Mon Sep 17 00:00:00 2001 From: nictru Date: Fri, 28 Mar 2025 09:35:13 +0100 Subject: [PATCH 18/82] Prettier --- docs/usage.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 62a787c0..27eff0fb 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -87,16 +87,16 @@ by all aligners in the pipeline and mapped to the correct options automatically. A full overview of the protocols supported by each aligner is given below. If the protocol is unknown to the pipeline, the value specified to `--protocol` is passed to the aligner _in verbatim_ to support additional protocols. -| Protocol | Accession | Cellranger | Simpleaf | STARsolo | Kallisto/bustools | Cellranger-arc | -|----------|-----------|------------|-----------|-----------|------------------|----------------| -| 10x V1 | `10XV1` | ✅ | ✅ | ✅ | ✅ | ❌ | -| 10x V2 | `10XV2` | ✅ | ✅ | ✅ | ✅ | ❌ | -| 10x V3 | `10XV3` | ✅ | ✅ | ✅ | ✅ | ❌ | -| 10x V4 | `10XV4` | ✅ | ✅ | ✅ | ✅ | ❌ | -| Drop-seq | `dropseq` | ❌ | ✅ | ✅ | ✅ | ❌ | -| Smart-seq3 | `smartseq` | ❌ | ❌ | ✅ | ✅ | ❌ | -| auto | `auto` | ✅ | ❌ | ❌ | ❌ | ✅ | -| custom | custom string | ❌ | ✅ | ✅ | ✅ | ❌ | +| Protocol | Accession | Cellranger | Simpleaf | STARsolo | Kallisto/bustools | Cellranger-arc | +| ---------- | ------------- | ---------- | -------- | -------- | ----------------- | -------------- | +| 10x V1 | `10XV1` | ✅ | ✅ | ✅ | ✅ | ❌ | +| 10x V2 | `10XV2` | ✅ | ✅ | ✅ | ✅ | ❌ | +| 10x V3 | `10XV3` | ✅ | ✅ | ✅ | ✅ | ❌ | +| 10x V4 | `10XV4` | ✅ | ✅ | ✅ | ✅ | ❌ | +| Drop-seq | `dropseq` | ❌ | ✅ | ✅ | ✅ | ❌ | +| Smart-seq3 | `smartseq` | ❌ | ❌ | ✅ | ✅ | ❌ | +| auto | `auto` | ✅ | ❌ | ❌ | ❌ | ✅ | +| custom | custom string | ❌ | ✅ | ✅ | ✅ | ❌ | Here are some hints on running the various aligners with different protocols: @@ -172,9 +172,11 @@ the reference genome name that you have used and stated as _genome:_ in your con nf-core/scrnaseq is designed specifically for barcode-based single-cell RNA sequencing protocols. Several types of protocols are currently not supported: ##### Smart-seq2 + Smart-seq2 data should be processed with [nf-core/rnaseq](https://nf-co.re/rnaseq) pipeline instead, as it is better suited for plate-based full-length transcript sequencing without UMIs. ##### Cell hashing and genotype-based demultiplexing + For cell hashing or genetic demultiplexing of pooled samples, we recommend using the [hadge pipeline](https://hadge.readthedocs.io/en/latest/). While not currently part of nf-core, hadge is being prepared for integration. You can follow its development progress [in the nf-core Slack](https://nfcore.slack.com/archives/C067K2P6GUV). ## Running the pipeline From 711a1977cec7fa217a171a620392cfebf76024e4 Mon Sep 17 00:00:00 2001 From: Gregor Sturm Date: Thu, 24 Apr 2025 08:37:26 +0200 Subject: [PATCH 19/82] Add ruff to pre-commit checks --- .editorconfig | 2 +- .pre-commit-config.yaml | 9 ++++ .ruff.toml | 49 +++++++++++++++++++ bin/check_cellrangermulti.py | 8 +-- bin/filter_gtf_for_genes_in_genome.py | 22 ++++----- bin/generate_lib_csv.py | 1 - bin/t2g.py | 7 +-- modules/local/templates/concat_h5ad.py | 14 ++++-- .../local/templates/mtx_to_h5ad_cellranger.py | 27 +++++----- .../local/templates/mtx_to_h5ad_kallisto.py | 45 +++++++---------- .../local/templates/mtx_to_h5ad_simpleaf.py | 31 ++++++------ modules/local/templates/mtx_to_h5ad_star.py | 28 ++++++----- .../anndata/barcodes/templates/barcodes.py | 1 + .../count/templates/cellranger_count.py | 11 ++--- .../multi/templates/cellranger_multi.py | 17 +++---- 15 files changed, 170 insertions(+), 102 deletions(-) create mode 100644 .ruff.toml diff --git a/.editorconfig b/.editorconfig index 6d9b74cc..968b9c4c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,7 +8,7 @@ trim_trailing_whitespace = true indent_size = 4 indent_style = space -[*.{md,yml,yaml,html,css,scss,js}] +[*.{md,yml,yaml,html,css,scss,js,toml}] indent_size = 2 # These files are edited and tested upstream in nf-core/modules diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1dec8650..2066560d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,3 +11,12 @@ repos: hooks: - id: editorconfig-checker alias: ec + + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.11.6 + hooks: + - id: ruff + types_or: [python, pyi, jupyter] + args: [--fix, --exit-non-zero-on-fix] + - id: ruff-format + types_or: [python, pyi, jupyter] diff --git a/.ruff.toml b/.ruff.toml new file mode 100644 index 00000000..524f5e7b --- /dev/null +++ b/.ruff.toml @@ -0,0 +1,49 @@ +line-length = 120 +extend-include = [ "*.ipynb" ] + +format.docstring-code-format = true +lint.select = [ + "B", # flake8-bugbear + "BLE", # flake8-blind-except + "C4", # flake8-comprehensions + "D", # pydocstyle + "E", # Error detected by Pycodestyle + "F", # Errors detected by Pyflakes + "I", # isort + "RUF100", # Report unused noqa directives + "TID", # flake8-tidy-imports + "UP", # pyupgrade + "W", # Warning detected by Pycodestyle +] +lint.ignore = [ + # Errors from function calls in argument defaults. These are fine when the result is immutable. + "B008", + # Missing docstring in public module + "D100", + # Missing docstring in public package + "D104", + # __magic__ methods are often self-explanatory, allow missing docstrings + "D105", + # Missing docstring in __init__ + "D107", + ## Disable one in each pair of mutually incompatible rules + # We don’t want a blank line before a class docstring + "D203", + # We want docstrings to start immediately after the opening triple quote + "D213", + # first line should end with a period [Bug: doesn't work with single-line docstrings] + "D400", + # First line should be in imperative mood; try rephrasing + "D401", + # line too long -> we accept long comment lines; formatter gets rid of long code lines + "E501", + # Do not assign a lambda expression, use a def -> lambda expression assignments are convenient + "E731", + # allow I, O, l as variable names -> I is the identity matrix + "E741", + # We can live without docstrings in public functions in scripts + "D103" +] +lint.per-file-ignores."*/templates/*" = [ + "F821" # Undefined name (due to nextflow variables) +] diff --git a/bin/check_cellrangermulti.py b/bin/check_cellrangermulti.py index edea5a86..f8a5d495 100755 --- a/bin/check_cellrangermulti.py +++ b/bin/check_cellrangermulti.py @@ -4,6 +4,7 @@ import os import sys + def parse_samplesheet(samplesheet_path): # Define required headers required_headers = ["sample", "multiplexed_sample_id", "description"] @@ -14,7 +15,7 @@ def parse_samplesheet(samplesheet_path): os.makedirs(cmo_output_dir, exist_ok=True) os.makedirs(frna_output_dir, exist_ok=True) - with open(samplesheet_path, 'r') as csvfile: + with open(samplesheet_path) as csvfile: reader = csv.DictReader(csvfile) headers = reader.fieldnames @@ -33,7 +34,7 @@ def parse_samplesheet(samplesheet_path): # Process CMOs if "cmo_ids" in headers and row["cmo_ids"]: cmo_filename = os.path.join(cmo_output_dir, f"{sample}_cmo.csv") - with open(cmo_filename, 'a', newline='') as cmo_file: + with open(cmo_filename, "a", newline="") as cmo_file: cmo_writer = csv.writer(cmo_file) if not os.path.exists(cmo_filename) or os.stat(cmo_filename).st_size == 0: cmo_writer.writerow(["sample_id", "cmo_ids", "description"]) @@ -42,7 +43,7 @@ def parse_samplesheet(samplesheet_path): # Process FRNAs if "probe_barcode_ids" in headers and row["probe_barcode_ids"]: frna_filename = os.path.join(frna_output_dir, f"{sample}_frna.csv") - with open(frna_filename, 'a', newline='') as frna_file: + with open(frna_filename, "a", newline="") as frna_file: frna_writer = csv.writer(frna_file) if not os.path.exists(frna_filename) or os.stat(frna_filename).st_size == 0: frna_writer.writerow(["sample_id", "probe_barcode_ids", "description"]) @@ -51,6 +52,7 @@ def parse_samplesheet(samplesheet_path): print("Parsing completed successfully.") return True + if __name__ == "__main__": if len(sys.argv) != 2: print("Usage: python script.py ") diff --git a/bin/filter_gtf_for_genes_in_genome.py b/bin/filter_gtf_for_genes_in_genome.py index 485f8392..180ae709 100755 --- a/bin/filter_gtf_for_genes_in_genome.py +++ b/bin/filter_gtf_for_genes_in_genome.py @@ -2,10 +2,9 @@ # Script originally written by Pranathi Vemuri (github.com/pranathivemuri) # modified by Harshil Patel (github.com/drpatelh) -from __future__ import print_function +import argparse import logging from itertools import groupby -import argparse # Create a logger logging.basicConfig(format="%(name)s - %(asctime)s %(levelname)s: %(message)s") @@ -18,11 +17,12 @@ def is_header(line): def extract_fasta_seq_names(fasta_name): - """ - modified from Brent Pedersen + """Get sequence names from FFASTA files. + + Modified from Brent Pedersen Correct Way To Parse A Fasta File In Python given a fasta file. yield tuples of header, sequence - from https://www.biostars.org/p/710/ + from https://www.biostars.org/p/710/. """ # first open the file outside fh = open(fasta_name) @@ -31,7 +31,7 @@ def extract_fasta_seq_names(fasta_name): # we know they alternate. faiter = (x[1] for x in groupby(fh, is_header)) - for i, header in enumerate(faiter): + for _i, header in enumerate(faiter): line = next(header) if is_header(line): # drop the ">" @@ -41,9 +41,9 @@ def extract_fasta_seq_names(fasta_name): def extract_genes_in_genome(fasta, gtf_in, gtf_out): seq_names_in_genome = set(extract_fasta_seq_names(fasta)) - logger.info("Extracted chromosome sequence names from : %s" % fasta) + logger.info(f"Extracted chromosome sequence names from : {fasta}") logger.info("All chromosome names: " + ", ".join(sorted(x for x in seq_names_in_genome))) - seq_names_in_gtf = set([]) + seq_names_in_gtf = set() n_total_lines = 0 n_lines_in_genome = 0 @@ -56,12 +56,10 @@ def extract_genes_in_genome(fasta, gtf_in, gtf_out): if seq_name_gtf in seq_names_in_genome: n_lines_in_genome += 1 f.write(line) - logger.info( - "Extracted %d / %d lines from %s matching sequences in %s" % (n_lines_in_genome, n_total_lines, gtf_in, fasta) - ) + logger.info(f"Extracted {n_lines_in_genome} / {n_total_lines} lines from {gtf_in} matching sequences in {fasta}") logger.info("All sequence IDs from GTF: " + ", ".join(sorted(x for x in seq_name_gtf))) - logger.info("Wrote matching lines to %s" % gtf_out) + logger.info(f"Wrote matching lines to {gtf_out}") if __name__ == "__main__": diff --git a/bin/generate_lib_csv.py b/bin/generate_lib_csv.py index 5c1c0c4f..d3bde4ae 100755 --- a/bin/generate_lib_csv.py +++ b/bin/generate_lib_csv.py @@ -1,6 +1,5 @@ #!/usr/bin/env python import argparse -import os if __name__ == "__main__": parser = argparse.ArgumentParser(description="Generate the lib.csv for cellranger-arc.") diff --git a/bin/t2g.py b/bin/t2g.py index 2e1953c4..90eca74b 100755 --- a/bin/t2g.py +++ b/bin/t2g.py @@ -27,7 +27,8 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import sys, argparse +import argparse +import sys def create_transcript_list(input, use_name=True, use_version=False): @@ -77,9 +78,9 @@ def create_transcript_list(input, use_name=True, use_version=False): def print_output(output, r, use_name=True): for tid in r: if use_name: - output.write("%s\t%s\t%s\n" % (tid, r[tid][0], r[tid][1])) + output.write(f"{tid}\t{r[tid][0]}\t{r[tid][1]}\n") else: - output.write("%s\t%s\n" % (tid, r[tid][0])) + output.write(f"{tid}\t{r[tid][0]}\n") if __name__ == "__main__": diff --git a/modules/local/templates/concat_h5ad.py b/modules/local/templates/concat_h5ad.py index f6e1ccc4..b1c4fc71 100755 --- a/modules/local/templates/concat_h5ad.py +++ b/modules/local/templates/concat_h5ad.py @@ -5,9 +5,12 @@ os.environ["NUMBA_CACHE_DIR"] = "." -import scanpy as sc, anndata as ad, pandas as pd -from pathlib import Path import platform +from pathlib import Path + +import anndata as ad +import pandas as pd +import scanpy as sc def read_samplesheet(samplesheet): @@ -21,13 +24,17 @@ def read_samplesheet(samplesheet): return df + def format_yaml_like(data: dict, indent: int = 0) -> str: """Formats a dictionary to a YAML-like string. + Args: data (dict): The dictionary to format. indent (int): The current indentation level. + Returns: str: A string formatted as YAML. + """ yaml_str = "" for key, value in data.items(): @@ -38,6 +45,7 @@ def format_yaml_like(data: dict, indent: int = 0) -> str: yaml_str += f"{spaces}{key}: {value}\\n" return yaml_str + def dump_versions(): versions = { "${task.process}": { @@ -49,8 +57,8 @@ def dump_versions(): with open("versions.yml", "w") as f: f.write(format_yaml_like(versions)) -if __name__ == "__main__": +if __name__ == "__main__": # Open samplesheet as dataframe df_samplesheet = read_samplesheet("${samplesheet}") diff --git a/modules/local/templates/mtx_to_h5ad_cellranger.py b/modules/local/templates/mtx_to_h5ad_cellranger.py index 44d587e6..b8448af2 100755 --- a/modules/local/templates/mtx_to_h5ad_cellranger.py +++ b/modules/local/templates/mtx_to_h5ad_cellranger.py @@ -5,19 +5,18 @@ os.environ["NUMBA_CACHE_DIR"] = "." -import scanpy as sc -import pandas as pd -import argparse -import anndata -from anndata import AnnData -import platform import glob +import platform + +import anndata +import pandas as pd +import scanpy as sc + def _mtx_to_adata( input: str, sample: str, ): - adata = sc.read_10x_h5(input) adata.var["gene_symbols"] = adata.var_names adata.var.set_index("gene_ids", inplace=True) @@ -31,11 +30,14 @@ def _mtx_to_adata( def format_yaml_like(data: dict, indent: int = 0) -> str: """Formats a dictionary to a YAML-like string. + Args: data (dict): The dictionary to format. indent (int): The current indentation level. + Returns: str: A string formatted as YAML. + """ yaml_str = "" for key, value in data.items(): @@ -46,6 +48,7 @@ def format_yaml_like(data: dict, indent: int = 0) -> str: yaml_str += f"{spaces}{key}: {value}\\n" return yaml_str + def dump_versions(): versions = { "${task.process}": { @@ -59,6 +62,7 @@ def dump_versions(): with open("versions.yml", "w") as f: f.write(format_yaml_like(versions)) + def input_to_adata( input_data: str, output: str, @@ -71,8 +75,8 @@ def input_to_adata( # standard format # index are gene IDs and symbols are a column - adata.var['gene_versions'] = adata.var.index - adata.var.index = adata.var['gene_versions'].str.split('.').str[0].values + adata.var["gene_versions"] = adata.var.index + adata.var.index = adata.var["gene_versions"].str.split(".").str[0].values adata.var_names_make_unique() # write results @@ -84,6 +88,7 @@ def input_to_adata( return adata + # # Run main script # @@ -93,7 +98,7 @@ def input_to_adata( # input_type comes from NF module adata = input_to_adata( - input_data=glob.glob("*${meta.input_type}_feature_bc_matrix.h5")[0], # cellrangermulti has 'sample_' as prefix + input_data=glob.glob("*${meta.input_type}_feature_bc_matrix.h5")[0], # cellrangermulti has 'sample_' as prefix output="${meta.id}_${meta.input_type}_matrix.h5ad", - sample="${meta.id}" + sample="${meta.id}", ) diff --git a/modules/local/templates/mtx_to_h5ad_kallisto.py b/modules/local/templates/mtx_to_h5ad_kallisto.py index 281c1d6f..9655cab3 100755 --- a/modules/local/templates/mtx_to_h5ad_kallisto.py +++ b/modules/local/templates/mtx_to_h5ad_kallisto.py @@ -5,14 +5,16 @@ os.environ["NUMBA_CACHE_DIR"] = "." -import scanpy as sc -import pandas as pd -import anndata -from anndata import AnnData, concat as concat_ad -from scipy.sparse import csr_matrix -import platform import glob +import platform + +import anndata import numpy as np +import pandas as pd +import scanpy as sc +from anndata import AnnData +from anndata import concat as concat_ad +from scipy.sparse import csr_matrix def _mtx_to_adata( @@ -20,7 +22,7 @@ def _mtx_to_adata( barcodes: str, features: str, ): - """Load kallisto-formatted mtx files into AnnData""" + """Load kallisto-formatted mtx files into AnnData.""" adata = sc.read_mtx(matrix) adata.obs_names = pd.read_csv(barcodes, header=None, sep="\\t")[0].values adata.var_names = pd.read_csv(features, header=None, sep="\\t")[0].values @@ -28,12 +30,10 @@ def _mtx_to_adata( def _add_metadata(adata: AnnData, t2g: str, sample: str): - """Add var and obs metadata""" + """Add var and obs metadata.""" adata.obs["sample"] = sample - txp2gene = pd.read_table( - t2g, header=None, names=["gene_id", "gene_symbol"], usecols=[1, 2] - ) + txp2gene = pd.read_table(t2g, header=None, names=["gene_id", "gene_symbol"], usecols=[1, 2]) txp2gene = txp2gene.drop_duplicates(subset="gene_id").set_index("gene_id") adata.var = adata.var.join(txp2gene, how="left") @@ -46,11 +46,14 @@ def _add_metadata(adata: AnnData, t2g: str, sample: str): def format_yaml_like(data: dict, indent: int = 0) -> str: """Formats a dictionary to a YAML-like string. + Args: data (dict): The dictionary to format. indent (int): The current indentation level. + Returns: str: A string formatted as YAML. + """ yaml_str = "" for key, value in data.items(): @@ -116,12 +119,8 @@ def dump_versions(): var=unspliced.var, ) - spliced = concat_ad([spliced, ad_missing_spliced], join="outer")[ - all_barcodes, : - ] - unspliced = concat_ad([unspliced, ad_missing_unspliced], join="outer")[ - all_barcodes, : - ] + spliced = concat_ad([spliced, ad_missing_spliced], join="outer")[all_barcodes, :] + unspliced = concat_ad([unspliced, ad_missing_unspliced], join="outer")[all_barcodes, :] assert np.all(spliced.var_names == unspliced.var_names) @@ -175,15 +174,9 @@ def dump_versions(): var=mature.var, ) - nascent = concat_ad([nascent, ad_missing_nascent], join="outer")[ - all_barcodes, : - ] - ambiguous = concat_ad([ambiguous, ad_missing_ambiguous], join="outer")[ - all_barcodes, : - ] - mature = concat_ad([mature, ad_missing_mature], join="outer")[ - all_barcodes, : - ] + nascent = concat_ad([nascent, ad_missing_nascent], join="outer")[all_barcodes, :] + ambiguous = concat_ad([ambiguous, ad_missing_ambiguous], join="outer")[all_barcodes, :] + mature = concat_ad([mature, ad_missing_mature], join="outer")[all_barcodes, :] assert np.all(nascent.var_names == ambiguous.var_names) assert np.all(mature.var_names == ambiguous.var_names) diff --git a/modules/local/templates/mtx_to_h5ad_simpleaf.py b/modules/local/templates/mtx_to_h5ad_simpleaf.py index 5d3a778e..40c2dd67 100755 --- a/modules/local/templates/mtx_to_h5ad_simpleaf.py +++ b/modules/local/templates/mtx_to_h5ad_simpleaf.py @@ -5,21 +5,23 @@ os.environ["NUMBA_CACHE_DIR"] = "." -import scanpy as sc -import pandas as pd -import argparse -import anndata -from anndata import AnnData import platform -import json + +import anndata +import pandas as pd +import scanpy as sc + def format_yaml_like(data: dict, indent: int = 0) -> str: """Formats a dictionary to a YAML-like string. + Args: data (dict): The dictionary to format. indent (int): The current indentation level. + Returns: str: A string formatted as YAML. + """ yaml_str = "" for key, value in data.items(): @@ -30,6 +32,7 @@ def format_yaml_like(data: dict, indent: int = 0) -> str: yaml_str += f"{spaces}{key}: {value}\\n" return yaml_str + def dump_versions(): versions = { "${task.process}": { @@ -43,6 +46,7 @@ def dump_versions(): with open("versions.yml", "w") as f: f.write(format_yaml_like(versions)) + def input_to_adata( input_data: str, output: str, @@ -55,8 +59,8 @@ def input_to_adata( # the simpleaf quant module exports an h5ad file. adata = sc.read_h5ad(simpleaf_h5ad_path) - adata.obs_names = adata.obs['barcodes'].values - adata.var_names = adata.var['gene_id'].values + adata.obs_names = adata.obs["barcodes"].values + adata.var_names = adata.var["gene_id"].values adata.obs["sample"] = sample # sort adata column- and row- wise to avoid positional differences @@ -64,8 +68,8 @@ def input_to_adata( # standard format # index are gene IDs and symbols are a column - adata.var['gene_versions'] = adata.var['gene_id'] - adata.var.index = adata.var['gene_versions'].str.split('.').str[0].values + adata.var["gene_versions"] = adata.var["gene_id"] + adata.var.index = adata.var["gene_versions"].str.split(".").str[0].values adata.var_names_make_unique() # sort adata column- and row- wise to avoid positional differences @@ -75,6 +79,7 @@ def input_to_adata( adata.write_h5ad(f"{output}") print(f"Wrote h5ad file to {output}") + # # Run main script # @@ -83,11 +88,7 @@ def input_to_adata( os.makedirs("${meta.id}", exist_ok=True) # input_type comes from NF module -input_to_adata( - input_data="${inputs}", - output="${meta.id}_${meta.input_type}_matrix.h5ad", - sample="${meta.id}" -) +input_to_adata(input_data="${inputs}", output="${meta.id}_${meta.input_type}_matrix.h5ad", sample="${meta.id}") # dump versions dump_versions() diff --git a/modules/local/templates/mtx_to_h5ad_star.py b/modules/local/templates/mtx_to_h5ad_star.py index 0ce9e650..73227515 100755 --- a/modules/local/templates/mtx_to_h5ad_star.py +++ b/modules/local/templates/mtx_to_h5ad_star.py @@ -5,14 +5,15 @@ os.environ["NUMBA_CACHE_DIR"] = "." -import scanpy as sc -import pandas as pd -import argparse +import platform + import anndata +import pandas as pd +import scanpy as sc from anndata import AnnData, concat -import platform from scipy.sparse import csr_matrix + def _mtx_to_adata( input: str, sample: str, @@ -36,7 +37,7 @@ def _mtx_to_adata( adata_missing = AnnData( X=csr_matrix((len(missing_obs), adata.shape[1])), obs=pd.DataFrame(index=missing_obs), - var=adata_state.var + var=adata_state.var, ) adata_state = concat([adata_state, adata_missing], join="outer") adata_state = adata_state[adata.obs_names, adata.var["gene_ids"]].copy() @@ -45,13 +46,17 @@ def _mtx_to_adata( return adata + def format_yaml_like(data: dict, indent: int = 0) -> str: """Formats a dictionary to a YAML-like string. + Args: data (dict): The dictionary to format. indent (int): The current indentation level. + Returns: str: A string formatted as YAML. + """ yaml_str = "" for key, value in data.items(): @@ -62,6 +67,7 @@ def format_yaml_like(data: dict, indent: int = 0) -> str: yaml_str += f"{spaces}{key}: {value}\\n" return yaml_str + def dump_versions(): versions = { "${task.process}": { @@ -75,6 +81,7 @@ def dump_versions(): with open("versions.yml", "w") as f: f.write(format_yaml_like(versions)) + def input_to_adata( input_data: str, output: str, @@ -88,14 +95,15 @@ def input_to_adata( # standard format # index are gene IDs and symbols are a column adata.var["gene_symbol"] = adata.var.index - adata.var['gene_versions'] = adata.var["gene_ids"] - adata.var.index = adata.var['gene_versions'].str.split('.').str[0].values + adata.var["gene_versions"] = adata.var["gene_ids"] + adata.var.index = adata.var["gene_versions"].str.split(".").str[0].values adata.var_names_make_unique() # in case user does not use ensembl references, names might not be unique # write results adata.write_h5ad(f"{output}") print(f"Wrote h5ad file to {output}") + # # Run main script # @@ -104,11 +112,7 @@ def input_to_adata( os.makedirs("${meta.id}", exist_ok=True) # input_type comes from NF module -input_to_adata( - input_data="${meta.input_type}", - output="${meta.id}_${meta.input_type}_matrix.h5ad", - sample="${meta.id}" -) +input_to_adata(input_data="${meta.input_type}", output="${meta.id}_${meta.input_type}_matrix.h5ad", sample="${meta.id}") # dump versions dump_versions() diff --git a/modules/nf-core/anndata/barcodes/templates/barcodes.py b/modules/nf-core/anndata/barcodes/templates/barcodes.py index b7dcd63a..bddc1db1 100644 --- a/modules/nf-core/anndata/barcodes/templates/barcodes.py +++ b/modules/nf-core/anndata/barcodes/templates/barcodes.py @@ -15,6 +15,7 @@ def format_yaml_like(data: dict, indent: int = 0) -> str: Returns: str: A string formatted as YAML. + """ yaml_str = "" for key, value in data.items(): diff --git a/modules/nf-core/cellranger/count/templates/cellranger_count.py b/modules/nf-core/cellranger/count/templates/cellranger_count.py index 7cd68e27..c3d28bb6 100644 --- a/modules/nf-core/cellranger/count/templates/cellranger_count.py +++ b/modules/nf-core/cellranger/count/templates/cellranger_count.py @@ -1,19 +1,18 @@ #!/usr/bin/env python3 -""" -Automatically rename staged files for input into cellranger count. +"""Automatically rename staged files for input into cellranger count. Copyright (c) Gregor Sturm 2023 - MIT License """ -from subprocess import run +import re +import shlex from pathlib import Path +from subprocess import run from textwrap import dedent -import shlex -import re def chunk_iter(seq, size): - """iterate over `seq` in chunks of `size`""" + """Iterate over `seq` in chunks of `size`.""" return (seq[pos : pos + size] for pos in range(0, len(seq), size)) diff --git a/modules/nf-core/cellranger/multi/templates/cellranger_multi.py b/modules/nf-core/cellranger/multi/templates/cellranger_multi.py index bff70be8..261c1fe6 100644 --- a/modules/nf-core/cellranger/multi/templates/cellranger_multi.py +++ b/modules/nf-core/cellranger/multi/templates/cellranger_multi.py @@ -1,19 +1,18 @@ #!/usr/bin/env python3 -""" -Automatically rename staged files for input into cellranger multi and run it. +"""Automatically rename staged files for input into cellranger multi and run it. Copyright (c) Felipe Almeida 2024 - MIT License """ -from subprocess import run +import re +import shlex from pathlib import Path +from subprocess import run from textwrap import dedent -import shlex -import re def chunk_iter(seq, size): - """iterate over `seq` in chunks of `size`""" + """Iterate over `seq` in chunks of `size`.""" return (seq[pos : pos + size] for pos in range(0, len(seq), size)) @@ -140,16 +139,16 @@ def chunk_iter(seq, size): # check the extra data that is included # if len("${include_cmo}") > 0: - with open("${cmo_csv_text}", "r") as input_conf: + with open("${cmo_csv_text}") as input_conf: config_txt = config_txt + "\\n${include_cmo}\\n" + input_conf.read() + "\\n" if len("${include_beam}") > 0: - with open("${beam_csv_text}", "r") as input_conf, open("${beam_antigen_csv}", "r") as input_csv: + with open("${beam_csv_text}") as input_conf, open("${beam_antigen_csv}") as input_csv: config_txt = config_txt + "\\n${include_beam}\\n" + input_conf.read() + "\\n" config_txt = config_txt + "[feature]\\n" + input_csv.read() + "\\n" if len("${include_frna}") > 0: - with open("${frna_csv_text}", "r") as input_conf: + with open("${frna_csv_text}") as input_conf: config_txt = config_txt + "\\n${include_frna}\\n" + input_conf.read() + "\\n" # Remove blank lines from config text From 737767d99d6b3b290cf5230315ca61eac9e6e647 Mon Sep 17 00:00:00 2001 From: Gregor Sturm Date: Thu, 24 Apr 2025 08:41:38 +0200 Subject: [PATCH 20/82] Don't format modules and subworkflows --- .ruff.toml | 4 ++++ .../anndata/barcodes/templates/barcodes.py | 1 - .../count/templates/cellranger_count.py | 11 ++++++----- .../multi/templates/cellranger_multi.py | 17 +++++++++-------- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/.ruff.toml b/.ruff.toml index 524f5e7b..b63c2645 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -1,5 +1,9 @@ line-length = 120 extend-include = [ "*.ipynb" ] +exclude = [ + "modules/nf-core/*", + "subworkflows/nf-core/*", +] format.docstring-code-format = true lint.select = [ diff --git a/modules/nf-core/anndata/barcodes/templates/barcodes.py b/modules/nf-core/anndata/barcodes/templates/barcodes.py index bddc1db1..b7dcd63a 100644 --- a/modules/nf-core/anndata/barcodes/templates/barcodes.py +++ b/modules/nf-core/anndata/barcodes/templates/barcodes.py @@ -15,7 +15,6 @@ def format_yaml_like(data: dict, indent: int = 0) -> str: Returns: str: A string formatted as YAML. - """ yaml_str = "" for key, value in data.items(): diff --git a/modules/nf-core/cellranger/count/templates/cellranger_count.py b/modules/nf-core/cellranger/count/templates/cellranger_count.py index c3d28bb6..7cd68e27 100644 --- a/modules/nf-core/cellranger/count/templates/cellranger_count.py +++ b/modules/nf-core/cellranger/count/templates/cellranger_count.py @@ -1,18 +1,19 @@ #!/usr/bin/env python3 -"""Automatically rename staged files for input into cellranger count. +""" +Automatically rename staged files for input into cellranger count. Copyright (c) Gregor Sturm 2023 - MIT License """ -import re -import shlex -from pathlib import Path from subprocess import run +from pathlib import Path from textwrap import dedent +import shlex +import re def chunk_iter(seq, size): - """Iterate over `seq` in chunks of `size`.""" + """iterate over `seq` in chunks of `size`""" return (seq[pos : pos + size] for pos in range(0, len(seq), size)) diff --git a/modules/nf-core/cellranger/multi/templates/cellranger_multi.py b/modules/nf-core/cellranger/multi/templates/cellranger_multi.py index 261c1fe6..bff70be8 100644 --- a/modules/nf-core/cellranger/multi/templates/cellranger_multi.py +++ b/modules/nf-core/cellranger/multi/templates/cellranger_multi.py @@ -1,18 +1,19 @@ #!/usr/bin/env python3 -"""Automatically rename staged files for input into cellranger multi and run it. +""" +Automatically rename staged files for input into cellranger multi and run it. Copyright (c) Felipe Almeida 2024 - MIT License """ -import re -import shlex -from pathlib import Path from subprocess import run +from pathlib import Path from textwrap import dedent +import shlex +import re def chunk_iter(seq, size): - """Iterate over `seq` in chunks of `size`.""" + """iterate over `seq` in chunks of `size`""" return (seq[pos : pos + size] for pos in range(0, len(seq), size)) @@ -139,16 +140,16 @@ def chunk_iter(seq, size): # check the extra data that is included # if len("${include_cmo}") > 0: - with open("${cmo_csv_text}") as input_conf: + with open("${cmo_csv_text}", "r") as input_conf: config_txt = config_txt + "\\n${include_cmo}\\n" + input_conf.read() + "\\n" if len("${include_beam}") > 0: - with open("${beam_csv_text}") as input_conf, open("${beam_antigen_csv}") as input_csv: + with open("${beam_csv_text}", "r") as input_conf, open("${beam_antigen_csv}", "r") as input_csv: config_txt = config_txt + "\\n${include_beam}\\n" + input_conf.read() + "\\n" config_txt = config_txt + "[feature]\\n" + input_csv.read() + "\\n" if len("${include_frna}") > 0: - with open("${frna_csv_text}") as input_conf: + with open("${frna_csv_text}", "r") as input_conf: config_txt = config_txt + "\\n${include_frna}\\n" + input_conf.read() + "\\n" # Remove blank lines from config text From cda15eab54c6a8d3575541a9cbf28b9951e661a2 Mon Sep 17 00:00:00 2001 From: Gregor Sturm Date: Thu, 24 Apr 2025 08:43:23 +0200 Subject: [PATCH 21/82] Update CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 991f4def..d95e9caf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix simpleaf protocol name for 10xv4 ([#452](https://github.com/nf-core/scrnaseq/pull/452)) - Fix the workflow for cellranger-arc alignment and add new test with 10x multiome dataset ([#441](https://github.com/nf-core/scrnaseq/pull/441)) +### Chore + +- Add ruff pre-commit check as linter/autoformatter for python scripts ([#464](https://github.com/nf-core/scrnaseq/pull/464)) + ## v4.0.0 - 2025-03-10 - Move `txp2gene` to `reference_genome_options` in schema as it is required by `kb_python` and `alevin` ([434](https://github.com/nf-core/scrnaseq/pull/434)) From 076f597f556ef24bee95577b14278cddd259e315 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Wed, 30 Apr 2025 12:28:47 +0000 Subject: [PATCH 22/82] Template update for nf-core/tools version 3.2.1 --- .github/workflows/awsfulltest.yml | 41 ++++++++----------------------- .github/workflows/ci.yml | 1 + .nf-core.yml | 2 +- nextflow.config | 2 +- ro-crate-metadata.json | 12 ++++----- 5 files changed, 19 insertions(+), 39 deletions(-) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index d3d0bc7d..5a6c0512 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -4,44 +4,23 @@ name: nf-core AWS full size tests # It runs the -profile 'test_full' on AWS batch on: - pull_request: - branches: - - main - - master workflow_dispatch: pull_request_review: types: [submitted] + release: + types: [published] jobs: run-platform: name: Run AWS full tests - # run only if the PR is approved by at least 2 reviewers and against the master branch or manually triggered - if: github.repository == 'nf-core/scrnaseq' && github.event.review.state == 'approved' && github.event.pull_request.base.ref == 'master' || github.event_name == 'workflow_dispatch' + # run only if the PR is approved by at least 2 reviewers and against the master/main branch or manually triggered + if: github.repository == 'nf-core/scrnaseq' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest steps: - - name: Get PR reviews - uses: octokit/request-action@v2.x - if: github.event_name != 'workflow_dispatch' - id: check_approvals - continue-on-error: true - with: - route: GET /repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/reviews?per_page=100 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Check for approvals - if: ${{ failure() && github.event_name != 'workflow_dispatch' }} - run: | - echo "No review approvals found. At least 2 approvals are required to run this action automatically." - exit 1 - - - name: Check for enough approvals (>=2) - id: test_variables - if: github.event_name != 'workflow_dispatch' + - name: Set revision variable + id: revision run: | - JSON_RESPONSE='${{ steps.check_approvals.outputs.data }}' - CURRENT_APPROVALS_COUNT=$(echo $JSON_RESPONSE | jq -c '[.[] | select(.state | contains("APPROVED")) ] | length') - test $CURRENT_APPROVALS_COUNT -ge 2 || exit 1 # At least 2 approvals are required + echo "revision=${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'release') && github.sha || 'dev' }}" >> "$GITHUB_OUTPUT" - name: Launch workflow via Seqera Platform uses: seqeralabs/action-tower-launch@v2 @@ -52,12 +31,12 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - revision: ${{ github.sha }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/scrnaseq/work-${{ github.sha }} + revision: ${{ steps.revision.outputs.revision }} + workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/scrnaseq/work-${{ steps.revision.outputs.revision }} parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/scrnaseq/results-${{ github.sha }}" + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/scrnaseq/results-${{ steps.revision.outputs.revision }}" } profiles: test_full diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1177b834..78503771 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,5 +83,6 @@ jobs: uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" + continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} run: | nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.test_name }},${{ matrix.profile }} --outdir ./results diff --git a/.nf-core.yml b/.nf-core.yml index 3bd2b6c3..dd92a904 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,7 +5,7 @@ lint: - .github/ISSUE_TEMPLATE/bug_report.yml schema_params: false template_strings: false -nf_core_version: 3.2.0 +nf_core_version: 3.2.1 repository_type: pipeline template: author: Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G diff --git a/nextflow.config b/nextflow.config index 5ca9932a..150b79ea 100644 --- a/nextflow.config +++ b/nextflow.config @@ -281,7 +281,7 @@ manifest { // Nextflow plugins plugins { - id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.2.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index b590285f..cbc6ee8f 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,7 +22,7 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-01-27T14:47:38+00:00", + "datePublished": "2025-04-30T12:28:29+00:00", "description": "

\n \n \n \"nf-core/scrnaseq\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/scrnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\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/scrnaseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![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/scrnaseq** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\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\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/scrnaseq \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\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/scrnaseq/usage) and the [parameter documentation](https://nf-co.re/scrnaseq/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/scrnaseq/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/scrnaseq/output).\n\n## Credits\n\nnf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\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 `#scrnaseq` channel](https://nfcore.slack.com/channels/scrnaseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\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", "hasPart": [ { @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#f190e2f0-7ea7-4df7-86ec-66c2f2437fa2" + "@id": "#56d750ed-bc56-4036-87ab-b29e712f44db" } ], "name": "nf-core/scrnaseq" @@ -128,7 +128,7 @@ } ], "dateCreated": "", - "dateModified": "2025-01-27T14:47:38Z", + "dateModified": "2025-04-30T12:28:29Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -167,11 +167,11 @@ "version": "!>=24.04.2" }, { - "@id": "#f190e2f0-7ea7-4df7-86ec-66c2f2437fa2", + "@id": "#56d750ed-bc56-4036-87ab-b29e712f44db", "@type": "TestSuite", "instance": [ { - "@id": "#e07cb77a-0eb3-44db-a30e-1e99e9e3c7de" + "@id": "#9ea77cb4-8323-4726-ba6d-ac081273f9a9" } ], "mainEntity": { @@ -180,7 +180,7 @@ "name": "Test suite for nf-core/scrnaseq" }, { - "@id": "#e07cb77a-0eb3-44db-a30e-1e99e9e3c7de", + "@id": "#9ea77cb4-8323-4726-ba6d-ac081273f9a9", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/scrnaseq", "resource": "repos/nf-core/scrnaseq/actions/workflows/ci.yml", From 93269e68544b6a2e317a2c821bf6618c5f8a60de Mon Sep 17 00:00:00 2001 From: Felipe Marques de Almeida Date: Wed, 7 May 2025 08:40:39 +0000 Subject: [PATCH 23/82] update modules with nf-core tools --- modules.json | 10 +- modules/nf-core/cellranger/count/main.nf | 2 +- modules/nf-core/cellranger/count/meta.yml | 70 +++--- .../count/templates/cellranger_count.py | 8 +- .../cellranger/count/tests/main.nf.test.snap | 34 +-- .../nf-core/cellranger/count/tests/tags.yml | 2 - modules/nf-core/cellranger/mkgtf/main.nf | 2 +- modules/nf-core/cellranger/mkgtf/meta.yml | 30 ++- .../cellranger/mkgtf/tests/main.nf.test.snap | 20 +- .../nf-core/cellranger/mkgtf/tests/tags.yml | 2 - modules/nf-core/cellranger/mkref/main.nf | 2 +- modules/nf-core/cellranger/mkref/meta.yml | 44 ++-- .../cellranger/mkref/tests/main.nf.test.snap | 22 +- .../nf-core/cellranger/mkref/tests/tags.yml | 2 - modules/nf-core/cellranger/mkvdjref/main.nf | 2 +- modules/nf-core/cellranger/mkvdjref/meta.yml | 57 +++-- .../mkvdjref/tests/main.nf.test.snap | 24 +- .../cellranger/mkvdjref/tests/tags.yml | 2 - modules/nf-core/cellranger/multi/main.nf | 4 +- modules/nf-core/cellranger/multi/meta.yml | 222 +++++++++++------- .../multi/templates/cellranger_multi.py | 20 +- .../cellranger/multi/tests/main.nf.test | 146 ++++++++++++ .../cellranger/multi/tests/main.nf.test.snap | 84 +++++-- .../nf-core/cellranger/multi/tests/tags.yml | 2 - 24 files changed, 538 insertions(+), 275 deletions(-) delete mode 100644 modules/nf-core/cellranger/count/tests/tags.yml delete mode 100644 modules/nf-core/cellranger/mkgtf/tests/tags.yml delete mode 100644 modules/nf-core/cellranger/mkref/tests/tags.yml delete mode 100644 modules/nf-core/cellranger/mkvdjref/tests/tags.yml delete mode 100644 modules/nf-core/cellranger/multi/tests/tags.yml diff --git a/modules.json b/modules.json index d7f956de..f7d106c5 100644 --- a/modules.json +++ b/modules.json @@ -17,27 +17,27 @@ }, "cellranger/count": { "branch": "master", - "git_sha": "90dad5491658049282ceb287a3d7732c1ce39837", + "git_sha": "c93c5a87d7ea1aef0b81a64d6e6b00bdb79d52c2", "installed_by": ["modules"] }, "cellranger/mkgtf": { "branch": "master", - "git_sha": "90dad5491658049282ceb287a3d7732c1ce39837", + "git_sha": "c93c5a87d7ea1aef0b81a64d6e6b00bdb79d52c2", "installed_by": ["modules"] }, "cellranger/mkref": { "branch": "master", - "git_sha": "3549a361ce3401b6afd238a266389d78392a53f6", + "git_sha": "c93c5a87d7ea1aef0b81a64d6e6b00bdb79d52c2", "installed_by": ["modules"] }, "cellranger/mkvdjref": { "branch": "master", - "git_sha": "e66183d2ab6a5c2f3fd66b2bee942287cf65536c", + "git_sha": "c93c5a87d7ea1aef0b81a64d6e6b00bdb79d52c2", "installed_by": ["modules"] }, "cellranger/multi": { "branch": "master", - "git_sha": "90dad5491658049282ceb287a3d7732c1ce39837", + "git_sha": "c93c5a87d7ea1aef0b81a64d6e6b00bdb79d52c2", "installed_by": ["modules"] }, "cellrangerarc/count": { diff --git a/modules/nf-core/cellranger/count/main.nf b/modules/nf-core/cellranger/count/main.nf index cf94615b..51d82397 100644 --- a/modules/nf-core/cellranger/count/main.nf +++ b/modules/nf-core/cellranger/count/main.nf @@ -2,7 +2,7 @@ process CELLRANGER_COUNT { tag "$meta.id" label 'process_high' - container "nf-core/cellranger:8.0.0" + container "nf-core/cellranger:9.0.1" input: tuple val(meta), path(reads, stageAs: "fastq_???/*") diff --git a/modules/nf-core/cellranger/count/meta.yml b/modules/nf-core/cellranger/count/meta.yml index 1f1768a8..046faf9f 100644 --- a/modules/nf-core/cellranger/count/meta.yml +++ b/modules/nf-core/cellranger/count/meta.yml @@ -1,49 +1,61 @@ name: cellranger_count -description: Module to use Cell Ranger's pipelines analyze sequencing data produced from Chromium Single Cell Gene Expression. +description: Module to use Cell Ranger's pipelines analyze sequencing data produced + from Chromium Single Cell Gene Expression. keywords: - align - count - reference tools: - cellranger: - description: Cell Ranger by 10x Genomics is a set of analysis pipelines that process Chromium single-cell data to align reads, generate feature-barcode matrices, perform clustering and other secondary analysis, and more. + description: Cell Ranger by 10x Genomics is a set of analysis pipelines that process + Chromium single-cell data to align reads, generate feature-barcode matrices, + perform clustering and other secondary analysis, and more. homepage: https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/what-is-cell-ranger documentation: https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/using/tutorial_ov tool_dev_url: https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/using/tutorial_ov licence: - 10x Genomics EULA + identifier: "" input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files. The order of the input files MUST be ["sample1 R1", "sample1 R2", "sample2, R1", - "sample2, R2", ...]. This can usually be achieved by sorting the input files by file name. + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files. The order of the input files MUST be ["sample1 R1", "sample1 R2", "sample2, R1", + "sample2, R2", ...]. This can usually be achieved by sorting the input files by file name. - Background: 10x data is always paired-end with R1 containing cell barcode and UMI - and R2 containing the actual read sequence. Cell Ranger requires files to adhere to the following file-name - convention: `${Sample_Name}_S1_L00${Lane_Number}_${R1,R2}_001.fastq.gz`. This module automatically - renames files to match this convention based on the order of input files to avoid various - issues (see https://github.com/nf-core/scrnaseq/issues/241). To avoid mistakes, the module - throws an error if a pair of R1 and R2 fastq files does not have the same filename except for the "_R1"/"_R2" part. - Renaming the files does not affect the results (see README.md for detailed tests). - pattern: "*{R1,R2}*.fastq.gz" - - reference: - type: directory - description: Folder containing all the reference indices needed by Cell Ranger + Background: 10x data is always paired-end with R1 containing cell barcode and UMI + and R2 containing the actual read sequence. Cell Ranger requires files to adhere to the following file-name + convention: `${Sample_Name}_S1_L00${Lane_Number}_${R1,R2}_001.fastq.gz`. This module automatically + renames files to match this convention based on the order of input files to avoid various + issues (see https://github.com/nf-core/scrnaseq/issues/241). To avoid mistakes, the module + throws an error if a pair of R1 and R2 fastq files does not have the same filename except for the "_R1"/"_R2" part. + Renaming the files does not affect the results (see README.md for detailed tests). + pattern: "*{R1,R2}*.fastq.gz" + - - reference: + type: directory + description: Folder containing all the reference indices needed by Cell Ranger output: - outs: - type: file - description: Files containing the outputs of Cell Ranger, see official 10X Genomics documentation for a complete list - pattern: "${meta.id}/outs/*" + - meta: + type: file + description: Files containing the outputs of Cell Ranger, see official 10X Genomics + documentation for a complete list + pattern: "${meta.id}/outs/*" + - "**/outs/**": + type: file + description: Files containing the outputs of Cell Ranger, see official 10X Genomics + documentation for a complete list + pattern: "${meta.id}/outs/*" - versions: - type: file - description: File containing software version - pattern: "versions.yml" + - versions.yml: + type: file + description: File containing software version + pattern: "versions.yml" authors: - "@ggabernet" - "@edmundmiller" diff --git a/modules/nf-core/cellranger/count/templates/cellranger_count.py b/modules/nf-core/cellranger/count/templates/cellranger_count.py index 7cd68e27..41b9bb8f 100644 --- a/modules/nf-core/cellranger/count/templates/cellranger_count.py +++ b/modules/nf-core/cellranger/count/templates/cellranger_count.py @@ -5,11 +5,11 @@ Copyright (c) Gregor Sturm 2023 - MIT License """ -from subprocess import run +import re +import shlex from pathlib import Path +from subprocess import run from textwrap import dedent -import shlex -import re def chunk_iter(seq, size): @@ -21,7 +21,7 @@ def chunk_iter(seq, size): # get fastqs, ordered by path. Files are staged into # - "fastq_001/{original_name.fastq.gz}" -# - "fastq_002/{oritinal_name.fastq.gz}" +# - "fastq_002/{original_name.fastq.gz}" # - ... # Since we require fastq files in the input channel to be ordered such that a R1/R2 pair # of files follows each other, ordering will get us a sequence of [R1, R2, R1, R2, ...] diff --git a/modules/nf-core/cellranger/count/tests/main.nf.test.snap b/modules/nf-core/cellranger/count/tests/main.nf.test.snap index 77d7d486..f54fb831 100644 --- a/modules/nf-core/cellranger/count/tests/main.nf.test.snap +++ b/modules/nf-core/cellranger/count/tests/main.nf.test.snap @@ -2,26 +2,26 @@ "10x example file": { "content": [ [ - "versions.yml:md5,3c769adb8bc0f753eb9283b89f6541dd" + "versions.yml:md5,0dc3a237aed20a1af22efdadc21222f8" ], [ - "filtered_feature_bc_matrix.h5:md5,a875919b9d468efef9f846c95a7f53d6", + "filtered_feature_bc_matrix.h5:md5,da1c5757a060b18d37c7009440f2a3ec", "features.tsv.gz:md5,9f93621be0bede2b75596ad255607633", - "matrix.mtx.gz:md5,149c4055b85f5235d8b93d9e20dcaf4e", - "metrics_summary.csv:md5,c295fe3ccbb6ce118482964ca9c748d4", - "molecule_info.h5:md5,ea14830a187799eac6312181d05530f4", - "possorted_genome_bam.bam:md5,d249eff0cb6eebcfdb46342071ea8388", - "possorted_genome_bam.bam.bai:md5,223db5969de6cc2603eaa8fd0d58f766", - "raw_feature_bc_matrix.h5:md5,c34335a1aadd0d8cb6c770034c658889", + "matrix.mtx.gz:md5,62dbded3ef45337a019cce26b0a05c98", + "metrics_summary.csv:md5,ca698c488b1d9e7942d31645f7f6c080", + "molecule_info.h5:md5,dafc840adf71e1b36e35b5e34dba77b1", + "possorted_genome_bam.bam:md5,dc049209801a56ded49cc2dfde19ede3", + "possorted_genome_bam.bam.bai:md5,9e82f162fe4729c1d9f48d20c8689648", + "raw_feature_bc_matrix.h5:md5,32920fde374505367b0cfeafb7368cf7", "features.tsv.gz:md5,9f93621be0bede2b75596ad255607633", - "matrix.mtx.gz:md5,6395f3c1ec7700b0c6a72e432830ffc1" + "matrix.mtx.gz:md5,b7fa476c92b8ad8f04c10e0119b218b4" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-03-22T08:17:11.168345294" + "timestamp": "2025-04-24T14:13:52.226355059" }, "10x example file - stub": { "content": [ @@ -37,7 +37,7 @@ ] ], "1": [ - "versions.yml:md5,443f4d697e6c549da3d3f3cd0e55b55c" + "versions.yml:md5,c7ef25b3465ec73fe7704df709b2bcb1" ], "outs": [ [ @@ -50,14 +50,14 @@ ] ], "versions": [ - "versions.yml:md5,443f4d697e6c549da3d3f3cd0e55b55c" + "versions.yml:md5,c7ef25b3465ec73fe7704df709b2bcb1" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-03-22T08:15:18.556883641" + "timestamp": "2025-04-24T14:15:54.371712887" } } \ No newline at end of file diff --git a/modules/nf-core/cellranger/count/tests/tags.yml b/modules/nf-core/cellranger/count/tests/tags.yml deleted file mode 100644 index a29a7044..00000000 --- a/modules/nf-core/cellranger/count/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -cellranger/count: - - "modules/nf-core/cellranger/count/**" diff --git a/modules/nf-core/cellranger/mkgtf/main.nf b/modules/nf-core/cellranger/mkgtf/main.nf index 6817a4dd..4d8f7e09 100644 --- a/modules/nf-core/cellranger/mkgtf/main.nf +++ b/modules/nf-core/cellranger/mkgtf/main.nf @@ -2,7 +2,7 @@ process CELLRANGER_MKGTF { tag "$gtf" label 'process_low' - container "nf-core/cellranger:8.0.0" + container "nf-core/cellranger:9.0.1" input: path gtf diff --git a/modules/nf-core/cellranger/mkgtf/meta.yml b/modules/nf-core/cellranger/mkgtf/meta.yml index 282fcff0..ceaca540 100644 --- a/modules/nf-core/cellranger/mkgtf/meta.yml +++ b/modules/nf-core/cellranger/mkgtf/meta.yml @@ -1,30 +1,36 @@ name: cellranger_mkgtf -description: Module to build a filtered GTF needed by the 10x Genomics Cell Ranger tool. Uses the cellranger mkgtf command. +description: Module to build a filtered GTF needed by the 10x Genomics Cell Ranger + tool. Uses the cellranger mkgtf command. keywords: - reference - mkref - index tools: - cellranger: - description: Cell Ranger by 10x Genomics is a set of analysis pipelines that process Chromium single-cell data to align reads, generate feature-barcode matrices, perform clustering and other secondary analysis, and more. + description: Cell Ranger by 10x Genomics is a set of analysis pipelines that process + Chromium single-cell data to align reads, generate feature-barcode matrices, + perform clustering and other secondary analysis, and more. homepage: https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/what-is-cell-ranger documentation: https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/using/tutorial_ov tool_dev_url: https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/using/tutorial_ov licence: [10X Genomics EULA] + identifier: "" input: - - gtf: - type: file - description: The reference GTF transcriptome file - pattern: "*.gtf" + - - gtf: + type: file + description: The reference GTF transcriptome file + pattern: "*.gtf" output: - gtf: - type: directory - description: The filtered GTF transcriptome file - pattern: "*.filtered.gtf" + - "*.gtf": + type: directory + description: The filtered GTF transcriptome file + pattern: "*.filtered.gtf" - versions: - type: file - description: File containing software version - pattern: "versions.yml" + - versions.yml: + type: file + description: File containing software version + pattern: "versions.yml" authors: - "@ggabernet" - "@edmundmiller" diff --git a/modules/nf-core/cellranger/mkgtf/tests/main.nf.test.snap b/modules/nf-core/cellranger/mkgtf/tests/main.nf.test.snap index 05bea037..5877de4a 100644 --- a/modules/nf-core/cellranger/mkgtf/tests/main.nf.test.snap +++ b/modules/nf-core/cellranger/mkgtf/tests/main.nf.test.snap @@ -6,21 +6,21 @@ "genome.filtered.gtf:md5,50fc877b1c53b36b3b413aff88bda48c" ], "1": [ - "versions.yml:md5,440fb677a34013b092e10c5daa9916e9" + "versions.yml:md5,708c6b98134cdeaa8a48b764ba952628" ], "gtf": [ "genome.filtered.gtf:md5,50fc877b1c53b36b3b413aff88bda48c" ], "versions": [ - "versions.yml:md5,440fb677a34013b092e10c5daa9916e9" + "versions.yml:md5,708c6b98134cdeaa8a48b764ba952628" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-03-22T08:51:17.576906345" + "timestamp": "2025-04-24T14:46:28.244866661" }, "homo_sapiens - reference - stub": { "content": [ @@ -29,20 +29,20 @@ "genome.filtered.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" ], "1": [ - "versions.yml:md5,440fb677a34013b092e10c5daa9916e9" + "versions.yml:md5,708c6b98134cdeaa8a48b764ba952628" ], "gtf": [ "genome.filtered.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" ], "versions": [ - "versions.yml:md5,440fb677a34013b092e10c5daa9916e9" + "versions.yml:md5,708c6b98134cdeaa8a48b764ba952628" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-03-22T08:51:23.23741543" + "timestamp": "2025-04-24T14:47:15.161383742" } } \ No newline at end of file diff --git a/modules/nf-core/cellranger/mkgtf/tests/tags.yml b/modules/nf-core/cellranger/mkgtf/tests/tags.yml deleted file mode 100644 index 7c95d529..00000000 --- a/modules/nf-core/cellranger/mkgtf/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -cellranger/mkgtf: - - "modules/nf-core/cellranger/mkgtf/**" diff --git a/modules/nf-core/cellranger/mkref/main.nf b/modules/nf-core/cellranger/mkref/main.nf index a719b778..b0218939 100644 --- a/modules/nf-core/cellranger/mkref/main.nf +++ b/modules/nf-core/cellranger/mkref/main.nf @@ -2,7 +2,7 @@ process CELLRANGER_MKREF { tag "$fasta" label 'process_high' - container "nf-core/cellranger:8.0.0" + container "nf-core/cellranger:9.0.1" input: path fasta diff --git a/modules/nf-core/cellranger/mkref/meta.yml b/modules/nf-core/cellranger/mkref/meta.yml index bd8ad5a6..f4f59563 100644 --- a/modules/nf-core/cellranger/mkref/meta.yml +++ b/modules/nf-core/cellranger/mkref/meta.yml @@ -1,37 +1,43 @@ name: cellranger_mkref -description: Module to build the reference needed by the 10x Genomics Cell Ranger tool. Uses the cellranger mkref command. +description: Module to build the reference needed by the 10x Genomics Cell Ranger + tool. Uses the cellranger mkref command. keywords: - reference - mkref - index tools: - cellranger: - description: Cell Ranger by 10x Genomics is a set of analysis pipelines that process Chromium single-cell data to align reads, generate feature-barcode matrices, perform clustering and other secondary analysis, and more. + description: Cell Ranger by 10x Genomics is a set of analysis pipelines that process + Chromium single-cell data to align reads, generate feature-barcode matrices, + perform clustering and other secondary analysis, and more. homepage: https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/what-is-cell-ranger documentation: https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/using/tutorial_ov tool_dev_url: https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/using/tutorial_ov licence: [10X Genomics EULA] + identifier: "" input: - - fasta: - type: file - description: Reference genome FASTA file - pattern: "*.{fasta,fa}" - - gtf: - type: file - description: Reference transcriptome GTF file - pattern: "*.gtf" - - reference_name: - type: string - description: The name to give the new reference folder - pattern: str + - - fasta: + type: file + description: Reference genome FASTA file + pattern: "*.{fasta,fa}" + - - gtf: + type: file + description: Reference transcriptome GTF file + pattern: "*.gtf" + - - reference_name: + type: string + description: The name to give the new reference folder + pattern: str output: - reference: - type: directory - description: Folder containing all the reference indices needed by Cell Ranger + - ${reference_name}: + type: directory + description: Folder containing all the reference indices needed by Cell Ranger - versions: - type: file - description: File containing software version - pattern: "versions.yml" + - versions.yml: + type: file + description: File containing software version + pattern: "versions.yml" authors: - "@ggabernet" maintainers: diff --git a/modules/nf-core/cellranger/mkref/tests/main.nf.test.snap b/modules/nf-core/cellranger/mkref/tests/main.nf.test.snap index 2db410f5..45e49a93 100644 --- a/modules/nf-core/cellranger/mkref/tests/main.nf.test.snap +++ b/modules/nf-core/cellranger/mkref/tests/main.nf.test.snap @@ -8,7 +8,7 @@ [ "genes.gtf.gz:md5,50fc877b1c53b36b3b413aff88bda48c" ], - "reference.json:md5,106d79d334779a0d675aa0a2623bea97", + "reference.json:md5,36a50e2bcb2aa0c15d102e30be5fc488", "SA:md5,bcf3e1a855783105150b46c905465333", "SAindex:md5,b93fb07d342e6c32a00ebc4311c0ad38", "Genome:md5,22102926fadf5890e905ca71b2da3f35", @@ -17,14 +17,14 @@ "exonInfo.tab:md5,0d560290fab688b7268d88d5494bf9fe", "sjdbList.out.tab:md5,9e4f991abbbfeb3935a2bb21b9e258f1", [ - "versions.yml:md5,e9d88519c551d8ccbbdc6bd2673fc41f" + "versions.yml:md5,8f36be9d97f8563921791dbeb0ea9a75" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-07-31T14:50:38.928938" + "timestamp": "2025-04-25T10:06:03.277296893" }, "homo_sapiens - reference - stub": { "content": [ @@ -35,7 +35,7 @@ ] ], "1": [ - "versions.yml:md5,e9d88519c551d8ccbbdc6bd2673fc41f" + "versions.yml:md5,8f36be9d97f8563921791dbeb0ea9a75" ], "reference": [ [ @@ -43,14 +43,14 @@ ] ], "versions": [ - "versions.yml:md5,e9d88519c551d8ccbbdc6bd2673fc41f" + "versions.yml:md5,8f36be9d97f8563921791dbeb0ea9a75" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-07-31T14:50:44.599257" + "timestamp": "2025-04-25T10:06:20.297698461" } -} +} \ No newline at end of file diff --git a/modules/nf-core/cellranger/mkref/tests/tags.yml b/modules/nf-core/cellranger/mkref/tests/tags.yml deleted file mode 100644 index 62b5d963..00000000 --- a/modules/nf-core/cellranger/mkref/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -cellranger/mkref: - - "modules/nf-core/cellranger/mkref/**" diff --git a/modules/nf-core/cellranger/mkvdjref/main.nf b/modules/nf-core/cellranger/mkvdjref/main.nf index 1be4fdfe..0c4a3f35 100644 --- a/modules/nf-core/cellranger/mkvdjref/main.nf +++ b/modules/nf-core/cellranger/mkvdjref/main.nf @@ -2,7 +2,7 @@ process CELLRANGER_MKVDJREF { tag "$fasta" label 'process_high' - container "nf-core/cellranger:8.0.0" + container "nf-core/cellranger:9.0.1" input: path fasta // optional diff --git a/modules/nf-core/cellranger/mkvdjref/meta.yml b/modules/nf-core/cellranger/mkvdjref/meta.yml index c7d70dd1..23605d3f 100644 --- a/modules/nf-core/cellranger/mkvdjref/meta.yml +++ b/modules/nf-core/cellranger/mkvdjref/meta.yml @@ -1,5 +1,6 @@ name: cellranger_mkvdjref -description: Module to build the VDJ reference needed by the 10x Genomics Cell Ranger tool. Uses the cellranger mkvdjref command. +description: Module to build the VDJ reference needed by the 10x Genomics Cell Ranger + tool. Uses the cellranger mkvdjref command. keywords: - reference - mkvdjref @@ -9,36 +10,46 @@ keywords: - cellranger tools: - cellranger: - description: Cell Ranger processes data from 10X Genomics Chromium kits. `cellranger vdj` takes FASTQ files from `cellranger mkfastq` or `bcl2fastq` for V(D)J libraries and performs sequence assembly and paired clonotype calling. It uses the Chromium cellular barcodes and UMIs to assemble V(D)J transcripts per cell. Clonotypes and CDR3 sequences are output as a `.vloupe` file which can be loaded into Loupe V(D)J Browser. + description: Cell Ranger processes data from 10X Genomics Chromium kits. `cellranger + vdj` takes FASTQ files from `cellranger mkfastq` or `bcl2fastq` for V(D)J libraries + and performs sequence assembly and paired clonotype calling. It uses the Chromium + cellular barcodes and UMIs to assemble V(D)J transcripts per cell. Clonotypes + and CDR3 sequences are output as a `.vloupe` file which can be loaded into Loupe + V(D)J Browser. homepage: https://support.10xgenomics.com/single-cell-vdj/software/pipelines/latest/what-is-cell-ranger documentation: https://support.10xgenomics.com/single-cell-vdj/software/pipelines/latest/advanced/references tool_dev_url: https://support.10xgenomics.com/single-cell-vdj/software/pipelines/latest/advanced/references licence: ["10x Genomics EULA"] + identifier: "" input: - - reference_name: - type: string - description: The name to give the new reference folder, e.g. `my_vdj_ref`. This flag is required - pattern: str - - genes: - type: file - description: Reference transcriptome GTF file (optional) - pattern: "*.gtf" - - fasta: - type: file - description: Reference genome FASTA file (optional) - pattern: "*.{fasta,fa}" - - seqs: - type: file - description: Reference genome FASTA file from the 10X Genomics fetch-imgt workflow (optional) - pattern: "*.{fasta,fa}" + - - fasta: + type: file + description: Reference genome FASTA file (optional) + pattern: "*.{fasta,fa}" + - - gtf: + type: file + description: Reference genome GTF file (optional) + pattern: "*.gtf" + - - seqs: + type: file + description: Reference genome FASTA file from the 10X Genomics fetch-imgt workflow + (optional) + pattern: "*.{fasta,fa}" + - - reference_name: + type: string + description: The name to give the new reference folder, e.g. `my_vdj_ref`. This + flag is required + pattern: str output: - reference: - type: directory - description: Folder containing all the reference indices needed by Cell Ranger + - ${reference_name}: + type: directory + description: Folder containing all the reference indices needed by Cell Ranger - versions: - type: file - description: File containing software version - pattern: "versions.yml" + - versions.yml: + type: file + description: File containing software version + pattern: "versions.yml" authors: - "@ggabernet" - "@klkeys" diff --git a/modules/nf-core/cellranger/mkvdjref/tests/main.nf.test.snap b/modules/nf-core/cellranger/mkvdjref/tests/main.nf.test.snap index 99c79834..a2529f6d 100644 --- a/modules/nf-core/cellranger/mkvdjref/tests/main.nf.test.snap +++ b/modules/nf-core/cellranger/mkvdjref/tests/main.nf.test.snap @@ -7,30 +7,30 @@ [ "regions.fa:md5,1e22fd84ab26c89d3c285140df2daf5f" ], - "reference.json:md5,42169d68855f3e8fc07513a7a1c567a7" + "reference.json:md5,64fab77b52134ee22033d9540bd66639" ] ], "1": [ - "versions.yml:md5,4d249b5a83d49f68dc90d5e0cf8a776b" + "versions.yml:md5,55e958337b93e96c5257ab894ee59091" ], "reference": [ [ [ "regions.fa:md5,1e22fd84ab26c89d3c285140df2daf5f" ], - "reference.json:md5,42169d68855f3e8fc07513a7a1c567a7" + "reference.json:md5,64fab77b52134ee22033d9540bd66639" ] ], "versions": [ - "versions.yml:md5,4d249b5a83d49f68dc90d5e0cf8a776b" + "versions.yml:md5,55e958337b93e96c5257ab894ee59091" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-03-22T10:28:29.116236642" + "timestamp": "2025-04-25T11:05:52.416630198" }, "homo_sapiens - vdj - reference - stub": { "content": [ @@ -44,7 +44,7 @@ ] ], "1": [ - "versions.yml:md5,4d249b5a83d49f68dc90d5e0cf8a776b" + "versions.yml:md5,55e958337b93e96c5257ab894ee59091" ], "reference": [ [ @@ -55,14 +55,14 @@ ] ], "versions": [ - "versions.yml:md5,4d249b5a83d49f68dc90d5e0cf8a776b" + "versions.yml:md5,55e958337b93e96c5257ab894ee59091" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-03-22T10:28:39.114993263" + "timestamp": "2025-04-25T11:06:08.980256548" } } \ No newline at end of file diff --git a/modules/nf-core/cellranger/mkvdjref/tests/tags.yml b/modules/nf-core/cellranger/mkvdjref/tests/tags.yml deleted file mode 100644 index 602a752d..00000000 --- a/modules/nf-core/cellranger/mkvdjref/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -cellranger/mkvdjref: - - "modules/nf-core/cellranger/mkvdjref/**" diff --git a/modules/nf-core/cellranger/multi/main.nf b/modules/nf-core/cellranger/multi/main.nf index 326962bb..547e4839 100644 --- a/modules/nf-core/cellranger/multi/main.nf +++ b/modules/nf-core/cellranger/multi/main.nf @@ -2,7 +2,7 @@ process CELLRANGER_MULTI { tag "$meta.id" label 'process_high' - container "nf-core/cellranger:8.0.0" + container "nf-core/cellranger:9.0.1" input: val meta @@ -59,7 +59,7 @@ process CELLRANGER_MULTI { include_vdj = vdj_fastqs.first().getName() != 'fastqs' && vdj_reference ? '[vdj]' : '' include_beam = beam_fastqs.first().getName() != 'fastqs' && beam_control_panel ? '[antigen-specificity]' : '' include_cmo = cmo_fastqs.first().getName() != 'fastqs' && cmo_barcodes ? '[samples]' : '' - include_fb = ab_fastqs.first().getName() != 'fastqs' && fb_reference ? '[feature]' : '' + include_fb = (ab_fastqs.first().getName() != 'fastqs' || crispr_fastqs.first().getName() != 'fastqs') && fb_reference ? '[feature]' : '' include_frna = gex_frna_probeset_name && frna_sampleinfo ? '[samples]' : '' gex_reference_path = include_gex ? "reference,./${gex_reference_name}" : '' diff --git a/modules/nf-core/cellranger/multi/meta.yml b/modules/nf-core/cellranger/multi/meta.yml index 5ac3ebdb..7b2c808a 100644 --- a/modules/nf-core/cellranger/multi/meta.yml +++ b/modules/nf-core/cellranger/multi/meta.yml @@ -1,5 +1,7 @@ name: "cellranger_multi" -description: Module to use Cell Ranger's pipelines to analyze sequencing data produced from various Chromium technologies, including Single Cell Gene Expression, Single Cell Immune Profiling, Feature Barcoding, and Cell Multiplexing. +description: Module to use Cell Ranger's pipelines to analyze sequencing data produced + from various Chromium technologies, including Single Cell Gene Expression, Single + Cell Immune Profiling, Feature Barcoding, and Cell Multiplexing. keywords: - align - reference @@ -12,98 +14,150 @@ keywords: - crispr tools: - "cellranger": - description: Cell Ranger by 10x Genomics is a set of analysis pipelines that process Chromium single-cell data to align reads, generate feature-barcode matrices, perform clustering and other secondary analysis, and more. + description: Cell Ranger by 10x Genomics is a set of analysis pipelines that process + Chromium single-cell data to align reads, generate feature-barcode matrices, + perform clustering and other secondary analysis, and more. homepage: https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/what-is-cell-ranger documentation: https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/using/tutorial_cp tool_dev_url: https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/using/tutorial_cp licence: [10X Genomics EULA] + identifier: "" input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - gex_fastqs: - type: file - description: FASTQ files for gene expression analysis - pattern: "*.fastq.gz" - - vdj_fastqs: - type: file - description: FASTQ files for V(D)J immunoprofiling analysis - pattern: "*.fastq.gz" - - ab_fastqs: - type: file - description: FASTQ files for antibody analysis - pattern: "*.fastq.gz" - - beam_fastqs: - type: file - description: FASTQ files for Barcode-Enabled Antigen Mapping (antigen analysis) - pattern: "*.fastq.gz" - - cmo_fastqs: - type: file - description: FASTQ files for cell multiplexing data - pattern: "*.fastq.gz" - - gex_reference: - type: directory - description: Folder containing Cellranger gene expression reference. Can also be a gzipped tarball - pattern: "*.tar.gz" - - gex_frna_probeset: - type: file - description: Fixed RNA profiling information containing custom probes in CSV format - pattern: "*.csv" - - gex_targetpanel: - type: file - description: Declaration of the target panel for Targeted Gene Expression analysis - pattern: "*.csv" - - vdj_reference: - type: directory - description: Folder containing Cellranger V(D)J reference. Can also be a gzipped tarball - pattern: "*.tar.gz" - - vdj_primer_index: - type: file - description: List of custom V(D)J inner enrichment primers - pattern: "*.csv" - - fb_reference: - type: file - description: The Feature Barcodes used for reference in Feature Barcoding Analysis - pattern: "*.csv" - - beam_antigen_panel: - type: file - description: The BEAM manifest in Feature Barcode CSV format - pattern: "*.csv" - - beam_control_panel: - type: file - description: The BEAM antigens set to control status, with corresponding MHC alleles, in Feature Barcode CSV format - pattern: "*.csv" - - cmo_reference: - type: file - description: Path to a custom Cell Multiplexing CSV reference IDs, or the `cmo-set` option in Cellranger - pattern: "*.csv" - - cmo_barcodes: - type: file - description: A CSV file appended to the Cellranger multi config linking samples to CMO IDs - pattern: "*.csv" - - cmo_barcode_assignment: - type: file - description: A CSV file that specifies the barcode-sample assignment in Cell Multiplexing analysis - pattern: "*.csv" - - frna_sampleinfo: - type: file - description: Sample information for fixed RNA analysis - pattern: "*.csv" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - - meta_gex: + type: map + description: | + Groovy Map containing sample information + - gex_fastqs: + type: file + description: FASTQ files + pattern: "*.fastq.gz" + - - meta_vdj: + type: map + description: | + Groovy Map containing sample information + - vdj_fastqs: + type: file + description: FASTQ files + pattern: "*.fastq.gz" + - - meta_ab: + type: map + description: | + Groovy Map containing sample information + - ab_fastqs: + type: file + description: FASTQ files + pattern: "*.fastq.gz" + - - meta_beam: + type: map + description: | + Groovy Map containing sample information + - beam_fastqs: + type: file + description: FASTQ files + pattern: "*.fastq.gz" + - - meta_cmo: + type: map + description: | + Groovy Map containing sample information + - cmo_fastqs: + type: file + description: FASTQ files + pattern: "*.fastq.gz" + - - meta_crispr: + type: map + description: | + Groovy Map containing sample information + - crispr_fastqs: + type: file + description: FASTQ files + pattern: "*.fastq.gz" + - - gex_reference: + type: directory + description: Folder containing Cellranger gene expression reference. Can also + be a gzipped tarball + pattern: "*.tar.gz" + - - gex_frna_probeset: + type: file + description: Fixed RNA profiling information containing custom probes in CSV + format + pattern: "*.csv" + - - gex_targetpanel: + type: file + description: Declaration of the target panel for Targeted Gene Expression analysis + pattern: "*.csv" + - - vdj_reference: + type: directory + description: Folder containing Cellranger V(D)J reference. Can also be a gzipped + tarball + pattern: "*.tar.gz" + - - vdj_primer_index: + type: file + description: List of custom V(D)J inner enrichment primers + pattern: "*.csv" + - - fb_reference: + type: file + description: The Feature Barcodes used for reference in Feature Barcoding Analysis + pattern: "*.csv" + - - beam_antigen_panel: + type: file + description: The BEAM manifest in Feature Barcode CSV format + pattern: "*.csv" + - - beam_control_panel: + type: file + description: The BEAM antigens set to control status, with corresponding MHC + alleles, in Feature Barcode CSV format + pattern: "*.csv" + - - cmo_reference: + type: file + description: Path to a custom Cell Multiplexing CSV reference IDs, or the `cmo-set` + option in Cellranger + pattern: "*.csv" + - - cmo_barcodes: + type: file + description: A CSV file appended to the Cellranger multi config linking samples + to CMO IDs + pattern: "*.csv" + - - cmo_barcode_assignment: + type: file + description: A CSV file that specifies the barcode-sample assignment in Cell + Multiplexing analysis + pattern: "*.csv" + - - frna_sampleinfo: + type: file + description: Sample information for fixed RNA analysis + pattern: "*.csv" + - - skip_renaming: + type: boolean + description: Skip renaming output: - config: - type: file - description: The resolved Cellranger multi config used for analysis - pattern: "cellranger_multi_config.csv" + - meta: + type: file + description: The resolved Cellranger multi config used for analysis + pattern: "cellranger_multi_config.csv" + - cellranger_multi_config.csv: + type: file + description: The resolved Cellranger multi config used for analysis + pattern: "cellranger_multi_config.csv" - outs: - type: file - description: Files containing the outputs of Cell Ranger - pattern: "${meta.id}/outs/*" + - meta: + type: file + description: Files containing the outputs of Cell Ranger + pattern: "${meta.id}/outs/*" + - "**/outs/**": + type: file + description: Files containing the outputs of Cell Ranger + pattern: "${meta.id}/outs/*" - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@klkeys" maintainers: diff --git a/modules/nf-core/cellranger/multi/templates/cellranger_multi.py b/modules/nf-core/cellranger/multi/templates/cellranger_multi.py index bff70be8..9f00ec86 100644 --- a/modules/nf-core/cellranger/multi/templates/cellranger_multi.py +++ b/modules/nf-core/cellranger/multi/templates/cellranger_multi.py @@ -5,11 +5,11 @@ Copyright (c) Felipe Almeida 2024 - MIT License """ -from subprocess import run +import re +import shlex from pathlib import Path +from subprocess import run from textwrap import dedent -import shlex -import re def chunk_iter(seq, size): @@ -29,7 +29,7 @@ def chunk_iter(seq, size): # do not match "SRR12345", "file_INFIXR12", etc filename_pattern = r"([^a-zA-Z0-9])R1([^a-zA-Z0-9])" -for modality in ["gex", "vdj", "ab", "beam", "cmo", "cirspr"]: +for modality in ["gex", "vdj", "ab", "beam", "cmo", "crispr"]: # get fastqs, ordered by path. Files are staged into # - "fastq_001/{original_name.fastq.gz}" # - "fastq_002/{original_name.fastq.gz}" @@ -96,7 +96,8 @@ def chunk_iter(seq, size): # # generate config file for cellranger multi # -config_txt = f"""${include_gex} +config_txt = ( # noqa + f"""${include_gex} {gex_reference_path} {frna_probeset} ${gex_options_filter_probes} @@ -134,22 +135,23 @@ def chunk_iter(seq, size): {fastq_beam} {fastq_crispr} {fastq_cmo} -""" +""" # noqa +) # # check the extra data that is included # if len("${include_cmo}") > 0: - with open("${cmo_csv_text}", "r") as input_conf: + with open("${cmo_csv_text}") as input_conf: config_txt = config_txt + "\\n${include_cmo}\\n" + input_conf.read() + "\\n" if len("${include_beam}") > 0: - with open("${beam_csv_text}", "r") as input_conf, open("${beam_antigen_csv}", "r") as input_csv: + with open("${beam_csv_text}") as input_conf, open("${beam_antigen_csv}") as input_csv: config_txt = config_txt + "\\n${include_beam}\\n" + input_conf.read() + "\\n" config_txt = config_txt + "[feature]\\n" + input_csv.read() + "\\n" if len("${include_frna}") > 0: - with open("${frna_csv_text}", "r") as input_conf: + with open("${frna_csv_text}") as input_conf: config_txt = config_txt + "\\n${include_frna}\\n" + input_conf.read() + "\\n" # Remove blank lines from config text diff --git a/modules/nf-core/cellranger/multi/tests/main.nf.test b/modules/nf-core/cellranger/multi/tests/main.nf.test index 0259e1b3..c5e76245 100644 --- a/modules/nf-core/cellranger/multi/tests/main.nf.test +++ b/modules/nf-core/cellranger/multi/tests/main.nf.test @@ -724,4 +724,150 @@ nextflow_process { } + test("cellranger - multi - 5k - a549 - sc3 v3 - gex + crispr") { + + setup { + + run("CELLRANGER_MKGTF", alias: "CELLRANGER_MKGTF_CRISPR") { + script "modules/nf-core/cellranger/mkgtf/main.nf" + process { + """ + input[0] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/sc3_v3_5k_a549_gex_crispr/reference/genes_chr1_32292083_32686211.gtf', checkIfExists: true) + """ + } + } + + run("CELLRANGER_MKREF", alias: "CELLRANGER_MKREF_CRISPR") { + script "modules/nf-core/cellranger/mkref/main.nf" + process { + """ + input[0] = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/sc3_v3_5k_a549_gex_crispr/reference/genome_chr1_32292083_32686211.fa', checkIfExists: true) + input[1] = CELLRANGER_MKGTF_CRISPR.out.gtf + input[2] = 'homo_sapiens_chr1_32292083_32686211_reference' + """ + } + } + + } + + when { + process { + """ + // + // preparation + // + + /***************************/ + /*** stage 5k A549 data ***/ + /***************************/ + + // stage A549 cell FASTQ test data + + // stage gene expression FASTQ test data + test_10x_sc3_v3_5k_a549_gex = [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/sc3_v3_5k_a549_gex_crispr/fastqs/gex/subsampled_SC3_v3_NextGem_DI_CRISPR_A549_5K_gex_S5_L001_R1_001.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/sc3_v3_5k_a549_gex_crispr/fastqs/gex/subsampled_SC3_v3_NextGem_DI_CRISPR_A549_5K_gex_S5_L001_R2_001.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/sc3_v3_5k_a549_gex_crispr/fastqs/gex/subsampled_SC3_v3_NextGem_DI_CRISPR_A549_5K_gex_S5_L002_R1_001.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/sc3_v3_5k_a549_gex_crispr/fastqs/gex/subsampled_SC3_v3_NextGem_DI_CRISPR_A549_5K_gex_S5_L002_R2_001.fastq.gz', checkIfExists: true) + ] + def test_10x_sc3_v3_5k_a549_gex_samplename = "subsampled_SC3_v3_NextGem_DI_CRISPR_A549_5K" + + // stage CRISPR FASTQ test data + test_10x_sc3_v3_5k_a549_crispr = [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/sc3_v3_5k_a549_gex_crispr/fastqs/crispr/subsampled_SC3_v3_NextGem_DI_CRISPR_A549_5K_crispr_S4_L001_R1_001.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/sc3_v3_5k_a549_gex_crispr/fastqs/crispr/subsampled_SC3_v3_NextGem_DI_CRISPR_A549_5K_crispr_S4_L001_R2_001.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/sc3_v3_5k_a549_gex_crispr/fastqs/crispr/subsampled_SC3_v3_NextGem_DI_CRISPR_A549_5K_crispr_S4_L002_R1_001.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/sc3_v3_5k_a549_gex_crispr/fastqs/crispr/subsampled_SC3_v3_NextGem_DI_CRISPR_A549_5K_crispr_S4_L002_R2_001.fastq.gz', checkIfExists: true) + ] + def test_10x_sc3_v3_5k_a549_crispr_samplename = "subsampled_SC3_v3_NextGem_DI_CRISPR_A549_5K" + + // stage feature barcode reference for antibody capture + test_10x_sc3_v3_5k_a549_crispr_fb_reference = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/sc3_v3_5k_a549_gex_crispr/SC3_v3_NextGem_DI_CRISPR_A549_5K_Multiplex_count_feature_reference_chr1_32292083_32686211.csv', checkIfExists: true) + + /*******************************/ + /*** end stage 5k A549 data ***/ + /*******************************/ + + // make an empty dummy file, for FASTQs + empty_file = file("$workDir/EMPTY") + empty_file.append("") + + // create empty channels to fill unused cellranger multi arguments + // fastqs need a [ meta, ref ] structure + // references just need a path + ch_gex_fastqs = Channel.value( [ [ id:"EMPTY", options:[] ], empty_file ] ) + ch_vdj_fastqs = Channel.value( [ [ id:"EMPTY", options:[] ], empty_file ] ) + ch_ab_fastqs = Channel.value( [ [ id:"EMPTY", options:[] ], empty_file ] ) + ch_beam_fastqs = Channel.value( [ [ id:"EMPTY", options:[] ], empty_file ] ) + ch_cmo_fastqs = Channel.value( [ [ id:"EMPTY", options:[] ], empty_file ] ) + ch_crispr_fastqs = Channel.value( [ [ id:"EMPTY", options:[] ], empty_file ] ) + ch_gex_frna_probeset = [] + ch_gex_targetpanel = [] + ch_vdj_reference = [] + ch_vdj_primer_index = [] + ch_fb_reference = [] + ch_beam_antigen_panel = [] + ch_beam_control_panel = [] + ch_cmo_reference = [] + ch_cmo_barcodes = [] + ch_cmo_sample_assignment = [] + ch_frna_sampleinfo = [] + + // collect references and fastq files for staging + + ch_gex_fastqs_sc3_v3_5k_a549 = Channel.of( test_10x_sc3_v3_5k_a549_gex ) + .collect() + .map { reads -> [ [ id:test_10x_sc3_v3_5k_a549_gex_samplename , options:[ "expect-cells":"5000", chemistry:"SC3Pv3", "create-bam":false, "no-secondary":true ] ], reads ] } + + ch_crispr_fastqs_sc3_v3_5k_a549 = Channel.of( test_10x_sc3_v3_5k_a549_crispr ) + .collect() + .map { reads -> [ [ id:test_10x_sc3_v3_5k_a549_crispr_samplename , options:[ "expect-cells":"5000" ] ], reads ] } + + ch_crispr_reference_sc3_v3_5k_a549 = Channel.of( test_10x_sc3_v3_5k_a549_crispr_fb_reference ) + + // + // execution + // + input[0] = [ id:'subsampled_SC3_v3_NextGem_DI_CRISPR_A549_5K', single_end:false ] + input[1] = ch_gex_fastqs_sc3_v3_5k_a549 + input[2] = ch_vdj_fastqs + input[3] = ch_ab_fastqs + input[4] = ch_beam_fastqs + input[5] = ch_cmo_fastqs + input[6] = ch_crispr_fastqs_sc3_v3_5k_a549 + input[7] = CELLRANGER_MKREF_CRISPR.out.reference + input[8] = ch_gex_frna_probeset + input[9] = ch_gex_targetpanel + input[10] = ch_vdj_reference + input[11] = ch_vdj_primer_index + input[12] = ch_crispr_reference_sc3_v3_5k_a549 + input[13] = ch_beam_antigen_panel + input[14] = ch_beam_control_panel + input[15] = ch_cmo_reference + input[16] = ch_cmo_barcodes + input[17] = ch_cmo_sample_assignment + input[18] = ch_frna_sampleinfo + input[19] = false // default to false to guarantee renaming during test + """ + } + } + + then { + + assertAll( + { assert process.success }, + { assert snapshot( + process.out.outs[0][1].findAll { file(it).name == 'metrics_summary.csv' }, + process.out.outs[0][1].findAll { file(it).name == 'raw_feature_bc_matrix.h5' }, + process.out.outs[0][1].findAll { file(it).name == 'sample_filtered_feature_bc_matrix.h5' }, + process.out.outs[0][1].findAll { file(it).name == 'protospacer_calls_per_cell.csv' }, + process.out.outs[0][1].findAll { file(it).name == 'perturbation_efficiencies_by_feature.csv' } + ).match() }, + { assert snapshot(process.out.versions).match("versions-a549-crispr") } + ) + + } + + } + } diff --git a/modules/nf-core/cellranger/multi/tests/main.nf.test.snap b/modules/nf-core/cellranger/multi/tests/main.nf.test.snap index dc80d794..8ea980dd 100644 --- a/modules/nf-core/cellranger/multi/tests/main.nf.test.snap +++ b/modules/nf-core/cellranger/multi/tests/main.nf.test.snap @@ -17,28 +17,28 @@ "regions.fa:md5,1953406d913fb0fd753c6b56e847da83" ], [ - "all_contig_annotations.json:md5,5798b5437239f9637084d5c4df2fb7c9", + "all_contig_annotations.json:md5,16ad7120f003d05883a29214377efa6b", "cell_barcodes.json:md5,d751713988987e9331980363e24189ce", "reference.json:md5,384f6efabad59f6da5c89b862aee71a8" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-04-18T08:17:44.699898938" + "timestamp": "2025-04-28T10:09:47.792282434" }, "versions-PBMC": { "content": [ [ - "versions.yml:md5,c5714f73535a8ed4fad19e1198b6425a" + "versions.yml:md5,3d75b44017b2d623dfb9aa8b89538b4d" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-04-18T08:17:44.767319153" + "timestamp": "2025-04-28T10:09:47.86424328" }, "cellranger - multi - 10k - PBMC - with cmo": { "content": [ @@ -58,40 +58,76 @@ "regions.fa:md5,1953406d913fb0fd753c6b56e847da83" ], [ - "all_contig_annotations.json:md5,97a70dbd1181bb7f9a8168d2349abc40", + "all_contig_annotations.json:md5,474e6ca846176111c8003ec7cedc299e", "cell_barcodes.json:md5,d751713988987e9331980363e24189ce", "reference.json:md5,384f6efabad59f6da5c89b862aee71a8" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-04-18T08:19:37.448859895" + "timestamp": "2025-04-28T10:18:16.990217751" }, "versions-with-cmo": { "content": [ [ - "versions.yml:md5,c5714f73535a8ed4fad19e1198b6425a" + "versions.yml:md5,3d75b44017b2d623dfb9aa8b89538b4d" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-04-18T08:19:37.509459561" + "timestamp": "2025-04-28T10:18:17.058412204" + }, + "cellranger - multi - 5k - a549 - sc3 v3 - gex + crispr": { + "content": [ + [ + "metrics_summary.csv:md5,9c9749b6b5c5e17acb23405f1a33a53b" + ], + [ + "raw_feature_bc_matrix.h5:md5,fc98a3d47af1091763e94ed4a79f8f15" + ], + [ + "sample_filtered_feature_bc_matrix.h5:md5,63cb76a43b82c4e0083c4db9e8f5c980" + ], + [ + "protospacer_calls_per_cell.csv:md5,a94184bddcd8107421f62986b9e0984a" + ], + [ + "perturbation_efficiencies_by_feature.csv:md5,bdf16f59c33b5f061e87b4f3ed74e809" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2025-04-28T10:28:49.150344674" + }, + "versions-a549-crispr": { + "content": [ + [ + "versions.yml:md5,3d75b44017b2d623dfb9aa8b89538b4d" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2025-04-28T10:28:49.23707814" }, "versions-with-vdj": { "content": [ [ - "versions.yml:md5,c5714f73535a8ed4fad19e1198b6425a" + "versions.yml:md5,3d75b44017b2d623dfb9aa8b89538b4d" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-04-18T08:21:38.624731758" + "timestamp": "2025-04-28T10:23:10.585307273" }, "cellranger - multi - 10k - PBMC - with vdj": { "content": [ @@ -111,15 +147,15 @@ "regions.fa:md5,1953406d913fb0fd753c6b56e847da83" ], [ - "all_contig_annotations.json:md5,af647cb0b468bac6b12dd6db112fac11", + "all_contig_annotations.json:md5,e4e09b4368470f55da786e424ae2fdd8", "cell_barcodes.json:md5,d751713988987e9331980363e24189ce", "reference.json:md5,384f6efabad59f6da5c89b862aee71a8" ] ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-04-18T08:21:38.551047173" + "timestamp": "2025-04-28T10:23:10.520491466" } } \ No newline at end of file diff --git a/modules/nf-core/cellranger/multi/tests/tags.yml b/modules/nf-core/cellranger/multi/tests/tags.yml deleted file mode 100644 index 90be5a20..00000000 --- a/modules/nf-core/cellranger/multi/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -cellranger/multi: - - "modules/nf-core/cellranger/multi/**" From 3e5038e7a72e14bb456dc17a91d2cb685fe24abf Mon Sep 17 00:00:00 2001 From: Felipe Marques de Almeida Date: Wed, 7 May 2025 10:37:08 +0000 Subject: [PATCH 24/82] update cellranger nf-test --- tests/main_pipeline_cellranger.nf.test.snap | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/main_pipeline_cellranger.nf.test.snap b/tests/main_pipeline_cellranger.nf.test.snap index 1379aff8..3eb8773d 100644 --- a/tests/main_pipeline_cellranger.nf.test.snap +++ b/tests/main_pipeline_cellranger.nf.test.snap @@ -3,16 +3,16 @@ "content": [ "barcodes.tsv.gz:md5,fe6e51564b4405b37ca8604a844b1f2e", "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", - "matrix.mtx.gz:md5,1528b9b0fccc78dec95695928e42e710", + "matrix.mtx.gz:md5,76991485c25e90a3553993d6a55df6bd", "barcodes.tsv.gz:md5,77afe9a76631fc7b44236d3962a55aa5", "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", - "matrix.mtx.gz:md5,49db721ca5d5749cf11597e82a010eb6", + "matrix.mtx.gz:md5,5fc86fb6808aa997ee791b5dae2214de", "barcodes.tsv.gz:md5,85da6b6e0c78dfe81af8c07c2017ab5e", "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", - "matrix.mtx.gz:md5,96943587acf3356c5fa5038056c54c96", + "matrix.mtx.gz:md5,195ae8a9089e16ad19d8c9d05277f99f", "barcodes.tsv.gz:md5,081f72b5252ccaf5ffd535ffbd235c4c", "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", - "matrix.mtx.gz:md5,58182db2706d532ec970526de3d3b70f", + "matrix.mtx.gz:md5,563a2e93bc9b7c6825e543f71da785d2", "Sample_X_raw_matrix.seurat.rds:md5,155faccf5164a5c56819b267dee0ebb1", "Sample_X_raw_matrix.sce.rds:md5,4bfef42037307e73f0135abb2373a21e", "Sample_Y_raw_matrix.seurat.rds:md5,3f4a3e6529b10c646fd08173d5baa339", @@ -23,9 +23,9 @@ "Sample_Y_filtered_matrix.sce.rds:md5,dcf9ce35fba58c2b04ca72703b483804" ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.10.2" + "nf-test": "0.9.2", + "nextflow": "24.10.6" }, - "timestamp": "2024-11-29T07:53:03.653246538" + "timestamp": "2025-05-07T08:50:32.11880613" } } \ No newline at end of file From a5dca8f048bb8129b85515f55ffcd40710318bfc Mon Sep 17 00:00:00 2001 From: Felipe Marques de Almeida Date: Wed, 7 May 2025 10:55:11 +0000 Subject: [PATCH 25/82] update cellranger multi nf-test snaps --- ...main_pipeline_cellrangermulti.nf.test.snap | 100 +++++++++--------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/tests/main_pipeline_cellrangermulti.nf.test.snap b/tests/main_pipeline_cellrangermulti.nf.test.snap index 1b2f1bdd..2296ba35 100644 --- a/tests/main_pipeline_cellrangermulti.nf.test.snap +++ b/tests/main_pipeline_cellrangermulti.nf.test.snap @@ -2,9 +2,9 @@ "test-dataset_cellrangermulti_aligner": { "content": [ "barcodes.tsv.gz:md5,a3937e73aa76a2acff554ca2f81a108d", - "barcodes.tsv.gz:md5,60c25e3ecc0d185048bad6ee78b03ec5", + "barcodes.tsv.gz:md5,b729c635b9ec993dd3e9c0602b440016", "barcodes.tsv.gz:md5,74ccf55411109ed9c3f2b6f73ae91ddc", - "barcodes.tsv.gz:md5,5910573c152e8e8bf0b02547440c37a2", + "barcodes.tsv.gz:md5,84597a29c9e3e8d2e9971dcd2154fea8", "barcodes.tsv.gz:md5,38f51384d30e3b17d8de54aeac6c1ade", "barcodes.tsv.gz:md5,23f4f5264971fe924da6d93016a9747d", "barcodes.tsv.gz:md5,e7f625d70338d98ff8e8736e35338770", @@ -12,19 +12,19 @@ "barcodes.tsv.gz:md5,6d34a94fa5fc5cab362dbb1b5c8ed5d6", "barcodes.tsv.gz:md5,177c1fbf4052a9cee2019179f51d9294", "barcodes.tsv.gz:md5,e7ca00fa3842c7e6ed855fb901444637", - "barcodes.tsv.gz:md5,34ab4b3fa95147486f612eb13f1b3b4d", - "barcodes.tsv.gz:md5,77c7e40eccfb2290b3219df0df674048", - "barcodes.tsv.gz:md5,9dda3086ee5dee42dbbd7139c87522fd", + "barcodes.tsv.gz:md5,98d07b680d1d7dc3332bac246274bdbc", + "barcodes.tsv.gz:md5,9fe9a4e1467cec5c456bdffebcfc6955", + "barcodes.tsv.gz:md5,7513f5ba4f9a400c4f7500f83cad1ee6", "barcodes.tsv.gz:md5,a5294c876fa976c7bb84dcd580cb42d5", "barcodes.tsv.gz:md5,2035ad842ed2fd904cb4e5913a9a8400", "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", - "features.tsv.gz:md5,65f3b800faad02a0f244427051498b95", + "features.tsv.gz:md5,265e218cf1202f2563997fe2bf64efcb", "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", - "features.tsv.gz:md5,65f3b800faad02a0f244427051498b95", + "features.tsv.gz:md5,265e218cf1202f2563997fe2bf64efcb", "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", - "features.tsv.gz:md5,65f3b800faad02a0f244427051498b95", + "features.tsv.gz:md5,265e218cf1202f2563997fe2bf64efcb", "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", - "features.tsv.gz:md5,65f3b800faad02a0f244427051498b95", + "features.tsv.gz:md5,265e218cf1202f2563997fe2bf64efcb", "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", "features.tsv.gz:md5,a5781c6331d8b63153bbca34b6942020", "features.tsv.gz:md5,a5781c6331d8b63153bbca34b6942020", @@ -33,67 +33,67 @@ "features.tsv.gz:md5,824fe0b73fc8a383152a792f84f6ca84", "features.tsv.gz:md5,a5781c6331d8b63153bbca34b6942020", "features.tsv.gz:md5,a5781c6331d8b63153bbca34b6942020", - "matrix.mtx.gz:md5,e954dedc5b922d0c3efc695ebe773cc2", - "matrix.mtx.gz:md5,e5ad2d633e388a60a73be1c7af0211bb", - "matrix.mtx.gz:md5,6232400cf08f7510163210e7fb394879", - "matrix.mtx.gz:md5,d7eb146e7ad9fc0611156e6d3014c191", - "matrix.mtx.gz:md5,2634ecec8a09abaaf1f9ca1c6aa6a007", - "matrix.mtx.gz:md5,b0616658c40715fdb7da585e1639911f", - "matrix.mtx.gz:md5,dc926848695d6e90fc4042aa82ed971d", - "matrix.mtx.gz:md5,cd3ba4229bef7b73845714cb09e49490", - "matrix.mtx.gz:md5,8a60488142e4c828046523571dfb7cbb", - "matrix.mtx.gz:md5,a75e2adb76265842c0377254da22db04", - "matrix.mtx.gz:md5,b714077efbdf9490b3883a1b337dba2e", - "matrix.mtx.gz:md5,156c99e53fcf54624f321c5a937bfd2e", - "matrix.mtx.gz:md5,480aee4457d337eb3cfc742a2fe06230", - "matrix.mtx.gz:md5,d1206622e68fe0eb7ce33b3b3f453d1a", - "matrix.mtx.gz:md5,d26136eccdb380b6f4636a32e1124ff2", - "matrix.mtx.gz:md5,edd17c8ed762725b283bca41269d989a", - "metrics_summary.csv:md5,ebc5764b737c58b8e448eae9a51012fb", - "metrics_summary.csv:md5,01d39c736a9c0377e7315a3cbaf1e200", - "metrics_summary.csv:md5,3d232f44ab074e8709eb3384a1e5e85b", - "metrics_summary.csv:md5,fb2b456c5d9e072069d3634bac744514", - "metrics_summary.csv:md5,64fcad7adc2e30fa9fb3127e01c7b53a", - "metrics_summary.csv:md5,d14d385df3e8e61c924a30cd5b959b86", - "metrics_summary.csv:md5,bcd7e1d1854e31a4968d5876eab7d64a", - "metrics_summary.csv:md5,98d9d9617c2ca4f614614568e4371d44", + "matrix.mtx.gz:md5,5da308e2bf76dcd5c270ec8dcf849c17", + "matrix.mtx.gz:md5,95a5485bf5636ca5e3d462e800acea59", + "matrix.mtx.gz:md5,147400e1d64b4fe1f00ffff0b8af5516", + "matrix.mtx.gz:md5,d70c1fdacadf6734720bf01a7d68a4d7", + "matrix.mtx.gz:md5,d5fe7ae28ba054db26002562e2bea161", + "matrix.mtx.gz:md5,82f2c40fa0b97b15778e4e88b874f275", + "matrix.mtx.gz:md5,fdba80421a6e0084f16fa87cc9f28c41", + "matrix.mtx.gz:md5,6646c5c63dd73c0ee6e368876a90bc2e", + "matrix.mtx.gz:md5,1cf58834ca554013578536c95383a723", + "matrix.mtx.gz:md5,ca688c20ea2ab390abd74f8748703a35", + "matrix.mtx.gz:md5,e6a165fd2fe8098abd8584a156ad4975", + "matrix.mtx.gz:md5,0ef39394ae6cfb79ec3d295728c93abe", + "matrix.mtx.gz:md5,b430b379304458b677214b643b5e5210", + "matrix.mtx.gz:md5,9ead16868dacff50047a57ca2e577ead", + "matrix.mtx.gz:md5,35b2eae12908ea73ec4da3d1fe12c708", + "matrix.mtx.gz:md5,d92b09e5fa91a89acef20ebf70b6f948", + "metrics_summary.csv:md5,4112c534568462447160543d827129ee", + "metrics_summary.csv:md5,d9a3e8b60a329199f907b97aed9ae6c0", + "metrics_summary.csv:md5,9140bfc9e12111b406eaf86c11e88790", + "metrics_summary.csv:md5,5add678e88d98bece089c50c695f467c", + "metrics_summary.csv:md5,1dbfa3d695d1a5a7e4bacec22f95889c", + "metrics_summary.csv:md5,fdd327a5155543949a6f2322907501b7", + "metrics_summary.csv:md5,7cd35fdb25c2908b975e0893630a5d3f", + "metrics_summary.csv:md5,23b9f1807f2a47d52f048fc3afb202aa", "4PLEX_HUMAN_raw_matrix.seurat.rds:md5,acc22e948a2250907897f79e008ff3ea", "4PLEX_HUMAN_raw_matrix.sce.rds:md5,084ac812ebb69ca3152abd2c7226d739", "Colorectal_BC3_raw_matrix.seurat.rds:md5,0d6a6222daf2b03cba426cb80b86914c", "Colorectal_BC3_raw_matrix.sce.rds:md5,b00d8244f06eef3e5d0fae39c9e14196", - "Colorectal_BC3_filtered_matrix.seurat.rds:md5,554e8c02aabc9935f7f60b4ccd95790d", - "Colorectal_BC3_filtered_matrix.sce.rds:md5,d18364082406728404deefd7e163e758", + "Colorectal_BC3_filtered_matrix.seurat.rds:md5,ba8256b3a51477018f9c1e4e1aeec336", + "Colorectal_BC3_filtered_matrix.sce.rds:md5,91bf1e7978c8a0601230a5d37c50e402", "Liver_BC1_raw_matrix.seurat.rds:md5,826973ce82225e8942a823e18dbe01fd", "Liver_BC1_raw_matrix.sce.rds:md5,4806e7f7e00af77c9eb0e2666cedc96c", - "Liver_BC1_filtered_matrix.seurat.rds:md5,958cb86208fa8241f84452b92061b534", - "Liver_BC1_filtered_matrix.sce.rds:md5,315bee1c2cfbebd58fbe070756fa578e", + "Liver_BC1_filtered_matrix.seurat.rds:md5,ce4a4c9cbd490e867771416b4ce6f458", + "Liver_BC1_filtered_matrix.sce.rds:md5,3f40a160ca908672593106cdceda3dc1", "Ovarian_BC2_raw_matrix.seurat.rds:md5,f107fd3e315a04aec3e6e53650c456f8", "Ovarian_BC2_raw_matrix.sce.rds:md5,e30869371d77941b1d009fd6983b5c43", - "Ovarian_BC2_filtered_matrix.seurat.rds:md5,c2f00ae90a958938197666f2642697f1", - "Ovarian_BC2_filtered_matrix.sce.rds:md5,0852d41a76b05cae1b6ee8359b7fcb15", + "Ovarian_BC2_filtered_matrix.seurat.rds:md5,b0a507b5d0b182681517c332177250ef", + "Ovarian_BC2_filtered_matrix.sce.rds:md5,89518a94b4f908632433308311d02a37", "PBMC_10K_raw_matrix.seurat.rds:md5,97d5d0bc88db1df05b7effcb9dbb31cc", "PBMC_10K_raw_matrix.sce.rds:md5,4b3fe0fbda8a80eafc372bd895c26ec0", "PBMC_10K_filtered_matrix.seurat.rds:md5,dc780d878e2abae61b10eba5218116b8", "PBMC_10K_filtered_matrix.sce.rds:md5,1f2f3072ede853dd5f6c47821fc39543", - "PBMC_10K_CMO_raw_matrix.seurat.rds:md5,079695fa7ca1190a8467c40ea906ab55", - "PBMC_10K_CMO_raw_matrix.sce.rds:md5,1b5f531b29b6f35a2fc17e8e679b1f38", - "PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.seurat.rds:md5,8dc6983ed48e114e997111bb9a3cb08d", - "PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.sce.rds:md5,343dff9ef666aceafc5bc3f5da4dfb67", - "PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.seurat.rds:md5,d1d8205885be044a721295205e34aeea", - "PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.sce.rds:md5,a6598288ca1afd8590e25ea3095de929", + "PBMC_10K_CMO_raw_matrix.seurat.rds:md5,617b0af6bd53f58e7d0be91660bae3b3", + "PBMC_10K_CMO_raw_matrix.sce.rds:md5,5c399342646e41ba7482dd1926eac1bf", + "PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.seurat.rds:md5,8deeddcbb64b2a665372f2dd82a60ba3", + "PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.sce.rds:md5,13d26c26a3967c415f539890a935fa7e", + "PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.seurat.rds:md5,489181148d714944670abd1f6a3f4e10", + "PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.sce.rds:md5,ede457b9d84ed34cf892806bb9f5287e", "PBMC_10K_CMV_raw_matrix.seurat.rds:md5,7b731e32655cace681ace140e3ef9af3", "PBMC_10K_CMV_raw_matrix.sce.rds:md5,75baf36779b04ed941b97b644125a2ff", "PBMC_10K_CMV_filtered_matrix.seurat.rds:md5,4dfa3f7aa87706e23a04248349292dc1", "PBMC_10K_CMV_filtered_matrix.sce.rds:md5,cb78864bde8833c2e6323ff01eef3c15", "Pancreas_BC4_raw_matrix.seurat.rds:md5,7f972f40b05824a3cff5449a8f9f8b61", "Pancreas_BC4_raw_matrix.sce.rds:md5,4af114f068fc9bab8cceb3f25a9b6d9a", - "Pancreas_BC4_filtered_matrix.seurat.rds:md5,83b0c41b147c45ce0204eb14e6bca9d9", - "Pancreas_BC4_filtered_matrix.sce.rds:md5,b22101dc4bd007f03d5254e0211961fd" + "Pancreas_BC4_filtered_matrix.seurat.rds:md5,98eef51fc0c34fa1e055b04c5c92d2f0", + "Pancreas_BC4_filtered_matrix.sce.rds:md5,7d18f78c68f7c995b724ae3ba95ea862" ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.10.2" + "nf-test": "0.9.2", + "nextflow": "24.10.6" }, - "timestamp": "2024-11-29T14:57:39.288233009" + "timestamp": "2025-05-07T10:50:34.537911828" } } \ No newline at end of file From 0c64bdac51fcf26ec88fd997afe4b50169b9ece4 Mon Sep 17 00:00:00 2001 From: Felipe Marques de Almeida Date: Wed, 7 May 2025 11:02:09 +0000 Subject: [PATCH 26/82] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d95e9caf..27cfae32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Update nextflow_schema.json - Fix simpleaf protocol name for 10xv4 ([#452](https://github.com/nf-core/scrnaseq/pull/452)) - Fix the workflow for cellranger-arc alignment and add new test with 10x multiome dataset ([#441](https://github.com/nf-core/scrnaseq/pull/441)) +- Update `nf-core/cellranger` modules to tool verson `9.0.1` ([#467](https://github.com/nf-core/scrnaseq/pull/467)). ### Chore From b8bfaf890dc0893b26590910dcbe9f886352e8ff Mon Sep 17 00:00:00 2001 From: Felipe Marques de Almeida Date: Wed, 7 May 2025 12:34:03 +0000 Subject: [PATCH 27/82] add TENX_DISABLE_TELEMETRY export to cellranger/multi --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index 26d22647..b8e6112c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -221,6 +221,7 @@ if (params.aligner == 'cellrangermulti') { process { withName: FASTQC { ext.prefix = { "${meta.id}_${meta.feature_type}" } } // allow distinguishment of data types after renaming withName: 'NFCORE_SCRNASEQ:SCRNASEQ:CELLRANGER_MULTI_ALIGN:CELLRANGER_MULTI' { + beforeScript = 'export TENX_DISABLE_TELEMETRY=1' ext.prefix = null // force it null, for some reason it was being wrongly read in the module publishDir = [ path: "${params.outdir}/${params.aligner}/count", From b7c8f95e829b2d9c4a8e69a328c0358baf6cdecf Mon Sep 17 00:00:00 2001 From: nictru Date: Fri, 30 May 2025 14:14:19 +0200 Subject: [PATCH 28/82] Remove ineffective igenomes requests --- main.nf | 5 ----- 1 file changed, 5 deletions(-) diff --git a/main.nf b/main.nf index 124ef167..4a67e8b4 100644 --- a/main.nf +++ b/main.nf @@ -30,11 +30,6 @@ include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_scrn // Thus, manually provided files are not overwritten by the genome attributes params.fasta = getGenomeAttribute('fasta') params.gtf = getGenomeAttribute('gtf') -params.simpleaf_index = getGenomeAttribute('simpleaf') ?: getGenomeAttribute('salmon') -params.txp2gene = getGenomeAttribute('simpleaf_txp2gene') -params.cellranger_index = params.aligner == 'cellrangerarc' ? - getGenomeAttribute('cellrangerarc') : - getGenomeAttribute('cellranger') /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From cc9ca4e78537b988df47bbaa67eebece057191f1 Mon Sep 17 00:00:00 2001 From: nictru Date: Fri, 30 May 2025 14:14:59 +0200 Subject: [PATCH 29/82] Make igenomes work properly for FASTA and GTF --- main.nf | 2 ++ nextflow.config | 2 -- workflows/scrnaseq.nf | 14 ++++++++------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/main.nf b/main.nf index 4a67e8b4..baf90b55 100644 --- a/main.nf +++ b/main.nf @@ -52,6 +52,8 @@ workflow NFCORE_SCRNASEQ { // SCRNASEQ ( samplesheet, + params.fasta, + params.gtf ) emit: multiqc_report = SCRNASEQ.out.multiqc_report // channel: /path/to/multiqc_report.html diff --git a/nextflow.config b/nextflow.config index c9b8acb9..001aca85 100644 --- a/nextflow.config +++ b/nextflow.config @@ -20,8 +20,6 @@ params { genome = null transcript_fasta = null txp2gene = null - fasta = null - gtf = null // simpleaf parameters simpleaf_index = null diff --git a/workflows/scrnaseq.nf b/workflows/scrnaseq.nf index c1b4aded..8e18a940 100644 --- a/workflows/scrnaseq.nf +++ b/workflows/scrnaseq.nf @@ -28,6 +28,8 @@ workflow SCRNASEQ { take: ch_fastq + fasta + gtf main: ch_multiqc_files = Channel.empty() @@ -40,8 +42,8 @@ workflow SCRNASEQ { } // general input and params - ch_genome_fasta = params.fasta ? file(params.fasta, checkIfExists: true) : [] - ch_gtf = params.gtf ? file(params.gtf, checkIfExists: true) : [] + ch_genome_fasta = fasta ? file(fasta, checkIfExists: true) : [] + ch_gtf = gtf ? file(gtf, checkIfExists: true) : [] ch_transcript_fasta = params.transcript_fasta ? file(params.transcript_fasta) : [] ch_motifs = params.motifs ? file(params.motifs) : [] ch_txp2gene = params.txp2gene ? file(params.txp2gene, checkIfExists: true) : [] @@ -91,8 +93,8 @@ workflow SCRNASEQ { // // Uncompress genome fasta file if required // - if (params.fasta) { - if (params.fasta.endsWith('.gz')) { + if (fasta) { + if (fasta.endsWith('.gz')) { ch_genome_fasta = GUNZIP_FASTA ( [ [:], ch_genome_fasta ] ).gunzip.map { it[1] } ch_versions = ch_versions.mix(GUNZIP_FASTA.out.versions) } else { @@ -103,8 +105,8 @@ workflow SCRNASEQ { // // Uncompress GTF annotation file or create from GFF3 if required // - if (params.gtf) { - if (params.gtf.endsWith('.gz')) { + if (gtf) { + if (gtf.endsWith('.gz')) { ch_gtf = GUNZIP_GTF ( [ [:], ch_gtf ] ).gunzip.map { it[1] } ch_versions = ch_versions.mix(GUNZIP_GTF.out.versions) } else { From 38132ba3541ea8a9466ed12c7221e71721a0720d Mon Sep 17 00:00:00 2001 From: nictru Date: Fri, 30 May 2025 14:15:26 +0200 Subject: [PATCH 30/82] Remove multiQC artifact --- subworkflows/local/starsolo.nf | 2 -- 1 file changed, 2 deletions(-) diff --git a/subworkflows/local/starsolo.nf b/subworkflows/local/starsolo.nf index d4307569..74c3f495 100644 --- a/subworkflows/local/starsolo.nf +++ b/subworkflows/local/starsolo.nf @@ -7,8 +7,6 @@ include { GUNZIP } from '../../modules/nf-core/gunzip/main' include { STAR_GENOMEGENERATE } from '../../modules/nf-core/star/genomegenerate/main' -def multiqc_report = [] - workflow STARSOLO { take: genome_fasta From cd63cb4f0e3eab67285852f7a934a3340b648a74 Mon Sep 17 00:00:00 2001 From: nictru Date: Fri, 30 May 2025 14:20:32 +0200 Subject: [PATCH 31/82] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27cfae32..7f285e94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix simpleaf protocol name for 10xv4 ([#452](https://github.com/nf-core/scrnaseq/pull/452)) - Fix the workflow for cellranger-arc alignment and add new test with 10x multiome dataset ([#441](https://github.com/nf-core/scrnaseq/pull/441)) - Update `nf-core/cellranger` modules to tool verson `9.0.1` ([#467](https://github.com/nf-core/scrnaseq/pull/467)). +- Fix igenomes usage to correctly handle fasta and gtf files ([#469](https://github.com/nf-core/scrnaseq/pull/469)). ### Chore From f2a703cc68617f83bea6ba69b2d1806a45774d0c Mon Sep 17 00:00:00 2001 From: Gregor Sturm Date: Mon, 2 Jun 2025 11:32:54 +0200 Subject: [PATCH 32/82] Update ci.yml --- .github/workflows/ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e009287f..0d1fa4ee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,14 +72,12 @@ jobs: with: version: ${{ env.NFT_VER }} - - name: Run nf-test + - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" run: | nf-test test \ --ci \ --junitxml=test.xml \ tests/main_pipeline_${{ matrix.profile }}.nf.test - - - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} - name: Output log on failure From 48a28495f05d14cb69885a2b3d6efed8b184462e Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 3 Jun 2025 11:02:37 +0000 Subject: [PATCH 33/82] Template update for nf-core/tools version 3.3.1 --- .editorconfig | 37 ----- .github/CONTRIBUTING.md | 2 +- .github/actions/get-shards/action.yml | 69 +++++++++ .github/actions/nf-test/action.yml | 113 ++++++++++++++ .github/workflows/awsfulltest.yml | 4 +- .github/workflows/awstest.yml | 2 +- .github/workflows/ci.yml | 88 ----------- .github/workflows/clean-up.yml | 2 +- .github/workflows/download_pipeline.yml | 20 +-- .../{fix-linting.yml => fix_linting.yml} | 4 +- .github/workflows/linting.yml | 15 +- .github/workflows/linting_comment.yml | 4 +- .github/workflows/nf-test.yml | 142 ++++++++++++++++++ .github/workflows/release-announcements.yml | 2 +- ...mment.yml => template-version-comment.yml} | 2 +- .nf-core.yml | 2 +- .pre-commit-config.yaml | 26 +++- .prettierrc.yml | 5 + README.md | 7 +- conf/base.config | 5 +- nextflow.config | 17 ++- nf-test.config | 24 +++ ro-crate-metadata.json | 16 +- .../utils_nfcore_scrnaseq_pipeline/main.nf | 1 - tests/.nftignore | 10 ++ tests/default.nf.test | 35 +++++ tests/nextflow.config | 12 ++ 27 files changed, 487 insertions(+), 179 deletions(-) delete mode 100644 .editorconfig create mode 100644 .github/actions/get-shards/action.yml create mode 100644 .github/actions/nf-test/action.yml delete mode 100644 .github/workflows/ci.yml rename .github/workflows/{fix-linting.yml => fix_linting.yml} (96%) create mode 100644 .github/workflows/nf-test.yml rename .github/workflows/{template_version_comment.yml => template-version-comment.yml} (95%) create mode 100644 nf-test.config create mode 100644 tests/.nftignore create mode 100644 tests/default.nf.test create mode 100644 tests/nextflow.config diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 6d9b74cc..00000000 --- a/.editorconfig +++ /dev/null @@ -1,37 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -indent_size = 4 -indent_style = space - -[*.{md,yml,yaml,html,css,scss,js}] -indent_size = 2 - -# These files are edited and tested upstream in nf-core/modules -[/modules/nf-core/**] -charset = unset -end_of_line = unset -insert_final_newline = unset -trim_trailing_whitespace = unset -indent_style = unset -[/subworkflows/nf-core/**] -charset = unset -end_of_line = unset -insert_final_newline = unset -trim_trailing_whitespace = unset -indent_style = unset - -[/assets/email*] -indent_size = unset - -# ignore python and markdown -[*.{py,md}] -indent_style = unset - -# ignore ro-crate metadata files -[**/ro-crate-metadata.json] -insert_final_newline = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 8d48141c..8487bc92 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -78,7 +78,7 @@ If you wish to contribute a new step, please use the following coding standards: 5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core pipelines schema build` tool). 6. Add sanity checks and validation for all relevant parameters. 7. Perform local tests to validate that the new code works as expected. -8. If applicable, add a new test command in `.github/workflow/ci.yml`. +8. If applicable, add a new test in the `tests` directory. 9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. 10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. diff --git a/.github/actions/get-shards/action.yml b/.github/actions/get-shards/action.yml new file mode 100644 index 00000000..34085279 --- /dev/null +++ b/.github/actions/get-shards/action.yml @@ -0,0 +1,69 @@ +name: "Get number of shards" +description: "Get the number of nf-test shards for the current CI job" +inputs: + max_shards: + description: "Maximum number of shards allowed" + required: true + paths: + description: "Component paths to test" + required: false + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +outputs: + shard: + description: "Array of shard numbers" + value: ${{ steps.shards.outputs.shard }} + total_shards: + description: "Total number of shards" + value: ${{ steps.shards.outputs.total_shards }} +runs: + using: "composite" + steps: + - name: Install nf-test + uses: nf-core/setup-nf-test@v1 + with: + version: ${{ env.NFT_VER }} + - name: Get number of shards + id: shards + shell: bash + run: | + # Run nf-test with dynamic parameter + nftest_output=$(nf-test test \ + --profile +docker \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --dry-run \ + --ci \ + --changed-since HEAD^) || { + echo "nf-test command failed with exit code $?" + echo "Full output: $nftest_output" + exit 1 + } + echo "nf-test dry-run output: $nftest_output" + + # Default values for shard and total_shards + shard="[]" + total_shards=0 + + # Check if there are related tests + if echo "$nftest_output" | grep -q 'No tests to execute'; then + echo "No related tests found." + else + # Extract the number of related tests + number_of_shards=$(echo "$nftest_output" | sed -n 's|.*Executed \([0-9]*\) tests.*|\1|p') + if [[ -n "$number_of_shards" && "$number_of_shards" -gt 0 ]]; then + shards_to_run=$(( $number_of_shards < ${{ inputs.max_shards }} ? $number_of_shards : ${{ inputs.max_shards }} )) + shard=$(seq 1 "$shards_to_run" | jq -R . | jq -c -s .) + total_shards="$shards_to_run" + else + echo "Unexpected output format. Falling back to default values." + fi + fi + + # Write to GitHub Actions outputs + echo "shard=$shard" >> $GITHUB_OUTPUT + echo "total_shards=$total_shards" >> $GITHUB_OUTPUT + + # Debugging output + echo "Final shard array: $shard" + echo "Total number of shards: $total_shards" diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml new file mode 100644 index 00000000..243e7823 --- /dev/null +++ b/.github/actions/nf-test/action.yml @@ -0,0 +1,113 @@ +name: "nf-test Action" +description: "Runs nf-test with common setup steps" +inputs: + profile: + description: "Profile to use" + required: true + shard: + description: "Shard number for this CI job" + required: true + total_shards: + description: "Total number of test shards(NOT the total number of matrix jobs)" + required: true + paths: + description: "Test paths" + required: true + tags: + description: "Tags to pass as argument for nf-test --tag parameter" + required: false +runs: + using: "composite" + steps: + - name: Setup Nextflow + uses: nf-core/setup-nextflow@v2 + with: + version: "${{ env.NXF_VERSION }}" + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + with: + python-version: "3.13" + + - name: Install nf-test + uses: nf-core/setup-nf-test@v1 + with: + version: "${{ env.NFT_VER }}" + install-pdiff: true + + - name: Setup apptainer + if: contains(inputs.profile, 'singularity') + uses: eWaterCycle/setup-apptainer@main + + - name: Set up Singularity + if: contains(inputs.profile, 'singularity') + shell: bash + run: | + mkdir -p $NXF_SINGULARITY_CACHEDIR + mkdir -p $NXF_SINGULARITY_LIBRARYDIR + + - name: Conda setup + if: contains(inputs.profile, 'conda') + uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3 + with: + auto-update-conda: true + conda-solver: libmamba + conda-remove-defaults: true + + # TODO Skip failing conda tests and document their failures + # https://github.com/nf-core/modules/issues/7017 + - name: Run nf-test + shell: bash + env: + NFT_DIFF: ${{ env.NFT_DIFF }} + NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + run: | + nf-test test \ + --profile=+${{ inputs.profile }} \ + $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ + --ci \ + --changed-since HEAD^ \ + --verbose \ + --tap=test.tap \ + --shard ${{ inputs.shard }}/${{ inputs.total_shards }} + + # Save the absolute path of the test.tap file to the output + echo "tap_file_path=$(realpath test.tap)" >> $GITHUB_OUTPUT + + - name: Generate test summary + if: always() + shell: bash + run: | + # Add header if it doesn't exist (using a token file to track this) + if [ ! -f ".summary_header" ]; then + echo "# 🚀 nf-test results" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Status | Test Name | Profile | Shard |" >> $GITHUB_STEP_SUMMARY + echo "|:------:|-----------|---------|-------|" >> $GITHUB_STEP_SUMMARY + touch .summary_header + fi + + if [ -f test.tap ]; then + while IFS= read -r line; do + if [[ $line =~ ^ok ]]; then + test_name="${line#ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| ✅ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + elif [[ $line =~ ^not\ ok ]]; then + test_name="${line#not ok }" + # Remove the test number from the beginning + test_name="${test_name#* }" + echo "| ❌ | ${test_name} | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + done < test.tap + else + echo "| ⚠️ | No test results found | ${{ inputs.profile }} | ${{ inputs.shard }}/${{ inputs.total_shards }} |" >> $GITHUB_STEP_SUMMARY + fi + + - name: Clean up + if: always() + shell: bash + run: | + sudo rm -rf /home/ubuntu/tests/ diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 5a6c0512..6e67f905 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,7 +14,7 @@ jobs: run-platform: name: Run AWS full tests # run only if the PR is approved by at least 2 reviewers and against the master/main branch or manually triggered - if: github.repository == 'nf-core/scrnaseq' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' + if: github.repository == 'nf-core/scrnaseq' && github.event.review.state == 'approved' && (github.event.pull_request.base.ref == 'master' || github.event.pull_request.base.ref == 'main') || github.event_name == 'workflow_dispatch' || github.event_name == 'release' runs-on: ubuntu-latest steps: - name: Set revision variable @@ -40,7 +40,7 @@ jobs: } profiles: test_full - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 474ff298..3185a80e 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -25,7 +25,7 @@ jobs: } profiles: test - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 78503771..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,88 +0,0 @@ -name: nf-core CI -# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors -on: - push: - branches: - - dev - pull_request: - release: - types: [published] - workflow_dispatch: - -env: - NXF_ANSI_LOG: false - NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity - NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity - -concurrency: - group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" - cancel-in-progress: true - -jobs: - test: - name: "Run pipeline with test data (${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }})" - # Only run on push if this is the nf-core dev branch (merged PRs) - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/scrnaseq') }}" - runs-on: ubuntu-latest - strategy: - matrix: - NXF_VER: - - "24.04.2" - - "latest-everything" - profile: - - "conda" - - "docker" - - "singularity" - test_name: - - "test" - isMaster: - - ${{ github.base_ref == 'master' }} - # Exclude conda and singularity on dev - exclude: - - isMaster: false - profile: "conda" - - isMaster: false - profile: "singularity" - steps: - - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - with: - fetch-depth: 0 - - - name: Set up Nextflow - uses: nf-core/setup-nextflow@v2 - with: - version: "${{ matrix.NXF_VER }}" - - - name: Set up Apptainer - if: matrix.profile == 'singularity' - uses: eWaterCycle/setup-apptainer@main - - - name: Set up Singularity - if: matrix.profile == 'singularity' - run: | - mkdir -p $NXF_SINGULARITY_CACHEDIR - mkdir -p $NXF_SINGULARITY_LIBRARYDIR - - - name: Set up Miniconda - if: matrix.profile == 'conda' - uses: conda-incubator/setup-miniconda@a4260408e20b96e80095f42ff7f1a15b27dd94ca # v3 - with: - miniconda-version: "latest" - auto-update-conda: true - conda-solver: libmamba - channels: conda-forge,bioconda - - - name: Set up Conda - if: matrix.profile == 'conda' - run: | - echo $(realpath $CONDA)/condabin >> $GITHUB_PATH - echo $(realpath python) >> $GITHUB_PATH - - - name: Clean up Disk space - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - - name: "Run pipeline with test data ${{ matrix.NXF_VER }} | ${{ matrix.test_name }} | ${{ matrix.profile }}" - continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} - run: | - nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.test_name }},${{ matrix.profile }} --outdir ./results diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index 0b6b1f27..ac030fd5 100644 --- a/.github/workflows/clean-up.yml +++ b/.github/workflows/clean-up.yml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9 + - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9 with: stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index ab06316e..999bcc38 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -12,14 +12,6 @@ on: required: true default: "dev" pull_request: - types: - - opened - - edited - - synchronize - branches: - - main - - master - pull_request_target: branches: - main - master @@ -52,9 +44,9 @@ jobs: - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" architecture: "x64" - name: Setup Apptainer @@ -120,6 +112,7 @@ jobs: echo "IMAGE_COUNT_AFTER=$image_count" >> "$GITHUB_OUTPUT" - name: Compare container image counts + id: count_comparison run: | if [ "${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }}" -ne "${{ steps.count_afterwards.outputs.IMAGE_COUNT_AFTER }}" ]; then initial_count=${{ steps.count_initial.outputs.IMAGE_COUNT_INITIAL }} @@ -132,3 +125,10 @@ jobs: else echo "The pipeline can be downloaded successfully!" fi + + - name: Upload Nextflow logfile for debugging purposes + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: nextflow_logfile.txt + path: .nextflow.log* + include-hidden-files: true diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix_linting.yml similarity index 96% rename from .github/workflows/fix-linting.yml rename to .github/workflows/fix_linting.yml index b01cffea..12b1e041 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix_linting.yml @@ -32,9 +32,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} # Install and run pre-commit - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install pre-commit run: pip install pre-commit diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index dbd52d5a..f2d7d1dd 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -3,9 +3,6 @@ name: nf-core linting # It runs the `nf-core pipelines lint` and markdown lint tests to ensure # that the code meets the nf-core guidelines. on: - push: - branches: - - dev pull_request: release: types: [published] @@ -17,9 +14,9 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Set up Python 3.12 - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" - name: Install pre-commit run: pip install pre-commit @@ -36,13 +33,13 @@ jobs: - name: Install Nextflow uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: - python-version: "3.12" + python-version: "3.13" architecture: "x64" - name: read .nf-core.yml - uses: pietrobolcato/action-read-yaml@1.1.0 + uses: pietrobolcato/action-read-yaml@9f13718d61111b69f30ab4ac683e67a56d254e1d # 1.1.0 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml @@ -74,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 95b6b6af..7e8050fb 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@20319c5641d495c8a52e688b7dc5fada6c3a9fbc # v8 + uses: dawidd6/action-download-artifact@4c1e823582f43b179e2cbb49c3eade4e41f992e2 # v10 with: workflow: linting.yml workflow_conclusion: completed @@ -21,7 +21,7 @@ jobs: run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@331f8f5b4215f0445d3c07b4967662a32a2d3e31 # v2 + uses: marocchino/sticky-pull-request-comment@52423e01640425a022ef5fd42c6fb5f633a02728 # v2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml new file mode 100644 index 00000000..f03aea0c --- /dev/null +++ b/.github/workflows/nf-test.yml @@ -0,0 +1,142 @@ +name: Run nf-test +on: + push: + paths-ignore: + - "docs/**" + - "**/meta.yml" + - "**/*.md" + - "**/*.png" + - "**/*.svg" + pull_request: + paths-ignore: + - "docs/**" + - "**/meta.yml" + - "**/*.md" + - "**/*.png" + - "**/*.svg" + release: + types: [published] + workflow_dispatch: + +# Cancel if a newer run is started +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NFT_VER: "0.9.2" + NFT_WORKDIR: "~" + NXF_ANSI_LOG: false + NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity + NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity + +jobs: + nf-test-changes: + name: nf-test-changes + runs-on: # use self-hosted runners + - runs-on=$-nf-test-changes + - runner=4cpu-linux-x64 + outputs: + shard: ${{ steps.set-shards.outputs.shard }} + total_shards: ${{ steps.set-shards.outputs.total_shards }} + steps: + - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner + run: | + ls -la ./ + rm -rf ./* || true + rm -rf ./.??* || true + ls -la ./ + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + fetch-depth: 0 + + - name: get number of shards + id: set-shards + uses: ./.github/actions/get-shards + env: + NFT_VER: ${{ env.NFT_VER }} + with: + max_shards: 7 + + - name: debug + run: | + echo ${{ steps.set-shards.outputs.shard }} + echo ${{ steps.set-shards.outputs.total_shards }} + + nf-test: + name: "${{ matrix.profile }} | ${{ matrix.NXF_VER }} | ${{ matrix.shard }}/${{ needs.nf-test-changes.outputs.total_shards }}" + needs: [nf-test-changes] + if: ${{ needs.nf-test-changes.outputs.total_shards != '0' }} + runs-on: # use self-hosted runners + - runs-on=$-nf-test + - runner=4cpu-linux-x64 + strategy: + fail-fast: false + matrix: + shard: ${{ fromJson(needs.nf-test-changes.outputs.shard) }} + profile: [conda, docker, singularity] + isMain: + - ${{ github.base_ref == 'master' || github.base_ref == 'main' }} + # Exclude conda and singularity on dev + exclude: + - isMain: false + profile: "conda" + - isMain: false + profile: "singularity" + NXF_VER: + - "24.04.2" + - "latest-everything" + env: + NXF_ANSI_LOG: false + TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} + + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + fetch-depth: 0 + + - name: Run nf-test + uses: ./.github/actions/nf-test + env: + NFT_DIFF: ${{ env.NFT_DIFF }} + NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} + NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + with: + profile: ${{ matrix.profile }} + shard: ${{ matrix.shard }} + total_shards: ${{ env.TOTAL_SHARDS }} + confirm-pass: + needs: [nf-test] + if: always() + runs-on: # use self-hosted runners + - runs-on=$-confirm-pass + - runner=2cpu-linux-x64 + steps: + - name: One or more tests failed + if: ${{ contains(needs.*.result, 'failure') }} + run: exit 1 + + - name: One or more tests cancelled + if: ${{ contains(needs.*.result, 'cancelled') }} + run: exit 1 + + - name: All tests ok + if: ${{ contains(needs.*.result, 'success') }} + run: exit 0 + + - name: debug-print + if: always() + run: | + echo "::group::DEBUG: `needs` Contents" + echo "DEBUG: toJSON(needs) = ${{ toJSON(needs) }}" + echo "DEBUG: toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" + echo "::endgroup::" + + - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner + if: always() + run: | + ls -la ./ + rm -rf ./* || true + rm -rf ./.??* || true + ls -la ./ diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 76a9e67e..4abaf484 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -30,7 +30,7 @@ jobs: bsky-post: runs-on: ubuntu-latest steps: - - uses: zentered/bluesky-post-action@80dbe0a7697de18c15ad22f4619919ceb5ccf597 # v0.1.0 + - uses: zentered/bluesky-post-action@4aa83560bb3eac05dbad1e5f221ee339118abdd2 # v0.2.0 with: post: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! diff --git a/.github/workflows/template_version_comment.yml b/.github/workflows/template-version-comment.yml similarity index 95% rename from .github/workflows/template_version_comment.yml rename to .github/workflows/template-version-comment.yml index 537529bc..beb5c77f 100644 --- a/.github/workflows/template_version_comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -14,7 +14,7 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} - name: Read template version from .nf-core.yml - uses: nichmor/minimal-read-yaml@v0.0.2 + uses: nichmor/minimal-read-yaml@1f7205277e25e156e1f63815781db80a6d490b8f # v0.0.2 id: read_yml with: config: ${{ github.workspace }}/.nf-core.yml diff --git a/.nf-core.yml b/.nf-core.yml index dd92a904..5cfd8170 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,7 +5,7 @@ lint: - .github/ISSUE_TEMPLATE/bug_report.yml schema_params: false template_strings: false -nf_core_version: 3.2.1 +nf_core_version: 3.3.1 repository_type: pipeline template: author: Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1dec8650..9d0b248d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,10 +4,24 @@ repos: hooks: - id: prettier additional_dependencies: - - prettier@3.2.5 - - - repo: https://github.com/editorconfig-checker/editorconfig-checker.python - rev: "3.1.2" + - prettier@3.5.0 + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 hooks: - - id: editorconfig-checker - alias: ec + - id: trailing-whitespace + args: [--markdown-linebreak-ext=md] + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/nf-core/.*| + subworkflows/nf-core/.*| + .*\.snap$ + )$ + - id: end-of-file-fixer + exclude: | + (?x)^( + .*ro-crate-metadata.json$| + modules/nf-core/.*| + subworkflows/nf-core/.*| + .*\.snap$ + )$ diff --git a/.prettierrc.yml b/.prettierrc.yml index c81f9a76..07dbd8bb 100644 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -1 +1,6 @@ printWidth: 120 +tabWidth: 4 +overrides: + - files: "*.{md,yml,yaml,html,css,scss,js,cff}" + options: + tabWidth: 2 diff --git a/README.md b/README.md index a8ac8aaf..7e4a72f1 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,14 @@ [![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/scrnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.04.2-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.3.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.3.1) [![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/) [![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/scrnaseq) -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![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) +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![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) ## Introduction @@ -28,7 +29,7 @@ --> + workflows use the "tube map" design for that. See https://nf-co.re/docs/guidelines/graphic_design/workflow_diagrams#examples for examples. --> 1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) ## Usage diff --git a/conf/base.config b/conf/base.config index d7ea5536..efa3378f 100644 --- a/conf/base.config +++ b/conf/base.config @@ -15,7 +15,7 @@ process { memory = { 6.GB * task.attempt } time = { 4.h * task.attempt } - errorStrategy = { task.exitStatus in ((130..145) + 104) ? 'retry' : 'finish' } + errorStrategy = { task.exitStatus in ((130..145) + 104 + 175) ? 'retry' : 'finish' } maxRetries = 1 maxErrors = '-1' @@ -59,4 +59,7 @@ process { errorStrategy = 'retry' maxRetries = 2 } + withLabel: process_gpu { + ext.use_gpu = { workflow.profile.contains('gpu') } + } } diff --git a/nextflow.config b/nextflow.config index 150b79ea..d9699da8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -160,16 +160,25 @@ profiles { ] } } + gpu { + docker.runOptions = '-u $(id -u):$(id -g) --gpus all' + apptainer.runOptions = '--nv' + singularity.runOptions = '--nv' + } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } } -// Load nf-core custom profiles from different Institutions -includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" +// Load nf-core custom profiles from different institutions + +// If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. +// Load nf-core/scrnaseq 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" + // Load nf-core/scrnaseq custom profiles from different institutions. // TODO nf-core: Optionally, you can add a pipeline-specific nf-core config at https://github.com/nf-core/configs -// includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/pipeline/scrnaseq.config" : "/dev/null" +// includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/scrnaseq.config" : "/dev/null" // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile // Will not be used unless Apptainer / Docker / Podman / Charliecloud / Singularity are enabled @@ -281,7 +290,7 @@ manifest { // Nextflow plugins plugins { - id 'nf-schema@2.2.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { diff --git a/nf-test.config b/nf-test.config new file mode 100644 index 00000000..889df760 --- /dev/null +++ b/nf-test.config @@ -0,0 +1,24 @@ +config { + // location for all nf-test tests + testsDir "." + + // nf-test directory including temporary files for each test + workDir System.getenv("NFT_WORKDIR") ?: ".nf-test" + + // location of an optional nextflow.config file specific for executing tests + configFile "tests/nextflow.config" + + // ignore tests coming from the nf-core/modules repo + ignore 'modules/nf-core/**/*', 'subworkflows/nf-core/**/*' + + // run all test with defined profile(s) from the main nextflow.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' + + // load the necessary plugins + plugins { + load "nft-utils@0.0.3" + } +} diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index cbc6ee8f..18b5affa 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-04-30T12:28:29+00:00", - "description": "

\n \n \n \"nf-core/scrnaseq\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/scrnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\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/scrnaseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)[![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/scrnaseq** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\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\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/scrnaseq \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\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/scrnaseq/usage) and the [parameter documentation](https://nf-co.re/scrnaseq/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/scrnaseq/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/scrnaseq/output).\n\n## Credits\n\nnf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\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 `#scrnaseq` channel](https://nfcore.slack.com/channels/scrnaseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\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", + "datePublished": "2025-06-03T11:02:33+00:00", + "description": "

\n \n \n \"nf-core/scrnaseq\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/scrnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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%A524.04.2-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.3.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.3.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/scrnaseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![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/scrnaseq** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\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\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/scrnaseq \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\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/scrnaseq/usage) and the [parameter documentation](https://nf-co.re/scrnaseq/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/scrnaseq/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/scrnaseq/output).\n\n## Credits\n\nnf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\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 `#scrnaseq` channel](https://nfcore.slack.com/channels/scrnaseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\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", "hasPart": [ { "@id": "main.nf" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#56d750ed-bc56-4036-87ab-b29e712f44db" + "@id": "#366b21f6-c520-4683-af1f-8b11179077f5" } ], "name": "nf-core/scrnaseq" @@ -128,7 +128,7 @@ } ], "dateCreated": "", - "dateModified": "2025-04-30T12:28:29Z", + "dateModified": "2025-06-03T11:02:33Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -167,11 +167,11 @@ "version": "!>=24.04.2" }, { - "@id": "#56d750ed-bc56-4036-87ab-b29e712f44db", + "@id": "#366b21f6-c520-4683-af1f-8b11179077f5", "@type": "TestSuite", "instance": [ { - "@id": "#9ea77cb4-8323-4726-ba6d-ac081273f9a9" + "@id": "#83881b30-412c-4952-b78b-765ae1f33783" } ], "mainEntity": { @@ -180,10 +180,10 @@ "name": "Test suite for nf-core/scrnaseq" }, { - "@id": "#9ea77cb4-8323-4726-ba6d-ac081273f9a9", + "@id": "#83881b30-412c-4952-b78b-765ae1f33783", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/scrnaseq", - "resource": "repos/nf-core/scrnaseq/actions/workflows/ci.yml", + "resource": "repos/nf-core/scrnaseq/actions/workflows/nf-test.yml", "runsOn": { "@id": "https://w3id.org/ro/terms/test#GithubService" }, diff --git a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf index 4655b362..95a18236 100644 --- a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf @@ -261,4 +261,3 @@ def methodsDescriptionText(mqc_methods_yaml) { return description_html.toString() } - diff --git a/tests/.nftignore b/tests/.nftignore new file mode 100644 index 00000000..c10bc1f1 --- /dev/null +++ b/tests/.nftignore @@ -0,0 +1,10 @@ +.DS_Store +multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt +multiqc/multiqc_data/multiqc.log +multiqc/multiqc_data/multiqc_data.json +multiqc/multiqc_data/multiqc_sources.txt +multiqc/multiqc_data/multiqc_software_versions.txt +multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} +multiqc/multiqc_report.html +fastqc/*_fastqc.{html,zip} +pipeline_info/*.{html,json,txt,yml} diff --git a/tests/default.nf.test b/tests/default.nf.test new file mode 100644 index 00000000..d320d3a0 --- /dev/null +++ b/tests/default.nf.test @@ -0,0 +1,35 @@ +nextflow_pipeline { + + name "Test pipeline" + script "../main.nf" + tag "pipeline" + + test("-profile test") { + + when { + params { + 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}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + 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 test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) + } + } +} diff --git a/tests/nextflow.config b/tests/nextflow.config new file mode 100644 index 00000000..81ee3b12 --- /dev/null +++ b/tests/nextflow.config @@ -0,0 +1,12 @@ +/* +======================================================================================== + Nextflow config file for running nf-test tests +======================================================================================== +*/ + +// TODO nf-core: Specify any additional parameters here +// Or any resources requirements +params.modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' +params.pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/scrnaseq' + +aws.client.anonymous = true // fixes S3 access issues on self-hosted runners From 8d72cf4a3a51b014d4f095bc58f68bff5f113a1b Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 8 Jul 2025 11:39:21 +0000 Subject: [PATCH 34/82] Template update for nf-core/tools version 3.3.2 --- .github/actions/nf-test/action.yml | 4 - .github/workflows/linting.yml | 2 +- .github/workflows/linting_comment.yml | 2 +- .github/workflows/nf-test.yml | 45 +++---- .github/workflows/release-announcements.yml | 2 +- .nf-core.yml | 2 +- .pre-commit-config.yaml | 2 +- README.md | 6 +- assets/schema_input.json | 4 +- conf/base.config | 1 + modules.json | 4 +- modules/nf-core/fastqc/environment.yml | 2 + modules/nf-core/fastqc/main.nf | 2 +- modules/nf-core/fastqc/meta.yml | 23 ++-- modules/nf-core/multiqc/environment.yml | 4 +- modules/nf-core/multiqc/main.nf | 4 +- modules/nf-core/multiqc/meta.yml | 110 ++++++++++-------- .../nf-core/multiqc/tests/main.nf.test.snap | 18 +-- nextflow.config | 5 +- nf-test.config | 2 +- ro-crate-metadata.json | 16 +-- .../tests/nextflow.config | 2 +- tests/.nftignore | 1 + tests/nextflow.config | 6 +- 24 files changed, 146 insertions(+), 123 deletions(-) diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml index 243e7823..bf44d961 100644 --- a/.github/actions/nf-test/action.yml +++ b/.github/actions/nf-test/action.yml @@ -54,13 +54,9 @@ runs: conda-solver: libmamba conda-remove-defaults: true - # TODO Skip failing conda tests and document their failures - # https://github.com/nf-core/modules/issues/7017 - name: Run nf-test shell: bash env: - NFT_DIFF: ${{ env.NFT_DIFF }} - NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} NFT_WORKDIR: ${{ env.NFT_WORKDIR }} run: | nf-test test \ diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index f2d7d1dd..8b0f88c3 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Set up Python 3.12 + - name: Set up Python 3.13 uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: python-version: "3.13" diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 7e8050fb..d43797d9 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@4c1e823582f43b179e2cbb49c3eade4e41f992e2 # v10 + uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11 with: workflow: linting.yml workflow_conclusion: completed diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index f03aea0c..e7b58449 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -1,12 +1,5 @@ name: Run nf-test on: - push: - paths-ignore: - - "docs/**" - - "**/meta.yml" - - "**/*.md" - - "**/*.png" - - "**/*.svg" pull_request: paths-ignore: - "docs/**" @@ -35,7 +28,7 @@ jobs: nf-test-changes: name: nf-test-changes runs-on: # use self-hosted runners - - runs-on=$-nf-test-changes + - runs-on=${{ github.run_id }}-nf-test-changes - runner=4cpu-linux-x64 outputs: shard: ${{ steps.set-shards.outputs.shard }} @@ -69,7 +62,7 @@ jobs: needs: [nf-test-changes] if: ${{ needs.nf-test-changes.outputs.total_shards != '0' }} runs-on: # use self-hosted runners - - runs-on=$-nf-test + - runs-on=${{ github.run_id }}-nf-test - runner=4cpu-linux-x64 strategy: fail-fast: false @@ -85,7 +78,7 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - "24.04.2" + - "24.10.5" - "latest-everything" env: NXF_ANSI_LOG: false @@ -97,23 +90,39 @@ jobs: fetch-depth: 0 - name: Run nf-test + id: run_nf_test uses: ./.github/actions/nf-test + continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} env: - NFT_DIFF: ${{ env.NFT_DIFF }} - NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} NFT_WORKDIR: ${{ env.NFT_WORKDIR }} with: profile: ${{ matrix.profile }} shard: ${{ matrix.shard }} total_shards: ${{ env.TOTAL_SHARDS }} + + - name: Report test status + if: ${{ always() }} + run: | + if [[ "${{ steps.run_nf_test.outcome }}" == "failure" ]]; then + echo "::error::Test with ${{ matrix.NXF_VER }} failed" + # Add to workflow summary + echo "## ❌ Test failed: ${{ matrix.profile }} | ${{ matrix.NXF_VER }} | Shard ${{ matrix.shard }}/${{ env.TOTAL_SHARDS }}" >> $GITHUB_STEP_SUMMARY + if [[ "${{ matrix.NXF_VER }}" == "latest-everything" ]]; then + echo "::warning::Test with latest-everything failed but will not cause workflow failure. Please check if the error is expected or if it needs fixing." + fi + if [[ "${{ matrix.NXF_VER }}" != "latest-everything" ]]; then + exit 1 + fi + fi + confirm-pass: needs: [nf-test] if: always() runs-on: # use self-hosted runners - - runs-on=$-confirm-pass + - runs-on=${{ github.run_id }}-confirm-pass - runner=2cpu-linux-x64 steps: - - name: One or more tests failed + - name: One or more tests failed (excluding latest-everything) if: ${{ contains(needs.*.result, 'failure') }} run: exit 1 @@ -132,11 +141,3 @@ jobs: echo "DEBUG: toJSON(needs) = ${{ toJSON(needs) }}" echo "DEBUG: toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" echo "::endgroup::" - - - name: Clean Workspace # Purge the workspace in case it's running on a self-hosted runner - if: always() - run: | - ls -la ./ - rm -rf ./* || true - rm -rf ./.??* || true - ls -la ./ diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 4abaf484..0f732495 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -30,7 +30,7 @@ jobs: bsky-post: runs-on: ubuntu-latest steps: - - uses: zentered/bluesky-post-action@4aa83560bb3eac05dbad1e5f221ee339118abdd2 # v0.2.0 + - uses: zentered/bluesky-post-action@6461056ea355ea43b977e149f7bf76aaa572e5e8 # v0.3.0 with: post: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! diff --git a/.nf-core.yml b/.nf-core.yml index 5cfd8170..cff9da65 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,7 +5,7 @@ lint: - .github/ISSUE_TEMPLATE/bug_report.yml schema_params: false template_strings: false -nf_core_version: 3.3.1 +nf_core_version: 3.3.2 repository_type: pipeline template: author: Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9d0b248d..bb41beec 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ repos: hooks: - id: prettier additional_dependencies: - - prettier@3.5.0 + - prettier@3.6.2 - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: diff --git a/README.md b/README.md index 7e4a72f1..34854815 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,12 @@ -[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/ci.yml) +[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/scrnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![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%A524.04.2-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.3.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.3.1) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-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.3.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.3.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/) diff --git a/assets/schema_input.json b/assets/schema_input.json index 8313fe42..d66c965f 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -17,14 +17,14 @@ "type": "string", "format": "file-path", "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "pattern": "^([\\S\\s]*\\/)?[^\\s\\/]+\\.f(ast)?q\\.gz$", "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", "exists": true, - "pattern": "^\\S+\\.f(ast)?q\\.gz$", + "pattern": "^([\\S\\s]*\\/)?[^\\s\\/]+\\.f(ast)?q\\.gz$", "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" } }, diff --git a/conf/base.config b/conf/base.config index efa3378f..f0e7499f 100644 --- a/conf/base.config +++ b/conf/base.config @@ -61,5 +61,6 @@ process { } withLabel: process_gpu { ext.use_gpu = { workflow.profile.contains('gpu') } + accelerator = { workflow.profile.contains('gpu') ? 1 : null } } } diff --git a/modules.json b/modules.json index bfae7cb0..abcdb006 100644 --- a/modules.json +++ b/modules.json @@ -7,12 +7,12 @@ "nf-core": { "fastqc": { "branch": "master", - "git_sha": "08108058ea36a63f141c25c4e75f9f872a5b2296", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "f0719ae309075ae4a291533883847c3f7c441dad", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] } } diff --git a/modules/nf-core/fastqc/environment.yml b/modules/nf-core/fastqc/environment.yml index 691d4c76..f9f54ee9 100644 --- a/modules/nf-core/fastqc/environment.yml +++ b/modules/nf-core/fastqc/environment.yml @@ -1,3 +1,5 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 033f4154..23e16634 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -29,7 +29,7 @@ process FASTQC { // The total amount of allocated RAM by FastQC is equal to the number of threads defined (--threads) time the amount of RAM defined (--memory) // https://github.com/s-andrews/FastQC/blob/1faeea0412093224d7f6a07f777fad60a5650795/fastqc#L211-L222 // Dividing the task.memory by task.cpu allows to stick to requested amount of RAM in the label - def memory_in_mb = task.memory ? task.memory.toUnit('MB').toFloat() / task.cpus : null + def memory_in_mb = task.memory ? task.memory.toUnit('MB') / task.cpus : null // FastQC memory value allowed range (100 - 10000) def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml index 2b2e62b8..c8d9d025 100644 --- a/modules/nf-core/fastqc/meta.yml +++ b/modules/nf-core/fastqc/meta.yml @@ -29,9 +29,10 @@ input: description: | List of input FastQ files of size 1 and 2 for single-end and paired-end data, respectively. + ontologies: [] output: - - html: - - meta: + html: + - - meta: type: map description: | Groovy Map containing sample information @@ -40,8 +41,9 @@ output: type: file description: FastQC report pattern: "*_{fastqc.html}" - - zip: - - meta: + ontologies: [] + zip: + - - meta: type: map description: | Groovy Map containing sample information @@ -50,11 +52,14 @@ output: type: file description: FastQC report archive pattern: "*_{fastqc.zip}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@drpatelh" - "@grst" diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index a27122ce..812fc4c5 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -1,5 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.27 + - bioconda::multiqc=1.29 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 58d9313c..0ac3c369 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.27--pyhdfd78af_0' : - 'biocontainers/multiqc:1.27--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0' : + 'biocontainers/multiqc:1.29--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index b16c1879..ce30eb73 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -15,57 +15,71 @@ tools: licence: ["GPL-3.0-or-later"] identifier: biotools:multiqc input: - - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC - - - multiqc_config: - type: file - description: Optional config yml for MultiQC - pattern: "*.{yml,yaml}" - - - extra_multiqc_config: - type: file - description: Second optional config yml for MultiQC. Will override common sections - in multiqc_config. - pattern: "*.{yml,yaml}" - - - multiqc_logo: + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + ontologies: [] + - multiqc_config: + type: file + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - extra_multiqc_config: + type: file + description: Second optional config yml for MultiQC. Will override common sections + in multiqc_config. + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML + - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" + ontologies: [] + - replace_names: + type: file + description: | + Optional two-column sample renaming file. First column a set of + patterns, second column a set of corresponding replacements. Passed via + MultiQC's `--replace-names` option. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + - sample_names: + type: file + description: | + Optional TSV file with headers, passed to the MultiQC --sample_names + argument. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV +output: + report: + - "*multiqc_report.html": type: file - description: Optional logo file for MultiQC - pattern: "*.{png}" - - - replace_names: + description: MultiQC report file + pattern: "multiqc_report.html" + ontologies: [] + data: + - "*_data": + type: directory + description: MultiQC data dir + pattern: "multiqc_data" + plots: + - "*_plots": type: file - description: | - Optional two-column sample renaming file. First column a set of - patterns, second column a set of corresponding replacements. Passed via - MultiQC's `--replace-names` option. - pattern: "*.{tsv}" - - - sample_names: + description: Plots created by MultiQC + pattern: "*_data" + ontologies: [] + versions: + - versions.yml: type: file - description: | - Optional TSV file with headers, passed to the MultiQC --sample_names - argument. - pattern: "*.{tsv}" -output: - - report: - - "*multiqc_report.html": - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - - "*_data": - type: directory - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - - "*_plots": - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@abhi18av" - "@bunop" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 7b7c1322..88e90571 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.2" }, - "timestamp": "2025-01-27T09:29:57.631982377" + "timestamp": "2025-05-22T11:50:41.182332996" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.2" }, - "timestamp": "2025-01-27T09:30:34.743726958" + "timestamp": "2025-05-22T11:51:22.448739369" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,8f3b8c1cec5388cf2708be948c9fa42f" + "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.2" }, - "timestamp": "2025-01-27T09:30:21.44383553" + "timestamp": "2025-05-22T11:51:06.198928424" } } \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index d9699da8..a2a11454 100644 --- a/nextflow.config +++ b/nextflow.config @@ -235,7 +235,6 @@ dag { manifest { name = 'nf-core/scrnaseq' - author = """Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G""" // The author field is deprecated from Nextflow version 24.10.0, use contributors instead contributors = [ // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 [ @@ -283,14 +282,14 @@ manifest { description = """Pipeline for processing 10x Genomics single cell rnaseq data""" mainScript = 'main.nf' defaultBranch = 'master' - nextflowVersion = '!>=24.04.2' + nextflowVersion = '!>=24.10.5' version = '2.8.0dev' doi = '' } // Nextflow plugins plugins { - id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.4.2' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { diff --git a/nf-test.config b/nf-test.config index 889df760..3a1fff59 100644 --- a/nf-test.config +++ b/nf-test.config @@ -9,7 +9,7 @@ config { configFile "tests/nextflow.config" // ignore tests coming from the nf-core/modules repo - ignore 'modules/nf-core/**/*', 'subworkflows/nf-core/**/*' + ignore 'modules/nf-core/**/tests/*', 'subworkflows/nf-core/**/tests/*' // run all test with defined profile(s) from the main nextflow.config profile "test" diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 18b5affa..2d64395d 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-06-03T11:02:33+00:00", - "description": "

\n \n \n \"nf-core/scrnaseq\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/scrnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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%A524.04.2-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.3.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.3.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/scrnaseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![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/scrnaseq** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\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\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/scrnaseq \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\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/scrnaseq/usage) and the [parameter documentation](https://nf-co.re/scrnaseq/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/scrnaseq/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/scrnaseq/output).\n\n## Credits\n\nnf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\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 `#scrnaseq` channel](https://nfcore.slack.com/channels/scrnaseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\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", + "datePublished": "2025-07-08T11:39:16+00:00", + "description": "

\n \n \n \"nf-core/scrnaseq\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/scrnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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%A524.10.5-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.3.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.3.2)\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/scrnaseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![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/scrnaseq** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\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\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/scrnaseq \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\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/scrnaseq/usage) and the [parameter documentation](https://nf-co.re/scrnaseq/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/scrnaseq/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/scrnaseq/output).\n\n## Credits\n\nnf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\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 `#scrnaseq` channel](https://nfcore.slack.com/channels/scrnaseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\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", "hasPart": [ { "@id": "main.nf" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#366b21f6-c520-4683-af1f-8b11179077f5" + "@id": "#244931f2-1b9e-455a-a8b4-139a382be3a1" } ], "name": "nf-core/scrnaseq" @@ -128,7 +128,7 @@ } ], "dateCreated": "", - "dateModified": "2025-06-03T11:02:33Z", + "dateModified": "2025-07-08T11:39:16Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -164,14 +164,14 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=24.04.2" + "version": "!>=24.10.5" }, { - "@id": "#366b21f6-c520-4683-af1f-8b11179077f5", + "@id": "#244931f2-1b9e-455a-a8b4-139a382be3a1", "@type": "TestSuite", "instance": [ { - "@id": "#83881b30-412c-4952-b78b-765ae1f33783" + "@id": "#72edb790-585a-4a53-862b-83177c420bf1" } ], "mainEntity": { @@ -180,7 +180,7 @@ "name": "Test suite for nf-core/scrnaseq" }, { - "@id": "#83881b30-412c-4952-b78b-765ae1f33783", + "@id": "#72edb790-585a-4a53-862b-83177c420bf1", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/scrnaseq", "resource": "repos/nf-core/scrnaseq/actions/workflows/nf-test.yml", diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 0907ac58..09ef842a 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,5 +1,5 @@ plugins { - id "nf-schema@2.1.0" + id "nf-schema@2.4.2" } validation { diff --git a/tests/.nftignore b/tests/.nftignore index c10bc1f1..158c83c5 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -1,5 +1,6 @@ .DS_Store multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt +multiqc/multiqc_data/BETA-multiqc.parquet multiqc/multiqc_data/multiqc.log multiqc/multiqc_data/multiqc_data.json multiqc/multiqc_data/multiqc_sources.txt diff --git a/tests/nextflow.config b/tests/nextflow.config index 81ee3b12..d825f93a 100644 --- a/tests/nextflow.config +++ b/tests/nextflow.config @@ -6,7 +6,9 @@ // TODO nf-core: Specify any additional parameters here // Or any resources requirements -params.modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' -params.pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/scrnaseq' +params { + modules_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' + pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/scrnaseq' +} aws.client.anonymous = true // fixes S3 access issues on self-hosted runners From 175ffcc7d7a65d1b54c8be874b75cd63f68ccbd6 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 16 Jul 2025 10:36:27 -0400 Subject: [PATCH 35/82] Add the `accelerator` process directive to the `process_gpu` label configs Add the `accelerator` process directive to the `process_gpu` label configs --- conf/base.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/base.config b/conf/base.config index 5b1dcc18..b2f2e9b1 100644 --- a/conf/base.config +++ b/conf/base.config @@ -52,6 +52,7 @@ process { } withLabel: process_gpu { ext.use_gpu = { workflow.profile.contains('gpu') } + accelerator = { workflow.profile.contains('gpu') ? 1 : null } } withLabel:error_ignore { errorStrategy = 'ignore' From f073f45fa3bf8775f582f5ecd8240258e81cffb2 Mon Sep 17 00:00:00 2001 From: Mridul Chaudhary <47246321+Mridul-Chaudhary@users.noreply.github.com> Date: Tue, 22 Jul 2025 12:34:43 +0530 Subject: [PATCH 36/82] if condition on MultiQC step If condition based on if params.skip_multiqc is false, only then run the multiqc step in the workflow --- workflows/scrnaseq.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflows/scrnaseq.nf b/workflows/scrnaseq.nf index 8e18a940..0a97ac06 100644 --- a/workflows/scrnaseq.nf +++ b/workflows/scrnaseq.nf @@ -325,7 +325,7 @@ workflow SCRNASEQ { newLine: true ).set { ch_collated_versions } - +if (!params.skip_multiqc) { // // MODULE: MultiQC // @@ -370,3 +370,4 @@ workflow SCRNASEQ { versions = ch_versions // channel: [ path(versions.yml) ] } +} From 50f5af80e23e266eb263625701de94e091469f19 Mon Sep 17 00:00:00 2001 From: Mridul Chaudhary <47246321+Mridul-Chaudhary@users.noreply.github.com> Date: Tue, 22 Jul 2025 12:37:46 +0530 Subject: [PATCH 37/82] added if condition for multiQC in pipeline completion main block --- subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf index 772d4227..7dd038ea 100644 --- a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf @@ -156,7 +156,7 @@ workflow PIPELINE_COMPLETION { main: summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") - def multiqc_reports = multiqc_report.toList() + def multiqc_reports = params.skip_multiqc ? [null] : multiqc_report.toList() // // Completion email and summary From 4f1bc8fbc173b5422147f013c3d1c8bb317e9b3f Mon Sep 17 00:00:00 2001 From: Mridul Chaudhary <47246321+Mridul-Chaudhary@users.noreply.github.com> Date: Tue, 22 Jul 2025 12:42:46 +0530 Subject: [PATCH 38/82] added if conditions on multiqc report channels --- main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index baf90b55..74fafae8 100644 --- a/main.nf +++ b/main.nf @@ -56,7 +56,7 @@ workflow NFCORE_SCRNASEQ { params.gtf ) emit: - multiqc_report = SCRNASEQ.out.multiqc_report // channel: /path/to/multiqc_report.html + multiqc_report = params.skip_multiqc ? Channel.empty() : SCRNASEQ.out.multiqc_report // channel: /path/to/multiqc_report.html } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -95,7 +95,7 @@ workflow { params.outdir, params.monochrome_logs, params.hook_url, - NFCORE_SCRNASEQ.out.multiqc_report + multiqc_report = params.skip_multiqc ? Channel.empty() : NFCORE_SCRNASEQ.out.multiqc_report ) } From 3a758c0ff5a02cdaa04bca30eab8d630e0c64afd Mon Sep 17 00:00:00 2001 From: Mridul Chaudhary <47246321+Mridul-Chaudhary@users.noreply.github.com> Date: Tue, 22 Jul 2025 13:43:00 +0530 Subject: [PATCH 39/82] removed = operator in pipeline completion inputs 'multiqc_report=' not required in supplying inputs for Pipiline_Completion() step --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 74fafae8..d52bf0cf 100644 --- a/main.nf +++ b/main.nf @@ -95,7 +95,7 @@ workflow { params.outdir, params.monochrome_logs, params.hook_url, - multiqc_report = params.skip_multiqc ? Channel.empty() : NFCORE_SCRNASEQ.out.multiqc_report + params.skip_multiqc ? Channel.empty() : NFCORE_SCRNASEQ.out.multiqc_report ) } From fc1ee6bf605abf34cf59a61e54c7718e97d94f7a Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Thu, 24 Jul 2025 12:34:32 +0200 Subject: [PATCH 40/82] update cellranger multi module with nf-core tool --- modules.json | 2 +- modules/nf-core/cellranger/multi/main.nf | 7 + modules/nf-core/cellranger/multi/meta.yml | 197 +++++++++++------- .../multi/templates/cellranger_multi.py | 4 + .../cellranger/multi/tests/main.nf.test | 16 +- 5 files changed, 143 insertions(+), 83 deletions(-) diff --git a/modules.json b/modules.json index f7d106c5..a8e0b6a3 100644 --- a/modules.json +++ b/modules.json @@ -37,7 +37,7 @@ }, "cellranger/multi": { "branch": "master", - "git_sha": "c93c5a87d7ea1aef0b81a64d6e6b00bdb79d52c2", + "git_sha": "80db11d5d10e7319937c674afabc563bb14e3d93", "installed_by": ["modules"] }, "cellrangerarc/count": { diff --git a/modules/nf-core/cellranger/multi/main.nf b/modules/nf-core/cellranger/multi/main.nf index 547e4839..f4bc4cde 100644 --- a/modules/nf-core/cellranger/multi/main.nf +++ b/modules/nf-core/cellranger/multi/main.nf @@ -24,6 +24,7 @@ process CELLRANGER_MULTI { path cmo_barcodes , stageAs: "references/cmo/barcodes/*" path cmo_barcode_assignment, stageAs: "references/cmo/sample_barcode_assignment/*" path frna_sampleinfo , stageAs: "references/frna/*" + path ocm_barcodes , stageAs: "references/ocm/barcodes/*" val skip_renaming output: @@ -39,6 +40,10 @@ process CELLRANGER_MULTI { if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { error "CELLRANGER_MULTI module does not support Conda. Please use Docker / Singularity / Podman instead." } + // add mutually exclusive input checker + if ([ocm_barcodes, cmo_barcodes, frna_sampleinfo].count { it } >= 2) { + error "The ocm barcodes; cmo barcodes and frna probes are mutually exclusive features. Please use only one per sample, or reach out in slack in case it is really intended." + } args = task.ext.args ?: '' prefix = task.ext.prefix ?: "${meta.id}" @@ -61,6 +66,7 @@ process CELLRANGER_MULTI { include_cmo = cmo_fastqs.first().getName() != 'fastqs' && cmo_barcodes ? '[samples]' : '' include_fb = (ab_fastqs.first().getName() != 'fastqs' || crispr_fastqs.first().getName() != 'fastqs') && fb_reference ? '[feature]' : '' include_frna = gex_frna_probeset_name && frna_sampleinfo ? '[samples]' : '' + include_ocm = ocm_barcodes ? '[samples]' : '' gex_reference_path = include_gex ? "reference,./${gex_reference_name}" : '' fb_reference_path = include_fb ? "reference,./${fb_reference_name}" : '' @@ -82,6 +88,7 @@ process CELLRANGER_MULTI { // these references get appended directly to config file beam_csv_text = include_beam && beam_control_panel.size() > 0 ? beam_control_panel : '' cmo_csv_text = include_cmo && cmo_barcodes.size() > 0 ? cmo_barcodes : '' + ocm_csv_text = include_ocm && ocm_barcodes.size() > 0 ? ocm_barcodes : '' frna_csv_text = include_frna && frna_sampleinfo.size() > 0 ? frna_sampleinfo : '' // the feature barcodes section get options for either CRISPR or antibody capture assays diff --git a/modules/nf-core/cellranger/multi/meta.yml b/modules/nf-core/cellranger/multi/meta.yml index 7b2c808a..971bcecf 100644 --- a/modules/nf-core/cellranger/multi/meta.yml +++ b/modules/nf-core/cellranger/multi/meta.yml @@ -23,11 +23,11 @@ tools: licence: [10X Genomics EULA] identifier: "" input: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - - meta_gex: type: map description: | @@ -36,6 +36,8 @@ input: type: file description: FASTQ files pattern: "*.fastq.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - - meta_vdj: type: map description: | @@ -44,6 +46,8 @@ input: type: file description: FASTQ files pattern: "*.fastq.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - - meta_ab: type: map description: | @@ -52,6 +56,8 @@ input: type: file description: FASTQ files pattern: "*.fastq.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - - meta_beam: type: map description: | @@ -60,6 +66,8 @@ input: type: file description: FASTQ files pattern: "*.fastq.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - - meta_cmo: type: map description: | @@ -68,6 +76,8 @@ input: type: file description: FASTQ files pattern: "*.fastq.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - - meta_crispr: type: map description: | @@ -76,88 +86,119 @@ input: type: file description: FASTQ files pattern: "*.fastq.gz" - - - gex_reference: - type: directory - description: Folder containing Cellranger gene expression reference. Can also - be a gzipped tarball - pattern: "*.tar.gz" - - - gex_frna_probeset: - type: file - description: Fixed RNA profiling information containing custom probes in CSV - format - pattern: "*.csv" - - - gex_targetpanel: - type: file - description: Declaration of the target panel for Targeted Gene Expression analysis - pattern: "*.csv" - - - vdj_reference: - type: directory - description: Folder containing Cellranger V(D)J reference. Can also be a gzipped - tarball - pattern: "*.tar.gz" - - - vdj_primer_index: - type: file - description: List of custom V(D)J inner enrichment primers - pattern: "*.csv" - - - fb_reference: - type: file - description: The Feature Barcodes used for reference in Feature Barcoding Analysis - pattern: "*.csv" - - - beam_antigen_panel: - type: file - description: The BEAM manifest in Feature Barcode CSV format - pattern: "*.csv" - - - beam_control_panel: - type: file - description: The BEAM antigens set to control status, with corresponding MHC - alleles, in Feature Barcode CSV format - pattern: "*.csv" - - - cmo_reference: - type: file - description: Path to a custom Cell Multiplexing CSV reference IDs, or the `cmo-set` - option in Cellranger - pattern: "*.csv" - - - cmo_barcodes: - type: file - description: A CSV file appended to the Cellranger multi config linking samples - to CMO IDs - pattern: "*.csv" - - - cmo_barcode_assignment: - type: file - description: A CSV file that specifies the barcode-sample assignment in Cell - Multiplexing analysis - pattern: "*.csv" - - - frna_sampleinfo: - type: file - description: Sample information for fixed RNA analysis - pattern: "*.csv" - - - skip_renaming: - type: boolean - description: Skip renaming + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + - gex_reference: + type: directory + description: Folder containing Cellranger gene expression reference. Can also + be a gzipped tarball + pattern: "*.tar.gz" + - gex_frna_probeset: + type: file + description: Fixed RNA profiling information containing custom probes in CSV format + pattern: "*.csv" + ontologies: + - edam: http://edamontology.org/format_3752 # CSV + - gex_targetpanel: + type: file + description: Declaration of the target panel for Targeted Gene Expression analysis + pattern: "*.csv" + ontologies: + - edam: http://edamontology.org/format_3752 # CSV + - vdj_reference: + type: directory + description: Folder containing Cellranger V(D)J reference. Can also be a gzipped + tarball + pattern: "*.tar.gz" + - vdj_primer_index: + type: file + description: List of custom V(D)J inner enrichment primers + pattern: "*.csv" + ontologies: + - edam: http://edamontology.org/format_3752 # CSV + - fb_reference: + type: file + description: The Feature Barcodes used for reference in Feature Barcoding Analysis + pattern: "*.csv" + ontologies: + - edam: http://edamontology.org/format_3752 # CSV + - beam_antigen_panel: + type: file + description: The BEAM manifest in Feature Barcode CSV format + pattern: "*.csv" + ontologies: + - edam: http://edamontology.org/format_3752 # CSV + - beam_control_panel: + type: file + description: The BEAM antigens set to control status, with corresponding MHC alleles, + in Feature Barcode CSV format + pattern: "*.csv" + ontologies: + - edam: http://edamontology.org/format_3752 # CSV + - cmo_reference: + type: file + description: Path to a custom Cell Multiplexing CSV reference IDs, or the `cmo-set` + option in Cellranger + pattern: "*.csv" + ontologies: + - edam: http://edamontology.org/format_3752 # CSV + - cmo_barcodes: + type: file + description: A CSV file appended to the Cellranger multi config linking samples + to CMO IDs + pattern: "*.csv" + ontologies: + - edam: http://edamontology.org/format_3752 # CSV + - cmo_barcode_assignment: + type: file + description: A CSV file that specifies the barcode-sample assignment in Cell Multiplexing + analysis + pattern: "*.csv" + ontologies: + - edam: http://edamontology.org/format_3752 # CSV + - frna_sampleinfo: + type: file + description: Sample information for fixed RNA analysis + pattern: "*.csv" + ontologies: + - edam: http://edamontology.org/format_3752 # CSV + - ocm_barcodes: + type: file + description: A CSV file appended to the Cellranger multi config linking samples + to OCM IDs + pattern: "*.csv" + ontologies: + - edam: http://edamontology.org/format_3752 # CSV + - skip_renaming: + type: boolean + description: Skip renaming output: - - config: - - meta: - type: file - description: The resolved Cellranger multi config used for analysis - pattern: "cellranger_multi_config.csv" + config: + - - meta: + type: map + description: Groovy Map containing sample information - cellranger_multi_config.csv: type: file description: The resolved Cellranger multi config used for analysis pattern: "cellranger_multi_config.csv" - - outs: - - meta: - type: file - description: Files containing the outputs of Cell Ranger - pattern: "${meta.id}/outs/*" + ontologies: + - edam: http://edamontology.org/format_3752 # CSV + outs: + - - meta: + type: map + description: Groovy Map containing sample information - "**/outs/**": type: file description: Files containing the outputs of Cell Ranger pattern: "${meta.id}/outs/*" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@klkeys" maintainers: diff --git a/modules/nf-core/cellranger/multi/templates/cellranger_multi.py b/modules/nf-core/cellranger/multi/templates/cellranger_multi.py index 9f00ec86..4deee393 100644 --- a/modules/nf-core/cellranger/multi/templates/cellranger_multi.py +++ b/modules/nf-core/cellranger/multi/templates/cellranger_multi.py @@ -154,6 +154,10 @@ def chunk_iter(seq, size): with open("${frna_csv_text}") as input_conf: config_txt = config_txt + "\\n${include_frna}\\n" + input_conf.read() + "\\n" +if len("${include_ocm}") > 0: + with open("${ocm_csv_text}") as input_conf: + config_txt = config_txt + "\\n${include_ocm}\\n" + input_conf.read() + "\\n" + # Remove blank lines from config text config_txt = "\\n".join([line for line in config_txt.split("\\n") if line.strip() != ""]) diff --git a/modules/nf-core/cellranger/multi/tests/main.nf.test b/modules/nf-core/cellranger/multi/tests/main.nf.test index c5e76245..89b8aa74 100644 --- a/modules/nf-core/cellranger/multi/tests/main.nf.test +++ b/modules/nf-core/cellranger/multi/tests/main.nf.test @@ -187,6 +187,7 @@ nextflow_process { ch_beam_control_panel = [] ch_cmo_reference = [] ch_cmo_barcodes = [] + ch_ocm_barcodes = [] ch_cmo_sample_assignment = [] ch_frna_sampleinfo = [] @@ -225,7 +226,8 @@ nextflow_process { input[16] = ch_cmo_barcodes input[17] = ch_cmo_sample_assignment input[18] = ch_frna_sampleinfo - input[19] = false // default to false to guarantee renaming during test + input[19] = ch_ocm_barcodes + input[20] = false // default to false to guarantee renaming during test """ } } @@ -412,6 +414,7 @@ nextflow_process { ch_beam_control_panel = [] ch_cmo_reference = [] ch_cmo_barcodes = [] + ch_ocm_barcodes = [] ch_cmo_sample_assignment = [] ch_frna_sampleinfo = [] @@ -465,7 +468,8 @@ nextflow_process { input[16] = ch_cmo_barcodes input[17] = ch_cmo_sample_assignment input[18] = ch_frna_sampleinfo - input[19] = false // default to false to guarantee renaming during test + input[19] = ch_ocm_barcodes + input[20] = false // default to false to guarantee renaming during test """ } } @@ -652,6 +656,7 @@ nextflow_process { ch_beam_control_panel = [] ch_cmo_reference = [] ch_cmo_barcodes = [] + ch_ocm_barcodes = [] ch_cmo_sample_assignment = [] ch_frna_sampleinfo = [] @@ -702,7 +707,8 @@ nextflow_process { input[16] = ch_cmo_barcodes input[17] = ch_cmo_sample_assignment input[18] = ch_frna_sampleinfo - input[19] = false // default to false to guarantee renaming during test + input[19] = ch_ocm_barcodes + input[20] = false // default to false to guarantee renaming during test """ } } @@ -810,6 +816,7 @@ nextflow_process { ch_beam_control_panel = [] ch_cmo_reference = [] ch_cmo_barcodes = [] + ch_ocm_barcodes = [] ch_cmo_sample_assignment = [] ch_frna_sampleinfo = [] @@ -847,7 +854,8 @@ nextflow_process { input[16] = ch_cmo_barcodes input[17] = ch_cmo_sample_assignment input[18] = ch_frna_sampleinfo - input[19] = false // default to false to guarantee renaming during test + input[19] = ch_ocm_barcodes + input[20] = false // default to false to guarantee renaming during test """ } } From 7342fc39928808322a4234bda7ccfbfd387a4121 Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Thu, 24 Jul 2025 13:42:27 +0200 Subject: [PATCH 41/82] include ocm ids parsing in pipeline --- bin/check_cellrangermulti.py | 11 +++++++++++ .../local/parse_cellrangermulti_samplesheet.nf | 6 ++++-- subworkflows/local/align_cellrangermulti.nf | 16 ++++++++++++++-- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/bin/check_cellrangermulti.py b/bin/check_cellrangermulti.py index f8a5d495..e6aac804 100755 --- a/bin/check_cellrangermulti.py +++ b/bin/check_cellrangermulti.py @@ -11,8 +11,10 @@ def parse_samplesheet(samplesheet_path): # Define output directories cmo_output_dir = "cmo_files" + ocm_output_dir = "ocm_files" frna_output_dir = "frna_files" os.makedirs(cmo_output_dir, exist_ok=True) + os.makedirs(ocm_output_dir, exist_ok=True) os.makedirs(frna_output_dir, exist_ok=True) with open(samplesheet_path) as csvfile: @@ -40,6 +42,15 @@ def parse_samplesheet(samplesheet_path): cmo_writer.writerow(["sample_id", "cmo_ids", "description"]) cmo_writer.writerow([multiplexed_sample_id, row["cmo_ids"], description]) + # Process OCMs + if "ocm_ids" in headers and row["ocm_ids"]: + ocm_filename = os.path.join(ocm_output_dir, f"{sample}_ocm.csv") + with open(ocm_filename, "a", newline="") as ocm_file: + ocm_writer = csv.writer(ocm_file) + if not os.path.exists(ocm_filename) or os.stat(ocm_filename).st_size == 0: + ocm_writer.writerow(["sample_id", "ocm_ids", "description"]) + ocm_writer.writerow([multiplexed_sample_id, row["ocm_ids"], description]) + # Process FRNAs if "probe_barcode_ids" in headers and row["probe_barcode_ids"]: frna_filename = os.path.join(frna_output_dir, f"{sample}_frna.csv") diff --git a/modules/local/parse_cellrangermulti_samplesheet.nf b/modules/local/parse_cellrangermulti_samplesheet.nf index e8f56b67..753624e0 100644 --- a/modules/local/parse_cellrangermulti_samplesheet.nf +++ b/modules/local/parse_cellrangermulti_samplesheet.nf @@ -17,6 +17,7 @@ process PARSE_CELLRANGERMULTI_SAMPLESHEET { output: path "cmo_files/*" , emit: cmo, optional: true + path "ocm_files/*" , emit: ocm, optional: true path "frna_files/*", emit: frna, optional: true when: @@ -29,8 +30,9 @@ process PARSE_CELLRANGERMULTI_SAMPLESHEET { stub: """ - mkdir -p cmo_files frna_files + mkdir -p cmo_files ocm_files frna_files touch frna_files/test.csv - touch cmd_files/test.csv + touch cmo_files/test.csv + touch ocm_files/test.csv """ } diff --git a/subworkflows/local/align_cellrangermulti.nf b/subworkflows/local/align_cellrangermulti.nf index 85b2360d..3b12b02b 100644 --- a/subworkflows/local/align_cellrangermulti.nf +++ b/subworkflows/local/align_cellrangermulti.nf @@ -73,11 +73,11 @@ workflow CELLRANGER_MULTI_ALIGN { // // Here, we parse the received cellranger multi barcodes samplesheet. // We first use the get the PARSE_CELLRANGERMULTI_SAMPLESHEET module to check it and guarantee structure - // and also split it to have one fnra/cmo .csv for each sample. + // and also split it to have one fnra/cmo/ocm .csv for each sample. // // The selection of the GEX fastqs is because samples are always expected to have at least GEX data. // Then, using "combined" map, which means, the "additional barcode information" of each sample, we then, - // parse it to generate the cmo / frna samplesheets to be used by each sample. + // parse it to generate the cmo / ocm /frna samplesheets to be used by each sample. // // Here, to guarantee it and take advantage of the "FIFO"-rule and are sure that the data used in the // module is from the same sample from the "normal" samplesheet. We have to use the .concat().groupTuple() @@ -90,6 +90,7 @@ workflow CELLRANGER_MULTI_ALIGN { PARSE_CELLRANGERMULTI_SAMPLESHEET( ch_multi_samplesheet ) + // CMO ch_grouped_fastq.gex .map{ [it[0].id] } .concat( PARSE_CELLRANGERMULTI_SAMPLESHEET.out.cmo.flatten().map { [ "${it.baseName}" - "_cmo", it ] } ) @@ -97,6 +98,15 @@ workflow CELLRANGER_MULTI_ALIGN { .map { if ( it.size() == 2 ) { it[1] } else { [] } } // a correct tuple from snippet will have: [ sample, cmo.csv ] .set { ch_cmo_barcode_csv } + // OCM + ch_grouped_fastq.gex + .map{ [it[0].id] } + .concat( PARSE_CELLRANGERMULTI_SAMPLESHEET.out.ocm.flatten().map { [ "${it.baseName}" - "_ocm", it ] } ) + .groupTuple() + .map { if ( it.size() == 2 ) { it[1] } else { [] } } // a correct tuple from snippet will have: [ sample, ocm.csv ] + .set { ch_ocm_barcode_csv } + + // FRNA ch_grouped_fastq.gex .map{ [it[0].id] } .concat( PARSE_CELLRANGERMULTI_SAMPLESHEET.out.frna.flatten().map { [ "${it.baseName}" - "_frna", it ] } ) @@ -106,6 +116,7 @@ workflow CELLRANGER_MULTI_ALIGN { } else { ch_cmo_barcode_csv = [] + ch_ocm_barcode_csv = [] ch_frna_sample_csv = [] } @@ -184,6 +195,7 @@ workflow CELLRANGER_MULTI_ALIGN { ch_cmo_barcode_csv, [], ch_frna_sample_csv, + ch_ocm_barcode_csv, params.skip_cellranger_renaming ) ch_versions = ch_versions.mix(CELLRANGER_MULTI.out.versions) From 08593175b48936a10cb370b277fbb8630f4741cd Mon Sep 17 00:00:00 2001 From: fmalmeida Date: Thu, 24 Jul 2025 13:58:07 +0200 Subject: [PATCH 42/82] correct parsed ocm barcodes samplesheet --- bin/check_cellrangermulti.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/check_cellrangermulti.py b/bin/check_cellrangermulti.py index e6aac804..30fa6657 100755 --- a/bin/check_cellrangermulti.py +++ b/bin/check_cellrangermulti.py @@ -48,7 +48,7 @@ def parse_samplesheet(samplesheet_path): with open(ocm_filename, "a", newline="") as ocm_file: ocm_writer = csv.writer(ocm_file) if not os.path.exists(ocm_filename) or os.stat(ocm_filename).st_size == 0: - ocm_writer.writerow(["sample_id", "ocm_ids", "description"]) + ocm_writer.writerow(["sample_id", "ocm_barcode_ids", "description"]) ocm_writer.writerow([multiplexed_sample_id, row["ocm_ids"], description]) # Process FRNAs From 2706e3a74ab2a19e8307809587c0bf233cef6c8b Mon Sep 17 00:00:00 2001 From: fmalmeida Date: Thu, 24 Jul 2025 14:11:30 +0200 Subject: [PATCH 43/82] update usage documentation regarding `ocm_ids` --- docs/usage.md | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 4aa60ed3..c2f52a2a 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -270,7 +270,9 @@ If you are using cellranger-multi you have to add the column _feature_type_ to i - It is important that you give the same sample name for the different feature barcode technologies data that correspond to the same and should be analysed together. - The pipeline will **automatically** generate the cellranger multi config file based on the given data. -- When working with multiplexed data (FFPE or CMO), you'll need a **second samplesheet** relating the multiplexed samples to the corresponding "physical" sample (details below). The `sample` column in the main samplesheet refers to the "physical" sample that may contain multiple multiplexed samples. +- When working with multiplexed data (FFPE/CMO/OCM), you'll need a **second samplesheet** relating the multiplexed samples to the corresponding "physical" sample (details below). The `sample` column in the main samplesheet refers to the "physical" sample that may contain multiple multiplexed samples. + +> Please note that FFPE; CMO and OCM are mutually exclusive in the `cellranger/multi` module. Using more than one for a single sample will cause the module to fail. An example samplesheet could look like this: @@ -288,6 +290,8 @@ PBMC_10K_CMV,https://raw.githubusercontent.com/nf-core/test-datasets/modules/dat 4PLEX_HUMAN,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L002_R1_001.subsampled.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L002_R2_001.subsampled.fastq.gz,gex, 4PLEX_HUMAN,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L003_R1_001.subsampled.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L003_R2_001.subsampled.fastq.gz,gex, 4PLEX_HUMAN,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L004_R1_001.subsampled.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L004_R2_001.subsampled.fastq.gz,gex, +10k_Wistar_Rat,/path to data/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_fastqs/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L001_R1_001.fastq.gz,/data/gcbds/externals/almeifel/NFCORE_PIPELINES/scrnaseq/testing/OCM_MULTI/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_fastqs/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L001_R2_001.fastq.gz,gex, +10k_Wistar_Rat,/path to data/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_fastqs/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L002_R1_001.fastq.gz,/data/gcbds/externals/almeifel/NFCORE_PIPELINES/scrnaseq/testing/OCM_MULTI/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_fastqs/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L002_R2_001.fastq.gz,gex, ``` #### Additional samplesheet for multiplexed samples @@ -295,13 +299,17 @@ PBMC_10K_CMV,https://raw.githubusercontent.com/nf-core/test-datasets/modules/dat You must provide those via a CSV with the `--cellranger_multi_barcodes` parameter. The file should look like this: ```csv -sample,multiplexed_sample_id,probe_barcode_ids,cmo_ids,description -PBMC_10K_CMO,PBMC_10K_CMO_PBMCs_human_1,,CMO301,PBMCs_human_1 -PBMC_10K_CMO,PBMC_10K_CMO_PBMCs_human_2,,CMO302,PBMCs_human_2 -4PLEX_HUMAN,Liver_BC1,BC001,,Healthy liver dissociated using the Miltenyi FFPE Tissue Dissociation Kit -4PLEX_HUMAN,Ovarian_BC2,BC002,,Ovarian cancer dissociated using the Miltenyi FFPE Dissociation Kit -4PLEX_HUMAN,Colorectal_BC3,BC003,,Colorectal cancer dissociated using the Miltenyi FFPE Dissociation Kit -4PLEX_HUMAN,Pancreas_BC4,BC004,,Healthy pancreas dissociated using the Miltenyi FFPE Tissue Dissociation Kit +sample,multiplexed_sample_id,probe_barcode_ids,cmo_ids,ocm_ids,description +PBMC_10K_CMO,PBMC_10K_CMO_PBMCs_human_1,,CMO301,,PBMCs_human_1 +PBMC_10K_CMO,PBMC_10K_CMO_PBMCs_human_2,,CMO302,,PBMCs_human_2 +4PLEX_HUMAN,Liver_BC1,BC001,,,Healthy liver dissociated using the Miltenyi FFPE Tissue Dissociation Kit +4PLEX_HUMAN,Ovarian_BC2,BC002,,,Ovarian cancer dissociated using the Miltenyi FFPE Dissociation Kit +4PLEX_HUMAN,Colorectal_BC3,BC003,,,Colorectal cancer dissociated using the Miltenyi FFPE Dissociation Kit +4PLEX_HUMAN,Pancreas_BC4,BC004,,,Healthy pancreas dissociated using the Miltenyi FFPE Tissue Dissociation Kit +10k_Wistar_Rat,2500_Wistar_Rat_PBMCs_gem-x_OB1,,,OB1,2.5k_Wistar_Rat_PBMCs_gem-x_OB1 +10k_Wistar_Rat,2500_Wistar_Rat_PBMCs_gem-x_OB2,,,OB2,2.5k_Wistar_Rat_PBMCs_gem-x_OB2 +10k_Wistar_Rat,2500_Wistar_Rat_PBMCs_gem-x_OB3,,,OB3,2.5k_Wistar_Rat_PBMCs_gem-x_OB3 +10k_Wistar_Rat,2500_Wistar_Rat_PBMCs_gem-x_OB4,,,OB4,2.5k_Wistar_Rat_PBMCs_gem-x_OB4 ``` The `sample` column must match the corresponding entry in the main samplesheet. From 31b61649f86f60b56295349b65ef44d89ad4653a Mon Sep 17 00:00:00 2001 From: fmalmeida Date: Thu, 24 Jul 2025 14:32:09 +0200 Subject: [PATCH 44/82] update documentation to have CMO/FFPE/OCM examples separated for easier reading --- docs/usage.md | 72 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index c2f52a2a..47de31df 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -274,45 +274,79 @@ If you are using cellranger-multi you have to add the column _feature_type_ to i > Please note that FFPE; CMO and OCM are mutually exclusive in the `cellranger/multi` module. Using more than one for a single sample will cause the module to fail. -An example samplesheet could look like this: +##### Examples + +You can find the **complete** testing files used in the testing profiles here: + +* [input samplesheet](../assets/cellrangermulti_samplesheet.csv) +* [barcodes samplesheet](../assets/cellranger_barcodes_samplesheet.csv) + +In the sub-sections below we collect specific examples of CMO/FFPE/OCM samples for quicker visualisation. + +###### with CMOs + +**Input samplesheet**: ```csv sample,fastq_1,fastq_2,feature_type,expected_cells -PBMC_10K,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/fastqs/5gex/5gex/subsampled_sc5p_v2_hs_PBMC_10k_5gex_S1_L001_R1_001.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/fastqs/5gex/5gex/subsampled_sc5p_v2_hs_PBMC_10k_5gex_S1_L001_R2_001.fastq.gz,gex,1000 -PBMC_10K,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/fastqs/bcell/subsampled_sc5p_v2_hs_PBMC_10k_b_S1_L001_R1_001.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/fastqs/bcell/subsampled_sc5p_v2_hs_PBMC_10k_b_S1_L001_R2_001.fastq.gz,vdj,1000 -PBMC_10K,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/fastqs/5gex/5fb/subsampled_sc5p_v2_hs_PBMC_10k_5fb_S1_L001_R1_001.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/fastqs/5gex/5fb/subsampled_sc5p_v2_hs_PBMC_10k_5fb_S1_L001_R2_001.fastq.gz,ab,1000 PBMC_10K_CMO,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc_cmo/fastqs/gex_1/subsampled_SC3_v3_NextGem_DI_CellPlex_Human_PBMC_10K_1_gex_S2_L001_R1_001.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc_cmo/fastqs/gex_1/subsampled_SC3_v3_NextGem_DI_CellPlex_Human_PBMC_10K_1_gex_S2_L001_R2_001.fastq.gz,gex,1000 PBMC_10K_CMO,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc_cmo/fastqs/cmo/subsampled_SC3_v3_NextGem_DI_CellPlex_Human_PBMC_10K_1_multiplexing_capture_S1_L001_R1_001.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc_cmo/fastqs/cmo/subsampled_SC3_v3_NextGem_DI_CellPlex_Human_PBMC_10K_1_multiplexing_capture_S1_L001_R2_001.fastq.gz,cmo,1000 -PBMC_10K_CMV,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/5k_cmvpos_tcells/fastqs/gex_1/subsampled_5k_human_antiCMV_T_TBNK_connect_GEX_1_S1_L001_R1_001.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/5k_cmvpos_tcells/fastqs/gex_1/subsampled_5k_human_antiCMV_T_TBNK_connect_GEX_1_S1_L001_R2_001.fastq.gz,gex,1000 -PBMC_10K_CMV,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/5k_cmvpos_tcells/fastqs/ab/subsampled_5k_human_antiCMV_T_TBNK_connect_AB_S2_L004_R1_001.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/5k_cmvpos_tcells/fastqs/ab/subsampled_5k_human_antiCMV_T_TBNK_connect_AB_S2_L004_R2_001.fastq.gz,ab,1000 -PBMC_10K_CMV,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/5k_cmvpos_tcells/fastqs/vdj/subsampled_5k_human_antiCMV_T_TBNK_connect_VDJ_S1_L001_R1_001.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/5k_cmvpos_tcells/fastqs/vdj/subsampled_5k_human_antiCMV_T_TBNK_connect_VDJ_S1_L001_R2_001.fastq.gz,vdj,1000 +``` + +**Barcode samplesheet**: + +```csv +sample,multiplexed_sample_id,probe_barcode_ids,cmo_ids,ocm_ids,description +PBMC_10K_CMO,PBMC_10K_CMO_PBMCs_human_1,,CMO301,,PBMCs_human_1 +PBMC_10K_CMO,PBMC_10K_CMO_PBMCs_human_2,,CMO302,,PBMCs_human_2 +``` + +> You must provide the barcodes CSV with the `--cellranger_multi_barcodes` parameter. + +###### with FFPE + +**Input samplesheet**: + +```csv +sample,fastq_1,fastq_2,feature_type,expected_cells 4PLEX_HUMAN,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L001_R1_001.subsampled.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L001_R2_001.subsampled.fastq.gz,gex, 4PLEX_HUMAN,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L002_R1_001.subsampled.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L002_R2_001.subsampled.fastq.gz,gex, 4PLEX_HUMAN,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L003_R1_001.subsampled.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L003_R2_001.subsampled.fastq.gz,gex, 4PLEX_HUMAN,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L004_R1_001.subsampled.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L004_R2_001.subsampled.fastq.gz,gex, -10k_Wistar_Rat,/path to data/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_fastqs/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L001_R1_001.fastq.gz,/data/gcbds/externals/almeifel/NFCORE_PIPELINES/scrnaseq/testing/OCM_MULTI/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_fastqs/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L001_R2_001.fastq.gz,gex, -10k_Wistar_Rat,/path to data/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_fastqs/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L002_R1_001.fastq.gz,/data/gcbds/externals/almeifel/NFCORE_PIPELINES/scrnaseq/testing/OCM_MULTI/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_fastqs/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L002_R2_001.fastq.gz,gex, ``` -#### Additional samplesheet for multiplexed samples - -You must provide those via a CSV with the `--cellranger_multi_barcodes` parameter. The file should look like this: +**Barcode samplesheet**: ```csv sample,multiplexed_sample_id,probe_barcode_ids,cmo_ids,ocm_ids,description -PBMC_10K_CMO,PBMC_10K_CMO_PBMCs_human_1,,CMO301,,PBMCs_human_1 -PBMC_10K_CMO,PBMC_10K_CMO_PBMCs_human_2,,CMO302,,PBMCs_human_2 4PLEX_HUMAN,Liver_BC1,BC001,,,Healthy liver dissociated using the Miltenyi FFPE Tissue Dissociation Kit 4PLEX_HUMAN,Ovarian_BC2,BC002,,,Ovarian cancer dissociated using the Miltenyi FFPE Dissociation Kit 4PLEX_HUMAN,Colorectal_BC3,BC003,,,Colorectal cancer dissociated using the Miltenyi FFPE Dissociation Kit 4PLEX_HUMAN,Pancreas_BC4,BC004,,,Healthy pancreas dissociated using the Miltenyi FFPE Tissue Dissociation Kit +``` + +> You must provide the barcodes CSV with the `--cellranger_multi_barcodes` parameter. + +###### with OCMs + +**Input samplesheet**: + +```csv +sample,fastq_1,fastq_2,feature_type,expected_cells +10k_Wistar_Rat,/path to data/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_fastqs/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L002_R1_001.fastq.gz,/data/gcbds/externals/almeifel/NFCORE_PIPELINES/scrnaseq/testing/OCM_MULTI/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_fastqs/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L002_R2_001.fastq.gz,gex, +``` + +**Barcode samplesheet**: + +```csv +sample,multiplexed_sample_id,probe_barcode_ids,cmo_ids,ocm_ids,description 10k_Wistar_Rat,2500_Wistar_Rat_PBMCs_gem-x_OB1,,,OB1,2.5k_Wistar_Rat_PBMCs_gem-x_OB1 10k_Wistar_Rat,2500_Wistar_Rat_PBMCs_gem-x_OB2,,,OB2,2.5k_Wistar_Rat_PBMCs_gem-x_OB2 10k_Wistar_Rat,2500_Wistar_Rat_PBMCs_gem-x_OB3,,,OB3,2.5k_Wistar_Rat_PBMCs_gem-x_OB3 10k_Wistar_Rat,2500_Wistar_Rat_PBMCs_gem-x_OB4,,,OB4,2.5k_Wistar_Rat_PBMCs_gem-x_OB4 ``` -The `sample` column must match the corresponding entry in the main samplesheet. +> You must provide the barcodes CSV with the `--cellranger_multi_barcodes` parameter. #### Additional reference data @@ -323,14 +357,14 @@ The `sample` column must match the corresponding entry in the main samplesheet. > When running cellranger multi, without any VDJ data, users can also skip VDJ automated ref building with: `--skip_cellrangermulti_vdjref`. - When working with **FFPE data**, a prob set needs to be specified via `--gex_frna_probe_set`. This file is typically - [provided by 10x](https://www.10xgenomics.com/support/software/cell-ranger/downloads#probe-set-downloads). + [provided by 10x](https://www.10xgenomics.com/support/software/cell-ranger/downloads#probe-set-downloads). E.g. [testing ffpe probe set](../assets/frna_probeset_subset.csv). -- When working with **Cell Multiplexing Oligos (CMOs)**, a reference file needs to be provided via `--gex_cmo_set`. The - default reference file, as well as a description how to write a custom one, are [available from the 10x documentation](https://www.10xgenomics.com/support/software/cell-ranger/latest/analysis/running-pipelines/cr-3p-multi#cmo-ref) +- When working with **Cell Multiplexing Oligos (CMOs)**, a reference file can to be provided via `--gex_cmo_set`. The + default reference file, as well as a description how to write a custom one, are [available from the 10x documentation](https://www.10xgenomics.com/support/software/cell-ranger/latest/analysis/running-pipelines/cr-3p-multi#cmo-ref). By default, the Cell Ranger's default CMO-set. - When working with **Feature barcoding (antibody capture)**, a reference file needs to be provided via `--fb_reference`. It relates each "feature" to the corresponding barcode sequence. The structure of this file is described in - the [cellranger documentation](https://www.10xgenomics.com/support/software/cell-ranger/latest/analysis/running-pipelines/cr-feature-bc-analysis#feature-ref) + the [cellranger documentation](https://www.10xgenomics.com/support/software/cell-ranger/latest/analysis/running-pipelines/cr-feature-bc-analysis#feature-ref). E.g. [testing fb reference](../assets/fb_reference.csv) ## Running the pipeline From 41a040920c323ead3eb8341e889afb0727c259aa Mon Sep 17 00:00:00 2001 From: fmalmeida Date: Thu, 24 Jul 2025 14:36:26 +0200 Subject: [PATCH 45/82] re-order section order --- docs/usage.md | 56 +++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 47de31df..3070a0a6 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -274,7 +274,25 @@ If you are using cellranger-multi you have to add the column _feature_type_ to i > Please note that FFPE; CMO and OCM are mutually exclusive in the `cellranger/multi` module. Using more than one for a single sample will cause the module to fail. -##### Examples +#### Additional reference data + +- Cellranger multi needs a reference for **GEX and VDJ analysis**. They are calculated on the fly given the reference + files (`--fasta` and `--gtf`) provided, but users can also provide their own with: `--cellranger_index` + and `--cellranger_vdj_index`, for GEX and VDJ, respectively. + + > When running cellranger multi, without any VDJ data, users can also skip VDJ automated ref building with: `--skip_cellrangermulti_vdjref`. + +- When working with **FFPE data**, a prob set needs to be specified via `--gex_frna_probe_set`. This file is typically + [provided by 10x](https://www.10xgenomics.com/support/software/cell-ranger/downloads#probe-set-downloads). E.g. [testing ffpe probe set](../assets/frna_probeset_subset.csv). + +- When working with **Cell Multiplexing Oligos (CMOs)**, a reference file can to be provided via `--gex_cmo_set`. The + default reference file, as well as a description how to write a custom one, are [available from the 10x documentation](https://www.10xgenomics.com/support/software/cell-ranger/latest/analysis/running-pipelines/cr-3p-multi#cmo-ref). By default, the Cell Ranger's default CMO-set. + +- When working with **Feature barcoding (antibody capture)**, a reference file needs to be provided via `--fb_reference`. + It relates each "feature" to the corresponding barcode sequence. The structure of this file is described in + the [cellranger documentation](https://www.10xgenomics.com/support/software/cell-ranger/latest/analysis/running-pipelines/cr-feature-bc-analysis#feature-ref). E.g. [testing fb reference](../assets/fb_reference.csv) + +#### Examples You can find the **complete** testing files used in the testing profiles here: @@ -283,9 +301,9 @@ You can find the **complete** testing files used in the testing profiles here: In the sub-sections below we collect specific examples of CMO/FFPE/OCM samples for quicker visualisation. -###### with CMOs +##### with CMOs -**Input samplesheet**: +Input samplesheet: ```csv sample,fastq_1,fastq_2,feature_type,expected_cells @@ -293,7 +311,7 @@ PBMC_10K_CMO,https://raw.githubusercontent.com/nf-core/test-datasets/modules/dat PBMC_10K_CMO,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc_cmo/fastqs/cmo/subsampled_SC3_v3_NextGem_DI_CellPlex_Human_PBMC_10K_1_multiplexing_capture_S1_L001_R1_001.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc_cmo/fastqs/cmo/subsampled_SC3_v3_NextGem_DI_CellPlex_Human_PBMC_10K_1_multiplexing_capture_S1_L001_R2_001.fastq.gz,cmo,1000 ``` -**Barcode samplesheet**: +Barcode samplesheet: ```csv sample,multiplexed_sample_id,probe_barcode_ids,cmo_ids,ocm_ids,description @@ -303,9 +321,9 @@ PBMC_10K_CMO,PBMC_10K_CMO_PBMCs_human_2,,CMO302,,PBMCs_human_2 > You must provide the barcodes CSV with the `--cellranger_multi_barcodes` parameter. -###### with FFPE +##### with FFPE -**Input samplesheet**: +Input samplesheet: ```csv sample,fastq_1,fastq_2,feature_type,expected_cells @@ -315,7 +333,7 @@ sample,fastq_1,fastq_2,feature_type,expected_cells 4PLEX_HUMAN,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L004_R1_001.subsampled.fastq.gz,https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/10xgenomics/cellranger/4plex_scFFPE/4plex_human_liver_colorectal_ovarian_panc_scFFPE_multiplex_S1_L004_R2_001.subsampled.fastq.gz,gex, ``` -**Barcode samplesheet**: +Barcode samplesheet: ```csv sample,multiplexed_sample_id,probe_barcode_ids,cmo_ids,ocm_ids,description @@ -327,16 +345,16 @@ sample,multiplexed_sample_id,probe_barcode_ids,cmo_ids,ocm_ids,description > You must provide the barcodes CSV with the `--cellranger_multi_barcodes` parameter. -###### with OCMs +##### with OCMs -**Input samplesheet**: +Input samplesheet: ```csv sample,fastq_1,fastq_2,feature_type,expected_cells 10k_Wistar_Rat,/path to data/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_fastqs/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L002_R1_001.fastq.gz,/data/gcbds/externals/almeifel/NFCORE_PIPELINES/scrnaseq/testing/OCM_MULTI/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_fastqs/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L002_R2_001.fastq.gz,gex, ``` -**Barcode samplesheet**: +Barcode samplesheet: ```csv sample,multiplexed_sample_id,probe_barcode_ids,cmo_ids,ocm_ids,description @@ -348,24 +366,6 @@ sample,multiplexed_sample_id,probe_barcode_ids,cmo_ids,ocm_ids,description > You must provide the barcodes CSV with the `--cellranger_multi_barcodes` parameter. -#### Additional reference data - -- Cellranger multi needs a reference for **GEX and VDJ analysis**. They are calculated on the fly given the reference - files (`--fasta` and `--gtf`) provided, but users can also provide their own with: `--cellranger_index` - and `--cellranger_vdj_index`, for GEX and VDJ, respectively. - - > When running cellranger multi, without any VDJ data, users can also skip VDJ automated ref building with: `--skip_cellrangermulti_vdjref`. - -- When working with **FFPE data**, a prob set needs to be specified via `--gex_frna_probe_set`. This file is typically - [provided by 10x](https://www.10xgenomics.com/support/software/cell-ranger/downloads#probe-set-downloads). E.g. [testing ffpe probe set](../assets/frna_probeset_subset.csv). - -- When working with **Cell Multiplexing Oligos (CMOs)**, a reference file can to be provided via `--gex_cmo_set`. The - default reference file, as well as a description how to write a custom one, are [available from the 10x documentation](https://www.10xgenomics.com/support/software/cell-ranger/latest/analysis/running-pipelines/cr-3p-multi#cmo-ref). By default, the Cell Ranger's default CMO-set. - -- When working with **Feature barcoding (antibody capture)**, a reference file needs to be provided via `--fb_reference`. - It relates each "feature" to the corresponding barcode sequence. The structure of this file is described in - the [cellranger documentation](https://www.10xgenomics.com/support/software/cell-ranger/latest/analysis/running-pipelines/cr-feature-bc-analysis#feature-ref). E.g. [testing fb reference](../assets/fb_reference.csv) - ## Running the pipeline The minimum typical command for running the pipeline is as follows: From 720ab157a6e64de656e1654751fc46760025dba5 Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Fri, 25 Jul 2025 09:17:52 +0200 Subject: [PATCH 46/82] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f285e94..688a43f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix the workflow for cellranger-arc alignment and add new test with 10x multiome dataset ([#441](https://github.com/nf-core/scrnaseq/pull/441)) - Update `nf-core/cellranger` modules to tool verson `9.0.1` ([#467](https://github.com/nf-core/scrnaseq/pull/467)). - Fix igenomes usage to correctly handle fasta and gtf files ([#469](https://github.com/nf-core/scrnaseq/pull/469)). +- Update `cellranger/multi` module to latest version with nf-core tools ([#482](https://github.com/nf-core/scrnaseq/pull/482)) +- Adapt pipeline to also parse `OCM` barcodes for `cellranger/multi` and update its documentation ([#482](https://github.com/nf-core/scrnaseq/pull/482)) ### Chore From 07cf7b13fb74711325438b115ecaed49d8d5cf20 Mon Sep 17 00:00:00 2001 From: fmalmeida Date: Fri, 25 Jul 2025 09:28:31 +0200 Subject: [PATCH 47/82] apply prettier --- docs/usage.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 3070a0a6..ba4c3f56 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -296,8 +296,8 @@ If you are using cellranger-multi you have to add the column _feature_type_ to i You can find the **complete** testing files used in the testing profiles here: -* [input samplesheet](../assets/cellrangermulti_samplesheet.csv) -* [barcodes samplesheet](../assets/cellranger_barcodes_samplesheet.csv) +- [input samplesheet](../assets/cellrangermulti_samplesheet.csv) +- [barcodes samplesheet](../assets/cellranger_barcodes_samplesheet.csv) In the sub-sections below we collect specific examples of CMO/FFPE/OCM samples for quicker visualisation. From 1fe7e6e6c45367e3b13ecd4c29b0a19fc19c6dce Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Fri, 25 Jul 2025 13:54:00 +0200 Subject: [PATCH 48/82] add working rat-OCM cellranger multi testing dataset --- .../cellranger_barcodes_samplesheet_rat.csv | 5 +++ assets/cellrangermulti_samplesheet_rat.csv | 7 ++++ conf/test_cellranger_multi.config | 41 ++++++++++++++----- 3 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 assets/cellranger_barcodes_samplesheet_rat.csv create mode 100644 assets/cellrangermulti_samplesheet_rat.csv diff --git a/assets/cellranger_barcodes_samplesheet_rat.csv b/assets/cellranger_barcodes_samplesheet_rat.csv new file mode 100644 index 00000000..8e31ee11 --- /dev/null +++ b/assets/cellranger_barcodes_samplesheet_rat.csv @@ -0,0 +1,5 @@ +sample,multiplexed_sample_id,probe_barcode_ids,cmo_ids,ocm_ids,description +10k_Wistar_Rat,2500_Wistar_Rat_PBMCs_gem-x_OB1,,,OB1,2.5k_Wistar_Rat_PBMCs_gem-x_OB1 +10k_Wistar_Rat,2500_Wistar_Rat_PBMCs_gem-x_OB2,,,OB2,2.5k_Wistar_Rat_PBMCs_gem-x_OB2 +10k_Wistar_Rat,2500_Wistar_Rat_PBMCs_gem-x_OB3,,,OB3,2.5k_Wistar_Rat_PBMCs_gem-x_OB3 +10k_Wistar_Rat,2500_Wistar_Rat_PBMCs_gem-x_OB4,,,OB4,2.5k_Wistar_Rat_PBMCs_gem-x_OB4 diff --git a/assets/cellrangermulti_samplesheet_rat.csv b/assets/cellrangermulti_samplesheet_rat.csv new file mode 100644 index 00000000..0b7d95e3 --- /dev/null +++ b/assets/cellrangermulti_samplesheet_rat.csv @@ -0,0 +1,7 @@ +sample,fastq_1,fastq_2,feature_type,expected_cells +10k_Wistar_Rat,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/wistar_rat/10xgenomics/cellranger/10k_pbmc_ocm/fastqs/gex/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L001_R1_001.fastq.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/wistar_rat/10xgenomics/cellranger/10k_pbmc_ocm/fastqs/gex/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L001_R2_001.fastq.gz,gex +10k_Wistar_Rat,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/wistar_rat/10xgenomics/cellranger/10k_pbmc_ocm/fastqs/gex/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L002_R1_001.fastq.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/wistar_rat/10xgenomics/cellranger/10k_pbmc_ocm/fastqs/gex/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L002_R2_001.fastq.gz,gex +10k_Wistar_Rat,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/wistar_rat/10xgenomics/cellranger/10k_pbmc_ocm/fastqs/gex/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L003_R1_001.fastq.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/wistar_rat/10xgenomics/cellranger/10k_pbmc_ocm/fastqs/gex/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L003_R2_001.fastq.gz,gex +10k_Wistar_Rat,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/wistar_rat/10xgenomics/cellranger/10k_pbmc_ocm/fastqs/gex/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L004_R1_001.fastq.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/wistar_rat/10xgenomics/cellranger/10k_pbmc_ocm/fastqs/gex/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L004_R2_001.fastq.gz,gex +10k_Wistar_Rat,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/wistar_rat/10xgenomics/cellranger/10k_pbmc_ocm/fastqs/gex/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L005_R1_001.fastq.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/wistar_rat/10xgenomics/cellranger/10k_pbmc_ocm/fastqs/gex/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L005_R2_001.fastq.gz,gex +10k_Wistar_Rat,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/wistar_rat/10xgenomics/cellranger/10k_pbmc_ocm/fastqs/gex/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L006_R1_001.fastq.gz,https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/wistar_rat/10xgenomics/cellranger/10k_pbmc_ocm/fastqs/gex/10k_Wistar_Rat_PBMCs_Multiplex_3p_gem-x_Universal_OCM_S1_L006_R2_001.fastq.gz,gex diff --git a/conf/test_cellranger_multi.config b/conf/test_cellranger_multi.config index b9fe2a0c..7684a49b 100644 --- a/conf/test_cellranger_multi.config +++ b/conf/test_cellranger_multi.config @@ -28,21 +28,40 @@ params { max_memory = '8.GB' max_time = '6.h' - // Input data - input = "${projectDir}/assets/cellrangermulti_samplesheet.csv" - cellranger_multi_barcodes = "${projectDir}/assets/cellranger_barcodes_samplesheet.csv" - gex_frna_probe_set = "${projectDir}/assets/frna_probeset_subset.csv" - fb_reference = "${projectDir}/assets/fb_reference.csv" - skip_cellbender = true // not enough data in small test - - // Genome references - fasta = 'https://ftp.ensembl.org/pub/release-110/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.chromosome.14.fa.gz' - gtf = 'https://ftp.ensembl.org/pub/release-110/gtf/homo_sapiens/Homo_sapiens.GRCh38.110.gtf.gz' - // aligner aligner = 'cellrangermulti' protocol = 'auto' // other + skip_cellbender = true // not enough data in small test validationSchemaIgnoreParams = 'genomes' } + +// sub-profiles for human or rat test +profiles { + human { + params { + // Input data + input = "${projectDir}/assets/cellrangermulti_samplesheet.csv" + cellranger_multi_barcodes = "${projectDir}/assets/cellranger_barcodes_samplesheet.csv" + gex_frna_probe_set = "${projectDir}/assets/frna_probeset_subset.csv" + fb_reference = "${projectDir}/assets/fb_reference.csv" + + // Genome references + fasta = 'https://ftp.ensembl.org/pub/release-110/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.chromosome.14.fa.gz' + gtf = 'https://ftp.ensembl.org/pub/release-110/gtf/homo_sapiens/Homo_sapiens.GRCh38.110.gtf.gz' + } + } + + rat { + params { + // Input data + input = "${projectDir}/assets/cellrangermulti_samplesheet_rat.csv" + cellranger_multi_barcodes = "${projectDir}/assets/cellranger_barcodes_samplesheet_rat.csv" + + // Genome references + fasta = 'https://ftp.ensembl.org/pub/release-114/fasta/rattus_norvegicus/dna/Rattus_norvegicus.GRCr8.dna.primary_assembly.6.fa.gz' + gtf = 'https://ftp.ensembl.org/pub/release-114/gtf/rattus_norvegicus/Rattus_norvegicus.GRCr8.114.chr.gtf.gz' + } + } +} From bc99299e4651dfc76c34b6aad7ea7fea97290fcf Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Fri, 25 Jul 2025 18:21:46 +0200 Subject: [PATCH 49/82] add OCM cellranger multi nf-test --- tests/main_pipeline_cellrangermulti.nf.test | 111 +++++++++++++++++- ...main_pipeline_cellrangermulti.nf.test.snap | 50 +++++++- 2 files changed, 156 insertions(+), 5 deletions(-) diff --git a/tests/main_pipeline_cellrangermulti.nf.test b/tests/main_pipeline_cellrangermulti.nf.test index 98c2dd94..13cd27d0 100644 --- a/tests/main_pipeline_cellrangermulti.nf.test +++ b/tests/main_pipeline_cellrangermulti.nf.test @@ -3,7 +3,9 @@ nextflow_pipeline { name "Test Workflow main.nf" script "main.nf" - test("test-dataset_cellrangermulti_aligner") { + test("test-dataset_cellrangermulti_aligner_human") { + + tag 'human' when { // the rest is taken from shared config @@ -184,4 +186,111 @@ nextflow_pipeline { } } + test("test-dataset_cellrangermulti_aligner_rat") { + + tag 'rat' + + when { + params { + aligner = 'cellrangermulti' + outdir = "${outputDir}/results_cellrangermulti" + input = "${baseDir}/assets/cellrangermulti_samplesheet_rat.csv" + cellranger_multi_barcodes = "${baseDir}/assets/cellranger_barcodes_samplesheet_rat.csv" + fasta = 'https://ftp.ensembl.org/pub/release-114/fasta/rattus_norvegicus/dna/Rattus_norvegicus.GRCr8.dna.primary_assembly.6.fa.gz' + gtf = 'https://ftp.ensembl.org/pub/release-114/gtf/rattus_norvegicus/Rattus_norvegicus.GRCr8.114.chr.gtf.gz' + protocol = 'auto' + skip_cellbender = true + } + } + + then { + + assertAll( + { assert workflow.success }, + { assert workflow.trace.tasks().size() == 32 }, + + // directory checks + { assert path("${outputDir}/results_cellrangermulti/fastqc").list().size() == 24 }, + { assert path("${outputDir}/results_cellrangermulti/multiqc").list().size() == 3 }, + { assert path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions").list().size() == 11 }, + + // key output files + { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mkgtf/Rattus_norvegicus.GRCr8.dna.primary_assembly.6_genes.filtered.gtf").exists() }, + { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mkref/gex_reference/reference.json").exists() }, + { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mkvdjref/vdj_reference/reference.json").exists() }, + + // .h5ad existence checks + { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/10k_Wistar_Rat/10k_Wistar_Rat_raw_matrix.h5ad").exists() }, + + { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1/2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.h5ad").exists() }, + { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1/2500_Wistar_Rat_PBMCs_gem-x_OB1_raw_matrix.h5ad").exists() }, + + { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2/2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.h5ad").exists() }, + { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2/2500_Wistar_Rat_PBMCs_gem-x_OB2_raw_matrix.h5ad").exists() }, + + { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3/2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.h5ad").exists() }, + { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3/2500_Wistar_Rat_PBMCs_gem-x_OB3_raw_matrix.h5ad").exists() }, + + { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.h5ad").exists() }, + { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_raw_matrix.h5ad").exists() }, + + { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/combined_filtered_matrix.h5ad").exists() }, + { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/combined_raw_matrix.h5ad").exists() }, + + // snapshot matching check + { assert snapshot( + // .rds files + path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/10k_Wistar_Rat/10k_Wistar_Rat_raw_matrix.seurat.rds"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/10k_Wistar_Rat/10k_Wistar_Rat_raw_matrix.sce.rds"), + + path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1/2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.seurat.rds"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1/2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.sce.rds"), + + path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2/2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.seurat.rds"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2/2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.sce.rds"), + + path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3/2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.seurat.rds"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3/2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.sce.rds"), + + path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.seurat.rds"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.sce.rds"), + + path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/combined_filtered_matrix.seurat.rds"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/combined_filtered_matrix.sce.rds"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/combined_raw_matrix.seurat.rds"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/combined_raw_matrix.sce.rds"), + + // metrics + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/metrics_summary.csv"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/metrics_summary.csv"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/metrics_summary.csv"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/metrics_summary.csv"), + + // Matrix text files (raw & filtered) + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/raw_feature_bc_matrix/barcodes.tsv.gz"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/raw_feature_bc_matrix/features.tsv.gz"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/raw_feature_bc_matrix/matrix.mtx.gz"), + + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_filtered_feature_bc_matrix/features.tsv.gz"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz"), + + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_filtered_feature_bc_matrix/features.tsv.gz"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz"), + + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_filtered_feature_bc_matrix/features.tsv.gz"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz"), + + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_filtered_feature_bc_matrix/features.tsv.gz"), + path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz") + ).match() } + + ) + } + } + + } diff --git a/tests/main_pipeline_cellrangermulti.nf.test.snap b/tests/main_pipeline_cellrangermulti.nf.test.snap index 2296ba35..87beeeaa 100644 --- a/tests/main_pipeline_cellrangermulti.nf.test.snap +++ b/tests/main_pipeline_cellrangermulti.nf.test.snap @@ -1,5 +1,5 @@ { - "test-dataset_cellrangermulti_aligner": { + "test-dataset_cellrangermulti_aligner_human": { "content": [ "barcodes.tsv.gz:md5,a3937e73aa76a2acff554ca2f81a108d", "barcodes.tsv.gz:md5,b729c635b9ec993dd3e9c0602b440016", @@ -92,8 +92,50 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.6" + "nextflow": "24.10.1" }, - "timestamp": "2025-05-07T10:50:34.537911828" + "timestamp": "2025-07-25T15:47:51.974099348" + }, + "test-dataset_cellrangermulti_aligner_rat": { + "content": [ + "10k_Wistar_Rat_raw_matrix.seurat.rds:md5,be37ed0efb84a22909063388c54c4154", + "10k_Wistar_Rat_raw_matrix.sce.rds:md5,170343f922c2b73f137fff406e1316c3", + "2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.seurat.rds:md5,1f9c6d0214b36fb71adf3f5618f43738", + "2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.sce.rds:md5,5efca43447c83ad61e899b277e887dc9", + "2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.seurat.rds:md5,aa99723b6b31debf4d560da3eec46617", + "2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.sce.rds:md5,8bb0728102df993644672d9abe13e4bf", + "2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.seurat.rds:md5,e692f9f24f63bc91be1b8a95fd0ce6c7", + "2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.sce.rds:md5,5ecba68c2200060e60fe285ace5ab3c3", + "2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.seurat.rds:md5,e858cbc1fe44e1ed5657da5e3304a7f3", + "2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.sce.rds:md5,3802b542e2a6430d11e7f526c5423b01", + "combined_filtered_matrix.seurat.rds:md5,52c4193abeec7971a920550de69869c0", + "combined_filtered_matrix.sce.rds:md5,b454a6b301f26922ad4a913557054369", + "combined_raw_matrix.seurat.rds:md5,25516629372dd4f02a2fc7165ba25dc0", + "combined_raw_matrix.sce.rds:md5,7367f286af56c4edacf09d2c99b84805", + "metrics_summary.csv:md5,3e355f96e9496edd282a4e84d6bb97e6", + "metrics_summary.csv:md5,18996be1521fdfc90f02c9fdd10bb681", + "metrics_summary.csv:md5,fccc47adc8b442c78148ed5d43de92b6", + "metrics_summary.csv:md5,c8bda4f1f2921f9da26fa342b700878b", + "barcodes.tsv.gz:md5,b8392e06463e9b5d87528c2898539540", + "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", + "matrix.mtx.gz:md5,215bf0efebc1cb89ec754bf186c80909", + "barcodes.tsv.gz:md5,5916dd03abc1ec3c621ac62e090ddbfb", + "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", + "matrix.mtx.gz:md5,00011c41088ca6b405db7becc0c81682", + "barcodes.tsv.gz:md5,8973bb4c7b5c211dd1ffe003502166c0", + "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", + "matrix.mtx.gz:md5,bec72997f928ded91d60e6fb30945efb", + "barcodes.tsv.gz:md5,b5b2c8ac0a8f655ca53397dd337bca27", + "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", + "matrix.mtx.gz:md5,22833228f201dd010b6c40e035a42cab", + "barcodes.tsv.gz:md5,bb62ec4602c7579b20adf5ad2b4124d2", + "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", + "matrix.mtx.gz:md5,ac8bd7e83e9fde9d47454b323bed36d6" + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2025-07-25T18:16:53.898071151" } -} \ No newline at end of file +} From d6d7a95a23d4d86ad42f83eaa7a1b26f9e353c9a Mon Sep 17 00:00:00 2001 From: Felipe Date: Fri, 25 Jul 2025 21:11:03 +0200 Subject: [PATCH 50/82] remove 'combined' from snapshot --- tests/main_pipeline_cellrangermulti.nf.test | 5 ----- tests/main_pipeline_cellrangermulti.nf.test.snap | 4 ---- 2 files changed, 9 deletions(-) diff --git a/tests/main_pipeline_cellrangermulti.nf.test b/tests/main_pipeline_cellrangermulti.nf.test index 13cd27d0..5cdd438b 100644 --- a/tests/main_pipeline_cellrangermulti.nf.test +++ b/tests/main_pipeline_cellrangermulti.nf.test @@ -255,11 +255,6 @@ nextflow_pipeline { path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.seurat.rds"), path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.sce.rds"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/combined_filtered_matrix.seurat.rds"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/combined_filtered_matrix.sce.rds"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/combined_raw_matrix.seurat.rds"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/combined_raw_matrix.sce.rds"), - // metrics path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/metrics_summary.csv"), path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/metrics_summary.csv"), diff --git a/tests/main_pipeline_cellrangermulti.nf.test.snap b/tests/main_pipeline_cellrangermulti.nf.test.snap index 87beeeaa..a952f554 100644 --- a/tests/main_pipeline_cellrangermulti.nf.test.snap +++ b/tests/main_pipeline_cellrangermulti.nf.test.snap @@ -108,10 +108,6 @@ "2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.sce.rds:md5,5ecba68c2200060e60fe285ace5ab3c3", "2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.seurat.rds:md5,e858cbc1fe44e1ed5657da5e3304a7f3", "2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.sce.rds:md5,3802b542e2a6430d11e7f526c5423b01", - "combined_filtered_matrix.seurat.rds:md5,52c4193abeec7971a920550de69869c0", - "combined_filtered_matrix.sce.rds:md5,b454a6b301f26922ad4a913557054369", - "combined_raw_matrix.seurat.rds:md5,25516629372dd4f02a2fc7165ba25dc0", - "combined_raw_matrix.sce.rds:md5,7367f286af56c4edacf09d2c99b84805", "metrics_summary.csv:md5,3e355f96e9496edd282a4e84d6bb97e6", "metrics_summary.csv:md5,18996be1521fdfc90f02c9fdd10bb681", "metrics_summary.csv:md5,fccc47adc8b442c78148ed5d43de92b6", From 7ed2da009b88b853cabf55584f4e1d2d40621fa7 Mon Sep 17 00:00:00 2001 From: Leon Hafner <60394289+LeonHafner@users.noreply.github.com> Date: Sat, 26 Jul 2025 15:19:52 +0200 Subject: [PATCH 51/82] move getGenomeAttributes to main.nf and add star_index parameter --- main.nf | 39 ++++++++++++------- nextflow.config | 1 - .../utils_nfcore_scrnaseq_pipeline/main.nf | 14 ------- workflows/scrnaseq.nf | 14 +++---- 4 files changed, 32 insertions(+), 36 deletions(-) diff --git a/main.nf b/main.nf index baf90b55..be04b322 100644 --- a/main.nf +++ b/main.nf @@ -11,25 +11,25 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IMPORT FUNCTIONS / MODULES / SUBWORKFLOWS / WORKFLOWS + GENOME PARAMETER VALUES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { getGenomeAttribute } from './subworkflows/local/utils_nfcore_scrnaseq_pipeline' -include { SCRNASEQ } from './workflows/scrnaseq' -include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_scrnaseq_pipeline' -include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_scrnaseq_pipeline' +// Params cannot be changed if they have been set beforehand +// Thus, manually provided files are not overwritten by the genome attributes +params.fasta = getGenomeAttribute('fasta') +params.gtf = getGenomeAttribute('gtf') +params.star_index = getGenomeAttribute('star') /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - GENOME PARAMETER VALUES + IMPORT FUNCTIONS / MODULES / SUBWORKFLOWS / WORKFLOWS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -// Params cannot be changed if they have been set beforehand -// Thus, manually provided files are not overwritten by the genome attributes -params.fasta = getGenomeAttribute('fasta') -params.gtf = getGenomeAttribute('gtf') +include { SCRNASEQ } from './workflows/scrnaseq' +include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_scrnaseq_pipeline' +include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_scrnaseq_pipeline' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -51,9 +51,7 @@ workflow NFCORE_SCRNASEQ { // WORKFLOW: Run pipeline // SCRNASEQ ( - samplesheet, - params.fasta, - params.gtf + samplesheet ) emit: multiqc_report = SCRNASEQ.out.multiqc_report // channel: /path/to/multiqc_report.html @@ -99,6 +97,21 @@ workflow { ) } +// +// Get attribute from genome config file e.g. fasta +// +def getGenomeAttribute(attribute) { + if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { + if (params.genomes[ params.genome ].containsKey(attribute)) { + return params.genomes[ params.genome ][ attribute ] + } else { + return null + } + } else { + return null + } +} + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END diff --git a/nextflow.config b/nextflow.config index f1d714b3..af182a52 100644 --- a/nextflow.config +++ b/nextflow.config @@ -33,7 +33,6 @@ params { kb_t2c = null // STARsolo parameters - star_index = null star_ignore_sjdbgtf = null seq_center = null star_feature = "Gene" diff --git a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf index 772d4227..7db05909 100644 --- a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf @@ -249,20 +249,6 @@ def cellrangerarcStructure(input) { return [ sampleMeta, sampletypes, subsamples, fastqs.flatten() ] } -// -// Get attribute from genome config file e.g. fasta -// -def getGenomeAttribute(attribute) { - if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { - if (params.genomes[ params.genome ].containsKey(attribute)) { - return params.genomes[ params.genome ][ attribute ] - } else { - return null - } - } else { - return null - } -} // // Exit pipeline if incorrect --genome key provided diff --git a/workflows/scrnaseq.nf b/workflows/scrnaseq.nf index 8e18a940..c1b4aded 100644 --- a/workflows/scrnaseq.nf +++ b/workflows/scrnaseq.nf @@ -28,8 +28,6 @@ workflow SCRNASEQ { take: ch_fastq - fasta - gtf main: ch_multiqc_files = Channel.empty() @@ -42,8 +40,8 @@ workflow SCRNASEQ { } // general input and params - ch_genome_fasta = fasta ? file(fasta, checkIfExists: true) : [] - ch_gtf = gtf ? file(gtf, checkIfExists: true) : [] + ch_genome_fasta = params.fasta ? file(params.fasta, checkIfExists: true) : [] + ch_gtf = params.gtf ? file(params.gtf, checkIfExists: true) : [] ch_transcript_fasta = params.transcript_fasta ? file(params.transcript_fasta) : [] ch_motifs = params.motifs ? file(params.motifs) : [] ch_txp2gene = params.txp2gene ? file(params.txp2gene, checkIfExists: true) : [] @@ -93,8 +91,8 @@ workflow SCRNASEQ { // // Uncompress genome fasta file if required // - if (fasta) { - if (fasta.endsWith('.gz')) { + if (params.fasta) { + if (params.fasta.endsWith('.gz')) { ch_genome_fasta = GUNZIP_FASTA ( [ [:], ch_genome_fasta ] ).gunzip.map { it[1] } ch_versions = ch_versions.mix(GUNZIP_FASTA.out.versions) } else { @@ -105,8 +103,8 @@ workflow SCRNASEQ { // // Uncompress GTF annotation file or create from GFF3 if required // - if (gtf) { - if (gtf.endsWith('.gz')) { + if (params.gtf) { + if (params.gtf.endsWith('.gz')) { ch_gtf = GUNZIP_GTF ( [ [:], ch_gtf ] ).gunzip.map { it[1] } ch_versions = ch_versions.mix(GUNZIP_GTF.out.versions) } else { From bb9001d6341a2c59ef267c2c05f8eb29ca8d33ef Mon Sep 17 00:00:00 2001 From: Leon Hafner <60394289+LeonHafner@users.noreply.github.com> Date: Sat, 26 Jul 2025 15:37:10 +0200 Subject: [PATCH 52/82] readd getGenomeAttribute to utils --- .../local/utils_nfcore_scrnaseq_pipeline/main.nf | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf index 7db05909..772d4227 100644 --- a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf @@ -249,6 +249,20 @@ def cellrangerarcStructure(input) { return [ sampleMeta, sampletypes, subsamples, fastqs.flatten() ] } +// +// Get attribute from genome config file e.g. fasta +// +def getGenomeAttribute(attribute) { + if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { + if (params.genomes[ params.genome ].containsKey(attribute)) { + return params.genomes[ params.genome ][ attribute ] + } else { + return null + } + } else { + return null + } +} // // Exit pipeline if incorrect --genome key provided From 01d5defd70d75c83831b5803a66b6bb587862327 Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Wed, 30 Jul 2025 09:58:24 +0200 Subject: [PATCH 53/82] delete unused snap --- tests/main_pipeline_alevin.nf.test.snap | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 tests/main_pipeline_alevin.nf.test.snap diff --git a/tests/main_pipeline_alevin.nf.test.snap b/tests/main_pipeline_alevin.nf.test.snap deleted file mode 100644 index 4138b7e5..00000000 --- a/tests/main_pipeline_alevin.nf.test.snap +++ /dev/null @@ -1,21 +0,0 @@ -{ - "test-dataset_alevin_aligner": { - "content": [ - "quants_mat_cols.txt:md5,e9868982c17a330392e38c2a5933cf97", - "quants_mat.mtx:md5,b8aa7b3c488fd8923de50a3621d4991f", - "quants_mat_rows.txt:md5,6227df5a13127b71c71fb18cd8574857", - "quants_mat_cols.txt:md5,e9868982c17a330392e38c2a5933cf97", - "quants_mat.mtx:md5,54cd12666016adce94c025b2e07f4b02", - "quants_mat_rows.txt:md5,6b458a7777260ba90eccbe7919df934b", - "Sample_X_raw_matrix.seurat.rds:md5,708ec66ee15c31c1a09cbaee035a6508", - "Sample_X_raw_matrix.sce.rds:md5,3bed89cd187a3f5385636fd5196ef42d", - "Sample_Y_raw_matrix.seurat.rds:md5,3f031ff7c50ee2a2e13ea86319892ee5", - "Sample_Y_raw_matrix.sce.rds:md5,c83e8e04b8fd4bb4d03313a1348686dc" - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.10.2" - }, - "timestamp": "2024-11-29T10:17:18.33882659" - } -} \ No newline at end of file From b3a137c4d1b46b3134df19dbb7562b313894b364 Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Wed, 30 Jul 2025 13:43:31 +0200 Subject: [PATCH 54/82] update simpleaf nf-test as new template --- tests/.nftignore | 2 + tests/main_pipeline_simpleaf.nf.test | 62 ++----- tests/main_pipeline_simpleaf.nf.test.snap | 196 +++++++++++++++++++++- 3 files changed, 207 insertions(+), 53 deletions(-) diff --git a/tests/.nftignore b/tests/.nftignore index 158c83c5..4eacbfea 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -9,3 +9,5 @@ multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} multiqc/multiqc_report.html fastqc/*_fastqc.{html,zip} pipeline_info/*.{html,json,txt,yml} +**/simpleaf_quant/** +**/*.html diff --git a/tests/main_pipeline_simpleaf.nf.test b/tests/main_pipeline_simpleaf.nf.test index a401d813..96947f23 100644 --- a/tests/main_pipeline_simpleaf.nf.test +++ b/tests/main_pipeline_simpleaf.nf.test @@ -14,53 +14,25 @@ nextflow_pipeline { } 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}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( - - // - // General assertions - // - - // Did it finish successfully? - {assert workflow.success}, - - // How many tasks were executed? - {assert workflow.trace.tasks().size() == 15}, - - // How many results were produced? - {assert path("${outputDir}/results_simpleaf").list().size() == 4}, - {assert path("${outputDir}/results_simpleaf/simpleaf").list().size() == 3}, - {assert path("${outputDir}/results_simpleaf/simpleaf/mtx_conversions").list().size() == 5}, - {assert path("${outputDir}/results_simpleaf/fastqc").list().size() == 12}, - {assert path("${outputDir}/results_simpleaf/multiqc").list().size() == 3}, - - // - // Check if files were produced - // - {assert new File( "${outputDir}/results_simpleaf/simpleaf/Sample_X/simpleaf_quant/af_quant/alevin/quants_mat_cols.txt" ).exists()}, - {assert new File( "${outputDir}/results_simpleaf/simpleaf/Sample_X/simpleaf_quant/af_quant/alevin/quants_mat_rows.txt" ).exists()}, - {assert new File( "${outputDir}/results_simpleaf/simpleaf/Sample_X/simpleaf_quant/af_quant/alevin/quants_mat.mtx" ).exists()}, - {assert new File( "${outputDir}/results_simpleaf/simpleaf/Sample_X/simpleaf_quant/af_quant/alevin/quants.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_simpleaf/simpleaf/Sample_Y/simpleaf_quant/af_quant/alevin/quants_mat_cols.txt" ).exists()}, - {assert new File( "${outputDir}/results_simpleaf/simpleaf/Sample_Y/simpleaf_quant/af_quant/alevin/quants_mat_rows.txt" ).exists()}, - {assert new File( "${outputDir}/results_simpleaf/simpleaf/Sample_Y/simpleaf_quant/af_quant/alevin/quants_mat.mtx" ).exists()}, - {assert new File( "${outputDir}/results_simpleaf/simpleaf/Sample_Y/simpleaf_quant/af_quant/alevin/quants.h5ad" ).exists()}, - - // - // Check if files are the same - // - {assert snapshot( - path( "${outputDir}/results_simpleaf/simpleaf/mtx_conversions/Sample_X/Sample_X_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_simpleaf/simpleaf/mtx_conversions/Sample_X/Sample_X_raw_matrix.sce.rds" ), - path( "${outputDir}/results_simpleaf/simpleaf/mtx_conversions/Sample_X/Sample_X_raw_matrix.h5ad" ), - path( "${outputDir}/results_simpleaf/simpleaf/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_simpleaf/simpleaf/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.sce.rds" ), - path( "${outputDir}/results_simpleaf/simpleaf/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.h5ad" ), - ).match()} - - ) // end of 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 test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/results_simpleaf/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) } + } } diff --git a/tests/main_pipeline_simpleaf.nf.test.snap b/tests/main_pipeline_simpleaf.nf.test.snap index a004a3f4..c69fb317 100644 --- a/tests/main_pipeline_simpleaf.nf.test.snap +++ b/tests/main_pipeline_simpleaf.nf.test.snap @@ -1,17 +1,197 @@ { "test-dataset_simpleaf_aligner": { "content": [ - "Sample_X_raw_matrix.seurat.rds:md5,e1003985cc53b3538436a4726e3843a3", - "Sample_X_raw_matrix.sce.rds:md5,6e9e0d6067fdca27645b66df47c6cdc1", - "Sample_X_raw_matrix.h5ad:md5,d9c56aa71ade55f2b218db21efbce57f", - "Sample_Y_raw_matrix.seurat.rds:md5,bae61b4d15df485464f6448a3b91f28c", - "Sample_Y_raw_matrix.sce.rds:md5,010c137155f5b8feed6ea4b853dc12c3", - "Sample_Y_raw_matrix.h5ad:md5,7a9899fed9301f3f6f4e6d7b1ada226d" + 15, + { + "ALEVINQC": { + "alevinqc": "1.18.0" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "MTX_TO_H5AD": { + "python": "3.12.5", + "scanpy": "1.10.2", + "pandas": "2.2.2", + "anndata": "0.10.8" + }, + "SIMPLEAF_INDEX": { + "alevin-fry": "0.11.2", + "piscem": "0.12.2", + "salmon": "1.10.3", + "simpleaf": "0.19.4" + }, + "SIMPLEAF_QUANT": { + "alevin-fry": "0.11.2", + "piscem": "0.12.2", + "salmon": "1.10.3", + "simpleaf": "0.19.4" + }, + "Workflow": { + "nf-core/scrnaseq": "v4.1.0dev" + } + }, + [ + "", + "fastqc", + "fastqc/Sample_X_1_fastqc.html", + "fastqc/Sample_X_1_fastqc.zip", + "fastqc/Sample_X_2_fastqc.html", + "fastqc/Sample_X_2_fastqc.zip", + "fastqc/Sample_Y_1_fastqc.html", + "fastqc/Sample_Y_1_fastqc.zip", + "fastqc/Sample_Y_2_fastqc.html", + "fastqc/Sample_Y_2_fastqc.zip", + "fastqc/Sample_Y_3_fastqc.html", + "fastqc/Sample_Y_3_fastqc.zip", + "fastqc/Sample_Y_4_fastqc.html", + "fastqc/Sample_Y_4_fastqc.zip", + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/BETA-multiqc.parquet", + "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", + "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_sequence_quality_plot.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/multiqc_data/fastqc_per_sequence_quality_scores_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", + "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_fastqc.txt", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/fastqc-status-check-heatmap.pdf", + "multiqc/multiqc_plots/pdf/fastqc_adapter_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_n_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/fastqc-status-check-heatmap.png", + "multiqc/multiqc_plots/png/fastqc_adapter_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_n_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_sequence_quality_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_quality_scores_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-cnt.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-pct.png", + "multiqc/multiqc_plots/png/fastqc_sequence_duplication_levels_plot.png", + "multiqc/multiqc_plots/png/fastqc_top_overrepresented_sequences_table.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/fastqc-status-check-heatmap.svg", + "multiqc/multiqc_plots/svg/fastqc_adapter_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_n_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_sequence_quality_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_quality_scores_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-cnt.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-pct.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_duplication_levels_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_top_overrepresented_sequences_table.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml", + "simpleaf", + "simpleaf/Sample_X", + "simpleaf/Sample_X/simpleaf_qc_report_Sample_X.html", + "simpleaf/Sample_X/simpleaf_quant", + "simpleaf/Sample_X/simpleaf_quant/af_map", + "simpleaf/Sample_X/simpleaf_quant/af_map/map.rad", + "simpleaf/Sample_X/simpleaf_quant/af_map/map_info.json", + "simpleaf/Sample_X/simpleaf_quant/af_map/unmapped_bc_count.bin", + "simpleaf/Sample_X/simpleaf_quant/af_quant", + "simpleaf/Sample_X/simpleaf_quant/af_quant/alevin", + "simpleaf/Sample_X/simpleaf_quant/af_quant/alevin/quants.h5ad", + "simpleaf/Sample_X/simpleaf_quant/af_quant/alevin/quants_mat.mtx", + "simpleaf/Sample_X/simpleaf_quant/af_quant/alevin/quants_mat_cols.txt", + "simpleaf/Sample_X/simpleaf_quant/af_quant/alevin/quants_mat_rows.txt", + "simpleaf/Sample_X/simpleaf_quant/af_quant/collate.json", + "simpleaf/Sample_X/simpleaf_quant/af_quant/featureDump.txt", + "simpleaf/Sample_X/simpleaf_quant/af_quant/gene_id_to_name.tsv", + "simpleaf/Sample_X/simpleaf_quant/af_quant/generate_permit_list.json", + "simpleaf/Sample_X/simpleaf_quant/af_quant/map.collated.rad", + "simpleaf/Sample_X/simpleaf_quant/af_quant/permit_freq.bin", + "simpleaf/Sample_X/simpleaf_quant/af_quant/permit_map.bin", + "simpleaf/Sample_X/simpleaf_quant/af_quant/quant.json", + "simpleaf/Sample_X/simpleaf_quant/af_quant/unmapped_bc_count_collated.bin", + "simpleaf/Sample_Y", + "simpleaf/Sample_Y/simpleaf_qc_report_Sample_Y.html", + "simpleaf/Sample_Y/simpleaf_quant", + "simpleaf/Sample_Y/simpleaf_quant/af_map", + "simpleaf/Sample_Y/simpleaf_quant/af_map/map.rad", + "simpleaf/Sample_Y/simpleaf_quant/af_map/map_info.json", + "simpleaf/Sample_Y/simpleaf_quant/af_map/unmapped_bc_count.bin", + "simpleaf/Sample_Y/simpleaf_quant/af_quant", + "simpleaf/Sample_Y/simpleaf_quant/af_quant/alevin", + "simpleaf/Sample_Y/simpleaf_quant/af_quant/alevin/quants.h5ad", + "simpleaf/Sample_Y/simpleaf_quant/af_quant/alevin/quants_mat.mtx", + "simpleaf/Sample_Y/simpleaf_quant/af_quant/alevin/quants_mat_cols.txt", + "simpleaf/Sample_Y/simpleaf_quant/af_quant/alevin/quants_mat_rows.txt", + "simpleaf/Sample_Y/simpleaf_quant/af_quant/collate.json", + "simpleaf/Sample_Y/simpleaf_quant/af_quant/featureDump.txt", + "simpleaf/Sample_Y/simpleaf_quant/af_quant/gene_id_to_name.tsv", + "simpleaf/Sample_Y/simpleaf_quant/af_quant/generate_permit_list.json", + "simpleaf/Sample_Y/simpleaf_quant/af_quant/map.collated.rad", + "simpleaf/Sample_Y/simpleaf_quant/af_quant/permit_freq.bin", + "simpleaf/Sample_Y/simpleaf_quant/af_quant/permit_map.bin", + "simpleaf/Sample_Y/simpleaf_quant/af_quant/quant.json", + "simpleaf/Sample_Y/simpleaf_quant/af_quant/unmapped_bc_count_collated.bin", + "simpleaf/mtx_conversions", + "simpleaf/mtx_conversions/Sample_X", + "simpleaf/mtx_conversions/Sample_X/Sample_X_raw_matrix.h5ad", + "simpleaf/mtx_conversions/Sample_X/Sample_X_raw_matrix.sce.rds", + "simpleaf/mtx_conversions/Sample_X/Sample_X_raw_matrix.seurat.rds", + "simpleaf/mtx_conversions/Sample_Y", + "simpleaf/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.h5ad", + "simpleaf/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.sce.rds", + "simpleaf/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.seurat.rds", + "simpleaf/mtx_conversions/combined_raw_matrix.h5ad", + "simpleaf/mtx_conversions/combined_raw_matrix.sce.rds", + "simpleaf/mtx_conversions/combined_raw_matrix.seurat.rds" + ], + [ + "fastqc-status-check-heatmap.txt:md5,d122badcaa647409c35a809e8a127f99", + "fastqc_adapter_content_plot.txt:md5,25f2bf3896afee60c3af1c2d406adb2a", + "fastqc_per_base_n_content_plot.txt:md5,87fa27ea81dfddbd03d17e9d62073464", + "fastqc_per_base_sequence_quality_plot.txt:md5,10286297045c79d47254b472d64fe1b4", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,7e19e0d150b99698a97f1b06e164c81a", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,c9b7817422c054b575a45d4065876809", + "fastqc_per_sequence_quality_scores_plot.txt:md5,72ceb51a99080fd0fc5c9fe368f7b1fb", + "fastqc_sequence_counts_plot.txt:md5,a3c8ef25c1126727391c2973a40ca7f7", + "fastqc_sequence_duplication_levels_plot.txt:md5,10e456e57df8bcd738fe6a35d3a6c7cf", + "multiqc_citations.txt:md5,4c806e63a283ec1b7e78cdae3a923d4f", + "multiqc_fastqc.txt:md5,12027880857508ce5cedc3904a351730", + "multiqc_general_stats.txt:md5,dac8af62b04fd0880801f5d5c503c472", + "Sample_X_raw_matrix.h5ad:md5,d9c56aa71ade55f2b218db21efbce57f", + "Sample_X_raw_matrix.sce.rds:md5,6e9e0d6067fdca27645b66df47c6cdc1", + "Sample_X_raw_matrix.seurat.rds:md5,e1003985cc53b3538436a4726e3843a3", + "Sample_Y_raw_matrix.h5ad:md5,7a9899fed9301f3f6f4e6d7b1ada226d", + "Sample_Y_raw_matrix.sce.rds:md5,010c137155f5b8feed6ea4b853dc12c3", + "Sample_Y_raw_matrix.seurat.rds:md5,bae61b4d15df485464f6448a3b91f28c", + "combined_raw_matrix.h5ad:md5,cde7019772ba3efc3ac46aa5c9ff476d", + "combined_raw_matrix.sce.rds:md5,39d99e4d6c33f2c7e2063f32d0d2e18e", + "combined_raw_matrix.seurat.rds:md5,ec9e24cd5b38a9c64ba925fdc45b0dea" + ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "24.10.1" }, - "timestamp": "2025-03-05T16:34:48.992772278" + "timestamp": "2025-07-30T12:42:01.996598561" } } \ No newline at end of file From 80eff2fb61e79e0a824e3a4e0cd3c34bf7599857 Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Wed, 30 Jul 2025 13:45:52 +0200 Subject: [PATCH 55/82] correct nf-test profile --- nf-test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nf-test.config b/nf-test.config index fad5b9d3..647018a7 100644 --- a/nf-test.config +++ b/nf-test.config @@ -12,7 +12,7 @@ config { ignore 'modules/nf-core/**/tests/*', 'subworkflows/nf-core/**/tests/*' // run all test with defined profile(s) from the main nextflow.config - profile "docker" + 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' From 02d80ed11c63220a907636bcd2633c95c16c14c0 Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Wed, 30 Jul 2025 13:46:19 +0200 Subject: [PATCH 56/82] remove template nf-test --- tests/default.nf.test | 35 ----------------------------------- 1 file changed, 35 deletions(-) delete mode 100644 tests/default.nf.test diff --git a/tests/default.nf.test b/tests/default.nf.test deleted file mode 100644 index d320d3a0..00000000 --- a/tests/default.nf.test +++ /dev/null @@ -1,35 +0,0 @@ -nextflow_pipeline { - - name "Test pipeline" - script "../main.nf" - tag "pipeline" - - test("-profile test") { - - when { - params { - 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}']) - // stable_path: All files in ${params.outdir}/ with stable content - def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') - 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 test pipelines on multiple Nextflow versions - removeNextflowVersion("$outputDir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), - // All stable path name, with a relative path - stable_name, - // All files with stable contents - stable_path - ).match() } - ) - } - } -} From 7a32d0b5be4bce5a5a871e609a7e813d5385f1f4 Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Wed, 30 Jul 2025 17:49:01 +0200 Subject: [PATCH 57/82] update cellranger nf-test as template --- tests/.nftignore | 3 + tests/main_pipeline_cellranger.nf.test | 72 +--- tests/main_pipeline_cellranger.nf.test.snap | 411 ++++++++++++++++++-- 3 files changed, 408 insertions(+), 78 deletions(-) diff --git a/tests/.nftignore b/tests/.nftignore index 4eacbfea..b3984875 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -11,3 +11,6 @@ fastqc/*_fastqc.{html,zip} pipeline_info/*.{html,json,txt,yml} **/simpleaf_quant/** **/*.html +**/outs/*.{json,txt,yml,csv,tab,bam,bai,h5,fai,cloupe} +**/analysis/** +**/genomeParameters.txt \ No newline at end of file diff --git a/tests/main_pipeline_cellranger.nf.test b/tests/main_pipeline_cellranger.nf.test index 2e0186ed..e130bc1e 100644 --- a/tests/main_pipeline_cellranger.nf.test +++ b/tests/main_pipeline_cellranger.nf.test @@ -14,63 +14,23 @@ nextflow_pipeline { } 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}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( - - // - // General assertions - // - - // Did it finish successfully? - {assert workflow.success}, - - // How many tasks were executed? - {assert workflow.trace.tasks().size() == 20}, - - // How many results were produced? - {assert path("${outputDir}/results_cellranger").list().size() == 4}, - {assert path("${outputDir}/results_cellranger/cellranger").list().size() == 4}, - {assert path("${outputDir}/results_cellranger/cellranger/mtx_conversions").list().size() == 8}, - {assert path("${outputDir}/results_cellranger/cellranger/count").list().size() == 2}, - {assert path("${outputDir}/results_cellranger/fastqc").list().size() == 12}, - {assert path("${outputDir}/results_cellranger/multiqc").list().size() == 3}, - - // - // Check if files were produced - // - {assert new File( "${outputDir}/results_cellranger/cellranger/mtx_conversions/Sample_X/Sample_X_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellranger/cellranger/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellranger/cellranger/mtx_conversions/Sample_X/Sample_X_filtered_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellranger/cellranger/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.h5ad" ).exists()}, - - // - // Check if files are the same - // - {assert snapshot( - path( "${outputDir}/results_cellranger/cellranger/count/Sample_X/outs/filtered_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellranger/cellranger/count/Sample_X/outs/filtered_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellranger/cellranger/count/Sample_X/outs/filtered_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellranger/cellranger/count/Sample_Y/outs/filtered_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellranger/cellranger/count/Sample_Y/outs/filtered_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellranger/cellranger/count/Sample_Y/outs/filtered_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellranger/cellranger/count/Sample_X/outs/raw_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellranger/cellranger/count/Sample_X/outs/raw_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellranger/cellranger/count/Sample_X/outs/raw_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellranger/cellranger/count/Sample_Y/outs/raw_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellranger/cellranger/count/Sample_Y/outs/raw_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellranger/cellranger/count/Sample_Y/outs/raw_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellranger/cellranger/mtx_conversions/Sample_X/Sample_X_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_cellranger/cellranger/mtx_conversions/Sample_X/Sample_X_raw_matrix.sce.rds" ), - path( "${outputDir}/results_cellranger/cellranger/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_cellranger/cellranger/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.sce.rds" ), - path( "${outputDir}/results_cellranger/cellranger/mtx_conversions/Sample_X/Sample_X_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_cellranger/cellranger/mtx_conversions/Sample_X/Sample_X_filtered_matrix.sce.rds" ), - path( "${outputDir}/results_cellranger/cellranger/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_cellranger/cellranger/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.sce.rds" ) - ).match()} - - ) // end of 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 test pipelines on multiple Nextflow versions + removeNextflowVersion("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) } } diff --git a/tests/main_pipeline_cellranger.nf.test.snap b/tests/main_pipeline_cellranger.nf.test.snap index 3eb8773d..b5ef998f 100644 --- a/tests/main_pipeline_cellranger.nf.test.snap +++ b/tests/main_pipeline_cellranger.nf.test.snap @@ -1,31 +1,398 @@ { "test-dataset_cellranger_aligner": { "content": [ - "barcodes.tsv.gz:md5,fe6e51564b4405b37ca8604a844b1f2e", - "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", - "matrix.mtx.gz:md5,76991485c25e90a3553993d6a55df6bd", - "barcodes.tsv.gz:md5,77afe9a76631fc7b44236d3962a55aa5", - "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", - "matrix.mtx.gz:md5,5fc86fb6808aa997ee791b5dae2214de", - "barcodes.tsv.gz:md5,85da6b6e0c78dfe81af8c07c2017ab5e", - "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", - "matrix.mtx.gz:md5,195ae8a9089e16ad19d8c9d05277f99f", - "barcodes.tsv.gz:md5,081f72b5252ccaf5ffd535ffbd235c4c", - "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", - "matrix.mtx.gz:md5,563a2e93bc9b7c6825e543f71da785d2", - "Sample_X_raw_matrix.seurat.rds:md5,155faccf5164a5c56819b267dee0ebb1", - "Sample_X_raw_matrix.sce.rds:md5,4bfef42037307e73f0135abb2373a21e", - "Sample_Y_raw_matrix.seurat.rds:md5,3f4a3e6529b10c646fd08173d5baa339", - "Sample_Y_raw_matrix.sce.rds:md5,061ab8ba3ed28e6312c0367a2a9dfeb3", - "Sample_X_filtered_matrix.seurat.rds:md5,847448239100d08e3ca44017f93ca05d", - "Sample_X_filtered_matrix.sce.rds:md5,797244c2cd63f2b814f2a0cd6c3f080e", - "Sample_Y_filtered_matrix.seurat.rds:md5,50e765e4559c94edd23b123f9232075f", - "Sample_Y_filtered_matrix.sce.rds:md5,dcf9ce35fba58c2b04ca72703b483804" + 20, + { + "CELLRANGER_COUNT": { + "cellranger": "9.0.1 " + }, + "CELLRANGER_MKGTF": { + "cellranger": "9.0.1" + }, + "CELLRANGER_MKREF": { + "cellranger": "9.0.1" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "MTX_TO_H5AD": { + "python": "3.12.5", + "scanpy": "1.10.2", + "pandas": "2.2.2", + "anndata": "0.10.8" + }, + "Workflow": { + "nf-core/scrnaseq": "v4.1.0dev" + } + }, + [ + "", + "cellranger", + "cellranger/count", + "cellranger/count/Sample_X", + "cellranger/count/Sample_X/outs", + "cellranger/count/Sample_X/outs/analysis", + "cellranger/count/Sample_X/outs/analysis/clustering", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_graphclust", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_graphclust/clusters.csv", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_10_clusters", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_10_clusters/clusters.csv", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_2_clusters", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_2_clusters/clusters.csv", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_3_clusters", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_3_clusters/clusters.csv", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_4_clusters", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_4_clusters/clusters.csv", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_5_clusters", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_5_clusters/clusters.csv", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_6_clusters", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_6_clusters/clusters.csv", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_7_clusters", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_7_clusters/clusters.csv", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_8_clusters", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_8_clusters/clusters.csv", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_9_clusters", + "cellranger/count/Sample_X/outs/analysis/clustering/gene_expression_kmeans_9_clusters/clusters.csv", + "cellranger/count/Sample_X/outs/analysis/diffexp", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_graphclust", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_graphclust/differential_expression.csv", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_10_clusters", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_10_clusters/differential_expression.csv", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_2_clusters", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_2_clusters/differential_expression.csv", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_3_clusters", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_3_clusters/differential_expression.csv", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_4_clusters", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_4_clusters/differential_expression.csv", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_5_clusters", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_5_clusters/differential_expression.csv", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_6_clusters", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_6_clusters/differential_expression.csv", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_7_clusters", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_7_clusters/differential_expression.csv", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_8_clusters", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_8_clusters/differential_expression.csv", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_9_clusters", + "cellranger/count/Sample_X/outs/analysis/diffexp/gene_expression_kmeans_9_clusters/differential_expression.csv", + "cellranger/count/Sample_X/outs/analysis/pca", + "cellranger/count/Sample_X/outs/analysis/pca/gene_expression_10_components", + "cellranger/count/Sample_X/outs/analysis/pca/gene_expression_10_components/components.csv", + "cellranger/count/Sample_X/outs/analysis/pca/gene_expression_10_components/dispersion.csv", + "cellranger/count/Sample_X/outs/analysis/pca/gene_expression_10_components/features_selected.csv", + "cellranger/count/Sample_X/outs/analysis/pca/gene_expression_10_components/projection.csv", + "cellranger/count/Sample_X/outs/analysis/pca/gene_expression_10_components/variance.csv", + "cellranger/count/Sample_X/outs/analysis/tsne", + "cellranger/count/Sample_X/outs/analysis/tsne/gene_expression_2_components", + "cellranger/count/Sample_X/outs/analysis/tsne/gene_expression_2_components/projection.csv", + "cellranger/count/Sample_X/outs/analysis/umap", + "cellranger/count/Sample_X/outs/analysis/umap/gene_expression_2_components", + "cellranger/count/Sample_X/outs/analysis/umap/gene_expression_2_components/projection.csv", + "cellranger/count/Sample_X/outs/cloupe.cloupe", + "cellranger/count/Sample_X/outs/filtered_feature_bc_matrix", + "cellranger/count/Sample_X/outs/filtered_feature_bc_matrix.h5", + "cellranger/count/Sample_X/outs/filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellranger/count/Sample_X/outs/filtered_feature_bc_matrix/features.tsv.gz", + "cellranger/count/Sample_X/outs/filtered_feature_bc_matrix/matrix.mtx.gz", + "cellranger/count/Sample_X/outs/metrics_summary.csv", + "cellranger/count/Sample_X/outs/molecule_info.h5", + "cellranger/count/Sample_X/outs/possorted_genome_bam.bam", + "cellranger/count/Sample_X/outs/possorted_genome_bam.bam.bai", + "cellranger/count/Sample_X/outs/raw_feature_bc_matrix", + "cellranger/count/Sample_X/outs/raw_feature_bc_matrix.h5", + "cellranger/count/Sample_X/outs/raw_feature_bc_matrix/barcodes.tsv.gz", + "cellranger/count/Sample_X/outs/raw_feature_bc_matrix/features.tsv.gz", + "cellranger/count/Sample_X/outs/raw_feature_bc_matrix/matrix.mtx.gz", + "cellranger/count/Sample_X/outs/web_summary.html", + "cellranger/count/Sample_Y", + "cellranger/count/Sample_Y/outs", + "cellranger/count/Sample_Y/outs/analysis", + "cellranger/count/Sample_Y/outs/analysis/clustering", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_graphclust", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_graphclust/clusters.csv", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_10_clusters", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_10_clusters/clusters.csv", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_2_clusters", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_2_clusters/clusters.csv", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_3_clusters", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_3_clusters/clusters.csv", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_4_clusters", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_4_clusters/clusters.csv", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_5_clusters", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_5_clusters/clusters.csv", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_6_clusters", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_6_clusters/clusters.csv", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_7_clusters", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_7_clusters/clusters.csv", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_8_clusters", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_8_clusters/clusters.csv", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_9_clusters", + "cellranger/count/Sample_Y/outs/analysis/clustering/gene_expression_kmeans_9_clusters/clusters.csv", + "cellranger/count/Sample_Y/outs/analysis/diffexp", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_graphclust", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_graphclust/differential_expression.csv", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_10_clusters", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_10_clusters/differential_expression.csv", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_2_clusters", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_2_clusters/differential_expression.csv", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_3_clusters", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_3_clusters/differential_expression.csv", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_4_clusters", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_4_clusters/differential_expression.csv", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_5_clusters", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_5_clusters/differential_expression.csv", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_6_clusters", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_6_clusters/differential_expression.csv", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_7_clusters", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_7_clusters/differential_expression.csv", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_8_clusters", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_8_clusters/differential_expression.csv", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_9_clusters", + "cellranger/count/Sample_Y/outs/analysis/diffexp/gene_expression_kmeans_9_clusters/differential_expression.csv", + "cellranger/count/Sample_Y/outs/analysis/pca", + "cellranger/count/Sample_Y/outs/analysis/pca/gene_expression_10_components", + "cellranger/count/Sample_Y/outs/analysis/pca/gene_expression_10_components/components.csv", + "cellranger/count/Sample_Y/outs/analysis/pca/gene_expression_10_components/dispersion.csv", + "cellranger/count/Sample_Y/outs/analysis/pca/gene_expression_10_components/features_selected.csv", + "cellranger/count/Sample_Y/outs/analysis/pca/gene_expression_10_components/projection.csv", + "cellranger/count/Sample_Y/outs/analysis/pca/gene_expression_10_components/variance.csv", + "cellranger/count/Sample_Y/outs/analysis/tsne", + "cellranger/count/Sample_Y/outs/analysis/tsne/gene_expression_2_components", + "cellranger/count/Sample_Y/outs/analysis/tsne/gene_expression_2_components/projection.csv", + "cellranger/count/Sample_Y/outs/analysis/umap", + "cellranger/count/Sample_Y/outs/analysis/umap/gene_expression_2_components", + "cellranger/count/Sample_Y/outs/analysis/umap/gene_expression_2_components/projection.csv", + "cellranger/count/Sample_Y/outs/cloupe.cloupe", + "cellranger/count/Sample_Y/outs/filtered_feature_bc_matrix", + "cellranger/count/Sample_Y/outs/filtered_feature_bc_matrix.h5", + "cellranger/count/Sample_Y/outs/filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellranger/count/Sample_Y/outs/filtered_feature_bc_matrix/features.tsv.gz", + "cellranger/count/Sample_Y/outs/filtered_feature_bc_matrix/matrix.mtx.gz", + "cellranger/count/Sample_Y/outs/metrics_summary.csv", + "cellranger/count/Sample_Y/outs/molecule_info.h5", + "cellranger/count/Sample_Y/outs/possorted_genome_bam.bam", + "cellranger/count/Sample_Y/outs/possorted_genome_bam.bam.bai", + "cellranger/count/Sample_Y/outs/raw_feature_bc_matrix", + "cellranger/count/Sample_Y/outs/raw_feature_bc_matrix.h5", + "cellranger/count/Sample_Y/outs/raw_feature_bc_matrix/barcodes.tsv.gz", + "cellranger/count/Sample_Y/outs/raw_feature_bc_matrix/features.tsv.gz", + "cellranger/count/Sample_Y/outs/raw_feature_bc_matrix/matrix.mtx.gz", + "cellranger/count/Sample_Y/outs/web_summary.html", + "cellranger/mkgtf", + "cellranger/mkgtf/GRCm38.p6.genome.chr19_genes.filtered.gtf", + "cellranger/mkref", + "cellranger/mkref/cellranger_reference", + "cellranger/mkref/cellranger_reference/fasta", + "cellranger/mkref/cellranger_reference/fasta/genome.fa", + "cellranger/mkref/cellranger_reference/fasta/genome.fa.fai", + "cellranger/mkref/cellranger_reference/genes", + "cellranger/mkref/cellranger_reference/genes/genes.gtf.gz", + "cellranger/mkref/cellranger_reference/reference.json", + "cellranger/mkref/cellranger_reference/star", + "cellranger/mkref/cellranger_reference/star/Genome", + "cellranger/mkref/cellranger_reference/star/SA", + "cellranger/mkref/cellranger_reference/star/SAindex", + "cellranger/mkref/cellranger_reference/star/chrLength.txt", + "cellranger/mkref/cellranger_reference/star/chrName.txt", + "cellranger/mkref/cellranger_reference/star/chrNameLength.txt", + "cellranger/mkref/cellranger_reference/star/chrStart.txt", + "cellranger/mkref/cellranger_reference/star/exonGeTrInfo.tab", + "cellranger/mkref/cellranger_reference/star/exonInfo.tab", + "cellranger/mkref/cellranger_reference/star/geneInfo.tab", + "cellranger/mkref/cellranger_reference/star/genomeParameters.txt", + "cellranger/mkref/cellranger_reference/star/sjdbInfo.txt", + "cellranger/mkref/cellranger_reference/star/sjdbList.fromGTF.out.tab", + "cellranger/mkref/cellranger_reference/star/sjdbList.out.tab", + "cellranger/mkref/cellranger_reference/star/transcriptInfo.tab", + "cellranger/mtx_conversions", + "cellranger/mtx_conversions/Sample_X", + "cellranger/mtx_conversions/Sample_X/Sample_X_filtered_matrix.h5ad", + "cellranger/mtx_conversions/Sample_X/Sample_X_filtered_matrix.sce.rds", + "cellranger/mtx_conversions/Sample_X/Sample_X_filtered_matrix.seurat.rds", + "cellranger/mtx_conversions/Sample_X/Sample_X_raw_matrix.h5ad", + "cellranger/mtx_conversions/Sample_X/Sample_X_raw_matrix.sce.rds", + "cellranger/mtx_conversions/Sample_X/Sample_X_raw_matrix.seurat.rds", + "cellranger/mtx_conversions/Sample_Y", + "cellranger/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.h5ad", + "cellranger/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.sce.rds", + "cellranger/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.seurat.rds", + "cellranger/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.h5ad", + "cellranger/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.sce.rds", + "cellranger/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.seurat.rds", + "cellranger/mtx_conversions/combined_filtered_matrix.h5ad", + "cellranger/mtx_conversions/combined_filtered_matrix.sce.rds", + "cellranger/mtx_conversions/combined_filtered_matrix.seurat.rds", + "cellranger/mtx_conversions/combined_raw_matrix.h5ad", + "cellranger/mtx_conversions/combined_raw_matrix.sce.rds", + "cellranger/mtx_conversions/combined_raw_matrix.seurat.rds", + "fastqc", + "fastqc/Sample_X_1_fastqc.html", + "fastqc/Sample_X_1_fastqc.zip", + "fastqc/Sample_X_2_fastqc.html", + "fastqc/Sample_X_2_fastqc.zip", + "fastqc/Sample_Y_1_fastqc.html", + "fastqc/Sample_Y_1_fastqc.zip", + "fastqc/Sample_Y_2_fastqc.html", + "fastqc/Sample_Y_2_fastqc.zip", + "fastqc/Sample_Y_3_fastqc.html", + "fastqc/Sample_Y_3_fastqc.zip", + "fastqc/Sample_Y_4_fastqc.html", + "fastqc/Sample_Y_4_fastqc.zip", + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/BETA-multiqc.parquet", + "multiqc/multiqc_data/cellranger-count-stats-table.txt", + "multiqc/multiqc_data/cellranger-count-warnings-table.txt", + "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", + "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_sequence_quality_plot.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/multiqc_data/fastqc_per_sequence_quality_scores_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", + "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/mqc_cellranger_count_bc_knee.txt", + "multiqc/multiqc_data/mqc_cellranger_count_genesXcell.txt", + "multiqc/multiqc_data/mqc_cellranger_count_saturation.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc_cellranger_count.txt", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_fastqc.txt", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/cellranger-count-stats-table.pdf", + "multiqc/multiqc_plots/pdf/cellranger-count-warnings-table.pdf", + "multiqc/multiqc_plots/pdf/fastqc-status-check-heatmap.pdf", + "multiqc/multiqc_plots/pdf/fastqc_adapter_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_n_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf", + "multiqc/multiqc_plots/pdf/mqc_cellranger_count_bc_knee.pdf", + "multiqc/multiqc_plots/pdf/mqc_cellranger_count_genesXcell.pdf", + "multiqc/multiqc_plots/pdf/mqc_cellranger_count_saturation.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/cellranger-count-stats-table.png", + "multiqc/multiqc_plots/png/cellranger-count-warnings-table.png", + "multiqc/multiqc_plots/png/fastqc-status-check-heatmap.png", + "multiqc/multiqc_plots/png/fastqc_adapter_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_n_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_sequence_quality_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_quality_scores_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-cnt.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-pct.png", + "multiqc/multiqc_plots/png/fastqc_sequence_duplication_levels_plot.png", + "multiqc/multiqc_plots/png/fastqc_top_overrepresented_sequences_table.png", + "multiqc/multiqc_plots/png/mqc_cellranger_count_bc_knee.png", + "multiqc/multiqc_plots/png/mqc_cellranger_count_genesXcell.png", + "multiqc/multiqc_plots/png/mqc_cellranger_count_saturation.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/cellranger-count-stats-table.svg", + "multiqc/multiqc_plots/svg/cellranger-count-warnings-table.svg", + "multiqc/multiqc_plots/svg/fastqc-status-check-heatmap.svg", + "multiqc/multiqc_plots/svg/fastqc_adapter_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_n_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_sequence_quality_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_quality_scores_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-cnt.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-pct.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_duplication_levels_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_top_overrepresented_sequences_table.svg", + "multiqc/multiqc_plots/svg/mqc_cellranger_count_bc_knee.svg", + "multiqc/multiqc_plots/svg/mqc_cellranger_count_genesXcell.svg", + "multiqc/multiqc_plots/svg/mqc_cellranger_count_saturation.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml" + ], + [ + "barcodes.tsv.gz:md5,fe6e51564b4405b37ca8604a844b1f2e", + "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", + "matrix.mtx.gz:md5,76991485c25e90a3553993d6a55df6bd", + "barcodes.tsv.gz:md5,85da6b6e0c78dfe81af8c07c2017ab5e", + "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", + "matrix.mtx.gz:md5,195ae8a9089e16ad19d8c9d05277f99f", + "barcodes.tsv.gz:md5,77afe9a76631fc7b44236d3962a55aa5", + "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", + "matrix.mtx.gz:md5,5fc86fb6808aa997ee791b5dae2214de", + "barcodes.tsv.gz:md5,081f72b5252ccaf5ffd535ffbd235c4c", + "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", + "matrix.mtx.gz:md5,563a2e93bc9b7c6825e543f71da785d2", + "GRCm38.p6.genome.chr19_genes.filtered.gtf:md5,956caa7c851df640ded6c3f5f1a7cd41", + "genome.fa:md5,ef1ae316990b7c77fd0baa0a89b75a6d", + "genome.fa.fai:md5,729bb811dc9ababd5ee35029b8140f36", + "genes.gtf.gz:md5,956caa7c851df640ded6c3f5f1a7cd41", + "reference.json:md5,881f0bc89526c4c5b1265a9ea077bc49", + "Genome:md5,638a41718215663f07fec2bf13fc9b0f", + "SA:md5,965121db041500098de4325ad719f5df", + "SAindex:md5,1d4c33e718f498c61083aa47aa9ace2c", + "chrLength.txt:md5,42940dfa55c0d5616209409dfa66c7af", + "chrName.txt:md5,255cdc5fefdc3ff84cfe3f3270ab8fed", + "chrNameLength.txt:md5,be19927063141d55372bfad0396387e8", + "chrStart.txt:md5,fba9f49cedf08a4136244d4b9b776c01", + "exonGeTrInfo.tab:md5,2085f5652cfa698498efd221e00cbbb3", + "exonInfo.tab:md5,2e4ebf0951ec59f54b402bf1541e68d3", + "geneInfo.tab:md5,1b0b2c64da9c50809a3b34250b23a8de", + "sjdbInfo.txt:md5,c83ad621dc14fe34c336d2164587df1a", + "sjdbList.fromGTF.out.tab:md5,dffb9114a4b7dad0fa59bdf6c42b67e5", + "sjdbList.out.tab:md5,f6228b2eb4d72dd461543af46d67c602", + "transcriptInfo.tab:md5,7ac30e5301e5f3b98e9cfc51bff79b69", + "Sample_X_filtered_matrix.h5ad:md5,6d96854e22cbcf8238b61e25d47d3bde", + "Sample_X_filtered_matrix.sce.rds:md5,797244c2cd63f2b814f2a0cd6c3f080e", + "Sample_X_filtered_matrix.seurat.rds:md5,847448239100d08e3ca44017f93ca05d", + "Sample_X_raw_matrix.h5ad:md5,90727c59c741540a67eb286a96c07f05", + "Sample_X_raw_matrix.sce.rds:md5,4bfef42037307e73f0135abb2373a21e", + "Sample_X_raw_matrix.seurat.rds:md5,155faccf5164a5c56819b267dee0ebb1", + "Sample_Y_filtered_matrix.h5ad:md5,b3bba7418b125baedc4e34a3f7b55597", + "Sample_Y_filtered_matrix.sce.rds:md5,dcf9ce35fba58c2b04ca72703b483804", + "Sample_Y_filtered_matrix.seurat.rds:md5,50e765e4559c94edd23b123f9232075f", + "Sample_Y_raw_matrix.h5ad:md5,d5c3a30bcd4d8011eb5aa39ad0f1c286", + "Sample_Y_raw_matrix.sce.rds:md5,061ab8ba3ed28e6312c0367a2a9dfeb3", + "Sample_Y_raw_matrix.seurat.rds:md5,3f4a3e6529b10c646fd08173d5baa339", + "combined_filtered_matrix.h5ad:md5,a5ed8bbcd99fec98559e39f1fca76746", + "combined_filtered_matrix.sce.rds:md5,3b765867639f93039a16127ae8939597", + "combined_filtered_matrix.seurat.rds:md5,165e968813b29d1118c30f779da253c0", + "combined_raw_matrix.h5ad:md5,87b515e8a45f028520f5e01f9137bb76", + "combined_raw_matrix.sce.rds:md5,2e08aaef7d7c972ea4d4cb1b5807bbdd", + "combined_raw_matrix.seurat.rds:md5,4dce8dbf48ee2aab4e7ed40015bc9ce8", + "cellranger-count-stats-table.txt:md5,dcfc25c2bb422c5f279af728c8b62f58", + "cellranger-count-warnings-table.txt:md5,f257d0a84efc395072a517db643b7935", + "fastqc-status-check-heatmap.txt:md5,d122badcaa647409c35a809e8a127f99", + "fastqc_adapter_content_plot.txt:md5,25f2bf3896afee60c3af1c2d406adb2a", + "fastqc_per_base_n_content_plot.txt:md5,87fa27ea81dfddbd03d17e9d62073464", + "fastqc_per_base_sequence_quality_plot.txt:md5,10286297045c79d47254b472d64fe1b4", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,7e19e0d150b99698a97f1b06e164c81a", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,c9b7817422c054b575a45d4065876809", + "fastqc_per_sequence_quality_scores_plot.txt:md5,72ceb51a99080fd0fc5c9fe368f7b1fb", + "fastqc_sequence_counts_plot.txt:md5,a3c8ef25c1126727391c2973a40ca7f7", + "fastqc_sequence_duplication_levels_plot.txt:md5,10e456e57df8bcd738fe6a35d3a6c7cf", + "mqc_cellranger_count_bc_knee.txt:md5,a4482a60b1d048a2d830505c766c8395", + "mqc_cellranger_count_genesXcell.txt:md5,a691c27c313cb32203b42d678686243b", + "mqc_cellranger_count_saturation.txt:md5,4ce68b5a0b43a212ca07d9592c4174c5", + "multiqc_cellranger_count.txt:md5,da890b424a8a53f40acc12a2766e627f", + "multiqc_citations.txt:md5,db9f58c039af2923e06a61e46e82c015", + "multiqc_fastqc.txt:md5,12027880857508ce5cedc3904a351730", + "multiqc_general_stats.txt:md5,92a7a66e313e6ce2d13da53b501b5c0c" + ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.6" + "nextflow": "24.10.1" }, - "timestamp": "2025-05-07T08:50:32.11880613" + "timestamp": "2025-07-30T17:26:23.802756012" } } \ No newline at end of file From 794260639f42e780eeeb345c202505f11fd2af38 Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Thu, 31 Jul 2025 08:32:52 +0200 Subject: [PATCH 58/82] update cellrangerarc nf-test as new template --- tests/.nftignore | 4 +- tests/main_pipeline_cellrangerarc.nf.test | 77 +---- .../main_pipeline_cellrangerarc.nf.test.snap | 309 +++++++++++++++++- 3 files changed, 311 insertions(+), 79 deletions(-) diff --git a/tests/.nftignore b/tests/.nftignore index b3984875..e163663c 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -13,4 +13,6 @@ pipeline_info/*.{html,json,txt,yml} **/*.html **/outs/*.{json,txt,yml,csv,tab,bam,bai,h5,fai,cloupe} **/analysis/** -**/genomeParameters.txt \ No newline at end of file +**/genomeParameters.txt +**/atac_*.{gz,tbi,bed} +**/10k_PBMC_lib.csv \ No newline at end of file diff --git a/tests/main_pipeline_cellrangerarc.nf.test b/tests/main_pipeline_cellrangerarc.nf.test index 60a7a2f0..49b56947 100644 --- a/tests/main_pipeline_cellrangerarc.nf.test +++ b/tests/main_pipeline_cellrangerarc.nf.test @@ -19,68 +19,23 @@ nextflow_pipeline { } 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}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( - - // - // General assertions - // - - // Did it finish successfully? - {assert workflow.success}, - - // How many tasks were executed? - {assert workflow.trace.tasks().size() == 14}, - - // How many results were produced? - {assert path("${outputDir}/results_cellrangerarc").list().size() == 4}, - {assert path("${outputDir}/results_cellrangerarc/cellrangerarc").list().size() == 4}, - {assert path("${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions").list().size() == 7}, - {assert path("${outputDir}/results_cellrangerarc/cellrangerarc/count").list().size() == 3}, - {assert path("${outputDir}/results_cellrangerarc/fastqc").list().size() == 10}, - {assert path("${outputDir}/results_cellrangerarc/multiqc").list().size() == 3}, - - // - // Check if files were produced - // - {assert new File( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_filtered_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/combined_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/combined_filtered_matrix.h5ad" ).exists()}, - - // - // Check if files are the same - // - {assert snapshot( - // barcodes.tsv.gz files - path( "${outputDir}/results_cellrangerarc/cellrangerarc/count/10k_PBMC/outs/filtered_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangerarc/cellrangerarc/count/10k_PBMC/outs/raw_feature_bc_matrix/barcodes.tsv.gz" ), - - // features.tsv.gz files - path( "${outputDir}/results_cellrangerarc/cellrangerarc/count/10k_PBMC/outs/filtered_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangerarc/cellrangerarc/count/10k_PBMC/outs/raw_feature_bc_matrix/features.tsv.gz" ), - - // matrix.mtx.gz files - path( "${outputDir}/results_cellrangerarc/cellrangerarc/count/10k_PBMC/outs/filtered_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangerarc/cellrangerarc/count/10k_PBMC/outs/raw_feature_bc_matrix/matrix.mtx.gz" ), - - // metrics_summary.csv files - path( "${outputDir}/results_cellrangerarc/cellrangerarc/count/10k_PBMC/outs/summary.csv" ), - - // .rds files - path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_raw_matrix.sce.rds" ), - path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_filtered_matrix.sce.rds" ), - path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/combined_raw_matrix.sce.rds" ), - path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/combined_filtered_matrix.sce.rds" ), - path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/combined_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangerarc/cellrangerarc/mtx_conversions/combined_filtered_matrix.seurat.rds" ), - - ).match()} - - ) // end of 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 test pipelines on multiple Nextflow versions + removeNextflowVersion("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) } } diff --git a/tests/main_pipeline_cellrangerarc.nf.test.snap b/tests/main_pipeline_cellrangerarc.nf.test.snap index b74d0a81..8f902fc3 100644 --- a/tests/main_pipeline_cellrangerarc.nf.test.snap +++ b/tests/main_pipeline_cellrangerarc.nf.test.snap @@ -1,26 +1,301 @@ { "test-dataset_cellrangerarc_aligner": { "content": [ - "barcodes.tsv.gz:md5,b5499384bbd9ecbd448c90dd73d9e84c", - "barcodes.tsv.gz:md5,dc8ef24c54122529bdb2c7cd5969c805", - "features.tsv.gz:md5,456af0e5fa4a7bcb3968400f300d12e9", - "features.tsv.gz:md5,456af0e5fa4a7bcb3968400f300d12e9", - "matrix.mtx.gz:md5,83c4b3e84668282fbe55d02d84256b3f", - "matrix.mtx.gz:md5,4b3aa16b720d414f5df50c533052d360", - "summary.csv:md5,90da383cd94786c0a3810b903c8de8f6", - "10k_PBMC_raw_matrix.sce.rds:md5,196adfcb230f9ba9bb7d0aba36e7e261", - "10k_PBMC_filtered_matrix.sce.rds:md5,359160d80821c5dbf1ebc7a88dbe8400", - "10k_PBMC_raw_matrix.seurat.rds:md5,8ff4d68d88a6a7e3528147e06aeaa4dd", - "10k_PBMC_filtered_matrix.seurat.rds:md5,ca44f68f2ea255bfd556c71a6b91423e", - "combined_raw_matrix.sce.rds:md5,4846edfc332c65c129b554c27a357dc7", - "combined_filtered_matrix.sce.rds:md5,4c1dee683e3d0e602556a69b9b64b3a5", - "combined_raw_matrix.seurat.rds:md5,8900e93d58f613d56f02a4243769498a", - "combined_filtered_matrix.seurat.rds:md5,91f83560d80b7b1ab238161d73c64831" + 14, + { + "CELLRANGERARC_COUNT": { + "cellrangerarc": "2.0.2" + }, + "CELLRANGERARC_MKGTF": { + "cellrangerarc": "2.0.2" + }, + "CELLRANGERARC_MKREF": { + "cellrangerarc": "2.0.2" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "MTX_TO_H5AD": { + "python": "3.12.5", + "scanpy": "1.10.2", + "pandas": "2.2.2", + "anndata": "0.10.8" + }, + "Workflow": { + "nf-core/scrnaseq": "v4.1.0dev" + } + }, + [ + "", + "cellrangerarc", + "cellrangerarc/count", + "cellrangerarc/count/10k_PBMC", + "cellrangerarc/count/10k_PBMC/outs", + "cellrangerarc/count/10k_PBMC/outs/analysis", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/atac", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/atac/graphclust", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/atac/graphclust/clusters.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/atac/graphclust/differential_expression.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/atac/kmeans_2_clusters", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/atac/kmeans_2_clusters/clusters.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/atac/kmeans_2_clusters/differential_expression.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/atac/kmeans_3_clusters", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/atac/kmeans_3_clusters/clusters.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/atac/kmeans_3_clusters/differential_expression.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/atac/kmeans_4_clusters", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/atac/kmeans_4_clusters/clusters.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/atac/kmeans_4_clusters/differential_expression.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/gex", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/gex/graphclust", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/gex/graphclust/clusters.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/gex/graphclust/differential_expression.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/gex/kmeans_2_clusters", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/gex/kmeans_2_clusters/clusters.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/gex/kmeans_2_clusters/differential_expression.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/gex/kmeans_3_clusters", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/gex/kmeans_3_clusters/clusters.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/gex/kmeans_3_clusters/differential_expression.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/gex/kmeans_4_clusters", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/gex/kmeans_4_clusters/clusters.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/clustering/gex/kmeans_4_clusters/differential_expression.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/atac", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/atac/lsa_components.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/atac/lsa_dispersion.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/atac/lsa_features_selected.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/atac/lsa_projection.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/atac/lsa_variance.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/atac/tsne_projection.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/atac/umap_projection.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/gex", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/gex/pca_components.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/gex/pca_dispersion.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/gex/pca_features_selected.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/gex/pca_projection.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/gex/pca_variance.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/gex/tsne_projection.csv", + "cellrangerarc/count/10k_PBMC/outs/analysis/dimensionality_reduction/gex/umap_projection.csv", + "cellrangerarc/count/10k_PBMC/outs/atac_cut_sites.bigwig", + "cellrangerarc/count/10k_PBMC/outs/atac_fragments.tsv.gz", + "cellrangerarc/count/10k_PBMC/outs/atac_fragments.tsv.gz.tbi", + "cellrangerarc/count/10k_PBMC/outs/atac_peak_annotation.tsv", + "cellrangerarc/count/10k_PBMC/outs/atac_peaks.bed", + "cellrangerarc/count/10k_PBMC/outs/atac_possorted_bam.bam", + "cellrangerarc/count/10k_PBMC/outs/atac_possorted_bam.bam.bai", + "cellrangerarc/count/10k_PBMC/outs/filtered_feature_bc_matrix", + "cellrangerarc/count/10k_PBMC/outs/filtered_feature_bc_matrix.h5", + "cellrangerarc/count/10k_PBMC/outs/filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellrangerarc/count/10k_PBMC/outs/filtered_feature_bc_matrix/features.tsv.gz", + "cellrangerarc/count/10k_PBMC/outs/filtered_feature_bc_matrix/matrix.mtx.gz", + "cellrangerarc/count/10k_PBMC/outs/gex_molecule_info.h5", + "cellrangerarc/count/10k_PBMC/outs/gex_possorted_bam.bam", + "cellrangerarc/count/10k_PBMC/outs/gex_possorted_bam.bam.bai", + "cellrangerarc/count/10k_PBMC/outs/per_barcode_metrics.csv", + "cellrangerarc/count/10k_PBMC/outs/raw_feature_bc_matrix", + "cellrangerarc/count/10k_PBMC/outs/raw_feature_bc_matrix.h5", + "cellrangerarc/count/10k_PBMC/outs/raw_feature_bc_matrix/barcodes.tsv.gz", + "cellrangerarc/count/10k_PBMC/outs/raw_feature_bc_matrix/features.tsv.gz", + "cellrangerarc/count/10k_PBMC/outs/raw_feature_bc_matrix/matrix.mtx.gz", + "cellrangerarc/count/10k_PBMC/outs/summary.csv", + "cellrangerarc/count/10k_PBMC/outs/web_summary.html", + "cellrangerarc/count/10k_PBMC_lib.csv", + "cellrangerarc/count/versions.yml", + "cellrangerarc/mkgtf", + "cellrangerarc/mkgtf/genome_genes.filtered.gtf", + "cellrangerarc/mkref", + "cellrangerarc/mkref/cellrangerarc_reference", + "cellrangerarc/mkref/cellrangerarc_reference/fasta", + "cellrangerarc/mkref/cellrangerarc_reference/fasta/genome.fa", + "cellrangerarc/mkref/cellrangerarc_reference/fasta/genome.fa.amb", + "cellrangerarc/mkref/cellrangerarc_reference/fasta/genome.fa.ann", + "cellrangerarc/mkref/cellrangerarc_reference/fasta/genome.fa.bwt", + "cellrangerarc/mkref/cellrangerarc_reference/fasta/genome.fa.fai", + "cellrangerarc/mkref/cellrangerarc_reference/fasta/genome.fa.pac", + "cellrangerarc/mkref/cellrangerarc_reference/fasta/genome.fa.sa", + "cellrangerarc/mkref/cellrangerarc_reference/genes", + "cellrangerarc/mkref/cellrangerarc_reference/genes/genes.gtf.gz", + "cellrangerarc/mkref/cellrangerarc_reference/reference.json", + "cellrangerarc/mkref/cellrangerarc_reference/regions", + "cellrangerarc/mkref/cellrangerarc_reference/regions/transcripts.bed", + "cellrangerarc/mkref/cellrangerarc_reference/regions/tss.bed", + "cellrangerarc/mkref/cellrangerarc_reference/star", + "cellrangerarc/mkref/cellrangerarc_reference/star/Genome", + "cellrangerarc/mkref/cellrangerarc_reference/star/SA", + "cellrangerarc/mkref/cellrangerarc_reference/star/SAindex", + "cellrangerarc/mkref/cellrangerarc_reference/star/chrLength.txt", + "cellrangerarc/mkref/cellrangerarc_reference/star/chrName.txt", + "cellrangerarc/mkref/cellrangerarc_reference/star/chrNameLength.txt", + "cellrangerarc/mkref/cellrangerarc_reference/star/chrStart.txt", + "cellrangerarc/mkref/cellrangerarc_reference/star/exonGeTrInfo.tab", + "cellrangerarc/mkref/cellrangerarc_reference/star/exonInfo.tab", + "cellrangerarc/mkref/cellrangerarc_reference/star/geneInfo.tab", + "cellrangerarc/mkref/cellrangerarc_reference/star/genomeParameters.txt", + "cellrangerarc/mkref/cellrangerarc_reference/star/sjdbInfo.txt", + "cellrangerarc/mkref/cellrangerarc_reference/star/sjdbList.fromGTF.out.tab", + "cellrangerarc/mkref/cellrangerarc_reference/star/sjdbList.out.tab", + "cellrangerarc/mkref/cellrangerarc_reference/star/transcriptInfo.tab", + "cellrangerarc/mkref/config", + "cellrangerarc/mkref/versions.yml", + "cellrangerarc/mtx_conversions", + "cellrangerarc/mtx_conversions/10k_PBMC", + "cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_filtered_matrix.h5ad", + "cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_filtered_matrix.sce.rds", + "cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_filtered_matrix.seurat.rds", + "cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_raw_matrix.h5ad", + "cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_raw_matrix.sce.rds", + "cellrangerarc/mtx_conversions/10k_PBMC/10k_PBMC_raw_matrix.seurat.rds", + "cellrangerarc/mtx_conversions/combined_filtered_matrix.h5ad", + "cellrangerarc/mtx_conversions/combined_filtered_matrix.sce.rds", + "cellrangerarc/mtx_conversions/combined_filtered_matrix.seurat.rds", + "cellrangerarc/mtx_conversions/combined_raw_matrix.h5ad", + "cellrangerarc/mtx_conversions/combined_raw_matrix.sce.rds", + "cellrangerarc/mtx_conversions/combined_raw_matrix.seurat.rds", + "fastqc", + "fastqc/10k_PBMC_1_fastqc.html", + "fastqc/10k_PBMC_1_fastqc.zip", + "fastqc/10k_PBMC_2_fastqc.html", + "fastqc/10k_PBMC_2_fastqc.zip", + "fastqc/10k_PBMC_3_fastqc.html", + "fastqc/10k_PBMC_3_fastqc.zip", + "fastqc/10k_PBMC_4_fastqc.html", + "fastqc/10k_PBMC_4_fastqc.zip", + "fastqc/10k_PBMC_5_fastqc.html", + "fastqc/10k_PBMC_5_fastqc.zip", + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/BETA-multiqc.parquet", + "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", + "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", + "multiqc/multiqc_data/fastqc_overrepresented_sequences_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_sequence_quality_plot.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/multiqc_data/fastqc_per_sequence_quality_scores_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", + "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_fastqc.txt", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/fastqc-status-check-heatmap.pdf", + "multiqc/multiqc_plots/pdf/fastqc_adapter_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_overrepresented_sequences_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_n_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/fastqc-status-check-heatmap.png", + "multiqc/multiqc_plots/png/fastqc_adapter_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_overrepresented_sequences_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_n_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_sequence_quality_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_quality_scores_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-cnt.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-pct.png", + "multiqc/multiqc_plots/png/fastqc_sequence_duplication_levels_plot.png", + "multiqc/multiqc_plots/png/fastqc_top_overrepresented_sequences_table.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/fastqc-status-check-heatmap.svg", + "multiqc/multiqc_plots/svg/fastqc_adapter_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_overrepresented_sequences_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_n_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_sequence_quality_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_quality_scores_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-cnt.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-pct.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_duplication_levels_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_top_overrepresented_sequences_table.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml" + ], + [ + "atac_cut_sites.bigwig:md5,7114cf85657c09f92d5c3dbd32432759", + "atac_peak_annotation.tsv:md5,bd800e4d0321a50f340a801ae18dafe8", + "barcodes.tsv.gz:md5,b5499384bbd9ecbd448c90dd73d9e84c", + "features.tsv.gz:md5,456af0e5fa4a7bcb3968400f300d12e9", + "matrix.mtx.gz:md5,83c4b3e84668282fbe55d02d84256b3f", + "barcodes.tsv.gz:md5,dc8ef24c54122529bdb2c7cd5969c805", + "features.tsv.gz:md5,456af0e5fa4a7bcb3968400f300d12e9", + "matrix.mtx.gz:md5,4b3aa16b720d414f5df50c533052d360", + "versions.yml:md5,d345d055b9def0e0d4dd6cf0c1c4058c", + "genome_genes.filtered.gtf:md5,4328009f62d38b9220dd941c1a66e480", + "genome.fa:md5,69bd44ef67566a76d6cbb8aa4a25ae35", + "genome.fa.amb:md5,fe9a4b4f263654a130bb314e282b00f1", + "genome.fa.ann:md5,f8c1d6a2b91d1973a2f13e7221fc7e7a", + "genome.fa.bwt:md5,06864ee01cac40ced661a350bee859cf", + "genome.fa.fai:md5,74184d265bc96cb92ddfb71c3ce85c09", + "genome.fa.pac:md5,cf76a4dbc5b8ae64fc890d6a95067b4f", + "genome.fa.sa:md5,92f0b3e443220a57c2bd09f737e7dbc4", + "genes.gtf.gz:md5,4328009f62d38b9220dd941c1a66e480", + "reference.json:md5,7e0220d655ca0ee43d59f1b893c46c92", + "transcripts.bed:md5,f9840436821172d8cef086cb6f3c27eb", + "tss.bed:md5,d637f9650dc3862c932cd9996ace49f5", + "Genome:md5,0aaebdafd448aeec403253cc47e15176", + "SA:md5,362887f688b9dfa4db38cf94789a7146", + "SAindex:md5,12b60be46a35439e94afbe3837c39caa", + "chrLength.txt:md5,b0be0a56ddefa84552742c72d4859eac", + "chrName.txt:md5,e99d7d1051eee43ceab5563c2d09fcee", + "chrNameLength.txt:md5,c985a141685e8431ec27c782816cb744", + "chrStart.txt:md5,6925b594ea2eeb964ba87cd6d42ab98f", + "exonGeTrInfo.tab:md5,4df909658a0492ecbd3a06ce609e6321", + "exonInfo.tab:md5,7cfa1b212f335c497705834a4c96cdcd", + "geneInfo.tab:md5,ad1720994386644d3b1907433f4a5043", + "sjdbInfo.txt:md5,dc4f3b4954bf8248aebcd823d97a4437", + "sjdbList.fromGTF.out.tab:md5,0a0674059c3be4ccf69d572c9560f5d7", + "sjdbList.out.tab:md5,be8b2978e8ac3a2c8266c798c7c34b90", + "transcriptInfo.tab:md5,5a6ee447f3efac16042d8c99f653747b", + "config:md5,055bd80c554d66120313c0500ff2f00d", + "versions.yml:md5,e9926d37b6e80aa8cb9344ace558b449", + "10k_PBMC_filtered_matrix.h5ad:md5,60b9311d46f756cd2b9fb737628713b3", + "10k_PBMC_filtered_matrix.sce.rds:md5,359160d80821c5dbf1ebc7a88dbe8400", + "10k_PBMC_filtered_matrix.seurat.rds:md5,ca44f68f2ea255bfd556c71a6b91423e", + "10k_PBMC_raw_matrix.h5ad:md5,4ac50d4109bcccd1d82ed83fc00d7580", + "10k_PBMC_raw_matrix.sce.rds:md5,196adfcb230f9ba9bb7d0aba36e7e261", + "10k_PBMC_raw_matrix.seurat.rds:md5,8ff4d68d88a6a7e3528147e06aeaa4dd", + "combined_filtered_matrix.h5ad:md5,18f3a2c580b6f50562739a2cc0dcca82", + "combined_filtered_matrix.sce.rds:md5,4c1dee683e3d0e602556a69b9b64b3a5", + "combined_filtered_matrix.seurat.rds:md5,91f83560d80b7b1ab238161d73c64831", + "combined_raw_matrix.h5ad:md5,791f4f6dcc1098a43aa6c1e6f8a76fe3", + "combined_raw_matrix.sce.rds:md5,4846edfc332c65c129b554c27a357dc7", + "combined_raw_matrix.seurat.rds:md5,8900e93d58f613d56f02a4243769498a", + "fastqc-status-check-heatmap.txt:md5,55b658eef7b63c6f8e3d559be41f5df8", + "fastqc_adapter_content_plot.txt:md5,31ca16758049ac46cc84875ddc4ff6d3", + "fastqc_overrepresented_sequences_plot.txt:md5,314754adfcfa2977ee4f61c2ec5444f2", + "fastqc_per_base_n_content_plot.txt:md5,5cea53daa2ac7fdf01e7290e1f5dc764", + "fastqc_per_base_sequence_quality_plot.txt:md5,8066f483d4946d88a07edc956c384b8e", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,aded058c8be315f19a9f6085dc2dc613", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,b2f1be57919d6c6ef0fc10faf52e7ea6", + "fastqc_per_sequence_quality_scores_plot.txt:md5,3b8687d636e80507480ef0389ad7c15c", + "fastqc_sequence_counts_plot.txt:md5,432a9dc6985f0c898800f35d9631b3ca", + "fastqc_sequence_duplication_levels_plot.txt:md5,e3437aa44086c949a4f4aed1e157975b", + "multiqc_citations.txt:md5,4c806e63a283ec1b7e78cdae3a923d4f", + "multiqc_fastqc.txt:md5,2cf29158d5f9928cf0564bb0cc2ced97", + "multiqc_general_stats.txt:md5,fd84f94100989affc666904a2f34c40c" + ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "24.10.1" }, - "timestamp": "2025-03-26T16:19:15.398105567" + "timestamp": "2025-07-30T19:53:53.433223598" } } \ No newline at end of file From 4398fe55949b118606e59870b9a2ffe8d6916b1b Mon Sep 17 00:00:00 2001 From: Mridul Chaudhary <47246321+Mridul-Chaudhary@users.noreply.github.com> Date: Thu, 31 Jul 2025 13:20:18 +0530 Subject: [PATCH 59/82] took out emit block from skip_mqc condition this was breaking the pipeline when skip_multiqc was not used --- workflows/scrnaseq.nf | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/workflows/scrnaseq.nf b/workflows/scrnaseq.nf index 0a97ac06..2f283ad9 100644 --- a/workflows/scrnaseq.nf +++ b/workflows/scrnaseq.nf @@ -365,9 +365,10 @@ if (!params.skip_multiqc) { [], [] ) - - emit:multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html + } + + emit: + multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html versions = ch_versions // channel: [ path(versions.yml) ] } -} From 780246e73d40ff01f3a4073e0f6debeacf2df492 Mon Sep 17 00:00:00 2001 From: Gregor Sturm Date: Thu, 31 Jul 2025 10:14:39 +0200 Subject: [PATCH 60/82] Handle everything withing scrnaseq workflow --- main.nf | 4 +- .../utils_nfcore_scrnaseq_pipeline/main.nf | 2 +- workflows/scrnaseq.nf | 83 ++++++++++--------- 3 files changed, 46 insertions(+), 43 deletions(-) diff --git a/main.nf b/main.nf index d52bf0cf..baf90b55 100644 --- a/main.nf +++ b/main.nf @@ -56,7 +56,7 @@ workflow NFCORE_SCRNASEQ { params.gtf ) emit: - multiqc_report = params.skip_multiqc ? Channel.empty() : SCRNASEQ.out.multiqc_report // channel: /path/to/multiqc_report.html + multiqc_report = SCRNASEQ.out.multiqc_report // channel: /path/to/multiqc_report.html } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -95,7 +95,7 @@ workflow { params.outdir, params.monochrome_logs, params.hook_url, - params.skip_multiqc ? Channel.empty() : NFCORE_SCRNASEQ.out.multiqc_report + NFCORE_SCRNASEQ.out.multiqc_report ) } diff --git a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf index 7dd038ea..772d4227 100644 --- a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf @@ -156,7 +156,7 @@ workflow PIPELINE_COMPLETION { main: summary_params = paramsSummaryMap(workflow, parameters_schema: "nextflow_schema.json") - def multiqc_reports = params.skip_multiqc ? [null] : multiqc_report.toList() + def multiqc_reports = multiqc_report.toList() // // Completion email and summary diff --git a/workflows/scrnaseq.nf b/workflows/scrnaseq.nf index 2f283ad9..b54d5251 100644 --- a/workflows/scrnaseq.nf +++ b/workflows/scrnaseq.nf @@ -325,50 +325,53 @@ workflow SCRNASEQ { newLine: true ).set { ch_collated_versions } -if (!params.skip_multiqc) { - // - // MODULE: MultiQC - // - ch_multiqc_config = Channel.fromPath( - "$projectDir/assets/multiqc_config.yml", checkIfExists: true) - ch_multiqc_custom_config = params.multiqc_config ? - Channel.fromPath(params.multiqc_config, checkIfExists: true) : - Channel.empty() - ch_multiqc_logo = params.multiqc_logo ? - Channel.fromPath(params.multiqc_logo, checkIfExists: true) : - Channel.empty() - - summary_params = paramsSummaryMap( - workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) - ch_multiqc_files = ch_multiqc_files.mix( - ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - ch_multiqc_custom_methods_description = params.multiqc_methods_description ? - file(params.multiqc_methods_description, checkIfExists: true) : - file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = Channel.value( - methodsDescriptionText(ch_multiqc_custom_methods_description)) - - ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) - ch_multiqc_files = ch_multiqc_files.mix( - ch_methods_description.collectFile( - name: 'methods_description_mqc.yaml', - sort: true + if (!params.skip_multiqc) { + // + // MODULE: MultiQC + // + ch_multiqc_config = Channel.fromPath( + "$projectDir/assets/multiqc_config.yml", checkIfExists: true) + ch_multiqc_custom_config = params.multiqc_config ? + Channel.fromPath(params.multiqc_config, checkIfExists: true) : + Channel.empty() + ch_multiqc_logo = params.multiqc_logo ? + Channel.fromPath(params.multiqc_logo, checkIfExists: true) : + Channel.empty() + + summary_params = paramsSummaryMap( + workflow, parameters_schema: "nextflow_schema.json") + ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) + ch_multiqc_files = ch_multiqc_files.mix( + ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) + ch_multiqc_custom_methods_description = params.multiqc_methods_description ? + file(params.multiqc_methods_description, checkIfExists: true) : + file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) + ch_methods_description = Channel.value( + methodsDescriptionText(ch_multiqc_custom_methods_description)) + + ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) + ch_multiqc_files = ch_multiqc_files.mix( + ch_methods_description.collectFile( + name: 'methods_description_mqc.yaml', + sort: true + ) ) - ) - MULTIQC ( - ch_multiqc_files.collect(), - ch_multiqc_config.toList(), - ch_multiqc_custom_config.toList(), - ch_multiqc_logo.toList(), - [], - [] - ) + MULTIQC ( + ch_multiqc_files.collect(), + ch_multiqc_config.toList(), + ch_multiqc_custom_config.toList(), + ch_multiqc_logo.toList(), + [], + [] + ) + ch_multiqc_report = MULTIQC.out.report + } else { + ch_multiqc_report = Channel.empty() } - + emit: - multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html + multiqc_report = ch_multiqc_report // channel: /path/to/multiqc_report.html versions = ch_versions // channel: [ path(versions.yml) ] } From 92bf7f3db653755632308c4069401e5b89078e03 Mon Sep 17 00:00:00 2001 From: Gregor Sturm Date: Thu, 31 Jul 2025 10:16:56 +0200 Subject: [PATCH 61/82] Update CHANGELOG --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 688a43f7..28b86195 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix the workflow for cellranger-arc alignment and add new test with 10x multiome dataset ([#441](https://github.com/nf-core/scrnaseq/pull/441)) - Update `nf-core/cellranger` modules to tool verson `9.0.1` ([#467](https://github.com/nf-core/scrnaseq/pull/467)). - Fix igenomes usage to correctly handle fasta and gtf files ([#469](https://github.com/nf-core/scrnaseq/pull/469)). -- Update `cellranger/multi` module to latest version with nf-core tools ([#482](https://github.com/nf-core/scrnaseq/pull/482)) -- Adapt pipeline to also parse `OCM` barcodes for `cellranger/multi` and update its documentation ([#482](https://github.com/nf-core/scrnaseq/pull/482)) +- Update `cellranger/multi` module to latest version with nf-core tools ([#482](https://github.com/nf-core/scrnaseq/pull/482)). +- Adapt pipeline to also parse `OCM` barcodes for `cellranger/multi` and update its documentation ([#482](https://github.com/nf-core/scrnaseq/pull/482)). +- Fix that skip_multiqc parameter did not work ([#479](https://github.com/nf-core/scrnaseq/pull/479)). ### Chore From 73630d9bda9620e85f0eab341982b2dd703bfa29 Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Thu, 31 Jul 2025 11:10:52 +0200 Subject: [PATCH 62/82] update kallisto nf-test as new template --- tests/main_pipeline_kallisto.nf.test | 76 ++----- tests/main_pipeline_kallisto.nf.test.snap | 241 ++++++++++++++++++++-- 2 files changed, 235 insertions(+), 82 deletions(-) diff --git a/tests/main_pipeline_kallisto.nf.test b/tests/main_pipeline_kallisto.nf.test index 3640e550..a1de5810 100644 --- a/tests/main_pipeline_kallisto.nf.test +++ b/tests/main_pipeline_kallisto.nf.test @@ -14,67 +14,23 @@ nextflow_pipeline { } 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}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( - - // - // General assertions - // - - // Did it finish successfully? - {assert workflow.success}, - - // How many tasks were executed? - {assert workflow.trace.tasks().size() == 19}, - - // How many results were produced? - {assert path("${outputDir}/results_kallisto").list().size() == 4}, - {assert path("${outputDir}/results_kallisto/kallisto").list().size() == 3}, - {assert path("${outputDir}/results_kallisto/kallisto/mtx_conversions").list().size() == 8}, - {assert path("${outputDir}/results_kallisto/kallisto/Sample_X.count").list().size() == 12}, - {assert path("${outputDir}/results_kallisto/kallisto/Sample_Y.count").list().size() == 12}, - {assert path("${outputDir}/results_kallisto/fastqc").list().size() == 12}, - {assert path("${outputDir}/results_kallisto/multiqc").list().size() == 3}, - - // - // Check if files were produced - // - {assert new File( "${outputDir}/results_kallisto/kallisto/mtx_conversions/Sample_X/Sample_X_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_kallisto/kallisto/mtx_conversions/Sample_X/Sample_X_filtered_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_kallisto/kallisto/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_kallisto/kallisto/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.h5ad" ).exists()}, - - // - // Check if files are the same - // - {assert snapshot( - path( "${outputDir}/results_kallisto/kallisto/Sample_X.count/counts_unfiltered/cells_x_genes.barcodes.txt" ), - path( "${outputDir}/results_kallisto/kallisto/Sample_X.count/counts_unfiltered/cells_x_genes.genes.txt" ), - path( "${outputDir}/results_kallisto/kallisto/Sample_X.count/counts_unfiltered/cells_x_genes.mtx" ), - path( "${outputDir}/results_kallisto/kallisto/Sample_X.count/counts_filtered/cells_x_genes.barcodes.txt" ), - path( "${outputDir}/results_kallisto/kallisto/Sample_X.count/counts_filtered/cells_x_genes.genes.txt" ), - path( "${outputDir}/results_kallisto/kallisto/Sample_X.count/counts_filtered/cells_x_genes.mtx" ), - - path( "${outputDir}/results_kallisto/kallisto/Sample_Y.count/counts_unfiltered/cells_x_genes.barcodes.txt" ), - path( "${outputDir}/results_kallisto/kallisto/Sample_Y.count/counts_unfiltered/cells_x_genes.genes.txt" ), - path( "${outputDir}/results_kallisto/kallisto/Sample_Y.count/counts_unfiltered/cells_x_genes.mtx" ), - path( "${outputDir}/results_kallisto/kallisto/Sample_Y.count/counts_filtered/cells_x_genes.barcodes.txt" ), - path( "${outputDir}/results_kallisto/kallisto/Sample_Y.count/counts_filtered/cells_x_genes.genes.txt" ), - path( "${outputDir}/results_kallisto/kallisto/Sample_Y.count/counts_filtered/cells_x_genes.mtx" ), - - path( "${outputDir}/results_kallisto/kallisto/mtx_conversions/Sample_X/Sample_X_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_kallisto/kallisto/mtx_conversions/Sample_X/Sample_X_raw_matrix.sce.rds" ), - path( "${outputDir}/results_kallisto/kallisto/mtx_conversions/Sample_X/Sample_X_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_kallisto/kallisto/mtx_conversions/Sample_X/Sample_X_filtered_matrix.sce.rds" ), - - path( "${outputDir}/results_kallisto/kallisto/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_kallisto/kallisto/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.sce.rds" ), - path( "${outputDir}/results_kallisto/kallisto/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_kallisto/kallisto/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.sce.rds" ) - ).match()} - - ) // end of 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 test pipelines on multiple Nextflow versions + removeNextflowVersion("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) } } diff --git a/tests/main_pipeline_kallisto.nf.test.snap b/tests/main_pipeline_kallisto.nf.test.snap index 9b344ea6..5afee590 100644 --- a/tests/main_pipeline_kallisto.nf.test.snap +++ b/tests/main_pipeline_kallisto.nf.test.snap @@ -1,31 +1,228 @@ { "test-dataset_kallisto_aligner": { "content": [ - "cells_x_genes.barcodes.txt:md5,72d78bb1c1ee7cb174520b30f695aa48", - "cells_x_genes.genes.txt:md5,acd9d00120f52031974b2add3e7521b6", - "cells_x_genes.mtx:md5,894d60da192e3788de11fa8fc1fa711d", - "cells_x_genes.barcodes.txt:md5,9e456448a0d4da992d4ca89987c1feba", - "cells_x_genes.genes.txt:md5,acd9d00120f52031974b2add3e7521b6", - "cells_x_genes.mtx:md5,6cf18c72ed8d4f96e4f01d2bf637f962", - "cells_x_genes.barcodes.txt:md5,a8cf7ea4b2d075296a94bf066a64b7a4", - "cells_x_genes.genes.txt:md5,acd9d00120f52031974b2add3e7521b6", - "cells_x_genes.mtx:md5,abd83de117204d0a77df3c92d00cc025", - "cells_x_genes.barcodes.txt:md5,32464c83608493daf0a22dc39ede6bc8", - "cells_x_genes.genes.txt:md5,acd9d00120f52031974b2add3e7521b6", - "cells_x_genes.mtx:md5,fb032cbac4888032c81ed79a740fa181", - "Sample_X_raw_matrix.seurat.rds:md5,6dba7ab652441df6a2b0712c7529053b", - "Sample_X_raw_matrix.sce.rds:md5,3fef29fea599561551a06caa82811e2b", - "Sample_X_filtered_matrix.seurat.rds:md5,a25a8c6d0b26facffaae352c2f2742fc", - "Sample_X_filtered_matrix.sce.rds:md5,554e1376664bbff371cb09c39a969d06", - "Sample_Y_raw_matrix.seurat.rds:md5,a9e9ac3d1bf83f4e791d6f0c3f6540de", - "Sample_Y_raw_matrix.sce.rds:md5,6818392c6b8b65d762521406aa963b2a", - "Sample_Y_filtered_matrix.seurat.rds:md5,f872ac3625f2b2f1fca77a5b736cc18f", - "Sample_Y_filtered_matrix.sce.rds:md5,e93e974427f87e8774636c64d33d628e" + 19, + { + "FASTQC": { + "fastqc": "0.12.1" + }, + "KALLISTOBUSTOOLS_COUNT": { + "kallistobustools": "0.28.2" + }, + "KALLISTOBUSTOOLS_REF": { + "kallistobustools": "0.28.2" + }, + "MTX_TO_H5AD": { + "python": "3.12.5", + "scanpy": "1.10.2", + "pandas": "2.2.2", + "anndata": "0.10.8" + }, + "Workflow": { + "nf-core/scrnaseq": "v4.1.0dev" + } + }, + [ + "", + "fastqc", + "fastqc/Sample_X_1_fastqc.html", + "fastqc/Sample_X_1_fastqc.zip", + "fastqc/Sample_X_2_fastqc.html", + "fastqc/Sample_X_2_fastqc.zip", + "fastqc/Sample_Y_1_fastqc.html", + "fastqc/Sample_Y_1_fastqc.zip", + "fastqc/Sample_Y_2_fastqc.html", + "fastqc/Sample_Y_2_fastqc.zip", + "fastqc/Sample_Y_3_fastqc.html", + "fastqc/Sample_Y_3_fastqc.zip", + "fastqc/Sample_Y_4_fastqc.html", + "fastqc/Sample_Y_4_fastqc.zip", + "kallisto", + "kallisto/Sample_X.count", + "kallisto/Sample_X.count/10x_version2_whitelist.txt", + "kallisto/Sample_X.count/counts_filtered", + "kallisto/Sample_X.count/counts_filtered/cells_x_genes.barcodes.txt", + "kallisto/Sample_X.count/counts_filtered/cells_x_genes.genes.names.txt", + "kallisto/Sample_X.count/counts_filtered/cells_x_genes.genes.txt", + "kallisto/Sample_X.count/counts_filtered/cells_x_genes.mtx", + "kallisto/Sample_X.count/counts_unfiltered", + "kallisto/Sample_X.count/counts_unfiltered/cells_x_genes.barcodes.txt", + "kallisto/Sample_X.count/counts_unfiltered/cells_x_genes.genes.names.txt", + "kallisto/Sample_X.count/counts_unfiltered/cells_x_genes.genes.txt", + "kallisto/Sample_X.count/counts_unfiltered/cells_x_genes.mtx", + "kallisto/Sample_X.count/filter_barcodes.txt", + "kallisto/Sample_X.count/inspect.json", + "kallisto/Sample_X.count/kb_info.json", + "kallisto/Sample_X.count/matrix.ec", + "kallisto/Sample_X.count/output.bus", + "kallisto/Sample_X.count/output.filtered.bus", + "kallisto/Sample_X.count/output.unfiltered.bus", + "kallisto/Sample_X.count/run_info.json", + "kallisto/Sample_X.count/transcripts.txt", + "kallisto/Sample_Y.count", + "kallisto/Sample_Y.count/10x_version2_whitelist.txt", + "kallisto/Sample_Y.count/counts_filtered", + "kallisto/Sample_Y.count/counts_filtered/cells_x_genes.barcodes.txt", + "kallisto/Sample_Y.count/counts_filtered/cells_x_genes.genes.names.txt", + "kallisto/Sample_Y.count/counts_filtered/cells_x_genes.genes.txt", + "kallisto/Sample_Y.count/counts_filtered/cells_x_genes.mtx", + "kallisto/Sample_Y.count/counts_unfiltered", + "kallisto/Sample_Y.count/counts_unfiltered/cells_x_genes.barcodes.txt", + "kallisto/Sample_Y.count/counts_unfiltered/cells_x_genes.genes.names.txt", + "kallisto/Sample_Y.count/counts_unfiltered/cells_x_genes.genes.txt", + "kallisto/Sample_Y.count/counts_unfiltered/cells_x_genes.mtx", + "kallisto/Sample_Y.count/filter_barcodes.txt", + "kallisto/Sample_Y.count/inspect.json", + "kallisto/Sample_Y.count/kb_info.json", + "kallisto/Sample_Y.count/matrix.ec", + "kallisto/Sample_Y.count/output.bus", + "kallisto/Sample_Y.count/output.filtered.bus", + "kallisto/Sample_Y.count/output.unfiltered.bus", + "kallisto/Sample_Y.count/run_info.json", + "kallisto/Sample_Y.count/transcripts.txt", + "kallisto/mtx_conversions", + "kallisto/mtx_conversions/Sample_X", + "kallisto/mtx_conversions/Sample_X/Sample_X_filtered_matrix.h5ad", + "kallisto/mtx_conversions/Sample_X/Sample_X_filtered_matrix.sce.rds", + "kallisto/mtx_conversions/Sample_X/Sample_X_filtered_matrix.seurat.rds", + "kallisto/mtx_conversions/Sample_X/Sample_X_raw_matrix.h5ad", + "kallisto/mtx_conversions/Sample_X/Sample_X_raw_matrix.sce.rds", + "kallisto/mtx_conversions/Sample_X/Sample_X_raw_matrix.seurat.rds", + "kallisto/mtx_conversions/Sample_Y", + "kallisto/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.h5ad", + "kallisto/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.sce.rds", + "kallisto/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.seurat.rds", + "kallisto/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.h5ad", + "kallisto/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.sce.rds", + "kallisto/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.seurat.rds", + "kallisto/mtx_conversions/combined_filtered_matrix.h5ad", + "kallisto/mtx_conversions/combined_filtered_matrix.sce.rds", + "kallisto/mtx_conversions/combined_filtered_matrix.seurat.rds", + "kallisto/mtx_conversions/combined_raw_matrix.h5ad", + "kallisto/mtx_conversions/combined_raw_matrix.sce.rds", + "kallisto/mtx_conversions/combined_raw_matrix.seurat.rds", + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/BETA-multiqc.parquet", + "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", + "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_sequence_quality_plot.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/multiqc_data/fastqc_per_sequence_quality_scores_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", + "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_fastqc.txt", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/fastqc-status-check-heatmap.pdf", + "multiqc/multiqc_plots/pdf/fastqc_adapter_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_n_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/fastqc-status-check-heatmap.png", + "multiqc/multiqc_plots/png/fastqc_adapter_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_n_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_sequence_quality_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_quality_scores_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-cnt.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-pct.png", + "multiqc/multiqc_plots/png/fastqc_sequence_duplication_levels_plot.png", + "multiqc/multiqc_plots/png/fastqc_top_overrepresented_sequences_table.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/fastqc-status-check-heatmap.svg", + "multiqc/multiqc_plots/svg/fastqc_adapter_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_n_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_sequence_quality_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_quality_scores_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-cnt.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-pct.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_duplication_levels_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_top_overrepresented_sequences_table.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml" + ], + [ + "10x_version2_whitelist.txt:md5,f62a276e262fdd85262a889d0f48556b", + "cells_x_genes.barcodes.txt:md5,9e456448a0d4da992d4ca89987c1feba", + "cells_x_genes.genes.names.txt:md5,a27831417ff4ed049d5b46012b270f4d", + "cells_x_genes.genes.txt:md5,acd9d00120f52031974b2add3e7521b6", + "cells_x_genes.mtx:md5,6cf18c72ed8d4f96e4f01d2bf637f962", + "cells_x_genes.barcodes.txt:md5,72d78bb1c1ee7cb174520b30f695aa48", + "cells_x_genes.genes.names.txt:md5,a27831417ff4ed049d5b46012b270f4d", + "cells_x_genes.genes.txt:md5,acd9d00120f52031974b2add3e7521b6", + "cells_x_genes.mtx:md5,894d60da192e3788de11fa8fc1fa711d", + "filter_barcodes.txt:md5,e411047c257b0a84656427aeca228bd4", + "matrix.ec:md5,fe1a726fbfca166d71f0f2a73e847b1c", + "transcripts.txt:md5,da62746af800837deb91b829ea67c05d", + "10x_version2_whitelist.txt:md5,f62a276e262fdd85262a889d0f48556b", + "cells_x_genes.barcodes.txt:md5,32464c83608493daf0a22dc39ede6bc8", + "cells_x_genes.genes.names.txt:md5,a27831417ff4ed049d5b46012b270f4d", + "cells_x_genes.genes.txt:md5,acd9d00120f52031974b2add3e7521b6", + "cells_x_genes.mtx:md5,fb032cbac4888032c81ed79a740fa181", + "cells_x_genes.barcodes.txt:md5,a8cf7ea4b2d075296a94bf066a64b7a4", + "cells_x_genes.genes.names.txt:md5,a27831417ff4ed049d5b46012b270f4d", + "cells_x_genes.genes.txt:md5,acd9d00120f52031974b2add3e7521b6", + "cells_x_genes.mtx:md5,abd83de117204d0a77df3c92d00cc025", + "filter_barcodes.txt:md5,080dd405987d2e1bd238ba94b821d487", + "matrix.ec:md5,be196b2c822f4cb9aca53ffe52f7e9be", + "transcripts.txt:md5,da62746af800837deb91b829ea67c05d", + "Sample_X_filtered_matrix.h5ad:md5,a2bcc30ea32f510555d82250b37f1ff1", + "Sample_X_filtered_matrix.sce.rds:md5,554e1376664bbff371cb09c39a969d06", + "Sample_X_filtered_matrix.seurat.rds:md5,a25a8c6d0b26facffaae352c2f2742fc", + "Sample_X_raw_matrix.h5ad:md5,640b724124545f5fbc861b6bc6d264d5", + "Sample_X_raw_matrix.sce.rds:md5,3fef29fea599561551a06caa82811e2b", + "Sample_X_raw_matrix.seurat.rds:md5,6dba7ab652441df6a2b0712c7529053b", + "Sample_Y_filtered_matrix.h5ad:md5,ba2f3755c0624f24ea8c07aaaf457574", + "Sample_Y_filtered_matrix.sce.rds:md5,e93e974427f87e8774636c64d33d628e", + "Sample_Y_filtered_matrix.seurat.rds:md5,f872ac3625f2b2f1fca77a5b736cc18f", + "Sample_Y_raw_matrix.h5ad:md5,495f376a2042dc69b792984053dffc5d", + "Sample_Y_raw_matrix.sce.rds:md5,6818392c6b8b65d762521406aa963b2a", + "Sample_Y_raw_matrix.seurat.rds:md5,a9e9ac3d1bf83f4e791d6f0c3f6540de", + "combined_filtered_matrix.h5ad:md5,8936bc3247d92e0568e1e7205c32ef31", + "combined_filtered_matrix.sce.rds:md5,296894bc16e73e840b0a65629d0655aa", + "combined_filtered_matrix.seurat.rds:md5,dc3f163b347e8f6ad200cffcf10d1430", + "combined_raw_matrix.h5ad:md5,fc96df4f6ff697f72e2406616c8ee01f", + "combined_raw_matrix.sce.rds:md5,5e9ebd129623df4cfb1b51d8123787f0", + "combined_raw_matrix.seurat.rds:md5,ff22ff0341a20ddae377839b82fa2077", + "fastqc-status-check-heatmap.txt:md5,d122badcaa647409c35a809e8a127f99", + "fastqc_adapter_content_plot.txt:md5,25f2bf3896afee60c3af1c2d406adb2a", + "fastqc_per_base_n_content_plot.txt:md5,87fa27ea81dfddbd03d17e9d62073464", + "fastqc_per_base_sequence_quality_plot.txt:md5,10286297045c79d47254b472d64fe1b4", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,7e19e0d150b99698a97f1b06e164c81a", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,c9b7817422c054b575a45d4065876809", + "fastqc_per_sequence_quality_scores_plot.txt:md5,72ceb51a99080fd0fc5c9fe368f7b1fb", + "fastqc_sequence_counts_plot.txt:md5,a3c8ef25c1126727391c2973a40ca7f7", + "fastqc_sequence_duplication_levels_plot.txt:md5,10e456e57df8bcd738fe6a35d3a6c7cf", + "multiqc_citations.txt:md5,4c806e63a283ec1b7e78cdae3a923d4f", + "multiqc_fastqc.txt:md5,12027880857508ce5cedc3904a351730", + "multiqc_general_stats.txt:md5,dac8af62b04fd0880801f5d5c503c472" + ] ], "meta": { - "nf-test": "0.9.0", + "nf-test": "0.9.2", "nextflow": "24.10.1" }, - "timestamp": "2025-01-17T10:13:54.332011219" + "timestamp": "2025-07-31T10:26:43.019070199" } } \ No newline at end of file From 3bb0b48dc0771fe61f9d0ddace590061bafbfadf Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Thu, 31 Jul 2025 11:11:44 +0200 Subject: [PATCH 63/82] update star nf-test as new template --- tests/main_pipeline_star.nf.test | 69 ++----- tests/main_pipeline_star.nf.test.snap | 262 +++++++++++++++++++++++--- 2 files changed, 256 insertions(+), 75 deletions(-) diff --git a/tests/main_pipeline_star.nf.test b/tests/main_pipeline_star.nf.test index f3660c27..1aee0492 100644 --- a/tests/main_pipeline_star.nf.test +++ b/tests/main_pipeline_star.nf.test @@ -14,60 +14,23 @@ nextflow_pipeline { } 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}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( - - // - // General assertions - // - - // Did it finish successfully? - {assert workflow.success}, - - // How many tasks were executed? - {assert workflow.trace.tasks().size() == 19}, - - // How many results were produced? - {assert path("${outputDir}/results_star").list().size() == 4}, - {assert path("${outputDir}/results_star/star").list().size() == 3}, - {assert path("${outputDir}/results_star/star/mtx_conversions").list().size() == 8}, - {assert path("${outputDir}/results_star/fastqc").list().size() == 12}, - {assert path("${outputDir}/results_star/multiqc").list().size() == 3}, - - // - // Check if files were produced - // - {assert new File( "${outputDir}/results_star/star/mtx_conversions/Sample_X/Sample_X_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_star/star/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_star/star/mtx_conversions/Sample_X/Sample_X_filtered_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_star/star/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.h5ad" ).exists()}, - - // - // Check if files are the same - // - {assert snapshot( - path( "${outputDir}/results_star/star/Sample_X/Sample_X.SJ.out.tab" ), - path( "${outputDir}/results_star/star/Sample_X/Sample_X.Solo.out/Barcodes.stats" ), - path( "${outputDir}/results_star/star/Sample_X/Sample_X.Solo.out/Gene/filtered/matrix.mtx.gz" ), - path( "${outputDir}/results_star/star/Sample_X/Sample_X.Solo.out/Gene/filtered/features.tsv.gz" ), - path( "${outputDir}/results_star/star/Sample_X/Sample_X.Solo.out/Gene/filtered/barcodes.tsv.gz" ), - path( "${outputDir}/results_star/star/Sample_Y/Sample_Y.SJ.out.tab" ), - path( "${outputDir}/results_star/star/Sample_Y/Sample_Y.Solo.out/Barcodes.stats" ), - path( "${outputDir}/results_star/star/Sample_Y/Sample_Y.Solo.out/Gene/filtered/matrix.mtx.gz" ), - path( "${outputDir}/results_star/star/Sample_Y/Sample_Y.Solo.out/Gene/filtered/features.tsv.gz" ), - path( "${outputDir}/results_star/star/Sample_Y/Sample_Y.Solo.out/Gene/filtered/barcodes.tsv.gz" ), - path( "${outputDir}/results_star/star/mtx_conversions/Sample_X/Sample_X_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_star/star/mtx_conversions/Sample_X/Sample_X_raw_matrix.sce.rds" ), - path( "${outputDir}/results_star/star/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_star/star/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.sce.rds" ), - path( "${outputDir}/results_star/star/mtx_conversions/Sample_X/Sample_X_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_star/star/mtx_conversions/Sample_X/Sample_X_filtered_matrix.sce.rds" ), - path( "${outputDir}/results_star/star/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_star/star/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.sce.rds" ) - ).match()} - - ) // end of 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 test pipelines on multiple Nextflow versions + removeNextflowVersion("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) } } diff --git a/tests/main_pipeline_star.nf.test.snap b/tests/main_pipeline_star.nf.test.snap index 7c9d8c8e..dccce39a 100644 --- a/tests/main_pipeline_star.nf.test.snap +++ b/tests/main_pipeline_star.nf.test.snap @@ -1,29 +1,247 @@ { "test-dataset_star_aligner": { "content": [ - "Sample_X.SJ.out.tab:md5,d2d7f0abe38029012571bdf6622fc6eb", - "Barcodes.stats:md5,7f99dc8aa5e074fbe5779ea7712c0886", - "matrix.mtx.gz:md5,6a923393343aa1a69b0cf1bd998c9285", - "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", - "barcodes.tsv.gz:md5,9a7dacaa1779ea43c1507a947fe6992a", - "Sample_Y.SJ.out.tab:md5,98bd31104a860cf80119dc30d938d163", - "Barcodes.stats:md5,2dbf1ae426c1afd97903ee001f0db5ce", - "matrix.mtx.gz:md5,0ae080bd0002e350531a5816e159345e", - "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", - "barcodes.tsv.gz:md5,9b695b0b91bcb146ec9c4688ca10a690", - "Sample_X_raw_matrix.seurat.rds:md5,34fd07749de1f1ee49e885782cd7c6c5", - "Sample_X_raw_matrix.sce.rds:md5,ef88d8a6bb48eb8f555a0c255d9b03bb", - "Sample_Y_raw_matrix.seurat.rds:md5,5b8361f36fec65107e7652751c80fdb5", - "Sample_Y_raw_matrix.sce.rds:md5,d9d6c934d2193681ab58a88d437bf138", - "Sample_X_filtered_matrix.seurat.rds:md5,05780c38d8deb9d06384da2c12cbdefd", - "Sample_X_filtered_matrix.sce.rds:md5,41f1959bd1c577305915fdfcb797bf0b", - "Sample_Y_filtered_matrix.seurat.rds:md5,d27d6360cf500bf4438f650b8796f8ce", - "Sample_Y_filtered_matrix.sce.rds:md5,2c63e5563a037d2834a6eef107b34f67" + 19, + { + "FASTQC": { + "fastqc": "0.12.1" + }, + "MTX_TO_H5AD": { + "python": "3.12.5", + "scanpy": "1.10.2", + "pandas": "2.2.2", + "anndata": "0.10.8" + }, + "STAR_ALIGN": { + "star": "2.7.10b" + }, + "STAR_GENOMEGENERATE": { + "star": "2.7.10a", + "samtools": 1.18, + "gawk": "5.1.0" + }, + "Workflow": { + "nf-core/scrnaseq": "v4.1.0dev" + } + }, + [ + "", + "fastqc", + "fastqc/Sample_X_1_fastqc.html", + "fastqc/Sample_X_1_fastqc.zip", + "fastqc/Sample_X_2_fastqc.html", + "fastqc/Sample_X_2_fastqc.zip", + "fastqc/Sample_Y_1_fastqc.html", + "fastqc/Sample_Y_1_fastqc.zip", + "fastqc/Sample_Y_2_fastqc.html", + "fastqc/Sample_Y_2_fastqc.zip", + "fastqc/Sample_Y_3_fastqc.html", + "fastqc/Sample_Y_3_fastqc.zip", + "fastqc/Sample_Y_4_fastqc.html", + "fastqc/Sample_Y_4_fastqc.zip", + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/BETA-multiqc.parquet", + "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", + "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_sequence_quality_plot.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/multiqc_data/fastqc_per_sequence_quality_scores_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", + "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_fastqc.txt", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/multiqc_star.txt", + "multiqc/multiqc_data/star_alignment_plot.txt", + "multiqc/multiqc_data/star_summary_table.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/fastqc-status-check-heatmap.pdf", + "multiqc/multiqc_plots/pdf/fastqc_adapter_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_n_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf", + "multiqc/multiqc_plots/pdf/star_alignment_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/star_alignment_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/star_summary_table.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/fastqc-status-check-heatmap.png", + "multiqc/multiqc_plots/png/fastqc_adapter_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_n_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_sequence_quality_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_quality_scores_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-cnt.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-pct.png", + "multiqc/multiqc_plots/png/fastqc_sequence_duplication_levels_plot.png", + "multiqc/multiqc_plots/png/fastqc_top_overrepresented_sequences_table.png", + "multiqc/multiqc_plots/png/star_alignment_plot-cnt.png", + "multiqc/multiqc_plots/png/star_alignment_plot-pct.png", + "multiqc/multiqc_plots/png/star_summary_table.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/fastqc-status-check-heatmap.svg", + "multiqc/multiqc_plots/svg/fastqc_adapter_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_n_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_sequence_quality_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_quality_scores_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-cnt.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-pct.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_duplication_levels_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_top_overrepresented_sequences_table.svg", + "multiqc/multiqc_plots/svg/star_alignment_plot-cnt.svg", + "multiqc/multiqc_plots/svg/star_alignment_plot-pct.svg", + "multiqc/multiqc_plots/svg/star_summary_table.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml", + "star", + "star/Sample_X", + "star/Sample_X/Sample_X.Aligned.sortedByCoord.out.bam", + "star/Sample_X/Sample_X.Log.final.out", + "star/Sample_X/Sample_X.Log.out", + "star/Sample_X/Sample_X.Log.progress.out", + "star/Sample_X/Sample_X.SJ.out.tab", + "star/Sample_X/Sample_X.Solo.out", + "star/Sample_X/Sample_X.Solo.out/Barcodes.stats", + "star/Sample_X/Sample_X.Solo.out/Gene", + "star/Sample_X/Sample_X.Solo.out/Gene/Features.stats", + "star/Sample_X/Sample_X.Solo.out/Gene/Summary.csv", + "star/Sample_X/Sample_X.Solo.out/Gene/UMIperCellSorted.txt", + "star/Sample_X/Sample_X.Solo.out/Gene/filtered", + "star/Sample_X/Sample_X.Solo.out/Gene/filtered/barcodes.tsv.gz", + "star/Sample_X/Sample_X.Solo.out/Gene/filtered/features.tsv.gz", + "star/Sample_X/Sample_X.Solo.out/Gene/filtered/matrix.mtx.gz", + "star/Sample_X/Sample_X.Solo.out/Gene/raw", + "star/Sample_X/Sample_X.Solo.out/Gene/raw/barcodes.tsv.gz", + "star/Sample_X/Sample_X.Solo.out/Gene/raw/features.tsv.gz", + "star/Sample_X/Sample_X.Solo.out/Gene/raw/matrix.mtx.gz", + "star/Sample_X/versions.yml", + "star/Sample_Y", + "star/Sample_Y/Sample_Y.Aligned.sortedByCoord.out.bam", + "star/Sample_Y/Sample_Y.Log.final.out", + "star/Sample_Y/Sample_Y.Log.out", + "star/Sample_Y/Sample_Y.Log.progress.out", + "star/Sample_Y/Sample_Y.SJ.out.tab", + "star/Sample_Y/Sample_Y.Solo.out", + "star/Sample_Y/Sample_Y.Solo.out/Barcodes.stats", + "star/Sample_Y/Sample_Y.Solo.out/Gene", + "star/Sample_Y/Sample_Y.Solo.out/Gene/Features.stats", + "star/Sample_Y/Sample_Y.Solo.out/Gene/Summary.csv", + "star/Sample_Y/Sample_Y.Solo.out/Gene/UMIperCellSorted.txt", + "star/Sample_Y/Sample_Y.Solo.out/Gene/filtered", + "star/Sample_Y/Sample_Y.Solo.out/Gene/filtered/barcodes.tsv.gz", + "star/Sample_Y/Sample_Y.Solo.out/Gene/filtered/features.tsv.gz", + "star/Sample_Y/Sample_Y.Solo.out/Gene/filtered/matrix.mtx.gz", + "star/Sample_Y/Sample_Y.Solo.out/Gene/raw", + "star/Sample_Y/Sample_Y.Solo.out/Gene/raw/barcodes.tsv.gz", + "star/Sample_Y/Sample_Y.Solo.out/Gene/raw/features.tsv.gz", + "star/Sample_Y/Sample_Y.Solo.out/Gene/raw/matrix.mtx.gz", + "star/Sample_Y/versions.yml", + "star/mtx_conversions", + "star/mtx_conversions/Sample_X", + "star/mtx_conversions/Sample_X/Sample_X_filtered_matrix.h5ad", + "star/mtx_conversions/Sample_X/Sample_X_filtered_matrix.sce.rds", + "star/mtx_conversions/Sample_X/Sample_X_filtered_matrix.seurat.rds", + "star/mtx_conversions/Sample_X/Sample_X_raw_matrix.h5ad", + "star/mtx_conversions/Sample_X/Sample_X_raw_matrix.sce.rds", + "star/mtx_conversions/Sample_X/Sample_X_raw_matrix.seurat.rds", + "star/mtx_conversions/Sample_Y", + "star/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.h5ad", + "star/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.sce.rds", + "star/mtx_conversions/Sample_Y/Sample_Y_filtered_matrix.seurat.rds", + "star/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.h5ad", + "star/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.sce.rds", + "star/mtx_conversions/Sample_Y/Sample_Y_raw_matrix.seurat.rds", + "star/mtx_conversions/combined_filtered_matrix.h5ad", + "star/mtx_conversions/combined_filtered_matrix.sce.rds", + "star/mtx_conversions/combined_filtered_matrix.seurat.rds", + "star/mtx_conversions/combined_raw_matrix.h5ad", + "star/mtx_conversions/combined_raw_matrix.sce.rds", + "star/mtx_conversions/combined_raw_matrix.seurat.rds" + ], + [ + "fastqc-status-check-heatmap.txt:md5,d122badcaa647409c35a809e8a127f99", + "fastqc_adapter_content_plot.txt:md5,25f2bf3896afee60c3af1c2d406adb2a", + "fastqc_per_base_n_content_plot.txt:md5,87fa27ea81dfddbd03d17e9d62073464", + "fastqc_per_base_sequence_quality_plot.txt:md5,10286297045c79d47254b472d64fe1b4", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,7e19e0d150b99698a97f1b06e164c81a", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,c9b7817422c054b575a45d4065876809", + "fastqc_per_sequence_quality_scores_plot.txt:md5,72ceb51a99080fd0fc5c9fe368f7b1fb", + "fastqc_sequence_counts_plot.txt:md5,a3c8ef25c1126727391c2973a40ca7f7", + "fastqc_sequence_duplication_levels_plot.txt:md5,10e456e57df8bcd738fe6a35d3a6c7cf", + "multiqc_citations.txt:md5,37594684bb2ecad26be07281635b56f1", + "multiqc_fastqc.txt:md5,12027880857508ce5cedc3904a351730", + "multiqc_general_stats.txt:md5,77dea4461c5b10f498bb809a6cbd19ae", + "multiqc_star.txt:md5,1e52e11f0473601f8b956bb921a70c1c", + "star_alignment_plot.txt:md5,d85d7f79d8c6fbd837b3f3261d133358", + "star_summary_table.txt:md5,e202a71aeee9dd1681343240d17bb4eb", + "Sample_X.Aligned.sortedByCoord.out.bam:md5,26c9d2dce827bba30f0f50c2dde1cc90", + "Sample_X.SJ.out.tab:md5,d2d7f0abe38029012571bdf6622fc6eb", + "Barcodes.stats:md5,7f99dc8aa5e074fbe5779ea7712c0886", + "Features.stats:md5,2742caa3c120d7fd36284b7f34f0a3e4", + "Summary.csv:md5,9d8a9eaee1efd731cf8740aa8e5b9f6e", + "UMIperCellSorted.txt:md5,094486f42faca15825d8bf580a303711", + "barcodes.tsv.gz:md5,9a7dacaa1779ea43c1507a947fe6992a", + "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", + "matrix.mtx.gz:md5,6a923393343aa1a69b0cf1bd998c9285", + "barcodes.tsv.gz:md5,f62a276e262fdd85262a889d0f48556b", + "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", + "matrix.mtx.gz:md5,a1721c240079a651870cbb2e76720dc8", + "versions.yml:md5,f05605942a23ee8ef331f12a523cbf1e", + "Sample_Y.Aligned.sortedByCoord.out.bam:md5,40d6983063ed34585f9da32f69bd423d", + "Sample_Y.SJ.out.tab:md5,98bd31104a860cf80119dc30d938d163", + "Barcodes.stats:md5,2dbf1ae426c1afd97903ee001f0db5ce", + "Features.stats:md5,f0d82a316413d3c920c8487b67ee4f40", + "Summary.csv:md5,5dc3fe610fbe940fc583173dfc8df2d1", + "UMIperCellSorted.txt:md5,11ad79d9dce609aca35561000c727954", + "barcodes.tsv.gz:md5,9b695b0b91bcb146ec9c4688ca10a690", + "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", + "matrix.mtx.gz:md5,0ae080bd0002e350531a5816e159345e", + "barcodes.tsv.gz:md5,f62a276e262fdd85262a889d0f48556b", + "features.tsv.gz:md5,99e453cb1443a3e43e99405184e51a5e", + "matrix.mtx.gz:md5,901ccd41c658cc6485863afff775ea98", + "versions.yml:md5,f05605942a23ee8ef331f12a523cbf1e", + "Sample_X_filtered_matrix.h5ad:md5,21a89f2dff1a2203f846c4884dbd624f", + "Sample_X_filtered_matrix.sce.rds:md5,41f1959bd1c577305915fdfcb797bf0b", + "Sample_X_filtered_matrix.seurat.rds:md5,05780c38d8deb9d06384da2c12cbdefd", + "Sample_X_raw_matrix.h5ad:md5,ef55859b811d8cdb318aa5b2e857cfa3", + "Sample_X_raw_matrix.sce.rds:md5,ef88d8a6bb48eb8f555a0c255d9b03bb", + "Sample_X_raw_matrix.seurat.rds:md5,34fd07749de1f1ee49e885782cd7c6c5", + "Sample_Y_filtered_matrix.h5ad:md5,57ded9e27f5164ad6b1d888d553737c1", + "Sample_Y_filtered_matrix.sce.rds:md5,2c63e5563a037d2834a6eef107b34f67", + "Sample_Y_filtered_matrix.seurat.rds:md5,d27d6360cf500bf4438f650b8796f8ce", + "Sample_Y_raw_matrix.h5ad:md5,25329b6d44ae0f7f885e6513e05fb840", + "Sample_Y_raw_matrix.sce.rds:md5,d9d6c934d2193681ab58a88d437bf138", + "Sample_Y_raw_matrix.seurat.rds:md5,5b8361f36fec65107e7652751c80fdb5", + "combined_filtered_matrix.h5ad:md5,ed4c42c9fb1e5f69d78d3dae9ca1c394", + "combined_filtered_matrix.sce.rds:md5,f12469472a1bb1bcb063b0e1b2bf5091", + "combined_filtered_matrix.seurat.rds:md5,d2d5184319e8bd9a48d00564f40313e0", + "combined_raw_matrix.h5ad:md5,cb8974567f2fc2799842ad684b61f12d", + "combined_raw_matrix.sce.rds:md5,4c61044c24c7c4ed83cca3347624ea33", + "combined_raw_matrix.seurat.rds:md5,04f68843fb5208fca885306c70886c48" + ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.10.2" + "nf-test": "0.9.2", + "nextflow": "24.10.1" }, - "timestamp": "2024-11-29T15:32:12.524479228" + "timestamp": "2025-07-31T10:45:00.949690328" } -} +} \ No newline at end of file From 6ceec951c3ed45259acabcfe10058157ee98e7fe Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Thu, 31 Jul 2025 15:13:02 +0200 Subject: [PATCH 64/82] update cellrangermulti nf-test as template --- tests/.nftignore | 8 +- tests/main_pipeline_cellrangermulti.nf.test | 262 +-- ...main_pipeline_cellrangermulti.nf.test.snap | 1978 ++++++++++++++++- 3 files changed, 1892 insertions(+), 356 deletions(-) diff --git a/tests/.nftignore b/tests/.nftignore index e163663c..ce988dfd 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -10,9 +10,11 @@ multiqc/multiqc_report.html fastqc/*_fastqc.{html,zip} pipeline_info/*.{html,json,txt,yml} **/simpleaf_quant/** -**/*.html -**/outs/*.{json,txt,yml,csv,tab,bam,bai,h5,fai,cloupe} +**/**.{html,json,bus} +**/**.Log.* +**/outs/**.{json,txt,yml,csv,tab,bam,bai,h5,fai,cloupe,pb} **/analysis/** **/genomeParameters.txt **/atac_*.{gz,tbi,bed} -**/10k_PBMC_lib.csv \ No newline at end of file +**/10k_PBMC_lib.csv +**/cellrangermulti/**combined_* \ No newline at end of file diff --git a/tests/main_pipeline_cellrangermulti.nf.test b/tests/main_pipeline_cellrangermulti.nf.test index 5cdd438b..444af7f1 100644 --- a/tests/main_pipeline_cellrangermulti.nf.test +++ b/tests/main_pipeline_cellrangermulti.nf.test @@ -25,164 +25,23 @@ nextflow_pipeline { } 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}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( - - // - // General assertions - // - - // Did it finish successfully? - {assert workflow.success}, - - // How many tasks were executed? - {assert workflow.trace.tasks().size() == 57}, - - // How many results were produced? - {assert path("${outputDir}/results_cellrangermulti").list().size() == 4}, - {assert path("${outputDir}/results_cellrangermulti/cellrangermulti").list().size() == 5}, - {assert path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions").list().size() == 16}, - {assert path("${outputDir}/results_cellrangermulti/cellrangermulti/count").list().size() == 4}, - {assert path("${outputDir}/results_cellrangermulti/fastqc").list().size() == 48}, - {assert path("${outputDir}/results_cellrangermulti/multiqc").list().size() == 3}, - - // - // Check if files were produced - // - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/4PLEX_HUMAN/4PLEX_HUMAN_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Colorectal_BC3/Colorectal_BC3_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Colorectal_BC3/Colorectal_BC3_filtered_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Liver_BC1/Liver_BC1_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Liver_BC1/Liver_BC1_filtered_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Ovarian_BC2/Ovarian_BC2_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Ovarian_BC2/Ovarian_BC2_filtered_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K/PBMC_10K_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K/PBMC_10K_filtered_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMO/PBMC_10K_CMO_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMO_PBMCs_human_1/PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMO_PBMCs_human_2/PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMV/PBMC_10K_CMV_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMV/PBMC_10K_CMV_filtered_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Pancreas_BC4/Pancreas_BC4_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Pancreas_BC4/Pancreas_BC4_filtered_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/combined_raw_matrix.h5ad" ).exists()}, - {assert new File( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/combined_filtered_matrix.h5ad" ).exists()}, - - // - // Check if files are the same - // - {assert snapshot( - // barcodes.tsv.gz files - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/multi/count/raw_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_raw_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_raw_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_raw_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_raw_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K/outs/multi/count/raw_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMO/outs/multi/count/raw_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMV/outs/multi/count/raw_feature_bc_matrix/barcodes.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz" ), - - // features.tsv.gz files - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/multi/count/raw_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_filtered_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_raw_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_filtered_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_raw_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_filtered_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_raw_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_filtered_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_raw_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K/outs/multi/count/raw_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/sample_filtered_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMO/outs/multi/count/raw_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/sample_filtered_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/sample_filtered_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMV/outs/multi/count/raw_feature_bc_matrix/features.tsv.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/sample_filtered_feature_bc_matrix/features.tsv.gz" ), - - // matrix.mtx.gz files - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/multi/count/raw_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_raw_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_raw_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_raw_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_raw_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K/outs/multi/count/raw_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMO/outs/multi/count/raw_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMV/outs/multi/count/raw_feature_bc_matrix/matrix.mtx.gz" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz" ), - - // metrics_summary.csv files - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/metrics_summary.csv" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/metrics_summary.csv" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/metrics_summary.csv" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/metrics_summary.csv" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/metrics_summary.csv" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/metrics_summary.csv" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/metrics_summary.csv" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/metrics_summary.csv" ), - - // .rds files - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/4PLEX_HUMAN/4PLEX_HUMAN_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/4PLEX_HUMAN/4PLEX_HUMAN_raw_matrix.sce.rds" ), - - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Colorectal_BC3/Colorectal_BC3_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Colorectal_BC3/Colorectal_BC3_raw_matrix.sce.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Colorectal_BC3/Colorectal_BC3_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Colorectal_BC3/Colorectal_BC3_filtered_matrix.sce.rds" ), - - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Liver_BC1/Liver_BC1_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Liver_BC1/Liver_BC1_raw_matrix.sce.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Liver_BC1/Liver_BC1_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Liver_BC1/Liver_BC1_filtered_matrix.sce.rds" ), - - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Ovarian_BC2/Ovarian_BC2_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Ovarian_BC2/Ovarian_BC2_raw_matrix.sce.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Ovarian_BC2/Ovarian_BC2_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Ovarian_BC2/Ovarian_BC2_filtered_matrix.sce.rds" ), - - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K/PBMC_10K_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K/PBMC_10K_raw_matrix.sce.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K/PBMC_10K_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K/PBMC_10K_filtered_matrix.sce.rds" ), - - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMO/PBMC_10K_CMO_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMO/PBMC_10K_CMO_raw_matrix.sce.rds" ), - - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMO_PBMCs_human_1/PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMO_PBMCs_human_1/PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.sce.rds" ), - - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMO_PBMCs_human_2/PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMO_PBMCs_human_2/PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.sce.rds" ), - - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMV/PBMC_10K_CMV_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMV/PBMC_10K_CMV_raw_matrix.sce.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMV/PBMC_10K_CMV_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/PBMC_10K_CMV/PBMC_10K_CMV_filtered_matrix.sce.rds" ), - - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Pancreas_BC4/Pancreas_BC4_raw_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Pancreas_BC4/Pancreas_BC4_raw_matrix.sce.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Pancreas_BC4/Pancreas_BC4_filtered_matrix.seurat.rds" ), - path( "${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/Pancreas_BC4/Pancreas_BC4_filtered_matrix.sce.rds" ) - - ).match()} - - ) // end of 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 test pipelines on multiple Nextflow versions + removeNextflowVersion("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path + ).match() } + ) } } @@ -204,85 +63,22 @@ nextflow_pipeline { } 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}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( - { assert workflow.success }, - { assert workflow.trace.tasks().size() == 32 }, - - // directory checks - { assert path("${outputDir}/results_cellrangermulti/fastqc").list().size() == 24 }, - { assert path("${outputDir}/results_cellrangermulti/multiqc").list().size() == 3 }, - { assert path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions").list().size() == 11 }, - - // key output files - { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mkgtf/Rattus_norvegicus.GRCr8.dna.primary_assembly.6_genes.filtered.gtf").exists() }, - { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mkref/gex_reference/reference.json").exists() }, - { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mkvdjref/vdj_reference/reference.json").exists() }, - - // .h5ad existence checks - { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/10k_Wistar_Rat/10k_Wistar_Rat_raw_matrix.h5ad").exists() }, - - { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1/2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.h5ad").exists() }, - { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1/2500_Wistar_Rat_PBMCs_gem-x_OB1_raw_matrix.h5ad").exists() }, - - { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2/2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.h5ad").exists() }, - { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2/2500_Wistar_Rat_PBMCs_gem-x_OB2_raw_matrix.h5ad").exists() }, - - { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3/2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.h5ad").exists() }, - { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3/2500_Wistar_Rat_PBMCs_gem-x_OB3_raw_matrix.h5ad").exists() }, - - { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.h5ad").exists() }, - { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_raw_matrix.h5ad").exists() }, - - { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/combined_filtered_matrix.h5ad").exists() }, - { assert new File("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/combined_raw_matrix.h5ad").exists() }, - - // snapshot matching check + { assert workflow.success}, { assert snapshot( - // .rds files - path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/10k_Wistar_Rat/10k_Wistar_Rat_raw_matrix.seurat.rds"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/10k_Wistar_Rat/10k_Wistar_Rat_raw_matrix.sce.rds"), - - path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1/2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.seurat.rds"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1/2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.sce.rds"), - - path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2/2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.seurat.rds"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2/2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.sce.rds"), - - path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3/2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.seurat.rds"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3/2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.sce.rds"), - - path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.seurat.rds"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.sce.rds"), - - // metrics - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/metrics_summary.csv"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/metrics_summary.csv"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/metrics_summary.csv"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/metrics_summary.csv"), - - // Matrix text files (raw & filtered) - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/raw_feature_bc_matrix/barcodes.tsv.gz"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/raw_feature_bc_matrix/features.tsv.gz"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/raw_feature_bc_matrix/matrix.mtx.gz"), - - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_filtered_feature_bc_matrix/features.tsv.gz"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz"), - - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_filtered_feature_bc_matrix/features.tsv.gz"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz"), - - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_filtered_feature_bc_matrix/features.tsv.gz"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz"), - - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_filtered_feature_bc_matrix/features.tsv.gz"), - path("${outputDir}/results_cellrangermulti/cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz") + // Number of successful tasks + workflow.trace.succeeded().size(), + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path ).match() } - ) } } diff --git a/tests/main_pipeline_cellrangermulti.nf.test.snap b/tests/main_pipeline_cellrangermulti.nf.test.snap index a952f554..15168d84 100644 --- a/tests/main_pipeline_cellrangermulti.nf.test.snap +++ b/tests/main_pipeline_cellrangermulti.nf.test.snap @@ -1,137 +1,1875 @@ { "test-dataset_cellrangermulti_aligner_human": { "content": [ - "barcodes.tsv.gz:md5,a3937e73aa76a2acff554ca2f81a108d", - "barcodes.tsv.gz:md5,b729c635b9ec993dd3e9c0602b440016", - "barcodes.tsv.gz:md5,74ccf55411109ed9c3f2b6f73ae91ddc", - "barcodes.tsv.gz:md5,84597a29c9e3e8d2e9971dcd2154fea8", - "barcodes.tsv.gz:md5,38f51384d30e3b17d8de54aeac6c1ade", - "barcodes.tsv.gz:md5,23f4f5264971fe924da6d93016a9747d", - "barcodes.tsv.gz:md5,e7f625d70338d98ff8e8736e35338770", - "barcodes.tsv.gz:md5,5088a4668ec6c06b357e54ea61a2266a", - "barcodes.tsv.gz:md5,6d34a94fa5fc5cab362dbb1b5c8ed5d6", - "barcodes.tsv.gz:md5,177c1fbf4052a9cee2019179f51d9294", - "barcodes.tsv.gz:md5,e7ca00fa3842c7e6ed855fb901444637", - "barcodes.tsv.gz:md5,98d07b680d1d7dc3332bac246274bdbc", - "barcodes.tsv.gz:md5,9fe9a4e1467cec5c456bdffebcfc6955", - "barcodes.tsv.gz:md5,7513f5ba4f9a400c4f7500f83cad1ee6", - "barcodes.tsv.gz:md5,a5294c876fa976c7bb84dcd580cb42d5", - "barcodes.tsv.gz:md5,2035ad842ed2fd904cb4e5913a9a8400", - "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", - "features.tsv.gz:md5,265e218cf1202f2563997fe2bf64efcb", - "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", - "features.tsv.gz:md5,265e218cf1202f2563997fe2bf64efcb", - "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", - "features.tsv.gz:md5,265e218cf1202f2563997fe2bf64efcb", - "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", - "features.tsv.gz:md5,265e218cf1202f2563997fe2bf64efcb", - "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", - "features.tsv.gz:md5,a5781c6331d8b63153bbca34b6942020", - "features.tsv.gz:md5,a5781c6331d8b63153bbca34b6942020", - "features.tsv.gz:md5,824fe0b73fc8a383152a792f84f6ca84", - "features.tsv.gz:md5,824fe0b73fc8a383152a792f84f6ca84", - "features.tsv.gz:md5,824fe0b73fc8a383152a792f84f6ca84", - "features.tsv.gz:md5,a5781c6331d8b63153bbca34b6942020", - "features.tsv.gz:md5,a5781c6331d8b63153bbca34b6942020", - "matrix.mtx.gz:md5,5da308e2bf76dcd5c270ec8dcf849c17", - "matrix.mtx.gz:md5,95a5485bf5636ca5e3d462e800acea59", - "matrix.mtx.gz:md5,147400e1d64b4fe1f00ffff0b8af5516", - "matrix.mtx.gz:md5,d70c1fdacadf6734720bf01a7d68a4d7", - "matrix.mtx.gz:md5,d5fe7ae28ba054db26002562e2bea161", - "matrix.mtx.gz:md5,82f2c40fa0b97b15778e4e88b874f275", - "matrix.mtx.gz:md5,fdba80421a6e0084f16fa87cc9f28c41", - "matrix.mtx.gz:md5,6646c5c63dd73c0ee6e368876a90bc2e", - "matrix.mtx.gz:md5,1cf58834ca554013578536c95383a723", - "matrix.mtx.gz:md5,ca688c20ea2ab390abd74f8748703a35", - "matrix.mtx.gz:md5,e6a165fd2fe8098abd8584a156ad4975", - "matrix.mtx.gz:md5,0ef39394ae6cfb79ec3d295728c93abe", - "matrix.mtx.gz:md5,b430b379304458b677214b643b5e5210", - "matrix.mtx.gz:md5,9ead16868dacff50047a57ca2e577ead", - "matrix.mtx.gz:md5,35b2eae12908ea73ec4da3d1fe12c708", - "matrix.mtx.gz:md5,d92b09e5fa91a89acef20ebf70b6f948", - "metrics_summary.csv:md5,4112c534568462447160543d827129ee", - "metrics_summary.csv:md5,d9a3e8b60a329199f907b97aed9ae6c0", - "metrics_summary.csv:md5,9140bfc9e12111b406eaf86c11e88790", - "metrics_summary.csv:md5,5add678e88d98bece089c50c695f467c", - "metrics_summary.csv:md5,1dbfa3d695d1a5a7e4bacec22f95889c", - "metrics_summary.csv:md5,fdd327a5155543949a6f2322907501b7", - "metrics_summary.csv:md5,7cd35fdb25c2908b975e0893630a5d3f", - "metrics_summary.csv:md5,23b9f1807f2a47d52f048fc3afb202aa", - "4PLEX_HUMAN_raw_matrix.seurat.rds:md5,acc22e948a2250907897f79e008ff3ea", - "4PLEX_HUMAN_raw_matrix.sce.rds:md5,084ac812ebb69ca3152abd2c7226d739", - "Colorectal_BC3_raw_matrix.seurat.rds:md5,0d6a6222daf2b03cba426cb80b86914c", - "Colorectal_BC3_raw_matrix.sce.rds:md5,b00d8244f06eef3e5d0fae39c9e14196", - "Colorectal_BC3_filtered_matrix.seurat.rds:md5,ba8256b3a51477018f9c1e4e1aeec336", - "Colorectal_BC3_filtered_matrix.sce.rds:md5,91bf1e7978c8a0601230a5d37c50e402", - "Liver_BC1_raw_matrix.seurat.rds:md5,826973ce82225e8942a823e18dbe01fd", - "Liver_BC1_raw_matrix.sce.rds:md5,4806e7f7e00af77c9eb0e2666cedc96c", - "Liver_BC1_filtered_matrix.seurat.rds:md5,ce4a4c9cbd490e867771416b4ce6f458", - "Liver_BC1_filtered_matrix.sce.rds:md5,3f40a160ca908672593106cdceda3dc1", - "Ovarian_BC2_raw_matrix.seurat.rds:md5,f107fd3e315a04aec3e6e53650c456f8", - "Ovarian_BC2_raw_matrix.sce.rds:md5,e30869371d77941b1d009fd6983b5c43", - "Ovarian_BC2_filtered_matrix.seurat.rds:md5,b0a507b5d0b182681517c332177250ef", - "Ovarian_BC2_filtered_matrix.sce.rds:md5,89518a94b4f908632433308311d02a37", - "PBMC_10K_raw_matrix.seurat.rds:md5,97d5d0bc88db1df05b7effcb9dbb31cc", - "PBMC_10K_raw_matrix.sce.rds:md5,4b3fe0fbda8a80eafc372bd895c26ec0", - "PBMC_10K_filtered_matrix.seurat.rds:md5,dc780d878e2abae61b10eba5218116b8", - "PBMC_10K_filtered_matrix.sce.rds:md5,1f2f3072ede853dd5f6c47821fc39543", - "PBMC_10K_CMO_raw_matrix.seurat.rds:md5,617b0af6bd53f58e7d0be91660bae3b3", - "PBMC_10K_CMO_raw_matrix.sce.rds:md5,5c399342646e41ba7482dd1926eac1bf", - "PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.seurat.rds:md5,8deeddcbb64b2a665372f2dd82a60ba3", - "PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.sce.rds:md5,13d26c26a3967c415f539890a935fa7e", - "PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.seurat.rds:md5,489181148d714944670abd1f6a3f4e10", - "PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.sce.rds:md5,ede457b9d84ed34cf892806bb9f5287e", - "PBMC_10K_CMV_raw_matrix.seurat.rds:md5,7b731e32655cace681ace140e3ef9af3", - "PBMC_10K_CMV_raw_matrix.sce.rds:md5,75baf36779b04ed941b97b644125a2ff", - "PBMC_10K_CMV_filtered_matrix.seurat.rds:md5,4dfa3f7aa87706e23a04248349292dc1", - "PBMC_10K_CMV_filtered_matrix.sce.rds:md5,cb78864bde8833c2e6323ff01eef3c15", - "Pancreas_BC4_raw_matrix.seurat.rds:md5,7f972f40b05824a3cff5449a8f9f8b61", - "Pancreas_BC4_raw_matrix.sce.rds:md5,4af114f068fc9bab8cceb3f25a9b6d9a", - "Pancreas_BC4_filtered_matrix.seurat.rds:md5,98eef51fc0c34fa1e055b04c5c92d2f0", - "Pancreas_BC4_filtered_matrix.sce.rds:md5,7d18f78c68f7c995b724ae3ba95ea862" + 57, + { + "CELLRANGER_MKGTF": { + "cellranger": "9.0.1" + }, + "CELLRANGER_MKREF": { + "cellranger": "9.0.1" + }, + "CELLRANGER_MKVDJREF": { + "cellranger": "9.0.1" + }, + "CELLRANGER_MULTI": { + "cellranger": "9.0.1 " + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "GUNZIP_FASTA": { + "gunzip": 1.1 + }, + "GUNZIP_GTF": { + "gunzip": 1.1 + }, + "MTX_TO_H5AD": { + "python": "3.12.5", + "scanpy": "1.10.2", + "pandas": "2.2.2", + "anndata": "0.10.8" + }, + "Workflow": { + "nf-core/scrnaseq": "v4.1.0dev" + } + }, + [ + "", + "cellrangermulti", + "cellrangermulti/count", + "cellrangermulti/count/4PLEX_HUMAN", + "cellrangermulti/count/4PLEX_HUMAN/outs", + "cellrangermulti/count/4PLEX_HUMAN/outs/config.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi/count", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi/count/raw_cloupe.cloupe", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi/count/raw_feature_bc_matrix", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi/count/raw_feature_bc_matrix.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi/count/raw_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi/count/raw_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi/count/raw_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi/count/raw_molecule_info.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi/count/raw_probe_bc_matrix.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi/count/unassigned_alignments.bam", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi/count/unassigned_alignments.bam.bai", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi/multiplexing_analysis", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi/multiplexing_analysis/cells_per_tag.json", + "cellrangermulti/count/4PLEX_HUMAN/outs/multi/multiplexing_analysis/frp_gem_barcode_overlap.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_graphclust", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_graphclust/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_10_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_2_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_3_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_4_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_5_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_6_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_7_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_8_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/clustering/gene_expression_kmeans_9_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_graphclust", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_graphclust/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_10_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_2_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_3_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_4_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_5_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_6_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_7_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_8_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/diffexp/gene_expression_kmeans_9_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/pca", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/pca/gene_expression_10_components", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/pca/gene_expression_10_components/components.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/pca/gene_expression_10_components/dispersion.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/pca/gene_expression_10_components/features_selected.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/pca/gene_expression_10_components/projection.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/pca/gene_expression_10_components/variance.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/tsne", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/tsne/gene_expression_2_components", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/tsne/gene_expression_2_components/projection.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/umap", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/umap/gene_expression_2_components", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/analysis/umap/gene_expression_2_components/projection.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/probe_set.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_alignments.bam", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_alignments.bam.bai", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_cloupe.cloupe", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_filtered_barcodes.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_filtered_feature_bc_matrix", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_filtered_feature_bc_matrix.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_filtered_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_molecule_info.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_raw_feature_bc_matrix", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_raw_feature_bc_matrix.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_raw_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_raw_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_raw_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/count/sample_raw_probe_bc_matrix.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/metrics_summary.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Colorectal_BC3/web_summary.html", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_graphclust", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_graphclust/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_10_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_2_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_3_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_4_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_5_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_6_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_7_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_8_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/clustering/gene_expression_kmeans_9_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_graphclust", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_graphclust/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_10_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_2_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_3_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_4_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_5_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_6_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_7_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_8_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/diffexp/gene_expression_kmeans_9_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/pca", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/pca/gene_expression_10_components", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/pca/gene_expression_10_components/components.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/pca/gene_expression_10_components/dispersion.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/pca/gene_expression_10_components/features_selected.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/pca/gene_expression_10_components/projection.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/pca/gene_expression_10_components/variance.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/tsne", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/tsne/gene_expression_2_components", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/tsne/gene_expression_2_components/projection.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/umap", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/umap/gene_expression_2_components", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/analysis/umap/gene_expression_2_components/projection.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/probe_set.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_alignments.bam", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_alignments.bam.bai", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_cloupe.cloupe", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_filtered_barcodes.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_filtered_feature_bc_matrix", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_filtered_feature_bc_matrix.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_filtered_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_molecule_info.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_raw_feature_bc_matrix", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_raw_feature_bc_matrix.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_raw_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_raw_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_raw_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/count/sample_raw_probe_bc_matrix.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/metrics_summary.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Liver_BC1/web_summary.html", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_graphclust", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_graphclust/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_10_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_2_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_3_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_4_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_5_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_6_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_7_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_8_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/clustering/gene_expression_kmeans_9_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_graphclust", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_graphclust/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_10_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_2_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_3_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_4_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_5_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_6_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_7_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_8_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/diffexp/gene_expression_kmeans_9_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/pca", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/pca/gene_expression_10_components", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/pca/gene_expression_10_components/components.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/pca/gene_expression_10_components/dispersion.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/pca/gene_expression_10_components/features_selected.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/pca/gene_expression_10_components/projection.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/pca/gene_expression_10_components/variance.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/tsne", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/tsne/gene_expression_2_components", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/tsne/gene_expression_2_components/projection.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/umap", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/umap/gene_expression_2_components", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/analysis/umap/gene_expression_2_components/projection.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/probe_set.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_alignments.bam", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_alignments.bam.bai", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_cloupe.cloupe", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_filtered_barcodes.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_filtered_feature_bc_matrix", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_filtered_feature_bc_matrix.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_filtered_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_molecule_info.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_raw_feature_bc_matrix", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_raw_feature_bc_matrix.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_raw_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_raw_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_raw_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/count/sample_raw_probe_bc_matrix.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/metrics_summary.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Ovarian_BC2/web_summary.html", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_graphclust", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_graphclust/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_10_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_2_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_3_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_4_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_5_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_6_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_7_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_8_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/clustering/gene_expression_kmeans_9_clusters/clusters.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_graphclust", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_graphclust/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_10_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_2_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_3_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_4_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_5_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_6_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_7_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_8_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/diffexp/gene_expression_kmeans_9_clusters/differential_expression.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/pca", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/pca/gene_expression_10_components", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/pca/gene_expression_10_components/components.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/pca/gene_expression_10_components/dispersion.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/pca/gene_expression_10_components/features_selected.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/pca/gene_expression_10_components/projection.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/pca/gene_expression_10_components/variance.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/tsne", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/tsne/gene_expression_2_components", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/tsne/gene_expression_2_components/projection.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/umap", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/umap/gene_expression_2_components", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/analysis/umap/gene_expression_2_components/projection.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/probe_set.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_alignments.bam", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_alignments.bam.bai", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_cloupe.cloupe", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_filtered_barcodes.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_filtered_feature_bc_matrix", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_filtered_feature_bc_matrix.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_filtered_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_molecule_info.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_raw_feature_bc_matrix", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_raw_feature_bc_matrix.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_raw_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_raw_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_raw_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/count/sample_raw_probe_bc_matrix.h5", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/metrics_summary.csv", + "cellrangermulti/count/4PLEX_HUMAN/outs/per_sample_outs/Pancreas_BC4/web_summary.html", + "cellrangermulti/count/PBMC_10K", + "cellrangermulti/count/PBMC_10K/outs", + "cellrangermulti/count/PBMC_10K/outs/config.csv", + "cellrangermulti/count/PBMC_10K/outs/multi", + "cellrangermulti/count/PBMC_10K/outs/multi/count", + "cellrangermulti/count/PBMC_10K/outs/multi/count/feature_reference.csv", + "cellrangermulti/count/PBMC_10K/outs/multi/count/raw_cloupe.cloupe", + "cellrangermulti/count/PBMC_10K/outs/multi/count/raw_feature_bc_matrix", + "cellrangermulti/count/PBMC_10K/outs/multi/count/raw_feature_bc_matrix.h5", + "cellrangermulti/count/PBMC_10K/outs/multi/count/raw_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/PBMC_10K/outs/multi/count/raw_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/PBMC_10K/outs/multi/count/raw_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/PBMC_10K/outs/multi/count/raw_molecule_info.h5", + "cellrangermulti/count/PBMC_10K/outs/multi/count/unassigned_alignments.bam", + "cellrangermulti/count/PBMC_10K/outs/multi/count/unassigned_alignments.bam.bai", + "cellrangermulti/count/PBMC_10K/outs/multi/vdj_b", + "cellrangermulti/count/PBMC_10K/outs/multi/vdj_b/all_contig.bam", + "cellrangermulti/count/PBMC_10K/outs/multi/vdj_b/all_contig.bam.bai", + "cellrangermulti/count/PBMC_10K/outs/multi/vdj_b/all_contig.fasta", + "cellrangermulti/count/PBMC_10K/outs/multi/vdj_b/all_contig.fasta.fai", + "cellrangermulti/count/PBMC_10K/outs/multi/vdj_b/all_contig.fastq", + "cellrangermulti/count/PBMC_10K/outs/multi/vdj_b/all_contig_annotations.bed", + "cellrangermulti/count/PBMC_10K/outs/multi/vdj_b/all_contig_annotations.csv", + "cellrangermulti/count/PBMC_10K/outs/multi/vdj_b/all_contig_annotations.json", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_graphclust", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_graphclust/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_10_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_10_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_2_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_2_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_3_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_3_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_4_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_4_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_5_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_5_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_6_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_6_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_7_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_7_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_8_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_8_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_9_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/antibody_capture_kmeans_9_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_graphclust", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_graphclust/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_10_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_2_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_3_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_4_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_5_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_6_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_7_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_8_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/clustering/gene_expression_kmeans_9_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_graphclust", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_graphclust/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_10_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_10_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_2_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_2_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_3_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_3_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_4_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_4_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_5_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_5_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_6_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_6_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_7_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_7_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_8_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_8_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_9_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/antibody_capture_kmeans_9_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_graphclust", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_graphclust/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_10_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_2_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_3_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_4_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_5_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_6_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_7_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_8_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/diffexp/gene_expression_kmeans_9_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/pca", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/pca/antibody_capture_6_components", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/pca/antibody_capture_6_components/components.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/pca/antibody_capture_6_components/dispersion.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/pca/antibody_capture_6_components/features_selected.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/pca/antibody_capture_6_components/projection.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/pca/antibody_capture_6_components/variance.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/pca/gene_expression_10_components", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/pca/gene_expression_10_components/components.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/pca/gene_expression_10_components/dispersion.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/pca/gene_expression_10_components/features_selected.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/pca/gene_expression_10_components/projection.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/pca/gene_expression_10_components/variance.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/tsne", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/tsne/antibody_capture_2_components", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/tsne/antibody_capture_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/tsne/gene_expression_2_components", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/tsne/gene_expression_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/umap", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/umap/antibody_capture_2_components", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/umap/antibody_capture_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/umap/gene_expression_2_components", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/analysis/umap/gene_expression_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/feature_reference.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/sample_alignments.bam", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/sample_alignments.bam.bai", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/sample_cloupe.cloupe", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/sample_filtered_barcodes.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/sample_filtered_feature_bc_matrix", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/sample_filtered_feature_bc_matrix.h5", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/sample_filtered_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/count/sample_molecule_info.h5", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/metrics_summary.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/airr_rearrangement.tsv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/cell_barcodes.json", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/clonotypes.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/concat_ref.bam", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/concat_ref.bam.bai", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/concat_ref.fasta", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/concat_ref.fasta.fai", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/consensus.bam", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/consensus.bam.bai", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/consensus.fasta", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/consensus.fasta.fai", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/consensus_annotations.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/donor_regions.fa", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/filtered_contig.fasta", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/filtered_contig.fastq", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/filtered_contig_annotations.csv", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/vdj_b/vdj_contig_info.pb", + "cellrangermulti/count/PBMC_10K/outs/per_sample_outs/PBMC_10K/web_summary.html", + "cellrangermulti/count/PBMC_10K/outs/vdj_reference", + "cellrangermulti/count/PBMC_10K/outs/vdj_reference/fasta", + "cellrangermulti/count/PBMC_10K/outs/vdj_reference/fasta/regions.fa", + "cellrangermulti/count/PBMC_10K/outs/vdj_reference/reference.json", + "cellrangermulti/count/PBMC_10K_CMO", + "cellrangermulti/count/PBMC_10K_CMO/outs", + "cellrangermulti/count/PBMC_10K_CMO/outs/config.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/count", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/count/feature_reference.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/count/raw_cloupe.cloupe", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/count/raw_feature_bc_matrix", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/count/raw_feature_bc_matrix.h5", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/count/raw_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/count/raw_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/count/raw_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/count/raw_molecule_info.h5", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/count/unassigned_alignments.bam", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/count/unassigned_alignments.bam.bai", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/multiplexing_analysis", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/multiplexing_analysis/assignment_confidence_table.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/multiplexing_analysis/cells_per_tag.json", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/multiplexing_analysis/tag_calls_per_cell.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/multi/multiplexing_analysis/tag_calls_summary.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_graphclust", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_graphclust/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_10_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_2_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_3_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_4_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_5_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_6_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_7_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_8_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/clustering/gene_expression_kmeans_9_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_graphclust", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_graphclust/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_10_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_2_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_3_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_4_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_5_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_6_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_7_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_8_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/diffexp/gene_expression_kmeans_9_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/pca", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/pca/gene_expression_10_components", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/pca/gene_expression_10_components/components.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/pca/gene_expression_10_components/dispersion.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/pca/gene_expression_10_components/features_selected.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/pca/gene_expression_10_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/pca/gene_expression_10_components/variance.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/pca/multiplexing_capture_3_components", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/pca/multiplexing_capture_3_components/components.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/pca/multiplexing_capture_3_components/dispersion.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/pca/multiplexing_capture_3_components/features_selected.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/pca/multiplexing_capture_3_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/pca/multiplexing_capture_3_components/variance.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/tsne", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/tsne/gene_expression_2_components", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/tsne/gene_expression_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/tsne/multiplexing_capture_2_components", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/tsne/multiplexing_capture_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/umap", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/umap/gene_expression_2_components", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/umap/gene_expression_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/umap/multiplexing_capture_2_components", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/analysis/umap/multiplexing_capture_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/feature_reference.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/sample_alignments.bam", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/sample_alignments.bam.bai", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/sample_cloupe.cloupe", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/sample_filtered_barcodes.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/sample_filtered_feature_bc_matrix", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/sample_filtered_feature_bc_matrix.h5", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/sample_filtered_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/count/sample_molecule_info.h5", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/metrics_summary.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_1/web_summary.html", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_graphclust", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_graphclust/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_10_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_2_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_3_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_4_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_5_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_6_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_7_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_8_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/clustering/gene_expression_kmeans_9_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_graphclust", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_graphclust/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_10_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_2_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_3_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_4_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_5_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_6_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_7_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_8_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/diffexp/gene_expression_kmeans_9_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/pca", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/pca/gene_expression_10_components", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/pca/gene_expression_10_components/components.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/pca/gene_expression_10_components/dispersion.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/pca/gene_expression_10_components/features_selected.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/pca/gene_expression_10_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/pca/gene_expression_10_components/variance.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/pca/multiplexing_capture_4_components", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/pca/multiplexing_capture_4_components/components.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/pca/multiplexing_capture_4_components/dispersion.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/pca/multiplexing_capture_4_components/features_selected.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/pca/multiplexing_capture_4_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/pca/multiplexing_capture_4_components/variance.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/tsne", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/tsne/gene_expression_2_components", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/tsne/gene_expression_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/tsne/multiplexing_capture_2_components", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/tsne/multiplexing_capture_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/umap", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/umap/gene_expression_2_components", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/umap/gene_expression_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/umap/multiplexing_capture_2_components", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/analysis/umap/multiplexing_capture_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/feature_reference.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/sample_alignments.bam", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/sample_alignments.bam.bai", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/sample_cloupe.cloupe", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/sample_filtered_barcodes.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/sample_filtered_feature_bc_matrix", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/sample_filtered_feature_bc_matrix.h5", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/sample_filtered_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/count/sample_molecule_info.h5", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/metrics_summary.csv", + "cellrangermulti/count/PBMC_10K_CMO/outs/per_sample_outs/PBMC_10K_CMO_PBMCs_human_2/web_summary.html", + "cellrangermulti/count/PBMC_10K_CMV", + "cellrangermulti/count/PBMC_10K_CMV/outs", + "cellrangermulti/count/PBMC_10K_CMV/outs/config.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/count", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/count/feature_reference.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/count/raw_cloupe.cloupe", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/count/raw_feature_bc_matrix", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/count/raw_feature_bc_matrix.h5", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/count/raw_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/count/raw_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/count/raw_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/count/raw_molecule_info.h5", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/count/unassigned_alignments.bam", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/count/unassigned_alignments.bam.bai", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/vdj_t", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/vdj_t/all_contig.bam", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/vdj_t/all_contig.bam.bai", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/vdj_t/all_contig.fasta", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/vdj_t/all_contig.fastq", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/vdj_t/all_contig_annotations.bed", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/vdj_t/all_contig_annotations.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/multi/vdj_t/all_contig_annotations.json", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_graphclust", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_graphclust/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_10_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_10_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_2_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_2_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_3_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_3_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_4_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_4_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_5_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_5_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_6_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_6_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_7_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_7_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_8_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_8_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_9_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/antibody_capture_kmeans_9_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_graphclust", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_graphclust/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_10_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_2_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_3_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_4_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_5_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_6_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_7_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_8_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/clustering/gene_expression_kmeans_9_clusters/clusters.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_graphclust", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_graphclust/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_10_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_10_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_2_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_2_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_3_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_3_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_4_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_4_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_5_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_5_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_6_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_6_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_7_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_7_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_8_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_8_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_9_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/antibody_capture_kmeans_9_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_graphclust", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_graphclust/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_10_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_2_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_3_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_4_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_5_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_6_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_7_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_8_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/diffexp/gene_expression_kmeans_9_clusters/differential_expression.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/pca", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/pca/antibody_capture_10_components", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/pca/antibody_capture_10_components/components.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/pca/antibody_capture_10_components/dispersion.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/pca/antibody_capture_10_components/features_selected.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/pca/antibody_capture_10_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/pca/antibody_capture_10_components/variance.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/pca/gene_expression_10_components", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/pca/gene_expression_10_components/components.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/pca/gene_expression_10_components/dispersion.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/pca/gene_expression_10_components/features_selected.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/pca/gene_expression_10_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/pca/gene_expression_10_components/variance.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/tsne", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/tsne/antibody_capture_2_components", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/tsne/antibody_capture_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/tsne/gene_expression_2_components", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/tsne/gene_expression_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/umap", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/umap/antibody_capture_2_components", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/umap/antibody_capture_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/umap/gene_expression_2_components", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/analysis/umap/gene_expression_2_components/projection.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/feature_reference.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/sample_alignments.bam", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/sample_alignments.bam.bai", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/sample_cloupe.cloupe", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/sample_filtered_barcodes.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/sample_filtered_feature_bc_matrix", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/sample_filtered_feature_bc_matrix.h5", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/sample_filtered_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/count/sample_molecule_info.h5", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/metrics_summary.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/airr_rearrangement.tsv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/cell_barcodes.json", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/clonotypes.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/concat_ref.bam", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/concat_ref.bam.bai", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/concat_ref.fasta", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/concat_ref.fasta.fai", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/consensus.bam", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/consensus.bam.bai", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/consensus.fasta", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/consensus.fasta.fai", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/consensus_annotations.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/donor_regions.fa", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/filtered_contig.fasta", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/filtered_contig.fastq", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/filtered_contig_annotations.csv", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/vdj_t/vdj_contig_info.pb", + "cellrangermulti/count/PBMC_10K_CMV/outs/per_sample_outs/PBMC_10K_CMV/web_summary.html", + "cellrangermulti/count/PBMC_10K_CMV/outs/vdj_reference", + "cellrangermulti/count/PBMC_10K_CMV/outs/vdj_reference/fasta", + "cellrangermulti/count/PBMC_10K_CMV/outs/vdj_reference/fasta/regions.fa", + "cellrangermulti/count/PBMC_10K_CMV/outs/vdj_reference/reference.json", + "cellrangermulti/mkgtf", + "cellrangermulti/mkgtf/Homo_sapiens.GRCh38.dna.chromosome.14_genes.filtered.gtf", + "cellrangermulti/mkref", + "cellrangermulti/mkref/gex_reference", + "cellrangermulti/mkref/gex_reference/fasta", + "cellrangermulti/mkref/gex_reference/fasta/genome.fa", + "cellrangermulti/mkref/gex_reference/fasta/genome.fa.fai", + "cellrangermulti/mkref/gex_reference/genes", + "cellrangermulti/mkref/gex_reference/genes/genes.gtf.gz", + "cellrangermulti/mkref/gex_reference/reference.json", + "cellrangermulti/mkref/gex_reference/star", + "cellrangermulti/mkref/gex_reference/star/Genome", + "cellrangermulti/mkref/gex_reference/star/SA", + "cellrangermulti/mkref/gex_reference/star/SAindex", + "cellrangermulti/mkref/gex_reference/star/chrLength.txt", + "cellrangermulti/mkref/gex_reference/star/chrName.txt", + "cellrangermulti/mkref/gex_reference/star/chrNameLength.txt", + "cellrangermulti/mkref/gex_reference/star/chrStart.txt", + "cellrangermulti/mkref/gex_reference/star/exonGeTrInfo.tab", + "cellrangermulti/mkref/gex_reference/star/exonInfo.tab", + "cellrangermulti/mkref/gex_reference/star/geneInfo.tab", + "cellrangermulti/mkref/gex_reference/star/genomeParameters.txt", + "cellrangermulti/mkref/gex_reference/star/sjdbInfo.txt", + "cellrangermulti/mkref/gex_reference/star/sjdbList.fromGTF.out.tab", + "cellrangermulti/mkref/gex_reference/star/sjdbList.out.tab", + "cellrangermulti/mkref/gex_reference/star/transcriptInfo.tab", + "cellrangermulti/mkref/versions.yml", + "cellrangermulti/mkvdjref", + "cellrangermulti/mkvdjref/vdj_reference", + "cellrangermulti/mkvdjref/vdj_reference/fasta", + "cellrangermulti/mkvdjref/vdj_reference/fasta/regions.fa", + "cellrangermulti/mkvdjref/vdj_reference/reference.json", + "cellrangermulti/mtx_conversions", + "cellrangermulti/mtx_conversions/4PLEX_HUMAN", + "cellrangermulti/mtx_conversions/4PLEX_HUMAN/4PLEX_HUMAN_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/4PLEX_HUMAN/4PLEX_HUMAN_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/4PLEX_HUMAN/4PLEX_HUMAN_raw_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/Colorectal_BC3", + "cellrangermulti/mtx_conversions/Colorectal_BC3/Colorectal_BC3_filtered_matrix.h5ad", + "cellrangermulti/mtx_conversions/Colorectal_BC3/Colorectal_BC3_filtered_matrix.sce.rds", + "cellrangermulti/mtx_conversions/Colorectal_BC3/Colorectal_BC3_filtered_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/Colorectal_BC3/Colorectal_BC3_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/Colorectal_BC3/Colorectal_BC3_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/Colorectal_BC3/Colorectal_BC3_raw_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/Liver_BC1", + "cellrangermulti/mtx_conversions/Liver_BC1/Liver_BC1_filtered_matrix.h5ad", + "cellrangermulti/mtx_conversions/Liver_BC1/Liver_BC1_filtered_matrix.sce.rds", + "cellrangermulti/mtx_conversions/Liver_BC1/Liver_BC1_filtered_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/Liver_BC1/Liver_BC1_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/Liver_BC1/Liver_BC1_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/Liver_BC1/Liver_BC1_raw_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/Ovarian_BC2", + "cellrangermulti/mtx_conversions/Ovarian_BC2/Ovarian_BC2_filtered_matrix.h5ad", + "cellrangermulti/mtx_conversions/Ovarian_BC2/Ovarian_BC2_filtered_matrix.sce.rds", + "cellrangermulti/mtx_conversions/Ovarian_BC2/Ovarian_BC2_filtered_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/Ovarian_BC2/Ovarian_BC2_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/Ovarian_BC2/Ovarian_BC2_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/Ovarian_BC2/Ovarian_BC2_raw_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/PBMC_10K", + "cellrangermulti/mtx_conversions/PBMC_10K/PBMC_10K_filtered_matrix.h5ad", + "cellrangermulti/mtx_conversions/PBMC_10K/PBMC_10K_filtered_matrix.sce.rds", + "cellrangermulti/mtx_conversions/PBMC_10K/PBMC_10K_filtered_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/PBMC_10K/PBMC_10K_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/PBMC_10K/PBMC_10K_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/PBMC_10K/PBMC_10K_raw_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/PBMC_10K_CMO", + "cellrangermulti/mtx_conversions/PBMC_10K_CMO/PBMC_10K_CMO_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/PBMC_10K_CMO/PBMC_10K_CMO_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/PBMC_10K_CMO/PBMC_10K_CMO_raw_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/PBMC_10K_CMO_PBMCs_human_1", + "cellrangermulti/mtx_conversions/PBMC_10K_CMO_PBMCs_human_1/PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.h5ad", + "cellrangermulti/mtx_conversions/PBMC_10K_CMO_PBMCs_human_1/PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.sce.rds", + "cellrangermulti/mtx_conversions/PBMC_10K_CMO_PBMCs_human_1/PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/PBMC_10K_CMO_PBMCs_human_2", + "cellrangermulti/mtx_conversions/PBMC_10K_CMO_PBMCs_human_2/PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.h5ad", + "cellrangermulti/mtx_conversions/PBMC_10K_CMO_PBMCs_human_2/PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.sce.rds", + "cellrangermulti/mtx_conversions/PBMC_10K_CMO_PBMCs_human_2/PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/PBMC_10K_CMV", + "cellrangermulti/mtx_conversions/PBMC_10K_CMV/PBMC_10K_CMV_filtered_matrix.h5ad", + "cellrangermulti/mtx_conversions/PBMC_10K_CMV/PBMC_10K_CMV_filtered_matrix.sce.rds", + "cellrangermulti/mtx_conversions/PBMC_10K_CMV/PBMC_10K_CMV_filtered_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/PBMC_10K_CMV/PBMC_10K_CMV_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/PBMC_10K_CMV/PBMC_10K_CMV_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/PBMC_10K_CMV/PBMC_10K_CMV_raw_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/Pancreas_BC4", + "cellrangermulti/mtx_conversions/Pancreas_BC4/Pancreas_BC4_filtered_matrix.h5ad", + "cellrangermulti/mtx_conversions/Pancreas_BC4/Pancreas_BC4_filtered_matrix.sce.rds", + "cellrangermulti/mtx_conversions/Pancreas_BC4/Pancreas_BC4_filtered_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/Pancreas_BC4/Pancreas_BC4_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/Pancreas_BC4/Pancreas_BC4_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/Pancreas_BC4/Pancreas_BC4_raw_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/combined_filtered_matrix.h5ad", + "cellrangermulti/mtx_conversions/combined_filtered_matrix.sce.rds", + "cellrangermulti/mtx_conversions/combined_filtered_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/combined_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/combined_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/combined_raw_matrix.seurat.rds", + "fastqc", + "fastqc/4PLEX_HUMAN_gex_1_fastqc.html", + "fastqc/4PLEX_HUMAN_gex_1_fastqc.zip", + "fastqc/4PLEX_HUMAN_gex_2_fastqc.html", + "fastqc/4PLEX_HUMAN_gex_2_fastqc.zip", + "fastqc/4PLEX_HUMAN_gex_3_fastqc.html", + "fastqc/4PLEX_HUMAN_gex_3_fastqc.zip", + "fastqc/4PLEX_HUMAN_gex_4_fastqc.html", + "fastqc/4PLEX_HUMAN_gex_4_fastqc.zip", + "fastqc/4PLEX_HUMAN_gex_5_fastqc.html", + "fastqc/4PLEX_HUMAN_gex_5_fastqc.zip", + "fastqc/4PLEX_HUMAN_gex_6_fastqc.html", + "fastqc/4PLEX_HUMAN_gex_6_fastqc.zip", + "fastqc/4PLEX_HUMAN_gex_7_fastqc.html", + "fastqc/4PLEX_HUMAN_gex_7_fastqc.zip", + "fastqc/4PLEX_HUMAN_gex_8_fastqc.html", + "fastqc/4PLEX_HUMAN_gex_8_fastqc.zip", + "fastqc/PBMC_10K_CMO_cmo_1_fastqc.html", + "fastqc/PBMC_10K_CMO_cmo_1_fastqc.zip", + "fastqc/PBMC_10K_CMO_cmo_2_fastqc.html", + "fastqc/PBMC_10K_CMO_cmo_2_fastqc.zip", + "fastqc/PBMC_10K_CMO_gex_1_fastqc.html", + "fastqc/PBMC_10K_CMO_gex_1_fastqc.zip", + "fastqc/PBMC_10K_CMO_gex_2_fastqc.html", + "fastqc/PBMC_10K_CMO_gex_2_fastqc.zip", + "fastqc/PBMC_10K_CMV_ab_1_fastqc.html", + "fastqc/PBMC_10K_CMV_ab_1_fastqc.zip", + "fastqc/PBMC_10K_CMV_ab_2_fastqc.html", + "fastqc/PBMC_10K_CMV_ab_2_fastqc.zip", + "fastqc/PBMC_10K_CMV_gex_1_fastqc.html", + "fastqc/PBMC_10K_CMV_gex_1_fastqc.zip", + "fastqc/PBMC_10K_CMV_gex_2_fastqc.html", + "fastqc/PBMC_10K_CMV_gex_2_fastqc.zip", + "fastqc/PBMC_10K_CMV_vdj_1_fastqc.html", + "fastqc/PBMC_10K_CMV_vdj_1_fastqc.zip", + "fastqc/PBMC_10K_CMV_vdj_2_fastqc.html", + "fastqc/PBMC_10K_CMV_vdj_2_fastqc.zip", + "fastqc/PBMC_10K_ab_1_fastqc.html", + "fastqc/PBMC_10K_ab_1_fastqc.zip", + "fastqc/PBMC_10K_ab_2_fastqc.html", + "fastqc/PBMC_10K_ab_2_fastqc.zip", + "fastqc/PBMC_10K_gex_1_fastqc.html", + "fastqc/PBMC_10K_gex_1_fastqc.zip", + "fastqc/PBMC_10K_gex_2_fastqc.html", + "fastqc/PBMC_10K_gex_2_fastqc.zip", + "fastqc/PBMC_10K_vdj_1_fastqc.html", + "fastqc/PBMC_10K_vdj_1_fastqc.zip", + "fastqc/PBMC_10K_vdj_2_fastqc.html", + "fastqc/PBMC_10K_vdj_2_fastqc.zip", + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/BETA-multiqc.parquet", + "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", + "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", + "multiqc/multiqc_data/fastqc_overrepresented_sequences_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_sequence_quality_plot.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/multiqc_data/fastqc_per_sequence_quality_scores_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", + "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_fastqc.txt", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/fastqc-status-check-heatmap.pdf", + "multiqc/multiqc_plots/pdf/fastqc_adapter_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_overrepresented_sequences_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_n_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/fastqc-status-check-heatmap.png", + "multiqc/multiqc_plots/png/fastqc_adapter_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_overrepresented_sequences_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_n_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_sequence_quality_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_quality_scores_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-cnt.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-pct.png", + "multiqc/multiqc_plots/png/fastqc_sequence_duplication_levels_plot.png", + "multiqc/multiqc_plots/png/fastqc_top_overrepresented_sequences_table.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/fastqc-status-check-heatmap.svg", + "multiqc/multiqc_plots/svg/fastqc_adapter_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_overrepresented_sequences_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_n_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_sequence_quality_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_quality_scores_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-cnt.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-pct.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_duplication_levels_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_top_overrepresented_sequences_table.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml" + ], + [ + "barcodes.tsv.gz:md5,a3937e73aa76a2acff554ca2f81a108d", + "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", + "matrix.mtx.gz:md5,5da308e2bf76dcd5c270ec8dcf849c17", + "barcodes.tsv.gz:md5,b729c635b9ec993dd3e9c0602b440016", + "features.tsv.gz:md5,265e218cf1202f2563997fe2bf64efcb", + "matrix.mtx.gz:md5,95a5485bf5636ca5e3d462e800acea59", + "barcodes.tsv.gz:md5,74ccf55411109ed9c3f2b6f73ae91ddc", + "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", + "matrix.mtx.gz:md5,147400e1d64b4fe1f00ffff0b8af5516", + "barcodes.tsv.gz:md5,84597a29c9e3e8d2e9971dcd2154fea8", + "features.tsv.gz:md5,265e218cf1202f2563997fe2bf64efcb", + "matrix.mtx.gz:md5,d70c1fdacadf6734720bf01a7d68a4d7", + "barcodes.tsv.gz:md5,38f51384d30e3b17d8de54aeac6c1ade", + "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", + "matrix.mtx.gz:md5,d5fe7ae28ba054db26002562e2bea161", + "barcodes.tsv.gz:md5,23f4f5264971fe924da6d93016a9747d", + "features.tsv.gz:md5,265e218cf1202f2563997fe2bf64efcb", + "matrix.mtx.gz:md5,82f2c40fa0b97b15778e4e88b874f275", + "barcodes.tsv.gz:md5,e7f625d70338d98ff8e8736e35338770", + "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", + "matrix.mtx.gz:md5,fdba80421a6e0084f16fa87cc9f28c41", + "barcodes.tsv.gz:md5,5088a4668ec6c06b357e54ea61a2266a", + "features.tsv.gz:md5,265e218cf1202f2563997fe2bf64efcb", + "matrix.mtx.gz:md5,6646c5c63dd73c0ee6e368876a90bc2e", + "barcodes.tsv.gz:md5,6d34a94fa5fc5cab362dbb1b5c8ed5d6", + "features.tsv.gz:md5,4a1a9128710210bb76622abf8aebfda6", + "matrix.mtx.gz:md5,1cf58834ca554013578536c95383a723", + "barcodes.tsv.gz:md5,177c1fbf4052a9cee2019179f51d9294", + "features.tsv.gz:md5,a5781c6331d8b63153bbca34b6942020", + "matrix.mtx.gz:md5,ca688c20ea2ab390abd74f8748703a35", + "all_contig.fasta:md5,7d7bf5415f43678689b3e217fba21c5a", + "all_contig.fastq:md5,1aed0f649b02cda3c280ebb20ec46373", + "all_contig_annotations.bed:md5,f4c00c969a91d09df02fa0e1aec50c72", + "barcodes.tsv.gz:md5,e7ca00fa3842c7e6ed855fb901444637", + "features.tsv.gz:md5,a5781c6331d8b63153bbca34b6942020", + "matrix.mtx.gz:md5,e6a165fd2fe8098abd8584a156ad4975", + "airr_rearrangement.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "concat_ref.fasta:md5,d41d8cd98f00b204e9800998ecf8427e", + "consensus.fasta:md5,d41d8cd98f00b204e9800998ecf8427e", + "donor_regions.fa:md5,d41d8cd98f00b204e9800998ecf8427e", + "filtered_contig.fasta:md5,d41d8cd98f00b204e9800998ecf8427e", + "filtered_contig.fastq:md5,d41d8cd98f00b204e9800998ecf8427e", + "regions.fa:md5,b10393dbe8cc3a3a1ebb3636e7369fa2", + "barcodes.tsv.gz:md5,98d07b680d1d7dc3332bac246274bdbc", + "features.tsv.gz:md5,824fe0b73fc8a383152a792f84f6ca84", + "matrix.mtx.gz:md5,0ef39394ae6cfb79ec3d295728c93abe", + "barcodes.tsv.gz:md5,9fe9a4e1467cec5c456bdffebcfc6955", + "features.tsv.gz:md5,824fe0b73fc8a383152a792f84f6ca84", + "matrix.mtx.gz:md5,b430b379304458b677214b643b5e5210", + "barcodes.tsv.gz:md5,7513f5ba4f9a400c4f7500f83cad1ee6", + "features.tsv.gz:md5,824fe0b73fc8a383152a792f84f6ca84", + "matrix.mtx.gz:md5,9ead16868dacff50047a57ca2e577ead", + "barcodes.tsv.gz:md5,a5294c876fa976c7bb84dcd580cb42d5", + "features.tsv.gz:md5,a5781c6331d8b63153bbca34b6942020", + "matrix.mtx.gz:md5,35b2eae12908ea73ec4da3d1fe12c708", + "all_contig.fasta:md5,d41d8cd98f00b204e9800998ecf8427e", + "all_contig.fastq:md5,d41d8cd98f00b204e9800998ecf8427e", + "all_contig_annotations.bed:md5,d41d8cd98f00b204e9800998ecf8427e", + "barcodes.tsv.gz:md5,2035ad842ed2fd904cb4e5913a9a8400", + "features.tsv.gz:md5,a5781c6331d8b63153bbca34b6942020", + "matrix.mtx.gz:md5,d92b09e5fa91a89acef20ebf70b6f948", + "airr_rearrangement.tsv:md5,d41d8cd98f00b204e9800998ecf8427e", + "concat_ref.fasta:md5,d41d8cd98f00b204e9800998ecf8427e", + "consensus.fasta:md5,d41d8cd98f00b204e9800998ecf8427e", + "donor_regions.fa:md5,d41d8cd98f00b204e9800998ecf8427e", + "filtered_contig.fasta:md5,d41d8cd98f00b204e9800998ecf8427e", + "filtered_contig.fastq:md5,d41d8cd98f00b204e9800998ecf8427e", + "regions.fa:md5,b10393dbe8cc3a3a1ebb3636e7369fa2", + "Homo_sapiens.GRCh38.dna.chromosome.14_genes.filtered.gtf:md5,f6d2d2177e2e5ef2bc5f95c5f009daab", + "genome.fa:md5,126ffef1c0d9908c56653891f36d6b98", + "genome.fa.fai:md5,4afaf04cf39d628eafc57f5c32f405aa", + "genes.gtf.gz:md5,f6d2d2177e2e5ef2bc5f95c5f009daab", + "Genome:md5,029bdf24296db83be4f9e1270b22ef31", + "SA:md5,864d086572bc728ae0f99d95e943af21", + "SAindex:md5,1f3b24e2cdfff2b26e8bb12d4ac6d88a", + "chrLength.txt:md5,543af32d7b13bcbfd63db37a0cb54735", + "chrName.txt:md5,367764329430db34be92fd14a7a770ee", + "chrNameLength.txt:md5,c4ba8e277c38dfe8be2adcbef3c5e3a0", + "chrStart.txt:md5,7e02caa09c4f911064d01a2d3832cd55", + "exonGeTrInfo.tab:md5,d6d0328a32d5799a02618bd9e92c13e5", + "exonInfo.tab:md5,8ab102c659446040ec4f963c20829a03", + "geneInfo.tab:md5,21674debb3b62e246a2d381f3ecb1470", + "sjdbInfo.txt:md5,319ab7285d02aca63a14a031d5bbdd33", + "sjdbList.fromGTF.out.tab:md5,49ea540d182fcb1b09c9691ce8626f9e", + "sjdbList.out.tab:md5,5868d966f8e432607245636266598dfe", + "transcriptInfo.tab:md5,a27c997fc57e0e26beebb57cde77d986", + "versions.yml:md5,7f4adb1e901d6610e40f18a6b7c1dc89", + "regions.fa:md5,b10393dbe8cc3a3a1ebb3636e7369fa2", + "4PLEX_HUMAN_raw_matrix.h5ad:md5,cbfdafa68aae75611738fa9210b03f7d", + "4PLEX_HUMAN_raw_matrix.sce.rds:md5,084ac812ebb69ca3152abd2c7226d739", + "4PLEX_HUMAN_raw_matrix.seurat.rds:md5,acc22e948a2250907897f79e008ff3ea", + "Colorectal_BC3_filtered_matrix.h5ad:md5,a1de01a2e94b0829779d8f1d52465ff7", + "Colorectal_BC3_filtered_matrix.sce.rds:md5,91bf1e7978c8a0601230a5d37c50e402", + "Colorectal_BC3_filtered_matrix.seurat.rds:md5,ba8256b3a51477018f9c1e4e1aeec336", + "Colorectal_BC3_raw_matrix.h5ad:md5,9aa954fe00a6b413a67ac4f7f8d478dc", + "Colorectal_BC3_raw_matrix.sce.rds:md5,b00d8244f06eef3e5d0fae39c9e14196", + "Colorectal_BC3_raw_matrix.seurat.rds:md5,0d6a6222daf2b03cba426cb80b86914c", + "Liver_BC1_filtered_matrix.h5ad:md5,aecfe09a1cbd9f87161824be609db2de", + "Liver_BC1_filtered_matrix.sce.rds:md5,3f40a160ca908672593106cdceda3dc1", + "Liver_BC1_filtered_matrix.seurat.rds:md5,ce4a4c9cbd490e867771416b4ce6f458", + "Liver_BC1_raw_matrix.h5ad:md5,cd134ba9ecd79b11fc3f0d6bbd027bac", + "Liver_BC1_raw_matrix.sce.rds:md5,4806e7f7e00af77c9eb0e2666cedc96c", + "Liver_BC1_raw_matrix.seurat.rds:md5,826973ce82225e8942a823e18dbe01fd", + "Ovarian_BC2_filtered_matrix.h5ad:md5,2f24890180bdb6dbe28184f107507bdb", + "Ovarian_BC2_filtered_matrix.sce.rds:md5,89518a94b4f908632433308311d02a37", + "Ovarian_BC2_filtered_matrix.seurat.rds:md5,b0a507b5d0b182681517c332177250ef", + "Ovarian_BC2_raw_matrix.h5ad:md5,09bb505dd9435e6405f11ea1c175a42f", + "Ovarian_BC2_raw_matrix.sce.rds:md5,e30869371d77941b1d009fd6983b5c43", + "Ovarian_BC2_raw_matrix.seurat.rds:md5,f107fd3e315a04aec3e6e53650c456f8", + "PBMC_10K_filtered_matrix.h5ad:md5,1f9765107df2ff39b67f5b46698f1be7", + "PBMC_10K_filtered_matrix.sce.rds:md5,1f2f3072ede853dd5f6c47821fc39543", + "PBMC_10K_filtered_matrix.seurat.rds:md5,dc780d878e2abae61b10eba5218116b8", + "PBMC_10K_raw_matrix.h5ad:md5,c6d9de8f66bb3c82a1af5362269ae0eb", + "PBMC_10K_raw_matrix.sce.rds:md5,4b3fe0fbda8a80eafc372bd895c26ec0", + "PBMC_10K_raw_matrix.seurat.rds:md5,97d5d0bc88db1df05b7effcb9dbb31cc", + "PBMC_10K_CMO_raw_matrix.h5ad:md5,2f62461d60211489f83eb8a6fb45611a", + "PBMC_10K_CMO_raw_matrix.sce.rds:md5,5c399342646e41ba7482dd1926eac1bf", + "PBMC_10K_CMO_raw_matrix.seurat.rds:md5,617b0af6bd53f58e7d0be91660bae3b3", + "PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.h5ad:md5,e5cc5a875dd544095b80f93c38b6ce4d", + "PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.sce.rds:md5,13d26c26a3967c415f539890a935fa7e", + "PBMC_10K_CMO_PBMCs_human_1_filtered_matrix.seurat.rds:md5,8deeddcbb64b2a665372f2dd82a60ba3", + "PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.h5ad:md5,02ca5402d2197ffd129bca78ca22a362", + "PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.sce.rds:md5,ede457b9d84ed34cf892806bb9f5287e", + "PBMC_10K_CMO_PBMCs_human_2_filtered_matrix.seurat.rds:md5,489181148d714944670abd1f6a3f4e10", + "PBMC_10K_CMV_filtered_matrix.h5ad:md5,d04bf7b56c489fc199b907ff7ad66077", + "PBMC_10K_CMV_filtered_matrix.sce.rds:md5,cb78864bde8833c2e6323ff01eef3c15", + "PBMC_10K_CMV_filtered_matrix.seurat.rds:md5,4dfa3f7aa87706e23a04248349292dc1", + "PBMC_10K_CMV_raw_matrix.h5ad:md5,1441fdabf55f28ae1e226fc34878a67f", + "PBMC_10K_CMV_raw_matrix.sce.rds:md5,75baf36779b04ed941b97b644125a2ff", + "PBMC_10K_CMV_raw_matrix.seurat.rds:md5,7b731e32655cace681ace140e3ef9af3", + "Pancreas_BC4_filtered_matrix.h5ad:md5,e8c4e7345c7af01c7d8a1c031a6a2272", + "Pancreas_BC4_filtered_matrix.sce.rds:md5,7d18f78c68f7c995b724ae3ba95ea862", + "Pancreas_BC4_filtered_matrix.seurat.rds:md5,98eef51fc0c34fa1e055b04c5c92d2f0", + "Pancreas_BC4_raw_matrix.h5ad:md5,227d5886282d58e0c6b8d6adc9ef94d0", + "Pancreas_BC4_raw_matrix.sce.rds:md5,4af114f068fc9bab8cceb3f25a9b6d9a", + "Pancreas_BC4_raw_matrix.seurat.rds:md5,7f972f40b05824a3cff5449a8f9f8b61", + "combined_filtered_matrix.h5ad:md5,716bbc76bdb936eb6e5605245a60ae29", + "combined_filtered_matrix.sce.rds:md5,aa7fe30d903112985e6034d40cb0294d", + "combined_filtered_matrix.seurat.rds:md5,83e23cae36057fed4a007f4c87f4797b", + "combined_raw_matrix.h5ad:md5,7f745597f16d099eaa361c94d0b1b5cb", + "combined_raw_matrix.sce.rds:md5,8f9e821edba5e7b11cd414d67b288898", + "combined_raw_matrix.seurat.rds:md5,30f30cf83d07fa932ab14a89a71eccdc", + "fastqc-status-check-heatmap.txt:md5,f57bda9b8fd9290f05ad8ddb6dd72027", + "fastqc_adapter_content_plot.txt:md5,886d5c1d7fcfd20e7d422124e16a3a12", + "fastqc_overrepresented_sequences_plot.txt:md5,3bd26371c065bd07cac66aaae9bad132", + "fastqc_per_base_n_content_plot.txt:md5,ce7d9dbc2bab55ac89fb84a0be53433b", + "fastqc_per_base_sequence_quality_plot.txt:md5,9ce25671de3ddbc98e37b584caf64ed5", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,1582afb553dbca13123b01eb79660e01", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,e1d9c51c26832a2e47f6eed5557aa4b7", + "fastqc_per_sequence_quality_scores_plot.txt:md5,de44c9616ec4e6d602436d984957a3b4", + "fastqc_sequence_counts_plot.txt:md5,0119a9f5e4092e0f51b3675b902f4770", + "fastqc_sequence_duplication_levels_plot.txt:md5,ad83bca86da8a428a4d7f6d8e534fd4b", + "multiqc_citations.txt:md5,4c806e63a283ec1b7e78cdae3a923d4f", + "multiqc_fastqc.txt:md5,ba37c98746e55d95bc1a0daefc030519", + "multiqc_general_stats.txt:md5,322c16b924c49f393b100debd15d9e16" + ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.1" }, - "timestamp": "2025-07-25T15:47:51.974099348" + "timestamp": "2025-07-31T09:05:23.348090413" }, "test-dataset_cellrangermulti_aligner_rat": { "content": [ - "10k_Wistar_Rat_raw_matrix.seurat.rds:md5,be37ed0efb84a22909063388c54c4154", - "10k_Wistar_Rat_raw_matrix.sce.rds:md5,170343f922c2b73f137fff406e1316c3", - "2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.seurat.rds:md5,1f9c6d0214b36fb71adf3f5618f43738", - "2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.sce.rds:md5,5efca43447c83ad61e899b277e887dc9", - "2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.seurat.rds:md5,aa99723b6b31debf4d560da3eec46617", - "2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.sce.rds:md5,8bb0728102df993644672d9abe13e4bf", - "2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.seurat.rds:md5,e692f9f24f63bc91be1b8a95fd0ce6c7", - "2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.sce.rds:md5,5ecba68c2200060e60fe285ace5ab3c3", - "2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.seurat.rds:md5,e858cbc1fe44e1ed5657da5e3304a7f3", - "2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.sce.rds:md5,3802b542e2a6430d11e7f526c5423b01", - "metrics_summary.csv:md5,3e355f96e9496edd282a4e84d6bb97e6", - "metrics_summary.csv:md5,18996be1521fdfc90f02c9fdd10bb681", - "metrics_summary.csv:md5,fccc47adc8b442c78148ed5d43de92b6", - "metrics_summary.csv:md5,c8bda4f1f2921f9da26fa342b700878b", - "barcodes.tsv.gz:md5,b8392e06463e9b5d87528c2898539540", - "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", - "matrix.mtx.gz:md5,215bf0efebc1cb89ec754bf186c80909", - "barcodes.tsv.gz:md5,5916dd03abc1ec3c621ac62e090ddbfb", - "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", - "matrix.mtx.gz:md5,00011c41088ca6b405db7becc0c81682", - "barcodes.tsv.gz:md5,8973bb4c7b5c211dd1ffe003502166c0", - "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", - "matrix.mtx.gz:md5,bec72997f928ded91d60e6fb30945efb", - "barcodes.tsv.gz:md5,b5b2c8ac0a8f655ca53397dd337bca27", - "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", - "matrix.mtx.gz:md5,22833228f201dd010b6c40e035a42cab", - "barcodes.tsv.gz:md5,bb62ec4602c7579b20adf5ad2b4124d2", - "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", - "matrix.mtx.gz:md5,ac8bd7e83e9fde9d47454b323bed36d6" + 32, + { + "CELLRANGER_MKGTF": { + "cellranger": "9.0.1" + }, + "CELLRANGER_MKREF": { + "cellranger": "9.0.1" + }, + "CELLRANGER_MKVDJREF": { + "cellranger": "9.0.1" + }, + "CELLRANGER_MULTI": { + "cellranger": "9.0.1 " + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "GUNZIP_FASTA": { + "gunzip": 1.1 + }, + "GUNZIP_GTF": { + "gunzip": 1.1 + }, + "MTX_TO_H5AD": { + "python": "3.12.5", + "scanpy": "1.10.2", + "pandas": "2.2.2", + "anndata": "0.10.8" + }, + "Workflow": { + "nf-core/scrnaseq": "v4.1.0dev" + } + }, + [ + "", + "cellrangermulti", + "cellrangermulti/count", + "cellrangermulti/count/10k_Wistar_Rat", + "cellrangermulti/count/10k_Wistar_Rat/outs", + "cellrangermulti/count/10k_Wistar_Rat/outs/config.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/multi", + "cellrangermulti/count/10k_Wistar_Rat/outs/multi/count", + "cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/raw_cloupe.cloupe", + "cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/raw_feature_bc_matrix", + "cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/raw_feature_bc_matrix.h5", + "cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/raw_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/raw_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/raw_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/raw_molecule_info.h5", + "cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/unassigned_alignments.bam", + "cellrangermulti/count/10k_Wistar_Rat/outs/multi/count/unassigned_alignments.bam.bai", + "cellrangermulti/count/10k_Wistar_Rat/outs/multi/multiplexing_analysis", + "cellrangermulti/count/10k_Wistar_Rat/outs/multi/multiplexing_analysis/cells_per_tag.json", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_graphclust", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_graphclust/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_10_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_2_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_3_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_4_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_5_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_6_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_7_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_8_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/clustering/gene_expression_kmeans_9_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_graphclust", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_graphclust/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_10_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_2_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_3_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_4_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_5_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_6_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_7_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_8_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/diffexp/gene_expression_kmeans_9_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/pca", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/pca/gene_expression_10_components", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/pca/gene_expression_10_components/components.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/pca/gene_expression_10_components/dispersion.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/pca/gene_expression_10_components/features_selected.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/pca/gene_expression_10_components/projection.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/pca/gene_expression_10_components/variance.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/tsne", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/tsne/gene_expression_2_components", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/tsne/gene_expression_2_components/projection.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/umap", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/umap/gene_expression_2_components", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/analysis/umap/gene_expression_2_components/projection.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_alignments.bam", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_alignments.bam.bai", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_cloupe.cloupe", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_filtered_barcodes.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_filtered_feature_bc_matrix", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_filtered_feature_bc_matrix.h5", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_filtered_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_molecule_info.h5", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_raw_feature_bc_matrix", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_raw_feature_bc_matrix.h5", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_raw_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_raw_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/count/sample_raw_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/metrics_summary.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB1/web_summary.html", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_graphclust", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_graphclust/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_10_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_2_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_3_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_4_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_5_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_6_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_7_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_8_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/clustering/gene_expression_kmeans_9_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_graphclust", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_graphclust/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_10_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_2_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_3_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_4_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_5_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_6_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_7_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_8_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/diffexp/gene_expression_kmeans_9_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/pca", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/pca/gene_expression_10_components", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/pca/gene_expression_10_components/components.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/pca/gene_expression_10_components/dispersion.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/pca/gene_expression_10_components/features_selected.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/pca/gene_expression_10_components/projection.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/pca/gene_expression_10_components/variance.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/tsne", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/tsne/gene_expression_2_components", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/tsne/gene_expression_2_components/projection.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/umap", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/umap/gene_expression_2_components", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/analysis/umap/gene_expression_2_components/projection.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_alignments.bam", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_alignments.bam.bai", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_cloupe.cloupe", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_filtered_barcodes.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_filtered_feature_bc_matrix", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_filtered_feature_bc_matrix.h5", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_filtered_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_molecule_info.h5", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_raw_feature_bc_matrix", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_raw_feature_bc_matrix.h5", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_raw_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_raw_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/count/sample_raw_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/metrics_summary.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB2/web_summary.html", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_graphclust", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_graphclust/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_10_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_2_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_3_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_4_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_5_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_6_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_7_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_8_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/clustering/gene_expression_kmeans_9_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_graphclust", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_graphclust/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_10_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_2_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_3_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_4_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_5_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_6_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_7_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_8_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/diffexp/gene_expression_kmeans_9_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/pca", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/pca/gene_expression_10_components", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/pca/gene_expression_10_components/components.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/pca/gene_expression_10_components/dispersion.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/pca/gene_expression_10_components/features_selected.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/pca/gene_expression_10_components/projection.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/pca/gene_expression_10_components/variance.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/tsne", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/tsne/gene_expression_2_components", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/tsne/gene_expression_2_components/projection.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/umap", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/umap/gene_expression_2_components", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/analysis/umap/gene_expression_2_components/projection.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_alignments.bam", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_alignments.bam.bai", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_cloupe.cloupe", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_filtered_barcodes.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_filtered_feature_bc_matrix", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_filtered_feature_bc_matrix.h5", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_filtered_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_molecule_info.h5", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_raw_feature_bc_matrix", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_raw_feature_bc_matrix.h5", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_raw_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_raw_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/count/sample_raw_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/metrics_summary.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB3/web_summary.html", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_graphclust", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_graphclust/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_10_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_2_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_3_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_4_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_5_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_6_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_7_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_8_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/clustering/gene_expression_kmeans_9_clusters/clusters.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_graphclust", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_graphclust/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_10_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_10_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_2_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_2_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_3_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_3_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_4_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_4_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_5_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_5_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_6_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_6_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_7_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_7_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_8_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_8_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_9_clusters", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/diffexp/gene_expression_kmeans_9_clusters/differential_expression.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/pca", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/pca/gene_expression_10_components", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/pca/gene_expression_10_components/components.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/pca/gene_expression_10_components/dispersion.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/pca/gene_expression_10_components/features_selected.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/pca/gene_expression_10_components/projection.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/pca/gene_expression_10_components/variance.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/tsne", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/tsne/gene_expression_2_components", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/tsne/gene_expression_2_components/projection.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/umap", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/umap/gene_expression_2_components", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/analysis/umap/gene_expression_2_components/projection.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_alignments.bam", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_alignments.bam.bai", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_cloupe.cloupe", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_filtered_barcodes.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_filtered_feature_bc_matrix", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_filtered_feature_bc_matrix.h5", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_filtered_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_filtered_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_filtered_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_molecule_info.h5", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_raw_feature_bc_matrix", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_raw_feature_bc_matrix.h5", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_raw_feature_bc_matrix/barcodes.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_raw_feature_bc_matrix/features.tsv.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/count/sample_raw_feature_bc_matrix/matrix.mtx.gz", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/metrics_summary.csv", + "cellrangermulti/count/10k_Wistar_Rat/outs/per_sample_outs/2500_Wistar_Rat_PBMCs_gem-x_OB4/web_summary.html", + "cellrangermulti/mkgtf", + "cellrangermulti/mkgtf/Rattus_norvegicus.GRCr8.dna.primary_assembly.6_genes.filtered.gtf", + "cellrangermulti/mkref", + "cellrangermulti/mkref/gex_reference", + "cellrangermulti/mkref/gex_reference/fasta", + "cellrangermulti/mkref/gex_reference/fasta/genome.fa", + "cellrangermulti/mkref/gex_reference/fasta/genome.fa.fai", + "cellrangermulti/mkref/gex_reference/genes", + "cellrangermulti/mkref/gex_reference/genes/genes.gtf.gz", + "cellrangermulti/mkref/gex_reference/reference.json", + "cellrangermulti/mkref/gex_reference/star", + "cellrangermulti/mkref/gex_reference/star/Genome", + "cellrangermulti/mkref/gex_reference/star/SA", + "cellrangermulti/mkref/gex_reference/star/SAindex", + "cellrangermulti/mkref/gex_reference/star/chrLength.txt", + "cellrangermulti/mkref/gex_reference/star/chrName.txt", + "cellrangermulti/mkref/gex_reference/star/chrNameLength.txt", + "cellrangermulti/mkref/gex_reference/star/chrStart.txt", + "cellrangermulti/mkref/gex_reference/star/exonGeTrInfo.tab", + "cellrangermulti/mkref/gex_reference/star/exonInfo.tab", + "cellrangermulti/mkref/gex_reference/star/geneInfo.tab", + "cellrangermulti/mkref/gex_reference/star/genomeParameters.txt", + "cellrangermulti/mkref/gex_reference/star/sjdbInfo.txt", + "cellrangermulti/mkref/gex_reference/star/sjdbList.fromGTF.out.tab", + "cellrangermulti/mkref/gex_reference/star/sjdbList.out.tab", + "cellrangermulti/mkref/gex_reference/star/transcriptInfo.tab", + "cellrangermulti/mkref/versions.yml", + "cellrangermulti/mkvdjref", + "cellrangermulti/mkvdjref/vdj_reference", + "cellrangermulti/mkvdjref/vdj_reference/fasta", + "cellrangermulti/mkvdjref/vdj_reference/fasta/regions.fa", + "cellrangermulti/mkvdjref/vdj_reference/reference.json", + "cellrangermulti/mtx_conversions", + "cellrangermulti/mtx_conversions/10k_Wistar_Rat", + "cellrangermulti/mtx_conversions/10k_Wistar_Rat/10k_Wistar_Rat_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/10k_Wistar_Rat/10k_Wistar_Rat_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/10k_Wistar_Rat/10k_Wistar_Rat_raw_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1/2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.h5ad", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1/2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.sce.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1/2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1/2500_Wistar_Rat_PBMCs_gem-x_OB1_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1/2500_Wistar_Rat_PBMCs_gem-x_OB1_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB1/2500_Wistar_Rat_PBMCs_gem-x_OB1_raw_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2/2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.h5ad", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2/2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.sce.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2/2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2/2500_Wistar_Rat_PBMCs_gem-x_OB2_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2/2500_Wistar_Rat_PBMCs_gem-x_OB2_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB2/2500_Wistar_Rat_PBMCs_gem-x_OB2_raw_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3/2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.h5ad", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3/2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.sce.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3/2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3/2500_Wistar_Rat_PBMCs_gem-x_OB3_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3/2500_Wistar_Rat_PBMCs_gem-x_OB3_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB3/2500_Wistar_Rat_PBMCs_gem-x_OB3_raw_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.h5ad", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.sce.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/2500_Wistar_Rat_PBMCs_gem-x_OB4/2500_Wistar_Rat_PBMCs_gem-x_OB4_raw_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/combined_filtered_matrix.h5ad", + "cellrangermulti/mtx_conversions/combined_filtered_matrix.sce.rds", + "cellrangermulti/mtx_conversions/combined_filtered_matrix.seurat.rds", + "cellrangermulti/mtx_conversions/combined_raw_matrix.h5ad", + "cellrangermulti/mtx_conversions/combined_raw_matrix.sce.rds", + "cellrangermulti/mtx_conversions/combined_raw_matrix.seurat.rds", + "fastqc", + "fastqc/10k_Wistar_Rat_gex_10_fastqc.html", + "fastqc/10k_Wistar_Rat_gex_10_fastqc.zip", + "fastqc/10k_Wistar_Rat_gex_11_fastqc.html", + "fastqc/10k_Wistar_Rat_gex_11_fastqc.zip", + "fastqc/10k_Wistar_Rat_gex_12_fastqc.html", + "fastqc/10k_Wistar_Rat_gex_12_fastqc.zip", + "fastqc/10k_Wistar_Rat_gex_1_fastqc.html", + "fastqc/10k_Wistar_Rat_gex_1_fastqc.zip", + "fastqc/10k_Wistar_Rat_gex_2_fastqc.html", + "fastqc/10k_Wistar_Rat_gex_2_fastqc.zip", + "fastqc/10k_Wistar_Rat_gex_3_fastqc.html", + "fastqc/10k_Wistar_Rat_gex_3_fastqc.zip", + "fastqc/10k_Wistar_Rat_gex_4_fastqc.html", + "fastqc/10k_Wistar_Rat_gex_4_fastqc.zip", + "fastqc/10k_Wistar_Rat_gex_5_fastqc.html", + "fastqc/10k_Wistar_Rat_gex_5_fastqc.zip", + "fastqc/10k_Wistar_Rat_gex_6_fastqc.html", + "fastqc/10k_Wistar_Rat_gex_6_fastqc.zip", + "fastqc/10k_Wistar_Rat_gex_7_fastqc.html", + "fastqc/10k_Wistar_Rat_gex_7_fastqc.zip", + "fastqc/10k_Wistar_Rat_gex_8_fastqc.html", + "fastqc/10k_Wistar_Rat_gex_8_fastqc.zip", + "fastqc/10k_Wistar_Rat_gex_9_fastqc.html", + "fastqc/10k_Wistar_Rat_gex_9_fastqc.zip", + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/BETA-multiqc.parquet", + "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", + "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_sequence_quality_plot.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/multiqc_data/fastqc_per_sequence_quality_scores_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", + "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_fastqc.txt", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/fastqc-status-check-heatmap.pdf", + "multiqc/multiqc_plots/pdf/fastqc_adapter_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_n_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_top_overrepresented_sequences_table.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/fastqc-status-check-heatmap.png", + "multiqc/multiqc_plots/png/fastqc_adapter_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_n_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_sequence_quality_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_quality_scores_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-cnt.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-pct.png", + "multiqc/multiqc_plots/png/fastqc_sequence_duplication_levels_plot.png", + "multiqc/multiqc_plots/png/fastqc_top_overrepresented_sequences_table.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/fastqc-status-check-heatmap.svg", + "multiqc/multiqc_plots/svg/fastqc_adapter_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_n_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_sequence_quality_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_quality_scores_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-cnt.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-pct.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_duplication_levels_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_top_overrepresented_sequences_table.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml" + ], + [ + "barcodes.tsv.gz:md5,b8392e06463e9b5d87528c2898539540", + "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", + "matrix.mtx.gz:md5,215bf0efebc1cb89ec754bf186c80909", + "barcodes.tsv.gz:md5,5916dd03abc1ec3c621ac62e090ddbfb", + "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", + "matrix.mtx.gz:md5,00011c41088ca6b405db7becc0c81682", + "barcodes.tsv.gz:md5,963fb610c6e379c9285314ae07cb41be", + "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", + "matrix.mtx.gz:md5,89cdcd0c7ac87b0706e07022e0cb152b", + "barcodes.tsv.gz:md5,8973bb4c7b5c211dd1ffe003502166c0", + "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", + "matrix.mtx.gz:md5,bec72997f928ded91d60e6fb30945efb", + "barcodes.tsv.gz:md5,4d1716fb5b1aae766e58e8ad971040a6", + "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", + "matrix.mtx.gz:md5,e4ef811570097ad41a229ec0ec6e612b", + "barcodes.tsv.gz:md5,b5b2c8ac0a8f655ca53397dd337bca27", + "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", + "matrix.mtx.gz:md5,22833228f201dd010b6c40e035a42cab", + "barcodes.tsv.gz:md5,b6fae74b4c42d097b2325462729c795b", + "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", + "matrix.mtx.gz:md5,af11682ebb2ef03eb8468206bb576331", + "barcodes.tsv.gz:md5,bb62ec4602c7579b20adf5ad2b4124d2", + "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", + "matrix.mtx.gz:md5,ac8bd7e83e9fde9d47454b323bed36d6", + "barcodes.tsv.gz:md5,e9a3e5323176ac3dfcad090f4a17d788", + "features.tsv.gz:md5,b55feb80459101d27ee0b2580af0d53c", + "matrix.mtx.gz:md5,aebb9ff23ed62a737b560f1fd1d1162d", + "Rattus_norvegicus.GRCr8.dna.primary_assembly.6_genes.filtered.gtf:md5,1c0c684e8bc3407d13cac54728c660cd", + "genome.fa:md5,4314b5b9035bda1101636a10159680a3", + "genome.fa.fai:md5,abbcafd221163873f0519fa7d0563af8", + "genes.gtf.gz:md5,1c0c684e8bc3407d13cac54728c660cd", + "Genome:md5,b6d58751ea865b217d1a5449a1fca398", + "SA:md5,d1cccded28b758f975505623e83b8867", + "SAindex:md5,3e1aa6553a2422a98d87e85ff13ee117", + "chrLength.txt:md5,8af4aed7c6f777e97f6a496971b1eafb", + "chrName.txt:md5,9ae0ea9e3c9c6e1b9b6252c8395efdc1", + "chrNameLength.txt:md5,320bcf8d43360f56798f9c9ef8902912", + "chrStart.txt:md5,b86d62bcd2bd6bbb4bcdd70dca970e75", + "exonGeTrInfo.tab:md5,8c85e6178a48bfceecfa45af5b403e4d", + "exonInfo.tab:md5,a4c6df66456392042c7ee450846ee38a", + "geneInfo.tab:md5,66a34a95fc4d5d959ffe0c930a05208f", + "sjdbInfo.txt:md5,35dc2faa7c0a3ff3408cad1851e5fe19", + "sjdbList.fromGTF.out.tab:md5,3cb30688675c43e4e1dd605d6222e86e", + "sjdbList.out.tab:md5,47f3998d3b00a1cbe34d9892771c3134", + "transcriptInfo.tab:md5,213158051b61081ed7bd8f39c0324072", + "versions.yml:md5,7f4adb1e901d6610e40f18a6b7c1dc89", + "regions.fa:md5,be846142763972b29bbf65ff7e1406ee", + "10k_Wistar_Rat_raw_matrix.h5ad:md5,b72f3744ea8ade292165de67491694ba", + "10k_Wistar_Rat_raw_matrix.sce.rds:md5,170343f922c2b73f137fff406e1316c3", + "10k_Wistar_Rat_raw_matrix.seurat.rds:md5,be37ed0efb84a22909063388c54c4154", + "2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.h5ad:md5,f00027c443b2ec856dc8d06dcd11dfdc", + "2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.sce.rds:md5,5efca43447c83ad61e899b277e887dc9", + "2500_Wistar_Rat_PBMCs_gem-x_OB1_filtered_matrix.seurat.rds:md5,1f9c6d0214b36fb71adf3f5618f43738", + "2500_Wistar_Rat_PBMCs_gem-x_OB1_raw_matrix.h5ad:md5,d34963f41405303c43518e0dfe25aca3", + "2500_Wistar_Rat_PBMCs_gem-x_OB1_raw_matrix.sce.rds:md5,46d39abeb64f1b88ccec8fd3787cdeff", + "2500_Wistar_Rat_PBMCs_gem-x_OB1_raw_matrix.seurat.rds:md5,43bcad531d588fb27e7eb05f86ca67b1", + "2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.h5ad:md5,366ac48d2e3edd1a5cdbebd7ab21e070", + "2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.sce.rds:md5,8bb0728102df993644672d9abe13e4bf", + "2500_Wistar_Rat_PBMCs_gem-x_OB2_filtered_matrix.seurat.rds:md5,aa99723b6b31debf4d560da3eec46617", + "2500_Wistar_Rat_PBMCs_gem-x_OB2_raw_matrix.h5ad:md5,8e8f571032a1dd5b1ec239a6fa56dbac", + "2500_Wistar_Rat_PBMCs_gem-x_OB2_raw_matrix.sce.rds:md5,f378851bdabb57c7fcef7d40a5877b63", + "2500_Wistar_Rat_PBMCs_gem-x_OB2_raw_matrix.seurat.rds:md5,f2e21681a2c435d8e560cf84a460884a", + "2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.h5ad:md5,5faf1e8b32d76430ae0055d1f34c3025", + "2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.sce.rds:md5,5ecba68c2200060e60fe285ace5ab3c3", + "2500_Wistar_Rat_PBMCs_gem-x_OB3_filtered_matrix.seurat.rds:md5,e692f9f24f63bc91be1b8a95fd0ce6c7", + "2500_Wistar_Rat_PBMCs_gem-x_OB3_raw_matrix.h5ad:md5,bd90da1ef9cf0faef28c5712639c36f1", + "2500_Wistar_Rat_PBMCs_gem-x_OB3_raw_matrix.sce.rds:md5,039091942fe3518ee22a760819f1878a", + "2500_Wistar_Rat_PBMCs_gem-x_OB3_raw_matrix.seurat.rds:md5,c1b26872218fa0402ebf1b9161826815", + "2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.h5ad:md5,d11a86ce8d223451e8c67dad48fed9ec", + "2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.sce.rds:md5,3802b542e2a6430d11e7f526c5423b01", + "2500_Wistar_Rat_PBMCs_gem-x_OB4_filtered_matrix.seurat.rds:md5,e858cbc1fe44e1ed5657da5e3304a7f3", + "2500_Wistar_Rat_PBMCs_gem-x_OB4_raw_matrix.h5ad:md5,b180ec130ed399f15b3aa67b52c06bd4", + "2500_Wistar_Rat_PBMCs_gem-x_OB4_raw_matrix.sce.rds:md5,50aa224b1dfec5fefb99b965be37a513", + "2500_Wistar_Rat_PBMCs_gem-x_OB4_raw_matrix.seurat.rds:md5,63f65eaf922b953e2b55d77330d4f385", + "combined_filtered_matrix.h5ad:md5,d42f478817b88e4554b8c7ca9a56300a", + "combined_filtered_matrix.sce.rds:md5,b454a6b301f26922ad4a913557054369", + "combined_filtered_matrix.seurat.rds:md5,52c4193abeec7971a920550de69869c0", + "combined_raw_matrix.h5ad:md5,738b5020e9841f1beb63ec8960ceb71d", + "combined_raw_matrix.sce.rds:md5,7367f286af56c4edacf09d2c99b84805", + "combined_raw_matrix.seurat.rds:md5,25516629372dd4f02a2fc7165ba25dc0", + "fastqc-status-check-heatmap.txt:md5,89acc155c18f65434b41b4dc8645fe2f", + "fastqc_adapter_content_plot.txt:md5,fa8ef0df2f740304fab23bfd39787bc3", + "fastqc_per_base_n_content_plot.txt:md5,04fc06c6af2f783ab3188a5838285849", + "fastqc_per_base_sequence_quality_plot.txt:md5,ffeabda871f78440a15d959567601791", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,4ebf2bfd96242ea308f43e1a5e1423aa", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,7da26fbfce7c93ccf3c020c569507b77", + "fastqc_per_sequence_quality_scores_plot.txt:md5,50e69aa963f640ebae7202d348652e34", + "fastqc_sequence_counts_plot.txt:md5,dcda4266556333b99714953a65f23f92", + "fastqc_sequence_duplication_levels_plot.txt:md5,1e58df8383b865f8e10623140290b79e", + "multiqc_citations.txt:md5,4c806e63a283ec1b7e78cdae3a923d4f", + "multiqc_fastqc.txt:md5,026ffbdf07192dde0ece1347e249beaf", + "multiqc_general_stats.txt:md5,5496b8ed2f29e4210018b5a9f1b7dc18" + ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.1" }, - "timestamp": "2025-07-25T18:16:53.898071151" + "timestamp": "2025-07-31T09:29:47.279900708" } -} +} \ No newline at end of file From f10ab6059488bdab9fca29cd621c2dcb3c6bdbbe Mon Sep 17 00:00:00 2001 From: fmalmeida Date: Thu, 31 Jul 2025 15:16:34 +0200 Subject: [PATCH 65/82] correct params.outdir --- tests/main_pipeline_simpleaf.nf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/main_pipeline_simpleaf.nf.test b/tests/main_pipeline_simpleaf.nf.test index 96947f23..cb0c0cde 100644 --- a/tests/main_pipeline_simpleaf.nf.test +++ b/tests/main_pipeline_simpleaf.nf.test @@ -24,7 +24,7 @@ nextflow_pipeline { // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions - removeNextflowVersion("$outputDir/results_simpleaf/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + removeNextflowVersion("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), // All stable path name, with a relative path stable_name, // All files with stable contents From a0cf3e4e3a707f643df0b6cd7aa8633e2930c450 Mon Sep 17 00:00:00 2001 From: "zxBIB Almeida,Felipe (GCBDS) EXTERNAL" Date: Fri, 1 Aug 2025 09:59:52 +0200 Subject: [PATCH 66/82] correct nf-tests based on expected linting --- tests/main_pipeline_cellranger.nf.test | 2 +- tests/main_pipeline_cellranger.nf.test.snap | 1 - tests/main_pipeline_cellrangerarc.nf.test | 2 +- tests/main_pipeline_cellrangerarc.nf.test.snap | 1 - tests/main_pipeline_cellrangermulti.nf.test | 4 ++-- tests/main_pipeline_cellrangermulti.nf.test.snap | 2 -- tests/main_pipeline_kallisto.nf.test | 2 +- tests/main_pipeline_kallisto.nf.test.snap | 1 - tests/main_pipeline_simpleaf.nf.test | 2 +- tests/main_pipeline_simpleaf.nf.test.snap | 1 - tests/main_pipeline_star.nf.test | 2 +- tests/main_pipeline_star.nf.test.snap | 1 - 12 files changed, 7 insertions(+), 14 deletions(-) diff --git a/tests/main_pipeline_cellranger.nf.test b/tests/main_pipeline_cellranger.nf.test index e130bc1e..ca27b24f 100644 --- a/tests/main_pipeline_cellranger.nf.test +++ b/tests/main_pipeline_cellranger.nf.test @@ -9,7 +9,7 @@ nextflow_pipeline { // the rest is taken from shared config params { aligner = 'cellranger' - outdir = "${outputDir}/results_cellranger" + outdir = "$outputDir" } } diff --git a/tests/main_pipeline_cellranger.nf.test.snap b/tests/main_pipeline_cellranger.nf.test.snap index b5ef998f..410a5e17 100644 --- a/tests/main_pipeline_cellranger.nf.test.snap +++ b/tests/main_pipeline_cellranger.nf.test.snap @@ -26,7 +26,6 @@ } }, [ - "", "cellranger", "cellranger/count", "cellranger/count/Sample_X", diff --git a/tests/main_pipeline_cellrangerarc.nf.test b/tests/main_pipeline_cellrangerarc.nf.test index 49b56947..eb23a6f8 100644 --- a/tests/main_pipeline_cellrangerarc.nf.test +++ b/tests/main_pipeline_cellrangerarc.nf.test @@ -9,7 +9,7 @@ nextflow_pipeline { // the rest is taken from shared config params { aligner = 'cellrangerarc' - outdir = "${outputDir}/results_cellrangerarc" + outdir = "$outputDir" input = "${baseDir}/assets/cellrangerarc_samplesheet.csv" fasta = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/genome/chr21/sequence/genome.fasta' gtf = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/genome/chr21/sequence/chr21_gencode.gtf' diff --git a/tests/main_pipeline_cellrangerarc.nf.test.snap b/tests/main_pipeline_cellrangerarc.nf.test.snap index 8f902fc3..fdaeb987 100644 --- a/tests/main_pipeline_cellrangerarc.nf.test.snap +++ b/tests/main_pipeline_cellrangerarc.nf.test.snap @@ -26,7 +26,6 @@ } }, [ - "", "cellrangerarc", "cellrangerarc/count", "cellrangerarc/count/10k_PBMC", diff --git a/tests/main_pipeline_cellrangermulti.nf.test b/tests/main_pipeline_cellrangermulti.nf.test index 444af7f1..475975b3 100644 --- a/tests/main_pipeline_cellrangermulti.nf.test +++ b/tests/main_pipeline_cellrangermulti.nf.test @@ -11,7 +11,7 @@ nextflow_pipeline { // the rest is taken from shared config params { aligner = 'cellrangermulti' - outdir = "${outputDir}/results_cellrangermulti" + outdir = "$outputDir" input = "${baseDir}/assets/cellrangermulti_samplesheet.csv" cellranger_multi_barcodes = "${baseDir}/assets/cellranger_barcodes_samplesheet.csv" gex_frna_probe_set = "${baseDir}/assets/frna_probeset_subset.csv" @@ -52,7 +52,7 @@ nextflow_pipeline { when { params { aligner = 'cellrangermulti' - outdir = "${outputDir}/results_cellrangermulti" + outdir = "$outputDir" input = "${baseDir}/assets/cellrangermulti_samplesheet_rat.csv" cellranger_multi_barcodes = "${baseDir}/assets/cellranger_barcodes_samplesheet_rat.csv" fasta = 'https://ftp.ensembl.org/pub/release-114/fasta/rattus_norvegicus/dna/Rattus_norvegicus.GRCr8.dna.primary_assembly.6.fa.gz' diff --git a/tests/main_pipeline_cellrangermulti.nf.test.snap b/tests/main_pipeline_cellrangermulti.nf.test.snap index 15168d84..a84ab6b3 100644 --- a/tests/main_pipeline_cellrangermulti.nf.test.snap +++ b/tests/main_pipeline_cellrangermulti.nf.test.snap @@ -35,7 +35,6 @@ } }, [ - "", "cellrangermulti", "cellrangermulti/count", "cellrangermulti/count/4PLEX_HUMAN", @@ -1294,7 +1293,6 @@ } }, [ - "", "cellrangermulti", "cellrangermulti/count", "cellrangermulti/count/10k_Wistar_Rat", diff --git a/tests/main_pipeline_kallisto.nf.test b/tests/main_pipeline_kallisto.nf.test index a1de5810..ed1cef27 100644 --- a/tests/main_pipeline_kallisto.nf.test +++ b/tests/main_pipeline_kallisto.nf.test @@ -9,7 +9,7 @@ nextflow_pipeline { // the rest is taken from shared config params { aligner = 'kallisto' - outdir = "${outputDir}/results_kallisto" + outdir = "$outputDir" } } diff --git a/tests/main_pipeline_kallisto.nf.test.snap b/tests/main_pipeline_kallisto.nf.test.snap index 5afee590..698c5927 100644 --- a/tests/main_pipeline_kallisto.nf.test.snap +++ b/tests/main_pipeline_kallisto.nf.test.snap @@ -23,7 +23,6 @@ } }, [ - "", "fastqc", "fastqc/Sample_X_1_fastqc.html", "fastqc/Sample_X_1_fastqc.zip", diff --git a/tests/main_pipeline_simpleaf.nf.test b/tests/main_pipeline_simpleaf.nf.test index cb0c0cde..5113983e 100644 --- a/tests/main_pipeline_simpleaf.nf.test +++ b/tests/main_pipeline_simpleaf.nf.test @@ -9,7 +9,7 @@ nextflow_pipeline { // the rest is taken from shared config params { aligner = 'simpleaf' - outdir = "${outputDir}/results_simpleaf" + outdir = "$outputDir" } } diff --git a/tests/main_pipeline_simpleaf.nf.test.snap b/tests/main_pipeline_simpleaf.nf.test.snap index c69fb317..33d971b5 100644 --- a/tests/main_pipeline_simpleaf.nf.test.snap +++ b/tests/main_pipeline_simpleaf.nf.test.snap @@ -32,7 +32,6 @@ } }, [ - "", "fastqc", "fastqc/Sample_X_1_fastqc.html", "fastqc/Sample_X_1_fastqc.zip", diff --git a/tests/main_pipeline_star.nf.test b/tests/main_pipeline_star.nf.test index 1aee0492..288a95cb 100644 --- a/tests/main_pipeline_star.nf.test +++ b/tests/main_pipeline_star.nf.test @@ -9,7 +9,7 @@ nextflow_pipeline { // the rest is taken from shared config params { aligner = 'star' - outdir = "${outputDir}/results_star" + outdir = "$outputDir" } } diff --git a/tests/main_pipeline_star.nf.test.snap b/tests/main_pipeline_star.nf.test.snap index dccce39a..58ef40bc 100644 --- a/tests/main_pipeline_star.nf.test.snap +++ b/tests/main_pipeline_star.nf.test.snap @@ -25,7 +25,6 @@ } }, [ - "", "fastqc", "fastqc/Sample_X_1_fastqc.html", "fastqc/Sample_X_1_fastqc.zip", From c998893fd8668712753775b0eaf524e4867b59ea Mon Sep 17 00:00:00 2001 From: fmalmeida Date: Fri, 1 Aug 2025 10:06:53 +0200 Subject: [PATCH 67/82] ignore "default.nf.test" file --- .nf-core.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index cff9da65..d06a384d 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,6 +1,7 @@ lint: files_exist: - - lib/Utils.groovy + - "lib/Utils.groovy" + - "tests/default.nf.test" files_unchanged: - .github/ISSUE_TEMPLATE/bug_report.yml schema_params: false From d9aeced3dea65e83b0e21a4b062841890e630df8 Mon Sep 17 00:00:00 2001 From: fmalmeida Date: Fri, 1 Aug 2025 10:12:39 +0200 Subject: [PATCH 68/82] fix trailling whitespace lint --- assets/EMPTY | 1 - tests/.nftignore | 2 +- tests/main_pipeline_simpleaf.nf.test | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/assets/EMPTY b/assets/EMPTY index 8b137891..e69de29b 100644 --- a/assets/EMPTY +++ b/assets/EMPTY @@ -1 +0,0 @@ - diff --git a/tests/.nftignore b/tests/.nftignore index ce988dfd..35dd0ee2 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -17,4 +17,4 @@ pipeline_info/*.{html,json,txt,yml} **/genomeParameters.txt **/atac_*.{gz,tbi,bed} **/10k_PBMC_lib.csv -**/cellrangermulti/**combined_* \ No newline at end of file +**/cellrangermulti/**combined_* diff --git a/tests/main_pipeline_simpleaf.nf.test b/tests/main_pipeline_simpleaf.nf.test index 5113983e..4e4bfd36 100644 --- a/tests/main_pipeline_simpleaf.nf.test +++ b/tests/main_pipeline_simpleaf.nf.test @@ -32,7 +32,7 @@ nextflow_pipeline { ).match() } ) } - + } } From 043d51e8196e3a0eb7a0734f14ccc386c9a675a2 Mon Sep 17 00:00:00 2001 From: fmalmeida Date: Fri, 1 Aug 2025 10:12:55 +0200 Subject: [PATCH 69/82] fix nf-test-content lint --- nf-test.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nf-test.config b/nf-test.config index 647018a7..3a1fff59 100644 --- a/nf-test.config +++ b/nf-test.config @@ -1,6 +1,6 @@ config { // location for all nf-test tests - testsDir "tests" + testsDir "." // nf-test directory including temporary files for each test workDir System.getenv("NFT_WORKDIR") ?: ".nf-test" From bf5193cb81e2f627e4e4910b0709d760fd803540 Mon Sep 17 00:00:00 2001 From: fmalmeida Date: Fri, 1 Aug 2025 10:30:38 +0200 Subject: [PATCH 70/82] update ro-crate with nf-core lint tool --- ro-crate-metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index fa43e47b..149c69ed 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "InProgress", "datePublished": "2025-07-08T11:39:16+00:00", - "description": "

\n \n \n \"nf-core/scrnaseq\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/scrnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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%A524.10.5-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.3.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.3.2)\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/scrnaseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![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/scrnaseq** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\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\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/scrnaseq \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\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/scrnaseq/usage) and the [parameter documentation](https://nf-co.re/scrnaseq/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/scrnaseq/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/scrnaseq/output).\n\n## Credits\n\nnf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\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 `#scrnaseq` channel](https://nfcore.slack.com/channels/scrnaseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\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", + "description": "

\n \n \n \"nf-core/scrnaseq\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/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/scrnaseq/results)\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.3568187-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.3568187)\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%A524.10.5-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.3.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.3.2)\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/scrnaseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![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/scrnaseq** is a bioinformatics best-practice analysis pipeline for processing 10x Genomics single-cell RNA-seq data.\n\nThis is a community effort in building a pipeline capable to support:\n\n- SimpleAF(Alevin-Fry) + AlevinQC\n- STARSolo\n- Kallisto + BUStools\n- Cellranger\n\n> [!IMPORTANT]\n> Cellranger is a commercial tool from 10X Genomics Inc. and falls under the EULA from 10X Genomics Inc. The container provided for the CellRanger functionality in this pipeline has been built by the nf-core community and is therefore _not supported by 10X genomics_ directly. We are in discussions with 10X on how to improve the user experience and licence situation for both us as a community as well as 10X and end users and will update this statement here accordingly.\n\n## Documentation\n\nThe nf-core/scrnaseq pipeline comes with documentation about the pipeline [usage](https://nf-co.re/scrnaseq/usage), [parameters](https://nf-co.re/scrnaseq/parameters) and [output](https://nf-co.re/scrnaseq/output).\n\n![scrnaseq workflow](docs/images/scrnaseq_pipeline_V3.0-metro_clean.png)\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:\n\n`samplesheet.csv`:\n\n```csv\nsample,fastq_1,fastq_2,expected_cells\npbmc8k,pbmc8k_S1_L007_R1_001.fastq.gz,pbmc8k_S1_L007_R2_001.fastq.gz,10000\npbmc8k,pbmc8k_S1_L008_R1_001.fastq.gz,pbmc8k_S1_L008_R2_001.fastq.gz,10000\n```\n\nEach row represents a fastq file (single-end) or a pair of fastq files (paired end).\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/scrnaseq \\\n -profile \\\n --input samplesheet.csv \\\n --fasta GRCm38.p6.genome.chr19.fa \\\n --gtf gencode.vM19.annotation.chr19.gtf \\\n --protocol 10XV2 \\\n --aligner \\\n --outdir \n```\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/scrnaseq/usage) and the [parameter documentation](https://nf-co.re/scrnaseq/parameters).\n\n## Decision Tree for users\n\nThe nf-core/scrnaseq pipeline features several paths to analyze your single cell data. Future additions will also be done soon, e.g. the addition of multi-ome analysis types. To aid users in analyzing their data, we have added a decision tree to help people decide on what type of analysis they want to run and how to choose appropriate parameters for that.\n\n```mermaid\ngraph TD\n A[sc RNA] -->|alevin-fry| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|CellRanger| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|kbpython| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|STARsolo| B(h5ad/seurat/mtx matrices)\n```\n\nOptions for the respective alignment method can be found [here](https://nf-co.re/scrnaseq/docs/usage/#aligning-options) to choose between methods.\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/scrnaseq/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/scrnaseq/output).\n\n## Credits\n\nnf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Gabernet G, Peltzer A, Sturm G.\n\nWe thank the following people and teams for their extensive assistance in the development of this pipeline:\n\n- @heylf\n- @KevinMenden\n- @FloWuenne\n- @rob-p\n- [GHGA](https://www.ghga.de/)\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 `#scrnaseq` channel](https://nfcore.slack.com/channels/scrnaseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/scrnaseq for your analysis, please cite it using the following doi: [10.5281/zenodo.3568187](https://doi.org/10.5281/zenodo.3568187)\n\nThe basic benchmarks that were used as motivation for incorporating the available modular workflows can be found in [this publication](https://www.biorxiv.org/content/10.1101/673285v2).\n\nWe offer all three paths for the processing of scRNAseq data so it remains up to the user to decide which pipeline workflow is chosen for a particular analysis question.\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n", "hasPart": [ { "@id": "main.nf" From 81f2f698256669d1b0a9f5c5cc5946d7ad6b2569 Mon Sep 17 00:00:00 2001 From: fmalmeida Date: Fri, 1 Aug 2025 12:32:19 +0200 Subject: [PATCH 71/82] update ignored nf-test files --- tests/.nftignore | 4 ++-- tests/main_pipeline_cellranger.nf.test.snap | 9 +-------- tests/main_pipeline_cellrangerarc.nf.test.snap | 9 +-------- tests/main_pipeline_cellrangermulti.nf.test.snap | 16 ++-------------- tests/main_pipeline_kallisto.nf.test.snap | 10 +--------- tests/main_pipeline_simpleaf.nf.test.snap | 7 ++----- tests/main_pipeline_star.nf.test.snap | 10 ++-------- 7 files changed, 11 insertions(+), 54 deletions(-) diff --git a/tests/.nftignore b/tests/.nftignore index 35dd0ee2..a3fb6d00 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -10,11 +10,11 @@ multiqc/multiqc_report.html fastqc/*_fastqc.{html,zip} pipeline_info/*.{html,json,txt,yml} **/simpleaf_quant/** -**/**.{html,json,bus} +**/**.{html,json,bus,ec} **/**.Log.* **/outs/**.{json,txt,yml,csv,tab,bam,bai,h5,fai,cloupe,pb} **/analysis/** **/genomeParameters.txt **/atac_*.{gz,tbi,bed} **/10k_PBMC_lib.csv -**/cellrangermulti/**combined_* +**/**combined_* diff --git a/tests/main_pipeline_cellranger.nf.test.snap b/tests/main_pipeline_cellranger.nf.test.snap index 410a5e17..ebdd1d45 100644 --- a/tests/main_pipeline_cellranger.nf.test.snap +++ b/tests/main_pipeline_cellranger.nf.test.snap @@ -335,7 +335,6 @@ "genome.fa:md5,ef1ae316990b7c77fd0baa0a89b75a6d", "genome.fa.fai:md5,729bb811dc9ababd5ee35029b8140f36", "genes.gtf.gz:md5,956caa7c851df640ded6c3f5f1a7cd41", - "reference.json:md5,881f0bc89526c4c5b1265a9ea077bc49", "Genome:md5,638a41718215663f07fec2bf13fc9b0f", "SA:md5,965121db041500098de4325ad719f5df", "SAindex:md5,1d4c33e718f498c61083aa47aa9ace2c", @@ -362,12 +361,6 @@ "Sample_Y_raw_matrix.h5ad:md5,d5c3a30bcd4d8011eb5aa39ad0f1c286", "Sample_Y_raw_matrix.sce.rds:md5,061ab8ba3ed28e6312c0367a2a9dfeb3", "Sample_Y_raw_matrix.seurat.rds:md5,3f4a3e6529b10c646fd08173d5baa339", - "combined_filtered_matrix.h5ad:md5,a5ed8bbcd99fec98559e39f1fca76746", - "combined_filtered_matrix.sce.rds:md5,3b765867639f93039a16127ae8939597", - "combined_filtered_matrix.seurat.rds:md5,165e968813b29d1118c30f779da253c0", - "combined_raw_matrix.h5ad:md5,87b515e8a45f028520f5e01f9137bb76", - "combined_raw_matrix.sce.rds:md5,2e08aaef7d7c972ea4d4cb1b5807bbdd", - "combined_raw_matrix.seurat.rds:md5,4dce8dbf48ee2aab4e7ed40015bc9ce8", "cellranger-count-stats-table.txt:md5,dcfc25c2bb422c5f279af728c8b62f58", "cellranger-count-warnings-table.txt:md5,f257d0a84efc395072a517db643b7935", "fastqc-status-check-heatmap.txt:md5,d122badcaa647409c35a809e8a127f99", @@ -392,6 +385,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.1" }, - "timestamp": "2025-07-30T17:26:23.802756012" + "timestamp": "2025-08-01T11:05:37.982319489" } } \ No newline at end of file diff --git a/tests/main_pipeline_cellrangerarc.nf.test.snap b/tests/main_pipeline_cellrangerarc.nf.test.snap index fdaeb987..296e766c 100644 --- a/tests/main_pipeline_cellrangerarc.nf.test.snap +++ b/tests/main_pipeline_cellrangerarc.nf.test.snap @@ -245,7 +245,6 @@ "genome.fa.pac:md5,cf76a4dbc5b8ae64fc890d6a95067b4f", "genome.fa.sa:md5,92f0b3e443220a57c2bd09f737e7dbc4", "genes.gtf.gz:md5,4328009f62d38b9220dd941c1a66e480", - "reference.json:md5,7e0220d655ca0ee43d59f1b893c46c92", "transcripts.bed:md5,f9840436821172d8cef086cb6f3c27eb", "tss.bed:md5,d637f9650dc3862c932cd9996ace49f5", "Genome:md5,0aaebdafd448aeec403253cc47e15176", @@ -270,12 +269,6 @@ "10k_PBMC_raw_matrix.h5ad:md5,4ac50d4109bcccd1d82ed83fc00d7580", "10k_PBMC_raw_matrix.sce.rds:md5,196adfcb230f9ba9bb7d0aba36e7e261", "10k_PBMC_raw_matrix.seurat.rds:md5,8ff4d68d88a6a7e3528147e06aeaa4dd", - "combined_filtered_matrix.h5ad:md5,18f3a2c580b6f50562739a2cc0dcca82", - "combined_filtered_matrix.sce.rds:md5,4c1dee683e3d0e602556a69b9b64b3a5", - "combined_filtered_matrix.seurat.rds:md5,91f83560d80b7b1ab238161d73c64831", - "combined_raw_matrix.h5ad:md5,791f4f6dcc1098a43aa6c1e6f8a76fe3", - "combined_raw_matrix.sce.rds:md5,4846edfc332c65c129b554c27a357dc7", - "combined_raw_matrix.seurat.rds:md5,8900e93d58f613d56f02a4243769498a", "fastqc-status-check-heatmap.txt:md5,55b658eef7b63c6f8e3d559be41f5df8", "fastqc_adapter_content_plot.txt:md5,31ca16758049ac46cc84875ddc4ff6d3", "fastqc_overrepresented_sequences_plot.txt:md5,314754adfcfa2977ee4f61c2ec5444f2", @@ -295,6 +288,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.1" }, - "timestamp": "2025-07-30T19:53:53.433223598" + "timestamp": "2025-08-01T11:18:19.395555812" } } \ No newline at end of file diff --git a/tests/main_pipeline_cellrangermulti.nf.test.snap b/tests/main_pipeline_cellrangermulti.nf.test.snap index a84ab6b3..a226e533 100644 --- a/tests/main_pipeline_cellrangermulti.nf.test.snap +++ b/tests/main_pipeline_cellrangermulti.nf.test.snap @@ -1230,12 +1230,6 @@ "Pancreas_BC4_raw_matrix.h5ad:md5,227d5886282d58e0c6b8d6adc9ef94d0", "Pancreas_BC4_raw_matrix.sce.rds:md5,4af114f068fc9bab8cceb3f25a9b6d9a", "Pancreas_BC4_raw_matrix.seurat.rds:md5,7f972f40b05824a3cff5449a8f9f8b61", - "combined_filtered_matrix.h5ad:md5,716bbc76bdb936eb6e5605245a60ae29", - "combined_filtered_matrix.sce.rds:md5,aa7fe30d903112985e6034d40cb0294d", - "combined_filtered_matrix.seurat.rds:md5,83e23cae36057fed4a007f4c87f4797b", - "combined_raw_matrix.h5ad:md5,7f745597f16d099eaa361c94d0b1b5cb", - "combined_raw_matrix.sce.rds:md5,8f9e821edba5e7b11cd414d67b288898", - "combined_raw_matrix.seurat.rds:md5,30f30cf83d07fa932ab14a89a71eccdc", "fastqc-status-check-heatmap.txt:md5,f57bda9b8fd9290f05ad8ddb6dd72027", "fastqc_adapter_content_plot.txt:md5,886d5c1d7fcfd20e7d422124e16a3a12", "fastqc_overrepresented_sequences_plot.txt:md5,3bd26371c065bd07cac66aaae9bad132", @@ -1255,7 +1249,7 @@ "nf-test": "0.9.2", "nextflow": "24.10.1" }, - "timestamp": "2025-07-31T09:05:23.348090413" + "timestamp": "2025-08-01T11:43:41.46111504" }, "test-dataset_cellrangermulti_aligner_rat": { "content": [ @@ -1844,12 +1838,6 @@ "2500_Wistar_Rat_PBMCs_gem-x_OB4_raw_matrix.h5ad:md5,b180ec130ed399f15b3aa67b52c06bd4", "2500_Wistar_Rat_PBMCs_gem-x_OB4_raw_matrix.sce.rds:md5,50aa224b1dfec5fefb99b965be37a513", "2500_Wistar_Rat_PBMCs_gem-x_OB4_raw_matrix.seurat.rds:md5,63f65eaf922b953e2b55d77330d4f385", - "combined_filtered_matrix.h5ad:md5,d42f478817b88e4554b8c7ca9a56300a", - "combined_filtered_matrix.sce.rds:md5,b454a6b301f26922ad4a913557054369", - "combined_filtered_matrix.seurat.rds:md5,52c4193abeec7971a920550de69869c0", - "combined_raw_matrix.h5ad:md5,738b5020e9841f1beb63ec8960ceb71d", - "combined_raw_matrix.sce.rds:md5,7367f286af56c4edacf09d2c99b84805", - "combined_raw_matrix.seurat.rds:md5,25516629372dd4f02a2fc7165ba25dc0", "fastqc-status-check-heatmap.txt:md5,89acc155c18f65434b41b4dc8645fe2f", "fastqc_adapter_content_plot.txt:md5,fa8ef0df2f740304fab23bfd39787bc3", "fastqc_per_base_n_content_plot.txt:md5,04fc06c6af2f783ab3188a5838285849", @@ -1868,6 +1856,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.1" }, - "timestamp": "2025-07-31T09:29:47.279900708" + "timestamp": "2025-08-01T12:02:57.754836314" } } \ No newline at end of file diff --git a/tests/main_pipeline_kallisto.nf.test.snap b/tests/main_pipeline_kallisto.nf.test.snap index 698c5927..331163ba 100644 --- a/tests/main_pipeline_kallisto.nf.test.snap +++ b/tests/main_pipeline_kallisto.nf.test.snap @@ -172,7 +172,6 @@ "cells_x_genes.genes.txt:md5,acd9d00120f52031974b2add3e7521b6", "cells_x_genes.mtx:md5,894d60da192e3788de11fa8fc1fa711d", "filter_barcodes.txt:md5,e411047c257b0a84656427aeca228bd4", - "matrix.ec:md5,fe1a726fbfca166d71f0f2a73e847b1c", "transcripts.txt:md5,da62746af800837deb91b829ea67c05d", "10x_version2_whitelist.txt:md5,f62a276e262fdd85262a889d0f48556b", "cells_x_genes.barcodes.txt:md5,32464c83608493daf0a22dc39ede6bc8", @@ -184,7 +183,6 @@ "cells_x_genes.genes.txt:md5,acd9d00120f52031974b2add3e7521b6", "cells_x_genes.mtx:md5,abd83de117204d0a77df3c92d00cc025", "filter_barcodes.txt:md5,080dd405987d2e1bd238ba94b821d487", - "matrix.ec:md5,be196b2c822f4cb9aca53ffe52f7e9be", "transcripts.txt:md5,da62746af800837deb91b829ea67c05d", "Sample_X_filtered_matrix.h5ad:md5,a2bcc30ea32f510555d82250b37f1ff1", "Sample_X_filtered_matrix.sce.rds:md5,554e1376664bbff371cb09c39a969d06", @@ -198,12 +196,6 @@ "Sample_Y_raw_matrix.h5ad:md5,495f376a2042dc69b792984053dffc5d", "Sample_Y_raw_matrix.sce.rds:md5,6818392c6b8b65d762521406aa963b2a", "Sample_Y_raw_matrix.seurat.rds:md5,a9e9ac3d1bf83f4e791d6f0c3f6540de", - "combined_filtered_matrix.h5ad:md5,8936bc3247d92e0568e1e7205c32ef31", - "combined_filtered_matrix.sce.rds:md5,296894bc16e73e840b0a65629d0655aa", - "combined_filtered_matrix.seurat.rds:md5,dc3f163b347e8f6ad200cffcf10d1430", - "combined_raw_matrix.h5ad:md5,fc96df4f6ff697f72e2406616c8ee01f", - "combined_raw_matrix.sce.rds:md5,5e9ebd129623df4cfb1b51d8123787f0", - "combined_raw_matrix.seurat.rds:md5,ff22ff0341a20ddae377839b82fa2077", "fastqc-status-check-heatmap.txt:md5,d122badcaa647409c35a809e8a127f99", "fastqc_adapter_content_plot.txt:md5,25f2bf3896afee60c3af1c2d406adb2a", "fastqc_per_base_n_content_plot.txt:md5,87fa27ea81dfddbd03d17e9d62073464", @@ -222,6 +214,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.1" }, - "timestamp": "2025-07-31T10:26:43.019070199" + "timestamp": "2025-08-01T12:08:34.446984853" } } \ No newline at end of file diff --git a/tests/main_pipeline_simpleaf.nf.test.snap b/tests/main_pipeline_simpleaf.nf.test.snap index 33d971b5..03ebe617 100644 --- a/tests/main_pipeline_simpleaf.nf.test.snap +++ b/tests/main_pipeline_simpleaf.nf.test.snap @@ -181,16 +181,13 @@ "Sample_X_raw_matrix.seurat.rds:md5,e1003985cc53b3538436a4726e3843a3", "Sample_Y_raw_matrix.h5ad:md5,7a9899fed9301f3f6f4e6d7b1ada226d", "Sample_Y_raw_matrix.sce.rds:md5,010c137155f5b8feed6ea4b853dc12c3", - "Sample_Y_raw_matrix.seurat.rds:md5,bae61b4d15df485464f6448a3b91f28c", - "combined_raw_matrix.h5ad:md5,cde7019772ba3efc3ac46aa5c9ff476d", - "combined_raw_matrix.sce.rds:md5,39d99e4d6c33f2c7e2063f32d0d2e18e", - "combined_raw_matrix.seurat.rds:md5,ec9e24cd5b38a9c64ba925fdc45b0dea" + "Sample_Y_raw_matrix.seurat.rds:md5,bae61b4d15df485464f6448a3b91f28c" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.1" }, - "timestamp": "2025-07-30T12:42:01.996598561" + "timestamp": "2025-08-01T12:17:17.575430596" } } \ No newline at end of file diff --git a/tests/main_pipeline_star.nf.test.snap b/tests/main_pipeline_star.nf.test.snap index 58ef40bc..47d0551b 100644 --- a/tests/main_pipeline_star.nf.test.snap +++ b/tests/main_pipeline_star.nf.test.snap @@ -228,19 +228,13 @@ "Sample_Y_filtered_matrix.seurat.rds:md5,d27d6360cf500bf4438f650b8796f8ce", "Sample_Y_raw_matrix.h5ad:md5,25329b6d44ae0f7f885e6513e05fb840", "Sample_Y_raw_matrix.sce.rds:md5,d9d6c934d2193681ab58a88d437bf138", - "Sample_Y_raw_matrix.seurat.rds:md5,5b8361f36fec65107e7652751c80fdb5", - "combined_filtered_matrix.h5ad:md5,ed4c42c9fb1e5f69d78d3dae9ca1c394", - "combined_filtered_matrix.sce.rds:md5,f12469472a1bb1bcb063b0e1b2bf5091", - "combined_filtered_matrix.seurat.rds:md5,d2d5184319e8bd9a48d00564f40313e0", - "combined_raw_matrix.h5ad:md5,cb8974567f2fc2799842ad684b61f12d", - "combined_raw_matrix.sce.rds:md5,4c61044c24c7c4ed83cca3347624ea33", - "combined_raw_matrix.seurat.rds:md5,04f68843fb5208fca885306c70886c48" + "Sample_Y_raw_matrix.seurat.rds:md5,5b8361f36fec65107e7652751c80fdb5" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.1" }, - "timestamp": "2025-07-31T10:45:00.949690328" + "timestamp": "2025-08-01T12:28:41.241504112" } } \ No newline at end of file From d3eb2396c8d1f904f8c29d0e626519dcabea52e7 Mon Sep 17 00:00:00 2001 From: Felipe Marques de Almeida Date: Fri, 1 Aug 2025 12:40:15 +0000 Subject: [PATCH 72/82] perform nf-core tooling version bump --- assets/multiqc_config.yml | 4 +-- nextflow.config | 2 +- ro-crate-metadata.json | 67 ++++++++++++++++++++++----------------- 3 files changed, 41 insertions(+), 32 deletions(-) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index c7623303..708b4c67 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,7 @@ report_comment: > - This report has been generated by the nf-core/scrnaseq analysis pipeline. For information about how - to interpret these results, please see the documentation. report_section_order: "nf-core-scrnaseq-methods-description": diff --git a/nextflow.config b/nextflow.config index db12ed0c..91ce264c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -343,7 +343,7 @@ manifest { mainScript = 'main.nf' defaultBranch = 'master' nextflowVersion = '!>=24.10.5' - version = '4.1.0dev' + version = '4.1.0' doi = '10.5281/zenodo.3568187' } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 149c69ed..cc836b47 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -21,8 +21,8 @@ { "@id": "./", "@type": "Dataset", - "creativeWorkStatus": "InProgress", - "datePublished": "2025-07-08T11:39:16+00:00", + "creativeWorkStatus": "Stable", + "datePublished": "2025-08-01T12:39:51+00:00", "description": "

\n \n \n \"nf-core/scrnaseq\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/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/scrnaseq/results)\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.3568187-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.3568187)\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%A524.10.5-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.3.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.3.2)\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/scrnaseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![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/scrnaseq** is a bioinformatics best-practice analysis pipeline for processing 10x Genomics single-cell RNA-seq data.\n\nThis is a community effort in building a pipeline capable to support:\n\n- SimpleAF(Alevin-Fry) + AlevinQC\n- STARSolo\n- Kallisto + BUStools\n- Cellranger\n\n> [!IMPORTANT]\n> Cellranger is a commercial tool from 10X Genomics Inc. and falls under the EULA from 10X Genomics Inc. The container provided for the CellRanger functionality in this pipeline has been built by the nf-core community and is therefore _not supported by 10X genomics_ directly. We are in discussions with 10X on how to improve the user experience and licence situation for both us as a community as well as 10X and end users and will update this statement here accordingly.\n\n## Documentation\n\nThe nf-core/scrnaseq pipeline comes with documentation about the pipeline [usage](https://nf-co.re/scrnaseq/usage), [parameters](https://nf-co.re/scrnaseq/parameters) and [output](https://nf-co.re/scrnaseq/output).\n\n![scrnaseq workflow](docs/images/scrnaseq_pipeline_V3.0-metro_clean.png)\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:\n\n`samplesheet.csv`:\n\n```csv\nsample,fastq_1,fastq_2,expected_cells\npbmc8k,pbmc8k_S1_L007_R1_001.fastq.gz,pbmc8k_S1_L007_R2_001.fastq.gz,10000\npbmc8k,pbmc8k_S1_L008_R1_001.fastq.gz,pbmc8k_S1_L008_R2_001.fastq.gz,10000\n```\n\nEach row represents a fastq file (single-end) or a pair of fastq files (paired end).\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/scrnaseq \\\n -profile \\\n --input samplesheet.csv \\\n --fasta GRCm38.p6.genome.chr19.fa \\\n --gtf gencode.vM19.annotation.chr19.gtf \\\n --protocol 10XV2 \\\n --aligner \\\n --outdir \n```\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/scrnaseq/usage) and the [parameter documentation](https://nf-co.re/scrnaseq/parameters).\n\n## Decision Tree for users\n\nThe nf-core/scrnaseq pipeline features several paths to analyze your single cell data. Future additions will also be done soon, e.g. the addition of multi-ome analysis types. To aid users in analyzing their data, we have added a decision tree to help people decide on what type of analysis they want to run and how to choose appropriate parameters for that.\n\n```mermaid\ngraph TD\n A[sc RNA] -->|alevin-fry| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|CellRanger| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|kbpython| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|STARsolo| B(h5ad/seurat/mtx matrices)\n```\n\nOptions for the respective alignment method can be found [here](https://nf-co.re/scrnaseq/docs/usage/#aligning-options) to choose between methods.\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/scrnaseq/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/scrnaseq/output).\n\n## Credits\n\nnf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Gabernet G, Peltzer A, Sturm G.\n\nWe thank the following people and teams for their extensive assistance in the development of this pipeline:\n\n- @heylf\n- @KevinMenden\n- @FloWuenne\n- @rob-p\n- [GHGA](https://www.ghga.de/)\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 `#scrnaseq` channel](https://nfcore.slack.com/channels/scrnaseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/scrnaseq for your analysis, please cite it using the following doi: [10.5281/zenodo.3568187](https://doi.org/10.5281/zenodo.3568187)\n\nThe basic benchmarks that were used as motivation for incorporating the available modular workflows can be found in [this publication](https://www.biorxiv.org/content/10.1101/673285v2).\n\nWe offer all three paths for the processing of scRNAseq data so it remains up to the user to decide which pipeline workflow is chosen for a particular analysis question.\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n", "hasPart": [ { @@ -108,7 +108,7 @@ }, "mentions": [ { - "@id": "#244931f2-1b9e-455a-a8b4-139a382be3a1" + "@id": "#d42b5d10-79f6-4e28-83e9-a0b50343b820" } ], "name": "nf-core/scrnaseq" @@ -137,19 +137,22 @@ ], "creator": [ { - "@id": "https://orcid.org/0000-0001-5010-9539" + "@id": "https://orcid.org/0000-0001-9584-7842" }, { - "@id": "https://orcid.org/0000-0003-4412-7970" + "@id": "https://orcid.org/0000-0002-6503-2180" }, { - "@id": "https://orcid.org/0000-0002-6503-2180" + "@id": "https://orcid.org/0000-0002-2705-1727" + }, + { + "@id": "#rob.syme@gmail.com" }, { "@id": "https://orcid.org/0000-0002-4639-0935" }, { - "@id": "https://orcid.org/0000-0001-9584-7842" + "@id": "https://orcid.org/0000-0001-5010-9539" }, { "@id": "#drpatelhh@gmail.com" @@ -158,11 +161,11 @@ "@id": "#felipemarques89@gmail.com" }, { - "@id": "#rob.syme@gmail.com" + "@id": "https://orcid.org/0000-0003-4412-7970" } ], "dateCreated": "", - "dateModified": "2025-07-08T11:39:16Z", + "dateModified": "2025-08-01T12:39:51Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -191,10 +194,10 @@ }, "url": [ "https://github.com/nf-core/scrnaseq", - "https://nf-co.re/scrnaseq/dev/" + "https://nf-co.re/scrnaseq/4.1.0/" ], "version": [ - "4.1.0dev" + "4.1.0" ] }, { @@ -210,11 +213,11 @@ "version": "!>=24.10.5" }, { - "@id": "#244931f2-1b9e-455a-a8b4-139a382be3a1", + "@id": "#d42b5d10-79f6-4e28-83e9-a0b50343b820", "@type": "TestSuite", "instance": [ { - "@id": "#72edb790-585a-4a53-862b-83177c420bf1" + "@id": "#33a6fef4-8636-4fc4-9035-63bea60f3fb6" } ], "mainEntity": { @@ -223,7 +226,7 @@ "name": "Test suite for nf-core/scrnaseq" }, { - "@id": "#72edb790-585a-4a53-862b-83177c420bf1", + "@id": "#33a6fef4-8636-4fc4-9035-63bea60f3fb6", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/scrnaseq", "resource": "repos/nf-core/scrnaseq/actions/workflows/nf-test.yml", @@ -367,16 +370,10 @@ "url": "https://nf-co.re/" }, { - "@id": "https://orcid.org/0000-0001-5010-9539", - "@type": "Person", - "email": "sangramsahu15@gmail.com", - "name": "Sangram Keshari Sahu" - }, - { - "@id": "https://orcid.org/0000-0003-4412-7970", + "@id": "https://orcid.org/0000-0001-9584-7842", "@type": "Person", - "email": "olga.botvinnik@gmail.com", - "name": "Olga Botvinnik" + "email": "mail@gregor-sturm.de", + "name": "Gregor Sturm" }, { "@id": "https://orcid.org/0000-0002-6503-2180", @@ -384,6 +381,18 @@ "email": "apeltzer@users.noreply.github.com", "name": "Alexander Peltzer" }, + { + "@id": "https://orcid.org/0000-0002-2705-1727", + "@type": "Person", + "email": "60394289+LeonHafner@users.noreply.github.com", + "name": "Leon Hafner" + }, + { + "@id": "#rob.syme@gmail.com", + "@type": "Person", + "email": "rob.syme@gmail.com", + "name": "Rob Syme" + }, { "@id": "https://orcid.org/0000-0002-4639-0935", "@type": "Person", @@ -391,10 +400,10 @@ "name": "Nico Trummer" }, { - "@id": "https://orcid.org/0000-0001-9584-7842", + "@id": "https://orcid.org/0000-0001-5010-9539", "@type": "Person", - "email": "mail@gregor-sturm.de", - "name": "Gregor Sturm" + "email": "sangramsahu15@gmail.com", + "name": "Sangram Keshari Sahu" }, { "@id": "#drpatelhh@gmail.com", @@ -409,10 +418,10 @@ "name": "Felipe Marques de Almeida" }, { - "@id": "#rob.syme@gmail.com", + "@id": "https://orcid.org/0000-0003-4412-7970", "@type": "Person", - "email": "rob.syme@gmail.com", - "name": "Rob Syme" + "email": "olga.botvinnik@gmail.com", + "name": "Olga Botvinnik" } ] } \ No newline at end of file From 19b8b9b7a5f31518e25d22e9dcaa447e877ba311 Mon Sep 17 00:00:00 2001 From: Felipe Marques de Almeida Date: Fri, 1 Aug 2025 12:55:27 +0000 Subject: [PATCH 73/82] correct errors highlighted by nf-core lint release --- .nf-core.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index d06a384d..761a0c85 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -9,11 +9,11 @@ lint: nf_core_version: 3.3.2 repository_type: pipeline template: - author: Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G + author: Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G, Dongze H description: Pipeline for processing 10x Genomics single cell rnaseq data force: false is_nfcore: true name: scrnaseq org: nf-core outdir: . - version: 2.8.0dev + version: 4.1.0 From 71f74cce5513f44d5f4eff1a7ec2ca6d30a3ba7d Mon Sep 17 00:00:00 2001 From: Felipe Marques de Almeida Date: Fri, 1 Aug 2025 12:58:07 +0000 Subject: [PATCH 74/82] correct changelog version and add missing information of tempalte update --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28b86195..3eeb4809 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). -## v4.1.0dev +## v4.1.0 - 2025-08-01 - Update nextflow_schema.json - Fix simpleaf protocol name for 10xv4 ([#452](https://github.com/nf-core/scrnaseq/pull/452)) @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Update `cellranger/multi` module to latest version with nf-core tools ([#482](https://github.com/nf-core/scrnaseq/pull/482)). - Adapt pipeline to also parse `OCM` barcodes for `cellranger/multi` and update its documentation ([#482](https://github.com/nf-core/scrnaseq/pull/482)). - Fix that skip_multiqc parameter did not work ([#479](https://github.com/nf-core/scrnaseq/pull/479)). +- Template update for nf-core/tools v3.3.2 ([474](https://github.com/nf-core/scrnaseq/pull/474)) ### Chore From 8bd930861d17b17702bf2474d061f729fab3147e Mon Sep 17 00:00:00 2001 From: Gregor Sturm Date: Mon, 4 Aug 2025 08:34:13 +0200 Subject: [PATCH 75/82] Update CHANGELOG --- CHANGELOG.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3eeb4809..d181a907 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,19 +5,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## v4.1.0 - 2025-08-01 -- Update nextflow_schema.json +### Features + - Fix simpleaf protocol name for 10xv4 ([#452](https://github.com/nf-core/scrnaseq/pull/452)) - Fix the workflow for cellranger-arc alignment and add new test with 10x multiome dataset ([#441](https://github.com/nf-core/scrnaseq/pull/441)) -- Update `nf-core/cellranger` modules to tool verson `9.0.1` ([#467](https://github.com/nf-core/scrnaseq/pull/467)). -- Fix igenomes usage to correctly handle fasta and gtf files ([#469](https://github.com/nf-core/scrnaseq/pull/469)). -- Update `cellranger/multi` module to latest version with nf-core tools ([#482](https://github.com/nf-core/scrnaseq/pull/482)). -- Adapt pipeline to also parse `OCM` barcodes for `cellranger/multi` and update its documentation ([#482](https://github.com/nf-core/scrnaseq/pull/482)). -- Fix that skip_multiqc parameter did not work ([#479](https://github.com/nf-core/scrnaseq/pull/479)). -- Template update for nf-core/tools v3.3.2 ([474](https://github.com/nf-core/scrnaseq/pull/474)) +- Update `nf-core/cellranger` modules to tool version `9.0.1` ([#467](https://github.com/nf-core/scrnaseq/pull/467)) +- Fix igenomes usage to correctly handle fasta and gtf files ([#469](https://github.com/nf-core/scrnaseq/pull/469)) +- Update `cellranger/multi` module to latest version with nf-core tools ([#482](https://github.com/nf-core/scrnaseq/pull/482)) +- Adapt pipeline to also parse `OCM` barcodes for `cellranger/multi` and update its documentation ([#482](https://github.com/nf-core/scrnaseq/pull/482)) +- Fix that skip_multiqc parameter did not work ([#479](https://github.com/nf-core/scrnaseq/pull/479)) +- Add the `accelerator` process directive to the `process_gpu` label ([#477](https://github.com/nf-core/scrnaseq/pull/477)) +- Refactor iGenomes handling to expose params object pipeline-wide ([#483](https://github.com/nf-core/scrnaseq/pull/483)) + +### Documentation + +- Update nextflow_schema.json ([#453](https://github.com/nf-core/scrnaseq/pull/453)) +- Update `--cellranger_index` docs to point out that the base index directory is needed ([#458](https://github.com/nf-core/scrnaseq/pull/458)) +- Update protocol documentation ([#459](https://github.com/nf-core/scrnaseq/pull/459)) ### Chore - Add ruff pre-commit check as linter/autoformatter for python scripts ([#464](https://github.com/nf-core/scrnaseq/pull/464)) +- Template update for nf-core/tools v3.2.1 ([#466](https://github.com/nf-core/scrnaseq/pull/466)) +- Template update for nf-core/tools v3.3.2 ([#474](https://github.com/nf-core/scrnaseq/pull/474)) ## v4.0.0 - 2025-03-10 From 2d6b8daf5e1425920a3c8e9f81812c8c775b5f35 Mon Sep 17 00:00:00 2001 From: Felipe Marques de Almeida Date: Mon, 4 Aug 2025 08:33:45 +0000 Subject: [PATCH 76/82] change nf-test function so that pipeline version is not encoded --- nf-test.config | 2 +- tests/main_pipeline_cellranger.nf.test | 2 +- tests/main_pipeline_cellrangerarc.nf.test | 2 +- tests/main_pipeline_cellrangermulti.nf.test | 4 ++-- tests/main_pipeline_kallisto.nf.test | 2 +- tests/main_pipeline_simpleaf.nf.test | 2 +- tests/main_pipeline_star.nf.test | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/nf-test.config b/nf-test.config index 3a1fff59..b3f60e80 100644 --- a/nf-test.config +++ b/nf-test.config @@ -19,6 +19,6 @@ config { // load the necessary plugins plugins { - load "nft-utils@0.0.3" + load "nft-utils@0.0.5" } } diff --git a/tests/main_pipeline_cellranger.nf.test b/tests/main_pipeline_cellranger.nf.test index ca27b24f..4ee158b9 100644 --- a/tests/main_pipeline_cellranger.nf.test +++ b/tests/main_pipeline_cellranger.nf.test @@ -24,7 +24,7 @@ nextflow_pipeline { // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions - removeNextflowVersion("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + removeFromYamlMap("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml", "Workflow"), // All stable path name, with a relative path stable_name, // All files with stable contents diff --git a/tests/main_pipeline_cellrangerarc.nf.test b/tests/main_pipeline_cellrangerarc.nf.test index eb23a6f8..49ec6b57 100644 --- a/tests/main_pipeline_cellrangerarc.nf.test +++ b/tests/main_pipeline_cellrangerarc.nf.test @@ -29,7 +29,7 @@ nextflow_pipeline { // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions - removeNextflowVersion("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + removeFromYamlMap("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml", "Workflow"), // All stable path name, with a relative path stable_name, // All files with stable contents diff --git a/tests/main_pipeline_cellrangermulti.nf.test b/tests/main_pipeline_cellrangermulti.nf.test index 475975b3..2d6e6a4a 100644 --- a/tests/main_pipeline_cellrangermulti.nf.test +++ b/tests/main_pipeline_cellrangermulti.nf.test @@ -35,7 +35,7 @@ nextflow_pipeline { // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions - removeNextflowVersion("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + removeFromYamlMap("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml", "Workflow"), // All stable path name, with a relative path stable_name, // All files with stable contents @@ -73,7 +73,7 @@ nextflow_pipeline { // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions - removeNextflowVersion("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + removeFromYamlMap("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml", "Workflow"), // All stable path name, with a relative path stable_name, // All files with stable contents diff --git a/tests/main_pipeline_kallisto.nf.test b/tests/main_pipeline_kallisto.nf.test index ed1cef27..bc74dbac 100644 --- a/tests/main_pipeline_kallisto.nf.test +++ b/tests/main_pipeline_kallisto.nf.test @@ -24,7 +24,7 @@ nextflow_pipeline { // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions - removeNextflowVersion("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + removeFromYamlMap("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml", "Workflow"), // All stable path name, with a relative path stable_name, // All files with stable contents diff --git a/tests/main_pipeline_simpleaf.nf.test b/tests/main_pipeline_simpleaf.nf.test index 4e4bfd36..19972fa2 100644 --- a/tests/main_pipeline_simpleaf.nf.test +++ b/tests/main_pipeline_simpleaf.nf.test @@ -24,7 +24,7 @@ nextflow_pipeline { // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions - removeNextflowVersion("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + removeFromYamlMap("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml", "Workflow"), // All stable path name, with a relative path stable_name, // All files with stable contents diff --git a/tests/main_pipeline_star.nf.test b/tests/main_pipeline_star.nf.test index 288a95cb..81f52cc6 100644 --- a/tests/main_pipeline_star.nf.test +++ b/tests/main_pipeline_star.nf.test @@ -24,7 +24,7 @@ nextflow_pipeline { // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions - removeNextflowVersion("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), + removeFromYamlMap("$params.outdir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml", "Workflow"), // All stable path name, with a relative path stable_name, // All files with stable contents From 59de85cc57deece72028ef5d284915b8d51ed725 Mon Sep 17 00:00:00 2001 From: Felipe Marques de Almeida Date: Mon, 4 Aug 2025 09:13:07 +0000 Subject: [PATCH 77/82] update snaps --- tests/main_pipeline_cellranger.nf.test.snap | 13 ++++------ .../main_pipeline_cellrangerarc.nf.test.snap | 13 ++++------ ...main_pipeline_cellrangermulti.nf.test.snap | 26 +++++++------------ tests/main_pipeline_kallisto.nf.test.snap | 13 ++++------ tests/main_pipeline_simpleaf.nf.test.snap | 13 ++++------ tests/main_pipeline_star.nf.test.snap | 17 +++++------- 6 files changed, 37 insertions(+), 58 deletions(-) diff --git a/tests/main_pipeline_cellranger.nf.test.snap b/tests/main_pipeline_cellranger.nf.test.snap index ebdd1d45..3d1813ac 100644 --- a/tests/main_pipeline_cellranger.nf.test.snap +++ b/tests/main_pipeline_cellranger.nf.test.snap @@ -16,13 +16,10 @@ "fastqc": "0.12.1" }, "MTX_TO_H5AD": { - "python": "3.12.5", - "scanpy": "1.10.2", + "anndata": "0.10.8", "pandas": "2.2.2", - "anndata": "0.10.8" - }, - "Workflow": { - "nf-core/scrnaseq": "v4.1.0dev" + "python": "3.12.5", + "scanpy": "1.10.2" } }, [ @@ -383,8 +380,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nextflow": "25.04.6" }, - "timestamp": "2025-08-01T11:05:37.982319489" + "timestamp": "2025-08-04T08:28:33.037302748" } } \ No newline at end of file diff --git a/tests/main_pipeline_cellrangerarc.nf.test.snap b/tests/main_pipeline_cellrangerarc.nf.test.snap index 296e766c..c0994daf 100644 --- a/tests/main_pipeline_cellrangerarc.nf.test.snap +++ b/tests/main_pipeline_cellrangerarc.nf.test.snap @@ -16,13 +16,10 @@ "fastqc": "0.12.1" }, "MTX_TO_H5AD": { - "python": "3.12.5", - "scanpy": "1.10.2", + "anndata": "0.10.8", "pandas": "2.2.2", - "anndata": "0.10.8" - }, - "Workflow": { - "nf-core/scrnaseq": "v4.1.0dev" + "python": "3.12.5", + "scanpy": "1.10.2" } }, [ @@ -286,8 +283,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nextflow": "25.04.6" }, - "timestamp": "2025-08-01T11:18:19.395555812" + "timestamp": "2025-08-04T08:33:34.787444894" } } \ No newline at end of file diff --git a/tests/main_pipeline_cellrangermulti.nf.test.snap b/tests/main_pipeline_cellrangermulti.nf.test.snap index a226e533..d1154bf4 100644 --- a/tests/main_pipeline_cellrangermulti.nf.test.snap +++ b/tests/main_pipeline_cellrangermulti.nf.test.snap @@ -25,13 +25,10 @@ "gunzip": 1.1 }, "MTX_TO_H5AD": { - "python": "3.12.5", - "scanpy": "1.10.2", + "anndata": "0.10.8", "pandas": "2.2.2", - "anndata": "0.10.8" - }, - "Workflow": { - "nf-core/scrnaseq": "v4.1.0dev" + "python": "3.12.5", + "scanpy": "1.10.2" } }, [ @@ -1247,9 +1244,9 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nextflow": "25.04.6" }, - "timestamp": "2025-08-01T11:43:41.46111504" + "timestamp": "2025-08-04T08:47:14.585663687" }, "test-dataset_cellrangermulti_aligner_rat": { "content": [ @@ -1277,13 +1274,10 @@ "gunzip": 1.1 }, "MTX_TO_H5AD": { - "python": "3.12.5", - "scanpy": "1.10.2", + "anndata": "0.10.8", "pandas": "2.2.2", - "anndata": "0.10.8" - }, - "Workflow": { - "nf-core/scrnaseq": "v4.1.0dev" + "python": "3.12.5", + "scanpy": "1.10.2" } }, [ @@ -1854,8 +1848,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nextflow": "25.04.6" }, - "timestamp": "2025-08-01T12:02:57.754836314" + "timestamp": "2025-08-04T08:56:26.746631285" } } \ No newline at end of file diff --git a/tests/main_pipeline_kallisto.nf.test.snap b/tests/main_pipeline_kallisto.nf.test.snap index 331163ba..c2eb8ebd 100644 --- a/tests/main_pipeline_kallisto.nf.test.snap +++ b/tests/main_pipeline_kallisto.nf.test.snap @@ -13,13 +13,10 @@ "kallistobustools": "0.28.2" }, "MTX_TO_H5AD": { - "python": "3.12.5", - "scanpy": "1.10.2", + "anndata": "0.10.8", "pandas": "2.2.2", - "anndata": "0.10.8" - }, - "Workflow": { - "nf-core/scrnaseq": "v4.1.0dev" + "python": "3.12.5", + "scanpy": "1.10.2" } }, [ @@ -212,8 +209,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nextflow": "25.04.6" }, - "timestamp": "2025-08-01T12:08:34.446984853" + "timestamp": "2025-08-04T09:00:22.183689983" } } \ No newline at end of file diff --git a/tests/main_pipeline_simpleaf.nf.test.snap b/tests/main_pipeline_simpleaf.nf.test.snap index 03ebe617..eb4e9549 100644 --- a/tests/main_pipeline_simpleaf.nf.test.snap +++ b/tests/main_pipeline_simpleaf.nf.test.snap @@ -10,10 +10,10 @@ "fastqc": "0.12.1" }, "MTX_TO_H5AD": { - "python": "3.12.5", - "scanpy": "1.10.2", + "anndata": "0.10.8", "pandas": "2.2.2", - "anndata": "0.10.8" + "python": "3.12.5", + "scanpy": "1.10.2" }, "SIMPLEAF_INDEX": { "alevin-fry": "0.11.2", @@ -26,9 +26,6 @@ "piscem": "0.12.2", "salmon": "1.10.3", "simpleaf": "0.19.4" - }, - "Workflow": { - "nf-core/scrnaseq": "v4.1.0dev" } }, [ @@ -186,8 +183,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nextflow": "25.04.6" }, - "timestamp": "2025-08-01T12:17:17.575430596" + "timestamp": "2025-08-04T09:02:37.806014973" } } \ No newline at end of file diff --git a/tests/main_pipeline_star.nf.test.snap b/tests/main_pipeline_star.nf.test.snap index 47d0551b..11204653 100644 --- a/tests/main_pipeline_star.nf.test.snap +++ b/tests/main_pipeline_star.nf.test.snap @@ -7,21 +7,18 @@ "fastqc": "0.12.1" }, "MTX_TO_H5AD": { - "python": "3.12.5", - "scanpy": "1.10.2", + "anndata": "0.10.8", "pandas": "2.2.2", - "anndata": "0.10.8" + "python": "3.12.5", + "scanpy": "1.10.2" }, "STAR_ALIGN": { "star": "2.7.10b" }, "STAR_GENOMEGENERATE": { - "star": "2.7.10a", + "gawk": "5.1.0", "samtools": 1.18, - "gawk": "5.1.0" - }, - "Workflow": { - "nf-core/scrnaseq": "v4.1.0dev" + "star": "2.7.10a" } }, [ @@ -233,8 +230,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nextflow": "25.04.6" }, - "timestamp": "2025-08-01T12:28:41.241504112" + "timestamp": "2025-08-04T09:08:55.70547428" } } \ No newline at end of file From 20db7dc97fb9c8bb329bc746cd4ce9444905c1ec Mon Sep 17 00:00:00 2001 From: Felipe Marques de Almeida Date: Mon, 4 Aug 2025 13:39:59 +0000 Subject: [PATCH 78/82] exclude conda profile --- .github/workflows/nf-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index e7b58449..3554e2aa 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -68,7 +68,7 @@ jobs: fail-fast: false matrix: shard: ${{ fromJson(needs.nf-test-changes.outputs.shard) }} - profile: [conda, docker, singularity] + profile: [docker, singularity] # Exclude conda profile isMain: - ${{ github.base_ref == 'master' || github.base_ref == 'main' }} # Exclude conda and singularity on dev From ec34afdfc10b35543c4c7011c30ebaddbf2494cc Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 16 Oct 2025 13:39:16 +0000 Subject: [PATCH 79/82] Template update for nf-core/tools version 3.4.1 --- .devcontainer/devcontainer.json | 28 +++---- .devcontainer/setup.sh | 13 ++++ .github/actions/nf-test/action.yml | 6 +- .github/workflows/awsfulltest.yml | 12 +-- .github/workflows/awstest.yml | 12 +-- .github/workflows/clean-up.yml | 2 +- .github/workflows/download_pipeline.yml | 6 +- .github/workflows/fix_linting.yml | 16 ++-- .github/workflows/linting.yml | 14 ++-- .github/workflows/linting_comment.yml | 2 +- .github/workflows/nf-test.yml | 9 ++- .github/workflows/release-announcements.yml | 7 ++ .../workflows/template-version-comment.yml | 2 +- .gitpod.yml | 10 --- .nf-core.yml | 8 +- .pre-commit-config.yaml | 2 +- .prettierignore | 1 + CHANGELOG.md | 2 +- README.md | 7 +- assets/multiqc_config.yml | 4 +- docs/usage.md | 2 +- main.nf | 5 +- modules.json | 8 +- modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 4 +- .../nf-core/multiqc/tests/main.nf.test.snap | 18 ++--- modules/nf-core/multiqc/tests/tags.yml | 2 - nextflow.config | 74 ++++++++----------- nextflow_schema.json | 12 +++ ro-crate-metadata.json | 22 +++--- .../utils_nfcore_scrnaseq_pipeline/main.nf | 31 +++++++- .../utils_nextflow_pipeline/tests/tags.yml | 2 - .../utils_nfcore_pipeline/tests/tags.yml | 2 - .../nf-core/utils_nfschema_plugin/main.nf | 40 ++++++++-- .../utils_nfschema_plugin/tests/main.nf.test | 56 ++++++++++++++ .../tests/nextflow.config | 4 +- tests/.nftignore | 3 +- tests/default.nf.test | 2 - 38 files changed, 287 insertions(+), 165 deletions(-) create mode 100755 .devcontainer/setup.sh delete mode 100644 .gitpod.yml delete mode 100644 modules/nf-core/multiqc/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b290e090..97c8c97f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,20 +1,20 @@ { "name": "nfcore", - "image": "nfcore/gitpod:latest", - "remoteUser": "gitpod", - "runArgs": ["--privileged"], + "image": "nfcore/devcontainer:latest", - // Configure tool-specific properties. - "customizations": { - // Configure properties specific to VS Code. - "vscode": { - // Set *default* container specific settings.json values on container create. - "settings": { - "python.defaultInterpreterPath": "/opt/conda/bin/python" - }, + "remoteUser": "root", + "privileged": true, - // Add the IDs of extensions you want installed when the container is created. - "extensions": ["ms-python.python", "ms-python.vscode-pylance", "nf-core.nf-core-extensionpack"] - } + "remoteEnv": { + // Workspace path on the host for mounting with docker-outside-of-docker + "LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}" + }, + + "onCreateCommand": "./.devcontainer/setup.sh", + + "hostRequirements": { + "cpus": 4, + "memory": "16gb", + "storage": "32gb" } } diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh new file mode 100755 index 00000000..5b0ed7cd --- /dev/null +++ b/.devcontainer/setup.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +# Customise the terminal command prompt +echo "export PROMPT_DIRTRIM=2" >> $HOME/.bashrc +echo "export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] '" >> $HOME/.bashrc +export PROMPT_DIRTRIM=2 +export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] ' + +# Update Nextflow +nextflow self-update + +# Update welcome message +echo "Welcome to the nf-core/scrnaseq devcontainer!" > /usr/local/etc/vscode-dev-containers/first-run-notice.txt diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml index bf44d961..3b9724c7 100644 --- a/.github/actions/nf-test/action.yml +++ b/.github/actions/nf-test/action.yml @@ -25,9 +25,9 @@ runs: version: "${{ env.NXF_VERSION }}" - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" - name: Install nf-test uses: nf-core/setup-nf-test@v1 @@ -52,6 +52,8 @@ runs: with: auto-update-conda: true conda-solver: libmamba + channels: conda-forge + channel-priority: strict conda-remove-defaults: true - name: Run nf-test diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 6e67f905..f95b3b55 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -28,15 +28,15 @@ jobs: # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters with: - workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + compute_env: ${{ vars.TOWER_COMPUTE_ENV }} revision: ${{ steps.revision.outputs.revision }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/scrnaseq/work-${{ steps.revision.outputs.revision }} + workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/scrnaseq/work-${{ steps.revision.outputs.revision }} parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/scrnaseq/results-${{ steps.revision.outputs.revision }}" + "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/scrnaseq/results-${{ steps.revision.outputs.revision }}" } profiles: test_full @@ -44,5 +44,5 @@ jobs: with: name: Seqera Platform debug log file path: | - seqera_platform_action_*.log - seqera_platform_action_*.json + tower_action_*.log + tower_action_*.json diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 3185a80e..8a077012 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -14,14 +14,14 @@ jobs: - name: Launch workflow via Seqera Platform uses: seqeralabs/action-tower-launch@v2 with: - workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} + workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} - compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} + compute_env: ${{ vars.TOWER_COMPUTE_ENV }} revision: ${{ github.sha }} - workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/scrnaseq/work-${{ github.sha }} + workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/scrnaseq/work-${{ github.sha }} parameters: | { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/scrnaseq/results-test-${{ github.sha }}" + "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/scrnaseq/results-test-${{ github.sha }}" } profiles: test @@ -29,5 +29,5 @@ jobs: with: name: Seqera Platform debug log file path: | - seqera_platform_action_*.log - seqera_platform_action_*.json + tower_action_*.log + tower_action_*.json diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index ac030fd5..6adb0fff 100644 --- a/.github/workflows/clean-up.yml +++ b/.github/workflows/clean-up.yml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9 + - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10 with: stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 999bcc38..6d94bcbf 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -44,9 +44,9 @@ jobs: - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" architecture: "x64" - name: Setup Apptainer @@ -57,7 +57,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install git+https://github.com/nf-core/tools.git@dev + pip install git+https://github.com/nf-core/tools.git - name: Make a cache directory for the container images run: | diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml index 12b1e041..84b079bf 100644 --- a/.github/workflows/fix_linting.yml +++ b/.github/workflows/fix_linting.yml @@ -13,13 +13,13 @@ jobs: runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 with: token: ${{ secrets.nf_core_bot_auth_token }} # indication that the linting is being fixed - name: React on comment - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: eyes @@ -32,9 +32,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} # Install and run pre-commit - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" - name: Install pre-commit run: pip install pre-commit @@ -47,7 +47,7 @@ jobs: # indication that the linting has finished - name: react if linting finished succesfully if: steps.pre-commit.outcome == 'success' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: "+1" @@ -67,21 +67,21 @@ jobs: - name: react if linting errors were fixed id: react-if-fixed if: steps.commit-and-push.outcome == 'success' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: hooray - name: react if linting errors were not fixed if: steps.commit-and-push.outcome == 'failure' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: confused - name: react if linting errors were not fixed if: steps.commit-and-push.outcome == 'failure' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: issue-number: ${{ github.event.issue.number }} body: | diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 8b0f88c3..30e66026 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,12 +11,12 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - - name: Set up Python 3.13 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - name: Set up Python 3.14 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" - name: Install pre-commit run: pip install pre-commit @@ -28,14 +28,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" architecture: "x64" - name: read .nf-core.yml diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index d43797d9..e6e9bc26 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -21,7 +21,7 @@ jobs: run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@52423e01640425a022ef5fd42c6fb5f633a02728 # v2 + uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index e7b58449..e20bf6d0 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -18,7 +18,7 @@ concurrency: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NFT_VER: "0.9.2" + NFT_VER: "0.9.3" NFT_WORKDIR: "~" NXF_ANSI_LOG: false NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity @@ -40,7 +40,7 @@ jobs: rm -rf ./* || true rm -rf ./.??* || true ls -la ./ - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 with: fetch-depth: 0 @@ -78,14 +78,14 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - "24.10.5" + - "25.04.0" - "latest-everything" env: NXF_ANSI_LOG: false TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 with: fetch-depth: 0 @@ -95,6 +95,7 @@ jobs: continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} env: NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + NXF_VERSION: ${{ matrix.NXF_VER }} with: profile: ${{ matrix.profile }} shard: ${{ matrix.shard }} diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 0f732495..e64cebd6 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -14,6 +14,11 @@ jobs: run: | echo "topics=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .topics[]' | awk '{print "#"$0}' | tr '\n' ' ')" | sed 's/-//g' >> $GITHUB_OUTPUT + - name: get description + id: get_topics + run: | + echo "description=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .description' >> $GITHUB_OUTPUT + - uses: rzr/fediverse-action@master with: access-token: ${{ secrets.MASTODON_ACCESS_TOKEN }} @@ -23,6 +28,8 @@ jobs: message: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! + ${{ steps.get_topics.outputs.description }} + Please see the changelog: ${{ github.event.release.html_url }} ${{ steps.get_topics.outputs.topics }} #nfcore #openscience #nextflow #bioinformatics diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template-version-comment.yml index beb5c77f..c5988af9 100644 --- a/.github/workflows/template-version-comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 with: ref: ${{ github.event.pull_request.head.sha }} diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 83599f63..00000000 --- a/.gitpod.yml +++ /dev/null @@ -1,10 +0,0 @@ -image: nfcore/gitpod:latest -tasks: - - name: Update Nextflow and setup pre-commit - command: | - pre-commit install --install-hooks - nextflow self-update - -vscode: - extensions: - - nf-core.nf-core-extensionpack # https://github.com/nf-core/vscode-extensionpack diff --git a/.nf-core.yml b/.nf-core.yml index cff9da65..3f077c36 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,18 +1,20 @@ lint: files_exist: - lib/Utils.groovy + - tests/default.nf.test files_unchanged: - .github/ISSUE_TEMPLATE/bug_report.yml schema_params: false template_strings: false -nf_core_version: 3.3.2 +nf_core_version: 3.4.1 repository_type: pipeline template: - author: Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G + author: Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G, Dongze + H description: Pipeline for processing 10x Genomics single cell rnaseq data force: false is_nfcore: true name: scrnaseq org: nf-core outdir: . - version: 2.8.0dev + version: 4.1.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bb41beec..d06777a8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,7 +6,7 @@ repos: additional_dependencies: - prettier@3.6.2 - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: trailing-whitespace args: [--markdown-linebreak-ext=md] diff --git a/.prettierignore b/.prettierignore index edd29f01..2255e3e3 100644 --- a/.prettierignore +++ b/.prettierignore @@ -10,4 +10,5 @@ testing/ testing* *.pyc bin/ +.nf-test/ ro-crate-metadata.json diff --git a/CHANGELOG.md b/CHANGELOG.md index f8117c69..d924875e 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). -## v2.8.0dev - [date] +## v4.1.0 - [date] Initial release of nf-core/scrnaseq, created with the [nf-core](https://nf-co.re/) template. diff --git a/README.md b/README.md index 34854815..7f4f00e6 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,13 @@ +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-core/scrnaseq) [![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/scrnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![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%A524.10.5-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.3.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.3.2) +[![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.4.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.4.1) [![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/) @@ -77,7 +78,7 @@ For more details about the output files and reports, please refer to the ## Credits -nf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G. +nf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G, Dongze H. We thank the following people for their extensive assistance in the development of this pipeline: diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 584bae69..915e0a8f 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,7 +1,7 @@ report_comment: > - This report has been generated by the nf-core/scrnaseq + This report has been generated by the nf-core/scrnaseq analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: "nf-core-scrnaseq-methods-description": order: -1000 diff --git a/docs/usage.md b/docs/usage.md index 9a550e77..f742f410 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -149,7 +149,7 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - `shifter` - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) - `charliecloud` - - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) + - A generic configuration profile to be used with [Charliecloud](https://charliecloud.io/) - `apptainer` - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) - `wave` diff --git a/main.nf b/main.nf index 58baa655..9c358eb0 100644 --- a/main.nf +++ b/main.nf @@ -74,7 +74,10 @@ workflow { params.monochrome_logs, args, params.outdir, - params.input + params.input, + params.help, + params.help_full, + params.show_hidden ) // diff --git a/modules.json b/modules.json index abcdb006..596e5d85 100644 --- a/modules.json +++ b/modules.json @@ -12,7 +12,7 @@ }, "multiqc": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "e10b76ca0c66213581bec2833e30d31f239dec0b", "installed_by": ["modules"] } } @@ -21,17 +21,17 @@ "nf-core": { "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", + "git_sha": "4b406a74dc0449c0401ed87d5bfff4252fd277fd", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index 812fc4c5..dd513cbd 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.29 + - bioconda::multiqc=1.31 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 0ac3c369..5288f5cc 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0' : - 'biocontainers/multiqc:1.29--pyhdfd78af_0' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ef/eff0eafe78d5f3b65a6639265a16b89fdca88d06d18894f90fcdb50142004329/data' : + 'community.wave.seqera.io/library/multiqc:1.31--1efbafd542a23882' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 88e90571..17881d15 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" + "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nextflow": "25.04.6" }, - "timestamp": "2025-05-22T11:50:41.182332996" + "timestamp": "2025-09-08T20:57:36.139055243" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" + "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nextflow": "25.04.6" }, - "timestamp": "2025-05-22T11:51:22.448739369" + "timestamp": "2025-09-08T20:59:15.142230631" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" + "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nextflow": "25.04.6" }, - "timestamp": "2025-05-22T11:51:06.198928424" + "timestamp": "2025-09-08T20:58:29.629087066" } } \ No newline at end of file diff --git a/modules/nf-core/multiqc/tests/tags.yml b/modules/nf-core/multiqc/tests/tags.yml deleted file mode 100644 index bea6c0d3..00000000 --- a/modules/nf-core/multiqc/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -multiqc: - - modules/nf-core/multiqc/** diff --git a/nextflow.config b/nextflow.config index a2a11454..5f7daf1a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -32,13 +32,15 @@ params { email_on_fail = null plaintext_email = false monochrome_logs = false - hook_url = null + 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/' - trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss')// Config options + trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') + + // Config options config_profile_name = null config_profile_description = null @@ -91,7 +93,18 @@ profiles { apptainer.enabled = false docker.runOptions = '-u $(id -u):$(id -g)' } - arm { + arm64 { + process.arch = 'arm64' + // TODO https://github.com/nf-core/modules/issues/6694 + // For now if you're using arm64 you have to use wave for the sake of the maintainers + // wave profile + apptainer.ociAutoPull = true + singularity.ociAutoPull = true + wave.enabled = true + wave.freeze = true + wave.strategy = 'conda,container' + } + emulate_amd64 { docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' } singularity { @@ -148,18 +161,6 @@ profiles { wave.freeze = true wave.strategy = 'conda,container' } - gitpod { - executor.name = 'local' - executor.cpus = 4 - executor.memory = 8.GB - process { - resourceLimits = [ - memory: 8.GB, - cpus : 4, - time : 1.h - ] - } - } gpu { docker.runOptions = '-u $(id -u):$(id -g) --gpus all' apptainer.runOptions = '--nv' @@ -169,6 +170,8 @@ profiles { test_full { includeConfig 'conf/test_full.config' } } +// Set AWS client to anonymous when using the default igenomes_base +aws.client.anonymous = !params.igenomes_ignore && params.igenomes_base?.startsWith('s3://ngi-igenomes/igenomes/') ?: false // Load nf-core custom profiles from different institutions // If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. @@ -277,51 +280,32 @@ manifest { contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') orcid: '' ], + [ + name: ' Dongze H', + affiliation: '', + email: '', + github: '', + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: '' + ], ] homePage = 'https://github.com/nf-core/scrnaseq' description = """Pipeline for processing 10x Genomics single cell rnaseq data""" mainScript = 'main.nf' defaultBranch = 'master' - nextflowVersion = '!>=24.10.5' - version = '2.8.0dev' + nextflowVersion = '!>=25.04.0' + version = '4.1.0' doi = '' } // Nextflow plugins plugins { - id 'nf-schema@2.4.2' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.5.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { defaultIgnoreParams = ["genomes"] monochromeLogs = params.monochrome_logs - help { - enabled = true - command = "nextflow run nf-core/scrnaseq -profile --input samplesheet.csv --outdir " - fullParameter = "help_full" - showHiddenParameter = "show_hidden" - beforeText = """ --\033[2m----------------------------------------------------\033[0m- - \033[0;32m,--.\033[0;30m/\033[0;32m,-.\033[0m -\033[0;34m ___ __ __ __ ___ \033[0;32m/,-._.--~\'\033[0m -\033[0;34m |\\ | |__ __ / ` / \\ |__) |__ \033[0;33m} {\033[0m -\033[0;34m | \\| | \\__, \\__/ | \\ |___ \033[0;32m\\`-._,-`-,\033[0m - \033[0;32m`._,._,\'\033[0m -\033[0;35m nf-core/scrnaseq ${manifest.version}\033[0m --\033[2m----------------------------------------------------\033[0m- -""" - afterText = """${manifest.doi ? "\n* The pipeline\n" : ""}${manifest.doi.tokenize(",").collect { " https://doi.org/${it.trim().replace('https://doi.org/','')}"}.join("\n")}${manifest.doi ? "\n" : ""} -* The nf-core framework - https://doi.org/10.1038/s41587-020-0439-x - -* Software dependencies - https://github.com/nf-core/scrnaseq/blob/master/CITATIONS.md -""" - } - summary { - beforeText = validation.help.beforeText - afterText = validation.help.afterText - } } // Load modules.config for DSL2 module specific options diff --git a/nextflow_schema.json b/nextflow_schema.json index a98f13d0..a6b2ebd3 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -224,6 +224,18 @@ "fa_icon": "far calendar", "description": "Suffix to add to the trace report filename. Default is the date and time in the format yyyy-MM-dd_HH-mm-ss.", "hidden": true + }, + "help": { + "type": ["boolean", "string"], + "description": "Display the help message." + }, + "help_full": { + "type": "boolean", + "description": "Display the full detailed help message." + }, + "show_hidden": { + "type": "boolean", + "description": "Display hidden parameters in the help message (only works when --help or --help_full are provided)." } } } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 2d64395d..d7f59f69 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -21,9 +21,9 @@ { "@id": "./", "@type": "Dataset", - "creativeWorkStatus": "InProgress", - "datePublished": "2025-07-08T11:39:16+00:00", - "description": "

\n \n \n \"nf-core/scrnaseq\"\n \n

\n\n[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/scrnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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%A524.10.5-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.3.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.3.2)\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/scrnaseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![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/scrnaseq** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\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\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/scrnaseq \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\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/scrnaseq/usage) and the [parameter documentation](https://nf-co.re/scrnaseq/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/scrnaseq/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/scrnaseq/output).\n\n## Credits\n\nnf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\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 `#scrnaseq` channel](https://nfcore.slack.com/channels/scrnaseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\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", + "creativeWorkStatus": "Stable", + "datePublished": "2025-10-16T13:39:12+00:00", + "description": "

\n \n \n \"nf-core/scrnaseq\"\n \n

\n\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-core/scrnaseq)\n[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/scrnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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.4.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.4.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/scrnaseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![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/scrnaseq** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\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\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/scrnaseq \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\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/scrnaseq/usage) and the [parameter documentation](https://nf-co.re/scrnaseq/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/scrnaseq/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/scrnaseq/output).\n\n## Credits\n\nnf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G, Dongze H.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\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 `#scrnaseq` channel](https://nfcore.slack.com/channels/scrnaseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\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", "hasPart": [ { "@id": "main.nf" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#244931f2-1b9e-455a-a8b4-139a382be3a1" + "@id": "#183f7360-b1b0-4a92-a6bb-07230a31f871" } ], "name": "nf-core/scrnaseq" @@ -128,7 +128,7 @@ } ], "dateCreated": "", - "dateModified": "2025-07-08T11:39:16Z", + "dateModified": "2025-10-16T13:39:12Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -151,8 +151,8 @@ "sdPublisher": { "@id": "https://nf-co.re/" }, - "url": ["https://github.com/nf-core/scrnaseq", "https://nf-co.re/scrnaseq/dev/"], - "version": ["2.8.0dev"] + "url": ["https://github.com/nf-core/scrnaseq", "https://nf-co.re/scrnaseq/4.1.0/"], + "version": ["4.1.0"] }, { "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow", @@ -164,14 +164,14 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=24.10.5" + "version": "!>=25.04.0" }, { - "@id": "#244931f2-1b9e-455a-a8b4-139a382be3a1", + "@id": "#183f7360-b1b0-4a92-a6bb-07230a31f871", "@type": "TestSuite", "instance": [ { - "@id": "#72edb790-585a-4a53-862b-83177c420bf1" + "@id": "#9b55a594-7e5f-4b75-921f-70f6930fb5a4" } ], "mainEntity": { @@ -180,7 +180,7 @@ "name": "Test suite for nf-core/scrnaseq" }, { - "@id": "#72edb790-585a-4a53-862b-83177c420bf1", + "@id": "#9b55a594-7e5f-4b75-921f-70f6930fb5a4", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/scrnaseq", "resource": "repos/nf-core/scrnaseq/actions/workflows/nf-test.yml", diff --git a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf index 95a18236..0aeabc12 100644 --- a/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_scrnaseq_pipeline/main.nf @@ -11,6 +11,7 @@ include { UTILS_NFSCHEMA_PLUGIN } from '../../nf-core/utils_nfschema_plugin' include { paramsSummaryMap } from 'plugin/nf-schema' include { samplesheetToList } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' include { imNotification } from '../../nf-core/utils_nfcore_pipeline' @@ -32,6 +33,9 @@ workflow PIPELINE_INITIALISATION { nextflow_cli_args // array: List of positional nextflow CLI args outdir // string: The output directory where the results will be saved input // string: Path to input samplesheet + help // boolean: Display help message and exit + help_full // boolean: Show the full help message + show_hidden // boolean: Show hidden parameters in the help message main: @@ -50,10 +54,35 @@ workflow PIPELINE_INITIALISATION { // // Validate parameters and generate parameter summary to stdout // + before_text = """ +-\033[2m----------------------------------------------------\033[0m- + \033[0;32m,--.\033[0;30m/\033[0;32m,-.\033[0m +\033[0;34m ___ __ __ __ ___ \033[0;32m/,-._.--~\'\033[0m +\033[0;34m |\\ | |__ __ / ` / \\ |__) |__ \033[0;33m} {\033[0m +\033[0;34m | \\| | \\__, \\__/ | \\ |___ \033[0;32m\\`-._,-`-,\033[0m + \033[0;32m`._,._,\'\033[0m +\033[0;35m nf-core/scrnaseq ${workflow.manifest.version}\033[0m +-\033[2m----------------------------------------------------\033[0m- +""" + after_text = """${workflow.manifest.doi ? "\n* The pipeline\n" : ""}${workflow.manifest.doi.tokenize(",").collect { " https://doi.org/${it.trim().replace('https://doi.org/','')}"}.join("\n")}${workflow.manifest.doi ? "\n" : ""} +* The nf-core framework + https://doi.org/10.1038/s41587-020-0439-x + +* Software dependencies + https://github.com/nf-core/scrnaseq/blob/master/CITATIONS.md +""" + command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --outdir " + UTILS_NFSCHEMA_PLUGIN ( workflow, validate_params, - null + null, + help, + help_full, + show_hidden, + before_text, + after_text, + command ) // diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml deleted file mode 100644 index f8476112..00000000 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nextflow_pipeline: - - subworkflows/nf-core/utils_nextflow_pipeline/** diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml deleted file mode 100644 index ac8523c9..00000000 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nfcore_pipeline: - - subworkflows/nf-core/utils_nfcore_pipeline/** diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf index 4994303e..ee4738c8 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -4,6 +4,7 @@ include { paramsSummaryLog } from 'plugin/nf-schema' include { validateParameters } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' workflow UTILS_NFSCHEMA_PLUGIN { @@ -15,29 +16,56 @@ workflow UTILS_NFSCHEMA_PLUGIN { // when this input is empty it will automatically use the configured schema or // "${projectDir}/nextflow_schema.json" as default. This input should not be empty // for meta pipelines + help // boolean: show help message + help_full // boolean: show full help message + show_hidden // boolean: show hidden parameters in help message + before_text // string: text to show before the help message and parameters summary + after_text // string: text to show after the help message and parameters summary + command // string: an example command of the pipeline main: + if(help || help_full) { + help_options = [ + beforeText: before_text, + afterText: after_text, + command: command, + showHidden: show_hidden, + fullHelp: help_full, + ] + if(parameters_schema) { + help_options << [parametersSchema: parameters_schema] + } + log.info paramsHelp( + help_options, + params.help instanceof String ? params.help : "", + ) + exit 0 + } + // // Print parameter summary to stdout. This will display the parameters // that differ from the default given in the JSON schema // + + summary_options = [:] if(parameters_schema) { - log.info paramsSummaryLog(input_workflow, parameters_schema:parameters_schema) - } else { - log.info paramsSummaryLog(input_workflow) + summary_options << [parametersSchema: parameters_schema] } + log.info before_text + log.info paramsSummaryLog(summary_options, input_workflow) + log.info after_text // // Validate the parameters using nextflow_schema.json or the schema // given via the validation.parametersSchema configuration option // if(validate_params) { + validateOptions = [:] if(parameters_schema) { - validateParameters(parameters_schema:parameters_schema) - } else { - validateParameters() + validateOptions << [parametersSchema: parameters_schema] } + validateParameters(validateOptions) } emit: diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test index 8fb30164..c977917a 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test @@ -25,6 +25,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -51,6 +57,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -77,6 +89,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -103,6 +121,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -114,4 +138,36 @@ nextflow_workflow { ) } } + + test("Should create a help message") { + + when { + + params { + test_data = '' + outdir = null + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = true + input[4] = false + input[5] = false + input[6] = "Before" + input[7] = "After" + input[8] = "nextflow run test/test" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } } diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 09ef842a..8d8c7371 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,8 +1,8 @@ plugins { - id "nf-schema@2.4.2" + id "nf-schema@2.5.1" } validation { parametersSchema = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" monochromeLogs = true -} \ No newline at end of file +} diff --git a/tests/.nftignore b/tests/.nftignore index 158c83c5..e128a128 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -1,10 +1,11 @@ .DS_Store multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt -multiqc/multiqc_data/BETA-multiqc.parquet +multiqc/multiqc_data/multiqc.parquet multiqc/multiqc_data/multiqc.log multiqc/multiqc_data/multiqc_data.json multiqc/multiqc_data/multiqc_sources.txt multiqc/multiqc_data/multiqc_software_versions.txt +multiqc/multiqc_data/llms-full.txt multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} multiqc/multiqc_report.html fastqc/*_fastqc.{html,zip} diff --git a/tests/default.nf.test b/tests/default.nf.test index d320d3a0..d4a30f4d 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { 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 test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/nf_core_scrnaseq_software_mqc_versions.yml"), // All stable path name, with a relative path From 242f8021272b012b5fa17ff3fc8a22178c50c548 Mon Sep 17 00:00:00 2001 From: nictru Date: Wed, 22 Oct 2025 21:16:50 +0200 Subject: [PATCH 80/82] Fix ro-crate --- ro-crate-metadata.json | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 92619d5b..4f72ac41 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "Stable", "datePublished": "2025-10-16T13:39:12+00:00", - "description": "

\n \n \n \"nf-core/scrnaseq\"\n \n

\n\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-core/scrnaseq)\n[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml)[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/scrnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\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.4.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.4.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/scrnaseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![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/scrnaseq** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\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\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/scrnaseq \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\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/scrnaseq/usage) and the [parameter documentation](https://nf-co.re/scrnaseq/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/scrnaseq/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/scrnaseq/output).\n\n## Credits\n\nnf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Peltzer A, Sturm G, Dongze H.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\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 `#scrnaseq` channel](https://nfcore.slack.com/channels/scrnaseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\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", + "description": "

\n \n \n \"nf-core/scrnaseq\"\n \n

\n\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-core/scrnaseq)\n[![GitHub Actions CI Status](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/scrnaseq/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/scrnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/scrnaseq/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/scrnaseq/results)\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.3568187-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.3568187)\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.4.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.4.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/scrnaseq)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23scrnaseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/scrnaseq)[![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/scrnaseq** is a bioinformatics best-practice analysis pipeline for processing 10x Genomics single-cell RNA-seq data.\n\nThis is a community effort in building a pipeline capable to support:\n\n- SimpleAF(Alevin-Fry) + AlevinQC\n- STARSolo\n- Kallisto + BUStools\n- Cellranger\n\n> [!IMPORTANT]\n> Cellranger is a commercial tool from 10X Genomics Inc. and falls under the EULA from 10X Genomics Inc. The container provided for the CellRanger functionality in this pipeline has been built by the nf-core community and is therefore _not supported by 10X genomics_ directly. We are in discussions with 10X on how to improve the user experience and licence situation for both us as a community as well as 10X and end users and will update this statement here accordingly.\n\n## Documentation\n\nThe nf-core/scrnaseq pipeline comes with documentation about the pipeline [usage](https://nf-co.re/scrnaseq/usage), [parameters](https://nf-co.re/scrnaseq/parameters) and [output](https://nf-co.re/scrnaseq/output).\n\n![scrnaseq workflow](docs/images/scrnaseq_pipeline_V3.0-metro_clean.png)\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:\n\n`samplesheet.csv`:\n\n```csv\nsample,fastq_1,fastq_2,expected_cells\npbmc8k,pbmc8k_S1_L007_R1_001.fastq.gz,pbmc8k_S1_L007_R2_001.fastq.gz,10000\npbmc8k,pbmc8k_S1_L008_R1_001.fastq.gz,pbmc8k_S1_L008_R2_001.fastq.gz,10000\n```\n\nEach row represents a fastq file (single-end) or a pair of fastq files (paired end).\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/scrnaseq \\\n -profile \\\n --input samplesheet.csv \\\n --fasta GRCm38.p6.genome.chr19.fa \\\n --gtf gencode.vM19.annotation.chr19.gtf \\\n --protocol 10XV2 \\\n --aligner \\\n --outdir \n```\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/scrnaseq/usage) and the [parameter documentation](https://nf-co.re/scrnaseq/parameters).\n\n## Decision Tree for users\n\nThe nf-core/scrnaseq pipeline features several paths to analyze your single cell data. Future additions will also be done soon, e.g. the addition of multi-ome analysis types. To aid users in analyzing their data, we have added a decision tree to help people decide on what type of analysis they want to run and how to choose appropriate parameters for that.\n\n```mermaid\ngraph TD\n A[sc RNA] -->|alevin-fry| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|CellRanger| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|kbpython| B(h5ad/seurat/mtx matrices)\n A[sc RNA] -->|STARsolo| B(h5ad/seurat/mtx matrices)\n```\n\nOptions for the respective alignment method can be found [here](https://nf-co.re/scrnaseq/docs/usage/#aligning-options) to choose between methods.\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/scrnaseq/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/scrnaseq/output).\n\n## Credits\n\nnf-core/scrnaseq was originally written by Bailey PJ, Botvinnik O, Marques de Almeida F, Gabernet G, Peltzer A, Sturm G.\n\nWe thank the following people and teams for their extensive assistance in the development of this pipeline:\n\n- @heylf\n- @KevinMenden\n- @FloWuenne\n- @rob-p\n- [GHGA](https://www.ghga.de/)\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 `#scrnaseq` channel](https://nfcore.slack.com/channels/scrnaseq) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/scrnaseq for your analysis, please cite it using the following doi: [10.5281/zenodo.3568187](https://doi.org/10.5281/zenodo.3568187)\n\nThe basic benchmarks that were used as motivation for incorporating the available modular workflows can be found in [this publication](https://www.biorxiv.org/content/10.1101/673285v2).\n\nWe offer all three paths for the processing of scRNAseq data so it remains up to the user to decide which pipeline workflow is chosen for a particular analysis question.\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n", "hasPart": [ { "@id": "main.nf" @@ -192,8 +192,13 @@ "sdPublisher": { "@id": "https://nf-co.re/" }, - "url": ["https://github.com/nf-core/scrnaseq", "https://nf-co.re/scrnaseq/4.1.0/"], - "version": ["4.1.0"] + "url": [ + "https://github.com/nf-core/scrnaseq", + "https://nf-co.re/scrnaseq/4.1.0/" + ], + "version": [ + "4.1.0" + ] }, { "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow", From b85978bfcf306678cc31802fcb632434fb37abb9 Mon Sep 17 00:00:00 2001 From: Nico Trummer Date: Thu, 23 Oct 2025 20:03:14 +0200 Subject: [PATCH 81/82] Update test snapshots --- tests/main_pipeline_cellranger.nf.test.snap | 5 +++-- tests/main_pipeline_cellrangerarc.nf.test.snap | 5 +++-- tests/main_pipeline_cellrangermulti.nf.test.snap | 10 ++++++---- tests/main_pipeline_kallisto.nf.test.snap | 5 +++-- tests/main_pipeline_simpleaf.nf.test.snap | 5 +++-- tests/main_pipeline_star.nf.test.snap | 6 +++--- 6 files changed, 21 insertions(+), 15 deletions(-) diff --git a/tests/main_pipeline_cellranger.nf.test.snap b/tests/main_pipeline_cellranger.nf.test.snap index 3d1813ac..a8d98e06 100644 --- a/tests/main_pipeline_cellranger.nf.test.snap +++ b/tests/main_pipeline_cellranger.nf.test.snap @@ -235,7 +235,6 @@ "fastqc/Sample_Y_4_fastqc.zip", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/cellranger-count-stats-table.txt", "multiqc/multiqc_data/cellranger-count-warnings-table.txt", "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", @@ -248,10 +247,12 @@ "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/mqc_cellranger_count_bc_knee.txt", "multiqc/multiqc_data/mqc_cellranger_count_genesXcell.txt", "multiqc/multiqc_data/mqc_cellranger_count_saturation.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_cellranger_count.txt", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", @@ -382,6 +383,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-08-04T08:28:33.037302748" + "timestamp": "2025-10-23T19:11:11.981129882" } } \ No newline at end of file diff --git a/tests/main_pipeline_cellrangerarc.nf.test.snap b/tests/main_pipeline_cellrangerarc.nf.test.snap index c0994daf..d34baeef 100644 --- a/tests/main_pipeline_cellrangerarc.nf.test.snap +++ b/tests/main_pipeline_cellrangerarc.nf.test.snap @@ -160,7 +160,6 @@ "fastqc/10k_PBMC_5_fastqc.zip", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", "multiqc/multiqc_data/fastqc_overrepresented_sequences_plot.txt", @@ -172,7 +171,9 @@ "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_fastqc.txt", @@ -285,6 +286,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-08-04T08:33:34.787444894" + "timestamp": "2025-10-23T19:10:33.168539516" } } \ No newline at end of file diff --git a/tests/main_pipeline_cellrangermulti.nf.test.snap b/tests/main_pipeline_cellrangermulti.nf.test.snap index d1154bf4..c0552368 100644 --- a/tests/main_pipeline_cellrangermulti.nf.test.snap +++ b/tests/main_pipeline_cellrangermulti.nf.test.snap @@ -1027,7 +1027,6 @@ "fastqc/PBMC_10K_vdj_2_fastqc.zip", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", "multiqc/multiqc_data/fastqc_overrepresented_sequences_plot.txt", @@ -1039,7 +1038,9 @@ "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_fastqc.txt", @@ -1246,7 +1247,7 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-08-04T08:47:14.585663687" + "timestamp": "2025-10-23T19:20:06.700106749" }, "test-dataset_cellrangermulti_aligner_rat": { "content": [ @@ -1698,7 +1699,6 @@ "fastqc/10k_Wistar_Rat_gex_9_fastqc.zip", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", @@ -1709,7 +1709,9 @@ "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_fastqc.txt", @@ -1850,6 +1852,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-08-04T08:56:26.746631285" + "timestamp": "2025-10-23T19:49:18.434722245" } } \ No newline at end of file diff --git a/tests/main_pipeline_kallisto.nf.test.snap b/tests/main_pipeline_kallisto.nf.test.snap index c2eb8ebd..6f688ef5 100644 --- a/tests/main_pipeline_kallisto.nf.test.snap +++ b/tests/main_pipeline_kallisto.nf.test.snap @@ -99,7 +99,6 @@ "kallisto/mtx_conversions/combined_raw_matrix.seurat.rds", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", @@ -110,7 +109,9 @@ "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_fastqc.txt", @@ -211,6 +212,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-08-04T09:00:22.183689983" + "timestamp": "2025-10-23T19:08:08.954153394" } } \ No newline at end of file diff --git a/tests/main_pipeline_simpleaf.nf.test.snap b/tests/main_pipeline_simpleaf.nf.test.snap index eb4e9549..ddaa7a6c 100644 --- a/tests/main_pipeline_simpleaf.nf.test.snap +++ b/tests/main_pipeline_simpleaf.nf.test.snap @@ -44,7 +44,6 @@ "fastqc/Sample_Y_4_fastqc.zip", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", @@ -55,7 +54,9 @@ "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_fastqc.txt", @@ -185,6 +186,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-08-04T09:02:37.806014973" + "timestamp": "2025-10-23T19:08:45.556388689" } } \ No newline at end of file diff --git a/tests/main_pipeline_star.nf.test.snap b/tests/main_pipeline_star.nf.test.snap index 11204653..a3097064 100644 --- a/tests/main_pipeline_star.nf.test.snap +++ b/tests/main_pipeline_star.nf.test.snap @@ -1,7 +1,6 @@ { "test-dataset_star_aligner": { "content": [ - 19, { "FASTQC": { "fastqc": "0.12.1" @@ -37,7 +36,6 @@ "fastqc/Sample_Y_4_fastqc.zip", "multiqc", "multiqc/multiqc_data", - "multiqc/multiqc_data/BETA-multiqc.parquet", "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", "multiqc/multiqc_data/fastqc_adapter_content_plot.txt", "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", @@ -48,7 +46,9 @@ "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", "multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt", + "multiqc/multiqc_data/llms-full.txt", "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_fastqc.txt", @@ -232,6 +232,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-08-04T09:08:55.70547428" + "timestamp": "2025-10-23T19:11:01.001258" } } \ No newline at end of file From 6a1a2bd4d82f53a39dfda5812b8cdc9bbea4b5c9 Mon Sep 17 00:00:00 2001 From: Gregor Sturm Date: Fri, 24 Oct 2025 09:21:36 +0200 Subject: [PATCH 82/82] Attempt to fix awsfulltest --- .github/workflows/awsfulltest.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 1fc88781..ffadf4dc 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -36,13 +36,14 @@ jobs: parameters: | { "hook_url": "${{ secrets.MEGATESTS_ALERTS_SLACK_HOOK_URL }}", - "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/scrnaseq/results-${{ steps.revision.outputs.revision }}" + "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/scrnaseq/results-${{ steps.revision.outputs.revision }}/aligner_${{ matrix.aligner }}", + "aligner": "${{ matrix.aligner }}" } profiles: test_full - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: - name: Seqera Platform debug log file + name: seqera_platform_debug_log_${{ matrix.aligner }} path: | - tower_action_*.log - tower_action_*.json + seqera_platform_action_*.log + seqera_platform_action_*.json