CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
13 MuonRecoOneHLT::MuonRecoOneHLT(const edm::ParameterSet& pSet) { //, MuonServiceProxy *theService) :MuonAnalyzerBase(theService) {
14  parameters = pSet;
15 
16  // the services
17  theService = new MuonServiceProxy(parameters.getParameter<ParameterSet>("ServiceParameters"));
18 
19  dbe = edm::Service<DQMStore>().operator->();
20 
21  ParameterSet muonparms = parameters.getParameter<edm::ParameterSet>("SingleMuonTrigger");
22  ParameterSet dimuonparms = parameters.getParameter<edm::ParameterSet>("DoubleMuonTrigger");
23  _SingleMuonEventFlag = new GenericTriggerEventFlag( muonparms, consumesCollector() );
24  _DoubleMuonEventFlag = new GenericTriggerEventFlag( dimuonparms, consumesCollector() );
25 
26  // Trigger Expresions in case de connection to the DB fails
27  singlemuonExpr_ = muonparms.getParameter<std::vector<std::string> >("hltPaths");
28  doublemuonExpr_ = dimuonparms.getParameter<std::vector<std::string> >("hltPaths");
29 
30  theMuonCollectionLabel_ = consumes<reco::MuonCollection>(parameters.getParameter<edm::InputTag>("MuonCollection"));
31  theVertexLabel_ = consumes<reco::VertexCollection>(parameters.getParameter<edm::InputTag>("VertexLabel"));
32  theBeamSpotLabel_ = mayConsume<reco::BeamSpot>(parameters.getParameter<edm::InputTag>("BeamSpotLabel"));
33  theTriggerResultsLabel_ = consumes<TriggerResults>(parameters.getParameter<InputTag>("TriggerResultsLabel"));
34 }
35 
36 
38  delete _SingleMuonEventFlag;
39  delete _DoubleMuonEventFlag;
40 }
42 #ifdef DEBUG
43  cout << "[MuonRecoOneHLT] beginJob " << endl;
44 #endif
45 
46  }
47 
48 void MuonRecoOneHLT::beginRun(const edm::Run& iRun, const edm::EventSetup& iSetup){
49 #ifdef DEBUG
50  cout << "[MuonRecoOneHLT] beginRun " << endl;
51  cout << "[MuonRecoOneHLT] Is MuonEventFlag On? "<< _SingleMuonEventFlag->on() << endl;
52 #endif
53 
54  dbe->cd();
55  dbe->setCurrentFolder("Muons/MuonRecoOneHLT");
56 
57  muReco = dbe->book1D("Muon_Reco", "Muon Reconstructed Tracks", 6, 1, 7);
58  muReco->setBinLabel(1,"glb+tk+sta");
59  muReco->setBinLabel(2,"glb+sta");
60  muReco->setBinLabel(3,"tk+sta");
61  muReco->setBinLabel(4,"tk");
62  muReco->setBinLabel(5,"sta");
63  muReco->setBinLabel(6,"calo");
64 
65  // monitoring of eta parameter
66  etaBin = parameters.getParameter<int>("etaBin");
67  etaMin = parameters.getParameter<double>("etaMin");
68  etaMax = parameters.getParameter<double>("etaMax");
69 
70  std::string histname = "GlbMuon_";
71  etaGlbTrack.push_back(dbe->book1D(histname+"Glb_eta", "#eta_{GLB}", etaBin, etaMin, etaMax));
72  etaGlbTrack.push_back(dbe->book1D(histname+"Tk_eta", "#eta_{TKfromGLB}", etaBin, etaMin, etaMax));
73  etaGlbTrack.push_back(dbe->book1D(histname+"Sta_eta", "#eta_{STAfromGLB}", etaBin, etaMin, etaMax));
74  etaTight = dbe->book1D("TightMuon_eta", "#eta_{GLB}", etaBin, etaMin, etaMax);
75  etaTrack = dbe->book1D("TkMuon_eta", "#eta_{TK}", etaBin, etaMin, etaMax);
76  etaStaTrack = dbe->book1D("StaMuon_eta", "#eta_{STA}", etaBin, etaMin, etaMax);
77 
78  // monitoring of phi paramater
79  phiBin = parameters.getParameter<int>("phiBin");
80  phiMin = parameters.getParameter<double>("phiMin");
81  phiMax = parameters.getParameter<double>("phiMax");
82  phiGlbTrack.push_back(dbe->book1D(histname+"Glb_phi", "#phi_{GLB}", phiBin, phiMin, phiMax));
83  phiGlbTrack[0]->setAxisTitle("rad");
84  phiGlbTrack.push_back(dbe->book1D(histname+"Tk_phi", "#phi_{TKfromGLB}", phiBin, phiMin, phiMax));
85  phiGlbTrack[1]->setAxisTitle("rad");
86  phiGlbTrack.push_back(dbe->book1D(histname+"Sta_phi", "#phi_{STAfromGLB}", phiBin, phiMin, phiMax));
87  phiGlbTrack[2]->setAxisTitle("rad");
88  phiTight = dbe->book1D("TightMuon_phi", "#phi_{GLB}", phiBin, phiMin, phiMax);
89  phiTrack = dbe->book1D("TkMuon_phi", "#phi_{TK}", phiBin, phiMin, phiMax);
90  phiTrack->setAxisTitle("rad");
91  phiStaTrack = dbe->book1D("StaMuon_phi", "#phi_{STA}", phiBin, phiMin, phiMax);
92  phiStaTrack->setAxisTitle("rad");
93 
94  // monitoring of the chi2 parameter
95  chi2Bin = parameters.getParameter<int>("chi2Bin");
96  chi2Min = parameters.getParameter<double>("chi2Min");
97  chi2Max = parameters.getParameter<double>("chi2Max");
98  chi2OvDFGlbTrack.push_back(dbe->book1D(histname+"Glb_chi2OverDf", "#chi_{2}OverDF_{GLB}", chi2Bin, chi2Min, chi2Max));
99  chi2OvDFGlbTrack.push_back(dbe->book1D(histname+"Tk_chi2OverDf", "#chi_{2}OverDF_{TKfromGLB}", phiBin, chi2Min, chi2Max));
100  chi2OvDFGlbTrack.push_back(dbe->book1D(histname+"Sta_chi2OverDf", "#chi_{2}OverDF_{STAfromGLB}", chi2Bin, chi2Min, chi2Max));
101  chi2OvDFTight = dbe->book1D("TightMuon_chi2OverDf", "#chi_{2}OverDF_{GLB}", chi2Bin, chi2Min, chi2Max);
102  chi2OvDFTrack = dbe->book1D("TkMuon_chi2OverDf", "#chi_{2}OverDF_{TK}", chi2Bin, chi2Min, chi2Max);
103  chi2OvDFStaTrack = dbe->book1D("StaMuon_chi2OverDf", "#chi_{2}OverDF_{STA}", chi2Bin, chi2Min, chi2Max);
104 
105  // monitoring of the transverse momentum
106  ptBin = parameters.getParameter<int>("ptBin");
107  ptMin = parameters.getParameter<double>("ptMin");
108  ptMax = parameters.getParameter<double>("ptMax");
109  ptGlbTrack.push_back(dbe->book1D(histname+"Glb_pt", "pt_{GLB}", ptBin, ptMin, ptMax));
110  ptGlbTrack[0]->setAxisTitle("GeV");
111  ptGlbTrack.push_back(dbe->book1D(histname+"Tk_pt", "pt_{TKfromGLB}", ptBin, ptMin, ptMax));
112  ptGlbTrack[1]->setAxisTitle("GeV");
113  ptGlbTrack.push_back(dbe->book1D(histname+"Sta_pt", "pt_{STAfromGLB}", ptBin, ptMin, ptMax));
114  ptGlbTrack[2]->setAxisTitle("GeV");
115  ptTight = dbe->book1D("TightMuon_pt", "pt_{GLB}", ptBin, ptMin, ptMax);
116  ptTight->setAxisTitle("GeV");
117  ptTrack = dbe->book1D("TkMuon_pt", "pt_{TK}", ptBin, ptMin, ptMax);
118  ptTrack->setAxisTitle("GeV");
119  ptStaTrack = dbe->book1D("StaMuon_pt", "pt_{STA}", ptBin, ptMin, ptMax);
120  ptStaTrack->setAxisTitle("GeV");
121 
122  if ( _SingleMuonEventFlag->on() ) _SingleMuonEventFlag->initRun( iRun, iSetup );
123  if ( _DoubleMuonEventFlag->on() ) _DoubleMuonEventFlag->initRun( iRun, iSetup );
124 
125  if (_SingleMuonEventFlag->on() && _SingleMuonEventFlag->expressionsFromDB(_SingleMuonEventFlag->hltDBKey(), iSetup)[0] != "CONFIG_ERROR")
126  singlemuonExpr_ = _SingleMuonEventFlag->expressionsFromDB(_SingleMuonEventFlag->hltDBKey(),iSetup);
127  if (_DoubleMuonEventFlag->on() && _DoubleMuonEventFlag->expressionsFromDB(_DoubleMuonEventFlag->hltDBKey(), iSetup)[0] != "CONFIG_ERROR")
128  singlemuonExpr_ = _DoubleMuonEventFlag->expressionsFromDB(_DoubleMuonEventFlag->hltDBKey(),iSetup);
129 }
131  theService->update(iSetup);
132 
133  // =================================================================================
134  // Look for the Primary Vertex (and use the BeamSpot instead, if you can't find it):
135  reco::Vertex::Point posVtx;
136  reco::Vertex::Error errVtx;
137  unsigned int theIndexOfThePrimaryVertex = 999.;
138 
140  iEvent.getByToken(theVertexLabel_, vertex);
141  if (vertex.isValid()){
142  for (unsigned int ind=0; ind<vertex->size(); ++ind) {
143  if ( (*vertex)[ind].isValid() && !((*vertex)[ind].isFake()) ) {
144  theIndexOfThePrimaryVertex = ind;
145  break;
146  }
147  }
148  }
149 
150  if (theIndexOfThePrimaryVertex<100) {
151  posVtx = ((*vertex)[theIndexOfThePrimaryVertex]).position();
152  errVtx = ((*vertex)[theIndexOfThePrimaryVertex]).error();
153  }
154  else {
155  LogInfo("RecoMuonValidator") << "reco::PrimaryVertex not found, use BeamSpot position instead\n";
156 
157  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
158  iEvent.getByToken(theBeamSpotLabel_,recoBeamSpotHandle);
159  reco::BeamSpot bs = *recoBeamSpotHandle;
160 
161  posVtx = bs.position();
162  errVtx(0,0) = bs.BeamWidthX();
163  errVtx(1,1) = bs.BeamWidthY();
164  errVtx(2,2) = bs.sigmaZ();
165  }
166 
167  const reco::Vertex vtx(posVtx,errVtx);
168 
169 
170  // ==========================================================
171  // READ DATA:
173  iEvent.getByToken(theMuonCollectionLabel_,muons);
174 
176  iEvent.getByToken(theTriggerResultsLabel_, triggerResults);
177 
178  // check if muon collection is valid
179  if(!muons.isValid()) return;
180 
181  // Pick the leading lepton.
182  std::map<float,reco::Muon> muonMap;
183  for (reco::MuonCollection::const_iterator recoMu = muons->begin(); recoMu!=muons->end(); ++recoMu){
184  muonMap[recoMu->pt()] = *recoMu;
185  }
186  std::vector<reco::Muon> LeadingMuon;
187  for( std::map<float,reco::Muon>::reverse_iterator rit=muonMap.rbegin(); rit!=muonMap.rend(); ++rit){
188  LeadingMuon.push_back( (*rit).second );
189  }
190 
191  // Pick Trigger information.
192  const edm::TriggerNames& triggerNames = iEvent.triggerNames(*triggerResults);
193  const unsigned int nTrig(triggerNames.size());
194  bool _trig_SingleMu = false;
195  bool _trig_DoubleMu = false;
196  for (unsigned int i=0;i<nTrig;++i){
197  if (triggerNames.triggerName(i).find(singlemuonExpr_[0].substr(0,singlemuonExpr_[0].rfind("_v")+2))!=std::string::npos && triggerResults->accept(i))
198  _trig_SingleMu = true;
199  if (triggerNames.triggerName(i).find(doublemuonExpr_[0].substr(0,doublemuonExpr_[0].rfind("_v")+2))!=std::string::npos && triggerResults->accept(i))
200  _trig_DoubleMu = true;
201  }
202 #ifdef DEBUG
203  cout << "[MuonRecoOneHLT] Trigger Fired ? "<< (_trig_SingleMu || _trig_DoubleMu) << endl;
204 #endif
205 
206  if (!_trig_SingleMu && !_trig_DoubleMu) return;
207  if (LeadingMuon.size() == 0) return;
208  // if (_MuonEventFlag->on() && !(_MuonEventFlag->accept(iEvent,iSetup))) return;
209 
210  // Check if Muon is Global
211  if(LeadingMuon[0].isGlobalMuon()) {
212  LogTrace(metname)<<"[MuonRecoOneHLT] The mu is global - filling the histos";
213  if(LeadingMuon[0].isTrackerMuon() && LeadingMuon[0].isStandAloneMuon()) muReco->Fill(1);
214  if(!(LeadingMuon[0].isTrackerMuon()) && LeadingMuon[0].isStandAloneMuon()) 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 
244  LogTrace(metname)<<"[MuonRecoOneHLT] The mu is tracker only - filling the histos";
245 
246  reco::TrackRef recoCombinedGlbTrack = LeadingMuon[0].combinedMuon();
247 
248  etaTight->Fill(recoCombinedGlbTrack->eta());
249  phiTight->Fill(recoCombinedGlbTrack->phi());
250  chi2OvDFTight->Fill(recoCombinedGlbTrack->normalizedChi2());
251  ptTight->Fill(recoCombinedGlbTrack->pt());
252  }
253 
254  // Check if Muon is Tracker but NOT Global
255  if(LeadingMuon[0].isTrackerMuon() && !(LeadingMuon[0].isGlobalMuon())) {
256  LogTrace(metname)<<"[MuonRecoOneHLT] The mu is tracker only - filling the histos";
257  if(LeadingMuon[0].isStandAloneMuon()) muReco->Fill(3);
258  if(!(LeadingMuon[0].isStandAloneMuon())) muReco->Fill(4);
259 
260  // get the track using only the tracker data
261  reco::TrackRef recoTrack = LeadingMuon[0].track();
262 
263  etaTrack->Fill(recoTrack->eta());
264  phiTrack->Fill(recoTrack->phi());
265  chi2OvDFTrack->Fill(recoTrack->normalizedChi2());
266  ptTrack->Fill(recoTrack->pt());
267  }
268 
269  // Check if Muon is STA but NOT Global
270  if(LeadingMuon[0].isStandAloneMuon() && !(LeadingMuon[0].isGlobalMuon())) {
271  LogTrace(metname)<<"[MuonRecoOneHLT] The mu is STA only - filling the histos";
272  if(!(LeadingMuon[0].isTrackerMuon())) muReco->Fill(5);
273 
274  // get the track using only the mu spectrometer data
275  reco::TrackRef recoStaTrack = LeadingMuon[0].standAloneMuon();
276 
277  etaStaTrack->Fill(recoStaTrack->eta());
278  phiStaTrack->Fill(recoStaTrack->phi());
279  chi2OvDFStaTrack->Fill(recoStaTrack->normalizedChi2());
280  ptStaTrack->Fill(recoStaTrack->pt());
281  }
282  // Check if Muon is Only CaloMuon
283  if(LeadingMuon[0].isCaloMuon() && !(LeadingMuon[0].isGlobalMuon()) && !(LeadingMuon[0].isTrackerMuon()) && !(LeadingMuon[0].isStandAloneMuon()))
284  muReco->Fill(6);
285 }
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
dictionary parameters
Definition: Parameters.py:2
virtual edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const
Definition: Event.cc:204
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:434
const std::string metname
void analyze(const edm::Event &, const edm::EventSetup &)
Get the analysis.
math::Error< dimension >::type Error
covariance error matrix (3x3)
Definition: Vertex.h:43
Provides a code based selection for trigger and DCS information in order to have no failing filters i...
Strings::size_type size() const
Definition: TriggerNames.cc:39
static int position[TOTALCHAMBERS][3]
Definition: ReadPGInfo.cc:509
void beginJob()
Inizialize parameters for histo binning.
int iEvent
Definition: GenABIO.cc:243
math::XYZPoint Point
point in the space
Definition: Vertex.h:39
double BeamWidthX() const
beam width X
Definition: BeamSpot.h:86
static std::string const triggerResults
Definition: EdmProvDump.cc:41
bool isValid() const
Definition: HandleBase.h:76
~MuonRecoOneHLT()
Destructor.
#define LogTrace(id)
MuonRecoOneHLT(const edm::ParameterSet &)
Constructor.
std::string const & triggerName(unsigned int index) const
Definition: TriggerNames.cc:27
double sigmaZ() const
sigma z
Definition: BeamSpot.h:80
double BeamWidthY() const
beam width Y
Definition: BeamSpot.h:88
tuple muons
Definition: patZpeak.py:38
tuple cout
Definition: gather_cfg.py:121
const Point & position() const
position
Definition: BeamSpot.h:62
bool isTightMuon(const reco::Muon &, const reco::Vertex &)
void beginRun(const edm::Run &iRun, const edm::EventSetup &iSetup)
Definition: Run.h:41