diff --git a/src/gui/xic_view/xic_box/xicbox.cpp b/src/gui/xic_view/xic_box/xicbox.cpp index 42ff2d1ee9d89258fcd2f5ba5af021823c691200..2dbb525125c085525333ad79ff456d863dde29bb 100644 --- a/src/gui/xic_view/xic_box/xicbox.cpp +++ b/src/gui/xic_view/xic_box/xicbox.cpp @@ -36,6 +36,14 @@ #include <pappsomspp/exception/exceptionnotpossible.h> +bool XicBoxNaturalIsotope::contains(const pappso::XicPeakSp & peak) const { + for (const pappso::XicPeakSp & peak_i:detected_peak_list) { + if (peak_i.get() == peak.get()) { + return true; + } + } + return false; +} class XicDetectionList: public pappso::XicDetectionSinkInterface { public: @@ -146,10 +154,19 @@ XicBox::~XicBox() void XicBox::onXicWidgetClick(double rt, double intensity) { qDebug() << __FILE__ << " " <<__FUNCTION__ << " " << __LINE__; ui->xic_widget->clearXicPeakBorders(); - for (pappso::XicPeakSp xic_peak_sp:_xic_peak_current_list) { + std::vector <pappso::XicPeakSp> draw_peak_borders; + for (XicBoxNaturalIsotope peak:_natural_isotope_list) { qDebug() << __FILE__ << " " <<__FUNCTION__ << " " << __LINE__; - ui->xic_widget->drawXicPeakBorders(xic_peak_sp); + draw_peak_borders.push_back(peak.one_peak_sp); + if (peak.one_peak_sp.get() != nullptr) { + ui->xic_widget->drawXicPeakBorders(peak.one_peak_sp); + } + } + + if (_peptide_evidence_list.size() == 0) { + drawObservedAreaBars(draw_peak_borders); } + } void XicBox::remove() { @@ -216,26 +233,29 @@ void XicBox::setPeptideEvidenceInMsRun(const PeptideEvidence * p_peptide_evidenc void XicBox::setXic(std::vector< pappso::XicSp> xic_sp_list) { qDebug() << "XicBox::setXic begin " << xic_sp_list.size(); ui->xic_widget->clear(); + for (int i=0; i < xic_sp_list.size(); i++) { + _natural_isotope_list[i].xic_sp = xic_sp_list[i]; + } //pappso::XicWidget * xic_widget = new pappso::XicWidget(this); //ui->xic_list_widget->layout()->addWidget(xic_widget); - for (int i=0; i < xic_sp_list.size(); i++) { - qDebug() << "XicBox::setXic xic " << xic_sp_list[i].get(); - if (xic_sp_list[i].get() == nullptr) { - throw new pappso::PappsoException("Error in XicBox::setXic:\n xic_sp_list[i].get() == nullptr"); + for (XicBoxNaturalIsotope & xic_isotope :_natural_isotope_list) { + //qDebug() << "XicBox::setXic xic " << xic_isotope.xic_sp.get(); + if (xic_isotope.xic_sp.get() == nullptr) { + throw new pappso::PappsoException("Error in XicBox::setXic:\n xic_isotope.xic_sp.get() == nullptr"); } - qDebug() << "XicBox::setXic xic_sp_list[i].size() " << xic_sp_list[i].get()->size(); - ui->xic_widget->addXicSp(xic_sp_list[i]); - QString isotope_name = QString("+%1").arg(_isotope_mass_list[i].get()->getIsotopeNumber()); - if (_isotope_mass_list[i].get()->getIsotopeRank() > 1) { - isotope_name = QString("+%1 [%2]").arg(_isotope_mass_list[i].get()->getIsotopeNumber()).arg(_isotope_mass_list[i].get()->getIsotopeRank()); + qDebug() << "XicBox::setXic xic_isotope.xic_sp.size() " << xic_isotope.xic_sp.get()->size(); + ui->xic_widget->addXicSp(xic_isotope.xic_sp); + QString isotope_name = QString("+%1").arg(xic_isotope.peptide_natural_isotope_sp.get()->getIsotopeNumber()); + if (xic_isotope.peptide_natural_isotope_sp.get()->getIsotopeRank() > 1) { + isotope_name = QString("+%1 [%2]").arg(xic_isotope.peptide_natural_isotope_sp.get()->getIsotopeNumber()).arg(xic_isotope.peptide_natural_isotope_sp.get()->getIsotopeRank()); } - isotope_name.append(QString(" (%1%)").arg((int) (_isotope_mass_list[i].get()->getIntensityRatio()*100))); - ui->xic_widget->setName(xic_sp_list[i].get(), isotope_name); + isotope_name.append(QString(" (%1%)").arg((int) (xic_isotope.peptide_natural_isotope_sp.get()->getIntensityRatio()*100))); + ui->xic_widget->setName(xic_isotope.xic_sp.get(), isotope_name); - if (_isotope_mass_list[i].get()->getIsotopeNumber() == 0) { + if (xic_isotope.peptide_natural_isotope_sp.get()->getIsotopeNumber() == 0) { for (const PeptideEvidence * peptide_evidence:_peptide_evidence_list) { qDebug() << "XicBox::setXic peptide_evidence " << peptide_evidence->getRetentionTime(); - ui->xic_widget->addMsMsEvent(xic_sp_list[i].get(), peptide_evidence->getRetentionTime()); + ui->xic_widget->addMsMsEvent(xic_isotope.xic_sp.get(), peptide_evidence->getRetentionTime()); } } } @@ -247,17 +267,19 @@ void XicBox::setXic(std::vector< pappso::XicSp> xic_sp_list) { emit loadXic(_p_peptide_evidence->getMsRunP(), _isotope_mass_list[_xic_widget_list.size()].get()->getMz(), _p_xic_window->getXicExtractPrecision(), XicExtractMethod::max); } */ - _xic_peak_match_list.clear(); XicDetectionList xic_list; xic_list.setPeptideEvidenceList(_peptide_evidence_list); + std::vector <pappso::XicPeakSp> draw_peak_borders; - for (int i=0; i < xic_sp_list.size(); i++) { + for (XicBoxNaturalIsotope & xic_isotope :_natural_isotope_list) { try { xic_list.clear(); - _p_xic_window->xicDetect(*(xic_sp_list[i].get()), &xic_list); - _xic_peak_match_list.push_back(xic_list.getMatchedPeak()); - ui->xic_widget->addXicPeakList(xic_sp_list[i].get(), xic_list.getXicPeakList()); + _p_xic_window->xicDetect(*(xic_isotope.xic_sp.get()), &xic_list); + xic_isotope.matched_peak_sp = xic_list.getMatchedPeak(); + xic_isotope.detected_peak_list = xic_list.getXicPeakList(); + ui->xic_widget->addXicPeakList(xic_isotope.xic_sp.get(), xic_list.getXicPeakList()); + draw_peak_borders.push_back(xic_isotope.matched_peak_sp); } catch (const pappso::ExceptionNotPossible & e) { qDebug() << e.qwhat(); @@ -266,7 +288,11 @@ void XicBox::setXic(std::vector< pappso::XicSp> xic_sp_list) { qDebug() << "XicBox::setXic plot" ; ui->xic_widget->plot(); + drawObservedAreaBars(draw_peak_borders); +} + +void XicBox::drawObservedAreaBars(const std::vector<pappso::XicPeakSp> & observed_peak_to_draw_list) { if (_isotope_ratio_graph_observed_intensity == nullptr) { qDebug() << "XicBox::setXic plot new QCPBars" ; _isotope_ratio_graph_observed_intensity = new QCPBars(ui->histo_widget->xAxis, ui->histo_widget->yAxis2); @@ -287,17 +313,23 @@ void XicBox::setXic(std::vector< pappso::XicSp> xic_sp_list) { int i = 0; qDebug() << "XicBox::setXic plot _isotope_mass_list" ; - for (pappso::PeptideNaturalIsotopeAverageSp & natural_isotope_average: _isotope_mass_list) { - if (_xic_peak_match_list[i].get() == nullptr) { + for (const XicBoxNaturalIsotope & xic_isotope : _natural_isotope_list) { + pappso::XicPeakSp peak_to_draw; + for (pappso::XicPeakSp observed_peak : observed_peak_to_draw_list) { + if (xic_isotope.contains(observed_peak)) { + peak_to_draw = observed_peak; + } + } + if (peak_to_draw.get() == nullptr) { } else { - sum += _xic_peak_match_list[i].get()->getArea(); - observed_intensity_data << _xic_peak_match_list[i].get()->getArea(); - QString isotope_name = QString("+%1").arg(_isotope_mass_list[i].get()->getIsotopeNumber()); - if (_isotope_mass_list[i].get()->getIsotopeRank() > 1) { - isotope_name = QString("+%1 [%2]").arg(_isotope_mass_list[i].get()->getIsotopeNumber()).arg(_isotope_mass_list[i].get()->getIsotopeRank()); + sum += peak_to_draw.get()->getArea(); + observed_intensity_data << peak_to_draw.get()->getArea(); + QString isotope_name = QString("+%1").arg(xic_isotope.peptide_natural_isotope_sp.get()->getIsotopeNumber()); + if (xic_isotope.peptide_natural_isotope_sp.get()->getIsotopeRank() > 1) { + isotope_name = QString("+%1 [%2]").arg(xic_isotope.peptide_natural_isotope_sp.get()->getIsotopeNumber()).arg(xic_isotope.peptide_natural_isotope_sp.get()->getIsotopeRank()); } - isotope_name.append(QString(" (%1%)").arg((int) (_isotope_mass_list[i].get()->getIntensityRatio()*100))); + isotope_name.append(QString(" (%1%)").arg((int) (xic_isotope.peptide_natural_isotope_sp.get()->getIntensityRatio()*100))); labels << isotope_name; ticks << i; } @@ -321,11 +353,12 @@ void XicBox::setXic(std::vector< pappso::XicSp> xic_sp_list) { void XicBox::setIsotopeMassList(std::vector<pappso::PeptideNaturalIsotopeAverageSp> isotope_mass_list) { - _isotope_mass_list = isotope_mass_list; + _natural_isotope_list.clear(); std::vector<pappso::mz> mass_list; - for (pappso::PeptideNaturalIsotopeAverageSp & natural_isotope_average: _isotope_mass_list) { + for (pappso::PeptideNaturalIsotopeAverageSp & natural_isotope_average: isotope_mass_list) { mass_list.push_back(natural_isotope_average.get()->getMz()); + _natural_isotope_list.push_back({nullptr, natural_isotope_average, nullptr, nullptr}); } emit loadXic(_msrun_sp, mass_list, _p_xic_window->getXicExtractPrecision(), XicExtractMethod::max); @@ -342,14 +375,14 @@ void XicBox::setIsotopeMassList(std::vector<pappso::PeptideNaturalIsotopeAverage QVector<QString> labels; int i = 0; double sum = 0; - for (pappso::PeptideNaturalIsotopeAverageSp & natural_isotope_average: _isotope_mass_list) { - sum += natural_isotope_average.get()->getIntensityRatio(); - theoretical_ratio_data << natural_isotope_average.get()->getIntensityRatio(); - QString isotope_name = QString("+%1").arg(_isotope_mass_list[i].get()->getIsotopeNumber()); - if (_isotope_mass_list[i].get()->getIsotopeRank() > 1) { - isotope_name = QString("+%1 [%2]").arg(_isotope_mass_list[i].get()->getIsotopeNumber()).arg(_isotope_mass_list[i].get()->getIsotopeRank()); + for (const XicBoxNaturalIsotope & xic_isotope: _natural_isotope_list) { + sum += xic_isotope.peptide_natural_isotope_sp.get()->getIntensityRatio(); + theoretical_ratio_data << xic_isotope.peptide_natural_isotope_sp.get()->getIntensityRatio(); + QString isotope_name = QString("+%1").arg(xic_isotope.peptide_natural_isotope_sp.get()->getIsotopeNumber()); + if (xic_isotope.peptide_natural_isotope_sp.get()->getIsotopeRank() > 1) { + isotope_name = QString("+%1 [%2]").arg(xic_isotope.peptide_natural_isotope_sp.get()->getIsotopeNumber()).arg(xic_isotope.peptide_natural_isotope_sp.get()->getIsotopeRank()); } - isotope_name.append(QString(" (%1%)").arg((int) (_isotope_mass_list[i].get()->getIntensityRatio()*100))); + isotope_name.append(QString(" (%1%)").arg((int) (xic_isotope.peptide_natural_isotope_sp.get()->getIntensityRatio()*100))); labels << isotope_name; ticks << i; i++; @@ -371,7 +404,7 @@ void XicBox::setIsotopeMassList(std::vector<pappso::PeptideNaturalIsotopeAverage ui->histo_widget->yAxis->setRange(0, sum); - ui->histo_widget->xAxis->setRange(-0.8, _isotope_mass_list.size()); + ui->histo_widget->xAxis->setRange(-0.8, _natural_isotope_list.size()); ui->histo_widget->replot(); } @@ -381,8 +414,8 @@ void XicBox::reExtractXic() { ui->xic_widget->clear(); std::vector<pappso::mz> mass_list; - for (pappso::PeptideNaturalIsotopeAverageSp & natural_isotope_average: _isotope_mass_list) { - mass_list.push_back(natural_isotope_average.get()->getMz()); + for (const XicBoxNaturalIsotope & xic_isotope: _natural_isotope_list) { + mass_list.push_back(xic_isotope.peptide_natural_isotope_sp.get()->getMz()); } emit loadXic(_msrun_sp, mass_list, _p_xic_window->getXicExtractPrecision(), XicExtractMethod::max); qDebug() << "XicBox::reExtractXic end"; @@ -394,15 +427,21 @@ void XicBox::setRetentionTime(double rt) { } void XicBox::setXicPeakList(std::vector<std::pair<pappso::XicSp, pappso::XicPeakSp>> xic_peak_list) { qDebug() << "XicBox::setXicPeakList begin"; - _xic_peak_current_list.clear(); QString html ; + for (XicBoxNaturalIsotope & xic_isotope: _natural_isotope_list) { + xic_isotope.one_peak_sp = nullptr; + } for (std::pair<pappso::XicSp, pappso::XicPeakSp> & pair_xic_peak: xic_peak_list) { + for (XicBoxNaturalIsotope & xic_isotope: _natural_isotope_list) { + if (xic_isotope.xic_sp.get() == pair_xic_peak.first.get()) { + xic_isotope.one_peak_sp = pair_xic_peak.second; + } + } html.append(tr("<p>%1<br/>area: %2<br/>rt begin: %3<br/>rt max: %4<br/>rt end: %5<br/></p>").arg(ui->xic_widget->getName(pair_xic_peak.first.get())).arg(pair_xic_peak.second.get()->getArea()).arg(pair_xic_peak.second.get()->getLeftBoundary().rt) .arg(pair_xic_peak.second.get()->getMaxXicElement().rt) .arg(pair_xic_peak.second.get()->getRightBoundary().rt) ); - _xic_peak_current_list.push_back(pair_xic_peak.second); } ui->xic_widget->setToolTip(html); diff --git a/src/gui/xic_view/xic_box/xicbox.h b/src/gui/xic_view/xic_box/xicbox.h index 9efeb140fc5bdb02eb4bee727c9942c87421e451..91eac5074d1624a045ad8997c792f620cf7cfa27 100644 --- a/src/gui/xic_view/xic_box/xicbox.h +++ b/src/gui/xic_view/xic_box/xicbox.h @@ -43,6 +43,18 @@ namespace Ui { class XicBox; } + +struct XicBoxNaturalIsotope { + + bool contains(const pappso::XicPeakSp & peak) const; + + pappso::XicSp xic_sp; + pappso::PeptideNaturalIsotopeAverageSp peptide_natural_isotope_sp; + pappso::XicPeakSp matched_peak_sp; + pappso::XicPeakSp one_peak_sp; + std::vector <pappso::XicPeakSp> detected_peak_list; +}; + class XicBox: public QWidget { Q_OBJECT @@ -67,6 +79,9 @@ private slots: void setXicPeakList(std::vector<std::pair<pappso::XicSp, pappso::XicPeakSp>> xic_peak_list); void onRtUnitChanged(); void onXicWidgetClick(double rt, double intensity); + +private: + void drawObservedAreaBars(const std::vector<pappso::XicPeakSp> & observed_peak_to_draw); private: Ui::XicBox *ui; @@ -75,11 +90,8 @@ private: const PeptideEvidence * _p_peptide_evidence; MsRunSp _msrun_sp; std::vector<const PeptideEvidence *> _peptide_evidence_list; - std::vector<pappso::PeptideNaturalIsotopeAverageSp> _isotope_mass_list; - pappso::XicSp _xic_sp; + std::vector<XicBoxNaturalIsotope> _natural_isotope_list; std::vector<pappso::XicWidget *> _xic_widget_list; - std::vector<pappso::XicPeakSp> _xic_peak_match_list; - std::vector<pappso::XicPeakSp> _xic_peak_current_list; QCPBars * _isotope_ratio_graph_observed_intensity= nullptr;