Skip to content

Added support for Cleanifier tool: cleanifier/download, cleanifier/index and cleanifier/filter#12360

Open
LeonHornich wants to merge 5 commits into
nf-core:masterfrom
LeonHornich:cleanifier
Open

Added support for Cleanifier tool: cleanifier/download, cleanifier/index and cleanifier/filter#12360
LeonHornich wants to merge 5 commits into
nf-core:masterfrom
LeonHornich:cleanifier

Conversation

@LeonHornich

@LeonHornich LeonHornich commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

With this PR I want to add support for the Cleanifier tool for species contamination removal. There are 3 added modules: download, index and filter.

Unfortunately I am still experiencing some issues with nf-test snapshot stability. If anyone has an idea on how to fix them i'd very much appreciate that. Of course other feedback is also highly appreciated.

PR checklist

Closes #XXX

  • This comment contains a description of changes (with reason).
  • If you've fixed a bug or added code that should be tested, add tests!
  • If you've added a new tool - have you followed the module conventions in the contribution docs
  • If necessary, include test data in your PR.
  • Remove all TODO statements.
  • Broadcast software version numbers to topic: versions - See version_topics
  • Follow the naming conventions.
  • Follow the parameters requirements.
  • Follow the input/output options guidelines.
  • Add a resource label
  • Use BioConda and BioContainers if possible to fulfil software requirements.
  • Ensure that the test works with either Docker / Singularity. Conda CI tests can be quite flaky:
    • For modules:
      • nf-core modules test <MODULE> --profile docker
      • nf-core modules test <MODULE> --profile singularity
      • nf-core modules test <MODULE> --profile conda

@famosab

famosab commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

I would suggest to split this up into one PR by subtool / command :) regarding the md5sum instability I will add a comment

@famosab famosab left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I added a few hints :)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We want the ext.args to be present in the main.nf.test file. That makes everything more readable in one go. See the module specifications for more info.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

You can run

nextflow lint -format -sort-declarations -spaces 4 -harshil-alignment

on this file to clean this up nicely.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please remove this file :)

@@ -0,0 +1,5 @@
process {
withName: CLEANIFIER_INDEX {
ext.args = "-k 31"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We want the ext.args to be present in the main.nf.test file. That makes everything more readable in one go. See the module specifications for more info.

"""
}
}

then {
assertAll(
{ assert process.success },
{ assert snapshot(sanitizeOutput(process.out)).match() }
{ assert snapshot(process.out).match() }

@famosab famosab Jul 15, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I would just first assert the txt content of the filter output and then we can probably see why the md5sum is instable

Suggested change
{ assert snapshot(process.out).match() }
{ assert snapshot(
file(process.out.filter[0][1]).name,
process.out.info,
process.out.findAll { key, val -> key.startsWith("versions") },
).match() }

Edit: I updated to just use the name

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I played around with the index tests. From my understanding the core issue is that cleanifier/index generates a index file using a probabilistic cuckoo filter. These are not deterministic and therefore differ between snapshots.

Since this doesn't seem avoidable i am now only assessing the files existence (via file path) in the most recent commit.

While this seems to improve my snapshots locally, I now get an error while linting:

nf-core modules lint cleanifier                       (nextflow_env) 


                                          ,--./,-.
          ___     __   __   __   ___     /,-._.--~\ 
    |\ | |__  __ /  ` /  \ |__) |__         }  {
    | \| |       \__, \__/ |  \ |___     \`-._,-`-,
                                          `._,._,'

    nf-core/tools version 4.0.2 - https://nf-co.re


INFO     Linting modules repo: '.'                                              
INFO     Linting module: 'cleanifier'                                           

╭─ [✗] 1 Module Test Failed ───────────────────────────────────────────────────╮
│                     ╷                           ╷                            │
│ Module name         │ File path                 │ Test message               │
│╶────────────────────┼───────────────────────────┼───────────────────────────╴│
│ cleanifier/index    │ modules/nf-core/cleanifi… │ test_snap_versions:        │
│                     │                           │ versions not found in      │
│                     │                           │ snapshot file              │
│                     ╵                           ╵                            │
╰──────────────────────────────────────────────────────────────────────────────╯
╭───────────────────────╮
│ LINT RESULTS SUMMARY  │
├───────────────────────┤
│ [✔] 166 Tests Passed  │
│ [!]   0 Test Warnings │
│ [✗]   1 Test Failed   │
╰───────────────────────╯

How would you usually handle this according to nf-core guidelines? Thank you :)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

You need to add this line:

process.out.findAll { key, val -> key.startsWith("versions") },

because otherwise the versions are not asserted

@@ -35,7 +35,7 @@ nextflow_process {
{ assert snapshot(
path(process.out.index[0][1]).getFileName().toString(),
path(process.out.info[0][1]).getFileName().toString(),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Was the info output also instable? Otherwise we couls just keep it

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yes, the .info file also seems unstable. My assumption is that is stores data on the probabilistic cuckoo filter. Since these are unstable to begin with, this would make the .info files unstable as well :)

@famosab famosab Jul 16, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Is there now way to test the real download? Maybe for a small subsection?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The download command essentially allows us to download pre-computed index for human data. This is based on the t2t human reference genome. While there are 2 index files you can download, they are 7 and 14GB large. There is no option to download only parts of that. Since this sounded like too large of a testing case i only implemented strip cases for the cleanifier/download module.

setup {
run("CLEANIFIER_INDEX") {
script "../../index/main.nf"
config "./nextflow.config"

@famosab famosab Jul 16, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
config "./nextflow.config"

duplicated to above

Comment on lines +46 to +56
echo "" | gzip > ${prefix}.clean_keep.fastq.gz
${keep_host ? "echo \"\" | gzip > ${prefix}.clean_filter.fastq.gz" : ""}
"""
}
else {
"""
echo "" | gzip > ${prefix}.clean_1_keep.fastq.gz
echo "" | gzip > ${prefix}.clean_2_keep.fastq.gz
${keep_host ? "echo \"\" | gzip > ${prefix}.clean_1_filter.fastq.gz" : ""}
${keep_host ? "echo \"\" | gzip > ${prefix}.clean_2_filter.fastq.gz" : ""}
"""

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We usually do not need the "" in the echo statement :)

Suggested change
echo "" | gzip > ${prefix}.clean_keep.fastq.gz
${keep_host ? "echo \"\" | gzip > ${prefix}.clean_filter.fastq.gz" : ""}
"""
}
else {
"""
echo "" | gzip > ${prefix}.clean_1_keep.fastq.gz
echo "" | gzip > ${prefix}.clean_2_keep.fastq.gz
${keep_host ? "echo \"\" | gzip > ${prefix}.clean_1_filter.fastq.gz" : ""}
${keep_host ? "echo \"\" | gzip > ${prefix}.clean_2_filter.fastq.gz" : ""}
"""
echo | gzip > ${prefix}.clean_keep.fastq.gz
${keep_host ? "echo | gzip > ${prefix}.clean_filter.fastq.gz" : ""}
"""
}
else {
"""
echo | gzip > ${prefix}.clean_1_keep.fastq.gz
echo | gzip > ${prefix}.clean_2_keep.fastq.gz
${keep_host ? "echo | gzip > ${prefix}.clean_1_filter.fastq.gz" : ""}
${keep_host ? "echo | gzip > ${prefix}.clean_2_filter.fastq.gz" : ""}
"""

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

If I do that the linter is complaining, I will be defaulting back to using the "".

nf-core modules lint cleanifier                       (nextflow_env) 


                                          ,--./,-.
          ___     __   __   __   ___     /,-._.--~\ 
    |\ | |__  __ /  ` /  \ |__) |__         }  {
    | \| |       \__, \__/ |  \ |___     \`-._,-`-,
                                          `._,._,'

    nf-core/tools version 4.0.2 - https://nf-co.re


INFO     Linting modules repo: '.'                                              
INFO     Linting module: 'cleanifier'                                           

╭─ [✗] 1 Module Test Failed ───────────────────────────────────────────────────╮
│                     ╷                           ╷                            │
│ Module name         │ File path                 │ Test message               │
│╶────────────────────┼───────────────────────────┼───────────────────────────╴│
│ cleanifier/filter   │ modules/nf-core/cleanifi… │ test_stub_gzip_syntax:     │
│                     │                           │ Stub gzip files must use   │
│                     │                           │ 'echo "" | gzip >' syntax. │
│                     │                           │ Invalid patterns found:    │
│                     │                           │ echo | gzip >              │
│                     │                           │ ${prefix}.clean_keep.fastq │
│                     │                           │ .gz                        │
│                     ╵                           ╵                            │
╰──────────────────────────────────────────────────────────────────────────────╯
╭───────────────────────╮
│ LINT RESULTS SUMMARY  │
├───────────────────────┤
│ [✔] 166 Tests Passed  │
│ [!]   0 Test Warnings │
│ [✗]   1 Test Failed   │
╰───────────────────────╯

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new module Adding a new module

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants