19 #ifndef CSCDQM_Configuration_H
20 #define CSCDQM_Configuration_H
25 #include <xercesc/parsers/XercesDOMParser.hpp>
26 #include <xercesc/dom/DOMNodeList.hpp>
27 #include <xercesc/dom/DOMElement.hpp>
28 #include <xercesc/dom/DOMComment.hpp>
29 #include <xercesc/sax/ErrorHandler.hpp>
30 #include <xercesc/sax/SAXParseException.hpp>
31 #include <xercesc/dom/DOMImplementation.hpp>
32 #include <xercesc/dom/DOMWriter.hpp>
33 #include <xercesc/framework/StdOutFormatTarget.hpp>
34 #include <xercesc/dom/DOM.hpp>
36 #include <boost/multi_index_container.hpp>
37 #include <boost/multi_index/member.hpp>
38 #include <boost/multi_index/composite_key.hpp>
39 #include <boost/multi_index/ordered_index.hpp>
40 #include "boost/tuple/tuple.hpp"
42 #include <boost/preprocessor/tuple/elem.hpp>
43 #include <boost/preprocessor/seq/for_each_i.hpp>
44 #include <boost/preprocessor/stringize.hpp>
45 #include <boost/preprocessor/cat.hpp>
46 #include <boost/preprocessor/comparison/equal.hpp>
48 #include <boost/shared_ptr.hpp>
49 #include <boost/function.hpp>
50 #include <boost/bind.hpp>
52 #include <boost/timer.hpp>
67 #define CONFIG_PARAMETERS_SEQ_LEN 4
73 #define CONFIG_PARAMETERS_SEQ \
76 (( bool, PROCESS_DDU, true, "enter DDU (and latter Chamber) sections (EventProcessor flag)" )) \
77 (( bool, PROCESS_CSC, true, "enter Chamber section (EventProcessor flag)" )) \
78 (( bool, PROCESS_EFF_HISTOS, true, "calculate efficiency histograms (Dispatcher flag)" )) \
79 (( bool, PROCESS_EFF_PARAMETERS, true, "calculate efficiency parameters (EventProcessor flag)" )) \
80 (( bool, BINCHECKER_CRC_ALCT, false , "check ALCT CRC (CSCDCCExaminer flag)" )) \
81 (( bool, BINCHECKER_CRC_CLCT, false , "check CLCT CRC (CSCDCCExaminer flag)" )) \
82 (( bool, BINCHECKER_CRC_CFEB, false , "check CFEB CRC (CSCDCCExaminer flag)" )) \
83 (( bool, BINCHECKER_MODE_DDU, true , "set DDU mode (CSCDCCExaminer flag)" )) \
84 (( bool, BINCHECKER_OUTPUT, false , "print 1 and 2 output (CSCDCCExaminer flag)" )) \
85 (( bool, FRAEFF_AUTO_UPDATE, false , "start fractional and efficiency histogram update automatically (Dispatcher flag)" )) \
86 (( bool, FRAEFF_SEPARATE_THREAD, false , "start fractional and efficiency histogram update on separate thread (EventProcessor flag)" )) \
87 (( bool, PRINT_STATS_ON_EXIT, true , "print statistics on exit (destruction)" )) \
88 (( bool, IN_FULL_STANDBY, true , "full detector is in standby mode from the beginning of the run" )) \
89 (( std::string, BOOKING_XML_FILE, "" , "histogram description (booking) file in XML format (Collection)" )) \
90 (( std::string, FOLDER_EMU, "" , "root file folder name to be used for EMU histograms (EventProcessor)" )) \
91 (( std::string, FOLDER_DDU, "" , "root file folder name to be used for DDU histograms (EventProcessor)" )) \
92 (( std::string, FOLDER_CSC, "" , "root file folder name to be used for CSC histograms (EventProcessor)" )) \
93 (( std::string, FOLDER_PAR, "" , "root file folder name to be used for parameters (EventProcessor)" )) \
94 (( unsigned int, DDU_CHECK_MASK, 0xFFFFFFFF , "mask for cumulative EmuFileReader DDU error flags (EventProcessor)" )) \
95 (( unsigned int, DDU_BINCHECK_MASK, 0x02080016 , "mask for DDU level examiner errors (CSCDCCExaminer)" )) \
96 (( unsigned int, BINCHECK_MASK, 0xFFFFFFFF , "mask for chamber level examiner errors (CSCDCCExaminer)" )) \
97 (( unsigned int, FRAEFF_AUTO_UPDATE_START, 5 , "event number to start automatic fractional and efficiency histogram updates from (Dispatcer)" )) \
98 (( unsigned int, FRAEFF_AUTO_UPDATE_FREQ, 1 , "frequency in events to perform automatic fractional and efficiency histogram updates (Dispatcher)" )) \
99 (( double, EFF_COLD_THRESHOLD, 0.1 , "threshold in fraction to check for cold (not reporting) HW (EventProcessor)" )) \
100 (( double, EFF_COLD_SIGFAIL, 5.0 , "statistical significance for cold (not reporting) HW (EventProcessor)" )) \
101 (( double, EFF_HOT_THRESHOLD, 0.1 , "threshold in fraction to check for hot HW (EventProcessor)" )) \
102 (( double, EFF_HOT_SIGFAIL, 5.0 , "statistical significance for hot HW (EventProcessor)" )) \
103 (( double, EFF_ERR_THRESHOLD, 0.1 , "threshold in fraction to check for errors in HW (EventProcessor)" )) \
104 (( double, EFF_ERR_SIGFAIL, 5.0 , "statistical significance for errors in HW (EventProcessor)" )) \
105 (( double, EFF_NODATA_THRESHOLD, 0.1 , "threshold in fraction to check for not reporting elements in HW (EventProcessor)" )) \
106 (( double, EFF_NODATA_SIGFAIL, 5.0 , "statistical significance for not reportingelements in HW (EventProcessor)" )) \
107 (( unsigned int, EVENTS_ECHO, 1000, "frequency in events to print echo message (EventProcessor)" )) \
116 #define CONFIG_PARAMETER_DEFINE_MACRO(r, data, i, elem) \
117 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 0, elem) BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem);
120 #define CONFIG_PARAMETER_DEFAULT_MACRO(r, data, i, elem) \
121 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem) = BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 2, elem);
124 #define CONFIG_PARAMETER_GETTER_MACRO(r, data, i, elem) \
125 const BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 0, elem) BOOST_PP_CAT(get, BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))() const { \
126 return BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem); \
130 #define CONFIG_PARAMETER_SETTER_MACRO(r, data, i, elem) \
131 void BOOST_PP_CAT(set, BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 0, elem) p) { \
132 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem) = p; \
138 #define CONFIG_PARAMETER_LOADPS_MACRO(r, data, i, elem) \
139 BOOST_PP_CAT(set, BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))(ps.getUntrackedParameter<BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 0, elem)>(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem)), BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 2, elem)));
146 #define CONFIG_PARAMETER_LOADXML_MACRO(r, data, i, elem) \
147 if (nodeName.compare(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))) == 0) { \
148 stm >> BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem); \
153 #define CONFIG_PARAMETER_PRINTXML_MACRO(r, data, i, elem) \
155 DOMComment* comment = doc->createComment(XERCES_TRANSCODE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 3, elem))); \
156 DOMElement* el = doc->createElement(XERCES_TRANSCODE(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem)))); \
157 std::string value = toString(config.BOOST_PP_CAT(get, BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))()); \
158 DOMText* tdata = doc->createTextNode(XERCES_TRANSCODE(value.c_str())); \
159 el->appendChild(tdata); \
160 rootElem->appendChild(comment); \
161 rootElem->appendChild(el); \
202 typedef boost::multi_index_container<
203 ChamberCounterKeyType,
204 boost::multi_index::indexed_by<
205 boost::multi_index::ordered_unique<
206 boost::multi_index::composite_key<
207 ChamberCounterKeyType,
208 boost::multi_index::member<ChamberCounterKeyType, HwId, &ChamberCounterKeyType::crateId>,
209 boost::multi_index::member<ChamberCounterKeyType, HwId, &ChamberCounterKeyType::dmbId>
248 boost::function< bool (const HistoDef& histoT, MonitorObject*&) >
fnGetHisto;
253 boost::function< bool (const HistoId id, const HwId& id1, const HwId& id2, const HwId& id3, MonitorObject*& mo) >
fnGetCacheCSCHisto;
255 boost::function< void (const HistoDef& histoT, MonitorObject*&) >
fnPutHisto;
256 boost::function< bool (unsigned int&, unsigned int&, unsigned int&) >
fnNextBookedCSC;
261 boost::function< MonitorObject* (const HistoBookRequest&) >
fnBook;
264 boost::function< bool (const unsigned int, const unsigned int, CSCDetId&) >
fnGetCSCDetId;
310 XMLPlatformUtils::Initialize();
316 parser.setErrorHandler(&eh);
318 parser.parse(configFile.c_str());
319 DOMDocument *
doc = parser.getDocument();
320 DOMNode *docNode = (DOMNode*) doc->getDocumentElement();
322 DOMNodeList *itemList = docNode->getChildNodes();
323 for(uint32_t
i = 0;
i < itemList->getLength();
i++) {
324 DOMNode*
node = itemList->item(
i);
325 if (node->getNodeType() != DOMNode::ELEMENT_NODE) {
continue; }
327 std::string nodeName = XMLString::transcode(node->getNodeName());
328 std::string
value = XMLString::transcode(node->getTextContent());
329 std::istringstream stm(value);
333 if (nodeName.
compare("MO_FILTER") == 0) {
334 DOMNodeList *filterList = node->getChildNodes();
335 for(uint32_t
j = 0;
j < filterList->getLength();
j++) {
336 DOMNode*
filter = filterList->item(
j);
337 if (filter->getNodeType() != DOMNode::ELEMENT_NODE) {
continue; }
338 std::string
filterName = XMLString::transcode(filter->getNodeName());
339 std::string filterValue = XMLString::transcode(filter->getTextContent());
347 XMLPlatformUtils::Terminate();
357 XMLPlatformUtils::Initialize();
359 DOMImplementation* domImpl = DOMImplementationRegistry::getDOMImplementation(
XERCES_TRANSCODE(
"core"));
360 DOMDocument *doc = domImpl->createDocument(0,
XERCES_TRANSCODE(
"processor_configuration"), 0);
361 DOMElement* rootElem = doc->getDocumentElement();
365 DOMWriter *ser = domImpl->createDOMWriter();
366 if (ser->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint,
true)) {
367 ser->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint,
true);
369 XMLFileErrorHandler eh;
370 ser->setErrorHandler((DOMErrorHandler*) &eh);
371 ser->writeNode(
new StdOutFormatTarget(), *doc);
374 XMLPlatformUtils::Terminate();
388 std::vector<std::
string> moFilter = ps.getUntrackedParameter<std::vector<std::
string> >("MO_FILTER");
389 for (std::vector<std::
string>::iterator it = moFilter.
begin(); it != moFilter.
end(); it++) {
392 LOG_WARN <<
"MO_FILTER item " << f <<
" does not recognized to be a valid one. Skipping...";
433 #define STATFIELD(caption, value, units) \
434 logger << std::setfill(' '); \
435 logger << std::setiosflags(std::ios::right) << std::setw(25) << caption << " : "; \
436 logger << std::setiosflags(std::ios::right) << std::setw(12); \
437 if (((double) value) < 0) { \
442 logger << std::setiosflags(std::ios::left) << std::setw(2) << units; \
447 logger << std::setfill('-'); \
448 logger << std::setw(25) << ""; \
449 logger << std::setw(10) << ""; \
450 logger << std::setw(2) << ""; \
473 STATFIELD(
"Avg. event time", eventTimeAverage,
"s")
475 STATFIELD(
"Avg. event rate", eventRateAverage,
"Hz")
477 STATFIELD(
"Avg. chamber rate", chamberRateAverage,
"Hz")
484 STATFIELD(
"Avg. fra update time", fraTimeAverage,
"s")
491 STATFIELD(
"Avg. eff update time", effTimeAverage,
"s")
497 STATFIELD(
"Avg. event all time", allTimeAverage,
"s")
498 double allRateAverage = (allTime > 0 ?
nEvents / allTime : -1.0);
499 STATFIELD(
"Avg. event all rate", allRateAverage,
"Hz")
500 double chamberAllRateAverage = (allTime > 0 ?
nUnpackedCSC / allTime : -1.0);
501 STATFIELD(
"Avg. chamber all rate", chamberAllRateAverage,
"Hz")
602 if (getEVENTS_ECHO() > 0) {
633 ChamberMapCounterMapType::iterator it =
chamberCounters.find(boost::make_tuple(crateId, dmbId));
638 ChamberCounterMapType::iterator itc = cs->find(counter);
639 if (itc == cs->end()) {
640 cs->insert(std::make_pair(counter, value));
666 ChamberMapCounterMapType::iterator it =
chamberCounters.find(boost::make_tuple(crateId, dmbId));
668 ChamberCounterMapType::const_iterator itc = it->counters.find(counter);
669 if (itc == it->counters.end())
return 0;
707 #undef CONFIG_PARAMETERS_SEQ_LEN
708 #undef CONFIG_PARAMETERS_SEQ
709 #undef CONFIG_PARAMETER_DEFINE_MACRO
710 #undef CONFIG_PARAMETER_DEFAULT_MACRO
711 #undef CONFIG_PARAMETER_GETTER_MACRO
712 #undef CONFIG_PARAMETER_SETTER_MACRO
713 #undef CONFIG_PARAMETER_LOADPS_MACRO
714 #undef CONFIG_PARAMETER_LOADXML_MACRO
715 #undef CONFIG_PARAMETER_PRINTXML_MACRO
void updateFraTimer(const bool start)
Switch on/off fractional MO processing timer.
Configuration(const bool printStats)
Constructor.
unsigned long nEventsGood
Chamber Counters key type.
MOFilterItem(const std::string pattern_, const bool include_)
boost::function< bool(unsigned int &, unsigned int &) > fnIsBookedCSC
void incChamberCounter(const ChamberCounterType counter, const HwId crateId, const HwId dmbId)
Increment Chamber counter by 1.
unsigned short printStatsLocal
const unsigned long getNEvents() const
#define CONFIG_PARAMETER_GETTER_MACRO(r, data, i, elem)
boost::function< bool(const HistoId id, MonitorObject *&mo) > fnGetCacheParHisto
Information level logger. Use LOG_INFO macros instead, i.e. LOG_INFO << "x = " << x;...
const unsigned long getNEventsGood() const
#define CONFIG_PARAMETERS_SEQ
void eventProcessTimer(const bool start)
Switch on/off event processing timer.
Configuration()
Constructor.
void updateEffTimer(const bool start)
Switch on/off efficiency MO processing timer.
const unsigned long getNUnpackedCSC() const
boost::function< bool(const HistoId id, const HwId &id1, const HwId &id2, const HwId &id3, MonitorObject *&mo) > fnGetCacheCSCHisto
std::map< ChamberCounterType, uint32_t > ChamberCounterMapType
static bool regexMatch(const std::string &expression, const std::string &message)
Match RegExp expression string against string message and return result.
#define CONFIG_PARAMETER_DEFINE_MACRO(r, data, i, elem)
ChamberCounterKeyType(const HwId &crateId_, const HwId &dmbId_, const ChamberCounterMapType &c_)
void printStats()
Print Statistics on Exit (Destruction)
const unsigned long getNEventsCSC() const
const unsigned long getNEventsBad() const
unsigned long nUnpackedCSC
ChamberCounterType
Chamber level counter types.
CSCDQM Framework Global Configuration.
#define STATFIELD(caption, value, units)
#define CONFIG_PARAMETER_DEFAULT_MACRO(r, data, i, elem)
ChamberMapCounterMapType chamberCounters
boost::function< bool(unsigned int &, unsigned int &, unsigned int &) > fnNextBookedCSC
boost::function< bool(const HistoDef &histoT, MonitorObject *&) > fnGetHisto
boost::function< bool(const unsigned int, const unsigned int, CSCDetId &) > fnGetCSCDetId
const bool needBookMO(const std::string name) const
Check if MO is not excluded by MO Filter.
void setChamberCounterValue(const ChamberCounterType counter, const HwId crateId, const HwId dmbId, const uint32_t value)
Set Chamber counter value.
boost::function< MonitorObject *(const HistoBookRequest &) > fnBook
#define XERCES_TRANSCODE(str)
tuple filter
USE THIS FOR SKIMMED TRACKS process.p = cms.Path(process.hltLevel1GTSeed*process.skimming*process.offlineBeamSpot*process.TrackRefitter2) OTHERWISE USE THIS.
ChamberCounterMapType counters
boost::function< bool(unsigned int &) > fnIsBookedDDU
void init()
Initialize parameter values and reset counters (used by constructors)
const uint32_t getChamberCounterValue(const ChamberCounterType counter, const HwId crateId, const HwId dmbId) const
Get Chamber counter value.
void copyChamberCounterValue(const ChamberCounterType counter_from, const ChamberCounterType counter_to, const HwId crateId, const HwId dmbId)
Copy Chamber counter value from one counter to another.
~Configuration()
Destructor.
std::vector< MOFilterItem > MOFilterItems
boost::function< void(const HistoDef &histoT, MonitorObject *&) > fnPutHisto
static void regexReplace(const std::string &expression, std::string &message, const std::string replace="")
Replace string part that matches RegExp expression with some string.
#define CONFIG_PARAMETER_SETTER_MACRO(r, data, i, elem)
bool include(const CollT &coll, const ItemT &item)
perl if(1 lt scalar(@::datatypes))
Takes care of errors and warnings while parsing XML files file in XML format.
boost::function< bool(const HistoId id, const HwId &id1, MonitorObject *&mo) > fnGetCacheDDUHisto
boost::multi_index_container< ChamberCounterKeyType, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::composite_key< ChamberCounterKeyType, boost::multi_index::member< ChamberCounterKeyType, HwId,&ChamberCounterKeyType::crateId >, boost::multi_index::member< ChamberCounterKeyType, HwId,&ChamberCounterKeyType::dmbId > > > > > ChamberMapCounterMapType
MO filter Item definition (loaded from XML/PSet)
void reset()
Reset counters.
boost::function< bool(const HistoId id, MonitorObject *&mo) > fnGetCacheEMUHisto