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 Enums::AminoAcidChar amino_acid)
237{
238
239 for(auto &aa : *this)
240 {
241 if(aa.getAminoAcidChar() == amino_acid)
242 {
243 aa.addAaModification(aaModification);
244 }
245 }
246
247
248 m_proxyMass = -1;
249 getMass();
250}
251
252const QString
254{
255 QString seq = "";
256 std::vector<Aa>::const_iterator it(m_aaVec.begin());
257 while(it != m_aaVec.end())
258 {
259 seq += it->getLetter();
260 it++;
261 }
262 return seq;
263}
264const QString
266{
267 QString seq = "";
268 std::vector<Aa>::const_iterator it(m_aaVec.begin());
269
270 QStringList modification_str_list;
271 modification_str_list << m_cleavageNterMod->getAccession();
272 if(m_NterMod != nullptr)
273 modification_str_list << m_NterMod->getAccession();
274 while(it != m_aaVec.end())
275 {
276 seq += it->getLetter();
277 if(it == m_aaVec.end() - 1)
278 {
279 modification_str_list << m_cleavageCterMod->getAccession();
280 if(m_CterMod != nullptr)
281 modification_str_list << m_CterMod->getAccession();
282 }
283 for(auto &pmod : it->getModificationList())
284 {
285 modification_str_list << pmod->getAccession();
286 }
287 if(modification_str_list.size() > 0)
288 seq += QString("(%1)").arg(modification_str_list.join(","));
289 modification_str_list.clear();
290 it++;
291 }
292 return seq;
293}
294
295const QString
297{
298 QString seq = "";
299 std::vector<Aa>::const_iterator it(m_aaVec.begin());
300 while(it != m_aaVec.end())
301 {
302 seq += it->toAbsoluteString();
303 it++;
304 }
305 return seq.replace("L", "I");
306}
307
308
309const QString
311{
312 QString seq = "";
313 std::vector<Aa>::const_iterator it(m_aaVec.begin());
314 while(it != m_aaVec.end())
315 {
316 seq += it->toString();
317 it++;
318 }
319 return seq;
320}
321
324{
325 qDebug() << "begin";
326 if(m_proxyMass < 0)
327 {
329 {
331 m_proxyMass = formula.getMass();
332 }
333 else
334 {
335 m_proxyMass = m_cleavageNterMod->getMass() + m_cleavageCterMod->getMass();
336 if(m_NterMod != nullptr)
337 m_proxyMass += m_NterMod->getMass();
338 if(m_CterMod != nullptr)
339 m_proxyMass += m_CterMod->getMass();
340 for(auto aa : m_aaVec)
341 {
342 m_proxyMass += aa.getMass();
343 }
344 }
345 }
346 qDebug() << "end " << m_proxyMass;
347 return m_proxyMass;
348}
349
350int
352{
353 int number = m_cleavageNterMod->getNumberOfAtom(atom);
354 number += m_cleavageCterMod->getNumberOfAtom(atom);
355
356 if(m_NterMod != nullptr)
357 number += m_NterMod->getNumberOfAtom(atom);
358 if(m_CterMod != nullptr)
359 number += m_CterMod->getNumberOfAtom(atom);
360 std::vector<Aa>::const_iterator it(m_aaVec.begin());
361 while(it != m_aaVec.end())
362 {
363 number += it->getNumberOfAtom(atom);
364 it++;
365 }
366 // qDebug() << "Aa::getMass() end " << mass;
367 return number;
368}
369
370int
372{
373 int number = m_cleavageNterMod->getNumberOfIsotope(isotope);
374 number += m_cleavageCterMod->getNumberOfIsotope(isotope);
375 if(m_NterMod != nullptr)
376 number += m_NterMod->getNumberOfIsotope(isotope);
377 if(m_CterMod != nullptr)
378 number += m_CterMod->getNumberOfIsotope(isotope);
379 std::vector<Aa>::const_iterator it(m_aaVec.begin());
380 while(it != m_aaVec.end())
381 {
382 number += it->getNumberOfIsotope(isotope);
383 it++;
384 }
385 // qDebug() << "Aa::getMass() end " << mass;
386 return number;
387}
388
389
390unsigned int
392{
393 unsigned int number = 0;
394 std::vector<Aa>::const_iterator it(m_aaVec.begin());
395 while(it != m_aaVec.end())
396 {
397 number += it->getNumberOfModification(mod);
398 it++;
399 }
400 // qDebug() << "Aa::getMass() end " << mass;
401 return number;
402}
403
404unsigned int
405Peptide::countModificationOnAa(AaModificationP mod, const std::vector<char> &aa_list) const
406{
407 unsigned int number = 0;
408 std::vector<Aa>::const_iterator it(m_aaVec.begin());
409 while(it != m_aaVec.end())
410 {
411 if(std::find(aa_list.begin(), aa_list.end(), it->getLetter()) != aa_list.end())
412 {
413 number += it->getNumberOfModification(mod);
414 }
415 it++;
416 }
417 // qDebug() << "Aa::getMass() end " << mass;
418 return number;
419}
420
421void
423{
424 if(oldmod == newmod)
425 return;
426 std::vector<Aa>::iterator it(m_aaVec.begin());
427 while(it != m_aaVec.end())
428 {
429 it->replaceAaModification(oldmod, newmod);
430 it++;
431 }
432 m_proxyMass = -1;
433 getMass();
434}
435
436void
438 AaModificationP oldmod,
439 AaModificationP newmod)
440{
441 if(oldmod == newmod)
442 return;
443 std::vector<Aa>::iterator it(m_aaVec.begin());
444 while(it != m_aaVec.end())
445 {
446 if(it->getAminoAcidChar() == aa)
447 {
448 it->replaceAaModification(oldmod, newmod);
449 }
450 it++;
451 }
452 m_proxyMass = -1;
453 getMass();
454}
455void
457{
458 std::vector<Aa>::iterator it(m_aaVec.begin());
459 while(it != m_aaVec.end())
460 {
461 it->removeAaModification(mod);
462 qDebug() << it->toString() << " " << toAbsoluteString();
463 it++;
464 }
465 m_proxyMass = -1;
466 getMass();
467 // qDebug() << "Aa::getMass() end " << mass;
468}
469std::vector<unsigned int>
471{
472 std::vector<unsigned int> position_list;
473 unsigned int position = 0;
474 std::vector<Aa>::const_iterator it(m_aaVec.begin());
475 while(it != m_aaVec.end())
476 {
477 unsigned int number = 0;
478 number += it->getNumberOfModification(mod);
479 for(unsigned int j = 0; j < number; j++)
480 {
481 position_list.push_back(position);
482 }
483 it++;
484 position++;
485 }
486 // qDebug() << "Aa::getMass() end " << mass;
487 return position_list;
488}
489
490std::vector<unsigned int>
491Peptide::getModificationPositionList(AaModificationP mod, const std::vector<char> &aa_list) const
492{
493 std::vector<unsigned int> position_list;
494 unsigned int position = 0;
495 std::vector<Aa>::const_iterator it(m_aaVec.begin());
496 while(it != m_aaVec.end())
497 {
498 if(std::find(aa_list.begin(), aa_list.end(), it->getLetter()) != aa_list.end())
499 {
500 unsigned int number = 0;
501 number += it->getNumberOfModification(mod);
502 for(unsigned int j = 0; j < number; j++)
503 {
504 position_list.push_back(position);
505 }
506 }
507 it++;
508 position++;
509 }
510 // qDebug() << "Aa::getMass() end " << mass;
511 return position_list;
512}
513
514std::vector<unsigned int>
516{
517 std::vector<unsigned int> position_list;
518 unsigned int number = 0;
519 std::vector<Aa>::const_iterator it(m_aaVec.begin());
520 while(it != m_aaVec.end())
521 {
522 if(it->getLetter() == aa)
523 position_list.push_back(number);
524 number++;
525 it++;
526 }
527 // qDebug() << "Aa::getMass() end " << mass;
528 return position_list;
529}
530
531std::vector<unsigned int>
532Peptide::getAaPositionList(std::list<char> list_aa) const
533{
534 std::vector<unsigned int> position_list;
535 unsigned int number = 0;
536 std::vector<Aa>::const_iterator it(m_aaVec.begin());
537 while(it != m_aaVec.end())
538 {
539
540 bool found = (std::find(list_aa.begin(), list_aa.end(), it->getLetter()) != list_aa.end());
541 if(found)
542 {
543 position_list.push_back(number);
544 }
545 number++;
546 it++;
547 }
548 // qDebug() << "Aa::getMass() end " << mass;
549 return position_list;
550}
551
552void
554{
555 if(mod->getAccession().startsWith("internal:Nter_"))
556 {
557 m_proxyMass = -1;
558 m_cleavageNterMod = mod;
559 getMass();
560 }
561 else
562 {
564 QObject::tr("modification is not a cleavage Nter modification : %1")
565 .arg(mod->getAccession()));
566 }
567}
568void
570{
571 if(mod->getAccession().startsWith("internal:Cter_"))
572 {
573 m_proxyMass = -1;
574 m_cleavageNterMod = mod;
575 getMass();
576 }
577 else
578 {
580 QObject::tr("modification is not a cleavage Cter modification : %1")
581 .arg(mod->getAccession()));
582 }
583}
584
595
596void
598{
599 if(mod != nullptr)
600 {
601 m_proxyMass = -1;
602 m_NterMod = mod;
603 getMass();
604 }
605 else
606 {
608 QObject::tr("modification is not a peptide Nter modification : mod == nulptr"));
609 }
610}
611void
613{
614 if(mod != nullptr)
615 {
616 m_proxyMass = -1;
617 m_CterMod = mod;
618 getMass();
619 }
620 else
621 {
623 QObject::tr("modification is not a peptide Cter modification : mod == nulptr"));
624 }
625}
626
629{
630 return m_CterMod;
631}
632
635{
636 return m_NterMod;
637}
638
639void
641{
642 std::rotate(m_aaVec.begin(), m_aaVec.begin() + 1, m_aaVec.end());
643}
644
645void
647{
648 std::reverse(m_aaVec.begin(), m_aaVec.end());
649}
650
651
652bool
654{
655 std::size_t size = m_aaVec.size();
656 std::size_t k = (size - 1);
657 for(std::size_t i = 0; i < (size / 2); i++, k--)
658 {
659 if(m_aaVec[i].getLetter() != m_aaVec[k].getLetter())
660 {
661 return false;
662 }
663 }
664 return true;
665}
666
667Aa &
668Peptide::getAa(unsigned int position)
669{
670 if(position >= m_aaVec.size())
671 {
672 throw ExceptionOutOfRange(QObject::tr("no AA at position %1").arg(position));
673 }
674 return m_aaVec.at(position);
675}
676const Aa &
677Peptide::getConstAa(unsigned int position) const
678{
679 if(position >= m_aaVec.size())
680 {
681 throw ExceptionOutOfRange(QObject::tr("no AA at position %1").arg(position));
682 }
683 return m_aaVec.at(position);
684}
685
686
687void
689{
690
691 std::vector<Aa>::iterator it(m_aaVec.begin());
692 std::vector<Aa>::iterator itend(m_aaVec.end());
693 for(; it != itend; it++)
694 {
695 it->replaceLeucineIsoleucine();
696 }
697}
698
699
700void
702{
703 std::vector<Aa>::iterator it(m_aaVec.begin());
704 if(it != m_aaVec.end())
705 {
706 m_aaVec.erase(it);
707 m_proxyMass = -1;
708 getMass();
709 }
710 else
711 {
712 throw ExceptionOutOfRange(QObject::tr("peptide is empty"));
713 }
714}
715
716
717void
719{
720 std::vector<Aa>::iterator it(m_aaVec.end());
721 it--;
722 if(it != m_aaVec.end())
723 {
724 m_aaVec.erase(it);
725 m_proxyMass = -1;
726 getMass();
727 }
728 else
729 {
730 throw ExceptionOutOfRange(QObject::tr("peptide is empty"));
731 }
732}
733
734QString
736{
737
738 QString seq = "";
739 if(m_fullC13)
740 {
741 seq += "<13C>";
742 }
743 if(m_fullN15)
744 {
745 seq += "<15N>";
746 }
747 if(m_fullH2)
748 {
749 seq += "<D>";
750 }
751
752 if(m_NterMod != nullptr)
753 {
754 QString nter_accession = m_NterMod->getAccession();
755 seq = QString("[%1]-").arg(nter_accession);
756 }
757 std::vector<Aa>::const_iterator it(m_aaVec.begin());
758 while(it != m_aaVec.end())
759 {
760 seq += it->toProForma();
761 it++;
762 }
763
764 if(m_CterMod != nullptr)
765 {
766 QString cter_accession = m_CterMod->getAccession();
767 seq += QString("-[%1]").arg(cter_accession);
768 }
769 return seq;
770}
771} // namespace pappso
772
773void
775{
776 if(isotope_kind == Enums::Isotope::C13)
777 m_fullC13 = true;
778 else if(isotope_kind == Enums::Isotope::N15)
779 m_fullN15 = true;
780 else if(isotope_kind == Enums::Isotope::H2)
781 m_fullH2 = true;
782}
783
784
790
791
794{
796
797 qDebug() << formula.toString();
798 if(m_fullC13)
799 {
801 qDebug() << formula.toString();
802 }
803 if(m_fullN15)
804 {
806 qDebug() << formula.toString();
807 }
808 if(m_fullH2)
809 {
811 qDebug() << formula.toString();
812 }
813 return formula;
814}
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:688
PeptideSp makePeptideSp() const
Definition peptide.cpp:158
Peptide(const QString &pepstr)
Definition peptide.cpp:104
AaModificationP getCterModification() const
Definition peptide.cpp:628
void setNterModification(AaModificationP mod)
Definition peptide.cpp:597
void replaceAaModification(AaModificationP oldmod, AaModificationP newmod)
replaces all occurences of a modification by a new one
Definition peptide.cpp:422
void removeNterAminoAcid()
Definition peptide.cpp:701
std::vector< Aa >::const_reverse_iterator rend() const
Definition peptide.cpp:201
virtual const ChemicalFormula getChemicalFormulaCharge(unsigned int charge) const override
Definition peptide.cpp:793
std::vector< unsigned int > getModificationPositionList(AaModificationP mod) const
get modification positions
Definition peptide.cpp:470
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:371
virtual bool isPalindrome() const override
tells if the peptide sequence is a palindrome
Definition peptide.cpp:653
std::vector< Aa >::const_reverse_iterator rbegin() const
Definition peptide.cpp:195
AaModificationP getCleavageCterModification() const
Definition peptide.cpp:591
const QString getLiAbsoluteString() const
get all sequence string with modifications and converting Leucine to Isoleucine
Definition peptide.cpp:296
void removeCterAminoAcid()
Definition peptide.cpp:718
void setGlobalModification(Enums::Isotope isotope_kind)
apply 100% isotope replacement
Definition peptide.cpp:774
void setCleavageCterModification(AaModificationP mod)
Definition peptide.cpp:569
void setCterModification(AaModificationP mod)
Definition peptide.cpp:612
AaModificationP m_NterMod
Definition peptide.h:263
virtual const ChemicalFormula getChemicalFormula() const override
Definition peptide.cpp:786
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:437
AaModificationP m_cleavageNterMod
Definition peptide.h:260
const QString toAbsoluteString() const
print all modifications
Definition peptide.cpp:265
virtual ~Peptide()
Definition peptide.cpp:124
AaModificationP getNterModification() const
Definition peptide.cpp:634
unsigned int getNumberOfModification(AaModificationP mod) const
count modification occurence
Definition peptide.cpp:391
const QString toString() const
print modification except internal modifications
Definition peptide.cpp:310
QString toProForma() const
get the peptide model in ProForma notation https://github.com/HUPO-PSI/ProForma/blob/master/README....
Definition peptide.cpp:735
AaModificationP getCleavageNterModification() const
Definition peptide.cpp:586
void removeAaModification(AaModificationP mod)
removes all occurences of a modification
Definition peptide.cpp:456
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:351
void setCleavageNterModification(AaModificationP mod)
Definition peptide.cpp:553
Aa & getAa(unsigned int position)
Definition peptide.cpp:668
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:515
pappso_double getMass()
Definition peptide.cpp:323
std::vector< Aa >::iterator begin()
Definition peptide.cpp:171
const QString getSequence() const override
print amino acid sequence without modifications
Definition peptide.cpp:253
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:405
const Aa & getConstAa(unsigned int position) const
Definition peptide.cpp:677
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:60
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