CMS 3D CMS Logo

HLTEgammaL1TMatchFilterRegional.cc
Go to the documentation of this file.
1 
9 
10 //#include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutSetupFwd.h"
11 
13 
15 
16 //#include "DataFormats/L1Trigger/interface/L1JetParticle.h"
17 //#include "DataFormats/L1Trigger/interface/L1JetParticleFwd.h"
19 
21 
24 
29 
30 
31 #define TWOPI 6.283185308
32 //
33 // constructors and destructor
34 //
36 {
37  candIsolatedTag_ = iConfig.getParameter< edm::InputTag > ("candIsolatedTag");
38  l1EGTag_ = iConfig.getParameter< edm::InputTag > ("l1IsolatedTag"); //will be renamed l1EGTag for step 2 of the new L1 migration
39  candNonIsolatedTag_ = iConfig.getParameter< edm::InputTag > ("candNonIsolatedTag");
40  L1SeedFilterTag_ = iConfig.getParameter< edm::InputTag > ("L1SeedFilterTag");
41  l1JetsTag_ = iConfig.getParameter< edm::InputTag > ("l1CenJetsTag"); //will be renamed l1JetsTag for step 2 of the new L1 migration
42  l1TausTag_ = iConfig.getParameter< edm::InputTag > ("l1TausTag"); //will be renamed l1JetsTag for step 2 of the new L1 migration
43  ncandcut_ = iConfig.getParameter<int> ("ncandcut");
44  doIsolated_ = iConfig.getParameter<bool>("doIsolated");
45  region_eta_size_ = iConfig.getParameter<double> ("region_eta_size");
46  region_eta_size_ecap_ = iConfig.getParameter<double> ("region_eta_size_ecap");
47  region_phi_size_ = iConfig.getParameter<double> ("region_phi_size");
48  barrel_end_ = iConfig.getParameter<double> ("barrel_end");
49  endcap_end_ = iConfig.getParameter<double> ("endcap_end");
50 
51  candIsolatedToken_ = consumes<reco::RecoEcalCandidateCollection>(candIsolatedTag_);
52  if(!doIsolated_) candNonIsolatedToken_ = consumes<reco::RecoEcalCandidateCollection>(candNonIsolatedTag_);
53  L1SeedFilterToken_ = consumes<trigger::TriggerFilterObjectWithRefs>(L1SeedFilterTag_);
54 }
55 
57 
58 void
62  desc.add<edm::InputTag>("candIsolatedTag",edm::InputTag("hltRecoIsolatedEcalCandidate"));
63  desc.add<edm::InputTag>("l1IsolatedTag",edm::InputTag("hltCaloStage2Digis")); //rename for step 2 of the L1 migration
64  desc.add<edm::InputTag>("candNonIsolatedTag",edm::InputTag("hltRecoNonIsolatedEcalCandidate"));
65  desc.add<edm::InputTag>("l1NonIsolatedTag",edm::InputTag("l1extraParticles","NonIsolated")); //drop for step 2 of the L1 migration
66  desc.add<edm::InputTag>("L1SeedFilterTag",edm::InputTag("theL1SeedFilter"));
67  desc.add<edm::InputTag>("l1CenJetsTag",edm::InputTag("hltCaloStage2Digis")); //rename for step 2 of L1 migration
68  desc.add<edm::InputTag>("l1TausTag",edm::InputTag("hltCaloStage2Digis","Tau")); //rename for step 2 of L1 migration
69  desc.add<int>("ncandcut",1);
70  desc.add<bool>("doIsolated",true);
71  desc.add<double>("region_eta_size",0.522);
72  desc.add<double>("region_eta_size_ecap",1.0);
73  desc.add<double>("region_phi_size",1.044);
74  desc.add<double>("barrel_end",1.4791);
75  desc.add<double>("endcap_end",2.65);
76  descriptions.add("HLTEgammaL1TMatchFilterRegional",desc);
77 }
78 
79 // ------------ method called to produce the data ------------
80 //configuration:
81 //doIsolated=true, only isolated superclusters are allowed to match isolated L1 seeds
82 //doIsolated=false, isolated superclusters are allowed to match either iso or non iso L1 seeds, non isolated superclusters are allowed only to match non-iso seeds. If no collection name is given for non-isolated superclusters, assumes the the isolated collection contains all (both iso + non iso) seeded superclusters.
83 bool
85 {
86  // std::cout <<"runnr "<<iEvent.id().run()<<" event "<<iEvent.id().event()<<std::endl;
87  using namespace trigger;
88  //using namespace l1extra;
89 
90  if (saveTags()) {
91  filterproduct.addCollectionTag(l1EGTag_);
92  filterproduct.addCollectionTag(l1JetsTag_);
93  filterproduct.addCollectionTag(l1TausTag_);
94  filterproduct.addCollectionTag(candIsolatedTag_);
95  if(!doIsolated_ && !candNonIsolatedTag_.label().empty()) {
97  }
98  }
99 
101 
102  // Get the CaloGeometry
103  edm::ESHandle<L1CaloGeometry> l1CaloGeom ;
104  iSetup.get<L1CaloGeometryRecord>().get(l1CaloGeom) ;
105 
106 
107  // look at all candidates, check cuts and add to filter object
108  int n(0);
109 
110  // Get the recoEcalCandidates
112  iEvent.getByToken(candIsolatedToken_,recoIsolecalcands);
113 
114 
116  iEvent.getByToken (L1SeedFilterToken_,L1SeedOutput);
117 
118  std::vector<l1t::EGammaRef> l1EGs;
119  L1SeedOutput->getObjects(TriggerL1EG, l1EGs);
120 
121  std::vector<l1t::JetRef> l1Jets;
122  L1SeedOutput->getObjects(TriggerL1Jet, l1Jets);
123 
124  std::vector<l1t::TauRef> l1Taus;
125  L1SeedOutput->getObjects(TriggerL1Tau, l1Taus);
126 
127  int countCand=0;
128  for (auto recoecalcand= recoIsolecalcands->begin(); recoecalcand!=recoIsolecalcands->end(); recoecalcand++) {
129  countCand++;
130  if(std::abs(recoecalcand->eta()) < endcap_end_){
131  //SC should be inside the ECAL fiducial volume
132 
133  //now EGamma is just one collection so automatically matches to Isolated and NonIsolated Seeds
134  //it is assumed the HLTL1TSeed module fills it with the correct seeds
135  bool matchedSCEG = matchedToL1Cand(l1EGs,recoecalcand->eta(),recoecalcand->phi());
136  bool matchedSCJet = matchedToL1Cand(l1Jets,recoecalcand->eta(),recoecalcand->phi());
137  bool matchedSCTau = matchedToL1Cand(l1Taus,recoecalcand->eta(),recoecalcand->phi());
138 
139  if(matchedSCEG || matchedSCJet || matchedSCTau) {
140  n++;
141  ref = edm::Ref<reco::RecoEcalCandidateCollection>(recoIsolecalcands, distance(recoIsolecalcands->begin(),recoecalcand) );
142  filterproduct.addObject(TriggerCluster, ref);
143  }//end matched check
144 
145  }//end endcap fiduical check
146 
147  }//end loop over all isolated RecoEcalCandidates
148 
149  //if doIsolated_ is false now run over the nonisolated superclusters and EG
150  //however in the case we have a single collection of superclusters containing both iso L1 and non iso L1 seeded superclusters,
151  //we do not have a non isolated collection of superclusters so we have to protect against that
152  if(!doIsolated_ && !candNonIsolatedTag_.label().empty()) {
154  iEvent.getByToken(candNonIsolatedToken_,recoNonIsolecalcands);
155 
156  for (auto recoecalcand= recoNonIsolecalcands->begin(); recoecalcand!=recoNonIsolecalcands->end(); recoecalcand++) {
157  countCand++;
158 
159  if(std::abs(recoecalcand->eta()) < endcap_end_){
160  bool matchedSCEG = matchedToL1Cand(l1EGs,recoecalcand->eta(),recoecalcand->phi());
161  bool matchedSCJet = matchedToL1Cand(l1Jets,recoecalcand->eta(),recoecalcand->phi());
162  bool matchedSCTau = matchedToL1Cand(l1Taus,recoecalcand->eta(),recoecalcand->phi());
163 
164  if(matchedSCEG || matchedSCJet || matchedSCTau) {
165  n++;
166  ref = edm::Ref<reco::RecoEcalCandidateCollection>(recoNonIsolecalcands, distance(recoNonIsolecalcands->begin(),recoecalcand) );
167  filterproduct.addObject(TriggerCluster, ref);
168  }//end matched check
169 
170  }//end endcap fiduical check
171 
172  }//end loop over all isolated RecoEcalCandidates
173  }//end doIsolatedCheck
174 
175 
176  // filter decision
177  bool accept(n>=ncandcut_);
178 
179  return accept;
180 }
181 
182 
183 bool
184 HLTEgammaL1TMatchFilterRegional::matchedToL1Cand(const std::vector<l1t::EGammaRef>& l1Cands,const float scEta,const float scPhi) const
185 {
186  for (auto const & l1Cand : l1Cands) {
187  //ORCA matching method
188  double etaBinLow = 0.;
189  double etaBinHigh = 0.;
190  if(std::abs(scEta) < barrel_end_){
191  etaBinLow = l1Cand->eta() - region_eta_size_/2.;
192  etaBinHigh = etaBinLow + region_eta_size_;
193  }
194  else{
195  etaBinLow = l1Cand->eta() - region_eta_size_ecap_/2.;
196  etaBinHigh = etaBinLow + region_eta_size_ecap_;
197  }
198 
199  float deltaphi=std::abs(scPhi -l1Cand->phi());
200  if(deltaphi>TWOPI) deltaphi-=TWOPI;
201  if(deltaphi>TWOPI/2.) deltaphi=TWOPI-deltaphi;
202 
203  if(scEta < etaBinHigh && scEta > etaBinLow && deltaphi <region_phi_size_/2. ) {
204  return true;
205  }
206  }
207  return false;
208 }
209 
210 bool
211 //HLTEgammaL1TMatchFilterRegional::matchedToL1Cand(const std::vector<l1extra::L1JetParticleRef >& l1Cands,const float scEta,const float scPhi) const
212 HLTEgammaL1TMatchFilterRegional::matchedToL1Cand(const std::vector<l1t::JetRef>& l1Cands,const float scEta,const float scPhi) const
213 {
214  for (auto const & l1Cand : l1Cands) {
215  //ORCA matching method
216  double etaBinLow = 0.;
217  double etaBinHigh = 0.;
218  if(std::abs(scEta) < barrel_end_){
219  etaBinLow = l1Cand->eta() - region_eta_size_/2.;
220  etaBinHigh = etaBinLow + region_eta_size_;
221  }
222  else{
223  etaBinLow = l1Cand->eta() - region_eta_size_ecap_/2.;
224  etaBinHigh = etaBinLow + region_eta_size_ecap_;
225  }
226 
227  float deltaphi=std::abs(scPhi -l1Cand->phi());
228  if(deltaphi>TWOPI) deltaphi-=TWOPI;
229  if(deltaphi>TWOPI/2.) deltaphi=TWOPI-deltaphi;
230 
231  if(scEta < etaBinHigh && scEta > etaBinLow && deltaphi <region_phi_size_/2. ) {
232  return true;
233  }
234  }
235  return false;
236 }
237 bool
238 //HLTEgammaL1TMatchFilterRegional::matchedToL1Cand(const std::vector<l1extra::L1JetParticleRef >& l1Cands,const float scEta,const float scPhi) const
239 HLTEgammaL1TMatchFilterRegional::matchedToL1Cand(const std::vector<l1t::TauRef>& l1Cands,const float scEta,const float scPhi) const
240 {
241  for (auto const & l1Cand : l1Cands) {
242  //ORCA matching method
243  double etaBinLow = 0.;
244  double etaBinHigh = 0.;
245  if(std::abs(scEta) < barrel_end_){
246  etaBinLow = l1Cand->eta() - region_eta_size_/2.;
247  etaBinHigh = etaBinLow + region_eta_size_;
248  }
249  else{
250  etaBinLow = l1Cand->eta() - region_eta_size_ecap_/2.;
251  etaBinHigh = etaBinLow + region_eta_size_ecap_;
252  }
253 
254  float deltaphi=std::abs(scPhi -l1Cand->phi());
255  if(deltaphi>TWOPI) deltaphi-=TWOPI;
256  if(deltaphi>TWOPI/2.) deltaphi=TWOPI-deltaphi;
257 
258  if(scEta < etaBinHigh && scEta > etaBinLow && deltaphi <region_phi_size_/2. ) {
259  return true;
260  }
261  }
262  return false;
263 }
264 
265 // declare this class as a framework plugin
T getParameter(std::string const &) const
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
edm::EDGetTokenT< reco::RecoEcalCandidateCollection > candNonIsolatedToken_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:30
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
HLTEgammaL1TMatchFilterRegional(const edm::ParameterSet &)
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
edm::EDGetTokenT< reco::RecoEcalCandidateCollection > candIsolatedToken_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
Definition: HLTFilter.cc:29
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
std::string const & label() const
Definition: InputTag.h:36
bool saveTags() const
Definition: HLTFilter.h:45
T get() const
Definition: EventSetup.h:71
bool matchedToL1Cand(const std::vector< l1t::EGammaRef > &l1Cands, const float scEta, const float scPhi) const
edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > L1SeedFilterToken_