29#include "../../../pappsomspp/pappsoexception.h"
74 if(p_bytes !=
nullptr)
84 QObject::tr(
"TimsFrame::TimsFrame(%1,%2,nullptr,%3) FAILED")
109 QObject::tr(
"TimsFrame::unshufflePacket error: len % 4 != 0"));
112 quint64 nb_uint4 = len / 4;
115 quint64 src_offset = 0;
117 for(quint64 j = 0; j < 4; j++)
119 for(quint64 i = 0; i < nb_uint4; i++)
121 dest[(i * 4) + j] = src[src_offset];
144 std::size_t cumul = 0;
149 return (nb_uint4 - cumul) / 2;
155 return (*(quint32 *)(
m_timsDataFrame.constData() + ((scanNum + 1) * 4))) / 2;
161 std::size_t offset = 0;
162 for(std::size_t i = 0; i < (scanNum + 1); i++)
175 std::vector<quint32> scan_tof;
183 qint32 previous = -1;
184 for(std::size_t i = 0; i < scan_tof.size(); i++)
189 previous = scan_tof[i];
200 std::vector<quint32> scan_intensities;
203 return scan_intensities;
209 for(std::size_t i = 0; i < scan_intensities.size(); i++)
212 (offset * 4) + (i * 8) + 4));
215 return scan_intensities;
224 quint64 summed_intensities = 0;
227 return summed_intensities;
234 qint32 previous = -1;
236 for(std::size_t i = 0; i < size; i++)
239 (*(quint32 *)((
m_timsDataFrame.constData() + (offset * 4) + (i * 8))) +
247 summed_intensities +=
y;
255 return summed_intensities;
268 std::size_t mobility_scan_end)
const
270 quint64 summed_intensities = 0;
276 return summed_intensities;
280 std::size_t mobility_scan_max = mobility_scan_end + 1;
282 for(std::size_t i = mobility_scan_begin; i < mobility_scan_max; i++)
289 catch(std::exception &error)
291 qDebug() << QString(
"Failure in %1 %2 to %3 :\n %4")
293 .arg(mobility_scan_begin)
294 .arg(mobility_scan_end)
300 return summed_intensities;
306 std::map<quint32, quint32> &accumulate_into)
const
319 qint32 previous = -1;
320 for(std::size_t i = 0; i < scan_size; i++)
323 (scan_offset * 4) + (i * 8))) +
326 (scan_offset * 4) + (i * 8) + 4));
330 auto ret = accumulate_into.insert(std::pair<quint32, quint32>(
x,
y));
332 if(ret.second ==
false)
335 ret.first->second +=
y;
345 std::map<quint32, quint32> &accumulate_into,
346 quint32 accepted_tof_index_range_begin,
347 quint32 accepted_tof_index_range_end)
const
358 qint32 previous = -1;
360 for(std::size_t i = 0; i < scan_size; i++)
363 (scan_offset * 4) + (i * 8))) +
366 if(
x < accepted_tof_index_range_begin)
371 if(
x > accepted_tof_index_range_end)
380 (scan_offset * 4) + (i * 8) + 4));
384 auto ret = accumulate_into.insert(std::pair<quint32, quint32>(
x,
y));
386 if(ret.second ==
false)
389 ret.first->second +=
y;
399 std::size_t mobility_scan_end)
const
409 std::map<quint32, quint32> raw_spectrum;
412 std::size_t mobility_scan_max = mobility_scan_end + 1;
414 for(std::size_t i = mobility_scan_begin; i < mobility_scan_max; i++)
432 for(std::pair<quint32, quint32> pair_tof_intensity : raw_spectrum)
439 new_trace.push_back(data_point_cumul);
446 catch(std::exception &error)
449 "Failure in TimsFrame::cumulateScanToTrace %1 to %2 :\n %3")
450 .arg(mobility_scan_begin, mobility_scan_end)
458 std::size_t mz_index_merge_window,
459 std::size_t mobility_scan_begin,
460 std::size_t mobility_scan_end,
461 quint32 &mz_minimum_index_out,
462 quint32 &mz_maximum_index_out)
const
472 qDebug() <<
"The frame is empty, returning empty trace.";
479 std::map<quint32, quint32> raw_spectrum;
482 std::size_t mobility_scan_max = mobility_scan_end + 1;
484 for(std::size_t i = mobility_scan_begin; i < mobility_scan_max; i++)
504 if(mz_index_merge_window > 0)
509 mz_minimum_index_out = std::numeric_limits<quint32>::max();
510 mz_maximum_index_out = 0;
512 for(std::pair<quint32, quint32> pair_tof_intensity : raw_spectrum)
514 if(pair_tof_intensity.first > mz_maximum_index_out)
515 mz_maximum_index_out = pair_tof_intensity.first;
516 if(pair_tof_intensity.first < mz_minimum_index_out)
517 mz_minimum_index_out = pair_tof_intensity.first;
528 new_trace.push_back(data_point_cumul);
541 catch(std::exception &error)
544 "Failure in TimsFrame::cumulateScanToTrace %1 to %2 :\n %3")
545 .arg(mobility_scan_begin, mobility_scan_end)
557 std::size_t mz_index_merge_window,
558 double mz_range_begin,
560 std::size_t mobility_scan_begin,
561 std::size_t mobility_scan_end,
562 quint32 &mz_minimum_index_out,
563 quint32 &mz_maximum_index_out)
const
573 qDebug() <<
"The frame is empty, returning empty trace.";
580 std::map<quint32, quint32> raw_spectrum;
583 std::size_t mobility_scan_max = mobility_scan_end + 1;
585 quint32 only_in_mz_begin_tof_index_range =
588 quint32 only_in_mz_end_tof_index_range =
596 for(std::size_t i = mobility_scan_begin; i < mobility_scan_max; i++)
602 only_in_mz_begin_tof_index_range,
603 only_in_mz_end_tof_index_range);
619 if(mz_index_merge_window > 0)
624 mz_minimum_index_out = std::numeric_limits<quint32>::max();
625 mz_maximum_index_out = 0;
627 for(std::pair<quint32, quint32> pair_tof_intensity : raw_spectrum)
629 if(pair_tof_intensity.first > mz_maximum_index_out)
630 mz_maximum_index_out = pair_tof_intensity.first;
631 if(pair_tof_intensity.first < mz_minimum_index_out)
632 mz_minimum_index_out = pair_tof_intensity.first;
643 new_trace.push_back(data_point_cumul);
656 catch(std::exception &error)
659 "Failure in TimsFrame::cumulateScanToTrace %1 to %2 :\n %3")
660 .arg(mobility_scan_begin, mobility_scan_end)
672 std::size_t mobility_scan_begin,
673 std::size_t mobility_scan_end)
const
683 std::size_t mobility_scan_max = mobility_scan_end + 1;
685 for(std::size_t i = mobility_scan_begin; i < mobility_scan_max; i++)
694 catch(std::exception &error)
696 qDebug() << QString(
"Failure in %1 %2 to %3 :\n %4")
698 .arg(mobility_scan_begin)
699 .arg(mobility_scan_end)
718 std::make_shared<pappso::MassSpectrum>();
722 return mass_spectrum_sptr;
734 qint32 previous = -1;
738 for(std::size_t i = 0; i < size; i++)
741 (*(quint32 *)((
m_timsDataFrame.constData() + (offset * 4) + (i * 8))) +
749 previous = tof_index;
754 mass_spectrum_sptr.get()->push_back(data_point);
759 return mass_spectrum_sptr;
765 std::size_t mz_index_merge_window,
766 double mz_range_begin,
768 quint32 &mz_minimum_index_out,
769 quint32 &mz_maximum_index_out)
const
772 qDebug() <<
"mz_index_merge_window=" << mz_index_merge_window;
774 quint32 mz_index_begin = 0;
775 quint32 mz_index_end = std::numeric_limits<quint32>::max();
785 qDebug() <<
"mz_index_begin=" << mz_index_begin
786 <<
" mz_index_end=" << mz_index_end;
787 qDebug() <<
"mz_index_merge_window=" << mz_index_merge_window
788 <<
" raw_spectrum.size()=" << raw_spectrum.size();
790 if(mz_index_merge_window > 0)
792 qDebug() <<
"mz_index_merge_window=" << mz_index_merge_window
793 <<
" raw_spectrum.size()=" << raw_spectrum.size();
798 if(raw_spectrum.size() > 0)
800 mz_minimum_index_out = raw_spectrum.front().mz_tof_index;
801 mz_maximum_index_out = raw_spectrum.back().mz_tof_index;
804 for(
auto &&element : raw_spectrum)
808 (double)element.intensity_index});
820 std::vector<XicCoordTims *>::iterator &itXicListbegin,
821 std::vector<XicCoordTims *>::iterator &itXicListend,
824 qDebug() << std::distance(itXicListbegin, itXicListend);
826 std::vector<TimsFrame::XicComputeStructure> tmp_xic_list;
828 for(
auto it = itXicListbegin; it != itXicListend; it++)
832 qDebug() <<
" tmp_xic_struct.mobilityIndexBegin="
833 << tmp_xic_list.back().mobilityIndexBegin
834 <<
" tmp_xic_struct.mobilityIndexEnd="
835 << tmp_xic_list.back().mobilityIndexEnd;
837 qDebug() <<
" tmp_xic_struct.mzIndexLowerBound="
838 << tmp_xic_list.back().mzIndexLowerBound
839 <<
" tmp_xic_struct.mzIndexUpperBound="
840 << tmp_xic_list.back().mzIndexUpperBound;
842 if(tmp_xic_list.size() == 0)
850 std::vector<std::size_t> unique_scan_num_list;
851 for(
auto &&struct_xic : tmp_xic_list)
853 for(std::size_t scan = struct_xic.mobilityIndexBegin;
854 (scan <= struct_xic.mobilityIndexEnd) && (scan <
m_scanNumber);
857 unique_scan_num_list.push_back(scan);
860 std::sort(unique_scan_num_list.begin(), unique_scan_num_list.end());
861 auto it_scan_num_end =
862 std::unique(unique_scan_num_list.begin(), unique_scan_num_list.end());
863 auto it_scan_num = unique_scan_num_list.begin();
865 while(it_scan_num != it_scan_num_end)
869 for(
auto &&tmp_xic_struct : tmp_xic_list)
871 if(((*it_scan_num) >= tmp_xic_struct.mobilityIndexBegin) &&
872 ((*it_scan_num) <= tmp_xic_struct.mobilityIndexEnd))
876 tmp_xic_struct.tmpIntensity +=
877 ms_spectrum.get()->maxY(tmp_xic_struct.mzIndexLowerBound,
878 tmp_xic_struct.mzIndexUpperBound);
880 qDebug() <<
"tmp_xic_struct.tmpIntensity="
881 << tmp_xic_struct.tmpIntensity;
886 tmp_xic_struct.tmpIntensity +=
887 ms_spectrum.get()->sumY(tmp_xic_struct.mzIndexLowerBound,
888 tmp_xic_struct.mzIndexUpperBound);
889 qDebug() <<
"tmp_xic_struct.tmpIntensity="
890 << tmp_xic_struct.tmpIntensity;
897 for(
auto &&tmp_xic_struct : tmp_xic_list)
899 if(tmp_xic_struct.tmpIntensity != 0)
901 qDebug() << tmp_xic_struct.xic_ptr;
902 tmp_xic_struct.xic_ptr->push_back(
903 {
m_time, tmp_xic_struct.tmpIntensity});
928 qint32 previous = -1;
929 std::vector<quint32> index_list;
930 for(std::size_t i = 0; i < size; i++)
933 (*(quint32 *)((
m_timsDataFrame.constData() + (offset * 4) + (i * 8))) +
941 previous = data_point.
x;
942 trace_sptr.get()->push_back(data_point);
949std::vector<TimsFrame::RawValuePair>
951 quint32 accepted_tof_index_range_begin,
952 quint32 accepted_tof_index_range_end)
const
956 std::vector<TimsFrame::RawValuePair> trace_sptr;
968 qint32 previous = -1;
969 std::vector<quint32> index_list;
970 for(std::size_t i = 0; i < size; i++)
975 {(*(quint32 *)((
m_timsDataFrame.constData() + (offset * 4) + (i * 8))) +
979 if(data_point.mz_tof_index < accepted_tof_index_range_begin)
984 if(data_point.mz_tof_index > accepted_tof_index_range_end)
992 trace_sptr.push_back(data_point);
994 qDebug() << trace_sptr.size();
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
virtual std::map< quint32, quint32 > & downsizeMzRawMap(std::size_t mzindex_merge_window, std::map< quint32, quint32 > &rawSpectrum) 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
virtual void cumulateScan2(std::size_t scanNum, std::map< quint32, quint32 > &accumulate_into, quint32 accepted_tof_index_range_begin, quint32 accepted_tof_index_range_end) const
virtual void cumulateScan(std::size_t scanNum, std::map< quint32, quint32 > &accumulate_into) const
cumulate a scan into a map
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
std::size_t getScanOffset(std::size_t scanNum) const
get offset for this spectrum in the binary file
virtual void cumulateScansInRawMap(std::map< quint32, quint32 > &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
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