libpappsomspp
Library for mass spectrometry
peptide.cpp
Go to the documentation of this file.
1/**
2 * \file pappsomspp/peptide/peptide.cpp
3 * \date 7/3/2015
4 * \author Olivier Langella
5 * \brief peptide model
6 */
7
8/*******************************************************************************
9 * Copyright (c) 2015 Olivier Langella <Olivier.Langella@moulon.inra.fr>.
10 *
11 * This file is part of the PAPPSOms++ library.
12 *
13 * PAPPSOms++ is free software: you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation, either version 3 of the License, or
16 * (at your option) any later version.
17 *
18 * PAPPSOms++ is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with PAPPSOms++. If not, see <http://www.gnu.org/licenses/>.
25 *
26 * Contributors:
27 * Olivier Langella <Olivier.Langella@moulon.inra.fr> - initial API and
28 *implementation
29 ******************************************************************************/
30
31#include <QDebug>
32#include <algorithm>
33#include "peptide.h"
34#include "../pappsoexception.h"
35#include "../exception/exceptionoutofrange.h"
36#include "../exception/exceptionnotpossible.h"
38
39namespace pappso
40{
41
42bool
44{
45 if(peptideIonIsNter(ion_type))
46 std::swap(ion_type_ref, ion_type);
47 if(peptideIonIsNter(ion_type))
48 return false;
49 if((ion_type_ref == PeptideIon::b) && (ion_type == PeptideIon::y))
50 return true;
51 if((ion_type_ref == PeptideIon::ao) && (ion_type == PeptideIon::yo))
52 return true;
53 if((ion_type_ref == PeptideIon::bstar) && (ion_type == PeptideIon::ystar))
54 return true;
55
56 return false;
57}
58
59bool
61{
62 if((std::int8_t)ion_type < (std::int8_t)8)
63 {
64 return true;
65 }
66 return false;
67}
68
71{
72 if(peptideIonIsNter(ion_type))
73 {
75 }
77}
78
79Peptide::Peptide(const QString &pepstr)
80{
81
82 QString::const_iterator it(pepstr.begin());
83 if(it != pepstr.end())
84 {
85 // first amino acid is the Nter one
86 // by default, it is obtained by hydrolytic cleavage in normal water
87 // and it is loaded with one Hydrogen
88 Aa nter_aa(it->toLatin1());
89 nter_aa.addAaModification(
90 AaModification::getInstance("internal:Nter_hydrolytic_cleavage_H"));
91 m_aaVec.push_back(nter_aa);
92 it++;
93
94 while(it != pepstr.end())
95 {
96 m_aaVec.push_back(Aa(it->toLatin1()));
97 it++;
98 }
99 // by default, Nter aa is obtained by hydrolytic cleavage in normal water
100 // and it is loaded with Hydrogen + Oxygen
101 m_aaVec.back().addAaModification(
102 AaModification::getInstance("internal:Cter_hydrolytic_cleavage_HO"));
103 getMass();
104 qDebug() << "blabla " << m_aaVec.back().toString();
105 }
106}
107
109{
110}
111
113 : m_aaVec(peptide.m_aaVec), m_proxyMass(peptide.m_proxyMass)
114{
115}
116
117
118Peptide::Peptide(Peptide &&toCopy) // move constructor
119 : m_aaVec(std::move(toCopy.m_aaVec)), m_proxyMass(toCopy.m_proxyMass)
120{
121}
122
123
126{
127 return std::make_shared<const Peptide>(*this);
128}
129
132{
133 return std::make_shared<Peptide>(*this);
134}
135
136
137std::vector<Aa>::iterator
139{
140 return m_aaVec.begin();
141}
142
143std::vector<Aa>::iterator
145{
146 return m_aaVec.end();
147}
148
149std::vector<Aa>::const_iterator
151{
152 return m_aaVec.begin();
153}
154
155std::vector<Aa>::const_iterator
157{
158 return m_aaVec.end();
159}
160
161std::vector<Aa>::const_reverse_iterator
163{
164 return m_aaVec.rbegin();
165}
166
167std::vector<Aa>::const_reverse_iterator
169{
170 return m_aaVec.rend();
171}
172
173
176{
177 return m_proxyMass;
178}
179
180
181unsigned int
183{
184 return m_aaVec.size();
185}
186void
188 unsigned int position)
189{
190 if(position >= size())
191 {
193 QObject::tr("position (%1) > size (%2)").arg(position).arg(size()));
194 }
195 m_proxyMass = -1;
196 qDebug() << "Peptide::addAaModification begin " << position;
197 std::vector<Aa>::iterator it = m_aaVec.begin() + position;
198 it->addAaModification(aaModification);
199 getMass();
200 qDebug() << "Peptide::addAaModification end";
201}
202
203void
205 AminoAcidChar amino_acid)
206{
207
208 for(auto &aa : *this)
209 {
210 if(aa.getAminoAcidChar() == amino_acid)
211 {
212 aa.addAaModification(aaModification);
213 }
214 }
215
216
217 m_proxyMass = -1;
218 getMass();
219}
220
221const QString
223{
224 QString seq = "";
225 std::vector<Aa>::const_iterator it(m_aaVec.begin());
226 while(it != m_aaVec.end())
227 {
228 seq += it->getLetter();
229 it++;
230 }
231 return seq;
232}
233const QString
235{
236 QString seq = "";
237 std::vector<Aa>::const_iterator it(m_aaVec.begin());
238 while(it != m_aaVec.end())
239 {
240 seq += it->toAbsoluteString();
241 it++;
242 }
243 return seq;
244}
245
246const QString
248{
249 QString seq = "";
250 std::vector<Aa>::const_iterator it(m_aaVec.begin());
251 while(it != m_aaVec.end())
252 {
253 seq += it->toAbsoluteString();
254 it++;
255 }
256 return seq.replace("L", "I");
257}
258
259
260const QString
262{
263 QString seq = "";
264 std::vector<Aa>::const_iterator it(m_aaVec.begin());
265 while(it != m_aaVec.end())
266 {
267 seq += it->toString();
268 it++;
269 }
270 return seq;
271}
272
275{
276 qDebug() << "Aa::getMass() begin";
277 if(m_proxyMass < 0)
278 {
279 m_proxyMass = 0;
280 for(auto aa : m_aaVec)
281 {
282 m_proxyMass += aa.getMass();
283 }
284 }
285 qDebug() << "Aa::getMass() end " << m_proxyMass;
286 return m_proxyMass;
287}
288
289int
291{
292 int number = 0;
293 std::vector<Aa>::const_iterator it(m_aaVec.begin());
294 while(it != m_aaVec.end())
295 {
296 number += it->getNumberOfAtom(atom);
297 it++;
298 }
299 // qDebug() << "Aa::getMass() end " << mass;
300 return number;
301}
302
303int
305{
306 int number = 0;
307 std::vector<Aa>::const_iterator it(m_aaVec.begin());
308 while(it != m_aaVec.end())
309 {
310 number += it->getNumberOfIsotope(isotope);
311 it++;
312 }
313 // qDebug() << "Aa::getMass() end " << mass;
314 return number;
315}
316
317
318unsigned int
320{
321 unsigned int number = 0;
322 std::vector<Aa>::const_iterator it(m_aaVec.begin());
323 while(it != m_aaVec.end())
324 {
325 number += it->getNumberOfModification(mod);
326 it++;
327 }
328 // qDebug() << "Aa::getMass() end " << mass;
329 return number;
330}
331
332unsigned int
334 const std::vector<char> &aa_list) const
335{
336 unsigned int number = 0;
337 std::vector<Aa>::const_iterator it(m_aaVec.begin());
338 while(it != m_aaVec.end())
339 {
340 if(std::find(aa_list.begin(), aa_list.end(), it->getLetter()) !=
341 aa_list.end())
342 {
343 number += it->getNumberOfModification(mod);
344 }
345 it++;
346 }
347 // qDebug() << "Aa::getMass() end " << mass;
348 return number;
349}
350
351void
353{
354 if(oldmod == newmod)
355 return;
356 std::vector<Aa>::iterator it(m_aaVec.begin());
357 while(it != m_aaVec.end())
358 {
359 it->replaceAaModification(oldmod, newmod);
360 it++;
361 }
362 m_proxyMass = -1;
363 getMass();
364}
365void
367{
368 std::vector<Aa>::iterator it(m_aaVec.begin());
369 while(it != m_aaVec.end())
370 {
371 it->removeAaModification(mod);
372 qDebug() << it->toString() << " " << toAbsoluteString();
373 it++;
374 }
375 m_proxyMass = -1;
376 getMass();
377 // qDebug() << "Aa::getMass() end " << mass;
378}
379std::vector<unsigned int>
381{
382 std::vector<unsigned int> position_list;
383 unsigned int position = 0;
384 std::vector<Aa>::const_iterator it(m_aaVec.begin());
385 while(it != m_aaVec.end())
386 {
387 unsigned int number = 0;
388 number += it->getNumberOfModification(mod);
389 for(unsigned int j = 0; j < number; j++)
390 {
391 position_list.push_back(position);
392 }
393 it++;
394 position++;
395 }
396 // qDebug() << "Aa::getMass() end " << mass;
397 return position_list;
398}
399
400std::vector<unsigned int>
402 const std::vector<char> &aa_list) const
403{
404 std::vector<unsigned int> position_list;
405 unsigned int position = 0;
406 std::vector<Aa>::const_iterator it(m_aaVec.begin());
407 while(it != m_aaVec.end())
408 {
409 if(std::find(aa_list.begin(), aa_list.end(), it->getLetter()) !=
410 aa_list.end())
411 {
412 unsigned int number = 0;
413 number += it->getNumberOfModification(mod);
414 for(unsigned int j = 0; j < number; j++)
415 {
416 position_list.push_back(position);
417 }
418 }
419 it++;
420 position++;
421 }
422 // qDebug() << "Aa::getMass() end " << mass;
423 return position_list;
424}
425
426std::vector<unsigned int>
428{
429 std::vector<unsigned int> position_list;
430 unsigned int number = 0;
431 std::vector<Aa>::const_iterator it(m_aaVec.begin());
432 while(it != m_aaVec.end())
433 {
434 if(it->getLetter() == aa)
435 position_list.push_back(number);
436 number++;
437 it++;
438 }
439 // qDebug() << "Aa::getMass() end " << mass;
440 return position_list;
441}
442
443std::vector<unsigned int>
444Peptide::getAaPositionList(std::list<char> list_aa) const
445{
446 std::vector<unsigned int> position_list;
447 unsigned int number = 0;
448 std::vector<Aa>::const_iterator it(m_aaVec.begin());
449 while(it != m_aaVec.end())
450 {
451
452 bool found =
453 (std::find(list_aa.begin(), list_aa.end(), it->getLetter()) !=
454 list_aa.end());
455 if(found)
456 {
457 position_list.push_back(number);
458 }
459 number++;
460 it++;
461 }
462 // qDebug() << "Aa::getMass() end " << mass;
463 return position_list;
464}
465
468{
469 std::vector<Aa>::const_iterator it(m_aaVec.begin());
470 if(it != m_aaVec.end())
471 {
472 return it->getInternalNterModification();
473 }
474
475 return nullptr;
476}
479{
480 std::vector<Aa>::const_iterator it(m_aaVec.end());
481 it--;
482 if(it != m_aaVec.end())
483 {
484 return it->getInternalCterModification();
485 }
486 return nullptr;
487}
488void
490{
491 std::vector<Aa>::iterator it(m_aaVec.begin());
492 if(it != m_aaVec.end())
493 {
494 m_proxyMass -= it->getMass();
495 it->removeInternalNterModification();
496 m_proxyMass += it->getMass();
497 }
498}
499void
501{
502 std::vector<Aa>::iterator it(m_aaVec.end());
503 it--;
504 if(it != m_aaVec.end())
505 {
506 m_proxyMass -= it->getMass();
507 it->removeInternalCterModification();
508 m_proxyMass += it->getMass();
509 }
510}
511
512
513void
515{
516 if(mod->getAccession().startsWith("internal:Nter_"))
517 {
519 std::vector<Aa>::iterator it(m_aaVec.begin());
520 if(it != m_aaVec.end())
521 {
522 it->addAaModification(mod);
523 }
524 else
525 {
526 throw ExceptionOutOfRange(QObject::tr("peptide is empty"));
527 }
528 }
529 else
530 {
532 QObject::tr("modification is not an internal Nter modification : %1")
533 .arg(mod->getAccession()));
534 }
535}
536void
538{
539 if(mod->getAccession().startsWith("internal:Cter_"))
540 {
542 std::vector<Aa>::iterator it(m_aaVec.end());
543 it--;
544 if(it != m_aaVec.end())
545 {
546 it->addAaModification(mod);
547 }
548 else
549 {
550 throw ExceptionOutOfRange(QObject::tr("peptide is empty"));
551 }
552 }
553 else
554 {
556 QObject::tr("modification is not an internal Cter modification : %1")
557 .arg(mod->getAccession()));
558 }
559}
560
561void
563{
566 m_aaVec.begin()->removeInternalNterModification();
568 std::rotate(m_aaVec.begin(), m_aaVec.begin() + 1, m_aaVec.end());
569 m_aaVec.begin()->addAaModification(modNter);
570 (m_aaVec.end() - 1)->addAaModification(modCter);
571}
572
573void
575{
578 m_aaVec.begin()->removeInternalNterModification();
580 std::reverse(m_aaVec.begin(), m_aaVec.end());
581 m_aaVec.begin()->addAaModification(modNter);
582 (m_aaVec.end() - 1)->addAaModification(modCter);
583}
584
585
586bool
588{
589 std::size_t size = m_aaVec.size();
590 std::size_t k = (size - 1);
591 for(std::size_t i = 0; i < (size / 2); i++, k--)
592 {
593 if(m_aaVec[i].getLetter() != m_aaVec[k].getLetter())
594 {
595 return false;
596 }
597 }
598 return true;
599}
600
601Aa &
602Peptide::getAa(unsigned int position)
603{
604 if(position >= m_aaVec.size())
605 {
607 QObject::tr("no AA at position %1").arg(position));
608 }
609 return m_aaVec.at(position);
610}
611const Aa &
612Peptide::getConstAa(unsigned int position) const
613{
614 if(position >= m_aaVec.size())
615 {
617 QObject::tr("no AA at position %1").arg(position));
618 }
619 return m_aaVec.at(position);
620}
621
622
623void
625{
626
627 std::vector<Aa>::iterator it(m_aaVec.begin());
628 std::vector<Aa>::iterator itend(m_aaVec.end());
629 for(; it != itend; it++)
630 {
631 it->replaceLeucineIsoleucine();
632 }
633}
634
635
636void
638{
639 std::vector<Aa>::iterator it(m_aaVec.begin());
640 if(it != m_aaVec.end())
641 {
642 AaModificationP nter_modification = getInternalNterModification();
643 m_aaVec.erase(it);
644 if(nter_modification != nullptr)
645 {
646 m_aaVec.begin()->addAaModification(nter_modification);
647 }
648
649 m_proxyMass = -1;
650 getMass();
651 }
652 else
653 {
654 throw ExceptionOutOfRange(QObject::tr("peptide is empty"));
655 }
656}
657
658
659void
661{
662 std::vector<Aa>::iterator it(m_aaVec.end());
663 it--;
664 if(it != m_aaVec.end())
665 {
666 AaModificationP cter_modification = getInternalCterModification();
667 m_aaVec.erase(it);
668 if(cter_modification != nullptr)
669 {
670 it = m_aaVec.end();
671 it--;
672 it->addAaModification(cter_modification);
673 }
674 m_proxyMass = -1;
675 getMass();
676 }
677 else
678 {
679 throw ExceptionOutOfRange(QObject::tr("peptide is empty"));
680 }
681}
682
683} // namespace pappso
const QString & getAccession() const
static AaModificationP getInstance(const QString &accession)
Definition: aa.h:45
void addAaModification(AaModificationP aaModification)
Definition: aa.cpp:150
void replaceLeucineIsoleucine()
Definition: peptide.cpp:624
PeptideSp makePeptideSp() const
Definition: peptide.cpp:125
Peptide(const QString &pepstr)
Definition: peptide.cpp:79
AaModificationP getInternalNterModification() const
Definition: peptide.cpp:467
virtual int getNumberOfIsotope(Isotope isotope) const override
get the number of isotopes C13, H2, O17, O18, N15, S33, S34, S36 in the molecule
Definition: peptide.cpp:304
void replaceAaModification(AaModificationP oldmod, AaModificationP newmod)
replaces all occurences of a modification by a new one
Definition: peptide.cpp:352
void removeNterAminoAcid()
Definition: peptide.cpp:637
std::vector< Aa >::const_reverse_iterator rend() const
Definition: peptide.cpp:168
std::vector< unsigned int > getModificationPositionList(AaModificationP mod) const
get modification positions
Definition: peptide.cpp:380
NoConstPeptideSp makeNoConstPeptideSp() const
Definition: peptide.cpp:131
virtual bool isPalindrome() const override
tells if the peptide sequence is a palindrome
Definition: peptide.cpp:587
std::vector< Aa >::const_reverse_iterator rbegin() const
Definition: peptide.cpp:162
const QString getLiAbsoluteString() const
get all sequence string with modifications and converting Leucine to Isoleucine
Definition: peptide.cpp:247
void removeCterAminoAcid()
Definition: peptide.cpp:660
void setInternalCterModification(AaModificationP mod)
Definition: peptide.cpp:537
const QString toAbsoluteString() const
print all modifications
Definition: peptide.cpp:234
pappso_double m_proxyMass
Definition: peptide.h:103
void removeInternalNterModification()
Definition: peptide.cpp:489
void setInternalNterModification(AaModificationP mod)
Definition: peptide.cpp:514
virtual ~Peptide()
Definition: peptide.cpp:108
void removeInternalCterModification()
Definition: peptide.cpp:500
unsigned int getNumberOfModification(AaModificationP mod) const
count modification occurence
Definition: peptide.cpp:319
void addAaModificationOnAllAminoAcid(AaModificationP aaModification, AminoAcidChar amino_acid)
adds a modification to all amino acid of the sequence
Definition: peptide.cpp:204
const QString toString() const
print modification except internal modifications
Definition: peptide.cpp:261
AaModificationP getInternalCterModification() const
Definition: peptide.cpp:478
void removeAaModification(AaModificationP mod)
removes all occurences of a modification
Definition: peptide.cpp:366
unsigned int size() const override
Definition: peptide.cpp:182
Aa & getAa(unsigned int position)
Definition: peptide.cpp:602
virtual int getNumberOfAtom(AtomIsotopeSurvey atom) const override
get the number of atom C, O, N, H in the molecule
Definition: peptide.cpp:290
std::vector< unsigned int > getAaPositionList(char aa) const
get positions of one amino acid in peptide
Definition: peptide.cpp:427
void reverse()
Definition: peptide.cpp:574
pappso_double getMass()
Definition: peptide.cpp:274
std::vector< Aa >::iterator begin()
Definition: peptide.cpp:138
const QString getSequence() const override
print amino acid sequence without modifications
Definition: peptide.cpp:222
void addAaModification(AaModificationP aaModification, unsigned int position)
adds a modification to amino acid sequence
Definition: peptide.cpp:187
std::vector< Aa >::iterator end()
Definition: peptide.cpp:144
std::vector< Aa > m_aaVec
Definition: peptide.h:102
unsigned int countModificationOnAa(AaModificationP mod, const std::vector< char > &aa_list) const
count modification occurence
Definition: peptide.cpp:333
const Aa & getConstAa(unsigned int position) const
Definition: peptide.cpp:612
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
Definition: aa.cpp:39
PeptideIon
PeptideIon enum defines all types of ions (Nter or Cter)
Definition: types.h:425
@ y
Cter amino ions.
@ ystar
Cter amino ions + NH3 loss.
@ yo
Cter amino ions + H2O loss.
@ bstar
Nter acylium ions + NH3 loss.
@ b
Nter acylium ions.
@ ao
Nter aldimine ions + H2O loss.
AminoAcidChar
Definition: types.h:159
PeptideDirection getPeptideIonDirection(PeptideIon ion_type)
get the direction of a peptide ion
Definition: peptide.cpp:70
std::shared_ptr< const Peptide > PeptideSp
PeptideDirection
Definition: peptide.h:46
AtomIsotopeSurvey
Definition: types.h:89
double pappso_double
A type definition for doubles.
Definition: types.h:50
Isotope
Definition: types.h:104
bool peptideIonTypeIsComplement(PeptideIon ion_type_ref, PeptideIon ion_type)
tells if an ion type is the complement ion of the other
Definition: peptide.cpp:43
bool peptideIonIsNter(PeptideIon ion_type)
tells if an ion is Nter
Definition: peptide.cpp:60
std::shared_ptr< Peptide > NoConstPeptideSp
Definition: peptide.h:97
peptide model
peptide natural isotope model