CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
HLTRechitInRegionsProducer.cc
Go to the documentation of this file.
1 // C/C++ headers
2 #include <vector>
3 
4 // Framework
12 
13 // Reconstruction Classes
22 
23 // Geometry
31 
32 // Level 1 Trigger
37 
38 #include <memory>
39 
45 
48 
49 // Reco candidates
52 
55 
56 // Geometry and topology
64 
65 // Level 1 Trigger
70 
71 template <typename T1>
73  typedef std::vector<T1> T1Collection;
74  typedef typename T1::const_iterator T1iterator;
75 
76 public:
78  ~HLTRechitInRegionsProducer() override;
79 
80  void produce(edm::Event&, const edm::EventSetup&) override;
81  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
82 
83 private:
84  void getEtaPhiRegions(std::vector<RectangularEtaPhiRegion>*, T1Collection, const L1CaloGeometry&, bool);
85 
86  const bool useUncalib_;
87 
88  const bool doIsolated_;
89 
92  const double l1LowerThr_;
93  const double l1UpperThr_;
95 
96  const double regionEtaMargin_;
97  const double regionPhiMargin_;
98 
99  const std::vector<edm::InputTag> hitLabels;
100  const std::vector<std::string> productLabels;
101 
102  std::vector<edm::EDGetTokenT<EcalRecHitCollection>> hitTokens;
103  std::vector<edm::EDGetTokenT<EcalUncalibratedRecHitCollection>> uncalibHitTokens;
104 
107 };
108 
109 template <typename T1>
111  : useUncalib_(ps.getParameter<bool>("useUncalib")),
112  doIsolated_(ps.getParameter<bool>("doIsolated")),
113  l1TokenIsolated_(doIsolated_ ? consumes<T1Collection>(ps.getParameter<edm::InputTag>("l1TagIsolated"))
114  : edm::EDGetTokenT<T1Collection>()),
115  l1TokenNonIsolated_(consumes<T1Collection>(ps.getParameter<edm::InputTag>("l1TagNonIsolated"))),
116  l1LowerThr_(ps.getParameter<double>("l1LowerThr")),
117  l1UpperThr_(ps.getParameter<double>("l1UpperThr")),
118  l1LowerThrIgnoreIsolation_(ps.getParameter<double>("l1LowerThrIgnoreIsolation")),
119  regionEtaMargin_(ps.getParameter<double>("regionEtaMargin")),
120  regionPhiMargin_(ps.getParameter<double>("regionPhiMargin")),
121  hitLabels(ps.getParameter<std::vector<edm::InputTag>>("ecalhitLabels")),
122  productLabels(ps.getParameter<std::vector<std::string>>("productLabels")),
123  caloGeometryToken_{esConsumes()},
124  l1CaloGeometryToken_{esConsumes()} {
125  if (useUncalib_) {
126  for (unsigned int i = 0; i < hitLabels.size(); i++) {
127  uncalibHitTokens.push_back(consumes<EcalUncalibratedRecHitCollection>(hitLabels[i]));
128  produces<EcalUncalibratedRecHitCollection>(productLabels[i]);
129  }
130  } else {
131  for (unsigned int i = 0; i < hitLabels.size(); i++) {
132  hitTokens.push_back(consumes<EcalRecHitCollection>(hitLabels[i]));
133  produces<EcalRecHitCollection>(productLabels[i]);
134  }
135  }
136 }
137 
138 template <typename T1>
140 
141 template <typename T1>
144  std::vector<std::string> productTags;
145  productTags.push_back("EcalRegionalRecHitsEB");
146  productTags.push_back("EcalRegionalRecHitsEE");
147  desc.add<std::vector<std::string>>("productLabels", productTags);
148  std::vector<edm::InputTag> inputTags;
149  inputTags.push_back(edm::InputTag("hltEcalRegionalEgammaRecHit:EcalRecHitsEB"));
150  inputTags.push_back(edm::InputTag("hltEcalRegionalEgammaRecHit:EcalRecHitsEE"));
151  inputTags.push_back(edm::InputTag("hltESRegionalEgammaRecHit:EcalRecHitsES"));
152  desc.add<std::vector<edm::InputTag>>("ecalhitLabels", inputTags);
153  desc.add<edm::InputTag>("l1TagIsolated", edm::InputTag("l1extraParticles", "Isolated"));
154  desc.add<edm::InputTag>("l1TagNonIsolated", edm::InputTag("l1extraParticles", "NonIsolated"));
155  desc.add<bool>("useUncalib", true);
156  desc.add<bool>("doIsolated", true);
157  desc.add<double>("l1LowerThr", 5.0);
158  desc.add<double>("l1UpperThr", 999.);
159  desc.add<double>("l1LowerThrIgnoreIsolation", 0.0);
160  desc.add<double>("regionEtaMargin", 0.14);
161  desc.add<double>("regionPhiMargin", 0.4);
163 }
164 
165 template <typename T1>
167  // get the collection geometry:
168  auto const& geometry = eventSetup.getData(caloGeometryToken_);
169  const CaloSubdetectorGeometry* geometry_p;
170  std::unique_ptr<const CaloSubdetectorTopology> topology;
171 
172  //Get the L1 EM Particle Collection
173  edm::Handle<T1Collection> emIsolColl;
174  if (doIsolated_) {
175  evt.getByToken(l1TokenIsolated_, emIsolColl);
176  }
177 
178  // Get the CaloGeometry
179  auto const& l1CaloGeom = eventSetup.getData(l1CaloGeometryToken_);
180 
181  std::vector<RectangularEtaPhiRegion> regions;
182  if (doIsolated_)
183  getEtaPhiRegions(&regions, *emIsolColl, l1CaloGeom, true);
184 
185  if (!doIsolated_ or (l1LowerThrIgnoreIsolation_ < 64))
186  getEtaPhiRegions(&regions, evt.get(l1TokenNonIsolated_), l1CaloGeom, false);
187 
188  if (useUncalib_) {
190  for (unsigned int i = 0; i < hitLabels.size(); i++) {
191  auto uhits = std::make_unique<EcalUncalibratedRecHitCollection>();
192 
193  evt.getByToken(uncalibHitTokens[i], urhcH[i]);
194  if (!(urhcH[i].isValid())) {
195  edm::LogError("ProductNotFound") << "could not get a handle on the EcalRecHitCollection! ("
196  << hitLabels[i].encode() << ")" << std::endl;
197  return;
198  }
199  const EcalUncalibratedRecHitCollection* uncalibRecHits = urhcH[i].product();
200 
201  if (!uncalibRecHits->empty()) {
202  if ((*uncalibRecHits)[0].id().subdetId() == EcalBarrel) {
203  geometry_p = geometry.getSubdetectorGeometry(DetId::Ecal, EcalBarrel);
204  topology = std::make_unique<EcalBarrelTopology>(geometry);
205  } else if ((*uncalibRecHits)[0].id().subdetId() == EcalEndcap) {
206  geometry_p = geometry.getSubdetectorGeometry(DetId::Ecal, EcalEndcap);
207  topology = std::make_unique<EcalEndcapTopology>(geometry);
208  } else if ((*uncalibRecHits)[0].id().subdetId() == EcalPreshower) {
209  geometry_p = geometry.getSubdetectorGeometry(DetId::Ecal, EcalPreshower);
210  topology = std::make_unique<EcalPreshowerTopology>();
211  } else
212  throw(std::runtime_error("\n\nProducer encountered invalied ecalhitcollection type.\n\n"));
213 
214  if (!regions.empty()) {
216 
217  for (it = uncalibRecHits->begin(); it != uncalibRecHits->end(); it++) {
218  auto this_cell = geometry_p->getGeometry(it->id());
219 
220  std::vector<RectangularEtaPhiRegion>::const_iterator region;
221  for (region = regions.begin(); region != regions.end(); region++) {
222  if (region->inRegion(this_cell->etaPos(), this_cell->phiPos())) {
223  uhits->push_back(*it);
224  break;
225  }
226  }
227  }
228  }
229  }
230  evt.put(std::move(uhits), productLabels[i]);
231  }
232 
233  } else {
235  for (unsigned int i = 0; i < hitLabels.size(); i++) {
236  auto hits = std::make_unique<EcalRecHitCollection>();
237 
238  evt.getByToken(hitTokens[i], rhcH[i]);
239  if (!(rhcH[i].isValid())) {
240  edm::LogError("ProductNotFound") << "could not get a handle on the EcalRecHitCollection! ("
241  << hitLabels[i].encode() << ")" << std::endl;
242  return;
243  }
244  const EcalRecHitCollection* recHits = rhcH[i].product();
245 
246  if (!recHits->empty()) {
247  if ((*recHits)[0].id().subdetId() == EcalBarrel) {
248  geometry_p = geometry.getSubdetectorGeometry(DetId::Ecal, EcalBarrel);
249  topology = std::make_unique<EcalBarrelTopology>(geometry);
250  } else if ((*recHits)[0].id().subdetId() == EcalEndcap) {
251  geometry_p = geometry.getSubdetectorGeometry(DetId::Ecal, EcalEndcap);
252  topology = std::make_unique<EcalEndcapTopology>(geometry);
253  } else if ((*recHits)[0].id().subdetId() == EcalPreshower) {
254  geometry_p = geometry.getSubdetectorGeometry(DetId::Ecal, EcalPreshower);
255  topology = std::make_unique<EcalPreshowerTopology>();
256  } else
257  throw(std::runtime_error("\n\nProducer encountered invalied ecalhitcollection type.\n\n"));
258 
259  if (!regions.empty()) {
261  for (it = recHits->begin(); it != recHits->end(); it++) {
262  auto this_cell = geometry_p->getGeometry(it->id());
263 
264  std::vector<RectangularEtaPhiRegion>::const_iterator region;
265  for (region = regions.begin(); region != regions.end(); region++) {
266  if (region->inRegion(this_cell->etaPos(), this_cell->phiPos())) {
267  hits->push_back(*it);
268  break;
269  }
270  }
271  }
272  }
273  }
274  evt.put(std::move(hits), productLabels[i]);
275  }
276  }
277 }
278 
279 template <>
281  std::vector<RectangularEtaPhiRegion>* theRegions,
282  T1Collection theCandidateCollection,
283  const L1CaloGeometry& l1CaloGeom,
284  bool isolatedCase) {
285  for (unsigned int candItr = 0; candItr < theCandidateCollection.size(); candItr++) {
286  l1extra::L1EmParticle emItr = theCandidateCollection.at(candItr);
287 
288  if (!isolatedCase) {
289  if (doIsolated_ and (emItr.et() < l1LowerThrIgnoreIsolation_))
290  continue;
291  }
292 
293  if ((emItr.et() > l1LowerThr_) and (emItr.et() < l1UpperThr_)) {
294  // Access the GCT hardware object corresponding to the L1Extra EM object.
295  int etaIndex = emItr.gctEmCand()->etaIndex();
296  int phiIndex = emItr.gctEmCand()->phiIndex();
297 
298  // Use the L1CaloGeometry to find the eta, phi bin boundaries.
299  double etaLow = l1CaloGeom.etaBinLowEdge(etaIndex);
300  double etaHigh = l1CaloGeom.etaBinHighEdge(etaIndex);
301  double phiLow = l1CaloGeom.emJetPhiBinLowEdge(phiIndex);
302  double phiHigh = l1CaloGeom.emJetPhiBinHighEdge(phiIndex);
303 
304  etaLow -= regionEtaMargin_;
305  etaHigh += regionEtaMargin_;
306  phiLow -= regionPhiMargin_;
307  phiHigh += regionPhiMargin_;
308 
309  theRegions->push_back(RectangularEtaPhiRegion(etaLow, etaHigh, phiLow, phiHigh));
310  }
311  }
312 }
313 
314 template <typename T1>
315 void HLTRechitInRegionsProducer<T1>::getEtaPhiRegions(std::vector<RectangularEtaPhiRegion>* theRegions,
316  T1Collection theCandidateCollection,
317  const L1CaloGeometry& l1CaloGeom,
318  bool isolatedCase) {
319  for (unsigned int candItr = 0; candItr < theCandidateCollection.size(); candItr++) {
320  T1 emItr = theCandidateCollection.at(candItr);
321  if ((emItr.et() > l1LowerThr_) and (emItr.et() < l1UpperThr_)) {
322  double etaLow = emItr.eta() - regionEtaMargin_;
323  double etaHigh = emItr.eta() + regionEtaMargin_;
324  double phiLow = emItr.phi() - regionPhiMargin_;
325  double phiHigh = emItr.phi() + regionPhiMargin_;
326 
327  theRegions->push_back(RectangularEtaPhiRegion(etaLow, etaHigh, phiLow, phiHigh));
328  }
329  }
330 }
331 
333 DEFINE_FWK_MODULE(EgammaHLTRechitInRegionsProducer);
334 
336 DEFINE_FWK_MODULE(MuonHLTRechitInRegionsProducer);
unsigned etaIndex() const override
get eta index -6 to -0, +0 to +6 (bit 3 is sign, 1 for -ve Z, 0 for +ve Z)
Definition: L1GctEmCand.h:62
HLTRechitInRegionsProducer(const edm::ParameterSet &ps)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
double etaBinHighEdge(unsigned int etaIndex, bool central=true) const
HLTRechitInRegionsProducer< reco::RecoChargedCandidate > MuonHLTRechitInRegionsProducer
const bool isValid(const Frame &aFrame, const FrameQuality &aQuality, const uint16_t aExpectedPos)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
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
Definition: Activities.doc:12
const std::vector< edm::InputTag > hitLabels
double etaBinLowEdge(unsigned int etaIndex, bool central=true) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
HLTRechitInRegionsProducer< l1extra::L1EmParticle > EgammaHLTRechitInRegionsProducer
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const std::vector< std::string > productLabels
std::vector< T >::const_iterator const_iterator
const L1GctEmCand * gctEmCand() const
Definition: L1EmParticle.h:50
const edm::EDGetTokenT< T1Collection > l1TokenIsolated_
std::string defaultModuleLabel()
Log< level::Error, false > LogError
bool getData(T &iHolder) const
Definition: EventSetup.h:128
std::vector< edm::EDGetTokenT< EcalRecHitCollection > > hitTokens
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeometryToken_
def move
Definition: eostools.py:511
bool get(ProductID const &oid, Handle< PROD > &result) const
Definition: Event.h:346
ParameterDescriptionBase * add(U const &iLabel, T const &value)
const_iterator end() const
void produce(edm::Event &, const edm::EventSetup &) override
T const * product() const
Definition: Handle.h:70
virtual std::shared_ptr< const CaloCellGeometry > getGeometry(const DetId &id) const
Get the cell geometry of a given detector id. Should return false if not found.
const edm::ESGetToken< L1CaloGeometry, L1CaloGeometryRecord > l1CaloGeometryToken_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void getEtaPhiRegions(std::vector< RectangularEtaPhiRegion > *, T1Collection, const L1CaloGeometry &, bool)
double et() const final
transverse energy
const edm::EDGetTokenT< T1Collection > l1TokenNonIsolated_
double emJetPhiBinLowEdge(unsigned int phiIndex) const
unsigned phiIndex() const override
get phi index (0-17)
Definition: L1GctEmCand.h:68
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
const_iterator begin() const
std::vector< edm::EDGetTokenT< EcalUncalibratedRecHitCollection > > uncalibHitTokens
double emJetPhiBinHighEdge(unsigned int phiIndex) const