CMS 3D CMS Logo

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 };
105 
106 template <typename T1>
108  : useUncalib_(ps.getParameter<bool>("useUncalib")),
109  doIsolated_(ps.getParameter<bool>("doIsolated")),
110  l1TokenIsolated_(doIsolated_ ? consumes<T1Collection>(ps.getParameter<edm::InputTag>("l1TagIsolated"))
111  : edm::EDGetTokenT<T1Collection>()),
112  l1TokenNonIsolated_(consumes<T1Collection>(ps.getParameter<edm::InputTag>("l1TagNonIsolated"))),
113  l1LowerThr_(ps.getParameter<double>("l1LowerThr")),
114  l1UpperThr_(ps.getParameter<double>("l1UpperThr")),
115  l1LowerThrIgnoreIsolation_(ps.getParameter<double>("l1LowerThrIgnoreIsolation")),
116  regionEtaMargin_(ps.getParameter<double>("regionEtaMargin")),
117  regionPhiMargin_(ps.getParameter<double>("regionPhiMargin")),
118  hitLabels(ps.getParameter<std::vector<edm::InputTag>>("ecalhitLabels")),
119  productLabels(ps.getParameter<std::vector<std::string>>("productLabels")) {
120  if (useUncalib_) {
121  for (unsigned int i = 0; i < hitLabels.size(); i++) {
122  uncalibHitTokens.push_back(consumes<EcalUncalibratedRecHitCollection>(hitLabels[i]));
123  produces<EcalUncalibratedRecHitCollection>(productLabels[i]);
124  }
125  } else {
126  for (unsigned int i = 0; i < hitLabels.size(); i++) {
127  hitTokens.push_back(consumes<EcalRecHitCollection>(hitLabels[i]));
128  produces<EcalRecHitCollection>(productLabels[i]);
129  }
130  }
131 }
132 
133 template <typename T1>
135 
136 template <typename T1>
139  std::vector<std::string> productTags;
140  productTags.push_back("EcalRegionalRecHitsEB");
141  productTags.push_back("EcalRegionalRecHitsEE");
142  desc.add<std::vector<std::string>>("productLabels", productTags);
143  std::vector<edm::InputTag> inputTags;
144  inputTags.push_back(edm::InputTag("hltEcalRegionalEgammaRecHit:EcalRecHitsEB"));
145  inputTags.push_back(edm::InputTag("hltEcalRegionalEgammaRecHit:EcalRecHitsEE"));
146  inputTags.push_back(edm::InputTag("hltESRegionalEgammaRecHit:EcalRecHitsES"));
147  desc.add<std::vector<edm::InputTag>>("ecalhitLabels", inputTags);
148  desc.add<edm::InputTag>("l1TagIsolated", edm::InputTag("l1extraParticles", "Isolated"));
149  desc.add<edm::InputTag>("l1TagNonIsolated", edm::InputTag("l1extraParticles", "NonIsolated"));
150  desc.add<bool>("useUncalib", true);
151  desc.add<bool>("doIsolated", true);
152  desc.add<double>("l1LowerThr", 5.0);
153  desc.add<double>("l1UpperThr", 999.);
154  desc.add<double>("l1LowerThrIgnoreIsolation", 0.0);
155  desc.add<double>("regionEtaMargin", 0.14);
156  desc.add<double>("regionPhiMargin", 0.4);
158 }
159 
160 template <typename T1>
162  // get the collection geometry:
163  edm::ESHandle<CaloGeometry> geoHandle;
164  es.get<CaloGeometryRecord>().get(geoHandle);
165  const CaloGeometry& geometry = *geoHandle;
166  const CaloSubdetectorGeometry* geometry_p;
167  std::unique_ptr<const CaloSubdetectorTopology> topology;
168 
169  //Get the L1 EM Particle Collection
170  edm::Handle<T1Collection> emIsolColl;
171  if (doIsolated_) {
172  evt.getByToken(l1TokenIsolated_, emIsolColl);
173  }
174 
175  //Get the L1 EM Particle Collection
176  edm::Handle<T1Collection> emNonIsolColl;
177  evt.getByToken(l1TokenNonIsolated_, emNonIsolColl);
178 
179  // Get the CaloGeometry
181  es.get<L1CaloGeometryRecord>().get(l1CaloGeom);
182 
183  std::vector<RectangularEtaPhiRegion> regions;
184  if (doIsolated_)
185  getEtaPhiRegions(&regions, *emIsolColl, *l1CaloGeom, true);
186 
187  if (!doIsolated_ or (l1LowerThrIgnoreIsolation_ < 64))
188  getEtaPhiRegions(&regions, *emNonIsolColl, *l1CaloGeom, false);
189 
190  if (useUncalib_) {
192  for (unsigned int i = 0; i < hitLabels.size(); i++) {
193  auto uhits = std::make_unique<EcalUncalibratedRecHitCollection>();
194 
195  evt.getByToken(uncalibHitTokens[i], urhcH[i]);
196  if (!(urhcH[i].isValid())) {
197  edm::LogError("ProductNotFound") << "could not get a handle on the EcalRecHitCollection! ("
198  << hitLabels[i].encode() << ")" << std::endl;
199  return;
200  }
201  const EcalUncalibratedRecHitCollection* uncalibRecHits = urhcH[i].product();
202 
203  if (!uncalibRecHits->empty()) {
204  if ((*uncalibRecHits)[0].id().subdetId() == EcalBarrel) {
205  geometry_p = geometry.getSubdetectorGeometry(DetId::Ecal, EcalBarrel);
206  topology = std::make_unique<EcalBarrelTopology>(*geoHandle);
207  } else if ((*uncalibRecHits)[0].id().subdetId() == EcalEndcap) {
208  geometry_p = geometry.getSubdetectorGeometry(DetId::Ecal, EcalEndcap);
209  topology = std::make_unique<EcalEndcapTopology>(*geoHandle);
210  } else if ((*uncalibRecHits)[0].id().subdetId() == EcalPreshower) {
211  geometry_p = geometry.getSubdetectorGeometry(DetId::Ecal, EcalPreshower);
212  topology = std::make_unique<EcalPreshowerTopology>();
213  } else
214  throw(std::runtime_error("\n\nProducer encountered invalied ecalhitcollection type.\n\n"));
215 
216  if (!regions.empty()) {
218 
219  for (it = uncalibRecHits->begin(); it != uncalibRecHits->end(); it++) {
220  auto this_cell = geometry_p->getGeometry(it->id());
221 
222  std::vector<RectangularEtaPhiRegion>::const_iterator region;
223  for (region = regions.begin(); region != regions.end(); region++) {
224  if (region->inRegion(this_cell->etaPos(), this_cell->phiPos())) {
225  uhits->push_back(*it);
226  break;
227  }
228  }
229  }
230  }
231  }
232  evt.put(std::move(uhits), productLabels[i]);
233  }
234 
235  } else {
237  for (unsigned int i = 0; i < hitLabels.size(); i++) {
238  auto hits = std::make_unique<EcalRecHitCollection>();
239 
240  evt.getByToken(hitTokens[i], rhcH[i]);
241  if (!(rhcH[i].isValid())) {
242  edm::LogError("ProductNotFound") << "could not get a handle on the EcalRecHitCollection! ("
243  << hitLabels[i].encode() << ")" << std::endl;
244  return;
245  }
246  const EcalRecHitCollection* recHits = rhcH[i].product();
247 
248  if (!recHits->empty()) {
249  if ((*recHits)[0].id().subdetId() == EcalBarrel) {
250  geometry_p = geometry.getSubdetectorGeometry(DetId::Ecal, EcalBarrel);
251  topology = std::make_unique<EcalBarrelTopology>(*geoHandle);
252  } else if ((*recHits)[0].id().subdetId() == EcalEndcap) {
253  geometry_p = geometry.getSubdetectorGeometry(DetId::Ecal, EcalEndcap);
254  topology = std::make_unique<EcalEndcapTopology>(*geoHandle);
255  } else if ((*recHits)[0].id().subdetId() == EcalPreshower) {
256  geometry_p = geometry.getSubdetectorGeometry(DetId::Ecal, EcalPreshower);
257  topology = std::make_unique<EcalPreshowerTopology>();
258  } else
259  throw(std::runtime_error("\n\nProducer encountered invalied ecalhitcollection type.\n\n"));
260 
261  if (!regions.empty()) {
263  for (it = recHits->begin(); it != recHits->end(); it++) {
264  auto this_cell = geometry_p->getGeometry(it->id());
265 
266  std::vector<RectangularEtaPhiRegion>::const_iterator region;
267  for (region = regions.begin(); region != regions.end(); region++) {
268  if (region->inRegion(this_cell->etaPos(), this_cell->phiPos())) {
269  hits->push_back(*it);
270  break;
271  }
272  }
273  }
274  }
275  }
276  evt.put(std::move(hits), productLabels[i]);
277  }
278  }
279 }
280 
281 template <>
283  std::vector<RectangularEtaPhiRegion>* theRegions,
284  T1Collection theCandidateCollection,
285  const L1CaloGeometry& l1CaloGeom,
286  bool isolatedCase) {
287  for (unsigned int candItr = 0; candItr < theCandidateCollection.size(); candItr++) {
288  l1extra::L1EmParticle emItr = theCandidateCollection.at(candItr);
289 
290  if (!isolatedCase) {
291  if (doIsolated_ and (emItr.et() < l1LowerThrIgnoreIsolation_))
292  continue;
293  }
294 
295  if ((emItr.et() > l1LowerThr_) and (emItr.et() < l1UpperThr_)) {
296  // Access the GCT hardware object corresponding to the L1Extra EM object.
297  int etaIndex = emItr.gctEmCand()->etaIndex();
298  int phiIndex = emItr.gctEmCand()->phiIndex();
299 
300  // Use the L1CaloGeometry to find the eta, phi bin boundaries.
301  double etaLow = l1CaloGeom.etaBinLowEdge(etaIndex);
302  double etaHigh = l1CaloGeom.etaBinHighEdge(etaIndex);
303  double phiLow = l1CaloGeom.emJetPhiBinLowEdge(phiIndex);
304  double phiHigh = l1CaloGeom.emJetPhiBinHighEdge(phiIndex);
305 
306  etaLow -= regionEtaMargin_;
307  etaHigh += regionEtaMargin_;
308  phiLow -= regionPhiMargin_;
309  phiHigh += regionPhiMargin_;
310 
311  theRegions->push_back(RectangularEtaPhiRegion(etaLow, etaHigh, phiLow, phiHigh));
312  }
313  }
314 }
315 
316 template <typename T1>
317 void HLTRechitInRegionsProducer<T1>::getEtaPhiRegions(std::vector<RectangularEtaPhiRegion>* theRegions,
318  T1Collection theCandidateCollection,
319  const L1CaloGeometry& l1CaloGeom,
320  bool isolatedCase) {
321  for (unsigned int candItr = 0; candItr < theCandidateCollection.size(); candItr++) {
322  T1 emItr = theCandidateCollection.at(candItr);
323  if ((emItr.et() > l1LowerThr_) and (emItr.et() < l1UpperThr_)) {
324  double etaLow = emItr.eta() - regionEtaMargin_;
325  double etaHigh = emItr.eta() + regionEtaMargin_;
326  double phiLow = emItr.phi() - regionPhiMargin_;
327  double phiHigh = emItr.phi() + regionPhiMargin_;
328 
329  theRegions->push_back(RectangularEtaPhiRegion(etaLow, etaHigh, phiLow, phiHigh));
330  }
331  }
332 }
333 
336 
defaultModuleLabel.h
ConfigurationDescriptions.h
EcalPreshowerTopology.h
HLTRechitInRegionsProducer::produce
void produce(edm::Event &, const edm::EventSetup &) override
Definition: HLTRechitInRegionsProducer.cc:161
L1CaloGeometry::emJetPhiBinHighEdge
double emJetPhiBinHighEdge(unsigned int phiIndex) const
Definition: L1CaloGeometry.cc:232
HLTRechitInRegionsProducer::regionPhiMargin_
const double regionPhiMargin_
Definition: HLTRechitInRegionsProducer.cc:97
Handle.h
electrons_cff.bool
bool
Definition: electrons_cff.py:372
mps_fire.i
i
Definition: mps_fire.py:355
edm::ParameterSetDescription::add
ParameterDescriptionBase * add(U const &iLabel, T const &value)
Definition: ParameterSetDescription.h:95
edm::SortedCollection::const_iterator
std::vector< T >::const_iterator const_iterator
Definition: SortedCollection.h:80
MessageLogger.h
edm::Handle::product
T const * product() const
Definition: Handle.h:70
hfClusterShapes_cfi.hits
hits
Definition: hfClusterShapes_cfi.py:5
ESHandle.h
HLTRechitInRegionsProducer::useUncalib_
const bool useUncalib_
Definition: HLTRechitInRegionsProducer.cc:86
EcalSeverityLevelAlgoRcd.h
RectangularEtaPhiRegion.h
edm::EDGetTokenT< T1Collection >
CaloGeometryRecord
Definition: CaloGeometryRecord.h:30
edm
HLT enums.
Definition: AlignableModifier.h:19
HLTRechitInRegionsProducer::hitTokens
std::vector< edm::EDGetTokenT< EcalRecHitCollection > > hitTokens
Definition: HLTRechitInRegionsProducer.cc:102
L1CaloGeometry::etaBinHighEdge
double etaBinHighEdge(unsigned int etaIndex, bool central=true) const
Definition: L1CaloGeometry.cc:205
geometry
Definition: geometry.py:1
EBDetId.h
HLTRechitInRegionsProducer::l1TokenNonIsolated_
const edm::EDGetTokenT< T1Collection > l1TokenNonIsolated_
Definition: HLTRechitInRegionsProducer.cc:91
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
EcalBarrelTopology.h
EDProducer.h
edm::SortedCollection
Definition: SortedCollection.h:49
EcalUncalibratedRecHit.h
HLTRechitInRegionsProducer::~HLTRechitInRegionsProducer
~HLTRechitInRegionsProducer() override
Definition: HLTRechitInRegionsProducer.cc:134
edm::Handle
Definition: AssociativeIterator.h:50
RecoCandidate.h
RectangularEtaPhiRegion
Definition: RectangularEtaPhiRegion.h:6
EcalBarrel
Definition: EcalSubdetector.h:10
EcalRecHitCollections.h
HLTRechitInRegionsProducer
Definition: HLTRechitInRegionsProducer.cc:72
MakerMacros.h
CaloGeometry
Definition: CaloGeometry.h:21
edm::EventSetup::get
T get() const
Definition: EventSetup.h:73
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
HLTRechitInRegionsProducer::doIsolated_
const bool doIsolated_
Definition: HLTRechitInRegionsProducer.cc:88
ecaldqm::topology
const CaloTopology * topology(nullptr)
edm::SortedCollection::begin
const_iterator begin() const
Definition: SortedCollection.h:262
l1extra::L1EmParticle
Definition: L1EmParticle.h:28
HLTRechitInRegionsProducer::T1iterator
T1::const_iterator T1iterator
Definition: HLTRechitInRegionsProducer.cc:74
edm::ESHandle< CaloGeometry >
HLTMuonOfflineAnalyzer_cfi.inputTags
inputTags
All input tags are specified in this pset for convenience.
Definition: HLTMuonOfflineAnalyzer_cfi.py:82
HLTRechitInRegionsProducer::regionEtaMargin_
const double regionEtaMargin_
Definition: HLTRechitInRegionsProducer.cc:96
StringToEnumValue.h
edm::Event::getByToken
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:528
ParameterSetDescription.h
HLTRechitInRegionsProducer::hitLabels
const std::vector< edm::InputTag > hitLabels
Definition: HLTRechitInRegionsProducer.cc:99
EDGetToken.h
EcalSeverityLevelAlgo.h
L1CaloGeometryRecord
Definition: L1CaloGeometryRecord.h:30
CaloGeometryRecord.h
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
L1EmParticleFwd.h
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
EcalEndcap
Definition: EcalSubdetector.h:10
FastTrackerRecHitMaskProducer_cfi.recHits
recHits
Definition: FastTrackerRecHitMaskProducer_cfi.py:8
CaloSubdetectorGeometry.h
HLT_2018_cff.InputTag
InputTag
Definition: HLT_2018_cff.py:79016
edm::ParameterSet
Definition: ParameterSet.h:36
edm::LogError
Definition: MessageLogger.h:183
defaultModuleLabel
std::string defaultModuleLabel()
Definition: defaultModuleLabel.h:16
Event.h
L1CaloGeometry
Definition: L1CaloGeometry.h:33
EcalEndcapTopology.h
L1CaloGeometryRecord.h
edm::SortedCollection::end
const_iterator end() const
Definition: SortedCollection.h:267
HLTRechitInRegionsProducer::l1LowerThrIgnoreIsolation_
const double l1LowerThrIgnoreIsolation_
Definition: HLTRechitInRegionsProducer.cc:94
l1extra::L1EmParticle::gctEmCand
const L1GctEmCand * gctEmCand() const
Definition: L1EmParticle.h:50
HLTRechitInRegionsProducer::uncalibHitTokens
std::vector< edm::EDGetTokenT< EcalUncalibratedRecHitCollection > > uncalibHitTokens
Definition: HLTRechitInRegionsProducer.cc:103
edm::Event::put
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:132
edm::stream::EDProducer
Definition: EDProducer.h:38
CaloSubdetectorGeometry::getGeometry
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.
Definition: CaloSubdetectorGeometry.cc:36
edm::EventSetup
Definition: EventSetup.h:57
L1EmParticle.h
HLTRechitInRegionsProducer::T1Collection
std::vector< T1 > T1Collection
Definition: HLTRechitInRegionsProducer.cc:73
DetId::Ecal
Definition: DetId.h:27
get
#define get
EcalRecHit.h
HLTRechitInRegionsProducer::l1TokenIsolated_
const edm::EDGetTokenT< T1Collection > l1TokenIsolated_
Definition: HLTRechitInRegionsProducer.cc:90
HLTRechitInRegionsProducer::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: HLTRechitInRegionsProducer.cc:137
L1CaloGeometry::emJetPhiBinLowEdge
double emJetPhiBinLowEdge(unsigned int phiIndex) const
Definition: L1CaloGeometry.cc:228
EcalPreshower
Definition: EcalSubdetector.h:10
reco::LeafCandidate::et
double et() const final
transverse energy
Definition: LeafCandidate.h:127
CaloCellGeometry.h
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
HLT_2018_cff.productLabels
productLabels
Definition: HLT_2018_cff.py:13236
RecoChargedCandidate.h
Frameworkfwd.h
CaloGeometry.h
HLT_2018_cff.region
region
Definition: HLT_2018_cff.py:81479
HLTRechitInRegionsProducer::l1LowerThr_
const double l1LowerThr_
Definition: HLTRechitInRegionsProducer.cc:92
EventSetup.h
or
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
Definition: Activities.doc:12
CaloSubdetectorGeometry
Definition: CaloSubdetectorGeometry.h:22
EgammaHLTRechitInRegionsProducer
HLTRechitInRegionsProducer< l1extra::L1EmParticle > EgammaHLTRechitInRegionsProducer
Definition: HLTRechitInRegionsProducer.cc:334
HLTRechitInRegionsProducer::productLabels
const std::vector< std::string > productLabels
Definition: HLTRechitInRegionsProducer.cc:100
HLTRechitInRegionsProducer::l1UpperThr_
const double l1UpperThr_
Definition: HLTRechitInRegionsProducer.cc:93
L1GctEmCand::etaIndex
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
AlignmentPI::regions
regions
Definition: AlignmentPayloadInspectorHelper.h:76
HLTRechitInRegionsProducer::HLTRechitInRegionsProducer
HLTRechitInRegionsProducer(const edm::ParameterSet &ps)
Definition: HLTRechitInRegionsProducer.cc:107
ParameterSet.h
HLTRechitInRegionsProducer::getEtaPhiRegions
void getEtaPhiRegions(std::vector< RectangularEtaPhiRegion > *, T1Collection, const L1CaloGeometry &, bool)
Definition: HLTRechitInRegionsProducer.cc:317
edm::Event
Definition: Event.h:73
EcalChannelStatus.h
L1CaloGeometry.h
edm::InputTag
Definition: InputTag.h:15
L1GctEmCand::phiIndex
unsigned phiIndex() const override
get phi index (0-17)
Definition: L1GctEmCand.h:68
EcalChannelStatusRcd.h
L1CaloGeometry::etaBinLowEdge
double etaBinLowEdge(unsigned int etaIndex, bool central=true) const
Definition: L1CaloGeometry.cc:186
MuonHLTRechitInRegionsProducer
HLTRechitInRegionsProducer< reco::RecoChargedCandidate > MuonHLTRechitInRegionsProducer
Definition: HLTRechitInRegionsProducer.cc:337
edm::SortedCollection::empty
bool empty() const
Definition: SortedCollection.h:210