8#include <boost/dynamic_bitset.hpp>
14#include <FairLogger.h>
17#include "BmnFunctionSet.h"
19using SysClock = std::chrono::system_clock;
20using SysPoint = std::chrono::time_point<SysClock>;
36template<
typename IntType = u
int8_t>
44 template<
typename TimeLocationPair>
47 bool operator()(
const TimeLocationPair& entry,
const SysPoint& key)
const {
return entry.first < key; }
48 bool operator()(
const SysPoint& key,
const TimeLocationPair& entry)
const {
return key < entry.first; }
50 template<
typename TimeLocationPair>
53 bool operator()(
const TimeLocationPair& entry,
const SysPoint& key)
const {
return entry.second < key; }
54 bool operator()(
const SysPoint& key,
const TimeLocationPair& entry)
const {
return key < entry.second; }
109 throw std::out_of_range(
"Scaler not found");
153 throw std::out_of_range(
"Scaler name not found");
160 throw std::out_of_range(
"Scaler index not found");
164 const SysPoint& timeBegin = SysPoint::min(),
165 const SysPoint& timeEnd = SysPoint::max())
170 return make_pair(itStart, itFinish);
196 const SysPoint& timeBegin = SysPoint::min(),
197 const SysPoint& timeEnd = SysPoint::max())
204 auto it = std::lower_bound(
fTimes.begin(),
fTimes.end(), timePoint);
206 throw std::out_of_range(
"Time point not found");
207 return std::distance(it,
fTimes.begin());
251 auto it = std::lower_bound(
252 rangeList.begin(), rangeList.end(), time,
253 [](
const TimeRange& rangePair,
const SysPoint& timePoint) { return rangePair.second < timePoint; });
254 if (it == rangeList.end())
261 return ((time >= it->first) && (time < it->second));
272 const SysPoint& timeBegin = SysPoint::min(),
273 const SysPoint& timeEnd = SysPoint::max())
275 auto itBeginByFirsts =
277 auto itBeginBySeconds =
279 auto& itBegin = std::distance(itBeginByFirsts, itBeginBySeconds) > 0 ? itBeginByFirsts : itBeginBySeconds;
283 auto itEndBySeconds =
285 auto& itEnd = std::distance(itEndByFirsts, itEndBySeconds) > 0 ? itEndBySeconds : itEndByFirsts;
286 return make_pair(itBegin, itEnd);
291 if (it->first != time) {
301 const SysPoint& timeBegin = SysPoint::min(),
302 const SysPoint& timeEnd = SysPoint::max())
304 if (timeEnd < timeBegin)
306 auto it = row.begin()->first > timeBegin
315 while ((it != itFinish))
316 sum += (it++)->second;
325 row.push_back(make_pair(time, val));
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
#define ClassDef(name, id)
std::chrono::system_clock SysClock
std::chrono::time_point< SysClock > SysPoint
std::unordered_map< std::string, uint16_t > NameChMap
static std::string TimePoint2String(SysPoint p)
static SysPoint TimeStamp2TP(TTimeStamp p)
static TTimeStamp TimePoint2TS(SysPoint p)
map< string, TimeLine > Scaler2TimeDist
virtual ~BmnMSCMatrix()
Destructor.
std::map< uint8_t, TimeLine > ScalerIdx2TimeDist
static uint64_t GetCntInRange(const TimeLine &row, const SysPoint &timeBegin=SysPoint::min(), const SysPoint &timeEnd=SysPoint::max())
TimeRangeList fSpillRangeVec
uint32_t GetMissingHits()
static bool IsInRange(const TimeRangeList &rangeList, const SysPoint &time)
const IntType GetCount(size_t record_id, uint16_t scaler_id)
TimeLine & ScalerTimeLine(const uint16_t &scaler_id)
auto GetBusyRanges(const SysPoint &timeBegin=SysPoint::min(), const SysPoint &timeEnd=SysPoint::max())
Returns the [begin,end) iterators for range of time point pairs representing begin and end of a busy ...
BmnMSCMatrix(size_t times_count=0, NameChMap scalerName2Index=NameChMap{})
static auto GetRanges(const TimeRangeList &rangeList, const SysPoint &timeBegin=SysPoint::min(), const SysPoint &timeEnd=SysPoint::max())
Returns the [begin,end) iterators for range of time point pairs representing begin and end of a speci...
std::pair< SysPoint, size_t > TimeMapEntry
size_t GetRecordIdByTime(const SysPoint &timePoint)
const size_t GetNRecords()
const IntType GetCount(const SysPoint &time, const string &scaler_name)
auto GetSpillRanges(const SysPoint &timeBegin=SysPoint::min(), const SysPoint &timeEnd=SysPoint::max())
Returns the [begin,end) iterators for range of time point pairs representing begin and end of a spill...
void SetTime(const size_t &record_id, const SysPoint &time)
we assume the user is filling the timestamps in the chronological order on the basis of preliminary c...
NameChMap & GetScalerName2indexMap()
vector< TimeLineEntry > TimeLine
TTimeStamp GetTS(const size_t &record_id)
void SetMissingHits(uint32_t val)
bool GetIsSpill(const SysPoint &time)
NameChMap fScalerName2index
TimeRangeList fBusyRangeVec
void SetCount(const size_t &record_id, TimeLine &row, const IntType &val)
auto GetScalerRange(const string &scaler_name, const SysPoint &timeBegin=SysPoint::min(), const SysPoint &timeEnd=SysPoint::max())
void SetCount(size_t record_id, uint16_t scaler_id, IntType val)
TimeLine & ScalerTimeLine(const string &scaler_name)
const uint16_t GetNScalers()
vector< SysPoint > fTimes
bool GetIsBusy(const SysPoint &time)
static IntType GetCntByTime(const TimeLine &row, const SysPoint &time)
vector< TimeRange > TimeRangeList
uint64_t GetCntInRange(const string &scaler_name, const SysPoint &timeBegin=SysPoint::min(), const SysPoint &timeEnd=SysPoint::max())
std::pair< SysPoint, IntType > TimeLineEntry
vector< TimeLine > fMapVector
void SetTS(const size_t &record_id, const TTimeStamp &ts)
std::pair< SysPoint, SysPoint > TimeRange
SysPoint & GetTime(const size_t &record_id)
const IntType GetCount(size_t record_id, const string &scaler_name)
map< SysPoint, size_t > Time2Pos
void SetCount(size_t record_id, const string &scaler_name, IntType val)
const IntType GetCount(const SysPoint &time, const uint16_t scaler_id)
std::chrono::time_point< SysClock > SysPoint
bool operator()(const SysPoint &key, const TimeLocationPair &entry) const
bool operator()(const TimeLocationPair &entry, const SysPoint &key) const
bool operator()(const SysPoint &key, const TimeLocationPair &entry) const
bool operator()(const TimeLocationPair &entry, const SysPoint &key) const