Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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"
Comment thread
pinin4fjords marked this conversation as resolved.
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

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