From 3674e012f27748aca8d8713eebc359e7ff0f1925 Mon Sep 17 00:00:00 2001
From: Olivier Langella <Olivier.Langella@moulon.inra.fr>
Date: Tue, 30 May 2017 23:21:04 +0200
Subject: [PATCH] new columns and titles

---
 src/grouping/ptm/ptmgroupingexperiment.cpp    |  7 +++
 src/grouping/ptm/ptmgroupingexperiment.h      |  3 +
 src/grouping/ptm/ptmisland.cpp                | 27 ++++++++-
 src/grouping/ptm/ptmisland.h                  |  4 ++
 .../protein_list_view/proteintablemodel.cpp   |  2 +-
 .../ptmislandtablemodel.cpp                   | 58 +++++++++++++++++--
 .../ptmislandtablemodel.h                     |  4 ++
 src/utils/types.h                             | 14 +++--
 8 files changed, 106 insertions(+), 13 deletions(-)

diff --git a/src/grouping/ptm/ptmgroupingexperiment.cpp b/src/grouping/ptm/ptmgroupingexperiment.cpp
index cf62c0ed6..b92db88d5 100644
--- a/src/grouping/ptm/ptmgroupingexperiment.cpp
+++ b/src/grouping/ptm/ptmgroupingexperiment.cpp
@@ -150,6 +150,13 @@ std::vector< PtmIslandSp > PtmGroupingExperiment::mergePeptideMatchPtmIslandList
 
 }
 
+    unsigned int PtmGroupingExperiment::countPeptideMatchPtm(const PeptideMatch* p_peptide_match)const {
+        unsigned int number=0;
+        for (pappso::AaModificationP modification: _modification_list) {
+            number +=  p_peptide_match->getPeptideXtpSp().get()->getNumberOfModification(modification);
+        }
+        return number;
+    }
 std::vector<unsigned int> PtmGroupingExperiment::getPtmPositions(const ProteinMatch * protein_match) const {
     std::vector<unsigned int> position_list;
 
diff --git a/src/grouping/ptm/ptmgroupingexperiment.h b/src/grouping/ptm/ptmgroupingexperiment.h
index e51e27cba..a8002b377 100644
--- a/src/grouping/ptm/ptmgroupingexperiment.h
+++ b/src/grouping/ptm/ptmgroupingexperiment.h
@@ -47,6 +47,9 @@ public:
     void startGrouping();
     
     const std::vector<PtmIslandSp> & getPtmIslandList() const;
+    /** @brief count number of modifications in a PeptideMatch
+     * */
+    unsigned int countPeptideMatchPtm(const PeptideMatch* p_peptide_match)const;
 
 private:
     std::vector<unsigned int> getPtmPositions(const ProteinMatch * protein_match) const;
diff --git a/src/grouping/ptm/ptmisland.cpp b/src/grouping/ptm/ptmisland.cpp
index 6d588704e..732c69e26 100644
--- a/src/grouping/ptm/ptmisland.cpp
+++ b/src/grouping/ptm/ptmisland.cpp
@@ -31,7 +31,9 @@
 #include <pappsomspp/pappsoexception.h>
 #include "ptmislandsubgroup.h"
 #include "ptmislandgroup.h"
+#include "ptmgroupingexperiment.h"
 #include <pappsomspp/utils.h>
+#include <set>
 
 PtmIsland::PtmIsland(const ProteinMatch* p_protein_match, unsigned int position):_protein_match_p(p_protein_match)
 {
@@ -47,9 +49,30 @@ PtmIsland::~PtmIsland()
 
 }
 
-    const std::vector<unsigned int> & PtmIsland::getPositionList() const {
-      return _position_list;
+unsigned int PtmIsland::countSampleScanMultiPtm(const PtmGroupingExperiment * p_ptm_grouping_experiment) const {
+    std::set<std::size_t> sample_scan_list;
+    for (auto & p_peptide_match : _peptide_match_list) {
+        if (p_ptm_grouping_experiment->countPeptideMatchPtm(p_peptide_match) > 1) {
+            sample_scan_list.insert(p_peptide_match->getHashSampleScan());
+        }
+    }
+    return sample_scan_list.size();
+}
+
+unsigned int PtmIsland::countSequence() const {
+    std::set<QString> sequence_list;
+    for (auto & p_peptide_match : _peptide_match_list) {
+        sequence_list.insert(p_peptide_match->getPeptideXtpSp().get()->getSequence());
     }
+    //qDebug() <<"ProteinMatch::countValidAndCheckedPeptide end " << sequence_list.size();
+    return sequence_list.size();
+}
+const PtmIslandSubgroup * PtmIsland::getPtmIslandSubroup() const {
+    return _ptm_island_subgroup_p;
+}
+const std::vector<unsigned int> & PtmIsland::getPositionList() const {
+    return _position_list;
+}
 const QString PtmIsland::getGroupingId() const {
     if(_prot_number==0) {
         return "";
diff --git a/src/grouping/ptm/ptmisland.h b/src/grouping/ptm/ptmisland.h
index a06a6f17c..f811f016e 100644
--- a/src/grouping/ptm/ptmisland.h
+++ b/src/grouping/ptm/ptmisland.h
@@ -34,6 +34,7 @@
 #include "../../core/peptidematch.h"
 #include <memory>
 
+class PtmGroupingExperiment;
 class PtmIslandSubgroup;
 
 class PtmIsland;
@@ -64,6 +65,9 @@ public:
     
     const QString getGroupingId() const;
     const std::vector<unsigned int> & getPositionList() const;
+    const PtmIslandSubgroup * getPtmIslandSubroup() const;
+    unsigned int countSequence() const;
+    unsigned int countSampleScanMultiPtm(const PtmGroupingExperiment * p_ptm_grouping_experiment) const;
     
 private:
     const ProteinMatch * _protein_match_p;
diff --git a/src/gui/protein_list_view/proteintablemodel.cpp b/src/gui/protein_list_view/proteintablemodel.cpp
index 8a7d41767..680c54020 100644
--- a/src/gui/protein_list_view/proteintablemodel.cpp
+++ b/src/gui/protein_list_view/proteintablemodel.cpp
@@ -170,7 +170,7 @@ QVariant ProteinTableModel::data(const QModelIndex &index, int role ) const {
             return QVariant ((qreal)_p_identification_group->getProteinMatchList().at(row)->getLogEvalue());
         }
         if (_column_assignment[col] == (std::int8_t) ProteinListColumn::spectrum ) {
-            return QVariant ((qreal) _p_identification_group->getProteinMatchList().at(row)->countPeptideMatch(ValidationState::validAndChecked));
+            return QVariant ((qreal) _p_identification_group->getProteinMatchList().at(row)->countSampleScan(ValidationState::validAndChecked));
         }
 
         if (_column_assignment[col] == (std::int8_t) ProteinListColumn::specific_spectrum ) {
diff --git a/src/gui/ptm_island_list_view/ptmislandtablemodel.cpp b/src/gui/ptm_island_list_view/ptmislandtablemodel.cpp
index 43ed0b6de..97102a3a9 100644
--- a/src/gui/ptm_island_list_view/ptmislandtablemodel.cpp
+++ b/src/gui/ptm_island_list_view/ptmislandtablemodel.cpp
@@ -30,13 +30,16 @@
 #include "ptmislandtablemodel.h"
 #include "ptmislandlistwindow.h"
 
-#include "../../utils/types.h"
 
 
 PtmIslandTableModel::columnMap PtmIslandTableModel::_column_assignment = {
     (std::int8_t)PtmIslandListColumn::ptm_island_id,
     (std::int8_t)PtmIslandListColumn::accession,
-    (std::int8_t)PtmIslandListColumn::ptm_position_list
+    (std::int8_t)PtmIslandListColumn::description,
+    (std::int8_t)PtmIslandListColumn::spectrum,
+    (std::int8_t)PtmIslandListColumn::sequence,
+    (std::int8_t)PtmIslandListColumn::ptm_position_list,
+    (std::int8_t)PtmIslandListColumn::multiptm
 };
 
 
@@ -48,6 +51,34 @@ PtmIslandTableModel::PtmIslandTableModel(PtmIslandListWindow * p_ptm_island_list
 PtmIslandTableModel::~PtmIslandTableModel()
 {
 
+}
+const QString PtmIslandTableModel::getTitle(std::int8_t column) const {
+    switch (column) {
+            
+      case (std::int8_t) PtmIslandListColumn::spectrum:
+	    return "spectrum";
+	break;
+    
+	  case (std::int8_t) PtmIslandListColumn::description:
+            return "description";
+	break; 
+	  case (std::int8_t) PtmIslandListColumn::multiptm:
+            return "multi PTM";
+	break; 
+      case (std::int8_t) PtmIslandListColumn::sequence:
+	    return "sequence";
+	break;
+	  case (std::int8_t) PtmIslandListColumn::ptm_island_id:
+            return "PTM island ID";
+	break;
+	  case (std::int8_t) PtmIslandListColumn::accession:
+            return "accession";
+	break; 
+	  case (std::int8_t) PtmIslandListColumn::ptm_position_list:
+	    return "ptm positions";
+
+	}
+    return "";
 }
 void PtmIslandTableModel::setIdentificationGroup(IdentificationGroup * p_identification_group) {
     qDebug() << "PtmIslandTableModel::setIdentificationGroup begin ";
@@ -75,7 +106,7 @@ int PtmIslandTableModel::rowCount(const QModelIndex &parent ) const {
 int PtmIslandTableModel::columnCount(const QModelIndex &parent ) const {
     //qDebug() << "ProteinTableModel::columnCount begin ";
     if (getPtmGroupingExperiment() != nullptr) {
-        return 3;
+        return 7;
     }
     return 0;
 }
@@ -84,6 +115,10 @@ QVariant PtmIslandTableModel::headerData(int section, Qt::Orientation orientatio
     if (getPtmGroupingExperiment() == nullptr) return QVariant();
     if (orientation == Qt::Horizontal)
     {
+        if (role == Qt::DisplayRole)
+            {
+                return QVariant(getTitle(_column_assignment [section]));
+            }
     }
     return QVariant();
 }
@@ -98,6 +133,20 @@ QVariant PtmIslandTableModel::data(const QModelIndex &index, int role ) const {
             return QVariant();
         }
         switch (_column_assignment [col]) {
+            
+      case (std::int8_t) PtmIslandListColumn::spectrum:
+	    return QVariant(getPtmGroupingExperiment()->getPtmIslandList().at(row).get()->getPtmIslandSubroup()->countSampleScan());
+	break;
+
+	  case (std::int8_t) PtmIslandListColumn::description:
+            return QVariant(getPtmGroupingExperiment()->getPtmIslandList().at(row).get()->getProteinMatch()->getProteinXtpSp().get()->getDescription());
+	break; 
+	  case (std::int8_t) PtmIslandListColumn::multiptm:
+            return QVariant(getPtmGroupingExperiment()->getPtmIslandList().at(row).get()->countSampleScanMultiPtm(getPtmGroupingExperiment()));
+	break; 
+      case (std::int8_t) PtmIslandListColumn::sequence:
+	    return QVariant(getPtmGroupingExperiment()->getPtmIslandList().at(row).get()->countSequence());
+	break;
 	  case (std::int8_t) PtmIslandListColumn::ptm_island_id:
             return QVariant(getPtmGroupingExperiment()->getPtmIslandList().at(row).get()->getGroupingId());
 	break;
@@ -110,7 +159,6 @@ QVariant PtmIslandTableModel::data(const QModelIndex &index, int role ) const {
 	      position_list << QString("%1").arg(position+1);
 	    }
             return QVariant(position_list.join(" "));
-	break;
 	}
     }
     return QVariant();
@@ -121,4 +169,4 @@ void PtmIslandTableModel::onPtmIslandDataChanged() {
     qDebug() << "PtmIslandTableModel::onPtmIslandDataChanged begin " << rowCount();
     emit layoutAboutToBeChanged();
     emit layoutChanged();
-}
\ No newline at end of file
+}
diff --git a/src/gui/ptm_island_list_view/ptmislandtablemodel.h b/src/gui/ptm_island_list_view/ptmislandtablemodel.h
index 7cb1ca930..808cca8d5 100644
--- a/src/gui/ptm_island_list_view/ptmislandtablemodel.h
+++ b/src/gui/ptm_island_list_view/ptmislandtablemodel.h
@@ -33,6 +33,7 @@
 #include <QAbstractTableModel>
 #include "../../core/identificationgroup.h"
 #include "../../grouping/ptm/ptmgroupingexperiment.h"
+#include "../../utils/types.h"
 
 class PtmIslandListWindow;
 class PtmIslandTableModel: public QAbstractTableModel
@@ -50,6 +51,9 @@ public:
     virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
     
     
+    const QString getTitle(std::int8_t column) const;
+    
+    
     using columnMap = std::int8_t[20];
 
 public slots:
diff --git a/src/utils/types.h b/src/utils/types.h
index a3934d2f6..38491498f 100644
--- a/src/utils/types.h
+++ b/src/utils/types.h
@@ -118,11 +118,15 @@ enum class ProteinListColumn {
  *
  */
 
-enum class PtmIslandListColumn: std::int8_t {
-     ptm_island_id=0, ///< ptm_island_id
-     accession=1, ///< protein accession
-     description=2, ///< protein description
-     ptm_position_list=3, ///< protein description
+enum class PtmIslandListColumn {
+     ptm_island_id, ///< ptm_island_id
+     accession, ///< protein accession
+     description, ///< protein description
+     ptm_position_list, ///< ptm position list
+     spectrum, ///< count sample scans
+     sequence, ///< unique sequence count
+     multiptm, ///< count multi ptm peptide match
+     
 };
 
 #endif /* _TYPES_H_ */
-- 
GitLab