libpappsomspp
Library for mass spectrometry
Loading...
Searching...
No Matches
timsframe.cpp
Go to the documentation of this file.
1/**
2 * \file pappsomspp/vendors/tims/timsframe.cpp
3 * \date 23/08/2019
4 * \author Olivier Langella
5 * \brief handle a single Bruker's TimsTof frame
6 */
7
8/*******************************************************************************
9 * Copyright (c) 2019 Olivier Langella <Olivier.Langella@u-psud.fr>.
10 *
11 * This file is part of the PAPPSOms++ library.
12 *
13 * PAPPSOms++ is free software: you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation, either version 3 of the License, or
16 * (at your option) any later version.
17 *
18 * PAPPSOms++ is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with PAPPSOms++. If not, see <http://www.gnu.org/licenses/>.
25 *
26 ******************************************************************************/
27
28#include "timsframe.h"
30#include <QDebug>
31#include <QObject>
32#include <QtEndian>
33#include <memory>
34
35namespace pappso
36{
37
39 const TimsFrame *fram_p, const XicCoordTims &xic_struct)
40{
41 xic_ptr = xic_struct.xicSptr.get();
42
44 mobilityIndexEnd = xic_struct.scanNumEnd;
46 fram_p->getMzCalibrationInterfaceSPtr().get()->getTofIndexFromMz(
47 xic_struct.mzRange.lower()); // convert mz to raw digitizer value
49 fram_p->getMzCalibrationInterfaceSPtr().get()->getTofIndexFromMz(
50 xic_struct.mzRange.upper());
51 tmpIntensity = 0;
52}
53
54TimsFrame::TimsFrame(std::size_t timsId, quint32 scanNum)
55 : TimsFrameBase(timsId, scanNum)
56{
57 // m_timsDataFrame.resize(10);
58}
59
60TimsFrame::TimsFrame(std::size_t timsId,
61 quint32 scanNum,
62 char *p_bytes,
63 std::size_t len)
64 : TimsFrameBase(timsId, scanNum)
65{
66 // langella@themis:~/developpement/git/bruker/cbuild$
67 // ./src/sample/timsdataSamplePappso
68 // /gorgone/pappso/fichiers_fabricants/Bruker/Demo_TimsTOF_juin2019/Samples/1922001/1922001-1_S-415_Pep_Pur-1ul_Slot1-10_1_2088.d/
69 // qDebug() << timsId;
70
71 m_binaryData.resize(len);
72
73 if(p_bytes != nullptr)
74 {
75 unshufflePacket(p_bytes);
76 }
77 else
78 {
79 if(m_scanCount == 0)
80 {
81
83 QObject::tr("TimsFrame::TimsFrame(%1,%2,nullptr,%3) FAILED")
84 .arg(m_frameId)
85 .arg(m_scanCount)
86 .arg(len));
87 }
88 }
89}
90
92{
93}
94
98
99
100void
102{
103 // qDebug();
104 quint64 len = m_binaryData.size();
105 if(len % 4 != 0)
106 {
108 QObject::tr("TimsFrame::unshufflePacket error: len % 4 != 0"));
109 }
110
111 quint64 nb_uint4 = len / 4;
112
113 char *dest = m_binaryData.data();
114 quint64 src_offset = 0;
115
116 for(quint64 j = 0; j < 4; j++)
117 {
118 for(quint64 i = 0; i < nb_uint4; i++)
119 {
120 dest[(i * 4) + j] = src[src_offset];
121 src_offset++;
122 }
123 }
124 // qDebug();
125}
126
127std::size_t
128TimsFrame::getScanPeakCount(std::size_t scanNum) const
129{
130 if(m_binaryData.size() == 0)
131 return 0;
132 /*
133 if(scanNum == 0)
134 {
135 quint32 res = (*(quint32 *)(m_timsDataFrame.constData() + 4)) -
136 (*(quint32 *)(m_timsDataFrame.constData()-4));
137 return res / 2;
138 }*/
139 if(scanNum == (m_scanCount - 1))
140 {
141 auto nb_uint4 = m_binaryData.size() / 4;
142
143 std::size_t cumul = 0;
144 for(quint32 i = 0; i < m_scanCount; i++)
145 {
146 cumul += (*(quint32 *)(m_binaryData.constData() + (i * 4)));
147 }
148 return (nb_uint4 - cumul) / 2;
149 }
150 checkScanNum(scanNum);
151
152 // quint32 *res = (quint32 *)(m_timsDataFrame.constData() + (scanNum * 4));
153 // qDebug() << " res=" << *res;
154 return (*(quint32 *)(m_binaryData.constData() + ((scanNum + 1) * 4))) / 2;
155}
156
157std::size_t
158TimsFrame::getScanOffset(std::size_t scanNum) const
159{
160 std::size_t offset = 0;
161 for(std::size_t i = 0; i < (scanNum + 1); i++)
162 {
163 offset += (*(quint32 *)(m_binaryData.constData() + (i * 4)));
164 }
165 return offset;
166}
167
168
169std::vector<quint32>
170TimsFrame::getScanTofIndexList(std::size_t scanNum) const
171{
172 // qDebug();
173 checkScanNum(scanNum);
174 std::vector<quint32> scan_tof;
175
176 if(m_binaryData.size() == 0)
177 return scan_tof;
178 scan_tof.resize(getScanPeakCount(scanNum));
179
180 std::size_t offset = getScanOffset(scanNum);
181
182 qint32 previous = -1;
183 for(std::size_t i = 0; i < scan_tof.size(); i++)
184 {
185 scan_tof[i] =
186 (*(quint32 *)(m_binaryData.constData() + (offset * 4) + (i * 8))) +
187 previous;
188 previous = scan_tof[i];
189 }
190 // qDebug();
191 return scan_tof;
192}
193
194std::vector<quint32>
195TimsFrame::getScanIntensityList(std::size_t scanNum) const
196{
197 // qDebug();
198 checkScanNum(scanNum);
199 std::vector<quint32> scan_intensities;
200
201 if(m_binaryData.size() == 0)
202 return scan_intensities;
203
204 scan_intensities.resize(getScanPeakCount(scanNum));
205
206 std::size_t offset = getScanOffset(scanNum);
207
208 for(std::size_t i = 0; i < scan_intensities.size(); i++)
209 {
210 scan_intensities[i] =
211 (*(quint32 *)(m_binaryData.constData() + (offset * 4) + (i * 8) + 4));
212 }
213 // qDebug();
214 return scan_intensities;
215}
216
217
218quint64
219TimsFrame::cumulateScanIntensities(std::size_t scanNum) const
220{
221 // qDebug();
222
223 quint64 summed_intensities = 0;
224
225 if(m_binaryData.size() == 0)
226 return summed_intensities;
227 // checkScanNum(scanNum);
228
229 std::size_t size = getScanPeakCount(scanNum);
230
231 std::size_t offset = getScanOffset(scanNum);
232
233 qint32 previous = -1;
234
235 for(std::size_t i = 0; i < size; i++)
236 {
237 quint32 x =
238 (*(quint32 *)((m_binaryData.constData() + (offset * 4) + (i * 8))) +
239 previous);
240
241 quint32 y =
242 (*(quint32 *)(m_binaryData.constData() + (offset * 4) + (i * 8) + 4));
243
244 previous = x;
245
246 summed_intensities += y;
247 }
248
249 // Normalization over the accumulation time for this frame.
250 summed_intensities *= ((double)100.0 / m_acqDurationInMilliseconds);
251
252 // qDebug();
253
254 return summed_intensities;
255}
256
257
258/**
259 * @brief ...
260 *
261 * @param mobility_scan_begin p_mobility_scan_begin:...
262 * @param mobility_scan_end p_mobility_scan_end:...
263 * @return quint64
264 */
265quint64
266TimsFrame::cumulateScanRangeIntensities(std::size_t mobility_scan_begin,
267 std::size_t mobility_scan_end) const
268{
269 quint64 summed_intensities = 0;
270
271 // qDebug() << "begin mobility_scan_begin =" << mobility_scan_begin
272 //<< "mobility_scan_end =" << mobility_scan_end;
273
274 if(m_binaryData.size() == 0)
275 return summed_intensities;
276
277 try
278 {
279 std::size_t mobility_scan_max = mobility_scan_end + 1;
280
281 for(std::size_t i = mobility_scan_begin; i < mobility_scan_max; i++)
282 {
283 // qDebug() << i;
284 summed_intensities += cumulateScanIntensities(i);
285 // qDebug() << i;
286 }
287 }
288 catch(std::exception &error)
289 {
290 qDebug() << QString("Failure in %1 %2 to %3 :\n %4")
291 .arg(__FUNCTION__)
292 .arg(mobility_scan_begin)
293 .arg(mobility_scan_end)
294 .arg(error.what());
295 }
296
297 // qDebug() << "end";
298
299 return summed_intensities;
300}
301
302
303void
304TimsFrame::cumulateScan(std::size_t scanNum,
305 TimsDataFastMap &accumulate_into) const
306{
307 // qDebug();
308
309 if(m_binaryData.size() == 0)
310 return;
311 // qDebug();
312
313 // checkScanNum(scanNum);
314
315 std::size_t scan_size = getScanPeakCount(scanNum);
316
317 std::size_t scan_offset = getScanOffset(scanNum);
318
319 qint32 previous = -1;
320 for(std::size_t i = 0; i < scan_size; i++)
321 {
322 quint32 x = (*(quint32 *)((m_binaryData.constData() + (scan_offset * 4) +
323 (i * 8))) +
324 previous);
325 quint32 y = (*(quint32 *)(m_binaryData.constData() + (scan_offset * 4) +
326 (i * 8) + 4));
327
328 previous = x;
329 // qDebug() << "x=" << x << " y=" << y;
330 accumulate_into.accumulateIntensity(x, y);
331 }
332
333 qDebug();
334}
335
336// Proof of concept m/z range-conditions for accumulations
337void
338TimsFrame::cumulateScan2(std::size_t scanNum,
339 TimsDataFastMap &accumulate_into,
340 quint32 accepted_tof_index_range_begin,
341 quint32 accepted_tof_index_range_end) const
342{
343 // qDebug();
344
345 if(m_binaryData.size() == 0)
346 return;
347
348 // checkScanNum(scanNum);
349
350 std::size_t scan_size = getScanPeakCount(scanNum);
351 std::size_t scan_offset = getScanOffset(scanNum);
352 qint32 previous = -1;
353
354 for(std::size_t i = 0; i < scan_size; i++)
355 {
356 quint32 x = (*(quint32 *)((m_binaryData.constData() + (scan_offset * 4) +
357 (i * 8))) +
358 previous);
359
360 previous = x;
361
362 if(x < accepted_tof_index_range_begin)
363 {
364
365 // qDebug() << "TOF index still not in range, x:" << x;
366 continue;
367 }
368 if(x > accepted_tof_index_range_end)
369 {
370 // qDebug() << "TOF index already out of range, x:" << x;
371 break;
372 }
373
374 // qDebug() << "TOF index in range, x:" << x;
375
376 quint32 y = (*(quint32 *)(m_binaryData.constData() + (scan_offset * 4) +
377 (i * 8) + 4));
378
379 accumulate_into.accumulateIntensity(x, y);
380 }
381
382 // qDebug();
383}
384
385
386Trace
387TimsFrame::cumulateScansToTrace(std::size_t mobility_scan_begin,
388 std::size_t mobility_scan_end) const
389{
390 // qDebug();
391
392 Trace new_trace;
393
394 try
395 {
396 if(m_binaryData.size() == 0)
397 return new_trace;
398 TimsDataFastMap &raw_spectrum =
400 raw_spectrum.clear();
401 // double local_accumulationTime = 0;
402
403 std::size_t mobility_scan_max = mobility_scan_end + 1;
404 qDebug();
405 for(std::size_t i = mobility_scan_begin; i < mobility_scan_max; i++)
406 {
407 // qDebug() << i;
408 cumulateScan(i, raw_spectrum);
409 // qDebug() << i;
410
411 // local_accumulationTime += m_accumulationTime;
412 }
413
414 // qDebug();
415
416 pappso::DataPoint data_point_cumul;
417
418
419 MzCalibrationInterface *mz_calibration_p =
421
422
423 for(quint32 tof_index : raw_spectrum.getTofIndexList())
424 {
425 data_point_cumul.x = mz_calibration_p->getMzFromTofIndex(tof_index);
426 // normalization
427 data_point_cumul.y = raw_spectrum.readIntensity(tof_index) *
428 ((double)100.0 / m_acqDurationInMilliseconds);
429 new_trace.push_back(data_point_cumul);
430 }
431 new_trace.sortX();
432
433 // qDebug();
434 }
435
436 catch(std::exception &error)
437 {
438 qDebug() << QString(
439 "Failure in TimsFrame::cumulateScanToTrace %1 to %2 :\n %3")
440 .arg(mobility_scan_begin, mobility_scan_end)
441 .arg(error.what());
442 }
443 return new_trace;
444}
445
446Trace
448 std::size_t mz_index_merge_window,
449 std::size_t mobility_scan_begin,
450 std::size_t mobility_scan_end,
451 quint32 &mz_minimum_index_out,
452 quint32 &mz_maximum_index_out) const
453{
454 // qDebug();
455
456 Trace new_trace;
457
458 try
459 {
460 if(m_binaryData.size() == 0)
461 {
462 qDebug() << "The frame is empty, returning empty trace.";
463 return new_trace;
464 }
465
466 // Allocate a map for (TOF,intensity) pairs to
467 // accumulate ion mobility scans.
468
469 TimsDataFastMap &raw_spectrum =
471 raw_spectrum.clear();
472 // double local_accumulationTime = 0;
473
474 std::size_t mobility_scan_max = mobility_scan_end + 1;
475
476 for(std::size_t i = mobility_scan_begin; i < mobility_scan_max; i++)
477 {
478 // qDebug() << "Going to cumulate currently iterated mobility scan:"
479 // << i;
480 cumulateScan(i, raw_spectrum);
481 // qDebug() << "Done cumulating currently iterated mobility scan:" <<
482 // i;
483
484 // local_accumulationTime += m_accumulationTime;
485 }
486
487 // qDebug();
488
489 pappso::DataPoint data_point_cumul;
490
491 MzCalibrationInterface *mz_calibration_p =
493
494 // If the caller asks that m/z values be binned larger than they are,
495 // ask that the m/z raw map be reduced in resolution.
496 if(mz_index_merge_window > 0)
497 {
498 raw_spectrum.downsizeMzRawMap(mz_index_merge_window);
499 }
500
501 // Store the first mz index and the last mz index of the current spectrum.
502 // The values are set to the out parameters.
503 mz_minimum_index_out = std::numeric_limits<quint32>::max();
504 mz_maximum_index_out = 0;
505
506 // FIXME: donc je comprends que les index sont contigus
507 // puisqu'on utilise at(key) ?
508 for(quint32 tof_index : raw_spectrum.getTofIndexList())
509 {
510 if(tof_index > mz_maximum_index_out)
511 mz_maximum_index_out = tof_index;
512 if(tof_index < mz_minimum_index_out)
513 mz_minimum_index_out = tof_index;
514
515 // Convert the TOF index to m/z
516 data_point_cumul.x = mz_calibration_p->getMzFromTofIndex(tof_index);
517
518 // Normalization
519 data_point_cumul.y = raw_spectrum.readIntensity(tof_index) *
520 ((double)100.0 / m_acqDurationInMilliseconds);
521
522 // Finally make the data point a new Trace point.
523 new_trace.push_back(data_point_cumul);
524 }
525
526 // qDebug() << "At this point we have mz_minimum_index_out:"
527 // << mz_minimum_index_out
528 // << "and mz_maximum_index_out:" << mz_maximum_index_out;
529
530 // FIXME: this does not seem to be necessary since raw_spectrum is a map
531 // with auto-sorting on the keys which are quint32.
532 // new_trace.sortX();
533
534 // qDebug();
535 }
536 catch(std::exception &error)
537 {
538 qDebug() << QString(
539 "Failure in TimsFrame::cumulateScanToTrace %1 to %2 :\n %3")
540 .arg(mobility_scan_begin, mobility_scan_end)
541 .arg(error.what());
542 }
543
544 // qDebug() << "Returning new trace of size:" << new_trace.size();
545
546 return new_trace;
547}
548
549
550Trace
552 std::size_t mz_index_merge_window,
553 double mz_range_begin,
554 double mz_range_end,
555 std::size_t mobility_scan_begin,
556 std::size_t mobility_scan_end,
557 quint32 &mz_minimum_index_out,
558 quint32 &mz_maximum_index_out) const
559{
560 // qDebug() << "Calling cumulateScansToTraceMzDownResolution2 for both mz and "
561 // "im ranges accounting.";
562
563 Trace new_trace;
564
565 try
566 {
567 if(m_binaryData.size() == 0)
568 {
569 qDebug() << "The frame is empty, returning empty trace.";
570 return new_trace;
571 }
572
573 // Allocate a map for (TOF index,intensity) pairs to
574 // accumulate ion mobility scans.
575
576 TimsDataFastMap &raw_spectrum =
578 raw_spectrum.clear();
579 // double local_accumulationTime = 0;
580
581 std::size_t mobility_scan_max = mobility_scan_end + 1;
582
583 quint32 tof_index_for_mz_range_begin =
584 getMzCalibrationInterfaceSPtr().get()->getTofIndexFromMz(
585 mz_range_begin);
586 quint32 tof_index_for_mz_range_end =
587 getMzCalibrationInterfaceSPtr().get()->getTofIndexFromMz(mz_range_end);
588
589 // qDebug() << "TOF index for mz range begin:"
590 // << tof_index_for_mz_range_begin;
591 // qDebug() << "TOF index for mz range end:"
592 // << tof_index_for_mz_range_end;
593
594 for(std::size_t iter = mobility_scan_begin; iter < mobility_scan_max;
595 iter++)
596 {
597 // qDebug() << "Going to cumulate currently iterated mobility scan:"
598 // << iter;
599 cumulateScan2(iter,
600 raw_spectrum,
601 tof_index_for_mz_range_begin,
602 tof_index_for_mz_range_end);
603 // qDebug() << "Done cumulating currently iterated mobility scan:" <<
604 // i;
605
606 // local_accumulationTime += m_accumulationTime;
607 }
608
609 // qDebug();
610
611 pappso::DataPoint data_point_cumul;
612
613 MzCalibrationInterface *mz_calibration_p =
615
616 // If the caller asks that m/z values be binned larger than they are,
617 // ask that the m/z raw map be reduced in resolution.
618 if(mz_index_merge_window > 0)
619 {
620 raw_spectrum.downsizeMzRawMap(mz_index_merge_window);
621 }
622
623 // Store the first mz index and the last mz index of the current spectrum.
624 // The values are set to the out parameters.
625 mz_minimum_index_out = std::numeric_limits<quint32>::max();
626 mz_maximum_index_out = 0;
627
628 // for(std::pair<quint32, quint32> pair_tof_intensity : raw_spectrum)
629 for(quint32 tof_index : raw_spectrum.getTofIndexList())
630 {
631 std::size_t intensity = raw_spectrum.readIntensity(tof_index);
632 if(tof_index > mz_maximum_index_out)
633 mz_maximum_index_out = tof_index;
634 if(tof_index < mz_minimum_index_out)
635 mz_minimum_index_out = tof_index;
636
637 // Convert the TOF index to m/z
638 data_point_cumul.x = mz_calibration_p->getMzFromTofIndex(tof_index);
639
640 // Normalization
641 data_point_cumul.y =
642 intensity * ((double)100.0 / m_acqDurationInMilliseconds);
643
644 // Finally make the data point a new Trace point.
645 new_trace.push_back(data_point_cumul);
646 }
647
648 // qDebug() << "At this point we have mz_minimum_index_out:"
649 // << mz_minimum_index_out
650 // << "and mz_maximum_index_out:" << mz_maximum_index_out;
651
652 // FIXME: this does not seem to be necessary since raw_spectrum is a map
653 // with auto-sorting on the keys which are quint32.
654 // new_trace.sortX();
655
656 // qDebug();
657 }
658 catch(std::exception &error)
659 {
660 qDebug() << QString(
661 "Failure in TimsFrame::cumulateScanToTrace %1 to %2 :\n %3")
662 .arg(mobility_scan_begin, mobility_scan_end)
663 .arg(error.what());
664 }
665
666 // qDebug() << "Returning new trace of size:" << new_trace.size();
667
668 return new_trace;
669}
670
671
672void
674 std::size_t scan_index_begin,
675 std::size_t scan_index_end) const
676{
677 // qDebug() << "begin mobility_scan_begin=" << mobility_scan_begin
678 //<< " mobility_scan_end=" << mobility_scan_end;
679
680 if(m_binaryData.size() == 0)
681 return;
682 try
683 {
684
685 std::size_t mobility_scan_max = scan_index_end + 1;
686 // if (mobility_scan_max > m_scanCount) mobility_scan_max = m_scanCount;
687 // qDebug();
688 for(std::size_t i = scan_index_begin; i < mobility_scan_max; i++)
689 {
690 // qDebug() << i;
691 cumulateScan(i, rawSpectrum);
692 // qDebug() << i;
693
694 // local_accumulationTime += m_accumulationTime;
695 }
696 }
697
698 catch(std::exception &error)
699 {
700 qDebug() << QString("Failure in %1 %2 to %3 :\n %4")
701 .arg(__FUNCTION__)
702 .arg(scan_index_begin)
703 .arg(scan_index_end)
704 .arg(error.what());
705 }
706
707 // qDebug() << "end";
708}
709
710
711void
713 std::size_t scan_index_begin,
714 std::size_t scan_index_end,
715 quint32 tof_index_begin,
716 quint32 tof_index_end) const
717{
718 // qDebug() << "tof_index_begin=" << tof_index_begin
719 // << " tof_index_end=" << tof_index_end;
720
721 //<< " mobility_scan_end=" << mobility_scan_end;
722
723 if(m_binaryData.size() == 0)
724 return;
725 try
726 {
727
728 std::size_t mobility_scan_max = scan_index_end + 1;
729 // if (mobility_scan_max > m_scanCount) mobility_scan_max = m_scanCount;
730 // qDebug();
731 for(std::size_t i = scan_index_begin; i < mobility_scan_max; i++)
732 {
733 // qDebug() << i;
734 cumulateScan2(i, rawSpectrum, tof_index_begin, tof_index_end);
735 // qDebug() << i << rawSpectrum.getTofIndexList().size();
736 // local_accumulationTime += m_accumulationTime;
737 }
738 }
739
740 catch(std::exception &error)
741 {
742 qDebug() << QString("Failure in %1 %2 to %3 :\n %4")
743 .arg(__FUNCTION__)
744 .arg(scan_index_begin)
745 .arg(scan_index_end)
746 .arg(error.what());
747 }
748
749 // qDebug() << "end";
750}
751
753TimsFrame::getMassSpectrumSPtr(std::size_t scanNum) const
754{
755
756 // qDebug() << " scanNum=" << scanNum;
757
758 checkScanNum(scanNum);
759
760 // qDebug();
761
762 pappso::MassSpectrumSPtr mass_spectrum_sptr =
763 std::make_shared<pappso::MassSpectrum>();
764 // std::vector<DataPoint>
765
766 if(m_binaryData.size() == 0)
767 return mass_spectrum_sptr;
768
769 // qDebug();
770
771 std::size_t size = getScanPeakCount(scanNum);
772
773 std::size_t offset = getScanOffset(scanNum);
774
775 MzCalibrationInterface *mz_calibration_p =
777
778
779 qint32 previous = -1;
780 qint32 tof_index;
781 // std::vector<quint32> index_list;
782 DataPoint data_point;
783 for(std::size_t i = 0; i < size; i++)
784 {
785 tof_index =
786 (*(quint32 *)((m_binaryData.constData() + (offset * 4) + (i * 8))) +
787 previous);
788 data_point.y =
789 (*(quint32 *)(m_binaryData.constData() + (offset * 4) + (i * 8) + 4));
790
791 // intensity normalization
792 data_point.y *= 100.0 / m_acqDurationInMilliseconds;
793
794 previous = tof_index;
795
796
797 // mz calibration
798 data_point.x = mz_calibration_p->getMzFromTofIndex(tof_index);
799 mass_spectrum_sptr.get()->push_back(data_point);
800 }
801
802 // qDebug();
803
804 return mass_spectrum_sptr;
805}
806
807
808Trace
809TimsFrame::getMobilityScan(std::size_t scanNum,
810 std::size_t mz_index_merge_window,
811 double mz_range_begin,
812 double mz_range_end,
813 quint32 &mz_minimum_index_out,
814 quint32 &mz_maximum_index_out) const
815{
816 // qDebug() << "mz_range_begin:" << mz_range_begin
817 // << "mz_range_end:" << mz_range_end
818 // << "mz_index_merge_window:" << mz_index_merge_window;
819
820 Trace spectrum;
821
822 quint32 mz_index_begin = 0;
823 quint32 mz_index_end = std::numeric_limits<quint32>::max();
824
825 if(mz_range_end > 0)
826 {
827 // qDebug() << "m/z range is requested.";
828
829 mz_index_begin =
830 msp_mzCalibration.get()->getTofIndexFromMz(mz_range_begin);
831 mz_index_end = msp_mzCalibration.get()->getTofIndexFromMz(mz_range_end);
832 }
833
834 // qDebug() << "After conversion of mz indices, mz_index_begin:"
835 // << mz_index_begin << "mz_index_end;" << mz_index_end;
836
837 auto raw_spectrum =
838 getRawValuePairList(scanNum, mz_index_begin, mz_index_end);
839
840 // qDebug() << " raw_spectrum.size();" << raw_spectrum.size();
841
842 if(mz_index_merge_window > 0)
843 {
844 // qDebug() << "mz_index_merge_window;=" << mz_index_merge_window
845 // << " raw_spectrum.size()=" << raw_spectrum.size();
847 mz_index_merge_window, raw_spectrum);
848 }
849
850 if(raw_spectrum.size() > 0)
851 {
852 mz_minimum_index_out = raw_spectrum.front().tof_index;
853 mz_maximum_index_out = raw_spectrum.back().tof_index;
854
855 for(auto &&element : raw_spectrum)
856 {
857 spectrum.push_back(DataPoint(
858 msp_mzCalibration.get()->getMzFromTofIndex(element.tof_index),
859 static_cast<double>(element.intensity_index)));
860
861 // intensity normalization
862 spectrum.back().y *= 100.0 / m_acqDurationInMilliseconds;
863 }
864 }
865
866 return spectrum;
867}
868
869void
871 std::vector<XicCoordTims *>::iterator &itXicListbegin,
872 std::vector<XicCoordTims *>::iterator &itXicListend,
873 Enums::XicExtractMethod method) const
874{
875 // qDebug() << std::distance(itXicListbegin, itXicListend);
876
877 std::vector<TimsFrame::XicComputeStructure> tmp_xic_list;
878
879 for(auto it = itXicListbegin; it != itXicListend; it++)
880 {
881 tmp_xic_list.push_back(TimsFrame::XicComputeStructure(this, **it));
882
883 // qDebug() << " tmp_xic_struct.mobilityIndexBegin="
884 // << tmp_xic_list.back().mobilityIndexBegin
885 // << " tmp_xic_struct.mobilityIndexEnd="
886 // << tmp_xic_list.back().mobilityIndexEnd;
887
888 // qDebug() << " tmp_xic_struct.mzIndexLowerBound="
889 // << tmp_xic_list.back().mzIndexLowerBound
890 // << " tmp_xic_struct.mzIndexUpperBound="
891 // << tmp_xic_list.back().mzIndexUpperBound;
892 }
893 if(tmp_xic_list.size() == 0)
894 return;
895 /*
896 std::sort(tmp_xic_list.begin(), tmp_xic_list.end(), [](const
897 TimsXicStructure &a, const TimsXicStructure &b) { return
898 a.mobilityIndexBegin < b.mobilityIndexBegin;
899 });
900 */
901 std::vector<std::size_t> unique_scan_num_list;
902 for(auto &&struct_xic : tmp_xic_list)
903 {
904 for(std::size_t scan = struct_xic.mobilityIndexBegin;
905 (scan <= struct_xic.mobilityIndexEnd) && (scan < m_scanCount);
906 scan++)
907 {
908 unique_scan_num_list.push_back(scan);
909 }
910 }
911 std::sort(unique_scan_num_list.begin(), unique_scan_num_list.end());
912 auto it_scan_num_end =
913 std::unique(unique_scan_num_list.begin(), unique_scan_num_list.end());
914 auto it_scan_num = unique_scan_num_list.begin();
915
916 while(it_scan_num != it_scan_num_end)
917 {
918 TraceSPtr ms_spectrum = getRawTraceSPtr(*it_scan_num);
919 // qDebug() << ms_spectrum.get()->toString();
920 for(auto &&tmp_xic_struct : tmp_xic_list)
921 {
922 if(((*it_scan_num) >= tmp_xic_struct.mobilityIndexBegin) &&
923 ((*it_scan_num) <= tmp_xic_struct.mobilityIndexEnd))
924 {
925 if(method == Enums::XicExtractMethod::max)
926 {
927 tmp_xic_struct.tmpIntensity +=
928 ms_spectrum.get()->maxY(tmp_xic_struct.mzIndexLowerBound,
929 tmp_xic_struct.mzIndexUpperBound);
930
931 // qDebug() << "tmp_xic_struct.tmpIntensity="
932 // << tmp_xic_struct.tmpIntensity;
933 }
934 else
935 {
936 // sum
937 tmp_xic_struct.tmpIntensity +=
938 ms_spectrum.get()->sumY(tmp_xic_struct.mzIndexLowerBound,
939 tmp_xic_struct.mzIndexUpperBound);
940
941 // qDebug() << "tmp_xic_struct.tmpIntensity="
942 // << tmp_xic_struct.tmpIntensity;
943 }
944 }
945 }
946 it_scan_num++;
947 }
948
949 for(auto &&tmp_xic_struct : tmp_xic_list)
950 {
951 if(tmp_xic_struct.tmpIntensity != 0)
952 {
953 // qDebug() << tmp_xic_struct.xic_ptr;
954
955 tmp_xic_struct.xic_ptr->push_back(
956 {m_rtInSeconds, tmp_xic_struct.tmpIntensity});
957 }
958 }
959
960 // qDebug();
961}
962
963
965TimsFrame::getRawTraceSPtr(std::size_t scanNum) const
966{
967
968 // qDebug();
969
970 pappso::TraceSPtr trace_sptr = std::make_shared<pappso::Trace>();
971 // std::vector<DataPoint>
972
973 if(m_binaryData.size() == 0)
974 return trace_sptr;
975 // qDebug();
976
977 std::size_t size = getScanPeakCount(scanNum);
978
979 std::size_t offset = getScanOffset(scanNum);
980
981 qint32 previous = -1;
982 std::vector<quint32> index_list;
983 for(std::size_t i = 0; i < size; i++)
984 {
985 DataPoint data_point(
986 (*(quint32 *)((m_binaryData.constData() + (offset * 4) + (i * 8))) +
987 previous),
988 (*(quint32 *)(m_binaryData.constData() + (offset * 4) + (i * 8) + 4)));
989
990 // intensity normalization
991 data_point.y *= 100.0 / m_acqDurationInMilliseconds;
992
993 previous = data_point.x;
994 trace_sptr.get()->push_back(data_point);
995 }
996 // qDebug();
997 return trace_sptr;
998}
999
1000
1001std::vector<TimsFrame::TofIndexIntensityPair>
1003 quint32 accepted_tof_index_range_begin,
1004 quint32 accepted_tof_index_range_end) const
1005{
1006 // qDebug() << accepted_tof_index_range_begin;
1007
1008 std::vector<TimsFrame::TofIndexIntensityPair> raw_value_pairs;
1009 // std::vector<DataPoint>
1010
1011 if(m_binaryData.size() == 0)
1012 return raw_value_pairs;
1013 // qDebug();
1014
1015 std::size_t size = getScanPeakCount(scanNum);
1016
1017 std::size_t offset = getScanOffset(scanNum);
1018
1019 // qDebug() << size;
1020 qint32 previous = -1;
1021 std::vector<quint32> index_list;
1022 for(std::size_t i = 0; i < size; i++)
1023 {
1024
1025 // qDebug() << i;
1026 TimsFrame::TofIndexIntensityPair raw_value_pair(
1027 {(*(quint32 *)((m_binaryData.constData() + (offset * 4) + (i * 8))) +
1028 previous),
1029 (*(quint32 *)(m_binaryData.constData() + (offset * 4) + (i * 8) +
1030 4))});
1031
1032 previous = raw_value_pair.tof_index;
1033 if(raw_value_pair.tof_index < accepted_tof_index_range_begin)
1034 {
1035 // qDebug() << "TOF index still not in range, x:" << x;
1036 continue;
1037 }
1038 if(raw_value_pair.tof_index > accepted_tof_index_range_end)
1039 {
1040 // qDebug() << "TOF index already out of range, x:" << x;
1041 break;
1042 }
1043
1044 raw_value_pairs.push_back(raw_value_pair);
1045 }
1046 // qDebug() << raw_value_pairs.size();
1047 return raw_value_pairs;
1048}
1049
1050} // namespace pappso
virtual double getMzFromTofIndex(quint32 tof_index)=0
get m/z from time of flight raw index
pappso_double lower() const
Definition mzrange.h:71
pappso_double upper() const
Definition mzrange.h:77
replacement for std::map
std::size_t accumulateIntensity(quint32 tofIndex, std::size_t intensity)
accumulates intesity for the given tof index
const std::vector< quint32 > & getTofIndexList() const
std::size_t readIntensity(quint32)
reads intensity for a tof_index
void downsizeMzRawMap(std::size_t mzindex_merge_window)
downsize mz resolution to lower the number of real mz computations
static TimsDataFastMap & getTimsDataFastMapInstance()
double m_rtInSeconds
retention time
MzCalibrationInterfaceSPtr msp_mzCalibration
virtual std::vector< TofIndexIntensityPair > & downgradeResolutionOfTofIndexIntensityPairList(std::size_t tof_index_merge_window, std::vector< TofIndexIntensityPair > &spectrum) const
Downgrade the TOF index resolution to lower the number of real m/z computations.
double m_acqDurationInMilliseconds
acquisition duration in milliseconds
TimsFrameBase(std::size_t frameId, quint32 scanCount)
constructor for binary independant tims frame
virtual const MzCalibrationInterfaceSPtr & getMzCalibrationInterfaceSPtr() const final
get the MzCalibration model to compute mz and TOF for this frame
quint32 m_scanCount
total number of scans contained in this frame
std::size_t m_frameId
Tims frame database id (the SQL identifier of this frame)
bool checkScanNum(std::size_t scanNum) const
check that this scan number exists
virtual Trace combineScansToTraceWithDowngradedMzResolution(std::size_t mzindex_merge_window, std::size_t scanNumBegin, std::size_t scanNumEnd, quint32 &mz_minimum_index, quint32 &mz_maximum_index) const override
cumulate spectrum given a scan number range need the binary file The intensities are normalized with ...
virtual quint64 cumulateScanRangeIntensities(std::size_t scanNumBegin, std::size_t scanNumEnd) const override
...
virtual quint64 cumulateScanIntensities(std::size_t scanNum) const override
virtual ~TimsFrame()
Definition timsframe.cpp:95
TimsFrame(std::size_t timsId, quint32 scanNum, char *p_bytes, std::size_t len)
Definition timsframe.cpp:60
QByteArray m_binaryData
Definition timsframe.h:288
virtual pappso::MassSpectrumSPtr getMassSpectrumSPtr(std::size_t scanNum) const override
get Mass spectrum with peaks for this scan index need the binary file
virtual Trace combineScansToTraceWithDowngradedMzResolution2(std::size_t mz_index_merge_window, double mz_range_begin, double mz_range_end, std::size_t mobility_scan_begin, std::size_t mobility_scan_end, quint32 &mz_minimum_index_out, quint32 &mz_maximum_index_out) const override
cumulate spectrum given a scan number range need the binary file The intensities are normalized with ...
virtual Trace cumulateScansToTrace(std::size_t scanIndexBegin, std::size_t scanIndexEnd) const override
cumulate scan list into a trace
virtual std::vector< quint32 > getScanIntensityList(std::size_t scanNum) const override
get raw intensities without transformation from one scan it needs intensity normalization
void unshufflePacket(const char *src)
unshuffle data packet of tims compression type 2
virtual std::vector< TofIndexIntensityPair > getRawValuePairList(std::size_t scanNum, quint32 accepted_tof_index_range_begin, quint32 accepted_tof_index_range_end) const
get the raw index tof_index and intensities (normalized)
virtual Trace getMobilityScan(std::size_t scanNum, std::size_t mz_index_merge_window, double mz_range_begin, double mz_range_end, quint32 &mz_minimum_index_out, quint32 &mz_maximum_index_out) const override
get a single mobility scan m/z + intensities
virtual void cumulateScan(std::size_t scanNum, TimsDataFastMap &accumulate_into) const
cumulate a scan into a map
virtual void cumulateScan2(std::size_t scanNum, TimsDataFastMap &accumulate_into, quint32 accepted_tof_index_range_begin, quint32 accepted_tof_index_range_end) const
virtual std::size_t getScanPeakCount(std::size_t scanIndex) const override
get the number of peaks in this spectrum need the binary file
std::size_t getScanOffset(std::size_t scanNum) const
get offset for this spectrum in the binary file
virtual std::vector< quint32 > getScanTofIndexList(std::size_t scanNum) const override
get raw index list for one given scan index are not TOF nor m/z, just index on digitizer
void extractTimsXicListInRtRange(std::vector< XicCoordTims * >::iterator &itXicListbegin, std::vector< XicCoordTims * >::iterator &itXicListend, Enums::XicExtractMethod method) const
void combineScansInTofIndexIntensityMap(TimsDataFastMap &rawSpectrum, std::size_t scan_index_begin, std::size_t scan_index_end) const override
cumulate scan list into a trace into a raw spectrum map
virtual pappso::TraceSPtr getRawTraceSPtr(std::size_t scanNum) const
get the raw index tof_index and intensities (normalized)
A simple container of DataPoint instances.
Definition trace.h:148
void sortX(Enums::SortOrder sort_order=Enums::SortOrder::ascending)
Definition trace.cpp:1039
@ max
maximum of intensities
Definition types.h:280
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
Definition aa.cpp:39
std::shared_ptr< Trace > TraceSPtr
Definition trace.h:135
std::shared_ptr< MassSpectrum > MassSpectrumSPtr
pappso_double x
Definition datapoint.h:24
pappso_double y
Definition datapoint.h:25
XicComputeStructure(const TimsFrame *fram_p, const XicCoordTims &xic_struct)
Definition timsframe.cpp:38
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
Definition xiccoord.h:135
MzRange mzRange
the mass to extract
Definition xiccoord.h:125