diff --git a/src/pappsomspp/vendors/tims/timsdata.cpp b/src/pappsomspp/vendors/tims/timsdata.cpp index 778196d9a598bf9cbca782c431553b358e03de14..32049a491fb7e66fd04f721bdf6de35b6668f5e6 100644 --- a/src/pappsomspp/vendors/tims/timsdata.cpp +++ b/src/pappsomspp/vendors/tims/timsdata.cpp @@ -613,7 +613,7 @@ TimsData::getPrecursorsFromMzRtCharge(int charge, QSqlDatabase qdb = openDatabaseConnection(); QSqlQuery q = qdb.exec( QString( - "SELECT Frames.time, Precursors.MonoisotopicMz, Precursors.Charge, " + "SELECT Frames.Time, Precursors.MonoisotopicMz, Precursors.Charge, " "Precursors.Id, Frames.Id, PasefFrameMsMsInfo.ScanNumBegin, " "PasefFrameMsMsInfo.scanNumEnd " "FROM Frames " @@ -622,7 +622,7 @@ TimsData::getPrecursorsFromMzRtCharge(int charge, "WHERE Precursors.Charge == %1 " "AND Precursors.MonoisotopicMz > %2 -0.01 " "AND Precursors.MonoisotopicMz < %2 +0.01 " - "AND Frames.Time >= %3 " + "AND Frames.Time >= %3 -1 " "AND Frames.Time < %3 +1; ") .arg(charge) .arg(mz_val) diff --git a/src/pappsomspp/vendors/tims/xicextractor/timsdirectxicextractor.cpp b/src/pappsomspp/vendors/tims/xicextractor/timsdirectxicextractor.cpp index 9e58942bf6a26ef41da32688bef5ddfccf9b2523..9e6acb4c1db19dd0d5c29dfaf9e4a53129a048fa 100644 --- a/src/pappsomspp/vendors/tims/xicextractor/timsdirectxicextractor.cpp +++ b/src/pappsomspp/vendors/tims/xicextractor/timsdirectxicextractor.cpp @@ -105,7 +105,7 @@ TimsDirectXicExtractor::extractTimsXicList( frame_sptr.get()->extractTimsXicListInRtRange( itXicListbegin, itXicListend, m_xicExtractMethod); - qInfo() << "" << frame_sptr.get()->getId(); + qDebug() << "" << frame_sptr.get()->getId(); } qDebug(); } diff --git a/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.cpp b/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.cpp index ed22e8c2d570b84c55f4a10281b1e6d15792307a..c2a79237dc9df6ea6a480211b7a613b3fed82467 100644 --- a/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.cpp +++ b/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.cpp @@ -318,7 +318,6 @@ MassSpectrumWidget::plot() } else { - _peak_ion_isotope_match_list.sort( [](const PeakIonIsotopeMatch &a, const PeakIonIsotopeMatch &b) { return a.getPeak().y > b.getPeak().y; @@ -455,3 +454,12 @@ MassSpectrumWidget::computeIsotopeMassList() } } } + +void +pappso::MassSpectrumWidget::highlightPrecursorPeaks(double precursor_mz) +{ + if(_ms_level > 1) + { + _custom_plot->highlightPrecursorPeaks(precursor_mz, _p_ms2_precision); + } +} diff --git a/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.h b/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.h index fab9f4783b0cac315786a22df39c291d8f7f49d0..ca240734b2e47ea2eb735b40d942303d064c4e29 100644 --- a/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.h +++ b/src/pappsomspp/widget/massspectrumwidget/massspectrumwidget.h @@ -68,6 +68,7 @@ class PMSPP_LIB_DECL MassSpectrumWidget : public GraphicDeviceWidget bool savePdf(const QString &fileName, int width = 0, int height = 0); void toQPaintDevice(QPaintDevice *device, const QSize &size) override; + void highlightPrecursorPeaks(double precursor_mz); // void setIsotopeMassList(std::vector<pappso::PeptideNaturalIsotopeAverageSp> // & isotope_mass_list); diff --git a/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.cpp b/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.cpp index e95b622e13b2cc46ec7672b6567e6f7571069490..117c801607d3e90d3ceea37aebccfc09425bb09f 100644 --- a/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.cpp +++ b/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.cpp @@ -68,6 +68,12 @@ QCPSpectrum::QCPSpectrum(MassSpectrumWidget *parent, bool visible) _p_peak_bars_isotope->setPen(QPen(red, 1)); _p_peak_bars_isotope->setBrush(QBrush(red)); + mp_peak_bars_precursor = new QCPBars(xAxis, yAxis); + mp_peak_bars_precursor->setWidthType(QCPBars::WidthType::wtAbsolute); + mp_peak_bars_precursor->setWidth(_bar_width * 1.5); + mp_peak_bars_precursor->setPen(QPen(Qt::cyan, 1)); + mp_peak_bars_precursor->setVisible(true); + connect(this->xAxis, SIGNAL(rangeChanged(QCPRange)), this, @@ -458,3 +464,28 @@ QCPSpectrum::addMs1IsotopePattern( total_intensity); } } + +void +pappso::QCPSpectrum::highlightPrecursorPeaks(double precursor_mz, + PrecisionPtr ms2_precision) +{ + MzRange range(precursor_mz, ms2_precision); + + for(const DataPoint &peak : *_p_spectrum) + { + if((peak.x > range.lower()) && (peak.x < range.upper())) + { + mp_peak_bars_precursor->addData(peak.x, peak.y); + QCPItemText *text_label = new QCPItemText(this); + text_label->setVisible(true); + text_label->setPositionAlignment(Qt::AlignBottom | Qt::AlignHCenter); + text_label->position->setType(QCPItemPosition::ptPlotCoords); + text_label->position->setCoords( + peak.x, + peak.y); // place position at center/top of axis rect + text_label->setFont(QFont(font().family(), 8)); + text_label->setText("precursor"); + text_label->setColor(Qt::cyan); + } + } +} diff --git a/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.h b/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.h index 1540ca94d173fd99690a962053b7f0210870556e..199886df76708fb5876c4a56312d8554723bfe29 100644 --- a/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.h +++ b/src/pappsomspp/widget/massspectrumwidget/qcpspectrum.h @@ -60,6 +60,7 @@ class QCPSpectrum : public QCustomPlot &isotope_mass_list, pappso_double intensity); void addPeakIonIsotopeMatch(const PeakIonIsotopeMatch &peak_ion_match); + void highlightPrecursorPeaks(double precursor_mz, PrecisionPtr ms2_precision); virtual void mouseMoveEvent(QMouseEvent *event) override; virtual void mousePressEvent(QMouseEvent *event) override; virtual void mouseReleaseEvent(QMouseEvent *event) override; @@ -83,6 +84,7 @@ class QCPSpectrum : public QCustomPlot QCPRange _mass_delta_range; QCPBars *_p_peak_bars; QCPBars *_p_peak_bars_isotope; + QCPBars *mp_peak_bars_precursor; std::map<PeptideIon, QCPBars *> _map_ion_type_bars; QCPAxisRect *_p_delta_axis_rect; QCPGraph *_p_delta_graph; diff --git a/tests/test_timsxicextractor.cpp b/tests/test_timsxicextractor.cpp index f3cc9d7f44bf40a5b8a73a7059f98abfad3fc4d4..99a30cd4babd8625b12747efbea67b0ab0ccdf50 100644 --- a/tests/test_timsxicextractor.cpp +++ b/tests/test_timsxicextractor.cpp @@ -42,6 +42,7 @@ #include <pappsomspp/processing/filters/filtersuitestring.h> #include "config.h" #include "common.h" +#include <time.h> using namespace pappso; @@ -66,16 +67,16 @@ TEST_CASE("Extracting XIC from timsdata.", "[TimsXicExtractor]") "200ngHeLaPASEF_2min_compressed.d/analysis.tdf", "a1"); */ - pappso::MsFileAccessor accessor( - "/gorgone/pappso/jouy/raw/2021_Tims_TOF/20210126_HeLa/" - "1-26-2021_1_QC_HeLa10ng_825.d/analysis.tdf", - "a1"); - /* +// pappso::MsFileAccessor accessor( +// "/gorgone/pappso/jouy/raw/2021_Tims_TOF/20210126_HeLa/" +// "1-26-2021_1_QC_HeLa10ng_825.d/analysis.tdf", +// "a1"); +// pappso::MsFileAccessor accessor( "/data/test_tdf_quality/2-3-2021_1_HeLa10ng_871.d/analysis.tdf", "a1"); -*/ + accessor.setPreferedFileReaderType(pappso::MzFormat::brukerTims, pappso::FileReaderType::tims_ms2); @@ -95,24 +96,39 @@ TEST_CASE("Extracting XIC from timsdata.", "[TimsXicExtractor]") pappso::TimsDataSp tims_data = tims2_reader->getTimsDataSPtr(); - std::vector<std::size_t> precursor_list = {3, 4, 5, 3000, 3001}; + std::vector<std::size_t> precursor_list = {2159}; + std::vector<pappso_double> mz_list = {466.738, 467.239}; std::vector<pappso::TimsXicStructure> xic_list; + std::vector<pappso::TimsXicStructure> xic_struct_list; + clock_t start = clock(); for(auto precursor_id : precursor_list) { xic_list.push_back(tims_data.get()->getTimsXicStructureFromPrecursorId( - precursor_id, PrecisionFactory::getPpmInstance(10.0))); + precursor_id, PrecisionFactory::getPpmInstance(30.0))); } + for(pappso::pappso_double mz : mz_list) + { + pappso::TimsXicStructure new_xic_struct = + pappso::TimsXicStructure(xic_list[0]); + new_xic_struct.mzRange = + pappso::MzRange(mz, PrecisionFactory::getPpmInstance(30.0)); + new_xic_struct.xicSptr = std::make_shared<Xic>(); + xic_struct_list.push_back(new_xic_struct); + } tims_data.get()->extractXicListByTimsXicStructureList( - xic_list, pappso::XicExtractMethod::sum, 100000); - - for(auto &&xic_struct : xic_list) + xic_struct_list, pappso::XicExtractMethod::sum, 100000); + + qInfo() << QString("Time taken: %1\n").arg((double)(clock() - start)/CLOCKS_PER_SEC); + for(auto &&xic_struct : xic_struct_list) { REQUIRE(xic_struct.xicSptr.get() != nullptr); - QFile fileods(QString("tims_xic_%1.ods").arg(xic_struct.precursorId)); + QFile fileods(QString("/data/test_tdf_quality/tims_xic_%1_%2.ods") + .arg(xic_struct.precursorId) + .arg(xic_struct.mzRange.getMz())); OdsDocWriter writer(&fileods); writer.writeLine(); writer.writeCell("precursorId");