diff --git a/src/core/identificationgroup.cpp b/src/core/identificationgroup.cpp index 40646661de94a5f6f70b2d9ed4e2c5cb2225c41a..2bb1162f6ab7618fca5f1813cc7bf8f6d0c3772b 100644 --- a/src/core/identificationgroup.cpp +++ b/src/core/identificationgroup.cpp @@ -142,7 +142,13 @@ std::size_t IdentificationGroup::countSubGroup()const { return _group_store.countSubGroup(); } - +void IdentificationGroup::collectMhDelta(std::vector< pappso::pappso_double> & delta_list, pappso::PrecisionUnit unit, ValidationState state) const { + for (auto & p_protein_match : _protein_match_list) { + if (p_protein_match->getValidationState() >= state) { + p_protein_match->collectMhDelta(delta_list, unit, state); + } + } +} void IdentificationGroup::startGrouping (const GroupingType & grouping_type) { qDebug() << "IdentificationGroup::startGrouping begin "; if (_p_grp_experiment != nullptr) { diff --git a/src/core/identificationgroup.h b/src/core/identificationgroup.h index 9726a01be01302d85ed1e9c89b6bfdfaf21c9370..74ba6ab90b5f1a2ee434078f403869162d620bb2 100644 --- a/src/core/identificationgroup.h +++ b/src/core/identificationgroup.h @@ -84,6 +84,8 @@ public: const QString getTabName() const; bool contains (const MsRun * p_msrun) const; + + void collectMhDelta(std::vector< pappso::pappso_double> & delta_list, pappso::PrecisionUnit unit, ValidationState state) const; private : GroupingExperiment * _p_grp_experiment= nullptr; diff --git a/src/core/proteinmatch.cpp b/src/core/proteinmatch.cpp index af186f98c616fe0022f1d881594b698abcb164c5..5bb90d79bf1b4895ed7b0b194312adbcb6939cbc 100644 --- a/src/core/proteinmatch.cpp +++ b/src/core/proteinmatch.cpp @@ -50,7 +50,7 @@ ValidationState ProteinMatch::getValidationState() const { return ValidationState::validAndChecked; } else if (isValid()) { return ValidationState::valid; - } + } return ValidationState::notValid; } bool ProteinMatch::contains(PeptideMatch * peptide_match) const { @@ -390,3 +390,19 @@ void ProteinMatch::setGroupInstance(GroupStore & group_store) { } } } + + +void ProteinMatch::collectMhDelta(std::vector< pappso::pappso_double> & delta_list, pappso::PrecisionUnit unit, ValidationState state) const { + for (auto & p_peptide_match : _peptide_match_list) { + if (p_peptide_match->getValidationState() >= state) { + pappso::pappso_double diff = p_peptide_match->getDeltaMass(); + if (unit == pappso::PrecisionUnit::ppm) { + while (diff < -0.5) { + diff = diff + pappso::DIFFC12C13; + } + diff = (diff / p_peptide_match->getPeptideXtpSp().get()->getMz(1)) * pappso::ONEMILLION; + } + delta_list.push_back(diff); + } + } +} diff --git a/src/core/proteinmatch.h b/src/core/proteinmatch.h index a2039e62ba26bb661d6c80d61ed177b40a8c924a..fb125d15d1fcdc4e9d892941207b6c91f5208334 100644 --- a/src/core/proteinmatch.h +++ b/src/core/proteinmatch.h @@ -93,6 +93,8 @@ public: /** @brief tells if this protein match contains this peptides */ bool contains(PeptideMatch * peptide_match) const; + + void collectMhDelta(std::vector< pappso::pappso_double> & delta_list, pappso::PrecisionUnit unit, ValidationState state) const; protected : void setGroupingExperiment(GroupingExperiment * p_grp_experiment); diff --git a/src/gui/project_view/project_view.ui b/src/gui/project_view/project_view.ui index eaad0707af139f8aa64fa6a732e5dc4d233257d5..cfcc8ba01e3fbf9fea096f416013794476735745 100644 --- a/src/gui/project_view/project_view.ui +++ b/src/gui/project_view/project_view.ui @@ -177,7 +177,95 @@ </attribute> <layout class="QGridLayout" name="gridLayout_2"> <item row="0" column="0"> - <layout class="QFormLayout" name="formLayout_3"/> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <item> + <layout class="QFormLayout" name="formLayout_2"> + <item row="0" column="0"> + <layout class="QFormLayout" name="formLayout_3"/> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>mean</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>median</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>standard deviation</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QComboBox" name="precision_unit_combobox"> + <item> + <property name="text"> + <string>ppm</string> + </property> + </item> + <item> + <property name="text"> + <string>dalton</string> + </property> + </item> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="mass_precision_mean_label"> + <property name="text"> + <string>0</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="mass_precision_median_label"> + <property name="text"> + <string>0</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="mass_precision_sd_label"> + <property name="text"> + <string>0</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + <item row="1" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="pushButton_3"> + <property name="text"> + <string>compute</string> + </property> + </widget> + </item> + </layout> </item> </layout> </widget> diff --git a/src/gui/project_view/projectwindow.cpp b/src/gui/project_view/projectwindow.cpp index 5311738fe2fce5ada5099572a295bddf2f309bca..d2541b7fc46ab7272866cb24ef723ea3240aa7a8 100644 --- a/src/gui/project_view/projectwindow.cpp +++ b/src/gui/project_view/projectwindow.cpp @@ -32,6 +32,7 @@ #include <QGridLayout> #include <QMessageBox> #include <pappsomspp/pappsoexception.h> +#include <numeric> @@ -141,24 +142,49 @@ void ProjectWindow::refreshGroup(IdentificationGroup * p_ident_group) { void ProjectWindow::computeFdr(ValidationState state) { pappso::pappso_double total_prot=0; pappso::pappso_double false_prot=0; - for (IdentificationGroup * identification_group : _project_sp.get()->getIdentificationGroupList()) { - total_prot += identification_group->countProteinMatch(state); - false_prot += identification_group->countDecoyProteinMatch(state); - } - ui->protein_fdr_label->setText(QString("%1 %").arg(false_prot/total_prot)); - - 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); } - qDebug() << "ProjectWindow::computeFdr false_peptide=" <<false_peptide; - qDebug() << "ProjectWindow::computeFdr total_peptide=" <<total_peptide; + ui->protein_fdr_label->setText(QString("%1 %").arg(false_prot/total_prot)); ui->peptide_fdr_label->setText(QString("%1 %").arg(false_peptide/total_peptide)); } +void ProjectWindow::computeMassPrecision(ValidationState state) { + 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); + } + + + pappso::pappso_double sum = std::accumulate(delta_list.begin(), delta_list.end(), 0); + + 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)]; + + pappso::pappso_double sd = 0; + for (pappso::pappso_double val : delta_list) { + sd = sd + ((val - mean) * (val - mean)); + } + 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)); +} + void ProjectWindow::doFdrChanged() { qDebug() << "ProjectWindow::doFdrChanged begin "; _project_sp.get()->getProteinStore().setRegexpDecoyPattern(ui->decoy_protein_regexp_line_edit->text()); @@ -348,5 +374,7 @@ void ProjectWindow::setProjectSp(ProjectSp project_sp) { ui->decoy_protein_regexp_line_edit->setText(_project_sp.get()->getProteinStore().getRegexpDecoy().pattern()); computeFdr(ValidationState::grouped); + + computeMassPrecision(ValidationState::validAndChecked); this->setEnabled(true); } diff --git a/src/gui/project_view/projectwindow.h b/src/gui/project_view/projectwindow.h index 2cdbc36b971a010ae7ef352f42fcf34d9821c65d..8c9c03c7370820d2c65c634c9c9e3eb8c08eb6e0 100644 --- a/src/gui/project_view/projectwindow.h +++ b/src/gui/project_view/projectwindow.h @@ -69,6 +69,7 @@ protected : void doViewProteinDetail(ProteinMatch * protein_match); void doIdentificationGroupEdited(IdentificationGroup * p_identification_group); void computeFdr(ValidationState state); + void computeMassPrecision(ValidationState state); private : void connectNewProteinListWindow();