|
|
Go to the documentation of this file.
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/framework/StdOutFormatTarget.hpp>
33 #include <xercesc/dom/DOM.hpp>
35 #include <boost/multi_index_container.hpp>
36 #include <boost/multi_index/member.hpp>
37 #include <boost/multi_index/composite_key.hpp>
38 #include <boost/multi_index/ordered_index.hpp>
39 #include "boost/tuple/tuple.hpp"
41 #include <boost/preprocessor/tuple/elem.hpp>
42 #include <boost/preprocessor/seq/for_each_i.hpp>
43 #include <boost/preprocessor/stringize.hpp>
44 #include <boost/preprocessor/cat.hpp>
45 #include <boost/preprocessor/comparison/equal.hpp>
47 #include <boost/function.hpp>
48 #include <boost/bind.hpp>
50 #include <boost/timer.hpp>
65 #define CONFIG_PARAMETERS_SEQ_LEN 4
71 #define CONFIG_PARAMETERS_SEQ \
73 ((bool, PROCESS_DDU, true, "enter DDU (and latter Chamber) sections (EventProcessor flag)"))( \
74 (bool, PROCESS_CSC, true, "enter Chamber section (EventProcessor flag)"))( \
75 (bool, PROCESS_EFF_HISTOS, true, "calculate efficiency histograms (Dispatcher flag)"))( \
76 (bool, PROCESS_EFF_PARAMETERS, true, "calculate efficiency parameters (EventProcessor flag)"))( \
77 (bool, BINCHECKER_CRC_ALCT, false, "check ALCT CRC (CSCDCCExaminer flag)"))( \
78 (bool, BINCHECKER_CRC_CLCT, false, "check CLCT CRC (CSCDCCExaminer flag)"))( \
79 (bool, BINCHECKER_CRC_CFEB, false, "check CFEB CRC (CSCDCCExaminer flag)"))( \
80 (bool, BINCHECKER_MODE_DDU, true, "set DDU mode (CSCDCCExaminer flag)"))( \
81 (bool, BINCHECKER_OUTPUT, false, "print 1 and 2 output (CSCDCCExaminer flag)"))( \
85 "start fractional and efficiency histogram update automatically (Dispatcher flag)"))( \
87 FRAEFF_SEPARATE_THREAD, \
89 "start fractional and efficiency histogram update on separate thread (EventProcessor flag)"))( \
90 (bool, PRINT_STATS_ON_EXIT, true, "print statistics on exit (destruction)"))( \
91 (bool, IN_FULL_STANDBY, true, "full detector is in standby mode from the beginning of the run"))( \
92 (std::string, BOOKING_XML_FILE, "", "histogram description (booking) file in XML format (Collection)"))( \
93 (std::string, FOLDER_EMU, "", "root file folder name to be used for EMU histograms (EventProcessor)"))( \
94 (std::string, FOLDER_DDU, "", "root file folder name to be used for DDU histograms (EventProcessor)"))( \
95 (std::string, FOLDER_CSC, "", "root file folder name to be used for CSC histograms (EventProcessor)"))( \
96 (std::string, FOLDER_PAR, "", "root file folder name to be used for parameters (EventProcessor)"))(( \
97 unsigned int, DDU_CHECK_MASK, 0xFFFFFFFF, "mask for cumulative EmuFileReader DDU error flags (EventProcessor)"))( \
98 (unsigned int, DDU_BINCHECK_MASK, 0x02080016, "mask for DDU level examiner errors (CSCDCCExaminer)"))( \
99 (unsigned int, BINCHECK_MASK, 0xFFFFFFFF, "mask for chamber level examiner errors (CSCDCCExaminer)"))( \
101 FRAEFF_AUTO_UPDATE_START, \
103 "event number to start automatic fractional and efficiency histogram updates from (Dispatcer)"))( \
105 FRAEFF_AUTO_UPDATE_FREQ, \
107 "frequency in events to perform automatic fractional and efficiency histogram updates (Dispatcher)"))(( \
108 double, EFF_COLD_THRESHOLD, 0.1, "threshold in fraction to check for cold (not reporting) HW (EventProcessor)"))( \
109 (double, EFF_COLD_SIGFAIL, 5.0, "statistical significance for cold (not reporting) HW (EventProcessor)"))( \
110 (double, EFF_HOT_THRESHOLD, 0.1, "threshold in fraction to check for hot HW (EventProcessor)"))( \
111 (double, EFF_HOT_SIGFAIL, 5.0, "statistical significance for hot HW (EventProcessor)"))( \
112 (double, EFF_ERR_THRESHOLD, 0.1, "threshold in fraction to check for errors in HW (EventProcessor)"))( \
113 (double, EFF_ERR_SIGFAIL, 5.0, "statistical significance for errors in HW (EventProcessor)"))( \
115 EFF_NODATA_THRESHOLD, \
117 "threshold in fraction to check for not reporting elements in HW (EventProcessor)"))( \
118 (double, EFF_NODATA_SIGFAIL, 5.0, "statistical significance for not reportingelements in HW (EventProcessor)"))( \
119 (unsigned int, EVENTS_ECHO, 1000, "frequency in events to print echo message (EventProcessor)"))( \
120 (std::string, FOLDER_FED, "", "root file folder name to be used for FED histograms (EventProcessor)"))( \
121 (bool, PREBOOK_ALL_HISTOS, true, "pre-book all FED, DDU, CSC histogragrams before run begins"))
128 #define CONFIG_PARAMETER_DEFINE_MACRO(r, data, i, elem) \
129 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 0, elem) BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem);
132 #define CONFIG_PARAMETER_DEFAULT_MACRO(r, data, i, elem) \
133 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem) = BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 2, elem);
136 #define CONFIG_PARAMETER_GETTER_MACRO(r, data, i, elem) \
137 const BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 0, elem) \
138 BOOST_PP_CAT(get, BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))() const { \
139 return BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem); \
143 #define CONFIG_PARAMETER_SETTER_MACRO(r, data, i, elem) \
144 void BOOST_PP_CAT(set, BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))( \
145 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 0, elem) p) { \
146 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem) = p; \
152 #define CONFIG_PARAMETER_LOADPS_MACRO(r, data, i, elem) \
153 BOOST_PP_CAT(set, BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem)) \
154 (ps.getUntrackedParameter<BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 0, elem)>( \
155 BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem)), \
156 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 2, elem)));
163 #define CONFIG_PARAMETER_LOADXML_MACRO(r, data, i, elem) \
164 if (nodeName.compare(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))) == 0) { \
165 stm >> BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem); \
170 #define CONFIG_PARAMETER_PRINTXML_MACRO(r, data, i, elem) \
172 DOMComment* comment = \
173 doc->createComment(XERCES_TRANSCODE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 3, elem))); \
174 DOMElement* el = doc->createElement( \
175 XERCES_TRANSCODE(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem)))); \
176 std::string value = toString(config.BOOST_PP_CAT(get, BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))()); \
177 DOMText* tdata = doc->createTextNode(XERCES_TRANSCODE(value.c_str())); \
178 el->appendChild(tdata); \
179 rootElem->appendChild(comment); \
180 rootElem->appendChild(el); \
221 typedef boost::multi_index_container<
222 ChamberCounterKeyType,
223 boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::composite_key<
224 ChamberCounterKeyType,
225 boost::multi_index::member<ChamberCounterKeyType, HwId, &ChamberCounterKeyType::crateId>,
226 boost::multi_index::member<ChamberCounterKeyType, HwId, &ChamberCounterKeyType::dmbId> > > > >
330 parser.setErrorHandler(&eh);
332 parser.parse(configFile.c_str());
334 DOMNode* docNode = (DOMNode*)
doc->getDocumentElement();
336 DOMNodeList* itemList = docNode->getChildNodes();
337 for (XMLSize_t
i = 0;
i < itemList->getLength();
i++) {
338 DOMNode* node = itemList->item(
i);
339 if (node->getNodeType() != DOMNode::ELEMENT_NODE) {
343 std::string nodeName = XMLString::transcode(node->getNodeName());
345 std::istringstream stm(
value);
349 if (nodeName.compare(
"MO_FILTER") == 0) {
350 DOMNodeList* filterList = node->getChildNodes();
351 for (XMLSize_t
j = 0;
j < filterList->getLength();
j++) {
352 DOMNode*
filter = filterList->item(
j);
353 if (
filter->getNodeType() != DOMNode::ELEMENT_NODE) {
359 MOFilterItem(filterValue, (
filterName.compare(
"INCLUDE") == 0)));
376 DOMImplementation* domImpl = DOMImplementationRegistry::getDOMImplementation(XERCES_TRANSCODE(
"core"));
377 DOMDocument*
doc = domImpl->createDocument(0, XERCES_TRANSCODE(
"processor_configuration"), 0);
378 DOMElement* rootElem =
doc->getDocumentElement();
382 DOMLSSerializer* ser = domImpl->createLSSerializer();
383 if (ser->getDomConfig()->canSetParameter(XMLUni::fgDOMWRTFormatPrettyPrint,
true)) {
384 ser->getDomConfig()->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint,
true);
386 XMLFileErrorHandler eh;
387 ser->setErrorHandler((DOMErrorHandler*)&eh);
388 ser->writeNode(
new StdOutFormatTarget(), *
doc);
405 std::vector<std::string> moFilter = ps.
getUntrackedParameter<std::vector<std::string> >(
"MO_FILTER");
406 for (std::vector<std::string>::iterator it = moFilter.begin(); it != moFilter.end(); it++) {
409 LOG_WARN <<
"MO_FILTER item " <<
f <<
" does not recognized to be a valid one. Skipping...";
448 #define STATFIELD(caption, value, units) \
449 logger << std::setfill(' '); \
450 logger << std::setiosflags(std::ios::right) << std::setw(25) << caption << " : "; \
451 logger << std::setiosflags(std::ios::right) << std::setw(12); \
452 if (((double)value) < 0) { \
457 logger << std::setiosflags(std::ios::left) << std::setw(2) << units; \
462 logger << std::setfill('-'); \
463 logger << std::setw(25) << ""; \
464 logger << std::setw(10) << ""; \
465 logger << std::setw(2) << ""; \
487 STATFIELD(
"Avg. event time", eventTimeAverage,
"s")
489 STATFIELD(
"Avg. event rate", eventRateAverage,
"Hz")
491 STATFIELD(
"Avg. chamber rate", chamberRateAverage,
"Hz")
498 STATFIELD(
"Avg. fra update time", fraTimeAverage,
"s")
505 STATFIELD(
"Avg. eff update time", effTimeAverage,
"s")
511 STATFIELD(
"Avg. event all time", allTimeAverage,
"s")
512 double allRateAverage = (allTime > 0 ?
nEvents / allTime : -1.0);
513 STATFIELD(
"Avg. event all rate", allRateAverage,
"Hz")
514 double chamberAllRateAverage = (allTime > 0 ?
nUnpackedCSC / allTime : -1.0);
515 STATFIELD(
"Avg. chamber all rate", chamberAllRateAverage,
"Hz")
615 if (getEVENTS_ECHO() > 0) {
648 const uint32_t
value) {
649 ChamberMapCounterMapType::iterator it =
chamberCounters.find(boost::make_tuple(crateId, dmbId));
655 ChamberCounterMapType::iterator itc =
cs->find(
counter);
656 if (itc ==
cs->end()) {
687 const HwId dmbId)
const {
688 ChamberMapCounterMapType::iterator it =
chamberCounters.find(boost::make_tuple(crateId, dmbId));
691 ChamberCounterMapType::const_iterator itc = it->counters.find(
counter);
692 if (itc == it->counters.end())
729 #undef CONFIG_PARAMETERS_SEQ_LEN
730 #undef CONFIG_PARAMETERS_SEQ
731 #undef CONFIG_PARAMETER_DEFINE_MACRO
732 #undef CONFIG_PARAMETER_DEFAULT_MACRO
733 #undef CONFIG_PARAMETER_GETTER_MACRO
734 #undef CONFIG_PARAMETER_SETTER_MACRO
735 #undef CONFIG_PARAMETER_LOADPS_MACRO
736 #undef CONFIG_PARAMETER_LOADXML_MACRO
737 #undef CONFIG_PARAMETER_PRINTXML_MACRO
boost::function< bool(unsigned int &, unsigned int &, unsigned int &)> fnNextBookedCSC
unsigned short printStatsLocal
ChamberCounterMapType counters
void eventProcessTimer(const bool start)
Switch on/off event processing timer.
Configuration()
Constructor.
Abstract Base Histogram Definition.
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
void updateEffTimer(const bool start)
Switch on/off efficiency MO processing timer.
MOFilterItem(const std::string pattern_, const bool include_)
unique_ptr< ClusterSequence > cs
boost::function< bool(const HistoId id, MonitorObject *&mo)> fnGetCacheEMUHisto
unsigned long nEventsGood
const unsigned long getNEventsBad() const
static bool regexMatch(const std::string &expression, const std::string &message)
Match RegExp expression string against string message and return result.
T getUntrackedParameter(std::string const &, T const &) const
void printStats()
Print Statistics on Exit (Destruction)
ChamberMapCounterMapType chamberCounters
Chamber Counters key type.
Takes care of errors and warnings while parsing XML files file in XML format.
const unsigned long getNUnpackedCSC() const
boost::function< void(const HistoDef &histoT, MonitorObject *&)> fnPutHisto
boost::function< bool(unsigned int &)> fnIsBookedDDU
unsigned long nUnpackedCSC
ChamberCounterType
Chamber level counter types.
#define CONFIG_PARAMETER_SETTER_MACRO(r, data, i, elem)
boost::function< bool(const HistoId id, const HwId &id1, const HwId &id2, const HwId &id3, MonitorObject *&mo)> fnGetCacheCSCHisto
const unsigned long getNEvents() const
boost::function< bool(const HistoId id, const HwId &id1, MonitorObject *&mo)> fnGetCacheFEDHisto
#define CONFIG_PARAMETER_GETTER_MACRO(r, data, i, elem)
std::map< ChamberCounterType, uint32_t > ChamberCounterMapType
const unsigned long getNEventsCSC() const
#define CONFIG_PARAMETERS_SEQ
#define STATFIELD(caption, value, units)
boost::function< bool(unsigned int &, unsigned int &)> fnIsBookedCSC
ChamberCounterKeyType(const HwId &crateId_, const HwId &dmbId_, const ChamberCounterMapType &c_)
Information level logger. Use LOG_INFO macros instead, i.e. LOG_INFO << "x = " << x;.
#define CONFIG_PARAMETER_DEFINE_MACRO(r, data, i, elem)
boost::function< bool(const HistoId id, MonitorObject *&mo)> fnGetCacheParHisto
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.
CSCDQM Framework Global Configuration.
void setChamberCounterValue(const ChamberCounterType counter, const HwId crateId, const HwId dmbId, const uint32_t value)
Set Chamber counter value.
const unsigned long getNEventsGood() const
boost::function< bool(const HistoDef &histoT, MonitorObject *&)> fnGetHisto
boost::function< bool(const HistoId id, const HwId &id1, MonitorObject *&mo)> fnGetCacheDDUHisto
#define CONFIG_PARAMETER_DEFAULT_MACRO(r, data, i, elem)
std::vector< MOFilterItem > MOFilterItems
Monitoring Object interface used to cover Root object and provide common interface to EventProcessor ...
static void regexReplace(const std::string &expression, std::string &message, const std::string replace="")
Replace string part that matches RegExp expression with some string.
TEMPL(T2) struct Divides void
void reset()
Reset counters.
MO filter Item definition (loaded from XML/PSet)
boost::function< MonitorObject *(const HistoBookRequest &)> fnBook
bool include(const CollT &coll, const ItemT &item)
const bool needBookMO(const std::string name) const
Check if MO is not excluded by MO Filter.
boost::function< bool(unsigned int &)> fnIsBookedFED
void init()
Initialize parameter values and reset counters (used by constructors)
void incChamberCounter(const ChamberCounterType counter, const HwId crateId, const HwId dmbId)
Increment Chamber counter by 1.
const uint32_t getChamberCounterValue(const ChamberCounterType counter, const HwId crateId, const HwId dmbId) const
Get Chamber counter value.
~Configuration()
Destructor.
boost::function< bool(const unsigned int, const unsigned int, CSCDetId &)> fnGetCSCDetId
void updateFraTimer(const bool start)
Switch on/off fractional MO processing timer.
Configuration(const bool printStats)
Constructor.