00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef CSCDQM_Cache_H
00021 #define CSCDQM_Cache_H
00022
00023 #include <map>
00024 #include <boost/multi_index_container.hpp>
00025 #include <boost/multi_index/member.hpp>
00026 #include <boost/multi_index/composite_key.hpp>
00027 #include <boost/multi_index/ordered_index.hpp>
00028 #include "boost/tuple/tuple.hpp"
00029
00030 #include <boost/shared_ptr.hpp>
00031
00032 #include "CSCDQM_Logger.h"
00033 #include "CSCDQM_HistoDef.h"
00034 #include "CSCDQM_MonitorObject.h"
00035 #include "CSCDQM_Utility.h"
00036
00037 namespace cscdqm {
00038
00040 struct CSCHistoKeyType {
00041 HistoId id;
00042 HwId addId;
00043 const MonitorObject* mo;
00044 CSCHistoKeyType(const HistoId& id_, const HwId& addId_, const MonitorObject* mo_) : id(id_), addId(addId_), mo(mo_) { }
00045 };
00046
00048 typedef boost::multi_index_container<
00049 CSCHistoKeyType,
00050 boost::multi_index::indexed_by<
00051 boost::multi_index::ordered_unique<
00052 boost::multi_index::composite_key<
00053 CSCHistoKeyType,
00054 boost::multi_index::member<CSCHistoKeyType, HistoId, &CSCHistoKeyType::id>,
00055 boost::multi_index::member<CSCHistoKeyType, HwId, &CSCHistoKeyType::addId>
00056 >
00057 >
00058 >
00059 > CSCHistoMapType;
00060
00062 struct CSCKeyType {
00063 HwId crateId;
00064 HwId dmbId;
00065 CSCHistoMapType mos;
00066 CSCKeyType(const HwId& crateId_, const HwId& dmbId_) : crateId(crateId_), dmbId(dmbId_) { }
00067 };
00068
00070 typedef boost::multi_index_container<
00071 CSCKeyType,
00072 boost::multi_index::indexed_by<
00073 boost::multi_index::ordered_unique<
00074 boost::multi_index::composite_key<
00075 CSCKeyType,
00076 boost::multi_index::member<CSCKeyType, HwId, &CSCKeyType::crateId>,
00077 boost::multi_index::member<CSCKeyType, HwId, &CSCKeyType::dmbId>
00078 >
00079 >
00080 >
00081 > CSCMapType;
00082
00084 typedef std::map<HwId, MonitorObject**> FEDMapType;
00085
00087 typedef std::map<HwId, MonitorObject**> DDUMapType;
00088
00090 struct LookupKeyType {
00091 HistoDef histo;
00092 std::string path;
00093 MonitorObject* mo;
00094 LookupKeyType(const HistoDef& histo_, MonitorObject*& mo_) : histo(histo_), mo(mo_) {
00095 path = histo.getPath();
00096 }
00097 };
00098
00100 typedef boost::multi_index_container<
00101 LookupKeyType,
00102 boost::multi_index::indexed_by<
00103 boost::multi_index::ordered_unique<boost::multi_index::member<LookupKeyType, HistoDef, &LookupKeyType::histo> >,
00104 boost::multi_index::ordered_non_unique<boost::multi_index::member<LookupKeyType, std::string, &LookupKeyType::path> >
00105 >
00106 > LookupMapType;
00107
00112 class Cache {
00113
00114 private:
00115
00117 MonitorObject* data[h::namesSize];
00118
00120 FEDMapType fedData;
00122 FEDMapType::const_iterator fedPointer;
00124 HwId fedPointerValue;
00125
00126
00128 DDUMapType dduData;
00130 DDUMapType::const_iterator dduPointer;
00132 HwId dduPointerValue;
00133
00135 CSCMapType cscData;
00137 CSCMapType::const_iterator cscPointer;
00138
00140 LookupMapType lookupData;
00141
00142 public:
00143
00145 Cache() {
00146
00148 for (unsigned int i = 0; i < h::namesSize; i++) data[i] = 0;
00149
00151 fedPointer = fedData.end();
00152 fedPointerValue = 0;
00153
00155 dduPointer = dduData.end();
00156 dduPointerValue = 0;
00157 cscPointer = cscData.end();
00158 }
00159
00161 ~Cache() {
00163 while (fedData.begin() != fedData.end()) {
00164 if (fedData.begin()->second) {
00165 delete [] fedData.begin()->second;
00166 }
00167 fedData.erase(fedData.begin());
00168 }
00169
00171 while (dduData.begin() != dduData.end()) {
00172 if (dduData.begin()->second) {
00173 delete [] dduData.begin()->second;
00174 }
00175 dduData.erase(dduData.begin());
00176 }
00177 }
00178
00181 const bool get(const HistoDef& histo, MonitorObject*& mo);
00182 const bool getEMU(const HistoId& id, MonitorObject*& mo);
00183 const bool getFED(const HistoId& id, const HwId& fedId, MonitorObject*& mo);
00184 const bool getDDU(const HistoId& id, const HwId& dduId, MonitorObject*& mo);
00185 const bool getCSC(const HistoId& id, const HwId& crateId, const HwId& dmbId, const HwId& addId, MonitorObject*& mo);
00186 const bool getPar(const HistoId& id, MonitorObject*& mo);
00187 void put(const HistoDef& histo, MonitorObject* mo);
00188
00191 const bool nextBookedFED(unsigned int& n, unsigned int& fedId) const;
00192 const bool nextBookedDDU(unsigned int& n, unsigned int& dduId) const;
00193 const bool nextBookedCSC(unsigned int& n, unsigned int& crateId, unsigned int& dmbId) const;
00194 const bool isBookedCSC(const HwId& crateId, const HwId& dmbId) const;
00195 const bool isBookedDDU(const HwId& dduId) const;
00196 const bool isBookedFED(const HwId& fedId) const;
00197
00198 };
00199
00200 }
00201
00202 #endif