From 7fbf8a4bb6d3b7fe6a6e626eefb208c8657d0bf5 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 20 Nov 2025 09:31:49 +0000 Subject: [PATCH 001/104] Template update for nf-core/tools version 3.5.1 --- .github/workflows/awsfulltest.yml | 2 +- .github/workflows/awstest.yml | 2 +- .github/workflows/download_pipeline.yml | 2 +- .github/workflows/fix_linting.yml | 2 +- .github/workflows/linting.yml | 6 +- .github/workflows/nf-test.yml | 4 +- .github/workflows/release-announcements.yml | 9 +- .../workflows/template-version-comment.yml | 2 +- .nf-core.yml | 5 +- .prettierignore | 2 + CITATIONS.md | 4 - README.md | 6 +- conf/igenomes.config | 440 ------------------ conf/igenomes_ignored.config | 9 - conf/modules.config | 4 - conf/test.config | 3 +- conf/test_full.config | 4 +- docs/output.md | 14 - docs/usage.md | 3 +- main.nf | 13 - modules.json | 9 +- modules/nf-core/fastqc/environment.yml | 7 - modules/nf-core/fastqc/main.nf | 64 --- modules/nf-core/fastqc/meta.yml | 72 --- modules/nf-core/fastqc/tests/main.nf.test | 309 ------------ .../nf-core/fastqc/tests/main.nf.test.snap | 392 ---------------- modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 4 +- .../nf-core/multiqc/tests/main.nf.test.snap | 24 +- nextflow.config | 10 +- nextflow_schema.json | 42 -- ro-crate-metadata.json | 32 +- .../utils_nfcore_mhcquant_pipeline/main.nf | 44 +- .../nf-core/utils_nfcore_pipeline/main.nf | 2 +- tests/.nftignore | 2 - workflows/mhcquant.nf | 47 +- 36 files changed, 92 insertions(+), 1506 deletions(-) delete mode 100644 conf/igenomes.config delete mode 100644 conf/igenomes_ignored.config delete mode 100644 modules/nf-core/fastqc/environment.yml delete mode 100644 modules/nf-core/fastqc/main.nf delete mode 100644 modules/nf-core/fastqc/meta.yml delete mode 100644 modules/nf-core/fastqc/tests/main.nf.test delete mode 100644 modules/nf-core/fastqc/tests/main.nf.test.snap diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 98c43be7..2a91791f 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -40,7 +40,7 @@ jobs: } profiles: test_full - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index d747d13c..b1f77e32 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -25,7 +25,7 @@ jobs: } profiles: test - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: Seqera Platform debug log file path: | diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 6d94bcbf..45884ff9 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -127,7 +127,7 @@ jobs: fi - name: Upload Nextflow logfile for debugging purposes - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: nextflow_logfile.txt path: .nextflow.log* diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml index b67a297c..6a1fef59 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@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: token: ${{ secrets.nf_core_bot_auth_token }} diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 30e66026..7a527a34 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,7 +11,7 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Set up Python 3.14 uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 @@ -28,7 +28,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 @@ -71,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: linting-logs path: | diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index e20bf6d0..c98d76ec 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -40,7 +40,7 @@ jobs: rm -rf ./* || true rm -rf ./.??* || true ls -la ./ - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: fetch-depth: 0 @@ -85,7 +85,7 @@ jobs: TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: fetch-depth: 0 diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index e64cebd6..431d3d44 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -15,10 +15,9 @@ jobs: echo "topics=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .topics[]' | awk '{print "#"$0}' | tr '\n' ' ')" | sed 's/-//g' >> $GITHUB_OUTPUT - name: get description - id: get_topics + id: get_description run: | - echo "description=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .description' >> $GITHUB_OUTPUT - + echo "description=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .description')" >> $GITHUB_OUTPUT - uses: rzr/fediverse-action@master with: access-token: ${{ secrets.MASTODON_ACCESS_TOKEN }} @@ -27,9 +26,7 @@ jobs: # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#release message: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! - - ${{ steps.get_topics.outputs.description }} - + ${{ steps.get_description.outputs.description }} Please see the changelog: ${{ github.event.release.html_url }} ${{ steps.get_topics.outputs.topics }} #nfcore #openscience #nextflow #bioinformatics diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template-version-comment.yml index c5988af9..e8560fc7 100644 --- a/.github/workflows/template-version-comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: ref: ${{ github.event.pull_request.head.sha }} diff --git a/.nf-core.yml b/.nf-core.yml index 9e0a1ae9..77b74c8e 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,7 +2,7 @@ lint: files_unchanged: - .github/CONTRIBUTING.md - .vscode/settings.json -nf_core_version: 3.4.1 +nf_core_version: 3.5.1 repository_type: pipeline template: author: Jonas Scheid, Steffen Lemke, Leon Bichmann, Marissa Dubbelaar @@ -12,4 +12,7 @@ template: name: mhcquant org: nf-core outdir: . + skip_features: + - fastqc + - igenomes version: 3.1.0 diff --git a/.prettierignore b/.prettierignore index 2255e3e3..dd749d43 100644 --- a/.prettierignore +++ b/.prettierignore @@ -12,3 +12,5 @@ testing* bin/ .nf-test/ ro-crate-metadata.json +modules/nf-core/ +subworkflows/nf-core/ diff --git a/CITATIONS.md b/CITATIONS.md index b0bd941b..feb2ad7c 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -10,10 +10,6 @@ ## Pipeline tools -- [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) - -> Andrews, S. (2010). FastQC: A Quality Control Tool for High Throughput Sequence Data [Online]. - - [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. diff --git a/README.md b/README.md index f1c9ba3e..a4f3a30f 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,13 @@ -[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-core/mhcquant) +[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/mhcquant) [![GitHub Actions CI Status](https://github.com/nf-core/mhcquant/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/mhcquant/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/nf-core/mhcquant/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/mhcquant/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/mhcquant/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) [![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/) -[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.4.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.4.1) +[![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/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) @@ -31,7 +31,7 @@ -1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) +2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) ## Usage diff --git a/conf/igenomes.config b/conf/igenomes.config deleted file mode 100644 index 3f114377..00000000 --- a/conf/igenomes.config +++ /dev/null @@ -1,440 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for iGenomes paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines reference genomes using iGenome paths. - Can be used by any config that customises the base path using: - $params.igenomes_base / --igenomes_base ----------------------------------------------------------------------------------------- -*/ - -params { - // illumina iGenomes reference file paths - genomes { - 'GRCh37' { - fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed" - } - 'GRCh38' { - fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" - } - 'CHM13' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAIndex/" - bwamem2 = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAmem2Index/" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/CHM13/Annotation/Genes/genes.gtf" - gff = "ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/009/914/755/GCF_009914755.1_T2T-CHM13v2.0/GCF_009914755.1_T2T-CHM13v2.0_genomic.gff.gz" - mito_name = "chrM" - } - 'GRCm38' { - fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/GRCm38-blacklist.bed" - } - 'TAIR10' { - fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt" - mito_name = "Mt" - } - 'EB2' { - fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt" - } - 'UMD3.1' { - fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt" - mito_name = "MT" - } - 'WBcel235' { - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" - mito_name = "MtDNA" - macs_gsize = "9e7" - } - 'CanFam3.1' { - fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt" - mito_name = "MT" - } - 'GRCz10' { - fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'BDGP6' { - fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" - mito_name = "M" - macs_gsize = "1.2e8" - } - 'EquCab2' { - fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt" - mito_name = "MT" - } - 'EB1' { - fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt" - } - 'Galgal4' { - fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'Gm01' { - fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt" - } - 'Mmul_1' { - fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt" - mito_name = "MT" - } - 'IRGSP-1.0' { - fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" - mito_name = "Mt" - } - 'CHIMP2.1.4' { - fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt" - mito_name = "MT" - } - 'Rnor_5.0' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'Rnor_6.0' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'R64-1-1' { - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" - mito_name = "MT" - macs_gsize = "1.2e7" - } - 'EF2' { - fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "1.21e7" - } - 'Sbi1' { - fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt" - } - 'Sscrofa10.2' { - fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt" - mito_name = "MT" - } - 'AGPv3' { - fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" - mito_name = "Mt" - } - 'hg38' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" - } - 'hg19' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg19-blacklist.bed" - } - 'mm10' { - fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/mm10-blacklist.bed" - } - 'bosTau8' { - fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed" - mito_name = "chrM" - } - 'ce10' { - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "9e7" - } - 'canFam3' { - fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt" - mito_name = "chrM" - } - 'danRer10' { - fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "1.37e9" - } - 'dm6' { - fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "1.2e8" - } - 'equCab2' { - fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt" - mito_name = "chrM" - } - 'galGal4' { - fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt" - mito_name = "chrM" - } - 'panTro4' { - fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt" - mito_name = "chrM" - } - 'rn6' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed" - mito_name = "chrM" - } - 'sacCer3' { - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" - readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "1.2e7" - } - 'susScr3' { - fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt" - mito_name = "chrM" - } - } -} diff --git a/conf/igenomes_ignored.config b/conf/igenomes_ignored.config deleted file mode 100644 index b4034d82..00000000 --- a/conf/igenomes_ignored.config +++ /dev/null @@ -1,9 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for iGenomes paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Empty genomes dictionary to use when igenomes is ignored. ----------------------------------------------------------------------------------------- -*/ - -params.genomes = [:] diff --git a/conf/modules.config b/conf/modules.config index d203d2b6..f0b0d55a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -18,10 +18,6 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - withName: FASTQC { - ext.args = '--quiet' - } - withName: 'MULTIQC' { ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } publishDir = [ diff --git a/conf/test.config b/conf/test.config index 0e60d4d6..745ad332 100644 --- a/conf/test.config +++ b/conf/test.config @@ -25,6 +25,5 @@ params { // Input data // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv'// Genome references - genome = 'R64-1-1' + input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' } diff --git a/conf/test_full.config b/conf/test_full.config index 8b2df09c..81f35f41 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -19,6 +19,6 @@ params { // TODO nf-core: Give any required params for the test so that command line flags are not needed input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' - // Genome references - genome = 'R64-1-1' + // Fasta references + fasta = params.pipelines_testdata_base_path + 'viralrecon/genome/NC_045512.2/GCF_009858895.2_ASM985889v3_genomic.200409.fna.gz' } diff --git a/docs/output.md b/docs/output.md index 309751a0..fda42dc7 100644 --- a/docs/output.md +++ b/docs/output.md @@ -12,23 +12,9 @@ The directories listed below will be created in the results directory after the The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -- [FastQC](#fastqc) - Raw read QC - [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline - [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution -### FastQC - -
-Output files - -- `fastqc/` - - `*_fastqc.html`: FastQC report containing quality metrics. - - `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. - -
- -[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your sequenced reads. It provides information about the quality score distribution across your reads, per base sequence content (%A/T/G/C), adapter contamination and overrepresented sequences. For further reading and documentation see the [FastQC help pages](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/). - ### MultiQC
diff --git a/docs/usage.md b/docs/usage.md index 49d7dac4..b138bf57 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -57,7 +57,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: ```bash -nextflow run nf-core/mhcquant --input ./samplesheet.csv --outdir ./results --genome GRCh37 -profile docker +nextflow run nf-core/mhcquant --input ./samplesheet.csv --outdir ./results -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -89,7 +89,6 @@ with: ```yaml title="params.yaml" input: './samplesheet.csv' outdir: './results/' -genome: 'GRCh37' <...> ``` diff --git a/main.nf b/main.nf index 3695d206..a020bc14 100644 --- a/main.nf +++ b/main.nf @@ -18,19 +18,6 @@ include { MHCQUANT } from './workflows/mhcquant' include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_mhcquant_pipeline' include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_mhcquant_pipeline' -include { getGenomeAttribute } from './subworkflows/local/utils_nfcore_mhcquant_pipeline' - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - GENOME PARAMETER VALUES -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -// TODO nf-core: Remove this line if you don't need a FASTA file -// This is an example of how to use getGenomeAttribute() to fetch parameters -// from igenomes.config using `--genome` -params.fasta = getGenomeAttribute('fasta') - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ NAMED WORKFLOWS FOR PIPELINE diff --git a/modules.json b/modules.json index ae34b018..4e50fcff 100644 --- a/modules.json +++ b/modules.json @@ -5,14 +5,9 @@ "https://github.com/nf-core/modules.git": { "modules": { "nf-core": { - "fastqc": { - "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] - }, "multiqc": { "branch": "master", - "git_sha": "e10b76ca0c66213581bec2833e30d31f239dec0b", + "git_sha": "af27af1be706e6a2bb8fe454175b0cdf77f47b49", "installed_by": ["modules"] } } @@ -26,7 +21,7 @@ }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "271e7fc14eb1320364416d996fb077421f3faed2", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { diff --git a/modules/nf-core/fastqc/environment.yml b/modules/nf-core/fastqc/environment.yml deleted file mode 100644 index f9f54ee9..00000000 --- a/modules/nf-core/fastqc/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::fastqc=0.12.1 diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf deleted file mode 100644 index 23e16634..00000000 --- a/modules/nf-core/fastqc/main.nf +++ /dev/null @@ -1,64 +0,0 @@ -process FASTQC { - tag "${meta.id}" - label 'process_medium' - - conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/fastqc:0.12.1--hdfd78af_0' : - 'biocontainers/fastqc:0.12.1--hdfd78af_0' }" - - input: - tuple val(meta), path(reads) - - output: - tuple val(meta), path("*.html"), emit: html - tuple val(meta), path("*.zip") , emit: zip - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - // Make list of old name and new name pairs to use for renaming in the bash while loop - def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] } - def rename_to = old_new_pairs*.join(' ').join(' ') - def renamed_files = old_new_pairs.collect{ _old_name, new_name -> new_name }.join(' ') - - // The total amount of allocated RAM by FastQC is equal to the number of threads defined (--threads) time the amount of RAM defined (--memory) - // https://github.com/s-andrews/FastQC/blob/1faeea0412093224d7f6a07f777fad60a5650795/fastqc#L211-L222 - // Dividing the task.memory by task.cpu allows to stick to requested amount of RAM in the label - def memory_in_mb = task.memory ? task.memory.toUnit('MB') / task.cpus : null - // FastQC memory value allowed range (100 - 10000) - def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) - - """ - printf "%s %s\\n" ${rename_to} | while read old_name new_name; do - [ -f "\${new_name}" ] || ln -s \$old_name \$new_name - done - - fastqc \\ - ${args} \\ - --threads ${task.cpus} \\ - --memory ${fastqc_memory} \\ - ${renamed_files} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.html - touch ${prefix}.zip - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml deleted file mode 100644 index c8d9d025..00000000 --- a/modules/nf-core/fastqc/meta.yml +++ /dev/null @@ -1,72 +0,0 @@ -name: fastqc -description: Run FastQC on sequenced reads -keywords: - - quality control - - qc - - adapters - - fastq -tools: - - fastqc: - description: | - FastQC gives general quality metrics about your reads. - It provides information about the quality score distribution - across your reads, the per base sequence content (%A/C/G/T). - - You get information about adapter contamination and other - overrepresented sequences. - homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ - documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ - licence: ["GPL-2.0-only"] - identifier: biotools:fastqc -input: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. - ontologies: [] -output: - html: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.html": - type: file - description: FastQC report - pattern: "*_{fastqc.html}" - ontologies: [] - zip: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.zip": - type: file - description: FastQC report archive - pattern: "*_{fastqc.zip}" - ontologies: [] - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML -authors: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" -maintainers: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" diff --git a/modules/nf-core/fastqc/tests/main.nf.test b/modules/nf-core/fastqc/tests/main.nf.test deleted file mode 100644 index e9d79a07..00000000 --- a/modules/nf-core/fastqc/tests/main.nf.test +++ /dev/null @@ -1,309 +0,0 @@ -nextflow_process { - - name "Test Process FASTQC" - script "../main.nf" - process "FASTQC" - - tag "modules" - tag "modules_nfcore" - tag "fastqc" - - test("sarscov2 single-end [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [ id: 'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - // NOTE The report contains the date inside it, which means that the md5sum is stable per day, but not longer than that. So you can't md5sum it. - // looks like this:
Mon 2 Oct 2023
test.gz
- // https://github.com/nf-core/modules/pull/3903#issuecomment-1743620039 - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } - ) - } - } - - test("sarscov2 paired-end [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, - { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, - { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, - { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, - { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } - ) - } - } - - test("sarscov2 interleaved [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } - ) - } - } - - test("sarscov2 paired-end [bam]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } - ) - } - } - - test("sarscov2 multiple [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_2.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, - { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, - { assert process.out.html[0][1][2] ==~ ".*/test_3_fastqc.html" }, - { assert process.out.html[0][1][3] ==~ ".*/test_4_fastqc.html" }, - { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, - { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, - { assert process.out.zip[0][1][2] ==~ ".*/test_3_fastqc.zip" }, - { assert process.out.zip[0][1][3] ==~ ".*/test_4_fastqc.zip" }, - { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][2]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][3]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } - ) - } - } - - test("sarscov2 custom_prefix") { - - when { - process { - """ - input[0] = Channel.of([ - [ id:'mysample', single_end:true ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert process.out.html[0][1] ==~ ".*/mysample_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/mysample_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } - ) - } - } - - test("sarscov2 single-end [fastq] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [ id: 'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 paired-end [fastq] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 interleaved [fastq] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 paired-end [bam] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 multiple [fastq] - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_2.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } - - test("sarscov2 custom_prefix - stub") { - - options "-stub" - when { - process { - """ - input[0] = Channel.of([ - [ id:'mysample', single_end:true ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - } -} diff --git a/modules/nf-core/fastqc/tests/main.nf.test.snap b/modules/nf-core/fastqc/tests/main.nf.test.snap deleted file mode 100644 index d5db3092..00000000 --- a/modules/nf-core/fastqc/tests/main.nf.test.snap +++ /dev/null @@ -1,392 +0,0 @@ -{ - "sarscov2 custom_prefix": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:02:16.374038" - }, - "sarscov2 single-end [fastq] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": true - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": true - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "html": [ - [ - { - "id": "test", - "single_end": true - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "zip": [ - [ - { - "id": "test", - "single_end": true - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:02:24.993809" - }, - "sarscov2 custom_prefix - stub": { - "content": [ - { - "0": [ - [ - { - "id": "mysample", - "single_end": true - }, - "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "mysample", - "single_end": true - }, - "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "html": [ - [ - { - "id": "mysample", - "single_end": true - }, - "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "zip": [ - [ - { - "id": "mysample", - "single_end": true - }, - "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:03:10.93942" - }, - "sarscov2 interleaved [fastq]": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:01:42.355718" - }, - "sarscov2 paired-end [bam]": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:01:53.276274" - }, - "sarscov2 multiple [fastq]": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:02:05.527626" - }, - "sarscov2 paired-end [fastq]": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:01:31.188871" - }, - "sarscov2 paired-end [fastq] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "zip": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:02:34.273566" - }, - "sarscov2 multiple [fastq] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "zip": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:03:02.304411" - }, - "sarscov2 single-end [fastq]": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:01:19.095607" - }, - "sarscov2 interleaved [fastq] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "zip": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:02:44.640184" - }, - "sarscov2 paired-end [bam] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ], - "zip": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-07-22T11:02:53.550742" - } -} \ No newline at end of file diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index dd513cbd..d02016a0 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.31 + - bioconda::multiqc=1.32 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 5288f5cc..c1158fb0 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ef/eff0eafe78d5f3b65a6639265a16b89fdca88d06d18894f90fcdb50142004329/data' : - 'community.wave.seqera.io/library/multiqc:1.31--1efbafd542a23882' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb/data' : + 'community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 17881d15..a88bafd6 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:57:36.139055243" + "timestamp": "2025-10-27T13:33:24.356715" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:59:15.142230631" + "timestamp": "2025-10-27T13:34:11.103619" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:58:29.629087066" + "timestamp": "2025-10-27T13:34:04.615233" } } \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 6c659610..0b41a19a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -13,11 +13,6 @@ params { // Input options input = null - // References - genome = null - igenomes_base = 's3://ngi-igenomes/igenomes/' - igenomes_ignore = false - // MultiQC options multiqc_config = null multiqc_title = null @@ -170,8 +165,6 @@ profiles { test_full { includeConfig 'conf/test_full.config' } } -// Set AWS client to anonymous when using the default igenomes_base -aws.client.anonymous = !params.igenomes_ignore && params.igenomes_base?.startsWith('s3://ngi-igenomes/igenomes/') ?: false // Load nf-core custom profiles from different institutions // If params.custom_config_base is set AND either the NXF_OFFLINE environment variable is not set or params.custom_config_base is a local path, the nfcore_custom.config file from the specified base path is included. @@ -192,8 +185,7 @@ podman.registry = 'quay.io' singularity.registry = 'quay.io' charliecloud.registry = 'quay.io' -// Load igenomes.config if required -includeConfig !params.igenomes_ignore ? 'conf/igenomes.config' : 'conf/igenomes_ignored.config' + // Export these variables to prevent local Python/R libraries from conflicting with those in the container // The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. diff --git a/nextflow_schema.json b/nextflow_schema.json index ea869e3e..e34fe1ae 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -43,45 +43,6 @@ } } }, - "reference_genome_options": { - "title": "Reference genome options", - "type": "object", - "fa_icon": "fas fa-dna", - "description": "Reference genome related files and options required for the workflow.", - "properties": { - "genome": { - "type": "string", - "description": "Name of iGenomes reference.", - "fa_icon": "fas fa-book", - "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`. \n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details." - }, - "fasta": { - "type": "string", - "format": "file-path", - "exists": true, - "mimetype": "text/plain", - "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", - "description": "Path to FASTA genome file.", - "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", - "fa_icon": "far fa-file-code" - }, - "igenomes_ignore": { - "type": "boolean", - "description": "Do not load the iGenomes reference config.", - "fa_icon": "fas fa-ban", - "hidden": true, - "help_text": "Do not load `igenomes.config` when running the pipeline. You may choose this option if you observe clashes between custom parameters and those supplied in `igenomes.config`." - }, - "igenomes_base": { - "type": "string", - "format": "directory-path", - "description": "The base path to the igenomes reference files", - "fa_icon": "fas fa-ban", - "hidden": true, - "default": "s3://ngi-igenomes/igenomes/" - } - } - }, "institutional_config_options": { "title": "Institutional config options", "type": "object", @@ -244,9 +205,6 @@ { "$ref": "#/$defs/input_output_options" }, - { - "$ref": "#/$defs/reference_genome_options" - }, { "$ref": "#/$defs/institutional_config_options" }, diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 36f3b76b..5246cb40 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "Stable", - "datePublished": "2025-10-16T13:38:43+00:00", - "description": "

\n \n \n \"nf-core/mhcquant\"\n \n

\n\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-core/mhcquant)\n[![GitHub Actions CI Status](https://github.com/nf-core/mhcquant/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/mhcquant/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/mhcquant/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/mhcquant/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/mhcquant/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![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/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.4.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.4.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/mhcquant)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23mhcquant-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/mhcquant)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/mhcquant** is a bioinformatics pipeline that ...\n\n\n\n\n1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/))2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/mhcquant \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> 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/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor 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).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/mhcquant/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/mhcquant/output).\n\n## Credits\n\nnf-core/mhcquant was originally written by Jonas Scheid, Steffen Lemke, Leon Bichmann, Marissa Dubbelaar.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#mhcquant` channel](https://nfcore.slack.com/channels/mhcquant) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "datePublished": "2025-11-20T09:31:42+00:00", + "description": "

\n \n \n \"nf-core/mhcquant\"\n \n

\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/mhcquant)\n[![GitHub Actions CI Status](https://github.com/nf-core/mhcquant/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/mhcquant/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/mhcquant/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/mhcquant/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/mhcquant/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![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/)\n[![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)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/mhcquant)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23mhcquant-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/mhcquant)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/mhcquant** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/mhcquant \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> 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/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor 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).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/mhcquant/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/mhcquant/output).\n\n## Credits\n\nnf-core/mhcquant was originally written by Jonas Scheid, Steffen Lemke, Leon Bichmann, Marissa Dubbelaar.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#mhcquant` channel](https://nfcore.slack.com/channels/mhcquant) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -99,7 +99,7 @@ }, "mentions": [ { - "@id": "#6d33625d-cbe9-4bfa-b980-f0d32832e0c7" + "@id": "#1f0c6385-b676-4aa1-9ced-1a9af63bbaa5" } ], "name": "nf-core/mhcquant" @@ -123,18 +123,18 @@ "@id": "main.nf", "@type": ["File", "SoftwareSourceCode", "ComputationalWorkflow"], "creator": [ - { - "@id": "https://orcid.org/0000-0001-7135-0073" - }, { "@id": "https://orcid.org/0000-0002-8937-3457" }, { "@id": "https://orcid.org/0000-0002-6503-2180" + }, + { + "@id": "https://orcid.org/0000-0001-7135-0073" } ], "dateCreated": "", - "dateModified": "2025-10-16T13:38:43Z", + "dateModified": "2025-11-20T09:31:42Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -170,11 +170,11 @@ "version": "!>=25.04.0" }, { - "@id": "#6d33625d-cbe9-4bfa-b980-f0d32832e0c7", + "@id": "#1f0c6385-b676-4aa1-9ced-1a9af63bbaa5", "@type": "TestSuite", "instance": [ { - "@id": "#bbc3bb16-a118-4bf0-be67-ed0c344c5101" + "@id": "#c3931476-32ac-42a7-8104-0b0c00ee21a0" } ], "mainEntity": { @@ -183,7 +183,7 @@ "name": "Test suite for nf-core/mhcquant" }, { - "@id": "#bbc3bb16-a118-4bf0-be67-ed0c344c5101", + "@id": "#c3931476-32ac-42a7-8104-0b0c00ee21a0", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/mhcquant", "resource": "repos/nf-core/mhcquant/actions/workflows/nf-test.yml", @@ -311,12 +311,6 @@ "name": "nf-core", "url": "https://nf-co.re/" }, - { - "@id": "https://orcid.org/0000-0001-7135-0073", - "@type": "Person", - "email": "bichmann@informatik.uni-tuebingen.de", - "name": "Leon Bichmann" - }, { "@id": "https://orcid.org/0000-0002-8937-3457", "@type": "Person", @@ -328,6 +322,12 @@ "@type": "Person", "email": "apeltzer@users.noreply.github.com", "name": "Alexander Peltzer" + }, + { + "@id": "https://orcid.org/0000-0001-7135-0073", + "@type": "Person", + "email": "bichmann@informatik.uni-tuebingen.de", + "name": "Leon Bichmann" } ] } diff --git a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf index 78af3f03..4b6abafd 100644 --- a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf @@ -39,7 +39,7 @@ workflow PIPELINE_INITIALISATION { main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // // Print version and exit if required and dump pipeline parameters to JSON file @@ -64,7 +64,7 @@ workflow PIPELINE_INITIALISATION { \033[0;35m nf-core/mhcquant ${workflow.manifest.version}\033[0m -\033[2m----------------------------------------------------\033[0m- """ - after_text = """${workflow.manifest.doi ? "\n* The pipeline\n" : ""}${workflow.manifest.doi.tokenize(",").collect { " https://doi.org/${it.trim().replace('https://doi.org/','')}"}.join("\n")}${workflow.manifest.doi ? "\n" : ""} + after_text = """${workflow.manifest.doi ? "\n* The pipeline\n" : ""}${workflow.manifest.doi.tokenize(",").collect { doi -> " https://doi.org/${doi.trim().replace('https://doi.org/','')}"}.join("\n")}${workflow.manifest.doi ? "\n" : ""} * The nf-core framework https://doi.org/10.1038/s41587-020-0439-x @@ -92,16 +92,11 @@ workflow PIPELINE_INITIALISATION { nextflow_cli_args ) - // - // Custom validation for pipeline parameters - // - validateInputParameters() - // // Create channel from input file provided through params.input // - Channel + channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) .map { meta, fastq_1, fastq_2 -> @@ -179,12 +174,6 @@ workflow PIPELINE_COMPLETION { FUNCTIONS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -// -// Check and validate pipeline parameters -// -def validateInputParameters() { - genomeExistsError() -} // // Validate channels from input samplesheet @@ -201,31 +190,6 @@ def validateInputSamplesheet(input) { return [ metas[0], fastqs ] } // -// Get attribute from genome config file e.g. fasta -// -def getGenomeAttribute(attribute) { - if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { - if (params.genomes[ params.genome ].containsKey(attribute)) { - return params.genomes[ params.genome ][ attribute ] - } - } - return null -} - -// -// Exit pipeline if incorrect --genome key provided -// -def genomeExistsError() { - if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - def error_string = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + - " Currently, the available genome keys are:\n" + - " ${params.genomes.keySet().join(", ")}\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - error(error_string) - } -} -// // Generate methods description for MultiQC // def toolCitationText() { @@ -234,7 +198,6 @@ def toolCitationText() { // Uncomment function in methodsDescriptionText to render in MultiQC report def citation_text = [ "Tools used in the workflow included:", - "FastQC (Andrews 2010),", "MultiQC (Ewels et al. 2016)", "." ].join(' ').trim() @@ -247,7 +210,6 @@ def toolBibliographyText() { // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "
  • Author (2023) Pub name, Journal, DOI
  • " : "", // Uncomment function in methodsDescriptionText to render in MultiQC report def reference_text = [ - "
  • Andrews S, (2010) FastQC, URL: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/).
  • ", "
  • Ewels, P., Magnusson, M., Lundin, S., & Käller, M. (2016). MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics , 32(19), 3047–3048. doi: /10.1093/bioinformatics/btw354
  • " ].join(' ').trim() diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index bfd25876..2f30e9a4 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -98,7 +98,7 @@ def workflowVersionToYAML() { // Get channel of software versions used in pipeline in YAML format // def softwareVersionsToYAML(ch_versions) { - return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(Channel.of(workflowVersionToYAML())) + return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(channel.of(workflowVersionToYAML())) } // diff --git a/tests/.nftignore b/tests/.nftignore index e128a128..83f7a0a5 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -1,5 +1,4 @@ .DS_Store -multiqc/multiqc_data/fastqc_top_overrepresented_sequences_table.txt multiqc/multiqc_data/multiqc.parquet multiqc/multiqc_data/multiqc.log multiqc/multiqc_data/multiqc_data.json @@ -8,5 +7,4 @@ multiqc/multiqc_data/multiqc_software_versions.txt multiqc/multiqc_data/llms-full.txt multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} multiqc/multiqc_report.html -fastqc/*_fastqc.{html,zip} pipeline_info/*.{html,json,txt,yml} diff --git a/workflows/mhcquant.nf b/workflows/mhcquant.nf index 3d9b9ca8..c24f27a0 100644 --- a/workflows/mhcquant.nf +++ b/workflows/mhcquant.nf @@ -3,7 +3,6 @@ IMPORT MODULES / SUBWORKFLOWS / FUNCTIONS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { FASTQC } from '../modules/nf-core/fastqc/main' include { MULTIQC } from '../modules/nf-core/multiqc/main' include { paramsSummaryMap } from 'plugin/nf-schema' include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' @@ -22,21 +21,31 @@ workflow MHCQUANT { ch_samplesheet // channel: samplesheet read in from --input main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() - // - // MODULE: Run FastQC - // - FASTQC ( - ch_samplesheet - ) - ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}) - ch_versions = ch_versions.mix(FASTQC.out.versions.first()) + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() // // Collate and save software versions // - softwareVersionsToYAML(ch_versions) + def topic_versions = Channel.topic("versions") + .distinct() + .branch { entry -> + versions_file: entry instanceof Path + versions_tuple: true + } + + def topic_versions_string = topic_versions.versions_tuple + .map { process, tool, version -> + [ process[process.lastIndexOf(':')+1..-1], " ${tool}: ${version}" ] + } + .groupTuple(by:0) + .map { process, tool_versions -> + tool_versions.unique().sort() + "${process}:\n${tool_versions.join('\n')}" + } + + softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) + .mix(topic_versions_string) .collectFile( storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_' + 'mhcquant_software_' + 'mqc_' + 'versions.yml', @@ -48,24 +57,24 @@ workflow MHCQUANT { // // MODULE: MultiQC // - ch_multiqc_config = Channel.fromPath( + ch_multiqc_config = channel.fromPath( "$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? - Channel.fromPath(params.multiqc_config, checkIfExists: true) : - Channel.empty() + channel.fromPath(params.multiqc_config, checkIfExists: true) : + channel.empty() ch_multiqc_logo = params.multiqc_logo ? - Channel.fromPath(params.multiqc_logo, checkIfExists: true) : - Channel.empty() + channel.fromPath(params.multiqc_logo, checkIfExists: true) : + channel.empty() summary_params = paramsSummaryMap( workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) + ch_workflow_summary = channel.value(paramsSummaryMultiqc(summary_params)) ch_multiqc_files = ch_multiqc_files.mix( ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = Channel.value( + ch_methods_description = channel.value( methodsDescriptionText(ch_multiqc_custom_methods_description)) ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) From cb2ca7bec5f5f2a7ec3f8d3ddecd73f74040abc4 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 8 Jan 2026 12:20:46 +0000 Subject: [PATCH 002/104] bump version to 3.2.0dev --- .nf-core.yml | 2 +- assets/multiqc_config.yml | 4 +-- nextflow.config | 2 +- ro-crate-metadata.json | 54 +++++++++++++++++---------------------- 4 files changed, 27 insertions(+), 35 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 77b74c8e..1a7fed6b 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -15,4 +15,4 @@ template: skip_features: - fastqc - igenomes - version: 3.1.0 + version: 3.2.0dev diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 6db209cc..2c55035f 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -3,9 +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 - analysis pipeline. For information about how to interpret these results, please see the - documentation. + 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: "nf-core-mhcquant-methods-description": order: -1000 diff --git a/nextflow.config b/nextflow.config index 4aecf247..724e9dc1 100644 --- a/nextflow.config +++ b/nextflow.config @@ -355,7 +355,7 @@ manifest { mainScript = 'main.nf' defaultBranch = 'master' nextflowVersion = '!>=25.04.0' - version = '3.1.0' + version = '3.2.0dev' doi = '10.1186/s13059-025-03763-8' } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index d2bc6c7e..ff701c73 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -21,8 +21,8 @@ { "@id": "./", "@type": "Dataset", - "creativeWorkStatus": "Stable", - "datePublished": "2025-10-20T07:45:13+00:00", + "creativeWorkStatus": "InProgress", + "datePublished": "2026-01-08T12:19:18+00:00", "description": "

    \n \n \n \"nf-core/mhcquant\"\n \n

    \n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/nf-core/mhcquant)\n[![GitHub Actions CI Status](https://github.com/nf-core/mhcquant/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/mhcquant/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/mhcquant/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/mhcquant/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/mhcquant/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.8427707-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.8427707)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![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/)\n[![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)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/nf-core/mhcquant)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23mhcquant-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/mhcquant)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nfcore/mhcquant** is a best-practice bioinformatics pipeline to process data-dependent acquisition (DDA) immunopeptidomics data. This involves mass spectrometry-based identification and quantification of immunopeptides presented on major histocompatibility complex (MHC) molecules which mediate T cell immunosurveillance. Immunopeptidomics has central implications for clinical research, in the context of [T cell-centric immunotherapies](https://www.sciencedirect.com/science/article/pii/S1044532323000180).\n\nThe pipeline is based on the OpenMS C++ framework for computational mass spectrometry. Spectrum files (mzML/Thermo raw/Bruker tdf) serve as inputs and a database search (Comet) is performed based on a given input protein database. Peptide properties are predicted by MS\u00b2Rescore. FDR rescoring is applied using Percolator or Mokapot based on a competitive target-decoy approach. The pipeline supports both local FDR control (per sample-condition group) and global FDR control (across all samples). For label-free quantification, all input files undergo identification-based retention time alignment and targeted feature extraction matching ids between runs. The pipeline can also generate spectrum libraries suitable for DIA-based searches as well as computing consensus epitopes using epicore.\n\n![overview](assets/mhcquant_subway.png)\n\nThe pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community!\n\nOn release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/mhcquant/results).\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how\n> to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline)\n> with `-profile test` before running the workflow on actual data.\n\nFirst, prepare a samplesheet with your input data that looks as follows:\n\n`samplesheet.tsv`\n\n```tsv title=\"samplesheet.tsv\nID\tSample\tCondition\tReplicateFileName\n1\ttumor\ttreated\t/path/to/msrun1.raw|mzML|d\n2\ttumor\ttreated\t/path/to/msrun2.raw|mzML|d\n3\ttumor\tuntreated\t/path/to/msrun3.raw|mzML|d\n4\ttumor\tuntreated\t/path/to/msrun4.raw|mzML|d\n```\n\nEach row represents a mass spectrometry run in one of the formats: raw, RAW, mzML, mzML.gz, d, d.tar.gz, d.zip\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/mhcquant \\\n -profile \\\n --input 'samplesheet.tsv' \\\n --fasta 'SWISSPROT_2020.fasta' \\\n --outdir ./results\n```\n\nOptional parameters for additional functionality:\n\n```bash\n# Enable quantification, global FDR and spectrum library generation, ion annotations, and consenus epitopes\nnextflow run nf-core/mhcquant \\\n --input 'samplesheet.tsv' \\\n --fasta 'SWISSPROT_2020.fasta' \\\n --annotate_ions \\\n --epicore \\\n --generate_speclib \\\n --global_fdr \\\n --quantify \\\n --outdir ./results \\\n -profile docker\n```\n\n> [!WARNING]\n> 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/docs/usage/getting_started/configuration#custom-configuration-files).\n\nFor 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).\n\n## Pipeline summary\n\n### Default Steps\n\nBy default the pipeline currently performs identification of MHC class I peptides with HCD settings:\n\n- **Spectra Preparation**: Preparing spectra dependent on the input format (`PREPARE_SPECTRA` subworkflow)\n- **Database Preparation**: Creation of reversed decoy database (`DecoyDatabase`)\n- **Peptide Identification**: Identification of peptides in the MS/MS spectra (`CometAdapter`)\n- **Database Indexing**: Refreshes protein references for all peptide hits and adds target/decoy information (`PeptideIndexer`)\n- **Identification Merging**: Merges identification files with the same `Sample` and `Condition` label (`IDMerger`)\n- **Rescoring**: Feature prediction and peptide-spectrum-match rescoring (`RESCORE` subworkflow)\n - Prediction of retention times and MS2 intensities (`MS\u00b2Rescore`)\n - Extract PSM features for rescoring engines (`PSMFeatureExtractor`)\n - Peptide-spectrum-match rescoring using Percolator or Mokapot (`PercolatorAdapter`)\n - Filters peptide identification result according to configurable FDR threshold (`IDFilter`)\n- **Export**: Converts identification result to tab-separated files (`TextExporter`)\n\n### FDR Control Modes\n\nThe pipeline supports two FDR control strategies:\n\n- **Local FDR** (default): FDR control applied per `Sample` and `Condition` group\n- **Global FDR**: FDR control applied across all samples in the dataset (enable with `--global_fdr`)\n\n### Additional Steps\n\nAdditional functionality contained by the pipeline currently includes:\n\n#### Quantification (`QUANT` subworkflow)\n\nWhen enabled with `--quantify`, the pipeline performs label-free quantification:\n\n- **Alignment**: Corrects retention time distortions between runs (`MAP_ALIGNMENT` subworkflow)\n - Corrects retention time distortions between runs (`MapAlignerIdentification`)\n - Applies retention time transformations to runs (`MapRTTransformer`)\n- **Feature Processing**: Detects and processes features (`PROCESS_FEATURE` subworkflow)\n - Detects features in MS1 data based on peptide identifications (`FeatureFinderIdentification`)\n - Group corresponding features across label-free experiments (`FeatureLinkerUnlabeledKD`)\n - Resolves ambiguous annotations of features with peptide identifications (`IDConflictResolver`)\n\n#### Spectrum Library Generation (`SPECLIB` subworkflow)\n\nWhen enabled with `--generate_speclib`, the pipeline generates spectrum libraries suitable for DIA-based searches. Outputs one library per sample or a single library across all samples (if global FDR mode is enabled with `--global_fdr`).\n\n#### Ion Annotation (`IONANNOTATOR` subworkflow)\n\nThe pipeline annotates the final list of peptides with their respective ions and charges:\n\n- Annotates final list of peptides with their respective ions and charges (`IonAnnotator`)\n\n#### Output\n\n## Documentation\n\nTo see the the results of a test run with a full size dataset refer to the [results](https://nf-co.re/mhcquant/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/mhcquant/output).\n\n1. [Nextflow installation](https://nf-co.re/usage/installation)\n2. Pipeline configuration\n - [Pipeline installation](https://nf-co.re/docs/usage/getting_started/offline)\n - [Adding your own system config](https://nf-co.re/usage/adding_own_config)\n3. [Running the pipeline](https://nf-co.re/mhcquant/docs/usage.md)\n - This includes tutorials, FAQs, and troubleshooting instructions\n4. [Output and how to interpret the results](https://nf-co.re/mhcquant/docs/output.md)\n\n## Credits\n\nnf-core/mhcquant was originally written by [Leon Bichmann](https://github.com/Leon-Bichmann) from the [Kohlbacher Lab](https://kohlbacherlab.org/). The pipeline was re-written in Nextflow DSL2 by [Marissa Dubbelaar](https://github.com/marissaDubbelaar) and was significantly improved by [Jonas Scheid](https://github.com/jonasscheid) and [Steffen Lemke](https://github.com/steffenlem) from [Peptide-based Immunotherapy](https://www.medizin.uni-tuebingen.de/en-de/peptid-basierte-immuntherapie) and [Quantitative Biology Center](https://uni-tuebingen.de/forschung/forschungsinfrastruktur/zentrum-fuer-quantitative-biologie-qbic/) in T\u00fcbingen.\n\nHelpful contributors:\n\n- [Lukas Heumos](https://github.com/Zethson)\n- [Alexander Peltzer](https://github.com/apeltzer)\n- [Maxime Garcia](https://github.com/maxulysse)\n- [Gisela Gabernet](https://github.com/ggabernet)\n- [Susanne Jodoin](https://github.com/SusiJo)\n- [Oskar Wacker](https://github.com/WackerO)\n- [Leon Kuchenbecker](https://github.com/lkuchenb)\n- [Phil Ewels](https://github.com/ewels)\n- [Christian Fufezan](https://github.com/fu)\n- [Sven Fillinger](https://github.com/sven1103)\n- [Kevin Menden](https://github.com/KevinMenden)\n- [Julia Graf](https://github.com/JuliaGraf)\n- [Jana Hoffmann](https://github.com/janaHoffmann1)\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#mhcquant` channel](https://nfcore.slack.com/channels/mhcquant) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/mhcquant for your analysis, please cite the corresponding manuscript: [10.1186/s13059-025-03763-8](https://doi.org/10.1186/s13059-025-03763-8)\n\n> **MHCquant2 refines immunopeptidomics tumor antigen discovery**\n>\n> Jonas Scheid, Steffen Lemke, Naomi Hoenisch-Gravel, Anna Dengler, Timo Sachsenberg, Arthur Declerq, Ralf Gabriels, Jens Bauer, Marcel Wacker, Leon Bichmann, Lennart Martens, Marissa L. Dubbelaar, Sven Nahnsen & Juliane S. Walz\n>\n> _Genome Biology_ 2025 26 (1), 290. doi: [10.1021/acs.jproteome.9b00313](https://pubs.acs.org/doi/10.1021/acs.jproteome.9b00313)\n\n> **MHCquant: Automated and Reproducible Data Analysis for Immunopeptidomics**\n>\n> Leon Bichmann, Annika Nelde, Michael Ghosh, Lukas Heumos, Christopher Mohr, Alexander Peltzer, Leon Kuchenbecker, Timo Sachsenberg, Juliane S. Walz, Stefan Stevanovi\u0107, Hans-Georg Rammensee & Oliver Kohlbacher\n>\n> _Journal of Proteome Research_ 2019 18 (11), 3876-3884. doi: [10.1021/acs.jproteome.9b00313](https://pubs.acs.org/doi/10.1021/acs.jproteome.9b00313)\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n\nIn addition, references of tools and data used in this pipeline are as follows:\n\n> **OpenMS framework**\n>\n> Pfeuffer J. et al, _Nat Methods_ 2024 Mar;21(3):365-367. doi: [0.1038/s41592-024-02197-7](https://www.nature.com/articles/s41592-024-02197-7).\n>\n> **Comet Search Engine**\n>\n> Eng J.K. et al, _J Am Soc Mass Spectrom._ 2015 Nov;26(11):1865-74. doi: [10.1007/s13361-015-1179-x](https://pubs.acs.org/doi/10.1007/s13361-015-1179-x).\n>\n> **Retention time prediction**\n>\n> Bouwmeester R. et al, _Nature Methods_ 2021 Oct;18(11):1363-1369. doi: [10.1038/s41592-021-01301-5](https://www.nature.com/articles/s41592-021-01301-5)\n>\n> **MS\u00b2 Peak intensity prediction**\n>\n> Declercq A. et al, _Nucleic Acids Res._ 2023 Jul 5;51(W1):W338-W342. doi: [10.1093/nar/gkad335](https://academic.oup.com/nar/article/51/W1/W338/7151340?login=false)\n>\n> **CCS prediction**\n>\n> Declercq A. et al _Journal of Proteome Research_ 2025 Feb 6. doi: [10.1021/acs.jproteome.4c00609](https://pubs.acs.org/doi/10.1021/acs.jproteome.4c00609)\n>\n> **MS\u00b2Rescore framework**\n>\n> Buur L. M. et al, \\_J Proteome Res. 2024 Mar 16. doi: [10.1021/acs.jproteome.3c00785](https://pubs.acs.org/doi/10.1021/acs.jproteome.3c00785)\n>\n> **Percolator**\n>\n> K\u00e4ll L. et al, _Nat Methods_ 2007 Nov;4(11):923-5. doi: [10.1038/nmeth1113](https://www.nature.com/articles/nmeth1113).\n>\n> **Identification based RT Alignment**\n>\n> Weisser H. et al, _J Proteome Res._ 2013 Apr 5;12(4):1628-44. doi: [10.1021/pr300992u](https://pubs.acs.org/doi/10.1021/pr300992u)\n>\n> **Targeted peptide quantification**\n>\n> Weisser H. et al, _J Proteome Res._ 2017 Aug 4;16(8):2964-2974. doi: [10.1021/acs.jproteome.7b00248](https://pubs.acs.org/doi/10.1021/acs.jproteome.7b00248)\n", "hasPart": [ { @@ -105,7 +105,7 @@ }, "mentions": [ { - "@id": "#3dbe415b-3d82-41eb-a11f-065f425f8a83" + "@id": "#9e4c34cf-5530-46b2-be64-79e63d572382" } ], "name": "nf-core/mhcquant" @@ -139,18 +139,18 @@ { "@id": "https://orcid.org/0000-0001-7135-0073" }, - { - "@id": "https://orcid.org/0000-0002-6503-2180" - }, { "@id": "https://orcid.org/0000-0002-8937-3457" }, { "@id": "https://orcid.org/0000-0002-5923-1343" + }, + { + "@id": "https://orcid.org/0000-0002-6503-2180" } ], "dateCreated": "", - "dateModified": "2025-10-20T07:45:13Z", + "dateModified": "2026-01-08T12:19:18Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -187,10 +187,10 @@ }, "url": [ "https://github.com/nf-core/mhcquant", - "https://nf-co.re/mhcquant/3.1.0/" + "https://nf-co.re/mhcquant/dev/" ], "version": [ - "3.1.0" + "3.2.0dev" ] }, { @@ -206,11 +206,11 @@ "version": "!>=25.04.0" }, { - "@id": "#1f0c6385-b676-4aa1-9ced-1a9af63bbaa5", + "@id": "#9e4c34cf-5530-46b2-be64-79e63d572382", "@type": "TestSuite", "instance": [ { - "@id": "#c3931476-32ac-42a7-8104-0b0c00ee21a0" + "@id": "#b55a3b6b-29d0-41f1-a5dc-9c168ffc0064" } ], "mainEntity": { @@ -219,7 +219,7 @@ "name": "Test suite for nf-core/mhcquant" }, { - "@id": "#c3931476-32ac-42a7-8104-0b0c00ee21a0", + "@id": "#b55a3b6b-29d0-41f1-a5dc-9c168ffc0064", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/mhcquant", "resource": "repos/nf-core/mhcquant/actions/workflows/nf-test.yml", @@ -357,18 +357,6 @@ "name": "nf-core", "url": "https://nf-co.re/" }, - { - "@id": "https://orcid.org/0000-0002-5923-1343", - "@type": "Person", - "email": "jonas.scheid@uni-tuebingen.de", - "name": "Jonas Scheid" - }, - { - "@id": "https://orcid.org/0009-0009-8121-082X", - "@type": "Person", - "email": "steffen.lemke@uni-tuebingen.de", - "name": "Steffen Lemke" - }, { "@id": "https://orcid.org/0000-0002-4930-1467", "@type": "Person", @@ -381,17 +369,23 @@ "email": "bichmann@informatik.uni-tuebingen.de", "name": "Leon Bichmann" }, - { - "@id": "https://orcid.org/0000-0002-6503-2180", - "@type": "Person", - "email": "apeltzer@users.noreply.github.com", - "name": "Alexander Peltzer" - }, { "@id": "https://orcid.org/0000-0002-8937-3457", "@type": "Person", "email": "lukas.heumos@gmail.com", "name": "Lukas Heumos" + }, + { + "@id": "https://orcid.org/0000-0002-5923-1343", + "@type": "Person", + "email": "43858870+jonasscheid@users.noreply.github.com", + "name": "Jonas Scheid" + }, + { + "@id": "https://orcid.org/0000-0002-6503-2180", + "@type": "Person", + "email": "apeltzer@users.noreply.github.com", + "name": "Alexander Peltzer" } ] } \ No newline at end of file From cb7bbb65218f19d44cd6b37d637fb6c44efae208 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 8 Jan 2026 13:57:25 +0000 Subject: [PATCH 003/104] topic channel migration local modules --- conf/modules.config | 2 + modules.json | 2 +- modules/local/easypqp/convert/main.nf | 12 +---- modules/local/easypqp/library/main.nf | 12 +---- modules/local/epicore/main.nf | 12 +---- modules/local/ms2rescore/main.nf | 12 +---- .../featurefinderidentification/main.nf | 19 ++----- .../local/openms/idconflictresolver/main.nf | 18 ++----- .../openms/mapaligneridentification/main.nf | 18 ++----- modules/local/openms/maprttransformer/main.nf | 18 ++----- modules/local/openms/mztabexporter/main.nf | 18 ++----- .../local/openms/psmfeatureextractor/main.nf | 18 ++----- modules/local/openms/textexporter/main.nf | 18 ++----- .../featurelinkerunlabeledkd/main.nf | 16 ++---- .../percolatoradapter/main.nf | 15 +----- .../pyopenms/chromatogramextractor/main.nf | 12 +---- modules/local/pyopenms/ionannotator/main.nf | 13 +---- .../local/pyopenms/summarize_results/main.nf | 12 +---- modules/local/tdf2mzml/main.nf | 15 +----- modules/local/untar/main.nf | 12 +---- modules/local/unzip/main.nf | 12 +---- modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 44 +++++++-------- modules/nf-core/multiqc/meta.yml | 43 ++++++++++++--- modules/nf-core/multiqc/tests/main.nf.test | 32 +++++++++-- .../nf-core/multiqc/tests/main.nf.test.snap | 54 +++++++++++++------ subworkflows/local/map_alignment/main.nf | 3 -- subworkflows/local/prepare_spectra/main.nf | 3 -- subworkflows/local/process_feature/main.nf | 4 +- subworkflows/local/quant/main.nf | 1 - subworkflows/local/rescore/main.nf | 3 -- subworkflows/local/speclib/main.nf | 2 - workflows/mhcquant.nf | 9 ---- 33 files changed, 168 insertions(+), 318 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index c5b93fae..ada4c8ad 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -367,6 +367,8 @@ process { mode: params.publish_dir_mode, pattern: '*.html'] ] + errorStrategy = 'retry' + maxRetries = 3 } withName: 'OPENMS_PERCOLATORADAPTER' { diff --git a/modules.json b/modules.json index efeedebb..c3897798 100644 --- a/modules.json +++ b/modules.json @@ -12,7 +12,7 @@ }, "multiqc": { "branch": "master", - "git_sha": "af27af1be706e6a2bb8fe454175b0cdf77f47b49", + "git_sha": "5bdb098216aaf5df9c3b6343e6204cd932503c16", "installed_by": ["modules"] }, "openms/decoydatabase": { diff --git a/modules/local/easypqp/convert/main.nf b/modules/local/easypqp/convert/main.nf index 45387cdc..5e442dfc 100644 --- a/modules/local/easypqp/convert/main.nf +++ b/modules/local/easypqp/convert/main.nf @@ -14,7 +14,7 @@ process EASYPQP_CONVERT { output: tuple val(meta), path("*.psmpkl") , emit: psmpkl tuple val(meta), path("*.peakpkl"), emit: peakpkl - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('easypqp'), eval("easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\\d+\\.\\d+\\.\\d+'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -32,11 +32,6 @@ process EASYPQP_CONVERT { --spectra $spectra \\ --unimod $unimod \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - easypqp: \$(easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\\d+\\.\\d+\\.\\d+') - END_VERSIONS """ stub: @@ -49,10 +44,5 @@ process EASYPQP_CONVERT { touch "${prefix}.psmpkl" touch "${prefix}.peakpkl" - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - easypqp: \$(easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\\d+\\.\\d+\\.\\d+') - END_VERSIONS """ } diff --git a/modules/local/easypqp/library/main.nf b/modules/local/easypqp/library/main.nf index 6f720fb1..8db92728 100644 --- a/modules/local/easypqp/library/main.nf +++ b/modules/local/easypqp/library/main.nf @@ -12,7 +12,7 @@ process EASYPQP_LIBRARY { output: tuple val(meta), path("*.tsv") , emit: tsv - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('easypqp'), eval("easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\\d+\\.\\d+\\.\\d+'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -30,11 +30,6 @@ process EASYPQP_LIBRARY { --out ${prefix}_speclib.tsv \ $args \ $psmpkl $peakpkl - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - easypqp: \$(easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\\d+\\.\\d+\\.\\d+') - END_VERSIONS """ stub: @@ -46,10 +41,5 @@ process EASYPQP_LIBRARY { mkdir -p \$MPLCONFIGDIR \$XDG_CACHE_HOME touch "${prefix}_speclib.tsv" - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - easypqp: \$(easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\\d+\\.\\d+\\.\\d+') - END_VERSIONS """ } diff --git a/modules/local/epicore/main.nf b/modules/local/epicore/main.nf index a04efff9..664c993e 100644 --- a/modules/local/epicore/main.nf +++ b/modules/local/epicore/main.nf @@ -16,7 +16,7 @@ process EPICORE { path "${result_tsv}", emit: final_epicore_tsv path "epicore_length_distribution.html", emit: length_dist path "epicore_intensity_histogram.html", emit: intensity_hist - path "versions.yml", emit: versions + tuple val("${task.process}"), val('epicore'), eval("echo \$(epicore --version) | grep 'epicore' | cut -d ' ' -f3 | cut -c2-"), emit: versions, topic: versions script: def args = task.ext.args ?: '' @@ -32,11 +32,6 @@ process EPICORE { # Add epicore statistics to MultiQC general stats table wc -l < epitopes.csv | awk '{print \$1 - 1}' > epicores.txt awk 'NR==1 {print \$0 ",# Epicores"; next} NR==2 {getline extra < "epicores.txt"; print \$0 "," extra}' $general_stats > _modified_$general_stats - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - epicore: \$(echo \$(epicore --version) | grep 'epicore' | cut -d ' ' -f3 | cut -c2-) - END_VERSIONS """ stub: @@ -47,10 +42,5 @@ process EPICORE { touch ${prefix}.tsv touch epicore_length_distribution.html touch epicore_intensity_hist.html - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - epicore: \$(echo \$(epicore --version) | grep 'epicore' | cut -d ' ' -f3 | cut -c2-) - END_VERSIONS """ } diff --git a/modules/local/ms2rescore/main.nf b/modules/local/ms2rescore/main.nf index 06fcb72a..8adc1fc5 100644 --- a/modules/local/ms2rescore/main.nf +++ b/modules/local/ms2rescore/main.nf @@ -17,7 +17,7 @@ process MS2RESCORE { tuple val(meta), path("*ms2rescore.idXML") , emit: idxml tuple val(meta), path("*feature_names.tsv"), emit: feature_names tuple val(meta), path("*.html" ) , optional:true, emit: html - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('MS2Rescore'), eval("echo \"\$(ms2rescore --version 2>&1)\" | grep -oP 'MS²Rescore \\(v\\K[^\\)]+'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -33,11 +33,6 @@ process MS2RESCORE { --output_path ${prefix}.idXML \\ --processes $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - MS²Rescore: \$(echo \$(ms2rescore --version 2>&1) | grep -oP 'MS²Rescore \\(v\\K[^\\)]+' )) - END_VERSIONS """ stub: @@ -47,10 +42,5 @@ process MS2RESCORE { touch ${prefix}.idXML touch ${meta.id}_feature_names.tsv touch ${meta.id}.html - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - MS²Rescore: \$(echo \$(ms2rescore --version 2>&1) | grep -oP 'MS²Rescore \\(v\\K[^\\)]+' )) - END_VERSIONS """ } diff --git a/modules/local/openms/featurefinderidentification/main.nf b/modules/local/openms/featurefinderidentification/main.nf index 794455ec..1d003110 100644 --- a/modules/local/openms/featurefinderidentification/main.nf +++ b/modules/local/openms/featurefinderidentification/main.nf @@ -13,27 +13,23 @@ process OPENMS_FEATUREFINDERIDENTIFICATION { output: tuple val(meta), path("*.featureXML"), emit: featurexml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when script: def prefix = task.ext.prefix ?: "${meta.id}_${meta.sample}_${meta.condition}" - def args = task.ext.args ?: '' def quant_fdr = params.quantification_fdr ? "-id $id_int -id_ext $id_ext -svm:min_prob ${params.quantification_min_prob}" : "-id $id_ext" - args = args + " $quant_fdr" - + def args = quant_fdr + args = args + (task.ext.args ? " ${task.ext.args}" : '') + """ + # cache buster FeatureFinderIdentification -in $mzml \\ -out ${prefix}.featureXML \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -41,10 +37,5 @@ process OPENMS_FEATUREFINDERIDENTIFICATION { """ touch ${prefix}.featureXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openms/idconflictresolver/main.nf b/modules/local/openms/idconflictresolver/main.nf index 9228ee81..c49e57af 100644 --- a/modules/local/openms/idconflictresolver/main.nf +++ b/modules/local/openms/idconflictresolver/main.nf @@ -12,24 +12,19 @@ process OPENMS_IDCONFLICTRESOLVER { output: tuple val(meta), path("*.consensusXML"), emit: consensusxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when script: def prefix = task.ext.prefix ?: "${meta.id}_resolved" - + """ - IDConflictResolver \\ - -in $consensus \\ + # cache buster + IDConflictResolver -in $consensus \\ -out ${prefix}.consensusXML \\ -threads $task.cpus - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -37,10 +32,5 @@ process OPENMS_IDCONFLICTRESOLVER { """ touch ${prefix}.consensusXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openms/mapaligneridentification/main.nf b/modules/local/openms/mapaligneridentification/main.nf index fd19d5c3..a33b2600 100644 --- a/modules/local/openms/mapaligneridentification/main.nf +++ b/modules/local/openms/mapaligneridentification/main.nf @@ -12,7 +12,7 @@ process OPENMS_MAPALIGNERIDENTIFICATION { output: tuple val(meta), path("*.trafoXML"), emit: trafoxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -20,17 +20,12 @@ process OPENMS_MAPALIGNERIDENTIFICATION { script: def args = task.ext.args ?: '' def out_names = idxmls.collect { it.baseName.replace('_fdr_filtered','')+'.trafoXML' }.join(' ') - + """ - MapAlignerIdentification \\ - -in $idxmls \\ + # cache buster + MapAlignerIdentification -in $idxmls \\ -trafo_out ${out_names} \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -38,10 +33,5 @@ process OPENMS_MAPALIGNERIDENTIFICATION { """ touch test1.consensusXML touch test2.consensusXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openms/maprttransformer/main.nf b/modules/local/openms/maprttransformer/main.nf index a2889e35..0c3b2667 100644 --- a/modules/local/openms/maprttransformer/main.nf +++ b/modules/local/openms/maprttransformer/main.nf @@ -12,28 +12,21 @@ process OPENMS_MAPRTTRANSFORMER { output: tuple val(meta), path("*_aligned.*"), emit: aligned - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" def fileExt = alignment_file.collect { it.name.tokenize("\\.")[1] }.join(' ') """ - MapRTTransformer \\ - -in $alignment_file \\ + # cache buster + MapRTTransformer -in $alignment_file \\ -trafo_in $trafoxml \\ -out ${prefix}.${fileExt} \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -42,10 +35,5 @@ process OPENMS_MAPRTTRANSFORMER { """ touch ${prefix}.${fileExt} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openms/mztabexporter/main.nf b/modules/local/openms/mztabexporter/main.nf index ee5500b4..652441c5 100644 --- a/modules/local/openms/mztabexporter/main.nf +++ b/modules/local/openms/mztabexporter/main.nf @@ -12,7 +12,7 @@ process OPENMS_MZTABEXPORTER { output: tuple val(meta), path("*.mzTab"), emit: mztab - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -20,18 +20,13 @@ process OPENMS_MZTABEXPORTER { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - + """ - MzTabExporter \\ - -in $in_file \\ + # cache buster + MzTabExporter -in $in_file \\ -out ${prefix}.mzTab \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -39,10 +34,5 @@ process OPENMS_MZTABEXPORTER { """ touch ${prefix}.mzTab - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openms/psmfeatureextractor/main.nf b/modules/local/openms/psmfeatureextractor/main.nf index 870e6519..45ff9013 100644 --- a/modules/local/openms/psmfeatureextractor/main.nf +++ b/modules/local/openms/psmfeatureextractor/main.nf @@ -12,7 +12,7 @@ process OPENMS_PSMFEATUREEXTRACTOR { output: tuple val(meta), path("*.idXML"), emit: idxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -24,18 +24,13 @@ process OPENMS_PSMFEATUREEXTRACTOR { """ extra_features=\$(awk 'NR > 1 && \$1 !~ /psm_file/ {printf \"%s \", \$2}' ${feature_file}) - - PSMFeatureExtractor \\ - -in $idxml \\ + # cache buster + + PSMFeatureExtractor -in $idxml \\ -out ${prefix}.idXML \\ -threads $task.cpus \\ -extra \$extra_features \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -43,10 +38,5 @@ process OPENMS_PSMFEATUREEXTRACTOR { """ touch ${prefix}.idXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openms/textexporter/main.nf b/modules/local/openms/textexporter/main.nf index 46dd8f33..f1ee3084 100644 --- a/modules/local/openms/textexporter/main.nf +++ b/modules/local/openms/textexporter/main.nf @@ -12,7 +12,7 @@ process OPENMS_TEXTEXPORTER { output: tuple val(meta), path("*.tsv"), emit: tsv - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -20,20 +20,15 @@ process OPENMS_TEXTEXPORTER { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - + """ - TextExporter \\ - -in $file \\ + # cache buster + TextExporter -in $file \\ -out ${prefix}_exported.tsv \\ -threads $task.cpus \\ -id:add_hit_metavalues 0 \\ -id:peptides_only \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -41,10 +36,5 @@ process OPENMS_TEXTEXPORTER { """ touch ${prefix}.tsv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf index 96ce7b37..25a32cbb 100644 --- a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf +++ b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf @@ -12,23 +12,18 @@ process OPENMS_FEATURELINKERUNLABELEDKD { output: tuple val(meta), path("*.consensusXML"), emit: consensusxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when - script: def prefix = task.ext.prefix ?: "${meta.id}_all_features_merged" """ - FeatureLinkerUnlabeledKD -in $features \\ + # cache buster + FeatureLinkerUnlabeledKD $features \\ -out ${prefix}.consensusXML \\ -threads $task.cpus - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms-thirdparty: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -36,10 +31,5 @@ process OPENMS_FEATURELINKERUNLABELEDKD { """ touch ${prefix}.consensusXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms-thirdparty: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openmsthirdparty/percolatoradapter/main.nf b/modules/local/openmsthirdparty/percolatoradapter/main.nf index 8199ce17..94a934ad 100644 --- a/modules/local/openmsthirdparty/percolatoradapter/main.nf +++ b/modules/local/openmsthirdparty/percolatoradapter/main.nf @@ -13,7 +13,8 @@ process OPENMS_PERCOLATORADAPTER { output: tuple val(meta), path("*.idXML") , emit: idxml tuple val(meta), path("*_percolator_feature_weights.tsv"), emit: feature_weights, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('PercolatorAdapter'), eval("PercolatorAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1"), emit: versions, topic: versions + tuple val("${task.process}"), val('percolator'), eval("percolator -h 2>&1 | grep -E '^Percolator version(.*)' | sed 's/Percolator version //g'"), emit: versions_1, topic: versions when: task.ext.when == null || task.ext.when @@ -28,12 +29,6 @@ process OPENMS_PERCOLATORADAPTER { -out ${prefix}.idXML \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - PercolatorAdapter: \$(PercolatorAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1) - percolator: \$(percolator -h 2>&1 | grep -E '^Percolator version(.*)' | sed 's/Percolator version //g') - END_VERSIONS """ stub: @@ -41,11 +36,5 @@ process OPENMS_PERCOLATORADAPTER { """ touch ${prefix}.idXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - PercolatorAdapter: \$(PercolatorAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1) - percolator: \$(percolator -h 2>&1 | grep -E '^Percolator version(.*)' | sed 's/Percolator version //g') - END_VERSIONS """ } diff --git a/modules/local/pyopenms/chromatogramextractor/main.nf b/modules/local/pyopenms/chromatogramextractor/main.nf index 33f138e0..038177ab 100644 --- a/modules/local/pyopenms/chromatogramextractor/main.nf +++ b/modules/local/pyopenms/chromatogramextractor/main.nf @@ -12,7 +12,7 @@ process PYOPENMS_CHROMATOGRAMEXTRACTOR { output: tuple val(meta), path("*.csv") , emit: csv - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('pyopenms'), eval("pip show pyopenms | grep Version | sed 's/Version: //'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -25,11 +25,6 @@ process PYOPENMS_CHROMATOGRAMEXTRACTOR { chromatogram_extractor.py \\ -in $mzml \\ -out ${prefix}_chrom.csv \\ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - pyopenms: \$(pip show pyopenms | grep Version | sed 's/Version: //') - END_VERSIONS """ stub: @@ -37,10 +32,5 @@ process PYOPENMS_CHROMATOGRAMEXTRACTOR { """ touch ${prefix}_chrom.csv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - pyopenms: \$(pip show pyopenms | grep Version | sed 's/Version: //') - END_VERSIONS """ } diff --git a/modules/local/pyopenms/ionannotator/main.nf b/modules/local/pyopenms/ionannotator/main.nf index cb5f06a6..e58c6ce1 100644 --- a/modules/local/pyopenms/ionannotator/main.nf +++ b/modules/local/pyopenms/ionannotator/main.nf @@ -12,7 +12,7 @@ process PYOPENMS_IONANNOTATOR { output: tuple val(meta), path("*.tsv") , emit: tsv - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('pyopenms'), eval("pip show pyopenms | grep Version | sed 's/Version: //'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -35,12 +35,6 @@ process PYOPENMS_IONANNOTATOR { $zions \\ $aions \\ $cions - - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - pyopenms: \$(pip show pyopenms | grep Version | sed 's/Version: //') - END_VERSIONS """ stub: @@ -49,10 +43,5 @@ process PYOPENMS_IONANNOTATOR { """ touch ${prefix}_all_peaks.tsv touch ${prefix}_matching_ions.tsv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - pyopenms: \$(pip show pyopenms | grep Version | sed 's/Version: //') - END_VERSIONS """ } diff --git a/modules/local/pyopenms/summarize_results/main.nf b/modules/local/pyopenms/summarize_results/main.nf index e92edd38..c26a416c 100644 --- a/modules/local/pyopenms/summarize_results/main.nf +++ b/modules/local/pyopenms/summarize_results/main.nf @@ -16,7 +16,7 @@ process SUMMARIZE_RESULTS { path '*_peptide_length.csv' , emit: lengths, optional: true path '*_peptide_intensity.csv' , emit: intensities, optional: true tuple val(meta), path('*.tsv'), path('*_general_stats.csv') , emit: epicore_input - path 'versions.yml' , emit: versions + tuple val("${task.process}"), val('pyopenms'), eval("pip show pyopenms | grep Version | sed 's/Version: //'"), emit: versions, topic: versions script: def args = task.ext.args ?: '' @@ -29,11 +29,6 @@ process SUMMARIZE_RESULTS { --out_prefix $prefix \\ $quantify \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - pyopenms: \$(pip show pyopenms | grep Version | sed 's/Version: //') - END_VERSIONS """ stub: @@ -48,10 +43,5 @@ process SUMMARIZE_RESULTS { touch ${prefix}_peptide_intensity.csv touch ${prefix}_general_stats.csv touch ${prefix}.tsv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - pyopenms: \$(pip show pyopenms | grep Version | sed 's/Version: //') - END_VERSIONS """ } diff --git a/modules/local/tdf2mzml/main.nf b/modules/local/tdf2mzml/main.nf index b900b81a..482545a9 100644 --- a/modules/local/tdf2mzml/main.nf +++ b/modules/local/tdf2mzml/main.nf @@ -8,19 +8,14 @@ process TDF2MZML { output: tuple val(meta), path("*.mzML"), emit: mzml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('python'), eval("python3 --version | cut -d ' ' -f2"), emit: versions, topic: versions + tuple val("${task.process}"), val('tdf2mzml'), eval("echo 0.3.0"), emit: versions_1, topic: versions script: def prefix = task.ext.prefix ?: "${tdf.simpleName}" """ tdf2mzml.py -i $tdf -o ${prefix}.mzML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - python: \$(python3 --version | cut -d ' ' -f2) - tdf2mzml: \$(echo 0.3.0) - END_VERSIONS """ stub: @@ -28,11 +23,5 @@ process TDF2MZML { """ touch ${prefix}.mzML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - python: \$(python3 --version | cut -d ' ' -f2) - tdf2mzml: \$(echo 0.3.0) - END_VERSIONS """ } diff --git a/modules/local/untar/main.nf b/modules/local/untar/main.nf index 35c364b1..649af575 100644 --- a/modules/local/untar/main.nf +++ b/modules/local/untar/main.nf @@ -12,7 +12,7 @@ process UNTAR { output: tuple val(meta), path("*.d"), emit: untar - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('untar'), eval("echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -33,11 +33,6 @@ process UNTAR { $archive \\ --strip-components=\$depth \\ $args2 - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') - END_VERSIONS """ stub: @@ -46,10 +41,5 @@ process UNTAR { """ mkdir $prefix touch ${prefix}/file.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') - END_VERSIONS """ } diff --git a/modules/local/unzip/main.nf b/modules/local/unzip/main.nf index 5405ef0f..3c5e5110 100644 --- a/modules/local/unzip/main.nf +++ b/modules/local/unzip/main.nf @@ -12,7 +12,7 @@ process UNZIP { output: tuple val(meta), path("*.d"), emit: unzipped_archive - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('7za'), eval("echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -28,11 +28,6 @@ process UNZIP { -o"." \\ $args \\ $archive - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - 7za: \$(echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//') - END_VERSIONS """ stub: @@ -40,10 +35,5 @@ process UNZIP { """ touch ${prefix}.d - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - 7za: \$(echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//') - END_VERSIONS """ } diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index d02016a0..009874d4 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.32 + - bioconda::multiqc=1.33 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index c1158fb0..3b0e975b 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,11 +3,11 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb/data' : - 'community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/34/34e733a9ae16a27e80fe00f863ea1479c96416017f24a907996126283e7ecd4d/data' : + 'community.wave.seqera.io/library/multiqc:1.33--ee7739d47738383b' }" input: - path multiqc_files, stageAs: "?/*" + path multiqc_files, stageAs: "?/*" path(multiqc_config) path(extra_multiqc_config) path(multiqc_logo) @@ -15,10 +15,11 @@ process MULTIQC { path(sample_names) output: - path "*multiqc_report.html", emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - path "versions.yml" , emit: versions + path "*.html" , emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + tuple val("${task.process}"), val('multiqc'), eval('multiqc --version | sed "s/.* //g"'), emit: versions + // MultiQC should not push its versions to the `versions` topic. Its input depends on the versions topic to be resolved thus outputting to the topic will let the pipeline hang forever when: task.ext.when == null || task.ext.when @@ -26,38 +27,29 @@ process MULTIQC { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ? "--filename ${task.ext.prefix}.html" : '' - def config = multiqc_config ? "--config $multiqc_config" : '' - def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' + 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}\"'" : '' def replace = replace_names ? "--replace-names ${replace_names}" : '' def samples = sample_names ? "--sample-names ${sample_names}" : '' """ multiqc \\ --force \\ - $args \\ - $config \\ - $prefix \\ - $extra_config \\ - $logo \\ - $replace \\ - $samples \\ + ${args} \\ + ${config} \\ + ${prefix} \\ + ${extra_config} \\ + ${logo} \\ + ${replace} \\ + ${samples} \\ . - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS """ stub: """ mkdir multiqc_data + touch multiqc_data/.stub mkdir multiqc_plots touch multiqc_report.html - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS """ } diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index ce30eb73..f790cab0 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -57,10 +57,10 @@ input: - edam: http://edamontology.org/format_3475 # TSV output: report: - - "*multiqc_report.html": + - "*.html": type: file description: MultiQC report file - pattern: "multiqc_report.html" + pattern: ".html" ontologies: [] data: - "*_data": @@ -74,12 +74,15 @@ output: pattern: "*_data" ontologies: [] versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - multiqc: + type: string + description: The tool name + - multiqc --version | sed "s/.* //g": + type: eval + description: The expression to obtain the version of the tool authors: - "@abhi18av" - "@bunop" @@ -90,3 +93,27 @@ maintainers: - "@bunop" - "@drpatelh" - "@jfy133" +containers: + conda: + linux_amd64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-d58f60e4deb769bf_1/condalock + linux_arm64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-193776baee4194db_1/condalock + docker: + linux_amd64: + build_id: bd-d58f60e4deb769bf_1 + name: community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf + scanId: sc-d76ac07493e940b4_6 + linux_arm64: + build_id: bd-193776baee4194db_1 + name: community.wave.seqera.io/library/multiqc:1.32--193776baee4194db + scanId: sc-86caded0bff8246e_3 + singularity: + linux_amd64: + build_id: bd-e649ffa094d1ef4a_1 + name: oras://community.wave.seqera.io/library/multiqc:1.32--e649ffa094d1ef4a + https: https://community.wave.seqera.io/v2/library/multiqc/blobs/sha256:8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb + linux_arm64: + build_id: bd-aee0064f5570ef22_1 + name: oras://community.wave.seqera.io/library/multiqc:1.32--aee0064f5570ef22 + https: https://community.wave.seqera.io/v2/library/multiqc/blobs/sha256:f02c59ebf6e9a00aa954ee8188a4ecc5c743e18f40b9215a242f67606a00f9cf diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test index 33316a7d..d1ae8b06 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -30,7 +30,33 @@ nextflow_process { { assert process.success }, { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.versions).match("multiqc_versions_single") } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions")}).match() } + ) + } + + } + + test("sarscov2 single-end [fastqc] - custom prefix") { + config "./custom_prefix.config" + + when { + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) + input[1] = [] + input[2] = [] + input[3] = [] + input[4] = [] + input[5] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.report[0] ==~ ".*/custom_prefix.html" }, + { assert process.out.data[0] ==~ ".*/custom_prefix_data" } ) } @@ -56,7 +82,7 @@ nextflow_process { { assert process.success }, { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.versions).match("multiqc_versions_config") } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions")}).match() } ) } } @@ -84,7 +110,7 @@ nextflow_process { { assert snapshot(process.out.report.collect { file(it).getName() } + process.out.data.collect { file(it).getName() } + process.out.plots.collect { file(it).getName() } + - process.out.versions ).match("multiqc_stub") } + process.out.findAll { key, val -> key.startsWith("versions")} ).match() } ) } diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index f5af2416..d72d35b7 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -1,41 +1,61 @@ { - "multiqc_versions_single": { + "sarscov2 single-end [fastqc]": { "content": [ - [ - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" - ] + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ], "meta": { "nf-test": "0.9.3", - "nextflow": "24.10.4" + "nextflow": "25.10.2" }, - "timestamp": "2025-10-27T13:33:24.356715" + "timestamp": "2025-12-09T10:10:43.020315838" }, - "multiqc_stub": { + "sarscov2 single-end [fastqc] - stub": { "content": [ [ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ] ], "meta": { "nf-test": "0.9.3", - "nextflow": "24.10.4" + "nextflow": "25.10.2" }, - "timestamp": "2025-10-27T13:34:11.103619" + "timestamp": "2025-12-09T10:11:14.131950776" }, - "multiqc_versions_config": { + "sarscov2 single-end [fastqc] [config]": { "content": [ - [ - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" - ] + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ], "meta": { "nf-test": "0.9.3", - "nextflow": "24.10.4" + "nextflow": "25.10.2" }, - "timestamp": "2025-10-27T13:34:04.615233" + "timestamp": "2025-12-09T10:11:07.15692209" } -} +} \ No newline at end of file diff --git a/subworkflows/local/map_alignment/main.nf b/subworkflows/local/map_alignment/main.nf index 76725d0d..7ca36a31 100644 --- a/subworkflows/local/map_alignment/main.nf +++ b/subworkflows/local/map_alignment/main.nf @@ -18,7 +18,6 @@ workflow MAP_ALIGNMENT { // Compute group-wise alignment rt transformation OPENMS_MAPALIGNERIDENTIFICATION( ch_runs_to_be_aligned ) - ch_versions = ch_versions.mix(OPENMS_MAPALIGNERIDENTIFICATION.out.versions) // Join run specific trafoXMLs with meta information merge_meta_map @@ -32,7 +31,6 @@ workflow MAP_ALIGNMENT { // Align mzML files using trafoXMLs ch_trafos_mzmls = ch_mzml.join(ch_trafos) OPENMS_MAPRTTRANSFORMERMZML(ch_trafos_mzmls) - ch_versions = ch_versions.mix(OPENMS_MAPRTTRANSFORMERMZML.out.versions) // Align idXMLfiles using trafoXMLs ch_runs_to_be_aligned @@ -45,7 +43,6 @@ workflow MAP_ALIGNMENT { .set { ch_trafos_idxml } OPENMS_MAPRTTRANSFORMERIDXML(ch_trafos_idxml) - ch_versions = ch_versions.mix(OPENMS_MAPRTTRANSFORMERIDXML.out.versions) emit: versions = ch_versions diff --git a/subworkflows/local/prepare_spectra/main.nf b/subworkflows/local/prepare_spectra/main.nf index 6c199bf6..bd5502a9 100644 --- a/subworkflows/local/prepare_spectra/main.nf +++ b/subworkflows/local/prepare_spectra/main.nf @@ -40,10 +40,8 @@ workflow PREPARE_SPECTRA { // Decompress timsTOF archive for data conversion UNTAR(branched_ms_files.d_tar) - ch_versions = ch_versions.mix(UNTAR.out.versions) UNZIP(branched_ms_files.d_zip) - ch_versions = ch_versions.mix(UNZIP.out.versions) ch_tdf_files = branched_ms_files.d .mix(UNTAR.out.untar, @@ -51,7 +49,6 @@ workflow PREPARE_SPECTRA { // timsTOF data conversion TDF2MZML(ch_tdf_files) - ch_versions = ch_versions.mix(TDF2MZML.out.versions) // Gunzip mzML files GUNZIP(branched_ms_files.mzml_gz) diff --git a/subworkflows/local/process_feature/main.nf b/subworkflows/local/process_feature/main.nf index 8156a5f2..97897bbc 100644 --- a/subworkflows/local/process_feature/main.nf +++ b/subworkflows/local/process_feature/main.nf @@ -18,15 +18,13 @@ workflow PROCESS_FEATURE { .map { meta, featurexml -> [ groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), featurexml] } .groupTuple() .set { ch_features_grouped } - ch_versions = ch_versions.mix(OPENMS_FEATUREFINDERIDENTIFICATION.out.versions) + .set { ch_features_grouped } // Link extracted features OPENMS_FEATURELINKERUNLABELEDKD(ch_features_grouped) - ch_versions = ch_versions.mix(OPENMS_FEATURELINKERUNLABELEDKD.out.versions) // Resolve conflicting ids matching to the same feature OPENMS_IDCONFLICTRESOLVER(OPENMS_FEATURELINKERUNLABELEDKD.out.consensusxml) - ch_versions = ch_versions.mix(OPENMS_IDCONFLICTRESOLVER.out.versions) emit: // Define the information that is returned by this workflow diff --git a/subworkflows/local/quant/main.nf b/subworkflows/local/quant/main.nf index d9202d8d..89a8fbf2 100644 --- a/subworkflows/local/quant/main.nf +++ b/subworkflows/local/quant/main.nf @@ -92,7 +92,6 @@ workflow QUANT { ch_versions = ch_versions.mix(PROCESS_FEATURE.out.versions) OPENMS_MZTABEXPORTER(PROCESS_FEATURE.out.consensusxml) - ch_versions = ch_versions.mix(OPENMS_MZTABEXPORTER.out.versions) emit: consensusxml = PROCESS_FEATURE.out.consensusxml diff --git a/subworkflows/local/rescore/main.nf b/subworkflows/local/rescore/main.nf index 564a6b0c..2666a5ce 100644 --- a/subworkflows/local/rescore/main.nf +++ b/subworkflows/local/rescore/main.nf @@ -32,7 +32,6 @@ workflow RESCORE { // Compute features via ms2rescore MS2RESCORE(ch_merged_runs) - ch_versions = ch_versions.mix(MS2RESCORE.out.versions) if (params.rescoring_engine == 'mokapot') { log.warn "The rescoring engine is set to mokapot. This rescoring engine currently only supports psm-level-fdr via ms2rescore." @@ -52,11 +51,9 @@ workflow RESCORE { } else { // Extract PSM features for Percolator OPENMS_PSMFEATUREEXTRACTOR(MS2RESCORE.out.idxml.join(MS2RESCORE.out.feature_names)) - ch_versions = ch_versions.mix(OPENMS_PSMFEATUREEXTRACTOR.out.versions) // Run Percolator with local FDR OPENMS_PERCOLATORADAPTER(OPENMS_PSMFEATUREEXTRACTOR.out.idxml) - ch_versions = ch_versions.mix(OPENMS_PERCOLATORADAPTER.out.versions) ch_multiqc_files = ch_multiqc_files.mix(OPENMS_PERCOLATORADAPTER.out.feature_weights.map{ meta, feature_weights -> feature_weights }) ch_pout = OPENMS_PERCOLATORADAPTER.out.idxml diff --git a/subworkflows/local/speclib/main.nf b/subworkflows/local/speclib/main.nf index dad8aa0f..cce8741b 100644 --- a/subworkflows/local/speclib/main.nf +++ b/subworkflows/local/speclib/main.nf @@ -28,7 +28,6 @@ workflow SPECLIB { // Convert psms and spectra to pickle files EASYPQP_CONVERT(fdrfiltered_comet_idxml.join(mzml), unimod) - ch_versions = ch_versions.mix(EASYPQP_CONVERT.out.versions) EASYPQP_CONVERT.out.psmpkl .map { meta, psmpkl -> [groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), psmpkl] } @@ -41,7 +40,6 @@ workflow SPECLIB { // Generate spectrum library for each sample-condition pair EASYPQP_LIBRARY(ch_psmpkl.join(ch_peakpkl)) - ch_versions = ch_versions.mix(EASYPQP_LIBRARY.out.versions) // Generate spectrum library for all MSruns in the samplesheet if (params.global_fdr) { diff --git a/workflows/mhcquant.nf b/workflows/mhcquant.nf index d1bd58e0..1d663e90 100644 --- a/workflows/mhcquant.nf +++ b/workflows/mhcquant.nf @@ -62,7 +62,6 @@ workflow MHCQUANT { // Prepare spectra files (Decompress archives, convert to mzML, centroid if specified) PREPARE_SPECTRA(ch_samplesheet) - ch_versions = ch_versions.mix(PREPARE_SPECTRA.out.versions) // Decoy Database creation if (!params.skip_decoy_generation) { @@ -85,7 +84,6 @@ workflow MHCQUANT { // Compute MS1 TICs for QC PYOPENMS_CHROMATOGRAMEXTRACTOR(ch_clean_mzml_file) - ch_versions = ch_versions.mix(PYOPENMS_CHROMATOGRAMEXTRACTOR.out.versions) ch_multiqc_files = ch_multiqc_files.mix(PYOPENMS_CHROMATOGRAMEXTRACTOR.out.csv.map{ meta, mzml -> mzml }) // Prepare the comet input channel with global fasta or per-sample_condition fasta @@ -143,7 +141,6 @@ workflow MHCQUANT { // SUBWORKFLOW: RESCORE WITH MOKKAPOT OR PERCOLATOR AND FILTER BY Q-VALUE ON LOCAL/GLOBAL FDR // RESCORE( ch_rescore_in, ch_multiqc_files ) - ch_versions = ch_versions.mix(RESCORE.out.versions) ch_multiqc_files = ch_multiqc_files.mix(RESCORE.out.multiqc_files) // GENERATE SPECTRUM LIBRARY @@ -164,7 +161,6 @@ workflow MHCQUANT { // SUBWORKFLOW: SPECLIB // SPECLIB(ch_fdrfilter_comet_idxml_filtered, ch_clean_mzml_file) - ch_versions = ch_versions.mix(SPECLIB.out.versions) } // @@ -172,7 +168,6 @@ workflow MHCQUANT { // if (params.quantify) { QUANT(merge_meta_map, RESCORE.out.rescored_runs, RESCORE.out.fdr_filtered, ch_clean_mzml_file) - ch_versions = ch_versions.mix(QUANT.out.versions) ch_output = QUANT.out.consensusxml } else { ch_output = RESCORE.out.fdr_filtered @@ -188,12 +183,10 @@ workflow MHCQUANT { // Annotate spectra with ion fragmentation information PYOPENMS_IONANNOTATOR( ch_ion_annotator_input ) - ch_versions = ch_versions.mix(PYOPENMS_IONANNOTATOR.out.versions) } // Prepare for check if file is empty OPENMS_TEXTEXPORTER(ch_output) - ch_versions = ch_versions.mix(OPENMS_TEXTEXPORTER.out.versions) // Return an error message when there is only a header present in the document OPENMS_TEXTEXPORTER.out.tsv.map { meta, tsv -> if (tsv.size() < 130) { @@ -203,14 +196,12 @@ workflow MHCQUANT { // Process the tsv file to facilitate visualization with MultiQC SUMMARIZE_RESULTS(OPENMS_TEXTEXPORTER.out.tsv) - ch_versions = ch_versions.mix(SUMMARIZE_RESULTS.out.versions) // // EPICORE // if (params.epicore) { EPICORE(ch_fasta.map{ it.last()}, SUMMARIZE_RESULTS.out.epicore_input) - ch_versions = ch_versions.mix(EPICORE.out.versions) ch_multiqc_files = ch_multiqc_files.mix( EPICORE.out.length_dist, EPICORE.out.intensity_hist From ee4f371095771bdfcf830ce8be68f8bc8359d61c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 8 Jan 2026 15:00:46 +0000 Subject: [PATCH 004/104] Initial plan From 1caec35beefaf4d53aa6614c04431786fe6d8917 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 8 Jan 2026 15:05:48 +0000 Subject: [PATCH 005/104] Change all Channel. to channel. in Nextflow scripts Co-authored-by: jonasscheid <43858870+jonasscheid@users.noreply.github.com> --- modules/nf-core/gunzip/tests/main.nf.test | 8 ++++---- modules/nf-core/multiqc/tests/main.nf.test | 8 ++++---- modules/nf-core/openms/filefilter/tests/main.nf.test | 2 +- modules/nf-core/openms/idmassaccuracy/tests/main.nf.test | 4 ++-- modules/nf-core/openms/idmerger/tests/main.nf.test | 4 ++-- modules/nf-core/openms/idripper/tests/main.nf.test | 2 +- modules/nf-core/openms/peptideindexer/tests/main.nf.test | 6 +++--- .../openmsthirdparty/cometadapter/tests/main.nf.test | 4 ++-- subworkflows/local/map_alignment/main.nf | 2 +- subworkflows/local/prepare_spectra/main.nf | 2 +- subworkflows/local/process_feature/main.nf | 2 +- subworkflows/local/quant/main.nf | 2 +- subworkflows/local/rescore/main.nf | 2 +- subworkflows/local/speclib/main.nf | 2 +- subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf | 2 +- workflows/mhcquant.nf | 6 +++--- 16 files changed, 29 insertions(+), 29 deletions(-) diff --git a/modules/nf-core/gunzip/tests/main.nf.test b/modules/nf-core/gunzip/tests/main.nf.test index 776211ad..dd4f643f 100644 --- a/modules/nf-core/gunzip/tests/main.nf.test +++ b/modules/nf-core/gunzip/tests/main.nf.test @@ -15,7 +15,7 @@ nextflow_process { } process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] @@ -43,7 +43,7 @@ nextflow_process { } process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id: 'test' ], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] @@ -71,7 +71,7 @@ nextflow_process { } process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] @@ -100,7 +100,7 @@ nextflow_process { } process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id: 'test' ], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test index 33316a7d..2e56ff33 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -15,7 +15,7 @@ nextflow_process { when { process { """ - input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) + input[0] = channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) input[1] = [] input[2] = [] input[3] = [] @@ -41,8 +41,8 @@ nextflow_process { when { process { """ - input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_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[0] = channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_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] = [] input[4] = [] @@ -68,7 +68,7 @@ nextflow_process { when { process { """ - input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) + input[0] = channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) input[1] = [] input[2] = [] input[3] = [] diff --git a/modules/nf-core/openms/filefilter/tests/main.nf.test b/modules/nf-core/openms/filefilter/tests/main.nf.test index fb8334d1..a19a6d88 100644 --- a/modules/nf-core/openms/filefilter/tests/main.nf.test +++ b/modules/nf-core/openms/filefilter/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { script "../../../thermorawfileparser/main.nf" process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/msspectra/PXD012083_e005640_II.raw', checkIfExists: true) ]) diff --git a/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test b/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test index b267fe15..5f5d5e9d 100644 --- a/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test +++ b/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test @@ -18,7 +18,7 @@ nextflow_process { script "../../../thermorawfileparser/main.nf" process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/msspectra/PXD012083_e005640_II.raw', checkIfExists: true) ]) @@ -29,7 +29,7 @@ nextflow_process { script "../../../openms/decoydatabase/main.nf" process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/database/UP000005640_9606.fasta', checkIfExists: true) ]) diff --git a/modules/nf-core/openms/idmerger/tests/main.nf.test b/modules/nf-core/openms/idmerger/tests/main.nf.test index 8945e091..2f1c3b21 100644 --- a/modules/nf-core/openms/idmerger/tests/main.nf.test +++ b/modules/nf-core/openms/idmerger/tests/main.nf.test @@ -14,7 +14,7 @@ nextflow_process { when { process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test'], // meta map [ file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true), file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep2_small.idXML', checkIfExists: true)] @@ -45,7 +45,7 @@ nextflow_process { when { process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test'], // meta map [ file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true), file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep2_small.idXML', checkIfExists: true)] diff --git a/modules/nf-core/openms/idripper/tests/main.nf.test b/modules/nf-core/openms/idripper/tests/main.nf.test index 1e9b40d7..1f252316 100644 --- a/modules/nf-core/openms/idripper/tests/main.nf.test +++ b/modules/nf-core/openms/idripper/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { script "../../idmerger/main.nf" process { """ - input[0] = Channel.fromList([ + input[0] = channel.fromList([ tuple([id:'test'], [ file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true), diff --git a/modules/nf-core/openms/peptideindexer/tests/main.nf.test b/modules/nf-core/openms/peptideindexer/tests/main.nf.test index ecc2b005..c4533b2e 100644 --- a/modules/nf-core/openms/peptideindexer/tests/main.nf.test +++ b/modules/nf-core/openms/peptideindexer/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { script "../../decoydatabase/main.nf" process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/database/UP000005640_9606.fasta', checkIfExists: true) ]) @@ -30,7 +30,7 @@ nextflow_process { when { process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [id:'test'], file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true) ]).join(OPENMS_DECOYDATABASE.out.decoy_fasta) @@ -53,7 +53,7 @@ nextflow_process { when { process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [id:'test'], file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true) ]).join(OPENMS_DECOYDATABASE.out.decoy_fasta) diff --git a/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test b/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test index cf1a0bcd..a94b41e9 100644 --- a/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test +++ b/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test @@ -18,7 +18,7 @@ nextflow_process { script "../../../thermorawfileparser/main.nf" process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/msspectra/PXD012083_e005640_II.raw', checkIfExists: true) ]) @@ -30,7 +30,7 @@ nextflow_process { script "../../../openms/decoydatabase/main.nf" process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/database/UP000005640_9606.fasta', checkIfExists: true) ]) diff --git a/subworkflows/local/map_alignment/main.nf b/subworkflows/local/map_alignment/main.nf index 76725d0d..2d500b25 100644 --- a/subworkflows/local/map_alignment/main.nf +++ b/subworkflows/local/map_alignment/main.nf @@ -14,7 +14,7 @@ workflow MAP_ALIGNMENT { merge_meta_map main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // Compute group-wise alignment rt transformation OPENMS_MAPALIGNERIDENTIFICATION( ch_runs_to_be_aligned ) diff --git a/subworkflows/local/prepare_spectra/main.nf b/subworkflows/local/prepare_spectra/main.nf index 6c199bf6..751778fa 100644 --- a/subworkflows/local/prepare_spectra/main.nf +++ b/subworkflows/local/prepare_spectra/main.nf @@ -14,7 +14,7 @@ workflow PREPARE_SPECTRA { ch_samplesheet main: - ch_versions = Channel.empty() + ch_versions = channel.empty() ch_samplesheet .branch { diff --git a/subworkflows/local/process_feature/main.nf b/subworkflows/local/process_feature/main.nf index 8156a5f2..e0ed26fa 100644 --- a/subworkflows/local/process_feature/main.nf +++ b/subworkflows/local/process_feature/main.nf @@ -11,7 +11,7 @@ workflow PROCESS_FEATURE { ch_runs_to_be_quantified main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // Quantify identifications using targeted feature extraction OPENMS_FEATUREFINDERIDENTIFICATION(ch_runs_to_be_quantified).featurexml diff --git a/subworkflows/local/quant/main.nf b/subworkflows/local/quant/main.nf index d9202d8d..544e20ce 100644 --- a/subworkflows/local/quant/main.nf +++ b/subworkflows/local/quant/main.nf @@ -25,7 +25,7 @@ workflow QUANT { mzml main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // Split post-percolator idXML files and manipulate such that we end up with [meta_run1, idxml_run1] [meta_run2, idxml_run2] ... // We need to make sure that the order of the runs is the same as in the mzml files since IDRipper always sorts the runs // (and nextflow does not guarantee the order of the maps in merged_meta_map) diff --git a/subworkflows/local/rescore/main.nf b/subworkflows/local/rescore/main.nf index 564a6b0c..ff41171b 100644 --- a/subworkflows/local/rescore/main.nf +++ b/subworkflows/local/rescore/main.nf @@ -28,7 +28,7 @@ workflow RESCORE { ch_multiqc_files main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // Compute features via ms2rescore MS2RESCORE(ch_merged_runs) diff --git a/subworkflows/local/speclib/main.nf b/subworkflows/local/speclib/main.nf index dad8aa0f..50ea5faa 100644 --- a/subworkflows/local/speclib/main.nf +++ b/subworkflows/local/speclib/main.nf @@ -21,7 +21,7 @@ workflow SPECLIB { mzml main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // Load unimod tables (Future:) unimod = file("$projectDir/assets/250120_unimod_tables.xml", checkIfExists: true) diff --git a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf index ada8bd4d..f84971c6 100644 --- a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf @@ -114,7 +114,7 @@ workflow PIPELINE_INITIALISATION { // if (params.fasta) { - Channel.fromPath(params.fasta, checkIfExists: true) + channel.fromPath(params.fasta, checkIfExists: true) .map { fasta -> [[id:fasta.getBaseName()], fasta] } .set { ch_fasta } diff --git a/workflows/mhcquant.nf b/workflows/mhcquant.nf index d1bd58e0..0d01f59b 100644 --- a/workflows/mhcquant.nf +++ b/workflows/mhcquant.nf @@ -57,8 +57,8 @@ workflow MHCQUANT { ch_fasta // channel: reference database read in from --fasta main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() // Prepare spectra files (Decompress archives, convert to mzML, centroid if specified) PREPARE_SPECTRA(ch_samplesheet) @@ -233,7 +233,7 @@ workflow MHCQUANT { // // Collate and save software versions // - def topic_versions = Channel.topic("versions") + def topic_versions = channel.topic("versions") .distinct() .branch { entry -> versions_file: entry instanceof Path From 38b88819ba32e4ef0678664d350a0155c964cc4a Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Thu, 8 Jan 2026 17:19:06 +0100 Subject: [PATCH 006/104] Remove duplicate entry for .nf-test in .prettierignore --- .prettierignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.prettierignore b/.prettierignore index b287a6a9..dd749d43 100644 --- a/.prettierignore +++ b/.prettierignore @@ -12,6 +12,5 @@ testing* bin/ .nf-test/ ro-crate-metadata.json -.nf-test/ modules/nf-core/ subworkflows/nf-core/ From 3ceb970e356179dacca9ed6b954e71f33abeb338 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 8 Jan 2026 16:28:32 +0000 Subject: [PATCH 007/104] migrate nf-core modules,subworkflows to topic channels --- modules/local/openms/maprttransformer/main.nf | 2 ++ .../featurelinkerunlabeledkd/main.nf | 3 ++- modules/nf-core/gunzip/main.nf | 11 +---------- modules/nf-core/openms/decoydatabase/main.nf | 13 +------------ modules/nf-core/openms/filefilter/main.nf | 12 +----------- modules/nf-core/openms/idfilter/main.nf | 14 ++------------ modules/nf-core/openms/idmassaccuracy/main.nf | 12 +----------- modules/nf-core/openms/idmerger/main.nf | 12 +----------- modules/nf-core/openms/idripper/main.nf | 12 +----------- modules/nf-core/openms/idscoreswitcher/main.nf | 12 +----------- modules/nf-core/openms/peakpickerhires/main.nf | 12 +----------- modules/nf-core/openms/peptideindexer/main.nf | 12 +----------- .../nf-core/openmsthirdparty/cometadapter/main.nf | 15 +-------------- modules/nf-core/thermorawfileparser/main.nf | 12 +----------- subworkflows/local/prepare_spectra/main.nf | 6 +++--- subworkflows/local/process_feature/main.nf | 1 - subworkflows/local/quant/main.nf | 8 ++++---- subworkflows/local/rescore/main.nf | 8 ++++---- workflows/mhcquant.nf | 13 +++++++------ 19 files changed, 35 insertions(+), 155 deletions(-) diff --git a/modules/local/openms/maprttransformer/main.nf b/modules/local/openms/maprttransformer/main.nf index 0c3b2667..eb7904e0 100644 --- a/modules/local/openms/maprttransformer/main.nf +++ b/modules/local/openms/maprttransformer/main.nf @@ -18,6 +18,8 @@ process OPENMS_MAPRTTRANSFORMER { task.ext.when == null || task.ext.when script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}_aligned" def fileExt = alignment_file.collect { it.name.tokenize("\\.")[1] }.join(' ') """ diff --git a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf index 25a32cbb..edaedd3e 100644 --- a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf +++ b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf @@ -17,11 +17,12 @@ process OPENMS_FEATURELINKERUNLABELEDKD { when: task.ext.when == null || task.ext.when + script: def prefix = task.ext.prefix ?: "${meta.id}_all_features_merged" """ # cache buster - FeatureLinkerUnlabeledKD $features \\ + FeatureLinkerUnlabeledKD -in $features \\ -out ${prefix}.consensusXML \\ -threads $task.cpus """ diff --git a/modules/nf-core/gunzip/main.nf b/modules/nf-core/gunzip/main.nf index 3ffc8e92..df91c841 100644 --- a/modules/nf-core/gunzip/main.nf +++ b/modules/nf-core/gunzip/main.nf @@ -12,7 +12,7 @@ process GUNZIP { output: tuple val(meta), path("${gunzip}"), emit: gunzip - path "versions.yml", emit: versions + tuple val("${task.process}"), val('gunzip'), eval("echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -32,11 +32,6 @@ process GUNZIP { ${args} \\ ${archive} \\ > ${gunzip} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gunzip: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') - END_VERSIONS """ stub: @@ -47,9 +42,5 @@ process GUNZIP { gunzip = prefix + ".${extension}" """ touch ${gunzip} - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gunzip: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/decoydatabase/main.nf b/modules/nf-core/openms/decoydatabase/main.nf index 42494818..b9ce0fbe 100644 --- a/modules/nf-core/openms/decoydatabase/main.nf +++ b/modules/nf-core/openms/decoydatabase/main.nf @@ -12,7 +12,7 @@ process OPENMS_DECOYDATABASE { output: tuple val(meta), path("*.fasta"), emit: decoy_fasta - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -27,12 +27,6 @@ process OPENMS_DECOYDATABASE { -out ${prefix}.fasta \\ -threads $task.cpus \\ $args - - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -41,10 +35,5 @@ process OPENMS_DECOYDATABASE { """ touch ${prefix}.fasta - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/filefilter/main.nf b/modules/nf-core/openms/filefilter/main.nf index 55788339..fa1668fc 100644 --- a/modules/nf-core/openms/filefilter/main.nf +++ b/modules/nf-core/openms/filefilter/main.nf @@ -14,7 +14,7 @@ process OPENMS_FILEFILTER { tuple val(meta), path("*.mzML"), emit: mzml, optional: true tuple val(meta), path("*.featureXML"), emit: featurexml, optional: true tuple val(meta), path("*.consensusXML"), emit: consensusxml, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -31,11 +31,6 @@ process OPENMS_FILEFILTER { -out ${prefix}.${suffix} \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -46,10 +41,5 @@ process OPENMS_FILEFILTER { """ touch ${prefix}.${suffix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/idfilter/main.nf b/modules/nf-core/openms/idfilter/main.nf index c15927bf..708307c0 100644 --- a/modules/nf-core/openms/idfilter/main.nf +++ b/modules/nf-core/openms/idfilter/main.nf @@ -12,7 +12,7 @@ process OPENMS_IDFILTER { output: tuple val(meta), path("*.{idXML,consensusXML}"), emit: filtered - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -31,12 +31,7 @@ process OPENMS_IDFILTER { -out ${prefix}.${suffix} \\ -threads $task.cpus \\ $filter \\ - $args \\ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS + $args """ stub: @@ -50,10 +45,5 @@ process OPENMS_IDFILTER { """ touch ${prefix}.${suffix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/idmassaccuracy/main.nf b/modules/nf-core/openms/idmassaccuracy/main.nf index 819720e2..0681931f 100644 --- a/modules/nf-core/openms/idmassaccuracy/main.nf +++ b/modules/nf-core/openms/idmassaccuracy/main.nf @@ -13,7 +13,7 @@ process OPENMS_IDMASSACCURACY { output: tuple val(meta), path("*frag_mass_err.tsv") , emit: frag_err tuple val(meta), path("*prec_mass_err.tsv") , emit: prec_err, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -29,11 +29,6 @@ process OPENMS_IDMASSACCURACY { -out_fragment ${prefix}_frag_mass_err.tsv \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - OpenMS: \$(FileInfo 2>&1 | grep -E '^Version(.*)' | cut -d ' ' -f 2 | cut -d '-' -f 1) - END_VERSIONS """ stub: @@ -43,10 +38,5 @@ process OPENMS_IDMASSACCURACY { """ touch ${prefix}_frag_mass_err.tsv touch ${prefix}_prec_mass_err.tsv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - OpenMS: \$(FileInfo 2>&1 | grep -E '^Version(.*)' | cut -d ' ' -f 2 | cut -d '-' -f 1) - END_VERSIONS """ } diff --git a/modules/nf-core/openms/idmerger/main.nf b/modules/nf-core/openms/idmerger/main.nf index 421a77f8..22b98df5 100644 --- a/modules/nf-core/openms/idmerger/main.nf +++ b/modules/nf-core/openms/idmerger/main.nf @@ -12,7 +12,7 @@ process OPENMS_IDMERGER { output: tuple val(meta), path("*.idXML"), emit: idxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -27,11 +27,6 @@ process OPENMS_IDMERGER { -out ${prefix}.idXML \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -40,10 +35,5 @@ process OPENMS_IDMERGER { """ touch ${prefix}.idXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/idripper/main.nf b/modules/nf-core/openms/idripper/main.nf index e545b906..42aa71d1 100644 --- a/modules/nf-core/openms/idripper/main.nf +++ b/modules/nf-core/openms/idripper/main.nf @@ -12,7 +12,7 @@ process OPENMS_IDRIPPER { output: tuple val(meta), path("*.idXML"), emit: idxmls - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -27,11 +27,6 @@ process OPENMS_IDRIPPER { -out . \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -41,10 +36,5 @@ process OPENMS_IDRIPPER { """ touch ${prefix}_1.idXML touch ${prefix}_2.idXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/idscoreswitcher/main.nf b/modules/nf-core/openms/idscoreswitcher/main.nf index 6911b2c5..cded386f 100644 --- a/modules/nf-core/openms/idscoreswitcher/main.nf +++ b/modules/nf-core/openms/idscoreswitcher/main.nf @@ -12,7 +12,7 @@ process OPENMS_IDSCORESWITCHER { output: tuple val(meta), path("*.idXML"), emit: idxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -28,11 +28,6 @@ process OPENMS_IDSCORESWITCHER { -out ${prefix}.idXML \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -42,10 +37,5 @@ process OPENMS_IDSCORESWITCHER { """ touch ${prefix}.idXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/peakpickerhires/main.nf b/modules/nf-core/openms/peakpickerhires/main.nf index 9ac6e935..dbcf4957 100644 --- a/modules/nf-core/openms/peakpickerhires/main.nf +++ b/modules/nf-core/openms/peakpickerhires/main.nf @@ -12,7 +12,7 @@ process OPENMS_PEAKPICKERHIRES { output: tuple val(meta), path("*.mzML"), emit: mzml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -27,11 +27,6 @@ process OPENMS_PEAKPICKERHIRES { -out ${prefix}.mzML \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -40,10 +35,5 @@ process OPENMS_PEAKPICKERHIRES { """ touch ${prefix}.mzML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/peptideindexer/main.nf b/modules/nf-core/openms/peptideindexer/main.nf index 1456a908..0864b0a6 100644 --- a/modules/nf-core/openms/peptideindexer/main.nf +++ b/modules/nf-core/openms/peptideindexer/main.nf @@ -12,7 +12,7 @@ process OPENMS_PEPTIDEINDEXER { output: tuple val(meta), path("*.idXML"), emit: indexed_idxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -30,11 +30,6 @@ process OPENMS_PEPTIDEINDEXER { -out ${prefix}.idXML \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -43,10 +38,5 @@ process OPENMS_PEPTIDEINDEXER { """ touch ${prefix}.idXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openmsthirdparty/cometadapter/main.nf b/modules/nf-core/openmsthirdparty/cometadapter/main.nf index 27fc32fd..6ce8e913 100644 --- a/modules/nf-core/openmsthirdparty/cometadapter/main.nf +++ b/modules/nf-core/openmsthirdparty/cometadapter/main.nf @@ -13,7 +13,7 @@ process OPENMSTHIRDPARTY_COMETADAPTER { output: tuple val(meta), path("*.idXML"), emit: idxml tuple val(meta), path("*.tsv") , emit: pin, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('CometAdapter'), eval("CometAdapter 2>&1 | grep -E '^Version' | sed 's/Version: //g' | cut -d ' ' -f 1 | cut -d '-' -f 1"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -29,13 +29,6 @@ process OPENMSTHIRDPARTY_COMETADAPTER { -out ${prefix}.idXML \\ -threads $task.cpus \\ $args - - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - CometAdapter: \$(CometAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1 | cut -d '-' -f 1) - Comet: \$(comet 2>&1 | grep -E "Comet version.*" | sed 's/Comet version //g' | sed 's/"//g') - END_VERSIONS """ stub: @@ -45,11 +38,5 @@ process OPENMSTHIRDPARTY_COMETADAPTER { """ touch ${prefix}.idXML touch ${prefix}_pin.tsv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - CometAdapter: \$(CometAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1 | cut -d '-' -f 1) - Comet: \$(comet 2>&1 | grep -E "Comet version.*" | sed 's/Comet version //g' | sed 's/"//g') - END_VERSIONS """ } diff --git a/modules/nf-core/thermorawfileparser/main.nf b/modules/nf-core/thermorawfileparser/main.nf index 4f407e97..03f7c42d 100644 --- a/modules/nf-core/thermorawfileparser/main.nf +++ b/modules/nf-core/thermorawfileparser/main.nf @@ -12,7 +12,7 @@ process THERMORAWFILEPARSER { output: tuple val(meta), path("*.{mzML,mzML.gz,mgf,mgf.gz,parquet,parquet.gz}"), emit: spectra - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('thermorawfileparser'), eval("ThermoRawFileParser.sh --version"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when @@ -32,11 +32,6 @@ process THERMORAWFILEPARSER { -i $raw \\ -b ${prefix}.${suffix} \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - thermorawfileparser: \$(ThermoRawFileParser.sh --version) - END_VERSIONS """ stub: @@ -51,10 +46,5 @@ process THERMORAWFILEPARSER { """ touch ${prefix}.${suffix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - thermorawfileparser: \$(ThermoRawFileParser.sh --version) - END_VERSIONS """ } diff --git a/subworkflows/local/prepare_spectra/main.nf b/subworkflows/local/prepare_spectra/main.nf index bd5502a9..8079904a 100644 --- a/subworkflows/local/prepare_spectra/main.nf +++ b/subworkflows/local/prepare_spectra/main.nf @@ -36,7 +36,7 @@ workflow PREPARE_SPECTRA { // Raw file conversion THERMORAWFILEPARSER(branched_ms_files.raw) - ch_versions = ch_versions.mix(THERMORAWFILEPARSER.out.versions) + // ch_versions = ch_versions.mix(THERMORAWFILEPARSER.out.versions) // Decompress timsTOF archive for data conversion UNTAR(branched_ms_files.d_tar) @@ -52,7 +52,7 @@ workflow PREPARE_SPECTRA { // Gunzip mzML files GUNZIP(branched_ms_files.mzml_gz) - ch_versions = ch_versions.mix(GUNZIP.out.versions) + // ch_versions = ch_versions.mix(GUNZIP.out.versions) // Initialize channel for ms files that do not need to be converted ch_ms_files = branched_ms_files.mzml .mix(GUNZIP.out.gunzip, @@ -62,7 +62,7 @@ workflow PREPARE_SPECTRA { // Optional: Run Peak Picking as Preprocessing if (params.run_centroidisation) { OPENMS_PEAKPICKERHIRES(ch_ms_files) - ch_versions = ch_versions.mix(OPENMS_PEAKPICKERHIRES.out.versions) + // ch_versions = ch_versions.mix(OPENMS_PEAKPICKERHIRES.out.versions) ch_mzml_file = OPENMS_PEAKPICKERHIRES.out.mzml } else { ch_mzml_file = ch_ms_files diff --git a/subworkflows/local/process_feature/main.nf b/subworkflows/local/process_feature/main.nf index 97897bbc..b9459a2c 100644 --- a/subworkflows/local/process_feature/main.nf +++ b/subworkflows/local/process_feature/main.nf @@ -18,7 +18,6 @@ workflow PROCESS_FEATURE { .map { meta, featurexml -> [ groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), featurexml] } .groupTuple() .set { ch_features_grouped } - .set { ch_features_grouped } // Link extracted features OPENMS_FEATURELINKERUNLABELEDKD(ch_features_grouped) diff --git a/subworkflows/local/quant/main.nf b/subworkflows/local/quant/main.nf index 89a8fbf2..7c6824ed 100644 --- a/subworkflows/local/quant/main.nf +++ b/subworkflows/local/quant/main.nf @@ -38,12 +38,12 @@ workflow QUANT { .map { meta -> [[spectra:meta.spectra], meta]} ) .map { spectra, idxmls, meta -> [meta, idxmls] } .set { ch_ripped_idxml } - ch_versions = ch_versions.mix(OPENMS_IDRIPPER.out.versions) + // ch_versions = ch_versions.mix(OPENMS_IDRIPPER.out.versions) // Switch to xcorr for filtering since q-values are set to 1 with peptide-level-fdr if (params.fdr_level == 'peptide_level_fdrs'){ ch_runs_score_switched = OPENMS_IDSCORESWITCHER( ch_ripped_idxml ).idxml - ch_versions = ch_versions.mix(OPENMS_IDSCORESWITCHER.out.versions) + // ch_versions = ch_versions.mix(OPENMS_IDSCORESWITCHER.out.versions) } else { ch_runs_score_switched = ch_ripped_idxml } @@ -61,7 +61,7 @@ workflow QUANT { .map { meta, idxml -> [ groupKey([id:"${meta.sample}_${meta.condition}"], meta.group_count), idxml] } .groupTuple() .set { ch_runs_to_be_aligned } - ch_versions = ch_versions.mix(OPENMS_IDFILTER_QUANT.out.versions) + // ch_versions = ch_versions.mix(OPENMS_IDFILTER_QUANT.out.versions) // Align retention times of runs MAP_ALIGNMENT( @@ -75,7 +75,7 @@ workflow QUANT { OPENMS_IDMERGER_QUANT( MAP_ALIGNMENT.out.aligned_idxml .map { meta, aligned_idxml -> [ groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), aligned_idxml] } .groupTuple()) - ch_versions = ch_versions.mix(OPENMS_IDMERGER_QUANT.out.versions) + // ch_versions = ch_versions.mix(OPENMS_IDMERGER_QUANT.out.versions) // Manipulate channels such that we end up with : [meta, mzml, run_idxml, merged_runs_idxml] MAP_ALIGNMENT.out.aligned_mzml diff --git a/subworkflows/local/rescore/main.nf b/subworkflows/local/rescore/main.nf index 2666a5ce..aca93aff 100644 --- a/subworkflows/local/rescore/main.nf +++ b/subworkflows/local/rescore/main.nf @@ -40,12 +40,12 @@ workflow RESCORE { } // Switch comet e-value to mokapot q-value OPENMS_IDSCORESWITCHER(MS2RESCORE.out.idxml) - ch_versions = ch_versions.mix(OPENMS_IDSCORESWITCHER.out.versions) + // ch_versions = ch_versions.mix(OPENMS_IDSCORESWITCHER.out.versions) ch_rescored_runs = OPENMS_IDSCORESWITCHER.out.idxml // Filter by mokapot q-value OPENMS_IDFILTER_Q_VALUE(ch_rescored_runs.map {group_meta, idxml -> [group_meta, idxml, []]}) - ch_versions = ch_versions.mix(OPENMS_IDFILTER_Q_VALUE.out.versions) + // ch_versions = ch_versions.mix(OPENMS_IDFILTER_Q_VALUE.out.versions) ch_filter_q_value = OPENMS_IDFILTER_Q_VALUE.out.filtered } else { @@ -65,7 +65,7 @@ workflow RESCORE { ch_rescored_runs = OPENMS_PERCOLATORADAPTER_GLOBAL.out.idxml // Filter by global percolator q-value OPENMS_IDFILTER_Q_VALUE_GLOBAL(ch_rescored_runs.map {id, idxml -> [id, idxml, []]}) - ch_versions = ch_versions.mix(OPENMS_IDFILTER_Q_VALUE_GLOBAL.out.versions) + // ch_versions = ch_versions.mix(OPENMS_IDFILTER_Q_VALUE_GLOBAL.out.versions) // Backfilter sample_condition runs according to global FDR OPENMS_IDFILTER_GLOBAL(ch_pout.combine(OPENMS_IDFILTER_Q_VALUE_GLOBAL.out.filtered.map{ it[1] })) ch_filter_q_value = OPENMS_IDFILTER_GLOBAL.out.filtered @@ -76,7 +76,7 @@ workflow RESCORE { ch_rescored_runs = ch_pout // Filter by percolator q-value OPENMS_IDFILTER_Q_VALUE(ch_rescored_runs.map {group_meta, idxml -> [group_meta, idxml, []]}) - ch_versions = ch_versions.mix(OPENMS_IDFILTER_Q_VALUE.out.versions) + // ch_versions = ch_versions.mix(OPENMS_IDFILTER_Q_VALUE.out.versions) ch_filter_q_value = OPENMS_IDFILTER_Q_VALUE.out.filtered } } diff --git a/workflows/mhcquant.nf b/workflows/mhcquant.nf index 1d663e90..336a6ad1 100644 --- a/workflows/mhcquant.nf +++ b/workflows/mhcquant.nf @@ -63,11 +63,12 @@ workflow MHCQUANT { // Prepare spectra files (Decompress archives, convert to mzML, centroid if specified) PREPARE_SPECTRA(ch_samplesheet) + // Decoy Database creation // Decoy Database creation if (!params.skip_decoy_generation) { // Generate reversed decoy database OPENMS_DECOYDATABASE(ch_fasta) - ch_versions = ch_versions.mix(OPENMS_DECOYDATABASE.out.versions) + // ch_versions = ch_versions.mix(OPENMS_DECOYDATABASE.out.versions) ch_decoy_db = OPENMS_DECOYDATABASE.out.decoy_fasta } else { ch_decoy_db = ch_fasta @@ -76,7 +77,7 @@ workflow MHCQUANT { // Optionally clean up mzML files if (params.filter_mzml){ OPENMS_FILEFILTER(PREPARE_SPECTRA.out.mzml) - ch_versions = ch_versions.mix(OPENMS_FILEFILTER.out.versions) + // ch_versions = ch_versions.mix(OPENMS_FILEFILTER.out.versions) ch_clean_mzml_file = OPENMS_FILEFILTER.out.mzml } else { ch_clean_mzml_file = PREPARE_SPECTRA.out.mzml @@ -96,7 +97,7 @@ workflow MHCQUANT { // Run comet database search and index decoy and target hits OPENMSTHIRDPARTY_COMETADAPTER(ch_comet_in) - ch_versions = ch_versions.mix(OPENMSTHIRDPARTY_COMETADAPTER.out.versions) + // ch_versions = ch_versions.mix(OPENMSTHIRDPARTY_COMETADAPTER.out.versions) // Prepare the peptideindexer channel with global fasta or per-sample_condition fasta ch_peptideindexer_in = params.fasta ? @@ -107,11 +108,11 @@ workflow MHCQUANT { .map { groupKey, meta, idxml, fasta -> [meta, idxml, fasta] } OPENMS_PEPTIDEINDEXER(ch_peptideindexer_in) - ch_versions = ch_versions.mix(OPENMS_PEPTIDEINDEXER.out.versions) + // ch_versions = ch_versions.mix(OPENMS_PEPTIDEINDEXER.out.versions) // Compute mass errors for multiQC report OPENMS_IDMASSACCURACY(PREPARE_SPECTRA.out.mzml.join(OPENMS_PEPTIDEINDEXER.out.indexed_idxml)) - ch_versions = ch_versions.mix(OPENMS_IDMASSACCURACY.out.versions) + // ch_versions = ch_versions.mix(OPENMS_IDMASSACCURACY.out.versions) ch_multiqc_files = ch_multiqc_files.mix(OPENMS_IDMASSACCURACY.out.frag_err.map{ meta, frag_err -> frag_err }) // Save indexed runs for later use to keep meta-run information. Sort based on file id @@ -127,7 +128,7 @@ workflow MHCQUANT { // Merge aligned idXMLfiles OPENMS_IDMERGER(ch_runs_to_merge) - ch_versions = ch_versions.mix(OPENMS_IDMERGER.out.versions) + // ch_versions = ch_versions.mix(OPENMS_IDMERGER.out.versions) // Run MS2Rescore ch_clean_mzml_file From 57c3e08a9dd76932e2532bfc118872253d55a022 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Thu, 8 Jan 2026 17:32:34 +0100 Subject: [PATCH 008/104] Add changelog entry for version 3.2.0 Updated CHANGELOG for version 3.2.0 with changes and dependency updates. --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 363fe483..fe08b61a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,19 @@ 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). +## 3.2.0 - [releasename] - [date] + +### `Changed` + +- Migrate to topic channels [#431](https://github.com/nf-core/mhcquant/pull/431) + +### `Dependencies` + +| Dependency | Old version | New version | +| ---------- | ----------- | ----------- | +| `MultiQC` | 1.31.0 | 1.33.0 | +| `Nf-core` | 3.4.1 | 3.5.1 | + ## 3.1.0 - BlüBa - 07/01/26 ### `Added` From 9d7595789583da4b16e337b343df60ab136cdf90 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 8 Jan 2026 17:21:41 +0000 Subject: [PATCH 009/104] Initial plan From e991182dde0a9d049a9da38ea5388530894a7757 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 8 Jan 2026 17:23:53 +0000 Subject: [PATCH 010/104] Update pipeline version from v3.1.0 to v3.2.0dev in all snapshot files Co-authored-by: jonasscheid <43858870+jonasscheid@users.noreply.github.com> --- tests/default.nf.test.snap | 2 +- tests/ionannotator.nf.test.snap | 2 +- tests/mokapot.nf.test.snap | 2 +- tests/speclib.nf.test.snap | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 85ba67fb..85815935 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -41,7 +41,7 @@ "pyopenms": "3.4.1" }, "Workflow": { - "nf-core/mhcquant": "v3.1.0" + "nf-core/mhcquant": "v3.2.0dev" } }, [ diff --git a/tests/ionannotator.nf.test.snap b/tests/ionannotator.nf.test.snap index b0fd3915..a822c770 100644 --- a/tests/ionannotator.nf.test.snap +++ b/tests/ionannotator.nf.test.snap @@ -45,7 +45,7 @@ "pyopenms": "3.4.1" }, "Workflow": { - "nf-core/mhcquant": "v3.1.0" + "nf-core/mhcquant": "v3.2.0dev" } }, [ diff --git a/tests/mokapot.nf.test.snap b/tests/mokapot.nf.test.snap index 4acd6735..210cc79d 100644 --- a/tests/mokapot.nf.test.snap +++ b/tests/mokapot.nf.test.snap @@ -38,7 +38,7 @@ "pyopenms": "3.4.1" }, "Workflow": { - "nf-core/mhcquant": "v3.1.0" + "nf-core/mhcquant": "v3.2.0dev" } }, [ diff --git a/tests/speclib.nf.test.snap b/tests/speclib.nf.test.snap index 4864a01a..261f2dbb 100644 --- a/tests/speclib.nf.test.snap +++ b/tests/speclib.nf.test.snap @@ -48,7 +48,7 @@ "pyopenms": "3.4.1" }, "Workflow": { - "nf-core/mhcquant": "v3.1.0" + "nf-core/mhcquant": "v3.2.0dev" } }, [ From 5702f5e5f078897fa26eca5f8ba5be378dd3631b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 9 Jan 2026 08:35:21 +0000 Subject: [PATCH 011/104] Initial plan From ecd9f94940c25587ed34c1b46422b0fd90e062ed Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 9 Jan 2026 08:38:22 +0000 Subject: [PATCH 012/104] Remove all cache buster comments from local modules Co-authored-by: jonasscheid <43858870+jonasscheid@users.noreply.github.com> --- modules/local/openms/featurefinderidentification/main.nf | 1 - modules/local/openms/idconflictresolver/main.nf | 1 - modules/local/openms/mapaligneridentification/main.nf | 1 - modules/local/openms/maprttransformer/main.nf | 1 - modules/local/openms/mztabexporter/main.nf | 1 - modules/local/openms/psmfeatureextractor/main.nf | 1 - modules/local/openms/textexporter/main.nf | 1 - modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf | 1 - 8 files changed, 8 deletions(-) diff --git a/modules/local/openms/featurefinderidentification/main.nf b/modules/local/openms/featurefinderidentification/main.nf index 1d003110..4f9e7398 100644 --- a/modules/local/openms/featurefinderidentification/main.nf +++ b/modules/local/openms/featurefinderidentification/main.nf @@ -25,7 +25,6 @@ process OPENMS_FEATUREFINDERIDENTIFICATION { args = args + (task.ext.args ? " ${task.ext.args}" : '') """ - # cache buster FeatureFinderIdentification -in $mzml \\ -out ${prefix}.featureXML \\ -threads $task.cpus \\ diff --git a/modules/local/openms/idconflictresolver/main.nf b/modules/local/openms/idconflictresolver/main.nf index c49e57af..b116851e 100644 --- a/modules/local/openms/idconflictresolver/main.nf +++ b/modules/local/openms/idconflictresolver/main.nf @@ -21,7 +21,6 @@ process OPENMS_IDCONFLICTRESOLVER { def prefix = task.ext.prefix ?: "${meta.id}_resolved" """ - # cache buster IDConflictResolver -in $consensus \\ -out ${prefix}.consensusXML \\ -threads $task.cpus diff --git a/modules/local/openms/mapaligneridentification/main.nf b/modules/local/openms/mapaligneridentification/main.nf index a33b2600..fd6f3ec1 100644 --- a/modules/local/openms/mapaligneridentification/main.nf +++ b/modules/local/openms/mapaligneridentification/main.nf @@ -22,7 +22,6 @@ process OPENMS_MAPALIGNERIDENTIFICATION { def out_names = idxmls.collect { it.baseName.replace('_fdr_filtered','')+'.trafoXML' }.join(' ') """ - # cache buster MapAlignerIdentification -in $idxmls \\ -trafo_out ${out_names} \\ $args diff --git a/modules/local/openms/maprttransformer/main.nf b/modules/local/openms/maprttransformer/main.nf index eb7904e0..fd436d6d 100644 --- a/modules/local/openms/maprttransformer/main.nf +++ b/modules/local/openms/maprttransformer/main.nf @@ -23,7 +23,6 @@ process OPENMS_MAPRTTRANSFORMER { def fileExt = alignment_file.collect { it.name.tokenize("\\.")[1] }.join(' ') """ - # cache buster MapRTTransformer -in $alignment_file \\ -trafo_in $trafoxml \\ -out ${prefix}.${fileExt} \\ diff --git a/modules/local/openms/mztabexporter/main.nf b/modules/local/openms/mztabexporter/main.nf index 652441c5..5fe288dd 100644 --- a/modules/local/openms/mztabexporter/main.nf +++ b/modules/local/openms/mztabexporter/main.nf @@ -22,7 +22,6 @@ process OPENMS_MZTABEXPORTER { def prefix = task.ext.prefix ?: "${meta.id}" """ - # cache buster MzTabExporter -in $in_file \\ -out ${prefix}.mzTab \\ -threads $task.cpus \\ diff --git a/modules/local/openms/psmfeatureextractor/main.nf b/modules/local/openms/psmfeatureextractor/main.nf index 45ff9013..33fd6f10 100644 --- a/modules/local/openms/psmfeatureextractor/main.nf +++ b/modules/local/openms/psmfeatureextractor/main.nf @@ -24,7 +24,6 @@ process OPENMS_PSMFEATUREEXTRACTOR { """ extra_features=\$(awk 'NR > 1 && \$1 !~ /psm_file/ {printf \"%s \", \$2}' ${feature_file}) - # cache buster PSMFeatureExtractor -in $idxml \\ -out ${prefix}.idXML \\ diff --git a/modules/local/openms/textexporter/main.nf b/modules/local/openms/textexporter/main.nf index f1ee3084..f8b9173a 100644 --- a/modules/local/openms/textexporter/main.nf +++ b/modules/local/openms/textexporter/main.nf @@ -22,7 +22,6 @@ process OPENMS_TEXTEXPORTER { def prefix = task.ext.prefix ?: "${meta.id}" """ - # cache buster TextExporter -in $file \\ -out ${prefix}_exported.tsv \\ -threads $task.cpus \\ diff --git a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf index edaedd3e..d4015255 100644 --- a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf +++ b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf @@ -21,7 +21,6 @@ process OPENMS_FEATURELINKERUNLABELEDKD { def prefix = task.ext.prefix ?: "${meta.id}_all_features_merged" """ - # cache buster FeatureLinkerUnlabeledKD -in $features \\ -out ${prefix}.consensusXML \\ -threads $task.cpus From f859ec4dfe5c9463978d8ef174dc361f4b850948 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 9 Jan 2026 10:25:10 +0000 Subject: [PATCH 013/104] update snapshots with correct versions --- .../nf-core/openmsthirdparty/cometadapter/main.nf | 1 + tests/default.nf.test.snap | 12 ++++++------ tests/ionannotator.nf.test.snap | 12 ++++++------ tests/mokapot.nf.test.snap | 12 ++++++------ tests/speclib.nf.test.snap | 15 +++++++++------ 5 files changed, 28 insertions(+), 24 deletions(-) diff --git a/modules/nf-core/openmsthirdparty/cometadapter/main.nf b/modules/nf-core/openmsthirdparty/cometadapter/main.nf index 6ce8e913..0d331e3f 100644 --- a/modules/nf-core/openmsthirdparty/cometadapter/main.nf +++ b/modules/nf-core/openmsthirdparty/cometadapter/main.nf @@ -14,6 +14,7 @@ process OPENMSTHIRDPARTY_COMETADAPTER { tuple val(meta), path("*.idXML"), emit: idxml tuple val(meta), path("*.tsv") , emit: pin, optional: true tuple val("${task.process}"), val('CometAdapter'), eval("CometAdapter 2>&1 | grep -E '^Version' | sed 's/Version: //g' | cut -d ' ' -f 1 | cut -d '-' -f 1"), emit: versions, topic: versions + tuple val("${task.process}"), val('Comet'), eval("comet 2>&1 | grep -E 'Comet version' | sed 's/Comet version //g' | tr -d '\"'"), emit: versions_1, topic: versions when: task.ext.when == null || task.ext.when diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 85ba67fb..a6f7b857 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -3,11 +3,11 @@ "content": [ { "MS2RESCORE": { - "MS\u00b2Rescore": "3.1.5)" + "MS2Rescore": "3.1.5" }, "OPENMSTHIRDPARTY_COMETADAPTER": { - "CometAdapter": "3.4.1", - "Comet": "2024.01 rev. 1" + "Comet": "2024.01 rev. 1", + "CometAdapter": "3.4.1" }, "OPENMS_DECOYDATABASE": { "openms": "3.4.1" @@ -16,7 +16,7 @@ "openms": "3.4.1" }, "OPENMS_IDMASSACCURACY": { - "OpenMS": "3.4.1" + "openms": "3.4.1" }, "OPENMS_IDMERGER": { "openms": "3.4.1" @@ -41,7 +41,7 @@ "pyopenms": "3.4.1" }, "Workflow": { - "nf-core/mhcquant": "v3.1.0" + "nf-core/mhcquant": "v3.2.0dev" } }, [ @@ -384,6 +384,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T21:36:13.560396546" + "timestamp": "2026-01-09T09:50:11.865149581" } } \ No newline at end of file diff --git a/tests/ionannotator.nf.test.snap b/tests/ionannotator.nf.test.snap index b0fd3915..dd848f79 100644 --- a/tests/ionannotator.nf.test.snap +++ b/tests/ionannotator.nf.test.snap @@ -4,11 +4,11 @@ 22, { "MS2RESCORE": { - "MS\u00b2Rescore": "3.1.5)" + "MS2Rescore": "3.1.5" }, "OPENMSTHIRDPARTY_COMETADAPTER": { - "CometAdapter": "3.4.1", - "Comet": "2024.01 rev. 1" + "Comet": "2024.01 rev. 1", + "CometAdapter": "3.4.1" }, "OPENMS_DECOYDATABASE": { "openms": "3.4.1" @@ -17,7 +17,7 @@ "openms": "3.4.1" }, "OPENMS_IDMASSACCURACY": { - "OpenMS": "3.4.1" + "openms": "3.4.1" }, "OPENMS_IDMERGER": { "openms": "3.4.1" @@ -45,7 +45,7 @@ "pyopenms": "3.4.1" }, "Workflow": { - "nf-core/mhcquant": "v3.1.0" + "nf-core/mhcquant": "v3.2.0dev" } }, [ @@ -405,6 +405,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T21:53:36.826911285" + "timestamp": "2026-01-09T10:04:59.923025945" } } \ No newline at end of file diff --git a/tests/mokapot.nf.test.snap b/tests/mokapot.nf.test.snap index 4acd6735..045eaca7 100644 --- a/tests/mokapot.nf.test.snap +++ b/tests/mokapot.nf.test.snap @@ -4,11 +4,11 @@ 20, { "MS2RESCORE": { - "MS\u00b2Rescore": "3.1.5)" + "MS2Rescore": "3.1.5" }, "OPENMSTHIRDPARTY_COMETADAPTER": { - "CometAdapter": "3.4.1", - "Comet": "2024.01 rev. 1" + "Comet": "2024.01 rev. 1", + "CometAdapter": "3.4.1" }, "OPENMS_DECOYDATABASE": { "openms": "3.4.1" @@ -17,7 +17,7 @@ "openms": "3.4.1" }, "OPENMS_IDMASSACCURACY": { - "OpenMS": "3.4.1" + "openms": "3.4.1" }, "OPENMS_IDMERGER": { "openms": "3.4.1" @@ -38,7 +38,7 @@ "pyopenms": "3.4.1" }, "Workflow": { - "nf-core/mhcquant": "v3.1.0" + "nf-core/mhcquant": "v3.2.0dev" } }, [ @@ -112,6 +112,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T22:04:22.998726246" + "timestamp": "2026-01-09T10:16:10.560078316" } } \ No newline at end of file diff --git a/tests/speclib.nf.test.snap b/tests/speclib.nf.test.snap index 4864a01a..9d4e26c3 100644 --- a/tests/speclib.nf.test.snap +++ b/tests/speclib.nf.test.snap @@ -10,20 +10,23 @@ "easypqp": "0.1.53" }, "MS2RESCORE": { - "MS\u00b2Rescore": "3.1.5)" + "MS2Rescore": "3.1.5" }, "OPENMSTHIRDPARTY_COMETADAPTER": { - "CometAdapter": "3.4.1", - "Comet": "2024.01 rev. 1" + "Comet": "2024.01 rev. 1", + "CometAdapter": "3.4.1" }, "OPENMS_DECOYDATABASE": { "openms": "3.4.1" }, + "OPENMS_IDFILTER_FOR_SPECLIB": { + "openms": "3.4.1" + }, "OPENMS_IDFILTER_Q_VALUE": { "openms": "3.4.1" }, "OPENMS_IDMASSACCURACY": { - "OpenMS": "3.4.1" + "openms": "3.4.1" }, "OPENMS_IDMERGER": { "openms": "3.4.1" @@ -48,7 +51,7 @@ "pyopenms": "3.4.1" }, "Workflow": { - "nf-core/mhcquant": "v3.1.0" + "nf-core/mhcquant": "v3.2.0dev" } }, [ @@ -393,6 +396,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T22:13:30.098880662" + "timestamp": "2026-01-09T10:24:20.32429559" } } \ No newline at end of file From 1686d9ba586b9ce424f2fc196aed5641ab40921d Mon Sep 17 00:00:00 2001 From: Nikita Borodin Date: Thu, 15 Jan 2026 09:47:53 +0000 Subject: [PATCH 014/104] Fix #428: add sequence checking via pyopenms Added function 'strip_modifications' to parse sequences. The --variable_mods flag is no longer required. --- bin/summarize_results.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/bin/summarize_results.py b/bin/summarize_results.py index c63d5b83..92d0aede 100755 --- a/bin/summarize_results.py +++ b/bin/summarize_results.py @@ -4,6 +4,7 @@ import pandas as pd import numpy as np +from pyopenms import AASequence from argparse import ArgumentParser import re from collections import Counter @@ -87,7 +88,14 @@ def parse_multiTSV(file_path): df["psm"] = df["sequence"].map(psm) return df - +def strip_modifications(seq_with_mods: str) -> str: + try: + aa_seq = AASequence.fromString(seq_with_mods) + return aa_seq.toUnmodifiedString() + except Exception as e: + logging.warning(f"Could not parse sequence {seq_with_mods}: {e}") + return seq_with_mods + def process_file(file, prefix, quantify, keep_cols): """Extract all the relevant information and write it to a TSV file for the MultiQC report @@ -122,7 +130,7 @@ def process_file(file, prefix, quantify, keep_cols): # Remove modification information from the sequence column data["peptidoform"] = data["sequence"] - data["sequence"] = data["sequence"].apply(lambda seq: re.sub(r'\(.*?\)', '', seq)) + data["sequence"] = data["sequence"].apply(strip_modifications) # --------------------------------- # Length distribution plot From d481efd1837f90eea2a94e78150b3fefc4dc9222 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 15 Jan 2026 11:48:34 +0000 Subject: [PATCH 015/104] [automated] Fix code linting --- bin/summarize_results.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/summarize_results.py b/bin/summarize_results.py index 92d0aede..918d6a16 100755 --- a/bin/summarize_results.py +++ b/bin/summarize_results.py @@ -95,7 +95,7 @@ def strip_modifications(seq_with_mods: str) -> str: except Exception as e: logging.warning(f"Could not parse sequence {seq_with_mods}: {e}") return seq_with_mods - + def process_file(file, prefix, quantify, keep_cols): """Extract all the relevant information and write it to a TSV file for the MultiQC report From d4e2a6e80a2dbbafff4355fe18edbc83e2938d16 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Thu, 15 Jan 2026 17:47:14 +0100 Subject: [PATCH 016/104] Update CHANGELOG Add changelog entry for version 3.2.0dev with a fix. --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 363fe483..fed46de6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ 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). +## 3.2.0dev - [release name] - [date] + +### `Fixed` +- Fixed an issue where stripping the sequence in `SUMMARIZE_RESULTS` did not work for complex modifications [#436](https://github.com/nf-core/mhcquant/pull/436) + ## 3.1.0 - BlüBa - 07/01/26 ### `Added` From adacf77d3b723dd69093e59d018d43e8a7d78fa2 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 15 Jan 2026 17:00:58 +0000 Subject: [PATCH 017/104] Support quant of single runs --- .../openms/fileconverter/environment.yml | 7 +++ modules/local/openms/fileconverter/main.nf | 46 +++++++++++++++++++ nextflow.config | 1 + subworkflows/local/map_alignment/main.nf | 16 +++---- subworkflows/local/process_feature/main.nf | 23 ++++++++-- subworkflows/local/quant/main.nf | 16 +++---- 6 files changed, 89 insertions(+), 20 deletions(-) create mode 100644 modules/local/openms/fileconverter/environment.yml create mode 100644 modules/local/openms/fileconverter/main.nf diff --git a/modules/local/openms/fileconverter/environment.yml b/modules/local/openms/fileconverter/environment.yml new file mode 100644 index 00000000..e9ab2df5 --- /dev/null +++ b/modules/local/openms/fileconverter/environment.yml @@ -0,0 +1,7 @@ +name: openms_fileconverter +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::openms=3.4.1 diff --git a/modules/local/openms/fileconverter/main.nf b/modules/local/openms/fileconverter/main.nf new file mode 100644 index 00000000..71d2b781 --- /dev/null +++ b/modules/local/openms/fileconverter/main.nf @@ -0,0 +1,46 @@ +process OPENMS_FILECONVERTER { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : + 'biocontainers/openms:3.4.1--h81ffffe_1' }" + + input: + tuple val(meta), path(file), val(suffix) + + output: + tuple val(meta), path("*.${suffix}"), emit: consensusxml + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + FileConverter \\ + -in $file \\ + -out ${prefix}.${suffix} \\ + -threads $task.cpus + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + touch ${prefix}.${suffix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/nextflow.config b/nextflow.config index 97ebb856..f9d46618 100644 --- a/nextflow.config +++ b/nextflow.config @@ -235,6 +235,7 @@ profiles { test_epicore { includeConfig 'conf/test_epicore.config' } test_speclib { includeConfig 'conf/test_speclib.config' } test_timstof { includeConfig 'conf/test_timstof.config' } + test_single_quant { includeConfig 'conf/test_single_quant.config' } test_full { includeConfig 'conf/test_full.config' } } diff --git a/subworkflows/local/map_alignment/main.nf b/subworkflows/local/map_alignment/main.nf index 76725d0d..de3c5cc5 100644 --- a/subworkflows/local/map_alignment/main.nf +++ b/subworkflows/local/map_alignment/main.nf @@ -25,7 +25,7 @@ workflow MAP_ALIGNMENT { .flatMap { group_meta, metas -> metas } .map { meta -> [[spectra:meta.spectra], meta]} .join( OPENMS_MAPALIGNERIDENTIFICATION.out.trafoxml - .flatMap { group_meta, trafoxmls -> trafoxmls.collect { trafoxml -> [[spectra: trafoxml.baseName], trafoxml] } }) + .flatMap { group_meta, trafoxmls -> [trafoxmls].flatten().collect { trafoxml -> [[spectra: trafoxml.baseName], trafoxml] } }) .map { spectra, meta, trafoxml -> [meta, trafoxml] } .set { ch_trafos } @@ -36,13 +36,13 @@ workflow MAP_ALIGNMENT { // Align idXMLfiles using trafoXMLs ch_runs_to_be_aligned - .flatMap { group_meta, idxmls -> idxmls.collect { idxml -> [[spectra: idxml.baseName.replace("_fdr_filtered","")], idxml] } } - .join( merge_meta_map - .flatMap { group_meta, metas -> metas } - .map { meta -> [[spectra:meta.spectra], meta]} ) - .map { group_meta, idxml, meta -> [meta, idxml] } - .join( ch_trafos ) - .set { ch_trafos_idxml } + .flatMap { group_meta, idxmls -> [idxmls].flatten().collect { idxml -> [[spectra: idxml.baseName.replace("_fdr_filtered","")], idxml] } } + .join( merge_meta_map + .flatMap { group_meta, metas -> metas } + .map { meta -> [[spectra:meta.spectra], meta]} ) + .map { group_meta, idxml, meta -> [meta, idxml] } + .join( ch_trafos ) + .set { ch_trafos_idxml } OPENMS_MAPRTTRANSFORMERIDXML(ch_trafos_idxml) ch_versions = ch_versions.mix(OPENMS_MAPRTTRANSFORMERIDXML.out.versions) diff --git a/subworkflows/local/process_feature/main.nf b/subworkflows/local/process_feature/main.nf index 8156a5f2..050d0c30 100644 --- a/subworkflows/local/process_feature/main.nf +++ b/subworkflows/local/process_feature/main.nf @@ -4,7 +4,8 @@ include { OPENMS_FEATUREFINDERIDENTIFICATION } from '../../../modules/local/openms/featurefinderidentification' include { OPENMS_FEATURELINKERUNLABELEDKD } from '../../../modules/local/openmsthirdparty/featurelinkerunlabeledkd' -include { OPENMS_IDCONFLICTRESOLVER } from '../../../modules/local/openms/idconflictresolver' +include { OPENMS_IDCONFLICTRESOLVER } from '../../../modules/local/openms/idconflictresolver/main' +include { OPENMS_FILECONVERTER } from '../../../modules/local/openms/fileconverter/main' workflow PROCESS_FEATURE { take: @@ -17,15 +18,29 @@ workflow PROCESS_FEATURE { OPENMS_FEATUREFINDERIDENTIFICATION(ch_runs_to_be_quantified).featurexml .map { meta, featurexml -> [ groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), featurexml] } .groupTuple() - .set { ch_features_grouped } + .set { ch_featuresxmls } ch_versions = ch_versions.mix(OPENMS_FEATUREFINDERIDENTIFICATION.out.versions) + ch_featuresxmls + .branch { + single: it[1].size() == 1 + multiple: it[1].size() > 1 + } + .set { ch_features } + // Link extracted features - OPENMS_FEATURELINKERUNLABELEDKD(ch_features_grouped) + OPENMS_FEATURELINKERUNLABELEDKD(ch_features.multiple) ch_versions = ch_versions.mix(OPENMS_FEATURELINKERUNLABELEDKD.out.versions) + // Single replicate: promote featureXML to consensusXML + OPENMS_FILECONVERTER(ch_features.single.map { meta, features -> [ meta, features[0], "consensusXML" ] }) + ch_versions = ch_versions.mix(OPENMS_FILECONVERTER.out.versions) + // Resolve conflicting ids matching to the same feature - OPENMS_IDCONFLICTRESOLVER(OPENMS_FEATURELINKERUNLABELEDKD.out.consensusxml) + ch_consensus_input = OPENMS_FEATURELINKERUNLABELEDKD.out.consensusxml + .mix(OPENMS_FILECONVERTER.out.consensusxml) + + OPENMS_IDCONFLICTRESOLVER(ch_consensus_input) ch_versions = ch_versions.mix(OPENMS_IDCONFLICTRESOLVER.out.versions) emit: diff --git a/subworkflows/local/quant/main.nf b/subworkflows/local/quant/main.nf index d9202d8d..02466211 100644 --- a/subworkflows/local/quant/main.nf +++ b/subworkflows/local/quant/main.nf @@ -30,14 +30,14 @@ workflow QUANT { // We need to make sure that the order of the runs is the same as in the mzml files since IDRipper always sorts the runs // (and nextflow does not guarantee the order of the maps in merged_meta_map) OPENMS_IDRIPPER( merged_pout ).idxmls - .flatMap { group_meta, idxmls -> idxmls.collect { idxml -> [[spectra: idxml.baseName], idxml] } } - // join on file basename to make sure that the order of the runs is the same as in the mzml files - // Is there a smoother way to do this? - .join( merge_meta_map - .flatMap { group_meta, metas -> metas } - .map { meta -> [[spectra:meta.spectra], meta]} ) - .map { spectra, idxmls, meta -> [meta, idxmls] } - .set { ch_ripped_idxml } + // Handle both single file and list of files + .flatMap { group_meta, idxmls -> [idxmls].flatten().collect { idxml -> [[spectra: idxml.baseName], idxml] } } + // join on file basename to make sure that the order of the runs is the same as in the mzml files + .join( merge_meta_map + .flatMap { group_meta, metas -> metas } + .map { meta -> [[spectra:meta.spectra], meta]} ) + .map { spectra, idxmls, meta -> [meta, idxmls] } + .set { ch_ripped_idxml } ch_versions = ch_versions.mix(OPENMS_IDRIPPER.out.versions) // Switch to xcorr for filtering since q-values are set to 1 with peptide-level-fdr From f6a08ac60da9731ab1c8bbc7479c4f32f70ffe45 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 15 Jan 2026 20:18:02 +0000 Subject: [PATCH 018/104] Add tests --- conf/test_single_quant.config | 24 ++ tests/test_single_quant.nf.test | 54 ++++ tests/test_single_quant.nf.test.snap | 389 +++++++++++++++++++++++++++ 3 files changed, 467 insertions(+) create mode 100644 conf/test_single_quant.config create mode 100644 tests/test_single_quant.nf.test create mode 100644 tests/test_single_quant.nf.test.snap diff --git a/conf/test_single_quant.config b/conf/test_single_quant.config new file mode 100644 index 00000000..f9033cfd --- /dev/null +++ b/conf/test_single_quant.config @@ -0,0 +1,24 @@ +/* + * ---------------------------------------------------------------------------- + * Nextflow config file for running tests + * ---------------------------------------------------------------------------- + * Defines bundled input files and everything required to run a fast and simple + * pipeline test. Use as follows: + * nextflow run main.nf -profile test_single_quant, + * */ + +params { + config_profile_name = 'Test single replicate profile' + config_profile_description = 'Test dataset to check pipeline function for single replicate' + + // Limit resources so that this can run on GitHub Actions + max_cpus = 2 + max_memory = '6.GB' + max_time = '6.h' + + // Input data + input = params.pipelines_testdata_base_path + 'mhcquant/testdata/sample_sheet_single_quant.tsv' + + // Pipeline settings + quantify = true +} diff --git a/tests/test_single_quant.nf.test b/tests/test_single_quant.nf.test new file mode 100644 index 00000000..456957f8 --- /dev/null +++ b/tests/test_single_quant.nf.test @@ -0,0 +1,54 @@ +nextflow_pipeline { + + name "Test pipeline for single replicate" + script "../main.nf" + tag "pipeline" + tag "single_replicate" + + test("-profile test_single_quant") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + // Extract peptidoform column from all TSV files + def peptidoform_data = [] + new File(params.outdir).eachFileRecurse { file -> + if (file.name.endsWith('.tsv')) { + def lines = file.readLines() + if (lines.size() > 0) { + def header = lines[0].split('\t') + def peptidoformIndex = header.findIndexOf { it == 'peptidoform' } + if (peptidoformIndex >= 0) { + def peptidoforms = lines.drop(1).collect { line -> + def fields = line.split('\t') + fields.size() > peptidoformIndex ? fields[peptidoformIndex] : '' + }.findAll { it != '' }.sort() + peptidoform_data.add([file.name, peptidoforms]) + } + } + } + } + assertAll( + { assert workflow.success}, + { assert snapshot( + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_mhcquant_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path, + // Peptidoform data from TSV files + peptidoform_data + ).match() } + ) + } + } +} diff --git a/tests/test_single_quant.nf.test.snap b/tests/test_single_quant.nf.test.snap new file mode 100644 index 00000000..e3667f7e --- /dev/null +++ b/tests/test_single_quant.nf.test.snap @@ -0,0 +1,389 @@ +{ + "-profile test_single_quant": { + "content": [ + { + "MS2RESCORE": { + "MS\u00b2Rescore": "3.1.5)" + }, + "OPENMSTHIRDPARTY_COMETADAPTER": { + "CometAdapter": "3.4.1", + "Comet": "2024.01 rev. 1" + }, + "OPENMS_DECOYDATABASE": { + "openms": "3.4.1" + }, + "OPENMS_IDFILTER_Q_VALUE": { + "openms": "3.4.1" + }, + "OPENMS_IDMASSACCURACY": { + "OpenMS": "3.4.1" + }, + "OPENMS_IDMERGER": { + "openms": "3.4.1" + }, + "OPENMS_PEPTIDEINDEXER": { + "openms": "3.4.1" + }, + "OPENMS_PERCOLATORADAPTER": { + "PercolatorAdapter": "3.4.1-pre-exported-20250822", + "percolator": "3.07.1, Build Date Mar 13 2025 17:19:27" + }, + "OPENMS_PSMFEATUREEXTRACTOR": { + "openms": "3.4.1" + }, + "OPENMS_TEXTEXPORTER": { + "openms": "3.4.1" + }, + "PYOPENMS_CHROMATOGRAMEXTRACTOR": { + "pyopenms": "3.4.1" + }, + "SUMMARIZE_RESULTS": { + "pyopenms": "3.4.1" + }, + "Workflow": { + "nf-core/mhcquant": "v3.1.0" + } + }, + [ + "HepG2_A.tsv", + "intermediate_results", + "intermediate_results/comet", + "intermediate_results/comet/HepG2_rep1_small_pin.tsv", + "intermediate_results/comet/HepG2_rep2_small_pin.tsv", + "intermediate_results/comet/HepG2_rep3_small_pin.tsv", + "intermediate_results/rescoring", + "intermediate_results/rescoring/HepG2_A_ms2rescore.idXML", + "intermediate_results/rescoring/HepG2_A_pout.idXML", + "intermediate_results/rescoring/HepG2_A_pout_filtered.idXML", + "intermediate_results/rescoring/HepG2_A_psm.idXML", + "multiqc", + "multiqc/ms2rescore", + "multiqc/multiqc_data", + "multiqc/multiqc_data/llms-full.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", + "multiqc/multiqc_data/multiqc_chromatogram.txt", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_histogram_mz.txt", + "multiqc/multiqc_data/multiqc_histogram_rt.txt", + "multiqc/multiqc_data/multiqc_histogram_scores.txt", + "multiqc/multiqc_data/multiqc_length_dist.txt", + "multiqc/multiqc_data/multiqc_mass_error.txt", + "multiqc/multiqc_data/multiqc_percolator_barplot.txt", + "multiqc/multiqc_data/multiqc_scores_xcorr.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/percolator_plot.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/chromatogram-cnt.pdf", + "multiqc/multiqc_plots/pdf/chromatogram-log.pdf", + "multiqc/multiqc_plots/pdf/general_stats.pdf", + "multiqc/multiqc_plots/pdf/histogram_mz.pdf", + "multiqc/multiqc_plots/pdf/histogram_rt.pdf", + "multiqc/multiqc_plots/pdf/histogram_scores.pdf", + "multiqc/multiqc_plots/pdf/length_dist.pdf", + "multiqc/multiqc_plots/pdf/mass_error.pdf", + "multiqc/multiqc_plots/pdf/percolator_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/percolator_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/scores_xcorr.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/chromatogram-cnt.png", + "multiqc/multiqc_plots/png/chromatogram-log.png", + "multiqc/multiqc_plots/png/general_stats.png", + "multiqc/multiqc_plots/png/histogram_mz.png", + "multiqc/multiqc_plots/png/histogram_rt.png", + "multiqc/multiqc_plots/png/histogram_scores.png", + "multiqc/multiqc_plots/png/length_dist.png", + "multiqc/multiqc_plots/png/mass_error.png", + "multiqc/multiqc_plots/png/percolator_plot-cnt.png", + "multiqc/multiqc_plots/png/percolator_plot-pct.png", + "multiqc/multiqc_plots/png/scores_xcorr.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/chromatogram-cnt.svg", + "multiqc/multiqc_plots/svg/chromatogram-log.svg", + "multiqc/multiqc_plots/svg/general_stats.svg", + "multiqc/multiqc_plots/svg/histogram_mz.svg", + "multiqc/multiqc_plots/svg/histogram_rt.svg", + "multiqc/multiqc_plots/svg/histogram_scores.svg", + "multiqc/multiqc_plots/svg/length_dist.svg", + "multiqc/multiqc_plots/svg/mass_error.svg", + "multiqc/multiqc_plots/svg/percolator_plot-cnt.svg", + "multiqc/multiqc_plots/svg/percolator_plot-pct.svg", + "multiqc/multiqc_plots/svg/scores_xcorr.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_mhcquant_software_mqc_versions.yml" + ], + [ + + ], + [ + [ + "HepG2_A.tsv", + [ + "AAAAAAHRL", + "AAATVTKKV", + "AAHPNVQKV", + "AAKDPSPSV", + "AAM(Oxidation)SVAKRV", + "AANAQPHKL", + "AANDKLKKM", + "AANPDPKKL", + "AAPPPPAHA", + "AAPRPPPKPM(Oxidation)", + "AAQAHTREL", + "AAQSEAKVV", + "AARAEAREI", + "AASPVGKRL", + "AASSLKKQY", + "AATDHSNQL", + "AATPAKKTV", + "AATRWAKKI", + "AATSNLKKL", + "AATVTKKTY", + "AKDVKFGAD", + "ALKDKIEKA", + "ALKDSVQRA", + "ALKENGGARLA", + "ALSDLHAHK", + "AM(Oxidation)AARPHSI", + "AM(Oxidation)AASPHAV", + "AM(Oxidation)ASHLTST", + "AM(Oxidation)HGHVEVV", + "AM(Oxidation)NARPHKV", + "AMNARPHKV", + "APRPPPKPM(Oxidation)", + "ATWSDPHKA", + "AVM(Oxidation)GNPKVKA", + "AVVVKKIETRDG", + "DAAVHQRI", + "DAKKQIKQV", + "DAPAGRKV", + "DGKKKISTV", + "DHVITNM(Oxidation)N", + "DPM(Oxidation)KARVV", + "DPPKTHVT", + "DPPRDSKGL", + "DSKKSQPKI", + "EAKTHEAQI", + "EDRDDNKVY", + "EYSKQM(Oxidation)QRF", + "FADPHSKRV", + "FPHSAHQKY", + "FPSRGKSSSY", + "GKVGAHAGEY", + "GKVGAHAGEYG", + "GLAKSIHHA", + "GMAKKVTKA", + "GNVAEGETKPD", + "GPNKKPRF", + "GRPM(Oxidation)PPSRR", + "GRVVEPKR", + "GVM(Oxidation)VGM(Oxidation)GQKD", + "HAAENPGKY", + "HAANPNGRYY", + "HAATYTKKV", + "HAFGGNKASY", + "HAGPTAHEL", + "HAIGKSQSF", + "HAKEKLTAL", + "HAM(Oxidation)EEVKKF", + "HAPELTKKV", + "HLKEDQTEY", + "HPAENGKSNF", + "HPESERISM(Oxidation)", + "HPNKVKVY", + "HPSQPQGTY", + "HPYQPDPKM(Oxidation)", + "HSRNEGVATY", + "HSSPASSNY", + "HVKDANGNSF", + "HVSTHQHNY", + "IASQTVKKV", + "IKTVETRD", + "ILDKKVEKV", + "IPKKHISQI", + "IPQKFHRSV", + "ISSEAHREV", + "IVGRPRHQ", + "IYTEHAHQV", + "KAAAFEKQV", + "KAAKPKVV", + "KAASHIKSI", + "KAATVTKEL", + "KAISGVHTV", + "KAKPGTYKV", + "KALVKPKEV", + "KASEQAKVV", + "KASGTLREY", + "KAYGKAKSI", + "KAYSEAHEI", + "KHANQVLSL", + "KLAESVEKA", + "KLAPPPKKA", + "KLDNQVSKV", + "KLM(Oxidation)QQQQEV", + "KLQPGSVKKV", + "KLSPKAEEV", + "KM(Oxidation)DESKHEI", + "KM(Oxidation)LDHEYTT", + "KMDESKHEI", + "KMQEHSDQV", + "KSKEFVQKV", + "KTKEGVREV", + "KVAQPKEV", + "KVIDTQQKV", + "KVSNSGITRV", + "KVVNPTQK", + "KYLGKTHNL", + "KYNRQSM(Oxidation)TL", + "KYQPKPKQI", + "KYTPPPHHI", + "LAKTGVHHY", + "LDKKVEKV", + "LLKSEKSSY", + "LPSENHKEM", + "LPSENHKEM(Oxidation)", + "M(Oxidation)LSEHTSKL", + "M(Oxidation)PPEHVRKI", + "M(Oxidation)PQGGGQHY", + "M(Oxidation)PQKERESI", + "M(Oxidation)PRNLREY", + "MPKAEKNAV", + "MPNKVRKI", + "MPPEHVRKI", + "MPQKERESI", + "NAAEGRSF", + "NAHGEPRNY", + "NALAHKYH", + "NAM(Oxidation)KIRDV", + "NASARDNTI", + "NATAVVRHM(Oxidation)", + "NATNAVKRL", + "NGTHVVRHY", + "NIQKITKS", + "NLAEKPKTV", + "NLKVKGPVR", + "NLRPKKKV", + "NLRPKKKVK", + "NLTEEEEKSKS", + "NNLSSLSKK", + "NPAAYENDK", + "NPFGGASHAKG", + "NPKESSSSL", + "NTKIGPRR", + "NVDYSKLKK", + "NVINGGSHA", + "NVKIVKVKKE", + "NYTKEHNNL", + "PKSKELVSSSS", + "PPNKKPKV", + "PVEKALRD", + "QAGPINREM(Oxidation)", + "QALKHLKQY", + "QGVM(Oxidation)VGM(Oxidation)GQK", + "QGVM(Oxidation)VGM(Oxidation)GQKD", + "QPAKADKESF", + "QPHKVTQY", + "QTHQPPAPNS", + "QVKPNSNQV", + "QYKKDGADF", + "RADKKAPR", + "RLAEAHAKV", + "RLHEKIQEA", + "RLNNKSAKV", + "RPKKPGQSF", + "RPVPKGATY", + "RQVTGVTRV", + "RSNEHIREL", + "RSTENVNKL", + "RSTQYM(Oxidation)KEY", + "RVAGIHKKV", + "RYDDM(Oxidation)AAAM(Oxidation)", + "RYIDLHSNR", + "RYIDTHNRV", + "RYM(Oxidation)NHM(Oxidation)QSL", + "SAKLERSHY", + "SAM(Oxidation)SNPRAM", + "SAQTTSHEL", + "SARAGETRF", + "SASEAAKKY", + "SASHVSKTV", + "SATGHPRKV", + "SATNALRSM(Oxidation)", + "SATSNKHLL", + "SAVDRQREY", + "SAYANAKKY", + "SEVAHRFK", + "SIVGRPRH", + "SKEYFSKQ", + "SLDKTSHSV", + "SLDTQPKKV", + "SM(Oxidation)LGSPHKV", + "SM(Oxidation)NTHLKAV", + "SPM(Oxidation)EKIKQY", + "SPNYHEEKY", + "SQRFPKAE", + "SVKNDHSAY", + "SVQVFGRKK", + "SYVGDEAQSKR", + "SYVGDEAQSKRG", + "TALAPSTM(Oxidation)K", + "TAPQTQHV", + "TARPGPRAV", + "TDKSFVEK", + "TDRETGKL", + "TEKLVTSK", + "TEKLVTSKG", + "TGYYGKGKP", + "THQPPAPNS", + "THYDPPRK", + "TIGEGQQHHLG", + "TISRPKGVA", + "TKELPSGKKY", + "TLVQTKGT", + "TNNLRPKKKVK", + "TPPGVRKI", + "TRLSRTPGNR", + "TSGPGSRISSSS", + "TSTPNAKTV", + "TTPISEQKG", + "TTTHITKTV", + "TVIGPDGHKE", + "TVKDSRTVY", + "TVQNEANKY", + "VAPPKAHEV", + "VARAGQKGY", + "VASEGIKRY", + "VHLTPEEK", + "VITDKEKAE", + "VPKEGKVV", + "VQKTIAEN", + "VQNGKHFKF", + "VSKGTLVQTKGT", + "VTTSTRTY", + "VYAQKHQQL", + "VYGKTSHL", + "YADEKTKDV", + "YARLHPRAV", + "YGSTVSKRV", + "YLNKHIQKV", + "YPAKAKGTF", + "YTKKLNTQ", + "YTM(Oxidation)KKVHAL", + "YVGDEAQSKR", + "YVGDEAQSKRG" + ] + ] + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.8" + }, + "timestamp": "2026-01-15T17:14:18.178495706" + } +} \ No newline at end of file From 8f39b601aab8a618825875e854ce1cda66d74ef4 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Thu, 15 Jan 2026 21:20:18 +0100 Subject: [PATCH 019/104] Update CHANGELOG Added a new version section for 3.2.0dev with details. --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 363fe483..3f52c101 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ 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). +## 3.2.0dev - [release name] - [date] + +### `Added` +- Added support for single run quantification [#438](https://github.com/nf-core/mhcquant/pull/438) + ## 3.1.0 - BlüBa - 07/01/26 ### `Added` From 73dd91ae985e19de4f790bcea84bdcdfaa9bcd95 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 15 Jan 2026 20:21:27 +0000 Subject: [PATCH 020/104] [automated] Fix code linting --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fed46de6..ae7ba54d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## 3.2.0dev - [release name] - [date] ### `Fixed` + - Fixed an issue where stripping the sequence in `SUMMARIZE_RESULTS` did not work for complex modifications [#436](https://github.com/nf-core/mhcquant/pull/436) ## 3.1.0 - BlüBa - 07/01/26 From 8e5943aa414c2d54813e9b761d68ea6b405c72c1 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 15 Jan 2026 20:22:17 +0000 Subject: [PATCH 021/104] [automated] Fix code linting --- CHANGELOG.md | 1 + subworkflows/local/process_feature/main.nf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f52c101..5f143f7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## 3.2.0dev - [release name] - [date] ### `Added` + - Added support for single run quantification [#438](https://github.com/nf-core/mhcquant/pull/438) ## 3.1.0 - BlüBa - 07/01/26 diff --git a/subworkflows/local/process_feature/main.nf b/subworkflows/local/process_feature/main.nf index 40eb0384..24be4a5d 100644 --- a/subworkflows/local/process_feature/main.nf +++ b/subworkflows/local/process_feature/main.nf @@ -39,7 +39,7 @@ workflow PROCESS_FEATURE { // Resolve conflicting ids matching to the same feature ch_consensus_input = OPENMS_FEATURELINKERUNLABELEDKD.out.consensusxml .mix(OPENMS_FILECONVERTER.out.consensusxml) - + OPENMS_IDCONFLICTRESOLVER(ch_consensus_input) ch_versions = ch_versions.mix(OPENMS_IDCONFLICTRESOLVER.out.versions) From f562a0911bb63effbc1adcd4e138769c7fabe13d Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 15 Jan 2026 20:35:19 +0000 Subject: [PATCH 022/104] prevent publishing fileconvert output in single quant runs --- conf/modules.config | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index c5b93fae..ef1a2547 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -255,6 +255,12 @@ process { ] } + withName: 'OPENMS_FILECONVERTER' { + publishDir = [ + enabled: false + ] + } + withName: 'MULTIQC' { ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } publishDir = [ From ddbbed5cc42767b6e97ecaee00d8d44088fb5072 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Thu, 15 Jan 2026 22:35:09 +0100 Subject: [PATCH 023/104] Apply suggestion from @jonasscheid --- tests/test_single_quant.nf.test.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_single_quant.nf.test.snap b/tests/test_single_quant.nf.test.snap index e3667f7e..b75486f8 100644 --- a/tests/test_single_quant.nf.test.snap +++ b/tests/test_single_quant.nf.test.snap @@ -41,7 +41,7 @@ "pyopenms": "3.4.1" }, "Workflow": { - "nf-core/mhcquant": "v3.1.0" + "nf-core/mhcquant": "v3.2.0dev" } }, [ From 6f93d3694f1dcd90de8769123668af46d682000f Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 23 Jan 2026 20:43:26 +0000 Subject: [PATCH 024/104] Update openms and openmsthirdparty nf-core modules --- modules.json | 20 +++---- .../openms/decoydatabase/environment.yml | 2 +- modules/nf-core/openms/decoydatabase/main.nf | 17 +----- modules/nf-core/openms/decoydatabase/meta.yml | 28 +++++++-- .../decoydatabase/tests/main.nf.test.snap | 16 +++-- .../nf-core/openms/filefilter/environment.yml | 2 +- modules/nf-core/openms/filefilter/main.nf | 16 +---- modules/nf-core/openms/filefilter/meta.yml | 30 +++++++--- .../openms/filefilter/tests/main.nf.test | 2 +- .../openms/filefilter/tests/main.nf.test.snap | 16 +++-- .../nf-core/openms/idfilter/environment.yml | 2 +- modules/nf-core/openms/idfilter/main.nf | 18 ++---- modules/nf-core/openms/idfilter/meta.yml | 31 +++++++--- .../openms/idfilter/tests/main.nf.test.snap | 36 ++++++++---- modules/nf-core/openms/idmassaccuracy/main.nf | 20 ++++++- .../openms/idmassaccuracy/tests/main.nf.test | 12 ++-- .../nf-core/openms/idmerger/environment.yml | 2 +- modules/nf-core/openms/idmerger/main.nf | 16 +---- modules/nf-core/openms/idmerger/meta.yml | 28 +++++++-- .../openms/idmerger/tests/main.nf.test | 8 +-- .../openms/idmerger/tests/main.nf.test.snap | 24 ++++++-- .../nf-core/openms/idripper/environment.yml | 2 +- modules/nf-core/openms/idripper/main.nf | 16 +---- modules/nf-core/openms/idripper/meta.yml | 32 +++++++--- .../openms/idripper/tests/main.nf.test | 2 +- .../openms/idripper/tests/main.nf.test.snap | 32 +++++++--- .../openms/idscoreswitcher/environment.yml | 2 +- .../nf-core/openms/idscoreswitcher/main.nf | 16 +---- .../nf-core/openms/idscoreswitcher/meta.yml | 32 +++++++--- .../idscoreswitcher/tests/main.nf.test.snap | 32 +++++++--- .../openms/peakpickerhires/environment.yml | 2 +- .../nf-core/openms/peakpickerhires/main.nf | 16 +---- .../nf-core/openms/peakpickerhires/meta.yml | 32 +++++++--- .../openms/peakpickerhires/tests/main.nf.test | 2 +- .../peakpickerhires/tests/main.nf.test.snap | 24 ++++++-- .../openms/peptideindexer/environment.yml | 2 +- modules/nf-core/openms/peptideindexer/main.nf | 16 +---- .../nf-core/openms/peptideindexer/meta.yml | 28 +++++++-- .../openms/peptideindexer/tests/main.nf.test | 6 +- .../peptideindexer/tests/main.nf.test.snap | 32 +++++++--- .../cometadapter/environment.yml | 2 +- .../openmsthirdparty/cometadapter/main.nf | 20 ++----- .../openmsthirdparty/cometadapter/meta.yml | 58 +++++++++++++++++-- .../cometadapter/tests/main.nf.test | 6 +- .../cometadapter/tests/main.nf.test.snap | 22 ++++--- 45 files changed, 495 insertions(+), 285 deletions(-) diff --git a/modules.json b/modules.json index efeedebb..94a3d836 100644 --- a/modules.json +++ b/modules.json @@ -17,52 +17,52 @@ }, "openms/decoydatabase": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/filefilter": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/idfilter": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/idmassaccuracy": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/idmerger": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/idripper": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/idscoreswitcher": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/peakpickerhires": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/peptideindexer": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openmsthirdparty/cometadapter": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "thermorawfileparser": { diff --git a/modules/nf-core/openms/decoydatabase/environment.yml b/modules/nf-core/openms/decoydatabase/environment.yml index d85a93ef..c8bad1b9 100644 --- a/modules/nf-core/openms/decoydatabase/environment.yml +++ b/modules/nf-core/openms/decoydatabase/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::openms=3.4.1 + - bioconda::openms=3.5.0 diff --git a/modules/nf-core/openms/decoydatabase/main.nf b/modules/nf-core/openms/decoydatabase/main.nf index 42494818..7c5f9b98 100644 --- a/modules/nf-core/openms/decoydatabase/main.nf +++ b/modules/nf-core/openms/decoydatabase/main.nf @@ -4,15 +4,15 @@ process OPENMS_DECOYDATABASE { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(fasta) output: tuple val(meta), path("*.fasta"), emit: decoy_fasta - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -27,12 +27,6 @@ process OPENMS_DECOYDATABASE { -out ${prefix}.fasta \\ -threads $task.cpus \\ $args - - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -41,10 +35,5 @@ process OPENMS_DECOYDATABASE { """ touch ${prefix}.fasta - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/decoydatabase/meta.yml b/modules/nf-core/openms/decoydatabase/meta.yml index b0c13d16..bf421862 100644 --- a/modules/nf-core/openms/decoydatabase/meta.yml +++ b/modules/nf-core/openms/decoydatabase/meta.yml @@ -39,13 +39,29 @@ output: description: Fasta file containing proteins and decoy proteins pattern: "*.{fasta}" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The process the versions were collected from + - openms: + type: string + description: The tool name + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - openms: + type: string + description: The tool name + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openms/decoydatabase/tests/main.nf.test.snap b/modules/nf-core/openms/decoydatabase/tests/main.nf.test.snap index d4167208..d2f80c6f 100644 --- a/modules/nf-core/openms/decoydatabase/tests/main.nf.test.snap +++ b/modules/nf-core/openms/decoydatabase/tests/main.nf.test.snap @@ -11,7 +11,11 @@ ] ], "1": [ - "versions.yml:md5,3faa02db1ca8efaa13ffb542d3a418f0" + [ + "OPENMS_DECOYDATABASE", + "openms", + "3.5.0" + ] ], "decoy_fasta": [ [ @@ -21,8 +25,12 @@ "yeast_UPS_decoy.fasta:md5,96c0295f69e0cb92b705ca4c33e6f047" ] ], - "versions": [ - "versions.yml:md5,3faa02db1ca8efaa13ffb542d3a418f0" + "versions_openms": [ + [ + "OPENMS_DECOYDATABASE", + "openms", + "3.5.0" + ] ] } ], @@ -30,6 +38,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T07:59:28.940912845" + "timestamp": "2026-01-12T13:14:52.51304012" } } \ No newline at end of file diff --git a/modules/nf-core/openms/filefilter/environment.yml b/modules/nf-core/openms/filefilter/environment.yml index ad4685c0..fd1026d7 100644 --- a/modules/nf-core/openms/filefilter/environment.yml +++ b/modules/nf-core/openms/filefilter/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::openms=3.4.1" + - "bioconda::openms=3.5.0" diff --git a/modules/nf-core/openms/filefilter/main.nf b/modules/nf-core/openms/filefilter/main.nf index 55788339..6b6447b8 100644 --- a/modules/nf-core/openms/filefilter/main.nf +++ b/modules/nf-core/openms/filefilter/main.nf @@ -4,8 +4,8 @@ process OPENMS_FILEFILTER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(file) @@ -14,7 +14,7 @@ process OPENMS_FILEFILTER { tuple val(meta), path("*.mzML"), emit: mzml, optional: true tuple val(meta), path("*.featureXML"), emit: featurexml, optional: true tuple val(meta), path("*.consensusXML"), emit: consensusxml, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -31,11 +31,6 @@ process OPENMS_FILEFILTER { -out ${prefix}.${suffix} \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -46,10 +41,5 @@ process OPENMS_FILEFILTER { """ touch ${prefix}.${suffix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/filefilter/meta.yml b/modules/nf-core/openms/filefilter/meta.yml index 9721f9b3..6c552c7a 100644 --- a/modules/nf-core/openms/filefilter/meta.yml +++ b/modules/nf-core/openms/filefilter/meta.yml @@ -1,5 +1,6 @@ name: "openms_filefilter" -description: Filters peptide/protein identification results by different criteria. +description: Filters peptide/protein identification results by different + criteria. keywords: - filter - mzML @@ -62,14 +63,29 @@ output: description: Filtered consensusXML file. pattern: "*.consensusXML" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software version - pattern: "versions.yml" + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool - ontologies: - - edam: http://edamontology.org/format_3750 # YAML authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openms/filefilter/tests/main.nf.test b/modules/nf-core/openms/filefilter/tests/main.nf.test index a19a6d88..fb8334d1 100644 --- a/modules/nf-core/openms/filefilter/tests/main.nf.test +++ b/modules/nf-core/openms/filefilter/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { script "../../../thermorawfileparser/main.nf" process { """ - input[0] = channel.of([ + input[0] = Channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/msspectra/PXD012083_e005640_II.raw', checkIfExists: true) ]) diff --git a/modules/nf-core/openms/filefilter/tests/main.nf.test.snap b/modules/nf-core/openms/filefilter/tests/main.nf.test.snap index 23a8efdd..1f481bdc 100644 --- a/modules/nf-core/openms/filefilter/tests/main.nf.test.snap +++ b/modules/nf-core/openms/filefilter/tests/main.nf.test.snap @@ -43,7 +43,11 @@ ], "3": [ - "versions.yml:md5,1ea875205d6d20aea4dabd5e580f4d6a" + [ + "OPENMS_FILEFILTER", + "openms", + "3.5.0" + ] ], "consensusxml": [ @@ -59,8 +63,12 @@ "test_filtered.mzML:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,1ea875205d6d20aea4dabd5e580f4d6a" + "versions_openms": [ + [ + "OPENMS_FILEFILTER", + "openms", + "3.5.0" + ] ] } ], @@ -68,6 +76,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-27T13:03:04.483705593" + "timestamp": "2026-01-12T10:02:48.433471741" } } \ No newline at end of file diff --git a/modules/nf-core/openms/idfilter/environment.yml b/modules/nf-core/openms/idfilter/environment.yml index ad4685c0..fd1026d7 100644 --- a/modules/nf-core/openms/idfilter/environment.yml +++ b/modules/nf-core/openms/idfilter/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::openms=3.4.1" + - "bioconda::openms=3.5.0" diff --git a/modules/nf-core/openms/idfilter/main.nf b/modules/nf-core/openms/idfilter/main.nf index c15927bf..e31c9897 100644 --- a/modules/nf-core/openms/idfilter/main.nf +++ b/modules/nf-core/openms/idfilter/main.nf @@ -4,15 +4,15 @@ process OPENMS_IDFILTER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(id_file), path(filter_file) output: tuple val(meta), path("*.{idXML,consensusXML}"), emit: filtered - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -31,12 +31,7 @@ process OPENMS_IDFILTER { -out ${prefix}.${suffix} \\ -threads $task.cpus \\ $filter \\ - $args \\ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS + $args """ stub: @@ -50,10 +45,5 @@ process OPENMS_IDFILTER { """ touch ${prefix}.${suffix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/idfilter/meta.yml b/modules/nf-core/openms/idfilter/meta.yml index 2bab8552..4da25896 100644 --- a/modules/nf-core/openms/idfilter/meta.yml +++ b/modules/nf-core/openms/idfilter/meta.yml @@ -1,5 +1,6 @@ name: "openms_idfilter" -description: Filters peptide/protein identification results by different criteria. +description: Filters peptide/protein identification results by different + criteria. keywords: - filter - idXML @@ -44,13 +45,29 @@ output: description: Filtered peptide-spectrum matches. pattern: "*.{idXML,consensusXML}" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openms/idfilter/tests/main.nf.test.snap b/modules/nf-core/openms/idfilter/tests/main.nf.test.snap index b0f4bce3..dea78c77 100644 --- a/modules/nf-core/openms/idfilter/tests/main.nf.test.snap +++ b/modules/nf-core/openms/idfilter/tests/main.nf.test.snap @@ -11,7 +11,11 @@ ] ], "1": [ - "versions.yml:md5,992aca62fe3990b1ebb21d11e999dd67" + [ + "OPENMS_IDFILTER", + "openms", + "3.5.0" + ] ], "filtered": [ [ @@ -21,8 +25,12 @@ "test.idXML:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,992aca62fe3990b1ebb21d11e999dd67" + "versions_openms": [ + [ + "OPENMS_IDFILTER", + "openms", + "3.5.0" + ] ] } ], @@ -30,7 +38,7 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:37:44.032335833" + "timestamp": "2026-01-12T10:03:17.056821477" }, "proteomics - filter - idxml": { "content": [ @@ -40,22 +48,30 @@ { "id": "test" }, - "test.idXML:md5,b91c37a92b2d037368cfedde120dc845" + "test.idXML:md5,3231d9c0cd1838db70a576f505ed1a21" ] ], "1": [ - "versions.yml:md5,992aca62fe3990b1ebb21d11e999dd67" + [ + "OPENMS_IDFILTER", + "openms", + "3.5.0" + ] ], "filtered": [ [ { "id": "test" }, - "test.idXML:md5,b91c37a92b2d037368cfedde120dc845" + "test.idXML:md5,3231d9c0cd1838db70a576f505ed1a21" ] ], - "versions": [ - "versions.yml:md5,992aca62fe3990b1ebb21d11e999dd67" + "versions_openms": [ + [ + "OPENMS_IDFILTER", + "openms", + "3.5.0" + ] ] } ], @@ -63,6 +79,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:37:18.617593794" + "timestamp": "2026-01-12T10:03:04.798826665" } } \ No newline at end of file diff --git a/modules/nf-core/openms/idmassaccuracy/main.nf b/modules/nf-core/openms/idmassaccuracy/main.nf index 819720e2..ddf1acd2 100644 --- a/modules/nf-core/openms/idmassaccuracy/main.nf +++ b/modules/nf-core/openms/idmassaccuracy/main.nf @@ -19,6 +19,14 @@ process OPENMS_IDMASSACCURACY { task.ext.when == null || task.ext.when script: + def deprecation_message = """ + WARNING: This module has been deprecated. Please use nf-core/modules/path/to/new/module + + Reason: + This module is no longer fit for purpose because not part of openms 3.5.0 version anymore + """ + assert false: deprecation_message + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" @@ -32,11 +40,19 @@ process OPENMS_IDMASSACCURACY { cat <<-END_VERSIONS > versions.yml "${task.process}": - OpenMS: \$(FileInfo 2>&1 | grep -E '^Version(.*)' | cut -d ' ' -f 2 | cut -d '-' -f 1) + OpenMS: \$(FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p') END_VERSIONS """ stub: + def deprecation_message = """ + WARNING: This module has been deprecated. Please use nf-core/modules/path/to/new/module + + Reason: + This module is no longer fit for purpose because not part of openms 3.5.0 version anymore + """ + assert false: deprecation_message + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" @@ -46,7 +62,7 @@ process OPENMS_IDMASSACCURACY { cat <<-END_VERSIONS > versions.yml "${task.process}": - OpenMS: \$(FileInfo 2>&1 | grep -E '^Version(.*)' | cut -d ' ' -f 2 | cut -d '-' -f 1) + OpenMS: \$(FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p') END_VERSIONS """ } diff --git a/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test b/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test index 5f5d5e9d..5d66fcdb 100644 --- a/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test +++ b/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test @@ -18,7 +18,7 @@ nextflow_process { script "../../../thermorawfileparser/main.nf" process { """ - input[0] = channel.of([ + input[0] = Channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/msspectra/PXD012083_e005640_II.raw', checkIfExists: true) ]) @@ -29,7 +29,7 @@ nextflow_process { script "../../../openms/decoydatabase/main.nf" process { """ - input[0] = channel.of([ + input[0] = Channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/database/UP000005640_9606.fasta', checkIfExists: true) ]) @@ -56,8 +56,8 @@ nextflow_process { } then { assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert process.failed }, + { assert process.errorReport.contains("WARNING: This module has been deprecated.")} ) } } @@ -73,8 +73,8 @@ nextflow_process { } then { assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert process.failed }, + { assert process.errorReport.contains("WARNING: This module has been deprecated.")} ) } } diff --git a/modules/nf-core/openms/idmerger/environment.yml b/modules/nf-core/openms/idmerger/environment.yml index d85a93ef..c8bad1b9 100644 --- a/modules/nf-core/openms/idmerger/environment.yml +++ b/modules/nf-core/openms/idmerger/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::openms=3.4.1 + - bioconda::openms=3.5.0 diff --git a/modules/nf-core/openms/idmerger/main.nf b/modules/nf-core/openms/idmerger/main.nf index 421a77f8..ff93ee06 100644 --- a/modules/nf-core/openms/idmerger/main.nf +++ b/modules/nf-core/openms/idmerger/main.nf @@ -4,15 +4,15 @@ process OPENMS_IDMERGER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(idxmls) output: tuple val(meta), path("*.idXML"), emit: idxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -27,11 +27,6 @@ process OPENMS_IDMERGER { -out ${prefix}.idXML \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -40,10 +35,5 @@ process OPENMS_IDMERGER { """ touch ${prefix}.idXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/idmerger/meta.yml b/modules/nf-core/openms/idmerger/meta.yml index 002fc578..379a5888 100644 --- a/modules/nf-core/openms/idmerger/meta.yml +++ b/modules/nf-core/openms/idmerger/meta.yml @@ -41,12 +41,28 @@ output: description: Merged idXML output file pattern: "*.{idXML}" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" diff --git a/modules/nf-core/openms/idmerger/tests/main.nf.test b/modules/nf-core/openms/idmerger/tests/main.nf.test index 2f1c3b21..a5b0cb35 100644 --- a/modules/nf-core/openms/idmerger/tests/main.nf.test +++ b/modules/nf-core/openms/idmerger/tests/main.nf.test @@ -14,7 +14,7 @@ nextflow_process { when { process { """ - input[0] = channel.of([ + input[0] = Channel.of([ [ id:'test'], // meta map [ file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true), file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep2_small.idXML', checkIfExists: true)] @@ -26,8 +26,8 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.versions).match()}, - + { assert snapshot(process.out.versions_openms).match()}, + // check single line substrings in output idxml file { assert path(process.out.idxml.get(0).get(1)).readLines().any { it.contains("") }}, { assert path(process.out.idxml.get(0).get(1)).readLines().any { it.contains("") }}, @@ -45,7 +45,7 @@ nextflow_process { when { process { """ - input[0] = channel.of([ + input[0] = Channel.of([ [ id:'test'], // meta map [ file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true), file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep2_small.idXML', checkIfExists: true)] diff --git a/modules/nf-core/openms/idmerger/tests/main.nf.test.snap b/modules/nf-core/openms/idmerger/tests/main.nf.test.snap index a2edce86..13e6f7a8 100644 --- a/modules/nf-core/openms/idmerger/tests/main.nf.test.snap +++ b/modules/nf-core/openms/idmerger/tests/main.nf.test.snap @@ -2,14 +2,18 @@ "proteomics - openms - idxml": { "content": [ [ - "versions.yml:md5,80b0fb4560c930fd7b9c31dbbd3f66d2" + [ + "OPENMS_IDMERGER", + "openms", + "3.5.0" + ] ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:54:12.914656629" + "timestamp": "2026-01-12T10:06:10.948172124" }, "proteomics - openms - idxml - stub": { "content": [ @@ -23,7 +27,11 @@ ] ], "1": [ - "versions.yml:md5,80b0fb4560c930fd7b9c31dbbd3f66d2" + [ + "OPENMS_IDMERGER", + "openms", + "3.5.0" + ] ], "idxml": [ [ @@ -33,8 +41,12 @@ "test.idXML:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,80b0fb4560c930fd7b9c31dbbd3f66d2" + "versions_openms": [ + [ + "OPENMS_IDMERGER", + "openms", + "3.5.0" + ] ] } ], @@ -42,6 +54,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:54:41.780756135" + "timestamp": "2026-01-12T10:06:23.802686751" } } \ No newline at end of file diff --git a/modules/nf-core/openms/idripper/environment.yml b/modules/nf-core/openms/idripper/environment.yml index ad4685c0..fd1026d7 100644 --- a/modules/nf-core/openms/idripper/environment.yml +++ b/modules/nf-core/openms/idripper/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::openms=3.4.1" + - "bioconda::openms=3.5.0" diff --git a/modules/nf-core/openms/idripper/main.nf b/modules/nf-core/openms/idripper/main.nf index e545b906..7086be23 100644 --- a/modules/nf-core/openms/idripper/main.nf +++ b/modules/nf-core/openms/idripper/main.nf @@ -4,15 +4,15 @@ process OPENMS_IDRIPPER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1': - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0': + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(merged_idxml) output: tuple val(meta), path("*.idXML"), emit: idxmls - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -27,11 +27,6 @@ process OPENMS_IDRIPPER { -out . \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -41,10 +36,5 @@ process OPENMS_IDRIPPER { """ touch ${prefix}_1.idXML touch ${prefix}_2.idXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/idripper/meta.yml b/modules/nf-core/openms/idripper/meta.yml index 72e62935..47ee04f5 100644 --- a/modules/nf-core/openms/idripper/meta.yml +++ b/modules/nf-core/openms/idripper/meta.yml @@ -1,6 +1,6 @@ name: openms_idripper -description: Split a merged identification file into their originating identification - files +description: Split a merged identification file into their originating + identification files keywords: - split - idXML @@ -40,13 +40,29 @@ output: description: Multiple idXML files pattern: "*.{idXML}" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openms/idripper/tests/main.nf.test b/modules/nf-core/openms/idripper/tests/main.nf.test index 1f252316..1e9b40d7 100644 --- a/modules/nf-core/openms/idripper/tests/main.nf.test +++ b/modules/nf-core/openms/idripper/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { script "../../idmerger/main.nf" process { """ - input[0] = channel.fromList([ + input[0] = Channel.fromList([ tuple([id:'test'], [ file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true), diff --git a/modules/nf-core/openms/idripper/tests/main.nf.test.snap b/modules/nf-core/openms/idripper/tests/main.nf.test.snap index 6192f348..07853ac9 100644 --- a/modules/nf-core/openms/idripper/tests/main.nf.test.snap +++ b/modules/nf-core/openms/idripper/tests/main.nf.test.snap @@ -14,7 +14,11 @@ ] ], "1": [ - "versions.yml:md5,3949806b2abeb3db36c6dc0596f39a14" + [ + "OPENMS_IDRIPPER", + "openms", + "3.5.0" + ] ], "idxmls": [ [ @@ -27,8 +31,12 @@ ] ] ], - "versions": [ - "versions.yml:md5,3949806b2abeb3db36c6dc0596f39a14" + "versions_openms": [ + [ + "OPENMS_IDRIPPER", + "openms", + "3.5.0" + ] ] } ], @@ -36,7 +44,7 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:55:11.687007226" + "timestamp": "2026-01-12T10:06:47.478212501" }, "proteomics - split - idxml - stub": { "content": [ @@ -53,7 +61,11 @@ ] ], "1": [ - "versions.yml:md5,3949806b2abeb3db36c6dc0596f39a14" + [ + "OPENMS_IDRIPPER", + "openms", + "3.5.0" + ] ], "idxmls": [ [ @@ -66,8 +78,12 @@ ] ] ], - "versions": [ - "versions.yml:md5,3949806b2abeb3db36c6dc0596f39a14" + "versions_openms": [ + [ + "OPENMS_IDRIPPER", + "openms", + "3.5.0" + ] ] } ], @@ -75,6 +91,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:55:38.405209447" + "timestamp": "2026-01-12T10:07:10.700393001" } } \ No newline at end of file diff --git a/modules/nf-core/openms/idscoreswitcher/environment.yml b/modules/nf-core/openms/idscoreswitcher/environment.yml index ad4685c0..fd1026d7 100644 --- a/modules/nf-core/openms/idscoreswitcher/environment.yml +++ b/modules/nf-core/openms/idscoreswitcher/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::openms=3.4.1" + - "bioconda::openms=3.5.0" diff --git a/modules/nf-core/openms/idscoreswitcher/main.nf b/modules/nf-core/openms/idscoreswitcher/main.nf index 6911b2c5..0f4afdc2 100644 --- a/modules/nf-core/openms/idscoreswitcher/main.nf +++ b/modules/nf-core/openms/idscoreswitcher/main.nf @@ -4,15 +4,15 @@ process OPENMS_IDSCORESWITCHER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1': - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0': + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(idxml) output: tuple val(meta), path("*.idXML"), emit: idxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -28,11 +28,6 @@ process OPENMS_IDSCORESWITCHER { -out ${prefix}.idXML \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -42,10 +37,5 @@ process OPENMS_IDSCORESWITCHER { """ touch ${prefix}.idXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/idscoreswitcher/meta.yml b/modules/nf-core/openms/idscoreswitcher/meta.yml index 2a00b66b..fe1fbd3e 100644 --- a/modules/nf-core/openms/idscoreswitcher/meta.yml +++ b/modules/nf-core/openms/idscoreswitcher/meta.yml @@ -1,6 +1,6 @@ name: "openms_idscoreswitcher" -description: Switches between different scores of peptide or protein hits in identification - data +description: Switches between different scores of peptide or protein hits in + identification data keywords: - switch - score @@ -43,13 +43,29 @@ output: obtained from a specified meta value pattern: "*.{idXML}" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openms/idscoreswitcher/tests/main.nf.test.snap b/modules/nf-core/openms/idscoreswitcher/tests/main.nf.test.snap index c9d84825..35fe46f0 100644 --- a/modules/nf-core/openms/idscoreswitcher/tests/main.nf.test.snap +++ b/modules/nf-core/openms/idscoreswitcher/tests/main.nf.test.snap @@ -11,7 +11,11 @@ ] ], "1": [ - "versions.yml:md5,658341a6b21a155b1c141c94c54c4ae3" + [ + "OPENMS_IDSCORESWITCHER", + "openms", + "3.5.0" + ] ], "idxml": [ [ @@ -21,8 +25,12 @@ "test.idXML:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,658341a6b21a155b1c141c94c54c4ae3" + "versions_openms": [ + [ + "OPENMS_IDSCORESWITCHER", + "openms", + "3.5.0" + ] ] } ], @@ -30,7 +38,7 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T09:04:11.118518193" + "timestamp": "2026-01-12T10:07:57.184605459" }, "proteomics - switch_score - idxml": { "content": [ @@ -44,7 +52,11 @@ ] ], "1": [ - "versions.yml:md5,658341a6b21a155b1c141c94c54c4ae3" + [ + "OPENMS_IDSCORESWITCHER", + "openms", + "3.5.0" + ] ], "idxml": [ [ @@ -54,8 +66,12 @@ "test.idXML:md5,0db3dfe3dc491ec94ebd951ca6e2c2e4" ] ], - "versions": [ - "versions.yml:md5,658341a6b21a155b1c141c94c54c4ae3" + "versions_openms": [ + [ + "OPENMS_IDSCORESWITCHER", + "openms", + "3.5.0" + ] ] } ], @@ -63,6 +79,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T09:03:44.673575882" + "timestamp": "2026-01-12T10:07:32.62082728" } } \ No newline at end of file diff --git a/modules/nf-core/openms/peakpickerhires/environment.yml b/modules/nf-core/openms/peakpickerhires/environment.yml index 664bf59d..7b287592 100644 --- a/modules/nf-core/openms/peakpickerhires/environment.yml +++ b/modules/nf-core/openms/peakpickerhires/environment.yml @@ -2,4 +2,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::openms=3.4.1" + - "bioconda::openms=3.5.0" diff --git a/modules/nf-core/openms/peakpickerhires/main.nf b/modules/nf-core/openms/peakpickerhires/main.nf index 9ac6e935..c30b79aa 100644 --- a/modules/nf-core/openms/peakpickerhires/main.nf +++ b/modules/nf-core/openms/peakpickerhires/main.nf @@ -4,15 +4,15 @@ process OPENMS_PEAKPICKERHIRES { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(mzml) output: tuple val(meta), path("*.mzML"), emit: mzml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -27,11 +27,6 @@ process OPENMS_PEAKPICKERHIRES { -out ${prefix}.mzML \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -40,10 +35,5 @@ process OPENMS_PEAKPICKERHIRES { """ touch ${prefix}.mzML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/peakpickerhires/meta.yml b/modules/nf-core/openms/peakpickerhires/meta.yml index db8feaad..100c5b19 100644 --- a/modules/nf-core/openms/peakpickerhires/meta.yml +++ b/modules/nf-core/openms/peakpickerhires/meta.yml @@ -1,6 +1,6 @@ name: "openms_peakpickerhires" -description: A tool for peak detection in high-resolution profile data (Orbitrap or - FTICR) +description: A tool for peak detection in high-resolution profile data (Orbitrap + or FTICR) keywords: - peak picking - mzml @@ -40,13 +40,29 @@ output: description: Peak-picked mass spectrometer output file in mzML format pattern: "*.{mzML}" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openms/peakpickerhires/tests/main.nf.test b/modules/nf-core/openms/peakpickerhires/tests/main.nf.test index df2071c4..563aa777 100644 --- a/modules/nf-core/openms/peakpickerhires/tests/main.nf.test +++ b/modules/nf-core/openms/peakpickerhires/tests/main.nf.test @@ -26,7 +26,7 @@ nextflow_process { assertAll( { assert process.success }, { assert path(process.out.mzml.get(0).get(1)).readLines().contains('\t\t\t') }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(process.out.versions_openms).match() } ) } diff --git a/modules/nf-core/openms/peakpickerhires/tests/main.nf.test.snap b/modules/nf-core/openms/peakpickerhires/tests/main.nf.test.snap index 83f15738..a3d88062 100644 --- a/modules/nf-core/openms/peakpickerhires/tests/main.nf.test.snap +++ b/modules/nf-core/openms/peakpickerhires/tests/main.nf.test.snap @@ -2,14 +2,18 @@ "proteomics - mzML": { "content": [ [ - "versions.yml:md5,69c600d25edebd411ef84718668821df" + [ + "OPENMS_PEAKPICKERHIRES", + "openms", + "3.5.0" + ] ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T09:07:00.776951188" + "timestamp": "2026-01-12T10:08:19.636849899" }, "proteomics - mzML - stub": { "content": [ @@ -23,7 +27,11 @@ ] ], "1": [ - "versions.yml:md5,69c600d25edebd411ef84718668821df" + [ + "OPENMS_PEAKPICKERHIRES", + "openms", + "3.5.0" + ] ], "mzml": [ [ @@ -33,8 +41,12 @@ "test_stub.mzML:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,69c600d25edebd411ef84718668821df" + "versions_openms": [ + [ + "OPENMS_PEAKPICKERHIRES", + "openms", + "3.5.0" + ] ] } ], @@ -42,6 +54,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T09:07:18.50818535" + "timestamp": "2026-01-12T10:08:41.181970232" } } \ No newline at end of file diff --git a/modules/nf-core/openms/peptideindexer/environment.yml b/modules/nf-core/openms/peptideindexer/environment.yml index ad4685c0..fd1026d7 100644 --- a/modules/nf-core/openms/peptideindexer/environment.yml +++ b/modules/nf-core/openms/peptideindexer/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::openms=3.4.1" + - "bioconda::openms=3.5.0" diff --git a/modules/nf-core/openms/peptideindexer/main.nf b/modules/nf-core/openms/peptideindexer/main.nf index 1456a908..d94a0257 100644 --- a/modules/nf-core/openms/peptideindexer/main.nf +++ b/modules/nf-core/openms/peptideindexer/main.nf @@ -4,15 +4,15 @@ process OPENMS_PEPTIDEINDEXER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(idxml), path(fasta) output: tuple val(meta), path("*.idXML"), emit: indexed_idxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -30,11 +30,6 @@ process OPENMS_PEPTIDEINDEXER { -out ${prefix}.idXML \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -43,10 +38,5 @@ process OPENMS_PEPTIDEINDEXER { """ touch ${prefix}.idXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/openms/peptideindexer/meta.yml b/modules/nf-core/openms/peptideindexer/meta.yml index 1c200b5d..a635472f 100644 --- a/modules/nf-core/openms/peptideindexer/meta.yml +++ b/modules/nf-core/openms/peptideindexer/meta.yml @@ -43,13 +43,29 @@ output: description: Refreshed idXML identification file pattern: "*.idXML" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openms/peptideindexer/tests/main.nf.test b/modules/nf-core/openms/peptideindexer/tests/main.nf.test index c4533b2e..ecc2b005 100644 --- a/modules/nf-core/openms/peptideindexer/tests/main.nf.test +++ b/modules/nf-core/openms/peptideindexer/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { script "../../decoydatabase/main.nf" process { """ - input[0] = channel.of([ + input[0] = Channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/database/UP000005640_9606.fasta', checkIfExists: true) ]) @@ -30,7 +30,7 @@ nextflow_process { when { process { """ - input[0] = channel.of([ + input[0] = Channel.of([ [id:'test'], file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true) ]).join(OPENMS_DECOYDATABASE.out.decoy_fasta) @@ -53,7 +53,7 @@ nextflow_process { when { process { """ - input[0] = channel.of([ + input[0] = Channel.of([ [id:'test'], file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true) ]).join(OPENMS_DECOYDATABASE.out.decoy_fasta) diff --git a/modules/nf-core/openms/peptideindexer/tests/main.nf.test.snap b/modules/nf-core/openms/peptideindexer/tests/main.nf.test.snap index 0aa17984..9c849cb4 100644 --- a/modules/nf-core/openms/peptideindexer/tests/main.nf.test.snap +++ b/modules/nf-core/openms/peptideindexer/tests/main.nf.test.snap @@ -11,7 +11,11 @@ ] ], "1": [ - "versions.yml:md5,c2965a55db2530b792b1620a935107d2" + [ + "OPENMS_PEPTIDEINDEXER", + "openms", + "3.5.0" + ] ], "indexed_idxml": [ [ @@ -21,8 +25,12 @@ "test_indexed.idXML:md5,ab771bf6bec1b88babd608cbf3b57144" ] ], - "versions": [ - "versions.yml:md5,c2965a55db2530b792b1620a935107d2" + "versions_openms": [ + [ + "OPENMS_PEPTIDEINDEXER", + "openms", + "3.5.0" + ] ] } ], @@ -30,7 +38,7 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:11:48.453753483" + "timestamp": "2026-01-12T10:09:11.498692207" }, "proteomics - refresh_idxml - stub": { "content": [ @@ -44,7 +52,11 @@ ] ], "1": [ - "versions.yml:md5,c2965a55db2530b792b1620a935107d2" + [ + "OPENMS_PEPTIDEINDEXER", + "openms", + "3.5.0" + ] ], "indexed_idxml": [ [ @@ -54,8 +66,12 @@ "test_indexed.idXML:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,c2965a55db2530b792b1620a935107d2" + "versions_openms": [ + [ + "OPENMS_PEPTIDEINDEXER", + "openms", + "3.5.0" + ] ] } ], @@ -63,6 +79,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:12:25.400421367" + "timestamp": "2026-01-12T10:09:30.793034749" } } \ No newline at end of file diff --git a/modules/nf-core/openmsthirdparty/cometadapter/environment.yml b/modules/nf-core/openmsthirdparty/cometadapter/environment.yml index 7e9c2818..45f695a6 100644 --- a/modules/nf-core/openmsthirdparty/cometadapter/environment.yml +++ b/modules/nf-core/openmsthirdparty/cometadapter/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::openms-thirdparty=3.4.1" + - "bioconda::openms-thirdparty=3.5.0" diff --git a/modules/nf-core/openmsthirdparty/cometadapter/main.nf b/modules/nf-core/openmsthirdparty/cometadapter/main.nf index 27fc32fd..14e85a3f 100644 --- a/modules/nf-core/openmsthirdparty/cometadapter/main.nf +++ b/modules/nf-core/openmsthirdparty/cometadapter/main.nf @@ -4,8 +4,8 @@ process OPENMSTHIRDPARTY_COMETADAPTER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms-thirdparty:3.4.1--h9ee0642_1' : - 'biocontainers/openms-thirdparty:3.4.1--h9ee0642_1' }" + 'https://depot.galaxyproject.org/singularity/openms-thirdparty:3.5.0--h9ee0642_0' : + 'biocontainers/openms-thirdparty:3.5.0--h9ee0642_0' }" input: tuple val(meta), path(mzml), path(fasta) @@ -13,7 +13,8 @@ process OPENMSTHIRDPARTY_COMETADAPTER { output: tuple val(meta), path("*.idXML"), emit: idxml tuple val(meta), path("*.tsv") , emit: pin, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('CometAdapter'), eval("CometAdapter --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_cometadapter, topic: versions + tuple val("${task.process}"), val('Comet'), eval("comet 2>&1 | sed -n 's/.*Comet version \" *\\(.*\\)\".*/\\1/p'"), emit: versions_comet, topic: versions when: task.ext.when == null || task.ext.when @@ -29,13 +30,6 @@ process OPENMSTHIRDPARTY_COMETADAPTER { -out ${prefix}.idXML \\ -threads $task.cpus \\ $args - - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - CometAdapter: \$(CometAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1 | cut -d '-' -f 1) - Comet: \$(comet 2>&1 | grep -E "Comet version.*" | sed 's/Comet version //g' | sed 's/"//g') - END_VERSIONS """ stub: @@ -45,11 +39,5 @@ process OPENMSTHIRDPARTY_COMETADAPTER { """ touch ${prefix}.idXML touch ${prefix}_pin.tsv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - CometAdapter: \$(CometAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1 | cut -d '-' -f 1) - Comet: \$(comet 2>&1 | grep -E "Comet version.*" | sed 's/Comet version //g' | sed 's/"//g') - END_VERSIONS """ } diff --git a/modules/nf-core/openmsthirdparty/cometadapter/meta.yml b/modules/nf-core/openmsthirdparty/cometadapter/meta.yml index 50c1e1e4..70cda434 100644 --- a/modules/nf-core/openmsthirdparty/cometadapter/meta.yml +++ b/modules/nf-core/openmsthirdparty/cometadapter/meta.yml @@ -16,7 +16,18 @@ tools: doi: "10.1038/s41592-024-02197-7" licence: ["BSD"] identifier: "" + - CometAdapter: + description: "Annotates MS/MS spectra using Comet." + homepage: "https://openms.de" + documentation: "https://openms.readthedocs.io/en/latest/index.html" + identifier: "" + - Comet: + description: "Comet is an open source tandem mass spectrometry (MS/MS) sequence + database search tool." + homepage: "http://comet-ms.sourceforge.net/" + documentation: "http://comet-ms.sourceforge.net/" + identifier: "" input: - - meta: type: map @@ -57,13 +68,48 @@ output: pattern: "*.{tsv}" ontologies: - edam: http://edamontology.org/format_3475 # TSV + versions_cometadapter: + - - ${task.process}: + type: string + description: The name of the process + - CometAdapter: + type: string + description: The name of the tool + - "CometAdapter --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + versions_comet: + - - ${task.process}: + type: string + description: The name of the process + - Comet: + type: string + description: The name of the tool + - comet 2>&1 | sed -n 's/.*Comet version " *\(.*\)".*/\1/p': + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - CometAdapter: + type: string + description: The name of the tool + - "CometAdapter --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The name of the process + - Comet: + type: string + description: The name of the tool + - comet 2>&1 | sed -n 's/.*Comet version " *\(.*\)".*/\1/p': + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test b/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test index a94b41e9..de1d7df6 100644 --- a/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test +++ b/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test @@ -18,7 +18,7 @@ nextflow_process { script "../../../thermorawfileparser/main.nf" process { """ - input[0] = channel.of([ + input[0] = Channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/msspectra/PXD012083_e005640_II.raw', checkIfExists: true) ]) @@ -30,7 +30,7 @@ nextflow_process { script "../../../openms/decoydatabase/main.nf" process { """ - input[0] = channel.of([ + input[0] = Channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/database/UP000005640_9606.fasta', checkIfExists: true) ]) @@ -59,7 +59,7 @@ nextflow_process { // Make sure the file is not empty assert file(process.out.idxml[0][1]).readLines().any { it.contains('ProteinHit') } assert file(process.out.idxml[0][1]).readLines().any { it.contains('PeptideHit') } - assert snapshot(path(process.out.versions.get(0)).yaml).match("versions") + assert snapshot(process.out.versions_cometadapter, process.out.versions_comet).match("versions") } } diff --git a/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test.snap b/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test.snap index 81a248a8..7fd6dbba 100644 --- a/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test.snap +++ b/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test.snap @@ -43,17 +43,25 @@ }, "versions": { "content": [ - { - "OPENMSTHIRDPARTY_COMETADAPTER": { - "CometAdapter": "3.4.1", - "Comet": "2024.01 rev. 1" - } - } + [ + [ + "OPENMSTHIRDPARTY_COMETADAPTER", + "CometAdapter", + "3.5.0" + ] + ], + [ + [ + "OPENMSTHIRDPARTY_COMETADAPTER", + "Comet", + "2024.01 rev. 1" + ] + ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:16:50.757046344" + "timestamp": "2026-01-12T12:27:11.62435964" } } \ No newline at end of file From 8f939b7d67a17747da1b00f6b31a61c2fffca710 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 23 Jan 2026 21:00:23 +0000 Subject: [PATCH 025/104] Update local modules to use topic channels for versions --- modules/local/easypqp/convert/main.nf | 12 +--- modules/local/easypqp/library/main.nf | 12 +--- modules/local/epicore/main.nf | 12 +--- modules/local/ms2rescore/main.nf | 12 +--- .../featurefinderidentification/main.nf | 12 +--- modules/local/openms/fileconverter/main.nf | 12 +--- .../local/openms/idconflictresolver/main.nf | 12 +--- .../openms/mapaligneridentification/main.nf | 12 +--- modules/local/openms/maprttransformer/main.nf | 12 +--- modules/local/openms/mztabexporter/main.nf | 12 +--- .../local/openms/psmfeatureextractor/main.nf | 12 +--- modules/local/openms/textexporter/main.nf | 12 +--- .../featurelinkerunlabeledkd/main.nf | 12 +--- .../percolatoradapter/main.nf | 14 +--- .../pyopenms/chromatogramextractor/main.nf | 12 +--- modules/local/pyopenms/ionannotator/main.nf | 13 +--- modules/local/tdf2mzml/main.nf | 14 +--- modules/local/untar/main.nf | 12 +--- modules/local/untar/meta.yml | 64 ++++++++++++------- modules/local/unzip/main.nf | 12 +--- modules/local/unzip/meta.yml | 64 ++++++++++++------- 21 files changed, 103 insertions(+), 258 deletions(-) diff --git a/modules/local/easypqp/convert/main.nf b/modules/local/easypqp/convert/main.nf index 45387cdc..82b0d399 100644 --- a/modules/local/easypqp/convert/main.nf +++ b/modules/local/easypqp/convert/main.nf @@ -14,7 +14,7 @@ process EASYPQP_CONVERT { output: tuple val(meta), path("*.psmpkl") , emit: psmpkl tuple val(meta), path("*.peakpkl"), emit: peakpkl - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('easypqp'), eval("\$(easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\d+\.\d+\.\d+')"), emit: versions_easypqp, topic: versions when: task.ext.when == null || task.ext.when @@ -32,11 +32,6 @@ process EASYPQP_CONVERT { --spectra $spectra \\ --unimod $unimod \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - easypqp: \$(easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\\d+\\.\\d+\\.\\d+') - END_VERSIONS """ stub: @@ -49,10 +44,5 @@ process EASYPQP_CONVERT { touch "${prefix}.psmpkl" touch "${prefix}.peakpkl" - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - easypqp: \$(easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\\d+\\.\\d+\\.\\d+') - END_VERSIONS """ } diff --git a/modules/local/easypqp/library/main.nf b/modules/local/easypqp/library/main.nf index 6f720fb1..db869e09 100644 --- a/modules/local/easypqp/library/main.nf +++ b/modules/local/easypqp/library/main.nf @@ -12,7 +12,7 @@ process EASYPQP_LIBRARY { output: tuple val(meta), path("*.tsv") , emit: tsv - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('easypqp'), eval("\$(easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\d+\.\d+\.\d+')"), emit: versions_easypqp, topic: versions when: task.ext.when == null || task.ext.when @@ -30,11 +30,6 @@ process EASYPQP_LIBRARY { --out ${prefix}_speclib.tsv \ $args \ $psmpkl $peakpkl - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - easypqp: \$(easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\\d+\\.\\d+\\.\\d+') - END_VERSIONS """ stub: @@ -46,10 +41,5 @@ process EASYPQP_LIBRARY { mkdir -p \$MPLCONFIGDIR \$XDG_CACHE_HOME touch "${prefix}_speclib.tsv" - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - easypqp: \$(easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\\d+\\.\\d+\\.\\d+') - END_VERSIONS """ } diff --git a/modules/local/epicore/main.nf b/modules/local/epicore/main.nf index a04efff9..a09e8c82 100644 --- a/modules/local/epicore/main.nf +++ b/modules/local/epicore/main.nf @@ -16,7 +16,7 @@ process EPICORE { path "${result_tsv}", emit: final_epicore_tsv path "epicore_length_distribution.html", emit: length_dist path "epicore_intensity_histogram.html", emit: intensity_hist - path "versions.yml", emit: versions + tuple val("${task.process}"), val('epicore'), eval("\$(echo \$(epicore --version) | grep 'epicore' | cut -d ' ' -f3 | cut -c2-)"), emit: versions_epicore, topic: versions script: def args = task.ext.args ?: '' @@ -32,11 +32,6 @@ process EPICORE { # Add epicore statistics to MultiQC general stats table wc -l < epitopes.csv | awk '{print \$1 - 1}' > epicores.txt awk 'NR==1 {print \$0 ",# Epicores"; next} NR==2 {getline extra < "epicores.txt"; print \$0 "," extra}' $general_stats > _modified_$general_stats - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - epicore: \$(echo \$(epicore --version) | grep 'epicore' | cut -d ' ' -f3 | cut -c2-) - END_VERSIONS """ stub: @@ -47,10 +42,5 @@ process EPICORE { touch ${prefix}.tsv touch epicore_length_distribution.html touch epicore_intensity_hist.html - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - epicore: \$(echo \$(epicore --version) | grep 'epicore' | cut -d ' ' -f3 | cut -c2-) - END_VERSIONS """ } diff --git a/modules/local/ms2rescore/main.nf b/modules/local/ms2rescore/main.nf index 06fcb72a..f9d795b6 100644 --- a/modules/local/ms2rescore/main.nf +++ b/modules/local/ms2rescore/main.nf @@ -17,7 +17,7 @@ process MS2RESCORE { tuple val(meta), path("*ms2rescore.idXML") , emit: idxml tuple val(meta), path("*feature_names.tsv"), emit: feature_names tuple val(meta), path("*.html" ) , optional:true, emit: html - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('MS²Rescore'), eval("\$(echo \$(ms2rescore --version 2>&1) | grep -oP 'MS²Rescore \(v\K[^\)]+' ))"), emit: versions_ms2rescore, topic: versions when: task.ext.when == null || task.ext.when @@ -33,11 +33,6 @@ process MS2RESCORE { --output_path ${prefix}.idXML \\ --processes $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - MS²Rescore: \$(echo \$(ms2rescore --version 2>&1) | grep -oP 'MS²Rescore \\(v\\K[^\\)]+' )) - END_VERSIONS """ stub: @@ -47,10 +42,5 @@ process MS2RESCORE { touch ${prefix}.idXML touch ${meta.id}_feature_names.tsv touch ${meta.id}.html - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - MS²Rescore: \$(echo \$(ms2rescore --version 2>&1) | grep -oP 'MS²Rescore \\(v\\K[^\\)]+' )) - END_VERSIONS """ } diff --git a/modules/local/openms/featurefinderidentification/main.nf b/modules/local/openms/featurefinderidentification/main.nf index 794455ec..cfb7abc2 100644 --- a/modules/local/openms/featurefinderidentification/main.nf +++ b/modules/local/openms/featurefinderidentification/main.nf @@ -13,7 +13,7 @@ process OPENMS_FEATUREFINDERIDENTIFICATION { output: tuple val(meta), path("*.featureXML"), emit: featurexml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -29,11 +29,6 @@ process OPENMS_FEATUREFINDERIDENTIFICATION { -out ${prefix}.featureXML \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -41,10 +36,5 @@ process OPENMS_FEATUREFINDERIDENTIFICATION { """ touch ${prefix}.featureXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openms/fileconverter/main.nf b/modules/local/openms/fileconverter/main.nf index 71d2b781..204038ba 100644 --- a/modules/local/openms/fileconverter/main.nf +++ b/modules/local/openms/fileconverter/main.nf @@ -12,7 +12,7 @@ process OPENMS_FILECONVERTER { output: tuple val(meta), path("*.${suffix}"), emit: consensusxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -25,11 +25,6 @@ process OPENMS_FILECONVERTER { -in $file \\ -out ${prefix}.${suffix} \\ -threads $task.cpus - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -37,10 +32,5 @@ process OPENMS_FILECONVERTER { """ touch ${prefix}.${suffix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openms/idconflictresolver/main.nf b/modules/local/openms/idconflictresolver/main.nf index 9228ee81..9f5e0cbd 100644 --- a/modules/local/openms/idconflictresolver/main.nf +++ b/modules/local/openms/idconflictresolver/main.nf @@ -12,7 +12,7 @@ process OPENMS_IDCONFLICTRESOLVER { output: tuple val(meta), path("*.consensusXML"), emit: consensusxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -25,11 +25,6 @@ process OPENMS_IDCONFLICTRESOLVER { -in $consensus \\ -out ${prefix}.consensusXML \\ -threads $task.cpus - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -37,10 +32,5 @@ process OPENMS_IDCONFLICTRESOLVER { """ touch ${prefix}.consensusXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openms/mapaligneridentification/main.nf b/modules/local/openms/mapaligneridentification/main.nf index fd19d5c3..a4effe16 100644 --- a/modules/local/openms/mapaligneridentification/main.nf +++ b/modules/local/openms/mapaligneridentification/main.nf @@ -12,7 +12,7 @@ process OPENMS_MAPALIGNERIDENTIFICATION { output: tuple val(meta), path("*.trafoXML"), emit: trafoxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -26,11 +26,6 @@ process OPENMS_MAPALIGNERIDENTIFICATION { -in $idxmls \\ -trafo_out ${out_names} \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -38,10 +33,5 @@ process OPENMS_MAPALIGNERIDENTIFICATION { """ touch test1.consensusXML touch test2.consensusXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openms/maprttransformer/main.nf b/modules/local/openms/maprttransformer/main.nf index a2889e35..db3a1117 100644 --- a/modules/local/openms/maprttransformer/main.nf +++ b/modules/local/openms/maprttransformer/main.nf @@ -12,7 +12,7 @@ process OPENMS_MAPRTTRANSFORMER { output: tuple val(meta), path("*_aligned.*"), emit: aligned - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -29,11 +29,6 @@ process OPENMS_MAPRTTRANSFORMER { -out ${prefix}.${fileExt} \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -42,10 +37,5 @@ process OPENMS_MAPRTTRANSFORMER { """ touch ${prefix}.${fileExt} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openms/mztabexporter/main.nf b/modules/local/openms/mztabexporter/main.nf index ee5500b4..31146bf4 100644 --- a/modules/local/openms/mztabexporter/main.nf +++ b/modules/local/openms/mztabexporter/main.nf @@ -12,7 +12,7 @@ process OPENMS_MZTABEXPORTER { output: tuple val(meta), path("*.mzTab"), emit: mztab - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -27,11 +27,6 @@ process OPENMS_MZTABEXPORTER { -out ${prefix}.mzTab \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -39,10 +34,5 @@ process OPENMS_MZTABEXPORTER { """ touch ${prefix}.mzTab - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openms/psmfeatureextractor/main.nf b/modules/local/openms/psmfeatureextractor/main.nf index 870e6519..67a201df 100644 --- a/modules/local/openms/psmfeatureextractor/main.nf +++ b/modules/local/openms/psmfeatureextractor/main.nf @@ -12,7 +12,7 @@ process OPENMS_PSMFEATUREEXTRACTOR { output: tuple val(meta), path("*.idXML"), emit: idxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -31,11 +31,6 @@ process OPENMS_PSMFEATUREEXTRACTOR { -threads $task.cpus \\ -extra \$extra_features \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -43,10 +38,5 @@ process OPENMS_PSMFEATUREEXTRACTOR { """ touch ${prefix}.idXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openms/textexporter/main.nf b/modules/local/openms/textexporter/main.nf index 46dd8f33..9fe85108 100644 --- a/modules/local/openms/textexporter/main.nf +++ b/modules/local/openms/textexporter/main.nf @@ -12,7 +12,7 @@ process OPENMS_TEXTEXPORTER { output: tuple val(meta), path("*.tsv"), emit: tsv - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -29,11 +29,6 @@ process OPENMS_TEXTEXPORTER { -id:add_hit_metavalues 0 \\ -id:peptides_only \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -41,10 +36,5 @@ process OPENMS_TEXTEXPORTER { """ touch ${prefix}.tsv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf index 96ce7b37..a5835395 100644 --- a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf +++ b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf @@ -12,7 +12,7 @@ process OPENMS_FEATURELINKERUNLABELEDKD { output: tuple val(meta), path("*.consensusXML"), emit: consensusxml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when @@ -24,11 +24,6 @@ process OPENMS_FEATURELINKERUNLABELEDKD { FeatureLinkerUnlabeledKD -in $features \\ -out ${prefix}.consensusXML \\ -threads $task.cpus - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms-thirdparty: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ stub: @@ -36,10 +31,5 @@ process OPENMS_FEATURELINKERUNLABELEDKD { """ touch ${prefix}.consensusXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - openms-thirdparty: \$(echo \$(FileInfo --help 2>&1) | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/local/openmsthirdparty/percolatoradapter/main.nf b/modules/local/openmsthirdparty/percolatoradapter/main.nf index 8199ce17..0387f827 100644 --- a/modules/local/openmsthirdparty/percolatoradapter/main.nf +++ b/modules/local/openmsthirdparty/percolatoradapter/main.nf @@ -13,7 +13,7 @@ process OPENMS_PERCOLATORADAPTER { output: tuple val(meta), path("*.idXML") , emit: idxml tuple val(meta), path("*_percolator_feature_weights.tsv"), emit: feature_weights, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('PercolatorAdapter'), eval("\$(PercolatorAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1)"), emit: versions_percolatoradapter, topic: versions when: task.ext.when == null || task.ext.when @@ -28,12 +28,6 @@ process OPENMS_PERCOLATORADAPTER { -out ${prefix}.idXML \\ -threads $task.cpus \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - PercolatorAdapter: \$(PercolatorAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1) - percolator: \$(percolator -h 2>&1 | grep -E '^Percolator version(.*)' | sed 's/Percolator version //g') - END_VERSIONS """ stub: @@ -41,11 +35,5 @@ process OPENMS_PERCOLATORADAPTER { """ touch ${prefix}.idXML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - PercolatorAdapter: \$(PercolatorAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1) - percolator: \$(percolator -h 2>&1 | grep -E '^Percolator version(.*)' | sed 's/Percolator version //g') - END_VERSIONS """ } diff --git a/modules/local/pyopenms/chromatogramextractor/main.nf b/modules/local/pyopenms/chromatogramextractor/main.nf index 33f138e0..f60ebd2d 100644 --- a/modules/local/pyopenms/chromatogramextractor/main.nf +++ b/modules/local/pyopenms/chromatogramextractor/main.nf @@ -12,7 +12,7 @@ process PYOPENMS_CHROMATOGRAMEXTRACTOR { output: tuple val(meta), path("*.csv") , emit: csv - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('pyopenms'), eval("pip show pyopenms | grep Version | sed 's/Version: //'"), emit: versions_pyopenms, topic: versions when: task.ext.when == null || task.ext.when @@ -25,11 +25,6 @@ process PYOPENMS_CHROMATOGRAMEXTRACTOR { chromatogram_extractor.py \\ -in $mzml \\ -out ${prefix}_chrom.csv \\ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - pyopenms: \$(pip show pyopenms | grep Version | sed 's/Version: //') - END_VERSIONS """ stub: @@ -37,10 +32,5 @@ process PYOPENMS_CHROMATOGRAMEXTRACTOR { """ touch ${prefix}_chrom.csv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - pyopenms: \$(pip show pyopenms | grep Version | sed 's/Version: //') - END_VERSIONS """ } diff --git a/modules/local/pyopenms/ionannotator/main.nf b/modules/local/pyopenms/ionannotator/main.nf index cb5f06a6..37fbcc79 100644 --- a/modules/local/pyopenms/ionannotator/main.nf +++ b/modules/local/pyopenms/ionannotator/main.nf @@ -12,7 +12,7 @@ process PYOPENMS_IONANNOTATOR { output: tuple val(meta), path("*.tsv") , emit: tsv - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('pyopenms'), eval("pip show pyopenms | grep Version | sed 's/Version: //'"), emit: versions_pyopenms, topic: versions when: task.ext.when == null || task.ext.when @@ -35,12 +35,6 @@ process PYOPENMS_IONANNOTATOR { $zions \\ $aions \\ $cions - - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - pyopenms: \$(pip show pyopenms | grep Version | sed 's/Version: //') - END_VERSIONS """ stub: @@ -49,10 +43,5 @@ process PYOPENMS_IONANNOTATOR { """ touch ${prefix}_all_peaks.tsv touch ${prefix}_matching_ions.tsv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - pyopenms: \$(pip show pyopenms | grep Version | sed 's/Version: //') - END_VERSIONS """ } diff --git a/modules/local/tdf2mzml/main.nf b/modules/local/tdf2mzml/main.nf index b900b81a..ed698aec 100644 --- a/modules/local/tdf2mzml/main.nf +++ b/modules/local/tdf2mzml/main.nf @@ -8,19 +8,13 @@ process TDF2MZML { output: tuple val(meta), path("*.mzML"), emit: mzml - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('tdf2mzml'), val('0.4'), emit: versions_tdf2mzml, topic: versions script: def prefix = task.ext.prefix ?: "${tdf.simpleName}" """ tdf2mzml.py -i $tdf -o ${prefix}.mzML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - python: \$(python3 --version | cut -d ' ' -f2) - tdf2mzml: \$(echo 0.3.0) - END_VERSIONS """ stub: @@ -28,11 +22,5 @@ process TDF2MZML { """ touch ${prefix}.mzML - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - python: \$(python3 --version | cut -d ' ' -f2) - tdf2mzml: \$(echo 0.3.0) - END_VERSIONS """ } diff --git a/modules/local/untar/main.nf b/modules/local/untar/main.nf index 35c364b1..4cd90811 100644 --- a/modules/local/untar/main.nf +++ b/modules/local/untar/main.nf @@ -12,7 +12,7 @@ process UNTAR { output: tuple val(meta), path("*.d"), emit: untar - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('untar'), eval("\$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//')"), emit: versions_untar, topic: versions when: task.ext.when == null || task.ext.when @@ -33,11 +33,6 @@ process UNTAR { $archive \\ --strip-components=\$depth \\ $args2 - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') - END_VERSIONS """ stub: @@ -46,10 +41,5 @@ process UNTAR { """ mkdir $prefix touch ${prefix}/file.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') - END_VERSIONS """ } diff --git a/modules/local/untar/meta.yml b/modules/local/untar/meta.yml index a9a2110f..3de4c504 100644 --- a/modules/local/untar/meta.yml +++ b/modules/local/untar/meta.yml @@ -11,29 +11,49 @@ tools: documentation: https://www.gnu.org/software/tar/manual/ licence: ["GPL-3.0-or-later"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - archive: - type: file - description: File to be untar - pattern: "*.{tar}.{gz}" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - archive: + type: file + description: File to be untar + pattern: "*.{tar}.{gz}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - untar: - type: directory - description: Directory containing contents of archive - pattern: "*/" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + untar: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.d": + type: directory + description: Directory containing contents of archive + pattern: "*/" + versions_untar: + - - ${task.process}: + type: string + description: The process the versions were collected from + - untar: + type: string + description: The tool name + - "echo $(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*$//'": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - untar: + type: string + description: The tool name + - "echo $(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*$//'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/local/unzip/main.nf b/modules/local/unzip/main.nf index 5405ef0f..b892eb8d 100644 --- a/modules/local/unzip/main.nf +++ b/modules/local/unzip/main.nf @@ -12,7 +12,7 @@ process UNZIP { output: tuple val(meta), path("*.d"), emit: unzipped_archive - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('7za'), eval("\$(echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//')"), emit: versions_7za, topic: versions when: task.ext.when == null || task.ext.when @@ -28,11 +28,6 @@ process UNZIP { -o"." \\ $args \\ $archive - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - 7za: \$(echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//') - END_VERSIONS """ stub: @@ -40,10 +35,5 @@ process UNZIP { """ touch ${prefix}.d - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - 7za: \$(echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//') - END_VERSIONS """ } diff --git a/modules/local/unzip/meta.yml b/modules/local/unzip/meta.yml index e8e377e2..9c96fd56 100644 --- a/modules/local/unzip/meta.yml +++ b/modules/local/unzip/meta.yml @@ -13,29 +13,49 @@ tools: tool_dev_url: https://sourceforge.net/projects/p7zip" licence: ["LGPL-2.1-or-later"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - archive: - type: file - description: ZIP file - pattern: "*.zip" + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - archive: + type: file + description: ZIP file + pattern: "*.zip" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - unzipped_archive: - type: directory - description: Directory contents of the unzipped archive - pattern: "${archive.baseName}/" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + unzipped_archive: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - unzipped_archive: + type: directory + description: Directory contents of the unzipped archive + pattern: "${archive.baseName}/" + versions_7za: + - - ${task.process}: + type: string + description: The process the versions were collected from + - 7za: + type: string + description: The tool name + - "echo $(7za --help) | sed 's/.*p7zip Version //; s/(.*//'": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - 7za: + type: string + description: The tool name + - "echo $(7za --help) | sed 's/.*p7zip Version //; s/(.*//'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jfy133" maintainers: From d0b1b82817c739cb7dea495aeddc7146e0cf3f3a Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 23 Jan 2026 21:17:37 +0000 Subject: [PATCH 026/104] Remove redundant version parsing and channel creation from subworkflows --- subworkflows/local/map_alignment/main.nf | 5 ----- subworkflows/local/prepare_spectra/main.nf | 8 -------- subworkflows/local/process_feature/main.nf | 6 ------ subworkflows/local/quant/main.nf | 9 --------- subworkflows/local/rescore/main.nf | 9 --------- subworkflows/local/speclib/main.nf | 4 ---- .../local/utils_nfcore_mhcquant_pipeline/main.nf | 1 - 7 files changed, 42 deletions(-) diff --git a/subworkflows/local/map_alignment/main.nf b/subworkflows/local/map_alignment/main.nf index 7ec18631..45769c4f 100644 --- a/subworkflows/local/map_alignment/main.nf +++ b/subworkflows/local/map_alignment/main.nf @@ -14,11 +14,9 @@ workflow MAP_ALIGNMENT { merge_meta_map main: - ch_versions = channel.empty() // Compute group-wise alignment rt transformation OPENMS_MAPALIGNERIDENTIFICATION( ch_runs_to_be_aligned ) - ch_versions = ch_versions.mix(OPENMS_MAPALIGNERIDENTIFICATION.out.versions) // Join run specific trafoXMLs with meta information merge_meta_map @@ -32,7 +30,6 @@ workflow MAP_ALIGNMENT { // Align mzML files using trafoXMLs ch_trafos_mzmls = ch_mzml.join(ch_trafos) OPENMS_MAPRTTRANSFORMERMZML(ch_trafos_mzmls) - ch_versions = ch_versions.mix(OPENMS_MAPRTTRANSFORMERMZML.out.versions) // Align idXMLfiles using trafoXMLs ch_runs_to_be_aligned @@ -45,10 +42,8 @@ workflow MAP_ALIGNMENT { .set { ch_trafos_idxml } OPENMS_MAPRTTRANSFORMERIDXML(ch_trafos_idxml) - ch_versions = ch_versions.mix(OPENMS_MAPRTTRANSFORMERIDXML.out.versions) emit: - versions = ch_versions aligned_idxml = OPENMS_MAPRTTRANSFORMERIDXML.out.aligned aligned_mzml = OPENMS_MAPRTTRANSFORMERMZML.out.aligned } diff --git a/subworkflows/local/prepare_spectra/main.nf b/subworkflows/local/prepare_spectra/main.nf index 751778fa..e2d6c228 100644 --- a/subworkflows/local/prepare_spectra/main.nf +++ b/subworkflows/local/prepare_spectra/main.nf @@ -14,7 +14,6 @@ workflow PREPARE_SPECTRA { ch_samplesheet main: - ch_versions = channel.empty() ch_samplesheet .branch { @@ -36,14 +35,11 @@ workflow PREPARE_SPECTRA { // Raw file conversion THERMORAWFILEPARSER(branched_ms_files.raw) - ch_versions = ch_versions.mix(THERMORAWFILEPARSER.out.versions) // Decompress timsTOF archive for data conversion UNTAR(branched_ms_files.d_tar) - ch_versions = ch_versions.mix(UNTAR.out.versions) UNZIP(branched_ms_files.d_zip) - ch_versions = ch_versions.mix(UNZIP.out.versions) ch_tdf_files = branched_ms_files.d .mix(UNTAR.out.untar, @@ -51,11 +47,9 @@ workflow PREPARE_SPECTRA { // timsTOF data conversion TDF2MZML(ch_tdf_files) - ch_versions = ch_versions.mix(TDF2MZML.out.versions) // Gunzip mzML files GUNZIP(branched_ms_files.mzml_gz) - ch_versions = ch_versions.mix(GUNZIP.out.versions) // Initialize channel for ms files that do not need to be converted ch_ms_files = branched_ms_files.mzml .mix(GUNZIP.out.gunzip, @@ -65,7 +59,6 @@ workflow PREPARE_SPECTRA { // Optional: Run Peak Picking as Preprocessing if (params.run_centroidisation) { OPENMS_PEAKPICKERHIRES(ch_ms_files) - ch_versions = ch_versions.mix(OPENMS_PEAKPICKERHIRES.out.versions) ch_mzml_file = OPENMS_PEAKPICKERHIRES.out.mzml } else { ch_mzml_file = ch_ms_files @@ -73,5 +66,4 @@ workflow PREPARE_SPECTRA { emit: mzml = ch_mzml_file - versions = ch_versions } diff --git a/subworkflows/local/process_feature/main.nf b/subworkflows/local/process_feature/main.nf index 24be4a5d..74776a2d 100644 --- a/subworkflows/local/process_feature/main.nf +++ b/subworkflows/local/process_feature/main.nf @@ -12,14 +12,12 @@ workflow PROCESS_FEATURE { ch_runs_to_be_quantified main: - ch_versions = channel.empty() // Quantify identifications using targeted feature extraction OPENMS_FEATUREFINDERIDENTIFICATION(ch_runs_to_be_quantified).featurexml .map { meta, featurexml -> [ groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), featurexml] } .groupTuple() .set { ch_featuresxmls } - ch_versions = ch_versions.mix(OPENMS_FEATUREFINDERIDENTIFICATION.out.versions) ch_featuresxmls .branch { @@ -30,21 +28,17 @@ workflow PROCESS_FEATURE { // Link extracted features OPENMS_FEATURELINKERUNLABELEDKD(ch_features.multiple) - ch_versions = ch_versions.mix(OPENMS_FEATURELINKERUNLABELEDKD.out.versions) // Single replicate: promote featureXML to consensusXML OPENMS_FILECONVERTER(ch_features.single.map { meta, features -> [ meta, features[0], "consensusXML" ] }) - ch_versions = ch_versions.mix(OPENMS_FILECONVERTER.out.versions) // Resolve conflicting ids matching to the same feature ch_consensus_input = OPENMS_FEATURELINKERUNLABELEDKD.out.consensusxml .mix(OPENMS_FILECONVERTER.out.consensusxml) OPENMS_IDCONFLICTRESOLVER(ch_consensus_input) - ch_versions = ch_versions.mix(OPENMS_IDCONFLICTRESOLVER.out.versions) emit: // Define the information that is returned by this workflow - versions = ch_versions consensusxml = OPENMS_IDCONFLICTRESOLVER.out.consensusxml } diff --git a/subworkflows/local/quant/main.nf b/subworkflows/local/quant/main.nf index ae5b257e..a3ba3444 100644 --- a/subworkflows/local/quant/main.nf +++ b/subworkflows/local/quant/main.nf @@ -25,7 +25,6 @@ workflow QUANT { mzml main: - ch_versions = channel.empty() // Split post-percolator idXML files and manipulate such that we end up with [meta_run1, idxml_run1] [meta_run2, idxml_run2] ... // We need to make sure that the order of the runs is the same as in the mzml files since IDRipper always sorts the runs // (and nextflow does not guarantee the order of the maps in merged_meta_map) @@ -38,12 +37,10 @@ workflow QUANT { .map { meta -> [[spectra:meta.spectra], meta]} ) .map { spectra, idxmls, meta -> [meta, idxmls] } .set { ch_ripped_idxml } - ch_versions = ch_versions.mix(OPENMS_IDRIPPER.out.versions) // Switch to xcorr for filtering since q-values are set to 1 with peptide-level-fdr if (params.fdr_level == 'peptide_level_fdrs'){ ch_runs_score_switched = OPENMS_IDSCORESWITCHER( ch_ripped_idxml ).idxml - ch_versions = ch_versions.mix(OPENMS_IDSCORESWITCHER.out.versions) } else { ch_runs_score_switched = ch_ripped_idxml } @@ -61,7 +58,6 @@ workflow QUANT { .map { meta, idxml -> [ groupKey([id:"${meta.sample}_${meta.condition}"], meta.group_count), idxml] } .groupTuple() .set { ch_runs_to_be_aligned } - ch_versions = ch_versions.mix(OPENMS_IDFILTER_QUANT.out.versions) // Align retention times of runs MAP_ALIGNMENT( @@ -69,13 +65,11 @@ workflow QUANT { mzml, merge_meta_map ) - ch_versions = ch_versions.mix( MAP_ALIGNMENT.out.versions ) // We need to merge groupwise the aligned idxml files together to use them as id_ext in featurefinder OPENMS_IDMERGER_QUANT( MAP_ALIGNMENT.out.aligned_idxml .map { meta, aligned_idxml -> [ groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), aligned_idxml] } .groupTuple()) - ch_versions = ch_versions.mix(OPENMS_IDMERGER_QUANT.out.versions) // Manipulate channels such that we end up with : [meta, mzml, run_idxml, merged_runs_idxml] MAP_ALIGNMENT.out.aligned_mzml @@ -89,12 +83,9 @@ workflow QUANT { .set { ch_runs_to_be_quantified } PROCESS_FEATURE ( ch_runs_to_be_quantified ) - ch_versions = ch_versions.mix(PROCESS_FEATURE.out.versions) OPENMS_MZTABEXPORTER(PROCESS_FEATURE.out.consensusxml) - ch_versions = ch_versions.mix(OPENMS_MZTABEXPORTER.out.versions) emit: consensusxml = PROCESS_FEATURE.out.consensusxml - versions = ch_versions } diff --git a/subworkflows/local/rescore/main.nf b/subworkflows/local/rescore/main.nf index ff41171b..89f24b24 100644 --- a/subworkflows/local/rescore/main.nf +++ b/subworkflows/local/rescore/main.nf @@ -28,11 +28,9 @@ workflow RESCORE { ch_multiqc_files main: - ch_versions = channel.empty() // Compute features via ms2rescore MS2RESCORE(ch_merged_runs) - ch_versions = ch_versions.mix(MS2RESCORE.out.versions) if (params.rescoring_engine == 'mokapot') { log.warn "The rescoring engine is set to mokapot. This rescoring engine currently only supports psm-level-fdr via ms2rescore." @@ -41,22 +39,18 @@ workflow RESCORE { } // Switch comet e-value to mokapot q-value OPENMS_IDSCORESWITCHER(MS2RESCORE.out.idxml) - ch_versions = ch_versions.mix(OPENMS_IDSCORESWITCHER.out.versions) ch_rescored_runs = OPENMS_IDSCORESWITCHER.out.idxml // Filter by mokapot q-value OPENMS_IDFILTER_Q_VALUE(ch_rescored_runs.map {group_meta, idxml -> [group_meta, idxml, []]}) - ch_versions = ch_versions.mix(OPENMS_IDFILTER_Q_VALUE.out.versions) ch_filter_q_value = OPENMS_IDFILTER_Q_VALUE.out.filtered } else { // Extract PSM features for Percolator OPENMS_PSMFEATUREEXTRACTOR(MS2RESCORE.out.idxml.join(MS2RESCORE.out.feature_names)) - ch_versions = ch_versions.mix(OPENMS_PSMFEATUREEXTRACTOR.out.versions) // Run Percolator with local FDR OPENMS_PERCOLATORADAPTER(OPENMS_PSMFEATUREEXTRACTOR.out.idxml) - ch_versions = ch_versions.mix(OPENMS_PERCOLATORADAPTER.out.versions) ch_multiqc_files = ch_multiqc_files.mix(OPENMS_PERCOLATORADAPTER.out.feature_weights.map{ meta, feature_weights -> feature_weights }) ch_pout = OPENMS_PERCOLATORADAPTER.out.idxml @@ -68,7 +62,6 @@ workflow RESCORE { ch_rescored_runs = OPENMS_PERCOLATORADAPTER_GLOBAL.out.idxml // Filter by global percolator q-value OPENMS_IDFILTER_Q_VALUE_GLOBAL(ch_rescored_runs.map {id, idxml -> [id, idxml, []]}) - ch_versions = ch_versions.mix(OPENMS_IDFILTER_Q_VALUE_GLOBAL.out.versions) // Backfilter sample_condition runs according to global FDR OPENMS_IDFILTER_GLOBAL(ch_pout.combine(OPENMS_IDFILTER_Q_VALUE_GLOBAL.out.filtered.map{ it[1] })) ch_filter_q_value = OPENMS_IDFILTER_GLOBAL.out.filtered @@ -79,7 +72,6 @@ workflow RESCORE { ch_rescored_runs = ch_pout // Filter by percolator q-value OPENMS_IDFILTER_Q_VALUE(ch_rescored_runs.map {group_meta, idxml -> [group_meta, idxml, []]}) - ch_versions = ch_versions.mix(OPENMS_IDFILTER_Q_VALUE.out.versions) ch_filter_q_value = OPENMS_IDFILTER_Q_VALUE.out.filtered } } @@ -87,6 +79,5 @@ workflow RESCORE { emit: rescored_runs = ch_rescored_runs fdr_filtered = ch_filter_q_value - versions = ch_versions multiqc_files = ch_multiqc_files } diff --git a/subworkflows/local/speclib/main.nf b/subworkflows/local/speclib/main.nf index 50ea5faa..8e3b6f3e 100644 --- a/subworkflows/local/speclib/main.nf +++ b/subworkflows/local/speclib/main.nf @@ -21,14 +21,12 @@ workflow SPECLIB { mzml main: - ch_versions = channel.empty() // Load unimod tables (Future:) unimod = file("$projectDir/assets/250120_unimod_tables.xml", checkIfExists: true) // Convert psms and spectra to pickle files EASYPQP_CONVERT(fdrfiltered_comet_idxml.join(mzml), unimod) - ch_versions = ch_versions.mix(EASYPQP_CONVERT.out.versions) EASYPQP_CONVERT.out.psmpkl .map { meta, psmpkl -> [groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), psmpkl] } @@ -41,7 +39,6 @@ workflow SPECLIB { // Generate spectrum library for each sample-condition pair EASYPQP_LIBRARY(ch_psmpkl.join(ch_peakpkl)) - ch_versions = ch_versions.mix(EASYPQP_LIBRARY.out.versions) // Generate spectrum library for all MSruns in the samplesheet if (params.global_fdr) { @@ -57,5 +54,4 @@ workflow SPECLIB { } emit: - versions = ch_versions } diff --git a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf index f84971c6..d9e4a535 100644 --- a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf @@ -39,7 +39,6 @@ workflow PIPELINE_INITIALISATION { main: - ch_versions = channel.empty() // // Print version and exit if required and dump pipeline parameters to JSON file From 81d96984c382b976d786c07fd916a8899ebafbc5 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Sat, 24 Jan 2026 12:39:34 +0000 Subject: [PATCH 027/104] sync nf-core modules and bump openms version --- CHANGELOG.md | 4 +- modules.json | 20 +++---- .../mapaligneridentification/environment.yml | 2 +- .../openms/mapaligneridentification/main.nf | 6 +- .../openms/maprttransformer/environment.yml | 2 +- modules/local/openms/maprttransformer/main.nf | 6 +- .../openms/mztabexporter/environment.yml | 2 +- modules/local/openms/mztabexporter/main.nf | 6 +- .../psmfeatureextractor/environment.yml | 2 +- .../local/openms/psmfeatureextractor/main.nf | 6 +- .../local/openms/textexporter/environment.yml | 2 +- modules/local/openms/textexporter/main.nf | 6 +- .../featurelinkerunlabeledkd/environment.yml | 2 +- .../featurelinkerunlabeledkd/main.nf | 6 +- .../percolatoradapter/environment.yml | 2 +- .../percolatoradapter/main.nf | 8 +-- .../openms/decoydatabase/environment.yml | 2 +- modules/nf-core/openms/decoydatabase/main.nf | 6 +- modules/nf-core/openms/decoydatabase/meta.yml | 28 +++++++-- .../decoydatabase/tests/main.nf.test.snap | 16 +++-- .../nf-core/openms/filefilter/environment.yml | 2 +- modules/nf-core/openms/filefilter/main.nf | 6 +- modules/nf-core/openms/filefilter/meta.yml | 30 +++++++--- .../openms/filefilter/tests/main.nf.test.snap | 16 +++-- .../nf-core/openms/idfilter/environment.yml | 2 +- modules/nf-core/openms/idfilter/main.nf | 6 +- modules/nf-core/openms/idfilter/meta.yml | 31 +++++++--- .../openms/idfilter/tests/main.nf.test.snap | 36 ++++++++---- modules/nf-core/openms/idmassaccuracy/main.nf | 1 - .../openms/idmassaccuracy/tests/main.nf.test | 8 +-- .../nf-core/openms/idmerger/environment.yml | 2 +- modules/nf-core/openms/idmerger/main.nf | 6 +- modules/nf-core/openms/idmerger/meta.yml | 28 +++++++-- .../openms/idmerger/tests/main.nf.test | 4 +- .../openms/idmerger/tests/main.nf.test.snap | 24 ++++++-- .../nf-core/openms/idripper/environment.yml | 2 +- modules/nf-core/openms/idripper/main.nf | 6 +- modules/nf-core/openms/idripper/meta.yml | 32 +++++++--- .../openms/idripper/tests/main.nf.test.snap | 32 +++++++--- .../openms/idscoreswitcher/environment.yml | 2 +- .../nf-core/openms/idscoreswitcher/main.nf | 6 +- .../nf-core/openms/idscoreswitcher/meta.yml | 32 +++++++--- .../idscoreswitcher/tests/main.nf.test.snap | 32 +++++++--- .../openms/peakpickerhires/environment.yml | 2 +- .../nf-core/openms/peakpickerhires/main.nf | 6 +- .../nf-core/openms/peakpickerhires/meta.yml | 32 +++++++--- .../openms/peakpickerhires/tests/main.nf.test | 2 +- .../peakpickerhires/tests/main.nf.test.snap | 24 ++++++-- .../openms/peptideindexer/environment.yml | 2 +- modules/nf-core/openms/peptideindexer/main.nf | 6 +- .../nf-core/openms/peptideindexer/meta.yml | 28 +++++++-- .../peptideindexer/tests/main.nf.test.snap | 32 +++++++--- .../cometadapter/environment.yml | 2 +- .../openmsthirdparty/cometadapter/main.nf | 8 +-- .../openmsthirdparty/cometadapter/meta.yml | 58 +++++++++++++++++-- .../cometadapter/tests/main.nf.test | 2 +- .../cometadapter/tests/main.nf.test.snap | 22 ++++--- subworkflows/local/map_alignment/main.nf | 3 - subworkflows/local/prepare_spectra/main.nf | 3 - subworkflows/local/process_feature/main.nf | 4 -- subworkflows/local/quant/main.nf | 4 -- subworkflows/local/rescore/main.nf | 3 - subworkflows/local/speclib/main.nf | 5 -- tests/default.nf.test.snap | 21 +++---- tests/ionannotator.nf.test.snap | 21 +++---- tests/mokapot.nf.test.snap | 19 +++--- tests/speclib.nf.test.snap | 23 ++++---- workflows/mhcquant.nf | 11 +--- 68 files changed, 533 insertions(+), 290 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe08b61a..c1c927c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### `Changed` -- Migrate to topic channels [#431](https://github.com/nf-core/mhcquant/pull/431) - +- Migrate to topic channels [#431](https://github.com/nf-core/mhcquant/pull/431) + ### `Dependencies` | Dependency | Old version | New version | diff --git a/modules.json b/modules.json index c3897798..8eaafe97 100644 --- a/modules.json +++ b/modules.json @@ -17,52 +17,52 @@ }, "openms/decoydatabase": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/filefilter": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/idfilter": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/idmassaccuracy": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/idmerger": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/idripper": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/idscoreswitcher": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/peakpickerhires": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openms/peptideindexer": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "openmsthirdparty/cometadapter": { "branch": "master", - "git_sha": "0c47e4193ddde2c5edbc206b5420cbcbee5c9797", + "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, "thermorawfileparser": { diff --git a/modules/local/openms/mapaligneridentification/environment.yml b/modules/local/openms/mapaligneridentification/environment.yml index d85a93ef..c8bad1b9 100644 --- a/modules/local/openms/mapaligneridentification/environment.yml +++ b/modules/local/openms/mapaligneridentification/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::openms=3.4.1 + - bioconda::openms=3.5.0 diff --git a/modules/local/openms/mapaligneridentification/main.nf b/modules/local/openms/mapaligneridentification/main.nf index fd6f3ec1..fc5f9e43 100644 --- a/modules/local/openms/mapaligneridentification/main.nf +++ b/modules/local/openms/mapaligneridentification/main.nf @@ -4,15 +4,15 @@ process OPENMS_MAPALIGNERIDENTIFICATION { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(idxmls) output: tuple val(meta), path("*.trafoXML"), emit: trafoxml - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openms/maprttransformer/environment.yml b/modules/local/openms/maprttransformer/environment.yml index d85a93ef..c8bad1b9 100644 --- a/modules/local/openms/maprttransformer/environment.yml +++ b/modules/local/openms/maprttransformer/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::openms=3.4.1 + - bioconda::openms=3.5.0 diff --git a/modules/local/openms/maprttransformer/main.nf b/modules/local/openms/maprttransformer/main.nf index fd436d6d..b9d9cad3 100644 --- a/modules/local/openms/maprttransformer/main.nf +++ b/modules/local/openms/maprttransformer/main.nf @@ -4,15 +4,15 @@ process OPENMS_MAPRTTRANSFORMER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(alignment_file), path(trafoxml) output: tuple val(meta), path("*_aligned.*"), emit: aligned - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openms/mztabexporter/environment.yml b/modules/local/openms/mztabexporter/environment.yml index d85a93ef..c8bad1b9 100644 --- a/modules/local/openms/mztabexporter/environment.yml +++ b/modules/local/openms/mztabexporter/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::openms=3.4.1 + - bioconda::openms=3.5.0 diff --git a/modules/local/openms/mztabexporter/main.nf b/modules/local/openms/mztabexporter/main.nf index 5fe288dd..8190d457 100644 --- a/modules/local/openms/mztabexporter/main.nf +++ b/modules/local/openms/mztabexporter/main.nf @@ -4,15 +4,15 @@ process OPENMS_MZTABEXPORTER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(in_file) output: tuple val(meta), path("*.mzTab"), emit: mztab - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openms/psmfeatureextractor/environment.yml b/modules/local/openms/psmfeatureextractor/environment.yml index d85a93ef..c8bad1b9 100644 --- a/modules/local/openms/psmfeatureextractor/environment.yml +++ b/modules/local/openms/psmfeatureextractor/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::openms=3.4.1 + - bioconda::openms=3.5.0 diff --git a/modules/local/openms/psmfeatureextractor/main.nf b/modules/local/openms/psmfeatureextractor/main.nf index 33fd6f10..d97e4a87 100644 --- a/modules/local/openms/psmfeatureextractor/main.nf +++ b/modules/local/openms/psmfeatureextractor/main.nf @@ -4,15 +4,15 @@ process OPENMS_PSMFEATUREEXTRACTOR { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(idxml), path(feature_file) output: tuple val(meta), path("*.idXML"), emit: idxml - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openms/textexporter/environment.yml b/modules/local/openms/textexporter/environment.yml index d85a93ef..c8bad1b9 100644 --- a/modules/local/openms/textexporter/environment.yml +++ b/modules/local/openms/textexporter/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::openms=3.4.1 + - bioconda::openms=3.5.0 diff --git a/modules/local/openms/textexporter/main.nf b/modules/local/openms/textexporter/main.nf index f8b9173a..bb18f39b 100644 --- a/modules/local/openms/textexporter/main.nf +++ b/modules/local/openms/textexporter/main.nf @@ -4,15 +4,15 @@ process OPENMS_TEXTEXPORTER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(file) output: tuple val(meta), path("*.tsv"), emit: tsv - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/environment.yml b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/environment.yml index dde2f844..9255b744 100644 --- a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/environment.yml +++ b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::openms-thirdparty=3.4.1 + - bioconda::openms-thirdparty=3.5.0 diff --git a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf index d4015255..2d804ddc 100644 --- a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf +++ b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf @@ -4,15 +4,15 @@ process OPENMS_FEATURELINKERUNLABELEDKD { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms-thirdparty:3.4.1--h9ee0642_1' : - 'biocontainers/openms-thirdparty:3.4.1--h9ee0642_1' }" + 'https://depot.galaxyproject.org/singularity/openms-thirdparty:3.5.0--h9ee0642_0' : + 'biocontainers/openms-thirdparty:3.5.0--h9ee0642_0' }" input: tuple val(meta), path(features) output: tuple val(meta), path("*.consensusXML"), emit: consensusxml - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openmsthirdparty/percolatoradapter/environment.yml b/modules/local/openmsthirdparty/percolatoradapter/environment.yml index dde2f844..9255b744 100644 --- a/modules/local/openmsthirdparty/percolatoradapter/environment.yml +++ b/modules/local/openmsthirdparty/percolatoradapter/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::openms-thirdparty=3.4.1 + - bioconda::openms-thirdparty=3.5.0 diff --git a/modules/local/openmsthirdparty/percolatoradapter/main.nf b/modules/local/openmsthirdparty/percolatoradapter/main.nf index 94a934ad..550d6253 100644 --- a/modules/local/openmsthirdparty/percolatoradapter/main.nf +++ b/modules/local/openmsthirdparty/percolatoradapter/main.nf @@ -4,8 +4,8 @@ process OPENMS_PERCOLATORADAPTER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms-thirdparty:3.4.1--h9ee0642_1' : - 'biocontainers/openms-thirdparty:3.4.1--h9ee0642_1' }" + 'https://depot.galaxyproject.org/singularity/openms-thirdparty:3.5.0--h9ee0642_0' : + 'biocontainers/openms-thirdparty:3.5.0--h9ee0642_0' }" input: tuple val(meta), path(merged_with_features) @@ -13,8 +13,8 @@ process OPENMS_PERCOLATORADAPTER { output: tuple val(meta), path("*.idXML") , emit: idxml tuple val(meta), path("*_percolator_feature_weights.tsv"), emit: feature_weights, optional: true - tuple val("${task.process}"), val('PercolatorAdapter'), eval("PercolatorAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1"), emit: versions, topic: versions - tuple val("${task.process}"), val('percolator'), eval("percolator -h 2>&1 | grep -E '^Percolator version(.*)' | sed 's/Percolator version //g'"), emit: versions_1, topic: versions + tuple val("${task.process}"), val('PercolatorAdapter'), eval("PercolatorAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1"), emit: versions_percolatoradapter, topic: versions + tuple val("${task.process}"), val('percolator'), eval("percolator -h 2>&1 | grep -E '^Percolator version(.*)' | sed 's/Percolator version //g'"), emit: versions_percolator, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/openms/decoydatabase/environment.yml b/modules/nf-core/openms/decoydatabase/environment.yml index d85a93ef..c8bad1b9 100644 --- a/modules/nf-core/openms/decoydatabase/environment.yml +++ b/modules/nf-core/openms/decoydatabase/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::openms=3.4.1 + - bioconda::openms=3.5.0 diff --git a/modules/nf-core/openms/decoydatabase/main.nf b/modules/nf-core/openms/decoydatabase/main.nf index b9ce0fbe..7c5f9b98 100644 --- a/modules/nf-core/openms/decoydatabase/main.nf +++ b/modules/nf-core/openms/decoydatabase/main.nf @@ -4,15 +4,15 @@ process OPENMS_DECOYDATABASE { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(fasta) output: tuple val(meta), path("*.fasta"), emit: decoy_fasta - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/openms/decoydatabase/meta.yml b/modules/nf-core/openms/decoydatabase/meta.yml index b0c13d16..bf421862 100644 --- a/modules/nf-core/openms/decoydatabase/meta.yml +++ b/modules/nf-core/openms/decoydatabase/meta.yml @@ -39,13 +39,29 @@ output: description: Fasta file containing proteins and decoy proteins pattern: "*.{fasta}" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The process the versions were collected from + - openms: + type: string + description: The tool name + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - openms: + type: string + description: The tool name + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openms/decoydatabase/tests/main.nf.test.snap b/modules/nf-core/openms/decoydatabase/tests/main.nf.test.snap index d4167208..d2f80c6f 100644 --- a/modules/nf-core/openms/decoydatabase/tests/main.nf.test.snap +++ b/modules/nf-core/openms/decoydatabase/tests/main.nf.test.snap @@ -11,7 +11,11 @@ ] ], "1": [ - "versions.yml:md5,3faa02db1ca8efaa13ffb542d3a418f0" + [ + "OPENMS_DECOYDATABASE", + "openms", + "3.5.0" + ] ], "decoy_fasta": [ [ @@ -21,8 +25,12 @@ "yeast_UPS_decoy.fasta:md5,96c0295f69e0cb92b705ca4c33e6f047" ] ], - "versions": [ - "versions.yml:md5,3faa02db1ca8efaa13ffb542d3a418f0" + "versions_openms": [ + [ + "OPENMS_DECOYDATABASE", + "openms", + "3.5.0" + ] ] } ], @@ -30,6 +38,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T07:59:28.940912845" + "timestamp": "2026-01-12T13:14:52.51304012" } } \ No newline at end of file diff --git a/modules/nf-core/openms/filefilter/environment.yml b/modules/nf-core/openms/filefilter/environment.yml index ad4685c0..fd1026d7 100644 --- a/modules/nf-core/openms/filefilter/environment.yml +++ b/modules/nf-core/openms/filefilter/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::openms=3.4.1" + - "bioconda::openms=3.5.0" diff --git a/modules/nf-core/openms/filefilter/main.nf b/modules/nf-core/openms/filefilter/main.nf index fa1668fc..6b6447b8 100644 --- a/modules/nf-core/openms/filefilter/main.nf +++ b/modules/nf-core/openms/filefilter/main.nf @@ -4,8 +4,8 @@ process OPENMS_FILEFILTER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(file) @@ -14,7 +14,7 @@ process OPENMS_FILEFILTER { tuple val(meta), path("*.mzML"), emit: mzml, optional: true tuple val(meta), path("*.featureXML"), emit: featurexml, optional: true tuple val(meta), path("*.consensusXML"), emit: consensusxml, optional: true - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/openms/filefilter/meta.yml b/modules/nf-core/openms/filefilter/meta.yml index 9721f9b3..6c552c7a 100644 --- a/modules/nf-core/openms/filefilter/meta.yml +++ b/modules/nf-core/openms/filefilter/meta.yml @@ -1,5 +1,6 @@ name: "openms_filefilter" -description: Filters peptide/protein identification results by different criteria. +description: Filters peptide/protein identification results by different + criteria. keywords: - filter - mzML @@ -62,14 +63,29 @@ output: description: Filtered consensusXML file. pattern: "*.consensusXML" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software version - pattern: "versions.yml" + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool - ontologies: - - edam: http://edamontology.org/format_3750 # YAML authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openms/filefilter/tests/main.nf.test.snap b/modules/nf-core/openms/filefilter/tests/main.nf.test.snap index 23a8efdd..1f481bdc 100644 --- a/modules/nf-core/openms/filefilter/tests/main.nf.test.snap +++ b/modules/nf-core/openms/filefilter/tests/main.nf.test.snap @@ -43,7 +43,11 @@ ], "3": [ - "versions.yml:md5,1ea875205d6d20aea4dabd5e580f4d6a" + [ + "OPENMS_FILEFILTER", + "openms", + "3.5.0" + ] ], "consensusxml": [ @@ -59,8 +63,12 @@ "test_filtered.mzML:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,1ea875205d6d20aea4dabd5e580f4d6a" + "versions_openms": [ + [ + "OPENMS_FILEFILTER", + "openms", + "3.5.0" + ] ] } ], @@ -68,6 +76,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-27T13:03:04.483705593" + "timestamp": "2026-01-12T10:02:48.433471741" } } \ No newline at end of file diff --git a/modules/nf-core/openms/idfilter/environment.yml b/modules/nf-core/openms/idfilter/environment.yml index ad4685c0..fd1026d7 100644 --- a/modules/nf-core/openms/idfilter/environment.yml +++ b/modules/nf-core/openms/idfilter/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::openms=3.4.1" + - "bioconda::openms=3.5.0" diff --git a/modules/nf-core/openms/idfilter/main.nf b/modules/nf-core/openms/idfilter/main.nf index 708307c0..e31c9897 100644 --- a/modules/nf-core/openms/idfilter/main.nf +++ b/modules/nf-core/openms/idfilter/main.nf @@ -4,15 +4,15 @@ process OPENMS_IDFILTER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(id_file), path(filter_file) output: tuple val(meta), path("*.{idXML,consensusXML}"), emit: filtered - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/openms/idfilter/meta.yml b/modules/nf-core/openms/idfilter/meta.yml index 2bab8552..4da25896 100644 --- a/modules/nf-core/openms/idfilter/meta.yml +++ b/modules/nf-core/openms/idfilter/meta.yml @@ -1,5 +1,6 @@ name: "openms_idfilter" -description: Filters peptide/protein identification results by different criteria. +description: Filters peptide/protein identification results by different + criteria. keywords: - filter - idXML @@ -44,13 +45,29 @@ output: description: Filtered peptide-spectrum matches. pattern: "*.{idXML,consensusXML}" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openms/idfilter/tests/main.nf.test.snap b/modules/nf-core/openms/idfilter/tests/main.nf.test.snap index b0f4bce3..dea78c77 100644 --- a/modules/nf-core/openms/idfilter/tests/main.nf.test.snap +++ b/modules/nf-core/openms/idfilter/tests/main.nf.test.snap @@ -11,7 +11,11 @@ ] ], "1": [ - "versions.yml:md5,992aca62fe3990b1ebb21d11e999dd67" + [ + "OPENMS_IDFILTER", + "openms", + "3.5.0" + ] ], "filtered": [ [ @@ -21,8 +25,12 @@ "test.idXML:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,992aca62fe3990b1ebb21d11e999dd67" + "versions_openms": [ + [ + "OPENMS_IDFILTER", + "openms", + "3.5.0" + ] ] } ], @@ -30,7 +38,7 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:37:44.032335833" + "timestamp": "2026-01-12T10:03:17.056821477" }, "proteomics - filter - idxml": { "content": [ @@ -40,22 +48,30 @@ { "id": "test" }, - "test.idXML:md5,b91c37a92b2d037368cfedde120dc845" + "test.idXML:md5,3231d9c0cd1838db70a576f505ed1a21" ] ], "1": [ - "versions.yml:md5,992aca62fe3990b1ebb21d11e999dd67" + [ + "OPENMS_IDFILTER", + "openms", + "3.5.0" + ] ], "filtered": [ [ { "id": "test" }, - "test.idXML:md5,b91c37a92b2d037368cfedde120dc845" + "test.idXML:md5,3231d9c0cd1838db70a576f505ed1a21" ] ], - "versions": [ - "versions.yml:md5,992aca62fe3990b1ebb21d11e999dd67" + "versions_openms": [ + [ + "OPENMS_IDFILTER", + "openms", + "3.5.0" + ] ] } ], @@ -63,6 +79,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:37:18.617593794" + "timestamp": "2026-01-12T10:03:04.798826665" } } \ No newline at end of file diff --git a/modules/nf-core/openms/idmassaccuracy/main.nf b/modules/nf-core/openms/idmassaccuracy/main.nf index 0681931f..cb08ccd5 100644 --- a/modules/nf-core/openms/idmassaccuracy/main.nf +++ b/modules/nf-core/openms/idmassaccuracy/main.nf @@ -13,7 +13,6 @@ process OPENMS_IDMASSACCURACY { output: tuple val(meta), path("*frag_mass_err.tsv") , emit: frag_err tuple val(meta), path("*prec_mass_err.tsv") , emit: prec_err, optional: true - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test b/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test index b267fe15..5d66fcdb 100644 --- a/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test +++ b/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test @@ -56,8 +56,8 @@ nextflow_process { } then { assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert process.failed }, + { assert process.errorReport.contains("WARNING: This module has been deprecated.")} ) } } @@ -73,8 +73,8 @@ nextflow_process { } then { assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert process.failed }, + { assert process.errorReport.contains("WARNING: This module has been deprecated.")} ) } } diff --git a/modules/nf-core/openms/idmerger/environment.yml b/modules/nf-core/openms/idmerger/environment.yml index d85a93ef..c8bad1b9 100644 --- a/modules/nf-core/openms/idmerger/environment.yml +++ b/modules/nf-core/openms/idmerger/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::openms=3.4.1 + - bioconda::openms=3.5.0 diff --git a/modules/nf-core/openms/idmerger/main.nf b/modules/nf-core/openms/idmerger/main.nf index 22b98df5..ff93ee06 100644 --- a/modules/nf-core/openms/idmerger/main.nf +++ b/modules/nf-core/openms/idmerger/main.nf @@ -4,15 +4,15 @@ process OPENMS_IDMERGER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(idxmls) output: tuple val(meta), path("*.idXML"), emit: idxml - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/openms/idmerger/meta.yml b/modules/nf-core/openms/idmerger/meta.yml index 002fc578..379a5888 100644 --- a/modules/nf-core/openms/idmerger/meta.yml +++ b/modules/nf-core/openms/idmerger/meta.yml @@ -41,12 +41,28 @@ output: description: Merged idXML output file pattern: "*.{idXML}" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" diff --git a/modules/nf-core/openms/idmerger/tests/main.nf.test b/modules/nf-core/openms/idmerger/tests/main.nf.test index 8945e091..a5b0cb35 100644 --- a/modules/nf-core/openms/idmerger/tests/main.nf.test +++ b/modules/nf-core/openms/idmerger/tests/main.nf.test @@ -26,8 +26,8 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.versions).match()}, - + { assert snapshot(process.out.versions_openms).match()}, + // check single line substrings in output idxml file { assert path(process.out.idxml.get(0).get(1)).readLines().any { it.contains("") }}, { assert path(process.out.idxml.get(0).get(1)).readLines().any { it.contains("") }}, diff --git a/modules/nf-core/openms/idmerger/tests/main.nf.test.snap b/modules/nf-core/openms/idmerger/tests/main.nf.test.snap index a2edce86..13e6f7a8 100644 --- a/modules/nf-core/openms/idmerger/tests/main.nf.test.snap +++ b/modules/nf-core/openms/idmerger/tests/main.nf.test.snap @@ -2,14 +2,18 @@ "proteomics - openms - idxml": { "content": [ [ - "versions.yml:md5,80b0fb4560c930fd7b9c31dbbd3f66d2" + [ + "OPENMS_IDMERGER", + "openms", + "3.5.0" + ] ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:54:12.914656629" + "timestamp": "2026-01-12T10:06:10.948172124" }, "proteomics - openms - idxml - stub": { "content": [ @@ -23,7 +27,11 @@ ] ], "1": [ - "versions.yml:md5,80b0fb4560c930fd7b9c31dbbd3f66d2" + [ + "OPENMS_IDMERGER", + "openms", + "3.5.0" + ] ], "idxml": [ [ @@ -33,8 +41,12 @@ "test.idXML:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,80b0fb4560c930fd7b9c31dbbd3f66d2" + "versions_openms": [ + [ + "OPENMS_IDMERGER", + "openms", + "3.5.0" + ] ] } ], @@ -42,6 +54,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:54:41.780756135" + "timestamp": "2026-01-12T10:06:23.802686751" } } \ No newline at end of file diff --git a/modules/nf-core/openms/idripper/environment.yml b/modules/nf-core/openms/idripper/environment.yml index ad4685c0..fd1026d7 100644 --- a/modules/nf-core/openms/idripper/environment.yml +++ b/modules/nf-core/openms/idripper/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::openms=3.4.1" + - "bioconda::openms=3.5.0" diff --git a/modules/nf-core/openms/idripper/main.nf b/modules/nf-core/openms/idripper/main.nf index 42aa71d1..7086be23 100644 --- a/modules/nf-core/openms/idripper/main.nf +++ b/modules/nf-core/openms/idripper/main.nf @@ -4,15 +4,15 @@ process OPENMS_IDRIPPER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1': - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0': + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(merged_idxml) output: tuple val(meta), path("*.idXML"), emit: idxmls - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/openms/idripper/meta.yml b/modules/nf-core/openms/idripper/meta.yml index 72e62935..47ee04f5 100644 --- a/modules/nf-core/openms/idripper/meta.yml +++ b/modules/nf-core/openms/idripper/meta.yml @@ -1,6 +1,6 @@ name: openms_idripper -description: Split a merged identification file into their originating identification - files +description: Split a merged identification file into their originating + identification files keywords: - split - idXML @@ -40,13 +40,29 @@ output: description: Multiple idXML files pattern: "*.{idXML}" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openms/idripper/tests/main.nf.test.snap b/modules/nf-core/openms/idripper/tests/main.nf.test.snap index 6192f348..07853ac9 100644 --- a/modules/nf-core/openms/idripper/tests/main.nf.test.snap +++ b/modules/nf-core/openms/idripper/tests/main.nf.test.snap @@ -14,7 +14,11 @@ ] ], "1": [ - "versions.yml:md5,3949806b2abeb3db36c6dc0596f39a14" + [ + "OPENMS_IDRIPPER", + "openms", + "3.5.0" + ] ], "idxmls": [ [ @@ -27,8 +31,12 @@ ] ] ], - "versions": [ - "versions.yml:md5,3949806b2abeb3db36c6dc0596f39a14" + "versions_openms": [ + [ + "OPENMS_IDRIPPER", + "openms", + "3.5.0" + ] ] } ], @@ -36,7 +44,7 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:55:11.687007226" + "timestamp": "2026-01-12T10:06:47.478212501" }, "proteomics - split - idxml - stub": { "content": [ @@ -53,7 +61,11 @@ ] ], "1": [ - "versions.yml:md5,3949806b2abeb3db36c6dc0596f39a14" + [ + "OPENMS_IDRIPPER", + "openms", + "3.5.0" + ] ], "idxmls": [ [ @@ -66,8 +78,12 @@ ] ] ], - "versions": [ - "versions.yml:md5,3949806b2abeb3db36c6dc0596f39a14" + "versions_openms": [ + [ + "OPENMS_IDRIPPER", + "openms", + "3.5.0" + ] ] } ], @@ -75,6 +91,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:55:38.405209447" + "timestamp": "2026-01-12T10:07:10.700393001" } } \ No newline at end of file diff --git a/modules/nf-core/openms/idscoreswitcher/environment.yml b/modules/nf-core/openms/idscoreswitcher/environment.yml index ad4685c0..fd1026d7 100644 --- a/modules/nf-core/openms/idscoreswitcher/environment.yml +++ b/modules/nf-core/openms/idscoreswitcher/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::openms=3.4.1" + - "bioconda::openms=3.5.0" diff --git a/modules/nf-core/openms/idscoreswitcher/main.nf b/modules/nf-core/openms/idscoreswitcher/main.nf index cded386f..0f4afdc2 100644 --- a/modules/nf-core/openms/idscoreswitcher/main.nf +++ b/modules/nf-core/openms/idscoreswitcher/main.nf @@ -4,15 +4,15 @@ process OPENMS_IDSCORESWITCHER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1': - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0': + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(idxml) output: tuple val(meta), path("*.idXML"), emit: idxml - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/openms/idscoreswitcher/meta.yml b/modules/nf-core/openms/idscoreswitcher/meta.yml index 2a00b66b..fe1fbd3e 100644 --- a/modules/nf-core/openms/idscoreswitcher/meta.yml +++ b/modules/nf-core/openms/idscoreswitcher/meta.yml @@ -1,6 +1,6 @@ name: "openms_idscoreswitcher" -description: Switches between different scores of peptide or protein hits in identification - data +description: Switches between different scores of peptide or protein hits in + identification data keywords: - switch - score @@ -43,13 +43,29 @@ output: obtained from a specified meta value pattern: "*.{idXML}" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openms/idscoreswitcher/tests/main.nf.test.snap b/modules/nf-core/openms/idscoreswitcher/tests/main.nf.test.snap index c9d84825..35fe46f0 100644 --- a/modules/nf-core/openms/idscoreswitcher/tests/main.nf.test.snap +++ b/modules/nf-core/openms/idscoreswitcher/tests/main.nf.test.snap @@ -11,7 +11,11 @@ ] ], "1": [ - "versions.yml:md5,658341a6b21a155b1c141c94c54c4ae3" + [ + "OPENMS_IDSCORESWITCHER", + "openms", + "3.5.0" + ] ], "idxml": [ [ @@ -21,8 +25,12 @@ "test.idXML:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,658341a6b21a155b1c141c94c54c4ae3" + "versions_openms": [ + [ + "OPENMS_IDSCORESWITCHER", + "openms", + "3.5.0" + ] ] } ], @@ -30,7 +38,7 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T09:04:11.118518193" + "timestamp": "2026-01-12T10:07:57.184605459" }, "proteomics - switch_score - idxml": { "content": [ @@ -44,7 +52,11 @@ ] ], "1": [ - "versions.yml:md5,658341a6b21a155b1c141c94c54c4ae3" + [ + "OPENMS_IDSCORESWITCHER", + "openms", + "3.5.0" + ] ], "idxml": [ [ @@ -54,8 +66,12 @@ "test.idXML:md5,0db3dfe3dc491ec94ebd951ca6e2c2e4" ] ], - "versions": [ - "versions.yml:md5,658341a6b21a155b1c141c94c54c4ae3" + "versions_openms": [ + [ + "OPENMS_IDSCORESWITCHER", + "openms", + "3.5.0" + ] ] } ], @@ -63,6 +79,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T09:03:44.673575882" + "timestamp": "2026-01-12T10:07:32.62082728" } } \ No newline at end of file diff --git a/modules/nf-core/openms/peakpickerhires/environment.yml b/modules/nf-core/openms/peakpickerhires/environment.yml index 664bf59d..7b287592 100644 --- a/modules/nf-core/openms/peakpickerhires/environment.yml +++ b/modules/nf-core/openms/peakpickerhires/environment.yml @@ -2,4 +2,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::openms=3.4.1" + - "bioconda::openms=3.5.0" diff --git a/modules/nf-core/openms/peakpickerhires/main.nf b/modules/nf-core/openms/peakpickerhires/main.nf index dbcf4957..c30b79aa 100644 --- a/modules/nf-core/openms/peakpickerhires/main.nf +++ b/modules/nf-core/openms/peakpickerhires/main.nf @@ -4,15 +4,15 @@ process OPENMS_PEAKPICKERHIRES { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(mzml) output: tuple val(meta), path("*.mzML"), emit: mzml - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/openms/peakpickerhires/meta.yml b/modules/nf-core/openms/peakpickerhires/meta.yml index db8feaad..100c5b19 100644 --- a/modules/nf-core/openms/peakpickerhires/meta.yml +++ b/modules/nf-core/openms/peakpickerhires/meta.yml @@ -1,6 +1,6 @@ name: "openms_peakpickerhires" -description: A tool for peak detection in high-resolution profile data (Orbitrap or - FTICR) +description: A tool for peak detection in high-resolution profile data (Orbitrap + or FTICR) keywords: - peak picking - mzml @@ -40,13 +40,29 @@ output: description: Peak-picked mass spectrometer output file in mzML format pattern: "*.{mzML}" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openms/peakpickerhires/tests/main.nf.test b/modules/nf-core/openms/peakpickerhires/tests/main.nf.test index df2071c4..563aa777 100644 --- a/modules/nf-core/openms/peakpickerhires/tests/main.nf.test +++ b/modules/nf-core/openms/peakpickerhires/tests/main.nf.test @@ -26,7 +26,7 @@ nextflow_process { assertAll( { assert process.success }, { assert path(process.out.mzml.get(0).get(1)).readLines().contains('\t\t\t') }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(process.out.versions_openms).match() } ) } diff --git a/modules/nf-core/openms/peakpickerhires/tests/main.nf.test.snap b/modules/nf-core/openms/peakpickerhires/tests/main.nf.test.snap index 83f15738..a3d88062 100644 --- a/modules/nf-core/openms/peakpickerhires/tests/main.nf.test.snap +++ b/modules/nf-core/openms/peakpickerhires/tests/main.nf.test.snap @@ -2,14 +2,18 @@ "proteomics - mzML": { "content": [ [ - "versions.yml:md5,69c600d25edebd411ef84718668821df" + [ + "OPENMS_PEAKPICKERHIRES", + "openms", + "3.5.0" + ] ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T09:07:00.776951188" + "timestamp": "2026-01-12T10:08:19.636849899" }, "proteomics - mzML - stub": { "content": [ @@ -23,7 +27,11 @@ ] ], "1": [ - "versions.yml:md5,69c600d25edebd411ef84718668821df" + [ + "OPENMS_PEAKPICKERHIRES", + "openms", + "3.5.0" + ] ], "mzml": [ [ @@ -33,8 +41,12 @@ "test_stub.mzML:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,69c600d25edebd411ef84718668821df" + "versions_openms": [ + [ + "OPENMS_PEAKPICKERHIRES", + "openms", + "3.5.0" + ] ] } ], @@ -42,6 +54,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T09:07:18.50818535" + "timestamp": "2026-01-12T10:08:41.181970232" } } \ No newline at end of file diff --git a/modules/nf-core/openms/peptideindexer/environment.yml b/modules/nf-core/openms/peptideindexer/environment.yml index ad4685c0..fd1026d7 100644 --- a/modules/nf-core/openms/peptideindexer/environment.yml +++ b/modules/nf-core/openms/peptideindexer/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::openms=3.4.1" + - "bioconda::openms=3.5.0" diff --git a/modules/nf-core/openms/peptideindexer/main.nf b/modules/nf-core/openms/peptideindexer/main.nf index 0864b0a6..d94a0257 100644 --- a/modules/nf-core/openms/peptideindexer/main.nf +++ b/modules/nf-core/openms/peptideindexer/main.nf @@ -4,15 +4,15 @@ process OPENMS_PEPTIDEINDEXER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms:3.4.1--h81ffffe_1' : - 'biocontainers/openms:3.4.1--h81ffffe_1' }" + 'https://depot.galaxyproject.org/singularity/openms:3.5.0--h78fb946_0' : + 'biocontainers/openms:3.5.0--h78fb946_0' }" input: tuple val(meta), path(idxml), path(fasta) output: tuple val(meta), path("*.idXML"), emit: indexed_idxml - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/openms/peptideindexer/meta.yml b/modules/nf-core/openms/peptideindexer/meta.yml index 1c200b5d..a635472f 100644 --- a/modules/nf-core/openms/peptideindexer/meta.yml +++ b/modules/nf-core/openms/peptideindexer/meta.yml @@ -43,13 +43,29 @@ output: description: Refreshed idXML identification file pattern: "*.idXML" ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openms/peptideindexer/tests/main.nf.test.snap b/modules/nf-core/openms/peptideindexer/tests/main.nf.test.snap index 0aa17984..9c849cb4 100644 --- a/modules/nf-core/openms/peptideindexer/tests/main.nf.test.snap +++ b/modules/nf-core/openms/peptideindexer/tests/main.nf.test.snap @@ -11,7 +11,11 @@ ] ], "1": [ - "versions.yml:md5,c2965a55db2530b792b1620a935107d2" + [ + "OPENMS_PEPTIDEINDEXER", + "openms", + "3.5.0" + ] ], "indexed_idxml": [ [ @@ -21,8 +25,12 @@ "test_indexed.idXML:md5,ab771bf6bec1b88babd608cbf3b57144" ] ], - "versions": [ - "versions.yml:md5,c2965a55db2530b792b1620a935107d2" + "versions_openms": [ + [ + "OPENMS_PEPTIDEINDEXER", + "openms", + "3.5.0" + ] ] } ], @@ -30,7 +38,7 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:11:48.453753483" + "timestamp": "2026-01-12T10:09:11.498692207" }, "proteomics - refresh_idxml - stub": { "content": [ @@ -44,7 +52,11 @@ ] ], "1": [ - "versions.yml:md5,c2965a55db2530b792b1620a935107d2" + [ + "OPENMS_PEPTIDEINDEXER", + "openms", + "3.5.0" + ] ], "indexed_idxml": [ [ @@ -54,8 +66,12 @@ "test_indexed.idXML:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,c2965a55db2530b792b1620a935107d2" + "versions_openms": [ + [ + "OPENMS_PEPTIDEINDEXER", + "openms", + "3.5.0" + ] ] } ], @@ -63,6 +79,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:12:25.400421367" + "timestamp": "2026-01-12T10:09:30.793034749" } } \ No newline at end of file diff --git a/modules/nf-core/openmsthirdparty/cometadapter/environment.yml b/modules/nf-core/openmsthirdparty/cometadapter/environment.yml index 7e9c2818..45f695a6 100644 --- a/modules/nf-core/openmsthirdparty/cometadapter/environment.yml +++ b/modules/nf-core/openmsthirdparty/cometadapter/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::openms-thirdparty=3.4.1" + - "bioconda::openms-thirdparty=3.5.0" diff --git a/modules/nf-core/openmsthirdparty/cometadapter/main.nf b/modules/nf-core/openmsthirdparty/cometadapter/main.nf index 0d331e3f..14e85a3f 100644 --- a/modules/nf-core/openmsthirdparty/cometadapter/main.nf +++ b/modules/nf-core/openmsthirdparty/cometadapter/main.nf @@ -4,8 +4,8 @@ process OPENMSTHIRDPARTY_COMETADAPTER { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/openms-thirdparty:3.4.1--h9ee0642_1' : - 'biocontainers/openms-thirdparty:3.4.1--h9ee0642_1' }" + 'https://depot.galaxyproject.org/singularity/openms-thirdparty:3.5.0--h9ee0642_0' : + 'biocontainers/openms-thirdparty:3.5.0--h9ee0642_0' }" input: tuple val(meta), path(mzml), path(fasta) @@ -13,8 +13,8 @@ process OPENMSTHIRDPARTY_COMETADAPTER { output: tuple val(meta), path("*.idXML"), emit: idxml tuple val(meta), path("*.tsv") , emit: pin, optional: true - tuple val("${task.process}"), val('CometAdapter'), eval("CometAdapter 2>&1 | grep -E '^Version' | sed 's/Version: //g' | cut -d ' ' -f 1 | cut -d '-' -f 1"), emit: versions, topic: versions - tuple val("${task.process}"), val('Comet'), eval("comet 2>&1 | grep -E 'Comet version' | sed 's/Comet version //g' | tr -d '\"'"), emit: versions_1, topic: versions + tuple val("${task.process}"), val('CometAdapter'), eval("CometAdapter --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_cometadapter, topic: versions + tuple val("${task.process}"), val('Comet'), eval("comet 2>&1 | sed -n 's/.*Comet version \" *\\(.*\\)\".*/\\1/p'"), emit: versions_comet, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/openmsthirdparty/cometadapter/meta.yml b/modules/nf-core/openmsthirdparty/cometadapter/meta.yml index 50c1e1e4..70cda434 100644 --- a/modules/nf-core/openmsthirdparty/cometadapter/meta.yml +++ b/modules/nf-core/openmsthirdparty/cometadapter/meta.yml @@ -16,7 +16,18 @@ tools: doi: "10.1038/s41592-024-02197-7" licence: ["BSD"] identifier: "" + - CometAdapter: + description: "Annotates MS/MS spectra using Comet." + homepage: "https://openms.de" + documentation: "https://openms.readthedocs.io/en/latest/index.html" + identifier: "" + - Comet: + description: "Comet is an open source tandem mass spectrometry (MS/MS) sequence + database search tool." + homepage: "http://comet-ms.sourceforge.net/" + documentation: "http://comet-ms.sourceforge.net/" + identifier: "" input: - - meta: type: map @@ -57,13 +68,48 @@ output: pattern: "*.{tsv}" ontologies: - edam: http://edamontology.org/format_3475 # TSV + versions_cometadapter: + - - ${task.process}: + type: string + description: The name of the process + - CometAdapter: + type: string + description: The name of the tool + - "CometAdapter --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + versions_comet: + - - ${task.process}: + type: string + description: The name of the process + - Comet: + type: string + description: The name of the tool + - comet 2>&1 | sed -n 's/.*Comet version " *\(.*\)".*/\1/p': + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - CometAdapter: + type: string + description: The name of the tool + - "CometAdapter --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The name of the process + - Comet: + type: string + description: The name of the tool + - comet 2>&1 | sed -n 's/.*Comet version " *\(.*\)".*/\1/p': + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test b/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test index cf1a0bcd..de1d7df6 100644 --- a/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test +++ b/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test @@ -59,7 +59,7 @@ nextflow_process { // Make sure the file is not empty assert file(process.out.idxml[0][1]).readLines().any { it.contains('ProteinHit') } assert file(process.out.idxml[0][1]).readLines().any { it.contains('PeptideHit') } - assert snapshot(path(process.out.versions.get(0)).yaml).match("versions") + assert snapshot(process.out.versions_cometadapter, process.out.versions_comet).match("versions") } } diff --git a/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test.snap b/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test.snap index 81a248a8..7fd6dbba 100644 --- a/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test.snap +++ b/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test.snap @@ -43,17 +43,25 @@ }, "versions": { "content": [ - { - "OPENMSTHIRDPARTY_COMETADAPTER": { - "CometAdapter": "3.4.1", - "Comet": "2024.01 rev. 1" - } - } + [ + [ + "OPENMSTHIRDPARTY_COMETADAPTER", + "CometAdapter", + "3.5.0" + ] + ], + [ + [ + "OPENMSTHIRDPARTY_COMETADAPTER", + "Comet", + "2024.01 rev. 1" + ] + ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2025-10-28T08:16:50.757046344" + "timestamp": "2026-01-12T12:27:11.62435964" } } \ No newline at end of file diff --git a/subworkflows/local/map_alignment/main.nf b/subworkflows/local/map_alignment/main.nf index 7ca36a31..e44f8c71 100644 --- a/subworkflows/local/map_alignment/main.nf +++ b/subworkflows/local/map_alignment/main.nf @@ -14,8 +14,6 @@ workflow MAP_ALIGNMENT { merge_meta_map main: - ch_versions = Channel.empty() - // Compute group-wise alignment rt transformation OPENMS_MAPALIGNERIDENTIFICATION( ch_runs_to_be_aligned ) @@ -45,7 +43,6 @@ workflow MAP_ALIGNMENT { OPENMS_MAPRTTRANSFORMERIDXML(ch_trafos_idxml) emit: - versions = ch_versions aligned_idxml = OPENMS_MAPRTTRANSFORMERIDXML.out.aligned aligned_mzml = OPENMS_MAPRTTRANSFORMERMZML.out.aligned } diff --git a/subworkflows/local/prepare_spectra/main.nf b/subworkflows/local/prepare_spectra/main.nf index 8079904a..3681cce4 100644 --- a/subworkflows/local/prepare_spectra/main.nf +++ b/subworkflows/local/prepare_spectra/main.nf @@ -14,8 +14,6 @@ workflow PREPARE_SPECTRA { ch_samplesheet main: - ch_versions = Channel.empty() - ch_samplesheet .branch { meta, filename -> @@ -70,5 +68,4 @@ workflow PREPARE_SPECTRA { emit: mzml = ch_mzml_file - versions = ch_versions } diff --git a/subworkflows/local/process_feature/main.nf b/subworkflows/local/process_feature/main.nf index b9459a2c..cc1aff34 100644 --- a/subworkflows/local/process_feature/main.nf +++ b/subworkflows/local/process_feature/main.nf @@ -11,8 +11,6 @@ workflow PROCESS_FEATURE { ch_runs_to_be_quantified main: - ch_versions = Channel.empty() - // Quantify identifications using targeted feature extraction OPENMS_FEATUREFINDERIDENTIFICATION(ch_runs_to_be_quantified).featurexml .map { meta, featurexml -> [ groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), featurexml] } @@ -26,7 +24,5 @@ workflow PROCESS_FEATURE { OPENMS_IDCONFLICTRESOLVER(OPENMS_FEATURELINKERUNLABELEDKD.out.consensusxml) emit: - // Define the information that is returned by this workflow - versions = ch_versions consensusxml = OPENMS_IDCONFLICTRESOLVER.out.consensusxml } diff --git a/subworkflows/local/quant/main.nf b/subworkflows/local/quant/main.nf index 7c6824ed..ef802fc7 100644 --- a/subworkflows/local/quant/main.nf +++ b/subworkflows/local/quant/main.nf @@ -25,7 +25,6 @@ workflow QUANT { mzml main: - ch_versions = Channel.empty() // Split post-percolator idXML files and manipulate such that we end up with [meta_run1, idxml_run1] [meta_run2, idxml_run2] ... // We need to make sure that the order of the runs is the same as in the mzml files since IDRipper always sorts the runs // (and nextflow does not guarantee the order of the maps in merged_meta_map) @@ -69,7 +68,6 @@ workflow QUANT { mzml, merge_meta_map ) - ch_versions = ch_versions.mix( MAP_ALIGNMENT.out.versions ) // We need to merge groupwise the aligned idxml files together to use them as id_ext in featurefinder OPENMS_IDMERGER_QUANT( MAP_ALIGNMENT.out.aligned_idxml @@ -89,11 +87,9 @@ workflow QUANT { .set { ch_runs_to_be_quantified } PROCESS_FEATURE ( ch_runs_to_be_quantified ) - ch_versions = ch_versions.mix(PROCESS_FEATURE.out.versions) OPENMS_MZTABEXPORTER(PROCESS_FEATURE.out.consensusxml) emit: consensusxml = PROCESS_FEATURE.out.consensusxml - versions = ch_versions } diff --git a/subworkflows/local/rescore/main.nf b/subworkflows/local/rescore/main.nf index aca93aff..6bee52e5 100644 --- a/subworkflows/local/rescore/main.nf +++ b/subworkflows/local/rescore/main.nf @@ -28,8 +28,6 @@ workflow RESCORE { ch_multiqc_files main: - ch_versions = Channel.empty() - // Compute features via ms2rescore MS2RESCORE(ch_merged_runs) @@ -84,6 +82,5 @@ workflow RESCORE { emit: rescored_runs = ch_rescored_runs fdr_filtered = ch_filter_q_value - versions = ch_versions multiqc_files = ch_multiqc_files } diff --git a/subworkflows/local/speclib/main.nf b/subworkflows/local/speclib/main.nf index cce8741b..cfe22ad8 100644 --- a/subworkflows/local/speclib/main.nf +++ b/subworkflows/local/speclib/main.nf @@ -21,8 +21,6 @@ workflow SPECLIB { mzml main: - ch_versions = Channel.empty() - // Load unimod tables (Future:) unimod = file("$projectDir/assets/250120_unimod_tables.xml", checkIfExists: true) @@ -53,7 +51,4 @@ workflow SPECLIB { .set { ch_global_peakpkl } EASYPQP_LIBRARY_GLOBAL(ch_global_psmpkl.join(ch_global_peakpkl)) } - - emit: - versions = ch_versions } diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index a6f7b857..8969eadb 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -7,32 +7,29 @@ }, "OPENMSTHIRDPARTY_COMETADAPTER": { "Comet": "2024.01 rev. 1", - "CometAdapter": "3.4.1" + "CometAdapter": "3.5.0" }, "OPENMS_DECOYDATABASE": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_IDFILTER_Q_VALUE": { - "openms": "3.4.1" - }, - "OPENMS_IDMASSACCURACY": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_IDMERGER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_PEPTIDEINDEXER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_PERCOLATORADAPTER": { - "PercolatorAdapter": "3.4.1-pre-exported-20250822", + "PercolatorAdapter": "3.5.0-pre-exported-20251212", "percolator": "3.07.1, Build Date Mar 13 2025 17:19:27" }, "OPENMS_PSMFEATUREEXTRACTOR": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_TEXTEXPORTER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "PYOPENMS_CHROMATOGRAMEXTRACTOR": { "pyopenms": "3.4.1" @@ -384,6 +381,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2026-01-09T09:50:11.865149581" + "timestamp": "2026-01-24T12:07:30.425542349" } } \ No newline at end of file diff --git a/tests/ionannotator.nf.test.snap b/tests/ionannotator.nf.test.snap index dd848f79..3975848a 100644 --- a/tests/ionannotator.nf.test.snap +++ b/tests/ionannotator.nf.test.snap @@ -8,32 +8,29 @@ }, "OPENMSTHIRDPARTY_COMETADAPTER": { "Comet": "2024.01 rev. 1", - "CometAdapter": "3.4.1" + "CometAdapter": "3.5.0" }, "OPENMS_DECOYDATABASE": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_IDFILTER_Q_VALUE": { - "openms": "3.4.1" - }, - "OPENMS_IDMASSACCURACY": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_IDMERGER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_PEPTIDEINDEXER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_PERCOLATORADAPTER": { - "PercolatorAdapter": "3.4.1-pre-exported-20250822", + "PercolatorAdapter": "3.5.0-pre-exported-20251212", "percolator": "3.07.1, Build Date Mar 13 2025 17:19:27" }, "OPENMS_PSMFEATUREEXTRACTOR": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_TEXTEXPORTER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "PYOPENMS_CHROMATOGRAMEXTRACTOR": { "pyopenms": "3.4.1" @@ -405,6 +402,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2026-01-09T10:04:59.923025945" + "timestamp": "2026-01-24T12:14:04.270867859" } } \ No newline at end of file diff --git a/tests/mokapot.nf.test.snap b/tests/mokapot.nf.test.snap index 045eaca7..5d6f0625 100644 --- a/tests/mokapot.nf.test.snap +++ b/tests/mokapot.nf.test.snap @@ -8,28 +8,25 @@ }, "OPENMSTHIRDPARTY_COMETADAPTER": { "Comet": "2024.01 rev. 1", - "CometAdapter": "3.4.1" + "CometAdapter": "3.5.0" }, "OPENMS_DECOYDATABASE": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_IDFILTER_Q_VALUE": { - "openms": "3.4.1" - }, - "OPENMS_IDMASSACCURACY": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_IDMERGER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_IDSCORESWITCHER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_PEPTIDEINDEXER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_TEXTEXPORTER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "PYOPENMS_CHROMATOGRAMEXTRACTOR": { "pyopenms": "3.4.1" @@ -112,6 +109,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2026-01-09T10:16:10.560078316" + "timestamp": "2026-01-24T12:19:49.496533324" } } \ No newline at end of file diff --git a/tests/speclib.nf.test.snap b/tests/speclib.nf.test.snap index 9d4e26c3..5b627b67 100644 --- a/tests/speclib.nf.test.snap +++ b/tests/speclib.nf.test.snap @@ -14,35 +14,32 @@ }, "OPENMSTHIRDPARTY_COMETADAPTER": { "Comet": "2024.01 rev. 1", - "CometAdapter": "3.4.1" + "CometAdapter": "3.5.0" }, "OPENMS_DECOYDATABASE": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_IDFILTER_FOR_SPECLIB": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_IDFILTER_Q_VALUE": { - "openms": "3.4.1" - }, - "OPENMS_IDMASSACCURACY": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_IDMERGER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_PEPTIDEINDEXER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_PERCOLATORADAPTER": { - "PercolatorAdapter": "3.4.1-pre-exported-20250822", + "PercolatorAdapter": "3.5.0-pre-exported-20251212", "percolator": "3.07.1, Build Date Mar 13 2025 17:19:27" }, "OPENMS_PSMFEATUREEXTRACTOR": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_TEXTEXPORTER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "PYOPENMS_CHROMATOGRAMEXTRACTOR": { "pyopenms": "3.4.1" @@ -396,6 +393,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2026-01-09T10:24:20.32429559" + "timestamp": "2026-01-24T12:28:10.442180709" } } \ No newline at end of file diff --git a/workflows/mhcquant.nf b/workflows/mhcquant.nf index 336a6ad1..635dffe5 100644 --- a/workflows/mhcquant.nf +++ b/workflows/mhcquant.nf @@ -57,7 +57,6 @@ workflow MHCQUANT { ch_fasta // channel: reference database read in from --fasta main: - ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() // Prepare spectra files (Decompress archives, convert to mzML, centroid if specified) @@ -68,7 +67,6 @@ workflow MHCQUANT { if (!params.skip_decoy_generation) { // Generate reversed decoy database OPENMS_DECOYDATABASE(ch_fasta) - // ch_versions = ch_versions.mix(OPENMS_DECOYDATABASE.out.versions) ch_decoy_db = OPENMS_DECOYDATABASE.out.decoy_fasta } else { ch_decoy_db = ch_fasta @@ -77,7 +75,6 @@ workflow MHCQUANT { // Optionally clean up mzML files if (params.filter_mzml){ OPENMS_FILEFILTER(PREPARE_SPECTRA.out.mzml) - // ch_versions = ch_versions.mix(OPENMS_FILEFILTER.out.versions) ch_clean_mzml_file = OPENMS_FILEFILTER.out.mzml } else { ch_clean_mzml_file = PREPARE_SPECTRA.out.mzml @@ -97,7 +94,6 @@ workflow MHCQUANT { // Run comet database search and index decoy and target hits OPENMSTHIRDPARTY_COMETADAPTER(ch_comet_in) - // ch_versions = ch_versions.mix(OPENMSTHIRDPARTY_COMETADAPTER.out.versions) // Prepare the peptideindexer channel with global fasta or per-sample_condition fasta ch_peptideindexer_in = params.fasta ? @@ -108,11 +104,9 @@ workflow MHCQUANT { .map { groupKey, meta, idxml, fasta -> [meta, idxml, fasta] } OPENMS_PEPTIDEINDEXER(ch_peptideindexer_in) - // ch_versions = ch_versions.mix(OPENMS_PEPTIDEINDEXER.out.versions) // Compute mass errors for multiQC report OPENMS_IDMASSACCURACY(PREPARE_SPECTRA.out.mzml.join(OPENMS_PEPTIDEINDEXER.out.indexed_idxml)) - // ch_versions = ch_versions.mix(OPENMS_IDMASSACCURACY.out.versions) ch_multiqc_files = ch_multiqc_files.mix(OPENMS_IDMASSACCURACY.out.frag_err.map{ meta, frag_err -> frag_err }) // Save indexed runs for later use to keep meta-run information. Sort based on file id @@ -128,7 +122,6 @@ workflow MHCQUANT { // Merge aligned idXMLfiles OPENMS_IDMERGER(ch_runs_to_merge) - // ch_versions = ch_versions.mix(OPENMS_IDMERGER.out.versions) // Run MS2Rescore ch_clean_mzml_file @@ -242,7 +235,7 @@ workflow MHCQUANT { "${process}:\n${tool_versions.join('\n')}" } - softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) + softwareVersionsToYAML(topic_versions.versions_file) .mix(topic_versions_string) .collectFile( storeDir: "${params.outdir}/pipeline_info", @@ -292,8 +285,6 @@ workflow MHCQUANT { ) emit:multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html - versions = ch_versions // channel: [ path(versions.yml) ] - } /* From 6defe0a8ab09fa86157471d7345ed43dbd029b95 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Wed, 28 Jan 2026 14:28:17 +0000 Subject: [PATCH 028/104] port back nf-core to local: idmassaccuracy since module has been depricated. --- conf/modules.config | 3 +- modules.json | 4 +- .../openms/idmassaccuracy/environment.yml | 0 .../openms/idmassaccuracy/main.nf | 1 + modules/local/openms/idmassaccuracy/meta.yml | 74 +++++++++++++++ .../nf-core/openms/idmassaccuracy/meta.yml | 72 --------------- .../openms/idmassaccuracy/tests/main.nf.test | 81 ----------------- .../idmassaccuracy/tests/main.nf.test.snap | 90 ------------------- .../idmassaccuracy/tests/nextflow.config | 27 ------ workflows/mhcquant.nf | 2 +- 10 files changed, 80 insertions(+), 274 deletions(-) rename modules/{nf-core => local}/openms/idmassaccuracy/environment.yml (100%) rename modules/{nf-core => local}/openms/idmassaccuracy/main.nf (87%) create mode 100644 modules/local/openms/idmassaccuracy/meta.yml delete mode 100644 modules/nf-core/openms/idmassaccuracy/meta.yml delete mode 100644 modules/nf-core/openms/idmassaccuracy/tests/main.nf.test delete mode 100644 modules/nf-core/openms/idmassaccuracy/tests/main.nf.test.snap delete mode 100644 modules/nf-core/openms/idmassaccuracy/tests/nextflow.config diff --git a/conf/modules.config b/conf/modules.config index 3135cba6..67e54e8e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -54,7 +54,8 @@ process { ] } - withName: 'GUNZIP' { + withName: 'y + IP' { publishDir = [ path: {"${params.outdir}"}, mode: params.publish_dir_mode, diff --git a/modules.json b/modules.json index 8eaafe97..440c8934 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "gunzip": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "96c57dfd98a0641886a67bd449fe33ee2ec0e374", "installed_by": ["modules"] }, "multiqc": { @@ -67,7 +67,7 @@ }, "thermorawfileparser": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "daaecc3478d6f6ad9cb8f48ec7d657ab6c67877f", "installed_by": ["modules"] } } diff --git a/modules/nf-core/openms/idmassaccuracy/environment.yml b/modules/local/openms/idmassaccuracy/environment.yml similarity index 100% rename from modules/nf-core/openms/idmassaccuracy/environment.yml rename to modules/local/openms/idmassaccuracy/environment.yml diff --git a/modules/nf-core/openms/idmassaccuracy/main.nf b/modules/local/openms/idmassaccuracy/main.nf similarity index 87% rename from modules/nf-core/openms/idmassaccuracy/main.nf rename to modules/local/openms/idmassaccuracy/main.nf index cb08ccd5..a248edab 100644 --- a/modules/nf-core/openms/idmassaccuracy/main.nf +++ b/modules/local/openms/idmassaccuracy/main.nf @@ -13,6 +13,7 @@ process OPENMS_IDMASSACCURACY { output: tuple val(meta), path("*frag_mass_err.tsv") , emit: frag_err tuple val(meta), path("*prec_mass_err.tsv") , emit: prec_err, optional: true + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openms/idmassaccuracy/meta.yml b/modules/local/openms/idmassaccuracy/meta.yml new file mode 100644 index 00000000..4da25896 --- /dev/null +++ b/modules/local/openms/idmassaccuracy/meta.yml @@ -0,0 +1,74 @@ +name: "openms_idfilter" +description: Filters peptide/protein identification results by different + criteria. +keywords: + - filter + - idXML + - openms + - proteomics +tools: + - "openms": + description: "OpenMS is an open-source software C++ library for LC-MS data management + and analyses" + homepage: "https://openms.de" + documentation: "https://openms.readthedocs.io/en/latest/index.html" + tool_dev_url: "https://github.com/OpenMS/OpenMS" + doi: "10.1038/s41592-024-02197-7" + licence: ["BSD"] + identifier: "" + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test', single_end:false ]` + - id_file: + type: file + description: Peptide-spectrum matches. + pattern: "*.{idXML,consensusXML}" + ontologies: [] + - filter_file: + type: file + description: Optional idXML file to filter on/out peptides or proteins + patter: "*.{idXML,fasta}" + ontologies: [] +output: + filtered: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'test', single_end:false ]` + - "*.{idXML,consensusXML}": + type: file + description: Filtered peptide-spectrum matches. + pattern: "*.{idXML,consensusXML}" + ontologies: [] + versions_openms: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - openms: + type: string + description: The name of the tool + - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": + type: eval + description: The expression to obtain the version of the tool + +authors: + - "@jonasscheid" +maintainers: + - "@jonasscheid" diff --git a/modules/nf-core/openms/idmassaccuracy/meta.yml b/modules/nf-core/openms/idmassaccuracy/meta.yml deleted file mode 100644 index 7417d69d..00000000 --- a/modules/nf-core/openms/idmassaccuracy/meta.yml +++ /dev/null @@ -1,72 +0,0 @@ -name: "openms_idmassaccuracy" -description: Calculates a distribution of the mass error from given mass spectra and - IDs. -keywords: - - mass_error - - openms - - proteomics -tools: - - "openms": - description: "OpenMS is an open-source software C++ library for LC-MS data management - and analyses" - homepage: "https://openms.de" - documentation: "https://openms.readthedocs.io/en/latest/index.html" - tool_dev_url: "https://github.com/OpenMS/OpenMS" - doi: "10.1038/s41592-024-02197-7" - licence: ["BSD"] - identifier: "" - -input: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'test' ]` - - mzmls: - type: file - description: | - List containing one or more mzML files - e.g. `[ 'file1.mzML', 'file2.mzML' ]` - pattern: "*.{mzML}" - ontologies: [] - - idxmls: - type: file - description: | - List containing one or more idXML files - e.g. `[ 'file1.idXML', 'file2.idXML' ]` - pattern: "*.{idXML}" - ontologies: [] -output: - frag_err: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'test' ]` - - "*frag_mass_err.tsv": - type: file - description: TSV file containing the fragment mass errors - pattern: "*frag_mass_err.{tsv}" - ontologies: - - edam: http://edamontology.org/format_3475 # TSV - prec_err: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'test' ]` - - "*prec_mass_err.tsv": - type: file - description: Optional TSV file containing the precursor mass errors - pattern: "*prec_mass_err.{tsv}" - ontologies: - - edam: http://edamontology.org/format_3475 # TSV - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML -authors: - - "@jonasscheid" diff --git a/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test b/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test deleted file mode 100644 index c7e2653f..00000000 --- a/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test +++ /dev/null @@ -1,81 +0,0 @@ -nextflow_process { - - name "Test Process OPENMS_IDMASSACCURACY" - script "../main.nf" - process "OPENMS_IDMASSACCURACY" - config "./nextflow.config" - - tag "modules" - tag "modules_nfcore" - tag "openms" - tag "openms/idmassaccuracy" - tag "thermorawfileparser" - tag "openms/decoydatabase" - tag "openmsthirdparty/cometadapter" - - setup { - run("THERMORAWFILEPARSER") { - script "../../../thermorawfileparser/main.nf" - process { - """ - input[0] = channel.of([ - [ id:'test'], - file(params.modules_testdata_base_path + 'proteomics/msspectra/PXD012083_e005640_II.raw', checkIfExists: true) - ]) - """ - } - } - run("OPENMS_DECOYDATABASE") { - script "../../../openms/decoydatabase/main.nf" - process { - """ - input[0] = channel.of([ - [ id:'test'], - file(params.modules_testdata_base_path + 'proteomics/database/UP000005640_9606.fasta', checkIfExists: true) - ]) - """ - } - } - run("OPENMSTHIRDPARTY_COMETADAPTER") { - script "../../../openmsthirdparty/cometadapter/main.nf" - process { - """ - input[0] = THERMORAWFILEPARSER.out.spectra.join(OPENMS_DECOYDATABASE.out.decoy_fasta) - """ - } - } - } - - test("proteomics - openms - mass_error") { - when { - process { - """ - input[0] = THERMORAWFILEPARSER.out.spectra.join(OPENMSTHIRDPARTY_COMETADAPTER.out.idxml) - """ - } - } - then { - assertAll( - { assert process.failed }, - { assert process.errorReport.contains("WARNING: This module has been deprecated.")} - ) - } - } - - test("proteomics - openms - mass_error - stub") { - options "-stub" - when { - process { - """ - input[0] = THERMORAWFILEPARSER.out.spectra.join(OPENMSTHIRDPARTY_COMETADAPTER.out.idxml) - """ - } - } - then { - assertAll( - { assert process.failed }, - { assert process.errorReport.contains("WARNING: This module has been deprecated.")} - ) - } - } -} diff --git a/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test.snap b/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test.snap deleted file mode 100644 index 69fce941..00000000 --- a/modules/nf-core/openms/idmassaccuracy/tests/main.nf.test.snap +++ /dev/null @@ -1,90 +0,0 @@ -{ - "proteomics - openms - mass_error - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test" - }, - "test_frag_mass_err.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test" - }, - "test_prec_mass_err.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - "versions.yml:md5,1957953273bbbb30ee405df5972c299a" - ], - "frag_err": [ - [ - { - "id": "test" - }, - "test_frag_mass_err.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "prec_err": [ - [ - { - "id": "test" - }, - "test_prec_mass_err.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,1957953273bbbb30ee405df5972c299a" - ] - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.8" - }, - "timestamp": "2025-10-28T08:11:12.815918913" - }, - "proteomics - openms - mass_error": { - "content": [ - { - "0": [ - [ - { - "id": "test" - }, - "test_frag_mass_err.tsv:md5,b3bf5d66998d83bd69199395843f37e5" - ] - ], - "1": [ - - ], - "2": [ - "versions.yml:md5,1957953273bbbb30ee405df5972c299a" - ], - "frag_err": [ - [ - { - "id": "test" - }, - "test_frag_mass_err.tsv:md5,b3bf5d66998d83bd69199395843f37e5" - ] - ], - "prec_err": [ - - ], - "versions": [ - "versions.yml:md5,1957953273bbbb30ee405df5972c299a" - ] - } - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.8" - }, - "timestamp": "2025-10-28T08:10:28.906846753" - } -} \ No newline at end of file diff --git a/modules/nf-core/openms/idmassaccuracy/tests/nextflow.config b/modules/nf-core/openms/idmassaccuracy/tests/nextflow.config deleted file mode 100644 index d104b313..00000000 --- a/modules/nf-core/openms/idmassaccuracy/tests/nextflow.config +++ /dev/null @@ -1,27 +0,0 @@ -process { - - withName:OPENMSTHIRDPARTY_COMETADAPTER { - ext.args = [ - "-instrument low_res", - "-fragment_bin_offset 0.4", - "-precursor_mass_tolerance 5", - "-precursor_error_units 'ppm'", - "-fragment_mass_tolerance 0.50025", - "-digest_mass_range '800:5000'", - "-max_variable_mods_in_peptide 1", - "-precursor_charge '2:5'", - "-activation_method 'CID'", - "-variable_modifications 'Oxidation (M)'", - "-enzyme 'unspecific cleavage'", - "-spectrum_batch_size 0" - ].join(' ').trim() - } - - withName:OPENMS_IDMASSACCURACY { - ext.args = [ - "-precursor_error_ppm", - "-fragment_mass_tolerance 0.50025" - ].join(' ').trim() - } - -} diff --git a/workflows/mhcquant.nf b/workflows/mhcquant.nf index e6fa9fa7..91fd368f 100644 --- a/workflows/mhcquant.nf +++ b/workflows/mhcquant.nf @@ -10,6 +10,7 @@ include { PYOPENMS_CHROMATOGRAMEXTRACTOR } from '../modules/local/pyopenms/chromatogramextractor' include { PYOPENMS_IONANNOTATOR } from '../modules/local/pyopenms/ionannotator' +include { OPENMS_IDMASSACCURACY } from '../modules/local/openms/idmassaccuracy/main' include { OPENMS_TEXTEXPORTER } from '../modules/local/openms/textexporter' include { SUMMARIZE_RESULTS } from '../modules/local/pyopenms/summarize_results' include { EPICORE } from '../modules/local/epicore' @@ -33,7 +34,6 @@ include { QUANT } from '../subworkflows/local/quant' // include { OPENMS_FILEFILTER } from '../modules/nf-core/openms/filefilter/main' include { OPENMS_DECOYDATABASE } from '../modules/nf-core/openms/decoydatabase/main' -include { OPENMS_IDMASSACCURACY } from '../modules/nf-core/openms/idmassaccuracy/main' include { OPENMSTHIRDPARTY_COMETADAPTER } from '../modules/nf-core/openmsthirdparty/cometadapter/main' include { OPENMS_PEPTIDEINDEXER } from '../modules/nf-core/openms/peptideindexer/main' include { OPENMS_IDMERGER } from '../modules/nf-core/openms/idmerger/main' From a8ed2fa87f3b4aeb244dd2e22feaea0cfb9d47b4 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Wed, 28 Jan 2026 14:28:42 +0000 Subject: [PATCH 029/104] update nf-core modules (with version topics) --- modules/nf-core/gunzip/main.nf | 3 +- modules/nf-core/gunzip/meta.yml | 28 +++++-- modules/nf-core/gunzip/tests/main.nf.test | 8 +- .../nf-core/gunzip/tests/main.nf.test.snap | 80 +++++++++++++------ modules/nf-core/thermorawfileparser/main.nf | 2 +- modules/nf-core/thermorawfileparser/meta.yml | 31 +++++-- .../tests/main.nf.test.snap | 18 +++-- 7 files changed, 121 insertions(+), 49 deletions(-) diff --git a/modules/nf-core/gunzip/main.nf b/modules/nf-core/gunzip/main.nf index df91c841..a8533e74 100644 --- a/modules/nf-core/gunzip/main.nf +++ b/modules/nf-core/gunzip/main.nf @@ -12,7 +12,7 @@ process GUNZIP { output: tuple val(meta), path("${gunzip}"), emit: gunzip - tuple val("${task.process}"), val('gunzip'), eval("echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('gunzip'), eval('gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//"'), topic: versions, emit: versions_gunzip when: task.ext.when == null || task.ext.when @@ -35,7 +35,6 @@ process GUNZIP { """ stub: - def args = task.ext.args ?: '' def extension = (archive.toString() - '.gz').tokenize('.')[-1] def name = archive.toString() - '.gz' - ".${extension}" def prefix = task.ext.prefix ?: name diff --git a/modules/nf-core/gunzip/meta.yml b/modules/nf-core/gunzip/meta.yml index 926bb22a..bba6b3ba 100644 --- a/modules/nf-core/gunzip/meta.yml +++ b/modules/nf-core/gunzip/meta.yml @@ -34,13 +34,29 @@ output: description: Compressed/uncompressed file pattern: "*.*" ontologies: [] + versions_gunzip: + - - ${task.process}: + type: string + description: The process the versions were collected from + - gunzip: + type: string + description: The tool name + - gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - gunzip: + type: string + description: The tool name + - gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//": + type: eval + description: The expression to obtain the version of the tool + authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/gunzip/tests/main.nf.test b/modules/nf-core/gunzip/tests/main.nf.test index dd4f643f..776211ad 100644 --- a/modules/nf-core/gunzip/tests/main.nf.test +++ b/modules/nf-core/gunzip/tests/main.nf.test @@ -15,7 +15,7 @@ nextflow_process { } process { """ - input[0] = channel.of([ + input[0] = Channel.of([ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] @@ -43,7 +43,7 @@ nextflow_process { } process { """ - input[0] = channel.of([ + input[0] = Channel.of([ [ id: 'test' ], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] @@ -71,7 +71,7 @@ nextflow_process { } process { """ - input[0] = channel.of([ + input[0] = Channel.of([ [], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] @@ -100,7 +100,7 @@ nextflow_process { } process { """ - input[0] = channel.of([ + input[0] = Channel.of([ [ id: 'test' ], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] diff --git a/modules/nf-core/gunzip/tests/main.nf.test.snap b/modules/nf-core/gunzip/tests/main.nf.test.snap index a0f0e67e..111ba1bc 100644 --- a/modules/nf-core/gunzip/tests/main.nf.test.snap +++ b/modules/nf-core/gunzip/tests/main.nf.test.snap @@ -11,7 +11,11 @@ ] ], "1": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + [ + "GUNZIP", + "gunzip", + "1.13" + ] ], "gunzip": [ [ @@ -21,16 +25,20 @@ "test.xyz.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-12-13T11:48:22.080222697" + "timestamp": "2026-01-19T17:21:56.633550769" }, "Should run without failures - stub": { "content": [ @@ -44,7 +52,11 @@ ] ], "1": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + [ + "GUNZIP", + "gunzip", + "1.13" + ] ], "gunzip": [ [ @@ -54,16 +66,20 @@ "test_1.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-12-13T11:48:14.593020264" + "timestamp": "2026-01-19T17:21:51.435621199" }, "Should run without failures": { "content": [ @@ -77,7 +93,11 @@ ] ], "1": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + [ + "GUNZIP", + "gunzip", + "1.13" + ] ], "gunzip": [ [ @@ -87,16 +107,20 @@ "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" ] ], - "versions": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-12-13T11:48:01.295397925" + "timestamp": "2026-01-19T17:21:40.613975821" }, "Should run without failures - prefix": { "content": [ @@ -110,7 +134,11 @@ ] ], "1": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + [ + "GUNZIP", + "gunzip", + "1.13" + ] ], "gunzip": [ [ @@ -120,15 +148,19 @@ "test.xyz.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" ] ], - "versions": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-12-13T11:48:07.414271387" + "timestamp": "2026-01-19T17:21:46.086880414" } } \ No newline at end of file diff --git a/modules/nf-core/thermorawfileparser/main.nf b/modules/nf-core/thermorawfileparser/main.nf index 03f7c42d..bb790b1c 100644 --- a/modules/nf-core/thermorawfileparser/main.nf +++ b/modules/nf-core/thermorawfileparser/main.nf @@ -12,7 +12,7 @@ process THERMORAWFILEPARSER { output: tuple val(meta), path("*.{mzML,mzML.gz,mgf,mgf.gz,parquet,parquet.gz}"), emit: spectra - tuple val("${task.process}"), val('thermorawfileparser'), eval("ThermoRawFileParser.sh --version"), emit: versions, topic: versions + tuple val("${task.process}"), val('thermorawfileparser'), eval("ThermoRawFileParser.sh --version"), emit: versions_thermorawfileparser, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/thermorawfileparser/meta.yml b/modules/nf-core/thermorawfileparser/meta.yml index 26e37e07..ecd33189 100644 --- a/modules/nf-core/thermorawfileparser/meta.yml +++ b/modules/nf-core/thermorawfileparser/meta.yml @@ -1,5 +1,6 @@ name: "thermorawfileparser" -description: Parses a Thermo RAW file containing mass spectra to an open file format +description: Parses a Thermo RAW file containing mass spectra to an open file + format keywords: - raw - mzml @@ -41,13 +42,29 @@ output: description: Mass spectra in open format pattern: "*.{mzML,mzML.gz,mgf,mgf.gz,parquet,parquet.gz}" ontologies: [] + versions_thermorawfileparser: + - - ${task.process}: + type: string + description: The process the versions were collected from + - thermorawfileparser: + type: string + description: The name of the tool + - ThermoRawFileParser.sh --version: + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - thermorawfileparser: + type: string + description: The name of the tool + - ThermoRawFileParser.sh --version: + type: eval + description: The expression to obtain the version of the tool + authors: - "@jonasscheid" maintainers: diff --git a/modules/nf-core/thermorawfileparser/tests/main.nf.test.snap b/modules/nf-core/thermorawfileparser/tests/main.nf.test.snap index 62a55e3f..a9ad37eb 100644 --- a/modules/nf-core/thermorawfileparser/tests/main.nf.test.snap +++ b/modules/nf-core/thermorawfileparser/tests/main.nf.test.snap @@ -52,7 +52,11 @@ ] ], "1": [ - "versions.yml:md5,92962c5af8265404031d46df0bda0eff" + [ + "THERMORAWFILEPARSER", + "thermorawfileparser", + "1.4.5" + ] ], "spectra": [ [ @@ -63,14 +67,18 @@ ] ], "versions": [ - "versions.yml:md5,92962c5af8265404031d46df0bda0eff" + [ + "THERMORAWFILEPARSER", + "thermorawfileparser", + "1.4.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-02-14T11:00:58.349510248" + "timestamp": "2026-01-27T17:25:10.402558587" } } \ No newline at end of file From 20e9a0b10c83a62a4926b82b0c2370079f4cabde Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Wed, 28 Jan 2026 14:29:58 +0000 Subject: [PATCH 030/104] rm idmassaccuracy from modules.json --- modules.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules.json b/modules.json index 440c8934..4d2cd03e 100644 --- a/modules.json +++ b/modules.json @@ -30,11 +30,6 @@ "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", "installed_by": ["modules"] }, - "openms/idmassaccuracy": { - "branch": "master", - "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", - "installed_by": ["modules"] - }, "openms/idmerger": { "branch": "master", "git_sha": "ca1cd2456f36c913fb3cfb6bdfbf9d1794fd493b", From 04e7c585419f0c655b0a7534df33301b256feb37 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Wed, 28 Jan 2026 15:51:35 +0100 Subject: [PATCH 031/104] Apply suggestions from code review --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 67e54e8e..271bb79a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -54,7 +54,7 @@ process { ] } - withName: 'y + withName: 'GUNZIP' { IP' { publishDir = [ path: {"${params.outdir}"}, From bd3903e5c422ffd8f18589fc4cc4b16ab17be772 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Wed, 28 Jan 2026 14:59:40 +0000 Subject: [PATCH 032/104] fix typo --- conf/modules.config | 3 --- 1 file changed, 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 271bb79a..ef1a2547 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -55,7 +55,6 @@ process { } withName: 'GUNZIP' { - IP' { publishDir = [ path: {"${params.outdir}"}, mode: params.publish_dir_mode, @@ -374,8 +373,6 @@ process { mode: params.publish_dir_mode, pattern: '*.html'] ] - errorStrategy = 'retry' - maxRetries = 3 } withName: 'OPENMS_PERCOLATORADAPTER' { From 87ecb8b8520f627e96f41c0e692890460f4441ec Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Wed, 28 Jan 2026 15:06:33 +0000 Subject: [PATCH 033/104] fix precommit --- modules/local/openms/featurefinderidentification/main.nf | 2 +- modules/local/openms/idconflictresolver/main.nf | 2 +- modules/local/openms/mapaligneridentification/main.nf | 2 +- modules/local/openms/mztabexporter/main.nf | 2 +- modules/local/openms/psmfeatureextractor/main.nf | 2 +- modules/local/openms/textexporter/main.nf | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/local/openms/featurefinderidentification/main.nf b/modules/local/openms/featurefinderidentification/main.nf index 4f9e7398..f0808aa7 100644 --- a/modules/local/openms/featurefinderidentification/main.nf +++ b/modules/local/openms/featurefinderidentification/main.nf @@ -23,7 +23,7 @@ process OPENMS_FEATUREFINDERIDENTIFICATION { def quant_fdr = params.quantification_fdr ? "-id $id_int -id_ext $id_ext -svm:min_prob ${params.quantification_min_prob}" : "-id $id_ext" def args = quant_fdr args = args + (task.ext.args ? " ${task.ext.args}" : '') - + """ FeatureFinderIdentification -in $mzml \\ -out ${prefix}.featureXML \\ diff --git a/modules/local/openms/idconflictresolver/main.nf b/modules/local/openms/idconflictresolver/main.nf index b116851e..5ba7f239 100644 --- a/modules/local/openms/idconflictresolver/main.nf +++ b/modules/local/openms/idconflictresolver/main.nf @@ -19,7 +19,7 @@ process OPENMS_IDCONFLICTRESOLVER { script: def prefix = task.ext.prefix ?: "${meta.id}_resolved" - + """ IDConflictResolver -in $consensus \\ -out ${prefix}.consensusXML \\ diff --git a/modules/local/openms/mapaligneridentification/main.nf b/modules/local/openms/mapaligneridentification/main.nf index fc5f9e43..84ed2a65 100644 --- a/modules/local/openms/mapaligneridentification/main.nf +++ b/modules/local/openms/mapaligneridentification/main.nf @@ -20,7 +20,7 @@ process OPENMS_MAPALIGNERIDENTIFICATION { script: def args = task.ext.args ?: '' def out_names = idxmls.collect { it.baseName.replace('_fdr_filtered','')+'.trafoXML' }.join(' ') - + """ MapAlignerIdentification -in $idxmls \\ -trafo_out ${out_names} \\ diff --git a/modules/local/openms/mztabexporter/main.nf b/modules/local/openms/mztabexporter/main.nf index 8190d457..184482d0 100644 --- a/modules/local/openms/mztabexporter/main.nf +++ b/modules/local/openms/mztabexporter/main.nf @@ -20,7 +20,7 @@ process OPENMS_MZTABEXPORTER { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - + """ MzTabExporter -in $in_file \\ -out ${prefix}.mzTab \\ diff --git a/modules/local/openms/psmfeatureextractor/main.nf b/modules/local/openms/psmfeatureextractor/main.nf index d97e4a87..7e12ead4 100644 --- a/modules/local/openms/psmfeatureextractor/main.nf +++ b/modules/local/openms/psmfeatureextractor/main.nf @@ -24,7 +24,7 @@ process OPENMS_PSMFEATUREEXTRACTOR { """ extra_features=\$(awk 'NR > 1 && \$1 !~ /psm_file/ {printf \"%s \", \$2}' ${feature_file}) - + PSMFeatureExtractor -in $idxml \\ -out ${prefix}.idXML \\ -threads $task.cpus \\ diff --git a/modules/local/openms/textexporter/main.nf b/modules/local/openms/textexporter/main.nf index bb18f39b..42835ceb 100644 --- a/modules/local/openms/textexporter/main.nf +++ b/modules/local/openms/textexporter/main.nf @@ -20,7 +20,7 @@ process OPENMS_TEXTEXPORTER { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - + """ TextExporter -in $file \\ -out ${prefix}_exported.tsv \\ From 9e27576563e2235fe6867603bf39f67d0a499d2e Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 29 Jan 2026 07:35:40 +0000 Subject: [PATCH 034/104] Fix escaped backslash in idmassaccuracy version extraction --- modules/local/openms/idmassaccuracy/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/openms/idmassaccuracy/main.nf b/modules/local/openms/idmassaccuracy/main.nf index a248edab..9c4d4cd0 100644 --- a/modules/local/openms/idmassaccuracy/main.nf +++ b/modules/local/openms/idmassaccuracy/main.nf @@ -13,7 +13,7 @@ process OPENMS_IDMASSACCURACY { output: tuple val(meta), path("*frag_mass_err.tsv") , emit: frag_err tuple val(meta), path("*prec_mass_err.tsv") , emit: prec_err, optional: true - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\1/p'"), emit: versions_openms, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions when: task.ext.when == null || task.ext.when From eb4b251b2cf39cf53c77c66c5fadee53dbb91577 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 29 Jan 2026 08:02:02 +0000 Subject: [PATCH 035/104] Add OPENMS_IDMASSACCURACY to test snapshots --- tests/default.nf.test.snap | 3 +++ tests/ionannotator.nf.test.snap | 3 +++ tests/mokapot.nf.test.snap | 3 +++ tests/speclib.nf.test.snap | 3 +++ 4 files changed, 12 insertions(+) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 8969eadb..7240ec39 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -15,6 +15,9 @@ "OPENMS_IDFILTER_Q_VALUE": { "openms": "3.5.0" }, + "OPENMS_IDMASSACCURACY": { + "openms": "3.4.1" + }, "OPENMS_IDMERGER": { "openms": "3.5.0" }, diff --git a/tests/ionannotator.nf.test.snap b/tests/ionannotator.nf.test.snap index 3975848a..d7ceb2b1 100644 --- a/tests/ionannotator.nf.test.snap +++ b/tests/ionannotator.nf.test.snap @@ -16,6 +16,9 @@ "OPENMS_IDFILTER_Q_VALUE": { "openms": "3.5.0" }, + "OPENMS_IDMASSACCURACY": { + "openms": "3.4.1" + }, "OPENMS_IDMERGER": { "openms": "3.5.0" }, diff --git a/tests/mokapot.nf.test.snap b/tests/mokapot.nf.test.snap index 5d6f0625..9dfb2ea9 100644 --- a/tests/mokapot.nf.test.snap +++ b/tests/mokapot.nf.test.snap @@ -16,6 +16,9 @@ "OPENMS_IDFILTER_Q_VALUE": { "openms": "3.5.0" }, + "OPENMS_IDMASSACCURACY": { + "openms": "3.4.1" + }, "OPENMS_IDMERGER": { "openms": "3.5.0" }, diff --git a/tests/speclib.nf.test.snap b/tests/speclib.nf.test.snap index 5b627b67..f988a64d 100644 --- a/tests/speclib.nf.test.snap +++ b/tests/speclib.nf.test.snap @@ -25,6 +25,9 @@ "OPENMS_IDFILTER_Q_VALUE": { "openms": "3.5.0" }, + "OPENMS_IDMASSACCURACY": { + "openms": "3.4.1" + }, "OPENMS_IDMERGER": { "openms": "3.5.0" }, From 859ae6459d4f3f6b545adb64f9e04fc711c7fbd6 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 29 Jan 2026 08:20:53 +0000 Subject: [PATCH 036/104] Update test_single_quant snapshot to 3.5.0 versions --- tests/test_single_quant.nf.test.snap | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/test_single_quant.nf.test.snap b/tests/test_single_quant.nf.test.snap index b75486f8..60868f96 100644 --- a/tests/test_single_quant.nf.test.snap +++ b/tests/test_single_quant.nf.test.snap @@ -3,36 +3,36 @@ "content": [ { "MS2RESCORE": { - "MS\u00b2Rescore": "3.1.5)" + "MS2Rescore": "3.1.5" }, "OPENMSTHIRDPARTY_COMETADAPTER": { - "CometAdapter": "3.4.1", - "Comet": "2024.01 rev. 1" + "Comet": "2024.01 rev. 1", + "CometAdapter": "3.5.0" }, "OPENMS_DECOYDATABASE": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_IDFILTER_Q_VALUE": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_IDMASSACCURACY": { - "OpenMS": "3.4.1" + "openms": "3.4.1" }, "OPENMS_IDMERGER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_PEPTIDEINDEXER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_PERCOLATORADAPTER": { - "PercolatorAdapter": "3.4.1-pre-exported-20250822", + "PercolatorAdapter": "3.5.0-pre-exported-20251212", "percolator": "3.07.1, Build Date Mar 13 2025 17:19:27" }, "OPENMS_PSMFEATUREEXTRACTOR": { - "openms": "3.4.1" + "openms": "3.5.0" }, "OPENMS_TEXTEXPORTER": { - "openms": "3.4.1" + "openms": "3.5.0" }, "PYOPENMS_CHROMATOGRAMEXTRACTOR": { "pyopenms": "3.4.1" From 6e8bd6ee74413c1a2b7d7f526231803a599f987b Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Thu, 29 Jan 2026 09:42:22 +0100 Subject: [PATCH 037/104] Apply suggestion from @jonasscheid --- modules/local/openms/idconflictresolver/main.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/local/openms/idconflictresolver/main.nf b/modules/local/openms/idconflictresolver/main.nf index 5ba7f239..c5389502 100644 --- a/modules/local/openms/idconflictresolver/main.nf +++ b/modules/local/openms/idconflictresolver/main.nf @@ -21,7 +21,8 @@ process OPENMS_IDCONFLICTRESOLVER { def prefix = task.ext.prefix ?: "${meta.id}_resolved" """ - IDConflictResolver -in $consensus \\ + IDConflictResolver \\ + -in $consensus \\ -out ${prefix}.consensusXML \\ -threads $task.cpus """ From 3b3578338925ada15aa0fce8ba5b366a0ae4d652 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 29 Jan 2026 09:34:25 +0000 Subject: [PATCH 038/104] Fix OpenMS tool formatting to use multi-line style --- modules/local/openms/featurefinderidentification/main.nf | 3 ++- modules/local/openms/mapaligneridentification/main.nf | 3 ++- modules/local/openms/maprttransformer/main.nf | 3 ++- modules/local/openms/mztabexporter/main.nf | 3 ++- modules/local/openms/psmfeatureextractor/main.nf | 3 ++- modules/local/openms/textexporter/main.nf | 3 ++- .../local/openmsthirdparty/featurelinkerunlabeledkd/main.nf | 3 ++- 7 files changed, 14 insertions(+), 7 deletions(-) diff --git a/modules/local/openms/featurefinderidentification/main.nf b/modules/local/openms/featurefinderidentification/main.nf index f0808aa7..100019b4 100644 --- a/modules/local/openms/featurefinderidentification/main.nf +++ b/modules/local/openms/featurefinderidentification/main.nf @@ -25,7 +25,8 @@ process OPENMS_FEATUREFINDERIDENTIFICATION { args = args + (task.ext.args ? " ${task.ext.args}" : '') """ - FeatureFinderIdentification -in $mzml \\ + FeatureFinderIdentification \\ + -in $mzml \\ -out ${prefix}.featureXML \\ -threads $task.cpus \\ $args diff --git a/modules/local/openms/mapaligneridentification/main.nf b/modules/local/openms/mapaligneridentification/main.nf index 84ed2a65..ca9630e9 100644 --- a/modules/local/openms/mapaligneridentification/main.nf +++ b/modules/local/openms/mapaligneridentification/main.nf @@ -22,7 +22,8 @@ process OPENMS_MAPALIGNERIDENTIFICATION { def out_names = idxmls.collect { it.baseName.replace('_fdr_filtered','')+'.trafoXML' }.join(' ') """ - MapAlignerIdentification -in $idxmls \\ + MapAlignerIdentification \\ + -in $idxmls \\ -trafo_out ${out_names} \\ $args """ diff --git a/modules/local/openms/maprttransformer/main.nf b/modules/local/openms/maprttransformer/main.nf index b9d9cad3..2977da96 100644 --- a/modules/local/openms/maprttransformer/main.nf +++ b/modules/local/openms/maprttransformer/main.nf @@ -23,7 +23,8 @@ process OPENMS_MAPRTTRANSFORMER { def fileExt = alignment_file.collect { it.name.tokenize("\\.")[1] }.join(' ') """ - MapRTTransformer -in $alignment_file \\ + MapRTTransformer \\ + -in $alignment_file \\ -trafo_in $trafoxml \\ -out ${prefix}.${fileExt} \\ -threads $task.cpus \\ diff --git a/modules/local/openms/mztabexporter/main.nf b/modules/local/openms/mztabexporter/main.nf index 184482d0..36349a28 100644 --- a/modules/local/openms/mztabexporter/main.nf +++ b/modules/local/openms/mztabexporter/main.nf @@ -22,7 +22,8 @@ process OPENMS_MZTABEXPORTER { def prefix = task.ext.prefix ?: "${meta.id}" """ - MzTabExporter -in $in_file \\ + MzTabExporter \\ + -in $in_file \\ -out ${prefix}.mzTab \\ -threads $task.cpus \\ $args diff --git a/modules/local/openms/psmfeatureextractor/main.nf b/modules/local/openms/psmfeatureextractor/main.nf index 7e12ead4..407e04a5 100644 --- a/modules/local/openms/psmfeatureextractor/main.nf +++ b/modules/local/openms/psmfeatureextractor/main.nf @@ -25,7 +25,8 @@ process OPENMS_PSMFEATUREEXTRACTOR { """ extra_features=\$(awk 'NR > 1 && \$1 !~ /psm_file/ {printf \"%s \", \$2}' ${feature_file}) - PSMFeatureExtractor -in $idxml \\ + PSMFeatureExtractor \\ + -in $idxml \\ -out ${prefix}.idXML \\ -threads $task.cpus \\ -extra \$extra_features \\ diff --git a/modules/local/openms/textexporter/main.nf b/modules/local/openms/textexporter/main.nf index 42835ceb..920f312f 100644 --- a/modules/local/openms/textexporter/main.nf +++ b/modules/local/openms/textexporter/main.nf @@ -22,7 +22,8 @@ process OPENMS_TEXTEXPORTER { def prefix = task.ext.prefix ?: "${meta.id}" """ - TextExporter -in $file \\ + TextExporter \\ + -in $file \\ -out ${prefix}_exported.tsv \\ -threads $task.cpus \\ -id:add_hit_metavalues 0 \\ diff --git a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf index 2d804ddc..a10153d2 100644 --- a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf +++ b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf @@ -21,7 +21,8 @@ process OPENMS_FEATURELINKERUNLABELEDKD { def prefix = task.ext.prefix ?: "${meta.id}_all_features_merged" """ - FeatureLinkerUnlabeledKD -in $features \\ + FeatureLinkerUnlabeledKD \\ + -in $features \\ -out ${prefix}.consensusXML \\ -threads $task.cpus """ From 91bb0f6e39756a4486305c8a158efabace250f9a Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Thu, 29 Jan 2026 10:57:12 +0100 Subject: [PATCH 039/104] Update CHANGELOG.md Co-authored-by: Joon Klaps --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 303be25d..8f8b9c2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | ---------- | ----------- | ----------- | | `MultiQC` | 1.31.0 | 1.33.0 | | `Nf-core` | 3.4.1 | 3.5.1 | +| `openms` | 3.4.1 | 3.5.0 | ## 3.1.0 - BlüBa - 07/01/26 From ae96114d0121d60da330760d6d6442010bf1d730 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Thu, 29 Jan 2026 10:57:24 +0100 Subject: [PATCH 040/104] Update subworkflows/local/rescore/main.nf Co-authored-by: Joon Klaps --- subworkflows/local/rescore/main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/rescore/main.nf b/subworkflows/local/rescore/main.nf index 6bee52e5..74a4115b 100644 --- a/subworkflows/local/rescore/main.nf +++ b/subworkflows/local/rescore/main.nf @@ -74,7 +74,6 @@ workflow RESCORE { ch_rescored_runs = ch_pout // Filter by percolator q-value OPENMS_IDFILTER_Q_VALUE(ch_rescored_runs.map {group_meta, idxml -> [group_meta, idxml, []]}) - // ch_versions = ch_versions.mix(OPENMS_IDFILTER_Q_VALUE.out.versions) ch_filter_q_value = OPENMS_IDFILTER_Q_VALUE.out.filtered } } From 8ba585a7fb92e39760d30c1ce8db1c5477c82dcb Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Thu, 29 Jan 2026 10:57:33 +0100 Subject: [PATCH 041/104] Update subworkflows/local/rescore/main.nf Co-authored-by: Joon Klaps --- subworkflows/local/rescore/main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/rescore/main.nf b/subworkflows/local/rescore/main.nf index 74a4115b..e82f57e0 100644 --- a/subworkflows/local/rescore/main.nf +++ b/subworkflows/local/rescore/main.nf @@ -63,7 +63,6 @@ workflow RESCORE { ch_rescored_runs = OPENMS_PERCOLATORADAPTER_GLOBAL.out.idxml // Filter by global percolator q-value OPENMS_IDFILTER_Q_VALUE_GLOBAL(ch_rescored_runs.map {id, idxml -> [id, idxml, []]}) - // ch_versions = ch_versions.mix(OPENMS_IDFILTER_Q_VALUE_GLOBAL.out.versions) // Backfilter sample_condition runs according to global FDR OPENMS_IDFILTER_GLOBAL(ch_pout.combine(OPENMS_IDFILTER_Q_VALUE_GLOBAL.out.filtered.map{ it[1] })) ch_filter_q_value = OPENMS_IDFILTER_GLOBAL.out.filtered From 98fd653eebeecb343d0838b0de852b3ebd7a5d39 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Thu, 29 Jan 2026 10:58:31 +0100 Subject: [PATCH 042/104] Update modules/local/openms/featurefinderidentification/main.nf Co-authored-by: Joon Klaps --- modules/local/openms/featurefinderidentification/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/openms/featurefinderidentification/main.nf b/modules/local/openms/featurefinderidentification/main.nf index 100019b4..8c9303bd 100644 --- a/modules/local/openms/featurefinderidentification/main.nf +++ b/modules/local/openms/featurefinderidentification/main.nf @@ -13,7 +13,7 @@ process OPENMS_FEATUREFINDERIDENTIFICATION { output: tuple val(meta), path("*.featureXML"), emit: featurexml - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions_featurefinderidentification, topic: versions when: task.ext.when == null || task.ext.when From 17e6397a7d68db421f2c1263e0cc70421b8ccc4e Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Thu, 29 Jan 2026 10:59:27 +0100 Subject: [PATCH 043/104] Update subworkflows/local/rescore/main.nf Co-authored-by: Joon Klaps --- subworkflows/local/rescore/main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/rescore/main.nf b/subworkflows/local/rescore/main.nf index e82f57e0..716c667d 100644 --- a/subworkflows/local/rescore/main.nf +++ b/subworkflows/local/rescore/main.nf @@ -43,7 +43,6 @@ workflow RESCORE { // Filter by mokapot q-value OPENMS_IDFILTER_Q_VALUE(ch_rescored_runs.map {group_meta, idxml -> [group_meta, idxml, []]}) - // ch_versions = ch_versions.mix(OPENMS_IDFILTER_Q_VALUE.out.versions) ch_filter_q_value = OPENMS_IDFILTER_Q_VALUE.out.filtered } else { From c7672254c85ee26a77aa6cd7d92f7a709aebedb3 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Thu, 29 Jan 2026 10:59:45 +0100 Subject: [PATCH 044/104] Update subworkflows/local/prepare_spectra/main.nf Co-authored-by: Joon Klaps --- subworkflows/local/prepare_spectra/main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/prepare_spectra/main.nf b/subworkflows/local/prepare_spectra/main.nf index 3681cce4..d51a6f48 100644 --- a/subworkflows/local/prepare_spectra/main.nf +++ b/subworkflows/local/prepare_spectra/main.nf @@ -34,7 +34,6 @@ workflow PREPARE_SPECTRA { // Raw file conversion THERMORAWFILEPARSER(branched_ms_files.raw) - // ch_versions = ch_versions.mix(THERMORAWFILEPARSER.out.versions) // Decompress timsTOF archive for data conversion UNTAR(branched_ms_files.d_tar) From d7a9324d4a2ca500e61b2c655e0fd91236f9ce48 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Thu, 29 Jan 2026 11:05:04 +0100 Subject: [PATCH 045/104] Apply suggestion from @jonasscheid --- subworkflows/local/rescore/main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/rescore/main.nf b/subworkflows/local/rescore/main.nf index 716c667d..d6b503a1 100644 --- a/subworkflows/local/rescore/main.nf +++ b/subworkflows/local/rescore/main.nf @@ -38,7 +38,6 @@ workflow RESCORE { } // Switch comet e-value to mokapot q-value OPENMS_IDSCORESWITCHER(MS2RESCORE.out.idxml) - // ch_versions = ch_versions.mix(OPENMS_IDSCORESWITCHER.out.versions) ch_rescored_runs = OPENMS_IDSCORESWITCHER.out.idxml // Filter by mokapot q-value From ff79328fe79a4780275f5aeef8208be1a31636c0 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 6 Feb 2026 13:12:52 +0000 Subject: [PATCH 046/104] Add per-sample search parameter support via samplesheet and presets - Add 12 optional search parameter columns to schema_input.json (SearchPreset, PeptideMinLength, PeptideMaxLength, PrecursorMassRange, PrecursorCharge, etc.) - Add resolveSearchParams() with priority: individual column > preset > global params - Add search_presets.config with 8 presets (lumos/qe/timstof/xl x class1/class2) - Convert Sample/Condition integers to strings during samplesheet parsing - Add test_search_params profile to nextflow.config --- assets/schema_input.json | 86 +++++++++++- conf/search_presets.config | 122 ++++++++++++++++++ nextflow.config | 8 +- .../utils_nfcore_mhcquant_pipeline/main.nf | 47 ++++++- 4 files changed, 255 insertions(+), 8 deletions(-) create mode 100644 conf/search_presets.config diff --git a/assets/schema_input.json b/assets/schema_input.json index 253b30dd..acbe53d8 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -13,14 +13,20 @@ "meta": ["id"] }, "Sample": { - "type": "string", - "pattern": "^\\S+$", + "type": ["string", "integer"], + "anyOf": [ + { "type": "string", "pattern": "^\\S+$" }, + { "type": "integer" } + ], "errorMessage": "Sample name must be provided and cannot contain spaces", "meta": ["sample"] }, "Condition": { - "type": "string", - "pattern": "^\\S+-?", + "type": ["string", "integer"], + "anyOf": [ + { "type": "string", "pattern": "^\\S+-?" }, + { "type": "integer" } + ], "errorMessage": "Sample condition must be provided and cannot contain spaces", "meta": ["condition"] }, @@ -37,6 +43,78 @@ "exists": true, "pattern": "^\\S+\\.(fasta|fa|fas|fna|faa|ffn)$", "errorMessage": "FASTA file cannot contain spaces and must have one of the extensions: fasta | fa | fas | fna | faa | ffn" + }, + "SearchPreset": { + "type": "string", + "enum": ["lumos_class1", "lumos_class2", "qe_class1", "qe_class2", "timstof_class1", "timstof_class2", "xl_class1", "xl_class2"], + "errorMessage": "SearchPreset must be one of: lumos_class1, lumos_class2, qe_class1, qe_class2, timstof_class1, timstof_class2, xl_class1, xl_class2. Can be extended upon request.", + "meta": ["search_preset"] + }, + "PeptideMinLength": { + "type": "integer", + "minimum": 1, + "errorMessage": "PeptideMinLength must be a positive integer", + "meta": ["peptide_min_length"] + }, + "PeptideMaxLength": { + "type": "integer", + "minimum": 1, + "errorMessage": "PeptideMaxLength must be a positive integer", + "meta": ["peptide_max_length"] + }, + "PrecursorMassRange": { + "type": "string", + "pattern": "^\\d+:\\d+$", + "errorMessage": "PrecursorMassRange must be in format 'min:max' (e.g., '800:2500')", + "meta": ["digest_mass_range"] + }, + "PrecursorCharge": { + "type": "string", + "pattern": "^\\d+:\\d+$", + "errorMessage": "PrecursorCharge must be in format 'min:max' (e.g., '2:3')", + "meta": ["prec_charge"] + }, + "PrecursorMassTolerance": { + "type": "integer", + "minimum": 0, + "errorMessage": "PrecursorMassTolerance must be a non-negative integer", + "meta": ["precursor_mass_tolerance"] + }, + "FragmentMassTolerance": { + "type": "number", + "minimum": 0, + "errorMessage": "FragmentMassTolerance must be a non-negative number", + "meta": ["fragment_mass_tolerance"] + }, + "FragmentBinOffset": { + "type": "number", + "minimum": 0, + "errorMessage": "FragmentBinOffset is recommended to be 0 for high res and 0.4 for low res devices.", + "meta": ["fragment_bin_offset"] + }, + "MS2PIPModel": { + "type": "string", + "enum": ["Immuno-HCD", "timsTOF", "CIDch2", "HCD", "CID", "ITMS", "iTRAQ", "iTRAQphospho", "TMT", "HCDch2"], + "errorMessage": "MS2PIPModel must be a valid MS2PIP model name", + "meta": ["ms2pip_model"] + }, + "ActivationMethod": { + "type": "string", + "enum": ["ALL", "CID", "HCD", "ETD", "ECD", "EThcD", "ETciD"], + "errorMessage": "ActivationMethod must be one of: ALL, CID, HCD, ETD, ECD, EThcD, ETciD", + "meta": ["activation_method"] + }, + "Instrument": { + "type": "string", + "enum": ["high_res", "low_res"], + "errorMessage": "Instrument must be either 'high_res' or 'low_res'", + "meta": ["instrument"] + }, + "NumberMods": { + "type": "integer", + "minimum": 0, + "errorMessage": "NumberMods must be a non-negative integer", + "meta": ["number_mods"] } }, "required": ["ID", "Sample", "Condition", "ReplicateFileName"] diff --git a/conf/search_presets.config b/conf/search_presets.config new file mode 100644 index 00000000..3aecae72 --- /dev/null +++ b/conf/search_presets.config @@ -0,0 +1,122 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Search parameter presets for different MHC classes and instruments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Define preset parameter maps that can be referenced in the samplesheet + via the SearchPreset column. Parameters specified in the samplesheet + individually will override preset values. +---------------------------------------------------------------------------------------- +*/ + +params { + search_presets = [ + // Lumos instrument presets + 'lumos_class1': [ + peptide_min_length: 8, + peptide_max_length: 14, + digest_mass_range: '800:2500', + prec_charge: '2:3', + precursor_mass_tolerance: 5, + fragment_mass_tolerance: 0.01, + fragment_bin_offset: 0.0, + ms2pip_model: 'Immuno-HCD', + activation_method: 'HCD', + instrument: 'high_res', + number_mods: 3 + ], + 'lumos_class2': [ + peptide_min_length: 8, + peptide_max_length: 30, + digest_mass_range: '800:5000', + prec_charge: '2:5', + precursor_mass_tolerance: 5, + fragment_mass_tolerance: 0.01, + fragment_bin_offset: 0.0, + ms2pip_model: 'Immuno-HCD', + activation_method: 'HCD', + instrument: 'high_res', + number_mods: 5 + ], + // Q Exactive instrument presets + 'qe_class1': [ + peptide_min_length: 8, + peptide_max_length: 14, + digest_mass_range: '800:2500', + prec_charge: '2:3', + precursor_mass_tolerance: 5, + fragment_mass_tolerance: 0.01, + fragment_bin_offset: 0.0, + ms2pip_model: 'Immuno-HCD', + activation_method: 'HCD', + instrument: 'high_res', + number_mods: 3 + ], + 'qe_class2': [ + peptide_min_length: 8, + peptide_max_length: 30, + digest_mass_range: '800:5000', + prec_charge: '2:5', + precursor_mass_tolerance: 5, + fragment_mass_tolerance: 0.01, + fragment_bin_offset: 0.0, + ms2pip_model: 'Immuno-HCD', + activation_method: 'HCD', + instrument: 'high_res', + number_mods: 5 + ], + // timsTOF instrument presets + 'timstof_class1': [ + peptide_min_length: 8, + peptide_max_length: 14, + digest_mass_range: '800:2500', + prec_charge: '1:4', + precursor_mass_tolerance: 20, + fragment_mass_tolerance: 0.01, + fragment_bin_offset: 0.0, + ms2pip_model: 'timsTOF', + activation_method: 'CID', + instrument: 'high_res', + number_mods: 3 + ], + 'timstof_class2': [ + peptide_min_length: 8, + peptide_max_length: 30, + digest_mass_range: '800:5000', + prec_charge: '1:5', + precursor_mass_tolerance: 20, + fragment_mass_tolerance: 0.01, + fragment_bin_offset: 0.0, + ms2pip_model: 'timsTOF', + activation_method: 'CID', + instrument: 'high_res', + number_mods: 5 + ], + // Cross-linking / low-resolution presets + 'xl_class1': [ + peptide_min_length: 8, + peptide_max_length: 14, + digest_mass_range: '800:2500', + prec_charge: '2:3', + precursor_mass_tolerance: 5, + fragment_mass_tolerance: 0.50025, + fragment_bin_offset: 0.4, + ms2pip_model: 'CIDch2', + activation_method: 'CID', + instrument: 'low_res', + number_mods: 3 + ], + 'xl_class2': [ + peptide_min_length: 8, + peptide_max_length: 30, + digest_mass_range: '800:5000', + prec_charge: '2:5', + precursor_mass_tolerance: 5, + fragment_mass_tolerance: 0.50025, + fragment_bin_offset: 0.4, + ms2pip_model: 'CIDch2', + activation_method: 'CID', + instrument: 'low_res', + number_mods: 5 + ] + ] +} diff --git a/nextflow.config b/nextflow.config index f6c199a8..8f182467 100644 --- a/nextflow.config +++ b/nextflow.config @@ -118,6 +118,9 @@ params { // Load base.config by default for all pipelines includeConfig 'conf/base.config' +// Load search parameter presets +includeConfig 'conf/search_presets.config' + profiles { debug { dumpHashes = true @@ -235,8 +238,9 @@ profiles { test_epicore { includeConfig 'conf/test_epicore.config' } test_speclib { includeConfig 'conf/test_speclib.config' } test_timstof { includeConfig 'conf/test_timstof.config' } - test_single_quant { includeConfig 'conf/test_single_quant.config' } - test_full { includeConfig 'conf/test_full.config' } + test_single_quant { includeConfig 'conf/test_single_quant.config' } + test_search_params { includeConfig 'conf/test_search_params.config' } + test_full { includeConfig 'conf/test_full.config' } } // Load nf-core custom profiles from different institutions diff --git a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf index d9e4a535..fd5a8586 100644 --- a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf @@ -97,13 +97,20 @@ workflow PIPELINE_INITIALISATION { channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) - .map { meta, file, fasta -> [meta.subMap('sample','condition'), meta, file, fasta] } + .map { meta, file, fasta -> + def m = meta + [sample: meta.sample.toString(), condition: meta.condition.toString()] + [m.subMap('sample','condition'), m, file, fasta] + } .tap { ch_input } .groupTuple() // get number of files per sample-condition .map { group_meta, metas, files, fastas -> [ group_meta, files.size()] } .combine( ch_input, by:0 ) - .map { group_meta, group_count, meta, file, fasta -> [meta + ['group_count':group_count, 'spectra':file.baseName.tokenize('.')[0], 'ext':getCustomExtension(file)], file, fasta] } + .map { group_meta, group_count, meta, file, fasta -> + def enrichedMeta = meta + ['group_count':group_count, 'spectra':file.baseName.tokenize('.')[0], 'ext':getCustomExtension(file)] + def resolved = resolveSearchParams(enrichedMeta, params.search_presets) + [resolved, file, fasta] + } .set { ch_samplesheet_raw } ch_samplesheet = ch_samplesheet_raw.map { meta, file, fasta -> [ meta, file ]} @@ -208,6 +215,42 @@ workflow PIPELINE_COMPLETION { FUNCTIONS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +// +// Resolve a search parameter with priority: meta (individual) > preset > global params +// +def resolveSearchParams(meta, searchPresets) { + def presetName = meta.search_preset + + if (!presetName || !searchPresets) { + return meta + } + + def presetConfig = searchPresets[presetName] + if (!presetConfig) { + return meta + } + + // Build result map - explicitly copy each search param from preset if not already in meta + def result = new LinkedHashMap(meta) + + // Explicitly set each search parameter + def searchParamKeys = ['peptide_min_length', 'peptide_max_length', 'digest_mass_range', 'prec_charge', + 'precursor_mass_tolerance', 'fragment_mass_tolerance', 'fragment_bin_offset', + 'ms2pip_model', 'activation_method', 'instrument', 'number_mods'] + + searchParamKeys.each { key -> + // Check for null OR empty (nf-schema sets empty columns to empty lists []) + def currentValue = result[key] + def isEmpty = (currentValue == null) || (currentValue instanceof List && currentValue.size() == 0) || (currentValue == '') + if (isEmpty && presetConfig.containsKey(key)) { + result.put(key, presetConfig.get(key)) + } + } + + return result +} + // // Validate channels from input samplesheet // From 100aa29cfb398d5ef2055fdce62b0b56f2e5d084 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 6 Feb 2026 13:13:00 +0000 Subject: [PATCH 047/104] Use meta-based search parameters in module configs - Apply meta.X ?: params.X pattern for per-sample parameter override in CometAdapter, IDFilter, MS2Rescore, IDMassAccuracy, and IonAnnotator - Add -weights flag to PERCOLATORADAPTER_GLOBAL to avoid filename collisions --- conf/modules.config | 61 +++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index ef1a2547..e522262e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -94,18 +94,18 @@ process { ext.args = { [ (params.default_params_file_comet != " ") ? "-default_params_file ${params.default_params_file_comet}" : "", "-pin_out ${mzml.baseName}_pin.tsv", - "-instrument ${params.instrument}", + "-instrument ${meta.instrument ?: params.instrument}", "-spectrum_batch_size ${params.spectrum_batch_size}", - "-activation_method ${params.activation_method}", - "-precursor_mass_tolerance ${params.precursor_mass_tolerance}", + "-activation_method ${meta.activation_method ?: params.activation_method}", + "-precursor_mass_tolerance ${meta.precursor_mass_tolerance ?: params.precursor_mass_tolerance}", "-precursor_error_units ${params.precursor_error_units}", - "-fragment_mass_tolerance ${params.fragment_mass_tolerance}", - "-fragment_bin_offset ${params.fragment_bin_offset}", + "-fragment_mass_tolerance ${meta.fragment_mass_tolerance ?: params.fragment_mass_tolerance}", + "-fragment_bin_offset ${meta.fragment_bin_offset ?: params.fragment_bin_offset}", "-num_hits ${params.num_hits}", - "-digest_mass_range ${params.digest_mass_range}", - "-max_variable_mods_in_peptide ${params.number_mods}", + "-digest_mass_range ${meta.digest_mass_range ?: params.digest_mass_range}", + "-max_variable_mods_in_peptide ${meta.number_mods ?: params.number_mods}", "-missed_cleavages 0", - "-precursor_charge ${params.prec_charge}", + "-precursor_charge ${meta.prec_charge ?: params.prec_charge}", "-fixed_modifications ${params.fixed_mods.tokenize(',').collect {"'${it}'"}.join(" ")}", "-variable_modifications ${params.variable_mods.tokenize(',').collect {"'${it}'"}.join(" ")}", "-enzyme '${params.enzyme}'", @@ -156,12 +156,12 @@ process { withName: 'OPENMS_IDFILTER_Q_VALUE' { ext.prefix = {"${meta.id}_pout_filtered"} - ext.args = [ + ext.args = { [ "-remove_decoys", - "-precursor:length '${params.peptide_min_length}:${params.peptide_max_length}'", + "-precursor:length '${meta.peptide_min_length ?: params.peptide_min_length}:${meta.peptide_max_length ?: params.peptide_max_length}'", "-delete_unreferenced_peptide_hits", (params.fdr_threshold == '0.01') ? "-score:peptide 0.05" : "-score:peptide " + params.fdr_threshold - ].join(' ').trim() + ].join(' ').trim() } publishDir = [ path: {"${params.outdir}/intermediate_results/rescoring"}, mode: params.publish_dir_mode, @@ -172,12 +172,12 @@ process { withName: 'OPENMS_IDFILTER_Q_VALUE_GLOBAL' { label = 'process_high_memory' ext.prefix = {"${meta.id}_pout_filtered"} - ext.args = [ + ext.args = { [ "-remove_decoys", - "-precursor:length '${params.peptide_min_length}:${params.peptide_max_length}'", + "-precursor:length '${meta.peptide_min_length ?: params.peptide_min_length}:${meta.peptide_max_length ?: params.peptide_max_length}'", "-delete_unreferenced_peptide_hits", (params.fdr_threshold == '0.01') ? "-score:peptide 0.05" : "-score:peptide " + params.fdr_threshold - ].join(' ').trim() + ].join(' ').trim() } publishDir = [ enabled: false ] @@ -186,12 +186,12 @@ process { withName: 'OPENMS_IDFILTER_GLOBAL' { label = 'process_medium' ext.prefix = {"${meta.id}_pout_filtered"} - ext.args = [ + ext.args = { [ "-remove_decoys", - "-precursor:length '${params.peptide_min_length}:${params.peptide_max_length}'", + "-precursor:length '${meta.peptide_min_length ?: params.peptide_min_length}:${meta.peptide_max_length ?: params.peptide_max_length}'", "-delete_unreferenced_peptide_hits", (params.fdr_threshold == '0.01') ? "-score:peptide 0.05" : "-score:peptide " + params.fdr_threshold - ].join(' ').trim() + ].join(' ').trim() } publishDir = [ path: {"${params.outdir}/intermediate_results/rescoring"}, mode: params.publish_dir_mode, @@ -348,23 +348,23 @@ process { withName: 'OPENMS_IDMASSACCURACY' { ext.prefix = {"${meta.spectra}"} - ext.args = [ + ext.args = { [ (params.precursor_error_units == 'ppm') ? "-precursor_error_ppm": "", - "-fragment_mass_tolerance ${params.fragment_mass_tolerance}" - ].join(' ').trim() + "-fragment_mass_tolerance ${meta.fragment_mass_tolerance ?: params.fragment_mass_tolerance}" + ].join(' ').trim() } publishDir = [ enabled: false ] } withName: 'MS2RESCORE' { - ext.args = [ - "--ms2_tolerance ${2 * params.fragment_mass_tolerance}", - "--ms2pip_model ${params.ms2pip_model}", + ext.args = { [ + "--ms2_tolerance ${2 * (meta.fragment_mass_tolerance ?: params.fragment_mass_tolerance)}", + "--ms2pip_model ${meta.ms2pip_model ?: params.ms2pip_model}", "--ms2pip_model_dir ${params.ms2pip_model_dir}", "--rescoring_engine ${params.rescoring_engine}", params.feature_generators.trim() ? "--feature_generators ${params.feature_generators}" : '' - ].join(' ').trim() + ].join(' ').trim() } publishDir = [ [path: "${params.outdir}/intermediate_results/rescoring", mode: params.publish_dir_mode, @@ -395,15 +395,16 @@ process { withName: 'OPENMS_PERCOLATORADAPTER_GLOBAL' { label = 'process_high_mem_high_cpu' - ext.args = [ + ext.args = { [ "-seed 4711", "-trainFDR 0.05", "-testFDR 0.05", "-enzyme no_enzyme", "-subset_max_train ${params.subset_max_train}", "-post_processing_tdc", + "-weights ${meta.id}_percolator_feature_weights.tsv", (params.fdr_level != 'psm_level_fdrs') ? "-" + params.fdr_level : "" - ].join(' ').trim() + ].join(' ').trim() } publishDir = [ enabled: false ] @@ -526,11 +527,11 @@ process { if (params.annotate_ions) { withName: 'PYOPENMS_IONANNOTATOR' { - ext.args = [ - "--precursor_charge ${params.prec_charge}", - "--fragment_mass_tolerance ${params.fragment_mass_tolerance}", + ext.args = { [ + "--precursor_charge ${meta.prec_charge ?: params.prec_charge}", + "--fragment_mass_tolerance ${meta.fragment_mass_tolerance ?: params.fragment_mass_tolerance}", "--remove_precursor_peak ${params.remove_precursor_peak}" - ].join(' ').trim() + ].join(' ').trim() } publishDir = [ path: {"${params.outdir}/intermediate_results/ion_annotations"}, mode: params.publish_dir_mode, From c823c077252f0c034143eba0645738b5831687a1 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 6 Feb 2026 13:13:06 +0000 Subject: [PATCH 048/104] Group global FDR by search preset instead of merging all samples - Carry search_preset through ch_rescore_in in mhcquant.nf - Group by preset in RESCORE for IDMERGER_GLOBAL and backfilter via combine(by:0) - Fix EASYPQP_LIBRARY multi-include syntax in speclib subworkflow --- subworkflows/local/speclib/main.nf | 4 ++-- workflows/mhcquant.nf | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/speclib/main.nf b/subworkflows/local/speclib/main.nf index cfe22ad8..df035117 100644 --- a/subworkflows/local/speclib/main.nf +++ b/subworkflows/local/speclib/main.nf @@ -7,8 +7,8 @@ // include { EASYPQP_CONVERT } from '../../../modules/local/easypqp/convert' -include { EASYPQP_LIBRARY; - EASYPQP_LIBRARY as EASYPQP_LIBRARY_GLOBAL } from '../../../modules/local/easypqp/library' +include { EASYPQP_LIBRARY } from '../../../modules/local/easypqp/library' +include { EASYPQP_LIBRARY as EASYPQP_LIBRARY_GLOBAL } from '../../../modules/local/easypqp/library' // // MODULE: Installed directly from nf-core/modules diff --git a/workflows/mhcquant.nf b/workflows/mhcquant.nf index 91fd368f..fc23b24f 100644 --- a/workflows/mhcquant.nf +++ b/workflows/mhcquant.nf @@ -125,10 +125,14 @@ workflow MHCQUANT { // Run MS2Rescore ch_clean_mzml_file - .map { meta, mzml -> [ groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), mzml] } + .map { meta, mzml -> [ groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), meta.search_preset, mzml] } .groupTuple() .join(OPENMS_IDMERGER.out.idxml) - .map { meta, mzml, idxml -> [meta, idxml, mzml, []] } + .map { gkey, search_presets, mzml, idxml -> + // All replicates in a sample_condition group share the same search_preset + def sp = search_presets.find { it && !(it instanceof List && it.size() == 0) } + [gkey + (sp ? [search_preset: sp] : [:]), idxml, mzml, []] + } .set { ch_rescore_in } // From 146f77b1c371e1f2870db57f529a3b1ef8840dae Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 6 Feb 2026 13:13:09 +0000 Subject: [PATCH 049/104] Add test profile and samplesheet for search params feature --- .gitignore | 2 ++ conf/test_search_params.config | 29 +++++++++++++++++++++++++++++ samplesheets/test_search_params.tsv | 4 ++++ 3 files changed, 35 insertions(+) create mode 100644 conf/test_search_params.config create mode 100644 samplesheets/test_search_params.tsv diff --git a/.gitignore b/.gitignore index a42ce016..d49d554f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ testing/ testing* *.pyc null/ +CLAUDE.md +.claude/ diff --git a/conf/test_search_params.config b/conf/test_search_params.config new file mode 100644 index 00000000..a4107ace --- /dev/null +++ b/conf/test_search_params.config @@ -0,0 +1,29 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for running tests with search parameter presets +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Defines input files and everything required to run a test with different + search parameter presets specified per sample in the samplesheet. + + Use as follows: + nextflow run main.nf -profile test_search_params, --outdir + +---------------------------------------------------------------------------------------- +*/ + +process { + resourceLimits = [ + cpus: 4, + memory: '15.GB', + time: '6.h' + ] +} + +params { + config_profile_name = 'Test search params profile' + config_profile_description = 'Minimal test dataset with search parameter presets' + + // Input data + input = "${projectDir}/samplesheets/test_search_params.tsv" + fasta = "${params.pipelines_testdata_base_path}mhcquant/testdata/UP000005640_9606.fasta" +} diff --git a/samplesheets/test_search_params.tsv b/samplesheets/test_search_params.tsv new file mode 100644 index 00000000..5d01f3ae --- /dev/null +++ b/samplesheets/test_search_params.tsv @@ -0,0 +1,4 @@ +ID Sample Condition ReplicateFileName SearchPreset +1 HepG2 ClassI https://raw.githubusercontent.com/nf-core/test-datasets/mhcquant/testdata/HepG2_rep1_small.mzML qe_class1 +2 HepG2 ClassI https://raw.githubusercontent.com/nf-core/test-datasets/mhcquant/testdata/HepG2_rep2_small.mzML qe_class1 +3 HepG2 ClassII https://raw.githubusercontent.com/nf-core/test-datasets/mhcquant/testdata/HepG2_rep3_small.mzML qe_class2 From 15fb6ac6bdaecc7a37a02516b699f241b5e9cc2b Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 6 Feb 2026 13:42:05 +0000 Subject: [PATCH 050/104] Fix deprecated Nextflow syntax for strict mode compliance - Change Channel.empty() to channel.empty() (lowercase) - Replace implicit 'it' with explicit closure parameter in EPICORE call --- workflows/mhcquant.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/mhcquant.nf b/workflows/mhcquant.nf index fc23b24f..c247f8b8 100644 --- a/workflows/mhcquant.nf +++ b/workflows/mhcquant.nf @@ -57,7 +57,7 @@ workflow MHCQUANT { ch_fasta // channel: reference database read in from --fasta main: - ch_multiqc_files = Channel.empty() + ch_multiqc_files = channel.empty() // Prepare spectra files (Decompress archives, convert to mzML, centroid if specified) PREPARE_SPECTRA(ch_samplesheet) @@ -199,7 +199,7 @@ workflow MHCQUANT { // EPICORE // if (params.epicore) { - EPICORE(ch_fasta.map{ it.last()}, SUMMARIZE_RESULTS.out.epicore_input) + EPICORE(ch_fasta.map{ fasta -> fasta.last()}, SUMMARIZE_RESULTS.out.epicore_input) ch_multiqc_files = ch_multiqc_files.mix( EPICORE.out.length_dist, EPICORE.out.intensity_hist From 22e930d1cfe91266076b9782a07c36d2dd301b13 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 6 Feb 2026 14:21:24 +0000 Subject: [PATCH 051/104] Update CHANGELOG for per-sample search parameters feature --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f8b9c2f..82c8eac4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### `Added` - Added support for single run quantification [#438](https://github.com/nf-core/mhcquant/pull/438) +- Added per-sample search parameter support via samplesheet with SearchPreset column and individual parameter overrides [#439](https://github.com/nf-core/mhcquant/pull/439) ### `Fixed` From 52d609feee20879e903fe283d78788cfefe8c035 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 6 Feb 2026 14:32:21 +0000 Subject: [PATCH 052/104] Remove redundant emit declarations from version outputs and clean up commented lines --- modules/local/easypqp/convert/main.nf | 2 +- modules/local/easypqp/library/main.nf | 2 +- modules/local/epicore/main.nf | 2 +- modules/local/ms2rescore/main.nf | 2 +- modules/local/openms/featurefinderidentification/main.nf | 2 +- modules/local/openms/idconflictresolver/main.nf | 2 +- modules/local/openms/idmassaccuracy/main.nf | 2 +- modules/local/openms/mapaligneridentification/main.nf | 2 +- modules/local/openms/maprttransformer/main.nf | 2 +- modules/local/openms/mztabexporter/main.nf | 2 +- modules/local/openms/psmfeatureextractor/main.nf | 2 +- modules/local/openms/textexporter/main.nf | 2 +- .../local/openmsthirdparty/featurelinkerunlabeledkd/main.nf | 2 +- modules/local/openmsthirdparty/percolatoradapter/main.nf | 4 ++-- modules/local/pyopenms/chromatogramextractor/main.nf | 2 +- modules/local/pyopenms/ionannotator/main.nf | 2 +- modules/local/pyopenms/summarize_results/main.nf | 2 +- modules/local/tdf2mzml/main.nf | 4 ++-- modules/local/untar/main.nf | 2 +- modules/local/unzip/main.nf | 2 +- subworkflows/local/prepare_spectra/main.nf | 2 -- 21 files changed, 22 insertions(+), 24 deletions(-) diff --git a/modules/local/easypqp/convert/main.nf b/modules/local/easypqp/convert/main.nf index 5e442dfc..c7b2eb34 100644 --- a/modules/local/easypqp/convert/main.nf +++ b/modules/local/easypqp/convert/main.nf @@ -14,7 +14,7 @@ process EASYPQP_CONVERT { output: tuple val(meta), path("*.psmpkl") , emit: psmpkl tuple val(meta), path("*.peakpkl"), emit: peakpkl - tuple val("${task.process}"), val('easypqp'), eval("easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\\d+\\.\\d+\\.\\d+'"), emit: versions, topic: versions + tuple val("${task.process}"), val('easypqp'), eval("easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\\d+\\.\\d+\\.\\d+'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/easypqp/library/main.nf b/modules/local/easypqp/library/main.nf index 8db92728..c41b1d00 100644 --- a/modules/local/easypqp/library/main.nf +++ b/modules/local/easypqp/library/main.nf @@ -12,7 +12,7 @@ process EASYPQP_LIBRARY { output: tuple val(meta), path("*.tsv") , emit: tsv - tuple val("${task.process}"), val('easypqp'), eval("easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\\d+\\.\\d+\\.\\d+'"), emit: versions, topic: versions + tuple val("${task.process}"), val('easypqp'), eval("easypqp --version 2>&1 | grep -oP '(?<=easypqp, version )\\d+\\.\\d+\\.\\d+'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/epicore/main.nf b/modules/local/epicore/main.nf index 664c993e..8ffb729e 100644 --- a/modules/local/epicore/main.nf +++ b/modules/local/epicore/main.nf @@ -16,7 +16,7 @@ process EPICORE { path "${result_tsv}", emit: final_epicore_tsv path "epicore_length_distribution.html", emit: length_dist path "epicore_intensity_histogram.html", emit: intensity_hist - tuple val("${task.process}"), val('epicore'), eval("echo \$(epicore --version) | grep 'epicore' | cut -d ' ' -f3 | cut -c2-"), emit: versions, topic: versions + tuple val("${task.process}"), val('epicore'), eval("echo \$(epicore --version) | grep 'epicore' | cut -d ' ' -f3 | cut -c2-"), topic: versions script: def args = task.ext.args ?: '' diff --git a/modules/local/ms2rescore/main.nf b/modules/local/ms2rescore/main.nf index 8adc1fc5..75f4c2c0 100644 --- a/modules/local/ms2rescore/main.nf +++ b/modules/local/ms2rescore/main.nf @@ -17,7 +17,7 @@ process MS2RESCORE { tuple val(meta), path("*ms2rescore.idXML") , emit: idxml tuple val(meta), path("*feature_names.tsv"), emit: feature_names tuple val(meta), path("*.html" ) , optional:true, emit: html - tuple val("${task.process}"), val('MS2Rescore'), eval("echo \"\$(ms2rescore --version 2>&1)\" | grep -oP 'MS²Rescore \\(v\\K[^\\)]+'"), emit: versions, topic: versions + tuple val("${task.process}"), val('MS2Rescore'), eval("echo \"\$(ms2rescore --version 2>&1)\" | grep -oP 'MS²Rescore \\(v\\K[^\\)]+'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openms/featurefinderidentification/main.nf b/modules/local/openms/featurefinderidentification/main.nf index 8c9303bd..9630331d 100644 --- a/modules/local/openms/featurefinderidentification/main.nf +++ b/modules/local/openms/featurefinderidentification/main.nf @@ -13,7 +13,7 @@ process OPENMS_FEATUREFINDERIDENTIFICATION { output: tuple val(meta), path("*.featureXML"), emit: featurexml - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions_featurefinderidentification, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openms/idconflictresolver/main.nf b/modules/local/openms/idconflictresolver/main.nf index c5389502..4a77cfbd 100644 --- a/modules/local/openms/idconflictresolver/main.nf +++ b/modules/local/openms/idconflictresolver/main.nf @@ -12,7 +12,7 @@ process OPENMS_IDCONFLICTRESOLVER { output: tuple val(meta), path("*.consensusXML"), emit: consensusxml - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | grep -E '^Version' | sed 's/^.*Version: //; s/-.*\$//' | sed 's/ -*//; s/ .*\$//'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openms/idmassaccuracy/main.nf b/modules/local/openms/idmassaccuracy/main.nf index 9c4d4cd0..d601ead7 100644 --- a/modules/local/openms/idmassaccuracy/main.nf +++ b/modules/local/openms/idmassaccuracy/main.nf @@ -13,7 +13,7 @@ process OPENMS_IDMASSACCURACY { output: tuple val(meta), path("*frag_mass_err.tsv") , emit: frag_err tuple val(meta), path("*prec_mass_err.tsv") , emit: prec_err, optional: true - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openms/mapaligneridentification/main.nf b/modules/local/openms/mapaligneridentification/main.nf index ca9630e9..9325eb44 100644 --- a/modules/local/openms/mapaligneridentification/main.nf +++ b/modules/local/openms/mapaligneridentification/main.nf @@ -12,7 +12,7 @@ process OPENMS_MAPALIGNERIDENTIFICATION { output: tuple val(meta), path("*.trafoXML"), emit: trafoxml - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openms/maprttransformer/main.nf b/modules/local/openms/maprttransformer/main.nf index 2977da96..7a74e7f2 100644 --- a/modules/local/openms/maprttransformer/main.nf +++ b/modules/local/openms/maprttransformer/main.nf @@ -12,7 +12,7 @@ process OPENMS_MAPRTTRANSFORMER { output: tuple val(meta), path("*_aligned.*"), emit: aligned - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openms/mztabexporter/main.nf b/modules/local/openms/mztabexporter/main.nf index 36349a28..86844f46 100644 --- a/modules/local/openms/mztabexporter/main.nf +++ b/modules/local/openms/mztabexporter/main.nf @@ -12,7 +12,7 @@ process OPENMS_MZTABEXPORTER { output: tuple val(meta), path("*.mzTab"), emit: mztab - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openms/psmfeatureextractor/main.nf b/modules/local/openms/psmfeatureextractor/main.nf index 407e04a5..57ace075 100644 --- a/modules/local/openms/psmfeatureextractor/main.nf +++ b/modules/local/openms/psmfeatureextractor/main.nf @@ -12,7 +12,7 @@ process OPENMS_PSMFEATUREEXTRACTOR { output: tuple val(meta), path("*.idXML"), emit: idxml - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openms/textexporter/main.nf b/modules/local/openms/textexporter/main.nf index 920f312f..6f3942ab 100644 --- a/modules/local/openms/textexporter/main.nf +++ b/modules/local/openms/textexporter/main.nf @@ -12,7 +12,7 @@ process OPENMS_TEXTEXPORTER { output: tuple val(meta), path("*.tsv"), emit: tsv - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf index a10153d2..07675829 100644 --- a/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf +++ b/modules/local/openmsthirdparty/featurelinkerunlabeledkd/main.nf @@ -12,7 +12,7 @@ process OPENMS_FEATURELINKERUNLABELEDKD { output: tuple val(meta), path("*.consensusXML"), emit: consensusxml - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), emit: versions_openms, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openmsthirdparty/percolatoradapter/main.nf b/modules/local/openmsthirdparty/percolatoradapter/main.nf index 550d6253..59105393 100644 --- a/modules/local/openmsthirdparty/percolatoradapter/main.nf +++ b/modules/local/openmsthirdparty/percolatoradapter/main.nf @@ -13,8 +13,8 @@ process OPENMS_PERCOLATORADAPTER { output: tuple val(meta), path("*.idXML") , emit: idxml tuple val(meta), path("*_percolator_feature_weights.tsv"), emit: feature_weights, optional: true - tuple val("${task.process}"), val('PercolatorAdapter'), eval("PercolatorAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1"), emit: versions_percolatoradapter, topic: versions - tuple val("${task.process}"), val('percolator'), eval("percolator -h 2>&1 | grep -E '^Percolator version(.*)' | sed 's/Percolator version //g'"), emit: versions_percolator, topic: versions + tuple val("${task.process}"), val('PercolatorAdapter'), eval("PercolatorAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1"), topic: versions + tuple val("${task.process}"), val('percolator'), eval("percolator -h 2>&1 | grep -E '^Percolator version(.*)' | sed 's/Percolator version //g'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/pyopenms/chromatogramextractor/main.nf b/modules/local/pyopenms/chromatogramextractor/main.nf index 038177ab..8f7456fd 100644 --- a/modules/local/pyopenms/chromatogramextractor/main.nf +++ b/modules/local/pyopenms/chromatogramextractor/main.nf @@ -12,7 +12,7 @@ process PYOPENMS_CHROMATOGRAMEXTRACTOR { output: tuple val(meta), path("*.csv") , emit: csv - tuple val("${task.process}"), val('pyopenms'), eval("pip show pyopenms | grep Version | sed 's/Version: //'"), emit: versions, topic: versions + tuple val("${task.process}"), val('pyopenms'), eval("pip show pyopenms | grep Version | sed 's/Version: //'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/pyopenms/ionannotator/main.nf b/modules/local/pyopenms/ionannotator/main.nf index e58c6ce1..b178fa5d 100644 --- a/modules/local/pyopenms/ionannotator/main.nf +++ b/modules/local/pyopenms/ionannotator/main.nf @@ -12,7 +12,7 @@ process PYOPENMS_IONANNOTATOR { output: tuple val(meta), path("*.tsv") , emit: tsv - tuple val("${task.process}"), val('pyopenms'), eval("pip show pyopenms | grep Version | sed 's/Version: //'"), emit: versions, topic: versions + tuple val("${task.process}"), val('pyopenms'), eval("pip show pyopenms | grep Version | sed 's/Version: //'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/pyopenms/summarize_results/main.nf b/modules/local/pyopenms/summarize_results/main.nf index c26a416c..71f403db 100644 --- a/modules/local/pyopenms/summarize_results/main.nf +++ b/modules/local/pyopenms/summarize_results/main.nf @@ -16,7 +16,7 @@ process SUMMARIZE_RESULTS { path '*_peptide_length.csv' , emit: lengths, optional: true path '*_peptide_intensity.csv' , emit: intensities, optional: true tuple val(meta), path('*.tsv'), path('*_general_stats.csv') , emit: epicore_input - tuple val("${task.process}"), val('pyopenms'), eval("pip show pyopenms | grep Version | sed 's/Version: //'"), emit: versions, topic: versions + tuple val("${task.process}"), val('pyopenms'), eval("pip show pyopenms | grep Version | sed 's/Version: //'"), topic: versions script: def args = task.ext.args ?: '' diff --git a/modules/local/tdf2mzml/main.nf b/modules/local/tdf2mzml/main.nf index 482545a9..12dacca3 100644 --- a/modules/local/tdf2mzml/main.nf +++ b/modules/local/tdf2mzml/main.nf @@ -8,8 +8,8 @@ process TDF2MZML { output: tuple val(meta), path("*.mzML"), emit: mzml - tuple val("${task.process}"), val('python'), eval("python3 --version | cut -d ' ' -f2"), emit: versions, topic: versions - tuple val("${task.process}"), val('tdf2mzml'), eval("echo 0.3.0"), emit: versions_1, topic: versions + tuple val("${task.process}"), val('python'), eval("python3 --version | cut -d ' ' -f2"), topic: versions + tuple val("${task.process}"), val('tdf2mzml'), eval("echo 0.3.0"), topic: versions script: def prefix = task.ext.prefix ?: "${tdf.simpleName}" diff --git a/modules/local/untar/main.nf b/modules/local/untar/main.nf index 649af575..ed25bfe2 100644 --- a/modules/local/untar/main.nf +++ b/modules/local/untar/main.nf @@ -12,7 +12,7 @@ process UNTAR { output: tuple val(meta), path("*.d"), emit: untar - tuple val("${task.process}"), val('untar'), eval("echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('untar'), eval("echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/unzip/main.nf b/modules/local/unzip/main.nf index 3c5e5110..80f10a37 100644 --- a/modules/local/unzip/main.nf +++ b/modules/local/unzip/main.nf @@ -12,7 +12,7 @@ process UNZIP { output: tuple val(meta), path("*.d"), emit: unzipped_archive - tuple val("${task.process}"), val('7za'), eval("echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//'"), emit: versions, topic: versions + tuple val("${task.process}"), val('7za'), eval("echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/subworkflows/local/prepare_spectra/main.nf b/subworkflows/local/prepare_spectra/main.nf index d51a6f48..5dc4a763 100644 --- a/subworkflows/local/prepare_spectra/main.nf +++ b/subworkflows/local/prepare_spectra/main.nf @@ -49,7 +49,6 @@ workflow PREPARE_SPECTRA { // Gunzip mzML files GUNZIP(branched_ms_files.mzml_gz) - // ch_versions = ch_versions.mix(GUNZIP.out.versions) // Initialize channel for ms files that do not need to be converted ch_ms_files = branched_ms_files.mzml .mix(GUNZIP.out.gunzip, @@ -59,7 +58,6 @@ workflow PREPARE_SPECTRA { // Optional: Run Peak Picking as Preprocessing if (params.run_centroidisation) { OPENMS_PEAKPICKERHIRES(ch_ms_files) - // ch_versions = ch_versions.mix(OPENMS_PEAKPICKERHIRES.out.versions) ch_mzml_file = OPENMS_PEAKPICKERHIRES.out.mzml } else { ch_mzml_file = ch_ms_files From 2efdd68f6adecc63312d040860990b7664a6f85b Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 6 Feb 2026 14:35:24 +0000 Subject: [PATCH 053/104] Add nf-test for search params and use test-datasets samplesheet - Update test_search_params.config to use nf-core/test-datasets samplesheet - Add tests/search_params.nf.test with snapshot - Remove local samplesheets folder (now using test-datasets) --- conf/test_search_params.config | 2 +- tests/search_params.nf.test | 46 ++++++++++ tests/search_params.nf.test.snap | 142 +++++++++++++++++++++++++++++++ 3 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 tests/search_params.nf.test create mode 100644 tests/search_params.nf.test.snap diff --git a/conf/test_search_params.config b/conf/test_search_params.config index a4107ace..3ee9cfdc 100644 --- a/conf/test_search_params.config +++ b/conf/test_search_params.config @@ -24,6 +24,6 @@ params { config_profile_description = 'Minimal test dataset with search parameter presets' // Input data - input = "${projectDir}/samplesheets/test_search_params.tsv" + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/mhcquant/testdata/sample_sheet_presets.tsv' fasta = "${params.pipelines_testdata_base_path}mhcquant/testdata/UP000005640_9606.fasta" } diff --git a/tests/search_params.nf.test b/tests/search_params.nf.test new file mode 100644 index 00000000..e38a1ea3 --- /dev/null +++ b/tests/search_params.nf.test @@ -0,0 +1,46 @@ +nextflow_pipeline { + + name "Test pipeline with search parameter presets" + script "../main.nf" + tag "pipeline" + tag "search_params" + + test("-profile test_search_params") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + + // Check that CometAdapter used different parameters for ClassI vs ClassII + // by inspecting the output TSV files + def tsv_files = [] + new File(params.outdir).eachFileRecurse { file -> + if (file.name.endsWith('.tsv') && !file.path.contains('pipeline_info')) { + tsv_files.add(file.name) + } + } + + assertAll( + { assert workflow.success}, + { assert snapshot( + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_mhcquant_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path, + // TSV output files + tsv_files.sort() + ).match() } + ) + } + } +} diff --git a/tests/search_params.nf.test.snap b/tests/search_params.nf.test.snap new file mode 100644 index 00000000..c82098e7 --- /dev/null +++ b/tests/search_params.nf.test.snap @@ -0,0 +1,142 @@ +{ + "-profile test_search_params": { + "content": [ + { + "MS2RESCORE": { + "MS2Rescore": "3.1.5" + }, + "OPENMSTHIRDPARTY_COMETADAPTER": { + "Comet": "2024.01 rev. 1", + "CometAdapter": "3.5.0" + }, + "OPENMS_DECOYDATABASE": { + "openms": "3.5.0" + }, + "OPENMS_IDFILTER_Q_VALUE": { + "openms": "3.5.0" + }, + "OPENMS_IDMASSACCURACY": { + "openms": "3.4.1" + }, + "OPENMS_IDMERGER": { + "openms": "3.5.0" + }, + "OPENMS_PEPTIDEINDEXER": { + "openms": "3.5.0" + }, + "OPENMS_PERCOLATORADAPTER": { + "PercolatorAdapter": "3.5.0-pre-exported-20251212", + "percolator": "3.07.1, Build Date Mar 13 2025 17:19:27" + }, + "OPENMS_PSMFEATUREEXTRACTOR": { + "openms": "3.5.0" + }, + "OPENMS_TEXTEXPORTER": { + "openms": "3.5.0" + }, + "PYOPENMS_CHROMATOGRAMEXTRACTOR": { + "pyopenms": "3.4.1" + }, + "SUMMARIZE_RESULTS": { + "pyopenms": "3.4.1" + }, + "Workflow": { + "nf-core/mhcquant": "v3.2.0dev" + } + }, + [ + "HepG2_ClassI.tsv", + "HepG2_ClassII.tsv", + "intermediate_results", + "intermediate_results/comet", + "intermediate_results/comet/HepG2_rep1_small_pin.tsv", + "intermediate_results/comet/HepG2_rep2_small_pin.tsv", + "intermediate_results/comet/HepG2_rep3_small_pin.tsv", + "intermediate_results/rescoring", + "intermediate_results/rescoring/HepG2_ClassII_ms2rescore.idXML", + "intermediate_results/rescoring/HepG2_ClassII_pout.idXML", + "intermediate_results/rescoring/HepG2_ClassII_pout_filtered.idXML", + "intermediate_results/rescoring/HepG2_ClassII_psm.idXML", + "intermediate_results/rescoring/HepG2_ClassI_ms2rescore.idXML", + "intermediate_results/rescoring/HepG2_ClassI_pout.idXML", + "intermediate_results/rescoring/HepG2_ClassI_pout_filtered.idXML", + "intermediate_results/rescoring/HepG2_ClassI_psm.idXML", + "multiqc", + "multiqc/ms2rescore", + "multiqc/multiqc_data", + "multiqc/multiqc_data/llms-full.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", + "multiqc/multiqc_data/multiqc_chromatogram.txt", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_histogram_mz.txt", + "multiqc/multiqc_data/multiqc_histogram_rt.txt", + "multiqc/multiqc_data/multiqc_histogram_scores.txt", + "multiqc/multiqc_data/multiqc_length_dist.txt", + "multiqc/multiqc_data/multiqc_mass_error.txt", + "multiqc/multiqc_data/multiqc_percolator_barplot.txt", + "multiqc/multiqc_data/multiqc_scores_xcorr.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/percolator_plot.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/chromatogram-cnt.pdf", + "multiqc/multiqc_plots/pdf/chromatogram-log.pdf", + "multiqc/multiqc_plots/pdf/general_stats.pdf", + "multiqc/multiqc_plots/pdf/histogram_mz.pdf", + "multiqc/multiqc_plots/pdf/histogram_rt.pdf", + "multiqc/multiqc_plots/pdf/histogram_scores.pdf", + "multiqc/multiqc_plots/pdf/length_dist.pdf", + "multiqc/multiqc_plots/pdf/mass_error.pdf", + "multiqc/multiqc_plots/pdf/percolator_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/percolator_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/scores_xcorr.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/chromatogram-cnt.png", + "multiqc/multiqc_plots/png/chromatogram-log.png", + "multiqc/multiqc_plots/png/general_stats.png", + "multiqc/multiqc_plots/png/histogram_mz.png", + "multiqc/multiqc_plots/png/histogram_rt.png", + "multiqc/multiqc_plots/png/histogram_scores.png", + "multiqc/multiqc_plots/png/length_dist.png", + "multiqc/multiqc_plots/png/mass_error.png", + "multiqc/multiqc_plots/png/percolator_plot-cnt.png", + "multiqc/multiqc_plots/png/percolator_plot-pct.png", + "multiqc/multiqc_plots/png/scores_xcorr.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/chromatogram-cnt.svg", + "multiqc/multiqc_plots/svg/chromatogram-log.svg", + "multiqc/multiqc_plots/svg/general_stats.svg", + "multiqc/multiqc_plots/svg/histogram_mz.svg", + "multiqc/multiqc_plots/svg/histogram_rt.svg", + "multiqc/multiqc_plots/svg/histogram_scores.svg", + "multiqc/multiqc_plots/svg/length_dist.svg", + "multiqc/multiqc_plots/svg/mass_error.svg", + "multiqc/multiqc_plots/svg/percolator_plot-cnt.svg", + "multiqc/multiqc_plots/svg/percolator_plot-pct.svg", + "multiqc/multiqc_plots/svg/scores_xcorr.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_mhcquant_software_mqc_versions.yml" + ], + [ + + ], + [ + "HepG2_ClassI.tsv", + "HepG2_ClassII.tsv", + "HepG2_rep1_small_pin.tsv", + "HepG2_rep2_small_pin.tsv", + "HepG2_rep3_small_pin.tsv" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.8" + }, + "timestamp": "2026-02-06T14:34:56.430944621" + } +} \ No newline at end of file From e502ff54a36348b58fb0d3f37f3f6bcfba939f54 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 6 Feb 2026 14:55:13 +0000 Subject: [PATCH 054/104] Rename test_search_params to test_search_presets and add nf-test profile directive - Rename config, test file, and profile from search_params to search_presets - Add profile directive to nf-test file matching other test patterns - Use test-datasets samplesheet URL, remove local samplesheet - Use string concatenation for fasta path matching test.config pattern --- ..._params.config => test_search_presets.config} | 6 +++--- nextflow.config | 6 +++--- samplesheets/test_search_params.tsv | 4 ---- ...rch_params.nf.test => search_presets.nf.test} | 16 +++------------- ....nf.test.snap => search_presets.nf.test.snap} | 11 ++--------- 5 files changed, 11 insertions(+), 32 deletions(-) rename conf/{test_search_params.config => test_search_presets.config} (77%) delete mode 100644 samplesheets/test_search_params.tsv rename tests/{search_params.nf.test => search_presets.nf.test} (69%) rename tests/{search_params.nf.test.snap => search_presets.nf.test.snap} (95%) diff --git a/conf/test_search_params.config b/conf/test_search_presets.config similarity index 77% rename from conf/test_search_params.config rename to conf/test_search_presets.config index 3ee9cfdc..1dff0844 100644 --- a/conf/test_search_params.config +++ b/conf/test_search_presets.config @@ -6,7 +6,7 @@ search parameter presets specified per sample in the samplesheet. Use as follows: - nextflow run main.nf -profile test_search_params, --outdir + nextflow run main.nf -profile test_search_presets, --outdir ---------------------------------------------------------------------------------------- */ @@ -20,10 +20,10 @@ process { } params { - config_profile_name = 'Test search params profile' + config_profile_name = 'Test search presets profile' config_profile_description = 'Minimal test dataset with search parameter presets' // Input data input = 'https://raw.githubusercontent.com/nf-core/test-datasets/mhcquant/testdata/sample_sheet_presets.tsv' - fasta = "${params.pipelines_testdata_base_path}mhcquant/testdata/UP000005640_9606.fasta" + fasta = params.pipelines_testdata_base_path + 'mhcquant/testdata/UP000005640_9606.fasta' } diff --git a/nextflow.config b/nextflow.config index 8f182467..79014f4d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -238,9 +238,9 @@ profiles { test_epicore { includeConfig 'conf/test_epicore.config' } test_speclib { includeConfig 'conf/test_speclib.config' } test_timstof { includeConfig 'conf/test_timstof.config' } - test_single_quant { includeConfig 'conf/test_single_quant.config' } - test_search_params { includeConfig 'conf/test_search_params.config' } - test_full { includeConfig 'conf/test_full.config' } + test_single_quant { includeConfig 'conf/test_single_quant.config' } + test_search_presets { includeConfig 'conf/test_search_presets.config' } + test_full { includeConfig 'conf/test_full.config' } } // Load nf-core custom profiles from different institutions diff --git a/samplesheets/test_search_params.tsv b/samplesheets/test_search_params.tsv deleted file mode 100644 index 5d01f3ae..00000000 --- a/samplesheets/test_search_params.tsv +++ /dev/null @@ -1,4 +0,0 @@ -ID Sample Condition ReplicateFileName SearchPreset -1 HepG2 ClassI https://raw.githubusercontent.com/nf-core/test-datasets/mhcquant/testdata/HepG2_rep1_small.mzML qe_class1 -2 HepG2 ClassI https://raw.githubusercontent.com/nf-core/test-datasets/mhcquant/testdata/HepG2_rep2_small.mzML qe_class1 -3 HepG2 ClassII https://raw.githubusercontent.com/nf-core/test-datasets/mhcquant/testdata/HepG2_rep3_small.mzML qe_class2 diff --git a/tests/search_params.nf.test b/tests/search_presets.nf.test similarity index 69% rename from tests/search_params.nf.test rename to tests/search_presets.nf.test index e38a1ea3..7db6eeb6 100644 --- a/tests/search_params.nf.test +++ b/tests/search_presets.nf.test @@ -3,9 +3,10 @@ nextflow_pipeline { name "Test pipeline with search parameter presets" script "../main.nf" tag "pipeline" - tag "search_params" + tag "test_search_presets" + profile "test_search_presets" - test("-profile test_search_params") { + test("-profile test_search_presets") { when { params { @@ -19,15 +20,6 @@ nextflow_pipeline { // stable_path: All files in ${params.outdir}/ with stable content def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') - // Check that CometAdapter used different parameters for ClassI vs ClassII - // by inspecting the output TSV files - def tsv_files = [] - new File(params.outdir).eachFileRecurse { file -> - if (file.name.endsWith('.tsv') && !file.path.contains('pipeline_info')) { - tsv_files.add(file.name) - } - } - assertAll( { assert workflow.success}, { assert snapshot( @@ -37,8 +29,6 @@ nextflow_pipeline { stable_name, // All files with stable contents stable_path, - // TSV output files - tsv_files.sort() ).match() } ) } diff --git a/tests/search_params.nf.test.snap b/tests/search_presets.nf.test.snap similarity index 95% rename from tests/search_params.nf.test.snap rename to tests/search_presets.nf.test.snap index c82098e7..4f0125bb 100644 --- a/tests/search_params.nf.test.snap +++ b/tests/search_presets.nf.test.snap @@ -1,5 +1,5 @@ { - "-profile test_search_params": { + "-profile test_search_presets": { "content": [ { "MS2RESCORE": { @@ -124,19 +124,12 @@ ], [ - ], - [ - "HepG2_ClassI.tsv", - "HepG2_ClassII.tsv", - "HepG2_rep1_small_pin.tsv", - "HepG2_rep2_small_pin.tsv", - "HepG2_rep3_small_pin.tsv" ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.04.8" }, - "timestamp": "2026-02-06T14:34:56.430944621" + "timestamp": "2026-02-06T14:54:49.407532871" } } \ No newline at end of file From bab72f6eea162c9774bab86c8a607ea10a64ef2f Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 6 Feb 2026 15:58:17 +0000 Subject: [PATCH 055/104] Remove redundant emit declarations from version outputs and clean up commented lines - Restore nf-core modules to match upstream/dev - Remove emit declarations from version topic outputs in local modules - Remove version emit metadata from local module meta.yml files - Add peptidoform content check to search_presets nf-test --- modules/local/openms/fileconverter/main.nf | 2 +- modules/local/openms/idmassaccuracy/meta.yml | 11 - modules/local/untar/meta.yml | 11 - modules/local/unzip/meta.yml | 11 - .../openms/filefilter/tests/main.nf.test | 2 +- .../openms/idmerger/tests/main.nf.test | 4 +- .../openms/idripper/tests/main.nf.test | 2 +- .../openms/peptideindexer/tests/main.nf.test | 6 +- .../cometadapter/tests/main.nf.test | 4 +- tests/search_presets.nf.test | 21 +- tests/search_presets.nf.test.snap | 458 +++++++++++++++++- 11 files changed, 486 insertions(+), 46 deletions(-) diff --git a/modules/local/openms/fileconverter/main.nf b/modules/local/openms/fileconverter/main.nf index 204038ba..f4a5a885 100644 --- a/modules/local/openms/fileconverter/main.nf +++ b/modules/local/openms/fileconverter/main.nf @@ -12,7 +12,7 @@ process OPENMS_FILECONVERTER { output: tuple val(meta), path("*.${suffix}"), emit: consensusxml - tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\1/p'"), emit: versions_openms, topic: versions + tuple val("${task.process}"), val('openms'), eval("FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\1/p'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/openms/idmassaccuracy/meta.yml b/modules/local/openms/idmassaccuracy/meta.yml index 4da25896..ce2eeb82 100644 --- a/modules/local/openms/idmassaccuracy/meta.yml +++ b/modules/local/openms/idmassaccuracy/meta.yml @@ -45,17 +45,6 @@ output: description: Filtered peptide-spectrum matches. pattern: "*.{idXML,consensusXML}" ontologies: [] - versions_openms: - - - ${task.process}: - type: string - description: The name of the process - - openms: - type: string - description: The name of the tool - - "FileInfo --help 2>&1 | sed -nE 's/^Version: ([0-9.]+).*/\\1/p'": - type: eval - description: The expression to obtain the version of the tool - topics: versions: - - ${task.process}: diff --git a/modules/local/untar/meta.yml b/modules/local/untar/meta.yml index 3de4c504..d5c15cdb 100644 --- a/modules/local/untar/meta.yml +++ b/modules/local/untar/meta.yml @@ -31,17 +31,6 @@ output: type: directory description: Directory containing contents of archive pattern: "*/" - versions_untar: - - - ${task.process}: - type: string - description: The process the versions were collected from - - untar: - type: string - description: The tool name - - "echo $(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*$//'": - type: eval - description: The expression to obtain the version of the tool - topics: versions: - - ${task.process}: diff --git a/modules/local/unzip/meta.yml b/modules/local/unzip/meta.yml index 9c96fd56..2c952111 100644 --- a/modules/local/unzip/meta.yml +++ b/modules/local/unzip/meta.yml @@ -33,17 +33,6 @@ output: type: directory description: Directory contents of the unzipped archive pattern: "${archive.baseName}/" - versions_7za: - - - ${task.process}: - type: string - description: The process the versions were collected from - - 7za: - type: string - description: The tool name - - "echo $(7za --help) | sed 's/.*p7zip Version //; s/(.*//'": - type: eval - description: The expression to obtain the version of the tool - topics: versions: - - ${task.process}: diff --git a/modules/nf-core/openms/filefilter/tests/main.nf.test b/modules/nf-core/openms/filefilter/tests/main.nf.test index fb8334d1..a19a6d88 100644 --- a/modules/nf-core/openms/filefilter/tests/main.nf.test +++ b/modules/nf-core/openms/filefilter/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { script "../../../thermorawfileparser/main.nf" process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/msspectra/PXD012083_e005640_II.raw', checkIfExists: true) ]) diff --git a/modules/nf-core/openms/idmerger/tests/main.nf.test b/modules/nf-core/openms/idmerger/tests/main.nf.test index a5b0cb35..006eb57b 100644 --- a/modules/nf-core/openms/idmerger/tests/main.nf.test +++ b/modules/nf-core/openms/idmerger/tests/main.nf.test @@ -14,7 +14,7 @@ nextflow_process { when { process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test'], // meta map [ file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true), file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep2_small.idXML', checkIfExists: true)] @@ -45,7 +45,7 @@ nextflow_process { when { process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test'], // meta map [ file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true), file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep2_small.idXML', checkIfExists: true)] diff --git a/modules/nf-core/openms/idripper/tests/main.nf.test b/modules/nf-core/openms/idripper/tests/main.nf.test index 1e9b40d7..1f252316 100644 --- a/modules/nf-core/openms/idripper/tests/main.nf.test +++ b/modules/nf-core/openms/idripper/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { script "../../idmerger/main.nf" process { """ - input[0] = Channel.fromList([ + input[0] = channel.fromList([ tuple([id:'test'], [ file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true), diff --git a/modules/nf-core/openms/peptideindexer/tests/main.nf.test b/modules/nf-core/openms/peptideindexer/tests/main.nf.test index ecc2b005..c4533b2e 100644 --- a/modules/nf-core/openms/peptideindexer/tests/main.nf.test +++ b/modules/nf-core/openms/peptideindexer/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { script "../../decoydatabase/main.nf" process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/database/UP000005640_9606.fasta', checkIfExists: true) ]) @@ -30,7 +30,7 @@ nextflow_process { when { process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [id:'test'], file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true) ]).join(OPENMS_DECOYDATABASE.out.decoy_fasta) @@ -53,7 +53,7 @@ nextflow_process { when { process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [id:'test'], file(params.modules_testdata_base_path + 'proteomics/openms/HepG2_rep1_small.idXML', checkIfExists: true) ]).join(OPENMS_DECOYDATABASE.out.decoy_fasta) diff --git a/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test b/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test index de1d7df6..d43d461b 100644 --- a/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test +++ b/modules/nf-core/openmsthirdparty/cometadapter/tests/main.nf.test @@ -18,7 +18,7 @@ nextflow_process { script "../../../thermorawfileparser/main.nf" process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/msspectra/PXD012083_e005640_II.raw', checkIfExists: true) ]) @@ -30,7 +30,7 @@ nextflow_process { script "../../../openms/decoydatabase/main.nf" process { """ - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test'], file(params.modules_testdata_base_path + 'proteomics/database/UP000005640_9606.fasta', checkIfExists: true) ]) diff --git a/tests/search_presets.nf.test b/tests/search_presets.nf.test index 7db6eeb6..878fcb1b 100644 --- a/tests/search_presets.nf.test +++ b/tests/search_presets.nf.test @@ -19,7 +19,24 @@ nextflow_pipeline { def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') - + // Extract peptidoform column from all TSV files + def peptidoform_data = [] + new File(params.outdir).eachFileRecurse { file -> + if (file.name.endsWith('.tsv')) { + def lines = file.readLines() + if (lines.size() > 0) { + def header = lines[0].split('\t') + def peptidoformIndex = header.findIndexOf { it == 'peptidoform' } + if (peptidoformIndex >= 0) { + def peptidoforms = lines.drop(1).collect { line -> + def fields = line.split('\t') + fields.size() > peptidoformIndex ? fields[peptidoformIndex] : '' + }.findAll { it != '' }.sort() + peptidoform_data.add([file.name, peptidoforms]) + } + } + } + } assertAll( { assert workflow.success}, { assert snapshot( @@ -29,6 +46,8 @@ nextflow_pipeline { stable_name, // All files with stable contents stable_path, + // Peptidoform data from TSV files + peptidoform_data ).match() } ) } diff --git a/tests/search_presets.nf.test.snap b/tests/search_presets.nf.test.snap index 4f0125bb..70a3477e 100644 --- a/tests/search_presets.nf.test.snap +++ b/tests/search_presets.nf.test.snap @@ -124,12 +124,466 @@ ], [ + ], + [ + [ + "HepG2_ClassI.tsv", + [ + "AAATVTKKV", + "AAHPNVQKV", + "AAKDPSPSV", + "AAM(Oxidation)SVAKRV", + "AANDKLKKM", + "AANPDPKKL", + "AAPPPPAHA", + "AAPRPPPKPM(Oxidation)", + "AAQAHTREL", + "AAQSEAKVV", + "AARAEAREI", + "AASPVGKRL", + "AASSLKKQY", + "AATDHSNQL", + "AATPAKKTV", + "AATRWAKKI", + "AATSNLKKL", + "AKDVKFGAD", + "ALKDKIEKA", + "ALKDSVQRA", + "ALKENGGARLA", + "AM(Oxidation)AARPHSI", + "AM(Oxidation)AASPHAV", + "AM(Oxidation)ASHLTST", + "AM(Oxidation)HGHLEAV", + "AM(Oxidation)HGHVEVV", + "AM(Oxidation)NARPHKV", + "AMNARPHKV", + "APRADAKAY", + "APRPPPKPM(Oxidation)", + "ASTQTTHEL", + "ATWSDPHKA", + "AVM(Oxidation)GNPKVKA", + "AVVVKKIETRDG", + "DAAVHQRI", + "DAKKQIKQV", + "DAPAGRKV", + "DFLSVSDIID", + "DGKKKISTV", + "DPM(Oxidation)KARVV", + "DPPKTHVT", + "DPPRDSKGL", + "DSKKSQPKI", + "EAKTHEAQI", + "EYSKQM(Oxidation)QRF", + "FADPHSKRV", + "FPHSAHQKY", + "FPSRGKSSSY", + "GIAGPRGSP", + "GKVGAHAGEY", + "GKVGAHAGEYG", + "GLAKSIHHA", + "GMAKKVTKA", + "GNVAEGETKPD", + "GRVVEPKR", + "GVM(Oxidation)VGM(Oxidation)GQKD", + "HAAENPGKY", + "HAATYTKKV", + "HAFGGNKASY", + "HAGPTAHEL", + "HAHVDKVTY", + "HAIGKSQSF", + "HAKEKLTAL", + "HAM(Oxidation)EEVKKF", + "HAPELTKKV", + "HLKEDQTEY", + "HPAENGKSNF", + "HPESERISM(Oxidation)", + "HPNKVKVY", + "HPSQPQGTY", + "HPYQPDPKM(Oxidation)", + "HSRNEGVATY", + "HVKDANGNSF", + "HVSTHQHNY", + "IASQTVKKV", + "IKTVETRD", + "ILDKKVEKV", + "IPKKHISQI", + "IPQKFHRSV", + "IQRGPVRG", + "ISSEAHREV", + "IYTEHAHQV", + "KAAAFEKQV", + "KAAKPKVV", + "KAASHIKSI", + "KAATVTKEL", + "KAISGVHTV", + "KALDEKIAK", + "KALVKPKEV", + "KASEQAKVV", + "KASGTLREY", + "KAYGKAKSI", + "KAYSEAHEI", + "KGISSSSLK", + "KGTGASGSF", + "KHANQVLSL", + "KLAESVEKA", + "KLAPPPKKA", + "KLDNQVSKV", + "KLM(Oxidation)QQQQEV", + "KLQPGSVKKV", + "KLSPKAEEV", + "KM(Oxidation)DESKHEI", + "KM(Oxidation)LDHEYTT", + "KMDESKHEI", + "KMNESTRSV", + "KQIKEIKEV", + "KRGPHGLI", + "KSKEFVQKV", + "KTKEGVREV", + "KVIDTQQKV", + "KVSNSGITRV", + "KVVNPTQK", + "KYLGKTHNL", + "KYNRQSM(Oxidation)TL", + "KYQPKPKQI", + "KYTPPPHHI", + "LAKTGVHHY", + "LDKKVEKV", + "LLKSEKSSY", + "LPPKDGKVA", + "LPSENHKEM", + "LPSENHKEM(Oxidation)", + "M(Oxidation)LSEHTSKL", + "M(Oxidation)PPEHVRKI", + "M(Oxidation)PQGGGQHY", + "M(Oxidation)PQKERESI", + "M(Oxidation)PRNLREY", + "MPKAEKNAV", + "MPNKVRKI", + "MPPEHVRKI", + "MPQKERESI", + "NAAEGRSF", + "NAHGEPRNY", + "NALAHKYH", + "NAM(Oxidation)KIRDV", + "NASARDNTI", + "NATAVVRHM(Oxidation)", + "NATNAVKRL", + "NGTHVVRHY", + "NIQKITKS", + "NLAEKPKTV", + "NLKVKGPVR", + "NLRPKKKV", + "NLTEEEEKSKS", + "NNLSSLSKK", + "NPFGGASHAKG", + "NPHRAVEY", + "NPKESSSSL", + "NTKIGPRR", + "NVKIVKVKKE", + "NYTKEHNNL", + "PPNKKPKV", + "PVEKALRD", + "QAGPINREM(Oxidation)", + "QALKHLKQY", + "QGVM(Oxidation)VGM(Oxidation)GQK", + "QGVM(Oxidation)VGM(Oxidation)GQKD", + "QPAKADKESF", + "QPHKVTQY", + "QTHQPPAPNS", + "QVKPNSNQV", + "QYKKDGADF", + "RFYARYSL", + "RLAEAHAKV", + "RLGPTGKEV", + "RLHEKIQEA", + "RLNNKSAKV", + "RMARTPQTV", + "RPKKPGQSF", + "RPVPKGATY", + "RQVTGVTRV", + "RSNEHIREL", + "RSTENVNKL", + "RSTQYM(Oxidation)KEY", + "RVAGIHKKV", + "RYIDLHSNR", + "RYIDTHNRV", + "RYM(Oxidation)NHM(Oxidation)QSL", + "SAKLERSHY", + "SAQTTSHEL", + "SARAGETRF", + "SASHVSKTV", + "SATGHPRKV", + "SATNALRSM(Oxidation)", + "SAVDRQREY", + "SAYANAKKY", + "SEVAHRFK", + "SIVGRPRH", + "SKEYFSKQ", + "SLDKTSHSV", + "SLDTQPKKV", + "SM(Oxidation)LGSPHKV", + "SM(Oxidation)NTHLKAV", + "SPM(Oxidation)EKIKQY", + "SPNYHEEKY", + "SQRFPKAE", + "SSRSYTSGPG", + "SVDGTRTNV", + "SVQVFGRKK", + "SYVGDEAQSKR", + "SYVGDEAQSKRG", + "TALAPSTM(Oxidation)K", + "TAPQTQHV", + "TARPGPRAV", + "TDKSFVEK", + "TDRETGKL", + "TEKLVTSK", + "TEKLVTSKG", + "TGYYGKGKP", + "THQPPAPNS", + "THYDPPRK", + "TIEQEKRSEIS", + "TIGEGQQHHLG", + "TKKVPQVS", + "TLVQTKGT", + "TPPGVRKI", + "TSGPGSRISSSS", + "TSTPNAKTV", + "TTPISEQKG", + "TTTHITKTV", + "TVIGPDGHKE", + "TVKDSRTVY", + "TVQNEANKY", + "VAPPKAHEV", + "VASEGIKRY", + "VHLTPEEK", + "VITDKEKAE", + "VPKEGKVV", + "VQNGKHFKF", + "VSKGTLVQTKGT", + "VTTSTRTY", + "VYAQKHQQL", + "VYGKTSHL", + "YADEKTKDV", + "YARLHPRAV", + "YGSTVSKRV", + "YPAKAKGTF", + "YTKKLNTQ", + "YTM(Oxidation)KKVHAL" + ] + ], + [ + "HepG2_ClassII.tsv", + [ + "AAAAAAHRL", + "AAATVTKKV", + "AAHPNVQKV", + "AAM(Oxidation)SVAKRV", + "AANAQPHKL", + "AANDKLKKM", + "AAPPPPAHA", + "AAPRPPPKPM(Oxidation)", + "AAQAHTREL", + "AARAEAREI", + "AASPVGKRL", + "AASSLKKQY", + "AATDHSNQL", + "AATPAKKTV", + "AATVTKKTY", + "AKDVKFGAD", + "ALKDKIEKA", + "ALKDSVQRA", + "ALKKALAAA", + "ALSDLHAHK", + "AM(Oxidation)AARPHSI", + "AM(Oxidation)AASPHAV", + "AM(Oxidation)ASHLTST", + "AM(Oxidation)HGHVEVV", + "AM(Oxidation)NARPHKV", + "AMNARPHKV", + "APPKAHEV", + "APRADAKAY", + "APRPPPKPM(Oxidation)", + "AVM(Oxidation)GNPKVKA", + "DAAVHQRI", + "DAKKQIKQV", + "DAPAGRKV", + "DGKKKISTV", + "DHVITNM(Oxidation)N", + "DNKKTRII", + "DPM(Oxidation)KARVV", + "DPPKTHVT", + "DPPRDSKGL", + "EYSKQM(Oxidation)QRF", + "FADPHSKRV", + "GKVGAHAGEY", + "GKVGAHAGEYG", + "GLAKSIHHA", + "GMAKKVTKA", + "GNVAEGETKPD", + "GPNKKPRF", + "GPRVVERH", + "GRVVEPKR", + "GVM(Oxidation)VGM(Oxidation)GQKD", + "HAAENPGKY", + "HAANPNGRYY", + "HAASRIKTI", + "HAATYTKKV", + "HAGPTAHEL", + "HAKEKLTAL", + "HAM(Oxidation)EEVKKF", + "HAPELTKKV", + "HLKEDQTEY", + "HPAENGKSNF", + "HPESERISM(Oxidation)", + "HPGRPQPPA", + "HPNKVKVY", + "HPYQPDPKM(Oxidation)", + "HSRNEGVATY", + "HSSPASSNY", + "HVKDANGNSF", + "HVSTHQHNY", + "IAPKTTRV", + "IASQTVKKV", + "IKTVETRD", + "IPQKFHRSV", + "ISSEAHREV", + "IVGRPRHQ", + "KAAKPKVV", + "KAAQPKSL", + "KAASHIKSI", + "KAISGVHTV", + "KAKPGTYKV", + "KALVKPKEV", + "KASEQAKVV", + "KASGTLREY", + "KAYGKAKSI", + "KGTGASGSF", + "KLAESVEKA", + "KLAPPPKKA", + "KLQPGSVKKV", + "KM(Oxidation)DESKHEI", + "KM(Oxidation)LDHEYTT", + "KMDESKHEI", + "KMNESTRSV", + "KMQEHSDQV", + "KRSSPETL", + "KSKEFVQKV", + "KTKEGVREV", + "KTLGTDVVKS", + "KVHLGARAS", + "KVVNPTQK", + "KYKERGTVL", + "KYLGKTHNL", + "KYNRQSM(Oxidation)TL", + "KYQPKPKQI", + "KYTPPPHHI", + "LAKTGVHHY", + "LLKSEKSSY", + "LPSENHKEM", + "LPSENHKEM(Oxidation)", + "M(Oxidation)PPEHVRKI", + "M(Oxidation)PQGGGQHY", + "M(Oxidation)PQKERESI", + "MPNKVRKI", + "MPQKERESI", + "NAHGEPRNY", + "NALAHKYH", + "NAM(Oxidation)KIRDV", + "NASARDNTI", + "NATAVVRHM(Oxidation)", + "NGTHVVRHY", + "NIQKITKS", + "NLKVKGPVR", + "NLRPKKKVK", + "NLSSLSKK", + "NLTEEEEKSKS", + "NNLSSLSKK", + "NPAAYENDK", + "NPFGGASHAKG", + "NPKESSSSL", + "NPKREIQKI", + "NSHSTTSSF", + "NTKIGPRR", + "NVDYSKLKK", + "NVINGGSHA", + "NVKIVKVKKE", + "PPNKKPKV", + "QAGPINREM(Oxidation)", + "QALKHLKQY", + "QGVM(Oxidation)VGM(Oxidation)GQK", + "QPAKADKESF", + "QTHQPPAPNS", + "QYKKDGADF", + "RLAEAHAKV", + "RLHEKIQEA", + "RLNNKSAKV", + "RMARTPQTV", + "RPVPKGATY", + "RSNEHIREL", + "RSTENVNKL", + "RSTQYM(Oxidation)KEY", + "RVAGIHKKV", + "RYDDM(Oxidation)AAAM(Oxidation)", + "SAKLERSHY", + "SAM(Oxidation)SNPRAM", + "SAQTTSHEL", + "SARAGETRF", + "SASEAAKKY", + "SATGHPRKV", + "SATSNKHLL", + "SAYANAKKY", + "SEVAHRFK", + "SIVGRPRH", + "SLDKTSHSV", + "SLDTQPKKV", + "SM(Oxidation)LGSPHKV", + "SM(Oxidation)NTHLKAV", + "SM(Oxidation)PEQAHKV", + "SQRFPKAE", + "SSRSYTSGPG", + "SVKNDHSAY", + "SVQVFGRKK", + "SYVGDEAQSKR", + "SYVGDEAQSKRG", + "TAPQTQHV", + "TARPGPRAV", + "TDKSFVEK", + "TDRETGKL", + "TEDSPGLK", + "TEKLVTSK", + "TEKLVTSKG", + "THYDPPRK", + "TKELPSGKKY", + "TRLSRTPGNR", + "TSGPGSRISSSS", + "TSTPNAKTV", + "TTPISEQKG", + "TVKDSRTVY", + "VAPPKAHEV", + "VARAGQKGY", + "VHLTPEEK", + "VITDKEKAE", + "VPKEGKVV", + "VQKTIAEN", + "VSKGTLVQTKGT", + "VVRHQLLKT", + "VYAQKHQQL", + "VYGKTSHL", + "YADEKTKDV", + "YGSTVSKRV", + "YLNKHIQKV", + "YTKKLNTQ", + "YTM(Oxidation)KKVHAL", + "YVGDEAQSKR", + "YVGDEAQSKRG" + ] + ] ] ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.04.8" + "nextflow": "25.10.3" }, - "timestamp": "2026-02-06T14:54:49.407532871" + "timestamp": "2026-02-06T15:57:59.299534051" } } \ No newline at end of file From 52b1591913bf76a3a9554a51c9fd51585b6db5d7 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 6 Feb 2026 17:06:13 +0000 Subject: [PATCH 056/104] Fix CI failures: prettier formatting, lint ignore, and ionannotator snapshot - Format schema_input.json with prettier - Add search_presets to schema_params lint ignore (nested config map) - Update ionannotator snapshot for topic channel version deduplication --- .nf-core.yml | 2 ++ assets/schema_input.json | 34 +++++++++++++++++++++++---------- tests/ionannotator.nf.test.snap | 12 +++--------- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 1a7fed6b..f0b7bb1d 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,6 +2,8 @@ lint: files_unchanged: - .github/CONTRIBUTING.md - .vscode/settings.json + schema_params: + - search_presets nf_core_version: 3.5.1 repository_type: pipeline template: diff --git a/assets/schema_input.json b/assets/schema_input.json index acbe53d8..885b488e 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -14,19 +14,13 @@ }, "Sample": { "type": ["string", "integer"], - "anyOf": [ - { "type": "string", "pattern": "^\\S+$" }, - { "type": "integer" } - ], + "anyOf": [{ "type": "string", "pattern": "^\\S+$" }, { "type": "integer" }], "errorMessage": "Sample name must be provided and cannot contain spaces", "meta": ["sample"] }, "Condition": { "type": ["string", "integer"], - "anyOf": [ - { "type": "string", "pattern": "^\\S+-?" }, - { "type": "integer" } - ], + "anyOf": [{ "type": "string", "pattern": "^\\S+-?" }, { "type": "integer" }], "errorMessage": "Sample condition must be provided and cannot contain spaces", "meta": ["condition"] }, @@ -46,7 +40,16 @@ }, "SearchPreset": { "type": "string", - "enum": ["lumos_class1", "lumos_class2", "qe_class1", "qe_class2", "timstof_class1", "timstof_class2", "xl_class1", "xl_class2"], + "enum": [ + "lumos_class1", + "lumos_class2", + "qe_class1", + "qe_class2", + "timstof_class1", + "timstof_class2", + "xl_class1", + "xl_class2" + ], "errorMessage": "SearchPreset must be one of: lumos_class1, lumos_class2, qe_class1, qe_class2, timstof_class1, timstof_class2, xl_class1, xl_class2. Can be extended upon request.", "meta": ["search_preset"] }, @@ -94,7 +97,18 @@ }, "MS2PIPModel": { "type": "string", - "enum": ["Immuno-HCD", "timsTOF", "CIDch2", "HCD", "CID", "ITMS", "iTRAQ", "iTRAQphospho", "TMT", "HCDch2"], + "enum": [ + "Immuno-HCD", + "timsTOF", + "CIDch2", + "HCD", + "CID", + "ITMS", + "iTRAQ", + "iTRAQphospho", + "TMT", + "HCDch2" + ], "errorMessage": "MS2PIPModel must be a valid MS2PIP model name", "meta": ["ms2pip_model"] }, diff --git a/tests/ionannotator.nf.test.snap b/tests/ionannotator.nf.test.snap index d7ceb2b1..e20dbd6d 100644 --- a/tests/ionannotator.nf.test.snap +++ b/tests/ionannotator.nf.test.snap @@ -1,7 +1,7 @@ { "-profile test_ionannotator": { "content": [ - 22, + 21, { "MS2RESCORE": { "MS2Rescore": "3.1.5" @@ -38,9 +38,6 @@ "PYOPENMS_CHROMATOGRAMEXTRACTOR": { "pyopenms": "3.4.1" }, - "PYOPENMS_IONANNOTATOR": { - "pyopenms": "3.4.1" - }, "SUMMARIZE_RESULTS": { "pyopenms": "3.4.1" }, @@ -55,9 +52,6 @@ "intermediate_results/comet/HepG2_rep1_small_pin.tsv", "intermediate_results/comet/HepG2_rep2_small_pin.tsv", "intermediate_results/comet/HepG2_rep3_small_pin.tsv", - "intermediate_results/ion_annotations", - "intermediate_results/ion_annotations/HepG2_A_all_peaks.tsv", - "intermediate_results/ion_annotations/HepG2_A_matching_ions.tsv", "intermediate_results/rescoring", "intermediate_results/rescoring/HepG2_A_ms2rescore.idXML", "intermediate_results/rescoring/HepG2_A_pout.idXML", @@ -403,8 +397,8 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.04.8" + "nextflow": "25.10.3" }, - "timestamp": "2026-01-24T12:14:04.270867859" + "timestamp": "2026-02-06T17:06:07.615459843" } } \ No newline at end of file From d6ad64e0bd1f3590f7a3081679456e7b4638d3e6 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 6 Feb 2026 17:13:25 +0000 Subject: [PATCH 057/104] Add search_presets as hidden param in nextflow_schema.json to fix lint --- .nf-core.yml | 2 -- nextflow_schema.json | 5 +++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index f0b7bb1d..1a7fed6b 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,8 +2,6 @@ lint: files_unchanged: - .github/CONTRIBUTING.md - .vscode/settings.json - schema_params: - - search_presets nf_core_version: 3.5.1 repository_type: pipeline template: diff --git a/nextflow_schema.json b/nextflow_schema.json index 05d3b5b0..398ec4bd 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -250,6 +250,11 @@ "fa_icon": "fas fa-file-code", "hidden": true, "description": "Specify custom Comet params file. All parameters of this take precedence." + }, + "search_presets": { + "type": "object", + "hidden": true, + "description": "Predefined search parameter presets for different MHC classes and instruments. Referenced via the SearchPreset column in the samplesheet." } } }, From 06184bedc7166b27c354d8470a89e2299ad18765 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 6 Feb 2026 19:14:26 +0000 Subject: [PATCH 058/104] Document per-sample search parameters and fix stale ch_versions reference --- docs/usage.md | 78 ++++++++++++++++++++-- subworkflows/local/process_feature/main.nf | 1 - 2 files changed, 71 insertions(+), 8 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index b90afdba..a94c28a2 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -14,13 +14,25 @@ You will need to create a samplesheet with information about the samples you wou ### Samplesheet columns -| Column | Description | -| ------------------- | ----------------------------------------------------------------------------------------------------- | -| `ID` | An incrementing value which acts as a unique number for the given sample | -| `Sample` | Custom sample name. This entry will be identical for multiple MS runs from the same sample. | -| `Condition` | Additional information of the sample can be defined here. | -| `ReplicateFileName` | Full path to the MS file. These files have the extensions .raw, .mzML, mzML.gz, .d, .d.tar.gz, .d.zip | -| `Fasta` | Full path to the FASTA file. These files have the extensions .fasta, .fa, .fas, .fna, .faa, .ffn | +| Column | Required | Description | +| ------------------------ | -------- | ----------------------------------------------------------------------------------------------------- | +| `ID` | Yes | An incrementing value which acts as a unique number for the given sample | +| `Sample` | Yes | Custom sample name. This entry will be identical for multiple MS runs from the same sample. | +| `Condition` | Yes | Additional information of the sample can be defined here. | +| `ReplicateFileName` | Yes | Full path to the MS file. These files have the extensions .raw, .mzML, mzML.gz, .d, .d.tar.gz, .d.zip | +| `Fasta` | No | Full path to the FASTA file. These files have the extensions .fasta, .fa, .fas, .fna, .faa, .ffn | +| `SearchPreset` | No | Name of a built-in search parameter preset (see [Search presets](#search-presets)) | +| `PeptideMinLength` | No | Minimum peptide length for database search | +| `PeptideMaxLength` | No | Maximum peptide length for database search | +| `PrecursorMassRange` | No | Precursor mass range in format `min:max` (e.g. `800:2500`) | +| `PrecursorCharge` | No | Precursor charge range in format `min:max` (e.g. `2:3`) | +| `PrecursorMassTolerance` | No | Precursor mass tolerance in ppm | +| `FragmentMassTolerance` | No | Fragment mass tolerance in Da | +| `FragmentBinOffset` | No | Fragment bin offset (0 for high-res, 0.4 for low-res) | +| `MS2PIPModel` | No | MS2PIP model name for spectral prediction (e.g. `Immuno-HCD`, `timsTOF`, `CIDch2`) | +| `ActivationMethod` | No | Fragmentation method (`HCD`, `CID`, `ETD`, etc.) | +| `Instrument` | No | Instrument resolution type (`high_res` or `low_res`) | +| `NumberMods` | No | Maximum number of variable modifications per peptide | > [!NOTE] > The `Fasta` column is optional, but you can use it to provide sample-specific FASTA files. If you want to use the same FASTA file for all samples, provide it via the `--fasta` parameter. Please ensure you use one of these options. @@ -45,6 +57,58 @@ ID Sample Condition ReplicateFileName 8 control untreated /path/to/msrun8.raw|mzML|d ``` +### Search presets + +When processing data from different instruments or MHC classes in a single run, you can use the `SearchPreset` column to assign a named set of search parameters to each sample. This avoids having to specify each parameter individually per row. + +Available presets: + +| Preset | Instrument | MHC Class | Peptide Length | Mass Range | Charge | Precursor Tol. | Fragment Tol. | MS2PIP Model | +| ---------------- | --------------------- | --------- | -------------- | ---------- | ------ | -------------- | ------------- | ------------ | +| `lumos_class1` | Orbitrap Fusion Lumos | I | 8-14 | 800:2500 | 2:3 | 5 ppm | 0.01 Da | Immuno-HCD | +| `lumos_class2` | Orbitrap Fusion Lumos | II | 8-30 | 800:5000 | 2:5 | 5 ppm | 0.01 Da | Immuno-HCD | +| `qe_class1` | Q Exactive | I | 8-14 | 800:2500 | 2:3 | 5 ppm | 0.01 Da | Immuno-HCD | +| `qe_class2` | Q Exactive | II | 8-30 | 800:5000 | 2:5 | 5 ppm | 0.01 Da | Immuno-HCD | +| `timstof_class1` | timsTOF | I | 8-14 | 800:2500 | 1:4 | 20 ppm | 0.01 Da | timsTOF | +| `timstof_class2` | timsTOF | II | 8-30 | 800:5000 | 1:5 | 20 ppm | 0.01 Da | timsTOF | +| `xl_class1` | LTQ Orbitrap XL | I | 8-14 | 800:2500 | 2:3 | 5 ppm | 0.50025 Da | CIDch2 | +| `xl_class2` | LTQ Orbitrap XL | II | 8-30 | 800:5000 | 2:5 | 5 ppm | 0.50025 Da | CIDch2 | + +Example samplesheet with presets: + +```tsv title="samplesheet.tsv" +ID Sample Condition ReplicateFileName SearchPreset +1 lumos_sample A /path/to/lumos_run1.raw lumos_class1 +2 lumos_sample A /path/to/lumos_run2.raw lumos_class1 +3 timstof_sample B /path/to/timstof_run1.d timstof_class2 +4 timstof_sample B /path/to/timstof_run2.d timstof_class2 +``` + +### Per-sample search parameter overrides + +Individual search parameters can also be specified directly in the samplesheet, either together with a preset or standalone. This is useful when you need fine-grained control over a specific parameter. + +```tsv title="samplesheet.tsv" +ID Sample Condition ReplicateFileName SearchPreset PeptideMaxLength +1 sample1 A /path/to/run1.raw lumos_class1 16 +2 sample2 B /path/to/run2.raw 12 +``` + +In the example above, `sample1` uses the `lumos_class1` preset but overrides `PeptideMaxLength` to 16 (instead of the preset default 14). `sample2` has no preset but sets `PeptideMaxLength` to 12 directly. + +### Parameter precedence + +Search parameters are resolved with the following precedence (highest to lowest): + +1. **Samplesheet column** (e.g. `PeptideMinLength`) -- per-sample values specified directly in the samplesheet always win +2. **Search preset** (e.g. `SearchPreset: lumos_class1`) -- preset values fill in any parameters not specified in the samplesheet +3. **Command-line / global params** (e.g. `--peptide_min_length 8`) -- global defaults are used as a final fallback for any parameter not set by the above + +This means you can set sensible defaults globally via the command line, use presets for instrument/class-specific groups, and override individual parameters per sample where needed. + +> [!NOTE] +> When using `--global_fdr`, samples sharing the same `SearchPreset` value are grouped together for global FDR estimation. Samples without a preset are grouped under a common `global` group. + ## Recommended search settings Fine-tuning search settings is important to obtain the most optimal results for your MS data. _These settings heavily depend on the MS instrument settings used to generate the data_. If you want to reprocess public data, make sure you use the settings mentioned in the methods section! The following table acts as an orientation of commonly used search settings for instruments: diff --git a/subworkflows/local/process_feature/main.nf b/subworkflows/local/process_feature/main.nf index 0807a363..e414883c 100644 --- a/subworkflows/local/process_feature/main.nf +++ b/subworkflows/local/process_feature/main.nf @@ -30,7 +30,6 @@ workflow PROCESS_FEATURE { // Single replicate: promote featureXML to consensusXML OPENMS_FILECONVERTER(ch_features.single.map { meta, features -> [ meta, features[0], "consensusXML" ] }) - ch_versions = ch_versions.mix(OPENMS_FILECONVERTER.out.versions) // Resolve conflicting ids matching to the same feature ch_consensus_input = OPENMS_FEATURELINKERUNLABELEDKD.out.consensusxml From 11c192697be5d7c9fb605661e1bafa7122979cf0 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 6 Feb 2026 21:48:54 +0000 Subject: [PATCH 059/104] Align search preset fragment_mass_tolerance with recommended settings --- conf/search_presets.config | 12 ++++++------ docs/usage.md | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/conf/search_presets.config b/conf/search_presets.config index 3aecae72..0468b717 100644 --- a/conf/search_presets.config +++ b/conf/search_presets.config @@ -17,7 +17,7 @@ params { digest_mass_range: '800:2500', prec_charge: '2:3', precursor_mass_tolerance: 5, - fragment_mass_tolerance: 0.01, + fragment_mass_tolerance: 0.02, fragment_bin_offset: 0.0, ms2pip_model: 'Immuno-HCD', activation_method: 'HCD', @@ -30,7 +30,7 @@ params { digest_mass_range: '800:5000', prec_charge: '2:5', precursor_mass_tolerance: 5, - fragment_mass_tolerance: 0.01, + fragment_mass_tolerance: 0.02, fragment_bin_offset: 0.0, ms2pip_model: 'Immuno-HCD', activation_method: 'HCD', @@ -44,7 +44,7 @@ params { digest_mass_range: '800:2500', prec_charge: '2:3', precursor_mass_tolerance: 5, - fragment_mass_tolerance: 0.01, + fragment_mass_tolerance: 0.02, fragment_bin_offset: 0.0, ms2pip_model: 'Immuno-HCD', activation_method: 'HCD', @@ -57,7 +57,7 @@ params { digest_mass_range: '800:5000', prec_charge: '2:5', precursor_mass_tolerance: 5, - fragment_mass_tolerance: 0.01, + fragment_mass_tolerance: 0.02, fragment_bin_offset: 0.0, ms2pip_model: 'Immuno-HCD', activation_method: 'HCD', @@ -71,7 +71,7 @@ params { digest_mass_range: '800:2500', prec_charge: '1:4', precursor_mass_tolerance: 20, - fragment_mass_tolerance: 0.01, + fragment_mass_tolerance: 0.02, fragment_bin_offset: 0.0, ms2pip_model: 'timsTOF', activation_method: 'CID', @@ -84,7 +84,7 @@ params { digest_mass_range: '800:5000', prec_charge: '1:5', precursor_mass_tolerance: 20, - fragment_mass_tolerance: 0.01, + fragment_mass_tolerance: 0.02, fragment_bin_offset: 0.0, ms2pip_model: 'timsTOF', activation_method: 'CID', diff --git a/docs/usage.md b/docs/usage.md index a94c28a2..ab539439 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -65,12 +65,12 @@ Available presets: | Preset | Instrument | MHC Class | Peptide Length | Mass Range | Charge | Precursor Tol. | Fragment Tol. | MS2PIP Model | | ---------------- | --------------------- | --------- | -------------- | ---------- | ------ | -------------- | ------------- | ------------ | -| `lumos_class1` | Orbitrap Fusion Lumos | I | 8-14 | 800:2500 | 2:3 | 5 ppm | 0.01 Da | Immuno-HCD | -| `lumos_class2` | Orbitrap Fusion Lumos | II | 8-30 | 800:5000 | 2:5 | 5 ppm | 0.01 Da | Immuno-HCD | -| `qe_class1` | Q Exactive | I | 8-14 | 800:2500 | 2:3 | 5 ppm | 0.01 Da | Immuno-HCD | -| `qe_class2` | Q Exactive | II | 8-30 | 800:5000 | 2:5 | 5 ppm | 0.01 Da | Immuno-HCD | -| `timstof_class1` | timsTOF | I | 8-14 | 800:2500 | 1:4 | 20 ppm | 0.01 Da | timsTOF | -| `timstof_class2` | timsTOF | II | 8-30 | 800:5000 | 1:5 | 20 ppm | 0.01 Da | timsTOF | +| `lumos_class1` | Orbitrap Fusion Lumos | I | 8-14 | 800:2500 | 2:3 | 5 ppm | 0.02 Da | Immuno-HCD | +| `lumos_class2` | Orbitrap Fusion Lumos | II | 8-30 | 800:5000 | 2:5 | 5 ppm | 0.02 Da | Immuno-HCD | +| `qe_class1` | Q Exactive | I | 8-14 | 800:2500 | 2:3 | 5 ppm | 0.02 Da | Immuno-HCD | +| `qe_class2` | Q Exactive | II | 8-30 | 800:5000 | 2:5 | 5 ppm | 0.02 Da | Immuno-HCD | +| `timstof_class1` | timsTOF | I | 8-14 | 800:2500 | 1:4 | 20 ppm | 0.02 Da | timsTOF | +| `timstof_class2` | timsTOF | II | 8-30 | 800:5000 | 1:5 | 20 ppm | 0.02 Da | timsTOF | | `xl_class1` | LTQ Orbitrap XL | I | 8-14 | 800:2500 | 2:3 | 5 ppm | 0.50025 Da | CIDch2 | | `xl_class2` | LTQ Orbitrap XL | II | 8-30 | 800:5000 | 2:5 | 5 ppm | 0.50025 Da | CIDch2 | From 7985ec6e8382457b73d3ac3270f60f8632d79dac Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Mon, 9 Feb 2026 07:27:46 +0000 Subject: [PATCH 060/104] Remove duplicate comment in mhcquant workflow --- workflows/mhcquant.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/workflows/mhcquant.nf b/workflows/mhcquant.nf index c247f8b8..465b65a9 100644 --- a/workflows/mhcquant.nf +++ b/workflows/mhcquant.nf @@ -62,7 +62,6 @@ workflow MHCQUANT { // Prepare spectra files (Decompress archives, convert to mzML, centroid if specified) PREPARE_SPECTRA(ch_samplesheet) - // Decoy Database creation // Decoy Database creation if (!params.skip_decoy_generation) { // Generate reversed decoy database From 103bcf56283252015d5ba5ee13d0c7aaee2ccb62 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Mon, 9 Feb 2026 08:54:21 +0000 Subject: [PATCH 061/104] Propagate search params through pipeline with CLI > samplesheet > preset > default priority --- conf/modules.config | 32 +- conf/search_presets.config | 16 + subworkflows/local/prepare_spectra/main.nf | 12 +- subworkflows/local/rescore/main.nf | 4 +- .../utils_nfcore_mhcquant_pipeline/main.nf | 37 +- tests/search_presets.nf.test.snap | 475 +----------------- workflows/mhcquant.nf | 11 +- 7 files changed, 68 insertions(+), 519 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index e522262e..1d1a17c5 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -94,18 +94,18 @@ process { ext.args = { [ (params.default_params_file_comet != " ") ? "-default_params_file ${params.default_params_file_comet}" : "", "-pin_out ${mzml.baseName}_pin.tsv", - "-instrument ${meta.instrument ?: params.instrument}", + "-instrument ${meta.instrument}", "-spectrum_batch_size ${params.spectrum_batch_size}", - "-activation_method ${meta.activation_method ?: params.activation_method}", - "-precursor_mass_tolerance ${meta.precursor_mass_tolerance ?: params.precursor_mass_tolerance}", + "-activation_method ${meta.activation_method}", + "-precursor_mass_tolerance ${meta.precursor_mass_tolerance}", "-precursor_error_units ${params.precursor_error_units}", - "-fragment_mass_tolerance ${meta.fragment_mass_tolerance ?: params.fragment_mass_tolerance}", - "-fragment_bin_offset ${meta.fragment_bin_offset ?: params.fragment_bin_offset}", + "-fragment_mass_tolerance ${meta.fragment_mass_tolerance}", + "-fragment_bin_offset ${meta.fragment_bin_offset}", "-num_hits ${params.num_hits}", - "-digest_mass_range ${meta.digest_mass_range ?: params.digest_mass_range}", - "-max_variable_mods_in_peptide ${meta.number_mods ?: params.number_mods}", + "-digest_mass_range ${meta.digest_mass_range}", + "-max_variable_mods_in_peptide ${meta.number_mods}", "-missed_cleavages 0", - "-precursor_charge ${meta.prec_charge ?: params.prec_charge}", + "-precursor_charge ${meta.prec_charge}", "-fixed_modifications ${params.fixed_mods.tokenize(',').collect {"'${it}'"}.join(" ")}", "-variable_modifications ${params.variable_mods.tokenize(',').collect {"'${it}'"}.join(" ")}", "-enzyme '${params.enzyme}'", @@ -158,7 +158,7 @@ process { ext.prefix = {"${meta.id}_pout_filtered"} ext.args = { [ "-remove_decoys", - "-precursor:length '${meta.peptide_min_length ?: params.peptide_min_length}:${meta.peptide_max_length ?: params.peptide_max_length}'", + "-precursor:length '${meta.peptide_min_length}:${meta.peptide_max_length}'", "-delete_unreferenced_peptide_hits", (params.fdr_threshold == '0.01') ? "-score:peptide 0.05" : "-score:peptide " + params.fdr_threshold ].join(' ').trim() } @@ -174,7 +174,7 @@ process { ext.prefix = {"${meta.id}_pout_filtered"} ext.args = { [ "-remove_decoys", - "-precursor:length '${meta.peptide_min_length ?: params.peptide_min_length}:${meta.peptide_max_length ?: params.peptide_max_length}'", + "-precursor:length '${meta.peptide_min_length}:${meta.peptide_max_length}'", "-delete_unreferenced_peptide_hits", (params.fdr_threshold == '0.01') ? "-score:peptide 0.05" : "-score:peptide " + params.fdr_threshold ].join(' ').trim() } @@ -188,7 +188,7 @@ process { ext.prefix = {"${meta.id}_pout_filtered"} ext.args = { [ "-remove_decoys", - "-precursor:length '${meta.peptide_min_length ?: params.peptide_min_length}:${meta.peptide_max_length ?: params.peptide_max_length}'", + "-precursor:length '${meta.peptide_min_length}:${meta.peptide_max_length}'", "-delete_unreferenced_peptide_hits", (params.fdr_threshold == '0.01') ? "-score:peptide 0.05" : "-score:peptide " + params.fdr_threshold ].join(' ').trim() } @@ -350,7 +350,7 @@ process { ext.prefix = {"${meta.spectra}"} ext.args = { [ (params.precursor_error_units == 'ppm') ? "-precursor_error_ppm": "", - "-fragment_mass_tolerance ${meta.fragment_mass_tolerance ?: params.fragment_mass_tolerance}" + "-fragment_mass_tolerance ${meta.fragment_mass_tolerance}" ].join(' ').trim() } publishDir = [ enabled: false @@ -359,8 +359,8 @@ process { withName: 'MS2RESCORE' { ext.args = { [ - "--ms2_tolerance ${2 * (meta.fragment_mass_tolerance ?: params.fragment_mass_tolerance)}", - "--ms2pip_model ${meta.ms2pip_model ?: params.ms2pip_model}", + "--ms2_tolerance ${2 * (meta.fragment_mass_tolerance as double)}", + "--ms2pip_model ${meta.ms2pip_model}", "--ms2pip_model_dir ${params.ms2pip_model_dir}", "--rescoring_engine ${params.rescoring_engine}", params.feature_generators.trim() ? "--feature_generators ${params.feature_generators}" : '' @@ -528,8 +528,8 @@ process { if (params.annotate_ions) { withName: 'PYOPENMS_IONANNOTATOR' { ext.args = { [ - "--precursor_charge ${meta.prec_charge ?: params.prec_charge}", - "--fragment_mass_tolerance ${meta.fragment_mass_tolerance ?: params.fragment_mass_tolerance}", + "--precursor_charge ${meta.prec_charge}", + "--fragment_mass_tolerance ${meta.fragment_mass_tolerance}", "--remove_precursor_peak ${params.remove_precursor_peak}" ].join(' ').trim() } publishDir = [ diff --git a/conf/search_presets.config b/conf/search_presets.config index 0468b717..e1af3dff 100644 --- a/conf/search_presets.config +++ b/conf/search_presets.config @@ -9,6 +9,22 @@ */ params { + // Default values for search parameters (must match nextflow.config defaults) + // Used to detect CLI overrides: if params.X != defaults[X], user set it explicitly + search_param_defaults = [ + instrument: 'high_res', + activation_method: 'ALL', + digest_mass_range: '800:2500', + prec_charge: '2:3', + precursor_mass_tolerance: 5, + fragment_mass_tolerance: 0.01, + fragment_bin_offset: 0.0, + number_mods: 3, + ms2pip_model: 'Immuno-HCD', + peptide_min_length: 8, + peptide_max_length: 12 + ] + search_presets = [ // Lumos instrument presets 'lumos_class1': [ diff --git a/subworkflows/local/prepare_spectra/main.nf b/subworkflows/local/prepare_spectra/main.nf index 5dc4a763..a06abf15 100644 --- a/subworkflows/local/prepare_spectra/main.nf +++ b/subworkflows/local/prepare_spectra/main.nf @@ -18,17 +18,17 @@ workflow PREPARE_SPECTRA { .branch { meta, filename -> raw : meta.ext == 'raw' - return [ meta.subMap('id', 'sample', 'condition', 'group_count', 'spectra'), filename ] + return [ meta.subMap(meta.keySet() - ['ext']), filename ] mzml : meta.ext == 'mzml' - return [ meta.subMap('id', 'sample', 'condition', 'group_count', 'spectra'), filename ] + return [ meta.subMap(meta.keySet() - ['ext']), filename ] mzml_gz : meta.ext == 'mzml.gz' - return [ meta.subMap('id', 'sample', 'condition', 'group_count', 'spectra'), filename ] + return [ meta.subMap(meta.keySet() - ['ext']), filename ] d : meta.ext == 'd' - return [ meta.subMap('id', 'sample', 'condition', 'group_count', 'spectra'), filename ] + return [ meta.subMap(meta.keySet() - ['ext']), filename ] d_tar : meta.ext == 'd.tar' | meta.ext == 'd.tar.gz' - return [ meta.subMap('id', 'sample', 'condition', 'group_count', 'spectra'), filename ] + return [ meta.subMap(meta.keySet() - ['ext']), filename ] d_zip : meta.ext == 'd.zip' - return [ meta.subMap('id', 'sample', 'condition', 'group_count', 'spectra'), filename ] + return [ meta.subMap(meta.keySet() - ['ext']), filename ] other : true } .set { branched_ms_files } diff --git a/subworkflows/local/rescore/main.nf b/subworkflows/local/rescore/main.nf index e1bd9350..6acc3a3d 100644 --- a/subworkflows/local/rescore/main.nf +++ b/subworkflows/local/rescore/main.nf @@ -93,7 +93,7 @@ workflow RESCORE { } emit: - rescored_runs = ch_rescored_runs - fdr_filtered = ch_filter_q_value + rescored_runs = ch_rescored_runs.map { meta, file -> [[id: meta.id], file] } + fdr_filtered = ch_filter_q_value.map { meta, file -> [[id: meta.id], file] } multiqc_files = ch_multiqc_files } diff --git a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf index fd5a8586..51e6cbc6 100644 --- a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf @@ -217,34 +217,37 @@ workflow PIPELINE_COMPLETION { */ // -// Resolve a search parameter with priority: meta (individual) > preset > global params +// Resolve a search parameter with priority: CLI params > samplesheet (individual) > preset > config default // def resolveSearchParams(meta, searchPresets) { + def defaults = params.search_param_defaults ?: [:] def presetName = meta.search_preset + def presetConfig = (presetName && searchPresets) ? searchPresets[presetName] : [:] + if (!presetConfig) { presetConfig = [:] } - if (!presetName || !searchPresets) { - return meta - } - - def presetConfig = searchPresets[presetName] - if (!presetConfig) { - return meta - } - - // Build result map - explicitly copy each search param from preset if not already in meta def result = new LinkedHashMap(meta) - // Explicitly set each search parameter def searchParamKeys = ['peptide_min_length', 'peptide_max_length', 'digest_mass_range', 'prec_charge', 'precursor_mass_tolerance', 'fragment_mass_tolerance', 'fragment_bin_offset', 'ms2pip_model', 'activation_method', 'instrument', 'number_mods'] searchParamKeys.each { key -> - // Check for null OR empty (nf-schema sets empty columns to empty lists []) - def currentValue = result[key] - def isEmpty = (currentValue == null) || (currentValue instanceof List && currentValue.size() == 0) || (currentValue == '') - if (isEmpty && presetConfig.containsKey(key)) { - result.put(key, presetConfig.get(key)) + // Detect CLI override: params.X differs from the hardcoded default + def cliOverride = defaults.containsKey(key) && params[key] != defaults[key] + if (cliOverride) { + // CLI has highest priority + result.put(key, params[key]) + } else { + // Check samplesheet individual value (nf-schema sets empty columns to []) + def currentValue = result[key] + def isEmpty = (currentValue == null) || (currentValue instanceof List && currentValue.size() == 0) || (currentValue == '') + if (isEmpty && presetConfig.containsKey(key)) { + // Use preset value + result.put(key, presetConfig.get(key)) + } else if (isEmpty) { + // Fall back to config default (params.X) + result.put(key, params[key]) + } } } diff --git a/tests/search_presets.nf.test.snap b/tests/search_presets.nf.test.snap index 70a3477e..ab2b5c29 100644 --- a/tests/search_presets.nf.test.snap +++ b/tests/search_presets.nf.test.snap @@ -71,13 +71,8 @@ "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_general_stats.txt", - "multiqc/multiqc_data/multiqc_histogram_mz.txt", - "multiqc/multiqc_data/multiqc_histogram_rt.txt", - "multiqc/multiqc_data/multiqc_histogram_scores.txt", - "multiqc/multiqc_data/multiqc_length_dist.txt", "multiqc/multiqc_data/multiqc_mass_error.txt", "multiqc/multiqc_data/multiqc_percolator_barplot.txt", - "multiqc/multiqc_data/multiqc_scores_xcorr.txt", "multiqc/multiqc_data/multiqc_software_versions.txt", "multiqc/multiqc_data/multiqc_sources.txt", "multiqc/multiqc_data/percolator_plot.txt", @@ -86,38 +81,23 @@ "multiqc/multiqc_plots/pdf/chromatogram-cnt.pdf", "multiqc/multiqc_plots/pdf/chromatogram-log.pdf", "multiqc/multiqc_plots/pdf/general_stats.pdf", - "multiqc/multiqc_plots/pdf/histogram_mz.pdf", - "multiqc/multiqc_plots/pdf/histogram_rt.pdf", - "multiqc/multiqc_plots/pdf/histogram_scores.pdf", - "multiqc/multiqc_plots/pdf/length_dist.pdf", "multiqc/multiqc_plots/pdf/mass_error.pdf", "multiqc/multiqc_plots/pdf/percolator_plot-cnt.pdf", "multiqc/multiqc_plots/pdf/percolator_plot-pct.pdf", - "multiqc/multiqc_plots/pdf/scores_xcorr.pdf", "multiqc/multiqc_plots/png", "multiqc/multiqc_plots/png/chromatogram-cnt.png", "multiqc/multiqc_plots/png/chromatogram-log.png", "multiqc/multiqc_plots/png/general_stats.png", - "multiqc/multiqc_plots/png/histogram_mz.png", - "multiqc/multiqc_plots/png/histogram_rt.png", - "multiqc/multiqc_plots/png/histogram_scores.png", - "multiqc/multiqc_plots/png/length_dist.png", "multiqc/multiqc_plots/png/mass_error.png", "multiqc/multiqc_plots/png/percolator_plot-cnt.png", "multiqc/multiqc_plots/png/percolator_plot-pct.png", - "multiqc/multiqc_plots/png/scores_xcorr.png", "multiqc/multiqc_plots/svg", "multiqc/multiqc_plots/svg/chromatogram-cnt.svg", "multiqc/multiqc_plots/svg/chromatogram-log.svg", "multiqc/multiqc_plots/svg/general_stats.svg", - "multiqc/multiqc_plots/svg/histogram_mz.svg", - "multiqc/multiqc_plots/svg/histogram_rt.svg", - "multiqc/multiqc_plots/svg/histogram_scores.svg", - "multiqc/multiqc_plots/svg/length_dist.svg", "multiqc/multiqc_plots/svg/mass_error.svg", "multiqc/multiqc_plots/svg/percolator_plot-cnt.svg", "multiqc/multiqc_plots/svg/percolator_plot-pct.svg", - "multiqc/multiqc_plots/svg/scores_xcorr.svg", "multiqc/multiqc_report.html", "pipeline_info", "pipeline_info/nf_core_mhcquant_software_mqc_versions.yml" @@ -126,464 +106,13 @@ ], [ - [ - "HepG2_ClassI.tsv", - [ - "AAATVTKKV", - "AAHPNVQKV", - "AAKDPSPSV", - "AAM(Oxidation)SVAKRV", - "AANDKLKKM", - "AANPDPKKL", - "AAPPPPAHA", - "AAPRPPPKPM(Oxidation)", - "AAQAHTREL", - "AAQSEAKVV", - "AARAEAREI", - "AASPVGKRL", - "AASSLKKQY", - "AATDHSNQL", - "AATPAKKTV", - "AATRWAKKI", - "AATSNLKKL", - "AKDVKFGAD", - "ALKDKIEKA", - "ALKDSVQRA", - "ALKENGGARLA", - "AM(Oxidation)AARPHSI", - "AM(Oxidation)AASPHAV", - "AM(Oxidation)ASHLTST", - "AM(Oxidation)HGHLEAV", - "AM(Oxidation)HGHVEVV", - "AM(Oxidation)NARPHKV", - "AMNARPHKV", - "APRADAKAY", - "APRPPPKPM(Oxidation)", - "ASTQTTHEL", - "ATWSDPHKA", - "AVM(Oxidation)GNPKVKA", - "AVVVKKIETRDG", - "DAAVHQRI", - "DAKKQIKQV", - "DAPAGRKV", - "DFLSVSDIID", - "DGKKKISTV", - "DPM(Oxidation)KARVV", - "DPPKTHVT", - "DPPRDSKGL", - "DSKKSQPKI", - "EAKTHEAQI", - "EYSKQM(Oxidation)QRF", - "FADPHSKRV", - "FPHSAHQKY", - "FPSRGKSSSY", - "GIAGPRGSP", - "GKVGAHAGEY", - "GKVGAHAGEYG", - "GLAKSIHHA", - "GMAKKVTKA", - "GNVAEGETKPD", - "GRVVEPKR", - "GVM(Oxidation)VGM(Oxidation)GQKD", - "HAAENPGKY", - "HAATYTKKV", - "HAFGGNKASY", - "HAGPTAHEL", - "HAHVDKVTY", - "HAIGKSQSF", - "HAKEKLTAL", - "HAM(Oxidation)EEVKKF", - "HAPELTKKV", - "HLKEDQTEY", - "HPAENGKSNF", - "HPESERISM(Oxidation)", - "HPNKVKVY", - "HPSQPQGTY", - "HPYQPDPKM(Oxidation)", - "HSRNEGVATY", - "HVKDANGNSF", - "HVSTHQHNY", - "IASQTVKKV", - "IKTVETRD", - "ILDKKVEKV", - "IPKKHISQI", - "IPQKFHRSV", - "IQRGPVRG", - "ISSEAHREV", - "IYTEHAHQV", - "KAAAFEKQV", - "KAAKPKVV", - "KAASHIKSI", - "KAATVTKEL", - "KAISGVHTV", - "KALDEKIAK", - "KALVKPKEV", - "KASEQAKVV", - "KASGTLREY", - "KAYGKAKSI", - "KAYSEAHEI", - "KGISSSSLK", - "KGTGASGSF", - "KHANQVLSL", - "KLAESVEKA", - "KLAPPPKKA", - "KLDNQVSKV", - "KLM(Oxidation)QQQQEV", - "KLQPGSVKKV", - "KLSPKAEEV", - "KM(Oxidation)DESKHEI", - "KM(Oxidation)LDHEYTT", - "KMDESKHEI", - "KMNESTRSV", - "KQIKEIKEV", - "KRGPHGLI", - "KSKEFVQKV", - "KTKEGVREV", - "KVIDTQQKV", - "KVSNSGITRV", - "KVVNPTQK", - "KYLGKTHNL", - "KYNRQSM(Oxidation)TL", - "KYQPKPKQI", - "KYTPPPHHI", - "LAKTGVHHY", - "LDKKVEKV", - "LLKSEKSSY", - "LPPKDGKVA", - "LPSENHKEM", - "LPSENHKEM(Oxidation)", - "M(Oxidation)LSEHTSKL", - "M(Oxidation)PPEHVRKI", - "M(Oxidation)PQGGGQHY", - "M(Oxidation)PQKERESI", - "M(Oxidation)PRNLREY", - "MPKAEKNAV", - "MPNKVRKI", - "MPPEHVRKI", - "MPQKERESI", - "NAAEGRSF", - "NAHGEPRNY", - "NALAHKYH", - "NAM(Oxidation)KIRDV", - "NASARDNTI", - "NATAVVRHM(Oxidation)", - "NATNAVKRL", - "NGTHVVRHY", - "NIQKITKS", - "NLAEKPKTV", - "NLKVKGPVR", - "NLRPKKKV", - "NLTEEEEKSKS", - "NNLSSLSKK", - "NPFGGASHAKG", - "NPHRAVEY", - "NPKESSSSL", - "NTKIGPRR", - "NVKIVKVKKE", - "NYTKEHNNL", - "PPNKKPKV", - "PVEKALRD", - "QAGPINREM(Oxidation)", - "QALKHLKQY", - "QGVM(Oxidation)VGM(Oxidation)GQK", - "QGVM(Oxidation)VGM(Oxidation)GQKD", - "QPAKADKESF", - "QPHKVTQY", - "QTHQPPAPNS", - "QVKPNSNQV", - "QYKKDGADF", - "RFYARYSL", - "RLAEAHAKV", - "RLGPTGKEV", - "RLHEKIQEA", - "RLNNKSAKV", - "RMARTPQTV", - "RPKKPGQSF", - "RPVPKGATY", - "RQVTGVTRV", - "RSNEHIREL", - "RSTENVNKL", - "RSTQYM(Oxidation)KEY", - "RVAGIHKKV", - "RYIDLHSNR", - "RYIDTHNRV", - "RYM(Oxidation)NHM(Oxidation)QSL", - "SAKLERSHY", - "SAQTTSHEL", - "SARAGETRF", - "SASHVSKTV", - "SATGHPRKV", - "SATNALRSM(Oxidation)", - "SAVDRQREY", - "SAYANAKKY", - "SEVAHRFK", - "SIVGRPRH", - "SKEYFSKQ", - "SLDKTSHSV", - "SLDTQPKKV", - "SM(Oxidation)LGSPHKV", - "SM(Oxidation)NTHLKAV", - "SPM(Oxidation)EKIKQY", - "SPNYHEEKY", - "SQRFPKAE", - "SSRSYTSGPG", - "SVDGTRTNV", - "SVQVFGRKK", - "SYVGDEAQSKR", - "SYVGDEAQSKRG", - "TALAPSTM(Oxidation)K", - "TAPQTQHV", - "TARPGPRAV", - "TDKSFVEK", - "TDRETGKL", - "TEKLVTSK", - "TEKLVTSKG", - "TGYYGKGKP", - "THQPPAPNS", - "THYDPPRK", - "TIEQEKRSEIS", - "TIGEGQQHHLG", - "TKKVPQVS", - "TLVQTKGT", - "TPPGVRKI", - "TSGPGSRISSSS", - "TSTPNAKTV", - "TTPISEQKG", - "TTTHITKTV", - "TVIGPDGHKE", - "TVKDSRTVY", - "TVQNEANKY", - "VAPPKAHEV", - "VASEGIKRY", - "VHLTPEEK", - "VITDKEKAE", - "VPKEGKVV", - "VQNGKHFKF", - "VSKGTLVQTKGT", - "VTTSTRTY", - "VYAQKHQQL", - "VYGKTSHL", - "YADEKTKDV", - "YARLHPRAV", - "YGSTVSKRV", - "YPAKAKGTF", - "YTKKLNTQ", - "YTM(Oxidation)KKVHAL" - ] - ], - [ - "HepG2_ClassII.tsv", - [ - "AAAAAAHRL", - "AAATVTKKV", - "AAHPNVQKV", - "AAM(Oxidation)SVAKRV", - "AANAQPHKL", - "AANDKLKKM", - "AAPPPPAHA", - "AAPRPPPKPM(Oxidation)", - "AAQAHTREL", - "AARAEAREI", - "AASPVGKRL", - "AASSLKKQY", - "AATDHSNQL", - "AATPAKKTV", - "AATVTKKTY", - "AKDVKFGAD", - "ALKDKIEKA", - "ALKDSVQRA", - "ALKKALAAA", - "ALSDLHAHK", - "AM(Oxidation)AARPHSI", - "AM(Oxidation)AASPHAV", - "AM(Oxidation)ASHLTST", - "AM(Oxidation)HGHVEVV", - "AM(Oxidation)NARPHKV", - "AMNARPHKV", - "APPKAHEV", - "APRADAKAY", - "APRPPPKPM(Oxidation)", - "AVM(Oxidation)GNPKVKA", - "DAAVHQRI", - "DAKKQIKQV", - "DAPAGRKV", - "DGKKKISTV", - "DHVITNM(Oxidation)N", - "DNKKTRII", - "DPM(Oxidation)KARVV", - "DPPKTHVT", - "DPPRDSKGL", - "EYSKQM(Oxidation)QRF", - "FADPHSKRV", - "GKVGAHAGEY", - "GKVGAHAGEYG", - "GLAKSIHHA", - "GMAKKVTKA", - "GNVAEGETKPD", - "GPNKKPRF", - "GPRVVERH", - "GRVVEPKR", - "GVM(Oxidation)VGM(Oxidation)GQKD", - "HAAENPGKY", - "HAANPNGRYY", - "HAASRIKTI", - "HAATYTKKV", - "HAGPTAHEL", - "HAKEKLTAL", - "HAM(Oxidation)EEVKKF", - "HAPELTKKV", - "HLKEDQTEY", - "HPAENGKSNF", - "HPESERISM(Oxidation)", - "HPGRPQPPA", - "HPNKVKVY", - "HPYQPDPKM(Oxidation)", - "HSRNEGVATY", - "HSSPASSNY", - "HVKDANGNSF", - "HVSTHQHNY", - "IAPKTTRV", - "IASQTVKKV", - "IKTVETRD", - "IPQKFHRSV", - "ISSEAHREV", - "IVGRPRHQ", - "KAAKPKVV", - "KAAQPKSL", - "KAASHIKSI", - "KAISGVHTV", - "KAKPGTYKV", - "KALVKPKEV", - "KASEQAKVV", - "KASGTLREY", - "KAYGKAKSI", - "KGTGASGSF", - "KLAESVEKA", - "KLAPPPKKA", - "KLQPGSVKKV", - "KM(Oxidation)DESKHEI", - "KM(Oxidation)LDHEYTT", - "KMDESKHEI", - "KMNESTRSV", - "KMQEHSDQV", - "KRSSPETL", - "KSKEFVQKV", - "KTKEGVREV", - "KTLGTDVVKS", - "KVHLGARAS", - "KVVNPTQK", - "KYKERGTVL", - "KYLGKTHNL", - "KYNRQSM(Oxidation)TL", - "KYQPKPKQI", - "KYTPPPHHI", - "LAKTGVHHY", - "LLKSEKSSY", - "LPSENHKEM", - "LPSENHKEM(Oxidation)", - "M(Oxidation)PPEHVRKI", - "M(Oxidation)PQGGGQHY", - "M(Oxidation)PQKERESI", - "MPNKVRKI", - "MPQKERESI", - "NAHGEPRNY", - "NALAHKYH", - "NAM(Oxidation)KIRDV", - "NASARDNTI", - "NATAVVRHM(Oxidation)", - "NGTHVVRHY", - "NIQKITKS", - "NLKVKGPVR", - "NLRPKKKVK", - "NLSSLSKK", - "NLTEEEEKSKS", - "NNLSSLSKK", - "NPAAYENDK", - "NPFGGASHAKG", - "NPKESSSSL", - "NPKREIQKI", - "NSHSTTSSF", - "NTKIGPRR", - "NVDYSKLKK", - "NVINGGSHA", - "NVKIVKVKKE", - "PPNKKPKV", - "QAGPINREM(Oxidation)", - "QALKHLKQY", - "QGVM(Oxidation)VGM(Oxidation)GQK", - "QPAKADKESF", - "QTHQPPAPNS", - "QYKKDGADF", - "RLAEAHAKV", - "RLHEKIQEA", - "RLNNKSAKV", - "RMARTPQTV", - "RPVPKGATY", - "RSNEHIREL", - "RSTENVNKL", - "RSTQYM(Oxidation)KEY", - "RVAGIHKKV", - "RYDDM(Oxidation)AAAM(Oxidation)", - "SAKLERSHY", - "SAM(Oxidation)SNPRAM", - "SAQTTSHEL", - "SARAGETRF", - "SASEAAKKY", - "SATGHPRKV", - "SATSNKHLL", - "SAYANAKKY", - "SEVAHRFK", - "SIVGRPRH", - "SLDKTSHSV", - "SLDTQPKKV", - "SM(Oxidation)LGSPHKV", - "SM(Oxidation)NTHLKAV", - "SM(Oxidation)PEQAHKV", - "SQRFPKAE", - "SSRSYTSGPG", - "SVKNDHSAY", - "SVQVFGRKK", - "SYVGDEAQSKR", - "SYVGDEAQSKRG", - "TAPQTQHV", - "TARPGPRAV", - "TDKSFVEK", - "TDRETGKL", - "TEDSPGLK", - "TEKLVTSK", - "TEKLVTSKG", - "THYDPPRK", - "TKELPSGKKY", - "TRLSRTPGNR", - "TSGPGSRISSSS", - "TSTPNAKTV", - "TTPISEQKG", - "TVKDSRTVY", - "VAPPKAHEV", - "VARAGQKGY", - "VHLTPEEK", - "VITDKEKAE", - "VPKEGKVV", - "VQKTIAEN", - "VSKGTLVQTKGT", - "VVRHQLLKT", - "VYAQKHQQL", - "VYGKTSHL", - "YADEKTKDV", - "YGSTVSKRV", - "YLNKHIQKV", - "YTKKLNTQ", - "YTM(Oxidation)KKVHAL", - "YVGDEAQSKR", - "YVGDEAQSKRG" - ] - ] + ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-06T15:57:59.299534051" + "timestamp": "2026-02-09T08:22:05.917839849" } } \ No newline at end of file diff --git a/workflows/mhcquant.nf b/workflows/mhcquant.nf index 465b65a9..d6809e3a 100644 --- a/workflows/mhcquant.nf +++ b/workflows/mhcquant.nf @@ -124,13 +124,14 @@ workflow MHCQUANT { // Run MS2Rescore ch_clean_mzml_file - .map { meta, mzml -> [ groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), meta.search_preset, mzml] } + .map { meta, mzml -> [ groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), meta, mzml] } .groupTuple() .join(OPENMS_IDMERGER.out.idxml) - .map { gkey, search_presets, mzml, idxml -> - // All replicates in a sample_condition group share the same search_preset - def sp = search_presets.find { it && !(it instanceof List && it.size() == 0) } - [gkey + (sp ? [search_preset: sp] : [:]), idxml, mzml, []] + .map { gkey, metas, mzmls, idxml -> + // All replicates in a group share the same search params + def meta = metas[0] + def searchMeta = meta.subMap(meta.keySet() - ['id', 'sample', 'condition', 'group_count', 'spectra']) + [[id: "${meta.sample}_${meta.condition}"] + searchMeta, idxml, mzmls, []] } .set { ch_rescore_in } From 87179c831a7a14d9d69605e2f272d96406c616f5 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Mon, 9 Feb 2026 08:55:25 +0000 Subject: [PATCH 062/104] Update docs/usage.md with CLI > samplesheet > preset > default priority --- docs/usage.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index ab539439..59a0a6cf 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -100,11 +100,12 @@ In the example above, `sample1` uses the `lumos_class1` preset but overrides `Pe Search parameters are resolved with the following precedence (highest to lowest): -1. **Samplesheet column** (e.g. `PeptideMinLength`) -- per-sample values specified directly in the samplesheet always win -2. **Search preset** (e.g. `SearchPreset: lumos_class1`) -- preset values fill in any parameters not specified in the samplesheet -3. **Command-line / global params** (e.g. `--peptide_min_length 8`) -- global defaults are used as a final fallback for any parameter not set by the above +1. **Command-line parameters** (e.g. `--fragment_mass_tolerance 0.05`) -- CLI overrides take highest priority and apply to all samples, regardless of samplesheet or preset values +2. **Samplesheet column** (e.g. `FragmentMassTolerance`) -- per-sample values specified directly in the samplesheet +3. **Search preset** (e.g. `SearchPreset: lumos_class1`) -- preset values fill in any parameters not specified in the samplesheet +4. **Config defaults** (`nextflow.config`) -- built-in defaults are used as a final fallback -This means you can set sensible defaults globally via the command line, use presets for instrument/class-specific groups, and override individual parameters per sample where needed. +This means a CLI flag like `--fragment_mass_tolerance 0.05` will override all presets and samplesheet values for that parameter. Without CLI overrides, samplesheet values take priority over presets, and presets over config defaults. > [!NOTE] > When using `--global_fdr`, samples sharing the same `SearchPreset` value are grouped together for global FDR estimation. Samples without a preset are grouped under a common `global` group. From bbf7eb132ac22e36776af54ac1ce6974eeba362f Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Mon, 9 Feb 2026 10:16:58 +0000 Subject: [PATCH 063/104] Fix lint: move search_param_defaults into resolveSearchParams and skip pipeline_if_empty_null --- .nf-core.yml | 1 + conf/search_presets.config | 16 ---------------- .../local/utils_nfcore_mhcquant_pipeline/main.nf | 8 +++++++- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 1a7fed6b..d34618a5 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,6 +2,7 @@ lint: files_unchanged: - .github/CONTRIBUTING.md - .vscode/settings.json + pipeline_if_empty_null: false nf_core_version: 3.5.1 repository_type: pipeline template: diff --git a/conf/search_presets.config b/conf/search_presets.config index e1af3dff..0468b717 100644 --- a/conf/search_presets.config +++ b/conf/search_presets.config @@ -9,22 +9,6 @@ */ params { - // Default values for search parameters (must match nextflow.config defaults) - // Used to detect CLI overrides: if params.X != defaults[X], user set it explicitly - search_param_defaults = [ - instrument: 'high_res', - activation_method: 'ALL', - digest_mass_range: '800:2500', - prec_charge: '2:3', - precursor_mass_tolerance: 5, - fragment_mass_tolerance: 0.01, - fragment_bin_offset: 0.0, - number_mods: 3, - ms2pip_model: 'Immuno-HCD', - peptide_min_length: 8, - peptide_max_length: 12 - ] - search_presets = [ // Lumos instrument presets 'lumos_class1': [ diff --git a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf index 51e6cbc6..e2c6ef0d 100644 --- a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf @@ -220,7 +220,13 @@ workflow PIPELINE_COMPLETION { // Resolve a search parameter with priority: CLI params > samplesheet (individual) > preset > config default // def resolveSearchParams(meta, searchPresets) { - def defaults = params.search_param_defaults ?: [:] + // Hardcoded defaults matching nextflow.config — used to detect CLI overrides + def defaults = [ + instrument: 'high_res', activation_method: 'ALL', digest_mass_range: '800:2500', + prec_charge: '2:3', precursor_mass_tolerance: 5, fragment_mass_tolerance: 0.01, + fragment_bin_offset: 0.0, number_mods: 3, ms2pip_model: 'Immuno-HCD', + peptide_min_length: 8, peptide_max_length: 12 + ] def presetName = meta.search_preset def presetConfig = (presetName && searchPresets) ? searchPresets[presetName] : [:] if (!presetConfig) { presetConfig = [:] } From 7a174c42013fcdd554e3674a772097ce1a5f81e8 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Tue, 10 Feb 2026 18:35:59 +0000 Subject: [PATCH 064/104] Fix CLI override detection and add fixed/variable mods as per-sample search params --- assets/schema_input.json | 10 + conf/modules.config | 4 +- conf/search_presets.config | 32 ++- docs/usage.md | 2 + nextflow.config | 2 +- .../utils_nfcore_mhcquant_pipeline/main.nf | 30 ++- tests/search_presets.nf.test.snap | 197 +++++++++++++++++- 7 files changed, 253 insertions(+), 24 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index 885b488e..25416d13 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -129,6 +129,16 @@ "minimum": 0, "errorMessage": "NumberMods must be a non-negative integer", "meta": ["number_mods"] + }, + "FixedMods": { + "type": "string", + "errorMessage": "FixedMods must be a comma-separated list of UNIMOD modification names", + "meta": ["fixed_mods"] + }, + "VariableMods": { + "type": "string", + "errorMessage": "VariableMods must be a comma-separated list of UNIMOD modification names", + "meta": ["variable_mods"] } }, "required": ["ID", "Sample", "Condition", "ReplicateFileName"] diff --git a/conf/modules.config b/conf/modules.config index 1d1a17c5..23db4a1a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -106,8 +106,8 @@ process { "-max_variable_mods_in_peptide ${meta.number_mods}", "-missed_cleavages 0", "-precursor_charge ${meta.prec_charge}", - "-fixed_modifications ${params.fixed_mods.tokenize(',').collect {"'${it}'"}.join(" ")}", - "-variable_modifications ${params.variable_mods.tokenize(',').collect {"'${it}'"}.join(" ")}", + meta.fixed_mods.trim() ? "-fixed_modifications '${meta.fixed_mods.trim()}'" : "", + meta.variable_mods.trim() ? "-variable_modifications '${meta.variable_mods.trim()}'" : "", "-enzyme '${params.enzyme}'", "-use_X_ions ${params.use_x_ions}", "-use_Z_ions ${params.use_z_ions}", diff --git a/conf/search_presets.config b/conf/search_presets.config index 0468b717..d56c2db8 100644 --- a/conf/search_presets.config +++ b/conf/search_presets.config @@ -22,7 +22,9 @@ params { ms2pip_model: 'Immuno-HCD', activation_method: 'HCD', instrument: 'high_res', - number_mods: 3 + number_mods: 3, + fixed_mods: ' ', + variable_mods: 'Oxidation (M)' ], 'lumos_class2': [ peptide_min_length: 8, @@ -35,7 +37,9 @@ params { ms2pip_model: 'Immuno-HCD', activation_method: 'HCD', instrument: 'high_res', - number_mods: 5 + number_mods: 5, + fixed_mods: ' ', + variable_mods: 'Oxidation (M)' ], // Q Exactive instrument presets 'qe_class1': [ @@ -49,7 +53,9 @@ params { ms2pip_model: 'Immuno-HCD', activation_method: 'HCD', instrument: 'high_res', - number_mods: 3 + number_mods: 3, + fixed_mods: ' ', + variable_mods: 'Oxidation (M)' ], 'qe_class2': [ peptide_min_length: 8, @@ -62,7 +68,9 @@ params { ms2pip_model: 'Immuno-HCD', activation_method: 'HCD', instrument: 'high_res', - number_mods: 5 + number_mods: 5, + fixed_mods: ' ', + variable_mods: 'Oxidation (M)' ], // timsTOF instrument presets 'timstof_class1': [ @@ -76,7 +84,9 @@ params { ms2pip_model: 'timsTOF', activation_method: 'CID', instrument: 'high_res', - number_mods: 3 + number_mods: 3, + fixed_mods: ' ', + variable_mods: 'Oxidation (M)' ], 'timstof_class2': [ peptide_min_length: 8, @@ -89,7 +99,9 @@ params { ms2pip_model: 'timsTOF', activation_method: 'CID', instrument: 'high_res', - number_mods: 5 + number_mods: 5, + fixed_mods: ' ', + variable_mods: 'Oxidation (M)' ], // Cross-linking / low-resolution presets 'xl_class1': [ @@ -103,7 +115,9 @@ params { ms2pip_model: 'CIDch2', activation_method: 'CID', instrument: 'low_res', - number_mods: 3 + number_mods: 3, + fixed_mods: ' ', + variable_mods: 'Oxidation (M)' ], 'xl_class2': [ peptide_min_length: 8, @@ -116,7 +130,9 @@ params { ms2pip_model: 'CIDch2', activation_method: 'CID', instrument: 'low_res', - number_mods: 5 + number_mods: 5, + fixed_mods: ' ', + variable_mods: 'Oxidation (M)' ] ] } diff --git a/docs/usage.md b/docs/usage.md index 59a0a6cf..acc22260 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -33,6 +33,8 @@ You will need to create a samplesheet with information about the samples you wou | `ActivationMethod` | No | Fragmentation method (`HCD`, `CID`, `ETD`, etc.) | | `Instrument` | No | Instrument resolution type (`high_res` or `low_res`) | | `NumberMods` | No | Maximum number of variable modifications per peptide | +| `FixedMods` | No | Comma-separated fixed modifications in UNIMOD nomenclature (e.g. `Carbamidomethyl (C)`) | +| `VariableMods` | No | Comma-separated variable modifications in UNIMOD nomenclature (e.g. `Oxidation (M)`) | > [!NOTE] > The `Fasta` column is optional, but you can use it to provide sample-specific FASTA files. If you want to use the same FASTA file for all samples, provide it via the `--fasta` parameter. Please ensure you use one of these options. diff --git a/nextflow.config b/nextflow.config index 79014f4d..ebd2f0c5 100644 --- a/nextflow.config +++ b/nextflow.config @@ -34,7 +34,7 @@ params { fragment_bin_offset = 0.0 fragment_mass_tolerance = 0.01 number_mods = 3 - fixed_mods = '' + fixed_mods = ' ' variable_mods = 'Oxidation (M)' num_hits = 1 use_x_ions = false diff --git a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf index e2c6ef0d..0856818f 100644 --- a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf @@ -220,26 +220,34 @@ workflow PIPELINE_COMPLETION { // Resolve a search parameter with priority: CLI params > samplesheet (individual) > preset > config default // def resolveSearchParams(meta, searchPresets) { - // Hardcoded defaults matching nextflow.config — used to detect CLI overrides + // Hardcoded nextflow.config defaults — must be kept in sync manually. + // Cannot use params.X references because Nextflow merges CLI overrides + // into params before config evaluation, making CLI detection impossible. def defaults = [ - instrument: 'high_res', activation_method: 'ALL', digest_mass_range: '800:2500', - prec_charge: '2:3', precursor_mass_tolerance: 5, fragment_mass_tolerance: 0.01, - fragment_bin_offset: 0.0, number_mods: 3, ms2pip_model: 'Immuno-HCD', - peptide_min_length: 8, peptide_max_length: 12 + instrument: 'high_res', + activation_method: 'ALL', + digest_mass_range: '800:2500', + prec_charge: '2:3', + precursor_mass_tolerance: 5, + fragment_mass_tolerance: 0.01, + fragment_bin_offset: 0.0, + number_mods: 3, + ms2pip_model: 'Immuno-HCD', + peptide_min_length: 8, + peptide_max_length: 12, + fixed_mods: ' ', + variable_mods: 'Oxidation (M)' ] + def presetName = meta.search_preset def presetConfig = (presetName && searchPresets) ? searchPresets[presetName] : [:] if (!presetConfig) { presetConfig = [:] } def result = new LinkedHashMap(meta) - def searchParamKeys = ['peptide_min_length', 'peptide_max_length', 'digest_mass_range', 'prec_charge', - 'precursor_mass_tolerance', 'fragment_mass_tolerance', 'fragment_bin_offset', - 'ms2pip_model', 'activation_method', 'instrument', 'number_mods'] - - searchParamKeys.each { key -> + defaults.keySet().each { key -> // Detect CLI override: params.X differs from the hardcoded default - def cliOverride = defaults.containsKey(key) && params[key] != defaults[key] + def cliOverride = params[key] != defaults[key] if (cliOverride) { // CLI has highest priority result.put(key, params[key]) diff --git a/tests/search_presets.nf.test.snap b/tests/search_presets.nf.test.snap index ab2b5c29..b9dcb84d 100644 --- a/tests/search_presets.nf.test.snap +++ b/tests/search_presets.nf.test.snap @@ -71,8 +71,13 @@ "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_histogram_mz.txt", + "multiqc/multiqc_data/multiqc_histogram_rt.txt", + "multiqc/multiqc_data/multiqc_histogram_scores.txt", + "multiqc/multiqc_data/multiqc_length_dist.txt", "multiqc/multiqc_data/multiqc_mass_error.txt", "multiqc/multiqc_data/multiqc_percolator_barplot.txt", + "multiqc/multiqc_data/multiqc_scores_xcorr.txt", "multiqc/multiqc_data/multiqc_software_versions.txt", "multiqc/multiqc_data/multiqc_sources.txt", "multiqc/multiqc_data/percolator_plot.txt", @@ -81,23 +86,38 @@ "multiqc/multiqc_plots/pdf/chromatogram-cnt.pdf", "multiqc/multiqc_plots/pdf/chromatogram-log.pdf", "multiqc/multiqc_plots/pdf/general_stats.pdf", + "multiqc/multiqc_plots/pdf/histogram_mz.pdf", + "multiqc/multiqc_plots/pdf/histogram_rt.pdf", + "multiqc/multiqc_plots/pdf/histogram_scores.pdf", + "multiqc/multiqc_plots/pdf/length_dist.pdf", "multiqc/multiqc_plots/pdf/mass_error.pdf", "multiqc/multiqc_plots/pdf/percolator_plot-cnt.pdf", "multiqc/multiqc_plots/pdf/percolator_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/scores_xcorr.pdf", "multiqc/multiqc_plots/png", "multiqc/multiqc_plots/png/chromatogram-cnt.png", "multiqc/multiqc_plots/png/chromatogram-log.png", "multiqc/multiqc_plots/png/general_stats.png", + "multiqc/multiqc_plots/png/histogram_mz.png", + "multiqc/multiqc_plots/png/histogram_rt.png", + "multiqc/multiqc_plots/png/histogram_scores.png", + "multiqc/multiqc_plots/png/length_dist.png", "multiqc/multiqc_plots/png/mass_error.png", "multiqc/multiqc_plots/png/percolator_plot-cnt.png", "multiqc/multiqc_plots/png/percolator_plot-pct.png", + "multiqc/multiqc_plots/png/scores_xcorr.png", "multiqc/multiqc_plots/svg", "multiqc/multiqc_plots/svg/chromatogram-cnt.svg", "multiqc/multiqc_plots/svg/chromatogram-log.svg", "multiqc/multiqc_plots/svg/general_stats.svg", + "multiqc/multiqc_plots/svg/histogram_mz.svg", + "multiqc/multiqc_plots/svg/histogram_rt.svg", + "multiqc/multiqc_plots/svg/histogram_scores.svg", + "multiqc/multiqc_plots/svg/length_dist.svg", "multiqc/multiqc_plots/svg/mass_error.svg", "multiqc/multiqc_plots/svg/percolator_plot-cnt.svg", "multiqc/multiqc_plots/svg/percolator_plot-pct.svg", + "multiqc/multiqc_plots/svg/scores_xcorr.svg", "multiqc/multiqc_report.html", "pipeline_info", "pipeline_info/nf_core_mhcquant_software_mqc_versions.yml" @@ -106,13 +126,186 @@ ], [ - + [ + "HepG2_ClassII.tsv", + [ + "AAAAAAHRL", + "AAATVTKKV", + "AAM(Oxidation)SVAKRV", + "AANAQPHKL", + "AANDKLKKM", + "AAPPPPAHA", + "AAPRPPPKPM(Oxidation)", + "AAQAHTREL", + "AARAEAREI", + "AASSLKKQY", + "AATPAKKTV", + "AKDVKFGAD", + "ALKDKIEKA", + "ALKDSVQRA", + "ALKKALAAA", + "ALSDLHAHK", + "AM(Oxidation)AASPHAV", + "AM(Oxidation)ASHLTST", + "AM(Oxidation)HGHVEVV", + "AM(Oxidation)NARPHKV", + "AMNARPHKV", + "APPKAHEV", + "APRADAKAY", + "AVM(Oxidation)GNPKVKA", + "AVM(Oxidation)GNPKVKAH", + "DAKKQIKQV", + "DAPAGRKV", + "DGKKKISTV", + "DHVITNM(Oxidation)N", + "DPM(Oxidation)KARVV", + "DPPRDSKGL", + "EYSKQM(Oxidation)QRF", + "FADPHSKRV", + "GKVGAHAGEY", + "GKVGAHAGEYG", + "GLAKSIHHA", + "GMAKKVTKA", + "GNVAEGETKPD", + "GPNKKPRF", + "GPRVVERH", + "GRVVEPKR", + "GVM(Oxidation)VGM(Oxidation)GQKD", + "HAAENPGKY", + "HAANPNGRYY", + "HAASRIKTI", + "HAATYTKKV", + "HAGPTAHEL", + "HAKEKLTAL", + "HAM(Oxidation)EEVKKF", + "HAPELTKKV", + "HPESERISM(Oxidation)", + "HPGRPQPPA", + "HPNKVKVY", + "HPYQPDPKM(Oxidation)", + "HSRNEGVATY", + "HSSPASSNY", + "HVKDANGNSF", + "HVSTHQHNY", + "IASQTVKKV", + "IKTVETRD", + "ISSEAHREV", + "IVGRPRHQ", + "KAAKPKVV", + "KAASHIKSI", + "KAISGVHTV", + "KAKPGTYKV", + "KAPPKPARA", + "KASEQAKVV", + "KASGTLREY", + "KAYGKAKSI", + "KGTGASGSF", + "KLAPPPKKA", + "KLQPGSVKKV", + "KM(Oxidation)LDHEYTT", + "KMDESKHEI", + "KMNESTRSV", + "KSKEFVQKV", + "KTKEGVREV", + "KVSLGHAAR", + "KVVNPTQK", + "KYLGKTHNL", + "KYNRQSM(Oxidation)TL", + "KYQPKPKQI", + "KYTPPPHHI", + "LAKTGVHHY", + "LLKSEKSSY", + "LPSENHKEM", + "LPSENHKEM(Oxidation)", + "M(Oxidation)PNKVRKI", + "M(Oxidation)PPEHVRKI", + "M(Oxidation)PQGGGQHY", + "M(Oxidation)PQKERESI", + "MPNKVRKI", + "NAHGEPRNY", + "NALAHKYH", + "NAM(Oxidation)KIRDV", + "NATAVVRHM(Oxidation)", + "NGTHVVRHY", + "NIQKITKS", + "NLSSLSKK", + "NLTEEEEKSKS", + "NNLSSLSKK", + "NPAAYENDK", + "NPFGGASHAKG", + "NPKREIQKI", + "NQNPGSPRPGSTG", + "NSHSTTSSF", + "NTKGGDAPAAGEDA", + "NTKIGPRR", + "NVINGGSHA", + "PPNKKPKV", + "QAGPINREM(Oxidation)", + "QAMDRAHRI", + "QPAKADKESF", + "QPHKVTQY", + "QTHQPPAPNS", + "QYKKDGADF", + "RLAEAHAKV", + "RLHEKIQEA", + "RMARTPQTV", + "RPKKPGQSF", + "RPVPKGATY", + "RSTQYM(Oxidation)KEY", + "RVAGIHKKV", + "SAKLERSHY", + "SAMSNPRAM(Oxidation)", + "SAQTTSHEL", + "SARAGETRF", + "SASEAAKKY", + "SATGHPRKV", + "SAVDRQREY", + "SEVAHRFK", + "SIVGRPRH", + "SKEYFSKQ", + "SLDTQPKKV", + "SM(Oxidation)LGSPHKV", + "SM(Oxidation)NTHLKAV", + "SM(Oxidation)PEQAHKV", + "SPNKHNRLY", + "SQRFPKAE", + "SVQVFGRKK", + "SYVGDEAQSKR", + "SYVGDEAQSKRG", + "TAPQTQHV", + "TARPGPRAV", + "TDKSFVEK", + "TDRETGKL", + "TEKLVTSK", + "TGSETESPRNPSSA", + "THQPPAPNS", + "THYDPPRK", + "TKELPSGKKY", + "TKGGDAPAAGEDA", + "TSGPGSRISSSS", + "TSTPNAKTV", + "TTPISEQKG", + "TVKDSRTVY", + "VHLTPEEK", + "VITDKEKAE", + "VPKEGKVV", + "VQKTIAEN", + "VVRHQLLKT", + "VYAQKHQQL", + "VYGKTSHL", + "YADEKTKDV", + "YGSTVSKRV", + "YTKKLNTQ", + "YTM(Oxidation)KKVHAL", + "YVGDEAQSKRG" + ] + ] ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-09T08:22:05.917839849" + "timestamp": "2026-02-10T07:44:37.300100152" } } \ No newline at end of file From 793e24e97e998fd896e81494c3c917148aeca22a Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Tue, 10 Feb 2026 18:40:10 +0000 Subject: [PATCH 065/104] Use workflow.commandLine for CLI override detection instead of hardcoded defaults --- .../utils_nfcore_mhcquant_pipeline/main.nf | 28 ++++--------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf index 0856818f..3f25dc4b 100644 --- a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf @@ -220,34 +220,18 @@ workflow PIPELINE_COMPLETION { // Resolve a search parameter with priority: CLI params > samplesheet (individual) > preset > config default // def resolveSearchParams(meta, searchPresets) { - // Hardcoded nextflow.config defaults — must be kept in sync manually. - // Cannot use params.X references because Nextflow merges CLI overrides - // into params before config evaluation, making CLI detection impossible. - def defaults = [ - instrument: 'high_res', - activation_method: 'ALL', - digest_mass_range: '800:2500', - prec_charge: '2:3', - precursor_mass_tolerance: 5, - fragment_mass_tolerance: 0.01, - fragment_bin_offset: 0.0, - number_mods: 3, - ms2pip_model: 'Immuno-HCD', - peptide_min_length: 8, - peptide_max_length: 12, - fixed_mods: ' ', - variable_mods: 'Oxidation (M)' - ] - + def searchParamKeys = ['instrument', 'activation_method', 'digest_mass_range', 'prec_charge', + 'precursor_mass_tolerance', 'fragment_mass_tolerance', 'fragment_bin_offset', + 'number_mods', 'ms2pip_model', 'peptide_min_length', 'peptide_max_length', + 'fixed_mods', 'variable_mods'] def presetName = meta.search_preset def presetConfig = (presetName && searchPresets) ? searchPresets[presetName] : [:] if (!presetConfig) { presetConfig = [:] } def result = new LinkedHashMap(meta) - defaults.keySet().each { key -> - // Detect CLI override: params.X differs from the hardcoded default - def cliOverride = params[key] != defaults[key] + searchParamKeys.each { key -> + def cliOverride = (workflow.commandLine =~ /--${key}[\s=]/).find() if (cliOverride) { // CLI has highest priority result.put(key, params[key]) From 9f8ac9553c2db2d468b6def96ac96ccc120eb7ae Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Tue, 10 Feb 2026 20:58:41 +0000 Subject: [PATCH 066/104] Update snapshots and fix invalid input parameter warning for search_presets --- nextflow.config | 2 +- tests/default.nf.test.snap | 40 ++------ tests/ionannotator.nf.test.snap | 25 +++-- tests/search_presets.nf.test.snap | 139 ++++++++++++++------------- tests/speclib.nf.test.snap | 40 ++------ tests/test_single_quant.nf.test.snap | 40 ++------ 6 files changed, 119 insertions(+), 167 deletions(-) diff --git a/nextflow.config b/nextflow.config index ebd2f0c5..a7b4e404 100644 --- a/nextflow.config +++ b/nextflow.config @@ -370,7 +370,7 @@ plugins { } validation { - defaultIgnoreParams = ["genomes"] + defaultIgnoreParams = ["genomes", "search_presets"] monochromeLogs = params.monochrome_logs } diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 7240ec39..cfb7e22c 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -127,7 +127,6 @@ "AAAAAAHRL", "AAATVTKKV", "AAHPNVQKV", - "AAKDPSPSV", "AAM(Oxidation)SVAKRV", "AANAQPHKL", "AANDKLKKM", @@ -146,7 +145,6 @@ "AATVTKKTY", "AKDVKFGAD", "ALKDKIEKA", - "ALKDSVQRA", "ALKENGGARLA", "ALSDLHAHK", "AM(Oxidation)AARPHSI", @@ -160,27 +158,23 @@ "AVM(Oxidation)GNPKVKA", "AVVVKKIETRDG", "DAAVHQRI", - "DAKKQIKQV", "DAPAGRKV", "DGKKKISTV", "DHVITNM(Oxidation)N", "DPM(Oxidation)KARVV", "DPPKTHVT", "DPPRDSKGL", - "DSKKSQPKI", "EAKTHEAQI", - "EDRDDNKVY", "EYSKQM(Oxidation)QRF", "FADPHSKRV", "FPHSAHQKY", "FPSRGKSSSY", - "GKVGAHAGEY", "GKVGAHAGEYG", "GLAKSIHHA", "GMAKKVTKA", "GNVAEGETKPD", "GPNKKPRF", - "GRPM(Oxidation)PPSRR", + "GPRVVERH", "GRVVEPKR", "GVM(Oxidation)VGM(Oxidation)GQKD", "HAAENPGKY", @@ -221,24 +215,21 @@ "KASGTLREY", "KAYGKAKSI", "KAYSEAHEI", - "KHANQVLSL", "KLAESVEKA", "KLAPPPKKA", "KLDNQVSKV", "KLM(Oxidation)QQQQEV", - "KLQPGSVKKV", "KLSPKAEEV", "KM(Oxidation)DESKHEI", "KM(Oxidation)LDHEYTT", "KMDESKHEI", "KMQEHSDQV", + "KRSSPETL", "KSKEFVQKV", "KTKEGVREV", - "KVAQPKEV", "KVIDTQQKV", "KVSNSGITRV", "KVVNPTQK", - "KYLGKTHNL", "KYNRQSM(Oxidation)TL", "KYQPKPKQI", "KYTPPPHHI", @@ -268,20 +259,18 @@ "NLAEKPKTV", "NLKVKGPVR", "NLRPKKKV", - "NLRPKKKVK", + "NLSSLSKK", "NLTEEEEKSKS", "NNLSSLSKK", "NPAAYENDK", "NPFGGASHAKG", "NPKESSSSL", + "NSHSTTSSF", "NTKIGPRR", "NVDYSKLKK", "NVINGGSHA", "NVKIVKVKKE", - "NYTKEHNNL", "PKSKELVSSSS", - "PPNKKPKV", - "PVEKALRD", "QAGPINREM(Oxidation)", "QALKHLKQY", "QGVM(Oxidation)VGM(Oxidation)GQK", @@ -289,21 +278,16 @@ "QPAKADKESF", "QPHKVTQY", "QTHQPPAPNS", - "QVKPNSNQV", "QYKKDGADF", - "RADKKAPR", "RLAEAHAKV", + "RLGPTGKEV", "RLHEKIQEA", - "RLNNKSAKV", "RPKKPGQSF", "RPVPKGATY", - "RQVTGVTRV", "RSNEHIREL", "RSTENVNKL", "RSTQYM(Oxidation)KEY", "RVAGIHKKV", - "RYDDM(Oxidation)AAAM(Oxidation)", - "RYIDLHSNR", "RYIDTHNRV", "RYM(Oxidation)NHM(Oxidation)QSL", "SAKLERSHY", @@ -318,7 +302,6 @@ "SAVDRQREY", "SAYANAKKY", "SEVAHRFK", - "SIVGRPRH", "SKEYFSKQ", "SLDKTSHSV", "SLDTQPKKV", @@ -332,24 +315,19 @@ "SYVGDEAQSKR", "SYVGDEAQSKRG", "TALAPSTM(Oxidation)K", - "TAPQTQHV", "TARPGPRAV", "TDKSFVEK", - "TDRETGKL", "TEKLVTSK", "TEKLVTSKG", "TGYYGKGKP", "THQPPAPNS", "THYDPPRK", + "TIEQEKRSEIS", "TIGEGQQHHLG", - "TISRPKGVA", - "TKELPSGKKY", - "TLVQTKGT", - "TNNLRPKKKVK", + "TKKVPQVS", "TPPGVRKI", "TRLSRTPGNR", "TSGPGSRISSSS", - "TSTPNAKTV", "TTPISEQKG", "TTTHITKTV", "TVIGPDGHKE", @@ -382,8 +360,8 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.04.8" + "nextflow": "25.10.3" }, - "timestamp": "2026-01-24T12:07:30.425542349" + "timestamp": "2026-02-10T20:47:00.120507494" } } \ No newline at end of file diff --git a/tests/ionannotator.nf.test.snap b/tests/ionannotator.nf.test.snap index e20dbd6d..b7099755 100644 --- a/tests/ionannotator.nf.test.snap +++ b/tests/ionannotator.nf.test.snap @@ -128,6 +128,7 @@ "AAAAAAHRL", "AAATVTKKV", "AAHPNVQKV", + "AAKDPSPSV", "AAM(Oxidation)SVAKRV", "AANAQPHKL", "AANDKLKKM", @@ -157,6 +158,7 @@ "AM(Oxidation)NARPHKV", "AMNARPHKV", "APAPRRLP", + "APRADAKAY", "APRPPPKPM(Oxidation)", "ATWSDPHKA", "AVM(Oxidation)GNPKVKA", @@ -166,6 +168,7 @@ "DAKKQIKQV", "DAPAGRKV", "DGKKKISTV", + "DGKTNPKI", "DHVITNM(Oxidation)N", "DPM(Oxidation)KARVV", "DPPKTHVT", @@ -176,6 +179,7 @@ "FADPHSKRV", "FPHSAHQKY", "FPSRGKSSSY", + "GIAGPRGSP", "GKVGAHAGEY", "GKVGAHAGEYG", "GLAKSIHHA", @@ -200,12 +204,14 @@ "HPAENGKSNF", "HPESERISM(Oxidation)", "HPNKVKVY", + "HPSGRDPDT", "HPSQPQGTY", "HPYQPDPKM(Oxidation)", "HSRNEGVATY", "HSSPASSNY", "HVKDANGNSF", "HVSTHQHNY", + "HVTAYENT", "IASQTVKKV", "IKTVETRD", "ILDKKVEKV", @@ -213,7 +219,6 @@ "IPQKFHRSV", "ISSEAHREV", "IVGRPRHQ", - "IYTEHAHQV", "KAAAFEKQV", "KAAKPKVV", "KAAQPKSL", @@ -240,7 +245,9 @@ "KMQEHSDQV", "KSKEFVQKV", "KTKEGVREV", + "KTLGTDVVKS", "KVAQPKEV", + "KVHLGARAS", "KVIDTQQKV", "KVSNSGITRV", "KVVNPTQK", @@ -263,11 +270,14 @@ "MPNKVRKI", "MPPEHVRKI", "MPQKERESI", + "NAAEGRSF", "NAHGEPRNY", "NALAHKYH", "NAM(Oxidation)KIRDV", + "NASARDNTI", "NATAVVRHM(Oxidation)", "NATNAVKRL", + "NATVGRRY", "NGTHVVRHY", "NIQKITKS", "NLAEKPKTV", @@ -279,8 +289,8 @@ "NNLSSLSKK", "NPAAYENDK", "NPFGGASHAKG", + "NPHRAVEY", "NPKESSSSL", - "NSHSTTSSF", "NTKIGPRR", "NVDYSKLKK", "NVINGGSHA", @@ -290,12 +300,15 @@ "PVEKALRD", "QAGPINREM(Oxidation)", "QALKHLKQY", + "QAMDRAHRI", "QGVM(Oxidation)VGM(Oxidation)GQK", "QGVM(Oxidation)VGM(Oxidation)GQKD", "QPAKADKESF", "QPHKVTQY", "QTHQPPAPNS", + "QVKPNSNQV", "QYKKDGADF", + "RAASTIKEV", "RAQEKVHEM", "RFYARYSL", "RLAEAHAKV", @@ -349,15 +362,15 @@ "TAPQTQHV", "TARPGPRAV", "TDKSFVEK", + "TDRETGKL", "TDRETGKLKG", "TEKLVTSK", "TEKLVTSKG", "TGYYGKGKP", "THQPPAPNS", "THYDPPRK", + "TIEQEKRSEIS", "TIGEGQQHHLG", - "TISRPKGVA", - "TKELPSGKKY", "TKKVPQVS", "TLSGHSQEV", "TLVQTKGT", @@ -390,7 +403,7 @@ "YPAKAKGTF", "YTKKLNTQ", "YTM(Oxidation)KKVHAL", - "YVGDEAQSKR" + "YVVGLRNTLT" ] ] ] @@ -399,6 +412,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-06T17:06:07.615459843" + "timestamp": "2026-02-10T20:57:09.455601114" } } \ No newline at end of file diff --git a/tests/search_presets.nf.test.snap b/tests/search_presets.nf.test.snap index b9dcb84d..53d3f1eb 100644 --- a/tests/search_presets.nf.test.snap +++ b/tests/search_presets.nf.test.snap @@ -127,177 +127,182 @@ ], [ [ - "HepG2_ClassII.tsv", + "HepG2_ClassI.tsv", [ - "AAAAAAHRL", - "AAATVTKKV", + "AAKDPSPSV", "AAM(Oxidation)SVAKRV", - "AANAQPHKL", "AANDKLKKM", + "AANPDPKKL", "AAPPPPAHA", "AAPRPPPKPM(Oxidation)", "AAQAHTREL", - "AARAEAREI", + "AAQSEAKVV", + "AASPVGKRL", "AASSLKKQY", "AATPAKKTV", - "AKDVKFGAD", + "AATRWAKKI", + "AATSNLKKL", "ALKDKIEKA", "ALKDSVQRA", - "ALKKALAAA", - "ALSDLHAHK", + "ALKENGGARLA", + "AM(Oxidation)AARPHSI", "AM(Oxidation)AASPHAV", "AM(Oxidation)ASHLTST", "AM(Oxidation)HGHVEVV", "AM(Oxidation)NARPHKV", "AMNARPHKV", - "APPKAHEV", - "APRADAKAY", + "APRPPPKPM(Oxidation)", + "ATWSDPHKA", "AVM(Oxidation)GNPKVKA", - "AVM(Oxidation)GNPKVKAH", - "DAKKQIKQV", + "DAAVHQRI", "DAPAGRKV", - "DGKKKISTV", - "DHVITNM(Oxidation)N", "DPM(Oxidation)KARVV", + "DPPKTHVT", "DPPRDSKGL", + "EAKTHEAQI", "EYSKQM(Oxidation)QRF", "FADPHSKRV", + "FPHSAHQKY", "GKVGAHAGEY", "GKVGAHAGEYG", "GLAKSIHHA", "GMAKKVTKA", "GNVAEGETKPD", - "GPNKKPRF", "GPRVVERH", - "GRVVEPKR", "GVM(Oxidation)VGM(Oxidation)GQKD", "HAAENPGKY", - "HAANPNGRYY", - "HAASRIKTI", "HAATYTKKV", + "HAFGGNKASY", "HAGPTAHEL", + "HAIGKSQSF", "HAKEKLTAL", "HAM(Oxidation)EEVKKF", "HAPELTKKV", + "HLKEDQTEY", + "HPAENGKSNF", "HPESERISM(Oxidation)", - "HPGRPQPPA", "HPNKVKVY", + "HPSQPQGTY", "HPYQPDPKM(Oxidation)", "HSRNEGVATY", - "HSSPASSNY", "HVKDANGNSF", "HVSTHQHNY", "IASQTVKKV", - "IKTVETRD", + "ILDKKVEKV", + "IPQKFHRSV", "ISSEAHREV", - "IVGRPRHQ", + "KAAAFEKQV", "KAAKPKVV", - "KAASHIKSI", + "KAAQPKSL", + "KAATVTKEL", "KAISGVHTV", "KAKPGTYKV", - "KAPPKPARA", - "KASEQAKVV", + "KALVKPKEV", "KASGTLREY", "KAYGKAKSI", - "KGTGASGSF", + "KAYSEAHEI", + "KLAESVEKA", "KLAPPPKKA", - "KLQPGSVKKV", + "KLDNQVSKV", + "KLM(Oxidation)QQQQEV", + "KLSPKAEEV", + "KM(Oxidation)DESKHEI", "KM(Oxidation)LDHEYTT", - "KMDESKHEI", "KMNESTRSV", + "KQIKEIKEV", "KSKEFVQKV", - "KTKEGVREV", - "KVSLGHAAR", + "KVAQPKEV", + "KVIDTQQKV", + "KVKDRTLKHH", + "KVSNSGITRV", "KVVNPTQK", - "KYLGKTHNL", "KYNRQSM(Oxidation)TL", "KYQPKPKQI", "KYTPPPHHI", - "LAKTGVHHY", + "LDKKVEKV", "LLKSEKSSY", - "LPSENHKEM", "LPSENHKEM(Oxidation)", - "M(Oxidation)PNKVRKI", + "M(Oxidation)LSEHTSKL", "M(Oxidation)PPEHVRKI", "M(Oxidation)PQGGGQHY", "M(Oxidation)PQKERESI", "MPNKVRKI", + "MPPEHVRKI", + "MPQKERESI", "NAHGEPRNY", "NALAHKYH", "NAM(Oxidation)KIRDV", "NATAVVRHM(Oxidation)", + "NATNAVKRL", "NGTHVVRHY", - "NIQKITKS", - "NLSSLSKK", - "NLTEEEEKSKS", + "NLAEKPKTV", "NNLSSLSKK", - "NPAAYENDK", "NPFGGASHAKG", - "NPKREIQKI", - "NQNPGSPRPGSTG", + "NPKESSSSL", "NSHSTTSSF", - "NTKGGDAPAAGEDA", "NTKIGPRR", - "NVINGGSHA", - "PPNKKPKV", + "PVEKALRD", "QAGPINREM(Oxidation)", - "QAMDRAHRI", + "QALKHLKQY", + "QGVM(Oxidation)VGM(Oxidation)GQKD", "QPAKADKESF", "QPHKVTQY", "QTHQPPAPNS", "QYKKDGADF", - "RLAEAHAKV", - "RLHEKIQEA", - "RMARTPQTV", - "RPKKPGQSF", + "RLGPTGKEV", "RPVPKGATY", + "RSTENVNKL", "RSTQYM(Oxidation)KEY", "RVAGIHKKV", + "RYIDTHNRV", "SAKLERSHY", - "SAMSNPRAM(Oxidation)", "SAQTTSHEL", "SARAGETRF", - "SASEAAKKY", - "SATGHPRKV", + "SASHVSKTV", + "SATNALRSM(Oxidation)", "SAVDRQREY", - "SEVAHRFK", - "SIVGRPRH", + "SAYANAKKY", "SKEYFSKQ", + "SLDKTSHSV", "SLDTQPKKV", "SM(Oxidation)LGSPHKV", "SM(Oxidation)NTHLKAV", - "SM(Oxidation)PEQAHKV", - "SPNKHNRLY", + "SPM(Oxidation)EKIKQY", + "SPNYHEEKY", "SQRFPKAE", "SVQVFGRKK", "SYVGDEAQSKR", "SYVGDEAQSKRG", - "TAPQTQHV", - "TARPGPRAV", + "TALAPSTM(Oxidation)K", "TDKSFVEK", - "TDRETGKL", "TEKLVTSK", + "TEKLVTSKG", "TGSETESPRNPSSA", + "TGYYGKGKP", "THQPPAPNS", - "THYDPPRK", - "TKELPSGKKY", "TKGGDAPAAGEDA", + "TKKVPQVS", + "TPPGVRKI", "TSGPGSRISSSS", - "TSTPNAKTV", - "TTPISEQKG", + "TTNLTEEEEKSKS", + "TTTHITKTV", + "TVIGPDGHKE", "TVKDSRTVY", + "TVQNEANKY", + "VASEGIKRY", "VHLTPEEK", "VITDKEKAE", "VPKEGKVV", - "VQKTIAEN", - "VVRHQLLKT", + "VQNGKHFKF", + "VSKGTLVQTKGT", "VYAQKHQQL", "VYGKTSHL", "YADEKTKDV", + "YARLHPRAV", "YGSTVSKRV", + "YPAKAKGTF", "YTKKLNTQ", - "YTM(Oxidation)KKVHAL", - "YVGDEAQSKRG" + "YTM(Oxidation)KKVHAL" ] ] ] @@ -306,6 +311,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-10T07:44:37.300100152" + "timestamp": "2026-02-10T20:55:12.621303718" } } \ No newline at end of file diff --git a/tests/speclib.nf.test.snap b/tests/speclib.nf.test.snap index f988a64d..81e68530 100644 --- a/tests/speclib.nf.test.snap +++ b/tests/speclib.nf.test.snap @@ -139,7 +139,6 @@ "AAAAAAHRL", "AAATVTKKV", "AAHPNVQKV", - "AAKDPSPSV", "AAM(Oxidation)SVAKRV", "AANAQPHKL", "AANDKLKKM", @@ -158,7 +157,6 @@ "AATVTKKTY", "AKDVKFGAD", "ALKDKIEKA", - "ALKDSVQRA", "ALKENGGARLA", "ALSDLHAHK", "AM(Oxidation)AARPHSI", @@ -172,27 +170,23 @@ "AVM(Oxidation)GNPKVKA", "AVVVKKIETRDG", "DAAVHQRI", - "DAKKQIKQV", "DAPAGRKV", "DGKKKISTV", "DHVITNM(Oxidation)N", "DPM(Oxidation)KARVV", "DPPKTHVT", "DPPRDSKGL", - "DSKKSQPKI", "EAKTHEAQI", - "EDRDDNKVY", "EYSKQM(Oxidation)QRF", "FADPHSKRV", "FPHSAHQKY", "FPSRGKSSSY", - "GKVGAHAGEY", "GKVGAHAGEYG", "GLAKSIHHA", "GMAKKVTKA", "GNVAEGETKPD", "GPNKKPRF", - "GRPM(Oxidation)PPSRR", + "GPRVVERH", "GRVVEPKR", "GVM(Oxidation)VGM(Oxidation)GQKD", "HAAENPGKY", @@ -233,24 +227,21 @@ "KASGTLREY", "KAYGKAKSI", "KAYSEAHEI", - "KHANQVLSL", "KLAESVEKA", "KLAPPPKKA", "KLDNQVSKV", "KLM(Oxidation)QQQQEV", - "KLQPGSVKKV", "KLSPKAEEV", "KM(Oxidation)DESKHEI", "KM(Oxidation)LDHEYTT", "KMDESKHEI", "KMQEHSDQV", + "KRSSPETL", "KSKEFVQKV", "KTKEGVREV", - "KVAQPKEV", "KVIDTQQKV", "KVSNSGITRV", "KVVNPTQK", - "KYLGKTHNL", "KYNRQSM(Oxidation)TL", "KYQPKPKQI", "KYTPPPHHI", @@ -280,20 +271,18 @@ "NLAEKPKTV", "NLKVKGPVR", "NLRPKKKV", - "NLRPKKKVK", + "NLSSLSKK", "NLTEEEEKSKS", "NNLSSLSKK", "NPAAYENDK", "NPFGGASHAKG", "NPKESSSSL", + "NSHSTTSSF", "NTKIGPRR", "NVDYSKLKK", "NVINGGSHA", "NVKIVKVKKE", - "NYTKEHNNL", "PKSKELVSSSS", - "PPNKKPKV", - "PVEKALRD", "QAGPINREM(Oxidation)", "QALKHLKQY", "QGVM(Oxidation)VGM(Oxidation)GQK", @@ -301,21 +290,16 @@ "QPAKADKESF", "QPHKVTQY", "QTHQPPAPNS", - "QVKPNSNQV", "QYKKDGADF", - "RADKKAPR", "RLAEAHAKV", + "RLGPTGKEV", "RLHEKIQEA", - "RLNNKSAKV", "RPKKPGQSF", "RPVPKGATY", - "RQVTGVTRV", "RSNEHIREL", "RSTENVNKL", "RSTQYM(Oxidation)KEY", "RVAGIHKKV", - "RYDDM(Oxidation)AAAM(Oxidation)", - "RYIDLHSNR", "RYIDTHNRV", "RYM(Oxidation)NHM(Oxidation)QSL", "SAKLERSHY", @@ -330,7 +314,6 @@ "SAVDRQREY", "SAYANAKKY", "SEVAHRFK", - "SIVGRPRH", "SKEYFSKQ", "SLDKTSHSV", "SLDTQPKKV", @@ -344,24 +327,19 @@ "SYVGDEAQSKR", "SYVGDEAQSKRG", "TALAPSTM(Oxidation)K", - "TAPQTQHV", "TARPGPRAV", "TDKSFVEK", - "TDRETGKL", "TEKLVTSK", "TEKLVTSKG", "TGYYGKGKP", "THQPPAPNS", "THYDPPRK", + "TIEQEKRSEIS", "TIGEGQQHHLG", - "TISRPKGVA", - "TKELPSGKKY", - "TLVQTKGT", - "TNNLRPKKKVK", + "TKKVPQVS", "TPPGVRKI", "TRLSRTPGNR", "TSGPGSRISSSS", - "TSTPNAKTV", "TTPISEQKG", "TTTHITKTV", "TVIGPDGHKE", @@ -394,8 +372,8 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.04.8" + "nextflow": "25.10.3" }, - "timestamp": "2026-01-24T12:28:10.442180709" + "timestamp": "2026-02-10T20:58:29.771826041" } } \ No newline at end of file diff --git a/tests/test_single_quant.nf.test.snap b/tests/test_single_quant.nf.test.snap index 60868f96..b9265972 100644 --- a/tests/test_single_quant.nf.test.snap +++ b/tests/test_single_quant.nf.test.snap @@ -127,7 +127,6 @@ "AAAAAAHRL", "AAATVTKKV", "AAHPNVQKV", - "AAKDPSPSV", "AAM(Oxidation)SVAKRV", "AANAQPHKL", "AANDKLKKM", @@ -146,7 +145,6 @@ "AATVTKKTY", "AKDVKFGAD", "ALKDKIEKA", - "ALKDSVQRA", "ALKENGGARLA", "ALSDLHAHK", "AM(Oxidation)AARPHSI", @@ -160,27 +158,23 @@ "AVM(Oxidation)GNPKVKA", "AVVVKKIETRDG", "DAAVHQRI", - "DAKKQIKQV", "DAPAGRKV", "DGKKKISTV", "DHVITNM(Oxidation)N", "DPM(Oxidation)KARVV", "DPPKTHVT", "DPPRDSKGL", - "DSKKSQPKI", "EAKTHEAQI", - "EDRDDNKVY", "EYSKQM(Oxidation)QRF", "FADPHSKRV", "FPHSAHQKY", "FPSRGKSSSY", - "GKVGAHAGEY", "GKVGAHAGEYG", "GLAKSIHHA", "GMAKKVTKA", "GNVAEGETKPD", "GPNKKPRF", - "GRPM(Oxidation)PPSRR", + "GPRVVERH", "GRVVEPKR", "GVM(Oxidation)VGM(Oxidation)GQKD", "HAAENPGKY", @@ -221,24 +215,21 @@ "KASGTLREY", "KAYGKAKSI", "KAYSEAHEI", - "KHANQVLSL", "KLAESVEKA", "KLAPPPKKA", "KLDNQVSKV", "KLM(Oxidation)QQQQEV", - "KLQPGSVKKV", "KLSPKAEEV", "KM(Oxidation)DESKHEI", "KM(Oxidation)LDHEYTT", "KMDESKHEI", "KMQEHSDQV", + "KRSSPETL", "KSKEFVQKV", "KTKEGVREV", - "KVAQPKEV", "KVIDTQQKV", "KVSNSGITRV", "KVVNPTQK", - "KYLGKTHNL", "KYNRQSM(Oxidation)TL", "KYQPKPKQI", "KYTPPPHHI", @@ -268,20 +259,18 @@ "NLAEKPKTV", "NLKVKGPVR", "NLRPKKKV", - "NLRPKKKVK", + "NLSSLSKK", "NLTEEEEKSKS", "NNLSSLSKK", "NPAAYENDK", "NPFGGASHAKG", "NPKESSSSL", + "NSHSTTSSF", "NTKIGPRR", "NVDYSKLKK", "NVINGGSHA", "NVKIVKVKKE", - "NYTKEHNNL", "PKSKELVSSSS", - "PPNKKPKV", - "PVEKALRD", "QAGPINREM(Oxidation)", "QALKHLKQY", "QGVM(Oxidation)VGM(Oxidation)GQK", @@ -289,21 +278,16 @@ "QPAKADKESF", "QPHKVTQY", "QTHQPPAPNS", - "QVKPNSNQV", "QYKKDGADF", - "RADKKAPR", "RLAEAHAKV", + "RLGPTGKEV", "RLHEKIQEA", - "RLNNKSAKV", "RPKKPGQSF", "RPVPKGATY", - "RQVTGVTRV", "RSNEHIREL", "RSTENVNKL", "RSTQYM(Oxidation)KEY", "RVAGIHKKV", - "RYDDM(Oxidation)AAAM(Oxidation)", - "RYIDLHSNR", "RYIDTHNRV", "RYM(Oxidation)NHM(Oxidation)QSL", "SAKLERSHY", @@ -318,7 +302,6 @@ "SAVDRQREY", "SAYANAKKY", "SEVAHRFK", - "SIVGRPRH", "SKEYFSKQ", "SLDKTSHSV", "SLDTQPKKV", @@ -332,24 +315,19 @@ "SYVGDEAQSKR", "SYVGDEAQSKRG", "TALAPSTM(Oxidation)K", - "TAPQTQHV", "TARPGPRAV", "TDKSFVEK", - "TDRETGKL", "TEKLVTSK", "TEKLVTSKG", "TGYYGKGKP", "THQPPAPNS", "THYDPPRK", + "TIEQEKRSEIS", "TIGEGQQHHLG", - "TISRPKGVA", - "TKELPSGKKY", - "TLVQTKGT", - "TNNLRPKKKVK", + "TKKVPQVS", "TPPGVRKI", "TRLSRTPGNR", "TSGPGSRISSSS", - "TSTPNAKTV", "TTPISEQKG", "TTTHITKTV", "TVIGPDGHKE", @@ -382,8 +360,8 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.04.8" + "nextflow": "25.10.3" }, - "timestamp": "2026-01-15T17:14:18.178495706" + "timestamp": "2026-02-10T20:57:05.070921205" } } \ No newline at end of file From b8a882b1d3421aa90809b481a8ac2ce0bc340cd6 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Wed, 11 Feb 2026 08:35:44 +0000 Subject: [PATCH 067/104] Fix ion annotator join key mismatch and rename XL preset comment --- conf/search_presets.config | 2 +- tests/ionannotator.nf.test.snap | 10 ++++++++-- workflows/mhcquant.nf | 9 +++++++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/conf/search_presets.config b/conf/search_presets.config index d56c2db8..6ac3cd52 100644 --- a/conf/search_presets.config +++ b/conf/search_presets.config @@ -103,7 +103,7 @@ params { fixed_mods: ' ', variable_mods: 'Oxidation (M)' ], - // Cross-linking / low-resolution presets + // Exactive XL (low-resolution) instrument presets 'xl_class1': [ peptide_min_length: 8, peptide_max_length: 14, diff --git a/tests/ionannotator.nf.test.snap b/tests/ionannotator.nf.test.snap index b7099755..1d53f90e 100644 --- a/tests/ionannotator.nf.test.snap +++ b/tests/ionannotator.nf.test.snap @@ -1,7 +1,7 @@ { "-profile test_ionannotator": { "content": [ - 21, + 22, { "MS2RESCORE": { "MS2Rescore": "3.1.5" @@ -38,6 +38,9 @@ "PYOPENMS_CHROMATOGRAMEXTRACTOR": { "pyopenms": "3.4.1" }, + "PYOPENMS_IONANNOTATOR": { + "pyopenms": "3.4.1" + }, "SUMMARIZE_RESULTS": { "pyopenms": "3.4.1" }, @@ -52,6 +55,9 @@ "intermediate_results/comet/HepG2_rep1_small_pin.tsv", "intermediate_results/comet/HepG2_rep2_small_pin.tsv", "intermediate_results/comet/HepG2_rep3_small_pin.tsv", + "intermediate_results/ion_annotations", + "intermediate_results/ion_annotations/HepG2_A_all_peaks.tsv", + "intermediate_results/ion_annotations/HepG2_A_matching_ions.tsv", "intermediate_results/rescoring", "intermediate_results/rescoring/HepG2_A_ms2rescore.idXML", "intermediate_results/rescoring/HepG2_A_pout.idXML", @@ -412,6 +418,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-10T20:57:09.455601114" + "timestamp": "2026-02-11T08:35:21.983408498" } } \ No newline at end of file diff --git a/workflows/mhcquant.nf b/workflows/mhcquant.nf index d6809e3a..a3d1edf1 100644 --- a/workflows/mhcquant.nf +++ b/workflows/mhcquant.nf @@ -173,10 +173,15 @@ workflow MHCQUANT { // Annotate Ions for follow-up spectrum validation if (params.annotate_ions) { - // Join the ch_filtered_idxml and the ch_mzml_file - ch_clean_mzml_file.map { meta, mzml -> [ groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), mzml] } + // Join mzml files and fdr-filtered idxml, reconstructing search params from ch_clean_mzml_file + ch_clean_mzml_file.map { meta, mzml -> + [ [id: "${meta.sample}_${meta.condition}"], + meta.subMap(meta.keySet() - ['id', 'sample', 'condition', 'group_count', 'spectra']), + mzml ] + } .groupTuple() .join(RESCORE.out.fdr_filtered) + .map { key, searchMetas, mzmls, idxml -> [key + searchMetas[0], mzmls, idxml] } .set{ ch_ion_annotator_input } // Annotate spectra with ion fragmentation information From 83a1fd547246a89990c9dc3d56394aed28ae72f0 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 12 Feb 2026 11:49:41 +0000 Subject: [PATCH 068/104] Address PR review: fix mods tokenization, revert fixed_mods default, clarify FDR comment --- conf/modules.config | 4 +- nextflow.config | 8 +- subworkflows/local/rescore/main.nf | 3 +- .../utils_nfcore_mhcquant_pipeline/main.nf | 42 ++++-- tests/default.nf.test.snap | 38 ++++- tests/search_presets.nf.test.snap | 139 +++++++++--------- 6 files changed, 131 insertions(+), 103 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 23db4a1a..dd09a662 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -106,8 +106,8 @@ process { "-max_variable_mods_in_peptide ${meta.number_mods}", "-missed_cleavages 0", "-precursor_charge ${meta.prec_charge}", - meta.fixed_mods.trim() ? "-fixed_modifications '${meta.fixed_mods.trim()}'" : "", - meta.variable_mods.trim() ? "-variable_modifications '${meta.variable_mods.trim()}'" : "", + "-fixed_modifications ${meta.fixed_mods.trim() ? meta.fixed_mods.tokenize(',').collect { "'${it.trim()}'" }.join(' ') : ''}", + meta.variable_mods.trim() ? "-variable_modifications ${meta.variable_mods.tokenize(',').collect { "'${it.trim()}'" }.join(' ')}" : "", "-enzyme '${params.enzyme}'", "-use_X_ions ${params.use_x_ions}", "-use_Z_ions ${params.use_z_ions}", diff --git a/nextflow.config b/nextflow.config index a7b4e404..4931c017 100644 --- a/nextflow.config +++ b/nextflow.config @@ -12,6 +12,7 @@ params { input = null outdir = null fasta = null + search_presets = "${projectDir}/assets/search_presets.tsv" // Workflow options skip_decoy_generation = false @@ -34,7 +35,7 @@ params { fragment_bin_offset = 0.0 fragment_mass_tolerance = 0.01 number_mods = 3 - fixed_mods = ' ' + fixed_mods = '' variable_mods = 'Oxidation (M)' num_hits = 1 use_x_ions = false @@ -118,9 +119,6 @@ params { // Load base.config by default for all pipelines includeConfig 'conf/base.config' -// Load search parameter presets -includeConfig 'conf/search_presets.config' - profiles { debug { dumpHashes = true @@ -370,7 +368,7 @@ plugins { } validation { - defaultIgnoreParams = ["genomes", "search_presets"] + defaultIgnoreParams = ["genomes"] monochromeLogs = params.monochrome_logs } diff --git a/subworkflows/local/rescore/main.nf b/subworkflows/local/rescore/main.nf index 6acc3a3d..0a9839ac 100644 --- a/subworkflows/local/rescore/main.nf +++ b/subworkflows/local/rescore/main.nf @@ -54,7 +54,8 @@ workflow RESCORE { ch_pout = OPENMS_PERCOLATORADAPTER.out.idxml if (params.global_fdr) { - // Group by search_preset (or 'global' if no preset) + // Group by search_preset for global FDR. Samples without a preset all share + // the same params (CLI or defaults), so they correctly group under 'global'. OPENMS_IDMERGER_GLOBAL( OPENMS_PSMFEATUREEXTRACTOR.out.idxml .map { group_meta, idxml -> [[id: group_meta.search_preset ?: 'global'], idxml] } diff --git a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf index 3f25dc4b..0aa39f09 100644 --- a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf @@ -91,6 +91,22 @@ workflow PIPELINE_INITIALISATION { nextflow_cli_args ) + // + // Parse search parameter presets TSV into a map + // + def presetsList = samplesheetToList(params.search_presets, "${projectDir}/assets/schema_search_presets.json") + def presetsMap = presetsList.collectEntries { row -> + def meta = (row instanceof List) ? row[0] : row + // nf-schema parses whitespace-only TSV fields as empty list []; convert to empty string + ['fixed_mods', 'variable_mods'].each { key -> + def val = meta[key] + if (val == null || (val instanceof List && val.size() == 0) || val == '') { + meta[key] = '' + } + } + [(meta.preset_name): meta] + } + // // Create channel from input file provided through params.input // @@ -108,7 +124,7 @@ workflow PIPELINE_INITIALISATION { .combine( ch_input, by:0 ) .map { group_meta, group_count, meta, file, fasta -> def enrichedMeta = meta + ['group_count':group_count, 'spectra':file.baseName.tokenize('.')[0], 'ext':getCustomExtension(file)] - def resolved = resolveSearchParams(enrichedMeta, params.search_presets) + def resolved = resolveSearchParams(enrichedMeta, presetsMap) [resolved, file, fasta] } .set { ch_samplesheet_raw } @@ -217,15 +233,19 @@ workflow PIPELINE_COMPLETION { */ // -// Resolve a search parameter with priority: CLI params > samplesheet (individual) > preset > config default +// Resolve a search parameter with priority: CLI params > samplesheet preset > nextflow.config default // -def resolveSearchParams(meta, searchPresets) { +def resolveSearchParams(meta, presetsMap) { def searchParamKeys = ['instrument', 'activation_method', 'digest_mass_range', 'prec_charge', 'precursor_mass_tolerance', 'fragment_mass_tolerance', 'fragment_bin_offset', 'number_mods', 'ms2pip_model', 'peptide_min_length', 'peptide_max_length', 'fixed_mods', 'variable_mods'] def presetName = meta.search_preset - def presetConfig = (presetName && searchPresets) ? searchPresets[presetName] : [:] + def hasPreset = presetName && !(presetName instanceof List && presetName.size() == 0) && presetName != '' + def presetConfig = hasPreset ? presetsMap[presetName] : [:] + if (hasPreset && !presetConfig) { + error "Unknown search preset '${presetName}'. Available: ${presetsMap.keySet().join(', ')}" + } if (!presetConfig) { presetConfig = [:] } def result = new LinkedHashMap(meta) @@ -233,19 +253,11 @@ def resolveSearchParams(meta, searchPresets) { searchParamKeys.each { key -> def cliOverride = (workflow.commandLine =~ /--${key}[\s=]/).find() if (cliOverride) { - // CLI has highest priority result.put(key, params[key]) + } else if (presetConfig.containsKey(key)) { + result.put(key, presetConfig[key]) } else { - // Check samplesheet individual value (nf-schema sets empty columns to []) - def currentValue = result[key] - def isEmpty = (currentValue == null) || (currentValue instanceof List && currentValue.size() == 0) || (currentValue == '') - if (isEmpty && presetConfig.containsKey(key)) { - // Use preset value - result.put(key, presetConfig.get(key)) - } else if (isEmpty) { - // Fall back to config default (params.X) - result.put(key, params[key]) - } + result.put(key, params[key]) } } diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index cfb7e22c..489747bf 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -127,6 +127,7 @@ "AAAAAAHRL", "AAATVTKKV", "AAHPNVQKV", + "AAKDPSPSV", "AAM(Oxidation)SVAKRV", "AANAQPHKL", "AANDKLKKM", @@ -145,6 +146,7 @@ "AATVTKKTY", "AKDVKFGAD", "ALKDKIEKA", + "ALKDSVQRA", "ALKENGGARLA", "ALSDLHAHK", "AM(Oxidation)AARPHSI", @@ -158,23 +160,27 @@ "AVM(Oxidation)GNPKVKA", "AVVVKKIETRDG", "DAAVHQRI", + "DAKKQIKQV", "DAPAGRKV", "DGKKKISTV", "DHVITNM(Oxidation)N", "DPM(Oxidation)KARVV", "DPPKTHVT", "DPPRDSKGL", + "DSKKSQPKI", "EAKTHEAQI", + "EDRDDNKVY", "EYSKQM(Oxidation)QRF", "FADPHSKRV", "FPHSAHQKY", "FPSRGKSSSY", + "GKVGAHAGEY", "GKVGAHAGEYG", "GLAKSIHHA", "GMAKKVTKA", "GNVAEGETKPD", "GPNKKPRF", - "GPRVVERH", + "GRPM(Oxidation)PPSRR", "GRVVEPKR", "GVM(Oxidation)VGM(Oxidation)GQKD", "HAAENPGKY", @@ -215,21 +221,24 @@ "KASGTLREY", "KAYGKAKSI", "KAYSEAHEI", + "KHANQVLSL", "KLAESVEKA", "KLAPPPKKA", "KLDNQVSKV", "KLM(Oxidation)QQQQEV", + "KLQPGSVKKV", "KLSPKAEEV", "KM(Oxidation)DESKHEI", "KM(Oxidation)LDHEYTT", "KMDESKHEI", "KMQEHSDQV", - "KRSSPETL", "KSKEFVQKV", "KTKEGVREV", + "KVAQPKEV", "KVIDTQQKV", "KVSNSGITRV", "KVVNPTQK", + "KYLGKTHNL", "KYNRQSM(Oxidation)TL", "KYQPKPKQI", "KYTPPPHHI", @@ -259,18 +268,20 @@ "NLAEKPKTV", "NLKVKGPVR", "NLRPKKKV", - "NLSSLSKK", + "NLRPKKKVK", "NLTEEEEKSKS", "NNLSSLSKK", "NPAAYENDK", "NPFGGASHAKG", "NPKESSSSL", - "NSHSTTSSF", "NTKIGPRR", "NVDYSKLKK", "NVINGGSHA", "NVKIVKVKKE", + "NYTKEHNNL", "PKSKELVSSSS", + "PPNKKPKV", + "PVEKALRD", "QAGPINREM(Oxidation)", "QALKHLKQY", "QGVM(Oxidation)VGM(Oxidation)GQK", @@ -278,16 +289,21 @@ "QPAKADKESF", "QPHKVTQY", "QTHQPPAPNS", + "QVKPNSNQV", "QYKKDGADF", + "RADKKAPR", "RLAEAHAKV", - "RLGPTGKEV", "RLHEKIQEA", + "RLNNKSAKV", "RPKKPGQSF", "RPVPKGATY", + "RQVTGVTRV", "RSNEHIREL", "RSTENVNKL", "RSTQYM(Oxidation)KEY", "RVAGIHKKV", + "RYDDM(Oxidation)AAAM(Oxidation)", + "RYIDLHSNR", "RYIDTHNRV", "RYM(Oxidation)NHM(Oxidation)QSL", "SAKLERSHY", @@ -302,6 +318,7 @@ "SAVDRQREY", "SAYANAKKY", "SEVAHRFK", + "SIVGRPRH", "SKEYFSKQ", "SLDKTSHSV", "SLDTQPKKV", @@ -315,19 +332,24 @@ "SYVGDEAQSKR", "SYVGDEAQSKRG", "TALAPSTM(Oxidation)K", + "TAPQTQHV", "TARPGPRAV", "TDKSFVEK", + "TDRETGKL", "TEKLVTSK", "TEKLVTSKG", "TGYYGKGKP", "THQPPAPNS", "THYDPPRK", - "TIEQEKRSEIS", "TIGEGQQHHLG", - "TKKVPQVS", + "TISRPKGVA", + "TKELPSGKKY", + "TLVQTKGT", + "TNNLRPKKKVK", "TPPGVRKI", "TRLSRTPGNR", "TSGPGSRISSSS", + "TSTPNAKTV", "TTPISEQKG", "TTTHITKTV", "TVIGPDGHKE", @@ -362,6 +384,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-10T20:47:00.120507494" + "timestamp": "2026-02-12T11:44:22.343699485" } } \ No newline at end of file diff --git a/tests/search_presets.nf.test.snap b/tests/search_presets.nf.test.snap index 53d3f1eb..6793201a 100644 --- a/tests/search_presets.nf.test.snap +++ b/tests/search_presets.nf.test.snap @@ -127,182 +127,177 @@ ], [ [ - "HepG2_ClassI.tsv", + "HepG2_ClassII.tsv", [ - "AAKDPSPSV", + "AAAAAAHRL", + "AAATVTKKV", "AAM(Oxidation)SVAKRV", + "AANAQPHKL", "AANDKLKKM", - "AANPDPKKL", "AAPPPPAHA", "AAPRPPPKPM(Oxidation)", "AAQAHTREL", - "AAQSEAKVV", - "AASPVGKRL", + "AARAEAREI", "AASSLKKQY", "AATPAKKTV", - "AATRWAKKI", - "AATSNLKKL", + "AKDVKFGAD", "ALKDKIEKA", "ALKDSVQRA", - "ALKENGGARLA", - "AM(Oxidation)AARPHSI", + "ALKKALAAA", + "ALSDLHAHK", "AM(Oxidation)AASPHAV", "AM(Oxidation)ASHLTST", "AM(Oxidation)HGHVEVV", "AM(Oxidation)NARPHKV", "AMNARPHKV", - "APRPPPKPM(Oxidation)", - "ATWSDPHKA", + "APPKAHEV", + "APRADAKAY", "AVM(Oxidation)GNPKVKA", - "DAAVHQRI", + "AVM(Oxidation)GNPKVKAH", + "DAKKQIKQV", "DAPAGRKV", + "DGKKKISTV", + "DHVITNM(Oxidation)N", "DPM(Oxidation)KARVV", - "DPPKTHVT", "DPPRDSKGL", - "EAKTHEAQI", "EYSKQM(Oxidation)QRF", "FADPHSKRV", - "FPHSAHQKY", "GKVGAHAGEY", "GKVGAHAGEYG", "GLAKSIHHA", "GMAKKVTKA", "GNVAEGETKPD", + "GPNKKPRF", "GPRVVERH", + "GRVVEPKR", "GVM(Oxidation)VGM(Oxidation)GQKD", "HAAENPGKY", + "HAANPNGRYY", + "HAASRIKTI", "HAATYTKKV", - "HAFGGNKASY", "HAGPTAHEL", - "HAIGKSQSF", "HAKEKLTAL", "HAM(Oxidation)EEVKKF", "HAPELTKKV", - "HLKEDQTEY", - "HPAENGKSNF", "HPESERISM(Oxidation)", + "HPGRPQPPA", "HPNKVKVY", - "HPSQPQGTY", "HPYQPDPKM(Oxidation)", "HSRNEGVATY", + "HSSPASSNY", "HVKDANGNSF", "HVSTHQHNY", "IASQTVKKV", - "ILDKKVEKV", - "IPQKFHRSV", + "IKTVETRD", "ISSEAHREV", - "KAAAFEKQV", + "IVGRPRHQ", "KAAKPKVV", - "KAAQPKSL", - "KAATVTKEL", + "KAASHIKSI", "KAISGVHTV", "KAKPGTYKV", - "KALVKPKEV", + "KAPPKPARA", + "KASEQAKVV", "KASGTLREY", "KAYGKAKSI", - "KAYSEAHEI", - "KLAESVEKA", + "KGTGASGSF", "KLAPPPKKA", - "KLDNQVSKV", - "KLM(Oxidation)QQQQEV", - "KLSPKAEEV", - "KM(Oxidation)DESKHEI", + "KLQPGSVKKV", "KM(Oxidation)LDHEYTT", + "KMDESKHEI", "KMNESTRSV", - "KQIKEIKEV", "KSKEFVQKV", - "KVAQPKEV", - "KVIDTQQKV", - "KVKDRTLKHH", - "KVSNSGITRV", + "KTKEGVREV", + "KVSLGHAAR", "KVVNPTQK", + "KYLGKTHNL", "KYNRQSM(Oxidation)TL", "KYQPKPKQI", "KYTPPPHHI", - "LDKKVEKV", + "LAKTGVHHY", "LLKSEKSSY", + "LPSENHKEM", "LPSENHKEM(Oxidation)", - "M(Oxidation)LSEHTSKL", + "M(Oxidation)PNKVRKI", "M(Oxidation)PPEHVRKI", "M(Oxidation)PQGGGQHY", "M(Oxidation)PQKERESI", "MPNKVRKI", - "MPPEHVRKI", - "MPQKERESI", "NAHGEPRNY", "NALAHKYH", "NAM(Oxidation)KIRDV", "NATAVVRHM(Oxidation)", - "NATNAVKRL", "NGTHVVRHY", - "NLAEKPKTV", + "NIQKITKS", + "NLSSLSKK", + "NLTEEEEKSKS", "NNLSSLSKK", + "NPAAYENDK", "NPFGGASHAKG", - "NPKESSSSL", + "NPKREIQKI", + "NQNPGSPRPGSTG", "NSHSTTSSF", + "NTKGGDAPAAGEDA", "NTKIGPRR", - "PVEKALRD", + "NVINGGSHA", + "PPNKKPKV", "QAGPINREM(Oxidation)", - "QALKHLKQY", - "QGVM(Oxidation)VGM(Oxidation)GQKD", + "QAMDRAHRI", "QPAKADKESF", "QPHKVTQY", "QTHQPPAPNS", "QYKKDGADF", - "RLGPTGKEV", + "RLAEAHAKV", + "RLHEKIQEA", + "RMARTPQTV", + "RPKKPGQSF", "RPVPKGATY", - "RSTENVNKL", "RSTQYM(Oxidation)KEY", "RVAGIHKKV", - "RYIDTHNRV", "SAKLERSHY", + "SAMSNPRAM(Oxidation)", "SAQTTSHEL", "SARAGETRF", - "SASHVSKTV", - "SATNALRSM(Oxidation)", + "SASEAAKKY", + "SATGHPRKV", "SAVDRQREY", - "SAYANAKKY", + "SEVAHRFK", + "SIVGRPRH", "SKEYFSKQ", - "SLDKTSHSV", "SLDTQPKKV", "SM(Oxidation)LGSPHKV", "SM(Oxidation)NTHLKAV", - "SPM(Oxidation)EKIKQY", - "SPNYHEEKY", + "SM(Oxidation)PEQAHKV", + "SPNKHNRLY", "SQRFPKAE", "SVQVFGRKK", "SYVGDEAQSKR", "SYVGDEAQSKRG", - "TALAPSTM(Oxidation)K", + "TAPQTQHV", + "TARPGPRAV", "TDKSFVEK", + "TDRETGKL", "TEKLVTSK", - "TEKLVTSKG", "TGSETESPRNPSSA", - "TGYYGKGKP", "THQPPAPNS", + "THYDPPRK", + "TKELPSGKKY", "TKGGDAPAAGEDA", - "TKKVPQVS", - "TPPGVRKI", "TSGPGSRISSSS", - "TTNLTEEEEKSKS", - "TTTHITKTV", - "TVIGPDGHKE", + "TSTPNAKTV", + "TTPISEQKG", "TVKDSRTVY", - "TVQNEANKY", - "VASEGIKRY", "VHLTPEEK", "VITDKEKAE", "VPKEGKVV", - "VQNGKHFKF", - "VSKGTLVQTKGT", + "VQKTIAEN", + "VVRHQLLKT", "VYAQKHQQL", "VYGKTSHL", "YADEKTKDV", - "YARLHPRAV", "YGSTVSKRV", - "YPAKAKGTF", "YTKKLNTQ", - "YTM(Oxidation)KKVHAL" + "YTM(Oxidation)KKVHAL", + "YVGDEAQSKRG" ] ] ] @@ -311,6 +306,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-10T20:55:12.621303718" + "timestamp": "2026-02-12T11:49:23.238361062" } } \ No newline at end of file From 321731317ec8d51eeeb549bfd6ac7f65f908e70e Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 12 Feb 2026 13:06:43 +0000 Subject: [PATCH 069/104] Add search_presets back to defaultIgnoreParams to fix nf-schema validation on NF 25.04 --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 4931c017..c3ac1c49 100644 --- a/nextflow.config +++ b/nextflow.config @@ -368,7 +368,7 @@ plugins { } validation { - defaultIgnoreParams = ["genomes"] + defaultIgnoreParams = ["genomes", "search_presets"] monochromeLogs = params.monochrome_logs } From 01c2f5a1e4a8a4d838a777b289dce32407b270fc Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 12 Feb 2026 16:12:44 +0000 Subject: [PATCH 070/104] Add TSV validation to search_presets schema, fix PrecursorMassTolerance type, update snapshots --- assets/schema_search_presets.json | 119 ++++++++++++++++++++++++ nextflow_schema.json | 10 +- tests/ionannotator.nf.test.snap | 25 ++--- tests/search_presets.nf.test.snap | 131 ++++++++++++++------------- tests/speclib.nf.test.snap | 38 ++++++-- tests/test_single_quant.nf.test.snap | 38 ++++++-- 6 files changed, 258 insertions(+), 103 deletions(-) create mode 100644 assets/schema_search_presets.json diff --git a/assets/schema_search_presets.json b/assets/schema_search_presets.json new file mode 100644 index 00000000..a4ce7c1e --- /dev/null +++ b/assets/schema_search_presets.json @@ -0,0 +1,119 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://raw.githubusercontent.com/nf-core/mhcquant/master/assets/schema_search_presets.json", + "title": "nf-core/mhcquant pipeline - params.search_presets schema", + "description": "Schema for the search parameter presets file provided with params.search_presets", + "type": "array", + "items": { + "type": "object", + "properties": { + "PresetName": { + "type": "string", + "pattern": "^[a-zA-Z0-9_]+$", + "errorMessage": "PresetName must contain only alphanumeric characters and underscores", + "meta": ["preset_name"] + }, + "PeptideMinLength": { + "type": "integer", + "minimum": 1, + "errorMessage": "PeptideMinLength must be a positive integer", + "meta": ["peptide_min_length"] + }, + "PeptideMaxLength": { + "type": "integer", + "minimum": 1, + "errorMessage": "PeptideMaxLength must be a positive integer", + "meta": ["peptide_max_length"] + }, + "PrecursorMassRange": { + "type": "string", + "pattern": "^\\d+:\\d+$", + "errorMessage": "PrecursorMassRange must be in format 'min:max' (e.g., '800:2500')", + "meta": ["digest_mass_range"] + }, + "PrecursorCharge": { + "type": "string", + "pattern": "^\\d+:\\d+$", + "errorMessage": "PrecursorCharge must be in format 'min:max' (e.g., '2:3')", + "meta": ["prec_charge"] + }, + "PrecursorMassTolerance": { + "type": "number", + "minimum": 0, + "errorMessage": "PrecursorMassTolerance must be a non-negative number", + "meta": ["precursor_mass_tolerance"] + }, + "FragmentMassTolerance": { + "type": "number", + "minimum": 0, + "errorMessage": "FragmentMassTolerance must be a non-negative number", + "meta": ["fragment_mass_tolerance"] + }, + "FragmentBinOffset": { + "type": "number", + "minimum": 0, + "errorMessage": "FragmentBinOffset must be a non-negative number", + "meta": ["fragment_bin_offset"] + }, + "MS2PIPModel": { + "type": "string", + "enum": [ + "Immuno-HCD", + "timsTOF", + "CIDch2", + "HCD", + "CID", + "ITMS", + "iTRAQ", + "iTRAQphospho", + "TMT", + "HCDch2" + ], + "errorMessage": "MS2PIPModel must be a valid MS2PIP model name", + "meta": ["ms2pip_model"] + }, + "ActivationMethod": { + "type": "string", + "enum": ["ALL", "CID", "HCD", "ETD", "ECD", "EThcD", "ETciD"], + "errorMessage": "ActivationMethod must be one of: ALL, CID, HCD, ETD, ECD, EThcD, ETciD", + "meta": ["activation_method"] + }, + "Instrument": { + "type": "string", + "enum": ["high_res", "low_res"], + "errorMessage": "Instrument must be either 'high_res' or 'low_res'", + "meta": ["instrument"] + }, + "NumberMods": { + "type": "integer", + "minimum": 0, + "errorMessage": "NumberMods must be a non-negative integer", + "meta": ["number_mods"] + }, + "FixedMods": { + "type": "string", + "errorMessage": "FixedMods must be a comma-separated list of UNIMOD modification names", + "meta": ["fixed_mods"] + }, + "VariableMods": { + "type": "string", + "errorMessage": "VariableMods must be a comma-separated list of UNIMOD modification names", + "meta": ["variable_mods"] + } + }, + "required": [ + "PresetName", + "PeptideMinLength", + "PeptideMaxLength", + "PrecursorMassRange", + "PrecursorCharge", + "PrecursorMassTolerance", + "FragmentMassTolerance", + "FragmentBinOffset", + "MS2PIPModel", + "ActivationMethod", + "Instrument", + "NumberMods" + ] + } +} diff --git a/nextflow_schema.json b/nextflow_schema.json index 398ec4bd..cfba6adc 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -252,9 +252,13 @@ "description": "Specify custom Comet params file. All parameters of this take precedence." }, "search_presets": { - "type": "object", - "hidden": true, - "description": "Predefined search parameter presets for different MHC classes and instruments. Referenced via the SearchPreset column in the samplesheet." + "type": "string", + "format": "file-path", + "exists": true, + "schema": "assets/schema_search_presets.json", + "mimetype": "text/csv", + "pattern": "^\\S+\\.tsv$", + "description": "TSV file with search parameter presets. Users can supply a custom file to define their own presets." } } }, diff --git a/tests/ionannotator.nf.test.snap b/tests/ionannotator.nf.test.snap index 1d53f90e..694b9d9b 100644 --- a/tests/ionannotator.nf.test.snap +++ b/tests/ionannotator.nf.test.snap @@ -134,7 +134,6 @@ "AAAAAAHRL", "AAATVTKKV", "AAHPNVQKV", - "AAKDPSPSV", "AAM(Oxidation)SVAKRV", "AANAQPHKL", "AANDKLKKM", @@ -164,7 +163,6 @@ "AM(Oxidation)NARPHKV", "AMNARPHKV", "APAPRRLP", - "APRADAKAY", "APRPPPKPM(Oxidation)", "ATWSDPHKA", "AVM(Oxidation)GNPKVKA", @@ -174,7 +172,6 @@ "DAKKQIKQV", "DAPAGRKV", "DGKKKISTV", - "DGKTNPKI", "DHVITNM(Oxidation)N", "DPM(Oxidation)KARVV", "DPPKTHVT", @@ -185,7 +182,6 @@ "FADPHSKRV", "FPHSAHQKY", "FPSRGKSSSY", - "GIAGPRGSP", "GKVGAHAGEY", "GKVGAHAGEYG", "GLAKSIHHA", @@ -210,14 +206,12 @@ "HPAENGKSNF", "HPESERISM(Oxidation)", "HPNKVKVY", - "HPSGRDPDT", "HPSQPQGTY", "HPYQPDPKM(Oxidation)", "HSRNEGVATY", "HSSPASSNY", "HVKDANGNSF", "HVSTHQHNY", - "HVTAYENT", "IASQTVKKV", "IKTVETRD", "ILDKKVEKV", @@ -225,6 +219,7 @@ "IPQKFHRSV", "ISSEAHREV", "IVGRPRHQ", + "IYTEHAHQV", "KAAAFEKQV", "KAAKPKVV", "KAAQPKSL", @@ -251,9 +246,7 @@ "KMQEHSDQV", "KSKEFVQKV", "KTKEGVREV", - "KTLGTDVVKS", "KVAQPKEV", - "KVHLGARAS", "KVIDTQQKV", "KVSNSGITRV", "KVVNPTQK", @@ -276,14 +269,11 @@ "MPNKVRKI", "MPPEHVRKI", "MPQKERESI", - "NAAEGRSF", "NAHGEPRNY", "NALAHKYH", "NAM(Oxidation)KIRDV", - "NASARDNTI", "NATAVVRHM(Oxidation)", "NATNAVKRL", - "NATVGRRY", "NGTHVVRHY", "NIQKITKS", "NLAEKPKTV", @@ -295,8 +285,8 @@ "NNLSSLSKK", "NPAAYENDK", "NPFGGASHAKG", - "NPHRAVEY", "NPKESSSSL", + "NSHSTTSSF", "NTKIGPRR", "NVDYSKLKK", "NVINGGSHA", @@ -306,15 +296,12 @@ "PVEKALRD", "QAGPINREM(Oxidation)", "QALKHLKQY", - "QAMDRAHRI", "QGVM(Oxidation)VGM(Oxidation)GQK", "QGVM(Oxidation)VGM(Oxidation)GQKD", "QPAKADKESF", "QPHKVTQY", "QTHQPPAPNS", - "QVKPNSNQV", "QYKKDGADF", - "RAASTIKEV", "RAQEKVHEM", "RFYARYSL", "RLAEAHAKV", @@ -368,15 +355,15 @@ "TAPQTQHV", "TARPGPRAV", "TDKSFVEK", - "TDRETGKL", "TDRETGKLKG", "TEKLVTSK", "TEKLVTSKG", "TGYYGKGKP", "THQPPAPNS", "THYDPPRK", - "TIEQEKRSEIS", "TIGEGQQHHLG", + "TISRPKGVA", + "TKELPSGKKY", "TKKVPQVS", "TLSGHSQEV", "TLVQTKGT", @@ -409,7 +396,7 @@ "YPAKAKGTF", "YTKKLNTQ", "YTM(Oxidation)KKVHAL", - "YVVGLRNTLT" + "YVGDEAQSKR" ] ] ] @@ -418,6 +405,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-11T08:35:21.983408498" + "timestamp": "2026-02-12T13:24:09.318954712" } } \ No newline at end of file diff --git a/tests/search_presets.nf.test.snap b/tests/search_presets.nf.test.snap index 6793201a..2c22b01b 100644 --- a/tests/search_presets.nf.test.snap +++ b/tests/search_presets.nf.test.snap @@ -127,177 +127,178 @@ ], [ [ - "HepG2_ClassII.tsv", + "HepG2_ClassI.tsv", [ - "AAAAAAHRL", "AAATVTKKV", "AAM(Oxidation)SVAKRV", - "AANAQPHKL", "AANDKLKKM", + "AANPDPKKL", "AAPPPPAHA", "AAPRPPPKPM(Oxidation)", "AAQAHTREL", - "AARAEAREI", + "AAQSEAKVV", + "AASPVGKRL", "AASSLKKQY", "AATPAKKTV", - "AKDVKFGAD", + "AATRWAKKI", + "AATSNLKKL", "ALKDKIEKA", "ALKDSVQRA", - "ALKKALAAA", - "ALSDLHAHK", + "ALKENGGARLA", + "AM(Oxidation)AARPHSI", "AM(Oxidation)AASPHAV", "AM(Oxidation)ASHLTST", "AM(Oxidation)HGHVEVV", "AM(Oxidation)NARPHKV", "AMNARPHKV", "APPKAHEV", - "APRADAKAY", + "APRPPPKPM(Oxidation)", + "ASTQTTHEL", + "ATWSDPHKA", "AVM(Oxidation)GNPKVKA", - "AVM(Oxidation)GNPKVKAH", - "DAKKQIKQV", + "DAAVHQRI", "DAPAGRKV", - "DGKKKISTV", - "DHVITNM(Oxidation)N", "DPM(Oxidation)KARVV", + "DPPKTHVT", "DPPRDSKGL", "EYSKQM(Oxidation)QRF", "FADPHSKRV", - "GKVGAHAGEY", + "FPHSAHQKY", "GKVGAHAGEYG", "GLAKSIHHA", "GMAKKVTKA", "GNVAEGETKPD", - "GPNKKPRF", "GPRVVERH", - "GRVVEPKR", "GVM(Oxidation)VGM(Oxidation)GQKD", "HAAENPGKY", - "HAANPNGRYY", - "HAASRIKTI", "HAATYTKKV", + "HAFGGNKASY", "HAGPTAHEL", "HAKEKLTAL", "HAM(Oxidation)EEVKKF", "HAPELTKKV", + "HLKEDQTEY", + "HPAENGKSNF", "HPESERISM(Oxidation)", - "HPGRPQPPA", "HPNKVKVY", "HPYQPDPKM(Oxidation)", "HSRNEGVATY", - "HSSPASSNY", "HVKDANGNSF", "HVSTHQHNY", "IASQTVKKV", - "IKTVETRD", + "ILDKKVEKV", + "IPQKFHRSV", "ISSEAHREV", - "IVGRPRHQ", + "KAAAFEKQV", "KAAKPKVV", "KAASHIKSI", + "KAATVTKEL", "KAISGVHTV", "KAKPGTYKV", - "KAPPKPARA", - "KASEQAKVV", + "KALVKPKEV", "KASGTLREY", "KAYGKAKSI", - "KGTGASGSF", + "KAYSEAHEI", + "KLAESVEKA", "KLAPPPKKA", - "KLQPGSVKKV", - "KM(Oxidation)LDHEYTT", - "KMDESKHEI", + "KLDNQVSKV", + "KLM(Oxidation)QQQQEV", + "KLSPKAEEV", + "KM(Oxidation)DESKHEI", "KMNESTRSV", - "KSKEFVQKV", - "KTKEGVREV", - "KVSLGHAAR", + "KQIKEIKEV", + "KVAQPKEV", + "KVIDTQQKV", + "KVSNSGITRV", "KVVNPTQK", - "KYLGKTHNL", "KYNRQSM(Oxidation)TL", - "KYQPKPKQI", "KYTPPPHHI", "LAKTGVHHY", + "LDKKVEKV", "LLKSEKSSY", "LPSENHKEM", "LPSENHKEM(Oxidation)", - "M(Oxidation)PNKVRKI", + "M(Oxidation)LSEHTSKL", "M(Oxidation)PPEHVRKI", "M(Oxidation)PQGGGQHY", "M(Oxidation)PQKERESI", + "MPKAEKNAV", "MPNKVRKI", + "MPPEHVRKI", + "MPQKERESI", "NAHGEPRNY", "NALAHKYH", "NAM(Oxidation)KIRDV", "NATAVVRHM(Oxidation)", + "NATNAVKRL", "NGTHVVRHY", "NIQKITKS", + "NLAEKPKTV", "NLSSLSKK", - "NLTEEEEKSKS", "NNLSSLSKK", - "NPAAYENDK", "NPFGGASHAKG", - "NPKREIQKI", - "NQNPGSPRPGSTG", + "NPKESSSSL", "NSHSTTSSF", "NTKGGDAPAAGEDA", "NTKIGPRR", - "NVINGGSHA", - "PPNKKPKV", + "NVKIVKVKKE", + "PVEKALRD", "QAGPINREM(Oxidation)", - "QAMDRAHRI", + "QALKHLKQY", + "QGVM(Oxidation)VGM(Oxidation)GQK", + "QGVM(Oxidation)VGM(Oxidation)GQKD", "QPAKADKESF", "QPHKVTQY", "QTHQPPAPNS", "QYKKDGADF", - "RLAEAHAKV", "RLHEKIQEA", - "RMARTPQTV", - "RPKKPGQSF", "RPVPKGATY", + "RSTENVNKL", "RSTQYM(Oxidation)KEY", "RVAGIHKKV", "SAKLERSHY", - "SAMSNPRAM(Oxidation)", "SAQTTSHEL", "SARAGETRF", - "SASEAAKKY", - "SATGHPRKV", - "SAVDRQREY", - "SEVAHRFK", - "SIVGRPRH", + "SASHVSKTV", + "SATNALRSM(Oxidation)", + "SAYANAKKY", "SKEYFSKQ", + "SLDKTSHSV", "SLDTQPKKV", "SM(Oxidation)LGSPHKV", "SM(Oxidation)NTHLKAV", - "SM(Oxidation)PEQAHKV", - "SPNKHNRLY", + "SPM(Oxidation)EKIKQY", + "SPNYHEEKY", "SQRFPKAE", "SVQVFGRKK", "SYVGDEAQSKR", "SYVGDEAQSKRG", - "TAPQTQHV", - "TARPGPRAV", "TDKSFVEK", - "TDRETGKL", "TEKLVTSK", + "TEKLVTSKG", "TGSETESPRNPSSA", "THQPPAPNS", - "THYDPPRK", - "TKELPSGKKY", "TKGGDAPAAGEDA", + "TKKVPQVS", + "TPPGVRKI", "TSGPGSRISSSS", - "TSTPNAKTV", - "TTPISEQKG", + "TTNLTEEEEKSKS", + "TTTHITKTV", + "TVIGPDGHKE", "TVKDSRTVY", + "TVQNEANKY", + "VAPPKAHEV", + "VASEGIKRY", "VHLTPEEK", "VITDKEKAE", "VPKEGKVV", - "VQKTIAEN", - "VVRHQLLKT", - "VYAQKHQQL", - "VYGKTSHL", + "VSKGTLVQTKGT", "YADEKTKDV", + "YARLHPRAV", "YGSTVSKRV", + "YPAKAKGTF", "YTKKLNTQ", - "YTM(Oxidation)KKVHAL", - "YVGDEAQSKRG" + "YTM(Oxidation)KKVHAL" ] ] ] @@ -306,6 +307,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-12T11:49:23.238361062" + "timestamp": "2026-02-12T13:55:37.104254648" } } \ No newline at end of file diff --git a/tests/speclib.nf.test.snap b/tests/speclib.nf.test.snap index 81e68530..75888c05 100644 --- a/tests/speclib.nf.test.snap +++ b/tests/speclib.nf.test.snap @@ -139,6 +139,7 @@ "AAAAAAHRL", "AAATVTKKV", "AAHPNVQKV", + "AAKDPSPSV", "AAM(Oxidation)SVAKRV", "AANAQPHKL", "AANDKLKKM", @@ -157,6 +158,7 @@ "AATVTKKTY", "AKDVKFGAD", "ALKDKIEKA", + "ALKDSVQRA", "ALKENGGARLA", "ALSDLHAHK", "AM(Oxidation)AARPHSI", @@ -170,23 +172,27 @@ "AVM(Oxidation)GNPKVKA", "AVVVKKIETRDG", "DAAVHQRI", + "DAKKQIKQV", "DAPAGRKV", "DGKKKISTV", "DHVITNM(Oxidation)N", "DPM(Oxidation)KARVV", "DPPKTHVT", "DPPRDSKGL", + "DSKKSQPKI", "EAKTHEAQI", + "EDRDDNKVY", "EYSKQM(Oxidation)QRF", "FADPHSKRV", "FPHSAHQKY", "FPSRGKSSSY", + "GKVGAHAGEY", "GKVGAHAGEYG", "GLAKSIHHA", "GMAKKVTKA", "GNVAEGETKPD", "GPNKKPRF", - "GPRVVERH", + "GRPM(Oxidation)PPSRR", "GRVVEPKR", "GVM(Oxidation)VGM(Oxidation)GQKD", "HAAENPGKY", @@ -227,21 +233,24 @@ "KASGTLREY", "KAYGKAKSI", "KAYSEAHEI", + "KHANQVLSL", "KLAESVEKA", "KLAPPPKKA", "KLDNQVSKV", "KLM(Oxidation)QQQQEV", + "KLQPGSVKKV", "KLSPKAEEV", "KM(Oxidation)DESKHEI", "KM(Oxidation)LDHEYTT", "KMDESKHEI", "KMQEHSDQV", - "KRSSPETL", "KSKEFVQKV", "KTKEGVREV", + "KVAQPKEV", "KVIDTQQKV", "KVSNSGITRV", "KVVNPTQK", + "KYLGKTHNL", "KYNRQSM(Oxidation)TL", "KYQPKPKQI", "KYTPPPHHI", @@ -271,18 +280,20 @@ "NLAEKPKTV", "NLKVKGPVR", "NLRPKKKV", - "NLSSLSKK", + "NLRPKKKVK", "NLTEEEEKSKS", "NNLSSLSKK", "NPAAYENDK", "NPFGGASHAKG", "NPKESSSSL", - "NSHSTTSSF", "NTKIGPRR", "NVDYSKLKK", "NVINGGSHA", "NVKIVKVKKE", + "NYTKEHNNL", "PKSKELVSSSS", + "PPNKKPKV", + "PVEKALRD", "QAGPINREM(Oxidation)", "QALKHLKQY", "QGVM(Oxidation)VGM(Oxidation)GQK", @@ -290,16 +301,21 @@ "QPAKADKESF", "QPHKVTQY", "QTHQPPAPNS", + "QVKPNSNQV", "QYKKDGADF", + "RADKKAPR", "RLAEAHAKV", - "RLGPTGKEV", "RLHEKIQEA", + "RLNNKSAKV", "RPKKPGQSF", "RPVPKGATY", + "RQVTGVTRV", "RSNEHIREL", "RSTENVNKL", "RSTQYM(Oxidation)KEY", "RVAGIHKKV", + "RYDDM(Oxidation)AAAM(Oxidation)", + "RYIDLHSNR", "RYIDTHNRV", "RYM(Oxidation)NHM(Oxidation)QSL", "SAKLERSHY", @@ -314,6 +330,7 @@ "SAVDRQREY", "SAYANAKKY", "SEVAHRFK", + "SIVGRPRH", "SKEYFSKQ", "SLDKTSHSV", "SLDTQPKKV", @@ -327,19 +344,24 @@ "SYVGDEAQSKR", "SYVGDEAQSKRG", "TALAPSTM(Oxidation)K", + "TAPQTQHV", "TARPGPRAV", "TDKSFVEK", + "TDRETGKL", "TEKLVTSK", "TEKLVTSKG", "TGYYGKGKP", "THQPPAPNS", "THYDPPRK", - "TIEQEKRSEIS", "TIGEGQQHHLG", - "TKKVPQVS", + "TISRPKGVA", + "TKELPSGKKY", + "TLVQTKGT", + "TNNLRPKKKVK", "TPPGVRKI", "TRLSRTPGNR", "TSGPGSRISSSS", + "TSTPNAKTV", "TTPISEQKG", "TTTHITKTV", "TVIGPDGHKE", @@ -374,6 +396,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-10T20:58:29.771826041" + "timestamp": "2026-02-12T14:02:45.605055829" } } \ No newline at end of file diff --git a/tests/test_single_quant.nf.test.snap b/tests/test_single_quant.nf.test.snap index b9265972..841f5149 100644 --- a/tests/test_single_quant.nf.test.snap +++ b/tests/test_single_quant.nf.test.snap @@ -127,6 +127,7 @@ "AAAAAAHRL", "AAATVTKKV", "AAHPNVQKV", + "AAKDPSPSV", "AAM(Oxidation)SVAKRV", "AANAQPHKL", "AANDKLKKM", @@ -145,6 +146,7 @@ "AATVTKKTY", "AKDVKFGAD", "ALKDKIEKA", + "ALKDSVQRA", "ALKENGGARLA", "ALSDLHAHK", "AM(Oxidation)AARPHSI", @@ -158,23 +160,27 @@ "AVM(Oxidation)GNPKVKA", "AVVVKKIETRDG", "DAAVHQRI", + "DAKKQIKQV", "DAPAGRKV", "DGKKKISTV", "DHVITNM(Oxidation)N", "DPM(Oxidation)KARVV", "DPPKTHVT", "DPPRDSKGL", + "DSKKSQPKI", "EAKTHEAQI", + "EDRDDNKVY", "EYSKQM(Oxidation)QRF", "FADPHSKRV", "FPHSAHQKY", "FPSRGKSSSY", + "GKVGAHAGEY", "GKVGAHAGEYG", "GLAKSIHHA", "GMAKKVTKA", "GNVAEGETKPD", "GPNKKPRF", - "GPRVVERH", + "GRPM(Oxidation)PPSRR", "GRVVEPKR", "GVM(Oxidation)VGM(Oxidation)GQKD", "HAAENPGKY", @@ -215,21 +221,24 @@ "KASGTLREY", "KAYGKAKSI", "KAYSEAHEI", + "KHANQVLSL", "KLAESVEKA", "KLAPPPKKA", "KLDNQVSKV", "KLM(Oxidation)QQQQEV", + "KLQPGSVKKV", "KLSPKAEEV", "KM(Oxidation)DESKHEI", "KM(Oxidation)LDHEYTT", "KMDESKHEI", "KMQEHSDQV", - "KRSSPETL", "KSKEFVQKV", "KTKEGVREV", + "KVAQPKEV", "KVIDTQQKV", "KVSNSGITRV", "KVVNPTQK", + "KYLGKTHNL", "KYNRQSM(Oxidation)TL", "KYQPKPKQI", "KYTPPPHHI", @@ -259,18 +268,20 @@ "NLAEKPKTV", "NLKVKGPVR", "NLRPKKKV", - "NLSSLSKK", + "NLRPKKKVK", "NLTEEEEKSKS", "NNLSSLSKK", "NPAAYENDK", "NPFGGASHAKG", "NPKESSSSL", - "NSHSTTSSF", "NTKIGPRR", "NVDYSKLKK", "NVINGGSHA", "NVKIVKVKKE", + "NYTKEHNNL", "PKSKELVSSSS", + "PPNKKPKV", + "PVEKALRD", "QAGPINREM(Oxidation)", "QALKHLKQY", "QGVM(Oxidation)VGM(Oxidation)GQK", @@ -278,16 +289,21 @@ "QPAKADKESF", "QPHKVTQY", "QTHQPPAPNS", + "QVKPNSNQV", "QYKKDGADF", + "RADKKAPR", "RLAEAHAKV", - "RLGPTGKEV", "RLHEKIQEA", + "RLNNKSAKV", "RPKKPGQSF", "RPVPKGATY", + "RQVTGVTRV", "RSNEHIREL", "RSTENVNKL", "RSTQYM(Oxidation)KEY", "RVAGIHKKV", + "RYDDM(Oxidation)AAAM(Oxidation)", + "RYIDLHSNR", "RYIDTHNRV", "RYM(Oxidation)NHM(Oxidation)QSL", "SAKLERSHY", @@ -302,6 +318,7 @@ "SAVDRQREY", "SAYANAKKY", "SEVAHRFK", + "SIVGRPRH", "SKEYFSKQ", "SLDKTSHSV", "SLDTQPKKV", @@ -315,19 +332,24 @@ "SYVGDEAQSKR", "SYVGDEAQSKRG", "TALAPSTM(Oxidation)K", + "TAPQTQHV", "TARPGPRAV", "TDKSFVEK", + "TDRETGKL", "TEKLVTSK", "TEKLVTSKG", "TGYYGKGKP", "THQPPAPNS", "THYDPPRK", - "TIEQEKRSEIS", "TIGEGQQHHLG", - "TKKVPQVS", + "TISRPKGVA", + "TKELPSGKKY", + "TLVQTKGT", + "TNNLRPKKKVK", "TPPGVRKI", "TRLSRTPGNR", "TSGPGSRISSSS", + "TSTPNAKTV", "TTPISEQKG", "TTTHITKTV", "TVIGPDGHKE", @@ -362,6 +384,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-10T20:57:05.070921205" + "timestamp": "2026-02-12T14:09:29.998035249" } } \ No newline at end of file From 92f3f4b636f3be5bef13d33366a054fe2c91b62d Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 12 Feb 2026 16:50:25 +0000 Subject: [PATCH 071/104] Add search_presets.tsv, remove old search_presets.config, simplify input schema --- assets/schema_input.json | 100 +-------------------------- assets/search_presets.tsv | 11 +++ conf/search_presets.config | 138 ------------------------------------- 3 files changed, 13 insertions(+), 236 deletions(-) create mode 100644 assets/search_presets.tsv delete mode 100644 conf/search_presets.config diff --git a/assets/schema_input.json b/assets/schema_input.json index 25416d13..4b66bcf1 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -40,105 +40,9 @@ }, "SearchPreset": { "type": "string", - "enum": [ - "lumos_class1", - "lumos_class2", - "qe_class1", - "qe_class2", - "timstof_class1", - "timstof_class2", - "xl_class1", - "xl_class2" - ], - "errorMessage": "SearchPreset must be one of: lumos_class1, lumos_class2, qe_class1, qe_class2, timstof_class1, timstof_class2, xl_class1, xl_class2. Can be extended upon request.", + "pattern": "^[a-zA-Z0-9_]+$", + "errorMessage": "SearchPreset must contain only alphanumeric characters and underscores", "meta": ["search_preset"] - }, - "PeptideMinLength": { - "type": "integer", - "minimum": 1, - "errorMessage": "PeptideMinLength must be a positive integer", - "meta": ["peptide_min_length"] - }, - "PeptideMaxLength": { - "type": "integer", - "minimum": 1, - "errorMessage": "PeptideMaxLength must be a positive integer", - "meta": ["peptide_max_length"] - }, - "PrecursorMassRange": { - "type": "string", - "pattern": "^\\d+:\\d+$", - "errorMessage": "PrecursorMassRange must be in format 'min:max' (e.g., '800:2500')", - "meta": ["digest_mass_range"] - }, - "PrecursorCharge": { - "type": "string", - "pattern": "^\\d+:\\d+$", - "errorMessage": "PrecursorCharge must be in format 'min:max' (e.g., '2:3')", - "meta": ["prec_charge"] - }, - "PrecursorMassTolerance": { - "type": "integer", - "minimum": 0, - "errorMessage": "PrecursorMassTolerance must be a non-negative integer", - "meta": ["precursor_mass_tolerance"] - }, - "FragmentMassTolerance": { - "type": "number", - "minimum": 0, - "errorMessage": "FragmentMassTolerance must be a non-negative number", - "meta": ["fragment_mass_tolerance"] - }, - "FragmentBinOffset": { - "type": "number", - "minimum": 0, - "errorMessage": "FragmentBinOffset is recommended to be 0 for high res and 0.4 for low res devices.", - "meta": ["fragment_bin_offset"] - }, - "MS2PIPModel": { - "type": "string", - "enum": [ - "Immuno-HCD", - "timsTOF", - "CIDch2", - "HCD", - "CID", - "ITMS", - "iTRAQ", - "iTRAQphospho", - "TMT", - "HCDch2" - ], - "errorMessage": "MS2PIPModel must be a valid MS2PIP model name", - "meta": ["ms2pip_model"] - }, - "ActivationMethod": { - "type": "string", - "enum": ["ALL", "CID", "HCD", "ETD", "ECD", "EThcD", "ETciD"], - "errorMessage": "ActivationMethod must be one of: ALL, CID, HCD, ETD, ECD, EThcD, ETciD", - "meta": ["activation_method"] - }, - "Instrument": { - "type": "string", - "enum": ["high_res", "low_res"], - "errorMessage": "Instrument must be either 'high_res' or 'low_res'", - "meta": ["instrument"] - }, - "NumberMods": { - "type": "integer", - "minimum": 0, - "errorMessage": "NumberMods must be a non-negative integer", - "meta": ["number_mods"] - }, - "FixedMods": { - "type": "string", - "errorMessage": "FixedMods must be a comma-separated list of UNIMOD modification names", - "meta": ["fixed_mods"] - }, - "VariableMods": { - "type": "string", - "errorMessage": "VariableMods must be a comma-separated list of UNIMOD modification names", - "meta": ["variable_mods"] } }, "required": ["ID", "Sample", "Condition", "ReplicateFileName"] diff --git a/assets/search_presets.tsv b/assets/search_presets.tsv new file mode 100644 index 00000000..843a32fe --- /dev/null +++ b/assets/search_presets.tsv @@ -0,0 +1,11 @@ +PresetName PeptideMinLength PeptideMaxLength PrecursorMassRange PrecursorCharge PrecursorMassTolerance FragmentMassTolerance FragmentBinOffset MS2PIPModel ActivationMethod Instrument NumberMods FixedMods VariableMods +lumos_class1 8 14 800:2500 2:3 5 0.02 0.0 Immuno-HCD HCD high_res 3 Oxidation (M) +lumos_class2 8 30 800:5000 2:5 5 0.02 0.0 Immuno-HCD HCD high_res 5 Oxidation (M) +qe_class1 8 14 800:2500 2:3 5 0.02 0.0 Immuno-HCD HCD high_res 3 Oxidation (M) +qe_class2 8 30 800:5000 2:5 5 0.02 0.0 Immuno-HCD HCD high_res 5 Oxidation (M) +timstof_class1 8 14 800:2500 1:4 20 0.02 0.0 timsTOF CID high_res 3 Oxidation (M) +timstof_class2 8 30 800:5000 1:5 20 0.02 0.0 timsTOF CID high_res 5 Oxidation (M) +astral_class1 8 14 800:2500 2:3 5 0.02 0.0 Immuno-HCD HCD high_res 3 Oxidation (M) +astral_class2 8 30 800:5000 2:5 5 0.02 0.0 Immuno-HCD HCD high_res 5 Oxidation (M) +xl_class1 8 14 800:2500 2:3 5 0.50025 0.4 CIDch2 CID low_res 3 Oxidation (M) +xl_class2 8 30 800:5000 2:5 5 0.50025 0.4 CIDch2 CID low_res 5 Oxidation (M) diff --git a/conf/search_presets.config b/conf/search_presets.config deleted file mode 100644 index 6ac3cd52..00000000 --- a/conf/search_presets.config +++ /dev/null @@ -1,138 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Search parameter presets for different MHC classes and instruments -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Define preset parameter maps that can be referenced in the samplesheet - via the SearchPreset column. Parameters specified in the samplesheet - individually will override preset values. ----------------------------------------------------------------------------------------- -*/ - -params { - search_presets = [ - // Lumos instrument presets - 'lumos_class1': [ - peptide_min_length: 8, - peptide_max_length: 14, - digest_mass_range: '800:2500', - prec_charge: '2:3', - precursor_mass_tolerance: 5, - fragment_mass_tolerance: 0.02, - fragment_bin_offset: 0.0, - ms2pip_model: 'Immuno-HCD', - activation_method: 'HCD', - instrument: 'high_res', - number_mods: 3, - fixed_mods: ' ', - variable_mods: 'Oxidation (M)' - ], - 'lumos_class2': [ - peptide_min_length: 8, - peptide_max_length: 30, - digest_mass_range: '800:5000', - prec_charge: '2:5', - precursor_mass_tolerance: 5, - fragment_mass_tolerance: 0.02, - fragment_bin_offset: 0.0, - ms2pip_model: 'Immuno-HCD', - activation_method: 'HCD', - instrument: 'high_res', - number_mods: 5, - fixed_mods: ' ', - variable_mods: 'Oxidation (M)' - ], - // Q Exactive instrument presets - 'qe_class1': [ - peptide_min_length: 8, - peptide_max_length: 14, - digest_mass_range: '800:2500', - prec_charge: '2:3', - precursor_mass_tolerance: 5, - fragment_mass_tolerance: 0.02, - fragment_bin_offset: 0.0, - ms2pip_model: 'Immuno-HCD', - activation_method: 'HCD', - instrument: 'high_res', - number_mods: 3, - fixed_mods: ' ', - variable_mods: 'Oxidation (M)' - ], - 'qe_class2': [ - peptide_min_length: 8, - peptide_max_length: 30, - digest_mass_range: '800:5000', - prec_charge: '2:5', - precursor_mass_tolerance: 5, - fragment_mass_tolerance: 0.02, - fragment_bin_offset: 0.0, - ms2pip_model: 'Immuno-HCD', - activation_method: 'HCD', - instrument: 'high_res', - number_mods: 5, - fixed_mods: ' ', - variable_mods: 'Oxidation (M)' - ], - // timsTOF instrument presets - 'timstof_class1': [ - peptide_min_length: 8, - peptide_max_length: 14, - digest_mass_range: '800:2500', - prec_charge: '1:4', - precursor_mass_tolerance: 20, - fragment_mass_tolerance: 0.02, - fragment_bin_offset: 0.0, - ms2pip_model: 'timsTOF', - activation_method: 'CID', - instrument: 'high_res', - number_mods: 3, - fixed_mods: ' ', - variable_mods: 'Oxidation (M)' - ], - 'timstof_class2': [ - peptide_min_length: 8, - peptide_max_length: 30, - digest_mass_range: '800:5000', - prec_charge: '1:5', - precursor_mass_tolerance: 20, - fragment_mass_tolerance: 0.02, - fragment_bin_offset: 0.0, - ms2pip_model: 'timsTOF', - activation_method: 'CID', - instrument: 'high_res', - number_mods: 5, - fixed_mods: ' ', - variable_mods: 'Oxidation (M)' - ], - // Exactive XL (low-resolution) instrument presets - 'xl_class1': [ - peptide_min_length: 8, - peptide_max_length: 14, - digest_mass_range: '800:2500', - prec_charge: '2:3', - precursor_mass_tolerance: 5, - fragment_mass_tolerance: 0.50025, - fragment_bin_offset: 0.4, - ms2pip_model: 'CIDch2', - activation_method: 'CID', - instrument: 'low_res', - number_mods: 3, - fixed_mods: ' ', - variable_mods: 'Oxidation (M)' - ], - 'xl_class2': [ - peptide_min_length: 8, - peptide_max_length: 30, - digest_mass_range: '800:5000', - prec_charge: '2:5', - precursor_mass_tolerance: 5, - fragment_mass_tolerance: 0.50025, - fragment_bin_offset: 0.4, - ms2pip_model: 'CIDch2', - activation_method: 'CID', - instrument: 'low_res', - number_mods: 5, - fixed_mods: ' ', - variable_mods: 'Oxidation (M)' - ] - ] -} From 2ae3aa69cb2ba3ca119ea1ed61b3fda14814faf7 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 12 Feb 2026 21:47:44 +0000 Subject: [PATCH 072/104] Update search_presets test for qe/lumos groups with stable snapshot --- tests/search_presets.nf.test | 5 +- tests/search_presets.nf.test.snap | 198 ++++++++++++++++++++++++++++-- 2 files changed, 189 insertions(+), 14 deletions(-) diff --git a/tests/search_presets.nf.test b/tests/search_presets.nf.test index 878fcb1b..d0da4a54 100644 --- a/tests/search_presets.nf.test +++ b/tests/search_presets.nf.test @@ -19,10 +19,10 @@ nextflow_pipeline { def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') - // Extract peptidoform column from all TSV files + // Extract peptidoform column from result TSV files (qe and lumos groups) def peptidoform_data = [] new File(params.outdir).eachFileRecurse { file -> - if (file.name.endsWith('.tsv')) { + if (file.name.endsWith('.tsv') && file.parentFile.path == params.outdir) { def lines = file.readLines() if (lines.size() > 0) { def header = lines[0].split('\t') @@ -37,6 +37,7 @@ nextflow_pipeline { } } } + peptidoform_data.sort { it[0] } assertAll( { assert workflow.success}, { assert snapshot( diff --git a/tests/search_presets.nf.test.snap b/tests/search_presets.nf.test.snap index 2c22b01b..48bd8255 100644 --- a/tests/search_presets.nf.test.snap +++ b/tests/search_presets.nf.test.snap @@ -45,22 +45,22 @@ } }, [ - "HepG2_ClassI.tsv", - "HepG2_ClassII.tsv", + "HepG2_lumos.tsv", + "HepG2_qe.tsv", "intermediate_results", "intermediate_results/comet", "intermediate_results/comet/HepG2_rep1_small_pin.tsv", "intermediate_results/comet/HepG2_rep2_small_pin.tsv", "intermediate_results/comet/HepG2_rep3_small_pin.tsv", "intermediate_results/rescoring", - "intermediate_results/rescoring/HepG2_ClassII_ms2rescore.idXML", - "intermediate_results/rescoring/HepG2_ClassII_pout.idXML", - "intermediate_results/rescoring/HepG2_ClassII_pout_filtered.idXML", - "intermediate_results/rescoring/HepG2_ClassII_psm.idXML", - "intermediate_results/rescoring/HepG2_ClassI_ms2rescore.idXML", - "intermediate_results/rescoring/HepG2_ClassI_pout.idXML", - "intermediate_results/rescoring/HepG2_ClassI_pout_filtered.idXML", - "intermediate_results/rescoring/HepG2_ClassI_psm.idXML", + "intermediate_results/rescoring/HepG2_lumos_ms2rescore.idXML", + "intermediate_results/rescoring/HepG2_lumos_pout.idXML", + "intermediate_results/rescoring/HepG2_lumos_pout_filtered.idXML", + "intermediate_results/rescoring/HepG2_lumos_psm.idXML", + "intermediate_results/rescoring/HepG2_qe_ms2rescore.idXML", + "intermediate_results/rescoring/HepG2_qe_pout.idXML", + "intermediate_results/rescoring/HepG2_qe_pout_filtered.idXML", + "intermediate_results/rescoring/HepG2_qe_psm.idXML", "multiqc", "multiqc/ms2rescore", "multiqc/multiqc_data", @@ -127,7 +127,181 @@ ], [ [ - "HepG2_ClassI.tsv", + "HepG2_lumos.tsv", + [ + "AAAAAAHRL", + "AAATVTKKV", + "AAM(Oxidation)SVAKRV", + "AANAQPHKL", + "AANDKLKKM", + "AAPPPPAHA", + "AAPRPPPKPM(Oxidation)", + "AAQAHTREL", + "AARAEAREI", + "AASSLKKQY", + "AATPAKKTV", + "AKDVKFGAD", + "ALKDKIEKA", + "ALKDSVQRA", + "ALKKALAAA", + "ALSDLHAHK", + "AM(Oxidation)AASPHAV", + "AM(Oxidation)ASHLTST", + "AM(Oxidation)HGHVEVV", + "AM(Oxidation)NARPHKV", + "AMNARPHKV", + "APPKAHEV", + "APRADAKAY", + "AVM(Oxidation)GNPKVKA", + "AVM(Oxidation)GNPKVKAH", + "DAKKQIKQV", + "DAPAGRKV", + "DGKKKISTV", + "DHVITNM(Oxidation)N", + "DPM(Oxidation)KARVV", + "DPPRDSKGL", + "EYSKQM(Oxidation)QRF", + "FADPHSKRV", + "GKVGAHAGEY", + "GKVGAHAGEYG", + "GLAKSIHHA", + "GMAKKVTKA", + "GNVAEGETKPD", + "GPNKKPRF", + "GPRVVERH", + "GRVVEPKR", + "GVM(Oxidation)VGM(Oxidation)GQKD", + "HAAENPGKY", + "HAANPNGRYY", + "HAASRIKTI", + "HAATYTKKV", + "HAGPTAHEL", + "HAKEKLTAL", + "HAM(Oxidation)EEVKKF", + "HAPELTKKV", + "HPESERISM(Oxidation)", + "HPGRPQPPA", + "HPNKVKVY", + "HPYQPDPKM(Oxidation)", + "HSRNEGVATY", + "HSSPASSNY", + "HVKDANGNSF", + "HVSTHQHNY", + "IASQTVKKV", + "IKTVETRD", + "ISSEAHREV", + "IVGRPRHQ", + "KAAKPKVV", + "KAASHIKSI", + "KAISGVHTV", + "KAKPGTYKV", + "KAPPKPARA", + "KASEQAKVV", + "KASGTLREY", + "KAYGKAKSI", + "KGTGASGSF", + "KLAPPPKKA", + "KLQPGSVKKV", + "KM(Oxidation)LDHEYTT", + "KMDESKHEI", + "KMNESTRSV", + "KSKEFVQKV", + "KTKEGVREV", + "KVSLGHAAR", + "KVVNPTQK", + "KYLGKTHNL", + "KYNRQSM(Oxidation)TL", + "KYQPKPKQI", + "KYTPPPHHI", + "LAKTGVHHY", + "LLKSEKSSY", + "LPSENHKEM", + "LPSENHKEM(Oxidation)", + "M(Oxidation)PNKVRKI", + "M(Oxidation)PPEHVRKI", + "M(Oxidation)PQGGGQHY", + "M(Oxidation)PQKERESI", + "MPNKVRKI", + "NAHGEPRNY", + "NALAHKYH", + "NAM(Oxidation)KIRDV", + "NATAVVRHM(Oxidation)", + "NGTHVVRHY", + "NIQKITKS", + "NLSSLSKK", + "NLTEEEEKSKS", + "NNLSSLSKK", + "NPAAYENDK", + "NPFGGASHAKG", + "NPKREIQKI", + "NQNPGSPRPGSTG", + "NSHSTTSSF", + "NTKGGDAPAAGEDA", + "NTKIGPRR", + "NVINGGSHA", + "PPNKKPKV", + "QAGPINREM(Oxidation)", + "QAMDRAHRI", + "QPAKADKESF", + "QPHKVTQY", + "QTHQPPAPNS", + "QYKKDGADF", + "RLAEAHAKV", + "RLHEKIQEA", + "RMARTPQTV", + "RPKKPGQSF", + "RPVPKGATY", + "RSTQYM(Oxidation)KEY", + "RVAGIHKKV", + "SAKLERSHY", + "SAMSNPRAM(Oxidation)", + "SAQTTSHEL", + "SARAGETRF", + "SASEAAKKY", + "SATGHPRKV", + "SAVDRQREY", + "SEVAHRFK", + "SIVGRPRH", + "SKEYFSKQ", + "SLDTQPKKV", + "SM(Oxidation)LGSPHKV", + "SM(Oxidation)NTHLKAV", + "SM(Oxidation)PEQAHKV", + "SPNKHNRLY", + "SQRFPKAE", + "SVQVFGRKK", + "SYVGDEAQSKR", + "SYVGDEAQSKRG", + "TAPQTQHV", + "TARPGPRAV", + "TDKSFVEK", + "TDRETGKL", + "TEKLVTSK", + "TGSETESPRNPSSA", + "THQPPAPNS", + "THYDPPRK", + "TKELPSGKKY", + "TKGGDAPAAGEDA", + "TSGPGSRISSSS", + "TSTPNAKTV", + "TTPISEQKG", + "TVKDSRTVY", + "VHLTPEEK", + "VITDKEKAE", + "VPKEGKVV", + "VQKTIAEN", + "VVRHQLLKT", + "VYAQKHQQL", + "VYGKTSHL", + "YADEKTKDV", + "YGSTVSKRV", + "YTKKLNTQ", + "YTM(Oxidation)KKVHAL", + "YVGDEAQSKRG" + ] + ], + [ + "HepG2_qe.tsv", [ "AAATVTKKV", "AAM(Oxidation)SVAKRV", @@ -307,6 +481,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-12T13:55:37.104254648" + "timestamp": "2026-02-12T21:40:36.65796788" } } \ No newline at end of file From 8669e5063622303834d98a975d8e51db06b4ed1e Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 13 Feb 2026 13:18:11 +0000 Subject: [PATCH 073/104] Add PrecursorErrorUnit to presets, fix fragment_mass_tolerance to 0.01, make test robust --- assets/schema_search_presets.json | 6 + assets/search_presets.tsv | 22 +- conf/modules.config | 2 +- .../utils_nfcore_mhcquant_pipeline/main.nf | 5 +- tests/search_presets.nf.test | 26 +- tests/search_presets.nf.test.snap | 355 +----------------- 6 files changed, 31 insertions(+), 385 deletions(-) diff --git a/assets/schema_search_presets.json b/assets/schema_search_presets.json index a4ce7c1e..91b85fc2 100644 --- a/assets/schema_search_presets.json +++ b/assets/schema_search_presets.json @@ -43,6 +43,12 @@ "errorMessage": "PrecursorMassTolerance must be a non-negative number", "meta": ["precursor_mass_tolerance"] }, + "PrecursorErrorUnit": { + "type": "string", + "enum": ["ppm", "Da"], + "errorMessage": "PrecursorErrorUnit must be either 'ppm' or 'Da'", + "meta": ["precursor_error_units"] + }, "FragmentMassTolerance": { "type": "number", "minimum": 0, diff --git a/assets/search_presets.tsv b/assets/search_presets.tsv index 843a32fe..1f49d97e 100644 --- a/assets/search_presets.tsv +++ b/assets/search_presets.tsv @@ -1,11 +1,11 @@ -PresetName PeptideMinLength PeptideMaxLength PrecursorMassRange PrecursorCharge PrecursorMassTolerance FragmentMassTolerance FragmentBinOffset MS2PIPModel ActivationMethod Instrument NumberMods FixedMods VariableMods -lumos_class1 8 14 800:2500 2:3 5 0.02 0.0 Immuno-HCD HCD high_res 3 Oxidation (M) -lumos_class2 8 30 800:5000 2:5 5 0.02 0.0 Immuno-HCD HCD high_res 5 Oxidation (M) -qe_class1 8 14 800:2500 2:3 5 0.02 0.0 Immuno-HCD HCD high_res 3 Oxidation (M) -qe_class2 8 30 800:5000 2:5 5 0.02 0.0 Immuno-HCD HCD high_res 5 Oxidation (M) -timstof_class1 8 14 800:2500 1:4 20 0.02 0.0 timsTOF CID high_res 3 Oxidation (M) -timstof_class2 8 30 800:5000 1:5 20 0.02 0.0 timsTOF CID high_res 5 Oxidation (M) -astral_class1 8 14 800:2500 2:3 5 0.02 0.0 Immuno-HCD HCD high_res 3 Oxidation (M) -astral_class2 8 30 800:5000 2:5 5 0.02 0.0 Immuno-HCD HCD high_res 5 Oxidation (M) -xl_class1 8 14 800:2500 2:3 5 0.50025 0.4 CIDch2 CID low_res 3 Oxidation (M) -xl_class2 8 30 800:5000 2:5 5 0.50025 0.4 CIDch2 CID low_res 5 Oxidation (M) +PresetName PeptideMinLength PeptideMaxLength PrecursorMassRange PrecursorCharge PrecursorMassTolerance PrecursorErrorUnit FragmentMassTolerance FragmentBinOffset MS2PIPModel ActivationMethod Instrument NumberMods FixedMods VariableMods +lumos_class1 8 14 800:2500 2:3 5 ppm 0.01 0.0 Immuno-HCD HCD high_res 3 Oxidation (M) +lumos_class2 8 30 800:5000 2:5 5 ppm 0.01 0.0 Immuno-HCD HCD high_res 5 Oxidation (M) +qe_class1 8 14 800:2500 2:3 5 ppm 0.01 0.0 Immuno-HCD HCD high_res 3 Oxidation (M) +qe_class2 8 30 800:5000 2:5 5 ppm 0.01 0.0 Immuno-HCD HCD high_res 5 Oxidation (M) +timstof_class1 8 14 800:2500 1:4 20 ppm 0.01 0.0 timsTOF CID high_res 3 Oxidation (M) +timstof_class2 8 30 800:5000 1:5 20 ppm 0.01 0.0 timsTOF CID high_res 5 Oxidation (M) +astral_class1 8 14 800:2500 2:3 5 ppm 0.01 0.0 Immuno-HCD HCD high_res 3 Oxidation (M) +astral_class2 8 30 800:5000 2:5 5 ppm 0.01 0.0 Immuno-HCD HCD high_res 5 Oxidation (M) +xl_class1 8 14 800:2500 2:3 5 ppm 0.50025 0.4 CIDch2 CID low_res 3 Oxidation (M) +xl_class2 8 30 800:5000 2:5 5 ppm 0.50025 0.4 CIDch2 CID low_res 5 Oxidation (M) diff --git a/conf/modules.config b/conf/modules.config index dd09a662..4e260090 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -98,7 +98,7 @@ process { "-spectrum_batch_size ${params.spectrum_batch_size}", "-activation_method ${meta.activation_method}", "-precursor_mass_tolerance ${meta.precursor_mass_tolerance}", - "-precursor_error_units ${params.precursor_error_units}", + "-precursor_error_units ${meta.precursor_error_units}", "-fragment_mass_tolerance ${meta.fragment_mass_tolerance}", "-fragment_bin_offset ${meta.fragment_bin_offset}", "-num_hits ${params.num_hits}", diff --git a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf index 0aa39f09..42809878 100644 --- a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf @@ -237,8 +237,9 @@ workflow PIPELINE_COMPLETION { // def resolveSearchParams(meta, presetsMap) { def searchParamKeys = ['instrument', 'activation_method', 'digest_mass_range', 'prec_charge', - 'precursor_mass_tolerance', 'fragment_mass_tolerance', 'fragment_bin_offset', - 'number_mods', 'ms2pip_model', 'peptide_min_length', 'peptide_max_length', + 'precursor_mass_tolerance', 'precursor_error_units', 'fragment_mass_tolerance', + 'fragment_bin_offset', 'number_mods', 'ms2pip_model', + 'peptide_min_length', 'peptide_max_length', 'fixed_mods', 'variable_mods'] def presetName = meta.search_preset def hasPreset = presetName && !(presetName instanceof List && presetName.size() == 0) && presetName != '' diff --git a/tests/search_presets.nf.test b/tests/search_presets.nf.test index d0da4a54..a4ea4e14 100644 --- a/tests/search_presets.nf.test +++ b/tests/search_presets.nf.test @@ -19,25 +19,16 @@ nextflow_pipeline { def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') - // Extract peptidoform column from result TSV files (qe and lumos groups) - def peptidoform_data = [] + // Count peptidoforms from result TSV files (non-deterministic due to MS2Rescore/Percolator FDR) + def totalPeptidoforms = 0 new File(params.outdir).eachFileRecurse { file -> if (file.name.endsWith('.tsv') && file.parentFile.path == params.outdir) { def lines = file.readLines() - if (lines.size() > 0) { - def header = lines[0].split('\t') - def peptidoformIndex = header.findIndexOf { it == 'peptidoform' } - if (peptidoformIndex >= 0) { - def peptidoforms = lines.drop(1).collect { line -> - def fields = line.split('\t') - fields.size() > peptidoformIndex ? fields[peptidoformIndex] : '' - }.findAll { it != '' }.sort() - peptidoform_data.add([file.name, peptidoforms]) - } + if (lines.size() > 1) { + totalPeptidoforms += lines.size() - 1 } } } - peptidoform_data.sort { it[0] } assertAll( { assert workflow.success}, { assert snapshot( @@ -46,10 +37,11 @@ nextflow_pipeline { // All stable path name, with a relative path stable_name, // All files with stable contents - stable_path, - // Peptidoform data from TSV files - peptidoform_data - ).match() } + stable_path + ).match() }, + // MS2Rescore is non-deterministic, so exact peptide lists vary between runs. + // Check that at least one preset group produced peptides (FDR < 0.01). + { assert totalPeptidoforms >= 100 : "Expected at least 100 peptidoforms across all groups, got ${totalPeptidoforms}" } ) } } diff --git a/tests/search_presets.nf.test.snap b/tests/search_presets.nf.test.snap index 48bd8255..f955f1a8 100644 --- a/tests/search_presets.nf.test.snap +++ b/tests/search_presets.nf.test.snap @@ -49,8 +49,6 @@ "HepG2_qe.tsv", "intermediate_results", "intermediate_results/comet", - "intermediate_results/comet/HepG2_rep1_small_pin.tsv", - "intermediate_results/comet/HepG2_rep2_small_pin.tsv", "intermediate_results/comet/HepG2_rep3_small_pin.tsv", "intermediate_results/rescoring", "intermediate_results/rescoring/HepG2_lumos_ms2rescore.idXML", @@ -124,363 +122,12 @@ ], [ - ], - [ - [ - "HepG2_lumos.tsv", - [ - "AAAAAAHRL", - "AAATVTKKV", - "AAM(Oxidation)SVAKRV", - "AANAQPHKL", - "AANDKLKKM", - "AAPPPPAHA", - "AAPRPPPKPM(Oxidation)", - "AAQAHTREL", - "AARAEAREI", - "AASSLKKQY", - "AATPAKKTV", - "AKDVKFGAD", - "ALKDKIEKA", - "ALKDSVQRA", - "ALKKALAAA", - "ALSDLHAHK", - "AM(Oxidation)AASPHAV", - "AM(Oxidation)ASHLTST", - "AM(Oxidation)HGHVEVV", - "AM(Oxidation)NARPHKV", - "AMNARPHKV", - "APPKAHEV", - "APRADAKAY", - "AVM(Oxidation)GNPKVKA", - "AVM(Oxidation)GNPKVKAH", - "DAKKQIKQV", - "DAPAGRKV", - "DGKKKISTV", - "DHVITNM(Oxidation)N", - "DPM(Oxidation)KARVV", - "DPPRDSKGL", - "EYSKQM(Oxidation)QRF", - "FADPHSKRV", - "GKVGAHAGEY", - "GKVGAHAGEYG", - "GLAKSIHHA", - "GMAKKVTKA", - "GNVAEGETKPD", - "GPNKKPRF", - "GPRVVERH", - "GRVVEPKR", - "GVM(Oxidation)VGM(Oxidation)GQKD", - "HAAENPGKY", - "HAANPNGRYY", - "HAASRIKTI", - "HAATYTKKV", - "HAGPTAHEL", - "HAKEKLTAL", - "HAM(Oxidation)EEVKKF", - "HAPELTKKV", - "HPESERISM(Oxidation)", - "HPGRPQPPA", - "HPNKVKVY", - "HPYQPDPKM(Oxidation)", - "HSRNEGVATY", - "HSSPASSNY", - "HVKDANGNSF", - "HVSTHQHNY", - "IASQTVKKV", - "IKTVETRD", - "ISSEAHREV", - "IVGRPRHQ", - "KAAKPKVV", - "KAASHIKSI", - "KAISGVHTV", - "KAKPGTYKV", - "KAPPKPARA", - "KASEQAKVV", - "KASGTLREY", - "KAYGKAKSI", - "KGTGASGSF", - "KLAPPPKKA", - "KLQPGSVKKV", - "KM(Oxidation)LDHEYTT", - "KMDESKHEI", - "KMNESTRSV", - "KSKEFVQKV", - "KTKEGVREV", - "KVSLGHAAR", - "KVVNPTQK", - "KYLGKTHNL", - "KYNRQSM(Oxidation)TL", - "KYQPKPKQI", - "KYTPPPHHI", - "LAKTGVHHY", - "LLKSEKSSY", - "LPSENHKEM", - "LPSENHKEM(Oxidation)", - "M(Oxidation)PNKVRKI", - "M(Oxidation)PPEHVRKI", - "M(Oxidation)PQGGGQHY", - "M(Oxidation)PQKERESI", - "MPNKVRKI", - "NAHGEPRNY", - "NALAHKYH", - "NAM(Oxidation)KIRDV", - "NATAVVRHM(Oxidation)", - "NGTHVVRHY", - "NIQKITKS", - "NLSSLSKK", - "NLTEEEEKSKS", - "NNLSSLSKK", - "NPAAYENDK", - "NPFGGASHAKG", - "NPKREIQKI", - "NQNPGSPRPGSTG", - "NSHSTTSSF", - "NTKGGDAPAAGEDA", - "NTKIGPRR", - "NVINGGSHA", - "PPNKKPKV", - "QAGPINREM(Oxidation)", - "QAMDRAHRI", - "QPAKADKESF", - "QPHKVTQY", - "QTHQPPAPNS", - "QYKKDGADF", - "RLAEAHAKV", - "RLHEKIQEA", - "RMARTPQTV", - "RPKKPGQSF", - "RPVPKGATY", - "RSTQYM(Oxidation)KEY", - "RVAGIHKKV", - "SAKLERSHY", - "SAMSNPRAM(Oxidation)", - "SAQTTSHEL", - "SARAGETRF", - "SASEAAKKY", - "SATGHPRKV", - "SAVDRQREY", - "SEVAHRFK", - "SIVGRPRH", - "SKEYFSKQ", - "SLDTQPKKV", - "SM(Oxidation)LGSPHKV", - "SM(Oxidation)NTHLKAV", - "SM(Oxidation)PEQAHKV", - "SPNKHNRLY", - "SQRFPKAE", - "SVQVFGRKK", - "SYVGDEAQSKR", - "SYVGDEAQSKRG", - "TAPQTQHV", - "TARPGPRAV", - "TDKSFVEK", - "TDRETGKL", - "TEKLVTSK", - "TGSETESPRNPSSA", - "THQPPAPNS", - "THYDPPRK", - "TKELPSGKKY", - "TKGGDAPAAGEDA", - "TSGPGSRISSSS", - "TSTPNAKTV", - "TTPISEQKG", - "TVKDSRTVY", - "VHLTPEEK", - "VITDKEKAE", - "VPKEGKVV", - "VQKTIAEN", - "VVRHQLLKT", - "VYAQKHQQL", - "VYGKTSHL", - "YADEKTKDV", - "YGSTVSKRV", - "YTKKLNTQ", - "YTM(Oxidation)KKVHAL", - "YVGDEAQSKRG" - ] - ], - [ - "HepG2_qe.tsv", - [ - "AAATVTKKV", - "AAM(Oxidation)SVAKRV", - "AANDKLKKM", - "AANPDPKKL", - "AAPPPPAHA", - "AAPRPPPKPM(Oxidation)", - "AAQAHTREL", - "AAQSEAKVV", - "AASPVGKRL", - "AASSLKKQY", - "AATPAKKTV", - "AATRWAKKI", - "AATSNLKKL", - "ALKDKIEKA", - "ALKDSVQRA", - "ALKENGGARLA", - "AM(Oxidation)AARPHSI", - "AM(Oxidation)AASPHAV", - "AM(Oxidation)ASHLTST", - "AM(Oxidation)HGHVEVV", - "AM(Oxidation)NARPHKV", - "AMNARPHKV", - "APPKAHEV", - "APRPPPKPM(Oxidation)", - "ASTQTTHEL", - "ATWSDPHKA", - "AVM(Oxidation)GNPKVKA", - "DAAVHQRI", - "DAPAGRKV", - "DPM(Oxidation)KARVV", - "DPPKTHVT", - "DPPRDSKGL", - "EYSKQM(Oxidation)QRF", - "FADPHSKRV", - "FPHSAHQKY", - "GKVGAHAGEYG", - "GLAKSIHHA", - "GMAKKVTKA", - "GNVAEGETKPD", - "GPRVVERH", - "GVM(Oxidation)VGM(Oxidation)GQKD", - "HAAENPGKY", - "HAATYTKKV", - "HAFGGNKASY", - "HAGPTAHEL", - "HAKEKLTAL", - "HAM(Oxidation)EEVKKF", - "HAPELTKKV", - "HLKEDQTEY", - "HPAENGKSNF", - "HPESERISM(Oxidation)", - "HPNKVKVY", - "HPYQPDPKM(Oxidation)", - "HSRNEGVATY", - "HVKDANGNSF", - "HVSTHQHNY", - "IASQTVKKV", - "ILDKKVEKV", - "IPQKFHRSV", - "ISSEAHREV", - "KAAAFEKQV", - "KAAKPKVV", - "KAASHIKSI", - "KAATVTKEL", - "KAISGVHTV", - "KAKPGTYKV", - "KALVKPKEV", - "KASGTLREY", - "KAYGKAKSI", - "KAYSEAHEI", - "KLAESVEKA", - "KLAPPPKKA", - "KLDNQVSKV", - "KLM(Oxidation)QQQQEV", - "KLSPKAEEV", - "KM(Oxidation)DESKHEI", - "KMNESTRSV", - "KQIKEIKEV", - "KVAQPKEV", - "KVIDTQQKV", - "KVSNSGITRV", - "KVVNPTQK", - "KYNRQSM(Oxidation)TL", - "KYTPPPHHI", - "LAKTGVHHY", - "LDKKVEKV", - "LLKSEKSSY", - "LPSENHKEM", - "LPSENHKEM(Oxidation)", - "M(Oxidation)LSEHTSKL", - "M(Oxidation)PPEHVRKI", - "M(Oxidation)PQGGGQHY", - "M(Oxidation)PQKERESI", - "MPKAEKNAV", - "MPNKVRKI", - "MPPEHVRKI", - "MPQKERESI", - "NAHGEPRNY", - "NALAHKYH", - "NAM(Oxidation)KIRDV", - "NATAVVRHM(Oxidation)", - "NATNAVKRL", - "NGTHVVRHY", - "NIQKITKS", - "NLAEKPKTV", - "NLSSLSKK", - "NNLSSLSKK", - "NPFGGASHAKG", - "NPKESSSSL", - "NSHSTTSSF", - "NTKGGDAPAAGEDA", - "NTKIGPRR", - "NVKIVKVKKE", - "PVEKALRD", - "QAGPINREM(Oxidation)", - "QALKHLKQY", - "QGVM(Oxidation)VGM(Oxidation)GQK", - "QGVM(Oxidation)VGM(Oxidation)GQKD", - "QPAKADKESF", - "QPHKVTQY", - "QTHQPPAPNS", - "QYKKDGADF", - "RLHEKIQEA", - "RPVPKGATY", - "RSTENVNKL", - "RSTQYM(Oxidation)KEY", - "RVAGIHKKV", - "SAKLERSHY", - "SAQTTSHEL", - "SARAGETRF", - "SASHVSKTV", - "SATNALRSM(Oxidation)", - "SAYANAKKY", - "SKEYFSKQ", - "SLDKTSHSV", - "SLDTQPKKV", - "SM(Oxidation)LGSPHKV", - "SM(Oxidation)NTHLKAV", - "SPM(Oxidation)EKIKQY", - "SPNYHEEKY", - "SQRFPKAE", - "SVQVFGRKK", - "SYVGDEAQSKR", - "SYVGDEAQSKRG", - "TDKSFVEK", - "TEKLVTSK", - "TEKLVTSKG", - "TGSETESPRNPSSA", - "THQPPAPNS", - "TKGGDAPAAGEDA", - "TKKVPQVS", - "TPPGVRKI", - "TSGPGSRISSSS", - "TTNLTEEEEKSKS", - "TTTHITKTV", - "TVIGPDGHKE", - "TVKDSRTVY", - "TVQNEANKY", - "VAPPKAHEV", - "VASEGIKRY", - "VHLTPEEK", - "VITDKEKAE", - "VPKEGKVV", - "VSKGTLVQTKGT", - "YADEKTKDV", - "YARLHPRAV", - "YGSTVSKRV", - "YPAKAKGTF", - "YTKKLNTQ", - "YTM(Oxidation)KKVHAL" - ] - ] ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-12T21:40:36.65796788" + "timestamp": "2026-02-13T10:55:12.336474966" } } \ No newline at end of file From 7ca466e1e0fc104a4b6fa5bc382512071be60283 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 13 Feb 2026 13:28:45 +0000 Subject: [PATCH 074/104] Add ion mobility export and MultiQC distribution plot (#440) --- assets/multiqc_config.yml | 15 +++++++++++++++ bin/summarize_results.py | 13 +++++++++++++ conf/modules.config | 3 ++- modules/local/openms/textexporter/main.nf | 1 + modules/local/pyopenms/summarize_results/main.nf | 2 ++ workflows/mhcquant.nf | 1 + 6 files changed, 34 insertions(+), 1 deletion(-) diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 2c55035f..43d2b7f2 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -102,6 +102,19 @@ custom_data: xlab: "Retention time" ylab: "Frequency" + im_plot: + plot_type: "linegraph" + file_format: "csv" + section_name: "Ion Mobility" + description: | + This plot shows the distribution of ion mobility (1/K0) values for identified peptides. + Ion mobility data is available when using instruments with ion mobility separation (e.g., timsTOF). + pconfig: + id: "histogram_im" + title: "Ion Mobility Distribution" + xlab: "Ion Mobility (1/K0) [V·s/cm²]" + ylab: "Frequency" + qvalue_plot: plot_type: "linegraph" file_format: "csv" @@ -164,6 +177,8 @@ sp: fn: "*_histogram_mz.csv" rt_plot: fn: "*_histogram_rt.csv" + im_plot: + fn: "*_histogram_im.csv" qvalue_plot: fn: "*_histogram_scores.csv" scores_plot_xcorr: diff --git a/bin/summarize_results.py b/bin/summarize_results.py index 918d6a16..a036154f 100755 --- a/bin/summarize_results.py +++ b/bin/summarize_results.py @@ -158,6 +158,10 @@ def process_file(file, prefix, quantify, keep_cols): # Histograms # --------------------------------- + # Rename IM column to ion_mobility for readability + if "IM" in data.columns: + data.rename(columns={"IM": "ion_mobility"}, inplace=True) + histograms = [[data["mz"].astype(float), f"{prefix}_histogram_mz.csv"], [data["rt"].astype(float), f"{prefix}_histogram_rt.csv"], [data["score"].astype(float), f"{prefix}_histogram_scores.csv"]] @@ -169,6 +173,15 @@ def process_file(file, prefix, quantify, keep_cols): bin_midpoint = (bin_edges[i] + bin_edges[i + 1]) / 2 f.write(f'{bin_midpoint},{hist[i]}\n') + # Generate ion mobility histogram if IM data is available (e.g., timsTOF) + if "ion_mobility" in data.columns: + im_values = data["ion_mobility"].astype(float) + hist, bin_edges = np.histogram(im_values, bins='auto') + with open(f"{prefix}_histogram_im.csv", "w") as f: + for i in range(len(bin_edges) - 1): + bin_midpoint = (bin_edges[i] + bin_edges[i + 1]) / 2 + f.write(f'{bin_midpoint},{hist[i]}\n') + # --------------------------------- # Box plots # --------------------------------- diff --git a/conf/modules.config b/conf/modules.config index ef1a2547..4cf8dc5f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -472,7 +472,8 @@ process { "observed_retention_time_best", "predicted_retention_time_best", "spec_pearson", "std_abs_diff", - "ccs_observed_im2deep", "ccs_predicted_im2deep", "ccs_error_im2deep" + "ccs_observed_im2deep", "ccs_predicted_im2deep", "ccs_error_im2deep", + "ion_mobility" ].join(',').trim(), ].join(' ').trim() publishDir = [ diff --git a/modules/local/openms/textexporter/main.nf b/modules/local/openms/textexporter/main.nf index 6f3942ab..5da5d66b 100644 --- a/modules/local/openms/textexporter/main.nf +++ b/modules/local/openms/textexporter/main.nf @@ -27,6 +27,7 @@ process OPENMS_TEXTEXPORTER { -out ${prefix}_exported.tsv \\ -threads $task.cpus \\ -id:add_hit_metavalues 0 \\ + -id:add_metavalues 0 \\ -id:peptides_only \\ $args """ diff --git a/modules/local/pyopenms/summarize_results/main.nf b/modules/local/pyopenms/summarize_results/main.nf index 71f403db..7ecc9472 100644 --- a/modules/local/pyopenms/summarize_results/main.nf +++ b/modules/local/pyopenms/summarize_results/main.nf @@ -15,6 +15,7 @@ process SUMMARIZE_RESULTS { path '*_xcorr_scores.csv' , emit: xcorr, optional: true path '*_peptide_length.csv' , emit: lengths, optional: true path '*_peptide_intensity.csv' , emit: intensities, optional: true + path '*_histogram_im.csv' , emit: hist_im, optional: true tuple val(meta), path('*.tsv'), path('*_general_stats.csv') , emit: epicore_input tuple val("${task.process}"), val('pyopenms'), eval("pip show pyopenms | grep Version | sed 's/Version: //'"), topic: versions @@ -41,6 +42,7 @@ process SUMMARIZE_RESULTS { touch ${prefix}_xcorr_scores.csv touch ${prefix}_peptide_length.csv touch ${prefix}_peptide_intensity.csv + touch ${prefix}_histogram_im.csv touch ${prefix}_general_stats.csv touch ${prefix}.tsv """ diff --git a/workflows/mhcquant.nf b/workflows/mhcquant.nf index 91fd368f..ac27d24b 100644 --- a/workflows/mhcquant.nf +++ b/workflows/mhcquant.nf @@ -209,6 +209,7 @@ workflow MHCQUANT { SUMMARIZE_RESULTS.out.hist_mz, SUMMARIZE_RESULTS.out.hist_rt, SUMMARIZE_RESULTS.out.hist_scores, + SUMMARIZE_RESULTS.out.hist_im, SUMMARIZE_RESULTS.out.xcorr, SUMMARIZE_RESULTS.out.lengths, SUMMARIZE_RESULTS.out.intensities, From b813fc4611a478f3e6a88732c6cff8c7f06e618f Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 13 Feb 2026 13:45:33 +0000 Subject: [PATCH 075/104] Capture full peptidoform content in search_presets snapshot --- tests/search_presets.nf.test | 26 +- tests/search_presets.nf.test.snap | 426 +++++++++++++++++++++++++++++- 2 files changed, 442 insertions(+), 10 deletions(-) diff --git a/tests/search_presets.nf.test b/tests/search_presets.nf.test index a4ea4e14..3d441f0b 100644 --- a/tests/search_presets.nf.test +++ b/tests/search_presets.nf.test @@ -19,16 +19,25 @@ nextflow_pipeline { def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_path: All files in ${params.outdir}/ with stable content def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') - // Count peptidoforms from result TSV files (non-deterministic due to MS2Rescore/Percolator FDR) - def totalPeptidoforms = 0 + // Extract peptidoform column from result TSV files (qe and lumos groups) + def peptidoform_data = [] new File(params.outdir).eachFileRecurse { file -> if (file.name.endsWith('.tsv') && file.parentFile.path == params.outdir) { def lines = file.readLines() - if (lines.size() > 1) { - totalPeptidoforms += lines.size() - 1 + if (lines.size() > 0) { + def header = lines[0].split('\t') + def peptidoformIndex = header.findIndexOf { it == 'peptidoform' } + if (peptidoformIndex >= 0) { + def peptidoforms = lines.drop(1).collect { line -> + def fields = line.split('\t') + fields.size() > peptidoformIndex ? fields[peptidoformIndex] : '' + }.findAll { it != '' }.sort() + peptidoform_data.add([file.name, peptidoforms]) + } } } } + peptidoform_data.sort { it[0] } assertAll( { assert workflow.success}, { assert snapshot( @@ -37,11 +46,10 @@ nextflow_pipeline { // All stable path name, with a relative path stable_name, // All files with stable contents - stable_path - ).match() }, - // MS2Rescore is non-deterministic, so exact peptide lists vary between runs. - // Check that at least one preset group produced peptides (FDR < 0.01). - { assert totalPeptidoforms >= 100 : "Expected at least 100 peptidoforms across all groups, got ${totalPeptidoforms}" } + stable_path, + // Peptidoform data from result TSV files + peptidoform_data + ).match() } ) } } diff --git a/tests/search_presets.nf.test.snap b/tests/search_presets.nf.test.snap index f955f1a8..72595e89 100644 --- a/tests/search_presets.nf.test.snap +++ b/tests/search_presets.nf.test.snap @@ -122,12 +122,436 @@ ], [ + ], + [ + [ + "HepG2_lumos.tsv", + [ + "AAAAAAHRL", + "AAATVTKKV", + "AAHPNVQKV", + "AAM(Oxidation)SVAKRV", + "AANAQPHKL", + "AANDKLKKM", + "AAPPPPAHA", + "AAPRPPPKPM(Oxidation)", + "AAQAHTREL", + "AARAEAREI", + "AASPVGKRL", + "AASSLKKQY", + "AATDHSNQL", + "AATPAKKTV", + "AATVTKKTY", + "AKDVKFGAD", + "ALKDKIEKA", + "ALKDSVQRA", + "ALKKALAAA", + "ALSDLHAHK", + "AM(Oxidation)AARPHSI", + "AM(Oxidation)AASPHAV", + "AM(Oxidation)ASHLTST", + "AM(Oxidation)HGHVEVV", + "AM(Oxidation)NARPHKV", + "AMNARPHKV", + "APPKAHEV", + "APRADAKAY", + "APRPPPKPM(Oxidation)", + "AVM(Oxidation)GNPKVKA", + "DAAVHQRI", + "DAKKQIKQV", + "DAPAGRKV", + "DGKKKISTV", + "DHVITNM(Oxidation)N", + "DNKKTRII", + "DPM(Oxidation)KARVV", + "DPPKTHVT", + "DPPRDSKGL", + "EYSKQM(Oxidation)QRF", + "FADPHSKRV", + "GKVGAHAGEY", + "GKVGAHAGEYG", + "GLAKSIHHA", + "GMAKKVTKA", + "GNVAEGETKPD", + "GPNKKPRF", + "GPRVVERH", + "GRVVEPKR", + "GVM(Oxidation)VGM(Oxidation)GQKD", + "HAAENPGKY", + "HAANPNGRYY", + "HAASRIKTI", + "HAATYTKKV", + "HAGPTAHEL", + "HAKEKLTAL", + "HAM(Oxidation)EEVKKF", + "HAPELTKKV", + "HLKEDQTEY", + "HPAENGKSNF", + "HPESERISM(Oxidation)", + "HPGRPQPPA", + "HPNKVKVY", + "HPYQPDPKM(Oxidation)", + "HSRNEGVATY", + "HSSPASSNY", + "HVKDANGNSF", + "HVSTHQHNY", + "IAPKTTRV", + "IASQTVKKV", + "IKTVETRD", + "IPQKFHRSV", + "ISSEAHREV", + "IVGRPRHQ", + "KAAKPKVV", + "KAAQPKSL", + "KAASHIKSI", + "KAISGVHTV", + "KAKPGTYKV", + "KALVKPKEV", + "KASEQAKVV", + "KASGTLREY", + "KAYGKAKSI", + "KGTGASGSF", + "KLAESVEKA", + "KLAPPPKKA", + "KLQPGSVKKV", + "KM(Oxidation)DESKHEI", + "KM(Oxidation)LDHEYTT", + "KMDESKHEI", + "KMNESTRSV", + "KMQEHSDQV", + "KRSSPETL", + "KSKEFVQKV", + "KTKEGVREV", + "KTLGTDVVKS", + "KVHLGARAS", + "KVVNPTQK", + "KYKERGTVL", + "KYLGKTHNL", + "KYNRQSM(Oxidation)TL", + "KYQPKPKQI", + "KYTPPPHHI", + "LAKTGVHHY", + "LLKSEKSSY", + "LPSENHKEM", + "LPSENHKEM(Oxidation)", + "M(Oxidation)PPEHVRKI", + "M(Oxidation)PQGGGQHY", + "M(Oxidation)PQKERESI", + "MPNKVRKI", + "MPQKERESI", + "NAHGEPRNY", + "NALAHKYH", + "NAM(Oxidation)KIRDV", + "NASARDNTI", + "NATAVVRHM(Oxidation)", + "NGTHVVRHY", + "NIQKITKS", + "NLKVKGPVR", + "NLRPKKKVK", + "NLSSLSKK", + "NLTEEEEKSKS", + "NNLSSLSKK", + "NPAAYENDK", + "NPFGGASHAKG", + "NPKESSSSL", + "NPKREIQKI", + "NQNPGSPRPGSTG", + "NSHSTTSSF", + "NTKGGDAPAAGEDA", + "NTKIGPRR", + "NVDYSKLKK", + "NVINGGSHA", + "NVKIVKVKKE", + "PPNKKPKV", + "QAGPINREM(Oxidation)", + "QALKHLKQY", + "QGVM(Oxidation)VGM(Oxidation)GQK", + "QPAKADKESF", + "QTHQPPAPNS", + "QYKKDGADF", + "RLAEAHAKV", + "RLHEKIQEA", + "RLNNKSAKV", + "RMARTPQTV", + "RPVPKGATY", + "RSNEHIREL", + "RSTENVNKL", + "RSTQYM(Oxidation)KEY", + "RVAGIHKKV", + "RYDDM(Oxidation)AAAM(Oxidation)", + "SAKLERSHY", + "SAM(Oxidation)SNPRAM", + "SAQTTSHEL", + "SARAGETRF", + "SASEAAKKY", + "SATGHPRKV", + "SATSNKHLL", + "SAYANAKKY", + "SEVAHRFK", + "SIVGRPRH", + "SLDKTSHSV", + "SLDTQPKKV", + "SM(Oxidation)LGSPHKV", + "SM(Oxidation)NTHLKAV", + "SM(Oxidation)PEQAHKV", + "SQRFPKAE", + "SSRSYTSGPG", + "SVKNDHSAY", + "SVQVFGRKK", + "SYVGDEAQSKR", + "SYVGDEAQSKRG", + "TAPQTQHV", + "TARPGPRAV", + "TDKSFVEK", + "TDRETGKL", + "TEDSPGLK", + "TEKLVTSK", + "TEKLVTSKG", + "TGSETESPRNPSSA", + "THYDPPRK", + "TKELPSGKKY", + "TKGGDAPAAGEDA", + "TRLSRTPGNR", + "TSGPGSRISSSS", + "TSTPNAKTV", + "TTPISEQKG", + "TVKDSRTVY", + "VAPPKAHEV", + "VARAGQKGY", + "VHLTPEEK", + "VITDKEKAE", + "VPKEGKVV", + "VQKTIAEN", + "VSKGTLVQTKGT", + "VVRHQLLKT", + "VYAQKHQQL", + "VYGKTSHL", + "YADEKTKDV", + "YGSTVSKRV", + "YLNKHIQKV", + "YTKKLNTQ", + "YTM(Oxidation)KKVHAL", + "YVGDEAQSKR", + "YVGDEAQSKRG" + ] + ], + [ + "HepG2_qe.tsv", + [ + "AAAAAAHRL", + "AAATVTKKV", + "AAHPNVQKV", + "AAM(Oxidation)SVAKRV", + "AANAQPHKL", + "AANDKLKKM", + "AAPPPPAHA", + "AAPRPPPKPM(Oxidation)", + "AAQAHTREL", + "AARAEAREI", + "AASPVGKRL", + "AASSLKKQY", + "AATDHSNQL", + "AATPAKKTV", + "AATVTKKTY", + "AKDVKFGAD", + "ALKDKIEKA", + "ALKDSVQRA", + "ALKKALAAA", + "ALSDLHAHK", + "AM(Oxidation)AARPHSI", + "AM(Oxidation)AASPHAV", + "AM(Oxidation)ASHLTST", + "AM(Oxidation)HGHVEVV", + "AM(Oxidation)NARPHKV", + "AMNARPHKV", + "APPKAHEV", + "APRADAKAY", + "APRPPPKPM(Oxidation)", + "AVM(Oxidation)GNPKVKA", + "DAAVHQRI", + "DAKKQIKQV", + "DAPAGRKV", + "DGKKKISTV", + "DHVITNM(Oxidation)N", + "DNKKTRII", + "DPM(Oxidation)KARVV", + "DPPKTHVT", + "DPPRDSKGL", + "EYSKQM(Oxidation)QRF", + "FADPHSKRV", + "GKVGAHAGEY", + "GKVGAHAGEYG", + "GLAKSIHHA", + "GMAKKVTKA", + "GNVAEGETKPD", + "GPNKKPRF", + "GPRVVERH", + "GRVVEPKR", + "GVM(Oxidation)VGM(Oxidation)GQKD", + "HAAENPGKY", + "HAANPNGRYY", + "HAASRIKTI", + "HAATYTKKV", + "HAGPTAHEL", + "HAKEKLTAL", + "HAM(Oxidation)EEVKKF", + "HAPELTKKV", + "HLKEDQTEY", + "HPAENGKSNF", + "HPESERISM(Oxidation)", + "HPGRPQPPA", + "HPNKVKVY", + "HPYQPDPKM(Oxidation)", + "HSRNEGVATY", + "HSSPASSNY", + "HVKDANGNSF", + "HVSTHQHNY", + "IAPKTTRV", + "IASQTVKKV", + "IKTVETRD", + "IPQKFHRSV", + "ISSEAHREV", + "IVGRPRHQ", + "KAAKPKVV", + "KAAQPKSL", + "KAASHIKSI", + "KAISGVHTV", + "KAKPGTYKV", + "KALVKPKEV", + "KASEQAKVV", + "KASGTLREY", + "KAYGKAKSI", + "KGTGASGSF", + "KLAESVEKA", + "KLAPPPKKA", + "KLQPGSVKKV", + "KM(Oxidation)DESKHEI", + "KM(Oxidation)LDHEYTT", + "KMDESKHEI", + "KMNESTRSV", + "KMQEHSDQV", + "KRSSPETL", + "KSKEFVQKV", + "KTKEGVREV", + "KTLGTDVVKS", + "KVHLGARAS", + "KVVNPTQK", + "KYKERGTVL", + "KYLGKTHNL", + "KYNRQSM(Oxidation)TL", + "KYQPKPKQI", + "KYTPPPHHI", + "LAKTGVHHY", + "LLKSEKSSY", + "LPSENHKEM", + "LPSENHKEM(Oxidation)", + "M(Oxidation)PPEHVRKI", + "M(Oxidation)PQGGGQHY", + "M(Oxidation)PQKERESI", + "MPNKVRKI", + "MPQKERESI", + "NAHGEPRNY", + "NALAHKYH", + "NAM(Oxidation)KIRDV", + "NASARDNTI", + "NATAVVRHM(Oxidation)", + "NGTHVVRHY", + "NIQKITKS", + "NLKVKGPVR", + "NLRPKKKVK", + "NLSSLSKK", + "NLTEEEEKSKS", + "NNLSSLSKK", + "NPAAYENDK", + "NPFGGASHAKG", + "NPKESSSSL", + "NPKREIQKI", + "NQNPGSPRPGSTG", + "NSHSTTSSF", + "NTKGGDAPAAGEDA", + "NTKIGPRR", + "NVDYSKLKK", + "NVINGGSHA", + "NVKIVKVKKE", + "PPNKKPKV", + "QAGPINREM(Oxidation)", + "QALKHLKQY", + "QGVM(Oxidation)VGM(Oxidation)GQK", + "QPAKADKESF", + "QTHQPPAPNS", + "QYKKDGADF", + "RLAEAHAKV", + "RLHEKIQEA", + "RLNNKSAKV", + "RMARTPQTV", + "RPVPKGATY", + "RSNEHIREL", + "RSTENVNKL", + "RSTQYM(Oxidation)KEY", + "RVAGIHKKV", + "RYDDM(Oxidation)AAAM(Oxidation)", + "SAKLERSHY", + "SAM(Oxidation)SNPRAM", + "SAQTTSHEL", + "SARAGETRF", + "SASEAAKKY", + "SATGHPRKV", + "SATSNKHLL", + "SAYANAKKY", + "SEVAHRFK", + "SIVGRPRH", + "SLDKTSHSV", + "SLDTQPKKV", + "SM(Oxidation)LGSPHKV", + "SM(Oxidation)NTHLKAV", + "SM(Oxidation)PEQAHKV", + "SQRFPKAE", + "SSRSYTSGPG", + "SVKNDHSAY", + "SVQVFGRKK", + "SYVGDEAQSKR", + "SYVGDEAQSKRG", + "TAPQTQHV", + "TARPGPRAV", + "TDKSFVEK", + "TDRETGKL", + "TEDSPGLK", + "TEKLVTSK", + "TEKLVTSKG", + "TGSETESPRNPSSA", + "THYDPPRK", + "TKELPSGKKY", + "TKGGDAPAAGEDA", + "TRLSRTPGNR", + "TSGPGSRISSSS", + "TSTPNAKTV", + "TTPISEQKG", + "TVKDSRTVY", + "VAPPKAHEV", + "VARAGQKGY", + "VHLTPEEK", + "VITDKEKAE", + "VPKEGKVV", + "VQKTIAEN", + "VSKGTLVQTKGT", + "VVRHQLLKT", + "VYAQKHQQL", + "VYGKTSHL", + "YADEKTKDV", + "YGSTVSKRV", + "YLNKHIQKV", + "YTKKLNTQ", + "YTM(Oxidation)KKVHAL", + "YVGDEAQSKR", + "YVGDEAQSKRG" + ] + ] ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-13T10:55:12.336474966" + "timestamp": "2026-02-13T13:35:56.062370587" } } \ No newline at end of file From 412153f5bfba22e2c00791907613ea38ad3efb7c Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 13 Feb 2026 14:03:02 +0000 Subject: [PATCH 076/104] Add changelog entry for ion mobility export (#441) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f8b9c2f..3a76df7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### `Added` - Added support for single run quantification [#438](https://github.com/nf-core/mhcquant/pull/438) +- Added ion mobility (IM) export and MultiQC distribution plot for timsTOF data [#441](https://github.com/nf-core/mhcquant/pull/441) ### `Fixed` From 5d5a59596173b0d9f88077a003b6a55f6c62623d Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Fri, 13 Feb 2026 16:27:40 +0000 Subject: [PATCH 077/104] Address PR review comments: remove defaultIgnoreParams hack, simplify docs, update fragment tolerance --- .nf-core.yml | 1 - docs/usage.md | 64 +++++++++++++++---------------------------------- nextflow.config | 2 +- 3 files changed, 20 insertions(+), 47 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index d34618a5..1a7fed6b 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -2,7 +2,6 @@ lint: files_unchanged: - .github/CONTRIBUTING.md - .vscode/settings.json - pipeline_if_empty_null: false nf_core_version: 3.5.1 repository_type: pipeline template: diff --git a/docs/usage.md b/docs/usage.md index acc22260..228d1fb4 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -14,27 +14,14 @@ You will need to create a samplesheet with information about the samples you wou ### Samplesheet columns -| Column | Required | Description | -| ------------------------ | -------- | ----------------------------------------------------------------------------------------------------- | -| `ID` | Yes | An incrementing value which acts as a unique number for the given sample | -| `Sample` | Yes | Custom sample name. This entry will be identical for multiple MS runs from the same sample. | -| `Condition` | Yes | Additional information of the sample can be defined here. | -| `ReplicateFileName` | Yes | Full path to the MS file. These files have the extensions .raw, .mzML, mzML.gz, .d, .d.tar.gz, .d.zip | -| `Fasta` | No | Full path to the FASTA file. These files have the extensions .fasta, .fa, .fas, .fna, .faa, .ffn | -| `SearchPreset` | No | Name of a built-in search parameter preset (see [Search presets](#search-presets)) | -| `PeptideMinLength` | No | Minimum peptide length for database search | -| `PeptideMaxLength` | No | Maximum peptide length for database search | -| `PrecursorMassRange` | No | Precursor mass range in format `min:max` (e.g. `800:2500`) | -| `PrecursorCharge` | No | Precursor charge range in format `min:max` (e.g. `2:3`) | -| `PrecursorMassTolerance` | No | Precursor mass tolerance in ppm | -| `FragmentMassTolerance` | No | Fragment mass tolerance in Da | -| `FragmentBinOffset` | No | Fragment bin offset (0 for high-res, 0.4 for low-res) | -| `MS2PIPModel` | No | MS2PIP model name for spectral prediction (e.g. `Immuno-HCD`, `timsTOF`, `CIDch2`) | -| `ActivationMethod` | No | Fragmentation method (`HCD`, `CID`, `ETD`, etc.) | -| `Instrument` | No | Instrument resolution type (`high_res` or `low_res`) | -| `NumberMods` | No | Maximum number of variable modifications per peptide | -| `FixedMods` | No | Comma-separated fixed modifications in UNIMOD nomenclature (e.g. `Carbamidomethyl (C)`) | -| `VariableMods` | No | Comma-separated variable modifications in UNIMOD nomenclature (e.g. `Oxidation (M)`) | +| Column | Required | Description | +| ------------------- | -------- | ----------------------------------------------------------------------------------------------------- | +| `ID` | Yes | An incrementing value which acts as a unique number for the given sample | +| `Sample` | Yes | Custom sample name. This entry will be identical for multiple MS runs from the same sample. | +| `Condition` | Yes | Additional information of the sample can be defined here. | +| `ReplicateFileName` | Yes | Full path to the MS file. These files have the extensions .raw, .mzML, mzML.gz, .d, .d.tar.gz, .d.zip | +| `Fasta` | No | Full path to the FASTA file. These files have the extensions .fasta, .fa, .fas, .fna, .faa, .ffn | +| `SearchPreset` | No | Name of a search parameter preset (see [Search presets](#search-presets)) | > [!NOTE] > The `Fasta` column is optional, but you can use it to provide sample-specific FASTA files. If you want to use the same FASTA file for all samples, provide it via the `--fasta` parameter. Please ensure you use one of these options. @@ -67,12 +54,12 @@ Available presets: | Preset | Instrument | MHC Class | Peptide Length | Mass Range | Charge | Precursor Tol. | Fragment Tol. | MS2PIP Model | | ---------------- | --------------------- | --------- | -------------- | ---------- | ------ | -------------- | ------------- | ------------ | -| `lumos_class1` | Orbitrap Fusion Lumos | I | 8-14 | 800:2500 | 2:3 | 5 ppm | 0.02 Da | Immuno-HCD | -| `lumos_class2` | Orbitrap Fusion Lumos | II | 8-30 | 800:5000 | 2:5 | 5 ppm | 0.02 Da | Immuno-HCD | -| `qe_class1` | Q Exactive | I | 8-14 | 800:2500 | 2:3 | 5 ppm | 0.02 Da | Immuno-HCD | -| `qe_class2` | Q Exactive | II | 8-30 | 800:5000 | 2:5 | 5 ppm | 0.02 Da | Immuno-HCD | -| `timstof_class1` | timsTOF | I | 8-14 | 800:2500 | 1:4 | 20 ppm | 0.02 Da | timsTOF | -| `timstof_class2` | timsTOF | II | 8-30 | 800:5000 | 1:5 | 20 ppm | 0.02 Da | timsTOF | +| `lumos_class1` | Orbitrap Fusion Lumos | I | 8-14 | 800:2500 | 2:3 | 5 ppm | 0.01 Da | Immuno-HCD | +| `lumos_class2` | Orbitrap Fusion Lumos | II | 8-30 | 800:5000 | 2:5 | 5 ppm | 0.01 Da | Immuno-HCD | +| `qe_class1` | Q Exactive | I | 8-14 | 800:2500 | 2:3 | 5 ppm | 0.01 Da | Immuno-HCD | +| `qe_class2` | Q Exactive | II | 8-30 | 800:5000 | 2:5 | 5 ppm | 0.01 Da | Immuno-HCD | +| `timstof_class1` | timsTOF | I | 8-14 | 800:2500 | 1:4 | 20 ppm | 0.01 Da | timsTOF | +| `timstof_class2` | timsTOF | II | 8-30 | 800:5000 | 1:5 | 20 ppm | 0.01 Da | timsTOF | | `xl_class1` | LTQ Orbitrap XL | I | 8-14 | 800:2500 | 2:3 | 5 ppm | 0.50025 Da | CIDch2 | | `xl_class2` | LTQ Orbitrap XL | II | 8-30 | 800:5000 | 2:5 | 5 ppm | 0.50025 Da | CIDch2 | @@ -86,28 +73,15 @@ ID Sample Condition ReplicateFileName SearchPreset 4 timstof_sample B /path/to/timstof_run2.d timstof_class2 ``` -### Per-sample search parameter overrides - -Individual search parameters can also be specified directly in the samplesheet, either together with a preset or standalone. This is useful when you need fine-grained control over a specific parameter. - -```tsv title="samplesheet.tsv" -ID Sample Condition ReplicateFileName SearchPreset PeptideMaxLength -1 sample1 A /path/to/run1.raw lumos_class1 16 -2 sample2 B /path/to/run2.raw 12 -``` - -In the example above, `sample1` uses the `lumos_class1` preset but overrides `PeptideMaxLength` to 16 (instead of the preset default 14). `sample2` has no preset but sets `PeptideMaxLength` to 12 directly. - ### Parameter precedence Search parameters are resolved with the following precedence (highest to lowest): -1. **Command-line parameters** (e.g. `--fragment_mass_tolerance 0.05`) -- CLI overrides take highest priority and apply to all samples, regardless of samplesheet or preset values -2. **Samplesheet column** (e.g. `FragmentMassTolerance`) -- per-sample values specified directly in the samplesheet -3. **Search preset** (e.g. `SearchPreset: lumos_class1`) -- preset values fill in any parameters not specified in the samplesheet -4. **Config defaults** (`nextflow.config`) -- built-in defaults are used as a final fallback +1. **Command-line parameters** (e.g. `--fragment_mass_tolerance 0.05`) -- CLI overrides take highest priority and apply to all samples +2. **Search preset** (e.g. `SearchPreset: lumos_class1`) -- preset values fill in any parameters not specified via CLI +3. **Config defaults** (`nextflow.config`) -- built-in defaults are used as a final fallback -This means a CLI flag like `--fragment_mass_tolerance 0.05` will override all presets and samplesheet values for that parameter. Without CLI overrides, samplesheet values take priority over presets, and presets over config defaults. +This means a CLI flag like `--fragment_mass_tolerance 0.05` will override all presets for that parameter. > [!NOTE] > When using `--global_fdr`, samples sharing the same `SearchPreset` value are grouped together for global FDR estimation. Samples without a preset are grouped under a common `global` group. @@ -126,7 +100,7 @@ Fine-tuning search settings is important to obtain the most optimal results for | precursor_error_units | ppm | ppm | ppm | ppm | ppm | ppm | ppm | ppm | | number_mods | 3 | 5 | 3 | 5 | 3 | 5 | 3 | 5 | | precursor_mass_tolerance | 20 | 20 | 5 | 5 | 5 | 5 | 5 | 5 | -| fragment_mass_tolerance | 0.02 | 0.02 | 0.02 | 0.02 | 0.02 | 0.02 | 0.50025 | 0.50025 | +| fragment_mass_tolerance | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.50025 | 0.50025 | | fragment_bin_offset | 0 | 0 | 0 | 0 | 0 | 0 | 0.4 | 0.4 | Modifications are specified via `--variable_mods` and `fixed_mods` using the [UNIMOD nomenclature](https://www.unimod.org/unimod_help.html) via OpenMS. Check out [helper page](https://abibuilder.cs.uni-tuebingen.de/archive/openms/Documentation/nightly/html/TOPP_CometAdapter.html) of OpenMS for the full list of options. Multiple modifications are specified as `'Oxidation (M),Acetyl (N-term),Phospho (S)'`. diff --git a/nextflow.config b/nextflow.config index c3ac1c49..4931c017 100644 --- a/nextflow.config +++ b/nextflow.config @@ -368,7 +368,7 @@ plugins { } validation { - defaultIgnoreParams = ["genomes", "search_presets"] + defaultIgnoreParams = ["genomes"] monochromeLogs = params.monochrome_logs } From b28f3562103b448fb479298f6d829cdc0a89d7e3 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Fri, 13 Feb 2026 18:07:33 +0100 Subject: [PATCH 078/104] Apply suggestion from @jonasscheid --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 4cf8dc5f..c6f226a1 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -472,7 +472,7 @@ process { "observed_retention_time_best", "predicted_retention_time_best", "spec_pearson", "std_abs_diff", - "ccs_observed_im2deep", "ccs_predicted_im2deep", "ccs_error_im2deep", +"ccs_predicted_im2deep", "ccs_error_im2deep", "ion_mobility" ].join(',').trim(), ].join(' ').trim() From 32beba3f9cc470068d751f5e5ab16a7d5361c82d Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:21:37 +0100 Subject: [PATCH 079/104] Update Easypqp container version to 0.1.57 --- modules/local/easypqp/convert/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/easypqp/convert/main.nf b/modules/local/easypqp/convert/main.nf index c7b2eb34..d1b7dcff 100644 --- a/modules/local/easypqp/convert/main.nf +++ b/modules/local/easypqp/convert/main.nf @@ -4,8 +4,8 @@ process EASYPQP_CONVERT { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/easypqp:0.1.53--pyhdfd78af_0' : - 'biocontainers/easypqp:0.1.53--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/easypqp:0.1.57--pyhdfd78af_0' : + 'biocontainers/easypqp:0.1.57--pyhdfd78af_0' }" input: tuple val(meta), path(pepxml), path(spectra) From d4fbfb3c280ff04c917f2c7e693f488f4fff21cd Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:21:52 +0100 Subject: [PATCH 080/104] Update easypqp version to 0.1.57 in environment.yml --- modules/local/easypqp/convert/environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/easypqp/convert/environment.yml b/modules/local/easypqp/convert/environment.yml index a4d3cedd..4600dae6 100644 --- a/modules/local/easypqp/convert/environment.yml +++ b/modules/local/easypqp/convert/environment.yml @@ -2,4 +2,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::easypqp=0.1.53 + - bioconda::easypqp=0.1.57 From 58097c9c8b5ef1297b5db8dafd0809b26e7c41f5 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:22:06 +0100 Subject: [PATCH 081/104] Update easypqp version to 0.1.57 in environment.yml --- modules/local/easypqp/library/environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/easypqp/library/environment.yml b/modules/local/easypqp/library/environment.yml index a4d3cedd..4600dae6 100644 --- a/modules/local/easypqp/library/environment.yml +++ b/modules/local/easypqp/library/environment.yml @@ -2,4 +2,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::easypqp=0.1.53 + - bioconda::easypqp=0.1.57 From a279912c939be4847b19ce0723572b7af978a5d6 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:22:23 +0100 Subject: [PATCH 082/104] Update Easypqp container version to 0.1.57 --- modules/local/easypqp/library/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/easypqp/library/main.nf b/modules/local/easypqp/library/main.nf index c41b1d00..ac6a7ba8 100644 --- a/modules/local/easypqp/library/main.nf +++ b/modules/local/easypqp/library/main.nf @@ -4,8 +4,8 @@ process EASYPQP_LIBRARY { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/easypqp:0.1.53--pyhdfd78af_0' : - 'biocontainers/easypqp:0.1.53--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/easypqp:0.1.57--pyhdfd78af_0' : + 'biocontainers/easypqp:0.1.57--pyhdfd78af_0' }" input: tuple val(meta), path(psmpkl), path(peakpkl) From d901f85fcc7109362eb640754aa5f02ff0cfeb59 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:23:15 +0100 Subject: [PATCH 083/104] Update dependencies in CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23449948..faec7937 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | Dependency | Old version | New version | | ---------- | ----------- | ----------- | +| `easypqp` | 0.1.53 | 0.1.57 | | `MultiQC` | 1.31.0 | 1.33.0 | | `Nf-core` | 3.4.1 | 3.5.1 | | `openms` | 3.4.1 | 3.5.0 | From 77306da1d567dfbc19c462343cc4193a9e5dbb55 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Wed, 4 Mar 2026 16:05:39 +0100 Subject: [PATCH 084/104] Update container version in main.nf --- modules/local/easypqp/convert/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/easypqp/convert/main.nf b/modules/local/easypqp/convert/main.nf index d1b7dcff..927e7523 100644 --- a/modules/local/easypqp/convert/main.nf +++ b/modules/local/easypqp/convert/main.nf @@ -4,8 +4,8 @@ process EASYPQP_CONVERT { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/easypqp:0.1.57--pyhdfd78af_0' : - 'biocontainers/easypqp:0.1.57--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/easypqp:0.1.57--pyhdfd78af_1' : + 'biocontainers/easypqp:0.1.57--pyhdfd78af_1' }" input: tuple val(meta), path(pepxml), path(spectra) From 3fda64798b510e118d0664420c6f061c31b49118 Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Wed, 4 Mar 2026 16:05:54 +0100 Subject: [PATCH 085/104] Update container version in main.nf --- modules/local/easypqp/library/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/easypqp/library/main.nf b/modules/local/easypqp/library/main.nf index ac6a7ba8..f20b3940 100644 --- a/modules/local/easypqp/library/main.nf +++ b/modules/local/easypqp/library/main.nf @@ -4,8 +4,8 @@ process EASYPQP_LIBRARY { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/easypqp:0.1.57--pyhdfd78af_0' : - 'biocontainers/easypqp:0.1.57--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/easypqp:0.1.57--pyhdfd78af_1' : + 'biocontainers/easypqp:0.1.57--pyhdfd78af_1' }" input: tuple val(meta), path(psmpkl), path(peakpkl) From 8a83694345f657a584835c4703e8aece5f9dab0b Mon Sep 17 00:00:00 2001 From: Jonas Scheid <43858870+jonasscheid@users.noreply.github.com> Date: Wed, 4 Mar 2026 16:52:18 +0100 Subject: [PATCH 086/104] Update easypqp version to 0.1.57 in tests --- tests/speclib.nf.test.snap | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/speclib.nf.test.snap b/tests/speclib.nf.test.snap index 75888c05..7788ab52 100644 --- a/tests/speclib.nf.test.snap +++ b/tests/speclib.nf.test.snap @@ -4,10 +4,10 @@ 28, { "EASYPQP_CONVERT": { - "easypqp": "0.1.53" + "easypqp": "0.1.57" }, "EASYPQP_LIBRARY": { - "easypqp": "0.1.53" + "easypqp": "0.1.57" }, "MS2RESCORE": { "MS2Rescore": "3.1.5" @@ -398,4 +398,4 @@ }, "timestamp": "2026-02-12T14:02:45.605055829" } -} \ No newline at end of file +} From f07901048aecfad8e13b3ec7a666c65ee0bffc04 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Mon, 16 Mar 2026 17:04:40 +0000 Subject: [PATCH 087/104] Fix global FDR null:null precursor length by propagating search params in meta Co-Authored-By: Claude Opus 4.6 --- subworkflows/local/rescore/main.nf | 67 ++++++++++++++---------------- 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/subworkflows/local/rescore/main.nf b/subworkflows/local/rescore/main.nf index 0a9839ac..15c6aea3 100644 --- a/subworkflows/local/rescore/main.nf +++ b/subworkflows/local/rescore/main.nf @@ -8,8 +8,10 @@ include { MS2RESCORE } from '../../../modules/local/ms2rescore' include { OPENMS_PSMFEATUREEXTRACTOR } from '../../../modules/local/openms/psmfeatureextractor' -include { OPENMS_PERCOLATORADAPTER; - OPENMS_PERCOLATORADAPTER as OPENMS_PERCOLATORADAPTER_GLOBAL } from '../../../modules/local/openmsthirdparty/percolatoradapter' +include { + OPENMS_PERCOLATORADAPTER ; + OPENMS_PERCOLATORADAPTER as OPENMS_PERCOLATORADAPTER_GLOBAL +} from '../../../modules/local/openmsthirdparty/percolatoradapter' include { OPENMS_TEXTEXPORTER as OPENMS_TEXTEXPORTER_GLOBAL } from '../../../modules/local/openms/textexporter' // // MODULE: Installed directly from nf-core/modules @@ -17,49 +19,48 @@ include { OPENMS_TEXTEXPORTER as OPENMS_TEXTEXPORTER_GLOBAL } from '.. include { OPENMS_IDMERGER as OPENMS_IDMERGER_GLOBAL } from '../../../modules/nf-core/openms/idmerger/main' include { OPENMS_IDSCORESWITCHER } from '../../../modules/nf-core/openms/idscoreswitcher/main.nf' -include { OPENMS_IDFILTER as OPENMS_IDFILTER_Q_VALUE; - OPENMS_IDFILTER as OPENMS_IDFILTER_Q_VALUE_GLOBAL; - OPENMS_IDFILTER as OPENMS_IDFILTER_GLOBAL } from '../../../modules/nf-core/openms/idfilter/main' +include { + OPENMS_IDFILTER as OPENMS_IDFILTER_Q_VALUE ; + OPENMS_IDFILTER as OPENMS_IDFILTER_Q_VALUE_GLOBAL ; + OPENMS_IDFILTER as OPENMS_IDFILTER_GLOBAL +} from '../../../modules/nf-core/openms/idfilter/main' workflow RESCORE { - take: - ch_merged_runs - ch_multiqc_files + ch_merged_runs + ch_multiqc_files main: // Compute features via ms2rescore MS2RESCORE(ch_merged_runs) if (params.rescoring_engine == 'mokapot') { - log.warn "The rescoring engine is set to mokapot. This rescoring engine currently only supports psm-level-fdr via ms2rescore." + log.warn("The rescoring engine is set to mokapot. This rescoring engine currently only supports psm-level-fdr via ms2rescore.") if (params.global_fdr) { - log.warn "Global FDR is currently not supported by mokapot. The global_fdr parameter will be ignored." + log.warn("Global FDR is currently not supported by mokapot. The global_fdr parameter will be ignored.") } // Switch comet e-value to mokapot q-value OPENMS_IDSCORESWITCHER(MS2RESCORE.out.idxml) ch_rescored_runs = OPENMS_IDSCORESWITCHER.out.idxml // Filter by mokapot q-value - OPENMS_IDFILTER_Q_VALUE(ch_rescored_runs.map {group_meta, idxml -> [group_meta, idxml, []]}) + OPENMS_IDFILTER_Q_VALUE(ch_rescored_runs.map { group_meta, idxml -> [group_meta, idxml, []] }) ch_filter_q_value = OPENMS_IDFILTER_Q_VALUE.out.filtered - - } else { + } + else { // Extract PSM features for Percolator OPENMS_PSMFEATUREEXTRACTOR(MS2RESCORE.out.idxml.join(MS2RESCORE.out.feature_names)) // Run Percolator with local FDR OPENMS_PERCOLATORADAPTER(OPENMS_PSMFEATUREEXTRACTOR.out.idxml) - ch_multiqc_files = ch_multiqc_files.mix(OPENMS_PERCOLATORADAPTER.out.feature_weights.map{ meta, feature_weights -> feature_weights }) + ch_multiqc_files = ch_multiqc_files.mix(OPENMS_PERCOLATORADAPTER.out.feature_weights.map { meta, feature_weights -> feature_weights }) ch_pout = OPENMS_PERCOLATORADAPTER.out.idxml if (params.global_fdr) { // Group by search_preset for global FDR. Samples without a preset all share // the same params (CLI or defaults), so they correctly group under 'global'. OPENMS_IDMERGER_GLOBAL( - OPENMS_PSMFEATUREEXTRACTOR.out.idxml - .map { group_meta, idxml -> [[id: group_meta.search_preset ?: 'global'], idxml] } - .groupTuple() + OPENMS_PSMFEATUREEXTRACTOR.out.idxml.map { group_meta, idxml -> [group_meta + [id: group_meta.search_preset ?: 'global'], idxml] }.groupTuple() ) // Run Percolator with global FDR (one per preset group) OPENMS_PERCOLATORADAPTER_GLOBAL(OPENMS_IDMERGER_GLOBAL.out.idxml) @@ -68,33 +69,29 @@ workflow RESCORE { OPENMS_IDFILTER_Q_VALUE_GLOBAL(ch_rescored_runs.map { id, idxml -> [id, idxml, []] }) // Backfilter: match each local file with its corresponding preset's global FDR file OPENMS_IDFILTER_GLOBAL( - ch_pout - .map { group_meta, idxml -> - [group_meta.search_preset ?: 'global', group_meta, idxml] - } - .combine( - OPENMS_IDFILTER_Q_VALUE_GLOBAL.out.filtered - .map { global_meta, idxml -> [global_meta.id, idxml] }, - by: 0 - ) - .map { preset, group_meta, local_idxml, global_filtered_idxml -> - [group_meta, local_idxml, global_filtered_idxml] - } + ch_pout.map { group_meta, idxml -> + [group_meta.search_preset ?: 'global', group_meta, idxml] + }.combine( + OPENMS_IDFILTER_Q_VALUE_GLOBAL.out.filtered.map { global_meta, idxml -> [global_meta.id, idxml] }, + by: 0 + ).map { preset, group_meta, local_idxml, global_filtered_idxml -> + [group_meta, local_idxml, global_filtered_idxml] + } ) ch_filter_q_value = OPENMS_IDFILTER_GLOBAL.out.filtered // Save globally merged runs in tsv (one per preset group) OPENMS_TEXTEXPORTER_GLOBAL(OPENMS_IDFILTER_Q_VALUE_GLOBAL.out.filtered) - - } else { + } + else { ch_rescored_runs = ch_pout // Filter by percolator q-value - OPENMS_IDFILTER_Q_VALUE(ch_rescored_runs.map {group_meta, idxml -> [group_meta, idxml, []]}) + OPENMS_IDFILTER_Q_VALUE(ch_rescored_runs.map { group_meta, idxml -> [group_meta, idxml, []] }) ch_filter_q_value = OPENMS_IDFILTER_Q_VALUE.out.filtered } } emit: - rescored_runs = ch_rescored_runs.map { meta, file -> [[id: meta.id], file] } - fdr_filtered = ch_filter_q_value.map { meta, file -> [[id: meta.id], file] } - multiqc_files = ch_multiqc_files + rescored_runs = ch_rescored_runs.map { meta, file -> [[id: meta.id], file] } + fdr_filtered = ch_filter_q_value.map { meta, file -> [[id: meta.id], file] } + multiqc_files = ch_multiqc_files } From 51d63aa312bfc912b3d943bd8f4ee9e8b8e83cf5 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Tue, 17 Mar 2026 09:30:16 +0000 Subject: [PATCH 088/104] Propagate search params in global FDR meta for speclib subworkflow Co-Authored-By: Claude Opus 4.6 --- subworkflows/local/speclib/main.nf | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/subworkflows/local/speclib/main.nf b/subworkflows/local/speclib/main.nf index df035117..d14adf20 100644 --- a/subworkflows/local/speclib/main.nf +++ b/subworkflows/local/speclib/main.nf @@ -6,8 +6,8 @@ // MODULE: Loaded from modules/local/ // -include { EASYPQP_CONVERT } from '../../../modules/local/easypqp/convert' -include { EASYPQP_LIBRARY } from '../../../modules/local/easypqp/library' +include { EASYPQP_CONVERT } from '../../../modules/local/easypqp/convert' +include { EASYPQP_LIBRARY } from '../../../modules/local/easypqp/library' include { EASYPQP_LIBRARY as EASYPQP_LIBRARY_GLOBAL } from '../../../modules/local/easypqp/library' // @@ -15,14 +15,13 @@ include { EASYPQP_LIBRARY as EASYPQP_LIBRARY_GLOBAL } from '../../../modules/loc // workflow SPECLIB { - take: - fdrfiltered_comet_idxml - mzml + fdrfiltered_comet_idxml + mzml main: // Load unimod tables (Future:) - unimod = file("$projectDir/assets/250120_unimod_tables.xml", checkIfExists: true) + unimod = file("${projectDir}/assets/250120_unimod_tables.xml", checkIfExists: true) // Convert psms and spectra to pickle files EASYPQP_CONVERT(fdrfiltered_comet_idxml.join(mzml), unimod) @@ -42,11 +41,11 @@ workflow SPECLIB { // Generate spectrum library for all MSruns in the samplesheet if (params.global_fdr) { EASYPQP_CONVERT.out.psmpkl - .map { meta, psmpkl -> [[id: "global"], psmpkl] } + .map { meta, psmpkl -> [meta + [id: "global"], psmpkl] } .groupTuple() .set { ch_global_psmpkl } EASYPQP_CONVERT.out.peakpkl - .map { meta, peakpkl -> [[id: "global"], peakpkl] } + .map { meta, peakpkl -> [meta + [id: "global"], peakpkl] } .groupTuple() .set { ch_global_peakpkl } EASYPQP_LIBRARY_GLOBAL(ch_global_psmpkl.join(ch_global_peakpkl)) From 41694ce1b885483bbf5f7f09a5479f08fe0d3437 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Tue, 17 Mar 2026 09:33:44 +0000 Subject: [PATCH 089/104] Group speclib global FDR by search_preset, not hardcoded 'global' Co-Authored-By: Claude Opus 4.6 --- subworkflows/local/speclib/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/speclib/main.nf b/subworkflows/local/speclib/main.nf index d14adf20..78288851 100644 --- a/subworkflows/local/speclib/main.nf +++ b/subworkflows/local/speclib/main.nf @@ -41,11 +41,11 @@ workflow SPECLIB { // Generate spectrum library for all MSruns in the samplesheet if (params.global_fdr) { EASYPQP_CONVERT.out.psmpkl - .map { meta, psmpkl -> [meta + [id: "global"], psmpkl] } + .map { meta, psmpkl -> [meta + [id: meta.search_preset ?: 'global'], psmpkl] } .groupTuple() .set { ch_global_psmpkl } EASYPQP_CONVERT.out.peakpkl - .map { meta, peakpkl -> [meta + [id: "global"], peakpkl] } + .map { meta, peakpkl -> [meta + [id: meta.search_preset ?: 'global'], peakpkl] } .groupTuple() .set { ch_global_peakpkl } EASYPQP_LIBRARY_GLOBAL(ch_global_psmpkl.join(ch_global_peakpkl)) From 517751daf794991458aa996b0bb7cd433b0051a0 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Tue, 17 Mar 2026 09:34:49 +0000 Subject: [PATCH 090/104] Remove meta propagation in speclib global grouping to not break groupTuple Co-Authored-By: Claude Opus 4.6 --- subworkflows/local/speclib/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/speclib/main.nf b/subworkflows/local/speclib/main.nf index 78288851..55b1f71b 100644 --- a/subworkflows/local/speclib/main.nf +++ b/subworkflows/local/speclib/main.nf @@ -41,11 +41,11 @@ workflow SPECLIB { // Generate spectrum library for all MSruns in the samplesheet if (params.global_fdr) { EASYPQP_CONVERT.out.psmpkl - .map { meta, psmpkl -> [meta + [id: meta.search_preset ?: 'global'], psmpkl] } + .map { meta, psmpkl -> [[id: meta.search_preset ?: 'global'], psmpkl] } .groupTuple() .set { ch_global_psmpkl } EASYPQP_CONVERT.out.peakpkl - .map { meta, peakpkl -> [meta + [id: meta.search_preset ?: 'global'], peakpkl] } + .map { meta, peakpkl -> [[id: meta.search_preset ?: 'global'], peakpkl] } .groupTuple() .set { ch_global_peakpkl } EASYPQP_LIBRARY_GLOBAL(ch_global_psmpkl.join(ch_global_peakpkl)) From e80ba6095c425e48617bccb42795b81e9ada7530 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Tue, 7 Apr 2026 16:53:46 +0000 Subject: [PATCH 091/104] Add SDRF/PRIDE input support via --input parameter (#277) Co-Authored-By: Claude Opus 4.6 --- conf/modules.config | 35 +++++ .../percolatoradapter/main.nf | 2 +- modules/local/parse_sdrf/environment.yml | 5 + modules/local/parse_sdrf/main.nf | 34 +++++ modules/local/parse_sdrf/meta.yml | 57 +++++++++ .../local/pride_download_file/environment.yml | 5 + modules/local/pride_download_file/main.nf | 36 ++++++ modules/local/pride_download_file/meta.yml | 54 ++++++++ .../local/pride_fetch_sdrf/environment.yml | 5 + modules/local/pride_fetch_sdrf/main.nf | 62 +++++++++ modules/local/pride_fetch_sdrf/meta.yml | 41 ++++++ nextflow_schema.json | 10 +- .../local/sdrf_to_samplesheet/main.nf | 93 ++++++++++++++ .../utils_nfcore_mhcquant_pipeline/main.nf | 121 ++++++++++++------ 14 files changed, 512 insertions(+), 48 deletions(-) create mode 100644 modules/local/parse_sdrf/environment.yml create mode 100644 modules/local/parse_sdrf/main.nf create mode 100644 modules/local/parse_sdrf/meta.yml create mode 100644 modules/local/pride_download_file/environment.yml create mode 100644 modules/local/pride_download_file/main.nf create mode 100644 modules/local/pride_download_file/meta.yml create mode 100644 modules/local/pride_fetch_sdrf/environment.yml create mode 100644 modules/local/pride_fetch_sdrf/main.nf create mode 100644 modules/local/pride_fetch_sdrf/meta.yml create mode 100644 subworkflows/local/sdrf_to_samplesheet/main.nf diff --git a/conf/modules.config b/conf/modules.config index 0975a406..ce82effb 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -307,6 +307,41 @@ process { } } +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + SDRF / PRIDE module configs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +process { + + withName: 'PARSE_SDRF' { + publishDir = [ + path: {"${params.outdir}/sdrf"}, + mode: params.publish_dir_mode, + pattern: '*.tsv' + ] + } + + withName: 'PRIDE_FETCH_SDRF' { + errorStrategy = 'retry' + maxRetries = 3 + publishDir = [ + path: {"${params.outdir}/sdrf"}, + mode: params.publish_dir_mode, + pattern: '*.sdrf.tsv' + ] + } + + withName: 'PRIDE_DOWNLOAD_FILE' { + errorStrategy = 'retry' + maxRetries = 3 + maxForks = 5 + publishDir = [enabled: false] + } + +} + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Local module configs diff --git a/modules/local/openmsthirdparty/percolatoradapter/main.nf b/modules/local/openmsthirdparty/percolatoradapter/main.nf index 59105393..a3f20178 100644 --- a/modules/local/openmsthirdparty/percolatoradapter/main.nf +++ b/modules/local/openmsthirdparty/percolatoradapter/main.nf @@ -14,7 +14,7 @@ process OPENMS_PERCOLATORADAPTER { tuple val(meta), path("*.idXML") , emit: idxml tuple val(meta), path("*_percolator_feature_weights.tsv"), emit: feature_weights, optional: true tuple val("${task.process}"), val('PercolatorAdapter'), eval("PercolatorAdapter 2>&1 | grep -E '^Version(.*)' | sed 's/Version: //g' | cut -d ' ' -f 1"), topic: versions - tuple val("${task.process}"), val('percolator'), eval("percolator -h 2>&1 | grep -E '^Percolator version(.*)' | sed 's/Percolator version //g'"), topic: versions + tuple val("${task.process}"), val('percolator'), eval("percolator -h 2>&1 | grep -E '^Percolator version(.*)' | sed 's/Percolator version //g' | cut -d',' -f1"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/parse_sdrf/environment.yml b/modules/local/parse_sdrf/environment.yml new file mode 100644 index 00000000..725912b3 --- /dev/null +++ b/modules/local/parse_sdrf/environment.yml @@ -0,0 +1,5 @@ +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::sdrf-pipelines=0.1.2 diff --git a/modules/local/parse_sdrf/main.nf b/modules/local/parse_sdrf/main.nf new file mode 100644 index 00000000..16aa967c --- /dev/null +++ b/modules/local/parse_sdrf/main.nf @@ -0,0 +1,34 @@ +process PARSE_SDRF { + label 'process_single' + tag "${sdrf.baseName}" + + conda "bioconda::sdrf-pipelines=0.1.2" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/sdrf-pipelines:0.1.2--pyhdfd78af_0' : + 'quay.io/biocontainers/sdrf-pipelines:0.1.2--pyhdfd78af_0' }" + + input: + path sdrf + + output: + path "samplesheet.tsv" , emit: samplesheet + path "search_presets.tsv" , emit: search_presets + tuple val("${task.process}"), val('sdrf-pipelines'), eval("parse_sdrf --version | cut -d ' ' -f 2"), topic: versions + + when: + task.ext.when == null || task.ext.when + + script: + """ + parse_sdrf convert-mhcquant \\ + -s ${sdrf} \\ + -os samplesheet.tsv \\ + -op search_presets.tsv + """ + + stub: + """ + touch samplesheet.tsv + touch search_presets.tsv + """ +} diff --git a/modules/local/parse_sdrf/meta.yml b/modules/local/parse_sdrf/meta.yml new file mode 100644 index 00000000..45071ba4 --- /dev/null +++ b/modules/local/parse_sdrf/meta.yml @@ -0,0 +1,57 @@ +name: parse_sdrf +description: Converts an SDRF (Sample and Data Relationship Format) file into an + mhcquant-compatible samplesheet and search presets TSV files using sdrf-pipelines. +keywords: + - sdrf + - samplesheet + - proteomics + - immunopeptidomics + - mhcquant +tools: + - "sdrf-pipelines": + description: "A set of tools to validate and convert SDRF files for proteomics + pipelines." + homepage: "https://github.com/bigbio/sdrf-pipelines" + documentation: "https://github.com/bigbio/sdrf-pipelines" + tool_dev_url: "https://github.com/bigbio/sdrf-pipelines" + doi: "10.1021/acs.jproteome.1c00505" + licence: ["Apache-2.0"] + identifier: "" + +input: + - - sdrf: + type: file + description: SDRF file describing the experimental design and sample metadata. + pattern: "*.{tsv,sdrf.tsv}" + ontologies: [] + +output: + samplesheet: + - - "samplesheet.tsv": + type: file + description: mhcquant-compatible samplesheet derived from the SDRF file. + pattern: "samplesheet.tsv" + ontologies: [] + search_presets: + - - "search_presets.tsv": + type: file + description: Search parameter presets derived from the SDRF file, one row + per unique search configuration. + pattern: "search_presets.tsv" + ontologies: [] +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - sdrf-pipelines: + type: string + description: The name of the tool + - "parse_sdrf --version | cut -d ' ' -f 2": + type: eval + description: The expression to obtain the version of the tool + +authors: + - "@jonasscheid" +maintainers: + - "@jonasscheid" diff --git a/modules/local/pride_download_file/environment.yml b/modules/local/pride_download_file/environment.yml new file mode 100644 index 00000000..9a956eb8 --- /dev/null +++ b/modules/local/pride_download_file/environment.yml @@ -0,0 +1,5 @@ +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::pridepy=0.0.12 diff --git a/modules/local/pride_download_file/main.nf b/modules/local/pride_download_file/main.nf new file mode 100644 index 00000000..76a10845 --- /dev/null +++ b/modules/local/pride_download_file/main.nf @@ -0,0 +1,36 @@ +process PRIDE_DOWNLOAD_FILE { + label 'process_single' + tag "${file_name}" + + conda "bioconda::pridepy=0.0.12" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/pridepy:0.0.12--pyhdfd78af_0' : + 'quay.io/biocontainers/pridepy:0.0.12--pyhdfd78af_0' }" + + input: + tuple val(meta), val(file_name), val(pride_accession) + + output: + tuple val(meta), path("${file_name}"), emit: downloaded_file + tuple val("${task.process}"), val('pridepy'), eval("pip show pridepy 2>/dev/null | grep Version | cut -d' ' -f2"), topic: versions + + when: + task.ext.when == null || task.ext.when + + script: + """ + pridepy download-file-by-name \\ + -a "${pride_accession}" \\ + -f "${file_name}" \\ + -o . \\ + -p ftp + + # pridepy exits 0 even on download failure — validate file is non-empty + [ -s "${file_name}" ] || { echo "ERROR: Downloaded file ${file_name} is empty"; exit 1; } + """ + + stub: + """ + touch "${file_name}" + """ +} diff --git a/modules/local/pride_download_file/meta.yml b/modules/local/pride_download_file/meta.yml new file mode 100644 index 00000000..87448fa2 --- /dev/null +++ b/modules/local/pride_download_file/meta.yml @@ -0,0 +1,54 @@ +name: pride_download_file +description: Download a single file from the PRIDE Archive by name using pridepy. +keywords: + - pride + - download + - proteomics + - mass spectrometry +tools: + - pridepy: + description: | + Python client library and command line tool for the PRIDE Archive REST API. + Supports downloading files from PRIDE datasets by accession and file name. + homepage: https://github.com/PRIDE-Utilities/pridepy + documentation: https://github.com/PRIDE-Utilities/pridepy + licence: ["Apache-2.0"] +input: + - - meta: + type: map + description: | + Groovy Map containing sample information. + e.g. [ id:'test', sample:'sample1', condition:'A', search_preset:'default' ] + - file_name: + type: string + description: Name of the file to download from the PRIDE Archive dataset. + - pride_accession: + type: string + description: PRIDE Archive accession number (e.g. PXD000001) identifying the dataset. +output: + downloaded_file: + - - meta: + type: map + description: | + Groovy Map containing sample information. + e.g. [ id:'test', sample:'sample1', condition:'A', search_preset:'default' ] + - "${file_name}": + type: file + description: The file downloaded from the PRIDE Archive. + pattern: "*" +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - pridepy: + type: string + description: The tool name + - "pip show pridepy 2>/dev/null | grep Version | cut -d' ' -f2": + type: eval + description: The expression to obtain the version of pridepy + +authors: + - "@jonasscheid" +maintainers: + - "@jonasscheid" diff --git a/modules/local/pride_fetch_sdrf/environment.yml b/modules/local/pride_fetch_sdrf/environment.yml new file mode 100644 index 00000000..9a956eb8 --- /dev/null +++ b/modules/local/pride_fetch_sdrf/environment.yml @@ -0,0 +1,5 @@ +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::pridepy=0.0.12 diff --git a/modules/local/pride_fetch_sdrf/main.nf b/modules/local/pride_fetch_sdrf/main.nf new file mode 100644 index 00000000..5fede89a --- /dev/null +++ b/modules/local/pride_fetch_sdrf/main.nf @@ -0,0 +1,62 @@ +process PRIDE_FETCH_SDRF { + label 'process_single' + tag "$pride_id" + + conda "bioconda::pridepy=0.0.12" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/pridepy:0.0.12--pyhdfd78af_0' : + 'quay.io/biocontainers/pridepy:0.0.12--pyhdfd78af_0' }" + + input: + val pride_id + + output: + path "*.sdrf.tsv" , emit: sdrf + tuple val("${task.process}"), val('pridepy'), eval("pip show pridepy 2>/dev/null | grep Version | cut -d' ' -f2"), topic: versions + + when: + task.ext.when == null || task.ext.when + + script: + """ + cat <<'EOF' > fetch_sdrf.py +import json +import subprocess +import sys + +pride_id = "${pride_id}" + +subprocess.run( + ["pridepy", "stream-files-metadata", "-a", pride_id, "-o", "files_metadata.json"], + check=True +) + +with open("files_metadata.json") as f: + files = json.load(f) + +sdrf_files = [f for f in files if f["fileName"].endswith(".sdrf.tsv")] +if not sdrf_files: + print(f"ERROR: No SDRF file found for PRIDE project {pride_id}", file=sys.stderr) + print("Please provide a local SDRF file using --input ", file=sys.stderr) + sys.exit(1) + +if len(sdrf_files) > 1: + names = [f["fileName"] for f in sdrf_files] + print(f"WARNING: Multiple SDRF files found: {names}. Using {names[0]}", file=sys.stderr) + +sdrf_name = sdrf_files[0]["fileName"] +print(f"Found SDRF file: {sdrf_name}") +subprocess.run( + ["pridepy", "download-file-by-name", "-a", pride_id, "-f", sdrf_name, "-o", ".", "-p", "ftp"], + check=True +) +EOF + + python3 fetch_sdrf.py + """ + + stub: + """ + touch ${pride_id}.sdrf.tsv + """ +} diff --git a/modules/local/pride_fetch_sdrf/meta.yml b/modules/local/pride_fetch_sdrf/meta.yml new file mode 100644 index 00000000..210de2fd --- /dev/null +++ b/modules/local/pride_fetch_sdrf/meta.yml @@ -0,0 +1,41 @@ +name: pride_fetch_sdrf +description: Fetch an SDRF file from the PRIDE Archive for a given project accession. +keywords: + - pride + - sdrf + - proteomics + - download +tools: + - pridepy: + description: | + Python package to access PRIDE Archive data programmatically, + including downloading files and metadata for public proteomics datasets. + homepage: https://github.com/PRIDE-Archive/pridepy + documentation: https://github.com/PRIDE-Archive/pridepy + licence: ["Apache-2.0"] +input: + - - pride_id: + type: string + description: PRIDE Archive project accession (e.g. PXD009752) +output: + sdrf: + - - "*.sdrf.tsv": + type: file + description: SDRF (Sample and Data Relationship Format) file describing the experimental design of the PRIDE project + pattern: "*.sdrf.tsv" +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - pridepy: + type: string + description: The tool name + - "pip show pridepy 2>/dev/null | grep Version | cut -d' ' -f2": + type: eval + description: The expression to obtain the version of the tool + +authors: + - "@jonasscheid" +maintainers: + - "@jonasscheid" diff --git a/nextflow_schema.json b/nextflow_schema.json index cfba6adc..4e4d89c7 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -14,13 +14,9 @@ "properties": { "input": { "type": "string", - "description": "Input raw / mzML files listed in a tsv file (see help for details)", - "help_text": "Use this to specify a sample sheet table including your input raw or mzml files as well as their meta information such as SampleID and Condition. For example:\n\n| ID | Sample | Condition | ReplicateFileName |\n| -----|:------------:| ----------:|------------------------------------------:|\n| 1 | MM15_Melanom | A | data/MM15_Melanom_W_1_A_standard.raw |\n| 2 | MM15_Melanom | B | data/MM15_Melanom_W_1_B_standard.raw |\n| 3 | MM17_Melanom | B | data/MM17_Melanom_W_1_B_standard.raw |\n\n```bash\n--input 'path/samples.tsv'\n```", - "format": "file-path", - "exists": true, - "schema": "assets/schema_input.json", - "mimetype": "text/csv", - "pattern": "^\\S+\\.tsv$", + "pattern": "^(PXD\\d{6,}|\\S+\\.sdrf\\.tsv|\\S+\\.tsv)$", + "description": "Input: samplesheet TSV, SDRF file (.sdrf.tsv), or PRIDE accession (PXD...)", + "help_text": "Accepts three input modes:\n\n1. **Samplesheet TSV** (default): Tab-separated file with columns ID, Sample, Condition, ReplicateFileName.\n2. **SDRF file** (`.sdrf.tsv`): Files are downloaded from PRIDE automatically. Requires `--fasta`.\n3. **PRIDE accession** (e.g., `PXD009752`): SDRF and raw files are fetched from PRIDE. Requires `--fasta`.", "fa_icon": "fas fa-file" }, "outdir": { diff --git a/subworkflows/local/sdrf_to_samplesheet/main.nf b/subworkflows/local/sdrf_to_samplesheet/main.nf new file mode 100644 index 00000000..94338324 --- /dev/null +++ b/subworkflows/local/sdrf_to_samplesheet/main.nf @@ -0,0 +1,93 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + SDRF_TO_SAMPLESHEET: Convert SDRF to mhcquant samplesheet + download files from PRIDE +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +include { PARSE_SDRF } from '../../../modules/local/parse_sdrf/main' +include { PRIDE_FETCH_SDRF } from '../../../modules/local/pride_fetch_sdrf/main' +include { PRIDE_DOWNLOAD_FILE } from '../../../modules/local/pride_download_file/main' + +workflow SDRF_TO_SAMPLESHEET { + + take: + sdrf // path: local SDRF file, or null + pride_id // val: PRIDE accession, or null + + main: + + // + // If pride_id given but no local SDRF, fetch from PRIDE + // + if (pride_id && !sdrf) { + PRIDE_FETCH_SDRF(pride_id) + ch_sdrf = PRIDE_FETCH_SDRF.out.sdrf + } else { + ch_sdrf = channel.fromPath(sdrf, checkIfExists: true) + } + + // + // Convert SDRF to mhcquant samplesheet + search presets + // + PARSE_SDRF(ch_sdrf) + + // + // Resolve PRIDE accession for file downloads + // + def resolved_accession = pride_id ?: inferPrideAccession(sdrf) + + // + // Parse samplesheet to get file names for downloading + // + ch_samplesheet_rows = PARSE_SDRF.out.samplesheet + .splitCsv(header: true, sep: '\t') + .map { row -> + def meta = [ + id: row.ID as int, + sample: row.Sample.toString(), + condition: row.Condition.toString(), + search_preset: row.SearchPreset ?: '' + ] + [meta, row.ReplicateFileName] + } + + // + // Download each file from PRIDE + // + ch_to_download = ch_samplesheet_rows + .map { meta, filename -> [meta, filename, resolved_accession] } + + PRIDE_DOWNLOAD_FILE(ch_to_download) + + // + // Write a validated samplesheet with local file paths + // + ch_samplesheet_file = PRIDE_DOWNLOAD_FILE.out.downloaded_file + .map { meta, downloaded_file -> + "${meta.id}\t${meta.sample}\t${meta.condition}\t${downloaded_file}\t${meta.search_preset}" + } + .collectFile(name: 'sdrf_samplesheet.tsv', seed: 'ID\tSample\tCondition\tReplicateFileName\tSearchPreset', newLine: true) + + emit: + samplesheet = ch_samplesheet_file // path: samplesheet.tsv with local file paths + search_presets = PARSE_SDRF.out.search_presets // path: search_presets.tsv +} + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + FUNCTIONS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +def inferPrideAccession(sdrf_path) { + def name = file(sdrf_path).name + def matcher = (name =~ /PXD\d{6,}/) + if (matcher.find()) { + return matcher.group() + } + error """\ + Could not infer PRIDE accession from SDRF filename: ${name} + Please provide input as a PRIDE accession (e.g., --input PXD009752) + or use an SDRF file named with the PXD accession (e.g., PXD009752.sdrf.tsv) + """.stripIndent() +} diff --git a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf index 42809878..7da896ea 100644 --- a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf @@ -17,6 +17,7 @@ include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' include { imNotification } from '../../nf-core/utils_nfcore_pipeline' include { UTILS_NFCORE_PIPELINE } from '../../nf-core/utils_nfcore_pipeline' include { UTILS_NEXTFLOW_PIPELINE } from '../../nf-core/utils_nextflow_pipeline' +include { SDRF_TO_SAMPLESHEET } from '../sdrf_to_samplesheet' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -92,69 +93,96 @@ workflow PIPELINE_INITIALISATION { ) // - // Parse search parameter presets TSV into a map + // Detect input type and build samplesheet channels // - def presetsList = samplesheetToList(params.search_presets, "${projectDir}/assets/schema_search_presets.json") - def presetsMap = presetsList.collectEntries { row -> - def meta = (row instanceof List) ? row[0] : row - // nf-schema parses whitespace-only TSV fields as empty list []; convert to empty string - ['fixed_mods', 'variable_mods'].each { key -> - def val = meta[key] - if (val == null || (val instanceof List && val.size() == 0) || val == '') { - meta[key] = '' - } + def inputType = detectInputType(params.input) + + if (inputType == 'sdrf' || inputType == 'pride_id') { + // + // SDRF / PRIDE input mode: fetch SDRF, convert, download files + // + def sdrf_path = (inputType == 'sdrf') ? params.input : null + def pride_id = (inputType == 'pride_id') ? params.input : null + + if (inputType == 'sdrf' && !pride_id) { + def matcher = (file(params.input).name =~ /PXD\d{6,}/) + pride_id = matcher.find() ? matcher.group() : null } - [(meta.preset_name): meta] + + SDRF_TO_SAMPLESHEET(sdrf_path, pride_id) + + ch_samplesheet_file = SDRF_TO_SAMPLESHEET.out.samplesheet + ch_presets_file = SDRF_TO_SAMPLESHEET.out.search_presets + + } else { + // + // Standard samplesheet input mode + // + ch_samplesheet_file = channel.value(params.input) + ch_presets_file = channel.fromPath(params.search_presets, checkIfExists: true) } // - // Create channel from input file provided through params.input + // Build presets map (shared) // + ch_presets_map = ch_presets_file + .map { presets_file -> + def presetsList = samplesheetToList(presets_file.toString(), "${projectDir}/assets/schema_search_presets.json") + presetsList.collectEntries { row -> + def meta = (row instanceof List) ? row[0] : row + ['fixed_mods', 'variable_mods'].each { key -> + def val = meta[key] + if (val == null || (val instanceof List && val.size() == 0) || val == '') { + meta[key] = '' + } + } + [(meta.preset_name): meta] + } + } - channel - .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) + // + // Parse samplesheet with nf-schema validation, enrich, resolve search params (shared) + // + ch_samplesheet_file + .flatMap { samplesheet_path -> + samplesheetToList(samplesheet_path.toString(), "${projectDir}/assets/schema_input.json") + } .map { meta, file, fasta -> def m = meta + [sample: meta.sample.toString(), condition: meta.condition.toString()] - [m.subMap('sample','condition'), m, file, fasta] + [m.subMap('sample', 'condition'), m, file, fasta] } .tap { ch_input } .groupTuple() - // get number of files per sample-condition - .map { group_meta, metas, files, fastas -> [ group_meta, files.size()] } - .combine( ch_input, by:0 ) + .map { group_meta, metas, files, fastas -> [group_meta, files.size()] } + .combine(ch_input, by: 0) .map { group_meta, group_count, meta, file, fasta -> - def enrichedMeta = meta + ['group_count':group_count, 'spectra':file.baseName.tokenize('.')[0], 'ext':getCustomExtension(file)] - def resolved = resolveSearchParams(enrichedMeta, presetsMap) - [resolved, file, fasta] + def enrichedMeta = meta + [group_count: group_count, spectra: file.baseName.tokenize('.')[0], ext: getCustomExtension(file)] + [enrichedMeta, file, fasta] } .set { ch_samplesheet_raw } - ch_samplesheet = ch_samplesheet_raw.map { meta, file, fasta -> [ meta, file ]} + ch_samplesheet = ch_samplesheet_raw + .combine(ch_presets_map) + .map { meta, file, fasta, presetsMap -> + [resolveSearchParams(meta, presetsMap), file] + } // - // Create channel from the reference_database through params.fasta or from the samplesheet fasta files + // Create channel from the reference_database through params.fasta // - if (params.fasta) { channel.fromPath(params.fasta, checkIfExists: true) .map { fasta -> [[id:fasta.getBaseName()], fasta] } .set { ch_fasta } - - ch_samplesheet_raw - .map{ meta, file, fasta -> fasta } - .flatten() - .first() - .subscribe { - log.warn """\ - Both --fasta and samplesheet FASTA files were provided! - The pipeline will use --fasta (${params.fasta}), ignoring samplesheet FASTA entries. - To use the samplesheet FASTA files instead, remove the --fasta parameter. - """.stripIndent() - } - } else { - // Check if the FASTA files were provided in the samplesheet - ch_fasta = ch_samplesheet_raw.map { meta, file, fasta -> [ groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), fasta] } + if (inputType == 'sdrf' || inputType == 'pride_id') { + error '''\ + Error: No FASTA file provided. + When using SDRF or PRIDE input, please provide a FASTA database using --fasta. + '''.stripIndent() + } + // Fasta from samplesheet column + ch_fasta = ch_samplesheet_raw.map { meta, file, fasta -> [groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), fasta] } ch_fasta .map { meta, fasta -> fasta } .flatten() @@ -166,7 +194,6 @@ workflow PIPELINE_INITIALISATION { 2. Include a 'Fasta' column in your samplesheet '''.stripIndent() } - // Group FASTA files by sample and condition and keep only the first FASTA file per sample-condition ch_fasta .groupTuple() .map { group_meta, fastas -> [group_meta, fastas.first()] } @@ -232,6 +259,20 @@ workflow PIPELINE_COMPLETION { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +// +// Detect input type from the --input parameter value +// +def detectInputType(input) { + def inputStr = input.toString() + if (inputStr =~ /^PXD\d{6,}$/) { + return 'pride_id' + } + if (inputStr.endsWith('.sdrf.tsv')) { + return 'sdrf' + } + return 'samplesheet' +} + // // Resolve a search parameter with priority: CLI params > samplesheet preset > nextflow.config default // From 4d9db6d691d4025bc8b71ac5f36bc0f28548555a Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 9 Apr 2026 13:04:10 +0000 Subject: [PATCH 092/104] Fix SUMMARIZE_RESULTS crash with --quantify due to OpenMS 3.5.0 TextExporter column mismatch Co-Authored-By: Claude Opus 4.6 --- bin/summarize_results.py | 20 +++++++++++++++++--- conf/modules.config | 4 ++-- modules/local/openms/textexporter/main.nf | 3 --- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/bin/summarize_results.py b/bin/summarize_results.py index a036154f..6b8a692f 100755 --- a/bin/summarize_results.py +++ b/bin/summarize_results.py @@ -78,6 +78,15 @@ def parse_multiTSV(file_path): elif line.startswith("#UNASSIGNEDPEPTIDE"): unassigned_peptide_cols = line.strip().split('\t')[1:] + # Workaround for OpenMS 3.5.0 TextExporter bug (https://github.com/OpenMS/OpenMS/issues/9120): + # consensusXML export writes a phantom column in data rows between 'end' and 'FFId_category' + # that is missing from the header. Remove it to realign columns. + for rows, cols in [(peptide_rows, peptide_cols), (unassigned_peptide_rows, unassigned_peptide_cols)]: + if rows and len(rows[0]) > len(cols) and 'end' in cols: + extra_idx = cols.index('end') + 1 + for i, row in enumerate(rows): + rows[i] = row[:extra_idx] + row[extra_idx + 1:] + peptide_df = pd.DataFrame(peptide_rows, columns=peptide_cols) consensus_df = pd.DataFrame(consensus_rows, columns=consensus_cols) # Concatenate CONSENSUS and PEPTIDE columns @@ -195,6 +204,10 @@ def process_file(file, prefix, quantify, keep_cols): header=False ) + # Add a column with unique protein accessions next to accessions + data.insert(data.columns.get_loc('accessions') + 1, 'unique_accessions', + data['accessions'].map(lambda x: ';'.join(dict.fromkeys(x.split(';'))))) + # Filter the columns down to a user-defined subset of columns if keep_cols: missing_columns = set(keep_cols) - set(data.columns) @@ -205,6 +218,10 @@ def process_file(file, prefix, quantify, keep_cols): regex_patterns = [r'^rt_', r'^mz_', r'^intensity_', r'^charge_'] for pattern in regex_patterns: keep_cols.extend([col for col in data.columns if re.match(pattern, col)]) + # Always include unique_accessions next to accessions + if 'accessions' in keep_cols and 'unique_accessions' not in keep_cols: + idx = keep_cols.index('accessions') + 1 + keep_cols.insert(idx, 'unique_accessions') # Remove duplicates while retaining order keep_cols = list(dict.fromkeys(keep_cols)) data = data.loc[:, keep_cols] @@ -213,9 +230,6 @@ def process_file(file, prefix, quantify, keep_cols): float_cols = data.select_dtypes(include=['float']).columns data.loc[:, float_cols] = data.loc[:, float_cols].round(5) - # Add a column with unique protein accessions - data['unique_accessions'] = data['accessions'].map(lambda x: ';'.join(dict.fromkeys(x.split(';')))) - data.to_csv(f"{prefix}.tsv", sep='\t', index=False) diff --git a/conf/modules.config b/conf/modules.config index 0975a406..1f56f804 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -449,6 +449,7 @@ process { } withName: 'OPENMS_TEXTEXPORTER' { + ext.args = '-id:peptides_only -id:add_hit_metavalues 0 -id:add_metavalues 0' publishDir = [ enabled: false ] @@ -473,8 +474,7 @@ process { "observed_retention_time_best", "predicted_retention_time_best", "spec_pearson", "std_abs_diff", -"ccs_predicted_im2deep", "ccs_error_im2deep", - "ion_mobility" + "ccs_predicted_im2deep", "ccs_error_im2deep", "ion_mobility" ].join(',').trim(), ].join(' ').trim() publishDir = [ diff --git a/modules/local/openms/textexporter/main.nf b/modules/local/openms/textexporter/main.nf index 5da5d66b..21b9aa04 100644 --- a/modules/local/openms/textexporter/main.nf +++ b/modules/local/openms/textexporter/main.nf @@ -26,9 +26,6 @@ process OPENMS_TEXTEXPORTER { -in $file \\ -out ${prefix}_exported.tsv \\ -threads $task.cpus \\ - -id:add_hit_metavalues 0 \\ - -id:add_metavalues 0 \\ - -id:peptides_only \\ $args """ From 4c893c1b105019744dbd9286c7a4d1ee8ef482a7 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 9 Apr 2026 13:05:35 +0000 Subject: [PATCH 093/104] Update CHANGELOG for #444 Co-Authored-By: Claude Opus 4.6 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index faec7937..7eac64b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### `Fixed` +- Fixed `SUMMARIZE_RESULTS` crash with `--quantify` caused by OpenMS 3.5.0 TextExporter phantom column bug ([OpenMS/OpenMS#9120](https://github.com/OpenMS/OpenMS/issues/9120)) [#444](https://github.com/nf-core/mhcquant/pull/444) - Fixed an issue where stripping the sequence in `SUMMARIZE_RESULTS` did not work for complex modifications [#436](https://github.com/nf-core/mhcquant/pull/436) ### `Changed` From 8f9f5e0f15fd089ca27bfa70869d38225dfbc7ed Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Sun, 12 Apr 2026 17:07:07 +0000 Subject: [PATCH 094/104] Restructure SDRF/PRIDE local modules under sdrf_pipelines/ and pridepy/ tool-namespaced directories --- conf/modules.config | 18 ++---- modules/local/pride_fetch_sdrf/main.nf | 62 ------------------- .../download_file}/environment.yml | 0 .../download_file}/main.nf | 4 +- .../download_file}/meta.yml | 2 +- .../fetch_sdrf}/environment.yml | 0 modules/local/pridepy/fetch_sdrf/main.nf | 31 ++++++++++ .../fetch_sdrf}/meta.yml | 2 +- .../parse_sdrf/environment.yml | 0 .../{ => sdrf_pipelines}/parse_sdrf/main.nf | 4 +- .../{ => sdrf_pipelines}/parse_sdrf/meta.yml | 2 +- .../local/sdrf_to_samplesheet/main.nf | 38 ++++-------- .../utils_nfcore_mhcquant_pipeline/main.nf | 35 ++++++----- 13 files changed, 74 insertions(+), 124 deletions(-) delete mode 100644 modules/local/pride_fetch_sdrf/main.nf rename modules/local/{pride_download_file => pridepy/download_file}/environment.yml (100%) rename modules/local/{pride_download_file => pridepy/download_file}/main.nf (93%) rename modules/local/{pride_download_file => pridepy/download_file}/meta.yml (98%) rename modules/local/{pride_fetch_sdrf => pridepy/fetch_sdrf}/environment.yml (100%) create mode 100644 modules/local/pridepy/fetch_sdrf/main.nf rename modules/local/{pride_fetch_sdrf => pridepy/fetch_sdrf}/meta.yml (98%) rename modules/local/{ => sdrf_pipelines}/parse_sdrf/environment.yml (100%) rename modules/local/{ => sdrf_pipelines}/parse_sdrf/main.nf (91%) rename modules/local/{ => sdrf_pipelines}/parse_sdrf/meta.yml (98%) diff --git a/conf/modules.config b/conf/modules.config index ce82effb..7869643a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -309,13 +309,13 @@ process { /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - SDRF / PRIDE module configs + Local module configs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ process { - withName: 'PARSE_SDRF' { + withName: 'SDRF_PIPELINES_PARSE_SDRF' { publishDir = [ path: {"${params.outdir}/sdrf"}, mode: params.publish_dir_mode, @@ -323,7 +323,7 @@ process { ] } - withName: 'PRIDE_FETCH_SDRF' { + withName: 'PRIDEPY_FETCH_SDRF' { errorStrategy = 'retry' maxRetries = 3 publishDir = [ @@ -333,23 +333,13 @@ process { ] } - withName: 'PRIDE_DOWNLOAD_FILE' { + withName: 'PRIDEPY_DOWNLOAD_FILE' { errorStrategy = 'retry' maxRetries = 3 maxForks = 5 publishDir = [enabled: false] } -} - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Local module configs -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -process { - withName: 'TDF2MZML' { publishDir = [ enabled: false diff --git a/modules/local/pride_fetch_sdrf/main.nf b/modules/local/pride_fetch_sdrf/main.nf deleted file mode 100644 index 5fede89a..00000000 --- a/modules/local/pride_fetch_sdrf/main.nf +++ /dev/null @@ -1,62 +0,0 @@ -process PRIDE_FETCH_SDRF { - label 'process_single' - tag "$pride_id" - - conda "bioconda::pridepy=0.0.12" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/pridepy:0.0.12--pyhdfd78af_0' : - 'quay.io/biocontainers/pridepy:0.0.12--pyhdfd78af_0' }" - - input: - val pride_id - - output: - path "*.sdrf.tsv" , emit: sdrf - tuple val("${task.process}"), val('pridepy'), eval("pip show pridepy 2>/dev/null | grep Version | cut -d' ' -f2"), topic: versions - - when: - task.ext.when == null || task.ext.when - - script: - """ - cat <<'EOF' > fetch_sdrf.py -import json -import subprocess -import sys - -pride_id = "${pride_id}" - -subprocess.run( - ["pridepy", "stream-files-metadata", "-a", pride_id, "-o", "files_metadata.json"], - check=True -) - -with open("files_metadata.json") as f: - files = json.load(f) - -sdrf_files = [f for f in files if f["fileName"].endswith(".sdrf.tsv")] -if not sdrf_files: - print(f"ERROR: No SDRF file found for PRIDE project {pride_id}", file=sys.stderr) - print("Please provide a local SDRF file using --input ", file=sys.stderr) - sys.exit(1) - -if len(sdrf_files) > 1: - names = [f["fileName"] for f in sdrf_files] - print(f"WARNING: Multiple SDRF files found: {names}. Using {names[0]}", file=sys.stderr) - -sdrf_name = sdrf_files[0]["fileName"] -print(f"Found SDRF file: {sdrf_name}") -subprocess.run( - ["pridepy", "download-file-by-name", "-a", pride_id, "-f", sdrf_name, "-o", ".", "-p", "ftp"], - check=True -) -EOF - - python3 fetch_sdrf.py - """ - - stub: - """ - touch ${pride_id}.sdrf.tsv - """ -} diff --git a/modules/local/pride_download_file/environment.yml b/modules/local/pridepy/download_file/environment.yml similarity index 100% rename from modules/local/pride_download_file/environment.yml rename to modules/local/pridepy/download_file/environment.yml diff --git a/modules/local/pride_download_file/main.nf b/modules/local/pridepy/download_file/main.nf similarity index 93% rename from modules/local/pride_download_file/main.nf rename to modules/local/pridepy/download_file/main.nf index 76a10845..1d1464b4 100644 --- a/modules/local/pride_download_file/main.nf +++ b/modules/local/pridepy/download_file/main.nf @@ -1,8 +1,8 @@ -process PRIDE_DOWNLOAD_FILE { +process PRIDEPY_DOWNLOAD_FILE { label 'process_single' tag "${file_name}" - conda "bioconda::pridepy=0.0.12" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/pridepy:0.0.12--pyhdfd78af_0' : 'quay.io/biocontainers/pridepy:0.0.12--pyhdfd78af_0' }" diff --git a/modules/local/pride_download_file/meta.yml b/modules/local/pridepy/download_file/meta.yml similarity index 98% rename from modules/local/pride_download_file/meta.yml rename to modules/local/pridepy/download_file/meta.yml index 87448fa2..56749bf7 100644 --- a/modules/local/pride_download_file/meta.yml +++ b/modules/local/pridepy/download_file/meta.yml @@ -1,4 +1,4 @@ -name: pride_download_file +name: pridepy_download_file description: Download a single file from the PRIDE Archive by name using pridepy. keywords: - pride diff --git a/modules/local/pride_fetch_sdrf/environment.yml b/modules/local/pridepy/fetch_sdrf/environment.yml similarity index 100% rename from modules/local/pride_fetch_sdrf/environment.yml rename to modules/local/pridepy/fetch_sdrf/environment.yml diff --git a/modules/local/pridepy/fetch_sdrf/main.nf b/modules/local/pridepy/fetch_sdrf/main.nf new file mode 100644 index 00000000..2165650a --- /dev/null +++ b/modules/local/pridepy/fetch_sdrf/main.nf @@ -0,0 +1,31 @@ +process PRIDEPY_FETCH_SDRF { + label 'process_single' + tag "$pride_id" + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/pridepy:0.0.12--pyhdfd78af_0' : + 'quay.io/biocontainers/pridepy:0.0.12--pyhdfd78af_0' }" + + input: + val pride_id + + output: + path "*.sdrf.tsv" , emit: sdrf + tuple val("${task.process}"), val('pridepy'), eval("pip show pridepy 2>/dev/null | grep Version | cut -d' ' -f2"), topic: versions + + when: + task.ext.when == null || task.ext.when + + script: + """ + pridepy stream-files-metadata -a "${pride_id}" -o files_metadata.json + sdrf_name=\$(python3 -c "import json,sys; sdrfs=[f['fileName'] for f in json.load(open('files_metadata.json')) if f['fileName'].endswith('.sdrf.tsv')]; print(sdrfs[0]) if sdrfs else sys.exit('ERROR: No SDRF file found for ${pride_id}')") + pridepy download-file-by-name -a "${pride_id}" -f "\$sdrf_name" -o . -p ftp + """ + + stub: + """ + touch ${pride_id}.sdrf.tsv + """ +} diff --git a/modules/local/pride_fetch_sdrf/meta.yml b/modules/local/pridepy/fetch_sdrf/meta.yml similarity index 98% rename from modules/local/pride_fetch_sdrf/meta.yml rename to modules/local/pridepy/fetch_sdrf/meta.yml index 210de2fd..b1e0e7be 100644 --- a/modules/local/pride_fetch_sdrf/meta.yml +++ b/modules/local/pridepy/fetch_sdrf/meta.yml @@ -1,4 +1,4 @@ -name: pride_fetch_sdrf +name: pridepy_fetch_sdrf description: Fetch an SDRF file from the PRIDE Archive for a given project accession. keywords: - pride diff --git a/modules/local/parse_sdrf/environment.yml b/modules/local/sdrf_pipelines/parse_sdrf/environment.yml similarity index 100% rename from modules/local/parse_sdrf/environment.yml rename to modules/local/sdrf_pipelines/parse_sdrf/environment.yml diff --git a/modules/local/parse_sdrf/main.nf b/modules/local/sdrf_pipelines/parse_sdrf/main.nf similarity index 91% rename from modules/local/parse_sdrf/main.nf rename to modules/local/sdrf_pipelines/parse_sdrf/main.nf index 16aa967c..4f48ef2c 100644 --- a/modules/local/parse_sdrf/main.nf +++ b/modules/local/sdrf_pipelines/parse_sdrf/main.nf @@ -1,8 +1,8 @@ -process PARSE_SDRF { +process SDRF_PIPELINES_PARSE_SDRF { label 'process_single' tag "${sdrf.baseName}" - conda "bioconda::sdrf-pipelines=0.1.2" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/sdrf-pipelines:0.1.2--pyhdfd78af_0' : 'quay.io/biocontainers/sdrf-pipelines:0.1.2--pyhdfd78af_0' }" diff --git a/modules/local/parse_sdrf/meta.yml b/modules/local/sdrf_pipelines/parse_sdrf/meta.yml similarity index 98% rename from modules/local/parse_sdrf/meta.yml rename to modules/local/sdrf_pipelines/parse_sdrf/meta.yml index 45071ba4..86de3306 100644 --- a/modules/local/parse_sdrf/meta.yml +++ b/modules/local/sdrf_pipelines/parse_sdrf/meta.yml @@ -1,4 +1,4 @@ -name: parse_sdrf +name: sdrf_pipelines_parse_sdrf description: Converts an SDRF (Sample and Data Relationship Format) file into an mhcquant-compatible samplesheet and search presets TSV files using sdrf-pipelines. keywords: diff --git a/subworkflows/local/sdrf_to_samplesheet/main.nf b/subworkflows/local/sdrf_to_samplesheet/main.nf index 94338324..6609b826 100644 --- a/subworkflows/local/sdrf_to_samplesheet/main.nf +++ b/subworkflows/local/sdrf_to_samplesheet/main.nf @@ -4,9 +4,9 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { PARSE_SDRF } from '../../../modules/local/parse_sdrf/main' -include { PRIDE_FETCH_SDRF } from '../../../modules/local/pride_fetch_sdrf/main' -include { PRIDE_DOWNLOAD_FILE } from '../../../modules/local/pride_download_file/main' +include { SDRF_PIPELINES_PARSE_SDRF } from '../../../modules/local/sdrf_pipelines/parse_sdrf/main' +include { PRIDEPY_FETCH_SDRF } from '../../../modules/local/pridepy/fetch_sdrf/main' +include { PRIDEPY_DOWNLOAD_FILE } from '../../../modules/local/pridepy/download_file/main' workflow SDRF_TO_SAMPLESHEET { @@ -16,61 +16,49 @@ workflow SDRF_TO_SAMPLESHEET { main: - // // If pride_id given but no local SDRF, fetch from PRIDE - // if (pride_id && !sdrf) { - PRIDE_FETCH_SDRF(pride_id) - ch_sdrf = PRIDE_FETCH_SDRF.out.sdrf + PRIDEPY_FETCH_SDRF(pride_id) + ch_sdrf = PRIDEPY_FETCH_SDRF.out.sdrf } else { ch_sdrf = channel.fromPath(sdrf, checkIfExists: true) } - // // Convert SDRF to mhcquant samplesheet + search presets - // - PARSE_SDRF(ch_sdrf) + SDRF_PIPELINES_PARSE_SDRF(ch_sdrf) - // // Resolve PRIDE accession for file downloads - // def resolved_accession = pride_id ?: inferPrideAccession(sdrf) - // // Parse samplesheet to get file names for downloading - // - ch_samplesheet_rows = PARSE_SDRF.out.samplesheet + ch_samplesheet_rows = SDRF_PIPELINES_PARSE_SDRF.out.samplesheet .splitCsv(header: true, sep: '\t') .map { row -> def meta = [ id: row.ID as int, sample: row.Sample.toString(), condition: row.Condition.toString(), - search_preset: row.SearchPreset ?: '' + search_preset: row.SearchPreset ] [meta, row.ReplicateFileName] } - // // Download each file from PRIDE - // ch_to_download = ch_samplesheet_rows .map { meta, filename -> [meta, filename, resolved_accession] } - PRIDE_DOWNLOAD_FILE(ch_to_download) + PRIDEPY_DOWNLOAD_FILE(ch_to_download) - // // Write a validated samplesheet with local file paths - // - ch_samplesheet_file = PRIDE_DOWNLOAD_FILE.out.downloaded_file + ch_samplesheet_file = PRIDEPY_DOWNLOAD_FILE.out.downloaded_file .map { meta, downloaded_file -> - "${meta.id}\t${meta.sample}\t${meta.condition}\t${downloaded_file}\t${meta.search_preset}" + [meta.id, meta.sample, meta.condition, downloaded_file, meta.search_preset].join('\t') } .collectFile(name: 'sdrf_samplesheet.tsv', seed: 'ID\tSample\tCondition\tReplicateFileName\tSearchPreset', newLine: true) emit: - samplesheet = ch_samplesheet_file // path: samplesheet.tsv with local file paths - search_presets = PARSE_SDRF.out.search_presets // path: search_presets.tsv + samplesheet = ch_samplesheet_file // path: samplesheet.tsv with local file paths + search_presets = SDRF_PIPELINES_PARSE_SDRF.out.search_presets // path: search_presets.tsv } /* diff --git a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf index 7da896ea..125e62fa 100644 --- a/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_mhcquant_pipeline/main.nf @@ -127,17 +127,14 @@ workflow PIPELINE_INITIALISATION { // ch_presets_map = ch_presets_file .map { presets_file -> - def presetsList = samplesheetToList(presets_file.toString(), "${projectDir}/assets/schema_search_presets.json") - presetsList.collectEntries { row -> - def meta = (row instanceof List) ? row[0] : row - ['fixed_mods', 'variable_mods'].each { key -> - def val = meta[key] - if (val == null || (val instanceof List && val.size() == 0) || val == '') { - meta[key] = '' - } + samplesheetToList(presets_file.toString(), "${projectDir}/assets/schema_search_presets.json") + .collectEntries { item -> + // samplesheetToList wraps all-meta rows in a list + def row = (item instanceof List) ? item[0] : item + // nf-schema parses empty TSV cells as [] instead of ''; normalize for string operations + ['fixed_mods', 'variable_mods'].each { key -> if (!row[key]) row[key] = '' } + [(row.preset_name): row] } - [(meta.preset_name): meta] - } } // @@ -174,13 +171,19 @@ workflow PIPELINE_INITIALISATION { channel.fromPath(params.fasta, checkIfExists: true) .map { fasta -> [[id:fasta.getBaseName()], fasta] } .set { ch_fasta } + + ch_samplesheet_raw + .map{ meta, file, fasta -> fasta } + .flatten() + .first() + .subscribe { + log.warn """\ + Both --fasta and samplesheet FASTA files were provided! + The pipeline will use --fasta (${params.fasta}), ignoring samplesheet FASTA entries. + To use the samplesheet FASTA files instead, remove the --fasta parameter. + """.stripIndent() + } } else { - if (inputType == 'sdrf' || inputType == 'pride_id') { - error '''\ - Error: No FASTA file provided. - When using SDRF or PRIDE input, please provide a FASTA database using --fasta. - '''.stripIndent() - } // Fasta from samplesheet column ch_fasta = ch_samplesheet_raw.map { meta, file, fasta -> [groupKey([id: "${meta.sample}_${meta.condition}"], meta.group_count), fasta] } ch_fasta From 2cc240e1293c54f0d654601e6098b45c376254f5 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Sun, 12 Apr 2026 17:31:58 +0000 Subject: [PATCH 095/104] Move pridepy download protocol flag to ext.args and use join for samplesheet header seed --- conf/modules.config | 1 + modules/local/pridepy/download_file/main.nf | 3 ++- subworkflows/local/sdrf_to_samplesheet/main.nf | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 7869643a..8d83a16d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -334,6 +334,7 @@ process { } withName: 'PRIDEPY_DOWNLOAD_FILE' { + ext.args = '-p ftp' errorStrategy = 'retry' maxRetries = 3 maxForks = 5 diff --git a/modules/local/pridepy/download_file/main.nf b/modules/local/pridepy/download_file/main.nf index 1d1464b4..9548f382 100644 --- a/modules/local/pridepy/download_file/main.nf +++ b/modules/local/pridepy/download_file/main.nf @@ -18,12 +18,13 @@ process PRIDEPY_DOWNLOAD_FILE { task.ext.when == null || task.ext.when script: + def args = task.ext.args ?: '' """ pridepy download-file-by-name \\ -a "${pride_accession}" \\ -f "${file_name}" \\ -o . \\ - -p ftp + ${args} # pridepy exits 0 even on download failure — validate file is non-empty [ -s "${file_name}" ] || { echo "ERROR: Downloaded file ${file_name} is empty"; exit 1; } diff --git a/subworkflows/local/sdrf_to_samplesheet/main.nf b/subworkflows/local/sdrf_to_samplesheet/main.nf index 6609b826..7d060ef0 100644 --- a/subworkflows/local/sdrf_to_samplesheet/main.nf +++ b/subworkflows/local/sdrf_to_samplesheet/main.nf @@ -54,7 +54,7 @@ workflow SDRF_TO_SAMPLESHEET { .map { meta, downloaded_file -> [meta.id, meta.sample, meta.condition, downloaded_file, meta.search_preset].join('\t') } - .collectFile(name: 'sdrf_samplesheet.tsv', seed: 'ID\tSample\tCondition\tReplicateFileName\tSearchPreset', newLine: true) + .collectFile(name: 'sdrf_samplesheet.tsv', seed: ['ID', 'Sample', 'Condition', 'ReplicateFileName', 'SearchPreset'].join('\t'), newLine: true) emit: samplesheet = ch_samplesheet_file // path: samplesheet.tsv with local file paths From 7acbdcfac9ff87e30dd1db2379a14d31d28da9bd Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Sun, 12 Apr 2026 20:33:30 +0000 Subject: [PATCH 096/104] Update test snapshots with stripped percolator version --- tests/default.nf.test.snap | 4 ++-- tests/ionannotator.nf.test.snap | 4 ++-- tests/search_presets.nf.test.snap | 2 +- tests/speclib.nf.test.snap | 2 +- tests/test_single_quant.nf.test.snap | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 489747bf..a6669ef5 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -26,7 +26,7 @@ }, "OPENMS_PERCOLATORADAPTER": { "PercolatorAdapter": "3.5.0-pre-exported-20251212", - "percolator": "3.07.1, Build Date Mar 13 2025 17:19:27" + "percolator": "3.07.1" }, "OPENMS_PSMFEATUREEXTRACTOR": { "openms": "3.5.0" @@ -384,6 +384,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-12T11:44:22.343699485" + "timestamp": "2026-04-12T20:25:20.873410846" } } \ No newline at end of file diff --git a/tests/ionannotator.nf.test.snap b/tests/ionannotator.nf.test.snap index 694b9d9b..77dd99cd 100644 --- a/tests/ionannotator.nf.test.snap +++ b/tests/ionannotator.nf.test.snap @@ -27,7 +27,7 @@ }, "OPENMS_PERCOLATORADAPTER": { "PercolatorAdapter": "3.5.0-pre-exported-20251212", - "percolator": "3.07.1, Build Date Mar 13 2025 17:19:27" + "percolator": "3.07.1" }, "OPENMS_PSMFEATUREEXTRACTOR": { "openms": "3.5.0" @@ -405,6 +405,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-12T13:24:09.318954712" + "timestamp": "2026-04-12T20:31:52.006375101" } } \ No newline at end of file diff --git a/tests/search_presets.nf.test.snap b/tests/search_presets.nf.test.snap index 72595e89..4410fbaf 100644 --- a/tests/search_presets.nf.test.snap +++ b/tests/search_presets.nf.test.snap @@ -26,7 +26,7 @@ }, "OPENMS_PERCOLATORADAPTER": { "PercolatorAdapter": "3.5.0-pre-exported-20251212", - "percolator": "3.07.1, Build Date Mar 13 2025 17:19:27" + "percolator": "3.07.1" }, "OPENMS_PSMFEATUREEXTRACTOR": { "openms": "3.5.0" diff --git a/tests/speclib.nf.test.snap b/tests/speclib.nf.test.snap index 7788ab52..2c4e1612 100644 --- a/tests/speclib.nf.test.snap +++ b/tests/speclib.nf.test.snap @@ -36,7 +36,7 @@ }, "OPENMS_PERCOLATORADAPTER": { "PercolatorAdapter": "3.5.0-pre-exported-20251212", - "percolator": "3.07.1, Build Date Mar 13 2025 17:19:27" + "percolator": "3.07.1" }, "OPENMS_PSMFEATUREEXTRACTOR": { "openms": "3.5.0" diff --git a/tests/test_single_quant.nf.test.snap b/tests/test_single_quant.nf.test.snap index 841f5149..12b2533a 100644 --- a/tests/test_single_quant.nf.test.snap +++ b/tests/test_single_quant.nf.test.snap @@ -26,7 +26,7 @@ }, "OPENMS_PERCOLATORADAPTER": { "PercolatorAdapter": "3.5.0-pre-exported-20251212", - "percolator": "3.07.1, Build Date Mar 13 2025 17:19:27" + "percolator": "3.07.1" }, "OPENMS_PSMFEATUREEXTRACTOR": { "openms": "3.5.0" From 664b006742ffb7cf48926b5ea3c85ec7f8a182e0 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Mon, 13 Apr 2026 12:24:31 +0000 Subject: [PATCH 097/104] Add SDRF input test profile and nf-test --- conf/test_sdrf.config | 30 + nextflow.config | 1 + tests/sdrf.nf.test | 54 + tests/sdrf.nf.test.snap | 8278 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 8363 insertions(+) create mode 100644 conf/test_sdrf.config create mode 100644 tests/sdrf.nf.test create mode 100644 tests/sdrf.nf.test.snap diff --git a/conf/test_sdrf.config b/conf/test_sdrf.config new file mode 100644 index 00000000..759bc37e --- /dev/null +++ b/conf/test_sdrf.config @@ -0,0 +1,30 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Nextflow config file for running SDRF/PRIDE input tests +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Defines input files and everything required to run a minimal test using an SDRF + sheet as --input. The pipeline fetches the RAW files from PRIDE and converts the + SDRF to a samplesheet + search presets before running the standard workflow. + + Use as follows: + nextflow run nf-core/mhcquant -profile test_sdrf, --outdir + +---------------------------------------------------------------------------------------- +*/ + +process { + resourceLimits = [ + cpus: 6, + memory: '24.GB', + time: '3.h' + ] +} + +params { + config_profile_name = 'SDRF test profile' + config_profile_description = 'Minimal SDRF input test dataset to check pipeline function' + + // Input data + input = params.pipelines_testdata_base_path + 'mhcquant/testdata/PXD009752.sdrf.tsv' + fasta = params.pipelines_testdata_base_path + 'mhcquant/testdata/UP000005640_9606.fasta' +} diff --git a/nextflow.config b/nextflow.config index 4931c017..46484ee2 100644 --- a/nextflow.config +++ b/nextflow.config @@ -230,6 +230,7 @@ profiles { singularity.runOptions = '--nv' } test { includeConfig 'conf/test.config' } + test_sdrf { includeConfig 'conf/test_sdrf.config' } test_mokapot { includeConfig 'conf/test_mokapot.config' } test_percolator { includeConfig 'conf/test_percolator.config' } test_ionannotator { includeConfig 'conf/test_ionannotator.config' } diff --git a/tests/sdrf.nf.test b/tests/sdrf.nf.test new file mode 100644 index 00000000..6c2d121f --- /dev/null +++ b/tests/sdrf.nf.test @@ -0,0 +1,54 @@ +nextflow_pipeline { + + name "Test pipeline with SDRF input" + script "../main.nf" + tag "pipeline" + profile "test_sdrf" + + test("-profile test_sdrf") { + + when { + params { + outdir = "$outputDir" + } + } + + then { + // stable_name: All files + folders in ${params.outdir}/ with a stable name + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + // stable_path: All files in ${params.outdir}/ with stable content + def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') + // Extract peptidoform column from all TSV files + def peptidoform_data = [] + new File(params.outdir).eachFileRecurse { file -> + if (file.name.endsWith('.tsv')) { + def lines = file.readLines() + if (lines.size() > 0) { + def header = lines[0].split('\t') + def peptidoformIndex = header.findIndexOf { it == 'peptidoform' } + if (peptidoformIndex >= 0) { + def peptidoforms = lines.drop(1).collect { line -> + def fields = line.split('\t') + fields.size() > peptidoformIndex ? fields[peptidoformIndex] : '' + }.findAll { it != '' }.sort() + peptidoform_data.add([file.name, peptidoforms]) + } + } + } + } + assertAll( + { assert workflow.success}, + { assert snapshot( + // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions + removeNextflowVersion("$outputDir/pipeline_info/nf_core_mhcquant_software_mqc_versions.yml"), + // All stable path name, with a relative path + stable_name, + // All files with stable contents + stable_path, + // Peptidoform data from TSV files + peptidoform_data + ).match() } + ) + } + } +} diff --git a/tests/sdrf.nf.test.snap b/tests/sdrf.nf.test.snap new file mode 100644 index 00000000..9bb29f5a --- /dev/null +++ b/tests/sdrf.nf.test.snap @@ -0,0 +1,8278 @@ +{ + "-profile test_sdrf": { + "content": [ + { + "MS2RESCORE": { + "MS2Rescore": "3.1.5" + }, + "OPENMSTHIRDPARTY_COMETADAPTER": { + "Comet": "2024.01 rev. 1", + "CometAdapter": "3.5.0" + }, + "OPENMS_DECOYDATABASE": { + "openms": "3.5.0" + }, + "OPENMS_IDFILTER_Q_VALUE": { + "openms": "3.5.0" + }, + "OPENMS_IDMASSACCURACY": { + "openms": "3.4.1" + }, + "OPENMS_IDMERGER": { + "openms": "3.5.0" + }, + "OPENMS_PEPTIDEINDEXER": { + "openms": "3.5.0" + }, + "OPENMS_PERCOLATORADAPTER": { + "PercolatorAdapter": "3.5.0-pre-exported-20251212", + "percolator": "3.07.1" + }, + "OPENMS_PSMFEATUREEXTRACTOR": { + "openms": "3.5.0" + }, + "OPENMS_TEXTEXPORTER": { + "openms": "3.5.0" + }, + "PRIDEPY_DOWNLOAD_FILE": { + "pridepy": "0.0.12" + }, + "PYOPENMS_CHROMATOGRAMEXTRACTOR": { + "pyopenms": "3.4.1" + }, + "SDRF_PIPELINES_PARSE_SDRF": { + "sdrf-pipelines": "0.1.2" + }, + "SUMMARIZE_RESULTS": { + "pyopenms": "3.4.1" + }, + "THERMORAWFILEPARSER": { + "thermorawfileparser": "1.4.5" + }, + "Workflow": { + "nf-core/mhcquant": "v3.2.0dev" + } + }, + [ + "intermediate_results", + "intermediate_results/comet", + "intermediate_results/comet/IP_lung_1T_060317_1_pin.tsv", + "intermediate_results/comet/IP_lung_1T_060317_2_pin.tsv", + "intermediate_results/rescoring", + "intermediate_results/rescoring/lc2_1_ms2rescore.idXML", + "intermediate_results/rescoring/lc2_1_pout.idXML", + "intermediate_results/rescoring/lc2_1_pout_filtered.idXML", + "intermediate_results/rescoring/lc2_1_psm.idXML", + "lc2_1.tsv", + "multiqc", + "multiqc/ms2rescore", + "multiqc/multiqc_data", + "multiqc/multiqc_data/llms-full.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", + "multiqc/multiqc_data/multiqc_chromatogram.txt", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_histogram_mz.txt", + "multiqc/multiqc_data/multiqc_histogram_rt.txt", + "multiqc/multiqc_data/multiqc_histogram_scores.txt", + "multiqc/multiqc_data/multiqc_length_dist.txt", + "multiqc/multiqc_data/multiqc_mass_error.txt", + "multiqc/multiqc_data/multiqc_percolator_barplot.txt", + "multiqc/multiqc_data/multiqc_scores_xcorr.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/percolator_plot.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/chromatogram-cnt.pdf", + "multiqc/multiqc_plots/pdf/chromatogram-log.pdf", + "multiqc/multiqc_plots/pdf/general_stats.pdf", + "multiqc/multiqc_plots/pdf/histogram_mz.pdf", + "multiqc/multiqc_plots/pdf/histogram_rt.pdf", + "multiqc/multiqc_plots/pdf/histogram_scores.pdf", + "multiqc/multiqc_plots/pdf/length_dist.pdf", + "multiqc/multiqc_plots/pdf/mass_error.pdf", + "multiqc/multiqc_plots/pdf/percolator_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/percolator_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/scores_xcorr.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/chromatogram-cnt.png", + "multiqc/multiqc_plots/png/chromatogram-log.png", + "multiqc/multiqc_plots/png/general_stats.png", + "multiqc/multiqc_plots/png/histogram_mz.png", + "multiqc/multiqc_plots/png/histogram_rt.png", + "multiqc/multiqc_plots/png/histogram_scores.png", + "multiqc/multiqc_plots/png/length_dist.png", + "multiqc/multiqc_plots/png/mass_error.png", + "multiqc/multiqc_plots/png/percolator_plot-cnt.png", + "multiqc/multiqc_plots/png/percolator_plot-pct.png", + "multiqc/multiqc_plots/png/scores_xcorr.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/chromatogram-cnt.svg", + "multiqc/multiqc_plots/svg/chromatogram-log.svg", + "multiqc/multiqc_plots/svg/general_stats.svg", + "multiqc/multiqc_plots/svg/histogram_mz.svg", + "multiqc/multiqc_plots/svg/histogram_rt.svg", + "multiqc/multiqc_plots/svg/histogram_scores.svg", + "multiqc/multiqc_plots/svg/length_dist.svg", + "multiqc/multiqc_plots/svg/mass_error.svg", + "multiqc/multiqc_plots/svg/percolator_plot-cnt.svg", + "multiqc/multiqc_plots/svg/percolator_plot-pct.svg", + "multiqc/multiqc_plots/svg/scores_xcorr.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/nf_core_mhcquant_software_mqc_versions.yml", + "sdrf", + "sdrf/samplesheet.tsv", + "sdrf/search_presets.tsv" + ], + [ + "samplesheet.tsv:md5,d30813e176017c883bd5364c2c969eea", + "search_presets.tsv:md5,3ba3b5c24f71025bfc1799ea87cd0a12" + ], + [ + [ + "lc2_1.tsv", + [ + "AAAAAAQSVY", + "AAAEASLNK", + "AAAKPVATK", + "AAALFTIHK", + "AAAPHTVSY", + "AAAPPQEQK", + "AAAPPTRAP", + "AADDKQPYEK", + "AAFDGGFTVK", + "AAFGGTFKK", + "AAIGLVIYY", + "AAISLAFSK", + "AAIVAYGLYK", + "AAKPTPPK", + "AALAKAIEK", + "AALDWVTKK", + "AALEKDYEEVGVD", + "AALEKPLSH", + "AALIPLVVK", + "AALPYPLKKK", + "AAM(Oxidation)LDTVVFK", + "AAM(Oxidation)QDPEVM", + "AAMEEKKVVQK", + "AAMLDTVVFK", + "AAMNMGRPFQK", + "AAMPGFIAK", + "AAMQDPEVM", + "AAMQDPEVMVA", + "AAPEKPLAGK", + "AAPGAEFAPNK", + "AAQDSTDLVAK", + "AAQESGTIPK", + "AAQESGTIPKK", + "AAQPPAPPR", + "AASSSSLEK", + "AASTPLASK", + "AATMCN(Deamidated)LCQR", + "AAVDFQFSK", + "AAVGYIMEK", + "AAYAARWVAK", + "AAYDKFKDK", + "AAYDSLVVGK", + "AAYEGSVAK", + "AAYNRYFRK", + "ADHLANSW", + "ADHLLTASW", + "AEAAAAAKF", + "AEAALKKEV", + "AEADGLSTNHW", + "AEADKTIKVY", + "AEAEAASVRM", + "AEAEAVREVY", + "AEAEKLGGQSY", + "AEAEPEHSF", + "AEAEQTLRF", + "AEAFVRAFL", + "AEAITLAERKY", + "AEAKARAEI", + "AEAKEKIYL", + "AEALGPLQSF", + "AEALHAHGY", + "AEALPKQSV", + "AEALSQAVARY", + "AEANVMKTL", + "AEAPVPEEF", + "AEAQLRFIQAW", + "AEASMISKL", + "AEAVSTRW", + "AEAYGKKEW", + "AEAYLGKKV", + "AEAYLGKTV", + "AEDAMRLYY", + "AEDAPWKKI", + "AEDDARTQW", + "AEDDFKKVL", + "AEDEDLRVHF", + "AEDEGTQRL", + "AEDEGVSQRKF", + "AEDELFNRY", + "AEDENGKIVGY", + "AEDGLKHEY", + "AEDIAKIKKF", + "AEDIPKHRQ", + "AEDKENYKKF", + "AEDKENYKKFY", + "AEDKKGHLI", + "AEDLGGPYVW", + "AEDLNSRVS", + "AEDLNSRVSYW", + "AEDLNTRVAY", + "AEDLNTRVAYW", + "AEDLRAKAEW", + "AEDLVGKSLY", + "AEDLVVTKY", + "AEDMETKIKNY", + "AEDMSHKRL", + "AEDMTSKDYY", + "AEDNLIHKF", + "AEDPSLERHF", + "AEDQRTSTY", + "AEDTYPQKI", + "AEDYAKERY", + "AEEAEKQLF", + "AEEDPAHAF", + "AEEEGPKREL", + "AEEEGVNKF", + "AEEEIGTPRKF", + "AEEHPKKAF", + "AEEKEDGRRW", + "AEEKKEEKTW", + "AEEKNISSKY", + "AEEKQTKSF", + "AEEKSSIHDARSW", + "AEEKTISAKY", + "AEELERQGY", + "AEELFARKF", + "AEELIRDGRY", + "AEEQLLKHGW", + "AEERAEAKKKF", + "AEESDLSRQY", + "AEESGRLW", + "AEESRKHINTW", + "AEEWYKSKF", + "AEFARIMSI", + "AEFEEPRVIDLW", + "AEFELPKTM", + "AEFKEAFQ", + "AEFKEAFQL", + "AEFKEAFQLF", + "AEFKEAFS", + "AEFKEAFSL", + "AEFKEAFSLF", + "AEFKTKYKL", + "AEFKVTIKY", + "AEFN(Deamidated)KSQTSF", + "AEFNRIMSL", + "AEFQSIPRVF", + "AEFRDPLGY", + "AEGDLIEHF", + "AEGEINNVQW", + "AEGEIYTKL", + "AEGENKTSKSW", + "AEGEVVQVKW", + "AEGEVVQVRW", + "AEGFISRMQY", + "AEGGGAKFKKY", + "AEGHYTVSY", + "AEGIHTGQF", + "AEGITFIKF", + "AEGKLISVEY", + "AEGPPRLAI", + "AEGSVAREEW", + "AEGTAQQRL", + "AEGTEEGARW", + "AEGTLSKKL", + "AEGVEPGSQRW", + "AEGVIVGHW", + "AEHDRIARQW", + "AEHDRMARQW", + "AEHFLEQQM", + "AEHGDQDYIW", + "AEHIESRTL", + "AEHLGDFHRTY", + "AEHLGEMNRQW", + "AEHLTSHKY", + "AEHPELRSY", + "AEIDARNDSF", + "AEIDDRKQL", + "AEIDKLATEY", + "AEIDSIHQL", + "AEIEIVKEEF", + "AEIEKLGQKY", + "AEIGRNYSM", + "AEIIASHW", + "AEIIKEDLW", + "AEIIKGELW", + "AEIKQIVSEY", + "AEILLSNHY", + "AEILQESRM", + "AEIMTPPTKTLW", + "AEINNIIKI", + "AEIPADPKLY", + "AEIRAINEAY", + "AEIRHVLVTL", + "AEIRSLVTW", + "AEITDKLGL", + "AEIVEGENHTY", + "AEKAPTNIVY", + "AEKAVTKEEF", + "AEKAYHEQL", + "AEKELHEKF", + "AEKELTDRNW", + "AEKLITQTF", + "AEKVIGAGKSW", + "AELAGVIKRL", + "AELAVGSRW", + "AELDKTNKF", + "AELDRQIKSF", + "AELEDDFKEGY", + "AELEENQRSY", + "AELESSKEQF", + "AELGGLLKY", + "AELGPLNKY", + "AELISVSKF", + "AELKQLNQQY", + "AELNAEDQNRW", + "AELNHQKQL", + "AELQSKRASF", + "AELSEQIKSF", + "AELTGIKW", + "AELTPHQTF", + "AEMAQNAVRL", + "AEMEKHKKF", + "AEMEVKRESY", + "AEMILKVVM", + "AEMLPGVLQQF", + "AEMNGKLI", + "AEMNRGSNEW", + "AEMQAGDRY", + "AEMQWKRDY", + "AENAEFMRNF", + "AENDPTRQY", + "AENEENKGF", + "AENELNQSY", + "AENESMAKI", + "AENGKSNFL", + "AENIDAQLKRM", + "AENIPENPLKY", + "AENIQPGEQKY", + "AENISRVLY", + "AENKEIQKL", + "AENNIQPIF", + "AENPFLTHL", + "AENPGKYNI", + "AENQTVVKY", + "AENSYVKMT", + "AENVPASKF", + "AENYHDIKRI", + "AEPDFVVTDF", + "AEPDNKNVY", + "AEPLAPQPPAGPS", + "AEPRVEDFGNAW", + "AEPTPEKEKRF", + "AEPVTTHSF", + "AEPWNHGKTF", + "AEQDFISKF", + "AEQELANLEKW", + "AEQESARQL", + "AEQGKPVSF", + "AEQMPQHTL", + "AESAFSFK", + "AESALQLLYT", + "AESASEAAKKY", + "AESDFASTF", + "AESDIMKRQ", + "AESEEGPDVLRW", + "AESEYTFERW", + "AESGAKEEL", + "AESGRGQVM", + "AESHIILVL", + "AESIVVHTY", + "AESKEIVRGY", + "AESKGVVKF", + "AESLKTLRY", + "AESLQPKGY", + "AESMYQIKY", + "AESNEANSKW", + "AESVGAKHY", + "AESVVPARM", + "AETDFEKRDF", + "AETDLSQGVARW", + "AETERLEGW", + "AETGQVQKI", + "AETGSVKDF", + "AETHIVLLF", + "AETLIFVKY", + "AETPDIKLF", + "AETTTLFQF", + "AETVQTVRY", + "AEVAAEKSF", + "AEVAPVKDM", + "AEVDIIEQM", + "AEVDKVTGRF", + "AEVEAILNSGARGY", + "AEVEENKKM", + "AEVEQKKKRTF", + "AEVERVKNM", + "AEVFNYREF", + "AEVFPLKVF", + "AEVKIEKRT", + "AEVMPAQW", + "AEVMPAQWEF", + "AEVSPDAKTSL", + "AEVTTKSQI", + "AEWEERISAW", + "AEWQLDQPSW", + "AEYIEKVVY", + "AEYPAVKF", + "AEYPFSSEQKW", + "AEYVHGSQAW", + "AEYVSAREW", + "AFDASRTSF", + "AFDEAKADF", + "AFDERVFL", + "AFDISKKEM", + "AFDLDVVKL", + "AFDLTEQRY", + "AFDLTKTNM", + "AFDNMVTSM", + "AFDPTSTLL", + "AFDVAEREF", + "AFGGTFKK", + "AFIDRHPRL", + "AFIEKHWTF", + "AFIKIKMAF", + "AGDGTFQKW", + "AGHINPLIIY", + "AGIASSSIAAK", + "AGISFSVKK", + "AGLDIFAKF", + "AGMALGIQK", + "AGMTGYGMPR", + "AGTQ(Deamidated)PGPLLK", + "AIADAQSAIEK", + "AIALALREK", + "AIALPVTMK", + "AIANFTNQK", + "AIAQAESLRYK", + "AIAQLNYADMLK", + "AIASTLVHK", + "AIDSGSSAAQLPQK", + "AIFDGSTQK", + "AIFDKSTGK", + "AIFKGVFVHR", + "AIFKPVMSK", + "AIFQGKLEK", + "AIFQGKLEKK", + "AIFVLPHEK", + "AIIAILTPK", + "AIIDHIFASK", + "AIIENMSTK", + "AIITPPPAK", + "AIITPPPAKK", + "AIIWFLYKK", + "AILDKNFRK", + "AILDKTTNK", + "AILDYLITK", + "AILEKSRLK", + "AIM(Oxidation)DPLPLRTK", + "AIMDPLPLR", + "AIMDPLPLRTK", + "AIMSGRDLIGIAK", + "AINEAISVK", + "AIQDAVGPPK", + "AIQDPRLFAEEK", + "AIQNPTMINK", + "AIQPNTTGK", + "AISAGLIAK", + "AISSSAISK", + "AITGASLADIMAK", + "AIVAYGLYK", + "AIVESALYK", + "AIVKLFLKK", + "AIYDHINEGK", + "AIYELAVASFPK", + "AIYEPKTFK", + "AIYGRFDSK", + "AIYGTRKFK", + "AIYKTPPGIQK", + "AKKPKPKKVAPLK", + "ALADFLPVMK", + "ALAPPAQQK", + "ALDPQDRKW", + "ALFAKPLKGK", + "ALFDGVVSK", + "ALFLTLTTK", + "ALLDGSNVVFK", + "ALLEKAYAK", + "ALMEKFKKK", + "ALMGYATHK", + "ALPLDTVTFYK", + "ALPSKLPTF", + "ALPVLERLIYK", + "ALSFSSSAGPGLLK", + "ALSTPVVEK", + "ALYGVVNVK", + "ALYSGVHKK", + "AMAEIYKYAK", + "AMLDTVVFK", + "AMMGAVAEK", + "AMSERALAQK", + "AMYPDYFAK", + "AMYTYFQAK", + "ANMGGTVAHK", + "APANHQVVY", + "APAPIHNQF", + "APAPPASQY", + "APAPSTVHF", + "APAPVINSKY", + "APDELHYTY", + "APEEHPVLL", + "APEVSQHVY", + "APFDKTANITF", + "APFEGLGKVYIY", + "APFEQAGQKY", + "APFHQLRIQY", + "APFHQLRISY", + "APFSKVITF", + "APIAGETKVWQY", + "APIDWGEEY", + "APISEPIEWKY", + "APISLHVSY", + "APLKLQMEF", + "APLKSKMIY", + "APLPPAPAY", + "APLQEKVVF", + "APRADAKAY", + "APSKTSLIM", + "APSVVKISY", + "APSVVKVSY", + "APTTHTEEY", + "APVATVPAM", + "APVEVTHNF", + "APVFRDYVF", + "APVGGHILSY", + "APVLVVLRY", + "APVPTGEVY", + "APVSGAGNHSY", + "APWIESQDW", + "APWIESQDWAY", + "APWQERSTM", + "APYGNPKNMAY", + "AQAESLRYK", + "AQAQAQAQVPAK", + "AQAQEVFFLK", + "AQARPPGIYK", + "AQATISFPK", + "AQFGGKILRK", + "AQFIPKFFK", + "AQFRQPLKK", + "AQGNVYHLK", + "AQIENSAAVEK", + "AQIENSAAVQK", + "AQIGSYVHVGK", + "AQINSVFNK", + "AQITATIAK", + "AQLNAFLSK", + "AQMRAAINQK", + "AQNAKVIEK", + "AQNEPLTQK", + "AQNPSLFVK", + "AQNSVIIVDK", + "AQQDKLDKINK", + "AQQKVPSKLK", + "AQQQQVIRK", + "AQTGTRWNK", + "AQWEDVVQK", + "AQYDPTKNASK", + "AQYDPTKNASKK", + "AQYDQPLEK", + "AQYDRYVNK", + "AQYEQDLQHRK", + "AQYQFTGIKK", + "AQYSPQQLAGK", + "ARKSAPSTGGVK", + "ARNPAMMQEM", + "ASAAAALVLK", + "ASAGPPSLRK", + "ASAHFSPVLR", + "ASAIPAYSK", + "ASALGSSSYKK", + "ASANLGGVPSK", + "ASAPANVSK", + "ASAPGYLAITK", + "ASAPPQEQK", + "ASASASLPTK", + "ASATQPSPVK", + "ASATVAIPK", + "ASAYSIAQK", + "ASAYYPSSFPK", + "ASDPHIIIK", + "ASDPNVSKKLK", + "ASDTFSGIGK", + "ASEVLKHLK", + "ASFDGTFLWK", + "ASFDKAKLK", + "ASFDKAKLKK", + "ASFENVRAK", + "ASFEVEKTKK", + "ASFGKSFAQK", + "ASFLLTGGK", + "ASFLPPSSVKK", + "ASFPGANIIGNK", + "ASFPGISTGPMKK", + "ASFQKVISR", + "ASFQSTSVK", + "ASFSKRIQK", + "ASFTPTSILK", + "ASGGIIGYVK", + "ASGPRPTYK", + "ASGSTTFTK", + "ASIFVKDNVTK", + "ASIISLKSDKK", + "ASILSLVTK", + "ASINLNAINK", + "ASIQNHVRK", + "ASIQPSKVGK", + "ASLADIMAK", + "ASLATTLTK", + "ASLMHSFILK", + "ASLPLAVTK", + "ASLPSESNEPK", + "ASLQVSSHK", + "ASLSPSVSK", + "ASLTAALAK", + "ASLVGQTSPK", + "ASM(Oxidation)PDNTAAQK", + "ASMDKLREK", + "ASMDPKRFYKK", + "ASMEEVFHR", + "ASMGVLSGK", + "ASMPDNTAAQK", + "ASMPENTVAQK", + "ASMPHALSY", + "ASMPHPLRSR", + "ASMPVDIAK", + "ASMPWGDPNYR", + "ASMSAFDPLK", + "ASMTQNLEPLLK", + "ASNFKSPVK", + "ASNNMVTTEK", + "ASNPATFQR", + "ASPESVTGK", + "ASQAGMTGYGMPR", + "ASQEGTIQK", + "ASQEIAEKALK", + "ASQEIAEKALKK", + "ASQELWLNH", + "ASQLGIFISK", + "ASQLVGIEK", + "ASSALFMAK", + "ASSAPPLTGK", + "ASSFLTPPK", + "ASSGLSVVK", + "ASSGVPNPPK", + "ASSHVPIQK", + "ASSKDAIKK", + "ASSPPAIPK", + "ASSQALGTIPK", + "ASSSPAALK", + "ASSTIVPSLK", + "ASSTPTPIRK", + "ASTGLSLTK", + "ASTLSLVNK", + "ASTSATTPVK", + "ASVETGFAK", + "ASVFGTMPLK", + "ASVFVKLQK", + "ASVGYAVTK", + "ASVILPILK", + "ASVKAIFSK", + "ASVNTLVNK", + "ASVPAQAPK", + "ASVYQPLKK", + "ASYAAVPLYR", + "ASYDDPYKK", + "ASYDTSAPNAK", + "ASYDYVRRR", + "ASYEKNLPK", + "ASYENVRAK", + "ASYGRDAFAK", + "ASYGSTTTK", + "ASYGVSKGK", + "ASYMGKENLK", + "ASYMGKENLKK", + "ASYNVKTAYRK", + "ASYPSGSGKPK", + "ASYSDGKLK", + "ASYTKIVVK", + "ASYVASTKYQK", + "ASYVSPVLK", + "ASYYGGRGVGGIK", + "ATAAAIGATPR", + "ATAASSSSLEK", + "ATAASSSSLEKS", + "ATAATTVLR", + "ATAAVSSMK", + "ATADLALGR", + "ATAEAKISKQK", + "ATAGAYIASQTVK", + "ATAGDGLIELRK", + "ATAGFTIGR", + "ATAGIIGVNR", + "ATAGIIGVNRK", + "ATAHHLGLLK", + "ATAIGM(Oxidation)PVEK", + "ATAIGMPVEK", + "ATALEYVYK", + "ATALPTGTSK", + "ATAMLQSLLK", + "ATAMVTEQK", + "ATANGGLSK", + "ATAPAPTAHK", + "ATAPASSPGLAK", + "ATAPGTQER", + "ATAPPAPAY", + "ATAPPAPAYK", + "ATAPPSPLK", + "ATAQFKINKK", + "ATAQVNPLYK", + "ATASGNANMVNK", + "ATASPPRQK", + "ATASVNLKVSPK", + "ATATGTEILK", + "ATATLIIEHK", + "ATATSSPPPK", + "ATATVAALQEK", + "ATATVSVGK", + "ATATVYFKR", + "ATAVTNLYK", + "ATAYLPMLEK", + "ATDAAANLTK", + "ATDAVGIVLK", + "ATDDYFRHK", + "ATDDYHYEK", + "ATDGSFANK", + "ATDIPSSQK", + "ATDKSFVEK", + "ATDKTFVEK", + "ATDPDAGFNGK", + "ATDPKAIGH", + "ATDPNILGR", + "ATDYGTIKK", + "ATDYPLIAR", + "ATEESFFILK", + "ATEGGVLKK", + "ATEHLSTLSEK", + "ATEPPTESLLK", + "ATEPTPAQK", + "ATEQEDAAVAK", + "ATEQPLTAK", + "ATEQPLTAKK", + "ATETSGPTYIK", + "ATEYHLGLLK", + "ATFAATKFGSTK", + "ATFERVLLR", + "ATFFGEVVK", + "ATFGTQVVEK", + "ATFKDLLTRHK", + "ATFKLEKNK", + "ATFLDPRYK", + "ATFMEVLTK", + "ATFPDPNVK", + "ATFPGMWER", + "ATFPLSVQK", + "ATFQFTVERF", + "ATFQNTGTYR", + "ATFSSSHRYHK", + "ATFTNVFGK", + "ATFTVMGLK", + "ATFYGPVKK", + "ATGAPAPSR", + "ATGDM(Oxidation)SGLLK", + "ATGDMSGLLK", + "ATGDVALLR", + "ATGESIAVKK", + "ATGGLEGKMK", + "ATGGTFVVK", + "ATGGWSSSK", + "ATGIILPAR", + "ATGILGAVFK", + "ATGKLFAVK", + "ATGKVMVMK", + "ATGLSGLTK", + "ATGNAILGK", + "ATGNWGDQK", + "ATGNWGDQKK", + "ATGPALDNK", + "ATGQWTRFK", + "ATGQWTRFKK", + "ATGRYYAMK", + "ATGSVFTGK", + "ATGSWDSFLK", + "ATHTAFVAK", + "ATIALMIQR", + "ATIDGSVNPK", + "ATIDSQHGIEK", + "ATIEDILFK", + "ATIEEAYSR", + "ATIEELTEK", + "ATIEETYSK", + "ATIEGYYQK", + "ATIGIVDGIFTR", + "ATIGVDFALK", + "ATIIDILTK", + "ATIIDILTKR", + "ATIKMTVER", + "ATILAGDIKVK", + "ATILAGDVKVK", + "ATIMGVRFK", + "ATINNPNLLTK", + "ATINYSLLR", + "ATIQELNTIRK", + "ATIQGAYAR", + "ATIQNETPK", + "ATIRVLEAIQK", + "ATIRVLEAIQKK", + "ATIRVLESVQK", + "ATISNDGATILK", + "ATITDKELLKK", + "ATITDKEMLK", + "ATITDKEMLKK", + "ATITKVLQK", + "ATKDSMIRK", + "ATKMNELMEK", + "ATLAAVLQR", + "ATLDFKPLHK", + "ATLDIDGVRK", + "ATLDVAVRR", + "ATLEETLVKK", + "ATLEETLVKKK", + "ATLEIVTDK", + "ATLESIQRK", + "ATLETILRH", + "ATLGAILNR", + "ATLGAILNRL", + "ATLGALLQK", + "ATLGDLKLVEK", + "ATLGSGNLRQ", + "ATLHAQVADMKK", + "ATLKPSNKAFEK", + "ATLKWILENK", + "ATLLASNEAFK", + "ATLLASNEAFKK", + "ATLLIFANK", + "ATLNSIVAK", + "ATLNVSTTR", + "ATLPDLKTMEK", + "ATLPKNPPPK", + "ATLPNQPVEK", + "ATLPNQVHR", + "ATLPNQVHRK", + "ATLQDIIRR", + "ATLQEALAH", + "ATLQNVLRK", + "ATLSEIKALLK", + "ATLSQFYINK", + "ATLTGGPAR", + "ATLTNILEH", + "ATLTTTSATSK", + "ATLWGGLLR", + "ATMATSGSARK", + "ATMITKRLAQVK", + "ATMKPHPTVQK", + "ATMLATGGNRKK", + "ATMPKKGILK", + "ATMPKKGILKK", + "ATMPSDVLEVTK", + "ATMPSDVLEVTKK", + "ATMPTDVLEVTKK", + "ATMQESLRVK", + "ATMQGDREQLK", + "ATNAAAQNAIKK", + "ATNDSVVADK", + "ATNETPLSR", + "ATNKITIIFK", + "ATNNMNLSR", + "ATNRSVYFK", + "ATNSSMFLK", + "ATNTSAPDLK", + "ATNTVYVFAK", + "ATNYITRNK", + "ATPAATTSPK", + "ATPEKSLHDK", + "ATPELGSSLK", + "ATPENPTIRK", + "ATPEQVGKMK", + "ATPKFGPYQK", + "ATPKKTVPK", + "ATPLDFPSKK", + "ATPLSTLSLK", + "ATPSPSNETPK", + "ATPSSSLPK", + "ATPTPSTFAI", + "ATPTSPIRVK", + "ATQAVEDVLNIAK", + "ATQAVFQKR", + "ATQDILKALSK", + "ATQDPQIEK", + "ATQEGEWKALK", + "ATQFENWYK", + "ATQGLGSNQNALK", + "ATQMVRMILK", + "ATQN(Deamidated)AHGTGISK", + "ATQNAHGTGISK", + "ATQNSSQFMK", + "ATQQEFYAK", + "ATQQPVTADK", + "ATQSFSTFR", + "ATQTQFFHVK", + "ATQTSVVVK", + "ATQVAVSVPK", + "ATQYPVSNR", + "ATSAFQTQK", + "ATSAPLVSR", + "ATSAVTVTR", + "ATSDAVGSSLK", + "ATSDM(Oxidation)DIGK", + "ATSDMDIGK", + "ATSDPKQLSK", + "ATSGGSAEQIK", + "ATSGKQSNFSR", + "ATSGVPVYK", + "ATSGVVAVR", + "ATSIDRLKVFK", + "ATSIPAILK", + "ATSISSETK", + "ATSKPVPAEK", + "ATSLGHFTK", + "ATSLVFKQK", + "ATSNVHMVKK", + "ATSPAGTAQAR", + "ATSPALFNR", + "ATSPIIIHR", + "ATSPIIIHRL", + "ATSPPFQLTK", + "ATSPVVYTR", + "ATSQQPLRK", + "ATSSFGGLGGGSVR", + "ATSSLDQTVK", + "ATSSVSALK", + "ATSTGGIVNK", + "ATSVITIVK", + "ATSVVSFVR", + "ATSVYLVQK", + "ATSYFGKQFLR", + "ATSYLWFKK", + "ATTGELAANK", + "ATTHEIMGPK", + "ATTLPIRNK", + "ATTPTVTSSK", + "ATTQTIMQK", + "ATTSLSLRR", + "ATTSLSWKR", + "ATTSMAYAK", + "ATTSNTVSK", + "ATTSVITIVK", + "ATTTTVTTK", + "ATTTVMNPK", + "ATVAAILQH", + "ATVAGVHVK", + "ATVAVPLVGK", + "ATVDIVQKK", + "ATVETTIAR", + "ATVGKATGFLK", + "ATVISLPAK", + "ATVKLEHAK", + "ATVLTSVKK", + "ATVLTTERK", + "ATVLYIVKK", + "ATVNPSAPR", + "ATVQNRFTK", + "ATVRPPVAVK", + "ATVTPSPVK", + "ATVYLIYLK", + "ATWATKELRK", + "ATWKSNYFLK", + "ATWMGKIHSK", + "ATYAGVGANK", + "ATYEAGALSLK", + "ATYEAGALSLKK", + "ATYEQGVEK", + "ATYETKESK", + "ATYGDTINR", + "ATYGKPVHH", + "ATYGLNVER", + "ATYHANTEREQK", + "ATYHGSFSTK", + "ATYHGSFSTKK", + "ATYILEAGK", + "ATYNKQPMYR", + "ATYPDVNNSIK", + "ATYPMPTAK", + "ATYPYQVVR", + "ATYRDWISK", + "ATYREGMTK", + "ATYSVGMQK", + "ATYVQPRRK", + "AVAAFQVEK", + "AVAAFVLYK", + "AVAAVAARR", + "AVADAVIEK", + "AVADKVHLMYK", + "AVADSVLTK", + "AVAEDGGLKK", + "AVAEGAKNVMK", + "AVAEGAKNVVK", + "AVAEPANAVK", + "AVAEPLPSPR", + "AVAGDASESALLK", + "AVAGDFALINK", + "AVAGTGPPR", + "AVAIKAMAK", + "AVAKADKLAEEHSS", + "AVALINAAIQK", + "AVALPLQTK", + "AVANIVNSVK", + "AVAPAGILK", + "AVAPNQNLK", + "AVAPPAGPR", + "AVAPPTPASK", + "AVAPVASALEK", + "AVAQAIMSK", + "AVAQLWGQKK", + "AVASFPKKQE", + "AVASVTEILK", + "AVATALGLK", + "AVATGSWDSFLK", + "AVATKFVNK", + "AVATNQPPK", + "AVATSQLQK", + "AVAVDVAVPK", + "AVAWLVAMHK", + "AVDATLRKK", + "AVDDKQLRK", + "AVDPSSGHPR", + "AVDRYLRVK", + "AVDSKVASYEK", + "AVDTAYVAK", + "AVDTETLQK", + "AVEDAIARK", + "AVEDTVAAK", + "AVEGPSEAK", + "AVFASEVKK", + "AVFDHPAKIAK", + "AVFEWHITK", + "AVFGVIGSQK", + "AVFGVPASK", + "AVFIHGLHAK", + "AVFKGIAADK", + "AVFPFKPPQR", + "AVFPKPFVEK", + "AVFPNEDGSLQK", + "AVFPSLLTNPK", + "AVFRGRMSMK", + "AVFSKSVQK", + "AVFTIVFTQK", + "AVGAVKALK", + "AVGDTPIMK", + "AVGGGYTAK", + "AVGLVLPAK", + "AVGLVLPAKL", + "AVGNIKVTK", + "AVGPHLTAK", + "AVGPKVALK", + "AVGRGLQPK", + "AVGVIKNVEK", + "AVGVPIKVK", + "AVHDITVAY", + "AVHEAWAGMLK", + "AVIAINEAVEK", + "AVIDVGINR", + "AVIEDTWHY", + "AVIEHLKQK", + "AVIENLPKK", + "AVIGADSVTLK", + "AVIGNVQEK", + "AVIKEKIEEK", + "AVILPPLSPYFK", + "AVINAYTEINK", + "AVIPEKQLVEK", + "AVIQALAQK", + "AVIQVGKEK", + "AVIQVSQIVAR", + "AVITNKDVRK", + "AVIVLVENFYK", + "AVIWEVLRK", + "AVLDALLASK", + "AVLDFVKQK", + "AVLDLGSLLAK", + "AVLDLSWNK", + "AVLDYLYTK", + "AVLEKQDISDK", + "AVLFPAAHRPK", + "AVLKHIENK", + "AVLLVFANK", + "AVLPSVLNK", + "AVLPTPVTK", + "AVLQESVAK", + "AVLSSPLSH", + "AVLSWKLAK", + "AVLTALDVLQK", + "AVLTHSGFPAK", + "AVLWEALRK", + "AVLYQPLFDK", + "AVMAESAFSFK", + "AVMAESAFSFKK", + "AVMDGNVITAK", + "AVMDNKNPTIK", + "AVMDSDTTGK", + "AVMDVVKKQK", + "AVMEMMSQK", + "AVMGAYVLLK", + "AVMGNPVTR", + "AVMKDVVLIRK", + "AVMPLRDVTAK", + "AVMRFLTQR", + "AVMSATFAK", + "AVMWRRKSSDRKG", + "AVNAHSNILK", + "AVNEAILLK", + "AVNLHPIRK", + "AVNMVPFPR", + "AVNPYFDIPK", + "AVNYFSKVK", + "AVPAGPLTTK", + "AVPEAPIAKK", + "AVPEASASPK", + "AVPNGPQSPK", + "AVPTNIIAAK", + "AVPVSESNVAK", + "AVQAQKKILGK", + "AVQAVNAHSNILK", + "AVQDAVDALMQK", + "AVQEATRLK", + "AVQEFGLAR", + "AVQEFGLARFK", + "AVQEQMRSK", + "AVQGDVGSFVLK", + "AVQGISGLPLK", + "AVQIPFFAK", + "AVQKAIPMYK", + "AVQKFHREK", + "AVQKKTFTK", + "AVQLPARFK", + "AVQNLPTKK", + "AVQNTNDSSALSK", + "AVQPSDNISRK", + "AVQQPFINK", + "AVQQVNAMIEK", + "AVQRTLLEK", + "AVQSSSFER", + "AVQTAAKELLK", + "AVSAGHGLPAK", + "AVSATIIQR", + "AVSAVVHEY", + "AVSEGTKAVTK", + "AVSKDIANWQK", + "AVSQDVLMK", + "AVSQNMGIGK", + "AVSSLATAK", + "AVSSQMIGK", + "AVSTDYKKLKK", + "AVSTFAM(Oxidation)VK", + "AVSTFAMVK", + "AVSTLGISK", + "AVSTPSTQK", + "AVSVKGIYK", + "AVTDAIMSR", + "AVTDQTVSK", + "AVTEAEIQQLK", + "AVTEYIQRK", + "AVTKYTSAK", + "AVTKYTSSK", + "AVTSGVATK", + "AVTTVVNPK", + "AVTYTEHAK", + "AVVDIYHSR", + "AVVDVRIGMTRK", + "AVVEKIHAK", + "AVVELVTVK", + "AVVGAVVFQK", + "AVVGGLDIHKK", + "AVVGPVGAGK", + "AVVKPGNTK", + "AVVNSPHRQYK", + "AVVQTLVAK", + "AVVSVIFLK", + "AVVTESQTYKK", + "AVWDVGSHFK", + "AVYADSGNFK", + "AVYDFFIGR", + "AVYDGHAGSQVAK", + "AVYDRPGASPK", + "AVYENAREK", + "AVYERHFLR", + "AVYETPTAH", + "AVYGGFKSK", + "AVYGMLNLTPK", + "AVYGQKEIHRK", + "AVYGQNDIHHK", + "AVYKTHVEK", + "AVYLLPVPK", + "AVYLSTCKDSK", + "AVYNPEAVNEPK", + "AVYQARPQLHK", + "AVYSHVIQK", + "AVYTKMMTK", + "AVYTKMMTKK", + "AVYVPFWQK", + "AWAPKPYHKF", + "AWLPHVADFRW", + "AYAIIKEEL", + "AYATHPFKF", + "AYDTVRWEF", + "AYGHFSYEF", + "AYGKDFHLI", + "AYGNVFSAF", + "AYIADHLGF", + "AYIFIHRKW", + "AYIPLNNYL", + "AYLDKSPQF", + "AYLDSTERF", + "AYLEAHETF", + "AYLEAIHNF", + "AYLESFYKF", + "AYLHTTTTF", + "AYLKAIVLF", + "AYLKLRNWQW", + "AYLNITKHL", + "AYLPEWKENI", + "AYLPKMMTL", + "AYLPVNESF", + "AYLPVNESFGF", + "AYLSGM(Oxidation)LRF", + "AYLSGMLRF", + "AYLTVHQRI", + "AYMPHTFFI", + "AYPTVKFYF", + "AYSAKIALF", + "AYSDGHFLF", + "AYSRVQYQF", + "AYTPFHAVL", + "AYVELVHHI", + "AYVEWFNRL", + "AYVHM(Oxidation)VTHF", + "AYVHMVTHF", + "AYVKGGLSTF", + "AYVNTFHNI", + "AYVPGFAHI", + "AYVPVSDMNGLGF", + "AYVQIKTIW", + "CIAEQPQPK", + "DAADIRFVY", + "DAAGPHEAF", + "DAAHEFTVY", + "DAAKNQVAM", + "DAAPALSHY", + "DAARLQAAY", + "DAARLVMLY", + "DAAYSHHY", + "DAFKSGIVQY", + "DAGPPTHAF", + "DAGVCVLREK", + "DAHGVVIVF", + "DAHISSML", + "DAHMLDTQY", + "DAHPTLVTY", + "DAHVDSTTY", + "DAIRLAVSY", + "DAIRLFAAY", + "DAIRNLHHY", + "DAIRSLASVSY", + "DAISKTYSY", + "DAISSVERY", + "DAITEAGKTY", + "DALGFAVRY", + "DALGHFFQY", + "DALITHVL", + "DALKILQY", + "DALKSSYY", + "DALQVAQEM", + "DAMKDLAQY", + "DAMQAAVQY", + "DANPETHAF", + "DANRQISEY", + "DASALRILF", + "DASGAKLDY", + "DASKVVTVF", + "DASPVQAVF", + "DAVHAILAY", + "DAVREIRKY", + "DAVREVRKY", + "DAVRTKMVY", + "DAVVSQVL", + "DAWIEHDVW", + "DAWKQLQTF", + "DAYPEIEKF", + "DDALNHDFF", + "DDIGDDDEDIDDI", + "DEAEVHLKF", + "DEAIEKPTY", + "DEAKNINKSL", + "DEALIGKKF", + "DEAQLNKENW", + "DEARDLIQRY", + "DEARNLHSKW", + "DEARSLKAY", + "DEAVGVQKW", + "DEDAYKKQF", + "DEDGGSEKKY", + "DEDGSTLFRGW", + "DEDMTLTRW", + "DEDPHDRAVW", + "DEDPTGNKALW", + "DEDTIYHL", + "DEDVTSKAF", + "DEEETYRLW", + "DEFHNPLAY", + "DEFSEAIKAF", + "DEFSHQVQEW", + "DEHEGPAL", + "DEHEGPALYY", + "DEIDAIATKRF", + "DEIDAIGGRRF", + "DEIDAIGTKRY", + "DEIENVAKQF", + "DEIERKFDKW", + "DEIERTKQF", + "DEILLSKAEW", + "DEILQGKSDW", + "DEINHVQKTY", + "DEITGKKGY", + "DELDAIGTKRF", + "DELDSKLNY", + "DELEIKAYY", + "DELELHQRF", + "DELKIPIRSW", + "DELQIPVKW", + "DEMRAQLESW", + "DEMTGYVATRW", + "DENLGSVKQY", + "DENPQQLKL", + "DENSAFLQF", + "DENSTQKRL", + "DENSVIKSF", + "DESGPSIVHR", + "DESGPSIVHRK", + "DESIIPKKY", + "DESNPLGRAGIW", + "DESQVVTRY", + "DETDSGAGLKW", + "DETEAVKRY", + "DETGVLKGF", + "DEVDKRVHMTW", + "DEVDMAHRF", + "DEVDRISEW", + "DEVIIPHSGW", + "DEVRLDPNVQKW", + "DEYYKPVKW", + "DFDMTLSRF", + "DFKRVVGKKGESH", + "DFLPADIQAQF", + "DGAIRMQP", + "DGFKEQGVTF", + "DGNTSTTPPTSAK", + "DGWRDMGYTY", + "DLENDIRTF", + "DLRKEDVAM", + "DLWLEREVF", + "DMEKIWHHTF", + "DPAAIIHDF", + "DPANIVHDF", + "DPDATSLKY", + "DPFGHSPTM", + "DPFKDIILY", + "DPFKHFVGM", + "DPFPDHVVF", + "DPFRDLHSL", + "DPGHWDRYHY", + "DPHAMFAEF", + "DPHQQIYTF", + "DPHTVLVEF", + "DPHTVTVSM", + "DPIGGHIHSY", + "DPIGGHINNY", + "DPIHTFDLY", + "DPLERSFLY", + "DPLGGSAAIHLY", + "DPLHQEVSF", + "DPMGKEGDFVY", + "DPNEIKVVY", + "DPNLEFVAM", + "DPQEGGQVY", + "DPQHVVVLY", + "DPSQSEVM", + "DPSSGHPR", + "DPTTVTKTF", + "DPVEPHGEM", + "DPVGDIVSF", + "DPVYEHNTM", + "DPWIGKLLY", + "DPYKKAVAM", + "DPYQGTIVL", + "DSISKNTW", + "DSNGAILVY", + "DSRSSLGGRDLY", + "DSYQGKGFVM", + "DTPTSAGPNSFNK", + "DVDRSGTMNSY", + "DVIRLIMQY", + "DVREEGKENAF", + "DVSDLRIFY", + "DYDPLVVKL", + "DYHTKLFLI", + "DYIAVNPHL", + "DYIDTIWKI", + "DYLDGVHTVF", + "DYLEKYYKF", + "DYLELSLKL", + "DYLHMVHRL", + "DYLKFKEKF", + "DYLKNTYRL", + "DYLKRFYLY", + "DYLNEWGNRF", + "DYLRWVQTL", + "DYVEGLRVF", + "DYVRQTWKL", + "DYYPEYKL", + "DYYPEYKLLF", + "EAAAVFKTL", + "EAAGPHEAF", + "EAAKGTLTY", + "EAAPDIMHY", + "EAAVAIKAM", + "EAFKAIGTAY", + "EAFLNNQEY", + "EAFREHQQY", + "EAFRGVHRY", + "EAGAAGLRW", + "EAIALAEKY", + "EAIAVFMEH", + "EAIDQLHLEY", + "EAIEQILKY", + "EAIGAVIHY", + "EAIKILKGEY", + "EAINVEQAF", + "EAIRDMVRY", + "EAIRISPTF", + "EALSLAHTY", + "EAMEWVIHK", + "EAMPSLKITNDY", + "EAMPSLKITNDYIF", + "EANAIALKY", + "EANQHELLY", + "EANQWEVAY", + "EAQKGGHFY", + "EAQPIVTKY", + "EAQPVHQAY", + "EARKQVEVF", + "EASGRIYVY", + "EASKLLLTY", + "EASKYIMQY", + "EATKAVTEM", + "EAVESMVK", + "EAVKPTVGM", + "EAVKQYSSY", + "EAVLIQTVY", + "EAVNGVREM", + "EAWASKDATY", + "EAYGKPVKY", + "EAYNAVVRY", + "EAYPDHTQF", + "EDELVKKY", + "EDQVQIHTY", + "EDVETSKKW", + "EEADDWLRY", + "EEADGGLKSW", + "EEADKLVRQY", + "EEAEAKPKF", + "EEAEALAKRL", + "EEAEIIRKY", + "EEAENTLQSF", + "EEAERELERW", + "EEAERPLHF", + "EEAEVRKKL", + "EEAEWQTRW", + "EEAFAIFRKF", + "EEAFHQGLISAW", + "EEAGGRPAM", + "EEAHLNTSF", + "EEAIAYGRKL", + "EEAKAKGTF", + "EEAKEARRI", + "EEAKLKAKY", + "EEAKLKARY", + "EEAKQIQNL", + "EEALHASHGF", + "EEALILDNKY", + "EEANLMKTL", + "EEANNDLENKIQ", + "EEANVGRGY", + "EEAPKFLAF", + "EEAPKTAQKKL", + "EEAPSRPAL", + "EEAPVLMHY", + "EEAQFETKKL", + "EEAQFETKKLY", + "EEAQIGKRGY", + "EEAQMINRF", + "EEAQPIVTKY", + "EEAQVRKENQW", + "EEAQYQREY", + "EEASIYSRW", + "EEASLLHQF", + "EEATKPHTF", + "EEAWINEKM", + "EEAYENQRW", + "EEAYNAVVRY", + "EEAYTTEHW", + "EEDAALFKAW", + "EEDDRRLGF", + "EEDEACGRQY", + "EEDEDAYKKQF", + "EEDEYKAFY", + "EEDGDYKVTF", + "EEDGHTHQW", + "EEDKLEQIKKW", + "EEDLNRKEI", + "EEDLPRPSI", + "EEDMTKVEF", + "EEDNVQKNY", + "EEDPGRKW", + "EEDPNTHILY", + "EEDQAAELRAY", + "EEDREVKKLM", + "EEDVKSLKKEY", + "EEEAAPKKI", + "EEEAARLFY", + "EEEAEEEVA", + "EEEALAKKF", + "EEEALASKRF", + "EEEALQKKF", + "EEEDNESRSW", + "EEEDRKHTW", + "EEEEALQKKF", + "EEEEEGAVRW", + "EEEEGAVRW", + "EEEEGQRFY", + "EEEEKAKAY", + "EEEEKQKSTW", + "EEEESHKKF", + "EEEESQPAKKTY", + "EEEGNLLR", + "EEEGNLLRSW", + "EEEGRFLKAY", + "EEEGSALKTSW", + "EEEHGKGREY", + "EEEIGTPRKF", + "EEEKAKKSF", + "EEEKGQNISW", + "EEEKNFKAF", + "EEEKTGKVKY", + "EEEKYAFVNW", + "EEENGKKLI", + "EEENKLVKKI", + "EEENLGKGEY", + "EEENSAILHRF", + "EEEPEGGFSKW", + "EEEPLPTKKW", + "EEEPLYVNAKQY", + "EEEPVKKRGW", + "EEEPVKKVL", + "EEEQSQSRW", + "EEERLSIQNF", + "EEERPKQYSW", + "EEERTRQGW", + "EEESQPAKKTY", + "EEESTIRYSW", + "EEEVPKRKW", + "EEFAEGSKI", + "EEFDAITKAYY", + "EEFDARWVTY", + "EEFDEKIATKY", + "EEFDEVSRI", + "EEFDFHVRW", + "EEFDRLVKEY", + "EEFEKNKGKGF", + "EEFELLGKAY", + "EEFGAMREQY", + "EEFGKKYKL", + "EEFGQAFSF", + "EEFGRFASF", + "EEFHIYTQY", + "EEFHQSLQW", + "EEFIGAGEQARY", + "EEFLAQHGSEY", + "EEFLKDEW", + "EEFLNGRAVY", + "EEFLRQEHF", + "EEFNREMFW", + "EEFQKELSQW", + "EEFREFNKY", + "EEFRHVIAW", + "EEFRQVMNGF", + "EEFSRAAEKLY", + "EEFTHKDGVW", + "EEGAVDKSY", + "EEGDRVITY", + "EEGGATHVY", + "EEGHIGVYY", + "EEGHLAVYY", + "EEGHPFKAY", + "EEGLGAGRW", + "EEGLHSVDVTY", + "EEGLVNNKY", + "EEGMYVLRW", + "EEGNLLRSW", + "EEGNPRLWY", + "EEGPDVLRW", + "EEGPIIKEI", + "EEGPPHTKNW", + "EEGPSSVRF", + "EEGRDMANRI", + "EEGRFLKAY", + "EEGRYKQKF", + "EEGSALKTSW", + "EEGSARMW", + "EEGSKVTTY", + "EEHAVEALW", + "EEHFRGQEF", + "EEHLESHKKY", + "EEHLTTNGY", + "EEHPELQQF", + "EEHPNPGKRY", + "EEHRLIARY", + "EEHSLNKEARKW", + "EEHTAVYT", + "EEHTAVYTAW", + "EEHVIIQAEF", + "EEHVNRTGW", + "EEHVQASHF", + "EEIAFLKKL", + "EEIAIIPSKKL", + "EEIAKVEKL", + "EEIALHRRL", + "EEIANYRPTL", + "EEIAQLARQY", + "EEIDEIRKSY", + "EEIDEKIGF", + "EEIDHAVHL", + "EEIDLLIKHL", + "EEIDLRSVGW", + "EEIEDLVARL", + "EEIEGFRY", + "EEIEILLRY", + "EEIENAINTF", + "EEIESSAQY", + "EEIFSLHGF", + "EEIGQLVKQM", + "EEIGSRNFF", + "EEIGTPRKF", + "EEIHATGFNY", + "EEIHKFSGTY", + "EEIIRGQVF", + "EEIKEFAAGY", + "EEIKEKVHKY", + "EEIKKETGF", + "EEIKKNYRY", + "EEIKQIWQQY", + "EEIKQSHSF", + "EEIKTLERY", + "EEILHEHSY", + "EEILKVEQKY", + "EEILNSLKY", + "EEILQKKEI", + "EEINEVKTW", + "EEINLQRNI", + "EEINNMKTKF", + "EEINRQVTY", + "EEIPKNAAY", + "EEIPVHEEF", + "EEIPVSSHY", + "EEIQQRLAQF", + "EEIREAFRVF", + "EEISKLKGY", + "EEISNMIHSY", + "EEISTLVQKL", + "EEITTGSAW", + "EEITTGSAWF", + "EEIYKDRQKF", + "EEIYTNKNY", + "EEKDFRKKF", + "EEKMAYQEY", + "EEKPNNPEF", + "EEKSIDLIQKW", + "EEKSISARY", + "EEKTISAKY", + "EELAEMKRY", + "EELAQYQKW", + "EELDFQKNI", + "EELDFQKNIY", + "EELDFRVHI", + "EELDGKVKGY", + "EELDGLFRRY", + "EELDHTVSMQY", + "EELDKRTEY", + "EELDPESREY", + "EELDPESREYW", + "EELDSLIKATI", + "EELDVKHAL", + "EELEEKNKKY", + "EELEERLVEW", + "EELEGQIKKL", + "EELEKEKDGF", + "EELEQKYTY", + "EELERDKRVTW", + "EELERGIRSW", + "EELGFRPEY", + "EELGHTETY", + "EELGKQIQQY", + "EELGLVTHL", + "EELGN(Deamidated)HKAF", + "EELGSKAKF", + "EELKEKAKI", + "EELKELKEY", + "EELKETIKKL", + "EELKFKTGL", + "EELKHKPGM", + "EELKLKEKTY", + "EELLFSHKL", + "EELLGDGHSY", + "EELMNKSVY", + "EELNDLIQRF", + "EELNNAIKY", + "EELPHIHAF", + "EELPTLLHF", + "EELPTMMQHF", + "EELQAVDSQKY", + "EELQDLKGVW", + "EELQKIYKTY", + "EELQQKVSY", + "EELRAHVRKY", + "EELREKQAY", + "EELRHIHSRY", + "EELRKKQAY", + "EELRQKHEY", + "EELRSPKLFY", + "EELSKKSQKW", + "EELSPTAKF", + "EELSRLSQY", + "EELTAVMRF", + "EELTLEGIKQF", + "EELTVQVARVY", + "EELTYDYKF", + "EEMARHLREY", + "EEMDASIKKM", + "EEMDFERGIW", + "EEMDLFTKY", + "EEMDRKLRF", + "EEMDSKEQF", + "EEMEAEHRL", + "EEMEAKQNL", + "EEMEDRLQAL", + "EEMGDYIRSY", + "EEMGKVKKI", + "EEMGVQGGRAKRY", + "EEMKKGSQF", + "EEMKQRKAAF", + "EEMKSGLKDF", + "EEMLSKKQEF", + "EEMLVPRKM", + "EEMNGTKMKF", + "EEMPATKGGF", + "EEMRDKMRKW", + "EEMRFLREW", + "EEMTLKQFL", + "EENAEQQAL", + "EENAQKKRF", + "EENAVDVKQY", + "EENDKLRQEF", + "EENDRVVAVGY", + "EENEEKKQY", + "EENISEVKSY", + "EENKLVKKI", + "EENMGQYIEY", + "EENMRGVRF", + "EENNNFSKM", + "EENPIVLEF", + "EENPKREDY", + "EENPLKRGL", + "EENQEQPRNY", + "EENQIVSSY", + "EENQVKKYH", + "EENRNENSGNSW", + "EENRQKLSL", + "EENTLVQNY", + "EENTNILKF", + "EENYGVKTTY", + "EEPDVIFQNF", + "EEPEGGFSKW", + "EEPGKGSFW", + "EEPKQASVTY", + "EEPLYVNAKQY", + "EEPPPVKIAW", + "EEPQHVLLRY", + "EEPRVIDLW", + "EEPTVIKKY", + "EEQKEEQKW", + "EEQKNLHFF", + "EEQLIAAKF", + "EEQLPQYRL", + "EEQNFVQKY", + "EEQPKNYQVW", + "EEQQALQKKL", + "EEQQDILSKF", + "EEQQGRQF", + "EEQRFNNFL", + "EEQRGLRKY", + "EEQSHPARLY", + "EEQSTKMTY", + "EEQVARESY", + "EEQVSEPKKW", + "EERAVIKAY", + "EERDGVRFSW", + "EERFLKNIGW", + "EERGFDKAY", + "EERQNIVLW", + "EERVINEEY", + "EERVPEEDSRW", + "EESAIRVGF", + "EESDLAQQY", + "EESDLERGY", + "EESDLSRQY", + "EESEAYKSL", + "EESEIRYSTW", + "EESEKPRGF", + "EESFAEHLGY", + "EESGARINI", + "EESGATFHTY", + "EESILSRNY", + "EESIVEQTY", + "EESKHFTRY", + "EESKQFVARY", + "EESLNIVKY", + "EESLVARDW", + "EESPSGRGW", + "EESPSKAGM", + "EESQIRIEL", + "EESQPAKKTY", + "EESQRIKKL", + "EESRGNNQW", + "EESRKHINTW", + "EESTAFRY", + "EESTIRYSW", + "EESYSRMGY", + "EETAIGKKI", + "EETAIYKGDY", + "EETDTIQHM", + "EETEDYRQF", + "EETEELKRF", + "EETEELMRKY", + "EETEQINKHF", + "EETETVTK", + "EETETVTKSY", + "EETEYVKKI", + "EETGMAMRI", + "EETGVRVEL", + "EETLTPEKY", + "EETPNILRI", + "EETPVVLQL", + "EETQVILREY", + "EETSPGKQF", + "EETSQRHSL", + "EETSVKSDY", + "EETTVRTEW", + "EETVSGLKGY", + "EEVAELFQRL", + "EEVAGKKSF", + "EEVAQKKKI", + "EEVAQQKSL", + "EEVDEEKKM", + "EEVDLSKDIQHW", + "EEVDQVARAY", + "EEVDSSVKKI", + "EEVDVKDPNY", + "EEVDVPIKLY", + "EEVDVTPTF", + "EEVEAHQSW", + "EEVEAKFKRY", + "EEVEQGVKF", + "EEVESLNRKY", + "EEVFPLAMNY", + "EEVFQNANF", + "EEVGDFIQRY", + "EEVGPSDHF", + "EEVGQAVHF", + "EEVGVEHLL", + "EEVGYAIRF", + "EEVHDLERKY", + "EEVIGRFW", + "EEVKEEVKKF", + "EEVKLIKKM", + "EEVKLIKKM(Oxidation)", + "EEVKQTKRL", + "EEVKVGNKL", + "EEVKVSREM", + "EEVLIHGVSY", + "EEVLIPDQKY", + "EEVLLVRNL", + "EEVLVAAKKI", + "EEVNAILK", + "EEVPKRKW", + "EEVPTQESVKW", + "EEVPVYENKY", + "EEVQFLKTL", + "EEVQRKLGF", + "EEVQVDPRKY", + "EEVRQGLKAY", + "EEVRQVGSY", + "EEVRSLVTW", + "EEVRTVIRF", + "EEVSEKKSY", + "EEVSGHLY", + "EEVSRIINY", + "EEVTELLARY", + "EEVTKNLQKF", + "EEVTLQTGIKRF", + "EEWEAEFQRY", + "EEWKGSETY", + "EEWLLRENI", + "EEWLPRELW", + "EEWNDPPAVKW", + "EEWQSEVLKY", + "EEWREAQQGF", + "EEWREAQRGF", + "EEYDTQAMKY", + "EEYEARLERY", + "EEYERATRY", + "EEYIPFKQY", + "EEYKQKIKEY", + "EEYLYYKHL", + "EEYMKYLAY", + "EEYNLRDYF", + "EEYPDRIMNTF", + "EEYQGVIAW", + "EEYQSLIRY", + "EEYSNTRAY", + "EFITVHSML", + "EFIYASLKF", + "EFPSIKTEF", + "EFVAKGHLF", + "EGVEIKGGSF", + "EILKWYLNK", + "EIMPPPPKP", + "EISTLVQK", + "ELAGNAARDN", + "ELGGLGERVLGF", + "ELMPPPPPK", + "ELVKIIYK", + "ELYDIMKM", + "EMEEKYYRF", + "EPARPDITY", + "EPEEENGREY", + "EPFRLGIRF", + "EPHLMVEY", + "EPIEGHEDY", + "EPIYPEVVHMF", + "EPLEGDHVF", + "EPLLKHWEF", + "EPLRDFSAM", + "EPLTKAIKY", + "EPMNPIKQY", + "EPMPVRGPDVEAY", + "EPNPDDPLM", + "EPNPESLEL", + "EPNSTKFVF", + "EPPLFHPNVY", + "EPQHWPVQY", + "EPRVEDFGNAW", + "EPSWENAGHTM", + "EPTAAAIAY", + "EPVDHGKIEY", + "EPVKDHNWRY", + "EQEMATAASSSSL", + "EQIKEYHHL", + "EQPETYYKW", + "ERLQLAMEM", + "ESEDVSNKVSM", + "ESFEAEGHLY", + "ESYSIYVYK", + "ESYSVYVYK", + "ETFRTTIEK", + "ETMMFTFHK", + "ETMNIFLEK", + "ETQPPVALK", + "EVFKERIGY", + "EVFPLAMNY", + "EVFRFAYYK", + "EVGAGWIGK", + "EVIPYTPAM", + "EVLGLILRY", + "EVNKFQMAY", + "EVNPNTRVM", + "EVNSGFFYK", + "EVSKIVQTY", + "EVYAGSHQY", + "EWDDRKVRHTF", + "EWLSFGHKF", + "EWLSFGHRF", + "EWPKHWPTFI", + "EWTVDTSKLVF", + "EYAHLFEVF", + "EYDNAIITM", + "EYDTVTREV", + "EYEGTPLKW", + "EYFRVPDSATF", + "EYGKVEFVF", + "EYIAKQFGF", + "EYIAVVKKL", + "EYIKFLRSI", + "EYIPDLYNHF", + "EYIPKWEQF", + "EYIRMVAEW", + "EYIRSLNQF", + "EYISIALRI", + "EYLEAHLKF", + "EYLGKLVRF", + "EYLGSMAKI", + "EYLHQHWIL", + "EYLKHHNRI", + "EYLKIKQSF", + "EYLKLETTW", + "EYLKLLHSF", + "EYLKNVLLQF", + "EYLKVDAQF", + "EYLNKHQNW", + "EYLNVRLSL", + "EYLRFAHKL", + "EYLRQIFRL", + "EYLSRHWLF", + "EYLTKVDKL", + "EYM(Oxidation)KHTRLF", + "EYMEHVYLI", + "EYMKHTRLF", + "EYMKVQTEI", + "EYMPIKLKI", + "EYNKSWQTF", + "EYNTIKDKF", + "EYPDRIMNTF", + "EYPRETFSF", + "EYQ(Deamidated)AKIRDL", + "EYQKVWNLF", + "EYSKQMQRF", + "EYTDVYPEI", + "EYTPRSWNF", + "EYTRALFLL", + "EYVDDTQFLRF", + "EYVEKFYRI", + "EYVKFLHKF", + "EYVKQTWNL", + "EYVNDFDLMKF", + "EYVSQHLVF", + "EYYDKHFTEF", + "FAFDPSVNY", + "FAFEHSEEY", + "FAHDDSVMY", + "FAIDKTIAY", + "FANIDQETY", + "FARLPEEEF", + "FASADGLTYNDF", + "FASHVSPEV", + "FASKEIAENAL", + "FAVDLEHHSY", + "FAYDGKDYL", + "FDGRVVAK", + "FDHGGTVFF", + "FEADPRGQLW", + "FEADSTVIEKW", + "FEAPIKLVF", + "FEDENGQRW", + "FEDETVRKF", + "FEEEAEEEVA", + "FEISEVNRW", + "FENPFFKDSF", + "FENVKEKW", + "FESNIKSY", + "FETDTNLNF", + "FETSAKTGY", + "FEVESLFQKY", + "FEYDGKINAW", + "FEYEYAMRW", + "FEYEYSQRW", + "FEYIRSETY", + "FFDEVVKQM", + "FFDNISSEL", + "FFDPHQSTF", + "FFDPSLLHL", + "FFIDQANYF", + "FFIDRPSTYF", + "FFKPHWDEKF", + "FFSPKVVSL", + "FGEEAEEEA", + "FGFGDSRGGGGNF", + "FGGLGSKSK", + "FGISSVPTK", + "FGLATKVEY", + "FGRGGAESHTF", + "FGSDVVAQF", + "FGWEEDEDF", + "FHISRLFYF", + "FIDASRLVY", + "FINPKPITY", + "FIRPVDPEY", + "FLASVSTVLTSK", + "FLDLTEQEF", + "FLDPIKAYL", + "FLWKEPATM", + "FLWQEGHSAF", + "FLYDEVHPK", + "FPAAPAPKM", + "FPAEGPDPEY", + "FPAEKESEW", + "FPAGIYDTKY", + "FPAGKVPAF", + "FPAKVTAHW", + "FPALQGAQTKM", + "FPANNIVKF", + "FPAPAKAVVY", + "FPAPGKPGNY", + "FPAPGKPGNYQY", + "FPASFPNRQY", + "FPASSGVSH", + "FPATPLLDY", + "FPAVGEPNIQQY", + "FPDEKIPTL", + "FPDKPITQY", + "FPDKVAIQL", + "FPDPAGKLNQF", + "FPDPEKPCKM(Oxidation)C", + "FPDQVAIQL", + "FPDRIMNTF", + "FPEADKVRTM", + "FPEDLENDIRTF", + "FPEEDKKTY", + "FPEELTQTF", + "FPEFYLKTY", + "FPEHIFPAL", + "FPEIDLEKY", + "FPEIHVAQY", + "FPEPEHSSF", + "FPFRPRPVQNF", + "FPFSDKLGEL", + "FPGEAERVAF", + "FPGPQGPYY", + "FPHGNPGGTSM", + "FPHHLQEYIEY", + "FPHHVIPDSF", + "FPHPVNQVTF", + "FPHQPSALGY", + "FPHSAHQKY", + "FPIDKPPSF", + "FPIEAGDMF", + "FPIEYHDIW", + "FPIIRDQIFRY", + "FPIISPGRVYEY", + "FPIPGEPGF", + "FPKADLAAAGVM", + "FPKKISELDAF", + "FPLKVFGY", + "FPMEIRQY", + "FPMEIRQYL", + "FPMELRQFL", + "FPMTHGNTGF", + "FPNAIEHTL", + "FPNALVTKL", + "FPNIPGKSL", + "FPNIVIKGSEL", + "FPNRVVFQEF", + "FPPEANYLF", + "FPPREIVTY", + "FPPYHVGQTF", + "FPQDRVFML", + "FPQEGMHQM", + "FPQKIAGELY", + "FPRDELMPLESAY", + "FPRDPEIEM", + "FPRFEEPAPLSY", + "FPRHIEPEL", + "FPRREFTKEDY", + "FPSEMTGIWRY", + "FPSEYVPTVF", + "FPSIYDVKY", + "FPSSVAALRF", + "FPSTAEHTL", + "FPTDPKVVVY", + "FPTEESSINY", + "FPTVQHQEL", + "FPVFSDRVVY", + "FPVGDVNNF", + "FPVGRVHRL", + "FPVIYDVKY", + "FPVKGLKTGY", + "FPVPGSGLVL", + "FPVPKPIDY", + "FPVRDGKIKL", + "FPVRDGVVL", + "FPVVRDFLY", + "FPWEVPKKLKY", + "FPYGDASKF", + "FPYIEAEVKY", + "FRQMDFPGESSN", + "FSEAREDM", + "FSEAREDMAALEKD", + "FSMTQAAMKK", + "FSNKITPIQSKE", + "FSSSAGPGLLK", + "FSTPQQLEK", + "FTAPSTVGK", + "FTDEESRVF", + "FTEAESNMND", + "FTEAESNMNDL", + "FTEAESNMNDLVSE", + "FTEREQTL", + "FTFDNVLPGK", + "FTFKDLHFK", + "FTVLPEKRT", + "FVAEQKVEY", + "FVAGVLPFK", + "FVELGTQPAT", + "FVELGTQPATQ", + "FVIPRGNVL", + "FVNDDRHVM", + "FVQGIFVEK", + "FVQMMTAK", + "FVVEQVESY", + "FVYEPKEQK", + "FVYFQNHDAADK", + "FVYKEEHPF", + "FVYKGGKIYK", + "FWDKKVTHF", + "FWHDVKLRF", + "FYDDKVSAL", + "FYDENDAKL", + "FYDERIVVV", + "FYDPDTVEL", + "FYHKYFNYL", + "FYINGQYQF", + "FYISPVNKL", + "FYITSRTQF", + "FYLDPDAQKLDF", + "FYLEGGFSKF", + "FYLPKDAVKHL", + "FYMDTSHLF", + "FYNLLTRTF", + "FYPPDPAQL", + "FYQREFDFF", + "FYQRFPLSF", + "FYVDTVRAF", + "GAAFSSNPK", + "GAAGVHFIY", + "GAALPLLTK", + "GAAPPTPPR", + "GAARFALQK", + "GAFNGTVKK", + "GAFYKGFIK", + "GAFYKGFVK", + "GAGKPWKKHGNRN", + "GAHGIIVVY", + "GAIEKTFTK", + "GALPYAVGK", + "GAMAVRRVLK", + "GANIPVTEK", + "GANVPTTAK", + "GASAVVHTM", + "GASEIILRK", + "GASGSIFSK", + "GASQAGMTAPGTK", + "GAVKPPPNK", + "GAYDGKFEK", + "GAYDGKYEK", + "GAYGEPRVK", + "GAYSQSPAIKK", + "GDDKTVKQW", + "GDSTFESKSYK", + "GEAAISRSF", + "GEAALNDPKMY", + "GEAESRNSNF", + "GEAGAGRGSDAW", + "GEAGGESTKGY", + "GEAN(Deamidated)GVWKY", + "GEANGVWKY", + "GEAPVIQRL", + "GEARAVLKW", + "GEASERDTRKLW", + "GEASRLAHY", + "GEAVELRSLW", + "GEAVVNRVF", + "GEDDKAFVW", + "GEDGKVQVW", + "GEDGYVRIHY", + "GEDIRKLDY", + "GEDNGQRGY", + "GEDPAQPRKY", + "GEDPEGNKGF", + "GEDPYPHKF", + "GEDQAKQAY", + "GEDQPKQVY", + "GEDSSVIHY", + "GEDSTYKFF", + "GEDTFVHIW", + "GEDTIRQAF", + "GEDVETSKKW", + "GEEENQKRY", + "GEEFGESKW", + "GEEGSARMW", + "GEEQQRQQW", + "GEESSIRQY", + "GEEYIPFKQY", + "GEFEADPRGQLW", + "GEFGNVTRW", + "GEFLGNRQKQF", + "GEFSEAIKAY", + "GEFSSGRKW", + "GEFYKSLTNDW", + "GEGEATKGY", + "GEGETLLKKW", + "GEGETVQHF", + "GEGKELYLSW", + "GEGNIRSVKW", + "GEGSLIIRF", + "GEHGDSSVAVW", + "GEIDLAKLKKF", + "GEIDQQYSRF", + "GEIDTRFSF", + "GEIEGLNDTF", + "GEIQEIVKTGLW", + "GEITHPKNNY", + "GEKEPDPKTW", + "GELSSADEKRY", + "GEMGRLKSY", + "GENDRGVSF", + "GENGTGKTTF", + "GENHLTVTW", + "GENLKTEQW", + "GENRAVIHY", + "GENSAVLHY", + "GENVIISHF", + "GESDPAYQQY", + "GESGAGKTW", + "GESGEPVKAF", + "GESKQVMKY", + "GESLLIKTL", + "GESPSHPSW", + "GESQPVKMF", + "GESQTLQQF", + "GESSFTYRAY", + "GESSLIKQL", + "GESSSRLGY", + "GESVAVKIF", + "GESVIGKTY", + "GESVLKLTF", + "GETELKELHW", + "GETELREYF", + "GETPIKNFQW", + "GEVDDSREHSF", + "GEVDFKEFI", + "GEVDVRSAY", + "GEVDYKKKY", + "GEVEQQRTY", + "GEVIKSSTF", + "GEVLISRVY", + "GEVLRTNQF", + "GEVMREAAF", + "GEVN(Deamidated)DIKTRSW", + "GEVNDIKTRSW", + "GEVRLEKQW", + "GEWASGGVRSF", + "GEWIRQNGGW", + "GEWTPTLQHY", + "GEYDGNEKVY", + "GEYPSGINTW", + "GEYTLVVKW", + "GFLDIDTKF", + "GFYPAEIT", + "GFYPAEITL", + "GFYPAEITLT", + "GGAESHTFK", + "GGGGGLGSGGSIR", + "GGHSGSSYLNTVQK", + "GGMMVRQSF", + "GGQPPLTYK", + "GGSFDVADRMF", + "GGTGSGMGTLLLSK", + "GGWVEKETY", + "GHVDAIEY", + "GIAGSLTNK", + "GIAGVAVSSITK", + "GIANITALK", + "GIASSSIAAK", + "GIATTFINK", + "GIFPGTPLKK", + "GIGSVLPLK", + "GIISSPLTGK", + "GILGKSMPK", + "GIMSPLAKK", + "GISETRIEK", + "GIVMPTNPK", + "GIYAGKKLFK", + "GIYPPGSPGK", + "GIYSVMIQK", + "GLAPNTPGK", + "GLAPSIRTK", + "GLFEVGAGWIGK", + "GLGPLVPGK", + "GLMQWIIRK", + "GLQETSIPK", + "GLVPAAPPK", + "GLWHMKTYK", + "GNTSTTPPTSAK", + "GPLPRTVEL", + "GPLPRTVELF", + "GPLQHGIVY", + "GPVEERLEY", + "GPVGVNVTY", + "GPYEVEVTY", + "GPYGGGGQYF", + "GQAANQTLSPQMWK", + "GQAEIIITK", + "GQAVALRAK", + "GQFIGPHRIK", + "GQFKDIITK", + "GQFPVVRDFLYK", + "GQFSGFPFEK", + "GQFSQAEALLMK", + "GQGTFTKIFK", + "GQGVNNVPK", + "GQHTVLLVK", + "GQISVVISK", + "GQKYFDSGDYNMAK", + "GQLGKPLAK", + "GQLGVGNYKK", + "GQLSVHTPK", + "GQNLHQILK", + "GQNPTNAEVLK", + "GQQTNLDRHLK", + "GQSDIAITK", + "GQSPFQQRK", + "GQTKVLTQK", + "GQTNIHLSK", + "GQYASPTAK", + "GQYGNPLNK", + "GQYSGNSFKK", + "GRLYQVEY", + "GRVGSTSENITQK", + "GSAFSTSISK", + "GSALKTSW", + "GSANLPLAK", + "GSAPRTPSK", + "GSASPAVTK", + "GSASQGGYLK", + "GSAVSTVTK", + "GSDQSENVDR", + "GSETAGPPK", + "GSFDVADRMF", + "GSFENNWNIYK", + "GSFEVVSTLIK", + "GSFLQQFLK", + "GSFRGFPALSQK", + "GSFSSENYWRK", + "GSFTVSAQK", + "GSFVGELMYK", + "GSFVYKGGKIYK", + "GSGAFGTVYK", + "GSGKVTFPK", + "GSGYPNDPK", + "GSHSMRYFYT", + "GSIAGASASPK", + "GSIEINIKK", + "GSIGGTFAK", + "GSITQGTPLK", + "GSLEKSVTK", + "GSLFLQTPK", + "GSLFLRTPK", + "GSLGFTVTK", + "GSLGGQINK", + "GSLKPHDYPK", + "GSLKQFLKK", + "GSLLAATTEAPGEY", + "GSLLWGLVK", + "GSLNWVPVTK", + "GSLPGDKIRNK", + "GSLRPFVQK", + "GSLSIATEK", + "GSLSYLN(Deamidated)VTRK", + "GSMDPSGAHPSVR", + "GSMEPAFHR", + "GSMEPGFAK", + "GSMGSFSEK", + "GSMGSPVNQQPK", + "GSMKENISK", + "GSMKENISKLLK", + "GSMPELKKYMK", + "GSMRIFTKK", + "GSMSTVVSTK", + "GSMTVVTVK", + "GSN(Deamidated)GTIIRK", + "GSNAFISQK", + "GSNFVPLKK", + "GSNGYILNK", + "GSQAGGSQTLK", + "GSQFFITTK", + "GSQQTQPPQK", + "GSQTPPFKRK", + "GSQVNILSK", + "GSSANIPPLK", + "GSSASLVLK", + "GSSDVIIHR", + "GSSEPITVK", + "GSSGMGSTVSK", + "GSSGSFYLK", + "GSSLPTSSK", + "GSSPEQVVRPK", + "GSSPVAMQK", + "GSSSPLYSK", + "GSSSSTFIK", + "GSSSVAAMK", + "GSSSVILEK", + "GSSTIRNLK", + "GSSWVSLPGK", + "GSSYPVCVSK", + "GSVAFDYRK", + "GSVELPIVGK", + "GSVLLFVTK", + "GSVYITLKK", + "GSWASLVQK", + "GSYDLGKKPIYK", + "GSYDPQQIFK", + "GSYESTLKK", + "GSYGRKTVLR", + "GSYIAGYLK", + "GSYIELPAYLK", + "GSYLAHTQGK", + "GSYNKVFLAK", + "GSYSKAFAR", + "GSYSLEEPK", + "GSYSSHISSK", + "GSYTFDPVTK", + "GSYTLEEPK", + "GSYVTHETK", + "GTAAKSITK", + "GTADVHFER", + "GTADVHFERK", + "GTAEPGGSMK", + "GTAGLLEQWLK", + "GTAIVINPEK", + "GTAKSQFLK", + "GTAKWAWLR", + "GTAKWAWLRR", + "GTALPSLRG", + "GTAPAFKQK", + "GTAPLVAPPR", + "GTAPPPNWRR", + "GTAPSKPPLTK", + "GTASSVSYPK", + "GTASVLQPVK", + "GTASVLQPVKK", + "GTATTMVSK", + "GTAVPSTGASK", + "GTDEPIFGK", + "GTDFPDPKVKK", + "GTDGSHYWSK", + "GTDPISQTK", + "GTDRTGFTFK", + "GTDSHLVVK", + "GTDTNFEVK", + "GTEAMLVLK", + "GTEDHAWIK", + "GTEEAPKVFK", + "GTEFGGSIYQK", + "GTFAIRLLK", + "GTFANIKLFNK", + "GTFDNAETK", + "GTFDNAETKK", + "GTFEYIRHK", + "GTFGGLGSK", + "GTFGGLGSKSK", + "GTFGKVKVGK", + "GTFHWSGNEQMTK", + "GTFIWNKALEK", + "GTFLEGVAK", + "GTFNPEKGKQK", + "GTFNRAMLR", + "GTFPGNYVK", + "GTFPRAFKK", + "GTFQLNSKDQGLQK", + "GTFQQMWISK", + "GTFQTTMTK", + "GTFSKLFGK", + "GTFSTVTSTVK", + "GTFTNQIHK", + "GTGASGSFKLNK", + "GTGDVKLLK", + "GTGFTPMVK", + "GTGKTLIGK", + "GTGKTTFVK", + "GTGLFIYFR", + "GTGNLGFPK", + "GTGNMEIKK", + "GTGPNVPPR", + "GTGSAIPMK", + "GTHMGPFVER", + "GTHTFDPVTK", + "GTHVWVGLYK", + "GTIDVKELK", + "GTIEKSKLITK", + "GTIEKVFVK", + "GTIEVQRGNMEK", + "GTIFAELATKK", + "GTIFGIYRK", + "GTIFGSQIK", + "GTIGHVAHGK", + "GTIGLALAR", + "GTIGLTIAK", + "GTIHAGQPVK", + "GTIIVSGSTEK", + "GTIKDIVTR", + "GTINIVHPKL", + "GTIPGNPYPK", + "GTIRSRSFIFK", + "GTISAITSK", + "GTISFFSSLK", + "GTISKAVQNK", + "GTISLRVYR", + "GTITGIARK", + "GTITPKISK", + "GTKGPSNVFK", + "GTKLPGLLK", + "GTLAEFIQK", + "GTLAQAVKK", + "GTLASVYHK", + "GTLDYILQR", + "GTLEDQLSHLK", + "GTLEQWIEK", + "GTLGGSPTK", + "GTLGKFTVPMLK", + "GTLIDNQFK", + "GTLKDLIYK", + "GTLLALLRK", + "GTLLGESLKLK", + "GTLLQVEGMLK", + "GTLMGSGLRK", + "GTLNQPLTK", + "GTLPAKLLK", + "GTLPHPLQR", + "GTLPKALTK", + "GTLPVSQPK", + "GTLQPPFTAR", + "GTLSGWILSK", + "GTLSSWNLK", + "GTLSSYIVK", + "GTLTFFKNRK", + "GTLTPARQK", + "GTLTQNEMIFK", + "GTLTVEAPMPK", + "GTM(Oxidation)EWIMIK", + "GTM(Oxidation)TGGGSKVMK", + "GTM(Oxidation)TGM(Oxidation)LYK", + "GTM(Oxidation)TGMLYK", + "GTMEWIM(Oxidation)IK", + "GTMEWIMIK", + "GTMNSYEMRK", + "GTMPLRNIFK", + "GTMPVSLLK", + "GTMTGGGSKVM(Oxidation)K", + "GTMTGGGSKVMK", + "GTMTGM(Oxidation)LYK", + "GTMTGMLYK", + "GTMTRQISR", + "GTNDGPALKK", + "GTNDVGALK", + "GTNEFKFLK", + "GTNFPNKIEK", + "GTNFTKLEK", + "GTNPGIITK", + "GTNTTGISEK", + "GTNVAKVMK", + "GTNVMVTVAK", + "GTNVNMPVSK", + "GTPAGGGFPR", + "GTPDPSRSIFK", + "GTPEENQASWAK", + "GTPLETIQK", + "GTPLETIQKK", + "GTPNFPALLK", + "GTPTQPASEK", + "GTQAIAHIHNK", + "GTQDDISAAK", + "GTQGKPAIAHR", + "GTQGSPITK", + "GTQNRPLLR", + "GTQPGPLLK", + "GTQPGPLLKK", + "GTQPWFISK", + "GTQSDKVTLK", + "GTQSFVFQR", + "GTQSKAFYK", + "GTQTAVITR", + "GTQTLSGAGLLK", + "GTQTNPNIKK", + "GTQTVFPSK", + "GTQVPGTPPPK", + "GTSATEGYPK", + "GTSATEGYPKK", + "GTSDGRILK", + "GTSDRFSRILK", + "GTSDVDLDK", + "GTSDVEVNEK", + "GTSEFITGK", + "GTSELLLAK", + "GTSETSKTLK", + "GTSGELSVKEK", + "GTSGPHVGK", + "GTSITVPQK", + "GTSMWVLVK", + "GTSPPLTPR", + "GTSPTAETILK", + "GTSPTITHQK", + "GTSQLYVYR", + "GTSQTPLAH", + "GTSRNFILR", + "GTSSLFIYK", + "GTSSMIVPK", + "GTSSSAASSLK", + "GTSSVIVSR", + "GTSSVIVSRK", + "GTSTGIISK", + "GTSVPQGLLK", + "GTTAVFINK", + "GTTEWFHLK", + "GTTHNFLYK", + "GTTITLVLK", + "GTTKVDALK", + "GTVDKKMVEK", + "GTVDPQELQK", + "GTVDVTPFIKK", + "GTVEIFPIFK", + "GTVGFKISK", + "GTVIHFNNPK", + "GTVITSVIK", + "GTVKIWNMK", + "GTVRIGVAK", + "GTVSATSPNK", + "GTVTKVIPK", + "GTVTPPPRLVK", + "GTVVGLVNK", + "GTVYFKEGK", + "GTVYPETNK", + "GTWIYSVNK", + "GTWKTPSFPK", + "GTYAPAEVPK", + "GTYAPPEVPR", + "GTYDAKVKK", + "GTYDQKVQGGK", + "GTYEQDGRFEK", + "GTYGFWYPK", + "GTYGLDSVKKK", + "GTYHGM(Oxidation)TLK", + "GTYHGMTLK", + "GTYRDANIK", + "GTYSKIMNH", + "GTYTDVTPR", + "GTYTFPNGAK", + "GTYTIHAQK", + "GTYTSSMALK", + "GTYVKPLSNK", + "GTYVSSVPR", + "GVADKILKK", + "GVAFIFNQK", + "GVAGAVAVFPK", + "GVAGGSILK", + "GVAGNPMVK", + "GVAKIIISK", + "GVALALRKK", + "GVAPFTIAR", + "GVAPQPPLK", + "GVDDKFYSK", + "GVDPNQYTK", + "GVDSSIFQNPK", + "GVFEPTIVK", + "GVFGFPLGR", + "GVFGVKISVVTK", + "GVFLSLIQK", + "GVFPPLLEK", + "GVFRGPVLPK", + "GVFYSIMKK", + "GVGEVLHVK", + "GVHGGILNK", + "GVIDLIFEK", + "GVIDLVFEK", + "GVIGLLEPMKK", + "GVIGQDGLLFK", + "GVIPYFPYSK", + "GVISFAVWK", + "GVIVHIIEK", + "GVKGGDVPK", + "GVKRPREDHGRGY", + "GVLAWVKEK", + "GVLDAILATK", + "GVLDKLFGK", + "GVLDTELRYK", + "GVLGAVATK", + "GVLGGYIQK", + "GVLGGYIQKK", + "GVLGPIINK", + "GVLGSSKVLAK", + "GVLKKVIRH", + "GVLKKVIRHK", + "GVLNEFIMK", + "GVLQLGNIVFK", + "GVLTASLTIWKK", + "GVMFGDRPLK", + "GVMGDGHPLFHK", + "GVMPSHFSR", + "GVMRVGLVAK", + "GVMSPPLSR", + "GVMTPLIKR", + "GVMTVLIKR", + "GVNDAPALKK", + "GVNDSPALK", + "GVNDSPALKK", + "GVQEVQDTVLK", + "GVQGPDWHLK", + "GVQHHPPEPK", + "GVSAAFAVK", + "GVSAAIYSK", + "GVSAATFLK", + "GVSESFIGK", + "GVSEVNGMMK", + "GVSGLISLK", + "GVSGYPTLK", + "GVSKPIGVSK", + "GVSQAMQQK", + "GVSSIFIYH", + "GVSSVIHPK", + "GVSTDPQPLK", + "GVSTNANYK", + "GVSTNISTK", + "GVSTVQKAK", + "GVTDLYYILK", + "GVTDVVITR", + "GVTSQFISK", + "GVTSQFVSK", + "GVVAVLLTK", + "GVVPFSQRK", + "GVVRIYHRK", + "GVYESGPRK", + "GVYGDVHRVK", + "GVYGDVQRVK", + "GVYGSFASK", + "GVYGWTQHK", + "GVYLTKKEQKK", + "GVYSFQFNK", + "GVYSGRAHPK", + "GVYYQGGTYSK", + "GYDGYRPSF", + "GYIHPVNLTW", + "GYIHVTQTF", + "GYIPIYTPF", + "GYLPNQLFRTF", + "GYNQWQQGQF", + "GYPLWKVTF", + "GYSPYQLTW", + "HAADTSEARPF", + "HAADVFEAY", + "HAAGFAYTY", + "HAAMLGLMY", + "HAANQSYQY", + "HAANTVVY", + "HAAQFLQDM", + "HAAVDRWQY", + "HAAVPTPGY", + "HADGTIVRY", + "HADPRIQGY", + "HADVSNQLY", + "HAEGNPRQY", + "HAFESSQKY", + "HAFGGNKASY", + "HAFVDLHEF", + "HAFVELHEF", + "HAGLVYEY", + "HAGPVINTL", + "HAGSQVAKY", + "HAHLDIEAF", + "HAHVDKVTY", + "HAIMRSPQM", + "HAMEGHVM", + "HASDRIIAL", + "HASDVLLNL", + "HASGHSVAY", + "HATFNDPVM", + "HATIVSEKL", + "HATTALLHY", + "HAVDVDSGNSY", + "HAVDVDSGSVY", + "HAVETVVNM", + "HAVGPSTAM", + "HAVGPSTSL", + "HAVIDINAF", + "HAVPIYEGF", + "HAVQTVETM", + "HAVSEFIKY", + "HAVSPIAKY", + "HAVVNLINY", + "HAVVTVPAY", + "HAWKEIQRF", + "HDIDENELKEF", + "HDVLGRNW", + "HEAADQKRF", + "HEAAPGKASY", + "HEAEVLKQL", + "HEAITKVKY", + "HEAQLKN(Deamidated)GSL", + "HEDPEVKFNW", + "HEDPEVQFKW", + "HEDSLTSVAW", + "HEEEKSYLW", + "HEEEPVKKRGW", + "HEFLVKPSF", + "HEGDIILKI", + "HEGPVWQVAW", + "HEHPGNLNAW", + "HEHPVNKISF", + "HEIEALKSF", + "HEIESAGQTW", + "HEIIETIRW", + "HEILIGYLEY", + "HEIVLKVAY", + "HEIYTVGKRF", + "HELGNVFLKF", + "HELVLTTKEY", + "HEMEKAFAF", + "HEMGHIQYF", + "HEMGHIQYY", + "HENDTIAKY", + "HENEDIYKL", + "HEQEAILHNF", + "HERGGEATW", + "HESDTLRFY", + "HESGASIKI", + "HESGHALVGW", + "HESPIFKQF", + "HETEIMPVF", + "HETPTTGNHY", + "HETSNINDF", + "HEVIVPHSGW", + "HEVLTFIKY", + "HEVPYTTSF", + "HEVQLQKHL", + "HEVTVEKKW", + "HEYMDRARQY", + "HFDDFVTNL", + "HFDESMAYM", + "HFDGLIFV", + "HFDIVIRNL", + "HFDLADRMF", + "HFDLNLRQF", + "HFDLSVIEL", + "HFDM(Oxidation)AVYL", + "HFDMAVYL", + "HFDPEVVQI", + "HFIAEHYM(Oxidation)F", + "HFIAEHYMF", + "HFIPYNAKF", + "HFLDRHLVF", + "HGAPHRPRWSPNW", + "HGFGNVHAY", + "HGIDPTGTY", + "HGLGPGPGGN", + "HGTEVATAF", + "HGVNSFLVY", + "HIAEPNYGK", + "HILDGSPEK", + "HIYDTKLGTDK", + "HLEEASEDKP", + "HLGNVHDQDN", + "HLVAVFNEY", + "HMDDGGYSM", + "HNVQGFHPYR", + "HPAAKMIVM", + "HPADGYAF", + "HPADMQLVL", + "HPADSPVIL", + "HPAEPPVAF", + "HPAGGIHYEM", + "HPAGIILTKVGY", + "HPAIALREY", + "HPAKQTVEAY", + "HPALAIPEL", + "HPALSIPEL", + "HPAQLTYTWY", + "HPARLTIEAY", + "HPARPTVESF", + "HPDAPM(Oxidation)SQVY", + "HPDAPMSQ", + "HPDAPMSQVY", + "HPDEKSIITY", + "HPDGVASVSF", + "HPDGVIPVL", + "HPDKDVRLL", + "HPDKKIVAY", + "HPDPDAELQRM", + "HPDPTRLLLF", + "HPDQAQAIL", + "HPDQKNINAY", + "HPDRSQPAF", + "HPDSRAIMY", + "HPDSVSSSY", + "HPDTGISSKAM", + "HPDVAKVSF", + "HPDVTEAML", + "HPDVTEPMRF", + "HPEATVPQY", + "HPEDVEPAL", + "HPEFIGIKIIY", + "HPELNGATY", + "HPEPGTWDSF", + "HPEQDAGKVF", + "HPESERISM", + "HPESERISM(Oxidation)", + "HPEVTPLRF", + "HPEVVPFLY", + "HPFENMVAF", + "HPFFGRVVL", + "HPFFKDMSL", + "HPFIVKLHY", + "HPFKFSDHY", + "HPFKFSDHYY", + "HPFLSGAETF", + "HPFLTALKY", + "HPFLYDRETY", + "HPFPTPYSNTF", + "HPFSVIYRY", + "HPFTDGKIQF", + "HPFYTRAATM", + "HPGAATVPTM", + "HPGDQAYEF", + "HPGLILKY", + "HPGQISAGY", + "HPGSSALHY", + "HPGYFGKVGM", + "HPHDLVILM", + "HPHGLQITY", + "HPHGLQVTY", + "HPHHVHSEF", + "HPHIIAIHEVF", + "HPHIITLIDSY", + "HPHIVELLETY", + "HPHKIIVMY", + "HPHLSKGYAY", + "HPHLVAEAF", + "HPHLVAEAY", + "HPHQNLIATY", + "HPIDDLQSAY", + "HPIDGFLQSL", + "HPIEGLAVMY", + "HPIEGSTTVF", + "HPIHQGITEL", + "HPIHQRHITM", + "HPIIAPTGVTF", + "HPIIPEQSTF", + "HPIPDLTGY", + "HPIQTQAQY", + "HPIRIADGY", + "HPISDHEATL", + "HPISGHFIAEHY", + "HPISSEELL", + "HPISSEELLSL", + "HPISSEELLSLKY", + "HPISSGLEAM", + "HPITSIEY", + "HPLDVPDHIIAY", + "HPLEDRNTIEM", + "HPLEGTHEL", + "HPLGDIVAF", + "HPLGIVQGF", + "HPLGNLSAF", + "HPLGSFEQM", + "HPLGTAITKY", + "HPLHQDLHY", + "HPLINPVAF", + "HPLNTVTEDMY", + "HPLPETAVRGY", + "HPLPTVHPQVTY", + "HPLQSSTGF", + "HPLTPLITY", + "HPLTQSAVM", + "HPLYPFNDPY", + "HPMDHPSAF", + "HPMGGLNAM", + "HPMNDPTRTF", + "HPMSEYPTY", + "HPNASTVGL", + "HPNDDDVHF", + "HPNEGALVL", + "HPNGLQVMY", + "HPNGNITEL", + "HPNIITLKDVY", + "HPNLVVGGTY", + "HPNNVVSIKY", + "HPNNVVSVKY", + "HPNQEAHSL", + "HPNSAIILHY", + "HPNVQKVVL", + "HPNYLGDLIM", + "HPNYPYSDEY", + "HPPHYFFTY", + "HPPPMGEEY", + "HPPSEESQAF", + "HPPTGLEFSMY", + "HPPTGNDQAY", + "HPPWAGPQHP", + "HPQDGQVVFY", + "HPQDSAFSY", + "HPQEVYNEY", + "HPQFVTDVM", + "HPQIIIRAF", + "HPQPGAVEL", + "HPQPTQVQF", + "HPQQKVAVY", + "HPQTHETAL", + "HPQYEVVEISF", + "HPRIITEGF", + "HPSELIAEM", + "HPSFPEVSF", + "HPSGATPTL", + "HPSGNMASF", + "HPSGTVVAI", + "HPSHVQPAY", + "HPSLGHQVSY", + "HPSLQPEEY", + "HPSNVLHFF", + "HPSQHVMQY", + "HPSSTTPNL", + "HPSVDSSVL", + "HPSVSLQQY", + "HPTAFVVSY", + "HPTDDTTTL", + "HPTDITSLDQY", + "HPTDPLTSF", + "HPTIISESF", + "HPTLGPKITY", + "HPTLIQRTY", + "HPTLPAGRY", + "HPTPSPMAY", + "HPTSAASIF", + "HPTSGVIVL", + "HPTSVISGY", + "HPTSVTVTW", + "HPTVVISAY", + "HPVAKILHAY", + "HPVDFLDAF", + "HPVDNAGLF", + "HPVEELLDSY", + "HPVEKKLTY", + "HPVFQQESF", + "HPVFQTQ(Deamidated)FGR", + "HPVHPFLAVAY", + "HPVILASIVDSY", + "HPVKIGDLF", + "HPVPQPLQSF", + "HPVQHISF", + "HPVQVEQDTF", + "HPVRDPVHMY", + "HPVSALMEI", + "HPVSEGTLMY", + "HPVSREWTL", + "HPVVGDLTY", + "HPVYILKGGY", + "HPWELFVKY", + "HPWEVMPDLY", + "HPWFGM(Oxidation)EQEY", + "HPWFGMEQ", + "HPWFGMEQEY", + "HPWFGMEQEYTL", + "HPWTVPTVF", + "HPYARHYYF", + "HPYKGDRAEY", + "HPYNEGYVY", + "HPYPHNHYM", + "HPYQFLLKY", + "HPYQPDPKM", + "HPYQPDPKM(Oxidation)", + "HPYRAFPVL", + "HPYSQALIQY", + "HQAAIIIQK", + "HQTVPQNTGGK", + "HSFGGGTGSGFTSL", + "HSGPVIPVY", + "HSIDGRVVEPK", + "HSLSPGPSK", + "HSM(Oxidation)DMKFTY", + "HSMDMKFTY", + "HSMDTLLATLK", + "HSMSDPGVSY", + "HSRNEGTATY", + "HSSAVAATY", + "HSSGPMVEK", + "HSYATSIRK", + "HTANIFSVK", + "HTASPTGMMK", + "HTDLPSPLK", + "HTFGGPLLK", + "HTGPGILSM", + "HTISPFMNK", + "HTLDSYRILQK", + "HTLDVFKRK", + "HTLGQYFQK", + "HTMEFALVK", + "HTPKKWPKKPK", + "HTPKKWPKKPKVP", + "HTSSAIPVPK", + "HTSTVLTTK", + "HTYLANGQTK", + "HTYYKFDYK", + "HVANTLSVY", + "HVASTVQTY", + "HVASVTDSF", + "HVIDVKFLY", + "HVIETLIGK", + "HVLGAIFSK", + "HVNGIVQKY", + "HVQDVGAPK", + "HVSN(Deamidated)VTVNY", + "HVSTPLPVM", + "HVSTVNPNY", + "HVYDGKFLAR", + "HVYEIPVEY", + "HVYGLSTVY", + "HVYRNFFNK", + "HVYTPSTTK", + "HVYVGNISK", + "HWDEVKEEM", + "HWYTGEGMDEMEF", + "HYDAVEAEL", + "HYDAVTGKF", + "HYDEQQNFF", + "HYDGSYSTF", + "HYDMNTASL", + "HYDPATEEF", + "HYFQNTQGLIF", + "HYIDAGYLGF", + "HYIFVTGVKF", + "HYILHNSFF", + "HYINMPVQF", + "HYKPTPLYF", + "HYLDLETTW", + "HYLDVLYKM", + "HYLNHWNHF", + "HYLNVAFDL", + "HYLPSYYHL", + "HYLPVKIIL", + "HYMPPPYASL", + "HYN(Deamidated)GTDVSF", + "HYNSDLNNLLF", + "HYNWLIYHL", + "HYPPVQVLF", + "HYSPIYLSF", + "HYSTLVHMF", + "HYTIVFNTF", + "HYTNTYHIF", + "IAGSKALEY", + "IAKIPNFW", + "IAQLLPQEDLEA", + "IASAIVNEL", + "IASDIVSRF", + "IASN(Deamidated)VTETM", + "IASSSIAAK", + "IAVFMEHSF", + "IDASRLVY", + "IDLDPETEQVNG", + "IDLDPETEQVNGLF", + "IDSQRVWAEY", + "IEADISKRY", + "IEAELNKHW", + "IEDAGNKGIW", + "IEDPQIQAHW", + "IEDVDALKSW", + "IEHGIITNW", + "IEHGIVTNW", + "IEIKFQGRW", + "IEISELPVRTW", + "IEITGAGGKKY", + "IEKEIQQKW", + "IENNHILYL", + "IENPALLRW", + "IEQEGPEYW", + "IETILVQSW", + "IEVDGKQVELA", + "IEVDGKQVELALW", + "IEVFDPDANTW", + "IEVNGKQSW", + "IFDEAEKL", + "IFDGNVAHI", + "IFDLMDAKA", + "IFDLQKTSL", + "IFDNTFSRF", + "IFDQSGTYL", + "IFDVHVHEV", + "IFEDPRLIL", + "IFFENHPYF", + "IFHDISLRF", + "IFHEVPLKF", + "IFIDKIYSI", + "IFIDPGYQTF", + "IFINLPRSMDF", + "IFIQNSKLYF", + "IFIRFPKTLF", + "IFIRNPRTLF", + "IFIRTPRTLF", + "IFIRTYLSW", + "IFKDKPIKL", + "IFKPPDPDNTF", + "IFLDHIGGTRLF", + "IFLDPHTTQTF", + "IFLDYEAGHLSF", + "IFLNKTFQW", + "IFLNLKTAL", + "IFMRVATML", + "IFN(Deamidated)QTGIEA", + "IFRPDNFVF", + "IFTDVALKF", + "IFTNTVARF", + "IFVARLYYF", + "IFVDAPLNI", + "IFVDTNLYF", + "IFVKTLVTF", + "IFVNLTVRF", + "IFYAGTGNLLL", + "IGGSFILK", + "IGLHVFPTF", + "IIAIPTGVK", + "IIAKVTAKK", + "IIDTRDAGY", + "IIGTIFIIK", + "IIHAVIQEY", + "IINLPIGSK", + "IINSSITTK", + "IIQRHLTAK", + "IISTVEVLK", + "IIVDPTTGK", + "IIYQGQYKK", + "ILAAPGILK", + "ILDPHVVLL", + "ILELAGNAARDN", + "ILFDGIPLEK", + "ILYDHAHVK", + "IMINFNPHF", + "IPAAILHAF", + "IPAAVKLTY", + "IPARIVTNY", + "IPASVEHGRVY", + "IPDASKLQF", + "IPDDLKQLY", + "IPDKFVVGY", + "IPDYTRESY", + "IPEGEILVITY", + "IPFAPGDYDVNITY", + "IPFDPKFITY", + "IPFGNNPIFRY", + "IPFNSTNKY", + "IPFPDHNQSPRNTY", + "IPFPEGMGGSVY", + "IPFPSGRTNLY", + "IPFRPSIQF", + "IPGGN(Deamidated)HSLY", + "IPHEFHTSM", + "IPHILKEMY", + "IPHLLGDVVF", + "IPHMDIEAL", + "IPHTDPVDY", + "IPHTDPVDYEF", + "IPIAGRDITY", + "IPIALSGRDIL", + "IPIANTEKY", + "IPIEPDYKF", + "IPIERLYVTY", + "IPIFAVTN(Deamidated)Y", + "IPIGGGTSVSY", + "IPIGIDKAL", + "IPIHADPRLFEY", + "IPIHNEDITY", + "IPITSNTLIYY", + "IPIYADKDVF", + "IPKLPAVSF", + "IPLDSETHNY", + "IPLHLAAQY", + "IPLPLIKSY", + "IPLPPPPAPETY", + "IPLTNDGKYVL", + "IPMDDKLLY", + "IPMEEKRGWYF", + "IPMEFVNKM", + "IPMQSEPQY", + "IPMSDPQVL", + "IPMTPTSSF", + "IPNEIIHAL", + "IPNENEAQF", + "IPNENELQF", + "IPNVQQLEM", + "IPQDQLVVM", + "IPQKFIVDY", + "IPRIEDGNNF", + "IPRNSDISQSY", + "IPSPVLVKL", + "IPSSDSRNANLY", + "IPSSVIHPAM", + "IPTDVLKIVY", + "IPTEQVNEL", + "IPTHHPRVY", + "IPTKQTQTF", + "IPTPPLPSY", + "IPTRVVTNY", + "IPVEQKEGAF", + "IPVFLRHAEL", + "IPVGTHEF", + "IPVIVTEQY", + "IPVNEKDTLTY", + "IPVPIVSEL", + "IPVPYVEKY", + "IPWGSIPVLM(Oxidation)", + "IPWKHIDYF", + "IPYGERITL", + "IPYGKEISY", + "IPYHSEVPVSL", + "IPYSEPMPLSF", + "IQFNPPLSEK", + "IQGDPLDLK", + "IQGPPGTGK", + "IQNDRQLQY", + "IQNPTMINK", + "IQSTVMLDK", + "IREADIDGDGQVN", + "ISDPTSPLRTR", + "ISEQPLPNK", + "ISFGAFVAK", + "ISGPISTSK", + "ISIMEQMRDENQ", + "ISMDLQLTNK", + "ISMLTNYTF", + "ISMPDVDLHLK", + "ISPEQPQH", + "ISQEPFVPK", + "ISSDPLEEK", + "ITDEFVKQK", + "ITGPNMGGK", + "ITHAVVIKK", + "ITNDGATILK", + "ITPSTQQHLK", + "ITQGKDAAVSK", + "ITQGNMQLK", + "ITSPSTPSK", + "ITSPVVTQK", + "ITTLFLFSK", + "ITVAYTIPK", + "ITVGDIGPK", + "ITYDTPFKR", + "ITYNVN(Deamidated)DTFHK", + "ITYPYTPQFK", + "IVADHVASY", + "IVAGSLITK", + "IVAGTLTNK", + "IVAYSLKQK", + "IVEQDTMPPK", + "IVFGEQLIQK", + "IVGDPSTAK", + "IVGPNGVGK", + "IVGTLGAQ(Deamidated)AL", + "IVGTVLIIK", + "IVIETGPLK", + "IVIPPATEK", + "IVLSAVITK", + "IVMETGNTK", + "IVNASTTNK", + "IVNDFAYMK", + "IVNDFAYMKK", + "IVNHRIYYK", + "IVNPPKDLKK", + "IVQQVTGILK", + "IVSDFTIGR", + "IVSQVKVPK", + "IVTDVIATL", + "IVTKTIENK", + "IVVEHIIMK", + "IVVGTPGRLDDL", + "IVVPKAAIVAR", + "IVVPPLPEK", + "IVVPPLPGK", + "IWDPDAVKI", + "IWEPLAVKL", + "IWEQHTVTL", + "IWISKLPHF", + "IWPGGVLPKF", + "IYADPAAYVM", + "IYAPKLQEF", + "IYAPPLPSL", + "IYASVRTLL", + "IYDEDEVLL", + "IYDGPIHL", + "IYDKFIAQL", + "IYDKTSVLF", + "IYDLVDRHL", + "IYDNAVQGL", + "IYDPNLAF", + "IYDPNLAFL", + "IYDTHSLM", + "IYDVQHANL", + "IYEEEPFNF", + "IYFEYSHAF", + "IYFPKKEAVTF", + "IYGRMWYF", + "IYGSVWEKL", + "IYGYVAEQF", + "IYHQVAVQF", + "IYIAGHPAF", + "IYIDRFEDL", + "IYIDSNNNPERF", + "IYIGGQEHF", + "IYIKDYVTL", + "IYIKHPHLF", + "IYIKQIKTF", + "IYINSRSVF", + "IYISTLKT", + "IYISTLKTEF", + "IYITRQFVQF", + "IYKDYQYYF", + "IYKPVTDFF", + "IYKWITDNF", + "IYLASKNLI", + "IYLDTHFRL", + "IYLEKLKTI", + "IYLLIHNNF", + "IYLNNVIMRF", + "IYLPEVRKI", + "IYLPYLHEW", + "IYLRLLVKL", + "IYLSKPTHW", + "IYMSGSHGF", + "IYPEVVHMF", + "IYPPKLHQF", + "IYPQVLHSL", + "IYPRTQLPTW", + "IYPSNMQTMLL", + "IYPTTYVQF", + "IYQDSFEQRF", + "IYQDVTLKW", + "IYQKAFDLI", + "IYQKAFEHL", + "IYQKYIARF", + "IYQRDPLKL", + "IYQREWQRF", + "IYQRHVYNL", + "IYRAQLELF", + "IYSEVATLI", + "IYSTKLYRF", + "IYTRVTYYL", + "IYTSSVNRL", + "IYVHDLLT", + "IYVHDLLTF", + "IYVIPQPHF", + "IYVISAETF", + "IYVNPANTHQF", + "IYVPDIRNVF", + "IYVPVSLGF", + "IYVTGGHLF", + "IYYKSMPNL", + "KADGVPVYL", + "KAFNQGKIFK", + "KAFQATQQK", + "KAFQEGIAK", + "KAFTPFSGPK", + "KAGEVFIHK", + "KAGTELVNF", + "KALDFIASK", + "KALDKDQYLPR", + "KAMEDGGVKLLK", + "KAQLEGIIAPKK", + "KASSEMALYQK", + "KAVDITTPK", + "KAYGQALAK", + "KDRPPSAR", + "KEAAQEAVKLY", + "KEAETRAEF", + "KEALPKAAF", + "KEDDPKAAL", + "KEDEFGYSW", + "KEDGTFYEF", + "KEEAIEHNY", + "KEEDNVQKNY", + "KEEDSSGHTRAY", + "KEEEMKQMF", + "KEERAVIKAY", + "KEFDELVHW", + "KEFDKKYNPTW", + "KEFDPTITDASL", + "KEFEDGIINW", + "KEFEEARKW", + "KEFEGATLRY", + "KEFEPLLNW", + "KEFHTTGLAW", + "KEFPSILRF", + "KEGDIVTLI", + "KEGDLSTKY", + "KEGEEVYSW", + "KEGLDIYKKF", + "KEIDMLLKEY", + "KEIEILRNLY", + "KEIENLTQQY", + "KEIETQKQMY", + "KEIFLRELI", + "KEIGDVENW", + "KEIGTKQSF", + "KEIKDILIQY", + "KEIKDVKEMF", + "KEIPN(Deamidated)FPTL", + "KEIRDINRVY", + "KEIVVDGQSY", + "KELAEAASKW", + "KELEATKQY", + "KELELAHRY", + "KELENAVGSW", + "KELESIKETY", + "KELPVNAQNY", + "KEMALQKKL", + "KEMDEEDKAF", + "KEMEQFVKKY", + "KEMNDAAMFY", + "KEMTGIWRY", + "KEMVGQKMKY", + "KENGFTQHVY", + "KENPLQFKF", + "KENSIITKY", + "KENSYVKKF", + "KEQEIKKKF", + "KEQEIRNIVW", + "KEQETALRVY", + "KEQGQNLARQW", + "KEQILQQRF", + "KEQYQQQQQW", + "KESDGFHRF", + "KESEDAELLW", + "KESEVKREF", + "KESEVYKML", + "KESPLLFKF", + "KESTITRKL", + "KESTLHLVL", + "KETEIVKKL", + "KEVDDVLGGAAAW", + "KEVDVRYTEAW", + "KEVDVSKQL", + "KEVEEEERRY", + "KEVLHGKKW", + "KEWFEQRKVY", + "KEWVTPKEF", + "KEYDLAKKY", + "KEYEGEAILW", + "KEYEKALKY", + "KEYEPEMGKVY", + "KEYERFSKY", + "KEYIPPLIW", + "KEYWLVKNSW", + "KFDADPVEL", + "KFDDGAVFL", + "KFDDIRIYF", + "KFFGKDISTTL", + "KFFSEREASAVLF", + "KFFTSHNGMQF", + "KFGKKTGEGFYKYK", + "KFIDEQQILHW", + "KFIDPIYQ", + "KFIDPIYQVW", + "KFIDTTSKF", + "KFIEGVVLQL", + "KFIKNIPWNF", + "KFINVKAHHF", + "KFISQALLTF", + "KFISTSLLL", + "KFIWTNHKF", + "KFLDAGHKLNF", + "KFLDPITGTF", + "KFLDTALSF", + "KFLEHTNFEF", + "KFLESKGYEF", + "KFLGPAEHLTF", + "KFLKPIIPNF", + "KFLSDVSLKF", + "KFLVTESPAKF", + "KFMGVQMETF", + "KFMPVEGMVF", + "KFPLKIFKKPLKK", + "KFQMYVTY", + "KFSNVTM(Oxidation)LF", + "KFSNVTMLF", + "KFSPRPLKF", + "KFTPVASKF", + "KFVDSTFYL", + "KFVETHPEF", + "KFVTVQATF", + "KGEN(Deamidated)GMEDCVM", + "KGLRGSAKIWSK", + "KGNSPLLQK", + "KGSSNSYAIKK", + "KHKGKKFRPTAKP", + "KIADMGHLK", + "KIAKQIVQK", + "KIFSGVFVK", + "KIFSSLPLK", + "KIGEVSSPK", + "KIIAPLVTR", + "KIIEVHVEK", + "KILVPLVLL", + "KIMKDILEK", + "KIMKDILEKK", + "KIMSSPLSK", + "KIQPALQEK", + "KITDVALEK", + "KIYDRQVTK", + "KKFKFKFPKKQ", + "KKFPLKIFKKP", + "KKFPLKIFKKPLK", + "KKFPLKIFKKPLKK", + "KKKKYAKEAWPG", + "KKKYAKEAWPG", + "KKPKPKKVAPLKIK", + "KKTGSPEIKL", + "KKWPKKPKVPQST", + "KLEDGPKFLK", + "KLFNKFIGK", + "KLPKMKLPQF", + "KLQEAESNLRK", + "KLQETIEQK", + "KLSAPVSQK", + "KLSSLDVF", + "KLVQMKIYYF", + "KMLDNFYNF", + "KMMADYGIRK", + "KMPKFKMPSF", + "KMPKFSMPGF", + "KMPKMKMPKF", + "KMPKMKMPTF", + "KMPKVKMPKF", + "KMYEEFLSK", + "KNDTGFQEGY", + "KNPKKTKWWYHDD", + "KPDSTLHTY", + "KPEEIQTVY", + "KPFNPLLGETY", + "KPIESFNEY", + "KPITTGGVTY", + "KPIVFVGTGQTY", + "KPLAALVTY", + "KPMGKVVTY", + "KPNGLILQY", + "KPVDPIVGY", + "KPVEDILTY", + "KPVEGYDISF", + "KPWMEKNQTF", + "KPWSQHYHQGYY", + "KPYAFDRVF", + "KQ(Deamidated)LHERQPR", + "KQ(Deamidated)REN(Deamidated)Q(Deamidated)KF", + "KQLAVYEEF", + "KQMEQVAQFLK", + "KQQTIPLKK", + "KRALEVFK", + "KSDAEQYLK", + "KSFDEQNVPK", + "KSFDTSLIRK", + "KSFFDVALK", + "KSFGELVHK", + "KSFTPDHVVYA", + "KSFTPDHVVYARSK", + "KSGTPLSFK", + "KSIDFPLTK", + "KSIIPTVGK", + "KSIQSGPLK", + "KSLLWTETF", + "KSMDRVYGK", + "KSMNANTITK", + "KSQQALVQK", + "KSSDFAVLK", + "KSTELLIRK", + "KSTTTGHLIYK", + "KSYFSGLSK", + "KSYYSKHLK", + "KTAEDAKDFFK", + "KTAPPGSAVGK", + "KTETNVYFK", + "KTETPIVSK", + "KTFALPGIIK", + "KTFALPGIIKK", + "KTFEGNLTTK", + "KTFGETHPFTK", + "KTFKTGSILK", + "KTFPYQHRY", + "KTFTKWVNK", + "KTGEVLDTK", + "KTIAIGKVLK", + "KTIAPALVSK", + "KTIDASVSKK", + "KTIDMELVKRK", + "KTIHAELSKLVK", + "KTIQVPQQK", + "KTISQAVNK", + "KTIVFVETK", + "KTLDAEVVEK", + "KTLDEILQEKK", + "KTLDHVLTH", + "KTLDQAIMK", + "KTLDQAKAVLK", + "KTLEDFRVK", + "KTLEEAVGNIVK", + "KTLKWLEKK", + "KTLPYPLKK", + "KTLQDIVYK", + "KTLVFEQRK", + "KTMKDFVRR", + "KTMPTTFNR", + "KTNLTSVTK", + "KTPTSPLKMK", + "KTQEIFHSK", + "KTQGSETAGPPK", + "KTQNVFLTR", + "KTQPPLMKR", + "KTQTIFLKY", + "KTSGSNVKIVK", + "KTSSAFVGK", + "KTSTVPPSLRK", + "KTTLQKMGKK", + "KTVIEPLKK", + "KTVPVEAVTSK", + "KTYETTLEK", + "KTYGEIFEK", + "KTYIPPKGETK", + "KTYIPPKGETKK", + "KTYQDIQNTIK", + "KTYQEVAQK", + "KTYTKSSHLK", + "KVAENVIRQK", + "KVAGAATPK", + "KVAPAPAVVK", + "KVATTVISK", + "KVAVATPAK", + "KVAVVLIQK", + "KVFAGYYTK", + "KVFDAKPSAK", + "KVFDINLKEK", + "KVFEEPEDFLK", + "KVFGGTVHK", + "KVFGGTVHKK", + "KVFGNEIKLEK", + "KVFKQIFSK", + "KVFNQPKAK", + "KVGENVLPPK", + "KVGEVIVTK", + "KVGTFGIFK", + "KVIDPVTGK", + "KVIDRILYK", + "KVIGIAIMK", + "KVISSSSSFAK", + "KVLDAIIQEK", + "KVLHFFNVK", + "KVLPLLKIIKK", + "KVMEHVYEK", + "KVMTKVIKK", + "KVNIIPIIAK", + "KVNTVPLKNK", + "KVPDQKGTPK", + "KVPSDTLPLK", + "KVQDAFISY", + "KVQDSVLIK", + "KVQDVKKTIQK", + "KVQEKYVWNK", + "KVQELQNLLK", + "KVQEMNYIQK", + "KVQSKVNLK", + "KVQTAVTMK", + "KVQTEVLQK", + "KVSGDIFSR", + "KVSQVIMEK", + "KVSYSHIQSK", + "KVTDPSVAK", + "KVTEGSFVYK", + "KVVDSLYNK", + "KVVEGSFVYK", + "KVVENVIAK", + "KVVNPLFEK", + "KVYDKAINR", + "KVYGPGVAK", + "KVYNGILEK", + "KVYTKSSHLK", + "KWFFQKLRF", + "KWLDTQVVL", + "KWLEPLKNLRF", + "KWLTKSFHF", + "KWMGIAFRI", + "KWPDRITLL", + "KWPKKPKVPQS", + "KWPKKPKVPQST", + "KWSNNFIR", + "KYADKIYSI", + "KYAPRFNGF", + "KYEAIQLTF", + "KYEELFPAF", + "KYELDFSHF", + "KYFLWEEKF", + "KYGDILHVI", + "KYGIQMPAF", + "KYGMVTYLL", + "KYGPVFSF", + "KYGQGFYLI", + "KYGSVIQLL", + "KYGVVIASF", + "KYHTHLLQF", + "KYIATDFTL", + "KYIDFDHVF", + "KYIDKTIRV", + "KYIDKTIRVKF", + "KYIDQGIAEL", + "KYIDQKFVL", + "KYIDYIFNV", + "KYIEEQLLQRI", + "KYIEGVSDF", + "KYIENLDNITF", + "KYIERIITRF", + "KYIFKERESF", + "KYIGENLQL", + "KYIGFLVRL", + "KYIKDDFRF", + "KYINTDAKF", + "KYIPYKYVI", + "KYIQRQETI", + "KYISKPENL", + "KYISKPENLKL", + "KYITDVVKL", + "KYITDWQNVF", + "KYITEVSRW", + "KYITKSFNF", + "KYITKSFNFY", + "KYITQGQLLQF", + "KYKDIYTEL", + "KYLAEKYLQKL", + "KYLALRIAL", + "KYLATLETL", + "KYLDEDTIYHL", + "KYLDEFLLNKI", + "KYLDIHERM", + "KYLDVHSMHQL", + "KYLDVKFEYL", + "KYLEENVMRHF", + "KYLEERAMRQF", + "KYLEESTIRHF", + "KYLEETNSL", + "KYLEHPLLL", + "KYLEKKINQRF", + "KYLGQLHYL", + "KYLKEVLRI", + "KYLKTGFLKW", + "KYLKTGFLKWK", + "KYLLHSLVF", + "KYLLKLKFNF", + "KYLPENDLKRL", + "KYLPEWSAW", + "KYLPEWTAW", + "KYLPYNHQHEYFF", + "KYLQSTISF", + "KYLSGIAHF", + "KYLSGLVDKF", + "KYLSVQGQLF", + "KYLTAEAFGF", + "KYLTEGLLQF", + "KYLTVKDYL", + "KYLTVNKRL", + "KYLYVDKNF", + "KYM(Oxidation)DINFDF", + "KYM(Oxidation)DVQFDF", + "KYMDIEFDF", + "KYMDINFDF", + "KYMDVQFDF", + "KYMEDYHQF", + "KYMLKANLI", + "KYMPNVKVAVF", + "KYMTAVVKL", + "KYNANFVTF", + "KYNDNFFGL", + "KYNLINEYF", + "KYPDIVQQF", + "KYPDRVPVI", + "KYPENFFL", + "KYPHYFPLL", + "KYPHYFPVM", + "KYPNVFKKI", + "KYPSDLPYM", + "KYPVEWAKF", + "KYQDVYVEL", + "KYQEEFEHF", + "KYQELQVLF", + "KYQEVTNNL", + "KYQEVTNNLEF", + "KYQIINEEF", + "KYQKGFSLW", + "KYQNVKHNL", + "KYQPPPPP", + "KYQPRFHIV", + "KYQPRIAVF", + "KYRRYHPLF", + "KYSDITIMF", + "KYSLIKGNF", + "KYSLVKNKI", + "KYSPFVVSF", + "KYTKIFNDF", + "KYTPPPHHI", + "KYVAEFLEW", + "KYVDLTVSF", + "KYVERIHYI", + "KYVESFRRF", + "KYVHLFPKL", + "KYVKDFHKF", + "KYVKIFDNF", + "KYVKILYDF", + "KYVKVFDKF", + "KYVKVFHKF", + "KYVKVFHQF", + "KYVKVFNKF", + "KYVKVIHKF", + "KYVKVKVNF", + "KYVKVLHQF", + "KYVSGEFRF", + "KYVSSVLSF", + "KYVTSAYQW", + "KYVTVYNLI", + "KYVYVVTEL", + "KYYDKKYQVF", + "LAMEHGGSY", + "LAN(Deamidated)GSYDLANRDF", + "LASKEIHQF", + "LASQQNQSGPSG", + "LASQQNQSGPSGN", + "LASQQNQSGPSGNN", + "LEADLKHRF", + "LEADLPRSW", + "LEADPYSKW", + "LEALAKATY", + "LEDDFKEGY", + "LEDPEGVKRF", + "LEDSVAKTF", + "LEEPTVIKKY", + "LEFEGVKEKF", + "LEFGRGFMY", + "LEGNPDTHSW", + "LEHEYIQNF", + "LEHNEAYTW", + "LEHSFIKRY", + "LEHVPNSVRLW", + "LEKSFYQF", + "LELDPMAMTQKY", + "LESEQKQQF", + "LESGVPSRF", + "LEVDATSKY", + "LEVDLKNGY", + "LFDDIDHNM", + "LFDHAVSKF", + "LFDLGGQYL", + "LFHPSNVEM", + "LFIATSQKF", + "LFLPRTDYSF", + "LGISNLSQVRA", + "LGTYVAVFDRGD", + "LIYVAGGLTK", + "LKAVPSQKRT", + "LLEPYKPPSAQ", + "LLPGKTYSF", + "LLPSRQFGF", + "LLVVYPWTQR", + "LLYYSRTMAK", + "LMHPDALEEPDDQN", + "LNETGDEPFQYKN", + "LPAAAQDVY", + "LPAAAQDVYY", + "LPADIQAQF", + "LPADVQNYY", + "LPAEHQFSF", + "LPAGEYHKVY", + "LPAGPDILRTY", + "LPAKDIQTNVY", + "LPAKILVEF", + "LPALLEKNAM", + "LPAPGGMANLPF", + "LPAPGVPAW", + "LPAPPHIDVMY", + "LPAPPTQNM", + "LPAQGLIEF", + "LPAQLLELY", + "LPAQQVHNY", + "LPAREATQF", + "LPARIDAAY", + "LPASGRSAEVTL", + "LPASVHPQL", + "LPDDWDNRTSY", + "LPDEIYHVY", + "LPDERTISL", + "LPDKSIASL", + "LPDKTIASL", + "LPDLNHSQVY", + "LPDNHSSLIY", + "LPDQKQLRY", + "LPDTLKVTY", + "LPEEEQQRVL", + "LPEEHARFY", + "LPENYQMKY", + "LPEPVHGVAF", + "LPEPVVARF", + "LPEQSPVSY", + "LPESTHVEF", + "LPETSKYEY", + "LPEYNTRI", + "LPFDKETGF", + "LPFDLRASF", + "LPFEVKAGF", + "LPFFTEREQTL", + "LPFGKVTNL", + "LPFHTSTEM", + "LPFHTSTEMF", + "LPFKSPIRDISY", + "LPFLKPDDIQY", + "LPFLPSTEDVY", + "LPFMEDLRQY", + "LPFPDETHERY", + "LPFPIIQQY", + "LPFPKDASL", + "LPFRATENDIANFF", + "LPFSSMPTAY", + "LPFTPLSY", + "LPGKFEDMY", + "LPGSIQHVY", + "LPHAPGVQM", + "LPHAVQETF", + "LPHFIKDDY", + "LPHIPLKSF", + "LPHKDQRQM", + "LPHLADLVSY", + "LPHLIQDAGQFY", + "LPHMHNIVEY", + "LPHQPLATY", + "LPHSATVTL", + "LPHSGEAQL", + "LPIDGANDLF", + "LPIDPNEPTY", + "LPIEAPIRM", + "LPIENDTYKY", + "LPIENDVYKY", + "LPIESNPHSF", + "LPIGDVATQY", + "LPIGDVATQYF", + "LPIKDGKLVF", + "LPINDPLQTVY", + "LPINHQIIY", + "LPKEDLIKF", + "LPKKDIIKF", + "LPKKEDALLY", + "LPKNDLITY", + "LPLEEAYRF", + "LPLEEHYRF", + "LPLERDAESF", + "LPLLPNVSY", + "LPLNTNIRLAY", + "LPLPAPHAQY", + "LPLPDPLKY", + "LPLPNFSSL", + "LPLSHLVMY", + "LPLSIEGHVHY", + "LPLTHFELY", + "LPMKETGLMY", + "LPMKVVDMF", + "LPNDGDEKY", + "LPNEGRNDY", + "LPNFKQNEF", + "LPNIEERIM", + "LPNKDGVVRF", + "LPNNIVDVW", + "LPNPEDVKM", + "LPNQLFRTF", + "LPNSVHEY", + "LPPGSVISY", + "LPPGVHISY", + "LPPKIVIGY", + "LPPNTIMEY", + "LPPPSDPQY", + "LPQDVILKF", + "LPQEAFEKY", + "LPQGEKVQAM", + "LPQGPLGTSF", + "LPQHPDVEM", + "LPQHQVPAY", + "LPQPDPQQM", + "LPQPPEGQTY", + "LPQTSHVSF", + "LPRDYLATY", + "LPREEGPYEVEVTY", + "LPREELWIY", + "LPREGEQNF", + "LPRHLEIIY", + "LPRNEADEL", + "LPRSESTENQSY", + "LPRTDYSF", + "LPSDKALVL", + "LPSDTRLVL", + "LPSEHQTIL", + "LPSEIEVKY", + "LPSELERSY", + "LPSENHKEM", + "LPSHTKIKY", + "LPSMPEPAL", + "LPSNDPVVM", + "LPSNDSSKF", + "LPSPSDTTSVY", + "LPSPVTAQKY", + "LPSSEVVKF", + "LPTADIAQF", + "LPTDSATVL", + "LPTEAEWEY", + "LPTEEEWEF", + "LPTEKEVAL", + "LPTENELTF", + "LPTENVDKM", + "LPTEPPYTAY", + "LPTFQSPEF", + "LPTGIPIVY", + "LPTGRSIAF", + "LPTKQNEEF", + "LPTLPAKVY", + "LPVALQTRL", + "LPVDFSNIPTY", + "LPVDKPVGM", + "LPVDLAEEL", + "LPVEHVNQL", + "LPVEKLPKY", + "LPVEVATHY", + "LPVKGFRSY", + "LPVPNLDPDTY", + "LPVSEQQERAF", + "LPVSGNLIDLY", + "LPVSKPESY", + "LPVTQQMTEM", + "LPVVDFNEM", + "LPVVPKATY", + "LPWKAFTY", + "LPWSADRAIQQF", + "LPWSGISSKSGIEY", + "LPWVGKELY", + "LPYDASKWEF", + "LPYDLRASF", + "LPYEEEIMRNQF", + "LPYGPEVDIW", + "LPYKATENDIY", + "LPYKITAEEMY", + "LPYLEHVGHN(Deamidated)HTY", + "LPYNHQHEY", + "LPYPDPAIAQF", + "LPYPPEPGAASLYY", + "LPYRATENDIY", + "LPYTVVIHY", + "LQIQQGLQTL", + "LQNEPLPERL", + "LQQMQNPESL", + "LRFDGALNVD", + "LRQYGQTVAT", + "LSALEEYTKKLNTQ", + "LSATVTPQK", + "LSFDRILKK", + "LSFSSSAGPGLLK", + "LSMDHFTQPAK", + "LSQPKIVKWDRDM", + "LTEAPLNPK", + "LTGPVMPVR", + "LTMPGGVAK", + "LTNHFSFEK", + "LTSGIFETK", + "LTYNDFINK", + "LVFEWTIVK", + "LVFPSEIVGK", + "LVHQVFSEK", + "LVIPFAVRK", + "LVIPFTIKK", + "LVNSVNSKI", + "LVQKAILQK", + "LVSESSDVLPK", + "LVSFPIGIYK", + "LVVYPWTQRF", + "LYADVGGKQF", + "LYANMFERL", + "LYDEAIRHF", + "LYDIILKNF", + "LYDLVTEKM", + "LYDPVISKL", + "LYDTHITVL", + "LYDTHQNL", + "LYDVPANSM", + "LYEKDIQLF", + "LYFHINQTL", + "LYGDKWNSF", + "LYIDEAHSI", + "LYIDFGGKF", + "LYIDFRQ(Deamidated)DL", + "LYIGWDKHYGF", + "LYIVEPLKF", + "LYIVHPTMF", + "LYIYPQSLNF", + "LYKKTQETL", + "LYLDKATLIW", + "LYLEPQGTLF", + "LYLKALEGF", + "LYLKVKGNVF", + "LYLPPMRKID", + "LYMRIRDNW", + "LYPDHFHLL", + "LYPEIFEKF", + "LYPEVFEKF", + "LYPPRQPTF", + "LYPQFM(Oxidation)FHL", + "LYPRLYPEL", + "LYQDGVFKF", + "LYQEIIHYF", + "LYQRAFQHL", + "LYSGVHKK", + "LYSSKLYRF", + "LYTEKFEEF", + "LYTPVLIRF", + "LYVYPHSLNF", + "LYWSHPRKF", + "M(Oxidation)ATSTPVARGG", + "M(Oxidation)EAPAQLLF", + "M(Oxidation)PKFSMPGF", + "M(Oxidation)PQGGGQHY", + "M(Oxidation)PVGPDAILRY", + "M(Oxidation)QKQDLSK", + "MADENKNEY", + "MAHSFGESY", + "MAIEAQQKF", + "MASRTSSEM", + "MATAASSSSL", + "MATAASSSSLEKS", + "MAVEGDHSM", + "MAVIDGNVM", + "MAWLVDHVY", + "MAYGHIDSY", + "MAYTGKYFDK", + "MEADPELSKF", + "MEAIPVKQF", + "MEAKVENEY", + "MEAPAQLLF", + "MEEEKAKKSF", + "MEEGEFSEAREDM", + "MEFLFNKTGW", + "MEHANQQTGF", + "MEIAKQNW", + "MEIGMKVAL", + "MEKIWHHTF", + "MELDDTLKY", + "MELDEALRKF", + "MELDGPKGTGY", + "MELPDYRQW", + "MENANVLARY", + "MENDRVQLL", + "MENGIVRNW", + "MENLFINRF", + "MEPSTAARAW", + "MEQEGSEYW", + "MEQNTEGVKW", + "MEQPIKVT", + "MEQPIKVTEW", + "MESDFEQKL", + "MESTESRHY", + "METDARSSL", + "MEVELPYRY", + "MEVEVDGQKF", + "MEVPTYLNF", + "MEWQPEEQAW", + "MFDIVGTHL", + "MFDKDVVML", + "MFDRHSSL", + "MFINIKSI", + "MGATPTPFK", + "MGDPGARVY", + "MLASQQNQSGPSG", + "MLASQQNQSGPSGN", + "MLDPLEVHL", + "MPAAQEGAVAF", + "MPADTNKAF", + "MPAETIKEL", + "MPANMDKHAL", + "MPAPHTSITM", + "MPAVKAIIYQY", + "MPDEATPHY", + "MPDGKLYNF", + "MPDHTDVSL", + "MPDHVIPEI", + "MPDNTAAQKVSH", + "MPDPLLTRELY", + "MPEDLVEAL", + "MPEDVKNFY", + "MPEGEKLVNYY", + "MPEGGGALAEGF", + "MPEGGQGAPPMY", + "MPEKEPSVL", + "MPEPDAQRFF", + "MPEPQAPGRYF", + "MPEPTVLSL", + "MPEQIVIHAL", + "MPETTETVL", + "MPFAPAIQTF", + "MPFPNIRSAEL", + "MPFSPYEPL", + "MPFSPYEPLNFHAM", + "MPGEFDPTNY", + "MPGPPAHGF", + "MPHDLITQL", + "MPHPETKKDLY", + "MPIGGDVPAL", + "MPILKDVATVAF", + "MPIPGGNQRF", + "MPISELQGRW", + "MPITEVFKEEM", + "MPKFSMPGF", + "MPKISMPGF", + "MPKMDQDSL", + "MPKSDVNKEYY", + "MPKSEVASSVF", + "MPKVHIEF", + "MPLEDMNEF", + "MPLEEGDTF", + "MPLGARILF", + "MPLGHIMRL", + "MPLHVAPLL", + "MPLPGTKALPSM", + "MPLPHAEKKSRPSM", + "MPMADGREFNL", + "MPMPMGYNPYAY", + "MPNENIPEL", + "MPNGDHIVSA", + "MPNGWQVPAY", + "MPNHSASIQL", + "MPNPEGRYTF", + "MPNSASRDEF", + "MPNSPAPHF", + "MPNVKVAVF", + "MPPQNVGEVY", + "MPQGAPRLY", + "MPQGGGQHY", + "MPQHIMAIL", + "MPQKERESIM", + "MPQTHHHAL", + "MPRDIYQDY", + "MPRVQTQQY", + "MPSASMTRL", + "MPSEDVVSL", + "MPSHLGTYY", + "MPSHPDRAY", + "MPSKVVILRY", + "MPSPATLSH", + "MPSPIPAKY", + "MPSPVSPKL", + "MPSQSVEQTY", + "MPSRELASM", + "MPSSAVRVL", + "MPSSDTTVTF", + "MPSSSHGSM", + "MPSSVPLRA", + "MPSVKVSVF", + "MPTIQITAL", + "MPTQEVQEL", + "MPTRPVPSY", + "MPTSQSPAV", + "MPTSTILRL", + "MPTVHYEF", + "MPVAAREASIY", + "MPVAQQPVY", + "MPVDPNEPTY", + "MPVDSFNSMLSRY", + "MPVDVAMRL", + "MPVEKN(Deamidated)ITL", + "MPVEKNITL", + "MPVGMTHGL", + "MPVGPAPGM", + "MPVGPDAILRY", + "MPVHAAVQM", + "MPVHMVPTEL", + "MPVLEQSVL", + "MPVNTNQNF", + "MPVPAAAGAQQ", + "MPVPGHDVEAY", + "MPVPTTPEF", + "MPVRGPDVEAY", + "MPVSSQHRY", + "MPWGDPNYRSANF", + "MPYDTPVPGY", + "MPYGSRENSLLY", + "MPYKGMTTVDDF", + "MPYKGMTTVDDFF", + "MPYKVFHY", + "MPYPGGQGEAERF", + "MPYSHPSSY", + "MPYSVIRGEAF", + "MQIQQGLQTL", + "MQNMSIHTK", + "MTGGGSKVMK", + "MTGYGMPR", + "MTMDKSELVQK", + "MTMDRPLSH", + "MTSTMTIGK", + "MVAPAVQEK", + "MVGVNLPQK", + "MVHSEVAAY", + "MVIDLEKQIEK", + "MVLSVFIGK", + "MVSAEISENRK", + "MVVSDFHVF", + "MWKEGNRIHF", + "MYIFKQPHF", + "MYIKQVIIQGF", + "MYINDKLPYF", + "MYIRYIHKL", + "MYLGYEYVTAIR", + "MYLKTVDKF", + "MYPDVFAHF", + "MYPPAFRF", + "MYRLYMAED", + "MYSDVWKQL", + "N(Deamidated)AAKIFNLY", + "N(Deamidated)ETDSTVLVRW", + "N(Deamidated)LANGSYDLANRDF", + "N(Deamidated)VIRDAVTY", + "NAAKIFNLY", + "NAAKVFNLY", + "NAANIFERL", + "NAAPPPVTY", + "NAAQTSVAY", + "NAARDFVNY", + "NAARSQLETY", + "NADPQAVTM", + "NADPQAVTM(Oxidation)", + "NAESGRGQVM", + "NAESGRGQVM(Oxidation)", + "NAFEHGGEFTY", + "NAFEVAEKY", + "NAFKEITTM", + "NAFLDKGEFY", + "NAHSNILK", + "NAIEDTIFY", + "NAIHAILLY", + "NAIKESYDY", + "NAIKWNFTK", + "NAISVTTSY", + "NAITLPEEF", + "NAKDVAVSY", + "NALGLDQQF", + "NALNEQRVEF", + "NALNHTEQY", + "NANDITQSL", + "NAQRQDIAF", + "NASRDQVVY", + "NAVAGAVKY", + "NAVDALIDSM", + "NAVDDRGLY", + "NAVEENKAF", + "NAVKDFTSF", + "NAVNLAIKY", + "NAVVTVPAY", + "NAWNNLEKY", + "NEAEFHKPDY", + "NEAGPPEGY", + "NEAIASFVKKY", + "NEAPGPINF", + "NEAPVYSVY", + "NEAQAIETARAW", + "NEAQTAKEF", + "NEARLRNLTY", + "NEASVLHNL", + "NEAVLHLRF", + "NEDEDSPNKLY", + "NEDEIKKAY", + "NEDEPIRVSY", + "NEDLIKHGW", + "NEDLRKELW", + "NEDNGIIKAF", + "NEEGEAQKF", + "NEEHFRGQEF", + "NEFLDAEGRTW", + "NEFPEPIKL", + "NEFPVPEQF", + "NEGAAGVDRW", + "NEGDLFHRLW", + "NEGRPRIKTW", + "NEGTGKSSW", + "NEHAPAYSY", + "NEHDYAKAAF", + "NEHGNVPLHY", + "NEIDDMQVF", + "NEIDWLKRI", + "NEIEDTFRQF", + "NEIHKGKSY", + "NEIKVYITF", + "NEIQEALSRSY", + "NEIQKNIDGW", + "NEISERVVQHF", + "NEITIPVTF", + "NEIVQSNLF", + "NELGVGGTSQW", + "NELNIIHKF", + "NELPGLKW", + "NELSDMSRMW", + "NELVSTHGY", + "NEMEAPTTAY", + "NEMIEKREF", + "NEMMSKEQF", + "NEMQPNGKVF", + "NENAVVKRM", + "NENDIITHF", + "NENDIRVM(Oxidation)F", + "NENDIRVMF", + "NENHSGELW", + "NENINLGKKY", + "NENLGTVKKEW", + "NENNGVLKKF", + "NENPLRALY", + "NENPSKDQGW", + "NENSLFKSL", + "NEPILYGRSY", + "NEQDLGIQY", + "NEQPRQLFW", + "NEQSLEQVF", + "NESAIFHGW", + "NESDMIRNW", + "NESEEVRQF", + "NESEPIVVY", + "NESEYTVKW", + "NESIESIKW", + "NESLFGKKY", + "NESSVLHTL", + "NETDTPAQL", + "NETLIVSKF", + "NETSTGKTF", + "NEVDGEYRY", + "NEVEPGYYF", + "NEVEQLLYY", + "NEVEQRHTL", + "NEVFLAKLI", + "NEVIMTIGF", + "NEVKSVAW", + "NEVKVEESSW", + "NEVPEEKLY", + "NEVPEVTVF", + "NEVSKIVQTY", + "NEVSVIKEGW", + "NEVTTEIR", + "NEVTTEIRF", + "NEVVAGIKEY", + "NEVVAIKKM", + "NEVVGRLI", + "NEVYEAVKNY", + "NEWVVRLYY", + "NEYESRSLW", + "NFDLTKNYL", + "NFDNPVYL", + "NFISVRQQF", + "NFLSRSFYW", + "NFN(Deamidated)QTIATL", + "NFNQ(Deamidated)TIATL", + "NFPKGMLLRF", + "NFTNVAATF", + "NFTSTHLLL", + "NFVSAGIQTSF", + "NHINVMVKF", + "NHYTQKSLSLSPG", + "NIAEALVSK", + "NIHDIKLLF", + "NLANGSYDLANRDF", + "NPADITVLF", + "NPADSISHVAY", + "NPAPNPAVY", + "NPASPLPSF", + "NPDDVFREF", + "NPDPAVYQL", + "NPDTHSWEM", + "NPEAAVHIF", + "NPEHASVAM", + "NPENLATLERY", + "NPFEKGDLY", + "NPFHWGEVEY", + "NPFNMPNLY", + "NPGNPHNVY", + "NPHEVQPAY", + "NPHEVQPSY", + "NPHHDNVRY", + "NPHNDIQAF", + "NPHNGQVSY", + "NPIDHVSFY", + "NPIPFPETF", + "NPISGLLEY", + "NPISTVTEL", + "NPISVYIGY", + "NPITTSKITY", + "NPITVQTVY", + "NPLAATHEF", + "NPLDEQHIF", + "NPLKGDLANTF", + "NPLQKDPQY", + "NPNEEVAR", + "NPNEEVARF", + "NPNEEVARFY", + "NPNSPSITY", + "NPPDHDVVAM", + "NPPEFLHETY", + "NPSGNLTETY", + "NPTDAFTVF", + "NPVDIVSTL", + "NPVDWKEKY", + "NPVDWKEQY", + "NPVEDKDAVAF", + "NPVELKALY", + "NPVENIIRF", + "NPVGGLLEY", + "NPVGTGFSY", + "NPVINIASM", + "NPVMSTVAF", + "NPVNYGRPY", + "NPVQALSEF", + "NPVSWVQTF", + "NPWDNKAVY", + "NPWSTAIVAF", + "NPYHNEPGF", + "NPYHVVILF", + "NPYKNLPIY", + "NPYPGDVTKF", + "NPYRDLQIY", + "NPYSGDLTKF", + "NPYSNDILEY", + "NPYVKVNVY", + "NQEKHFYTF", + "NQQPSNYGPM", + "NRGDSTFESKSYK", + "NSMGLFLQK", + "NTDQGVYL", + "NTIGKEEIQQR", + "NTITPVVGK", + "NTMNITISK", + "NTMQQFLQK", + "NTNGFIIAK", + "NTNIPIGNK", + "NTSTTPPTSAK", + "NVADLHEKY", + "NVADVVIKF", + "NVATTLPSY", + "NVHDIMVSF", + "NVHNLAIVF", + "NVIESKAYVGR", + "NVIGVTLKF", + "NVIHNLATY", + "NVIRDAVT", + "NVIRDAVTY", + "NVLDDVYEY", + "NVLDIMVTK", + "NVVKLLGEQY", + "NVYDFKTTY", + "NVYEVVNPK", + "NWIEGNPKLSF", + "NWVPTAYTW", + "NYAQVLDKF", + "NYAWVYYHL", + "NYDEALRLL", + "NYDFGPIHM", + "NYDLALKYF", + "NYEDMQEITQHF", + "NYFHLAVAF", + "NYFLWTEKF", + "NYGHVYAVF", + "NYGLRTFLF", + "NYGRVFSEW", + "NYIDKVRFL", + "NYIEKVVAI", + "NYIGISLRI", + "NYIGLINRI", + "NYIHVGAQL", + "NYIMKIHNF", + "NYINQGVSHALTW", + "NYIPYLTKL", + "NYISGIQTI", + "NYITAALKL", + "NYLDPRISIAW", + "NYLDPRITVAW", + "NYLHLDYNF", + "NYLNHWNHF", + "NYLNQGVVHSITW", + "NYLSHHLTI", + "NYLSIFRKF", + "NYLTKIYGL", + "NYN(Deamidated)NQSSNF", + "NYN(Deamidated)QTVSRM", + "NYPETLGRLLI", + "NYQKRFQNL", + "NYSNIRFQF", + "NYSPYVNYF", + "NYVEVTRKW", + "NYVPMTPGTFDF", + "NYVPVNHFW", + "PAFELDSSKRD", + "PAPPPPPPP", + "PEHDPIRDQSW", + "PFAPAIQTF", + "PFIDSQHVI", + "PFLDIQKRF", + "PFLPQLQT", + "PFVDHVFTF", + "PFYRGERITF", + "PGLARQAPKPRKQ", + "PGSYLPSSYSF", + "PGYIDFTADQ", + "PIQTLVNM", + "PLGASSLTY", + "PLKTSPLQ", + "PNAKALN(Deamidated)GF", + "PQKPQTNK", + "PSPPPPPPP", + "PSTPIAHR", + "PTAGPLAQK", + "PTSPIRVK", + "PVATWNIYRY", + "PVDFQGRSTGEAF", + "PYADQVFRI", + "PYFNAPVYL", + "PYISNIYLI", + "PYLDNLPNF", + "PYLFHVVTF", + "PYLQDVPRI", + "PYLWWKKYI", + "PYMAKFVVF", + "PYMDSPQSIGF", + "PYNDYFEYF", + "PYNPLWAQL", + "PYVDNSYKW", + "PYYPSPGVLF", + "Q(Deamidated)ADFALEAL", + "Q(Deamidated)VVLN(Deamidated)GMESY", + "QAADIDTRSEF", + "QAAMPQVSY", + "QAEATAQTL", + "QAEEKAHAF", + "QAFESSQKY", + "QAIEDMVGY", + "QAKQESTEY", + "QALLDLHAL", + "QAMVFPYHR", + "QANDDARTF", + "QANPILEAF", + "QAQEVFFLK", + "QARIEIESF", + "QASDVSVKY", + "QASQPTPEK", + "QASSAAFRY", + "QAVADAVTY", + "QAVGAVKAL", + "QDHLSWEW", + "QEAASLLGKKY", + "QEADGQKISW", + "QEADIQNSKF", + "QEAEAAQRL", + "QEAEEPKARVL", + "QEAEERPKM", + "QEAELFRKI", + "QEAGIKTAF", + "QEAGPKPNL", + "QEAGTKARF", + "QEALHTQML", + "QEALPEKSL", + "QEALQKAKKY", + "QEAQIMKKL", + "QEDAARLQAAY", + "QEDEVMRAY", + "QEDLRTFSW", + "QEDPNYSPQRF", + "QEDQGLTKDY", + "QEDQHRINY", + "QEDRALRSF", + "QEDRPGLHAY", + "QEDVNKPAW", + "QEEEGSALKTSW", + "QEEEVRTLF", + "QEEIGSRNFF", + "QEEKGKITF", + "QEELAEMKRY", + "QEELAGLQRHW", + "QEELVKISL", + "QEEPGKGSFW", + "QEEPPLN(Deamidated)PHGAA", + "QEEQAARLL", + "QEEQRYQAL", + "QEESLRQEY", + "QEEYVKRAL", + "QEFDDVQGKW", + "QEFEEKSGRTF", + "QEFEHVN(Deamidated)GRW", + "QEFEHVNGRW", + "QEFGADVRL", + "QEFGLARFK", + "QEFGVPHQY", + "QEFQDAWKL", + "QEFRASFNHF", + "QEGDHGSHVY", + "QEGDIILVL", + "QEGDTTRKY", + "QEGEYIKMF", + "QEGGPAHKREY", + "QEGKPKRTLY", + "QEGMVFTRF", + "QEGTAKVSW", + "QEGTLLGKFTY", + "QEHIDLGIKY", + "QEHPIPLSY", + "QEHQGHQTF", + "QEIDEQRTKY", + "QEIEEIRQKY", + "QEIENAINEY", + "QEIETKEIY", + "QEIKITSKF", + "QEIPVNVRF", + "QEIRSLFEQY", + "QEITQRLFF", + "QEIVKTGLW", + "QEIYGGSDSRF", + "QEKDVFERY", + "QEKQLMKQY", + "QELANLEKW", + "QELDDILKF", + "QELDNPGAKRI", + "QELDNVIKQGY", + "QELIGKKEY", + "QELLAEHY", + "QELNDRFANY", + "QELNFLLRY", + "QELPQSADVQRW", + "QELPREKYLTW", + "QELQEINRVY", + "QEM(Oxidation)EGTVKSKY", + "QEMDARPKL", + "QEMEGNLHQL", + "QEMEGTVKSKY", + "QEMQEKLQNF", + "QEMSPEKLQQY", + "QEN(Deamidated)GPTAKAY", + "QENEDGYRW", + "QENEEAVKKM", + "QENEHIYNLW", + "QENIDRLVY", + "QENMQIQSF", + "QENNLLKTL", + "QENQKIGW", + "QENQSNRQF", + "QENSRVIVM", + "QEPPTKREY", + "QEQDLEKTRQY", + "QEQEAKQKL", + "QEQEERERRY", + "QEQEIEHHL", + "QEQEIEQRL", + "QEQGGEASPQRTW", + "QEQGTHPKF", + "QERDPSKIKW", + "QERGINESY", + "QESAEANKF", + "QESAQNTKF", + "QESEDTAKAGF", + "QESEVLERQM", + "QESNVQLKL", + "QESNVRLKL", + "QESQSNVKF", + "QETAVTQTY", + "QETELSQRI", + "QETHLKQQL", + "QETPDHAIFRW", + "QETPLPRSW", + "QETSFTKEAY", + "QEVDASIFKAW", + "QEVFEKATF", + "QEVGYSIRF", + "QEVGYTIRF", + "QEVIISNWHW", + "QEVIKAYGF", + "QEVKNLHQRL", + "QEVNELLQKF", + "QEVQPITSY", + "QEVRLTIHY", + "QEVTNNLEF", + "QEVTQDLHY", + "QEVYTAVTY", + "QEWDGLVRI", + "QEWNLTNIKRW", + "QEYIFKKPTF", + "QEYPDLIHI", + "QEYPDLIHIY", + "QEYREGKHSF", + "QFDVATHL", + "QFIPPYVPRF", + "QFVPKSHLF", + "QFVPPLPEW", + "QIFKPIISK", + "QIFNGTFVK", + "QIFRPDNFVF", + "QIGPAPPLK", + "QIHDHVNPK", + "QINLWKIYK", + "QIQDSIVTK", + "QISEVVVVK", + "QITLPTVQK", + "QIYGVFDEK", + "QIYSVVLKK", + "QLFYLPAKK", + "QLGPPSPLK", + "QLQPGNAKL", + "QLSAPITTK", + "QLYWSHPRK", + "QPAENISKDLY", + "QPAENVNQY", + "QPAKADKESF", + "QPAPAWTTF", + "QPAPELAVF", + "QPAPTPLKM", + "QPAQDIFSVY", + "QPAQQGQTY", + "QPASAIVNF", + "QPASFAVSL", + "QPDPDAIKMF", + "QPDPESVVL", + "QPDSGISSIRSF", + "QPFGGGSHM", + "QPFYHDDSY", + "QPGVLIQVY", + "QPIDSIRGY", + "QPIEGHAASF", + "QPINFSVSL", + "QPINLIFRY", + "QPLEEIITY", + "QPLKLDTSF", + "QPLSKTWEL", + "QPLTPDEYLTY", + "QPMNPTQNM", + "QPNASVHQF", + "QPNGGASVIHAY", + "QPNPLPLRL", + "QPNPVEQRY", + "QPQANSHVY", + "QPQHPLHVTY", + "QPQPGFGYSM", + "QPSPQQDVY", + "QPSSIVHRY", + "QPSTIATSM", + "QPTQTVVM", + "QPTVTIKVY", + "QPVGPERGEVTY", + "QPVHPDVTM", + "QPVKSFPTM", + "QPVKVLGENY", + "QPVKVRVSY", + "QPVSQPLTY", + "QPVTSEPTY", + "QPWEEIKTSY", + "QPWNHGETF", + "QPYDPNFYDETY", + "QPYTDGVRM", + "QPYTDGVRM(Oxidation)", + "QQIETQQRK", + "QQMWISKQEY", + "QQNEALAAK", + "QQTDIAVNW", + "QSLEHSWIK", + "QSMAFSILNTPK", + "QSNPAPQVQK", + "QSSDPDDTPPK", + "QTAQIFFTK", + "QTFLLQTTK", + "QTFPSVSAPSK", + "QTFQRVFTK", + "QTIPPPYVVR", + "QTLDKVVRK", + "QTLSLKQLFRK", + "QTLSTQLWK", + "QTMDMIISK", + "QTMDMIISKK", + "QTMLPSIRK", + "QTMSDTTFK", + "QTNPLYLAK", + "QTQGGGSVTK", + "QTQPIYLAK", + "QTQQVNTLK", + "QTQSASSTLQK", + "QTQSIYIPR", + "QTSAEVYRILK", + "QTSGSLVSK", + "QTTEFGIHK", + "QTVAVGVIK", + "QTYGQQLQK", + "QTYSTEPNNLK", + "QTYVGITEK", + "QVADAFLSK", + "QVADSTFTVLK", + "QVAPVANSY", + "QVAQLYMIQK", + "QVDPNFYSK", + "QVDTPIMTK", + "QVEEIFNLK", + "QVFEGHTHY", + "QVFGGGANSLFLEK", + "QVFQKSLPK", + "QVHEWLAKK", + "QVIAGAVHK", + "QVIEKFYPK", + "QVLSAATIVAK", + "QVNDLFSRK", + "QVNFTLPKK", + "QVQAAQFAK", + "QVQDLFNKK", + "QVQEGTKVLK", + "QVQKGPLKLK", + "QVQPKPSPPR", + "QVQPVDGATRK", + "QVQVVLNQK", + "QVSITGFFQRK", + "QVSPRITFK", + "QVSSPVQEK", + "QVSTPPAAK", + "QVSWSLDHK", + "QVTDFGFAK", + "QVTSQILQK", + "QVVSPGVYK", + "QVYRGALQK", + "QWINLKKAYSF", + "QWPPDPPLHF", + "QWPQPDKPMFF", + "QYASAFHFL", + "QYDEAVAQF", + "QYEKLFHKW", + "QYEQVKQLF", + "QYESKVFYL", + "QYFPKAPEF", + "QYLDGTWSL", + "QYLDVLHAL", + "QYLEEAPKF", + "QYLGQIQHI", + "QYLPHVARL", + "QYLPSPPLL", + "QYLRRLHYF", + "QYLRVETQF", + "QYMKIISSF", + "QYNPHVHQL", + "QYNPKFQTL", + "QYPVIIHLI", + "QYPVYWDHLEF", + "QYTHKIYHL", + "QYTPHSHQF", + "RAAPGAEFAPNK", + "RAFDSAVAK", + "RAFDSIVNK", + "RALDLVAAK", + "RALELAVKY", + "RAQDLPLKK", + "RAYGGSM(Oxidation)CAKC", + "RAYHLLVKK", + "RAYPHVFTK", + "RAYQQSEAY", + "RDMRQTVAVGVIK", + "REAEFTKSI", + "REAELKKKW", + "REAEQRRAY", + "REAGDEFELRY", + "REANELQQW", + "REANQQQQF", + "REAQTLQQY", + "REAVQKKTF", + "REDDSVHAY", + "REDEYKQKY", + "REDHLFRKF", + "REDKIFQKF", + "REDNVIRKY", + "REDRTKRLF", + "REEDGHTHQW", + "REEEAARLFY", + "REEEEKAKAY", + "REEGAVDKSY", + "REEHIDKVF", + "REEQSHPARLY", + "REERTFRNW", + "REFELEESY", + "REFPDRLVGY", + "REGAITFTW", + "REGEIAQFL", + "REGEIRHLF", + "REGEKEKASW", + "REGNAVAVRLW", + "REHDANKINY", + "REHDIAIKFF", + "REIAEVNKKL", + "REIAGHIMEF", + "REIEGSQVTF", + "REIELKVMKF", + "REIEQRHTM", + "REIEVPDQY", + "REILGIIVSY", + "REILKQIEY", + "REIQAQNFF", + "RELDKVLQKF", + "RELEKDMHY", + "RELEKDMHYY", + "RELEKVLHKF", + "RELELKNTW", + "RELLPVKKF", + "RELPEPLMTF", + "RELPNIEERIM", + "REMGVDVHF", + "REMLEKKDSF", + "REMPGGPVW", + "REN(Deamidated)GAKESW", + "RENKEIRTY", + "RENNAVYAF", + "RENTQTTIKLF", + "RENVEAAQSY", + "RENYDIIKTY", + "REQDAEGQDY", + "REQILMKRF", + "REREEETPAY", + "RESAVGQMGW", + "RESDQLFKQY", + "RESEYKQVY", + "RESGVGQTDW", + "RESKKIDRHMY", + "RETDLQELF", + "RETSVTPSNLW", + "RETVIKQTM", + "REVDQVKRL", + "REVETLPRKY", + "REVGNAILF", + "REVILPERW", + "REVSPAHQY", + "REWLIGNSVTW", + "REWSGKEKW", + "REYELRKNNF", + "RFDEARARF", + "RFDEAYIYM", + "RFDEGPVRL", + "RFDESMQVF", + "RFDGALNVD", + "RFDGALNVDL", + "RFDGRVVLV", + "RFDHVITNM", + "RFDHVITNM(Oxidation)", + "RFDNADRMF", + "RFDSDVGEF", + "RFEDSPSYV", + "RFEEAHFTF", + "RFHVLSKLLSF", + "RFIAPAASLGF", + "RFIGATANF", + "RFIKKLEHTW", + "RFINFVVKL", + "RFIPYTEEF", + "RFIRPMGLRF", + "RFKNKAYLL", + "RFKTQPVTF", + "RFLDDLGLKF", + "RFLDNKVLLSF", + "RFLNDPGHLLW", + "RFLNSSNDHRF", + "RFVPLPASAKW", + "RFYDRRFLKLLRF", + "RGMGELLPTK", + "RGSEPVPEK", + "RIFAPNHVVAK", + "RIFDLGRKK", + "RIFEPPPPK", + "RIFKHFTRK", + "RIFQEQVEK", + "RIFVYFITK", + "RIGGISGIFK", + "RIGNFIVKK", + "RIIDLVLQK", + "RIIDSKFLK", + "RIIEETLALK", + "RIIEPLTSR", + "RIIHGTASYK", + "RILFFNTPK", + "RILHTYYKF", + "RIMDPEIALK", + "RIQDGLGELK", + "RIQEHFNKK", + "RIQKSISQK", + "RIQLPVVSK", + "RISSNPVAK", + "RITDPTIDK", + "RITTHFELK", + "RIYNMEMARK", + "RIYSKFHQK", + "RKEKKMPKPRLK", + "RKKFPLKIFKKPLK", + "RKKLSSYPKQILR", + "RLADSLIGK", + "RLATFFPRK", + "RLDPNVQKW", + "RLFEGIIKGK", + "RLFIGGIPK", + "RLFVGSIPK", + "RLGDSSGPALK", + "RLINTQAIFAK", + "RLKDFSFRF", + "RLLPGNATISK", + "RLLSPPLRPR", + "RLMSLPIAK", + "RLMSLPIAKK", + "RLNHYVLYK", + "RLPAWQPIL", + "RLSSETGGMGSS", + "RLVSYFIKK", + "RPAALQVLY", + "RPAPPPISGGGY", + "RPAPVEVSY", + "RPAPVEVTY", + "RPAQSFLM", + "RPDEKAIMTY", + "RPEDQRLIY", + "RPFAGFEDF", + "RPFASGANFEY", + "RPFEENGACKY", + "RPFEQPQEY", + "RPFERTITM", + "RPIDADTIDIY", + "RPIEDDQEVY", + "RPIRLQVQY", + "RPLEKFVTY", + "RPLPPMKSY", + "RPSGKGIVEF", + "RPSPQQTEY", + "RPTDVAISF", + "RPTEFVNHY", + "RPVALTVTF", + "RPVDLEKDDY", + "RPVETYQVHEY", + "RPVHLDQAAF", + "RPVMDVAFVQF", + "RPVNVVNVY", + "RPVPKGATY", + "RPVPLEQTY", + "RPVSGDLSY", + "RPVSIEGSEEY", + "RPVSSIAMEM", + "RPYEDSSQHYY", + "RPYSQVNVL", + "RQAELAQWQK", + "RQAVPLFSK", + "RQFDNFKRVFK", + "RQFWTRTKK", + "RQIPYTMMK", + "RQNEINNPK", + "RQSTILKRW", + "RQYDIDDAIAK", + "RSADLTGLEK", + "RSAGVPFHAK", + "RSDTPLIYK", + "RSFEEAFQK", + "RSGEVPPQK", + "RSIQVDGKTIK", + "RSLDNFFAK", + "RSM(Oxidation)EAHNILSK", + "RSMDPFPWQQK", + "RSMEAHNILSK", + "RSMHEFSAK", + "RSMPEQTGEK", + "RSMVSTIMK", + "RSNPYYIVK", + "RSQKPVMVK", + "RSSIPVYKK", + "RSTDPVTTK", + "RSTVPTPAK", + "RSYHLQIVTK", + "RSYSSVIEK", + "RSYTKAYSR", + "RTAEVLANK", + "RTAFTLKQK", + "RTALNLFFK", + "RTATIMIQK", + "RTAVYSLHK", + "RTDDKVIRFK", + "RTDEAAFQK", + "RTDNISFMLK", + "RTEDGDWYGK", + "RTFQPPATGHK", + "RTFSKTIVK", + "RTFSWASVTSK", + "RTFTWLVGK", + "RTGDGIVQK", + "RTGSPLAAR", + "RTIAPIIGR", + "RTIATALEYVYK", + "RTIDKKFYK", + "RTIFPLFMK", + "RTINVYPNF", + "RTIQTFVKK", + "RTISSDAVLQR", + "RTLDSVLKK", + "RTLEPLAKK", + "RTLNPQMLQK", + "RTLQQMLLK", + "RTLSDYNIQK", + "RTMHYSISK", + "RTMNIKSATWK", + "RTMQDIVYK", + "RTMSEAALVRK", + "RTNEVVAIK", + "RTNEVVAIKK", + "RTNSPGFQK", + "RTNWPNTGK", + "RTQDIHIFR", + "RTQEKFALK", + "RTQGLM(Oxidation)IMK", + "RTQGLMIMK", + "RTQGVPAVLK", + "RTQHIQQPRK", + "RTQMPDPKTFK", + "RTQNVLGEK", + "RTQSTVESLSK", + "RTSEIYVHR", + "RTSGSVYITLK", + "RTSPSSDKVQK", + "RTVN(Deamidated)VSVPK", + "RTVQWWFKK", + "RTYDETYQR", + "RTYDGDGYKK", + "RTYVGSMPGR", + "RVADPTLEK", + "RVADRLYGVYK", + "RVAPAHGLFLK", + "RVAPEEHPVL", + "RVCEAVPGAKG", + "RVDDFKKAFSK", + "RVDGPASNLK", + "RVDPQVKVK", + "RVFAAESIIKR", + "RVFDVPIRR", + "RVFKEENQK", + "RVFQETQKLK", + "RVFQETQKLKK", + "RVFQEVAQK", + "RVFSGLVSTGLK", + "RVFTGVVTK", + "RVFVVGVGM(Oxidation)TK", + "RVFVVGVGMTK", + "RVGDVYIPR", + "RVGLHKVFK", + "RVGTVIGSNK", + "RVIDILRGK", + "RVIEGDVVSALNK", + "RVINEEYKIWKK", + "RVINSIPLAK", + "RVIQKSWRK", + "RVISEGMLWKK", + "RVKYGTVFK", + "RVLDALVAREK", + "RVLDFDVKRK", + "RVLDPSKFLK", + "RVLDVTKKK", + "RVLEAAVAAK", + "RVLEAIQKK", + "RVLEKDSVTLK", + "RVLESVQKK", + "RVLKPGGLLK", + "RVLPEFKKK", + "RVM(Oxidation)KALVNR", + "RVMDVQYNKF", + "RVMGDRSVLYK", + "RVMGIRVLR", + "RVMIFSVGK", + "RVMKALVNR", + "RVMQDIVYK", + "RVNKVIIGTK", + "RVPDPSPVTK", + "RVPLAIVNK", + "RVPLDPLIGK", + "RVQDHIQSR", + "RVQDLEQKMK", + "RVQDYIQSK", + "RVQEAVESM(Oxidation)VK", + "RVQEAVESMVK", + "RVQEIVGALRK", + "RVQGTPVASK", + "RVQIQQAANK", + "RVQKKTFTK", + "RVQN(Deamidated)ITQVGSVTK", + "RVQPNEAVYTK", + "RVQPPAQTR", + "RVSAIFVGK", + "RVSEFFMNAK", + "RVTPFILKK", + "RVVDGKDLTTK", + "RVVDLLVIK", + "RVWDISGLRK", + "RVYAENAIRKK", + "RVYGGLTTK", + "RWDEAFRKF", + "RWFDKSFTF", + "RWFQPAIPSW", + "RWMSQHNRF", + "RWSPVRPLVF", + "RYALIMHKL", + "RYASINAHL", + "RYASINTHL", + "RYDDMAAAM", + "RYDDMASAM", + "RYDEIRRHW", + "RYDEMVESM", + "RYDLGGLVM", + "RYFDGNLEKL", + "RYFDHALTL", + "RYFDVGLHNF", + "RYFENPQVI", + "RYFHWKMNL", + "RYFKTPRKF", + "RYFLPPYTF", + "RYGDVFQI", + "RYGLVTNEI", + "RYGPQFTL", + "RYGPVFTI", + "RYIANTVEL", + "RYIDRIHIF", + "RYIDRIHIFF", + "RYIDTHNRV", + "RYIEELQKF", + "RYIFAKNLF", + "RYIHKLYDL", + "RYIKNPRIVLL", + "RYINNPLLI", + "RYIPTAAAF", + "RYIQPWESEF", + "RYIRDAHTF", + "RYISDQLFTNF", + "RYISQTQGL", + "RYISVLKVF", + "RYITKGNLF", + "RYLAIVHAVF", + "RYLDEINLL", + "RYLDELMKL", + "RYLDGWNAI", + "RYLDKTEQW", + "RYLDVSILGKF", + "RYLEAGAAGLRW", + "RYLEKFYGL", + "RYLEKNVKL", + "RYLEKPM(Oxidation)EI", + "RYLEKPMEI", + "RYLENGKETL", + "RYLEQLHQL", + "RYLEVMRKL", + "RYLGIVHPFF", + "RYLGKVLEL", + "RYLHSHHFL", + "RYLHVEGGNF", + "RYLLFARQF", + "RYLNEFEEL", + "RYLNELKWSF", + "RYLNKAFHI", + "RYLPDTLLL", + "RYLPKGFLNQF", + "RYLPPATQVVL", + "RYLPQTYVV", + "RYLPSSSTPLTL", + "RYLPTGSFPF", + "RYLQTLTTI", + "RYLSKATTL", + "RYLSKVLEL", + "RYLSPKYIKMF", + "RYLTGAWRL", + "RYLTVAAVF", + "RYLTVATVF", + "RYLVISEKL", + "RYMDAWNTV", + "RYMNHMQSL", + "RYMNHMQSLRF", + "RYMPFAPAIQTF", + "RYMPPAHRNF", + "RYMPQNPHI", + "RYNHITATYF", + "RYNPENNTW", + "RYNPNLNTW", + "RYPAIIYNI", + "RYPDNLKHLYL", + "RYPDSHQLF", + "RYPPDIRATF", + "RYPQSIFSTF", + "RYPSNLQLF", + "RYPTSIASLAF", + "RYQDIIHSI", + "RYQQWMERF", + "RYQTKFRHL", + "RYSPVLSRF", + "RYSSAFTNRIFF", + "RYSSMAASF", + "RYVDQKFVL", + "RYVDQVLQL", + "RYVEIVSQF", + "RYVELAWGF", + "RYVIIPTTF", + "RYVPRASYF", + "RYVWWKKSL", + "SAAAALVLK", + "SAAAASPQK", + "SAADGTNVVK", + "SAADIARAEM", + "SAADVVVVH", + "SAAELRHVM", + "SAAGHVLVK", + "SAAKLLTEY", + "SAAKTFITK", + "SAAPPQEKK", + "SAASEQHVF", + "SADSASLAK", + "SAFGGSLPAK", + "SAFGQAFSK", + "SAFGVIIEK", + "SAFKADPKISK", + "SAFKPSSAITK", + "SAFQAPAVKK", + "SAFQHFWNR", + "SAFSTSISK", + "SAFSVAVTK", + "SAFTGQQGY", + "SAFTPDQALKK", + "SAFWLASRK", + "SAGDVAVQK", + "SAGHGLPAK", + "SAGPNSFNK", + "SAGPPSLRK", + "SAIAAVIAR", + "SAIDKMTKK", + "SAIDSVNATSK", + "SAIESTQSTPQK", + "SAIKENFQF", + "SAINDKSIVKK", + "SAISSPLTK", + "SALEEYTKK", + "SALEHSIQY", + "SALHIAIEK", + "SALPSLPAGSGLK", + "SALSVAPSK", + "SALTDKAIVKK", + "SAMDSTVAK", + "SAMKEFAYMK", + "SAMPDAIIRTK", + "SAMSNPRAM", + "SAMSNPRAMQAL", + "SANELAVQK", + "SANPPGPLK", + "SANTNTVPK", + "SAQDFASRAK", + "SAQELPLVEK", + "SAQGKPLALK", + "SAQNTKFFK", + "SAQSFFENK", + "SARIEYDAY", + "SARVGLARAR", + "SASASLPTK", + "SASDVMSHK", + "SASLPAPVK", + "SASSLHLTK", + "SASTTTLRY", + "SATQAVFQK", + "SATSKTFEK", + "SATTSPFFK", + "SAVDPVQMK", + "SAVDVHINM", + "SAVEEKVSY", + "SAVGTIVKK", + "SAVLFTITK", + "SAVRPVIEK", + "SAYEFYHAL", + "SAYFAEKLYK", + "SAYLGSEQYK", + "SAYYPSSFPK", + "SAYYPSSFPKK", + "SCKQDLLAY", + "SDQFPLPLK", + "SDVELDDLGKDEL", + "SEAAHQGVITW", + "SEAATAQREEW", + "SEAAYKEAF", + "SEADARIFKAW", + "SEADFSIHF", + "SEADLRKKM", + "SEADVAQQF", + "SEAEHQRAY", + "SEAEIRVFL", + "SEAEMRLFY", + "SEAEQTLRF", + "SEAERKAVQAMW", + "SEAFVIKGL", + "SEAGPNQTF", + "SEAGSAARF", + "SEAGSHTLQW", + "SEAGSLPAF", + "SEAKAFHDY", + "SEAKGLIRTW", + "SEALALTQ", + "SEALALTQTW", + "SEALEAGPRSW", + "SEAPARQGF", + "SEAPGPINF", + "SEAPSGESRKF", + "SEAQEGLQKF", + "SEAQSSPQF", + "SEAQVQKFL", + "SEAREDMAALEKD", + "SEASRLAHY", + "SEDAEKKVL", + "SEDDRLPVIQMW", + "SEDDVKMAL", + "SEDEEPKKY", + "SEDEGHREY", + "SEDEIKKAY", + "SEDGAIHVI", + "SEDGKIHVW", + "SEDGKVQVF", + "SEDGLLKLW", + "SEDGSLHVF", + "SEDGTLRLW", + "SEDGTVRLW", + "SEDHINRKY", + "SEDKSIRVW", + "SEDLLKEHY", + "SEDLMKELY", + "SEDLRSHAW", + "SEDMLGRVF", + "SEDQTWKRI", + "SEDQVQIHTY", + "SEDRSVRIW", + "SEDSMKDAW", + "SEDTAKAGF", + "SEEAEIIRKY", + "SEEAESQQQW", + "SEEALQKRL", + "SEEDARKNF", + "SEEDGDHNRTF", + "SEEDLKVLF", + "SEEDWKTRW", + "SEEEFLRTY", + "SEEELKKAY", + "SEEEMARTF", + "SEEETQKWF", + "SEEEYKKTY", + "SEEGLLRLY", + "SEEGMYVLRW", + "SEEGPDVLRW", + "SEEKLQEKARKW", + "SEELLSLKY", + "SEEPILKWY", + "SEEPLGRQLW", + "SEESFKQYF", + "SEFDDEPKF", + "SEFDSISKNTW", + "SEFEGHKRI", + "SEFENQGSRPLF", + "SEFGIPKKT", + "SEFKKKLFW", + "SEFLATKAKQF", + "SEFLKQAW", + "SEFPGAQHY", + "SEFPKPQIL", + "SEFTGVWKY", + "SEGDITQKGY", + "SEGDLRRKLY", + "SEGELVELRW", + "SEGELVVKF", + "SEGGPPLRI", + "SEGGTVKNY", + "SEGPLRPVL", + "SEGPPLRLW", + "SEGTKAVTK", + "SEGTPEKPLY", + "SEGVGKGTY", + "SEGVRPDGF", + "SEGYPGQRY", + "SEHAVNKQL", + "SEHISSSGKKY", + "SEHNTPVRSEW", + "SEHPLAQLY", + "SEHSIIKDF", + "SEIAQKQKL", + "SEIAVGHQY", + "SEIDKRVQY", + "SEIDMNDIKAFY", + "SEIDQRDKY", + "SEIDVRQEY", + "SEIEAKVRY", + "SEIEKNDVVF", + "SEIENVHGF", + "SEIFHSQSF", + "SEIGQKQKL", + "SEIGREKSQDW", + "SEIHLQVKY", + "SEIINSKNF", + "SEIKDVLVW", + "SEILQKEVY", + "SEINKPNFY", + "SEIPQTERM", + "SEIRAAEKKF", + "SEIRHTADRW", + "SEIRSISVNQW", + "SEIVGKRI", + "SEKAGIIQDTW", + "SEKDKPSSW", + "SEKPEIKQKW", + "SELAEDKENY", + "SELDQIQRY", + "SELKDFFQSY", + "SELKGMASW", + "SELKSGRLEW", + "SELLDKFTW", + "SELQARETF", + "SELQSIQRL", + "SELQSQVRY", + "SELSSEGTQHSY", + "SELYQKTYW", + "SEMDSERLQY", + "SEMDTSVKF", + "SEMKVSSTW", + "SEMNTDKQYF", + "SEMPAAKRL", + "SEMQRHYVMY", + "SENAERILF", + "SENAIVWKI", + "SENDMRFVY", + "SENDTYFKKY", + "SENDVIRLI", + "SENELKKAY", + "SENELKKAYR", + "SENETLKHL", + "SENGVSKDVW", + "SENITQKVVW", + "SENKIVGIGY", + "SENLIKHVQGW", + "SENLLGKQF", + "SENNIQTIF", + "SENPAKRLY", + "SENPFREKKF", + "SENPGQTHF", + "SENSRVSHY", + "SEPDFVAKF", + "SEPDFVAKFY", + "SEPESIRKW", + "SEPGDPKVTW", + "SEPSEVRSY", + "SEQPAKATF", + "SEQRDYIDTTW", + "SEQSSVGTQHSY", + "SEQSVTQSF", + "SEQVQGAQKQF", + "SEREATEVY", + "SEREEVSSW", + "SESAQSKM(Oxidation)L", + "SESAQSKML", + "SESAVFHGF", + "SESDLNHSF", + "SESEKKFLW", + "SESELGRKW", + "SESELTRLL", + "SESGAGLTRF", + "SESHFSERW", + "SESHMEWTW", + "SESIPKDSL", + "SESIQALGW", + "SESKDRKLY", + "SESKTVVTY", + "SESLEINRQF", + "SESLFVSN(Deamidated)HAY", + "SESLFVSNHAY", + "SESLLRGIYAY", + "SESLVHESW", + "SESNFARAY", + "SESNFSPKF", + "SESNIIRHY", + "SESPIVVVL", + "SESQLELNW", + "SESRMVVTF", + "SESSHKGFHY", + "SESSIDRLM", + "SESSVKVRL", + "SESTNQRVLW", + "SETDMVRQI", + "SETELKDTY", + "SETETKQRL", + "SETGALKTF", + "SETGRSKGY", + "SETKGIWMW", + "SETPEIRKY", + "SETRDTLRQW", + "SETSVPDHVVW", + "SETTAAHSL", + "SEVDFEERF", + "SEVDLTRSF", + "SEVDMLKIRSEF", + "SEVDVSDLGSRNY", + "SEVEGVKNI", + "SEVELTSSQRW", + "SEVESLMKKM", + "SEVILENGKL", + "SEVILHHEY", + "SEVLQDLRF", + "SEVLSWQF", + "SEVPFSKRY", + "SEVPKDSTHQW", + "SEVSTVLKL", + "SEVTASSRHY", + "SEVVAIKKM", + "SEVYPGQQY", + "SEWDGHEEL", + "SEWQPTNVDGKGY", + "SEYARPHVM", + "SFDDTNEKF", + "SFDETVTHF", + "SFDKAKLK", + "SFDKAKLKK", + "SFDLLPREF", + "SFDPSRTF", + "SFDSALQSV", + "SFDSTVRL", + "SFDSVPVSL", + "SFFKKIGVHF", + "SFGGLGGGSVRF", + "SFHNIHNTF", + "SFHRVHTAF", + "SFILEQAVY", + "SFINSNLKF", + "SFIPSSVPATF", + "SFLDPIKAYL", + "SFLGVKELSF", + "SFSPKTYSF", + "SFSSSAGPGLLK", + "SFSTVHEKF", + "SFVDTRTLL", + "SFYPRNITLTW", + "SGAQPILSK", + "SGATIRIFK", + "SGFAGVYFEK", + "SGFEGMFTK", + "SGGNIYVLK", + "SGIQVRYLK", + "SGLTVPTSPK", + "SGLVPAAPPK", + "SGMDYWIVK", + "SGMGSTVSK", + "SGMQ(Deamidated)NMSIHTK", + "SGMQN(Deamidated)MSIHTK", + "SGNLPLATK", + "SGPYGGGGQYF", + "SGSAPQPPK", + "SGSFPLVLK", + "SGSPATPLK", + "SGSSYLNTVQK", + "SGTPTLPPK", + "SGVGLSSYLSTEK", + "SGYFKQFQK", + "SGYQRDGYQQNFK", + "SHKSKYQTDLYERE", + "SIAAPFTSK", + "SIADSLKSK", + "SIAGLSTMK", + "SIAPPVPLK", + "SIAVKSIHRK", + "SIAVPIVLK", + "SIDGRVVEPK", + "SIFDDFSHYEK", + "SIFDGRVVAK", + "SIFEPAKGGEK", + "SIFEQGPAEMMK", + "SIFFESMPYK", + "SIFGGTDMKK", + "SIFHQKAEK", + "SIFKQPVTK", + "SIFRTPISK", + "SIFSEALLK", + "SIFSKFTSK", + "SIFVPGTQK", + "SIIAYLQKK", + "SIIETLRQK", + "SIKEVDEAK", + "SILEDYANYK", + "SILGPGNIKK", + "SILGTPLSK", + "SILKHLSAK", + "SILNNPIVK", + "SILNYVIYK", + "SILPAIFQK", + "SILPGDKTNKK", + "SILQERVKK", + "SILRNPVTNK", + "SIMDPNQNVK", + "SIMEKKMKTK", + "SIMKWNRER", + "SIMSSHVMK", + "SINLNAINK", + "SIPQKPQTNK", + "SIQDKGSIQK", + "SIQGVSTVTVK", + "SIQHPLIKK", + "SIQHVFIKK", + "SIQKPYNQK", + "SIQPATSPK", + "SIQRKLQEK", + "SIQTAIAKK", + "SISDKFFQK", + "SISDVGFGMLK", + "SISGPISTSK", + "SISSGPIQK", + "SISSPQPGK", + "SITSEVFNK", + "SITSVFITK", + "SIVDYKLITK", + "SIVMETGNTK", + "SIVSQTIPK", + "SIWDETLYK", + "SIWSSGSRHMK", + "SIYDSKRQSGK", + "SIYDVKYLMK", + "SIYKPGQTVK", + "SIYNPERTITVK", + "SIYRGPSHTYK", + "SIYRPSKNLDK", + "SKGSAFSTSISK", + "SLADFQIEK", + "SLAEILLKK", + "SLFEGSLSK", + "SLFGSPVAK", + "SLFLGSASK", + "SLFNTGFLK", + "SLGKDWHKF", + "SLLGYFPNK", + "SLM(Oxidation)HSFILK", + "SLMAPVGRWQK", + "SLMHSFILK", + "SLMPSQVVK", + "SLMPWFHGK", + "SLMQIDDNVMRK", + "SLNQAVVSK", + "SLPANTPLRK", + "SLPDLTTPLK", + "SLPLVDTHSK", + "SLPTVIMRNK", + "SLQDKQ(Deamidated)KGAK", + "SLQEVTIHEK", + "SLQPSISQK", + "SLQQVRQQLK", + "SLRFDGALNVDL", + "SLSEQVAAALK", + "SLSPVILIK", + "SLSSPLNPK", + "SLWDRLIFHK", + "SLYAHGYLK", + "SLYASSPGGVYATR", + "SLYSVPEGQSK", + "SLYWLSTQK", + "SMMDVDHQIAK", + "SMNANTITK", + "SNSYAIKK", + "SPAAMTTRY", + "SPAATPTSY", + "SPAEDKSSF", + "SPAGLSREY", + "SPALVGSN(Deamidated)ITF", + "SPAQEDGKVY", + "SPASDTYIVF", + "SPDEKSVITY", + "SPDGRTYYY", + "SPDSGVYEM", + "SPEDIKKAY", + "SPEELNRY", + "SPEEQAKTY", + "SPEGRLFQVEY", + "SPEGRLYQVEY", + "SPEPGQRTF", + "SPFATTTKY", + "SPFFERSGLAY", + "SPFHDIPIY", + "SPFHERHFHY", + "SPFKADIEM", + "SPFQDQLHQLY", + "SPFQPHVPY", + "SPFYPGKTTY", + "SPHGGALVM", + "SPHSVINIF", + "SPHTGIQEY", + "SPHVIQAVM", + "SPIDVVEKY", + "SPIEFLENAY", + "SPIHSTGQQFIY", + "SPIIVDITKDTF", + "SPIPFPPLSY", + "SPIRPPKYYTY", + "SPISIRQMAY", + "SPISQKIIY", + "SPLGGERPF", + "SPLHLAAQY", + "SPLKLLTSM", + "SPLPTVGSSY", + "SPLTGGNVAF", + "SPNAEIHIL", + "SPQDLRLFY", + "SPQEKEALY", + "SPQPDGKVVY", + "SPQPPSFTY", + "SPQSTVTVF", + "SPRKDGLSY", + "SPSDVFIGY", + "SPSITYDISQL", + "SPTDSTPAL", + "SPTDVHKQY", + "SPTEVVERL", + "SPTNTVHMY", + "SPTQIGPSY", + "SPTTIQVTY", + "SPVDSVLFY", + "SPVESVLFY", + "SPVIHPPVSY", + "SPVNSSKQPSY", + "SPVRNLQSF", + "SPVSKGILQY", + "SPWADNTAL", + "SPYNLAYKY", + "SQADIKKAY", + "SQAFPSVSK", + "SQAGMTGYGMPR", + "SQAPVNKPK", + "SQAQATISFPK", + "SQFDGDYISK", + "SQFGEMGGKFMK", + "SQFKGYFIFK", + "SQFLAPKAMKK", + "SQFSGKITVK", + "SQFSLPVQK", + "SQFSPAVFVYK", + "SQFSSRKYLK", + "SQGPISKPK", + "SQGTPISLK", + "SQHEVFVEK", + "SQHYHQGYY", + "SQIEKFQEK", + "SQISTSIQK", + "SQKMFVNTK", + "SQLEQENNLLK", + "SQLGIFISK", + "SQMKIVHKK", + "SQMKSYQSF", + "SQNPRFYHK", + "SQNQNLPVAK", + "SQNTDMVQK", + "SQNTKPYLK", + "SQQKVVITK", + "SQWNNDNPLFK", + "SRDKTIKLW", + "SSAAQLPQK", + "SSADFTVPK", + "SSADGSQPPK", + "SSAEVIAQARK", + "SSAEYSVHK", + "SSAGPGLLK", + "SSAPPLTGK", + "SSAPTARVFMK", + "SSARVGLARAR", + "SSARVGLARART", + "SSARVGLARARTR", + "SSASALTGLTK", + "SSATLNSIVAK", + "SSATTSPFFK", + "SSAVTSVAK", + "SSDVIIHR", + "SSEAPLVQK", + "SSFEHEFKK", + "SSFGGLGGGSVR", + "SSFGGLILSK", + "SSFGNMIYK", + "SSFGRGFFK", + "SSFGSGAGSSSFSR", + "SSFGTILRK", + "SSFLQQHKK", + "SSFQGLILK", + "SSFSGLLRK", + "SSFSSPHMK", + "SSFYNTKKK", + "SSGDIFLEK", + "SSGFVAIKK", + "SSGPASPPR", + "SSGPSTPLK", + "SSGPVPSAK", + "SSGVPNPPK", + "SSGVPTPTK", + "SSHLPPPPK", + "SSHVPIQK", + "SSIPSTWPR", + "SSIQGQWPK", + "SSIRHMIRK", + "SSISSPWGK", + "SSKSQTEVPK", + "SSLDVNVLK", + "SSLGKDWHK", + "SSLNHIVEK", + "SSLPGVFKK", + "SSLPKSFKR", + "SSLPRAFQK", + "SSLPTQLFK", + "SSLQEVYHK", + "SSLSGEELVTK", + "SSLSLFFRK", + "SSLSSPLNPK", + "SSLYIILKK", + "SSMDSKSSGWGM", + "SSMLASAVEK", + "SSMPSSRHK", + "SSMTSTMTIGK", + "SSMVGVNLPQK", + "SSNDWNVEK", + "SSNIFTVAK", + "SSNLPVNNK", + "SSNSMQTIQK", + "SSNSSPIGK", + "SSNSYAIKK", + "SSNTFSIKK", + "SSQN(Deamidated)FTLTK", + "SSQNFTLTK", + "SSQPVLSQK", + "SSQQPEKVMAK", + "SSQQSVMSK", + "SSQTSGSLVSK", + "SSRGPLPVK", + "SSSAGPGLLK", + "SSSAPIVFK", + "SSSFPYTTK", + "SSSGFVAIK", + "SSSPPILTK", + "SSSPVNVKK", + "SSSRGPLPVK", + "SSSSPTFPK", + "SSSSSSPFK", + "SSSSSSSPFK", + "SSSSVLINK", + "SSSTVSYLK", + "SSSWPVILK", + "SSVPYSTAK", + "SSVSLPLAK", + "SSVTPSPAK", + "SSYDTAWKK", + "SSYEDKNLLKK", + "SSYLNTVQK", + "SSYPVCVSK", + "SSYSLMRQK", + "SSYSQVRNK", + "STAAFFLLR", + "STAAVGVLK", + "STADGSALVK", + "STAEESSPPK", + "STAGLIIGK", + "STAIQELFK", + "STAKPPKEILK", + "STAKVSPLTPK", + "STAMNGNLAK", + "STANIDDLKK", + "STANTYSYHK", + "STAPAQLGK", + "STAQRVTYK", + "STASEDQIVSK", + "STASEETVQNR", + "STASELSPK", + "STASMGGWTK", + "STATATVSVGK", + "STATTGPPPK", + "STAVGLVTK", + "STDERAYQR", + "STDGAKVFSK", + "STDGERLYK", + "STDMPAAFK", + "STDNLLVNK", + "STDPAAPNLK", + "STDPNSVFR", + "STDPSAGTGSQK", + "STDPSKYRK", + "STDPSVLGK", + "STDQASAIK", + "STDQASAIKTK", + "STDTIPKSK", + "STDTVFHMK", + "STEEPMPTK", + "STEFLALMK", + "STEKIYIRK", + "STEPIYVYK", + "STEPPYSQK", + "STESNMSVPK", + "STETALYRK", + "STFDSPAHWAQK", + "STFDTQITK", + "STFDTQITKK", + "STFESKSYK", + "STFFYPKLK", + "STFGGHKSEK", + "STFHGQPRER", + "STFIGRAAAK", + "STFKETENTAYK", + "STFKNVTYK", + "STFLMKAAAK", + "STFNFHPNVR", + "STFNNDILSK", + "STFNQVVLK", + "STFNVFVGK", + "STFPVHRQK", + "STFQPANKLNK", + "STFQQM(Oxidation)WISK", + "STFQQMWISK", + "STFRESFKK", + "STFRVPVER", + "STFRVPVERK", + "STFSAPLNK", + "STFSEIFKK", + "STFSGGRIPK", + "STFSGLAKHK", + "STGEEVSLWQK", + "STGHVGFIFK", + "STGQEYAAKFLK", + "STGRPLGTTK", + "STGSYIAGYLK", + "STHGTFLNK", + "STIAILNSVKK", + "STIASSSSSQLK", + "STIDPAVSK", + "STIDPSGTRSK", + "STIEYVIQR", + "STIFYYVQK", + "STIGETSKK", + "STIGPEGVHQK", + "STIGVDGSVYK", + "STIKFQMKK", + "STILPLYSK", + "STIMLDNIVRK", + "STIN(Deamidated)SSSSVVHK", + "STINSSSSVVHK", + "STIPPELVKQK", + "STIPPHVQK", + "STISLQMGTNK", + "STISSNASK", + "STITGVMDK", + "STITKAWKK", + "STITKIHSK", + "STKEEAILK", + "STLAVTSQK", + "STLDGVSRK", + "STLEHGTSLK", + "STLESIYQR", + "STLGGRLQAK", + "STLGSQGQTGK", + "STLGTAHTPK", + "STLGYTISR", + "STLHHVLQR", + "STLLASPMLK", + "STLLNPIPK", + "STLNVGVNK", + "STLPGSTTSNK", + "STLPKPVQK", + "STLPKSLLK", + "STLPNTIYR", + "STLPPVKSK", + "STLQVGSLNVK", + "STLRQKIRK", + "STMAIIVNK", + "STMDKFNVTK", + "STMDLVKSK", + "STMELDEALRK", + "STMGYM(Oxidation)MAK", + "STMGYMAAK", + "STMGYMAAKK", + "STMGYMMAK", + "STMGYMMAKK", + "STMPHTSGMNR", + "STMPHTSGMNRL", + "STMTSGQAR", + "STMVDVRVMK", + "STMVDVRVMKK", + "STMYPGLPSRL", + "STNEGMNVK", + "STNEGMNVKK", + "STNHTQALLK", + "STNLIIHQK", + "STNLPSPNK", + "STNN(Deamidated)MAYNK", + "STNNIAQAR", + "STNNMAYNK", + "STNNWVLIK", + "STNPFRPQK", + "STNPKAALK", + "STNSFALNK", + "STNSHPILR", + "STNSHPILRK", + "STNSPVGVSK", + "STNTSLLTSK", + "STPGTAPPPK", + "STPLAGLAPK", + "STPLGQQQPAPR", + "STPSFSSPK", + "STQAEGTRTLK", + "STQANQPPR", + "STQDHAAAAIAK", + "STQDTTVALK", + "STQEDVINK", + "STQIVANAK", + "STQIYQAKK", + "STQN(Deamidated)GPVFAK", + "STQNGPVFAK", + "STQQEKETIAK", + "STQQPLTKK", + "STQRDLWNIFK", + "STQSKVMNK", + "STQSLARLGS", + "STQSLSLQR", + "STQSSLLRK", + "STQTALTLK", + "STSATTPVK", + "STSDILSEK", + "STSDSVRLK", + "STSEAPQPPR", + "STSENITQK", + "STSEPLSSK", + "STSERTLLK", + "STSETPQPPR", + "STSGPPTISK", + "STSGTVINK", + "STSNSFNLK", + "STSPSQPRK", + "STSPYFLEH", + "STSQLYTVK", + "STSQQVPAQRK", + "STSQSPPIK", + "STSQTFIYK", + "STSSPYVSK", + "STSTPAPSR", + "STSVPENPK", + "STTAILQQK", + "STTEVTQPR", + "STTN(Deamidated)QSISK", + "STTNQSISK", + "STTPPTSAK", + "STTQVVGILK", + "STTTGHLIYK", + "STTTTQITK", + "STTTTTHITK", + "STVAPPQGVVK", + "STVDAEAVHK", + "STVDSSHLHSK", + "STVEKIAM(Oxidation)K", + "STVEKIAMK", + "STVGAGAYAYK", + "STVGGQSVKK", + "STVGSAISR", + "STVGSAISRK", + "STVGWASQK", + "STVNKWTLK", + "STVNVILGK", + "STVPPSLRK", + "STVQILGAEK", + "STVSADPVVK", + "STWEGIQAGK", + "STWGDFHYK", + "STYALTLYK", + "STYATTIRDSK", + "STYDGVFIWK", + "STYDLYTIPK", + "STYEQVDLIGK", + "STYGKIGVK", + "STYGSQASHNK", + "STYGTHIHEK", + "STYGVTKGK", + "STYKEAFRK", + "STYPAQN(Deamidated)GQVK", + "STYPAQN(Deamidated)GQVKK", + "STYPAQNGQVK", + "STYRKFSTK", + "STYTPENLLNK", + "STYYNPSLK", + "SVAAPITVR", + "SVAASVTAK", + "SVADPGQLK", + "SVADVSSSR", + "SVAEAPSTTK", + "SVAEHPLSR", + "SVAELRSQK", + "SVAETAQTIK", + "SVAGLKKQFYK", + "SVAHSPPEK", + "SVAKTILKR", + "SVAKTSVDILK", + "SVAPARAQPPK", + "SVAPPGGSR", + "SVAPSKAREYSK", + "SVAPVFTVTK", + "SVAQLLLSK", + "SVAQQLLNGK", + "SVAQTVVQK", + "SVAQVVLSR", + "SVASATSVATK", + "SVASPFTSK", + "SVASSRSSVLK", + "SVASTPISQR", + "SVATGLNMMK", + "SVATVVYLR", + "SVAVLRGIQK", + "SVDEESYKTLK", + "SVDGPVSQK", + "SVDKIVIQK", + "SVDLPKHAK", + "SVDPKNYPK", + "SVDQAGKYSK", + "SVDSLPLAK", + "SVDVHQVYK", + "SVEDNNGN(Deamidated)MYK", + "SVEDNNGNMYK", + "SVEDPTKQTK", + "SVEEGEKVVK", + "SVEEISTLVQK", + "SVEERITQVAK", + "SVEGEGEEEGEEY", + "SVEGPSQAK", + "SVELPIVGK", + "SVEMPLTGK", + "SVFAFGENK", + "SVFDSSSDMEK", + "SVFDVKSGSAVHK", + "SVFEDPVISK", + "SVFELTFKR", + "SVFESLIAK", + "SVFESLIAKK", + "SVFEVDGKKNK", + "SVFFPESGLAK", + "SVFGGLVNYFK", + "SVFGTMPLK", + "SVFIDSIPK", + "SVFKSARQK", + "SVFLGTHSK", + "SVFNHAIRH", + "SVFPFESGKPFK", + "SVFPKPFVQK", + "SVFQQGM(Oxidation)KNK", + "SVFQQGMKNK", + "SVFQTTDTK", + "SVFQTTDTKSK", + "SVFSDKLHSK", + "SVFSGNPSIWLK", + "SVFSKYFER", + "SVFSPSFGLK", + "SVFSPYWLINK", + "SVFSYQVASTLK", + "SVFTSVRQK", + "SVFTTSQDSTLK", + "SVFVATFLR", + "SVFVETFVQK", + "SVFYGAPSK", + "SVGPPSKDK", + "SVGQTVITK", + "SVGSVITKK", + "SVGTEMIITK", + "SVGTIFGIYRK", + "SVHFPLRSK", + "SVHWFPVQK", + "SVIDEPVRLK", + "SVIDTSTIVRK", + "SVIDVFNQR", + "SVIELLLKK", + "SVIEQILHY", + "SVIEVPAVPEEILK", + "SVIGLQMGTNK", + "SVIGSN(Deamidated)GYILNK", + "SVIGSNGYILNK", + "SVIGSTETTGK", + "SVIGVFITK", + "SVIIAKVTAKK", + "SVIKNVSTK", + "SVIKTQETK", + "SVILPILKK", + "SVINKVTEK", + "SVINNSHNK", + "SVINPGAIYR", + "SVIQQPAPDR", + "SVIQTGHLAK", + "SVIRDYLVQK", + "SVIRPPFKK", + "SVIRPPFKKFSK", + "SVISIMKPVRK", + "SVISSPLLK", + "SVITIVKSK", + "SVIVPSGAPK", + "SVIVQPFSK", + "SVLAETEGILQK", + "SVLAETIKK", + "SVLAQQAAK", + "SVLAWHSRYK", + "SVLDGAVVK", + "SVLDIETRK", + "SVLDMEAITFKK", + "SVLDSFLKY", + "SVLDSSALK", + "SVLDTVLLR", + "SVLDYFSER", + "SVLEGVLSK", + "SVLENFVGR", + "SVLEPGTAK", + "SVLEPGTAKK", + "SVLEPPLFLK", + "SVLEVRTENLK", + "SVLGISTPK", + "SVLGKDEQINK", + "SVLGKGSMRDK", + "SVLGKVNEIAK", + "SVLGLLLKK", + "SVLGQAMEK", + "SVLGQLGITK", + "SVLGSSTVSK", + "SVLHVLGILK", + "SVLIQKQIFK", + "SVLKEKITFK", + "SVLLFVTKK", + "SVLLPLVAK", + "SVLNFATNR", + "SVLNIPMAK", + "SVLNLVIVK", + "SVLNLVIVKK", + "SVLPEGGETPLFK", + "SVLPEGPVWVK", + "SVLPNQVSVITK", + "SVLPVLDNPLSK", + "SVLQEPPAKK", + "SVLQGLLKK", + "SVLQLGNIVFK", + "SVLRELFKK", + "SVLRLSVSY", + "SVLSPLLNK", + "SVLSTSTNR", + "SVLTDPAKLK", + "SVLTDPAKLKK", + "SVLTIDKMQNK", + "SVLVSAGNVK", + "SVLWPWINR", + "SVM(Oxidation)RLTISY", + "SVMAQVRQK", + "SVMDGAIASGVSK", + "SVMDHHFRK", + "SVMDQEMRVK", + "SVMDSPKKLK", + "SVMGPQEKK", + "SVMGVTVSR", + "SVMKDIKNTTQK", + "SVMKDISIGK", + "SVMKSFIKR", + "SVMLGGRNIK", + "SVMNPKPSSWRK", + "SVMPKKSILK", + "SVMPKKSILKK", + "SVMPPMSTHR", + "SVMQQNLVYYR", + "SVMQSGTQMIK", + "SVMRLTISY", + "SVMRPEQIMK", + "SVMSTVEWNK", + "SVMYPVDSVK", + "SVNGDSISK", + "SVNGKVLSK", + "SVNKASTVTK", + "SVNLSNVLK", + "SVNNSIFYR", + "SVNNVVVRY", + "SVNPNKPATK", + "SVNPSVTTIK", + "SVNSDISKK", + "SVNSHIYQR", + "SVNSQTLNR", + "SVNSTVLVK", + "SVPADLSRPK", + "SVPDSSALPTK", + "SVPEAGGPPIKK", + "SVPEFPLSPPK", + "SVPEFPLSPPKK", + "SVPEGPWWRK", + "SVPEN(Deamidated)GHHPK", + "SVPENGHHPK", + "SVPGSQTVVVK", + "SVPIGRFQNR", + "SVPLPISHK", + "SVPLSDALLNK", + "SVPNGQTPLK", + "SVPREPIDRK", + "SVPSTPIAHR", + "SVPVAVVPSK", + "SVQAPEVAK", + "SVQAVLVGK", + "SVQDNALQR", + "SVQDSSVLVQR", + "SVQEGDSAVIK", + "SVQETVLPIK", + "SVQEYFVRK", + "SVQGFFLNH", + "SVQGIIIYR", + "SVQKEVEKNLK", + "SVQPEELIYQR", + "SVQRVTRSVK", + "SVQSASSTVKK", + "SVQSDQGYISR", + "SVQSSVLGK", + "SVQTADHRFLR", + "SVQTQPAIKK", + "SVQTSRLAK", + "SVQVFGRKK", + "SVQVPEFTPK", + "SVRLAPVYQK", + "SVSAPSKKVAK", + "SVSAVNLPK", + "SVSDFNYSR", + "SVSDIIVVAK", + "SVSDLAPPR", + "SVSDLAPPRK", + "SVSDLFNTK", + "SVSDLFNTKK", + "SVSDPVEDK", + "SVSEIGGKIFEK", + "SVSEVIEGY", + "SVSEVMKESK", + "SVSEVVVNR", + "SVSGYIYHK", + "SVSIPSITK", + "SVSKLSTPK", + "SVSLPSVKK", + "SVSLPVRKK", + "SVSNMVHTAK", + "SVSNVVITK", + "SVSPASAGKRK", + "SVSPASTLK", + "SVSPDTPVRK", + "SVSPGLPQR", + "SVSPIPAGSK", + "SVSPVVHVR", + "SVSQKLMAK", + "SVSQPIMVQR", + "SVSQPVAQK", + "SVSRSPVPEK", + "SVSSAPTLLK", + "SVSSDRIQK", + "SVSSLTVAR", + "SVSSPVKSK", + "SVSSQTITK", + "SVSSSSYRR", + "SVSSVSTLK", + "SVSTHLITK", + "SVSTITRIYR", + "SVSTPLIIK", + "SVSTQQPPK", + "SVSTQQPPKK", + "SVSTVLTSK", + "SVTGSAVSK", + "SVTGVTASK", + "SVTKTALNK", + "SVTSPIKMK", + "SVTTEPSSLK", + "SVVAVLVYK", + "SVVDISQQY", + "SVVEASEAAYK", + "SVVGDEVVLINR", + "SVVGELMYK", + "SVVGGLAVGK", + "SVVGNFQEK", + "SVVGTDGTPK", + "SVVMHSIQK", + "SVVNKMQQK", + "SVVNSFIEK", + "SVVQSGQLK", + "SVVSDILFK", + "SVVSSVTTK", + "SVVTGSEQK", + "SVVTPARVQFK", + "SVWHGTLSK", + "SVYAGAGGSGSR", + "SVYDDQPNAHKK", + "SVYDGEEHGR", + "SVYDHQGIFK", + "SVYDHQGIFKR", + "SVYDSVLQK", + "SVYEGKIFTQK", + "SVYEN(Deamidated)GLSQK", + "SVYEPFKVRK", + "SVYEQHESTPLR", + "SVYGEWVPVEK", + "SVYGYGVQK", + "SVYHISGKKK", + "SVYITLKK", + "SVYKEAIQK", + "SVYQIKVHRK", + "SVYRGSLTQR", + "SVYSDIVGK", + "SVYSETSNMDK", + "SVYSPESSVRK", + "SVYSPVKKK", + "SVYSWDIVVQR", + "SVYVDAVGQFLK", + "SVYVLVRQK", + "SVYVYKVLK", + "SVYYNEATGGK", + "SVYYPQVRK", + "SYANYFIRL", + "SYDHVELTF", + "SYDLANRDF", + "SYDPTIENTF", + "SYGDILHVI", + "SYGPVAYHL", + "SYIAAISARF", + "SYIDLLQRF", + "SYIDMDKELEF", + "SYIDVAVKL", + "SYIEHIFEI", + "SYIEVSHGL", + "SYIHYVFRL", + "SYINLNPRL", + "SYINYVITM", + "SYIPSTVFF", + "SYIRPEDIVNF", + "SYLAVHKRI", + "SYLDQFRQL", + "SYLDQVKLQF", + "SYLDRTEQL", + "SYLDSIHFF", + "SYLDSVHFF", + "SYLDVKGNHF", + "SYLDVKQRL", + "SYLERHGLINF", + "SYLESFYHM", + "SYLGSIARL", + "SYLKEFIHI", + "SYLKQLPHF", + "SYLNSVQRL", + "SYLPFTEAF", + "SYLPISPTF", + "SYLPLAHMF", + "SYLSRLQYF", + "SYLTIHHRI", + "SYLTVHKRI", + "SYM(Oxidation)GHFDLL", + "SYMGHFDLL", + "SYNNFFRM(Oxidation)F", + "SYNPLWLRI", + "SYPTFFPRF", + "SYQKVIELF", + "SYQKVMALW", + "SYQRAFNEF", + "SYSHIMALI", + "SYSHIQSK", + "SYSPQAFKF", + "SYSSTFHSL", + "SYTHIQYLF", + "SYVAGLPRF", + "SYVETELIF", + "SYVNHLYVI", + "SYVNKIKTRF", + "SYVNPDHLNYF", + "SYVQRVALEF", + "SYVQVTSNF", + "SYVRSLPFF", + "SYVTSPQGFQF", + "SYYETSKMKVLKF", + "TAAAALPAF", + "TAAAAVRQM", + "TAAAAVRQM(Oxidation)", + "TAADIFKQY", + "TAADTAVYY", + "TAAGLMHTF", + "TAAPGRFSF", + "TAAPVVPEL", + "TAARAWAL", + "TADHNLLLY", + "TADPSHQTM", + "TAEGQTIVY", + "TAEPGSAGATY", + "TAERGLIVY", + "TAFDVAEKY", + "TAFGHPQAY", + "TAFLHPEEF", + "TAFPDGRSSF", + "TAFPTTQ(Deamidated)RPWT", + "TAFQGMLRK", + "TAFRNKSMLFK", + "TAGSTSIPK", + "TAIDDMEAY", + "TAIGAHPVSM", + "TAIGMPVEK", + "TAIMEKHSM", + "TAIRALETY", + "TAIREAQTF", + "TAIREVYQY", + "TAIRSASAY", + "TALGAAQATAKA", + "TALPASPVAR", + "TAMDVVYAL", + "TAMDVVYALK", + "TAMPPGTAR", + "TAMSERALAQK", + "TANALALAM", + "TANDANTKY", + "TANDRILKY", + "TANEANPLK", + "TANSITVTF", + "TAPPARNR", + "TAREFEIDF", + "TARREDESY", + "TASAVVQHM", + "TASDFITKM", + "TASEMILVL", + "TASEPAVTY", + "TASPAAPAR", + "TASPPPPPK", + "TASPPRQK", + "TASSGHYIAY", + "TATAPPSPLK", + "TATATNHVL", + "TATEITESF", + "TAVIDHHNY", + "TAVKEDEINVY", + "TAVKIAPRY", + "TAVKNDYEM", + "TAVPTLLKY", + "TAVTTVPSM", + "TAWDEADVRF", + "TAYDRAYNR", + "TAYGPNGMNK", + "TAYPGQTQY", + "TDGNTSTTPPTSAK", + "TDHLSWEW", + "TDKSFVEK", + "TDQEEIKTL", + "TDVYVNNEW", + "TEADAEKTF", + "TEADAGHTEF", + "TEADVNPKAY", + "TEAEELRKLW", + "TEAEIDAHL", + "TEAEIDIRL", + "TEAESNMNDL", + "TEAETIQKL", + "TEAILKASW", + "TEAKIKQKL", + "TEALHFVAAAW", + "TEALPVKLI", + "TEALTSAKRY", + "TEAMLYEKF", + "TEAMRVIGF", + "TEANVVRKF", + "TEAPGGYKF", + "TEAPGNLRLY", + "TEAPLNPK", + "TEAQVEKQL", + "TEASELLRY", + "TEAYEKWREW", + "TEAYIAQRF", + "TEDDGRPIY", + "TEDDKAYAY", + "TEDEAIHKY", + "TEDEFKRLF", + "TEDENKQSF", + "TEDGKVEKHY", + "TEDGNQHVY", + "TEDIQTRQY", + "TEDQGMYKY", + "TEDTIKKSF", + "TEDTQGKKKW", + "TEEDFKRLF", + "TEEEFKKRAY", + "TEEEKNFKAF", + "TEEEMRKLF", + "TEEFNREMFW", + "TEEILEKAF", + "TEEILEKSF", + "TEEKTMKSF", + "TEELQRIKW", + "TEESPSGRGW", + "TEETHPVSW", + "TEFDDSLLRNF", + "TEFEDIKSGY", + "TEFEKNVWSF", + "TEFKVDSDDQW", + "TEFNGIRDY", + "TEFNKQKHL", + "TEFPIIKMY", + "TEFRNFIVW", + "TEFTPTEKDEY", + "TEGDTQLNW", + "TEGGEPYRLY", + "TEGPHVLLY", + "TEGPSPGDFRY", + "TEGRQDGHLW", + "TEGVIKVW", + "TEGVQSLNW", + "TEGVSDTNSKSW", + "TEHDLLGTEAW", + "TEHEPTKMFY", + "TEHFNNMSYW", + "TEHGDLGNSRF", + "TEHKSPDGRTY", + "TEHPKINEW", + "TEHQQLEGW", + "TEHSTVGLAQQW", + "TEHSVLIHEY", + "TEHYDIPKVSW", + "TEIAEERQY", + "TEIDARAGTF", + "TEIDDTKVF", + "TEIDEKEYI", + "TEIDGRSISLY", + "TEIDGRSISLYY", + "TEIDKPSQM", + "TEIEAEKSM", + "TEIEGTQKL", + "TEIELAKQI", + "TEIKVGVAY", + "TEIPGTKVF", + "TEIREKLAKMY", + "TEIRLRLHY", + "TEITDDLHFY", + "TEKELAEAASKW", + "TELDLYKKM", + "TELEDARQKF", + "TELERAFGYY", + "TELERKLTF", + "TELGRPVAESW", + "TELPKAEKW", + "TEMDSHEEKVF", + "TEMDSRTKSKDY", + "TEMDWVLKH", + "TEMESQKQL", + "TEMNGKNTFW", + "TENDIANFF", + "TENDIRVM(Oxidation)F", + "TENDIRVMF", + "TENDIYNFF", + "TENDKEYQEY", + "TENIDIKKY", + "TENKERKSF", + "TENNVGLKNAW", + "TENRFSVNF", + "TENSAKLHW", + "TENTEENRRF", + "TENTEENRRFY", + "TENTMRVTW", + "TEPALLQRW", + "TEQDLKEYF", + "TEQDSKDSTY", + "TEQSQIKGYVW", + "TEQWPYRTSW", + "TERDKQSKW", + "TESEAQRDMW", + "TESHHRKEAW", + "TESQQIRYF", + "TETDLRNHF", + "TETEIQKKA", + "TETETIAKY", + "TETQTAGVIDRW", + "TETTVKTAAW", + "TEVDARLSF", + "TEVDIKMKF", + "TEVDNYHFY", + "TEVDSRWQEY", + "TEVITGTLW", + "TEVLKNMGY", + "TEVLLSHLSY", + "TEVQVFKKY", + "TEVSLLRVGW", + "TEVSQKENY", + "TEVTGHRW", + "TEWQSGQRW", + "TEYLEERRI", + "TEYPVQRNY", + "TEYTPDPNHGF", + "TEYYDGKTRRY", + "TFDAGLQAF", + "TFDASRTTF", + "TFDDVAVTF", + "TFDLQLGRF", + "TFDLQRIGF", + "TFDNEIVMM", + "TFDSTIHF", + "TFDVAPSRL", + "TFDVAPSRLDF", + "TFDVSPKAV", + "TFEPGSYQF", + "TFLDDSGSLNW", + "TFLNIAEHF", + "TFLPTGLQF", + "TFMDRGFVF", + "TFPNIASATKF", + "TFVDNIQTAF", + "TFVPMLHRF", + "TGFEQNSTY", + "TGFSSLFLK", + "TGNPTVIKM", + "TGVSSSTNPFRPQK", + "TGWDESQANHF", + "TIAPALVSK", + "TIDDTISKFRR", + "TIDERAINKK", + "TIFGKIIRK", + "TIFGNFLEK", + "TIGADLHF", + "TIISEQQAKSLLK", + "TIM(Oxidation)PKDIQLAR", + "TIMPKDIQLAR", + "TIMSSSMGK", + "TIQSGEQPYK", + "TISPPLQPK", + "TITPVVGKK", + "TIYNAAIQK", + "TIYSEADLRKK", + "TLFIPENSFRK", + "TLFYLGKRK", + "TLLDKYWTK", + "TLMGPIVMK", + "TLPNTIYRF", + "TLQ(Deamidated)PTPALTY", + "TMAPPIKSK", + "TMLGKFYHF", + "TMMGQQVAK", + "TNFEDRNAF", + "TPAEIREEF", + "TPAEPTPGY", + "TPAEPVQYY", + "TPAGAAVSAM", + "TPAGVVNKY", + "TPALVNAAVTY", + "TPAPPGPATM", + "TPAPPTHAL", + "TPARDYNNSY", + "TPASPQPFY", + "TPATWKQEY", + "TPDAMKAAM", + "TPDETKLKM", + "TPDPSRSVF", + "TPDPTRPLTF", + "TPEEDQRTY", + "TPEEGGYSY", + "TPEEKIREY", + "TPEQQAAIL", + "TPETRGTAYVVY", + "TPFKGGTLF", + "TPFLGQHGFNF", + "TPFQQPSGY", + "TPFRNFEEF", + "TPFVDPRVY", + "TPGGTRIIY", + "TPGPPPISY", + "TPHDFIEHF", + "TPHGDYIEF", + "TPHSYIDTY", + "TPIDSNIAF", + "TPIEGKN(Deamidated)MSF", + "TPIKDGILY", + "TPINQN(Deamidated)VSL", + "TPIQSKEAY", + "TPISITSSY", + "TPLEEAIKF", + "TPLHLVALY", + "TPLHMAIAY", + "TPLPEDNSM", + "TPLQNNLIEY", + "TPLSSTVTL", + "TPLVDPSVY", + "TPNEERNVM", + "TPNEERNVM(Oxidation)", + "TPRATTESF", + "TPSEPHPVL", + "TPSGPVEAF", + "TPSHAMKITY", + "TPSQPLPTY", + "TPSSDVLVF", + "TPSSVIYHL", + "TPTGAISQY", + "TPTGIKVVM", + "TPTLPSITY", + "TPTPFFHTF", + "TPTRASPQL", + "TPTVIAVHY", + "TPVDDPM(Oxidation)SLLY", + "TPVDDPMSL", + "TPVDDPMSLLY", + "TPVDLNKHLY", + "TPVDSDIGSHL", + "TPVFGKGVAY", + "TPVFSKARY", + "TPVKDLVKY", + "TPVPDGKNAM", + "TPVTEFSLNTY", + "TPWPAQPQRTF", + "TPYDLPGNLLRY", + "TPYEEGLHSVDVTY", + "TPYEGQRSY", + "TPYEYPYTL", + "TPYKGGNLY", + "TQATIYVHK", + "TQEKNPLPSK", + "TQFNYHRKK", + "TQHIQQPRK", + "TQLNKFYTK", + "TQREKLTF", + "TQVAVSVPK", + "TSAFMPVLK", + "TSALPIIQK", + "TSAPAAKPK", + "TSFDGSLIQK", + "TSFSEALLK", + "TSFSGITKK", + "TSGPPTISK", + "TSGPTTPLK", + "TSGPVTTSK", + "TSIQPGAPK", + "TSLDKFYRK", + "TSLKFFLNK", + "TSLKSIMKK", + "TSLSVSTPK", + "TSNPVTTTK", + "TSQPFQVLK", + "TSQRIFITY", + "TSSAVTSVAK", + "TSTASTFVK", + "TSTTPPTSAK", + "TSVGYAIFK", + "TSWRDGMAF", + "TSYSSINTPK", + "TTAAPSPPR", + "TTAAVGVLK", + "TTADFRTKK", + "TTAEGMAKK", + "TTAPPSSPK", + "TTAPSLSGK", + "TTAPVVSTR", + "TTAQLQVQK", + "TTASQTNIKK", + "TTASTLSLVNK", + "TTATATPSK", + "TTATFAATK", + "TTATPTIMK", + "TTDPGASSLGK", + "TTDQSVASVRK", + "TTDRYIQQK", + "TTDRYVQQK", + "TTEGQVQVLK", + "TTEGRNALIHK", + "TTFGPKSQRK", + "TTFGTATYK", + "TTFPESHLR", + "TTFTKIVNK", + "TTGEPATPK", + "TTGQVVAMK", + "TTHQVYVLK", + "TTIAGVVYK", + "TTISAEKVKKK", + "TTITSHFAK", + "TTKKPPLAQK", + "TTLAFKPIKK", + "TTLGHAVLK", + "TTLPPPLFSK", + "TTLSSIRSK", + "TTMLLRIKK", + "TTMQALAEK", + "TTNDIVISK", + "TTNLSIQQK", + "TTQAPSLQK", + "TTQDPLSNK", + "TTQEVQVGQK", + "TTQGVDMISKMLK", + "TTQLSLSFK", + "TTQQQLPQK", + "TTSDFYFEK", + "TTSIPSTPK", + "TTSSSMWKK", + "TTSVITIVK", + "TTTGHLIYK", + "TTTGVDPVAK", + "TTTTTHITK", + "TTVDIFHKK", + "TTVGVDGSLYK", + "TTVPEEELNPK", + "TTVPHVFSK", + "TTYKYEMINK", + "TVAAGTMTGMLYK", + "TVADTTLTK", + "TVAEISQFLK", + "TVAEITGSKY", + "TVAEVVETM", + "TVAGLALIK", + "TVAGVHVK", + "TVAHKIMQK", + "TVAPTTANK", + "TVAQITQRF", + "TVATFILQK", + "TVAVPLVGK", + "TVAVPLVGKL", + "TVDEKNYTK", + "TVDKNMPKFNK", + "TVDPKYHPK", + "TVDPNKRLK", + "TVEDVIVRK", + "TVFDAKRLIGR", + "TVFDTNIQTSAK", + "TVFEHTFHV", + "TVFENLINK", + "TVFLSTWNK", + "TVFWNSSNPK", + "TVGDVLEAK", + "TVGPVLSIR", + "TVHGVTQAF", + "TVIDEVRTGTY", + "TVIDSQTHYR", + "TVIHFNNPK", + "TVIKLAILY", + "TVILPIKKK", + "TVIQDGIKK", + "TVIQSTQGMYK", + "TVIRDVEQQFK", + "TVIRFVTNK", + "TVISLLVYK", + "TVITVDTKAAGK", + "TVLHRIYGK", + "TVLKEIFAK", + "TVLQYVVGR", + "TVLRPSLGK", + "TVLSSWIAK", + "TVMELVKIIYK", + "TVMNGALVK", + "TVMNIAEHY", + "TVMTWARSK", + "TVN(Deamidated)STRETPPK", + "TVNNIIQVK", + "TVNPKESILK", + "TVNPVAIHK", + "TVNSPAIYK", + "TVNTMNLPK", + "TVNTSLVGK", + "TVQDGRQFLK", + "TVQEHLIEK", + "TVQEKTFNK", + "TVQELAIYK", + "TVQGPSSTK", + "TVQNIYSAK", + "TVQQHPSTPK", + "TVQTTEDQILK", + "TVQTVPLRK", + "TVQVYIITK", + "TVREQDQSF", + "TVRQIQEEM", + "TVSADPVVK", + "TVSATSPNK", + "TVSDAILRY", + "TVSEPAVIK", + "TVSETFMSK", + "TVSEVIQGLLK", + "TVSGIQVRY", + "TVSKFMAIQK", + "TVSPFAVQK", + "TVSPKSFAK", + "TVSRIQSPK", + "TVSRPIVVSK", + "TVSSVNNPR", + "TVTAQILLK", + "TVTEVLLKY", + "TVTKPVPVTK", + "TVTQAILKK", + "TVVDQTTLMKK", + "TVVDVLTSY", + "TVVSYIMQR", + "TVYEEMMAK", + "TVYFKEGKYK", + "TVYNLKAHMK", + "TVYRGLVQK", + "TVYRNPESFK", + "TVYVDVLK", + "TWDPALAQI", + "TWLVNSAAHLF", + "TWTEVSYTF", + "TYAPAIHQI", + "TYARNLPAF", + "TYDNVHQQF", + "TYDPTYSDF", + "TYEPGFVGIRF", + "TYFEKNFNL", + "TYFRFQEEI", + "TYGEIFEKF", + "TYGPSFPAF", + "TYHGSFSTK", + "TYHPGVPVF", + "TYIDKSTQL", + "TYIGQGYII", + "TYIKSPPFF", + "TYIPVPAKI", + "TYIQKIFRM", + "TYIQNFRFF", + "TYISKTIAL", + "TYISWKEEL", + "TYITERIIAVSF", + "TYITSVSRL", + "TYLDKIKKF", + "TYLDKVENI", + "TYLDQVKIRF", + "TYLEKAIKI", + "TYLEKFQNL", + "TYLKAVKLF", + "TYLKIARLYL", + "TYLNWLVRM(Oxidation)", + "TYLPAGQSVLL", + "TYLPAPEGLKF", + "TYLPQSYLI", + "TYLPTSPLL", + "TYLRKIPRF", + "TYM(Oxidation)KDLYQL", + "TYMGHTGAVW", + "TYMKDLYQL", + "TYNKVLHFF", + "TYNPNMPFKW", + "TYNRIINQI", + "TYPEGLEVLHF", + "TYPIKTPTF", + "TYPQLEGFKF", + "TYQDIQNTI", + "TYQEVAQKF", + "TYQHVPVESF", + "TYQRWQFTL", + "TYRNVMEQF", + "TYSMKYFK", + "TYSPAFKQF", + "TYSYSFFHF", + "TYTDKLFKF", + "TYTDRVFFL", + "TYVDSSHTI", + "TYVEVWNDF", + "TYVRWYTQL", + "TYVSGMLRF", + "TYVSGTLRF", + "TYVSSFYHAF", + "TYVTEVREL", + "TYVTILPEL", + "TYVYFTNEL", + "TYYRGFLTL", + "VAAEKSFNK", + "VAAKPVATK", + "VADGYPVRL", + "VADPYVVIM", + "VAIKAMAK", + "VAIQAVLSL", + "VANAIIHLF", + "VANKEYVAY", + "VAPSRLDF", + "VAQRDPIIAK", + "VAQSTRIIY", + "VAVALMYRL", + "VAVFDRGD", + "VAWSN(Deamidated)KSDF", + "VAYGVAVNK", + "VAYHQPTLK", + "VDASIFKAW", + "VDYKADEW", + "VEADDVRAW", + "VEAESEQKW", + "VEAGGLLEKW", + "VEDELVKKY", + "VEDKTDVRKW", + "VEELFERKY", + "VEFQEAQAY", + "VEHDFIMATY", + "VEHNGYAW", + "VEHTNTGTKW", + "VEHTPDGVKW", + "VEHVSRLLW", + "VEHYDPTINKW", + "VEIAIKRADW", + "VEIQFPAEHGW", + "VELGTQPAT", + "VELGTQPATQ", + "VELRILTNW", + "VEMDIVEKL", + "VEMMDQIVHW", + "VEMYDPTRNEW", + "VENGGVTRW", + "VENILAKRL", + "VENKEVLHGKKW", + "VENNLILKM", + "VENNPAIKW", + "VENVPPLRW", + "VEQGIDAKW", + "VESVVIKNL", + "VETRVFLQY", + "VEVAEESGRLW", + "VEVEGDNRY", + "VEVGDRTSW", + "VEVKHGDTW", + "VEVPFDLHRY", + "VEVQDSIHRW", + "VEVSPATERQW", + "VEYEDESGHRY", + "VFADVETHF", + "VFAGVFNTF", + "VFDEAIRAV", + "VFDEAIRAVL", + "VFDEAVRV", + "VFDERAANF", + "VFDIHVIDF", + "VFDIHVVYV", + "VFDKTLAEL", + "VFDLSEKL", + "VFDNSIKTF", + "VFDPHGTL", + "VFDPIGHF", + "VFDPKVFTF", + "VFDPVPVGV", + "VFDPVQKTL", + "VFDPVTKL", + "VFDTAIAHL", + "VFDTSIAQL", + "VFDVSHNAV", + "VFEKTKRLLF", + "VFESWMHHW", + "VFFKGFKW", + "VFHAHSSVLNF", + "VFHESIPEW", + "VFHVVTGLRW", + "VFIDHPVHL", + "VFIDKQTNL", + "VFIGHALQW", + "VFIGRYYT", + "VFIGRYYTVF", + "VFIGTGHLL", + "VFIHKDKGFGF", + "VFIKYLPEW", + "VFINKGKGFGF", + "VFINVPTVSF", + "VFIPYRESVLTW", + "VFLEVSQHW", + "VFLNLHTLKF", + "VFLNRAKAVFF", + "VFLPDQGAFF", + "VFLPGFYHL", + "VFLPREDHLF", + "VFLPSTPGL", + "VFLRAINKF", + "VFMKSVKLEW", + "VFN(Deamidated)QTVTVI", + "VFNDVRLLL", + "VFPDKGYSF", + "VFPEKGYSF", + "VFPKEPVEL", + "VFPKPLITRF", + "VFPRLHNVLF", + "VFSTVVIHF", + "VFTEVANLF", + "VFTGVVTKL", + "VFTKIRLVL", + "VFVDSVPEF", + "VFVNTHHIL", + "VFVPYRDSVLTW", + "VFYPYPQYF", + "VGGSTRIPK", + "VGSTSENITQK", + "VGVNLPQK", + "VGVPRSIAANMTF", + "VHFPMVVY", + "VHLTPEEK", + "VIAESVVKK", + "VIDEPVRL", + "VIDPGFAK", + "VIDSQELSK", + "VIFDETLQK", + "VIFKDFVNK", + "VIFTGGVGK", + "VIKNKTWKF", + "VILPPLSPYFK", + "VIMNSLITK", + "VINFKKIYK", + "VIQDPMGQK", + "VISPPTVPK", + "VIVLVENFYK", + "VIYEKTIRK", + "VIYFPPLQK", + "VIYNEQMASK", + "VIYPLAVPK", + "VIYPYVYEK", + "VIYSTPLPEK", + "VKAIIYQY", + "VLAPEGSVPNK", + "VLAPVIDLK", + "VLFAGQHIAK", + "VLGPTPVQK", + "VLLPKLPQF", + "VLPNIHPEL", + "VLPSSLPTF", + "VLQAADILLYK", + "VLSPADKTNVK", + "VLVKAEYY", + "VLYAKVHMK", + "VLYEGIKVGK", + "VLYENPNLK", + "VM(Oxidation)APRTLLL", + "VM(Oxidation)APRTVLL", + "VM(Oxidation)LGTQLLYKF", + "VMAPRTLLL", + "VMAPRTVLL", + "VMKSLTQTF", + "VMLGTQLLYKF", + "VMRDPASK", + "VMRDPNTK", + "VMRDPQTK", + "VNGKVLSK", + "VNSSDMLK", + "VNVDEVGGEALGR", + "VPADAVVQY", + "VPAEHQVAM", + "VPASLPVDF", + "VPASLPVEF", + "VPDAKIRIF", + "VPDLVHVM", + "VPDSSGPERIL", + "VPEEGGATHVY", + "VPEHSPVVY", + "VPESSLAGHSF", + "VPFESEDNQGIVY", + "VPFHSDLGY", + "VPFIYGHKY", + "VPFLPVNPEY", + "VPGPTGLHY", + "VPHNPAPPM", + "VPHNYGLVLY", + "VPHRATVY", + "VPHSIINGY", + "VPHSLETLY", + "VPIPDVYQTY", + "VPIPTVNQY", + "VPIQPFGISY", + "VPKRDVERY", + "VPLDERIVF", + "VPLGHVDAIEY", + "VPLKGIVSY", + "VPLQRVDVM", + "VPLSEPVTM", + "VPMDGRNAY", + "VPMGGMMVRQSF", + "VPMPYTLKVHY", + "VPNPDPVTM", + "VPNSNPPEY", + "VPPEVAQQY", + "VPPVFVVSY", + "VPRDQDFQENY", + "VPRIQLEEY", + "VPRSGEVY", + "VPSDVQKVQY", + "VPSPAQIMY", + "VPSSAELHY", + "VPSSELQIY", + "VPTDEARAF", + "VPTSVKDMRY", + "VPVAKTAEL", + "VPVDLQHQF", + "VPVDVVVNM", + "VPVEEPIAF", + "VPVEEQEEF", + "VPVEGDEVTY", + "VPVMTQPTLIY", + "VPVPPLPEY", + "VPVPPNVAF", + "VPVSVVSDSY", + "VPVVVIDSY", + "VPVWIIHYY", + "VPWHEEVVQF", + "VPWLSSVRY", + "VPYPDDLVGF", + "VPYPDITNF", + "VPYRIFPY", + "VQ(Deamidated)RGN(Deamidated)ILNL", + "VQGVISVPK", + "VQPKQDAFANF", + "VQPRNWLLFA", + "VQPSKYHFL", + "VQPSLFYHL", + "VQRTLLEK", + "VSAPNIAMK", + "VSDPSSPQYGK", + "VSEGTKAVTK", + "VSEYQQYQDATAE", + "VSFGESVLK", + "VSFPAGKFTIK", + "VSFPIGIYK", + "VSFSDVFFK", + "VSKGSAFSTSISK", + "VSLDYAISK", + "VSLGLAVSK", + "VSLGTPIMK", + "VSLWLPVSK", + "VSMDNSNKYTK", + "VSMDYAISK", + "VSMFVEVHK", + "VSMPDVDLNLK", + "VSNQVAVNMYK", + "VSQEPFPNK", + "VSSPKLAPK", + "VSSSPTSSPK", + "VSSTPVPQR", + "VSSWLPLAK", + "VSTVLTSKYR", + "VSYSHIQSK", + "VSYVEVVKK", + "VTAEAVAVLK", + "VTAKELSLVNK", + "VTAPIALLK", + "VTAPPARNR", + "VTATQLIQK", + "VTAVPTLLK", + "VTDDSPPSKK", + "VTDKGSFEK", + "VTDNGSPPK", + "VTDPETHKSTK", + "VTDPSIPIRK", + "VTDPSIPIRKK", + "VTDSPRILK", + "VTEGSFVYK", + "VTEKVLAAVYK", + "VTESQTYKK", + "VTFRPLFFK", + "VTFVPGLYK", + "VTGPNMGGK", + "VTGPSQISK", + "VTGRFNGQFK", + "VTGSWDQTVK", + "VTHRPPLSPK", + "VTIEHARAR", + "VTIFIRGGNK", + "VTIIFIYEK", + "VTIKEGSQLK", + "VTISHAIGR", + "VTISSVEKK", + "VTITNDGATILK", + "VTKDPNWYK", + "VTKYTSSK", + "VTLELAVYK", + "VTLGTQGSPITK", + "VTLHDMILK", + "VTLPYFHSF", + "VTLSWKPVQK", + "VTLTTQHVK", + "VTMKEILLK", + "VTMNTPVEK", + "VTMPATETK", + "VTMPATETKK", + "VTNDFVMLK", + "VTNDGATILK", + "VTNNAEKEMVK", + "VTNNVIRLK", + "VTNPDIAAK", + "VTNQPVTPK", + "VTNVTSLLK", + "VTNWDDMEK", + "VTQDFMMYR", + "VTQDTENELK", + "VTQNGGLYK", + "VTQPSNTYK", + "VTQSEIAQK", + "VTQSEIAQKQK", + "VTQSEIGQK", + "VTSEVPFSK", + "VTSMSTQTK", + "VTSQFISKK", + "VTSQVSNLK", + "VTSSVSTLK", + "VTSTFIIEK", + "VTTEPSSLK", + "VTTGGMVLK", + "VTTGSEGLLK", + "VTTTVTGAK", + "VTVDGHLIRK", + "VTVDPKYHPK", + "VTVGVDGTLYK", + "VTVKGPILK", + "VTVQEMVTK", + "VTVSGGTPK", + "VTYDLIKDALLK", + "VTYEHLITK", + "VTYKENIAK", + "VTYN(Deamidated)GVDNNK", + "VTYTEHAKR", + "VTYYHYFSK", + "VVAAGGVEK", + "VVAAVIWRK", + "VVAAVMWRK", + "VVAGVANALAHK", + "VVAGVANALAHKYH", + "VVAPPGAPK", + "VVCEYIVKK", + "VVDAHVREK", + "VVDAKTLKK", + "VVDDSQLPK", + "VVDEHTGQYVK", + "VVDEKISAMGK", + "VVDENAVAK", + "VVDENNMNK", + "VVDGLEKAIYK", + "VVDIPFRSK", + "VVDQTTLMK", + "VVEGSFVYK", + "VVEKPQPKK", + "VVFAVKQYISK", + "VVFDDSEPVQK", + "VVFDSIESAKK", + "VVFDTSLQVKK", + "VVFGSRNPQK", + "VVFITPNPLSK", + "VVFRDPYRFK", + "VVFRDPYRFKK", + "VVFVGVKYVNK", + "VVFVIDPGFAK", + "VVGAVVFQK", + "VVGLPNVGK", + "VVGPELHHK", + "VVGPVSLPR", + "VVGPWIQTK", + "VVIAMSGISK", + "VVINFDFPK", + "VVINVNNILK", + "VVINYSIVK", + "VVLDQTGVSK", + "VVLEKAMHK", + "VVLGNIIKK", + "VVLGSGGVGK", + "VVLPYLVPK", + "VVLTSGIPK", + "VVLYPLVAK", + "VVM(Oxidation)RDPNTK", + "VVM(Oxidation)RDPQTK", + "VVMAADRSLK", + "VVMAADRSLKK", + "VVMADPKGK", + "VVMENVGQQK", + "VVMGKQQSK", + "VVMGKQQSKLK", + "VVMKASSSLPK", + "VVMRDPASK", + "VVMRDPNTK", + "VVMRDPQTK", + "VVMTPVPLFSK", + "VVMVNQGLTK", + "VVMYVQKKK", + "VVNGKVEYFLK", + "VVNKVPLTGK", + "VVNSPHRQYK", + "VVQDGITLITK", + "VVQDHSALFK", + "VVQDMLVPMK", + "VVQEPGQVFK", + "VVQNGFFAHK", + "VVQPSGTSK", + "VVQQQKLKK", + "VVQSVEKFIQK", + "VVSEKQFSK", + "VVSENQRLK", + "VVSETISSK", + "VVSGAANVIGPK", + "VVSPIPANK", + "VVSPSSFENVK", + "VVSSSIVDK", + "VVSVILEQK", + "VVTEHLINK", + "VVTESQTYK", + "VVTGPSASK", + "VVVASTVQK", + "VVVDEADTMLK", + "VVVDPIQSVK", + "VVVGVYRPPPK", + "VVVKLFSEK", + "VVVKPEKTEK", + "VVVPPLPGK", + "VVVVNPQTK", + "VVYEAVIRK", + "VVYPWTQRF", + "VVYQYWNTK", + "VVYSGLENIKK", + "VVYTSHLQLK", + "VVYVGGILTK", + "VVYWLYMKK", + "VWDTKEVQM", + "VWDVGSHF", + "VWIRNIQLGF", + "VWLEEELKTF", + "VWLRAQLGW", + "VWLRLRKILF", + "VWNPRTHQF", + "VWSDVTPLTF", + "VWSNVTPLKF", + "VWYPGKPLKV", + "VYADQPHIF", + "VYADYHTHF", + "VYAEVSRLLL", + "VYAHIYHQHF", + "VYAILTHGI", + "VYAQVARLF", + "VYAVIPAEKF", + "VYDIAAKF", + "VYDLLKTNL", + "VYDLSIRGF", + "VYDTNPAKF", + "VYDTVFKHF", + "VYDVAMKL", + "VYDVVELKF", + "VYEDLRGSVTF", + "VYEDLRYKL", + "VYEEILHQI", + "VYEGPELNHAF", + "VYEPVSYHV", + "VYERELQTF", + "VYEYVVERF", + "VYFPDQHINF", + "VYGFQWRHF", + "VYGFVREAL", + "VYGKVKALKF", + "VYGPLPQSF", + "VYGWTQHKF", + "VYHILKVLF", + "VYHNMPLIW", + "VYHSDIPKW", + "VYIAELEKI", + "VYIDKVRSL", + "VYIDQTMVL", + "VYIDRVRSL", + "VYIEAAIRF", + "VYIEHRLMM", + "VYIESRIGTSTSF", + "VYIHGGGWAL", + "VYIHHFDRI", + "VYIHPSSALF", + "VYIKHPVSL", + "VYINTAQEF", + "VYIPMSPGAHHF", + "VYIPNKVLI", + "VYIRGSKIRF", + "VYISEHEHF", + "VYISKTTYI", + "VYISNGQVL", + "VYISSSAGARW", + "VYITDKTVL", + "VYITGKEVFSF", + "VYITNFHVRM", + "VYITNYRLYL", + "VYITRAQLM", + "VYKKSIFVF", + "VYKTIMEQF", + "VYKVPPFTF", + "VYLAAVNRL", + "VYLDGIVRI", + "VYLDHAGAT", + "VYLDHAGATLF", + "VYLDKFIRL", + "VYLDRGTGNVSF", + "VYLDYEAGRLGF", + "VYLEKFMTF", + "VYLGHVIYL", + "VYLHDFQRF", + "VYLHLRQTW", + "VYLKPSYAF", + "VYLPEAMPASF", + "VYLPLTSHI", + "VYLPNINKI", + "VYLPPEAFTF", + "VYLPTHTSL", + "VYLQNWSHVL", + "VYLTIKPLNL", + "VYM(Oxidation)DWYEKF", + "VYMAFKDRF", + "VYMDWYEKF", + "VYMNVMTRL", + "VYNENLVHMI", + "VYNKVHITL", + "VYNPVRAEW", + "VYNSEYYHF", + "VYPDGIRHI", + "VYPEKLATKF", + "VYPERTPLL", + "VYPHPGTWESF", + "VYPLMKEYF", + "VYPPIRHHL", + "VYPSSLSKI", + "VYPVITARL", + "VYPYKLYRL", + "VYQDYHTVW", + "VYQHLFTRI", + "VYQKLLERM", + "VYQNHVQHL", + "VYSEAARVLQF", + "VYSEKVMHMF", + "VYSEVAAYEF", + "VYSEVHFTL", + "VYSHVIQKL", + "VYSKDNPNLLF", + "VYSLQQFGF", + "VYSPHVLNL", + "VYSPKSPSL", + "VYSQFITQL", + "VYSQIPAAVKL", + "VYSRTFTW", + "VYSRTFTWL", + "VYTDFAFRI", + "VYTDYVATRW", + "VYTHNLYYL", + "VYTKANPTF", + "VYTKTISLW", + "VYTN(Deamidated)ISHHF", + "VYTSGIYNI", + "VYTSGVYHI", + "VYTSWQIPQKF", + "VYTTMAEHF", + "VYTTTVHWL", + "VYTVHHMVW", + "VYTVHHVVW", + "VYTVVDEMF", + "VYTYIQSRF", + "VYVAGAPRF", + "VYVAIQAVL", + "VYVATRPTI", + "VYVATRPTITE", + "VYVDKVEKM", + "VYVDLGGSHVF", + "VYVGFQVQL", + "VYVGSGGWRF", + "VYVKDLSSF", + "VYVKHSISF", + "VYVPFGGKSMITF", + "VYVPHIHVW", + "VYVPSVRGSKF", + "VYVQHPITF", + "VYVQNVVKL", + "VYVQPPLEL", + "VYVSRPSHF", + "VYVTERIIAVSF", + "VYVVGTAHF", + "VYWDSAGAAHF", + "WDTNDEQGLN", + "WENGFVKKF", + "WENPRVLSF", + "WEQGFSQSF", + "WEVDVQGSKAY", + "WEVDVTGKEAW", + "WEVEVGDRTSW", + "WIASHTTEE", + "WPAEMRVGVY", + "WPAQSIQDDIHLY", + "WPDDLQNHTF", + "WPEEGNVHFF", + "WPVDLVEKL", + "WPVGGDSRFVF", + "WQRDGEDQTQDTEL", + "WSTGGQVSRASQ", + "WSVDPLDR", + "WSVDPLDRAM", + "WSVDPLDRAMAE", + "WYDPKVTRV", + "WYQTKFETL", + "YADPVNAHY", + "YALDYAQRY", + "YALGERQSY", + "YAMKAEVL", + "YASGRTTG", + "YASGRTTGIVL", + "YASGRTTGIVM", + "YAYDEDGTRF", + "YDEIKKYT", + "YDESGPSIVHRK", + "YECN(Deamidated)ECGKGF", + "YEDQVGKFDW", + "YEFDEQGHSTW", + "YEILLGKATLY", + "YEIQDIYENSW", + "YELDAKQGRW", + "YELPTNTQW", + "YEMEVSQRL", + "YENPTYKFF", + "YESDPVKAW", + "YEVEIDGKTY", + "YFDEPVEL", + "YFDPANGKF", + "YFDSGDYNM", + "YFHEALRAF", + "YFIADLPHL", + "YFIDSTNLKTHF", + "YFINRSWEW", + "YFKDTHPKF", + "YFN(Deamidated)DTAQVF", + "YFVN(Deamidated)VTTRI", + "YGFQEKEAF", + "YIFKERESF", + "YIKHPVSL", + "YILSPLSYK", + "YISEHEHF", + "YIYDGELVSK", + "YNEFPEPIKL", + "YNRGDSTFESKSYK", + "YPADKISILTTY", + "YPAEITLTW", + "YPAEVTITW", + "YPAHMYQVY", + "YPAQGVQQF", + "YPATGADVAF", + "YPATTPTGM", + "YPDENGFDAF", + "YPDEYHGEY", + "YPDPVSIIQKY", + "YPDRIM(Oxidation)NTF", + "YPDRIMNTF", + "YPEDVAEEL", + "YPENGVVQM", + "YPFDGHNEGTL", + "YPFDSPQVMF", + "YPFHDSDPSALF", + "YPFHKQPPTY", + "YPFKPPKITF", + "YPFKPPKVAF", + "YPFKPPKVTF", + "YPFQVVHDNY", + "YPFRVGELEY", + "YPFSSEQKW", + "YPFTGDHKQKF", + "YPGQPHPAL", + "YPGQPPVTY", + "YPGSHGITAM", + "YPHNGMIDL", + "YPKANIVAY", + "YPLDPTTEHIY", + "YPLEAVRM", + "YPLEGSRSY", + "YPLPRGEKY", + "YPLSIEPIGVRF", + "YPMPGPSGGDFDTY", + "YPMPTGYSQ", + "YPNGPDYQLHNY", + "YPNGVVVHY", + "YPNSGSVSAY", + "YPNVNIHNF", + "YPQPPSQSY", + "YPQPSYNQY", + "YPQQIEPSF", + "YPRLEGTDPEVLY", + "YPRSDVDLY", + "YPSDIAVEW", + "YPSETTVKY", + "YPSKSILL", + "YPSRAVITTM", + "YPSSSRTPQ", + "YPTEDYKVY", + "YPTQPGQGY", + "YPVDLGDKF", + "YPVEHPDKF", + "YPVEIHEY", + "YPVEIHEYL", + "YPVHAQMPSL", + "YPYDGIHPDDLSF", + "YPYEHSYGL", + "YQ(Deamidated)PQYQQ(Deamidated)Y", + "YQDTYGQQWK", + "YQKVVAGVAN", + "YQQYQDATAE", + "YQQYQDATAEE", + "YQQYQDATAEEEGE", + "YRALTVPELTQQM", + "YRALTVPELTQQV", + "YRLYMAED", + "YRSSPTVY", + "YSMPSTHAM", + "YTAPPLQSK", + "YTFDWTMLK", + "YTKKLNTQ", + "YTLDQTYAK", + "YTPITPHL", + "YTYEHDPITK", + "YVHDDGRVSY", + "YVHMVTHF", + "YVLDVLVRA", + "YVTTSTRTY", + "YWMHVQNTF", + "YYAKEIHKF", + "YYDDLKYRYF", + "YYDGKVMKL", + "YYDKHFTEF", + "YYDLARAHL", + "YYDNADKL", + "YYDPKHVIF", + "YYDVAKQLL", + "YYDVGARV", + "YYEEQHPEL", + "YYEHEFVEL", + "YYEHVKARF", + "YYEKQFPEI", + "YYFEGIKQTF", + "YYFPVKNVI", + "YYIDADLLREI", + "YYIDKLEYL", + "YYIDRINSM", + "YYIFIPSKF", + "YYISPRLTF", + "YYITGNLETF", + "YYITTRAQF", + "YYITTRVQF", + "YYLDWIHHY", + "YYLNDLERI", + "YYLNEIQSF", + "YYLQGGFNKF", + "YYLQHPPISF", + "YYLTHGLYL", + "YYMKDLPTSF", + "YYNGKWEFL", + "YYPEYKLLF", + "YYPRVEYGF", + "YYPSTPGRYSI", + "YYQHIVTTL", + "YYRPRFFLL", + "YYSIISHTL", + "YYSNLHQTF", + "YYSPHGHILVL", + "YYTDIMHTL", + "YYTKGFALL", + "YYTPITPHL", + "YYVRAVLHL" + ] + ] + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-04-13T12:22:25.492967052" + } +} \ No newline at end of file From b29d28d87506258960236bb6f697e4390367004d Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Mon, 13 Apr 2026 14:20:11 +0000 Subject: [PATCH 098/104] Align test_sdrf.config resource limits with other test configs --- conf/test_sdrf.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/test_sdrf.config b/conf/test_sdrf.config index 759bc37e..587a4b11 100644 --- a/conf/test_sdrf.config +++ b/conf/test_sdrf.config @@ -14,9 +14,9 @@ process { resourceLimits = [ - cpus: 6, - memory: '24.GB', - time: '3.h' + cpus: 2, + memory: '6.GB', + time: '2.h' ] } From 60ac195637bd968f632f08ee10948a051138a2fb Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Tue, 14 Apr 2026 12:06:28 +0000 Subject: [PATCH 099/104] Use 500-protein fasta subset and spectrum_batch_size=20000 in test_sdrf --- conf/test_sdrf.config | 5 +- tests/sdrf.nf.test.snap | 8038 +-------------------------------------- 2 files changed, 10 insertions(+), 8033 deletions(-) diff --git a/conf/test_sdrf.config b/conf/test_sdrf.config index 587a4b11..0b8a98ac 100644 --- a/conf/test_sdrf.config +++ b/conf/test_sdrf.config @@ -26,5 +26,8 @@ params { // Input data input = params.pipelines_testdata_base_path + 'mhcquant/testdata/PXD009752.sdrf.tsv' - fasta = params.pipelines_testdata_base_path + 'mhcquant/testdata/UP000005640_9606.fasta' + fasta = params.pipelines_testdata_base_path + 'mhcquant/testdata/UP000005640_9606_500prot.fasta' + + // Batch spectra during Comet search to fit within CI memory limits + spectrum_batch_size = 20000 } diff --git a/tests/sdrf.nf.test.snap b/tests/sdrf.nf.test.snap index 9bb29f5a..62f0e828 100644 --- a/tests/sdrf.nf.test.snap +++ b/tests/sdrf.nf.test.snap @@ -136,8135 +136,109 @@ [ "lc2_1.tsv", [ - "AAAAAAQSVY", - "AAAEASLNK", - "AAAKPVATK", - "AAALFTIHK", - "AAAPHTVSY", - "AAAPPQEQK", - "AAAPPTRAP", - "AADDKQPYEK", - "AAFDGGFTVK", - "AAFGGTFKK", - "AAIGLVIYY", - "AAISLAFSK", - "AAIVAYGLYK", - "AAKPTPPK", - "AALAKAIEK", - "AALDWVTKK", - "AALEKDYEEVGVD", - "AALEKPLSH", - "AALIPLVVK", - "AALPYPLKKK", - "AAM(Oxidation)LDTVVFK", - "AAM(Oxidation)QDPEVM", - "AAMEEKKVVQK", - "AAMLDTVVFK", - "AAMNMGRPFQK", - "AAMPGFIAK", - "AAMQDPEVM", - "AAMQDPEVMVA", - "AAPEKPLAGK", - "AAPGAEFAPNK", - "AAQDSTDLVAK", - "AAQESGTIPK", - "AAQESGTIPKK", - "AAQPPAPPR", - "AASSSSLEK", - "AASTPLASK", - "AATMCN(Deamidated)LCQR", - "AAVDFQFSK", - "AAVGYIMEK", - "AAYAARWVAK", - "AAYDKFKDK", - "AAYDSLVVGK", - "AAYEGSVAK", - "AAYNRYFRK", - "ADHLANSW", - "ADHLLTASW", - "AEAAAAAKF", - "AEAALKKEV", - "AEADGLSTNHW", - "AEADKTIKVY", - "AEAEAASVRM", - "AEAEAVREVY", - "AEAEKLGGQSY", - "AEAEPEHSF", - "AEAEQTLRF", - "AEAFVRAFL", - "AEAITLAERKY", - "AEAKARAEI", - "AEAKEKIYL", - "AEALGPLQSF", - "AEALHAHGY", - "AEALPKQSV", - "AEALSQAVARY", - "AEANVMKTL", - "AEAPVPEEF", - "AEAQLRFIQAW", - "AEASMISKL", - "AEAVSTRW", - "AEAYGKKEW", - "AEAYLGKKV", - "AEAYLGKTV", - "AEDAMRLYY", - "AEDAPWKKI", - "AEDDARTQW", - "AEDDFKKVL", - "AEDEDLRVHF", - "AEDEGTQRL", - "AEDEGVSQRKF", - "AEDELFNRY", - "AEDENGKIVGY", "AEDGLKHEY", - "AEDIAKIKKF", - "AEDIPKHRQ", "AEDKENYKKF", "AEDKENYKKFY", - "AEDKKGHLI", - "AEDLGGPYVW", - "AEDLNSRVS", - "AEDLNSRVSYW", - "AEDLNTRVAY", - "AEDLNTRVAYW", - "AEDLRAKAEW", - "AEDLVGKSLY", - "AEDLVVTKY", - "AEDMETKIKNY", - "AEDMSHKRL", - "AEDMTSKDYY", - "AEDNLIHKF", - "AEDPSLERHF", - "AEDQRTSTY", - "AEDTYPQKI", - "AEDYAKERY", - "AEEAEKQLF", - "AEEDPAHAF", - "AEEEGPKREL", - "AEEEGVNKF", - "AEEEIGTPRKF", - "AEEHPKKAF", - "AEEKEDGRRW", - "AEEKKEEKTW", - "AEEKNISSKY", - "AEEKQTKSF", - "AEEKSSIHDARSW", - "AEEKTISAKY", - "AEELERQGY", - "AEELFARKF", - "AEELIRDGRY", - "AEEQLLKHGW", - "AEERAEAKKKF", - "AEESDLSRQY", - "AEESGRLW", - "AEESRKHINTW", - "AEEWYKSKF", - "AEFARIMSI", - "AEFEEPRVIDLW", - "AEFELPKTM", - "AEFKEAFQ", - "AEFKEAFQL", - "AEFKEAFQLF", - "AEFKEAFS", - "AEFKEAFSL", - "AEFKEAFSLF", - "AEFKTKYKL", - "AEFKVTIKY", - "AEFN(Deamidated)KSQTSF", - "AEFNRIMSL", - "AEFQSIPRVF", - "AEFRDPLGY", - "AEGDLIEHF", - "AEGEINNVQW", - "AEGEIYTKL", - "AEGENKTSKSW", - "AEGEVVQVKW", - "AEGEVVQVRW", - "AEGFISRMQY", - "AEGGGAKFKKY", - "AEGHYTVSY", - "AEGIHTGQF", - "AEGITFIKF", - "AEGKLISVEY", - "AEGPPRLAI", - "AEGSVAREEW", - "AEGTAQQRL", - "AEGTEEGARW", - "AEGTLSKKL", - "AEGVEPGSQRW", - "AEGVIVGHW", - "AEHDRIARQW", - "AEHDRMARQW", - "AEHFLEQQM", - "AEHGDQDYIW", - "AEHIESRTL", - "AEHLGDFHRTY", - "AEHLGEMNRQW", - "AEHLTSHKY", - "AEHPELRSY", - "AEIDARNDSF", - "AEIDDRKQL", - "AEIDKLATEY", - "AEIDSIHQL", - "AEIEIVKEEF", - "AEIEKLGQKY", - "AEIGRNYSM", - "AEIIASHW", - "AEIIKEDLW", - "AEIIKGELW", - "AEIKQIVSEY", - "AEILLSNHY", - "AEILQESRM", - "AEIMTPPTKTLW", - "AEINNIIKI", - "AEIPADPKLY", - "AEIRAINEAY", - "AEIRHVLVTL", - "AEIRSLVTW", - "AEITDKLGL", - "AEIVEGENHTY", - "AEKAPTNIVY", - "AEKAVTKEEF", - "AEKAYHEQL", - "AEKELHEKF", - "AEKELTDRNW", - "AEKLITQTF", - "AEKVIGAGKSW", - "AELAGVIKRL", - "AELAVGSRW", - "AELDKTNKF", - "AELDRQIKSF", - "AELEDDFKEGY", - "AELEENQRSY", - "AELESSKEQF", - "AELGGLLKY", - "AELGPLNKY", - "AELISVSKF", - "AELKQLNQQY", - "AELNAEDQNRW", - "AELNHQKQL", - "AELQSKRASF", - "AELSEQIKSF", - "AELTGIKW", - "AELTPHQTF", - "AEMAQNAVRL", - "AEMEKHKKF", - "AEMEVKRESY", - "AEMILKVVM", - "AEMLPGVLQQF", - "AEMNGKLI", - "AEMNRGSNEW", - "AEMQAGDRY", - "AEMQWKRDY", - "AENAEFMRNF", - "AENDPTRQY", - "AENEENKGF", - "AENELNQSY", - "AENESMAKI", - "AENGKSNFL", - "AENIDAQLKRM", - "AENIPENPLKY", - "AENIQPGEQKY", - "AENISRVLY", - "AENKEIQKL", - "AENNIQPIF", - "AENPFLTHL", - "AENPGKYNI", - "AENQTVVKY", - "AENSYVKMT", - "AENVPASKF", - "AENYHDIKRI", - "AEPDFVVTDF", - "AEPDNKNVY", - "AEPLAPQPPAGPS", - "AEPRVEDFGNAW", - "AEPTPEKEKRF", - "AEPVTTHSF", - "AEPWNHGKTF", - "AEQDFISKF", - "AEQELANLEKW", - "AEQESARQL", - "AEQGKPVSF", - "AEQMPQHTL", - "AESAFSFK", - "AESALQLLYT", - "AESASEAAKKY", - "AESDFASTF", - "AESDIMKRQ", - "AESEEGPDVLRW", - "AESEYTFERW", - "AESGAKEEL", - "AESGRGQVM", - "AESHIILVL", - "AESIVVHTY", - "AESKEIVRGY", - "AESKGVVKF", - "AESLKTLRY", - "AESLQPKGY", - "AESMYQIKY", - "AESNEANSKW", - "AESVGAKHY", - "AESVVPARM", - "AETDFEKRDF", - "AETDLSQGVARW", - "AETERLEGW", - "AETGQVQKI", - "AETGSVKDF", - "AETHIVLLF", - "AETLIFVKY", - "AETPDIKLF", - "AETTTLFQF", - "AETVQTVRY", - "AEVAAEKSF", - "AEVAPVKDM", - "AEVDIIEQM", - "AEVDKVTGRF", - "AEVEAILNSGARGY", - "AEVEENKKM", - "AEVEQKKKRTF", - "AEVERVKNM", - "AEVFNYREF", - "AEVFPLKVF", - "AEVKIEKRT", - "AEVMPAQW", - "AEVMPAQWEF", - "AEVSPDAKTSL", - "AEVTTKSQI", - "AEWEERISAW", - "AEWQLDQPSW", - "AEYIEKVVY", - "AEYPAVKF", - "AEYPFSSEQKW", - "AEYVHGSQAW", - "AEYVSAREW", - "AFDASRTSF", - "AFDEAKADF", - "AFDERVFL", - "AFDISKKEM", - "AFDLDVVKL", - "AFDLTEQRY", - "AFDLTKTNM", - "AFDNMVTSM", - "AFDPTSTLL", - "AFDVAEREF", - "AFGGTFKK", - "AFIDRHPRL", - "AFIEKHWTF", - "AFIKIKMAF", - "AGDGTFQKW", - "AGHINPLIIY", - "AGIASSSIAAK", - "AGISFSVKK", - "AGLDIFAKF", - "AGMALGIQK", - "AGMTGYGMPR", - "AGTQ(Deamidated)PGPLLK", - "AIADAQSAIEK", - "AIALALREK", - "AIALPVTMK", - "AIANFTNQK", - "AIAQAESLRYK", - "AIAQLNYADMLK", - "AIASTLVHK", - "AIDSGSSAAQLPQK", - "AIFDGSTQK", - "AIFDKSTGK", - "AIFKGVFVHR", - "AIFKPVMSK", - "AIFQGKLEK", - "AIFQGKLEKK", - "AIFVLPHEK", - "AIIAILTPK", - "AIIDHIFASK", - "AIIENMSTK", - "AIITPPPAK", - "AIITPPPAKK", - "AIIWFLYKK", - "AILDKNFRK", - "AILDKTTNK", - "AILDYLITK", - "AILEKSRLK", - "AIM(Oxidation)DPLPLRTK", - "AIMDPLPLR", - "AIMDPLPLRTK", - "AIMSGRDLIGIAK", - "AINEAISVK", - "AIQDAVGPPK", - "AIQDPRLFAEEK", - "AIQNPTMINK", - "AIQPNTTGK", - "AISAGLIAK", - "AISSSAISK", - "AITGASLADIMAK", - "AIVAYGLYK", - "AIVESALYK", - "AIVKLFLKK", - "AIYDHINEGK", - "AIYELAVASFPK", - "AIYEPKTFK", - "AIYGRFDSK", - "AIYGTRKFK", - "AIYKTPPGIQK", - "AKKPKPKKVAPLK", - "ALADFLPVMK", - "ALAPPAQQK", - "ALDPQDRKW", - "ALFAKPLKGK", - "ALFDGVVSK", - "ALFLTLTTK", - "ALLDGSNVVFK", - "ALLEKAYAK", - "ALMEKFKKK", - "ALMGYATHK", - "ALPLDTVTFYK", - "ALPSKLPTF", - "ALPVLERLIYK", - "ALSFSSSAGPGLLK", - "ALSTPVVEK", - "ALYGVVNVK", - "ALYSGVHKK", - "AMAEIYKYAK", - "AMLDTVVFK", - "AMMGAVAEK", - "AMSERALAQK", - "AMYPDYFAK", - "AMYTYFQAK", - "ANMGGTVAHK", - "APANHQVVY", - "APAPIHNQF", - "APAPPASQY", - "APAPSTVHF", - "APAPVINSKY", - "APDELHYTY", - "APEEHPVLL", - "APEVSQHVY", - "APFDKTANITF", - "APFEGLGKVYIY", - "APFEQAGQKY", - "APFHQLRIQY", - "APFHQLRISY", - "APFSKVITF", - "APIAGETKVWQY", - "APIDWGEEY", - "APISEPIEWKY", - "APISLHVSY", - "APLKLQMEF", - "APLKSKMIY", - "APLPPAPAY", - "APLQEKVVF", - "APRADAKAY", - "APSKTSLIM", - "APSVVKISY", - "APSVVKVSY", - "APTTHTEEY", - "APVATVPAM", - "APVEVTHNF", - "APVFRDYVF", - "APVGGHILSY", - "APVLVVLRY", - "APVPTGEVY", - "APVSGAGNHSY", - "APWIESQDW", - "APWIESQDWAY", - "APWQERSTM", - "APYGNPKNMAY", - "AQAESLRYK", - "AQAQAQAQVPAK", - "AQAQEVFFLK", - "AQARPPGIYK", - "AQATISFPK", - "AQFGGKILRK", - "AQFIPKFFK", - "AQFRQPLKK", - "AQGNVYHLK", - "AQIENSAAVEK", - "AQIENSAAVQK", - "AQIGSYVHVGK", - "AQINSVFNK", - "AQITATIAK", - "AQLNAFLSK", - "AQMRAAINQK", - "AQNAKVIEK", - "AQNEPLTQK", - "AQNPSLFVK", - "AQNSVIIVDK", - "AQQDKLDKINK", - "AQQKVPSKLK", - "AQQQQVIRK", - "AQTGTRWNK", - "AQWEDVVQK", - "AQYDPTKNASK", - "AQYDPTKNASKK", - "AQYDQPLEK", - "AQYDRYVNK", - "AQYEQDLQHRK", - "AQYQFTGIKK", - "AQYSPQQLAGK", - "ARKSAPSTGGVK", - "ARNPAMMQEM", - "ASAAAALVLK", - "ASAGPPSLRK", - "ASAHFSPVLR", - "ASAIPAYSK", - "ASALGSSSYKK", - "ASANLGGVPSK", - "ASAPANVSK", - "ASAPGYLAITK", - "ASAPPQEQK", - "ASASASLPTK", - "ASATQPSPVK", - "ASATVAIPK", - "ASAYSIAQK", - "ASAYYPSSFPK", - "ASDPHIIIK", - "ASDPNVSKKLK", - "ASDTFSGIGK", - "ASEVLKHLK", - "ASFDGTFLWK", - "ASFDKAKLK", - "ASFDKAKLKK", - "ASFENVRAK", - "ASFEVEKTKK", - "ASFGKSFAQK", - "ASFLLTGGK", - "ASFLPPSSVKK", - "ASFPGANIIGNK", - "ASFPGISTGPMKK", - "ASFQKVISR", - "ASFQSTSVK", - "ASFSKRIQK", - "ASFTPTSILK", - "ASGGIIGYVK", - "ASGPRPTYK", - "ASGSTTFTK", - "ASIFVKDNVTK", - "ASIISLKSDKK", - "ASILSLVTK", - "ASINLNAINK", - "ASIQNHVRK", - "ASIQPSKVGK", - "ASLADIMAK", - "ASLATTLTK", - "ASLMHSFILK", - "ASLPLAVTK", - "ASLPSESNEPK", - "ASLQVSSHK", - "ASLSPSVSK", - "ASLTAALAK", - "ASLVGQTSPK", - "ASM(Oxidation)PDNTAAQK", - "ASMDKLREK", - "ASMDPKRFYKK", - "ASMEEVFHR", - "ASMGVLSGK", - "ASMPDNTAAQK", - "ASMPENTVAQK", - "ASMPHALSY", - "ASMPHPLRSR", - "ASMPVDIAK", - "ASMPWGDPNYR", - "ASMSAFDPLK", - "ASMTQNLEPLLK", - "ASNFKSPVK", - "ASNNMVTTEK", - "ASNPATFQR", - "ASPESVTGK", - "ASQAGMTGYGMPR", - "ASQEGTIQK", - "ASQEIAEKALK", - "ASQEIAEKALKK", - "ASQELWLNH", - "ASQLGIFISK", - "ASQLVGIEK", - "ASSALFMAK", - "ASSAPPLTGK", - "ASSFLTPPK", - "ASSGLSVVK", - "ASSGVPNPPK", - "ASSHVPIQK", - "ASSKDAIKK", - "ASSPPAIPK", - "ASSQALGTIPK", - "ASSSPAALK", - "ASSTIVPSLK", - "ASSTPTPIRK", - "ASTGLSLTK", - "ASTLSLVNK", - "ASTSATTPVK", - "ASVETGFAK", - "ASVFGTMPLK", - "ASVFVKLQK", - "ASVGYAVTK", - "ASVILPILK", - "ASVKAIFSK", - "ASVNTLVNK", - "ASVPAQAPK", - "ASVYQPLKK", - "ASYAAVPLYR", - "ASYDDPYKK", - "ASYDTSAPNAK", - "ASYDYVRRR", - "ASYEKNLPK", - "ASYENVRAK", - "ASYGRDAFAK", - "ASYGSTTTK", - "ASYGVSKGK", - "ASYMGKENLK", - "ASYMGKENLKK", - "ASYNVKTAYRK", - "ASYPSGSGKPK", - "ASYSDGKLK", - "ASYTKIVVK", - "ASYVASTKYQK", - "ASYVSPVLK", - "ASYYGGRGVGGIK", - "ATAAAIGATPR", - "ATAASSSSLEK", - "ATAASSSSLEKS", - "ATAATTVLR", - "ATAAVSSMK", - "ATADLALGR", - "ATAEAKISKQK", - "ATAGAYIASQTVK", - "ATAGDGLIELRK", - "ATAGFTIGR", - "ATAGIIGVNR", - "ATAGIIGVNRK", - "ATAHHLGLLK", - "ATAIGM(Oxidation)PVEK", - "ATAIGMPVEK", - "ATALEYVYK", - "ATALPTGTSK", - "ATAMLQSLLK", - "ATAMVTEQK", - "ATANGGLSK", - "ATAPAPTAHK", - "ATAPASSPGLAK", - "ATAPGTQER", - "ATAPPAPAY", - "ATAPPAPAYK", - "ATAPPSPLK", - "ATAQFKINKK", - "ATAQVNPLYK", - "ATASGNANMVNK", - "ATASPPRQK", - "ATASVNLKVSPK", - "ATATGTEILK", - "ATATLIIEHK", - "ATATSSPPPK", - "ATATVAALQEK", - "ATATVSVGK", - "ATATVYFKR", - "ATAVTNLYK", - "ATAYLPMLEK", - "ATDAAANLTK", - "ATDAVGIVLK", - "ATDDYFRHK", - "ATDDYHYEK", - "ATDGSFANK", - "ATDIPSSQK", - "ATDKSFVEK", - "ATDKTFVEK", - "ATDPDAGFNGK", - "ATDPKAIGH", - "ATDPNILGR", - "ATDYGTIKK", - "ATDYPLIAR", - "ATEESFFILK", - "ATEGGVLKK", - "ATEHLSTLSEK", - "ATEPPTESLLK", - "ATEPTPAQK", - "ATEQEDAAVAK", "ATEQPLTAK", "ATEQPLTAKK", - "ATETSGPTYIK", - "ATEYHLGLLK", - "ATFAATKFGSTK", - "ATFERVLLR", - "ATFFGEVVK", - "ATFGTQVVEK", - "ATFKDLLTRHK", - "ATFKLEKNK", - "ATFLDPRYK", - "ATFMEVLTK", - "ATFPDPNVK", "ATFPGMWER", - "ATFPLSVQK", - "ATFQFTVERF", - "ATFQNTGTYR", - "ATFSSSHRYHK", - "ATFTNVFGK", - "ATFTVMGLK", - "ATFYGPVKK", - "ATGAPAPSR", - "ATGDM(Oxidation)SGLLK", - "ATGDMSGLLK", - "ATGDVALLR", - "ATGESIAVKK", - "ATGGLEGKMK", - "ATGGTFVVK", - "ATGGWSSSK", - "ATGIILPAR", - "ATGILGAVFK", - "ATGKLFAVK", - "ATGKVMVMK", - "ATGLSGLTK", - "ATGNAILGK", - "ATGNWGDQK", - "ATGNWGDQKK", - "ATGPALDNK", - "ATGQWTRFK", - "ATGQWTRFKK", - "ATGRYYAMK", - "ATGSVFTGK", - "ATGSWDSFLK", - "ATHTAFVAK", - "ATIALMIQR", - "ATIDGSVNPK", - "ATIDSQHGIEK", - "ATIEDILFK", - "ATIEEAYSR", - "ATIEELTEK", - "ATIEETYSK", - "ATIEGYYQK", - "ATIGIVDGIFTR", - "ATIGVDFALK", - "ATIIDILTK", - "ATIIDILTKR", - "ATIKMTVER", - "ATILAGDIKVK", - "ATILAGDVKVK", - "ATIMGVRFK", - "ATINNPNLLTK", - "ATINYSLLR", - "ATIQELNTIRK", - "ATIQGAYAR", - "ATIQNETPK", - "ATIRVLEAIQK", - "ATIRVLEAIQKK", - "ATIRVLESVQK", - "ATISNDGATILK", - "ATITDKELLKK", - "ATITDKEMLK", - "ATITDKEMLKK", - "ATITKVLQK", - "ATKDSMIRK", - "ATKMNELMEK", - "ATLAAVLQR", - "ATLDFKPLHK", - "ATLDIDGVRK", - "ATLDVAVRR", - "ATLEETLVKK", - "ATLEETLVKKK", - "ATLEIVTDK", - "ATLESIQRK", - "ATLETILRH", - "ATLGAILNR", - "ATLGAILNRL", - "ATLGALLQK", - "ATLGDLKLVEK", - "ATLGSGNLRQ", - "ATLHAQVADMKK", - "ATLKPSNKAFEK", - "ATLKWILENK", - "ATLLASNEAFK", - "ATLLASNEAFKK", - "ATLLIFANK", - "ATLNSIVAK", - "ATLNVSTTR", - "ATLPDLKTMEK", - "ATLPKNPPPK", - "ATLPNQPVEK", - "ATLPNQVHR", - "ATLPNQVHRK", - "ATLQDIIRR", - "ATLQEALAH", - "ATLQNVLRK", - "ATLSEIKALLK", - "ATLSQFYINK", - "ATLTGGPAR", - "ATLTNILEH", - "ATLTTTSATSK", - "ATLWGGLLR", - "ATMATSGSARK", - "ATMITKRLAQVK", - "ATMKPHPTVQK", - "ATMLATGGNRKK", - "ATMPKKGILK", - "ATMPKKGILKK", - "ATMPSDVLEVTK", - "ATMPSDVLEVTKK", - "ATMPTDVLEVTKK", - "ATMQESLRVK", - "ATMQGDREQLK", - "ATNAAAQNAIKK", - "ATNDSVVADK", - "ATNETPLSR", "ATNKITIIFK", - "ATNNMNLSR", - "ATNRSVYFK", - "ATNSSMFLK", - "ATNTSAPDLK", - "ATNTVYVFAK", - "ATNYITRNK", - "ATPAATTSPK", - "ATPEKSLHDK", - "ATPELGSSLK", - "ATPENPTIRK", - "ATPEQVGKMK", - "ATPKFGPYQK", - "ATPKKTVPK", - "ATPLDFPSKK", - "ATPLSTLSLK", - "ATPSPSNETPK", - "ATPSSSLPK", - "ATPTPSTFAI", - "ATPTSPIRVK", - "ATQAVEDVLNIAK", - "ATQAVFQKR", - "ATQDILKALSK", - "ATQDPQIEK", - "ATQEGEWKALK", - "ATQFENWYK", - "ATQGLGSNQNALK", - "ATQMVRMILK", - "ATQN(Deamidated)AHGTGISK", - "ATQNAHGTGISK", - "ATQNSSQFMK", - "ATQQEFYAK", - "ATQQPVTADK", - "ATQSFSTFR", - "ATQTQFFHVK", - "ATQTSVVVK", - "ATQVAVSVPK", - "ATQYPVSNR", - "ATSAFQTQK", - "ATSAPLVSR", - "ATSAVTVTR", - "ATSDAVGSSLK", - "ATSDM(Oxidation)DIGK", - "ATSDMDIGK", - "ATSDPKQLSK", - "ATSGGSAEQIK", - "ATSGKQSNFSR", - "ATSGVPVYK", - "ATSGVVAVR", - "ATSIDRLKVFK", - "ATSIPAILK", - "ATSISSETK", - "ATSKPVPAEK", - "ATSLGHFTK", - "ATSLVFKQK", - "ATSNVHMVKK", - "ATSPAGTAQAR", - "ATSPALFNR", - "ATSPIIIHR", - "ATSPIIIHRL", - "ATSPPFQLTK", - "ATSPVVYTR", - "ATSQQPLRK", - "ATSSFGGLGGGSVR", - "ATSSLDQTVK", - "ATSSVSALK", - "ATSTGGIVNK", - "ATSVITIVK", - "ATSVVSFVR", - "ATSVYLVQK", - "ATSYFGKQFLR", - "ATSYLWFKK", - "ATTGELAANK", - "ATTHEIMGPK", - "ATTLPIRNK", - "ATTPTVTSSK", - "ATTQTIMQK", - "ATTSLSLRR", - "ATTSLSWKR", - "ATTSMAYAK", - "ATTSNTVSK", - "ATTSVITIVK", - "ATTTTVTTK", - "ATTTVMNPK", - "ATVAAILQH", - "ATVAGVHVK", - "ATVAVPLVGK", - "ATVDIVQKK", - "ATVETTIAR", - "ATVGKATGFLK", - "ATVISLPAK", - "ATVKLEHAK", - "ATVLTSVKK", - "ATVLTTERK", - "ATVLYIVKK", - "ATVNPSAPR", - "ATVQNRFTK", - "ATVRPPVAVK", - "ATVTPSPVK", - "ATVYLIYLK", - "ATWATKELRK", - "ATWKSNYFLK", - "ATWMGKIHSK", - "ATYAGVGANK", - "ATYEAGALSLK", - "ATYEAGALSLKK", - "ATYEQGVEK", - "ATYETKESK", - "ATYGDTINR", - "ATYGKPVHH", - "ATYGLNVER", - "ATYHANTEREQK", - "ATYHGSFSTK", - "ATYHGSFSTKK", - "ATYILEAGK", - "ATYNKQPMYR", - "ATYPDVNNSIK", - "ATYPMPTAK", - "ATYPYQVVR", - "ATYRDWISK", - "ATYREGMTK", - "ATYSVGMQK", - "ATYVQPRRK", - "AVAAFQVEK", - "AVAAFVLYK", - "AVAAVAARR", - "AVADAVIEK", - "AVADKVHLMYK", - "AVADSVLTK", - "AVAEDGGLKK", - "AVAEGAKNVMK", - "AVAEGAKNVVK", - "AVAEPANAVK", - "AVAEPLPSPR", - "AVAGDASESALLK", - "AVAGDFALINK", - "AVAGTGPPR", - "AVAIKAMAK", - "AVAKADKLAEEHSS", - "AVALINAAIQK", - "AVALPLQTK", - "AVANIVNSVK", - "AVAPAGILK", - "AVAPNQNLK", - "AVAPPAGPR", - "AVAPPTPASK", - "AVAPVASALEK", - "AVAQAIMSK", - "AVAQLWGQKK", - "AVASFPKKQE", - "AVASVTEILK", "AVATALGLK", - "AVATGSWDSFLK", - "AVATKFVNK", - "AVATNQPPK", - "AVATSQLQK", - "AVAVDVAVPK", - "AVAWLVAMHK", - "AVDATLRKK", - "AVDDKQLRK", - "AVDPSSGHPR", - "AVDRYLRVK", - "AVDSKVASYEK", - "AVDTAYVAK", - "AVDTETLQK", - "AVEDAIARK", - "AVEDTVAAK", - "AVEGPSEAK", - "AVFASEVKK", - "AVFDHPAKIAK", - "AVFEWHITK", - "AVFGVIGSQK", - "AVFGVPASK", - "AVFIHGLHAK", - "AVFKGIAADK", - "AVFPFKPPQR", - "AVFPKPFVEK", - "AVFPNEDGSLQK", - "AVFPSLLTNPK", - "AVFRGRMSMK", - "AVFSKSVQK", - "AVFTIVFTQK", - "AVGAVKALK", - "AVGDTPIMK", - "AVGGGYTAK", - "AVGLVLPAK", - "AVGLVLPAKL", - "AVGNIKVTK", - "AVGPHLTAK", - "AVGPKVALK", - "AVGRGLQPK", - "AVGVIKNVEK", - "AVGVPIKVK", - "AVHDITVAY", - "AVHEAWAGMLK", - "AVIAINEAVEK", - "AVIDVGINR", - "AVIEDTWHY", - "AVIEHLKQK", - "AVIENLPKK", - "AVIGADSVTLK", - "AVIGNVQEK", - "AVIKEKIEEK", - "AVILPPLSPYFK", - "AVINAYTEINK", - "AVIPEKQLVEK", - "AVIQALAQK", - "AVIQVGKEK", - "AVIQVSQIVAR", - "AVITNKDVRK", - "AVIVLVENFYK", - "AVIWEVLRK", - "AVLDALLASK", - "AVLDFVKQK", - "AVLDLGSLLAK", - "AVLDLSWNK", - "AVLDYLYTK", - "AVLEKQDISDK", - "AVLFPAAHRPK", - "AVLKHIENK", - "AVLLVFANK", - "AVLPSVLNK", - "AVLPTPVTK", - "AVLQESVAK", - "AVLSSPLSH", - "AVLSWKLAK", - "AVLTALDVLQK", - "AVLTHSGFPAK", - "AVLWEALRK", - "AVLYQPLFDK", - "AVMAESAFSFK", - "AVMAESAFSFKK", - "AVMDGNVITAK", - "AVMDNKNPTIK", - "AVMDSDTTGK", - "AVMDVVKKQK", - "AVMEMMSQK", - "AVMGAYVLLK", - "AVMGNPVTR", - "AVMKDVVLIRK", - "AVMPLRDVTAK", - "AVMRFLTQR", - "AVMSATFAK", - "AVMWRRKSSDRKG", - "AVNAHSNILK", - "AVNEAILLK", - "AVNLHPIRK", - "AVNMVPFPR", - "AVNPYFDIPK", - "AVNYFSKVK", - "AVPAGPLTTK", - "AVPEAPIAKK", - "AVPEASASPK", - "AVPNGPQSPK", - "AVPTNIIAAK", - "AVPVSESNVAK", - "AVQAQKKILGK", - "AVQAVNAHSNILK", - "AVQDAVDALMQK", - "AVQEATRLK", "AVQEFGLAR", "AVQEFGLARFK", - "AVQEQMRSK", - "AVQGDVGSFVLK", - "AVQGISGLPLK", - "AVQIPFFAK", - "AVQKAIPMYK", - "AVQKFHREK", - "AVQKKTFTK", - "AVQLPARFK", - "AVQNLPTKK", - "AVQNTNDSSALSK", - "AVQPSDNISRK", - "AVQQPFINK", - "AVQQVNAMIEK", - "AVQRTLLEK", - "AVQSSSFER", - "AVQTAAKELLK", - "AVSAGHGLPAK", - "AVSATIIQR", - "AVSAVVHEY", "AVSEGTKAVTK", - "AVSKDIANWQK", - "AVSQDVLMK", - "AVSQNMGIGK", - "AVSSLATAK", - "AVSSQMIGK", - "AVSTDYKKLKK", - "AVSTFAM(Oxidation)VK", - "AVSTFAMVK", - "AVSTLGISK", - "AVSTPSTQK", - "AVSVKGIYK", - "AVTDAIMSR", "AVTDQTVSK", - "AVTEAEIQQLK", - "AVTEYIQRK", - "AVTKYTSAK", - "AVTKYTSSK", - "AVTSGVATK", - "AVTTVVNPK", - "AVTYTEHAK", - "AVVDIYHSR", - "AVVDVRIGMTRK", - "AVVEKIHAK", "AVVELVTVK", - "AVVGAVVFQK", - "AVVGGLDIHKK", - "AVVGPVGAGK", - "AVVKPGNTK", - "AVVNSPHRQYK", - "AVVQTLVAK", - "AVVSVIFLK", - "AVVTESQTYKK", - "AVWDVGSHFK", - "AVYADSGNFK", - "AVYDFFIGR", - "AVYDGHAGSQVAK", - "AVYDRPGASPK", - "AVYENAREK", - "AVYERHFLR", - "AVYETPTAH", - "AVYGGFKSK", - "AVYGMLNLTPK", - "AVYGQKEIHRK", - "AVYGQNDIHHK", - "AVYKTHVEK", - "AVYLLPVPK", - "AVYLSTCKDSK", - "AVYNPEAVNEPK", - "AVYQARPQLHK", - "AVYSHVIQK", - "AVYTKMMTK", - "AVYTKMMTKK", - "AVYVPFWQK", - "AWAPKPYHKF", - "AWLPHVADFRW", - "AYAIIKEEL", - "AYATHPFKF", - "AYDTVRWEF", - "AYGHFSYEF", - "AYGKDFHLI", - "AYGNVFSAF", - "AYIADHLGF", - "AYIFIHRKW", - "AYIPLNNYL", - "AYLDKSPQF", - "AYLDSTERF", - "AYLEAHETF", - "AYLEAIHNF", - "AYLESFYKF", - "AYLHTTTTF", - "AYLKAIVLF", - "AYLKLRNWQW", - "AYLNITKHL", - "AYLPEWKENI", - "AYLPKMMTL", - "AYLPVNESF", - "AYLPVNESFGF", - "AYLSGM(Oxidation)LRF", - "AYLSGMLRF", - "AYLTVHQRI", - "AYMPHTFFI", - "AYPTVKFYF", - "AYSAKIALF", - "AYSDGHFLF", - "AYSRVQYQF", - "AYTPFHAVL", - "AYVELVHHI", - "AYVEWFNRL", - "AYVHM(Oxidation)VTHF", - "AYVHMVTHF", - "AYVKGGLSTF", - "AYVNTFHNI", - "AYVPGFAHI", - "AYVPVSDMNGLGF", - "AYVQIKTIW", - "CIAEQPQPK", - "DAADIRFVY", - "DAAGPHEAF", - "DAAHEFTVY", - "DAAKNQVAM", - "DAAPALSHY", - "DAARLQAAY", - "DAARLVMLY", - "DAAYSHHY", - "DAFKSGIVQY", - "DAGPPTHAF", - "DAGVCVLREK", - "DAHGVVIVF", - "DAHISSML", - "DAHMLDTQY", - "DAHPTLVTY", - "DAHVDSTTY", - "DAIRLAVSY", - "DAIRLFAAY", - "DAIRNLHHY", - "DAIRSLASVSY", - "DAISKTYSY", - "DAISSVERY", - "DAITEAGKTY", - "DALGFAVRY", - "DALGHFFQY", - "DALITHVL", - "DALKILQY", - "DALKSSYY", - "DALQVAQEM", - "DAMKDLAQY", - "DAMQAAVQY", - "DANPETHAF", - "DANRQISEY", - "DASALRILF", - "DASGAKLDY", - "DASKVVTVF", - "DASPVQAVF", - "DAVHAILAY", - "DAVREIRKY", - "DAVREVRKY", - "DAVRTKMVY", - "DAVVSQVL", - "DAWIEHDVW", - "DAWKQLQTF", "DAYPEIEKF", - "DDALNHDFF", - "DDIGDDDEDIDDI", - "DEAEVHLKF", - "DEAIEKPTY", - "DEAKNINKSL", - "DEALIGKKF", - "DEAQLNKENW", - "DEARDLIQRY", - "DEARNLHSKW", - "DEARSLKAY", - "DEAVGVQKW", - "DEDAYKKQF", - "DEDGGSEKKY", - "DEDGSTLFRGW", - "DEDMTLTRW", - "DEDPHDRAVW", - "DEDPTGNKALW", - "DEDTIYHL", - "DEDVTSKAF", - "DEEETYRLW", - "DEFHNPLAY", - "DEFSEAIKAF", - "DEFSHQVQEW", - "DEHEGPAL", - "DEHEGPALYY", - "DEIDAIATKRF", - "DEIDAIGGRRF", - "DEIDAIGTKRY", - "DEIENVAKQF", - "DEIERKFDKW", - "DEIERTKQF", - "DEILLSKAEW", - "DEILQGKSDW", - "DEINHVQKTY", - "DEITGKKGY", - "DELDAIGTKRF", - "DELDSKLNY", - "DELEIKAYY", - "DELELHQRF", - "DELKIPIRSW", - "DELQIPVKW", - "DEMRAQLESW", - "DEMTGYVATRW", - "DENLGSVKQY", - "DENPQQLKL", - "DENSAFLQF", - "DENSTQKRL", - "DENSVIKSF", - "DESGPSIVHR", - "DESGPSIVHRK", - "DESIIPKKY", - "DESNPLGRAGIW", - "DESQVVTRY", - "DETDSGAGLKW", - "DETEAVKRY", - "DETGVLKGF", - "DEVDKRVHMTW", - "DEVDMAHRF", - "DEVDRISEW", - "DEVIIPHSGW", - "DEVRLDPNVQKW", - "DEYYKPVKW", - "DFDMTLSRF", - "DFKRVVGKKGESH", - "DFLPADIQAQF", - "DGAIRMQP", - "DGFKEQGVTF", - "DGNTSTTPPTSAK", - "DGWRDMGYTY", - "DLENDIRTF", - "DLRKEDVAM", - "DLWLEREVF", - "DMEKIWHHTF", - "DPAAIIHDF", - "DPANIVHDF", - "DPDATSLKY", - "DPFGHSPTM", - "DPFKDIILY", - "DPFKHFVGM", - "DPFPDHVVF", - "DPFRDLHSL", - "DPGHWDRYHY", - "DPHAMFAEF", - "DPHQQIYTF", - "DPHTVLVEF", - "DPHTVTVSM", - "DPIGGHIHSY", - "DPIGGHINNY", - "DPIHTFDLY", - "DPLERSFLY", - "DPLGGSAAIHLY", - "DPLHQEVSF", - "DPMGKEGDFVY", - "DPNEIKVVY", - "DPNLEFVAM", - "DPQEGGQVY", - "DPQHVVVLY", - "DPSQSEVM", - "DPSSGHPR", - "DPTTVTKTF", - "DPVEPHGEM", - "DPVGDIVSF", - "DPVYEHNTM", - "DPWIGKLLY", - "DPYKKAVAM", - "DPYQGTIVL", - "DSISKNTW", - "DSNGAILVY", - "DSRSSLGGRDLY", - "DSYQGKGFVM", - "DTPTSAGPNSFNK", - "DVDRSGTMNSY", - "DVIRLIMQY", - "DVREEGKENAF", - "DVSDLRIFY", - "DYDPLVVKL", - "DYHTKLFLI", - "DYIAVNPHL", - "DYIDTIWKI", - "DYLDGVHTVF", - "DYLEKYYKF", - "DYLELSLKL", - "DYLHMVHRL", - "DYLKFKEKF", - "DYLKNTYRL", - "DYLKRFYLY", - "DYLNEWGNRF", - "DYLRWVQTL", - "DYVEGLRVF", - "DYVRQTWKL", - "DYYPEYKL", - "DYYPEYKLLF", - "EAAAVFKTL", - "EAAGPHEAF", - "EAAKGTLTY", - "EAAPDIMHY", - "EAAVAIKAM", - "EAFKAIGTAY", - "EAFLNNQEY", - "EAFREHQQY", - "EAFRGVHRY", - "EAGAAGLRW", - "EAIALAEKY", - "EAIAVFMEH", - "EAIDQLHLEY", - "EAIEQILKY", - "EAIGAVIHY", - "EAIKILKGEY", - "EAINVEQAF", - "EAIRDMVRY", - "EAIRISPTF", - "EALSLAHTY", - "EAMEWVIHK", - "EAMPSLKITNDY", - "EAMPSLKITNDYIF", - "EANAIALKY", - "EANQHELLY", - "EANQWEVAY", - "EAQKGGHFY", - "EAQPIVTKY", - "EAQPVHQAY", - "EARKQVEVF", - "EASGRIYVY", - "EASKLLLTY", - "EASKYIMQY", - "EATKAVTEM", - "EAVESMVK", - "EAVKPTVGM", - "EAVKQYSSY", - "EAVLIQTVY", - "EAVNGVREM", - "EAWASKDATY", - "EAYGKPVKY", - "EAYNAVVRY", - "EAYPDHTQF", - "EDELVKKY", - "EDQVQIHTY", - "EDVETSKKW", - "EEADDWLRY", - "EEADGGLKSW", - "EEADKLVRQY", - "EEAEAKPKF", - "EEAEALAKRL", - "EEAEIIRKY", - "EEAENTLQSF", - "EEAERELERW", - "EEAERPLHF", - "EEAEVRKKL", - "EEAEWQTRW", - "EEAFAIFRKF", - "EEAFHQGLISAW", - "EEAGGRPAM", - "EEAHLNTSF", - "EEAIAYGRKL", - "EEAKAKGTF", - "EEAKEARRI", - "EEAKLKAKY", - "EEAKLKARY", - "EEAKQIQNL", - "EEALHASHGF", - "EEALILDNKY", - "EEANLMKTL", - "EEANNDLENKIQ", - "EEANVGRGY", - "EEAPKFLAF", - "EEAPKTAQKKL", - "EEAPSRPAL", - "EEAPVLMHY", - "EEAQFETKKL", - "EEAQFETKKLY", - "EEAQIGKRGY", - "EEAQMINRF", - "EEAQPIVTKY", - "EEAQVRKENQW", - "EEAQYQREY", - "EEASIYSRW", - "EEASLLHQF", - "EEATKPHTF", - "EEAWINEKM", - "EEAYENQRW", - "EEAYNAVVRY", - "EEAYTTEHW", - "EEDAALFKAW", - "EEDDRRLGF", - "EEDEACGRQY", - "EEDEDAYKKQF", - "EEDEYKAFY", - "EEDGDYKVTF", - "EEDGHTHQW", - "EEDKLEQIKKW", - "EEDLNRKEI", - "EEDLPRPSI", - "EEDMTKVEF", - "EEDNVQKNY", - "EEDPGRKW", "EEDPNTHILY", - "EEDQAAELRAY", - "EEDREVKKLM", - "EEDVKSLKKEY", - "EEEAAPKKI", - "EEEAARLFY", - "EEEAEEEVA", - "EEEALAKKF", - "EEEALASKRF", - "EEEALQKKF", - "EEEDNESRSW", - "EEEDRKHTW", - "EEEEALQKKF", - "EEEEEGAVRW", - "EEEEGAVRW", - "EEEEGQRFY", - "EEEEKAKAY", - "EEEEKQKSTW", - "EEEESHKKF", - "EEEESQPAKKTY", - "EEEGNLLR", - "EEEGNLLRSW", - "EEEGRFLKAY", - "EEEGSALKTSW", - "EEEHGKGREY", - "EEEIGTPRKF", - "EEEKAKKSF", - "EEEKGQNISW", - "EEEKNFKAF", - "EEEKTGKVKY", - "EEEKYAFVNW", - "EEENGKKLI", - "EEENKLVKKI", - "EEENLGKGEY", - "EEENSAILHRF", - "EEEPEGGFSKW", - "EEEPLPTKKW", - "EEEPLYVNAKQY", - "EEEPVKKRGW", - "EEEPVKKVL", - "EEEQSQSRW", - "EEERLSIQNF", - "EEERPKQYSW", - "EEERTRQGW", - "EEESQPAKKTY", - "EEESTIRYSW", "EEEVPKRKW", - "EEFAEGSKI", - "EEFDAITKAYY", - "EEFDARWVTY", - "EEFDEKIATKY", - "EEFDEVSRI", - "EEFDFHVRW", - "EEFDRLVKEY", - "EEFEKNKGKGF", - "EEFELLGKAY", - "EEFGAMREQY", - "EEFGKKYKL", - "EEFGQAFSF", - "EEFGRFASF", - "EEFHIYTQY", - "EEFHQSLQW", - "EEFIGAGEQARY", - "EEFLAQHGSEY", - "EEFLKDEW", - "EEFLNGRAVY", - "EEFLRQEHF", - "EEFNREMFW", - "EEFQKELSQW", - "EEFREFNKY", - "EEFRHVIAW", - "EEFRQVMNGF", - "EEFSRAAEKLY", - "EEFTHKDGVW", - "EEGAVDKSY", - "EEGDRVITY", - "EEGGATHVY", - "EEGHIGVYY", - "EEGHLAVYY", - "EEGHPFKAY", - "EEGLGAGRW", - "EEGLHSVDVTY", - "EEGLVNNKY", - "EEGMYVLRW", - "EEGNLLRSW", - "EEGNPRLWY", - "EEGPDVLRW", - "EEGPIIKEI", - "EEGPPHTKNW", - "EEGPSSVRF", - "EEGRDMANRI", - "EEGRFLKAY", - "EEGRYKQKF", - "EEGSALKTSW", - "EEGSARMW", - "EEGSKVTTY", - "EEHAVEALW", - "EEHFRGQEF", - "EEHLESHKKY", - "EEHLTTNGY", - "EEHPELQQF", - "EEHPNPGKRY", - "EEHRLIARY", - "EEHSLNKEARKW", - "EEHTAVYT", - "EEHTAVYTAW", - "EEHVIIQAEF", - "EEHVNRTGW", - "EEHVQASHF", - "EEIAFLKKL", - "EEIAIIPSKKL", - "EEIAKVEKL", - "EEIALHRRL", - "EEIANYRPTL", - "EEIAQLARQY", - "EEIDEIRKSY", - "EEIDEKIGF", - "EEIDHAVHL", - "EEIDLLIKHL", - "EEIDLRSVGW", - "EEIEDLVARL", - "EEIEGFRY", "EEIEILLRY", - "EEIENAINTF", - "EEIESSAQY", - "EEIFSLHGF", - "EEIGQLVKQM", - "EEIGSRNFF", - "EEIGTPRKF", - "EEIHATGFNY", - "EEIHKFSGTY", - "EEIIRGQVF", - "EEIKEFAAGY", - "EEIKEKVHKY", - "EEIKKETGF", - "EEIKKNYRY", - "EEIKQIWQQY", - "EEIKQSHSF", - "EEIKTLERY", - "EEILHEHSY", - "EEILKVEQKY", - "EEILNSLKY", - "EEILQKKEI", - "EEINEVKTW", - "EEINLQRNI", - "EEINNMKTKF", - "EEINRQVTY", - "EEIPKNAAY", - "EEIPVHEEF", - "EEIPVSSHY", - "EEIQQRLAQF", - "EEIREAFRVF", - "EEISKLKGY", - "EEISNMIHSY", - "EEISTLVQKL", - "EEITTGSAW", - "EEITTGSAWF", - "EEIYKDRQKF", - "EEIYTNKNY", - "EEKDFRKKF", - "EEKMAYQEY", - "EEKPNNPEF", - "EEKSIDLIQKW", - "EEKSISARY", - "EEKTISAKY", - "EELAEMKRY", - "EELAQYQKW", - "EELDFQKNI", - "EELDFQKNIY", - "EELDFRVHI", - "EELDGKVKGY", - "EELDGLFRRY", - "EELDHTVSMQY", - "EELDKRTEY", - "EELDPESREY", - "EELDPESREYW", - "EELDSLIKATI", - "EELDVKHAL", - "EELEEKNKKY", - "EELEERLVEW", - "EELEGQIKKL", - "EELEKEKDGF", - "EELEQKYTY", - "EELERDKRVTW", - "EELERGIRSW", - "EELGFRPEY", - "EELGHTETY", - "EELGKQIQQY", - "EELGLVTHL", - "EELGN(Deamidated)HKAF", - "EELGSKAKF", - "EELKEKAKI", - "EELKELKEY", - "EELKETIKKL", - "EELKFKTGL", - "EELKHKPGM", - "EELKLKEKTY", - "EELLFSHKL", - "EELLGDGHSY", - "EELMNKSVY", - "EELNDLIQRF", - "EELNNAIKY", - "EELPHIHAF", - "EELPTLLHF", - "EELPTMMQHF", - "EELQAVDSQKY", - "EELQDLKGVW", "EELQKIYKTY", - "EELQQKVSY", - "EELRAHVRKY", - "EELREKQAY", - "EELRHIHSRY", - "EELRKKQAY", - "EELRQKHEY", - "EELRSPKLFY", - "EELSKKSQKW", - "EELSPTAKF", - "EELSRLSQY", - "EELTAVMRF", - "EELTLEGIKQF", - "EELTVQVARVY", - "EELTYDYKF", - "EEMARHLREY", - "EEMDASIKKM", - "EEMDFERGIW", - "EEMDLFTKY", - "EEMDRKLRF", - "EEMDSKEQF", - "EEMEAEHRL", - "EEMEAKQNL", - "EEMEDRLQAL", - "EEMGDYIRSY", - "EEMGKVKKI", - "EEMGVQGGRAKRY", - "EEMKKGSQF", - "EEMKQRKAAF", - "EEMKSGLKDF", - "EEMLSKKQEF", - "EEMLVPRKM", - "EEMNGTKMKF", - "EEMPATKGGF", - "EEMRDKMRKW", - "EEMRFLREW", - "EEMTLKQFL", - "EENAEQQAL", - "EENAQKKRF", - "EENAVDVKQY", - "EENDKLRQEF", - "EENDRVVAVGY", - "EENEEKKQY", - "EENISEVKSY", - "EENKLVKKI", - "EENMGQYIEY", - "EENMRGVRF", - "EENNNFSKM", - "EENPIVLEF", - "EENPKREDY", - "EENPLKRGL", - "EENQEQPRNY", - "EENQIVSSY", - "EENQVKKYH", - "EENRNENSGNSW", - "EENRQKLSL", - "EENTLVQNY", - "EENTNILKF", - "EENYGVKTTY", - "EEPDVIFQNF", - "EEPEGGFSKW", - "EEPGKGSFW", - "EEPKQASVTY", - "EEPLYVNAKQY", - "EEPPPVKIAW", - "EEPQHVLLRY", - "EEPRVIDLW", - "EEPTVIKKY", - "EEQKEEQKW", - "EEQKNLHFF", - "EEQLIAAKF", - "EEQLPQYRL", - "EEQNFVQKY", - "EEQPKNYQVW", - "EEQQALQKKL", - "EEQQDILSKF", - "EEQQGRQF", - "EEQRFNNFL", - "EEQRGLRKY", - "EEQSHPARLY", - "EEQSTKMTY", - "EEQVARESY", - "EEQVSEPKKW", - "EERAVIKAY", - "EERDGVRFSW", - "EERFLKNIGW", - "EERGFDKAY", - "EERQNIVLW", "EERVINEEY", - "EERVPEEDSRW", - "EESAIRVGF", - "EESDLAQQY", - "EESDLERGY", - "EESDLSRQY", - "EESEAYKSL", - "EESEIRYSTW", - "EESEKPRGF", - "EESFAEHLGY", - "EESGARINI", - "EESGATFHTY", - "EESILSRNY", - "EESIVEQTY", - "EESKHFTRY", - "EESKQFVARY", - "EESLNIVKY", - "EESLVARDW", - "EESPSGRGW", - "EESPSKAGM", - "EESQIRIEL", - "EESQPAKKTY", - "EESQRIKKL", - "EESRGNNQW", - "EESRKHINTW", - "EESTAFRY", - "EESTIRYSW", - "EESYSRMGY", - "EETAIGKKI", - "EETAIYKGDY", - "EETDTIQHM", - "EETEDYRQF", - "EETEELKRF", - "EETEELMRKY", - "EETEQINKHF", - "EETETVTK", - "EETETVTKSY", - "EETEYVKKI", - "EETGMAMRI", - "EETGVRVEL", - "EETLTPEKY", - "EETPNILRI", "EETPVVLQL", - "EETQVILREY", - "EETSPGKQF", - "EETSQRHSL", - "EETSVKSDY", - "EETTVRTEW", - "EETVSGLKGY", - "EEVAELFQRL", - "EEVAGKKSF", - "EEVAQKKKI", - "EEVAQQKSL", - "EEVDEEKKM", - "EEVDLSKDIQHW", - "EEVDQVARAY", - "EEVDSSVKKI", - "EEVDVKDPNY", - "EEVDVPIKLY", - "EEVDVTPTF", - "EEVEAHQSW", - "EEVEAKFKRY", - "EEVEQGVKF", - "EEVESLNRKY", - "EEVFPLAMNY", - "EEVFQNANF", - "EEVGDFIQRY", - "EEVGPSDHF", - "EEVGQAVHF", - "EEVGVEHLL", - "EEVGYAIRF", - "EEVHDLERKY", - "EEVIGRFW", - "EEVKEEVKKF", - "EEVKLIKKM", - "EEVKLIKKM(Oxidation)", - "EEVKQTKRL", - "EEVKVGNKL", - "EEVKVSREM", - "EEVLIHGVSY", - "EEVLIPDQKY", - "EEVLLVRNL", - "EEVLVAAKKI", - "EEVNAILK", - "EEVPKRKW", - "EEVPTQESVKW", - "EEVPVYENKY", - "EEVQFLKTL", - "EEVQRKLGF", - "EEVQVDPRKY", - "EEVRQGLKAY", - "EEVRQVGSY", - "EEVRSLVTW", - "EEVRTVIRF", - "EEVSEKKSY", - "EEVSGHLY", - "EEVSRIINY", - "EEVTELLARY", - "EEVTKNLQKF", - "EEVTLQTGIKRF", - "EEWEAEFQRY", - "EEWKGSETY", - "EEWLLRENI", - "EEWLPRELW", - "EEWNDPPAVKW", - "EEWQSEVLKY", - "EEWREAQQGF", - "EEWREAQRGF", - "EEYDTQAMKY", - "EEYEARLERY", - "EEYERATRY", - "EEYIPFKQY", - "EEYKQKIKEY", - "EEYLYYKHL", - "EEYMKYLAY", - "EEYNLRDYF", - "EEYPDRIMNTF", - "EEYQGVIAW", - "EEYQSLIRY", - "EEYSNTRAY", - "EFITVHSML", - "EFIYASLKF", - "EFPSIKTEF", - "EFVAKGHLF", - "EGVEIKGGSF", "EILKWYLNK", - "EIMPPPPKP", - "EISTLVQK", - "ELAGNAARDN", - "ELGGLGERVLGF", - "ELMPPPPPK", - "ELVKIIYK", - "ELYDIMKM", - "EMEEKYYRF", - "EPARPDITY", - "EPEEENGREY", - "EPFRLGIRF", - "EPHLMVEY", - "EPIEGHEDY", - "EPIYPEVVHMF", - "EPLEGDHVF", - "EPLLKHWEF", - "EPLRDFSAM", - "EPLTKAIKY", - "EPMNPIKQY", - "EPMPVRGPDVEAY", - "EPNPDDPLM", - "EPNPESLEL", - "EPNSTKFVF", - "EPPLFHPNVY", - "EPQHWPVQY", - "EPRVEDFGNAW", - "EPSWENAGHTM", - "EPTAAAIAY", - "EPVDHGKIEY", - "EPVKDHNWRY", - "EQEMATAASSSSL", - "EQIKEYHHL", - "EQPETYYKW", - "ERLQLAMEM", - "ESEDVSNKVSM", - "ESFEAEGHLY", - "ESYSIYVYK", - "ESYSVYVYK", - "ETFRTTIEK", - "ETMMFTFHK", - "ETMNIFLEK", - "ETQPPVALK", - "EVFKERIGY", - "EVFPLAMNY", - "EVFRFAYYK", - "EVGAGWIGK", - "EVIPYTPAM", - "EVLGLILRY", - "EVNKFQMAY", - "EVNPNTRVM", - "EVNSGFFYK", - "EVSKIVQTY", - "EVYAGSHQY", - "EWDDRKVRHTF", - "EWLSFGHKF", - "EWLSFGHRF", - "EWPKHWPTFI", - "EWTVDTSKLVF", - "EYAHLFEVF", - "EYDNAIITM", - "EYDTVTREV", - "EYEGTPLKW", - "EYFRVPDSATF", - "EYGKVEFVF", - "EYIAKQFGF", - "EYIAVVKKL", - "EYIKFLRSI", - "EYIPDLYNHF", - "EYIPKWEQF", - "EYIRMVAEW", - "EYIRSLNQF", - "EYISIALRI", - "EYLEAHLKF", - "EYLGKLVRF", - "EYLGSMAKI", - "EYLHQHWIL", - "EYLKHHNRI", - "EYLKIKQSF", - "EYLKLETTW", - "EYLKLLHSF", - "EYLKNVLLQF", - "EYLKVDAQF", - "EYLNKHQNW", - "EYLNVRLSL", - "EYLRFAHKL", - "EYLRQIFRL", - "EYLSRHWLF", - "EYLTKVDKL", - "EYM(Oxidation)KHTRLF", - "EYMEHVYLI", - "EYMKHTRLF", - "EYMKVQTEI", - "EYMPIKLKI", - "EYNKSWQTF", - "EYNTIKDKF", - "EYPDRIMNTF", - "EYPRETFSF", - "EYQ(Deamidated)AKIRDL", - "EYQKVWNLF", - "EYSKQMQRF", - "EYTDVYPEI", - "EYTPRSWNF", - "EYTRALFLL", - "EYVDDTQFLRF", - "EYVEKFYRI", - "EYVKFLHKF", - "EYVKQTWNL", - "EYVNDFDLMKF", - "EYVSQHLVF", - "EYYDKHFTEF", - "FAFDPSVNY", - "FAFEHSEEY", - "FAHDDSVMY", - "FAIDKTIAY", - "FANIDQETY", - "FARLPEEEF", - "FASADGLTYNDF", - "FASHVSPEV", - "FASKEIAENAL", - "FAVDLEHHSY", - "FAYDGKDYL", - "FDGRVVAK", - "FDHGGTVFF", - "FEADPRGQLW", - "FEADSTVIEKW", - "FEAPIKLVF", - "FEDENGQRW", - "FEDETVRKF", - "FEEEAEEEVA", - "FEISEVNRW", - "FENPFFKDSF", - "FENVKEKW", - "FESNIKSY", - "FETDTNLNF", - "FETSAKTGY", - "FEVESLFQKY", - "FEYDGKINAW", - "FEYEYAMRW", - "FEYEYSQRW", - "FEYIRSETY", - "FFDEVVKQM", - "FFDNISSEL", - "FFDPHQSTF", - "FFDPSLLHL", - "FFIDQANYF", - "FFIDRPSTYF", - "FFKPHWDEKF", - "FFSPKVVSL", - "FGEEAEEEA", - "FGFGDSRGGGGNF", - "FGGLGSKSK", - "FGISSVPTK", - "FGLATKVEY", - "FGRGGAESHTF", - "FGSDVVAQF", - "FGWEEDEDF", - "FHISRLFYF", - "FIDASRLVY", - "FINPKPITY", - "FIRPVDPEY", - "FLASVSTVLTSK", - "FLDLTEQEF", - "FLDPIKAYL", - "FLWKEPATM", - "FLWQEGHSAF", - "FLYDEVHPK", - "FPAAPAPKM", - "FPAEGPDPEY", - "FPAEKESEW", - "FPAGIYDTKY", - "FPAGKVPAF", - "FPAKVTAHW", - "FPALQGAQTKM", - "FPANNIVKF", - "FPAPAKAVVY", - "FPAPGKPGNY", - "FPAPGKPGNYQY", - "FPASFPNRQY", - "FPASSGVSH", - "FPATPLLDY", - "FPAVGEPNIQQY", - "FPDEKIPTL", - "FPDKPITQY", - "FPDKVAIQL", - "FPDPAGKLNQF", - "FPDPEKPCKM(Oxidation)C", - "FPDQVAIQL", - "FPDRIMNTF", - "FPEADKVRTM", - "FPEDLENDIRTF", - "FPEEDKKTY", - "FPEELTQTF", - "FPEFYLKTY", - "FPEHIFPAL", - "FPEIDLEKY", - "FPEIHVAQY", - "FPEPEHSSF", - "FPFRPRPVQNF", - "FPFSDKLGEL", - "FPGEAERVAF", - "FPGPQGPYY", - "FPHGNPGGTSM", - "FPHHLQEYIEY", - "FPHHVIPDSF", - "FPHPVNQVTF", - "FPHQPSALGY", - "FPHSAHQKY", - "FPIDKPPSF", - "FPIEAGDMF", - "FPIEYHDIW", - "FPIIRDQIFRY", - "FPIISPGRVYEY", - "FPIPGEPGF", - "FPKADLAAAGVM", - "FPKKISELDAF", - "FPLKVFGY", - "FPMEIRQY", - "FPMEIRQYL", - "FPMELRQFL", - "FPMTHGNTGF", - "FPNAIEHTL", - "FPNALVTKL", - "FPNIPGKSL", - "FPNIVIKGSEL", - "FPNRVVFQEF", - "FPPEANYLF", - "FPPREIVTY", - "FPPYHVGQTF", - "FPQDRVFML", - "FPQEGMHQM", - "FPQKIAGELY", - "FPRDELMPLESAY", - "FPRDPEIEM", - "FPRFEEPAPLSY", - "FPRHIEPEL", - "FPRREFTKEDY", - "FPSEMTGIWRY", - "FPSEYVPTVF", - "FPSIYDVKY", - "FPSSVAALRF", - "FPSTAEHTL", - "FPTDPKVVVY", - "FPTEESSINY", - "FPTVQHQEL", - "FPVFSDRVVY", - "FPVGDVNNF", - "FPVGRVHRL", - "FPVIYDVKY", - "FPVKGLKTGY", - "FPVPGSGLVL", - "FPVPKPIDY", - "FPVRDGKIKL", - "FPVRDGVVL", - "FPVVRDFLY", - "FPWEVPKKLKY", - "FPYGDASKF", - "FPYIEAEVKY", - "FRQMDFPGESSN", - "FSEAREDM", - "FSEAREDMAALEKD", - "FSMTQAAMKK", - "FSNKITPIQSKE", - "FSSSAGPGLLK", - "FSTPQQLEK", - "FTAPSTVGK", - "FTDEESRVF", - "FTEAESNMND", - "FTEAESNMNDL", - "FTEAESNMNDLVSE", - "FTEREQTL", - "FTFDNVLPGK", - "FTFKDLHFK", - "FTVLPEKRT", - "FVAEQKVEY", - "FVAGVLPFK", - "FVELGTQPAT", - "FVELGTQPATQ", - "FVIPRGNVL", - "FVNDDRHVM", - "FVQGIFVEK", - "FVQMMTAK", - "FVVEQVESY", - "FVYEPKEQK", - "FVYFQNHDAADK", - "FVYKEEHPF", - "FVYKGGKIYK", - "FWDKKVTHF", - "FWHDVKLRF", - "FYDDKVSAL", - "FYDENDAKL", - "FYDERIVVV", - "FYDPDTVEL", - "FYHKYFNYL", - "FYINGQYQF", - "FYISPVNKL", - "FYITSRTQF", - "FYLDPDAQKLDF", - "FYLEGGFSKF", - "FYLPKDAVKHL", - "FYMDTSHLF", - "FYNLLTRTF", - "FYPPDPAQL", - "FYQREFDFF", - "FYQRFPLSF", - "FYVDTVRAF", - "GAAFSSNPK", - "GAAGVHFIY", - "GAALPLLTK", - "GAAPPTPPR", - "GAARFALQK", - "GAFNGTVKK", - "GAFYKGFIK", - "GAFYKGFVK", - "GAGKPWKKHGNRN", - "GAHGIIVVY", - "GAIEKTFTK", - "GALPYAVGK", - "GAMAVRRVLK", - "GANIPVTEK", - "GANVPTTAK", - "GASAVVHTM", - "GASEIILRK", - "GASGSIFSK", - "GASQAGMTAPGTK", - "GAVKPPPNK", - "GAYDGKFEK", - "GAYDGKYEK", - "GAYGEPRVK", - "GAYSQSPAIKK", - "GDDKTVKQW", - "GDSTFESKSYK", - "GEAAISRSF", - "GEAALNDPKMY", - "GEAESRNSNF", - "GEAGAGRGSDAW", - "GEAGGESTKGY", - "GEAN(Deamidated)GVWKY", - "GEANGVWKY", - "GEAPVIQRL", - "GEARAVLKW", - "GEASERDTRKLW", "GEASRLAHY", - "GEAVELRSLW", - "GEAVVNRVF", - "GEDDKAFVW", - "GEDGKVQVW", - "GEDGYVRIHY", - "GEDIRKLDY", - "GEDNGQRGY", - "GEDPAQPRKY", - "GEDPEGNKGF", - "GEDPYPHKF", - "GEDQAKQAY", - "GEDQPKQVY", - "GEDSSVIHY", - "GEDSTYKFF", - "GEDTFVHIW", - "GEDTIRQAF", - "GEDVETSKKW", - "GEEENQKRY", - "GEEFGESKW", - "GEEGSARMW", - "GEEQQRQQW", - "GEESSIRQY", - "GEEYIPFKQY", - "GEFEADPRGQLW", - "GEFGNVTRW", - "GEFLGNRQKQF", - "GEFSEAIKAY", - "GEFSSGRKW", - "GEFYKSLTNDW", - "GEGEATKGY", - "GEGETLLKKW", - "GEGETVQHF", - "GEGKELYLSW", - "GEGNIRSVKW", - "GEGSLIIRF", - "GEHGDSSVAVW", - "GEIDLAKLKKF", - "GEIDQQYSRF", - "GEIDTRFSF", - "GEIEGLNDTF", - "GEIQEIVKTGLW", - "GEITHPKNNY", - "GEKEPDPKTW", - "GELSSADEKRY", - "GEMGRLKSY", - "GENDRGVSF", - "GENGTGKTTF", - "GENHLTVTW", - "GENLKTEQW", - "GENRAVIHY", - "GENSAVLHY", - "GENVIISHF", - "GESDPAYQQY", - "GESGAGKTW", - "GESGEPVKAF", - "GESKQVMKY", - "GESLLIKTL", - "GESPSHPSW", - "GESQPVKMF", - "GESQTLQQF", - "GESSFTYRAY", - "GESSLIKQL", - "GESSSRLGY", - "GESVAVKIF", - "GESVIGKTY", - "GESVLKLTF", - "GETELKELHW", - "GETELREYF", - "GETPIKNFQW", - "GEVDDSREHSF", - "GEVDFKEFI", - "GEVDVRSAY", - "GEVDYKKKY", - "GEVEQQRTY", - "GEVIKSSTF", - "GEVLISRVY", - "GEVLRTNQF", - "GEVMREAAF", - "GEVN(Deamidated)DIKTRSW", - "GEVNDIKTRSW", - "GEVRLEKQW", "GEWASGGVRSF", - "GEWIRQNGGW", - "GEWTPTLQHY", - "GEYDGNEKVY", - "GEYPSGINTW", - "GEYTLVVKW", - "GFLDIDTKF", - "GFYPAEIT", - "GFYPAEITL", - "GFYPAEITLT", - "GGAESHTFK", - "GGGGGLGSGGSIR", "GGHSGSSYLNTVQK", - "GGMMVRQSF", - "GGQPPLTYK", - "GGSFDVADRMF", - "GGTGSGMGTLLLSK", - "GGWVEKETY", - "GHVDAIEY", "GIAGSLTNK", - "GIAGVAVSSITK", - "GIANITALK", - "GIASSSIAAK", - "GIATTFINK", - "GIFPGTPLKK", - "GIGSVLPLK", - "GIISSPLTGK", - "GILGKSMPK", - "GIMSPLAKK", - "GISETRIEK", - "GIVMPTNPK", - "GIYAGKKLFK", - "GIYPPGSPGK", - "GIYSVMIQK", - "GLAPNTPGK", - "GLAPSIRTK", - "GLFEVGAGWIGK", - "GLGPLVPGK", - "GLMQWIIRK", - "GLQETSIPK", - "GLVPAAPPK", - "GLWHMKTYK", - "GNTSTTPPTSAK", - "GPLPRTVEL", - "GPLPRTVELF", - "GPLQHGIVY", - "GPVEERLEY", - "GPVGVNVTY", - "GPYEVEVTY", - "GPYGGGGQYF", - "GQAANQTLSPQMWK", - "GQAEIIITK", - "GQAVALRAK", - "GQFIGPHRIK", - "GQFKDIITK", - "GQFPVVRDFLYK", - "GQFSGFPFEK", - "GQFSQAEALLMK", - "GQGTFTKIFK", - "GQGVNNVPK", - "GQHTVLLVK", - "GQISVVISK", - "GQKYFDSGDYNMAK", - "GQLGKPLAK", - "GQLGVGNYKK", - "GQLSVHTPK", - "GQNLHQILK", - "GQNPTNAEVLK", - "GQQTNLDRHLK", - "GQSDIAITK", - "GQSPFQQRK", - "GQTKVLTQK", - "GQTNIHLSK", - "GQYASPTAK", - "GQYGNPLNK", - "GQYSGNSFKK", - "GRLYQVEY", - "GRVGSTSENITQK", - "GSAFSTSISK", - "GSALKTSW", - "GSANLPLAK", - "GSAPRTPSK", - "GSASPAVTK", - "GSASQGGYLK", - "GSAVSTVTK", - "GSDQSENVDR", - "GSETAGPPK", - "GSFDVADRMF", - "GSFENNWNIYK", - "GSFEVVSTLIK", - "GSFLQQFLK", - "GSFRGFPALSQK", - "GSFSSENYWRK", - "GSFTVSAQK", - "GSFVGELMYK", - "GSFVYKGGKIYK", - "GSGAFGTVYK", - "GSGKVTFPK", - "GSGYPNDPK", - "GSHSMRYFYT", - "GSIAGASASPK", - "GSIEINIKK", - "GSIGGTFAK", - "GSITQGTPLK", - "GSLEKSVTK", - "GSLFLQTPK", - "GSLFLRTPK", - "GSLGFTVTK", - "GSLGGQINK", - "GSLKPHDYPK", - "GSLKQFLKK", - "GSLLAATTEAPGEY", - "GSLLWGLVK", - "GSLNWVPVTK", - "GSLPGDKIRNK", - "GSLRPFVQK", - "GSLSIATEK", - "GSLSYLN(Deamidated)VTRK", - "GSMDPSGAHPSVR", - "GSMEPAFHR", - "GSMEPGFAK", - "GSMGSFSEK", - "GSMGSPVNQQPK", - "GSMKENISK", - "GSMKENISKLLK", - "GSMPELKKYMK", - "GSMRIFTKK", - "GSMSTVVSTK", - "GSMTVVTVK", - "GSN(Deamidated)GTIIRK", - "GSNAFISQK", - "GSNFVPLKK", - "GSNGYILNK", "GSQAGGSQTLK", - "GSQFFITTK", - "GSQQTQPPQK", - "GSQTPPFKRK", - "GSQVNILSK", - "GSSANIPPLK", - "GSSASLVLK", - "GSSDVIIHR", - "GSSEPITVK", - "GSSGMGSTVSK", - "GSSGSFYLK", - "GSSLPTSSK", "GSSPEQVVRPK", - "GSSPVAMQK", - "GSSSPLYSK", - "GSSSSTFIK", - "GSSSVAAMK", - "GSSSVILEK", - "GSSTIRNLK", - "GSSWVSLPGK", - "GSSYPVCVSK", - "GSVAFDYRK", - "GSVELPIVGK", - "GSVLLFVTK", - "GSVYITLKK", - "GSWASLVQK", - "GSYDLGKKPIYK", - "GSYDPQQIFK", - "GSYESTLKK", - "GSYGRKTVLR", - "GSYIAGYLK", - "GSYIELPAYLK", - "GSYLAHTQGK", "GSYNKVFLAK", - "GSYSKAFAR", - "GSYSLEEPK", - "GSYSSHISSK", - "GSYTFDPVTK", - "GSYTLEEPK", - "GSYVTHETK", - "GTAAKSITK", - "GTADVHFER", - "GTADVHFERK", - "GTAEPGGSMK", - "GTAGLLEQWLK", - "GTAIVINPEK", - "GTAKSQFLK", - "GTAKWAWLR", - "GTAKWAWLRR", - "GTALPSLRG", - "GTAPAFKQK", - "GTAPLVAPPR", - "GTAPPPNWRR", - "GTAPSKPPLTK", - "GTASSVSYPK", - "GTASVLQPVK", - "GTASVLQPVKK", - "GTATTMVSK", - "GTAVPSTGASK", - "GTDEPIFGK", - "GTDFPDPKVKK", - "GTDGSHYWSK", - "GTDPISQTK", - "GTDRTGFTFK", - "GTDSHLVVK", - "GTDTNFEVK", - "GTEAMLVLK", - "GTEDHAWIK", - "GTEEAPKVFK", - "GTEFGGSIYQK", - "GTFAIRLLK", - "GTFANIKLFNK", - "GTFDNAETK", - "GTFDNAETKK", - "GTFEYIRHK", - "GTFGGLGSK", - "GTFGGLGSKSK", - "GTFGKVKVGK", - "GTFHWSGNEQMTK", - "GTFIWNKALEK", "GTFLEGVAK", - "GTFNPEKGKQK", - "GTFNRAMLR", - "GTFPGNYVK", - "GTFPRAFKK", - "GTFQLNSKDQGLQK", - "GTFQQMWISK", - "GTFQTTMTK", - "GTFSKLFGK", - "GTFSTVTSTVK", - "GTFTNQIHK", - "GTGASGSFKLNK", - "GTGDVKLLK", - "GTGFTPMVK", - "GTGKTLIGK", - "GTGKTTFVK", - "GTGLFIYFR", - "GTGNLGFPK", - "GTGNMEIKK", - "GTGPNVPPR", - "GTGSAIPMK", - "GTHMGPFVER", - "GTHTFDPVTK", - "GTHVWVGLYK", - "GTIDVKELK", - "GTIEKSKLITK", - "GTIEKVFVK", - "GTIEVQRGNMEK", - "GTIFAELATKK", - "GTIFGIYRK", - "GTIFGSQIK", - "GTIGHVAHGK", - "GTIGLALAR", - "GTIGLTIAK", - "GTIHAGQPVK", - "GTIIVSGSTEK", - "GTIKDIVTR", - "GTINIVHPKL", - "GTIPGNPYPK", - "GTIRSRSFIFK", - "GTISAITSK", - "GTISFFSSLK", - "GTISKAVQNK", - "GTISLRVYR", - "GTITGIARK", - "GTITPKISK", - "GTKGPSNVFK", - "GTKLPGLLK", - "GTLAEFIQK", - "GTLAQAVKK", - "GTLASVYHK", - "GTLDYILQR", - "GTLEDQLSHLK", - "GTLEQWIEK", - "GTLGGSPTK", - "GTLGKFTVPMLK", - "GTLIDNQFK", - "GTLKDLIYK", - "GTLLALLRK", - "GTLLGESLKLK", - "GTLLQVEGMLK", - "GTLMGSGLRK", - "GTLNQPLTK", - "GTLPAKLLK", - "GTLPHPLQR", - "GTLPKALTK", - "GTLPVSQPK", - "GTLQPPFTAR", - "GTLSGWILSK", - "GTLSSWNLK", - "GTLSSYIVK", - "GTLTFFKNRK", - "GTLTPARQK", - "GTLTQNEMIFK", - "GTLTVEAPMPK", - "GTM(Oxidation)EWIMIK", - "GTM(Oxidation)TGGGSKVMK", - "GTM(Oxidation)TGM(Oxidation)LYK", - "GTM(Oxidation)TGMLYK", - "GTMEWIM(Oxidation)IK", - "GTMEWIMIK", - "GTMNSYEMRK", - "GTMPLRNIFK", - "GTMPVSLLK", - "GTMTGGGSKVM(Oxidation)K", - "GTMTGGGSKVMK", - "GTMTGM(Oxidation)LYK", - "GTMTGMLYK", - "GTMTRQISR", - "GTNDGPALKK", - "GTNDVGALK", - "GTNEFKFLK", - "GTNFPNKIEK", - "GTNFTKLEK", - "GTNPGIITK", - "GTNTTGISEK", - "GTNVAKVMK", - "GTNVMVTVAK", "GTNVNMPVSK", - "GTPAGGGFPR", - "GTPDPSRSIFK", - "GTPEENQASWAK", - "GTPLETIQK", - "GTPLETIQKK", - "GTPNFPALLK", - "GTPTQPASEK", - "GTQAIAHIHNK", - "GTQDDISAAK", - "GTQGKPAIAHR", - "GTQGSPITK", - "GTQNRPLLR", - "GTQPGPLLK", - "GTQPGPLLKK", - "GTQPWFISK", - "GTQSDKVTLK", - "GTQSFVFQR", - "GTQSKAFYK", - "GTQTAVITR", - "GTQTLSGAGLLK", - "GTQTNPNIKK", - "GTQTVFPSK", - "GTQVPGTPPPK", - "GTSATEGYPK", - "GTSATEGYPKK", - "GTSDGRILK", - "GTSDRFSRILK", - "GTSDVDLDK", - "GTSDVEVNEK", - "GTSEFITGK", - "GTSELLLAK", - "GTSETSKTLK", - "GTSGELSVKEK", - "GTSGPHVGK", - "GTSITVPQK", - "GTSMWVLVK", - "GTSPPLTPR", - "GTSPTAETILK", - "GTSPTITHQK", - "GTSQLYVYR", - "GTSQTPLAH", - "GTSRNFILR", - "GTSSLFIYK", - "GTSSMIVPK", - "GTSSSAASSLK", - "GTSSVIVSR", - "GTSSVIVSRK", - "GTSTGIISK", - "GTSVPQGLLK", - "GTTAVFINK", - "GTTEWFHLK", - "GTTHNFLYK", - "GTTITLVLK", - "GTTKVDALK", - "GTVDKKMVEK", - "GTVDPQELQK", - "GTVDVTPFIKK", - "GTVEIFPIFK", - "GTVGFKISK", - "GTVIHFNNPK", - "GTVITSVIK", - "GTVKIWNMK", - "GTVRIGVAK", - "GTVSATSPNK", - "GTVTKVIPK", - "GTVTPPPRLVK", - "GTVVGLVNK", - "GTVYFKEGK", - "GTVYPETNK", - "GTWIYSVNK", - "GTWKTPSFPK", - "GTYAPAEVPK", - "GTYAPPEVPR", - "GTYDAKVKK", - "GTYDQKVQGGK", - "GTYEQDGRFEK", - "GTYGFWYPK", - "GTYGLDSVKKK", - "GTYHGM(Oxidation)TLK", - "GTYHGMTLK", - "GTYRDANIK", - "GTYSKIMNH", - "GTYTDVTPR", - "GTYTFPNGAK", - "GTYTIHAQK", - "GTYTSSMALK", - "GTYVKPLSNK", - "GTYVSSVPR", - "GVADKILKK", - "GVAFIFNQK", - "GVAGAVAVFPK", - "GVAGGSILK", - "GVAGNPMVK", - "GVAKIIISK", - "GVALALRKK", - "GVAPFTIAR", - "GVAPQPPLK", - "GVDDKFYSK", - "GVDPNQYTK", - "GVDSSIFQNPK", - "GVFEPTIVK", - "GVFGFPLGR", - "GVFGVKISVVTK", - "GVFLSLIQK", - "GVFPPLLEK", - "GVFRGPVLPK", - "GVFYSIMKK", - "GVGEVLHVK", - "GVHGGILNK", - "GVIDLIFEK", - "GVIDLVFEK", - "GVIGLLEPMKK", - "GVIGQDGLLFK", - "GVIPYFPYSK", - "GVISFAVWK", - "GVIVHIIEK", - "GVKGGDVPK", - "GVKRPREDHGRGY", - "GVLAWVKEK", - "GVLDAILATK", - "GVLDKLFGK", - "GVLDTELRYK", - "GVLGAVATK", - "GVLGGYIQK", - "GVLGGYIQKK", - "GVLGPIINK", - "GVLGSSKVLAK", - "GVLKKVIRH", - "GVLKKVIRHK", - "GVLNEFIMK", - "GVLQLGNIVFK", - "GVLTASLTIWKK", - "GVMFGDRPLK", - "GVMGDGHPLFHK", - "GVMPSHFSR", - "GVMRVGLVAK", - "GVMSPPLSR", - "GVMTPLIKR", - "GVMTVLIKR", - "GVNDAPALKK", - "GVNDSPALK", - "GVNDSPALKK", - "GVQEVQDTVLK", - "GVQGPDWHLK", - "GVQHHPPEPK", - "GVSAAFAVK", - "GVSAAIYSK", - "GVSAATFLK", - "GVSESFIGK", - "GVSEVNGMMK", - "GVSGLISLK", - "GVSGYPTLK", - "GVSKPIGVSK", - "GVSQAMQQK", - "GVSSIFIYH", - "GVSSVIHPK", - "GVSTDPQPLK", - "GVSTNANYK", - "GVSTNISTK", - "GVSTVQKAK", - "GVTDLYYILK", - "GVTDVVITR", - "GVTSQFISK", - "GVTSQFVSK", - "GVVAVLLTK", - "GVVPFSQRK", - "GVVRIYHRK", - "GVYESGPRK", - "GVYGDVHRVK", - "GVYGDVQRVK", - "GVYGSFASK", - "GVYGWTQHK", - "GVYLTKKEQKK", - "GVYSFQFNK", - "GVYSGRAHPK", - "GVYYQGGTYSK", - "GYDGYRPSF", - "GYIHPVNLTW", - "GYIHVTQTF", - "GYIPIYTPF", - "GYLPNQLFRTF", - "GYNQWQQGQF", - "GYPLWKVTF", - "GYSPYQLTW", - "HAADTSEARPF", - "HAADVFEAY", - "HAAGFAYTY", - "HAAMLGLMY", - "HAANQSYQY", - "HAANTVVY", - "HAAQFLQDM", - "HAAVDRWQY", - "HAAVPTPGY", - "HADGTIVRY", - "HADPRIQGY", - "HADVSNQLY", - "HAEGNPRQY", - "HAFESSQKY", - "HAFGGNKASY", - "HAFVDLHEF", - "HAFVELHEF", - "HAGLVYEY", - "HAGPVINTL", - "HAGSQVAKY", - "HAHLDIEAF", - "HAHVDKVTY", - "HAIMRSPQM", - "HAMEGHVM", - "HASDRIIAL", - "HASDVLLNL", - "HASGHSVAY", - "HATFNDPVM", - "HATIVSEKL", - "HATTALLHY", - "HAVDVDSGNSY", - "HAVDVDSGSVY", - "HAVETVVNM", - "HAVGPSTAM", - "HAVGPSTSL", - "HAVIDINAF", - "HAVPIYEGF", - "HAVQTVETM", - "HAVSEFIKY", - "HAVSPIAKY", - "HAVVNLINY", - "HAVVTVPAY", - "HAWKEIQRF", - "HDIDENELKEF", - "HDVLGRNW", - "HEAADQKRF", - "HEAAPGKASY", - "HEAEVLKQL", - "HEAITKVKY", - "HEAQLKN(Deamidated)GSL", - "HEDPEVKFNW", - "HEDPEVQFKW", - "HEDSLTSVAW", - "HEEEKSYLW", - "HEEEPVKKRGW", - "HEFLVKPSF", - "HEGDIILKI", - "HEGPVWQVAW", - "HEHPGNLNAW", - "HEHPVNKISF", - "HEIEALKSF", - "HEIESAGQTW", - "HEIIETIRW", - "HEILIGYLEY", - "HEIVLKVAY", - "HEIYTVGKRF", - "HELGNVFLKF", - "HELVLTTKEY", - "HEMEKAFAF", - "HEMGHIQYF", - "HEMGHIQYY", - "HENDTIAKY", - "HENEDIYKL", - "HEQEAILHNF", - "HERGGEATW", - "HESDTLRFY", - "HESGASIKI", - "HESGHALVGW", - "HESPIFKQF", - "HETEIMPVF", - "HETPTTGNHY", - "HETSNINDF", - "HEVIVPHSGW", - "HEVLTFIKY", - "HEVPYTTSF", - "HEVQLQKHL", - "HEVTVEKKW", - "HEYMDRARQY", - "HFDDFVTNL", - "HFDESMAYM", - "HFDGLIFV", - "HFDIVIRNL", - "HFDLADRMF", - "HFDLNLRQF", - "HFDLSVIEL", - "HFDM(Oxidation)AVYL", - "HFDMAVYL", "HFDPEVVQI", - "HFIAEHYM(Oxidation)F", - "HFIAEHYMF", - "HFIPYNAKF", - "HFLDRHLVF", - "HGAPHRPRWSPNW", - "HGFGNVHAY", - "HGIDPTGTY", - "HGLGPGPGGN", - "HGTEVATAF", - "HGVNSFLVY", - "HIAEPNYGK", - "HILDGSPEK", - "HIYDTKLGTDK", - "HLEEASEDKP", - "HLGNVHDQDN", - "HLVAVFNEY", - "HMDDGGYSM", - "HNVQGFHPYR", - "HPAAKMIVM", - "HPADGYAF", - "HPADMQLVL", - "HPADSPVIL", - "HPAEPPVAF", - "HPAGGIHYEM", - "HPAGIILTKVGY", - "HPAIALREY", - "HPAKQTVEAY", - "HPALAIPEL", - "HPALSIPEL", - "HPAQLTYTWY", - "HPARLTIEAY", - "HPARPTVESF", - "HPDAPM(Oxidation)SQVY", - "HPDAPMSQ", - "HPDAPMSQVY", - "HPDEKSIITY", - "HPDGVASVSF", - "HPDGVIPVL", - "HPDKDVRLL", - "HPDKKIVAY", - "HPDPDAELQRM", - "HPDPTRLLLF", - "HPDQAQAIL", - "HPDQKNINAY", - "HPDRSQPAF", - "HPDSRAIMY", - "HPDSVSSSY", "HPDTGISSKAM", - "HPDVAKVSF", - "HPDVTEAML", - "HPDVTEPMRF", - "HPEATVPQY", - "HPEDVEPAL", - "HPEFIGIKIIY", - "HPELNGATY", - "HPEPGTWDSF", - "HPEQDAGKVF", - "HPESERISM", - "HPESERISM(Oxidation)", - "HPEVTPLRF", - "HPEVVPFLY", - "HPFENMVAF", - "HPFFGRVVL", - "HPFFKDMSL", "HPFIVKLHY", - "HPFKFSDHY", - "HPFKFSDHYY", "HPFLSGAETF", - "HPFLTALKY", - "HPFLYDRETY", - "HPFPTPYSNTF", - "HPFSVIYRY", - "HPFTDGKIQF", - "HPFYTRAATM", - "HPGAATVPTM", - "HPGDQAYEF", - "HPGLILKY", - "HPGQISAGY", - "HPGSSALHY", - "HPGYFGKVGM", - "HPHDLVILM", - "HPHGLQITY", - "HPHGLQVTY", - "HPHHVHSEF", - "HPHIIAIHEVF", - "HPHIITLIDSY", - "HPHIVELLETY", - "HPHKIIVMY", - "HPHLSKGYAY", - "HPHLVAEAF", - "HPHLVAEAY", - "HPHQNLIATY", - "HPIDDLQSAY", - "HPIDGFLQSL", - "HPIEGLAVMY", - "HPIEGSTTVF", - "HPIHQGITEL", - "HPIHQRHITM", - "HPIIAPTGVTF", - "HPIIPEQSTF", - "HPIPDLTGY", - "HPIQTQAQY", - "HPIRIADGY", - "HPISDHEATL", - "HPISGHFIAEHY", - "HPISSEELL", - "HPISSEELLSL", - "HPISSEELLSLKY", - "HPISSGLEAM", - "HPITSIEY", - "HPLDVPDHIIAY", - "HPLEDRNTIEM", - "HPLEGTHEL", - "HPLGDIVAF", - "HPLGIVQGF", - "HPLGNLSAF", - "HPLGSFEQM", - "HPLGTAITKY", - "HPLHQDLHY", - "HPLINPVAF", - "HPLNTVTEDMY", - "HPLPETAVRGY", - "HPLPTVHPQVTY", - "HPLQSSTGF", - "HPLTPLITY", - "HPLTQSAVM", - "HPLYPFNDPY", - "HPMDHPSAF", - "HPMGGLNAM", - "HPMNDPTRTF", - "HPMSEYPTY", - "HPNASTVGL", - "HPNDDDVHF", - "HPNEGALVL", - "HPNGLQVMY", - "HPNGNITEL", - "HPNIITLKDVY", - "HPNLVVGGTY", - "HPNNVVSIKY", - "HPNNVVSVKY", - "HPNQEAHSL", - "HPNSAIILHY", - "HPNVQKVVL", - "HPNYLGDLIM", - "HPNYPYSDEY", - "HPPHYFFTY", - "HPPPMGEEY", - "HPPSEESQAF", - "HPPTGLEFSMY", - "HPPTGNDQAY", - "HPPWAGPQHP", - "HPQDGQVVFY", - "HPQDSAFSY", - "HPQEVYNEY", - "HPQFVTDVM", - "HPQIIIRAF", - "HPQPGAVEL", - "HPQPTQVQF", - "HPQQKVAVY", - "HPQTHETAL", - "HPQYEVVEISF", - "HPRIITEGF", - "HPSELIAEM", - "HPSFPEVSF", - "HPSGATPTL", - "HPSGNMASF", - "HPSGTVVAI", - "HPSHVQPAY", - "HPSLGHQVSY", - "HPSLQPEEY", - "HPSNVLHFF", - "HPSQHVMQY", - "HPSSTTPNL", - "HPSVDSSVL", - "HPSVSLQQY", - "HPTAFVVSY", - "HPTDDTTTL", - "HPTDITSLDQY", - "HPTDPLTSF", - "HPTIISESF", - "HPTLGPKITY", - "HPTLIQRTY", - "HPTLPAGRY", - "HPTPSPMAY", - "HPTSAASIF", - "HPTSGVIVL", - "HPTSVISGY", - "HPTSVTVTW", - "HPTVVISAY", - "HPVAKILHAY", - "HPVDFLDAF", - "HPVDNAGLF", "HPVEELLDSY", - "HPVEKKLTY", - "HPVFQQESF", - "HPVFQTQ(Deamidated)FGR", - "HPVHPFLAVAY", - "HPVILASIVDSY", - "HPVKIGDLF", - "HPVPQPLQSF", - "HPVQHISF", - "HPVQVEQDTF", - "HPVRDPVHMY", - "HPVSALMEI", - "HPVSEGTLMY", - "HPVSREWTL", - "HPVVGDLTY", - "HPVYILKGGY", - "HPWELFVKY", - "HPWEVMPDLY", - "HPWFGM(Oxidation)EQEY", - "HPWFGMEQ", - "HPWFGMEQEY", - "HPWFGMEQEYTL", - "HPWTVPTVF", - "HPYARHYYF", - "HPYKGDRAEY", - "HPYNEGYVY", - "HPYPHNHYM", - "HPYQFLLKY", - "HPYQPDPKM", - "HPYQPDPKM(Oxidation)", - "HPYRAFPVL", - "HPYSQALIQY", - "HQAAIIIQK", - "HQTVPQNTGGK", - "HSFGGGTGSGFTSL", - "HSGPVIPVY", - "HSIDGRVVEPK", - "HSLSPGPSK", - "HSM(Oxidation)DMKFTY", - "HSMDMKFTY", - "HSMDTLLATLK", - "HSMSDPGVSY", - "HSRNEGTATY", - "HSSAVAATY", - "HSSGPMVEK", - "HSYATSIRK", - "HTANIFSVK", "HTASPTGMMK", - "HTDLPSPLK", - "HTFGGPLLK", - "HTGPGILSM", - "HTISPFMNK", - "HTLDSYRILQK", - "HTLDVFKRK", - "HTLGQYFQK", - "HTMEFALVK", - "HTPKKWPKKPK", - "HTPKKWPKKPKVP", - "HTSSAIPVPK", - "HTSTVLTTK", - "HTYLANGQTK", - "HTYYKFDYK", - "HVANTLSVY", - "HVASTVQTY", - "HVASVTDSF", - "HVIDVKFLY", - "HVIETLIGK", - "HVLGAIFSK", - "HVNGIVQKY", - "HVQDVGAPK", - "HVSN(Deamidated)VTVNY", - "HVSTPLPVM", - "HVSTVNPNY", - "HVYDGKFLAR", - "HVYEIPVEY", - "HVYGLSTVY", - "HVYRNFFNK", - "HVYTPSTTK", - "HVYVGNISK", - "HWDEVKEEM", - "HWYTGEGMDEMEF", "HYDAVEAEL", - "HYDAVTGKF", - "HYDEQQNFF", - "HYDGSYSTF", - "HYDMNTASL", - "HYDPATEEF", - "HYFQNTQGLIF", - "HYIDAGYLGF", - "HYIFVTGVKF", - "HYILHNSFF", - "HYINMPVQF", - "HYKPTPLYF", - "HYLDLETTW", - "HYLDVLYKM", - "HYLNHWNHF", - "HYLNVAFDL", - "HYLPSYYHL", - "HYLPVKIIL", - "HYMPPPYASL", - "HYN(Deamidated)GTDVSF", - "HYNSDLNNLLF", - "HYNWLIYHL", - "HYPPVQVLF", - "HYSPIYLSF", - "HYSTLVHMF", - "HYTIVFNTF", - "HYTNTYHIF", - "IAGSKALEY", - "IAKIPNFW", - "IAQLLPQEDLEA", - "IASAIVNEL", - "IASDIVSRF", - "IASN(Deamidated)VTETM", - "IASSSIAAK", - "IAVFMEHSF", - "IDASRLVY", - "IDLDPETEQVNG", - "IDLDPETEQVNGLF", - "IDSQRVWAEY", - "IEADISKRY", - "IEAELNKHW", - "IEDAGNKGIW", - "IEDPQIQAHW", - "IEDVDALKSW", - "IEHGIITNW", - "IEHGIVTNW", - "IEIKFQGRW", - "IEISELPVRTW", - "IEITGAGGKKY", - "IEKEIQQKW", - "IENNHILYL", - "IENPALLRW", - "IEQEGPEYW", - "IETILVQSW", - "IEVDGKQVELA", - "IEVDGKQVELALW", - "IEVFDPDANTW", - "IEVNGKQSW", - "IFDEAEKL", - "IFDGNVAHI", - "IFDLMDAKA", - "IFDLQKTSL", - "IFDNTFSRF", - "IFDQSGTYL", - "IFDVHVHEV", - "IFEDPRLIL", - "IFFENHPYF", - "IFHDISLRF", - "IFHEVPLKF", - "IFIDKIYSI", - "IFIDPGYQTF", - "IFINLPRSMDF", - "IFIQNSKLYF", - "IFIRFPKTLF", - "IFIRNPRTLF", - "IFIRTPRTLF", - "IFIRTYLSW", - "IFKDKPIKL", - "IFKPPDPDNTF", - "IFLDHIGGTRLF", - "IFLDPHTTQTF", - "IFLDYEAGHLSF", - "IFLNKTFQW", - "IFLNLKTAL", - "IFMRVATML", - "IFN(Deamidated)QTGIEA", - "IFRPDNFVF", - "IFTDVALKF", - "IFTNTVARF", - "IFVARLYYF", - "IFVDAPLNI", - "IFVDTNLYF", - "IFVKTLVTF", - "IFVNLTVRF", - "IFYAGTGNLLL", - "IGGSFILK", - "IGLHVFPTF", - "IIAIPTGVK", - "IIAKVTAKK", - "IIDTRDAGY", - "IIGTIFIIK", - "IIHAVIQEY", - "IINLPIGSK", - "IINSSITTK", - "IIQRHLTAK", - "IISTVEVLK", - "IIVDPTTGK", - "IIYQGQYKK", - "ILAAPGILK", - "ILDPHVVLL", - "ILELAGNAARDN", - "ILFDGIPLEK", - "ILYDHAHVK", - "IMINFNPHF", - "IPAAILHAF", - "IPAAVKLTY", - "IPARIVTNY", - "IPASVEHGRVY", - "IPDASKLQF", - "IPDDLKQLY", - "IPDKFVVGY", - "IPDYTRESY", - "IPEGEILVITY", - "IPFAPGDYDVNITY", - "IPFDPKFITY", - "IPFGNNPIFRY", - "IPFNSTNKY", - "IPFPDHNQSPRNTY", - "IPFPEGMGGSVY", - "IPFPSGRTNLY", - "IPFRPSIQF", - "IPGGN(Deamidated)HSLY", - "IPHEFHTSM", - "IPHILKEMY", - "IPHLLGDVVF", - "IPHMDIEAL", - "IPHTDPVDY", - "IPHTDPVDYEF", - "IPIAGRDITY", - "IPIALSGRDIL", - "IPIANTEKY", - "IPIEPDYKF", - "IPIERLYVTY", - "IPIFAVTN(Deamidated)Y", - "IPIGGGTSVSY", - "IPIGIDKAL", - "IPIHADPRLFEY", - "IPIHNEDITY", - "IPITSNTLIYY", - "IPIYADKDVF", - "IPKLPAVSF", - "IPLDSETHNY", - "IPLHLAAQY", - "IPLPLIKSY", - "IPLPPPPAPETY", - "IPLTNDGKYVL", - "IPMDDKLLY", - "IPMEEKRGWYF", - "IPMEFVNKM", - "IPMQSEPQY", - "IPMSDPQVL", - "IPMTPTSSF", - "IPNEIIHAL", - "IPNENEAQF", - "IPNENELQF", - "IPNVQQLEM", - "IPQDQLVVM", - "IPQKFIVDY", - "IPRIEDGNNF", - "IPRNSDISQSY", - "IPSPVLVKL", - "IPSSDSRNANLY", - "IPSSVIHPAM", - "IPTDVLKIVY", - "IPTEQVNEL", - "IPTHHPRVY", - "IPTKQTQTF", - "IPTPPLPSY", - "IPTRVVTNY", - "IPVEQKEGAF", - "IPVFLRHAEL", - "IPVGTHEF", - "IPVIVTEQY", - "IPVNEKDTLTY", - "IPVPIVSEL", - "IPVPYVEKY", - "IPWGSIPVLM(Oxidation)", - "IPWKHIDYF", - "IPYGERITL", - "IPYGKEISY", - "IPYHSEVPVSL", - "IPYSEPMPLSF", - "IQFNPPLSEK", - "IQGDPLDLK", - "IQGPPGTGK", - "IQNDRQLQY", - "IQNPTMINK", - "IQSTVMLDK", - "IREADIDGDGQVN", - "ISDPTSPLRTR", - "ISEQPLPNK", - "ISFGAFVAK", - "ISGPISTSK", - "ISIMEQMRDENQ", - "ISMDLQLTNK", - "ISMLTNYTF", - "ISMPDVDLHLK", - "ISPEQPQH", - "ISQEPFVPK", - "ISSDPLEEK", - "ITDEFVKQK", - "ITGPNMGGK", - "ITHAVVIKK", - "ITNDGATILK", - "ITPSTQQHLK", - "ITQGKDAAVSK", - "ITQGNMQLK", - "ITSPSTPSK", - "ITSPVVTQK", - "ITTLFLFSK", - "ITVAYTIPK", - "ITVGDIGPK", - "ITYDTPFKR", - "ITYNVN(Deamidated)DTFHK", - "ITYPYTPQFK", "IVADHVASY", - "IVAGSLITK", - "IVAGTLTNK", - "IVAYSLKQK", - "IVEQDTMPPK", - "IVFGEQLIQK", - "IVGDPSTAK", - "IVGPNGVGK", - "IVGTLGAQ(Deamidated)AL", - "IVGTVLIIK", - "IVIETGPLK", - "IVIPPATEK", - "IVLSAVITK", - "IVMETGNTK", - "IVNASTTNK", - "IVNDFAYMK", - "IVNDFAYMKK", - "IVNHRIYYK", - "IVNPPKDLKK", - "IVQQVTGILK", - "IVSDFTIGR", - "IVSQVKVPK", - "IVTDVIATL", - "IVTKTIENK", - "IVVEHIIMK", - "IVVGTPGRLDDL", - "IVVPKAAIVAR", - "IVVPPLPEK", - "IVVPPLPGK", - "IWDPDAVKI", - "IWEPLAVKL", - "IWEQHTVTL", - "IWISKLPHF", - "IWPGGVLPKF", - "IYADPAAYVM", - "IYAPKLQEF", - "IYAPPLPSL", - "IYASVRTLL", - "IYDEDEVLL", - "IYDGPIHL", - "IYDKFIAQL", - "IYDKTSVLF", - "IYDLVDRHL", - "IYDNAVQGL", - "IYDPNLAF", - "IYDPNLAFL", - "IYDTHSLM", - "IYDVQHANL", - "IYEEEPFNF", - "IYFEYSHAF", - "IYFPKKEAVTF", - "IYGRMWYF", - "IYGSVWEKL", - "IYGYVAEQF", - "IYHQVAVQF", - "IYIAGHPAF", - "IYIDRFEDL", - "IYIDSNNNPERF", - "IYIGGQEHF", - "IYIKDYVTL", - "IYIKHPHLF", - "IYIKQIKTF", - "IYINSRSVF", - "IYISTLKT", - "IYISTLKTEF", - "IYITRQFVQF", - "IYKDYQYYF", - "IYKPVTDFF", - "IYKWITDNF", - "IYLASKNLI", - "IYLDTHFRL", - "IYLEKLKTI", - "IYLLIHNNF", - "IYLNNVIMRF", - "IYLPEVRKI", "IYLPYLHEW", - "IYLRLLVKL", - "IYLSKPTHW", - "IYMSGSHGF", - "IYPEVVHMF", - "IYPPKLHQF", - "IYPQVLHSL", - "IYPRTQLPTW", - "IYPSNMQTMLL", - "IYPTTYVQF", - "IYQDSFEQRF", - "IYQDVTLKW", - "IYQKAFDLI", - "IYQKAFEHL", - "IYQKYIARF", - "IYQRDPLKL", - "IYQREWQRF", - "IYQRHVYNL", - "IYRAQLELF", - "IYSEVATLI", - "IYSTKLYRF", - "IYTRVTYYL", - "IYTSSVNRL", - "IYVHDLLT", - "IYVHDLLTF", - "IYVIPQPHF", - "IYVISAETF", - "IYVNPANTHQF", - "IYVPDIRNVF", - "IYVPVSLGF", - "IYVTGGHLF", - "IYYKSMPNL", - "KADGVPVYL", "KAFNQGKIFK", - "KAFQATQQK", - "KAFQEGIAK", - "KAFTPFSGPK", - "KAGEVFIHK", - "KAGTELVNF", - "KALDFIASK", - "KALDKDQYLPR", - "KAMEDGGVKLLK", - "KAQLEGIIAPKK", - "KASSEMALYQK", - "KAVDITTPK", - "KAYGQALAK", - "KDRPPSAR", - "KEAAQEAVKLY", - "KEAETRAEF", - "KEALPKAAF", - "KEDDPKAAL", - "KEDEFGYSW", - "KEDGTFYEF", - "KEEAIEHNY", - "KEEDNVQKNY", - "KEEDSSGHTRAY", - "KEEEMKQMF", - "KEERAVIKAY", - "KEFDELVHW", - "KEFDKKYNPTW", - "KEFDPTITDASL", - "KEFEDGIINW", - "KEFEEARKW", - "KEFEGATLRY", - "KEFEPLLNW", - "KEFHTTGLAW", - "KEFPSILRF", - "KEGDIVTLI", - "KEGDLSTKY", - "KEGEEVYSW", - "KEGLDIYKKF", - "KEIDMLLKEY", - "KEIEILRNLY", - "KEIENLTQQY", - "KEIETQKQMY", - "KEIFLRELI", - "KEIGDVENW", - "KEIGTKQSF", - "KEIKDILIQY", - "KEIKDVKEMF", - "KEIPN(Deamidated)FPTL", - "KEIRDINRVY", - "KEIVVDGQSY", - "KELAEAASKW", - "KELEATKQY", - "KELELAHRY", - "KELENAVGSW", - "KELESIKETY", - "KELPVNAQNY", - "KEMALQKKL", - "KEMDEEDKAF", - "KEMEQFVKKY", - "KEMNDAAMFY", - "KEMTGIWRY", - "KEMVGQKMKY", - "KENGFTQHVY", - "KENPLQFKF", - "KENSIITKY", - "KENSYVKKF", - "KEQEIKKKF", - "KEQEIRNIVW", - "KEQETALRVY", - "KEQGQNLARQW", - "KEQILQQRF", - "KEQYQQQQQW", - "KESDGFHRF", - "KESEDAELLW", - "KESEVKREF", - "KESEVYKML", - "KESPLLFKF", - "KESTITRKL", - "KESTLHLVL", - "KETEIVKKL", - "KEVDDVLGGAAAW", - "KEVDVRYTEAW", - "KEVDVSKQL", - "KEVEEEERRY", - "KEVLHGKKW", - "KEWFEQRKVY", - "KEWVTPKEF", - "KEYDLAKKY", - "KEYEGEAILW", - "KEYEKALKY", - "KEYEPEMGKVY", - "KEYERFSKY", - "KEYIPPLIW", - "KEYWLVKNSW", - "KFDADPVEL", - "KFDDGAVFL", - "KFDDIRIYF", - "KFFGKDISTTL", - "KFFSEREASAVLF", - "KFFTSHNGMQF", - "KFGKKTGEGFYKYK", - "KFIDEQQILHW", - "KFIDPIYQ", - "KFIDPIYQVW", - "KFIDTTSKF", - "KFIEGVVLQL", - "KFIKNIPWNF", - "KFINVKAHHF", - "KFISQALLTF", - "KFISTSLLL", - "KFIWTNHKF", - "KFLDAGHKLNF", - "KFLDPITGTF", - "KFLDTALSF", - "KFLEHTNFEF", - "KFLESKGYEF", - "KFLGPAEHLTF", - "KFLKPIIPNF", - "KFLSDVSLKF", - "KFLVTESPAKF", - "KFMGVQMETF", - "KFMPVEGMVF", - "KFPLKIFKKPLKK", - "KFQMYVTY", - "KFSNVTM(Oxidation)LF", - "KFSNVTMLF", - "KFSPRPLKF", - "KFTPVASKF", - "KFVDSTFYL", - "KFVETHPEF", - "KFVTVQATF", - "KGEN(Deamidated)GMEDCVM", - "KGLRGSAKIWSK", - "KGNSPLLQK", - "KGSSNSYAIKK", - "KHKGKKFRPTAKP", - "KIADMGHLK", - "KIAKQIVQK", - "KIFSGVFVK", - "KIFSSLPLK", - "KIGEVSSPK", - "KIIAPLVTR", - "KIIEVHVEK", - "KILVPLVLL", - "KIMKDILEK", - "KIMKDILEKK", - "KIMSSPLSK", - "KIQPALQEK", - "KITDVALEK", - "KIYDRQVTK", - "KKFKFKFPKKQ", - "KKFPLKIFKKP", - "KKFPLKIFKKPLK", - "KKFPLKIFKKPLKK", - "KKKKYAKEAWPG", - "KKKYAKEAWPG", - "KKPKPKKVAPLKIK", - "KKTGSPEIKL", - "KKWPKKPKVPQST", - "KLEDGPKFLK", - "KLFNKFIGK", - "KLPKMKLPQF", - "KLQEAESNLRK", - "KLQETIEQK", - "KLSAPVSQK", - "KLSSLDVF", - "KLVQMKIYYF", - "KMLDNFYNF", - "KMMADYGIRK", - "KMPKFKMPSF", - "KMPKFSMPGF", - "KMPKMKMPKF", - "KMPKMKMPTF", - "KMPKVKMPKF", - "KMYEEFLSK", - "KNDTGFQEGY", - "KNPKKTKWWYHDD", - "KPDSTLHTY", - "KPEEIQTVY", - "KPFNPLLGETY", - "KPIESFNEY", - "KPITTGGVTY", - "KPIVFVGTGQTY", - "KPLAALVTY", - "KPMGKVVTY", - "KPNGLILQY", - "KPVDPIVGY", - "KPVEDILTY", - "KPVEGYDISF", - "KPWMEKNQTF", - "KPWSQHYHQGYY", - "KPYAFDRVF", - "KQ(Deamidated)LHERQPR", - "KQ(Deamidated)REN(Deamidated)Q(Deamidated)KF", - "KQLAVYEEF", - "KQMEQVAQFLK", - "KQQTIPLKK", - "KRALEVFK", - "KSDAEQYLK", - "KSFDEQNVPK", + "KFALN(Deamidated)YLQL", "KSFDTSLIRK", - "KSFFDVALK", - "KSFGELVHK", - "KSFTPDHVVYA", - "KSFTPDHVVYARSK", - "KSGTPLSFK", - "KSIDFPLTK", - "KSIIPTVGK", - "KSIQSGPLK", - "KSLLWTETF", - "KSMDRVYGK", - "KSMNANTITK", - "KSQQALVQK", - "KSSDFAVLK", - "KSTELLIRK", - "KSTTTGHLIYK", - "KSYFSGLSK", - "KSYYSKHLK", - "KTAEDAKDFFK", - "KTAPPGSAVGK", - "KTETNVYFK", - "KTETPIVSK", - "KTFALPGIIK", - "KTFALPGIIKK", - "KTFEGNLTTK", - "KTFGETHPFTK", - "KTFKTGSILK", - "KTFPYQHRY", - "KTFTKWVNK", - "KTGEVLDTK", - "KTIAIGKVLK", - "KTIAPALVSK", - "KTIDASVSKK", - "KTIDMELVKRK", - "KTIHAELSKLVK", - "KTIQVPQQK", - "KTISQAVNK", - "KTIVFVETK", - "KTLDAEVVEK", - "KTLDEILQEKK", - "KTLDHVLTH", - "KTLDQAIMK", - "KTLDQAKAVLK", - "KTLEDFRVK", - "KTLEEAVGNIVK", - "KTLKWLEKK", - "KTLPYPLKK", - "KTLQDIVYK", - "KTLVFEQRK", - "KTMKDFVRR", - "KTMPTTFNR", - "KTNLTSVTK", - "KTPTSPLKMK", - "KTQEIFHSK", - "KTQGSETAGPPK", - "KTQNVFLTR", - "KTQPPLMKR", - "KTQTIFLKY", - "KTSGSNVKIVK", - "KTSSAFVGK", - "KTSTVPPSLRK", - "KTTLQKMGKK", - "KTVIEPLKK", - "KTVPVEAVTSK", - "KTYETTLEK", - "KTYGEIFEK", - "KTYIPPKGETK", - "KTYIPPKGETKK", - "KTYQDIQNTIK", - "KTYQEVAQK", - "KTYTKSSHLK", - "KVAENVIRQK", - "KVAGAATPK", - "KVAPAPAVVK", - "KVATTVISK", - "KVAVATPAK", - "KVAVVLIQK", - "KVFAGYYTK", - "KVFDAKPSAK", - "KVFDINLKEK", - "KVFEEPEDFLK", - "KVFGGTVHK", - "KVFGGTVHKK", - "KVFGNEIKLEK", - "KVFKQIFSK", - "KVFNQPKAK", - "KVGENVLPPK", - "KVGEVIVTK", - "KVGTFGIFK", - "KVIDPVTGK", - "KVIDRILYK", - "KVIGIAIMK", - "KVISSSSSFAK", - "KVLDAIIQEK", "KVLHFFNVK", - "KVLPLLKIIKK", - "KVMEHVYEK", - "KVMTKVIKK", - "KVNIIPIIAK", - "KVNTVPLKNK", - "KVPDQKGTPK", - "KVPSDTLPLK", - "KVQDAFISY", - "KVQDSVLIK", - "KVQDVKKTIQK", - "KVQEKYVWNK", - "KVQELQNLLK", - "KVQEMNYIQK", - "KVQSKVNLK", - "KVQTAVTMK", - "KVQTEVLQK", - "KVSGDIFSR", - "KVSQVIMEK", - "KVSYSHIQSK", - "KVTDPSVAK", - "KVTEGSFVYK", - "KVVDSLYNK", - "KVVEGSFVYK", - "KVVENVIAK", - "KVVNPLFEK", - "KVYDKAINR", - "KVYGPGVAK", - "KVYNGILEK", - "KVYTKSSHLK", - "KWFFQKLRF", - "KWLDTQVVL", - "KWLEPLKNLRF", - "KWLTKSFHF", - "KWMGIAFRI", - "KWPDRITLL", - "KWPKKPKVPQS", - "KWPKKPKVPQST", - "KWSNNFIR", - "KYADKIYSI", - "KYAPRFNGF", - "KYEAIQLTF", - "KYEELFPAF", - "KYELDFSHF", - "KYFLWEEKF", - "KYGDILHVI", - "KYGIQMPAF", - "KYGMVTYLL", - "KYGPVFSF", - "KYGQGFYLI", - "KYGSVIQLL", - "KYGVVIASF", - "KYHTHLLQF", - "KYIATDFTL", - "KYIDFDHVF", - "KYIDKTIRV", - "KYIDKTIRVKF", - "KYIDQGIAEL", - "KYIDQKFVL", - "KYIDYIFNV", - "KYIEEQLLQRI", - "KYIEGVSDF", - "KYIENLDNITF", - "KYIERIITRF", - "KYIFKERESF", - "KYIGENLQL", - "KYIGFLVRL", - "KYIKDDFRF", - "KYINTDAKF", - "KYIPYKYVI", - "KYIQRQETI", - "KYISKPENL", - "KYISKPENLKL", - "KYITDVVKL", - "KYITDWQNVF", - "KYITEVSRW", - "KYITKSFNF", - "KYITKSFNFY", - "KYITQGQLLQF", - "KYKDIYTEL", - "KYLAEKYLQKL", - "KYLALRIAL", - "KYLATLETL", - "KYLDEDTIYHL", - "KYLDEFLLNKI", - "KYLDIHERM", - "KYLDVHSMHQL", - "KYLDVKFEYL", - "KYLEENVMRHF", - "KYLEERAMRQF", - "KYLEESTIRHF", - "KYLEETNSL", - "KYLEHPLLL", - "KYLEKKINQRF", - "KYLGQLHYL", - "KYLKEVLRI", - "KYLKTGFLKW", - "KYLKTGFLKWK", - "KYLLHSLVF", - "KYLLKLKFNF", - "KYLPENDLKRL", - "KYLPEWSAW", - "KYLPEWTAW", - "KYLPYNHQHEYFF", - "KYLQSTISF", - "KYLSGIAHF", - "KYLSGLVDKF", - "KYLSVQGQLF", - "KYLTAEAFGF", - "KYLTEGLLQF", - "KYLTVKDYL", - "KYLTVNKRL", - "KYLYVDKNF", - "KYM(Oxidation)DINFDF", - "KYM(Oxidation)DVQFDF", - "KYMDIEFDF", - "KYMDINFDF", - "KYMDVQFDF", - "KYMEDYHQF", - "KYMLKANLI", - "KYMPNVKVAVF", - "KYMTAVVKL", - "KYNANFVTF", - "KYNDNFFGL", - "KYNLINEYF", - "KYPDIVQQF", - "KYPDRVPVI", - "KYPENFFL", - "KYPHYFPLL", - "KYPHYFPVM", - "KYPNVFKKI", - "KYPSDLPYM", - "KYPVEWAKF", - "KYQDVYVEL", - "KYQEEFEHF", - "KYQELQVLF", - "KYQEVTNNL", - "KYQEVTNNLEF", - "KYQIINEEF", - "KYQKGFSLW", - "KYQNVKHNL", - "KYQPPPPP", - "KYQPRFHIV", - "KYQPRIAVF", - "KYRRYHPLF", - "KYSDITIMF", - "KYSLIKGNF", - "KYSLVKNKI", - "KYSPFVVSF", - "KYTKIFNDF", - "KYTPPPHHI", - "KYVAEFLEW", - "KYVDLTVSF", - "KYVERIHYI", - "KYVESFRRF", - "KYVHLFPKL", - "KYVKDFHKF", - "KYVKIFDNF", - "KYVKILYDF", - "KYVKVFDKF", "KYVKVFHKF", - "KYVKVFHQF", - "KYVKVFNKF", - "KYVKVIHKF", - "KYVKVKVNF", - "KYVKVLHQF", - "KYVSGEFRF", - "KYVSSVLSF", - "KYVTSAYQW", - "KYVTVYNLI", - "KYVYVVTEL", - "KYYDKKYQVF", - "LAMEHGGSY", - "LAN(Deamidated)GSYDLANRDF", - "LASKEIHQF", - "LASQQNQSGPSG", - "LASQQNQSGPSGN", - "LASQQNQSGPSGNN", - "LEADLKHRF", - "LEADLPRSW", - "LEADPYSKW", - "LEALAKATY", - "LEDDFKEGY", - "LEDPEGVKRF", - "LEDSVAKTF", - "LEEPTVIKKY", - "LEFEGVKEKF", - "LEFGRGFMY", - "LEGNPDTHSW", - "LEHEYIQNF", - "LEHNEAYTW", - "LEHSFIKRY", - "LEHVPNSVRLW", - "LEKSFYQF", - "LELDPMAMTQKY", - "LESEQKQQF", - "LESGVPSRF", - "LEVDATSKY", - "LEVDLKNGY", - "LFDDIDHNM", - "LFDHAVSKF", - "LFDLGGQYL", - "LFHPSNVEM", - "LFIATSQKF", - "LFLPRTDYSF", - "LGISNLSQVRA", - "LGTYVAVFDRGD", - "LIYVAGGLTK", - "LKAVPSQKRT", - "LLEPYKPPSAQ", - "LLPGKTYSF", - "LLPSRQFGF", - "LLVVYPWTQR", - "LLYYSRTMAK", - "LMHPDALEEPDDQN", - "LNETGDEPFQYKN", - "LPAAAQDVY", - "LPAAAQDVYY", - "LPADIQAQF", - "LPADVQNYY", - "LPAEHQFSF", - "LPAGEYHKVY", - "LPAGPDILRTY", - "LPAKDIQTNVY", - "LPAKILVEF", "LPALLEKNAM", - "LPAPGGMANLPF", - "LPAPGVPAW", - "LPAPPHIDVMY", - "LPAPPTQNM", - "LPAQGLIEF", - "LPAQLLELY", - "LPAQQVHNY", - "LPAREATQF", - "LPARIDAAY", - "LPASGRSAEVTL", - "LPASVHPQL", - "LPDDWDNRTSY", - "LPDEIYHVY", - "LPDERTISL", - "LPDKSIASL", - "LPDKTIASL", - "LPDLNHSQVY", - "LPDNHSSLIY", - "LPDQKQLRY", - "LPDTLKVTY", - "LPEEEQQRVL", - "LPEEHARFY", - "LPENYQMKY", - "LPEPVHGVAF", - "LPEPVVARF", - "LPEQSPVSY", - "LPESTHVEF", - "LPETSKYEY", - "LPEYNTRI", - "LPFDKETGF", - "LPFDLRASF", - "LPFEVKAGF", - "LPFFTEREQTL", - "LPFGKVTNL", - "LPFHTSTEM", - "LPFHTSTEMF", - "LPFKSPIRDISY", - "LPFLKPDDIQY", - "LPFLPSTEDVY", - "LPFMEDLRQY", - "LPFPDETHERY", - "LPFPIIQQY", - "LPFPKDASL", - "LPFRATENDIANFF", - "LPFSSMPTAY", - "LPFTPLSY", - "LPGKFEDMY", - "LPGSIQHVY", - "LPHAPGVQM", - "LPHAVQETF", - "LPHFIKDDY", - "LPHIPLKSF", - "LPHKDQRQM", - "LPHLADLVSY", - "LPHLIQDAGQFY", - "LPHMHNIVEY", - "LPHQPLATY", - "LPHSATVTL", - "LPHSGEAQL", - "LPIDGANDLF", - "LPIDPNEPTY", - "LPIEAPIRM", - "LPIENDTYKY", - "LPIENDVYKY", - "LPIESNPHSF", - "LPIGDVATQY", - "LPIGDVATQYF", - "LPIKDGKLVF", - "LPINDPLQTVY", - "LPINHQIIY", - "LPKEDLIKF", - "LPKKDIIKF", - "LPKKEDALLY", - "LPKNDLITY", - "LPLEEAYRF", - "LPLEEHYRF", - "LPLERDAESF", - "LPLLPNVSY", - "LPLNTNIRLAY", - "LPLPAPHAQY", - "LPLPDPLKY", - "LPLPNFSSL", - "LPLSHLVMY", - "LPLSIEGHVHY", - "LPLTHFELY", - "LPMKETGLMY", - "LPMKVVDMF", - "LPNDGDEKY", - "LPNEGRNDY", - "LPNFKQNEF", - "LPNIEERIM", - "LPNKDGVVRF", - "LPNNIVDVW", - "LPNPEDVKM", - "LPNQLFRTF", - "LPNSVHEY", "LPPGSVISY", - "LPPGVHISY", - "LPPKIVIGY", - "LPPNTIMEY", - "LPPPSDPQY", - "LPQDVILKF", - "LPQEAFEKY", - "LPQGEKVQAM", - "LPQGPLGTSF", - "LPQHPDVEM", - "LPQHQVPAY", - "LPQPDPQQM", - "LPQPPEGQTY", - "LPQTSHVSF", - "LPRDYLATY", - "LPREEGPYEVEVTY", - "LPREELWIY", - "LPREGEQNF", - "LPRHLEIIY", - "LPRNEADEL", - "LPRSESTENQSY", - "LPRTDYSF", - "LPSDKALVL", - "LPSDTRLVL", - "LPSEHQTIL", - "LPSEIEVKY", - "LPSELERSY", - "LPSENHKEM", - "LPSHTKIKY", - "LPSMPEPAL", - "LPSNDPVVM", - "LPSNDSSKF", - "LPSPSDTTSVY", - "LPSPVTAQKY", - "LPSSEVVKF", - "LPTADIAQF", - "LPTDSATVL", - "LPTEAEWEY", - "LPTEEEWEF", - "LPTEKEVAL", - "LPTENELTF", - "LPTENVDKM", - "LPTEPPYTAY", - "LPTFQSPEF", - "LPTGIPIVY", - "LPTGRSIAF", - "LPTKQNEEF", - "LPTLPAKVY", - "LPVALQTRL", - "LPVDFSNIPTY", - "LPVDKPVGM", - "LPVDLAEEL", - "LPVEHVNQL", - "LPVEKLPKY", - "LPVEVATHY", - "LPVKGFRSY", - "LPVPNLDPDTY", - "LPVSEQQERAF", - "LPVSGNLIDLY", - "LPVSKPESY", - "LPVTQQMTEM", - "LPVVDFNEM", - "LPVVPKATY", - "LPWKAFTY", - "LPWSADRAIQQF", - "LPWSGISSKSGIEY", - "LPWVGKELY", - "LPYDASKWEF", - "LPYDLRASF", - "LPYEEEIMRNQF", - "LPYGPEVDIW", - "LPYKATENDIY", - "LPYKITAEEMY", - "LPYLEHVGHN(Deamidated)HTY", - "LPYNHQHEY", - "LPYPDPAIAQF", - "LPYPPEPGAASLYY", - "LPYRATENDIY", - "LPYTVVIHY", - "LQIQQGLQTL", - "LQNEPLPERL", - "LQQMQNPESL", - "LRFDGALNVD", - "LRQYGQTVAT", - "LSALEEYTKKLNTQ", - "LSATVTPQK", - "LSFDRILKK", - "LSFSSSAGPGLLK", - "LSMDHFTQPAK", - "LSQPKIVKWDRDM", - "LTEAPLNPK", - "LTGPVMPVR", - "LTMPGGVAK", - "LTNHFSFEK", - "LTSGIFETK", - "LTYNDFINK", - "LVFEWTIVK", "LVFPSEIVGK", - "LVHQVFSEK", - "LVIPFAVRK", - "LVIPFTIKK", - "LVNSVNSKI", - "LVQKAILQK", - "LVSESSDVLPK", - "LVSFPIGIYK", - "LVVYPWTQRF", - "LYADVGGKQF", - "LYANMFERL", - "LYDEAIRHF", - "LYDIILKNF", "LYDLVTEKM", - "LYDPVISKL", - "LYDTHITVL", - "LYDTHQNL", - "LYDVPANSM", - "LYEKDIQLF", - "LYFHINQTL", - "LYGDKWNSF", - "LYIDEAHSI", - "LYIDFGGKF", - "LYIDFRQ(Deamidated)DL", - "LYIGWDKHYGF", - "LYIVEPLKF", - "LYIVHPTMF", - "LYIYPQSLNF", - "LYKKTQETL", - "LYLDKATLIW", - "LYLEPQGTLF", - "LYLKALEGF", - "LYLKVKGNVF", - "LYLPPMRKID", - "LYMRIRDNW", - "LYPDHFHLL", - "LYPEIFEKF", - "LYPEVFEKF", - "LYPPRQPTF", - "LYPQFM(Oxidation)FHL", - "LYPRLYPEL", - "LYQDGVFKF", - "LYQEIIHYF", - "LYQRAFQHL", - "LYSGVHKK", - "LYSSKLYRF", - "LYTEKFEEF", - "LYTPVLIRF", - "LYVYPHSLNF", - "LYWSHPRKF", - "M(Oxidation)ATSTPVARGG", - "M(Oxidation)EAPAQLLF", - "M(Oxidation)PKFSMPGF", - "M(Oxidation)PQGGGQHY", - "M(Oxidation)PVGPDAILRY", - "M(Oxidation)QKQDLSK", - "MADENKNEY", - "MAHSFGESY", - "MAIEAQQKF", - "MASRTSSEM", - "MATAASSSSL", - "MATAASSSSLEKS", - "MAVEGDHSM", - "MAVIDGNVM", - "MAWLVDHVY", - "MAYGHIDSY", - "MAYTGKYFDK", - "MEADPELSKF", - "MEAIPVKQF", - "MEAKVENEY", - "MEAPAQLLF", - "MEEEKAKKSF", - "MEEGEFSEAREDM", - "MEFLFNKTGW", - "MEHANQQTGF", - "MEIAKQNW", - "MEIGMKVAL", - "MEKIWHHTF", - "MELDDTLKY", - "MELDEALRKF", - "MELDGPKGTGY", - "MELPDYRQW", - "MENANVLARY", - "MENDRVQLL", - "MENGIVRNW", - "MENLFINRF", - "MEPSTAARAW", - "MEQEGSEYW", - "MEQNTEGVKW", - "MEQPIKVT", - "MEQPIKVTEW", - "MESDFEQKL", - "MESTESRHY", - "METDARSSL", - "MEVELPYRY", - "MEVEVDGQKF", - "MEVPTYLNF", - "MEWQPEEQAW", - "MFDIVGTHL", - "MFDKDVVML", - "MFDRHSSL", - "MFINIKSI", - "MGATPTPFK", - "MGDPGARVY", - "MLASQQNQSGPSG", - "MLASQQNQSGPSGN", - "MLDPLEVHL", - "MPAAQEGAVAF", - "MPADTNKAF", - "MPAETIKEL", - "MPANMDKHAL", - "MPAPHTSITM", - "MPAVKAIIYQY", - "MPDEATPHY", - "MPDGKLYNF", - "MPDHTDVSL", - "MPDHVIPEI", - "MPDNTAAQKVSH", - "MPDPLLTRELY", - "MPEDLVEAL", - "MPEDVKNFY", - "MPEGEKLVNYY", - "MPEGGGALAEGF", - "MPEGGQGAPPMY", - "MPEKEPSVL", - "MPEPDAQRFF", - "MPEPQAPGRYF", - "MPEPTVLSL", - "MPEQIVIHAL", - "MPETTETVL", - "MPFAPAIQTF", - "MPFPNIRSAEL", - "MPFSPYEPL", - "MPFSPYEPLNFHAM", - "MPGEFDPTNY", - "MPGPPAHGF", - "MPHDLITQL", - "MPHPETKKDLY", - "MPIGGDVPAL", - "MPILKDVATVAF", - "MPIPGGNQRF", - "MPISELQGRW", - "MPITEVFKEEM", - "MPKFSMPGF", - "MPKISMPGF", - "MPKMDQDSL", - "MPKSDVNKEYY", - "MPKSEVASSVF", - "MPKVHIEF", - "MPLEDMNEF", - "MPLEEGDTF", - "MPLGARILF", - "MPLGHIMRL", - "MPLHVAPLL", - "MPLPGTKALPSM", - "MPLPHAEKKSRPSM", - "MPMADGREFNL", - "MPMPMGYNPYAY", - "MPNENIPEL", - "MPNGDHIVSA", - "MPNGWQVPAY", - "MPNHSASIQL", - "MPNPEGRYTF", - "MPNSASRDEF", - "MPNSPAPHF", - "MPNVKVAVF", - "MPPQNVGEVY", - "MPQGAPRLY", - "MPQGGGQHY", - "MPQHIMAIL", - "MPQKERESIM", - "MPQTHHHAL", - "MPRDIYQDY", - "MPRVQTQQY", - "MPSASMTRL", - "MPSEDVVSL", - "MPSHLGTYY", - "MPSHPDRAY", - "MPSKVVILRY", - "MPSPATLSH", - "MPSPIPAKY", - "MPSPVSPKL", - "MPSQSVEQTY", - "MPSRELASM", - "MPSSAVRVL", - "MPSSDTTVTF", - "MPSSSHGSM", - "MPSSVPLRA", - "MPSVKVSVF", - "MPTIQITAL", - "MPTQEVQEL", - "MPTRPVPSY", - "MPTSQSPAV", - "MPTSTILRL", - "MPTVHYEF", - "MPVAAREASIY", - "MPVAQQPVY", "MPVDPNEPTY", - "MPVDSFNSMLSRY", - "MPVDVAMRL", - "MPVEKN(Deamidated)ITL", - "MPVEKNITL", "MPVGMTHGL", - "MPVGPAPGM", - "MPVGPDAILRY", - "MPVHAAVQM", - "MPVHMVPTEL", - "MPVLEQSVL", - "MPVNTNQNF", - "MPVPAAAGAQQ", - "MPVPGHDVEAY", - "MPVPTTPEF", - "MPVRGPDVEAY", - "MPVSSQHRY", - "MPWGDPNYRSANF", - "MPYDTPVPGY", - "MPYGSRENSLLY", - "MPYKGMTTVDDF", - "MPYKGMTTVDDFF", "MPYKVFHY", - "MPYPGGQGEAERF", - "MPYSHPSSY", - "MPYSVIRGEAF", - "MQIQQGLQTL", - "MQNMSIHTK", - "MTGGGSKVMK", - "MTGYGMPR", - "MTMDKSELVQK", - "MTMDRPLSH", - "MTSTMTIGK", - "MVAPAVQEK", - "MVGVNLPQK", - "MVHSEVAAY", - "MVIDLEKQIEK", - "MVLSVFIGK", - "MVSAEISENRK", - "MVVSDFHVF", - "MWKEGNRIHF", - "MYIFKQPHF", - "MYIKQVIIQGF", - "MYINDKLPYF", - "MYIRYIHKL", - "MYLGYEYVTAIR", - "MYLKTVDKF", - "MYPDVFAHF", - "MYPPAFRF", - "MYRLYMAED", - "MYSDVWKQL", - "N(Deamidated)AAKIFNLY", - "N(Deamidated)ETDSTVLVRW", - "N(Deamidated)LANGSYDLANRDF", - "N(Deamidated)VIRDAVTY", - "NAAKIFNLY", - "NAAKVFNLY", - "NAANIFERL", - "NAAPPPVTY", - "NAAQTSVAY", - "NAARDFVNY", - "NAARSQLETY", - "NADPQAVTM", - "NADPQAVTM(Oxidation)", - "NAESGRGQVM", - "NAESGRGQVM(Oxidation)", - "NAFEHGGEFTY", - "NAFEVAEKY", - "NAFKEITTM", - "NAFLDKGEFY", - "NAHSNILK", "NAIEDTIFY", - "NAIHAILLY", - "NAIKESYDY", - "NAIKWNFTK", - "NAISVTTSY", - "NAITLPEEF", - "NAKDVAVSY", - "NALGLDQQF", - "NALNEQRVEF", - "NALNHTEQY", - "NANDITQSL", - "NAQRQDIAF", - "NASRDQVVY", - "NAVAGAVKY", - "NAVDALIDSM", - "NAVDDRGLY", - "NAVEENKAF", - "NAVKDFTSF", - "NAVNLAIKY", - "NAVVTVPAY", - "NAWNNLEKY", - "NEAEFHKPDY", - "NEAGPPEGY", - "NEAIASFVKKY", - "NEAPGPINF", - "NEAPVYSVY", - "NEAQAIETARAW", - "NEAQTAKEF", - "NEARLRNLTY", - "NEASVLHNL", - "NEAVLHLRF", - "NEDEDSPNKLY", - "NEDEIKKAY", - "NEDEPIRVSY", - "NEDLIKHGW", - "NEDLRKELW", - "NEDNGIIKAF", - "NEEGEAQKF", - "NEEHFRGQEF", - "NEFLDAEGRTW", - "NEFPEPIKL", - "NEFPVPEQF", - "NEGAAGVDRW", - "NEGDLFHRLW", - "NEGRPRIKTW", - "NEGTGKSSW", - "NEHAPAYSY", - "NEHDYAKAAF", - "NEHGNVPLHY", - "NEIDDMQVF", - "NEIDWLKRI", - "NEIEDTFRQF", - "NEIHKGKSY", - "NEIKVYITF", - "NEIQEALSRSY", - "NEIQKNIDGW", - "NEISERVVQHF", - "NEITIPVTF", - "NEIVQSNLF", - "NELGVGGTSQW", - "NELNIIHKF", - "NELPGLKW", - "NELSDMSRMW", - "NELVSTHGY", - "NEMEAPTTAY", - "NEMIEKREF", - "NEMMSKEQF", - "NEMQPNGKVF", - "NENAVVKRM", - "NENDIITHF", - "NENDIRVM(Oxidation)F", - "NENDIRVMF", - "NENHSGELW", - "NENINLGKKY", - "NENLGTVKKEW", - "NENNGVLKKF", - "NENPLRALY", - "NENPSKDQGW", - "NENSLFKSL", - "NEPILYGRSY", - "NEQDLGIQY", - "NEQPRQLFW", - "NEQSLEQVF", - "NESAIFHGW", - "NESDMIRNW", - "NESEEVRQF", - "NESEPIVVY", - "NESEYTVKW", - "NESIESIKW", "NESLFGKKY", - "NESSVLHTL", - "NETDTPAQL", - "NETLIVSKF", - "NETSTGKTF", - "NEVDGEYRY", - "NEVEPGYYF", - "NEVEQLLYY", - "NEVEQRHTL", - "NEVFLAKLI", - "NEVIMTIGF", - "NEVKSVAW", - "NEVKVEESSW", - "NEVPEEKLY", - "NEVPEVTVF", - "NEVSKIVQTY", - "NEVSVIKEGW", - "NEVTTEIR", - "NEVTTEIRF", - "NEVVAGIKEY", - "NEVVAIKKM", - "NEVVGRLI", - "NEVYEAVKNY", - "NEWVVRLYY", "NEYESRSLW", - "NFDLTKNYL", - "NFDNPVYL", - "NFISVRQQF", - "NFLSRSFYW", - "NFN(Deamidated)QTIATL", - "NFNQ(Deamidated)TIATL", - "NFPKGMLLRF", - "NFTNVAATF", - "NFTSTHLLL", - "NFVSAGIQTSF", - "NHINVMVKF", - "NHYTQKSLSLSPG", - "NIAEALVSK", - "NIHDIKLLF", - "NLANGSYDLANRDF", - "NPADITVLF", - "NPADSISHVAY", - "NPAPNPAVY", - "NPASPLPSF", - "NPDDVFREF", - "NPDPAVYQL", - "NPDTHSWEM", - "NPEAAVHIF", - "NPEHASVAM", - "NPENLATLERY", "NPFEKGDLY", - "NPFHWGEVEY", - "NPFNMPNLY", - "NPGNPHNVY", - "NPHEVQPAY", - "NPHEVQPSY", - "NPHHDNVRY", - "NPHNDIQAF", - "NPHNGQVSY", - "NPIDHVSFY", - "NPIPFPETF", - "NPISGLLEY", - "NPISTVTEL", - "NPISVYIGY", - "NPITTSKITY", - "NPITVQTVY", - "NPLAATHEF", - "NPLDEQHIF", - "NPLKGDLANTF", - "NPLQKDPQY", - "NPNEEVAR", - "NPNEEVARF", - "NPNEEVARFY", - "NPNSPSITY", - "NPPDHDVVAM", - "NPPEFLHETY", - "NPSGNLTETY", - "NPTDAFTVF", - "NPVDIVSTL", - "NPVDWKEKY", - "NPVDWKEQY", - "NPVEDKDAVAF", - "NPVELKALY", - "NPVENIIRF", - "NPVGGLLEY", - "NPVGTGFSY", - "NPVINIASM", - "NPVMSTVAF", - "NPVNYGRPY", - "NPVQALSEF", - "NPVSWVQTF", - "NPWDNKAVY", - "NPWSTAIVAF", - "NPYHNEPGF", - "NPYHVVILF", - "NPYKNLPIY", - "NPYPGDVTKF", - "NPYRDLQIY", - "NPYSGDLTKF", - "NPYSNDILEY", - "NPYVKVNVY", - "NQEKHFYTF", - "NQQPSNYGPM", - "NRGDSTFESKSYK", - "NSMGLFLQK", - "NTDQGVYL", - "NTIGKEEIQQR", - "NTITPVVGK", - "NTMNITISK", - "NTMQQFLQK", - "NTNGFIIAK", - "NTNIPIGNK", - "NTSTTPPTSAK", - "NVADLHEKY", - "NVADVVIKF", - "NVATTLPSY", - "NVHDIMVSF", - "NVHNLAIVF", - "NVIESKAYVGR", - "NVIGVTLKF", - "NVIHNLATY", - "NVIRDAVT", - "NVIRDAVTY", - "NVLDDVYEY", "NVLDIMVTK", - "NVVKLLGEQY", - "NVYDFKTTY", - "NVYEVVNPK", - "NWIEGNPKLSF", - "NWVPTAYTW", - "NYAQVLDKF", - "NYAWVYYHL", - "NYDEALRLL", - "NYDFGPIHM", - "NYDLALKYF", - "NYEDMQEITQHF", "NYFHLAVAF", - "NYFLWTEKF", - "NYGHVYAVF", - "NYGLRTFLF", - "NYGRVFSEW", - "NYIDKVRFL", - "NYIEKVVAI", - "NYIGISLRI", - "NYIGLINRI", - "NYIHVGAQL", - "NYIMKIHNF", - "NYINQGVSHALTW", - "NYIPYLTKL", - "NYISGIQTI", - "NYITAALKL", - "NYLDPRISIAW", - "NYLDPRITVAW", - "NYLHLDYNF", - "NYLNHWNHF", - "NYLNQGVVHSITW", - "NYLSHHLTI", - "NYLSIFRKF", - "NYLTKIYGL", - "NYN(Deamidated)NQSSNF", - "NYN(Deamidated)QTVSRM", - "NYPETLGRLLI", - "NYQKRFQNL", - "NYSNIRFQF", - "NYSPYVNYF", - "NYVEVTRKW", - "NYVPMTPGTFDF", - "NYVPVNHFW", - "PAFELDSSKRD", - "PAPPPPPPP", - "PEHDPIRDQSW", - "PFAPAIQTF", - "PFIDSQHVI", - "PFLDIQKRF", - "PFLPQLQT", - "PFVDHVFTF", - "PFYRGERITF", - "PGLARQAPKPRKQ", - "PGSYLPSSYSF", - "PGYIDFTADQ", - "PIQTLVNM", - "PLGASSLTY", - "PLKTSPLQ", - "PNAKALN(Deamidated)GF", - "PQKPQTNK", - "PSPPPPPPP", - "PSTPIAHR", - "PTAGPLAQK", - "PTSPIRVK", - "PVATWNIYRY", - "PVDFQGRSTGEAF", - "PYADQVFRI", - "PYFNAPVYL", - "PYISNIYLI", - "PYLDNLPNF", - "PYLFHVVTF", - "PYLQDVPRI", - "PYLWWKKYI", - "PYMAKFVVF", - "PYMDSPQSIGF", - "PYNDYFEYF", - "PYNPLWAQL", - "PYVDNSYKW", - "PYYPSPGVLF", - "Q(Deamidated)ADFALEAL", - "Q(Deamidated)VVLN(Deamidated)GMESY", - "QAADIDTRSEF", - "QAAMPQVSY", - "QAEATAQTL", - "QAEEKAHAF", - "QAFESSQKY", - "QAIEDMVGY", - "QAKQESTEY", - "QALLDLHAL", - "QAMVFPYHR", - "QANDDARTF", - "QANPILEAF", - "QAQEVFFLK", - "QARIEIESF", - "QASDVSVKY", - "QASQPTPEK", - "QASSAAFRY", - "QAVADAVTY", - "QAVGAVKAL", - "QDHLSWEW", - "QEAASLLGKKY", - "QEADGQKISW", - "QEADIQNSKF", - "QEAEAAQRL", - "QEAEEPKARVL", - "QEAEERPKM", - "QEAELFRKI", - "QEAGIKTAF", - "QEAGPKPNL", - "QEAGTKARF", - "QEALHTQML", - "QEALPEKSL", - "QEALQKAKKY", - "QEAQIMKKL", - "QEDAARLQAAY", - "QEDEVMRAY", - "QEDLRTFSW", - "QEDPNYSPQRF", - "QEDQGLTKDY", - "QEDQHRINY", - "QEDRALRSF", - "QEDRPGLHAY", - "QEDVNKPAW", - "QEEEGSALKTSW", - "QEEEVRTLF", - "QEEIGSRNFF", - "QEEKGKITF", - "QEELAEMKRY", - "QEELAGLQRHW", - "QEELVKISL", - "QEEPGKGSFW", - "QEEPPLN(Deamidated)PHGAA", - "QEEQAARLL", - "QEEQRYQAL", - "QEESLRQEY", - "QEEYVKRAL", - "QEFDDVQGKW", - "QEFEEKSGRTF", - "QEFEHVN(Deamidated)GRW", - "QEFEHVNGRW", - "QEFGADVRL", - "QEFGLARFK", - "QEFGVPHQY", - "QEFQDAWKL", - "QEFRASFNHF", - "QEGDHGSHVY", - "QEGDIILVL", - "QEGDTTRKY", - "QEGEYIKMF", - "QEGGPAHKREY", - "QEGKPKRTLY", - "QEGMVFTRF", - "QEGTAKVSW", - "QEGTLLGKFTY", - "QEHIDLGIKY", - "QEHPIPLSY", - "QEHQGHQTF", - "QEIDEQRTKY", - "QEIEEIRQKY", - "QEIENAINEY", - "QEIETKEIY", - "QEIKITSKF", - "QEIPVNVRF", - "QEIRSLFEQY", - "QEITQRLFF", - "QEIVKTGLW", - "QEIYGGSDSRF", - "QEKDVFERY", - "QEKQLMKQY", - "QELANLEKW", - "QELDDILKF", - "QELDNPGAKRI", - "QELDNVIKQGY", - "QELIGKKEY", - "QELLAEHY", - "QELNDRFANY", - "QELNFLLRY", - "QELPQSADVQRW", - "QELPREKYLTW", - "QELQEINRVY", - "QEM(Oxidation)EGTVKSKY", - "QEMDARPKL", - "QEMEGNLHQL", - "QEMEGTVKSKY", - "QEMQEKLQNF", - "QEMSPEKLQQY", - "QEN(Deamidated)GPTAKAY", - "QENEDGYRW", - "QENEEAVKKM", - "QENEHIYNLW", - "QENIDRLVY", - "QENMQIQSF", - "QENNLLKTL", - "QENQKIGW", - "QENQSNRQF", - "QENSRVIVM", - "QEPPTKREY", - "QEQDLEKTRQY", - "QEQEAKQKL", - "QEQEERERRY", - "QEQEIEHHL", - "QEQEIEQRL", - "QEQGGEASPQRTW", - "QEQGTHPKF", - "QERDPSKIKW", - "QERGINESY", - "QESAEANKF", - "QESAQNTKF", - "QESEDTAKAGF", - "QESEVLERQM", - "QESNVQLKL", - "QESNVRLKL", - "QESQSNVKF", - "QETAVTQTY", - "QETELSQRI", - "QETHLKQQL", - "QETPDHAIFRW", - "QETPLPRSW", - "QETSFTKEAY", - "QEVDASIFKAW", - "QEVFEKATF", - "QEVGYSIRF", - "QEVGYTIRF", - "QEVIISNWHW", - "QEVIKAYGF", - "QEVKNLHQRL", - "QEVNELLQKF", - "QEVQPITSY", - "QEVRLTIHY", - "QEVTNNLEF", - "QEVTQDLHY", - "QEVYTAVTY", - "QEWDGLVRI", - "QEWNLTNIKRW", - "QEYIFKKPTF", - "QEYPDLIHI", - "QEYPDLIHIY", - "QEYREGKHSF", - "QFDVATHL", - "QFIPPYVPRF", - "QFVPKSHLF", - "QFVPPLPEW", - "QIFKPIISK", - "QIFNGTFVK", - "QIFRPDNFVF", - "QIGPAPPLK", - "QIHDHVNPK", - "QINLWKIYK", - "QIQDSIVTK", - "QISEVVVVK", - "QITLPTVQK", - "QIYGVFDEK", - "QIYSVVLKK", - "QLFYLPAKK", - "QLGPPSPLK", - "QLQPGNAKL", - "QLSAPITTK", - "QLYWSHPRK", - "QPAENISKDLY", - "QPAENVNQY", - "QPAKADKESF", - "QPAPAWTTF", - "QPAPELAVF", - "QPAPTPLKM", - "QPAQDIFSVY", - "QPAQQGQTY", - "QPASAIVNF", - "QPASFAVSL", - "QPDPDAIKMF", - "QPDPESVVL", - "QPDSGISSIRSF", - "QPFGGGSHM", - "QPFYHDDSY", - "QPGVLIQVY", - "QPIDSIRGY", - "QPIEGHAASF", - "QPINFSVSL", - "QPINLIFRY", - "QPLEEIITY", - "QPLKLDTSF", - "QPLSKTWEL", - "QPLTPDEYLTY", - "QPMNPTQNM", - "QPNASVHQF", - "QPNGGASVIHAY", - "QPNPLPLRL", - "QPNPVEQRY", - "QPQANSHVY", - "QPQHPLHVTY", - "QPQPGFGYSM", - "QPSPQQDVY", - "QPSSIVHRY", - "QPSTIATSM", - "QPTQTVVM", - "QPTVTIKVY", - "QPVGPERGEVTY", - "QPVHPDVTM", - "QPVKSFPTM", - "QPVKVLGENY", - "QPVKVRVSY", - "QPVSQPLTY", - "QPVTSEPTY", "QPWEEIKTSY", - "QPWNHGETF", - "QPYDPNFYDETY", - "QPYTDGVRM", - "QPYTDGVRM(Oxidation)", - "QQIETQQRK", - "QQMWISKQEY", - "QQNEALAAK", - "QQTDIAVNW", - "QSLEHSWIK", - "QSMAFSILNTPK", - "QSNPAPQVQK", - "QSSDPDDTPPK", - "QTAQIFFTK", - "QTFLLQTTK", - "QTFPSVSAPSK", - "QTFQRVFTK", - "QTIPPPYVVR", - "QTLDKVVRK", - "QTLSLKQLFRK", - "QTLSTQLWK", - "QTMDMIISK", - "QTMDMIISKK", - "QTMLPSIRK", - "QTMSDTTFK", - "QTNPLYLAK", - "QTQGGGSVTK", - "QTQPIYLAK", - "QTQQVNTLK", - "QTQSASSTLQK", - "QTQSIYIPR", - "QTSAEVYRILK", - "QTSGSLVSK", - "QTTEFGIHK", - "QTVAVGVIK", - "QTYGQQLQK", - "QTYSTEPNNLK", - "QTYVGITEK", - "QVADAFLSK", - "QVADSTFTVLK", - "QVAPVANSY", - "QVAQLYMIQK", - "QVDPNFYSK", - "QVDTPIMTK", - "QVEEIFNLK", - "QVFEGHTHY", - "QVFGGGANSLFLEK", - "QVFQKSLPK", - "QVHEWLAKK", - "QVIAGAVHK", - "QVIEKFYPK", - "QVLSAATIVAK", - "QVNDLFSRK", - "QVNFTLPKK", - "QVQAAQFAK", - "QVQDLFNKK", - "QVQEGTKVLK", - "QVQKGPLKLK", - "QVQPKPSPPR", - "QVQPVDGATRK", - "QVQVVLNQK", - "QVSITGFFQRK", - "QVSPRITFK", - "QVSSPVQEK", - "QVSTPPAAK", - "QVSWSLDHK", - "QVTDFGFAK", - "QVTSQILQK", - "QVVSPGVYK", - "QVYRGALQK", - "QWINLKKAYSF", - "QWPPDPPLHF", - "QWPQPDKPMFF", - "QYASAFHFL", - "QYDEAVAQF", - "QYEKLFHKW", - "QYEQVKQLF", - "QYESKVFYL", - "QYFPKAPEF", - "QYLDGTWSL", - "QYLDVLHAL", - "QYLEEAPKF", - "QYLGQIQHI", - "QYLPHVARL", - "QYLPSPPLL", - "QYLRRLHYF", - "QYLRVETQF", - "QYMKIISSF", - "QYNPHVHQL", - "QYNPKFQTL", - "QYPVIIHLI", - "QYPVYWDHLEF", - "QYTHKIYHL", - "QYTPHSHQF", - "RAAPGAEFAPNK", - "RAFDSAVAK", - "RAFDSIVNK", - "RALDLVAAK", - "RALELAVKY", - "RAQDLPLKK", - "RAYGGSM(Oxidation)CAKC", - "RAYHLLVKK", - "RAYPHVFTK", - "RAYQQSEAY", - "RDMRQTVAVGVIK", - "REAEFTKSI", - "REAELKKKW", - "REAEQRRAY", - "REAGDEFELRY", - "REANELQQW", - "REANQQQQF", - "REAQTLQQY", - "REAVQKKTF", - "REDDSVHAY", - "REDEYKQKY", - "REDHLFRKF", - "REDKIFQKF", - "REDNVIRKY", - "REDRTKRLF", - "REEDGHTHQW", - "REEEAARLFY", - "REEEEKAKAY", - "REEGAVDKSY", - "REEHIDKVF", - "REEQSHPARLY", - "REERTFRNW", - "REFELEESY", - "REFPDRLVGY", - "REGAITFTW", - "REGEIAQFL", - "REGEIRHLF", - "REGEKEKASW", - "REGNAVAVRLW", - "REHDANKINY", - "REHDIAIKFF", - "REIAEVNKKL", - "REIAGHIMEF", - "REIEGSQVTF", - "REIELKVMKF", - "REIEQRHTM", - "REIEVPDQY", - "REILGIIVSY", - "REILKQIEY", - "REIQAQNFF", - "RELDKVLQKF", - "RELEKDMHY", - "RELEKDMHYY", - "RELEKVLHKF", - "RELELKNTW", - "RELLPVKKF", - "RELPEPLMTF", - "RELPNIEERIM", - "REMGVDVHF", - "REMLEKKDSF", - "REMPGGPVW", - "REN(Deamidated)GAKESW", - "RENKEIRTY", - "RENNAVYAF", - "RENTQTTIKLF", - "RENVEAAQSY", - "RENYDIIKTY", - "REQDAEGQDY", - "REQILMKRF", - "REREEETPAY", - "RESAVGQMGW", - "RESDQLFKQY", - "RESEYKQVY", - "RESGVGQTDW", - "RESKKIDRHMY", - "RETDLQELF", - "RETSVTPSNLW", - "RETVIKQTM", - "REVDQVKRL", - "REVETLPRKY", - "REVGNAILF", - "REVILPERW", - "REVSPAHQY", - "REWLIGNSVTW", - "REWSGKEKW", - "REYELRKNNF", - "RFDEARARF", - "RFDEAYIYM", - "RFDEGPVRL", - "RFDESMQVF", - "RFDGALNVD", - "RFDGALNVDL", - "RFDGRVVLV", - "RFDHVITNM", - "RFDHVITNM(Oxidation)", - "RFDNADRMF", - "RFDSDVGEF", - "RFEDSPSYV", - "RFEEAHFTF", - "RFHVLSKLLSF", - "RFIAPAASLGF", - "RFIGATANF", - "RFIKKLEHTW", - "RFINFVVKL", - "RFIPYTEEF", - "RFIRPMGLRF", - "RFKNKAYLL", - "RFKTQPVTF", - "RFLDDLGLKF", - "RFLDNKVLLSF", - "RFLNDPGHLLW", - "RFLNSSNDHRF", - "RFVPLPASAKW", - "RFYDRRFLKLLRF", - "RGMGELLPTK", - "RGSEPVPEK", - "RIFAPNHVVAK", - "RIFDLGRKK", - "RIFEPPPPK", - "RIFKHFTRK", - "RIFQEQVEK", - "RIFVYFITK", - "RIGGISGIFK", - "RIGNFIVKK", - "RIIDLVLQK", - "RIIDSKFLK", - "RIIEETLALK", - "RIIEPLTSR", - "RIIHGTASYK", "RILFFNTPK", - "RILHTYYKF", - "RIMDPEIALK", - "RIQDGLGELK", - "RIQEHFNKK", - "RIQKSISQK", - "RIQLPVVSK", - "RISSNPVAK", - "RITDPTIDK", - "RITTHFELK", - "RIYNMEMARK", - "RIYSKFHQK", - "RKEKKMPKPRLK", - "RKKFPLKIFKKPLK", - "RKKLSSYPKQILR", - "RLADSLIGK", - "RLATFFPRK", - "RLDPNVQKW", - "RLFEGIIKGK", - "RLFIGGIPK", - "RLFVGSIPK", - "RLGDSSGPALK", - "RLINTQAIFAK", - "RLKDFSFRF", - "RLLPGNATISK", - "RLLSPPLRPR", - "RLMSLPIAK", - "RLMSLPIAKK", - "RLNHYVLYK", - "RLPAWQPIL", - "RLSSETGGMGSS", - "RLVSYFIKK", - "RPAALQVLY", - "RPAPPPISGGGY", - "RPAPVEVSY", - "RPAPVEVTY", - "RPAQSFLM", - "RPDEKAIMTY", - "RPEDQRLIY", - "RPFAGFEDF", - "RPFASGANFEY", - "RPFEENGACKY", - "RPFEQPQEY", - "RPFERTITM", - "RPIDADTIDIY", - "RPIEDDQEVY", - "RPIRLQVQY", - "RPLEKFVTY", - "RPLPPMKSY", - "RPSGKGIVEF", - "RPSPQQTEY", - "RPTDVAISF", - "RPTEFVNHY", - "RPVALTVTF", - "RPVDLEKDDY", - "RPVETYQVHEY", - "RPVHLDQAAF", - "RPVMDVAFVQF", - "RPVNVVNVY", - "RPVPKGATY", - "RPVPLEQTY", - "RPVSGDLSY", - "RPVSIEGSEEY", - "RPVSSIAMEM", - "RPYEDSSQHYY", - "RPYSQVNVL", - "RQAELAQWQK", - "RQAVPLFSK", - "RQFDNFKRVFK", - "RQFWTRTKK", - "RQIPYTMMK", - "RQNEINNPK", - "RQSTILKRW", - "RQYDIDDAIAK", - "RSADLTGLEK", - "RSAGVPFHAK", - "RSDTPLIYK", - "RSFEEAFQK", - "RSGEVPPQK", - "RSIQVDGKTIK", - "RSLDNFFAK", - "RSM(Oxidation)EAHNILSK", - "RSMDPFPWQQK", - "RSMEAHNILSK", - "RSMHEFSAK", - "RSMPEQTGEK", - "RSMVSTIMK", - "RSNPYYIVK", - "RSQKPVMVK", - "RSSIPVYKK", - "RSTDPVTTK", - "RSTVPTPAK", - "RSYHLQIVTK", - "RSYSSVIEK", - "RSYTKAYSR", - "RTAEVLANK", - "RTAFTLKQK", - "RTALNLFFK", - "RTATIMIQK", - "RTAVYSLHK", - "RTDDKVIRFK", - "RTDEAAFQK", - "RTDNISFMLK", - "RTEDGDWYGK", - "RTFQPPATGHK", - "RTFSKTIVK", - "RTFSWASVTSK", - "RTFTWLVGK", - "RTGDGIVQK", - "RTGSPLAAR", - "RTIAPIIGR", - "RTIATALEYVYK", - "RTIDKKFYK", - "RTIFPLFMK", - "RTINVYPNF", - "RTIQTFVKK", - "RTISSDAVLQR", - "RTLDSVLKK", - "RTLEPLAKK", - "RTLNPQMLQK", "RTLQQMLLK", - "RTLSDYNIQK", - "RTMHYSISK", - "RTMNIKSATWK", - "RTMQDIVYK", - "RTMSEAALVRK", - "RTNEVVAIK", - "RTNEVVAIKK", - "RTNSPGFQK", - "RTNWPNTGK", - "RTQDIHIFR", - "RTQEKFALK", - "RTQGLM(Oxidation)IMK", - "RTQGLMIMK", - "RTQGVPAVLK", - "RTQHIQQPRK", - "RTQMPDPKTFK", - "RTQNVLGEK", - "RTQSTVESLSK", - "RTSEIYVHR", - "RTSGSVYITLK", - "RTSPSSDKVQK", - "RTVN(Deamidated)VSVPK", - "RTVQWWFKK", - "RTYDETYQR", - "RTYDGDGYKK", - "RTYVGSMPGR", - "RVADPTLEK", - "RVADRLYGVYK", - "RVAPAHGLFLK", - "RVAPEEHPVL", - "RVCEAVPGAKG", - "RVDDFKKAFSK", - "RVDGPASNLK", - "RVDPQVKVK", - "RVFAAESIIKR", - "RVFDVPIRR", - "RVFKEENQK", - "RVFQETQKLK", - "RVFQETQKLKK", - "RVFQEVAQK", - "RVFSGLVSTGLK", - "RVFTGVVTK", - "RVFVVGVGM(Oxidation)TK", - "RVFVVGVGMTK", - "RVGDVYIPR", - "RVGLHKVFK", - "RVGTVIGSNK", - "RVIDILRGK", - "RVIEGDVVSALNK", - "RVINEEYKIWKK", - "RVINSIPLAK", - "RVIQKSWRK", - "RVISEGMLWKK", - "RVKYGTVFK", - "RVLDALVAREK", - "RVLDFDVKRK", - "RVLDPSKFLK", - "RVLDVTKKK", - "RVLEAAVAAK", - "RVLEAIQKK", - "RVLEKDSVTLK", - "RVLESVQKK", - "RVLKPGGLLK", - "RVLPEFKKK", - "RVM(Oxidation)KALVNR", - "RVMDVQYNKF", - "RVMGDRSVLYK", - "RVMGIRVLR", - "RVMIFSVGK", - "RVMKALVNR", - "RVMQDIVYK", - "RVNKVIIGTK", - "RVPDPSPVTK", - "RVPLAIVNK", - "RVPLDPLIGK", - "RVQDHIQSR", - "RVQDLEQKMK", - "RVQDYIQSK", - "RVQEAVESM(Oxidation)VK", - "RVQEAVESMVK", - "RVQEIVGALRK", - "RVQGTPVASK", - "RVQIQQAANK", - "RVQKKTFTK", - "RVQN(Deamidated)ITQVGSVTK", - "RVQPNEAVYTK", - "RVQPPAQTR", - "RVSAIFVGK", - "RVSEFFMNAK", - "RVTPFILKK", - "RVVDGKDLTTK", - "RVVDLLVIK", - "RVWDISGLRK", - "RVYAENAIRKK", - "RVYGGLTTK", - "RWDEAFRKF", - "RWFDKSFTF", - "RWFQPAIPSW", - "RWMSQHNRF", - "RWSPVRPLVF", - "RYALIMHKL", - "RYASINAHL", - "RYASINTHL", - "RYDDMAAAM", - "RYDDMASAM", - "RYDEIRRHW", - "RYDEMVESM", - "RYDLGGLVM", - "RYFDGNLEKL", - "RYFDHALTL", - "RYFDVGLHNF", - "RYFENPQVI", - "RYFHWKMNL", - "RYFKTPRKF", - "RYFLPPYTF", - "RYGDVFQI", - "RYGLVTNEI", "RYGPQFTL", - "RYGPVFTI", - "RYIANTVEL", - "RYIDRIHIF", - "RYIDRIHIFF", - "RYIDTHNRV", - "RYIEELQKF", - "RYIFAKNLF", - "RYIHKLYDL", - "RYIKNPRIVLL", - "RYINNPLLI", - "RYIPTAAAF", - "RYIQPWESEF", - "RYIRDAHTF", - "RYISDQLFTNF", - "RYISQTQGL", - "RYISVLKVF", - "RYITKGNLF", - "RYLAIVHAVF", - "RYLDEINLL", - "RYLDELMKL", - "RYLDGWNAI", - "RYLDKTEQW", - "RYLDVSILGKF", - "RYLEAGAAGLRW", - "RYLEKFYGL", - "RYLEKNVKL", - "RYLEKPM(Oxidation)EI", - "RYLEKPMEI", - "RYLENGKETL", - "RYLEQLHQL", - "RYLEVMRKL", - "RYLGIVHPFF", - "RYLGKVLEL", - "RYLHSHHFL", - "RYLHVEGGNF", - "RYLLFARQF", - "RYLNEFEEL", - "RYLNELKWSF", - "RYLNKAFHI", - "RYLPDTLLL", - "RYLPKGFLNQF", - "RYLPPATQVVL", - "RYLPQTYVV", - "RYLPSSSTPLTL", - "RYLPTGSFPF", - "RYLQTLTTI", - "RYLSKATTL", - "RYLSKVLEL", - "RYLSPKYIKMF", - "RYLTGAWRL", - "RYLTVAAVF", - "RYLTVATVF", - "RYLVISEKL", - "RYMDAWNTV", - "RYMNHMQSL", - "RYMNHMQSLRF", - "RYMPFAPAIQTF", - "RYMPPAHRNF", - "RYMPQNPHI", - "RYNHITATYF", - "RYNPENNTW", - "RYNPNLNTW", - "RYPAIIYNI", - "RYPDNLKHLYL", - "RYPDSHQLF", - "RYPPDIRATF", - "RYPQSIFSTF", - "RYPSNLQLF", - "RYPTSIASLAF", - "RYQDIIHSI", - "RYQQWMERF", - "RYQTKFRHL", - "RYSPVLSRF", - "RYSSAFTNRIFF", - "RYSSMAASF", - "RYVDQKFVL", - "RYVDQVLQL", - "RYVEIVSQF", - "RYVELAWGF", - "RYVIIPTTF", - "RYVPRASYF", - "RYVWWKKSL", - "SAAAALVLK", - "SAAAASPQK", - "SAADGTNVVK", - "SAADIARAEM", - "SAADVVVVH", - "SAAELRHVM", - "SAAGHVLVK", - "SAAKLLTEY", - "SAAKTFITK", - "SAAPPQEKK", - "SAASEQHVF", - "SADSASLAK", - "SAFGGSLPAK", - "SAFGQAFSK", - "SAFGVIIEK", - "SAFKADPKISK", - "SAFKPSSAITK", - "SAFQAPAVKK", - "SAFQHFWNR", - "SAFSTSISK", - "SAFSVAVTK", - "SAFTGQQGY", - "SAFTPDQALKK", - "SAFWLASRK", - "SAGDVAVQK", - "SAGHGLPAK", - "SAGPNSFNK", - "SAGPPSLRK", - "SAIAAVIAR", - "SAIDKMTKK", - "SAIDSVNATSK", - "SAIESTQSTPQK", - "SAIKENFQF", - "SAINDKSIVKK", - "SAISSPLTK", - "SALEEYTKK", - "SALEHSIQY", - "SALHIAIEK", - "SALPSLPAGSGLK", - "SALSVAPSK", - "SALTDKAIVKK", - "SAMDSTVAK", - "SAMKEFAYMK", - "SAMPDAIIRTK", - "SAMSNPRAM", - "SAMSNPRAMQAL", - "SANELAVQK", - "SANPPGPLK", - "SANTNTVPK", - "SAQDFASRAK", - "SAQELPLVEK", - "SAQGKPLALK", - "SAQNTKFFK", + "RYLADLPTL", "SAQSFFENK", - "SARIEYDAY", - "SARVGLARAR", - "SASASLPTK", - "SASDVMSHK", - "SASLPAPVK", - "SASSLHLTK", - "SASTTTLRY", - "SATQAVFQK", - "SATSKTFEK", - "SATTSPFFK", "SAVDPVQMK", - "SAVDVHINM", - "SAVEEKVSY", - "SAVGTIVKK", - "SAVLFTITK", - "SAVRPVIEK", - "SAYEFYHAL", - "SAYFAEKLYK", - "SAYLGSEQYK", - "SAYYPSSFPK", - "SAYYPSSFPKK", - "SCKQDLLAY", - "SDQFPLPLK", - "SDVELDDLGKDEL", - "SEAAHQGVITW", - "SEAATAQREEW", - "SEAAYKEAF", - "SEADARIFKAW", - "SEADFSIHF", - "SEADLRKKM", + "SEAAINRQI", "SEADVAQQF", - "SEAEHQRAY", - "SEAEIRVFL", - "SEAEMRLFY", - "SEAEQTLRF", - "SEAERKAVQAMW", - "SEAFVIKGL", - "SEAGPNQTF", - "SEAGSAARF", - "SEAGSHTLQW", - "SEAGSLPAF", - "SEAKAFHDY", - "SEAKGLIRTW", - "SEALALTQ", - "SEALALTQTW", - "SEALEAGPRSW", - "SEAPARQGF", - "SEAPGPINF", - "SEAPSGESRKF", - "SEAQEGLQKF", - "SEAQSSPQF", - "SEAQVQKFL", - "SEAREDMAALEKD", - "SEASRLAHY", - "SEDAEKKVL", - "SEDDRLPVIQMW", - "SEDDVKMAL", - "SEDEEPKKY", - "SEDEGHREY", - "SEDEIKKAY", - "SEDGAIHVI", - "SEDGKIHVW", - "SEDGKVQVF", - "SEDGLLKLW", - "SEDGSLHVF", - "SEDGTLRLW", - "SEDGTVRLW", - "SEDHINRKY", - "SEDKSIRVW", - "SEDLLKEHY", - "SEDLMKELY", - "SEDLRSHAW", - "SEDMLGRVF", - "SEDQTWKRI", - "SEDQVQIHTY", - "SEDRSVRIW", - "SEDSMKDAW", - "SEDTAKAGF", - "SEEAEIIRKY", - "SEEAESQQQW", - "SEEALQKRL", - "SEEDARKNF", - "SEEDGDHNRTF", - "SEEDLKVLF", - "SEEDWKTRW", - "SEEEFLRTY", - "SEEELKKAY", - "SEEEMARTF", - "SEEETQKWF", - "SEEEYKKTY", - "SEEGLLRLY", - "SEEGMYVLRW", - "SEEGPDVLRW", - "SEEKLQEKARKW", - "SEELLSLKY", - "SEEPILKWY", - "SEEPLGRQLW", - "SEESFKQYF", - "SEFDDEPKF", - "SEFDSISKNTW", - "SEFEGHKRI", - "SEFENQGSRPLF", - "SEFGIPKKT", - "SEFKKKLFW", - "SEFLATKAKQF", - "SEFLKQAW", - "SEFPGAQHY", - "SEFPKPQIL", - "SEFTGVWKY", - "SEGDITQKGY", - "SEGDLRRKLY", - "SEGELVELRW", - "SEGELVVKF", - "SEGGPPLRI", - "SEGGTVKNY", - "SEGPLRPVL", - "SEGPPLRLW", "SEGTKAVTK", - "SEGTPEKPLY", - "SEGVGKGTY", - "SEGVRPDGF", - "SEGYPGQRY", - "SEHAVNKQL", - "SEHISSSGKKY", - "SEHNTPVRSEW", - "SEHPLAQLY", - "SEHSIIKDF", "SEIAQKQKL", - "SEIAVGHQY", - "SEIDKRVQY", - "SEIDMNDIKAFY", - "SEIDQRDKY", - "SEIDVRQEY", - "SEIEAKVRY", - "SEIEKNDVVF", - "SEIENVHGF", - "SEIFHSQSF", - "SEIGQKQKL", - "SEIGREKSQDW", - "SEIHLQVKY", - "SEIINSKNF", - "SEIKDVLVW", - "SEILQKEVY", - "SEINKPNFY", - "SEIPQTERM", - "SEIRAAEKKF", - "SEIRHTADRW", - "SEIRSISVNQW", - "SEIVGKRI", - "SEKAGIIQDTW", - "SEKDKPSSW", - "SEKPEIKQKW", - "SELAEDKENY", - "SELDQIQRY", - "SELKDFFQSY", - "SELKGMASW", - "SELKSGRLEW", - "SELLDKFTW", - "SELQARETF", - "SELQSIQRL", - "SELQSQVRY", - "SELSSEGTQHSY", - "SELYQKTYW", - "SEMDSERLQY", - "SEMDTSVKF", - "SEMKVSSTW", - "SEMNTDKQYF", - "SEMPAAKRL", - "SEMQRHYVMY", - "SENAERILF", - "SENAIVWKI", - "SENDMRFVY", - "SENDTYFKKY", - "SENDVIRLI", + "SEN(Deamidated)ELKKAY", "SENELKKAY", - "SENELKKAYR", - "SENETLKHL", - "SENGVSKDVW", - "SENITQKVVW", - "SENKIVGIGY", - "SENLIKHVQGW", - "SENLLGKQF", - "SENNIQTIF", - "SENPAKRLY", - "SENPFREKKF", - "SENPGQTHF", - "SENSRVSHY", - "SEPDFVAKF", - "SEPDFVAKFY", - "SEPESIRKW", - "SEPGDPKVTW", - "SEPSEVRSY", - "SEQPAKATF", - "SEQRDYIDTTW", - "SEQSSVGTQHSY", - "SEQSVTQSF", - "SEQVQGAQKQF", - "SEREATEVY", - "SEREEVSSW", - "SESAQSKM(Oxidation)L", - "SESAQSKML", - "SESAVFHGF", - "SESDLNHSF", - "SESEKKFLW", - "SESELGRKW", - "SESELTRLL", - "SESGAGLTRF", - "SESHFSERW", - "SESHMEWTW", - "SESIPKDSL", - "SESIQALGW", - "SESKDRKLY", - "SESKTVVTY", - "SESLEINRQF", - "SESLFVSN(Deamidated)HAY", - "SESLFVSNHAY", - "SESLLRGIYAY", - "SESLVHESW", - "SESNFARAY", - "SESNFSPKF", - "SESNIIRHY", - "SESPIVVVL", - "SESQLELNW", - "SESRMVVTF", - "SESSHKGFHY", - "SESSIDRLM", - "SESSVKVRL", - "SESTNQRVLW", - "SETDMVRQI", - "SETELKDTY", - "SETETKQRL", - "SETGALKTF", - "SETGRSKGY", - "SETKGIWMW", - "SETPEIRKY", - "SETRDTLRQW", - "SETSVPDHVVW", - "SETTAAHSL", - "SEVDFEERF", - "SEVDLTRSF", - "SEVDMLKIRSEF", - "SEVDVSDLGSRNY", - "SEVEGVKNI", - "SEVELTSSQRW", - "SEVESLMKKM", - "SEVILENGKL", - "SEVILHHEY", - "SEVLQDLRF", - "SEVLSWQF", - "SEVPFSKRY", - "SEVPKDSTHQW", - "SEVSTVLKL", - "SEVTASSRHY", - "SEVVAIKKM", - "SEVYPGQQY", - "SEWDGHEEL", - "SEWQPTNVDGKGY", - "SEYARPHVM", - "SFDDTNEKF", - "SFDETVTHF", - "SFDKAKLK", - "SFDKAKLKK", - "SFDLLPREF", - "SFDPSRTF", - "SFDSALQSV", - "SFDSTVRL", - "SFDSVPVSL", - "SFFKKIGVHF", - "SFGGLGGGSVRF", - "SFHNIHNTF", - "SFHRVHTAF", - "SFILEQAVY", - "SFINSNLKF", - "SFIPSSVPATF", - "SFLDPIKAYL", - "SFLGVKELSF", "SFSPKTYSF", - "SFSSSAGPGLLK", - "SFSTVHEKF", - "SFVDTRTLL", - "SFYPRNITLTW", - "SGAQPILSK", - "SGATIRIFK", - "SGFAGVYFEK", - "SGFEGMFTK", - "SGGNIYVLK", - "SGIQVRYLK", - "SGLTVPTSPK", - "SGLVPAAPPK", - "SGMDYWIVK", - "SGMGSTVSK", - "SGMQ(Deamidated)NMSIHTK", - "SGMQN(Deamidated)MSIHTK", - "SGNLPLATK", - "SGPYGGGGQYF", - "SGSAPQPPK", - "SGSFPLVLK", - "SGSPATPLK", "SGSSYLNTVQK", - "SGTPTLPPK", - "SGVGLSSYLSTEK", - "SGYFKQFQK", - "SGYQRDGYQQNFK", - "SHKSKYQTDLYERE", - "SIAAPFTSK", - "SIADSLKSK", - "SIAGLSTMK", - "SIAPPVPLK", - "SIAVKSIHRK", - "SIAVPIVLK", - "SIDGRVVEPK", - "SIFDDFSHYEK", - "SIFDGRVVAK", - "SIFEPAKGGEK", - "SIFEQGPAEMMK", - "SIFFESMPYK", - "SIFGGTDMKK", - "SIFHQKAEK", - "SIFKQPVTK", - "SIFRTPISK", - "SIFSEALLK", - "SIFSKFTSK", - "SIFVPGTQK", - "SIIAYLQKK", - "SIIETLRQK", - "SIKEVDEAK", - "SILEDYANYK", - "SILGPGNIKK", - "SILGTPLSK", - "SILKHLSAK", - "SILNNPIVK", - "SILNYVIYK", - "SILPAIFQK", - "SILPGDKTNKK", - "SILQERVKK", - "SILRNPVTNK", - "SIMDPNQNVK", - "SIMEKKMKTK", - "SIMKWNRER", - "SIMSSHVMK", - "SINLNAINK", - "SIPQKPQTNK", - "SIQDKGSIQK", - "SIQGVSTVTVK", - "SIQHPLIKK", - "SIQHVFIKK", - "SIQKPYNQK", - "SIQPATSPK", - "SIQRKLQEK", - "SIQTAIAKK", - "SISDKFFQK", - "SISDVGFGMLK", - "SISGPISTSK", - "SISSGPIQK", - "SISSPQPGK", - "SITSEVFNK", - "SITSVFITK", - "SIVDYKLITK", - "SIVMETGNTK", - "SIVSQTIPK", - "SIWDETLYK", - "SIWSSGSRHMK", - "SIYDSKRQSGK", - "SIYDVKYLMK", - "SIYKPGQTVK", - "SIYNPERTITVK", - "SIYRGPSHTYK", - "SIYRPSKNLDK", - "SKGSAFSTSISK", - "SLADFQIEK", - "SLAEILLKK", - "SLFEGSLSK", - "SLFGSPVAK", - "SLFLGSASK", - "SLFNTGFLK", - "SLGKDWHKF", - "SLLGYFPNK", - "SLM(Oxidation)HSFILK", - "SLMAPVGRWQK", - "SLMHSFILK", - "SLMPSQVVK", - "SLMPWFHGK", - "SLMQIDDNVMRK", - "SLNQAVVSK", - "SLPANTPLRK", - "SLPDLTTPLK", - "SLPLVDTHSK", - "SLPTVIMRNK", - "SLQDKQ(Deamidated)KGAK", - "SLQEVTIHEK", - "SLQPSISQK", - "SLQQVRQQLK", - "SLRFDGALNVDL", - "SLSEQVAAALK", - "SLSPVILIK", - "SLSSPLNPK", - "SLWDRLIFHK", - "SLYAHGYLK", - "SLYASSPGGVYATR", - "SLYSVPEGQSK", - "SLYWLSTQK", - "SMMDVDHQIAK", - "SMNANTITK", - "SNSYAIKK", - "SPAAMTTRY", - "SPAATPTSY", - "SPAEDKSSF", - "SPAGLSREY", - "SPALVGSN(Deamidated)ITF", - "SPAQEDGKVY", - "SPASDTYIVF", - "SPDEKSVITY", - "SPDGRTYYY", - "SPDSGVYEM", - "SPEDIKKAY", - "SPEELNRY", - "SPEEQAKTY", - "SPEGRLFQVEY", - "SPEGRLYQVEY", - "SPEPGQRTF", - "SPFATTTKY", - "SPFFERSGLAY", - "SPFHDIPIY", - "SPFHERHFHY", - "SPFKADIEM", - "SPFQDQLHQLY", - "SPFQPHVPY", - "SPFYPGKTTY", - "SPHGGALVM", - "SPHSVINIF", - "SPHTGIQEY", - "SPHVIQAVM", - "SPIDVVEKY", - "SPIEFLENAY", - "SPIHSTGQQFIY", - "SPIIVDITKDTF", - "SPIPFPPLSY", - "SPIRPPKYYTY", - "SPISIRQMAY", - "SPISQKIIY", - "SPLGGERPF", - "SPLHLAAQY", - "SPLKLLTSM", - "SPLPTVGSSY", - "SPLTGGNVAF", - "SPNAEIHIL", - "SPQDLRLFY", - "SPQEKEALY", - "SPQPDGKVVY", - "SPQPPSFTY", - "SPQSTVTVF", - "SPRKDGLSY", - "SPSDVFIGY", - "SPSITYDISQL", - "SPTDSTPAL", - "SPTDVHKQY", - "SPTEVVERL", - "SPTNTVHMY", - "SPTQIGPSY", - "SPTTIQVTY", - "SPVDSVLFY", - "SPVESVLFY", - "SPVIHPPVSY", - "SPVNSSKQPSY", - "SPVRNLQSF", - "SPVSKGILQY", - "SPWADNTAL", - "SPYNLAYKY", - "SQADIKKAY", - "SQAFPSVSK", - "SQAGMTGYGMPR", - "SQAPVNKPK", - "SQAQATISFPK", - "SQFDGDYISK", - "SQFGEMGGKFMK", - "SQFKGYFIFK", - "SQFLAPKAMKK", - "SQFSGKITVK", - "SQFSLPVQK", - "SQFSPAVFVYK", - "SQFSSRKYLK", - "SQGPISKPK", - "SQGTPISLK", - "SQHEVFVEK", - "SQHYHQGYY", - "SQIEKFQEK", - "SQISTSIQK", - "SQKMFVNTK", - "SQLEQENNLLK", - "SQLGIFISK", - "SQMKIVHKK", - "SQMKSYQSF", - "SQNPRFYHK", - "SQNQNLPVAK", - "SQNTDMVQK", - "SQNTKPYLK", - "SQQKVVITK", - "SQWNNDNPLFK", - "SRDKTIKLW", - "SSAAQLPQK", - "SSADFTVPK", "SSADGSQPPK", - "SSAEVIAQARK", - "SSAEYSVHK", - "SSAGPGLLK", - "SSAPPLTGK", - "SSAPTARVFMK", - "SSARVGLARAR", - "SSARVGLARART", - "SSARVGLARARTR", - "SSASALTGLTK", - "SSATLNSIVAK", - "SSATTSPFFK", - "SSAVTSVAK", - "SSDVIIHR", - "SSEAPLVQK", - "SSFEHEFKK", - "SSFGGLGGGSVR", - "SSFGGLILSK", - "SSFGNMIYK", - "SSFGRGFFK", - "SSFGSGAGSSSFSR", - "SSFGTILRK", - "SSFLQQHKK", - "SSFQGLILK", - "SSFSGLLRK", - "SSFSSPHMK", - "SSFYNTKKK", - "SSGDIFLEK", - "SSGFVAIKK", - "SSGPASPPR", - "SSGPSTPLK", - "SSGPVPSAK", - "SSGVPNPPK", - "SSGVPTPTK", - "SSHLPPPPK", - "SSHVPIQK", - "SSIPSTWPR", "SSIQGQWPK", - "SSIRHMIRK", - "SSISSPWGK", - "SSKSQTEVPK", - "SSLDVNVLK", - "SSLGKDWHK", - "SSLNHIVEK", - "SSLPGVFKK", - "SSLPKSFKR", - "SSLPRAFQK", - "SSLPTQLFK", - "SSLQEVYHK", - "SSLSGEELVTK", - "SSLSLFFRK", - "SSLSSPLNPK", "SSLYIILKK", - "SSMDSKSSGWGM", - "SSMLASAVEK", - "SSMPSSRHK", - "SSMTSTMTIGK", - "SSMVGVNLPQK", - "SSNDWNVEK", - "SSNIFTVAK", - "SSNLPVNNK", - "SSNSMQTIQK", - "SSNSSPIGK", - "SSNSYAIKK", - "SSNTFSIKK", - "SSQN(Deamidated)FTLTK", - "SSQNFTLTK", - "SSQPVLSQK", - "SSQQPEKVMAK", - "SSQQSVMSK", - "SSQTSGSLVSK", - "SSRGPLPVK", - "SSSAGPGLLK", - "SSSAPIVFK", - "SSSFPYTTK", - "SSSGFVAIK", - "SSSPPILTK", - "SSSPVNVKK", - "SSSRGPLPVK", - "SSSSPTFPK", - "SSSSSSPFK", - "SSSSSSSPFK", - "SSSSVLINK", - "SSSTVSYLK", - "SSSWPVILK", - "SSVPYSTAK", - "SSVSLPLAK", - "SSVTPSPAK", - "SSYDTAWKK", - "SSYEDKNLLKK", "SSYLNTVQK", - "SSYPVCVSK", - "SSYSLMRQK", - "SSYSQVRNK", - "STAAFFLLR", - "STAAVGVLK", - "STADGSALVK", - "STAEESSPPK", - "STAGLIIGK", - "STAIQELFK", - "STAKPPKEILK", - "STAKVSPLTPK", - "STAMNGNLAK", - "STANIDDLKK", - "STANTYSYHK", - "STAPAQLGK", - "STAQRVTYK", - "STASEDQIVSK", - "STASEETVQNR", - "STASELSPK", - "STASMGGWTK", - "STATATVSVGK", - "STATTGPPPK", - "STAVGLVTK", - "STDERAYQR", - "STDGAKVFSK", - "STDGERLYK", - "STDMPAAFK", - "STDNLLVNK", - "STDPAAPNLK", - "STDPNSVFR", - "STDPSAGTGSQK", - "STDPSKYRK", - "STDPSVLGK", - "STDQASAIK", - "STDQASAIKTK", - "STDTIPKSK", - "STDTVFHMK", - "STEEPMPTK", - "STEFLALMK", "STEKIYIRK", - "STEPIYVYK", - "STEPPYSQK", - "STESNMSVPK", - "STETALYRK", - "STFDSPAHWAQK", - "STFDTQITK", - "STFDTQITKK", - "STFESKSYK", - "STFFYPKLK", - "STFGGHKSEK", - "STFHGQPRER", - "STFIGRAAAK", - "STFKETENTAYK", - "STFKNVTYK", - "STFLMKAAAK", - "STFNFHPNVR", - "STFNNDILSK", - "STFNQVVLK", - "STFNVFVGK", - "STFPVHRQK", - "STFQPANKLNK", - "STFQQM(Oxidation)WISK", - "STFQQMWISK", - "STFRESFKK", - "STFRVPVER", - "STFRVPVERK", - "STFSAPLNK", - "STFSEIFKK", - "STFSGGRIPK", - "STFSGLAKHK", - "STGEEVSLWQK", - "STGHVGFIFK", - "STGQEYAAKFLK", - "STGRPLGTTK", - "STGSYIAGYLK", - "STHGTFLNK", - "STIAILNSVKK", - "STIASSSSSQLK", - "STIDPAVSK", - "STIDPSGTRSK", - "STIEYVIQR", - "STIFYYVQK", - "STIGETSKK", - "STIGPEGVHQK", - "STIGVDGSVYK", - "STIKFQMKK", - "STILPLYSK", - "STIMLDNIVRK", - "STIN(Deamidated)SSSSVVHK", - "STINSSSSVVHK", - "STIPPELVKQK", - "STIPPHVQK", - "STISLQMGTNK", - "STISSNASK", - "STITGVMDK", - "STITKAWKK", - "STITKIHSK", - "STKEEAILK", - "STLAVTSQK", - "STLDGVSRK", - "STLEHGTSLK", - "STLESIYQR", - "STLGGRLQAK", - "STLGSQGQTGK", - "STLGTAHTPK", - "STLGYTISR", - "STLHHVLQR", - "STLLASPMLK", - "STLLNPIPK", - "STLNVGVNK", - "STLPGSTTSNK", - "STLPKPVQK", - "STLPKSLLK", - "STLPNTIYR", - "STLPPVKSK", - "STLQVGSLNVK", - "STLRQKIRK", - "STMAIIVNK", - "STMDKFNVTK", - "STMDLVKSK", - "STMELDEALRK", - "STMGYM(Oxidation)MAK", - "STMGYMAAK", - "STMGYMAAKK", "STMGYMMAK", "STMGYMMAKK", - "STMPHTSGMNR", - "STMPHTSGMNRL", - "STMTSGQAR", - "STMVDVRVMK", - "STMVDVRVMKK", - "STMYPGLPSRL", - "STNEGMNVK", - "STNEGMNVKK", - "STNHTQALLK", - "STNLIIHQK", - "STNLPSPNK", - "STNN(Deamidated)MAYNK", - "STNNIAQAR", - "STNNMAYNK", - "STNNWVLIK", - "STNPFRPQK", - "STNPKAALK", - "STNSFALNK", - "STNSHPILR", - "STNSHPILRK", - "STNSPVGVSK", - "STNTSLLTSK", - "STPGTAPPPK", - "STPLAGLAPK", - "STPLGQQQPAPR", - "STPSFSSPK", - "STQAEGTRTLK", - "STQANQPPR", - "STQDHAAAAIAK", - "STQDTTVALK", - "STQEDVINK", - "STQIVANAK", - "STQIYQAKK", - "STQN(Deamidated)GPVFAK", - "STQNGPVFAK", - "STQQEKETIAK", - "STQQPLTKK", - "STQRDLWNIFK", - "STQSKVMNK", - "STQSLARLGS", - "STQSLSLQR", - "STQSSLLRK", - "STQTALTLK", - "STSATTPVK", - "STSDILSEK", - "STSDSVRLK", - "STSEAPQPPR", - "STSENITQK", - "STSEPLSSK", - "STSERTLLK", - "STSETPQPPR", - "STSGPPTISK", - "STSGTVINK", - "STSNSFNLK", - "STSPSQPRK", - "STSPYFLEH", - "STSQLYTVK", - "STSQQVPAQRK", - "STSQSPPIK", - "STSQTFIYK", - "STSSPYVSK", - "STSTPAPSR", - "STSVPENPK", - "STTAILQQK", - "STTEVTQPR", - "STTN(Deamidated)QSISK", - "STTNQSISK", - "STTPPTSAK", - "STTQVVGILK", - "STTTGHLIYK", - "STTTTQITK", - "STTTTTHITK", - "STVAPPQGVVK", - "STVDAEAVHK", - "STVDSSHLHSK", - "STVEKIAM(Oxidation)K", - "STVEKIAMK", - "STVGAGAYAYK", - "STVGGQSVKK", - "STVGSAISR", - "STVGSAISRK", - "STVGWASQK", - "STVNKWTLK", - "STVNVILGK", - "STVPPSLRK", - "STVQILGAEK", - "STVSADPVVK", - "STWEGIQAGK", - "STWGDFHYK", - "STYALTLYK", - "STYATTIRDSK", - "STYDGVFIWK", - "STYDLYTIPK", - "STYEQVDLIGK", - "STYGKIGVK", - "STYGSQASHNK", - "STYGTHIHEK", - "STYGVTKGK", - "STYKEAFRK", - "STYPAQN(Deamidated)GQVK", - "STYPAQN(Deamidated)GQVKK", - "STYPAQNGQVK", - "STYRKFSTK", - "STYTPENLLNK", - "STYYNPSLK", - "SVAAPITVR", - "SVAASVTAK", - "SVADPGQLK", - "SVADVSSSR", - "SVAEAPSTTK", - "SVAEHPLSR", - "SVAELRSQK", - "SVAETAQTIK", - "SVAGLKKQFYK", - "SVAHSPPEK", - "SVAKTILKR", - "SVAKTSVDILK", - "SVAPARAQPPK", - "SVAPPGGSR", - "SVAPSKAREYSK", - "SVAPVFTVTK", - "SVAQLLLSK", - "SVAQQLLNGK", - "SVAQTVVQK", - "SVAQVVLSR", - "SVASATSVATK", - "SVASPFTSK", - "SVASSRSSVLK", - "SVASTPISQR", - "SVATGLNMMK", - "SVATVVYLR", - "SVAVLRGIQK", - "SVDEESYKTLK", - "SVDGPVSQK", - "SVDKIVIQK", - "SVDLPKHAK", - "SVDPKNYPK", - "SVDQAGKYSK", - "SVDSLPLAK", - "SVDVHQVYK", - "SVEDNNGN(Deamidated)MYK", - "SVEDNNGNMYK", - "SVEDPTKQTK", - "SVEEGEKVVK", - "SVEEISTLVQK", - "SVEERITQVAK", - "SVEGEGEEEGEEY", - "SVEGPSQAK", - "SVELPIVGK", - "SVEMPLTGK", "SVFAFGENK", - "SVFDSSSDMEK", - "SVFDVKSGSAVHK", - "SVFEDPVISK", - "SVFELTFKR", - "SVFESLIAK", - "SVFESLIAKK", - "SVFEVDGKKNK", - "SVFFPESGLAK", - "SVFGGLVNYFK", - "SVFGTMPLK", - "SVFIDSIPK", - "SVFKSARQK", - "SVFLGTHSK", - "SVFNHAIRH", - "SVFPFESGKPFK", - "SVFPKPFVQK", - "SVFQQGM(Oxidation)KNK", - "SVFQQGMKNK", - "SVFQTTDTK", - "SVFQTTDTKSK", - "SVFSDKLHSK", - "SVFSGNPSIWLK", - "SVFSKYFER", - "SVFSPSFGLK", - "SVFSPYWLINK", - "SVFSYQVASTLK", - "SVFTSVRQK", - "SVFTTSQDSTLK", - "SVFVATFLR", "SVFVETFVQK", - "SVFYGAPSK", - "SVGPPSKDK", - "SVGQTVITK", - "SVGSVITKK", - "SVGTEMIITK", - "SVGTIFGIYRK", - "SVHFPLRSK", - "SVHWFPVQK", - "SVIDEPVRLK", - "SVIDTSTIVRK", - "SVIDVFNQR", - "SVIELLLKK", - "SVIEQILHY", - "SVIEVPAVPEEILK", - "SVIGLQMGTNK", - "SVIGSN(Deamidated)GYILNK", - "SVIGSNGYILNK", - "SVIGSTETTGK", - "SVIGVFITK", - "SVIIAKVTAKK", - "SVIKNVSTK", - "SVIKTQETK", - "SVILPILKK", - "SVINKVTEK", - "SVINNSHNK", - "SVINPGAIYR", - "SVIQQPAPDR", - "SVIQTGHLAK", - "SVIRDYLVQK", - "SVIRPPFKK", - "SVIRPPFKKFSK", - "SVISIMKPVRK", - "SVISSPLLK", - "SVITIVKSK", - "SVIVPSGAPK", "SVIVQPFSK", - "SVLAETEGILQK", - "SVLAETIKK", - "SVLAQQAAK", - "SVLAWHSRYK", - "SVLDGAVVK", - "SVLDIETRK", - "SVLDMEAITFKK", - "SVLDSFLKY", - "SVLDSSALK", - "SVLDTVLLR", - "SVLDYFSER", - "SVLEGVLSK", - "SVLENFVGR", - "SVLEPGTAK", - "SVLEPGTAKK", - "SVLEPPLFLK", - "SVLEVRTENLK", - "SVLGISTPK", - "SVLGKDEQINK", - "SVLGKGSMRDK", - "SVLGKVNEIAK", - "SVLGLLLKK", - "SVLGQAMEK", - "SVLGQLGITK", - "SVLGSSTVSK", - "SVLHVLGILK", - "SVLIQKQIFK", - "SVLKEKITFK", - "SVLLFVTKK", - "SVLLPLVAK", - "SVLNFATNR", - "SVLNIPMAK", - "SVLNLVIVK", - "SVLNLVIVKK", - "SVLPEGGETPLFK", - "SVLPEGPVWVK", - "SVLPNQVSVITK", - "SVLPVLDNPLSK", - "SVLQEPPAKK", - "SVLQGLLKK", - "SVLQLGNIVFK", - "SVLRELFKK", - "SVLRLSVSY", - "SVLSPLLNK", - "SVLSTSTNR", - "SVLTDPAKLK", - "SVLTDPAKLKK", - "SVLTIDKMQNK", - "SVLVSAGNVK", - "SVLWPWINR", - "SVM(Oxidation)RLTISY", - "SVMAQVRQK", - "SVMDGAIASGVSK", - "SVMDHHFRK", - "SVMDQEMRVK", - "SVMDSPKKLK", - "SVMGPQEKK", - "SVMGVTVSR", - "SVMKDIKNTTQK", - "SVMKDISIGK", - "SVMKSFIKR", - "SVMLGGRNIK", - "SVMNPKPSSWRK", - "SVMPKKSILK", - "SVMPKKSILKK", - "SVMPPMSTHR", - "SVMQQNLVYYR", - "SVMQSGTQMIK", - "SVMRLTISY", - "SVMRPEQIMK", - "SVMSTVEWNK", - "SVMYPVDSVK", - "SVNGDSISK", - "SVNGKVLSK", - "SVNKASTVTK", - "SVNLSNVLK", - "SVNNSIFYR", - "SVNNVVVRY", - "SVNPNKPATK", - "SVNPSVTTIK", - "SVNSDISKK", - "SVNSHIYQR", - "SVNSQTLNR", - "SVNSTVLVK", - "SVPADLSRPK", - "SVPDSSALPTK", - "SVPEAGGPPIKK", - "SVPEFPLSPPK", - "SVPEFPLSPPKK", - "SVPEGPWWRK", - "SVPEN(Deamidated)GHHPK", - "SVPENGHHPK", - "SVPGSQTVVVK", - "SVPIGRFQNR", - "SVPLPISHK", - "SVPLSDALLNK", - "SVPNGQTPLK", "SVPREPIDRK", - "SVPSTPIAHR", - "SVPVAVVPSK", - "SVQAPEVAK", - "SVQAVLVGK", - "SVQDNALQR", - "SVQDSSVLVQR", - "SVQEGDSAVIK", - "SVQETVLPIK", - "SVQEYFVRK", - "SVQGFFLNH", - "SVQGIIIYR", - "SVQKEVEKNLK", - "SVQPEELIYQR", - "SVQRVTRSVK", - "SVQSASSTVKK", - "SVQSDQGYISR", - "SVQSSVLGK", - "SVQTADHRFLR", - "SVQTQPAIKK", - "SVQTSRLAK", - "SVQVFGRKK", - "SVQVPEFTPK", - "SVRLAPVYQK", - "SVSAPSKKVAK", - "SVSAVNLPK", - "SVSDFNYSR", - "SVSDIIVVAK", - "SVSDLAPPR", - "SVSDLAPPRK", - "SVSDLFNTK", - "SVSDLFNTKK", - "SVSDPVEDK", - "SVSEIGGKIFEK", - "SVSEVIEGY", - "SVSEVMKESK", - "SVSEVVVNR", - "SVSGYIYHK", - "SVSIPSITK", - "SVSKLSTPK", - "SVSLPSVKK", - "SVSLPVRKK", - "SVSNMVHTAK", - "SVSNVVITK", - "SVSPASAGKRK", - "SVSPASTLK", - "SVSPDTPVRK", - "SVSPGLPQR", - "SVSPIPAGSK", - "SVSPVVHVR", - "SVSQKLMAK", - "SVSQPIMVQR", - "SVSQPVAQK", - "SVSRSPVPEK", - "SVSSAPTLLK", - "SVSSDRIQK", - "SVSSLTVAR", - "SVSSPVKSK", - "SVSSQTITK", - "SVSSSSYRR", - "SVSSVSTLK", - "SVSTHLITK", - "SVSTITRIYR", - "SVSTPLIIK", - "SVSTQQPPK", - "SVSTQQPPKK", - "SVSTVLTSK", - "SVTGSAVSK", - "SVTGVTASK", - "SVTKTALNK", - "SVTSPIKMK", - "SVTTEPSSLK", - "SVVAVLVYK", - "SVVDISQQY", - "SVVEASEAAYK", - "SVVGDEVVLINR", - "SVVGELMYK", - "SVVGGLAVGK", - "SVVGNFQEK", - "SVVGTDGTPK", - "SVVMHSIQK", - "SVVNKMQQK", - "SVVNSFIEK", - "SVVQSGQLK", - "SVVSDILFK", - "SVVSSVTTK", - "SVVTGSEQK", - "SVVTPARVQFK", - "SVWHGTLSK", - "SVYAGAGGSGSR", - "SVYDDQPNAHKK", - "SVYDGEEHGR", - "SVYDHQGIFK", - "SVYDHQGIFKR", - "SVYDSVLQK", - "SVYEGKIFTQK", - "SVYEN(Deamidated)GLSQK", - "SVYEPFKVRK", - "SVYEQHESTPLR", - "SVYGEWVPVEK", - "SVYGYGVQK", - "SVYHISGKKK", - "SVYITLKK", - "SVYKEAIQK", - "SVYQIKVHRK", - "SVYRGSLTQR", - "SVYSDIVGK", - "SVYSETSNMDK", - "SVYSPESSVRK", - "SVYSPVKKK", - "SVYSWDIVVQR", - "SVYVDAVGQFLK", - "SVYVLVRQK", - "SVYVYKVLK", - "SVYYNEATGGK", - "SVYYPQVRK", - "SYANYFIRL", - "SYDHVELTF", - "SYDLANRDF", "SYDPTIENTF", - "SYGDILHVI", - "SYGPVAYHL", "SYIAAISARF", - "SYIDLLQRF", - "SYIDMDKELEF", - "SYIDVAVKL", - "SYIEHIFEI", - "SYIEVSHGL", - "SYIHYVFRL", - "SYINLNPRL", - "SYINYVITM", - "SYIPSTVFF", - "SYIRPEDIVNF", - "SYLAVHKRI", - "SYLDQFRQL", - "SYLDQVKLQF", - "SYLDRTEQL", - "SYLDSIHFF", - "SYLDSVHFF", - "SYLDVKGNHF", - "SYLDVKQRL", - "SYLERHGLINF", - "SYLESFYHM", - "SYLGSIARL", - "SYLKEFIHI", - "SYLKQLPHF", - "SYLNSVQRL", - "SYLPFTEAF", - "SYLPISPTF", - "SYLPLAHMF", - "SYLSRLQYF", - "SYLTIHHRI", - "SYLTVHKRI", - "SYM(Oxidation)GHFDLL", - "SYMGHFDLL", - "SYNNFFRM(Oxidation)F", - "SYNPLWLRI", - "SYPTFFPRF", - "SYQKVIELF", - "SYQKVMALW", - "SYQRAFNEF", - "SYSHIMALI", - "SYSHIQSK", - "SYSPQAFKF", - "SYSSTFHSL", - "SYTHIQYLF", - "SYVAGLPRF", - "SYVETELIF", - "SYVNHLYVI", - "SYVNKIKTRF", - "SYVNPDHLNYF", - "SYVQRVALEF", - "SYVQVTSNF", - "SYVRSLPFF", - "SYVTSPQGFQF", - "SYYETSKMKVLKF", - "TAAAALPAF", - "TAAAAVRQM", - "TAAAAVRQM(Oxidation)", - "TAADIFKQY", "TAADTAVYY", - "TAAGLMHTF", - "TAAPGRFSF", - "TAAPVVPEL", - "TAARAWAL", - "TADHNLLLY", - "TADPSHQTM", - "TAEGQTIVY", - "TAEPGSAGATY", - "TAERGLIVY", - "TAFDVAEKY", - "TAFGHPQAY", - "TAFLHPEEF", - "TAFPDGRSSF", - "TAFPTTQ(Deamidated)RPWT", - "TAFQGMLRK", - "TAFRNKSMLFK", - "TAGSTSIPK", - "TAIDDMEAY", - "TAIGAHPVSM", - "TAIGMPVEK", - "TAIMEKHSM", - "TAIRALETY", - "TAIREAQTF", - "TAIREVYQY", - "TAIRSASAY", - "TALGAAQATAKA", - "TALPASPVAR", - "TAMDVVYAL", - "TAMDVVYALK", - "TAMPPGTAR", - "TAMSERALAQK", - "TANALALAM", - "TANDANTKY", - "TANDRILKY", - "TANEANPLK", - "TANSITVTF", - "TAPPARNR", - "TAREFEIDF", - "TARREDESY", - "TASAVVQHM", - "TASDFITKM", - "TASEMILVL", - "TASEPAVTY", - "TASPAAPAR", - "TASPPPPPK", - "TASPPRQK", - "TASSGHYIAY", - "TATAPPSPLK", - "TATATNHVL", - "TATEITESF", - "TAVIDHHNY", - "TAVKEDEINVY", - "TAVKIAPRY", - "TAVKNDYEM", - "TAVPTLLKY", - "TAVTTVPSM", - "TAWDEADVRF", - "TAYDRAYNR", - "TAYGPNGMNK", - "TAYPGQTQY", - "TDGNTSTTPPTSAK", - "TDHLSWEW", - "TDKSFVEK", - "TDQEEIKTL", - "TDVYVNNEW", - "TEADAEKTF", - "TEADAGHTEF", - "TEADVNPKAY", - "TEAEELRKLW", - "TEAEIDAHL", - "TEAEIDIRL", - "TEAESNMNDL", - "TEAETIQKL", - "TEAILKASW", - "TEAKIKQKL", - "TEALHFVAAAW", - "TEALPVKLI", - "TEALTSAKRY", - "TEAMLYEKF", - "TEAMRVIGF", - "TEANVVRKF", - "TEAPGGYKF", - "TEAPGNLRLY", - "TEAPLNPK", - "TEAQVEKQL", - "TEASELLRY", - "TEAYEKWREW", - "TEAYIAQRF", - "TEDDGRPIY", - "TEDDKAYAY", - "TEDEAIHKY", - "TEDEFKRLF", - "TEDENKQSF", - "TEDGKVEKHY", - "TEDGNQHVY", - "TEDIQTRQY", - "TEDQGMYKY", - "TEDTIKKSF", - "TEDTQGKKKW", - "TEEDFKRLF", - "TEEEFKKRAY", - "TEEEKNFKAF", - "TEEEMRKLF", - "TEEFNREMFW", - "TEEILEKAF", - "TEEILEKSF", - "TEEKTMKSF", - "TEELQRIKW", - "TEESPSGRGW", - "TEETHPVSW", - "TEFDDSLLRNF", - "TEFEDIKSGY", - "TEFEKNVWSF", - "TEFKVDSDDQW", - "TEFNGIRDY", - "TEFNKQKHL", - "TEFPIIKMY", - "TEFRNFIVW", - "TEFTPTEKDEY", - "TEGDTQLNW", - "TEGGEPYRLY", - "TEGPHVLLY", - "TEGPSPGDFRY", - "TEGRQDGHLW", - "TEGVIKVW", - "TEGVQSLNW", - "TEGVSDTNSKSW", - "TEHDLLGTEAW", - "TEHEPTKMFY", - "TEHFNNMSYW", - "TEHGDLGNSRF", - "TEHKSPDGRTY", - "TEHPKINEW", - "TEHQQLEGW", - "TEHSTVGLAQQW", - "TEHSVLIHEY", "TEHYDIPKVSW", - "TEIAEERQY", - "TEIDARAGTF", - "TEIDDTKVF", - "TEIDEKEYI", - "TEIDGRSISLY", - "TEIDGRSISLYY", - "TEIDKPSQM", - "TEIEAEKSM", - "TEIEGTQKL", - "TEIELAKQI", - "TEIKVGVAY", - "TEIPGTKVF", - "TEIREKLAKMY", - "TEIRLRLHY", - "TEITDDLHFY", - "TEKELAEAASKW", - "TELDLYKKM", - "TELEDARQKF", - "TELERAFGYY", - "TELERKLTF", - "TELGRPVAESW", - "TELPKAEKW", - "TEMDSHEEKVF", - "TEMDSRTKSKDY", - "TEMDWVLKH", - "TEMESQKQL", - "TEMNGKNTFW", - "TENDIANFF", - "TENDIRVM(Oxidation)F", - "TENDIRVMF", - "TENDIYNFF", - "TENDKEYQEY", - "TENIDIKKY", - "TENKERKSF", - "TENNVGLKNAW", - "TENRFSVNF", - "TENSAKLHW", - "TENTEENRRF", - "TENTEENRRFY", - "TENTMRVTW", - "TEPALLQRW", - "TEQDLKEYF", - "TEQDSKDSTY", - "TEQSQIKGYVW", - "TEQWPYRTSW", - "TERDKQSKW", - "TESEAQRDMW", - "TESHHRKEAW", - "TESQQIRYF", - "TETDLRNHF", - "TETEIQKKA", - "TETETIAKY", - "TETQTAGVIDRW", - "TETTVKTAAW", - "TEVDARLSF", - "TEVDIKMKF", - "TEVDNYHFY", - "TEVDSRWQEY", - "TEVITGTLW", - "TEVLKNMGY", - "TEVLLSHLSY", - "TEVQVFKKY", - "TEVSLLRVGW", - "TEVSQKENY", - "TEVTGHRW", - "TEWQSGQRW", - "TEYLEERRI", - "TEYPVQRNY", - "TEYTPDPNHGF", - "TEYYDGKTRRY", - "TFDAGLQAF", - "TFDASRTTF", - "TFDDVAVTF", - "TFDLQLGRF", - "TFDLQRIGF", - "TFDNEIVMM", - "TFDSTIHF", - "TFDVAPSRL", - "TFDVAPSRLDF", - "TFDVSPKAV", - "TFEPGSYQF", - "TFLDDSGSLNW", - "TFLNIAEHF", - "TFLPTGLQF", - "TFMDRGFVF", - "TFPNIASATKF", - "TFVDNIQTAF", - "TFVPMLHRF", - "TGFEQNSTY", - "TGFSSLFLK", - "TGNPTVIKM", - "TGVSSSTNPFRPQK", - "TGWDESQANHF", - "TIAPALVSK", - "TIDDTISKFRR", - "TIDERAINKK", - "TIFGKIIRK", - "TIFGNFLEK", - "TIGADLHF", - "TIISEQQAKSLLK", - "TIM(Oxidation)PKDIQLAR", - "TIMPKDIQLAR", - "TIMSSSMGK", - "TIQSGEQPYK", - "TISPPLQPK", - "TITPVVGKK", - "TIYNAAIQK", - "TIYSEADLRKK", - "TLFIPENSFRK", - "TLFYLGKRK", - "TLLDKYWTK", - "TLMGPIVMK", - "TLPNTIYRF", - "TLQ(Deamidated)PTPALTY", - "TMAPPIKSK", - "TMLGKFYHF", - "TMMGQQVAK", - "TNFEDRNAF", - "TPAEIREEF", - "TPAEPTPGY", - "TPAEPVQYY", - "TPAGAAVSAM", - "TPAGVVNKY", - "TPALVNAAVTY", - "TPAPPGPATM", - "TPAPPTHAL", - "TPARDYNNSY", - "TPASPQPFY", - "TPATWKQEY", - "TPDAMKAAM", - "TPDETKLKM", - "TPDPSRSVF", - "TPDPTRPLTF", - "TPEEDQRTY", - "TPEEGGYSY", - "TPEEKIREY", - "TPEQQAAIL", - "TPETRGTAYVVY", - "TPFKGGTLF", - "TPFLGQHGFNF", - "TPFQQPSGY", - "TPFRNFEEF", - "TPFVDPRVY", - "TPGGTRIIY", - "TPGPPPISY", - "TPHDFIEHF", - "TPHGDYIEF", - "TPHSYIDTY", - "TPIDSNIAF", - "TPIEGKN(Deamidated)MSF", - "TPIKDGILY", - "TPINQN(Deamidated)VSL", - "TPIQSKEAY", - "TPISITSSY", - "TPLEEAIKF", - "TPLHLVALY", - "TPLHMAIAY", - "TPLPEDNSM", - "TPLQNNLIEY", - "TPLSSTVTL", - "TPLVDPSVY", - "TPNEERNVM", - "TPNEERNVM(Oxidation)", - "TPRATTESF", - "TPSEPHPVL", - "TPSGPVEAF", - "TPSHAMKITY", - "TPSQPLPTY", "TPSSDVLVF", - "TPSSVIYHL", - "TPTGAISQY", - "TPTGIKVVM", - "TPTLPSITY", - "TPTPFFHTF", - "TPTRASPQL", - "TPTVIAVHY", - "TPVDDPM(Oxidation)SLLY", - "TPVDDPMSL", - "TPVDDPMSLLY", - "TPVDLNKHLY", - "TPVDSDIGSHL", - "TPVFGKGVAY", - "TPVFSKARY", - "TPVKDLVKY", - "TPVPDGKNAM", - "TPVTEFSLNTY", - "TPWPAQPQRTF", - "TPYDLPGNLLRY", - "TPYEEGLHSVDVTY", - "TPYEGQRSY", - "TPYEYPYTL", - "TPYKGGNLY", - "TQATIYVHK", - "TQEKNPLPSK", - "TQFNYHRKK", - "TQHIQQPRK", - "TQLNKFYTK", - "TQREKLTF", - "TQVAVSVPK", - "TSAFMPVLK", - "TSALPIIQK", - "TSAPAAKPK", - "TSFDGSLIQK", - "TSFSEALLK", - "TSFSGITKK", - "TSGPPTISK", - "TSGPTTPLK", - "TSGPVTTSK", - "TSIQPGAPK", - "TSLDKFYRK", - "TSLKFFLNK", - "TSLKSIMKK", - "TSLSVSTPK", - "TSNPVTTTK", - "TSQPFQVLK", - "TSQRIFITY", - "TSSAVTSVAK", - "TSTASTFVK", - "TSTTPPTSAK", - "TSVGYAIFK", - "TSWRDGMAF", - "TSYSSINTPK", - "TTAAPSPPR", - "TTAAVGVLK", - "TTADFRTKK", - "TTAEGMAKK", - "TTAPPSSPK", - "TTAPSLSGK", - "TTAPVVSTR", - "TTAQLQVQK", - "TTASQTNIKK", - "TTASTLSLVNK", - "TTATATPSK", - "TTATFAATK", - "TTATPTIMK", - "TTDPGASSLGK", - "TTDQSVASVRK", - "TTDRYIQQK", - "TTDRYVQQK", - "TTEGQVQVLK", - "TTEGRNALIHK", - "TTFGPKSQRK", - "TTFGTATYK", - "TTFPESHLR", - "TTFTKIVNK", - "TTGEPATPK", - "TTGQVVAMK", - "TTHQVYVLK", - "TTIAGVVYK", - "TTISAEKVKKK", - "TTITSHFAK", - "TTKKPPLAQK", - "TTLAFKPIKK", - "TTLGHAVLK", - "TTLPPPLFSK", - "TTLSSIRSK", - "TTMLLRIKK", - "TTMQALAEK", - "TTNDIVISK", - "TTNLSIQQK", - "TTQAPSLQK", - "TTQDPLSNK", - "TTQEVQVGQK", - "TTQGVDMISKMLK", - "TTQLSLSFK", - "TTQQQLPQK", - "TTSDFYFEK", - "TTSIPSTPK", - "TTSSSMWKK", - "TTSVITIVK", - "TTTGHLIYK", - "TTTGVDPVAK", - "TTTTTHITK", - "TTVDIFHKK", - "TTVGVDGSLYK", - "TTVPEEELNPK", - "TTVPHVFSK", - "TTYKYEMINK", - "TVAAGTMTGMLYK", - "TVADTTLTK", - "TVAEISQFLK", - "TVAEITGSKY", - "TVAEVVETM", - "TVAGLALIK", - "TVAGVHVK", - "TVAHKIMQK", - "TVAPTTANK", - "TVAQITQRF", - "TVATFILQK", - "TVAVPLVGK", - "TVAVPLVGKL", - "TVDEKNYTK", - "TVDKNMPKFNK", - "TVDPKYHPK", - "TVDPNKRLK", - "TVEDVIVRK", - "TVFDAKRLIGR", - "TVFDTNIQTSAK", - "TVFEHTFHV", "TVFENLINK", - "TVFLSTWNK", - "TVFWNSSNPK", - "TVGDVLEAK", - "TVGPVLSIR", - "TVHGVTQAF", - "TVIDEVRTGTY", - "TVIDSQTHYR", - "TVIHFNNPK", - "TVIKLAILY", - "TVILPIKKK", - "TVIQDGIKK", - "TVIQSTQGMYK", - "TVIRDVEQQFK", - "TVIRFVTNK", - "TVISLLVYK", - "TVITVDTKAAGK", - "TVLHRIYGK", - "TVLKEIFAK", - "TVLQYVVGR", - "TVLRPSLGK", - "TVLSSWIAK", - "TVMELVKIIYK", - "TVMNGALVK", - "TVMNIAEHY", - "TVMTWARSK", - "TVN(Deamidated)STRETPPK", - "TVNNIIQVK", - "TVNPKESILK", - "TVNPVAIHK", - "TVNSPAIYK", - "TVNTMNLPK", - "TVNTSLVGK", - "TVQDGRQFLK", - "TVQEHLIEK", - "TVQEKTFNK", - "TVQELAIYK", - "TVQGPSSTK", - "TVQNIYSAK", - "TVQQHPSTPK", - "TVQTTEDQILK", - "TVQTVPLRK", - "TVQVYIITK", - "TVREQDQSF", - "TVRQIQEEM", - "TVSADPVVK", - "TVSATSPNK", - "TVSDAILRY", - "TVSEPAVIK", "TVSETFMSK", - "TVSEVIQGLLK", - "TVSGIQVRY", - "TVSKFMAIQK", - "TVSPFAVQK", - "TVSPKSFAK", - "TVSRIQSPK", - "TVSRPIVVSK", - "TVSSVNNPR", - "TVTAQILLK", - "TVTEVLLKY", - "TVTKPVPVTK", - "TVTQAILKK", - "TVVDQTTLMKK", - "TVVDVLTSY", - "TVVSYIMQR", - "TVYEEMMAK", - "TVYFKEGKYK", - "TVYNLKAHMK", - "TVYRGLVQK", - "TVYRNPESFK", - "TVYVDVLK", - "TWDPALAQI", - "TWLVNSAAHLF", - "TWTEVSYTF", - "TYAPAIHQI", - "TYARNLPAF", - "TYDNVHQQF", - "TYDPTYSDF", - "TYEPGFVGIRF", - "TYFEKNFNL", - "TYFRFQEEI", - "TYGEIFEKF", - "TYGPSFPAF", - "TYHGSFSTK", - "TYHPGVPVF", "TYIDKSTQL", - "TYIGQGYII", - "TYIKSPPFF", - "TYIPVPAKI", - "TYIQKIFRM", - "TYIQNFRFF", - "TYISKTIAL", - "TYISWKEEL", - "TYITERIIAVSF", - "TYITSVSRL", - "TYLDKIKKF", - "TYLDKVENI", - "TYLDQVKIRF", - "TYLEKAIKI", - "TYLEKFQNL", - "TYLKAVKLF", - "TYLKIARLYL", - "TYLNWLVRM(Oxidation)", - "TYLPAGQSVLL", - "TYLPAPEGLKF", - "TYLPQSYLI", - "TYLPTSPLL", - "TYLRKIPRF", - "TYM(Oxidation)KDLYQL", - "TYMGHTGAVW", - "TYMKDLYQL", "TYNKVLHFF", - "TYNPNMPFKW", - "TYNRIINQI", - "TYPEGLEVLHF", - "TYPIKTPTF", - "TYPQLEGFKF", - "TYQDIQNTI", - "TYQEVAQKF", - "TYQHVPVESF", - "TYQRWQFTL", - "TYRNVMEQF", - "TYSMKYFK", - "TYSPAFKQF", - "TYSYSFFHF", - "TYTDKLFKF", - "TYTDRVFFL", - "TYVDSSHTI", - "TYVEVWNDF", - "TYVRWYTQL", - "TYVSGMLRF", - "TYVSGTLRF", - "TYVSSFYHAF", - "TYVTEVREL", - "TYVTILPEL", - "TYVYFTNEL", - "TYYRGFLTL", - "VAAEKSFNK", - "VAAKPVATK", - "VADGYPVRL", - "VADPYVVIM", - "VAIKAMAK", - "VAIQAVLSL", - "VANAIIHLF", - "VANKEYVAY", - "VAPSRLDF", - "VAQRDPIIAK", - "VAQSTRIIY", - "VAVALMYRL", - "VAVFDRGD", - "VAWSN(Deamidated)KSDF", - "VAYGVAVNK", - "VAYHQPTLK", - "VDASIFKAW", - "VDYKADEW", - "VEADDVRAW", - "VEAESEQKW", - "VEAGGLLEKW", - "VEDELVKKY", - "VEDKTDVRKW", - "VEELFERKY", - "VEFQEAQAY", - "VEHDFIMATY", - "VEHNGYAW", - "VEHTNTGTKW", - "VEHTPDGVKW", - "VEHVSRLLW", - "VEHYDPTINKW", - "VEIAIKRADW", - "VEIQFPAEHGW", - "VELGTQPAT", - "VELGTQPATQ", - "VELRILTNW", - "VEMDIVEKL", - "VEMMDQIVHW", - "VEMYDPTRNEW", - "VENGGVTRW", - "VENILAKRL", - "VENKEVLHGKKW", - "VENNLILKM", - "VENNPAIKW", - "VENVPPLRW", - "VEQGIDAKW", - "VESVVIKNL", - "VETRVFLQY", - "VEVAEESGRLW", - "VEVEGDNRY", - "VEVGDRTSW", - "VEVKHGDTW", - "VEVPFDLHRY", - "VEVQDSIHRW", - "VEVSPATERQW", - "VEYEDESGHRY", - "VFADVETHF", - "VFAGVFNTF", - "VFDEAIRAV", - "VFDEAIRAVL", - "VFDEAVRV", - "VFDERAANF", - "VFDIHVIDF", - "VFDIHVVYV", - "VFDKTLAEL", - "VFDLSEKL", - "VFDNSIKTF", - "VFDPHGTL", - "VFDPIGHF", - "VFDPKVFTF", - "VFDPVPVGV", - "VFDPVQKTL", - "VFDPVTKL", - "VFDTAIAHL", - "VFDTSIAQL", - "VFDVSHNAV", - "VFEKTKRLLF", - "VFESWMHHW", - "VFFKGFKW", - "VFHAHSSVLNF", - "VFHESIPEW", - "VFHVVTGLRW", - "VFIDHPVHL", - "VFIDKQTNL", - "VFIGHALQW", - "VFIGRYYT", - "VFIGRYYTVF", - "VFIGTGHLL", - "VFIHKDKGFGF", - "VFIKYLPEW", - "VFINKGKGFGF", - "VFINVPTVSF", - "VFIPYRESVLTW", - "VFLEVSQHW", - "VFLNLHTLKF", - "VFLNRAKAVFF", - "VFLPDQGAFF", - "VFLPGFYHL", - "VFLPREDHLF", - "VFLPSTPGL", - "VFLRAINKF", - "VFMKSVKLEW", - "VFN(Deamidated)QTVTVI", - "VFNDVRLLL", - "VFPDKGYSF", - "VFPEKGYSF", - "VFPKEPVEL", - "VFPKPLITRF", - "VFPRLHNVLF", - "VFSTVVIHF", - "VFTEVANLF", - "VFTGVVTKL", - "VFTKIRLVL", - "VFVDSVPEF", - "VFVNTHHIL", - "VFVPYRDSVLTW", - "VFYPYPQYF", - "VGGSTRIPK", - "VGSTSENITQK", - "VGVNLPQK", - "VGVPRSIAANMTF", - "VHFPMVVY", - "VHLTPEEK", - "VIAESVVKK", - "VIDEPVRL", - "VIDPGFAK", - "VIDSQELSK", - "VIFDETLQK", - "VIFKDFVNK", - "VIFTGGVGK", - "VIKNKTWKF", - "VILPPLSPYFK", - "VIMNSLITK", - "VINFKKIYK", - "VIQDPMGQK", - "VISPPTVPK", - "VIVLVENFYK", - "VIYEKTIRK", - "VIYFPPLQK", - "VIYNEQMASK", - "VIYPLAVPK", - "VIYPYVYEK", - "VIYSTPLPEK", - "VKAIIYQY", - "VLAPEGSVPNK", - "VLAPVIDLK", - "VLFAGQHIAK", - "VLGPTPVQK", - "VLLPKLPQF", - "VLPNIHPEL", - "VLPSSLPTF", - "VLQAADILLYK", - "VLSPADKTNVK", - "VLVKAEYY", - "VLYAKVHMK", - "VLYEGIKVGK", - "VLYENPNLK", - "VM(Oxidation)APRTLLL", - "VM(Oxidation)APRTVLL", - "VM(Oxidation)LGTQLLYKF", - "VMAPRTLLL", - "VMAPRTVLL", - "VMKSLTQTF", - "VMLGTQLLYKF", - "VMRDPASK", - "VMRDPNTK", - "VMRDPQTK", - "VNGKVLSK", - "VNSSDMLK", - "VNVDEVGGEALGR", - "VPADAVVQY", - "VPAEHQVAM", - "VPASLPVDF", - "VPASLPVEF", - "VPDAKIRIF", - "VPDLVHVM", - "VPDSSGPERIL", - "VPEEGGATHVY", - "VPEHSPVVY", - "VPESSLAGHSF", - "VPFESEDNQGIVY", - "VPFHSDLGY", - "VPFIYGHKY", - "VPFLPVNPEY", - "VPGPTGLHY", - "VPHNPAPPM", - "VPHNYGLVLY", - "VPHRATVY", - "VPHSIINGY", - "VPHSLETLY", - "VPIPDVYQTY", - "VPIPTVNQY", - "VPIQPFGISY", - "VPKRDVERY", - "VPLDERIVF", - "VPLGHVDAIEY", - "VPLKGIVSY", - "VPLQRVDVM", - "VPLSEPVTM", - "VPMDGRNAY", - "VPMGGMMVRQSF", - "VPMPYTLKVHY", - "VPNPDPVTM", - "VPNSNPPEY", - "VPPEVAQQY", "VPPVFVVSY", - "VPRDQDFQENY", - "VPRIQLEEY", - "VPRSGEVY", - "VPSDVQKVQY", - "VPSPAQIMY", - "VPSSAELHY", - "VPSSELQIY", - "VPTDEARAF", - "VPTSVKDMRY", - "VPVAKTAEL", - "VPVDLQHQF", - "VPVDVVVNM", - "VPVEEPIAF", "VPVEEQEEF", - "VPVEGDEVTY", - "VPVMTQPTLIY", - "VPVPPLPEY", - "VPVPPNVAF", - "VPVSVVSDSY", - "VPVVVIDSY", - "VPVWIIHYY", - "VPWHEEVVQF", - "VPWLSSVRY", - "VPYPDDLVGF", - "VPYPDITNF", - "VPYRIFPY", - "VQ(Deamidated)RGN(Deamidated)ILNL", - "VQGVISVPK", - "VQPKQDAFANF", - "VQPRNWLLFA", - "VQPSKYHFL", - "VQPSLFYHL", - "VQRTLLEK", - "VSAPNIAMK", - "VSDPSSPQYGK", "VSEGTKAVTK", - "VSEYQQYQDATAE", - "VSFGESVLK", - "VSFPAGKFTIK", - "VSFPIGIYK", - "VSFSDVFFK", - "VSKGSAFSTSISK", - "VSLDYAISK", - "VSLGLAVSK", - "VSLGTPIMK", - "VSLWLPVSK", - "VSMDNSNKYTK", - "VSMDYAISK", - "VSMFVEVHK", - "VSMPDVDLNLK", - "VSNQVAVNMYK", - "VSQEPFPNK", - "VSSPKLAPK", - "VSSSPTSSPK", - "VSSTPVPQR", - "VSSWLPLAK", - "VSTVLTSKYR", - "VSYSHIQSK", - "VSYVEVVKK", - "VTAEAVAVLK", - "VTAKELSLVNK", - "VTAPIALLK", - "VTAPPARNR", - "VTATQLIQK", - "VTAVPTLLK", - "VTDDSPPSKK", - "VTDKGSFEK", - "VTDNGSPPK", - "VTDPETHKSTK", - "VTDPSIPIRK", - "VTDPSIPIRKK", - "VTDSPRILK", - "VTEGSFVYK", - "VTEKVLAAVYK", - "VTESQTYKK", - "VTFRPLFFK", - "VTFVPGLYK", - "VTGPNMGGK", - "VTGPSQISK", - "VTGRFNGQFK", - "VTGSWDQTVK", - "VTHRPPLSPK", - "VTIEHARAR", - "VTIFIRGGNK", - "VTIIFIYEK", - "VTIKEGSQLK", - "VTISHAIGR", - "VTISSVEKK", - "VTITNDGATILK", - "VTKDPNWYK", - "VTKYTSSK", - "VTLELAVYK", - "VTLGTQGSPITK", - "VTLHDMILK", - "VTLPYFHSF", - "VTLSWKPVQK", - "VTLTTQHVK", - "VTMKEILLK", - "VTMNTPVEK", - "VTMPATETK", - "VTMPATETKK", - "VTNDFVMLK", - "VTNDGATILK", - "VTNNAEKEMVK", - "VTNNVIRLK", - "VTNPDIAAK", - "VTNQPVTPK", - "VTNVTSLLK", - "VTNWDDMEK", - "VTQDFMMYR", - "VTQDTENELK", - "VTQNGGLYK", - "VTQPSNTYK", "VTQSEIAQK", - "VTQSEIAQKQK", - "VTQSEIGQK", - "VTSEVPFSK", - "VTSMSTQTK", - "VTSQFISKK", - "VTSQVSNLK", - "VTSSVSTLK", - "VTSTFIIEK", - "VTTEPSSLK", - "VTTGGMVLK", - "VTTGSEGLLK", - "VTTTVTGAK", - "VTVDGHLIRK", - "VTVDPKYHPK", - "VTVGVDGTLYK", - "VTVKGPILK", - "VTVQEMVTK", - "VTVSGGTPK", - "VTYDLIKDALLK", - "VTYEHLITK", - "VTYKENIAK", - "VTYN(Deamidated)GVDNNK", - "VTYTEHAKR", - "VTYYHYFSK", - "VVAAGGVEK", - "VVAAVIWRK", - "VVAAVMWRK", - "VVAGVANALAHK", - "VVAGVANALAHKYH", - "VVAPPGAPK", - "VVCEYIVKK", - "VVDAHVREK", - "VVDAKTLKK", - "VVDDSQLPK", - "VVDEHTGQYVK", - "VVDEKISAMGK", - "VVDENAVAK", - "VVDENNMNK", - "VVDGLEKAIYK", - "VVDIPFRSK", - "VVDQTTLMK", - "VVEGSFVYK", - "VVEKPQPKK", - "VVFAVKQYISK", - "VVFDDSEPVQK", - "VVFDSIESAKK", - "VVFDTSLQVKK", - "VVFGSRNPQK", - "VVFITPNPLSK", - "VVFRDPYRFK", - "VVFRDPYRFKK", - "VVFVGVKYVNK", - "VVFVIDPGFAK", - "VVGAVVFQK", - "VVGLPNVGK", - "VVGPELHHK", - "VVGPVSLPR", - "VVGPWIQTK", - "VVIAMSGISK", - "VVINFDFPK", - "VVINVNNILK", - "VVINYSIVK", - "VVLDQTGVSK", - "VVLEKAMHK", - "VVLGNIIKK", - "VVLGSGGVGK", - "VVLPYLVPK", - "VVLTSGIPK", - "VVLYPLVAK", - "VVM(Oxidation)RDPNTK", - "VVM(Oxidation)RDPQTK", - "VVMAADRSLK", - "VVMAADRSLKK", - "VVMADPKGK", - "VVMENVGQQK", - "VVMGKQQSK", - "VVMGKQQSKLK", - "VVMKASSSLPK", - "VVMRDPASK", - "VVMRDPNTK", - "VVMRDPQTK", - "VVMTPVPLFSK", - "VVMVNQGLTK", - "VVMYVQKKK", - "VVNGKVEYFLK", - "VVNKVPLTGK", - "VVNSPHRQYK", - "VVQDGITLITK", - "VVQDHSALFK", - "VVQDMLVPMK", "VVQEPGQVFK", - "VVQNGFFAHK", - "VVQPSGTSK", - "VVQQQKLKK", - "VVQSVEKFIQK", - "VVSEKQFSK", - "VVSENQRLK", - "VVSETISSK", - "VVSGAANVIGPK", - "VVSPIPANK", - "VVSPSSFENVK", - "VVSSSIVDK", - "VVSVILEQK", - "VVTEHLINK", - "VVTESQTYK", - "VVTGPSASK", - "VVVASTVQK", - "VVVDEADTMLK", - "VVVDPIQSVK", - "VVVGVYRPPPK", - "VVVKLFSEK", - "VVVKPEKTEK", - "VVVPPLPGK", - "VVVVNPQTK", - "VVYEAVIRK", - "VVYPWTQRF", - "VVYQYWNTK", - "VVYSGLENIKK", - "VVYTSHLQLK", - "VVYVGGILTK", - "VVYWLYMKK", - "VWDTKEVQM", - "VWDVGSHF", - "VWIRNIQLGF", - "VWLEEELKTF", - "VWLRAQLGW", - "VWLRLRKILF", - "VWNPRTHQF", "VWSDVTPLTF", - "VWSNVTPLKF", - "VWYPGKPLKV", - "VYADQPHIF", - "VYADYHTHF", - "VYAEVSRLLL", - "VYAHIYHQHF", - "VYAILTHGI", - "VYAQVARLF", - "VYAVIPAEKF", - "VYDIAAKF", - "VYDLLKTNL", - "VYDLSIRGF", - "VYDTNPAKF", - "VYDTVFKHF", - "VYDVAMKL", - "VYDVVELKF", - "VYEDLRGSVTF", - "VYEDLRYKL", - "VYEEILHQI", "VYEGPELNHAF", - "VYEPVSYHV", - "VYERELQTF", - "VYEYVVERF", - "VYFPDQHINF", - "VYGFQWRHF", - "VYGFVREAL", - "VYGKVKALKF", - "VYGPLPQSF", - "VYGWTQHKF", - "VYHILKVLF", - "VYHNMPLIW", - "VYHSDIPKW", - "VYIAELEKI", - "VYIDKVRSL", - "VYIDQTMVL", - "VYIDRVRSL", - "VYIEAAIRF", - "VYIEHRLMM", - "VYIESRIGTSTSF", - "VYIHGGGWAL", - "VYIHHFDRI", - "VYIHPSSALF", "VYIKHPVSL", - "VYINTAQEF", - "VYIPMSPGAHHF", - "VYIPNKVLI", - "VYIRGSKIRF", - "VYISEHEHF", - "VYISKTTYI", - "VYISNGQVL", - "VYISSSAGARW", - "VYITDKTVL", - "VYITGKEVFSF", - "VYITNFHVRM", - "VYITNYRLYL", - "VYITRAQLM", - "VYKKSIFVF", - "VYKTIMEQF", - "VYKVPPFTF", - "VYLAAVNRL", - "VYLDGIVRI", - "VYLDHAGAT", - "VYLDHAGATLF", - "VYLDKFIRL", - "VYLDRGTGNVSF", - "VYLDYEAGRLGF", - "VYLEKFMTF", - "VYLGHVIYL", - "VYLHDFQRF", - "VYLHLRQTW", - "VYLKPSYAF", - "VYLPEAMPASF", - "VYLPLTSHI", - "VYLPNINKI", - "VYLPPEAFTF", - "VYLPTHTSL", - "VYLQNWSHVL", - "VYLTIKPLNL", - "VYM(Oxidation)DWYEKF", - "VYMAFKDRF", - "VYMDWYEKF", - "VYMNVMTRL", - "VYNENLVHMI", "VYNKVHITL", - "VYNPVRAEW", - "VYNSEYYHF", - "VYPDGIRHI", - "VYPEKLATKF", - "VYPERTPLL", - "VYPHPGTWESF", - "VYPLMKEYF", - "VYPPIRHHL", - "VYPSSLSKI", - "VYPVITARL", - "VYPYKLYRL", - "VYQDYHTVW", - "VYQHLFTRI", - "VYQKLLERM", - "VYQNHVQHL", - "VYSEAARVLQF", - "VYSEKVMHMF", - "VYSEVAAYEF", - "VYSEVHFTL", - "VYSHVIQKL", - "VYSKDNPNLLF", - "VYSLQQFGF", - "VYSPHVLNL", - "VYSPKSPSL", - "VYSQFITQL", - "VYSQIPAAVKL", - "VYSRTFTW", - "VYSRTFTWL", - "VYTDFAFRI", - "VYTDYVATRW", - "VYTHNLYYL", - "VYTKANPTF", - "VYTKTISLW", - "VYTN(Deamidated)ISHHF", - "VYTSGIYNI", - "VYTSGVYHI", - "VYTSWQIPQKF", - "VYTTMAEHF", - "VYTTTVHWL", - "VYTVHHMVW", - "VYTVHHVVW", - "VYTVVDEMF", - "VYTYIQSRF", - "VYVAGAPRF", - "VYVAIQAVL", - "VYVATRPTI", - "VYVATRPTITE", - "VYVDKVEKM", - "VYVDLGGSHVF", - "VYVGFQVQL", - "VYVGSGGWRF", - "VYVKDLSSF", - "VYVKHSISF", - "VYVPFGGKSMITF", - "VYVPHIHVW", - "VYVPSVRGSKF", - "VYVQHPITF", - "VYVQNVVKL", - "VYVQPPLEL", - "VYVSRPSHF", - "VYVTERIIAVSF", - "VYVVGTAHF", - "VYWDSAGAAHF", - "WDTNDEQGLN", - "WENGFVKKF", - "WENPRVLSF", - "WEQGFSQSF", - "WEVDVQGSKAY", - "WEVDVTGKEAW", - "WEVEVGDRTSW", - "WIASHTTEE", - "WPAEMRVGVY", - "WPAQSIQDDIHLY", - "WPDDLQNHTF", - "WPEEGNVHFF", - "WPVDLVEKL", - "WPVGGDSRFVF", - "WQRDGEDQTQDTEL", - "WSTGGQVSRASQ", - "WSVDPLDR", - "WSVDPLDRAM", - "WSVDPLDRAMAE", - "WYDPKVTRV", - "WYQTKFETL", - "YADPVNAHY", - "YALDYAQRY", - "YALGERQSY", - "YAMKAEVL", - "YASGRTTG", - "YASGRTTGIVL", - "YASGRTTGIVM", - "YAYDEDGTRF", - "YDEIKKYT", - "YDESGPSIVHRK", - "YECN(Deamidated)ECGKGF", - "YEDQVGKFDW", - "YEFDEQGHSTW", - "YEILLGKATLY", - "YEIQDIYENSW", - "YELDAKQGRW", - "YELPTNTQW", - "YEMEVSQRL", - "YENPTYKFF", - "YESDPVKAW", - "YEVEIDGKTY", - "YFDEPVEL", - "YFDPANGKF", - "YFDSGDYNM", - "YFHEALRAF", - "YFIADLPHL", - "YFIDSTNLKTHF", - "YFINRSWEW", - "YFKDTHPKF", - "YFN(Deamidated)DTAQVF", - "YFVN(Deamidated)VTTRI", - "YGFQEKEAF", - "YIFKERESF", "YIKHPVSL", - "YILSPLSYK", - "YISEHEHF", - "YIYDGELVSK", - "YNEFPEPIKL", - "YNRGDSTFESKSYK", - "YPADKISILTTY", - "YPAEITLTW", - "YPAEVTITW", - "YPAHMYQVY", - "YPAQGVQQF", - "YPATGADVAF", - "YPATTPTGM", - "YPDENGFDAF", - "YPDEYHGEY", - "YPDPVSIIQKY", - "YPDRIM(Oxidation)NTF", - "YPDRIMNTF", - "YPEDVAEEL", - "YPENGVVQM", - "YPFDGHNEGTL", - "YPFDSPQVMF", - "YPFHDSDPSALF", - "YPFHKQPPTY", - "YPFKPPKITF", - "YPFKPPKVAF", - "YPFKPPKVTF", - "YPFQVVHDNY", - "YPFRVGELEY", - "YPFSSEQKW", - "YPFTGDHKQKF", - "YPGQPHPAL", - "YPGQPPVTY", - "YPGSHGITAM", - "YPHNGMIDL", - "YPKANIVAY", - "YPLDPTTEHIY", - "YPLEAVRM", - "YPLEGSRSY", - "YPLPRGEKY", - "YPLSIEPIGVRF", - "YPMPGPSGGDFDTY", - "YPMPTGYSQ", - "YPNGPDYQLHNY", - "YPNGVVVHY", - "YPNSGSVSAY", - "YPNVNIHNF", - "YPQPPSQSY", - "YPQPSYNQY", - "YPQQIEPSF", - "YPRLEGTDPEVLY", - "YPRSDVDLY", - "YPSDIAVEW", - "YPSETTVKY", - "YPSKSILL", - "YPSRAVITTM", - "YPSSSRTPQ", - "YPTEDYKVY", - "YPTQPGQGY", - "YPVDLGDKF", - "YPVEHPDKF", - "YPVEIHEY", - "YPVEIHEYL", - "YPVHAQMPSL", - "YPYDGIHPDDLSF", - "YPYEHSYGL", - "YQ(Deamidated)PQYQQ(Deamidated)Y", - "YQDTYGQQWK", - "YQKVVAGVAN", - "YQQYQDATAE", - "YQQYQDATAEE", - "YQQYQDATAEEEGE", - "YRALTVPELTQQM", - "YRALTVPELTQQV", - "YRLYMAED", - "YRSSPTVY", - "YSMPSTHAM", - "YTAPPLQSK", - "YTFDWTMLK", - "YTKKLNTQ", - "YTLDQTYAK", - "YTPITPHL", - "YTYEHDPITK", - "YVHDDGRVSY", - "YVHMVTHF", - "YVLDVLVRA", - "YVTTSTRTY", - "YWMHVQNTF", - "YYAKEIHKF", - "YYDDLKYRYF", - "YYDGKVMKL", - "YYDKHFTEF", - "YYDLARAHL", - "YYDNADKL", - "YYDPKHVIF", - "YYDVAKQLL", - "YYDVGARV", - "YYEEQHPEL", - "YYEHEFVEL", - "YYEHVKARF", - "YYEKQFPEI", - "YYFEGIKQTF", - "YYFPVKNVI", - "YYIDADLLREI", - "YYIDKLEYL", - "YYIDRINSM", - "YYIFIPSKF", - "YYISPRLTF", - "YYITGNLETF", - "YYITTRAQF", - "YYITTRVQF", - "YYLDWIHHY", - "YYLNDLERI", - "YYLNEIQSF", - "YYLQGGFNKF", - "YYLQHPPISF", - "YYLTHGLYL", - "YYMKDLPTSF", - "YYNGKWEFL", - "YYPEYKLLF", - "YYPRVEYGF", - "YYPSTPGRYSI", - "YYQHIVTTL", - "YYRPRFFLL", - "YYSIISHTL", - "YYSNLHQTF", - "YYSPHGHILVL", - "YYTDIMHTL", - "YYTKGFALL", - "YYTPITPHL", - "YYVRAVLHL" + "YYISPRLTF" ] ] ] @@ -8273,6 +247,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-04-13T12:22:25.492967052" + "timestamp": "2026-04-14T11:31:17.708438634" } } \ No newline at end of file From 36c5ea8f75a3cb535735a9049970383a8f1d8fb4 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Tue, 21 Apr 2026 20:14:52 +0000 Subject: [PATCH 100/104] Move PRIDEPY retry settings to base.config and document SDRF/PRIDE input modes Co-Authored-By: Claude Opus 4.7 --- conf/base.config | 9 +++++++++ conf/modules.config | 7 +------ docs/usage.md | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/conf/base.config b/conf/base.config index 9d0500d2..3c351c0f 100644 --- a/conf/base.config +++ b/conf/base.config @@ -63,6 +63,15 @@ process { memory = { 10.GB * task.attempt, 'memory' } time = { 16.h * task.attempt, 'time' } } + withName: 'PRIDEPY_FETCH_SDRF' { + errorStrategy = 'retry' + maxRetries = 3 + } + withName: 'PRIDEPY_DOWNLOAD_FILE' { + errorStrategy = 'retry' + maxRetries = 3 + maxForks = 5 + } withLabel: process_gpu { ext.use_gpu = { workflow.profile.contains('gpu') } accelerator = { workflow.profile.contains('gpu') ? 1 : null } diff --git a/conf/modules.config b/conf/modules.config index 8d83a16d..ccb5aa6b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -324,8 +324,6 @@ process { } withName: 'PRIDEPY_FETCH_SDRF' { - errorStrategy = 'retry' - maxRetries = 3 publishDir = [ path: {"${params.outdir}/sdrf"}, mode: params.publish_dir_mode, @@ -334,10 +332,7 @@ process { } withName: 'PRIDEPY_DOWNLOAD_FILE' { - ext.args = '-p ftp' - errorStrategy = 'retry' - maxRetries = 3 - maxForks = 5 + ext.args = '-p ftp' publishDir = [enabled: false] } diff --git a/docs/usage.md b/docs/usage.md index 228d1fb4..a96430a5 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -4,6 +4,21 @@ > _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ +## Input modes + +The `--input` parameter accepts three formats: + +| Mode | Example | Description | +| ------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| **Samplesheet TSV** | `--input samplesheet.tsv` | A local TSV file listing your MS runs (see [Samplesheet input](#samplesheet-input)). | +| **SDRF file** | `--input experiment.sdrf.tsv` | A local [SDRF-Proteomics](https://github.com/bigbio/proteomics-sample-metadata) file following the [immunopeptidomics template](https://github.com/bigbio/proteomics-sample-metadata/tree/master/templates). Raw files are fetched from PRIDE, search settings and sample metadata are parsed from the SDRF. Requires `--fasta`. | +| **PRIDE accession** | `--input PXD009752` | A PRIDE project accession. The project must include an SDRF file following the [immunopeptidomics template](https://github.com/bigbio/proteomics-sample-metadata/tree/master/templates); both the SDRF and raw files are fetched from PRIDE. Requires `--fasta`. | + +For the SDRF and PRIDE accession modes, the pipeline uses [sdrf-pipelines](https://github.com/bigbio/sdrf-pipelines) to translate the SDRF into an mhcquant samplesheet and a search-preset table, then downloads the raw files with [pridepy](https://github.com/bigbio/py-pride-archive-client). The generated samplesheet and presets are published under `/sdrf/` for transparency. + +> [!NOTE] +> SDRF files must follow the immunopeptidomics template from [bigbio/proteomics-sample-metadata](https://github.com/bigbio/proteomics-sample-metadata/tree/master/templates), and PRIDE accessions must point to a project that contains such an SDRF file — otherwise sample metadata and search parameters cannot be derived. When providing a local `.sdrf.tsv`, the PRIDE accession is inferred from the filename (e.g. `PXD009752.sdrf.tsv`); if your SDRF is named differently, pass the accession via `--input PXD...` instead. + ## Samplesheet input You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a tab-separated file with at least four columns, and a header row as shown in the examples below. From 2b75fdb45b9bbbf1f0a9365610ecdd3ba42323b6 Mon Sep 17 00:00:00 2001 From: axelwalter Date: Wed, 22 Apr 2026 09:17:29 +0200 Subject: [PATCH 101/104] fix: broadcast fasta channel to EPICORE so it runs per sample ch_fasta is a queue channel with one item when --fasta is set. Paired positionally with SUMMARIZE_RESULTS.out.epicore_input (N items), EPICORE runs only once instead of per sample. Convert ch_fasta to a value channel with .first() so it broadcasts. Symptom: with --epicore, only one results/.tsv file is produced regardless of sample count. --- CHANGELOG.md | 1 + workflows/mhcquant.nf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7eac64b0..ef16ee8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### `Fixed` +- Fixed `EPICORE` running only once instead of per sample when `--fasta` is used, by broadcasting `ch_fasta` to `EPICORE` via `.first()` [#PR](https://github.com/nf-core/mhcquant/pull/PR) - Fixed `SUMMARIZE_RESULTS` crash with `--quantify` caused by OpenMS 3.5.0 TextExporter phantom column bug ([OpenMS/OpenMS#9120](https://github.com/OpenMS/OpenMS/issues/9120)) [#444](https://github.com/nf-core/mhcquant/pull/444) - Fixed an issue where stripping the sequence in `SUMMARIZE_RESULTS` did not work for complex modifications [#436](https://github.com/nf-core/mhcquant/pull/436) diff --git a/workflows/mhcquant.nf b/workflows/mhcquant.nf index 78f9e9fd..ae38634c 100644 --- a/workflows/mhcquant.nf +++ b/workflows/mhcquant.nf @@ -204,7 +204,7 @@ workflow MHCQUANT { // EPICORE // if (params.epicore) { - EPICORE(ch_fasta.map{ fasta -> fasta.last()}, SUMMARIZE_RESULTS.out.epicore_input) + EPICORE(ch_fasta.map{ fasta -> fasta.last()}.first(), SUMMARIZE_RESULTS.out.epicore_input) ch_multiqc_files = ch_multiqc_files.mix( EPICORE.out.length_dist, EPICORE.out.intensity_hist From 18c9e6af71b8cad4504fd5a7afae602f976c8665 Mon Sep 17 00:00:00 2001 From: axelwalter Date: Wed, 22 Apr 2026 09:18:03 +0200 Subject: [PATCH 102/104] docs: fill in PR number in CHANGELOG entry --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef16ee8b..bb435261 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### `Fixed` -- Fixed `EPICORE` running only once instead of per sample when `--fasta` is used, by broadcasting `ch_fasta` to `EPICORE` via `.first()` [#PR](https://github.com/nf-core/mhcquant/pull/PR) +- Fixed `EPICORE` running only once instead of per sample when `--fasta` is used, by broadcasting `ch_fasta` to `EPICORE` via `.first()` [#446](https://github.com/nf-core/mhcquant/pull/446) - Fixed `SUMMARIZE_RESULTS` crash with `--quantify` caused by OpenMS 3.5.0 TextExporter phantom column bug ([OpenMS/OpenMS#9120](https://github.com/OpenMS/OpenMS/issues/9120)) [#444](https://github.com/nf-core/mhcquant/pull/444) - Fixed an issue where stripping the sequence in `SUMMARIZE_RESULTS` did not work for complex modifications [#436](https://github.com/nf-core/mhcquant/pull/436) From 249a1df518eaa69ec81d0b238da8232d7c90a564 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Wed, 22 Apr 2026 13:18:27 +0000 Subject: [PATCH 103/104] Update SDRF snapshot for single-row test data and reformat usage table Co-Authored-By: Claude Opus 4.7 --- docs/usage.md | 8 +++--- tests/sdrf.nf.test.snap | 58 +++++++++++++++++++++++++++++++++-------- 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index a96430a5..993f0b5b 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -8,11 +8,11 @@ The `--input` parameter accepts three formats: -| Mode | Example | Description | -| ------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------- | -| **Samplesheet TSV** | `--input samplesheet.tsv` | A local TSV file listing your MS runs (see [Samplesheet input](#samplesheet-input)). | +| Mode | Example | Description | +| ------------------- | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Samplesheet TSV** | `--input samplesheet.tsv` | A local TSV file listing your MS runs (see [Samplesheet input](#samplesheet-input)). | | **SDRF file** | `--input experiment.sdrf.tsv` | A local [SDRF-Proteomics](https://github.com/bigbio/proteomics-sample-metadata) file following the [immunopeptidomics template](https://github.com/bigbio/proteomics-sample-metadata/tree/master/templates). Raw files are fetched from PRIDE, search settings and sample metadata are parsed from the SDRF. Requires `--fasta`. | -| **PRIDE accession** | `--input PXD009752` | A PRIDE project accession. The project must include an SDRF file following the [immunopeptidomics template](https://github.com/bigbio/proteomics-sample-metadata/tree/master/templates); both the SDRF and raw files are fetched from PRIDE. Requires `--fasta`. | +| **PRIDE accession** | `--input PXD009752` | A PRIDE project accession. The project must include an SDRF file following the [immunopeptidomics template](https://github.com/bigbio/proteomics-sample-metadata/tree/master/templates); both the SDRF and raw files are fetched from PRIDE. Requires `--fasta`. | For the SDRF and PRIDE accession modes, the pipeline uses [sdrf-pipelines](https://github.com/bigbio/sdrf-pipelines) to translate the SDRF into an mhcquant samplesheet and a search-preset table, then downloads the raw files with [pridepy](https://github.com/bigbio/py-pride-archive-client). The generated samplesheet and presets are published under `/sdrf/` for transparency. diff --git a/tests/sdrf.nf.test.snap b/tests/sdrf.nf.test.snap index 62f0e828..560fff3d 100644 --- a/tests/sdrf.nf.test.snap +++ b/tests/sdrf.nf.test.snap @@ -57,7 +57,6 @@ "intermediate_results", "intermediate_results/comet", "intermediate_results/comet/IP_lung_1T_060317_1_pin.tsv", - "intermediate_results/comet/IP_lung_1T_060317_2_pin.tsv", "intermediate_results/rescoring", "intermediate_results/rescoring/lc2_1_ms2rescore.idXML", "intermediate_results/rescoring/lc2_1_pout.idXML", @@ -129,7 +128,7 @@ "sdrf/search_presets.tsv" ], [ - "samplesheet.tsv:md5,d30813e176017c883bd5364c2c969eea", + "samplesheet.tsv:md5,4d7d2f1ca8d3def75b05ae8c01c481d8", "search_presets.tsv:md5,3ba3b5c24f71025bfc1799ea87cd0a12" ], [ @@ -139,33 +138,45 @@ "AEDGLKHEY", "AEDKENYKKF", "AEDKENYKKFY", + "AEGTLSKKL", + "AEKELHEKF", + "ATAQFKINKK", "ATEQPLTAK", "ATEQPLTAKK", "ATFPGMWER", "ATNKITIIFK", + "ATQTSVVVK", "AVATALGLK", + "AVIQVSQIVAR", "AVQEFGLAR", "AVQEFGLARFK", "AVSEGTKAVTK", "AVTDQTVSK", + "AVTKYTSSK", "AVVELVTVK", "DAYPEIEKF", + "DYIDTIWKI", "EEDPNTHILY", - "EEEVPKRKW", "EEIEILLRY", "EELQKIYKTY", "EERVINEEY", "EETPVVLQL", + "EEVPKRKW", "EILKWYLNK", + "FPAGKVPAF", "GEASRLAHY", "GEWASGGVRSF", "GGHSGSSYLNTVQK", "GIAGSLTNK", + "GSLGFTVTK", "GSQAGGSQTLK", "GSSPEQVVRPK", "GSYNKVFLAK", "GTFLEGVAK", + "GTIHAGQPVK", "GTNVNMPVSK", + "GTVDKKMVEK", + "GTVTPPPRLVK", "HFDPEVVQI", "HPDTGISSKAM", "HPFIVKLHY", @@ -176,68 +187,93 @@ "IVADHVASY", "IYLPYLHEW", "KAFNQGKIFK", - "KFALN(Deamidated)YLQL", + "KEIFLRELI", + "KEIPN(Deamidated)FPTL", + "KPITTGGVTY", "KSFDTSLIRK", "KVLHFFNVK", + "KYLADLPTL", "KYVKVFHKF", + "LPAKDIQTNVY", "LPALLEKNAM", "LPPGSVISY", + "LPSSEVVKF", "LVFPSEIVGK", "LYDLVTEKM", + "MAIEAQQKF", "MPVDPNEPTY", "MPVGMTHGL", - "MPYKVFHY", + "N(Deamidated)M(Oxidation)TSCHRPICRKEG", "NAIEDTIFY", "NESLFGKKY", "NEYESRSLW", "NPFEKGDLY", "NVLDIMVTK", "NYFHLAVAF", + "NYVPMTPGTFDF", + "PAPPPPPPP", + "PFLPQLQT", + "QELIGKKEY", + "QPFREAIAL", "QPWEEIKTSY", "RILFFNTPK", "RTLQQMLLK", + "RVLDVTKKK", "RYGPQFTL", + "RYIRDAHTF", "RYLADLPTL", + "SADRVVAF", "SAQSFFENK", "SAVDPVQMK", - "SEAAINRQI", "SEADVAQQF", "SEGTKAVTK", "SEIAQKQKL", + "SELAEDKENY", "SEN(Deamidated)ELKKAY", "SENELKKAY", "SFSPKTYSF", "SGSSYLNTVQK", + "SIMEGPLSK", + "SLQDKQ(Deamidated)KGAK", + "SQIEKFQEK", "SSADGSQPPK", "SSIQGQWPK", "SSLYIILKK", - "SSYLNTVQK", + "STDERAYQR", "STEKIYIRK", + "STLAVTSQK", "STMGYMMAK", "STMGYMMAKK", - "SVFAFGENK", - "SVFVETFVQK", + "SVAELRSQK", "SVIVQPFSK", "SVPREPIDRK", - "SYDPTIENTF", + "SVSQPVAQK", + "SYGSVFKAI", "SYIAAISARF", + "SYQRAFNEF", "TAADTAVYY", "TEHYDIPKVSW", + "TENKERKSF", + "TFMDRGFVF", "TPSSDVLVF", + "TPTGAISQY", "TVFENLINK", "TVSETFMSK", "TYIDKSTQL", "TYNKVLHFF", "VPPVFVVSY", + "VPSPAQIMY", "VPVEEQEEF", "VSEGTKAVTK", "VTQSEIAQK", + "VTQSEIAQKQK", "VVQEPGQVFK", "VWSDVTPLTF", "VYEGPELNHAF", "VYIKHPVSL", "VYNKVHITL", "YIKHPVSL", + "YYDVAKQLL", "YYISPRLTF" ] ] @@ -247,6 +283,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-04-14T11:31:17.708438634" + "timestamp": "2026-04-22T13:14:10.634291398" } } \ No newline at end of file From de98bd5b55523d1dadf25d80fe9cc523fdf2caf9 Mon Sep 17 00:00:00 2001 From: jonasscheid Date: Thu, 23 Apr 2026 11:03:53 +0000 Subject: [PATCH 104/104] Pin tdf2mzml container to 0.4_noentry and use tdf2mzml CLI with dynamic version lookup. Co-Authored-By: Claude Opus 4.7 --- modules/local/tdf2mzml/main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/tdf2mzml/main.nf b/modules/local/tdf2mzml/main.nf index 12dacca3..de677d4e 100644 --- a/modules/local/tdf2mzml/main.nf +++ b/modules/local/tdf2mzml/main.nf @@ -1,7 +1,7 @@ process TDF2MZML { tag "$meta.id" - container "docker.io/mfreitas/tdf2mzml" + container "docker.io/mfreitas/tdf2mzml:0.4_noentry" input: tuple val(meta), path(tdf) @@ -9,13 +9,13 @@ process TDF2MZML { output: tuple val(meta), path("*.mzML"), emit: mzml tuple val("${task.process}"), val('python'), eval("python3 --version | cut -d ' ' -f2"), topic: versions - tuple val("${task.process}"), val('tdf2mzml'), eval("echo 0.3.0"), topic: versions + tuple val("${task.process}"), val('tdf2mzml'), eval("tdf2mzml --version | cut -d' ' -f2"), topic: versions script: def prefix = task.ext.prefix ?: "${tdf.simpleName}" """ - tdf2mzml.py -i $tdf -o ${prefix}.mzML + tdf2mzml -i $tdf -o ${prefix}.mzML """ stub: