25 #include <boost/tokenizer.hpp>
32 TPRegexp
metacharacters(
"[\\^\\$\\.\\*\\+\\?\\|\\(\\)\\{\\}\\[\\]]");
37 typedef std::vector<edm::ParameterSet> VPSet;
38 typedef std::vector<std::string>
vstring;
39 typedef boost::escaped_list_separator<char> elsc;
41 elsc commonEscapes(
"\\",
" \t",
"\'");
46 vstring effCmds = pset.
getParameter<vstring>(
"efficiency");
47 for ( vstring::const_iterator effCmd = effCmds.begin();
48 effCmd != effCmds.end(); ++effCmd )
50 if ( effCmd->empty() )
continue;
52 boost::tokenizer<elsc> tokens(*effCmd, commonEscapes);
55 for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
56 iToken != tokens.end(); ++iToken) {
57 if ( iToken->empty() )
continue;
58 args.push_back(*iToken);
61 if ( args.size() < 4 ) {
62 LogInfo(
"DQMGenericClient") <<
"Wrong input to effCmds\n";
73 const string typeName = args.size() == 4 ?
"eff" : args[4];
74 if ( typeName ==
"eff" ) opt.
type = 1;
75 else if ( typeName ==
"fake" ) opt.
type = 2;
78 efficOptions_.push_back(opt);
82 for ( VPSet::const_iterator
efficSet = efficSets.begin();
86 opt.
name =
efficSet->getUntrackedParameter<
string>(
"name");
92 const string typeName =
efficSet->getUntrackedParameter<
string>(
"typeName",
"eff");
93 if ( typeName ==
"eff" ) opt.
type = 1;
94 else if ( typeName ==
"fake" ) opt.
type = 2;
97 efficOptions_.push_back(opt);
102 for ( vstring::const_iterator profileCmd = profileCmds.begin();
103 profileCmd != profileCmds.end(); ++profileCmd )
105 if ( profileCmd->empty() )
continue;
107 boost::tokenizer<elsc> tokens(*profileCmd, commonEscapes);
110 for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
111 iToken != tokens.end(); ++iToken) {
112 if ( iToken->empty() )
continue;
113 args.push_back(*iToken);
116 if ( args.size() < 4 ) {
117 LogInfo(
"DQMGenericClient") <<
"Wrong input to profileCmds\n";
128 const string typeName = args.size() == 4 ?
"eff" : args[4];
129 if ( typeName ==
"eff" ) opt.
type = 1;
130 else if ( typeName ==
"fake" ) opt.
type = 2;
133 efficOptions_.push_back(opt);
137 for ( VPSet::const_iterator profileSet = profileSets.begin();
138 profileSet != profileSets.end(); ++profileSet )
141 opt.
name = profileSet->getUntrackedParameter<
string>(
"name");
142 opt.
title = profileSet->getUntrackedParameter<
string>(
"title");
143 opt.
numerator = profileSet->getUntrackedParameter<
string>(
"numerator");
144 opt.
denominator = profileSet->getUntrackedParameter<
string>(
"denominator");
147 const string typeName = profileSet->getUntrackedParameter<
string>(
"typeName",
"eff");
148 if ( typeName ==
"eff" ) opt.
type = 1;
149 else if ( typeName ==
"fake" ) opt.
type = 2;
152 efficOptions_.push_back(opt);
156 vstring resCmds = pset.
getParameter<vstring>(
"resolution");
157 for ( vstring::const_iterator resCmd = resCmds.begin();
158 resCmd != resCmds.end(); ++resCmd )
160 if ( resCmd->empty() )
continue;
161 boost::tokenizer<elsc> tokens(*resCmd, commonEscapes);
164 for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
165 iToken != tokens.end(); ++iToken) {
166 if ( iToken->empty() )
continue;
167 args.push_back(*iToken);
170 if ( args.size() != 3 ) {
171 LogInfo(
"DQMGenericClient") <<
"Wrong input to resCmds\n";
180 resolOptions_.push_back(opt);
184 for ( VPSet::const_iterator resolSet = resolSets.begin();
185 resolSet != resolSets.end(); ++resolSet )
188 opt.
namePrefix = resolSet->getUntrackedParameter<
string>(
"namePrefix");
189 opt.
titlePrefix = resolSet->getUntrackedParameter<
string>(
"titlePrefix");
190 opt.
srcName = resolSet->getUntrackedParameter<
string>(
"srcName");
192 resolOptions_.push_back(opt);
197 for ( vstring::const_iterator normCmd = normCmds.begin();
198 normCmd != normCmds.end(); ++normCmd )
200 if ( normCmd->empty() )
continue;
201 boost::tokenizer<elsc> tokens(*normCmd, commonEscapes);
204 for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
205 iToken != tokens.end(); ++iToken) {
206 if ( iToken->empty() )
continue;
207 args.push_back(*iToken);
210 if ( args.empty()
or args.size() > 2 ) {
211 LogInfo(
"DQMGenericClient") <<
"Wrong input to normCmds\n";
217 opt.
normHistName = args.size() == 2 ? args[1] : args[0];
219 normOptions_.push_back(opt);
223 for ( VPSet::const_iterator normSet = normSets.begin();
224 normSet != normSets.end(); ++normSet )
227 opt.
name = normSet->getUntrackedParameter<
string>(
"name");
228 opt.
normHistName = normSet->getUntrackedParameter<
string>(
"normalizedTo", opt.
name);
230 normOptions_.push_back(opt);
235 for ( vstring::const_iterator cdCmd = cdCmds.begin();
236 cdCmd != cdCmds.end(); ++cdCmd )
238 if ( cdCmd->empty() )
continue;
239 boost::tokenizer<elsc> tokens(*cdCmd, commonEscapes);
242 for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
243 iToken != tokens.end(); ++iToken) {
244 if ( iToken->empty() )
continue;
245 args.push_back(*iToken);
248 if ( args.size() != 1 ) {
249 LogInfo(
"DQMGenericClient") <<
"Wrong input to cdCmds\n";
256 cdOptions_.push_back(opt);
260 for ( VPSet::const_iterator cdSet = cdSets.begin();
261 cdSet != cdSets.end(); ++cdSet )
264 opt.
name = cdSet->getUntrackedParameter<
string>(
"name");
266 cdOptions_.push_back(opt);
273 isWildcardUsed_ =
false;
278 typedef vector<string>
vstring;
294 LogInfo(
"DQMGenericClient") <<
"Cannot create DQMStore instance\n";
299 set<string> subDirSet;
301 for(vstring::const_iterator iSubDir = subDirs_.begin();
302 iSubDir != subDirs_.end(); ++iSubDir) {
303 string subDir = *iSubDir;
305 if ( subDir[subDir.size()-1] ==
'/' ) subDir.erase(subDir.size()-1);
308 isWildcardUsed_ =
true;
311 const string searchPath = subDir.substr(0, shiftPos);
312 const string pattern = subDir.substr(shiftPos + 1, subDir.length());
315 findAllSubdirectories (searchPath, &subDirSet, pattern);
319 subDirSet.insert(subDir);
323 for(set<string>::const_iterator iSubDir = subDirSet.begin();
324 iSubDir != subDirSet.end(); ++iSubDir) {
325 const string&
dirName = *iSubDir;
327 for ( vector<EfficOption>::const_iterator efficOption = efficOptions_.begin();
328 efficOption != efficOptions_.end(); ++efficOption )
330 computeEfficiency(dirName, efficOption->name, efficOption->title,
331 efficOption->numerator, efficOption->denominator,
332 efficOption->type, efficOption->isProfile);
335 for ( vector<ResolOption>::const_iterator resolOption = resolOptions_.begin();
336 resolOption != resolOptions_.end(); ++resolOption )
338 computeResolution(dirName, resolOption->namePrefix, resolOption->titlePrefix, resolOption->srcName);
341 for ( vector<NormOption>::const_iterator normOption = normOptions_.begin();
342 normOption != normOptions_.end(); ++normOption )
344 normalizeToEntries(dirName, normOption->name, normOption->normHistName);
347 for ( vector<CDOption>::const_iterator cdOption = cdOptions_.begin();
348 cdOption != cdOptions_.end(); ++cdOption )
350 makeCumulativeDist(dirName, cdOption->name);
356 if ( ! outputFileName_.empty() ) theDQM->save(outputFileName_);
366 LogTrace (
"DQMGenericClient") <<
"inside of DQMGenericClient::endJob()"
372 const string& recoMEName,
const string& simMEName,
const int type,
const bool makeProfile)
374 if ( ! theDQM->dirExists(startDir) ) {
375 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
376 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : "
377 <<
"Cannot find sub-directory " << startDir << endl;
384 ME* simME = theDQM->get(startDir+
"/"+simMEName);
385 ME* recoME = theDQM->get(startDir+
"/"+recoMEName);
388 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
389 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : "
390 <<
"No sim-ME '" << simMEName <<
"' found\n";
396 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
397 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : "
398 <<
"No reco-ME '" << recoMEName <<
"' found\n";
405 TH1* hSim = simME ->getTH1();
406 TH1* hReco = recoME->getTH1();
408 if ( !hSim || !hReco ) {
409 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
410 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : "
411 <<
"Cannot create TH1 from ME\n";
416 string efficDir = startDir;
417 string newEfficMEName = efficMEName;
419 if ( string::npos != (shiftPos = efficMEName.rfind(
'/')) ) {
420 efficDir +=
"/"+efficMEName.substr(0, shiftPos);
421 newEfficMEName.erase(0, shiftPos+1);
423 theDQM->setCurrentFolder(efficDir);
426 TProfile * efficHist = (hReco->GetXaxis()->GetXbins()->GetSize()==0) ?
427 new TProfile(newEfficMEName.c_str(), efficMETitle.c_str(),
428 hReco->GetXaxis()->GetNbins(),
429 hReco->GetXaxis()->GetXmin(),
430 hReco->GetXaxis()->GetXmax()) :
431 new TProfile(newEfficMEName.c_str(), efficMETitle.c_str(),
432 hReco->GetXaxis()->GetNbins(),
433 hReco->GetXaxis()->GetXbins()->GetArray());
434 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,27,0)
435 for (
int i=1;
i <= hReco->GetNbinsX();
i++) {
437 const double nReco = hReco->GetBinContent(
i);
438 const double nSim = hSim->GetBinContent(
i);
439 if(nSim > INT_MAX || nSim < INT_MIN || nReco > INT_MAX || nReco < INT_MIN)
441 LogError(
"DQMGenericClient") <<
"computeEfficiency() : "
442 <<
"Overflow: bin content either too large or too small to be casted to int";
446 if ( nSim == 0 || nReco > nSim )
continue;
447 const double effVal = nReco/nSim;
449 const double errLo = TEfficiency::ClopperPearson((
int)nSim,
452 const double errUp = TEfficiency::ClopperPearson((
int)nSim,
455 const double errVal = (effVal - errLo > errUp - effVal) ? effVal - errLo : errUp - effVal;
456 efficHist->SetBinContent(
i, effVal);
457 efficHist->SetBinEntries(
i, 1);
458 efficHist->SetBinError(
i,
sqrt(effVal * effVal + errVal * errVal));
461 for (
int i=1;
i <= hReco->GetNbinsX();
i++) {
463 const double nReco = hReco->GetBinContent(
i);
464 const double nSim = hSim->GetBinContent(
i);
465 if(nSim > INT_MAX || nSim < INT_MIN || nReco > INT_MAX || nReco < INT_MIN)
467 LogError(
"DQMGenericClient") <<
"computeEfficiency() : "
468 <<
"Overflow: bin content either too large or too small to be casted to int";
472 TGraphAsymmErrorsWrapper asymm;
473 std::pair<double, double> efficiencyWithError;
474 efficiencyWithError = asymm.efficiency((
int)nReco,
476 double effVal = efficiencyWithError.first;
477 double errVal = efficiencyWithError.second;
479 efficHist->SetBinContent(
i, effVal);
480 efficHist->SetBinEntries(
i, 1);
481 efficHist->SetBinError(
i,
sqrt(effVal * effVal + errVal * errVal));
485 theDQM->bookProfile(newEfficMEName.c_str(),efficHist);
491 TH1* efficHist = (TH1*)hSim->Clone(newEfficMEName.c_str());
492 efficHist->SetTitle(efficMETitle.c_str());
501 TClass * myHistClass = efficHist->IsA();
502 TString histClassName = myHistClass->GetName();
504 if (histClassName ==
"TH1F"){
505 efficME = theDQM->book1D(newEfficMEName, (TH1F*)efficHist);
506 }
else if (histClassName ==
"TH2F"){
507 efficME = theDQM->book2D(newEfficMEName, (TH2F*)efficHist);
508 }
else if (histClassName ==
"TH3F"){
509 efficME = theDQM->book3D(newEfficMEName, (TH3F*)efficHist);
514 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : "
515 <<
"Cannot book effic-ME from the DQM\n";
523 generic_eff (hSim, hReco, efficME, type);
536 efficME->setEntries(simME->getEntries());
541 ME* globalEfficME = theDQM->get(efficDir+
"/globalEfficiencies");
542 if ( !globalEfficME ) globalEfficME = theDQM->book1D(
"globalEfficiencies",
"Global efficiencies", 1, 0, 1);
543 if ( !globalEfficME ) {
544 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : "
545 <<
"Cannot book globalEffic-ME from the DQM\n";
548 TH1F* hGlobalEffic = globalEfficME->getTH1F();
549 if ( !hGlobalEffic ) {
550 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : "
551 <<
"Cannot create TH1F from ME, globalEfficME\n";
555 const float nSimAll = hSim->GetEntries();
556 const float nRecoAll = hReco->GetEntries();
558 if ( type == 1 ) efficAll = nSimAll ? nRecoAll/nSimAll : 0;
559 else if ( type == 2 ) efficAll = nSimAll ? 1-nRecoAll/nSimAll : 0;
560 const float errorAll = nSimAll && efficAll < 1 ?
sqrt(efficAll*(1-efficAll)/nSimAll) : 0;
562 const int iBin = hGlobalEffic->Fill(newEfficMEName.c_str(), 0);
563 hGlobalEffic->SetBinContent(iBin, efficAll);
564 hGlobalEffic->SetBinError(iBin, errorAll);
570 if ( ! theDQM->dirExists(startDir) ) {
571 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
572 LogInfo(
"DQMGenericClient") <<
"computeResolution() : "
573 <<
"Cannot find sub-directory " << startDir << endl;
580 ME* srcME = theDQM->get(startDir+
"/"+srcName);
582 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
583 LogInfo(
"DQMGenericClient") <<
"computeResolution() : "
584 <<
"No source ME '" << srcName <<
"' found\n";
589 TH2F* hSrc = srcME->getTH2F();
591 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
592 LogInfo(
"DQMGenericClient") <<
"computeResolution() : "
593 <<
"Cannot create TH2F from source-ME\n";
598 const int nBin = hSrc->GetNbinsX();
600 string newDir = startDir;
601 string newPrefix = namePrefix;
603 if ( string::npos != (shiftPos = namePrefix.rfind(
'/')) ) {
604 newDir +=
"/"+namePrefix.substr(0, shiftPos);
605 newPrefix.erase(0, shiftPos+1);
608 theDQM->setCurrentFolder(newDir);
610 float * lowedgesfloats =
new float[nBin+1];
613 if (hSrc->GetXaxis()->GetXbins()->GetSize())
615 for (
int j=0;
j<nBin+1; ++
j)
616 lowedgesfloats[
j] = (
float)hSrc->GetXaxis()->GetXbins()->GetAt(
j);
617 meanME = theDQM->book1D(newPrefix+
"_Mean", titlePrefix+
" Mean", nBin, lowedgesfloats);
618 sigmaME = theDQM->book1D(newPrefix+
"_Sigma", titlePrefix+
" Sigma", nBin, lowedgesfloats);
622 meanME = theDQM->book1D(newPrefix+
"_Mean", titlePrefix+
" Mean", nBin,
623 hSrc->GetXaxis()->GetXmin(),
624 hSrc->GetXaxis()->GetXmax());
625 sigmaME = theDQM->book1D(newPrefix+
"_Sigma", titlePrefix+
" Sigma", nBin,
626 hSrc->GetXaxis()->GetXmin(),
627 hSrc->GetXaxis()->GetXmax());
630 if (meanME && sigmaME)
632 meanME->setEfficiencyFlag();
633 sigmaME->setEfficiencyFlag();
635 if (! resLimitedFit_ ) {
641 limitedFit(srcME,meanME,sigmaME);
644 delete[] lowedgesfloats;
649 if ( ! theDQM->dirExists(startDir) ) {
650 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
651 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : "
652 <<
"Cannot find sub-directory " << startDir << endl;
659 ME* element = theDQM->get(startDir+
"/"+histName);
660 ME* normME = theDQM->get(startDir+
"/"+normHistName);
663 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
664 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : "
665 <<
"No such element '" << histName <<
"' found\n";
671 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
672 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : "
673 <<
"No such element '" << normHistName <<
"' found\n";
678 TH1F*
hist = element->getTH1F();
680 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
681 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : "
682 <<
"Cannot create TH1F from ME\n";
687 TH1F* normHist = normME->getTH1F();
689 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
690 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : "
691 <<
"Cannot create TH1F from ME\n";
696 const double entries = normHist->GetEntries();
697 if ( entries != 0 ) {
698 hist->Scale(1./entries);
701 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : "
702 <<
"Zero entries in histogram\n";
710 if ( ! theDQM->dirExists(startDir) ) {
711 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
712 LogInfo(
"DQMGenericClient") <<
"makeCumulativeDist() : "
713 <<
"Cannot find sub-directory " << startDir << endl;
720 ME* element_cd = theDQM->get(startDir+
"/"+cdName);
723 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
724 LogInfo(
"DQMGenericClient") <<
"makeCumulativeDist() : "
725 <<
"No such element '" << cdName <<
"' found\n";
730 TH1F* cd = element_cd->getTH1F();
733 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
734 LogInfo(
"DQMGenericClient") <<
"makeCumulativeDist() : "
735 <<
"Cannot create TH1F from ME\n";
740 int n_bins = cd->GetNbinsX() + 1;
742 for (
int i = 1;
i <= n_bins;
i++) {
743 cd->SetBinContent(
i,cd->GetBinContent(
i) + cd->GetBinContent(
i-1));
757 double cont_min = 100;
758 Int_t binx = histo->GetXaxis()->GetNbins();
760 for (
int i = 1; i <= binx ; i++) {
762 TH1 *histoY = histo->ProjectionY(
" ", i, i);
763 double cont = histoY->GetEntries();
765 if (cont >= cont_min) {
766 float minfit = histoY->GetMean() - histoY->GetRMS();
767 float maxfit = histoY->GetMean() + histoY->GetRMS();
769 TF1 *fitFcn =
new TF1(TString(
"g")+histo->GetName()+iString,
"gaus",minfit,maxfit);
771 fitFcn->GetRange(x1,x2);
773 histoY->Fit(fitFcn,
"QR0",
"",x1,x2);
776 double *par = fitFcn->GetParameters();
777 double *err = fitFcn->GetParErrors();
789 if(fitFcn)
delete fitFcn;
790 if(histoY)
delete histoY;
793 if(histoY)
delete histoY;
803 if (!theDQM->dirExists(dir)) {
804 LogError(
"DQMGenericClient") <<
" DQMGenericClient::findAllSubdirectories ==> Missing folder " << dir <<
" !!!";
809 TPRegexp regexp(pattern);
811 vector <string> foundDirs = theDQM->getSubdirs();
812 for(vector<string>::const_iterator iDir = foundDirs.begin();
813 iDir != foundDirs.end(); ++iDir) {
814 TString
dirName = iDir->substr(iDir->rfind(
'/') + 1, iDir->length());
815 if (dirName.Contains(regexp))
816 findAllSubdirectories ( *iDir, myList);
820 else if (theDQM->dirExists(dir)){
825 findAllSubdirectories (dir, myList,
"*");
829 LogInfo (
"DQMGenericClient") <<
"Trying to find sub-directories of " << dir
830 <<
" failed because " << dir <<
" does not exist";
838 for (
int iBinX = 1; iBinX < denom->GetNbinsX()+1; iBinX++){
839 for (
int iBinY = 1; iBinY < denom->GetNbinsY()+1; iBinY++){
840 for (
int iBinZ = 1; iBinZ < denom->GetNbinsZ()+1; iBinZ++){
842 int globalBinNum = denom->GetBin(iBinX, iBinY, iBinZ);
844 float numerVal = numer->GetBinContent(globalBinNum);
845 float denomVal = denom->GetBinContent(globalBinNum);
851 effVal = denomVal ? (1 - numerVal / denomVal) : 0;
853 effVal = denomVal ? numerVal / denomVal : 0;
856 float errVal = (denomVal && (effVal <=1)) ?
sqrt(effVal*(1-effVal)/denomVal) : 0;
858 LogDebug (
"DQMGenericClient") <<
"(iBinX, iBinY, iBinZ) = "
861 << iBinZ <<
"), global bin = " << globalBinNum
862 <<
"eff = " << numerVal <<
" / " << denomVal
864 <<
" ... setting the error for that bin ... " << endl
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
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
TPRegexp metacharacters("[\\^\\$\\.\\*\\+\\?\\|\\(\\)\\{\\}\\[\\]]")
void endRun(const edm::Run &r, const edm::EventSetup &c)
EndRun.
void makeCumulativeDist(const std::string &startDir, const std::string &cdName)
void computeResolution(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)
void findAllSubdirectories(std::string dir, std::set< std::string > *myList, const TString &pattern)
TPRegexp nonPerlWildcard("\\w\\*|^\\*")
void computeEfficiency(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 setEfficiencyFlag(void)
DQMGenericClient(const edm::ParameterSet &pset)
TH2F * getTH2F(void) const
void normalizeToEntries(const std::string &startDir, const std::string &histName, const std::string &normHistName)
void limitedFit(MonitorElement *srcME, MonitorElement *meanME, MonitorElement *sigmaME)
void generic_eff(TH1 *denom, TH1 *numer, MonitorElement *efficiencyHist, const int type=1)