pappsomspp
Library for mass spectrometry
timsdata.cpp
Go to the documentation of this file.
1 /**
2  * \file pappsomspp/vendors/tims/timsdata.cpp
3  * \date 27/08/2019
4  * \author Olivier Langella
5  * \brief main Tims data handler
6  */
7 
8 /*******************************************************************************
9  * Copyright (c) 2019 Olivier Langella <Olivier.Langella@u-psud.fr>.
10  *
11  * This file is part of the PAPPSOms++ library.
12  *
13  * PAPPSOms++ is free software: you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation, either version 3 of the License, or
16  * (at your option) any later version.
17  *
18  * PAPPSOms++ is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with PAPPSOms++. If not, see <http://www.gnu.org/licenses/>.
25  *
26  ******************************************************************************/
27 
28 #include "timsdata.h"
29 #include "../../exception/exceptionnotfound.h"
30 #include "../../processing/combiners/tracepluscombiner.h"
31 #include "../../processing/filters/filtertriangle.h"
32 #include "../../processing/filters/filterpseudocentroid.h"
33 #include "../../processing/filters/filterpass.h"
34 #include <QDebug>
35 #include <solvers.h>
36 #include <QSqlError>
37 #include <QSqlQuery>
38 #include <QMutexLocker>
39 #include <QThread>
40 #include <set>
41 
42 using namespace pappso;
43 
44 TimsData::TimsData(QDir timsDataDirectory)
45  : m_timsDataDirectory(timsDataDirectory)
46 {
47 
48  qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__;
49  if(!m_timsDataDirectory.exists())
50  {
51  throw PappsoException(
52  QObject::tr("ERROR TIMS data directory %1 not found")
53  .arg(m_timsDataDirectory.absolutePath()));
54  }
55 
56  if(!QFileInfo(m_timsDataDirectory.absoluteFilePath("analysis.tdf")).exists())
57  {
58 
59  throw PappsoException(
60  QObject::tr("ERROR TIMS data directory, %1 sqlite file not found")
61  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf")));
62  }
63 
64  // Open the database
65  QSqlDatabase qdb = openDatabaseConnection();
66 
67 
68  QSqlQuery q(qdb);
69  if(!q.exec("select Key, Value from GlobalMetadata where "
70  "Key='TimsCompressionType';"))
71  {
72 
73  qDebug();
74  throw PappsoException(
75  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
76  "command %2:\n%3\n%4\n%5")
77  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
78  .arg(q.lastQuery())
79  .arg(q.lastError().databaseText())
80  .arg(q.lastError().driverText())
81  .arg(q.lastError().nativeErrorCode()));
82  }
83 
84 
85  int compression_type = 0;
86  if(q.next())
87  {
88  compression_type = q.value(1).toInt();
89  }
90  qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__
91  << " compression_type=" << compression_type;
93  QFileInfo(m_timsDataDirectory.absoluteFilePath("analysis.tdf_bin")),
94  compression_type);
95 
96 
97  // get number of precursors
98  if(!q.exec("SELECT COUNT( DISTINCT Id) FROM Precursors;"))
99  {
100  qDebug();
101  throw PappsoException(
102  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
103  "command %2:\n%3\n%4\n%5")
104  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
105  .arg(q.lastQuery())
106  .arg(qdb.lastError().databaseText())
107  .arg(qdb.lastError().driverText())
108  .arg(qdb.lastError().nativeErrorCode()));
109  }
110  if(q.next())
111  {
112  m_totalNumberOfPrecursors = q.value(0).toLongLong();
113  }
114 
115 
116  // get number of scans
117  if(!q.exec("SELECT SUM(NumScans) FROM Frames"))
118  {
119  qDebug();
120  throw PappsoException(
121  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
122  "command %2:\n%3\n%4\n%5")
123  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
124  .arg(q.lastQuery())
125  .arg(qdb.lastError().databaseText())
126  .arg(qdb.lastError().driverText())
127  .arg(qdb.lastError().nativeErrorCode()));
128  }
129  if(q.next())
130  {
131  m_totalNumberOfScans = q.value(0).toLongLong();
132  }
133 
134  /*
135  std::shared_ptr<FilterTriangle> ms2filter =
136  std::make_shared<FilterTriangle>();
137  ms2filter.get()->setTriangleSlope(50, 0.02);
138  mcsp_ms2Filter = ms2filter;
139 */
140 
141 
142  std::shared_ptr<pappso::FilterPseudoCentroid> ms2filter =
143  std::make_shared<pappso::FilterPseudoCentroid>(20000, 0.05, 0.5, 0.1);
144  mcsp_ms2Filter = ms2filter;
145 
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 }
153 
154 QSqlDatabase
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 }
184 
186 {
187  qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__;
188 }
189 
191 {
192  // m_qdb.close();
193  if(mpa_timsBinDec != nullptr)
194  {
195  delete mpa_timsBinDec;
196  }
197 }
198 
199 std::pair<std::size_t, std::size_t>
200 TimsData::getScanCoordinateFromRawIndex(std::size_t raw_index) const
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 }
242 
243 
244 std::size_t
245 TimsData::getRawIndexFromCoordinate(std::size_t frame_id,
246  std::size_t scan_num) const
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 }
288 
289 /** @brief get a mass spectrum given its spectrum index
290  * @param raw_index a number begining at 0, corresponding to a Tims Scan in
291  * the order they lies in the binary data file
292  */
294 TimsData::getMassSpectrumCstSPtrByRawIndex(std::size_t raw_index)
295 {
296 
297  auto coordinate = getScanCoordinateFromRawIndex(raw_index);
298  return getMassSpectrumCstSPtr(coordinate.first, coordinate.second);
299 }
300 
301 
303 TimsData::getTimsFrameBaseCstSPtr(std::size_t timsId) const
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 }
390 
391 std::vector<std::size_t>
392 TimsData::getTimsMS1FrameIdRange(double rt_begin, double rt_end) const
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 }
424 
426 TimsData::getTimsFrameCstSPtr(std::size_t timsId) const
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 }
513 
514 
516 TimsData::getMassSpectrumCstSPtr(std::size_t timsId, std::size_t scanNum)
517 {
519 
520  return frame->getMassSpectrumCstSPtr(scanNum);
521 }
522 
523 std::size_t
525 {
526  return m_totalNumberOfScans;
527 }
528 
529 
530 std::size_t
532 {
534 }
535 
536 unsigned int
537 TimsData::getMsLevelBySpectrumIndex(std::size_t spectrum_index)
538 {
539  auto coordinate = getScanCoordinateFromRawIndex(spectrum_index);
540  auto tims_frame = getTimsFrameCstSPtrCached(coordinate.first);
541  return tims_frame.get()->getMsLevel();
542 }
543 
544 
546 TimsData::getQualifiedMassSpectrumByRawIndex(std::size_t spectrum_index,
547  bool want_binary_data)
548 {
549  auto coordinate = getScanCoordinateFromRawIndex(spectrum_index);
550  TimsFrameBaseCstSPtr tims_frame;
551  if(want_binary_data)
552  {
553  tims_frame = getTimsFrameCstSPtrCached(coordinate.first);
554  }
555  else
556  {
557  tims_frame = getTimsFrameBaseCstSPtrCached(coordinate.first);
558  }
559  QualifiedMassSpectrum mass_spectrum;
560  MassSpectrumId spectrum_id;
561 
562  spectrum_id.setSpectrumIndex(spectrum_index);
563  spectrum_id.setNativeId(QString("frame=%1 scan=%2 index=%3")
564  .arg(coordinate.first)
565  .arg(coordinate.second)
566  .arg(spectrum_index));
567 
568  mass_spectrum.setMassSpectrumId(spectrum_id);
569 
570  mass_spectrum.setMsLevel(tims_frame.get()->getMsLevel());
571  mass_spectrum.setRtInSeconds(tims_frame.get()->getTime());
572 
573  mass_spectrum.setPrecursorCharge(0);
574  mass_spectrum.setPrecursorMz(0);
575  mass_spectrum.setPrecursorIntensity(0);
576 
577  mass_spectrum.setDtInMilliSeconds(
578  tims_frame.get()->getDriftTime(coordinate.second));
579  // 1/K0
580  mass_spectrum.setParameterValue(
582  tims_frame.get()->getOneOverK0Transformation(coordinate.second));
583 
584  mass_spectrum.setEmptyMassSpectrum(true);
585  if(want_binary_data)
586  {
587  mass_spectrum.setMassSpectrumSPtr(
588  tims_frame.get()->getMassSpectrumSPtr(coordinate.second));
589  if(mass_spectrum.size() > 0)
590  {
591  mass_spectrum.setEmptyMassSpectrum(false);
592  }
593  }
594  else
595  {
596  // if(tims_frame.get()->getNbrPeaks(coordinate.second) > 0)
597  //{
598  mass_spectrum.setEmptyMassSpectrum(false);
599  // }
600  }
601  if(tims_frame.get()->getMsLevel() > 1)
602  {
603 
604  QSqlDatabase qdb = openDatabaseConnection();
605  QSqlQuery q = qdb.exec(
606  QString(
607  "SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
608  "PasefFrameMsMsInfo INNER JOIN Precursors ON "
609  "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
610  "PasefFrameMsMsInfo.Frame=%1 and (PasefFrameMsMsInfo.ScanNumBegin "
611  "<= %2 and PasefFrameMsMsInfo.ScanNumEnd >= %2);")
612  .arg(coordinate.first)
613  .arg(coordinate.second));
614  if(q.lastError().isValid())
615  {
616  throw PappsoException(
617  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
618  "command %2:\n%3\n%4\n%5")
619  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
620  .arg(q.lastQuery())
621  .arg(qdb.lastError().databaseText())
622  .arg(qdb.lastError().driverText())
623  .arg(qdb.lastError().nativeErrorCode()));
624  }
625  if(q.next())
626  {
627  mass_spectrum.setPrecursorCharge(q.value(11).toInt());
628  mass_spectrum.setPrecursorMz(q.value(10).toDouble());
629  mass_spectrum.setPrecursorIntensity(q.value(13).toDouble());
630  // mass_spectrum.setPrecursorSpectrumIndex();
631 
632 
633  MassSpectrumId spectrum_id;
634  std::size_t prec_spectrum_index = getRawIndexFromCoordinate(
635  q.value(14).toDouble(), coordinate.second);
636 
637  mass_spectrum.setPrecursorSpectrumIndex(prec_spectrum_index);
638  mass_spectrum.setPrecursorNativeId(
639  QString("frame=%1 scan=%2 index=%3")
640  .arg(q.value(14).toDouble())
641  .arg(coordinate.second)
642  .arg(prec_spectrum_index));
643 
644  mass_spectrum.setParameterValue(
645  QualifiedMassSpectrumParameter::IsolationMz, q.value(3).toDouble());
646  mass_spectrum.setParameterValue(
648  q.value(4).toDouble());
649 
650  mass_spectrum.setParameterValue(
652  q.value(5).toFloat());
653  mass_spectrum.setParameterValue(
655  q.value(6).toInt());
656  }
657  }
658 
659  return mass_spectrum;
660 }
661 
662 
665  std::size_t precursor_index,
666  bool want_binary_data)
667 {
668  QualifiedMassSpectrum mass_spectrum;
669 
670  try
671  {
672  QSqlDatabase qdb = openDatabaseConnection();
673  mass_spectrum.setMsLevel(1);
674  mass_spectrum.setPrecursorCharge(0);
675  mass_spectrum.setPrecursorMz(0);
676  mass_spectrum.setPrecursorIntensity(0);
677  mass_spectrum.setPrecursorSpectrumIndex(0);
678  mass_spectrum.setEmptyMassSpectrum(true);
679  QSqlQuery q =
680  qdb.exec(QString("SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
681  "PasefFrameMsMsInfo INNER JOIN Precursors ON "
682  "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
683  "Precursors.Id=%1;")
684  .arg(precursor_index));
685  if(q.lastError().isValid())
686  {
687 
688  throw PappsoException(
689  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
690  "command %2:\n%3\n%4\n%5")
691  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
692  .arg(q.lastQuery())
693  .arg(qdb.lastError().databaseText())
694  .arg(qdb.lastError().driverText())
695  .arg(qdb.lastError().nativeErrorCode()));
696  }
697  if(q.size() == 0)
698  {
699 
700  throw ExceptionNotFound(
701  QObject::tr(
702  "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
703  "id=%1 not found")
704  .arg(precursor_index));
705  }
706  else
707  {
708  TracePlusCombiner combiner;
709  MapTrace combiner_result;
710 
711 
712  bool first = true;
713  std::size_t scan_mobility_start = 0;
714  std::size_t scan_mobility_end = 0;
715  std::set<std::size_t> tims_frame_list;
716  while(q.next())
717  {
718  // get MS1 frame
719  tims_frame_list.insert(q.value(14).toLongLong());
720  if(first)
721  {
722 
723 
724  MassSpectrumId spectrum_id;
725 
726  spectrum_id.setSpectrumIndex(precursor_index);
727  spectrum_id.setNativeId(
728  QString("frame=%1 begin=%2 end=%3 precursor=%4 idxms2=%5")
729  .arg(q.value(0).toLongLong())
730  .arg(q.value(1).toLongLong())
731  .arg(q.value(2).toLongLong())
732  .arg(precursor_index)
733  .arg(ms2_index));
734 
735 
736  mass_spectrum.setMassSpectrumId(spectrum_id);
737 
738 
739  scan_mobility_start = q.value(1).toLongLong();
740  scan_mobility_end = q.value(2).toLongLong();
741 
742  first = false;
743  }
744  }
745 
746  first = true;
747  for(std::size_t tims_id : tims_frame_list)
748  {
749  TimsFrameBaseCstSPtr tims_frame =
750  getTimsFrameCstSPtrCached(tims_id);
751  if(first)
752  {
753  mass_spectrum.setRtInSeconds(tims_frame.get()->getTime());
754 
755  mass_spectrum.setParameterValue(
757  tims_frame.get()->getOneOverK0Transformation(
758  scan_mobility_start));
759 
760  mass_spectrum.setParameterValue(
762  tims_frame.get()->getOneOverK0Transformation(
763  scan_mobility_end));
764 
765  first = false;
766  }
767 
768 
769  if(want_binary_data)
770  {
771  combiner.combine(combiner_result,
772  tims_frame.get()->cumulateScanToTrace(
773  scan_mobility_start, scan_mobility_end));
774  }
775  else
776  {
777  break;
778  }
779  }
780 
781 
782  if(first == true)
783  {
784  throw ExceptionNotFound(
785  QObject::tr(
786  "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
787  "id=%1 not found")
788  .arg(precursor_index));
789  }
790 
791 
792  if(want_binary_data)
793  {
794 
795  pappso::Trace trace(combiner_result);
796  qDebug();
797 
798  if(trace.size() > 0)
799  {
800  if(mcsp_ms1Filter != nullptr)
801  {
802  mcsp_ms1Filter->filter(trace);
803  }
804 
805  qDebug();
806  mass_spectrum.setMassSpectrumSPtr(
807  MassSpectrum(trace).makeMassSpectrumSPtr());
808  mass_spectrum.setEmptyMassSpectrum(false);
809  }
810  else
811  {
812  mass_spectrum.setMassSpectrumSPtr(nullptr);
813  mass_spectrum.setEmptyMassSpectrum(true);
814  }
815  }
816  }
817  }
818  catch(std::exception &error)
819  {
820  qDebug() << __FILE__ << "@" << __LINE__ << __FUNCTION__ << "()"
821  << QString("Failure %1 ").arg(error.what());
822  }
823  return mass_spectrum;
824 }
825 
826 
827 void
829  QualifiedMassSpectrum &mass_spectrum,
830  std::size_t ms2_index,
831  std::size_t precursor_index,
832  bool want_binary_data)
833 {
834  qDebug();
835  try
836  {
837  QSqlDatabase qdb = openDatabaseConnection();
838  MassSpectrumId spectrum_id;
839 
840  spectrum_id.setSpectrumIndex(precursor_index);
841  spectrum_id.setNativeId(
842  QString("precursor=%1 idxms2=%2").arg(precursor_index).arg(ms2_index));
843 
844  mass_spectrum.setMassSpectrumId(spectrum_id);
845 
846  mass_spectrum.setMsLevel(2);
847  mass_spectrum.setPrecursorCharge(0);
848  mass_spectrum.setPrecursorMz(0);
849  mass_spectrum.setPrecursorIntensity(0);
850  mass_spectrum.setPrecursorSpectrumIndex(ms2_index - 1);
851 
852  mass_spectrum.setEmptyMassSpectrum(true);
853 
854  qdb = openDatabaseConnection();
855  // m_mutex.lock();
856 // if(m_query != nullptr)
857 // {
858 // *m_query =
859 // qdb.exec(QString("SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
860 // "PasefFrameMsMsInfo INNER JOIN Precursors ON "
861 // "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
862 // "Precursors.Id=%1;")
863 // .arg(precursor_index));
864 // }
865  QSqlQuery q =
866  qdb.exec(QString("SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
867  "PasefFrameMsMsInfo INNER JOIN Precursors ON "
868  "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
869  "Precursors.Id=%1;")
870  .arg(precursor_index));
871  if(q.lastError().isValid())
872  {
873  qDebug();
874  throw PappsoException(
875  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
876  "command %2:\n%3\n%4\n%5")
877  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
878  .arg(q.lastQuery())
879  .arg(qdb.lastError().databaseText())
880  .arg(qdb.lastError().driverText())
881  .arg(qdb.lastError().nativeErrorCode()));
882  }
883  qDebug();
884  // m_mutex.unlock();
885  if(q.size() == 0)
886  {
887 
888  throw ExceptionNotFound(
889  QObject::tr(
890  "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
891  "id=%1 not found")
892  .arg(precursor_index));
893  }
894  else
895  {
896  // qDebug() << " q.size()="<< q.size();
897  qDebug();
898  bool first = true;
899  std::size_t scan_mobility_start = 0;
900  std::size_t scan_mobility_end = 0;
901  std::vector<std::size_t> tims_frame_list;
902 
903  while(q.next())
904  {
905  tims_frame_list.push_back(q.value(0).toLongLong());
906  if(first)
907  {
908  mass_spectrum.setPrecursorCharge(q.value(11).toInt());
909  mass_spectrum.setPrecursorMz(q.value(10).toDouble());
910  mass_spectrum.setPrecursorIntensity(q.value(13).toDouble());
911 
912  mass_spectrum.setPrecursorNativeId(
913  QString("frame=%1 begin=%2 end=%3 precursor=%4 idxms2=%5")
914  .arg(q.value(14).toLongLong())
915  .arg(q.value(1).toLongLong())
916  .arg(q.value(2).toLongLong())
917  .arg(precursor_index)
918  .arg(ms2_index - 1));
919  // mass_spectrum.setPrecursorSpectrumIndex();
920 
921  scan_mobility_start = q.value(1).toLongLong();
922  scan_mobility_end = q.value(2).toLongLong();
923 
924  mass_spectrum.setParameterValue(
926  q.value(3).toDouble());
927  mass_spectrum.setParameterValue(
929  q.value(4).toDouble());
930 
931  mass_spectrum.setParameterValue(
933  q.value(5).toFloat());
934  mass_spectrum.setParameterValue(
936  q.value(6).toInt());
937 
938  first = false;
939  }
940  }
941  // QMutexLocker locker(&m_mutex_spectrum);
942  qDebug();
943  pappso::TimsFrameCstSPtr tims_frame;
944  TracePlusCombiner combiner;
945  MapTrace combiner_result;
946  first = true;
947  for(std::size_t tims_id : tims_frame_list)
948  {
949 
950  tims_frame = getTimsFrameCstSPtrCached(tims_id);
951  if(first)
952  {
953  mass_spectrum.setRtInSeconds(tims_frame.get()->getTime());
954 
955  mass_spectrum.setParameterValue(
957  tims_frame.get()->getOneOverK0Transformation(
958  scan_mobility_start));
959 
960  mass_spectrum.setParameterValue(
962  tims_frame.get()->getOneOverK0Transformation(
963  scan_mobility_end));
964 
965  first = false;
966  }
967 
968 
969  if(want_binary_data)
970  {
971  qDebug();
972  combiner.combine(combiner_result,
973  tims_frame.get()->cumulateScanToTrace(
974  scan_mobility_start, scan_mobility_end));
975  qDebug();
976  }
977  }
978  qDebug() << " precursor_index=" << precursor_index
979  << " num_rows=" << tims_frame_list.size()
980  << " sql=" << q.lastQuery() << " "
981  << (std::size_t)QThread::currentThreadId();
982  if(first == true)
983  {
984  throw ExceptionNotFound(
985  QObject::tr(
986  "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
987  "id=%1 not found")
988  .arg(precursor_index));
989  }
990  if(want_binary_data)
991  {
992  qDebug();
993  // peak_pick.filter(trace);
994 
995  pappso::Trace trace(combiner_result);
996  qDebug() << "AAAAAAA";
997 
998  if(trace.size() > 0)
999  {
1000  qDebug() << trace.size() << " "
1001  << (std::size_t)QThread::currentThreadId();
1002 
1003  if(mcsp_ms2Filter != nullptr)
1004  {
1005  // FilterTriangle filter;
1006  // filter.setTriangleSlope(50, 0.02);
1007  // filter.filter(trace);
1008  //trace.filter(pappso::FilterHighPass(10));
1009  mcsp_ms2Filter->filter(trace);
1010  }
1011 
1012  // FilterScaleFactorY filter_scale((double)1 /
1013  // (double)tims_frame_list.size());
1014  // filter_scale.filter(trace);
1015  qDebug();
1016  mass_spectrum.setMassSpectrumSPtr(
1017  MassSpectrum(trace).makeMassSpectrumSPtr());
1018  mass_spectrum.setEmptyMassSpectrum(false);
1019  }
1020  else
1021  {
1022  mass_spectrum.setMassSpectrumSPtr(nullptr);
1023  mass_spectrum.setEmptyMassSpectrum(true);
1024  }
1025 
1026  qDebug();
1027  }
1028  qDebug();
1029  }
1030  }
1031  catch(std::exception &error)
1032  {
1033  qDebug() << __FILE__ << "@" << __LINE__ << __FUNCTION__ << "()"
1034  << QString("Failure %1 ").arg(error.what());
1035  }
1036  qDebug();
1037 }
1038 
1039 
1041 TimsData::getTimsFrameBaseCstSPtrCached(std::size_t timsId)
1042 {
1043  QMutexLocker locker(&m_mutex);
1044  for(auto &tims_frame : m_timsFrameBaseCache)
1045  {
1046  if(tims_frame.get()->getId() == timsId)
1047  {
1048  m_timsFrameBaseCache.push_back(tims_frame);
1049  return tims_frame;
1050  }
1051  }
1052 
1053  m_timsFrameBaseCache.push_back(getTimsFrameBaseCstSPtr(timsId));
1054  if(m_timsFrameBaseCache.size() > m_cacheSize)
1055  m_timsFrameBaseCache.pop_front();
1056  return m_timsFrameBaseCache.back();
1057 }
1058 
1060 TimsData::getTimsFrameCstSPtrCached(std::size_t timsId)
1061 {
1062  QMutexLocker locker(&m_mutex);
1063  for(auto &tims_frame : m_timsFrameCache)
1064  {
1065  if(tims_frame.get()->getId() == timsId)
1066  {
1067  m_timsFrameCache.push_back(tims_frame);
1068  return tims_frame;
1069  }
1070  }
1071 
1072  m_timsFrameCache.push_back(getTimsFrameCstSPtr(timsId));
1073  if(m_timsFrameCache.size() > m_cacheSize)
1074  m_timsFrameCache.pop_front();
1075  return m_timsFrameCache.back();
1076 }
1077 
1078 void
1080 {
1081  mcsp_ms2Filter = filter;
1082 }
1083 void
1085 {
1086  mcsp_ms1Filter = filter;
1087 }
1088 
1089 
1090 
1091 
pappso::TimsData::mcsp_ms2Filter
pappso::FilterInterfaceCstSPtr mcsp_ms2Filter
Definition: timsdata.h:181
pappso::TimsData::m_totalNumberOfPrecursors
std::size_t m_totalNumberOfPrecursors
Definition: timsdata.h:176
pappso::QualifiedMassSpectrum::setPrecursorIntensity
void setPrecursorIntensity(pappso_double intensity)
Set the intensity of the precursor ion.
Definition: qualifiedmassspectrum.cpp:289
pappso::MassSpectrumCstSPtr
std::shared_ptr< const MassSpectrum > MassSpectrumCstSPtr
Definition: massspectrum.h:74
pappso::TimsData::setMs2FilterCstSPtr
void setMs2FilterCstSPtr(pappso::FilterInterfaceCstSPtr &filter)
Definition: timsdata.cpp:1078
pappso::TimsData::getMassSpectrumCstSPtrByRawIndex
pappso::MassSpectrumCstSPtr getMassSpectrumCstSPtrByRawIndex(std::size_t raw_index)
get a mass spectrum given its spectrum index
Definition: timsdata.cpp:293
pappso::QualifiedMassSpectrumParameter::CollisionEnergy
Bruker's Tims tof collision energy.
pappso::TimsData::getQualifiedMs1MassSpectrumByPrecursorId
QualifiedMassSpectrum getQualifiedMs1MassSpectrumByPrecursorId(std::size_t ms2_index, std::size_t precursor_index, bool want_binary_data)
Definition: timsdata.cpp:663
pappso::TimsData::mcsp_ms1Filter
pappso::FilterInterfaceCstSPtr mcsp_ms1Filter
Definition: timsdata.h:182
pappso::TimsData::m_timsFrameBaseCache
std::deque< TimsFrameBaseCstSPtr > m_timsFrameBaseCache
Definition: timsdata.h:179
pappso::TimsData::getTimsFrameBaseCstSPtrCached
TimsFrameBaseCstSPtr getTimsFrameBaseCstSPtrCached(std::size_t timsId)
Definition: timsdata.cpp:1040
pappso::TimsFrameSPtr
std::shared_ptr< TimsFrame > TimsFrameSPtr
Definition: timsframe.h:55
pappso::TimsData::getTimsMS1FrameIdRange
std::vector< std::size_t > getTimsMS1FrameIdRange(double rt_begin, double rt_end) const
Definition: timsdata.cpp:391
pappso::TracePlusCombiner::combine
virtual MapTrace & combine(MapTrace &map_trace, const Trace &trace) const override
Definition: tracepluscombiner.cpp:52
pappso::QualifiedMassSpectrumParameter::OneOverK0end
1/k0 of last acquisition for composite pasef MS/MS spectrum
pappso::TimsFrameBase
Definition: timsframebase.h:62
pappso::TimsBinDec
Definition: timsbindec.h:56
pappso::QualifiedMassSpectrum::setPrecursorMz
void setPrecursorMz(pappso_double precursor_mz)
Set the precursor m/z ratio.
Definition: qualifiedmassspectrum.cpp:186
pappso::TimsBinDec::getTimsFrameSPtrByOffset
TimsFrameSPtr getTimsFrameSPtrByOffset(std::size_t timsId, std::size_t timsOffset) const
Definition: timsbindec.cpp:142
pappso
Definition: aa.cpp:38
pappso::MassSpectrum
Class to represent a mass spectrum.
Definition: massspectrum.h:89
pappso::FilterInterfaceCstSPtr
std::shared_ptr< const FilterInterface > FilterInterfaceCstSPtr
Definition: filterinterface.h:62
pappso::TimsData::m_cacheSize
std::size_t m_cacheSize
Definition: timsdata.h:177
pappso::QualifiedMassSpectrumParameter::IsolationMz
isolation window
timsdata.h
main Tims data handler
pappso::TimsData::TimsData
TimsData(QDir timsDataDirectory)
build using the tims data directory
Definition: timsdata.cpp:43
pappso::QualifiedMassSpectrumParameter::OneOverK0
1/kO of a simple scan
pappso::TimsData::setMs1FilterCstSPtr
void setMs1FilterCstSPtr(pappso::FilterInterfaceCstSPtr &filter)
Definition: timsdata.cpp:1083
pappso::TimsFrameBaseCstSPtr
std::shared_ptr< const TimsFrameBase > TimsFrameBaseCstSPtr
Definition: timsframebase.h:56
pappso::QualifiedMassSpectrum::setParameterValue
void setParameterValue(QualifiedMassSpectrumParameter parameter, const QVariant &value)
Definition: qualifiedmassspectrum.cpp:358
pappso::MapTrace
Definition: maptrace.h:32
pappso::TimsData::getMsLevelBySpectrumIndex
unsigned int getMsLevelBySpectrumIndex(std::size_t spectrum_index)
Definition: timsdata.cpp:536
pappso::QualifiedMassSpectrum::setMassSpectrumSPtr
void setMassSpectrumSPtr(MassSpectrumSPtr massSpectrum)
Set the MassSpectrumSPtr.
Definition: qualifiedmassspectrum.cpp:132
pappso::TimsData
Definition: timsdata.h:62
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:302
pappso::QualifiedMassSpectrum::setMsLevel
void setMsLevel(uint ms_level)
Set the mass spectrum level.
Definition: qualifiedmassspectrum.cpp:202
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:1059
pappso::QualifiedMassSpectrum::size
std::size_t size() const
Definition: qualifiedmassspectrum.cpp:304
pappso::QualifiedMassSpectrum::setRtInSeconds
void setRtInSeconds(pappso_double rt)
Set the retention time in seconds.
Definition: qualifiedmassspectrum.cpp:218
pappso::TimsData::m_mutex
QMutex m_mutex
Definition: timsdata.h:183
pappso::Trace
A simple container of DataPoint instances.
Definition: trace.h:125
pappso::QualifiedMassSpectrum
Class representing a fully specified mass spectrum.
Definition: qualifiedmassspectrum.h:83
pappso::TimsData::getScanCoordinateFromRawIndex
std::pair< std::size_t, std::size_t > getScanCoordinateFromRawIndex(std::size_t spectrum_index) const
Definition: timsdata.cpp:199
pappso::TimsData::m_timsDataDirectory
QDir m_timsDataDirectory
Definition: timsdata.h:172
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:515
pappso::TimsData::getQualifiedMassSpectrumByRawIndex
QualifiedMassSpectrum getQualifiedMassSpectrumByRawIndex(std::size_t spectrum_index, bool want_binary_data)
Definition: timsdata.cpp:545
pappso::QualifiedMassSpectrum::setPrecursorNativeId
void setPrecursorNativeId(const QString &native_id)
Set the scan native id of the precursor ion.
Definition: qualifiedmassspectrum.cpp:276
pappso::TimsData::~TimsData
~TimsData()
Definition: timsdata.cpp:189
pappso::QualifiedMassSpectrum::setMassSpectrumId
void setMassSpectrumId(const MassSpectrumId &iD)
Set the MassSpectrumId.
Definition: qualifiedmassspectrum.cpp:116
pappso::TimsFrameBaseSPtr
std::shared_ptr< TimsFrameBase > TimsFrameBaseSPtr
Definition: timsframebase.h:54
pappso::TimsData::getTotalNumberOfPrecursors
std::size_t getTotalNumberOfPrecursors() const
get the number of precursors analyzes by PASEF
Definition: timsdata.cpp:530
pappso::TimsData::m_totalNumberOfScans
std::size_t m_totalNumberOfScans
Definition: timsdata.h:175
pappso::TimsData::mpa_timsBinDec
TimsBinDec * mpa_timsBinDec
Definition: timsdata.h:173
pappso::TimsData::m_timsFrameCache
std::deque< TimsFrameCstSPtr > m_timsFrameCache
Definition: timsdata.h:178
pappso::ExceptionNotFound
Definition: exceptionnotfound.h:50
pappso::QualifiedMassSpectrumParameter::OneOverK0begin
pappso::QualifiedMassSpectrum::setPrecursorCharge
void setPrecursorCharge(uint precursor_charge)
Set the precursor charge.
Definition: qualifiedmassspectrum.cpp:170
pappso::TimsData::getTotalNumberOfScans
std::size_t getTotalNumberOfScans() const
get the total number of scans
Definition: timsdata.cpp:523
pappso::MassSpectrumId
Definition: massspectrumid.h:56
pappso::QualifiedMassSpectrum::setEmptyMassSpectrum
void setEmptyMassSpectrum(bool is_empty_mass_spectrum)
Definition: qualifiedmassspectrum.cpp:155
pappso::QualifiedMassSpectrum::setPrecursorSpectrumIndex
void setPrecursorSpectrumIndex(std::size_t precursor_scan_num)
Set the scan number of the precursor ion.
Definition: qualifiedmassspectrum.cpp:261
pappso::TimsData::getQualifiedMs2MassSpectrumByPrecursorId
void getQualifiedMs2MassSpectrumByPrecursorId(QualifiedMassSpectrum &mass_spectrum, std::size_t ms2_index, std::size_t precursor_index, bool want_binary_data)
Definition: timsdata.cpp:827
pappso::TimsData::getTimsFrameCstSPtr
TimsFrameCstSPtr getTimsFrameCstSPtr(std::size_t timsId) const
get a Tims frame with his database ID
Definition: timsdata.cpp:425
pappso::QualifiedMassSpectrumParameter::IsolationWidth
isolation window width
pappso::MassSpectrumId::setSpectrumIndex
void setSpectrumIndex(std::size_t index)
Definition: massspectrumid.cpp:123
pappso::QualifiedMassSpectrum::setDtInMilliSeconds
void setDtInMilliSeconds(pappso_double rt)
Set the drift time in milliseconds.
Definition: qualifiedmassspectrum.cpp:242
pappso::MassSpectrumId::setNativeId
void setNativeId(const QString &native_id)
Definition: massspectrumid.cpp:109
pappso::QualifiedMassSpectrumParameter::BrukerPrecursorIndex
Bruker's Tims tof precursor index.
pappso::TimsData::getRawIndexFromCoordinate
std::size_t getRawIndexFromCoordinate(std::size_t frame_id, std::size_t scan_num) const
Definition: timsdata.cpp:244
pappso::TimsFrameCstSPtr
std::shared_ptr< const TimsFrame > TimsFrameCstSPtr
Definition: timsframe.h:57
pappso::TimsData::openDatabaseConnection
QSqlDatabase openDatabaseConnection() const
Definition: timsdata.cpp:154
pappso::TracePlusCombiner
Definition: tracepluscombiner.h:26
pappso::PappsoException
Definition: pappsoexception.h:60
pappso::FilterTriangle::setTriangleSlope
double setTriangleSlope(double intensity, double mz)
Definition: filtertriangle.cpp:47