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"
38#include <QMutexLocker>
41#include <QtConcurrent>
47 : m_timsDataDirectory(timsDataDirectory)
50 qDebug() <<
"Start of construction of TimsData";
55 QObject::tr(
"ERROR TIMS data directory %1 not found")
63 QObject::tr(
"ERROR TIMS data directory, %1 sqlite file not found")
72 if(!q.exec(
"select Key, Value from GlobalMetadata where "
73 "Key='TimsCompressionType';"))
78 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
79 "command %2:\n%3\n%4\n%5")
82 .arg(q.lastError().databaseText())
83 .arg(q.lastError().driverText())
84 .arg(q.lastError().nativeErrorCode()));
88 int compression_type = 0;
91 compression_type = q.value(1).toInt();
93 qDebug() <<
" compression_type=" << compression_type;
102 if(!q.exec(
"SELECT COUNT( DISTINCT Id) FROM Precursors;"))
119 if(!q.exec(
"SELECT SUM(NumScans),COUNT(Id) FROM Frames"))
123 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
124 "command %2:\n%3\n%4\n%5")
127 .arg(qdb.lastError().databaseText())
128 .arg(qdb.lastError().driverText())
129 .arg(qdb.lastError().nativeErrorCode()));
137 if(!q.exec(
"select * from MzCalibration;"))
141 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
142 "command %2:\n%3\n%4\n%5")
145 .arg(q.lastError().databaseText())
146 .arg(q.lastError().driverText())
147 .arg(q.lastError().nativeErrorCode()));
152 QSqlRecord record = q.record();
154 std::pair<int, QSqlRecord>(record.value(0).toInt(), record));
159 if(!q.exec(
"select * from TimsCalibration;"))
163 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
164 "command %2:\n%3\n%4\n%5")
167 .arg(q.lastError().databaseText())
168 .arg(q.lastError().driverText())
169 .arg(q.lastError().nativeErrorCode()));
173 QSqlRecord record = q.record();
175 std::pair<int, QSqlRecord>(record.value(0).toInt(), record));
180 if(!q.exec(
"select Frames.TimsId, Frames.AccumulationTime, "
181 "Frames.MzCalibration, "
182 "Frames.T1, Frames.T2, "
183 "Frames.Time, Frames.MsMsType, Frames.TimsCalibration, "
189 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
190 "command %2:\n%3\n%4\n%5")
193 .arg(q.lastError().databaseText())
194 .arg(q.lastError().driverText())
195 .arg(q.lastError().nativeErrorCode()));
201 QSqlRecord record = q.record();
205 frame_record.
frame_id = record.value(8).toULongLong();
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;
339std::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_id=%1 scan_index=%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")
491std::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));
575 "ERROR MzCalibration database id %1 not found for frame_id=%2")
582 tims_frame.get()->setTime(frame_record.
frame_time);
583 tims_frame.get()->setMsMsType(frame_record.
msms_type);
586 auto it_map_record_tims_calibration =
591 tims_frame.get()->setTimsCalibration(
592 it_map_record_tims_calibration->second.value(1).toInt(),
593 it_map_record_tims_calibration->second.value(2).toDouble(),
594 it_map_record_tims_calibration->second.value(3).toDouble(),
595 it_map_record_tims_calibration->second.value(4).toDouble(),
596 it_map_record_tims_calibration->second.value(5).toDouble(),
597 it_map_record_tims_calibration->second.value(6).toDouble(),
598 it_map_record_tims_calibration->second.value(7).toDouble(),
599 it_map_record_tims_calibration->second.value(8).toDouble(),
600 it_map_record_tims_calibration->second.value(9).toDouble(),
601 it_map_record_tims_calibration->second.value(10).toDouble(),
602 it_map_record_tims_calibration->second.value(11).toDouble());
607 QObject::tr(
"ERROR TimsCalibration database id %1 not found")
618 qDebug() <<
" timsId=" << timsId <<
" scanNum=" << scanNum;
621 return frame->getMassSpectrumCstSPtr(scanNum);
645std::vector<std::size_t>
651 std::vector<std::size_t> precursor_ids;
652 std::vector<std::vector<double>> ids;
655 QSqlQuery q = qdb.exec(
657 "SELECT Frames.Time, Precursors.MonoisotopicMz, Precursors.Charge, "
658 "Precursors.Id, Frames.Id, PasefFrameMsMsInfo.ScanNumBegin, "
659 "PasefFrameMsMsInfo.scanNumEnd "
661 "INNER JOIN PasefFrameMsMsInfo ON Frames.Id = PasefFrameMsMsInfo.Frame "
662 "INNER JOIN Precursors ON PasefFrameMsMsInfo.Precursor = Precursors.Id "
663 "WHERE Precursors.Charge == %1 "
664 "AND Precursors.MonoisotopicMz > %2 -0.01 "
665 "AND Precursors.MonoisotopicMz < %2 +0.01 "
666 "AND Frames.Time >= %3 -1 "
667 "AND Frames.Time < %3 +1; ")
671 if(q.lastError().isValid())
675 QObject::tr(
"ERROR in TIMS sqlite database file %1, database name %2, "
677 "command %3:\n%4\n%5\n%6")
679 .arg(qdb.databaseName())
681 .arg(qdb.lastError().databaseText())
682 .arg(qdb.lastError().driverText())
683 .arg(qdb.lastError().nativeErrorCode()));
690 std::vector<double> sql_values;
691 sql_values.push_back(q.value(4).toDouble());
692 sql_values.push_back(q.value(3).toDouble());
693 sql_values.push_back(q.value(5).toDouble());
694 sql_values.push_back(q.value(6).toDouble());
695 sql_values.push_back(q.value(1).toDouble());
697 ids.push_back(sql_values);
700 if(std::find(precursor_ids.begin(),
702 q.value(3).toDouble()) == precursor_ids.end())
704 precursor_ids.push_back(q.value(3).toDouble());
708 if(precursor_ids.size() > 1)
712 if(precursor_ids.size() > 1)
716 return precursor_ids;
720 return precursor_ids;
724std::vector<std::size_t>
728 std::vector<std::size_t> precursor_id;
729 for(std::vector<double> index : ids)
736 double bko = tims_frame.get()->getOneOverK0Transformation(index[2]);
737 double eko = tims_frame.get()->getOneOverK0Transformation(index[3]);
740 double mean_ko = (bko + eko) / 2;
742 if(mean_ko > ko_value - 0.1 && mean_ko < ko_value + 0.1)
744 precursor_id.push_back(index[1]);
750std::vector<std::size_t>
754 std::vector<std::size_t> best_precursor;
755 double best_value = 1;
757 int best_val_position = 0;
759 for(std::vector<double> values : ids)
761 double new_val = abs(mz_value - values[4]);
762 if(new_val < best_value)
764 best_value = new_val;
765 best_val_position = count;
769 best_precursor.push_back(ids[best_val_position][1]);
770 return best_precursor;
779 return tims_frame.get()->getMsLevel();
787 std::size_t spectrum_index,
788 bool want_binary_data)
807 QString(
"frame_id=%1 scan_index=%2 global_scan_index=%3")
808 .arg(coordinate.first)
809 .arg(coordinate.second)
810 .arg(spectrum_index));
814 mass_spectrum.
setMsLevel(tims_frame.get()->getMsLevel());
818 tims_frame.get()->getDriftTime(coordinate.second));
822 tims_frame.get()->getOneOverK0Transformation(coordinate.second));
828 tims_frame.get()->getMassSpectrumSPtr(coordinate.second));
829 if(mass_spectrum.
size() > 0)
841 if(tims_frame.get()->getMsLevel() > 1)
845 if(spectrum_descr.precursor_id > 0)
849 spectrum_descr.precursor_ion_data);
854 spectrum_descr.parent_frame, coordinate.second);
858 QString(
"frame_id=%1 scan_index=%2 global_scan_index=%3")
859 .arg(spectrum_descr.parent_frame)
860 .arg(coordinate.second)
861 .arg(prec_spectrum_index));
865 spectrum_descr.isolationMz);
868 spectrum_descr.isolationWidth);
872 spectrum_descr.collisionEnergy);
875 (quint64)spectrum_descr.precursor_id);
882 QObject::tr(
"Error TimsData::getQualifiedMassSpectrumByRawIndex "
883 "spectrum_index=%1 :\n%2")
885 .arg(error.
qwhat()));
899 using Pair = std::pair<double, double>;
900 using Map = std::map<double, double>;
901 using Iterator = Map::iterator;
906 qdb.exec(QString(
"SELECT Time, SummedIntensities "
907 "FROM Frames WHERE MsMsType = 0 "
910 if(q.lastError().isValid())
914 QObject::tr(
"ERROR in TIMS sqlite database file %1, database name %2, "
916 "command %3:\n%4\n%5\n%6")
918 .arg(qdb.databaseName())
920 .arg(qdb.lastError().databaseText())
921 .arg(qdb.lastError().driverText())
922 .arg(qdb.lastError().nativeErrorCode()));
930 int cumulated_results = 2;
932 double rt = q.value(0).toDouble(&ok);
933 cumulated_results -= ok;
935 double sumY = q.value(1).toDouble(&ok);
936 cumulated_results -= ok;
938 if(cumulated_results)
942 "ERROR in TIMS sqlite database file: could not read either the "
943 "retention time or the summed intensities (%1, database name "
946 "command %3:\n%4\n%5\n%6")
948 .arg(qdb.databaseName())
950 .arg(qdb.lastError().databaseText())
951 .arg(qdb.lastError().driverText())
952 .arg(qdb.lastError().nativeErrorCode()));
956 std::pair<Iterator, bool>
res = rt_tic_map_trace.insert(Pair(
rt, sumY));
963 res.first->second += sumY;
970 return rt_tic_map_trace.
toTrace();
979 bool want_binary_data)
982 qDebug() <<
" ms2_index=" << spectrum_descr.
ms2_index
997 QString(
"frame_id=%1 begin=%2 end=%3 precursor=%4 idxms1=%5")
1010 if(want_binary_data)
1012 qDebug() <<
"bindec";
1024 tims_frame.get()->getOneOverK0Transformation(
1029 tims_frame.get()->getOneOverK0Transformation(
1033 if(want_binary_data)
1035 combiner.
combine(combiner_result,
1036 tims_frame.get()->cumulateScansToTrace(
1040 Trace trace(combiner_result);
1043 if(trace.size() > 0)
1068 catch(std::exception &error)
1070 qDebug() << QString(
"Failure %1 ").arg(error.
what());
1078 QMutexLocker locker(&
m_mutex);
1081 if(tims_frame.get()->getId() == timsId)
1100 QMutexLocker locker(&
m_mutex);
1103 if(tims_frame.get()->getId() == timsId)
1221 QSqlQuery q = qdb.exec(
1222 QString(
"SELECT Precursors.id, "
1223 "min(Frames.Time), "
1224 "min(PasefFrameMsMsInfo.ScanNumBegin), "
1225 "max(PasefFrameMsMsInfo.ScanNumEnd), "
1226 "Precursors.MonoisotopicMz "
1228 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1229 "PasefFrameMsMsInfo.Precursor=Precursors.Id INNER JOIN "
1230 "Frames ON PasefFrameMsMsInfo.Frame=Frames.Id "
1231 "GROUP BY Precursors.id;"));
1232 if(q.lastError().isValid())
1237 "ERROR in TIMS sqlite database file %1, executing SQL "
1238 "command %2:\n%3\n%4\n%5")
1241 .arg(qdb.lastError().databaseText())
1242 .arg(qdb.lastError().driverText())
1243 .arg(qdb.lastError().nativeErrorCode()));
1252 QSqlRecord record = q.record();
1254 (std::size_t)record.value(0).toULongLong(), record));
1265 QObject::tr(
"ERROR Precursors database id %1 not found")
1266 .arg(precursor_id));
1269 auto &q = it_map_xiccoord->second;
1270 xic_coord_tims_struct.
mzRange =
1271 MzRange(q.value(4).toDouble(), precision_ptr);
1272 xic_coord_tims_struct.
scanNumBegin = q.value(2).toUInt();
1273 xic_coord_tims_struct.
scanNumEnd = q.value(3).toUInt();
1274 xic_coord_tims_struct.
rtTarget = q.value(1).toDouble();
1276 xic_coord_tims_struct.
xicSptr = std::make_shared<Xic>();
1282 catch(std::exception &error)
1284 qDebug() << QString(
"Failure %1 ").arg(error.
what());
1286 return xic_coord_tims_struct;
1302 qdb.exec(QString(
"SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
1303 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1304 "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
1305 "Precursors.Id=%1;")
1306 .arg(precursor_index));
1307 if(q.lastError().isValid())
1311 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
1312 "command %2:\n%3\n%4\n%5")
1315 .arg(qdb.lastError().databaseText())
1316 .arg(qdb.lastError().driverText())
1317 .arg(qdb.lastError().nativeErrorCode()));
1326 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1328 .arg(precursor_index));
1335 std::size_t scan_mobility_start = 0;
1336 std::size_t scan_mobility_end = 0;
1337 std::vector<std::size_t> tims_frame_list;
1341 tims_frame_list.push_back(q.value(0).toLongLong());
1345 scan_mobility_start = q.value(1).toLongLong();
1346 scan_mobility_end = q.value(2).toLongLong();
1356 for(std::size_t tims_id : tims_frame_list)
1363 if(previous_frame.get() !=
nullptr)
1365 if(previous_frame.get()->hasSameCalibrationData(
1373 "ERROR in %1 %2, different calibration data "
1374 "between frame id %3 and frame id %4")
1377 .arg(previous_frame.get()->getId())
1378 .arg(tims_frame.get()->getId()));
1381 tims_frame.get()->cumulateScansInRawMap(
1382 raw_spectrum, scan_mobility_start, scan_mobility_end);
1385 previous_frame = tims_frame;
1387 qDebug() <<
" precursor_index=" << precursor_index
1388 <<
" num_rows=" << tims_frame_list.size()
1389 <<
" sql=" << q.lastQuery() <<
" "
1390 << (std::size_t)QThread::currentThreadId();
1395 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1397 .arg(precursor_index));
1405 throw PappsoException(QObject::tr(
"ERROR in %1 (precursor_index=%2):\n%3")
1407 .arg(precursor_index)
1408 .arg(error.
qwhat()));
1410 catch(std::exception &error)
1412 qDebug() << QString(
"Failure %1 ").arg(error.
what());
1414 return raw_spectrum;
1424 bool want_binary_data)
1432 spectrum_id.
setNativeId(QString(
"precursor=%1 idxms2=%2")
1440 qDebug() <<
"spectrum_descr.precursor_id=" << spectrum_descr.
precursor_id
1441 <<
" spectrum_descr.ms1_index=" << spectrum_descr.
ms1_index
1442 <<
" spectrum_descr.ms2_index=" << spectrum_descr.
ms2_index;
1453 QString(
"frame_id=%1 begin=%2 end=%3 precursor=%4 idxms1=%5")
1485 qDebug() <<
" precursor_index=" << spectrum_descr.
precursor_id
1486 <<
" tims_id=" << tims_id
1487 << (std::size_t)QThread::currentThreadId();
1489 if(want_binary_data)
1491 qDebug() <<
"bindec";
1498 qDebug() << (std::size_t)QThread::currentThreadId();
1506 tims_frame.get()->getOneOverK0Transformation(
1511 tims_frame.get()->getOneOverK0Transformation(
1518 if(want_binary_data)
1524 if(previous_frame.get() !=
nullptr)
1526 if(previous_frame.get()->hasSameCalibrationData(
1534 "ERROR in %1 %2, different calibration data "
1535 "between frame id %3 and frame id %4")
1538 .arg(previous_frame.get()->getId())
1539 .arg(tims_frame.get()->getId()));
1542 qDebug() << (std::size_t)QThread::currentThreadId();
1544 tims_frame.get()->cumulateScansInRawMap(
1548 qDebug() << (std::size_t)QThread::currentThreadId();
1551 previous_frame = tims_frame;
1553 qDebug() <<
" precursor_index=" << spectrum_descr.
precursor_id
1555 << (std::size_t)QThread::currentThreadId();
1560 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1564 if(want_binary_data)
1566 qDebug() <<
" precursor_index=" << spectrum_descr.
precursor_id;
1575 trace = 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;
1637 QObject::tr(
"unable to read spectrum list : this data file does not "
1638 "contain MS2 data, no precursor found."));
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")
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")
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();
1699 qprecursor_list.last();
1702 qDebug() <<
"qprecursor_list.at()=" << qprecursor_list.at();
1703 qprecursor_list.first();
1704 std::vector<TimsData::SpectrumDescr> spectrum_description_list;
1712 (std::size_t)qprecursor_list.value(6).toLongLong())
1717 spectrum_description_list.push_back(spectrum_descr);
1723 qDebug() <<
" qprecursor_list.value(6).toLongLong() ="
1724 << qprecursor_list.value(6).toLongLong();
1726 (std::size_t)qprecursor_list.value(6).toLongLong();
1727 qDebug() <<
" spectrum_descr.precursor_id ="
1729 qDebug() <<
" cumul tims frame:" << qprecursor_list.value(0).toLongLong();
1731 qprecursor_list.value(0).toLongLong());
1732 qDebug() <<
" first =" << first;
1741 qprecursor_list.value(11).toInt(),
1742 qprecursor_list.value(13).toDouble());
1749 qprecursor_list.value(1).toLongLong();
1751 qprecursor_list.value(2).toLongLong();
1753 spectrum_descr.
isolationMz = qprecursor_list.value(3).toDouble();
1754 spectrum_descr.
isolationWidth = qprecursor_list.value(4).toDouble();
1756 spectrum_descr.
parent_frame = qprecursor_list.value(14).toLongLong();
1766 while(qprecursor_list.next());
1773 spectrum_description_list.push_back(spectrum_descr);
1781 for(
SpectrumDescr &spectrum_descr : spectrum_description_list)
1784 std::vector<QualifiedMassSpectrum> mass_spectrum_list;
1786 msrun_id, mass_spectrum_list, handler, spectrum_descr, ms_level);
1788 for(
auto &qualified_spectrum : mass_spectrum_list)
1795 qDebug() <<
"The operation was cancelled. Breaking the loop.";
1797 QObject::tr(
"reading TimsTOF job cancelled by the user :\n%1")
1798 .arg(local_filepath));
1810 std::function<std::vector<QualifiedMassSpectrum>(
1812 map_function_generate_spectrum =
1813 [itself, msrun_id, pointer_handler, ms_level](
1815 -> std::vector<QualifiedMassSpectrum> {
1816 std::vector<QualifiedMassSpectrum> mass_spectrum_list;
1824 return mass_spectrum_list;
1829 const std::vector<QualifiedMassSpectrum> &qualified_spectrum_list)>
1830 reduce_function_spectrum_list =
1831 [pointer_handler, local_filepath](
1833 const std::vector<QualifiedMassSpectrum> &qualified_spectrum_list) {
1834 for(
auto &qualified_spectrum : qualified_spectrum_list)
1841 qDebug() <<
"The operation was cancelled. Breaking the loop.";
1843 QObject::tr(
"reading TimsTOF job on %1 cancelled by the user")
1844 .arg(local_filepath));
1850 QFuture<std::size_t>
res;
1851 res = QtConcurrent::mappedReduced<std::size_t>(
1852 spectrum_description_list.begin(),
1853 spectrum_description_list.end(),
1854 map_function_generate_spectrum,
1855 reduce_function_spectrum_list,
1856 QtConcurrent::OrderedReduce);
1857 res.waitForFinished();
1867 std::vector<QualifiedMassSpectrum> &qualified_mass_spectrum_list,
1870 unsigned int ms_level)
1873 qDebug() <<
" ms_level=" << ms_level;
1876 if((ms_level == 0) || (ms_level == 1))
1881 qualified_mass_spectrum_list.back(),
1885 if((ms_level == 0) || (ms_level == 2))
1890 qualified_mass_spectrum_list.back(),
1904 QSqlQuery q = qdb.exec(QString(
"SELECT PasefFrameMsMsInfo.Frame, "
1905 "PasefFrameMsMsInfo.ScanNumBegin, "
1906 "PasefFrameMsMsInfo.ScanNumEnd, "
1907 "PasefFrameMsMsInfo.IsolationMz, "
1908 "PasefFrameMsMsInfo.IsolationWidth, "
1909 "PasefFrameMsMsInfo.CollisionEnergy, "
1910 "PasefFrameMsMsInfo.Precursor, "
1912 "Precursors.LargestPeakMz, "
1913 "Precursors.AverageMz, "
1914 "Precursors.MonoisotopicMz, "
1915 "Precursors.Charge, "
1916 "Precursors.ScanNumber, "
1917 "Precursors.Intensity, "
1918 "Precursors.Parent "
1919 "FROM PasefFrameMsMsInfo "
1920 "INNER JOIN Precursors ON "
1921 "PasefFrameMsMsInfo.Precursor=Precursors.Id "
1922 "WHERE Precursors.Id=%1;")
1923 .arg(precursor_id));
1924 if(q.lastError().isValid())
1928 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
1929 "command %2:\n%3\n%4\n%5")
1932 .arg(qdb.lastError().databaseText())
1933 .arg(qdb.lastError().driverText())
1934 .arg(qdb.lastError().nativeErrorCode()));
1942 qDebug() <<
" cumul tims frame:" << q.value(0).toLongLong();
1951 q.value(11).toInt(),
1952 q.value(13).toDouble());
1961 spectrum_descr.
isolationMz = q.value(3).toDouble();
1964 spectrum_descr.
parent_frame = q.value(14).toLongLong();
1973 QObject::tr(
"ERROR in %1 %2 : precursor id (%3) NOT FOUND ")
1976 .arg(precursor_id));
1978 return spectrum_descr;
1984 std::vector<double> timeline;
1988 if(frame_record.mz_calibration_id != 0)
1990 timeline.push_back(frame_record.frame_time);
1998 const std::pair<std::size_t, std::size_t> &scan_coordinate)
2004 qdb.exec(QString(
"SELECT PasefFrameMsMsInfo.Frame, "
2005 "PasefFrameMsMsInfo.ScanNumBegin, "
2006 "PasefFrameMsMsInfo.ScanNumEnd, "
2007 "PasefFrameMsMsInfo.IsolationMz, "
2008 "PasefFrameMsMsInfo.IsolationWidth, "
2009 "PasefFrameMsMsInfo.CollisionEnergy, "
2010 "PasefFrameMsMsInfo.Precursor, "
2012 "Precursors.LargestPeakMz, "
2013 "Precursors.AverageMz, "
2014 "Precursors.MonoisotopicMz, "
2015 "Precursors.Charge, "
2016 "Precursors.ScanNumber, "
2017 "Precursors.Intensity, "
2018 "Precursors.Parent "
2019 "FROM PasefFrameMsMsInfo "
2020 "INNER JOIN Precursors ON "
2021 "PasefFrameMsMsInfo.Precursor=Precursors.Id "
2023 "PasefFrameMsMsInfo.Frame=%1 and "
2024 "(PasefFrameMsMsInfo.ScanNumBegin "
2025 "<= %2 and PasefFrameMsMsInfo.ScanNumEnd >= %2);")
2026 .arg(scan_coordinate.first)
2027 .arg(scan_coordinate.second));
2028 if(q.lastError().isValid())
2032 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
2033 "command %2:\n%3\n%4\n%5")
2036 .arg(qdb.lastError().databaseText())
2037 .arg(qdb.lastError().driverText())
2038 .arg(qdb.lastError().nativeErrorCode()));
2044 qDebug() <<
" cumul tims frame:" << q.value(0).toLongLong();
2050 q.value(10).toDouble(), q.value(11).toInt(), q.value(13).toDouble());
2059 spectrum_descr.
isolationMz = q.value(3).toDouble();
2062 spectrum_descr.
parent_frame = q.value(14).toLongLong();
2064 return spectrum_descr;
2075 qprecursor_list.value(0).toLongLong());
2081 qprecursor_list.value(11).toInt(),
2082 qprecursor_list.value(13).toDouble());
2084 spectrum_descr.
precursor_id = qprecursor_list.value(6).toLongLong();
2091 spectrum_descr.
isolationMz = qprecursor_list.value(3).toDouble();
2092 spectrum_descr.
isolationWidth = qprecursor_list.value(4).toDouble();
2094 spectrum_descr.
parent_frame = qprecursor_list.value(14).toLongLong();
2102 unsigned int ms_level)
2108 QObject::tr(
"unable to read spectrum list : this data file does not "
2109 "contain MS2 data, no precursor found."));
2122 QSqlQuery qprecursor_list = qdb.exec(QString(
2124 "PasefFrameMsMsInfo.Frame, "
2125 "PasefFrameMsMsInfo.ScanNumBegin, "
2126 "PasefFrameMsMsInfo.ScanNumEnd, "
2127 "PasefFrameMsMsInfo.IsolationMz, "
2128 "PasefFrameMsMsInfo.IsolationWidth, "
2129 "PasefFrameMsMsInfo.CollisionEnergy, "
2130 "PasefFrameMsMsInfo.Precursor, "
2132 "Precursors.LargestPeakMz, "
2133 "Precursors.AverageMz, "
2134 "Precursors.MonoisotopicMz, "
2135 "Precursors.Charge, "
2136 "Precursors.ScanNumber, "
2137 "Precursors.Intensity, "
2138 "Precursors.Parent "
2139 "FROM PasefFrameMsMsInfo "
2140 "INNER JOIN Precursors ON "
2141 "PasefFrameMsMsInfo.Precursor=Precursors.Id "
2142 "ORDER BY PasefFrameMsMsInfo.Frame, PasefFrameMsMsInfo.ScanNumBegin ;"));
2143 if(qprecursor_list.lastError().isValid())
2146 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
2147 "command %2:\n%3\n%4\n%5")
2149 .arg(qprecursor_list.lastQuery())
2150 .arg(qdb.lastError().databaseText())
2151 .arg(qdb.lastError().driverText())
2152 .arg(qdb.lastError().nativeErrorCode()));
2158 qprecursor_list.last();
2161 qDebug() <<
"qprecursor_list.at()=" << qprecursor_list.at();
2162 qprecursor_list.first();
2174 qDebug() <<
"The operation was cancelled. Breaking the loop.";
2176 QObject::tr(
"reading TimsTOF job cancelled by the user :\n%1")
2181 unsigned int tims_ms_level = tims_frame.get()->getMsLevel();
2183 if((ms_level != 0) && (ms_level != tims_ms_level))
2185 i += current_frame.m_size;
2190 qDebug() <<
"want_binary_data=" << want_binary_data;
2191 if(want_binary_data)
2193 qDebug() <<
"bindec";
2197 bool possible_precursor =
false;
2198 if(tims_ms_level == 2)
2201 while(qprecursor_list.value(0).toULongLong() <
2202 current_frame.m_frameId)
2204 qprecursor_list.next();
2206 if(qprecursor_list.value(0).toULongLong() ==
2207 current_frame.m_frameId)
2209 possible_precursor =
true;
2216 for(std::size_t scan_num = 0; scan_num < current_frame.m_size;
2219 bool has_a_precursor =
false;
2220 if(possible_precursor)
2225 while(qprecursor_list.value(0).toULongLong() <
2226 current_frame.m_frameId)
2228 qprecursor_list.next();
2230 if(qprecursor_list.value(0).toULongLong() !=
2231 current_frame.m_frameId)
2233 possible_precursor =
false;
2240 if(possible_precursor &&
2244 has_a_precursor =
true;
2257 QString(
"frame_id=%1 scan_index=%2 global_scan_index=%3")
2258 .arg(current_frame.m_frameId)
2264 mass_spectrum.
setMsLevel(tims_frame.get()->getMsLevel());
2268 tims_frame.get()->getDriftTime(scan_num));
2272 tims_frame.get()->getOneOverK0Transformation(scan_num));
2275 if(want_binary_data)
2280 tims_frame.get()->getMassSpectrumSPtr(scan_num));
2286 "ERROR in %1 (scan_num=%2 spectrum_index=%3):\n%4")
2290 .arg(error.
qwhat()));
2292 if(mass_spectrum.
size() > 0)
2312 std::size_t prec_spectrum_index =
2317 prec_spectrum_index);
2320 "frame_id=%1 scan_index=%2 global_scan_index=%3")
2323 .arg(prec_spectrum_index));
2352 qDebug() <<
" spectrum_index=" << spectrum_index;
2359 tims_frame.get()->cumulateScansInRawMap(
2360 raw_spectrum, coordinate.second, coordinate.second);
2361 return raw_spectrum;
2365const std::vector<FrameIdDescr> &
2371const std::vector<TimsFrameRecord> &
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)
const char * what() const noexcept override
virtual const QString & qwhat() const
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)
void closeLinearRead()
close file access and flush cache
QSqlDatabase openDatabaseConnection() const
TimsFrameCstSPtr getTimsFrameCstSPtr(std::size_t timsId)
get a Tims frame with his database ID
const std::vector< TimsFrameRecord > & getTimsFrameRecordList() const
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)
const std::vector< FrameIdDescr > & getFrameIdDescrList() const
std::map< std::size_t, QSqlRecord > m_mapXicCoordRecord
std::size_t getTotalNumberOfFrames() const
Get total number of frames.
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
void getQualifiedMs2MassSpectrumByPrecursorId(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
TimsData(QDir timsDataDirectory)
build using the tims data directory
std::size_t m_totalNumberOfFrames
Trace getTicChromatogram() const
TimsFrameBaseCstSPtr getTimsFrameBaseCstSPtrCached(std::size_t timsId)
std::size_t m_totalNumberOfScans
std::deque< TimsFrameCstSPtr > m_timsFrameCache
std::pair< std::size_t, std::size_t > getScanCoordinateFromRawIndex(std::size_t spectrum_index) const
std::vector< TimsFrameRecord > m_mapFramesRecord
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
std::vector< std::size_t > getClosestPrecursorIdByMz(std::vector< std::vector< double > > ids, double mz_value)
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...
TimsDataFastMap & getRawMs2ByPrecursorId(std::size_t precursor_index)
get cumulated raw signal for a given precursorCMakeLists.txt.userCMakeLists.txt.userCMakeLists....
SpectrumDescr getSpectrumDescrWithScanCoordinate(const std::pair< std::size_t, std::size_t > &scan_coordinate)
std::size_t getTotalNumberOfPrecursors() const
get the number of precursors analyzed 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
TimsDataFastMap & 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)
XicCoordTims getXicCoordTimsFromPrecursorId(std::size_t precursor_id, PrecisionPtr precision_ptr)
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
std::size_t m_totalNumberOfPrecursors
virtual MapTrace & combine(MapTrace &map_trace, const Trace &trace) const override
A simple container of DataPoint instances.
virtual Trace & filter(const FilterInterface &filter) final
apply a filter on this trace
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
@ IsolationMzWidth
m/z isolation window width (left + right)
@ TimsFrameIonMobOneOverK0Begin
@ TimsFrameIonMobOneOverK0End
@ TimsIonMobScanOneOverK0
1/kO of a simple scan
@ CollisionEnergy
Bruker's timsTOF collision energy.
@ IsolationMz
isolation m/z value
@ BrukerPrecursorIndex
Bruker's timsTOF precursor index.
std::shared_ptr< const FilterInterface > FilterInterfaceCstSPtr
std::shared_ptr< const TimsFrame > TimsFrameCstSPtr
void builtInCentroid()
simple filter to agregate counts on neigbhor mobility slots (+1)
std::vector< quint32 > tofIndexList
static TimsDataFastMap & getTimsDataFastMapInstance()
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