Skip to content
Merged
2 changes: 1 addition & 1 deletion .github/workflows/nf-test-arm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ jobs:
- isMain: false
profile: "singularity"
NXF_VER:
- "25.04.0"
- "25.04.3"
- "latest-everything"
env:
NXF_ANSI_LOG: false
Expand Down
21 changes: 18 additions & 3 deletions .github/workflows/nf-test-gpu.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ env:
NXF_ANSI_LOG: false
NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity
NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity
# renovate: datasource=github-releases depName=nextflow-io/nextflow versioning=semver
NXF_VER: "25.04.0"

jobs:
get-shards:
Expand Down Expand Up @@ -79,7 +77,8 @@ jobs:
profile: [docker, singularity]
shard: ${{ fromJson(needs.get-shards.outputs.shard) }}
NXF_VER:
- "25.04.0"
- "25.04.3"
- "latest-everything"
filters: [pipeline]

steps:
Expand All @@ -93,14 +92,30 @@ jobs:
nvidia-smi -L

- name: Run nf-test Action
id: run_nf_test
uses: ./.github/actions/nf-test
continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }}
with:
profile: test_gpu,${{ matrix.profile }}
shard: ${{ matrix.shard }}
total_shards: ${{ needs.get-shards.outputs.total_shards }}
filters: ${{ matrix.filters }}
tags: "gpu"

- name: Report test status
if: ${{ always() }}
run: |
if [[ "${{ steps.run_nf_test.outcome }}" == "failure" ]]; then
echo "::error::Test with ${{ matrix.NXF_VER }} failed"
echo "## Test failed: ${{ matrix.profile }} | ${{ matrix.NXF_VER }} | Shard ${{ matrix.shard }}" >> $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-gpu:
runs-on:
- runs-on=${{ github.run_id }}-confirm-pass
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/nf-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ jobs:
- isMain: false
profile: "singularity"
NXF_VER:
- "25.04.0"
- "25.04.3"
- "latest-everything"
env:
NXF_ANSI_LOG: false
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ Special thanks to the following for their contributions to the release:
- [PR #1724](https://github.com/nf-core/rnaseq/pull/1724) - Update umitools modules: remove patches, add conda channel prefixes, update Wave containers
- [PR #1725](https://github.com/nf-core/rnaseq/pull/1725) - Refine .nftignore patterns to reinstate tx2gene MD5 checking, remove redundant UNTAR version collection
- [PR #1728](https://github.com/nf-core/rnaseq/pull/1728) - Re-render metro map with nf-metro v0.5.4: bolder section labels and number badges for improved visual hierarchy, increased vertical spacing between stacked sections, synchronized animation timing
- [PR #1730](https://github.com/nf-core/rnaseq/pull/1730) - Bump Nextflow from 25.04.0 to 25.04.3 in CI to fix `conda create --mkdir` failure ([nextflow-io/nextflow#5947](https://github.com/nextflow-io/nextflow/issues/5947))

### Parameters

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
[![GitHub Actions Linting Status](https://github.com/nf-core/rnaseq/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/rnaseq/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/rnaseq/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.1400710-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.1400710)
[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)

[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)
[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.3-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)
[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)
[![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/)
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion nextflow.config
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,7 @@ manifest {
description = """RNA sequencing analysis pipeline for gene/isoform quantification and extensive quality control."""
mainScript = 'main.nf'
defaultBranch = 'master'
nextflowVersion = '!>=25.04.0'
nextflowVersion = '!>=25.04.3'
version = '3.23.0'
doi = 'https://doi.org/10.5281/zenodo.1400710'
}
Expand Down
82 changes: 41 additions & 41 deletions workflows/rnaseq/main.nf
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ workflow RNASEQ {
def sample_status_header_multiqc = file("$projectDir/workflows/rnaseq/assets/multiqc/sample_status_header.txt", checkIfExists: true)
def ch_clustering_header_multiqc = file("$projectDir/workflows/rnaseq/assets/multiqc/deseq2_clustering_header.txt", checkIfExists: true)
def ch_biotypes_header_multiqc = file("$projectDir/workflows/rnaseq/assets/multiqc/biotypes_header.txt", checkIfExists: true)
def ch_dummy_file = ch_pca_header_multiqc
def ch_transcript_fasta_placeholder = ch_pca_header_multiqc
Comment thread
pinin4fjords marked this conversation as resolved.
Outdated

ch_multiqc_files = channel.empty()
ch_trim_status = channel.empty()
Expand Down Expand Up @@ -262,7 +262,7 @@ workflow RNASEQ {
ch_unprocessed_bams = ch_genome_bam.join(ch_transcriptome_bam)
ch_star_log = ALIGN_STAR.out.log_final
ch_unaligned_sequences = ALIGN_STAR.out.fastq
ch_multiqc_files = ch_multiqc_files.mix(ch_star_log.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(ch_star_log.collect{ _meta, log -> log })

if (!params.with_umi && (params.skip_markduplicates || params.use_parabricks_star)) {
// The deduplicated stats should take priority for MultiQC, but use
Expand All @@ -273,9 +273,9 @@ workflow RNASEQ {
// skipped, so we also need to add alignment stats here.

ch_multiqc_files = ch_multiqc_files
.mix(ALIGN_STAR.out.stats.collect{ tuple -> tuple[1] })
.mix(ALIGN_STAR.out.flagstat.collect{ tuple -> tuple[1] })
.mix(ALIGN_STAR.out.idxstats.collect{ tuple -> tuple[1] })
.mix(ALIGN_STAR.out.stats.collect{ _meta, stats -> stats })
.mix(ALIGN_STAR.out.flagstat.collect{ _meta, flagstat -> flagstat })
.mix(ALIGN_STAR.out.idxstats.collect{ _meta, idxstats -> idxstats })
}
}

Expand All @@ -299,13 +299,13 @@ workflow RNASEQ {
ch_percent_mapped = ch_percent_mapped.mix(ALIGN_BOWTIE2.out.percent_mapped)
ch_unprocessed_bams = ch_genome_bam.map { meta, bam -> [ meta, bam, '' ] }
ch_bowtie2_log = ALIGN_BOWTIE2.out.log_final
ch_multiqc_files = ch_multiqc_files.mix(ch_bowtie2_log.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(ch_bowtie2_log.collect{ _meta, log -> log })

if (!params.with_umi && params.skip_markduplicates) {
ch_multiqc_files = ch_multiqc_files
.mix(ALIGN_BOWTIE2.out.stats.collect{ tuple -> tuple[1] })
.mix(ALIGN_BOWTIE2.out.flagstat.collect{ tuple -> tuple[1] })
.mix(ALIGN_BOWTIE2.out.idxstats.collect{ tuple -> tuple[1] })
.mix(ALIGN_BOWTIE2.out.stats.collect{ _meta, stats -> stats })
.mix(ALIGN_BOWTIE2.out.flagstat.collect{ _meta, flagstat -> flagstat })
.mix(ALIGN_BOWTIE2.out.idxstats.collect{ _meta, idxstats -> idxstats })
}
}

Expand All @@ -324,17 +324,17 @@ workflow RNASEQ {
ch_genome_bam_index = ch_genome_bam_index.mix(params.bam_csi_index ? FASTQ_ALIGN_HISAT2.out.csi : FASTQ_ALIGN_HISAT2.out.bai)
ch_unprocessed_bams = ch_genome_bam.map { meta, bam -> [ meta, bam, '' ] }
ch_unaligned_sequences = FASTQ_ALIGN_HISAT2.out.fastq
ch_multiqc_files = ch_multiqc_files.mix(FASTQ_ALIGN_HISAT2.out.summary.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(FASTQ_ALIGN_HISAT2.out.summary.collect{ _meta, summary -> summary })

if (!params.with_umi && params.skip_markduplicates) {
// The deduplicated stats should take priority for MultiQC, but use
// them straight out of the aligner otherwise. If mark duplicates
// will run, those stats will be added later instead to avoid
// duplicate flagstat files in MultiQC.
ch_multiqc_files = ch_multiqc_files
.mix(FASTQ_ALIGN_HISAT2.out.stats.collect{ tuple -> tuple[1] })
.mix(FASTQ_ALIGN_HISAT2.out.flagstat.collect{ tuple -> tuple[1] })
.mix(FASTQ_ALIGN_HISAT2.out.idxstats.collect{ tuple -> tuple[1] })
.mix(FASTQ_ALIGN_HISAT2.out.stats.collect{ _meta, stats -> stats })
.mix(FASTQ_ALIGN_HISAT2.out.flagstat.collect{ _meta, flagstat -> flagstat })
.mix(FASTQ_ALIGN_HISAT2.out.idxstats.collect{ _meta, idxstats -> idxstats })
}
}

Expand Down Expand Up @@ -375,12 +375,12 @@ workflow RNASEQ {
params.gtf_extra_attributes,
params.use_sentieon_star
)
ch_multiqc_files = ch_multiqc_files.mix(QUANTIFY_RSEM.out.stat.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(QUANTIFY_RSEM.out.stat.collect{ _meta, stat -> stat })
ch_versions = ch_versions.mix(QUANTIFY_RSEM.out.versions)

if (!params.skip_qc & !params.skip_deseq2_qc) {
DESEQ2_QC_RSEM (
QUANTIFY_RSEM.out.counts_gene_length_scaled.map { tuple -> tuple[1] },
QUANTIFY_RSEM.out.counts_gene_length_scaled.map { _meta, counts -> counts },
ch_pca_header_multiqc,
ch_clustering_header_multiqc
)
Expand All @@ -397,7 +397,7 @@ workflow RNASEQ {
QUANTIFY_BAM_SALMON (
ch_samplesheet.map { item -> [ [:], item ] },
ch_transcriptome_bam,
ch_dummy_file,
ch_transcript_fasta_placeholder,
ch_transcript_fasta,
ch_gtf,
params.gtf_group_features,
Expand All @@ -412,7 +412,7 @@ workflow RNASEQ {

if (!params.skip_qc & !params.skip_deseq2_qc) {
DESEQ2_QC_BAM_SALMON (
QUANTIFY_BAM_SALMON.out.counts_gene_length_scaled.map { tuple -> tuple[1] },
QUANTIFY_BAM_SALMON.out.counts_gene_length_scaled.map { _meta, counts -> counts },
ch_pca_header_multiqc,
ch_clustering_header_multiqc
)
Expand Down Expand Up @@ -480,7 +480,7 @@ workflow RNASEQ {
PRESEQ_LCEXTRAP (
ch_genome_bam
)
ch_multiqc_files = ch_multiqc_files.mix(PRESEQ_LCEXTRAP.out.lc_extrap.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(PRESEQ_LCEXTRAP.out.lc_extrap.collect{ _meta, lc_extrap -> lc_extrap })
}

//
Expand All @@ -497,10 +497,10 @@ workflow RNASEQ {
)
ch_genome_bam = BAM_MARKDUPLICATES_PICARD.out.bam
ch_genome_bam_index = params.bam_csi_index ? BAM_MARKDUPLICATES_PICARD.out.csi : BAM_MARKDUPLICATES_PICARD.out.bai
ch_multiqc_files = ch_multiqc_files.mix(BAM_MARKDUPLICATES_PICARD.out.stats.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(BAM_MARKDUPLICATES_PICARD.out.flagstat.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(BAM_MARKDUPLICATES_PICARD.out.idxstats.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(BAM_MARKDUPLICATES_PICARD.out.metrics.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(BAM_MARKDUPLICATES_PICARD.out.stats.collect{ _meta, stats -> stats })
ch_multiqc_files = ch_multiqc_files.mix(BAM_MARKDUPLICATES_PICARD.out.flagstat.collect{ _meta, flagstat -> flagstat })
ch_multiqc_files = ch_multiqc_files.mix(BAM_MARKDUPLICATES_PICARD.out.idxstats.collect{ _meta, idxstats -> idxstats })
ch_multiqc_files = ch_multiqc_files.mix(BAM_MARKDUPLICATES_PICARD.out.metrics.collect{ _meta, metrics -> metrics })
}

//
Expand All @@ -527,8 +527,8 @@ workflow RNASEQ {
ch_genome_bam
.combine(ch_gtf)
.combine(biotype_in_gtf)
.filter { tuple -> tuple[-1] }
.map { tuple -> tuple[0..<tuple.size()-1] }
.filter { meta, bam, gtf, biotype_ok -> biotype_ok }
.map { meta, bam, gtf, _biotype_ok -> [ meta, bam, gtf ] }
.set { ch_featurecounts }

SUBREAD_FEATURECOUNTS (
Expand All @@ -539,7 +539,7 @@ workflow RNASEQ {
SUBREAD_FEATURECOUNTS.out.counts,
ch_biotypes_header_multiqc
)
ch_multiqc_files = ch_multiqc_files.mix(MULTIQC_CUSTOM_BIOTYPE.out.tsv.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(MULTIQC_CUSTOM_BIOTYPE.out.tsv.collect{ _meta, tsv -> tsv })
}

//
Expand Down Expand Up @@ -593,15 +593,15 @@ workflow RNASEQ {
SAMTOOLS_SORT_QUALIMAP.out.bam,
ch_gtf.map { item -> [ [:], item ] }
)
ch_multiqc_files = ch_multiqc_files.mix(QUALIMAP_RNASEQ.out.results.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(QUALIMAP_RNASEQ.out.results.collect{ _meta, results -> results })
}

if (!params.skip_dupradar) {
DUPRADAR (
ch_genome_bam,
ch_gtf.map { item -> [ [:], item ] }
)
ch_multiqc_files = ch_multiqc_files.mix(DUPRADAR.out.multiqc.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(DUPRADAR.out.multiqc.collect{ _meta, multiqc -> multiqc })
ch_versions = ch_versions.mix(DUPRADAR.out.versions.first())
}

Expand All @@ -620,14 +620,14 @@ workflow RNASEQ {
ch_gene_bed,
rseqc_modules
)
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.bamstat_txt.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.inferexperiment_txt.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.innerdistance_freq.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.junctionannotation_log.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.junctionsaturation_rscript.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.readdistribution_txt.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.readduplication_pos_xls.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.tin_txt.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.bamstat_txt.collect{ _meta, txt -> txt })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.inferexperiment_txt.collect{ _meta, txt -> txt })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.innerdistance_freq.collect{ _meta, freq -> freq })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.junctionannotation_log.collect{ _meta, log -> log })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.junctionsaturation_rscript.collect{ _meta, rscript -> rscript })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.readdistribution_txt.collect{ _meta, txt -> txt })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.readduplication_pos_xls.collect{ _meta, xls -> xls })
ch_multiqc_files = ch_multiqc_files.mix(BAM_RSEQC.out.tin_txt.collect{ _meta, txt -> txt })

// Compare predicted supplied or Salmon-predicted strand with what we get from RSeQC
ch_strand_comparison = BAM_RSEQC.out.inferexperiment_txt
Expand Down Expand Up @@ -699,13 +699,13 @@ workflow RNASEQ {
ch_kraken_reports = KRAKEN2.out.report

if (params.contaminant_screening == 'kraken2') {
ch_multiqc_files = ch_multiqc_files.mix(KRAKEN2.out.report.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(KRAKEN2.out.report.collect{ _meta, report -> report })
} else if (params.contaminant_screening == 'kraken2_bracken') {
BRACKEN (
ch_kraken_reports,
params.kraken_db
)
ch_multiqc_files = ch_multiqc_files.mix(BRACKEN.out.txt.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(BRACKEN.out.txt.collect{ _meta, txt -> txt })
}
} else if (params.contaminant_screening == 'sylph') {
def sylph_databases = params.sylph_db ? params.sylph_db.split(',').collect{ path -> file(path.trim()) } : []
Expand All @@ -722,7 +722,7 @@ workflow RNASEQ {
ch_sylph_profile,
ch_sylph_taxonomies
)
ch_multiqc_files = ch_multiqc_files.mix(SYLPHTAX_TAXPROF.out.taxprof_output.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(SYLPHTAX_TAXPROF.out.taxprof_output.collect{ _meta, output -> output })
}
}

Expand All @@ -741,7 +741,7 @@ workflow RNASEQ {
ch_samplesheet.map { item -> [ [:], item ] },
ch_strand_inferred_filtered_fastq,
ch_pseudo_index,
ch_dummy_file,
ch_transcript_fasta_placeholder,
ch_gtf,
params.gtf_group_features,
params.gtf_extra_attributes,
Expand All @@ -752,12 +752,12 @@ workflow RNASEQ {
params.kallisto_quant_fraglen_sd
)
ch_counts_gene_length_scaled = QUANTIFY_PSEUDO_ALIGNMENT.out.counts_gene_length_scaled
ch_multiqc_files = ch_multiqc_files.mix(QUANTIFY_PSEUDO_ALIGNMENT.out.multiqc.collect{ tuple -> tuple[1] })
ch_multiqc_files = ch_multiqc_files.mix(QUANTIFY_PSEUDO_ALIGNMENT.out.multiqc.collect{ _meta, multiqc -> multiqc })
ch_versions = ch_versions.mix(QUANTIFY_PSEUDO_ALIGNMENT.out.versions)

if (!params.skip_qc & !params.skip_deseq2_qc) {
DESEQ2_QC_PSEUDO (
ch_counts_gene_length_scaled.map { tuple -> tuple[1] },
ch_counts_gene_length_scaled.map { _meta, counts -> counts },
ch_pca_header_multiqc,
ch_clustering_header_multiqc
)
Expand Down
Loading