29 #include "../../exception/exceptionnotfound.h"
30 #include "../../exception/exceptioninterrupted.h"
31 #include "../../processing/combiners/tracepluscombiner.h"
32 #include "../../processing/filters/filtertriangle.h"
33 #include "../../processing/filters/filtersuitestring.h"
39 #include <QMutexLocker>
42 #include <QtConcurrent>
48 : m_timsDataDirectory(timsDataDirectory)
51 qDebug() <<
"Start of construction of TimsData";
56 QObject::tr(
"ERROR TIMS data directory %1 not found")
64 QObject::tr(
"ERROR TIMS data directory, %1 sqlite file not found")
73 if(!q.exec(
"select Key, Value from GlobalMetadata where "
74 "Key='TimsCompressionType';"))
79 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
80 "command %2:\n%3\n%4\n%5")
83 .arg(q.lastError().databaseText())
84 .arg(q.lastError().driverText())
85 .arg(q.lastError().nativeErrorCode()));
89 int compression_type = 0;
92 compression_type = q.value(1).toInt();
94 qDebug() <<
" compression_type=" << compression_type;
103 if(!q.exec(
"SELECT COUNT( DISTINCT Id) FROM Precursors;"))
120 if(!q.exec(
"SELECT SUM(NumScans),COUNT(Id) FROM Frames"))
124 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
125 "command %2:\n%3\n%4\n%5")
128 .arg(qdb.lastError().databaseText())
129 .arg(qdb.lastError().driverText())
130 .arg(qdb.lastError().nativeErrorCode()));
138 if(!q.exec(
"select * from MzCalibration;"))
142 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
143 "command %2:\n%3\n%4\n%5")
146 .arg(q.lastError().databaseText())
147 .arg(q.lastError().driverText())
148 .arg(q.lastError().nativeErrorCode()));
153 QSqlRecord record = q.record();
155 std::pair<int, QSqlRecord>(record.value(0).toInt(), record));
160 if(!q.exec(
"select * from TimsCalibration;"))
164 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
165 "command %2:\n%3\n%4\n%5")
168 .arg(q.lastError().databaseText())
169 .arg(q.lastError().driverText())
170 .arg(q.lastError().nativeErrorCode()));
174 QSqlRecord record = q.record();
176 std::pair<int, QSqlRecord>(record.value(0).toInt(), record));
181 if(!q.exec(
"select Frames.TimsId, Frames.AccumulationTime, "
182 "Frames.MzCalibration, "
183 "Frames.T1, Frames.T2, "
184 "Frames.Time, Frames.MsMsType, Frames.TimsCalibration, "
190 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
191 "command %2:\n%3\n%4\n%5")
194 .arg(q.lastError().databaseText())
195 .arg(q.lastError().driverText())
196 .arg(q.lastError().nativeErrorCode()));
202 QSqlRecord record = q.record();
206 frame_record.
tims_offset = record.value(0).toULongLong();
209 frame_record.
frame_t1 = record.value(3).toDouble();
210 frame_record.
frame_t2 = record.value(4).toDouble();
211 frame_record.
frame_time = record.value(5).toDouble();
212 frame_record.
msms_type = record.value(6).toInt();
217 "chargeDeconvolution|0.02dalton mzExclusion|0.01dalton");
220 std::shared_ptr<FilterTriangle> ms1filter =
221 std::make_shared<FilterTriangle>();
222 ms1filter.get()->setTriangleSlope(50, 0.01);
236 QString database_connection_name = QString(
"%1_%2")
238 .arg((quintptr)QThread::currentThread());
240 QSqlDatabase qdb = QSqlDatabase::database(database_connection_name);
243 qDebug() << database_connection_name;
244 qdb = QSqlDatabase::addDatabase(
"QSQLITE", database_connection_name);
253 QObject::tr(
"ERROR opening TIMS sqlite database file %1, database name "
256 .arg(database_connection_name)
257 .arg(qdb.lastError().databaseText())
258 .arg(qdb.lastError().driverText())
259 .arg(qdb.lastError().nativeErrorCode()));
301 qdb.exec(QString(
"SELECT Id, NumScans FROM "
302 "Frames ORDER BY Id"));
303 if(q.lastError().isValid())
307 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
308 "command %2:\n%3\n%4\n%5")
311 .arg(qdb.lastError().databaseText())
312 .arg(qdb.lastError().driverText())
313 .arg(qdb.lastError().nativeErrorCode()));
316 bool index_found =
false;
320 std::size_t numberScans;
321 std::size_t cumulScans = 0;
322 while(q.next() && (!index_found))
324 timsId = q.value(0).toULongLong();
325 numberScans = q.value(1).toULongLong();
330 std::pair<std::size_t, std::size_t>((cumulScans / 1000),
334 cumulScans += numberScans;
339 std::pair<std::size_t, std::size_t>
343 std::size_t fast_access = raw_index / 1000;
344 qDebug() <<
" fast_access=" << fast_access;
349 QObject::tr(
"ERROR raw index %1 not found (fast_access)")
352 std::size_t start_point_index = map_it->second;
353 while((start_point_index > 0) &&
364 return std::pair<std::size_t, std::size_t>(
371 QObject::tr(
"ERROR raw index %1 not found").arg(raw_index));
377 std::size_t scan_num)
const
382 if(frameDescr.m_frameId == frame_id)
384 return frameDescr.m_cumulSize + scan_num;
389 QObject::tr(
"ERROR raw index with frame=%1 scan=%2 not found")
402 qDebug() <<
" raw_index=" << raw_index;
411 QObject::tr(
"Error TimsData::getMassSpectrumCstSPtrByRawIndex "
412 "raw_index=%1 :\n%2")
414 .arg(error.
qwhat()));
423 qDebug() <<
" timsId=" << timsId;
429 QObject::tr(
"ERROR Frames database id %1 not found").arg(timsId));
434 tims_frame = std::make_shared<TimsFrameBase>(
442 double T1_frame = frame_record.
frame_t1;
443 double T2_frame = frame_record.
frame_t2;
446 tims_frame.get()->setMzCalibrationInterfaceSPtr(
448 T1_frame, T2_frame, it_map_record->second));
453 QObject::tr(
"ERROR MzCalibration database id %1 not found")
459 tims_frame.get()->setTime(frame_record.
frame_time);
460 tims_frame.get()->setMsMsType(frame_record.
msms_type);
463 auto it_map_record_tims_calibration =
468 tims_frame.get()->setTimsCalibration(
469 it_map_record_tims_calibration->second.value(1).toInt(),
470 it_map_record_tims_calibration->second.value(2).toDouble(),
471 it_map_record_tims_calibration->second.value(3).toDouble(),
472 it_map_record_tims_calibration->second.value(4).toDouble(),
473 it_map_record_tims_calibration->second.value(5).toDouble(),
474 it_map_record_tims_calibration->second.value(6).toDouble(),
475 it_map_record_tims_calibration->second.value(7).toDouble(),
476 it_map_record_tims_calibration->second.value(8).toDouble(),
477 it_map_record_tims_calibration->second.value(9).toDouble(),
478 it_map_record_tims_calibration->second.value(10).toDouble(),
479 it_map_record_tims_calibration->second.value(11).toDouble());
484 QObject::tr(
"ERROR TimsCalibration database id %1 not found")
491 std::vector<std::size_t>
495 qDebug() <<
" rt_begin=" << rt_begin <<
" rt_end=" << rt_end;
498 std::vector<std::size_t> tims_frameid_list;
500 QSqlQuery q = qdb.exec(QString(
"SELECT Frames.Id FROM Frames WHERE "
501 "Frames.MsMsType=0 AND (Frames.Time>=%1) AND "
502 "(Frames.Time<=%2) ORDER BY Frames.Time;")
505 if(q.lastError().isValid())
509 QObject::tr(
"ERROR in TIMS sqlite database file %1, database name %2, "
511 "command %3:\n%4\n%5\n%6")
513 .arg(qdb.databaseName())
515 .arg(qdb.lastError().databaseText())
516 .arg(qdb.lastError().driverText())
517 .arg(qdb.lastError().nativeErrorCode()));
522 tims_frameid_list.push_back(q.value(0).toULongLong());
524 return tims_frameid_list;
531 qDebug() <<
" timsId=" << timsId
546 QObject::tr(
"ERROR Frames database id %1 not found").arg(timsId));
563 double T1_frame = frame_record.
frame_t1;
564 double T2_frame = frame_record.
frame_t2;
567 tims_frame.get()->setMzCalibrationInterfaceSPtr(
569 T1_frame, T2_frame, it_map_record->second));
574 QObject::tr(
"ERROR MzCalibration database id %1 not found")
580 tims_frame.get()->setTime(frame_record.
frame_time);
581 tims_frame.get()->setMsMsType(frame_record.
msms_type);
584 auto it_map_record_tims_calibration =
589 tims_frame.get()->setTimsCalibration(
590 it_map_record_tims_calibration->second.value(1).toInt(),
591 it_map_record_tims_calibration->second.value(2).toDouble(),
592 it_map_record_tims_calibration->second.value(3).toDouble(),
593 it_map_record_tims_calibration->second.value(4).toDouble(),
594 it_map_record_tims_calibration->second.value(5).toDouble(),
595 it_map_record_tims_calibration->second.value(6).toDouble(),
596 it_map_record_tims_calibration->second.value(7).toDouble(),
597 it_map_record_tims_calibration->second.value(8).toDouble(),
598 it_map_record_tims_calibration->second.value(9).toDouble(),
599 it_map_record_tims_calibration->second.value(10).toDouble(),
600 it_map_record_tims_calibration->second.value(11).toDouble());
605 QObject::tr(
"ERROR TimsCalibration database id %1 not found")
616 qDebug() <<
" timsId=" << timsId <<
" scanNum=" << scanNum;
619 return frame->getMassSpectrumCstSPtr(scanNum);
643 std::vector<std::size_t>
649 std::vector<std::size_t> precursor_ids;
650 std::vector<std::vector<double>> ids;
653 QSqlQuery q = qdb.exec(
655 "SELECT Frames.Time, Precursors.MonoisotopicMz, Precursors.Charge, "
656 "Precursors.Id, Frames.Id, PasefFrameMsMsInfo.ScanNumBegin, "
657 "PasefFrameMsMsInfo.scanNumEnd "
659 "INNER JOIN PasefFrameMsMsInfo ON Frames.Id = PasefFrameMsMsInfo.Frame "
660 "INNER JOIN Precursors ON PasefFrameMsMsInfo.Precursor = Precursors.Id "
661 "WHERE Precursors.Charge == %1 "
662 "AND Precursors.MonoisotopicMz > %2 -0.01 "
663 "AND Precursors.MonoisotopicMz < %2 +0.01 "
664 "AND Frames.Time >= %3 -1 "
665 "AND Frames.Time < %3 +1; ")
669 if(q.lastError().isValid())
673 QObject::tr(
"ERROR in TIMS sqlite database file %1, database name %2, "
675 "command %3:\n%4\n%5\n%6")
677 .arg(qdb.databaseName())
679 .arg(qdb.lastError().databaseText())
680 .arg(qdb.lastError().driverText())
681 .arg(qdb.lastError().nativeErrorCode()));
688 std::vector<double> sql_values;
689 sql_values.push_back(q.value(4).toDouble());
690 sql_values.push_back(q.value(3).toDouble());
691 sql_values.push_back(q.value(5).toDouble());
692 sql_values.push_back(q.value(6).toDouble());
693 sql_values.push_back(q.value(1).toDouble());
695 ids.push_back(sql_values);
698 if(std::find(precursor_ids.begin(),
700 q.value(3).toDouble()) == precursor_ids.end())
702 precursor_ids.push_back(q.value(3).toDouble());
706 if(precursor_ids.size() > 1)
710 if(precursor_ids.size() > 1)
714 return precursor_ids;
718 return precursor_ids;
722 std::vector<std::size_t>
726 std::vector<std::size_t> precursor_id;
727 for(std::vector<double> index : ids)
734 double bko = tims_frame.get()->getOneOverK0Transformation(index[2]);
735 double eko = tims_frame.get()->getOneOverK0Transformation(index[3]);
738 double mean_ko = (bko + eko) / 2;
740 if(mean_ko > ko_value - 0.1 && mean_ko < ko_value + 0.1)
742 precursor_id.push_back(index[1]);
748 std::vector<std::size_t>
752 std::vector<std::size_t> best_precursor;
753 double best_value = 1;
755 int best_val_position = 0;
757 for(std::vector<double> values : ids)
759 double new_val = abs(mz_value - values[4]);
760 if(new_val < best_value)
762 best_value = new_val;
763 best_val_position = count;
767 best_precursor.push_back(ids[best_val_position][1]);
768 return best_precursor;
777 return tims_frame.get()->getMsLevel();
785 std::size_t spectrum_index,
786 bool want_binary_data)
804 spectrum_id.
setNativeId(QString(
"frame=%1 scan=%2 index=%3")
805 .arg(coordinate.first)
806 .arg(coordinate.second)
807 .arg(spectrum_index));
811 mass_spectrum.
setMsLevel(tims_frame.get()->getMsLevel());
815 tims_frame.get()->getDriftTime(coordinate.second));
819 tims_frame.get()->getOneOverK0Transformation(coordinate.second));
825 tims_frame.get()->getMassSpectrumSPtr(coordinate.second));
826 if(mass_spectrum.
size() > 0)
838 if(tims_frame.get()->getMsLevel() > 1)
842 if(spectrum_descr.precursor_id > 0)
846 spectrum_descr.precursor_ion_data);
851 spectrum_descr.parent_frame, coordinate.second);
855 QString(
"frame=%1 scan=%2 index=%3")
856 .arg(spectrum_descr.parent_frame)
857 .arg(coordinate.second)
858 .arg(prec_spectrum_index));
862 spectrum_descr.isolationMz);
865 spectrum_descr.isolationWidth);
869 spectrum_descr.collisionEnergy);
872 (quint64)spectrum_descr.precursor_id);
879 QObject::tr(
"Error TimsData::getQualifiedMassSpectrumByRawIndex "
880 "spectrum_index=%1 :\n%2")
882 .arg(error.
qwhat()));
896 using Pair = std::pair<double, double>;
897 using Map = std::map<double, double>;
898 using Iterator = Map::iterator;
903 qdb.exec(QString(
"SELECT Time, SummedIntensities "
904 "FROM Frames WHERE MsMsType = 0 "
907 if(q.lastError().isValid())
911 QObject::tr(
"ERROR in TIMS sqlite database file %1, database name %2, "
913 "command %3:\n%4\n%5\n%6")
915 .arg(qdb.databaseName())
917 .arg(qdb.lastError().databaseText())
918 .arg(qdb.lastError().driverText())
919 .arg(qdb.lastError().nativeErrorCode()));
927 int cumulated_results = 2;
929 double rt = q.value(0).toDouble(&ok);
930 cumulated_results -= ok;
932 double sumY = q.value(1).toDouble(&ok);
933 cumulated_results -= ok;
935 if(cumulated_results)
939 "ERROR in TIMS sqlite database file: could not read either the "
940 "retention time or the summed intensities (%1, database name "
943 "command %3:\n%4\n%5\n%6")
945 .arg(qdb.databaseName())
947 .arg(qdb.lastError().databaseText())
948 .arg(qdb.lastError().driverText())
949 .arg(qdb.lastError().nativeErrorCode()));
953 std::pair<Iterator, bool>
res = rt_tic_map_trace.insert(Pair(
rt, sumY));
960 res.first->second += sumY;
967 return rt_tic_map_trace.
toTrace();
976 bool want_binary_data)
979 qDebug() <<
" ms2_index=" << spectrum_descr.
ms2_index
994 QString(
"frame=%1 begin=%2 end=%3 precursor=%4 idxms1=%5")
1007 if(want_binary_data)
1009 qDebug() <<
"bindec";
1021 tims_frame.get()->getOneOverK0Transformation(
1026 tims_frame.get()->getOneOverK0Transformation(
1030 if(want_binary_data)
1032 combiner.
combine(combiner_result,
1033 tims_frame.get()->cumulateScanToTrace(
1040 if(trace.size() > 0)
1065 catch(std::exception &error)
1067 qDebug() << QString(
"Failure %1 ").arg(error.
what());
1075 QMutexLocker locker(&
m_mutex);
1078 if(tims_frame.get()->getId() == timsId)
1097 QMutexLocker locker(&
m_mutex);
1100 if(tims_frame.get()->getId() == timsId)
1191 if(m_mapXicCoordRecord.size() == 0)
1193 QMutexLocker lock(&m_mutex);
1217 QSqlDatabase qdb = openDatabaseConnection();
1218 QSqlQuery q = qdb.exec(
1219 QString(
"SELECT Precursors.id, "
1220 "min(Frames.Time), "
1221 "min(PasefFrameMsMsInfo.ScanNumBegin), "
1222 "max(PasefFrameMsMsInfo.ScanNumEnd), "
1223 "Precursors.MonoisotopicMz "
1225 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1226 "PasefFrameMsMsInfo.Precursor=Precursors.Id INNER JOIN "
1227 "Frames ON PasefFrameMsMsInfo.Frame=Frames.Id "
1228 "GROUP BY Precursors.id;"));
1229 if(q.lastError().isValid())
1234 "ERROR in TIMS sqlite database file %1, executing SQL "
1235 "command %2:\n%3\n%4\n%5")
1236 .arg(m_timsDataDirectory.absoluteFilePath(
"analysis.tdf"))
1238 .arg(qdb.lastError().databaseText())
1239 .arg(qdb.lastError().driverText())
1240 .arg(qdb.lastError().nativeErrorCode()));
1249 QSqlRecord record = q.record();
1250 m_mapXicCoordRecord.insert(std::pair<std::size_t, QSqlRecord>(
1251 (std::size_t)record.value(0).toULongLong(), record));
1257 auto it_map_xiccoord = m_mapXicCoordRecord.find(precursor_id);
1258 if(it_map_xiccoord == m_mapXicCoordRecord.end())
1262 QObject::tr(
"ERROR Precursors database id %1 not found")
1263 .arg(precursor_id));
1266 auto &q = it_map_xiccoord->second;
1267 xic_coord_tims_struct.
mzRange =
1268 MzRange(q.value(4).toDouble(), precision_ptr);
1269 xic_coord_tims_struct.
scanNumBegin = q.value(2).toUInt();
1270 xic_coord_tims_struct.
scanNumEnd = q.value(3).toUInt();
1271 xic_coord_tims_struct.
rtTarget = q.value(1).toDouble();
1273 xic_coord_tims_struct.
xicSptr = std::make_shared<Xic>();
1279 catch(std::exception &error)
1281 qDebug() << QString(
"Failure %1 ").arg(error.
what());
1283 return xic_coord_tims_struct;
1287 std::map<quint32, quint32>
1291 std::map<quint32, quint32> raw_spectrum;
1298 qdb.exec(QString(
"SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
1299 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1300 "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
1301 "Precursors.Id=%1;")
1302 .arg(precursor_index));
1303 if(q.lastError().isValid())
1307 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
1308 "command %2:\n%3\n%4\n%5")
1311 .arg(qdb.lastError().databaseText())
1312 .arg(qdb.lastError().driverText())
1313 .arg(qdb.lastError().nativeErrorCode()));
1322 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1324 .arg(precursor_index));
1331 std::size_t scan_mobility_start = 0;
1332 std::size_t scan_mobility_end = 0;
1333 std::vector<std::size_t> tims_frame_list;
1337 tims_frame_list.push_back(q.value(0).toLongLong());
1341 scan_mobility_start = q.value(1).toLongLong();
1342 scan_mobility_end = q.value(2).toLongLong();
1352 for(std::size_t tims_id : tims_frame_list)
1359 if(previous_frame.get() !=
nullptr)
1361 if(previous_frame.get()->hasSameCalibrationData(
1369 "ERROR in %1 %2, different calibration data "
1370 "between frame id %3 and frame id %4")
1373 .arg(previous_frame.get()->getId())
1374 .arg(tims_frame.get()->getId()));
1377 tims_frame.get()->cumulateScansInRawMap(
1378 raw_spectrum, scan_mobility_start, scan_mobility_end);
1381 previous_frame = tims_frame;
1383 qDebug() <<
" precursor_index=" << precursor_index
1384 <<
" num_rows=" << tims_frame_list.size()
1385 <<
" sql=" << q.lastQuery() <<
" "
1386 << (std::size_t)QThread::currentThreadId();
1391 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1393 .arg(precursor_index));
1401 throw PappsoException(QObject::tr(
"ERROR in %1 (precursor_index=%2):\n%3")
1403 .arg(precursor_index)
1404 .arg(error.
qwhat()));
1406 catch(std::exception &error)
1408 qDebug() << QString(
"Failure %1 ").arg(error.
what());
1410 return raw_spectrum;
1420 bool want_binary_data)
1428 spectrum_id.
setNativeId(QString(
"precursor=%1 idxms2=%2")
1436 qDebug() <<
"spectrum_descr.precursor_id=" << spectrum_descr.
precursor_id
1437 <<
" spectrum_descr.ms1_index=" << spectrum_descr.
ms1_index
1438 <<
" spectrum_descr.ms2_index=" << spectrum_descr.
ms2_index;
1449 QString(
"frame=%1 begin=%2 end=%3 precursor=%4 idxms1=%5")
1475 std::map<quint32, quint32> raw_spectrum;
1479 qDebug() <<
" precursor_index=" << spectrum_descr.
precursor_id
1480 <<
" tims_id=" << tims_id
1481 << (std::size_t)QThread::currentThreadId();
1483 if(want_binary_data)
1485 qDebug() <<
"bindec";
1492 qDebug() << (std::size_t)QThread::currentThreadId();
1500 tims_frame.get()->getOneOverK0Transformation(
1505 tims_frame.get()->getOneOverK0Transformation(
1512 if(want_binary_data)
1518 if(previous_frame.get() !=
nullptr)
1520 if(previous_frame.get()->hasSameCalibrationData(
1528 "ERROR in %1 %2, different calibration data "
1529 "between frame id %3 and frame id %4")
1532 .arg(previous_frame.get()->getId())
1533 .arg(tims_frame.get()->getId()));
1536 qDebug() << (std::size_t)QThread::currentThreadId();
1538 tims_frame.get()->cumulateScansInRawMap(
1542 qDebug() << (std::size_t)QThread::currentThreadId();
1545 previous_frame = tims_frame;
1547 qDebug() <<
" precursor_index=" << spectrum_descr.
precursor_id
1549 << (std::size_t)QThread::currentThreadId();
1554 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1558 if(want_binary_data)
1560 qDebug() <<
" precursor_index=" << spectrum_descr.
precursor_id;
1566 tims_frame.get()->getTraceFromCumulatedScansBuiltinCentroid(
1574 tims_frame.get()->getTraceFromCumulatedScans(raw_spectrum);
1577 if(trace.size() > 0)
1579 qDebug() <<
" precursor_index=" << spectrum_descr.
precursor_id
1580 <<
" " << trace.size() <<
" "
1581 << (std::size_t)QThread::currentThreadId();
1595 qDebug() <<
" precursor_index=" << spectrum_descr.
precursor_id;
1614 QObject::tr(
"ERROR in %1 (ms2_index=%2 precursor_index=%3):\n%4")
1618 .arg(error.
qwhat()));
1620 catch(std::exception &error)
1622 qDebug() << QString(
"Failure %1 ").arg(error.
what());
1631 unsigned int ms_level)
1633 qDebug() <<
" ms_level=" << ms_level;
1634 if(!m_hasPrecursorTable)
1637 QObject::tr(
"unable to read spectrum list : this data file does not "
1638 "contain MS2 data, no precursor found."));
1641 QSqlDatabase qdb = openDatabaseConnection();
1642 QSqlQuery qprecursor_list = qdb.exec(QString(
1643 "SELECT PasefFrameMsMsInfo.Frame, "
1644 "PasefFrameMsMsInfo.ScanNumBegin, "
1645 "PasefFrameMsMsInfo.ScanNumEnd, "
1646 "PasefFrameMsMsInfo.IsolationMz, "
1647 "PasefFrameMsMsInfo.IsolationWidth, "
1648 "PasefFrameMsMsInfo.CollisionEnergy, "
1649 "PasefFrameMsMsInfo.Precursor, "
1651 "Precursors.LargestPeakMz, "
1652 "Precursors.AverageMz, "
1653 "Precursors.MonoisotopicMz, "
1654 "Precursors.Charge, "
1655 "Precursors.ScanNumber, "
1656 "Precursors.Intensity, "
1657 "Precursors.Parent "
1658 "FROM PasefFrameMsMsInfo "
1659 "INNER JOIN Precursors ON "
1660 "PasefFrameMsMsInfo.Precursor=Precursors.Id "
1661 "ORDER BY PasefFrameMsMsInfo.Precursor, PasefFrameMsMsInfo.Frame ;"));
1662 if(qprecursor_list.lastError().isValid())
1666 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
1667 "command %2:\n%3\n%4\n%5")
1668 .arg(m_timsDataDirectory.absoluteFilePath(
"analysis.tdf"))
1669 .arg(qprecursor_list.lastQuery())
1670 .arg(qdb.lastError().databaseText())
1671 .arg(qdb.lastError().driverText())
1672 .arg(qdb.lastError().nativeErrorCode()));
1676 qDebug() <<
"qprecursor_list.size()=" << qprecursor_list.size();
1677 qDebug() << QObject::tr(
1678 "TIMS sqlite database file %1, executing SQL "
1679 "command %2:\n%3\n%4\n%5")
1680 .arg(m_timsDataDirectory.absoluteFilePath(
"analysis.tdf"))
1681 .arg(qprecursor_list.lastQuery())
1682 .arg(qdb.lastError().databaseText())
1683 .arg(qdb.lastError().driverText())
1684 .arg(qdb.lastError().nativeErrorCode());
1686 qDebug() <<
"qprecursor_list.isActive()=" << qprecursor_list.isActive();
1687 qDebug() <<
"qprecursor_list.isSelect()=" << qprecursor_list.isSelect();
1697 qprecursor_list.last();
1700 qDebug() <<
"qprecursor_list.at()=" << qprecursor_list.at();
1701 qprecursor_list.first();
1702 std::vector<pappso::TimsData::SpectrumDescr> spectrum_description_list;
1710 (std::size_t)qprecursor_list.value(6).toLongLong())
1715 spectrum_description_list.push_back(spectrum_descr);
1721 qDebug() <<
" qprecursor_list.value(6).toLongLong() ="
1722 << qprecursor_list.value(6).toLongLong();
1724 (std::size_t)qprecursor_list.value(6).toLongLong();
1725 qDebug() <<
" spectrum_descr.precursor_id ="
1727 qDebug() <<
" cumul tims frame:" << qprecursor_list.value(0).toLongLong();
1729 qprecursor_list.value(0).toLongLong());
1730 qDebug() <<
" first =" << first;
1739 qprecursor_list.value(11).toInt(),
1740 qprecursor_list.value(13).toDouble());
1747 qprecursor_list.value(1).toLongLong();
1749 qprecursor_list.value(2).toLongLong();
1751 spectrum_descr.
isolationMz = qprecursor_list.value(3).toDouble();
1752 spectrum_descr.
isolationWidth = qprecursor_list.value(4).toDouble();
1754 spectrum_descr.
parent_frame = qprecursor_list.value(14).toLongLong();
1764 while(qprecursor_list.next());
1771 spectrum_description_list.push_back(spectrum_descr);
1775 QString local_filepath = m_timsDataDirectory.absoluteFilePath(
"analysis.tdf");
1779 for(
SpectrumDescr &spectrum_descr : spectrum_description_list)
1782 std::vector<QualifiedMassSpectrum> mass_spectrum_list;
1783 ms2ReaderGenerateMS1MS2Spectrum(
1784 msrun_id, mass_spectrum_list, handler, spectrum_descr, ms_level);
1786 for(
auto &qualified_spectrum : mass_spectrum_list)
1793 qDebug() <<
"The operation was cancelled. Breaking the loop.";
1795 QObject::tr(
"reading TimsTOF job cancelled by the user :\n%1")
1796 .arg(local_filepath));
1808 std::function<std::vector<QualifiedMassSpectrum>(
1810 map_function_generate_spectrum =
1811 [itself, msrun_id, pointer_handler, ms_level](
1813 -> std::vector<QualifiedMassSpectrum> {
1814 std::vector<QualifiedMassSpectrum> mass_spectrum_list;
1822 return mass_spectrum_list;
1827 const std::vector<QualifiedMassSpectrum> &qualified_spectrum_list)>
1828 reduce_function_spectrum_list =
1829 [pointer_handler, local_filepath](
1831 const std::vector<QualifiedMassSpectrum> &qualified_spectrum_list) {
1832 for(
auto &qualified_spectrum : qualified_spectrum_list)
1839 qDebug() <<
"The operation was cancelled. Breaking the loop.";
1841 QObject::tr(
"reading TimsTOF job on %1 cancelled by the user")
1842 .arg(local_filepath));
1848 QFuture<std::size_t>
res;
1849 res = QtConcurrent::mappedReduced<std::size_t>(
1850 spectrum_description_list.begin(),
1851 spectrum_description_list.end(),
1852 map_function_generate_spectrum,
1853 reduce_function_spectrum_list,
1854 QtConcurrent::OrderedReduce);
1855 res.waitForFinished();
1858 mpa_timsBinDec->closeLinearRead();
1865 std::vector<QualifiedMassSpectrum> &qualified_mass_spectrum_list,
1868 unsigned int ms_level)
1871 qDebug() <<
" ms_level=" << ms_level;
1874 if((ms_level == 0) || (ms_level == 1))
1877 getQualifiedMs1MassSpectrumByPrecursorId(
1879 qualified_mass_spectrum_list.back(),
1883 if((ms_level == 0) || (ms_level == 2))
1886 getQualifiedMs2MassSpectrumByPrecursorId(
1888 qualified_mass_spectrum_list.back(),
1901 QSqlDatabase qdb = openDatabaseConnection();
1902 QSqlQuery q = qdb.exec(QString(
"SELECT PasefFrameMsMsInfo.Frame, "
1903 "PasefFrameMsMsInfo.ScanNumBegin, "
1904 "PasefFrameMsMsInfo.ScanNumEnd, "
1905 "PasefFrameMsMsInfo.IsolationMz, "
1906 "PasefFrameMsMsInfo.IsolationWidth, "
1907 "PasefFrameMsMsInfo.CollisionEnergy, "
1908 "PasefFrameMsMsInfo.Precursor, "
1910 "Precursors.LargestPeakMz, "
1911 "Precursors.AverageMz, "
1912 "Precursors.MonoisotopicMz, "
1913 "Precursors.Charge, "
1914 "Precursors.ScanNumber, "
1915 "Precursors.Intensity, "
1916 "Precursors.Parent "
1917 "FROM PasefFrameMsMsInfo "
1918 "INNER JOIN Precursors ON "
1919 "PasefFrameMsMsInfo.Precursor=Precursors.Id "
1920 "WHERE Precursors.Id=%1;")
1921 .arg(precursor_id));
1922 if(q.lastError().isValid())
1926 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
1927 "command %2:\n%3\n%4\n%5")
1928 .arg(m_timsDataDirectory.absoluteFilePath(
"analysis.tdf"))
1930 .arg(qdb.lastError().databaseText())
1931 .arg(qdb.lastError().driverText())
1932 .arg(qdb.lastError().nativeErrorCode()));
1940 qDebug() <<
" cumul tims frame:" << q.value(0).toLongLong();
1949 q.value(11).toInt(),
1950 q.value(13).toDouble());
1959 spectrum_descr.
isolationMz = q.value(3).toDouble();
1962 spectrum_descr.
parent_frame = q.value(14).toLongLong();
1971 QObject::tr(
"ERROR in %1 %2 : precursor id (%3) NOT FOUND ")
1974 .arg(precursor_id));
1976 return spectrum_descr;
1982 std::vector<double> timeline;
1983 timeline.reserve(m_mapFramesRecord.size());
1986 if(frame_record.mz_calibration_id != 0)
1988 timeline.push_back(frame_record.frame_time);
1996 const std::pair<std::size_t, std::size_t> &scan_coordinate)
2000 QSqlDatabase qdb = openDatabaseConnection();
2002 qdb.exec(QString(
"SELECT PasefFrameMsMsInfo.Frame, "
2003 "PasefFrameMsMsInfo.ScanNumBegin, "
2004 "PasefFrameMsMsInfo.ScanNumEnd, "
2005 "PasefFrameMsMsInfo.IsolationMz, "
2006 "PasefFrameMsMsInfo.IsolationWidth, "
2007 "PasefFrameMsMsInfo.CollisionEnergy, "
2008 "PasefFrameMsMsInfo.Precursor, "
2010 "Precursors.LargestPeakMz, "
2011 "Precursors.AverageMz, "
2012 "Precursors.MonoisotopicMz, "
2013 "Precursors.Charge, "
2014 "Precursors.ScanNumber, "
2015 "Precursors.Intensity, "
2016 "Precursors.Parent "
2017 "FROM PasefFrameMsMsInfo "
2018 "INNER JOIN Precursors ON "
2019 "PasefFrameMsMsInfo.Precursor=Precursors.Id "
2021 "PasefFrameMsMsInfo.Frame=%1 and "
2022 "(PasefFrameMsMsInfo.ScanNumBegin "
2023 "<= %2 and PasefFrameMsMsInfo.ScanNumEnd >= %2);")
2024 .arg(scan_coordinate.first)
2025 .arg(scan_coordinate.second));
2026 if(q.lastError().isValid())
2030 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
2031 "command %2:\n%3\n%4\n%5")
2032 .arg(m_timsDataDirectory.absoluteFilePath(
"analysis.tdf"))
2034 .arg(qdb.lastError().databaseText())
2035 .arg(qdb.lastError().driverText())
2036 .arg(qdb.lastError().nativeErrorCode()));
2042 qDebug() <<
" cumul tims frame:" << q.value(0).toLongLong();
2048 q.value(10).toDouble(), q.value(11).toInt(), q.value(13).toDouble());
2057 spectrum_descr.
isolationMz = q.value(3).toDouble();
2060 spectrum_descr.
parent_frame = q.value(14).toLongLong();
2062 return spectrum_descr;
2073 qprecursor_list.value(0).toLongLong());
2079 qprecursor_list.value(11).toInt(),
2080 qprecursor_list.value(13).toDouble());
2082 spectrum_descr.
precursor_id = qprecursor_list.value(6).toLongLong();
2089 spectrum_descr.
isolationMz = qprecursor_list.value(3).toDouble();
2090 spectrum_descr.
isolationWidth = qprecursor_list.value(4).toDouble();
2092 spectrum_descr.
parent_frame = qprecursor_list.value(14).toLongLong();
2100 unsigned int ms_level)
2103 if(!m_hasPrecursorTable)
2106 QObject::tr(
"unable to read spectrum list : this data file does not "
2107 "contain MS2 data, no precursor found."));
2111 std::size_t spectrum_list_size = getTotalNumberOfScans();
2119 QSqlDatabase qdb = openDatabaseConnection();
2120 QSqlQuery qprecursor_list = qdb.exec(QString(
2122 "PasefFrameMsMsInfo.Frame, "
2123 "PasefFrameMsMsInfo.ScanNumBegin, "
2124 "PasefFrameMsMsInfo.ScanNumEnd, "
2125 "PasefFrameMsMsInfo.IsolationMz, "
2126 "PasefFrameMsMsInfo.IsolationWidth, "
2127 "PasefFrameMsMsInfo.CollisionEnergy, "
2128 "PasefFrameMsMsInfo.Precursor, "
2130 "Precursors.LargestPeakMz, "
2131 "Precursors.AverageMz, "
2132 "Precursors.MonoisotopicMz, "
2133 "Precursors.Charge, "
2134 "Precursors.ScanNumber, "
2135 "Precursors.Intensity, "
2136 "Precursors.Parent "
2137 "FROM PasefFrameMsMsInfo "
2138 "INNER JOIN Precursors ON "
2139 "PasefFrameMsMsInfo.Precursor=Precursors.Id "
2140 "ORDER BY PasefFrameMsMsInfo.Frame, PasefFrameMsMsInfo.ScanNumBegin ;"));
2141 if(qprecursor_list.lastError().isValid())
2144 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
2145 "command %2:\n%3\n%4\n%5")
2146 .arg(m_timsDataDirectory.absoluteFilePath(
"analysis.tdf"))
2147 .arg(qprecursor_list.lastQuery())
2148 .arg(qdb.lastError().databaseText())
2149 .arg(qdb.lastError().driverText())
2150 .arg(qdb.lastError().nativeErrorCode()));
2156 qprecursor_list.last();
2159 qDebug() <<
"qprecursor_list.at()=" << qprecursor_list.at();
2160 qprecursor_list.first();
2172 qDebug() <<
"The operation was cancelled. Breaking the loop.";
2174 QObject::tr(
"reading TimsTOF job cancelled by the user :\n%1")
2175 .arg(m_timsDataDirectory.absoluteFilePath(
"analysis.tdf")));
2178 tims_frame = getTimsFrameBaseCstSPtrCached(current_frame.m_frameId);
2179 unsigned int tims_ms_level = tims_frame.get()->getMsLevel();
2181 if((ms_level != 0) && (ms_level != tims_ms_level))
2183 i += current_frame.m_size;
2188 qDebug() <<
"want_binary_data=" << want_binary_data;
2189 if(want_binary_data)
2191 qDebug() <<
"bindec";
2192 tims_frame = getTimsFrameCstSPtrCached(current_frame.m_frameId);
2195 bool possible_precursor =
false;
2196 if(tims_ms_level == 2)
2199 while(qprecursor_list.value(0).toULongLong() <
2200 current_frame.m_frameId)
2202 qprecursor_list.next();
2204 if(qprecursor_list.value(0).toULongLong() ==
2205 current_frame.m_frameId)
2207 possible_precursor =
true;
2209 fillSpectrumDescriptionWithSqlRecord(spectrum_descr,
2214 for(std::size_t scan_num = 0; scan_num < current_frame.m_size;
2217 bool has_a_precursor =
false;
2218 if(possible_precursor)
2223 while(qprecursor_list.value(0).toULongLong() <
2224 current_frame.m_frameId)
2226 qprecursor_list.next();
2228 if(qprecursor_list.value(0).toULongLong() !=
2229 current_frame.m_frameId)
2231 possible_precursor =
false;
2233 fillSpectrumDescriptionWithSqlRecord(spectrum_descr,
2238 if(possible_precursor &&
2242 has_a_precursor =
true;
2254 spectrum_id.
setNativeId(QString(
"frame=%1 scan=%2 index=%3")
2255 .arg(current_frame.m_frameId)
2261 mass_spectrum.
setMsLevel(tims_frame.get()->getMsLevel());
2265 tims_frame.get()->getDriftTime(scan_num));
2269 tims_frame.get()->getOneOverK0Transformation(scan_num));
2272 if(want_binary_data)
2277 tims_frame.get()->getMassSpectrumSPtr(scan_num));
2283 "ERROR in %1 (scan_num=%2 spectrum_index=%3):\n%4")
2287 .arg(error.
qwhat()));
2289 if(mass_spectrum.
size() > 0)
2309 std::size_t prec_spectrum_index =
2314 prec_spectrum_index);
2316 QString(
"frame=%1 scan=%2 index=%3")
2319 .arg(prec_spectrum_index));
2344 std::map<quint32, quint32>
2348 qDebug() <<
" spectrum_index=" << spectrum_index;
2353 std::map<quint32, quint32> raw_spectrum;
2354 tims_frame.get()->cumulateScansInRawMap(
2355 raw_spectrum, coordinate.second, coordinate.second);
2356 return raw_spectrum;
2360 const std::vector<FrameIdDescr> &
void setNativeId(const QString &native_id)
void setMsRunId(MsRunIdCstSPtr other)
std::size_t getSpectrumIndex() const
void setSpectrumIndex(std::size_t index)
Class to represent a mass spectrum.
MzCalibrationInterfaceSPtr getInstance(double T1_frame, double T2_frame, const QSqlRecord &mzcalibration_record)
virtual const QString & qwhat() const
const char * what() const noexcept override
Class representing a fully specified mass spectrum.
void setPrecursorNativeId(const QString &native_id)
Set the scan native id of the precursor ion.
void setDtInMilliSeconds(pappso_double rt)
Set the drift time in milliseconds.
void appendPrecursorIonData(const PrecursorIonData &precursor_ion_data)
void setMassSpectrumId(const MassSpectrumId &iD)
Set the MassSpectrumId.
void setMsLevel(uint ms_level)
Set the mass spectrum level.
void setPrecursorSpectrumIndex(std::size_t precursor_scan_num)
Set the scan number of the precursor ion.
void setParameterValue(QualifiedMassSpectrumParameter parameter, const QVariant &value)
void setMassSpectrumSPtr(MassSpectrumSPtr massSpectrum)
Set the MassSpectrumSPtr.
void setRtInSeconds(pappso_double rt)
Set the retention time in seconds.
void setEmptyMassSpectrum(bool is_empty_mass_spectrum)
interface to collect spectrums from the MsRunReader class
virtual bool shouldStop()
virtual void loadingEnded()
virtual bool needMsLevelPeakList(unsigned int ms_level) const final
tells if we need the peak list (if we want the binary data) for each spectrum, given an MS level
virtual void spectrumListHasSize(std::size_t size)
virtual void setQualifiedMassSpectrum(const QualifiedMassSpectrum &spectrum)=0
TimsFrameSPtr getTimsFrameSPtrByOffset(std::size_t frameId, const std::vector< pappso::TimsFrameRecord > &frame_record_list)
QSqlDatabase openDatabaseConnection() const
TimsFrameCstSPtr getTimsFrameCstSPtr(std::size_t timsId)
get a Tims frame with his database ID
std::vector< FrameIdDescr > m_frameIdDescrList
store every frame id and corresponding sizes
void ms2ReaderSpectrumCollectionByMsLevel(const MsRunIdCstSPtr &msrun_id, SpectrumCollectionHandlerInterface &handler, unsigned int ms_level)
function to visit an MsRunReader and get each Spectrum in a spectrum collection handler by Ms Levels
TimsFrameCstSPtr getTimsFrameCstSPtrCached(std::size_t timsId)
get a Tims frame with his database ID but look in the cache first
pappso::MassSpectrumCstSPtr getMassSpectrumCstSPtrByRawIndex(std::size_t raw_index)
get a mass spectrum given its spectrum index
void getQualifiedMs1MassSpectrumByPrecursorId(const MsRunIdCstSPtr &msrun_id, QualifiedMassSpectrum &mass_spectrum, const SpectrumDescr &spectrum_descr, bool want_binary_data)
SpectrumDescr getSpectrumDescrWithPrecursorId(std::size_t precursor_id)
get an intermediate structure describing a spectrum
const std::vector< FrameIdDescr > & getFrameIdDescrList() const
std::size_t getTotalNumberOfFrames() const
Get total number of frames.
void getQualifiedMs2MassSpectrumByPrecursorId(const MsRunIdCstSPtr &msrun_id, QualifiedMassSpectrum &mass_spectrum, const SpectrumDescr &spectrum_descr, bool want_binary_data)
TimsData(QDir timsDataDirectory)
build using the tims data directory
std::map< quint32, quint32 > getRawMs2ByPrecursorId(std::size_t precursor_index)
get cumulated raw signal for a given precursor only to use to see the raw signal
std::size_t m_totalNumberOfFrames
Trace getTicChromatogram() const
TimsFrameBaseCstSPtr getTimsFrameBaseCstSPtrCached(std::size_t timsId)
std::size_t m_totalNumberOfScans
std::deque< TimsFrameCstSPtr > m_timsFrameCache
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
std::pair< std::size_t, std::size_t > getScanCoordinateFromRawIndex(std::size_t spectrum_index) const
std::vector< TimsFrameRecord > m_mapFramesRecord
std::vector< std::size_t > getClosestPrecursorIdByMz(std::vector< std::vector< double >> ids, double mz_value)
std::map< int, QSqlRecord > m_mapMzCalibrationRecord
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
void fillSpectrumDescriptionWithSqlRecord(SpectrumDescr &spectrum_descr, QSqlQuery &qprecursor_list)
std::map< int, QSqlRecord > m_mapTimsCalibrationRecord
bool m_builtinMs2Centroid
enable builtin centroid on raw tims integers by default
void setMs2BuiltinCentroid(bool centroid)
enable or disable simple centroid filter on raw tims data for MS2
void fillFrameIdDescrList()
private function to fill m_frameIdDescrList
TimsFrameBaseCstSPtr getTimsFrameBaseCstSPtr(std::size_t timsId)
get a Tims frame base (no binary data file access) with his database ID
void rawReaderSpectrumCollectionByMsLevel(const MsRunIdCstSPtr &msrun_id, SpectrumCollectionHandlerInterface &handler, unsigned int ms_level)
function to visit an MsRunReader and get each raw Spectrum in a spectrum collection handler by Ms Lev...
std::size_t getTotalNumberOfPrecursors() const
get the number of precursors analyzes by PASEF
MzCalibrationStore * mpa_mzCalibrationStore
std::vector< std::size_t > getTimsMS1FrameIdRange(double rt_begin, double rt_end) const
virtual std::vector< double > getRetentionTimeLine() const
retention timeline get retention times along the MSrun in seconds
unsigned int getMsLevelBySpectrumIndex(std::size_t spectrum_index)
bool getMs2BuiltinCentroid() const
tells if simple centroid filter on raw tims data for MS2 is enabled or not
SpectrumDescr getSpectrumDescrWithScanCoordinate(const std::pair< std::size_t, std::size_t > &scan_coordinate)
std::map< quint32, quint32 > getRawMsBySpectrumIndex(std::size_t spectrum_index)
get raw signal for a spectrum index only to use to see the raw signal
std::deque< TimsFrameBaseCstSPtr > m_timsFrameBaseCache
std::map< std::size_t, std::size_t > m_thousandIndexToFrameIdDescrListIndex
index to find quickly a frameId in the description list with the raw index of spectrum modulo 1000 @k...
void ms2ReaderGenerateMS1MS2Spectrum(const MsRunIdCstSPtr &msrun_id, std::vector< QualifiedMassSpectrum > &qualified_mass_spectrum_list, SpectrumCollectionHandlerInterface &handler, const SpectrumDescr &spectrum_descr, unsigned int ms_level)
TimsBinDec * mpa_timsBinDec
void getQualifiedMassSpectrumByRawIndex(const MsRunIdCstSPtr &msrun_id, QualifiedMassSpectrum &mass_spectrum, std::size_t spectrum_index, bool want_binary_data)
void setMs1FilterCstSPtr(pappso::FilterInterfaceCstSPtr &filter)
filter interface to apply just after raw MS1 specturm extraction the filter can be a list of filters ...
void setMs2FilterCstSPtr(pappso::FilterInterfaceCstSPtr &filter)
filter interface to apply just after raw MS2 specturm extraction the filter can be a list of filters ...
pappso::FilterInterfaceCstSPtr mcsp_ms1Filter
std::size_t getTotalNumberOfScans() const
get the total number of scans
std::vector< std::size_t > getMatchPrecursorIdByKo(std::vector< std::vector< double >> ids, double ko_value)
std::size_t getRawIndexFromCoordinate(std::size_t frame_id, std::size_t scan_num) const
pappso::FilterInterfaceCstSPtr mcsp_ms2Filter
void setMonoThread(bool is_mono_thread)
set only one is_mono_thread to true
XicCoordTims getXicCoordTimsFromPrecursorId(std::size_t precursor_id, PrecisionPtr precision_ptr)
std::size_t m_totalNumberOfPrecursors
virtual MapTrace & combine(MapTrace &map_trace, const Trace &trace) const override
A simple container of DataPoint instances.
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
std::shared_ptr< const TimsFrameBase > TimsFrameBaseCstSPtr
std::shared_ptr< TimsFrame > TimsFrameSPtr
std::shared_ptr< TimsFrameBase > TimsFrameBaseSPtr
std::shared_ptr< const MsRunId > MsRunIdCstSPtr
std::shared_ptr< const MassSpectrum > MassSpectrumCstSPtr
@ CollisionEnergy
Bruker's Tims tof collision energy.
@ IsolationMz
isolation window
@ OneOverK0
1/kO of a simple scan
@ OneOverK0end
1/k0 of last acquisition for composite pasef MS/MS spectrum
@ IsolationWidth
isolation window width
@ BrukerPrecursorIndex
Bruker's Tims tof precursor index.
std::shared_ptr< const FilterInterface > FilterInterfaceCstSPtr
std::shared_ptr< const TimsFrame > TimsFrameCstSPtr
std::size_t scan_mobility_end
std::vector< std::size_t > tims_frame_list
PrecursorIonData precursor_ion_data
std::size_t scan_mobility_start
std::size_t mz_calibration_id
std::size_t tims_calibration_id
coordinates of the XIC to extract and the resulting XIC after extraction
std::size_t scanNumEnd
mobility index end
std::size_t scanNumBegin
mobility index begin
XicSPtr xicSptr
extracted xic
double rtTarget
the targeted retention time to extract around intended in seconds, and related to one msrun....
MzRange mzRange
the mass to extract