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();
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() << " 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>(35000, 5, 0.5, 0.1);
144  mcsp_ms2Filter = ms2filter;
145 
146 
147  std::shared_ptr<FilterTriangle> ms1filter =
148  std::make_shared<FilterTriangle>();
149  ms1filter.get()->setTriangleSlope(50, 0.01);
150  mcsp_ms1Filter = ms1filter;
151 }
152 
153 QSqlDatabase
155 {
156  QString database_connection_name = QString("%1_%2")
157  .arg(m_timsDataDirectory.absolutePath())
158  .arg((quintptr)QThread::currentThread());
159  // Open the database
160  QSqlDatabase qdb = QSqlDatabase::database(database_connection_name);
161  if(!qdb.isValid())
162  {
163  qDebug() << database_connection_name;
164  qdb = QSqlDatabase::addDatabase("QSQLITE", database_connection_name);
165  qdb.setDatabaseName(m_timsDataDirectory.absoluteFilePath("analysis.tdf"));
166  }
167 
168 
169  if(!qdb.open())
170  {
171  qDebug();
172  throw PappsoException(
173  QObject::tr("ERROR opening TIMS sqlite database file %1, database name "
174  "%2 :\n%3\n%4\n%5")
175  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
176  .arg(database_connection_name)
177  .arg(qdb.lastError().databaseText())
178  .arg(qdb.lastError().driverText())
179  .arg(qdb.lastError().nativeErrorCode()));
180  }
181  return qdb;
182 }
183 
184 TimsData::TimsData([[maybe_unused]] const pappso::TimsData &other)
185 {
186  qDebug();
187 }
188 
190 {
191  // m_qdb.close();
192  if(mpa_timsBinDec != nullptr)
193  {
194  delete mpa_timsBinDec;
195  }
196 }
197 
198 void
200 {
201  m_builtinMs2Centroid = centroid;
202 }
203 
204 bool
206 {
207  return m_builtinMs2Centroid;
208 }
209 
210 std::pair<std::size_t, std::size_t>
211 TimsData::getScanCoordinateFromRawIndex(std::size_t raw_index) const
212 {
213 
214  QSqlDatabase qdb = openDatabaseConnection();
215 
216  QSqlQuery q =
217  qdb.exec(QString("SELECT Id, NumScans FROM "
218  "Frames ORDER BY Id"));
219  if(q.lastError().isValid())
220  {
221 
222  throw PappsoException(
223  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
224  "command %2:\n%3\n%4\n%5")
225  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
226  .arg(q.lastQuery())
227  .arg(qdb.lastError().databaseText())
228  .arg(qdb.lastError().driverText())
229  .arg(qdb.lastError().nativeErrorCode()));
230  }
231  pappso::TimsFrameSPtr tims_frame;
232  bool index_found = false;
233  std::size_t timsId;
234  std::size_t numberScans;
235  std::size_t offset = 0;
236  while(q.next() && (!index_found))
237  {
238  timsId = q.value(0).toUInt();
239  numberScans = q.value(1).toUInt();
240 
241  if(raw_index < (offset + numberScans))
242  {
243  return std::pair<std::size_t, std::size_t>(timsId,
244  raw_index - offset);
245  }
246 
247  offset += numberScans;
248  }
249 
250  throw ExceptionNotFound(
251  QObject::tr("ERROR raw index %1 not found").arg(raw_index));
252 }
253 
254 
255 std::size_t
257  std::size_t scan_num) const
258 {
259 
260 
261  QSqlDatabase qdb = openDatabaseConnection();
262  QSqlQuery q =
263  qdb.exec(QString("SELECT Id, NumScans FROM "
264  "Frames ORDER BY Id"));
265  if(q.lastError().isValid())
266  {
267 
268  throw PappsoException(
269  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
270  "command %2:\n%3\n%4\n%5")
271  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
272  .arg(q.lastQuery())
273  .arg(qdb.lastError().databaseText())
274  .arg(qdb.lastError().driverText())
275  .arg(qdb.lastError().nativeErrorCode()));
276  }
277  bool index_found = false;
278  std::size_t timsId;
279  std::size_t numberScans;
280  std::size_t offset = 0;
281  while(q.next() && (!index_found))
282  {
283  timsId = q.value(0).toUInt();
284  numberScans = q.value(1).toUInt();
285 
286  if(timsId == frame_id)
287  {
288  return offset + scan_num;
289  }
290 
291  offset += numberScans;
292  }
293 
294  throw ExceptionNotFound(
295  QObject::tr("ERROR raw index with frame=%1 scan=%2 not found")
296  .arg(frame_id)
297  .arg(scan_num));
298 }
299 
300 /** @brief get a mass spectrum given its spectrum index
301  * @param raw_index a number begining at 0, corresponding to a Tims Scan in
302  * the order they lies in the binary data file
303  */
306 {
307 
308  auto coordinate = getScanCoordinateFromRawIndex(raw_index);
309  return getMassSpectrumCstSPtr(coordinate.first, coordinate.second);
310 }
311 
312 
314 TimsData::getTimsFrameBaseCstSPtr(std::size_t timsId) const
315 {
316 
317  qDebug() << " timsId=" << timsId;
318 
319  QSqlDatabase qdb = openDatabaseConnection();
320  QSqlQuery q = qdb.exec(
321  QString("SELECT Frames.TimsId, Frames.AccumulationTime, "
322  " MzCalibration.DigitizerTimebase, MzCalibration.DigitizerDelay, "
323  "MzCalibration.C0, MzCalibration.C1, MzCalibration.C2, "
324  "MzCalibration.C3, MzCalibration.T1, MzCalibration.T2, "
325  "MzCalibration.dC1, MzCalibration.dC2, Frames.T1, Frames.T2, "
326  "Frames.Time, Frames.MsMsType, TimsCalibration.ModelType, "
327  "TimsCalibration.C0, TimsCalibration.C1, TimsCalibration.C2, "
328  "TimsCalibration.C3, TimsCalibration.C4, TimsCalibration.C5, "
329  "TimsCalibration.C6, TimsCalibration.C7, TimsCalibration.C8, "
330  "TimsCalibration.C9 FROM "
331  "Frames INNER JOIN MzCalibration ON "
332  "Frames.MzCalibration=MzCalibration.Id INNER JOIN TimsCalibration "
333  "ON Frames.TimsCalibration=TimsCalibration.Id where "
334  "Frames.Id=%1;")
335  .arg(timsId));
336  if(q.lastError().isValid())
337  {
338 
339  throw PappsoException(
340  QObject::tr("ERROR in TIMS sqlite database file %1, database name %2, "
341  "executing SQL "
342  "command %3:\n%4\n%5\n%6")
343  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
344  .arg(qdb.databaseName())
345  .arg(q.lastQuery())
346  .arg(qdb.lastError().databaseText())
347  .arg(qdb.lastError().driverText())
348  .arg(qdb.lastError().nativeErrorCode()));
349  }
350  pappso::TimsFrameBaseSPtr tims_frame;
351  if(q.next())
352  {
353 
354 
355  double T1_ref = q.value(8).toDouble();
356  double T2_ref = q.value(9).toDouble();
357  double factor1 = q.value(10).toDouble();
358  double factor2 = q.value(11).toDouble();
359 
360  double T1_frame = q.value(12).toDouble();
361  double T2_frame = q.value(13).toDouble();
362 
363 
364  double temperature_correction =
365  factor1 * (T1_ref - T1_frame) + factor2 * (T2_ref - T2_frame);
366  temperature_correction = (double)1.0 + (temperature_correction / 1.0e6);
367 
368  tims_frame = std::make_shared<TimsFrameBase>(
369  TimsFrameBase(timsId, q.value(0).toUInt()));
370 
371  tims_frame.get()->setMzCalibration(temperature_correction,
372  q.value(2).toDouble(),
373  q.value(3).toDouble(),
374  q.value(4).toDouble(),
375  q.value(5).toDouble(),
376  q.value(6).toDouble(),
377  q.value(7).toDouble());
378 
379  tims_frame.get()->setAccumulationTime(q.value(1).toDouble());
380 
381  tims_frame.get()->setTime(q.value(14).toDouble());
382  tims_frame.get()->setMsMsType(q.value(15).toUInt());
383 
384  tims_frame.get()->setTimsCalibration(q.value(16).toInt(),
385  q.value(17).toDouble(),
386  q.value(18).toDouble(),
387  q.value(19).toDouble(),
388  q.value(20).toDouble(),
389  q.value(21).toDouble(),
390  q.value(22).toDouble(),
391  q.value(23).toDouble(),
392  q.value(24).toDouble(),
393  q.value(25).toDouble(),
394  q.value(26).toDouble());
395  return tims_frame;
396  }
397 
398  throw ExceptionNotFound(QObject::tr("ERROR timsId %1 not found").arg(timsId));
399  // return TimsFrameCstSPtr;
400 }
401 
402 std::vector<std::size_t>
403 TimsData::getTimsMS1FrameIdRange(double rt_begin, double rt_end) const
404 {
405 
406  qDebug() << " rt_begin=" << rt_begin << " rt_end=" << rt_end;
407  std::vector<std::size_t> tims_frameid_list;
408  QSqlDatabase qdb = openDatabaseConnection();
409  QSqlQuery q = qdb.exec(QString("SELECT Frames.TimsId FROM Frames WHERE "
410  "Frames.MsMsType=0 AND (Frames.Time=>%1) AND "
411  "(Frames.Time<=%2) SORT BY Frames.Time;")
412  .arg(rt_begin)
413  .arg(rt_end));
414  if(q.lastError().isValid())
415  {
416 
417  throw PappsoException(
418  QObject::tr("ERROR in TIMS sqlite database file %1, database name %2, "
419  "executing SQL "
420  "command %3:\n%4\n%5\n%6")
421  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
422  .arg(qdb.databaseName())
423  .arg(q.lastQuery())
424  .arg(qdb.lastError().databaseText())
425  .arg(qdb.lastError().driverText())
426  .arg(qdb.lastError().nativeErrorCode()));
427  }
428  while(q.next())
429  {
430 
431  tims_frameid_list.push_back(q.value(0).toUInt());
432  }
433  return tims_frameid_list;
434 }
435 
437 TimsData::getTimsFrameCstSPtr(std::size_t timsId) const
438 {
439 
440  qDebug() << " timsId=" << timsId;
441 
442  QSqlDatabase qdb = openDatabaseConnection();
443  QSqlQuery q = qdb.exec(
444  QString("SELECT Frames.TimsId, Frames.AccumulationTime, "
445  " MzCalibration.DigitizerTimebase, MzCalibration.DigitizerDelay, "
446  "MzCalibration.C0, MzCalibration.C1, MzCalibration.C2, "
447  "MzCalibration.C3, MzCalibration.T1, MzCalibration.T2, "
448  "MzCalibration.dC1, MzCalibration.dC2, Frames.T1, Frames.T2, "
449  "Frames.Time, Frames.MsMsType, TimsCalibration.ModelType, "
450  "TimsCalibration.C0, TimsCalibration.C1, TimsCalibration.C2, "
451  "TimsCalibration.C3, TimsCalibration.C4, TimsCalibration.C5, "
452  "TimsCalibration.C6, TimsCalibration.C7, TimsCalibration.C8, "
453  "TimsCalibration.C9 FROM "
454  "Frames INNER JOIN MzCalibration ON "
455  "Frames.MzCalibration=MzCalibration.Id INNER JOIN TimsCalibration "
456  "ON Frames.TimsCalibration=TimsCalibration.Id where "
457  "Frames.Id=%1;")
458  .arg(timsId));
459  if(q.lastError().isValid())
460  {
461 
462  throw PappsoException(
463  QObject::tr("ERROR in TIMS sqlite database file %1, database name %2, "
464  "executing SQL "
465  "command %3:\n%4\n%5\n%6")
466  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
467  .arg(qdb.databaseName())
468  .arg(q.lastQuery())
469  .arg(qdb.lastError().databaseText())
470  .arg(qdb.lastError().driverText())
471  .arg(qdb.lastError().nativeErrorCode()));
472  }
473  pappso::TimsFrameSPtr tims_frame;
474  if(q.next())
475  {
476 
477 
478  double T1_ref = q.value(8).toDouble();
479  double T2_ref = q.value(9).toDouble();
480  double factor1 = q.value(10).toDouble();
481  double factor2 = q.value(11).toDouble();
482 
483  double T1_frame = q.value(12).toDouble();
484  double T2_frame = q.value(13).toDouble();
485 
486 
487  double temperature_correction =
488  factor1 * (T1_ref - T1_frame) + factor2 * (T2_ref - T2_frame);
489  temperature_correction = (double)1.0 + (temperature_correction / 1.0e6);
490 
491  tims_frame =
492  mpa_timsBinDec->getTimsFrameSPtrByOffset(timsId, q.value(0).toUInt());
493 
494  tims_frame.get()->setMzCalibration(temperature_correction,
495  q.value(2).toDouble(),
496  q.value(3).toDouble(),
497  q.value(4).toDouble(),
498  q.value(5).toDouble(),
499  q.value(6).toDouble(),
500  q.value(7).toDouble());
501 
502  tims_frame.get()->setAccumulationTime(q.value(1).toDouble());
503 
504  tims_frame.get()->setTime(q.value(14).toDouble());
505  tims_frame.get()->setMsMsType(q.value(15).toUInt());
506 
507  tims_frame.get()->setTimsCalibration(q.value(16).toInt(),
508  q.value(17).toDouble(),
509  q.value(18).toDouble(),
510  q.value(19).toDouble(),
511  q.value(20).toDouble(),
512  q.value(21).toDouble(),
513  q.value(22).toDouble(),
514  q.value(23).toDouble(),
515  q.value(24).toDouble(),
516  q.value(25).toDouble(),
517  q.value(26).toDouble());
518  return tims_frame;
519  }
520 
521  throw ExceptionNotFound(QObject::tr("ERROR timsId %1 not found").arg(timsId));
522  // return TimsFrameCstSPtr;
523 }
524 
525 
527 TimsData::getMassSpectrumCstSPtr(std::size_t timsId, std::size_t scanNum)
528 {
530 
531  return frame->getMassSpectrumCstSPtr(scanNum);
532 }
533 
534 std::size_t
536 {
537  return m_totalNumberOfScans;
538 }
539 
540 
541 std::size_t
543 {
545 }
546 
547 std::vector<std::size_t>
549  double mz_val,
550  double rt_sec,
551  double k0)
552 {
553  std::vector<std::size_t> precursor_ids;
554  std::vector<std::vector<double>> ids;
555 
556  QSqlDatabase qdb = openDatabaseConnection();
557  QSqlQuery q = qdb.exec(
558  QString(
559  "SELECT Frames.time, Precursors.MonoisotopicMz, Precursors.Charge, "
560  "Precursors.Id, Frames.Id, PasefFrameMsMsInfo.ScanNumBegin, "
561  "PasefFrameMsMsInfo.scanNumEnd "
562  "FROM Frames "
563  "INNER JOIN PasefFrameMsMsInfo ON Frames.Id = PasefFrameMsMsInfo.Frame "
564  "INNER JOIN Precursors ON PasefFrameMsMsInfo.Precursor = Precursors.Id "
565  "WHERE Precursors.Charge == %1 "
566  "AND Precursors.MonoisotopicMz > %2 -0.01 "
567  "AND Precursors.MonoisotopicMz < %2 +0.01 "
568  "AND Frames.Time >= %3 "
569  "AND Frames.Time < %3 +1; ")
570  .arg(charge)
571  .arg(mz_val)
572  .arg(rt_sec));
573  if(q.lastError().isValid())
574  {
575 
576  throw PappsoException(
577  QObject::tr("ERROR in TIMS sqlite database file %1, database name %2, "
578  "executing SQL "
579  "command %3:\n%4\n%5\n%6")
580  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
581  .arg(qdb.databaseName())
582  .arg(q.lastQuery())
583  .arg(qdb.lastError().databaseText())
584  .arg(qdb.lastError().driverText())
585  .arg(qdb.lastError().nativeErrorCode()));
586  }
587  while(q.next())
588  {
589  qInfo() << q.value(0).toDouble() << q.value(1).toDouble()
590  << q.value(2).toDouble() << q.value(3).toDouble();
591 
592  std::vector<double> sql_values;
593  sql_values.push_back(q.value(4).toDouble()); // frame id
594  sql_values.push_back(q.value(3).toDouble()); // precursor id
595  sql_values.push_back(q.value(5).toDouble()); // scan num begin
596  sql_values.push_back(q.value(6).toDouble()); // scan num end
597  sql_values.push_back(q.value(1).toDouble()); // mz_value
598 
599  ids.push_back(sql_values);
600 
601 
602  if(std::find(precursor_ids.begin(),
603  precursor_ids.end(),
604  q.value(3).toDouble()) == precursor_ids.end())
605  {
606  precursor_ids.push_back(q.value(3).toDouble());
607  }
608  }
609 
610  if(precursor_ids.size() > 1)
611  {
612  // std::vector<std::size_t> precursor_ids_ko =
613  // getMatchPrecursorIdByKo(ids, values[3]);
614  if(precursor_ids.size() > 1)
615  {
616  precursor_ids = getClosestPrecursorIdByMz(ids, k0);
617  }
618  return precursor_ids;
619  }
620  else
621  {
622  return precursor_ids;
623  }
624 }
625 
626 std::vector<std::size_t>
627 TimsData::getMatchPrecursorIdByKo(std::vector<std::vector<double>> ids,
628  double ko_value)
629 {
630  std::vector<std::size_t> precursor_id;
631  for(std::vector<double> index : ids)
632  {
633  auto coordinate = getScanCoordinateFromRawIndex(index[0]);
634 
635  TimsFrameBaseCstSPtr tims_frame;
636  tims_frame = getTimsFrameBaseCstSPtrCached(coordinate.first);
637 
638  double bko = tims_frame.get()->getOneOverK0Transformation(index[2]);
639  double eko = tims_frame.get()->getOneOverK0Transformation(index[3]);
640 
641  qInfo() << "diff" << (bko + eko) / 2;
642  double mean_ko = (bko + eko) / 2;
643 
644  if(mean_ko > ko_value - 0.1 && mean_ko < ko_value + 0.1)
645  {
646  precursor_id.push_back(index[1]);
647  }
648  }
649  return precursor_id;
650 }
651 
652 std::vector<std::size_t>
653 TimsData::getClosestPrecursorIdByMz(std::vector<std::vector<double>> ids,
654  double mz_value)
655 {
656  std::vector<std::size_t> best_precursor;
657  double best_value = 1;
658  int count = 1;
659  int best_val_position = 0;
660 
661  for(std::vector<double> values : ids)
662  {
663  double new_val = abs(mz_value - values[4]);
664  if(new_val < best_value)
665  {
666  best_value = new_val;
667  best_val_position = count;
668  }
669  count++;
670  }
671  best_precursor.push_back(ids[best_val_position][1]);
672  return best_precursor;
673 }
674 
675 
676 unsigned int
677 TimsData::getMsLevelBySpectrumIndex(std::size_t spectrum_index)
678 {
679  auto coordinate = getScanCoordinateFromRawIndex(spectrum_index);
680  auto tims_frame = getTimsFrameCstSPtrCached(coordinate.first);
681  return tims_frame.get()->getMsLevel();
682 }
683 
684 
687  bool want_binary_data)
688 {
689  auto coordinate = getScanCoordinateFromRawIndex(spectrum_index);
690  TimsFrameBaseCstSPtr tims_frame;
691  if(want_binary_data)
692  {
693  tims_frame = getTimsFrameCstSPtrCached(coordinate.first);
694  }
695  else
696  {
697  tims_frame = getTimsFrameBaseCstSPtrCached(coordinate.first);
698  }
699  QualifiedMassSpectrum mass_spectrum;
700  MassSpectrumId spectrum_id;
701 
702  spectrum_id.setSpectrumIndex(spectrum_index);
703  spectrum_id.setNativeId(QString("frame=%1 scan=%2 index=%3")
704  .arg(coordinate.first)
705  .arg(coordinate.second)
706  .arg(spectrum_index));
707 
708  mass_spectrum.setMassSpectrumId(spectrum_id);
709 
710  mass_spectrum.setMsLevel(tims_frame.get()->getMsLevel());
711  mass_spectrum.setRtInSeconds(tims_frame.get()->getTime());
712 
713  mass_spectrum.setDtInMilliSeconds(
714  tims_frame.get()->getDriftTime(coordinate.second));
715  // 1/K0
716  mass_spectrum.setParameterValue(
718  tims_frame.get()->getOneOverK0Transformation(coordinate.second));
719 
720  mass_spectrum.setEmptyMassSpectrum(true);
721  if(want_binary_data)
722  {
723  mass_spectrum.setMassSpectrumSPtr(
724  tims_frame.get()->getMassSpectrumSPtr(coordinate.second));
725  if(mass_spectrum.size() > 0)
726  {
727  mass_spectrum.setEmptyMassSpectrum(false);
728  }
729  }
730  else
731  {
732  // if(tims_frame.get()->getNbrPeaks(coordinate.second) > 0)
733  //{
734  mass_spectrum.setEmptyMassSpectrum(false);
735  // }
736  }
737  if(tims_frame.get()->getMsLevel() > 1)
738  {
739 
740  QSqlDatabase qdb = openDatabaseConnection();
741  QSqlQuery q = qdb.exec(
742  QString(
743  "SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
744  "PasefFrameMsMsInfo INNER JOIN Precursors ON "
745  "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
746  "PasefFrameMsMsInfo.Frame=%1 and (PasefFrameMsMsInfo.ScanNumBegin "
747  "<= %2 and PasefFrameMsMsInfo.ScanNumEnd >= %2);")
748  .arg(coordinate.first)
749  .arg(coordinate.second));
750  if(q.lastError().isValid())
751  {
752  throw PappsoException(
753  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
754  "command %2:\n%3\n%4\n%5")
755  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
756  .arg(q.lastQuery())
757  .arg(qdb.lastError().databaseText())
758  .arg(qdb.lastError().driverText())
759  .arg(qdb.lastError().nativeErrorCode()));
760  }
761  if(q.next())
762  {
763  // mass_spectrum.setPrecursorCharge(q.value(11).toInt());
764  // mass_spectrum.setPrecursorMz(q.value(10).toDouble());
765  // mass_spectrum.setPrecursorIntensity(q.value(13).toDouble());
766  // mass_spectrum.setPrecursorSpectrumIndex();
767 
768  mass_spectrum.appendPrecursorIonData(
769  PrecursorIonData(q.value(10).toDouble(),
770  q.value(11).toInt(),
771  q.value(13).toDouble()));
772 
773 
774  MassSpectrumId spectrum_id;
775  std::size_t prec_spectrum_index = getRawIndexFromCoordinate(
776  q.value(14).toDouble(), coordinate.second);
777 
778  mass_spectrum.setPrecursorSpectrumIndex(prec_spectrum_index);
779  mass_spectrum.setPrecursorNativeId(
780  QString("frame=%1 scan=%2 index=%3")
781  .arg(q.value(14).toDouble())
782  .arg(coordinate.second)
783  .arg(prec_spectrum_index));
784 
785  mass_spectrum.setParameterValue(
786  QualifiedMassSpectrumParameter::IsolationMz, q.value(3).toDouble());
787  mass_spectrum.setParameterValue(
789  q.value(4).toDouble());
790 
791  mass_spectrum.setParameterValue(
793  q.value(5).toFloat());
794  mass_spectrum.setParameterValue(
796  q.value(6).toInt());
797  }
798  }
799 
800  return mass_spectrum;
801 }
802 
803 
806  std::size_t precursor_index,
807  bool want_binary_data)
808 {
809  QualifiedMassSpectrum mass_spectrum;
810 
811  try
812  {
813  QSqlDatabase qdb = openDatabaseConnection();
814  mass_spectrum.setMsLevel(1);
815  mass_spectrum.setPrecursorSpectrumIndex(0);
816  mass_spectrum.setEmptyMassSpectrum(true);
817  QSqlQuery q =
818  qdb.exec(QString("SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
819  "PasefFrameMsMsInfo INNER JOIN Precursors ON "
820  "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
821  "Precursors.Id=%1;")
822  .arg(precursor_index));
823  if(q.lastError().isValid())
824  {
825 
826  throw PappsoException(
827  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
828  "command %2:\n%3\n%4\n%5")
829  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
830  .arg(q.lastQuery())
831  .arg(qdb.lastError().databaseText())
832  .arg(qdb.lastError().driverText())
833  .arg(qdb.lastError().nativeErrorCode()));
834  }
835  if(q.size() == 0)
836  {
837 
838  throw ExceptionNotFound(
839  QObject::tr(
840  "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
841  "id=%1 not found")
842  .arg(precursor_index));
843  }
844  else
845  {
846  TracePlusCombiner combiner;
847  MapTrace combiner_result;
848 
849 
850  bool first = true;
851  std::size_t scan_mobility_start = 0;
852  std::size_t scan_mobility_end = 0;
853  std::set<std::size_t> tims_frame_list;
854  while(q.next())
855  {
856  // get MS1 frame
857  tims_frame_list.insert(q.value(14).toLongLong());
858  if(first)
859  {
860 
861 
862  MassSpectrumId spectrum_id;
863 
864  spectrum_id.setSpectrumIndex(precursor_index);
865  spectrum_id.setNativeId(
866  QString("frame=%1 begin=%2 end=%3 precursor=%4 idxms2=%5")
867  .arg(q.value(0).toLongLong())
868  .arg(q.value(1).toLongLong())
869  .arg(q.value(2).toLongLong())
870  .arg(precursor_index)
871  .arg(ms2_index));
872 
873 
874  mass_spectrum.setMassSpectrumId(spectrum_id);
875 
876 
877  scan_mobility_start = q.value(1).toLongLong();
878  scan_mobility_end = q.value(2).toLongLong();
879 
880  first = false;
881  }
882  }
883 
884  first = true;
885  for(std::size_t tims_id : tims_frame_list)
886  {
887  TimsFrameBaseCstSPtr tims_frame =
888  getTimsFrameCstSPtrCached(tims_id);
889  if(first)
890  {
891  mass_spectrum.setRtInSeconds(tims_frame.get()->getTime());
892 
893  mass_spectrum.setParameterValue(
895  tims_frame.get()->getOneOverK0Transformation(
896  scan_mobility_start));
897 
898  mass_spectrum.setParameterValue(
900  tims_frame.get()->getOneOverK0Transformation(
901  scan_mobility_end));
902 
903  first = false;
904  }
905 
906 
907  if(want_binary_data)
908  {
909  combiner.combine(combiner_result,
910  tims_frame.get()->cumulateScanToTrace(
911  scan_mobility_start, scan_mobility_end));
912  }
913  else
914  {
915  break;
916  }
917  }
918 
919 
920  if(first == true)
921  {
922  throw ExceptionNotFound(
923  QObject::tr(
924  "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
925  "id=%1 not found")
926  .arg(precursor_index));
927  }
928 
929 
930  if(want_binary_data)
931  {
932 
933  pappso::Trace trace(combiner_result);
934  qDebug();
935 
936  if(trace.size() > 0)
937  {
938  if(mcsp_ms1Filter != nullptr)
939  {
940  mcsp_ms1Filter->filter(trace);
941  }
942 
943  qDebug();
944  mass_spectrum.setMassSpectrumSPtr(
945  MassSpectrum(trace).makeMassSpectrumSPtr());
946  mass_spectrum.setEmptyMassSpectrum(false);
947  }
948  else
949  {
950  mass_spectrum.setMassSpectrumSPtr(nullptr);
951  mass_spectrum.setEmptyMassSpectrum(true);
952  }
953  }
954  }
955  }
956  catch(std::exception &error)
957  {
958  qDebug() << QString("Failure %1 ").arg(error.what());
959  }
960  return mass_spectrum;
961 }
962 
963 
964 void
966  QualifiedMassSpectrum &mass_spectrum,
967  std::size_t ms2_index,
968  std::size_t precursor_index,
969  bool want_binary_data)
970 {
971  qDebug();
972  try
973  {
974  QSqlDatabase qdb = openDatabaseConnection();
975  MassSpectrumId spectrum_id;
976 
977  spectrum_id.setSpectrumIndex(precursor_index);
978  spectrum_id.setNativeId(
979  QString("precursor=%1 idxms2=%2").arg(precursor_index).arg(ms2_index));
980 
981  mass_spectrum.setMassSpectrumId(spectrum_id);
982 
983  mass_spectrum.setMsLevel(2);
984  mass_spectrum.setPrecursorSpectrumIndex(ms2_index - 1);
985 
986  mass_spectrum.setEmptyMassSpectrum(true);
987 
988  qdb = openDatabaseConnection();
989  // m_mutex.lock();
990  // if(m_query != nullptr)
991  // {
992  // *m_query =
993  // qdb.exec(QString("SELECT PasefFrameMsMsInfo.*, Precursors.*
994  // FROM "
995  // "PasefFrameMsMsInfo INNER JOIN Precursors ON "
996  // "PasefFrameMsMsInfo.Precursor=Precursors.Id
997  // where " "Precursors.Id=%1;")
998  // .arg(precursor_index));
999  // }
1000  QSqlQuery q =
1001  qdb.exec(QString("SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
1002  "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1003  "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
1004  "Precursors.Id=%1;")
1005  .arg(precursor_index));
1006  if(q.lastError().isValid())
1007  {
1008  qDebug();
1009  throw PappsoException(
1010  QObject::tr("ERROR in TIMS sqlite database file %1, executing SQL "
1011  "command %2:\n%3\n%4\n%5")
1012  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
1013  .arg(q.lastQuery())
1014  .arg(qdb.lastError().databaseText())
1015  .arg(qdb.lastError().driverText())
1016  .arg(qdb.lastError().nativeErrorCode()));
1017  }
1018  qDebug();
1019  // m_mutex.unlock();
1020  if(q.size() == 0)
1021  {
1022 
1023  throw ExceptionNotFound(
1024  QObject::tr(
1025  "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1026  "id=%1 not found")
1027  .arg(precursor_index));
1028  }
1029  else
1030  {
1031  // qDebug() << " q.size()="<< q.size();
1032  qDebug();
1033  bool first = true;
1034  std::size_t scan_mobility_start = 0;
1035  std::size_t scan_mobility_end = 0;
1036  std::vector<std::size_t> tims_frame_list;
1037 
1038  while(q.next())
1039  {
1040  tims_frame_list.push_back(q.value(0).toLongLong());
1041  if(first)
1042  {
1043  // mass_spectrum.setPrecursorCharge(q.value(11).toInt());
1044  // mass_spectrum.setPrecursorMz(q.value(10).toDouble());
1045  // mass_spectrum.setPrecursorIntensity(q.value(13).toDouble());
1046 
1047  mass_spectrum.appendPrecursorIonData(
1048  PrecursorIonData(q.value(10).toDouble(),
1049  q.value(11).toInt(),
1050  q.value(13).toDouble()));
1051 
1052  mass_spectrum.setPrecursorNativeId(
1053  QString("frame=%1 begin=%2 end=%3 precursor=%4 idxms2=%5")
1054  .arg(q.value(14).toLongLong())
1055  .arg(q.value(1).toLongLong())
1056  .arg(q.value(2).toLongLong())
1057  .arg(precursor_index)
1058  .arg(ms2_index - 1));
1059  // mass_spectrum.setPrecursorSpectrumIndex();
1060 
1061  scan_mobility_start = q.value(1).toLongLong();
1062  scan_mobility_end = q.value(2).toLongLong();
1063 
1064  mass_spectrum.setParameterValue(
1066  q.value(3).toDouble());
1067  mass_spectrum.setParameterValue(
1069  q.value(4).toDouble());
1070 
1071  mass_spectrum.setParameterValue(
1073  q.value(5).toFloat());
1074  mass_spectrum.setParameterValue(
1076  q.value(6).toInt());
1077 
1078  first = false;
1079  }
1080  }
1081  // QMutexLocker locker(&m_mutex_spectrum);
1082  qDebug();
1083  pappso::TimsFrameCstSPtr tims_frame, previous_frame;
1084  // TracePlusCombiner combiner;
1085  // MapTrace combiner_result;
1086  std::map<quint32, quint32> raw_spectrum;
1087  first = true;
1088  for(std::size_t tims_id : tims_frame_list)
1089  {
1090 
1091  tims_frame = getTimsFrameCstSPtrCached(tims_id);
1092  if(first)
1093  {
1094  mass_spectrum.setRtInSeconds(tims_frame.get()->getTime());
1095 
1096  mass_spectrum.setParameterValue(
1098  tims_frame.get()->getOneOverK0Transformation(
1099  scan_mobility_start));
1100 
1101  mass_spectrum.setParameterValue(
1103  tims_frame.get()->getOneOverK0Transformation(
1104  scan_mobility_end));
1105 
1106  first = false;
1107  }
1108 
1109 
1110  if(want_binary_data)
1111  {
1112  qDebug();
1113  /*combiner.combine(combiner_result,
1114  tims_frame.get()->cumulateScanToTrace(
1115  scan_mobility_start, scan_mobility_end));*/
1116  if(previous_frame.get() != nullptr)
1117  {
1118  if(previous_frame.get()->hasSameCalibrationData(
1119  *tims_frame.get()))
1120  {
1121  }
1122  else
1123  {
1124  throw ExceptionNotFound(
1125  QObject::tr(
1126  "ERROR in %1 %2, different calibration data "
1127  "between frame id %3 and frame id %4")
1128  .arg(__FILE__)
1129  .arg(__FUNCTION__)
1130  .arg(previous_frame.get()->getId())
1131  .arg(tims_frame.get()->getId()));
1132  }
1133  }
1134  tims_frame.get()->cumulateScansInRawMap(
1135  raw_spectrum, scan_mobility_start, scan_mobility_end);
1136  qDebug();
1137  }
1138  previous_frame = tims_frame;
1139  }
1140  qDebug() << " precursor_index=" << precursor_index
1141  << " num_rows=" << tims_frame_list.size()
1142  << " sql=" << q.lastQuery() << " "
1143  << (std::size_t)QThread::currentThreadId();
1144  if(first == true)
1145  {
1146  throw ExceptionNotFound(
1147  QObject::tr(
1148  "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1149  "id=%1 not found")
1150  .arg(precursor_index));
1151  }
1152  if(want_binary_data)
1153  {
1154  qDebug();
1155  // peak_pick.filter(trace);
1156  pappso::Trace trace;
1158  {
1159  trace =
1160  tims_frame.get()->getTraceFromCumulatedScansBuiltinCentroid(
1161  raw_spectrum);
1162  }
1163  else
1164  {
1165  // no builtin centroid:
1166 
1167  trace =
1168  tims_frame.get()->getTraceFromCumulatedScans(raw_spectrum);
1169  }
1170 
1171  if(trace.size() > 0)
1172  {
1173  qDebug() << trace.size() << " "
1174  << (std::size_t)QThread::currentThreadId();
1175 
1176  if(mcsp_ms2Filter != nullptr)
1177  {
1178  // FilterTriangle filter;
1179  // filter.setTriangleSlope(50, 0.02);
1180  // filter.filter(trace);
1181  // trace.filter(pappso::FilterHighPass(10));
1182  mcsp_ms2Filter->filter(trace);
1183  }
1184 
1185  // FilterScaleFactorY filter_scale((double)1 /
1186  // (double)tims_frame_list.size());
1187  // filter_scale.filter(trace);
1188  qDebug();
1189  mass_spectrum.setMassSpectrumSPtr(
1190  MassSpectrum(trace).makeMassSpectrumSPtr());
1191  mass_spectrum.setEmptyMassSpectrum(false);
1192  }
1193  else
1194  {
1195  mass_spectrum.setMassSpectrumSPtr(nullptr);
1196  mass_spectrum.setEmptyMassSpectrum(true);
1197  }
1198 
1199  qDebug();
1200  }
1201  qDebug();
1202  }
1203  }
1204  catch(std::exception &error)
1205  {
1206  qDebug() << QString("Failure %1 ").arg(error.what());
1207  }
1208  qDebug();
1209 }
1210 
1211 
1214 {
1215  QMutexLocker locker(&m_mutex);
1216  for(auto &tims_frame : m_timsFrameBaseCache)
1217  {
1218  if(tims_frame.get()->getId() == timsId)
1219  {
1220  m_timsFrameBaseCache.push_back(tims_frame);
1221  return tims_frame;
1222  }
1223  }
1224 
1225  m_timsFrameBaseCache.push_back(getTimsFrameBaseCstSPtr(timsId));
1226  if(m_timsFrameBaseCache.size() > m_cacheSize)
1227  m_timsFrameBaseCache.pop_front();
1228  return m_timsFrameBaseCache.back();
1229 }
1230 
1233 {
1234  QMutexLocker locker(&m_mutex);
1235  for(auto &tims_frame : m_timsFrameCache)
1236  {
1237  if(tims_frame.get()->getId() == timsId)
1238  {
1239  m_timsFrameCache.push_back(tims_frame);
1240  return tims_frame;
1241  }
1242  }
1243 
1244  m_timsFrameCache.push_back(getTimsFrameCstSPtr(timsId));
1245  if(m_timsFrameCache.size() > m_cacheSize)
1246  m_timsFrameCache.pop_front();
1247  return m_timsFrameCache.back();
1248 }
1249 
1250 void
1252 {
1253  mcsp_ms2Filter = filter;
1254 }
1255 void
1257 {
1258  mcsp_ms1Filter = filter;
1259 }
1260 
1261 std::vector<TimsXicStructure>
1263  const std::vector<std::size_t> &precursor_id_list,
1264  PrecisionPtr precision_ptr,
1265  XicExtractMethod xicExtractMethod,
1266  double rtRange) const
1267 {
1268 
1269  qDebug();
1270  std::vector<TimsXicStructure> xic_list;
1271 
1272  try
1273  {
1274  QSqlDatabase qdb = openDatabaseConnection();
1275 
1276  for(auto precursor_id : precursor_id_list)
1277  {
1278  QSqlQuery q = qdb.exec(
1279  QString("SELECT Frames.Time, "
1280  "PasefFrameMsMsInfo.Frame,PasefFrameMsMsInfo.ScanNumBegin,"
1281  "PasefFrameMsMsInfo.ScanNumEnd, Precursors.MonoisotopicMz, "
1282  "Precursors.Charge FROM "
1283  "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1284  "PasefFrameMsMsInfo.Precursor=Precursors.Id INNER JOIN "
1285  "Frames ON PasefFrameMsMsInfo.Frame=Frames.Id where "
1286  "Precursors.Id=%1;")
1287  .arg(precursor_id));
1288  if(q.lastError().isValid())
1289  {
1290  qDebug();
1291  throw PappsoException(
1292  QObject::tr(
1293  "ERROR in TIMS sqlite database file %1, executing SQL "
1294  "command %2:\n%3\n%4\n%5")
1295  .arg(m_timsDataDirectory.absoluteFilePath("analysis.tdf"))
1296  .arg(q.lastQuery())
1297  .arg(qdb.lastError().databaseText())
1298  .arg(qdb.lastError().driverText())
1299  .arg(qdb.lastError().nativeErrorCode()));
1300  }
1301 
1302  while(q.next())
1303  {
1304  // Frame, ScanNumBegin, ScanNumEnd, IsolationMz, ColliqionEnergy,
1305  // Precursor
1306  // Id, LargestPeakMz, AverageMz, MonoisotopicMz, Charge,
1307  // ScanNumber, Intensity, Parent
1308  TimsXicStructure xic_structure;
1309 
1310  xic_structure.precursorId = precursor_id;
1311  xic_structure.mzRange =
1312  MzRange(q.value(4).toDouble(), precision_ptr);
1313  xic_structure.scanNumBegin = q.value(2).toUInt();
1314  xic_structure.scanNumEnd = q.value(3).toUInt();
1315  xic_structure.rtTarget = q.value(0).toDouble();
1316  // xic_structure.charge = q.value(5).toUInt();
1317 
1318  xic_list.push_back(xic_structure);
1319  }
1320  }
1321  qDebug();
1322 
1323  TimsXicExtractorInterface *extractor_p = new TimsDirectXicExtractor(this);
1324  extractor_p->setXicExtractMethod(xicExtractMethod);
1325  extractor_p->extractTimsXicList(xic_list, rtRange);
1326  }
1327  catch(std::exception &error)
1328  {
1329  qDebug() << QString("Failure %1 ").arg(error.what());
1330  }
1331 
1332  qDebug();
1333  return xic_list;
1334 }
pappso::TimsData::mcsp_ms2Filter
pappso::FilterInterfaceCstSPtr mcsp_ms2Filter
Definition: timsdata.h:240
pappso::TimsData::m_totalNumberOfPrecursors
std::size_t m_totalNumberOfPrecursors
Definition: timsdata.h:235
pappso::TimsData::getMs2BuiltinCentroid
bool getMs2BuiltinCentroid() const
tells if simple centroid filter on raw tims data for MS2 is enabled or not
Definition: timsdata.cpp:205
pappso::MassSpectrumCstSPtr
std::shared_ptr< const MassSpectrum > MassSpectrumCstSPtr
Definition: massspectrum.h:76
pappso::TimsData::setMs2FilterCstSPtr
void setMs2FilterCstSPtr(pappso::FilterInterfaceCstSPtr &filter)
filter interface to apply just after raw MS2 specturm extraction the filter can be a list of filters ...
Definition: timsdata.cpp:1251
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:305
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:805
pappso::TimsData::mcsp_ms1Filter
pappso::FilterInterfaceCstSPtr mcsp_ms1Filter
Definition: timsdata.h:241
pappso::TimsData::m_timsFrameBaseCache
std::deque< TimsFrameBaseCstSPtr > m_timsFrameBaseCache
Definition: timsdata.h:238
timsdirectxicextractor.h
minimum functions to extract XICs from Tims Data
pappso::TimsData::getTimsFrameBaseCstSPtrCached
TimsFrameBaseCstSPtr getTimsFrameBaseCstSPtrCached(std::size_t timsId)
Definition: timsdata.cpp:1213
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:403
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:65
pappso::TimsBinDec
Definition: timsbindec.h:59
pappso::TimsXicExtractorInterface
Definition: timsxicextractorinterface.h:60
pappso::TimsBinDec::getTimsFrameSPtrByOffset
TimsFrameSPtr getTimsFrameSPtrByOffset(std::size_t timsId, std::size_t timsOffset) const
Definition: timsbindec.cpp:143
pappso
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
Definition: aa.cpp:39
pappso::MassSpectrum
Class to represent a mass spectrum.
Definition: massspectrum.h:92
pappso::TimsData::setMs2BuiltinCentroid
void setMs2BuiltinCentroid(bool centroid)
enable or disable simple centroid filter on raw tims data for MS2
Definition: timsdata.cpp:199
pappso::FilterInterfaceCstSPtr
std::shared_ptr< const FilterInterface > FilterInterfaceCstSPtr
Definition: filterinterface.h:64
pappso::TimsData::m_cacheSize
std::size_t m_cacheSize
Definition: timsdata.h:236
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::TimsData::getMatchPrecursorIdByKo
std::vector< std::size_t > getMatchPrecursorIdByKo(std::vector< std::vector< double >> ids, double ko_value)
Definition: timsdata.cpp:627
pappso::QualifiedMassSpectrumParameter::OneOverK0
@ OneOverK0
1/kO of a simple scan
pappso::TimsData::setMs1FilterCstSPtr
void setMs1FilterCstSPtr(pappso::FilterInterfaceCstSPtr &filter)
filter interface to apply just after raw MS1 specturm extraction the filter can be a list of filters ...
Definition: timsdata.cpp:1256
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:1262
pappso::QualifiedMassSpectrum::setParameterValue
void setParameterValue(QualifiedMassSpectrumParameter parameter, const QVariant &value)
Definition: qualifiedmassspectrum.cpp:479
pappso::MapTrace
Definition: maptrace.h:33
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:677
pappso::QualifiedMassSpectrum::setMassSpectrumSPtr
void setMassSpectrumSPtr(MassSpectrumSPtr massSpectrum)
Set the MassSpectrumSPtr.
Definition: qualifiedmassspectrum.cpp:143
pappso::TimsData
Definition: timsdata.h:88
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:314
pappso::TimsDirectXicExtractor
Definition: timsdirectxicextractor.h:56
pappso::TimsData::getClosestPrecursorIdByMz
std::vector< std::size_t > getClosestPrecursorIdByMz(std::vector< std::vector< double >> ids, double mz_value)
Definition: timsdata.cpp:653
pappso::QualifiedMassSpectrum::setMsLevel
void setMsLevel(uint ms_level)
Set the mass spectrum level.
Definition: qualifiedmassspectrum.cpp:197
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:1232
pappso::QualifiedMassSpectrum::size
std::size_t size() const
Definition: qualifiedmassspectrum.cpp:510
pappso::QualifiedMassSpectrum::setRtInSeconds
void setRtInSeconds(pappso_double rt)
Set the retention time in seconds.
Definition: qualifiedmassspectrum.cpp:213
pappso::TimsData::m_mutex
QMutex m_mutex
Definition: timsdata.h:246
pappso::MzRange
Definition: mzrange.h:67
pappso::Trace
A simple container of DataPoint instances.
Definition: trace.h:132
pappso::XicExtractMethod
XicExtractMethod
Definition: types.h:221
pappso::QualifiedMassSpectrum
Class representing a fully specified mass spectrum.
Definition: qualifiedmassspectrum.h:103
pappso::TimsData::getScanCoordinateFromRawIndex
std::pair< std::size_t, std::size_t > getScanCoordinateFromRawIndex(std::size_t spectrum_index) const
Definition: timsdata.cpp:211
pappso::TimsData::m_timsDataDirectory
QDir m_timsDataDirectory
Definition: timsdata.h:231
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:527
pappso::TimsData::getQualifiedMassSpectrumByRawIndex
QualifiedMassSpectrum getQualifiedMassSpectrumByRawIndex(std::size_t spectrum_index, bool want_binary_data)
Definition: timsdata.cpp:686
pappso::QualifiedMassSpectrum::setPrecursorNativeId
void setPrecursorNativeId(const QString &native_id)
Set the scan native id of the precursor ion.
Definition: qualifiedmassspectrum.cpp:435
pappso::TimsData::~TimsData
~TimsData()
Definition: timsdata.cpp:189
pappso::QualifiedMassSpectrum::appendPrecursorIonData
void appendPrecursorIonData(const PrecursorIonData &precursor_ion_data)
Definition: qualifiedmassspectrum.cpp:448
pappso::QualifiedMassSpectrum::setMassSpectrumId
void setMassSpectrumId(const MassSpectrumId &iD)
Set the MassSpectrumId.
Definition: qualifiedmassspectrum.cpp:167
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:542
pappso::TimsData::m_totalNumberOfScans
std::size_t m_totalNumberOfScans
Definition: timsdata.h:234
pappso::TimsData::mpa_timsBinDec
TimsBinDec * mpa_timsBinDec
Definition: timsdata.h:232
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:237
pappso::ExceptionNotFound
Definition: exceptionnotfound.h:53
pappso::TimsXicStructure
structure needed to extract XIC from Tims data
Definition: timsdata.h:66
pappso::QualifiedMassSpectrumParameter::OneOverK0begin
@ OneOverK0begin
pappso::PrecisionBase
Definition: precision.h:65
pappso::TimsData::getTotalNumberOfScans
std::size_t getTotalNumberOfScans() const
get the total number of scans
Definition: timsdata.cpp:535
pappso::TimsData::getPrecursorsFromMzRtCharge
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
Definition: timsdata.cpp:548
pappso::MassSpectrumId
Definition: massspectrumid.h:59
pappso::QualifiedMassSpectrum::setEmptyMassSpectrum
void setEmptyMassSpectrum(bool is_empty_mass_spectrum)
Definition: qualifiedmassspectrum.cpp:182
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:418
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:965
pappso::TimsData::getTimsFrameCstSPtr
TimsFrameCstSPtr getTimsFrameCstSPtr(std::size_t timsId) const
get a Tims frame with his database ID
Definition: timsdata.cpp:437
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:237
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:256
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:154
pappso::TimsXicStructure::rtTarget
pappso::pappso_double rtTarget
Definition: timsdata.h:91
pappso::PrecursorIonData
Definition: qualifiedmassspectrum.h:80
pappso::TracePlusCombiner
Definition: tracepluscombiner.h:27
pappso::TimsData::m_builtinMs2Centroid
bool m_builtinMs2Centroid
enable builtin centroid on raw tims integers by default
Definition: timsdata.h:245
pappso::PappsoException
Definition: pappsoexception.h:63
pappso::FilterTriangle::setTriangleSlope
double setTriangleSlope(double intensity, double mz)
Definition: filtertriangle.cpp:47