From 29591281c1cb5c2ccda5d709acf888d292f8e8cf Mon Sep 17 00:00:00 2001
From: Olivier Langella <olivier.langella@u-psud.fr>
Date: Thu, 21 Mar 2019 16:03:02 +0100
Subject: [PATCH] mutation support

---
 src/input/xtandemsaxhandler.cpp | 70 ++++++++++++++++++++++-----------
 src/utils/peptidestore.cpp      | 17 +++++---
 2 files changed, 59 insertions(+), 28 deletions(-)

diff --git a/src/input/xtandemsaxhandler.cpp b/src/input/xtandemsaxhandler.cpp
index 57b17071..dfb409b7 100644
--- a/src/input/xtandemsaxhandler.cpp
+++ b/src/input/xtandemsaxhandler.cpp
@@ -40,7 +40,8 @@
 
 
 XtandemSaxHandler::XtandemSaxHandler(
-  Project *p_project, IdentificationGroup *p_identification_group,
+  Project *p_project,
+  IdentificationGroup *p_identification_group,
   IdentificationDataSource *p_identification_data_source)
   : _p_project(p_project)
 {
@@ -57,7 +58,8 @@ XtandemSaxHandler::~XtandemSaxHandler()
 
 bool
 XtandemSaxHandler::startElement(const QString &namespaceURI,
-                                const QString &localName, const QString &qName,
+                                const QString &localName,
+                                const QString &qName,
                                 const QXmlAttributes &attributes)
 {
   // qDebug() << namespaceURI << " " << localName << " " << qName ;
@@ -96,8 +98,9 @@ XtandemSaxHandler::startElement(const QString &namespaceURI,
     }
   catch(pappso::PappsoException &exception_pappso)
     {
-      _errorStr = QObject::tr("ERROR in XtandemSaxHandler::startElement tag "
-                              "%1, PAPPSO exception:\n%2")
+      _errorStr = QObject::tr(
+                    "ERROR in XtandemSaxHandler::startElement tag "
+                    "%1, PAPPSO exception:\n%2")
                     .arg(qName)
                     .arg(exception_pappso.qwhat());
       return false;
@@ -116,7 +119,8 @@ XtandemSaxHandler::startElement(const QString &namespaceURI,
 
 bool
 XtandemSaxHandler::endElement(const QString &namespaceURI,
-                              const QString &localName, const QString &qName)
+                              const QString &localName,
+                              const QString &qName)
 {
 
   bool is_ok = true;
@@ -138,8 +142,9 @@ XtandemSaxHandler::endElement(const QString &namespaceURI,
     }
   catch(pappso::PappsoException &exception_pappso)
     {
-      _errorStr = QObject::tr("ERROR in XtandemSaxHandler::endElement tag %1, "
-                              "PAPPSO exception:\n%2")
+      _errorStr = QObject::tr(
+                    "ERROR in XtandemSaxHandler::endElement tag %1, "
+                    "PAPPSO exception:\n%2")
                     .arg(qName)
                     .arg(exception_pappso.qwhat());
       return false;
@@ -219,9 +224,10 @@ XtandemSaxHandler::startElement_file(QXmlAttributes attributes)
       //                     attrs.getValue("URL")));
       if(_p_protein_match == nullptr)
         {
-          throw pappso::PappsoException("ERROR in "
-                                        "XtandemSaxHandler::startElement_file "
-                                        ": _p_protein_match == nullptr");
+          throw pappso::PappsoException(
+            "ERROR in "
+            "XtandemSaxHandler::startElement_file "
+            ": _p_protein_match == nullptr");
         }
       _p_protein_match->getProteinXtpSp().get()->setFastaFileP(
         _p_project->getFastaFileStore()
@@ -251,9 +257,10 @@ XtandemSaxHandler::startElement_domain(QXmlAttributes attributes)
       //""));
       if(_p_protein_match == nullptr)
         {
-          throw pappso::PappsoException("ERROR in "
-                                        "XtandemSaxHandler::startElement_"
-                                        "domain : _p_protein_match == nullptr");
+          throw pappso::PappsoException(
+            "ERROR in "
+            "XtandemSaxHandler::startElement_"
+            "domain : _p_protein_match == nullptr");
         }
 
       _p_protein_match->getProteinXtpSp().get()->setSequence(_current_text);
@@ -387,11 +394,25 @@ bool
 XtandemSaxHandler::startElement_aa(QXmlAttributes attributes)
 {
   //<aa type="M" at="624" modified="15.99491" />
+
   bool is_ok = true;
   // qDebug() << "startElement_aa ";
-  pappso::AaModificationP modif =
-    Utils::guessAaModificationPbyMonoisotopicMassDelta(
-      attributes.value("modified").simplified().toDouble());
+  pappso::AaModificationP modif = nullptr;
+  if(attributes.value("pm").isEmpty())
+    {
+
+      modif = Utils::guessAaModificationPbyMonoisotopicMassDelta(
+        attributes.value("modified").simplified().toDouble());
+    }
+  else
+    {
+      //<aa type="P" at="59" modified="31.98983" pm="E" />
+      //<aa type="C" at="64" modified="-15.97716" pm="S" />
+      // point mutation
+      QChar mut_from(attributes.value("type")[0]);
+      QChar mut_to(attributes.value("pm")[0]);
+      modif = pappso::AaModification::getInstanceMutation(mut_from, mut_to);
+    }
   unsigned int position_in_prot =
     attributes.value("at").simplified().toUInt() - 1;
   _current_peptide_sp.get()->addAaModification(
@@ -415,9 +436,10 @@ XtandemSaxHandler::endElement_domain()
       .getInstance(_p_peptide_evidence));
   if(_p_protein_match == nullptr)
     {
-      throw pappso::PappsoException("ERROR in "
-                                    "XtandemSaxHandler::endElement_domain : "
-                                    "_p_protein_match == nullptr");
+      throw pappso::PappsoException(
+        "ERROR in "
+        "XtandemSaxHandler::endElement_domain : "
+        "_p_protein_match == nullptr");
     }
 
   _p_protein_match->addPeptideMatch(_current_peptide_match);
@@ -713,8 +735,9 @@ XtandemSaxHandler::endElement_note()
 bool
 XtandemSaxHandler::error(const QXmlParseException &exception)
 {
-  _errorStr = QObject::tr("Parse error at line %1, column %2 :\n"
-                          "%3")
+  _errorStr = QObject::tr(
+                "Parse error at line %1, column %2 :\n"
+                "%3")
                 .arg(exception.lineNumber())
                 .arg(exception.columnNumber())
                 .arg(exception.message());
@@ -726,8 +749,9 @@ XtandemSaxHandler::error(const QXmlParseException &exception)
 bool
 XtandemSaxHandler::fatalError(const QXmlParseException &exception)
 {
-  _errorStr = QObject::tr("Parse error at line %1, column %2 :\n"
-                          "%3")
+  _errorStr = QObject::tr(
+                "Parse error at line %1, column %2 :\n"
+                "%3")
                 .arg(exception.lineNumber())
                 .arg(exception.columnNumber())
                 .arg(exception.message());
diff --git a/src/utils/peptidestore.cpp b/src/utils/peptidestore.cpp
index 6001f002..c99aa05d 100644
--- a/src/utils/peptidestore.cpp
+++ b/src/utils/peptidestore.cpp
@@ -113,11 +113,18 @@ PeptideStore::checkPsimodCompliance() const
             }
           else
             {
-              throw pappso::PappsoException(
-                QObject::tr("Modification %1 is not a PSIMOD accession. Please "
-                            "go into the edit=>modifications menu to replace "
-                            "modifications masses by PSIMOD accessions")
-                  .arg(modification->getAccession()));
+              if(modification->getAccession().startsWith("MUTATION:"))
+                {
+                }
+              else
+                {
+                  throw pappso::PappsoException(
+                    QObject::tr(
+                      "Modification %1 is not a PSIMOD accession. Please "
+                      "go into the edit=>modifications menu to replace "
+                      "modifications masses by PSIMOD accessions")
+                      .arg(modification->getAccession()));
+                }
             }
         }
     }
-- 
GitLab