From 187ec63d8b93885d857a41e095d55975a25dad5c Mon Sep 17 00:00:00 2001
From: Olivier Langella <olivier.langella@u-psud.fr>
Date: Fri, 29 Sep 2017 15:46:19 +0200
Subject: [PATCH] catch exception in FDR and mass precision computation

---
 src/gui/project_view/projectwindow.cpp | 101 +++++++++++++++----------
 1 file changed, 60 insertions(+), 41 deletions(-)

diff --git a/src/gui/project_view/projectwindow.cpp b/src/gui/project_view/projectwindow.cpp
index f7ca05616..10723c89f 100644
--- a/src/gui/project_view/projectwindow.cpp
+++ b/src/gui/project_view/projectwindow.cpp
@@ -207,57 +207,76 @@ void ProjectWindow::refreshGroup(IdentificationGroup * p_ident_group) {
 
 void ProjectWindow::computeFdr() {
     qDebug() << "ProjectWindow::computeFdr begin";
-    ValidationState state = ValidationState::valid;
-    pappso::pappso_double total_prot=0;
-    pappso::pappso_double false_prot=0;
-    pappso::pappso_double total_peptide=0;
-    pappso::pappso_double false_peptide=0;
-    for (IdentificationGroup * identification_group : _project_sp.get()->getIdentificationGroupList()) {
-        total_prot += identification_group->countProteinMatch(state);
-        false_prot += identification_group->countDecoyProteinMatch(state);
-        //total_peptide += identification_group->countPeptideMatch(state);
-        //false_peptide += identification_group->countDecoyPeptideMatch(state);
-        total_peptide += identification_group->countPeptideMassSample(state);
-        false_peptide += identification_group->countDecoyPeptideMassSample(state);
-    }
-    ui->protein_fdr_label->setText(QString("%1 %").arg(QString::number((false_prot/total_prot)*100.0,'f',10)));
-    ui->peptide_fdr_label->setText(QString("%1 %").arg(QString::number((false_peptide/total_peptide)*100.0,'f',10)));
-    
+    try {
+        ValidationState state = ValidationState::valid;
+        pappso::pappso_double total_prot=0;
+        pappso::pappso_double false_prot=0;
+        pappso::pappso_double total_peptide=0;
+        pappso::pappso_double false_peptide=0;
+        for (IdentificationGroup * identification_group : _project_sp.get()->getIdentificationGroupList()) {
+            total_prot += identification_group->countProteinMatch(state);
+            false_prot += identification_group->countDecoyProteinMatch(state);
+            //total_peptide += identification_group->countPeptideMatch(state);
+            //false_peptide += identification_group->countDecoyPeptideMatch(state);
+            total_peptide += identification_group->countPeptideMassSample(state);
+            false_peptide += identification_group->countDecoyPeptideMassSample(state);
+        }
+        ui->protein_fdr_label->setText(QString("%1 %").arg(QString::number((false_prot/total_prot)*100.0,'f',10)));
+        ui->peptide_fdr_label->setText(QString("%1 %").arg(QString::number((false_peptide/total_peptide)*100.0,'f',10)));
+    }
+    catch (pappso::PappsoException exception_pappso) {
+        QMessageBox::warning(this,
+                             tr("Unable to compute FDR :"), exception_pappso.qwhat());
+    }
+    catch (std::exception exception_std) {
+        QMessageBox::warning(this,
+                             tr("Unable to compute FDR :"), exception_std.what());
+    }
     qDebug() << "ProjectWindow::computeFdr end";
 }
 
 void ProjectWindow::computeMassPrecision() {
     qDebug() << "ProjectWindow::computeMassPrecision begin";
-    ValidationState state = ValidationState::validAndChecked;
-    std::vector< pappso::pappso_double> delta_list;
-    pappso::PrecisionUnit unit = pappso::PrecisionUnit::dalton;
-    if (ui->precision_unit_combobox->currentText() == "ppm") {
-        unit = pappso::PrecisionUnit::ppm;
-    }
+    try {
+        ValidationState state = ValidationState::validAndChecked;
+        std::vector< pappso::pappso_double> delta_list;
+        pappso::PrecisionUnit unit = pappso::PrecisionUnit::dalton;
+        if (ui->precision_unit_combobox->currentText() == "ppm") {
+            unit = pappso::PrecisionUnit::ppm;
+        }
 
-    for (IdentificationGroup * identification_group : _project_sp.get()->getIdentificationGroupList()) {
-        identification_group->collectMhDelta(delta_list, unit, state);
-    }
+        for (IdentificationGroup * identification_group : _project_sp.get()->getIdentificationGroupList()) {
+            identification_group->collectMhDelta(delta_list, unit, state);
+        }
 
 
-    pappso::pappso_double sum = std::accumulate(delta_list.begin(), delta_list.end(), 0);
+        pappso::pappso_double sum = std::accumulate(delta_list.begin(), delta_list.end(), 0);
 
-    pappso::pappso_double mean = sum / ((pappso::pappso_double) delta_list.size());
+        pappso::pappso_double mean = sum / ((pappso::pappso_double) delta_list.size());
 
-    std::sort(delta_list.begin(), delta_list.end());
-    pappso::pappso_double median = delta_list[(delta_list.size()/2)];
+        std::sort(delta_list.begin(), delta_list.end());
+        pappso::pappso_double median = delta_list[(delta_list.size()/2)];
 
-    pappso::pappso_double sd = 0;
-    for (pappso::pappso_double val : delta_list) {
-        //sd = sd + ((val - mean) * (val - mean));
-        sd += std::pow((val - mean), 2);
-    }
-    sd = sd / delta_list.size();
-    sd = std::sqrt(sd);
+        pappso::pappso_double sd = 0;
+        for (pappso::pappso_double val : delta_list) {
+            //sd = sd + ((val - mean) * (val - mean));
+            sd += std::pow((val - mean), 2);
+        }
+        sd = sd / delta_list.size();
+        sd = std::sqrt(sd);
 
-    ui->mass_precision_mean_label->setText(QString::number(mean,'f',10));
-    ui->mass_precision_median_label->setText(QString::number(median,'f',10));
-    ui->mass_precision_sd_label->setText(QString::number(sd,'f',10));
+        ui->mass_precision_mean_label->setText(QString::number(mean,'f',10));
+        ui->mass_precision_median_label->setText(QString::number(median,'f',10));
+        ui->mass_precision_sd_label->setText(QString::number(sd,'f',10));
+    }
+    catch (pappso::PappsoException exception_pappso) {
+        QMessageBox::warning(this,
+                             tr("Unable to compute mass precision :"), exception_pappso.qwhat());
+    }
+    catch (std::exception exception_std) {
+        QMessageBox::warning(this,
+                             tr("Unable to compute mass precision :"), exception_std.what());
+    }
     qDebug() << "ProjectWindow::computeMassPrecision end";
 }
 
@@ -274,7 +293,7 @@ void ProjectWindow::doFdrChanged() {
                 p_fasta_file->setDecoys(_project_sp.get()->getProteinStore());
             }
             else {
-                 throw pappso::PappsoException(QObject::tr("can not convert to FastaFile index.data().canConvert<FastaFile *>()"));
+                throw pappso::PappsoException(QObject::tr("can not convert to FastaFile index.data().canConvert<FastaFile *>()"));
             }
         }
     }
@@ -310,7 +329,7 @@ void ProjectWindow::doAutomaticFilterParametersChanged(AutomaticFilterParameters
                 p_fasta_file->setContaminants(_project_sp.get()->getProteinStore());
             }
             else {
-                 throw pappso::PappsoException(QObject::tr("can not convert to FastaFile index.data().canConvert<FastaFile *>()"));
+                throw pappso::PappsoException(QObject::tr("can not convert to FastaFile index.data().canConvert<FastaFile *>()"));
             }
         }
     }
-- 
GitLab