diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 8d3e957..a86f494 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -89,3 +89,53 @@ jobs:
- name: Run pipeline with profile ${{ matrix.tests }}
run: |
nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.tests }},docker
+
+ nonfree:
+ name: Run NetMHC tool family tests
+ if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/epitopeprediction') }}
+ runs-on: ubuntu-latest
+ env:
+ NXF_VER: '20.04.0'
+ NXF_ANSI_LOG: false
+ steps:
+ - name: Check out pipeline code
+ uses: actions/checkout@v2
+
+ - name: Install non-free software
+ env:
+ DECRYPT_PASSPHRASE: ${{ secrets.TEST_NETMHC }}
+ run: |
+ mkdir -v non-free
+ curl -L https://raw.githubusercontent.com/nf-core/test-datasets/epitopeprediction/software/non-free-software.tar.gpg | ${GITHUB_WORKSPACE}/bin/decrypt | tar -C non-free -v -x
+
+ - name: Check if Dockerfile or Conda environment changed
+ uses: technote-space/get-diff-action@v4
+ with:
+ FILES: |
+ Dockerfile
+ environment.yml
+ - name: Build new docker image
+ if: env.MATCHED_FILES
+ run: docker build --no-cache . -t nfcore/epitopeprediction:dev
+
+ - name: Pull docker image
+ if: ${{ !env.MATCHED_FILES }}
+ run: |
+ docker pull nfcore/epitopeprediction:dev
+ docker tag nfcore/epitopeprediction:dev nfcore/epitopeprediction:dev
+ - name: Install Nextflow
+ run: |
+ wget -qO- get.nextflow.io | bash
+ sudo mv nextflow /usr/local/bin/
+ - name: Run pipeline with NetMHC
+ run: |
+ nextflow run ${GITHUB_WORKSPACE} -profile test_netmhc,docker
+ - name: Run pipeline with NetMHCII
+ run: |
+ nextflow run ${GITHUB_WORKSPACE} -profile test_netmhcii,docker
+ - name: Run pipeline with NetMHCpan
+ run: |
+ nextflow run ${GITHUB_WORKSPACE} -profile test_netmhcpan,docker
+ - name: Run pipeline with NetMHCIIpan
+ run: |
+ nextflow run ${GITHUB_WORKSPACE} -profile test_netmhciipan,docker
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f4fbdcc..4903b44 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## v1.2.0dev
+### `Added`
+
+- [#73](https://github.com/nf-core/epitopeprediction/pull/73) - Add support for the non-free netmhc tool family including netMHC 4.0, netMHCpan 4.0, netMHCII 2.2, and netMHCIIpan 3.1
+
## v1.1.0 - Morgenstelle - 2020-10-20
### `Added`
diff --git a/README.md b/README.md
index 4d0794c..5379fad 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,7 @@ The nf-core/epitopeprediction pipeline comes with documentation about the pipeli
## Credits
-nf-core/epitopeprediction was originally written by [Christopher Mohr](https://github.com/christopher-mohr) from [Institute for Translational Bioinformatics](https://kohlbacherlab.org/team_tbi/) and [Quantitative Biology Center](https://uni-tuebingen.de/forschung/forschungsinfrastruktur/zentrum-fuer-quantitative-biologie-qbic/) and [Alexander Peltzer](https://github.com/apeltzer) from [Böhringer Ingelheim](https://www.boehringer-ingelheim.de). Further contributions were made by [Sabrina Krakau](https://github.com/skrakau) from [Quantitative Biology Center](https://uni-tuebingen.de/forschung/forschungsinfrastruktur/zentrum-fuer-quantitative-biologie-qbic/).
+nf-core/epitopeprediction was originally written by [Christopher Mohr](https://github.com/christopher-mohr) from [Institute for Translational Bioinformatics](https://kohlbacherlab.org/team_tbi/) and [Quantitative Biology Center](https://uni-tuebingen.de/forschung/forschungsinfrastruktur/zentrum-fuer-quantitative-biologie-qbic/) and [Alexander Peltzer](https://github.com/apeltzer) from [Böhringer Ingelheim](https://www.boehringer-ingelheim.de). Further contributions were made by [Sabrina Krakau](https://github.com/skrakau) from [Quantitative Biology Center](https://uni-tuebingen.de/forschung/forschungsinfrastruktur/zentrum-fuer-quantitative-biologie-qbic/) and [Leon Kuchenbecker](https://github.com/lkuchenb) from the [Kohlbacher Lab](https://kohlbacherlab.org/).
## Contributions and Support
diff --git a/bin/decrypt b/bin/decrypt
new file mode 100755
index 0000000..d4d7bbd
--- /dev/null
+++ b/bin/decrypt
@@ -0,0 +1,10 @@
+#!/bin/sh
+# Decrypts stdin -> stdout reading the passphrase from the environment variable
+# DECRYPT_PASSPHRASE.
+gpg \
+ --quiet \
+ --batch \
+ --yes \
+ --decrypt \
+ --passphrase="$DECRYPT_PASSPHRASE" \
+ --output -
diff --git a/bin/epaa.py b/bin/epaa.py
index 3cdd4a5..545e18d 100755
--- a/bin/epaa.py
+++ b/bin/epaa.py
@@ -1011,7 +1011,7 @@ def __main__():
# NOTE this needs to be updated, if a newer version will be available via Fred2 and should be used in the future
tool_version.append(('syfpeithi', '1.0'))
# get for each selected method the corresponding tool version
- methods = { method:version for tool, version in tool_version for method in selected_methods if tool.lower() in method.lower() }
+ methods = { method.lower() : version for tool, version in tool_version for method in selected_methods if tool.lower() in method.lower() }
for method, version in methods.items():
if version not in EpitopePredictorFactory.available_methods()[method]:
@@ -1038,7 +1038,7 @@ def __main__():
# replace method names with method names with version
# complete_df.replace({'method': methods}, inplace=True)
- complete_df['method'] = complete_df['method'].apply(lambda x : x + '-' + methods[x] )
+ complete_df['method'] = complete_df['method'].apply(lambda x : x.lower() + '-' + methods[x.lower()] )
# include wild type sequences to dataframe if specified
if args.wild_type:
@@ -1149,4 +1149,4 @@ def __main__():
logger.info("Finished predictions at " + str(datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
if __name__ == "__main__":
- __main__()
\ No newline at end of file
+ __main__()
diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py
index c9fc379..95b9070 100755
--- a/bin/scrape_software_versions.py
+++ b/bin/scrape_software_versions.py
@@ -12,6 +12,10 @@
'Fred2': ['v_fred2.txt', r"fred2 (\S+)"],
'MHCFlurry': ['v_mhcflurry.txt', r"mhcflurry (\S+)"],
'MHCnuggets': ['v_mhcnuggets.txt', r"mhcnuggets (\S+)"],
+ 'NetMHC': ['v_netmhc.txt', r"netmhc (\S+)"],
+ 'NetMHCpan': ['v_netmhcpan.txt', r"netmhcpan (\S+)"],
+ 'NetMHCII': ['v_netmhcii.txt', r"netmhcii (\S+)"],
+ 'NetMHCIIpan': ['v_netmhciipan.txt', r"netmhciipan (\S+)"],
}
results = OrderedDict()
@@ -23,6 +27,10 @@
results['Fred2'] = 'N/A'
results['MHCFlurry'] = 'N/A'
results['MHCnuggets'] = 'N/A'
+results['NetMHC'] = 'N/A'
+results['NetMHCpan'] = 'N/A'
+results['NetMHCII'] = 'N/A'
+results['NetMHCIIpan'] = 'N/A'
# Search each file using its regex
for k, v in regexes.items():
diff --git a/conf/test_netmhc.config b/conf/test_netmhc.config
new file mode 100644
index 0000000..76143de
--- /dev/null
+++ b/conf/test_netmhc.config
@@ -0,0 +1,24 @@
+/*
+ * -------------------------------------------------
+ * Nextflow config file for running tests
+ * -------------------------------------------------
+ * Defines bundled input files and everything required
+ * to run a fast and simple test. Use as follows:
+ * nextflow run nf-core/epitopeprediction -profile test_netmhc,
+ */
+
+params {
+ config_profile_name = 'NetMHC Test Profile'
+ config_profile_description = 'Peptide list based test profile for NetMHC'
+
+ max_cpus = 2
+ max_memory = 6.GB
+ max_time = 48.h
+
+ // Input data
+ peptides = 'https://raw.githubusercontent.com/nf-core/test-datasets/epitopeprediction/testdata/peptides/peptides.tsv'
+ alleles = 'https://raw.githubusercontent.com/nf-core/test-datasets/epitopeprediction/testdata/alleles/alleles.txt'
+
+ tools = 'netmhc'
+ netmhc_path = './non-free/netmhc.tar.gz'
+}
diff --git a/conf/test_netmhcii.config b/conf/test_netmhcii.config
new file mode 100644
index 0000000..21607e2
--- /dev/null
+++ b/conf/test_netmhcii.config
@@ -0,0 +1,24 @@
+/*
+ * -------------------------------------------------
+ * Nextflow config file for running tests
+ * -------------------------------------------------
+ * Defines bundled input files and everything required
+ * to run a fast and simple test. Use as follows:
+ * nextflow run nf-core/epitopeprediction -profile test_netmhcii,
+ */
+
+params {
+ config_profile_name = 'NetMHCII Test Profile'
+ config_profile_description = 'Peptide list based test profile for NetMHCII'
+
+ max_cpus = 2
+ max_memory = 6.GB
+ max_time = 48.h
+
+ // Input data
+ peptides = 'https://raw.githubusercontent.com/nf-core/test-datasets/epitopeprediction/testdata/peptides/peptides_MHC_II.txt'
+ alleles = 'https://raw.githubusercontent.com/nf-core/test-datasets/epitopeprediction/testdata/alleles/alleles.DRB1_01_01.txt'
+
+ tools = 'netmhcii'
+ netmhcii_path = './non-free/netmhcii.tar.Z'
+}
diff --git a/conf/test_netmhciipan.config b/conf/test_netmhciipan.config
new file mode 100644
index 0000000..fb3e9df
--- /dev/null
+++ b/conf/test_netmhciipan.config
@@ -0,0 +1,24 @@
+/*
+ * -------------------------------------------------
+ * Nextflow config file for running tests
+ * -------------------------------------------------
+ * Defines bundled input files and everything required
+ * to run a fast and simple test. Use as follows:
+ * nextflow run nf-core/epitopeprediction -profile test_netmhciipan,
+ */
+
+params {
+ config_profile_name = 'NetMHCIIpan Test Profile'
+ config_profile_description = 'Peptide list based test profile for NetMHCIIpan'
+
+ max_cpus = 2
+ max_memory = 6.GB
+ max_time = 48.h
+
+ // Input data
+ peptides = 'https://raw.githubusercontent.com/nf-core/test-datasets/epitopeprediction/testdata/peptides/peptides_MHC_II.txt'
+ alleles = 'https://raw.githubusercontent.com/nf-core/test-datasets/epitopeprediction/testdata/alleles/alleles.DRB1_01_01.txt'
+
+ tools = 'netmhciipan'
+ netmhciipan_path = './non-free/netmhciipan.tar.gz'
+}
diff --git a/conf/test_netmhcpan.config b/conf/test_netmhcpan.config
new file mode 100644
index 0000000..77535e1
--- /dev/null
+++ b/conf/test_netmhcpan.config
@@ -0,0 +1,24 @@
+/*
+ * -------------------------------------------------
+ * Nextflow config file for running tests
+ * -------------------------------------------------
+ * Defines bundled input files and everything required
+ * to run a fast and simple test. Use as follows:
+ * nextflow run nf-core/epitopeprediction -profile test_netmhcpan,
+ */
+
+params {
+ config_profile_name = 'NetMHCpan Test Profile'
+ config_profile_description = 'Peptide list based test profile for NetMHCpan'
+
+ max_cpus = 2
+ max_memory = 6.GB
+ max_time = 48.h
+
+ // Input data
+ peptides = 'https://raw.githubusercontent.com/nf-core/test-datasets/epitopeprediction/testdata/peptides/peptides.tsv'
+ alleles = 'https://raw.githubusercontent.com/nf-core/test-datasets/epitopeprediction/testdata/alleles/alleles.txt'
+
+ tools = 'netmhcpan'
+ netmhcpan_path = './non-free/netmhcpan.tar.gz'
+}
diff --git a/docs/output.md b/docs/output.md
index 1182006..b407ebb 100644
--- a/docs/output.md
+++ b/docs/output.md
@@ -45,10 +45,7 @@ The prediction results are given as allele-specific score and affinity values pe
* **Affinity**: Calculated based on the score as the percentage of the maximum value of the corresponding matrix: `score(peptide) divided by the maximum score of the allele/length-specific matrix * 100`.
* **Score**: Sum of the values given by the allele-specific position-specific scoring matrix (PSSM) for the respective peptide sequence.
Peptides are considered binders if the affinity is higher than 50.
-* [`MHCflurry`](https://github.com/openvax/mhcflurry):
- * **Affinity**: Predicted IC50 (threshold for binders: `<500 nmol/L`).
- * **Score**: The provided score is calculated from the log-transformed predicted binding affinity and scaled to an interval of 0 to 1: `1-log50000(aff)`.
-* [`MHCnuggets`](https://github.com/KarchinLab/mhcnuggets):
+* [`MHCflurry`](https://github.com/openvax/mhcflurry), [`MHCnuggets`](https://github.com/KarchinLab/mhcnuggets) and [`NetMHC` tool family](https://services.healthtech.dtu.dk/):
* **Affinity**: Predicted IC50 (threshold for binders: `<500 nmol/L`).
* **Score**: The provided score is calculated from the log-transformed predicted binding affinity and scaled to an interval of 0 to 1: `1-log50000(aff)`.
diff --git a/main.nf b/main.nf
index 42cf7ad..00ac7db 100644
--- a/main.nf
+++ b/main.nf
@@ -37,10 +37,16 @@ def helpMessage() {
--mhc_class [1,2] Specifies whether the predictions should be done for MHC class I (1) or class II (2). Default: 1
--max_peptide_length [int] Specifies the maximum peptide length (not applied when '--peptides' is specified). Default: MHC class I: 11 aa, MHC class II: 16 aa
--min_peptide_length [int] Specifies the minimum peptide length (not applied when '--peptides' is specified). Default: MCH class I: 8 aa, MHC class II: 15 aa
- --tools [str] Specifies a list of tool(s) to use. Available are: 'syfpeithi', 'mhcflurry', 'mhcnuggets-class-1', 'mhcnuggets-class-2'. Can be combined in a list separated by comma.
+ --tools [str] Specifies a list of tool(s) to use. Available are: 'syfpeithi', 'mhcflurry', 'mhcnuggets-class-1', 'mhcnuggets-class-2', 'netmhc', 'netmhcpan', 'netmhcii', 'netmhciipan'. Can be combined in a list separated by comma.
--peptides_split_maxchunks [int] Used in combination with '--peptides' or '--proteins': maximum number of peptide chunks that will be created for parallelization. Default: 100
--peptides_split_minchunksize [int] Used in combination with '--peptides' or '--proteins': minimum number of peptides that should be written into one chunk. Default: 5000
+ External software:
+ --netmhcpan_path To use the 'netmhcpan' tool, specify a path to the original NetMHCpan 4.1 tar.gz archive here.
+ --netmhc_path To use the 'netmhc' tool, specify a path to the original NetMHC 4.0 tar.gz archive here.
+ --netmhciipan_path To use the 'netmhciipan' tool, specify a path to the original NetMHCIIpan 4.0 tar.gz archive here.
+ --netmhcii_path To use the 'netmhcii' tool, specify a path to the original NetMHCII 2.3 tar.gz archive here.
+
References If not specified in the configuration file or you wish to overwrite any of the references
--genome_version [str] Specifies the ensembl reference genome version (GRCh37, GRCh38) Default: GRCh37
--proteome [path/file] Specifies the reference proteome files that are used for self-filtering. Should be either a folder of FASTA files or a single FASTA file containing the reference proteome(s).
@@ -80,6 +86,41 @@ ch_check_alleles = Channel.empty()
// Store input base name for later
def input_base_name = ''
+ch_nonfree_paths = Channel.create()
+
+netmhc_meta = [
+ netmhc : [
+ version : "4.0",
+ software_md5 : "132dc322da1e2043521138637dd31ebf",
+ data_url : "http://www.cbs.dtu.dk/services/NetMHC-4.0/data.tar.gz",
+ data_md5 : "63c646fa0921d617576531396954d633",
+ binary_name : "netMHC"
+ ],
+ netmhcpan: [
+ version : "4.0",
+ software_md5 : "94aa60f3dfd9752881c64878500e58f3",
+ data_url : "http://www.cbs.dtu.dk/services/NetMHCpan-4.0/data.Linux.tar.gz",
+ data_md5 : "26cbbd99a38f6692249442aeca48608f",
+ binary_name : "netMHCpan"
+ ],
+ netmhcii: [
+ version : "2.2",
+ software_md5 : "918b7108a37599887b0725623d0974e6",
+ data_url : "http://www.cbs.dtu.dk/services/NetMHCII-2.2/data.tar.gz",
+ data_md5 : "11579b61d3bfe13311f7b42fc93b4dd8",
+ binary_name : "netMHCII"
+ ],
+ netmhciipan: [
+ version : "3.1",
+ software_md5 : "0962ce799f7a4c9631f8566a55237073",
+ data_url : "http://www.cbs.dtu.dk/services/NetMHCIIpan-3.1/data.tar.gz",
+ data_md5 : "f833df245378e60ca6e55748344a36f6",
+ binary_name : "netMHCIIpan"
+ ]
+]
+
+tools = params.tools?.tokenize(',')
+
// Validating parameters
if ( !params.show_supported_models ){
if ( params.peptides ) {
@@ -137,7 +178,7 @@ if ( !params.show_supported_models ){
exit 1, "Invalid MHC class option: ${params.mhc_class}. Valid options: 1, 2"
}
- if ( (params.mhc_class == 1 && params.tools.contains("mhcnuggets-class-2")) || (params.mhc_class == 2 && params.tools.contains("mhcnuggets-class-1")) ){
+ if ( (params.mhc_class == 1 && tools.contains("mhcnuggets-class-2")) || (params.mhc_class == 2 && tools.contains("mhcnuggets-class-1")) ){
log.warn "Provided MHC class is not compatible with the selected MHCnuggets tool. Output might be empty.\n"
}
@@ -149,6 +190,38 @@ if ( !params.show_supported_models ){
{
exit 1, "Invalid memory mode parameter: ${params.mem_mode}. Valid options: 'low', 'intermediate', 'high'."
}
+
+ // External tools
+ ["netmhc", "netmhcpan", "netmhcii", "netmhciipan"].each {
+ // Check if the _path parameter was set for this tool
+ if (params["${it}_path"] as Boolean && ! tools.contains(it))
+ {
+ log.warn("--${it}_path specified, but --tools does not contain ${it}. Both have to be specified to enable ${it}. Ignoring.")
+ }
+ else if (!params["${it}_path"] as Boolean && tools.contains(it))
+ {
+ log.warn("--${it}_path not specified, but --tools contains ${it}. Both have to be specified to enable ${it}. Ignoring.")
+ tools.removeElement(it)
+ }
+ else if (params["${it}_path"])
+ {
+ // If so, add the tool name and user installation path to the external tools import channel
+ ch_nonfree_paths.bind([
+ it,
+ netmhc_meta[it].version,
+ netmhc_meta[it].software_md5,
+ file(params["${it}_path"], checkIfExists:true),
+ file(netmhc_meta[it].data_url),
+ netmhc_meta[it].data_md5,
+ netmhc_meta[it].binary_name
+ ])
+ }
+ }
+ if (tools.isEmpty())
+ {
+ exit 1, "No valid tools specified."
+ }
+ ch_nonfree_paths.close()
}
// Has the run name been specified by the user?
@@ -199,7 +272,7 @@ if ( params.show_supported_models ) {
if ( !params.peptides && !params.proteins ) summary['Reference Genome'] = params.genome_version
if ( params.proteome ) summary['Reference Proteome'] = params.proteome
summary['Self-Filter'] = params.filter_self
- summary['Tools'] = params.tools
+ summary['Tools'] = tools.join(',')
summary['Wild-types'] = params.wild_type
summary['Protein FASTA Output'] = params.fasta_output
if ( params.peptides || params.proteins ) summary['Max. Number of Chunks for Parallelization'] = params.peptides_split_maxchunks
@@ -249,6 +322,74 @@ Channel.from(summary.collect{ [it.key, it.value] })
""".stripIndent() }
.set { ch_workflow_summary }
+/*
+ * Copy non-free software provided by the user into the working directory
+ */
+process netmhc_tools_import {
+ input:
+ tuple val(toolname), val(toolversion), val(toolchecksum), path(tooltarball), file(datatarball), val(datachecksum), val(toolbinaryname) from ch_nonfree_paths
+
+ output:
+ path "${toolname}" into ch_nonfree_tools
+ path "v_${toolname}.txt" into ch_nonfree_versions
+
+ script:
+ """
+ #
+ # CHECK IF THE PROVIDED SOFTWARE TARBALL IS A REGULAR FILES
+ #
+ if [ ! -f "$tooltarball" ]; then
+ echo "Path specified for ${toolname} does not point to a regular file. Please specify a path to the original tool tarball." >&2
+ exit 1
+ fi
+
+ #
+ # VALIDATE THE CHECKSUM OF THE PROVIDED SOFTWARE TARBALL
+ #
+ checksum="\$(md5sum "$tooltarball" | cut -f1 -d' ')"
+ if [ "\$checksum" != "${toolchecksum}" ]; then
+ echo "Checksum error for $toolname. Please make sure to provide the original tarball for $toolname version $toolversion" >&2
+ exit 2
+ fi
+
+ #
+ # UNPACK THE PROVIDED SOFTWARE TARBALL
+ #
+ mkdir -v "${toolname}"
+ tar -C "${toolname}" --strip-components 1 -x -f "$tooltarball"
+
+ #
+ # MODIFY THE NETMHC WRAPPER SCRIPT ACCORDING TO INSTALL INSTRUCTIONS
+ # Substitution 1: We install tcsh via conda, thus /bin/tcsh won't work
+ # Substitution 2: We want temp files to be written to /tmp if TMPDIR is not set
+ # Substitution 3: NMHOME should be the folder in which the tcsh script itself resides
+ #
+ sed -i.bak \
+ -e 's_bin/tcsh.*\$_usr/bin/env tcsh_' \
+ -e "s_/scratch_/tmp_" \
+ -e "s_setenv[[:space:]]NMHOME.*_setenv NMHOME \\`realpath -s \\\$0 | sed -r 's/[^/]+\$//'\\`_" "${toolname}/${toolbinaryname}"
+
+ #
+ # VALIDATE THE CHECKSUM OF THE DOWNLOADED MODEL DATA
+ #
+ checksum="\$(md5sum "$datatarball" | cut -f1 -d' ')"
+ if [ "\$checksum" != "${datachecksum}" ]; then
+ echo "A checksum mismatch occurred when checking the data file for ${toolname}." >&2
+ exit 3
+ fi
+
+ #
+ # UNPACK THE DOWNLOADED MODEL DATA
+ #
+ tar -C "${toolname}" -v -x -f "$datatarball"
+
+ #
+ # CREATE VERSION FILE
+ #
+ echo "${toolname} ${toolversion}" > "v_${toolname}.txt"
+ """
+}
+
/*
* Parse software version numbers
*/
@@ -258,6 +399,8 @@ process get_software_versions {
if (filename.indexOf(".csv") > 0) filename
else null
}
+ input:
+ file ("*") from ch_nonfree_versions.collect().ifEmpty([])
output:
file 'software_versions_mqc.yaml' into ch_software_versions_yaml
@@ -317,7 +460,7 @@ process checkRequestedModels {
check_requested_models.py ${input_type} \
--alleles ${alleles} \
--mhcclass ${params.mhc_class} \
- --tools ${params.tools} \
+ --tools ${tools.join(",")} \
--versions ${software_versions} > model_warnings.log
"""
}
@@ -410,12 +553,13 @@ process peptidePrediction {
file inputs from ch_splitted_vcfs.flatten().mix(ch_splitted_tsvs.flatten(), ch_splitted_gsvars.flatten(), ch_splitted_peptides.flatten())
file alleles from ch_alleles
file software_versions from ch_software_versions_csv
+ file ('nonfree_software/*') from ch_nonfree_tools.collect().ifEmpty([])
output:
file "*.tsv" into ch_predicted_peptides
file "*.json" into ch_json_reports
file "*.fasta" optional true into ch_protein_fastas
-
+
script:
def input_type = params.peptides ? "--peptides ${inputs}" : params.proteins ? "--peptides ${inputs}" : "--somatic_mutations ${inputs}"
def ref_prot = params.proteome ? "--proteome ${params.proteome}" : ""
@@ -428,12 +572,17 @@ process peptidePrediction {
# specify MHCflurry release for which to download models, need to be updated here as well when MHCflurry will be updated
export MHCFLURRY_DOWNLOADS_CURRENT_RELEASE=1.4.0
+ # Add non-free software to the PATH
+ shopt -s nullglob
+ for p in nonfree_software/*; do export PATH="\$(realpath -s "\$p"):\$PATH"; done
+ shopt -u nullglob
+
epaa.py ${input_type} --identifier ${inputs.baseName} \
--alleles $alleles \
--mhcclass ${params.mhc_class} \
--max_length ${params.max_peptide_length} \
--min_length ${params.min_peptide_length} \
- --tools ${params.tools} \
+ --tools ${tools.join(",")} \
--versions ${software_versions} \
--reference ${params.genome_version} \
${ref_prot} \
diff --git a/nextflow.config b/nextflow.config
index 2dc60e8..c16ee9d 100644
--- a/nextflow.config
+++ b/nextflow.config
@@ -22,6 +22,10 @@ params {
peptides_split_maxchunks = 100
peptides_split_minchunksize = 5000
show_supported_models = false
+ netmhcpan_path = false
+ netmhc_path = false
+ netmhciipan_path = false
+ netmhcii_path = false
// Additional annotation files
proteome = ''
@@ -95,6 +99,10 @@ profiles {
test_proteins { includeConfig 'conf/test_proteins.config' }
test_mhcnuggets { includeConfig 'conf/test_mhcnuggets.config' }
test_mhcflurry { includeConfig 'conf/test_mhcflurry.config' }
+ test_netmhc { includeConfig 'conf/test_netmhc.config' }
+ test_netmhcii { includeConfig 'conf/test_netmhcii.config' }
+ test_netmhcpan { includeConfig 'conf/test_netmhcpan.config' }
+ test_netmhciipan { includeConfig 'conf/test_netmhciipan.config' }
test_full { includeConfig 'conf/test_full.config' }
}
diff --git a/nextflow_schema.json b/nextflow_schema.json
index 1dc1615..1c0c969 100644
--- a/nextflow_schema.json
+++ b/nextflow_schema.json
@@ -180,6 +180,34 @@
}
}
},
+ "external_software":{
+ "title": "External software",
+ "type" : "object",
+ "description" : "External MHC binding prediction software that is not shipped with the pipeline.",
+ "default": "",
+ "properties" : {
+ "netmhcpan_path" : {
+ "type" : "string",
+ "default" : "",
+ "description" : "To use the 'netmhcpan' tool, specify the path to the original software tarball for NetMHCpan 4.0 (Linux) here."
+ },
+ "netmhc_path" : {
+ "type" : "string",
+ "default" : "",
+ "description" : "To use the 'netmhc' tool, specify the path to the original software tarball for NetMHC 4.0 (Linux) here."
+ },
+ "netmhciipan_path" : {
+ "type" : "string",
+ "default" : "",
+ "description" : "To use the 'netmhciipan' tool, specify the path to the original software tarball for NetMHCIIpan 3.1 (Linux) here."
+ },
+ "netmhcii_path" : {
+ "type" : "string",
+ "default" : "",
+ "description" : "To use the 'netmhcii' tool, specify the path to the original software tarball for NetMHCII 2.2 (Linux) here."
+ }
+ }
+ },
"generic_options": {
"title": "Generic options",
"type": "object",
@@ -360,6 +388,9 @@
{
"$ref": "#/definitions/run_optimisation"
},
+ {
+ "$ref": "#/definitions/external_software"
+ },
{
"$ref": "#/definitions/generic_options"
},