diff --git a/modules/nf-core/cellranger/count/main.nf b/modules/nf-core/cellranger/count/main.nf index 92f755966863..11e096458303 100644 --- a/modules/nf-core/cellranger/count/main.nf +++ b/modules/nf-core/cellranger/count/main.nf @@ -7,6 +7,8 @@ process CELLRANGER_COUNT { input: tuple val(meta), path(reads, stageAs: "fastq_???/*") path reference + val skip_renaming + val ignore_filename_pattern output: tuple val(meta), path("**/outs/**"), emit: outs diff --git a/modules/nf-core/cellranger/count/templates/cellranger_count.py b/modules/nf-core/cellranger/count/templates/cellranger_count.py index 41b9bb8fe2c6..bba219836bf3 100644 --- a/modules/nf-core/cellranger/count/templates/cellranger_count.py +++ b/modules/nf-core/cellranger/count/templates/cellranger_count.py @@ -38,23 +38,31 @@ def chunk_iter(seq, size): filename_pattern = r"([^a-zA-Z0-9])R1([^a-zA-Z0-9])" for i, (r1, r2) in enumerate(chunk_iter(fastqs, 2), start=1): - # double escapes are required because nextflow processes this python 'template' - if re.sub(filename_pattern, r"\\1R2\\2", r1.name) != r2.name: - raise AssertionError( - dedent( - f"""\ - We expect R1 and R2 of the same sample to have the same filename except for R1/R2. - This has been checked by replacing "R1" with "R2" in the first filename and comparing it to the second filename. - If you believe this check shouldn't have failed on your filenames, please report an issue on GitHub! - - Files involved: - - {r1} - - {r2} - """ + if "${skip_renaming}" == "true": # nf variables are true/false, which are different from Python + resolved_name_r1 = r1.name + resolved_name_r2 = r2.name + else: + # double escapes are required because nextflow processes this python 'template' + if (re.sub(filename_pattern, r"\\1R2\\2", r1.name) != r2.name) and ("${ignore_filename_pattern}" == "false"): + raise AssertionError( + dedent( + f"""\ + We expect R1 and R2 of the same sample to have the same filename except for R1/R2. + This has been checked by replacing "R1" with "R2" in the first filename and comparing it to the second filename. + If you believe this check shouldn't have failed on your filenames, please report an issue on GitHub! + + Files involved: + - {r1} + - {r2} + """ + ) ) - ) - r1.rename(fastq_all / f"{sample_id}_S1_L{i:03d}_R1_001.fastq.gz") - r2.rename(fastq_all / f"{sample_id}_S1_L{i:03d}_R2_001.fastq.gz") + + resolved_name_r1 = f"{sample_id}_S1_L{i:03d}_R1_001.fastq.gz" + resolved_name_r2 = f"{sample_id}_S1_L{i:03d}_R2_001.fastq.gz" + + r1.rename(fastq_all / resolved_name_r1) + r2.rename(fastq_all / resolved_name_r2) # fmt: off run( diff --git a/modules/nf-core/cellranger/count/tests/main.nf.test b/modules/nf-core/cellranger/count/tests/main.nf.test index 94a9861ca55a..146cf37e8fe7 100644 --- a/modules/nf-core/cellranger/count/tests/main.nf.test +++ b/modules/nf-core/cellranger/count/tests/main.nf.test @@ -48,6 +48,8 @@ nextflow_process { ] ] input[1] = CELLRANGER_MKREF.out.reference + input[2] = false + input[3] = false """ } } @@ -90,6 +92,8 @@ nextflow_process { ] ] input[1] = CELLRANGER_MKREF.out.reference + input[2] = false + input[3] = false """ } } @@ -102,5 +106,82 @@ nextflow_process { } } + test("10x example file - nonstandard filename renaming fails") { + config "./nextflow.config" + tag "cellranger_rename_logic" + + when { + process { + """ + original_r1 = file(params.modules_testdata_base_path + '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', checkIfExists: true) + original_r2 = file(params.modules_testdata_base_path + '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', checkIfExists: true) + + new_r1_loc = "${workDir}/fastqs/subsampled_5k_human_antiCMV_T_TBNK_connect_GEX_1.fastq.gz" + new_r2_loc = "${workDir}/fastqs/subsampled_5k_human_antiCMV_T_TBNK_connect_GEX_2.fastq.gz" + + original_r1.copyTo(new_r1_loc) + original_r2.copyTo(new_r2_loc) + + input[0] = [ + [ id:'test_10x', single_end:false, strandedness:'auto' ], // meta map + [ file(new_r1_loc), file(new_r2_loc) ] + ] + input[1] = CELLRANGER_MKREF.out.reference + input[2] = false + input[3] = false + """ + } + } + + then { assert process.failed } + } + test("10x example file - nonstandard filename, rename succeeds with skipped validation") { + config "./nextflow.config" + tag "cellranger_rename_logic" + + when { + process { + """ + original_r1 = file(params.modules_testdata_base_path + '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', checkIfExists: true) + original_r2 = file(params.modules_testdata_base_path + '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', checkIfExists: true) + + new_r1_loc = "${workDir}/fastqs/subsampled_5k_human_antiCMV_T_TBNK_connect_GEX_1.fastq.gz" + new_r2_loc = "${workDir}/fastqs/subsampled_5k_human_antiCMV_T_TBNK_connect_GEX_2.fastq.gz" + + original_r1.copyTo(new_r1_loc) + original_r2.copyTo(new_r2_loc) + + input[0] = [ + [ id:'test_10x', single_end:false, strandedness:'auto' ], // meta map + [ file(new_r1_loc), file(new_r2_loc) ] + ] + input[1] = CELLRANGER_MKREF.out.reference + input[2] = false + input[3] = true + """ + } + } + then { + assertAll( + { assert process.success }, + { + assert snapshot( + process.out.versions_cellranger, + process.out.outs[0][1].findAll { file(it).name !in [ + 'web_summary.html', // unstable checksum + 'possorted_genome_bam.bam.bai', // unstable checksum despite identical content, verified with samtools idxstats + 'possorted_genome_bam.bam', // unstable checksum due to header + 'barcodes.tsv.gz' // empty file in test data -> would raise linting error + ]} + [ + "possorted_genome_bam_samlines:" + sam(process.out.outs.get(0).get(1).find { file(it).name == "possorted_genome_bam.bam" }).getSamLinesMD5() // checksum is unstable when header is included + ], + ).match() + }, + { assert file(process.out.outs.get(0).get(1).find { file(it).name == 'web_summary.html' }).exists() }, + { assert file(process.out.outs.get(0).get(1).find { file(it).name == 'barcodes.tsv.gz' }).exists() }, + { assert file(process.out.outs.get(0).get(1).find { file(it).name == 'possorted_genome_bam.bam.bai' }).exists() }, + ) + } + } } 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 1348762725c2..455b863bf8a4 100644 --- a/modules/nf-core/cellranger/count/tests/main.nf.test.snap +++ b/modules/nf-core/cellranger/count/tests/main.nf.test.snap @@ -16,11 +16,34 @@ "possorted_genome_bam_samlines:14b70a2253bcaf40b1c6428e5b66f7a0" ] ], - "timestamp": "2026-03-13T11:50:19.775498195", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.4" - } + }, + "timestamp": "2026-03-13T11:50:19.775498195" + }, + "10x example file - nonstandard filename, rename succeeds with skipped validation": { + "content": [ + [ + "versions.yml:md5,0d99b1cd733a51d67540d796e6b1e1f6" + ], + [ + "filtered_feature_bc_matrix.h5:md5,530804f5b2fdc9d262b4b6d32bde8b7b", + "features.tsv.gz:md5,9f93621be0bede2b75596ad255607633", + "matrix.mtx.gz:md5,925a0f46932cba157c44cb94e0c06314", + "metrics_summary.csv:md5,14a544ef1204f4f9d128bc15febb94cf", + "molecule_info.h5:md5,ac30e998aae699f09978be60d548635c", + "raw_feature_bc_matrix.h5:md5,803d3ffa688dccd898c073b300c23ff9", + "features.tsv.gz:md5,9f93621be0bede2b75596ad255607633", + "matrix.mtx.gz:md5,a030e644e8b57df71142e9e26c306b5e", + "possorted_genome_bam_samlines:14b70a2253bcaf40b1c6428e5b66f7a0" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.8" + }, + "timestamp": "2026-05-14T14:00:50.314716225" }, "10x example file - stub": { "content": [ @@ -53,10 +76,10 @@ ] } ], - "timestamp": "2026-03-11T15:59:25.090371925", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.4" - } + }, + "timestamp": "2026-03-11T15:59:25.090371925" } } \ No newline at end of file diff --git a/modules/nf-core/cellranger/multi/main.nf b/modules/nf-core/cellranger/multi/main.nf index fcefdc3c1955..a2d3b74624b5 100644 --- a/modules/nf-core/cellranger/multi/main.nf +++ b/modules/nf-core/cellranger/multi/main.nf @@ -26,6 +26,7 @@ process CELLRANGER_MULTI { path frna_sampleinfo , stageAs: "references/frna/*" path ocm_barcodes , stageAs: "references/ocm/barcodes/*" val skip_renaming + val ignore_filename_pattern output: tuple val(meta), path("cellranger_multi_config.csv"), emit: config diff --git a/modules/nf-core/cellranger/multi/templates/cellranger_multi.py b/modules/nf-core/cellranger/multi/templates/cellranger_multi.py index 4deee39362e1..56a10d653829 100644 --- a/modules/nf-core/cellranger/multi/templates/cellranger_multi.py +++ b/modules/nf-core/cellranger/multi/templates/cellranger_multi.py @@ -52,7 +52,7 @@ def chunk_iter(seq, size): else: # double escapes are required because nextflow processes this python 'template' - if re.sub(filename_pattern, r"\\1R2\\2", r1.name) != r2.name: + if (re.sub(filename_pattern, r"\\1R2\\2", r1.name) != r2.name) and ("${ignore_filename_pattern}" == "false"): raise AssertionError( dedent( f"""\ diff --git a/modules/nf-core/cellranger/multi/tests/main.nf.test b/modules/nf-core/cellranger/multi/tests/main.nf.test index 381da3509087..46707413ed54 100644 --- a/modules/nf-core/cellranger/multi/tests/main.nf.test +++ b/modules/nf-core/cellranger/multi/tests/main.nf.test @@ -990,4 +990,230 @@ nextflow_process { } } + + test("cellranger - multi - 10k - kidney - flex - singleplex - nonstandard filename renaming fails") { + tag "cellranger_rename_logic" + + when { + process { + """ + // + // preparation: unfortunately have to repeat data load + // + + /***************************/ + /*** stage 10k Kidney data ***/ + /***************************/ + + // stage FASTQ test data + original_r1 = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/singleplex_flex/Human_Kidney_GEM-X_Flex_S1_L001_R1_001.subsampled.fastq.gz', checkIfExists: true) + original_r2 = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/singleplex_flex/Human_Kidney_GEM-X_Flex_S1_L001_R2_001.subsampled.fastq.gz', checkIfExists: true) + + new_r1_loc = "${workDir}/fastqs/Human_Kidney_GEM-X_Flex_S1_1.subsampled.fastq.gz" + new_r2_loc = "${workDir}/fastqs/Human_Kidney_GEM-X_Flex_S1_2.subsampled.fastq.gz" + + original_r1.copyTo(new_r1_loc) + original_r2.copyTo(new_r2_loc) + fastqs = [ new_r1_loc, new_r2_loc ] + + def fastq_samplename_10k_kidney = "subsampled_10k_human_kidney_gemx_flex" + + /*******************************/ + /*** end stage 10k Kidney data ***/ + /*******************************/ + + /***************************/ + /*** stage GEX reference ***/ + /***************************/ + + // will build this as done in cellranger count test + gex_ref_fasta = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + gex_ref_gtf = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) + def gex_ref_name = "homo_sapiens_chr22_reference" + + /*******************************/ + /*** end stage GEX reference ***/ + /*******************************/ + + probeset = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/references/flex/Chromium_Human_Transcriptome_Probe_Set_v1.1.0_GRCh38-2024-A.chr22.csv', checkIfExists: true) + + // 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_ocm_barcodes = [] + ch_cmo_sample_assignment = [] + ch_frna_sampleinfo = [] + + // collect references and fastq files for staging + ch_gex_fastqs_10k_kidney = Channel.of( fastqs ) + .collect() + .map { reads -> [ [ id:fastq_samplename_10k_kidney , options:[ "create-bam":false ] ], reads ] } + + input[0] = [ id:'subsampled_10k_human_kidney_gemx_flex', single_end:false ] + input[1] = ch_gex_fastqs_10k_kidney + 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 + input[7] = CELLRANGER_MKREF.out.reference + input[8] = probeset + input[9] = ch_gex_targetpanel + input[10] = ch_vdj_reference + input[11] = ch_vdj_primer_index + input[12] = ch_fb_reference + 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] = ch_ocm_barcodes + input[20] = false // default to false to guarantee renaming during test + input[21] = false // test false to test failure of renaming in non-standard filename scenario + """ + } + } + + then { assert process.failed } + } + + test("cellranger - multi - 10k - kidney - flex - singleplex - nonstandard filename, rename succeeds with skipped validation") { + tag "cellranger_rename_logic" + + when { + process { + """ + // + // preparation: unfortunately have to repeat data load + // + + /***************************/ + /*** stage 10k Kidney data ***/ + /***************************/ + + // stage FASTQ test data + original_r1 = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/singleplex_flex/Human_Kidney_GEM-X_Flex_S1_L001_R1_001.subsampled.fastq.gz', checkIfExists: true) + original_r2 = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/singleplex_flex/Human_Kidney_GEM-X_Flex_S1_L001_R2_001.subsampled.fastq.gz', checkIfExists: true) + + new_r1_loc = "${workDir}/fastqs/Human_Kidney_GEM-X_Flex_S1_1.subsampled.fastq.gz" + new_r2_loc = "${workDir}/fastqs/Human_Kidney_GEM-X_Flex_S1_2.subsampled.fastq.gz" + + original_r1.copyTo(new_r1_loc) + original_r2.copyTo(new_r2_loc) + fastqs = [ new_r1_loc, new_r2_loc ] + + def fastq_samplename_10k_kidney = "subsampled_10k_human_kidney_gemx_flex" + + /*******************************/ + /*** end stage 10k Kidney data ***/ + /*******************************/ + + /***************************/ + /*** stage GEX reference ***/ + /***************************/ + + // will build this as done in cellranger count test + gex_ref_fasta = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + gex_ref_gtf = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gtf', checkIfExists: true) + def gex_ref_name = "homo_sapiens_chr22_reference" + + /*******************************/ + /*** end stage GEX reference ***/ + /*******************************/ + + probeset = file(params.modules_testdata_base_path + 'genomics/homo_sapiens/10xgenomics/cellranger/references/flex/Chromium_Human_Transcriptome_Probe_Set_v1.1.0_GRCh38-2024-A.chr22.csv', checkIfExists: true) + + // 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_ocm_barcodes = [] + ch_cmo_sample_assignment = [] + ch_frna_sampleinfo = [] + + // collect references and fastq files for staging + ch_gex_fastqs_10k_kidney = Channel.of( fastqs ) + .collect() + .map { reads -> [ [ id:fastq_samplename_10k_kidney , options:[ "create-bam":false ] ], reads ] } + + input[0] = [ id:'subsampled_10k_human_kidney_gemx_flex', single_end:false ] + input[1] = ch_gex_fastqs_10k_kidney + 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 + input[7] = CELLRANGER_MKREF.out.reference + input[8] = probeset + input[9] = ch_gex_targetpanel + input[10] = ch_vdj_reference + input[11] = ch_vdj_primer_index + input[12] = ch_fb_reference + 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] = ch_ocm_barcodes + input[20] = false // default to false to guarantee renaming during test + input[21] = true // skip filename validation to allow non-standard filename scenario to succeed with renaming + """ + } + } + + 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 == 'filtered_feature_bc_matrix.h5' }, + 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 == 'sample_raw_feature_bc_matrix.h5' } + ).match() }, + { assert snapshot(process.out.versions_cellranger).match("versions-flex-singleplex") } + ) + } + } } 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 69e4cd30dcb8..093f85454bb4 100644 --- a/modules/nf-core/cellranger/multi/tests/main.nf.test.snap +++ b/modules/nf-core/cellranger/multi/tests/main.nf.test.snap @@ -5,11 +5,11 @@ "versions.yml:md5,1e16f7d40ef563f7d0a24f8944374d4d" ] ], - "timestamp": "2026-03-16T17:20:25.065276862", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.4" - } + }, + "timestamp": "2026-03-13T15:26:14.828577394" }, "cellranger - multi - 10k - PBMC": { "content": [ @@ -34,11 +34,11 @@ "reference.json:md5,384f6efabad59f6da5c89b862aee71a8" ] ], - "timestamp": "2026-03-13T15:20:21.751016877", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.4" - } + }, + "timestamp": "2026-03-13T15:20:21.751016877" }, "versions-PBMC": { "content": [ @@ -46,11 +46,11 @@ "versions.yml:md5,1e16f7d40ef563f7d0a24f8944374d4d" ] ], - "timestamp": "2026-03-13T15:20:21.797381186", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.4" - } + }, + "timestamp": "2026-03-13T15:20:21.797381186" }, "cellranger - multi - 10k - PBMC - with cmo": { "content": [ @@ -75,11 +75,11 @@ "reference.json:md5,384f6efabad59f6da5c89b862aee71a8" ] ], - "timestamp": "2026-03-13T15:21:51.02923865", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.4" - } + }, + "timestamp": "2026-03-13T15:21:51.02923865" }, "cellranger - multi - 10k - kidney - flex - singleplex": { "content": [ @@ -99,11 +99,11 @@ "sample_raw_feature_bc_matrix.h5:md5,45c0a4f2907c78b3aca295d0623e2163" ] ], - "timestamp": "2026-03-13T15:26:14.797582185", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.4" - } + }, + "timestamp": "2026-03-13T15:26:14.797582185" }, "versions-with-cmo": { "content": [ @@ -111,11 +111,11 @@ "versions.yml:md5,1e16f7d40ef563f7d0a24f8944374d4d" ] ], - "timestamp": "2026-03-13T15:21:51.055006548", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.4" - } + }, + "timestamp": "2026-03-13T15:21:51.055006548" }, "cellranger - multi - 5k - a549 - sc3 v3 - gex + crispr": { "content": [ @@ -135,11 +135,11 @@ ] ], - "timestamp": "2026-03-13T15:24:54.664342753", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.4" - } + }, + "timestamp": "2026-03-13T15:24:54.664342753" }, "versions-a549-crispr": { "content": [ @@ -147,11 +147,35 @@ "versions.yml:md5,1e16f7d40ef563f7d0a24f8944374d4d" ] ], - "timestamp": "2026-03-13T15:24:54.695962129", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.4" - } + }, + "timestamp": "2026-03-13T15:24:54.695962129" + }, + "cellranger - multi - 10k - kidney - flex - singleplex - nonstandard filename, rename succeeds with skipped validation": { + "content": [ + [ + "metrics_summary.csv:md5,065d5fa688d8a27d2fa25a8e0f03670d" + ], + [ + "filtered_feature_bc_matrix.h5:md5,9dd51a9b7bcbed4e33fca2fd912894b1" + ], + [ + "raw_feature_bc_matrix.h5:md5,3a9537d19966914ed90da35c9c5fe455" + ], + [ + "sample_filtered_feature_bc_matrix.h5:md5,12f93947e14929d7a5c4ba340e4aa81c" + ], + [ + "sample_raw_feature_bc_matrix.h5:md5,45c0a4f2907c78b3aca295d0623e2163" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.8" + }, + "timestamp": "2026-05-14T15:33:46.134130408" }, "versions-with-vdj": { "content": [ @@ -159,11 +183,11 @@ "versions.yml:md5,1e16f7d40ef563f7d0a24f8944374d4d" ] ], - "timestamp": "2026-03-13T15:23:20.241947226", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.4" - } + }, + "timestamp": "2026-03-13T15:23:20.241947226" }, "cellranger - multi - 10k - PBMC - with vdj": { "content": [ @@ -188,10 +212,10 @@ "reference.json:md5,384f6efabad59f6da5c89b862aee71a8" ] ], - "timestamp": "2026-03-13T15:23:20.211799407", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.4" - } + }, + "timestamp": "2026-03-13T15:23:20.211799407" } } \ No newline at end of file