![]() |
![]() |
00001 #ifndef L1TRateHelper_H 00002 #define L1TRateHelper_H 00003 00007 #include <map> 00008 00009 namespace L1TRateHelper { 00010 00011 struct TRateStruct { 00012 TRateStruct() : m_orbitLow(-1), m_orbitHigh(-1), m_events(0) {}; 00013 void add(int orbit) { 00014 if (orbit < m_orbitLow || m_orbitLow==-1) m_orbitLow=orbit; 00015 if (orbit > m_orbitHigh || m_orbitHigh==-1) m_orbitHigh=orbit; 00016 ++m_events; 00017 }; 00018 int getTime() { return (m_orbitHigh+m_orbitLow)/2/m_timeBin; } 00019 static int getTimeForOrbit(const int &orbit) {return orbit/m_timeBin; }; 00020 static const int m_timeBin = 11224; 00021 int m_orbitLow; 00022 int m_orbitHigh; 00023 int m_events; 00024 // (1 s) / (25 ns)) / 3564 = 11 223,3446 00025 bool operator()(const int &o1, const int &o2) const { 00026 return getTimeForOrbit(o1) < getTimeForOrbit(o2); 00027 }; 00028 00029 }; 00030 00031 class L1TRateHelper { 00032 00033 public: 00034 L1TRateHelper() : m_lastRemovedOrbit(-1), m_timeStart(-1) {}; 00035 00036 00041 std::pair<int, int> removeAndGetRateForEarliestTime(); 00042 00044 void addOrbit(int orbit) { if (orbit > m_lastRemovedOrbit) m_rateMap[orbit].add(orbit);}; 00045 00047 int getEarliestTime() { 00048 if (m_rateMap.begin() == m_rateMap.end() ) return -1; 00049 return m_rateMap.begin()->second.getTime(); 00050 }; 00051 00053 int getLastTime() { 00054 if (m_rateMap.begin() == m_rateMap.end() ) return -1; 00055 return m_rateMap.rbegin()->second.getTime(); 00056 }; 00057 00059 int getTimeForOrbit(int orbit) {return TRateStruct::getTimeForOrbit(orbit); }; 00060 00061 private: 00062 typedef std::map <int, TRateStruct, TRateStruct > TRateMap; 00063 TRateMap m_rateMap; 00064 int m_lastRemovedOrbit; 00065 int m_timeStart; 00066 00067 00068 00069 }; 00070 } 00071 00072 00073 00074 #endif