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
33PeptideModificatorPipeline::PeptideModificatorPipeline()
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
78void
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
94void
96{
97 privAddFixedModificationString(mod_str, true, true, true);
98}
99void
101 const QString &mod_str)
102{
103 privAddFixedModificationString(mod_str, true, false, false);
104}
105void
107 const QString &mod_str)
108{
109 privAddFixedModificationString(mod_str, false, true, false);
110}
111
112void
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
132void
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 {
156 }
157 else
158 {
160 }
162}
163
164void
166 const QString &mod_str)
167{
168 privAddPotentialModificationString(mod_str, true, true, true);
169}
170// protein Nter modification
171void
173 const QString &mod_str)
174{
175 privAddPotentialModificationString(mod_str, true, false, false);
176}
177// protein Cter modification
178void
180 const QString &mod_str)
181{
182 privAddPotentialModificationString(mod_str, false, true, false);
183}
184
185void
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
206void
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);
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 {
249 }
250 else
251 {
253 }
255}
256
257
258void
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
305void
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
328}
329
330
331void
332PeptideModificatorPipeline::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
366void
367PeptideModificatorPipeline::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:47