CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TopElectronHLTOfflineSource.cc
Go to the documentation of this file.
2 
4 
6 
7 #include <boost/algorithm/string.hpp>
8 
20 
22 
23 //using namespace egHLT;
24 
26 
28 
29  if (!dbe_)
30  {
31  edm::LogInfo("TopElectronHLTOfflineSource") << "unable to get DQMStore service?";
32  }
33 
34  if(conf.getUntrackedParameter<bool>("DQMStore", false))
35  {
36  if(!dbe_) dbe_->setVerbose(0);
37  }
38 
39  dirName_ = conf.getParameter<std::string>("DQMDirName");
40 
41  electronIdNames_ = conf.getParameter<std::vector<std::string> >("electronIdNames");
42  hltTag_ = conf.getParameter<std::string>("hltTag");
43  superTriggerNames_ = conf.getParameter<std::vector<std::string> >("superTriggerNames");
44  electronTriggerNames_ = conf.getParameter<std::vector<std::string> >("electronTriggerNames");
45 
46  triggerResultsLabel_ = conf.getParameter<edm::InputTag>("triggerResultsLabel");
47  triggerSummaryLabel_ = conf.getParameter<edm::InputTag>("triggerSummaryLabel");
48  electronLabel_ = conf.getParameter<edm::InputTag>("electronCollection");
49  primaryVertexLabel_ = conf.getParameter<edm::InputTag>("primaryVertexCollection");
50  triggerJetFilterLabel_ = conf.getParameter<edm::InputTag>("triggerJetFilterLabel");
51  triggerElectronFilterLabel_ = conf.getParameter<edm::InputTag>("triggerElectronFilterLabel");
52 
53  excludeCloseJets_ = conf.getParameter<bool>("excludeCloseJets");
54  requireTriggerMatch_ = conf.getParameter<bool>("requireTriggerMatch");
55  electronMinEt_ = conf.getParameter<double>("electronMinEt");
56  electronMaxEta_ = conf.getParameter<double>("electronMaxEta");
57 
58  addExtraId_ = conf.getParameter<bool>("addExtraId");
59  extraIdCutsSigmaEta_ = conf.getParameter<double>("extraIdCutsSigmaEta");
60  extraIdCutsSigmaPhi_ = conf.getParameter<double>("extraIdCutsSigmaPhi");
61  extraIdCutsDzPV_ = conf.getParameter<double>("extraIdCutsDzPV");
62 
63 }
65 {
66 }
67 
69 {
70  if(!dbe_) return;
72  for (size_t i = 0; i < superTriggerNames_.size(); ++i)
73  {
75  for (size_t j = 0; j < electronTriggerNames_.size(); ++j)
76  {
78  //std::cout <<superTriggerNames_[i]+"_"+electronTriggerNames_[j]<<std::endl;
79 
80  }
81  }
82  //std::cout <<"done"<<std::endl;
83 }
84 void TopElectronHLTOfflineSource::setupHistos(std::vector<EleMEs> topEleHists)
85 {
86  for (size_t i = 0; i < eleMEs_.size(); ++i)
87  {
88  topEleHists.push_back(eleMEs_[i]);
89  }
90 }
92 {
93 }
95 {
97 }
99 {
100 }
101 
103 {
104  if(!dbe_) return;
105  // ---- Get Trigger Decisions for all triggers under investigation ----
107  if(!iEvent.getByLabel(triggerResultsLabel_, hltResults) || !hltResults.product()) return; //bail if we didnt get trigger results
108 
109 
110 
111  if (!hltConfigValid_) return;
112 
113  std::vector<bool> superTriggerAccepts;
114  std::vector<bool> electronTriggerAccepts;
115 
116  for (size_t i = 0; i < superTriggerNames_.size(); ++i)
117  {
118  unsigned int triggerIndex( hltConfig_.triggerIndex(superTriggerNames_[i]) );
119  bool accept = false;
120 
121  if (triggerIndex < hltResults->size())
122  {
123  accept = hltResults->accept(triggerIndex);
124  }
125 
126  superTriggerAccepts.push_back(accept);
127  }
128 
129  for (size_t i = 0; i < electronTriggerNames_.size(); ++i)
130  {
131  unsigned int triggerIndex( hltConfig_.triggerIndex(electronTriggerNames_[i]) );
132  bool accept = false;
133 
134  if (triggerIndex < hltResults->size())
135  {
136  accept = hltResults->accept(triggerIndex);
137  }
138 
139  electronTriggerAccepts.push_back(accept);
140  }
141 
142  // get reconstructed electron collection
143  if(!iEvent.getByLabel(electronLabel_, eleHandle_) || !eleHandle_.product()) return;
144 
145  // Get Trigger Event, providing the information about trigger objects
147 
149  if(!iEvent.getByLabel(primaryVertexLabel_, vertexHandle) || !vertexHandle.product()) return;
150 
151  reco::Vertex::Point vertexPoint(0., 0., 0.);
152  if (vertexHandle.product()->size() != 0)
153  {
154  const reco::Vertex& theVertex = vertexHandle.product()->front();
155  vertexPoint = theVertex.position();
156  }
157  else
158  {
159  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
160  if(!iEvent.getByType(recoBeamSpotHandle) || !recoBeamSpotHandle.product()) return;
161 
162  vertexPoint = recoBeamSpotHandle->position();
163  }
164 
165  trigger::size_type jetFilterPos = triggerEvent_->filterIndex(triggerJetFilterLabel_);
166  std::vector<const trigger::TriggerObject*> triggerJets;
167 
168  if (jetFilterPos != triggerEvent_->sizeFilters())
169  {
170  for (size_t i = 0; i < triggerEvent_->filterKeys(jetFilterPos).size(); ++i)
171  {
172  size_t objNr = triggerEvent_->filterKeys(jetFilterPos)[i];
173  if(objNr<triggerEvent_->sizeObjects()){
174  triggerJets.push_back(& triggerEvent_->getObjects()[objNr]);
175  }
176  }
177  }
178 
179  trigger::size_type eleFilterPos = triggerEvent_->filterIndex(triggerElectronFilterLabel_);
180  std::vector<const trigger::TriggerObject*> triggerElectrons;
181 
182  if (eleFilterPos != triggerEvent_->sizeFilters())
183  {
184  for (size_t i = 0; i < triggerEvent_->filterKeys(eleFilterPos).size(); ++i)
185  {
186  size_t objNr = triggerEvent_->filterKeys(eleFilterPos)[i];
187  if(objNr<triggerEvent_->sizeObjects()){
188  triggerElectrons.push_back(& triggerEvent_->getObjects()[objNr]);
189  }
190  }
191  }
192 
194 
195  for(size_t eleNr=0; eleNr < eles.size(); ++eleNr)
196  {
197 
198  const reco::GsfElectron& ele = eles[eleNr];
199 
200  // electron selection
201 
202  if(ele.et() > electronMinEt_ && std::abs(ele.eta()) < electronMaxEta_)
203  {
204  size_t index = 0;
205  for (size_t i = 0; i < superTriggerNames_.size(); ++i)
206  {
207  if (superTriggerAccepts[i])
208  fill(eleMEs_[index], iEvent, eleNr, triggerJets, triggerElectrons, vertexPoint);
209  index++;
210 
211  for (size_t j = 0; j < electronTriggerNames_.size(); ++j)
212  {
213  if (superTriggerAccepts[i] && electronTriggerAccepts[j])
214  fill(eleMEs_[index], iEvent, eleNr, triggerJets, triggerElectrons, vertexPoint);
215  index++;
216  }
217  }
218  }
219  }
220 }
221 
222 void TopElectronHLTOfflineSource::EleMEs::setup(DQMStore* dbe, const std::vector<std::string>& eleIdNames, bool addExtraId, const std::string& name)
223 {
224  for (size_t i = 0; i < eleIdNames.size(); ++i)
225  {
226  eleIdNames_.push_back(eleIdNames[i]);
227  if (addExtraId)
228  eleIdNames_.push_back(eleIdNames[i]+"extraId");
229  }
230 
231  addMESets(name);
232 
233  for (size_t i = 0; i < eleMESets_.size(); ++i)
234  {
235  setupMESet(eleMESets_[i], dbe, name+"_"+fullName(i));
236  LogDebug("TopElectronHLTOfflineSource") << "Booked MonitorElement with name " << name;
237  }
238 }
240 {
241  eleSet.ele_et = dbe->book1D("ele_"+name+"_et", "ele_"+name+"_et", 50, 0., 500.);
242  eleSet.ele_eta = dbe->book1D("ele_"+name+"_eta", "ele_"+name+"_eta", 50, -2.5, 2.5);
243  eleSet.ele_phi = dbe->book1D("ele_"+name+"_phi","ele_"+name+"_phi", 50, -3.1416, 3.1416);
244  eleSet.ele_isolEm = dbe->book1D("ele_"+name+"_isolEm", "ele_"+name+"_isolEm", 50, -0.05, 3.);
245  eleSet.ele_isolHad = dbe->book1D("ele_"+name+"_isolHad", "ele_"+name+"_isolHad", 50, -0.05, 5.);
246  eleSet.ele_minDeltaR = dbe->book1D("ele_"+name+"_minDeltaR", "ele_"+name+"_minDeltaR", 50, 0., 1.);
247  eleSet.global_n30jets = dbe->book1D("ele_"+name+"_global_n30jets", "ele_"+name+"_global_n30jets", 10, -0.5, 9.5);
248  eleSet.global_sumEt = dbe->book1D("ele_"+name+"_global_sumEt", "ele_"+name+"_global_sumEt", 50, 0., 1000.);
249  eleSet.ele_gsftrack_etaError = dbe->book1D("ele_"+name+"_gsftrack_etaError", "ele_"+name+"_gsftrack_etaError", 50, 0., 0.005);
250  eleSet.ele_gsftrack_phiError = dbe->book1D("ele_"+name+"_gsftrack_phiError", "ele_"+name+"_gsftrack_phiError", 50, 0., 0.005);
251  eleSet.ele_gsftrack_numberOfValidHits = dbe->book1D("ele_"+name+"_gsftrack_numberOfValidHits", "ele_"+name+"_gsftrack_numberOfValidHits", 25, -0.5, 24.5);
252  eleSet.ele_gsftrack_dzPV = dbe->book1D("ele_"+name+"_gsftrack_dzPV", "ele_"+name+"_gsftrack_dzPV", 50, 0., 0.2);
253 }
254 
256 {
257  eleMENames_.push_back("EB");
258  eleMENames_.push_back("EE");
259  name_ = name;
260  for (size_t i=0; i < eleIdNames_.size() * eleMENames_.size(); ++i)
261  {
262  eleMESets_.push_back(EleMESet());
263  }
264 }
265 
266 void TopElectronHLTOfflineSource::fill(EleMEs& eleMEs, const edm::Event& iEvent, size_t eleIndex, const std::vector<const trigger::TriggerObject*>& triggerJets, const std::vector<const trigger::TriggerObject*>& triggerElectrons, const reco::Vertex::Point& vertexPoint)
267 {
268  const reco::GsfElectron& ele = (*eleHandle_)[eleIndex];
269 
270  float dzPV = std::abs(ele.gsfTrack()->dz(vertexPoint));
271 
272  bool isTriggerMatched = false;
273  for (size_t i = 0; i < triggerElectrons.size(); ++i)
274  {
275  if (deltaR(*(triggerElectrons[i]), ele.p4()) < 0.3)
276  isTriggerMatched = true;
277  }
278 
279  if (requireTriggerMatch_ && !isTriggerMatched)
280  return;
281 
282  // Calculate minimum deltaR to closest jet and sumEt (all jets)
283  float minDeltaR = 999.;
284  float sumEt = 0.;
285 
286  for (size_t jetNr = 0; jetNr < triggerJets.size(); ++jetNr)
287  {
288  const trigger::TriggerObject& jet = *triggerJets[jetNr];
289 
290  sumEt += jet.et();
291 
292  float dr = deltaR(jet, ele.p4());
293 
294  if (!excludeCloseJets_ && dr < minDeltaR)
295  minDeltaR = dr;
296  if (excludeCloseJets_ && dr > 0.1 && dr < minDeltaR)
297  minDeltaR = dr;
298  }
299 
300  for (size_t j = 0; j < eleMEs.eleIdNames().size(); ++j)
301  {
302  bool eId = true;
303 
304  edm::Handle<edm::ValueMap<float> > eIdMapHandle;
305  iEvent.getByLabel(eleMEs.eleIdNames()[j], eIdMapHandle);
306  const edm::ValueMap<float>& eIdMap = *eIdMapHandle;
307  eId = eIdMap[edm::Ref<reco::GsfElectronCollection>(eleHandle_, eleIndex)];
308 
309  bool extraId = true;
310  if (addExtraId_)
311  {
312  if (ele.gsfTrack()->etaError() > extraIdCutsSigmaEta_)
313  extraId = false;
314  if (ele.gsfTrack()->phiError() > extraIdCutsSigmaPhi_)
315  extraId = false;
316  if (dzPV > extraIdCutsDzPV_)
317  extraId = false;
318  }
319 
320  for (size_t i = 0; i < eleMEs.eleMENames().size(); ++i)
321  {
322  if (eId && eleMEs.eleMENames()[i] == "EB" && ele.isEB()&& !ele.isGap())
323  eleMEs.fill(eleMEs.getMESet(i, j), ele, minDeltaR, sumEt, triggerJets.size(), dzPV);
324  if (eId && eleMEs.eleMENames()[i] == "EE" && ele.isEE()&& !ele.isGap())
325  eleMEs.fill(eleMEs.getMESet(i, j), ele, minDeltaR, sumEt, triggerJets.size(), dzPV);
326  if (addExtraId_)
327  {
328  if (eId && extraId && eleMEs.eleMENames()[i] == "EB" && ele.isEB()&& !ele.isGap())
329  eleMEs.fill(eleMEs.getMESet(i, j+1), ele, minDeltaR, sumEt, triggerJets.size(), dzPV);
330  if (eId && extraId && eleMEs.eleMENames()[i] == "EE" && ele.isEE()&& !ele.isGap())
331  eleMEs.fill(eleMEs.getMESet(i, j+1), ele, minDeltaR, sumEt, triggerJets.size(), dzPV);
332  }
333  }
334  if (addExtraId_)
335  ++j;
336 
337  }
338 }
339 void TopElectronHLTOfflineSource::EleMEs::fill(EleMESet& eleMESet, const reco::GsfElectron& ele, float minDeltaR, float sumEt, int n30jets, float dzPV)
340 {
341  LogDebug("TopElectronHLTOfflineSource") << "filling the histos with " << ele.et();
342 
343  eleMESet.ele_et->Fill(ele.et());
344  eleMESet.ele_eta->Fill(ele.eta());
345  eleMESet.ele_phi->Fill(ele.phi());
346  eleMESet.ele_isolEm->Fill(ele.dr03EcalRecHitSumEt());
347  eleMESet.ele_isolHad->Fill(ele.dr03HcalTowerSumEt());
348  eleMESet.ele_minDeltaR->Fill(minDeltaR);
349  eleMESet.global_n30jets->Fill(n30jets);
350  eleMESet.global_sumEt->Fill(sumEt);
351  eleMESet.ele_gsftrack_etaError->Fill(ele.gsfTrack()->etaError());
352  eleMESet.ele_gsftrack_phiError->Fill(ele.gsfTrack()->phiError());
353  eleMESet.ele_gsftrack_numberOfValidHits->Fill(ele.gsfTrack()->numberOfValidHits());
354  eleMESet.ele_gsftrack_dzPV->Fill(dzPV);
355 }
#define LogDebug(id)
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
virtual void analyze(const edm::Event &, const edm::EventSetup &)
const LorentzVector & p4(P4Kind kind) const
Definition: GsfElectron.cc:196
MonitorElement * book1D(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1D histogram.
Definition: DQMStore.cc:514
virtual double et() const
transverse energy
virtual void beginRun(const edm::Run &run, const edm::EventSetup &c)
#define abs(x)
Definition: mlp_lapack.h:159
std::vector< std::string > electronIdNames_
bool getByType(Handle< PROD > &result) const
Definition: Event.h:397
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:21
uint16_t size_type
const Point & position() const
position
Definition: Vertex.h:93
std::vector< GsfElectron > GsfElectronCollection
collection of GsfElectron objects
virtual double eta() const
momentum pseudorapidity
bool isEE() const
Definition: GsfElectron.h:341
bool isEB() const
Definition: GsfElectron.h:340
const std::vector< std::string > & eleIdNames()
void Fill(long long x)
unsigned int triggerIndex(const std::string &triggerName) const
slot position of trigger path in trigger table (0 to size-1)
Single trigger physics object (e.g., an isolated muon)
Definition: TriggerObject.h:24
bool isGap() const
Definition: GsfElectron.h:342
int iEvent
Definition: GenABIO.cc:243
edm::Handle< reco::GsfElectronCollection > eleHandle_
std::vector< std::string > electronTriggerNames_
int j
Definition: DBlmapReader.cc:9
math::XYZPoint Point
point in the space
Definition: Vertex.h:40
void setVerbose(unsigned level)
Definition: DQMStore.cc:196
virtual void setupHistos(const std::vector< EleMEs >)
void fill(EleMESet &eleMESet, const reco::GsfElectron &ele, float minDeltaR, float sumEt, int n30jets, float dzPV)
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:355
tuple conf
Definition: dbtoconf.py:185
double deltaR(double eta1, double eta2, double phi1, double phi2)
Definition: TreeUtility.cc:17
std::vector< std::string > superTriggerNames_
GsfTrackRef gsfTrack() const
reference to a GsfTrack
Definition: GsfElectron.h:169
EleMESet & getMESet(size_t namePos, size_t idPos)
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
void setup(DQMStore *dbe, const std::vector< std::string > &, bool addExtraId, const std::string &name)
T const * product() const
Definition: Handle.h:74
float dr03EcalRecHitSumEt() const
Definition: GsfElectron.h:429
void fill(EleMEs &eleMEs, const edm::Event &iEvent, size_t eleIndex, const std::vector< const trigger::TriggerObject * > &triggerJets, const std::vector< const trigger::TriggerObject * > &triggerElectrons, const reco::Vertex::Point &vertexPoint)
float dr03HcalTowerSumEt() const
Definition: GsfElectron.h:432
virtual void endRun(const edm::Run &run, const edm::EventSetup &c)
const std::vector< std::string > & eleMENames()
void setupMESet(EleMESet &eleSet, DQMStore *dbe, const std::string &name)
virtual double phi() const
momentum azimuthal angle
edm::Handle< trigger::TriggerEvent > triggerEvent_
tuple size
Write out results.
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:232
TopElectronHLTOfflineSource(const edm::ParameterSet &conf)
Definition: Run.h:32