8 #include "classlib/utils/RegexpMatch.h"
9 #include "classlib/utils/Regexp.h"
10 #include "classlib/utils/StringOps.h"
11 #include <google/protobuf/io/coded_stream.h>
12 #include <google/protobuf/io/gzip_stream.h>
13 #include <google/protobuf/io/zero_copy_stream_impl.h>
19 #include "TBufferFile.h"
22 #include <boost/algorithm/string.hpp>
56 static const std::string s_safe =
"/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+=_()# ";
58 static const lat::Regexp
s_rxmeval (
"^<(.*)>(i|f|s|e|t|qr)=(.*)</\\1>$");
59 static const lat::Regexp
s_rxmeqr1 (
"^st:(\\d+):([-+e.\\d]+):([^:]*):(.*)$");
60 static const lat::Regexp
s_rxmeqr2 (
"^st\\.(\\d+)\\.(.*)$");
61 static const lat::Regexp
s_rxtrace (
"(.*)\\((.*)\\+0x.*\\).*");
62 static const lat::Regexp
s_rxpbfile (
".*\\.pb$");
71 || (path.size() >= ofdir.size()
72 && path.compare(0, ofdir.size(), ofdir) == 0
73 && (path.size() == ofdir.size()
74 || path[ofdir.size()] ==
'/')));
83 size_t len = path.size();
84 for ( ; len > 0 && path[len-1] ==
'/'; --len)
87 if (len != path.size())
89 clean = path.substr(0, len);
97 size_t slash = path.rfind(
'/');
98 if (slash != std::string::npos)
100 dir.append(path, 0, slash);
101 name.append(path, slash+1, std::string::npos);
110 path.reserve(dir.size() + name.size() + 2);
120 {
return new T(qtname); }
125 {
m[T::getAlgoName()] = &makeQCriterion<T>; }
130 fastString_ (_fastString), matching_ (UseFull)
138 catch (lat::Error &
e)
141 raiseDQMError(
"DQMStore",
"Invalid wildcard pattern '%s' in quality"
146 size_t starCount = 0;
151 if ((
size_t)pos == std::string::npos)
157 if ((
fastString_.find(
'"') != std::string::npos) ||
170 if (boost::algorithm::starts_with(
fastString_,
"*"))
188 if (boost::algorithm::starts_with(
fastString_,
"*") &&
208 if (input.size() < pattern.size())
214 std::string::const_reverse_iterator rit_pattern = pattern.rbegin();
215 std::string::const_reverse_iterator rit_input = input.rbegin();
217 for (; rit_pattern < pattern.rend(); rit_pattern++, rit_input++)
219 if (*rit_pattern != *rit_input)
229 if (input.size() < pattern.size())
235 std::string::const_iterator rit_pattern = pattern.begin();
236 std::string::const_iterator rit_input = input.begin();
238 for (; rit_pattern < pattern.end(); rit_pattern++, rit_input++)
240 if (*rit_pattern != *rit_input)
275 owner_->setCurrentFolder(fullpath);
283 return owner_->pwd();
287 owner_->tag(me, tag);
291 owner_->tagContents(path, myTag);
295 std::vector<MonitorElement*>
299 return owner_->getAllContents(path, runNumber, lumi);
303 return owner_->get(path);
307 return owner_->getSubdirs();
311 return owner_->getMEs();
315 return owner_->containsAnyMonitorable(path);
319 return owner_->dirExists(path);
331 owner_->setCurrentFolder(fullpath);
347 std::cout <<
"DQMStore::mergeAndResetMEsRunSummaryCache - Merging objects from run: "
349 <<
", stream: " << streamId
350 <<
" module: " << moduleId << std::endl;
357 MonitorElement proto(&null_str, null_str, run, streamId, moduleId);
358 std::set<MonitorElement>::const_iterator
e =
data_.end();
359 std::set<MonitorElement>::const_iterator
i =
data_.lower_bound(proto);
361 if (i->data_.run != run
362 || i->data_.streamId != streamId
363 || i->data_.moduleId != moduleId)
380 std::set<MonitorElement>::const_iterator me =
data_.find(global_me);
381 if (me !=
data_.end()) {
383 std::cout <<
"Found global Object, using it --> " << me->getFullname() << std::endl;
388 if(me->getTH1()->CanExtendAllAxes() && i->getTH1()->CanExtendAllAxes()) {
390 list.Add(i->getTH1());
391 if( -1 == me->getTH1()->Merge(&list)) {
392 std::cout <<
"mergeAndResetMEsRunSummaryCache: Failed to merge DQM element "<<me->getFullname();
396 me->getTH1()->Add(i->getTH1());
400 std::cout <<
"No global Object found. " << std::endl;
401 std::pair<std::set<MonitorElement>::const_iterator,
bool> gme;
419 std::cout <<
"DQMStore::mergeAndResetMEsLuminositySummaryCache - Merging objects from run: "
420 << run <<
" lumi: " << lumi
421 <<
", stream: " << streamId
422 <<
" module: " << moduleId << std::endl;
424 MonitorElement proto(&null_str, null_str, run, streamId, moduleId);
425 std::set<MonitorElement>::const_iterator
e =
data_.end();
426 std::set<MonitorElement>::const_iterator
i =
data_.lower_bound(proto);
429 if (i->data_.run != run
430 || i->data_.streamId != streamId
431 || i->data_.moduleId != moduleId)
446 std::set<MonitorElement>::const_iterator me =
data_.find(global_me);
447 if (me !=
data_.end()) {
449 std::cout <<
"Found global Object, using it --> " << me->getFullname() << std::endl;
454 if(me->getTH1()->CanExtendAllAxes() && i->getTH1()->CanExtendAllAxes()) {
456 list.Add(i->getTH1());
457 if( -1 == me->getTH1()->Merge(&list)) {
458 std::cout <<
"mergeAndResetMEsLuminositySummaryCache: Failed to merge DQM element "<<me->getFullname();
462 me->getTH1()->Add(i->getTH1());
466 std::cout <<
"No global Object found. " << std::endl;
467 std::pair<std::set<MonitorElement>::const_iterator,
bool> gme;
472 actual_global_me.
setLumi(lumi);
523 collateHistograms_ (
false),
524 enableMultiThread_(
false),
525 readSelectedDirectory_ (
""),
570 std::cout <<
"DQMStore: histogram collation is enabled\n";
574 std::cout <<
"DQMStore: MultiThread option is enabled\n";
578 std::cout <<
"DQMStore: LSbasedMode option is enabled\n";
583 std::cout <<
"DQMStore: using reference file '" << ref <<
"'\n";
587 initQCriterion<Comp2RefChi2>(
qalgos_);
588 initQCriterion<Comp2RefKolmogorov>(
qalgos_);
589 initQCriterion<ContentsXRange>(
qalgos_);
590 initQCriterion<ContentsYRange>(
qalgos_);
591 initQCriterion<MeanWithinExpected>(
qalgos_);
592 initQCriterion<Comp2RefEqualH>(
qalgos_);
593 initQCriterion<DeadChannel>(
qalgos_);
594 initQCriterion<NoisyChannel>(
qalgos_);
595 initQCriterion<ContentsWithinExpected>(
qalgos_);
596 initQCriterion<CompareToMedian>(
qalgos_);
597 initQCriterion<CompareLastFilledBin>(
qalgos_);
598 initQCriterion<CheckVariance>(
qalgos_);
602 std::cout <<
"DQMStore: Scaling Flag set to " << scaleFlag_ << std::endl;
621 stream_ =
new std::ofstream(
"histogramBookingBT.log");
630 size = backtrace (array, 10);
631 strings = backtrace_symbols (array, size);
636 char * demangled = abi::__cxa_demangle(m.matchString(strings[4], 2).c_str(), 0, 0, &
r);
639 << (r ? m.matchString(strings[4], 2) : demangled) <<
" "
640 << m.matchString(strings[4], 1) <<
"\n";
644 *
stream_ <<
"Skipping "<< dir <<
"/" << name
645 <<
" with stack size " << size <<
"\n";
653 for (i = 0; i <
size; i++)
654 if (
s_rxtrace.match(strings[i], 0, 0, &m))
656 char * demangled = abi::__cxa_demangle(m.matchString(strings[i], 2).c_str(), 0, 0, &
r);
657 *
stream_ <<
"\t\t" << i <<
"/" << size <<
" "
658 << (r ? m.matchString(strings[i], 2) : demangled) <<
" "
659 << m.matchString(strings[i], 1) << std::endl;
696 raiseDQMError(
"DQMStore",
"Cannot 'cd' into non-existent directory '%s'",
720 size_t pos =
pwd_.rfind(
'/');
721 if (pos == std::string::npos)
736 prev.reserve(path.size());
737 subdir.reserve(path.size());
738 name.reserve(path.size());
746 subdir.append(path, 0, slash);
748 name.append(subdir, prevname, std::string::npos);
750 raiseDQMError(
"DQMStore",
"Attempt to create subdirectory '%s'"
751 " which already exists as a monitor element",
754 if (!
dirs_.count(subdir))
755 dirs_.insert(subdir);
758 if (slash+1 >= path.size())
763 prevname = slash ? slash+1 :
slash;
765 if ((slash = path.find(
'/', ++slash)) == std::string::npos)
773 {
return dirs_.count(path) > 0; }
778 template <
class HISTO,
class COLLATE>
781 const char *context,
int kind,
782 HISTO *
h, COLLATE collate)
784 assert(name.find(
'/') == std::string::npos);
807 << context <<
": monitor element '"
808 << path <<
"' already exists, collating" << std::endl;
826 for ( ; qi != qe; ++qi)
828 if ( qi->first->match(path) )
829 me->addQReport(qi->second);
853 assert(name.find(
'/') == std::string::npos);
866 << context <<
": monitor element '"
867 << path <<
"' already exists, resetting" << std::endl;
895 return book(dir, name,
"bookInt")
925 return book(dir, name,
"bookFloat")
954 return book(dir, name,
"bookString")
995 int nchX,
double lowX,
double highX)
997 return book1D(
pwd_, name,
new TH1F(name, title, nchX, lowX, highX));
1003 int nchX,
double lowX,
double highX)
1005 return book1D(
pwd_, name,
new TH1F(name.c_str(), title.c_str(), nchX, lowX, highX));
1011 int nchX,
double lowX,
double highX)
1013 return book1S(
pwd_, name,
new TH1S(name, title, nchX, lowX, highX));
1019 int nchX,
double lowX,
double highX)
1021 return book1S(
pwd_, name,
new TH1S(name.c_str(), title.c_str(), nchX, lowX, highX));
1027 int nchX,
double lowX,
double highX)
1029 return book1DD(
pwd_, name,
new TH1D(name, title, nchX, lowX, highX));
1035 int nchX,
double lowX,
double highX)
1037 return book1DD(
pwd_, name,
new TH1D(name.c_str(), title.c_str(), nchX, lowX, highX));
1043 int nchX,
const float *xbinsize)
1045 return book1D(
pwd_, name,
new TH1F(name, title, nchX, xbinsize));
1051 int nchX,
const float *xbinsize)
1053 return book1D(
pwd_, name,
new TH1F(name.c_str(), title.c_str(), nchX, xbinsize));
1060 return book1D(
pwd_, name, static_cast<TH1F *>(source->Clone(name)));
1067 return book1D(
pwd_, name, static_cast<TH1F *>(source->Clone(name.c_str())));
1074 return book1S(
pwd_, name, static_cast<TH1S *>(source->Clone(name)));
1081 return book1S(
pwd_, name, static_cast<TH1S *>(source->Clone(name.c_str())));
1088 return book1DD(
pwd_, name, static_cast<TH1D *>(source->Clone(name)));
1095 return book1DD(
pwd_, name, static_cast<TH1D *>(source->Clone(name.c_str())));
1123 int nchX,
double lowX,
double highX,
1124 int nchY,
double lowY,
double highY)
1126 return book2D(
pwd_, name,
new TH2F(name, title,
1128 nchY, lowY, highY));
1134 int nchX,
double lowX,
double highX,
1135 int nchY,
double lowY,
double highY)
1137 return book2D(
pwd_, name,
new TH2F(name.c_str(), title.c_str(),
1139 nchY, lowY, highY));
1145 int nchX,
double lowX,
double highX,
1146 int nchY,
double lowY,
double highY)
1148 return book2S(
pwd_, name,
new TH2S(name, title,
1150 nchY, lowY, highY));
1156 int nchX,
double lowX,
double highX,
1157 int nchY,
double lowY,
double highY)
1159 return book2S(
pwd_, name,
new TH2S(name.c_str(), title.c_str(),
1161 nchY, lowY, highY));
1167 int nchX,
double lowX,
double highX,
1168 int nchY,
double lowY,
double highY)
1172 nchY, lowY, highY));
1178 int nchX,
double lowX,
double highX,
1179 int nchY,
double lowY,
double highY)
1181 return book2DD(
pwd_, name,
new TH2D(name.c_str(), title.c_str(),
1183 nchY, lowY, highY));
1189 int nchX,
const float *xbinsize,
int nchY,
const float *ybinsize)
1191 return book2D(
pwd_, name,
new TH2F(name, title,
1192 nchX, xbinsize, nchY, ybinsize));
1198 int nchX,
const float *xbinsize,
int nchY,
const float *ybinsize)
1200 return book2D(
pwd_, name,
new TH2F(name.c_str(), title.c_str(),
1201 nchX, xbinsize, nchY, ybinsize));
1208 return book2D(
pwd_, name, static_cast<TH2F *>(source->Clone(name)));
1215 return book2D(
pwd_, name, static_cast<TH2F *>(source->Clone(name.c_str())));
1222 return book2S(
pwd_, name, static_cast<TH2S *>(source->Clone(name)));
1229 return book2S(
pwd_, name, static_cast<TH2S *>(source->Clone(name.c_str())));
1236 return book2DD(
pwd_, name, static_cast<TH2D *>(source->Clone(name)));
1243 return book2DD(
pwd_, name, static_cast<TH2D *>(source->Clone(name.c_str())));
1257 int nchX,
double lowX,
double highX,
1258 int nchY,
double lowY,
double highY,
1259 int nchZ,
double lowZ,
double highZ)
1261 return book3D(
pwd_, name,
new TH3F(name, title,
1264 nchZ, lowZ, highZ));
1270 int nchX,
double lowX,
double highX,
1271 int nchY,
double lowY,
double highY,
1272 int nchZ,
double lowZ,
double highZ)
1274 return book3D(
pwd_, name,
new TH3F(name.c_str(), title.c_str(),
1277 nchZ, lowZ, highZ));
1284 return book3D(
pwd_, name, static_cast<TH3F *>(source->Clone(name)));
1291 return book3D(
pwd_, name, static_cast<TH3F *>(source->Clone(name.c_str())));
1299 return book(dir, name,
"bookProfile",
1309 int nchX,
double lowX,
double highX,
1310 int ,
double lowY,
double highY,
1311 const char *option )
1324 int nchX,
double lowX,
double highX,
1325 int ,
double lowY,
double highY,
1326 const char *option )
1328 return bookProfile(
pwd_, name,
new TProfile(name.c_str(), title.c_str(),
1339 int nchX,
double lowX,
double highX,
1340 double lowY,
double highY,
1341 const char *option )
1354 int nchX,
double lowX,
double highX,
1355 double lowY,
double highY,
1356 const char *option )
1358 return bookProfile(
pwd_, name,
new TProfile(name.c_str(), title.c_str(),
1369 int nchX,
const double *xbinsize,
1370 int ,
double lowY,
double highY,
1371 const char *option )
1384 int nchX,
const double *xbinsize,
1385 int ,
double lowY,
double highY,
1386 const char *option )
1388 return bookProfile(
pwd_, name,
new TProfile(name.c_str(), title.c_str(),
1399 int nchX,
const double *xbinsize,
1400 double lowY,
double highY,
1401 const char *option )
1414 int nchX,
const double *xbinsize,
1415 double lowY,
double highY,
1416 const char *option )
1418 return bookProfile(
pwd_, name,
new TProfile(name.c_str(), title.c_str(),
1428 return bookProfile(
pwd_, name, static_cast<TProfile *>(source->Clone(name)));
1435 return bookProfile(
pwd_, name, static_cast<TProfile *>(source->Clone(name.c_str())));
1443 return book(dir, name,
"bookProfile2D",
1453 int nchX,
double lowX,
double highX,
1454 int nchY,
double lowY,
double highY,
1455 int ,
double lowZ,
double highZ,
1456 const char *option )
1470 int nchX,
double lowX,
double highX,
1471 int nchY,
double lowY,
double highY,
1472 int ,
double lowZ,
double highZ,
1473 const char *option )
1487 int nchX,
double lowX,
double highX,
1488 int nchY,
double lowY,
double highY,
1489 double lowZ,
double highZ,
1490 const char *option )
1504 int nchX,
double lowX,
double highX,
1505 int nchY,
double lowY,
double highY,
1506 double lowZ,
double highZ,
1507 const char *option )
1520 return bookProfile2D(
pwd_, name, static_cast<TProfile2D *>(source->Clone(name)));
1527 return bookProfile2D(
pwd_, name, static_cast<TProfile2D *>(source->Clone(name.c_str())));
1536 if (me->
getTH1()->GetNbinsX() != h->GetNbinsX()
1537 || me->
getTH1()->GetNbinsY() != h->GetNbinsY()
1538 || me->
getTH1()->GetNbinsZ() != h->GetNbinsZ()
1539 || me->
getTH1()->GetXaxis()->GetXmin() != h->GetXaxis()->GetXmin()
1540 || me->
getTH1()->GetYaxis()->GetXmin() != h->GetYaxis()->GetXmin()
1541 || me->
getTH1()->GetZaxis()->GetXmin() != h->GetZaxis()->GetXmin()
1542 || me->
getTH1()->GetXaxis()->GetXmax() != h->GetXaxis()->GetXmax()
1543 || me->
getTH1()->GetYaxis()->GetXmax() != h->GetYaxis()->GetXmax()
1544 || me->
getTH1()->GetZaxis()->GetXmax() != h->GetZaxis()->GetXmax()
1551 <<
"checkBinningMatches: different binning - cannot add object '"
1552 << h->GetName() <<
"' of type "
1553 << h->IsA()->GetName() <<
" to existing ME: '"
1637 raiseDQMError(
"DQMStore",
"Attempt to tag monitor element '%s'"
1640 raiseDQMError(
"DQMStore",
"Attempt to tag monitor element '%s'"
1641 " twice with multiple tags", me->
getFullname().c_str());
1658 raiseDQMError(
"DQMStore",
"Attempt to tag non-existent monitor element"
1659 " '%s' with tag %u", path.c_str(), myTag);
1668 MEMap::iterator
e =
data_.end();
1669 MEMap::iterator
i =
data_.lower_bound(proto);
1670 for ( ; i != e && path == *i->data_.dirname; ++
i)
1671 tag(const_cast<MonitorElement *>(&*i), myTag);
1685 MEMap::iterator
e =
data_.end();
1686 MEMap::iterator
i =
data_.lower_bound(proto);
1689 tag(const_cast<MonitorElement *>(&*i), myTag);
1698 std::vector<std::string>
1701 std::vector<std::string>
result;
1702 std::set<std::string>::const_iterator
e =
dirs_.end();
1703 std::set<std::string>::const_iterator
i =
dirs_.find(
pwd_);
1714 if (i->find(
'/',
pwd_.size()+1) == std::string::npos)
1715 result.push_back(*i);
1721 std::vector<std::string>
1725 std::vector<std::string>
result;
1726 MEMap::const_iterator
e =
data_.end();
1727 MEMap::const_iterator
i =
data_.lower_bound(proto);
1729 if (
pwd_ == *i->data_.dirname)
1730 result.push_back(i->getName());
1741 MEMap::const_iterator
e =
data_.end();
1742 MEMap::const_iterator
i =
data_.lower_bound(proto);
1754 MEMap::const_iterator mepos =
data_.find(proto);
1755 return (mepos ==
data_.end() ? 0
1760 std::vector<MonitorElement *>
1764 std::vector<MonitorElement *>
result;
1765 for (MEMap::const_iterator
i =
data_.begin(),
e =
data_.end();
i !=
e; ++
i)
1769 result.push_back(const_cast<MonitorElement *>(&me));
1776 std::vector<MonitorElement *>
1784 std::vector<MonitorElement *>
result;
1785 MEMap::const_iterator
e =
data_.end();
1786 MEMap::const_iterator
i =
data_.lower_bound(proto);
1788 if (*cleaned == *i->data_.dirname)
1789 result.push_back(const_cast<MonitorElement *>(&*i));
1795 std::vector<MonitorElement *>
1803 std::vector<MonitorElement *>
result;
1804 MEMap::const_iterator
e =
data_.end();
1805 MEMap::const_iterator
i =
data_.lower_bound(proto);
1807 if (*cleaned == *i->data_.dirname
1809 && i->data_.tag ==
tag)
1810 result.push_back(const_cast<MonitorElement *>(&*i));
1823 into.reserve(
dirs_.size());
1825 MEMap::const_iterator me =
data_.end();
1826 std::set<std::string>::const_iterator di =
dirs_.begin();
1827 std::set<std::string>::const_iterator de =
dirs_.end();
1828 for ( ; di != de; ++di)
1831 MEMap::const_iterator mi =
data_.lower_bound(proto);
1832 MEMap::const_iterator
m = mi;
1833 size_t sz = di->size() + 2;
1836 if (*di == *m->data_.dirname)
1838 sz += m->data_.objname.size() + 1;
1845 std::vector<std::string>::iterator istr
1854 for (sz = 0; mi !=
m; ++mi)
1856 if (*di != *mi->data_.dirname)
1862 *istr += mi->data_.objname;
1868 istr->reserve(di->size() + 2);
1880 const uint32_t
run ,
1881 const uint32_t
lumi ,
1882 const uint32_t streamId ,
1883 const uint32_t moduleId )
const
1885 if (dir.find_first_not_of(
s_safe) != std::string::npos)
1886 raiseDQMError(
"DQMStore",
"Monitor element path name '%s' uses"
1887 " unacceptable characters", dir.c_str());
1888 if (name.find_first_not_of(
s_safe) != std::string::npos)
1889 raiseDQMError(
"DQMStore",
"Monitor element path name '%s' uses"
1890 " unacceptable characters", name.c_str());
1900 MEMap::const_iterator mepos =
data_.find(proto);
1901 return (mepos ==
data_.end() ? 0
1911 into.reserve(
dirs_.size());
1913 MEMap::const_iterator me =
data_.end();
1914 std::set<std::string>::const_iterator di =
dirs_.begin();
1915 std::set<std::string>::const_iterator de =
dirs_.end();
1918 for ( ; di != de; ++di)
1921 MEMap::const_iterator mi =
data_.lower_bound(proto);
1922 MEMap::const_iterator
m = mi;
1923 size_t sz = di->size() + 2;
1929 sz += 1 + m->data_.objname.size() + 11;
1936 std::vector<std::string>::iterator istr
1943 for (sz = 0; mi !=
m; ++mi)
1947 sprintf(tagbuf,
"/%u", mi->data_.tag);
1950 *istr += m->data_.objname;
1960 std::vector<MonitorElement*>
1963 uint32_t
lumi )
const
1971 std::vector<MonitorElement *>
result;
1972 MEMap::const_iterator
e =
data_.end();
1973 MEMap::const_iterator
i =
data_.lower_bound(proto);
1975 if (runNumber != 0) {
1976 if (i->data_.run > runNumber
1977 || i->data_.streamId != 0
1978 || i->data_.moduleId != 0)
1982 if (i->data_.lumi > lumi
1983 || i->data_.streamId != 0
1984 || i->data_.moduleId != 0)
1987 if (runNumber != 0
or lumi !=0) {
1988 assert(i->data_.streamId == 0);
1989 assert(i->data_.moduleId == 0);
1991 result.push_back(const_cast<MonitorElement *>(&*i));
1999 if (i->data_.run != 0 || i->data_.streamId != 0 || i->data_.moduleId != 0)
break;
2000 result.push_back(const_cast<MonitorElement *>(&*i));
2009 std::vector<MonitorElement*>
2015 rx = lat::Regexp(pattern, 0, syntaxType);
2018 catch (lat::Error &
e)
2020 raiseDQMError(
"DQMStore",
"Invalid regular expression '%s': %s",
2021 pattern.c_str(), e.explain().c_str());
2025 std::vector<MonitorElement *>
result;
2026 MEMap::const_iterator
i =
data_.begin();
2027 MEMap::const_iterator e =
data_.end();
2028 for ( ; i !=
e; ++
i)
2031 mergePath(path, *i->data_.dirname, i->data_.objname);
2033 result.push_back(const_cast<MonitorElement *>(&*i));
2048 MEMap::iterator mi =
data_.begin();
2049 MEMap::iterator me =
data_.end();
2050 for ( ; mi != me; ++mi)
2053 if (mi->wasUpdated())
2072 MEMap::iterator mi =
data_.begin();
2073 MEMap::iterator me =
data_.end();
2074 for ( ; mi != me; ++mi)
2103 std::set<MonitorElement>::const_iterator
e =
data_.end();
2104 std::set<MonitorElement>::const_iterator
i =
data_.lower_bound(proto);
2107 if (i->data_.streamId != 0 ||
2108 i->data_.moduleId != 0)
2112 if (i->data_.run != run)
2119 std::cout <<
"DQMStore::deleteUnusedLumiHistograms: deleted monitor element '"
2120 << *i->data_.dirname <<
"/" << i->data_.objname <<
"'"
2121 <<
"flags " << i->data_.flags <<
"\n";
2139 if (TProfile *
h = dynamic_cast<TProfile *>(obj))
2143 me =
bookProfile(dir,
h->GetName(), (TProfile *)
h->Clone());
2150 else if (TProfile2D *
h = dynamic_cast<TProfile2D *>(obj))
2161 else if (TH1F *
h = dynamic_cast<TH1F *>(obj))
2165 me =
book1D(dir,
h->GetName(), (TH1F *)
h->Clone());
2172 else if (TH1S *
h = dynamic_cast<TH1S *>(obj))
2176 me =
book1S(dir,
h->GetName(), (TH1S *)
h->Clone());
2183 else if (TH1D *
h = dynamic_cast<TH1D *>(obj))
2187 me =
book1DD(dir,
h->GetName(), (TH1D *)
h->Clone());
2194 else if (TH2F *
h = dynamic_cast<TH2F *>(obj))
2198 me =
book2D(dir,
h->GetName(), (TH2F *)
h->Clone());
2205 else if (TH2S *
h = dynamic_cast<TH2S *>(obj))
2209 me =
book2S(dir,
h->GetName(), (TH2S *)
h->Clone());
2216 else if (TH2D *
h = dynamic_cast<TH2D *>(obj))
2220 me =
book2DD(dir,
h->GetName(), (TH2D *)
h->Clone());
2227 else if (TH3F *
h = dynamic_cast<TH3F *>(obj))
2231 me =
book3D(dir,
h->GetName(), (TH3F *)
h->Clone());
2238 else if (dynamic_cast<TObjString *>(obj))
2241 if (!
s_rxmeval.match(obj->GetName(), 0, 0, &
m))
2243 if (strstr(obj->GetName(),
"CMSSW"))
2246 std::cout <<
"Input file version: " << obj->GetName() << std::endl;
2249 else if (strstr(obj->GetName(),
"DQMPATCH"))
2252 std::cout <<
"DQM patch version: " << obj->GetName() << std::endl;
2257 std::cout <<
"*** DQMStore: WARNING: cannot extract object '"
2258 << obj->GetName() <<
"' of type '"
2259 << obj->IsA()->GetName() <<
"'\n";
2271 if (! me || overwrite)
2273 if (! me) me =
bookInt(dir, label);
2274 me->
Fill(atoll(value.c_str()));
2277 else if (kind ==
"f")
2280 if (! me || overwrite)
2283 me->
Fill(atof(value.c_str()));
2286 else if (kind ==
"s")
2294 else if (kind ==
"e")
2299 std::cout <<
"*** DQMStore: WARNING: no monitor element '"
2300 << label <<
"' in directory '"
2301 << dir <<
"' to be marked as efficiency plot.\n";
2306 else if (kind ==
"t")
2311 std::cout <<
"*** DQMStore: WARNING: no monitor element '"
2312 << label <<
"' in directory '"
2313 << dir <<
"' for a tag\n";
2318 unsigned long val = strtoul(value.c_str(), &endp, 10);
2319 if ((val == 0 && errno) || *endp || val > ~uint32_t(0))
2321 std::cout <<
"*** DQMStore: WARNING: cannot restore tag '"
2322 << value <<
"' for monitor element '"
2323 << label <<
"' in directory '"
2324 << dir <<
"' - invalid value\n";
2329 else if (kind ==
"qr")
2334 size_t dot = label.find(
'.');
2335 if (dot == std::string::npos)
2337 std::cout <<
"*** DQMStore: WARNING: quality report label in '" << label
2338 <<
"' is missing a '.' and cannot be extracted\n";
2343 std::string qrname (label, dot+1, std::string::npos);
2349 qv.
code = atoi(m.matchString(value, 1).c_str());
2350 qv.
qtresult = strtod(m.matchString(value, 2).c_str(), 0);
2351 qv.
message = m.matchString(value, 4);
2355 else if (
s_rxmeqr2.match(value, 0, 0, &m))
2357 qv.
code = atoi(m.matchString(value, 1).c_str());
2359 qv.
message = m.matchString(value, 2);
2365 std::cout <<
"*** DQMStore: WARNING: quality test value '"
2366 << value <<
"' is incorrectly formatted\n";
2373 std::cout <<
"*** DQMStore: WARNING: no monitor element '"
2374 << mename <<
"' in directory '"
2375 << dir <<
"' for quality test '"
2385 std::cout <<
"*** DQMStore: WARNING: cannot extract object '"
2386 << obj->GetName() <<
"' of type '"
2387 << obj->IsA()->GetName() <<
"'\n";
2391 else if (TNamed *
n = dynamic_cast<TNamed *>(obj))
2395 s.reserve(6 + strlen(
n->GetTitle()) + 2*strlen(
n->GetName()));
2396 s +=
'<'; s +=
n->GetName(); s +=
'>';
2398 s +=
'<'; s +=
'/'; s +=
n->GetName(); s +=
'>';
2399 TObjString os(s.c_str());
2404 std::cout <<
"*** DQMStore: WARNING: cannot extract object '"
2405 << obj->GetName() <<
"' of type '" << obj->IsA()->GetName()
2406 <<
"' and with title '" << obj->GetTitle() <<
"'\n";
2436 size_t end = path.find(
'/', start);
2437 if (end == std::string::npos)
2445 TObject *
o = gDirectory->Get(part.c_str());
2446 if (o && ! dynamic_cast<TDirectory *>(o))
2447 raiseDQMError(
"DQMStore",
"Attempt to create directory '%s' in a file"
2448 " fails because the part '%s' already exists and is not"
2449 " directory", path.c_str(), part.c_str());
2451 gDirectory->mkdir(part.c_str());
2453 if (! gDirectory->cd(part.c_str()))
2454 raiseDQMError(
"DQMStore",
"Attempt to create directory '%s' in a file"
2455 " fails because could not cd into subdirectory '%s'",
2456 path.c_str(), part.c_str());
2459 if (end+1 >= path.size())
2464 end = path.find(
'/', start);
2465 if (end == std::string::npos)
2474 const uint32_t
run ,
2475 const uint32_t
lumi ,
2476 const bool resetMEsAfterWriting )
2478 using google::protobuf::io::FileOutputStream;
2479 using google::protobuf::io::GzipOutputStream;
2480 using google::protobuf::io::StringOutputStream;
2484 std::set<std::string>::iterator di, de;
2485 MEMap::iterator mi, me =
data_.end();
2490 std::cout <<
"\n DQMStore: Opening PBFile '"
2491 << filename <<
"'"<< std::endl;
2494 for (di =
dirs_.begin(), de =
dirs_.end(); di != de; ++di)
2507 mi =
data_.lower_bound(proto);
2508 for ( ; mi != me &&
isSubdirectory(*di, *mi->data_.dirname); ++mi)
2512 <<
" Lumi: " << (*mi).lumi()
2513 <<
" LumiFlag: " << (*mi).getLumiFlag()
2514 <<
" streamId: " << (*mi).streamId()
2515 <<
" moduleId: " << (*mi).moduleId()
2516 <<
" fullpathname: " << (*mi).getFullname() << std::endl;
2523 if (*di != *mi->data_.dirname)
2532 if (run != 0 && (mi->data_.streamId !=0 || mi->data_.moduleId !=0))
2536 std::cout <<
"DQMStore::savePB: saving monitor element '"
2537 << *mi->data_.dirname <<
"/" << mi->data_.objname <<
"'"
2538 <<
"flags " << mi->data_.flags <<
"\n";
2545 TObject *toWrite =
nullptr;
2549 toWrite =
new TObjString(mi->tagString().c_str());
2550 deleteObject =
true;
2552 toWrite = mi->object_;
2555 TBufferFile buffer(TBufferFile::kWrite);
2556 buffer.WriteObject(toWrite);
2566 if (resetMEsAfterWriting)
2571 int filedescriptor =
::open(filename.c_str(),
2572 O_WRONLY | O_CREAT | O_TRUNC,
2576 FileOutputStream file_stream(filedescriptor);
2578 options.format = GzipOutputStream::GZIP;
2579 options.compression_level = 6;
2580 GzipOutputStream gzip_stream(&file_stream,
2582 dqmstore_message.SerializeToZeroCopyStream(&gzip_stream);
2585 gzip_stream.Close();
2586 file_stream.Close();
2587 ::close(filedescriptor);
2591 std::cout <<
"DQMStore::savePB: successfully wrote " << nme
2592 <<
" objects from path '" << path
2593 <<
"' into DQM file '" << filename <<
"'\n";
2606 const uint32_t
run ,
2607 const uint32_t
lumi ,
2611 const bool resetMEsAfterWriting )
2615 std::set<std::string>::iterator di, de;
2616 MEMap::iterator mi, me =
data_.end();
2617 DQMNet::QReports::const_iterator qi, qe;
2625 class TFileNoSync :
public TFile
2628 TFileNoSync(
const char *
file,
const char *opt) : TFile(file, opt) {}
2629 virtual Int_t SysSync(Int_t)
override {
return 0; }
2634 std::cout <<
"\n DQMStore: Opening TFile '" << filename
2635 <<
"' with option '" << fileupdate <<
"'\n";
2637 TFileNoSync
f(filename.c_str(), fileupdate.c_str());
2639 raiseDQMError(
"DQMStore",
"Failed to create/update file '%s'", filename.c_str());
2643 std::auto_ptr<lat::Regexp> rxpat;
2644 if (! pattern.empty())
2645 rxpat.reset(
new lat::Regexp(pattern.c_str()));
2658 for (di =
dirs_.begin(), de =
dirs_.end(); di != de; ++di)
2672 mi =
data_.lower_bound(proto);
2673 for ( ; mi != me &&
isSubdirectory(*di, *mi->data_.dirname); ++mi)
2676 std::cout <<
"DQMStore::save: Run: " << (*mi).run()
2677 <<
" Lumi: " << (*mi).lumi()
2678 <<
" LumiFlag: " << (*mi).getLumiFlag()
2679 <<
" streamId: " << (*mi).streamId()
2680 <<
" moduleId: " << (*mi).moduleId()
2681 <<
" fullpathname: " << (*mi).getFullname() << std::endl;
2688 if (*di != *mi->data_.dirname) {
2690 std::cout <<
"DQMStore::save: isn't a direct child. Skipping" << std::endl;
2700 if (run != 0 && (mi->data_.streamId !=0 || mi->data_.moduleId !=0)) {
2726 for (
size_t i = 0,
e = master->data_.qreports.size();
i !=
e; ++
i)
2727 status =
std::max(status, master->data_.qreports[
i].code);
2729 if (! master || status < minStatus)
2732 std::cout <<
"DQMStore::save: skipping monitor element '"
2733 << mi->data_.objname <<
"' while saving, status is "
2734 << status <<
", required minimum status is "
2735 << minStatus << std::endl;
2742 std::cout <<
"DQMStore::save: saving monitor element '"
2743 << mi->data_.objname <<
"'\n";
2747 gDirectory->cd(
"/");
2750 else if (rxpat.get())
2761 TObjString(mi->tagString().c_str()).Write();
2765 mi->object_->Write();
2772 qi = mi->data_.qreports.begin();
2773 qe = mi->data_.qreports.end();
2774 for ( ; qi != qe; ++qi)
2775 TObjString(mi->qualityTagString(*qi).c_str()).Write();
2780 TObjString(mi->effLabelString().c_str()).Write();
2784 TObjString(mi->tagLabelString().c_str()).Write();
2787 if (resetMEsAfterWriting)
2796 std::cout <<
"DQMStore::save: successfully wrote " << nme
2797 <<
" objects from path '" << path
2798 <<
"' into DQM file '" << filename <<
"'\n";
2811 unsigned int ntot = 0;
2812 unsigned int count = 0;
2814 if (! file->cd(curdir.c_str()))
2815 raiseDQMError(
"DQMStore",
"Failed to process directory '%s' while"
2816 " reading file '%s'", curdir.c_str(), file->GetName());
2839 size_t slash = dirpart.find(
'/');
2840 size_t pos = dirpart.find(
"/Run summary");
2841 if (slash != std::string::npos && pos !=std::string::npos)
2843 dirpart.erase(pos,12);
2845 pos = dirpart.find(
"Run ");
2846 size_t length = dirpart.find(
'/',pos+1)-pos+1;
2847 if (pos !=std::string::npos)
2848 dirpart.erase(pos,length);
2857 size_t slash = dirpart.find(
'/');
2859 if (slash == std::string::npos
2864 slash = dirpart.find(
'/');
2866 if (slash != std::string::npos
2867 && slash + 10 == dirpart.size()
2868 && dirpart.compare( slash+1 , 9 ,
"EventInfo") == 0) {
2870 std::cout <<
"DQMStore::readDirectory: skipping '" << dirpart <<
"'\n";
2875 if (dirpart.empty())
2878 dirpart = prepend +
'/' + dirpart;
2880 else if (! prepend.empty())
2882 if (dirpart.empty())
2885 dirpart = prepend +
'/' + dirpart;
2893 TIter
next (gDirectory->GetListOfKeys());
2894 std::list<TObject *> delayed;
2895 while ((key = (TKey *)
next()))
2897 std::auto_ptr<TObject>
obj(key->ReadObj());
2898 if (dynamic_cast<TDirectory *>(
obj.get()))
2901 subdir.reserve(curdir.size() + strlen(
obj->GetName()) + 2);
2903 if (! curdir.empty())
2905 subdir +=
obj->GetName();
2907 ntot +=
readDirectory(file, overwrite, onlypath, prepend, subdir, stripdirs);
2911 else if (dynamic_cast<TObjString *>(
obj.get()))
2913 delayed.push_back(
obj.release());
2918 std::cout <<
"DQMStore: reading object '" <<
obj->GetName()
2919 <<
"' of type '" <<
obj->IsA()->GetName()
2920 <<
"' from '" << file->GetName()
2921 <<
"' into '" << dirpart <<
"'\n";
2929 while (! delayed.empty())
2932 std::cout <<
"DQMStore: reading object '" << delayed.front()->GetName()
2933 <<
"' of type '" << delayed.front()->IsA()->GetName()
2934 <<
"' from '" << file->GetName()
2935 <<
"' into '" << dirpart <<
"'\n";
2941 delete delayed.front();
2942 delayed.pop_front();
2946 std::cout <<
"DQMStore: read " << count <<
'/' << ntot
2947 <<
" objects from directory '" << dirpart <<
"'\n";
2949 return ntot +
count;
2964 bool fileMustExist )
2966 return readFile(filename,overwrite,onlypath,prepend,stripdirs,fileMustExist);
2976 bool fileMustExist )
2978 bool overwrite =
true;
2982 std::cout <<
"DQMStore::load: reading from file '" << filename <<
"'\n";
2984 std::cout <<
"DQMStore::load: in collate mode " <<
"\n";
2986 std::cout <<
"DQMStore::load: in overwrite mode " <<
"\n";
2990 return readFile(filename, overwrite,
"",
"", stripdirs, fileMustExist);
2992 return readFilePB(filename, overwrite,
"",
"", stripdirs, fileMustExist);
3006 bool fileMustExist )
3010 std::cout <<
"DQMStore::readFile: reading from file '" << filename <<
"'\n";
3012 std::auto_ptr<TFile>
f;
3016 f.reset(TFile::Open(filename.c_str()));
3017 if (! f.get() || f->IsZombie())
3018 raiseDQMError(
"DQMStore",
"Failed to open file '%s'", filename.c_str());
3027 std::cout <<
"DQMStore::readFile: file '" << filename <<
"' does not exist, continuing\n";
3032 unsigned n =
readDirectory(f.get(), overwrite, onlypath, prepend,
"", stripdirs);
3035 MEMap::iterator mi =
data_.begin();
3036 MEMap::iterator me =
data_.end();
3037 for ( ; mi != me; ++mi)
3038 const_cast<MonitorElement &>(*mi).updateQReportStats();
3042 std::cout <<
"DQMStore::open: successfully read " << n
3043 <<
" objects from file '" << filename <<
"'";
3044 if (! onlypath.empty())
3045 std::cout <<
" from directory '" << onlypath <<
"'";
3046 if (! prepend.empty())
3047 std::cout <<
" into directory '" << prepend <<
"'";
3057 if (buf.Length() == buf.BufferSize())
3060 void *ptr = buf.ReadObjectAny(0);
3061 return reinterpret_cast<TObject *
>(ptr);
3070 size_t dirpos = (slash == std::string::npos ? 0 :
slash);
3071 size_t namepos = (slash == std::string::npos ? 0 : slash+1);
3073 objname.assign(h.
full_pathname(), namepos, std::string::npos);
3074 TBufferFile buf(TBufferFile::kRead, h.
size(),
3090 bool fileMustExist )
3092 using google::protobuf::io::FileInputStream;
3093 using google::protobuf::io::FileOutputStream;
3094 using google::protobuf::io::GzipInputStream;
3095 using google::protobuf::io::GzipOutputStream;
3096 using google::protobuf::io::CodedInputStream;
3097 using google::protobuf::io::ArrayInputStream;
3100 std::cout <<
"DQMStore::readFile: reading from file '" << filename <<
"'\n";
3103 if ((filedescriptor = ::
open(filename.c_str(), O_RDONLY)) == -1) {
3105 raiseDQMError(
"DQMStore",
"Failed to open file '%s'", filename.c_str());
3108 std::cout <<
"DQMStore::readFile: file '" << filename <<
"' does not exist, continuing\n";
3113 FileInputStream
fin(filedescriptor);
3114 GzipInputStream
input(&fin);
3115 CodedInputStream input_coded(&input);
3116 input_coded.SetTotalBytesLimit(1024*1024*1024, -1);
3117 if (!dqmstore_message.ParseFromCodedStream(&input_coded)) {
3118 raiseDQMError(
"DQMStore",
"Fatal parsing file '%s'", filename.c_str());
3121 ::close(filedescriptor);
3145 extract(static_cast<TObject *>(obj), path, overwrite, collate);
3147 if (me ==
nullptr) {
3173 MEMap::iterator
e =
data_.end();
3174 MEMap::iterator
i =
data_.lower_bound(proto);
3178 std::set<std::string>::iterator de =
dirs_.end();
3179 std::set<std::string>::iterator di =
dirs_.lower_bound(*cleaned);
3189 MEMap::iterator
e =
data_.end();
3190 MEMap::iterator
i =
data_.lower_bound(proto);
3192 if (dir == *i->data_.dirname)
3219 MEMap::iterator pos =
data_.find(proto);
3220 if (pos !=
data_.end())
3223 std::cout <<
"DQMStore: WARNING: attempt to remove non-existent"
3224 <<
" monitor element '" << name <<
"' in '" << dir <<
"'\n";
3235 QCMap::const_iterator
i =
qtests_.find(qtname);
3236 QCMap::const_iterator
e =
qtests_.end();
3237 return (i == e ? 0 : i->second);
3247 raiseDQMError(
"DQMStore",
"Attempt to create duplicate quality test '%s'",
3250 QAMap::iterator
i =
qalgos_.find(algoname);
3252 raiseDQMError(
"DQMStore",
"Cannot create a quality test using unknown"
3253 " algorithm '%s'", algoname.c_str());
3273 if (cleaned->find_first_not_of(
s_safe) != std::string::npos)
3275 " uses unacceptable characters", cleaned->c_str());
3287 raiseDQMError(
"DQMStore",
"Cannot apply non-existent quality test '%s'",
3297 MEMap::iterator mi =
data_.begin();
3298 MEMap::iterator me =
data_.end();
3301 for ( ; mi != me; ++mi)
3304 mergePath(path, *mi->data_.dirname, mi->data_.objname);
3305 if (fm->match(path))
3322 std::cout <<
"DQMStore: running runQTests() with reset = "
3323 << (
reset_ ?
"true" :
"false" ) << std::endl;
3326 MEMap::iterator mi =
data_.begin();
3327 MEMap::iterator me =
data_.end();
3328 for ( ; mi != me; ++mi)
3346 MEMap::const_iterator mi =
data_.begin();
3347 MEMap::const_iterator me =
data_.end();
3348 for ( ; mi != me; ++mi)
3350 if (! cleaned->empty() && !
isSubdirectory(*cleaned, *mi->data_.dirname))
3355 else if (mi->hasWarning())
3358 && mi->hasOtherReport())
3402 std::cout <<
" ------------------------------------------------------------\n"
3403 <<
" Directory structure: \n"
3404 <<
" ------------------------------------------------------------\n";
3406 std::copy(contents.begin(), contents.end(),
3407 std::ostream_iterator<std::string>(
std::cout,
"\n"));
3409 std::cout <<
" ------------------------------------------------------------\n";
3446 MonitorElement * event_me =
get(
"Info/EventInfo/processedEvents");
3449 factor = factor/(events*1.0);
3451 MEMap::iterator mi =
data_.begin();
3452 MEMap::iterator me =
data_.end();
3453 for ( ; mi != me; ++mi)
3505 std::cout <<
" The DQM object '" << me.
getFullname() <<
"' is not scalable object " << std::endl;
QCriterion * getQCriterion(const std::string &qtname) const
bool compare_strings_reverse(std::string const &pattern, std::string const &input) const
std::pair< fastmatch *, QCriterion * > QTestSpec
TH2S * getTH2S(void) const
TH1S * getTH1S(void) const
T getUntrackedParameter(std::string const &, T const &) const
DQMStore(const edm::ParameterSet &pset, edm::ActivityRegistry &)
static const lat::Regexp s_rxmeqr2("^st\\.(\\d+)\\.(.*)$")
MonitorElement * book2S(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Book 2S histogram.
bool containsAnyMonitorable(const std::string &path) const
inline::google::protobuf::uint32 size() const
bool isCollateME(MonitorElement *me) const
void resetUpdate(void)
reset "was updated" flag
tuple start
Check for commandline option errors.
bool cdInto(const std::string &path) const
const ::std::string & full_pathname() const
int getStatus(const std::string &path="") const
MonitorElement * initialise(Kind kind)
static void mergePath(std::string &path, const std::string &dir, const std::string &name)
std::vector< std::string > getSubdirs(void) const
TProfile2D * getTProfile2D(void) const
MonitorElement * book1D(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1D histogram.
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
void rmdir(const std::string &fullpath)
static void collate3D(MonitorElement *me, TH3F *h, unsigned verbose)
bool match(std::string const &s) const
bool readFile(const std::string &filename, bool overwrite=false, const std::string &path="", const std::string &prepend="", OpenRunDirs stripdirs=StripRunDirs, bool fileMustExist=true)
MonitorElement * findObject(const std::string &dir, const std::string &name, const uint32_t run=0, const uint32_t lumi=0, const uint32_t streamId=0, const uint32_t moduleId=0) const
static void collateProfile(MonitorElement *me, TProfile *h, unsigned verbose)
MonitorElement * book3D(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, int nchZ, double lowZ, double highZ)
Book 3D histogram.
void setLumi(uint32_t ls)
void cd(void)
go to top directory (ie. root)
MonitorElement * get(const std::string &path)
MonitorElement * book2DD(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Book 2D double histogram.
static const std::string s_safe
static void splitPath(std::string &dir, std::string &name, const std::string &path)
const std::string & pwd(void)
void disableSoftReset(void)
reverts action of softReset
static void collate2DD(MonitorElement *me, TH2D *h, unsigned verbose)
std::vector< MonitorElement * > getMatchingContents(const std::string &pattern, lat::Regexp::Syntax syntaxType=lat::Regexp::Wildcard) const
TH3F * getTH3F(void) const
static const uint32_t DQM_PROP_TAGGED
TH1D * getTH1D(void) const
MatchingHeuristicEnum matching_
void runQTests(void)
run all quality tests
static const uint32_t DQM_PROP_EFFICIENCY_PLOT
TH2D * getTH2D(void) const
const std::string * dirname
MonitorElement * book1DD(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1S histogram.
void initializeFrom(const edm::ParameterSet &)
void set_flags(::google::protobuf::uint32 value)
const ::std::string & streamed_histo() const
void initQCriterion(std::map< std::string, QCriterion *(*)(const std::string &)> &m)
static const std::string s_collateDirName
MonitorElement * book(const std::string &dir, const std::string &name, const char *context)
static const std::string s_monitorDirName
name of global monitoring folder (containing all sources subdirectories)
MonitorElement * bookFloat(const char *name)
Book float.
static std::string const input
static const lat::Regexp s_rxtrace("(.*)\\((.*)\\+0x.*\\).*")
static void cleanTrailingSlashes(const std::string &path, std::string &clean, const std::string *&cleaned)
Preallocate preallocateSignal_
signal is emitted before beginJob
void tag(MonitorElement *me, unsigned int myTag)
void disableSoftReset(MonitorElement *me)
unsigned int maxNumberOfStreams() const
static const lat::Regexp s_rxmeval("^<(.*)>(i|f|s|e|t|qr)=(.*)</\\1>$")
static bool isSubdirectory(const std::string &ofdir, const std::string &path)
std::vector< MonitorElement * > getAllContents(const std::string &path, uint32_t runNumber=0, uint32_t lumi=0) const
fastmatch(std::string const &_fastString)
static const uint32_t DQM_PROP_HAS_REFERENCE
void removeContents(void)
erase all monitoring elements in current directory (not including subfolders);
tuple path
else: Piece not in the list, fine.
void deleteUnusedLumiHistograms(uint32_t run, uint32_t lumi)
void get_info(const dqmstorepb::ROOTFilePB_Histo &, std::string &dirname, std::string &objname, TObject **obj)
void watchPostSourceRun(PostSourceRun::slot_type const &iSlot)
MonitorElement * bookString(const char *name, const char *value)
Book string.
bool isCollate(void) const
void removeElement(const std::string &name)
void addProfiles(TProfile *h1, TProfile *h2, TProfile *sum, float c1, float c2)
static void collateProfile2D(MonitorElement *me, TProfile2D *h, unsigned verbose)
double getFloatValue(void) const
void tag(MonitorElement *, unsigned int)
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
MonitorElement * bookProfile(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, const char *option="s")
QCriterion * makeQCriterion(const std::string &qtname)
void setVerbose(unsigned level)
void softReset(MonitorElement *me)
Kind kind(void) const
Get the type of the monitor element.
TObject * extractNextObject(TBufferFile &) const
MonitorElement * get(const std::string &path) const
get ME from full pathname (e.g. "my/long/dir/my_histo")
const std::string getFullname(void) const
get full name of ME including Pathname
std::vector< MonitorElement * > getContents(const std::string &path) const
std::string readSelectedDirectory_
std::vector< std::string > getMEs(void)
void mergeAndResetMEsRunSummaryCache(uint32_t run, uint32_t streamId, uint32_t moduleId)
bool dirExists(const std::string &path) const
true if directory exists
void savePB(const std::string &filename, const std::string &path="", const uint32_t run=0, const uint32_t lumi=0, const bool resetMEsAfterWriting=false)
void getAllTags(std::vector< std::string > &into) const
bool dirExists(const std::string &path)
bool load(const std::string &filename, OpenRunDirs stripdirs=StripRunDirs, bool fileMustExist=true)
static void collate1DD(MonitorElement *me, TH1D *h, unsigned verbose)
void tagAllContents(const std::string &path, unsigned int myTag)
void setCurrentFolder(const std::string &fullpath)
MonitorElement * initialise(MonitorElement *me, const std::string &path)
void watchPostSourceLumi(PostSourceLumi::slot_type const &iSlot)
bool containsAnyMonitorable(const std::string &path)
void tagContents(const std::string &, unsigned int)
const ::dqmstorepb::ROOTFilePB_Histo & histo(int index) const
void set_size(::google::protobuf::uint32 value)
int64_t getIntValue(void) const
static const std::string s_referenceDirName
void print_trace(const std::string &dir, const std::string &name)
int useQTestByMatch(const std::string &pattern, const std::string &qtname)
attach quality test <qc> to monitor elements matching <pattern>.
std::vector< MonitorElement * > getAllContents(const std::string &path, uint32_t runNumber=0, uint32_t lumi=0)
TH1F * getTH1F(void) const
static void collate1D(MonitorElement *me, TH1F *h, unsigned verbose)
static const lat::Regexp s_rxpbfile(".*\\.pb$")
std::vector< std::string > getMEs(void) const
get list of (non-dir) MEs of current directory
std::vector< std::string > getSubdirs(void)
void setCurrentFolder(const std::string &fullpath)
bool resetMe(void) const
true if ME should be reset at end of monitoring cycle
void set_full_pathname(const ::std::string &value)
unsigned int readDirectory(TFile *file, bool overwrite, const std::string &path, const std::string &prepend, const std::string &curdir, OpenRunDirs stripdirs)
void setVerbose(int verbose)
probability limits for warnings, errors
bool extract(TObject *obj, const std::string &dir, bool overwrite, bool collateHistograms)
bool forceResetOnBeginLumi_
T dot(const Basic3DVector &v) const
Scalar product, or "dot" product, with a vector of same type.
std::vector< boost::shared_ptr< fireworks::OptionNode > > Options
void tagContents(const std::string &path, unsigned int myTag)
tag all children of folder (does NOT include subfolders)
inline::dqmstorepb::ROOTFilePB_Histo * add_histo()
void save(const std::string &filename, const std::string &path="", const std::string &pattern="", const std::string &rewrite="", const uint32_t run=0, const uint32_t lumi=0, SaveReferenceTag ref=SaveWithReference, int minStatus=dqm::qstatus::STATUS_OK, const std::string &fileupdate="RECREATE", const bool resetMEsAfterWriting=false)
bool readFilePB(const std::string &filename, bool overwrite=false, const std::string &path="", const std::string &prepend="", OpenRunDirs stripdirs=StripRunDirs, bool fileMustExist=true)
TProfile * getTProfile(void) const
void useQTest(const std::string &dir, const std::string &qtname)
void goUp(void)
equivalent to "cd .."
bool open(const std::string &filename, bool overwrite=false, const std::string &path="", const std::string &prepend="", OpenRunDirs stripdirs=KeepRunDirs, bool fileMustExist=true)
inline::google::protobuf::uint32 flags() const
static const int STATUS_OK
void setAccumulate(MonitorElement *me, bool flag)
void setEfficiencyFlag(void)
static void collate1S(MonitorElement *me, TH1S *h, unsigned verbose)
void Reset(std::vector< TH2F > &depth)
QCriterion * createQTest(const std::string &algoname, const std::string &qtname)
static bool checkBinningMatches(MonitorElement *me, TH1 *h, unsigned verbose)
volatile std::atomic< bool > shutdown_flag false
void showDirStructure(void) const
bool deleteObject(T *fObject, const std::string &fInput, const std::string &fInputTag, HcalDbTool::IOVRun fInputRun, bool fVerbose)
TH2F * getTH2F(void) const
if(conf.exists("allCellsPositionCalc"))
static void collate2D(MonitorElement *me, TH2F *h, unsigned verbose)
MonitorElement * bookInt(const char *name)
Book int.
MonitorElement * book2D(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Book 2D histogram.
for(const auto &isodef:isoDefs)
void mergeAndResetMEsLuminositySummaryCache(uint32_t run, uint32_t lumi, uint32_t streamId, uint32_t moduleId)
std::set< std::string > dirs_
void Reset(void)
reset ME (ie. contents, errors, etc)
static const uint32_t DQM_PROP_LUMI
static std::string const source
void addQReport(const DQMNet::QValue &desc, QCriterion *qc)
Add quality report, from DQMStore.
MonitorElement * book1S(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1S histogram.
tuple size
Write out results.
static const lat::Regexp s_rxmeqr1("^st:(\\d+):([-+e.\\d]+):([^:]*):(.*)$")
void makeDirectory(const std::string &path)
bool compare_strings(std::string const &pattern, std::string const &input) const
void setCurrentFolder(const std::string &fullpath)
static void collate2S(MonitorElement *me, TH2S *h, unsigned verbose)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run
const std::string & pwd(void) const
void set_streamed_histo(const ::std::string &value)
static bool CheckBinLabels(const TAxis *a1, const TAxis *a2)
Check the consistency of the axis labels.
MonitorElement * bookProfile2D(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, int nchZ, double lowZ, double highZ, const char *option="s")
void raiseDQMError(const char *context, const char *fmt,...)