7 #include "classlib/utils/RegexpMatch.h" 8 #include "classlib/utils/Regexp.h" 9 #include "classlib/utils/StringOps.h" 10 #include <google/protobuf/io/coded_stream.h> 11 #include <google/protobuf/io/gzip_stream.h> 12 #include <google/protobuf/io/zero_copy_stream_impl.h> 18 #include "TBufferFile.h" 21 #include <boost/algorithm/string.hpp> 58 static const std::string s_safe =
"/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+=_()# ";
60 static const lat::Regexp
s_rxmeval (
"^<(.*)>(i|f|s|e|t|qr)=(.*)</\\1>$");
61 static const lat::Regexp
s_rxmeqr1 (
"^st:(\\d+):([-+e.\\d]+):([^:]*):(.*)$");
62 static const lat::Regexp
s_rxmeqr2 (
"^st\\.(\\d+)\\.(.*)$");
63 static const lat::Regexp
s_rxtrace (
"(.*)\\((.*)\\+0x.*\\).*");
64 static const lat::Regexp
s_rxself (
"^[^()]*DQMStore::.*");
65 static const lat::Regexp
s_rxpbfile (
".*\\.pb$");
74 || (path.size() >= ofdir.size()
75 && path.compare(0, ofdir.size(), ofdir) == 0
76 && (path.size() == ofdir.size()
77 || path[ofdir.size()] ==
'/')));
86 size_t len = path.size();
87 for ( ; len > 0 && path[len-1] ==
'/'; --len)
90 if (len != path.size())
92 clean = path.substr(0, len);
100 size_t slash = path.rfind(
'/');
101 if (slash != std::string::npos)
103 dir.append(path, 0, slash);
104 name.append(path, slash+1, std::string::npos);
113 path.reserve(dir.size() + name.size() + 2);
123 {
return new T(qtname); }
128 {
m[T::getAlgoName()] = &makeQCriterion<T>; }
133 fastString_ (_fastString), matching_ (UseFull)
141 catch (lat::Error &
e)
144 raiseDQMError(
"DQMStore",
"Invalid wildcard pattern '%s' in quality" 149 size_t starCount = 0;
154 if ((
size_t)pos == std::string::npos)
160 if ((
fastString_.find(
'"') != std::string::npos) ||
173 if (boost::algorithm::starts_with(
fastString_,
"*"))
191 if (boost::algorithm::starts_with(
fastString_,
"*") &&
211 if (input.size() < pattern.size())
217 std::string::const_reverse_iterator rit_pattern = pattern.rbegin();
218 std::string::const_reverse_iterator rit_input = input.rbegin();
220 for (; rit_pattern < pattern.rend(); rit_pattern++, rit_input++)
222 if (*rit_pattern != *rit_input)
232 if (input.size() < pattern.size())
238 std::string::const_iterator rit_pattern = pattern.begin();
239 std::string::const_iterator rit_input = input.begin();
241 for (; rit_pattern < pattern.end(); rit_pattern++, rit_input++)
243 if (*rit_pattern != *rit_input)
278 owner_->setCurrentFolder(fullpath);
286 return owner_->pwd();
290 owner_->tag(me, tag);
294 owner_->tagContents(path, myTag);
298 std::vector<MonitorElement*>
302 return owner_->getAllContents(path, runNumber, lumi);
306 return owner_->get(path);
311 if (ptr ==
nullptr) {
312 std::stringstream
msg;
313 msg <<
"DQM object not found";
318 throw std::out_of_range(msg.str());
324 return owner_->getSubdirs();
328 return owner_->getMEs();
332 return owner_->containsAnyMonitorable(path);
336 return owner_->dirExists(path);
348 owner_->setCurrentFolder(fullpath);
364 std::cout <<
"DQMStore::mergeAndResetMEsRunSummaryCache - Merging objects from run: " 366 <<
", stream: " << streamId
367 <<
" module: " << moduleId << std::endl;
374 MonitorElement proto(&null_str, null_str, run, streamId, moduleId);
377 std::lock_guard<std::mutex> guard(book_mutex_);
379 std::set<MonitorElement>::const_iterator
e = data_.end();
380 std::set<MonitorElement>::const_iterator
i = data_.lower_bound(proto);
382 if (i->data_.run != run
383 || i->data_.streamId != streamId
384 || i->data_.moduleId != moduleId)
388 if (i->getLumiFlag() || LSbasedMode_) {
398 std::set<MonitorElement>::const_iterator me = data_.find(global_me);
399 if (me != data_.end()) {
401 std::cout <<
"Found global Object, using it --> " << me->getFullname() << std::endl;
406 if(me->getTH1()->CanExtendAllAxes() && i->getTH1()->CanExtendAllAxes()) {
408 list.Add(i->getTH1());
409 if( -1 == me->getTH1()->Merge(&list)) {
410 std::cout <<
"mergeAndResetMEsRunSummaryCache: Failed to merge DQM element "<<me->getFullname();
414 if (i->getTH1()->GetEntries())
415 me->getTH1()->Add(i->getTH1());
420 std::cout <<
"No global Object found. " << std::endl;
421 std::pair<std::set<MonitorElement>::const_iterator,
bool> gme;
426 gme = data_.insert(
std::move(actual_global_me));
439 std::cout <<
"DQMStore::mergeAndResetMEsLuminositySummaryCache - Merging objects from run: " 440 << run <<
" lumi: " << lumi
441 <<
", stream: " << streamId
442 <<
" module: " << moduleId << std::endl;
444 MonitorElement proto(&null_str, null_str, run, streamId, moduleId);
448 std::lock_guard<std::mutex> guard(book_mutex_);
450 std::set<MonitorElement>::const_iterator
e = data_.end();
451 std::set<MonitorElement>::const_iterator
i = data_.lower_bound(proto);
454 if (i->data_.run != run
455 || i->data_.streamId != streamId
456 || i->data_.moduleId != moduleId)
460 if (not (i->getLumiFlag() || LSbasedMode_)) {
468 std::set<MonitorElement>::const_iterator me = data_.find(global_me);
469 if (me != data_.end()) {
471 std::cout <<
"Found global Object, using it --> " << me->getFullname() << std::endl;
476 if(me->getTH1()->CanExtendAllAxes() && i->getTH1()->CanExtendAllAxes()) {
478 list.Add(i->getTH1());
479 if( -1 == me->getTH1()->Merge(&list)) {
480 std::cout <<
"mergeAndResetMEsLuminositySummaryCache: Failed to merge DQM element "<<me->getFullname();
484 if (i->getTH1()->GetEntries())
485 me->getTH1()->Add(i->getTH1());
490 std::cout <<
"No global Object found. " << std::endl;
491 std::pair<std::set<MonitorElement>::const_iterator,
bool> gme;
496 actual_global_me.
setLumi(lumi);
497 gme = data_.insert(
std::move(actual_global_me));
511 collateHistograms_ (
false),
512 enableMultiThread_(
false),
513 forceResetOnBeginLumi_(
false),
514 readSelectedDirectory_ (
""),
594 std::cout <<
"DQMStore: histogram collation is enabled\n";
598 std::cout <<
"DQMStore: MultiThread option is enabled\n";
602 std::cout <<
"DQMStore: LSbasedMode option is enabled\n";
607 std::cout <<
"DQMStore: using reference file '" << ref <<
"'\n";
611 initQCriterion<Comp2RefChi2>(
qalgos_);
612 initQCriterion<Comp2Ref2DChi2>(
qalgos_);
613 initQCriterion<Comp2RefKolmogorov>(
qalgos_);
614 initQCriterion<ContentsXRange>(
qalgos_);
615 initQCriterion<ContentsYRange>(
qalgos_);
616 initQCriterion<MeanWithinExpected>(
qalgos_);
617 initQCriterion<Comp2RefEqualH>(
qalgos_);
618 initQCriterion<DeadChannel>(
qalgos_);
619 initQCriterion<NoisyChannel>(
qalgos_);
620 initQCriterion<ContentsWithinExpected>(
qalgos_);
621 initQCriterion<CompareToMedian>(
qalgos_);
622 initQCriterion<CompareLastFilledBin>(
qalgos_);
623 initQCriterion<CheckVariance>(
qalgos_);
627 std::cout <<
"DQMStore: Scaling Flag set to " << scaleFlag_ << std::endl;
646 stream_ =
new std::ofstream(
"histogramBookingBT.log");
655 size = backtrace (array, 10);
656 strings = backtrace_symbols (array, size);
660 for (; level <
size; level++) {
661 if (!
s_rxtrace.match(strings[level], 0, 0, &m))
continue;
662 demangled = abi::__cxa_demangle(m.matchString(strings[level], 2).c_str(), 0, 0, &
r);
663 if (!demangled)
continue;
664 if (!
s_rxself.match(demangled, 0, 0))
break;
669 if (demangled !=
nullptr) {
672 << (r ? m.matchString(strings[level], 2) :
demangled) <<
" " 673 << m.matchString(strings[level], 1) <<
"\n";
676 *
stream_ <<
"Skipping "<< dir <<
"/" << name
677 <<
" with stack size " << size <<
"\n";
682 if (
verbose_ > 4 || demangled ==
nullptr)
687 for (i = 0; i <
size; i++)
688 if (
s_rxtrace.match(strings[i], 0, 0, &m))
690 char * demangled = abi::__cxa_demangle(m.matchString(strings[i], 2).c_str(), 0, 0, &
r);
691 *
stream_ <<
"\t\t" << i <<
"/" << size <<
" " 692 << (r ? m.matchString(strings[i], 2) :
demangled) <<
" " 693 << m.matchString(strings[i], 1) << std::endl;
730 raiseDQMError(
"DQMStore",
"Cannot 'cd' into non-existent directory '%s'",
755 if (pos == std::string::npos)
770 prev.reserve(path.size());
771 subdir.reserve(path.size());
772 name.reserve(path.size());
780 subdir.append(path, 0, slash);
782 name.append(subdir, prevname, std::string::npos);
784 raiseDQMError(
"DQMStore",
"Attempt to create subdirectory '%s'" 785 " which already exists as a monitor element",
788 if (!
dirs_.count(subdir))
789 dirs_.insert(subdir);
792 if (slash+1 >= path.size())
797 prevname = slash ? slash+1 :
slash;
799 if ((slash = path.find(
'/', ++slash)) == std::string::npos)
807 {
return dirs_.count(path) > 0; }
812 template <
class HISTO,
class COLLATE>
815 const char *context,
int kind,
816 HISTO *
h, COLLATE collate)
818 assert(name.find(
'/') == std::string::npos);
841 << context <<
": monitor element '" 842 << path <<
"' already exists, collating" << std::endl;
852 assert(
dirs_.count(dir));
860 for ( ; qi != qe; ++qi)
862 if ( qi->first->match(path) )
863 me->addQReport(qi->second);
881 me->reference_ = referenceME->
object_;
894 assert(name.find(
'/') == std::string::npos);
907 << context <<
": monitor element '" 908 << path <<
"' already exists, resetting" << std::endl;
916 assert(
dirs_.count(dir));
936 return book(dir, name,
"bookInt")
966 return book(dir, name,
"bookFloat")
995 return book(dir, name,
"bookString")
1036 int nchX,
double lowX,
double highX)
1038 return book1D(
pwd_, name,
new TH1F(name, title, nchX, lowX, highX));
1044 int nchX,
double lowX,
double highX)
1046 return book1D(
pwd_, name,
new TH1F(name.c_str(), title.c_str(), nchX, lowX, highX));
1052 int nchX,
double lowX,
double highX)
1054 return book1S(
pwd_, name,
new TH1S(name, title, nchX, lowX, highX));
1060 int nchX,
double lowX,
double highX)
1062 return book1S(
pwd_, name,
new TH1S(name.c_str(), title.c_str(), nchX, lowX, highX));
1068 int nchX,
double lowX,
double highX)
1070 return book1DD(
pwd_, name,
new TH1D(name, title, nchX, lowX, highX));
1076 int nchX,
double lowX,
double highX)
1078 return book1DD(
pwd_, name,
new TH1D(name.c_str(), title.c_str(), nchX, lowX, highX));
1084 int nchX,
const float *xbinsize)
1086 return book1D(
pwd_, name,
new TH1F(name, title, nchX, xbinsize));
1092 int nchX,
const float *xbinsize)
1094 return book1D(
pwd_, name,
new TH1F(name.c_str(), title.c_str(), nchX, xbinsize));
1101 return book1D(
pwd_, name, static_cast<TH1F *>(source->Clone(name)));
1108 return book1D(
pwd_, name, static_cast<TH1F *>(source->Clone(name.c_str())));
1115 return book1S(
pwd_, name, static_cast<TH1S *>(source->Clone(name)));
1122 return book1S(
pwd_, name, static_cast<TH1S *>(source->Clone(name.c_str())));
1129 return book1DD(
pwd_, name, static_cast<TH1D *>(source->Clone(name)));
1136 return book1DD(
pwd_, name, static_cast<TH1D *>(source->Clone(name.c_str())));
1164 int nchX,
double lowX,
double highX,
1165 int nchY,
double lowY,
double highY)
1167 return book2D(
pwd_, name,
new TH2F(name, title,
1169 nchY, lowY, highY));
1175 int nchX,
double lowX,
double highX,
1176 int nchY,
double lowY,
double highY)
1178 return book2D(
pwd_, name,
new TH2F(name.c_str(), title.c_str(),
1180 nchY, lowY, highY));
1186 int nchX,
double lowX,
double highX,
1187 int nchY,
double lowY,
double highY)
1189 return book2S(
pwd_, name,
new TH2S(name, title,
1191 nchY, lowY, highY));
1197 int nchX,
double lowX,
double highX,
1198 int nchY,
double lowY,
double highY)
1200 return book2S(
pwd_, name,
new TH2S(name.c_str(), title.c_str(),
1202 nchY, lowY, highY));
1208 int nchX,
double lowX,
double highX,
1209 int nchY,
double lowY,
double highY)
1213 nchY, lowY, highY));
1219 int nchX,
double lowX,
double highX,
1220 int nchY,
double lowY,
double highY)
1222 return book2DD(
pwd_, name,
new TH2D(name.c_str(), title.c_str(),
1224 nchY, lowY, highY));
1230 int nchX,
const float *xbinsize,
int nchY,
const float *ybinsize)
1232 return book2D(
pwd_, name,
new TH2F(name, title,
1233 nchX, xbinsize, nchY, ybinsize));
1239 int nchX,
const float *xbinsize,
int nchY,
const float *ybinsize)
1241 return book2D(
pwd_, name,
new TH2F(name.c_str(), title.c_str(),
1242 nchX, xbinsize, nchY, ybinsize));
1248 int nchX,
const float *xbinsize,
int nchY,
const float *ybinsize)
1250 return book2S(
pwd_, name,
new TH2S(name, title,
1251 nchX, xbinsize, nchY, ybinsize));
1257 int nchX,
const float *xbinsize,
int nchY,
const float *ybinsize)
1259 return book2S(
pwd_, name,
new TH2S(name.c_str(), title.c_str(),
1260 nchX, xbinsize, nchY, ybinsize));
1267 return book2D(
pwd_, name, static_cast<TH2F *>(source->Clone(name)));
1274 return book2D(
pwd_, name, static_cast<TH2F *>(source->Clone(name.c_str())));
1281 return book2S(
pwd_, name, static_cast<TH2S *>(source->Clone(name)));
1288 return book2S(
pwd_, name, static_cast<TH2S *>(source->Clone(name.c_str())));
1295 return book2DD(
pwd_, name, static_cast<TH2D *>(source->Clone(name)));
1302 return book2DD(
pwd_, name, static_cast<TH2D *>(source->Clone(name.c_str())));
1316 int nchX,
double lowX,
double highX,
1317 int nchY,
double lowY,
double highY,
1318 int nchZ,
double lowZ,
double highZ)
1320 return book3D(
pwd_, name,
new TH3F(name, title,
1323 nchZ, lowZ, highZ));
1329 int nchX,
double lowX,
double highX,
1330 int nchY,
double lowY,
double highY,
1331 int nchZ,
double lowZ,
double highZ)
1333 return book3D(
pwd_, name,
new TH3F(name.c_str(), title.c_str(),
1336 nchZ, lowZ, highZ));
1343 return book3D(
pwd_, name, static_cast<TH3F *>(source->Clone(name)));
1350 return book3D(
pwd_, name, static_cast<TH3F *>(source->Clone(name.c_str())));
1358 return book(dir, name,
"bookProfile",
1368 int nchX,
double lowX,
double highX,
1369 int ,
double lowY,
double highY,
1383 int nchX,
double lowX,
double highX,
1384 int ,
double lowY,
double highY,
1387 return bookProfile(
pwd_, name,
new TProfile(name.c_str(), title.c_str(),
1398 int nchX,
double lowX,
double highX,
1399 double lowY,
double highY,
1413 int nchX,
double lowX,
double highX,
1414 double lowY,
double highY,
1417 return bookProfile(
pwd_, name,
new TProfile(name.c_str(), title.c_str(),
1428 int nchX,
const double *xbinsize,
1429 int ,
double lowY,
double highY,
1443 int nchX,
const double *xbinsize,
1444 int ,
double lowY,
double highY,
1447 return bookProfile(
pwd_, name,
new TProfile(name.c_str(), title.c_str(),
1458 int nchX,
const double *xbinsize,
1459 double lowY,
double highY,
1473 int nchX,
const double *xbinsize,
1474 double lowY,
double highY,
1477 return bookProfile(
pwd_, name,
new TProfile(name.c_str(), title.c_str(),
1487 return bookProfile(
pwd_, name, static_cast<TProfile *>(source->Clone(name)));
1494 return bookProfile(
pwd_, name, static_cast<TProfile *>(source->Clone(name.c_str())));
1502 return book(dir, name,
"bookProfile2D",
1512 int nchX,
double lowX,
double highX,
1513 int nchY,
double lowY,
double highY,
1514 int ,
double lowZ,
double highZ,
1529 int nchX,
double lowX,
double highX,
1530 int nchY,
double lowY,
double highY,
1531 int ,
double lowZ,
double highZ,
1546 int nchX,
double lowX,
double highX,
1547 int nchY,
double lowY,
double highY,
1548 double lowZ,
double highZ,
1563 int nchX,
double lowX,
double highX,
1564 int nchY,
double lowY,
double highY,
1565 double lowZ,
double highZ,
1579 return bookProfile2D(
pwd_, name, static_cast<TProfile2D *>(source->Clone(name)));
1586 return bookProfile2D(
pwd_, name, static_cast<TProfile2D *>(source->Clone(name.c_str())));
1595 if (me->
getTH1()->GetNbinsX() != h->GetNbinsX()
1596 || me->
getTH1()->GetNbinsY() != h->GetNbinsY()
1597 || me->
getTH1()->GetNbinsZ() != h->GetNbinsZ()
1598 || me->
getTH1()->GetXaxis()->GetXmin() != h->GetXaxis()->GetXmin()
1599 || me->
getTH1()->GetYaxis()->GetXmin() != h->GetYaxis()->GetXmin()
1600 || me->
getTH1()->GetZaxis()->GetXmin() != h->GetZaxis()->GetXmin()
1601 || me->
getTH1()->GetXaxis()->GetXmax() != h->GetXaxis()->GetXmax()
1602 || me->
getTH1()->GetYaxis()->GetXmax() != h->GetYaxis()->GetXmax()
1603 || me->
getTH1()->GetZaxis()->GetXmax() != h->GetZaxis()->GetXmax()
1610 <<
"checkBinningMatches: different binning - cannot add object '" 1611 << h->GetName() <<
"' of type " 1612 << h->IsA()->GetName() <<
" to existing ME: '" 1696 raiseDQMError(
"DQMStore",
"Attempt to tag monitor element '%s'" 1699 raiseDQMError(
"DQMStore",
"Attempt to tag monitor element '%s'" 1700 " twice with multiple tags", me->
getFullname().c_str());
1717 raiseDQMError(
"DQMStore",
"Attempt to tag non-existent monitor element" 1718 " '%s' with tag %u", path.c_str(), myTag);
1727 MEMap::iterator
e =
data_.end();
1728 MEMap::iterator
i =
data_.lower_bound(proto);
1729 for ( ; i != e && path == *i->data_.dirname; ++
i)
1730 tag(const_cast<MonitorElement *>(&*i), myTag);
1744 MEMap::iterator
e =
data_.end();
1745 MEMap::iterator
i =
data_.lower_bound(proto);
1748 tag(const_cast<MonitorElement *>(&*i), myTag);
1757 std::vector<std::string>
1760 std::vector<std::string>
result;
1761 std::set<std::string>::const_iterator
e =
dirs_.end();
1762 std::set<std::string>::const_iterator
i =
dirs_.find(
pwd_);
1773 if (i->find(
'/',
pwd_.size()+1) == std::string::npos)
1774 result.push_back(*i);
1780 std::vector<std::string>
1784 std::vector<std::string>
result;
1785 MEMap::const_iterator
e =
data_.end();
1786 MEMap::const_iterator
i =
data_.lower_bound(proto);
1788 if (
pwd_ == *i->data_.dirname)
1789 result.push_back(i->getName());
1800 MEMap::const_iterator
e =
data_.end();
1801 MEMap::const_iterator
i =
data_.lower_bound(proto);
1813 MEMap::const_iterator mepos =
data_.find(proto);
1814 return (mepos ==
data_.end() ? 0
1819 std::vector<MonitorElement *>
1823 std::vector<MonitorElement *>
result;
1824 for (MEMap::const_iterator
i =
data_.begin(),
e =
data_.end();
i !=
e; ++
i)
1828 result.push_back(const_cast<MonitorElement *>(&me));
1835 std::vector<MonitorElement *>
1843 std::vector<MonitorElement *>
result;
1844 MEMap::const_iterator
e =
data_.end();
1845 MEMap::const_iterator
i =
data_.lower_bound(proto);
1847 if (*cleaned == *i->data_.dirname)
1848 result.push_back(const_cast<MonitorElement *>(&*i));
1854 std::vector<MonitorElement *>
1862 std::vector<MonitorElement *>
result;
1863 MEMap::const_iterator
e =
data_.end();
1864 MEMap::const_iterator
i =
data_.lower_bound(proto);
1866 if (*cleaned == *i->data_.dirname
1868 && i->data_.tag ==
tag)
1869 result.push_back(const_cast<MonitorElement *>(&*i));
1882 into.reserve(
dirs_.size());
1884 MEMap::const_iterator me =
data_.end();
1885 std::set<std::string>::const_iterator di =
dirs_.begin();
1886 std::set<std::string>::const_iterator de =
dirs_.end();
1887 for ( ; di != de; ++di)
1890 MEMap::const_iterator mi =
data_.lower_bound(proto);
1891 MEMap::const_iterator
m = mi;
1892 size_t sz = di->size() + 2;
1895 if (*di == *m->data_.dirname)
1897 sz += m->data_.objname.size() + 1;
1904 std::vector<std::string>::iterator istr
1913 for (sz = 0; mi !=
m; ++mi)
1915 if (*di != *mi->data_.dirname)
1921 *istr += mi->data_.objname;
1927 istr->reserve(di->size() + 2);
1939 const uint32_t
run ,
1940 const uint32_t
lumi ,
1941 const uint32_t streamId ,
1942 const uint32_t moduleId )
const 1944 if (dir.find_first_not_of(
s_safe) != std::string::npos)
1945 raiseDQMError(
"DQMStore",
"Monitor element path name '%s' uses" 1946 " unacceptable characters", dir.c_str());
1947 if (name.find_first_not_of(
s_safe) != std::string::npos)
1948 raiseDQMError(
"DQMStore",
"Monitor element path name '%s' uses" 1949 " unacceptable characters", name.c_str());
1959 MEMap::const_iterator mepos =
data_.find(proto);
1960 return (mepos ==
data_.end() ? 0
1970 into.reserve(
dirs_.size());
1972 MEMap::const_iterator me =
data_.end();
1973 std::set<std::string>::const_iterator di =
dirs_.begin();
1974 std::set<std::string>::const_iterator de =
dirs_.end();
1977 for ( ; di != de; ++di)
1980 MEMap::const_iterator mi =
data_.lower_bound(proto);
1981 MEMap::const_iterator
m = mi;
1982 size_t sz = di->size() + 2;
1988 sz += 1 + m->data_.objname.size() + 11;
1995 std::vector<std::string>::iterator istr
2002 for (sz = 0; mi !=
m; ++mi)
2006 sprintf(tagbuf,
"/%u", mi->data_.tag);
2009 *istr += m->data_.objname;
2019 std::vector<MonitorElement*>
2022 uint32_t
lumi )
const 2030 std::vector<MonitorElement *>
result;
2031 MEMap::const_iterator
e =
data_.end();
2032 MEMap::const_iterator
i =
data_.lower_bound(proto);
2034 if (runNumber != 0) {
2035 if (i->data_.run > runNumber
2036 || i->data_.streamId != 0
2037 || i->data_.moduleId != 0)
2041 if (i->data_.lumi > lumi
2042 || i->data_.streamId != 0
2043 || i->data_.moduleId != 0)
2046 if (runNumber != 0
or lumi !=0) {
2047 assert(i->data_.streamId == 0);
2048 assert(i->data_.moduleId == 0);
2050 result.push_back(const_cast<MonitorElement *>(&*i));
2058 if (i->data_.run != 0 || i->data_.streamId != 0 || i->data_.moduleId != 0)
break;
2059 result.push_back(const_cast<MonitorElement *>(&*i));
2068 std::vector<MonitorElement*>
2074 rx = lat::Regexp(pattern, 0, syntaxType);
2077 catch (lat::Error &
e)
2079 raiseDQMError(
"DQMStore",
"Invalid regular expression '%s': %s",
2080 pattern.c_str(), e.explain().c_str());
2084 std::vector<MonitorElement *>
result;
2085 MEMap::const_iterator
i =
data_.begin();
2086 MEMap::const_iterator e =
data_.end();
2087 for ( ; i !=
e; ++
i)
2090 mergePath(path, *i->data_.dirname, i->data_.objname);
2092 result.push_back(const_cast<MonitorElement *>(&*i));
2107 MEMap::iterator mi =
data_.begin();
2108 MEMap::iterator me =
data_.end();
2109 for ( ; mi != me; ++mi)
2112 if (mi->wasUpdated())
2131 MEMap::iterator mi =
data_.begin();
2132 MEMap::iterator me =
data_.end();
2133 for ( ; mi != me; ++mi)
2164 std::set<MonitorElement>::const_iterator
e =
data_.end();
2165 std::set<MonitorElement>::const_iterator
i =
data_.lower_bound(proto);
2168 if (i->data_.streamId != 0 ||
2169 i->data_.moduleId != 0)
2171 if (i->data_.lumi != lumi)
2173 if (i->data_.run != run)
2180 std::cout <<
"DQMStore::deleteUnusedLumiHistograms: deleted monitor element '" 2181 << *i->data_.dirname <<
"/" << i->data_.objname <<
"'" 2182 <<
"flags " << i->data_.flags <<
"\n";
2200 if (TProfile *
h = dynamic_cast<TProfile *>(obj))
2204 me =
bookProfile(dir,
h->GetName(), (TProfile *)
h->Clone());
2211 else if (TProfile2D *
h = dynamic_cast<TProfile2D *>(obj))
2222 else if (TH1F *
h = dynamic_cast<TH1F *>(obj))
2226 me =
book1D(dir,
h->GetName(), (TH1F *)
h->Clone());
2233 else if (TH1S *
h = dynamic_cast<TH1S *>(obj))
2237 me =
book1S(dir,
h->GetName(), (TH1S *)
h->Clone());
2244 else if (TH1D *
h = dynamic_cast<TH1D *>(obj))
2248 me =
book1DD(dir,
h->GetName(), (TH1D *)
h->Clone());
2255 else if (TH2F *
h = dynamic_cast<TH2F *>(obj))
2259 me =
book2D(dir,
h->GetName(), (TH2F *)
h->Clone());
2266 else if (TH2S *
h = dynamic_cast<TH2S *>(obj))
2270 me =
book2S(dir,
h->GetName(), (TH2S *)
h->Clone());
2277 else if (TH2D *
h = dynamic_cast<TH2D *>(obj))
2281 me =
book2DD(dir,
h->GetName(), (TH2D *)
h->Clone());
2288 else if (TH3F *
h = dynamic_cast<TH3F *>(obj))
2292 me =
book3D(dir,
h->GetName(), (TH3F *)
h->Clone());
2299 else if (dynamic_cast<TObjString *>(obj))
2302 if (!
s_rxmeval.match(obj->GetName(), 0, 0, &
m))
2304 if (strstr(obj->GetName(),
"CMSSW"))
2307 std::cout <<
"Input file version: " << obj->GetName() << std::endl;
2310 else if (strstr(obj->GetName(),
"DQMPATCH"))
2313 std::cout <<
"DQM patch version: " << obj->GetName() << std::endl;
2318 std::cout <<
"*** DQMStore: WARNING: cannot extract object '" 2319 << obj->GetName() <<
"' of type '" 2320 << obj->IsA()->GetName() <<
"'\n";
2332 if (! me || overwrite)
2334 if (! me) me =
bookInt(dir, label);
2335 me->
Fill(atoll(value.c_str()));
2338 else if (kind ==
"f")
2341 if (! me || overwrite)
2344 me->
Fill(atof(value.c_str()));
2347 else if (kind ==
"s")
2355 else if (kind ==
"e")
2360 std::cout <<
"*** DQMStore: WARNING: no monitor element '" 2361 << label <<
"' in directory '" 2362 << dir <<
"' to be marked as efficiency plot.\n";
2367 else if (kind ==
"t")
2372 std::cout <<
"*** DQMStore: WARNING: no monitor element '" 2373 << label <<
"' in directory '" 2374 << dir <<
"' for a tag\n";
2379 unsigned long val = strtoul(value.c_str(), &endp, 10);
2380 if ((val == 0 && errno) || *endp || val > ~uint32_t(0))
2382 std::cout <<
"*** DQMStore: WARNING: cannot restore tag '" 2383 << value <<
"' for monitor element '" 2384 << label <<
"' in directory '" 2385 << dir <<
"' - invalid value\n";
2390 else if (kind ==
"qr")
2395 size_t dot = label.find(
'.');
2396 if (dot == std::string::npos)
2398 std::cout <<
"*** DQMStore: WARNING: quality report label in '" << label
2399 <<
"' is missing a '.' and cannot be extracted\n";
2404 std::string qrname (label, dot+1, std::string::npos);
2410 qv.
code = atoi(m.matchString(value, 1).c_str());
2411 qv.
qtresult = strtod(m.matchString(value, 2).c_str(), 0);
2412 qv.
message = m.matchString(value, 4);
2416 else if (
s_rxmeqr2.match(value, 0, 0, &m))
2418 qv.
code = atoi(m.matchString(value, 1).c_str());
2420 qv.
message = m.matchString(value, 2);
2426 std::cout <<
"*** DQMStore: WARNING: quality test value '" 2427 << value <<
"' is incorrectly formatted\n";
2434 std::cout <<
"*** DQMStore: WARNING: no monitor element '" 2435 << mename <<
"' in directory '" 2436 << dir <<
"' for quality test '" 2446 std::cout <<
"*** DQMStore: WARNING: cannot extract object '" 2447 << obj->GetName() <<
"' of type '" 2448 << obj->IsA()->GetName() <<
"'\n";
2452 else if (TNamed *
n = dynamic_cast<TNamed *>(obj))
2456 s.reserve(6 + strlen(
n->GetTitle()) + 2*strlen(
n->GetName()));
2457 s +=
'<'; s +=
n->GetName(); s +=
'>';
2459 s +=
'<'; s +=
'/'; s +=
n->GetName(); s +=
'>';
2460 TObjString os(s.c_str());
2465 std::cout <<
"*** DQMStore: WARNING: cannot extract object '" 2466 << obj->GetName() <<
"' of type '" << obj->IsA()->GetName()
2467 <<
"' and with title '" << obj->GetTitle() <<
"'\n";
2498 assert(! path.empty());
2502 size_t end = path.find(
'/', start);
2503 if (end == std::string::npos)
2511 TObject *
o = gDirectory->Get(part.c_str());
2512 if (o && ! dynamic_cast<TDirectory *>(o))
2513 raiseDQMError(
"DQMStore",
"Attempt to create directory '%s' in a file" 2514 " fails because the part '%s' already exists and is not" 2515 " directory", path.c_str(), part.c_str());
2517 gDirectory->mkdir(part.c_str());
2519 if (! gDirectory->cd(part.c_str()))
2520 raiseDQMError(
"DQMStore",
"Attempt to create directory '%s' in a file" 2521 " fails because could not cd into subdirectory '%s'",
2522 path.c_str(), part.c_str());
2525 if (end+1 >= path.size())
2530 end = path.find(
'/', start);
2531 if (end == std::string::npos)
2540 const uint32_t
run ,
2541 const uint32_t
lumi ,
2542 const bool resetMEsAfterWriting )
2544 using google::protobuf::io::FileOutputStream;
2545 using google::protobuf::io::GzipOutputStream;
2546 using google::protobuf::io::StringOutputStream;
2550 std::set<std::string>::iterator di, de;
2551 MEMap::iterator mi, me =
data_.end();
2556 std::cout <<
"\n DQMStore: Opening PBFile '" 2557 << filename <<
"'"<< std::endl;
2560 for (di =
dirs_.begin(), de =
dirs_.end(); di != de; ++di)
2573 mi =
data_.lower_bound(proto);
2574 for ( ; mi != me &&
isSubdirectory(*di, *mi->data_.dirname); ++mi)
2578 <<
" Lumi: " << (*mi).lumi()
2579 <<
" LumiFlag: " << (*mi).getLumiFlag()
2580 <<
" streamId: " << (*mi).streamId()
2581 <<
" moduleId: " << (*mi).moduleId()
2582 <<
" fullpathname: " << (*mi).getFullname() << std::endl;
2589 if (*di != *mi->data_.dirname)
2598 if (run != 0 && (mi->data_.streamId !=0 || mi->data_.moduleId !=0))
2602 std::cout <<
"DQMStore::savePB: saving monitor element '" 2603 << *mi->data_.dirname <<
"/" << mi->data_.objname <<
"'" 2604 <<
"flags " << mi->data_.flags <<
"\n";
2611 TObject *toWrite =
nullptr;
2612 bool deleteObject =
false;
2615 toWrite =
new TObjString(mi->tagString().c_str());
2616 deleteObject =
true;
2618 toWrite = mi->object_;
2621 TBufferFile
buffer(TBufferFile::kWrite);
2622 buffer.WriteObject(toWrite);
2632 if (resetMEsAfterWriting)
2637 int filedescriptor =
::open(filename.c_str(),
2638 O_WRONLY | O_CREAT | O_TRUNC,
2642 FileOutputStream file_stream(filedescriptor);
2644 options.format = GzipOutputStream::GZIP;
2645 options.compression_level = 1;
2646 GzipOutputStream gzip_stream(&file_stream,
2648 dqmstore_message.SerializeToZeroCopyStream(&gzip_stream);
2651 gzip_stream.Close();
2652 file_stream.Close();
2653 ::close(filedescriptor);
2657 std::cout <<
"DQMStore::savePB: successfully wrote " << nme
2658 <<
" objects from path '" << path
2659 <<
"' into DQM file '" << filename <<
"'\n";
2672 const uint32_t
run ,
2673 const uint32_t
lumi ,
2677 const bool resetMEsAfterWriting )
2681 std::set<std::string>::iterator di, de;
2682 MEMap::iterator mi, me =
data_.end();
2683 DQMNet::QReports::const_iterator qi, qe;
2691 class TFileNoSync :
public TFile
2694 TFileNoSync(
const char *
file,
const char *opt) : TFile(file, opt) {}
2695 virtual Int_t SysSync(Int_t)
override {
return 0; }
2700 std::cout <<
"\n DQMStore: Opening TFile '" << filename
2701 <<
"' with option '" << fileupdate <<
"'\n";
2703 TFileNoSync
f(filename.c_str(), fileupdate.c_str());
2705 raiseDQMError(
"DQMStore",
"Failed to create/update file '%s'", filename.c_str());
2709 std::auto_ptr<lat::Regexp> rxpat;
2710 if (! pattern.empty())
2711 rxpat.reset(
new lat::Regexp(pattern.c_str()));
2724 for (di =
dirs_.begin(), de =
dirs_.end(); di != de; ++di)
2738 mi =
data_.lower_bound(proto);
2739 for ( ; mi != me &&
isSubdirectory(*di, *mi->data_.dirname); ++mi)
2742 std::cout <<
"DQMStore::save: Run: " << (*mi).run()
2743 <<
" Lumi: " << (*mi).lumi()
2744 <<
" LumiFlag: " << (*mi).getLumiFlag()
2745 <<
" streamId: " << (*mi).streamId()
2746 <<
" moduleId: " << (*mi).moduleId()
2747 <<
" fullpathname: " << (*mi).getFullname() << std::endl;
2754 if (*di != *mi->data_.dirname) {
2756 std::cout <<
"DQMStore::save: isn't a direct child. Skipping" << std::endl;
2766 if (run != 0 && (mi->data_.streamId !=0 || mi->data_.moduleId !=0)) {
2792 for (
size_t i = 0,
e = master->data_.qreports.size();
i !=
e; ++
i)
2793 status =
std::max(status, master->data_.qreports[
i].code);
2795 if (! master || status < minStatus)
2798 std::cout <<
"DQMStore::save: skipping monitor element '" 2799 << mi->data_.objname <<
"' while saving, status is " 2800 << status <<
", required minimum status is " 2801 << minStatus << std::endl;
2808 std::cout <<
"DQMStore::save: saving monitor element '" 2809 << mi->data_.objname <<
"'\n";
2813 gDirectory->cd(
"/");
2816 else if (rxpat.get())
2827 TObjString(mi->tagString().c_str()).Write();
2831 mi->object_->Write();
2838 qi = mi->data_.qreports.begin();
2839 qe = mi->data_.qreports.end();
2840 for ( ; qi != qe; ++qi)
2841 TObjString(mi->qualityTagString(*qi).c_str()).Write();
2846 TObjString(mi->effLabelString().c_str()).Write();
2850 TObjString(mi->tagLabelString().c_str()).Write();
2853 if (resetMEsAfterWriting)
2862 std::cout <<
"DQMStore::save: successfully wrote " << nme
2863 <<
" objects from path '" << path
2864 <<
"' into DQM file '" << filename <<
"'\n";
2877 unsigned int ntot = 0;
2878 unsigned int count = 0;
2880 if (! file->cd(curdir.c_str()))
2881 raiseDQMError(
"DQMStore",
"Failed to process directory '%s' while" 2882 " reading file '%s'", curdir.c_str(), file->GetName());
2905 size_t slash = dirpart.find(
'/');
2906 size_t pos = dirpart.find(
"/Run summary");
2907 if (slash != std::string::npos && pos !=std::string::npos)
2909 dirpart.erase(pos,12);
2911 pos = dirpart.find(
"Run ");
2912 size_t length = dirpart.find(
'/',pos+1)-pos+1;
2913 if (pos !=std::string::npos)
2914 dirpart.erase(pos,length);
2923 size_t slash = dirpart.find(
'/');
2925 if (slash == std::string::npos
2930 slash = dirpart.find(
'/');
2932 if (slash != std::string::npos
2933 && slash + 10 == dirpart.size()
2934 && dirpart.compare( slash+1 , 9 ,
"EventInfo") == 0) {
2936 std::cout <<
"DQMStore::readDirectory: skipping '" << dirpart <<
"'\n";
2941 if (dirpart.empty())
2944 dirpart = prepend +
'/' + dirpart;
2946 else if (! prepend.empty())
2948 if (dirpart.empty())
2951 dirpart = prepend +
'/' + dirpart;
2959 TIter
next (gDirectory->GetListOfKeys());
2960 std::list<TObject *> delayed;
2961 while ((key = (TKey *)
next()))
2963 std::auto_ptr<TObject>
obj(key->ReadObj());
2964 if (dynamic_cast<TDirectory *>(
obj.get()))
2967 subdir.reserve(curdir.size() + strlen(
obj->GetName()) + 2);
2969 if (! curdir.empty())
2971 subdir +=
obj->GetName();
2973 ntot +=
readDirectory(file, overwrite, onlypath, prepend, subdir, stripdirs);
2977 else if (dynamic_cast<TObjString *>(
obj.get()))
2979 delayed.push_back(
obj.release());
2984 std::cout <<
"DQMStore: reading object '" <<
obj->GetName()
2985 <<
"' of type '" <<
obj->IsA()->GetName()
2986 <<
"' from '" << file->GetName()
2987 <<
"' into '" << dirpart <<
"'\n";
2995 while (! delayed.empty())
2998 std::cout <<
"DQMStore: reading object '" << delayed.front()->GetName()
2999 <<
"' of type '" << delayed.front()->IsA()->GetName()
3000 <<
"' from '" << file->GetName()
3001 <<
"' into '" << dirpart <<
"'\n";
3007 delete delayed.front();
3008 delayed.pop_front();
3012 std::cout <<
"DQMStore: read " << count <<
'/' << ntot
3013 <<
" objects from directory '" << dirpart <<
"'\n";
3015 return ntot +
count;
3030 bool fileMustExist )
3032 return readFile(filename,overwrite,onlypath,prepend,stripdirs,fileMustExist);
3042 bool fileMustExist )
3044 bool overwrite =
true;
3048 std::cout <<
"DQMStore::load: reading from file '" << filename <<
"'\n";
3050 std::cout <<
"DQMStore::load: in collate mode " <<
"\n";
3052 std::cout <<
"DQMStore::load: in overwrite mode " <<
"\n";
3056 return readFile(filename, overwrite,
"",
"", stripdirs, fileMustExist);
3058 return readFilePB(filename, overwrite,
"",
"", stripdirs, fileMustExist);
3072 bool fileMustExist )
3076 std::cout <<
"DQMStore::readFile: reading from file '" << filename <<
"'\n";
3078 std::auto_ptr<TFile>
f;
3082 f.reset(TFile::Open(filename.c_str()));
3083 if (! f.get() || f->IsZombie())
3084 raiseDQMError(
"DQMStore",
"Failed to open file '%s'", filename.c_str());
3093 std::cout <<
"DQMStore::readFile: file '" << filename <<
"' does not exist, continuing\n";
3098 unsigned n =
readDirectory(f.get(), overwrite, onlypath, prepend,
"", stripdirs);
3101 MEMap::iterator mi =
data_.begin();
3102 MEMap::iterator me =
data_.end();
3103 for ( ; mi != me; ++mi)
3104 const_cast<MonitorElement &>(*mi).updateQReportStats();
3108 std::cout <<
"DQMStore::open: successfully read " << n
3109 <<
" objects from file '" << filename <<
"'";
3110 if (! onlypath.empty())
3111 std::cout <<
" from directory '" << onlypath <<
"'";
3112 if (! prepend.empty())
3113 std::cout <<
" into directory '" << prepend <<
"'";
3123 if (buf.Length() == buf.BufferSize())
3126 void *ptr = buf.ReadObjectAny(0);
3127 return reinterpret_cast<TObject *
>(ptr);
3136 size_t dirpos = (slash == std::string::npos ? 0 :
slash);
3137 size_t namepos = (slash == std::string::npos ? 0 : slash+1);
3139 objname.assign(h.
full_pathname(), namepos, std::string::npos);
3140 TBufferFile buf(TBufferFile::kRead, h.
size(),
3156 bool fileMustExist )
3158 using google::protobuf::io::FileInputStream;
3159 using google::protobuf::io::FileOutputStream;
3160 using google::protobuf::io::GzipInputStream;
3161 using google::protobuf::io::GzipOutputStream;
3162 using google::protobuf::io::CodedInputStream;
3163 using google::protobuf::io::ArrayInputStream;
3166 std::cout <<
"DQMStore::readFile: reading from file '" << filename <<
"'\n";
3169 if ((filedescriptor = ::
open(filename.c_str(), O_RDONLY)) == -1) {
3171 raiseDQMError(
"DQMStore",
"Failed to open file '%s'", filename.c_str());
3174 std::cout <<
"DQMStore::readFile: file '" << filename <<
"' does not exist, continuing\n";
3179 FileInputStream
fin(filedescriptor);
3180 GzipInputStream
input(&fin);
3181 CodedInputStream input_coded(&input);
3182 input_coded.SetTotalBytesLimit(1024*1024*1024, -1);
3183 if (!dqmstore_message.ParseFromCodedStream(&input_coded)) {
3184 raiseDQMError(
"DQMStore",
"Fatal parsing file '%s'", filename.c_str());
3187 ::close(filedescriptor);
3211 extract(static_cast<TObject *>(obj), path, overwrite, collate);
3213 if (me ==
nullptr) {
3239 MEMap::iterator
e =
data_.end();
3240 MEMap::iterator
i =
data_.lower_bound(proto);
3244 std::set<std::string>::iterator de =
dirs_.end();
3245 std::set<std::string>::iterator di =
dirs_.lower_bound(*cleaned);
3255 MEMap::iterator
e =
data_.end();
3256 MEMap::iterator
i =
data_.lower_bound(proto);
3258 if (dir == *i->data_.dirname)
3285 MEMap::iterator
pos =
data_.find(proto);
3286 if (pos !=
data_.end())
3289 std::cout <<
"DQMStore: WARNING: attempt to remove non-existent" 3290 <<
" monitor element '" << name <<
"' in '" << dir <<
"'\n";
3301 QCMap::const_iterator
i =
qtests_.find(qtname);
3302 QCMap::const_iterator
e =
qtests_.end();
3303 return (i == e ? 0 : i->second);
3313 raiseDQMError(
"DQMStore",
"Attempt to create duplicate quality test '%s'",
3316 QAMap::iterator
i =
qalgos_.find(algoname);
3318 raiseDQMError(
"DQMStore",
"Cannot create a quality test using unknown" 3319 " algorithm '%s'", algoname.c_str());
3339 if (cleaned->find_first_not_of(
s_safe) != std::string::npos)
3341 " uses unacceptable characters", cleaned->c_str());
3353 raiseDQMError(
"DQMStore",
"Cannot apply non-existent quality test '%s'",
3363 MEMap::iterator mi =
data_.begin();
3364 MEMap::iterator me =
data_.end();
3367 for ( ; mi != me; ++mi)
3370 mergePath(path, *mi->data_.dirname, mi->data_.objname);
3371 if (fm->match(path))
3388 std::cout <<
"DQMStore: running runQTests() with reset = " 3389 << (
reset_ ?
"true" :
"false" ) << std::endl;
3392 MEMap::iterator mi =
data_.begin();
3393 MEMap::iterator me =
data_.end();
3394 for ( ; mi != me; ++mi)
3412 MEMap::const_iterator mi =
data_.begin();
3413 MEMap::const_iterator me =
data_.end();
3414 for ( ; mi != me; ++mi)
3416 if (! cleaned->empty() && !
isSubdirectory(*cleaned, *mi->data_.dirname))
3421 else if (mi->hasWarning())
3424 && mi->hasOtherReport())
3468 std::cout <<
" ------------------------------------------------------------\n" 3469 <<
" Directory structure: \n" 3470 <<
" ------------------------------------------------------------\n";
3472 std::copy(contents.begin(), contents.end(),
3473 std::ostream_iterator<std::string>(
std::cout,
"\n"));
3475 std::cout <<
" ------------------------------------------------------------\n";
3512 MonitorElement * event_me =
get(
"Info/EventInfo/processedEvents");
3515 factor = factor/(events*1.0);
3517 MEMap::iterator mi =
data_.begin();
3518 MEMap::iterator me =
data_.end();
3519 for ( ; mi != me; ++mi)
3571 std::cout <<
" The DQM object '" << me.
getFullname() <<
"' is not scalable object " << std::endl;
QCriterion * getQCriterion(const std::string &qtname) const
MonitorElement * getElement(const std::string &path)
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
Master< F > master(const F &f)
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
::google::protobuf::uint32 size() const
bool isCollateME(MonitorElement *me) const
void resetUpdate(void)
reset "was updated" flag
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
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
MonitorElement * book1D(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1D histogram.
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
def replace(string, replacements)
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);
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
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::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
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)
std::vector< std::shared_ptr< fireworks::OptionNode > > Options
static const lat::Regexp s_rxself("^[^()]*DQMStore::.*")
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.
void tagContents(const std::string &path, unsigned int myTag)
tag all children of folder (does NOT include subfolders)
::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)
::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)
void showDirStructure(void) const
TH2F * getTH2F(void) const
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.
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.
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,...)