CMS 3D CMS Logo

HLTEgammaGenericQuadraticEtaFilter.cc
Go to the documentation of this file.
1 
9 
11 
15 
21 
22 //
23 // constructors and destructor
24 //
26  candTag_ = iConfig.getParameter< edm::InputTag > ("candTag");
27  varTag_ = iConfig.getParameter< edm::InputTag > ("varTag");
28  rhoTag_ = iConfig.getParameter< edm::InputTag > ("rhoTag");
29 
30  energyLowEdges_ = iConfig.getParameter<std::vector<double> > ("energyLowEdges");
31  lessThan_ = iConfig.getParameter<bool> ("lessThan");
32  useEt_ = iConfig.getParameter<bool> ("useEt");
33 
34  etaBoundaryEB12_ = iConfig.getParameter<double> ("etaBoundaryEB12");
35  etaBoundaryEE12_ = iConfig.getParameter<double> ("etaBoundaryEE12");
36 
37  thrRegularEB1_ = iConfig.getParameter<std::vector<double> > ("thrRegularEB1");
38  thrRegularEE1_ = iConfig.getParameter<std::vector<double> > ("thrRegularEE1");
39  thrOverEEB1_ = iConfig.getParameter<std::vector<double> > ("thrOverEEB1");
40  thrOverEEE1_ = iConfig.getParameter<std::vector<double> > ("thrOverEEE1");
41  thrOverE2EB1_ = iConfig.getParameter<std::vector<double> > ("thrOverE2EB1");
42  thrOverE2EE1_ = iConfig.getParameter<std::vector<double> > ("thrOverE2EE1");
43  thrRegularEB2_ = iConfig.getParameter<std::vector<double> > ("thrRegularEB2");
44  thrRegularEE2_ = iConfig.getParameter<std::vector<double> > ("thrRegularEE2");
45  thrOverEEB2_ = iConfig.getParameter<std::vector<double> > ("thrOverEEB2");
46  thrOverEEE2_ = iConfig.getParameter<std::vector<double> > ("thrOverEEE2");
47  thrOverE2EB2_ = iConfig.getParameter<std::vector<double> > ("thrOverE2EB2");
48  thrOverE2EE2_ = iConfig.getParameter<std::vector<double> > ("thrOverE2EE2");
49 
50  ncandcut_ = iConfig.getParameter<int> ("ncandcut");
51 
52  doRhoCorrection_ = iConfig.getParameter<bool> ("doRhoCorrection");
53  rhoMax_ = iConfig.getParameter<double> ("rhoMax");
54  rhoScale_ = iConfig.getParameter<double> ("rhoScale");
55  effectiveAreas_ = iConfig.getParameter<std::vector<double> > ("effectiveAreas");
56  absEtaLowEdges_ = iConfig.getParameter<std::vector<double> > ("absEtaLowEdges");
57 
58  l1EGTag_ = iConfig.getParameter< edm::InputTag > ("l1EGCand");
59 
60  candToken_ = consumes<trigger::TriggerFilterObjectWithRefs> (candTag_);
61  varToken_ = consumes<reco::RecoEcalCandidateIsolationMap> (varTag_);
62 
63  if (energyLowEdges_.size() != thrRegularEB1_.size() or energyLowEdges_.size() != thrRegularEE1_.size() or
64  energyLowEdges_.size() != thrRegularEB2_.size() or energyLowEdges_.size() != thrRegularEE2_.size() or
65  energyLowEdges_.size() != thrOverEEB1_.size() or energyLowEdges_.size() != thrOverEEE1_.size() or
66  energyLowEdges_.size() != thrOverEEB2_.size() or energyLowEdges_.size() != thrOverEEE2_.size() or
67  energyLowEdges_.size() != thrOverE2EB1_.size() or energyLowEdges_.size() != thrOverE2EE1_.size() or
68  energyLowEdges_.size() != thrOverE2EB2_.size() or energyLowEdges_.size() != thrOverE2EE2_.size())
69  throw cms::Exception("IncompatibleVects") << "energyLowEdges and threshold vectors should be of the same size. \n";
70 
71  if (energyLowEdges_.at(0) != 0.0)
72  throw cms::Exception("IncompleteCoverage") << "energyLowEdges should start from 0. \n";
73 
74  for (unsigned int aIt = 0; aIt < energyLowEdges_.size() - 1; aIt++) {
75  if ( !(energyLowEdges_.at( aIt ) < energyLowEdges_.at( aIt + 1 )) )
76  throw cms::Exception("ImproperBinning") << "energyLowEdges entries should be in increasing order. \n";
77  }
78 
79  if (doRhoCorrection_) {
80  rhoToken_ = consumes<double> (rhoTag_);
81  if (absEtaLowEdges_.size() != effectiveAreas_.size())
82  throw cms::Exception("IncompatibleVects") << "absEtaLowEdges and effectiveAreas should be of the same size. \n";
83 
84  if (absEtaLowEdges_.at(0) != 0.0)
85  throw cms::Exception("IncompleteCoverage") << "absEtaLowEdges should start from 0. \n";
86 
87  for (unsigned int bIt = 0; bIt < absEtaLowEdges_.size() - 1; bIt++) {
88  if ( !(absEtaLowEdges_.at( bIt ) < absEtaLowEdges_.at( bIt + 1 )) )
89  throw cms::Exception("ImproperBinning") << "absEtaLowEdges entries should be in increasing order. \n";
90  }
91  }
92 }
93 
94 void
98  desc.add<edm::InputTag>("candTag", edm::InputTag("hltEGIsolFilter"));
99  desc.add<edm::InputTag>("varTag", edm::InputTag("hltEGIsol"));
100  desc.add<edm::InputTag>("rhoTag", edm::InputTag("")); // No rho correction by default
101  desc.add<std::vector<double> >("energyLowEdges", {0.0}); // No energy-dependent cuts by default
102  desc.add<bool>("lessThan", true);
103  desc.add<bool>("useEt", true);
104  desc.add<double>("etaBoundaryEB12", 1.0);
105  desc.add<double>("etaBoundaryEE12", 2.0);
106  desc.add<std::vector<double> >("thrRegularEB1", {4.0});
107  desc.add<std::vector<double> >("thrRegularEE1", {6.0});
108  desc.add<std::vector<double> >("thrOverEEB1", {0.0020});
109  desc.add<std::vector<double> >("thrOverEEE1", {0.0020});
110  desc.add<std::vector<double> >("thrOverE2EB1", {0.0});
111  desc.add<std::vector<double> >("thrOverE2EE1", {0.0});
112  desc.add<std::vector<double> >("thrRegularEB2", {6.0});
113  desc.add<std::vector<double> >("thrRegularEE2", {4.0});
114  desc.add<std::vector<double> >("thrOverEEB2", {0.0020});
115  desc.add<std::vector<double> >("thrOverEEE2", {0.0020});
116  desc.add<std::vector<double> >("thrOverE2EB2", {0.0});
117  desc.add<std::vector<double> >("thrOverE2EE2", {0.0});
118  desc.add<int>("ncandcut", 1);
119  desc.add<bool>("doRhoCorrection", false);
120  desc.add<double>("rhoMax", 9.9999999E7);
121  desc.add<double>("rhoScale", 1.0);
122  desc.add<std::vector<double> >("effectiveAreas", {0.0, 0.0});
123  desc.add<std::vector<double> >("absEtaLowEdges", {0.0, 1.479}); // EB, EE
124  desc.add<edm::InputTag>("l1EGCand", edm::InputTag("hltL1IsoRecoEcalCandidate"));
125  descriptions.add("hltEgammaGenericQuadraticEtaFilter", desc);
126 }
127 
129 
130 
131 // ------------ method called to produce the data ------------
132 bool
134 {
135  using namespace trigger;
136  if ( saveTags() ) {
137  filterproduct.addCollectionTag(l1EGTag_);
138  }
139  // Ref to Candidate object to be recorded in filter object
141 
142  // Set output format
143  int trigger_type = trigger::TriggerCluster;
144  if ( saveTags() ) trigger_type = trigger::TriggerPhoton;
145 
147 
148  iEvent.getByToken (candToken_,PrevFilterOutput);
149 
150  std::vector<edm::Ref<reco::RecoEcalCandidateCollection> > recoecalcands;
151  PrevFilterOutput->getObjects(TriggerCluster, recoecalcands);
152  if(recoecalcands.empty()) PrevFilterOutput->getObjects(TriggerPhoton,recoecalcands); //we dont know if its type trigger cluster or trigger photon
153 
154  //get hold of isolated association map
156  iEvent.getByToken (varToken_,depMap);
157 
158  // Get rho if needed
159  edm::Handle<double> rhoHandle;
160  double rho = 0.0;
161  if (doRhoCorrection_) {
162  iEvent.getByToken(rhoToken_, rhoHandle);
163  rho = *(rhoHandle.product());
164  }
165 
166  if (rho > rhoMax_)
167  rho = rhoMax_;
168  rho = rho * rhoScale_;
169 
170  // look at all photons, check cuts and add to filter object
171  int n = 0;
172  for (unsigned int i=0; i<recoecalcands.size(); i++) {
173 
174  ref = recoecalcands[i];
175  reco::RecoEcalCandidateIsolationMap::const_iterator mapi = (*depMap).find( ref );
176 
177  float vali = mapi->val;
178  float EtaSC = ref->eta();
179 
180  // Pick the right EA and do rhoCorr
181  if (doRhoCorrection_) {
182  auto cIt = std::lower_bound( absEtaLowEdges_.begin(), absEtaLowEdges_.end(), std::abs(EtaSC) ) - 1;
183  vali = vali - (rho * effectiveAreas_.at( std::distance( absEtaLowEdges_.begin(), cIt ) ));
184  }
185 
186  float energy = ref->superCluster()->energy();
187  if (useEt_) energy = energy * sin (2*atan(exp(-EtaSC)));
188  if (energy < 0.) energy = 0.; /* first and second order terms assume non-negative energies */
189 
190  double cutRegularEB1_ = 9999., cutRegularEE1_ = 9999.;
191  double cutRegularEB2_ = 9999., cutRegularEE2_ = 9999.;
192  double cutOverEEB1_ = 9999., cutOverEEE1_ = 9999.;
193  double cutOverEEB2_ = 9999., cutOverEEE2_ = 9999.;
194  double cutOverE2EB1_ = 9999., cutOverE2EE1_ = 9999.;
195  double cutOverE2EB2_ = 9999., cutOverE2EE2_ = 9999.;
196 
197  auto dIt = std::lower_bound( energyLowEdges_.begin(), energyLowEdges_.end(), energy ) - 1;
198  unsigned iEn = std::distance( energyLowEdges_.begin(), dIt );
199 
200  cutRegularEB1_ = thrRegularEB1_.at(iEn);
201  cutRegularEB2_ = thrRegularEB2_.at(iEn);
202  cutRegularEE1_ = thrRegularEE1_.at(iEn);
203  cutRegularEE2_ = thrRegularEE2_.at(iEn);
204  cutOverEEB1_ = thrOverEEB1_.at(iEn);
205  cutOverEEB2_ = thrOverEEB2_.at(iEn);
206  cutOverEEE1_ = thrOverEEE1_.at(iEn);
207  cutOverEEE2_ = thrOverEEE2_.at(iEn);
208  cutOverE2EB1_ = thrOverE2EB1_.at(iEn);
209  cutOverE2EB2_ = thrOverE2EB2_.at(iEn);
210  cutOverE2EE1_ = thrOverE2EE1_.at(iEn);
211  cutOverE2EE2_ = thrOverE2EE2_.at(iEn);
212 
213  if ( lessThan_ ) {
214  if (std::abs(EtaSC) < etaBoundaryEB12_) {
215  if ( vali <= cutRegularEB1_ + energy*cutOverEEB1_ + energy*energy*cutOverE2EB1_) {
216  n++;
217  filterproduct.addObject(trigger_type, ref);
218  continue;
219  }
220  } else if (std::abs(EtaSC) < 1.479) {
221  if ( vali <= cutRegularEB2_ + energy*cutOverEEB2_ + energy*energy*cutOverE2EB2_) {
222  n++;
223  filterproduct.addObject(trigger_type, ref);
224  continue;
225  }
226  } else if (std::abs(EtaSC) < etaBoundaryEE12_) {
227  if ( vali <= cutRegularEE1_ + energy*cutOverEEE1_ + energy*energy*cutOverE2EE1_) {
228  n++;
229  filterproduct.addObject(trigger_type, ref);
230  continue;
231  }
232  } else if (vali <= cutRegularEE2_ + energy*cutOverEEE2_ + energy*energy*cutOverE2EE2_) {
233  n++;
234  filterproduct.addObject(trigger_type, ref);
235  continue;
236  }
237  } else {
238  if (std::abs(EtaSC) < etaBoundaryEB12_) {
239  if ( vali >= cutRegularEB1_ + energy*cutOverEEB1_ + energy*energy*cutOverE2EB1_) {
240  n++;
241  filterproduct.addObject(trigger_type, ref);
242  continue;
243  }
244  } else if (std::abs(EtaSC) < 1.479) {
245  if ( vali >= cutRegularEB2_ + energy*cutOverEEB2_ + energy*energy*cutOverE2EB2_) {
246  n++;
247  filterproduct.addObject(trigger_type, ref);
248  continue;
249  }
250  } else if (std::abs(EtaSC) < etaBoundaryEE12_) {
251  if ( vali >= cutRegularEE1_ + energy*cutOverEEE1_ + energy*energy*cutOverE2EE1_) {
252  n++;
253  filterproduct.addObject(trigger_type, ref);
254  continue;
255  }
256  } else if (vali >= cutRegularEE2_ + energy*cutOverEEE2_ + energy*energy*cutOverE2EE2_) {
257  n++;
258  filterproduct.addObject(trigger_type, ref);
259  continue;
260  }
261  }
262  }
263 
264  // filter decision
265  bool accept(n>=ncandcut_);
266 
267  return accept;
268 }
269 
270 
271 // declare this class as a framework plugin
T getParameter(std::string const &) const
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
edm::EDGetTokenT< reco::RecoEcalCandidateIsolationMap > varToken_
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:30
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
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
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
Definition: HLTFilter.cc:29
T const * product() const
Definition: Handle.h:74
edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > candToken_
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
bool saveTags() const
Definition: HLTFilter.h:45
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)