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"
39 #include <QMutexLocker>
46 : m_timsDataDirectory(timsDataDirectory)
53 QObject::tr(
"ERROR TIMS data directory %1 not found")
61 QObject::tr(
"ERROR TIMS data directory, %1 sqlite file not found")
70 if(!q.exec(
"select Key, Value from GlobalMetadata where "
71 "Key='TimsCompressionType';"))
76 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
77 "command %2:\n%3\n%4\n%5")
80 .arg(q.lastError().databaseText())
81 .arg(q.lastError().driverText())
82 .arg(q.lastError().nativeErrorCode()));
86 int compression_type = 0;
89 compression_type = q.value(1).toInt();
91 qDebug() <<
" compression_type=" << compression_type;
98 if(!q.exec(
"SELECT COUNT( DISTINCT Id) FROM Precursors;"))
102 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
103 "command %2:\n%3\n%4\n%5")
106 .arg(qdb.lastError().databaseText())
107 .arg(qdb.lastError().driverText())
108 .arg(qdb.lastError().nativeErrorCode()));
117 if(!q.exec(
"SELECT SUM(NumScans) FROM Frames"))
121 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
122 "command %2:\n%3\n%4\n%5")
125 .arg(qdb.lastError().databaseText())
126 .arg(qdb.lastError().driverText())
127 .arg(qdb.lastError().nativeErrorCode()));
142 std::shared_ptr<pappso::FilterPseudoCentroid> ms2filter =
143 std::make_shared<pappso::FilterPseudoCentroid>(35000, 5, 0.5, 0.1);
147 std::shared_ptr<FilterTriangle> ms1filter =
148 std::make_shared<FilterTriangle>();
156 QString database_connection_name = QString(
"%1_%2")
158 .arg((quintptr)QThread::currentThread());
160 QSqlDatabase qdb = QSqlDatabase::database(database_connection_name);
163 qDebug() << database_connection_name;
164 qdb = QSqlDatabase::addDatabase(
"QSQLITE", database_connection_name);
173 QObject::tr(
"ERROR opening TIMS sqlite database file %1, database name "
176 .arg(database_connection_name)
177 .arg(qdb.lastError().databaseText())
178 .arg(qdb.lastError().driverText())
179 .arg(qdb.lastError().nativeErrorCode()));
210 std::pair<std::size_t, std::size_t>
217 qdb.exec(QString(
"SELECT Id, NumScans FROM "
218 "Frames ORDER BY Id"));
219 if(q.lastError().isValid())
223 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
224 "command %2:\n%3\n%4\n%5")
227 .arg(qdb.lastError().databaseText())
228 .arg(qdb.lastError().driverText())
229 .arg(qdb.lastError().nativeErrorCode()));
232 bool index_found =
false;
234 std::size_t numberScans;
235 std::size_t offset = 0;
236 while(q.next() && (!index_found))
238 timsId = q.value(0).toUInt();
239 numberScans = q.value(1).toUInt();
241 if(raw_index < (offset + numberScans))
243 return std::pair<std::size_t, std::size_t>(timsId,
247 offset += numberScans;
251 QObject::tr(
"ERROR raw index %1 not found").arg(raw_index));
257 std::size_t scan_num)
const
263 qdb.exec(QString(
"SELECT Id, NumScans FROM "
264 "Frames ORDER BY Id"));
265 if(q.lastError().isValid())
269 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
270 "command %2:\n%3\n%4\n%5")
273 .arg(qdb.lastError().databaseText())
274 .arg(qdb.lastError().driverText())
275 .arg(qdb.lastError().nativeErrorCode()));
277 bool index_found =
false;
279 std::size_t numberScans;
280 std::size_t offset = 0;
281 while(q.next() && (!index_found))
283 timsId = q.value(0).toUInt();
284 numberScans = q.value(1).toUInt();
286 if(timsId == frame_id)
288 return offset + scan_num;
291 offset += numberScans;
295 QObject::tr(
"ERROR raw index with frame=%1 scan=%2 not found")
317 qDebug() <<
" timsId=" << timsId;
320 QSqlQuery q = qdb.exec(
321 QString(
"SELECT Frames.TimsId, Frames.AccumulationTime, "
322 " MzCalibration.DigitizerTimebase, MzCalibration.DigitizerDelay, "
323 "MzCalibration.C0, MzCalibration.C1, MzCalibration.C2, "
324 "MzCalibration.C3, MzCalibration.T1, MzCalibration.T2, "
325 "MzCalibration.dC1, MzCalibration.dC2, Frames.T1, Frames.T2, "
326 "Frames.Time, Frames.MsMsType, TimsCalibration.ModelType, "
327 "TimsCalibration.C0, TimsCalibration.C1, TimsCalibration.C2, "
328 "TimsCalibration.C3, TimsCalibration.C4, TimsCalibration.C5, "
329 "TimsCalibration.C6, TimsCalibration.C7, TimsCalibration.C8, "
330 "TimsCalibration.C9 FROM "
331 "Frames INNER JOIN MzCalibration ON "
332 "Frames.MzCalibration=MzCalibration.Id INNER JOIN TimsCalibration "
333 "ON Frames.TimsCalibration=TimsCalibration.Id where "
336 if(q.lastError().isValid())
340 QObject::tr(
"ERROR in TIMS sqlite database file %1, database name %2, "
342 "command %3:\n%4\n%5\n%6")
344 .arg(qdb.databaseName())
346 .arg(qdb.lastError().databaseText())
347 .arg(qdb.lastError().driverText())
348 .arg(qdb.lastError().nativeErrorCode()));
355 double T1_ref = q.value(8).toDouble();
356 double T2_ref = q.value(9).toDouble();
357 double factor1 = q.value(10).toDouble();
358 double factor2 = q.value(11).toDouble();
360 double T1_frame = q.value(12).toDouble();
361 double T2_frame = q.value(13).toDouble();
364 double temperature_correction =
365 factor1 * (T1_ref - T1_frame) + factor2 * (T2_ref - T2_frame);
366 temperature_correction = (double)1.0 + (temperature_correction / 1.0e6);
368 tims_frame = std::make_shared<TimsFrameBase>(
371 tims_frame.get()->setMzCalibration(temperature_correction,
372 q.value(2).toDouble(),
373 q.value(3).toDouble(),
374 q.value(4).toDouble(),
375 q.value(5).toDouble(),
376 q.value(6).toDouble(),
377 q.value(7).toDouble());
379 tims_frame.get()->setAccumulationTime(q.value(1).toDouble());
381 tims_frame.get()->setTime(q.value(14).toDouble());
382 tims_frame.get()->setMsMsType(q.value(15).toUInt());
384 tims_frame.get()->setTimsCalibration(q.value(16).toInt(),
385 q.value(17).toDouble(),
386 q.value(18).toDouble(),
387 q.value(19).toDouble(),
388 q.value(20).toDouble(),
389 q.value(21).toDouble(),
390 q.value(22).toDouble(),
391 q.value(23).toDouble(),
392 q.value(24).toDouble(),
393 q.value(25).toDouble(),
394 q.value(26).toDouble());
402 std::vector<std::size_t>
406 qDebug() <<
" rt_begin=" << rt_begin <<
" rt_end=" << rt_end;
407 std::vector<std::size_t> tims_frameid_list;
409 QSqlQuery q = qdb.exec(QString(
"SELECT Frames.TimsId FROM Frames WHERE "
410 "Frames.MsMsType=0 AND (Frames.Time=>%1) AND "
411 "(Frames.Time<=%2) SORT BY Frames.Time;")
414 if(q.lastError().isValid())
418 QObject::tr(
"ERROR in TIMS sqlite database file %1, database name %2, "
420 "command %3:\n%4\n%5\n%6")
422 .arg(qdb.databaseName())
424 .arg(qdb.lastError().databaseText())
425 .arg(qdb.lastError().driverText())
426 .arg(qdb.lastError().nativeErrorCode()));
431 tims_frameid_list.push_back(q.value(0).toUInt());
433 return tims_frameid_list;
440 qDebug() <<
" timsId=" << timsId;
443 QSqlQuery q = qdb.exec(
444 QString(
"SELECT Frames.TimsId, Frames.AccumulationTime, "
445 " MzCalibration.DigitizerTimebase, MzCalibration.DigitizerDelay, "
446 "MzCalibration.C0, MzCalibration.C1, MzCalibration.C2, "
447 "MzCalibration.C3, MzCalibration.T1, MzCalibration.T2, "
448 "MzCalibration.dC1, MzCalibration.dC2, Frames.T1, Frames.T2, "
449 "Frames.Time, Frames.MsMsType, TimsCalibration.ModelType, "
450 "TimsCalibration.C0, TimsCalibration.C1, TimsCalibration.C2, "
451 "TimsCalibration.C3, TimsCalibration.C4, TimsCalibration.C5, "
452 "TimsCalibration.C6, TimsCalibration.C7, TimsCalibration.C8, "
453 "TimsCalibration.C9 FROM "
454 "Frames INNER JOIN MzCalibration ON "
455 "Frames.MzCalibration=MzCalibration.Id INNER JOIN TimsCalibration "
456 "ON Frames.TimsCalibration=TimsCalibration.Id where "
459 if(q.lastError().isValid())
463 QObject::tr(
"ERROR in TIMS sqlite database file %1, database name %2, "
465 "command %3:\n%4\n%5\n%6")
467 .arg(qdb.databaseName())
469 .arg(qdb.lastError().databaseText())
470 .arg(qdb.lastError().driverText())
471 .arg(qdb.lastError().nativeErrorCode()));
478 double T1_ref = q.value(8).toDouble();
479 double T2_ref = q.value(9).toDouble();
480 double factor1 = q.value(10).toDouble();
481 double factor2 = q.value(11).toDouble();
483 double T1_frame = q.value(12).toDouble();
484 double T2_frame = q.value(13).toDouble();
487 double temperature_correction =
488 factor1 * (T1_ref - T1_frame) + factor2 * (T2_ref - T2_frame);
489 temperature_correction = (double)1.0 + (temperature_correction / 1.0e6);
494 tims_frame.get()->setMzCalibration(temperature_correction,
495 q.value(2).toDouble(),
496 q.value(3).toDouble(),
497 q.value(4).toDouble(),
498 q.value(5).toDouble(),
499 q.value(6).toDouble(),
500 q.value(7).toDouble());
502 tims_frame.get()->setAccumulationTime(q.value(1).toDouble());
504 tims_frame.get()->setTime(q.value(14).toDouble());
505 tims_frame.get()->setMsMsType(q.value(15).toUInt());
507 tims_frame.get()->setTimsCalibration(q.value(16).toInt(),
508 q.value(17).toDouble(),
509 q.value(18).toDouble(),
510 q.value(19).toDouble(),
511 q.value(20).toDouble(),
512 q.value(21).toDouble(),
513 q.value(22).toDouble(),
514 q.value(23).toDouble(),
515 q.value(24).toDouble(),
516 q.value(25).toDouble(),
517 q.value(26).toDouble());
531 return frame->getMassSpectrumCstSPtr(scanNum);
547 std::vector<std::size_t>
553 std::vector<std::size_t> precursor_ids;
554 std::vector<std::vector<double>> ids;
557 QSqlQuery q = qdb.exec(
559 "SELECT Frames.time, Precursors.MonoisotopicMz, Precursors.Charge, "
560 "Precursors.Id, Frames.Id, PasefFrameMsMsInfo.ScanNumBegin, "
561 "PasefFrameMsMsInfo.scanNumEnd "
563 "INNER JOIN PasefFrameMsMsInfo ON Frames.Id = PasefFrameMsMsInfo.Frame "
564 "INNER JOIN Precursors ON PasefFrameMsMsInfo.Precursor = Precursors.Id "
565 "WHERE Precursors.Charge == %1 "
566 "AND Precursors.MonoisotopicMz > %2 -0.01 "
567 "AND Precursors.MonoisotopicMz < %2 +0.01 "
568 "AND Frames.Time >= %3 "
569 "AND Frames.Time < %3 +1; ")
573 if(q.lastError().isValid())
577 QObject::tr(
"ERROR in TIMS sqlite database file %1, database name %2, "
579 "command %3:\n%4\n%5\n%6")
581 .arg(qdb.databaseName())
583 .arg(qdb.lastError().databaseText())
584 .arg(qdb.lastError().driverText())
585 .arg(qdb.lastError().nativeErrorCode()));
589 qInfo() << q.value(0).toDouble() << q.value(1).toDouble()
590 << q.value(2).toDouble() << q.value(3).toDouble();
592 std::vector<double> sql_values;
593 sql_values.push_back(q.value(4).toDouble());
594 sql_values.push_back(q.value(3).toDouble());
595 sql_values.push_back(q.value(5).toDouble());
596 sql_values.push_back(q.value(6).toDouble());
597 sql_values.push_back(q.value(1).toDouble());
599 ids.push_back(sql_values);
602 if(std::find(precursor_ids.begin(),
604 q.value(3).toDouble()) == precursor_ids.end())
606 precursor_ids.push_back(q.value(3).toDouble());
610 if(precursor_ids.size() > 1)
614 if(precursor_ids.size() > 1)
618 return precursor_ids;
622 return precursor_ids;
626 std::vector<std::size_t>
630 std::vector<std::size_t> precursor_id;
631 for(std::vector<double> index : ids)
638 double bko = tims_frame.get()->getOneOverK0Transformation(index[2]);
639 double eko = tims_frame.get()->getOneOverK0Transformation(index[3]);
641 qInfo() <<
"diff" << (bko + eko) / 2;
642 double mean_ko = (bko + eko) / 2;
644 if(mean_ko > ko_value - 0.1 && mean_ko < ko_value + 0.1)
646 precursor_id.push_back(index[1]);
652 std::vector<std::size_t>
656 std::vector<std::size_t> best_precursor;
657 double best_value = 1;
659 int best_val_position = 0;
661 for(std::vector<double> values : ids)
663 double new_val = abs(mz_value - values[4]);
664 if(new_val < best_value)
666 best_value = new_val;
667 best_val_position = count;
671 best_precursor.push_back(ids[best_val_position][1]);
672 return best_precursor;
681 return tims_frame.get()->getMsLevel();
687 bool want_binary_data)
703 spectrum_id.
setNativeId(QString(
"frame=%1 scan=%2 index=%3")
704 .arg(coordinate.first)
705 .arg(coordinate.second)
706 .arg(spectrum_index));
710 mass_spectrum.
setMsLevel(tims_frame.get()->getMsLevel());
714 tims_frame.get()->getDriftTime(coordinate.second));
718 tims_frame.get()->getOneOverK0Transformation(coordinate.second));
724 tims_frame.get()->getMassSpectrumSPtr(coordinate.second));
725 if(mass_spectrum.
size() > 0)
737 if(tims_frame.get()->getMsLevel() > 1)
741 QSqlQuery q = qdb.exec(
743 "SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
744 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
745 "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
746 "PasefFrameMsMsInfo.Frame=%1 and (PasefFrameMsMsInfo.ScanNumBegin "
747 "<= %2 and PasefFrameMsMsInfo.ScanNumEnd >= %2);")
748 .arg(coordinate.first)
749 .arg(coordinate.second));
750 if(q.lastError().isValid())
753 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
754 "command %2:\n%3\n%4\n%5")
757 .arg(qdb.lastError().databaseText())
758 .arg(qdb.lastError().driverText())
759 .arg(qdb.lastError().nativeErrorCode()));
771 q.value(13).toDouble()));
776 q.value(14).toDouble(), coordinate.second);
780 QString(
"frame=%1 scan=%2 index=%3")
781 .arg(q.value(14).toDouble())
782 .arg(coordinate.second)
783 .arg(prec_spectrum_index));
789 q.value(4).toDouble());
793 q.value(5).toFloat());
800 return mass_spectrum;
806 std::size_t precursor_index,
807 bool want_binary_data)
818 qdb.exec(QString(
"SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
819 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
820 "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
822 .arg(precursor_index));
823 if(q.lastError().isValid())
827 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
828 "command %2:\n%3\n%4\n%5")
831 .arg(qdb.lastError().databaseText())
832 .arg(qdb.lastError().driverText())
833 .arg(qdb.lastError().nativeErrorCode()));
840 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
842 .arg(precursor_index));
851 std::size_t scan_mobility_start = 0;
852 std::size_t scan_mobility_end = 0;
853 std::set<std::size_t> tims_frame_list;
857 tims_frame_list.insert(q.value(14).toLongLong());
866 QString(
"frame=%1 begin=%2 end=%3 precursor=%4 idxms2=%5")
867 .arg(q.value(0).toLongLong())
868 .arg(q.value(1).toLongLong())
869 .arg(q.value(2).toLongLong())
870 .arg(precursor_index)
877 scan_mobility_start = q.value(1).toLongLong();
878 scan_mobility_end = q.value(2).toLongLong();
885 for(std::size_t tims_id : tims_frame_list)
895 tims_frame.get()->getOneOverK0Transformation(
896 scan_mobility_start));
900 tims_frame.get()->getOneOverK0Transformation(
909 combiner.
combine(combiner_result,
910 tims_frame.get()->cumulateScanToTrace(
911 scan_mobility_start, scan_mobility_end));
924 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
926 .arg(precursor_index));
956 catch(std::exception &error)
958 qDebug() << QString(
"Failure %1 ").arg(error.what());
960 return mass_spectrum;
967 std::size_t ms2_index,
968 std::size_t precursor_index,
969 bool want_binary_data)
979 QString(
"precursor=%1 idxms2=%2").arg(precursor_index).arg(ms2_index));
1001 qdb.exec(QString(
"SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
1002 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1003 "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
1004 "Precursors.Id=%1;")
1005 .arg(precursor_index));
1006 if(q.lastError().isValid())
1010 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
1011 "command %2:\n%3\n%4\n%5")
1014 .arg(qdb.lastError().databaseText())
1015 .arg(qdb.lastError().driverText())
1016 .arg(qdb.lastError().nativeErrorCode()));
1025 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1027 .arg(precursor_index));
1034 std::size_t scan_mobility_start = 0;
1035 std::size_t scan_mobility_end = 0;
1036 std::vector<std::size_t> tims_frame_list;
1040 tims_frame_list.push_back(q.value(0).toLongLong());
1049 q.value(11).toInt(),
1050 q.value(13).toDouble()));
1053 QString(
"frame=%1 begin=%2 end=%3 precursor=%4 idxms2=%5")
1054 .arg(q.value(14).toLongLong())
1055 .arg(q.value(1).toLongLong())
1056 .arg(q.value(2).toLongLong())
1057 .arg(precursor_index)
1058 .arg(ms2_index - 1));
1061 scan_mobility_start = q.value(1).toLongLong();
1062 scan_mobility_end = q.value(2).toLongLong();
1066 q.value(3).toDouble());
1069 q.value(4).toDouble());
1073 q.value(5).toFloat());
1076 q.value(6).toInt());
1086 std::map<quint32, quint32> raw_spectrum;
1088 for(std::size_t tims_id : tims_frame_list)
1098 tims_frame.get()->getOneOverK0Transformation(
1099 scan_mobility_start));
1103 tims_frame.get()->getOneOverK0Transformation(
1104 scan_mobility_end));
1110 if(want_binary_data)
1116 if(previous_frame.get() !=
nullptr)
1118 if(previous_frame.get()->hasSameCalibrationData(
1126 "ERROR in %1 %2, different calibration data "
1127 "between frame id %3 and frame id %4")
1130 .arg(previous_frame.get()->getId())
1131 .arg(tims_frame.get()->getId()));
1134 tims_frame.get()->cumulateScansInRawMap(
1135 raw_spectrum, scan_mobility_start, scan_mobility_end);
1138 previous_frame = tims_frame;
1140 qDebug() <<
" precursor_index=" << precursor_index
1141 <<
" num_rows=" << tims_frame_list.size()
1142 <<
" sql=" << q.lastQuery() <<
" "
1143 << (std::size_t)QThread::currentThreadId();
1148 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
1150 .arg(precursor_index));
1152 if(want_binary_data)
1160 tims_frame.get()->getTraceFromCumulatedScansBuiltinCentroid(
1168 tims_frame.get()->getTraceFromCumulatedScans(raw_spectrum);
1171 if(trace.size() > 0)
1173 qDebug() << trace.size() <<
" "
1174 << (std::size_t)QThread::currentThreadId();
1204 catch(std::exception &error)
1206 qDebug() << QString(
"Failure %1 ").arg(error.what());
1215 QMutexLocker locker(&
m_mutex);
1218 if(tims_frame.get()->getId() == timsId)
1234 QMutexLocker locker(&
m_mutex);
1237 if(tims_frame.get()->getId() == timsId)
1261 std::vector<TimsXicStructure>
1263 const std::vector<std::size_t> &precursor_id_list,
1266 double rtRange)
const
1270 std::vector<TimsXicStructure> xic_list;
1276 for(
auto precursor_id : precursor_id_list)
1278 QSqlQuery q = qdb.exec(
1279 QString(
"SELECT Frames.Time, "
1280 "PasefFrameMsMsInfo.Frame,PasefFrameMsMsInfo.ScanNumBegin,"
1281 "PasefFrameMsMsInfo.ScanNumEnd, Precursors.MonoisotopicMz, "
1282 "Precursors.Charge FROM "
1283 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1284 "PasefFrameMsMsInfo.Precursor=Precursors.Id INNER JOIN "
1285 "Frames ON PasefFrameMsMsInfo.Frame=Frames.Id where "
1286 "Precursors.Id=%1;")
1287 .arg(precursor_id));
1288 if(q.lastError().isValid())
1293 "ERROR in TIMS sqlite database file %1, executing SQL "
1294 "command %2:\n%3\n%4\n%5")
1297 .arg(qdb.lastError().databaseText())
1298 .arg(qdb.lastError().driverText())
1299 .arg(qdb.lastError().nativeErrorCode()));
1312 MzRange(q.value(4).toDouble(), precision_ptr);
1314 xic_structure.
scanNumEnd = q.value(3).toUInt();
1315 xic_structure.
rtTarget = q.value(0).toDouble();
1318 xic_list.push_back(xic_structure);
1327 catch(std::exception &error)
1329 qDebug() << QString(
"Failure %1 ").arg(error.what());