Skip to content

reverting paramsheet to profiles#644

Merged
suzannejin merged 28 commits intodevfrom
fix_param_priority
Mar 7, 2026
Merged

reverting paramsheet to profiles#644
suzannejin merged 28 commits intodevfrom
fix_param_priority

Conversation

@suzannejin
Copy link
Copy Markdown

Solves #472

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Feb 17, 2026

nf-core pipelines lint overall result: Passed ✅ ⚠️

Posted for pipeline commit 50c9093

+| ✅ 384 tests passed       |+
#| ❔  10 tests were ignored |#
#| ❔   1 tests had warnings |#
!| ❗  20 tests had warnings |!
Details

❗ Test warnings:

  • readme - README contains the placeholder zenodo.XXXXXXX. This should be replaced with the zenodo doi (after the first release).
  • pipeline_todos - TODO string in nextflow.config: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0
  • pipeline_todos - TODO string in base.config: Check the defaults for all processes
  • pipeline_todos - TODO string in main.nf: Optionally add in-text citation tools to this list.
  • pipeline_todos - TODO string in main.nf: Optionally add bibliographic entries to this list.
  • pipeline_todos - TODO string in main.nf: Only uncomment below if logic in toolCitationText/toolBibliographyText has been filled!
  • schema_lint - Parameter input is not defined in the correct subschema (input_output_options)
  • schema_description - No description provided in schema for parameter: deseq2_seed
  • schema_description - No description provided in schema for parameter: dream_p_value
  • schema_description - No description provided in schema for parameter: dream_lfc
  • schema_description - No description provided in schema for parameter: dream_confint
  • schema_description - No description provided in schema for parameter: dream_proportion
  • schema_description - No description provided in schema for parameter: dream_stdev_coef_lim
  • schema_description - No description provided in schema for parameter: dream_trend
  • schema_description - No description provided in schema for parameter: dream_robust
  • schema_description - No description provided in schema for parameter: dream_winsor_tail_p
  • schema_description - No description provided in schema for parameter: dream_ddf
  • schema_description - No description provided in schema for parameter: dream_reml
  • schema_description - No description provided in schema for parameter: dream_apply_voom
  • schema_description - No description provided in schema for parameter: dream_adjust_method

❔ Tests ignored:

  • files_exist - File is ignored: assets/multiqc_config.yml
  • nextflow_config - Config default ignored: params.report_file
  • nextflow_config - Config default ignored: params.logo_file
  • nextflow_config - Config default ignored: params.css_file
  • nextflow_config - Config default ignored: params.citations_file
  • files_unchanged - File ignored due to lint config: .github/CONTRIBUTING.md
  • files_unchanged - File ignored due to lint config: assets/nf-core-differentialabundance_logo_light.png
  • files_unchanged - File ignored due to lint config: docs/images/nf-core-differentialabundance_logo_light.png
  • files_unchanged - File ignored due to lint config: docs/images/nf-core-differentialabundance_logo_dark.png
  • multiqc_config - multiqc_config

❔ Tests fixed:

✅ Tests passed:

Run details

  • nf-core/tools version 3.5.1
  • Run at 2026-03-06 15:53:30

@suzannejin suzannejin changed the title first commit reverting paramsheet to profiles reverting paramsheet to profiles Feb 18, 2026
@suzannejin suzannejin marked this pull request as ready for review February 24, 2026 15:47
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR implements the dual-mode configuration approach from #472 by making profiles the default (single-run) mechanism and only using paramsheets for explicit multi-run benchmarking. It updates pipeline configuration resolution, adds analysis profiles, and refactors tests/docs accordingly.

Changes:

  • Switch paramset resolution to use paramsheet only when --paramsheet is provided, otherwise run in profile (single-run) mode.
  • Add/restore analysis profiles (rnaseq/affy/maxquant/soft and variants) via new conf/**.config files and nextflow.config profile entries.
  • Update docs and tests to reflect the two-mode architecture; remove the shipped default paramsheet.

Reviewed changes

Copilot reviewed 39 out of 42 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
tests/test_soft.nf.test.snap Snapshot updated for soft profile output paths and meta.
tests/test_soft.nf.test Test now loads conf/soft/soft.config and sets explicit inputs instead of paramsheet.
tests/test_rnaseq_limma.nf.test Tests now use rnaseq limma profile configs and explicit inputs (no paramsheet).
tests/test_rnaseq_dream.nf.test.snap Snapshot updated for rnaseq dream output path naming and meta.
tests/test_rnaseq_dream.nf.test Tests now use rnaseq dream profile configs and explicit inputs/overrides.
tests/test_rnaseq_deseq2.nf.test Tests now use rnaseq DESeq2 profile configs and explicit inputs/overrides.
tests/test_nogtf.nf.test.snap Snapshot updated for rnaseq “no gtf” output paths and meta.
tests/test_nogtf.nf.test Test now loads conf/rnaseq/rnaseq.config and sets explicit inputs.
tests/test_maxquant.nf.test.snap Snapshot updated for maxquant output paths and meta.
tests/test_maxquant.nf.test Test now loads conf/maxquant/maxquant.config and sets explicit inputs.
tests/test_many.nf.test.snap Snapshot updated for multi-run test paramset naming and meta.
tests/test_many.nf.test Multi-run test still uses paramsheet mode but with renamed test paramsets.
tests/test_affy.nf.test Tests now load affy profile configs and set explicit inputs/overrides.
tests/default.nf.test “with formula” test now uses conf/test.config and explicit overrides.
subworkflows/local/utils_nfcore_differentialabundance_pipeline/main.nf Paramset resolution now switches modes based on params.paramsheet; default config uses profile paramset_name.
nextflow_schema.json Schema text updated to explain two-mode behavior; paramsheet default removed.
nextflow.config params.paramsheet default set to null; adds analysis profiles under profiles {}.
docs/usage.md Documents single-run vs multi-run modes and precedence; updates examples/profiles listing.
conf/testdata.yaml Removed legacy testdata paramsets file.
conf/test_paramsheet.yaml Refactored to be a self-contained test paramsheet (data/config/test blocks).
conf/test.config Now includes rnaseq DESeq2+GSEA config instead of setting paramset_name directly.
conf/soft/soft.config New soft analysis profile config.
conf/rnaseq/rnaseq_limma_gsea.config New rnaseq limma+GSEA profile config.
conf/rnaseq/rnaseq_limma_gprofiler2.config New rnaseq limma+gprofiler2 profile config.
conf/rnaseq/rnaseq_limma_decoupler.config New rnaseq limma+decoupler profile config.
conf/rnaseq/rnaseq_limma.config New rnaseq limma base profile config.
conf/rnaseq/rnaseq_dream_decoupler.config New rnaseq dream+decoupler profile config.
conf/rnaseq/rnaseq_dream.config New rnaseq dream base profile config.
conf/rnaseq/rnaseq_deseq2_gsea.config New rnaseq DESeq2+GSEA profile config.
conf/rnaseq/rnaseq_deseq2_gprofiler2.config New rnaseq DESeq2+gprofiler2 profile config.
conf/rnaseq/rnaseq.config New rnaseq base (DESeq2 default) profile config.
conf/paramsheet.yaml Removed shipped default paramsheet.
conf/maxquant/maxquant.config New maxquant analysis profile config.
conf/affy/affy_limma_gsea.config New affy limma+GSEA profile config.
conf/affy/affy_limma_gprofiler2.config New affy limma+gprofiler2 profile config.
conf/affy/affy.config New affy base profile config.
README.md Updates usage guidance to analysis profiles + optional paramsheet mode.
CHANGELOG.md Adds entry describing the profile-first reversion.
Comments suppressed due to low confidence (1)

conf/test_paramsheet.yaml:184

  • affy_testdata points to a human GMT (h.all...Hs.symbols.gmt), but the derived test config sets gprofiler2_organism: "mmusculus", which overrides the GMT and queries mouse gene sets. Consider changing this to hsapiens (or omit it) so the test configuration matches the dataset species.
- paramset_name: test_affy_limma_gprofiler2
  include: test_paramsheet/affy_limma_gprofiler2,test_paramsheet/affy_testdata
  observations_id_col: name
  observations_name_col: name
  exploratory_main_variable: contrasts
  differential_max_pval: 0.05
  differential_max_qval: 0.05
  differential_min_fold_change: 1.5
  gprofiler2_organism: "mmusculus"


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread tests/test_soft.nf.test.snap
Comment thread tests/default.nf.test.snap
Comment thread nextflow_schema.json Outdated
Comment thread tests/test_affy.nf.test Outdated
differential_min_fold_change = 1.5

// gprofiler2
gprofiler2_organism = 'mmusculus'
Copy link

Copilot AI Feb 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test uses a human Hallmark GMT (h.all...Hs.symbols.gmt) but sets gprofiler2_organism = 'mmusculus', which will override the GMT and query mouse gene sets instead. Set this to hsapiens (or leave it unset to keep using the provided human GMT) to avoid silently testing the wrong species.

Suggested change
gprofiler2_organism = 'mmusculus'
gprofiler2_organism = 'hsapiens'

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot create a issue to check this out (indeed the GSE50790 study uses human samples)

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

created this issue #651 for this

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@pinin4fjords
Copy link
Copy Markdown
Member

@suzannejin are you happy with this? Have you reviewed the AI's work yet?

Copy link
Copy Markdown
Member

@grst grst left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The re-added profiles and docs-related changes LGTM.

I think currently the custom logic in getParamsetConfigurations() gets triggered no matter if a paramset is defined or not. I'm wondering if we could get a clearer separation of the "standard" and "custom" logic, by not even invoking that code if no paramsheet is set.

// Use paramsheet if paramset_name is provided, otherwise use default params
def paramsets = (params.paramset_name) ? getParamsheetConfigurations() : getDefaultConfigurations()
// Use paramsheet if --paramsheet is explicitly provided, otherwise use default params (profile mode)
def paramsets = (params.paramsheet) ? getParamsheetConfigurations() : getDefaultConfigurations()
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the default configuration? Why do we even have to invoke getParamsetConfigurations() when no paramsheet is specified?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

default is just the params scope put inside the ch_paramsheet channel (this channel is needed to parse any other channel, see here for example).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree with @grst . The name getParamsetConfigurations() implies paramsheet logic, but in profile mode it just wraps params into a list. The calling code could handle the branching directly:

def configurations = params.paramsheet
    ? getParamsheetConfigurations()
    : getDefaultConfigurations()

...with the shared validation/cleanup (the paramsets.collect { ... } block) extracted to something like validateConfigurations(paramsets). That way the paramsheet code path is never entered when it's not needed, and the two modes are structurally separated rather than just branched inside a single function.

Not blocking, but it would make the intent clearer for future maintainers.

@suzannejin
Copy link
Copy Markdown
Author

@suzannejin are you happy with this? Have you reviewed the AI's work yet?

Hi @pinin4fjords , it is ready for me.
Copilot's suggestion about correcting Gprofiler's database would go for a next issue imo.

@grst grst mentioned this pull request Mar 2, 2026
11 tasks
Comment thread nextflow.config Outdated

// Analysis profiles (single-run mode)
rnaseq { includeConfig 'conf/rnaseq/rnaseq.config' }
rnaseq_nogtf { includeConfig 'conf/rnaseq/rnaseq_nogtf.config' }
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this file exist?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot remove rnaseq_nogtf

// Use paramsheet if paramset_name is provided, otherwise use default params
def paramsets = (params.paramset_name) ? getParamsheetConfigurations() : getDefaultConfigurations()
// Use paramsheet if --paramsheet is explicitly provided, otherwise use default params (profile mode)
def paramsets = (params.paramsheet) ? getParamsheetConfigurations() : getDefaultConfigurations()
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree with @grst . The name getParamsetConfigurations() implies paramsheet logic, but in profile mode it just wraps params into a list. The calling code could handle the branching directly:

def configurations = params.paramsheet
    ? getParamsheetConfigurations()
    : getDefaultConfigurations()

...with the shared validation/cleanup (the paramsets.collect { ... } block) extracted to something like validateConfigurations(paramsets). That way the paramsheet code path is never entered when it's not needed, and the two modes are structurally separated rather than just branched inside a single function.

Not blocking, but it would make the intent clearer for future maintainers.

observations_name_col = 'sample'

// Differential analysis (DESeq2)
differential_method = 'deseq2'
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should probably document that you should now change method via profile usage, since something like this would break things due to column mismatches:

-profile rnaseq --differential_method limma

Comment thread tests/test_rnaseq_dream.nf.test Outdated
outdir = "$outputDir"

// Input data (rnaseq_testdata_complex)
study_name = 'SRP254919'
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These test data items are duplicated extensively across the test files. The rnaseq test data (SRP254919.samplesheet.csv, SRP254919.salmon.merged...tsv, etc.) appears 10 times across test_rnaseq_deseq2.nf.test (4 cases), test_rnaseq_limma.nf.test (4 cases), test_rnaseq_dream.nf.test (1 case), and test_nogtf.nf.test (1 case). Before this PR these were centralized in testdata.yaml.

I think we could have e.g. a conf/testdata/rnaseq.config with the shared test data params, which a conf/test/rnaseq_limma.config could include alongside the analysis config, and then test_rnaseq_limma.nf.test would use that as its nf-test config. That way each test only needs to specify its case-specific overrides, and a URL change is a one-file fix.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds good!

Copy link
Copy Markdown

Copilot AI commented Mar 3, 2026

@suzannejin I've opened a new pull request, #654, to work on those changes. Once the pull request is ready, I'll request review from you.

@suzannejin
Copy link
Copy Markdown
Author

@pinin4fjords I have implemented what you suggested here, is this what you meant?

@pinin4fjords
Copy link
Copy Markdown
Member

@pinin4fjords I have implemented what you suggested here, is this what you meant?

Yep, basically!

Copy link
Copy Markdown
Member

@pinin4fjords pinin4fjords left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm going to approve this to not block you. FYI I'm on leave next week.

@suzannejin
Copy link
Copy Markdown
Author

@pinin4fjords thanks a lot :)

@suzannejin suzannejin merged commit 13b3c1a into dev Mar 7, 2026
36 checks passed
@suzannejin suzannejin deleted the fix_param_priority branch March 7, 2026 07:15
@suzannejin suzannejin linked an issue Mar 11, 2026 that may be closed by this pull request
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

param priority in multi-config

5 participants