libpappsomspp
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"
35 #include <QDebug>
36 #include <solvers.h>
37 #include <QSqlError>
38 #include <QSqlQuery>
39 #include <QMutexLocker>
40 #include <QThread>
41 #include <set>
42 
43 using namespace pappso;
44 
45 TimsData::TimsData(QDir timsDataDirectory)
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 }
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 
185 TimsData::TimsData([[maybe_unused]] const pappso::TimsData &other)
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
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  */
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 
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.*
860  // FROM "
861  // "PasefFrameMsMsInfo INNER JOIN Precursors ON "
862  // "PasefFrameMsMsInfo.Precursor=Precursors.Id
863  // where " "Precursors.Id=%1;")
864  // .arg(precursor_index));
865  // }
866  QSqlQuery q =
867  qdb.exec(QString("SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
868  "PasefFrameMsMsInfo INNER JOIN Precursors ON "
869  "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
870  "Precursors.Id=%1;")
871  .arg(precursor_index));
872  if(q.lastError().isValid())
873  {
874  qDebug();
875  throw PappsoException(
876  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
877  "command %2:\n%3\n%4\n%5")
878  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
879  .arg(q.lastQuery())
880  .arg(qdb.lastError().databaseText())
881  .arg(qdb.lastError().driverText())
882  .arg(qdb.lastError().nativeErrorCode()));
883  }
884  qDebug();
885  // m_mutex.unlock();
886  if(q.size() == 0)
887  {
888 
889  throw ExceptionNotFound(
890  QObject::tr(
891  "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
892  "id=%1 not found")
893  .arg(precursor_index));
894  }
895  else
896  {
897  // qDebug() << " q.size()="<< q.size();
898  qDebug();
899  bool first = true;
900  std::size_t scan_mobility_start = 0;
901  std::size_t scan_mobility_end = 0;
902  std::vector<std::size_t> tims_frame_list;
903 
904  while(q.next())
905  {
906  tims_frame_list.push_back(q.value(0).toLongLong());
907  if(first)
908  {
909  mass_spectrum.setPrecursorCharge(q.value(11).toInt());
910  mass_spectrum.setPrecursorMz(q.value(10).toDouble());
911  mass_spectrum.setPrecursorIntensity(q.value(13).toDouble());
912 
913  mass_spectrum.setPrecursorNativeId(
914  QString("frame=%1 begin=%2 end=%3 precursor=%4 idxms2=%5")
915  .arg(q.value(14).toLongLong())
916  .arg(q.value(1).toLongLong())
917  .arg(q.value(2).toLongLong())
918  .arg(precursor_index)
919  .arg(ms2_index - 1));
920  // mass_spectrum.setPrecursorSpectrumIndex();
921 
922  scan_mobility_start = q.value(1).toLongLong();
923  scan_mobility_end = q.value(2).toLongLong();
924 
925  mass_spectrum.setParameterValue(
927  q.value(3).toDouble());
928  mass_spectrum.setParameterValue(
930  q.value(4).toDouble());
931 
932  mass_spectrum.setParameterValue(
934  q.value(5).toFloat());
935  mass_spectrum.setParameterValue(
937  q.value(6).toInt());
938 
939  first = false;
940  }
941  }
942  // QMutexLocker locker(&m_mutex_spectrum);
943  qDebug();
944  pappso::TimsFrameCstSPtr tims_frame;
945  TracePlusCombiner combiner;
946  MapTrace combiner_result;
947  first = true;
948  for(std::size_t tims_id : tims_frame_list)
949  {
950 
951  tims_frame = getTimsFrameCstSPtrCached(tims_id);
952  if(first)
953  {
954  mass_spectrum.setRtInSeconds(tims_frame.get()->getTime());
955 
956  mass_spectrum.setParameterValue(
958  tims_frame.get()->getOneOverK0Transformation(
959  scan_mobility_start));
960 
961  mass_spectrum.setParameterValue(
963  tims_frame.get()->getOneOverK0Transformation(
964  scan_mobility_end));
965 
966  first = false;
967  }
968 
969 
970  if(want_binary_data)
971  {
972  qDebug();
973  combiner.combine(combiner_result,
974  tims_frame.get()->cumulateScanToTrace(
975  scan_mobility_start, scan_mobility_end));
976  qDebug();
977  }
978  }
979  qDebug() << " precursor_index=" << precursor_index
980  << " num_rows=" << tims_frame_list.size()
981  << " sql=" << q.lastQuery() << " "
982  << (std::size_t)QThread::currentThreadId();
983  if(first == true)
984  {
985  throw ExceptionNotFound(
986  QObject::tr(
987  "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
988  "id=%1 not found")
989  .arg(precursor_index));
990  }
991  if(want_binary_data)
992  {
993  qDebug();
994  // peak_pick.filter(trace);
995 
996  pappso::Trace trace(combiner_result);
997  qDebug() << "AAAAAAA";
998 
999  if(trace.size() > 0)
1000  {
1001  qDebug() << trace.size() << " "
1002  << (std::size_t)QThread::currentThreadId();
1003 
1004  if(mcsp_ms2Filter != nullptr)
1005  {
1006  // FilterTriangle filter;
1007  // filter.setTriangleSlope(50, 0.02);
1008  // filter.filter(trace);
1009  // trace.filter(pappso::FilterHighPass(10));
1010  mcsp_ms2Filter->filter(trace);
1011  }
1012 
1013  // FilterScaleFactorY filter_scale((double)1 /
1014  // (double)tims_frame_list.size());
1015  // filter_scale.filter(trace);
1016  qDebug();
1017  mass_spectrum.setMassSpectrumSPtr(
1018  MassSpectrum(trace).makeMassSpectrumSPtr());
1019  mass_spectrum.setEmptyMassSpectrum(false);
1020  }
1021  else
1022  {
1023  mass_spectrum.setMassSpectrumSPtr(nullptr);
1024  mass_spectrum.setEmptyMassSpectrum(true);
1025  }
1026 
1027  qDebug();
1028  }
1029  qDebug();
1030  }
1031  }
1032  catch(std::exception &error)
1033  {
1034  qDebug() << __FILE__ << "@" << __LINE__ << __FUNCTION__ << "()"
1035  << QString("Failure %1 ").arg(error.what());
1036  }
1037  qDebug();
1038 }
1039 
1040 
1043 {
1044  QMutexLocker locker(&m_mutex);
1045  for(auto &tims_frame : m_timsFrameBaseCache)
1046  {
1047  if(tims_frame.get()->getId() == timsId)
1048  {
1049  m_timsFrameBaseCache.push_back(tims_frame);
1050  return tims_frame;
1051  }
1052  }
1053 
1054  m_timsFrameBaseCache.push_back(getTimsFrameBaseCstSPtr(timsId));
1055  if(m_timsFrameBaseCache.size() > m_cacheSize)
1056  m_timsFrameBaseCache.pop_front();
1057  return m_timsFrameBaseCache.back();
1058 }
1059 
1062 {
1063  QMutexLocker locker(&m_mutex);
1064  for(auto &tims_frame : m_timsFrameCache)
1065  {
1066  if(tims_frame.get()->getId() == timsId)
1067  {
1068  m_timsFrameCache.push_back(tims_frame);
1069  return tims_frame;
1070  }
1071  }
1072 
1073  m_timsFrameCache.push_back(getTimsFrameCstSPtr(timsId));
1074  if(m_timsFrameCache.size() > m_cacheSize)
1075  m_timsFrameCache.pop_front();
1076  return m_timsFrameCache.back();
1077 }
1078 
1079 void
1081 {
1082  mcsp_ms2Filter = filter;
1083 }
1084 void
1086 {
1087  mcsp_ms1Filter = filter;
1088 }
1089 
1090 std::vector<TimsXicStructure>
1092  const std::vector<std::size_t> &precursor_id_list,
1093  PrecisionPtr precision_ptr,
1094  XicExtractMethod xicExtractMethod,
1095  double rtRange) const
1096 {
1097 
1098  qDebug();
1099  std::vector<TimsXicStructure> xic_list;
1100 
1101  try
1102  {
1103  QSqlDatabase qdb = openDatabaseConnection();
1104 
1105  for(auto precursor_id : precursor_id_list)
1106  {
1107  QSqlQuery q = qdb.exec(
1108  QString("SELECT Frames.Time, "
1109  "PasefFrameMsMsInfo.Frame,PasefFrameMsMsInfo.ScanNumBegin,"
1110  "PasefFrameMsMsInfo.ScanNumEnd, Precursors.MonoisotopicMz, "
1111  "Precursors.Charge FROM "
1112  "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1113  "PasefFrameMsMsInfo.Precursor=Precursors.Id INNER JOIN "
1114  "Frames ON PasefFrameMsMsInfo.Frame=Frames.Id where "
1115  "Precursors.Id=%1;")
1116  .arg(precursor_id));
1117  if(q.lastError().isValid())
1118  {
1119  qDebug();
1120  throw PappsoException(
1121  QObject::tr(
1122  "ERROR in TIMS sqlite database file %1, executing SQL "
1123  "command %2:\n%3\n%4\n%5")
1124  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
1125  .arg(q.lastQuery())
1126  .arg(qdb.lastError().databaseText())
1127  .arg(qdb.lastError().driverText())
1128  .arg(qdb.lastError().nativeErrorCode()));
1129  }
1130 
1131  while(q.next())
1132  {
1133  // Frame, ScanNumBegin, ScanNumEnd, IsolationMz, ColliqionEnergy,
1134  // Precursor
1135  // Id, LargestPeakMz, AverageMz, MonoisotopicMz, Charge,
1136  // ScanNumber, Intensity, Parent
1137  TimsXicStructure xic_structure;
1138 
1139  xic_structure.precursorId = precursor_id;
1140  xic_structure.mzRange =
1141  MzRange(q.value(4).toDouble(), precision_ptr);
1142  xic_structure.scanNumBegin = q.value(2).toUInt();
1143  xic_structure.scanNumEnd = q.value(3).toUInt();
1144  xic_structure.rtTarget = q.value(0).toDouble();
1145  // xic_structure.charge = q.value(5).toUInt();
1146 
1147  xic_list.push_back(xic_structure);
1148  }
1149  }
1150  qDebug();
1151 
1152  TimsXicExtractorInterface *extractor_p = new TimsDirectXicExtractor(this);
1153  extractor_p->setXicExtractMethod(xicExtractMethod);
1154  extractor_p->extractTimsXicList(xic_list, rtRange);
1155  }
1156  catch(std::exception &error)
1157  {
1158  qDebug() << QString("Failure %1 ").arg(error.what());
1159  }
1160 
1161  qDebug();
1162  return xic_list;
1163 }
pappso::TimsData::mcsp_ms2Filter
pappso::FilterInterfaceCstSPtr mcsp_ms2Filter
Definition: timsdata.h:200
pappso::TimsData::m_totalNumberOfPrecursors
std::size_t m_totalNumberOfPrecursors
Definition: timsdata.h:195
pappso::QualifiedMassSpectrum::setPrecursorIntensity
void setPrecursorIntensity(pappso_double intensity)
Set the intensity of the precursor ion.
Definition: qualifiedmassspectrum.cpp:311
pappso::MassSpectrumCstSPtr
std::shared_ptr< const MassSpectrum > MassSpectrumCstSPtr
Definition: massspectrum.h:76
pappso::TimsData::setMs2FilterCstSPtr
void setMs2FilterCstSPtr(pappso::FilterInterfaceCstSPtr &filter)
Definition: timsdata.cpp:1080
pappso::TimsXicStructure::precursorId
std::size_t precursorId
Definition: timsdata.h:86
pappso::TimsData::getMassSpectrumCstSPtrByRawIndex
pappso::MassSpectrumCstSPtr getMassSpectrumCstSPtrByRawIndex(std::size_t raw_index)
get a mass spectrum given its spectrum index
Definition: timsdata.cpp:294
pappso::QualifiedMassSpectrumParameter::CollisionEnergy
@ 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:664
pappso::TimsData::mcsp_ms1Filter
pappso::FilterInterfaceCstSPtr mcsp_ms1Filter
Definition: timsdata.h:201
pappso::TimsData::m_timsFrameBaseCache
std::deque< TimsFrameBaseCstSPtr > m_timsFrameBaseCache
Definition: timsdata.h:198
timsdirectxicextractor.h
minimum functions to extract XICs from Tims Data
pappso::TimsData::getTimsFrameBaseCstSPtrCached
TimsFrameBaseCstSPtr getTimsFrameBaseCstSPtrCached(std::size_t timsId)
Definition: timsdata.cpp:1042
pappso::TimsFrameSPtr
std::shared_ptr< TimsFrame > TimsFrameSPtr
Definition: timsframe.h:58
pappso::TimsData::getTimsMS1FrameIdRange
std::vector< std::size_t > getTimsMS1FrameIdRange(double rt_begin, double rt_end) const
Definition: timsdata.cpp:392
pappso::TracePlusCombiner::combine
virtual MapTrace & combine(MapTrace &map_trace, const Trace &trace) const override
Definition: tracepluscombiner.cpp:52
pappso::QualifiedMassSpectrumParameter::OneOverK0end
@ OneOverK0end
1/k0 of last acquisition for composite pasef MS/MS spectrum
pappso::TimsFrameBase
Definition: timsframebase.h:64
pappso::TimsBinDec
Definition: timsbindec.h:58
pappso::TimsXicExtractorInterface
Definition: timsxicextractorinterface.h:59
pappso::QualifiedMassSpectrum::setPrecursorMz
void setPrecursorMz(pappso_double precursor_mz)
Set the precursor m/z ratio.
Definition: qualifiedmassspectrum.cpp:208
pappso::TimsBinDec::getTimsFrameSPtrByOffset
TimsFrameSPtr getTimsFrameSPtrByOffset(std::size_t timsId, std::size_t timsOffset) const
Definition: timsbindec.cpp:143
pappso
Definition: aa.cpp:38
pappso::MassSpectrum
Class to represent a mass spectrum.
Definition: massspectrum.h:91
pappso::FilterInterfaceCstSPtr
std::shared_ptr< const FilterInterface > FilterInterfaceCstSPtr
Definition: filterinterface.h:64
pappso::TimsData::m_cacheSize
std::size_t m_cacheSize
Definition: timsdata.h:196
pappso::QualifiedMassSpectrumParameter::IsolationMz
@ IsolationMz
isolation window
timsdata.h
main Tims data handler
pappso::TimsData::TimsData
TimsData(QDir timsDataDirectory)
build using the tims data directory
Definition: timsdata.cpp:45
pappso::QualifiedMassSpectrumParameter::OneOverK0
@ OneOverK0
1/kO of a simple scan
pappso::TimsData::setMs1FilterCstSPtr
void setMs1FilterCstSPtr(pappso::FilterInterfaceCstSPtr &filter)
Definition: timsdata.cpp:1085
pappso::TimsFrameBaseCstSPtr
std::shared_ptr< const TimsFrameBase > TimsFrameBaseCstSPtr
Definition: timsframebase.h:58
pappso::TimsData::extractXicListByPrecursorIds
std::vector< TimsXicStructure > extractXicListByPrecursorIds(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
Definition: timsdata.cpp:1091
pappso::QualifiedMassSpectrum::setParameterValue
void setParameterValue(QualifiedMassSpectrumParameter parameter, const QVariant &value)
Definition: qualifiedmassspectrum.cpp:380
pappso::MapTrace
Definition: maptrace.h:32
pappso::TimsXicStructure::scanNumBegin
std::size_t scanNumBegin
Definition: timsdata.h:89
pappso::TimsData::getMsLevelBySpectrumIndex
unsigned int getMsLevelBySpectrumIndex(std::size_t spectrum_index)
Definition: timsdata.cpp:537
pappso::QualifiedMassSpectrum::setMassSpectrumSPtr
void setMassSpectrumSPtr(MassSpectrumSPtr massSpectrum)
Set the MassSpectrumSPtr.
Definition: qualifiedmassspectrum.cpp:154
pappso::TimsData
Definition: timsdata.h:82
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:55
pappso::QualifiedMassSpectrum::setMsLevel
void setMsLevel(uint ms_level)
Set the mass spectrum level.
Definition: qualifiedmassspectrum.cpp:224
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:1061
pappso::QualifiedMassSpectrum::size
std::size_t size() const
Definition: qualifiedmassspectrum.cpp:326
pappso::QualifiedMassSpectrum::setRtInSeconds
void setRtInSeconds(pappso_double rt)
Set the retention time in seconds.
Definition: qualifiedmassspectrum.cpp:240
pappso::TimsData::m_mutex
QMutex m_mutex
Definition: timsdata.h:202
pappso::MzRange
Definition: mzrange.h:66
pappso::Trace
A simple container of DataPoint instances.
Definition: trace.h:126
pappso::XicExtractMethod
XicExtractMethod
Definition: types.h:203
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:191
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::TimsData::getQualifiedMassSpectrumByRawIndex
QualifiedMassSpectrum getQualifiedMassSpectrumByRawIndex(std::size_t spectrum_index, bool want_binary_data)
Definition: timsdata.cpp:546
pappso::QualifiedMassSpectrum::setPrecursorNativeId
void setPrecursorNativeId(const QString &native_id)
Set the scan native id of the precursor ion.
Definition: qualifiedmassspectrum.cpp:298
pappso::TimsData::~TimsData
~TimsData()
Definition: timsdata.cpp:190
pappso::QualifiedMassSpectrum::setMassSpectrumId
void setMassSpectrumId(const MassSpectrumId &iD)
Set the MassSpectrumId.
Definition: qualifiedmassspectrum.cpp:138
pappso::TimsFrameBaseSPtr
std::shared_ptr< TimsFrameBase > TimsFrameBaseSPtr
Definition: timsframebase.h:56
pappso::TimsData::getTotalNumberOfPrecursors
std::size_t getTotalNumberOfPrecursors() const
get the number of precursors analyzes by PASEF
Definition: timsdata.cpp:531
pappso::TimsData::m_totalNumberOfScans
std::size_t m_totalNumberOfScans
Definition: timsdata.h:194
pappso::TimsData::mpa_timsBinDec
TimsBinDec * mpa_timsBinDec
Definition: timsdata.h:192
pappso::PrecisionPtr
const typedef PrecisionBase * PrecisionPtr
Definition: precision.h:143
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:197
pappso::ExceptionNotFound
Definition: exceptionnotfound.h:52
pappso::TimsXicStructure
structure needed to extract XIC from Tims data
Definition: timsdata.h:65
pappso::QualifiedMassSpectrumParameter::OneOverK0begin
@ OneOverK0begin
pappso::QualifiedMassSpectrum::setPrecursorCharge
void setPrecursorCharge(uint precursor_charge)
Set the precursor charge.
Definition: qualifiedmassspectrum.cpp:192
pappso::TimsData::getTotalNumberOfScans
std::size_t getTotalNumberOfScans() const
get the total number of scans
Definition: timsdata.cpp:524
pappso::MassSpectrumId
Definition: massspectrumid.h:58
pappso::QualifiedMassSpectrum::setEmptyMassSpectrum
void setEmptyMassSpectrum(bool is_empty_mass_spectrum)
Definition: qualifiedmassspectrum.cpp:177
pappso::TimsXicStructure::mzRange
MzRange mzRange
Definition: timsdata.h:88
pappso::QualifiedMassSpectrum::setPrecursorSpectrumIndex
void setPrecursorSpectrumIndex(std::size_t precursor_scan_num)
Set the scan number of the precursor ion.
Definition: qualifiedmassspectrum.cpp:283
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:828
pappso::TimsData::getTimsFrameCstSPtr
TimsFrameCstSPtr getTimsFrameCstSPtr(std::size_t timsId) const
get a Tims frame with his database ID
Definition: timsdata.cpp:426
pappso::QualifiedMassSpectrumParameter::IsolationWidth
@ IsolationWidth
isolation window width
pappso::TimsXicStructure::scanNumEnd
std::size_t scanNumEnd
Definition: timsdata.h:90
pappso::MassSpectrumId::setSpectrumIndex
void setSpectrumIndex(std::size_t index)
Definition: massspectrumid.cpp:124
pappso::QualifiedMassSpectrum::setDtInMilliSeconds
void setDtInMilliSeconds(pappso_double rt)
Set the drift time in milliseconds.
Definition: qualifiedmassspectrum.cpp:264
pappso::MassSpectrumId::setNativeId
void setNativeId(const QString &native_id)
Definition: massspectrumid.cpp:110
pappso::QualifiedMassSpectrumParameter::BrukerPrecursorIndex
@ 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: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:60
pappso::TimsData::openDatabaseConnection
QSqlDatabase openDatabaseConnection() const
Definition: timsdata.cpp:155
pappso::TimsXicStructure::rtTarget
pappso::pappso_double rtTarget
Definition: timsdata.h:91
pappso::TracePlusCombiner
Definition: tracepluscombiner.h:26
pappso::PappsoException
Definition: pappsoexception.h:62
pappso::FilterTriangle::setTriangleSlope
double setTriangleSlope(double intensity, double mz)
Definition: filtertriangle.cpp:47