libpappsomspp
Library for mass spectrometry
Loading...
Searching...
No Matches
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"
38
39
40namespace pappso
41{
42
43
44bool
46{
47 return (l.m_aaVec < r.m_aaVec);
48}
49
50bool
52{
54 return false;
56 return false;
59 return false;
62 return false;
63
64 return (l.m_aaVec == r.m_aaVec);
65}
66
67bool
69{
70 if(peptideIonIsNter(ion_type))
71 std::swap(ion_type_ref, ion_type);
72 if(peptideIonIsNter(ion_type))
73 return false;
74 if((ion_type_ref == Enums::PeptideIon::b) && (ion_type == Enums::PeptideIon::y))
75 return true;
76 if((ion_type_ref == Enums::PeptideIon::ao) && (ion_type == Enums::PeptideIon::yo))
77 return true;
78 if((ion_type_ref == Enums::PeptideIon::bstar) && (ion_type == Enums::PeptideIon::ystar))
79 return true;
80
81 return false;
82}
83
84bool
86{
87 if((std::int8_t)ion_type < (std::int8_t)8)
88 {
89 return true;
90 }
91 return false;
92}
93
96{
97 if(peptideIonIsNter(ion_type))
98 {
100 }
102}
103
104Peptide::Peptide(const QString &pepstr)
105{
106 qDebug();
107 m_cleavageNterMod = AaModification::getInstance("internal:Nter_hydrolytic_cleavage_H");
108 m_cleavageCterMod = AaModification::getInstance("internal:Cter_hydrolytic_cleavage_HO");
109
110 m_NterMod = nullptr;
111 m_CterMod = nullptr;
112 QString::const_iterator it(pepstr.begin());
113
114 while(it != pepstr.end())
115 {
116 qDebug() << it->toLatin1();
117 m_aaVec.push_back(Aa(it->toLatin1()));
118 it++;
119 }
120 qDebug();
121 getMass();
122}
123
127
129 : m_aaVec(peptide.m_aaVec),
130 m_fullC13(peptide.m_fullC13),
131 m_fullN15(peptide.m_fullN15),
132 m_fullH2(peptide.m_fullH2),
133 m_proxyMass(peptide.m_proxyMass),
136 m_NterMod(peptide.m_NterMod),
137 m_CterMod(peptide.m_CterMod)
138{
139 qDebug();
140}
141
142
143Peptide::Peptide(Peptide &&toCopy) // move constructor
144 : m_aaVec(std::move(toCopy.m_aaVec)),
145 m_fullC13(toCopy.m_fullC13),
146 m_fullN15(toCopy.m_fullN15),
147 m_fullH2(toCopy.m_fullH2),
148 m_proxyMass(toCopy.m_proxyMass),
151 m_NterMod(toCopy.m_NterMod),
152 m_CterMod(toCopy.m_CterMod)
153{
154}
155
156
159{
160 return std::make_shared<const Peptide>(*this);
161}
162
165{
166 return std::make_shared<Peptide>(*this);
167}
168
169
170std::vector<Aa>::iterator
172{
173 return m_aaVec.begin();
174}
175
176std::vector<Aa>::iterator
178{
179 return m_aaVec.end();
180}
181
182std::vector<Aa>::const_iterator
184{
185 return m_aaVec.begin();
186}
187
188std::vector<Aa>::const_iterator
190{
191 return m_aaVec.end();
192}
193
194std::vector<Aa>::const_reverse_iterator
196{
197 return m_aaVec.rbegin();
198}
199
200std::vector<Aa>::const_reverse_iterator
202{
203 return m_aaVec.rend();
204}
205
206
209{
210 return m_proxyMass;
211}
212
213
214unsigned int
216{
217 return m_aaVec.size();
218}
219void
220Peptide::addAaModification(AaModificationP aaModification, unsigned int position)
221{
222 if(position >= size())
223 {
224 throw ExceptionOutOfRange(QObject::tr("position (%1) > size (%2)").arg(position).arg(size()));
225 }
226 m_proxyMass = -1;
227 qDebug() << "Peptide::addAaModification begin " << position;
228 std::vector<Aa>::iterator it = m_aaVec.begin() + position;
229 it->addAaModification(aaModification);
230 getMass();
231 qDebug() << "Peptide::addAaModification end";
232}
233
234void
236{
237
238 for(auto &aa : *this)
239 {
240 if(aa.getAminoAcidChar() == amino_acid)
241 {
242 aa.addAaModification(aaModification);
243 }
244 }
245
246
247 m_proxyMass = -1;
248 getMass();
249}
250
251const QString
253{
254 QString seq = "";
255 std::vector<Aa>::const_iterator it(m_aaVec.begin());
256 while(it != m_aaVec.end())
257 {
258 seq += it->getLetter();
259 it++;
260 }
261 return seq;
262}
263const QString
265{
266 QString seq = "";
267 std::vector<Aa>::const_iterator it(m_aaVec.begin());
268
269 QStringList modification_str_list;
270 modification_str_list << m_cleavageNterMod->getAccession();
271 if(m_NterMod != nullptr)
272 modification_str_list << m_NterMod->getAccession();
273 while(it != m_aaVec.end())
274 {
275 seq += it->getLetter();
276 if(it == m_aaVec.end() - 1)
277 {
278 modification_str_list << m_cleavageCterMod->getAccession();
279 if(m_CterMod != nullptr)
280 modification_str_list << m_CterMod->getAccession();
281 }
282 for(auto &pmod : it->getModificationList())
283 {
284 modification_str_list << pmod->getAccession();
285 }
286 if(modification_str_list.size() > 0)
287 seq += QString("(%1)").arg(modification_str_list.join(","));
288 modification_str_list.clear();
289 it++;
290 }
291 return seq;
292}
293
294const QString
296{
297 QString seq = "";
298 std::vector<Aa>::const_iterator it(m_aaVec.begin());
299 while(it != m_aaVec.end())
300 {
301 seq += it->toAbsoluteString();
302 it++;
303 }
304 return seq.replace("L", "I");
305}
306
307
308const QString
310{
311 QString seq = "";
312 std::vector<Aa>::const_iterator it(m_aaVec.begin());
313 while(it != m_aaVec.end())
314 {
315 seq += it->toString();
316 it++;
317 }
318 return seq;
319}
320
323{
324 qDebug() << "begin";
325 if(m_proxyMass < 0)
326 {
328 {
330 m_proxyMass = formula.getMass();
331 }
332 else
333 {
334 m_proxyMass = m_cleavageNterMod->getMass() + m_cleavageCterMod->getMass();
335 if(m_NterMod != nullptr)
336 m_proxyMass += m_NterMod->getMass();
337 if(m_CterMod != nullptr)
338 m_proxyMass += m_CterMod->getMass();
339 for(auto aa : m_aaVec)
340 {
341 m_proxyMass += aa.getMass();
342 }
343 }
344 }
345 qDebug() << "end " << m_proxyMass;
346 return m_proxyMass;
347}
348
349int
351{
352 int number = m_cleavageNterMod->getNumberOfAtom(atom);
353 number += m_cleavageCterMod->getNumberOfAtom(atom);
354
355 if(m_NterMod != nullptr)
356 number += m_NterMod->getNumberOfAtom(atom);
357 if(m_CterMod != nullptr)
358 number += m_CterMod->getNumberOfAtom(atom);
359 std::vector<Aa>::const_iterator it(m_aaVec.begin());
360 while(it != m_aaVec.end())
361 {
362 number += it->getNumberOfAtom(atom);
363 it++;
364 }
365 // qDebug() << "Aa::getMass() end " << mass;
366 return number;
367}
368
369int
371{
372 int number = m_cleavageNterMod->getNumberOfIsotope(isotope);
373 number += m_cleavageCterMod->getNumberOfIsotope(isotope);
374 if(m_NterMod != nullptr)
375 number += m_NterMod->getNumberOfIsotope(isotope);
376 if(m_CterMod != nullptr)
377 number += m_CterMod->getNumberOfIsotope(isotope);
378 std::vector<Aa>::const_iterator it(m_aaVec.begin());
379 while(it != m_aaVec.end())
380 {
381 number += it->getNumberOfIsotope(isotope);
382 it++;
383 }
384 // qDebug() << "Aa::getMass() end " << mass;
385 return number;
386}
387
388
389unsigned int
391{
392 unsigned int number = 0;
393 std::vector<Aa>::const_iterator it(m_aaVec.begin());
394 while(it != m_aaVec.end())
395 {
396 number += it->getNumberOfModification(mod);
397 it++;
398 }
399 // qDebug() << "Aa::getMass() end " << mass;
400 return number;
401}
402
403unsigned int
404Peptide::countModificationOnAa(AaModificationP mod, const std::vector<char> &aa_list) const
405{
406 unsigned int number = 0;
407 std::vector<Aa>::const_iterator it(m_aaVec.begin());
408 while(it != m_aaVec.end())
409 {
410 if(std::find(aa_list.begin(), aa_list.end(), it->getLetter()) != aa_list.end())
411 {
412 number += it->getNumberOfModification(mod);
413 }
414 it++;
415 }
416 // qDebug() << "Aa::getMass() end " << mass;
417 return number;
418}
419
420void
422{
423 if(oldmod == newmod)
424 return;
425 std::vector<Aa>::iterator it(m_aaVec.begin());
426 while(it != m_aaVec.end())
427 {
428 it->replaceAaModification(oldmod, newmod);
429 it++;
430 }
431 m_proxyMass = -1;
432 getMass();
433}
434
435void
437 AaModificationP oldmod,
438 AaModificationP newmod)
439{
440 if(oldmod == newmod)
441 return;
442 std::vector<Aa>::iterator it(m_aaVec.begin());
443 while(it != m_aaVec.end())
444 {
445 if(it->getAminoAcidChar() == aa)
446 {
447 it->replaceAaModification(oldmod, newmod);
448 }
449 it++;
450 }
451 m_proxyMass = -1;
452 getMass();
453}
454void
456{
457 std::vector<Aa>::iterator it(m_aaVec.begin());
458 while(it != m_aaVec.end())
459 {
460 it->removeAaModification(mod);
461 qDebug() << it->toString() << " " << toAbsoluteString();
462 it++;
463 }
464 m_proxyMass = -1;
465 getMass();
466 // qDebug() << "Aa::getMass() end " << mass;
467}
468std::vector<unsigned int>
470{
471 std::vector<unsigned int> position_list;
472 unsigned int position = 0;
473 std::vector<Aa>::const_iterator it(m_aaVec.begin());
474 while(it != m_aaVec.end())
475 {
476 unsigned int number = 0;
477 number += it->getNumberOfModification(mod);
478 for(unsigned int j = 0; j < number; j++)
479 {
480 position_list.push_back(position);
481 }
482 it++;
483 position++;
484 }
485 // qDebug() << "Aa::getMass() end " << mass;
486 return position_list;
487}
488
489std::vector<unsigned int>
490Peptide::getModificationPositionList(AaModificationP mod, const std::vector<char> &aa_list) const
491{
492 std::vector<unsigned int> position_list;
493 unsigned int position = 0;
494 std::vector<Aa>::const_iterator it(m_aaVec.begin());
495 while(it != m_aaVec.end())
496 {
497 if(std::find(aa_list.begin(), aa_list.end(), it->getLetter()) != aa_list.end())
498 {
499 unsigned int number = 0;
500 number += it->getNumberOfModification(mod);
501 for(unsigned int j = 0; j < number; j++)
502 {
503 position_list.push_back(position);
504 }
505 }
506 it++;
507 position++;
508 }
509 // qDebug() << "Aa::getMass() end " << mass;
510 return position_list;
511}
512
513std::vector<unsigned int>
515{
516 std::vector<unsigned int> position_list;
517 unsigned int number = 0;
518 std::vector<Aa>::const_iterator it(m_aaVec.begin());
519 while(it != m_aaVec.end())
520 {
521 if(it->getLetter() == aa)
522 position_list.push_back(number);
523 number++;
524 it++;
525 }
526 // qDebug() << "Aa::getMass() end " << mass;
527 return position_list;
528}
529
530std::vector<unsigned int>
531Peptide::getAaPositionList(std::list<char> list_aa) const
532{
533 std::vector<unsigned int> position_list;
534 unsigned int number = 0;
535 std::vector<Aa>::const_iterator it(m_aaVec.begin());
536 while(it != m_aaVec.end())
537 {
538
539 bool found = (std::find(list_aa.begin(), list_aa.end(), it->getLetter()) != list_aa.end());
540 if(found)
541 {
542 position_list.push_back(number);
543 }
544 number++;
545 it++;
546 }
547 // qDebug() << "Aa::getMass() end " << mass;
548 return position_list;
549}
550
551void
553{
554 if(mod->getAccession().startsWith("internal:Nter_"))
555 {
556 m_proxyMass = -1;
557 m_cleavageNterMod = mod;
558 getMass();
559 }
560 else
561 {
563 QObject::tr("modification is not a cleavage Nter modification : %1")
564 .arg(mod->getAccession()));
565 }
566}
567void
569{
570 if(mod->getAccession().startsWith("internal:Cter_"))
571 {
572 m_proxyMass = -1;
573 m_cleavageNterMod = mod;
574 getMass();
575 }
576 else
577 {
579 QObject::tr("modification is not a cleavage Cter modification : %1")
580 .arg(mod->getAccession()));
581 }
582}
583
594
595void
597{
598 if(mod != nullptr)
599 {
600 m_proxyMass = -1;
601 m_NterMod = mod;
602 getMass();
603 }
604 else
605 {
606 throw ExceptionNotPossible(QObject::tr("modification is not a peptide Nter modification : %1")
607 .arg(mod->getAccession()));
608 }
609}
610void
612{
613 if(mod != nullptr)
614 {
615 m_proxyMass = -1;
616 m_CterMod = mod;
617 getMass();
618 }
619 else
620 {
621 throw ExceptionNotPossible(QObject::tr("modification is not a peptide Cter modification : %1")
622 .arg(mod->getAccession()));
623 }
624}
625
628{
629 return m_CterMod;
630}
631
634{
635 return m_NterMod;
636}
637
638void
640{
641 std::rotate(m_aaVec.begin(), m_aaVec.begin() + 1, m_aaVec.end());
642}
643
644void
646{
647 std::reverse(m_aaVec.begin(), m_aaVec.end());
648}
649
650
651bool
653{
654 std::size_t size = m_aaVec.size();
655 std::size_t k = (size - 1);
656 for(std::size_t i = 0; i < (size / 2); i++, k--)
657 {
658 if(m_aaVec[i].getLetter() != m_aaVec[k].getLetter())
659 {
660 return false;
661 }
662 }
663 return true;
664}
665
666Aa &
667Peptide::getAa(unsigned int position)
668{
669 if(position >= m_aaVec.size())
670 {
671 throw ExceptionOutOfRange(QObject::tr("no AA at position %1").arg(position));
672 }
673 return m_aaVec.at(position);
674}
675const Aa &
676Peptide::getConstAa(unsigned int position) const
677{
678 if(position >= m_aaVec.size())
679 {
680 throw ExceptionOutOfRange(QObject::tr("no AA at position %1").arg(position));
681 }
682 return m_aaVec.at(position);
683}
684
685
686void
688{
689
690 std::vector<Aa>::iterator it(m_aaVec.begin());
691 std::vector<Aa>::iterator itend(m_aaVec.end());
692 for(; it != itend; it++)
693 {
694 it->replaceLeucineIsoleucine();
695 }
696}
697
698
699void
701{
702 std::vector<Aa>::iterator it(m_aaVec.begin());
703 if(it != m_aaVec.end())
704 {
705 m_aaVec.erase(it);
706 m_proxyMass = -1;
707 getMass();
708 }
709 else
710 {
711 throw ExceptionOutOfRange(QObject::tr("peptide is empty"));
712 }
713}
714
715
716void
718{
719 std::vector<Aa>::iterator it(m_aaVec.end());
720 it--;
721 if(it != m_aaVec.end())
722 {
723 m_aaVec.erase(it);
724 m_proxyMass = -1;
725 getMass();
726 }
727 else
728 {
729 throw ExceptionOutOfRange(QObject::tr("peptide is empty"));
730 }
731}
732
733QString
735{
736
737 QString seq = "";
738 if(m_fullC13)
739 {
740 seq += "<13C>";
741 }
742 if(m_fullN15)
743 {
744 seq += "<15N>";
745 }
746 if(m_fullH2)
747 {
748 seq += "<D>";
749 }
750
751 if(m_NterMod != nullptr)
752 {
753 QString nter_accession = m_NterMod->getAccession();
754 seq = QString("[%1]-").arg(nter_accession);
755 }
756 std::vector<Aa>::const_iterator it(m_aaVec.begin());
757 while(it != m_aaVec.end())
758 {
759 seq += it->toProForma();
760 it++;
761 }
762
763 if(m_CterMod != nullptr)
764 {
765 QString cter_accession = m_CterMod->getAccession();
766 seq += QString("-[%1]").arg(cter_accession);
767 }
768 return seq;
769}
770} // namespace pappso
771
772void
774{
775 if(isotope_kind == Enums::Isotope::C13)
776 m_fullC13 = true;
777 else if(isotope_kind == Enums::Isotope::N15)
778 m_fullN15 = true;
779 else if(isotope_kind == Enums::Isotope::H2)
780 m_fullH2 = true;
781}
782
783
789
790
793{
795
796 qDebug() << formula.toString();
797 if(m_fullC13)
798 {
800 qDebug() << formula.toString();
801 }
802 if(m_fullN15)
803 {
805 qDebug() << formula.toString();
806 }
807 if(m_fullH2)
808 {
810 qDebug() << formula.toString();
811 }
812 return formula;
813}
const QString & getAccession() const
static AaModificationP getInstance(const QString &accession)
const QString toString() const
void setFullIsotope(Enums::Isotope isotope)
set full isotope labels
virtual const ChemicalFormula getChemicalFormulaCharge(unsigned int charge) const
AaModificationP m_cleavageCterMod
Definition peptide.h:262
void replaceLeucineIsoleucine()
Definition peptide.cpp:687
PeptideSp makePeptideSp() const
Definition peptide.cpp:158
Peptide(const QString &pepstr)
Definition peptide.cpp:104
AaModificationP getCterModification() const
Definition peptide.cpp:627
void setNterModification(AaModificationP mod)
Definition peptide.cpp:596
void replaceAaModification(AaModificationP oldmod, AaModificationP newmod)
replaces all occurences of a modification by a new one
Definition peptide.cpp:421
void removeNterAminoAcid()
Definition peptide.cpp:700
std::vector< Aa >::const_reverse_iterator rend() const
Definition peptide.cpp:201
virtual const ChemicalFormula getChemicalFormulaCharge(unsigned int charge) const override
Definition peptide.cpp:792
std::vector< unsigned int > getModificationPositionList(AaModificationP mod) const
get modification positions
Definition peptide.cpp:469
NoConstPeptideSp makeNoConstPeptideSp() const
Definition peptide.cpp:164
virtual int getNumberOfIsotope(Enums::Isotope isotope) const override
get the number of isotopes C13, H2, O17, O18, N15, S33, S34, S36 in the molecule
Definition peptide.cpp:370
virtual bool isPalindrome() const override
tells if the peptide sequence is a palindrome
Definition peptide.cpp:652
std::vector< Aa >::const_reverse_iterator rbegin() const
Definition peptide.cpp:195
AaModificationP getCleavageCterModification() const
Definition peptide.cpp:590
const QString getLiAbsoluteString() const
get all sequence string with modifications and converting Leucine to Isoleucine
Definition peptide.cpp:295
void removeCterAminoAcid()
Definition peptide.cpp:717
void setGlobalModification(Enums::Isotope isotope_kind)
apply 100% isotope replacement
Definition peptide.cpp:773
void setCleavageCterModification(AaModificationP mod)
Definition peptide.cpp:568
void setCterModification(AaModificationP mod)
Definition peptide.cpp:611
AaModificationP m_NterMod
Definition peptide.h:263
virtual const ChemicalFormula getChemicalFormula() const override
Definition peptide.cpp:785
void replaceAaModificationOnAminoAcid(Enums::AminoAcidChar aa, pappso::AaModificationP oldmod, pappso::AaModificationP newmod)
replaces all occurences of a modification by a new one on a specific amino acid
Definition peptide.cpp:436
AaModificationP m_cleavageNterMod
Definition peptide.h:260
const QString toAbsoluteString() const
print all modifications
Definition peptide.cpp:264
virtual ~Peptide()
Definition peptide.cpp:124
AaModificationP getNterModification() const
Definition peptide.cpp:633
unsigned int getNumberOfModification(AaModificationP mod) const
count modification occurence
Definition peptide.cpp:390
const QString toString() const
print modification except internal modifications
Definition peptide.cpp:309
QString toProForma() const
get the peptide model in ProForma notation https://github.com/HUPO-PSI/ProForma/blob/master/README....
Definition peptide.cpp:734
AaModificationP getCleavageNterModification() const
Definition peptide.cpp:585
void removeAaModification(AaModificationP mod)
removes all occurences of a modification
Definition peptide.cpp:455
unsigned int size() const override
Definition peptide.cpp:215
virtual int getNumberOfAtom(Enums::AtomIsotopeSurvey atom) const override
get the number of atom C, O, N, H in the molecule
Definition peptide.cpp:350
void setCleavageNterModification(AaModificationP mod)
Definition peptide.cpp:552
Aa & getAa(unsigned int position)
Definition peptide.cpp:667
void addAaModificationOnAllAminoAcid(AaModificationP aaModification, Enums::AminoAcidChar amino_acid)
adds a modification to all amino acid of the sequence
Definition peptide.cpp:235
std::vector< unsigned int > getAaPositionList(char aa) const
get positions of one amino acid in peptide
Definition peptide.cpp:514
pappso_double getMass()
Definition peptide.cpp:322
std::vector< Aa >::iterator begin()
Definition peptide.cpp:171
const QString getSequence() const override
print amino acid sequence without modifications
Definition peptide.cpp:252
void addAaModification(AaModificationP aaModification, unsigned int position)
adds a modification to amino acid sequence
Definition peptide.cpp:220
std::vector< Aa >::iterator end()
Definition peptide.cpp:177
double m_proxyMass
Definition peptide.h:258
AaModificationP m_CterMod
Definition peptide.h:264
std::vector< Aa > m_aaVec
Definition peptide.h:254
unsigned int countModificationOnAa(AaModificationP mod, const std::vector< char > &aa_list) const
count modification occurence
Definition peptide.cpp:404
const Aa & getConstAa(unsigned int position) const
Definition peptide.cpp:676
PeptideIon
Enums::PeptideIon enum defines all types of ions (Nter or Cter)
Definition types.h:286
@ y
Cter amino ions.
Definition types.h:295
@ ystar
Cter amino ions + NH3 loss.
Definition types.h:296
@ yo
Cter amino ions + H2O loss.
Definition types.h:297
@ bstar
Nter acylium ions + NH3 loss.
Definition types.h:288
@ b
Nter acylium ions.
Definition types.h:287
@ ao
Nter aldimine ions + H2O loss.
Definition types.h:292
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
Definition aa.cpp:39
bool peptideIonTypeIsComplement(Enums::PeptideIon ion_type_ref, Enums::PeptideIon ion_type)
tells if an ion type is the complement ion of the other
Definition peptide.cpp:68
bool operator<(Aa const &l, Aa const &r)
Definition aa.cpp:292
std::shared_ptr< const Peptide > PeptideSp
PeptideDirection
Definition peptide.h:46
const AaModification * AaModificationP
double pappso_double
A type definition for doubles.
Definition types.h:61
PeptideDirection getPeptideIonDirection(Enums::PeptideIon ion_type)
get the direction of a peptide ion
Definition peptide.cpp:95
bool peptideIonIsNter(Enums::PeptideIon ion_type)
tells if an ion is Nter
Definition peptide.cpp:85
bool operator==(Aa const &l, Aa const &r)
Definition aa.cpp:286
std::shared_ptr< Peptide > NoConstPeptideSp
Definition peptide.h:96