|
| 1 | +#include "ElectronEfficiencyPlotter.h" |
| 2 | + |
| 3 | +// Framework |
| 4 | +#include <FWCore/Framework/interface/Event.h> |
| 5 | +#include "DataFormats/Common/interface/Handle.h" |
| 6 | +#include <FWCore/Framework/interface/ESHandle.h> |
| 7 | +#include <FWCore/Framework/interface/MakerMacros.h> |
| 8 | +#include <FWCore/Framework/interface/EventSetup.h> |
| 9 | +#include <FWCore/ParameterSet/interface/ParameterSet.h> |
| 10 | + |
| 11 | +#include "DQMServices/Core/interface/DQMStore.h" |
| 12 | +#include "FWCore/MessageLogger/interface/MessageLogger.h" |
| 13 | +#include "FWCore/Framework/interface/Run.h" |
| 14 | + |
| 15 | +#include <iostream> |
| 16 | +#include <cstdio> |
| 17 | +#include <string> |
| 18 | +#include <cmath> |
| 19 | +#include "TF1.h" |
| 20 | +#include "TH1F.h" |
| 21 | + |
| 22 | +using namespace edm; |
| 23 | +using namespace std; |
| 24 | + |
| 25 | +ElectronEfficiencyPlotter::ElectronEfficiencyPlotter(const edm::ParameterSet &ps) { |
| 26 | + parameters = ps; |
| 27 | + |
| 28 | + ptBin = parameters.getParameter<int>("ptBin"); |
| 29 | + ptMin = parameters.getParameter<double>("ptMin"); |
| 30 | + ptMax = parameters.getParameter<double>("ptMax"); |
| 31 | + |
| 32 | + ID_ = parameters.getParameter<string>("sctElectronID"); |
| 33 | + theFolder_ = parameters.getParameter<string>("folder"); |
| 34 | + sourceFolder_ = parameters.getParameter<string>("srcFolder"); |
| 35 | +} |
| 36 | + |
| 37 | +ElectronEfficiencyPlotter::~ElectronEfficiencyPlotter() {} |
| 38 | + |
| 39 | +void ElectronEfficiencyPlotter::dqmEndJob(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter) { |
| 40 | + ibooker.setCurrentFolder(theFolder_); |
| 41 | + |
| 42 | + h_eff_pt_EB_ID = ibooker.book1D("Eff_pt_barrel_" + ID_, ID_ + "Eff. vs Pt (barrel)", ptBin, ptMin, ptMax); |
| 43 | + h_eff_pt_EE_ID = ibooker.book1D("Eff_pt_endcap_" + ID_, ID_ + "Eff. vs Pt (endcap)", ptBin, ptMin, ptMax); |
| 44 | + h_eff_pt_EB_HLT = ibooker.book1D("Eff_pt_barrel_DSTdoubleEG", "DSTdoubleEG Eff. vs Pt (barrel)", ptBin, ptMin, ptMax); |
| 45 | + h_eff_pt_EE_HLT = ibooker.book1D("Eff_pt_endcap_DSTdoubleEG", "DSTdoubleEG Eff. vs Pt (endcap)", ptBin, ptMin, ptMax); |
| 46 | + |
| 47 | + // Prevent the ME to be normalized when drawn into the GUI |
| 48 | + // h_eff_pt_EB_ID->setEfficiencyFlag(); |
| 49 | + // h_eff_pt_EE_ID->setEfficiencyFlag(); |
| 50 | + |
| 51 | + // Axis title |
| 52 | + h_eff_pt_EB_ID->setAxisTitle("p_{T} (GeV)", 1); |
| 53 | + h_eff_pt_EE_ID->setAxisTitle("p_{T} (GeV)", 1); |
| 54 | + h_eff_pt_EB_HLT->setAxisTitle("p_{T} (GeV)", 1); |
| 55 | + h_eff_pt_EE_HLT->setAxisTitle("p_{T} (GeV)", 1); |
| 56 | + |
| 57 | + MonitorElement *Numerator_pt_barrel = igetter.get(sourceFolder_ + "/resonanceAll_Probe_sctElectron_Pt_Barrel_passID"); |
| 58 | + MonitorElement *Numerator_pt_endcap = igetter.get(sourceFolder_ + "/resonanceAll_Probe_sctElectron_Pt_Endcap_passID"); |
| 59 | + MonitorElement *Numerator_pt_barrel_hlt = |
| 60 | + igetter.get(sourceFolder_ + "/resonanceAll_Probe_sctElectron_Pt_Barrel_passDSTdoubleEG"); |
| 61 | + MonitorElement *Numerator_pt_endcap_hlt = |
| 62 | + igetter.get(sourceFolder_ + "/resonanceAll_Probe_sctElectron_Pt_Endcap_passDSTdoubleEG"); |
| 63 | + MonitorElement *Denominator_pt_barrel = igetter.get(sourceFolder_ + "/resonanceAll_Probe_sctElectron_Pt_Barrel"); |
| 64 | + MonitorElement *Denominator_pt_endcap = igetter.get(sourceFolder_ + "/resonanceAll_Probe_sctElectron_Pt_Endcap"); |
| 65 | + |
| 66 | + if (Numerator_pt_barrel && Denominator_pt_barrel) |
| 67 | + GetEfficiency(Numerator_pt_barrel, Denominator_pt_barrel, h_eff_pt_EB_ID); |
| 68 | + if (Numerator_pt_endcap && Denominator_pt_endcap) |
| 69 | + GetEfficiency(Numerator_pt_endcap, Denominator_pt_endcap, h_eff_pt_EE_ID); |
| 70 | + if (Numerator_pt_barrel_hlt && Denominator_pt_barrel) |
| 71 | + GetEfficiency(Numerator_pt_barrel_hlt, Denominator_pt_barrel, h_eff_pt_EB_HLT); |
| 72 | + if (Numerator_pt_endcap_hlt && Denominator_pt_endcap) |
| 73 | + GetEfficiency(Numerator_pt_endcap_hlt, Denominator_pt_endcap, h_eff_pt_EE_HLT); |
| 74 | +} |
| 75 | + |
| 76 | +void ElectronEfficiencyPlotter::GetEfficiency(MonitorElement *Numerator, |
| 77 | + MonitorElement *Denominator, |
| 78 | + MonitorElement *Efficiency) { |
| 79 | + TH1F *h_numerator_pt = Numerator->getTH1F(); |
| 80 | + TH1F *h_denominator_pt = Denominator->getTH1F(); |
| 81 | + TH1F *h_eff_pt = Efficiency->getTH1F(); |
| 82 | + if (h_eff_pt->GetSumw2N() == 0) |
| 83 | + h_eff_pt->Sumw2(); |
| 84 | + |
| 85 | + // ReBin |
| 86 | + int nBins = h_eff_pt->GetNbinsX(); |
| 87 | + double *binEdges = new double[nBins + 1]; |
| 88 | + for (int i = 0; i <= nBins; i++) |
| 89 | + binEdges[i] = h_eff_pt->GetBinLowEdge(i + 1); |
| 90 | + |
| 91 | + TH1F *h_numerator_pt_rebin = (TH1F *)h_numerator_pt->Rebin(nBins, "num_pt_rebinned", binEdges); |
| 92 | + TH1F *h_denominator_pt_rebin = (TH1F *)h_denominator_pt->Rebin(nBins, "num_pt_rebinned", binEdges); |
| 93 | + h_eff_pt->Divide(h_numerator_pt_rebin, h_denominator_pt_rebin, 1., 1., "B"); |
| 94 | +} |
| 95 | + |
| 96 | +DEFINE_FWK_MODULE(ElectronEfficiencyPlotter); |
0 commit comments