Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release 3.1.0 #68

Merged
merged 26 commits into from
Jun 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
58bf829
Version bump 3.0.0rc2
lkuchenb Feb 2, 2021
db7130c
Fix master / main branch naming in GH action
lkuchenb Feb 2, 2021
5817e3e
Fix typos in README file
lkuchenb Feb 2, 2021
12fb912
Add pypi GH action
lkuchenb Feb 5, 2021
428ddf2
Fix PyPI linting errors
lkuchenb Feb 5, 2021
3e009c6
Reduce version to 3.0.0rc1
lkuchenb Feb 5, 2021
87536a0
Add a changelog
lkuchenb Feb 5, 2021
23d34c3
Install changelog with package
lkuchenb Feb 5, 2021
6bf305e
Change PyPI CD trigger to published release
lkuchenb Feb 5, 2021
65fd57a
Add rank metric #15 (#42)
jonasscheid Dec 13, 2021
492d6e7
Fixed issues #38, #44 and #45 (#46)
jonasscheid Dec 22, 2021
028fc31
Improve/update documentation (#50)
christopher-mohr Jan 5, 2022
0b6e75d
Remove logging warning
christopher-mohr Jan 17, 2022
46927ad
Change file ending in tutorial
christopher-mohr Jan 17, 2022
480ebcf
Add docstrings, minor formatting
christopher-mohr Jan 24, 2022
1fa8b11
Update CHANGELOG version and setup.py
christopher-mohr Jan 26, 2022
5bd74a8
Update date
christopher-mohr Jan 26, 2022
070f664
Fix #52 (#53)
jonasscheid Mar 15, 2022
26edb04
add check if transcript sequence available from BioMart, cleanup (#58)
christopher-mohr May 25, 2022
34fe63b
Add interface for netMHCpan 4.1 (#59)
christopher-mohr May 25, 2022
252a65c
Update supportedAlleles of syfpeithi (#62)
jonasscheid May 27, 2022
577802e
Fix protobuf version for tests, prepare docs for 3.1.0 release (#64)
jonasscheid Jun 14, 2022
60062c1
Add netMHCIIpan 4.1 interface (#66)
jonasscheid Jun 14, 2022
0800bb6
minor doc improvements, cleanup setup.py
christopher-mohr Jun 14, 2022
674053e
Merge branch 'main' into develop
christopher-mohr Jun 15, 2022
1df2196
bump version
christopher-mohr Jun 15, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/python-test-conda-external.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
echo "PATH=$PATH"
- name: Set up Python ${{ matrix.python-version }}
run: |
$CONDA/bin/conda create -p /tmp/condaenv python==${{ matrix.python-version }}'.*' setuptools"==52.0"
$CONDA/bin/conda create -p /tmp/condaenv python==${{ matrix.python-version }}'.*' setuptools"==52.0" protobuf"<=3.20.1"
- name: Activate conda environment
run: |
echo "/tmp/condaenv/bin" >> $GITHUB_PATH
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/python-test-conda.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
echo "CONDA_PKGS_DIRS=/tmp/condapkgs" >> $GITHUB_ENV
- name: Set up Python ${{ matrix.python-version }}
run: |
$CONDA/bin/conda create -p /tmp/condaenv python==${{ matrix.python-version }}'.*' setuptools"==52.0"
$CONDA/bin/conda create -p /tmp/condaenv python==${{ matrix.python-version }}'.*' setuptools"==52.0" protobuf"<=3.20.1"
- name: Activate conda environment
run: |
echo "/tmp/condaenv/bin" >> $GITHUB_PATH
Expand Down
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,22 @@
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).

## v3.1.0 - 2022-06-15

### `Added`

- [#58](https://github.com/KohlbacherLab/epytope/pull/58) - Add check for `BioMart` transcript sequence availability [#55](https://github.com/KohlbacherLab/epytope/issues/55)
- [#59](https://github.com/KohlbacherLab/epytope/pull/59) - Add interface for `NetMHCpan 4.1` [#56](https://github.com/KohlbacherLab/epytope/issues/56)
- [#66](https://github.com/KohlbacherLab/epytope/pull/66) - Add interface for `NetMHCIIpan 4.1` [#65](https://github.com/KohlbacherLab/epytope/issues/65)

### `Changed`

- [#62](https://github.com/KohlbacherLab/epytope/pull/62) - Update the supported alleles of `syfpeithi` [#60](https://github.com/KohlbacherLab/epytope/issues/60)

### `Fixed`

- [#53](https://github.com/KohlbacherLab/epytope/pull/53) - Fix `ANN` predictor results [#52](https://github.com/KohlbacherLab/epytope/issues/52)

## v3.0.0 - 2022-01-26

Initial release of `epytope`. `epytope` is the successor project of [`FRED2`](https://github.com/FRED-2/Fred2), which was renamed to a more versioning friendly base name.
Expand Down
20 changes: 12 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,19 @@
![PyPi](https://github.com/KohlbacherLab/epytope/actions/workflows/pypi-publish.yml/badge.svg)
![Tests](https://github.com/KohlbacherLab/epytope/actions/workflows/python-test-conda.yml/badge.svg)
![Tests external](https://github.com/KohlbacherLab/epytope/actions/workflows/python-test-conda-external.yml/badge.svg)
[![Anaconda-Server Badge](https://anaconda.org/bioconda/epytope/badges/version.svg)](https://anaconda.org/bioconda/epytope)
[![Anaconda-Server Badge](https://anaconda.org/bioconda/epytope/badges/latest_release_date.svg)](https://anaconda.org/bioconda/epytope)
[![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
[![Anaconda-Server Badge](https://anaconda.org/bioconda/fred2/badges/installer/conda.svg)](https://conda.anaconda.org/bioconda)
[![Anaconda-Server Badge](https://anaconda.org/bioconda/epytope/badges/installer/conda.svg)](https://conda.anaconda.org/bioconda)
[![Anaconda-Server Badge](https://anaconda.org/bioconda/epytope/badges/downloads.svg)](https://anaconda.org/bioconda/epytope)

Copyright 2014 by Benjamin Schuber, Mathias Walzer, Philipp Brachvogel, Andras Szolek, Christopher Mohr, and Oliver Kohlbacher
Copyright 2014 by Benjamin Schuber, Mathias Walzer, Philipp Brachvogel, Andras Szolek, Christopher Mohr, and Oliver Kohlbacher

**epytope** is a framework for T-cell epitope detection, and vaccine design. It offers consistent, easy, and simultaneous access to well established prediction methods of computational immunology. **epytope** can handle polymorphic proteins and offers analysis tools to select, assemble, and design linker sequences for string-of-beads epitope-based vaccines. It is implemented in Python in a modular way and can easily be extended by user defined methods.

## Copyright

epytope is released under the three clause BSD licence.
epytope is released under the three clause BSD license.

## Installation

Expand All @@ -27,9 +30,10 @@ use the following commands:
- pandas
- pyomo>=4.0
- svmlight
- MySQL-python>=1.2.4
- Biopython
- PyMySQL
- biopython
- pyVCF
- h5py<=2.10.0

### Third-Party Software (not installed through pip)

Expand Down Expand Up @@ -57,8 +61,8 @@ Currently **epytope** provides implementations of several prediction methods or
- [MHCflurry](https://pubmed.ncbi.nlm.nih.gov/29960884/) 1.2.2, 1.4.3
- [NetMHC](https://pubmed.ncbi.nlm.nih.gov/26515819/) 3.0, 3.4, 4.0
- [NetMHCII](https://pubmed.ncbi.nlm.nih.gov/29315598/) 2.2, 2.3
- [NetMHCpan](https://pubmed.ncbi.nlm.nih.gov/28978689/) 2.4, 2.8, 3.0, 4.0
- [NetMHCIIpan](https://pubmed.ncbi.nlm.nih.gov/32406916/) 3.0, 3.1, 4.0
- [NetMHCpan](https://pubmed.ncbi.nlm.nih.gov/28978689/) 2.4, 2.8, 3.0, 4.0, 4.1
- [NetMHCIIpan](https://pubmed.ncbi.nlm.nih.gov/32406916/) 3.0, 3.1, 4.0, 4.1
- [PickPocket](https://pubmed.ncbi.nlm.nih.gov/19297351/) 1.1
- [NetCTLpan](https://pubmed.ncbi.nlm.nih.gov/20379710/) 1.1
- Epitope Selection
Expand All @@ -71,7 +75,7 @@ Currently **epytope** provides implementations of several prediction methods or

## Getting Started

Users and developers should start by reading our [wiki](https://github.com/KohlbacherLab/epytope/wiki) and [IPython tutorials](https://github.com/KohlbacherLab/epytope/tree/master/epytope/tutorials). A reference documentation is also available [online](http://fred2.readthedocs.org/en/latest/).
Users and developers should start by reading our [wiki](https://github.com/KohlbacherLab/epytope/wiki) and [IPython tutorials](https://github.com/KohlbacherLab/epytope/tree/master/epytope/tutorials). A reference documentation is also available [online](http://epytope.readthedocs.org/en/latest/).

## How to Cite

Expand Down
5 changes: 3 additions & 2 deletions epytope/Core/Generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

"""

import logging
import warnings
from itertools import chain

Expand Down Expand Up @@ -243,7 +244,7 @@ def _generate_combinations(tId, vs, seq, usedVs, offset, isReverse):
#print tId
query = dbadapter.get_transcript_information(tId, type=id_type, _db=db)
if query is None:
warnings.warn("Transcript with ID %s not found in DB"%tId)
logging.warning("Transcript with ID %s not found in DB or sequence unavailable"%tId)
continue

tSeq = query[EAdapterFields.SEQ]
Expand Down Expand Up @@ -349,7 +350,7 @@ def _generate_combinations(tId, vs, seq, usedVs, offset, isReverse=False):
for tId, vs in transToVar.items():
query = dbadapter.get_transcript_information(tId, type=id_type, _db=db)
if query is None:
warnings.warn("Transcript with ID %s not found in DB"%tId)
logging.warning("Transcript with ID %s not found in DB or sequence unavailable"%tId)
continue

tSeq = query[EAdapterFields.SEQ]
Expand Down
1 change: 0 additions & 1 deletion epytope/Data/pssms/syfpeithi/mat/A_0300_9.py

This file was deleted.

6 changes: 3 additions & 3 deletions epytope/EpitopePrediction/ANN.py
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ def predict(self, peptides, alleles=None, binary=False, **kwargs):

# create EpitopePredictionResult object. This is a multi-indexed DataFrame
# with Allele, Method and Score type as multi-columns and peptides as rows
df_result = EpitopePredictionResult.from_dict(result, pep_groups, self.name)
df_result = EpitopePredictionResult.from_dict(result, peptide_objects.values(), self.name)

return df_result

Expand Down Expand Up @@ -534,7 +534,7 @@ def predict(self, peptides, alleles=None, binary=False, **kwargs):

# create EpitopePredictionResult object. This is a multi-indexed DataFrame
# with Allele, Method and Score type as multi-columns and peptides as rows
df_result = EpitopePredictionResult.from_dict(result, pep_groups, self.name)
df_result = EpitopePredictionResult.from_dict(result, peptide_objects.values(), self.name)
return df_result

except BadSignatureException:
Expand Down Expand Up @@ -804,7 +804,7 @@ def predict(self, peptides, alleles=None, binary=False, **kwargs):

# create EpitopePredictionResult object. This is a multi-indexed DataFrame
# with Allele, Method and Score type as multi-columns and peptides as rows
df_result = EpitopePredictionResult.from_dict(result, pep_groups, self.name)
df_result = EpitopePredictionResult.from_dict(result, peptide_objects.values(), self.name)
return df_result

except BadSignatureException:
Expand Down
98 changes: 95 additions & 3 deletions epytope/EpitopePrediction/External.py

Large diffs are not rendered by default.

8 changes: 2 additions & 6 deletions epytope/EpitopePrediction/PSSM.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,8 @@ class Syfpeithi(APSSMEpitopePrediction):
SYFPEITHI: database for MHC ligands and peptide motifs. Immunogenetics, 50(3-4), 213-219.
"""
__alleles = frozenset(
['HLA-B*15:10', 'HLA-B*41:01', 'HLA-B*37:01', 'HLA-B*27:05', 'HLA-B*38:01', 'HLA-A*02:01', 'HLA-B*47:01',
'HLA-A*26:01', 'HLA-B*37:01', 'HLA-DRB1*11:01', 'HLA-B*50:01', 'HLA-B*07:02', 'HLA-A*68:01', 'HLA-A*24:02',
'HLA-DRB1*15:01', 'HLA-B*15:01', 'HLA-B*45:01', 'HLA-A*11:01', 'HLA-A*03:01', 'HLA-B*40:01', 'HLA-DRB1*03:01',
'HLA-B*39:01', 'HLA-DRB1*01:01', 'HLA-B*51:01', 'HLA-B*39:02', 'HLA-B*08:01', 'HLA-B*18:01', 'HLA-B*44:02',
'HLA-B*49:01', 'HLA-DRB1*07:01', 'HLA-B*14:02', 'HLA-A*01:01'])
__supported_length = frozenset([8, 9, 10, 11])
['HLA-A*01:01','HLA-A*02:01','HLA-A*03:01','HLA-A*11:01','HLA-A*24:02','HLA-A*26:01','HLA-A*31:01','HLA-A*32:01','HLA-A*33:01','HLA-A*66:01','HLA-A*68:01','HLA-B*07:02','HLA-B*08:01','HLA-B*13:02','HLA-B*14:02','HLA-B*15:01','HLA-B*15:16','HLA-B*18:01','HLA-B*27:05','HLA-B*27:09','HLA-B*35:01','HLA-B*37:01','HLA-B*38:01','HLA-B*39:01','HLA-B*39:02','HLA-B*40:01','HLA-B*40:02','HLA-B*41:01','HLA-B*44:02','HLA-B*45:01','HLA-B*47:01','HLA-B*49:01','HLA-B*50:01','HLA-B*51:01','HLA-B*53:01','HLA-B*57:01','HLA-B*58:01','HLA-B*58:02','HLA-C*01:02','HLA-C*02:02','HLA-C*03:03','HLA-C*03:04','HLA-C*04:01','HLA-C*05:01','HLA-C*06:01','HLA-C*06:02','HLA-C*07:01','HLA-C*07:02','HLA-C*08:02','HLA-C*12:03','HLA-C*14:02','HLA-C*15:02','HLA-C*16:01','HLA-C*17:01','HLA-DRB1*01:01','HLA-DRB1*03:01','HLA-DRB1*07:01','HLA-DRB1*11:01','HLA-DRB1*15:01','HLA-G*01:01','H-2-Db','H-2-Kb','H-2-Kd','H-2-Ld'])
__supported_length = frozenset([8, 9, 10, 11, 12, 13])
__name = "syfpeithi"
__version = "1.0"

Expand Down
13 changes: 7 additions & 6 deletions epytope/IO/MartsAdapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,11 @@ def get_product_sequence(self, product_id, **kwargs):
+ self.biomart_attribute%("external_gene_name") \
+ self.biomart_tail

# logging.warn(rq_n)
tsvreader = csv.DictReader((urllib.request.urlopen(self.biomart_url +
urllib.parse.quote(rq_n))).read().decode('utf-8').splitlines(), dialect='excel-tab')
tsvselect = [x for x in tsvreader]
if not tsvselect:
logging.warning("There seems to be no Proteinsequence for " + str(product_id))
#print self.biomart_url+rq_n
return None
self.sequence_proxy[product_id] = tsvselect[0]["Peptide"][:-1] if tsvselect[0]["Peptide"].endswith('*')\
else tsvselect[0]["Peptide"]
Expand Down Expand Up @@ -157,8 +155,10 @@ def get_transcript_sequence(self, transcript_id, **kwargs):
urllib.parse.quote(rq_n))).read().decode('utf-8').splitlines(), dialect='excel-tab')
tsvselect = [x for x in tsvreader]
if not tsvselect:
logging.warning("There seems to be no transcript sequence for " + str(transcript_id))
#print self.biomart_url+rq_n
logging.warning("No transcript sequence available for " + str(transcript_id))
return None
elif 'Sequence unavailable' in tsvselect[0]['Coding sequence']:
logging.warning("No transcript sequence available for " + str(transcript_id))
return None

self.sequence_proxy[transcript_id] = tsvselect[0]['Coding sequence']
Expand Down Expand Up @@ -210,6 +210,9 @@ def get_transcript_information(self, transcript_id, **kwargs):
if not tsvselect:
logging.warning("No Information on transcript %s"%transcript_id)
return None
elif 'Sequence unavailable' in tsvselect[0]['Coding sequence']:
logging.warning("No transcript sequence available for " + str(transcript_id))
return None

self.ids_proxy[transcript_id] = {EAdapterFields.SEQ: tsvselect[0]['Coding sequence'],
EAdapterFields.GENE: tsvselect[0].get('Associated Gene Name', ""),
Expand Down Expand Up @@ -596,8 +599,6 @@ def get_variant_ids(self, **kwargs):
+ self.biomart_attribute%("refseq_peptide")
rq_n += self.biomart_attribute%("uniprot_swissprot") + self.biomart_tail

# logging.warning(rq_n)

tsvreader = csv.DictReader((urllib.request.urlopen(self.biomart_url +
urllib.parse.quote(rq_n)).read()).decode('utf-8').splitlines(), dialect='excel-tab')
if ensemble_only:
Expand Down
2 changes: 1 addition & 1 deletion epytope/doc/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ def __getattr__(cls, name):
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'fred2', 'epytope Documentation',
(master_doc, 'epytope', 'epytope Documentation',
[author], 1)
]

Expand Down
4 changes: 2 additions & 2 deletions epytope/tutorials/GeneratorUsage.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/antonia/PycharmProjects/Kfred/epytope/Core/Generator.py:57: UserWarning: For NM_001190266 bp does not match ref of assigned variant Variant(g.234183368A>G). Pos 645, var ref A, seq ref C \n",
"epytope/Core/Generator.py:57: UserWarning: For NM_001190266 bp does not match ref of assigned variant Variant(g.234183368A>G). Pos 645, var ref A, seq ref C \n",
" seq[pos]))\n"
]
},
Expand Down Expand Up @@ -277,7 +277,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/antonia/opt/miniconda3/envs/epy/lib/python3.7/site-packages/Bio/Seq.py:2338: BiopythonWarning: Partial codon, len(sequence) not a multiple of three. Explicitly trim the sequence or add trailing N before translation. This may become an error in future.\n",
"/opt/miniconda3/envs/epy/lib/python3.7/site-packages/Bio/Seq.py:2338: BiopythonWarning: Partial codon, len(sequence) not a multiple of three. Explicitly trim the sequence or add trailing N before translation. This may become an error in future.\n",
" BiopythonWarning,\n"
]
}
Expand Down
33 changes: 2 additions & 31 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,9 @@

here = path.abspath(path.dirname(__file__))

#d2s_src_dir = path.join(path.join('epytope', 'Distance2Self'), 'src')
#d2s_module = Extension('epytope.d2s',
# define_macros=[('MAJOR_VERSION', '1'),
# ('MINOR_VERSION', '0')],
# include_dirs=[d2s_src_dir],
# libraries=['boost_serialization', 'boost_python'],
# #library_dirs = ['/usr/local/lib'],
# depends=[path.join(d2s_src_dir, 'distance2self.hpp')],
# sources=[path.join(d2s_src_dir, 'distance2self.cpp')])


#data_files = list()
# directories = glob.glob('epytope/Data/svms/*/')
# for directory in directories:
# files = glob.glob(directory + '*')
# data_files.append((directory, files))
#directories = glob.glob('epytope/Data/examples/')
#for directory in directories:
# files = glob.glob(directory + '*')
# data_files.append((directory, files))
#
# d2s_files = glob.glob(d2s_dir + "src/" + '*')
#data_files.append((d2s_dir + "src/", d2s_files))

#for packaging files must be in a package (with init) and listed in package_data
# package-externals can be included with data_files,
# and there is a bug in patternmatching http://bugs.python.org/issue19286
# and there is a bug in patter nmatching http://bugs.python.org/issue19286
# install unclear for data_files

# Read the contents of the README.md file for use as long_description
Expand All @@ -45,7 +21,7 @@
name='epytope',

# Version:
version='3.0.0',
version='3.1.0',

description='A Framework for Epitope Detection and Vaccine Design',
long_description=long_description,
Expand Down Expand Up @@ -89,7 +65,6 @@
# Specify packages via find_packages() and exclude the tests and
# documentation:
packages=find_packages(),
#packages=find_packages(exclude=['epytope.test', 'epytope.doc', 'epytope.tutorials']),

# If there are data files included in your packages that need to be
# installed, specify them here. If using Python 2.6 or less, then these
Expand All @@ -100,7 +75,6 @@
'epytope.Data.svms.svmtap': ['*'],
'epytope.Data.svms.svmhc': ['*'],
'epytope.Data.svms.unitope': ['*'],
#'epytope.Distance2Self': ['src/*'], #does not get installed, because the src folder is no package folder - compiles ok
},

data_files = [
Expand All @@ -124,9 +98,6 @@
# ],
#},

#ext_modules=[helloworld_module],
#ext_modules=[d2s_module],

# Run-time dependencies. (will be installed by pip when epytope is installed)
# TODO: find alternative for SMVlight scikitlearn
install_requires=[
Expand Down