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 
34 {
35 }
36 
38  const PeptideModificatorPipeline &other)
39 {
40  throw PappsoException(
41  QObject::tr("unable to copy PeptideModificatorPipeline object"));
42  if(other.mp_peptideModificatorTee != nullptr)
43  {
44  // mp_peptideModificatorTee = new
45  // PeptideModificatorTee(other.mp_peptideModificatorTee);
46  }
47 
49  mp_firstModificator = nullptr;
50  for(auto p_mod : other.m_pepModificatorPtrList)
51  {
52  delete(p_mod);
53  }
54 
55 
56  m_sink = other.m_sink;
57 
59 
61 
63 }
64 
66 {
67 
68  for(auto p_mod : m_pepModificatorPtrList)
69  {
70  delete(p_mod);
71  }
72  if(mp_peptideModificatorTee == nullptr)
73  {
75  }
76 }
77 
78 void
80 {
81  if(mp_peptideModificatorTee != nullptr)
82  {
83  throw PappsoException(QObject::tr(
84  "Please use setSink before addLabeledModificationString function"));
85  }
86 
87  m_sink = sink;
88  if(mp_firstModificator != nullptr)
89  {
91  }
92 };
93 
94 void
96 {
97  privAddFixedModificationString(mod_str, true, true, true);
98 }
99 void
101  const QString &mod_str)
102 {
103  privAddFixedModificationString(mod_str, true, false, false);
104 }
105 void
107  const QString &mod_str)
108 {
109  privAddFixedModificationString(mod_str, false, true, false);
110 }
111 
112 void
114  const QString &mod_str, bool Nter, bool Cter, bool else_prot)
115 {
116  //"MOD:00397@C, MOD:00398@R"
117  if(mp_peptideModificatorTee != nullptr)
118  {
119  throw PappsoException(
120  QObject::tr("Unable to add fixed modification string after "
121  "addLabeledModificationString function"));
122  }
123  QStringList mod_list_str =
124  mod_str.simplified().replace(" ", "").split(",", Qt::SkipEmptyParts);
125  for(auto i = 0; i < mod_list_str.size(); ++i)
126  {
127  parseFixedModification(mod_list_str[i], Nter, Cter, else_prot);
128  }
129 }
130 
131 
132 void
134  bool Nter,
135  bool Cter,
136  bool else_prot)
137 {
138 
139  QStringList str_split = mod_str.split("@", Qt::SkipEmptyParts);
140 
142 
145  mod->setModificationPattern(str_split[1]);
146  mod->setSink(m_sink);
147  mod->setProtNter(Nter);
148  mod->setProtCter(Cter);
149  mod->setProtElse(else_prot);
150 
151  m_pepModificatorPtrList.push_back(mod);
152 
153  if(mp_firstModificator == nullptr)
154  {
155  mp_firstModificator = mod;
156  }
157  else
158  {
160  }
162 }
163 
164 void
166  const QString &mod_str)
167 {
168  privAddPotentialModificationString(mod_str, true, true, true);
169 }
170 // protein Nter modification
171 void
173  const QString &mod_str)
174 {
175  privAddPotentialModificationString(mod_str, true, false, false);
176 }
177 // protein Cter modification
178 void
180  const QString &mod_str)
181 {
182  privAddPotentialModificationString(mod_str, false, true, false);
183 }
184 
185 void
187  const QString &mod_str, bool Nter, bool Cter, bool else_prot)
188 {
189  //"MOD:00397@C, MOD:00398@R"
190  if(mp_peptideModificatorTee != nullptr)
191  {
192  throw PappsoException(
193  QObject::tr("Unable to add potential modification string after "
194  "addLabeledModificationString function"));
195  }
196 
197  QStringList mod_list_str =
198  mod_str.simplified().replace(" ", "").split(",", Qt::SkipEmptyParts);
199  for(auto i = 0; i < mod_list_str.size(); ++i)
200  {
201  parsePotentialModification(mod_list_str[i], Nter, Cter, else_prot);
202  }
203 }
204 
205 
206 void
208  bool Nter,
209  bool Cter,
210  bool else_prot)
211 {
212 
213  QStringList str_split = mod_str.split("@", Qt::SkipEmptyParts);
214 
215  QString mod_acc_str = str_split[0];
216  QStringList str_acc_split = mod_acc_str.split("(", Qt::SkipEmptyParts);
217  pappso::AaModificationP aa_mod =
218  AaModification::getInstance(str_acc_split[0]);
219 
222 
223  // qDebug() << "PeptideModificatorPipeline::parsePotentialModification " << ;
224  if(str_acc_split.length() == 2)
225  {
226  QStringList max_num_str_list =
227  str_acc_split[1].replace(")", "").split("-", Qt::SkipEmptyParts);
228  if(max_num_str_list.length() == 1)
229  {
230  mod->setModificationCounter(max_num_str_list[0].toUInt());
231  }
232  else if(max_num_str_list.length() == 2)
233  {
234  mod->setMinNumberMod(max_num_str_list[0].toUInt());
235  mod->setMaxNumberMod(max_num_str_list[1].toUInt());
236  }
237  }
238  mod->setModificationPattern(str_split[1]);
239  mod->setSink(m_sink);
240  mod->setProtNter(Nter);
241  mod->setProtCter(Cter);
242  mod->setProtElse(else_prot);
243 
244  m_pepModificatorPtrList.push_back(mod);
245 
246  if(mp_firstModificator == nullptr)
247  {
248  mp_firstModificator = mod;
249  }
250  else
251  {
253  }
255 }
256 
257 
258 void
260 {
261 
262  if(m_sink == nullptr)
263  {
264  throw PappsoException(QObject::tr(
265  "Please use setSink before addLabeledModificationString function"));
266  }
267  if(mp_peptideModificatorTee == nullptr)
268  {
270  }
271  if(mp_firstModificator == nullptr)
272  {
274  }
275 
276  // backup pointers
277  PeptideModificatorInterface *backup_sink = m_sink;
278 
279  PeptideSpSinkInterface *backup_p_last_peptide_sink_interface =
281 
282  PeptideModificatorInterface *backup_p_first_modificator = mp_firstModificator;
283 
284 
285  QStringList mod_list_str =
286  mod_str.simplified().replace(" ", "").split(",", Qt::SkipEmptyParts);
287  for(auto i = 0; i < mod_list_str.size(); ++i)
288  {
289  parseLabeledModification(mod_list_str[i], true, true, true);
290 
291  if(i == 0)
292  {
294  }
295  }
296 
297  m_sink = backup_sink;
298  mp_lastPeptideSinkInterface = backup_p_last_peptide_sink_interface;
299  mp_firstModificator = backup_p_first_modificator;
300 
302 }
303 
304 
305 void
307  bool Nter,
308  bool Cter,
309  bool else_prot)
310 {
311 
312  QStringList str_split = mod_str.split("@", Qt::SkipEmptyParts);
314 
317  mod->setModificationPattern(str_split[1]);
318  mod->setSink(m_sink);
319  mod->setProtNter(Nter);
320  mod->setProtCter(Cter);
321  mod->setProtCter(else_prot);
322 
323  m_pepModificatorPtrList.push_back(mod);
324 
327  mp_firstModificator = mod;
328 }
329 
330 
331 void
332 PeptideModificatorPipeline::setPeptideSp(std::int8_t sequence_database_id,
333  const ProteinSp &protein_sp,
334  bool is_decoy,
335  const PeptideSp &peptide_sp_original,
336  unsigned int start,
337  bool is_nter,
338  unsigned int missed_cleavage_number,
339  bool semi_enzyme)
340 {
341  if(mp_firstModificator == nullptr)
342  {
343  m_sink->setPeptideSp(sequence_database_id,
344  protein_sp,
345  is_decoy,
346  peptide_sp_original,
347  start,
348  is_nter,
349  missed_cleavage_number,
350  semi_enzyme);
351  }
352  else
353  {
354  mp_firstModificator->setPeptideSp(sequence_database_id,
355  protein_sp,
356  is_decoy,
357  peptide_sp_original,
358  start,
359  is_nter,
360  missed_cleavage_number,
361  semi_enzyme);
362  }
363 }
364 
365 
366 void
367 PeptideModificatorPipeline::setPeptide(std::int8_t sequence_database_id,
368  const ProteinSp &protein_sp,
369  bool is_decoy,
370  const QString &peptide_str,
371  unsigned int start,
372  bool is_nter,
373  unsigned int missed_cleavage_number,
374  bool semi_enzyme)
375 {
376 
377  qDebug() << "PeptideModificatorPipeline::setPeptide begin";
378 
379  Peptide peptide(peptide_str);
380 
381  PeptideSp peptide_sp = peptide.makePeptideSp();
382 
383  qDebug() << "PeptideModificatorPipeline::setPeptide m_sink->setPeptideSp";
384  setPeptideSp(sequence_database_id,
385  protein_sp,
386  is_decoy,
387  peptide_sp,
388  start,
389  is_nter,
390  missed_cleavage_number,
391  semi_enzyme);
392  qDebug() << "PeptideModificatorPipeline::setPeptide end";
393 }
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