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 
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 
334 
defaultModuleLabel.h
ConfigurationDescriptions.h
EcalPreshowerTopology.h
HLTRechitInRegionsProducer::produce
void produce(edm::Event &, const edm::EventSetup &) override
Definition: HLTRechitInRegionsProducer.cc:166
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:393
mps_fire.i
i
Definition: mps_fire.py:428
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 >
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
HLT_FULL_cff.InputTag
InputTag
Definition: HLT_FULL_cff.py:89287
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:139
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
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
HLT_FULL_cff.productLabels
productLabels
Definition: HLT_FULL_cff.py:14616
HLTRechitInRegionsProducer::T1iterator
T1::const_iterator T1iterator
Definition: HLTRechitInRegionsProducer.cc:74
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:531
ParameterSetDescription.h
HLTRechitInRegionsProducer::hitLabels
const std::vector< edm::InputTag > hitLabels
Definition: HLTRechitInRegionsProducer.cc:99
EDGetToken.h
EcalSeverityLevelAlgo.h
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
Phase1L1TJetProducer_cfi.phiLow
phiLow
Definition: Phase1L1TJetProducer_cfi.py:21
CaloSubdetectorGeometry.h
edm::ParameterSet
Definition: ParameterSet.h:47
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
HLT_FULL_cff.region
region
Definition: HLT_FULL_cff.py:88272
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:133
trackerHitRTTI::vector
Definition: trackerHitRTTI.h:21
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
edm::LogError
Log< level::Error, false > LogError
Definition: MessageLogger.h:123
HLTRechitInRegionsProducer::T1Collection
std::vector< T1 > T1Collection
Definition: HLTRechitInRegionsProducer.cc:73
DetId::Ecal
Definition: DetId.h:27
edm::ESGetToken< CaloGeometry, CaloGeometryRecord >
EcalRecHit.h
edm::EventSetup::getData
bool getData(T &iHolder) const
Definition: EventSetup.h:120
HLTRechitInRegionsProducer::l1TokenIsolated_
const edm::EDGetTokenT< T1Collection > l1TokenIsolated_
Definition: HLTRechitInRegionsProducer.cc:90
HLTRechitInRegionsProducer::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: HLTRechitInRegionsProducer.cc:142
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
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
RecoChargedCandidate.h
Frameworkfwd.h
CaloGeometry.h
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:332
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:110
ParameterSet.h
HLTRechitInRegionsProducer::getEtaPhiRegions
void getEtaPhiRegions(std::vector< RectangularEtaPhiRegion > *, T1Collection, const L1CaloGeometry &, bool)
Definition: HLTRechitInRegionsProducer.cc:315
HLTRechitInRegionsProducer::caloGeometryToken_
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeometryToken_
Definition: HLTRechitInRegionsProducer.cc:105
edm::Event
Definition: Event.h:73
EcalChannelStatus.h
L1CaloGeometry.h
edm::Event::get
bool get(ProductID const &oid, Handle< PROD > &result) const
Definition: Event.h:338
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
HLTRechitInRegionsProducer::l1CaloGeometryToken_
const edm::ESGetToken< L1CaloGeometry, L1CaloGeometryRecord > l1CaloGeometryToken_
Definition: HLTRechitInRegionsProducer.cc:106
MuonHLTRechitInRegionsProducer
HLTRechitInRegionsProducer< reco::RecoChargedCandidate > MuonHLTRechitInRegionsProducer
Definition: HLTRechitInRegionsProducer.cc:335
edm::SortedCollection::empty
bool empty() const
Definition: SortedCollection.h:210