31#include <QRegularExpression>
37#include "../pappsoexception.h"
38#include "../mzrange.h"
39#include "../peptide/peptide.h"
40#include "../obo/filterobopsimodsink.h"
41#include "../obo/filterobopsimodtermaccession.h"
42#include "../exception/exceptionnotfound.h"
57 : m_accession(accession), m_mass(mass)
77 : m_accession(toCopy.m_accession),
78 m_name(toCopy.m_name),
79 m_mass(toCopy.m_mass),
80 m_atomCount(std::move(toCopy.m_atomCount)),
81 m_mapIsotope(toCopy.m_mapIsotope)
104 MapAccessionModifications ret;
125 if(accession ==
"internal:Nter_hydrolytic_cleavage_H")
131 term.
m_name =
"Nter hydrolytic cleavage H+";
134 if(accession ==
"internal:Cter_hydrolytic_cleavage_HO")
140 term.
m_name =
"Cter hydrolytic cleavage HO";
143 if(accession.startsWith(
"MUTATION:"))
145 QRegularExpression regexp_mutation(
"^MUTATION:([A-Z])=>([A-Z])$");
146 QRegularExpressionMatch match = regexp_mutation.match(accession);
149 qDebug() << match.captured(1).at(0) <<
" " << match.captured(2).at(0);
151 Aa aa_from(match.captured(1).toStdString().c_str()[0]);
152 Aa aa_to(match.captured(2).toStdString().c_str()[0]);
155 return instance_mutation;
187 QRegularExpression rx(
"(^|\\s)([C,H,O,N,H,S])\\s([-]{0,1}\\d+)");
189 QRegularExpressionMatchIterator match_it = rx.globalMatch(diff_formula);
191 while(match_it.hasNext())
193 QRegularExpressionMatch match_rx = match_it.next();
194 qDebug() << match_rx.captured(2) <<
" " << match_rx.captured(3);
195 if(match_rx.captured(2) ==
"C")
199 else if(match_rx.captured(2) ==
"H")
203 else if(match_rx.captured(2) ==
"N")
207 else if(match_rx.captured(2) ==
"O")
211 else if(match_rx.captured(2) ==
"S")
218 rx.setPattern(
"\\(([-]{0,1}\\d+)\\)([C,H,O,N,H,S])\\s([-]{0,1}\\d+)");
220 match_it = rx.globalMatch(diff_formula);
222 while(match_it.hasNext())
224 QRegularExpressionMatch match_rx = match_it.next();
225 qDebug() << match_rx.captured(1) <<
" " << match_rx.captured(2) <<
" "
226 << match_rx.captured(3);
227 int number_of_isotopes = match_rx.captured(3).toInt();
228 if(match_rx.captured(2) ==
"C")
230 if(match_rx.captured(1) ==
"13")
236 else if(match_rx.captured(2) ==
"H")
238 if(match_rx.captured(1) ==
"2")
244 else if(match_rx.captured(2) ==
"N")
246 if(match_rx.captured(1) ==
"15")
252 else if(match_rx.captured(2) ==
"O")
254 if(match_rx.captured(1) ==
"17")
258 else if(match_rx.captured(1) ==
"18")
264 else if(match_rx.captured(2) ==
"S")
266 if(match_rx.captured(1) ==
"33")
270 else if(match_rx.captured(1) ==
"34")
274 else if(match_rx.captured(1) ==
"36")
291 std::map<AtomIsotopeSurvey, int>::const_iterator it_atom =
295 theoreticalm_mass +=
MASSCARBON * (it_atom->second);
300 theoreticalm_mass +=
MPROTIUM * (it_atom->second);
306 theoreticalm_mass +=
MASSOXYGEN * (it_atom->second);
317 theoreticalm_mass +=
MASSSULFUR * (it_atom->second);
320 qDebug() << theoreticalm_mass;
335 m_mass = theoreticalm_mass;
341 <<
"ERROR in AaModification::calculateMassFromChemicalComponents theo="
342 << theoreticalm_mass <<
" m=" <<
m_mass <<
" diff=" << diff
350 QString accession = QString(
"%1").arg(modificationMass);
351 qDebug() << accession;
373 MapAccessionModifications::iterator it =
379 std::pair<MapAccessionModifications::iterator, bool> insert_res =
381 std::pair<QString, AaModificationP>(
383 it = insert_res.first;
394 QObject::tr(
"ERROR getting instance of : %1 NOT FOUND\n%2")
404 catch(std::exception &e)
417 MapAccessionModifications::iterator it =
422 std::pair<MapAccessionModifications::iterator, bool> insert_res =
425 it = insert_res.first;
439 unsigned int position)
508 if(peptide_sp.get()->size() == (position + 1))
512 if((position == 0) || isCter)
531 QObject::tr(
"tandem modification not found : %1 %2 %3 %4")
534 .arg(peptide_sp.get()->getSequence())
561 catch(std::exception &e)
564 QObject::tr(
"ERROR in AaModification::getNumberOfIsotope %2")
600 instance_mutation->
m_name = QString(
"mutation from %1 to %2")
603 return instance_mutation;
610 QString accession(QString(
"MUTATION:%1=>%2").arg(mut_from).arg(mut_to));
614 MapAccessionModifications::iterator it =
618 Aa aa_from(mut_from.toLatin1());
619 Aa aa_to(mut_to.toLatin1());
623 std::pair<MapAccessionModifications::iterator, bool> insert_res =
625 std::pair<QString, AaModificationP>(accession,
627 it = insert_res.first;
638 QObject::tr(
"ERROR getting instance of : %1 NOT FOUND\n%2")
648 catch(std::exception &e)
amino acid modification model
virtual const char & getLetter() const
const QString & getName() const
static AaModificationP getInstanceMutation(const QChar &mut_from, const QChar &mut_to)
get a fake modification coding a mutation from an amino acid to an other
static AaModificationP createInstance(const QString &saccession)
std::map< Isotope, int > m_mapIsotope
const QString & getAccession() const
static AaModificationP getInstanceXtandemMod(const QString &type, pappso_double mass, const PeptideSp &peptide_sp, unsigned int position)
AaModification(AaModification &&toCopy)
std::map< AtomIsotopeSurvey, int > m_atomCount
int getNumberOfAtom(AtomIsotopeSurvey atom) const override final
get the number of atom C, O, N, H in the molecule
pappso_double getMass() const
void setXrefOrigin(const QString &origin)
set list of amino acid on which this modification takes place
std::map< QString, AaModificationP > MapAccessionModifications
static AaModificationP getInstance(const QString &accession)
static AaModificationP getInstanceCustomizedMod(pappso_double modificationMass)
const QString m_accession
void setDiffFormula(const QString &diff_formula)
static AaModificationP createInstanceMutation(const Aa &aa_from, const Aa &aa_to)
void calculateMassFromChemicalComponents()
static MapAccessionModifications m_mapAccessionModifications
int getNumberOfIsotope(Isotope isotope) const override final
get the number of isotopes C13, H2, O17, O18, N15, S33, S34, S36 in the molecule
int getNumberOfAtom(AtomIsotopeSurvey atom) const override final
get the number of atom C, O, N, H in the molecule
pappso_double getMass() const override
const OboPsiModTerm & getOne()
const char * what() const noexcept override
virtual const QString & qwhat() const
static PrecisionPtr getDaltonInstance(pappso_double value)
get a Dalton precision pointer
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
const pappso_double DIFFS32S33(32.9714589101 - MASSSULFUR)
const pappso_double DIFFS32S34(33.9678670300 - MASSSULFUR)
const pappso_double DIFFO16O17(16.99913150 - MASSOXYGEN)
const pappso_double MASSCARBON(12)
const pappso_double MASSSULFUR(31.9720711741)
std::shared_ptr< const Peptide > PeptideSp
const pappso_double DIFFS32S36(35.9670812000 - MASSSULFUR)
const AaModification * AaModificationP
double pappso_double
A type definition for doubles.
const pappso_double MPROTIUM(1.007825032241)
const pappso_double MASSNITROGEN(14.0030740048)
const pappso_double MASSOXYGEN(15.99491461956)
const pappso_double DIFFO16O18(17.9991610 - MASSOXYGEN)
const pappso_double DIFFN14N15(15.0001088982 - MASSNITROGEN)
const pappso_double DIFFC12C13(1.0033548378)
const pappso_double DIFFH1H2(2.0141017778 - MPROTIUM)