Source code for pyXLMS.transform._targets_only
#!/usr/bin/env python3
# 2025 (c) Micha Johannes Birklbauer
# https://github.com/michabirklbauer/
# micha.birklbauer@gmail.com
from __future__ import annotations
from ..data._csm import CrosslinkSpectrumMatch
from ..data._crosslink import Crosslink
from ..data._parser_result import ParserResult
from ..data._util import check_input_multi
from ..data._parser_result import create_parser_result
from ._filter import filter_target_decoy
from ._util import assert_csms
from ._util import assert_xls
from ._util import assert_csms_or_xls
from typing import List
[docs]
def targets_only(
data: List[CrosslinkSpectrumMatch] | List[Crosslink] | ParserResult,
) -> List[CrosslinkSpectrumMatch] | List[Crosslink] | ParserResult:
r"""Get target crosslinks or crosslink-spectrum-matches.
Get target crosslinks or crosslink-spectrum-matches from a list of target and decoy crosslinks or
crosslink-spectrum-matches, or a parser_result. This effectively filters out any target-decoy and
decoy-decoy matches and is essentially a convenience wrapper for
``transform.filter_target_decoy()["Target-Target"]``.
Parameters
----------
data : list of CrosslinkSpectrumMatch, list of Crosslink, or ParserResult
A list of crosslink-spectrum-matches or crosslinks, or a parser_result.
Returns
-------
list of CrosslinkSpectrumMatch, list of Crosslink, or ParserResult
If a list of crosslink-spectrum-matches or crosslinks was provided, a list of target
crosslink-spectrum-matches or crosslinks is returned. If a parser_result was provided,
a parser_result with target crosslink-spectrum-matches and/or target crosslinks will
be returned.
Raises
------
TypeError
If a wrong data type is provided.
RuntimeError
If no target crosslinks or crosslink-spectrum-matches were found.
Examples
--------
>>> from pyXLMS.parser import read
>>> from pyXLMS.transform import targets_only
>>> result = read(
... "data/ms_annika/XLpeplib_Beveridge_QEx-HFX_DSS_R1_CSMs.xlsx",
... engine="MS Annika",
... crosslinker="DSS",
... )
>>> targets = targets_only(result["crosslink-spectrum-matches"])
>>> len(targets)
786
>>> from pyXLMS.parser import read
>>> from pyXLMS.transform import targets_only
>>> result = read(
... "data/ms_annika/XLpeplib_Beveridge_QEx-HFX_DSS_R1_Crosslinks.xlsx",
... engine="MS Annika",
... crosslinker="DSS",
... )
>>> targets = targets_only(result["crosslinks"])
>>> len(targets)
265
>>> from pyXLMS.parser import read
>>> from pyXLMS.transform import targets_only
>>> result = read(
... [
... "data/ms_annika/XLpeplib_Beveridge_QEx-HFX_DSS_R1_CSMs.xlsx",
... "data/ms_annika/XLpeplib_Beveridge_QEx-HFX_DSS_R1_Crosslinks.xlsx",
... ],
... engine="MS Annika",
... crosslinker="DSS",
... )
>>> result_targets = targets_only(result)
>>> len(result_targets["crosslink-spectrum-matches"])
786
>>> len(result_targets["crosslinks"])
265
"""
_ok = check_input_multi(data, "data", [ParserResult, list])
if isinstance(data, list):
csms_or_xls = assert_csms_or_xls(data)
if len(csms_or_xls) == 0:
return csms_or_xls
targets = filter_target_decoy(csms_or_xls)["Target-Target"]
if len(targets) == 0:
raise RuntimeError(
"No target matches found! Are you sure your data is labelled?"
)
return targets
new_csms = (
assert_csms(
filter_target_decoy(data["crosslink-spectrum-matches"])["Target-Target"]
)
if data["crosslink-spectrum-matches"] is not None
else None
)
new_xls = (
assert_xls(filter_target_decoy(data["crosslinks"])["Target-Target"])
if data["crosslinks"] is not None
else None
)
if new_csms is not None:
if len(new_csms) == 0:
raise RuntimeError(
"No target crosslink-spectrum-matches found! Are you sure they are labelled?"
)
if new_xls is not None:
if len(new_xls) == 0:
raise RuntimeError(
"No target crosslinks found! Are you sure they are labelled?"
)
return create_parser_result(
search_engine=data["search_engine"],
csms=new_csms,
crosslinks=new_xls,
)