CMS 3D CMS Logo

L1ECALPrefiringWeightProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: ProdTutorial/L1ECALPrefiringWeightProducer
4 // Class: L1ECALPrefiringWeightProducer
5 //
13 //
14 // Original Author: localusers user
15 // Created: Thu, 08 Nov 2018 16:16:00 GMT
16 //
17 //
18 
19 // system include files
20 #include <memory>
21 
24 
27 
30 
33 #include "TH2.h"
34 
35 #include <iostream>
36 enum fluctuations { central = 0, up, down };
37 
39 public:
42 
43  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
44 
45 private:
46  void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
47 
48  double getPrefiringRate(double eta, double pt, TH2F* h_prefmap, fluctuations fluctuation) const;
49 
52 
56  bool useEMpt_;
59 };
60 
62  photons_token_ = consumes<std::vector<pat::Photon> >(iConfig.getParameter<edm::InputTag>("ThePhotons"));
63  jets_token_ = consumes<std::vector<pat::Jet> >(iConfig.getParameter<edm::InputTag>("TheJets"));
64 
65  dataera_ = iConfig.getParameter<std::string>("DataEra");
66  useEMpt_ = iConfig.getParameter<bool>("UseJetEMPt");
67  prefiringRateSystUnc_ = iConfig.getParameter<double>("PrefiringRateSystematicUncty");
68  skipwarnings_ = iConfig.getParameter<bool>("SkipWarnings");
69 
70  TFile* file_prefiringmaps_;
71  std::string fname = iConfig.getParameter<std::string>("L1Maps");
72  edm::FileInPath mapsfilepath("PhysicsTools/PatUtils/data/" + fname);
73  file_prefiringmaps_ = new TFile(mapsfilepath.fullPath().c_str(), "read");
74  if (file_prefiringmaps_ == nullptr && !skipwarnings_)
75  std::cout << "File with maps not found. All prefiring weights set to 0. " << std::endl;
76 
77  TString mapphotonfullname = "L1prefiring_photonptvseta_" + dataera_;
78  if (!file_prefiringmaps_->Get(mapphotonfullname) && !skipwarnings_)
79  std::cout << "Photon map not found. All photons prefiring weights set to 0. " << std::endl;
80  h_prefmap_photon = (TH2F*)file_prefiringmaps_->Get(mapphotonfullname);
81 
82  TString mapjetfullname = (useEMpt_) ? "L1prefiring_jetemptvseta_" + dataera_ : "L1prefiring_jetptvseta_" + dataera_;
83  if (!file_prefiringmaps_->Get(mapjetfullname) && !skipwarnings_)
84  std::cout << "Jet map not found. All jets prefiring weights set to 0. " << std::endl;
85  h_prefmap_jet = (TH2F*)file_prefiringmaps_->Get(mapjetfullname);
86  file_prefiringmaps_->Close();
87  delete file_prefiringmaps_;
88  produces<double>("nonPrefiringProb").setBranchAlias("nonPrefiringProb");
89  produces<double>("nonPrefiringProbUp").setBranchAlias("nonPrefiringProbUp");
90  produces<double>("nonPrefiringProbDown").setBranchAlias("nonPrefiringProbDown");
91 }
92 
94  delete h_prefmap_photon;
95  delete h_prefmap_jet;
96 }
97 
99  using namespace edm;
100 
101  //Photons
103  iEvent.getByToken(photons_token_, thePhotons);
104 
105  //Jets
107  iEvent.getByToken(jets_token_, theJets);
108 
109  //Probability for the event NOT to prefire, computed with the prefiring maps per object.
110  //Up and down values correspond to the resulting value when shifting up/down all prefiring rates in prefiring maps.
111  double nonPrefiringProba[3] = {1., 1., 1.}; //0: central, 1: up, 2: down
112 
113  for (const auto fluct : {fluctuations::central, fluctuations::up, fluctuations::down}) {
114  for (const auto& photon : *thePhotons) {
115  double pt_gam = photon.pt();
116  double eta_gam = photon.eta();
117  if (pt_gam < 20.)
118  continue;
119  if (fabs(eta_gam) < 2.)
120  continue;
121  if (fabs(eta_gam) > 3.)
122  continue;
123  double prefiringprob_gam = getPrefiringRate(eta_gam, pt_gam, h_prefmap_photon, fluct);
124  nonPrefiringProba[fluct] *= (1. - prefiringprob_gam);
125  }
126 
127  //Now applying the prefiring maps to jets in the affected regions.
128  for (const auto& jet : *theJets) {
129  double pt_jet = jet.pt();
130  double eta_jet = jet.eta();
131  double phi_jet = jet.phi();
132  if (pt_jet < 20.)
133  continue;
134  if (fabs(eta_jet) < 2.)
135  continue;
136  if (fabs(eta_jet) > 3.)
137  continue;
138 
139  //Loop over photons to remove overlap
140  double nonprefiringprobfromoverlappingphotons = 1.;
141  for (const auto& photon : *thePhotons) {
142  double pt_gam = photon.pt();
143  double eta_gam = photon.eta();
144  double phi_gam = photon.phi();
145  if (pt_gam < 20.)
146  continue;
147  if (fabs(eta_gam) < 2.)
148  continue;
149  if (fabs(eta_gam) > 3.)
150  continue;
151  double dR = reco::deltaR(eta_jet, phi_jet, eta_gam, phi_gam);
152  if (dR > 0.4)
153  continue;
154  double prefiringprob_gam = getPrefiringRate(eta_gam, pt_gam, h_prefmap_photon, fluct);
155  nonprefiringprobfromoverlappingphotons *= (1. - prefiringprob_gam);
156  }
157  //useEMpt =true if one wants to use maps parametrized vs Jet EM pt instead of pt.
158  if (useEMpt_)
159  pt_jet *= (jet.neutralEmEnergyFraction() + jet.chargedEmEnergyFraction());
160  double nonprefiringprobfromoverlappingjet = 1. - getPrefiringRate(eta_jet, pt_jet, h_prefmap_jet, fluct);
161 
162  if (nonprefiringprobfromoverlappingphotons == 1.) {
163  nonPrefiringProba[fluct] *= nonprefiringprobfromoverlappingjet;
164  }
165  //If overlapping photons have a non prefiring rate larger than the jet, then replace these weights by the jet one
166  else if (nonprefiringprobfromoverlappingphotons > nonprefiringprobfromoverlappingjet) {
167  if (nonprefiringprobfromoverlappingphotons != 0.) {
168  nonPrefiringProba[fluct] *= nonprefiringprobfromoverlappingjet / nonprefiringprobfromoverlappingphotons;
169  } else {
170  nonPrefiringProba[fluct] = 0.;
171  }
172  }
173  //Last case: if overlapping photons have a non prefiring rate smaller than the jet, don't consider the jet in the event weight, and do nothing.
174  }
175  }
176 
177  auto nonPrefiringProb = std::make_unique<double>(nonPrefiringProba[0]);
178  auto nonPrefiringProbUp = std::make_unique<double>(nonPrefiringProba[1]);
179  auto nonPrefiringProbDown = std::make_unique<double>(nonPrefiringProba[2]);
180  iEvent.put(std::move(nonPrefiringProb), "nonPrefiringProb");
181  iEvent.put(std::move(nonPrefiringProbUp), "nonPrefiringProbUp");
182  iEvent.put(std::move(nonPrefiringProbDown), "nonPrefiringProbDown");
183 }
184 
186  double pt,
187  TH2F* h_prefmap,
188  fluctuations fluctuation) const {
189  if (h_prefmap == nullptr && !skipwarnings_)
190  std::cout << "Prefiring map not found, setting prefiring rate to 0 " << std::endl;
191  if (h_prefmap == nullptr)
192  return 0.;
193  //Check pt is not above map overflow
194  int nbinsy = h_prefmap->GetNbinsY();
195  double maxy = h_prefmap->GetYaxis()->GetBinLowEdge(nbinsy + 1);
196  if (pt >= maxy)
197  pt = maxy - 0.01;
198  int thebin = h_prefmap->FindBin(eta, pt);
199 
200  double prefrate = h_prefmap->GetBinContent(thebin);
201 
202  double statuncty = h_prefmap->GetBinError(thebin);
203  double systuncty = prefiringRateSystUnc_ * prefrate;
204 
205  if (fluctuation == up)
206  prefrate = std::min(1., prefrate + sqrt(pow(statuncty, 2) + pow(systuncty, 2)));
207  if (fluctuation == down)
208  prefrate = std::max(0., prefrate - sqrt(pow(statuncty, 2) + pow(systuncty, 2)));
209  return prefrate;
210 }
211 
212 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
215 
216  desc.add<edm::InputTag>("ThePhotons", edm::InputTag("slimmedPhotons"));
217  desc.add<edm::InputTag>("TheJets", edm::InputTag("slimmedJets"));
218  desc.add<std::string>("L1Maps", "L1PrefiringMaps.root");
219  desc.add<std::string>("DataEra", "2017BtoF");
220  desc.add<bool>("UseJetEMPt", false);
221  desc.add<double>("PrefiringRateSystematicUncty", 0.2);
222  desc.add<bool>("SkipWarnings", true);
223  descriptions.add("l1ECALPrefiringWeightProducer", desc);
224 }
225 
226 //define this as a plug-in
L1ECALPrefiringWeightProducer::photons_token_
edm::EDGetTokenT< std::vector< pat::Photon > > photons_token_
Definition: L1ECALPrefiringWeightProducer.cc:50
edm::StreamID
Definition: StreamID.h:30
L1ECALPrefiringWeightProducer::dataera_
std::string dataera_
Definition: L1ECALPrefiringWeightProducer.cc:55
muons2muons_cfi.photon
photon
Definition: muons2muons_cfi.py:28
edm::ParameterSetDescription::add
ParameterDescriptionBase * add(U const &iLabel, T const &value)
Definition: ParameterSetDescription.h:95
L1ECALPrefiringWeightProducer::~L1ECALPrefiringWeightProducer
~L1ECALPrefiringWeightProducer() override
Definition: L1ECALPrefiringWeightProducer.cc:93
L1ECALPrefiringWeightProducer::skipwarnings_
bool skipwarnings_
Definition: L1ECALPrefiringWeightProducer.cc:58
DiDispStaMuonMonitor_cfi.pt
pt
Definition: DiDispStaMuonMonitor_cfi.py:39
L1ECALPrefiringWeightProducer::getPrefiringRate
double getPrefiringRate(double eta, double pt, TH2F *h_prefmap, fluctuations fluctuation) const
Definition: L1ECALPrefiringWeightProducer.cc:185
min
T min(T a, T b)
Definition: MathUtil.h:58
edm::EDGetTokenT
Definition: EDGetToken.h:33
edm
HLT enums.
Definition: AlignableModifier.h:19
Photon.h
gather_cfg.cout
cout
Definition: gather_cfg.py:144
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
central
Definition: L1ECALPrefiringWeightProducer.cc:36
L1ECALPrefiringWeightProducer::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: L1ECALPrefiringWeightProducer.cc:213
edm::Handle
Definition: AssociativeIterator.h:50
edm::FileInPath
Definition: FileInPath.h:64
L1ECALPrefiringWeightProducer::useEMpt_
bool useEMpt_
Definition: L1ECALPrefiringWeightProducer.cc:56
MakerMacros.h
L1ECALPrefiringWeightProducer::produce
void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
Definition: L1ECALPrefiringWeightProducer.cc:98
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
PVValHelper::eta
Definition: PVValidationHelpers.h:69
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
L1ECALPrefiringWeightProducer::L1ECALPrefiringWeightProducer
L1ECALPrefiringWeightProducer(const edm::ParameterSet &)
Definition: L1ECALPrefiringWeightProducer.cc:61
L1ECALPrefiringWeightProducer::h_prefmap_jet
TH2F * h_prefmap_jet
Definition: L1ECALPrefiringWeightProducer.cc:54
edm::global::EDProducer
Definition: EDProducer.h:32
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
L1ECALPrefiringWeightProducer::h_prefmap_photon
TH2F * h_prefmap_photon
Definition: L1ECALPrefiringWeightProducer.cc:53
HLT_2018_cff.InputTag
InputTag
Definition: HLT_2018_cff.py:79016
edm::ParameterSet
Definition: ParameterSet.h:36
Event.h
SiStripPI::max
Definition: SiStripPayloadInspectorHelper.h:169
iEvent
int iEvent
Definition: GenABIO.cc:224
L1ECALPrefiringWeightProducer
Definition: L1ECALPrefiringWeightProducer.cc:38
edm::EventSetup
Definition: EventSetup.h:57
down
Definition: L1ECALPrefiringWeightProducer.cc:36
Jet.h
L1ECALPrefiringWeightProducer::jets_token_
edm::EDGetTokenT< std::vector< pat::Jet > > jets_token_
Definition: L1ECALPrefiringWeightProducer.cc:51
alignmentValidation.fname
string fname
main script
Definition: alignmentValidation.py:959
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
eostools.move
def move(src, dest)
Definition: eostools.py:511
fluctuations
fluctuations
Definition: L1ECALPrefiringWeightProducer.cc:36
Frameworkfwd.h
metsig::jet
Definition: SignAlgoResolutions.h:47
reco::deltaR
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:30
up
Definition: L1ECALPrefiringWeightProducer.cc:36
funct::pow
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
HGC3DClusterGenMatchSelector_cfi.dR
dR
Definition: HGC3DClusterGenMatchSelector_cfi.py:7
ParameterSet.h
EDProducer.h
edm::Event
Definition: Event.h:73
StreamID.h
edm::InputTag
Definition: InputTag.h:15
L1ECALPrefiringWeightProducer::prefiringRateSystUnc_
double prefiringRateSystUnc_
Definition: L1ECALPrefiringWeightProducer.cc:57