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];
74 else if ( typeName ==
"fake" ) opt.
type = EfficType::fakerate;
75 else if ( typeName ==
"simpleratio" ) opt.
type = EfficType::simpleratio;
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");
94 else if ( typeName ==
"fake" ) opt.
type = EfficType::fakerate;
95 else if ( typeName ==
"simpleratio" ) opt.
type = EfficType::simpleratio;
98 efficOptions_.push_back(opt);
103 for ( vstring::const_iterator effProfileCmd = effProfileCmds.begin();
104 effProfileCmd != effProfileCmds.end(); ++effProfileCmd )
106 if ( effProfileCmd->empty() )
continue;
108 boost::tokenizer<elsc> tokens(*effProfileCmd, commonEscapes);
111 for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
112 iToken != tokens.end(); ++iToken) {
113 if ( iToken->empty() )
continue;
114 args.push_back(*iToken);
117 if ( args.size() < 4 ) {
118 LogInfo(
"DQMGenericClient") <<
"Wrong input to effProfileCmds\n";
129 const string typeName = args.size() == 4 ?
"eff" : args[4];
131 else if ( typeName ==
"fake" ) opt.
type = EfficType::fakerate;
132 else if ( typeName ==
"simpleratio" ) opt.
type = EfficType::simpleratio;
135 efficOptions_.push_back(opt);
139 for ( VPSet::const_iterator effProfileSet = effProfileSets.begin();
140 effProfileSet != effProfileSets.end(); ++effProfileSet )
143 opt.
name = effProfileSet->getUntrackedParameter<
string>(
"name");
144 opt.
title = effProfileSet->getUntrackedParameter<
string>(
"title");
145 opt.
numerator = effProfileSet->getUntrackedParameter<
string>(
"numerator");
146 opt.
denominator = effProfileSet->getUntrackedParameter<
string>(
"denominator");
149 const string typeName = effProfileSet->getUntrackedParameter<
string>(
"typeName",
"eff");
151 else if ( typeName ==
"fake" ) opt.
type = EfficType::fakerate;
152 else if ( typeName ==
"simpleratio" ) opt.
type = EfficType::simpleratio;
155 efficOptions_.push_back(opt);
159 vstring resCmds = pset.
getParameter<vstring>(
"resolution");
160 for ( vstring::const_iterator resCmd = resCmds.begin();
161 resCmd != resCmds.end(); ++resCmd )
163 if ( resCmd->empty() )
continue;
164 boost::tokenizer<elsc> tokens(*resCmd, commonEscapes);
167 for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
168 iToken != tokens.end(); ++iToken) {
169 if ( iToken->empty() )
continue;
170 args.push_back(*iToken);
173 if ( args.size() != 3 ) {
174 LogInfo(
"DQMGenericClient") <<
"Wrong input to resCmds\n";
183 resolOptions_.push_back(opt);
187 for ( VPSet::const_iterator resolSet = resolSets.begin();
188 resolSet != resolSets.end(); ++resolSet )
191 opt.
namePrefix = resolSet->getUntrackedParameter<
string>(
"namePrefix");
192 opt.
titlePrefix = resolSet->getUntrackedParameter<
string>(
"titlePrefix");
193 opt.
srcName = resolSet->getUntrackedParameter<
string>(
"srcName");
195 resolOptions_.push_back(opt);
200 for(
const auto& profileCmd: profileCmds) {
201 boost::tokenizer<elsc> tokens(profileCmd, 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.size() != 3 ) {
211 LogInfo(
"DQMGenericClient") <<
"Wrong input to profileCmds\n";
220 profileOptions_.push_back(opt);
224 for(
const auto& profileSet: profileSets) {
226 opt.
name = profileSet.getUntrackedParameter<
string>(
"name");
227 opt.
title = profileSet.getUntrackedParameter<
string>(
"title");
228 opt.
srcName = profileSet.getUntrackedParameter<
string>(
"srcName");
230 profileOptions_.push_back(opt);
235 for ( vstring::const_iterator normCmd = normCmds.begin();
236 normCmd != normCmds.end(); ++normCmd )
238 if ( normCmd->empty() )
continue;
239 boost::tokenizer<elsc> tokens(*normCmd, 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.empty()
or args.size() > 2 ) {
249 LogInfo(
"DQMGenericClient") <<
"Wrong input to normCmds\n";
255 opt.
normHistName = args.size() == 2 ? args[1] : args[0];
257 normOptions_.push_back(opt);
261 for ( VPSet::const_iterator normSet = normSets.begin();
262 normSet != normSets.end(); ++normSet )
265 opt.
name = normSet->getUntrackedParameter<
string>(
"name");
266 opt.
normHistName = normSet->getUntrackedParameter<
string>(
"normalizedTo", opt.
name);
268 normOptions_.push_back(opt);
273 for ( vstring::const_iterator cdCmd = cdCmds.begin();
274 cdCmd != cdCmds.end(); ++cdCmd )
276 if ( cdCmd->empty() )
continue;
277 boost::tokenizer<elsc> tokens(*cdCmd, commonEscapes);
280 for(boost::tokenizer<elsc>::const_iterator iToken = tokens.begin();
281 iToken != tokens.end(); ++iToken) {
282 if ( iToken->empty() )
continue;
283 args.push_back(*iToken);
286 if ( args.empty() || args.size() > 2) {
287 LogInfo(
"DQMGenericClient") <<
"Wrong input to cdCmds\n";
293 opt.
ascending = args.size() == 2 ? (args[1] !=
"descending") :
true;
295 cdOptions_.push_back(opt);
299 for ( VPSet::const_iterator cdSet = cdSets.begin();
300 cdSet != cdSets.end(); ++cdSet )
303 opt.
name = cdSet->getUntrackedParameter<
string>(
"name");
304 opt.
ascending = cdSet->getUntrackedParameter<
bool>(
"ascending",
true);
306 cdOptions_.push_back(opt);
313 isWildcardUsed_ =
false;
318 typedef vector<string>
vstring;
339 set<string> subDirSet;
341 for(vstring::const_iterator iSubDir = subDirs_.begin();
342 iSubDir != subDirs_.end(); ++iSubDir) {
345 if ( subDir[subDir.size()-1] ==
'/' ) subDir.erase(subDir.size()-1);
348 isWildcardUsed_ =
true;
351 const string searchPath = subDir.substr(0, shiftPos);
352 const string pattern = subDir.substr(shiftPos + 1, subDir.length());
355 findAllSubdirectories (ibooker, igetter, searchPath, &subDirSet, pattern);
359 subDirSet.insert(subDir);
363 for(set<string>::const_iterator iSubDir = subDirSet.begin();
364 iSubDir != subDirSet.end(); ++iSubDir) {
365 const string&
dirName = *iSubDir;
369 for ( vector<NormOption>::const_iterator normOption = normOptions_.begin();
370 normOption != normOptions_.end(); ++normOption )
372 normalizeToEntries(ibooker, igetter, dirName, normOption->name, normOption->normHistName);
375 for ( vector<CDOption>::const_iterator cdOption = cdOptions_.begin();
376 cdOption != cdOptions_.end(); ++cdOption )
378 makeCumulativeDist(ibooker, igetter, dirName, cdOption->name, cdOption->ascending);
381 for ( vector<EfficOption>::const_iterator efficOption = efficOptions_.begin();
382 efficOption != efficOptions_.end(); ++efficOption )
384 computeEfficiency(ibooker, igetter, dirName, efficOption->name, efficOption->title,
385 efficOption->numerator, efficOption->denominator,
386 efficOption->type, efficOption->isProfile);
389 for ( vector<ResolOption>::const_iterator resolOption = resolOptions_.begin();
390 resolOption != resolOptions_.end(); ++resolOption )
392 computeResolution(ibooker, igetter, dirName, resolOption->namePrefix, resolOption->titlePrefix, resolOption->srcName);
395 for(
const auto& profileOption: profileOptions_) {
396 computeProfile(ibooker, igetter, dirName, profileOption.name, profileOption.title, profileOption.srcName);
401 if ( ! outputFileName_.empty() ) theDQM->save(outputFileName_);
406 const string& efficMETitle,
const string& recoMEName,
const string& simMEName,
const EfficType type,
const bool makeProfile)
409 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
410 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : " 411 <<
"Cannot find sub-directory " << startDir << endl;
418 ME* simME = igetter.
get(startDir+
"/"+simMEName);
419 ME* recoME = igetter.
get(startDir+
"/"+recoMEName);
422 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
423 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : " 424 <<
"No sim-ME '" << simMEName <<
"' found\n";
430 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
431 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : " 432 <<
"No reco-ME '" << recoMEName <<
"' found\n";
439 TH1* hSim = simME ->getTH1();
440 TH1* hReco = recoME->getTH1();
442 if ( !hSim || !hReco ) {
443 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
444 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : " 445 <<
"Cannot create TH1 from ME\n";
450 string efficDir = startDir;
451 string newEfficMEName = efficMEName;
453 if ( string::npos != (shiftPos = efficMEName.rfind(
'/')) ) {
454 efficDir +=
"/"+efficMEName.substr(0, shiftPos);
455 newEfficMEName.erase(0, shiftPos+1);
460 TProfile * efficHist = (hReco->GetXaxis()->GetXbins()->GetSize()==0) ?
461 new TProfile(newEfficMEName.c_str(), efficMETitle.c_str(),
462 hReco->GetXaxis()->GetNbins(),
463 hReco->GetXaxis()->GetXmin(),
464 hReco->GetXaxis()->GetXmax()) :
465 new TProfile(newEfficMEName.c_str(), efficMETitle.c_str(),
466 hReco->GetXaxis()->GetNbins(),
467 hReco->GetXaxis()->GetXbins()->GetArray());
469 efficHist->GetXaxis()->SetTitle(hSim->GetXaxis()->GetTitle());
470 efficHist->GetYaxis()->SetTitle(hSim->GetYaxis()->GetTitle());
472 for (
int i=1;
i <= hReco->GetNbinsX();
i++) {
473 const double nReco = hReco->GetBinContent(
i);
474 const double nSim = hSim->GetBinContent(
i);
477 efficHist->GetXaxis()->SetBinLabel(
i, hSim->GetXaxis()->GetBinLabel(
i));
479 if (nSim == 0
or nReco < 0 or nReco > nSim)
continue;
480 const double effVal = nReco/nSim;
481 const double errLo = TEfficiency::ClopperPearson(nSim, nReco, 0.683,
false);
482 const double errUp = TEfficiency::ClopperPearson(nSim, nReco, 0.683,
true);
483 const double errVal = (effVal - errLo > errUp - effVal) ? effVal - errLo : errUp - effVal;
484 efficHist->SetBinContent(
i, effVal);
485 efficHist->SetBinEntries(
i, 1);
486 efficHist->SetBinError(
i, std::hypot(effVal, errVal));
488 ibooker.
bookProfile(newEfficMEName.c_str(),efficHist);
494 TH1* efficHist = (TH1*)hSim->Clone(newEfficMEName.c_str());
495 efficHist->SetTitle(efficMETitle.c_str());
500 ME* efficME =
nullptr;
504 TClass * myHistClass = efficHist->IsA();
505 TString histClassName = myHistClass->GetName();
507 if (histClassName ==
"TH1F"){
508 efficME = ibooker.
book1D(newEfficMEName, (TH1F*)efficHist);
509 }
else if (histClassName ==
"TH2F"){
510 efficME = ibooker.
book2D(newEfficMEName, (TH2F*)efficHist);
511 }
else if (histClassName ==
"TH3F"){
512 efficME = ibooker.
book3D(newEfficMEName, (TH3F*)efficHist);
518 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : " 519 <<
"Cannot book effic-ME from the DQM\n";
527 generic_eff (hSim, hReco, efficME, type);
540 efficME->setEntries(simME->getEntries());
545 ME* globalEfficME = igetter.
get(efficDir+
"/globalEfficiencies");
546 if ( !globalEfficME ) globalEfficME = ibooker.
book1D(
"globalEfficiencies",
"Global efficiencies", 1, 0, 1);
547 if ( !globalEfficME ) {
548 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : " 549 <<
"Cannot book globalEffic-ME from the DQM\n";
552 globalEfficME->setEfficiencyFlag();
553 TH1F* hGlobalEffic = globalEfficME->getTH1F();
554 if ( !hGlobalEffic ) {
555 LogInfo(
"DQMGenericClient") <<
"computeEfficiency() : " 556 <<
"Cannot create TH1F from ME, globalEfficME\n";
560 const float nSimAll = hSim->GetEntries();
561 const float nRecoAll = hReco->GetEntries();
563 if ( type ==
EfficType::efficiency || type == EfficType::simpleratio ) efficAll = nSimAll ? nRecoAll/nSimAll : 0;
564 else if ( type == EfficType::fakerate ) efficAll = nSimAll ? 1-nRecoAll/nSimAll : 0;
566 if ( type == EfficType::simpleratio ) {
568 const float x = nRecoAll/nSimAll;
573 errorAll = nSimAll && efficAll < 1 ?
sqrt(efficAll*(1-efficAll)/nSimAll) : 0;
575 const int iBin = hGlobalEffic->Fill(newEfficMEName.c_str(), 0);
576 hGlobalEffic->SetBinContent(iBin, efficAll);
577 hGlobalEffic->SetBinError(iBin, errorAll);
584 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
585 LogInfo(
"DQMGenericClient") <<
"computeResolution() : " 586 <<
"Cannot find sub-directory " << startDir << endl;
593 ME* srcME = igetter.
get(startDir+
"/"+srcName);
595 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
596 LogInfo(
"DQMGenericClient") <<
"computeResolution() : " 597 <<
"No source ME '" << srcName <<
"' found\n";
602 TH2F* hSrc = srcME->getTH2F();
604 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
605 LogInfo(
"DQMGenericClient") <<
"computeResolution() : " 606 <<
"Cannot create TH2F from source-ME\n";
611 const int nBin = hSrc->GetNbinsX();
613 string newDir = startDir;
616 if ( string::npos != (shiftPos = namePrefix.rfind(
'/')) ) {
617 newDir +=
"/"+namePrefix.substr(0, shiftPos);
618 newPrefix.erase(0, shiftPos+1);
623 float * lowedgesfloats =
new float[nBin+1];
626 if (hSrc->GetXaxis()->GetXbins()->GetSize())
628 for (
int j=0; j<nBin+1; ++j)
629 lowedgesfloats[j] = (
float)hSrc->GetXaxis()->GetXbins()->GetAt(j);
630 meanME = ibooker.
book1D(newPrefix+
"_Mean", titlePrefix+
" Mean", nBin, lowedgesfloats);
631 sigmaME = ibooker.
book1D(newPrefix+
"_Sigma", titlePrefix+
" Sigma", nBin, lowedgesfloats);
635 meanME = ibooker.
book1D(newPrefix+
"_Mean", titlePrefix+
" Mean", nBin,
636 hSrc->GetXaxis()->GetXmin(),
637 hSrc->GetXaxis()->GetXmax());
638 sigmaME = ibooker.
book1D(newPrefix+
"_Sigma", titlePrefix+
" Sigma", nBin,
639 hSrc->GetXaxis()->GetXmin(),
640 hSrc->GetXaxis()->GetXmax());
643 if (meanME && sigmaME)
645 meanME->setEfficiencyFlag();
646 sigmaME->setEfficiencyFlag();
648 if (! resLimitedFit_ ) {
654 limitedFit(srcME,meanME,sigmaME);
657 delete[] lowedgesfloats;
662 if(verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
663 LogInfo(
"DQMGenericClient") <<
"computeProfile() : " 664 <<
"Cannot find sub-directory " << startDir << endl;
671 ME* srcME = igetter.
get(startDir+
"/"+srcMEName);
673 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
674 LogInfo(
"DQMGenericClient") <<
"computeProfile() : " 675 <<
"No source ME '" << srcMEName <<
"' found\n";
680 TH2F* hSrc = srcME->getTH2F();
682 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
683 LogInfo(
"DQMGenericClient") <<
"computeProfile() : " 684 <<
"Cannot create TH2F from source-ME\n";
689 string profileDir = startDir;
690 string newProfileMEName = profileMEName;
692 if ( string::npos != (shiftPos = profileMEName.rfind(
'/')) ) {
693 profileDir +=
"/"+profileMEName.substr(0, shiftPos);
694 newProfileMEName.erase(0, shiftPos+1);
698 std::unique_ptr<TProfile>
profile(hSrc->ProfileX());
699 profile->SetTitle(profileMETitle.c_str());
708 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
709 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : " 710 <<
"Cannot find sub-directory " << startDir << endl;
717 ME* element = igetter.
get(startDir+
"/"+histName);
718 ME* normME = igetter.
get(startDir+
"/"+normHistName);
721 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
722 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : " 723 <<
"No such element '" << histName <<
"' found\n";
729 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
730 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : " 731 <<
"No such element '" << normHistName <<
"' found\n";
736 TH1F*
hist = element->getTH1F();
738 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
739 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : " 740 <<
"Cannot create TH1F from ME\n";
745 TH1F* normHist = normME->getTH1F();
747 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
748 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : " 749 <<
"Cannot create TH1F from ME\n";
754 const double entries = normHist->GetEntries();
755 if ( entries != 0 ) {
756 hist->Scale(1./entries);
759 LogInfo(
"DQMGenericClient") <<
"normalizeToEntries() : " 760 <<
"Zero entries in histogram\n";
769 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
770 LogInfo(
"DQMGenericClient") <<
"makeCumulativeDist() : " 771 <<
"Cannot find sub-directory " << startDir << endl;
778 ME* element_cd = igetter.
get(startDir+
"/"+cdName);
781 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
782 LogInfo(
"DQMGenericClient") <<
"makeCumulativeDist() : " 783 <<
"No such element '" << cdName <<
"' found\n";
788 TH1F* cd = element_cd->getTH1F();
791 if ( verbose_ >= 2 || (verbose_ == 1 && !isWildcardUsed_) ) {
792 LogInfo(
"DQMGenericClient") <<
"makeCumulativeDist() : " 793 <<
"Cannot create TH1F from ME\n";
798 int n_bins = cd->GetNbinsX() + 1;
801 for (
int i = 1;
i <= n_bins;
i++) {
802 cd->SetBinContent(
i,cd->GetBinContent(
i) + cd->GetBinContent(
i-1));
806 for (
int i = n_bins-1;
i >= 0;
i--) {
807 cd->SetBinContent(
i,cd->GetBinContent(
i) + cd->GetBinContent(
i+1));
822 double cont_min = 100;
823 Int_t binx = histo->GetXaxis()->GetNbins();
825 for (
int i = 1; i <= binx ; i++) {
827 TH1 *histoY = histo->ProjectionY(
" ", i, i);
828 double cont = histoY->GetEntries();
830 if (cont >= cont_min) {
831 float minfit = histoY->GetMean() - histoY->GetRMS();
832 float maxfit = histoY->GetMean() + histoY->GetRMS();
834 TF1 *fitFcn =
new TF1(TString(
"g")+histo->GetName()+iString,
"gaus",minfit,maxfit);
836 fitFcn->GetRange(x1,x2);
838 histoY->Fit(fitFcn,
"QR0",
"",x1,x2);
841 double *par = fitFcn->GetParameters();
842 const double *err = fitFcn->GetParErrors();
854 if(fitFcn)
delete fitFcn;
855 if(histoY)
delete histoY;
858 if(histoY)
delete histoY;
867 const TString& _pattern = TString(
"")) {
870 LogError(
"DQMGenericClient") <<
" DQMGenericClient::findAllSubdirectories ==> Missing folder " << dir <<
" !!!";
877 vector <string> foundDirs = igetter.
getSubdirs();
878 for(vector<string>::const_iterator iDir = foundDirs.begin();
879 iDir != foundDirs.end(); ++iDir) {
880 TString
dirName = iDir->substr(iDir->rfind(
'/') + 1, iDir->length());
881 if (dirName.Contains(regexp))
882 findAllSubdirectories (ibooker, igetter, *iDir, myList);
891 findAllSubdirectories (ibooker, igetter, dir, myList,
"*");
895 LogInfo (
"DQMGenericClient") <<
"Trying to find sub-directories of " << dir
896 <<
" failed because " << dir <<
" does not exist";
904 for (
int iBinX = 1; iBinX < denom->GetNbinsX()+1; iBinX++){
905 for (
int iBinY = 1; iBinY < denom->GetNbinsY()+1; iBinY++){
906 for (
int iBinZ = 1; iBinZ < denom->GetNbinsZ()+1; iBinZ++){
908 int globalBinNum = denom->GetBin(iBinX, iBinY, iBinZ);
910 float numerVal = numer->GetBinContent(globalBinNum);
911 float denomVal = denom->GetBinContent(globalBinNum);
916 if (type == EfficType::fakerate) {
917 effVal = denomVal ? (1 - numerVal / denomVal) : 0;
919 effVal = denomVal ? numerVal / denomVal : 0;
923 if (type == EfficType::simpleratio) {
925 float numerErr = numer->GetBinError(globalBinNum);
926 float denomErr = denom->GetBinError(globalBinNum);
927 float denomsq = denomVal*denomVal;
928 errVal = denomVal ?
sqrt(
pow( 1.
f/denomVal*numerErr,2.0) +
pow(numerVal/denomsq*denomErr,2) ): 0;
930 errVal = (denomVal && (effVal <=1)) ?
sqrt(effVal*(1-effVal)/denomVal) : 0;
933 LogDebug (
"DQMGenericClient") <<
"(iBinX, iBinY, iBinZ) = " 936 << iBinZ <<
"), global bin = " << globalBinNum
937 <<
"eff = " << numerVal <<
" / " << denomVal
939 <<
" ... 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)
MonitorElement * bookProfile(Args &&...args)
MonitorElement * get(const std::string &path)
TPRegexp metacharacters("[\\^\\$\\.\\*\\+\\?\\|\\(\\)\\{\\}\\[\\]]")
void makeCumulativeDist(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, const std::string &startDir, const std::string &cdName, bool ascending=true)
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 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 EfficType type=EfficType::efficiency, const bool makeProfile=false)
void setEfficiencyFlag(void)
DQMGenericClient(const edm::ParameterSet &pset)
def efficSet(nameIn, titleIn, numeratorIn, denominatorIn, typeIn="eff")
void computeProfile(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, const std::string &startDir, const std::string &profileMEName, const std::string &profileMETitle, const std::string &srcMEName)
TH2F * getTH2F(void) const
MonitorElement * book3D(Args &&...args)
Power< A, B >::type pow(const A &a, const B &b)
void limitedFit(MonitorElement *srcME, MonitorElement *meanME, MonitorElement *sigmaME)
void generic_eff(TH1 *denom, TH1 *numer, MonitorElement *efficiencyHist, const EfficType type=EfficType::efficiency)