CMS 3D CMS Logo

DQMExample_Step1.cc
Go to the documentation of this file.
3 
4 // Geometry
8 #include "TLorentzVector.h"
9 
10 #include <cmath>
11 #include <cstdio>
12 #include <iomanip>
13 #include <iostream>
14 #include <sstream>
15 #include <string>
16 
17 //
18 // -------------------------------------- Constructor
19 // --------------------------------------------
20 //
22  edm::LogInfo("DQMExample_Step1") << "Constructor DQMExample_Step1::DQMExample_Step1 " << std::endl;
23 
24  // Get parameters from configuration file
25  theElectronCollection_ = consumes<reco::GsfElectronCollection>(ps.getParameter<edm::InputTag>("electronCollection"));
26  theCaloJetCollection_ = consumes<reco::CaloJetCollection>(ps.getParameter<edm::InputTag>("caloJetCollection"));
27  thePfMETCollection_ = consumes<reco::PFMETCollection>(ps.getParameter<edm::InputTag>("pfMETCollection"));
29  consumes<reco::ConversionCollection>(ps.getParameter<edm::InputTag>("conversionsCollection"));
30  thePVCollection_ = consumes<reco::VertexCollection>(ps.getParameter<edm::InputTag>("PVCollection"));
31  theBSCollection_ = consumes<reco::BeamSpot>(ps.getParameter<edm::InputTag>("beamSpotCollection"));
32  triggerEvent_ = consumes<trigger::TriggerEvent>(ps.getParameter<edm::InputTag>("TriggerEvent"));
33  triggerResults_ = consumes<edm::TriggerResults>(ps.getParameter<edm::InputTag>("TriggerResults"));
34  triggerFilter_ = ps.getParameter<edm::InputTag>("TriggerFilter");
35  triggerPath_ = ps.getParameter<std::string>("TriggerPath");
36 
37  // cuts:
38  ptThrL1_ = ps.getUntrackedParameter<double>("PtThrL1");
39  ptThrL2_ = ps.getUntrackedParameter<double>("PtThrL2");
40  ptThrJet_ = ps.getUntrackedParameter<double>("PtThrJet");
41  ptThrMet_ = ps.getUntrackedParameter<double>("PtThrMet");
42 }
43 
44 //
45 // -- Destructor
46 //
48  edm::LogInfo("DQMExample_Step1") << "Destructor DQMExample_Step1::~DQMExample_Step1 " << std::endl;
49 }
50 
51 //
52 // -------------------------------------- beginRun
53 // --------------------------------------------
54 //
56  edm::LogInfo("DQMExample_Step1") << "DQMExample_Step1::beginRun" << std::endl;
57 }
58 //
59 // -------------------------------------- bookHistos
60 // --------------------------------------------
61 //
63  edm::LogInfo("DQMExample_Step1") << "DQMExample_Step1::bookHistograms" << std::endl;
64 
65  // book at beginRun
66  bookHistos(ibooker_);
67 }
68 //
69 // -------------------------------------- Analyze
70 // --------------------------------------------
71 //
73  edm::LogInfo("DQMExample_Step1") << "DQMExample_Step1::analyze" << std::endl;
74 
75  //-------------------------------
76  //--- Vertex Info
77  //-------------------------------
79  e.getByToken(thePVCollection_, vertexHandle);
80  if (!vertexHandle.isValid()) {
81  edm::LogError("DQMClientExample") << "invalid collection: vertex"
82  << "\n";
83  return;
84  }
85 
86  int vertex_number = vertexHandle->size();
87  reco::VertexCollection::const_iterator v = vertexHandle->begin();
88 
89  math::XYZPoint PVPoint(-999, -999, -999);
90  if (vertex_number != 0)
91  PVPoint = math::XYZPoint(v->position().x(), v->position().y(), v->position().z());
92 
93  PVPoint_ = PVPoint;
94 
95  //-------------------------------
96  //--- MET
97  //-------------------------------
98  edm::Handle<reco::PFMETCollection> pfMETCollection;
99  e.getByToken(thePfMETCollection_, pfMETCollection);
100  if (!pfMETCollection.isValid()) {
101  edm::LogError("DQMClientExample") << "invalid collection: MET"
102  << "\n";
103  return;
104  }
105  //-------------------------------
106  //--- Electrons
107  //-------------------------------
109  e.getByToken(theElectronCollection_, electronCollection);
110  if (!electronCollection.isValid()) {
111  edm::LogError("DQMClientExample") << "invalid collection: electrons"
112  << "\n";
113  return;
114  }
115 
116  float nEle = 0;
117  int posEle = 0, negEle = 0;
118  const reco::GsfElectron *ele1 = nullptr;
119  const reco::GsfElectron *ele2 = nullptr;
120  for (reco::GsfElectronCollection::const_iterator recoElectron = electronCollection->begin();
121  recoElectron != electronCollection->end();
122  ++recoElectron) {
123  // decreasing pT
124  if (MediumEle(e, eSetup, *recoElectron)) {
125  if (!ele1 && recoElectron->pt() > ptThrL1_)
126  ele1 = &(*recoElectron);
127 
128  else if (!ele2 && recoElectron->pt() > ptThrL2_)
129  ele2 = &(*recoElectron);
130  }
131 
132  if (recoElectron->charge() == 1)
133  posEle++;
134  else if (recoElectron->charge() == -1)
135  negEle++;
136 
137  } // end of loop over electrons
138 
139  nEle = posEle + negEle;
140 
141  //-------------------------------
142  //--- Jets
143  //-------------------------------
144  edm::Handle<reco::CaloJetCollection> caloJetCollection;
145  e.getByToken(theCaloJetCollection_, caloJetCollection);
146  if (!caloJetCollection.isValid()) {
147  edm::LogError("DQMClientExample") << "invalid collection: jets"
148  << "\n";
149  return;
150  }
151 
152  int nJet = 0;
153  const reco::CaloJet *jet1 = nullptr;
154  const reco::CaloJet *jet2 = nullptr;
155 
156  for (reco::CaloJetCollection::const_iterator i_calojet = caloJetCollection->begin();
157  i_calojet != caloJetCollection->end();
158  ++i_calojet) {
159  // remove jet-ele matching
160  if (ele1)
161  if (Distance(*i_calojet, *ele1) < 0.3)
162  continue;
163 
164  if (ele2)
165  if (Distance(*i_calojet, *ele2) < 0.3)
166  continue;
167 
168  if (i_calojet->pt() < ptThrJet_)
169  continue;
170 
171  nJet++;
172 
173  if (!jet1)
174  jet1 = &(*i_calojet);
175 
176  else if (!jet2)
177  jet2 = &(*i_calojet);
178  }
179 
180  // ---------------------------
181  // ---- Analyze Trigger Event
182  // ---------------------------
183 
184  // check what is in the menu
186  e.getByToken(triggerResults_, hltresults);
187 
188  if (!hltresults.isValid()) {
189  edm::LogError("DQMClientExample") << "invalid collection: TriggerResults"
190  << "\n";
191  return;
192  }
193 
194  bool hasFired = false;
195  const edm::TriggerNames &trigNames = e.triggerNames(*hltresults);
196  unsigned int numTriggers = trigNames.size();
197 
198  for (unsigned int hltIndex = 0; hltIndex < numTriggers; ++hltIndex) {
199  if (trigNames.triggerName(hltIndex) == triggerPath_ && hltresults->wasrun(hltIndex) && hltresults->accept(hltIndex))
200  hasFired = true;
201  }
202 
203  // access the trigger event
205  e.getByToken(triggerEvent_, triggerEvent);
206  if (triggerEvent.failedToGet()) {
207  edm::LogError("DQMClientExample") << "invalid collection: TriggerEvent"
208  << "\n";
209  return;
210  }
211 
212  reco::Particle *ele1_HLT = nullptr;
213  int nEle_HLT = 0;
214 
215  size_t filterIndex = triggerEvent->filterIndex(triggerFilter_);
217  if (!(filterIndex >= triggerEvent->sizeFilters())) {
218  const trigger::Keys &keys = triggerEvent->filterKeys(filterIndex);
219  std::vector<reco::Particle> triggeredEle;
220 
221  for (size_t j = 0; j < keys.size(); ++j) {
222  trigger::TriggerObject foundObject = triggerObjects[keys[j]];
223  if (abs(foundObject.particle().pdgId()) != 11)
224  continue; // make sure that it is an electron
225 
226  triggeredEle.push_back(foundObject.particle());
227  ++nEle_HLT;
228  }
229 
230  if (!triggeredEle.empty())
231  ele1_HLT = &(triggeredEle.at(0));
232  }
233 
234  //-------------------------------
235  //--- Fill the histos
236  //-------------------------------
237 
238  // vertex
239  h_vertex_number->Fill(vertex_number);
240 
241  // met
242  h_pfMet->Fill(pfMETCollection->begin()->et());
243 
244  // multiplicities
245  h_eMultiplicity->Fill(nEle);
246  h_jMultiplicity->Fill(nJet);
247  h_eMultiplicity_HLT->Fill(nEle_HLT);
248 
249  // leading not matched
250  if (ele1) {
251  h_ePt_leading->Fill(ele1->pt());
252  h_eEta_leading->Fill(ele1->eta());
253  h_ePhi_leading->Fill(ele1->phi());
254  }
255  if (ele1_HLT) {
256  h_ePt_leading_HLT->Fill(ele1_HLT->pt());
257  h_eEta_leading_HLT->Fill(ele1_HLT->eta());
258  h_ePhi_leading_HLT->Fill(ele1_HLT->phi());
259  }
260  // leading Jet
261  if (jet1) {
262  h_jPt_leading->Fill(jet1->pt());
263  h_jEta_leading->Fill(jet1->eta());
264  h_jPhi_leading->Fill(jet1->phi());
265  }
266 
267  // fill only when the trigger candidate mathes with the reco one
268  if (ele1 && ele1_HLT && deltaR(*ele1_HLT, *ele1) < 0.3 && hasFired == true) {
269  h_ePt_leading_matched->Fill(ele1->pt());
270  h_eEta_leading_matched->Fill(ele1->eta());
271  h_ePhi_leading_matched->Fill(ele1->phi());
272 
273  h_ePt_leading_HLT_matched->Fill(ele1_HLT->pt());
274  h_eEta_leading_HLT_matched->Fill(ele1_HLT->eta());
275  h_ePhi_leading_HLT_matched->Fill(ele1_HLT->phi());
276 
277  h_ePt_diff->Fill(ele1->pt() - ele1_HLT->pt());
278  }
279 }
280 
281 //
282 // -------------------------------------- endRun
283 // --------------------------------------------
284 //
286  edm::LogInfo("DQMExample_Step1") << "DQMExample_Step1::endRun" << std::endl;
287 }
288 
289 //
290 // -------------------------------------- book histograms
291 // --------------------------------------------
292 //
294  ibooker_.cd();
295  ibooker_.setCurrentFolder("Physics/TopTest");
296 
297  h_vertex_number = ibooker_.book1D("Vertex_number", "Number of event vertices in collection", 40, -0.5, 39.5);
298 
299  h_pfMet = ibooker_.book1D("pfMet", "Pf Missing E_{T}; GeV", 20, 0.0, 100);
300 
301  h_eMultiplicity = ibooker_.book1D("NElectrons", "# of electrons per event", 10, 0., 10.);
302  h_ePt_leading_matched = ibooker_.book1D("ElePt_leading_matched", "Pt of leading electron", 50, 0., 100.);
303  h_eEta_leading_matched = ibooker_.book1D("EleEta_leading_matched", "Eta of leading electron", 50, -5., 5.);
304  h_ePhi_leading_matched = ibooker_.book1D("ElePhi_leading_matched", "Phi of leading electron", 50, -3.5, 3.5);
305 
306  h_ePt_leading = ibooker_.book1D("ElePt_leading", "Pt of leading electron", 50, 0., 100.);
307  h_eEta_leading = ibooker_.book1D("EleEta_leading", "Eta of leading electron", 50, -5., 5.);
308  h_ePhi_leading = ibooker_.book1D("ElePhi_leading", "Phi of leading electron", 50, -3.5, 3.5);
309 
310  h_jMultiplicity = ibooker_.book1D("NJets", "# of electrons per event", 10, 0., 10.);
311  h_jPt_leading = ibooker_.book1D("JetPt_leading", "Pt of leading Jet", 150, 0., 300.);
312  h_jEta_leading = ibooker_.book1D("JetEta_leading", "Eta of leading Jet", 50, -5., 5.);
313  h_jPhi_leading = ibooker_.book1D("JetPhi_leading", "Phi of leading Jet", 50, -3.5, 3.5);
314 
315  h_eMultiplicity_HLT = ibooker_.book1D("NElectrons_HLT", "# of electrons per event @HLT", 10, 0., 10.);
316  h_ePt_leading_HLT = ibooker_.book1D("ElePt_leading_HLT", "Pt of leading electron @HLT", 50, 0., 100.);
317  h_eEta_leading_HLT = ibooker_.book1D("EleEta_leading_HLT", "Eta of leading electron @HLT", 50, -5., 5.);
318  h_ePhi_leading_HLT = ibooker_.book1D("ElePhi_leading_HLT", "Phi of leading electron @HLT", 50, -3.5, 3.5);
319 
320  h_ePt_leading_HLT_matched = ibooker_.book1D("ElePt_leading_HLT_matched", "Pt of leading electron @HLT", 50, 0., 100.);
322  ibooker_.book1D("EleEta_leading_HLT_matched", "Eta of leading electron @HLT", 50, -5., 5.);
324  ibooker_.book1D("ElePhi_leading_HLT_matched", "Phi of leading electron @HLT", 50, -3.5, 3.5);
325 
326  h_ePt_diff = ibooker_.book1D("ElePt_diff_matched", "pT(RECO) - pT(HLT) for mathed candidates", 100, -10, 10.);
327 
328  ibooker_.cd();
329 }
330 
331 //
332 // -------------------------------------- functions
333 // --------------------------------------------
334 //
335 double DQMExample_Step1::Distance(const reco::Candidate &c1, const reco::Candidate &c2) { return deltaR(c1, c2); }
336 
338  return deltaPhi(c1.p4().phi(), c2.p4().phi());
339 }
340 
341 // This always returns only a positive deltaPhi
342 double DQMExample_Step1::calcDeltaPhi(double phi1, double phi2) {
343  double deltaPhi = phi1 - phi2;
344  if (deltaPhi < 0)
345  deltaPhi = -deltaPhi;
346  if (deltaPhi > 3.1415926) {
347  deltaPhi = 2 * 3.1415926 - deltaPhi;
348  }
349  return deltaPhi;
350 }
351 
352 //
353 // -------------------------------------- electronID
354 // --------------------------------------------
355 //
357  const edm::EventSetup &iESetup,
358  const reco::GsfElectron &electron) {
359  //********* CONVERSION TOOLS
361  iEvent.getByToken(theConversionCollection_, conversions_h);
362 
363  bool isMediumEle = false;
364 
365  float pt = electron.pt();
366  float eta = electron.eta();
367 
368  int isEB = electron.isEB();
369  float sigmaIetaIeta = electron.sigmaIetaIeta();
370  float DetaIn = electron.deltaEtaSuperClusterTrackAtVtx();
371  float DphiIn = electron.deltaPhiSuperClusterTrackAtVtx();
372  float HOverE = electron.hadronicOverEm();
373  float ooemoop = (1.0 / electron.ecalEnergy() - electron.eSuperClusterOverP() / electron.ecalEnergy());
374 
375  int mishits = electron.gsfTrack()->hitPattern().numberOfLostHits(reco::HitPattern::MISSING_INNER_HITS);
376  int nAmbiguousGsfTracks = electron.ambiguousGsfTracksSize();
377 
378  reco::GsfTrackRef eleTrack = electron.gsfTrack();
379  float dxy = eleTrack->dxy(PVPoint_);
380  float dz = eleTrack->dz(PVPoint_);
381 
383  iEvent.getByToken(theBSCollection_, BSHandle);
384  const reco::BeamSpot BS = *BSHandle;
385 
386  bool isConverted = ConversionTools::hasMatchedConversion(electron, *conversions_h, BS.position());
387 
388  // default
389  if ((pt > 12.) && (fabs(eta) < 2.5) &&
390  (((isEB == 1) && (fabs(DetaIn) < 0.004)) || ((isEB == 0) && (fabs(DetaIn) < 0.007))) &&
391  (((isEB == 1) && (fabs(DphiIn) < 0.060)) || ((isEB == 0) && (fabs(DphiIn) < 0.030))) &&
392  (((isEB == 1) && (sigmaIetaIeta < 0.010)) || ((isEB == 0) && (sigmaIetaIeta < 0.030))) &&
393  (((isEB == 1) && (HOverE < 0.120)) || ((isEB == 0) && (HOverE < 0.100))) &&
394  (((isEB == 1) && (fabs(ooemoop) < 0.050)) || ((isEB == 0) && (fabs(ooemoop) < 0.050))) &&
395  (((isEB == 1) && (fabs(dxy) < 0.020)) || ((isEB == 0) && (fabs(dxy) < 0.020))) &&
396  (((isEB == 1) && (fabs(dz) < 0.100)) || ((isEB == 0) && (fabs(dz) < 0.100))) &&
397  (((isEB == 1) && (!isConverted)) || ((isEB == 0) && (!isConverted))) && (mishits == 0) &&
398  (nAmbiguousGsfTracks == 0))
399  isMediumEle = true;
400 
401  return isMediumEle;
402 }
~DQMExample_Step1() override
double calcDeltaPhi(double phi1, double phi2)
MonitorElement * h_ePhi_leading_matched
T getParameter(std::string const &) const
GsfTrackRef gsfTrack() const override
reference to a GsfTrack
Definition: GsfElectron.h:186
T getUntrackedParameter(std::string const &, T const &) const
bool wasrun() const
Was at least one path run?
double pt() const
transverse momentum
Definition: Particle.h:104
MonitorElement * h_jMultiplicity
math::XYZPoint PVPoint_
bool MediumEle(const edm::Event &iEvent, const edm::EventSetup &iESetup, const reco::GsfElectron &electron)
double eta() const final
momentum pseudorapidity
edm::EDGetTokenT< reco::GsfElectronCollection > theElectronCollection_
Jets made from CaloTowers.
Definition: CaloJet.h:29
trigger::size_type sizeFilters() const
Definition: TriggerEvent.h:135
float eSuperClusterOverP() const
Definition: GsfElectron.h:249
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
bool accept() const
Has at least one path accepted the event?
const Keys & filterKeys(trigger::size_type index) const
Definition: TriggerEvent.h:111
trigger::size_type filterIndex(const edm::InputTag &filterTag) const
find index of filter in data-member vector from filter tag
Definition: TriggerEvent.h:123
reco::Particle particle(reco::Particle::Charge q=0, const reco::Particle::Point &vertex=reco::Particle::Point(0, 0, 0), int status=0, bool integerCharge=true) const
Definition: TriggerObject.h:69
MonitorElement * h_ePhi_leading_HLT_matched
double pt() const final
transverse momentum
MonitorElement * h_ePhi_leading
MonitorElement * h_eEta_leading_HLT
MonitorElement * h_jPhi_leading
edm::EDGetTokenT< reco::ConversionCollection > theConversionCollection_
Strings::size_type size() const
Definition: TriggerNames.cc:31
edm::EDGetTokenT< trigger::TriggerEvent > triggerEvent_
double Distance(const reco::Candidate &c1, const reco::Candidate &c2)
int pdgId() const
PDG identifier.
Definition: Particle.h:134
bool isEB() const
Definition: GsfElectron.h:356
DQMExample_Step1(const edm::ParameterSet &ps)
void Fill(long long x)
MonitorElement * h_eEta_leading
void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override
edm::EDGetTokenT< reco::BeamSpot > theBSCollection_
MonitorElement * h_ePt_leading_HLT
Single trigger physics object (e.g., an isolated muon)
Definition: TriggerObject.h:22
float deltaEtaSuperClusterTrackAtVtx() const
Definition: GsfElectron.h:253
int iEvent
Definition: GenABIO.cc:224
MonitorElement * h_ePt_diff
MonitorElement * h_ePt_leading_HLT_matched
float sigmaIetaIeta() const
Definition: GsfElectron.h:440
float hadronicOverEm() const
Definition: GsfElectron.h:495
double phi() const
momentum azimuthal angle
Definition: Particle.h:106
MonitorElement * h_jEta_leading
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:268
void bookHistos(DQMStore::IBooker &)
virtual const LorentzVector & p4() const =0
four-momentum Lorentz vector
const TriggerObjectCollection & getObjects() const
Definition: TriggerEvent.h:98
static bool hasMatchedConversion(const reco::GsfElectron &ele, const reco::ConversionCollection &convCol, const math::XYZPoint &beamspot, bool allowCkfMatch=true, float lxyMin=2.0, float probMin=1e-6, unsigned int nHitsBeforeVtxMax=0)
float deltaPhiSuperClusterTrackAtVtx() const
Definition: GsfElectron.h:256
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:106
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
MonitorElement * h_eEta_leading_HLT_matched
MonitorElement * h_vertex_number
MonitorElement * h_ePt_leading
bool isValid() const
Definition: HandleBase.h:74
MonitorElement * h_eMultiplicity
MonitorElement * h_pfMet
std::vector< TriggerObject > TriggerObjectCollection
collection of trigger physics objects (e.g., all isolated muons)
Definition: TriggerObject.h:81
static const char *const trigNames[]
Definition: EcalDumpRaw.cc:74
bool failedToGet() const
Definition: HandleBase.h:78
edm::EDGetTokenT< edm::TriggerResults > triggerResults_
void endRun(edm::Run const &run, edm::EventSetup const &eSetup) override
MonitorElement * h_jPt_leading
std::string const & triggerName(unsigned int index) const
Definition: TriggerNames.cc:22
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
std::vector< size_type > Keys
MonitorElement * h_ePt_leading_matched
GsfTrackRefVector::size_type ambiguousGsfTracksSize() const
Definition: GsfElectron.h:722
edm::EDGetTokenT< reco::PFMETCollection > thePfMETCollection_
edm::InputTag triggerFilter_
float ecalEnergy() const
Definition: GsfElectron.h:859
MonitorElement * h_ePhi_leading_HLT
double DistancePhi(const reco::Candidate &c1, const reco::Candidate &c2)
std::string triggerPath_
const Point & position() const
position
Definition: BeamSpot.h:62
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
MonitorElement * h_eMultiplicity_HLT
double eta() const
momentum pseudorapidity
Definition: Particle.h:110
double phi() const final
momentum azimuthal angle
MonitorElement * h_eEta_leading_matched
edm::EDGetTokenT< reco::VertexCollection > thePVCollection_
edm::EDGetTokenT< reco::CaloJetCollection > theCaloJetCollection_
edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const override
Definition: Event.cc:256
Definition: Run.h:45
void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override