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)
49 qDebug() << __FILE__ <<
" " << __FUNCTION__ <<
" " << __LINE__;
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() << __FILE__ <<
" " << __FUNCTION__ <<
" " << __LINE__
92 <<
" compression_type=" << compression_type;
99 if(!q.exec(
"SELECT COUNT( DISTINCT Id) FROM Precursors;"))
103 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
104 "command %2:\n%3\n%4\n%5")
107 .arg(qdb.lastError().databaseText())
108 .arg(qdb.lastError().driverText())
109 .arg(qdb.lastError().nativeErrorCode()));
118 if(!q.exec(
"SELECT SUM(NumScans) FROM Frames"))
122 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
123 "command %2:\n%3\n%4\n%5")
126 .arg(qdb.lastError().databaseText())
127 .arg(qdb.lastError().driverText())
128 .arg(qdb.lastError().nativeErrorCode()));
143 std::shared_ptr<pappso::FilterPseudoCentroid> ms2filter =
144 std::make_shared<pappso::FilterPseudoCentroid>(20000, 0.05, 0.5, 0.1);
148 std::shared_ptr<FilterTriangle> ms1filter =
149 std::make_shared<FilterTriangle>();
157 QString database_connection_name = QString(
"%1_%2")
159 .arg((quintptr)QThread::currentThread());
161 QSqlDatabase qdb = QSqlDatabase::database(database_connection_name);
164 qDebug() << database_connection_name;
165 qdb = QSqlDatabase::addDatabase(
"QSQLITE", database_connection_name);
174 QObject::tr(
"ERROR opening TIMS sqlite database file %1, database name "
177 .arg(database_connection_name)
178 .arg(qdb.lastError().databaseText())
179 .arg(qdb.lastError().driverText())
180 .arg(qdb.lastError().nativeErrorCode()));
187 qDebug() << __FILE__ <<
" " << __FUNCTION__ <<
" " << __LINE__;
199 std::pair<std::size_t, std::size_t>
206 qdb.exec(QString(
"SELECT Id, NumScans FROM "
207 "Frames ORDER BY Id"));
208 if(q.lastError().isValid())
212 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
213 "command %2:\n%3\n%4\n%5")
216 .arg(qdb.lastError().databaseText())
217 .arg(qdb.lastError().driverText())
218 .arg(qdb.lastError().nativeErrorCode()));
221 bool index_found =
false;
223 std::size_t numberScans;
224 std::size_t offset = 0;
225 while(q.next() && (!index_found))
227 timsId = q.value(0).toUInt();
228 numberScans = q.value(1).toUInt();
230 if(raw_index < (offset + numberScans))
232 return std::pair<std::size_t, std::size_t>(timsId,
236 offset += numberScans;
240 QObject::tr(
"ERROR raw index %1 not found").arg(raw_index));
246 std::size_t scan_num)
const
252 qdb.exec(QString(
"SELECT Id, NumScans FROM "
253 "Frames ORDER BY Id"));
254 if(q.lastError().isValid())
258 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
259 "command %2:\n%3\n%4\n%5")
262 .arg(qdb.lastError().databaseText())
263 .arg(qdb.lastError().driverText())
264 .arg(qdb.lastError().nativeErrorCode()));
266 bool index_found =
false;
268 std::size_t numberScans;
269 std::size_t offset = 0;
270 while(q.next() && (!index_found))
272 timsId = q.value(0).toUInt();
273 numberScans = q.value(1).toUInt();
275 if(timsId == frame_id)
277 return offset + scan_num;
280 offset += numberScans;
284 QObject::tr(
"ERROR raw index with frame=%1 scan=%2 not found")
306 qDebug() <<
" timsId=" << timsId;
309 QSqlQuery q = qdb.exec(
310 QString(
"SELECT Frames.TimsId, Frames.AccumulationTime, "
311 " MzCalibration.DigitizerTimebase, MzCalibration.DigitizerDelay, "
312 "MzCalibration.C0, MzCalibration.C1, MzCalibration.C2, "
313 "MzCalibration.C3, MzCalibration.T1, MzCalibration.T2, "
314 "MzCalibration.dC1, MzCalibration.dC2, Frames.T1, Frames.T2, "
315 "Frames.Time, Frames.MsMsType, TimsCalibration.ModelType, "
316 "TimsCalibration.C0, TimsCalibration.C1, TimsCalibration.C2, "
317 "TimsCalibration.C3, TimsCalibration.C4, TimsCalibration.C5, "
318 "TimsCalibration.C6, TimsCalibration.C7, TimsCalibration.C8, "
319 "TimsCalibration.C9 FROM "
320 "Frames INNER JOIN MzCalibration ON "
321 "Frames.MzCalibration=MzCalibration.Id INNER JOIN TimsCalibration "
322 "ON Frames.TimsCalibration=TimsCalibration.Id where "
325 if(q.lastError().isValid())
329 QObject::tr(
"ERROR in TIMS sqlite database file %1, database name %2, "
331 "command %3:\n%4\n%5\n%6")
333 .arg(qdb.databaseName())
335 .arg(qdb.lastError().databaseText())
336 .arg(qdb.lastError().driverText())
337 .arg(qdb.lastError().nativeErrorCode()));
344 double T1_ref = q.value(8).toDouble();
345 double T2_ref = q.value(9).toDouble();
346 double factor1 = q.value(10).toDouble();
347 double factor2 = q.value(11).toDouble();
349 double T1_frame = q.value(12).toDouble();
350 double T2_frame = q.value(13).toDouble();
353 double temperature_correction =
354 factor1 * (T1_ref - T1_frame) + factor2 * (T2_ref - T2_frame);
355 temperature_correction = (double)1.0 + (temperature_correction / 1.0e6);
357 tims_frame = std::make_shared<TimsFrameBase>(
360 tims_frame.get()->setMzCalibration(temperature_correction,
361 q.value(2).toDouble(),
362 q.value(3).toDouble(),
363 q.value(4).toDouble(),
364 q.value(5).toDouble(),
365 q.value(6).toDouble(),
366 q.value(7).toDouble());
368 tims_frame.get()->setAccumulationTime(q.value(1).toDouble());
370 tims_frame.get()->setTime(q.value(14).toDouble());
371 tims_frame.get()->setMsMsType(q.value(15).toUInt());
373 tims_frame.get()->setTimsCalibration(q.value(16).toInt(),
374 q.value(17).toDouble(),
375 q.value(18).toDouble(),
376 q.value(19).toDouble(),
377 q.value(20).toDouble(),
378 q.value(21).toDouble(),
379 q.value(22).toDouble(),
380 q.value(23).toDouble(),
381 q.value(24).toDouble(),
382 q.value(25).toDouble(),
383 q.value(26).toDouble());
391 std::vector<std::size_t>
395 qDebug() <<
" rt_begin=" << rt_begin <<
" rt_end=" << rt_end;
396 std::vector<std::size_t> tims_frameid_list;
398 QSqlQuery q = qdb.exec(QString(
"SELECT Frames.TimsId FROM Frames WHERE "
399 "Frames.MsMsType=0 AND (Frames.Time=>%1) AND "
400 "(Frames.Time<=%2) SORT BY Frames.Time;")
403 if(q.lastError().isValid())
407 QObject::tr(
"ERROR in TIMS sqlite database file %1, database name %2, "
409 "command %3:\n%4\n%5\n%6")
411 .arg(qdb.databaseName())
413 .arg(qdb.lastError().databaseText())
414 .arg(qdb.lastError().driverText())
415 .arg(qdb.lastError().nativeErrorCode()));
420 tims_frameid_list.push_back(q.value(0).toUInt());
422 return tims_frameid_list;
429 qDebug() <<
" timsId=" << timsId;
432 QSqlQuery q = qdb.exec(
433 QString(
"SELECT Frames.TimsId, Frames.AccumulationTime, "
434 " MzCalibration.DigitizerTimebase, MzCalibration.DigitizerDelay, "
435 "MzCalibration.C0, MzCalibration.C1, MzCalibration.C2, "
436 "MzCalibration.C3, MzCalibration.T1, MzCalibration.T2, "
437 "MzCalibration.dC1, MzCalibration.dC2, Frames.T1, Frames.T2, "
438 "Frames.Time, Frames.MsMsType, TimsCalibration.ModelType, "
439 "TimsCalibration.C0, TimsCalibration.C1, TimsCalibration.C2, "
440 "TimsCalibration.C3, TimsCalibration.C4, TimsCalibration.C5, "
441 "TimsCalibration.C6, TimsCalibration.C7, TimsCalibration.C8, "
442 "TimsCalibration.C9 FROM "
443 "Frames INNER JOIN MzCalibration ON "
444 "Frames.MzCalibration=MzCalibration.Id INNER JOIN TimsCalibration "
445 "ON Frames.TimsCalibration=TimsCalibration.Id where "
448 if(q.lastError().isValid())
452 QObject::tr(
"ERROR in TIMS sqlite database file %1, database name %2, "
454 "command %3:\n%4\n%5\n%6")
456 .arg(qdb.databaseName())
458 .arg(qdb.lastError().databaseText())
459 .arg(qdb.lastError().driverText())
460 .arg(qdb.lastError().nativeErrorCode()));
467 double T1_ref = q.value(8).toDouble();
468 double T2_ref = q.value(9).toDouble();
469 double factor1 = q.value(10).toDouble();
470 double factor2 = q.value(11).toDouble();
472 double T1_frame = q.value(12).toDouble();
473 double T2_frame = q.value(13).toDouble();
476 double temperature_correction =
477 factor1 * (T1_ref - T1_frame) + factor2 * (T2_ref - T2_frame);
478 temperature_correction = (double)1.0 + (temperature_correction / 1.0e6);
483 tims_frame.get()->setMzCalibration(temperature_correction,
484 q.value(2).toDouble(),
485 q.value(3).toDouble(),
486 q.value(4).toDouble(),
487 q.value(5).toDouble(),
488 q.value(6).toDouble(),
489 q.value(7).toDouble());
491 tims_frame.get()->setAccumulationTime(q.value(1).toDouble());
493 tims_frame.get()->setTime(q.value(14).toDouble());
494 tims_frame.get()->setMsMsType(q.value(15).toUInt());
496 tims_frame.get()->setTimsCalibration(q.value(16).toInt(),
497 q.value(17).toDouble(),
498 q.value(18).toDouble(),
499 q.value(19).toDouble(),
500 q.value(20).toDouble(),
501 q.value(21).toDouble(),
502 q.value(22).toDouble(),
503 q.value(23).toDouble(),
504 q.value(24).toDouble(),
505 q.value(25).toDouble(),
506 q.value(26).toDouble());
520 return frame->getMassSpectrumCstSPtr(scanNum);
541 return tims_frame.get()->getMsLevel();
547 bool want_binary_data)
563 spectrum_id.
setNativeId(QString(
"frame=%1 scan=%2 index=%3")
564 .arg(coordinate.first)
565 .arg(coordinate.second)
566 .arg(spectrum_index));
570 mass_spectrum.
setMsLevel(tims_frame.get()->getMsLevel());
578 tims_frame.get()->getDriftTime(coordinate.second));
581 QualifiedMassSpectrumParameter::OneOverK0,
582 tims_frame.get()->getOneOverK0Transformation(coordinate.second));
588 tims_frame.get()->getMassSpectrumSPtr(coordinate.second));
589 if(mass_spectrum.
size() > 0)
601 if(tims_frame.get()->getMsLevel() > 1)
605 QSqlQuery q = qdb.exec(
607 "SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
608 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
609 "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
610 "PasefFrameMsMsInfo.Frame=%1 and (PasefFrameMsMsInfo.ScanNumBegin "
611 "<= %2 and PasefFrameMsMsInfo.ScanNumEnd >= %2);")
612 .arg(coordinate.first)
613 .arg(coordinate.second));
614 if(q.lastError().isValid())
617 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
618 "command %2:\n%3\n%4\n%5")
621 .arg(qdb.lastError().databaseText())
622 .arg(qdb.lastError().driverText())
623 .arg(qdb.lastError().nativeErrorCode()));
635 q.value(14).toDouble(), coordinate.second);
639 QString(
"frame=%1 scan=%2 index=%3")
640 .arg(q.value(14).toDouble())
641 .arg(coordinate.second)
642 .arg(prec_spectrum_index));
645 QualifiedMassSpectrumParameter::IsolationMz, q.value(3).toDouble());
647 QualifiedMassSpectrumParameter::IsolationWidth,
648 q.value(4).toDouble());
651 QualifiedMassSpectrumParameter::CollisionEnergy,
652 q.value(5).toFloat());
654 QualifiedMassSpectrumParameter::BrukerPrecursorIndex,
659 return mass_spectrum;
665 std::size_t precursor_index,
666 bool want_binary_data)
680 qdb.exec(QString(
"SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
681 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
682 "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
684 .arg(precursor_index));
685 if(q.lastError().isValid())
689 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
690 "command %2:\n%3\n%4\n%5")
693 .arg(qdb.lastError().databaseText())
694 .arg(qdb.lastError().driverText())
695 .arg(qdb.lastError().nativeErrorCode()));
702 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
704 .arg(precursor_index));
713 std::size_t scan_mobility_start = 0;
714 std::size_t scan_mobility_end = 0;
715 std::set<std::size_t> tims_frame_list;
719 tims_frame_list.insert(q.value(14).toLongLong());
728 QString(
"frame=%1 begin=%2 end=%3 precursor=%4 idxms2=%5")
729 .arg(q.value(0).toLongLong())
730 .arg(q.value(1).toLongLong())
731 .arg(q.value(2).toLongLong())
732 .arg(precursor_index)
739 scan_mobility_start = q.value(1).toLongLong();
740 scan_mobility_end = q.value(2).toLongLong();
747 for(std::size_t tims_id : tims_frame_list)
756 QualifiedMassSpectrumParameter::OneOverK0begin,
757 tims_frame.get()->getOneOverK0Transformation(
758 scan_mobility_start));
761 QualifiedMassSpectrumParameter::OneOverK0end,
762 tims_frame.get()->getOneOverK0Transformation(
771 combiner.
combine(combiner_result,
772 tims_frame.get()->cumulateScanToTrace(
773 scan_mobility_start, scan_mobility_end));
786 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
788 .arg(precursor_index));
818 catch(std::exception &error)
820 qDebug() << __FILE__ <<
"@" << __LINE__ << __FUNCTION__ <<
"()"
821 << QString(
"Failure %1 ").arg(error.what());
823 return mass_spectrum;
830 std::size_t ms2_index,
831 std::size_t precursor_index,
832 bool want_binary_data)
842 QString(
"precursor=%1 idxms2=%2").arg(precursor_index).arg(ms2_index));
867 qdb.exec(QString(
"SELECT PasefFrameMsMsInfo.*, Precursors.* FROM "
868 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
869 "PasefFrameMsMsInfo.Precursor=Precursors.Id where "
871 .arg(precursor_index));
872 if(q.lastError().isValid())
876 QObject::tr(
"ERROR in TIMS sqlite database file %1, executing SQL "
877 "command %2:\n%3\n%4\n%5")
880 .arg(qdb.lastError().databaseText())
881 .arg(qdb.lastError().driverText())
882 .arg(qdb.lastError().nativeErrorCode()));
891 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
893 .arg(precursor_index));
900 std::size_t scan_mobility_start = 0;
901 std::size_t scan_mobility_end = 0;
902 std::vector<std::size_t> tims_frame_list;
906 tims_frame_list.push_back(q.value(0).toLongLong());
914 QString(
"frame=%1 begin=%2 end=%3 precursor=%4 idxms2=%5")
915 .arg(q.value(14).toLongLong())
916 .arg(q.value(1).toLongLong())
917 .arg(q.value(2).toLongLong())
918 .arg(precursor_index)
919 .arg(ms2_index - 1));
922 scan_mobility_start = q.value(1).toLongLong();
923 scan_mobility_end = q.value(2).toLongLong();
926 QualifiedMassSpectrumParameter::IsolationMz,
927 q.value(3).toDouble());
929 QualifiedMassSpectrumParameter::IsolationWidth,
930 q.value(4).toDouble());
933 QualifiedMassSpectrumParameter::CollisionEnergy,
934 q.value(5).toFloat());
936 QualifiedMassSpectrumParameter::BrukerPrecursorIndex,
948 for(std::size_t tims_id : tims_frame_list)
957 QualifiedMassSpectrumParameter::OneOverK0begin,
958 tims_frame.get()->getOneOverK0Transformation(
959 scan_mobility_start));
962 QualifiedMassSpectrumParameter::OneOverK0end,
963 tims_frame.get()->getOneOverK0Transformation(
973 combiner.
combine(combiner_result,
974 tims_frame.get()->cumulateScanToTrace(
975 scan_mobility_start, scan_mobility_end));
979 qDebug() <<
" precursor_index=" << precursor_index
980 <<
" num_rows=" << tims_frame_list.size()
981 <<
" sql=" << q.lastQuery() <<
" "
982 << (std::size_t)QThread::currentThreadId();
987 "ERROR in getQualifiedMassSpectrumByPrecursorId, precursor "
989 .arg(precursor_index));
997 qDebug() <<
"AAAAAAA";
1001 qDebug() << trace.size() <<
" "
1002 << (std::size_t)QThread::currentThreadId();
1032 catch(std::exception &error)
1034 qDebug() << __FILE__ <<
"@" << __LINE__ << __FUNCTION__ <<
"()"
1035 << QString(
"Failure %1 ").arg(error.what());
1044 QMutexLocker locker(&
m_mutex);
1047 if(tims_frame.get()->getId() == timsId)
1063 QMutexLocker locker(&
m_mutex);
1066 if(tims_frame.get()->getId() == timsId)
1090 std::vector<TimsXicStructure>
1092 const std::vector<std::size_t> &precursor_id_list,
1095 double rtRange)
const
1099 std::vector<TimsXicStructure> xic_list;
1105 for(
auto precursor_id : precursor_id_list)
1107 QSqlQuery q = qdb.exec(
1108 QString(
"SELECT Frames.Time, "
1109 "PasefFrameMsMsInfo.Frame,PasefFrameMsMsInfo.ScanNumBegin,"
1110 "PasefFrameMsMsInfo.ScanNumEnd, Precursors.MonoisotopicMz, "
1111 "Precursors.Charge FROM "
1112 "PasefFrameMsMsInfo INNER JOIN Precursors ON "
1113 "PasefFrameMsMsInfo.Precursor=Precursors.Id INNER JOIN "
1114 "Frames ON PasefFrameMsMsInfo.Frame=Frames.Id where "
1115 "Precursors.Id=%1;")
1116 .arg(precursor_id));
1117 if(q.lastError().isValid())
1122 "ERROR in TIMS sqlite database file %1, executing SQL "
1123 "command %2:\n%3\n%4\n%5")
1126 .arg(qdb.lastError().databaseText())
1127 .arg(qdb.lastError().driverText())
1128 .arg(qdb.lastError().nativeErrorCode()));
1141 MzRange(q.value(4).toDouble(), precision_ptr);
1143 xic_structure.
scanNumEnd = q.value(3).toUInt();
1144 xic_structure.
rtTarget = q.value(0).toDouble();
1147 xic_list.push_back(xic_structure);
1156 catch(std::exception &error)
1158 qDebug() << QString(
"Failure %1 ").arg(error.what());