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); \ 217 : crateId(crateId_), dmbId(dmbId_), counters(c_) {}
221 typedef boost::multi_index_container<
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> > > > >
259 boost::function<bool(const HistoDef& histoT, MonitorObject*&)>
fnGetHisto;
265 boost::function<bool(const HistoId id, const HwId& id1, const HwId& id2, const HwId& id3, MonitorObject*& mo)>
268 boost::function<void(const HistoDef& histoT, MonitorObject*&)>
fnPutHisto;
275 boost::function<MonitorObject*(const HistoBookRequest&)>
fnBook;
278 boost::function<bool(const unsigned int, const unsigned int, CSCDetId&)>
fnGetCSCDetId;
311 if ((PRINT_STATS_ON_EXIT && printStatsLocal == 0) || printStatsLocal == 1) {
330 parser.setErrorHandler(&eh);
332 parser.parse(configFile.c_str());
333 DOMDocument*
doc = parser.getDocument();
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) {
357 std::string filterValue = XMLString::transcode(filter->getTextContent());
358 MOFilterItems.insert(MOFilterItems.end(),
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);
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...";
414 MOFilterItems.insert(MOFilterItems.end(),
MOFilterItem(f, include));
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) << ""; \ 473 double allTime = globalTimer.elapsed();
479 STATFIELD(
"Good events", nEventsGood,
"")
480 STATFIELD(
"CSC DCC events", nEventsCSC,
"")
481 STATFIELD(
"Unpacked CSCs", nUnpackedCSC,
"")
485 STATFIELD(
"All event time", eventTimeSum,
"s")
486 double eventTimeAverage = (
nEvents > 0 ? eventTimeSum /
nEvents : -1.0);
487 STATFIELD(
"Avg. event time", eventTimeAverage,
"s")
488 double eventRateAverage = (eventTimeSum > 0 ?
nEvents / eventTimeSum : -1.0);
489 STATFIELD(
"Avg. event rate", eventRateAverage,
"Hz")
490 double chamberRateAverage = (eventTimeSum > 0 ? nUnpackedCSC / eventTimeSum : -1.0);
491 STATFIELD(
"Avg. chamber rate", chamberRateAverage,
"Hz")
495 STATFIELD(
"All fra update time", fraTimeSum,
"s")
496 STATFIELD(
"All fra update count", fraCount,
"")
497 double fraTimeAverage = (fraCount > 0 ? fraTimeSum / fraCount : -1.0);
498 STATFIELD(
"Avg. fra update time", fraTimeAverage,
"s")
502 STATFIELD(
"All eff update time", effTimeSum,
"s")
503 STATFIELD(
"All eff update count", effCount,
"")
504 double effTimeAverage = (effCount > 0 ? effTimeSum / effCount : -1.0);
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")
528 eventTimer.restart();
530 eventTimeSum += eventTimer.elapsed();
543 fraTimeSum += fraTimer.elapsed();
557 effTimeSum += effTimer.elapsed();
569 for (
unsigned int i = 0;
i < MOFilterItems.size();
i++) {
615 if (getEVENTS_ECHO() > 0) {
616 if (getNEvents() % getEVENTS_ECHO() == 0) {
617 LOG_INFO <<
"(echo) Events processed: " << std::setw(12) << getNEvents();
634 setChamberCounterValue(counter, crateId, dmbId, getChamberCounterValue(counter, crateId, dmbId) + 1);
648 const uint32_t
value) {
649 ChamberMapCounterMapType::iterator it = chamberCounters.find(boost::make_tuple(crateId, dmbId));
650 if (it == chamberCounters.end()) {
651 it = chamberCounters.insert(chamberCounters.end(),
654 ChamberCounterMapType*
cs =
const_cast<ChamberCounterMapType*
>(&it->counters);
655 ChamberCounterMapType::iterator itc = cs->find(counter);
656 if (itc == cs->end()) {
657 cs->insert(std::make_pair(counter, value));
675 setChamberCounterValue(counter_from, crateId, dmbId, getChamberCounterValue(counter_from, crateId, dmbId));
687 const HwId dmbId)
const {
688 ChamberMapCounterMapType::iterator it = chamberCounters.find(boost::make_tuple(crateId, dmbId));
689 if (it == chamberCounters.end())
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 void updateFraTimer(const bool start)
Switch on/off fractional MO processing timer.
boost::function< MonitorObject *(const HistoBookRequest &)> fnBook
boost::function< bool(const HistoId id, MonitorObject *&mo)> fnGetCacheEMUHisto
Configuration(const bool printStats)
Constructor.
unsigned long nEventsGood
T getUntrackedParameter(std::string const &, T const &) const
Chamber Counters key type.
MOFilterItem(const std::string pattern_, const bool include_)
#define CONFIG_PARAMETER_GETTER_MACRO(r, data, i, elem)
void incChamberCounter(const ChamberCounterType counter, const HwId crateId, const HwId dmbId)
Increment Chamber counter by 1.
boost::function< bool(unsigned int &, unsigned int &, unsigned int &)> fnNextBookedCSC
unsigned short printStatsLocal
const unsigned long getNEvents() const
Information level logger. Use LOG_INFO macros instead, i.e. LOG_INFO << "x = " << x;...
unique_ptr< ClusterSequence > cs
const unsigned long getNEventsGood() const
#define CONFIG_PARAMETERS_SEQ
void eventProcessTimer(const bool start)
Switch on/off event processing timer.
void updateEffTimer(const bool start)
Switch on/off efficiency MO processing timer.
const unsigned long getNUnpackedCSC() const
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_SETTER_MACRO(r, data, i, elem)
#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
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
const unsigned long getNEventsBad() const
unsigned long nUnpackedCSC
ChamberCounterType
Chamber level counter types.
CSCDQM Framework Global Configuration.
boost::function< bool(unsigned int &)> fnIsBookedDDU
#define CONFIG_PARAMETER_DEFAULT_MACRO(r, data, i, elem)
ChamberMapCounterMapType chamberCounters
boost::function< bool(const HistoId id, const HwId &id1, const HwId &id2, const HwId &id3, MonitorObject *&mo)> fnGetCacheCSCHisto
boost::function< void(const HistoDef &histoT, MonitorObject *&)> fnPutHisto
const bool needBookMO(const std::string name) const
Check if MO is not excluded by MO Filter.
boost::function< bool(const HistoId id, const HwId &id1, MonitorObject *&mo)> fnGetCacheFEDHisto
void setChamberCounterValue(const ChamberCounterType counter, const HwId crateId, const HwId dmbId, const uint32_t value)
Set Chamber counter value.
boost::function< bool(const HistoId id, MonitorObject *&mo)> fnGetCacheParHisto
boost::function< bool(unsigned int &, unsigned int &)> fnIsBookedCSC
#define STATFIELD(caption, value, units)
ChamberCounterMapType counters
boost::function< bool(const HistoId id, const HwId &id1, MonitorObject *&mo)> fnGetCacheDDUHisto
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< bool(const unsigned int, const unsigned int, CSCDetId &)> fnGetCSCDetId
static void regexReplace(const std::string &expression, std::string &message, const std::string replace="")
Replace string part that matches RegExp expression with some string.
Takes care of errors and warnings while parsing XML files file in XML format.
boost::function< bool(const HistoDef &histoT, MonitorObject *&)> fnGetHisto
MO filter Item definition (loaded from XML/PSet)
void reset()
Reset counters.
void reset(double vett[256])
boost::function< bool(unsigned int &)> fnIsBookedFED