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;
148 return (nb_uint4 - cumul) / 2;
154 return (*(quint32 *)(
m_timsDataFrame.constData() + ((scanNum + 1) * 4))) / 2;
160 std::size_t offset = 0;
161 for(std::size_t i = 0; i < (scanNum + 1); i++)
174 std::vector<quint32> scan_tof;
182 qint32 previous = -1;
183 for(std::size_t i = 0; i < scan_tof.size(); i++)
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++)
211 (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_timsDataFrame.constData() + (offset * 4) + (i * 8))) +
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++)
322 (scan_offset * 4) + (i * 8))) +
325 (scan_offset * 4) + (i * 8) + 4));
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++)
356 (scan_offset * 4) + (i * 8))) +
359 if(
x < accepted_tof_index_range_begin)
364 if(
x > accepted_tof_index_range_end)
373 (scan_offset * 4) + (i * 8) + 4));
386 std::size_t mobility_scan_end)
const
401 std::size_t mobility_scan_max = mobility_scan_end + 1;
403 for(std::size_t i = mobility_scan_begin; i < mobility_scan_max; i++)
427 new_trace.push_back(data_point_cumul);
434 catch(std::exception &error)
437 "Failure in TimsFrame::cumulateScanToTrace %1 to %2 :\n %3")
438 .arg(mobility_scan_begin, mobility_scan_end)
446 std::size_t mz_index_merge_window,
447 std::size_t mobility_scan_begin,
448 std::size_t mobility_scan_end,
449 quint32 &mz_minimum_index_out,
450 quint32 &mz_maximum_index_out)
const
460 qDebug() <<
"The frame is empty, returning empty trace.";
472 std::size_t mobility_scan_max = mobility_scan_end + 1;
474 for(std::size_t i = mobility_scan_begin; i < mobility_scan_max; i++)
494 if(mz_index_merge_window > 0)
501 mz_minimum_index_out = std::numeric_limits<quint32>::max();
502 mz_maximum_index_out = 0;
506 if(tof_index > mz_maximum_index_out)
507 mz_maximum_index_out = tof_index;
508 if(tof_index < mz_minimum_index_out)
509 mz_minimum_index_out = tof_index;
519 new_trace.push_back(data_point_cumul);
532 catch(std::exception &error)
535 "Failure in TimsFrame::cumulateScanToTrace %1 to %2 :\n %3")
536 .arg(mobility_scan_begin, mobility_scan_end)
548 std::size_t mz_index_merge_window,
549 double mz_range_begin,
551 std::size_t mobility_scan_begin,
552 std::size_t mobility_scan_end,
553 quint32 &mz_minimum_index_out,
554 quint32 &mz_maximum_index_out)
const
556 qDebug() <<
"Calling cumulateScansToTraceMzDownResolution2 for both mz and "
557 "im ranges accounting.";
565 qDebug() <<
"The frame is empty, returning empty trace.";
577 std::size_t mobility_scan_max = mobility_scan_end + 1;
579 quint32 tof_index_for_mz_range_begin =
582 quint32 tof_index_for_mz_range_end =
585 qDebug() <<
"20240529 TOF index for mz range begin:"
586 << tof_index_for_mz_range_begin;
587 qDebug() <<
"20240529 TOF index for mz range end:"
588 << tof_index_for_mz_range_end;
590 for(std::size_t iter = mobility_scan_begin; iter < mobility_scan_max;
597 tof_index_for_mz_range_begin,
598 tof_index_for_mz_range_end);
614 if(mz_index_merge_window > 0)
621 mz_minimum_index_out = std::numeric_limits<quint32>::max();
622 mz_maximum_index_out = 0;
627 std::size_t intensity = raw_spectrum.
readIntensity(tof_index);
628 if(tof_index > mz_maximum_index_out)
629 mz_maximum_index_out = tof_index;
630 if(tof_index < mz_minimum_index_out)
631 mz_minimum_index_out = tof_index;
640 new_trace.push_back(data_point_cumul);
653 catch(std::exception &error)
656 "Failure in TimsFrame::cumulateScanToTrace %1 to %2 :\n %3")
657 .arg(mobility_scan_begin, mobility_scan_end)
669 std::size_t mobility_scan_begin,
670 std::size_t mobility_scan_end)
const
680 std::size_t mobility_scan_max = mobility_scan_end + 1;
682 for(std::size_t i = mobility_scan_begin; i < mobility_scan_max; i++)
691 catch(std::exception &error)
693 qDebug() << QString(
"Failure in %1 %2 to %3 :\n %4")
695 .arg(mobility_scan_begin)
696 .arg(mobility_scan_end)
715 std::make_shared<pappso::MassSpectrum>();
719 return mass_spectrum_sptr;
731 qint32 previous = -1;
735 for(std::size_t i = 0; i < size; i++)
738 (*(quint32 *)((
m_timsDataFrame.constData() + (offset * 4) + (i * 8))) +
746 previous = tof_index;
751 mass_spectrum_sptr.get()->push_back(data_point);
756 return mass_spectrum_sptr;
762 std::size_t mz_index_merge_window,
763 double mz_range_begin,
765 quint32 &mz_minimum_index_out,
766 quint32 &mz_maximum_index_out)
const
768 qDebug() <<
"mz_range_begin:" << mz_range_begin
769 <<
"mz_range_end:" << mz_range_end
770 <<
"mz_index_merge_window:" << mz_index_merge_window;
774 quint32 mz_index_begin = 0;
775 quint32 mz_index_end = std::numeric_limits<quint32>::max();
779 qDebug() <<
"m/z range is requested.";
786 qDebug() <<
"After conversion of mz indices, mz_index_begin:"
787 << mz_index_begin <<
"mz_index_end;" << mz_index_end;
792 qDebug() <<
" raw_spectrum.size();" << raw_spectrum.size();
794 if(mz_index_merge_window > 0)
796 qDebug() <<
"mz_index_merge_window;=" << mz_index_merge_window
797 <<
" raw_spectrum.size()=" << raw_spectrum.size();
802 if(raw_spectrum.size() > 0)
804 mz_minimum_index_out = raw_spectrum.front().mz_tof_index;
805 mz_maximum_index_out = raw_spectrum.back().mz_tof_index;
807 for(
auto &&element : raw_spectrum)
811 static_cast<double>(element.intensity_index)));
823 std::vector<XicCoordTims *>::iterator &itXicListbegin,
824 std::vector<XicCoordTims *>::iterator &itXicListend,
827 qDebug() << std::distance(itXicListbegin, itXicListend);
829 std::vector<TimsFrame::XicComputeStructure> tmp_xic_list;
831 for(
auto it = itXicListbegin; it != itXicListend; it++)
835 qDebug() <<
" tmp_xic_struct.mobilityIndexBegin="
836 << tmp_xic_list.back().mobilityIndexBegin
837 <<
" tmp_xic_struct.mobilityIndexEnd="
838 << tmp_xic_list.back().mobilityIndexEnd;
840 qDebug() <<
" tmp_xic_struct.mzIndexLowerBound="
841 << tmp_xic_list.back().mzIndexLowerBound
842 <<
" tmp_xic_struct.mzIndexUpperBound="
843 << tmp_xic_list.back().mzIndexUpperBound;
845 if(tmp_xic_list.size() == 0)
853 std::vector<std::size_t> unique_scan_num_list;
854 for(
auto &&struct_xic : tmp_xic_list)
856 for(std::size_t scan = struct_xic.mobilityIndexBegin;
857 (scan <= struct_xic.mobilityIndexEnd) && (scan <
m_scanNumber);
860 unique_scan_num_list.push_back(scan);
863 std::sort(unique_scan_num_list.begin(), unique_scan_num_list.end());
864 auto it_scan_num_end =
865 std::unique(unique_scan_num_list.begin(), unique_scan_num_list.end());
866 auto it_scan_num = unique_scan_num_list.begin();
868 while(it_scan_num != it_scan_num_end)
872 for(
auto &&tmp_xic_struct : tmp_xic_list)
874 if(((*it_scan_num) >= tmp_xic_struct.mobilityIndexBegin) &&
875 ((*it_scan_num) <= tmp_xic_struct.mobilityIndexEnd))
879 tmp_xic_struct.tmpIntensity +=
880 ms_spectrum.get()->maxY(tmp_xic_struct.mzIndexLowerBound,
881 tmp_xic_struct.mzIndexUpperBound);
883 qDebug() <<
"tmp_xic_struct.tmpIntensity="
884 << tmp_xic_struct.tmpIntensity;
889 tmp_xic_struct.tmpIntensity +=
890 ms_spectrum.get()->sumY(tmp_xic_struct.mzIndexLowerBound,
891 tmp_xic_struct.mzIndexUpperBound);
892 qDebug() <<
"tmp_xic_struct.tmpIntensity="
893 << tmp_xic_struct.tmpIntensity;
900 for(
auto &&tmp_xic_struct : tmp_xic_list)
902 if(tmp_xic_struct.tmpIntensity != 0)
904 qDebug() << tmp_xic_struct.xic_ptr;
905 tmp_xic_struct.xic_ptr->push_back(
906 {
m_time, tmp_xic_struct.tmpIntensity});
931 qint32 previous = -1;
932 std::vector<quint32> index_list;
933 for(std::size_t i = 0; i < size; i++)
936 (*(quint32 *)((
m_timsDataFrame.constData() + (offset * 4) + (i * 8))) +
944 previous = data_point.
x;
945 trace_sptr.get()->push_back(data_point);
952std::vector<TimsFrame::RawValuePair>
954 quint32 accepted_tof_index_range_begin,
955 quint32 accepted_tof_index_range_end)
const
959 std::vector<TimsFrame::RawValuePair> raw_value_pairs;
963 return raw_value_pairs;
971 qint32 previous = -1;
972 std::vector<quint32> index_list;
973 for(std::size_t i = 0; i < size; i++)
978 {(*(quint32 *)((
m_timsDataFrame.constData() + (offset * 4) + (i * 8))) +
984 if(raw_value_pair.mz_tof_index < accepted_tof_index_range_begin)
989 if(raw_value_pair.mz_tof_index > accepted_tof_index_range_end)
995 raw_value_pairs.push_back(raw_value_pair);
997 qDebug() << raw_value_pairs.size();
998 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
double m_accumulationTime
accumulation time in milliseconds
virtual std::vector< RawValuePair > & downsizeMzRawValuePairList(std::size_t mzindex_merge_window, std::vector< RawValuePair > &spectrum) const
downsize mz resolution to lower the number of real mz computations
MzCalibrationInterfaceSPtr msp_mzCalibration
double m_time
retention time
quint32 m_scanNumber
total number of scans contained in this frame
std::size_t m_timsId
Tims frame database id (the SQL identifier of this frame)
virtual const MzCalibrationInterfaceSPtr & getMzCalibrationInterfaceSPtr() const final
get the MzCalibration model to compute mz and TOF for this frame
bool checkScanNum(std::size_t scanNum) const
check that this scan number exists
QByteArray m_timsDataFrame
virtual std::vector< quint32 > getScanIndexList(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
virtual std::size_t getNbrPeaks(std::size_t scanNum) const override
get the number of peaks in this spectrum need the binary file
virtual Trace cumulateScansToTraceMzDownResolution(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 cumulateScansIntensities(std::size_t scanNumBegin, std::size_t scanNumEnd) const override
...
virtual Trace cumulateScansToTraceMzDownResolution2(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 scanNumBegin, std::size_t scanNumEnd) const override
cumulate scan list into a trace
TimsFrame(std::size_t timsId, quint32 scanNum, char *p_bytes, std::size_t len)
virtual std::vector< RawValuePair > 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 pappso::MassSpectrumSPtr getMassSpectrumSPtr(std::size_t scanNum) const override
get Mass spectrum with peaks for this scan number need the binary file
virtual quint64 cumulateSingleScanIntensities(std::size_t scanNum) const override
virtual std::vector< quint32 > getScanIntensities(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 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
std::size_t getScanOffset(std::size_t scanNum) const
get offset for this spectrum in the binary file
virtual void cumulateScansInRawMap(TimsDataFastMap &rawSpectrum, std::size_t scanNumBegin, std::size_t scanNumEnd) const override
cumulate scan list into a trace into a raw spectrum map
void extractTimsXicListInRtRange(std::vector< XicCoordTims * >::iterator &itXicListbegin, std::vector< XicCoordTims * >::iterator &itXicListend, XicExtractMethod method) const
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
std::size_t accumulateIntensity(quint32 tofIndex, std::size_t intensity)
accumulates intesity for the given tof index
std::size_t readIntensity(quint32)
reads intensity for a tof_index
std::vector< quint32 > tofIndexList
void downsizeMzRawMap(std::size_t mzindex_merge_window)
downsize mz resolution to lower the number of real mz computations
static TimsDataFastMap & getTimsDataFastMapInstance()
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