From 608dea92f0a71b4283a9302ddd3447b15c4dc4ad Mon Sep 17 00:00:00 2001
From: Olivier Langella <olivier.langella@u-psud.fr>
Date: Thu, 21 Dec 2017 10:03:07 +0100
Subject: [PATCH] export MassChroqPRM files

---
 src/CMakeLists.txt          |  1 +
 src/gui/main.ui             | 25 +++++++++++++-
 src/gui/mainwindow.cpp      | 28 ++++++++++++++++
 src/gui/mainwindow.h        |  2 ++
 src/gui/workerthread.cpp    | 16 +++++++++
 src/gui/workerthread.h      |  1 +
 src/output/masschroqprm.cpp | 65 ++++++++++++++++++++-----------------
 src/output/masschroqprm.h   | 11 +------
 8 files changed, 109 insertions(+), 40 deletions(-)

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index d576d6d8c..78e9cbc05 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -101,6 +101,7 @@ SET(CPP_FILES
   output/ods/simplesheet.cpp
   output/ods/spectrasheet.cpp
   output/masschroqml.cpp
+  output/masschroqprm.cpp
   output/proticdbml.cpp
   output/xpip.cpp
   utils/fastafilestore.cpp
diff --git a/src/gui/main.ui b/src/gui/main.ui
index b7bcf9354..f3387e1bd 100644
--- a/src/gui/main.ui
+++ b/src/gui/main.ui
@@ -67,6 +67,7 @@
      </property>
      <addaction name="actionFasta"/>
      <addaction name="actionMassChroQ"/>
+     <addaction name="actionMassChroqPRM"/>
      <addaction name="actionSpreadsheet"/>
      <addaction name="actionProticDb"/>
      <addaction name="action_spectral_counting_mcq"/>
@@ -163,7 +164,12 @@
   </action>
   <action name="action_save_project">
    <property name="text">
-    <string>Save project</string>
+    <string>&amp;Save project</string>
+   </property>
+  </action>
+  <action name="actionMassChroqPRM">
+   <property name="text">
+    <string>MassChroqPRM</string>
    </property>
   </action>
  </widget>
@@ -427,6 +433,22 @@
     </hint>
    </hints>
   </connection>
+  <connection>
+   <sender>actionMassChroqPRM</sender>
+   <signal>triggered()</signal>
+   <receiver>Main</receiver>
+   <slot>doActionMassChroqPRM()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>-1</x>
+     <y>-1</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>231</x>
+     <y>191</y>
+    </hint>
+   </hints>
+  </connection>
  </connections>
  <slots>
   <slot>selectXpipFile()</slot>
@@ -442,5 +464,6 @@
   <slot>doActionAbout()</slot>
   <slot>doActionTandemRun()</slot>
   <slot>doActionSaveProject()</slot>
+  <slot>doActionMassChroqPRM()</slot>
  </slots>
 </ui>
diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp
index 5b22c3743..2c511d6ef 100644
--- a/src/gui/mainwindow.cpp
+++ b/src/gui/mainwindow.cpp
@@ -464,6 +464,34 @@ void MainWindow::doActionMassChroQ() {
     qDebug() << "MainWindow::doActionMassChroQ end";
 }
 
+void MainWindow::doActionMassChroqPRM() {
+    qDebug() << "MainWindow::doActionMassChroqPRM begin";
+    try {
+        _project_sp.get()->checkPsimodCompliance();
+
+        QSettings settings;
+        QString default_location = settings.value("path/mcqprmfile", "").toString();
+
+        QString filename = QFileDialog::getSaveFileName(this, tr("Save MassChroqPRM file"),
+                           QString("%1/untitled.masschroqprm").arg(default_location),
+                           tr("MassChroqPRM (*.masschroqprm)"));
+
+        if (filename.isEmpty()) {
+            return;
+        }
+
+        settings.setValue("path/mcqprmfile", QFileInfo(filename).absolutePath());
+
+        showWaitingMessage(tr("Writing %1 MassChroqPRM file").arg(QFileInfo(filename).fileName()));
+        emit operateWritingMassChroqPrmFile(filename, _project_sp);
+        //emit operateXpipFile(filename);
+    }
+    catch (pappso::PappsoException & error) {
+        viewError(tr("Error while writing MassChroqML file :\n%1").arg(error.qwhat()));
+    }
+    qDebug() << "MainWindow::doActionMassChroqPRM end";
+}
+
 void MainWindow::doActionProticDb() {
     qDebug() << "MainWindow::doActionProticDb begin";
     try {
diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h
index 2ee0090c1..629751d03 100644
--- a/src/gui/mainwindow.h
+++ b/src/gui/mainwindow.h
@@ -69,6 +69,7 @@ public slots:
     void doActionQuit();
     void doActionFasta();
     void doActionMassChroQ();
+    void doActionMassChroqPRM();
     void doActionProticDb();
     void doActionLabelingMethods();
     void doActionTandemRun();
@@ -99,6 +100,7 @@ signals:
     void operateWritingXpipFile(QString filename, ProjectSp project_sp);
     void operateWritingOdsFile(QString filename, ProjectSp project_sp);
     void operateWritingMassChroqFile(QString filename, ProjectSp project_sp);
+    void operateWritingMassChroqPrmFile(QString filename, ProjectSp project_sp);
     void operateWritingProticFile(QString filename, ProjectSp project_sp);
     void operateGrouping(ProjectSp project_sp);
     void operateRunningXtandem(TandemRunBatch tandem_run_batch);
diff --git a/src/gui/workerthread.cpp b/src/gui/workerthread.cpp
index 47ea9ae0d..55561bb88 100644
--- a/src/gui/workerthread.cpp
+++ b/src/gui/workerthread.cpp
@@ -32,6 +32,7 @@
 #include <pappsomspp/pappsoexception.h>
 #include <QDebug>
 #include "../output/masschroqml.h"
+#include "../output/masschroqprm.h"
 #include "../output/proticdbml.h"
 #include "../output/ods/odsexport.h"
 #include "../output/xpip.h"
@@ -73,6 +74,7 @@ WorkerThread::WorkerThread(MainWindow * p_main_window)
     connect(this, &WorkerThread::groupingFinished, p_main_window,&MainWindow::doGroupingFinished);
     //masschroq write
     connect(p_main_window, &MainWindow::operateWritingMassChroqFile, this,&WorkerThread::doWritingMassChroqFile);
+    connect(p_main_window, &MainWindow::operateWritingMassChroqPrmFile, this,&WorkerThread::doWritingMassChroqPrmFile);
     //protic write
     connect(p_main_window, &MainWindow::operateWritingProticFile, this,&WorkerThread::doWritingProticFile);
     //writing ODS file :
@@ -306,6 +308,20 @@ void WorkerThread::doWritingMassChroqFile(QString filename, ProjectSp project_sp
     }
 }
 
+void WorkerThread::doWritingMassChroqPrmFile(QString filename, ProjectSp project_sp) {
+
+    try {
+        emit loadingMessage(tr("writing MassChroqPRM file, please wait"));
+        MassChroqPrm output(filename);
+        output.write(project_sp);
+        output.close();
+        emit operationFinished();
+    }
+    catch (pappso::PappsoException & error) {
+        emit operationFailed(tr("Error while writing MassChroqPRM file :\n%1").arg(error.qwhat()));
+    }
+}
+
 void WorkerThread::doWritingProticFile(QString filename, ProjectSp project_sp) {
 
     try {
diff --git a/src/gui/workerthread.h b/src/gui/workerthread.h
index dd120d7a1..35ccd0e1d 100644
--- a/src/gui/workerthread.h
+++ b/src/gui/workerthread.h
@@ -61,6 +61,7 @@ public slots:
     void doWritingXpipFile(QString filename, ProjectSp project_sp);
     void doWritingOdsFile(QString filename, ProjectSp project_sp);
     void doWritingMassChroqFile(QString filename, ProjectSp project_sp);
+    void doWritingMassChroqPrmFile(QString filename, ProjectSp project_sp);
     void doWritingProticFile(QString filename, ProjectSp project_sp);
     void doGrouping(ProjectSp project_sp);
     void doGroupingOnIdentification(IdentificationGroup * p_identification_group, GroupingType grouping_type);
diff --git a/src/output/masschroqprm.cpp b/src/output/masschroqprm.cpp
index 1bde93c9c..8f5c272c9 100644
--- a/src/output/masschroqprm.cpp
+++ b/src/output/masschroqprm.cpp
@@ -29,6 +29,7 @@
 
 #include "masschroqprm.h"
 #include <pappsomspp/pappsoexception.h>
+#include <pappsomspp/utils.h>
 
 MassChroqPrm::MassChroqPrm(const QString & out_filename) {
     //_p_digestion_pipeline = p_digestion_pipeline;
@@ -73,7 +74,7 @@ void MassChroqPrm::write(ProjectSp sp_project) {
     //<masschroq>
     _output_stream->writeStartElement("masschroqprm");
     /*
-    *
+     *
     <parameters>
     <parentIonMassTolerance>
     <daltonPrecision value="1.5"/>
@@ -102,6 +103,7 @@ void MassChroqPrm::write(ProjectSp sp_project) {
 }
 
 void MassChroqPrm::writePeptides() {
+
     /*
      *
      *
@@ -112,36 +114,42 @@ void MassChroqPrm::writePeptides() {
 
         _output_stream->writeStartElement("peptideList");
 
-        for (IdentificationGroup * p_ident_group : _sp_project.get()->getIdentificationGroupList()) {
-            for () {
-            PeptideMassSet pepMassSet = new PeptideMassSet();
-
-            logger.debug("pepMassSet size : " + pepMassSet.size());
-
-            logger.debug("pepMassSet numbering");
-            pepMassSet.numberingGetPepMass2PeptideList(group);
-
-            // iterated current pepid to write buffer peptide element
-            for (PeptideMass pepMass : pepMassSet) {
-                _output_stream->writeStartElement("peptide");
-                _output_stream->writeAttribute("id",
-                                               Utils.getPappsoPeptideMassId(group, pepMass));
-                Peptide bestPeptide = pepMass.getBestEvaluePeptide();
-                _output_stream->writeAttribute("seq", bestPeptide.getSequence());
-
-                ArrayList<Modifs> arrModif = bestPeptide.get_Modifs();
-                for (Modifs modif : arrModif) {
-                    _output_stream->writeStartElement("psimod");
-                    _output_stream->writeAttribute("at", "" + modif.get_posi());
-
-                    _output_stream->writeAttribute("acc", ""
-                                                   + modif.getPsiMod().getAccession());
-                    _output_stream->writeEndElement();
+        for (IdentificationDataSourceSp identification_data_source_sp :_sp_project.get()->getIdentificationDataSourceStore().getIdentificationDataSourceList()) {
+            for (const PeptideEvidenceSp & peptide_evidence_sp: identification_data_source_sp.get()->getPeptideEvidenceStore().getPeptideEvidenceList()) {
+                const pappso::GrpPeptide * p_grp_peptide =peptide_evidence_sp.get()->getGrpPeptideSp().get();
+
+                if (p_grp_peptide != nullptr) {
+                    std::set<const pappso::GrpPeptide *> _already_writed;
+                    if (_already_writed.find(p_grp_peptide) == _already_writed.end()) {
+                        _already_writed.insert(p_grp_peptide);
+                        PeptideXtp * p_peptide = peptide_evidence_sp.get()->getPeptideXtpSp().get();
+                        _output_stream->writeStartElement("peptide");
+                        _output_stream->writeAttribute("id",p_grp_peptide->getGroupingId());
+                        _output_stream->writeAttribute("seq", p_peptide->getSequence());
+
+
+                        unsigned int i=0;
+                        for (const pappso::Aa & amino_acid: *p_peptide) {
+
+                            std::list<pappso::AaModificationP> aa_modif_list = amino_acid.getModificationList();
+
+
+                            for (auto && aa_modif : aa_modif_list) {
+                                if (!aa_modif->isInternal()) {
+                                    _output_stream->writeStartElement("psimod");
+                                    _output_stream->writeAttribute("acc", aa_modif->getAccession());
+                                    _output_stream->writeAttribute("at", QString ("%1").arg(i));
+                                    _output_stream->writeEndElement();// mod
+                                }
+                            }
+                            i++;
+                        }
+                        _output_stream->writeEndElement();
+                    }
                 }
-                _output_stream->writeEndElement();
             }
-
         }
+        //peptideList
         _output_stream->writeEndElement();
     }
     catch (pappso::PappsoException &error)
@@ -152,6 +160,5 @@ void MassChroqPrm::writePeptides() {
     {
         throw pappso::PappsoException(QObject::tr("Error in MassChroqPrm::writePeptides stdex :\n%1").arg(error.what()));
     }
-}
 
 }
diff --git a/src/output/masschroqprm.h b/src/output/masschroqprm.h
index 31aca8f40..bc2e8e04c 100644
--- a/src/output/masschroqprm.h
+++ b/src/output/masschroqprm.h
@@ -45,16 +45,7 @@ class MassChroqPrm
     void write(ProjectSp sp_project);
     void close();
 private:
-    void writeGroups();
-    void writeProteinList();
-    void writePeptideList();
-    void writePeptideListInGroup(const GroupingGroup * p_group);
-    void writeIsotopeLabelList();
-    void writeAlignments();
-    void writeQuantificationMethods();
-    void writeQuantificationResults();
-    void writeQuantificationTraces();
-    void writeQuantify();
+    void writePeptides();
     
 private :
     QFile * _output_file;
-- 
GitLab