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));
1249 return book2D(
pwd_, name, static_cast<TH2F *>(source->Clone(name)));
1256 return book2D(
pwd_, name, static_cast<TH2F *>(source->Clone(name.c_str())));
1263 return book2S(
pwd_, name, static_cast<TH2S *>(source->Clone(name)));
1270 return book2S(
pwd_, name, static_cast<TH2S *>(source->Clone(name.c_str())));
1277 return book2DD(
pwd_, name, static_cast<TH2D *>(source->Clone(name)));
1284 return book2DD(
pwd_, name, static_cast<TH2D *>(source->Clone(name.c_str())));
1298 int nchX,
double lowX,
double highX,
1299 int nchY,
double lowY,
double highY,
1300 int nchZ,
double lowZ,
double highZ)
1302 return book3D(
pwd_, name,
new TH3F(name, title,
1305 nchZ, lowZ, highZ));
1311 int nchX,
double lowX,
double highX,
1312 int nchY,
double lowY,
double highY,
1313 int nchZ,
double lowZ,
double highZ)
1315 return book3D(
pwd_, name,
new TH3F(name.c_str(), title.c_str(),
1318 nchZ, lowZ, highZ));
1325 return book3D(
pwd_, name, static_cast<TH3F *>(source->Clone(name)));
1332 return book3D(
pwd_, name, static_cast<TH3F *>(source->Clone(name.c_str())));
1340 return book(dir, name,
"bookProfile",
1350 int nchX,
double lowX,
double highX,
1351 int ,
double lowY,
double highY,
1365 int nchX,
double lowX,
double highX,
1366 int ,
double lowY,
double highY,
1369 return bookProfile(
pwd_, name,
new TProfile(name.c_str(), title.c_str(),
1380 int nchX,
double lowX,
double highX,
1381 double lowY,
double highY,
1395 int nchX,
double lowX,
double highX,
1396 double lowY,
double highY,
1399 return bookProfile(
pwd_, name,
new TProfile(name.c_str(), title.c_str(),
1410 int nchX,
const double *xbinsize,
1411 int ,
double lowY,
double highY,
1425 int nchX,
const double *xbinsize,
1426 int ,
double lowY,
double highY,
1429 return bookProfile(
pwd_, name,
new TProfile(name.c_str(), title.c_str(),
1440 int nchX,
const double *xbinsize,
1441 double lowY,
double highY,
1455 int nchX,
const double *xbinsize,
1456 double lowY,
double highY,
1459 return bookProfile(
pwd_, name,
new TProfile(name.c_str(), title.c_str(),
1469 return bookProfile(
pwd_, name, static_cast<TProfile *>(source->Clone(name)));
1476 return bookProfile(
pwd_, name, static_cast<TProfile *>(source->Clone(name.c_str())));
1484 return book(dir, name,
"bookProfile2D",
1494 int nchX,
double lowX,
double highX,
1495 int nchY,
double lowY,
double highY,
1496 int ,
double lowZ,
double highZ,
1511 int nchX,
double lowX,
double highX,
1512 int nchY,
double lowY,
double highY,
1513 int ,
double lowZ,
double highZ,
1528 int nchX,
double lowX,
double highX,
1529 int nchY,
double lowY,
double highY,
1530 double lowZ,
double highZ,
1545 int nchX,
double lowX,
double highX,
1546 int nchY,
double lowY,
double highY,
1547 double lowZ,
double highZ,
1561 return bookProfile2D(
pwd_, name, static_cast<TProfile2D *>(source->Clone(name)));
1568 return bookProfile2D(
pwd_, name, static_cast<TProfile2D *>(source->Clone(name.c_str())));
1577 if (me->
getTH1()->GetNbinsX() != h->GetNbinsX()
1578 || me->
getTH1()->GetNbinsY() != h->GetNbinsY()
1579 || me->
getTH1()->GetNbinsZ() != h->GetNbinsZ()
1580 || me->
getTH1()->GetXaxis()->GetXmin() != h->GetXaxis()->GetXmin()
1581 || me->
getTH1()->GetYaxis()->GetXmin() != h->GetYaxis()->GetXmin()
1582 || me->
getTH1()->GetZaxis()->GetXmin() != h->GetZaxis()->GetXmin()
1583 || me->
getTH1()->GetXaxis()->GetXmax() != h->GetXaxis()->GetXmax()
1584 || me->
getTH1()->GetYaxis()->GetXmax() != h->GetYaxis()->GetXmax()
1585 || me->
getTH1()->GetZaxis()->GetXmax() != h->GetZaxis()->GetXmax()
1592 <<
"checkBinningMatches: different binning - cannot add object '" 1593 << h->GetName() <<
"' of type " 1594 << h->IsA()->GetName() <<
" to existing ME: '" 1678 raiseDQMError(
"DQMStore",
"Attempt to tag monitor element '%s'" 1681 raiseDQMError(
"DQMStore",
"Attempt to tag monitor element '%s'" 1682 " twice with multiple tags", me->
getFullname().c_str());
1699 raiseDQMError(
"DQMStore",
"Attempt to tag non-existent monitor element" 1700 " '%s' with tag %u", path.c_str(), myTag);
1709 MEMap::iterator
e =
data_.end();
1710 MEMap::iterator
i =
data_.lower_bound(proto);
1711 for ( ; i != e && path == *i->data_.dirname; ++
i)
1712 tag(const_cast<MonitorElement *>(&*i), myTag);
1726 MEMap::iterator
e =
data_.end();
1727 MEMap::iterator
i =
data_.lower_bound(proto);
1730 tag(const_cast<MonitorElement *>(&*i), myTag);
1739 std::vector<std::string>
1742 std::vector<std::string>
result;
1743 std::set<std::string>::const_iterator
e =
dirs_.end();
1744 std::set<std::string>::const_iterator
i =
dirs_.find(
pwd_);
1755 if (i->find(
'/',
pwd_.size()+1) == std::string::npos)
1756 result.push_back(*i);
1762 std::vector<std::string>
1766 std::vector<std::string>
result;
1767 MEMap::const_iterator
e =
data_.end();
1768 MEMap::const_iterator
i =
data_.lower_bound(proto);
1770 if (
pwd_ == *i->data_.dirname)
1771 result.push_back(i->getName());
1782 MEMap::const_iterator
e =
data_.end();
1783 MEMap::const_iterator
i =
data_.lower_bound(proto);
1795 MEMap::const_iterator mepos =
data_.find(proto);
1796 return (mepos ==
data_.end() ? 0
1801 std::vector<MonitorElement *>
1805 std::vector<MonitorElement *>
result;
1806 for (MEMap::const_iterator
i =
data_.begin(),
e =
data_.end();
i !=
e; ++
i)
1810 result.push_back(const_cast<MonitorElement *>(&me));
1817 std::vector<MonitorElement *>
1825 std::vector<MonitorElement *>
result;
1826 MEMap::const_iterator
e =
data_.end();
1827 MEMap::const_iterator
i =
data_.lower_bound(proto);
1829 if (*cleaned == *i->data_.dirname)
1830 result.push_back(const_cast<MonitorElement *>(&*i));
1836 std::vector<MonitorElement *>
1844 std::vector<MonitorElement *>
result;
1845 MEMap::const_iterator
e =
data_.end();
1846 MEMap::const_iterator
i =
data_.lower_bound(proto);
1848 if (*cleaned == *i->data_.dirname
1850 && i->data_.tag ==
tag)
1851 result.push_back(const_cast<MonitorElement *>(&*i));
1864 into.reserve(
dirs_.size());
1866 MEMap::const_iterator me =
data_.end();
1867 std::set<std::string>::const_iterator di =
dirs_.begin();
1868 std::set<std::string>::const_iterator de =
dirs_.end();
1869 for ( ; di != de; ++di)
1872 MEMap::const_iterator mi =
data_.lower_bound(proto);
1873 MEMap::const_iterator
m = mi;
1874 size_t sz = di->size() + 2;
1877 if (*di == *m->data_.dirname)
1879 sz += m->data_.objname.size() + 1;
1886 std::vector<std::string>::iterator istr
1895 for (sz = 0; mi !=
m; ++mi)
1897 if (*di != *mi->data_.dirname)
1903 *istr += mi->data_.objname;
1909 istr->reserve(di->size() + 2);
1921 const uint32_t
run ,
1922 const uint32_t
lumi ,
1923 const uint32_t streamId ,
1924 const uint32_t moduleId )
const 1926 if (dir.find_first_not_of(
s_safe) != std::string::npos)
1927 raiseDQMError(
"DQMStore",
"Monitor element path name '%s' uses" 1928 " unacceptable characters", dir.c_str());
1929 if (name.find_first_not_of(
s_safe) != std::string::npos)
1930 raiseDQMError(
"DQMStore",
"Monitor element path name '%s' uses" 1931 " unacceptable characters", name.c_str());
1941 MEMap::const_iterator mepos =
data_.find(proto);
1942 return (mepos ==
data_.end() ? 0
1952 into.reserve(
dirs_.size());
1954 MEMap::const_iterator me =
data_.end();
1955 std::set<std::string>::const_iterator di =
dirs_.begin();
1956 std::set<std::string>::const_iterator de =
dirs_.end();
1959 for ( ; di != de; ++di)
1962 MEMap::const_iterator mi =
data_.lower_bound(proto);
1963 MEMap::const_iterator
m = mi;
1964 size_t sz = di->size() + 2;
1970 sz += 1 + m->data_.objname.size() + 11;
1977 std::vector<std::string>::iterator istr
1984 for (sz = 0; mi !=
m; ++mi)
1988 sprintf(tagbuf,
"/%u", mi->data_.tag);
1991 *istr += m->data_.objname;
2001 std::vector<MonitorElement*>
2004 uint32_t
lumi )
const 2012 std::vector<MonitorElement *>
result;
2013 MEMap::const_iterator
e =
data_.end();
2014 MEMap::const_iterator
i =
data_.lower_bound(proto);
2016 if (runNumber != 0) {
2017 if (i->data_.run > runNumber
2018 || i->data_.streamId != 0
2019 || i->data_.moduleId != 0)
2023 if (i->data_.lumi > lumi
2024 || i->data_.streamId != 0
2025 || i->data_.moduleId != 0)
2028 if (runNumber != 0
or lumi !=0) {
2029 assert(i->data_.streamId == 0);
2030 assert(i->data_.moduleId == 0);
2032 result.push_back(const_cast<MonitorElement *>(&*i));
2040 if (i->data_.run != 0 || i->data_.streamId != 0 || i->data_.moduleId != 0)
break;
2041 result.push_back(const_cast<MonitorElement *>(&*i));
2050 std::vector<MonitorElement*>
2056 rx = lat::Regexp(pattern, 0, syntaxType);
2059 catch (lat::Error &
e)
2061 raiseDQMError(
"DQMStore",
"Invalid regular expression '%s': %s",
2062 pattern.c_str(), e.explain().c_str());
2066 std::vector<MonitorElement *>
result;
2067 MEMap::const_iterator
i =
data_.begin();
2068 MEMap::const_iterator e =
data_.end();
2069 for ( ; i !=
e; ++
i)
2072 mergePath(path, *i->data_.dirname, i->data_.objname);
2074 result.push_back(const_cast<MonitorElement *>(&*i));
2089 MEMap::iterator mi =
data_.begin();
2090 MEMap::iterator me =
data_.end();
2091 for ( ; mi != me; ++mi)
2094 if (mi->wasUpdated())
2113 MEMap::iterator mi =
data_.begin();
2114 MEMap::iterator me =
data_.end();
2115 for ( ; mi != me; ++mi)
2146 std::set<MonitorElement>::const_iterator
e =
data_.end();
2147 std::set<MonitorElement>::const_iterator
i =
data_.lower_bound(proto);
2150 if (i->data_.streamId != 0 ||
2151 i->data_.moduleId != 0)
2153 if (i->data_.lumi != lumi)
2155 if (i->data_.run != run)
2162 std::cout <<
"DQMStore::deleteUnusedLumiHistograms: deleted monitor element '" 2163 << *i->data_.dirname <<
"/" << i->data_.objname <<
"'" 2164 <<
"flags " << i->data_.flags <<
"\n";
2182 if (TProfile *
h = dynamic_cast<TProfile *>(obj))
2186 me =
bookProfile(dir,
h->GetName(), (TProfile *)
h->Clone());
2193 else if (TProfile2D *
h = dynamic_cast<TProfile2D *>(obj))
2204 else if (TH1F *
h = dynamic_cast<TH1F *>(obj))
2208 me =
book1D(dir,
h->GetName(), (TH1F *)
h->Clone());
2215 else if (TH1S *
h = dynamic_cast<TH1S *>(obj))
2219 me =
book1S(dir,
h->GetName(), (TH1S *)
h->Clone());
2226 else if (TH1D *
h = dynamic_cast<TH1D *>(obj))
2230 me =
book1DD(dir,
h->GetName(), (TH1D *)
h->Clone());
2237 else if (TH2F *
h = dynamic_cast<TH2F *>(obj))
2241 me =
book2D(dir,
h->GetName(), (TH2F *)
h->Clone());
2248 else if (TH2S *
h = dynamic_cast<TH2S *>(obj))
2252 me =
book2S(dir,
h->GetName(), (TH2S *)
h->Clone());
2259 else if (TH2D *
h = dynamic_cast<TH2D *>(obj))
2263 me =
book2DD(dir,
h->GetName(), (TH2D *)
h->Clone());
2270 else if (TH3F *
h = dynamic_cast<TH3F *>(obj))
2274 me =
book3D(dir,
h->GetName(), (TH3F *)
h->Clone());
2281 else if (dynamic_cast<TObjString *>(obj))
2284 if (!
s_rxmeval.match(obj->GetName(), 0, 0, &
m))
2286 if (strstr(obj->GetName(),
"CMSSW"))
2289 std::cout <<
"Input file version: " << obj->GetName() << std::endl;
2292 else if (strstr(obj->GetName(),
"DQMPATCH"))
2295 std::cout <<
"DQM patch version: " << obj->GetName() << std::endl;
2300 std::cout <<
"*** DQMStore: WARNING: cannot extract object '" 2301 << obj->GetName() <<
"' of type '" 2302 << obj->IsA()->GetName() <<
"'\n";
2314 if (! me || overwrite)
2316 if (! me) me =
bookInt(dir, label);
2317 me->
Fill(atoll(value.c_str()));
2320 else if (kind ==
"f")
2323 if (! me || overwrite)
2326 me->
Fill(atof(value.c_str()));
2329 else if (kind ==
"s")
2337 else if (kind ==
"e")
2342 std::cout <<
"*** DQMStore: WARNING: no monitor element '" 2343 << label <<
"' in directory '" 2344 << dir <<
"' to be marked as efficiency plot.\n";
2349 else if (kind ==
"t")
2354 std::cout <<
"*** DQMStore: WARNING: no monitor element '" 2355 << label <<
"' in directory '" 2356 << dir <<
"' for a tag\n";
2361 unsigned long val = strtoul(value.c_str(), &endp, 10);
2362 if ((val == 0 && errno) || *endp || val > ~uint32_t(0))
2364 std::cout <<
"*** DQMStore: WARNING: cannot restore tag '" 2365 << value <<
"' for monitor element '" 2366 << label <<
"' in directory '" 2367 << dir <<
"' - invalid value\n";
2372 else if (kind ==
"qr")
2377 size_t dot = label.find(
'.');
2378 if (dot == std::string::npos)
2380 std::cout <<
"*** DQMStore: WARNING: quality report label in '" << label
2381 <<
"' is missing a '.' and cannot be extracted\n";
2386 std::string qrname (label, dot+1, std::string::npos);
2392 qv.
code = atoi(m.matchString(value, 1).c_str());
2393 qv.
qtresult = strtod(m.matchString(value, 2).c_str(), 0);
2394 qv.
message = m.matchString(value, 4);
2398 else if (
s_rxmeqr2.match(value, 0, 0, &m))
2400 qv.
code = atoi(m.matchString(value, 1).c_str());
2402 qv.
message = m.matchString(value, 2);
2408 std::cout <<
"*** DQMStore: WARNING: quality test value '" 2409 << value <<
"' is incorrectly formatted\n";
2416 std::cout <<
"*** DQMStore: WARNING: no monitor element '" 2417 << mename <<
"' in directory '" 2418 << dir <<
"' for quality test '" 2428 std::cout <<
"*** DQMStore: WARNING: cannot extract object '" 2429 << obj->GetName() <<
"' of type '" 2430 << obj->IsA()->GetName() <<
"'\n";
2434 else if (TNamed *
n = dynamic_cast<TNamed *>(obj))
2438 s.reserve(6 + strlen(
n->GetTitle()) + 2*strlen(
n->GetName()));
2439 s +=
'<'; s +=
n->GetName(); s +=
'>';
2441 s +=
'<'; s +=
'/'; s +=
n->GetName(); s +=
'>';
2442 TObjString os(s.c_str());
2447 std::cout <<
"*** DQMStore: WARNING: cannot extract object '" 2448 << obj->GetName() <<
"' of type '" << obj->IsA()->GetName()
2449 <<
"' and with title '" << obj->GetTitle() <<
"'\n";
2480 assert(! path.empty());
2484 size_t end = path.find(
'/', start);
2485 if (end == std::string::npos)
2493 TObject *
o = gDirectory->Get(part.c_str());
2494 if (o && ! dynamic_cast<TDirectory *>(o))
2495 raiseDQMError(
"DQMStore",
"Attempt to create directory '%s' in a file" 2496 " fails because the part '%s' already exists and is not" 2497 " directory", path.c_str(), part.c_str());
2499 gDirectory->mkdir(part.c_str());
2501 if (! gDirectory->cd(part.c_str()))
2502 raiseDQMError(
"DQMStore",
"Attempt to create directory '%s' in a file" 2503 " fails because could not cd into subdirectory '%s'",
2504 path.c_str(), part.c_str());
2507 if (end+1 >= path.size())
2512 end = path.find(
'/', start);
2513 if (end == std::string::npos)
2522 const uint32_t
run ,
2523 const uint32_t
lumi ,
2524 const bool resetMEsAfterWriting )
2526 using google::protobuf::io::FileOutputStream;
2527 using google::protobuf::io::GzipOutputStream;
2528 using google::protobuf::io::StringOutputStream;
2532 std::set<std::string>::iterator di, de;
2533 MEMap::iterator mi, me =
data_.end();
2538 std::cout <<
"\n DQMStore: Opening PBFile '" 2539 << filename <<
"'"<< std::endl;
2542 for (di =
dirs_.begin(), de =
dirs_.end(); di != de; ++di)
2555 mi =
data_.lower_bound(proto);
2556 for ( ; mi != me &&
isSubdirectory(*di, *mi->data_.dirname); ++mi)
2560 <<
" Lumi: " << (*mi).lumi()
2561 <<
" LumiFlag: " << (*mi).getLumiFlag()
2562 <<
" streamId: " << (*mi).streamId()
2563 <<
" moduleId: " << (*mi).moduleId()
2564 <<
" fullpathname: " << (*mi).getFullname() << std::endl;
2571 if (*di != *mi->data_.dirname)
2580 if (run != 0 && (mi->data_.streamId !=0 || mi->data_.moduleId !=0))
2584 std::cout <<
"DQMStore::savePB: saving monitor element '" 2585 << *mi->data_.dirname <<
"/" << mi->data_.objname <<
"'" 2586 <<
"flags " << mi->data_.flags <<
"\n";
2593 TObject *toWrite =
nullptr;
2594 bool deleteObject =
false;
2597 toWrite =
new TObjString(mi->tagString().c_str());
2598 deleteObject =
true;
2600 toWrite = mi->object_;
2603 TBufferFile
buffer(TBufferFile::kWrite);
2604 buffer.WriteObject(toWrite);
2614 if (resetMEsAfterWriting)
2619 int filedescriptor =
::open(filename.c_str(),
2620 O_WRONLY | O_CREAT | O_TRUNC,
2624 FileOutputStream file_stream(filedescriptor);
2626 options.format = GzipOutputStream::GZIP;
2627 options.compression_level = 1;
2628 GzipOutputStream gzip_stream(&file_stream,
2630 dqmstore_message.SerializeToZeroCopyStream(&gzip_stream);
2633 gzip_stream.Close();
2634 file_stream.Close();
2635 ::close(filedescriptor);
2639 std::cout <<
"DQMStore::savePB: successfully wrote " << nme
2640 <<
" objects from path '" << path
2641 <<
"' into DQM file '" << filename <<
"'\n";
2654 const uint32_t
run ,
2655 const uint32_t
lumi ,
2659 const bool resetMEsAfterWriting )
2663 std::set<std::string>::iterator di, de;
2664 MEMap::iterator mi, me =
data_.end();
2665 DQMNet::QReports::const_iterator qi, qe;
2673 class TFileNoSync :
public TFile
2676 TFileNoSync(
const char *
file,
const char *opt) : TFile(file, opt) {}
2677 virtual Int_t SysSync(Int_t)
override {
return 0; }
2682 std::cout <<
"\n DQMStore: Opening TFile '" << filename
2683 <<
"' with option '" << fileupdate <<
"'\n";
2685 TFileNoSync
f(filename.c_str(), fileupdate.c_str());
2687 raiseDQMError(
"DQMStore",
"Failed to create/update file '%s'", filename.c_str());
2691 std::auto_ptr<lat::Regexp> rxpat;
2692 if (! pattern.empty())
2693 rxpat.reset(
new lat::Regexp(pattern.c_str()));
2706 for (di =
dirs_.begin(), de =
dirs_.end(); di != de; ++di)
2720 mi =
data_.lower_bound(proto);
2721 for ( ; mi != me &&
isSubdirectory(*di, *mi->data_.dirname); ++mi)
2724 std::cout <<
"DQMStore::save: Run: " << (*mi).run()
2725 <<
" Lumi: " << (*mi).lumi()
2726 <<
" LumiFlag: " << (*mi).getLumiFlag()
2727 <<
" streamId: " << (*mi).streamId()
2728 <<
" moduleId: " << (*mi).moduleId()
2729 <<
" fullpathname: " << (*mi).getFullname() << std::endl;
2736 if (*di != *mi->data_.dirname) {
2738 std::cout <<
"DQMStore::save: isn't a direct child. Skipping" << std::endl;
2748 if (run != 0 && (mi->data_.streamId !=0 || mi->data_.moduleId !=0)) {
2774 for (
size_t i = 0,
e = master->data_.qreports.size();
i !=
e; ++
i)
2775 status =
std::max(status, master->data_.qreports[
i].code);
2777 if (! master || status < minStatus)
2780 std::cout <<
"DQMStore::save: skipping monitor element '" 2781 << mi->data_.objname <<
"' while saving, status is " 2782 << status <<
", required minimum status is " 2783 << minStatus << std::endl;
2790 std::cout <<
"DQMStore::save: saving monitor element '" 2791 << mi->data_.objname <<
"'\n";
2795 gDirectory->cd(
"/");
2798 else if (rxpat.get())
2809 TObjString(mi->tagString().c_str()).Write();
2813 mi->object_->Write();
2820 qi = mi->data_.qreports.begin();
2821 qe = mi->data_.qreports.end();
2822 for ( ; qi != qe; ++qi)
2823 TObjString(mi->qualityTagString(*qi).c_str()).Write();
2828 TObjString(mi->effLabelString().c_str()).Write();
2832 TObjString(mi->tagLabelString().c_str()).Write();
2835 if (resetMEsAfterWriting)
2844 std::cout <<
"DQMStore::save: successfully wrote " << nme
2845 <<
" objects from path '" << path
2846 <<
"' into DQM file '" << filename <<
"'\n";
2859 unsigned int ntot = 0;
2860 unsigned int count = 0;
2862 if (! file->cd(curdir.c_str()))
2863 raiseDQMError(
"DQMStore",
"Failed to process directory '%s' while" 2864 " reading file '%s'", curdir.c_str(), file->GetName());
2887 size_t slash = dirpart.find(
'/');
2888 size_t pos = dirpart.find(
"/Run summary");
2889 if (slash != std::string::npos && pos !=std::string::npos)
2891 dirpart.erase(pos,12);
2893 pos = dirpart.find(
"Run ");
2894 size_t length = dirpart.find(
'/',pos+1)-pos+1;
2895 if (pos !=std::string::npos)
2896 dirpart.erase(pos,length);
2905 size_t slash = dirpart.find(
'/');
2907 if (slash == std::string::npos
2912 slash = dirpart.find(
'/');
2914 if (slash != std::string::npos
2915 && slash + 10 == dirpart.size()
2916 && dirpart.compare( slash+1 , 9 ,
"EventInfo") == 0) {
2918 std::cout <<
"DQMStore::readDirectory: skipping '" << dirpart <<
"'\n";
2923 if (dirpart.empty())
2926 dirpart = prepend +
'/' + dirpart;
2928 else if (! prepend.empty())
2930 if (dirpart.empty())
2933 dirpart = prepend +
'/' + dirpart;
2941 TIter
next (gDirectory->GetListOfKeys());
2942 std::list<TObject *> delayed;
2943 while ((key = (TKey *)
next()))
2945 std::auto_ptr<TObject>
obj(key->ReadObj());
2946 if (dynamic_cast<TDirectory *>(
obj.get()))
2949 subdir.reserve(curdir.size() + strlen(
obj->GetName()) + 2);
2951 if (! curdir.empty())
2953 subdir +=
obj->GetName();
2955 ntot +=
readDirectory(file, overwrite, onlypath, prepend, subdir, stripdirs);
2959 else if (dynamic_cast<TObjString *>(
obj.get()))
2961 delayed.push_back(
obj.release());
2966 std::cout <<
"DQMStore: reading object '" <<
obj->GetName()
2967 <<
"' of type '" <<
obj->IsA()->GetName()
2968 <<
"' from '" << file->GetName()
2969 <<
"' into '" << dirpart <<
"'\n";
2977 while (! delayed.empty())
2980 std::cout <<
"DQMStore: reading object '" << delayed.front()->GetName()
2981 <<
"' of type '" << delayed.front()->IsA()->GetName()
2982 <<
"' from '" << file->GetName()
2983 <<
"' into '" << dirpart <<
"'\n";
2989 delete delayed.front();
2990 delayed.pop_front();
2994 std::cout <<
"DQMStore: read " << count <<
'/' << ntot
2995 <<
" objects from directory '" << dirpart <<
"'\n";
2997 return ntot +
count;
3012 bool fileMustExist )
3014 return readFile(filename,overwrite,onlypath,prepend,stripdirs,fileMustExist);
3024 bool fileMustExist )
3026 bool overwrite =
true;
3030 std::cout <<
"DQMStore::load: reading from file '" << filename <<
"'\n";
3032 std::cout <<
"DQMStore::load: in collate mode " <<
"\n";
3034 std::cout <<
"DQMStore::load: in overwrite mode " <<
"\n";
3038 return readFile(filename, overwrite,
"",
"", stripdirs, fileMustExist);
3040 return readFilePB(filename, overwrite,
"",
"", stripdirs, fileMustExist);
3054 bool fileMustExist )
3058 std::cout <<
"DQMStore::readFile: reading from file '" << filename <<
"'\n";
3060 std::auto_ptr<TFile>
f;
3064 f.reset(TFile::Open(filename.c_str()));
3065 if (! f.get() || f->IsZombie())
3066 raiseDQMError(
"DQMStore",
"Failed to open file '%s'", filename.c_str());
3075 std::cout <<
"DQMStore::readFile: file '" << filename <<
"' does not exist, continuing\n";
3080 unsigned n =
readDirectory(f.get(), overwrite, onlypath, prepend,
"", stripdirs);
3083 MEMap::iterator mi =
data_.begin();
3084 MEMap::iterator me =
data_.end();
3085 for ( ; mi != me; ++mi)
3086 const_cast<MonitorElement &>(*mi).updateQReportStats();
3090 std::cout <<
"DQMStore::open: successfully read " << n
3091 <<
" objects from file '" << filename <<
"'";
3092 if (! onlypath.empty())
3093 std::cout <<
" from directory '" << onlypath <<
"'";
3094 if (! prepend.empty())
3095 std::cout <<
" into directory '" << prepend <<
"'";
3105 if (buf.Length() == buf.BufferSize())
3108 void *ptr = buf.ReadObjectAny(0);
3109 return reinterpret_cast<TObject *
>(ptr);
3118 size_t dirpos = (slash == std::string::npos ? 0 :
slash);
3119 size_t namepos = (slash == std::string::npos ? 0 : slash+1);
3121 objname.assign(h.
full_pathname(), namepos, std::string::npos);
3122 TBufferFile buf(TBufferFile::kRead, h.
size(),
3138 bool fileMustExist )
3140 using google::protobuf::io::FileInputStream;
3141 using google::protobuf::io::FileOutputStream;
3142 using google::protobuf::io::GzipInputStream;
3143 using google::protobuf::io::GzipOutputStream;
3144 using google::protobuf::io::CodedInputStream;
3145 using google::protobuf::io::ArrayInputStream;
3148 std::cout <<
"DQMStore::readFile: reading from file '" << filename <<
"'\n";
3151 if ((filedescriptor = ::
open(filename.c_str(), O_RDONLY)) == -1) {
3153 raiseDQMError(
"DQMStore",
"Failed to open file '%s'", filename.c_str());
3156 std::cout <<
"DQMStore::readFile: file '" << filename <<
"' does not exist, continuing\n";
3161 FileInputStream
fin(filedescriptor);
3162 GzipInputStream
input(&fin);
3163 CodedInputStream input_coded(&input);
3164 input_coded.SetTotalBytesLimit(1024*1024*1024, -1);
3165 if (!dqmstore_message.ParseFromCodedStream(&input_coded)) {
3166 raiseDQMError(
"DQMStore",
"Fatal parsing file '%s'", filename.c_str());
3169 ::close(filedescriptor);
3193 extract(static_cast<TObject *>(obj), path, overwrite, collate);
3195 if (me ==
nullptr) {
3221 MEMap::iterator
e =
data_.end();
3222 MEMap::iterator
i =
data_.lower_bound(proto);
3226 std::set<std::string>::iterator de =
dirs_.end();
3227 std::set<std::string>::iterator di =
dirs_.lower_bound(*cleaned);
3237 MEMap::iterator
e =
data_.end();
3238 MEMap::iterator
i =
data_.lower_bound(proto);
3240 if (dir == *i->data_.dirname)
3267 MEMap::iterator
pos =
data_.find(proto);
3268 if (pos !=
data_.end())
3271 std::cout <<
"DQMStore: WARNING: attempt to remove non-existent" 3272 <<
" monitor element '" << name <<
"' in '" << dir <<
"'\n";
3283 QCMap::const_iterator
i =
qtests_.find(qtname);
3284 QCMap::const_iterator
e =
qtests_.end();
3285 return (i == e ? 0 : i->second);
3295 raiseDQMError(
"DQMStore",
"Attempt to create duplicate quality test '%s'",
3298 QAMap::iterator
i =
qalgos_.find(algoname);
3300 raiseDQMError(
"DQMStore",
"Cannot create a quality test using unknown" 3301 " algorithm '%s'", algoname.c_str());
3321 if (cleaned->find_first_not_of(
s_safe) != std::string::npos)
3323 " uses unacceptable characters", cleaned->c_str());
3335 raiseDQMError(
"DQMStore",
"Cannot apply non-existent quality test '%s'",
3345 MEMap::iterator mi =
data_.begin();
3346 MEMap::iterator me =
data_.end();
3349 for ( ; mi != me; ++mi)
3352 mergePath(path, *mi->data_.dirname, mi->data_.objname);
3353 if (fm->match(path))
3370 std::cout <<
"DQMStore: running runQTests() with reset = " 3371 << (
reset_ ?
"true" :
"false" ) << std::endl;
3374 MEMap::iterator mi =
data_.begin();
3375 MEMap::iterator me =
data_.end();
3376 for ( ; mi != me; ++mi)
3394 MEMap::const_iterator mi =
data_.begin();
3395 MEMap::const_iterator me =
data_.end();
3396 for ( ; mi != me; ++mi)
3398 if (! cleaned->empty() && !
isSubdirectory(*cleaned, *mi->data_.dirname))
3403 else if (mi->hasWarning())
3406 && mi->hasOtherReport())
3450 std::cout <<
" ------------------------------------------------------------\n" 3451 <<
" Directory structure: \n" 3452 <<
" ------------------------------------------------------------\n";
3454 std::copy(contents.begin(), contents.end(),
3455 std::ostream_iterator<std::string>(
std::cout,
"\n"));
3457 std::cout <<
" ------------------------------------------------------------\n";
3494 MonitorElement * event_me =
get(
"Info/EventInfo/processedEvents");
3497 factor = factor/(events*1.0);
3499 MEMap::iterator mi =
data_.begin();
3500 MEMap::iterator me =
data_.end();
3501 for ( ; mi != me; ++mi)
3553 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,...)