libpappsomspp
Library for mass spectrometry
peptidemodificatorpipeline.cpp
Go to the documentation of this file.
1
2/*******************************************************************************
3 * Copyright (c) 2016 Olivier Langella <Olivier.Langella@moulon.inra.fr>.
4 *
5 * This file is part of the PAPPSOms++ library.
6 *
7 * PAPPSOms++ is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * PAPPSOms++ is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with PAPPSOms++. If not, see <http://www.gnu.org/licenses/>.
19 *
20 * Contributors:
21 * Olivier Langella <Olivier.Langella@moulon.inra.fr> - initial API and
22 *implementation
23 ******************************************************************************/
24
28#include "../pappsoexception.h"
29#include <QStringList>
30using namespace pappso;
31
32
33// QRegularExpression PeptideModificatorPipeline::_rx_modmass("[-+]?[0-9]*\\.?[0-9]*");
34
35PeptideModificatorPipeline::PeptideModificatorPipeline()
36{
37}
38
40 const PeptideModificatorPipeline &other)
41{
42 throw PappsoException(
43 QObject::tr("unable to copy PeptideModificatorPipeline object"));
44 if(other.mp_peptideModificatorTee != nullptr)
45 {
46 // mp_peptideModificatorTee = new
47 // PeptideModificatorTee(other.mp_peptideModificatorTee);
48 }
49
51 mp_firstModificator = nullptr;
52 for(auto p_mod : other.m_pepModificatorPtrList)
53 {
54 delete(p_mod);
55 }
56
57
58 m_sink = other.m_sink;
59
61
63
65}
66
68{
69
70 for(auto p_mod : m_pepModificatorPtrList)
71 {
72 delete(p_mod);
73 }
74 if(mp_peptideModificatorTee == nullptr)
75 {
77 }
78}
79
80void
82{
83 if(mp_peptideModificatorTee != nullptr)
84 {
85 throw PappsoException(QObject::tr(
86 "Please use setSink before addLabeledModificationString function"));
87 }
88
89 m_sink = sink;
90 if(mp_firstModificator != nullptr)
91 {
93 }
94};
95
96void
98{
99 privAddFixedModificationString(mod_str, true, true, true);
100}
101void
103 const QString &mod_str)
104{
105 privAddFixedModificationString(mod_str, true, false, false);
106}
107void
109 const QString &mod_str)
110{
111 privAddFixedModificationString(mod_str, false, true, false);
112}
113
114void
116 const QString &mod_str, bool Nter, bool Cter, bool else_prot)
117{
118 //"MOD:00397@C, MOD:00398@R"
119 if(mp_peptideModificatorTee != nullptr)
120 {
121 throw PappsoException(
122 QObject::tr("Unable to add fixed modification string after "
123 "addLabeledModificationString function"));
124 }
125 QStringList mod_list_str =
126 mod_str.simplified().replace(" ", "").split(",", Qt::SkipEmptyParts);
127 for(auto i = 0; i < mod_list_str.size(); ++i)
128 {
129 parseFixedModification(mod_list_str[i], Nter, Cter, else_prot);
130 }
131}
132
133
134void
136 bool Nter,
137 bool Cter,
138 bool else_prot)
139{
140
141 QStringList str_split = mod_str.split("@", Qt::SkipEmptyParts);
142
144
147 mod->setModificationPattern(str_split[1]);
148 mod->setSink(m_sink);
149 mod->setProtNter(Nter);
150 mod->setProtCter(Cter);
151 mod->setProtElse(else_prot);
152
153 m_pepModificatorPtrList.push_back(mod);
154
155 if(mp_firstModificator == nullptr)
156 {
158 }
159 else
160 {
162 }
164}
165
166void
168 const QString &mod_str)
169{
170 privAddPotentialModificationString(mod_str, true, true, true);
171}
172// protein Nter modification
173void
175 const QString &mod_str)
176{
177 privAddPotentialModificationString(mod_str, true, false, false);
178}
179// protein Cter modification
180void
182 const QString &mod_str)
183{
184 privAddPotentialModificationString(mod_str, false, true, false);
185}
186
187void
189 const QString &mod_str, bool Nter, bool Cter, bool else_prot)
190{
191 //"MOD:00397@C, MOD:00398@R"
192 if(mp_peptideModificatorTee != nullptr)
193 {
194 throw PappsoException(
195 QObject::tr("Unable to add potential modification string after "
196 "addLabeledModificationString function"));
197 }
198
199 QStringList mod_list_str =
200 mod_str.simplified().replace(" ", "").split(",", Qt::SkipEmptyParts);
201 for(auto i = 0; i < mod_list_str.size(); ++i)
202 {
203 parsePotentialModification(mod_list_str[i], Nter, Cter, else_prot);
204 }
205}
206
207
208void
210 bool Nter,
211 bool Cter,
212 bool else_prot)
213{
214
215 QStringList str_split = mod_str.split("@", Qt::SkipEmptyParts);
216
217 QString mod_acc_str = str_split[0];
218 QStringList str_acc_split = mod_acc_str.split("(", Qt::SkipEmptyParts);
220 AaModification::getInstance(str_acc_split[0]);
221
224
225 // qDebug() << "PeptideModificatorPipeline::parsePotentialModification " << ;
226 if(str_acc_split.length() == 2)
227 {
228 QStringList max_num_str_list =
229 str_acc_split[1].replace(")", "").split("-", Qt::SkipEmptyParts);
230 if(max_num_str_list.length() == 1)
231 {
232 mod->setModificationCounter(max_num_str_list[0].toUInt());
233 }
234 else if(max_num_str_list.length() == 2)
235 {
236 mod->setMinNumberMod(max_num_str_list[0].toUInt());
237 mod->setMaxNumberMod(max_num_str_list[1].toUInt());
238 }
239 }
240 mod->setModificationPattern(str_split[1]);
241 mod->setSink(m_sink);
242 mod->setProtNter(Nter);
243 mod->setProtCter(Cter);
244 mod->setProtElse(else_prot);
245
246 m_pepModificatorPtrList.push_back(mod);
247
248 if(mp_firstModificator == nullptr)
249 {
251 }
252 else
253 {
255 }
257}
258
259
260void
262{
263
264 if(m_sink == nullptr)
265 {
266 throw PappsoException(QObject::tr(
267 "Please use setSink before addLabeledModificationString function"));
268 }
269 if(mp_peptideModificatorTee == nullptr)
270 {
272 }
273 if(mp_firstModificator == nullptr)
274 {
276 }
277
278 // backup pointers
279 PeptideModificatorInterface *backup_sink = m_sink;
280
281 PeptideSpSinkInterface *backup_p_last_peptide_sink_interface =
283
284 PeptideModificatorInterface *backup_p_first_modificator = mp_firstModificator;
285
286
287 QStringList mod_list_str =
288 mod_str.simplified().replace(" ", "").split(",", Qt::SkipEmptyParts);
289 for(auto i = 0; i < mod_list_str.size(); ++i)
290 {
291 parseLabeledModification(mod_list_str[i], true, true, true);
292
293 if(i == 0)
294 {
296 }
297 }
298
299 m_sink = backup_sink;
300 mp_lastPeptideSinkInterface = backup_p_last_peptide_sink_interface;
301 mp_firstModificator = backup_p_first_modificator;
302
304}
305
306
307void
309 bool Nter,
310 bool Cter,
311 bool else_prot)
312{
313
314 QStringList str_split = mod_str.split("@", Qt::SkipEmptyParts);
316
319 mod->setModificationPattern(str_split[1]);
320 mod->setSink(m_sink);
321 mod->setProtNter(Nter);
322 mod->setProtCter(Cter);
323 mod->setProtCter(else_prot);
324
325 m_pepModificatorPtrList.push_back(mod);
326
330}
331
332
333void
334PeptideModificatorPipeline::setPeptideSp(std::int8_t sequence_database_id,
335 const ProteinSp &protein_sp,
336 bool is_decoy,
337 const PeptideSp &peptide_sp_original,
338 unsigned int start,
339 bool is_nter,
340 unsigned int missed_cleavage_number,
341 bool semi_enzyme)
342{
343 if(mp_firstModificator == nullptr)
344 {
345 m_sink->setPeptideSp(sequence_database_id,
346 protein_sp,
347 is_decoy,
348 peptide_sp_original,
349 start,
350 is_nter,
351 missed_cleavage_number,
352 semi_enzyme);
353 }
354 else
355 {
356 mp_firstModificator->setPeptideSp(sequence_database_id,
357 protein_sp,
358 is_decoy,
359 peptide_sp_original,
360 start,
361 is_nter,
362 missed_cleavage_number,
363 semi_enzyme);
364 }
365}
366
367
368void
369PeptideModificatorPipeline::setPeptide(std::int8_t sequence_database_id,
370 const ProteinSp &protein_sp,
371 bool is_decoy,
372 const QString &peptide_str,
373 unsigned int start,
374 bool is_nter,
375 unsigned int missed_cleavage_number,
376 bool semi_enzyme)
377{
378
379 qDebug() << "PeptideModificatorPipeline::setPeptide begin";
380
381 Peptide peptide(peptide_str);
382
383 PeptideSp peptide_sp = peptide.makePeptideSp();
384
385 qDebug() << "PeptideModificatorPipeline::setPeptide m_sink->setPeptideSp";
386 setPeptideSp(sequence_database_id,
387 protein_sp,
388 is_decoy,
389 peptide_sp,
390 start,
391 is_nter,
392 missed_cleavage_number,
393 semi_enzyme);
394 qDebug() << "PeptideModificatorPipeline::setPeptide end";
395}
static AaModificationP getInstance(const QString &accession)
void setProtElse(bool arg1)
this modification concerns all peptides between Nter and Cter
void setProtCter(bool arg1)
this modification concerns the Cter peptide
void setSink(PeptideModificatorInterface *sink) override
void setProtNter(bool arg1)
this modification concerns the Nter peptide
virtual void setModificationPattern(QString &pattern) final
set the pattern on which the modification will be applied (usually the list of concerned AA)
virtual void setPeptideSp(std::int8_t sequence_database_id, const ProteinSp &protein_sp, bool is_decoy, const PeptideSp &peptide_sp, unsigned int start, bool is_nter, unsigned int missed_cleavage_number, bool semi_enzyme)=0
function to give the products of modifications for a digested peptide
void addFixedNterModificationString(const QString &mod_str)
void addPotentialCterModificationString(const QString &mod_str)
void parsePotentialModification(const QString &mod_str, bool Nter, bool Cter, bool else_prot)
void addLabeledModificationString(const QString &mod_str)
void setSink(PeptideModificatorInterface *sink) override
void parseLabeledModification(const QString &mod_str, bool Nter, bool Cter, bool else_prot)
void privAddFixedModificationString(const QString &mod_str, bool Nter, bool Cter, bool else_prot)
void privAddPotentialModificationString(const QString &mod_str, bool Nter, bool Cter, bool else_prot)
void setPeptideSp(std::int8_t sequence_database_id, const ProteinSp &protein_sp, bool is_decoy, const PeptideSp &peptide_sp_original, unsigned int start, bool is_nter, unsigned int missed_cleavage_number, bool semi_enzyme) override
function to give the products of modifications for a digested peptide
void addFixedModificationString(const QString &mod_str)
std::vector< PeptideModificatorInterface * > m_pepModificatorPtrList
PeptideModificatorInterface * mp_firstModificator
void setPeptide(std::int8_t sequence_database_id, const ProteinSp &protein_sp, bool is_decoy, const QString &peptide_str, unsigned int start, bool is_nter, unsigned int missed_cleavage_number, bool semi_enzyme) override
function to give the products of a protein digestion by an enzyme
PeptideSpSinkInterface * mp_lastPeptideSinkInterface
void addFixedCterModificationString(const QString &mod_str)
void addPotentialNterModificationString(const QString &mod_str)
void addPotentialModificationString(const QString &mod_str)
void parseFixedModification(const QString &mod_str, bool Nter, bool Cter, bool else_prot)
void addModificator(PeptideModificatorInterface *p_peptide_mod)
virtual void setSink(PeptideModificatorInterface *sink)=0
Modify a peptide shared pointer with a variable modification on one AA.
void setSink(PeptideModificatorInterface *sink) override
void setProtNter(bool arg1)
this modification concerns the Nter peptide
void setProtElse(bool arg1)
this modification concerns all peptides between Nter and Cter
void setProtCter(bool arg1)
this modification concerns the Cter peptide
PeptideSp makePeptideSp() const
Definition: peptide.cpp:125
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
Definition: aa.cpp:39
std::shared_ptr< const Peptide > PeptideSp
std::shared_ptr< const Protein > ProteinSp
shared pointer on a Protein object
Definition: protein.h:47