CMS 3D CMS Logo

TrackBuildingAnalyzer.cc
Go to the documentation of this file.
12 
15 
20 #include <string>
21 #include "TMath.h"
22 
24  : doAllPlots(iConfig.getParameter<bool>("doAllPlots")),
25  doAllSeedPlots(iConfig.getParameter<bool>("doSeedParameterHistos")),
26  doTCPlots(iConfig.getParameter<bool>("doTrackCandHistos")),
27  doAllTCPlots(iConfig.getParameter<bool>("doAllTrackCandHistos")),
28  doPT(iConfig.getParameter<bool>("doSeedPTHisto")),
29  doETA(iConfig.getParameter<bool>("doSeedETAHisto")),
30  doPHI(iConfig.getParameter<bool>("doSeedPHIHisto")),
31  doPHIVsETA(iConfig.getParameter<bool>("doSeedPHIVsETAHisto")),
32  doTheta(iConfig.getParameter<bool>("doSeedThetaHisto")),
33  doQ(iConfig.getParameter<bool>("doSeedQHisto")),
34  doDxy(iConfig.getParameter<bool>("doSeedDxyHisto")),
35  doDz(iConfig.getParameter<bool>("doSeedDzHisto")),
36  doNRecHits(iConfig.getParameter<bool>("doSeedNRecHitsHisto")),
37  doProfPHI(iConfig.getParameter<bool>("doSeedNVsPhiProf")),
38  doProfETA(iConfig.getParameter<bool>("doSeedNVsEtaProf")),
39  doStopSource(iConfig.getParameter<bool>("doStopSource")),
40  doMVAPlots(iConfig.getParameter<bool>("doMVAPlots")),
41  doRegionPlots(iConfig.getParameter<bool>("doRegionPlots")),
42  doRegionCandidatePlots(iConfig.getParameter<bool>("doRegionCandidatePlots")) {}
43 
45  // parameters from the configuration
46  std::string AlgoName = iConfig.getParameter<std::string>("AlgoName");
47  std::string MEFolderName = iConfig.getParameter<std::string>("FolderName");
48 
49  // std::cout << "[TrackBuildingAnalyzer::beginRun] AlgoName: " << AlgoName << std::endl;
50 
51  // use the AlgoName and Quality Name
52  const std::string& CatagoryName = AlgoName;
53 
54  // get binning from the configuration
55  int TrackPtBin = iConfig.getParameter<int>("TrackPtBin");
56  double TrackPtMin = iConfig.getParameter<double>("TrackPtMin");
57  double TrackPtMax = iConfig.getParameter<double>("TrackPtMax");
58 
59  int PhiBin = iConfig.getParameter<int>("PhiBin");
60  double PhiMin = iConfig.getParameter<double>("PhiMin");
61  double PhiMax = iConfig.getParameter<double>("PhiMax");
62  phiBinWidth = PhiBin > 0 ? (PhiMax - PhiMin) / PhiBin : 0.;
63 
64  int EtaBin = iConfig.getParameter<int>("EtaBin");
65  double EtaMin = iConfig.getParameter<double>("EtaMin");
66  double EtaMax = iConfig.getParameter<double>("EtaMax");
67  etaBinWidth = EtaBin > 0 ? (EtaMax - EtaMin) / EtaBin : 0.;
68 
69  int ThetaBin = iConfig.getParameter<int>("ThetaBin");
70  double ThetaMin = iConfig.getParameter<double>("ThetaMin");
71  double ThetaMax = iConfig.getParameter<double>("ThetaMax");
72 
73  int TrackQBin = iConfig.getParameter<int>("TrackQBin");
74  double TrackQMin = iConfig.getParameter<double>("TrackQMin");
75  double TrackQMax = iConfig.getParameter<double>("TrackQMax");
76 
77  int SeedDxyBin = iConfig.getParameter<int>("SeedDxyBin");
78  double SeedDxyMin = iConfig.getParameter<double>("SeedDxyMin");
79  double SeedDxyMax = iConfig.getParameter<double>("SeedDxyMax");
80 
81  int SeedDzBin = iConfig.getParameter<int>("SeedDzBin");
82  double SeedDzMin = iConfig.getParameter<double>("SeedDzMin");
83  double SeedDzMax = iConfig.getParameter<double>("SeedDzMax");
84 
85  int SeedHitBin = iConfig.getParameter<int>("SeedHitBin");
86  double SeedHitMin = iConfig.getParameter<double>("SeedHitMin");
87  double SeedHitMax = iConfig.getParameter<double>("SeedHitMax");
88 
89  int TCDxyBin = iConfig.getParameter<int>("TCDxyBin");
90  double TCDxyMin = iConfig.getParameter<double>("TCDxyMin");
91  double TCDxyMax = iConfig.getParameter<double>("TCDxyMax");
92 
93  int TCDzBin = iConfig.getParameter<int>("TCDzBin");
94  double TCDzMin = iConfig.getParameter<double>("TCDzMin");
95  double TCDzMax = iConfig.getParameter<double>("TCDzMax");
96 
97  int TCHitBin = iConfig.getParameter<int>("TCHitBin");
98  double TCHitMin = iConfig.getParameter<double>("TCHitMin");
99  double TCHitMax = iConfig.getParameter<double>("TCHitMax");
100 
101  int MVABin = iConfig.getParameter<int>("MVABin");
102  double MVAMin = iConfig.getParameter<double>("MVAMin");
103  double MVAMax = iConfig.getParameter<double>("MVAMax");
104 
105  edm::InputTag seedProducer = iConfig.getParameter<edm::InputTag>("SeedProducer");
106  edm::InputTag tcProducer = iConfig.getParameter<edm::InputTag>("TCProducer");
107  std::vector<std::string> mvaProducers = iConfig.getParameter<std::vector<std::string> >("MVAProducers");
108  edm::InputTag regionProducer = iConfig.getParameter<edm::InputTag>("RegionProducer");
109 
110  // if (doAllPlots){doAllSeedPlots=true; doTCPlots=true;}
111 
112  ibooker.setCurrentFolder(MEFolderName);
113 
114  // book the Seed histograms
115  // ---------------------------------------------------------------------------------//
116  // std::cout << "[TrackBuildingAnalyzer::beginRun] MEFolderName: " << MEFolderName << std::endl;
117  ibooker.setCurrentFolder(MEFolderName + "/TrackBuilding");
118 
119  if (doAllSeedPlots || doPT) {
120  histname = "SeedPt_" + seedProducer.label() + "_";
121  SeedPt = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, TrackPtBin, TrackPtMin, TrackPtMax);
122  SeedPt->setAxisTitle("Seed p_{T} (GeV/c)", 1);
123  SeedPt->setAxisTitle("Number of Seeds", 2);
124  }
125 
126  if (doAllSeedPlots || doETA) {
127  histname = "SeedEta_" + seedProducer.label() + "_";
128  SeedEta = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, EtaBin, EtaMin, EtaMax);
129  SeedEta->setAxisTitle("Seed #eta", 1);
130  SeedEta->setAxisTitle("Number of Seeds", 2);
131  }
132 
133  if (doAllSeedPlots || doPHI) {
134  histname = "SeedPhi_" + seedProducer.label() + "_";
135  SeedPhi = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, PhiBin, PhiMin, PhiMax);
136  SeedPhi->setAxisTitle("Seed #phi", 1);
137  SeedPhi->setAxisTitle("Number of Seed", 2);
138  }
139 
140  if (doAllSeedPlots || doPHIVsETA) {
141  histname = "SeedPhiVsEta_" + seedProducer.label() + "_";
142  SeedPhiVsEta = ibooker.book2D(
143  histname + CatagoryName, histname + CatagoryName, EtaBin, EtaMin, EtaMax, PhiBin, PhiMin, PhiMax);
144  SeedPhiVsEta->setAxisTitle("Seed #eta", 1);
145  SeedPhiVsEta->setAxisTitle("Seed #phi", 2);
146  }
147 
148  if (doAllSeedPlots || doTheta) {
149  histname = "SeedTheta_" + seedProducer.label() + "_";
150  SeedTheta = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, ThetaBin, ThetaMin, ThetaMax);
151  SeedTheta->setAxisTitle("Seed #theta", 1);
152  SeedTheta->setAxisTitle("Number of Seeds", 2);
153  }
154 
155  if (doAllSeedPlots || doQ) {
156  histname = "SeedQ_" + seedProducer.label() + "_";
157  SeedQ = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, TrackQBin, TrackQMin, TrackQMax);
158  SeedQ->setAxisTitle("Seed Charge", 1);
159  SeedQ->setAxisTitle("Number of Seeds", 2);
160  }
161 
162  if (doAllSeedPlots || doDxy) {
163  histname = "SeedDxy_" + seedProducer.label() + "_";
164  SeedDxy = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, SeedDxyBin, SeedDxyMin, SeedDxyMax);
165  SeedDxy->setAxisTitle("Seed d_{xy} (cm)", 1);
166  SeedDxy->setAxisTitle("Number of Seeds", 2);
167  }
168 
169  if (doAllSeedPlots || doDz) {
170  histname = "SeedDz_" + seedProducer.label() + "_";
171  SeedDz = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, SeedDzBin, SeedDzMin, SeedDzMax);
172  SeedDz->setAxisTitle("Seed d_{z} (cm)", 1);
173  SeedDz->setAxisTitle("Number of Seeds", 2);
174  }
175 
176  if (doAllSeedPlots || doNRecHits) {
177  histname = "NumberOfRecHitsPerSeed_" + seedProducer.label() + "_";
179  ibooker.book1D(histname + CatagoryName, histname + CatagoryName, SeedHitBin, SeedHitMin, SeedHitMax);
180  NumberOfRecHitsPerSeed->setAxisTitle("Number of RecHits per Seed", 1);
181  NumberOfRecHitsPerSeed->setAxisTitle("Number of Seeds", 2);
182  }
183 
184  if (doAllSeedPlots || doProfPHI) {
185  histname = "NumberOfRecHitsPerSeedVsPhiProfile_" + seedProducer.label() + "_";
187  histname + CatagoryName,
188  PhiBin,
189  PhiMin,
190  PhiMax,
191  SeedHitBin,
192  SeedHitMin,
193  SeedHitMax,
194  "s");
196  NumberOfRecHitsPerSeedVsPhiProfile->setAxisTitle("Number of RecHits of each Seed", 2);
197  }
198 
199  if (doAllSeedPlots || doProfETA) {
200  histname = "NumberOfRecHitsPerSeedVsEtaProfile_" + seedProducer.label() + "_";
202  histname + CatagoryName,
203  EtaBin,
204  EtaMin,
205  EtaMax,
206  SeedHitBin,
207  SeedHitMin,
208  SeedHitMax,
209  "s");
211  NumberOfRecHitsPerSeedVsEtaProfile->setAxisTitle("Number of RecHits of each Seed", 2);
212  }
213 
214  if (doRegionPlots) {
215  if (doAllSeedPlots || doETA) {
216  histname = "TrackingRegionEta_" + seedProducer.label() + "_";
217  TrackingRegionEta = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, EtaBin, EtaMin, EtaMax);
218  TrackingRegionEta->setAxisTitle("TrackingRegion-covered #eta", 1);
219  TrackingRegionEta->setAxisTitle("Number of TrackingRegions", 2);
220  }
221 
222  if (doAllSeedPlots || doPHI) {
223  histname = "TrackingRegionPhi_" + seedProducer.label() + "_";
224  TrackingRegionPhi = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, PhiBin, PhiMin, PhiMax);
225  TrackingRegionPhi->setAxisTitle("TrackingRegion-covered #phi", 1);
226  TrackingRegionPhi->setAxisTitle("Number of TrackingRegions", 2);
227  }
228 
229  if (doAllSeedPlots || doPHIVsETA) {
230  histname = "TrackingRegionPhiVsEta_" + seedProducer.label() + "_";
231  TrackingRegionPhiVsEta = ibooker.book2D(
232  histname + CatagoryName, histname + CatagoryName, EtaBin, EtaMin, EtaMax, PhiBin, PhiMin, PhiMax);
233  TrackingRegionPhiVsEta->setAxisTitle("TrackingRegion-covered #eta", 1);
234  TrackingRegionPhiVsEta->setAxisTitle("TrackingRegion-covered #phi", 2);
235  }
236 
238  if (doAllSeedPlots || doPT) {
239  auto ptBin = iConfig.getParameter<int>("RegionCandidatePtBin");
240  auto ptMin = iConfig.getParameter<double>("RegionCandidatePtMin");
241  auto ptMax = iConfig.getParameter<double>("RegionCandidatePtMax");
242 
243  histname = "TrackingRegionCandidatePt_" + seedProducer.label() + "_";
245  ibooker.book1D(histname + CatagoryName, histname + CatagoryName, ptBin, ptMin, ptMax);
246  TrackingRegionCandidatePt->setAxisTitle("TrackingRegion Candidate p_{T} (GeV/c)", 1);
247  TrackingRegionCandidatePt->setAxisTitle("Number of TrackingRegion Candidates", 2);
248  }
249 
250  if (doAllSeedPlots || doETA) {
251  histname = "TrackingRegionCandidateEta_" + seedProducer.label() + "_";
253  ibooker.book1D(histname + CatagoryName, histname + CatagoryName, EtaBin, EtaMin, EtaMax);
254  TrackingRegionCandidateEta->setAxisTitle("TrackingRegion Candidate #eta", 1);
255  TrackingRegionCandidateEta->setAxisTitle("Number of TrackingRegion Candidates", 2);
256  }
257 
258  if (doAllSeedPlots || doPHI) {
259  histname = "TrackingRegionCandidatePhi_" + seedProducer.label() + "_";
261  ibooker.book1D(histname + CatagoryName, histname + CatagoryName, PhiBin, PhiMin, PhiMax);
262  TrackingRegionCandidatePhi->setAxisTitle("TrackingRegion Candidate #phi", 1);
263  TrackingRegionCandidatePhi->setAxisTitle("Number of TrackingRegion Candidates", 2);
264  }
265 
266  if (doAllSeedPlots || doPHIVsETA) {
267  histname = "TrackingRegionCandidatePhiVsEta_" + seedProducer.label() + "_";
269  histname + CatagoryName, histname + CatagoryName, EtaBin, EtaMin, EtaMax, PhiBin, PhiMin, PhiMax);
270  TrackingRegionCandidatePhiVsEta->setAxisTitle("TrackingRegion Candidate #eta", 1);
271  TrackingRegionCandidatePhiVsEta->setAxisTitle("TrackingRegion Candidate #phi", 2);
272  }
273  }
274  }
275 
276  if (doAllSeedPlots || doStopSource) {
277  const auto stopReasonSize = static_cast<unsigned int>(SeedStopReason::SIZE);
278 
279  const auto candsBin = iConfig.getParameter<int>("SeedCandBin");
280  const auto candsMin = iConfig.getParameter<double>("SeedCandMin");
281  const auto candsMax = iConfig.getParameter<double>("SeedCandMax");
282 
283  histname = "SeedStoppingSource_" + seedProducer.label() + "_";
285  ibooker.book1D(histname + CatagoryName, histname + CatagoryName, stopReasonSize, 0., stopReasonSize);
286  seedStoppingSource->setAxisTitle("Stopping reason", 1);
287  seedStoppingSource->setAxisTitle("Number of seeds", 2);
288 
289  histname = "SeedStoppingSourceVsPhi_" + seedProducer.label() + "_";
291  ibooker.bookProfile(histname + CatagoryName, histname + CatagoryName, PhiBin, PhiMin, PhiMax, 2, 0., 2.);
292  seedStoppingSourceVsPhi->setAxisTitle("seed #phi", 1);
293  seedStoppingSourceVsPhi->setAxisTitle("fraction stopped", 2);
294 
295  histname = "SeedStoppingSourceVsEta_" + seedProducer.label() + "_";
297  ibooker.bookProfile(histname + CatagoryName, histname + CatagoryName, EtaBin, EtaMin, EtaMax, 2, 0., 2.);
298  seedStoppingSourceVsEta->setAxisTitle("seed #eta", 1);
299  seedStoppingSourceVsEta->setAxisTitle("fraction stopped", 2);
300 
301  histname = "NumberOfTrajCandsPerSeed_" + seedProducer.label() + "_";
303  ibooker.book1D(histname + CatagoryName, histname + CatagoryName, candsBin, candsMin, candsMax);
304  numberOfTrajCandsPerSeed->setAxisTitle("Number of Trajectory Candidate for each Seed", 1);
305  numberOfTrajCandsPerSeed->setAxisTitle("Number of Seeds", 2);
306 
307  histname = "NumberOfTrajCandsPerSeedVsPhi_" + seedProducer.label() + "_";
309  histname + CatagoryName, histname + CatagoryName, PhiBin, PhiMin, PhiMax, candsBin, candsMin, candsMax);
311  numberOfTrajCandsPerSeedVsPhi->setAxisTitle("Number of Trajectory Candidates for each Seed", 2);
312 
313  histname = "NumberOfTrajCandsPerSeedVsEta_" + seedProducer.label() + "_";
315  histname + CatagoryName, histname + CatagoryName, EtaBin, EtaMin, EtaMax, candsBin, candsMin, candsMax);
317  numberOfTrajCandsPerSeedVsEta->setAxisTitle("Number of Trajectory Candidates for each Seed", 2);
318 
319  histname = "SeedStoppingSourceVsNumberOfTrajCandsPerSeed_" + seedProducer.label() + "_";
321  ibooker.bookProfile(histname + CatagoryName, histname + CatagoryName, candsBin, candsMin, candsMax, 2, 0., 2.);
322  seedStoppingSourceVsNumberOfTrajCandsPerSeed->setAxisTitle("Number of Trajectory Candidates for each Seed", 1);
324 
325  for (unsigned int i = 0; i < stopReasonSize; ++i) {
327  }
328  }
329 
330  if (doAllTCPlots || doStopSource) {
331  // DataFormats/TrackReco/interface/TrajectoryStopReasons.h
332  size_t StopReasonNameSize = sizeof(StopReasonName::StopReasonName) / sizeof(std::string);
333 
334  histname = "StoppingSource_" + seedProducer.label() + "_";
335  stoppingSource = ibooker.book1D(
336  histname + CatagoryName, histname + CatagoryName, StopReasonNameSize, 0., double(StopReasonNameSize));
337  stoppingSource->setAxisTitle("stopping reason", 1);
338  stoppingSource->setAxisTitle("Number of Tracks", 2);
339 
340  histname = "StoppingSourceVSeta_" + seedProducer.label() + "_";
342  ibooker.bookProfile(histname + CatagoryName, histname + CatagoryName, EtaBin, EtaMin, EtaMax, 2, 0., 2.);
343  stoppingSourceVSeta->setAxisTitle("track #eta", 1);
344  stoppingSourceVSeta->setAxisTitle("fraction stopped", 2);
345 
346  histname = "StoppingSourceVSphi_" + seedProducer.label() + "_";
348  ibooker.bookProfile(histname + CatagoryName, histname + CatagoryName, PhiBin, PhiMin, PhiMax, 2, 0., 2.);
349  stoppingSourceVSphi->setAxisTitle("track #phi", 1);
350  stoppingSourceVSphi->setAxisTitle("fraction stopped", 2);
351 
352  for (size_t ibin = 0; ibin < StopReasonNameSize; ibin++) {
354  }
355  }
356 
357  // book the TrackCandidate histograms
358  // ---------------------------------------------------------------------------------//
359 
360  if (doTCPlots) {
361  ibooker.setCurrentFolder(MEFolderName + "/TrackBuilding");
362 
363  histname = "TrackCandPt_" + tcProducer.label() + "_";
364  TrackCandPt = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, TrackPtBin, TrackPtMin, TrackPtMax);
365  TrackCandPt->setAxisTitle("Track Candidate p_{T} (GeV/c)", 1);
366  TrackCandPt->setAxisTitle("Number of Track Candidates", 2);
367 
368  histname = "TrackCandEta_" + tcProducer.label() + "_";
369  TrackCandEta = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, EtaBin, EtaMin, EtaMax);
370  TrackCandEta->setAxisTitle("Track Candidate #eta", 1);
371  TrackCandEta->setAxisTitle("Number of Track Candidates", 2);
372 
373  histname = "TrackCandPhi_" + tcProducer.label() + "_";
374  TrackCandPhi = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, PhiBin, PhiMin, PhiMax);
375  TrackCandPhi->setAxisTitle("Track Candidate #phi", 1);
376  TrackCandPhi->setAxisTitle("Number of Track Candidates", 2);
377 
378  if (doTheta) {
379  histname = "TrackCandTheta_" + tcProducer.label() + "_";
380  TrackCandTheta = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, ThetaBin, ThetaMin, ThetaMax);
381  TrackCandTheta->setAxisTitle("Track Candidate #theta", 1);
382  TrackCandTheta->setAxisTitle("Number of Track Candidates", 2);
383  }
384 
385  if (doAllTCPlots) {
386  histname = "TrackCandQ_" + tcProducer.label() + "_";
387  TrackCandQ = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, TrackQBin, TrackQMin, TrackQMax);
388  TrackCandQ->setAxisTitle("Track Candidate Charge", 1);
389  TrackCandQ->setAxisTitle("Number of Track Candidates", 2);
390 
391  histname = "TrackCandDxy_" + tcProducer.label() + "_";
392  TrackCandDxy = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, TCDxyBin, TCDxyMin, TCDxyMax);
393  TrackCandDxy->setAxisTitle("Track Candidate d_{xy} (cm)", 1);
394  TrackCandDxy->setAxisTitle("Number of Track Candidates", 2);
395 
396  histname = "TrackCandDz_" + tcProducer.label() + "_";
397  TrackCandDz = ibooker.book1D(histname + CatagoryName, histname + CatagoryName, TCDzBin, TCDzMin, TCDzMax);
398  TrackCandDz->setAxisTitle("Track Candidate d_{z} (cm)", 1);
399  TrackCandDz->setAxisTitle("Number of Track Candidates", 2);
400 
401  histname = "NumberOfRecHitsPerTrackCand_" + tcProducer.label() + "_";
403  ibooker.book1D(histname + CatagoryName, histname + CatagoryName, TCHitBin, TCHitMin, TCHitMax);
404  NumberOfRecHitsPerTrackCand->setAxisTitle("Number of RecHits per Track Candidate", 1);
405  NumberOfRecHitsPerTrackCand->setAxisTitle("Number of Track Candidates", 2);
406 
407  histname = "NumberOfRecHitsPerTrackCandVsPhiProfile_" + tcProducer.label() + "_";
409  histname + CatagoryName, histname + CatagoryName, PhiBin, PhiMin, PhiMax, TCHitBin, TCHitMin, TCHitMax, "s");
410  NumberOfRecHitsPerTrackCandVsPhiProfile->setAxisTitle("Track Candidate #phi", 1);
411  NumberOfRecHitsPerTrackCandVsPhiProfile->setAxisTitle("Number of RecHits of each Track Candidate", 2);
412 
413  histname = "NumberOfRecHitsPerTrackCandVsEtaProfile_" + tcProducer.label() + "_";
415  histname + CatagoryName, histname + CatagoryName, EtaBin, EtaMin, EtaMax, TCHitBin, TCHitMin, TCHitMax, "s");
416  NumberOfRecHitsPerTrackCandVsEtaProfile->setAxisTitle("Track Candidate #eta", 1);
417  NumberOfRecHitsPerTrackCandVsEtaProfile->setAxisTitle("Number of RecHits of each Track Candidate", 2);
418  }
419 
420  histname = "TrackCandPhiVsEta_" + tcProducer.label() + "_";
421  TrackCandPhiVsEta = ibooker.book2D(
422  histname + CatagoryName, histname + CatagoryName, EtaBin, EtaMin, EtaMax, PhiBin, PhiMin, PhiMax);
423  TrackCandPhiVsEta->setAxisTitle("Track Candidate #eta", 1);
424  TrackCandPhiVsEta->setAxisTitle("Track Candidate #phi", 2);
425 
426  if (doAllTCPlots || doMVAPlots) {
427  for (size_t i = 1, end = mvaProducers.size(); i <= end; ++i) {
428  auto num = std::to_string(i);
429  std::string pfix;
430 
431  if (i == 1) {
432  trackMVAsHP.push_back(nullptr);
433  trackMVAsHPVsPtProfile.push_back(nullptr);
434  trackMVAsHPVsEtaProfile.push_back(nullptr);
435  } else {
436  pfix = " (not loose-selected)";
437  std::string pfix2 = " (not HP-selected)";
438  histname = "TrackMVA" + num + "HP_" + tcProducer.label() + "_";
439  trackMVAsHP.push_back(
440  ibooker.book1D(histname + CatagoryName, histname + CatagoryName + pfix2, MVABin, MVAMin, MVAMax));
441  trackMVAsHP.back()->setAxisTitle("Track selection MVA" + num, 1);
442  trackMVAsHP.back()->setAxisTitle("Number of tracks", 2);
443 
444  histname = "TrackMVA" + num + "HPVsPtProfile_" + tcProducer.label() + "_";
445  trackMVAsHPVsPtProfile.push_back(ibooker.bookProfile(histname + CatagoryName,
446  histname + CatagoryName + pfix2,
447  TrackPtBin,
448  TrackPtMin,
449  TrackPtMax,
450  MVABin,
451  MVAMin,
452  MVAMax));
453  trackMVAsHPVsPtProfile.back()->setAxisTitle("Track p_{T} (GeV/c)", 1);
454  trackMVAsHPVsPtProfile.back()->setAxisTitle("Track selection MVA" + num, 2);
455 
456  histname = "TrackMVA" + num + "HPVsEtaProfile_" + tcProducer.label() + "_";
457  trackMVAsHPVsEtaProfile.push_back(ibooker.bookProfile(
458  histname + CatagoryName, histname + CatagoryName + pfix2, EtaBin, EtaMin, EtaMax, MVABin, MVAMin, MVAMax));
459  trackMVAsHPVsEtaProfile.back()->setAxisTitle("Track #eta", 1);
460  trackMVAsHPVsEtaProfile.back()->setAxisTitle("Track selection MVA" + num, 2);
461  }
462 
463  histname = "TrackMVA" + num + "_" + tcProducer.label() + "_";
464  trackMVAs.push_back(
465  ibooker.book1D(histname + CatagoryName, histname + CatagoryName + pfix, MVABin, MVAMin, MVAMax));
466  trackMVAs.back()->setAxisTitle("Track selection MVA" + num, 1);
467  trackMVAs.back()->setAxisTitle("Number of tracks", 2);
468 
469  histname = "TrackMVA" + num + "VsPtProfile_" + tcProducer.label() + "_";
470  trackMVAsVsPtProfile.push_back(ibooker.bookProfile(histname + CatagoryName,
471  histname + CatagoryName + pfix,
472  TrackPtBin,
473  TrackPtMin,
474  TrackPtMax,
475  MVABin,
476  MVAMin,
477  MVAMax));
478  trackMVAsVsPtProfile.back()->setAxisTitle("Track p_{T} (GeV/c)", 1);
479  trackMVAsVsPtProfile.back()->setAxisTitle("Track selection MVA" + num, 2);
480 
481  histname = "TrackMVA" + num + "VsEtaProfile_" + tcProducer.label() + "_";
482  trackMVAsVsEtaProfile.push_back(ibooker.bookProfile(
483  histname + CatagoryName, histname + CatagoryName + pfix, EtaBin, EtaMin, EtaMax, MVABin, MVAMin, MVAMax));
484  trackMVAsVsEtaProfile.back()->setAxisTitle("Track #eta", 1);
485  trackMVAsVsEtaProfile.back()->setAxisTitle("Track selection MVA" + num, 2);
486  }
487  }
488  }
489 }
490 
491 // -- Analyse
492 // ---------------------------------------------------------------------------------//
494  const edm::EventSetup& iSetup,
495  const TrajectorySeed& candidate,
496  const SeedStopInfo& stopInfo,
497  const reco::BeamSpot& bs,
498  const MagneticField& theMF,
499  const TransientTrackingRecHitBuilder& theTTRHBuilder) {
500  TSCBLBuilderNoMaterial tscblBuilder;
501 
502  //get parameters and errors from the candidate state
503  auto const& theG = ((TkTransientTrackingRecHitBuilder const*)(&theTTRHBuilder))->geometry();
504  auto const& candSS = candidate.startingState();
506  trajectoryStateTransform::transientState(candSS, &(theG->idToDet(candSS.detId())->surface()), &theMF);
507  TrajectoryStateClosestToBeamLine tsAtClosestApproachSeed =
508  tscblBuilder(*state.freeState(), bs); //as in TrackProducerAlgorithm
509  if (!(tsAtClosestApproachSeed.isValid())) {
510  edm::LogVerbatim("TrackBuilding") << "TrajectoryStateClosestToBeamLine not valid";
511  return;
512  }
513  GlobalPoint v0 = tsAtClosestApproachSeed.trackStateAtPCA().position();
514  GlobalVector p = tsAtClosestApproachSeed.trackStateAtPCA().momentum();
515  GlobalPoint v(v0.x() - bs.x0(), v0.y() - bs.y0(), v0.z() - bs.z0());
516 
517  double pt = sqrt(state.globalMomentum().perp2());
518  double eta = state.globalPosition().eta();
519  double phi = state.globalPosition().phi();
520  double theta = state.globalPosition().theta();
521  //double pm = sqrt(state.globalMomentum().mag2());
522  //double pz = state.globalMomentum().z();
523  //double qoverp = tsAtClosestApproachSeed.trackStateAtPCA().charge()/p.mag();
524  //double theta = p.theta();
525  //double lambda = M_PI/2-p.theta();
526  double numberOfHits = candidate.nHits();
527  double dxy = (-v.x() * sin(p.phi()) + v.y() * cos(p.phi()));
528  double dz = v.z() - (v.x() * p.x() + v.y() * p.y()) / p.perp() * p.z() / p.perp();
529 
530  // fill the ME's
531  if (doAllSeedPlots || doQ)
532  SeedQ->Fill(state.charge());
533  if (doAllSeedPlots || doPT)
534  SeedPt->Fill(pt);
535  if (doAllSeedPlots || doETA)
536  SeedEta->Fill(eta);
537  if (doAllSeedPlots || doPHI)
538  SeedPhi->Fill(phi);
539  if (doAllSeedPlots || doPHIVsETA)
541  if (doAllSeedPlots || doTheta)
542  SeedTheta->Fill(theta);
543  if (doAllSeedPlots || doDxy)
544  SeedDxy->Fill(dxy);
545  if (doAllSeedPlots || doDz)
546  SeedDz->Fill(dz);
547  if (doAllSeedPlots || doNRecHits)
548  NumberOfRecHitsPerSeed->Fill(numberOfHits);
549  if (doAllSeedPlots || doProfETA)
551  if (doAllSeedPlots || doProfPHI)
553  if (doAllSeedPlots || doStopSource) {
554  const double stopped = stopInfo.stopReason() == SeedStopReason::NOT_STOPPED ? 0. : 1.;
555  seedStoppingSource->Fill(stopInfo.stopReasonUC());
556  seedStoppingSourceVsPhi->Fill(phi, stopped);
557  seedStoppingSourceVsEta->Fill(eta, stopped);
558 
559  const auto ncands = stopInfo.candidatesPerSeed();
563 
565  }
566 }
567 
568 // -- Analyse
569 // ---------------------------------------------------------------------------------//
571  const edm::EventSetup& iSetup,
572  const TrackCandidate& candidate,
573  const reco::BeamSpot& bs,
574  const MagneticField& theMF,
575  const TransientTrackingRecHitBuilder& theTTRHBuilder) {
576  TSCBLBuilderNoMaterial tscblBuilder;
577 
578  //get parameters and errors from the candidate state
579  auto const& theG = ((TkTransientTrackingRecHitBuilder const*)(&theTTRHBuilder))->geometry();
580  auto const& candSS = candidate.trajectoryStateOnDet();
582  trajectoryStateTransform::transientState(candSS, &(theG->idToDet(candSS.detId())->surface()), &theMF);
583  TrajectoryStateClosestToBeamLine tsAtClosestApproachTrackCand =
584  tscblBuilder(*state.freeState(), bs); //as in TrackProducerAlgorithm
585  if (!(tsAtClosestApproachTrackCand.isValid())) {
586  edm::LogVerbatim("TrackBuilding") << "TrajectoryStateClosestToBeamLine not valid";
587  return;
588  }
589  GlobalPoint v0 = tsAtClosestApproachTrackCand.trackStateAtPCA().position();
590  GlobalVector p = tsAtClosestApproachTrackCand.trackStateAtPCA().momentum();
591  GlobalPoint v(v0.x() - bs.x0(), v0.y() - bs.y0(), v0.z() - bs.z0());
592 
593  double pt = sqrt(state.globalMomentum().perp2());
594  double eta = state.globalPosition().eta();
595  double phi = state.globalPosition().phi();
596  double theta = state.globalPosition().theta();
597  //double pm = sqrt(state.globalMomentum().mag2());
598  //double pz = state.globalMomentum().z();
599  //double qoverp = tsAtClosestApproachTrackCand.trackStateAtPCA().charge()/p.mag();
600  //double theta = p.theta();
601  //double lambda = M_PI/2-p.theta();
602  double numberOfHits = candidate.nRecHits();
603  double dxy = (-v.x() * sin(p.phi()) + v.y() * cos(p.phi()));
604 
605  double dz = v.z() - (v.x() * p.x() + v.y() * p.y()) / p.perp() * p.z() / p.perp();
606 
607  if (doAllTCPlots || doStopSource) {
608  // stopping source
609  int max = stoppingSource->getNbinsX();
610  double stop = candidate.stopReason() > max ? double(max - 1) : static_cast<double>(candidate.stopReason());
611  double stopped = int(StopReason::NOT_STOPPED) == candidate.stopReason() ? 0. : 1.;
612  stoppingSource->Fill(stop);
613  stoppingSourceVSeta->Fill(eta, stopped);
614  stoppingSourceVSphi->Fill(phi, stopped);
615  }
616 
617  if (doTCPlots) {
618  // fill the ME's
619  if (doAllTCPlots)
620  TrackCandQ->Fill(state.charge());
621  TrackCandPt->Fill(pt);
625  if (doTheta)
627  if (doAllTCPlots)
629  if (doAllTCPlots)
630  TrackCandDz->Fill(dz);
631  if (doAllTCPlots)
632  NumberOfRecHitsPerTrackCand->Fill(numberOfHits);
633  if (doAllTCPlots)
635  if (doAllTCPlots)
637  }
638 }
639 
640 namespace {
641  bool trackSelected(unsigned char mask, unsigned char qual) { return mask & 1 << qual; }
642 } // namespace
644  const std::vector<const MVACollection*>& mvaCollections,
645  const std::vector<const QualityMaskCollection*>& qualityMaskCollections) {
646  if (!(doAllTCPlots || doMVAPlots))
647  return;
648  if (trackCollection.empty())
649  return;
650 
651  const auto ntracks = trackCollection.size();
652  const auto nmva = mvaCollections.size();
653  for (const auto mva : mvaCollections) {
654  if (mva->size() != ntracks) {
655  edm::LogError("LogicError") << "TrackBuildingAnalyzer: Incompatible size of MVACollection, " << mva->size()
656  << " differs from the size of the track collection " << ntracks;
657  return;
658  }
659  }
660  for (const auto qual : qualityMaskCollections) {
661  if (qual->size() != ntracks) {
662  edm::LogError("LogicError") << "TrackBuildingAnalyzer: Incompatible size of QualityMaskCollection, "
663  << qual->size() << " differs from the size of the track collection " << ntracks;
664  return;
665  }
666  }
667 
668  for (size_t iTrack = 0; iTrack < ntracks; ++iTrack) {
669  // Fill MVA1 histos with all tracks, MVA2 histos only with tracks
670  // not selected by MVA1 etc
671  bool selectedLoose = false;
672  bool selectedHP = false;
673 
674  const auto pt = trackCollection[iTrack].pt();
675  const auto eta = trackCollection[iTrack].eta();
676 
677  for (size_t iMVA = 0; iMVA < nmva; ++iMVA) {
678  const auto mva = (*(mvaCollections[iMVA]))[iTrack];
679  if (!selectedLoose) {
680  trackMVAs[iMVA]->Fill(mva);
681  trackMVAsVsPtProfile[iMVA]->Fill(pt, mva);
682  trackMVAsVsEtaProfile[iMVA]->Fill(eta, mva);
683  }
684  if (iMVA >= 1 && !selectedHP) {
685  trackMVAsHP[iMVA]->Fill(mva);
686  trackMVAsHPVsPtProfile[iMVA]->Fill(pt, mva);
687  trackMVAsHPVsEtaProfile[iMVA]->Fill(eta, mva);
688  }
689 
690  const auto qual = (*(qualityMaskCollections)[iMVA])[iTrack];
691  selectedLoose |= trackSelected(qual, reco::TrackBase::loose);
692  selectedHP |= trackSelected(qual, reco::TrackBase::highPurity);
693 
694  if (selectedLoose && selectedHP)
695  break;
696  }
697  }
698 }
699 
702  return;
703 
704  for (const auto& candidate : regionCandidates) {
705  const auto eta = candidate.eta();
706  const auto phi = candidate.phi();
707  if (doAllSeedPlots || doPT)
708  TrackingRegionCandidatePt->Fill(candidate.pt());
709  if (doAllSeedPlots || doETA)
711  if (doAllSeedPlots || doPHI)
713  if (doAllSeedPlots || doPHIVsETA)
715  }
716 }
717 
720 
721 namespace {
722  const TrackingRegion* regionPtr(const TrackingRegion& region) { return &region; }
723  const TrackingRegion* regionPtr(const TrackingRegionsSeedingLayerSets::RegionLayers& regionLayers) {
724  return &(regionLayers.region());
725  }
726 } // namespace
727 
728 template <typename T>
730  if (!doRegionPlots && etaBinWidth <= 0. && phiBinWidth <= 0.)
731  return;
732 
733  for (const auto& tmp : regions) {
734  if (const auto* etaPhiRegion = dynamic_cast<const RectangularEtaPhiTrackingRegion*>(regionPtr(tmp))) {
735  const auto& etaRange = etaPhiRegion->etaRange();
736  const auto& phiMargin = etaPhiRegion->phiMargin();
737 
738  const auto etaMin = etaRange.min();
739  const auto etaMax = etaRange.max();
740 
741  const auto phiMin = etaPhiRegion->phiDirection() - phiMargin.left();
742  const auto phiMax = etaPhiRegion->phiDirection() + phiMargin.right();
743 
744  if (doAllSeedPlots || doETA) {
745  for (auto eta = etaMin; eta < etaMax; eta += etaBinWidth) {
747  }
748  }
749  if (doAllSeedPlots || doPHI) {
750  for (auto phi = phiMin; phi < phiMax; phi += phiBinWidth) {
752  }
753  }
754  if (doAllSeedPlots || doPHIVsETA) {
755  for (auto phi = phiMin; phi < phiMax; phi += phiBinWidth) {
756  const auto reducedPhi = reco::reduceRange(phi);
757  for (auto eta = etaMin; eta < etaMax; eta += etaBinWidth) {
758  TrackingRegionPhiVsEta->Fill(eta, reducedPhi);
759  }
760  }
761  }
762  }
763  }
764 }
MonitorElement * NumberOfRecHitsPerTrackCandVsPhiProfile
Log< level::Info, true > LogVerbatim
MonitorElement * seedStoppingSourceVsPhi
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
MonitorElement * numberOfTrajCandsPerSeed
MonitorElement * TrackingRegionCandidatePhiVsEta
void analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup, const TrajectorySeed &seed, const SeedStopInfo &stopInfo, const reco::BeamSpot &bs, const MagneticField &theMF, const TransientTrackingRecHitBuilder &theTTRHBuilder)
SeedStopReason stopReason() const
Definition: SeedStopInfo.h:15
std::vector< MonitorElement * > trackMVAsVsPtProfile
constexpr T reduceRange(T x)
Definition: deltaPhi.h:18
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
constexpr float ptMin
MonitorElement * stoppingSourceVSphi
static const std::string StopReasonName[]
void initHisto(DQMStore::IBooker &ibooker, const edm::ParameterSet &)
Log< level::Error, false > LogError
auto nRecHits() const
std::vector< MonitorElement * > trackMVAs
MonitorElement * TrackCandPhiVsEta
MonitorElement * TrackingRegionCandidatePt
constexpr uint32_t mask
Definition: gpuClustering.h:26
static std::string to_string(const XMLCh *ch)
static const std::string SeedStopReasonName[]
uint8_t stopReason() const
MonitorElement * NumberOfRecHitsPerTrackCandVsEtaProfile
GlobalPoint position() const
void Fill(long long x)
MonitorElement * stoppingSource
MonitorElement * NumberOfRecHitsPerSeed
unsigned char stopReasonUC() const
Definition: SeedStopInfo.h:16
int iEvent
Definition: GenABIO.cc:224
MonitorElement * NumberOfRecHitsPerSeedVsPhiProfile
void analyzeRegions(const T &regions)
MonitorElement * bookProfile(TString const &name, TString const &title, int nchX, double lowX, double highX, int, double lowY, double highY, char const *option="s", FUNC onbooking=NOOP())
Definition: DQMStore.h:399
unsigned int nHits() const
T sqrt(T t)
Definition: SSEVec.h:19
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
PTrajectoryStateOnDet const & trajectoryStateOnDet() const
GlobalVector momentum() const
std::vector< MonitorElement * > trackMVAsHP
MonitorElement * numberOfTrajCandsPerSeedVsPhi
MonitorElement * TrackingRegionPhi
TrackBuildingAnalyzer(const edm::ParameterSet &)
std::vector< MonitorElement * > trackMVAsVsEtaProfile
MonitorElement * numberOfTrajCandsPerSeedVsEta
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)
trackCollection
Definition: JetHT_cfg.py:51
PTrajectoryStateOnDet const & startingState() const
std::vector< MonitorElement * > trackMVAsHPVsEtaProfile
MonitorElement * TrackingRegionPhiVsEta
MonitorElement * stoppingSourceVSeta
TrajectoryStateOnSurface transientState(const PTrajectoryStateOnDet &ts, const Surface *surface, const MagneticField *field)
unsigned short candidatesPerSeed() const
Definition: SeedStopInfo.h:12
MonitorElement * TrackingRegionEta
std::vector< MonitorElement * > trackMVAsHPVsPtProfile
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:212
MonitorElement * TrackCandTheta
MonitorElement * SeedPhiVsEta
MonitorElement * TrackingRegionCandidateEta
MonitorElement * seedStoppingSourceVsEta
MonitorElement * TrackingRegionCandidatePhi
virtual int getNbinsX() const
get # of bins in X-axis
MonitorElement * seedStoppingSourceVsNumberOfTrajCandsPerSeed
MonitorElement * NumberOfRecHitsPerSeedVsEtaProfile
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
tmp
align.sh
Definition: createJobs.py:716
long double T
Geom::Theta< T > theta() const
MonitorElement * NumberOfRecHitsPerTrackCand
MonitorElement * seedStoppingSource
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)