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"
40 #include <QMutexLocker>
47 : m_timsDataDirectory(timsDataDirectory)
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;
100 if(!q.exec(
"SELECT COUNT( DISTINCT Id) FROM Precursors;"))
104 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
105 "command %2:\n%3\n%4\n%5")
108 .arg(qdb.lastError().databaseText())
109 .arg(qdb.lastError().driverText())
110 .arg(qdb.lastError().nativeErrorCode()));
121 if(!q.exec(
"SELECT SUM(NumScans) FROM Frames"))
125 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
126 "command %2:\n%3\n%4\n%5")
129 .arg(qdb.lastError().databaseText())
130 .arg(qdb.lastError().driverText())
131 .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()));
200 QSqlRecord record = q.record();
202 std::pair<std::size_t, QSqlRecord>(record.value(8).toUInt(), record));
206 std::shared_ptr<pappso::FilterPseudoCentroid> ms2filter =
207 std::make_shared<pappso::FilterPseudoCentroid>(35000, 5, 0.5, 0.1);
211 std::shared_ptr<FilterTriangle> ms1filter =
212 std::make_shared<FilterTriangle>();
213 ms1filter.get()->setTriangleSlope(50, 0.01);
220 QString database_connection_name = QString(
"%1_%2")
222 .arg((quintptr)QThread::currentThread());
224 QSqlDatabase qdb = QSqlDatabase::database(database_connection_name);
227 qDebug() << database_connection_name;
228 qdb = QSqlDatabase::addDatabase(
"QSQLITE", database_connection_name);
237 QObject::tr(
"ERROR opening TIMS sqlite database file %1, database name "
240 .arg(database_connection_name)
241 .arg(qdb.lastError().databaseText())
242 .arg(qdb.lastError().driverText())
243 .arg(qdb.lastError().nativeErrorCode()));
285 qdb.exec(QString(
"SELECT Id, NumScans FROM "
286 "Frames ORDER BY Id"));
287 if(q.lastError().isValid())
291 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
292 "command %2:\n%3\n%4\n%5")
295 .arg(qdb.lastError().databaseText())
296 .arg(qdb.lastError().driverText())
297 .arg(qdb.lastError().nativeErrorCode()));
300 bool index_found =
false;
302 std::size_t numberScans;
303 std::size_t cumulScans = 0;
304 while(q.next() && (!index_found))
306 timsId = q.value(0).toUInt();
307 numberScans = q.value(1).toUInt();
310 std::pair<std::size_t, std::size_t>((cumulScans % 1000),
314 cumulScans += numberScans;
318 std::pair<std::size_t, std::size_t>
322 std::size_t modulo = raw_index % 1000;
327 QObject::tr(
"ERROR raw index %1 not found (modulo)").arg(raw_index));
329 std::size_t start_point_index = map_it->second;
330 while((start_point_index > 0) &&
341 return std::pair<std::size_t, std::size_t>(
348 QObject::tr(
"ERROR raw index %1 not found").arg(raw_index));
354 std::size_t scan_num)
const
359 if(frameDescr.m_frameId == frame_id)
361 return frameDescr.m_cumulSize + scan_num;
366 QObject::tr(
"ERROR raw index with frame=%1 scan=%2 not found")
388 qDebug() <<
" timsId=" << timsId;
394 QObject::tr(
"ERROR Frames database id %1 not found").arg(timsId));
399 tims_frame = std::make_shared<TimsFrameBase>(
400 TimsFrameBase(timsId, it_map_record_frames->second.value(0).toUInt()));
403 it_map_record_frames->second.value(2).toInt());
408 it_map_record_frames->second.value(3).toDouble();
410 it_map_record_frames->second.value(4).toDouble();
413 tims_frame.get()->setMzCalibrationInterfaceSPtr(
415 T1_frame, T2_frame, it_map_record->second));
420 QObject::tr(
"ERROR MzCalibration database id %1 not found")
421 .arg(it_map_record_frames->second.value(2).toInt()));
424 tims_frame.get()->setAccumulationTime(
425 it_map_record_frames->second.value(1).toDouble());
427 tims_frame.get()->setTime(it_map_record_frames->second.value(5).toDouble());
428 tims_frame.get()->setMsMsType(it_map_record_frames->second.value(6).toUInt());
432 it_map_record_frames->second.value(7).toInt());
436 tims_frame.get()->setTimsCalibration(
437 it_map_record_tims_calibration->second.value(1).toInt(),
438 it_map_record_tims_calibration->second.value(2).toDouble(),
439 it_map_record_tims_calibration->second.value(3).toDouble(),
440 it_map_record_tims_calibration->second.value(4).toDouble(),
441 it_map_record_tims_calibration->second.value(5).toDouble(),
442 it_map_record_tims_calibration->second.value(6).toDouble(),
443 it_map_record_tims_calibration->second.value(7).toDouble(),
444 it_map_record_tims_calibration->second.value(8).toDouble(),
445 it_map_record_tims_calibration->second.value(9).toDouble(),
446 it_map_record_tims_calibration->second.value(10).toDouble(),
447 it_map_record_tims_calibration->second.value(11).toDouble());
452 QObject::tr(
"ERROR TimsCalibration database id %1 not found")
453 .arg(it_map_record_frames->second.value(7).toInt()));
459 std::vector<std::size_t>
463 qDebug() <<
" rt_begin=" << rt_begin <<
" rt_end=" << rt_end;
466 std::vector<std::size_t> tims_frameid_list;
468 QSqlQuery q = qdb.exec(QString(
"SELECT Frames.Id FROM Frames WHERE "
469 "Frames.MsMsType=0 AND (Frames.Time>=%1) AND "
470 "(Frames.Time<=%2) ORDER BY Frames.Time;")
473 if(q.lastError().isValid())
477 QObject::tr(
"ERROR in TIMS sqlite database file %1, database name %2, "
479 "command %3:\n%4\n%5\n%6")
481 .arg(qdb.databaseName())
483 .arg(qdb.lastError().databaseText())
484 .arg(qdb.lastError().driverText())
485 .arg(qdb.lastError().nativeErrorCode()));
490 tims_frameid_list.push_back(q.value(0).toUInt());
492 return tims_frameid_list;
499 qDebug() <<
" timsId=" << timsId
514 QObject::tr(
"ERROR Frames database id %1 not found").arg(timsId));
522 timsId, it_map_record_frames->second.value(0).toUInt());
526 it_map_record_frames->second.value(2).toInt());
531 it_map_record_frames->second.value(3).toDouble();
533 it_map_record_frames->second.value(4).toDouble();
536 tims_frame.get()->setMzCalibrationInterfaceSPtr(
538 T1_frame, T2_frame, it_map_record->second));
543 QObject::tr(
"ERROR MzCalibration database id %1 not found")
544 .arg(it_map_record_frames->second.value(2).toInt()));
547 tims_frame.get()->setAccumulationTime(
548 it_map_record_frames->second.value(1).toDouble());
550 tims_frame.get()->setTime(it_map_record_frames->second.value(5).toDouble());
551 tims_frame.get()->setMsMsType(it_map_record_frames->second.value(6).toUInt());
555 it_map_record_frames->second.value(7).toInt());
559 tims_frame.get()->setTimsCalibration(
560 it_map_record_tims_calibration->second.value(1).toInt(),
561 it_map_record_tims_calibration->second.value(2).toDouble(),
562 it_map_record_tims_calibration->second.value(3).toDouble(),
563 it_map_record_tims_calibration->second.value(4).toDouble(),
564 it_map_record_tims_calibration->second.value(5).toDouble(),
565 it_map_record_tims_calibration->second.value(6).toDouble(),
566 it_map_record_tims_calibration->second.value(7).toDouble(),
567 it_map_record_tims_calibration->second.value(8).toDouble(),
568 it_map_record_tims_calibration->second.value(9).toDouble(),
569 it_map_record_tims_calibration->second.value(10).toDouble(),
570 it_map_record_tims_calibration->second.value(11).toDouble());
575 QObject::tr(
"ERROR TimsCalibration database id %1 not found")
576 .arg(it_map_record_frames->second.value(7).toInt()));
588 return frame->getMassSpectrumCstSPtr(scanNum);
604 std::vector<std::size_t>
610 std::vector<std::size_t> precursor_ids;
611 std::vector<std::vector<double>> ids;
614 QSqlQuery q = qdb.exec(
616 "SELECT Frames.Time, Precursors.MonoisotopicMz, Precursors.Charge, "
617 "Precursors.Id, Frames.Id, PasefFrameMsMsInfo.ScanNumBegin, "
618 "PasefFrameMsMsInfo.scanNumEnd "
620 "INNER JOIN PasefFrameMsMsInfo ON Frames.Id = PasefFrameMsMsInfo.Frame "
621 "INNER JOIN Precursors ON PasefFrameMsMsInfo.Precursor = Precursors.Id "
622 "WHERE Precursors.Charge == %1 "
623 "AND Precursors.MonoisotopicMz > %2 -0.01 "
624 "AND Precursors.MonoisotopicMz < %2 +0.01 "
625 "AND Frames.Time >= %3 -1 "
626 "AND Frames.Time < %3 +1; ")
630 if(q.lastError().isValid())
634 QObject::tr(
"ERROR in TIMS sqlite database file %1, database name %2, "
636 "command %3:\n%4\n%5\n%6")
638 .arg(qdb.databaseName())
640 .arg(qdb.lastError().databaseText())
641 .arg(qdb.lastError().driverText())
642 .arg(qdb.lastError().nativeErrorCode()));
649 std::vector<double> sql_values;
650 sql_values.push_back(q.value(4).toDouble());
651 sql_values.push_back(q.value(3).toDouble());
652 sql_values.push_back(q.value(5).toDouble());
653 sql_values.push_back(q.value(6).toDouble());
654 sql_values.push_back(q.value(1).toDouble());
656 ids.push_back(sql_values);
659 if(std::find(precursor_ids.begin(),
661 q.value(3).toDouble()) == precursor_ids.end())
663 precursor_ids.push_back(q.value(3).toDouble());
667 if(precursor_ids.size() > 1)
671 if(precursor_ids.size() > 1)
675 return precursor_ids;
679 return precursor_ids;
683 std::vector<std::size_t>
687 std::vector<std::size_t> precursor_id;
688 for(std::vector<double> index : ids)
695 double bko = tims_frame.get()->getOneOverK0Transformation(index[2]);
696 double eko = tims_frame.get()->getOneOverK0Transformation(index[3]);
699 double mean_ko = (bko + eko) / 2;
701 if(mean_ko > ko_value - 0.1 && mean_ko < ko_value + 0.1)
703 precursor_id.push_back(index[1]);
709 std::vector<std::size_t>
713 std::vector<std::size_t> best_precursor;
714 double best_value = 1;
716 int best_val_position = 0;
718 for(std::vector<double> values : ids)
720 double new_val = abs(mz_value - values[4]);
721 if(new_val < best_value)
723 best_value = new_val;
724 best_val_position = count;
728 best_precursor.push_back(ids[best_val_position][1]);
729 return best_precursor;
738 return tims_frame.get()->getMsLevel();
744 bool want_binary_data)
760 spectrum_id.
setNativeId(QString(
"frame=%1 scan=%2 index=%3")
761 .arg(coordinate.first)
762 .arg(coordinate.second)
763 .arg(spectrum_index));
767 mass_spectrum.
setMsLevel(tims_frame.get()->getMsLevel());
771 tims_frame.get()->getDriftTime(coordinate.second));
775 tims_frame.get()->getOneOverK0Transformation(coordinate.second));
781 tims_frame.get()->getMassSpectrumSPtr(coordinate.second));
782 if(mass_spectrum.
size() > 0)
794 if(tims_frame.get()->getMsLevel() > 1)
798 QSqlQuery q = qdb.exec(
800 "SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
801 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
802 "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
803 "PasefFrameMsMsInfo.Frame=%1 and (PasefFrameMsMsInfo.ScanNumBegin "
804 "<= %2 and PasefFrameMsMsInfo.ScanNumEnd >= %2);")
805 .arg(coordinate.first)
806 .arg(coordinate.second));
807 if(q.lastError().isValid())
810 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
811 "command %2:\n%3\n%4\n%5")
814 .arg(qdb.lastError().databaseText())
815 .arg(qdb.lastError().driverText())
816 .arg(qdb.lastError().nativeErrorCode()));
828 q.value(13).toDouble()));
833 q.value(14).toDouble(), coordinate.second);
837 QString(
"frame=%1 scan=%2 index=%3")
838 .arg(q.value(14).toDouble())
839 .arg(coordinate.second)
840 .arg(prec_spectrum_index));
846 q.value(4).toDouble());
850 q.value(5).toFloat());
857 return mass_spectrum;
863 std::size_t precursor_index,
864 bool want_binary_data)
875 qdb.exec(QString(
"SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
876 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
877 "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
879 .arg(precursor_index));
880 if(q.lastError().isValid())
884 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
885 "command %2:\n%3\n%4\n%5")
888 .arg(qdb.lastError().databaseText())
889 .arg(qdb.lastError().driverText())
890 .arg(qdb.lastError().nativeErrorCode()));
897 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
899 .arg(precursor_index));
908 std::size_t scan_mobility_start = 0;
909 std::size_t scan_mobility_end = 0;
910 std::set<std::size_t> tims_frame_list;
914 tims_frame_list.insert(q.value(14).toLongLong());
923 QString(
"frame=%1 begin=%2 end=%3 precursor=%4 idxms2=%5")
924 .arg(q.value(0).toLongLong())
925 .arg(q.value(1).toLongLong())
926 .arg(q.value(2).toLongLong())
927 .arg(precursor_index)
934 scan_mobility_start = q.value(1).toLongLong();
935 scan_mobility_end = q.value(2).toLongLong();
942 for(std::size_t tims_id : tims_frame_list)
952 tims_frame.get()->getOneOverK0Transformation(
953 scan_mobility_start));
957 tims_frame.get()->getOneOverK0Transformation(
966 combiner.
combine(combiner_result,
967 tims_frame.get()->cumulateScanToTrace(
968 scan_mobility_start, scan_mobility_end));
981 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
983 .arg(precursor_index));
1018 catch(std::exception &error)
1020 qDebug() << QString(
"Failure %1 ").arg(error.
what());
1022 return mass_spectrum;
1029 std::size_t ms2_index,
1030 std::size_t precursor_index,
1031 bool want_binary_data)
1041 QString(
"precursor=%1 idxms2=%2").arg(precursor_index).arg(ms2_index));
1063 qdb.exec(QString(
"SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
1064 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1065 "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
1066 "Precursors.Id=%1;")
1067 .arg(precursor_index));
1068 if(q.lastError().isValid())
1072 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
1073 "command %2:\n%3\n%4\n%5")
1076 .arg(qdb.lastError().databaseText())
1077 .arg(qdb.lastError().driverText())
1078 .arg(qdb.lastError().nativeErrorCode()));
1087 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1089 .arg(precursor_index));
1096 std::size_t scan_mobility_start = 0;
1097 std::size_t scan_mobility_end = 0;
1098 std::vector<std::size_t> tims_frame_list;
1102 tims_frame_list.push_back(q.value(0).toLongLong());
1111 q.value(11).toInt(),
1112 q.value(13).toDouble()));
1115 QString(
"frame=%1 begin=%2 end=%3 precursor=%4 idxms2=%5")
1116 .arg(q.value(14).toLongLong())
1117 .arg(q.value(1).toLongLong())
1118 .arg(q.value(2).toLongLong())
1119 .arg(precursor_index)
1120 .arg(ms2_index - 1));
1123 scan_mobility_start = q.value(1).toLongLong();
1124 scan_mobility_end = q.value(2).toLongLong();
1128 q.value(3).toDouble());
1131 q.value(4).toDouble());
1135 q.value(5).toFloat());
1138 q.value(6).toInt());
1148 std::map<quint32, quint32> raw_spectrum;
1150 for(std::size_t tims_id : tims_frame_list)
1160 tims_frame.get()->getOneOverK0Transformation(
1161 scan_mobility_start));
1165 tims_frame.get()->getOneOverK0Transformation(
1166 scan_mobility_end));
1172 if(want_binary_data)
1178 if(previous_frame.get() !=
nullptr)
1180 if(previous_frame.get()->hasSameCalibrationData(
1188 "ERROR in %1 %2, different calibration data "
1189 "between frame id %3 and frame id %4")
1192 .arg(previous_frame.get()->getId())
1193 .arg(tims_frame.get()->getId()));
1196 tims_frame.get()->cumulateScansInRawMap(
1197 raw_spectrum, scan_mobility_start, scan_mobility_end);
1200 previous_frame = tims_frame;
1202 qDebug() <<
" precursor_index=" << precursor_index
1203 <<
" num_rows=" << tims_frame_list.size()
1204 <<
" sql=" << q.lastQuery() <<
" "
1205 << (std::size_t)QThread::currentThreadId();
1210 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1212 .arg(precursor_index));
1214 if(want_binary_data)
1222 tims_frame.get()->getTraceFromCumulatedScansBuiltinCentroid(
1230 tims_frame.get()->getTraceFromCumulatedScans(raw_spectrum);
1233 if(trace.size() > 0)
1235 qDebug() << trace.size() <<
" "
1236 << (std::size_t)QThread::currentThreadId();
1271 catch(std::exception &error)
1273 qDebug() << QString(
"Failure %1 ").arg(error.
what());
1282 QMutexLocker locker(&
m_mutex);
1285 if(tims_frame.get()->getId() == timsId)
1301 QMutexLocker locker(&
m_mutex);
1304 if(tims_frame.get()->getId() == timsId)
1328 std::vector<TimsXicStructure>
1330 const std::vector<std::size_t> &precursor_id_list,
1333 double rtRange)
const
1337 std::vector<TimsXicStructure> xic_list;
1343 for(
auto precursor_id : precursor_id_list)
1345 QSqlQuery q = qdb.exec(
1346 QString(
"SELECT Frames.Time, "
1347 "PasefFrameMsMsInfo.Frame,PasefFrameMsMsInfo.ScanNumBegin,"
1348 "PasefFrameMsMsInfo.ScanNumEnd, Precursors.MonoisotopicMz, "
1349 "Precursors.Charge FROM "
1350 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1351 "PasefFrameMsMsInfo.Precursor=Precursors.Id INNER JOIN "
1352 "Frames ON PasefFrameMsMsInfo.Frame=Frames.Id where "
1353 "Precursors.Id=%1;")
1354 .arg(precursor_id));
1355 if(q.lastError().isValid())
1360 "ERROR in TIMS sqlite database file %1, executing SQL "
1361 "command %2:\n%3\n%4\n%5")
1364 .arg(qdb.lastError().databaseText())
1365 .arg(qdb.lastError().driverText())
1366 .arg(qdb.lastError().nativeErrorCode()));
1379 MzRange(q.value(4).toDouble(), precision_ptr);
1381 xic_structure.
scanNumEnd = q.value(3).toUInt();
1382 xic_structure.
rtTarget = q.value(0).toDouble();
1384 xic_structure.
xicSptr = std::make_shared<Xic>();
1386 xic_list.push_back(xic_structure);
1399 catch(std::exception &error)
1401 qDebug() << QString(
"Failure %1 ").arg(error.
what());
1410 std::vector<TimsXicStructure> &tims_xic_structure_list,
1412 double rtRange)
const
1425 catch(std::exception &error)
1427 qDebug() << QString(
"Failure %1 ").arg(error.
what());
1436 std::size_t precursor_id,
PrecisionPtr precision_ptr)
const
1444 QSqlDatabase qdb = openDatabaseConnection();
1445 QSqlQuery q = qdb.exec(
1446 QString(
"SELECT Frames.Time, "
1447 "PasefFrameMsMsInfo.Frame,PasefFrameMsMsInfo.ScanNumBegin,"
1448 "PasefFrameMsMsInfo.ScanNumEnd, Precursors.MonoisotopicMz, "
1449 "Precursors.Charge FROM "
1450 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1451 "PasefFrameMsMsInfo.Precursor=Precursors.Id INNER JOIN "
1452 "Frames ON PasefFrameMsMsInfo.Frame=Frames.Id where "
1453 "Precursors.Id=%1;")
1454 .arg(precursor_id));
1455 if(q.lastError().isValid())
1459 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
1460 "command %2:\n%3\n%4\n%5")
1461 .arg(m_timsDataDirectory.absoluteFilePath(
"analysis.tdf"))
1463 .arg(qdb.lastError().databaseText())
1464 .arg(qdb.lastError().driverText())
1465 .arg(qdb.lastError().nativeErrorCode()));
1477 MzRange(q.value(4).toDouble(), precision_ptr);
1479 tims_xic_structure.
scanNumEnd = q.value(3).toUInt();
1480 tims_xic_structure.
rtTarget = q.value(0).toDouble();
1482 tims_xic_structure.
xicSptr = std::make_shared<Xic>();
1489 catch(std::exception &error)
1491 qDebug() << QString(
"Failure %1 ").arg(error.
what());
1493 return tims_xic_structure;
1497 std::map<quint32, quint32>
1501 std::map<quint32, quint32> raw_spectrum;
1508 qdb.exec(QString(
"SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
1509 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1510 "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
1511 "Precursors.Id=%1;")
1512 .arg(precursor_index));
1513 if(q.lastError().isValid())
1517 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
1518 "command %2:\n%3\n%4\n%5")
1521 .arg(qdb.lastError().databaseText())
1522 .arg(qdb.lastError().driverText())
1523 .arg(qdb.lastError().nativeErrorCode()));
1532 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1534 .arg(precursor_index));
1541 std::size_t scan_mobility_start = 0;
1542 std::size_t scan_mobility_end = 0;
1543 std::vector<std::size_t> tims_frame_list;
1547 tims_frame_list.push_back(q.value(0).toLongLong());
1551 scan_mobility_start = q.value(1).toLongLong();
1552 scan_mobility_end = q.value(2).toLongLong();
1562 for(std::size_t tims_id : tims_frame_list)
1569 if(previous_frame.get() !=
nullptr)
1571 if(previous_frame.get()->hasSameCalibrationData(
1579 "ERROR in %1 %2, different calibration data "
1580 "between frame id %3 and frame id %4")
1583 .arg(previous_frame.get()->getId())
1584 .arg(tims_frame.get()->getId()));
1587 tims_frame.get()->cumulateScansInRawMap(
1588 raw_spectrum, scan_mobility_start, scan_mobility_end);
1591 previous_frame = tims_frame;
1593 qDebug() <<
" precursor_index=" << precursor_index
1594 <<
" num_rows=" << tims_frame_list.size()
1595 <<
" sql=" << q.lastQuery() <<
" "
1596 << (std::size_t)QThread::currentThreadId();
1601 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1603 .arg(precursor_index));
1613 catch(std::exception &error)
1615 qDebug() << QString(
"Failure %1 ").arg(error.
what());
1617 return raw_spectrum;
void setNativeId(const QString &native_id)
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
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)
TimsFrameSPtr getTimsFrameSPtrByOffset(std::size_t timsId, std::size_t timsOffset) const
QualifiedMassSpectrum getQualifiedMs1MassSpectrumByPrecursorId(std::size_t ms2_index, std::size_t precursor_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 fillFrameIdDescrList()
private function to fill m_frameIdDescrList
TimsFrameBaseCstSPtr getTimsFrameBaseCstSPtr(std::size_t timsId) const
get a Tims frame base (no binary data file access) with his database ID
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 setMs2FilterCstSPtr(pappso::FilterInterfaceCstSPtr &filter)
filter interface to apply just after raw MS2 specturm extraction the filter can be a list of filters ...
std::vector< FrameIdDescr > m_frameIdDescrList
store every frame id and corresponding sizes
std::map< std::size_t, QSqlRecord > m_mapFramesRecord
TimsFrameCstSPtr getTimsFrameCstSPtrCached(std::size_t timsId)
get a Tims frame with his database ID but look in the cache first
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
TimsData(QDir timsDataDirectory)
build using the tims data directory
void extractXicListByTimsXicStructureList(std::vector< TimsXicStructure > &tims_xic_structure_list, XicExtractMethod xicExtractMethod, double rtRange) const
extract a list of XICs from Tims data
QualifiedMassSpectrum getQualifiedMassSpectrumByRawIndex(std::size_t spectrum_index, bool want_binary_data)
QSqlDatabase openDatabaseConnection() const
TimsFrameCstSPtr getTimsFrameCstSPtr(std::size_t timsId) const
get a Tims frame with his database ID
std::size_t getRawIndexFromCoordinate(std::size_t frame_id, std::size_t scan_num) const
TimsXicStructure getTimsXicStructureFromPrecursorId(std::size_t precursor_id, PrecisionPtr precision_ptr) const
std::size_t m_totalNumberOfScans
std::deque< TimsFrameCstSPtr > m_timsFrameCache
unsigned int getMsLevelBySpectrumIndex(std::size_t spectrum_index)
std::map< int, QSqlRecord > m_mapMzCalibrationRecord
std::map< int, QSqlRecord > m_mapTimsCalibrationRecord
bool m_builtinMs2Centroid
enable builtin centroid on raw tims integers by default
std::vector< std::size_t > getTimsMS1FrameIdRange(double rt_begin, double rt_end) const
std::vector< std::size_t > getClosestPrecursorIdByMz(std::vector< std::vector< double >> ids, double mz_value)
MzCalibrationStore * mpa_mzCalibrationStore
TimsFrameBaseCstSPtr getTimsFrameBaseCstSPtrCached(std::size_t timsId)
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::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
std::size_t getTotalNumberOfScans() const
get the total number of scans
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
TimsBinDec * mpa_timsBinDec
void setMs2BuiltinCentroid(bool centroid)
enable or disable simple centroid filter on raw tims data for MS2
std::vector< std::size_t > getMatchPrecursorIdByKo(std::vector< std::vector< double >> ids, double ko_value)
pappso::FilterInterfaceCstSPtr mcsp_ms1Filter
void getQualifiedMs2MassSpectrumByPrecursorId(QualifiedMassSpectrum &mass_spectrum, std::size_t ms2_index, std::size_t precursor_index, bool want_binary_data)
bool getMs2BuiltinCentroid() const
tells if simple centroid filter on raw tims data for MS2 is enabled or not
std::pair< std::size_t, std::size_t > getScanCoordinateFromRawIndex(std::size_t spectrum_index) const
pappso::FilterInterfaceCstSPtr mcsp_ms2Filter
pappso::MassSpectrumCstSPtr getMassSpectrumCstSPtrByRawIndex(std::size_t raw_index)
get a mass spectrum given its spectrum index
std::size_t getTotalNumberOfPrecursors() const
get the number of precursors analyzes by PASEF
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 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
structure needed to extract XIC from Tims data
pappso::pappso_double rtTarget
targeted retention time for this precursor
std::size_t scanNumEnd
mobility index end
MzRange mzRange
mass range to extract
XicSPtr xicSptr
extracted xic
std::size_t scanNumBegin
mobility index begin
std::size_t precursorId
the corresponding precursor id