From 0f0e4d5e89a012f70134d1a12170c6cb7f6f08cc Mon Sep 17 00:00:00 2001
From: Olivier Langella <Olivier.Langella@moulon.inra.fr>
Date: Thu, 27 Jul 2017 09:23:19 +0200
Subject: [PATCH] ptm position list for each ptm peptide

---
 src/grouping/ptm/ptmgroupingexperiment.cpp    | 26 +++++++++++++++----
 src/grouping/ptm/ptmgroupingexperiment.h      |  3 +++
 src/grouping/ptm/ptmsamplescan.cpp            |  7 ++++-
 src/grouping/ptm/ptmsamplescan.h              |  5 +++-
 .../ptmislandlistwindow.cpp                   |  4 +++
 .../ptmislandlistwindow.h                     |  1 +
 .../ptmpeptidelistwindow.cpp                  |  2 +-
 .../ptmpeptidetablemodel.cpp                  | 16 +++++++++---
 .../ptmpeptidetablemodel.h                    |  3 ++-
 9 files changed, 55 insertions(+), 12 deletions(-)

diff --git a/src/grouping/ptm/ptmgroupingexperiment.cpp b/src/grouping/ptm/ptmgroupingexperiment.cpp
index 5b157218f..8cbf7bb02 100644
--- a/src/grouping/ptm/ptmgroupingexperiment.cpp
+++ b/src/grouping/ptm/ptmgroupingexperiment.cpp
@@ -28,6 +28,7 @@
 ******************************************************************************/
 
 #include "ptmgroupingexperiment.h"
+#include "../../grouping/ptm/ptmgroupingexperiment.h"
 
 PtmGroupingExperiment::PtmGroupingExperiment()
 {
@@ -162,23 +163,38 @@ unsigned int PtmGroupingExperiment::countPeptideMatchPtm(const PeptideMatch* p_p
     }
     return number;
 }
-std::vector<unsigned int> PtmGroupingExperiment::getPtmPositions(const ProteinMatch * protein_match) const {
+
+std::vector<unsigned int> PtmGroupingExperiment::getPtmPositions(const PeptideMatch * p_peptide_match) const {
     std::vector<unsigned int> position_list;
 
-    for (PeptideMatch * p_peptide_match: protein_match->getPeptideMatchList(_peptide_validation_state)) {
-        unsigned int start = p_peptide_match->getStart();
         for (const ModificationAndAa & modification: _modification_list) {
             if (modification.aa_list.size() == 0) {
                 for (unsigned int position : p_peptide_match->getPeptideXtpSp().get()->getModificationPositionList(modification.modification)) {
-                    position_list.push_back(start+position);
+                    position_list.push_back(position);
                 }
             }
             else {
                 for (unsigned int position : p_peptide_match->getPeptideXtpSp().get()->getModificationPositionList(modification.modification, modification.aa_list)) {
-                    position_list.push_back(start+position);
+                    position_list.push_back(position);
                 }
             }
         }
+    
+    std::sort(position_list.begin(), position_list.end());
+    auto last = std::unique(position_list.begin(), position_list.end());
+    position_list.erase(last, position_list.end());
+    return position_list;
+}
+
+std::vector<unsigned int> PtmGroupingExperiment::getPtmPositions(const ProteinMatch * protein_match) const {
+    std::vector<unsigned int> position_list;
+
+    for (const PeptideMatch * p_peptide_match: protein_match->getPeptideMatchList(_peptide_validation_state)) {
+        unsigned int start = p_peptide_match->getStart();
+        std::vector<unsigned int> positionb_list = this->getPtmPositions(p_peptide_match);
+        for (unsigned int position: positionb_list) {
+            position_list.push_back(start+position);
+        }
     }
     std::sort(position_list.begin(), position_list.end());
     auto last = std::unique(position_list.begin(), position_list.end());
diff --git a/src/grouping/ptm/ptmgroupingexperiment.h b/src/grouping/ptm/ptmgroupingexperiment.h
index 852ec8f31..a96a52587 100644
--- a/src/grouping/ptm/ptmgroupingexperiment.h
+++ b/src/grouping/ptm/ptmgroupingexperiment.h
@@ -35,6 +35,7 @@
 #include "ptmisland.h"
 #include "ptmislandsubgroup.h"
 #include "ptmislandgroup.h"
+class PtmSampleScan;
 
 struct ModificationAndAa {
     pappso::AaModificationP modification;
@@ -43,6 +44,7 @@ struct ModificationAndAa {
 
 class PtmGroupingExperiment
 {
+    friend PtmSampleScan;
 public:
     PtmGroupingExperiment();
     ~PtmGroupingExperiment();
@@ -60,6 +62,7 @@ public:
 
 private:
     std::vector<unsigned int> getPtmPositions(const ProteinMatch * protein_match) const;
+    std::vector<unsigned int> getPtmPositions(const PeptideMatch * p_peptide_match) const;
 
     std::vector< PtmIslandSp > mergePeptideMatchPtmIslandList(vector< PtmIslandSp > ptm_island_list);
     void addPtmIsland(PtmIslandSp ptm_island);
diff --git a/src/grouping/ptm/ptmsamplescan.cpp b/src/grouping/ptm/ptmsamplescan.cpp
index 195649f2e..6e2d347b6 100644
--- a/src/grouping/ptm/ptmsamplescan.cpp
+++ b/src/grouping/ptm/ptmsamplescan.cpp
@@ -28,6 +28,7 @@
 ******************************************************************************/
 
 #include "ptmsamplescan.h"
+#include "../../grouping/ptm/ptmgroupingexperiment.h"
 
 PtmSampleScan::PtmSampleScan(const PeptideMatch * p_peptide_match) {
     _peptide_match_list.push_back(p_peptide_match);
@@ -61,7 +62,11 @@ bool PtmSampleScan::add(const PeptideMatch * p_peptide_match) {
     return true;
 }
 
-    std::vector<unsigned int> PtmSampleScan::getBestPtmPositionList() const {
+    std::vector<unsigned int> PtmSampleScan::getBestPtmPositionList(const PtmGroupingExperiment * p_ptm_grouping_experiment) const {
+        return p_ptm_grouping_experiment->getPtmPositions(getRepresentativePeptideMatch());
+    }
+
+    std::vector<unsigned int> PtmSampleScan::getObservedPtmPositionList(const PtmGroupingExperiment * p_ptm_grouping_experiment) const {
         std::vector<unsigned int> list;
         
         return list;
diff --git a/src/grouping/ptm/ptmsamplescan.h b/src/grouping/ptm/ptmsamplescan.h
index b03cd0177..9036a2768 100644
--- a/src/grouping/ptm/ptmsamplescan.h
+++ b/src/grouping/ptm/ptmsamplescan.h
@@ -33,6 +33,7 @@
 #include <memory>
 #include "../../core/peptidematch.h"
 
+class PtmGroupingExperiment;
 class PtmSampleScan;
 
 /** \brief shared pointer on a PtmSampleScan object
@@ -49,7 +50,9 @@ public:
     
     const PeptideMatch * getRepresentativePeptideMatch() const;
     bool add(const PeptideMatch * p_peptide_match);
-    std::vector<unsigned int> getBestPtmPositionList() const;
+    std::vector<unsigned int> getBestPtmPositionList(const PtmGroupingExperiment * p_ptm_grouping_experiment) const;
+    std::vector<unsigned int> getObservedPtmPositionList(const PtmGroupingExperiment * p_ptm_grouping_experiment) const;
+    
 private:
     std::vector<const PeptideMatch *> _peptide_match_list;
 
diff --git a/src/gui/ptm_island_list_view/ptmislandlistwindow.cpp b/src/gui/ptm_island_list_view/ptmislandlistwindow.cpp
index e2ad12ad0..23c23804a 100644
--- a/src/gui/ptm_island_list_view/ptmislandlistwindow.cpp
+++ b/src/gui/ptm_island_list_view/ptmislandlistwindow.cpp
@@ -150,3 +150,7 @@ void PtmIslandListWindow::askViewPtmPeptideList(PtmIsland * ptm_island) {
     _p_current_ptm_peptide_list_window->show();
 
 }
+
+    const IdentificationGroup * PtmIslandListWindow::getIdentificationGroup() const {
+        return _p_identification_group;
+    }
diff --git a/src/gui/ptm_island_list_view/ptmislandlistwindow.h b/src/gui/ptm_island_list_view/ptmislandlistwindow.h
index 868fdb7fb..e454e9834 100644
--- a/src/gui/ptm_island_list_view/ptmislandlistwindow.h
+++ b/src/gui/ptm_island_list_view/ptmislandlistwindow.h
@@ -50,6 +50,7 @@ public:
     ~PtmIslandListWindow();
     void setIdentificationGroup(IdentificationGroup * p_identification_group);
     void resizeColumnsToContents();
+    const IdentificationGroup * getIdentificationGroup() const;
 
 
 public slots:
diff --git a/src/gui/ptm_peptide_list_view/ptmpeptidelistwindow.cpp b/src/gui/ptm_peptide_list_view/ptmpeptidelistwindow.cpp
index 4b1bd7019..15ec5d135 100644
--- a/src/gui/ptm_peptide_list_view/ptmpeptidelistwindow.cpp
+++ b/src/gui/ptm_peptide_list_view/ptmpeptidelistwindow.cpp
@@ -72,5 +72,5 @@ PtmPeptideListWindow::~PtmPeptideListWindow() {
 }
 void PtmPeptideListWindow::setPtmIsland(PtmIsland * p_ptm_island) {
     _p_ptm_island = p_ptm_island;
-    _ptm_table_model_p->setPtmIsland(_p_ptm_island);
+    _ptm_table_model_p->setPtmIsland(_p_ptm_island_list_window->getIdentificationGroup()->getPtmGroupingExperiment(), _p_ptm_island);
 }
diff --git a/src/gui/ptm_peptide_list_view/ptmpeptidetablemodel.cpp b/src/gui/ptm_peptide_list_view/ptmpeptidetablemodel.cpp
index 225405c54..9a7a17818 100644
--- a/src/gui/ptm_peptide_list_view/ptmpeptidetablemodel.cpp
+++ b/src/gui/ptm_peptide_list_view/ptmpeptidetablemodel.cpp
@@ -29,6 +29,7 @@
 #include "ptmpeptidetablemodel.h"
 #include "ptmpeptidelistwindow.h"
 #include <QDebug>
+#include <QStringList>
 
 PtmPeptideTableModel::PtmPeptideTableModel(PtmPeptideListWindow * p_ptm_peptide_list_window) {
 }
@@ -153,7 +154,7 @@ int PtmPeptideTableModel::rowCount(const QModelIndex &parent ) const {
 }
 int PtmPeptideTableModel::columnCount(const QModelIndex &parent ) const {
     //qDebug() << "ProteinTableModel::columnCount begin ";
-    return 12;
+    return 15;
 }
 QVariant PtmPeptideTableModel::headerData(int section, Qt::Orientation orientation, int role) const
 {
@@ -175,6 +176,7 @@ QVariant PtmPeptideTableModel::data(const QModelIndex &index, int role ) const {
     // generate a log message when this method gets called
     int row = index.row();
     int col = index.column();
+                QStringList position_list;
     
     if (row >= _ptm_sample_scan_list.size()) return QVariant();
     switch(role) {
@@ -221,10 +223,17 @@ QVariant PtmPeptideTableModel::data(const QModelIndex &index, int role ) const {
                 return _ptm_sample_scan_list.at(row).get()->getRepresentativePeptideMatch()->getParam(PeptideMatchParam::tandem_hyperscore);
                 break;
             case (std::int8_t)PtmPeptideListColumn::bestposition:
-                //return _ptm_sample_scan_list.at(row).get()->getBestPtmPositionList();
+                for (unsigned int position :_ptm_sample_scan_list.at(row).get()->getBestPtmPositionList(_p_ptm_grouping_experiment)) {
+                    position_list << QString("%1").arg(position+1);
+                }
+                return QVariant(position_list.join(" "));
                 break;
             case (std::int8_t)PtmPeptideListColumn::allobservedposition:
                 //return _ptm_sample_scan_list.at(row).get()->getObservedPtmPositionList();
+                for (unsigned int position :_ptm_sample_scan_list.at(row).get()->getObservedPtmPositionList(_p_ptm_grouping_experiment)) {
+                    position_list << QString("%1").arg(position+1);
+                }
+                return QVariant(position_list.join(" "));
                 break;
 
         }
@@ -232,10 +241,11 @@ QVariant PtmPeptideTableModel::data(const QModelIndex &index, int role ) const {
     return QVariant();
 }
 
-void PtmPeptideTableModel::setPtmIsland(PtmIsland * ptm_island) {
+void PtmPeptideTableModel::setPtmIsland(const PtmGroupingExperiment * p_ptm_grouping_experiment, PtmIsland * ptm_island) {
      qDebug() << "tmPeptideTableModel::setPtmIsland begin ";    
     
     beginResetModel();
+    _p_ptm_grouping_experiment = p_ptm_grouping_experiment;
     _p_ptm_island = ptm_island;
 _ptm_sample_scan_list = ptm_island->getPtmSampleScanSpList();
     //emit headerDataChanged(Qt::Horizontal, 0,11);
diff --git a/src/gui/ptm_peptide_list_view/ptmpeptidetablemodel.h b/src/gui/ptm_peptide_list_view/ptmpeptidetablemodel.h
index d16270d49..603d5346c 100644
--- a/src/gui/ptm_peptide_list_view/ptmpeptidetablemodel.h
+++ b/src/gui/ptm_peptide_list_view/ptmpeptidetablemodel.h
@@ -73,7 +73,7 @@ public:
     static const QString getDescription(PtmPeptideListColumn column);
 
     ~PtmPeptideTableModel();
-    void setPtmIsland(PtmIsland * ptm_island);
+    void setPtmIsland(const PtmGroupingExperiment * p_ptm_grouping_experiment, PtmIsland * ptm_island);
     
 private :
     static const QString getTitle(std::int8_t column);
@@ -82,6 +82,7 @@ private :
 private:
     std::vector<PtmSampleScanSp> _ptm_sample_scan_list;
     const PtmIsland * _p_ptm_island;
+    const PtmGroupingExperiment * _p_ptm_grouping_experiment;
 };
 
 #endif // PTMPEPTIDETABLEMODEL_H
-- 
GitLab