From 536189a77b32484c27ea17d071a18d08eda1a746 Mon Sep 17 00:00:00 2001 From: ArthurDeclercq Date: Fri, 2 Dec 2022 09:59:59 +0100 Subject: [PATCH 01/13] ionbot psm list parser --- psm_utils/io/ionbot.py | 140 ++++++++++++++++++++++++ tests/test_data/ionbot.first.test.csv | 150 ++++++++++++++++++++++++++ 2 files changed, 290 insertions(+) create mode 100644 psm_utils/io/ionbot.py create mode 100644 tests/test_data/ionbot.first.test.csv diff --git a/psm_utils/io/ionbot.py b/psm_utils/io/ionbot.py new file mode 100644 index 0000000..6de4936 --- /dev/null +++ b/psm_utils/io/ionbot.py @@ -0,0 +1,140 @@ +""" +ionbot first csv file parser +""" + +from __future__ import annotations + +import csv +import re +from collections import namedtuple +from pathlib import Path +from typing import Iterable, NamedTuple, Optional + +import pandas as pd + +from psm_utils.io._base_classes import ReaderBase, WriterBase +from psm_utils.io.exceptions import PSMUtilsIOException +from psm_utils.peptidoform import Peptidoform +from psm_utils.psm import PSM +from psm_utils.psm_list import PSMList + +REQUIRED_COLUMNS = [ + "database_peptide", + "modifications", + "charge", + "spectrum_title", + "spectrum_file", + "proteins", + "observed_retention_time", + "database", + "psm_score", + "q-value", + "PEP", +] + + +class IonbotReader(ReaderBase): + def __init__( + self, + filename: str | Path, + *args, + **kwargs, + ) -> None: + + super().__init__(filename, *args, **kwargs) + self.filename = filename + + def __iter__(self) -> Iterable[PSM]: + """Iterate over file and return PSMs one-by-one.""" + with open(self.filename, "rt") as open_file: + reader = csv.DictReader(open_file, delimiter=",") + for row in reader: + psm = self._get_peptide_spectrum_match(row) + yield psm + + def read_file(self) -> PSMList: + """Read full Peptide Record PSM file into a PSMList object.""" + psm_list = [] + with open(self.filename) as ionbot_in: + reader = csv.DictReader(ionbot_in, delimiter=",") + for row in reader: + psm_list.append(self._get_peptide_spectrum_match(row)) + return PSMList(psm_list=psm_list) + + def _get_peptide_spectrum_match(self, psm_dict: dict[str, str | float]) -> PSM: + + try: + psm = PSM( + peptidoform=self._parse_peptidoform( + psm_dict["database_peptide"], + psm_dict["modifications"], + psm_dict["charge"], + ), + spectrum_id=psm_dict["spectrum_title"], + run=psm_dict["spectrum_file"], + is_decoy=psm_dict["database"] == "D", + score=float(psm_dict["psm_score"]), + # precursor_mz=float(psm_dict["m/z"]), + retention_time=float(psm_dict["observed_retention_time"]), + protein_list=psm_dict["proteins"].split( + "|" + ), # what is the ionbot separator? + source="Ionbot", + qvalue=float(psm_dict["q-value"]), + pep=float(psm_dict["PEP"]), + provenance_data=({"Ionbot_filename": str(self.filename)}), + metadata={ + col: str(psm_dict[col]) + for col in psm_dict.keys() + if col not in REQUIRED_COLUMNS + }, + ) + except KeyError: # keyerror in proforma.parse with Delta:H(2)C(3)O(1) as mod + return None + + return psm + + @staticmethod + def _parse_peptidoform(peptide, modifications, charge): + peptide = peptide = [""] + list(peptide) + [""] + pattern = re.compile(r"^(?P\[\S*?\])?(?P.*?)(?P\[\S*?\])?$") + + for position, label in zip( + modifications.split("|")[::2], modifications.split("|")[1::2] + ): + mod_match = pattern.search(label) + + if mod_match.group("U"): + parsed_label = "U:" + mod_match.group("U")[1:-1] + + else: + parsed_label = mod_match.group("mod") + + # if (mod_match.group("AA")) and ( + # mod_match.group("AA")[1:-1] != peptide[int(position)] + # ): + # print(mod_match.group("AA")[1:-1], peptide[int(position)]) + + peptide[int(position)] += f"[{parsed_label}]" + + peptide[0] = peptide[0] + "-" if peptide[0] else "" + peptide[-1] = "-" + peptide[-1] if peptide[-1] else "" + proforma_seq = "".join(peptide) + + # Add charge state + if charge: + proforma_seq += f"/{charge}" + + return proforma_seq + + +class InvalidPeprecError(PSMUtilsIOException): + """Invalid Peptide Record file.""" + + pass + + +class InvalidIonbotModificationError(InvalidPeprecError): + """Invalid Peptide Record modification.""" + + pass diff --git a/tests/test_data/ionbot.first.test.csv b/tests/test_data/ionbot.first.test.csv new file mode 100644 index 0000000..eaf7173 --- /dev/null +++ b/tests/test_data/ionbot.first.test.csv @@ -0,0 +1,150 @@ +ionbot_match_id,spectrum_title,scan,spectrum_file,precursor_mass,peptide_mass,observed_retention_time,charge,database_peptide,matched_peptide,modifications,modifications_delta,corrected_retention_time,unexpected_modification,database,psm_score,q-value,PEP,proteins +0_987_9,Cmpd 1000$ +MS2(1131.4571)$ 37.9eV$ 12.95min$ 1/K0=1.164$ #4507-4508,0,TP9248RJB_Slot1-08_1_9345_DA5.3.556_1.mgf,2260.89864993,2260.89864000,775.64500000,2,SSSSNEQDDPTITIPEER,SSSSNEQDDPTITIPEER,10|unknown modification,0|,775.64500000,,D,-2.07985000,0.34789000,1.00000000,decoy_E2FF_ARATH((216-234))((Q8RWL0)) +19_987_1,Cmpd 1000$ +MS2(447.8737)$ 24.1eV$ 12.44+-0.01min$ 1/K0=0.729$ #4327-4337,0,TP9292RJB_Slot1-01_1_9390_DA5.3.556_1.mgf,1340.59765490,1339.58913000,745.87500000,3,YSAEGENEDAKK,YSAEGENEDAKK,,0|,745.87500000,,T,1.60647000,0.00000224,0.00002506,ALFP3_ARATH((371-383))((Q9ZU52)) +4_978_4,Cmpd 1000$ +MS2(454.7558)$ 25.5eV$ 12.86min$ 1/K0=0.776$ #4475-4476,0,TP9262RJB_Slot1-06_1_9359_DA5.3.556_1.mgf,907.49600993,907.48753000,771.04600000,2,RGPQEPPK,RGPQEPPK,,0|,820.52800000,,T,0.45693600,0.00091633,0.01171970,PSAH2_ARATH((131-139))((Q9SUI6))||PSAH1_ARATH((131-139))((Q9SUI7)) +12_1011_8,Cmpd 1000$ +MS2(510.5982)$ 25.6eV$ 12.72+-0.01min$ 1/K0=0.779$ #4421-4431,0,TP9278RJB_Slot1-03_1_9376_DA5.3.556_1.mgf,1528.77124489,1528.77124000,762.58300000,3,GSPSPPPIGGCPPAPSK,GSPSPPPIGGCPPAPSK,1|unknown modification|11|[4]carbamidomethyl[C],11|57.02146400,762.58300000,,D,-1.57411000,0.32605100,0.97174200,decoy_POF21_ARATH((379-396))((Q04088)) +1_972_4,Cmpd 1000$ +MS2(573.7647)$ 28.5eV$ 12.81+-0.01min$ 1/K0=0.869$ #4457-4465,0,TP9250RJB_Slot1-08_1_9347_DA5.3.556_1.mgf,1145.51364993,1145.51998000,768.37900000,2,AAEDPAPASSSSK,AEDPAPASSSSK,1|semi_tryptic,0|,768.37900000,semi_tryptic,T,1.09802000,0.00004732,0.00038099,PSAE1_ARATH((45-58))((Q9S831)) +10_995_2,Cmpd 1000$ +MS2(660.3325)$ 30.5eV$ 12.36min$ 1/K0=0.931$ #4304-4306,0,TP9274RJB_Slot1-04_1_9372_DA5.3.556_1.mgf,1318.64944993,1318.64852000,741.36500000,2,EMQSNIKR,EMQSNIKR,2|[35]oxidation[M]|0|[1314]biotinAcrolein298[N-TERM],2|15.99491500|0|298.14634700,741.36500000,[1314]biotinAcrolein298[N-TERM],T,-0.74935400,0.13740100,0.82895500,ACR1_ARATH((114-122))((Q9FHP1)) +17_1003_9,Cmpd 1000$ +MS2(795.8363)$ 33.9eV$ 12.96+-0.01min$ 1/K0=1.040$ #4504-4511,0,TP9288RJB_Slot1-02_1_9386_DA5.3.556_1.mgf,1589.65696993,1589.65696000,777.02600000,2,MYIQDKIPHSR,MYIQDKIPHSR,1|[35]oxidation[M]|7|unknown modification,1|15.99491500,777.02600000,,D,-1.81164000,0.34017300,0.98998500,decoy_PP172_ARATH((108-119))((Q9ZUW3)) +7_10052_4,Cmpd 10000$ +MS2(1061.4594)$ 37.9eV$ 19.72+-0.01min$ 1/K0=1.165$ #6859-6869,0,TP9268RJB_Slot1-05_1_9365_DA5.3.556_1.mgf,2120.90316993,2120.88514000,1183.01000000,2,NEKSGGSESSDGGSDHKNER,NEKSGGSESSDGGSDHKNER,10|[5]Carbamyl[S],10|43.00581400,1183.01000000,[5]Carbamyl[S],T,-1.11421000,0.25248400,0.94388100,SCO11_ARATH((95-115))((Q8VYP0)) +19_9965_2,Cmpd 10000$ +MS2(415.7147)$ 26.3eV$ 19.41min$ 1/K0=0.801$ #6758-6760,0,TP9292RJB_Slot1-01_1_9390_DA5.3.556_1.mgf,829.41374993,829.40822000,1164.45000000,2,FAPDQPR,FAPDQPR,,0|,1164.45000000,,T,0.27908600,0.00228513,0.03544390,ILVB_ARATH((91-98))((P17597)) +18_9926_6,Cmpd 10000$ +MS2(420.7530)$ 26.7eV$ 19.70min$ 1/K0=0.814$ #6855-6856,0,TP9290RJB_Slot1-01_1_9388_DA5.3.556_1.mgf,839.49040993,843.52516000,1181.73000000,2,IKVMPIK,IKVMPIK,4|[35]oxidation[M],4|15.99491500,1181.73000000,,D,-0.30310800,0.03867030,0.50651400,decoy_AGL61_ARATH((194-201))((Q4PSU4)) +10_10112_6,Cmpd 10000$ +MS2(437.2512)$ 26.0eV$ 19.85min$ 1/K0=0.791$ #6912-6913,0,TP9274RJB_Slot1-04_1_9372_DA5.3.556_1.mgf,872.48668993,874.47595000,1190.72000000,2,INEAISTK,INEAISTK,,0|,1193.22000000,,T,0.43996500,0.00098658,0.01299880,FAMT_ARATH((34-42))((Q9FYC4)) +6_9964_1,Cmpd 10000$ +MS2(517.2346)$ 27.6eV$ 19.29min$ 1/K0=0.842$ #6716,0,TP9266RJB_Slot1-05_1_9363_DA5.3.556_1.mgf,1032.45354993,1035.47198000,1157.18000000,2,TEDTGGIESK,TEDTGGIESK,,0|,1157.18000000,,T,0.06843260,0.00704935,0.11863000,RPE5C_ARATH((28-38))((Q9M1H8)) +11_9962_12,Cmpd 10000$ +MS2(578.7850)$ 28.6eV$ 19.81min$ 1/K0=0.873$ #6893-6896,0,TP9276RJB_Slot1-04_1_9374_DA5.3.556_1.mgf,1155.55434993,1155.55876000,1187.77000000,2,GTVASYHMK,GTVASYHMK,5|[727]O-pinacolylmethylphosphonate[S],5|162.08096700,1187.77000000,[727]O-pinacolylmethylphosphonate[S],D,-0.56254900,0.08930260,0.72702500,decoy_STIP2_ARATH((4-13))((Q9SLC6)) +8_9952_3,Cmpd 10000$ +MS2(580.7952)$ 28.8eV$ 19.73+-0.01min$ 1/K0=0.880$ #6867-6871,0,TP9270RJB_Slot1-05_1_9367_DA5.3.556_1.mgf,1159.57472993,1159.57201000,1183.51000000,2,SIIASADTGSGK,SIIASADTGSGK,12|[319]Delta:H(2)C(3)O(1)[K],12|54.01056500,1183.51000000,[319]Delta:H(2)C(3)O(1)[K],T,-0.40323100,0.05556790,0.61014600,RH41_ARATH((149-161))((Q3EBD3)) +16_9954_6,Cmpd 10000$ +MS2(648.7729)$ 30.5eV$ 20.15min$ 1/K0=0.934$ #7011-7012,0,TP9286RJB_Slot1-02_1_9384_DA5.3.556_1.mgf,1295.53016993,1291.57136000,1208.18000000,2,PMENANIEGSSK,PMENANIEGSSK,2|[35]oxidation[M],2|15.99491500,1208.18000000,,D,-0.29340500,0.03727480,0.49523200,decoy_SSC14_ARATH((740-752))((Q8W1Y0)) +4_9949_2,Cmpd 10000$ +MS2(675.8493)$ 32.8eV$ 20.22+-0.01min$ 1/K0=1.005$ #7038-7042,0,TP9262RJB_Slot1-06_1_9359_DA5.3.556_1.mgf,1349.68304993,1349.68600000,1213.05000000,2,ITSAVVMKDGEGK,ITSAVVMKDGEGK,7|[35]oxidation[M],7|15.99491500,1213.05000000,,T,2.48126000,0.00000224,0.00000020,PABP2_ARATH((241-254))((P42731)) +20_9981_4,Cmpd 10000$ +MS2(684.8100)$ 32.2eV$ 19.05min$ 1/K0=0.985$ #6630-6632,0,TP9294RJB_Slot1-01_1_9392_DA5.3.556_1.mgf,1367.60444993,1367.62265000,1142.11000000,2,KGQFCGHSVMR,KGQFCGHSVMR,1|[318]Delta:H(2)C(5)[K]|5|[4]carbamidomethyl[C],1|62.01565000|5|57.02146400,1142.11000000,[318]Delta:H(2)C(5)[K],T,-1.04772000,0.23292800,0.93530300,KDSA2_ARATH((138-149))((Q6NQL4)) +13_9949_1,Cmpd 10000$ +MS2(687.7720)$ 31.1eV$ 18.69min$ 1/K0=0.952$ #6503-6505,0,TP9280RJB_Slot1-03_1_9378_DA5.3.556_1.mgf,1373.52836993,1374.53571000,1120.86000000,2,ESDCYTGETSAR,ESDCYTGETSAR,4|[4]carbamidomethyl[C],4|57.02146400,1120.86000000,,T,1.49955000,0.00000412,0.00004498,APF1_ARATH((446-458))((Q8VYV9)) +0_9972_4,Cmpd 10000$ +MS2(733.3606)$ 33.3eV$ 19.29+-0.01min$ 1/K0=1.021$ #6709-6717,0,TP9248RJB_Slot1-08_1_9345_DA5.3.556_1.mgf,1464.70562993,1464.69378000,1157.03000000,2,MSKNSNVEENGGAK,MSKNSNVEENGGAK,8|[1827]Glu->pyro-Glu+Methyl:2H(2)13C(1)[E],8|-0.97900600,1157.03000000,[1827]Glu->pyro-Glu+Methyl:2H(2)13C(1)[E],T,-0.52792600,0.08152030,0.70641000,TBL10_ARATH((1-15))((Q9LDG2)) +9_10043_3,Cmpd 10000$ +MS2(775.4055)$ 35.0eV$ 20.47min$ 1/K0=1.075$ #7127-7130,0,TP9272RJB_Slot1-04_1_9370_DA5.3.556_1.mgf,1548.79536993,1548.80078000,1227.92000000,2,IAQESSRIARYNK,IAQESSRIARYNK,6|[1918]Carbonyl[S],6|13.97926500,1227.92000000,[1918]Carbonyl[S],T,-0.05495620,0.01303870,0.21601000,H2B8_ARATH((87-100))((Q9LFF6))||H2B9_ARATH((81-94))((Q9LZ45)) +3_9955_2,Cmpd 10000$ +MS2(789.8772)$ 33.5eV$ 20.19+-0.01min$ 1/K0=1.028$ #7025-7031,0,TP9260RJB_Slot1-06_1_9357_DA5.3.556_1.mgf,1577.73868993,1577.73546000,1210.70000000,2,ESMGQKDDIQGQVK,ESMGQKDDIQGQVK,3|[35]oxidation[M],3|15.99491500,1210.70000000,,T,0.07775360,0.00672371,0.11289900,PPI1_ARATH((232-246))((O23144)) +18_99916_8,Cmpd 100000$ +MS2(1042.1121)$ 34.7eV$ 69.22min$ 1/K0=1.064$ #24033-24035,0,TP9290RJB_Slot1-01_1_9388_DA5.3.556_1.mgf,3123.31282489,3123.36928000,4152.15000000,3,AICFNRIAANYAAVDPYCGYEKMEK,AICFNRIAANYAAVDPYCGYEKMEK,6|[1255]Cresylphosphate[R]|3|[4]carbamidomethyl[C]|18|[4]carbamidomethyl[C],6|170.01328100|3|57.02146400|18|57.02146400,4152.15000000,[1255]Cresylphosphate[R],D,-1.28120000,0.29033800,0.95199000,decoy_PPR5_ARATH((164-189))((Q9FZ19)) +11_99961_1,Cmpd 100000$ +MS2(415.5719)$ 23.4eV$ 70.74+-0.01min$ 1/K0=0.709$ #24565-24573,0,TP9276RJB_Slot1-04_1_9374_DA5.3.556_1.mgf,1243.69222490,1243.67851000,4243.80000000,3,DNGIIIHIHR,DNGIIIHIHR,9|[4]Carbamidomethyl[H],9|57.02146400,4243.80000000,[4]Carbamidomethyl[H],T,-0.71303000,0.12713100,0.80819300,RBL_ARATH((286-296))((O03042)) +13_100026_12,Cmpd 100000$ +MS2(557.9448)$ 26.7eV$ 66.19min$ 1/K0=0.812$ #22982-22983,0,TP9280RJB_Slot1-03_1_9378_DA5.3.556_1.mgf,1670.81104489,1670.83167000,3970.64000000,3,CVIARIASMDGSIDR,CVIARIASMDGSIDR,10|[950]Cation:Li[D]|1|[4]carbamidomethyl[C],10|6.00817800|1|57.02146400,3970.64000000,[950]Cation:Li[D],D,-1.10807000,0.25078000,0.94354400,decoy_PUB10_ARATH((282-297))((Q9C9A6)) +3_100098_3,Cmpd 100000$ +MS2(588.3109)$ 30.8eV$ 70.40min$ 1/K0=0.941$ #24456-24458,0,TP9260RJB_Slot1-06_1_9357_DA5.3.556_1.mgf,1174.60622993,1174.59594000,4223.77000000,2,FYSPGSIIHR,FYSPGSIIHR,6|[401]Didehydro[S],6|-2.01565000,4223.77000000,[401]Didehydro[S],T,-0.78496700,0.14798400,0.84766400,VP372_ARATH((153-163))((Q3EBL9)) +14_100014_9,Cmpd 100000$ +MS2(607.3263)$ 29.9eV$ 67.28min$ 1/K0=0.913$ #23358-23361,0,TP9282RJB_Slot1-03_1_9380_DA5.3.556_1.mgf,1818.95530490,1822.93253000,4035.59000000,3,EIDFVQARNKVDSFR,EIDFVQARNKVDSFR,,0|,4035.59000000,,D,-0.34237800,0.04481550,0.55004000,decoy_OFT23_ARATH((290-305))((Q9MA87)) +10_99931_3,Cmpd 100000$ +MS2(682.8595)$ 31.9eV$ 70.71min$ 1/K0=0.975$ #24563-24564,0,TP9274RJB_Slot1-04_1_9372_DA5.3.556_1.mgf,1363.70324993,1365.64116000,4241.77000000,2,VEATFGVDESNAK,VEATFGVDESNAK,,0|,2723.59000000,,T,0.73907000,0.00023935,0.00238728,Biognosys|iRT-Kit_WR_fusion((70-83))((Biognosys|iRT-Kit_WR_fusion)) +2_99913_10,Cmpd 100000$ +MS2(726.8767)$ 33.5eV$ 63.08min$ 1/K0=1.028$ #21898-21901,0,TP9252RJB_Slot1-08_1_9349_DA5.3.556_1.mgf,1451.73764993,1451.73764000,3783.69000000,2,NTVDIVIVIVADSDGR,NTVDIVIVIVADSDGR,1|unknown modification,0|,3783.69000000,,D,-1.35846000,0.30266600,0.95985300,decoy_CRU4_ARATH((274-290))((Q9ZWA9)) +20_99935_1,Cmpd 100000$ +MS2(756.7803)$ 32.6eV$ 67.73min$ 1/K0=0.997$ #23517,0,TP9294RJB_Slot1-01_1_9392_DA5.3.556_1.mgf,1511.54484993,1511.54484000,4062.42000000,2,TEEEMPIGRMPSPR,TEEEMPIGRMPSPR,7|unknown modification,0|,4062.42000000,,D,-1.76769000,0.33822600,0.98998500,decoy_Y4276_ARATH((177-191))((Q56XJ7)) +12_99951_7,Cmpd 100000$ +MS2(759.3867)$ 34.2eV$ 66.88+-0.01min$ 1/K0=1.047$ #23221-23225,0,TP9278RJB_Slot1-03_1_9376_DA5.3.556_1.mgf,1516.75776993,1516.76200000,4012.09000000,2,IAEEIAEEIATTR,IAEEIAEEIATTR,13|[830]Dihydroxyimidazolidine[R],13|72.02112900,4566.63000000,[830]Dihydroxyimidazolidine[R],D,-0.19448200,0.02480910,0.37391200,decoy_DAR4_ARATH((488-501))((Q9FKN7)) +4_100089_3,Cmpd 100000$ +MS2(764.4049)$ 33.4eV$ 70.45min$ 1/K0=1.023$ #24473,0,TP9262RJB_Slot1-06_1_9359_DA5.3.556_1.mgf,1526.79422993,1526.79396000,4226.35000000,2,EGEPSIAPSITITGR,EGEPSIAPSITITGR,,0|,4221.50000000,,T,4.11172000,0.00000224,0.00000000,PSAL_ARATH((160-175))((Q9SUI4)) +15_100073_5,Cmpd 100000$ +MS2(772.8328)$ 33.8eV$ 70.46min$ 1/K0=1.037$ #24471-24472,0,TP9284RJB_Slot1-02_1_9382_DA5.3.556_1.mgf,1543.64984993,1543.65001000,4226.98000000,2,DMWEDTSFQIEK,DMWEDTSFQIEK,2|[35]oxidation[M],2|15.99491500,4226.98000000,,T,2.35327000,0.00000224,0.00000040,PUR4_ARATH((1086-1098))((Q9M8D3)) +8_100012_3,Cmpd 100000$ +MS2(776.8557)$ 33.5eV$ 68.18min$ 1/K0=1.028$ #23683-23685,0,TP9270RJB_Slot1-05_1_9367_DA5.3.556_1.mgf,1551.69574993,1557.72450000,4089.42000000,2,YIQNSMFAIDSNR,YIQNSMFAIDSNR,,0|,4089.42000000,,T,-0.49935200,0.07520250,0.68770000,VQ9_ARATH((196-209))((Q9M9F0)) +7_99925_3,Cmpd 100000$ +MS2(790.0232)$ 33.0eV$ 68.95min$ 1/K0=1.010$ #23951-23952,0,TP9268RJB_Slot1-05_1_9365_DA5.3.556_1.mgf,2367.04627489,2367.04751000,4135.82000000,3,MGINPIMMSAGEIESGNAGEPAK,MGINPIMMSAGEIESGNAGEPAK,8|[35]oxidation[M]|4|[39]Methylthio[N],8|15.99491500|4|45.98772100,4135.82000000,[39]Methylthio[N],T,0.68439800,0.00030915,0.00319960,RCA_ARATH((182-205))((P10896)) +5_99990_3,Cmpd 100000$ +MS2(978.9885)$ 37.4eV$ 69.37min$ 1/K0=1.149$ #24095-24097,0,TP9264RJB_Slot1-06_1_9361_DA5.3.556_1.mgf,1955.96126993,1955.92427000,4160.93000000,2,VKCSDERFCGPSPQFK,VKCSDERFCGPSPQFK,4|[337]Methylamine[S]|3|[4]carbamidomethyl[C]|9|[4]carbamidomethyl[C],4|13.03163400|3|57.02146400|9|57.02146400,4160.93000000,[337]Methylamine[S],D,-1.37730000,0.30525800,0.95985300,decoy_LPAT4_ARATH((5-21))((Q8L4Y2)) +2_100056_10,Cmpd 100001$ +MS2(1127.0071)$ 39.9eV$ 63.08min$ 1/K0=1.225$ #21900-21903,0,TP9252RJB_Slot1-08_1_9349_DA5.3.556_1.mgf,2251.99862993,2251.97067000,3783.87000000,2,NVHRFGAHGADITGDPNIR,NVHRFGAHGADITGDPNIR,8|[2006]Haloxon[H],8|203.95098700,3783.87000000,[2006]Haloxon[H],D,-1.36837000,0.30407200,0.95985300,decoy_CHX28_ARATH((211-230))((Q8L709)) +18_99932_2,Cmpd 100001$ +MS2(1130.5380)$ 40.5eV$ 69.22min$ 1/K0=1.244$ #24034-24035,0,TP9290RJB_Slot1-01_1_9388_DA5.3.556_1.mgf,2259.06038993,2265.16087000,4152.15000000,2,ICATRFTISSPAERMDAVIK,ICATRFTISSPAERMDAVIK,2|[4]carbamidomethyl[C],2|57.02146400,4152.15000000,,T,0.03473830,0.00834869,0.14130800,ORC3_ARATH((293-313))((Q6E7H0)) +19_99954_3,Cmpd 100001$ +MS2(373.2429)$ 24.0eV$ 68.92+-0.01min$ 1/K0=0.728$ #23929-23939,0,TP9292RJB_Slot1-01_1_9390_DA5.3.556_1.mgf,1116.70516490,1116.70187000,4134.97000000,3,KIIIVGVGYR,KIIIVGVGYR,,0|,4134.97000000,,T,0.87782600,0.00013996,0.00116264,RK6_ARATH((129-139))((O23049)) +1_99874_1,Cmpd 100001$ +MS2(494.2920)$ 27.3eV$ 63.31min$ 1/K0=0.831$ #21983-21985,0,TP9250RJB_Slot1-08_1_9347_DA5.3.556_1.mgf,986.56830993,986.56477000,3798.20000000,2,DAIDTIIVK,DAIDTIIVK,,0|,3798.20000000,,T,0.44964800,0.00093580,0.01225140,ARLY_ARATH((179-188))((Q9LEU8)) +5_100009_5,Cmpd 100001$ +MS2(615.9498)$ 28.6eV$ 69.37min$ 1/K0=0.874$ #24095-24097,0,TP9264RJB_Slot1-06_1_9361_DA5.3.556_1.mgf,1844.82586490,1844.82835000,4160.93000000,3,DATNVEQAFMAMSASIK,DATNVEQAFMAMSASIK,12|[425]Dioxidation[M],12|31.98982900,4160.93000000,[425]Dioxidation[M],T,1.81350000,0.00000224,0.00000800,RAD2A_ARATH((154-171))((P28188)) +10_99947_2,Cmpd 100001$ +MS2(619.6242)$ 26.6eV$ 70.72min$ 1/K0=0.810$ #24563-24565,0,TP9274RJB_Slot1-04_1_9372_DA5.3.556_1.mgf,1855.84906490,1855.86008000,4241.85000000,3,GRNDAWDGYGGAVVYTR,GRNDAWDGYGGAVVYTR,,0|,4209.22000000,,T,2.21574000,0.00000224,0.00000086,VDE_ARATH((313-330))((Q39249)) +3_100103_10,Cmpd 100001$ +MS2(649.8498)$ 30.2eV$ 70.41+-0.01min$ 1/K0=0.922$ #24456-24461,0,TP9260RJB_Slot1-06_1_9357_DA5.3.556_1.mgf,1297.68390993,1297.68390000,4224.03000000,2,IESISVPCSDIDK,IESISVPCSDIDK,5|unknown modification|8|[4]carbamidomethyl[C],8|57.02146400,4224.03000000,,D,-0.70433400,0.12475800,0.80335600,decoy_PP157_ARATH((128-141))((Q8GWA9)) +8_99938_8,Cmpd 100001$ +MS2(679.3460)$ 31.3eV$ 68.17min$ 1/K0=0.958$ #23683,0,TP9270RJB_Slot1-05_1_9367_DA5.3.556_1.mgf,1356.67628993,1356.66711000,4089.24000000,2,IESQIASEVFK,IESQIASEVFK,11|[1380]methylsulfonylethyl[K],11|106.00885000,4089.24000000,[1380]methylsulfonylethyl[K],D,-0.80111900,0.15304900,0.85513600,decoy_CER7L_ARATH((282-293))((Q9LDM2)) +4_99941_7,Cmpd 100001$ +MS2(711.3542)$ 32.3eV$ 70.45min$ 1/K0=0.990$ #24473-24476,0,TP9262RJB_Slot1-06_1_9359_DA5.3.556_1.mgf,1420.69266993,1419.70338000,4226.61000000,2,KPDFDAFIDPQK,KPDFDAFIDPQK,,0|,4253.09000000,,T,0.77663800,0.00020079,0.00195865,KPPR_ARATH((224-236))((P25697)) +12_99939_12,Cmpd 100001$ +MS2(760.8864)$ 33.7eV$ 66.87min$ 1/K0=1.032$ #23221,0,TP9278RJB_Slot1-03_1_9376_DA5.3.556_1.mgf,3039.51437986,3037.68911000,4011.75000000,4,VAIAVWPPIVIAEQTSKIIDFFPGGEIK,VAIAVWPPIVIAEQTSKIIDFFPGGEIK,,0|,4011.75000000,,D,-0.62249200,0.10365600,0.76014600,decoy_SUS1_ARATH((720-748))((P49040)) +7_99929_5,Cmpd 100001$ +MS2(761.0189)$ 28.8eV$ 68.95min$ 1/K0=0.879$ #23951-23952,0,TP9268RJB_Slot1-05_1_9365_DA5.3.556_1.mgf,2280.03322489,2280.07473000,4135.82000000,3,NVIIWGNHSSSQYPDVNHAK,NVIIWGNHSSSQYPDVNHAK,14|[359]Pro->pyro-Glu[P],14|13.97926500,4135.82000000,[359]Pro->pyro-Glu[P],T,-0.47117200,0.06911010,0.66717600,MDHC1_ARATH((181-201))((P93819)) +11_99899_3,Cmpd 100001$ +MS2(802.4394)$ 34.0eV$ 70.73min$ 1/K0=1.043$ #24566-24567,0,TP9276RJB_Slot1-04_1_9374_DA5.3.556_1.mgf,1602.86318993,1602.86164000,4243.28000000,2,NAVIITEIPYQTNK,NAVIITEIPYQTNK,,0|,4243.28000000,,T,1.81271000,0.00000224,0.00000804,GYRA_ARATH((352-366))((Q9CAF6)) +6_100083_3,Cmpd 100001$ +MS2(810.9003)$ 34.2eV$ 69.15min$ 1/K0=1.049$ #24023,0,TP9266RJB_Slot1-05_1_9363_DA5.3.556_1.mgf,1619.78486993,1690.80829000,4148.23000000,2,QEISQCVAISEIEK,QEISDCVAISEIEK,5|Gln->Asp[Q]|6|[4]carbamidomethyl[C],6|57.02146400,4148.23000000,substitution,T,-0.88830600,0.18113800,0.88496300,ANP1_ARATH((607-621))((O22040)) +13_100033_4,Cmpd 100001$ +MS2(908.9201)$ 36.0eV$ 66.19min$ 1/K0=1.104$ #22983-22985,0,TP9280RJB_Slot1-03_1_9378_DA5.3.556_1.mgf,1815.82456993,1814.82096000,3970.82000000,2,IDENTGYIDYDQIEK,IDENTGYIDYDQIEK,,0|,3970.82000000,,T,1.20583000,0.00002357,0.00021755,GLYM2_ARATH((203-218))((Q94C74)) +2_99968_2,Cmpd 100002$ +MS2(1048.3636)$ 37.2eV$ 63.08min$ 1/K0=1.141$ #21900-21902,0,TP9252RJB_Slot1-08_1_9349_DA5.3.556_1.mgf,2094.71146993,2094.71146000,3783.78000000,2,DTQSIIFIGKVTNPSEA,DTQSIIFIGKVTNPSEA,9|unknown modification,0|,3791.48000000,,T,-2.21414000,0.35003000,1.00000000,sp|Q9TTE1((395-412))((sp|Q9TTE1))||sp|A2I7N0((395-412))((sp|A2I7N0))||sp|A2I7N1((395-412))((sp|A2I7N1)) +20_99971_6,Cmpd 100002$ +MS2(1078.9836)$ 38.6eV$ 67.74+-0.01min$ 1/K0=1.185$ #23518-23523,0,TP9294RJB_Slot1-01_1_9392_DA5.3.556_1.mgf,2155.95164993,2155.94929000,4063.89000000,2,QGKECHGNAGSIFYFPGSR,QGKECHGNAGSIFYFPGSR,15|[354]Nitro[F]|5|[4]carbamidomethyl[C],15|44.98507800|5|57.02146400,4063.89000000,[354]Nitro[F],D,-0.87523100,0.17684800,0.88130900,decoy_ENL1_ARATH((59-78))((Q9SK27)) +16_100000_2,Cmpd 100002$ +MS2(442.8968)$ 25.8eV$ 71.11min$ 1/K0=0.786$ #24695,0,TP9286RJB_Slot1-02_1_9384_DA5.3.556_1.mgf,1325.66692489,1325.66692000,4265.28000000,3,KYCVIFFPHTK,KYCVIFFPHTK,7|unknown modification|3|[4]carbamidomethyl[C],3|57.02146400,4265.28000000,,T,-1.40209000,0.30859900,0.95985300,SUVR5_ARATH((106-117))((O64827)) +14_100002_1,Cmpd 100002$ +MS2(492.2745)$ 27.0eV$ 67.28min$ 1/K0=0.822$ #23358-23360,0,TP9282RJB_Slot1-03_1_9380_DA5.3.556_1.mgf,1473.80005490,1473.79728000,4035.50000000,3,RVIMSSPISTDIR,RVIMSSPISTDIR,,0|,4035.50000000,,T,1.76488000,0.00000224,0.00001047,RL261_ARATH((27-40))((P51414)) +8_100008_1,Cmpd 100002$ +MS2(558.7950)$ 28.3eV$ 68.18min$ 1/K0=0.864$ #23683-23685,0,TP9270RJB_Slot1-05_1_9367_DA5.3.556_1.mgf,1115.57436993,1172.60367000,4089.42000000,2,IGIEANEEIR,IGIEASEEIR,6|Asn->Ser[N],0|,3053.01000000,substitution,T,-0.35810800,0.04743870,0.56644000,ERG_ARATH((412-422))((O82653)) +3_100121_2,Cmpd 100002$ +MS2(559.3599)$ 29.5eV$ 70.41+-0.01min$ 1/K0=0.902$ #24456-24461,0,TP9260RJB_Slot1-06_1_9357_DA5.3.556_1.mgf,1116.70416993,1117.64949000,4224.03000000,2,VATGIFVGINK,VATGIFVGINK,,0|,4224.03000000,,T,0.84127400,0.00015557,0.00140123,RL363_ARATH((2-13))((Q9LZ57)) +4_99949_1,Cmpd 100002$ +MS2(667.3777)$ 31.7eV$ 70.45min$ 1/K0=0.972$ #24473-24475,0,TP9262RJB_Slot1-06_1_9359_DA5.3.556_1.mgf,1332.73980993,1332.74345000,4226.52000000,2,IVMIITNSASIR,IVMIITNSASIR,3|[35]oxidation[M],3|15.99491500,4226.52000000,,T,1.94210000,0.00000224,0.00000393,SYKM_ARATH((579-591))((Q9LJE2)) +12_99963_2,Cmpd 100002$ +MS2(732.8388)$ 33.1eV$ 66.87min$ 1/K0=1.014$ #23221-23222,0,TP9278RJB_Slot1-03_1_9376_DA5.3.556_1.mgf,1463.66184993,1463.65681000,4011.83000000,2,ADVTPADFSEWSK,ADVTPADFSEWSK,11|[1009]Thiazolidine[W],11|12.00000000,4012.09000000,[1009]Thiazolidine[W],T,-0.87224000,0.17587600,0.88043700,Biognosys|iRT-Kit_WR_fusion((108-121))((Biognosys|iRT-Kit_WR_fusion)) +19_99944_8,Cmpd 100002$ +MS2(741.9868)$ 34.2eV$ 68.92+-0.01min$ 1/K0=1.047$ #23930-23938,0,TP9292RJB_Slot1-01_1_9390_DA5.3.556_1.mgf,3704.89467482,3700.67404000,4134.89000000,5,IEREESSMEDKFIEDGFMYFAFPYSYSIVR,IEREESSMEDKFIEDGFMYFAFPYSYSIVR,8|[35]oxidation[M],8|15.99491500,4134.89000000,,D,-1.03777000,0.22978000,0.93273200,decoy_ARI2_ARATH((159-189))((Q84RR2)) +10_99952_3,Cmpd 100002$ +MS2(783.8693)$ 33.7eV$ 70.72min$ 1/K0=1.033$ #24564-24565,0,TP9274RJB_Slot1-04_1_9372_DA5.3.556_1.mgf,1565.72300993,1565.72925000,4241.85000000,2,EDAQPIVFEVTER,EDAQPIVFEVTER,2|[421]Sulfide[D],2|31.97207100,4241.85000000,[421]Sulfide[D],T,-1.16572000,0.26606500,0.94423800,TIC55_ARATH((257-270))((Q9SK50)) +6_100074_6,Cmpd 100002$ +MS2(790.0249)$ 33.2eV$ 69.15min$ 1/K0=1.017$ #24023-24025,0,TP9266RJB_Slot1-05_1_9363_DA5.3.556_1.mgf,2367.05131489,2367.04751000,4148.41000000,3,MGINPIMMSAGEIESGNAGEPAK,MGINPIMMSAGEIESGNAGEPAK,8|[35]oxidation[M]|0|[39]Methylthio[N-TERM],8|15.99491500|0|45.98772100,4148.41000000,[39]Methylthio[N-TERM],T,0.68484600,0.00030915,0.00319185,RCA_ARATH((182-205))((P10896)) +9_99919_7,Cmpd 100002$ +MS2(823.8964)$ 34.7eV$ 71.62min$ 1/K0=1.065$ #24877-24879,0,TP9272RJB_Slot1-04_1_9370_DA5.3.556_1.mgf,1645.77714993,1648.84936000,4295.87000000,2,YTGGMVPDVNQIIVK,YTGGMVPDVNQIIVK,5|[35]oxidation[M],5|15.99491500,4495.87000000,,T,4.06107000,0.00000224,0.00000000,S17P_ARATH((291-306))((P46283)) +10_99958_3,Cmpd 100003$ +MS2(1157.5130)$ 40.0eV$ 70.72min$ 1/K0=1.230$ #24565,0,TP9274RJB_Slot1-04_1_9372_DA5.3.556_1.mgf,2313.01026993,2393.08881000,4241.85000000,2,TTDDEIVITHIGDCMWKER,TTDDEIVITNIGDCMWKER,15|[35]oxidation[M]|10|His->Asn[H]|14|[4]carbamidomethyl[C],15|15.99491500|14|57.02146400,4241.85000000,substitution,T,-1.24193000,0.28296500,0.94662300,SC16B_ARATH((813-832))((Q9FGK8)) +0_100004_2,Cmpd 100003$ +MS2(542.2891)$ 26.2eV$ 64.05min$ 1/K0=0.797$ #22241-22242,0,TP9248RJB_Slot1-08_1_9345_DA5.3.556_1.mgf,1623.84382489,1623.84672000,3842.84000000,3,IIDSHIIPSAGASESK,IIDSHIIPSAGASESK,,0|,3821.98000000,,T,2.75728000,0.00000224,0.00000004,14336_ARATH((109-125))((P48349)) +6_100047_4,Cmpd 100003$ +MS2(543.2940)$ 29.6eV$ 69.16+-0.01min$ 1/K0=0.904$ #24023-24027,0,TP9266RJB_Slot1-05_1_9363_DA5.3.556_1.mgf,1084.57230993,1084.56293000,4148.58000000,2,EEAGPHEK,EEAGPHEK,0|[1836]Triton[N-TERM],0|188.15650100,4148.58000000,[1836]Triton[N-TERM],T,-0.80317100,0.15371800,0.85603100,CTL2_ARATH((303-311))((Q9LSP9)) +11_99917_6,Cmpd 100003$ +MS2(575.8083)$ 29.3eV$ 70.73min$ 1/K0=0.896$ #24566-24568,0,TP9276RJB_Slot1-04_1_9374_DA5.3.556_1.mgf,1149.60104993,1221.62407000,4243.37000000,2,IGEAYEIVER,IGEAYTIVER,6|Glu->Thr[E],0|,4243.37000000,substitution,T,-0.55638500,0.08792930,0.72344700,PPR83_ARATH((467-477))((Q9FXA9)) +4_99953_2,Cmpd 100003$ +MS2(609.8274)$ 30.7eV$ 70.45min$ 1/K0=0.938$ #24473-24476,0,TP9262RJB_Slot1-06_1_9359_DA5.3.556_1.mgf,1217.63922993,1217.64441000,4226.61000000,2,TFYYDIIKR,TFYYDIIKR,,0|,4251.19000000,,T,1.29006000,0.00001587,0.00013927,CHLM_ARATH((250-259))((Q9SW18)) +19_99912_10,Cmpd 100003$ +MS2(662.6636)$ 33.0eV$ 68.91min$ 1/K0=1.011$ #23930-23931,0,TP9292RJB_Slot1-01_1_9390_DA5.3.556_1.mgf,1984.96741490,1984.97027000,4134.28000000,3,AIYSTNFIPETEK,AIYSTNFIPETEK,0|[1423]Biotin:Thermo-21330[N-TERM],0|473.21957100,4134.28000000,[1423]Biotin:Thermo-21330[N-TERM],D,-1.01697000,0.22317500,0.92622500,decoy_TBL2_ARATH((91-104))((Q8VYR3)) +18_99906_4,Cmpd 100003$ +MS2(685.0179)$ 31.9eV$ 69.22min$ 1/K0=0.978$ #24035,0,TP9290RJB_Slot1-01_1_9388_DA5.3.556_1.mgf,2052.03022490,2054.06564000,4152.15000000,3,TWGGRPENVNAAQTTIIAR,TWGGRPENVNAAQTTIIAR,,0|,4056.06000000,,T,2.14230000,0.00000224,0.00000130,ALFP2_ARATH((348-367))((Q944G9)) +12_100000_11,Cmpd 100003$ +MS2(720.3776)$ 32.3eV$ 66.88+-0.01min$ 1/K0=0.988$ #23221-23225,0,TP9278RJB_Slot1-03_1_9376_DA5.3.556_1.mgf,1438.73954993,1438.74272000,4012.09000000,2,MENFTWANEK,MENFTWANEK,0|[1837]Brij35[N-TERM],0|168.18780100,4012.09000000,[1837]Brij35[N-TERM],D,-0.59583900,0.09711410,0.74587900,decoy_ASK18_ARATH((1-11))((Q9SY65)) +15_99907_3,Cmpd 100003$ +MS2(733.2924)$ 29.3eV$ 70.47+-0.01min$ 1/K0=0.894$ #24471-24477,0,TP9284RJB_Slot1-02_1_9382_DA5.3.556_1.mgf,2196.85369489,2196.89451000,4227.41000000,3,SSSGTSHVHCNPFYDPSR,SSSGTSHVHCNPFYDPSR,15|[286]SulfanilicAcid:13C(6)[D]|10|[4]carbamidomethyl[C],15|161.02422800|10|57.02146400,4227.41000000,[286]SulfanilicAcid:13C(6)[D],T,-1.74508000,0.33710300,0.98998500,MYTM2_ARATH((609-627))((F4JWB3)) +13_100048_11,Cmpd 100003$ +MS2(744.5981)$ 31.6eV$ 66.19min$ 1/K0=0.966$ #22983-22985,0,TP9280RJB_Slot1-03_1_9378_DA5.3.556_1.mgf,2974.36129986,2974.32605000,3970.82000000,4,GGYASTTEGGICGAYRMIDANTEEIER,GGYASTTEGGICGAYRMIDANTEEIER,17|[35]oxidation[M]|28|[958]Propargylamine[C-TERM]|12|[4]carbamidomethyl[C],17|15.99491500|28|37.03163400|12|57.02146400,3970.82000000,[958]Propargylamine[C-TERM],D,-0.77191700,0.14409600,0.84112500,decoy_LBD25_ARATH((5-32))((Q8L8Q3)) +1_99899_6,Cmpd 100003$ +MS2(772.3453)$ 33.4eV$ 63.32+-0.01min$ 1/K0=1.023$ #21984-21988,0,TP9250RJB_Slot1-08_1_9347_DA5.3.556_1.mgf,1542.67496993,1542.68906000,3798.46000000,2,VGETDEPAIYRIK,VGETDEPAIYRIK,5|[1870]Cation:Fe:III:[D],5|52.91146400,3798.46000000,[1870]Cation:Fe:III:[D],T,-1.08069000,0.24298300,0.94109900,OST48_ARATH((302-315))((Q944K2)) +20_100083_2,Cmpd 100003$ +MS2(890.9836)$ 37.5eV$ 67.73min$ 1/K0=1.151$ #23518-23520,0,TP9294RJB_Slot1-01_1_9392_DA5.3.556_1.mgf,1779.95144993,1779.93912000,4063.64000000,2,TIAQAIAMVPMKNTK,TIAQAIAMVPMKNTK,15|[362]Diisopropylphosphate[K],15|164.06023100,4063.64000000,[362]Diisopropylphosphate[K],T,-0.48017300,0.07102760,0.67396800,PME43_ARATH((404-419))((O23447)) +17_100001_1,Cmpd 100003$ +MS2(917.9309)$ 37.1eV$ 70.20+-0.01min$ 1/K0=1.138$ #24370-24380,0,TP9288RJB_Slot1-02_1_9386_DA5.3.556_1.mgf,1833.84618993,1833.88181000,4211.50000000,2,ISSEFHIICDEIR,ISSEFHIICDEIR,4|[1973]Unknown:216[E]|9|[4]carbamidomethyl[C],4|216.09977400|9|57.02146400,4211.50000000,[1973]Unknown:216[E],T,-1.19495000,0.27297700,0.94425900,YLMG2_ARATH((92-105))((Q9C595)) +8_99962_1,Cmpd 100004$ +MS2(1089.8337)$ 36.6eV$ 68.18min$ 1/K0=1.123$ #23684-23685,0,TP9270RJB_Slot1-05_1_9367_DA5.3.556_1.mgf,2177.65180993,2177.65180000,4089.42000000,2,MENMFRIMGSEDSSDR,MENMFRIMGSEDSSDR,8|[35]oxidation[M]|9|unknown modification,8|15.99491500,4089.42000000,,T,-1.76536000,0.33812200,0.98998500,YUC5_ARATH((1-17))((Q9LKC0)) +5_99976_3,Cmpd 100004$ +MS2(1131.0421)$ 40.0eV$ 69.37min$ 1/K0=1.230$ #24096-24097,0,TP9264RJB_Slot1-06_1_9361_DA5.3.556_1.mgf,2260.06856993,2260.02473000,4160.93000000,2,EYIPDPEDTKPAGYDDIPK,EYIPDPEDTKPAGYDDIPK,10|[773]maleimide[K],10|97.01637800,4160.93000000,[773]maleimide[K],T,-0.84809800,0.16804200,0.87282300,CALR1_ARATH((226-245))((O04151)) +16_100064_3,Cmpd 100004$ +MS2(1168.0322)$ 39.6eV$ 71.12min$ 1/K0=1.218$ #24696-24698,0,TP9286RJB_Slot1-02_1_9384_DA5.3.556_1.mgf,2334.04876993,2334.03655000,4266.49000000,2,MGINPIMMSAGEIESGNAGEPAK,MGINPIMMSAGEIESGNAGEPAK,8|[35]oxidation[M]|14|[1918]Carbonyl[E],8|15.99491500|14|13.97926500,4266.49000000,[1918]Carbonyl[E],T,-0.26781900,0.03360090,0.46463500,RCA_ARATH((182-205))((P10896)) +0_100007_1,Cmpd 100004$ +MS2(397.2293)$ 25.3eV$ 64.05min$ 1/K0=0.768$ #22241,0,TP9248RJB_Slot1-08_1_9345_DA5.3.556_1.mgf,792.44300993,792.43812000,3842.76000000,2,DFSIAIK,DFSIAIK,,0|,3870.28000000,,T,0.78746500,0.00019265,0.00185093,PSBQ2_ARATH((110-117))((Q41932)) +19_100082_2,Cmpd 100004$ +MS2(622.8047)$ 30.7eV$ 68.91min$ 1/K0=0.938$ #23930-23931,0,TP9292RJB_Slot1-01_1_9390_DA5.3.556_1.mgf,1243.59374993,1243.59853000,4134.28000000,2,AWPYVQNDIR,AWPYVQNDIR,6|[28]Gln->pyro-Glu[Q],6|-17.02654900,4134.28000000,[28]Gln->pyro-Glu[Q],T,-0.19224700,0.02456410,0.37113000,PSBQ2_ARATH((151-161))((Q41932))||PSBQ1_ARATH((145-155))((Q9XFT3)) +9_99908_2,Cmpd 100004$ +MS2(647.3317)$ 30.6eV$ 71.62min$ 1/K0=0.937$ #24878-24880,0,TP9272RJB_Slot1-04_1_9370_DA5.3.556_1.mgf,1292.64774993,1295.59343000,4295.96000000,2,NPFFPSDPYGR,NPFFPSDPYGR,,0|,4327.65000000,,T,1.79544000,0.00000224,0.00000884,GSTUK_ARATH((82-93))((Q8L7C9)) +15_100090_4,Cmpd 100004$ +MS2(665.8068)$ 31.8eV$ 70.47+-0.01min$ 1/K0=0.973$ #24472-24476,0,TP9284RJB_Slot1-02_1_9382_DA5.3.556_1.mgf,1329.59792993,1329.60293000,4227.33000000,2,IYYDYYFQR,IYYDYYFQR,,0|,4227.33000000,,T,1.43267000,0.00000779,0.00006470,DPE2_ARATH((723-732))((Q8RXD9)) +2_99923_3,Cmpd 100004$ +MS2(675.3226)$ 28.5eV$ 63.08min$ 1/K0=0.871$ #21900-21903,0,TP9252RJB_Slot1-08_1_9349_DA5.3.556_1.mgf,2022.94447489,2021.96532000,3783.87000000,3,NGTEKDGGFTETQIQEIR,NGTEKDGGFTETQIQEIR,,0|,3783.87000000,,T,1.07223000,0.00006023,0.00043477,STT7_ARATH((492-510))((Q9S713)) +1_99888_3,Cmpd 100004$ +MS2(745.8009)$ 32.7eV$ 63.32min$ 1/K0=1.002$ #21984-21987,0,TP9250RJB_Slot1-08_1_9347_DA5.3.556_1.mgf,1489.58606993,1492.69663000,3798.37000000,2,DAMEDSVEIVIEK,DAMEDSVEIVIEK,3|[35]oxidation[M],3|15.99491500,3798.37000000,,T,-0.32736200,0.04239100,0.53381800,CLASP_ARATH((1284-1297))((Q8RWY6)) +6_100022_6,Cmpd 100004$ +MS2(824.3985)$ 34.3eV$ 69.16min$ 1/K0=1.053$ #24025-24028,0,TP9266RJB_Slot1-05_1_9363_DA5.3.556_1.mgf,1646.78138993,1720.82357000,4148.66000000,2,CVIARIASMDGSIDR,CVIARIASDDGSIDR,9|Met->Asp[M]|1|[4]carbamidomethyl[C],1|57.02146400,4148.66000000,substitution,D,-1.72419000,0.33598700,0.98998500,decoy_PUB10_ARATH((282-297))((Q9C9A6)) +20_99963_7,Cmpd 100004$ +MS2(947.9653)$ 36.6eV$ 67.74+-0.01min$ 1/K0=1.123$ #23518-23522,0,TP9294RJB_Slot1-01_1_9392_DA5.3.556_1.mgf,1893.91500993,1893.90219000,4063.81000000,2,SAVGGSGASAVVPSGFCMK,SAVGGSGASAVVPSGFCMK,0|[412]Phenylisocyanate:2H(5)[N-TERM]|17|[4]carbamidomethyl[C],0|124.06849800|17|57.02146400,4063.81000000,[412]Phenylisocyanate:2H(5)[N-TERM],T,-0.92609600,0.19362800,0.89506500,VIL2_ARATH((693-712))((Q9SUM4)) +16_100024_4,Cmpd 100005$ +MS2(1056.9982)$ 39.1eV$ 71.12+-0.01min$ 1/K0=1.202$ #24696-24703,0,TP9286RJB_Slot1-02_1_9384_DA5.3.556_1.mgf,2111.98066993,2112.00776000,4266.93000000,2,EGAIVSASDISAAMVAEAEMK,EGAIVSASDISAAMVAEAEMK,20|[35]oxidation[M]|9|[989]Ammonium[D],20|15.99491500|9|17.02654900,4266.93000000,[989]Ammonium[D],T,-0.17360600,0.02262020,0.34803700,CHLM_ARATH((165-186))((Q9SW18)) +11_99908_3,Cmpd 100005$ +MS2(414.4675)$ 25.7eV$ 70.73min$ 1/K0=0.782$ #24566-24567,0,TP9276RJB_Slot1-04_1_9374_DA5.3.556_1.mgf,1653.83861986,1653.84993000,4243.28000000,4,YGRPIIGCTIKPK,YGRPIIGCTIKPK,9|[1986]Diethylphosphothione[T]|8|[4]carbamidomethyl[C],9|152.00608700|8|57.02146400,4243.28000000,[1986]Diethylphosphothione[T],T,-0.10325400,0.01640590,0.26544600,RBL_ARATH((165-178))((O03042)) +0_100012_2,Cmpd 100005$ +MS2(424.1892)$ 24.8eV$ 64.06+-0.01min$ 1/K0=0.752$ #22241-22248,0,TP9248RJB_Slot1-08_1_9345_DA5.3.556_1.mgf,846.36280993,888.40945000,3843.36000000,2,MFGVSMR,MFGTSMR,6|[35]oxidation[M]|4|Val->Thr[V],6|15.99491500,3843.36000000,substitution,T,-1.76967000,0.33830900,0.98998500,KITHB_ARATH((1-8))((F4KBF5)) +9_99902_6,Cmpd 100005$ +MS2(506.9446)$ 27.0eV$ 71.62min$ 1/K0=0.824$ #24878-24880,0,TP9272RJB_Slot1-04_1_9370_DA5.3.556_1.mgf,1517.81026490,1510.71237000,4295.96000000,3,QEQDQAAVDSHRK,QEQDQAAVDSHRK,,0|,4295.96000000,,T,-0.46528200,0.06785370,0.66261600,THIK2_ARATH((212-225))((Q56WD9)) +3_99952_8,Cmpd 100005$ +MS2(538.6170)$ 27.0eV$ 70.41+-0.01min$ 1/K0=0.823$ #24456-24460,0,TP9260RJB_Slot1-06_1_9357_DA5.3.556_1.mgf,1612.82746490,1616.79800000,4223.94000000,3,IEHMITFPATSSQR,IEHMITFPATSSQR,,0|,4223.94000000,,D,-0.47176900,0.06924190,0.66763300,decoy_KN7A_ARATH((483-497))((Q8S905)) +19_100052_2,Cmpd 100005$ +MS2(538.8407)$ 30.2eV$ 68.91min$ 1/K0=0.922$ #23930,0,TP9292RJB_Slot1-01_1_9390_DA5.3.556_1.mgf,1075.66574993,1075.66574000,4134.19000000,2,IPVTIIIPK,IPVTIIIPK,5|unknown modification,0|,4134.19000000,,T,-0.31770800,0.04089590,0.52310700,TPPII_ARATH((748-757))((F4JVN6)) +5_99971_3,Cmpd 100005$ +MS2(567.2873)$ 28.1eV$ 69.37min$ 1/K0=0.858$ #24096-24097,0,TP9264RJB_Slot1-06_1_9361_DA5.3.556_1.mgf,1698.83830489,1698.86502000,4160.93000000,3,FDGGAIIEMPAEIIK,FDHGAIIEMPAEIIK,9|[35]oxidation[M]|3|Gly->His[G],9|15.99491500,4160.93000000,substitution,D,-1.27208000,0.28869000,0.95059700,decoy_RAF2_ARATH((119-134))((Q9SR19)) +6_99996_3,Cmpd 100005$ +MS2(588.6345)$ 28.7eV$ 69.16min$ 1/K0=0.876$ #24025-24028,0,TP9266RJB_Slot1-05_1_9363_DA5.3.556_1.mgf,1762.87987490,1762.88355000,4148.66000000,3,TITIEVESSDTIDNVK,TITIEVESSDTIDNVK,,0|,4249.15000000,,T,2.34264000,0.00000224,0.00000043,RL40A_ARATH((12-28))((B9DHA6))||UBQ4_ARATH((12-28))((P0CH32))||UBQ11_ARATH((12-28))((P0CH33))||R27AB_ARATH((12-28))((P59232))||R27AC_ARATH((12-28))((P59233))||R27AA_ARATH((12-28))((P59271))||UBQ3_ARATH((12-28))((Q1EC66))||UBQ8_ARATH((487-503))((Q39256))||UBQ12_ARATH((164-180))((Q3E7K8))||UBQ14_ARATH((12-28))((Q3E7T8))||UBQ10_ARATH((12-28))((Q8H159))||RUB2_ARATH((12-28))((Q8RUC6))||UBQ9_ARATH((90-106))((Q9FHQ6))||RUB1_ARATH((12-28))((Q9SHE7)) +13_100063_12,Cmpd 100005$ +MS2(594.0553)$ 30.0eV$ 66.19min$ 1/K0=0.916$ #22983-22984,0,TP9280RJB_Slot1-03_1_9378_DA5.3.556_1.mgf,2372.18973986,2372.14460000,3970.73000000,4,NTIAISESNYVADVAVKPSCK,NTIAISESNYVADVAVKPSCK,8|[1365]N-dimethylphosphate[S]|20|[4]carbamidomethyl[C],8|107.01361500|20|57.02146400,3970.73000000,[1365]N-dimethylphosphate[S],D,-0.47737500,0.07042520,0.67188100,decoy_AB9I_ARATH((270-291))((Q3E8H7)) +4_99903_1,Cmpd 100005$ +MS2(599.3337)$ 29.5eV$ 70.45min$ 1/K0=0.900$ #24473,0,TP9262RJB_Slot1-06_1_9359_DA5.3.556_1.mgf,1196.65172993,1196.65531000,4226.35000000,2,FEISGIPPAPR,FEISGIPPAPR,12|[34]Methyl[C-TERM],12|14.01565000,4333.84000000,[34]Methyl[C-TERM],T,1.87368000,0.00000224,0.00000574,HSP7C_ARATH((465-476))((O65719))||MD37E_ARATH((465-476))((P22953))||MD37D_ARATH((465-476))((P22954))||MD37C_ARATH((465-476))((Q9LHA8)) +12_99984_7,Cmpd 100005$ +MS2(633.6409)$ 30.2eV$ 66.87min$ 1/K0=0.922$ #23221,0,TP9278RJB_Slot1-03_1_9376_DA5.3.556_1.mgf,1897.89931490,1897.93331000,4011.75000000,3,IPAVGFDRTMSSFYHR,IPAVGFDRTMSSFYHR,11|[34]Methyl[S],11|14.01565000,4011.75000000,[34]Methyl[S],D,-1.03406000,0.22859400,0.93167400,decoy_PP151_ARATH((171-187))((Q9SIT7)) +7_100085_5,Cmpd 100005$ +MS2(634.2731)$ 28.2eV$ 68.95min$ 1/K0=0.860$ #23952,0,TP9268RJB_Slot1-05_1_9365_DA5.3.556_1.mgf,2533.06101986,2533.06101000,4135.82000000,4,SCHAYVRIQPPGDTQVAIVGK,SCHAYVRIQPPGDTQVAIVGK,21|unknown modification|2|[4]carbamidomethyl[C],2|57.02146400,4135.82000000,,D,-1.37160000,0.30449700,0.95985300,decoy_HPSE1_ARATH((132-153))((Q9FF10)) +10_99963_5,Cmpd 100005$ +MS2(635.2853)$ 30.3eV$ 70.72min$ 1/K0=0.925$ #24565,0,TP9274RJB_Slot1-04_1_9372_DA5.3.556_1.mgf,1268.55484993,1263.68762000,4241.85000000,2,AFWFPVVRSR,AFWFPVVRSR,,0|,4241.85000000,,D,-0.26670800,0.03344350,0.46328500,decoy_CAAT6_ARATH((200-210))((Q9LZ20)) +1_99905_1,Cmpd 100005$ +MS2(720.0518)$ 30.1eV$ 63.32+-0.01min$ 1/K0=0.920$ #21984-21988,0,TP9250RJB_Slot1-08_1_9347_DA5.3.556_1.mgf,2157.13180489,2157.11553000,3798.46000000,3,FGNKYYQKIGDTQYGR,FGNKYYQKIGDTQYGR,4|[176]BHT[K],4|218.16706500,3798.46000000,[176]BHT[K],T,-1.33209000,0.29877100,0.95861300,NDUAC_ARATH((57-73))((Q9M9M9)) +8_99996_5,Cmpd 100005$ +MS2(887.3886)$ 35.7eV$ 68.18min$ 1/K0=1.095$ #23684-23685,0,TP9270RJB_Slot1-05_1_9367_DA5.3.556_1.mgf,1772.76156993,1772.73385000,4089.42000000,2,MASAQSFYNQSSVIK,MASAQSFYNQSSVIK,1|[35]oxidation[M]|12|[260]Thiophospho[S],1|15.99491500|12|95.94348700,4089.42000000,[260]Thiophospho[S],T,-1.15440000,0.26318500,0.94423800,ARR21_ARATH((1-16))((Q9LYP5)) +20_99957_2,Cmpd 100005$ +MS2(927.2315)$ 36.0eV$ 67.73min$ 1/K0=1.104$ #23518-23519,0,TP9294RJB_Slot1-01_1_9392_DA5.3.556_1.mgf,3704.89489986,3704.90330000,4063.55000000,4,HIEKSEAARQWGSQIHTFCIGIQGSPDIK,HIEKSEAARQWGSQIHTFCIGIQGSPDIK,4|[1829]LRGG+dimethyl[K]|19|[4]carbamidomethyl[C],4|411.25940300|19|57.02146400,4063.55000000,[1829]LRGG+dimethyl[K],T,-1.15130000,0.26240100,0.94423800,ASNS2_ARATH((248-277))((Q9LV77)) +0_100016_1,Cmpd 100006$ +MS2(379.2454)$ 24.3eV$ 64.06+-0.01min$ 1/K0=0.736$ #22241-22245,0,TP9248RJB_Slot1-08_1_9345_DA5.3.556_1.mgf,756.47524993,755.49049000,3843.10000000,2,NGIVIIK,NGIVIIK,,0|,2950.69000000,,T,0.26824400,0.00242703,0.03790200,BXL7_ARATH((396-403))((Q9SGZ5)) +19_100020_2,Cmpd 100006$ +MS2(510.2547)$ 27.4eV$ 68.92min$ 1/K0=0.833$ #23930-23933,0,TP9292RJB_Slot1-01_1_9390_DA5.3.556_1.mgf,1018.49370993,1018.51168000,4134.45000000,2,QMISEIIR,QMISEIIR,2|[35]oxidation[M]|1|[1918]Carbonyl[Q],2|15.99491500|1|13.97926500,4134.45000000,[1918]Carbonyl[Q],T,-1.15477000,0.26330300,0.94423800,PP140_ARATH((11-19))((Q9ZVF4)) +5_99954_6,Cmpd 100006$ +MS2(526.2644)$ 27.3eV$ 69.37min$ 1/K0=0.833$ #24096-24097,0,TP9264RJB_Slot1-06_1_9361_DA5.3.556_1.mgf,1050.51312993,1049.47774000,4160.93000000,2,SGETIWSDR,SGETIWSDR,,0|,4160.93000000,,T,-0.80778400,0.15516900,0.85799500,HIRA_ARATH((642-651))((Q9LXN4)) +3_99943_2,Cmpd 100006$ +MS2(528.9387)$ 26.0eV$ 70.40min$ 1/K0=0.791$ #24456-24457,0,TP9260RJB_Slot1-06_1_9357_DA5.3.556_1.mgf,1583.79265490,1583.81019000,4223.68000000,3,SGDEITSIKDYVTR,SGDEITSIKDYVTR,4|[1827]Glu->pyro-Glu+Methyl:2H(2)13C(1)[E],4|-0.97900600,4223.68000000,[1827]Glu->pyro-Glu+Methyl:2H(2)13C(1)[E],T,0.62709100,0.00040738,0.00437929,HS904_ARATH((441-455))((O03986))||HS903_ARATH((441-455))((P51818))||HS902_ARATH((441-455))((P55737)) +13_100069_4,Cmpd 100006$ +MS2(538.2775)$ 29.5eV$ 66.20+-0.01min$ 1/K0=0.900$ #22983-22990,0,TP9280RJB_Slot1-03_1_9378_DA5.3.556_1.mgf,1074.53924993,1074.53790000,3971.25000000,2,GVIDAGVDAGK,GVIDAGVDAMK,10|Gly->Met[G],0|,3971.25000000,substitution,D,-0.54538200,0.08547630,0.71698600,decoy_AVP2_ARATH((521-532))((Q56ZN6))||decoy_AVPX_ARATH((521-532))((Q9FWR2)) +4_99916_4,Cmpd 100006$ +MS2(549.3236)$ 28.8eV$ 70.45min$ 1/K0=0.878$ #24473-24474,0,TP9262RJB_Slot1-06_1_9359_DA5.3.556_1.mgf,1644.94735490,1644.94735000,4226.43000000,3,AGFPEGKYIFAGVVDGR,AGFPEGKYIFAGVVDGR,4|unknown modification,0|,4226.43000000,,T,0.42010500,0.00109883,0.01468970,METE1_ARATH((280-297))((O50008)) +1_99893_7,Cmpd 100006$ +MS2(549.7645)$ 29.2eV$ 63.32min$ 1/K0=0.891$ #21984-21987,0,TP9250RJB_Slot1-08_1_9347_DA5.3.556_1.mgf,1097.51334993,1097.53277000,3798.37000000,2,IFCIFER,IFCIFER,7|[1290]Dicarbamidomethyl[R]|3|[4]carbamidomethyl[C],7|114.04292700|3|57.02146400,3798.37000000,[1290]Dicarbamidomethyl[R],D,-0.84993800,0.16861200,0.87343500,decoy_IQM5_ARATH((120-127))((Q058N0)) +12_99993_11,Cmpd 100006$ +MS2(588.9864)$ 27.4eV$ 66.88+-0.01min$ 1/K0=0.836$ #23221-23225,0,TP9278RJB_Slot1-03_1_9376_DA5.3.556_1.mgf,1763.93578489,1763.92820000,4012.09000000,3,VGQAIFDKYYKASEK,VGQAIFDKYYKASEK,7|[989]Ammonium[D],7|17.02654900,4012.09000000,[989]Ammonium[D],D,-0.59557600,0.09705390,0.74573400,decoy_BGL21_ARATH((12-27))((Q9C525)) +7_100078_1,Cmpd 100006$ +MS2(611.0169)$ 27.0eV$ 68.95min$ 1/K0=0.824$ #23952,0,TP9268RJB_Slot1-05_1_9365_DA5.3.556_1.mgf,2440.03645986,2440.03645000,4135.82000000,4,KPSNPQKYPAPMSSGENDIVK,KPSNPQKYPAPMSSGENDIVK,1|unknown modification,0|,4135.82000000,,D,-2.36211000,0.35160900,1.00000000,decoy_PBL25_ARATH((353-374))((Q9LRY1)) +2_99927_6,Cmpd 100006$ +MS2(648.6554)$ 29.6eV$ 63.08min$ 1/K0=0.905$ #21901-21903,0,TP9252RJB_Slot1-08_1_9349_DA5.3.556_1.mgf,1942.94284490,1941.88766000,3783.87000000,3,ITTEEEDKAFSDMVAEK,ITTEEEDKAFSDMVAEK,,0|,3783.87000000,,T,0.57603600,0.00052680,0.00582982,RD29A_ARATH((583-600))((Q06738)) +11_99913_4,Cmpd 100006$ +MS2(680.8613)$ 32.1eV$ 70.73min$ 1/K0=0.982$ #24567-24568,0,TP9276RJB_Slot1-04_1_9374_DA5.3.556_1.mgf,1359.70698993,1359.70698000,4243.37000000,2,EFGVSNAHDIPK,EFGVSNAHDIPK,2|unknown modification,0|,4243.37000000,,T,-0.88078400,0.17868500,0.88289200,CAP13_ARATH((261-273))((Q9FRH3)) +17_99967_4,Cmpd 100006$ +MS2(859.2931)$ 34.3eV$ 70.19+-0.01min$ 1/K0=1.053$ #24370-24377,0,TP9288RJB_Slot1-02_1_9386_DA5.3.556_1.mgf,1716.57046993,1716.57046000,4211.24000000,2,TKSDADIIDDGYR,TKSDADIIDDGYR,6|unknown modification,0|,4211.24000000,,T,-2.34969000,0.35149800,1.00000000,WRK43_ARATH((22-35))((Q8GY11)) +18_99993_8,Cmpd 100006$ +MS2(894.9491)$ 39.0eV$ 69.23min$ 1/K0=1.198$ #24036-24039,0,TP9290RJB_Slot1-01_1_9388_DA5.3.556_1.mgf,1787.88260993,1787.89003000,4153.45000000,2,DEVVTEVSAINNQESK,DEVVTEVSAINNQESK,15|[926]ethylamino[S],15|27.04728500,4153.45000000,[926]ethylamino[S],T,-0.66981200,0.11556500,0.78498800,STKLG_ARATH((47-63))((Q8S8D6)) +20_99953_6,Cmpd 100006$ +MS2(927.2315)$ 35.2eV$ 67.74min$ 1/K0=1.080$ #23518-23521,0,TP9294RJB_Slot1-01_1_9392_DA5.3.556_1.mgf,3704.89473986,3704.89473000,4063.72000000,4,GDFSQGNCKWDPPTVDIFEKMVGDSTTIR,GDFSQGNCKWDPPTVDIFEKMVGDSTTIR,21|[35]oxidation[M]|20|unknown modification|8|[4]carbamidomethyl[C],21|15.99491500|8|57.02146400,4063.72000000,,D,-1.90708000,0.34357600,0.99436900,decoy_EXP24_ARATH((6-35))((Q9FL76)) +16_99980_2,Cmpd 100006$ +MS2(978.4312)$ 38.0eV$ 71.12+-0.01min$ 1/K0=1.169$ #24696-24701,0,TP9286RJB_Slot1-02_1_9384_DA5.3.556_1.mgf,1954.84672993,1954.83825000,4266.75000000,2,YQWDQGYFQQEIYR,YQWDQGYFQQEIYR,3|[392]Quinone[W],3|29.97417900,4646.12000000,[392]Quinone[W],T,0.79979200,0.00018209,0.00173589,PSBB_ARATH((273-287))((P56777)) +9_99946_3,Cmpd 100007$ +MS2(1074.9679)$ 37.7eV$ 71.62min$ 1/K0=1.159$ #24879-24880,0,TP9272RJB_Slot1-04_1_9370_DA5.3.556_1.mgf,2147.92014993,2144.91423000,4295.96000000,2,DFDIEGCPVPGPADCPANSK,DFDIEGCPVPGPADCPANSK,7|[4]carbamidomethyl[C]|15|[4]carbamidomethyl[C],7|57.02146400|15|57.02146400,4295.27000000,,T,1.62269000,0.00000224,0.00002292,XTH7_ARATH((225-245))((Q8LER3)) +7_99909_1,Cmpd 100007$ +MS2(1203.0697)$ 40.3eV$ 68.96min$ 1/K0=1.240$ #23953-23956,0,TP9268RJB_Slot1-05_1_9365_DA5.3.556_1.mgf,2404.12374993,2404.09890000,4137.12000000,2,FEDNFDATSNINVMVTPTDKK,FEDNFDATSNINVMVTPTDKK,14|[35]oxidation[M]|10|[999934]Deamidated_18O(1)[N],14|15.99491500|10|2.98826100,4137.12000000,[999934]Deamidated_18O(1)[N],T,-0.58314200,0.09412800,0.73879400,PSBP1_ARATH((126-147))((Q42029)) +0_100019_4,Cmpd 100007$ +MS2(426.9041)$ 23.5eV$ 64.06+-0.01min$ 1/K0=0.710$ #22241-22249,0,TP9248RJB_Slot1-08_1_9345_DA5.3.556_1.mgf,1277.68882490,1277.67677000,3843.45000000,3,KFGVNEFVNPK,KFGVNEFVNPK,,0|,3843.45000000,,T,1.14042000,0.00003238,0.00030613,ADHX_ARATH((237-248))((Q96533)) +3_99933_4,Cmpd 100007$ +MS2(434.4826)$ 25.0eV$ 70.40min$ 1/K0=0.760$ #24456-24457,0,TP9260RJB_Slot1-06_1_9357_DA5.3.556_1.mgf,1733.89901986,1733.92559000,4223.68000000,4,KIINRGIDPTSHR,KIINRGIDPTSHR,0|[3]Biotin[N-TERM],0|226.07759800,4223.68000000,[3]Biotin[N-TERM],T,-1.24677000,0.28389700,0.94716100,MYB4_ARATH((115-128))((Q9SZP1)) +13_100074_3,Cmpd 100007$ +MS2(507.2697)$ 28.2eV$ 66.19+-0.01min$ 1/K0=0.862$ #22983-22987,0,TP9280RJB_Slot1-03_1_9378_DA5.3.556_1.mgf,1518.78556490,1518.78556000,3970.99000000,3,AEEIISEIESSIPR,AEEIISEIESSIPR,9|unknown modification,0|,3970.99000000,,T,-1.10334000,0.24945000,0.94323400,SDI1_ARATH((243-257))((Q8GXU5)) +19_100004_1,Cmpd 100007$ +MS2(514.0100)$ 26.9eV$ 68.91min$ 1/K0=0.818$ #23930-23932,0,TP9292RJB_Slot1-01_1_9390_DA5.3.556_1.mgf,2052.00881986,2052.00844000,4134.37000000,4,KEDIPKYEENIEISMAK,KEDIPKYEENIEISMAK,15|[35]oxidation[M],15|15.99491500,4134.37000000,,T,0.01962380,0.00903391,0.15245800,ATP7_ARATH((184-201))((Q9SJ12)) +1_99910_4,Cmpd 100007$ +MS2(545.9196)$ 26.7eV$ 63.32+-0.01min$ 1/K0=0.813$ #21984-21989,0,TP9250RJB_Slot1-08_1_9347_DA5.3.556_1.mgf,1634.73532489,1633.73066000,3798.55000000,3,WFHCSTPGDSITAR,WFHCSTPGDSITAR,4|[4]carbamidomethyl[C],4|57.02146400,3771.89000000,,T,1.88984000,0.00000224,0.00000525,JAL29_ARATH((455-469))((O04316))||JAL28_ARATH((306-320))((Q9SDM9)) +15_100110_8,Cmpd 100007$ +MS2(582.8171)$ 28.6eV$ 70.47+-0.01min$ 1/K0=0.873$ #24473-24477,0,TP9284RJB_Slot1-02_1_9382_DA5.3.556_1.mgf,1163.61860993,1163.62261000,4227.41000000,2,FVTSPEFPIK,FVTSPEFPIK,,0|,4240.40000000,,T,1.22579000,0.00001703,0.00019584,GLYP3_ARATH((498-508))((Q94JQ3)) +2_99920_4,Cmpd 100007$ +MS2(622.9470)$ 27.4eV$ 63.08min$ 1/K0=0.835$ #21901-21903,0,TP9252RJB_Slot1-08_1_9349_DA5.3.556_1.mgf,1865.81740489,1865.83319000,3783.87000000,3,YHSNADIYESPAASWR,YHSNADIYESPAASWR,,0|,3783.87000000,,T,1.73551000,0.00000224,0.00001231,GSL_ARATH((131-147))((Q9SKK4)) +4_99923_3,Cmpd 100007$ +MS2(667.9902)$ 28.1eV$ 70.45min$ 1/K0=0.857$ #24473-24476,0,TP9262RJB_Slot1-06_1_9359_DA5.3.556_1.mgf,2000.94703490,2000.98388000,4226.61000000,3,SEVDDIIRIEKGENPSR,SEVDDIIRIEKGENPSR,10|[299]Carboxy[E],10|43.98982900,4226.61000000,[299]Carboxy[E],T,-0.79599900,0.15146100,0.85284800,SPT61_ARATH((1336-1353))((A8MS85)) +11_99921_4,Cmpd 100007$ +MS2(700.6969)$ 31.2eV$ 70.73min$ 1/K0=0.955$ #24567-24569,0,TP9276RJB_Slot1-04_1_9374_DA5.3.556_1.mgf,2099.06734490,2100.03472000,4243.46000000,3,ANPNADASAQQAFVTNVINR,ANPNADASAQQAFVTNVINR,,0|,4409.52000000,,T,1.21660000,0.00001703,0.00020556,ESM1_ARATH((170-190))((Q9LJG3)) +8_99994_6,Cmpd 100007$ +MS2(710.2770)$ 31.1eV$ 68.18min$ 1/K0=0.952$ #23684-23685,0,TP9270RJB_Slot1-05_1_9367_DA5.3.556_1.mgf,1418.53840993,1418.53840000,4089.42000000,2,MTASGGGSTAATGRMPTWK,MTASGGGSTAATGRMPTWK,15|[35]oxidation[M]|1|unknown modification,15|15.99491500,2597.01000000,,T,-1.73749000,0.33677000,0.98998500,BEH1_ARATH((1-20))((Q9S7F3)) +17_99927_2,Cmpd 100007$ +MS2(752.4003)$ 33.8eV$ 70.19min$ 1/K0=1.037$ #24370-24371,0,TP9288RJB_Slot1-02_1_9386_DA5.3.556_1.mgf,1502.78490993,1502.78406000,4210.72000000,2,NGIPISTAAAANFTR,NGIPISTAAAANFTR,,0|,4702.90000000,,T,1.71343000,0.00000224,0.00001391,PSB2B_ARATH((71-86))((O24633)) +14_99936_3,Cmpd 100007$ +MS2(806.4102)$ 35.1eV$ 67.28min$ 1/K0=1.076$ #23360,0,TP9282RJB_Slot1-03_1_9380_DA5.3.556_1.mgf,1610.80476993,1610.80857000,4035.50000000,2,GIDQGIIGGEGVPPMR,GIDQGIIGGEGVPPMR,15|[35]oxidation[M],15|15.99491500,3987.79000000,,T,0.91728900,0.00011338,0.00095187,PNSL4_ARATH((151-167))((Q9SCY3)) +9_99926_1,Cmpd 100008$ +MS2(1017.4406)$ 37.2eV$ 71.62min$ 1/K0=1.142$ #24879-24880,0,TP9272RJB_Slot1-04_1_9370_DA5.3.556_1.mgf,2032.86556993,2032.84681000,4295.96000000,2,CVVAYSNIMDMYGKTR,CVVAYSNIMDMYGKTR,11|[35]oxidation[M]|5|[2007]Methamidophos-S[Y]|1|[4]carbamidomethyl[C],11|15.99491500|5|108.97512100|1|57.02146400,4295.96000000,[2007]Methamidophos-S[Y],T,-1.13660000,0.25856500,0.94423800,PP379_ARATH((422-438))((Q66GP4)) +10_99967_4,Cmpd 100008$ +MS2(1056.9964)$ 39.2eV$ 70.73min$ 1/K0=1.203$ #24566-24568,0,TP9274RJB_Slot1-04_1_9372_DA5.3.556_1.mgf,2111.97706993,2111.97903000,4243.07000000,2,EGAIVSASDISAAMVAEAEMK,EGAIVSASDISAAMVAEAEMK,20|[35]oxidation[M]|11|[35]Oxidation[S],20|15.99491500|11|15.99491500,4243.07000000,[35]Oxidation[S],T,1.95273000,0.00000224,0.00000371,CHLM_ARATH((165-186))((Q9SW18)) +13_100078_3,Cmpd 100008$ +MS2(1069.4902)$ 38.5eV$ 66.20+-0.01min$ 1/K0=1.182$ #22984-22990,0,TP9280RJB_Slot1-03_1_9378_DA5.3.556_1.mgf,2136.96472993,2136.94552000,3971.25000000,2,NAQICVIAEDCNQPDYVK,NAQICVIAEDCNQPDYVK,3|[7]Deamidated[Q]|5|[4]carbamidomethyl[C]|11|[4]carbamidomethyl[C],3|0.98401600|5|57.02146400|11|57.02146400,3971.25000000,[7]Deamidated[Q],T,0.78423800,0.00019620,0.00188237,RS122_ARATH((59-77))((Q9SKZ3)) +14_99989_4,Cmpd 100008$ +MS2(1131.0510)$ 40.4eV$ 67.28min$ 1/K0=1.241$ #23361,0,TP9282RJB_Slot1-03_1_9380_DA5.3.556_1.mgf,2260.08628993,2260.05054000,4035.59000000,2,AIADNVNVISMSIGGGMSDYYR,AIADNVNVISMSIGGGMSDYYR,17|[35]oxidation[M]|11|[766]Met-loss+Acetyl[M],17|15.99491500|11|-89.02992000,4035.59000000,[766]Met-loss+Acetyl[M],T,-1.25945000,0.28637100,0.94878200,SBT17_ARATH((270-292))((O65351)) +7_99914_1,Cmpd 100008$ +MS2(1359.5901)$ 39.8eV$ 68.96+-0.01min$ 1/K0=1.222$ #23953-23957,0,TP9268RJB_Slot1-05_1_9365_DA5.3.556_1.mgf,2717.16450993,2717.16450000,4137.20000000,2,KNEGASDNFIEETGWRIIDEFEK,KNEGASDNFIEETGWRIIDEFEK,2|unknown modification,0|,4137.20000000,,D,-2.31144000,0.35113300,1.00000000,decoy_CHR4_ARATH((1042-1065))((F4KBP5)) +5_99946_8,Cmpd 100008$ +MS2(357.5462)$ 24.0eV$ 69.37min$ 1/K0=0.726$ #24096,0,TP9264RJB_Slot1-06_1_9361_DA5.3.556_1.mgf,1069.61503490,1069.61503000,4160.85000000,3,RIEQFYQEWK,RIEQFYQEWK,5|unknown modification,0|,4160.85000000,,D,-1.86703000,0.34223100,0.99086100,decoy_FH21A_ARATH((166-176))((P0C5K4)) +15_99941_3,Cmpd 100008$ +MS2(376.4669)$ 25.7eV$ 70.47+-0.01min$ 1/K0=0.781$ #24473-24478,0,TP9284RJB_Slot1-02_1_9382_DA5.3.556_1.mgf,750.91822993,750.91822000,4227.50000000,2,PIIGCTIKPK,PIIGCTIKPK,3|unknown modification|5|[4]carbamidomethyl[C],5|57.02146400,3665.59000000,,T,-0.61376900,0.10153700,0.75556200,RBL_ARATH((168-178))((O03042)) +4_99913_4,Cmpd 100008$ +MS2(493.3088)$ 27.3eV$ 70.45min$ 1/K0=0.833$ #24473-24475,0,TP9262RJB_Slot1-06_1_9359_DA5.3.556_1.mgf,984.60192993,984.59674000,4226.52000000,2,IDIVTGIVR,IDIVTGIVR,,0|,4226.52000000,,T,0.71457500,0.00027313,0.00271998,CCD4_ARATH((446-455))((O49675)) +1_99920_2,Cmpd 100008$ +MS2(542.9277)$ 26.2eV$ 63.32+-0.01min$ 1/K0=0.798$ #21984-21989,0,TP9250RJB_Slot1-08_1_9347_DA5.3.556_1.mgf,1625.75950489,1625.76197000,3798.55000000,3,NIHFAPGPESIECR,NIHFAPGPESIECR,13|[4]carbamidomethyl[C],13|57.02146400,3798.55000000,,T,2.00434000,0.00000224,0.00000278,NUD23_ARATH((205-219))((P93740)) +11_99925_2,Cmpd 100008$ +MS2(643.7842)$ 30.6eV$ 70.74min$ 1/K0=0.935$ #24567-24570,0,TP9276RJB_Slot1-04_1_9374_DA5.3.556_1.mgf,1285.55280993,1288.60874000,4243.54000000,2,ASFAGDINFYGK,ASFAGDINFYGK,,0|,4246.92000000,,T,2.19900000,0.00000224,0.00000095,MMSA_ARATH((563-575))((Q0WM29)) +17_99936_4,Cmpd 100008$ +MS2(714.3332)$ 33.2eV$ 70.19min$ 1/K0=1.018$ #24370-24371,0,TP9288RJB_Slot1-02_1_9386_DA5.3.556_1.mgf,1426.65074993,1426.63290000,4210.72000000,2,MDTASMIDEAIR,MDTASMIDEAIR,6|[35]oxidation[M]|8|[4]Carbamidomethyl[D],6|15.99491500|8|57.02146400,4210.72000000,[4]Carbamidomethyl[D],T,-1.08963000,0.24555800,0.94207800,IND_ARATH((151-163))((O81313))||HEC3_ARATH((158-170))((Q9LXD8)) +2_99958_4,Cmpd 100008$ +MS2(906.9490)$ 35.7eV$ 63.08min$ 1/K0=1.096$ #21902-21903,0,TP9252RJB_Slot1-08_1_9349_DA5.3.556_1.mgf,1811.88236993,1809.87438000,3783.87000000,2,GITINTATVEYETENR,GITINTATVEYETENR,,0|,3810.52000000,,T,2.49694000,0.00000224,0.00000018,EFTU_ARATH((127-143))((P17745)) +16_99997_5,Cmpd 100008$ +MS2(955.4494)$ 37.0eV$ 71.12+-0.01min$ 1/K0=1.135$ #24696-24701,0,TP9286RJB_Slot1-02_1_9384_DA5.3.556_1.mgf,1908.88320993,1908.92014000,4266.75000000,2,QMTYIKIDSPVK,QMTYIKIDSPVK,9|[9999299]Hex(3)[S],9|486.15847100,4266.75000000,[9999299]Hex(3)[S],T,-0.95356100,0.20262000,0.90383200,NP214_ARATH((919-931))((F4I1T7)) +18_100047_2,Cmpd 100008$ +MS2(987.0113)$ 38.0eV$ 69.23min$ 1/K0=1.168$ #24036-24039,0,TP9290RJB_Slot1-01_1_9388_DA5.3.556_1.mgf,1972.00700993,1967.99114000,4153.45000000,2,AIVNSDIGVTPNNDGDVIR,AIVNSDIGVTPNNDGDVIR,,0|,4146.44000000,,T,1.81349000,0.00000224,0.00000800,RRFC_ARATH((171-190))((Q9M1X0)) +19_100074_4,Cmpd 100009$ +MS2(1062.4938)$ 39.9eV$ 68.92+-0.01min$ 1/K0=1.226$ #23931-23936,0,TP9292RJB_Slot1-01_1_9390_DA5.3.556_1.mgf,2122.97186993,2123.96803000,4134.71000000,2,NIVDIDVDNAFECGDTISK,NIVDIDVDNAFECGDTISK,13|[4]carbamidomethyl[C],13|57.02146400,4134.71000000,,T,-0.27656600,0.03479330,0.47521300,ELC_ARATH((308-327))((Q9LHG8)) +8_100052_1,Cmpd 100009$ +MS2(1127.0237)$ 39.7eV$ 68.19+-0.01min$ 1/K0=1.219$ #23686-23695,0,TP9270RJB_Slot1-05_1_9367_DA5.3.556_1.mgf,2252.03166993,2252.00758000,4091.23000000,2,SSESEIPPISSSTAAAEESGEK,SSESEIPPISSSTAAAEESGEK,0|[6]Carboxymethyl[N-TERM],0|58.00547900,4091.23000000,[6]Carboxymethyl[N-TERM],T,0.57387200,0.00053353,0.00590183,SYDC2_ARATH((2-24))((Q9M084)) +0_100030_3,Cmpd 100009$ +MS2(1153.5140)$ 39.7eV$ 64.06min$ 1/K0=1.220$ #22242,0,TP9248RJB_Slot1-08_1_9345_DA5.3.556_1.mgf,2305.01232993,2305.03728000,3842.84000000,2,ESSRNMSTKFTISSIFGDK,ESSRNMSTKFTISSIFGDK,6|[35]oxidation[M]|7|[419]Glycerophospho[S],6|15.99491500|7|154.00311000,3842.84000000,[419]Glycerophospho[S],D,-1.14570000,0.26098800,0.94423800,decoy_JAL45_ARATH((175-194))((Q9FNM2)) +15_100117_3,Cmpd 100009$ +MS2(418.9245)$ 25.2eV$ 70.47+-0.01min$ 1/K0=0.765$ #24473-24478,0,TP9284RJB_Slot1-02_1_9382_DA5.3.556_1.mgf,1253.74999490,1253.73831000,4227.50000000,3,VPIPIDTPFKK,VPIPIDTPFKK,,0|,4223.69000000,,T,1.50824000,0.00000412,0.00004290,SBT41_ARATH((664-675))((F4IG09)) +1_99906_9,Cmpd 100009$ +MS2(432.7076)$ 25.2eV$ 63.32+-0.01min$ 1/K0=0.765$ #21984-21988,0,TP9250RJB_Slot1-08_1_9347_DA5.3.556_1.mgf,863.39964993,863.39964000,3798.46000000,2,EGFSVMAPNER,EGFSVMAPNER,1|unknown modification,0|,3798.46000000,,D,-1.71898000,0.33572300,0.98998500,decoy_HSP7Q_ARATH((722-733))((Q9SAB1)) From 979a7ab40f58f0cddbd6fc87e649e577f35d0ea4 Mon Sep 17 00:00:00 2001 From: ArthurDeclercq Date: Fri, 2 Dec 2022 10:44:43 +0100 Subject: [PATCH 02/13] remove try except PSM function --- psm_utils/io/ionbot.py | 55 +++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/psm_utils/io/ionbot.py b/psm_utils/io/ionbot.py index 6de4936..27ad50b 100644 --- a/psm_utils/io/ionbot.py +++ b/psm_utils/io/ionbot.py @@ -63,36 +63,31 @@ def read_file(self) -> PSMList: def _get_peptide_spectrum_match(self, psm_dict: dict[str, str | float]) -> PSM: - try: - psm = PSM( - peptidoform=self._parse_peptidoform( - psm_dict["database_peptide"], - psm_dict["modifications"], - psm_dict["charge"], - ), - spectrum_id=psm_dict["spectrum_title"], - run=psm_dict["spectrum_file"], - is_decoy=psm_dict["database"] == "D", - score=float(psm_dict["psm_score"]), - # precursor_mz=float(psm_dict["m/z"]), - retention_time=float(psm_dict["observed_retention_time"]), - protein_list=psm_dict["proteins"].split( - "|" - ), # what is the ionbot separator? - source="Ionbot", - qvalue=float(psm_dict["q-value"]), - pep=float(psm_dict["PEP"]), - provenance_data=({"Ionbot_filename": str(self.filename)}), - metadata={ - col: str(psm_dict[col]) - for col in psm_dict.keys() - if col not in REQUIRED_COLUMNS - }, - ) - except KeyError: # keyerror in proforma.parse with Delta:H(2)C(3)O(1) as mod - return None - - return psm + return PSM( + peptidoform=self._parse_peptidoform( + psm_dict["database_peptide"], + psm_dict["modifications"], + psm_dict["charge"], + ), + spectrum_id=psm_dict["spectrum_title"], + run=psm_dict["spectrum_file"], + is_decoy=psm_dict["database"] == "D", + score=float(psm_dict["psm_score"]), + # precursor_mz=float(psm_dict["m/z"]), + retention_time=float(psm_dict["observed_retention_time"]), + protein_list=psm_dict["proteins"].split( + "|" + ), # what is the ionbot separator? + source="Ionbot", + qvalue=float(psm_dict["q-value"]), + pep=float(psm_dict["PEP"]), + provenance_data=({"Ionbot_filename": str(self.filename)}), + metadata={ + col: str(psm_dict[col]) + for col in psm_dict.keys() + if col not in REQUIRED_COLUMNS + }, + ) @staticmethod def _parse_peptidoform(peptide, modifications, charge): From 9b4b85d116cfe9de156a6b4e3847a35f82649dfe Mon Sep 17 00:00:00 2001 From: ArthurDeclercq Date: Tue, 6 Dec 2022 16:05:16 +0100 Subject: [PATCH 03/13] change ionbot prot separator --- psm_utils/io/ionbot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/psm_utils/io/ionbot.py b/psm_utils/io/ionbot.py index 27ad50b..12bd74a 100644 --- a/psm_utils/io/ionbot.py +++ b/psm_utils/io/ionbot.py @@ -76,7 +76,7 @@ def _get_peptide_spectrum_match(self, psm_dict: dict[str, str | float]) -> PSM: # precursor_mz=float(psm_dict["m/z"]), retention_time=float(psm_dict["observed_retention_time"]), protein_list=psm_dict["proteins"].split( - "|" + "||" ), # what is the ionbot separator? source="Ionbot", qvalue=float(psm_dict["q-value"]), From ab0b356a1b0ead351534d626d6224a8a69c21605 Mon Sep 17 00:00:00 2001 From: ArthurDeclercq Date: Mon, 21 Aug 2023 13:20:08 +0200 Subject: [PATCH 04/13] added ionbot to __init__.py --- psm_utils/io/__init__.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/psm_utils/io/__init__.py b/psm_utils/io/__init__.py index 0d27a5c..b69a4bb 100644 --- a/psm_utils/io/__init__.py +++ b/psm_utils/io/__init__.py @@ -17,6 +17,7 @@ import psm_utils.io.tsv as tsv import psm_utils.io.xtandem as xtandem import psm_utils.io.sage as sage +import psm_utils.io.ionbot as ionbot from psm_utils.io._base_classes import WriterBase from psm_utils.io.exceptions import PSMUtilsIOException from psm_utils.psm import PSM @@ -77,6 +78,12 @@ "extension": ".tsv", "filename_pattern": r"^.*(?:_|\.).sage.tsv$", }, + "ionbot":{ + "reader": ionbot.IonbotReader, + "writer": None, + "extension": "ionbot.first.csv", + "filename_pattern": r"^ionbot.first.csv$" + }, } READERS = {k: v["reader"] for k, v in FILETYPES.items() if v["reader"]} WRITERS = {k: v["writer"] for k, v in FILETYPES.items() if v["writer"]} From 4af231432886e43bc38a9a61c2c0c513806e1dc2 Mon Sep 17 00:00:00 2001 From: ArthurDeclercq Date: Wed, 13 Sep 2023 12:56:22 +0200 Subject: [PATCH 05/13] ionmobility parsing from mzid --- psm_utils/io/mzid.py | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/psm_utils/io/mzid.py b/psm_utils/io/mzid.py index 8c37657..ff23707 100644 --- a/psm_utils/io/mzid.py +++ b/psm_utils/io/mzid.py @@ -133,6 +133,7 @@ def __init__(self, filename: str | Path, *args, **kwargs) -> None: self._spectrum_rt_key = None self._qvalue_key = None self._pep_key = None + self._im_key = None self._source = self._infer_source() @@ -140,15 +141,11 @@ def __iter__(self): """Iterate over file and return PSMs one-by-one.""" with mzid.read(str(self.filename)) as reader: for spectrum in reader: - # Check if RT is encoded in spectrum metadata - if "retention time" in spectrum: - self._spectrum_rt_key = "retention time" - elif "scan start time" in spectrum: - self._spectrum_rt_key = "scan start time" - else: - self._spectrum_rt_key = None - # Parse PSM non-metadata keys, rt key, and score key + # Parse PSM non-metadata keys, rt key, ion and score key + self._get_non_metadata_keys(spectrum.keys()) # check in both levels of mzid self._get_non_metadata_keys(spectrum["SpectrumIdentificationItem"][0].keys()) + if not self._score_key: + raise UnknownMzidScore("No known score metric found in mzIdentML file.") break for spectrum in reader: @@ -159,11 +156,11 @@ def __iter__(self): ) run = Path(spectrum["location"]).stem if "location" in spectrum else None rt = float(spectrum[self._spectrum_rt_key]) if self._spectrum_rt_key else None - + ionmobility = float(spectrum[self._im_key]) if self._im_key else None # Parse PSMs from spectrum for entry in spectrum["SpectrumIdentificationItem"]: yield self._get_peptide_spectrum_match( - spectrum_id, spectrum_title, run, rt, entry + spectrum_id, spectrum_title, run, rt, ionmobility, entry ) def read_file(self) -> PSMList: @@ -232,6 +229,7 @@ def _get_peptide_spectrum_match( spectrum_title: Union[str, None], run: Union[str, None], rt: Union[float, None], + ionmobility: Union[float, None], spectrum_identification_item: dict[str, str | float | list], ) -> PSM: """Parse single mzid entry to :py:class:`~psm_utils.peptidoform.Peptidoform`.""" @@ -250,7 +248,7 @@ def _get_peptide_spectrum_match( precursor_mz = None # Override spectrum-level RT if present at PSM level - if self._rt_key: + if self._rt_key in sii.keys(): rt = float(sii[self._rt_key]) metadata = {col: str(sii[col]) for col in sii.keys() if col not in self._non_metadata_keys} @@ -272,6 +270,7 @@ def _get_peptide_spectrum_match( pep=sii[self._pep_key] if self._pep_key else None, precursor_mz=precursor_mz, retention_time=rt, + ion_mobility=ionmobility, protein_list=protein_list, rank=sii["rank"] if "rank" in sii else None, source=self._source, @@ -293,7 +292,8 @@ def _get_non_metadata_keys(self, keys: list): ] # Get the score key and add to default keys self._score_key = self._infer_score_name(keys) - default_keys.append(self._score_key) + if self._score_key: + default_keys.append(self._score_key) # Get the q-value key and add to default keys self._qvalue_key = self._infer_qvalue_name(keys) @@ -312,6 +312,13 @@ def _get_non_metadata_keys(self, keys: list): default_keys.append(rt_key) break + # Get ion mobility key + for im_key in ["inverse reduced ion mobility"]: + if im_key in keys: + self._im_key = im_key + default_keys.append(im_key) + break + # Keys that are not necessary for metadata self._non_metadata_keys = ["ContactRole", "passThreshold"] self._non_metadata_keys.extend(default_keys) @@ -323,8 +330,6 @@ def _infer_score_name(keys) -> str: for score in STANDARD_SEARCHENGINE_SCORES: if score in keys: return score - else: - raise UnknownMzidScore("No known score metric found in mzIdentML file.") @staticmethod def _infer_qvalue_name(keys) -> Union[str, None]: From 4544ef4d322a081bafad002d8d8c60b28c019e06 Mon Sep 17 00:00:00 2001 From: ArthurDeclercq Date: Wed, 13 Sep 2023 14:29:25 +0200 Subject: [PATCH 06/13] retract spectrum rt keys changes --- psm_utils/io/mzid.py | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/psm_utils/io/mzid.py b/psm_utils/io/mzid.py index ff23707..4f71e86 100644 --- a/psm_utils/io/mzid.py +++ b/psm_utils/io/mzid.py @@ -127,7 +127,7 @@ def __init__(self, filename: str | Path, *args, **kwargs) -> None: """ super().__init__(filename, *args, **kwargs) - self._non_metadata_keys = None + self._non_metadata_keys = ["ContactRole", "passThreshold"] self._score_key = None self._rt_key = None self._spectrum_rt_key = None @@ -140,13 +140,10 @@ def __init__(self, filename: str | Path, *args, **kwargs) -> None: def __iter__(self): """Iterate over file and return PSMs one-by-one.""" with mzid.read(str(self.filename)) as reader: - for spectrum in reader: - # Parse PSM non-metadata keys, rt key, ion and score key - self._get_non_metadata_keys(spectrum.keys()) # check in both levels of mzid - self._get_non_metadata_keys(spectrum["SpectrumIdentificationItem"][0].keys()) - if not self._score_key: - raise UnknownMzidScore("No known score metric found in mzIdentML file.") - break + # Parse spectrum metadata + self._get_toplevel_non_metadata_keys(reader[0].keys()) + # Parse PSM non-metadata keys, rt key, ion and score key + self._get_non_metadata_keys(reader[0]["SpectrumIdentificationItem"][0].keys()) for spectrum in reader: # Parse spectrum metadata @@ -162,6 +159,7 @@ def __iter__(self): yield self._get_peptide_spectrum_match( spectrum_id, spectrum_title, run, rt, ionmobility, entry ) + break def read_file(self) -> PSMList: """Read full mzid file to PSM list object.""" @@ -294,6 +292,8 @@ def _get_non_metadata_keys(self, keys: list): self._score_key = self._infer_score_name(keys) if self._score_key: default_keys.append(self._score_key) + else: + raise UnknownMzidScore("No known score metric found in mzIdentML file.") # Get the q-value key and add to default keys self._qvalue_key = self._infer_qvalue_name(keys) @@ -312,16 +312,22 @@ def _get_non_metadata_keys(self, keys: list): default_keys.append(rt_key) break - # Get ion mobility key + # Keys that are not necessary for metadata + self._non_metadata_keys.extend(default_keys) + + def _get_toplevel_non_metadata_keys(self, keys: list): + # Check if RT is encoded in spectrum metadata + for key in ["retention time", "scan start time"]: + if key in keys: + self._spectrum_rt_key = key + break + + # Check if ion mobility is encoded in spectrum metadata for im_key in ["inverse reduced ion mobility"]: if im_key in keys: self._im_key = im_key - default_keys.append(im_key) break - - # Keys that are not necessary for metadata - self._non_metadata_keys = ["ContactRole", "passThreshold"] - self._non_metadata_keys.extend(default_keys) + self._non_metadata_keys.extend([self._im_key, self._spectrum_rt_key]) @staticmethod def _infer_score_name(keys) -> str: From d45f3496dcfff0d5a6f491b2745d4a0ae58345d4 Mon Sep 17 00:00:00 2001 From: ArthurDeclercq Date: Wed, 13 Sep 2023 14:31:15 +0200 Subject: [PATCH 07/13] removed the break ... --- psm_utils/io/mzid.py | 1 - 1 file changed, 1 deletion(-) diff --git a/psm_utils/io/mzid.py b/psm_utils/io/mzid.py index 4f71e86..691b7ff 100644 --- a/psm_utils/io/mzid.py +++ b/psm_utils/io/mzid.py @@ -159,7 +159,6 @@ def __iter__(self): yield self._get_peptide_spectrum_match( spectrum_id, spectrum_title, run, rt, ionmobility, entry ) - break def read_file(self) -> PSMList: """Read full mzid file to PSM list object.""" From 6e2012a4d2d135fce409e89bcd52e86d1c8ad4fd Mon Sep 17 00:00:00 2001 From: ArthurDeclercq Date: Fri, 15 Sep 2023 14:12:48 +0200 Subject: [PATCH 08/13] requested changes --- docs/source/api/psm_utils.io.rst | 7 +++ psm_utils/io/ionbot.py | 74 ++++++++++++++++++-------------- psm_utils/io/mzid.py | 14 +++--- 3 files changed, 58 insertions(+), 37 deletions(-) diff --git a/docs/source/api/psm_utils.io.rst b/docs/source/api/psm_utils.io.rst index 3f4956d..c1efd93 100644 --- a/docs/source/api/psm_utils.io.rst +++ b/docs/source/api/psm_utils.io.rst @@ -84,3 +84,10 @@ psm_utils.io.xtandem .. automodule:: psm_utils.io.xtandem :members: :inherited-members: + +psm_utils.io.ionbot +########################## + +.. automodule:: psm_utils.io.ionbot + :members: + :inherited-members: \ No newline at end of file diff --git a/psm_utils/io/ionbot.py b/psm_utils/io/ionbot.py index 12bd74a..954e582 100644 --- a/psm_utils/io/ionbot.py +++ b/psm_utils/io/ionbot.py @@ -40,7 +40,33 @@ def __init__( *args, **kwargs, ) -> None: + """ + Reader for ionbot PSM files. + Parameters + ---------- + filename: str, pathlib.Path + Path to PSM file. + + Examples + -------- + + IonbotReader supports iteration: + + >>> from psm_utils.io.ionbot import IonbotReader + >>> for psm in IonbotReader("peptides_1_1_0.mzid"): + ... print(psm.peptidoform.proforma) + ACDEK + AC[Carbamidomethyl]DEFGR + [Acetyl]-AC[Carbamidomethyl]DEFGHIK + + Or a full file can be read at once into a :py:class:`psm_utils.psm_list.PSMList` + object: + + >>> ionbot_reader = IonbotReader("peptides_1_1_0.mzid") + >>> psm_list = ionbot_reader.read_file() + + """ super().__init__(filename, *args, **kwargs) self.filename = filename @@ -53,39 +79,33 @@ def __iter__(self) -> Iterable[PSM]: yield psm def read_file(self) -> PSMList: - """Read full Peptide Record PSM file into a PSMList object.""" - psm_list = [] - with open(self.filename) as ionbot_in: - reader = csv.DictReader(ionbot_in, delimiter=",") - for row in reader: - psm_list.append(self._get_peptide_spectrum_match(row)) - return PSMList(psm_list=psm_list) + """Read full mzid file to PSM list object.""" + return PSMList(psm_list=[psm for psm in self]) def _get_peptide_spectrum_match(self, psm_dict: dict[str, str | float]) -> PSM: - return PSM( peptidoform=self._parse_peptidoform( - psm_dict["database_peptide"], + psm_dict["matched_peptide"], psm_dict["modifications"], psm_dict["charge"], ), spectrum_id=psm_dict["spectrum_title"], run=psm_dict["spectrum_file"], - is_decoy=psm_dict["database"] == "D", + is_decoy=True + if psm_dict["database"] == "D" + else False + if psm_dict["database"] == "T" + else None, score=float(psm_dict["psm_score"]), - # precursor_mz=float(psm_dict["m/z"]), + precursor_mz=float(psm_dict["m/z"]), retention_time=float(psm_dict["observed_retention_time"]), - protein_list=psm_dict["proteins"].split( - "||" - ), # what is the ionbot separator? - source="Ionbot", + protein_list=psm_dict["proteins"].split("||"), + source="ionbot", qvalue=float(psm_dict["q-value"]), pep=float(psm_dict["PEP"]), - provenance_data=({"Ionbot_filename": str(self.filename)}), + provenance_data=({"ionbot_filename": str(self.filename)}), metadata={ - col: str(psm_dict[col]) - for col in psm_dict.keys() - if col not in REQUIRED_COLUMNS + col: str(psm_dict[col]) for col in psm_dict.keys() if col not in REQUIRED_COLUMNS }, ) @@ -94,14 +114,10 @@ def _parse_peptidoform(peptide, modifications, charge): peptide = peptide = [""] + list(peptide) + [""] pattern = re.compile(r"^(?P\[\S*?\])?(?P.*?)(?P\[\S*?\])?$") - for position, label in zip( - modifications.split("|")[::2], modifications.split("|")[1::2] - ): + for position, label in zip(modifications.split("|")[::2], modifications.split("|")[1::2]): mod_match = pattern.search(label) - if mod_match.group("U"): parsed_label = "U:" + mod_match.group("U")[1:-1] - else: parsed_label = mod_match.group("mod") @@ -120,16 +136,10 @@ def _parse_peptidoform(peptide, modifications, charge): if charge: proforma_seq += f"/{charge}" - return proforma_seq - - -class InvalidPeprecError(PSMUtilsIOException): - """Invalid Peptide Record file.""" - - pass + return Peptidoform(proforma_seq) -class InvalidIonbotModificationError(InvalidPeprecError): +class InvalidIonbotModificationError(PSMUtilsIOException): """Invalid Peptide Record modification.""" pass diff --git a/psm_utils/io/mzid.py b/psm_utils/io/mzid.py index 691b7ff..fc34634 100644 --- a/psm_utils/io/mzid.py +++ b/psm_utils/io/mzid.py @@ -142,7 +142,7 @@ def __iter__(self): with mzid.read(str(self.filename)) as reader: # Parse spectrum metadata self._get_toplevel_non_metadata_keys(reader[0].keys()) - # Parse PSM non-metadata keys, rt key, ion and score key + # Parse PSM non-metadata keys, rt key and score key self._get_non_metadata_keys(reader[0]["SpectrumIdentificationItem"][0].keys()) for spectrum in reader: @@ -153,6 +153,7 @@ def __iter__(self): ) run = Path(spectrum["location"]).stem if "location" in spectrum else None rt = float(spectrum[self._spectrum_rt_key]) if self._spectrum_rt_key else None + ionmobility = float(spectrum[self._im_key]) if self._im_key else None # Parse PSMs from spectrum for entry in spectrum["SpectrumIdentificationItem"]: @@ -245,7 +246,7 @@ def _get_peptide_spectrum_match( precursor_mz = None # Override spectrum-level RT if present at PSM level - if self._rt_key in sii.keys(): + if self._rt_key: rt = float(sii[self._rt_key]) metadata = {col: str(sii[col]) for col in sii.keys() if col not in self._non_metadata_keys} @@ -262,7 +263,7 @@ def _get_peptide_spectrum_match( spectrum_id=psm_spectrum_id, run=run, is_decoy=is_decoy, - score=sii[self._score_key], + score=sii[self._score_key] if self._score_key else None, qvalue=sii[self._qvalue_key] if self._qvalue_key else None, pep=sii[self._pep_key] if self._pep_key else None, precursor_mz=precursor_mz, @@ -292,7 +293,9 @@ def _get_non_metadata_keys(self, keys: list): if self._score_key: default_keys.append(self._score_key) else: - raise UnknownMzidScore("No known score metric found in mzIdentML file.") + logger.warning( + "No known score metric found in mzIdentML file. Scores will be set to None." + ) # Get the q-value key and add to default keys self._qvalue_key = self._infer_qvalue_name(keys) @@ -319,14 +322,15 @@ def _get_toplevel_non_metadata_keys(self, keys: list): for key in ["retention time", "scan start time"]: if key in keys: self._spectrum_rt_key = key + self._non_metadata_keys.append(key) break # Check if ion mobility is encoded in spectrum metadata for im_key in ["inverse reduced ion mobility"]: if im_key in keys: self._im_key = im_key + self._non_metadata_keys.append(im_key) break - self._non_metadata_keys.extend([self._im_key, self._spectrum_rt_key]) @staticmethod def _infer_score_name(keys) -> str: From 93773cc850186d040b14e572244e096ac0decbeb Mon Sep 17 00:00:00 2001 From: RalfG Date: Fri, 15 Sep 2023 15:15:49 +0200 Subject: [PATCH 09/13] Remove unused imports --- psm_utils/io/ionbot.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/psm_utils/io/ionbot.py b/psm_utils/io/ionbot.py index 954e582..e9d387b 100644 --- a/psm_utils/io/ionbot.py +++ b/psm_utils/io/ionbot.py @@ -6,13 +6,10 @@ import csv import re -from collections import namedtuple from pathlib import Path -from typing import Iterable, NamedTuple, Optional +from typing import Iterable -import pandas as pd - -from psm_utils.io._base_classes import ReaderBase, WriterBase +from psm_utils.io._base_classes import ReaderBase from psm_utils.io.exceptions import PSMUtilsIOException from psm_utils.peptidoform import Peptidoform from psm_utils.psm import PSM From bc3f22ab2e53f615d27d1b0d6bbb84adfadcf5a6 Mon Sep 17 00:00:00 2001 From: RalfG Date: Fri, 15 Sep 2023 15:31:30 +0200 Subject: [PATCH 10/13] Update docstrings; minor style changes --- psm_utils/io/ionbot.py | 27 +++++++++++++++------------ psm_utils/io/mzid.py | 13 +++++++------ 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/psm_utils/io/ionbot.py b/psm_utils/io/ionbot.py index e9d387b..8bc103e 100644 --- a/psm_utils/io/ionbot.py +++ b/psm_utils/io/ionbot.py @@ -1,5 +1,7 @@ """ -ionbot first csv file parser +Interface with ionbot PSM files. + +Currently only supports the ionbot.first.csv files. """ from __future__ import annotations @@ -7,7 +9,7 @@ import csv import re from pathlib import Path -from typing import Iterable +from typing import Dict, Iterable, Union from psm_utils.io._base_classes import ReaderBase from psm_utils.io.exceptions import PSMUtilsIOException @@ -38,7 +40,7 @@ def __init__( **kwargs, ) -> None: """ - Reader for ionbot PSM files. + Reader for ``ionbot.first.csv`` PSM files. Parameters ---------- @@ -51,7 +53,7 @@ def __init__( IonbotReader supports iteration: >>> from psm_utils.io.ionbot import IonbotReader - >>> for psm in IonbotReader("peptides_1_1_0.mzid"): + >>> for psm in IonbotReader("ionbot.first.csv"): ... print(psm.peptidoform.proforma) ACDEK AC[Carbamidomethyl]DEFGR @@ -60,7 +62,7 @@ def __init__( Or a full file can be read at once into a :py:class:`psm_utils.psm_list.PSMList` object: - >>> ionbot_reader = IonbotReader("peptides_1_1_0.mzid") + >>> ionbot_reader = IonbotReader("ionbot.first.csv") >>> psm_list = ionbot_reader.read_file() """ @@ -72,14 +74,13 @@ def __iter__(self) -> Iterable[PSM]: with open(self.filename, "rt") as open_file: reader = csv.DictReader(open_file, delimiter=",") for row in reader: - psm = self._get_peptide_spectrum_match(row) - yield psm + yield self._get_peptide_spectrum_match(row) def read_file(self) -> PSMList: - """Read full mzid file to PSM list object.""" + """Read full PSM file into a PSMList object.""" return PSMList(psm_list=[psm for psm in self]) - def _get_peptide_spectrum_match(self, psm_dict: dict[str, str | float]) -> PSM: + def _get_peptide_spectrum_match(self, psm_dict: Dict[str, str | float]) -> PSM: return PSM( peptidoform=self._parse_peptidoform( psm_dict["matched_peptide"], @@ -107,7 +108,10 @@ def _get_peptide_spectrum_match(self, psm_dict: dict[str, str | float]) -> PSM: ) @staticmethod - def _parse_peptidoform(peptide, modifications, charge): + def _parse_peptidoform( + peptide: str, modifications: str, charge: Union[str, int] + ) -> Peptidoform: + """Parse peptide, modifications, and charge to Peptidoform.""" peptide = peptide = [""] + list(peptide) + [""] pattern = re.compile(r"^(?P\[\S*?\])?(?P.*?)(?P\[\S*?\])?$") @@ -130,8 +134,7 @@ def _parse_peptidoform(peptide, modifications, charge): proforma_seq = "".join(peptide) # Add charge state - if charge: - proforma_seq += f"/{charge}" + proforma_seq += f"/{charge}" return Peptidoform(proforma_seq) diff --git a/psm_utils/io/mzid.py b/psm_utils/io/mzid.py index fc34634..1f0338e 100644 --- a/psm_utils/io/mzid.py +++ b/psm_utils/io/mzid.py @@ -153,12 +153,12 @@ def __iter__(self): ) run = Path(spectrum["location"]).stem if "location" in spectrum else None rt = float(spectrum[self._spectrum_rt_key]) if self._spectrum_rt_key else None + ion_mobility = float(spectrum[self._im_key]) if self._im_key else None - ionmobility = float(spectrum[self._im_key]) if self._im_key else None # Parse PSMs from spectrum for entry in spectrum["SpectrumIdentificationItem"]: yield self._get_peptide_spectrum_match( - spectrum_id, spectrum_title, run, rt, ionmobility, entry + spectrum_id, spectrum_title, run, rt, ion_mobility, entry ) def read_file(self) -> PSMList: @@ -227,7 +227,7 @@ def _get_peptide_spectrum_match( spectrum_title: Union[str, None], run: Union[str, None], rt: Union[float, None], - ionmobility: Union[float, None], + ion_mobility: Union[float, None], spectrum_identification_item: dict[str, str | float | list], ) -> PSM: """Parse single mzid entry to :py:class:`~psm_utils.peptidoform.Peptidoform`.""" @@ -268,7 +268,7 @@ def _get_peptide_spectrum_match( pep=sii[self._pep_key] if self._pep_key else None, precursor_mz=precursor_mz, retention_time=rt, - ion_mobility=ionmobility, + ion_mobility=ion_mobility, protein_list=protein_list, rank=sii["rank"] if "rank" in sii else None, source=self._source, @@ -278,7 +278,7 @@ def _get_peptide_spectrum_match( return psm def _get_non_metadata_keys(self, keys: list): - """Gather all the keys that should not be written to metadata""" + """Gather all the keys at PSM-level that should not be written to metadata.""" # All keys required to create PSM object default_keys = [ "chargeState", @@ -318,6 +318,7 @@ def _get_non_metadata_keys(self, keys: list): self._non_metadata_keys.extend(default_keys) def _get_toplevel_non_metadata_keys(self, keys: list): + """Gather all keys at spectrum-level that should not be written to metadata.""" # Check if RT is encoded in spectrum metadata for key in ["retention time", "scan start time"]: if key in keys: @@ -335,7 +336,6 @@ def _get_toplevel_non_metadata_keys(self, keys: list): @staticmethod def _infer_score_name(keys) -> str: """Infer the score from the list of known PSM scores.""" - for score in STANDARD_SEARCHENGINE_SCORES: if score in keys: return score @@ -412,6 +412,7 @@ def write_psm(self, psm: PSM): ------ NotImplementedError MzidWriter currently does not support write_psm. + """ raise NotImplementedError("MzidWriter currently does not support write_psm.") From 112a914c8eafd75007e85c034ba1b2e1b0cb7afa Mon Sep 17 00:00:00 2001 From: RalfG Date: Fri, 15 Sep 2023 15:31:58 +0200 Subject: [PATCH 11/13] psm: Rename `get_mass_shift` to `precursor_mz_error` --- psm_utils/psm.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/psm_utils/psm.py b/psm_utils/psm.py index 9ec81ee..e6a3743 100644 --- a/psm_utils/psm.py +++ b/psm_utils/psm.py @@ -103,6 +103,12 @@ def __getitem__(self, item) -> any: def __setitem__(self, item, value: any) -> None: setattr(self, item, value) + @property + def precursor_mz_error(self) -> float: + """Difference between observed and theoretical m/z in Da.""" + theoretical_mz = self.peptidoform.theoretical_mz + return self.precursor_mz - theoretical_mz + def get_precursor_charge(self) -> int: """Precursor charge, as embedded in :py:attr:`PSM.peptidoform`.""" return self.peptidoform.precursor_charge @@ -131,9 +137,3 @@ def get_usi(self, as_url=False) -> str: if as_url: usi = "http://proteomecentral.proteomexchange.org/usi/?usi=" + usi return usi - - @property - def get_mass_shift(self) -> float: - """Get the mass shift of the PSM.""" - theoretical_mz = self.peptidoform.theoretical_mz - return self.precursor_mz - theoretical_mz From b759dfc68f5a9315701b24ee44b6019050b7c178 Mon Sep 17 00:00:00 2001 From: RalfG Date: Fri, 15 Sep 2023 15:32:18 +0200 Subject: [PATCH 12/13] Format pyproject.toml; add ruff config --- pyproject.toml | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d2005e0..dcb6d57 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,12 +2,12 @@ name = "psm-utils" description = "Common utilities for parsing and handling peptide-spectrum matches and search engine results." readme = "README.rst" -license = {file = "LICENSE"} +license = { file = "LICENSE" } keywords = ["proteomics", "peptide", "spectrum", "identification", "parsing"] authors = [ - {name = "Ralf Gabriels", email = "ralf@gabriels.dev"}, - {name = "Robbin Bouwmeester", email = "robbin.bouwmeester@ugent.be"}, - {name = "Arthur Declercq", email = "arthur.declercq@ugent.be"}, + { name = "Ralf Gabriels", email = "ralf@gabriels.dev" }, + { name = "Robbin Bouwmeester", email = "robbin.bouwmeester@ugent.be" }, + { name = "Arthur Declercq", email = "arthur.declercq@ugent.be" }, ] classifiers = [ "Intended Audience :: Science/Research", @@ -31,12 +31,7 @@ dependencies = [ ] [project.optional-dependencies] -dev = [ - "black", - "isort>5", - "pytest", - "pytest-cov" -] +dev = ["black", "isort>5", "pytest", "pytest-cov"] docs = [ "sphinx", "numpydoc>=1,<2", @@ -47,10 +42,7 @@ docs = [ "sphinx_rtd_theme", "sphinx-autobuild", ] -online = [ - "streamlit", - "plotly", -] +online = ["streamlit", "plotly"] [project.urls] GitHub = "https://github.com/compomics/psm_utils" @@ -74,3 +66,7 @@ profile = "black" [tool.black] line-length = 99 target-version = ['py37'] + +[tool.ruff] +line-length = 99 +target-version = "py37" From c6b06790d20946f2c16566dbf22055c365b2a97a Mon Sep 17 00:00:00 2001 From: RalfG Date: Fri, 15 Sep 2023 15:36:19 +0200 Subject: [PATCH 13/13] Remove commented code --- psm_utils/io/ionbot.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/psm_utils/io/ionbot.py b/psm_utils/io/ionbot.py index 8bc103e..95ad274 100644 --- a/psm_utils/io/ionbot.py +++ b/psm_utils/io/ionbot.py @@ -112,23 +112,20 @@ def _parse_peptidoform( peptide: str, modifications: str, charge: Union[str, int] ) -> Peptidoform: """Parse peptide, modifications, and charge to Peptidoform.""" + # Split peptide into list of amino acids with termini peptide = peptide = [""] + list(peptide) + [""] - pattern = re.compile(r"^(?P\[\S*?\])?(?P.*?)(?P\[\S*?\])?$") + # Add modifications + pattern = re.compile(r"^(?P\[\S*?\])?(?P.*?)(?P\[\S*?\])?$") for position, label in zip(modifications.split("|")[::2], modifications.split("|")[1::2]): mod_match = pattern.search(label) if mod_match.group("U"): parsed_label = "U:" + mod_match.group("U")[1:-1] else: parsed_label = mod_match.group("mod") - - # if (mod_match.group("AA")) and ( - # mod_match.group("AA")[1:-1] != peptide[int(position)] - # ): - # print(mod_match.group("AA")[1:-1], peptide[int(position)]) - peptide[int(position)] += f"[{parsed_label}]" + # Add terminal modifications peptide[0] = peptide[0] + "-" if peptide[0] else "" peptide[-1] = "-" + peptide[-1] if peptide[-1] else "" proforma_seq = "".join(peptide)