24 #include <boost/tokenizer.hpp>
31 TPRegexp
metacharacters(
"[\\^\\$\\.\\*\\+\\?\\|\\(\\)\\{\\}\\[\\]]");
36 typedef std::vector<edm::ParameterSet> VPSet;
37 typedef std::vector<std::string>
vstring;
38 typedef boost::escaped_list_separator<char> elsc;
40 elsc commonEscapes(
"\\",
" \t",
"\'");
45 vstring effCmds = pset.
getParameter<vstring>(
"efficiency");
46 for ( vstring::const_iterator effCmd = effCmds.begin();
47 effCmd != effCmds.end(); ++effCmd )
49 if ( effCmd->empty() )
continue;
51 boost::tokenizer<elsc> tokens(*effCmd, commonEscapes);
54 for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
55 iToken != tokens.end(); ++iToken) {
56 if ( iToken->empty() )
continue;
57 args.push_back(*iToken);
60 if ( args.size() < 4 ) {
61 LogInfo(
"DQMGenericClient") <<
"Wrong input to effCmds\n";
72 const string typeName = args.size() == 4 ?
"eff" : args[4];
73 if ( typeName ==
"eff" ) opt.
type = 1;
74 else if ( typeName ==
"fake" ) opt.
type = 2;
77 efficOptions_.push_back(opt);
81 for ( VPSet::const_iterator
efficSet = efficSets.begin();
85 opt.
name =
efficSet->getUntrackedParameter<
string>(
"name");
91 const string typeName =
efficSet->getUntrackedParameter<
string>(
"typeName",
"eff");
92 if ( typeName ==
"eff" ) opt.
type = 1;
93 else if ( typeName ==
"fake" ) opt.
type = 2;
96 efficOptions_.push_back(opt);
101 for ( vstring::const_iterator profileCmd = profileCmds.begin();
102 profileCmd != profileCmds.end(); ++profileCmd )
104 if ( profileCmd->empty() )
continue;
106 boost::tokenizer<elsc> tokens(*profileCmd, commonEscapes);
109 for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
110 iToken != tokens.end(); ++iToken) {
111 if ( iToken->empty() )
continue;
112 args.push_back(*iToken);
115 if ( args.size() < 4 ) {
116 LogInfo(
"DQMGenericClient") <<
"Wrong input to profileCmds\n";
127 const string typeName = args.size() == 4 ?
"eff" : args[4];
128 if ( typeName ==
"eff" ) opt.
type = 1;
129 else if ( typeName ==
"fake" ) opt.
type = 2;
132 efficOptions_.push_back(opt);
136 for ( VPSet::const_iterator profileSet = profileSets.begin();
137 profileSet != profileSets.end(); ++profileSet )
140 opt.
name = profileSet->getUntrackedParameter<
string>(
"name");
141 opt.
title = profileSet->getUntrackedParameter<
string>(
"title");
142 opt.
numerator = profileSet->getUntrackedParameter<
string>(
"numerator");
143 opt.
denominator = profileSet->getUntrackedParameter<
string>(
"denominator");
146 const string typeName = profileSet->getUntrackedParameter<
string>(
"typeName",
"eff");
147 if ( typeName ==
"eff" ) opt.
type = 1;
148 else if ( typeName ==
"fake" ) opt.
type = 2;
151 efficOptions_.push_back(opt);
155 vstring resCmds = pset.
getParameter<vstring>(
"resolution");
156 for ( vstring::const_iterator resCmd = resCmds.begin();
157 resCmd != resCmds.end(); ++resCmd )
159 if ( resCmd->empty() )
continue;
160 boost::tokenizer<elsc> tokens(*resCmd, commonEscapes);
163 for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
164 iToken != tokens.end(); ++iToken) {
165 if ( iToken->empty() )
continue;
166 args.push_back(*iToken);
169 if ( args.size() != 3 ) {
170 LogInfo(
"DQMGenericClient") <<
"Wrong input to resCmds\n";
179 resolOptions_.push_back(opt);
183 for ( VPSet::const_iterator resolSet = resolSets.begin();
184 resolSet != resolSets.end(); ++resolSet )
187 opt.
namePrefix = resolSet->getUntrackedParameter<
string>(
"namePrefix");
188 opt.
titlePrefix = resolSet->getUntrackedParameter<
string>(
"titlePrefix");
189 opt.
srcName = resolSet->getUntrackedParameter<
string>(
"srcName");
191 resolOptions_.push_back(opt);
196 for ( vstring::const_iterator normCmd = normCmds.begin();
197 normCmd != normCmds.end(); ++normCmd )
199 if ( normCmd->empty() )
continue;
200 boost::tokenizer<elsc> tokens(*normCmd, commonEscapes);
203 for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
204 iToken != tokens.end(); ++iToken) {
205 if ( iToken->empty() )
continue;
206 args.push_back(*iToken);
209 if ( args.empty()
or args.size() > 2 ) {
210 LogInfo(
"DQMGenericClient") <<
"Wrong input to normCmds\n";
216 opt.
normHistName = args.size() == 2 ? args[1] : args[0];
218 normOptions_.push_back(opt);
222 for ( VPSet::const_iterator normSet = normSets.begin();
223 normSet != normSets.end(); ++normSet )
226 opt.
name = normSet->getUntrackedParameter<
string>(
"name");
227 opt.
normHistName = normSet->getUntrackedParameter<
string>(
"normalizedTo", opt.
name);
229 normOptions_.push_back(opt);
234 for ( vstring::const_iterator cdCmd = cdCmds.begin();
235 cdCmd != cdCmds.end(); ++cdCmd )
237 if ( cdCmd->empty() )
continue;
238 boost::tokenizer<elsc> tokens(*cdCmd, commonEscapes);
241 for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
242 iToken != tokens.end(); ++iToken) {
243 if ( iToken->empty() )
continue;
244 args.push_back(*iToken);
247 if ( args.size() != 1 ) {
248 LogInfo(
"DQMGenericClient") <<
"Wrong input to cdCmds\n";
255 cdOptions_.push_back(opt);
259 for ( VPSet::const_iterator cdSet = cdSets.begin();
260 cdSet != cdSets.end(); ++cdSet )
263 opt.
name = cdSet->getUntrackedParameter<
string>(
"name");
265 cdOptions_.push_back(opt);
272 isWildcardUsed_ =
false;
277 typedef vector<string>
vstring;
298 set<string> subDirSet;
300 for(vstring::const_iterator iSubDir = subDirs_.begin();
301 iSubDir != subDirs_.end(); ++iSubDir) {
302 string subDir = *iSubDir;
304 if ( subDir[subDir.size()-1] ==
'/' ) subDir.erase(subDir.size()-1);
307 isWildcardUsed_ =
true;
310 const string searchPath = subDir.substr(0, shiftPos);
311 const string pattern = subDir.substr(shiftPos + 1, subDir.length());
314 findAllSubdirectories (ibooker, igetter, searchPath, &subDirSet, pattern);
318 subDirSet.insert(subDir);
322 for(set<string>::const_iterator iSubDir = subDirSet.begin();
323 iSubDir != subDirSet.end(); ++iSubDir) {
324 const string&
dirName = *iSubDir;
326 for ( vector<EfficOption>::const_iterator efficOption = efficOptions_.begin();
327 efficOption != efficOptions_.end(); ++efficOption )
329 computeEfficiency(ibooker, igetter, dirName, efficOption->name, efficOption->title,
330 efficOption->numerator, efficOption->denominator,
331 efficOption->type, efficOption->isProfile);
334 for ( vector<ResolOption>::const_iterator resolOption = resolOptions_.begin();
335 resolOption != resolOptions_.end(); ++resolOption )
337 computeResolution(ibooker, igetter, dirName, resolOption->namePrefix, resolOption->titlePrefix, resolOption->srcName);
340 for ( vector<NormOption>::const_iterator normOption = normOptions_.begin();
341 normOption != normOptions_.end(); ++normOption )
343 normalizeToEntries(ibooker, igetter, dirName, normOption->name, normOption->normHistName);
346 for ( vector<CDOption>::const_iterator cdOption = cdOptions_.begin();
347 cdOption != cdOptions_.end(); ++cdOption )
349 makeCumulativeDist(ibooker, igetter, dirName, cdOption->name);
353 if ( ! outputFileName_.empty() ) theDQM->save(outputFileName_);
358 const string& efficMETitle,
const string& recoMEName,
const string& simMEName,
const int type,
const bool makeProfile)
361 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
362 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : "
363 <<
"Cannot find sub-directory " << startDir << endl;
370 ME* simME = igetter.
get(startDir+
"/"+simMEName);
371 ME* recoME = igetter.
get(startDir+
"/"+recoMEName);
374 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
375 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : "
376 <<
"No sim-ME '" << simMEName <<
"' found\n";
382 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
383 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : "
384 <<
"No reco-ME '" << recoMEName <<
"' found\n";
391 TH1* hSim = simME ->getTH1();
392 TH1* hReco = recoME->getTH1();
394 if ( !hSim || !hReco ) {
395 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
396 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : "
397 <<
"Cannot create TH1 from ME\n";
402 string efficDir = startDir;
403 string newEfficMEName = efficMEName;
405 if ( string::npos != (shiftPos = efficMEName.rfind(
'/')) ) {
406 efficDir +=
"/"+efficMEName.substr(0, shiftPos);
407 newEfficMEName.erase(0, shiftPos+1);
412 TProfile * efficHist = (hReco->GetXaxis()->GetXbins()->GetSize()==0) ?
413 new TProfile(newEfficMEName.c_str(), efficMETitle.c_str(),
414 hReco->GetXaxis()->GetNbins(),
415 hReco->GetXaxis()->GetXmin(),
416 hReco->GetXaxis()->GetXmax()) :
417 new TProfile(newEfficMEName.c_str(), efficMETitle.c_str(),
418 hReco->GetXaxis()->GetNbins(),
419 hReco->GetXaxis()->GetXbins()->GetArray());
421 efficHist->GetXaxis()->SetTitle(hSim->GetXaxis()->GetTitle());
422 efficHist->GetYaxis()->SetTitle(hSim->GetYaxis()->GetTitle());
424 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,27,0)
425 for (
int i=1;
i <= hReco->GetNbinsX();
i++) {
427 const double nReco = hReco->GetBinContent(
i);
428 const double nSim = hSim->GetBinContent(
i);
429 if(nSim > INT_MAX || nSim < INT_MIN || nReco > INT_MAX || nReco < INT_MIN)
431 LogError(
"DQMGenericClient") <<
"computeEfficiency() : "
432 <<
"Overflow: bin content either too large or too small to be casted to int";
437 efficHist->GetXaxis()->SetBinLabel(
i, hSim->GetXaxis()->GetBinLabel(
i));
439 if ( nSim == 0 || nReco > nSim )
continue;
440 const double effVal = nReco/nSim;
442 const double errLo = TEfficiency::ClopperPearson((
int)nSim,
445 const double errUp = TEfficiency::ClopperPearson((
int)nSim,
448 const double errVal = (effVal - errLo > errUp - effVal) ? effVal - errLo : errUp - effVal;
449 efficHist->SetBinContent(
i, effVal);
450 efficHist->SetBinEntries(
i, 1);
451 efficHist->SetBinError(
i,
sqrt(effVal * effVal + errVal * errVal));
454 for (
int i=1;
i <= hReco->GetNbinsX();
i++) {
456 const double nReco = hReco->GetBinContent(
i);
457 const double nSim = hSim->GetBinContent(
i);
458 if(nSim > INT_MAX || nSim < INT_MIN || nReco > INT_MAX || nReco < INT_MIN)
460 LogError(
"DQMGenericClient") <<
"computeEfficiency() : "
461 <<
"Overflow: bin content either too large or too small to be casted to int";
465 TGraphAsymmErrorsWrapper asymm;
466 std::pair<double, double> efficiencyWithError;
467 efficiencyWithError = asymm.efficiency((
int)nReco,
469 double effVal = efficiencyWithError.first;
470 double errVal = efficiencyWithError.second;
472 efficHist->SetBinContent(
i, effVal);
473 efficHist->SetBinEntries(
i, 1);
474 efficHist->SetBinError(
i,
sqrt(effVal * effVal + errVal * errVal));
477 efficHist->GetXaxis()->SetBinLabel(
i, hSim->GetXaxis()->GetBinLabel(
i));
480 ibooker.
bookProfile(newEfficMEName.c_str(),efficHist);
486 TH1* efficHist = (TH1*)hSim->Clone(newEfficMEName.c_str());
487 efficHist->SetTitle(efficMETitle.c_str());
496 TClass * myHistClass = efficHist->IsA();
497 TString histClassName = myHistClass->GetName();
499 if (histClassName ==
"TH1F"){
500 efficME = ibooker.
book1D(newEfficMEName, (TH1F*)efficHist);
501 }
else if (histClassName ==
"TH2F"){
502 efficME = ibooker.
book2D(newEfficMEName, (TH2F*)efficHist);
503 }
else if (histClassName ==
"TH3F"){
504 efficME = ibooker.
book3D(newEfficMEName, (TH3F*)efficHist);
509 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : "
510 <<
"Cannot book effic-ME from the DQM\n";
518 generic_eff (hSim, hReco, efficME, type);
531 efficME->setEntries(simME->getEntries());
536 ME* globalEfficME = igetter.
get(efficDir+
"/globalEfficiencies");
537 if ( !globalEfficME ) globalEfficME = ibooker.
book1D(
"globalEfficiencies",
"Global efficiencies", 1, 0, 1);
538 if ( !globalEfficME ) {
539 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : "
540 <<
"Cannot book globalEffic-ME from the DQM\n";
543 TH1F* hGlobalEffic = globalEfficME->getTH1F();
544 if ( !hGlobalEffic ) {
545 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : "
546 <<
"Cannot create TH1F from ME, globalEfficME\n";
550 const float nSimAll = hSim->GetEntries();
551 const float nRecoAll = hReco->GetEntries();
553 if ( type == 1 ) efficAll = nSimAll ? nRecoAll/nSimAll : 0;
554 else if ( type == 2 ) efficAll = nSimAll ? 1-nRecoAll/nSimAll : 0;
555 const float errorAll = nSimAll && efficAll < 1 ?
sqrt(efficAll*(1-efficAll)/nSimAll) : 0;
557 const int iBin = hGlobalEffic->Fill(newEfficMEName.c_str(), 0);
558 hGlobalEffic->SetBinContent(iBin, efficAll);
559 hGlobalEffic->SetBinError(iBin, errorAll);
566 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
567 LogInfo(
"DQMGenericClient") <<
"computeResolution() : "
568 <<
"Cannot find sub-directory " << startDir << endl;
575 ME* srcME = igetter.
get(startDir+
"/"+srcName);
577 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
578 LogInfo(
"DQMGenericClient") <<
"computeResolution() : "
579 <<
"No source ME '" << srcName <<
"' found\n";
584 TH2F* hSrc = srcME->getTH2F();
586 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
587 LogInfo(
"DQMGenericClient") <<
"computeResolution() : "
588 <<
"Cannot create TH2F from source-ME\n";
593 const int nBin = hSrc->GetNbinsX();
595 string newDir = startDir;
596 string newPrefix = namePrefix;
598 if ( string::npos != (shiftPos = namePrefix.rfind(
'/')) ) {
599 newDir +=
"/"+namePrefix.substr(0, shiftPos);
600 newPrefix.erase(0, shiftPos+1);
605 float * lowedgesfloats =
new float[nBin+1];
608 if (hSrc->GetXaxis()->GetXbins()->GetSize())
610 for (
int j=0;
j<nBin+1; ++
j)
611 lowedgesfloats[
j] = (
float)hSrc->GetXaxis()->GetXbins()->GetAt(
j);
612 meanME = ibooker.
book1D(newPrefix+
"_Mean", titlePrefix+
" Mean", nBin, lowedgesfloats);
613 sigmaME = ibooker.
book1D(newPrefix+
"_Sigma", titlePrefix+
" Sigma", nBin, lowedgesfloats);
617 meanME = ibooker.
book1D(newPrefix+
"_Mean", titlePrefix+
" Mean", nBin,
618 hSrc->GetXaxis()->GetXmin(),
619 hSrc->GetXaxis()->GetXmax());
620 sigmaME = ibooker.
book1D(newPrefix+
"_Sigma", titlePrefix+
" Sigma", nBin,
621 hSrc->GetXaxis()->GetXmin(),
622 hSrc->GetXaxis()->GetXmax());
625 if (meanME && sigmaME)
627 meanME->setEfficiencyFlag();
628 sigmaME->setEfficiencyFlag();
630 if (! resLimitedFit_ ) {
636 limitedFit(srcME,meanME,sigmaME);
639 delete[] lowedgesfloats;
646 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
647 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : "
648 <<
"Cannot find sub-directory " << startDir << endl;
655 ME* element = igetter.
get(startDir+
"/"+histName);
656 ME* normME = igetter.
get(startDir+
"/"+normHistName);
659 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
660 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : "
661 <<
"No such element '" << histName <<
"' found\n";
667 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
668 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : "
669 <<
"No such element '" << normHistName <<
"' found\n";
674 TH1F*
hist = element->getTH1F();
676 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
677 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : "
678 <<
"Cannot create TH1F from ME\n";
683 TH1F* normHist = normME->getTH1F();
685 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
686 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : "
687 <<
"Cannot create TH1F from ME\n";
692 const double entries = normHist->GetEntries();
693 if ( entries != 0 ) {
694 hist->Scale(1./entries);
697 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : "
698 <<
"Zero entries in histogram\n";
707 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
708 LogInfo(
"DQMGenericClient") <<
"makeCumulativeDist() : "
709 <<
"Cannot find sub-directory " << startDir << endl;
716 ME* element_cd = igetter.
get(startDir+
"/"+cdName);
719 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
720 LogInfo(
"DQMGenericClient") <<
"makeCumulativeDist() : "
721 <<
"No such element '" << cdName <<
"' found\n";
726 TH1F* cd = element_cd->getTH1F();
729 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
730 LogInfo(
"DQMGenericClient") <<
"makeCumulativeDist() : "
731 <<
"Cannot create TH1F from ME\n";
736 int n_bins = cd->GetNbinsX() + 1;
738 for (
int i = 1;
i <= n_bins;
i++) {
739 cd->SetBinContent(
i,cd->GetBinContent(
i) + cd->GetBinContent(
i-1));
753 double cont_min = 100;
754 Int_t binx = histo->GetXaxis()->GetNbins();
756 for (
int i = 1; i <= binx ; i++) {
758 TH1 *histoY = histo->ProjectionY(
" ", i, i);
759 double cont = histoY->GetEntries();
761 if (cont >= cont_min) {
762 float minfit = histoY->GetMean() - histoY->GetRMS();
763 float maxfit = histoY->GetMean() + histoY->GetRMS();
765 TF1 *fitFcn =
new TF1(TString(
"g")+histo->GetName()+iString,
"gaus",minfit,maxfit);
767 fitFcn->GetRange(x1,x2);
769 histoY->Fit(fitFcn,
"QR0",
"",x1,x2);
772 double *par = fitFcn->GetParameters();
773 double *err = fitFcn->GetParErrors();
785 if(fitFcn)
delete fitFcn;
786 if(histoY)
delete histoY;
789 if(histoY)
delete histoY;
798 const TString& _pattern = TString(
"")) {
801 LogError(
"DQMGenericClient") <<
" DQMGenericClient::findAllSubdirectories ==> Missing folder " << dir <<
" !!!";
806 TPRegexp regexp(pattern);
808 vector <string> foundDirs = igetter.
getSubdirs();
809 for(vector<string>::const_iterator iDir = foundDirs.begin();
810 iDir != foundDirs.end(); ++iDir) {
811 TString
dirName = iDir->substr(iDir->rfind(
'/') + 1, iDir->length());
812 if (dirName.Contains(regexp))
813 findAllSubdirectories (ibooker, igetter, *iDir, myList);
822 findAllSubdirectories (ibooker, igetter, dir, myList,
"*");
826 LogInfo (
"DQMGenericClient") <<
"Trying to find sub-directories of " << dir
827 <<
" failed because " << dir <<
" does not exist";
835 for (
int iBinX = 1; iBinX < denom->GetNbinsX()+1; iBinX++){
836 for (
int iBinY = 1; iBinY < denom->GetNbinsY()+1; iBinY++){
837 for (
int iBinZ = 1; iBinZ < denom->GetNbinsZ()+1; iBinZ++){
839 int globalBinNum = denom->GetBin(iBinX, iBinY, iBinZ);
841 float numerVal = numer->GetBinContent(globalBinNum);
842 float denomVal = denom->GetBinContent(globalBinNum);
848 effVal = denomVal ? (1 - numerVal / denomVal) : 0;
850 effVal = denomVal ? numerVal / denomVal : 0;
853 float errVal = (denomVal && (effVal <=1)) ?
sqrt(effVal*(1-effVal)/denomVal) : 0;
855 LogDebug (
"DQMGenericClient") <<
"(iBinX, iBinY, iBinZ) = "
858 << iBinZ <<
"), global bin = " << globalBinNum
859 <<
"eff = " << numerVal <<
" / " << denomVal
861 <<
" ... setting the error for that bin ... " << endl
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
void dqmEndJob(DQMStore::IBooker &, DQMStore::IGetter &) override
void setBinContent(int binx, double content)
set content of bin (1-D)
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
MonitorElement * bookProfile(Args &&...args)
MonitorElement * get(const std::string &path)
TPRegexp metacharacters("[\\^\\$\\.\\*\\+\\?\\|\\(\\)\\{\\}\\[\\]]")
void normalizeToEntries(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, const std::string &startDir, const std::string &histName, const std::string &normHistName)
MonitorElement * book1D(Args &&...args)
void computeResolution(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, const std::string &startDir, const std::string &fitMEPrefix, const std::string &fitMETitlePrefix, const std::string &srcMEName)
void setBinError(int binx, double error)
set uncertainty on content of bin (1-D)
bool dirExists(const std::string &path)
void findAllSubdirectories(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, std::string dir, std::set< std::string > *myList, const TString &pattern)
void setCurrentFolder(const std::string &fullpath)
MonitorElement * book2D(Args &&...args)
std::vector< std::string > getSubdirs(void)
TPRegexp nonPerlWildcard("\\w\\*|^\\*")
void computeEfficiency(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, const std::string &startDir, const std::string &efficMEName, const std::string &efficMETitle, const std::string &recoMEName, const std::string &simMEName, const int type=1, const bool makeProfile=false)
void makeCumulativeDist(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, const std::string &startDir, const std::string &cdName)
void setEfficiencyFlag(void)
DQMGenericClient(const edm::ParameterSet &pset)
TH2F * getTH2F(void) const
MonitorElement * book3D(Args &&...args)
void limitedFit(MonitorElement *srcME, MonitorElement *meanME, MonitorElement *sigmaME)
void generic_eff(TH1 *denom, TH1 *numer, MonitorElement *efficiencyHist, const int type=1)