From b9a03178331b858d83ed5d27aa9b21bc20e8002a Mon Sep 17 00:00:00 2001
From: Olivier Langella <Olivier.Langella@moulon.inra.fr>
Date: Tue, 30 May 2017 14:44:42 +0200
Subject: [PATCH] get ptm grouping id

---
 src/core/identificationgroup.cpp              | 24 ++++-
 src/core/identificationgroup.h                |  5 ++
 src/grouping/ptm/ptmgroupingexperiment.cpp    | 23 ++---
 src/grouping/ptm/ptmgroupingexperiment.h      |  7 +-
 src/grouping/ptm/ptmisland.cpp                | 15 ++++
 src/grouping/ptm/ptmisland.h                  |  6 ++
 src/grouping/ptm/ptmislandgroup.cpp           |  3 +
 src/grouping/ptm/ptmislandgroup.h             |  1 +
 src/grouping/ptm/ptmislandsubgroup.cpp        | 21 +++++
 src/grouping/ptm/ptmislandsubgroup.h          |  2 +
 .../ptm_island_list_view.ui                   | 89 +------------------
 11 files changed, 93 insertions(+), 103 deletions(-)

diff --git a/src/core/identificationgroup.cpp b/src/core/identificationgroup.cpp
index 1dbc4b558..287f58151 100644
--- a/src/core/identificationgroup.cpp
+++ b/src/core/identificationgroup.cpp
@@ -150,13 +150,13 @@ bool IdentificationGroup::contains (const MsRun * p_msrun) const {
     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);
+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);
     if (it == _id_source_list.end()) {
         _id_source_list.push_back(p_identification_source);
     }
-    }
+}
 void IdentificationGroup::addMsRunSp(MsRunSp ms_run_sp) {
     auto it = std::find (_ms_run_list.begin() ,_ms_run_list.end(),ms_run_sp);
     if (it == _ms_run_list.end()) {
@@ -209,6 +209,22 @@ void IdentificationGroup::startGrouping (const GroupingType & grouping_type) {
     qDebug() << "IdentificationGroup::startGrouping end ";
 }
 
+void IdentificationGroup::startPtmGrouping () {
+    qDebug() << "IdentificationGroup::startPtmGrouping begin ";
+    if (_p_grp_ptm_experiment != nullptr) {
+        delete _p_grp_ptm_experiment;
+    }
+    _p_grp_ptm_experiment = new PtmGroupingExperiment();
+    _p_grp_ptm_experiment->setValidationState(ValidationState::grouped);
+    for (ProteinMatch * p_protein_match : _protein_match_list) {
+        _p_grp_ptm_experiment->addProteinMatch(p_protein_match);
+    }
+
+    _p_grp_ptm_experiment->startGrouping();
+
+    qDebug() << "IdentificationGroup::startPtmGrouping end ";
+}
+
 const QString IdentificationGroup::getTabName() const {
     return _ms_run_list[0]->getFilename();
 }
diff --git a/src/core/identificationgroup.h b/src/core/identificationgroup.h
index 1ed50884c..56ea6baa9 100644
--- a/src/core/identificationgroup.h
+++ b/src/core/identificationgroup.h
@@ -26,6 +26,7 @@
 #include "msrun.h"
 
 #include "grouping/groupingexperiment.h"
+#include "grouping/ptm/ptmgroupingexperiment.h"
 #include "../utils/types.h"
 
 #ifndef IDENTIFICATIONGROUP_H
@@ -91,6 +92,9 @@ public:
     void updateAutomaticFilters(const AutomaticFilterParameters & automatic_filter_parameters);
 
     void startGrouping (const GroupingType & grouping_type);
+    /** @brief creates a new PTM grouping experiment
+     * */
+    void startPtmGrouping ();
 
     const std::vector<MsRunSp> & getMsRunSpList() const;
     const std::vector<IdentificationDataSource *> & getIdentificationDataSourceList() const;
@@ -107,6 +111,7 @@ private :
     void addMsRunSp(MsRunSp ms_run_sp);
 private :
     GroupingExperiment * _p_grp_experiment= nullptr;
+    PtmGroupingExperiment * _p_grp_ptm_experiment= nullptr;
 
     Project * _p_project;
 
diff --git a/src/grouping/ptm/ptmgroupingexperiment.cpp b/src/grouping/ptm/ptmgroupingexperiment.cpp
index 193b53b5f..69676cf3e 100644
--- a/src/grouping/ptm/ptmgroupingexperiment.cpp
+++ b/src/grouping/ptm/ptmgroupingexperiment.cpp
@@ -29,7 +29,7 @@
 
 #include "ptmgroupingexperiment.h"
 
-PtmGroupingExperiment::PtmGroupingExperiment(const PtmGroupingExperiment& other)
+PtmGroupingExperiment::PtmGroupingExperiment()
 {
     /*
      * accession	MOD:00696
@@ -73,16 +73,16 @@ PtmGroupingExperiment::~PtmGroupingExperiment()
 }
 
 void PtmGroupingExperiment::numbering() {
-  std::sort(_ptm_island_group_list.begin(), _ptm_island_group_list.end(),[](const PtmIslandGroupSp a, const PtmIslandGroupSp b)
-        {
-            return  *(a.get()) < *(b.get());
-        });
-  
-  unsigned int number=0;
-  for (PtmIslandGroupSp ptm_island_group:_ptm_island_group_list) {
-      number ++;
-      ptm_island_group.get()->setGroupNumber(number);
-  }
+    std::sort(_ptm_island_group_list.begin(), _ptm_island_group_list.end(),[](const PtmIslandGroupSp a, const PtmIslandGroupSp b)
+    {
+        return  *(a.get()) < *(b.get());
+    });
+
+    unsigned int number=0;
+    for (PtmIslandGroupSp ptm_island_group:_ptm_island_group_list) {
+        number ++;
+        ptm_island_group.get()->setGroupNumber(number);
+    }
 }
 void PtmGroupingExperiment::startGrouping() {
     //we have a list of ptm island subgroups to group :
@@ -97,6 +97,7 @@ void PtmGroupingExperiment::startGrouping() {
     numbering();
 }
 void PtmGroupingExperiment::addPtmIsland(PtmIslandSp ptm_island_sp) {
+    _ptm_island_list.push_back(ptm_island_sp);
     if (std::none_of(_ptm_island_subgroup_list.begin(), _ptm_island_subgroup_list.end(), [ptm_island_sp](PtmIslandSubgroupSp element) {
     return element.get()->mergePtmIslandSp(ptm_island_sp);
     })) {
diff --git a/src/grouping/ptm/ptmgroupingexperiment.h b/src/grouping/ptm/ptmgroupingexperiment.h
index e7fabb0bf..ea80af13a 100644
--- a/src/grouping/ptm/ptmgroupingexperiment.h
+++ b/src/grouping/ptm/ptmgroupingexperiment.h
@@ -39,22 +39,23 @@
 class PtmGroupingExperiment
 {
 public:
-    PtmGroupingExperiment(const PtmGroupingExperiment& other);
+    PtmGroupingExperiment();
     ~PtmGroupingExperiment();
-    
+
     void setValidationState(ValidationState validation_state);
     void addProteinMatch(const ProteinMatch* p_protein_match);
     void startGrouping();
 
 private:
     std::vector<unsigned int> getPtmPositions(const ProteinMatch * protein_match) const;
-    
+
     std::vector< PtmIslandSp > mergePeptideMatchPtmIslandList(vector< PtmIslandSp > ptm_island_list);
     void addPtmIsland(PtmIslandSp ptm_island);
     void numbering();
 private:
     std::list<pappso::AaModificationP> _modification_list;
     ValidationState _peptide_validation_state = ValidationState::validAndChecked;
+    std::vector<PtmIslandSp> _ptm_island_list;
     std::vector<PtmIslandSubgroupSp> _ptm_island_subgroup_list;
     std::vector<PtmIslandGroupSp> _ptm_island_group_list;
 };
diff --git a/src/grouping/ptm/ptmisland.cpp b/src/grouping/ptm/ptmisland.cpp
index acd224f40..0603f9fba 100644
--- a/src/grouping/ptm/ptmisland.cpp
+++ b/src/grouping/ptm/ptmisland.cpp
@@ -30,6 +30,8 @@
 #include "ptmisland.h"
 #include <pappsomspp/pappsoexception.h>
 #include "ptmislandsubgroup.h"
+#include "ptmislandgroup.h"
+#include <pappsomspp/utils.h>
 
 PtmIsland::PtmIsland(const ProteinMatch* p_protein_match, unsigned int position):_protein_match_p(p_protein_match)
 {
@@ -45,6 +47,19 @@ PtmIsland::~PtmIsland()
 
 }
 
+const QString PtmIsland::getGroupingId() const {
+    if(_prot_number==0) {
+        return "";
+    }
+    return QString("ptm%1%2%3").arg(pappso::Utils::getLexicalOrderedString(_ptm_island_subgroup_p->getPtmIslandGroup()->getGroupNumber()))
+           .arg(pappso::Utils::getLexicalOrderedString(_ptm_island_subgroup_p->getSubgroupNumber())).arg(pappso::Utils::getLexicalOrderedString(_prot_number));
+}
+void PtmIsland::setPtmIslandSubgroup(PtmIslandSubgroup* p_ptm_island_subgroup) {
+    _ptm_island_subgroup_p = p_ptm_island_subgroup;
+}
+void PtmIsland::setProteinNumber(unsigned int prot_number) {
+    _prot_number = prot_number;
+}
 const ProteinMatch * PtmIsland::getProteinMatch() const {
     return _protein_match_p;
 }
diff --git a/src/grouping/ptm/ptmisland.h b/src/grouping/ptm/ptmisland.h
index cb9be5b13..62f13ac63 100644
--- a/src/grouping/ptm/ptmisland.h
+++ b/src/grouping/ptm/ptmisland.h
@@ -58,6 +58,11 @@ public:
     std::vector<std::size_t> getSampleScanSet() const;
     const ProteinMatch * getProteinMatch() const;
     unsigned int getProteinStartPosition() const;
+    void setPtmIslandSubgroup(PtmIslandSubgroup* p_ptm_island_subgroup);
+    void setProteinNumber(unsigned int prot_number);
+    
+    
+    const QString getGroupingId() const;
     
 private:
     const ProteinMatch * _protein_match_p;
@@ -66,6 +71,7 @@ private:
     std::vector<unsigned int> _position_list;
     unsigned int _protein_stop=0;
     unsigned int _protein_start=0;
+    unsigned int _prot_number=0;
     PtmIslandSubgroup * _ptm_island_subgroup_p = nullptr;
 };
 
diff --git a/src/grouping/ptm/ptmislandgroup.cpp b/src/grouping/ptm/ptmislandgroup.cpp
index b4abe62f9..c7cc921d3 100644
--- a/src/grouping/ptm/ptmislandgroup.cpp
+++ b/src/grouping/ptm/ptmislandgroup.cpp
@@ -57,6 +57,9 @@ QString PtmIslandGroup::getFirstAccession() const {
     return accession_list[0];
 }
 
+unsigned int PtmIslandGroup::getGroupNumber() const {
+    return _group_number;
+}
 void PtmIslandGroup::setGroupNumber(unsigned int number) {
     _group_number = number;
     for (PtmIslandSubgroupSp ptm_island_subgroup:_ptm_island_subgroup_list) {
diff --git a/src/grouping/ptm/ptmislandgroup.h b/src/grouping/ptm/ptmislandgroup.h
index 18038220e..bb3702d1f 100644
--- a/src/grouping/ptm/ptmislandgroup.h
+++ b/src/grouping/ptm/ptmislandgroup.h
@@ -54,6 +54,7 @@ public:
     unsigned int maxCountSampleScan() const;
     QString getFirstAccession() const;
     void setGroupNumber(unsigned int number);
+    unsigned int getGroupNumber() const;
 
 private :
     std::vector<PtmIslandSubgroupSp> _ptm_island_subgroup_list;
diff --git a/src/grouping/ptm/ptmislandsubgroup.cpp b/src/grouping/ptm/ptmislandsubgroup.cpp
index 6a0d99e5f..f1df0c123 100644
--- a/src/grouping/ptm/ptmislandsubgroup.cpp
+++ b/src/grouping/ptm/ptmislandsubgroup.cpp
@@ -50,8 +50,29 @@ const PtmIsland * PtmIslandSubgroup::getFirstPtmIsland() const {
     return _ptm_island_list.begin()->get();
 }
 
+const PtmIslandGroup * PtmIslandSubgroup::getPtmIslandGroup() const {
+    return _ptm_island_group_p;
+}
+
+unsigned int PtmIslandSubgroup::getSubgroupNumber() const {
+    return _subgroup_number;
+}
 void PtmIslandSubgroup::setSubgroupNumber(unsigned int number) {
     _subgroup_number = number;
+
+    for (PtmIslandSp ptm_island:_ptm_island_list) {
+        ptm_island.get()->setPtmIslandSubgroup(this);
+    }
+    std::sort(_ptm_island_list.begin(), _ptm_island_list.end(), [](const PtmIslandSp& a, const PtmIslandSp& b)
+    {
+        return  (a.get()->getProteinMatch()->getProteinXtpSp().get()->getAccession() < b.get()->getProteinMatch()->getProteinXtpSp().get()->getAccession());
+    });
+
+    unsigned int prot_number=0;
+    for (PtmIslandSp ptm_island:_ptm_island_list) {
+        prot_number ++;
+        ptm_island.get()->setProteinNumber(prot_number);
+    }
 }
 void PtmIslandSubgroup::setPtmIslandGroup(PtmIslandGroup * p_ptm_island_group) {
     _ptm_island_group_p = p_ptm_island_group;
diff --git a/src/grouping/ptm/ptmislandsubgroup.h b/src/grouping/ptm/ptmislandsubgroup.h
index 4148fa31f..0f83c6df7 100644
--- a/src/grouping/ptm/ptmislandsubgroup.h
+++ b/src/grouping/ptm/ptmislandsubgroup.h
@@ -60,7 +60,9 @@ public:
     void setPtmIslandGroup(PtmIslandGroup * p_ptm_island_group);
     
     const PtmIsland * getFirstPtmIsland() const;
+    unsigned int getSubgroupNumber() const;
     void setSubgroupNumber(unsigned int number);
+    const PtmIslandGroup * getPtmIslandGroup() const;
 
 private:
     std::vector< PtmIslandSp > _ptm_island_list;
diff --git a/src/gui/ptm_island_list_view/ptm_island_list_view.ui b/src/gui/ptm_island_list_view/ptm_island_list_view.ui
index c000cdcdf..f30486e35 100644
--- a/src/gui/ptm_island_list_view/ptm_island_list_view.ui
+++ b/src/gui/ptm_island_list_view/ptm_island_list_view.ui
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>PtmIslandListView</class>
+ <class>ptm_island_list_window</class>
  <widget class="QMainWindow" name="ptm_island_list_window">
   <property name="geometry">
    <rect>
@@ -54,7 +54,7 @@
      </layout>
     </item>
     <item>
-     <widget class="QTableView" name="tableView">
+     <widget class="QTableView" name="ptm_island_tableview">
       <property name="contextMenuPolicy">
        <enum>Qt::DefaultContextMenu</enum>
       </property>
@@ -111,95 +111,14 @@
      <x>0</x>
      <y>0</y>
      <width>826</width>
-     <height>25</height>
+     <height>23</height>
     </rect>
    </property>
   </widget>
   <widget class="QStatusBar" name="statusbar"/>
  </widget>
  <resources/>
- <connections>
-  <connection>
-   <sender>hideNotValidCheckBox</sender>
-   <signal>toggled(bool)</signal>
-   <receiver>ProteinView</receiver>
-   <slot>doNotValidHide(bool)</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>245</x>
-     <y>53</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>839</x>
-     <y>171</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>hideNotCheckedCheckBox</sender>
-   <signal>toggled(bool)</signal>
-   <receiver>ProteinView</receiver>
-   <slot>doNotCheckedHide(bool)</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>482</x>
-     <y>47</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>920</x>
-     <y>269</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>hideNotGroupedCheckBox</sender>
-   <signal>toggled(bool)</signal>
-   <receiver>ProteinView</receiver>
-   <slot>doNotGroupedHide(bool)</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>688</x>
-     <y>57</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>1079</x>
-     <y>360</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>protein_search_edit</sender>
-   <signal>textChanged(QString)</signal>
-   <receiver>ProteinView</receiver>
-   <slot>onProteinSearchEdit(QString)</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>352</x>
-     <y>363</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>879</x>
-     <y>391</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>search_combobox</sender>
-   <signal>activated(QString)</signal>
-   <receiver>ProteinView</receiver>
-   <slot>doSearchOn(QString)</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>121</x>
-     <y>354</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>867</x>
-     <y>386</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
+ <connections/>
  <slots>
   <slot>doNotValidHide(bool)</slot>
   <slot>doNotCheckedHide(bool)</slot>
-- 
GitLab