diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 3b7c77be..fa2a95fe 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -27,6 +27,9 @@ If you're not used to this workflow with git, you can start with some [docs from ## Tests +You can optionally test your changes by running the pipeline locally. Then it is recommended to use the `debug` profile to +receive warnings about process selectors and other debug info. Example: `nextflow run . -profile debug,test,docker --outdir `. + When you create a pull request with changes, [GitHub Actions](https://github.com/features/actions) will run automatic tests. Typically, pull-requests are only fully reviewed when these tests are passing, though of course we can help out before then. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 81a85842..45a6bb17 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -19,6 +19,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/mhcq - [ ] If necessary, also make a PR on the nf-core/mhcquant _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). +- [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7c6cb5ba..0c53df44 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: - "latest-everything" steps: - name: Check out pipeline code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Nextflow uses: nf-core/setup-nextflow@v1 diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml index 1b93fd7b..0ef08c54 100644 --- a/.github/workflows/fix-linting.yml +++ b/.github/workflows/fix-linting.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: token: ${{ secrets.nf_core_bot_auth_token }} @@ -24,7 +24,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 - name: Install Prettier run: npm install -g prettier @prettier/plugin-php diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index b8bdd214..905c58e4 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -14,9 +14,9 @@ jobs: EditorConfig: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 - name: Install editorconfig-checker run: npm install -g editorconfig-checker @@ -27,9 +27,9 @@ jobs: Prettier: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 - name: Install Prettier run: npm install -g prettier @@ -40,7 +40,7 @@ jobs: PythonBlack: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Check code lints with Black uses: psf/black@stable @@ -71,7 +71,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Nextflow uses: nf-core/setup-nextflow@v1 diff --git a/.github/workflows/release-announcments.yml b/.github/workflows/release-announcements.yml similarity index 100% rename from .github/workflows/release-announcments.yml rename to .github/workflows/release-announcements.yml diff --git a/.gitpod.yml b/.gitpod.yml index 1c67b5ea..7307282e 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -4,7 +4,9 @@ tasks: command: | pre-commit install --install-hooks nextflow self-update - + - name: unset JAVA_TOOL_OPTIONS + command: | + unset JAVA_TOOL_OPTIONS vscode: extensions: # based on nf-core.nf-core-extensionpack - codezombiech.gitignore # Language support for .gitignore files diff --git a/CHANGELOG.md b/CHANGELOG.md index ed41acab..db04e223 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.6.0dev - nfcore/mhcquant +## v2.6.0dev - [date] ### `Added` diff --git a/README.md b/README.md index 1a39e7db..c8155883 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,9 @@ On release, automated continuous integration tests run the pipeline on a full-si First, prepare a samplesheet with your input data that looks as follows: -`samplesheet.tsv`: +`samplesheet.tsv` -```tsv +```tsv title="samplesheet.tsv ID Sample Condition ReplicateFileName 1 msrun tumor /path/to/msrun.raw|mzML|d ``` @@ -53,8 +53,9 @@ nextflow run nf-core/mhcquant --outdir ./results ``` -> [!NOTE] -> 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/usage/configuration#custom-configuration-files). +> [!WARNING] +> 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/usage/configuration#custom-configuration-files). For more details and further functionality, please refer to the [usage documentation](https://nf-co.re/mhcquant/usage) and the [parameter documentation](https://nf-co.re/mhcquant/parameters). diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 0c4c7e41..a4906753 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -3,7 +3,7 @@ custom_logo_url: https://github.com/nf-core/mhcquant custom_logo_title: "nf-core/mhcquant" report_comment: > - This report has been generated by the nf-core/mhcquant + This report has been generated by the nf-core/mhcquant analysis pipeline. For information about how to interpret these results, please see the documentation. report_section_order: diff --git a/assets/slackreport.json b/assets/slackreport.json index 7d7b07dc..22f4e605 100644 --- a/assets/slackreport.json +++ b/assets/slackreport.json @@ -3,7 +3,7 @@ { "fallback": "Plain-text summary of the attachment.", "color": "<% if (success) { %>good<% } else { %>danger<%} %>", - "author_name": "nf-core/mhcquant v${version} - ${runName}", + "author_name": "nf-core/mhcquant ${version} - ${runName}", "author_icon": "https://www.nextflow.io/docs/latest/_static/favicon.ico", "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors<% } %>", "fields": [ diff --git a/conf/modules.config b/conf/modules.config index dc59df58..6516691f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -35,7 +35,7 @@ process { } withName: 'MULTIQC' { - ext.args = params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' + ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } publishDir = [ path: { "${params.outdir}/multiqc" }, mode: params.publish_dir_mode, diff --git a/docs/usage.md b/docs/usage.md index 221f89a0..23743b78 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -17,7 +17,7 @@ You will need to create a samplesheet with information about the samples you wou The `sample` identifiers have to be the same when you have multiple runs. The `Condition` identifiers can be used to further distinguish the sample groups. Below is an example for the same sample sequenced across 3 lanes: -```tsv +```tsv title="samplesheet.tsv ID Sample Condition ReplicateFileName 1 WT A /path/to/MS/files/WT_A1.raw 2 WT A /path/to/MS/files/WT_A2.raw diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 01b8653d..e248e4c3 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -4,6 +4,7 @@ import org.yaml.snakeyaml.Yaml import groovy.json.JsonOutput +import nextflow.extension.FilesEx class NfcoreTemplate { @@ -141,12 +142,14 @@ class NfcoreTemplate { try { if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } // Try to send HTML e-mail using sendmail + def sendmail_tf = new File(workflow.launchDir.toString(), ".sendmail_tmp.html") + sendmail_tf.withWriter { w -> w << sendmail_html } [ 'sendmail', '-t' ].execute() << sendmail_html log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (sendmail)-" } catch (all) { // Catch failures and try with plaintext def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] - if ( mqc_report.size() <= max_multiqc_email_size.toBytes() ) { + if ( mqc_report != null && mqc_report.size() <= max_multiqc_email_size.toBytes() ) { mail_cmd += [ '-A', mqc_report ] } mail_cmd.execute() << email_html @@ -155,14 +158,16 @@ class NfcoreTemplate { } // Write summary e-mail HTML to a file - def output_d = new File("${params.outdir}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - def output_hf = new File(output_d, "pipeline_report.html") + def output_hf = new File(workflow.launchDir.toString(), ".pipeline_report.html") output_hf.withWriter { w -> w << email_html } - def output_tf = new File(output_d, "pipeline_report.txt") + FilesEx.copyTo(output_hf.toPath(), "${params.outdir}/pipeline_info/pipeline_report.html"); + output_hf.delete() + + // Write summary e-mail TXT to a file + def output_tf = new File(workflow.launchDir.toString(), ".pipeline_report.txt") output_tf.withWriter { w -> w << email_txt } + FilesEx.copyTo(output_tf.toPath(), "${params.outdir}/pipeline_info/pipeline_report.txt"); + output_tf.delete() } // @@ -227,15 +232,14 @@ class NfcoreTemplate { // Dump pipeline parameters in a json file // public static void dump_parameters(workflow, params) { - def output_d = new File("${params.outdir}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - def timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') - def output_pf = new File(output_d, "params_${timestamp}.json") + def filename = "params_${timestamp}.json" + def temp_pf = new File(workflow.launchDir.toString(), ".${filename}") def jsonStr = JsonOutput.toJson(params) - output_pf.text = JsonOutput.prettyPrint(jsonStr) + temp_pf.text = JsonOutput.prettyPrint(jsonStr) + + FilesEx.copyTo(temp_pf.toPath(), "${params.outdir}/pipeline_info/params_${timestamp}.json") + temp_pf.delete() } // diff --git a/modules.json b/modules.json index f9875084..8f7f850d 100644 --- a/modules.json +++ b/modules.json @@ -7,12 +7,12 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "bba7e362e4afead70653f84d8700588ea28d0f9e", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "4ab13872435962dadc239979554d13709e20bf29", "installed_by": ["modules"] } } diff --git a/modules/local/openms_cometadapter.nf b/modules/local/openms_cometadapter.nf index d3f000d0..1c3c41d2 100644 --- a/modules/local/openms_cometadapter.nf +++ b/modules/local/openms_cometadapter.nf @@ -2,10 +2,10 @@ process OPENMS_COMETADAPTER { tag "$meta.id" label 'process_high' - conda "bioconda::openms-thirdparty=3.0.0" + conda "bioconda::openms-thirdparty=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms-thirdparty:3.0.0--h9ee0642_1' : - 'biocontainers/openms-thirdparty:3.0.0--h9ee0642_1' }" + 'https://depot.galaxyproject.org/singularity/openms-thirdparty:3.1.0--h9ee0642_3' : + 'biocontainers/openms-thirdparty:3.1.0--h9ee0642_3' }" input: tuple val(meta), path(mzml), path(fasta) diff --git a/modules/local/openms_decoydatabase.nf b/modules/local/openms_decoydatabase.nf index 6994057f..2d96b3b8 100644 --- a/modules/local/openms_decoydatabase.nf +++ b/modules/local/openms_decoydatabase.nf @@ -2,10 +2,10 @@ process OPENMS_DECOYDATABASE { tag "$meta.id" label 'process_single' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(fasta) diff --git a/modules/local/openms_falsediscoveryrate.nf b/modules/local/openms_falsediscoveryrate.nf index 048dda8b..6ebf48a1 100644 --- a/modules/local/openms_falsediscoveryrate.nf +++ b/modules/local/openms_falsediscoveryrate.nf @@ -2,10 +2,10 @@ process OPENMS_FALSEDISCOVERYRATE { tag "$meta.id" label 'process_single' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(idxml) diff --git a/modules/local/openms_featurefinderidentification.nf b/modules/local/openms_featurefinderidentification.nf index bbdfb26d..66bd2383 100644 --- a/modules/local/openms_featurefinderidentification.nf +++ b/modules/local/openms_featurefinderidentification.nf @@ -2,10 +2,10 @@ process OPENMS_FEATUREFINDERIDENTIFICATION { tag "$meta.id" label 'process_medium' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(mzml), path(id_int), path(id_ext) diff --git a/modules/local/openms_featurelinkerunlabeledkd.nf b/modules/local/openms_featurelinkerunlabeledkd.nf index 2765836a..32f1c4df 100644 --- a/modules/local/openms_featurelinkerunlabeledkd.nf +++ b/modules/local/openms_featurelinkerunlabeledkd.nf @@ -2,10 +2,10 @@ process OPENMS_FEATURELINKERUNLABELEDKD { tag "$meta.id" label 'process_single' - conda "bioconda::openms-thirdparty=3.0.0" + conda "bioconda::openms-thirdparty=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms-thirdparty:3.0.0--h9ee0642_1' : - 'biocontainers/openms-thirdparty:3.0.0--h9ee0642_1' }" + 'https://depot.galaxyproject.org/singularity/openms-thirdparty:3.1.0--h9ee0642_3' : + 'biocontainers/openms-thirdparty:3.1.0--h9ee0642_3' }" input: tuple val(meta), path(features) diff --git a/modules/local/openms_filefilter.nf b/modules/local/openms_filefilter.nf index e526e959..cf49a384 100644 --- a/modules/local/openms_filefilter.nf +++ b/modules/local/openms_filefilter.nf @@ -2,10 +2,10 @@ process OPENMS_FILEFILTER { tag "$meta.id" label 'process_low' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(mzml) diff --git a/modules/local/openms_idconflictresolver.nf b/modules/local/openms_idconflictresolver.nf index 7a1f795f..fdab11d3 100644 --- a/modules/local/openms_idconflictresolver.nf +++ b/modules/local/openms_idconflictresolver.nf @@ -2,10 +2,10 @@ process OPENMS_IDCONFLICTRESOLVER { tag "$meta.id" label 'process_single' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(consensus) diff --git a/modules/local/openms_idfilter.nf b/modules/local/openms_idfilter.nf index ed8dcf72..21b8ab18 100644 --- a/modules/local/openms_idfilter.nf +++ b/modules/local/openms_idfilter.nf @@ -2,10 +2,10 @@ process OPENMS_IDFILTER { tag "$meta.id" label 'process_single' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(idxml), val(peptide_filter) diff --git a/modules/local/openms_idmerger.nf b/modules/local/openms_idmerger.nf index 740ecfcf..bf8bba47 100644 --- a/modules/local/openms_idmerger.nf +++ b/modules/local/openms_idmerger.nf @@ -2,10 +2,10 @@ process OPENMS_IDMERGER { tag "$meta.id" label 'process_single' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(idxmls) diff --git a/modules/local/openms_idripper.nf b/modules/local/openms_idripper.nf index 64d3631c..f0bcc633 100644 --- a/modules/local/openms_idripper.nf +++ b/modules/local/openms_idripper.nf @@ -2,10 +2,10 @@ process OPENMS_IDRIPPER { tag "${meta.id}" label 'process_single' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(merged_idxml) diff --git a/modules/local/openms_idscoreswitcher.nf b/modules/local/openms_idscoreswitcher.nf index 9d0f1b03..a7838cc7 100644 --- a/modules/local/openms_idscoreswitcher.nf +++ b/modules/local/openms_idscoreswitcher.nf @@ -2,10 +2,10 @@ process OPENMS_IDSCORESWITCHER { tag "$meta.id" label 'process_single' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(idxml), path(whitelist) diff --git a/modules/local/openms_mapaligneridentification.nf b/modules/local/openms_mapaligneridentification.nf index 550f59d2..6925578a 100644 --- a/modules/local/openms_mapaligneridentification.nf +++ b/modules/local/openms_mapaligneridentification.nf @@ -2,10 +2,10 @@ process OPENMS_MAPALIGNERIDENTIFICATION { tag "$meta.id" label 'process_single' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(idxmls) diff --git a/modules/local/openms_maprttransformer.nf b/modules/local/openms_maprttransformer.nf index afe6d007..dde7ef1d 100644 --- a/modules/local/openms_maprttransformer.nf +++ b/modules/local/openms_maprttransformer.nf @@ -2,10 +2,10 @@ process OPENMS_MAPRTTRANSFORMER { tag "$meta.id" label 'process_single' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(alignment_file), path(trafoxml) diff --git a/modules/local/openms_mztabexporter.nf b/modules/local/openms_mztabexporter.nf index 16056675..3b42a424 100644 --- a/modules/local/openms_mztabexporter.nf +++ b/modules/local/openms_mztabexporter.nf @@ -2,10 +2,10 @@ process OPENMS_MZTABEXPORTER { tag "$meta.id" label 'process_single' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(in_file) diff --git a/modules/local/openms_peakpickerhires.nf b/modules/local/openms_peakpickerhires.nf index e8ca0afa..957f6e2d 100644 --- a/modules/local/openms_peakpickerhires.nf +++ b/modules/local/openms_peakpickerhires.nf @@ -2,10 +2,10 @@ process OPENMS_PEAKPICKERHIRES { tag "$meta.id" label 'process_medium' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(mzml) diff --git a/modules/local/openms_peptideindexer.nf b/modules/local/openms_peptideindexer.nf index 48a21cd6..145f409f 100644 --- a/modules/local/openms_peptideindexer.nf +++ b/modules/local/openms_peptideindexer.nf @@ -2,10 +2,10 @@ process OPENMS_PEPTIDEINDEXER { tag "$meta.id" label 'process_single' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(idxml), path(fasta) diff --git a/modules/local/openms_percolatoradapter.nf b/modules/local/openms_percolatoradapter.nf index b45e41cc..a155dccc 100644 --- a/modules/local/openms_percolatoradapter.nf +++ b/modules/local/openms_percolatoradapter.nf @@ -2,10 +2,10 @@ process OPENMS_PERCOLATORADAPTER { tag "$meta.id" label 'process_low' - conda "bioconda::openms-thirdparty=3.0.0" + conda "bioconda::openms-thirdparty=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms-thirdparty:3.0.0--h9ee0642_1' : - 'biocontainers/openms-thirdparty:3.0.0--h9ee0642_1' }" + 'https://depot.galaxyproject.org/singularity/openms-thirdparty:3.1.0--h9ee0642_3' : + 'biocontainers/openms-thirdparty:3.1.0--h9ee0642_3' }" input: tuple val(meta), path(merged_with_features) diff --git a/modules/local/openms_psmfeatureextractor.nf b/modules/local/openms_psmfeatureextractor.nf index d71fbac2..b29cf3e6 100644 --- a/modules/local/openms_psmfeatureextractor.nf +++ b/modules/local/openms_psmfeatureextractor.nf @@ -2,10 +2,10 @@ process OPENMS_PSMFEATUREEXTRACTOR { tag "$meta.id" label 'process_low' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(idxml), path(feature_file) diff --git a/modules/local/openms_textexporter.nf b/modules/local/openms_textexporter.nf index fc16d59e..dce93046 100644 --- a/modules/local/openms_textexporter.nf +++ b/modules/local/openms_textexporter.nf @@ -2,10 +2,10 @@ process OPENMS_TEXTEXPORTER { tag "$meta.id" label 'process_single' - conda "bioconda::openms=3.0.0" + conda "bioconda::openms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.0.0--h8964181_1' : - 'quay.io/biocontainers/openms:3.0.0--h8964181_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.1.0--h8964181_3' : + 'biocontainers/openms:3.1.0--h8964181_3' }" input: tuple val(meta), path(file) diff --git a/modules/local/pyopenms_idfilter.nf b/modules/local/pyopenms_idfilter.nf index c4fb4698..64531083 100644 --- a/modules/local/pyopenms_idfilter.nf +++ b/modules/local/pyopenms_idfilter.nf @@ -2,10 +2,10 @@ process PYOPENMS_IDFILTER { tag "$meta.id" label 'process_single' - conda "bioconda::pyopenms=3.0.0" + conda "bioconda::pyopenms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/pyopenms:3.0.0--py311h9b8898c_0' : - 'biocontainers/pyopenms:3.0.0--py311h9b8898c_0' }" + 'https://depot.galaxyproject.org/singularity/pyopenms:3.1.0--py311h9b8898c_0' : + 'biocontainers/pyopenms:3.1.0--py311h9b8898c_0' }" input: tuple val(meta), path(idxml), path(whitelist) diff --git a/modules/local/pyopenms_ionannotator.nf b/modules/local/pyopenms_ionannotator.nf index d2f4964e..944c47b8 100644 --- a/modules/local/pyopenms_ionannotator.nf +++ b/modules/local/pyopenms_ionannotator.nf @@ -2,7 +2,7 @@ process PYOPENMS_IONANNOTATOR { tag "$meta.id" label 'process_high' - conda "bioconda::pyopenms=3.0.0" + conda "bioconda::pyopenms=3.1.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/pyopenms:3.0.0--py311h9b8898c_0' : 'biocontainers/pyopenms:3.0.0--py311h9b8898c_0' }" diff --git a/modules/local/thermorawfileparser.nf b/modules/local/thermorawfileparser.nf index 8385a33c..05ae988a 100644 --- a/modules/local/thermorawfileparser.nf +++ b/modules/local/thermorawfileparser.nf @@ -2,10 +2,10 @@ process THERMORAWFILEPARSER { tag "$meta.id" label 'process_low' - conda "bioconda::thermorawfileparser=1.4.2" + conda "bioconda::thermorawfileparser=1.4.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/thermorawfileparser:1.4.2--ha8f3691_0' : - 'biocontainers/thermorawfileparser:1.4.2--ha8f3691_0' }" + 'https://depot.galaxyproject.org/singularity/thermorawfileparser:1.4.3--ha8f3691_0' : + 'biocontainers/thermorawfileparser:1.4.3--ha8f3691_0' }" input: tuple val(meta), path(rawfile) diff --git a/modules/nf-core/custom/dumpsoftwareversions/environment.yml b/modules/nf-core/custom/dumpsoftwareversions/environment.yml new file mode 100644 index 00000000..f0c63f69 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/environment.yml @@ -0,0 +1,7 @@ +name: custom_dumpsoftwareversions +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::multiqc=1.17 diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index ebc87273..7685b33c 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -2,10 +2,10 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "bioconda::multiqc=1.14" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : - 'biocontainers/multiqc:1.14--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.17--pyhdfd78af_0' : + 'biocontainers/multiqc:1.17--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml index c32657de..5f15a5fd 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/custom/dumpsoftwareversions/meta.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: custom_dumpsoftwareversions description: Custom module used to dump software versions within the nf-core pipeline template keywords: @@ -16,7 +16,6 @@ input: type: file description: YML file containing software versions pattern: "*.yml" - output: - yml: type: file @@ -30,7 +29,9 @@ output: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@drpatelh" - "@grst" +maintainers: + - "@drpatelh" + - "@grst" diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test new file mode 100644 index 00000000..eec1db10 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test @@ -0,0 +1,38 @@ +nextflow_process { + + name "Test Process CUSTOM_DUMPSOFTWAREVERSIONS" + script "../main.nf" + process "CUSTOM_DUMPSOFTWAREVERSIONS" + tag "modules" + tag "modules_nfcore" + tag "custom" + tag "dumpsoftwareversions" + tag "custom/dumpsoftwareversions" + + test("Should run without failures") { + when { + process { + """ + def tool1_version = ''' + TOOL1: + tool1: 0.11.9 + '''.stripIndent() + + def tool2_version = ''' + TOOL2: + tool2: 1.9 + '''.stripIndent() + + input[0] = Channel.of(tool1_version, tool2_version).collectFile() + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap new file mode 100644 index 00000000..4274ed57 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap @@ -0,0 +1,27 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + "software_versions.yml:md5,1c851188476409cda5752ce971b20b58" + ], + "1": [ + "software_versions_mqc.yml:md5,2570f4ba271ad08357b0d3d32a9cf84d" + ], + "2": [ + "versions.yml:md5,3843ac526e762117eedf8825b40683df" + ], + "mqc_yml": [ + "software_versions_mqc.yml:md5,2570f4ba271ad08357b0d3d32a9cf84d" + ], + "versions": [ + "versions.yml:md5,3843ac526e762117eedf8825b40683df" + ], + "yml": [ + "software_versions.yml:md5,1c851188476409cda5752ce971b20b58" + ] + } + ], + "timestamp": "2023-11-03T14:43:22.157011" + } +} diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml b/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml new file mode 100644 index 00000000..405aa24a --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml @@ -0,0 +1,2 @@ +custom/dumpsoftwareversions: + - modules/nf-core/custom/dumpsoftwareversions/** diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml new file mode 100644 index 00000000..bc0bdb5b --- /dev/null +++ b/modules/nf-core/multiqc/environment.yml @@ -0,0 +1,7 @@ +name: multiqc +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::multiqc=1.18 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 1fc387be..00cc48d2 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -1,10 +1,10 @@ process MULTIQC { label 'process_single' - conda "bioconda::multiqc=1.14" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : - 'biocontainers/multiqc:1.14--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.18--pyhdfd78af_0' : + 'biocontainers/multiqc:1.18--pyhdfd78af_0' }" input: path multiqc_files, stageAs: "?/*" @@ -25,12 +25,14 @@ process MULTIQC { def args = task.ext.args ?: '' def config = multiqc_config ? "--config $multiqc_config" : '' def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' + def logo = multiqc_logo ? /--cl-config 'custom_logo: "${multiqc_logo}"'/ : '' """ multiqc \\ --force \\ $args \\ $config \\ $extra_config \\ + $logo \\ . cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index f93b5ee5..f1aa660e 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -1,5 +1,5 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json -name: MultiQC +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: multiqc description: Aggregate results from bioinformatics analyses across many samples into a single report keywords: - QC @@ -13,7 +13,6 @@ tools: homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ licence: ["GPL-3.0-or-later"] - input: - multiqc_files: type: file @@ -31,7 +30,6 @@ input: type: file description: Optional logo file for MultiQC pattern: "*.{png}" - output: - report: type: file @@ -54,3 +52,8 @@ authors: - "@bunop" - "@drpatelh" - "@jfy133" +maintainers: + - "@abhi18av" + - "@bunop" + - "@drpatelh" + - "@jfy133" diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test new file mode 100644 index 00000000..c2dad217 --- /dev/null +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -0,0 +1,63 @@ +nextflow_process { + + name "Test Process MULTIQC" + script "../main.nf" + process "MULTIQC" + tag "modules" + tag "modules_nfcore" + tag "multiqc" + + test("MULTIQC: FASTQC") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz_fastqc_zip'], checkIfExists: true)]) + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.report.get(0)).exists() }, + { assert path(process.out.data.get(0)).exists() }, + { assert path(process.out.versions.get(0)).getText().contains("multiqc") } + ) + } + + } + + test("MULTIQC: FASTQC and a config file") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([file(params.test_data['sarscov2']['illumina']['test_1_fastq_gz_fastqc_zip'], checkIfExists: true)]) + input[1] = Channel.of(file("https://github.com/nf-core/tools/raw/dev/nf_core/pipeline-template/assets/multiqc_config.yml", checkIfExists: true)) + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert path(process.out.report.get(0)).exists() }, + { assert path(process.out.data.get(0)).exists() }, + { assert path(process.out.versions.get(0)).getText().contains("multiqc") } + ) + } + + } +} diff --git a/modules/nf-core/multiqc/tests/tags.yml b/modules/nf-core/multiqc/tests/tags.yml new file mode 100644 index 00000000..bea6c0d3 --- /dev/null +++ b/modules/nf-core/multiqc/tests/tags.yml @@ -0,0 +1,2 @@ +multiqc: + - modules/nf-core/multiqc/** diff --git a/nextflow.config b/nextflow.config index b08086d1..0827ed1f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -138,6 +138,7 @@ profiles { dumpHashes = true process.beforeScript = 'echo $HOSTNAME' cleanup = false + nextflow.enable.configProcessNamesValidation = true } conda { conda.enabled = true @@ -160,16 +161,16 @@ profiles { } docker { docker.enabled = true - docker.userEmulation = true conda.enabled = false singularity.enabled = false podman.enabled = false shifter.enabled = false charliecloud.enabled = false apptainer.enabled = false + docker.runOptions = '' } arm { - docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' + docker.runOptions = '--platform=linux/amd64' } singularity { singularity.enabled = true @@ -240,7 +241,7 @@ singularity.registry = 'quay.io' // Nextflow plugins plugins { - id 'nf-validation' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-validation@1.1.3' // Validation of pipeline parameters and creation of an input channel from a sample sheet } // Export these variables to prevent local Python/R libraries from conflicting with those in the container @@ -257,6 +258,9 @@ env { // Capture exit codes from upstream processes when piping process.shell = ['/bin/bash', '-euo', 'pipefail'] +// Disable process selector warnings by default. Use debug profile to enable warnings. +nextflow.enable.configProcessNamesValidation = false + def trace_timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') timeline { enabled = true