From 2b1c074a268fabcf86b6a2464ada822e316e303c Mon Sep 17 00:00:00 2001
From: Olivier Langella <olivier.langella@u-psud.fr>
Date: Fri, 25 Jan 2019 16:25:05 +0100
Subject: [PATCH] new masschroqfile parameters structure to handle mcq file
 parameters

---
 src/CMakeLists.txt                            |  1 +
 .../exportmasschroqdialog.cpp                 | 44 +++++++++++
 .../exportmasschroqdialog.h                   | 13 ++--
 .../masschroqfileparameters.cpp               | 78 +++++++++++++++++++
 .../masschroqfileparameters.h                 | 50 ++++++++++++
 src/gui/mainwindow.cpp                        | 26 +++----
 src/gui/mainwindow.h                          |  2 +-
 src/gui/workerthread.cpp                      |  4 +-
 src/gui/workerthread.h                        |  3 +-
 src/main.cpp                                  |  1 +
 src/output/masschroqml.cpp                    | 54 +++++++++----
 src/output/masschroqml.h                      |  5 +-
 src/utils/types.h                             | 10 +++
 13 files changed, 253 insertions(+), 38 deletions(-)
 create mode 100644 src/gui/export/export_masschroq_dialog/masschroqfileparameters.cpp
 create mode 100644 src/gui/export/export_masschroq_dialog/masschroqfileparameters.h

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 681bbd3e0..963b3c076 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -174,6 +174,7 @@ SET(XTPCPP_SRCS
   ./gui/edit_modifications/editmodifications.cpp
   ./gui/edit_tandem_preset_dialog/edittandempresetdialog.cpp
   ./gui/export/export_masschroq_dialog/exportmasschroqdialog.cpp
+  ./gui/export/export_masschroq_dialog/masschroqfileparameters.cpp
   ./gui/export/export_spreadsheet_dialog/exportspreadsheetdialog.cpp
   ./gui/load_results_dialog/loadresultsdialog.cpp
   ./gui/mainwindow.cpp
diff --git a/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.cpp b/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.cpp
index 1d9d24108..f5172e1f0 100644
--- a/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.cpp
+++ b/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.cpp
@@ -57,3 +57,47 @@ ExportMasschroqDialog::~ExportMasschroqDialog()
 {
   delete ui;
 }
+
+void
+ExportMasschroqDialog::setMasschroqFileParameters(
+  const MasschroqFileParameters &params)
+{
+  ui->outputFileEdit->setText(params.result_file_name);
+  ui->outputFileFormatComboBox->setCurrentText("ODS");
+  if(params.result_file_format == TableFileFormat::tsv)
+    {
+      ui->outputFileFormatComboBox->setCurrentText("TSV");
+    }
+
+  ui->comparFileGroupBox->setChecked(params.export_compar_file);
+
+  ui->comparFileEdit->setText(params.compar_file_name);
+  ui->comparFileFormatComboBox->setCurrentText("ODS");
+  if(params.compar_file_format == TableFileFormat::tsv)
+    {
+      ui->comparFileFormatComboBox->setCurrentText("TSV");
+    }
+}
+
+
+MasschroqFileParameters
+ExportMasschroqDialog::getMasschroqFileParameters() const
+{
+  MasschroqFileParameters params;
+
+  params.result_file_name   = ui->outputFileEdit->text();
+  params.result_file_format = TableFileFormat::ods;
+  if(ui->outputFileFormatComboBox->currentText() == "TSV")
+    {
+      params.result_file_format = TableFileFormat::tsv;
+    }
+
+  params.export_compar_file = ui->comparFileGroupBox->isChecked();
+  params.compar_file_name   = ui->comparFileEdit->text();
+  params.compar_file_format = TableFileFormat::ods;
+  if(ui->comparFileFormatComboBox->currentText() == "TSV")
+    {
+      params.compar_file_format = TableFileFormat::tsv;
+    }
+  return params;
+}
diff --git a/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.h b/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.h
index 79f4b4625..cc5ef264c 100644
--- a/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.h
+++ b/src/gui/export/export_masschroq_dialog/exportmasschroqdialog.h
@@ -31,25 +31,28 @@
 #pragma once
 
 #include <QDialog>
-
+#include "masschroqfileparameters.h"
 
 namespace Ui
 {
-  class ExportMasschroqDialog;
+class ExportMasschroqDialog;
 }
 
 class ExportMasschroqDialog : public QDialog
 {
   Q_OBJECT
 
+  private:
+  Ui::ExportMasschroqDialog *ui;
+
   public:
   explicit ExportMasschroqDialog(QWidget *parent);
   ~ExportMasschroqDialog();
 
+  void setMasschroqFileParameters(const MasschroqFileParameters &params);
+  MasschroqFileParameters getMasschroqFileParameters() const;
+
   public slots:
 
   signals:
-
-  private:
-  Ui::ExportMasschroqDialog *ui;
 };
diff --git a/src/gui/export/export_masschroq_dialog/masschroqfileparameters.cpp b/src/gui/export/export_masschroq_dialog/masschroqfileparameters.cpp
new file mode 100644
index 000000000..bdd715819
--- /dev/null
+++ b/src/gui/export/export_masschroq_dialog/masschroqfileparameters.cpp
@@ -0,0 +1,78 @@
+/**
+ * \file gui/export/export_masschroq_dialog/masschroqfileparameters.cpp
+ * \date 25/01/2019
+ * \author Olivier Langella
+ * \brief all needed informations to write a MassChroqML file
+ */
+
+/*******************************************************************************
+ * Copyright (c) 2019 Olivier Langella <olivier.langella@u-psud.fr>.
+ *
+ * This file is part of XTPcpp.
+ *
+ *     XTPcpp is free software: you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation, either version 3 of the License, or
+ *     (at your option) any later version.
+ *
+ *     XTPcpp is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public License
+ *     along with XTPcpp.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Contributors:
+ *     Olivier Langella <olivier.langella@u-psud.fr> - initial API and
+ *implementation
+ ******************************************************************************/
+
+#include "masschroqfileparameters.h"
+#include <QSettings>
+
+void
+MasschroqFileParameters::save() const
+{
+  QSettings settings;
+  settings.setValue("export_masschroqml/result_file_name",
+                    QString("%1").arg(result_file_name));
+  settings.setValue("export_masschroqml/result_file_format",
+                    (std::uint8_t)result_file_format);
+
+
+  settings.setValue("export_masschroqml/export_compar_file",
+                    QString("%1").arg(export_compar_file));
+  settings.setValue("export_masschroqml/compar_file_name",
+                    QString("%1").arg(compar_file_name));
+  settings.setValue("export_masschroqml/compar_file_format",
+                    (std::uint8_t)compar_file_format);
+}
+void
+MasschroqFileParameters::load()
+{
+  QSettings settings;
+  result_file_name =
+    settings.value("export_masschroqml/result_file_name", QString("results"))
+      .toString();
+  result_file_format =
+    (TableFileFormat)settings
+      .value("export_masschroqml/result_file_format",
+             QString("%1").arg((std::uint8_t)TableFileFormat::ods))
+      .toUInt();
+
+
+  export_compar_file =
+    settings
+      .value("export_masschroqml/compar_file_name", QString("%1").arg(true))
+      .toBool();
+  compar_file_name =
+    settings
+      .value("export_masschroqml/compar_file_name", QString("compar_results"))
+      .toString();
+  compar_file_format =
+    (TableFileFormat)settings
+      .value("export_masschroqml/compar_file_format",
+             QString("%1").arg((std::uint8_t)TableFileFormat::ods))
+      .toUInt();
+}
diff --git a/src/gui/export/export_masschroq_dialog/masschroqfileparameters.h b/src/gui/export/export_masschroq_dialog/masschroqfileparameters.h
new file mode 100644
index 000000000..ac115eabe
--- /dev/null
+++ b/src/gui/export/export_masschroq_dialog/masschroqfileparameters.h
@@ -0,0 +1,50 @@
+/**
+ * \file gui/export/export_masschroq_dialog/masschroqfileparameters.h
+ * \date 25/01/2019
+ * \author Olivier Langella
+ * \brief all needed informations to write a MassChroqML file
+ */
+
+/*******************************************************************************
+ * Copyright (c) 2019 Olivier Langella <olivier.langella@u-psud.fr>.
+ *
+ * This file is part of XTPcpp.
+ *
+ *     XTPcpp is free software: you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation, either version 3 of the License, or
+ *     (at your option) any later version.
+ *
+ *     XTPcpp is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public License
+ *     along with XTPcpp.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Contributors:
+ *     Olivier Langella <olivier.langella@u-psud.fr> - initial API and
+ *implementation
+ ******************************************************************************/
+
+#pragma once
+
+#include "../../../utils/types.h"
+#include <QString>
+
+struct MasschroqFileParameters
+{
+  void save() const;
+  void load();
+
+  /** @brief quantification result output file name*/
+  QString result_file_name;
+
+  /** @brief quantification result output file type*/
+  TableFileFormat result_file_format = TableFileFormat::ods;
+
+  bool export_compar_file = false;
+  QString compar_file_name;
+  TableFileFormat compar_file_format = TableFileFormat::ods;
+};
diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp
index 8e38874ea..141abd8dd 100644
--- a/src/gui/mainwindow.cpp
+++ b/src/gui/mainwindow.cpp
@@ -35,6 +35,7 @@
 #include "../utils/utils.h"
 #include "workerthread.h"
 #include "output/xpip.h"
+#include "export/export_masschroq_dialog/masschroqfileparameters.h"
 
 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::Main)
 {
@@ -118,6 +119,10 @@ MainWindow::~MainWindow()
   delete _p_load_results_dialog;
   delete _p_export_spreadsheet_dialog;
   delete _p_waiting_message_dialog;
+  if(_p_export_masschroq_dialog != nullptr)
+    {
+      delete _p_export_masschroq_dialog;
+    }
   qDebug() << "MainWindow::~MainWindow end";
 }
 
@@ -574,6 +579,7 @@ MainWindow::doActionMassChroQ()
 
   try
     {
+      _project_sp.get()->checkPsimodCompliance();
       if(_p_export_masschroq_dialog == nullptr)
         {
           _p_export_masschroq_dialog = new ExportMasschroqDialog(this);
@@ -583,9 +589,11 @@ MainWindow::doActionMassChroQ()
                   &MainWindow::doAcceptedExportMasschroqDialog);
         }
 
+      MasschroqFileParameters params;
+      params.load();
       if(_project_sp.get() != nullptr)
         {
-          //_p_export_masschroq_dialog->setProject(_project_sp.get());
+          _p_export_masschroq_dialog->setMasschroqFileParameters(params);
         }
       _p_export_masschroq_dialog->show();
       _p_export_masschroq_dialog->raise();
@@ -595,17 +603,6 @@ MainWindow::doActionMassChroQ()
     {
       viewError(tr("Error doActionMassChroQ :\n%1").arg(error.qwhat()));
     }
-  try
-    {
-      _project_sp.get()->checkPsimodCompliance();
-
-      // emit operateXpipFile(filename);
-    }
-  catch(pappso::PappsoException &error)
-    {
-      viewError(
-        tr("Error while writing MassChroqML file :\n%1").arg(error.qwhat()));
-    }
   qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__;
 }
 
@@ -617,6 +614,9 @@ MainWindow::doAcceptedExportMasschroqDialog()
   try
     {
 
+      MasschroqFileParameters params =
+        _p_export_masschroq_dialog->getMasschroqFileParameters();
+      params.save();
       QSettings settings;
       QString default_location = settings.value("path/mcqfile", "").toString();
 
@@ -635,7 +635,7 @@ MainWindow::doAcceptedExportMasschroqDialog()
 
       showWaitingMessage(
         tr("Writing %1 MassChroqML file").arg(QFileInfo(filename).fileName()));
-      emit operateWritingMassChroqFile(filename, _project_sp);
+      emit operateWritingMassChroqFile(filename, _project_sp, params);
     }
   catch(pappso::PappsoException &error)
     {
diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h
index f3cc9cf84..c93a4cc32 100644
--- a/src/gui/mainwindow.h
+++ b/src/gui/mainwindow.h
@@ -108,7 +108,7 @@ class MainWindow : public QMainWindow
   void operateWritingXpipFile(QString filename, ProjectSp project_sp);
   void
   operateWritingOdsFile(QString filename, QString format, ProjectSp project_sp);
-  void operateWritingMassChroqFile(QString filename, ProjectSp project_sp);
+  void operateWritingMassChroqFile(QString filename, ProjectSp project_sp, MasschroqFileParameters params);
   void operateWritingMassChroqPrmFile(QString filename, ProjectSp project_sp);
   void operateWritingProticFile(QString filename, ProjectSp project_sp);
   void operateWritingMcqrSpectralCountFile(QString filename,
diff --git a/src/gui/workerthread.cpp b/src/gui/workerthread.cpp
index add639e0d..be10ce490 100644
--- a/src/gui/workerthread.cpp
+++ b/src/gui/workerthread.cpp
@@ -547,7 +547,7 @@ WorkerThread::doWritingOdsFile(QString filename,
 
 
 void
-WorkerThread::doWritingMassChroqFile(QString filename, ProjectSp project_sp)
+WorkerThread::doWritingMassChroqFile(QString filename, ProjectSp project_sp, MasschroqFileParameters params)
 {
 
   try
@@ -555,7 +555,7 @@ WorkerThread::doWritingMassChroqFile(QString filename, ProjectSp project_sp)
       emit loadingMessage(tr("writing MassChroqML file, please wait"));
 
       project_sp.get()->checkPsimodCompliance();
-      MassChroQml output(filename);
+      MassChroQml output(filename, params);
       output.write(project_sp);
       output.close();
       emit operationFinished();
diff --git a/src/gui/workerthread.h b/src/gui/workerthread.h
index 6bb87eaec..686485d74 100644
--- a/src/gui/workerthread.h
+++ b/src/gui/workerthread.h
@@ -37,6 +37,7 @@
 #include "../core/project.h"
 #include "../utils/workmonitor.h"
 #include "../core/tandem_run/tandemrunbatch.h"
+#include "../gui/export/export_masschroq_dialog/masschroqfileparameters.h"
 
 class MainWindow;
 class ProjectWindow;
@@ -60,7 +61,7 @@ class WorkerThread : public QObject
                         QStringList file_list);
   void doWritingXpipFile(QString filename, ProjectSp project_sp);
   void doWritingOdsFile(QString filename, QString format, ProjectSp project_sp);
-  void doWritingMassChroqFile(QString filename, ProjectSp project_sp);
+  void doWritingMassChroqFile(QString filename, ProjectSp project_sp, MasschroqFileParameters params);
   void doWritingMassChroqPrmFile(QString filename, ProjectSp project_sp);
   void doWritingProticFile(QString filename, ProjectSp project_sp);
   void doWritingMcqrSpectralCountFile(QString filename, ProjectSp project_sp);
diff --git a/src/main.cpp b/src/main.cpp
index 8cf6312fc..46c12fc9b 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -49,6 +49,7 @@ main(int argc, char *argv[])
   qRegisterMetaType<std::vector<pappso::PeptideNaturalIsotopeAverageSp>>(
     "std::vector<pappso::PeptideNaturalIsotopeAverageSp>");
   qRegisterMetaType<ExportFastaType>("ExportFastaType");
+  qRegisterMetaType<MasschroqFileParameters>("MasschroqFileParameters");
 
   try
     {
diff --git a/src/output/masschroqml.cpp b/src/output/masschroqml.cpp
index 5c7fa74c5..bf70e81c5 100644
--- a/src/output/masschroqml.cpp
+++ b/src/output/masschroqml.cpp
@@ -66,7 +66,9 @@ struct McqPsimod
   QString accession;
 };
 
-MassChroQml::MassChroQml(const QString &out_filename)
+MassChroQml::MassChroQml(const QString &out_filename,
+                         const MasschroqFileParameters &params)
+  : m_params(params)
 {
   //_p_digestion_pipeline = p_digestion_pipeline;
 
@@ -186,8 +188,15 @@ MassChroQml::writeQuantificationResults()
   //<quantification_result output_file="result1"
   //	format="tsv" />
   _output_stream->writeStartElement("quantification_result");
-  _output_stream->writeAttribute("output_file", "result1");
-  _output_stream->writeAttribute("format", "tsv");
+  _output_stream->writeAttribute("output_file", m_params.result_file_name);
+  if(m_params.result_file_format == TableFileFormat::ods)
+    {
+      _output_stream->writeAttribute("format", "ods");
+    }
+  else
+    {
+      _output_stream->writeAttribute("format", "tsv");
+    }
   _output_stream->writeEndElement();
   //<quantification_result output_file="result2"
   //	format="ods" />
@@ -196,10 +205,20 @@ MassChroQml::writeQuantificationResults()
   //<compar_result output_file="compar"
   //	format="ods" />
 
-  _output_stream->writeStartElement("compar_result");
-  _output_stream->writeAttribute("output_file", "result1");
-  _output_stream->writeAttribute("format", "ods");
-  _output_stream->writeEndElement();
+  if(m_params.export_compar_file)
+    {
+      _output_stream->writeStartElement("compar_result");
+      _output_stream->writeAttribute("output_file", m_params.compar_file_name);
+      if(m_params.compar_file_format == TableFileFormat::ods)
+        {
+          _output_stream->writeAttribute("format", "ods");
+        }
+      else
+        {
+          _output_stream->writeAttribute("format", "tsv");
+        }
+      _output_stream->writeEndElement();
+    }
   //</quantification_results>
   _output_stream->writeEndElement();
 }
@@ -212,8 +231,9 @@ MassChroQml::writeQuantificationTraces()
   _output_stream->writeStartElement("quantification_traces");
   //<peptide_traces peptide_ids="pep0 pep1" output_dir="pep_traces"
   //	format="tsv" />
-  _output_stream->writeComment("<peptide_traces peptide_ids=\"pep0 pep1\" "
-                               "output_dir=\"pep_traces\" format=\"tsv\" />");
+  _output_stream->writeComment(
+    "<peptide_traces peptide_ids=\"pep0 pep1\" "
+    "output_dir=\"pep_traces\" format=\"tsv\" />");
   /*
       <all_xics_traces output_dir="all_xics_traces" format="tsv" />
       <mz_traces mz_values="634.635 449.754 552.234" output_dir="mz_traces"
@@ -258,8 +278,9 @@ MassChroQml::writeQuantify()
     }
   _output_stream->writeEndElement();
 
-  _output_stream->writeComment("<mz_list>732.317 449.754 552.234 464.251 "
-                               "381.577 569.771 575.256</mz_list>");
+  _output_stream->writeComment(
+    "<mz_list>732.317 449.754 552.234 464.251 "
+    "381.577 569.771 575.256</mz_list>");
   _output_stream->writeComment(
     "<mzrt_list>\n				<mzrt mz=\"732.317\" rt=\"230.712\" />\n			<mzrt "
     "mz=\"575.256\" rt=\"254.788\" />\n			</mzrt_list>");
@@ -356,8 +377,9 @@ MassChroQml::writeAlignments()
   // corrections -->
 
   _output_stream->writeStartElement("ms2");
-  _output_stream->writeComment("write_time_values_output_dir=\"directory\" to "
-                               "write retention time corrections");
+  _output_stream->writeComment(
+    "write_time_values_output_dir=\"directory\" to "
+    "write retention time corrections");
   //<ms2_tendency_halfwindow>10</ms2_tendency_halfwindow>
   _output_stream->writeStartElement("ms2_tendency_halfwindow");
   _output_stream->writeCharacters("10");
@@ -455,7 +477,8 @@ MassChroQml::writePeptideListInGroup(const GroupingGroup *p_group)
     }
 
   // sort list
-  std::sort(mcq_peptide_list.begin(), mcq_peptide_list.end(),
+  std::sort(mcq_peptide_list.begin(),
+            mcq_peptide_list.end(),
             [](const McqPeptide &first, const McqPeptide &second) {
               return (first.id < second.id);
             });
@@ -541,7 +564,8 @@ MassChroQml::writePeptideListInGroup(const GroupingGroup *p_group)
         }
 
       //<observed_in data="samp0" scan="655" z="2" />
-      std::sort(mcq_peptide.observed_in.begin(), mcq_peptide.observed_in.end(),
+      std::sort(mcq_peptide.observed_in.begin(),
+                mcq_peptide.observed_in.end(),
                 [](const McqObserved &first, const McqObserved &second) {
                   return std::tie(first.charge, first.scan, first.msrun) <
                          std::tie(second.charge, second.scan, second.msrun);
diff --git a/src/output/masschroqml.h b/src/output/masschroqml.h
index bfe322690..1dffd898d 100644
--- a/src/output/masschroqml.h
+++ b/src/output/masschroqml.h
@@ -38,11 +38,13 @@
 #include "../core/project.h"
 #include "../grouping/groupinggroup.h"
 #include "../gui/xic_view/xic_widgets/zivywidget.h"
+#include "../gui/export/export_masschroq_dialog/masschroqfileparameters.h"
 
 class MassChroQml
 {
   public:
-  MassChroQml(const QString &out_filename);
+  MassChroQml(const QString &out_filename,
+              const MasschroqFileParameters &params);
   ~MassChroQml();
 
   void write(ProjectSp sp_project);
@@ -61,6 +63,7 @@ class MassChroQml
   void writeQuantify();
 
   private:
+  const MasschroqFileParameters &m_params;
   QFile *_output_file;
   QXmlStreamWriter *_output_stream;
   ProjectSp _sp_project;
diff --git a/src/utils/types.h b/src/utils/types.h
index 03d3cb6d6..6615853b2 100644
--- a/src/utils/types.h
+++ b/src/utils/types.h
@@ -180,4 +180,14 @@ enum class ExportFastaType : std::int8_t
 };
 
 
+/** \def TableFileFormat file format of tables
+ *
+ */
+enum class TableFileFormat : std::int8_t
+{
+  ods     = 1, ///< Open Document Spreadsheet
+  tsv     = 2, ///< tabulated separated values
+};
+
+
 #endif /* _TYPES_H_ */
-- 
GitLab