From dac373514e2527cb98a8ccce9d56d9008a998294 Mon Sep 17 00:00:00 2001
From: Olivier Langella <Olivier.Langella@moulon.inra.fr>
Date: Sat, 1 Apr 2017 22:54:33 +0200
Subject: [PATCH] reading spectrum

---
 .../identificationdatasource.cpp              |  7 ++
 .../identificationdatasource.h                |  2 +-
 .../identificationxtandemfile.cpp             |  2 +-
 src/gui/peptide_detail_view/peptidewindow.cpp | 20 ++++-
 src/gui/peptide_detail_view/peptidewindow.h   |  2 +
 src/gui/project_view/projectwindow.cpp        | 14 +++-
 src/utils/readspectrum.cpp                    | 78 ++++++++++++++++++-
 src/utils/readspectrum.h                      | 17 ++--
 8 files changed, 130 insertions(+), 12 deletions(-)

diff --git a/src/core/identification_sources/identificationdatasource.cpp b/src/core/identification_sources/identificationdatasource.cpp
index b8dcb46ba..02b348175 100644
--- a/src/core/identification_sources/identificationdatasource.cpp
+++ b/src/core/identification_sources/identificationdatasource.cpp
@@ -24,6 +24,7 @@
 #include "identificationxtandemfile.h"
 #include <pappsomspp/pappsoexception.h>
 #include <QFileInfo>
+#include "../../utils/readspectrum.h"
 
 
 IdentificationDataSource::MapIdentificationDataSources IdentificationDataSource::_map_identification_data_sources = []
@@ -86,3 +87,9 @@ void IdentificationDataSource::setMsRunSp (pappso::MsRunIdSp ms_run_sp) {
 pappso::MsRunIdSp IdentificationDataSource::getMsRunSp () const {
     return (_ms_run_sp);
 }
+
+
+pappso::SpectrumSp IdentificationDataSource::getSpectrumSp(unsigned int scan_number) const {
+    pappso::SpectrumSp spectrum_sp = SpectrumStore::getSpectrumSpFromMsRunIdSp(_ms_run_sp, scan_number);
+    return spectrum_sp;
+}
diff --git a/src/core/identification_sources/identificationdatasource.h b/src/core/identification_sources/identificationdatasource.h
index 6b90eff21..ebac8d5c8 100644
--- a/src/core/identification_sources/identificationdatasource.h
+++ b/src/core/identification_sources/identificationdatasource.h
@@ -46,7 +46,7 @@ public:
     pappso::MsRunIdSp getMsRunSp () const;
     /** @brief get the spectrum with scan number
      * */
-    virtual pappso::SpectrumSp getSpectrumSp(unsigned int scan_number) const = 0;
+    virtual pappso::SpectrumSp getSpectrumSp(unsigned int scan_number) const;
 
 protected :
     QString _resource_name;
diff --git a/src/core/identification_sources/identificationxtandemfile.cpp b/src/core/identification_sources/identificationxtandemfile.cpp
index 41b4d0e32..ec3b44cb2 100644
--- a/src/core/identification_sources/identificationxtandemfile.cpp
+++ b/src/core/identification_sources/identificationxtandemfile.cpp
@@ -41,6 +41,6 @@ bool IdentificationXtandemFile::operator==(const IdentificationXtandemFile& othe
 }
 
 pappso::SpectrumSp IdentificationXtandemFile::getSpectrumSp(unsigned int scan_number) const {
-    pappso::SpectrumSp spectrum_sp;
+    pappso::SpectrumSp spectrum_sp = IdentificationDataSource::getSpectrumSp(scan_number);
     return spectrum_sp;
 }
diff --git a/src/gui/peptide_detail_view/peptidewindow.cpp b/src/gui/peptide_detail_view/peptidewindow.cpp
index 9f68d3b54..638bcdc3d 100644
--- a/src/gui/peptide_detail_view/peptidewindow.cpp
+++ b/src/gui/peptide_detail_view/peptidewindow.cpp
@@ -25,7 +25,9 @@
 #include "../project_view/projectwindow.h"
 #include "ui_peptide_detail_view.h"
 #include <pappsomspp/pappsoexception.h>
+#include <pappsomspp/spectrum/qualifiedspectrum.h>
 #include <QMessageBox>
+#include <QSettings>
 
 PeptideWindow::PeptideWindow(ProjectWindow *parent):
     QMainWindow(parent),
@@ -36,6 +38,15 @@ PeptideWindow::PeptideWindow(ProjectWindow *parent):
     /*
     */
 
+    QSettings settings;
+    QString unit = settings.value("peptideview/precision_unit", "dalton").toString();
+    pappso::mz precision = settings.value("peptideview/precision_value", "0.2").toDouble();
+
+    if (unit == "dalton") {
+        _p_precision = Precision::getDaltonInstance(precision);
+    } else {
+        _p_precision = Precision::getPpmInstance(precision);
+    }
 
 #if QT_VERSION >= 0x050000
     // Qt5 code
@@ -86,6 +97,13 @@ void PeptideWindow::updateDisplay() {
 void PeptideWindow::setPeptideMatch(PeptideMatch * p_peptide_match) {
     _p_peptide_match = p_peptide_match;
     
-    SpectrumSp spectrum = _p_peptide_match->getIdentificationDataSource()->getSpectrumSp(_p_peptide_match->getScan());
+    SpectrumSp spectrum = _p_peptide_match->getIdentificationDataSource()->getSpectrumSp(_p_peptide_match->getScan());  
+    pappso::QualifiedSpectrum spectrum_copy;
+    spectrum_copy.setOriginalSpectrumSp(spectrum);
+    ui->spectrumWidget->setQualifiedSpectrum(spectrum_copy);
+
+    pappso::PeptideSp peptide = p_peptide_match->getPeptideXtpSp();
+    ui->spectrumWidget->setPrecision(_p_precision);
+    ui->spectrumWidget->setPeptideSp(peptide);
     updateDisplay();
 }
diff --git a/src/gui/peptide_detail_view/peptidewindow.h b/src/gui/peptide_detail_view/peptidewindow.h
index 6253878af..cddfc11eb 100644
--- a/src/gui/peptide_detail_view/peptidewindow.h
+++ b/src/gui/peptide_detail_view/peptidewindow.h
@@ -25,6 +25,7 @@
 
 #include <QMainWindow>
 #include <QTextDocument>
+#include <pappsomspp/mass_range.h>
 #include "../../core/peptidematch.h"
 #include "../../core/identificationgroup.h"
 
@@ -53,6 +54,7 @@ private:
     Ui::PeptideDetailView *ui;
     ProjectWindow * _p_project_window;
     PeptideMatch * _p_peptide_match = nullptr;
+    pappso::PrecisionP _p_precision;
 
 };
 
diff --git a/src/gui/project_view/projectwindow.cpp b/src/gui/project_view/projectwindow.cpp
index b1f4fcc7a..57f6c18fe 100644
--- a/src/gui/project_view/projectwindow.cpp
+++ b/src/gui/project_view/projectwindow.cpp
@@ -116,7 +116,7 @@ void ProjectWindow::refreshGroup(IdentificationGroup * p_ident_group) {
     }
     else {
         try {
-            vector< MsRunIdSp > ms_run_list = p_ident_group->getMsRunIdSpList();
+            vector< pappso::MsRunIdSp > ms_run_list = p_ident_group->getMsRunIdSpList();
             ui->sample_number_display->setText(QString("%1").arg(ms_run_list.size()));
 
             ui->group_number_display->setText(QString("%1").arg(p_ident_group->countGroup()));
@@ -251,6 +251,18 @@ void ProjectWindow::setProjectSp(ProjectSp project_sp) {
     _protein_list_window_collection.clear();
     _p_current_protein_list_window = nullptr;
 
+    for (auto && p_window :_protein_detail_window_collection) {
+        delete p_window;
+    }
+    _protein_detail_window_collection.clear();
+    _p_current_protein_detail_window = nullptr;
+
+    for (auto && p_window :_peptide_detail_window_collection) {
+        delete p_window;
+    }
+    _peptide_detail_window_collection.clear();
+    _p_current_peptide_detail_window = nullptr;
+
     _project_sp = project_sp;
     refreshGroup(_project_sp.get()->getCurrentIdentificationGroupP());
     //_protein_list_window->setIdentificationGroup(_project_sp.get()->getCurrentIdentificationGroupP());
diff --git a/src/utils/readspectrum.cpp b/src/utils/readspectrum.cpp
index 37944bff5..e44815461 100644
--- a/src/utils/readspectrum.cpp
+++ b/src/utils/readspectrum.cpp
@@ -24,6 +24,9 @@
 #include "readspectrum.h"
 
 #include <QDebug>
+#include <QSettings>
+#include <QFileInfo>
+#include <QDir>
 #include <pappsomspp/spectrum/spectrum.h>
 #include <pappsomspp/exception/exceptionnotfound.h>
 
@@ -40,7 +43,7 @@ using namespace pappso;
 
 
 pwiz::msdata::MSDataFile * getPwizMSDataFile(const QString & filename) {
-      qDebug() << "getPwizMSDataFile opening file " << filename ;
+    qDebug() << "getPwizMSDataFile opening file " << filename ;
     std::string env;
     env=setlocale(LC_ALL,"");
     struct lconv * lc = localeconv ();
@@ -59,8 +62,8 @@ pwiz::msdata::MSDataFile * getPwizMSDataFile(const QString & filename) {
 SpectrumSp getSpectrumSpFromPwizMSDataFile(pwiz::msdata::MSDataFile * p_ms_data_file, unsigned int scan_num, unsigned int & precursor_charge_state) {
 
     if (p_ms_data_file == nullptr) {
-      SpectrumSp empty;
-      return (empty);
+        SpectrumSp empty;
+        return (empty);
     }
 
     const bool getBinaryData = true;
@@ -216,3 +219,72 @@ Spectrum readSpectrum(const QString & filename, unsigned int scan_num, unsigned
     //qDebug() << " env=" << localeconv () << " lc->decimal_point " << lc->decimal_point;
     return spectrum;
 }
+
+
+std::map<pappso::MsRunIdSp, pwiz::msdata::MSDataFile *> create_map()
+{
+    std::map<pappso::MsRunIdSp, pwiz::msdata::MSDataFile *> m;
+    return m;
+}
+
+std::map<pappso::MsRunIdSp, pwiz::msdata::MSDataFile *> SpectrumStore::_map_msrun_msdatafile = create_map();
+
+
+const QString SpectrumStore::findMzFile(const QString &filename) {
+
+    QFileInfo file(filename);
+
+    if (file.exists()) {
+        return file.absoluteFilePath();
+    }
+
+    QString basename = file.baseName();
+    QString onlyfilename = file.fileName();
+    QSettings settings;
+    QString path = settings.value("path/mzdatadir", "/gorgone/pappso/formation/Janvier2014/TD/mzXML").toString();
+
+    QDir dir_search(path);
+
+    QFileInfoList files = dir_search.entryInfoList();
+    foreach (QFileInfo file, files) {
+        if (file.isDir()) {
+            qDebug() << "DIR: " << file.fileName();
+        } else {
+            qDebug() << "FILE: " << file.fileName();
+            if (onlyfilename == file.fileName()) {
+                return file.absoluteFilePath();
+            }
+            if (file.fileName().contains(onlyfilename)) {
+                return file.absoluteFilePath();
+            }
+        }
+    }
+    return QString();
+}
+
+pappso::SpectrumSp SpectrumStore::getSpectrumSpFromMsRunIdSp(pappso::MsRunIdSp msrun, unsigned int scan_num) {
+    pappso::SpectrumSp spectrum;
+    pwiz::msdata::MSDataFile * p_msdatafile = nullptr;
+    std::map<pappso::MsRunIdSp, pwiz::msdata::MSDataFile *>::iterator it_msdata = _map_msrun_msdatafile.find(msrun);
+    if (it_msdata == _map_msrun_msdatafile.end()) {
+        //not found
+
+        QString mz_file = findMzFile(msrun.get()->getFilename());
+        if (mz_file.isEmpty()) {
+            qDebug() << "SpectrumStore::getSpectrumSpFromMsRunIdSp ERROR file not found " << msrun.get()->getFilename();
+            return spectrum;
+        }
+        p_msdatafile = getPwizMSDataFile(mz_file);
+        _map_msrun_msdatafile.insert(std::pair<pappso::MsRunIdSp, pwiz::msdata::MSDataFile *>(msrun, p_msdatafile));
+    }
+    else {
+        p_msdatafile =it_msdata->second;
+    }
+    if (p_msdatafile == nullptr) {
+        return spectrum;
+    }
+    unsigned int precursor_charge_state;
+    spectrum = getSpectrumSpFromPwizMSDataFile(p_msdatafile, scan_num, precursor_charge_state);
+    return spectrum;
+
+}
diff --git a/src/utils/readspectrum.h b/src/utils/readspectrum.h
index da0cfeb53..919f7bd80 100644
--- a/src/utils/readspectrum.h
+++ b/src/utils/readspectrum.h
@@ -26,15 +26,22 @@
 
 #include <QString>
 #include <pappsomspp/spectrum/spectrum.h>
-
+#include <pappsomspp/msrun/msrunid.h>
 #include <pwiz/data/msdata/MSDataFile.hpp>
+#include <map>
 
-using namespace pappso;
-
-Spectrum readSpectrum(const QString & filename, unsigned int scan_num,unsigned int & precursor_charge_state);
+pappso::Spectrum readSpectrum(const QString & filename, unsigned int scan_num,unsigned int & precursor_charge_state);
 
 pwiz::msdata::MSDataFile * getPwizMSDataFile(const QString & filename);
 
-SpectrumSp getSpectrumSpFromPwizMSDataFile(pwiz::msdata::MSDataFile * p_ms_data_file, unsigned int scan_num, unsigned int & precursor_charge_state);
+pappso::SpectrumSp getSpectrumSpFromPwizMSDataFile(pwiz::msdata::MSDataFile * p_ms_data_file, unsigned int scan_num, unsigned int & precursor_charge_state);
 
+class SpectrumStore {
+public:
+    static pappso::SpectrumSp getSpectrumSpFromMsRunIdSp(pappso::MsRunIdSp msrun, unsigned int scan_num);
+private:
+    static const QString findMzFile(const QString &filename);
+private:
+    static std::map<pappso::MsRunIdSp, pwiz::msdata::MSDataFile *> _map_msrun_msdatafile;
+};
 #endif // READSPECTRUM_H
-- 
GitLab