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)" )) \
108 (( std::string, FOLDER_FED, "" , "root file folder name to be used for FED histograms (EventProcessor)" )) \
109 (( bool, PREBOOK_ALL_HISTOS, true, "pre-book all FED, DDU, CSC histogragrams before run begins" )) \
118 #define CONFIG_PARAMETER_DEFINE_MACRO(r, data, i, elem) \
119 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 0, elem) BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem);
122 #define CONFIG_PARAMETER_DEFAULT_MACRO(r, data, i, elem) \
123 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem) = BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 2, elem);
126 #define CONFIG_PARAMETER_GETTER_MACRO(r, data, i, elem) \
127 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 { \
128 return BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem); \
132 #define CONFIG_PARAMETER_SETTER_MACRO(r, data, i, elem) \
133 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) { \
134 BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem) = p; \
140 #define CONFIG_PARAMETER_LOADPS_MACRO(r, data, i, elem) \
141 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)));
148 #define CONFIG_PARAMETER_LOADXML_MACRO(r, data, i, elem) \
149 if (nodeName.compare(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))) == 0) { \
150 stm >> BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem); \
155 #define CONFIG_PARAMETER_PRINTXML_MACRO(r, data, i, elem) \
157 DOMComment* comment = doc->createComment(XERCES_TRANSCODE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 3, elem))); \
158 DOMElement* el = doc->createElement(XERCES_TRANSCODE(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem)))); \
159 std::string value = toString(config.BOOST_PP_CAT(get, BOOST_PP_TUPLE_ELEM(CONFIG_PARAMETERS_SEQ_LEN, 1, elem))()); \
160 DOMText* tdata = doc->createTextNode(XERCES_TRANSCODE(value.c_str())); \
161 el->appendChild(tdata); \
162 rootElem->appendChild(comment); \
163 rootElem->appendChild(el); \
204 typedef boost::multi_index_container<
205 ChamberCounterKeyType,
206 boost::multi_index::indexed_by<
207 boost::multi_index::ordered_unique<
208 boost::multi_index::composite_key<
209 ChamberCounterKeyType,
210 boost::multi_index::member<ChamberCounterKeyType, HwId, &ChamberCounterKeyType::crateId>,
211 boost::multi_index::member<ChamberCounterKeyType, HwId, &ChamberCounterKeyType::dmbId>
250 boost::function< bool (const HistoDef& histoT, MonitorObject*&) >
fnGetHisto;
256 boost::function< bool (const HistoId id, const HwId& id1, const HwId& id2, const HwId& id3, MonitorObject*& mo) >
fnGetCacheCSCHisto;
258 boost::function< void (const HistoDef& histoT, MonitorObject*&) >
fnPutHisto;
259 boost::function< bool (unsigned int&, unsigned int&, unsigned int&) >
fnNextBookedCSC;
265 boost::function< MonitorObject* (const HistoBookRequest&) >
fnBook;
268 boost::function< bool (const unsigned int, const unsigned int, CSCDetId&) >
fnGetCSCDetId;
320 parser.setErrorHandler(&eh);
322 parser.parse(configFile.c_str());
323 DOMDocument *doc = parser.getDocument();
324 DOMNode *docNode = (DOMNode*) doc->getDocumentElement();
326 DOMNodeList *itemList = docNode->getChildNodes();
327 for(uint32_t
i = 0;
i < itemList->getLength();
i++) {
328 DOMNode* node = itemList->item(
i);
329 if (node->getNodeType() != DOMNode::ELEMENT_NODE) {
continue; }
333 std::istringstream stm(value);
337 if (nodeName.
compare("MO_FILTER") == 0) {
338 DOMNodeList *filterList = node->getChildNodes();
339 for(uint32_t
j = 0;
j < filterList->getLength();
j++) {
340 DOMNode*
filter = filterList->item(
j);
341 if (filter->getNodeType() != DOMNode::ELEMENT_NODE) {
continue; }
363 DOMImplementation* domImpl = DOMImplementationRegistry::getDOMImplementation(
XERCES_TRANSCODE(
"core"));
364 DOMDocument *doc = domImpl->createDocument(0,
XERCES_TRANSCODE(
"processor_configuration"), 0);
365 DOMElement* rootElem = doc->getDocumentElement();
369 DOMWriter *ser = domImpl->createDOMWriter();
370 if (ser->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint,
true)) {
371 ser->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint,
true);
373 XMLFileErrorHandler eh;
374 ser->setErrorHandler((DOMErrorHandler*) &eh);
375 ser->writeNode(
new StdOutFormatTarget(), *doc);
392 std::vector<std::
string> moFilter = ps.getUntrackedParameter<std::vector<std::
string> >("MO_FILTER");
393 for (std::vector<std::
string>::iterator it = moFilter.
begin(); it != moFilter.
end(); it++) {
396 LOG_WARN <<
"MO_FILTER item " << f <<
" does not recognized to be a valid one. Skipping...";
437 #define STATFIELD(caption, value, units) \
438 logger << std::setfill(' '); \
439 logger << std::setiosflags(std::ios::right) << std::setw(25) << caption << " : "; \
440 logger << std::setiosflags(std::ios::right) << std::setw(12); \
441 if (((double) value) < 0) { \
446 logger << std::setiosflags(std::ios::left) << std::setw(2) << units; \
451 logger << std::setfill('-'); \
452 logger << std::setw(25) << ""; \
453 logger << std::setw(10) << ""; \
454 logger << std::setw(2) << ""; \
477 STATFIELD(
"Avg. event time", eventTimeAverage,
"s")
479 STATFIELD(
"Avg. event rate", eventRateAverage,
"Hz")
481 STATFIELD(
"Avg. chamber rate", chamberRateAverage,
"Hz")
488 STATFIELD(
"Avg. fra update time", fraTimeAverage,
"s")
495 STATFIELD(
"Avg. eff update time", effTimeAverage,
"s")
501 STATFIELD(
"Avg. event all time", allTimeAverage,
"s")
502 double allRateAverage = (allTime > 0 ?
nEvents / allTime : -1.0);
503 STATFIELD(
"Avg. event all rate", allRateAverage,
"Hz")
504 double chamberAllRateAverage = (allTime > 0 ?
nUnpackedCSC / allTime : -1.0);
505 STATFIELD(
"Avg. chamber all rate", chamberAllRateAverage,
"Hz")
606 if (getEVENTS_ECHO() > 0) {
637 ChamberMapCounterMapType::iterator it =
chamberCounters.find(boost::make_tuple(crateId, dmbId));
642 ChamberCounterMapType::iterator itc = cs->find(counter);
643 if (itc == cs->end()) {
644 cs->insert(std::make_pair(counter, value));
670 ChamberMapCounterMapType::iterator it =
chamberCounters.find(boost::make_tuple(crateId, dmbId));
672 ChamberCounterMapType::const_iterator itc = it->counters.find(counter);
673 if (itc == it->counters.end())
return 0;
711 #undef CONFIG_PARAMETERS_SEQ_LEN
712 #undef CONFIG_PARAMETERS_SEQ
713 #undef CONFIG_PARAMETER_DEFINE_MACRO
714 #undef CONFIG_PARAMETER_DEFAULT_MACRO
715 #undef CONFIG_PARAMETER_GETTER_MACRO
716 #undef CONFIG_PARAMETER_SETTER_MACRO
717 #undef CONFIG_PARAMETER_LOADPS_MACRO
718 #undef CONFIG_PARAMETER_LOADXML_MACRO
719 #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.
tuple start
Check for commandline option errors.
auto_ptr< ClusterSequence > cs
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
XMLCh * transcode(const T &fInput)
boost::function< bool(const unsigned int, const unsigned int, CSCDetId &) > fnGetCSCDetId
void compare(std::vector< std::string > const &old_files, std::string const &old_process, std::vector< std::string > const &new_files, std::string const &new_process, unsigned int max_events, bool ignore_prescales, int verbose, int quiet)
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)
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.
boost::function< bool(unsigned int &) > fnIsBookedFED
std::vector< MOFilterItem > MOFilterItems
boost::function< bool(const HistoId id, const HwId &id1, MonitorObject *&mo) > fnGetCacheFEDHisto
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)
static std::atomic< unsigned int > counter
bool include(const CollT &coll, const ItemT &item)
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)
for(const auto &isodef:isoDefs)
void reset()
Reset counters.
boost::function< bool(const HistoId id, MonitorObject *&mo) > fnGetCacheEMUHisto