From 3bea226724ada326d07637ef3582d12f650b3dc5 Mon Sep 17 00:00:00 2001
From: Olivier Langella <olivier.langella@u-psud.fr>
Date: Tue, 9 Jan 2018 22:04:31 +0100
Subject: [PATCH] better individual project mode

---
 src/CMakeLists.txt                            |  4 +--
 .../identificationpwizfile.cpp                |  4 +--
 .../identificationxtandemfile.cpp             |  4 +--
 src/core/identificationgroup.cpp              |  7 ++++++
 src/core/identificationgroup.h                |  1 +
 src/core/project.cpp                          |  8 +++---
 src/core/project.h                            |  6 ++---
 src/gui/project_view/project_view.ui          | 25 ++++++++++++++++---
 src/gui/project_view/projectwindow.cpp        | 17 ++++++++++---
 src/gui/project_view/projectwindow.h          |  1 +
 .../protein_list_view/proteinlistwindow.cpp   |  3 +++
 src/gui/workerthread.cpp                      |  9 +++++--
 src/input/xpipsaxhandler.cpp                  |  4 +--
 src/input/xtpxpipsaxhandler.cpp               |  4 +--
 src/output/ods/groupingsheet.cpp              |  4 +--
 src/output/ods/infosheet.cpp                  |  2 +-
 src/output/proticdbml.cpp                     |  2 +-
 src/output/xpip.cpp                           |  7 +++++-
 src/utils/types.h                             |  9 +++++++
 19 files changed, 89 insertions(+), 32 deletions(-)

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 36a99256..a65ad069 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -28,8 +28,8 @@ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Xml_EXECUTABLE_COMPILE_FLAGS} ${Qt5
 
 #sudo apt-get install libpappsomspp-dev
 #FIND_PACKAGE( Pappsomspp REQUIRED )
-# SET (PAPPSOMSPP_DIR  "/home/olivier/eclipse/git/pappsomspp")
- SET (PAPPSOMSPP_DIR  "/home/langella/developpement/git/pappsomspp")
+ SET (PAPPSOMSPP_DIR  "/home/olivier/eclipse/git/pappsomspp")
+# SET (PAPPSOMSPP_DIR  "/home/langella/developpement/git/pappsomspp")
  SET (PAPPSOMSPP_INCLUDE_DIR "${PAPPSOMSPP_DIR}/src")
  SET (PAPPSOMSPP_QT5_LIBRARY "${PAPPSOMSPP_DIR}/cbuild/src/libpappsomspp-qt5.so")
  SET (PAPPSOMSPP_WIDGET_QT5_LIBRARY "${PAPPSOMSPP_DIR}/cbuild/src/pappsomspp/widget/libpappsomspp-widget-qt5.so")
diff --git a/src/core/identification_sources/identificationpwizfile.cpp b/src/core/identification_sources/identificationpwizfile.cpp
index c7302963..c2f5cc45 100644
--- a/src/core/identification_sources/identificationpwizfile.cpp
+++ b/src/core/identification_sources/identificationpwizfile.cpp
@@ -71,7 +71,7 @@ void IdentificationPwizFile::parseTo(Project* p_project) {
     setMsRunSp(msrun_sp);
     std::vector<IdentificationGroup *> identification_list = p_project->getIdentificationGroupList();
     IdentificationGroup * identification_group_p = nullptr;
-    if (p_project->isCombineMode()) {
+    if (p_project->getProjectMode() == ProjectMode::combined) {
         if (identification_list.size() == 0) {
             identification_group_p = p_project->newIdentificationGroup();
         }
@@ -81,7 +81,7 @@ void IdentificationPwizFile::parseTo(Project* p_project) {
     }
     else {
         for (IdentificationGroup * identification_p_flist : identification_list) {
-            if (identification_p_flist->contains(msrun_sp.get())) {
+            if (identification_p_flist->containSample(msrun_sp.get()->getSampleName())) {
                 identification_group_p = identification_p_flist;
                 break;
             }
diff --git a/src/core/identification_sources/identificationxtandemfile.cpp b/src/core/identification_sources/identificationxtandemfile.cpp
index aa5bcdb2..09da3716 100644
--- a/src/core/identification_sources/identificationxtandemfile.cpp
+++ b/src/core/identification_sources/identificationxtandemfile.cpp
@@ -60,7 +60,7 @@ void IdentificationXtandemFile::parseTo(Project* p_project) {
     setMsRunSp(msrun_sp);
     std::vector<IdentificationGroup *> identification_list = p_project->getIdentificationGroupList();
     IdentificationGroup * identification_group_p = nullptr;
-    if (p_project->isCombineMode()) {
+    if (p_project->getProjectMode() == ProjectMode::combined) {
         if (identification_list.size() == 0) {
             identification_group_p = p_project->newIdentificationGroup();
         }
@@ -70,7 +70,7 @@ void IdentificationXtandemFile::parseTo(Project* p_project) {
     }
     else {
         for (IdentificationGroup * identification_p_flist : identification_list) {
-            if (identification_p_flist->contains(msrun_sp.get())) {
+            if (identification_p_flist->containSample(msrun_sp.get()->getSampleName())) {
                 identification_group_p = identification_p_flist;
                 break;
             }
diff --git a/src/core/identificationgroup.cpp b/src/core/identificationgroup.cpp
index 067e9a26..dd7ec45b 100644
--- a/src/core/identificationgroup.cpp
+++ b/src/core/identificationgroup.cpp
@@ -196,6 +196,13 @@ bool IdentificationGroup::contains (const MsRun * p_msrun) const {
     return false;
 }
 
+bool IdentificationGroup::containSample (const QString & sample) const {
+    for (const MsRunSp & msrun: _ms_run_list) {
+        if (msrun.get()->getSampleName() == sample) return true;
+    }
+    return false;
+}
+
 void IdentificationGroup::addIdentificationDataSourceP(IdentificationDataSource *  p_identification_source) {
     addMsRunSp(p_identification_source->getMsRunSp());
     auto it = std::find (_id_source_list.begin() ,_id_source_list.end(),p_identification_source);
diff --git a/src/core/identificationgroup.h b/src/core/identificationgroup.h
index bfb0d532..0469f961 100644
--- a/src/core/identificationgroup.h
+++ b/src/core/identificationgroup.h
@@ -125,6 +125,7 @@ public:
     const QString getTabName() const;
 
     bool contains (const MsRun * p_msrun) const;
+    bool containSample (const QString & sample) const;
 
     
     /** @brief collect mass delta between theoretical mass and observed mass
diff --git a/src/core/project.cpp b/src/core/project.cpp
index ed1fb0cf..937fec4e 100644
--- a/src/core/project.cpp
+++ b/src/core/project.cpp
@@ -51,11 +51,11 @@ void Project::readResultFile(QString filename) {
     qDebug() << "Project::readResultFile end";
 }
 
-bool Project::isCombineMode() const {
-    return _is_combine_mode;
+const ProjectMode Project::getProjectMode() const {
+    return _project_mode;
 }
-void Project::setCombineMode(bool is_combine_mode) {
-    _is_combine_mode = is_combine_mode;
+void Project::setProjectMode(ProjectMode mode) {
+    _project_mode = mode;
 }
 std::vector<IdentificationGroup *> Project::getIdentificationGroupList() {
     return _identification_goup_list;
diff --git a/src/core/project.h b/src/core/project.h
index b7cbebe5..c4e76293 100644
--- a/src/core/project.h
+++ b/src/core/project.h
@@ -66,11 +66,11 @@ public:
     void startGrouping(WorkMonitorInterface * p_work_monitor);
 
     const GroupingType getGroupingType() const;
+    const ProjectMode getProjectMode() const;
+    void setProjectMode(ProjectMode mode);
 
     std::vector<IdentificationGroup *> getIdentificationGroupList();
     const std::vector<IdentificationGroup *> getIdentificationGroupList() const;
-    void setCombineMode(bool is_combine_mode);
-    bool isCombineMode() const;
     void readResultFile(QString filename);
     
     /** @brief check that modifications are coded with PSI MOD accessions
@@ -89,7 +89,7 @@ public:
     
 private :
     LabelingMethodSp _labeling_method_sp;
-    bool _is_combine_mode =true;
+    ProjectMode _project_mode = ProjectMode::combined;
     std::vector<IdentificationGroup *> _identification_goup_list;
     IdentificationGroup* _p_current_identification_group = nullptr;
 
diff --git a/src/gui/project_view/project_view.ui b/src/gui/project_view/project_view.ui
index 4ad652d8..5540a466 100644
--- a/src/gui/project_view/project_view.ui
+++ b/src/gui/project_view/project_view.ui
@@ -343,8 +343,8 @@
    <slot>doFdrChanged()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>100</x>
-     <y>87</y>
+     <x>442</x>
+     <y>430</y>
     </hint>
     <hint type="destinationlabel">
      <x>484</x>
@@ -359,8 +359,8 @@
    <slot>doMassPrecisionUnitChanged(QString)</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>295</x>
-     <y>94</y>
+     <x>253</x>
+     <y>113</y>
     </hint>
     <hint type="destinationlabel">
      <x>489</x>
@@ -368,9 +368,26 @@
     </hint>
    </hints>
   </connection>
+  <connection>
+   <sender>identifications_combobox</sender>
+   <signal>currentIndexChanged(int)</signal>
+   <receiver>ProjectView</receiver>
+   <slot>doIdentificationsComboboxChanged(int)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>217</x>
+     <y>95</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>742</x>
+     <y>141</y>
+    </hint>
+   </hints>
+  </connection>
  </connections>
  <slots>
   <slot>doFdrChanged()</slot>
   <slot>doMassPrecisionUnitChanged(QString)</slot>
+  <slot>doIdentificationsComboboxChanged(int)</slot>
  </slots>
 </ui>
diff --git a/src/gui/project_view/projectwindow.cpp b/src/gui/project_view/projectwindow.cpp
index 7a6d0d60..5a918948 100644
--- a/src/gui/project_view/projectwindow.cpp
+++ b/src/gui/project_view/projectwindow.cpp
@@ -640,11 +640,13 @@ void ProjectWindow::setProjectSp(ProjectSp project_sp) {
 
 
     doViewProteinList(identification_list[0]);
-    
+
     //qDeleteAll(ui->identifications_widget->children());
     QLayoutItem *wItem;
-    while (wItem = ui->identifications_widget->layout()->takeAt(0))
-      delete wItem;
+    while (wItem = ui->identifications_widget->layout()->takeAt(0)) {
+        wItem->widget()->setVisible(false);
+        delete wItem;
+    }
 
     qDebug() << " ProjectWindow::setProjectSp size=" << identification_list.size();
     if (identification_list.size() == 1) {
@@ -694,7 +696,14 @@ void ProjectWindow::setProjectSp(ProjectSp project_sp) {
     //doFdrChanged();
 
 }
-
+void ProjectWindow::doIdentificationsComboboxChanged(int index_in) {
+    qDebug() << "ProjectWindow::doIdentificationsComboboxChanged begin ";
+    for (int index = 0; index < ui->identifications_combobox->count(); index++) {
+        qobject_cast<IdentificationGroupWidget*>(qvariant_cast<QObject*>(ui->identifications_combobox->itemData(index)))->setVisible(false);
+    }
+    qobject_cast<IdentificationGroupWidget*>(qvariant_cast<QObject*>(ui->identifications_combobox->itemData(index_in)))->setVisible(true);
+    qDebug() << "ProjectWindow::doIdentificationsComboboxChanged end ";
+}
 
 void ProjectWindow::editModifications() {
     _p_edit_modifications->setProjectSp(_project_sp);
diff --git a/src/gui/project_view/projectwindow.h b/src/gui/project_view/projectwindow.h
index f96f03b5..727708b8 100644
--- a/src/gui/project_view/projectwindow.h
+++ b/src/gui/project_view/projectwindow.h
@@ -71,6 +71,7 @@ public slots:
     void doOperationFailed(QString);
     void doOperationFinished();
     void doGroupingFinished();
+    void doIdentificationsComboboxChanged(int index);
     void doDisplayLoadingMessage(QString message);
     void doDisplayLoadingMessagePercent(QString message, int value);
     void refreshGroup(IdentificationGroup * p_ident_group);
diff --git a/src/gui/protein_list_view/proteinlistwindow.cpp b/src/gui/protein_list_view/proteinlistwindow.cpp
index e3e84d72..2b6f1f0f 100644
--- a/src/gui/protein_list_view/proteinlistwindow.cpp
+++ b/src/gui/protein_list_view/proteinlistwindow.cpp
@@ -276,6 +276,9 @@ void ProteinListWindow::setIdentificationGroup(IdentificationGroup * p_identific
         _protein_table_model_p->setIdentificationGroup(p_identification_group);
         //_p_proxy_model->setSourceModel(_protein_table_model_p);
 
+        if (_project_window->getProjectP()->getProjectMode() == ProjectMode::individual ) {
+            this->setWindowTitle(QString("%1 protein list").arg(_p_identification_group->getTabName()));
+        }
 
         QStringList msrun_list;
         for (MsRunSp msrun_sp : _p_identification_group->getMsRunSpList()) {
diff --git a/src/gui/workerthread.cpp b/src/gui/workerthread.cpp
index 55561bb8..09315982 100644
--- a/src/gui/workerthread.cpp
+++ b/src/gui/workerthread.cpp
@@ -267,7 +267,7 @@ void WorkerThread::doWritingXpipFile(QString filename, ProjectSp project_sp) {
 
     try {
         emit loadingMessage(tr("writing XPIP file, please wait"));
-        
+
         Xpip xpip_file(filename);
         xpip_file.write(project_sp);
         xpip_file.close();
@@ -344,7 +344,12 @@ void WorkerThread::doLoadingResults(bool is_individual, AutomaticFilterParameter
             throw pappso::PappsoException(QObject::tr("file list is empty"));
         }
         ProjectSp project_sp = Project().makeProjectSp();
-        project_sp.get()->setCombineMode(!is_individual);
+        if (is_individual) {
+            project_sp.get()->setProjectMode(ProjectMode::individual);
+        }
+        else {
+            project_sp.get()->setProjectMode(ProjectMode::combined);
+        }
 
         _p_work_monitor->setProgressMaximumValue(file_list.size());
         int i=0;
diff --git a/src/input/xpipsaxhandler.cpp b/src/input/xpipsaxhandler.cpp
index 31f249be..386b829f 100644
--- a/src/input/xpipsaxhandler.cpp
+++ b/src/input/xpipsaxhandler.cpp
@@ -166,9 +166,9 @@ bool XpipSaxHandler::startElement_information(QXmlAttributes attributes) {
 
 //<information Data_Type="indiv" match_number="223"/>
     qDebug() << "startElement_information ";
-    _p_project->setCombineMode(true);
+    _p_project->setProjectMode(ProjectMode::combined);
     if (attributes.value("Data_Type").simplified() == "indiv") {
-        _p_project->setCombineMode(false);
+        _p_project->setProjectMode(ProjectMode::individual);
     }
     _total_protein_match = attributes.value("match_number").toUInt();
 
diff --git a/src/input/xtpxpipsaxhandler.cpp b/src/input/xtpxpipsaxhandler.cpp
index 7dd37fa0..ab4743b4 100644
--- a/src/input/xtpxpipsaxhandler.cpp
+++ b/src/input/xtpxpipsaxhandler.cpp
@@ -282,9 +282,9 @@ bool XtpXpipSaxHandler::startElement_description(QXmlAttributes attributes) {
 //    <description version="0.1.23" grouping="peptidemass" combine="true" date="2017-11-17T16:02:47"/>
 
     qDebug() << "startElement_description ";
-    _p_project->setCombineMode(false);
+    _p_project->setProjectMode(ProjectMode::individual);
     if (attributes.value("combine") == "true") {
-        _p_project->setCombineMode(true);
+        _p_project->setProjectMode(ProjectMode::combined);
     }
     //_total_protein_match = attributes.value("match_number").toUInt();
 
diff --git a/src/output/ods/groupingsheet.cpp b/src/output/ods/groupingsheet.cpp
index fb748087..c25bc331 100644
--- a/src/output/ods/groupingsheet.cpp
+++ b/src/output/ods/groupingsheet.cpp
@@ -47,7 +47,7 @@ GroupingSheet::GroupingSheet (OdsExport * p_ods_export, CalcWriterInterface * p_
 
 void GroupingSheet::writeIdentificationGroup(IdentificationGroup * p_ident) {
     _p_writer->writeLine();
-    if (!_p_project->isCombineMode()) {
+    if (_p_project->getProjectMode() == ProjectMode::individual) {
         _p_writer->writeCell(p_ident->getMsRunSpList().at(0).get()->getSampleName());
     }
     _p_writer->writeCell((unsigned int) p_ident->countGroup());
@@ -66,7 +66,7 @@ void GroupingSheet::writeHeaders()  {
     // groups, subgroups, proteins, psm, sequence, peptide/mass, pep FDR, prot FDR
 
     _p_writer->writeLine();
-    if (!_p_project->isCombineMode()) {
+    if (_p_project->getProjectMode() == ProjectMode::individual) {
         _p_writer->writeCell("sample");
     }
     _p_writer->setCellAnnotation("number of groups");
diff --git a/src/output/ods/infosheet.cpp b/src/output/ods/infosheet.cpp
index ff5761fa..d3225a32 100644
--- a/src/output/ods/infosheet.cpp
+++ b/src/output/ods/infosheet.cpp
@@ -48,7 +48,7 @@ InfoSheet::InfoSheet (OdsExport * p_ods_export, CalcWriterInterface * p_writer,
     AutomaticFilterParameters filter_param = p_project->getAutomaticFilterParameters();
 
     p_writer->writeCell("Mode");
-    if (p_project->isCombineMode()) {
+    if (p_project->getProjectMode() == ProjectMode::combined) {
         p_writer->writeCell("combine");
     }
     else {
diff --git a/src/output/proticdbml.cpp b/src/output/proticdbml.cpp
index 656eb850..84c4c205 100644
--- a/src/output/proticdbml.cpp
+++ b/src/output/proticdbml.cpp
@@ -380,7 +380,7 @@ void ProticdbMl::writeIdentificationRun(IdentificationGroup * p_identification)
 // indi
 // combine
 // phospho
-    if (_sp_project.get()->isCombineMode()) {
+    if (_sp_project.get()->getProjectMode() == ProjectMode::combined) {
         writeCvParam("PROTICdbO:0000320", "combine", "");
     }
     else {
diff --git a/src/output/xpip.cpp b/src/output/xpip.cpp
index db9c2e4d..6dff9b3c 100644
--- a/src/output/xpip.cpp
+++ b/src/output/xpip.cpp
@@ -155,7 +155,12 @@ void Xpip::writeDescription() {
     _output_stream->writeStartElement("description");
     _output_stream->writeAttribute("version",XTPCPP_VERSION);
     _output_stream->writeAttribute("grouping","peptidemass");
-    writeBooleanAttribute("combine",_sp_project.get()->isCombineMode());
+    if (_sp_project.get()->getProjectMode() == ProjectMode::combined) {
+        writeBooleanAttribute("combine",true);
+    }
+    else {
+        writeBooleanAttribute("combine",false);
+    }
     _output_stream->writeAttribute("date",QDateTime::currentDateTime().toString( Qt::ISODate));
     _output_stream->writeEndElement();
 }
diff --git a/src/utils/types.h b/src/utils/types.h
index 32925ba1..16889a9b 100644
--- a/src/utils/types.h
+++ b/src/utils/types.h
@@ -88,6 +88,15 @@ enum class MsRunStatistics: std::int8_t {
 
 
 
+/** \def ProjectMode separate each samples or combine all
+ *
+ */
+enum class ProjectMode {
+    individual, ///< separate each biological samples (2D spots for example)
+    combined ///< combine every MS runs to get only one protein list
+};
+
+
 /** \def GroupingType list of available grouping algoritms
  *
  */
-- 
GitLab