CMS 3D CMS Logo

MuonRecoOneHLT.cc
Go to the documentation of this file.
2 
4 
5 #include <string>
6 #include "TMath.h"
7 using namespace std;
8 using namespace edm;
9 
10 // Uncomment to DEBUG
11 //#define DEBUG
12 
14  parameters = pSet;
15 
16  ParameterSet muonparms = parameters.getParameter<edm::ParameterSet>("SingleMuonTrigger");
17  ParameterSet dimuonparms = parameters.getParameter<edm::ParameterSet>("DoubleMuonTrigger");
18  _SingleMuonEventFlag = new GenericTriggerEventFlag(muonparms, consumesCollector(), *this, l1t::UseEventSetupIn::Run);
19  _DoubleMuonEventFlag =
20  new GenericTriggerEventFlag(dimuonparms, consumesCollector(), *this, l1t::UseEventSetupIn::Run);
21 
22  // Trigger Expresions in case de connection to the DB fails
23  singlemuonExpr_ = muonparms.getParameter<std::vector<std::string> >("hltPaths");
24  doublemuonExpr_ = dimuonparms.getParameter<std::vector<std::string> >("hltPaths");
25 
26  theMuonCollectionLabel_ = consumes<reco::MuonCollection>(parameters.getParameter<edm::InputTag>("MuonCollection"));
27  theVertexLabel_ = consumes<reco::VertexCollection>(parameters.getParameter<edm::InputTag>("VertexLabel"));
28  theBeamSpotLabel_ = mayConsume<reco::BeamSpot>(parameters.getParameter<edm::InputTag>("BeamSpotLabel"));
29  theTriggerResultsLabel_ = consumes<TriggerResults>(parameters.getParameter<InputTag>("TriggerResultsLabel"));
30 
31  // Parameters
32  etaBin = parameters.getParameter<int>("etaBin");
33  etaMin = parameters.getParameter<double>("etaMin");
34  etaMax = parameters.getParameter<double>("etaMax");
35  ptBin = parameters.getParameter<int>("ptBin");
36  ptMin = parameters.getParameter<double>("ptMin");
37  ptMax = parameters.getParameter<double>("ptMax");
38  chi2Bin = parameters.getParameter<int>("chi2Bin");
39  chi2Min = parameters.getParameter<double>("chi2Min");
40  chi2Max = parameters.getParameter<double>("chi2Max");
41  phiBin = parameters.getParameter<int>("phiBin");
42  phiMin = parameters.getParameter<double>("phiMin");
43  phiMax = parameters.getParameter<double>("phiMax");
44 }
46  delete _SingleMuonEventFlag;
47  delete _DoubleMuonEventFlag;
48 }
49 void MuonRecoOneHLT::bookHistograms(DQMStore::IBooker& ibooker, edm::Run const& iRun, edm::EventSetup const& iSetup) {
50 #ifdef DEBUG
51  cout << "[MuonRecoOneHLT] beginRun " << endl;
52  cout << "[MuonRecoOneHLT] Is MuonEventFlag On? " << _SingleMuonEventFlag->on() << endl;
53 #endif
54 
55  ibooker.cd();
56  ibooker.setCurrentFolder("Muons/MuonRecoOneHLT");
57 
58  muReco = ibooker.book1D("Muon_Reco", "Muon Reconstructed Tracks", 6, 1, 7);
59  muReco->setBinLabel(1, "glb+tk+sta");
60  muReco->setBinLabel(2, "glb+sta");
61  muReco->setBinLabel(3, "tk+sta");
62  muReco->setBinLabel(4, "tk");
63  muReco->setBinLabel(5, "sta");
64  muReco->setBinLabel(6, "calo");
65 
66  // monitoring of eta parameter
67  std::string histname = "GlbMuon_";
68  etaGlbTrack.push_back(ibooker.book1D(histname + "Glb_eta", "#eta_{GLB}", etaBin, etaMin, etaMax));
69  etaGlbTrack.push_back(ibooker.book1D(histname + "Tk_eta", "#eta_{TKfromGLB}", etaBin, etaMin, etaMax));
70  etaGlbTrack.push_back(ibooker.book1D(histname + "Sta_eta", "#eta_{STAfromGLB}", etaBin, etaMin, etaMax));
71  etaTight = ibooker.book1D("TightMuon_eta", "#eta_{GLB}", etaBin, etaMin, etaMax);
72  etaTrack = ibooker.book1D("TkMuon_eta", "#eta_{TK}", etaBin, etaMin, etaMax);
73  etaStaTrack = ibooker.book1D("StaMuon_eta", "#eta_{STA}", etaBin, etaMin, etaMax);
74 
75  // monitoring of phi paramater
76  phiGlbTrack.push_back(ibooker.book1D(histname + "Glb_phi", "#phi_{GLB}", phiBin, phiMin, phiMax));
77  phiGlbTrack[0]->setAxisTitle("rad");
78  phiGlbTrack.push_back(ibooker.book1D(histname + "Tk_phi", "#phi_{TKfromGLB}", phiBin, phiMin, phiMax));
79  phiGlbTrack[1]->setAxisTitle("rad");
80  phiGlbTrack.push_back(ibooker.book1D(histname + "Sta_phi", "#phi_{STAfromGLB}", phiBin, phiMin, phiMax));
81  phiGlbTrack[2]->setAxisTitle("rad");
82  phiTight = ibooker.book1D("TightMuon_phi", "#phi_{GLB}", phiBin, phiMin, phiMax);
83  phiTrack = ibooker.book1D("TkMuon_phi", "#phi_{TK}", phiBin, phiMin, phiMax);
84  phiTrack->setAxisTitle("rad");
85  phiStaTrack = ibooker.book1D("StaMuon_phi", "#phi_{STA}", phiBin, phiMin, phiMax);
86  phiStaTrack->setAxisTitle("rad");
87 
88  // monitoring of the chi2 parameter
89  chi2OvDFGlbTrack.push_back(
90  ibooker.book1D(histname + "Glb_chi2OverDf", "#chi_{2}OverDF_{GLB}", chi2Bin, chi2Min, chi2Max));
91  chi2OvDFGlbTrack.push_back(
92  ibooker.book1D(histname + "Tk_chi2OverDf", "#chi_{2}OverDF_{TKfromGLB}", phiBin, chi2Min, chi2Max));
93  chi2OvDFGlbTrack.push_back(
94  ibooker.book1D(histname + "Sta_chi2OverDf", "#chi_{2}OverDF_{STAfromGLB}", chi2Bin, chi2Min, chi2Max));
95  chi2OvDFTight = ibooker.book1D("TightMuon_chi2OverDf", "#chi_{2}OverDF_{GLB}", chi2Bin, chi2Min, chi2Max);
96  chi2OvDFTrack = ibooker.book1D("TkMuon_chi2OverDf", "#chi_{2}OverDF_{TK}", chi2Bin, chi2Min, chi2Max);
97  chi2OvDFStaTrack = ibooker.book1D("StaMuon_chi2OverDf", "#chi_{2}OverDF_{STA}", chi2Bin, chi2Min, chi2Max);
98 
99  // monitoring of the transverse momentum
100  ptGlbTrack.push_back(ibooker.book1D(histname + "Glb_pt", "pt_{GLB}", ptBin, ptMin, ptMax));
101  ptGlbTrack[0]->setAxisTitle("GeV");
102  ptGlbTrack.push_back(ibooker.book1D(histname + "Tk_pt", "pt_{TKfromGLB}", ptBin, ptMin, ptMax));
103  ptGlbTrack[1]->setAxisTitle("GeV");
104  ptGlbTrack.push_back(ibooker.book1D(histname + "Sta_pt", "pt_{STAfromGLB}", ptBin, ptMin, ptMax));
105  ptGlbTrack[2]->setAxisTitle("GeV");
106  ptTight = ibooker.book1D("TightMuon_pt", "pt_{GLB}", ptBin, ptMin, ptMax);
107  ptTight->setAxisTitle("GeV");
108  ptTrack = ibooker.book1D("TkMuon_pt", "pt_{TK}", ptBin, ptMin, ptMax);
109  ptTrack->setAxisTitle("GeV");
110  ptStaTrack = ibooker.book1D("StaMuon_pt", "pt_{STA}", ptBin, ptMin, ptMax);
111  ptStaTrack->setAxisTitle("GeV");
112 
113  if (_SingleMuonEventFlag->on())
114  _SingleMuonEventFlag->initRun(iRun, iSetup);
115  if (_DoubleMuonEventFlag->on())
116  _DoubleMuonEventFlag->initRun(iRun, iSetup);
117 
118  if (_SingleMuonEventFlag->on() &&
119  _SingleMuonEventFlag->expressionsFromDB(_SingleMuonEventFlag->hltDBKey(), iSetup)[0] != "CONFIG_ERROR")
120  singlemuonExpr_ = _SingleMuonEventFlag->expressionsFromDB(_SingleMuonEventFlag->hltDBKey(), iSetup);
121  if (_DoubleMuonEventFlag->on() &&
122  _DoubleMuonEventFlag->expressionsFromDB(_DoubleMuonEventFlag->hltDBKey(), iSetup)[0] != "CONFIG_ERROR")
123  singlemuonExpr_ = _DoubleMuonEventFlag->expressionsFromDB(_DoubleMuonEventFlag->hltDBKey(), iSetup);
124 }
126  // =================================================================================
127  // Look for the Primary Vertex (and use the BeamSpot instead, if you can't find it):
128  reco::Vertex::Point posVtx;
129  reco::Vertex::Error errVtx;
130  unsigned int theIndexOfThePrimaryVertex = 999.;
131 
133  iEvent.getByToken(theVertexLabel_, vertex);
134  if (vertex.isValid()) {
135  for (unsigned int ind = 0; ind < vertex->size(); ++ind) {
136  if ((*vertex)[ind].isValid() && !((*vertex)[ind].isFake())) {
137  theIndexOfThePrimaryVertex = ind;
138  break;
139  }
140  }
141  }
142 
143  if (theIndexOfThePrimaryVertex < 100) {
144  posVtx = ((*vertex)[theIndexOfThePrimaryVertex]).position();
145  errVtx = ((*vertex)[theIndexOfThePrimaryVertex]).error();
146  } else {
147  LogInfo("RecoMuonValidator") << "reco::PrimaryVertex not found, use BeamSpot position instead\n";
148 
149  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
150  iEvent.getByToken(theBeamSpotLabel_, recoBeamSpotHandle);
151  const reco::BeamSpot& bs = *recoBeamSpotHandle;
152 
153  posVtx = bs.position();
154  errVtx(0, 0) = bs.BeamWidthX();
155  errVtx(1, 1) = bs.BeamWidthY();
156  errVtx(2, 2) = bs.sigmaZ();
157  }
158 
159  const reco::Vertex vtx(posVtx, errVtx);
160 
161  // ==========================================================
162  // READ DATA:
164  iEvent.getByToken(theMuonCollectionLabel_, muons);
165 
167  iEvent.getByToken(theTriggerResultsLabel_, triggerResults);
168 
169  // check if muon collection is valid
170  if (!muons.isValid())
171  return;
172 
173  // Pick the leading lepton.
174  std::map<float, const reco::Muon*> muonMap;
175  for (reco::MuonCollection::const_iterator recoMu = muons->begin(); recoMu != muons->end(); ++recoMu) {
176  muonMap[recoMu->pt()] = &*recoMu;
177  }
178  std::vector<const reco::Muon*> LeadingMuon;
179  for (std::map<float, const reco::Muon*>::reverse_iterator rit = muonMap.rbegin(); rit != muonMap.rend(); ++rit) {
180  LeadingMuon.push_back((*rit).second);
181  }
182 
183  // Pick Trigger information.
184  const edm::TriggerNames& triggerNames = iEvent.triggerNames(*triggerResults);
185  const unsigned int nTrig(triggerNames.size());
186  bool _trig_SingleMu = false;
187  bool _trig_DoubleMu = false;
188  for (unsigned int i = 0; i < nTrig; ++i) {
189  if (triggerNames.triggerName(i).find(singlemuonExpr_[0].substr(0, singlemuonExpr_[0].rfind("_v") + 2)) !=
190  std::string::npos &&
191  triggerResults->accept(i))
192  _trig_SingleMu = true;
193  if (triggerNames.triggerName(i).find(doublemuonExpr_[0].substr(0, doublemuonExpr_[0].rfind("_v") + 2)) !=
194  std::string::npos &&
195  triggerResults->accept(i))
196  _trig_DoubleMu = true;
197  }
198 #ifdef DEBUG
199  cout << "[MuonRecoOneHLT] Trigger Fired ? " << (_trig_SingleMu || _trig_DoubleMu) << endl;
200 #endif
201 
202  if (!_trig_SingleMu && !_trig_DoubleMu)
203  return;
204  if (LeadingMuon.empty())
205  return;
206  // if (_MuonEventFlag->on() && !(_MuonEventFlag->accept(iEvent,iSetup))) return;
207 
208  // Check if Muon is Global
209  if ((*LeadingMuon[0]).isGlobalMuon()) {
210  LogTrace(metname) << "[MuonRecoOneHLT] The mu is global - filling the histos";
211  if ((*LeadingMuon[0]).isTrackerMuon() && (*LeadingMuon[0]).isStandAloneMuon())
212  muReco->Fill(1);
213  if (!((*LeadingMuon[0]).isTrackerMuon()) && (*LeadingMuon[0]).isStandAloneMuon())
214  muReco->Fill(2);
215  if (!(*LeadingMuon[0]).isStandAloneMuon())
216  LogTrace(metname) << "[MuonRecoOneHLT] ERROR: the mu is global but not standalone!";
217 
218  // get the track combinig the information from both the Tracker and the Spectrometer
219  reco::TrackRef recoCombinedGlbTrack = (*LeadingMuon[0]).combinedMuon();
220  // get the track using only the tracker data
221  reco::TrackRef recoTkGlbTrack = (*LeadingMuon[0]).track();
222  // get the track using only the mu spectrometer data
223  reco::TrackRef recoStaGlbTrack = (*LeadingMuon[0]).standAloneMuon();
224 
225  etaGlbTrack[0]->Fill(recoCombinedGlbTrack->eta());
226  etaGlbTrack[1]->Fill(recoTkGlbTrack->eta());
227  etaGlbTrack[2]->Fill(recoStaGlbTrack->eta());
228 
229  phiGlbTrack[0]->Fill(recoCombinedGlbTrack->phi());
230  phiGlbTrack[1]->Fill(recoTkGlbTrack->phi());
231  phiGlbTrack[2]->Fill(recoStaGlbTrack->phi());
232 
233  chi2OvDFGlbTrack[0]->Fill(recoCombinedGlbTrack->normalizedChi2());
234  chi2OvDFGlbTrack[1]->Fill(recoTkGlbTrack->normalizedChi2());
235  chi2OvDFGlbTrack[2]->Fill(recoStaGlbTrack->normalizedChi2());
236 
237  ptGlbTrack[0]->Fill(recoCombinedGlbTrack->pt());
238  ptGlbTrack[1]->Fill(recoTkGlbTrack->pt());
239  ptGlbTrack[2]->Fill(recoStaGlbTrack->pt());
240  }
241  // Check if Muon is Tight
242  if (muon::isTightMuon((*LeadingMuon[0]), vtx)) {
243  LogTrace(metname) << "[MuonRecoOneHLT] The mu is tracker only - filling the histos";
244 
245  reco::TrackRef recoCombinedGlbTrack = (*LeadingMuon[0]).combinedMuon();
246 
247  etaTight->Fill(recoCombinedGlbTrack->eta());
248  phiTight->Fill(recoCombinedGlbTrack->phi());
249  chi2OvDFTight->Fill(recoCombinedGlbTrack->normalizedChi2());
250  ptTight->Fill(recoCombinedGlbTrack->pt());
251  }
252 
253  // Check if Muon is Tracker but NOT Global
254  if ((*LeadingMuon[0]).isTrackerMuon() && !((*LeadingMuon[0]).isGlobalMuon())) {
255  LogTrace(metname) << "[MuonRecoOneHLT] The mu is tracker only - filling the histos";
256  if ((*LeadingMuon[0]).isStandAloneMuon())
257  muReco->Fill(3);
258  if (!((*LeadingMuon[0]).isStandAloneMuon()))
259  muReco->Fill(4);
260 
261  // get the track using only the tracker data
262  reco::TrackRef recoTrack = (*LeadingMuon[0]).track();
263 
264  etaTrack->Fill(recoTrack->eta());
265  phiTrack->Fill(recoTrack->phi());
266  chi2OvDFTrack->Fill(recoTrack->normalizedChi2());
267  ptTrack->Fill(recoTrack->pt());
268  }
269 
270  // Check if Muon is STA but NOT Global
271  if ((*LeadingMuon[0]).isStandAloneMuon() && !((*LeadingMuon[0]).isGlobalMuon())) {
272  LogTrace(metname) << "[MuonRecoOneHLT] The mu is STA only - filling the histos";
273  if (!((*LeadingMuon[0]).isTrackerMuon()))
274  muReco->Fill(5);
275 
276  // get the track using only the mu spectrometer data
277  reco::TrackRef recoStaTrack = (*LeadingMuon[0]).standAloneMuon();
278 
279  etaStaTrack->Fill(recoStaTrack->eta());
280  phiStaTrack->Fill(recoStaTrack->phi());
281  chi2OvDFStaTrack->Fill(recoStaTrack->normalizedChi2());
282  ptStaTrack->Fill(recoStaTrack->pt());
283  }
284  // Check if Muon is Only CaloMuon
285  if ((*LeadingMuon[0]).isCaloMuon() && !((*LeadingMuon[0]).isGlobalMuon()) && !((*LeadingMuon[0]).isTrackerMuon()) &&
286  !((*LeadingMuon[0]).isStandAloneMuon()))
287  muReco->Fill(6);
288 }
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
const std::string metname
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
constexpr float ptMin
void analyze(const edm::Event &, const edm::EventSetup &) override
math::Error< dimension >::type Error
covariance error matrix (3x3)
Definition: Vertex.h:45
Provides a code based selection for trigger and DCS information in order to have no failing filters i...
muons
the two sets of parameters below are mutually exclusive, depending if RECO or ALCARECO is used the us...
Definition: DiMuonV_cfg.py:214
#define LogTrace(id)
int iEvent
Definition: GenABIO.cc:224
math::XYZPoint Point
point in the space
Definition: Vertex.h:40
static std::string const triggerResults
Definition: EdmProvDump.cc:47
virtual void setBinLabel(int bin, const std::string &label, int axis=1)
set bin label for x, y or z axis (axis=1, 2, 3 respectively)
Log< level::Info, false > LogInfo
MuonRecoOneHLT(const edm::ParameterSet &)
Constructor.
~MuonRecoOneHLT() override
Destructor.
HLT enums.
static int position[264][3]
Definition: ReadPGInfo.cc:289
bool isTightMuon(const reco::Muon &, const reco::Vertex &)
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
Definition: Run.h:45
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)