From b7c9c59ea34193b7306a2f469de59ca1c2fe9d62 Mon Sep 17 00:00:00 2001
From: Olivier Langella <Olivier.Langella@moulon.inra.fr>
Date: Fri, 7 Apr 2017 20:43:46 +0200
Subject: [PATCH] FDR computation OK

---
 src/core/identificationgroup.cpp | 55 ++++++++------------------------
 src/core/peptidematch.cpp        | 10 +++---
 src/core/proteinmatch.cpp        | 12 +++----
 src/utils/types.h                | 11 ++++---
 4 files changed, 30 insertions(+), 58 deletions(-)

diff --git a/src/core/identificationgroup.cpp b/src/core/identificationgroup.cpp
index df013590e..602d9cf02 100644
--- a/src/core/identificationgroup.cpp
+++ b/src/core/identificationgroup.cpp
@@ -54,34 +54,20 @@ unsigned int IdentificationGroup::countDecoyPeptideMatch(ValidationState state)
     return i;
 }
 unsigned int IdentificationGroup::countDecoyProtein(ValidationState state) const {
-    unsigned int i=0;
-    for (auto & p_protein_match : _protein_match_list) {
-        if (!p_protein_match->getProteinXtpSp().get()->isDecoy()) continue;
-        if (state == ValidationState::grouped) {
-            if (p_protein_match->isGrouped()) {
-                i++;
-            }
-        }
-        else if(state == ValidationState::valid) {
-            if (p_protein_match->isValid()) {
-                i++;
-            }
-
+    return std::count_if (_protein_match_list.begin(), _protein_match_list.end(), [state](const ProteinMatch * p_protein_match) {
+        if ((p_protein_match->getProteinXtpSp().get()->isDecoy()) && (p_protein_match->getValidationState() >= state)) {
+            return true;
         }
-        else if (state == ValidationState::validAndChecked) {
-            if (p_protein_match->isValidAndChecked()) {
-                i++;
-            }
-
+        else              {
+            return false;
         }
-    }
-    return i;
+    });
 }
 
 unsigned int IdentificationGroup::countPeptideMatch(ValidationState state) const {
     unsigned int i=0;
     for (auto & p_protein_match : _protein_match_list) {
-        if (p_protein_match->getValidationState() == state) {
+        if (p_protein_match->getValidationState() >= state) {
             i+=p_protein_match->countPeptideMatch(state);
         }
     }
@@ -89,29 +75,14 @@ unsigned int IdentificationGroup::countPeptideMatch(ValidationState state) const
 }
 
 unsigned int IdentificationGroup::countProtein(ValidationState state) const {
-    unsigned int i=0;
-    if (state == ValidationState::grouped) {
-        for (auto & p_protein_match : _protein_match_list) {
-            if (p_protein_match->isGrouped()) {
-                i++;
-            }
-        }
-    }
-    else if(state == ValidationState::valid) {
-        for (auto & p_protein_match : _protein_match_list) {
-            if (p_protein_match->isValid()) {
-                i++;
-            }
+    return std::count_if (_protein_match_list.begin(), _protein_match_list.end(), [state](const ProteinMatch * p_protein_match) {
+        if (p_protein_match->getValidationState() >= state) {
+            return true;
         }
-    }
-    else if (state == ValidationState::validAndChecked) {
-        for (auto & p_protein_match : _protein_match_list) {
-            if (p_protein_match->isValidAndChecked()) {
-                i++;
-            }
+        else              {
+            return false;
         }
-    }
-    return i;
+    });
 }
 
 void IdentificationGroup::updateAutomaticFilters(const AutomaticFilterParameters & automatic_filter_parameters) {
diff --git a/src/core/peptidematch.cpp b/src/core/peptidematch.cpp
index 81706face..d38bad251 100644
--- a/src/core/peptidematch.cpp
+++ b/src/core/peptidematch.cpp
@@ -70,13 +70,13 @@ void PeptideMatch::setChecked(bool arg1) {
 }
 
 ValidationState PeptideMatch::getValidationState() const {
-    if (isValid()) {
-        return ValidationState::valid;
+    if (isGrouped()) {
+        return ValidationState::grouped;
     } else if (isValidAndChecked()) {
         return ValidationState::validAndChecked;
-    } else if (isGrouped()) {
-        return ValidationState::grouped;
-    }
+    } else if (isValid()) {
+        return ValidationState::valid;
+    } 
     return ValidationState::notValid;
 }
 
diff --git a/src/core/proteinmatch.cpp b/src/core/proteinmatch.cpp
index 792634523..799f6ceca 100644
--- a/src/core/proteinmatch.cpp
+++ b/src/core/proteinmatch.cpp
@@ -44,13 +44,13 @@ ProteinMatch::~ProteinMatch()
     }
 }
 ValidationState ProteinMatch::getValidationState() const {
-    if (isValid()) {
-        return ValidationState::valid;
+    if (isGrouped()) {
+        return ValidationState::grouped;
     } else if (isValidAndChecked()) {
         return ValidationState::validAndChecked;
-    } else if (isGrouped()) {
-        return ValidationState::grouped;
-    }
+    } else if (isValid()) {
+        return ValidationState::valid;
+    } 
     return ValidationState::notValid;
 }
 bool ProteinMatch::contains(PeptideMatch * peptide_match) const {
@@ -178,7 +178,7 @@ const pappso::GrpProteinSp & ProteinMatch::getGrpProteinSp() const {
 
 unsigned int ProteinMatch::countPeptideMatch(ValidationState state) const {
     return std::count_if (_peptide_match_list.begin(), _peptide_match_list.end(), [state](const PeptideMatch * p_peptide_match) {
-        if (p_peptide_match->getValidationState() == state) {
+        if (p_peptide_match->getValidationState() >= state) {
             return true;
         }
         else              {
diff --git a/src/utils/types.h b/src/utils/types.h
index c87465c67..19244ecd2 100644
--- a/src/utils/types.h
+++ b/src/utils/types.h
@@ -25,6 +25,7 @@
 #ifndef _TYPES_H_
 #define _TYPES_H_ 1
 
+#include <cstdint>
 /*********** enumerations *********************************/
 
 /** \def GroupingType list of available grouping algoritms
@@ -50,11 +51,11 @@ enum class MzFormat {
  *
  */
 
-enum class ValidationState {
-    notValid,///< notValid : automatic filter validation failed
-     valid, ///< valid : automatic filter validation passed
-     validAndChecked, ///< validAndChecked : automatic filter validation passed + manual checking
-     grouped, ///< grouped : automatic filter validation passed + manual checking + grouped
+enum class ValidationState: std::int8_t {
+    notValid = 0,///< notValid : automatic filter validation failed
+     valid =1, ///< valid : automatic filter validation passed
+     validAndChecked=2, ///< validAndChecked : automatic filter validation passed + manual checking
+     grouped=3 ///< grouped : automatic filter validation passed + manual checking + grouped
 };
 
 
-- 
GitLab