levitsky / pyteomics

Pyteomics is a collection of lightweight and handy tools for Python that help to handle various sorts of proteomics data. Pyteomics provides a growing set of modules to facilitate the most common tasks in proteomics data analysis.
http://pyteomics.readthedocs.io
Apache License 2.0
105 stars 34 forks source link

[proforma] Unimod modificatons cannot be resolved by ID through psims #132

Closed RalfG closed 7 months ago

RalfG commented 7 months ago

Hi @mobiusklein,

I think this issue is related to the changes made in #129 (thanks btw to implement this!).

Resolving a Unimod modification with its accession number if the psims back-end is used results in an error:

>>> from pyteomics import proforma
>>> proforma._has_psims
True
>>> mod = proforma.process_tag_tokens("U:4")
>>> mod.mass
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Untitled-2.ipynb Cell 14 line 1
----> [1](vscode-notebook-cell:Untitled-2.ipynb?jupyter-notebook#X11sdW50aXRsZWQ%3D?line=0) mod.name

File [c:\Users\ralfg\git\ms2rescore\.venv\lib\site-packages\pyteomics\proforma.py:735](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:735), in ModificationBase.name(self)
    [727](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:727) @property
    [728](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:728) def name(self):
    [729](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:729)     '''The primary name of this modification from its provider.
    [730](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:730) 
    [731](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:731)     Returns
    [732](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:732)     -------
    [733](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:733)     str
    [734](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:734)     '''
--> [735](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:735)     return self.definition.get('name')

File [c:\Users\ralfg\git\ms2rescore\.venv\lib\site-packages\pyteomics\proforma.py:700](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:700), in ModificationBase.definition(self)
    [691](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:691) '''A :class:`dict` of properties describing this modification, given
    [692](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:692) by the providing controlled vocabulary. This value is cached, and
    [693](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:693) should not be modified.
   (...)
    [697](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:697) dict
    [698](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:698) '''
    [699](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:699) if self._definition is None:
--> [700](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:700)     self._definition = self.resolve()
    [701](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:701) return self._definition

File [c:\Users\ralfg\git\ms2rescore\.venv\lib\site-packages\pyteomics\proforma.py:758](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:758), in ModificationBase.resolve(self)
    [755](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:755) '''Find the term and return it's properties
    [756](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:756) '''
    [757](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:757) keys = self.resolver.parse_identifier(self.value)
--> [758](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:758) return self.resolver(*keys)

File [c:\Users\ralfg\git\ms2rescore\.venv\lib\site-packages\pyteomics\proforma.py:344](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:344), in ModificationResolver.__call__(self, name, id, **kwargs)
    [343](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:343) def __call__(self, name=None, id=None, **kwargs):
--> [344](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:344)     return self.resolve(name, id, **kwargs)

File [c:\Users\ralfg\git\ms2rescore\.venv\lib\site-packages\pyteomics\proforma.py:386](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:386), in UnimodResolver.resolve(self, name, id, **kwargs)
    [384](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:384)         raise KeyError(name)
    [385](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:385) elif id is not None:
--> [386](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:386)     defn = self.database.by_id(id)
    [387](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:387)     if not defn:
    [388](file:///C:/Users/ralfg/git/ms2rescore/.venv/lib/site-packages/pyteomics/proforma.py:388)         raise KeyError(id)

AttributeError: 'Unimod' object has no attribute 'by_id'

Without the psims backend, it works as expected:

>>> from pyteomics import proforma
>>> proforma._has_psims
False
>>> mod = proforma.process_tag_tokens("U:4")
>>> mod.mass
57.021464

Best, Ralf