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>
30 using namespace pappso;
31 
32 
33 // QRegularExpression PeptideModificatorPipeline::_rx_modmass("[-+]?[0-9]*\\.?[0-9]*");
34 
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 
80 void
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 
96 void
98 {
99  privAddFixedModificationString(mod_str, true, true, true);
100 }
101 void
103  const QString &mod_str)
104 {
105  privAddFixedModificationString(mod_str, true, false, false);
106 }
107 void
109  const QString &mod_str)
110 {
111  privAddFixedModificationString(mod_str, false, true, false);
112 }
113 
114 void
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 
134 void
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  {
157  mp_firstModificator = mod;
158  }
159  else
160  {
162  }
164 }
165 
166 void
168  const QString &mod_str)
169 {
170  privAddPotentialModificationString(mod_str, true, true, true);
171 }
172 // protein Nter modification
173 void
175  const QString &mod_str)
176 {
177  privAddPotentialModificationString(mod_str, true, false, false);
178 }
179 // protein Cter modification
180 void
182  const QString &mod_str)
183 {
184  privAddPotentialModificationString(mod_str, false, true, false);
185 }
186 
187 void
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 
208 void
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);
219  pappso::AaModificationP aa_mod =
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  {
250  mp_firstModificator = mod;
251  }
252  else
253  {
255  }
257 }
258 
259 
260 void
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 
307 void
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 
329  mp_firstModificator = mod;
330 }
331 
332 
333 void
334 PeptideModificatorPipeline::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 
368 void
369 PeptideModificatorPipeline::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:43