CMS 3D CMS Logo

MuonTrackValidator.cc
Go to the documentation of this file.
5 
18 
19 #include "TMath.h"
20 #include <TF1.h>
21 
22 using namespace std;
23 using namespace edm;
24 
26  edm::Run const&,
27  edm::EventSetup const& setup) {
28  for (unsigned int ww = 0; ww < associators.size(); ww++) {
29  for (unsigned int www = 0; www < label.size(); www++) {
30  ibooker.cd();
31  InputTag algo = label[www];
32  string dirName = dirName_;
33  if (!algo.process().empty())
34  dirName += algo.process() + "_";
35  if (!algo.label().empty())
36  dirName += algo.label();
37  if (!algo.instance().empty())
38  dirName += ("_" + algo.instance());
39  if (dirName.find("Tracks") < dirName.length()) {
40  dirName.replace(dirName.find("Tracks"), 6, "Trks");
41  }
42  if (dirName.find("UpdatedAtVtx") < dirName.length()) {
43  dirName.replace(dirName.find("UpdatedAtVtx"), 12, "UpdAtVtx");
44  }
45  string assoc = associators[ww];
46  if (assoc.find("tpToTkmuTrackAssociation") < assoc.length()) {
47  dirName += "_TkAsso";
48  }
49  std::replace(dirName.begin(), dirName.end(), ':', '_');
50  ibooker.setCurrentFolder(dirName);
51 
52  h_tracks.push_back(ibooker.book1D("Ntracks", "Number of reconstructed tracks", 100, -0.5, 99.5));
53  h_fakes.push_back(ibooker.book1D("Nfakes", "Number of fake reco tracks", 20, -0.5, 19.5));
54  h_charge.push_back(ibooker.book1D("Ncharge", "track charge", 3, -1.5, 1.5));
55 
56  h_recoeta.push_back(ibooker.book1D("num_reco_eta", "N of reco track vs eta", nintEta, minEta, maxEta));
57  h_assoceta.push_back(ibooker.book1D(
58  "num_assoSimToReco_eta", "N of associated tracks (simToReco) vs eta", nintEta, minEta, maxEta));
59  h_assoc2eta.push_back(ibooker.book1D(
60  "num_assoRecoToSim_eta", "N of associated (recoToSim) tracks vs eta", nintEta, minEta, maxEta));
61  h_simuleta.push_back(ibooker.book1D("num_simul_eta", "N of simulated tracks vs eta", nintEta, minEta, maxEta));
62  h_misideta.push_back(ibooker.book1D("num_chargemisid_eta",
63  "N of associated (simToReco) tracks with charge misID vs eta",
64  nintEta,
65  minEta,
66  maxEta));
67 
68  h_recopT.push_back(ibooker.book1D("num_reco_pT", "N of reco track vs pT", nintPt, minPt, maxPt));
69  h_assocpT.push_back(
70  ibooker.book1D("num_assoSimToReco_pT", "N of associated tracks (simToReco) vs pT", nintPt, minPt, maxPt));
71  h_assoc2pT.push_back(
72  ibooker.book1D("num_assoRecoToSim_pT", "N of associated (recoToSim) tracks vs pT", nintPt, minPt, maxPt));
73  h_simulpT.push_back(ibooker.book1D("num_simul_pT", "N of simulated tracks vs pT", nintPt, minPt, maxPt));
74  h_misidpT.push_back(ibooker.book1D(
75  "num_chargemisid_pT", "N of associated (simToReco) tracks with charge misID vs pT", nintPt, minPt, maxPt));
76 
77  h_recophi.push_back(ibooker.book1D("num_reco_phi", "N of reco track vs phi", nintPhi, minPhi, maxPhi));
78  h_assocphi.push_back(ibooker.book1D(
79  "num_assoSimToReco_phi", "N of associated tracks (simToReco) vs phi", nintPhi, minPhi, maxPhi));
80  h_assoc2phi.push_back(ibooker.book1D(
81  "num_assoRecoToSim_phi", "N of associated (recoToSim) tracks vs phi", nintPhi, minPhi, maxPhi));
82  h_simulphi.push_back(ibooker.book1D("num_simul_phi", "N of simulated tracks vs phi", nintPhi, minPhi, maxPhi));
83  h_misidphi.push_back(ibooker.book1D("num_chargemisid_phi",
84  "N of associated (simToReco) tracks with charge misID vs phi",
85  nintPhi,
86  minPhi,
87  maxPhi));
88 
89  h_recohit.push_back(ibooker.book1D("num_reco_hit", "N of reco tracks vs N SimHits", nintNHit, minNHit, maxNHit));
90  h_assochit.push_back(ibooker.book1D(
91  "num_assoSimToReco_hit", "N of associated tracks (simToReco) vs N SimHits", nintNHit, minNHit, maxNHit));
92  h_assoc2hit.push_back(ibooker.book1D(
93  "num_assoRecoToSim_hit", "N of associated (recoToSim) tracks vs N Rechits", nintNHit, minNHit, maxNHit));
94  h_simulhit.push_back(
95  ibooker.book1D("num_simul_hit", "N of simulated tracks vs N SimHits", nintNHit, minNHit, maxNHit));
96  h_misidhit.push_back(ibooker.book1D("num_chargemisid_hit",
97  "N of associated (recoToSim) tracks with charge misID vs N RecHits",
98  nintNHit,
99  minNHit,
100  maxNHit));
101 
102  h_recodxy.push_back(ibooker.book1D("num_reco_dxy", "N of reco track vs dxy", nintDxy, minDxy, maxDxy));
103  h_assocdxy.push_back(ibooker.book1D(
104  "num_assoSimToReco_dxy", "N of associated tracks (simToReco) vs dxy", nintDxy, minDxy, maxDxy));
105  h_assoc2dxy.push_back(ibooker.book1D(
106  "num_assoRecoToSim_dxy", "N of associated (recoToSim) tracks vs dxy", nintDxy, minDxy, maxDxy));
107  h_simuldxy.push_back(ibooker.book1D("num_simul_dxy", "N of simulated tracks vs dxy", nintDxy, minDxy, maxDxy));
108  h_misiddxy.push_back(ibooker.book1D("num_chargemisid_dxy",
109  "N of associated (simToReco) tracks with charge misID vs dxy",
110  nintDxy,
111  minDxy,
112  maxDxy));
113  h_recodz.push_back(ibooker.book1D("num_reco_dz", "N of reco track vs dz", nintDz, minDz, maxDz));
114  h_assocdz.push_back(
115  ibooker.book1D("num_assoSimToReco_dz", "N of associated tracks (simToReco) vs dz", nintDz, minDz, maxDz));
116  h_assoc2dz.push_back(
117  ibooker.book1D("num_assoRecoToSim_dz", "N of associated (recoToSim) tracks vs dz", nintDz, minDz, maxDz));
118  h_simuldz.push_back(ibooker.book1D("num_simul_dz", "N of simulated tracks vs dz", nintDz, minDz, maxDz));
119  h_misiddz.push_back(ibooker.book1D(
120  "num_chargemisid_dz", "N of associated (simToReco) tracks with charge misID vs dz", nintDz, minDz, maxDz));
121 
122  h_assocRpos.push_back(ibooker.book1D(
123  "num_assoSimToReco_Rpos", "N of associated tracks (simToReco) vs Radius", nintRpos, minRpos, maxRpos));
124  h_simulRpos.push_back(
125  ibooker.book1D("num_simul_Rpos", "N of simulated tracks vs Radius", nintRpos, minRpos, maxRpos));
126 
127  h_assocZpos.push_back(ibooker.book1D(
128  "num_assoSimToReco_Zpos", "N of associated tracks (simToReco) vs Z", nintZpos, minZpos, maxZpos));
129  h_simulZpos.push_back(ibooker.book1D("num_simul_Zpos", "N of simulated tracks vs Z", nintZpos, minZpos, maxZpos));
130 
131  h_recopu.push_back(ibooker.book1D("num_reco_pu", "N of reco track vs pu", nintPU, minPU, maxPU));
132  h_assocpu.push_back(
133  ibooker.book1D("num_assoSimToReco_pu", "N of associated tracks (simToReco) vs pu", nintPU, minPU, maxPU));
134  h_assoc2pu.push_back(
135  ibooker.book1D("num_assoRecoToSim_pu", "N of associated (recoToSim) tracks vs pu", nintPU, minPU, maxPU));
136  h_simulpu.push_back(ibooker.book1D("num_simul_pu", "N of simulated tracks vs pu", nintPU, minPU, maxPU));
137  h_misidpu.push_back(ibooker.book1D(
138  "num_chargemisid_pu", "N of associated (simToReco) charge misIDed tracks vs pu", nintPU, minPU, maxPU));
139 
140  h_nchi2.push_back(ibooker.book1D("chi2", "Track normalized #chi^{2}", 80, 0., 20.));
141  h_nchi2_prob.push_back(ibooker.book1D("chi2prob", "Probability of track normalized #chi^{2}", 100, 0., 1.));
142 
143  chi2_vs_nhits.push_back(
144  ibooker.book2D("chi2_vs_nhits", "#chi^{2} vs nhits", nintNHit, minNHit, maxNHit, 20, 0., 10.));
145  chi2_vs_eta.push_back(ibooker.book2D("chi2_vs_eta", "chi2_vs_eta", nintEta, minEta, maxEta, 40, 0., 20.));
146  chi2_vs_phi.push_back(ibooker.book2D("chi2_vs_phi", "#chi^{2} vs #phi", nintPhi, minPhi, maxPhi, 40, 0., 20.));
147 
148  h_nhits.push_back(ibooker.book1D("nhits", "Number of hits per track", nintNHit, minNHit, maxNHit));
149  nhits_vs_eta.push_back(
150  ibooker.book2D("nhits_vs_eta", "Number of Hits vs eta", nintEta, minEta, maxEta, nintNHit, minNHit, maxNHit));
151  nhits_vs_phi.push_back(
152  ibooker.book2D("nhits_vs_phi", "#hits vs #phi", nintPhi, minPhi, maxPhi, nintNHit, minNHit, maxNHit));
153 
154  if (do_MUOhitsPlots) {
155  nDThits_vs_eta.push_back(ibooker.book2D(
156  "nDThits_vs_eta", "Number of DT hits vs eta", nintEta, minEta, maxEta, nintDTHit, minDTHit, maxDTHit));
157  nCSChits_vs_eta.push_back(ibooker.book2D(
158  "nCSChits_vs_eta", "Number of CSC hits vs eta", nintEta, minEta, maxEta, nintCSCHit, minCSCHit, maxCSCHit));
159  nRPChits_vs_eta.push_back(ibooker.book2D(
160  "nRPChits_vs_eta", "Number of RPC hits vs eta", nintEta, minEta, maxEta, nintRPCHit, minRPCHit, maxRPCHit));
161  if (useGEMs_)
162  nGEMhits_vs_eta.push_back(ibooker.book2D(
163  "nGEMhits_vs_eta", "Number of GEM hits vs eta", nintEta, minEta, maxEta, nintNHit, minNHit, maxNHit));
164  if (useME0_)
165  nME0hits_vs_eta.push_back(ibooker.book2D(
166  "nME0hits_vs_eta", "Number of ME0 hits vs eta", nintEta, minEta, maxEta, nintNHit, minNHit, maxNHit));
167  }
168 
169  if (do_TRKhitsPlots) {
170  nTRK_LayersWithMeas_vs_eta.push_back(ibooker.book2D("nTRK_LayersWithMeas_vs_eta",
171  "# TRK Layers with measurement vs eta",
172  nintEta,
173  minEta,
174  maxEta,
175  nintLayers,
176  minLayers,
177  maxLayers));
178  nPixel_LayersWithMeas_vs_eta.push_back(ibooker.book2D("nPixel_LayersWithMeas_vs_eta",
179  "Number of Pixel Layers with measurement vs eta",
180  nintEta,
181  minEta,
182  maxEta,
183  nintPixels,
184  minPixels,
185  maxPixels));
186  h_nmisslayers_inner.push_back(ibooker.book1D(
187  "nTRK_misslayers_inner", "Number of missing inner TRK layers", nintLayers, minLayers, maxLayers));
188  h_nmisslayers_outer.push_back(ibooker.book1D(
189  "nTRK_misslayers_outer", "Number of missing outer TRK layers", nintLayers, minLayers, maxLayers));
190  h_nlosthits.push_back(ibooker.book1D("nlosthits", "Number of lost hits per track", 6, -0.5, 5.5));
191  nlosthits_vs_eta.push_back(ibooker.book2D(
192  "nlosthits_vs_eta", "Number of lost hits per track vs eta", nintEta, minEta, maxEta, 6, -0.5, 5.5));
193  }
194 
195  ptres_vs_eta.push_back(ibooker.book2D("ptres_vs_eta",
196  "p_{T} Relative Residual vs #eta",
197  nintEta,
198  minEta,
199  maxEta,
200  ptRes_nbin,
202  ptRes_rangeMax));
203  ptres_vs_phi.push_back(ibooker.book2D("ptres_vs_phi",
204  "p_{T} Relative Residual vs #phi",
205  nintPhi,
206  minPhi,
207  maxPhi,
208  ptRes_nbin,
210  ptRes_rangeMax));
211  ptres_vs_pt.push_back(ibooker.book2D("ptres_vs_pt",
212  "p_{T} Relative Residual vs p_{T}",
213  nintPt,
214  minPt,
215  maxPt,
216  ptRes_nbin,
218  ptRes_rangeMax));
219  h_ptpull.push_back(ibooker.book1D("ptpull", "p_{T} Pull", 100, -10., 10.));
220  ptpull_vs_eta.push_back(
221  ibooker.book2D("ptpull_vs_eta", "p_{T} Pull vs #eta", nintEta, minEta, maxEta, 100, -10., 10.));
222  ptpull_vs_phi.push_back(
223  ibooker.book2D("ptpull_vs_phi", "p_{T} Pull vs #phi", nintPhi, minPhi, maxPhi, 100, -10., 10.));
224  h_qoverppull.push_back(ibooker.book1D("qoverppull", "q/p Pull", 100, -10., 10.));
225 
226  h_etaRes.push_back(ibooker.book1D("etaRes", "#eta residual", etaRes_nbin, etaRes_rangeMin, etaRes_rangeMax));
227  etares_vs_eta.push_back(ibooker.book2D("etares_vs_eta",
228  "#eta Residual vs #eta",
229  nintEta,
230  minEta,
231  maxEta,
232  etaRes_nbin,
234  etaRes_rangeMax));
235 
236  thetaCotres_vs_eta.push_back(ibooker.book2D("thetaCotres_vs_eta",
237  "cot(#theta) Residual vs #eta",
238  nintEta,
239  minEta,
240  maxEta,
244  thetaCotres_vs_pt.push_back(ibooker.book2D("thetaCotres_vs_pt",
245  "cot(#theta) Residual vs p_{T}",
246  nintPt,
247  minPt,
248  maxPt,
252  h_thetapull.push_back(ibooker.book1D("thetapull", "#theta Pull", 100, -10., 10.));
253  thetapull_vs_eta.push_back(
254  ibooker.book2D("thetapull_vs_eta", "#theta Pull vs #eta", nintEta, minEta, maxEta, 100, -10, 10));
255  thetapull_vs_phi.push_back(
256  ibooker.book2D("thetapull_vs_phi", "#theta Pull vs #phi", nintPhi, minPhi, maxPhi, 100, -10, 10));
257 
258  phires_vs_eta.push_back(ibooker.book2D("phires_vs_eta",
259  "#phi Residual vs #eta",
260  nintEta,
261  minEta,
262  maxEta,
263  phiRes_nbin,
265  phiRes_rangeMax));
266  phires_vs_pt.push_back(ibooker.book2D(
267  "phires_vs_pt", "#phi Residual vs p_{T}", nintPt, minPt, maxPt, phiRes_nbin, phiRes_rangeMin, phiRes_rangeMax));
268  phires_vs_phi.push_back(ibooker.book2D("phires_vs_phi",
269  "#phi Residual vs #phi",
270  nintPhi,
271  minPhi,
272  maxPhi,
273  phiRes_nbin,
275  phiRes_rangeMax));
276  h_phipull.push_back(ibooker.book1D("phipull", "#phi Pull", 100, -10., 10.));
277  phipull_vs_eta.push_back(
278  ibooker.book2D("phipull_vs_eta", "#phi Pull vs #eta", nintEta, minEta, maxEta, 100, -10, 10));
279  phipull_vs_phi.push_back(
280  ibooker.book2D("phipull_vs_phi", "#phi Pull vs #phi", nintPhi, minPhi, maxPhi, 100, -10, 10));
281 
282  dxyres_vs_eta.push_back(ibooker.book2D("dxyres_vs_eta",
283  "dxy Residual vs #eta",
284  nintEta,
285  minEta,
286  maxEta,
287  dxyRes_nbin,
289  dxyRes_rangeMax));
290  dxyres_vs_pt.push_back(ibooker.book2D(
291  "dxyres_vs_pt", "dxy Residual vs p_{T}", nintPt, minPt, maxPt, dxyRes_nbin, dxyRes_rangeMin, dxyRes_rangeMax));
292  h_dxypull.push_back(ibooker.book1D("dxypull", "dxy Pull", 100, -10., 10.));
293  dxypull_vs_eta.push_back(
294  ibooker.book2D("dxypull_vs_eta", "dxy Pull vs #eta", nintEta, minEta, maxEta, 100, -10, 10));
295 
296  dzres_vs_eta.push_back(ibooker.book2D(
297  "dzres_vs_eta", "dz Residual vs #eta", nintEta, minEta, maxEta, dzRes_nbin, dzRes_rangeMin, dzRes_rangeMax));
298  dzres_vs_pt.push_back(ibooker.book2D(
299  "dzres_vs_pt", "dz Residual vs p_{T}", nintPt, minPt, maxPt, dzRes_nbin, dzRes_rangeMin, dzRes_rangeMax));
300  h_dzpull.push_back(ibooker.book1D("dzpull", "dz Pull", 100, -10., 10.));
301  dzpull_vs_eta.push_back(
302  ibooker.book2D("dzpull_vs_eta", "dz Pull vs #eta", nintEta, minEta, maxEta, 100, -10, 10));
303 
304  nRecHits_vs_nSimHits.push_back(ibooker.book2D(
305  "nRecHits_vs_nSimHits", "nRecHits vs nSimHits", nintNHit, minNHit, maxNHit, nintNHit, minNHit, maxNHit));
306 
307  if (MABH) {
308  h_PurityVsQuality.push_back(
309  ibooker.book2D("PurityVsQuality", "Purity vs Quality (MABH)", 20, 0.01, 1.01, 20, 0.01, 1.01));
310  }
311 
312  if (associators[ww] == "trackAssociatorByChi2") {
313  h_assochi2.push_back(ibooker.book1D("assocChi2", "track association #chi^{2}", 1000, 0., 100.));
314  h_assochi2_prob.push_back(ibooker.book1D("assocChi2_prob", "probability of association #chi^{2}", 100, 0., 1.));
315  } else if (associators[ww] == "trackAssociatorByHits") {
316  h_assocFraction.push_back(ibooker.book1D("assocFraction", "fraction of shared hits", 22, 0., 1.1));
317  h_assocSharedHit.push_back(ibooker.book1D("assocSharedHit", "number of shared hits", 41, -0.5, 40.5));
318  }
319 
320  if (useLogPt) {
321  BinLogX(h_simulpT.back()->getTH1F());
322  BinLogX(h_assocpT.back()->getTH1F());
323  BinLogX(h_recopT.back()->getTH1F());
324  BinLogX(h_assoc2pT.back()->getTH1F());
325  BinLogX(h_misidpT.back()->getTH1F());
326 
327  BinLogX(phires_vs_pt.back()->getTH2F());
328  BinLogX(thetaCotres_vs_pt.back()->getTH2F());
329  BinLogX(dxyres_vs_pt.back()->getTH2F());
330  BinLogX(dzres_vs_pt.back()->getTH2F());
331  BinLogX(ptres_vs_pt.back()->getTH2F());
332  }
333 
334  } //for (unsigned int www=0;www<label.size();www++)
335  } //for (unsigned int ww=0;ww<associators.size();ww++)
336 }
337 
339  using namespace reco;
340 
341  edm::LogInfo("MuonTrackValidator") << "\n===================================================="
342  << "\n"
343  << "Analyzing new event"
344  << "\n"
345  << "====================================================\n"
346  << "\n";
347 
349  int PU_NumInteractions(-1);
350 
351  edm::ESHandle<ParametersDefinerForTP> Lhc_parametersDefinerTP;
352  std::unique_ptr<ParametersDefinerForTP> Cosmic_parametersDefinerTP;
353 
354  if (parametersDefiner == "LhcParametersDefinerForTP") {
355  setup.get<TrackAssociatorRecord>().get(parametersDefiner, Lhc_parametersDefinerTP);
356 
357  // PileupSummaryInfo is contained only in collision events
358  event.getByToken(pileupinfo_Token, puinfoH);
359  for (std::vector<PileupSummaryInfo>::const_iterator puInfoIt = puinfoH->begin(); puInfoIt != puinfoH->end();
360  ++puInfoIt) {
361  if (puInfoIt->getBunchCrossing() == 0) {
362  PU_NumInteractions = puInfoIt->getPU_NumInteractions();
363  break;
364  }
365  }
366 
367  } else if (parametersDefiner == "CosmicParametersDefinerForTP") {
368  edm::ESHandle<CosmicParametersDefinerForTP> _Cosmic_parametersDefinerTP;
369  setup.get<TrackAssociatorRecord>().get(parametersDefiner, _Cosmic_parametersDefinerTP);
370 
371  //Since we modify the object, we must clone it
372  Cosmic_parametersDefinerTP = _Cosmic_parametersDefinerTP->clone();
373 
375  //warning: make sure the TP collection used in the map is the same used here
376  event.getByToken(_simHitTpMapTag, simHitsTPAssoc);
377  Cosmic_parametersDefinerTP->initEvent(simHitsTPAssoc);
378  cosmictpSelector.initEvent(simHitsTPAssoc);
379  } else {
380  edm::LogError("MuonTrackValidator") << "Unexpected label: parametersDefiner = " << parametersDefiner.c_str()
381  << "\n";
382  }
383 
385  event.getByToken(tp_effic_Token, TPCollectionHeff);
386  TrackingParticleCollection const& tPCeff = *(TPCollectionHeff.product());
387 
388  edm::Handle<TrackingParticleCollection> TPCollectionHfake;
389  event.getByToken(tp_fake_Token, TPCollectionHfake);
390 
391  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
392  event.getByToken(bsSrc_Token, recoBeamSpotHandle);
393  reco::BeamSpot bs = *recoBeamSpotHandle;
394 
395  std::vector<const reco::TrackToTrackingParticleAssociator*> associator;
396  if (UseAssociators) {
398  for (auto const& associatorName : associators) {
399  event.getByLabel(associatorName, theAssociator);
400  associator.push_back(theAssociator.product());
401  }
402  }
403 
404  int w = 0;
405  for (unsigned int ww = 0; ww < associators.size(); ww++) {
406  for (unsigned int www = 0; www < label.size(); www++) {
407  //
408  //get collections from the event
409  //
411  unsigned int trackCollectionSize = 0;
412 
413  reco::RecoToSimCollection recSimColl;
414  reco::SimToRecoCollection simRecColl;
415 
416  // account for missing track collections (HLT case)
417  if (!event.getByToken(track_Collection_Token[www], trackCollection) && ignoremissingtkcollection_) {
418  recSimColl.post_insert();
419  simRecColl.post_insert();
420  }
421 
422  //associate tracks to TrackingParticles
423  else {
424  trackCollectionSize = trackCollection->size();
425 
426  if (UseAssociators) {
427  edm::LogVerbatim("MuonTrackValidator")
428  << "Analyzing " << label[www].process() << ":" << label[www].label() << ":" << label[www].instance()
429  << " with " << associators[ww].c_str() << "\n";
430 
431  LogTrace("MuonTrackValidator") << "Calling associateRecoToSim method"
432  << "\n";
433  recSimColl = associator[ww]->associateRecoToSim(trackCollection, TPCollectionHfake);
434  LogTrace("MuonTrackValidator") << "Calling associateSimToReco method"
435  << "\n";
436  simRecColl = associator[ww]->associateSimToReco(trackCollection, TPCollectionHeff);
437  } else {
438  edm::LogVerbatim("MuonTrackValidator")
439  << "Analyzing " << label[www].process() << ":" << label[www].label() << ":" << label[www].instance()
440  << " with " << associatormap.process() << ":" << associatormap.label() << ":" << associatormap.instance()
441  << "\n";
442 
443  Handle<reco::SimToRecoCollection> simtorecoCollectionH;
444  event.getByToken(simToRecoCollection_Token, simtorecoCollectionH);
445  simRecColl = *simtorecoCollectionH.product();
446 
447  Handle<reco::RecoToSimCollection> recotosimCollectionH;
448  event.getByToken(recoToSimCollection_Token, recotosimCollectionH);
449  recSimColl = *recotosimCollectionH.product();
450  }
451  }
452 
453  //
454  //fill simulation histograms
455  //
456  edm::LogVerbatim("MuonTrackValidator") << "\n# of TrackingParticles: " << tPCeff.size() << "\n";
457  int ats = 0;
458  int st = 0;
459  for (TrackingParticleCollection::size_type i = 0; i < tPCeff.size(); i++) {
460  bool TP_is_matched = false;
461  bool isChargeOK = true;
462  double quality = 0.;
463 
464  TrackingParticleRef tpr(TPCollectionHeff, i);
465  TrackingParticle* tp = const_cast<TrackingParticle*>(tpr.get());
466 
467  TrackingParticle::Vector momentumTP;
468  TrackingParticle::Point vertexTP;
469  double dxySim = 0;
470  double dzSim = 0;
471 
472  //If the TrackingParticle is collision-like, get the momentum and vertex at production state
473  //and the impact parameters w.r.t. PCA
474  if (parametersDefiner == "LhcParametersDefinerForTP") {
475  LogTrace("MuonTrackValidator") << "TrackingParticle " << i;
476  if (!tpSelector(*tp))
477  continue;
478  momentumTP = tp->momentum();
479  vertexTP = tp->vertex();
480  TrackingParticle::Vector momentum = Lhc_parametersDefinerTP->momentum(event, setup, tpr);
481  TrackingParticle::Point vertex = Lhc_parametersDefinerTP->vertex(event, setup, tpr);
482  dxySim = TrackingParticleIP::dxy(vertex, momentum, bs.position());
483  dzSim = TrackingParticleIP::dz(vertex, momentum, bs.position());
484  }
485  //for cosmics get the momentum and vertex at PCA
486  else if (parametersDefiner == "CosmicParametersDefinerForTP") {
487  edm::LogVerbatim("MuonTrackValidator") << "TrackingParticle " << i;
488  if (!cosmictpSelector(tpr, &bs, event, setup))
489  continue;
490  momentumTP = Cosmic_parametersDefinerTP->momentum(event, setup, tpr);
491  vertexTP = Cosmic_parametersDefinerTP->vertex(event, setup, tpr);
492  dxySim = TrackingParticleIP::dxy(vertexTP, momentumTP, bs.position());
493  dzSim = TrackingParticleIP::dz(vertexTP, momentumTP, bs.position());
494  }
495  edm::LogVerbatim("MuonTrackValidator") << "--------------------Selected TrackingParticle #" << tpr.key();
496  edm::LogVerbatim("MuonTrackValidator")
497  << "momentumTP: pt = " << sqrt(momentumTP.perp2()) << ", pz = " << momentumTP.z()
498  << ", \t vertexTP: radius = " << sqrt(vertexTP.perp2()) << ", z = " << vertexTP.z() << "\n";
499  st++;
500 
501  double TPeta = momentumTP.eta();
502  double xTPeta = getEta(TPeta); // may be |eta| in histos according to useFabsEta
503  double TPpt = sqrt(momentumTP.perp2());
504  double xTPpt = getPt(TPpt); // may be 1/pt in histos according to useInvPt
505  double TPphi = momentumTP.phi();
506  double TPrpos = sqrt(vertexTP.perp2());
507  double TPzpos = vertexTP.z();
508 
509  // Number of counted SimHits depend on the selection of tracker and muon detectors (via cfg parameters)
510  int nSimHits = 0;
511  if (usetracker && usemuon) {
512  nSimHits = tpr.get()->numberOfHits();
513  } else if (!usetracker && usemuon) {
514  nSimHits = tpr.get()->numberOfHits() - tpr.get()->numberOfTrackerHits();
515  } else if (usetracker && !usemuon) {
516  nSimHits = tpr.get()->numberOfTrackerHits();
517  }
518  edm::LogVerbatim("MuonTrackValidator") << "\t N simhits = " << nSimHits << "\n";
519 
520  int assoc_recoTrack_NValidHits = 0;
521  if (simRecColl.find(tpr) != simRecColl.end()) {
522  auto const& rt = simRecColl[tpr];
523  if (!rt.empty()) {
524  RefToBase<Track> assoc_recoTrack = rt.begin()->first;
525  edm::LogVerbatim("MuonTrackValidator")
526  << "-----------------------------associated Track #" << assoc_recoTrack.key();
527  TP_is_matched = true;
528  ats++;
529  if (assoc_recoTrack->charge() != tpr->charge())
530  isChargeOK = false;
531  quality = rt.begin()->second;
532  assoc_recoTrack_NValidHits = assoc_recoTrack->numberOfValidHits();
533  edm::LogVerbatim("MuonTrackValidator")
534  << "TrackingParticle #" << tpr.key() << " with pt=" << sqrt(momentumTP.perp2())
535  << " associated with quality:" << quality << "\n";
536  }
537  } else {
538  edm::LogVerbatim("MuonTrackValidator")
539  << "TrackingParticle #" << tpr.key() << " with pt,eta,phi: " << sqrt(momentumTP.perp2()) << " , "
540  << momentumTP.eta() << " , " << momentumTP.phi() << " , "
541  << " NOT associated to any reco::Track"
542  << "\n";
543  }
544 
545  // histos for efficiency vs eta
546 
547  fillPlotNoFlow(h_simuleta[w], xTPeta);
548  if (TP_is_matched) {
549  fillPlotNoFlow(h_assoceta[w], xTPeta);
550  if (!isChargeOK)
551  fillPlotNoFlow(h_misideta[w], xTPeta);
552  }
553 
554  // histos for efficiency vs phi
555  fillPlotNoFlow(h_simulphi[w], TPphi);
556  if (TP_is_matched) {
557  fillPlotNoFlow(h_assocphi[w], TPphi);
558  if (!isChargeOK)
559  fillPlotNoFlow(h_misidphi[w], TPphi);
560  }
561 
562  // histos for efficiency vs pT
563  fillPlotNoFlow(h_simulpT[w], xTPpt);
564  if (TP_is_matched) {
565  fillPlotNoFlow(h_assocpT[w], xTPpt);
566  if (!isChargeOK)
567  fillPlotNoFlow(h_misidpT[w], xTPpt);
568  }
569 
570  // histos for efficiency vs dxy
571  fillPlotNoFlow(h_simuldxy[w], dxySim);
572  if (TP_is_matched) {
573  fillPlotNoFlow(h_assocdxy[w], dxySim);
574  if (!isChargeOK)
575  fillPlotNoFlow(h_misiddxy[w], dxySim);
576  }
577 
578  // histos for efficiency vs dz
579  fillPlotNoFlow(h_simuldz[w], dzSim);
580  if (TP_is_matched) {
581  fillPlotNoFlow(h_assocdz[w], dzSim);
582  if (!isChargeOK)
583  fillPlotNoFlow(h_misiddz[w], dzSim);
584  }
585 
586  // histos for efficiency vs Radius
587  fillPlotNoFlow(h_simulRpos[w], TPrpos);
588  if (TP_is_matched)
589  fillPlotNoFlow(h_assocRpos[w], TPrpos);
590 
591  // histos for efficiency vs z position
592  fillPlotNoFlow(h_simulZpos[w], TPzpos);
593  if (TP_is_matched)
594  fillPlotNoFlow(h_assocZpos[w], TPzpos);
595 
596  // histos for efficiency vs Number of Hits
597  fillPlotNoFlow(h_simulhit[w], nSimHits);
598  if (TP_is_matched) {
599  fillPlotNoFlow(h_assochit[w], nSimHits);
600  nRecHits_vs_nSimHits[w]->Fill(nSimHits, assoc_recoTrack_NValidHits);
601 
602  // charge misid is more useful w.r.t. nRecHits (filled after)
603  //if (!isChargeOK) fillPlotNoFlow(h_misidhit[w], nSimHits);
604  }
605 
606  // histos for efficiency vs PileUp
607  fillPlotNoFlow(h_simulpu[w], PU_NumInteractions);
608  if (TP_is_matched) {
609  fillPlotNoFlow(h_assocpu[w], PU_NumInteractions);
610  if (!isChargeOK)
611  fillPlotNoFlow(h_misidpu[w], PU_NumInteractions);
612  }
613 
614  } // End for (TrackingParticleCollection::size_type i=0; i<tPCeff.size(); i++){
615 
616  //
617  //fill reconstructed track histograms
618  //
619  edm::LogVerbatim("MuonTrackValidator")
620  << "\n# of reco::Tracks with " << label[www].process() << ":" << label[www].label() << ":"
621  << label[www].instance() << ": " << trackCollectionSize << "\n";
622 
623  int at = 0;
624  int rT = 0;
625  for (edm::View<Track>::size_type i = 0; i < trackCollectionSize; ++i) {
626  bool Track_is_matched = false;
627  bool isChargeOK = true;
628  RefToBase<Track> track(trackCollection, i);
629  rT++;
630 
631  std::vector<std::pair<TrackingParticleRef, double> > tp;
633 
634  // new logic (bidirectional)
636  edm::LogVerbatim("MuonTrackValidator") << "----------------------------------------Track #" << track.key();
637 
638  if (recSimColl.find(track) != recSimColl.end()) {
639  tp = recSimColl[track];
640  if (!tp.empty()) {
641  tpr = tp.begin()->first;
642  // RtS and StR must associate the same pair !
643  if (simRecColl.find(tpr) != simRecColl.end()) {
644  auto const& assoc_track_checkback = simRecColl[tpr].begin()->first;
645 
646  if (assoc_track_checkback.key() == track.key()) {
647  edm::LogVerbatim("MuonTrackValidator")
648  << "------------------associated TrackingParticle #" << tpr.key();
649  Track_is_matched = true;
650  at++;
651  if (track->charge() != tpr->charge())
652  isChargeOK = false;
653  double Purity = tp.begin()->second;
654  double Quality = simRecColl[tpr].begin()->second;
655  edm::LogVerbatim("MuonTrackValidator") << "reco::Track #" << track.key() << " with pt=" << track->pt()
656  << " associated with purity:" << Purity << "\n";
657  if (MABH)
658  h_PurityVsQuality[w]->Fill(Quality, Purity);
659  }
660  }
661  }
662  }
663 
664  if (!Track_is_matched)
665  edm::LogVerbatim("MuonTrackValidator") << "reco::Track #" << track.key() << " with pt=" << track->pt()
666  << " NOT associated to any TrackingParticle"
667  << "\n";
668  }
669  // old logic, valid for cosmics 2-legs reco (bugged for collision scenario)
670  else {
671  if (recSimColl.find(track) != recSimColl.end()) {
672  tp = recSimColl[track];
673  if (!tp.empty()) {
674  tpr = tp.begin()->first;
675  Track_is_matched = true;
676  at++;
677  if (track->charge() != tpr->charge())
678  isChargeOK = false;
679  edm::LogVerbatim("MuonTrackValidator") << "reco::Track #" << track.key() << " with pt=" << track->pt()
680  << " associated with quality:" << tp.begin()->second << "\n";
681  }
682  } else {
683  edm::LogVerbatim("MuonTrackValidator") << "reco::Track #" << track.key() << " with pt=" << track->pt()
684  << " NOT associated to any TrackingParticle"
685  << "\n";
686  }
687  }
688 
689  //
690  int nRecHits = track->numberOfValidHits();
691  edm::LogVerbatim("MuonTrackValidator") << "\t N valid rechits = " << nRecHits << "\n";
692 
693  double etaRec = track->eta();
694  double xetaRec = getEta(etaRec);
695 
696  double ptRec = track->pt();
697  double xptRec = getPt(ptRec);
698 
699  double qoverpRec = track->qoverp();
700  double phiRec = track->phi();
701  double thetaRec = track->theta();
702  double dxyRec = track->dxy(bs.position());
703  double dzRec = track->dz(bs.position());
704 
705  double qoverpError = track->qoverpError();
706  double ptError = track->ptError();
707  double thetaError = track->thetaError();
708  double phiError = track->phiError();
709  double dxyError = track->dxyError();
710  double dzError = track->dzError();
711 
712  // histos for fake rate vs eta
713  fillPlotNoFlow(h_recoeta[w], xetaRec);
714  if (Track_is_matched) {
715  fillPlotNoFlow(h_assoc2eta[w], xetaRec);
716  }
717 
718  // histos for fake rate vs phi
719  fillPlotNoFlow(h_recophi[w], phiRec);
720  if (Track_is_matched) {
721  fillPlotNoFlow(h_assoc2phi[w], phiRec);
722  }
723 
724  // histos for fake rate vs pT
725  fillPlotNoFlow(h_recopT[w], xptRec);
726  if (Track_is_matched) {
727  fillPlotNoFlow(h_assoc2pT[w], xptRec);
728  }
729 
730  // histos for fake rate vs dxy
731  fillPlotNoFlow(h_recodxy[w], dxyRec);
732  if (Track_is_matched) {
733  fillPlotNoFlow(h_assoc2dxy[w], dxyRec);
734  }
735 
736  // histos for fake rate vs dz
737  fillPlotNoFlow(h_recodz[w], dzRec);
738  if (Track_is_matched) {
739  fillPlotNoFlow(h_assoc2dz[w], dzRec);
740  }
741 
742  // histos for fake rate vs Number of RecHits in track
743  fillPlotNoFlow(h_recohit[w], nRecHits);
744  if (Track_is_matched) {
745  fillPlotNoFlow(h_assoc2hit[w], nRecHits);
746  // charge misid w.r.t. nRecHits
747  if (!isChargeOK)
748  fillPlotNoFlow(h_misidhit[w], nRecHits);
749  }
750 
751  // histos for fake rate vs Number of PU interactions
752  fillPlotNoFlow(h_recopu[w], PU_NumInteractions);
753  if (Track_is_matched) {
754  fillPlotNoFlow(h_assoc2pu[w], PU_NumInteractions);
755  }
756 
757  // Fill other histos
758  TrackingParticle* tpp = const_cast<TrackingParticle*>(tpr.get());
759  // TrackingParticle parameters at point of closest approach to the beamline
760  TrackingParticle::Vector momentumTP;
761  TrackingParticle::Point vertexTP;
762 
763  if (parametersDefiner == "LhcParametersDefinerForTP") {
764  // following reco plots are made only from tracks associated to selected signal TPs
765  if (!(Track_is_matched && tpSelector(*tpp)))
766  continue;
767  else {
768  momentumTP = Lhc_parametersDefinerTP->momentum(event, setup, tpr);
769  vertexTP = Lhc_parametersDefinerTP->vertex(event, setup, tpr);
770  }
771  } else if (parametersDefiner == "CosmicParametersDefinerForTP") {
772  // following reco plots are made only from tracks associated to selected signal TPs
773  if (!(Track_is_matched && cosmictpSelector(tpr, &bs, event, setup)))
774  continue;
775  else {
776  momentumTP = Cosmic_parametersDefinerTP->momentum(event, setup, tpr);
777  vertexTP = Cosmic_parametersDefinerTP->vertex(event, setup, tpr);
778  }
779  }
780 
781  if (associators[ww] == "trackAssociatorByChi2") {
782  //association chi2
783  double assocChi2 = -tp.begin()->second; //in association map is stored -chi2
784  h_assochi2[www]->Fill(assocChi2);
785  h_assochi2_prob[www]->Fill(TMath::Prob((assocChi2)*5, 5));
786  } else if (associators[ww] == "trackAssociatorByHits") {
787  double fraction = tp.begin()->second;
788  h_assocFraction[www]->Fill(fraction);
789  h_assocSharedHit[www]->Fill(fraction * nRecHits);
790  }
791 
792  h_charge[w]->Fill(track->charge());
793 
794  // Hits
795  h_nhits[w]->Fill(nRecHits);
796  nhits_vs_eta[w]->Fill(xetaRec, nRecHits);
797  nhits_vs_phi[w]->Fill(phiRec, nRecHits);
798 
799  if (do_MUOhitsPlots) {
800  nDThits_vs_eta[w]->Fill(xetaRec, track->hitPattern().numberOfValidMuonDTHits());
801  nCSChits_vs_eta[w]->Fill(xetaRec, track->hitPattern().numberOfValidMuonCSCHits());
802  nRPChits_vs_eta[w]->Fill(xetaRec, track->hitPattern().numberOfValidMuonRPCHits());
803  if (useGEMs_)
804  nGEMhits_vs_eta[w]->Fill(xetaRec, track->hitPattern().numberOfValidMuonGEMHits());
805  if (useME0_)
806  nME0hits_vs_eta[w]->Fill(xetaRec, track->hitPattern().numberOfValidMuonME0Hits());
807  }
808 
809  if (do_TRKhitsPlots) {
810  nTRK_LayersWithMeas_vs_eta[w]->Fill(xetaRec, track->hitPattern().trackerLayersWithMeasurement());
811  nPixel_LayersWithMeas_vs_eta[w]->Fill(xetaRec, track->hitPattern().pixelLayersWithMeasurement());
812  h_nlosthits[w]->Fill(track->numberOfLostHits());
813  h_nmisslayers_inner[w]->Fill(track->hitPattern().numberOfLostHits(reco::HitPattern::MISSING_INNER_HITS));
814  h_nmisslayers_outer[w]->Fill(track->hitPattern().numberOfLostHits(reco::HitPattern::MISSING_OUTER_HITS));
815  nlosthits_vs_eta[w]->Fill(xetaRec, track->numberOfLostHits());
816  }
817 
818  // normalized chi2
819  h_nchi2[w]->Fill(track->normalizedChi2());
820  h_nchi2_prob[w]->Fill(TMath::Prob(track->chi2(), (int)track->ndof()));
821  chi2_vs_nhits[w]->Fill(nRecHits, track->normalizedChi2());
822  chi2_vs_eta[w]->Fill(xetaRec, track->normalizedChi2());
823  chi2_vs_phi[w]->Fill(phiRec, track->normalizedChi2());
824 
825  double ptSim = sqrt(momentumTP.perp2());
826  double xptSim = getPt(ptSim);
827  double qoverpSim = tpr->charge() / sqrt(momentumTP.x() * momentumTP.x() + momentumTP.y() * momentumTP.y() +
828  momentumTP.z() * momentumTP.z());
829  double etaSim = momentumTP.eta();
830  double thetaSim = momentumTP.theta();
831  double phiSim = momentumTP.phi();
832  double dxySim = TrackingParticleIP::dxy(vertexTP, momentumTP, bs.position());
833  double dzSim = TrackingParticleIP::dz(vertexTP, momentumTP, bs.position());
834 
835  double etares = etaRec - etaSim;
836  double ptRelRes = (ptRec - ptSim) / ptSim; // relative residual -> resolution
837  double ptPull = (ptRec - ptSim) / ptError;
838  double qoverpPull = (qoverpRec - qoverpSim) / qoverpError;
839  double thetaPull = (thetaRec - thetaSim) / thetaError;
840  double phiDiff = phiRec - phiSim;
841  if (abs(phiDiff) > M_PI) {
842  if (phiDiff > 0.)
843  phiDiff = phiDiff - 2. * M_PI;
844  else
845  phiDiff = phiDiff + 2. * M_PI;
846  }
847  double phiPull = phiDiff / phiError;
848  double dxyPull = (dxyRec - dxySim) / dxyError;
849  double dzPull = (dzRec - dzSim) / dzError;
850 
851  h_etaRes[w]->Fill(etares);
852  etares_vs_eta[w]->Fill(xetaRec, etares);
853 
854  ptres_vs_eta[w]->Fill(xetaRec, ptRelRes);
855  ptres_vs_pt[w]->Fill(xptSim, ptRelRes);
856  ptres_vs_phi[w]->Fill(phiRec, ptRelRes);
857  h_ptpull[w]->Fill(ptPull);
858  ptpull_vs_eta[w]->Fill(xetaRec, ptPull);
859  ptpull_vs_phi[w]->Fill(phiRec, ptPull);
860  h_qoverppull[w]->Fill(qoverpPull);
861 
862  thetaCotres_vs_eta[w]->Fill(xetaRec, cos(thetaRec) / sin(thetaRec) - cos(thetaSim) / sin(thetaSim));
863  thetaCotres_vs_pt[w]->Fill(xptSim, cos(thetaRec) / sin(thetaRec) - cos(thetaSim) / sin(thetaSim));
864  h_thetapull[w]->Fill(thetaPull);
865  thetapull_vs_eta[w]->Fill(xetaRec, thetaPull);
866  thetapull_vs_phi[w]->Fill(phiRec, thetaPull);
867 
868  phires_vs_eta[w]->Fill(xetaRec, phiDiff);
869  phires_vs_pt[w]->Fill(xptSim, phiDiff);
870  phires_vs_phi[w]->Fill(phiRec, phiDiff);
871  h_phipull[w]->Fill(phiPull);
872  phipull_vs_eta[w]->Fill(xetaRec, phiPull);
873  phipull_vs_phi[w]->Fill(phiRec, phiPull);
874 
875  dxyres_vs_eta[w]->Fill(xetaRec, dxyRec - dxySim);
876  dxyres_vs_pt[w]->Fill(xptSim, dxyRec - dxySim);
877  h_dxypull[w]->Fill(dxyPull);
878  dxypull_vs_eta[w]->Fill(xetaRec, dxyPull);
879 
880  dzres_vs_eta[w]->Fill(xetaRec, dzRec - dzSim);
881  dzres_vs_pt[w]->Fill(xptSim, dzRec - dzSim);
882  h_dzpull[w]->Fill(dzPull);
883  dzpull_vs_eta[w]->Fill(xetaRec, dzPull);
884 
885  double contrib_Qoverp = qoverpPull * qoverpPull / 5;
886  double contrib_dxy = dxyPull * dxyPull / 5;
887  double contrib_dz = dzPull * dzPull / 5;
888  double contrib_theta = thetaPull * thetaPull / 5;
889  double contrib_phi = phiPull * phiPull / 5;
890  double assoChi2 = contrib_Qoverp + contrib_dxy + contrib_dz + contrib_theta + contrib_phi;
891 
892  edm::LogVerbatim("MuonTrackValidator") << "normalized Chi2 (track 5-dofs matching) = " << assoChi2 << "\n"
893  << "\t contrib_Qoverp = " << contrib_Qoverp << "\n"
894  << "\t contrib_theta = " << contrib_theta << "\n"
895  << "\t contrib_phi = " << contrib_phi << "\n"
896  << "\t contrib_dxy = " << contrib_dxy << "\n"
897  << "\t contrib_dz = " << contrib_dz << "\n";
898 
899  edm::LogVerbatim("MuonTrackValidator") << "ptRec = " << ptRec << "\n"
900  << "etaRec = " << etaRec << "\n"
901  << "qoverpRec = " << qoverpRec << "\n"
902  << "thetaRec = " << thetaRec << "\n"
903  << "phiRec = " << phiRec << "\n"
904  << "dxyRec = " << dxyRec << "\n"
905  << "dzRec = " << dzRec << "\n"
906  << ""
907  << "\n"
908  << "qoverpError = " << qoverpError << "\n"
909  << "thetaError = " << thetaError << "\n"
910  << "phiError = " << phiError << "\n"
911  << "dxyError = " << dxyError << "\n"
912  << "dzError = " << dzError << "\n"
913  << ""
914  << "\n"
915  << "ptSim = " << ptSim << "\n"
916  << "etaSim = " << etaSim << "\n"
917  << "qoverpSim = " << qoverpSim << "\n"
918  << "thetaSim = " << thetaSim << "\n"
919  << "phiSim = " << phiSim << "\n"
920  << "dxySim = " << dxySim << "\n"
921  << "dzSim = " << dzSim << "\n";
922  } // End of for(edm::View<Track>::size_type i=0; i<trackCollectionSize; ++i) {
923 
924  h_tracks[w]->Fill(at);
925  h_fakes[w]->Fill(rT - at);
926  edm::LogVerbatim("MuonTrackValidator") << "Total Simulated: " << st << "\n"
927  << "Total Associated (simToReco): " << ats << "\n"
928  << "Total Reconstructed: " << rT << "\n"
929  << "Total Associated (recoToSim): " << at << "\n"
930  << "Total Fakes: " << rT - at << "\n";
931  w++;
932  } // End of for (unsigned int www=0;www<label.size();www++){
933  } //END of for (unsigned int ww=0;ww<associators.size();ww++){
934 }
double qoverp() const
q / p
Definition: TrackBase.h:578
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX)
Definition: DQMStore.cc:239
unsigned int size_type
Definition: View.h:90
const double w
Definition: UKUtility.cc:23
std::vector< TrackingParticle > TrackingParticleCollection
Vector momentum() const
spatial momentum vector
const_iterator end() const
last iterator over the map (read only)
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
Definition: TrackBase.h:572
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
constexpr float minEta
Definition: Common.h:9
double theta() const
polar angle
Definition: TrackBase.h:581
double dxyError() const
error on dxy
Definition: TrackBase.h:716
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:418
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
const_iterator find(const key_type &k) const
find element with specified reference key
def replace(string, replacements)
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:614
unsigned short numberOfLostHits() const
number of cases where track crossed a layer without getting a hit.
Definition: TrackBase.h:743
double maxEta
key_type key() const
Accessor for product key.
Definition: Ref.h:250
int pixelLayersWithMeasurement() const
Definition: HitPattern.cc:492
uint16_t size_type
int trackerLayersWithMeasurement() const
Definition: HitPattern.cc:513
int numberOfValidMuonCSCHits() const
Definition: HitPattern.h:837
int numberOfValidMuonRPCHits() const
Definition: HitPattern.h:841
math::XYZPointD Point
point in the space
char const * label
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:617
double chi2() const
chi-squared of the fit
Definition: TrackBase.h:566
auto dz(const T_Vertex &vertex, const T_Momentum &momentum, const T_Point &point)
size_t key() const
Definition: RefToBase.h:219
void post_insert()
post insert action
double ndof() const
number of degrees of freedom of the fit
Definition: TrackBase.h:569
T sqrt(T t)
Definition: SSEVec.h:19
double pt() const
track transverse momentum
Definition: TrackBase.h:602
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
double ptError() const
error on Pt (set to 1000 TeV if charge==0 for safety)
Definition: TrackBase.h:696
double phiError() const
error on phi
Definition: TrackBase.h:713
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
virtual TrackingParticle::Vector momentum(const edm::Event &iEvent, const edm::EventSetup &iSetup, const Charge ch, const Point &vtx, const LorentzVector &lv) const
unsigned short numberOfValidHits() const
number of valid hits found
Definition: TrackBase.h:740
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:232
#define LogTrace(id)
#define M_PI
double qoverpError() const
error on signed transverse curvature
Definition: TrackBase.h:693
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
Definition: TrackBase.h:596
double dzError() const
error on dz
Definition: TrackBase.h:725
T const * product() const
Definition: Handle.h:69
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
Definition: TrackBase.h:483
int numberOfLostHits(HitCategory category) const
Definition: HitPattern.h:861
std::string const & label() const
Definition: InputTag.h:36
Point vertex() const
Parent vertex position.
std::string const & process() const
Definition: InputTag.h:40
void bookHistograms(DQMEDAnalyzer::DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
Method called at the end of the event loop.
std::unique_ptr< ParametersDefinerForTP > clone() const override
int numberOfValidMuonGEMHits() const
Definition: HitPattern.h:845
fixed size matrix
HLT enums.
auto dxy(const T_Vertex &vertex, const T_Momentum &momentum, const T_Point &point)
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Definition: DQMStore.cc:266
int numberOfValidMuonME0Hits() const
Definition: HitPattern.h:849
T get() const
Definition: EventSetup.h:73
int numberOfValidMuonDTHits() const
Definition: HitPattern.h:833
void analyze(const edm::Event &, const edm::EventSetup &) override
Method called before the event loop.
Monte Carlo truth information used for tracking validation.
int charge() const
track electric charge
Definition: TrackBase.h:575
const Point & position() const
position
Definition: BeamSpot.h:59
const_iterator begin() const
first iterator over the map (read only)
math::XYZVectorD Vector
point in the space
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
Definition: TrackBase.h:587
std::string const & instance() const
Definition: InputTag.h:37
Definition: event.py:1
Definition: Run.h:45
double thetaError() const
error on theta
Definition: TrackBase.h:704
virtual TrackingParticle::Point vertex(const edm::Event &iEvent, const edm::EventSetup &iSetup, const Charge ch, const Point &vtx, const LorentzVector &lv) const