CMS 3D CMS Logo

HLTGenericFilter.cc
Go to the documentation of this file.
1 
8 #include "HLTGenericFilter.h"
9 
11 
16 
20 
22 
23 //
24 // constructors and destructor
25 //
26 template<typename T1>
28  candTag_ = iConfig.template getParameter< edm::InputTag > ("candTag");
29  varTag_ = iConfig.template getParameter< edm::InputTag > ("varTag");
30  l1EGTag_ = iConfig.template getParameter< edm::InputTag > ("l1EGCand");
31  rhoTag_ = iConfig.template getParameter< edm::InputTag > ("rhoTag");
32 
33  energyLowEdges_ = iConfig.template getParameter<std::vector<double> > ("energyLowEdges");
34  lessThan_ = iConfig.template getParameter<bool> ("lessThan");
35  useEt_ = iConfig.template getParameter<bool> ("useEt");
36  thrRegularEB_ = iConfig.template getParameter<std::vector<double> > ("thrRegularEB");
37  thrRegularEE_ = iConfig.template getParameter<std::vector<double> > ("thrRegularEE");
38  thrOverEEB_ = iConfig.template getParameter<std::vector<double> > ("thrOverEEB");
39  thrOverEEE_ = iConfig.template getParameter<std::vector<double> > ("thrOverEEE");
40  thrOverE2EB_ = iConfig.template getParameter<std::vector<double> > ("thrOverE2EB");
41  thrOverE2EE_ = iConfig.template getParameter<std::vector<double> > ("thrOverE2EE");
42  ncandcut_ = iConfig.template getParameter<int> ("ncandcut");
43 
44  doRhoCorrection_ = iConfig.template getParameter<bool> ("doRhoCorrection");
45  rhoMax_ = iConfig.template getParameter<double> ("rhoMax");
46  rhoScale_ = iConfig.template getParameter<double> ("rhoScale");
47  effectiveAreas_ = iConfig.template getParameter<std::vector<double> > ("effectiveAreas");
48  absEtaLowEdges_ = iConfig.template getParameter<std::vector<double> > ("absEtaLowEdges");
49 
50  candToken_ = consumes<trigger::TriggerFilterObjectWithRefs> (candTag_);
51  varToken_ = consumes<T1IsolationMap> (varTag_);
52 
53  if (energyLowEdges_.size() != thrRegularEB_.size() or energyLowEdges_.size() != thrRegularEE_.size() or
54  energyLowEdges_.size() != thrOverEEB_.size() or energyLowEdges_.size() != thrOverEEE_.size() or
55  energyLowEdges_.size() != thrOverE2EB_.size() or energyLowEdges_.size() != thrOverE2EE_.size())
56  throw cms::Exception("IncompatibleVects") << "energyLowEdges and threshold vectors should be of the same size. \n";
57 
58  if (energyLowEdges_.at(0) != 0.0)
59  throw cms::Exception("IncompleteCoverage") << "energyLowEdges should start from 0. \n";
60 
61  for (unsigned int aIt = 0; aIt < energyLowEdges_.size() - 1; aIt++) {
62  if ( !(energyLowEdges_.at( aIt ) < energyLowEdges_.at( aIt + 1 )) )
63  throw cms::Exception("ImproperBinning") << "energyLowEdges entries should be in increasing order. \n";
64  }
65 
66  if (doRhoCorrection_) {
67  rhoToken_ = consumes<double> (rhoTag_);
68  if (absEtaLowEdges_.size() != effectiveAreas_.size())
69  throw cms::Exception("IncompatibleVects") << "absEtaLowEdges and effectiveAreas should be of the same size. \n";
70 
71  if (absEtaLowEdges_.at(0) != 0.0)
72  throw cms::Exception("IncompleteCoverage") << "absEtaLowEdges should start from 0. \n";
73 
74  for (unsigned int bIt = 0; bIt < absEtaLowEdges_.size() - 1; bIt++) {
75  if ( !(absEtaLowEdges_.at( bIt ) < absEtaLowEdges_.at( bIt + 1 )) )
76  throw cms::Exception("ImproperBinning") << "absEtaLowEdges entries should be in increasing order. \n";
77  }
78  }
79 }
80 
81 template<typename T1>
82 void
86  desc.add<edm::InputTag>("candTag", edm::InputTag("hltSingleEgammaEtFilter"));
87  desc.add<edm::InputTag>("varTag", edm::InputTag("hltSingleEgammaHcalIsol"));
88  desc.add<edm::InputTag>("rhoTag", edm::InputTag("")); // No rho correction by default
89  desc.add<std::vector<double> >("energyLowEdges", {0.0}); // No energy-dependent cuts by default
90  desc.add<bool>("lessThan", true);
91  desc.add<bool>("useEt", false);
92  desc.add<std::vector<double> >("thrRegularEB", {0.0});
93  desc.add<std::vector<double> >("thrRegularEE", {0.0});
94  desc.add<std::vector<double> >("thrOverEEB", {-1.0});
95  desc.add<std::vector<double> >("thrOverEEE", {-1.0});
96  desc.add<std::vector<double> >("thrOverE2EB", {-1.0});
97  desc.add<std::vector<double> >("thrOverE2EE", {-1.0});
98  desc.add<int>("ncandcut", 1);
99  desc.add<bool>("doRhoCorrection", false);
100  desc.add<double>("rhoMax", 9.9999999E7);
101  desc.add<double>("rhoScale", 1.0);
102  desc.add<std::vector<double> >("effectiveAreas", {0.0, 0.0});
103  desc.add<std::vector<double> >("absEtaLowEdges", {0.0, 1.479}); // EB, EE
104  desc.add<edm::InputTag>("l1EGCand", edm::InputTag("hltL1IsoRecoEcalCandidate"));
105  descriptions.add(defaultModuleLabel<HLTGenericFilter<T1>>(), desc);
106 }
107 
108 template<typename T1>
110 
111 template<typename T1>
113  return candRef->p();
114 }
115 
116 template<>
118  return candRef->superCluster()->energy();
119 }
120 
121 template<typename T1>
122 float HLTGenericFilter<T1>::getEt(T1Ref candRef) const{
123  return candRef->pt();
124 }
125 
126 template<>
128  return candRef->superCluster()->energy() * sin (2*atan(exp(-candRef->eta())));
129 }
130 
131 
132 // ------------ method called to produce the data ------------
133 template<typename T1>
134 bool
136 {
137  using namespace trigger;
138  if (saveTags()) {
139  filterproduct.addCollectionTag(l1EGTag_);
140  }
141 
142  // Set output format
143  int trigger_type = trigger::TriggerCluster;
144  if (saveTags()) trigger_type = trigger::TriggerPhoton;
145 
147  iEvent.getByToken (candToken_, PrevFilterOutput);
148 
149  std::vector<T1Ref> recoCands;
150  PrevFilterOutput->getObjects(TriggerCluster, recoCands);
151  if(recoCands.empty()) PrevFilterOutput->getObjects(TriggerPhoton,recoCands); //we dont know if its type trigger cluster or trigger photon
152  if(recoCands.empty()) {
153  PrevFilterOutput->getObjects(TriggerMuon,recoCands); //if not a cluster and not a photon then assum it is a muon
154  trigger_type = trigger::TriggerMuon;
155  }
156  //get hold of isolated association map
158  iEvent.getByToken (varToken_,depMap);
159 
160  // Get rho if needed
161  edm::Handle<double> rhoHandle;
162  double rho = 0.0;
163  if (doRhoCorrection_) {
164  iEvent.getByToken(rhoToken_, rhoHandle);
165  rho = *(rhoHandle.product());
166  }
167 
168  if (rho > rhoMax_)
169  rho = rhoMax_;
170  rho = rho * rhoScale_;
171 
172  // look at all photons, check cuts and add to filter object
173  int n = 0;
174  for (unsigned int i=0; i<recoCands.size(); i++) {
175 
176  // Ref to Candidate object to be recorded in filter object
177  T1Ref ref = recoCands[i];
178  typename T1IsolationMap::const_iterator mapi = (*depMap).find( ref );
179 
180  float vali = mapi->val;
181  float EtaSC = ref->eta();
182 
183  // Pick the right EA and do rhoCorr
184  if (doRhoCorrection_) {
185  auto cIt = std::lower_bound( absEtaLowEdges_.begin(), absEtaLowEdges_.end(), std::abs(EtaSC) ) - 1;
186  vali = vali - (rho * effectiveAreas_.at( std::distance( absEtaLowEdges_.begin(), cIt ) ));
187  }
188 
189  float energy;
190  if (useEt_) energy = getEt (ref);
191  else energy = getEnergy( ref );
192  //if (energy < 0.) energy = 0.; // require energy to be positive (needed?)
193 
194  // Pick the right cut threshold
195  double cutRegularEB_ = 9999., cutRegularEE_ = 9999.;
196  double cutOverEEB_ = 9999., cutOverEEE_ = 9999.;
197  double cutOverE2EB_ = 9999., cutOverE2EE_ = 9999.;
198 
199  auto dIt = std::lower_bound( energyLowEdges_.begin(), energyLowEdges_.end(), energy ) - 1;
200  unsigned iEn = std::distance( energyLowEdges_.begin(), dIt );
201 
202  cutRegularEB_ = thrRegularEB_.at(iEn);
203  cutRegularEE_ = thrRegularEE_.at(iEn);
204  cutOverEEB_ = thrOverEEB_.at(iEn);
205  cutOverEEE_ = thrOverEEE_.at(iEn);
206  cutOverE2EB_ = thrOverE2EB_.at(iEn);
207  cutOverE2EE_ = thrOverE2EE_.at(iEn);
208 
209  if ( lessThan_ ) {
210  if ( (std::abs(EtaSC) < 1.479 && vali <= cutRegularEB_) || (std::abs(EtaSC) >= 1.479 && vali <= cutRegularEE_) ) {
211  n++;
212  filterproduct.addObject(trigger_type, ref);
213  continue;
214  }
215  if (energy > 0. && (cutOverEEB_ > 0. || cutOverEEE_ > 0. || cutOverE2EB_ > 0. || cutOverE2EE_ > 0.) ) {
216  if ((std::abs(EtaSC) < 1.479 && vali/energy <= cutOverEEB_) || (std::abs(EtaSC) >= 1.479 && vali/energy <= cutOverEEE_) ) {
217  n++;
218  filterproduct.addObject(trigger_type, ref);
219  continue;
220  }
221  if ((std::abs(EtaSC) < 1.479 && vali/(energy*energy) <= cutOverE2EB_) || (std::abs(EtaSC) >= 1.479 && vali/(energy*energy) <= cutOverE2EE_) ) {
222  n++;
223  filterproduct.addObject(trigger_type, ref);
224  }
225  }
226  } else {
227  if ( (std::abs(EtaSC) < 1.479 && vali >= cutRegularEB_) || (std::abs(EtaSC) >= 1.479 && vali >= cutRegularEE_) ) {
228  n++;
229  filterproduct.addObject(trigger_type, ref);
230  continue;
231  }
232  if (energy > 0. && (cutOverEEB_ > 0. || cutOverEEE_ > 0. || cutOverE2EB_ > 0. || cutOverE2EE_ > 0.) ) {
233  if ((std::abs(EtaSC) < 1.479 && vali/energy >= cutOverEEB_) || (std::abs(EtaSC) >= 1.479 && vali/energy >= cutOverEEE_) ) {
234  n++;
235  filterproduct.addObject(trigger_type, ref);
236  continue;
237  }
238  if ((std::abs(EtaSC) < 1.479 && vali/(energy*energy) >= cutOverE2EB_) || (std::abs(EtaSC) >= 1.479 && vali/(energy*energy) >= cutOverE2EE_) ) {
239  n++;
240  filterproduct.addObject(trigger_type, ref);
241  }
242  }
243  }
244  }
245 
246  // filter decision
247  bool accept(n>=ncandcut_);
248 
249  return accept;
250 }
251 
256 
edm::EDGetTokenT< double > rhoToken_
edm::InputTag rhoTag_
HLTGenericFilter< reco::RecoChargedCandidate > HLTMuonGenericFilter
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
std::vector< double > energyLowEdges_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
std::vector< double > thrOverE2EE_
std::string defaultModuleLabel()
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:30
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > candToken_
float getEnergy(T1Ref) const
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
std::vector< double > thrRegularEB_
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
HLTGenericFilter(const edm::ParameterSet &)
edm::EDGetTokenT< T1IsolationMap > varToken_
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
ParameterDescriptionBase * add(U const &iLabel, T const &value)
edm::InputTag l1EGTag_
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
Definition: HLTFilter.cc:29
std::vector< double > thrRegularEE_
T const * product() const
Definition: Handle.h:74
edm::InputTag candTag_
std::vector< double > thrOverEEB_
float getEt(T1Ref) const
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
std::vector< double > thrOverE2EB_
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
~HLTGenericFilter() override
edm::InputTag varTag_
bool saveTags() const
Definition: HLTFilter.h:45
std::vector< double > thrOverEEE_
std::vector< double > absEtaLowEdges_
std::vector< double > effectiveAreas_
HLTGenericFilter< reco::RecoEcalCandidate > HLTEgammaGenericFilter