CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_1/src/DQM/CSCMonitorModule/plugins/CSCDQM_Cache.h

Go to the documentation of this file.
00001 /*
00002  * =====================================================================================
00003  *
00004  *       Filename:  CSCDQM_Cache.h
00005  *
00006  *    Description:  Efficiently manages lists of MonitorObject's for internal
00007  *    MO cache.
00008  *
00009  *        Version:  1.0
00010  *        Created:  11/27/2008 10:05:00 AM
00011  *       Revision:  none
00012  *       Compiler:  gcc
00013  *
00014  *         Author:  Valdas Rapsevicius (VR), valdas.rapsevicius@cern.ch
00015  *        Company:  CERN, CH
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