CMS 3D CMS Logo

EgammaHLTBcHcalIsolationProducersRegional.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: EgammaHLTProducers
4 // Class: EgammaHLTBcHcalIsolationProducersRegional
5 //
6 // Original Author: Matteo Sani (UCSD)
7 // Created: Thu Nov 24 11:38:00 CEST 2011
8 //
9 
15 
21 
23 
27 
31 
36 
40 
41 #include <iostream>
42 #include <vector>
43 #include <memory>
44 
45 //this class produces either Hcal isolation or H for H/E depending if doEtSum=true or false
46 //H for H/E = towers behind SC, hcal isolation has these towers excluded
47 //a rho correction can be applied
48 
50 public:
53 
54  // non-copiable
57 
58 public:
59  void produce(edm::Event &, const edm::EventSetup &) final;
60  static void fillDescriptions(edm::ConfigurationDescriptions &descriptions);
61 
62 private:
63  const bool doEtSum_;
64  const double etMin_;
65  const double innerCone_;
66  const double outerCone_;
67  const int depth_;
68  const bool useSingleTower_;
69 
70  const bool doRhoCorrection_;
71  const double rhoScale_;
72  const double rhoMax_;
73  const std::vector<double> effectiveAreas_;
74  const std::vector<double> absEtaLowEdges_;
75 
79 
81 };
82 
84  : doEtSum_(config.getParameter<bool>("doEtSum")),
85  etMin_(config.getParameter<double>("etMin")),
86  innerCone_(config.getParameter<double>("innerCone")),
87  outerCone_(config.getParameter<double>("outerCone")),
88  depth_(config.getParameter<int>("depth")),
89  useSingleTower_(config.getParameter<bool>("useSingleTower")),
90  doRhoCorrection_(config.getParameter<bool>("doRhoCorrection")),
91  rhoScale_(config.getParameter<double>("rhoScale")),
92  rhoMax_(config.getParameter<double>("rhoMax")),
93  effectiveAreas_(config.getParameter<std::vector<double> >("effectiveAreas")),
94  absEtaLowEdges_(config.getParameter<std::vector<double> >("absEtaLowEdges")),
96  consumes<reco::RecoEcalCandidateCollection>(config.getParameter<edm::InputTag>("recoEcalCandidateProducer"))),
97  caloTowerProducer_(consumes<CaloTowerCollection>(config.getParameter<edm::InputTag>("caloTowerProducer"))),
98  rhoProducer_(doRhoCorrection_ ? consumes<double>(config.getParameter<edm::InputTag>("rhoProducer"))
99  : edm::EDGetTokenT<double>()) {
100  if (doRhoCorrection_) {
101  if (absEtaLowEdges_.size() != effectiveAreas_.size())
102  throw cms::Exception("IncompatibleVects") << "absEtaLowEdges and effectiveAreas should be of the same size. \n";
103 
104  if (absEtaLowEdges_.at(0) != 0.0)
105  throw cms::Exception("IncompleteCoverage") << "absEtaLowEdges should start from 0. \n";
106 
107  for (unsigned int aIt = 0; aIt < absEtaLowEdges_.size() - 1; aIt++) {
108  if (!(absEtaLowEdges_.at(aIt) < absEtaLowEdges_.at(aIt + 1)))
109  throw cms::Exception("ImproperBinning") << "absEtaLowEdges entries should be in increasing order. \n";
110  }
111  }
112 
114  hcalCfg.hOverEConeSize = outerCone_;
115  hcalCfg.useTowers = true;
116  hcalCfg.hcalTowers = caloTowerProducer_;
117  hcalCfg.hOverEPtMin = etMin_;
118  hcalHelper_ = new ElectronHcalHelper(hcalCfg);
119 
120  produces<reco::RecoEcalCandidateIsolationMap>();
121 }
122 
124 
127 
128  desc.add<edm::InputTag>(("recoEcalCandidateProducer"), edm::InputTag("hltRecoEcalCandidate"));
129  desc.add<edm::InputTag>(("caloTowerProducer"), edm::InputTag("hltTowerMakerForAll"));
130  desc.add<edm::InputTag>(("rhoProducer"), edm::InputTag("fixedGridRhoFastjetAllCalo"));
131  desc.add<bool>(("doRhoCorrection"), false);
132  desc.add<double>(("rhoMax"), 999999.);
133  desc.add<double>(("rhoScale"), 1.0);
134  desc.add<double>(("etMin"), -1.0);
135  desc.add<double>(("innerCone"), 0);
136  desc.add<double>(("outerCone"), 0.15);
137  desc.add<int>(("depth"), -1);
138  desc.add<bool>(("doEtSum"), false);
139  desc.add<bool>(("useSingleTower"), false);
140  desc.add<std::vector<double> >("effectiveAreas", {0.079, 0.25}); // 2016 post-ichep sinEle default
141  desc.add<std::vector<double> >("absEtaLowEdges", {0.0, 1.479}); // Barrel, Endcap
142  descriptions.add(("hltEgammaHLTBcHcalIsolationProducersRegional"), desc);
143 }
144 
146  // Get the HLT filtered objects
148  iEvent.getByToken(recoEcalCandidateProducer_, recoEcalCandHandle);
149 
150  edm::Handle<CaloTowerCollection> caloTowersHandle;
151  iEvent.getByToken(caloTowerProducer_, caloTowersHandle);
152 
153  edm::Handle<double> rhoHandle;
154  double rho = 0.0;
155 
156  if (doRhoCorrection_) {
157  iEvent.getByToken(rhoProducer_, rhoHandle);
158  rho = *(rhoHandle.product());
159  }
160 
161  if (rho > rhoMax_)
162  rho = rhoMax_;
163 
164  rho = rho * rhoScale_;
165 
166  hcalHelper_->checkSetup(iSetup);
167  hcalHelper_->readEvent(iEvent);
168 
169  reco::RecoEcalCandidateIsolationMap isoMap(recoEcalCandHandle);
170 
171  for (unsigned int iRecoEcalCand = 0; iRecoEcalCand < recoEcalCandHandle->size(); iRecoEcalCand++) {
172  reco::RecoEcalCandidateRef recoEcalCandRef(recoEcalCandHandle, iRecoEcalCand);
173 
174  float isol = 0;
175 
176  std::vector<CaloTowerDetId> towersBehindCluster;
177 
178  if (useSingleTower_)
179  towersBehindCluster = hcalHelper_->hcalTowersBehindClusters(*(recoEcalCandRef->superCluster()));
180 
181  if (doEtSum_) { //calculate hcal isolation excluding the towers behind the cluster which will be used for H for H/E
182  EgammaTowerIsolation isolAlgo(outerCone_, innerCone_, etMin_, depth_, caloTowersHandle.product());
183  if (useSingleTower_)
184  isol = isolAlgo.getTowerEtSum(
185  &(*recoEcalCandRef), &(towersBehindCluster)); // towersBehindCluster are excluded from the isolation sum
186  else
187  isol = isolAlgo.getTowerEtSum(&(*recoEcalCandRef));
188 
189  } else { //calcuate H for H/E
190  if (useSingleTower_)
191  isol = hcalHelper_->hcalESumDepth1BehindClusters(towersBehindCluster) +
192  hcalHelper_->hcalESumDepth2BehindClusters(towersBehindCluster);
193  else
194  isol = hcalHelper_->hcalESum(*(recoEcalCandRef->superCluster()));
195  }
196 
197  if (doRhoCorrection_) {
198  int iEA = -1;
199  auto scEta = std::abs(recoEcalCandRef->superCluster()->eta());
200  for (int bIt = absEtaLowEdges_.size() - 1; bIt > -1; bIt--) {
201  if (scEta > absEtaLowEdges_.at(bIt)) {
202  iEA = bIt;
203  break;
204  }
205  }
206  isol = isol - rho * effectiveAreas_.at(iEA);
207  }
208 
209  isoMap.insert(recoEcalCandRef, isol);
210  }
211 
212  iEvent.put(std::make_unique<reco::RecoEcalCandidateIsolationMap>(isoMap));
213 }
214 
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
void readEvent(const edm::Event &)
double hcalESum(const reco::SuperCluster &, const std::vector< CaloTowerDetId > *excludeTowers=0) const
void produce(edm::Event &, const edm::EventSetup &) final
const edm::EDGetTokenT< CaloTowerCollection > caloTowerProducer_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
void checkSetup(const edm::EventSetup &)
Definition: config.py:1
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
EgammaHLTBcHcalIsolationProducersRegional & operator=(EgammaHLTBcHcalIsolationProducersRegional const &)=delete
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
ParameterDescriptionBase * add(U const &iLabel, T const &value)
T const * product() const
Definition: Handle.h:69
void insert(const key_type &k, const data_type &v)
insert an association
void add(std::string const &label, ParameterSetDescription const &psetDescription)
double hcalESumDepth2BehindClusters(const std::vector< CaloTowerDetId > &towers) const
std::vector< RecoEcalCandidate > RecoEcalCandidateCollection
collectin of RecoEcalCandidate objects
fixed size matrix
HLT enums.
std::vector< CaloTowerDetId > hcalTowersBehindClusters(const reco::SuperCluster &sc) const
double getTowerEtSum(const reco::Candidate *cand, const std::vector< CaloTowerDetId > *detIdToExclude=0) const
edm::EDGetTokenT< CaloTowerCollection > hcalTowers
const edm::EDGetTokenT< reco::RecoEcalCandidateCollection > recoEcalCandidateProducer_
double hcalESumDepth1BehindClusters(const std::vector< CaloTowerDetId > &towers) const