19 #ifndef CSCDQM_Configuration_H 20 #define CSCDQM_Configuration_H 27 #include <xercesc/parsers/XercesDOMParser.hpp> 28 #include <xercesc/dom/DOMNodeList.hpp> 29 #include <xercesc/dom/DOMElement.hpp> 30 #include <xercesc/dom/DOMComment.hpp> 31 #include <xercesc/sax/ErrorHandler.hpp> 32 #include <xercesc/sax/SAXParseException.hpp> 33 #include <xercesc/dom/DOMImplementation.hpp> 34 #include <xercesc/framework/StdOutFormatTarget.hpp> 35 #include <xercesc/dom/DOM.hpp> 37 #include <boost/multi_index_container.hpp> 38 #include <boost/multi_index/member.hpp> 39 #include <boost/multi_index/composite_key.hpp> 40 #include <boost/multi_index/ordered_index.hpp> 41 #include "boost/tuple/tuple.hpp" 43 #include <boost/preprocessor/tuple/elem.hpp> 44 #include <boost/preprocessor/seq/for_each_i.hpp> 45 #include <boost/preprocessor/stringize.hpp> 46 #include <boost/preprocessor/cat.hpp> 47 #include <boost/preprocessor/comparison/equal.hpp> 62 #define CONFIG_PARAMETERS_SEQ_LEN 4 68 #define CONFIG_PARAMETERS_SEQ \ 70 ((bool, PROCESS_DDU, true, "enter DDU (and latter Chamber) sections (EventProcessor flag)"))( \ 71 (bool, PROCESS_CSC, true, "enter Chamber section (EventProcessor flag)"))( \ 72 (bool, PROCESS_EFF_HISTOS, true, "calculate efficiency histograms (Dispatcher flag)"))( \ 73 (bool, PROCESS_EFF_PARAMETERS, true, "calculate efficiency parameters (EventProcessor flag)"))( \ 74 (bool, BINCHECKER_CRC_ALCT, false, "check ALCT CRC (CSCDCCExaminer flag)"))( \ 75 (bool, BINCHECKER_CRC_CLCT, false, "check CLCT CRC (CSCDCCExaminer flag)"))( \ 76 (bool, BINCHECKER_CRC_CFEB, false, "check CFEB CRC (CSCDCCExaminer flag)"))( \ 77 (bool, BINCHECKER_MODE_DDU, true, "set DDU mode (CSCDCCExaminer flag)"))( \ 78 (bool, BINCHECKER_OUTPUT, false, "print 1 and 2 output (CSCDCCExaminer flag)"))( \ 82 "start fractional and efficiency histogram update automatically (Dispatcher flag)"))( \ 84 FRAEFF_SEPARATE_THREAD, \ 86 "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)"))( \ 98 FRAEFF_AUTO_UPDATE_START, \ 100 "event number to start automatic fractional and efficiency histogram updates from (Dispatcer)"))( \ 102 FRAEFF_AUTO_UPDATE_FREQ, \ 104 "frequency in events to perform automatic fractional and efficiency histogram updates (Dispatcher)"))(( \ 105 double, EFF_COLD_THRESHOLD, 0.1, "threshold in fraction to check for cold (not reporting) HW (EventProcessor)"))( \ 106 (double, EFF_COLD_SIGFAIL, 5.0, "statistical significance for cold (not reporting) HW (EventProcessor)"))( \ 107 (double, EFF_HOT_THRESHOLD, 0.1, "threshold in fraction to check for hot HW (EventProcessor)"))( \ 108 (double, EFF_HOT_SIGFAIL, 5.0, "statistical significance for hot HW (EventProcessor)"))( \ 109 (double, EFF_ERR_THRESHOLD, 0.1, "threshold in fraction to check for errors in HW (EventProcessor)"))( \ 110 (double, EFF_ERR_SIGFAIL, 5.0, "statistical significance for errors in HW (EventProcessor)"))( \ 112 EFF_NODATA_THRESHOLD, \ 114 "threshold in fraction to check for not reporting elements in HW (EventProcessor)"))( \ 115 (double, EFF_NODATA_SIGFAIL, 5.0, "statistical significance for not reportingelements in HW (EventProcessor)"))( \ 116 (unsigned int, EVENTS_ECHO, 1000, "frequency in events to print echo message (EventProcessor)"))( \ 117 (std::string, FOLDER_FED, "", "root file folder name to be used for FED histograms (EventProcessor)"))( \ 118 (bool, PREBOOK_ALL_HISTOS, true, "pre-book all FED, DDU, CSC histogragrams before run begins")) 125 #define CONFIG_PARAMETER_DEFINE_MACRO(r, data, i, elem) \ 126 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 0, elem) BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem); 129 #define CONFIG_PARAMETER_DEFAULT_MACRO(r, data, i, elem) \ 130 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem) = BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 2, elem); 133 #define CONFIG_PARAMETER_GETTER_MACRO(r, data, i, elem) \ 134 const BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 0, elem) \ 135 BOOST_PP_CAT(get, BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))() const { \ 136 return BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem); \ 140 #define CONFIG_PARAMETER_SETTER_MACRO(r, data, i, elem) \ 141 void BOOST_PP_CAT(set, BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))( \ 142 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 0, elem) p) { \ 143 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem) = p; \ 149 #define CONFIG_PARAMETER_LOADPS_MACRO(r, data, i, elem) \ 150 BOOST_PP_CAT(set, BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem)) \ 151 (ps.getUntrackedParameter<BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 0, elem)>( \ 152 BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem)), \ 153 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 2, elem))); 160 #define CONFIG_PARAMETER_LOADXML_MACRO(r, data, i, elem) \ 161 if (nodeName.compare(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))) == 0) { \ 162 stm >> BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem); \ 167 #define CONFIG_PARAMETER_PRINTXML_MACRO(r, data, i, elem) \ 169 DOMComment* comment = \ 170 doc->createComment(XERCES_TRANSCODE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 3, elem))); \ 171 DOMElement* el = doc->createElement( \ 172 XERCES_TRANSCODE(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem)))); \ 173 std::string value = toString(config.BOOST_PP_CAT(get, BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))()); \ 174 DOMText* tdata = doc->createTextNode(XERCES_TRANSCODE(value.c_str())); \ 175 el->appendChild(tdata); \ 176 rootElem->appendChild(comment); \ 177 rootElem->appendChild(el); \ 218 typedef boost::multi_index_container<
219 ChamberCounterKeyType,
220 boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::composite_key<
221 ChamberCounterKeyType,
222 boost::multi_index::member<ChamberCounterKeyType, HwId, &ChamberCounterKeyType::crateId>,
223 boost::multi_index::member<ChamberCounterKeyType, HwId, &ChamberCounterKeyType::dmbId> > > > >
257 std::function<bool(const HistoDef& histoT, MonitorObject*&)>
fnGetHisto;
263 std::function<bool(const HistoId id, const HwId& id1, const HwId& id2, const HwId& id3, MonitorObject*& mo)>
266 std::function<void(const HistoDef& histoT, MonitorObject*&)>
fnPutHisto;
273 std::function<MonitorObject*(const HistoBookRequest&)>
fnBook;
276 std::function<bool(const unsigned int, const unsigned int, CSCDetId&)>
fnGetCSCDetId;
328 parser.setErrorHandler(&eh);
332 DOMNode* docNode = (DOMNode*)
doc->getDocumentElement();
334 DOMNodeList* itemList = docNode->getChildNodes();
335 for (XMLSize_t
i = 0;
i < itemList->getLength();
i++) {
336 DOMNode* node = itemList->item(
i);
337 if (node->getNodeType() != DOMNode::ELEMENT_NODE) {
341 std::string nodeName = XMLString::transcode(node->getNodeName());
343 std::istringstream stm(
value);
347 if (nodeName.compare(
"MO_FILTER") == 0) {
348 DOMNodeList* filterList = node->getChildNodes();
349 for (XMLSize_t
j = 0;
j < filterList->getLength();
j++) {
350 DOMNode*
filter = filterList->item(
j);
351 if (
filter->getNodeType() != DOMNode::ELEMENT_NODE) {
357 MOFilterItem(filterValue, (
filterName.compare(
"INCLUDE") == 0)));
374 DOMImplementation* domImpl = DOMImplementationRegistry::getDOMImplementation(XERCES_TRANSCODE(
"core"));
375 DOMDocument*
doc = domImpl->createDocument(0, XERCES_TRANSCODE(
"processor_configuration"), 0);
376 DOMElement* rootElem =
doc->getDocumentElement();
380 DOMLSSerializer* ser = domImpl->createLSSerializer();
381 if (ser->getDomConfig()->canSetParameter(XMLUni::fgDOMWRTFormatPrettyPrint,
true)) {
382 ser->getDomConfig()->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint,
true);
384 XMLFileErrorHandler eh;
385 ser->setErrorHandler((DOMErrorHandler*)&eh);
386 ser->writeNode(
new StdOutFormatTarget(), *
doc);
403 std::vector<std::string> moFilter = ps.
getUntrackedParameter<std::vector<std::string> >(
"MO_FILTER");
404 for (std::vector<std::string>::iterator
it = moFilter.begin();
it != moFilter.end();
it++) {
407 LOG_WARN <<
"MO_FILTER item " <<
f <<
" does not recognized to be a valid one. Skipping...";
446 #define STATFIELD(caption, value, units) \ 447 logger << std::setfill(' '); \ 448 logger << std::setiosflags(std::ios::right) << std::setw(25) << caption << " : "; \ 449 logger << std::setiosflags(std::ios::right) << std::setw(12); \ 450 if (((double)value) < 0) { \ 455 logger << std::setiosflags(std::ios::left) << std::setw(2) << units; \ 460 logger << std::setfill('-'); \ 461 logger << std::setw(25) << ""; \ 462 logger << std::setw(10) << ""; \ 463 logger << std::setw(2) << ""; \ 471 double allTime = double(std::clock() -
globalTimer) / CLOCKS_PER_SEC;
485 STATFIELD(
"Avg. event time", eventTimeAverage,
"s")
487 STATFIELD(
"Avg. event rate", eventRateAverage,
"Hz")
489 STATFIELD(
"Avg. chamber rate", chamberRateAverage,
"Hz")
496 STATFIELD(
"Avg. fra update time", fraTimeAverage,
"s")
503 STATFIELD(
"Avg. eff update time", effTimeAverage,
"s")
509 STATFIELD(
"Avg. event all time", allTimeAverage,
"s")
510 double allRateAverage = (allTime > 0 ?
nEvents / allTime : -1.0);
511 STATFIELD(
"Avg. event all rate", allRateAverage,
"Hz")
512 double chamberAllRateAverage = (allTime > 0 ?
nUnpackedCSC / allTime : -1.0);
513 STATFIELD(
"Avg. chamber all rate", chamberAllRateAverage,
"Hz")
613 if (getEVENTS_ECHO() > 0) {
646 const uint32_t
value) {
647 ChamberMapCounterMapType::iterator
it =
chamberCounters.find(boost::make_tuple(crateId, dmbId));
653 ChamberCounterMapType::iterator itc =
cs->find(
counter);
654 if (itc ==
cs->end()) {
685 const HwId dmbId)
const {
686 ChamberMapCounterMapType::iterator
it =
chamberCounters.find(boost::make_tuple(crateId, dmbId));
689 ChamberCounterMapType::const_iterator itc =
it->counters.find(
counter);
690 if (itc ==
it->counters.end())
727 #undef CONFIG_PARAMETERS_SEQ_LEN 728 #undef CONFIG_PARAMETERS_SEQ 729 #undef CONFIG_PARAMETER_DEFINE_MACRO 730 #undef CONFIG_PARAMETER_DEFAULT_MACRO 731 #undef CONFIG_PARAMETER_GETTER_MACRO 732 #undef CONFIG_PARAMETER_SETTER_MACRO 733 #undef CONFIG_PARAMETER_LOADPS_MACRO 734 #undef CONFIG_PARAMETER_LOADXML_MACRO 735 #undef CONFIG_PARAMETER_PRINTXML_MACRO void updateFraTimer(const bool start)
Switch on/off fractional MO processing timer.
const bool needBookMO(const std::string name) const
Check if MO is not excluded by MO Filter.
Configuration(const bool printStats)
Constructor.
unsigned long nEventsGood
Chamber Counters key type.
MOFilterItem(const std::string pattern_, const bool include_)
void incChamberCounter(const ChamberCounterType counter, const HwId crateId, const HwId dmbId)
Increment Chamber counter by 1.
unsigned short printStatsLocal
std::function< MonitorObject *(const HistoBookRequest &)> fnBook
#define CONFIG_PARAMETER_GETTER_MACRO(r, data, i, elem)
std::function< void(const HistoDef &histoT, MonitorObject *&)> fnPutHisto
Information level logger. Use LOG_INFO macros instead, i.e. LOG_INFO << "x = " << x;...
std::function< bool(const HistoId id, const HwId &id1, MonitorObject *&mo)> fnGetCacheDDUHisto
std::function< bool(const HistoId id, MonitorObject *&mo)> fnGetCacheParHisto
std::function< bool(const unsigned int, const unsigned int, CSCDetId &)> fnGetCSCDetId
#define CONFIG_PARAMETERS_SEQ
std::function< bool(unsigned int &)> fnIsBookedDDU
void eventProcessTimer(const bool start)
Switch on/off event processing timer.
Configuration()
Constructor.
std::function< bool(unsigned int &, unsigned int &, unsigned int &)> fnNextBookedCSC
std::function< bool(const HistoId id, const HwId &id1, const HwId &id2, const HwId &id3, MonitorObject *&mo)> fnGetCacheCSCHisto
void updateEffTimer(const bool start)
Switch on/off efficiency MO processing timer.
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)
TEMPL(T2) struct Divides void
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
unsigned long nUnpackedCSC
T getUntrackedParameter(std::string const &, T const &) const
const unsigned long getNEventsBad() const
const unsigned long getNEventsCSC() const
ChamberCounterType
Chamber level counter types.
CSCDQM Framework Global Configuration.
std::function< bool(const HistoDef &histoT, MonitorObject *&)> fnGetHisto
#define STATFIELD(caption, value, units)
#define CONFIG_PARAMETER_DEFAULT_MACRO(r, data, i, elem)
ChamberMapCounterMapType chamberCounters
std::function< bool(const HistoId id, MonitorObject *&mo)> fnGetCacheEMUHisto
const unsigned long getNUnpackedCSC() const
const unsigned long getNEvents() const
void setChamberCounterValue(const ChamberCounterType counter, const HwId crateId, const HwId dmbId, const uint32_t value)
Set Chamber counter value.
const unsigned long getNEventsGood() const
std::function< bool(unsigned int &)> fnIsBookedFED
ChamberCounterMapType counters
void init()
Initialize parameter values and reset counters (used by constructors)
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
static void regexReplace(const std::string &expression, std::string &message, const std::string replace="")
Replace string part that matches RegExp expression with some string.
std::function< bool(const HistoId id, const HwId &id1, MonitorObject *&mo)> fnGetCacheFEDHisto
#define CONFIG_PARAMETER_SETTER_MACRO(r, data, i, elem)
bool include(const CollT &coll, const ItemT &item)
Takes care of errors and warnings while parsing XML files file in XML format.
MO filter Item definition (loaded from XML/PSet)
void reset()
Reset counters.
std::function< bool(unsigned int &, unsigned int &)> fnIsBookedCSC
const uint32_t getChamberCounterValue(const ChamberCounterType counter, const HwId crateId, const HwId dmbId) const
Get Chamber counter value.