CMS 3D CMS Logo

GeneralPurposeTrackAnalyzer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Alignment/OfflineValidation
4 // Class: GeneralPurposeTrackAnalyzer
5 //
9 //
10 // Original Author: Marco Musich
11 // Created: Mon, 13 Jun 2016 15:07:11 GMT
12 //
13 //
14 
15 // ROOT includes files
16 
17 #include "TMath.h"
18 #include "TFile.h"
19 #include "TH1D.h"
20 #include "TH1I.h"
21 #include "TH2D.h"
22 #include "TProfile.h"
23 
24 // system includes files
25 
26 #include <cmath>
27 #include <fstream>
28 #include <iostream>
29 #include <map>
30 #include <string>
31 #include <vector>
32 #include <boost/range/adaptor/indexed.hpp>
33 
34 // user include files
82 
83 // toggle to enable debugging
84 #define DEBUG 0
85 
88 
89 class GeneralPurposeTrackAnalyzer : public edm::one::EDAnalyzer<edm::one::WatchRuns, edm::one::SharedResources> {
90 public:
93  magFieldToken_(esConsumes<edm::Transition::BeginRun>()),
94  geomTokenBR_(esConsumes<edm::Transition::BeginRun>()),
97  doLatencyAnalysis_ = pset.getParameter<bool>("doLatencyAnalysis");
98  if (doLatencyAnalysis_) {
99  latencyToken_ = esConsumes<edm::Transition::BeginRun>();
100  }
101 
102  coord_ = std::nullopt;
103  usesResource(TFileService::kSharedResource);
104 
105  TkTag_ = pset.getParameter<edm::InputTag>("TkTag");
106  theTrackCollectionToken_ = consumes<reco::TrackCollection>(TkTag_);
107 
108  TriggerResultsTag_ = pset.getParameter<edm::InputTag>("TriggerResultsTag");
109  hltresultsToken_ = consumes<edm::TriggerResults>(TriggerResultsTag_);
110 
111  BeamSpotTag_ = pset.getParameter<edm::InputTag>("BeamSpotTag");
112  beamspotToken_ = consumes<reco::BeamSpot>(BeamSpotTag_);
113 
114  VerticesTag_ = pset.getParameter<edm::InputTag>("VerticesTag");
115  vertexToken_ = consumes<reco::VertexCollection>(VerticesTag_);
116 
117  isCosmics_ = pset.getParameter<bool>("isCosmics");
118 
119  pmap = std::make_unique<TrackerMap>("Pixel");
120  pmap->onlyPixel(true);
121  pmap->setTitle("Pixel Hit entries");
122  pmap->setPalette(1);
123 
124  tmap = std::make_unique<TrackerMap>("Strip");
125  tmap->setTitle("Strip Hit entries");
126  tmap->setPalette(1);
127 
128  pixelmap = std::make_unique<Phase1PixelMaps>("COLZ0 L");
129  pixelmap->bookBarrelHistograms("entriesBarrel", "# hits", "# pixel hits");
130  pixelmap->bookForwardHistograms("entriesForward", "# hits", "# pixel hits");
131 
132  pixelrocsmap_ = std::make_unique<Phase1PixelROCMaps>("");
133  }
134 
135  ~GeneralPurposeTrackAnalyzer() override = default;
136 
138 
139  template <class OBJECT_TYPE>
140  int index(const std::vector<OBJECT_TYPE *> &vec, const TString &name) {
141  for (const auto &iter : vec | boost::adaptors::indexed(0)) {
142  if (iter.value() && iter.value()->GetName() == name) {
143  return iter.index();
144  }
145  }
146  edm::LogError("GeneralPurposeTrackAnalyzer") << "@SUB=GeneralPurposeTrackAnalyzer::index"
147  << " could not find " << name;
148  return -1;
149  }
150 
151  template <typename T, typename... Args>
152  T *book(const Args &...args) const {
153  T *t = fs->make<T>(args...);
154  return t;
155  }
156 
157 private:
158  // tokens for the event setup
162 
166 
168 
169  std::optional<SiPixelCoordinates> coord_;
170 
172 
173  std::unique_ptr<TrackerMap> tmap;
174  std::unique_ptr<TrackerMap> pmap;
175 
176  std::unique_ptr<Phase1PixelMaps> pixelmap;
177  std::unique_ptr<Phase1PixelROCMaps> pixelrocsmap_;
178 
179  TH1D *hchi2ndof;
180  TH1D *hNtrk;
181  TH1D *hNtrkZoom;
182  TH1I *htrkQuality;
183  TH1I *htrkAlgo;
184  TH1I *htrkOriAlgo;
186  TH1D *hP;
187  TH1D *hPPlus;
188  TH1D *hPMinus;
189  TH1D *hPt;
190  TH1D *hMinPt;
191  TH1D *hPtPlus;
192  TH1D *hPtMinus;
193  TH1D *hHit;
194  TH1D *hHit2D;
195 
202 
205 
208 
209  TH1D *hHitPlus;
210  TH1D *hHitMinus;
211 
212  TH1D *hPhp;
213  TH1D *hPthp;
214  TH1D *hHithp;
215  TH1D *hEtahp;
216  TH1D *hPhihp;
217  TH1D *hchi2ndofhp;
218  TH1D *hchi2Probhp;
219 
220  TH1D *hCharge;
221  TH1D *hQoverP;
222  TH1D *hQoverPZoom;
223  TH1D *hEta;
224  TH1D *hEtaPlus;
225  TH1D *hEtaMinus;
226  TH1D *hPhi;
227  TH1D *hPhiBarrel;
232  TH1D *hPhiPlus;
233  TH1D *hPhiMinus;
234 
235  TH1D *hDeltaPhi;
236  TH1D *hDeltaEta;
237  TH1D *hDeltaR;
238 
239  TH1D *hvx;
240  TH1D *hvy;
241  TH1D *hvz;
242  TH1D *hd0;
243  TH1D *hdz;
244  TH1D *hdxy;
245 
246  TH2D *hd0PVvsphi;
247  TH2D *hd0PVvseta;
248  TH2D *hd0PVvspt;
249 
250  TH2D *hd0vsphi;
251  TH2D *hd0vseta;
252  TH2D *hd0vspt;
253 
254  TH1D *hnhpxb;
255  TH1D *hnhpxe;
256  TH1D *hnhTIB;
257  TH1D *hnhTID;
258  TH1D *hnhTOB;
259  TH1D *hnhTEC;
260 
262 
263  TProfile *pNBpixHitsVsVx;
264  TProfile *pNBpixHitsVsVy;
265  TProfile *pNBpixHitsVsVz;
266 
267  TH1D *hMultCand;
268 
269  TH1D *hdxyBS;
270  TH1D *hd0BS;
271  TH1D *hdzBS;
272  TH1D *hdxyPV;
273  TH1D *hd0PV;
274  TH1D *hdzPV;
275  TH1D *hrun;
276  TH1D *hlumi;
277 
278  TH1F *h_BSx0;
279  TH1F *h_BSy0;
280  TH1F *h_BSz0;
284  TH1F *h_BSdxdz;
285  TH1F *h_BSdydz;
286 
287  std::vector<TH1 *> vTrackHistos_;
288  std::vector<TH1 *> vTrackProfiles_;
289  std::vector<TH1 *> vTrack2DHistos_;
290 
293 
294  TH1D *modeByRun_;
295  TH1D *fieldByRun_;
296 
297  int ievt;
298  int itrks;
299  int mode;
300  float etaMax_;
302 
304 
309 
312 
317 
318  std::map<std::string, std::pair<int, int> > triggerMap_;
319  std::map<int, std::pair<int, float> > conditionsMap_;
320  std::map<int, std::pair<int, int> > runInfoMap_;
321 
322  //*************************************************************
323  void analyze(const edm::Event &event, const edm::EventSetup &setup) override
324  //*************************************************************
325  {
326  ievt++;
327 
328  // geometry setup
329  const TrackerGeometry *theGeometry = &setup.getData(geomToken_);
330 
332  const reco::TrackCollection tC = *(trackCollection.product());
333  itrks += tC.size();
334 
335  runInfoMap_[event.run()].first += 1;
336  runInfoMap_[event.run()].second += tC.size();
337 
338  if (DEBUG) {
339  edm::LogInfo("GeneralPurposeTrackAnalyzer") << "Reconstructed " << tC.size() << " tracks" << std::endl;
340  }
341  //int iCounter=0;
342 
344  if (hltresults.isValid()) {
345  const edm::TriggerNames &triggerNames_ = event.triggerNames(*hltresults);
346  int ntrigs = hltresults->size();
347  //const vector<std::string> &triggernames = triggerNames_.triggerNames();
348 
349  for (int itrig = 0; itrig != ntrigs; ++itrig) {
350  const std::string &trigName = triggerNames_.triggerName(itrig);
351  bool accept = hltresults->accept(itrig);
352  if (accept == 1) {
353  if (DEBUG) {
354  edm::LogInfo("GeneralPurposeTrackAnalyzer")
355  << trigName << " " << accept << " ,track size: " << tC.size() << std::endl;
356  }
357  triggerMap_[trigName].first += 1;
358  triggerMap_[trigName].second += tC.size();
359  // triggerInfo.push_back(pair <std::string, int> (trigName, accept));
360  }
361  }
362  }
363 
364  hrun->Fill(event.run());
365  hlumi->Fill(event.luminosityBlock());
366 
367  int nHighPurityTracks = 0;
368 
369  for (auto track = tC.cbegin(); track != tC.cend(); track++) {
370  unsigned int nHit2D = 0;
371  std::bitset<16> rocsToMask;
372  for (auto iHit = track->recHitsBegin(); iHit != track->recHitsEnd(); ++iHit) {
373  if (this->isHit2D(**iHit)) {
374  ++nHit2D;
375  }
376  // rest the ROCs for the map
377  rocsToMask.reset();
378  const DetId &detId = (*iHit)->geographicalId();
379  const GeomDet *geomDet(theGeometry->idToDet(detId));
380 
381  const SiPixelRecHit *pixhit = dynamic_cast<const SiPixelRecHit *>(*iHit);
382 
383  if (pixhit) {
384  if (pixhit->isValid()) {
385  unsigned int subid = detId.subdetId();
386  int detid_db = detId.rawId();
387 
388  // get the cluster
389  auto clustp = pixhit->cluster();
390 
391  if (clustp.isNull())
392  continue;
393  auto const &cluster = *clustp;
394  int row = cluster.x() - 0.5, col = cluster.y() - 0.5;
395 
397  pmap->fill(detid_db, 1);
398  } else if (phase_ == SiPixelPI::phase::one) {
399  int rocId = coord_->roc(detId, std::make_pair(row, col));
400  rocsToMask.set(rocId);
401  pixelrocsmap_->fillSelectedRocs(detid_db, rocsToMask, 1);
402 
403  if (subid == PixelSubdetector::PixelBarrel) {
404  pixelmap->fillBarrelBin("entriesBarrel", detid_db, 1);
405  } else {
406  pixelmap->fillForwardBin("entriesForward", detid_db, 1);
407  }
408  }
409 
410  LocalPoint lp = (*iHit)->localPosition();
411  //LocalError le = (*iHit)->localPositionError();
412 
413  GlobalPoint GP = geomDet->surface().toGlobal(lp);
414 
415  if ((subid == PixelSubdetector::PixelBarrel) || (subid == PixelSubdetector::PixelEndcap)) {
416  // 1 = PXB, 2 = PXF
417  if (subid == PixelSubdetector::PixelBarrel) {
418  hHitCountVsThetaBPix->Fill(GP.theta());
419  hHitCountVsPhiBPix->Fill(GP.phi());
420 
421  hHitCountVsZBPix->Fill(GP.z());
422  hHitCountVsXBPix->Fill(GP.x());
423  hHitCountVsYBPix->Fill(GP.y());
424 
425  } else if (subid == PixelSubdetector::PixelEndcap) {
426  hHitCountVsThetaFPix->Fill(GP.theta());
427  hHitCountVsPhiFPix->Fill(GP.phi());
428 
429  hHitCountVsZFPix->Fill(GP.z());
430  hHitCountVsXFPix->Fill(GP.x());
431  hHitCountVsYFPix->Fill(GP.y());
432  }
433  }
434  }
435  } else {
436  if ((*iHit)->isValid() && phase_ != SiPixelPI::phase::two) {
437  tmap->fill(detId.rawId(), 1);
438  }
439  }
440  }
441 
442  hHit2D->Fill(nHit2D);
443  hHit->Fill(track->numberOfValidHits());
444  hnhpxb->Fill(track->hitPattern().numberOfValidPixelBarrelHits());
445  hnhpxe->Fill(track->hitPattern().numberOfValidPixelEndcapHits());
446  hnhTIB->Fill(track->hitPattern().numberOfValidStripTIBHits());
447  hnhTID->Fill(track->hitPattern().numberOfValidStripTIDHits());
448  hnhTOB->Fill(track->hitPattern().numberOfValidStripTOBHits());
449  hnhTEC->Fill(track->hitPattern().numberOfValidStripTECHits());
450 
451  // fill hit composition histogram
452  if (track->hitPattern().numberOfValidPixelBarrelHits() != 0) {
453  hHitComposition->Fill(0., track->hitPattern().numberOfValidPixelBarrelHits());
454 
455  pNBpixHitsVsVx->Fill(track->vx(), track->hitPattern().numberOfValidPixelBarrelHits());
456  pNBpixHitsVsVy->Fill(track->vy(), track->hitPattern().numberOfValidPixelBarrelHits());
457  pNBpixHitsVsVz->Fill(track->vz(), track->hitPattern().numberOfValidPixelBarrelHits());
458  }
459  if (track->hitPattern().numberOfValidPixelEndcapHits() != 0) {
460  hHitComposition->Fill(1., track->hitPattern().numberOfValidPixelEndcapHits());
461  }
462  if (track->hitPattern().numberOfValidStripTIBHits() != 0) {
463  hHitComposition->Fill(2., track->hitPattern().numberOfValidStripTIBHits());
464  }
465  if (track->hitPattern().numberOfValidStripTIDHits() != 0) {
466  hHitComposition->Fill(3., track->hitPattern().numberOfValidStripTIDHits());
467  }
468  if (track->hitPattern().numberOfValidStripTOBHits() != 0) {
469  hHitComposition->Fill(4., track->hitPattern().numberOfValidStripTOBHits());
470  }
471  if (track->hitPattern().numberOfValidStripTECHits() != 0) {
472  hHitComposition->Fill(5., track->hitPattern().numberOfValidStripTECHits());
473  }
474 
475  hCharge->Fill(track->charge());
476  hQoverP->Fill(track->qoverp());
477  hQoverPZoom->Fill(track->qoverp());
478  hPt->Fill(track->pt());
479  hP->Fill(track->p());
480  hchi2ndof->Fill(track->normalizedChi2());
481  hEta->Fill(track->eta());
482  hPhi->Fill(track->phi());
483 
484  if (fabs(track->eta()) < 0.8) {
485  hPhiBarrel->Fill(track->phi());
486  }
487  if (track->eta() > 0.8 && track->eta() < 1.4) {
488  hPhiOverlapPlus->Fill(track->phi());
489  }
490  if (track->eta() < -0.8 && track->eta() > -1.4) {
491  hPhiOverlapMinus->Fill(track->phi());
492  }
493  if (track->eta() > 1.4) {
494  hPhiEndcapPlus->Fill(track->phi());
495  }
496  if (track->eta() < -1.4) {
497  hPhiEndcapMinus->Fill(track->phi());
498  }
499 
500  hd0->Fill(track->d0());
501  hdz->Fill(track->dz());
502  hdxy->Fill(track->dxy());
503  hvx->Fill(track->vx());
504  hvy->Fill(track->vy());
505  hvz->Fill(track->vz());
506 
507  htrkAlgo->Fill(static_cast<int>(track->algo()));
508  htrkOriAlgo->Fill(static_cast<int>(track->originalAlgo()));
509 
510  int myquality = -99;
511  if (track->quality(reco::TrackBase::undefQuality)) {
512  myquality = -1;
513  htrkQuality->Fill(myquality);
514  }
515  if (track->quality(reco::TrackBase::loose)) {
516  myquality = 0;
517  htrkQuality->Fill(myquality);
518  }
519  if (track->quality(reco::TrackBase::tight)) {
520  myquality = 1;
521  htrkQuality->Fill(myquality);
522  }
523  if (track->quality(reco::TrackBase::highPurity) && (!isCosmics_)) {
524  myquality = 2;
525  htrkQuality->Fill(myquality);
526  hPhp->Fill(track->p());
527  hPthp->Fill(track->pt());
528  hHithp->Fill(track->numberOfValidHits());
529  hEtahp->Fill(track->eta());
530  hPhihp->Fill(track->phi());
531  hchi2ndofhp->Fill(track->normalizedChi2());
532  hchi2Probhp->Fill(TMath::Prob(track->chi2(), track->ndof()));
533  nHighPurityTracks++;
534  }
535  if (track->quality(reco::TrackBase::confirmed)) {
536  myquality = 3;
537  htrkQuality->Fill(myquality);
538  }
539  if (track->quality(reco::TrackBase::goodIterative)) {
540  myquality = 4;
541  htrkQuality->Fill(myquality);
542  }
543 
544  // Fill 1D track histos
545  static const int etaindex = this->index(vTrackHistos_, "h_tracketa");
546  vTrackHistos_[etaindex]->Fill(track->eta());
547  static const int phiindex = this->index(vTrackHistos_, "h_trackphi");
548  vTrackHistos_[phiindex]->Fill(track->phi());
549  static const int numOfValidHitsindex = this->index(vTrackHistos_, "h_trackNumberOfValidHits");
550  vTrackHistos_[numOfValidHitsindex]->Fill(track->numberOfValidHits());
551  static const int numOfLostHitsindex = this->index(vTrackHistos_, "h_trackNumberOfLostHits");
552  vTrackHistos_[numOfLostHitsindex]->Fill(track->numberOfLostHits());
553 
554  GlobalPoint gPoint(track->vx(), track->vy(), track->vz());
555  double theLocalMagFieldInInverseGeV = magneticField_->inInverseGeV(gPoint).z();
556  double kappa = -track->charge() * theLocalMagFieldInInverseGeV / track->pt();
557 
558  static const int kappaindex = this->index(vTrackHistos_, "h_curvature");
559  vTrackHistos_[kappaindex]->Fill(kappa);
560  static const int kappaposindex = this->index(vTrackHistos_, "h_curvature_pos");
561  if (track->charge() > 0)
562  vTrackHistos_[kappaposindex]->Fill(fabs(kappa));
563  static const int kappanegindex = this->index(vTrackHistos_, "h_curvature_neg");
564  if (track->charge() < 0)
565  vTrackHistos_[kappanegindex]->Fill(fabs(kappa));
566 
567  double chi2Prob = TMath::Prob(track->chi2(), track->ndof());
568  double normchi2 = track->normalizedChi2();
569 
570  static const int normchi2index = this->index(vTrackHistos_, "h_normchi2");
571  vTrackHistos_[normchi2index]->Fill(normchi2);
572  static const int chi2index = this->index(vTrackHistos_, "h_chi2");
573  vTrackHistos_[chi2index]->Fill(track->chi2());
574  static const int chi2Probindex = this->index(vTrackHistos_, "h_chi2Prob");
575  vTrackHistos_[chi2Probindex]->Fill(chi2Prob);
576  static const int ptindex = this->index(vTrackHistos_, "h_pt");
577  static const int pt2index = this->index(vTrackHistos_, "h_ptrebin");
578  vTrackHistos_[ptindex]->Fill(track->pt());
579  vTrackHistos_[pt2index]->Fill(track->pt());
580  if (track->ptError() != 0.) {
581  static const int ptResolutionindex = this->index(vTrackHistos_, "h_ptResolution");
582  vTrackHistos_[ptResolutionindex]->Fill(track->ptError() / track->pt());
583  }
584  // Fill track profiles
585  static const int d0phiindex = this->index(vTrackProfiles_, "p_d0_vs_phi");
586  vTrackProfiles_[d0phiindex]->Fill(track->phi(), track->d0());
587  static const int dzphiindex = this->index(vTrackProfiles_, "p_dz_vs_phi");
588  vTrackProfiles_[dzphiindex]->Fill(track->phi(), track->dz());
589  static const int d0etaindex = this->index(vTrackProfiles_, "p_d0_vs_eta");
590  vTrackProfiles_[d0etaindex]->Fill(track->eta(), track->d0());
591  static const int dzetaindex = this->index(vTrackProfiles_, "p_dz_vs_eta");
592  vTrackProfiles_[dzetaindex]->Fill(track->eta(), track->dz());
593  static const int chiProbphiindex = this->index(vTrackProfiles_, "p_chi2Prob_vs_phi");
594  vTrackProfiles_[chiProbphiindex]->Fill(track->phi(), chi2Prob);
595  static const int chiProbabsd0index = this->index(vTrackProfiles_, "p_chi2Prob_vs_d0");
596  vTrackProfiles_[chiProbabsd0index]->Fill(fabs(track->d0()), chi2Prob);
597  static const int chiProbabsdzindex = this->index(vTrackProfiles_, "p_chi2Prob_vs_dz");
598  vTrackProfiles_[chiProbabsdzindex]->Fill(track->dz(), chi2Prob);
599  static const int chiphiindex = this->index(vTrackProfiles_, "p_chi2_vs_phi");
600  vTrackProfiles_[chiphiindex]->Fill(track->phi(), track->chi2());
601  static const int normchiphiindex = this->index(vTrackProfiles_, "p_normchi2_vs_phi");
602  vTrackProfiles_[normchiphiindex]->Fill(track->phi(), normchi2);
603  static const int chietaindex = this->index(vTrackProfiles_, "p_chi2_vs_eta");
604  vTrackProfiles_[chietaindex]->Fill(track->eta(), track->chi2());
605  static const int normchiptindex = this->index(vTrackProfiles_, "p_normchi2_vs_pt");
606  vTrackProfiles_[normchiptindex]->Fill(track->pt(), normchi2);
607  static const int normchipindex = this->index(vTrackProfiles_, "p_normchi2_vs_p");
608  vTrackProfiles_[normchipindex]->Fill(track->p(), normchi2);
609  static const int chiProbetaindex = this->index(vTrackProfiles_, "p_chi2Prob_vs_eta");
610  vTrackProfiles_[chiProbetaindex]->Fill(track->eta(), chi2Prob);
611  static const int normchietaindex = this->index(vTrackProfiles_, "p_normchi2_vs_eta");
612  vTrackProfiles_[normchietaindex]->Fill(track->eta(), normchi2);
613  static const int kappaphiindex = this->index(vTrackProfiles_, "p_kappa_vs_phi");
614  vTrackProfiles_[kappaphiindex]->Fill(track->phi(), kappa);
615  static const int kappaetaindex = this->index(vTrackProfiles_, "p_kappa_vs_eta");
616  vTrackProfiles_[kappaetaindex]->Fill(track->eta(), kappa);
617  static const int ptResphiindex = this->index(vTrackProfiles_, "p_ptResolution_vs_phi");
618  vTrackProfiles_[ptResphiindex]->Fill(track->phi(), track->ptError() / track->pt());
619  static const int ptResetaindex = this->index(vTrackProfiles_, "p_ptResolution_vs_eta");
620  vTrackProfiles_[ptResetaindex]->Fill(track->eta(), track->ptError() / track->pt());
621 
622  // Fill 2D track histos
623  static const int etaphiindex_2d = this->index(vTrack2DHistos_, "h2_phi_vs_eta");
624  vTrack2DHistos_[etaphiindex_2d]->Fill(track->eta(), track->phi());
625  static const int d0phiindex_2d = this->index(vTrack2DHistos_, "h2_d0_vs_phi");
626  vTrack2DHistos_[d0phiindex_2d]->Fill(track->phi(), track->d0());
627  static const int dzphiindex_2d = this->index(vTrack2DHistos_, "h2_dz_vs_phi");
628  vTrack2DHistos_[dzphiindex_2d]->Fill(track->phi(), track->dz());
629  static const int d0etaindex_2d = this->index(vTrack2DHistos_, "h2_d0_vs_eta");
630  vTrack2DHistos_[d0etaindex_2d]->Fill(track->eta(), track->d0());
631  static const int dzetaindex_2d = this->index(vTrack2DHistos_, "h2_dz_vs_eta");
632  vTrack2DHistos_[dzetaindex_2d]->Fill(track->eta(), track->dz());
633  static const int chiphiindex_2d = this->index(vTrack2DHistos_, "h2_chi2_vs_phi");
634  vTrack2DHistos_[chiphiindex_2d]->Fill(track->phi(), track->chi2());
635  static const int chiProbphiindex_2d = this->index(vTrack2DHistos_, "h2_chi2Prob_vs_phi");
636  vTrack2DHistos_[chiProbphiindex_2d]->Fill(track->phi(), chi2Prob);
637  static const int chiProbabsd0index_2d = this->index(vTrack2DHistos_, "h2_chi2Prob_vs_d0");
638  vTrack2DHistos_[chiProbabsd0index_2d]->Fill(fabs(track->d0()), chi2Prob);
639  static const int normchiphiindex_2d = this->index(vTrack2DHistos_, "h2_normchi2_vs_phi");
640  vTrack2DHistos_[normchiphiindex_2d]->Fill(track->phi(), normchi2);
641  static const int chietaindex_2d = this->index(vTrack2DHistos_, "h2_chi2_vs_eta");
642  vTrack2DHistos_[chietaindex_2d]->Fill(track->eta(), track->chi2());
643  static const int chiProbetaindex_2d = this->index(vTrack2DHistos_, "h2_chi2Prob_vs_eta");
644  vTrack2DHistos_[chiProbetaindex_2d]->Fill(track->eta(), chi2Prob);
645  static const int normchietaindex_2d = this->index(vTrack2DHistos_, "h2_normchi2_vs_eta");
646  vTrack2DHistos_[normchietaindex_2d]->Fill(track->eta(), normchi2);
647  static const int kappaphiindex_2d = this->index(vTrack2DHistos_, "h2_kappa_vs_phi");
648  vTrack2DHistos_[kappaphiindex_2d]->Fill(track->phi(), kappa);
649  static const int kappaetaindex_2d = this->index(vTrack2DHistos_, "h2_kappa_vs_eta");
650  vTrack2DHistos_[kappaetaindex_2d]->Fill(track->eta(), kappa);
651  static const int normchi2kappa_2d = this->index(vTrack2DHistos_, "h2_normchi2_vs_kappa");
652  vTrack2DHistos_[normchi2kappa_2d]->Fill(normchi2, kappa);
653 
654  //dxy with respect to the beamspot
656  edm::Handle<reco::BeamSpot> beamSpotHandle = event.getHandle(beamspotToken_);
657  if (beamSpotHandle.isValid()) {
658  beamSpot = *beamSpotHandle;
659 
660  double BSx0 = beamSpot.x0();
661  double BSy0 = beamSpot.y0();
662  double BSz0 = beamSpot.z0();
663  double Beamsigmaz = beamSpot.sigmaZ();
664  double Beamdxdz = beamSpot.dxdz();
665  double Beamdydz = beamSpot.dydz();
666  double BeamWidthX = beamSpot.BeamWidthX();
667  double BeamWidthY = beamSpot.BeamWidthY();
668 
669  math::XYZPoint point(BSx0, BSy0, BSz0);
670  double dxy = track->dxy(point);
671  double dz = track->dz(point);
672  hdxyBS->Fill(dxy);
673  hd0BS->Fill(-dxy);
674  hdzBS->Fill(dz);
675 
676  h_BSx0->Fill(BSx0);
677  h_BSy0->Fill(BSy0);
678  h_BSz0->Fill(BSz0);
679  h_Beamsigmaz->Fill(Beamsigmaz);
680  h_BeamWidthX->Fill(BeamWidthX);
681  h_BeamWidthY->Fill(BeamWidthY);
682  h_BSdxdz->Fill(Beamdxdz);
683  h_BSdydz->Fill(Beamdydz);
684  }
685 
686  //dxy with respect to the primary vertex
687  reco::Vertex pvtx;
688  edm::Handle<reco::VertexCollection> vertexHandle = event.getHandle(vertexToken_);
689  double mindxy = 100.;
690  double dz = 100;
691  if (vertexHandle.isValid() && !isCosmics_) {
692  for (auto pvtx = vertexHandle->cbegin(); pvtx != vertexHandle->cend(); ++pvtx) {
693  math::XYZPoint mypoint(pvtx->x(), pvtx->y(), pvtx->z());
694  if (abs(mindxy) > abs(track->dxy(mypoint))) {
695  mindxy = track->dxy(mypoint);
696  dz = track->dz(mypoint);
697  }
698  }
699 
700  hdxyPV->Fill(mindxy);
701  hd0PV->Fill(-mindxy);
702  hdzPV->Fill(dz);
703 
704  hd0PVvsphi->Fill(track->phi(), -mindxy);
705  hd0PVvseta->Fill(track->eta(), -mindxy);
706  hd0PVvspt->Fill(track->pt(), -mindxy);
707 
708  } else {
709  hdxyPV->Fill(100);
710  hd0PV->Fill(100);
711  hdzPV->Fill(100);
712 
713  hd0vsphi->Fill(track->phi(), -track->dxy());
714  hd0vseta->Fill(track->eta(), -track->dxy());
715  hd0vspt->Fill(track->pt(), -track->dxy());
716  }
717 
718  if (DEBUG) {
719  edm::LogInfo("GeneralPurposeTrackAnalyzer") << "end of track loop" << std::endl;
720  }
721  }
722 
723  hNtrk->Fill(tC.size());
724  hNtrkZoom->Fill(tC.size());
725  hNhighPurity->Fill(nHighPurityTracks);
726 
727  if (DEBUG) {
728  edm::LogInfo("GeneralPurposeTrackAnalyzer") << "end of analysis" << std::endl;
729  }
730  }
731 
732  //*************************************************************
733  void beginRun(edm::Run const &run, edm::EventSetup const &setup) override
734  //*************************************************************
735  {
736  // initialize runInfoMap_
737  runInfoMap_[run.run()].first = 0;
738  runInfoMap_[run.run()].second = 0;
739 
740  // Magnetic Field setup
741  magneticField_ = setup.getHandle(magFieldToken_);
742  float B_ = magneticField_.product()->inTesla(GlobalPoint(0, 0, 0)).mag();
743 
744  if (DEBUG) {
745  edm::LogInfo("GeneralPurposeTrackAnalyzer")
746  << "run number:" << run.run() << " magnetic field: " << B_ << " [T]" << std::endl;
747  }
748 
749  const TrackerGeometry *trackerGeometry = &setup.getData(geomTokenBR_);
750  if (trackerGeometry->isThere(GeomDetEnumerators::P2PXB) || trackerGeometry->isThere(GeomDetEnumerators::P2PXEC)) {
752  } else if (trackerGeometry->isThere(GeomDetEnumerators::P1PXB) ||
753  trackerGeometry->isThere(GeomDetEnumerators::P1PXEC)) {
755  } else {
757  }
758 
759  // if it's a phase-2 geometry there are no phase-1 conditions
760  if (phase_ == SiPixelPI::phase::two) {
761  mode = 0;
762  } else {
763  if (doLatencyAnalysis_) {
764  //SiStrip Latency
765  const SiStripLatency *apvlat = &setup.getData(latencyToken_);
766  if (apvlat->singleReadOutMode() == 1) {
767  mode = 1; // peak mode
768  } else if (apvlat->singleReadOutMode() == 0) {
769  mode = -1; // deco mode
770  }
771  } else {
772  mode = 0;
773  }
774  }
775 
776  conditionsMap_[run.run()].first = mode;
777  conditionsMap_[run.run()].second = B_;
778 
779  // if phase-2 return, there is no phase-2 implementation of SiPixelCoordinates
781  return;
782 
783  // init the sipixel coordinates
784  const TrackerTopology *trackerTopology = &setup.getData(trackerTopologyTokenBR_);
785  const SiPixelFedCablingMap *siPixelFedCablingMap = &setup.getData(siPixelFedCablingMapTokenBR_);
786 
787  coord_ = coord_.value_or(SiPixelCoordinates());
788  // Pixel Phase-1 helper class
789  coord_->init(trackerTopology, trackerGeometry, siPixelFedCablingMap);
790  }
791 
792  //*************************************************************
793  void endRun(edm::Run const &, edm::EventSetup const &) override {}
794  //*************************************************************
795 
796  //*************************************************************
797  void beginJob() override
798  //*************************************************************
799  {
800  if (DEBUG) {
801  edm::LogInfo("GeneralPurposeTrackAnalyzer") << __LINE__ << std::endl;
802  }
803 
804  TH1D::SetDefaultSumw2(kTRUE);
805  etaMax_ = 3.0;
806 
807  ievt = 0;
808  itrks = 0;
809 
810  hrun = book<TH1D>("h_run", "run", 100000, 230000, 240000);
811  hlumi = book<TH1D>("h_lumi", "lumi", 1000, 0, 1000);
812 
813  hchi2ndof = book<TH1D>("h_chi2ndof", "chi2/ndf;#chi^{2}/ndf;tracks", 100, 0, 5.);
814  hCharge = book<TH1D>("h_charge", "charge;Charge of the track;tracks", 5, -2.5, 2.5);
815  hNtrk = book<TH1D>("h_Ntrk", "ntracks;Number of Tracks;events", 200, 0., 200.);
816  hNtrkZoom = book<TH1D>("h_NtrkZoom", "Number of tracks; number of tracks;events", 10, 0., 10.);
817  hNhighPurity =
818  book<TH1D>("h_NhighPurity", "n. high purity tracks;Number of high purity tracks;events", 200, 0., 200.);
819 
820  htrkAlgo = book<TH1I>("h_trkAlgo",
821  "tracking step;iterative tracking step;tracks",
823  0.,
824  double(reco::TrackBase::algoSize));
825 
826  htrkOriAlgo = book<TH1I>("h_trkOriAlgo",
827  "original tracking step;original iterative tracking step;tracks",
829  0.,
830  double(reco::TrackBase::algoSize));
831 
832  for (size_t ibin = 0; ibin < reco::TrackBase::algoSize - 1; ibin++) {
833  htrkAlgo->GetXaxis()->SetBinLabel(ibin + 1, (reco::TrackBase::algoNames[ibin]).c_str());
834  htrkOriAlgo->GetXaxis()->SetBinLabel(ibin + 1, (reco::TrackBase::algoNames[ibin]).c_str());
835  }
836 
837  htrkQuality = book<TH1I>("h_trkQuality", "track quality;track quality;tracks", 6, -1, 5);
838  std::string qualities[7] = {"undef", "loose", "tight", "highPurity", "confirmed", "goodIterative"};
839  for (int nbin = 1; nbin <= htrkQuality->GetNbinsX(); nbin++) {
840  htrkQuality->GetXaxis()->SetBinLabel(nbin, (qualities[nbin - 1]).c_str());
841  }
842 
843  hP = book<TH1D>("h_P", "Momentum;track momentum [GeV];tracks", 100, 0., 100.);
844  hQoverP = book<TH1D>("h_qoverp", "Track q/p; track q/p [GeV^{-1}];tracks", 100, -1., 1.);
845  hQoverPZoom = book<TH1D>("h_qoverpZoom", "Track q/p; track q/p [GeV^{-1}];tracks", 100, -0.1, 0.1);
846  hPt = book<TH1D>("h_Pt", "Transverse Momentum;track p_{T} [GeV];tracks", 100, 0., 100.);
847  hHit = book<TH1D>("h_nHits", "Number of hits;track n. hits;tracks", 50, -0.5, 49.5);
848  hHit2D = book<TH1D>("h_nHit2D", "Number of 2D hits; number of 2D hits;tracks", 20, 0, 20);
849 
850  hHitCountVsZBPix = book<TH1D>("h_HitCountVsZBpix", "Number of BPix hits vs z;hit global z;hits", 60, -30, 30);
851  hHitCountVsZFPix = book<TH1D>("h_HitCountVsZFpix", "Number of FPix hits vs z;hit global z;hits", 100, -100, 100);
852 
853  hHitCountVsXBPix = book<TH1D>("h_HitCountVsXBpix", "Number of BPix hits vs x;hit global x;hits", 20, -20, 20);
854  hHitCountVsXFPix = book<TH1D>("h_HitCountVsXFpix", "Number of FPix hits vs x;hit global x;hits", 20, -20, 20);
855 
856  hHitCountVsYBPix = book<TH1D>("h_HitCountVsYBpix", "Number of BPix hits vs y;hit global y;hits", 20, -20, 20);
857  hHitCountVsYFPix = book<TH1D>("h_HitCountVsYFpix", "Number of FPix hits vs y;hit global y;hits", 20, -20, 20);
858 
860  book<TH1D>("h_HitCountVsThetaBpix", "Number of BPix hits vs #theta;hit global #theta;hits", 20, 0., M_PI);
862  book<TH1D>("h_HitCountVsPhiBpix", "Number of BPix hits vs #phi;hit global #phi;hits", 20, -M_PI, M_PI);
863 
865  book<TH1D>("h_HitCountVsThetaFpix", "Number of FPix hits vs #theta;hit global #theta;hits", 40, 0., M_PI);
867  book<TH1D>("h_HitCountVsPhiFpix", "Number of FPix hits vs #phi;hit global #phi;hits", 20, -M_PI, M_PI);
868 
869  hEta = book<TH1D>("h_Eta", "Track pseudorapidity; track #eta;tracks", 100, -etaMax_, etaMax_);
870  hPhi = book<TH1D>("h_Phi", "Track azimuth; track #phi;tracks", 100, -M_PI, M_PI);
871 
872  hPhiBarrel = book<TH1D>("h_PhiBarrel", "hPhiBarrel (0<|#eta|<0.8);track #phi;tracks", 100, -M_PI, M_PI);
874  book<TH1D>("h_PhiOverlapPlus", "hPhiOverlapPlus (0.8<#eta<1.4);track #phi;tracks", 100, -M_PI, M_PI);
876  book<TH1D>("h_PhiOverlapMinus", "hPhiOverlapMinus (-1.4<#eta<-0.8);track #phi;tracks", 100, -M_PI, M_PI);
877  hPhiEndcapPlus = book<TH1D>("h_PhiEndcapPlus", "hPhiEndcapPlus (#eta>1.4);track #phi;track", 100, -M_PI, M_PI);
878  hPhiEndcapMinus = book<TH1D>("h_PhiEndcapMinus", "hPhiEndcapMinus (#eta<1.4);track #phi;tracks", 100, -M_PI, M_PI);
879 
880  h_BSx0 = book<TH1F>("h_BSx0", "x-coordinate of reco beamspot;x^{BS}_{0};n_{events}", 100, -0.1, 0.1);
881  h_BSy0 = book<TH1F>("h_BSy0", "y-coordinate of reco beamspot;y^{BS}_{0};n_{events}", 100, -0.1, 0.1);
882  h_BSz0 = book<TH1F>("h_BSz0", "z-coordinate of reco beamspot;z^{BS}_{0};n_{events}", 100, -1., 1.);
883  h_Beamsigmaz = book<TH1F>("h_Beamsigmaz", "z-coordinate beam width;#sigma_{Z}^{beam};n_{events}", 100, 0., 7.);
884  h_BeamWidthX = book<TH1F>("h_BeamWidthX", "x-coordinate beam width;#sigma_{X}^{beam};n_{events}", 100, 0., 0.01);
885  h_BeamWidthY = book<TH1F>("h_BeamWidthY", "y-coordinate beam width;#sigma_{Y}^{beam};n_{events}", 100, 0., 0.01);
886  h_BSdxdz = book<TH1F>("h_BSdxdz", "BeamSpot dxdz;beamspot dx/dz;n_{events}", 100, -0.0003, 0.0003);
887  h_BSdydz = book<TH1F>("h_BSdydz", "BeamSpot dydz;beamspot dy/dz;n_{events}", 100, -0.0003, 0.0003);
888 
889  if (!isCosmics_) {
890  hPhp = book<TH1D>("h_P_hp", "Momentum (high purity);track momentum [GeV];tracks", 100, 0., 100.);
891  hPthp = book<TH1D>("h_Pt_hp", "Transverse Momentum (high purity);track p_{T} [GeV];tracks", 100, 0., 100.);
892  hHithp = book<TH1D>("h_nHit_hp", "Number of hits (high purity);track n. hits;tracks", 30, 0, 30);
893  hEtahp = book<TH1D>("h_Eta_hp", "Track pseudorapidity (high purity); track #eta;tracks", 100, -etaMax_, etaMax_);
894  hPhihp = book<TH1D>("h_Phi_hp", "Track azimuth (high purity); track #phi;tracks", 100, -M_PI, M_PI);
895  hchi2ndofhp = book<TH1D>("h_chi2ndof_hp", "chi2/ndf (high purity);#chi^{2}/ndf;tracks", 100, 0, 5.);
896  hchi2Probhp = book<TH1D>(
897  "h_chi2_Prob_hp", "#chi^{2} probability (high purity);#chi^{2}prob_{Track};Number of Tracks", 100, 0.0, 1.);
898 
899  hvx = book<TH1D>("h_vx", "Track v_{x} ; track v_{x} [cm];tracks", 100, -1.5, 1.5);
900  hvy = book<TH1D>("h_vy", "Track v_{y} ; track v_{y} [cm];tracks", 100, -1.5, 1.5);
901  hvz = book<TH1D>("h_vz", "Track v_{z} ; track v_{z} [cm];tracks", 100, -20., 20.);
902  hd0 = book<TH1D>("h_d0", "Track d_{0} ; track d_{0} [cm];tracks", 100, -1., 1.);
903  hdxy = book<TH1D>("h_dxy", "Track d_{xy}; track d_{xy} [cm]; tracks", 100, -0.5, 0.5);
904  hdz = book<TH1D>("h_dz", "Track d_{z} ; track d_{z} [cm]; tracks", 100, -20, 20);
905 
906  hd0PVvsphi =
907  book<TH2D>("h2_d0PVvsphi", "hd0PVvsphi;track #phi;track d_{0}(PV) [cm]", 160, -M_PI, M_PI, 100, -1., 1.);
908  hd0PVvseta =
909  book<TH2D>("h2_d0PVvseta", "hdPV0vseta;track #eta;track d_{0}(PV) [cm]", 160, -2.5, 2.5, 100, -1., 1.);
910  hd0PVvspt = book<TH2D>("h2_d0PVvspt", "hdPV0vspt;track p_{T};d_{0}(PV) [cm]", 50, 0., 100., 100, -1, 1.);
911 
912  hdxyBS = book<TH1D>("h_dxyBS", "hdxyBS; track d_{xy}(BS) [cm];tracks", 100, -0.1, 0.1);
913  hd0BS = book<TH1D>("h_d0BS", "hd0BS ; track d_{0}(BS) [cm];tracks", 100, -0.1, 0.1);
914  hdzBS = book<TH1D>("h_dzBS", "hdzBS ; track d_{z}(BS) [cm];tracks", 100, -12, 12);
915  hdxyPV = book<TH1D>("h_dxyPV", "hdxyPV; track d_{xy}(PV) [cm];tracks", 100, -0.1, 0.1);
916  hd0PV = book<TH1D>("h_d0PV", "hd0PV ; track d_{0}(PV) [cm];tracks", 100, -0.15, 0.15);
917  hdzPV = book<TH1D>("h_dzPV", "hdzPV ; track d_{z}(PV) [cm];tracks", 100, -0.1, 0.1);
918 
919  hnhTIB = book<TH1D>("h_nHitTIB", "nhTIB;# hits in TIB; tracks", 20, 0., 20.);
920  hnhTID = book<TH1D>("h_nHitTID", "nhTID;# hits in TID; tracks", 20, 0., 20.);
921  hnhTOB = book<TH1D>("h_nHitTOB", "nhTOB;# hits in TOB; tracks", 20, 0., 20.);
922  hnhTEC = book<TH1D>("h_nHitTEC", "nhTEC;# hits in TEC; tracks", 20, 0., 20.);
923 
924  } else {
925  hvx = book<TH1D>("h_vx", "Track v_{x};track v_{x} [cm];tracks", 100, -100., 100.);
926  hvy = book<TH1D>("h_vy", "Track v_{y};track v_{y} [cm];tracks", 100, -100., 100.);
927  hvz = book<TH1D>("h_vz", "Track v_{z};track v_{z} [cm];track", 100, -100., 100.);
928  hd0 = book<TH1D>("h_d0", "Track d_{0};track d_{0} [cm];track", 100, -100., 100.);
929  hdxy = book<TH1D>("h_dxy", "Track d_{xy};track d_{xy} [cm];tracks", 100, -100, 100);
930  hdz = book<TH1D>("h_dz", "Track d_{z};track d_{z} [cm];tracks", 100, -200, 200);
931 
932  hd0vsphi = book<TH2D>(
933  "h2_d0vsphi", "Track d_{0} vs #phi; track #phi;track d_{0} [cm]", 160, -3.20, 3.20, 100, -100., 100.);
934  hd0vseta = book<TH2D>(
935  "h2_d0vseta", "Track d_{0} vs #eta; track #eta;track d_{0} [cm]", 160, -3.20, 3.20, 100, -100., 100.);
936  hd0vspt =
937  book<TH2D>("h2_d0vspt", "Track d_{0} vs p_{T};track p_{T};track d_{0} [cm]", 50, 0., 100., 100, -100, 100);
938 
939  hdxyBS = book<TH1D>("h_dxyBS", "Track d_{xy}(BS);d_{xy}(BS) [cm];tracks", 100, -100., 100.);
940  hd0BS = book<TH1D>("h_d0BS", "Track d_{0}(BS);d_{0}(BS) [cm];tracks", 100, -100., 100.);
941  hdzBS = book<TH1D>("h_dzBS", "Track d_{z}(BS);d_{z}(BS) [cm];tracks", 100, -100., 100.);
942  hdxyPV = book<TH1D>("h_dxyPV", "Track d_{xy}(PV); d_{xy}(PV) [cm];tracks", 100, -100., 100.);
943  hd0PV = book<TH1D>("h_d0PV", "Track d_{0}(PV); d_{0}(PV) [cm];tracks", 100, -100., 100.);
944  hdzPV = book<TH1D>("h_dzPV", "Track d_{z}(PV); d_{z}(PV) [cm];tracks", 100, -100., 100.);
945 
946  hnhTIB = book<TH1D>("h_nHitTIB", "nhTIB;# hits in TIB; tracks", 30, 0., 30.);
947  hnhTID = book<TH1D>("h_nHitTID", "nhTID;# hits in TID; tracks", 30, 0., 30.);
948  hnhTOB = book<TH1D>("h_nHitTOB", "nhTOB;# hits in TOB; tracks", 30, 0., 30.);
949  hnhTEC = book<TH1D>("h_nHitTEC", "nhTEC;# hits in TEC; tracks", 30, 0., 30.);
950  }
951 
952  hnhpxb = book<TH1D>("h_nHitPXB", "nhpxb;# hits in Pixel Barrel; tracks", 10, 0., 10.);
953  hnhpxe = book<TH1D>("h_nHitPXE", "nhpxe;# hits in Pixel Endcap; tracks", 10, 0., 10.);
954 
955  hHitComposition = book<TH1D>("h_hitcomposition", "track hit composition;;# hits", 6, -0.5, 5.5);
956 
958  book<TProfile>("p_NpixHits_vs_Vx", "n. Barrel Pixel hits vs. v_{x};v_{x} (cm);n. BPix hits", 20, -20, 20);
959 
961  book<TProfile>("p_NpixHits_vs_Vy", "n. Barrel Pixel hits vs. v_{y};v_{y} (cm);n. BPix hits", 20, -20, 20);
962 
964  book<TProfile>("p_NpixHits_vs_Vz", "n. Barrel Pixel hits vs. v_{z};v_{z} (cm);n. BPix hits", 20, -100, 100);
965 
966  std::string dets[6] = {"PXB", "PXF", "TIB", "TID", "TOB", "TEC"};
967 
968  for (int i = 1; i <= hHitComposition->GetNbinsX(); i++) {
969  hHitComposition->GetXaxis()->SetBinLabel(i, (dets[i - 1]).c_str());
970  }
971 
972  // vector of track histograms
973 
974  // clang-format off
975 
976  vTrackHistos_.push_back(book<TH1F>("h_tracketa", "Track #eta;#eta_{Track};Number of Tracks", 90, -etaMax_, etaMax_));
977  vTrackHistos_.push_back(book<TH1F>("h_trackphi", "Track #phi;#phi_{Track};Number of Tracks", 90, -M_PI, M_PI));
978  vTrackHistos_.push_back(book<TH1F>("h_trackNumberOfValidHits", "Track # of valid hits;# of valid hits _{Track};Number of Tracks", 40, 0., 40.));
979  vTrackHistos_.push_back(book<TH1F>("h_trackNumberOfLostHits", "Track # of lost hits;# of lost hits _{Track};Number of Tracks", 10, 0., 10.));
980  vTrackHistos_.push_back(book<TH1F>("h_curvature", "Curvature #kappa;#kappa_{Track};Number of Tracks", 100, -.05, .05));
981  vTrackHistos_.push_back(book<TH1F>("h_curvature_pos", "Curvature |#kappa| Positive Tracks;|#kappa_{pos Track}|;Number of Tracks", 100, .0, .05));
982  vTrackHistos_.push_back(book<TH1F>("h_curvature_neg", "Curvature |#kappa| Negative Tracks;|#kappa_{neg Track}|;Number of Tracks", 100, .0, .05));
983  vTrackHistos_.push_back(book<TH1F>("h_diff_curvature","Curvature |#kappa| Tracks Difference;|#kappa_{Track}|;# Pos Tracks - # Neg Tracks",100, .0, .05));
984  vTrackHistos_.push_back(book<TH1F>("h_chi2", "Track #chi^{2};#chi^{2}_{Track};Number of Tracks", 500, -0.01, 500.));
985  vTrackHistos_.push_back(book<TH1F>("h_chi2Prob", "#chi^{2} probability;Track Prob(#chi^{2},ndof);Number of Tracks", 100, 0.0, 1.));
986  vTrackHistos_.push_back(book<TH1F>("h_normchi2", "#chi^{2}/ndof;#chi^{2}/ndof;Number of Tracks", 100, -0.01, 10.));
987  //variable binning for chi2/ndof vs. pT
988  double xBins[19] = {0., 0.15, 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4., 4.5, 5., 7., 10., 15., 25., 40., 100., 200.};
989  vTrackHistos_.push_back(book<TH1F>("h_pt", "Track p_{T};p_{T}^{track} [GeV];Number of Tracks", 250, 0., 250));
990  vTrackHistos_.push_back(book<TH1F>("h_ptrebin", "Track p_{T};p_{T}^{track} [GeV];Number of Tracks", 18, xBins));
991  vTrackHistos_.push_back(book<TH1F>("h_ptResolution", "#delta_{p_{T}}/p_{T}^{track};#delta_{p_{T}}/p_{T}^{track};Number of Tracks", 100, 0., 0.5));
992 
993  vTrackProfiles_.push_back(book<TProfile>("p_d0_vs_phi", "Transverse Impact Parameter vs. #phi;#phi_{Track};#LT d_{0} #GT [cm]", 100, -M_PI, M_PI));
994  vTrackProfiles_.push_back(book<TProfile>("p_dz_vs_phi", "Longitudinal Impact Parameter vs. #phi;#phi_{Track};#LT d_{z} #GT [cm]", 100, -M_PI, M_PI));
995  vTrackProfiles_.push_back(book<TProfile>("p_d0_vs_eta", "Transverse Impact Parameter vs. #eta;#eta_{Track};#LT d_{0} #GT [cm]", 100, -etaMax_, etaMax_));
996  vTrackProfiles_.push_back(book<TProfile>("p_dz_vs_eta", "Longitudinal Impact Parameter vs. #eta;#eta_{Track};#LT d_{z} #GT [cm]", 100, -etaMax_, etaMax_));
997  vTrackProfiles_.push_back(book<TProfile>("p_chi2_vs_phi", "#chi^{2} vs. #phi;#phi_{Track};#LT #chi^{2} #GT", 100, -M_PI, M_PI));
998  vTrackProfiles_.push_back(book<TProfile>("p_chi2Prob_vs_phi", "#chi^{2} probablility vs. #phi;#phi_{Track};#LT #chi^{2} probability#GT", 100, -M_PI, M_PI));
999  vTrackProfiles_.push_back(book<TProfile>("p_chi2Prob_vs_d0", "#chi^{2} probablility vs. |d_{0}|;|d_{0}|[cm];#LT #chi^{2} probability#GT", 100, 0, 80));
1000  vTrackProfiles_.push_back(book<TProfile>("p_chi2Prob_vs_dz", "#chi^{2} probablility vs. dz;d_{z} [cm];#LT #chi^{2} probability#GT", 100, -30, 30));
1001  vTrackProfiles_.push_back(book<TProfile>("p_normchi2_vs_phi", "#chi^{2}/ndof vs. #phi;#phi_{Track};#LT #chi^{2}/ndof #GT", 100, -M_PI, M_PI));
1002  vTrackProfiles_.push_back(book<TProfile>("p_chi2_vs_eta", "#chi^{2} vs. #eta;#eta_{Track};#LT #chi^{2} #GT", 100, -etaMax_, etaMax_));
1003  vTrackProfiles_.push_back(book<TProfile>("p_normchi2_vs_pt", "norm #chi^{2} vs. p_{T}_{Track}; p_{T}_{Track};#LT #chi^{2}/ndof #GT", 18, xBins));
1004  vTrackProfiles_.push_back(book<TProfile>("p_normchi2_vs_p", "#chi^{2}/ndof vs. p_{Track};p_{Track};#LT #chi^{2}/ndof #GT", 18, xBins));
1005  vTrackProfiles_.push_back(book<TProfile>("p_chi2Prob_vs_eta","#chi^{2} probability vs. #eta;#eta_{Track};#LT #chi^{2} probability #GT",100,-etaMax_,etaMax_));
1006  vTrackProfiles_.push_back(book<TProfile>("p_normchi2_vs_eta", "#chi^{2}/ndof vs. #eta;#eta_{Track};#LT #chi^{2}/ndof #GT", 100, -etaMax_, etaMax_));
1007  vTrackProfiles_.push_back(book<TProfile>("p_kappa_vs_phi", "#kappa vs. #phi;#phi_{Track};#kappa", 100, -M_PI, M_PI));
1008  vTrackProfiles_.push_back(book<TProfile>("p_kappa_vs_eta", "#kappa vs. #eta;#eta_{Track};#kappa", 100, -etaMax_, etaMax_));
1009  vTrackProfiles_.push_back(book<TProfile>("p_ptResolution_vs_phi","#delta_{p_{T}}/p_{T}^{track};#phi^{track};#delta_{p_{T}}/p_{T}^{track}",100,-M_PI,M_PI));
1010  vTrackProfiles_.push_back(book<TProfile>("p_ptResolution_vs_eta","#delta_{p_{T}}/p_{T}^{track};#eta^{track};#delta_{p_{T}}/p_{T}^{track}",100,-etaMax_,etaMax_));
1011 
1012  vTrack2DHistos_.push_back(book<TH2F>("h2_phi_vs_eta", "Track #phi vs. #eta;#eta_{Track};#phi_{Track}",50, -etaMax_, etaMax_, 50, -M_PI, M_PI));
1013  vTrack2DHistos_.push_back(book<TH2F>("h2_d0_vs_phi", "Transverse Impact Parameter vs. #phi;#phi_{Track};d_{0} [cm]", 100, -M_PI, M_PI, 100, -1., 1.));
1014  vTrack2DHistos_.push_back(book<TH2F>("h2_dz_vs_phi", "Longitudinal Impact Parameter vs. #phi;#phi_{Track};d_{z} [cm]",100, -M_PI, M_PI, 100, -100., 100.));
1015  vTrack2DHistos_.push_back(book<TH2F>("h2_d0_vs_eta", "Transverse Impact Parameter vs. #eta;#eta_{Track};d_{0} [cm]", 100, -etaMax_, etaMax_, 100, -1., 1.));
1016  vTrack2DHistos_.push_back(book<TH2F>("h2_dz_vs_eta", "Longitudinal Impact Parameter vs. #eta;#eta_{Track};d_{z} [cm]", 100, -etaMax_, etaMax_, 100, -100., 100.));
1017  vTrack2DHistos_.push_back(book<TH2F>("h2_chi2_vs_phi", "#chi^{2} vs. #phi;#phi_{Track};#chi^{2}", 100, -M_PI, M_PI, 500, 0., 500.));
1018  vTrack2DHistos_.push_back(book<TH2F>("h2_chi2Prob_vs_phi", "#chi^{2} probability vs. #phi;#phi_{Track};#chi^{2} probability", 100, -M_PI, M_PI, 100, 0., 1.));
1019  vTrack2DHistos_.push_back(book<TH2F>("h2_chi2Prob_vs_d0", "#chi^{2} probability vs. |d_{0}|;|d_{0}| [cm];#chi^{2} probability", 100, 0, 80, 100, 0., 1.));
1020  vTrack2DHistos_.push_back(book<TH2F>("h2_normchi2_vs_phi", "#chi^{2}/ndof vs. #phi;#phi_{Track};#chi^{2}/ndof", 100, -M_PI, M_PI, 100, 0., 10.));
1021  vTrack2DHistos_.push_back(book<TH2F>("h2_chi2_vs_eta", "#chi^{2} vs. #eta;#eta_{Track};#chi^{2}", 100, -etaMax_, etaMax_, 500, 0., 500.));
1022  vTrack2DHistos_.push_back(book<TH2F>("h2_chi2Prob_vs_eta", "#chi^{2} probaility vs. #eta;#eta_{Track};#chi^{2} probability", 100, -etaMax_, etaMax_, 100, 0., 1.));
1023  vTrack2DHistos_.push_back(book<TH2F>("h2_normchi2_vs_eta", "#chi^{2}/ndof vs. #eta;#eta_{Track};#chi^{2}/ndof", 100, -etaMax_, etaMax_, 100, 0., 10.));
1024  vTrack2DHistos_.push_back(book<TH2F>("h2_kappa_vs_phi", "#kappa vs. #phi;#phi_{Track};#kappa", 100, -M_PI, M_PI, 100, .0, .05));
1025  vTrack2DHistos_.push_back(book<TH2F>("h2_kappa_vs_eta", "#kappa vs. #eta;#eta_{Track};#kappa", 100, -etaMax_, etaMax_, 100, .0, .05));
1026  vTrack2DHistos_.push_back(book<TH2F>("h2_normchi2_vs_kappa", "#kappa vs. #chi^{2}/ndof;#chi^{2}/ndof;#kappa", 100, 0., 10, 100, -.03, .03));
1027 
1028  // clang-format on
1029 
1030  } //beginJob
1031 
1032  //*************************************************************
1033  void endJob() override
1034  //*************************************************************
1035  {
1036  edm::LogPrint("GeneralPurposeTrackAnalyzer") << "*******************************" << std::endl;
1037  edm::LogPrint("GeneralPurposeTrackAnalyzer") << "Events run in total: " << ievt << std::endl;
1038  edm::LogPrint("GeneralPurposeTrackAnalyzer") << "n. tracks: " << itrks << std::endl;
1039  edm::LogPrint("GeneralPurposeTrackAnalyzer") << "*******************************" << std::endl;
1040 
1041  int nFiringTriggers = !triggerMap_.empty() ? triggerMap_.size() : 1;
1042  edm::LogPrint("GeneralPurposeTrackAnalyzer") << "firing triggers: " << triggerMap_.size() << std::endl;
1043  edm::LogPrint("GeneralPurposeTrackAnalyzer") << "*******************************" << std::endl;
1044 
1045  tksByTrigger_ =
1046  book<TH1D>("tksByTrigger", "tracks by HLT path;;% of # traks", nFiringTriggers, -0.5, nFiringTriggers - 0.5);
1047  evtsByTrigger_ =
1048  book<TH1D>("evtsByTrigger", "events by HLT path;;% of # events", nFiringTriggers, -0.5, nFiringTriggers - 0.5);
1049 
1050  int i = 0;
1051  for (const auto &it : triggerMap_) {
1052  i++;
1053 
1054  double trkpercent = ((it.second).second) * 100. / double(itrks);
1055  double evtpercent = ((it.second).first) * 100. / double(ievt);
1056 
1057  std::cout.precision(4);
1058 
1059  edm::LogPrint("GeneralPurposeTrackAnalyzer")
1060  << "HLT path: " << std::setw(60) << std::left << it.first << " | events firing: " << std::right
1061  << std::setw(8) << (it.second).first << " (" << std::setw(8) << std::fixed << std::setprecision(4)
1062  << evtpercent << "%)"
1063  << " | tracks collected: " << std::setw(10) << (it.second).second << " (" << std::setw(8) << std::fixed
1064  << std::setprecision(4) << trkpercent << "%)";
1065 
1066  tksByTrigger_->SetBinContent(i, trkpercent);
1067  tksByTrigger_->GetXaxis()->SetBinLabel(i, (it.first).c_str());
1068 
1069  evtsByTrigger_->SetBinContent(i, evtpercent);
1070  evtsByTrigger_->GetXaxis()->SetBinLabel(i, (it.first).c_str());
1071  }
1072 
1073  int nRuns = conditionsMap_.size();
1074  if (nRuns < 1) {
1075  edm::LogPrint("GeneralPurposeTrackAnalyzer") << "*******************************"
1076  << "\n"
1077  << " no run was processed! "
1078  << "\n"
1079  << "*******************************";
1080 
1081  return;
1082  }
1083 
1084  std::vector<int> theRuns_;
1085  theRuns_.reserve(conditionsMap_.size());
1086  for (const auto &it : conditionsMap_) {
1087  theRuns_.push_back(it.first);
1088  }
1089 
1090  sort(theRuns_.begin(), theRuns_.end());
1091  int runRange = theRuns_.back() - theRuns_.front() + 1;
1092 
1093  edm::LogPrint("GeneralPurposeTrackAnalyzer") << "*******************************"
1094  << "\n"
1095  << "first run: " << theRuns_.front() << "\n"
1096  << "last run: " << theRuns_.back() << "\n"
1097  << "considered runs: " << nRuns << "\n"
1098  << "*******************************";
1099 
1100  modeByRun_ = book<TH1D>("modeByRun",
1101  "Strip APV mode by run number;;APV mode (-1=deco,+1=peak)",
1102  runRange,
1103  theRuns_.front() - 0.5,
1104  theRuns_.back() + 0.5);
1105 
1106  fieldByRun_ = book<TH1D>("fieldByRun",
1107  "CMS B-field intensity by run number;;B-field intensity [T]",
1108  runRange,
1109  theRuns_.front() - 0.5,
1110  theRuns_.back() + 0.5);
1111 
1112  edm::LogPrint("") << __PRETTY_FUNCTION__ << " line: " << __LINE__ << std::endl;
1113 
1114  for (const auto &the_r : theRuns_) {
1115  if (conditionsMap_.find(the_r)->second.first != 0) {
1116  edm::LogPrint("GeneralPurposeTrackAnalyzer")
1117  << "run:" << the_r << " | isPeak: " << std::setw(4) << conditionsMap_.find(the_r)->second.first
1118  << "| B-field: " << conditionsMap_.find(the_r)->second.second << " [T]"
1119  << "| events: " << std::setw(10) << runInfoMap_.find(the_r)->second.first << ", tracks " << std::setw(10)
1120  << runInfoMap_.find(the_r)->second.second << std::endl;
1121  }
1122 
1123  modeByRun_->SetBinContent((the_r - theRuns_.front()) + 1, conditionsMap_.find(the_r)->second.first);
1124  fieldByRun_->SetBinContent((the_r - theRuns_.front()) + 1, conditionsMap_.find(the_r)->second.second);
1125  modeByRun_->GetXaxis()->SetBinLabel((the_r - theRuns_.front()) + 1, std::to_string(the_r).c_str());
1126  fieldByRun_->GetXaxis()->SetBinLabel((the_r - theRuns_.front()) + 1, std::to_string(the_r).c_str());
1127  }
1128 
1129  static const int kappadiffindex = this->index(vTrackHistos_, "h_diff_curvature");
1130  vTrackHistos_[kappadiffindex]->Add(vTrackHistos_[this->index(vTrackHistos_, "h_curvature_neg")],
1131  vTrackHistos_[this->index(vTrackHistos_, "h_curvature_pos")],
1132  -1,
1133  1);
1134 
1135  if (phase_ < SiPixelPI::phase::two) {
1136  if (phase_ == SiPixelPI::phase::zero) {
1137  pmap->save(true, 0, 0, "PixelHitMap.pdf", 600, 800);
1138  pmap->save(true, 0, 0, "PixelHitMap.png", 500, 750);
1139  }
1140 
1141  tmap->save(true, 0, 0, "StripHitMap.pdf");
1142  tmap->save(true, 0, 0, "StripHitMap.png");
1143 
1144  gStyle->SetPalette(kRainBow);
1145  pixelmap->beautifyAllHistograms();
1146 
1147  TCanvas cB("CanvBarrel", "CanvBarrel", 1200, 1000);
1148  pixelmap->drawBarrelMaps("entriesBarrel", cB);
1149  cB.SaveAs("pixelBarrelEntries.png");
1150 
1151  TCanvas cF("CanvForward", "CanvForward", 1600, 1000);
1152  pixelmap->drawForwardMaps("entriesForward", cF);
1153  cF.SaveAs("pixelForwardEntries.png");
1154 
1155  TCanvas cRocs = TCanvas("cRocs", "cRocs", 1200, 1600);
1156  pixelrocsmap_->drawMaps(cRocs, "Pixel on-track clusters occupancy");
1157  cRocs.SaveAs("Phase1PixelROCMaps_fullROCs.png");
1158  }
1159  }
1160 
1161  //*************************************************************
1163  //*************************************************************
1164  {
1165  bool countStereoHitAs2D_ = true;
1166  // we count SiStrip stereo modules as 2D if selected via countStereoHitAs2D_
1167  // (since they provide theta information)
1168  if (!hit.isValid() ||
1169  (hit.dimension() < 2 && !countStereoHitAs2D_ && !dynamic_cast<const SiStripRecHit1D *>(&hit))) {
1170  return false; // real RecHit1D - but SiStripRecHit1D depends on countStereoHitAs2D_
1171  } else {
1172  const DetId detId(hit.geographicalId());
1173  if (detId.det() == DetId::Tracker) {
1174  if (detId.subdetId() == kBPIX || detId.subdetId() == kFPIX) {
1175  return true; // pixel is always 2D
1176  } else { // should be SiStrip now
1177  const SiStripDetId stripId(detId);
1178  if (stripId.stereo())
1179  return countStereoHitAs2D_; // stereo modules
1180  else if (dynamic_cast<const SiStripRecHit1D *>(&hit) || dynamic_cast<const SiStripRecHit2D *>(&hit))
1181  return false; // rphi modules hit
1182  //the following two are not used any more since ages...
1183  else if (dynamic_cast<const SiStripMatchedRecHit2D *>(&hit))
1184  return true; // matched is 2D
1185  else if (dynamic_cast<const ProjectedSiStripRecHit2D *>(&hit)) {
1186  const ProjectedSiStripRecHit2D *pH = static_cast<const ProjectedSiStripRecHit2D *>(&hit);
1187  return (countStereoHitAs2D_ && this->isHit2D(pH->originalHit())); // depends on original...
1188  } else {
1189  edm::LogError("UnknownType") << "@SUB=GeneralPurposeTrackAnalyzer::isHit2D"
1190  << "Tracker hit not in pixel, neither SiStripRecHit[12]D nor "
1191  << "SiStripMatchedRecHit2D nor ProjectedSiStripRecHit2D.";
1192  return false;
1193  }
1194  }
1195  } else { // not tracker??
1196  edm::LogWarning("DetectorMismatch") << "@SUB=GeneralPurposeTrackAnalyzer::isHit2D"
1197  << "Hit not in tracker with 'official' dimension >=2.";
1198  return true; // dimension() >= 2 so accept that...
1199  }
1200  }
1201  // never reached...
1202  }
1203 };
1204 
1205 //*************************************************************
1207 //*************************************************************
1208 {
1210  desc.setComment("Generic track analyzer to check ALCARECO sample quantities");
1211  desc.add<edm::InputTag>("TkTag", edm::InputTag("generalTracks"));
1212  desc.add<edm::InputTag>("TriggerResultsTag", edm::InputTag("TriggerResults", "", "HLT"));
1213  desc.add<edm::InputTag>("BeamSpotTag", edm::InputTag("offlineBeamSpot"));
1214  desc.add<edm::InputTag>("VerticesTag", edm::InputTag("offlinePrimaryVertices"));
1215  desc.add<bool>("isCosmics", false);
1216  desc.add<bool>("doLatencyAnalysis", true);
1217  descriptions.addWithDefaultLabel(desc);
1218 }
1219 
static const std::string kSharedResource
Definition: TFileService.h:76
void analyze(const edm::Event &event, const edm::EventSetup &setup) override
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
std::map< int, std::pair< int, float > > conditionsMap_
double z() const
z coordinate
Definition: Vertex.h:134
edm::EDGetTokenT< edm::TriggerResults > hltresultsToken_
edm::EDGetTokenT< reco::TrackCollection > theTrackCollectionToken_
T z() const
Definition: PV3DBase.h:61
Strings const & triggerNames() const
Definition: TriggerNames.cc:48
virtual GlobalVector inTesla(const GlobalPoint &gp) const =0
Field value ad specified global point, in Tesla.
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
std::unique_ptr< TrackerMap > tmap
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:14
GlobalVector inInverseGeV(const GlobalPoint &gp) const
Field value ad specified global point, in 1/Gev.
Definition: MagneticField.h:36
static void fillDescriptions(edm::ConfigurationDescriptions &)
std::unique_ptr< TrackerMap > pmap
Log< level::Error, false > LogError
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:31
void beginRun(edm::Run const &run, edm::EventSetup const &setup) override
const int kFPIX
static std::string to_string(const XMLCh *ch)
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > geomTokenBR_
U second(std::pair< T, U > const &p)
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
T const * product() const
Definition: ESHandle.h:86
edm::ESHandle< MagneticField > magneticField_
std::map< std::string, std::pair< int, int > > triggerMap_
edm::EDGetTokenT< reco::VertexCollection > vertexToken_
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
bool isThere(GeomDetEnumerators::SubDetector subdet) const
GeneralPurposeTrackAnalyzer(const edm::ParameterSet &pset)
uint32_t stereo() const
Definition: SiStripDetId.h:168
T mag() const
Definition: PV3DBase.h:64
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Transition
Definition: Transition.h:12
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::map< int, std::pair< int, int > > runInfoMap_
double x() const
x coordinate
Definition: Vertex.h:130
trackCollection
Definition: JetHT_cfg.py:51
Log< level::Warning, true > LogPrint
const TrackerGeomDet * idToDet(DetId) const override
double y() const
y coordinate
Definition: Vertex.h:132
const char * qualities[3]
#define M_PI
edm::EDGetTokenT< reco::BeamSpot > beamspotToken_
Log< level::Info, false > LogInfo
Detector identifier class for the strip tracker.
Definition: SiStripDetId.h:18
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magFieldToken_
Definition: DetId.h:17
int16_t singleReadOutMode() const
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > trackerTopologyTokenBR_
std::string const & triggerName(unsigned int index) const
Definition: TriggerNames.cc:50
edm::ESGetToken< SiStripLatency, SiStripLatencyRcd > latencyToken_
static const std::string algoNames[]
Definition: TrackBase.h:147
void endRun(edm::Run const &, edm::EventSetup const &) override
bool isValid() const
Definition: HandleBase.h:70
std::unique_ptr< Phase1PixelROCMaps > pixelrocsmap_
HLT enums.
SiStripRecHit2D originalHit() const
col
Definition: cuy.py:1009
T * book(const Args &...args) const
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
Log< level::Warning, false > LogWarning
std::unique_ptr< Phase1PixelMaps > pixelmap
const int kBPIX
long double T
bool isHit2D(const TrackingRecHit &hit)
~GeneralPurposeTrackAnalyzer() override=default
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5
const edm::ESGetToken< SiPixelFedCablingMap, SiPixelFedCablingMapRcd > siPixelFedCablingMapTokenBR_
std::optional< SiPixelCoordinates > coord_
Definition: event.py:1
Definition: Run.h:45
Geom::Theta< T > theta() const
Definition: PV3DBase.h:72
Our base class.
Definition: SiPixelRecHit.h:23
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > geomToken_
int index(const std::vector< OBJECT_TYPE *> &vec, const TString &name)