29#include "../../../pappsomspp/pappsoexception.h"
73 if(p_bytes !=
nullptr)
83 QObject::tr(
"TimsFrame::TimsFrame(%1,%2,nullptr,%3) FAILED")
108 QObject::tr(
"TimsFrame::unshufflePacket error: len % 4 != 0"));
111 quint64 nb_uint4 = len / 4;
114 quint64 src_offset = 0;
116 for(quint64 j = 0; j < 4; j++)
118 for(quint64 i = 0; i < nb_uint4; i++)
120 dest[(i * 4) + j] = src[src_offset];
143 std::size_t cumul = 0;
146 cumul += (*(quint32 *)(
m_binaryData.constData() + (i * 4)));
148 return (nb_uint4 - cumul) / 2;
154 return (*(quint32 *)(
m_binaryData.constData() + ((scanNum + 1) * 4))) / 2;
160 std::size_t offset = 0;
161 for(std::size_t i = 0; i < (scanNum + 1); i++)
163 offset += (*(quint32 *)(
m_binaryData.constData() + (i * 4)));
174 std::vector<quint32> scan_tof;
182 qint32 previous = -1;
183 for(std::size_t i = 0; i < scan_tof.size(); i++)
186 (*(quint32 *)(
m_binaryData.constData() + (offset * 4) + (i * 8))) +
188 previous = scan_tof[i];
199 std::vector<quint32> scan_intensities;
202 return scan_intensities;
208 for(std::size_t i = 0; i < scan_intensities.size(); i++)
210 scan_intensities[i] =
211 (*(quint32 *)(
m_binaryData.constData() + (offset * 4) + (i * 8) + 4));
214 return scan_intensities;
223 quint64 summed_intensities = 0;
226 return summed_intensities;
233 qint32 previous = -1;
235 for(std::size_t i = 0; i < size; i++)
238 (*(quint32 *)((
m_binaryData.constData() + (offset * 4) + (i * 8))) +
242 (*(quint32 *)(
m_binaryData.constData() + (offset * 4) + (i * 8) + 4));
246 summed_intensities +=
y;
254 return summed_intensities;
267 std::size_t mobility_scan_end)
const
269 quint64 summed_intensities = 0;
275 return summed_intensities;
279 std::size_t mobility_scan_max = mobility_scan_end + 1;
281 for(std::size_t i = mobility_scan_begin; i < mobility_scan_max; i++)
288 catch(std::exception &error)
290 qDebug() << QString(
"Failure in %1 %2 to %3 :\n %4")
292 .arg(mobility_scan_begin)
293 .arg(mobility_scan_end)
299 return summed_intensities;
318 qint32 previous = -1;
319 for(std::size_t i = 0; i < scan_size; i++)
321 quint32
x = (*(quint32 *)((
m_binaryData.constData() + (scan_offset * 4) +
324 quint32
y = (*(quint32 *)(
m_binaryData.constData() + (scan_offset * 4) +
328 qDebug() <<
"x=" <<
x <<
" y=" <<
y;
339 quint32 accepted_tof_index_range_begin,
340 quint32 accepted_tof_index_range_end)
const
351 qint32 previous = -1;
353 for(std::size_t i = 0; i < scan_size; i++)
355 quint32
x = (*(quint32 *)((
m_binaryData.constData() + (scan_offset * 4) +
361 if(
x < accepted_tof_index_range_begin)
364 qDebug() <<
"TOF index still not in range, x:" <<
x;
367 if(
x > accepted_tof_index_range_end)
369 qDebug() <<
"TOF index already out of range, x:" <<
x;
373 qDebug() <<
"TOF index in range, x:" <<
x;
375 quint32
y = (*(quint32 *)(
m_binaryData.constData() + (scan_offset * 4) +
387 std::size_t mobility_scan_end)
const
399 raw_spectrum.
clear();
402 std::size_t mobility_scan_max = mobility_scan_end + 1;
404 for(std::size_t i = mobility_scan_begin; i < mobility_scan_max; i++)
428 new_trace.push_back(data_point_cumul);
435 catch(std::exception &error)
438 "Failure in TimsFrame::cumulateScanToTrace %1 to %2 :\n %3")
439 .arg(mobility_scan_begin, mobility_scan_end)
447 std::size_t mz_index_merge_window,
448 std::size_t mobility_scan_begin,
449 std::size_t mobility_scan_end,
450 quint32 &mz_minimum_index_out,
451 quint32 &mz_maximum_index_out)
const
461 qDebug() <<
"The frame is empty, returning empty trace.";
470 raw_spectrum.
clear();
473 std::size_t mobility_scan_max = mobility_scan_end + 1;
475 for(std::size_t i = mobility_scan_begin; i < mobility_scan_max; i++)
495 if(mz_index_merge_window > 0)
502 mz_minimum_index_out = std::numeric_limits<quint32>::max();
503 mz_maximum_index_out = 0;
509 if(tof_index > mz_maximum_index_out)
510 mz_maximum_index_out = tof_index;
511 if(tof_index < mz_minimum_index_out)
512 mz_minimum_index_out = tof_index;
522 new_trace.push_back(data_point_cumul);
535 catch(std::exception &error)
538 "Failure in TimsFrame::cumulateScanToTrace %1 to %2 :\n %3")
539 .arg(mobility_scan_begin, mobility_scan_end)
551 std::size_t mz_index_merge_window,
552 double mz_range_begin,
554 std::size_t mobility_scan_begin,
555 std::size_t mobility_scan_end,
556 quint32 &mz_minimum_index_out,
557 quint32 &mz_maximum_index_out)
const
559 qDebug() <<
"Calling cumulateScansToTraceMzDownResolution2 for both mz and "
560 "im ranges accounting.";
568 qDebug() <<
"The frame is empty, returning empty trace.";
577 raw_spectrum.
clear();
580 std::size_t mobility_scan_max = mobility_scan_end + 1;
582 quint32 tof_index_for_mz_range_begin =
585 quint32 tof_index_for_mz_range_end =
588 qDebug() <<
"20240529 TOF index for mz range begin:"
589 << tof_index_for_mz_range_begin;
590 qDebug() <<
"20240529 TOF index for mz range end:"
591 << tof_index_for_mz_range_end;
593 for(std::size_t iter = mobility_scan_begin; iter < mobility_scan_max;
600 tof_index_for_mz_range_begin,
601 tof_index_for_mz_range_end);
617 if(mz_index_merge_window > 0)
624 mz_minimum_index_out = std::numeric_limits<quint32>::max();
625 mz_maximum_index_out = 0;
630 std::size_t intensity = raw_spectrum.
readIntensity(tof_index);
631 if(tof_index > mz_maximum_index_out)
632 mz_maximum_index_out = tof_index;
633 if(tof_index < mz_minimum_index_out)
634 mz_minimum_index_out = tof_index;
644 new_trace.push_back(data_point_cumul);
657 catch(std::exception &error)
660 "Failure in TimsFrame::cumulateScanToTrace %1 to %2 :\n %3")
661 .arg(mobility_scan_begin, mobility_scan_end)
673 std::size_t scan_index_begin,
674 std::size_t scan_index_end)
const
684 std::size_t mobility_scan_max = scan_index_end + 1;
687 for(std::size_t i = scan_index_begin; i < mobility_scan_max; i++)
696 catch(std::exception &error)
698 qDebug() << QString(
"Failure in %1 %2 to %3 :\n %4")
700 .arg(scan_index_begin)
711 std::size_t scan_index_begin,
712 std::size_t scan_index_end,
713 quint32 tof_index_begin,
714 quint32 tof_index_end)
const
716 qDebug() <<
"tof_index_begin=" << tof_index_begin
717 <<
" tof_index_end=" << tof_index_end;
725 std::size_t mobility_scan_max = scan_index_end + 1;
728 for(std::size_t i = scan_index_begin; i < mobility_scan_max; i++)
731 cumulateScan2(i, rawSpectrum, tof_index_begin, tof_index_end);
737 catch(std::exception &error)
739 qDebug() << QString(
"Failure in %1 %2 to %3 :\n %4")
741 .arg(scan_index_begin)
760 std::make_shared<pappso::MassSpectrum>();
764 return mass_spectrum_sptr;
776 qint32 previous = -1;
780 for(std::size_t i = 0; i < size; i++)
783 (*(quint32 *)((
m_binaryData.constData() + (offset * 4) + (i * 8))) +
786 (*(quint32 *)(
m_binaryData.constData() + (offset * 4) + (i * 8) + 4));
791 previous = tof_index;
796 mass_spectrum_sptr.get()->push_back(data_point);
801 return mass_spectrum_sptr;
807 std::size_t mz_index_merge_window,
808 double mz_range_begin,
810 quint32 &mz_minimum_index_out,
811 quint32 &mz_maximum_index_out)
const
813 qDebug() <<
"mz_range_begin:" << mz_range_begin
814 <<
"mz_range_end:" << mz_range_end
815 <<
"mz_index_merge_window:" << mz_index_merge_window;
819 quint32 mz_index_begin = 0;
820 quint32 mz_index_end = std::numeric_limits<quint32>::max();
824 qDebug() <<
"m/z range is requested.";
831 qDebug() <<
"After conversion of mz indices, mz_index_begin:"
832 << mz_index_begin <<
"mz_index_end;" << mz_index_end;
837 qDebug() <<
" raw_spectrum.size();" << raw_spectrum.size();
839 if(mz_index_merge_window > 0)
841 qDebug() <<
"mz_index_merge_window;=" << mz_index_merge_window
842 <<
" raw_spectrum.size()=" << raw_spectrum.size();
844 mz_index_merge_window, raw_spectrum);
847 if(raw_spectrum.size() > 0)
849 mz_minimum_index_out = raw_spectrum.front().tof_index;
850 mz_maximum_index_out = raw_spectrum.back().tof_index;
852 for(
auto &&element : raw_spectrum)
856 static_cast<double>(element.intensity_index)));
868 std::vector<XicCoordTims *>::iterator &itXicListbegin,
869 std::vector<XicCoordTims *>::iterator &itXicListend,
872 qDebug() << std::distance(itXicListbegin, itXicListend);
874 std::vector<TimsFrame::XicComputeStructure> tmp_xic_list;
876 for(
auto it = itXicListbegin; it != itXicListend; it++)
880 qDebug() <<
" tmp_xic_struct.mobilityIndexBegin="
881 << tmp_xic_list.back().mobilityIndexBegin
882 <<
" tmp_xic_struct.mobilityIndexEnd="
883 << tmp_xic_list.back().mobilityIndexEnd;
885 qDebug() <<
" tmp_xic_struct.mzIndexLowerBound="
886 << tmp_xic_list.back().mzIndexLowerBound
887 <<
" tmp_xic_struct.mzIndexUpperBound="
888 << tmp_xic_list.back().mzIndexUpperBound;
890 if(tmp_xic_list.size() == 0)
898 std::vector<std::size_t> unique_scan_num_list;
899 for(
auto &&struct_xic : tmp_xic_list)
901 for(std::size_t scan = struct_xic.mobilityIndexBegin;
902 (scan <= struct_xic.mobilityIndexEnd) && (scan <
m_scanCount);
905 unique_scan_num_list.push_back(scan);
908 std::sort(unique_scan_num_list.begin(), unique_scan_num_list.end());
909 auto it_scan_num_end =
910 std::unique(unique_scan_num_list.begin(), unique_scan_num_list.end());
911 auto it_scan_num = unique_scan_num_list.begin();
913 while(it_scan_num != it_scan_num_end)
917 for(
auto &&tmp_xic_struct : tmp_xic_list)
919 if(((*it_scan_num) >= tmp_xic_struct.mobilityIndexBegin) &&
920 ((*it_scan_num) <= tmp_xic_struct.mobilityIndexEnd))
924 tmp_xic_struct.tmpIntensity +=
925 ms_spectrum.get()->maxY(tmp_xic_struct.mzIndexLowerBound,
926 tmp_xic_struct.mzIndexUpperBound);
928 qDebug() <<
"tmp_xic_struct.tmpIntensity="
929 << tmp_xic_struct.tmpIntensity;
934 tmp_xic_struct.tmpIntensity +=
935 ms_spectrum.get()->sumY(tmp_xic_struct.mzIndexLowerBound,
936 tmp_xic_struct.mzIndexUpperBound);
937 qDebug() <<
"tmp_xic_struct.tmpIntensity="
938 << tmp_xic_struct.tmpIntensity;
945 for(
auto &&tmp_xic_struct : tmp_xic_list)
947 if(tmp_xic_struct.tmpIntensity != 0)
949 qDebug() << tmp_xic_struct.xic_ptr;
950 tmp_xic_struct.xic_ptr->push_back(
976 qint32 previous = -1;
977 std::vector<quint32> index_list;
978 for(std::size_t i = 0; i < size; i++)
981 (*(quint32 *)((
m_binaryData.constData() + (offset * 4) + (i * 8))) +
983 (*(quint32 *)(
m_binaryData.constData() + (offset * 4) + (i * 8) + 4)));
988 previous = data_point.
x;
989 trace_sptr.get()->push_back(data_point);
996std::vector<TimsFrame::TofIndexIntensityPair>
998 quint32 accepted_tof_index_range_begin,
999 quint32 accepted_tof_index_range_end)
const
1003 std::vector<TimsFrame::TofIndexIntensityPair> raw_value_pairs;
1007 return raw_value_pairs;
1015 qint32 previous = -1;
1016 std::vector<quint32> index_list;
1017 for(std::size_t i = 0; i < size; i++)
1022 {(*(quint32 *)((
m_binaryData.constData() + (offset * 4) + (i * 8))) +
1024 (*(quint32 *)(
m_binaryData.constData() + (offset * 4) + (i * 8) +
1028 if(raw_value_pair.tof_index < accepted_tof_index_range_begin)
1033 if(raw_value_pair.tof_index > accepted_tof_index_range_end)
1039 raw_value_pairs.push_back(raw_value_pair);
1041 qDebug() << raw_value_pairs.size();
1042 return raw_value_pairs;
virtual double getMzFromTofIndex(quint32 tof_index)=0
get m/z from time of flight raw index
pappso_double lower() const
pappso_double upper() const
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
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
TimsFrame(std::size_t timsId, quint32 scanNum, char *p_bytes, std::size_t len)
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, 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.
void sortX(SortOrder sort_order=SortOrder::ascending)
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
std::shared_ptr< Trace > TraceSPtr
std::shared_ptr< MassSpectrum > MassSpectrumSPtr
@ max
maximum of intensities
XicComputeStructure(const TimsFrame *fram_p, const XicCoordTims &xic_struct)
std::size_t mobilityIndexBegin
std::size_t mzIndexUpperBound
std::size_t mzIndexLowerBound
std::size_t mobilityIndexEnd
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
MzRange mzRange
the mass to extract
handle a single Bruker's TimsTof frame