libpappsomspp
Library for mass spectrometry
pappso::TimsData Class Reference

#include <timsdata.h>

Public Member Functions

 TimsData (QDir timsDataDirectory)
 build using the tims data directory More...
 
 TimsData (const TimsData &other)
 
 ~TimsData ()
 
pappso::MassSpectrumCstSPtr getMassSpectrumCstSPtrByRawIndex (std::size_t raw_index)
 get a mass spectrum given its spectrum index More...
 
pappso::MassSpectrumCstSPtr getMassSpectrumCstSPtr (std::size_t timsId, std::size_t scanNum)
 get a mass spectrum given the tims frame database id and scan number within tims frame More...
 
std::size_t getTotalNumberOfScans () const
 get the total number of scans More...
 
std::size_t getTotalNumberOfPrecursors () const
 get the number of precursors analyzes by PASEF More...
 
std::vector< std::size_t > getPrecursorsFromMzRtCharge (int charge, double mz_val, double rt_sec, double k0)
 guess possible precursor ids given a charge, m/z, retention time and k0 More...
 
unsigned int getMsLevelBySpectrumIndex (std::size_t spectrum_index)
 
QualifiedMassSpectrum getQualifiedMassSpectrumByRawIndex (std::size_t spectrum_index, bool want_binary_data)
 
void getQualifiedMs2MassSpectrumByPrecursorId (QualifiedMassSpectrum &mass_spectrum, std::size_t ms2_index, std::size_t precursor_index, bool want_binary_data)
 
QualifiedMassSpectrum getQualifiedMs1MassSpectrumByPrecursorId (std::size_t ms2_index, std::size_t precursor_index, bool want_binary_data)
 
void setMs2FilterCstSPtr (pappso::FilterInterfaceCstSPtr &filter)
 
void setMs1FilterCstSPtr (pappso::FilterInterfaceCstSPtr &filter)
 
std::vector< std::size_t > getTimsMS1FrameIdRange (double rt_begin, double rt_end) const
 
TimsFrameCstSPtr getTimsFrameCstSPtr (std::size_t timsId) const
 get a Tims frame with his database ID More...
 

Private Member Functions

std::pair< std::size_t, std::size_t > getScanCoordinateFromRawIndex (std::size_t spectrum_index) const
 
std::size_t getRawIndexFromCoordinate (std::size_t frame_id, std::size_t scan_num) const
 
QSqlDatabase openDatabaseConnection () const
 
TimsFrameBaseCstSPtr getTimsFrameBaseCstSPtr (std::size_t timsId) const
 get a Tims frame base (no binary data file access) with his database ID More...
 
TimsFrameCstSPtr getTimsFrameCstSPtrCached (std::size_t timsId)
 get a Tims frame with his database ID but look in the cache first More...
 
TimsFrameBaseCstSPtr getTimsFrameBaseCstSPtrCached (std::size_t timsId)
 
std::vector< TimsXicStructureextractXicListByPrecursorIds (const std::vector< std::size_t > &precursor_id_list, PrecisionPtr precision_ptr, XicExtractMethod xicExtractMethod, double rtRange) const
 extract a list of XICs from Tims data More...
 
std::vector< std::size_t > getMatchPrecursorIdByKo (std::vector< std::vector< double >> ids, double ko_value)
 
std::vector< std::size_t > getClosestIdByMz (std::vector< std::vector< double >> ids, double mz_value)
 

Private Attributes

QDir m_timsDataDirectory
 
TimsBinDecmpa_timsBinDec = nullptr
 
std::size_t m_totalNumberOfScans
 
std::size_t m_totalNumberOfPrecursors
 
std::size_t m_cacheSize = 60
 
std::deque< TimsFrameCstSPtrm_timsFrameCache
 
std::deque< TimsFrameBaseCstSPtrm_timsFrameBaseCache
 
pappso::FilterInterfaceCstSPtr mcsp_ms2Filter = nullptr
 
pappso::FilterInterfaceCstSPtr mcsp_ms1Filter = nullptr
 
QMutex m_mutex
 

Detailed Description

Todo:
write docs

Definition at line 64 of file timsdata.h.

Constructor & Destructor Documentation

◆ TimsData() [1/2]

TimsData::TimsData ( QDir  timsDataDirectory)

build using the tims data directory

Definition at line 45 of file timsdata.cpp.

46  : m_timsDataDirectory(timsDataDirectory)
47 {
48 
49  qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__;
50  if(!m_timsDataDirectory.exists())
51  {
52  throw PappsoException(
53  QObject::tr("ERROR TIMS data directory %1 not found")
54  .arg(m_timsDataDirectory.absolutePath()));
55  }
56 
57  if(!QFileInfo(m_timsDataDirectory.absoluteFilePath("analysis.tdf")).exists())
58  {
59 
60  throw PappsoException(
61  QObject::tr("ERROR TIMS data directory, %1 sqlite file not found")
62  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf")));
63  }
64 
65  // Open the database
66  QSqlDatabase qdb = openDatabaseConnection();
67 
68 
69  QSqlQuery q(qdb);
70  if(!q.exec("select Key, Value from GlobalMetadata where "
71  "Key='TimsCompressionType';"))
72  {
73 
74  qDebug();
75  throw PappsoException(
76  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
77  "command %2:\n%3\n%4\n%5")
78  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
79  .arg(q.lastQuery())
80  .arg(q.lastError().databaseText())
81  .arg(q.lastError().driverText())
82  .arg(q.lastError().nativeErrorCode()));
83  }
84 
85 
86  int compression_type = 0;
87  if(q.next())
88  {
89  compression_type = q.value(1).toInt();
90  }
91  qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__
92  << " compression_type=" << compression_type;
94  QFileInfo(m_timsDataDirectory.absoluteFilePath("analysis.tdf_bin")),
95  compression_type);
96 
97 
98  // get number of precursors
99  if(!q.exec("SELECT COUNT( DISTINCT Id) FROM Precursors;"))
100  {
101  qDebug();
102  throw PappsoException(
103  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
104  "command %2:\n%3\n%4\n%5")
105  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
106  .arg(q.lastQuery())
107  .arg(qdb.lastError().databaseText())
108  .arg(qdb.lastError().driverText())
109  .arg(qdb.lastError().nativeErrorCode()));
110  }
111  if(q.next())
112  {
113  m_totalNumberOfPrecursors = q.value(0).toLongLong();
114  }
115 
116 
117  // get number of scans
118  if(!q.exec("SELECT SUM(NumScans) FROM Frames"))
119  {
120  qDebug();
121  throw PappsoException(
122  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
123  "command %2:\n%3\n%4\n%5")
124  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
125  .arg(q.lastQuery())
126  .arg(qdb.lastError().databaseText())
127  .arg(qdb.lastError().driverText())
128  .arg(qdb.lastError().nativeErrorCode()));
129  }
130  if(q.next())
131  {
132  m_totalNumberOfScans = q.value(0).toLongLong();
133  }
134 
135  /*
136  std::shared_ptr<FilterTriangle> ms2filter =
137  std::make_shared<FilterTriangle>();
138  ms2filter.get()->setTriangleSlope(50, 0.02);
139  mcsp_ms2Filter = ms2filter;
140 */
141 
142 
143  std::shared_ptr<pappso::FilterPseudoCentroid> ms2filter =
144  std::make_shared<pappso::FilterPseudoCentroid>(20000, 0.05, 0.5, 0.1);
145  mcsp_ms2Filter = ms2filter;
146 
147 
148  std::shared_ptr<FilterTriangle> ms1filter =
149  std::make_shared<FilterTriangle>();
150  ms1filter.get()->setTriangleSlope(50, 0.01);
151  mcsp_ms1Filter = ms1filter;
152 }

References m_timsDataDirectory, m_totalNumberOfPrecursors, m_totalNumberOfScans, mcsp_ms1Filter, mcsp_ms2Filter, mpa_timsBinDec, openDatabaseConnection(), and pappso::FilterTriangle::setTriangleSlope().

◆ TimsData() [2/2]

pappso::TimsData::TimsData ( const TimsData other)

Copy constructor

Parameters
otherTODO

◆ ~TimsData()

TimsData::~TimsData ( )

Destructor

Definition at line 190 of file timsdata.cpp.

191 {
192  // m_qdb.close();
193  if(mpa_timsBinDec != nullptr)
194  {
195  delete mpa_timsBinDec;
196  }
197 }

References mpa_timsBinDec.

Member Function Documentation

◆ extractXicListByPrecursorIds()

std::vector< TimsXicStructure > TimsData::extractXicListByPrecursorIds ( const std::vector< std::size_t > &  precursor_id_list,
PrecisionPtr  precision_ptr,
XicExtractMethod  xicExtractMethod,
double  rtRange 
) const
private

extract a list of XICs from Tims data

Parameters
precursor_id_listthe list of precursors to extract
precision_ptrprecision to compute the mz range to extract for each precursor mass
xicExtractMethodXIC extraction method (sum or max) to use
rtRangeretention time range in seconds to extract XIC from rtTarget
  • rtRange to rtTarget + rtRange
Returns
the corresponding XIC list as a specific structure

Definition at line 1219 of file timsdata.cpp.

1224 {
1225 
1226  qDebug();
1227  std::vector<TimsXicStructure> xic_list;
1228 
1229  try
1230  {
1231  QSqlDatabase qdb = openDatabaseConnection();
1232 
1233  for(auto precursor_id : precursor_id_list)
1234  {
1235  QSqlQuery q = qdb.exec(
1236  QString("SELECT Frames.Time, "
1237  "PasefFrameMsMsInfo.Frame,PasefFrameMsMsInfo.ScanNumBegin,"
1238  "PasefFrameMsMsInfo.ScanNumEnd, Precursors.MonoisotopicMz, "
1239  "Precursors.Charge FROM "
1240  "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1241  "PasefFrameMsMsInfo.Precursor=Precursors.Id INNER JOIN "
1242  "Frames ON PasefFrameMsMsInfo.Frame=Frames.Id where "
1243  "Precursors.Id=%1;")
1244  .arg(precursor_id));
1245  if(q.lastError().isValid())
1246  {
1247  qDebug();
1248  throw PappsoException(
1249  QObject::tr(
1250  "ERROR in TIMS sqlite database file %1, executing SQL "
1251  "command %2:\n%3\n%4\n%5")
1252  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
1253  .arg(q.lastQuery())
1254  .arg(qdb.lastError().databaseText())
1255  .arg(qdb.lastError().driverText())
1256  .arg(qdb.lastError().nativeErrorCode()));
1257  }
1258 
1259  while(q.next())
1260  {
1261  // Frame, ScanNumBegin, ScanNumEnd, IsolationMz, ColliqionEnergy,
1262  // Precursor
1263  // Id, LargestPeakMz, AverageMz, MonoisotopicMz, Charge,
1264  // ScanNumber, Intensity, Parent
1265  TimsXicStructure xic_structure;
1266 
1267  xic_structure.precursorId = precursor_id;
1268  xic_structure.mzRange =
1269  MzRange(q.value(4).toDouble(), precision_ptr);
1270  xic_structure.scanNumBegin = q.value(2).toUInt();
1271  xic_structure.scanNumEnd = q.value(3).toUInt();
1272  xic_structure.rtTarget = q.value(0).toDouble();
1273  // xic_structure.charge = q.value(5).toUInt();
1274 
1275  xic_list.push_back(xic_structure);
1276  }
1277  }
1278  qDebug();
1279 
1280  TimsXicExtractorInterface *extractor_p = new TimsDirectXicExtractor(this);
1281  extractor_p->setXicExtractMethod(xicExtractMethod);
1282  extractor_p->extractTimsXicList(xic_list, rtRange);
1283  }
1284  catch(std::exception &error)
1285  {
1286  qDebug() << QString("Failure %1 ").arg(error.what());
1287  }
1288 
1289  qDebug();
1290  return xic_list;
1291 }

References pappso::TimsXicExtractorInterface::extractTimsXicList(), m_timsDataDirectory, pappso::TimsXicStructure::mzRange, openDatabaseConnection(), pappso::TimsXicStructure::precursorId, pappso::TimsXicStructure::rtTarget, pappso::TimsXicStructure::scanNumBegin, pappso::TimsXicStructure::scanNumEnd, and pappso::TimsXicExtractorInterface::setXicExtractMethod().

◆ getClosestIdByMz()

std::vector< std::size_t > TimsData::getClosestIdByMz ( std::vector< std::vector< double >>  ids,
double  mz_value 
)
private

Definition at line 642 of file timsdata.cpp.

644 {
645  std::vector<std::size_t> best_precursor;
646  double best_value = 1;
647  int count = 1;
648  int best_val_position;
649 
650  for(std::vector<double> values : ids)
651  {
652  double new_val = abs(mz_value - values[4]);
653  if(new_val < best_value)
654  {
655  best_value = new_val;
656  best_val_position = count;
657  }
658  count++;
659  }
660  best_precursor.push_back(ids[best_val_position][1]);
661  return best_precursor;
662 }

Referenced by getPrecursorsFromMzRtCharge().

◆ getMassSpectrumCstSPtr()

pappso::MassSpectrumCstSPtr TimsData::getMassSpectrumCstSPtr ( std::size_t  timsId,
std::size_t  scanNum 
)

get a mass spectrum given the tims frame database id and scan number within tims frame

Definition at line 516 of file timsdata.cpp.

517 {
519 
520  return frame->getMassSpectrumCstSPtr(scanNum);
521 }

References getTimsFrameCstSPtrCached().

Referenced by getMassSpectrumCstSPtrByRawIndex().

◆ getMassSpectrumCstSPtrByRawIndex()

pappso::MassSpectrumCstSPtr TimsData::getMassSpectrumCstSPtrByRawIndex ( std::size_t  raw_index)

get a mass spectrum given its spectrum index

Parameters
raw_indexa number begining at 0, corresponding to a Tims Scan in the order they lies in the binary data file

Definition at line 294 of file timsdata.cpp.

295 {
296 
297  auto coordinate = getScanCoordinateFromRawIndex(raw_index);
298  return getMassSpectrumCstSPtr(coordinate.first, coordinate.second);
299 }

References getMassSpectrumCstSPtr(), and getScanCoordinateFromRawIndex().

Referenced by pappso::TimsMsRunReader::massSpectrumCstSPtr().

◆ getMatchPrecursorIdByKo()

std::vector< std::size_t > TimsData::getMatchPrecursorIdByKo ( std::vector< std::vector< double >>  ids,
double  ko_value 
)
private

Definition at line 616 of file timsdata.cpp.

618 {
619  std::vector<std::size_t> precursor_id;
620  for(std::vector<double> index : ids)
621  {
622  auto coordinate = getScanCoordinateFromRawIndex(index[0]);
623 
624  TimsFrameBaseCstSPtr tims_frame;
625  tims_frame = getTimsFrameBaseCstSPtrCached(coordinate.first);
626 
627  double bko = tims_frame.get()->getOneOverK0Transformation(index[2]);
628  double eko = tims_frame.get()->getOneOverK0Transformation(index[3]);
629 
630  qInfo() << "diff" << (bko + eko) / 2;
631  double mean_ko = (bko + eko) / 2;
632 
633  if(mean_ko > ko_value - 0.1 && mean_ko < ko_value + 0.1)
634  {
635  precursor_id.push_back(index[1]);
636  }
637  }
638  return precursor_id;
639 }

References getScanCoordinateFromRawIndex(), and getTimsFrameBaseCstSPtrCached().

◆ getMsLevelBySpectrumIndex()

unsigned int TimsData::getMsLevelBySpectrumIndex ( std::size_t  spectrum_index)

Definition at line 666 of file timsdata.cpp.

667 {
668  auto coordinate = getScanCoordinateFromRawIndex(spectrum_index);
669  auto tims_frame = getTimsFrameCstSPtrCached(coordinate.first);
670  return tims_frame.get()->getMsLevel();
671 }

References getScanCoordinateFromRawIndex(), and getTimsFrameCstSPtrCached().

Referenced by pappso::TimsMsRunReader::readSpectrumCollection().

◆ getPrecursorsFromMzRtCharge()

std::vector< std::size_t > TimsData::getPrecursorsFromMzRtCharge ( int  charge,
double  mz_val,
double  rt_sec,
double  k0 
)

guess possible precursor ids given a charge, m/z, retention time and k0

Returns
a list of possible precursor ids

Definition at line 537 of file timsdata.cpp.

541 {
542  std::vector<std::size_t> precursor_ids;
543  std::vector<std::vector<double>> ids;
544 
545  QSqlDatabase qdb = openDatabaseConnection();
546  QSqlQuery q = qdb.exec(
547  QString(
548  "SELECT Frames.time, Precursors.MonoisotopicMz, Precursors.Charge, "
549  "Precursors.Id, Frames.Id, PasefFrameMsMsInfo.ScanNumBegin, "
550  "PasefFrameMsMsInfo.scanNumEnd "
551  "FROM Frames "
552  "INNER JOIN PasefFrameMsMsInfo ON Frames.Id = PasefFrameMsMsInfo.Frame "
553  "INNER JOIN Precursors ON PasefFrameMsMsInfo.Precursor = Precursors.Id "
554  "WHERE Precursors.Charge == %1 "
555  "AND Precursors.MonoisotopicMz > %2 -0.01 "
556  "AND Precursors.MonoisotopicMz < %2 +0.01 "
557  "AND Frames.Time >= %3 "
558  "AND Frames.Time < %3 +1; ")
559  .arg(charge)
560  .arg(mz_val)
561  .arg(rt_sec));
562  if(q.lastError().isValid())
563  {
564 
565  throw PappsoException(
566  QObject::tr("ERROR in TIMS sqlite database file %1, database name %2, "
567  "executing SQL "
568  "command %3:\n%4\n%5\n%6")
569  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
570  .arg(qdb.databaseName())
571  .arg(q.lastQuery())
572  .arg(qdb.lastError().databaseText())
573  .arg(qdb.lastError().driverText())
574  .arg(qdb.lastError().nativeErrorCode()));
575  }
576  while(q.next())
577  {
578  qInfo() << q.value(0).toDouble() << q.value(1).toDouble()
579  << q.value(2).toDouble() << q.value(3).toDouble();
580 
581  std::vector<double> sql_values;
582  sql_values.push_back(q.value(4).toDouble()); // frame id
583  sql_values.push_back(q.value(3).toDouble()); // precursor id
584  sql_values.push_back(q.value(5).toDouble()); // scan num begin
585  sql_values.push_back(q.value(6).toDouble()); // scan num end
586  sql_values.push_back(q.value(1).toDouble()); // mz_value
587 
588  ids.push_back(sql_values);
589 
590 
591  if(std::find(precursor_ids.begin(),
592  precursor_ids.end(),
593  q.value(3).toDouble()) == precursor_ids.end())
594  {
595  precursor_ids.push_back(q.value(3).toDouble());
596  }
597  }
598 
599  if(precursor_ids.size() > 1)
600  {
601  // std::vector<std::size_t> precursor_ids_ko =
602  // getMatchPrecursorIdByKo(ids, values[3]);
603  if(precursor_ids.size() > 1)
604  {
605  precursor_ids = getClosestIdByMz(ids, k0);
606  }
607  return precursor_ids;
608  }
609  else
610  {
611  return precursor_ids;
612  }
613 }

References getClosestIdByMz(), m_timsDataDirectory, and openDatabaseConnection().

◆ getQualifiedMassSpectrumByRawIndex()

QualifiedMassSpectrum TimsData::getQualifiedMassSpectrumByRawIndex ( std::size_t  spectrum_index,
bool  want_binary_data 
)

Definition at line 675 of file timsdata.cpp.

677 {
678  auto coordinate = getScanCoordinateFromRawIndex(spectrum_index);
679  TimsFrameBaseCstSPtr tims_frame;
680  if(want_binary_data)
681  {
682  tims_frame = getTimsFrameCstSPtrCached(coordinate.first);
683  }
684  else
685  {
686  tims_frame = getTimsFrameBaseCstSPtrCached(coordinate.first);
687  }
688  QualifiedMassSpectrum mass_spectrum;
689  MassSpectrumId spectrum_id;
690 
691  spectrum_id.setSpectrumIndex(spectrum_index);
692  spectrum_id.setNativeId(QString("frame=%1 scan=%2 index=%3")
693  .arg(coordinate.first)
694  .arg(coordinate.second)
695  .arg(spectrum_index));
696 
697  mass_spectrum.setMassSpectrumId(spectrum_id);
698 
699  mass_spectrum.setMsLevel(tims_frame.get()->getMsLevel());
700  mass_spectrum.setRtInSeconds(tims_frame.get()->getTime());
701 
702  mass_spectrum.setDtInMilliSeconds(
703  tims_frame.get()->getDriftTime(coordinate.second));
704  // 1/K0
705  mass_spectrum.setParameterValue(
706  QualifiedMassSpectrumParameter::OneOverK0,
707  tims_frame.get()->getOneOverK0Transformation(coordinate.second));
708 
709  mass_spectrum.setEmptyMassSpectrum(true);
710  if(want_binary_data)
711  {
712  mass_spectrum.setMassSpectrumSPtr(
713  tims_frame.get()->getMassSpectrumSPtr(coordinate.second));
714  if(mass_spectrum.size() > 0)
715  {
716  mass_spectrum.setEmptyMassSpectrum(false);
717  }
718  }
719  else
720  {
721  // if(tims_frame.get()->getNbrPeaks(coordinate.second) > 0)
722  //{
723  mass_spectrum.setEmptyMassSpectrum(false);
724  // }
725  }
726  if(tims_frame.get()->getMsLevel() > 1)
727  {
728 
729  QSqlDatabase qdb = openDatabaseConnection();
730  QSqlQuery q = qdb.exec(
731  QString(
732  "SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
733  "PasefFrameMsMsInfo INNER JOIN Precursors ON "
734  "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
735  "PasefFrameMsMsInfo.Frame=%1 and (PasefFrameMsMsInfo.ScanNumBegin "
736  "<= %2 and PasefFrameMsMsInfo.ScanNumEnd >= %2);")
737  .arg(coordinate.first)
738  .arg(coordinate.second));
739  if(q.lastError().isValid())
740  {
741  throw PappsoException(
742  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
743  "command %2:\n%3\n%4\n%5")
744  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
745  .arg(q.lastQuery())
746  .arg(qdb.lastError().databaseText())
747  .arg(qdb.lastError().driverText())
748  .arg(qdb.lastError().nativeErrorCode()));
749  }
750  if(q.next())
751  {
752  // mass_spectrum.setPrecursorCharge(q.value(11).toInt());
753  // mass_spectrum.setPrecursorMz(q.value(10).toDouble());
754  // mass_spectrum.setPrecursorIntensity(q.value(13).toDouble());
755  // mass_spectrum.setPrecursorSpectrumIndex();
756 
757  mass_spectrum.appendPrecursorIonData(
758  PrecursorIonData(q.value(10).toDouble(),
759  q.value(11).toInt(),
760  q.value(13).toDouble()));
761 
762 
763  MassSpectrumId spectrum_id;
764  std::size_t prec_spectrum_index = getRawIndexFromCoordinate(
765  q.value(14).toDouble(), coordinate.second);
766 
767  mass_spectrum.setPrecursorSpectrumIndex(prec_spectrum_index);
768  mass_spectrum.setPrecursorNativeId(
769  QString("frame=%1 scan=%2 index=%3")
770  .arg(q.value(14).toDouble())
771  .arg(coordinate.second)
772  .arg(prec_spectrum_index));
773 
774  mass_spectrum.setParameterValue(
775  QualifiedMassSpectrumParameter::IsolationMz, q.value(3).toDouble());
776  mass_spectrum.setParameterValue(
777  QualifiedMassSpectrumParameter::IsolationWidth,
778  q.value(4).toDouble());
779 
780  mass_spectrum.setParameterValue(
781  QualifiedMassSpectrumParameter::CollisionEnergy,
782  q.value(5).toFloat());
783  mass_spectrum.setParameterValue(
784  QualifiedMassSpectrumParameter::BrukerPrecursorIndex,
785  q.value(6).toInt());
786  }
787  }
788 
789  return mass_spectrum;
790 }

References pappso::QualifiedMassSpectrum::appendPrecursorIonData(), getRawIndexFromCoordinate(), getScanCoordinateFromRawIndex(), getTimsFrameBaseCstSPtrCached(), getTimsFrameCstSPtrCached(), m_timsDataDirectory, openDatabaseConnection(), pappso::QualifiedMassSpectrum::setDtInMilliSeconds(), pappso::QualifiedMassSpectrum::setEmptyMassSpectrum(), pappso::QualifiedMassSpectrum::setMassSpectrumId(), pappso::QualifiedMassSpectrum::setMassSpectrumSPtr(), pappso::QualifiedMassSpectrum::setMsLevel(), pappso::MassSpectrumId::setNativeId(), pappso::QualifiedMassSpectrum::setParameterValue(), pappso::QualifiedMassSpectrum::setPrecursorNativeId(), pappso::QualifiedMassSpectrum::setPrecursorSpectrumIndex(), pappso::QualifiedMassSpectrum::setRtInSeconds(), pappso::MassSpectrumId::setSpectrumIndex(), and pappso::QualifiedMassSpectrum::size().

Referenced by pappso::TimsMsRunReader::qualifiedMassSpectrum().

◆ getQualifiedMs1MassSpectrumByPrecursorId()

QualifiedMassSpectrum TimsData::getQualifiedMs1MassSpectrumByPrecursorId ( std::size_t  ms2_index,
std::size_t  precursor_index,
bool  want_binary_data 
)

Definition at line 794 of file timsdata.cpp.

797 {
798  QualifiedMassSpectrum mass_spectrum;
799 
800  try
801  {
802  QSqlDatabase qdb = openDatabaseConnection();
803  mass_spectrum.setMsLevel(1);
804  mass_spectrum.setPrecursorSpectrumIndex(0);
805  mass_spectrum.setEmptyMassSpectrum(true);
806  QSqlQuery q =
807  qdb.exec(QString("SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
808  "PasefFrameMsMsInfo INNER JOIN Precursors ON "
809  "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
810  "Precursors.Id=%1;")
811  .arg(precursor_index));
812  if(q.lastError().isValid())
813  {
814 
815  throw PappsoException(
816  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
817  "command %2:\n%3\n%4\n%5")
818  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
819  .arg(q.lastQuery())
820  .arg(qdb.lastError().databaseText())
821  .arg(qdb.lastError().driverText())
822  .arg(qdb.lastError().nativeErrorCode()));
823  }
824  if(q.size() == 0)
825  {
826 
827  throw ExceptionNotFound(
828  QObject::tr(
829  "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
830  "id=%1 not found")
831  .arg(precursor_index));
832  }
833  else
834  {
835  TracePlusCombiner combiner;
836  MapTrace combiner_result;
837 
838 
839  bool first = true;
840  std::size_t scan_mobility_start = 0;
841  std::size_t scan_mobility_end = 0;
842  std::set<std::size_t> tims_frame_list;
843  while(q.next())
844  {
845  // get MS1 frame
846  tims_frame_list.insert(q.value(14).toLongLong());
847  if(first)
848  {
849 
850 
851  MassSpectrumId spectrum_id;
852 
853  spectrum_id.setSpectrumIndex(precursor_index);
854  spectrum_id.setNativeId(
855  QString("frame=%1 begin=%2 end=%3 precursor=%4 idxms2=%5")
856  .arg(q.value(0).toLongLong())
857  .arg(q.value(1).toLongLong())
858  .arg(q.value(2).toLongLong())
859  .arg(precursor_index)
860  .arg(ms2_index));
861 
862 
863  mass_spectrum.setMassSpectrumId(spectrum_id);
864 
865 
866  scan_mobility_start = q.value(1).toLongLong();
867  scan_mobility_end = q.value(2).toLongLong();
868 
869  first = false;
870  }
871  }
872 
873  first = true;
874  for(std::size_t tims_id : tims_frame_list)
875  {
876  TimsFrameBaseCstSPtr tims_frame =
877  getTimsFrameCstSPtrCached(tims_id);
878  if(first)
879  {
880  mass_spectrum.setRtInSeconds(tims_frame.get()->getTime());
881 
882  mass_spectrum.setParameterValue(
883  QualifiedMassSpectrumParameter::OneOverK0begin,
884  tims_frame.get()->getOneOverK0Transformation(
885  scan_mobility_start));
886 
887  mass_spectrum.setParameterValue(
888  QualifiedMassSpectrumParameter::OneOverK0end,
889  tims_frame.get()->getOneOverK0Transformation(
890  scan_mobility_end));
891 
892  first = false;
893  }
894 
895 
896  if(want_binary_data)
897  {
898  combiner.combine(combiner_result,
899  tims_frame.get()->cumulateScanToTrace(
900  scan_mobility_start, scan_mobility_end));
901  }
902  else
903  {
904  break;
905  }
906  }
907 
908 
909  if(first == true)
910  {
911  throw ExceptionNotFound(
912  QObject::tr(
913  "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
914  "id=%1 not found")
915  .arg(precursor_index));
916  }
917 
918 
919  if(want_binary_data)
920  {
921 
922  pappso::Trace trace(combiner_result);
923  qDebug();
924 
925  if(trace.size() > 0)
926  {
927  if(mcsp_ms1Filter != nullptr)
928  {
929  mcsp_ms1Filter->filter(trace);
930  }
931 
932  qDebug();
933  mass_spectrum.setMassSpectrumSPtr(
934  MassSpectrum(trace).makeMassSpectrumSPtr());
935  mass_spectrum.setEmptyMassSpectrum(false);
936  }
937  else
938  {
939  mass_spectrum.setMassSpectrumSPtr(nullptr);
940  mass_spectrum.setEmptyMassSpectrum(true);
941  }
942  }
943  }
944  }
945  catch(std::exception &error)
946  {
947  qDebug() << __FILE__ << "@" << __LINE__ << __FUNCTION__ << "()"
948  << QString("Failure %1 ").arg(error.what());
949  }
950  return mass_spectrum;
951 }

References pappso::TracePlusCombiner::combine(), getTimsFrameCstSPtrCached(), m_timsDataDirectory, mcsp_ms1Filter, openDatabaseConnection(), pappso::QualifiedMassSpectrum::setEmptyMassSpectrum(), pappso::QualifiedMassSpectrum::setMassSpectrumId(), pappso::QualifiedMassSpectrum::setMassSpectrumSPtr(), pappso::QualifiedMassSpectrum::setMsLevel(), pappso::MassSpectrumId::setNativeId(), pappso::QualifiedMassSpectrum::setParameterValue(), pappso::QualifiedMassSpectrum::setPrecursorSpectrumIndex(), pappso::QualifiedMassSpectrum::setRtInSeconds(), and pappso::MassSpectrumId::setSpectrumIndex().

Referenced by pappso::TimsMsRunReaderMs2::qualifiedMassSpectrum(), and pappso::TimsMsRunReaderMs2Selected::qualifiedMassSpectrum().

◆ getQualifiedMs2MassSpectrumByPrecursorId()

void TimsData::getQualifiedMs2MassSpectrumByPrecursorId ( QualifiedMassSpectrum mass_spectrum,
std::size_t  ms2_index,
std::size_t  precursor_index,
bool  want_binary_data 
)

Definition at line 955 of file timsdata.cpp.

960 {
961  qDebug();
962  try
963  {
964  QSqlDatabase qdb = openDatabaseConnection();
965  MassSpectrumId spectrum_id;
966 
967  spectrum_id.setSpectrumIndex(precursor_index);
968  spectrum_id.setNativeId(
969  QString("precursor=%1 idxms2=%2").arg(precursor_index).arg(ms2_index));
970 
971  mass_spectrum.setMassSpectrumId(spectrum_id);
972 
973  mass_spectrum.setMsLevel(2);
974  mass_spectrum.setPrecursorSpectrumIndex(ms2_index - 1);
975 
976  mass_spectrum.setEmptyMassSpectrum(true);
977 
978  qdb = openDatabaseConnection();
979  // m_mutex.lock();
980  // if(m_query != nullptr)
981  // {
982  // *m_query =
983  // qdb.exec(QString("SELECT PasefFrameMsMsInfo.*, Precursors.*
984  // FROM "
985  // "PasefFrameMsMsInfo INNER JOIN Precursors ON "
986  // "PasefFrameMsMsInfo.Precursor=Precursors.Id
987  // where " "Precursors.Id=%1;")
988  // .arg(precursor_index));
989  // }
990  QSqlQuery q =
991  qdb.exec(QString("SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
992  "PasefFrameMsMsInfo INNER JOIN Precursors ON "
993  "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
994  "Precursors.Id=%1;")
995  .arg(precursor_index));
996  if(q.lastError().isValid())
997  {
998  qDebug();
999  throw PappsoException(
1000  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
1001  "command %2:\n%3\n%4\n%5")
1002  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
1003  .arg(q.lastQuery())
1004  .arg(qdb.lastError().databaseText())
1005  .arg(qdb.lastError().driverText())
1006  .arg(qdb.lastError().nativeErrorCode()));
1007  }
1008  qDebug();
1009  // m_mutex.unlock();
1010  if(q.size() == 0)
1011  {
1012 
1013  throw ExceptionNotFound(
1014  QObject::tr(
1015  "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1016  "id=%1 not found")
1017  .arg(precursor_index));
1018  }
1019  else
1020  {
1021  // qDebug() << " q.size()="<< q.size();
1022  qDebug();
1023  bool first = true;
1024  std::size_t scan_mobility_start = 0;
1025  std::size_t scan_mobility_end = 0;
1026  std::vector<std::size_t> tims_frame_list;
1027 
1028  while(q.next())
1029  {
1030  tims_frame_list.push_back(q.value(0).toLongLong());
1031  if(first)
1032  {
1033  // mass_spectrum.setPrecursorCharge(q.value(11).toInt());
1034  // mass_spectrum.setPrecursorMz(q.value(10).toDouble());
1035  // mass_spectrum.setPrecursorIntensity(q.value(13).toDouble());
1036 
1037  mass_spectrum.appendPrecursorIonData(
1038  PrecursorIonData(q.value(10).toDouble(),
1039  q.value(11).toInt(),
1040  q.value(13).toDouble()));
1041 
1042  mass_spectrum.setPrecursorNativeId(
1043  QString("frame=%1 begin=%2 end=%3 precursor=%4 idxms2=%5")
1044  .arg(q.value(14).toLongLong())
1045  .arg(q.value(1).toLongLong())
1046  .arg(q.value(2).toLongLong())
1047  .arg(precursor_index)
1048  .arg(ms2_index - 1));
1049  // mass_spectrum.setPrecursorSpectrumIndex();
1050 
1051  scan_mobility_start = q.value(1).toLongLong();
1052  scan_mobility_end = q.value(2).toLongLong();
1053 
1054  mass_spectrum.setParameterValue(
1055  QualifiedMassSpectrumParameter::IsolationMz,
1056  q.value(3).toDouble());
1057  mass_spectrum.setParameterValue(
1058  QualifiedMassSpectrumParameter::IsolationWidth,
1059  q.value(4).toDouble());
1060 
1061  mass_spectrum.setParameterValue(
1062  QualifiedMassSpectrumParameter::CollisionEnergy,
1063  q.value(5).toFloat());
1064  mass_spectrum.setParameterValue(
1065  QualifiedMassSpectrumParameter::BrukerPrecursorIndex,
1066  q.value(6).toInt());
1067 
1068  first = false;
1069  }
1070  }
1071  // QMutexLocker locker(&m_mutex_spectrum);
1072  qDebug();
1073  pappso::TimsFrameCstSPtr tims_frame;
1074  TracePlusCombiner combiner;
1075  MapTrace combiner_result;
1076  first = true;
1077  for(std::size_t tims_id : tims_frame_list)
1078  {
1079 
1080  tims_frame = getTimsFrameCstSPtrCached(tims_id);
1081  if(first)
1082  {
1083  mass_spectrum.setRtInSeconds(tims_frame.get()->getTime());
1084 
1085  mass_spectrum.setParameterValue(
1086  QualifiedMassSpectrumParameter::OneOverK0begin,
1087  tims_frame.get()->getOneOverK0Transformation(
1088  scan_mobility_start));
1089 
1090  mass_spectrum.setParameterValue(
1091  QualifiedMassSpectrumParameter::OneOverK0end,
1092  tims_frame.get()->getOneOverK0Transformation(
1093  scan_mobility_end));
1094 
1095  first = false;
1096  }
1097 
1098 
1099  if(want_binary_data)
1100  {
1101  qDebug();
1102  combiner.combine(combiner_result,
1103  tims_frame.get()->cumulateScanToTrace(
1104  scan_mobility_start, scan_mobility_end));
1105  qDebug();
1106  }
1107  }
1108  qDebug() << " precursor_index=" << precursor_index
1109  << " num_rows=" << tims_frame_list.size()
1110  << " sql=" << q.lastQuery() << " "
1111  << (std::size_t)QThread::currentThreadId();
1112  if(first == true)
1113  {
1114  throw ExceptionNotFound(
1115  QObject::tr(
1116  "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1117  "id=%1 not found")
1118  .arg(precursor_index));
1119  }
1120  if(want_binary_data)
1121  {
1122  qDebug();
1123  // peak_pick.filter(trace);
1124 
1125  pappso::Trace trace(combiner_result);
1126 
1127  if(trace.size() > 0)
1128  {
1129  qDebug() << trace.size() << " "
1130  << (std::size_t)QThread::currentThreadId();
1131 
1132  if(mcsp_ms2Filter != nullptr)
1133  {
1134  // FilterTriangle filter;
1135  // filter.setTriangleSlope(50, 0.02);
1136  // filter.filter(trace);
1137  // trace.filter(pappso::FilterHighPass(10));
1138  mcsp_ms2Filter->filter(trace);
1139  }
1140 
1141  // FilterScaleFactorY filter_scale((double)1 /
1142  // (double)tims_frame_list.size());
1143  // filter_scale.filter(trace);
1144  qDebug();
1145  mass_spectrum.setMassSpectrumSPtr(
1146  MassSpectrum(trace).makeMassSpectrumSPtr());
1147  mass_spectrum.setEmptyMassSpectrum(false);
1148  }
1149  else
1150  {
1151  mass_spectrum.setMassSpectrumSPtr(nullptr);
1152  mass_spectrum.setEmptyMassSpectrum(true);
1153  }
1154 
1155  qDebug();
1156  }
1157  qDebug();
1158  }
1159  }
1160  catch(std::exception &error)
1161  {
1162  qDebug() << __FILE__ << "@" << __LINE__ << __FUNCTION__ << "()"
1163  << QString("Failure %1 ").arg(error.what());
1164  }
1165  qDebug();
1166 }

References pappso::QualifiedMassSpectrum::appendPrecursorIonData(), pappso::TracePlusCombiner::combine(), getTimsFrameCstSPtrCached(), m_timsDataDirectory, mcsp_ms2Filter, openDatabaseConnection(), pappso::QualifiedMassSpectrum::setEmptyMassSpectrum(), pappso::QualifiedMassSpectrum::setMassSpectrumId(), pappso::QualifiedMassSpectrum::setMassSpectrumSPtr(), pappso::QualifiedMassSpectrum::setMsLevel(), pappso::MassSpectrumId::setNativeId(), pappso::QualifiedMassSpectrum::setParameterValue(), pappso::QualifiedMassSpectrum::setPrecursorNativeId(), pappso::QualifiedMassSpectrum::setPrecursorSpectrumIndex(), pappso::QualifiedMassSpectrum::setRtInSeconds(), and pappso::MassSpectrumId::setSpectrumIndex().

Referenced by pappso::TimsMsRunReaderMs2::qualifiedMassSpectrum(), and pappso::TimsMsRunReaderMs2Selected::qualifiedMassSpectrum().

◆ getRawIndexFromCoordinate()

std::size_t TimsData::getRawIndexFromCoordinate ( std::size_t  frame_id,
std::size_t  scan_num 
) const
private

Definition at line 245 of file timsdata.cpp.

247 {
248 
249 
250  QSqlDatabase qdb = openDatabaseConnection();
251  QSqlQuery q =
252  qdb.exec(QString("SELECT Id, NumScans FROM "
253  "Frames ORDER BY Id"));
254  if(q.lastError().isValid())
255  {
256 
257  throw PappsoException(
258  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
259  "command %2:\n%3\n%4\n%5")
260  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
261  .arg(q.lastQuery())
262  .arg(qdb.lastError().databaseText())
263  .arg(qdb.lastError().driverText())
264  .arg(qdb.lastError().nativeErrorCode()));
265  }
266  bool index_found = false;
267  std::size_t timsId;
268  std::size_t numberScans;
269  std::size_t offset = 0;
270  while(q.next() && (!index_found))
271  {
272  timsId = q.value(0).toUInt();
273  numberScans = q.value(1).toUInt();
274 
275  if(timsId == frame_id)
276  {
277  return offset + scan_num;
278  }
279 
280  offset += numberScans;
281  }
282 
283  throw ExceptionNotFound(
284  QObject::tr("ERROR raw index with frame=%1 scan=%2 not found")
285  .arg(frame_id)
286  .arg(scan_num));
287 }

References m_timsDataDirectory, and openDatabaseConnection().

Referenced by getQualifiedMassSpectrumByRawIndex().

◆ getScanCoordinateFromRawIndex()

std::pair< std::size_t, std::size_t > TimsData::getScanCoordinateFromRawIndex ( std::size_t  spectrum_index) const
private

Definition at line 200 of file timsdata.cpp.

201 {
202 
203  QSqlDatabase qdb = openDatabaseConnection();
204 
205  QSqlQuery q =
206  qdb.exec(QString("SELECT Id, NumScans FROM "
207  "Frames ORDER BY Id"));
208  if(q.lastError().isValid())
209  {
210 
211  throw PappsoException(
212  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
213  "command %2:\n%3\n%4\n%5")
214  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
215  .arg(q.lastQuery())
216  .arg(qdb.lastError().databaseText())
217  .arg(qdb.lastError().driverText())
218  .arg(qdb.lastError().nativeErrorCode()));
219  }
220  pappso::TimsFrameSPtr tims_frame;
221  bool index_found = false;
222  std::size_t timsId;
223  std::size_t numberScans;
224  std::size_t offset = 0;
225  while(q.next() && (!index_found))
226  {
227  timsId = q.value(0).toUInt();
228  numberScans = q.value(1).toUInt();
229 
230  if(raw_index < (offset + numberScans))
231  {
232  return std::pair<std::size_t, std::size_t>(timsId,
233  raw_index - offset);
234  }
235 
236  offset += numberScans;
237  }
238 
239  throw ExceptionNotFound(
240  QObject::tr("ERROR raw index %1 not found").arg(raw_index));
241 }

References m_timsDataDirectory, and openDatabaseConnection().

Referenced by getMassSpectrumCstSPtrByRawIndex(), getMatchPrecursorIdByKo(), getMsLevelBySpectrumIndex(), and getQualifiedMassSpectrumByRawIndex().

◆ getTimsFrameBaseCstSPtr()

TimsFrameBaseCstSPtr TimsData::getTimsFrameBaseCstSPtr ( std::size_t  timsId) const
private

get a Tims frame base (no binary data file access) with his database ID

Definition at line 303 of file timsdata.cpp.

304 {
305 
306  qDebug() << " timsId=" << timsId;
307 
308  QSqlDatabase qdb = openDatabaseConnection();
309  QSqlQuery q = qdb.exec(
310  QString("SELECT Frames.TimsId, Frames.AccumulationTime, "
311  " MzCalibration.DigitizerTimebase, MzCalibration.DigitizerDelay, "
312  "MzCalibration.C0, MzCalibration.C1, MzCalibration.C2, "
313  "MzCalibration.C3, MzCalibration.T1, MzCalibration.T2, "
314  "MzCalibration.dC1, MzCalibration.dC2, Frames.T1, Frames.T2, "
315  "Frames.Time, Frames.MsMsType, TimsCalibration.ModelType, "
316  "TimsCalibration.C0, TimsCalibration.C1, TimsCalibration.C2, "
317  "TimsCalibration.C3, TimsCalibration.C4, TimsCalibration.C5, "
318  "TimsCalibration.C6, TimsCalibration.C7, TimsCalibration.C8, "
319  "TimsCalibration.C9 FROM "
320  "Frames INNER JOIN MzCalibration ON "
321  "Frames.MzCalibration=MzCalibration.Id INNER JOIN TimsCalibration "
322  "ON Frames.TimsCalibration=TimsCalibration.Id where "
323  "Frames.Id=%1;")
324  .arg(timsId));
325  if(q.lastError().isValid())
326  {
327 
328  throw PappsoException(
329  QObject::tr("ERROR in TIMS sqlite database file %1, database name %2, "
330  "executing SQL "
331  "command %3:\n%4\n%5\n%6")
332  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
333  .arg(qdb.databaseName())
334  .arg(q.lastQuery())
335  .arg(qdb.lastError().databaseText())
336  .arg(qdb.lastError().driverText())
337  .arg(qdb.lastError().nativeErrorCode()));
338  }
339  pappso::TimsFrameBaseSPtr tims_frame;
340  if(q.next())
341  {
342 
343 
344  double T1_ref = q.value(8).toDouble();
345  double T2_ref = q.value(9).toDouble();
346  double factor1 = q.value(10).toDouble();
347  double factor2 = q.value(11).toDouble();
348 
349  double T1_frame = q.value(12).toDouble();
350  double T2_frame = q.value(13).toDouble();
351 
352 
353  double temperature_correction =
354  factor1 * (T1_ref - T1_frame) + factor2 * (T2_ref - T2_frame);
355  temperature_correction = (double)1.0 + (temperature_correction / 1.0e6);
356 
357  tims_frame = std::make_shared<TimsFrameBase>(
358  TimsFrameBase(timsId, q.value(0).toUInt()));
359 
360  tims_frame.get()->setMzCalibration(temperature_correction,
361  q.value(2).toDouble(),
362  q.value(3).toDouble(),
363  q.value(4).toDouble(),
364  q.value(5).toDouble(),
365  q.value(6).toDouble(),
366  q.value(7).toDouble());
367 
368  tims_frame.get()->setAccumulationTime(q.value(1).toDouble());
369 
370  tims_frame.get()->setTime(q.value(14).toDouble());
371  tims_frame.get()->setMsMsType(q.value(15).toUInt());
372 
373  tims_frame.get()->setTimsCalibration(q.value(16).toInt(),
374  q.value(17).toDouble(),
375  q.value(18).toDouble(),
376  q.value(19).toDouble(),
377  q.value(20).toDouble(),
378  q.value(21).toDouble(),
379  q.value(22).toDouble(),
380  q.value(23).toDouble(),
381  q.value(24).toDouble(),
382  q.value(25).toDouble(),
383  q.value(26).toDouble());
384  return tims_frame;
385  }
386 
387  throw ExceptionNotFound(QObject::tr("ERROR timsId %1 not found").arg(timsId));
388  // return TimsFrameCstSPtr;
389 }

References m_timsDataDirectory, and openDatabaseConnection().

Referenced by getTimsFrameBaseCstSPtrCached().

◆ getTimsFrameBaseCstSPtrCached()

TimsFrameBaseCstSPtr TimsData::getTimsFrameBaseCstSPtrCached ( std::size_t  timsId)
private

Definition at line 1170 of file timsdata.cpp.

1171 {
1172  QMutexLocker locker(&m_mutex);
1173  for(auto &tims_frame : m_timsFrameBaseCache)
1174  {
1175  if(tims_frame.get()->getId() == timsId)
1176  {
1177  m_timsFrameBaseCache.push_back(tims_frame);
1178  return tims_frame;
1179  }
1180  }
1181 
1182  m_timsFrameBaseCache.push_back(getTimsFrameBaseCstSPtr(timsId));
1183  if(m_timsFrameBaseCache.size() > m_cacheSize)
1184  m_timsFrameBaseCache.pop_front();
1185  return m_timsFrameBaseCache.back();
1186 }

References getTimsFrameBaseCstSPtr(), m_cacheSize, m_mutex, and m_timsFrameBaseCache.

Referenced by getMatchPrecursorIdByKo(), and getQualifiedMassSpectrumByRawIndex().

◆ getTimsFrameCstSPtr()

TimsFrameCstSPtr TimsData::getTimsFrameCstSPtr ( std::size_t  timsId) const

get a Tims frame with his database ID

Definition at line 426 of file timsdata.cpp.

427 {
428 
429  qDebug() << " timsId=" << timsId;
430 
431  QSqlDatabase qdb = openDatabaseConnection();
432  QSqlQuery q = qdb.exec(
433  QString("SELECT Frames.TimsId, Frames.AccumulationTime, "
434  " MzCalibration.DigitizerTimebase, MzCalibration.DigitizerDelay, "
435  "MzCalibration.C0, MzCalibration.C1, MzCalibration.C2, "
436  "MzCalibration.C3, MzCalibration.T1, MzCalibration.T2, "
437  "MzCalibration.dC1, MzCalibration.dC2, Frames.T1, Frames.T2, "
438  "Frames.Time, Frames.MsMsType, TimsCalibration.ModelType, "
439  "TimsCalibration.C0, TimsCalibration.C1, TimsCalibration.C2, "
440  "TimsCalibration.C3, TimsCalibration.C4, TimsCalibration.C5, "
441  "TimsCalibration.C6, TimsCalibration.C7, TimsCalibration.C8, "
442  "TimsCalibration.C9 FROM "
443  "Frames INNER JOIN MzCalibration ON "
444  "Frames.MzCalibration=MzCalibration.Id INNER JOIN TimsCalibration "
445  "ON Frames.TimsCalibration=TimsCalibration.Id where "
446  "Frames.Id=%1;")
447  .arg(timsId));
448  if(q.lastError().isValid())
449  {
450 
451  throw PappsoException(
452  QObject::tr("ERROR in TIMS sqlite database file %1, database name %2, "
453  "executing SQL "
454  "command %3:\n%4\n%5\n%6")
455  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
456  .arg(qdb.databaseName())
457  .arg(q.lastQuery())
458  .arg(qdb.lastError().databaseText())
459  .arg(qdb.lastError().driverText())
460  .arg(qdb.lastError().nativeErrorCode()));
461  }
462  pappso::TimsFrameSPtr tims_frame;
463  if(q.next())
464  {
465 
466 
467  double T1_ref = q.value(8).toDouble();
468  double T2_ref = q.value(9).toDouble();
469  double factor1 = q.value(10).toDouble();
470  double factor2 = q.value(11).toDouble();
471 
472  double T1_frame = q.value(12).toDouble();
473  double T2_frame = q.value(13).toDouble();
474 
475 
476  double temperature_correction =
477  factor1 * (T1_ref - T1_frame) + factor2 * (T2_ref - T2_frame);
478  temperature_correction = (double)1.0 + (temperature_correction / 1.0e6);
479 
480  tims_frame =
481  mpa_timsBinDec->getTimsFrameSPtrByOffset(timsId, q.value(0).toUInt());
482 
483  tims_frame.get()->setMzCalibration(temperature_correction,
484  q.value(2).toDouble(),
485  q.value(3).toDouble(),
486  q.value(4).toDouble(),
487  q.value(5).toDouble(),
488  q.value(6).toDouble(),
489  q.value(7).toDouble());
490 
491  tims_frame.get()->setAccumulationTime(q.value(1).toDouble());
492 
493  tims_frame.get()->setTime(q.value(14).toDouble());
494  tims_frame.get()->setMsMsType(q.value(15).toUInt());
495 
496  tims_frame.get()->setTimsCalibration(q.value(16).toInt(),
497  q.value(17).toDouble(),
498  q.value(18).toDouble(),
499  q.value(19).toDouble(),
500  q.value(20).toDouble(),
501  q.value(21).toDouble(),
502  q.value(22).toDouble(),
503  q.value(23).toDouble(),
504  q.value(24).toDouble(),
505  q.value(25).toDouble(),
506  q.value(26).toDouble());
507  return tims_frame;
508  }
509 
510  throw ExceptionNotFound(QObject::tr("ERROR timsId %1 not found").arg(timsId));
511  // return TimsFrameCstSPtr;
512 }

References pappso::TimsBinDec::getTimsFrameSPtrByOffset(), m_timsDataDirectory, mpa_timsBinDec, and openDatabaseConnection().

Referenced by pappso::TimsDirectXicExtractor::extractTimsXicList(), and getTimsFrameCstSPtrCached().

◆ getTimsFrameCstSPtrCached()

TimsFrameCstSPtr TimsData::getTimsFrameCstSPtrCached ( std::size_t  timsId)
private

get a Tims frame with his database ID but look in the cache first

Definition at line 1189 of file timsdata.cpp.

1190 {
1191  QMutexLocker locker(&m_mutex);
1192  for(auto &tims_frame : m_timsFrameCache)
1193  {
1194  if(tims_frame.get()->getId() == timsId)
1195  {
1196  m_timsFrameCache.push_back(tims_frame);
1197  return tims_frame;
1198  }
1199  }
1200 
1201  m_timsFrameCache.push_back(getTimsFrameCstSPtr(timsId));
1202  if(m_timsFrameCache.size() > m_cacheSize)
1203  m_timsFrameCache.pop_front();
1204  return m_timsFrameCache.back();
1205 }

References getTimsFrameCstSPtr(), m_cacheSize, m_mutex, and m_timsFrameCache.

Referenced by getMassSpectrumCstSPtr(), getMsLevelBySpectrumIndex(), getQualifiedMassSpectrumByRawIndex(), getQualifiedMs1MassSpectrumByPrecursorId(), and getQualifiedMs2MassSpectrumByPrecursorId().

◆ getTimsMS1FrameIdRange()

std::vector< std::size_t > TimsData::getTimsMS1FrameIdRange ( double  rt_begin,
double  rt_end 
) const

Definition at line 392 of file timsdata.cpp.

393 {
394 
395  qDebug() << " rt_begin=" << rt_begin << " rt_end=" << rt_end;
396  std::vector<std::size_t> tims_frameid_list;
397  QSqlDatabase qdb = openDatabaseConnection();
398  QSqlQuery q = qdb.exec(QString("SELECT Frames.TimsId FROM Frames WHERE "
399  "Frames.MsMsType=0 AND (Frames.Time=>%1) AND "
400  "(Frames.Time<=%2) SORT BY Frames.Time;")
401  .arg(rt_begin)
402  .arg(rt_end));
403  if(q.lastError().isValid())
404  {
405 
406  throw PappsoException(
407  QObject::tr("ERROR in TIMS sqlite database file %1, database name %2, "
408  "executing SQL "
409  "command %3:\n%4\n%5\n%6")
410  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
411  .arg(qdb.databaseName())
412  .arg(q.lastQuery())
413  .arg(qdb.lastError().databaseText())
414  .arg(qdb.lastError().driverText())
415  .arg(qdb.lastError().nativeErrorCode()));
416  }
417  while(q.next())
418  {
419 
420  tims_frameid_list.push_back(q.value(0).toUInt());
421  }
422  return tims_frameid_list;
423 }

References m_timsDataDirectory, and openDatabaseConnection().

Referenced by pappso::TimsDirectXicExtractor::extractTimsXicList().

◆ getTotalNumberOfPrecursors()

std::size_t TimsData::getTotalNumberOfPrecursors ( ) const

get the number of precursors analyzes by PASEF

Definition at line 531 of file timsdata.cpp.

532 {
534 }

References m_totalNumberOfPrecursors.

Referenced by pappso::TimsMsRunReaderMs2::spectrumListSize(), and pappso::TimsMsRunReaderMs2Selected::spectrumListSize().

◆ getTotalNumberOfScans()

std::size_t TimsData::getTotalNumberOfScans ( ) const

get the total number of scans

Definition at line 524 of file timsdata.cpp.

525 {
526  return m_totalNumberOfScans;
527 }

References m_totalNumberOfScans.

Referenced by pappso::TimsMsRunReader::spectrumListSize().

◆ openDatabaseConnection()

QSqlDatabase TimsData::openDatabaseConnection ( ) const
private

Definition at line 155 of file timsdata.cpp.

156 {
157  QString database_connection_name = QString("%1_%2")
158  .arg(m_timsDataDirectory.absolutePath())
159  .arg((quintptr)QThread::currentThread());
160  // Open the database
161  QSqlDatabase qdb = QSqlDatabase::database(database_connection_name);
162  if(!qdb.isValid())
163  {
164  qDebug() << database_connection_name;
165  qdb = QSqlDatabase::addDatabase("QSQLITE", database_connection_name);
166  qdb.setDatabaseName(m_timsDataDirectory.absoluteFilePath("analysis.tdf"));
167  }
168 
169 
170  if(!qdb.open())
171  {
172  qDebug();
173  throw PappsoException(
174  QObject::tr("ERROR opening TIMS sqlite database file %1, database name "
175  "%2 :\n%3\n%4\n%5")
176  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
177  .arg(database_connection_name)
178  .arg(qdb.lastError().databaseText())
179  .arg(qdb.lastError().driverText())
180  .arg(qdb.lastError().nativeErrorCode()));
181  }
182  return qdb;
183 }

References m_timsDataDirectory.

Referenced by TimsData(), extractXicListByPrecursorIds(), getPrecursorsFromMzRtCharge(), getQualifiedMassSpectrumByRawIndex(), getQualifiedMs1MassSpectrumByPrecursorId(), getQualifiedMs2MassSpectrumByPrecursorId(), getRawIndexFromCoordinate(), getScanCoordinateFromRawIndex(), getTimsFrameBaseCstSPtr(), getTimsFrameCstSPtr(), and getTimsMS1FrameIdRange().

◆ setMs1FilterCstSPtr()

void TimsData::setMs1FilterCstSPtr ( pappso::FilterInterfaceCstSPtr filter)

◆ setMs2FilterCstSPtr()

void TimsData::setMs2FilterCstSPtr ( pappso::FilterInterfaceCstSPtr filter)

Member Data Documentation

◆ m_cacheSize

std::size_t pappso::TimsData::m_cacheSize = 60
private

Definition at line 192 of file timsdata.h.

Referenced by getTimsFrameBaseCstSPtrCached(), and getTimsFrameCstSPtrCached().

◆ m_mutex

QMutex pappso::TimsData::m_mutex
private

Definition at line 198 of file timsdata.h.

Referenced by getTimsFrameBaseCstSPtrCached(), and getTimsFrameCstSPtrCached().

◆ m_timsDataDirectory

◆ m_timsFrameBaseCache

std::deque<TimsFrameBaseCstSPtr> pappso::TimsData::m_timsFrameBaseCache
private

Definition at line 194 of file timsdata.h.

Referenced by getTimsFrameBaseCstSPtrCached().

◆ m_timsFrameCache

std::deque<TimsFrameCstSPtr> pappso::TimsData::m_timsFrameCache
private

Definition at line 193 of file timsdata.h.

Referenced by getTimsFrameCstSPtrCached().

◆ m_totalNumberOfPrecursors

std::size_t pappso::TimsData::m_totalNumberOfPrecursors
private

Definition at line 191 of file timsdata.h.

Referenced by TimsData(), and getTotalNumberOfPrecursors().

◆ m_totalNumberOfScans

std::size_t pappso::TimsData::m_totalNumberOfScans
private

Definition at line 190 of file timsdata.h.

Referenced by TimsData(), and getTotalNumberOfScans().

◆ mcsp_ms1Filter

pappso::FilterInterfaceCstSPtr pappso::TimsData::mcsp_ms1Filter = nullptr
private

◆ mcsp_ms2Filter

pappso::FilterInterfaceCstSPtr pappso::TimsData::mcsp_ms2Filter = nullptr
private

◆ mpa_timsBinDec

TimsBinDec* pappso::TimsData::mpa_timsBinDec = nullptr
private

Definition at line 188 of file timsdata.h.

Referenced by TimsData(), ~TimsData(), and getTimsFrameCstSPtr().


The documentation for this class was generated from the following files:
pappso::TimsData::mcsp_ms2Filter
pappso::FilterInterfaceCstSPtr mcsp_ms2Filter
Definition: timsdata.h:196
pappso::TimsData::m_totalNumberOfPrecursors
std::size_t m_totalNumberOfPrecursors
Definition: timsdata.h:191
pappso::TimsXicStructure::precursorId
std::size_t precursorId
Definition: timsdata.h:50
pappso::TimsData::mcsp_ms1Filter
pappso::FilterInterfaceCstSPtr mcsp_ms1Filter
Definition: timsdata.h:197
pappso::TimsData::m_timsFrameBaseCache
std::deque< TimsFrameBaseCstSPtr > m_timsFrameBaseCache
Definition: timsdata.h:194
pappso::TimsData::getTimsFrameBaseCstSPtrCached
TimsFrameBaseCstSPtr getTimsFrameBaseCstSPtrCached(std::size_t timsId)
Definition: timsdata.cpp:1170
pappso::TimsFrameSPtr
std::shared_ptr< TimsFrame > TimsFrameSPtr
Definition: timsframe.h:40
pappso::TracePlusCombiner::combine
virtual MapTrace & combine(MapTrace &map_trace, const Trace &trace) const override
Definition: tracepluscombiner.cpp:52
pappso::TimsFrameBase
Definition: timsframebase.h:47
pappso::TimsBinDec
Definition: timsbindec.h:41
pappso::TimsXicExtractorInterface
Definition: timsxicextractorinterface.h:42
pappso::TimsBinDec::getTimsFrameSPtrByOffset
TimsFrameSPtr getTimsFrameSPtrByOffset(std::size_t timsId, std::size_t timsOffset) const
Definition: timsbindec.cpp:143
pappso::MassSpectrum
Class to represent a mass spectrum.
Definition: massspectrum.h:71
pappso::TimsData::m_cacheSize
std::size_t m_cacheSize
Definition: timsdata.h:192
pappso::TimsData::getClosestIdByMz
std::vector< std::size_t > getClosestIdByMz(std::vector< std::vector< double >> ids, double mz_value)
Definition: timsdata.cpp:642
pappso::TimsFrameBaseCstSPtr
std::shared_ptr< const TimsFrameBase > TimsFrameBaseCstSPtr
Definition: timsframebase.h:40
pappso::QualifiedMassSpectrum::setParameterValue
void setParameterValue(QualifiedMassSpectrumParameter parameter, const QVariant &value)
Definition: qualifiedmassspectrum.cpp:461
pappso::MapTrace
Definition: maptrace.h:33
pappso::TimsXicStructure::scanNumBegin
std::size_t scanNumBegin
Definition: timsdata.h:53
pappso::QualifiedMassSpectrum::setMassSpectrumSPtr
void setMassSpectrumSPtr(MassSpectrumSPtr massSpectrum)
Set the MassSpectrumSPtr.
Definition: qualifiedmassspectrum.cpp:125
pappso::TimsData::getTimsFrameBaseCstSPtr
TimsFrameBaseCstSPtr getTimsFrameBaseCstSPtr(std::size_t timsId) const
get a Tims frame base (no binary data file access) with his database ID
Definition: timsdata.cpp:303
pappso::TimsDirectXicExtractor
Definition: timsdirectxicextractor.h:38
pappso::QualifiedMassSpectrum::setMsLevel
void setMsLevel(uint ms_level)
Set the mass spectrum level.
Definition: qualifiedmassspectrum.cpp:179
pappso::TimsData::getTimsFrameCstSPtrCached
TimsFrameCstSPtr getTimsFrameCstSPtrCached(std::size_t timsId)
get a Tims frame with his database ID but look in the cache first
Definition: timsdata.cpp:1189
pappso::QualifiedMassSpectrum::size
std::size_t size() const
Definition: qualifiedmassspectrum.cpp:492
pappso::QualifiedMassSpectrum::setRtInSeconds
void setRtInSeconds(pappso_double rt)
Set the retention time in seconds.
Definition: qualifiedmassspectrum.cpp:195
pappso::TimsData::m_mutex
QMutex m_mutex
Definition: timsdata.h:198
pappso::MzRange
Definition: mzrange.h:46
pappso::Trace
A simple container of DataPoint instances.
Definition: trace.h:132
pappso::QualifiedMassSpectrum
Class representing a fully specified mass spectrum.
Definition: qualifiedmassspectrum.h:85
pappso::TimsData::getScanCoordinateFromRawIndex
std::pair< std::size_t, std::size_t > getScanCoordinateFromRawIndex(std::size_t spectrum_index) const
Definition: timsdata.cpp:200
pappso::TimsData::m_timsDataDirectory
QDir m_timsDataDirectory
Definition: timsdata.h:187
pappso::TimsData::getMassSpectrumCstSPtr
pappso::MassSpectrumCstSPtr getMassSpectrumCstSPtr(std::size_t timsId, std::size_t scanNum)
get a mass spectrum given the tims frame database id and scan number within tims frame
Definition: timsdata.cpp:516
pappso::QualifiedMassSpectrum::setPrecursorNativeId
void setPrecursorNativeId(const QString &native_id)
Set the scan native id of the precursor ion.
Definition: qualifiedmassspectrum.cpp:417
pappso::QualifiedMassSpectrum::appendPrecursorIonData
void appendPrecursorIonData(const PrecursorIonData &precursor_ion_data)
Definition: qualifiedmassspectrum.cpp:430
pappso::QualifiedMassSpectrum::setMassSpectrumId
void setMassSpectrumId(const MassSpectrumId &iD)
Set the MassSpectrumId.
Definition: qualifiedmassspectrum.cpp:149
pappso::TimsFrameBaseSPtr
std::shared_ptr< TimsFrameBase > TimsFrameBaseSPtr
Definition: timsframebase.h:38
pappso::TimsData::m_totalNumberOfScans
std::size_t m_totalNumberOfScans
Definition: timsdata.h:190
pappso::TimsData::mpa_timsBinDec
TimsBinDec * mpa_timsBinDec
Definition: timsdata.h:188
pappso::TimsXicExtractorInterface::setXicExtractMethod
void setXicExtractMethod(XicExtractMethod method)
set the XIC extraction method
Definition: timsxicextractorinterface.cpp:43
pappso::TimsData::m_timsFrameCache
std::deque< TimsFrameCstSPtr > m_timsFrameCache
Definition: timsdata.h:193
pappso::ExceptionNotFound
Definition: exceptionnotfound.h:32
pappso::TimsXicStructure
structure needed to extract XIC from Tims data
Definition: timsdata.h:48
pappso::MassSpectrumId
Definition: massspectrumid.h:38
pappso::QualifiedMassSpectrum::setEmptyMassSpectrum
void setEmptyMassSpectrum(bool is_empty_mass_spectrum)
Definition: qualifiedmassspectrum.cpp:164
pappso::TimsXicStructure::mzRange
MzRange mzRange
Definition: timsdata.h:52
pappso::QualifiedMassSpectrum::setPrecursorSpectrumIndex
void setPrecursorSpectrumIndex(std::size_t precursor_scan_num)
Set the scan number of the precursor ion.
Definition: qualifiedmassspectrum.cpp:400
pappso::TimsData::getTimsFrameCstSPtr
TimsFrameCstSPtr getTimsFrameCstSPtr(std::size_t timsId) const
get a Tims frame with his database ID
Definition: timsdata.cpp:426
pappso::TimsXicStructure::scanNumEnd
std::size_t scanNumEnd
Definition: timsdata.h:54
pappso::MassSpectrumId::setSpectrumIndex
void setSpectrumIndex(std::size_t index)
Definition: massspectrumid.cpp:103
pappso::QualifiedMassSpectrum::setDtInMilliSeconds
void setDtInMilliSeconds(pappso_double rt)
Set the drift time in milliseconds.
Definition: qualifiedmassspectrum.cpp:219
pappso::MassSpectrumId::setNativeId
void setNativeId(const QString &native_id)
Definition: massspectrumid.cpp:89
pappso::TimsData::getRawIndexFromCoordinate
std::size_t getRawIndexFromCoordinate(std::size_t frame_id, std::size_t scan_num) const
Definition: timsdata.cpp:245
pappso::TimsXicExtractorInterface::extractTimsXicList
virtual void extractTimsXicList(std::vector< TimsXicStructure > &timsXicList, double rtRange) const =0
extract XICs for given coordinates XICs are extracted given their coordinates : retention time target...
pappso::TimsFrameCstSPtr
std::shared_ptr< const TimsFrame > TimsFrameCstSPtr
Definition: timsframe.h:42
pappso::TimsData::openDatabaseConnection
QSqlDatabase openDatabaseConnection() const
Definition: timsdata.cpp:155
pappso::TimsXicStructure::rtTarget
pappso::pappso_double rtTarget
Definition: timsdata.h:55
pappso::PrecursorIonData
Definition: qualifiedmassspectrum.h:62
pappso::TracePlusCombiner
Definition: tracepluscombiner.h:27
pappso::PappsoException
Definition: pappsoexception.h:42
pappso::FilterTriangle::setTriangleSlope
double setTriangleSlope(double intensity, double mz)
Definition: filtertriangle.cpp:47