CMS 3D CMS Logo

SiPixelLorentzAnglePCLWorker.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: CalibTracker/SiPixelLorentzAnglePCLWorker
4 // Class: SiPixelLorentzAnglePCLWorker
5 //
11 //
12 // Original Author: mmusich
13 // Created: Sat, 29 May 2021 14:46:19 GMT
14 //
15 //
16 
17 // system includes
18 #include <string>
19 #include <fmt/printf.h>
20 
21 // user include files
57 
58 // ROOT includes
59 #include <TTree.h>
60 #include <TFile.h>
61 #include <fstream>
62 
63 //
64 // class declaration
65 //
66 
67 static const int maxpix = 1000;
68 struct Pixinfo {
69  int npix;
70  float row[maxpix];
71  float col[maxpix];
72  float adc[maxpix];
73  float x[maxpix];
74  float y[maxpix];
75 };
76 
77 struct Hit {
78  float x;
79  float y;
80  double alpha;
81  double beta;
82  double gamma;
83 };
84 struct Clust {
85  float x;
86  float y;
87  float charge;
88  int size_x;
89  int size_y;
90  int maxPixelCol;
91  int maxPixelRow;
92  int minPixelCol;
93  int minPixelRow;
94 };
95 struct Rechit {
96  float x;
97  float y;
98 };
99 
101 public:
103  ~SiPixelLorentzAnglePCLWorker() override = default;
104 
105  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
106 
107 private:
108  void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
109 
110  void analyze(edm::Event const&, edm::EventSetup const&) override;
111 
112  void dqmBeginRun(edm::Run const&, edm::EventSetup const&) override;
113 
114  void dqmEndRun(edm::Run const&, edm::EventSetup const&);
115 
116  const Pixinfo fillPix(const SiPixelCluster& LocPix, const PixelTopology* topol) const;
117  const std::pair<LocalPoint, LocalPoint> surface_deformation(const PixelTopology* topol,
119  const SiPixelRecHit* recHitPix) const;
120  // ------------ member data ------------
122 
123  // template stuff
126  std::vector<SiPixelTemplateStore> thePixelTemp_;
127 
129  bool notInPCL_;
131  std::vector<std::string> newmodulelist_;
132 
133  // tree branches barrel
134  int run_;
135  long int event_;
137  int bx_;
138  int orbit_;
139  int module_;
140  int ladder_;
141  int layer_;
143  float pt_;
144  float eta_;
145  float phi_;
146  double chi2_;
147  double ndof_;
155  float qScale_;
156  float rQmQt_;
157 
158  // tree branches forward
159  int sideF_;
160  int diskF_;
161  int bladeF_;
162  int panelF_;
163  int moduleF_;
171  float qScaleF_;
172  float rQmQtF_;
173 
174  // parameters from config file
175  double ptmin_;
176  double normChi2Max_;
177  std::vector<int> clustSizeYMin_;
179  double residualMax_;
183 
184  std::unique_ptr<TFile> hFile_;
185  std::unique_ptr<TTree> SiPixelLorentzAngleTreeBarrel_;
186  std::unique_ptr<TTree> SiPixelLorentzAngleTreeForward_;
187 
188  // es consumes
194 
195  // event consumes
197 };
198 
199 //
200 // constructors and destructor
201 //
203  : folder_(iConfig.getParameter<std::string>("folder")),
204  notInPCL_(iConfig.getParameter<bool>("notInPCL")),
205  filename_(iConfig.getParameter<std::string>("fileName")),
206  newmodulelist_(iConfig.getParameter<std::vector<std::string>>("newmodulelist")),
207  ptmin_(iConfig.getParameter<double>("ptMin")),
208  normChi2Max_(iConfig.getParameter<double>("normChi2Max")),
209  clustSizeYMin_(iConfig.getParameter<std::vector<int>>("clustSizeYMin")),
210  clustSizeXMax_(iConfig.getParameter<int>("clustSizeXMax")),
211  residualMax_(iConfig.getParameter<double>("residualMax")),
212  clustChargeMaxPerLength_(iConfig.getParameter<double>("clustChargeMaxPerLength")),
213  hist_depth_(iConfig.getParameter<int>("binsDepth")),
214  hist_drift_(iConfig.getParameter<int>("binsDrift")),
215  geomEsToken_(esConsumes<edm::Transition::BeginRun>()),
216  topoEsToken_(esConsumes<edm::Transition::BeginRun>()),
217  siPixelTemplateEsToken_(esConsumes<edm::Transition::BeginRun>()),
218  topoPerEventEsToken_(esConsumes()),
219  geomPerEventEsToken_(esConsumes()) {
220  t_trajTrack = consumes<TrajTrackAssociationCollection>(iConfig.getParameter<edm::InputTag>("src"));
221 
222  // now do what ever initialization is needed
223  int bufsize = 64000;
224 
225  // create tree structure
226  // Barrel pixel
227  if (notInPCL_) {
228  hFile_ = std::make_unique<TFile>(filename_.c_str(), "RECREATE");
230  std::make_unique<TTree>("SiPixelLorentzAngleTreeBarrel_", "SiPixel LorentzAngle tree barrel", bufsize);
231  SiPixelLorentzAngleTreeBarrel_->Branch("run", &run_, "run/I", bufsize);
232  SiPixelLorentzAngleTreeBarrel_->Branch("event", &event_, "event/l", bufsize);
233  SiPixelLorentzAngleTreeBarrel_->Branch("lumiblock", &lumiblock_, "lumiblock/I", bufsize);
234  SiPixelLorentzAngleTreeBarrel_->Branch("bx", &bx_, "bx/I", bufsize);
235  SiPixelLorentzAngleTreeBarrel_->Branch("orbit", &orbit_, "orbit/I", bufsize);
236  SiPixelLorentzAngleTreeBarrel_->Branch("module", &module_, "module/I", bufsize);
237  SiPixelLorentzAngleTreeBarrel_->Branch("ladder", &ladder_, "ladder/I", bufsize);
238  SiPixelLorentzAngleTreeBarrel_->Branch("layer", &layer_, "layer/I", bufsize);
239  SiPixelLorentzAngleTreeBarrel_->Branch("isflipped", &isflipped_, "isflipped/I", bufsize);
240  SiPixelLorentzAngleTreeBarrel_->Branch("pt", &pt_, "pt/F", bufsize);
241  SiPixelLorentzAngleTreeBarrel_->Branch("eta", &eta_, "eta/F", bufsize);
242  SiPixelLorentzAngleTreeBarrel_->Branch("phi", &phi_, "phi/F", bufsize);
243  SiPixelLorentzAngleTreeBarrel_->Branch("chi2", &chi2_, "chi2/D", bufsize);
244  SiPixelLorentzAngleTreeBarrel_->Branch("ndof", &ndof_, "ndof/D", bufsize);
245  SiPixelLorentzAngleTreeBarrel_->Branch("trackhit", &trackhit_, "x/F:y/F:alpha/D:beta/D:gamma_/D", bufsize);
246  SiPixelLorentzAngleTreeBarrel_->Branch("npix", &pixinfo_.npix, "npix/I", bufsize);
247  SiPixelLorentzAngleTreeBarrel_->Branch("rowpix", pixinfo_.row, "row[npix]/F", bufsize);
248  SiPixelLorentzAngleTreeBarrel_->Branch("colpix", pixinfo_.col, "col[npix]/F", bufsize);
249  SiPixelLorentzAngleTreeBarrel_->Branch("adc", pixinfo_.adc, "adc[npix]/F", bufsize);
250  SiPixelLorentzAngleTreeBarrel_->Branch("xpix", pixinfo_.x, "x[npix]/F", bufsize);
251  SiPixelLorentzAngleTreeBarrel_->Branch("ypix", pixinfo_.y, "y[npix]/F", bufsize);
252 
254  "clust",
255  &clust_,
256  "x/F:y/F:charge/F:size_x/I:size_y/I:maxPixelCol/I:maxPixelRow:minPixelCol/I:minPixelRow/I",
257  bufsize);
258  SiPixelLorentzAngleTreeBarrel_->Branch("rechit", &rechit_, "x/F:y/F", bufsize);
259  SiPixelLorentzAngleTreeBarrel_->Branch("rechit_corr", &rechitCorr_, "x/F:y/F", bufsize);
260  SiPixelLorentzAngleTreeBarrel_->Branch("trackhitcorr_x", &trackhitCorrX_, "trackhitcorr_x/F", bufsize);
261  SiPixelLorentzAngleTreeBarrel_->Branch("trackhitcorr_y", &trackhitCorrY_, "trackhitcorr_y/F", bufsize);
262  SiPixelLorentzAngleTreeBarrel_->Branch("qScale", &qScale_, "qScale/F", bufsize);
263  SiPixelLorentzAngleTreeBarrel_->Branch("rQmQt", &rQmQt_, "rQmQt/F", bufsize);
264  // Forward pixel
265 
267  std::make_unique<TTree>("SiPixelLorentzAngleTreeForward_", "SiPixel LorentzAngle tree forward", bufsize);
268  SiPixelLorentzAngleTreeForward_->Branch("run", &run_, "run/I", bufsize);
269  SiPixelLorentzAngleTreeForward_->Branch("event", &event_, "event/l", bufsize);
270  SiPixelLorentzAngleTreeForward_->Branch("lumiblock", &lumiblock_, "lumiblock/I", bufsize);
271  SiPixelLorentzAngleTreeForward_->Branch("bx", &bx_, "bx/I", bufsize);
272  SiPixelLorentzAngleTreeForward_->Branch("orbit", &orbit_, "orbit/I", bufsize);
273  SiPixelLorentzAngleTreeForward_->Branch("side", &sideF_, "side/I", bufsize);
274  SiPixelLorentzAngleTreeForward_->Branch("disk", &diskF_, "disk/I", bufsize);
275  SiPixelLorentzAngleTreeForward_->Branch("blade", &bladeF_, "blade/I", bufsize);
276  SiPixelLorentzAngleTreeForward_->Branch("panel", &panelF_, "panel/I", bufsize);
277  SiPixelLorentzAngleTreeForward_->Branch("module", &moduleF_, "module/I", bufsize);
278  SiPixelLorentzAngleTreeForward_->Branch("pt", &pt_, "pt/F", bufsize);
279  SiPixelLorentzAngleTreeForward_->Branch("eta", &eta_, "eta/F", bufsize);
280  SiPixelLorentzAngleTreeForward_->Branch("phi", &phi_, "phi/F", bufsize);
281  SiPixelLorentzAngleTreeForward_->Branch("chi2", &chi2_, "chi2/D", bufsize);
282  SiPixelLorentzAngleTreeForward_->Branch("ndof", &ndof_, "ndof/D", bufsize);
283  SiPixelLorentzAngleTreeForward_->Branch("trackhit", &trackhitF_, "x/F:y/F:alpha/D:beta/D:gamma_/D", bufsize);
284  SiPixelLorentzAngleTreeForward_->Branch("npix", &pixinfoF_.npix, "npix/I", bufsize);
285  SiPixelLorentzAngleTreeForward_->Branch("rowpix", pixinfoF_.row, "row[npix]/F", bufsize);
286  SiPixelLorentzAngleTreeForward_->Branch("colpix", pixinfoF_.col, "col[npix]/F", bufsize);
287  SiPixelLorentzAngleTreeForward_->Branch("adc", pixinfoF_.adc, "adc[npix]/F", bufsize);
288  SiPixelLorentzAngleTreeForward_->Branch("xpix", pixinfoF_.x, "x[npix]/F", bufsize);
289  SiPixelLorentzAngleTreeForward_->Branch("ypix", pixinfoF_.y, "y[npix]/F", bufsize);
290 
292  "clust",
293  &clustF_,
294  "x/F:y/F:charge/F:size_x/I:size_y/I:maxPixelCol/I:maxPixelRow:minPixelCol/I:minPixelRow/I",
295  bufsize);
296  SiPixelLorentzAngleTreeForward_->Branch("rechit", &rechitF_, "x/F:y/F", bufsize);
297  SiPixelLorentzAngleTreeForward_->Branch("rechit_corr", &rechitCorrF_, "x/F:y/F", bufsize);
298  SiPixelLorentzAngleTreeForward_->Branch("trackhitcorr_x", &trackhitCorrXF_, "trackhitcorr_x/F", bufsize);
299  SiPixelLorentzAngleTreeForward_->Branch("trackhitcorr_y", &trackhitCorrYF_, "trackhitcorr_y/F", bufsize);
300  SiPixelLorentzAngleTreeForward_->Branch("qScale", &qScaleF_, "qScale/F", bufsize);
301  SiPixelLorentzAngleTreeForward_->Branch("rQmQt", &rQmQtF_, "rQmQt/F", bufsize);
302  }
303 }
304 
305 //
306 // member functions
307 //
308 
309 // ------------ method called for each event ------------
310 
312  // Retrieve tracker topology from geometry
313  const TrackerTopology* const tTopo = &iSetup.getData(topoPerEventEsToken_);
314 
315  // Retrieve track geometry
317 
318  // get the association map between tracks and trajectories
319  edm::Handle<TrajTrackAssociationCollection> trajTrackCollectionHandle;
320  iEvent.getByToken(t_trajTrack, trajTrackCollectionHandle);
321 
322  module_ = -1;
323  layer_ = -1;
324  ladder_ = -1;
325  isflipped_ = -1;
326  pt_ = -999;
327  eta_ = 999;
328  phi_ = 999;
329  pixinfo_.npix = 0;
330 
331  run_ = iEvent.id().run();
332  event_ = iEvent.id().event();
333  lumiblock_ = iEvent.luminosityBlock();
334  bx_ = iEvent.bunchCrossing();
335  orbit_ = iEvent.orbitNumber();
336 
337  if (!trajTrackCollectionHandle->empty()) {
338  for (TrajTrackAssociationCollection::const_iterator it = trajTrackCollectionHandle->begin();
339  it != trajTrackCollectionHandle->end();
340  ++it) {
341  const reco::Track& track = *it->val;
342  const Trajectory& traj = *it->key;
343 
344  // get the trajectory measurements
345  std::vector<TrajectoryMeasurement> tmColl = traj.measurements();
346  pt_ = track.pt();
347  eta_ = track.eta();
348  phi_ = track.phi();
349  chi2_ = traj.chiSquared();
350  ndof_ = traj.ndof();
351 
352  if (pt_ < ptmin_)
353  continue;
354 
359  iHists.h_tracks_->Fill(0);
360  bool pixeltrack = false;
361 
362  // iterate over trajectory measurements
363  for (const auto& itTraj : tmColl) {
364  if (!itTraj.updatedState().isValid())
365  continue;
366  const TransientTrackingRecHit::ConstRecHitPointer& recHit = itTraj.recHit();
367  if (!recHit->isValid() || recHit->geographicalId().det() != DetId::Tracker)
368  continue;
369  unsigned int subDetID = (recHit->geographicalId().subdetId());
370  if (subDetID == PixelSubdetector::PixelBarrel || subDetID == PixelSubdetector::PixelEndcap) {
371  if (!pixeltrack) {
372  iHists.h_tracks_->Fill(1);
373  }
374  pixeltrack = true;
375  }
376 
377  if (subDetID == PixelSubdetector::PixelBarrel) {
378  DetId detIdObj = recHit->geographicalId();
379  const PixelGeomDetUnit* theGeomDet = dynamic_cast<const PixelGeomDetUnit*>(tracker->idToDet(detIdObj));
380  if (!theGeomDet)
381  continue;
382 
383  const PixelTopology* topol = &(theGeomDet->specificTopology());
384 
385  float ypitch_ = topol->pitch().second;
386  float width_ = theGeomDet->surface().bounds().thickness();
387 
388  if (!topol)
389  continue;
390 
391  layer_ = tTopo->pxbLayer(detIdObj);
392  ladder_ = tTopo->pxbLadder(detIdObj);
393  module_ = tTopo->pxbModule(detIdObj);
394 
395  float tmp1 = theGeomDet->surface().toGlobal(Local3DPoint(0., 0., 0.)).perp();
396  float tmp2 = theGeomDet->surface().toGlobal(Local3DPoint(0., 0., 1.)).perp();
397 
398  isflipped_ = (tmp2 < tmp1) ? 1 : 0;
399 
400  const SiPixelRecHit* recHitPix = dynamic_cast<const SiPixelRecHit*>((*recHit).hit());
401  if (!recHitPix)
402  continue;
403  rechit_.x = recHitPix->localPosition().x();
404  rechit_.y = recHitPix->localPosition().y();
405  SiPixelRecHit::ClusterRef const& cluster = recHitPix->cluster();
406 
407  pixinfo_ = fillPix(*cluster, topol);
408 
409  // fill entries in clust_
410 
411  clust_.x = (cluster)->x();
412  clust_.y = (cluster)->y();
413  clust_.charge = (cluster->charge()) / 1000.; // clust_.charge: in the unit of 1000e
414  clust_.size_x = cluster->sizeX();
415  clust_.size_y = cluster->sizeY();
416  clust_.maxPixelCol = cluster->maxPixelCol();
417  clust_.maxPixelRow = cluster->maxPixelRow();
418  clust_.minPixelCol = cluster->minPixelCol();
419  clust_.minPixelRow = cluster->minPixelRow();
420 
421  // fill the trackhit info
422  TrajectoryStateOnSurface tsos = itTraj.updatedState();
423  if (!tsos.isValid()) {
424  edm::LogWarning("SiPixelLorentzAnglePCLWorker") << "tsos not valid";
425  continue;
426  }
427  LocalVector trackdirection = tsos.localDirection();
428  LocalPoint trackposition = tsos.localPosition();
429 
430  if (trackdirection.z() == 0)
431  continue;
432  // the local position and direction
433  trackhit_.alpha = atan2(trackdirection.z(), trackdirection.x());
434  trackhit_.beta = atan2(trackdirection.z(), trackdirection.y());
435  trackhit_.gamma = atan2(trackdirection.x(), trackdirection.y());
436  trackhit_.x = trackposition.x();
437  trackhit_.y = trackposition.y();
438 
439  // get qScale_ = templ.qscale() and templ.r_qMeas_qTrue();
440  float cotalpha = trackdirection.x() / trackdirection.z();
441  float cotbeta = trackdirection.y() / trackdirection.z();
442  float cotbeta_min = clustSizeYMin_[layer_ - 1] * ypitch_ / width_;
443  if (fabs(cotbeta) <= cotbeta_min)
444  continue;
445  double drdz = sqrt(1. + cotalpha * cotalpha + cotbeta * cotbeta);
446  double clusterCharge_cut = clustChargeMaxPerLength_ * drdz;
447 
448  auto detId = detIdObj.rawId();
449  int DetId_index = -1;
450 
451  const auto& newModIt = (std::find(iHists.BPixnewDetIds_.begin(), iHists.BPixnewDetIds_.end(), detId));
452  bool isNewMod = (newModIt != iHists.BPixnewDetIds_.end());
453  if (isNewMod) {
454  DetId_index = std::distance(iHists.BPixnewDetIds_.begin(), newModIt);
455  }
456 
457  if (notInPCL_) {
458  // fill the template from the store (from dqmBeginRun)
459  SiPixelTemplate theTemplate(thePixelTemp_);
460 
461  float locBx = (cotbeta < 0.) ? -1 : 1.;
462  float locBz = (cotalpha < 0.) ? -locBx : locBx;
463 
464  int TemplID = templateDBobject_->getTemplateID(detId);
465  theTemplate.interpolate(TemplID, cotalpha, cotbeta, locBz, locBx);
466  qScale_ = theTemplate.qscale();
467  rQmQt_ = theTemplate.r_qMeas_qTrue();
468  }
469 
470  // Surface deformation
471  const auto& lp_pair = surface_deformation(topol, tsos, recHitPix);
472 
473  LocalPoint lp_track = lp_pair.first;
474  LocalPoint lp_rechit = lp_pair.second;
475 
476  rechitCorr_.x = lp_rechit.x();
477  rechitCorr_.y = lp_rechit.y();
478  trackhitCorrX_ = lp_track.x();
479  trackhitCorrY_ = lp_track.y();
480 
481  if (notInPCL_) {
483  }
484 
485  // is one pixel in cluster a large pixel ? (hit will be excluded)
486  bool large_pix = false;
487  for (int j = 0; j < pixinfo_.npix; j++) {
488  int colpos = static_cast<int>(pixinfo_.col[j]);
489  if (pixinfo_.row[j] == 0 || pixinfo_.row[j] == 79 || pixinfo_.row[j] == 80 || pixinfo_.row[j] == 159 ||
490  colpos % 52 == 0 || colpos % 52 == 51) {
491  large_pix = true;
492  }
493  }
494 
495  double residualsq = (trackhitCorrX_ - rechitCorr_.x) * (trackhitCorrX_ - rechitCorr_.x) +
497 
498  double xlim1 = trackhitCorrX_ - width_ * cotalpha / 2.;
499  double hypitch_ = ypitch_ / 2.;
500  double ylim1 = trackhitCorrY_ - width_ * cotbeta / 2.;
501  double ylim2 = trackhitCorrY_ + width_ * cotbeta / 2.;
502 
503  int clustSizeY_cut = clustSizeYMin_[layer_ - 1];
504 
505  if (!large_pix && (chi2_ / ndof_) < normChi2Max_ && cluster->sizeY() >= clustSizeY_cut &&
506  residualsq < residualMax_ * residualMax_ && cluster->charge() < clusterCharge_cut &&
507  cluster->sizeX() < clustSizeXMax_) {
508  // iterate over pixels in hit
509  for (int j = 0; j < pixinfo_.npix; j++) {
510  // use trackhits and include bowing correction
511  float ypixlow = pixinfo_.y[j] - hypitch_;
512  float ypixhigh = pixinfo_.y[j] + hypitch_;
513  if (cotbeta > 0.) {
514  if (ylim1 > ypixlow)
515  ypixlow = ylim1;
516  if (ylim2 < ypixhigh)
517  ypixhigh = ylim2;
518  } else {
519  if (ylim2 > ypixlow)
520  ypixlow = ylim2;
521  if (ylim1 < ypixhigh)
522  ypixhigh = ylim1;
523  }
524  float ypixavg = 0.5f * (ypixlow + ypixhigh);
525 
526  float dx = (pixinfo_.x[j] - xlim1) * siPixelLACalibration::cmToum; // dx: in the unit of micrometer
527  float dy = (ypixavg - ylim1) * siPixelLACalibration::cmToum; // dy: in the unit of micrometer
528  float depth = dy * tan(trackhit_.beta);
529  float drift = dx - dy * tan(trackhit_.gamma);
530 
531  if (isNewMod == false) {
532  int i_index = module_ + (layer_ - 1) * iHists.nModules_[layer_ - 1];
533  iHists.h_drift_depth_adc_[i_index]->Fill(drift, depth, pixinfo_.adc[j]);
535  iHists.h_drift_depth_noadc_[i_index]->Fill(drift, depth, 1.);
536  iHists.h_bySectOccupancy_->Fill(i_index - 1); // histogram starts at 0
537 
538  if (tracker->getDetectorType(subDetID) == TrackerGeometry::ModuleType::Ph1PXB) {
539  if ((module_ == 3 || module_ == 5) && (layer_ == 3 || layer_ == 4)) {
540  int i_index_merge = i_index + 1;
541  iHists.h_drift_depth_adc_[i_index_merge]->Fill(drift, depth, pixinfo_.adc[j]);
542  iHists.h_drift_depth_adc2_[i_index_merge]->Fill(drift, depth, pixinfo_.adc[j] * pixinfo_.adc[j]);
543  iHists.h_drift_depth_noadc_[i_index_merge]->Fill(drift, depth, 1.);
544  iHists.h_bySectOccupancy_->Fill(i_index_merge - 1);
545  }
546  if ((module_ == 4 || module_ == 6) && (layer_ == 3 || layer_ == 4)) {
547  int i_index_merge = i_index - 1;
548  iHists.h_drift_depth_adc_[i_index_merge]->Fill(drift, depth, pixinfo_.adc[j]);
549  iHists.h_drift_depth_adc2_[i_index_merge]->Fill(drift, depth, pixinfo_.adc[j] * pixinfo_.adc[j]);
550  iHists.h_drift_depth_noadc_[i_index_merge]->Fill(drift, depth, 1.);
551  iHists.h_bySectOccupancy_->Fill(i_index_merge - 1);
552  }
553  }
554 
555  } else {
556  int new_index = iHists.nModules_[iHists.nlay - 1] +
557  (iHists.nlay - 1) * iHists.nModules_[iHists.nlay - 1] + 1 + DetId_index;
558 
559  iHists.h_drift_depth_adc_[new_index]->Fill(drift, depth, pixinfo_.adc[j]);
560  iHists.h_drift_depth_adc2_[new_index]->Fill(drift, depth, pixinfo_.adc[j] * pixinfo_.adc[j]);
561  iHists.h_drift_depth_noadc_[new_index]->Fill(drift, depth, 1.);
562  iHists.h_bySectOccupancy_->Fill(new_index - 1); // histogram starts at 0
563  }
564  }
565  }
566  } else if (subDetID == PixelSubdetector::PixelEndcap) {
567  DetId detIdObj = recHit->geographicalId();
568  const PixelGeomDetUnit* theGeomDet = dynamic_cast<const PixelGeomDetUnit*>(tracker->idToDet(detIdObj));
569  if (!theGeomDet)
570  continue;
571 
572  const PixelTopology* topol = &(theGeomDet->specificTopology());
573 
574  if (!topol)
575  continue;
576 
577  sideF_ = tTopo->pxfSide(detIdObj);
578  diskF_ = tTopo->pxfDisk(detIdObj);
579  bladeF_ = tTopo->pxfBlade(detIdObj);
580  panelF_ = tTopo->pxfPanel(detIdObj);
581  moduleF_ = tTopo->pxfModule(detIdObj);
582 
583  const SiPixelRecHit* recHitPix = dynamic_cast<const SiPixelRecHit*>((*recHit).hit());
584  if (!recHitPix)
585  continue;
586  rechitF_.x = recHitPix->localPosition().x();
587  rechitF_.y = recHitPix->localPosition().y();
588  SiPixelRecHit::ClusterRef const& cluster = recHitPix->cluster();
589 
590  pixinfoF_ = fillPix(*cluster, topol);
591 
592  // fill entries in clust_
593 
594  clustF_.x = (cluster)->x();
595  clustF_.y = (cluster)->y();
596  clustF_.charge = (cluster->charge()) / 1000.; // clustF_.charge: in the unit of 1000e
597  clustF_.size_x = cluster->sizeX();
598  clustF_.size_y = cluster->sizeY();
599  clustF_.maxPixelCol = cluster->maxPixelCol();
600  clustF_.maxPixelRow = cluster->maxPixelRow();
601  clustF_.minPixelCol = cluster->minPixelCol();
602  clustF_.minPixelRow = cluster->minPixelRow();
603 
604  // fill the trackhit info
605  TrajectoryStateOnSurface tsos = itTraj.updatedState();
606  if (!tsos.isValid()) {
607  edm::LogWarning("SiPixelLorentzAnglePCLWorker") << "tsos not valid";
608  continue;
609  }
610  LocalVector trackdirection = tsos.localDirection();
611  LocalPoint trackposition = tsos.localPosition();
612 
613  if (trackdirection.z() == 0)
614  continue;
615  // the local position and direction
616  trackhitF_.alpha = atan2(trackdirection.z(), trackdirection.x());
617  trackhitF_.beta = atan2(trackdirection.z(), trackdirection.y());
618  trackhitF_.gamma = atan2(trackdirection.x(), trackdirection.y());
619  trackhitF_.x = trackposition.x();
620  trackhitF_.y = trackposition.y();
621 
622  float cotalpha = trackdirection.x() / trackdirection.z();
623  float cotbeta = trackdirection.y() / trackdirection.z();
624 
625  auto detId = detIdObj.rawId();
626 
627  if (notInPCL_) {
628  // fill the template from the store (from dqmBeginRun)
629  SiPixelTemplate theTemplate(thePixelTemp_);
630 
631  float locBx = (cotbeta < 0.) ? -1 : 1.;
632  float locBz = (cotalpha < 0.) ? -locBx : locBx;
633 
634  int TemplID = templateDBobject_->getTemplateID(detId);
635  theTemplate.interpolate(TemplID, cotalpha, cotbeta, locBz, locBx);
636  qScaleF_ = theTemplate.qscale();
637  rQmQtF_ = theTemplate.r_qMeas_qTrue();
638  }
639 
640  // Surface deformation
641  const auto& lp_pair = surface_deformation(topol, tsos, recHitPix);
642 
643  LocalPoint lp_track = lp_pair.first;
644  LocalPoint lp_rechit = lp_pair.second;
645 
646  rechitCorrF_.x = lp_rechit.x();
647  rechitCorrF_.y = lp_rechit.y();
648  trackhitCorrXF_ = lp_track.x();
649  trackhitCorrYF_ = lp_track.y();
650  if (notInPCL_) {
652  }
653  }
654  } //end iteration over trajectory measurements
655  } //end iteration over trajectories
656  }
657 }
658 
660  // geometry
661  const TrackerGeometry* geom = &iSetup.getData(geomEsToken_);
662  const TrackerTopology* tTopo = &iSetup.getData(topoEsToken_);
663 
664  if (notInPCL_) {
665  // Initialize 1D templates
666  if (watchSiPixelTemplateRcd_.check(iSetup)) {
669  edm::LogError("SiPixelLorentzAnglePCLWorker")
670  << "Templates not filled correctly. Check the sqlite file. Using SiPixelTemplateDBObject version "
671  << (*templateDBobject_).version();
672  }
673  }
674  }
675 
677  iHists.nlay = geom->numberOfLayers(PixelSubdetector::PixelBarrel);
678  iHists.nModules_.resize(iHists.nlay);
679  for (int i = 0; i < iHists.nlay; i++) {
680  iHists.nModules_[i] = map.getPXBModules(i + 1);
681  }
682 
683  // list of modules already filled, then return (we already entered here)
684  if (!iHists.BPixnewDetIds_.empty() || !iHists.FPixnewDetIds_.empty())
685  return;
686 
687  if (!newmodulelist_.empty()) {
688  for (auto const& modulename : newmodulelist_) {
689  if (modulename.find("BPix_") != std::string::npos) {
690  PixelBarrelName bn(modulename, true);
691  const auto& detId = bn.getDetId(tTopo);
692  iHists.BPixnewmodulename_.push_back(modulename);
693  iHists.BPixnewDetIds_.push_back(detId.rawId());
694  iHists.BPixnewModule_.push_back(bn.moduleName());
695  iHists.BPixnewLayer_.push_back(bn.layerName());
696  } else if (modulename.find("FPix_") != std::string::npos) {
697  PixelEndcapName en(modulename, true);
698  const auto& detId = en.getDetId(tTopo);
699  iHists.FPixnewmodulename_.push_back(modulename);
700  iHists.FPixnewDetIds_.push_back(detId.rawId());
701  iHists.FPixnewDisk_.push_back(en.diskName());
702  iHists.FPixnewBlade_.push_back(en.bladeName());
703  }
704  }
705  }
706 }
707 
709  edm::Run const& run,
710  edm::EventSetup const& iSetup) {
711  // book the by partition monitoring
712  const auto maxSect = iHists.nlay * iHists.nModules_[iHists.nlay - 1] + (int)iHists.BPixnewDetIds_.size();
713 
714  iBooker.setCurrentFolder(fmt::sprintf("%s/SectorMonitoring", folder_.data()));
715  iHists.h_bySectOccupancy_ = iBooker.book1D(
716  "h_bySectorOccupancy", "hit occupancy by sector;pixel sector;hits on track", maxSect, -0.5, maxSect - 0.5);
717 
718  iBooker.setCurrentFolder(folder_);
719  static constexpr double min_depth_ = -100.;
720  static constexpr double max_depth_ = 400.;
721  static constexpr double min_drift_ = -500.;
722  static constexpr double max_drift_ = 500.;
723 
724  // book the mean values projections and set the bin names of the by sector monitoring
725  char name[128];
726  char title[256];
727  for (int i_layer = 1; i_layer <= iHists.nlay; i_layer++) {
728  for (int i_module = 1; i_module <= iHists.nModules_[i_layer - 1]; i_module++) {
729  unsigned int i_index = i_module + (i_layer - 1) * iHists.nModules_[i_layer - 1];
730  std::string binName = fmt::sprintf("BPix Lay%i Mod%i", i_layer, i_module);
731  LogDebug("SiPixelLorentzAnglePCLWorker") << " i_index: " << i_index << " bin name: " << binName
732  << " (i_layer: " << i_layer << " i_module:" << i_module << ")";
733 
734  iHists.h_bySectOccupancy_->setBinLabel(i_index, binName);
735 
736  sprintf(name, "h_mean_layer%i_module%i", i_layer, i_module);
737  sprintf(title,
738  "average drift vs depth layer%i module%i; production depth [#mum]; #LTdrift#GT [#mum]",
739  i_layer,
740  i_module);
741  iHists.h_mean_[i_index] = iBooker.book1D(name, title, hist_depth_, min_depth_, max_depth_);
742  }
743  }
744  for (int i = 0; i < (int)iHists.BPixnewDetIds_.size(); i++) {
745  sprintf(name, "h_BPixnew_mean_%s", iHists.BPixnewmodulename_[i].c_str());
746  sprintf(title,
747  "average drift vs depth %s; production depth [#mum]; #LTdrift#GT [#mum]",
748  iHists.BPixnewmodulename_[i].c_str());
749  int new_index = iHists.nModules_[iHists.nlay - 1] + (iHists.nlay - 1) * iHists.nModules_[iHists.nlay - 1] + 1 + i;
750  iHists.h_mean_[new_index] = iBooker.book1D(name, title, hist_depth_, min_depth_, max_depth_);
751 
752  LogDebug("SiPixelLorentzAnglePCLWorker") << "i_index" << new_index << " bin name: " << iHists.BPixnewmodulename_[i];
753 
755  }
756 
757  //book the 2D histograms
758  for (int i_layer = 1; i_layer <= iHists.nlay; i_layer++) {
759  iBooker.setCurrentFolder(fmt::sprintf("%s/BPix/BPixLayer%i", folder_.data(), i_layer));
760  for (int i_module = 1; i_module <= iHists.nModules_[i_layer - 1]; i_module++) {
761  unsigned int i_index = i_module + (i_layer - 1) * iHists.nModules_[i_layer - 1];
762 
763  sprintf(name, "h_drift_depth_adc_layer%i_module%i", i_layer, i_module);
764  sprintf(title, "depth vs drift (ADC) layer%i module%i; drift [#mum]; production depth [#mum]", i_layer, i_module);
765  iHists.h_drift_depth_adc_[i_index] =
766  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
767 
768  sprintf(name, "h_drift_depth_adc2_layer%i_module%i", i_layer, i_module);
769  sprintf(
770  title, "depth vs drift (ADC^{2}) layer%i module%i; drift [#mum]; production depth [#mum]", i_layer, i_module);
771  iHists.h_drift_depth_adc2_[i_index] =
772  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
773 
774  sprintf(name, "h_drift_depth_noadc_layer%i_module%i", i_layer, i_module);
775  sprintf(
776  title, "depth vs drift (no ADC) layer%i module%i; drift [#mum]; production depth [#mum]", i_layer, i_module);
777  iHists.h_drift_depth_noadc_[i_index] =
778  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
779 
780  sprintf(name, "h_drift_depth_layer%i_module%i", i_layer, i_module);
781  sprintf(title, "depth vs drift layer%i module%i; drift [#mum]; production depth [#mum]", i_layer, i_module);
782  iHists.h_drift_depth_[i_index] =
783  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
784  }
785  }
786 
787  // book the "new" modules
788  iBooker.setCurrentFolder(fmt::sprintf("%s/BPix/NewModules", folder_.data()));
789  for (int i = 0; i < (int)iHists.BPixnewDetIds_.size(); i++) {
790  int new_index = iHists.nModules_[iHists.nlay - 1] + (iHists.nlay - 1) * iHists.nModules_[iHists.nlay - 1] + 1 + i;
791 
792  sprintf(name, "h_BPixnew_drift_depth_adc_%s", iHists.BPixnewmodulename_[i].c_str());
793  sprintf(
794  title, "depth vs drift (ADC) %s; drift [#mum]; production depth [#mum]", iHists.BPixnewmodulename_[i].c_str());
795  iHists.h_drift_depth_adc_[new_index] =
796  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
797 
798  sprintf(name, "h_BPixnew_drift_depth_adc2_%s", iHists.BPixnewmodulename_[i].c_str());
799  sprintf(title,
800  "depth vs drift (ADC^{2}) %s; drift [#mum]; production depth [#mum]",
801  iHists.BPixnewmodulename_[i].c_str());
802  iHists.h_drift_depth_adc2_[new_index] =
803  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
804 
805  sprintf(name, "h_BPixnew_drift_depth_noadc_%s", iHists.BPixnewmodulename_[i].c_str());
806  sprintf(title,
807  "depth vs drift (no ADC)%s; drift [#mum]; production depth [#mum]",
808  iHists.BPixnewmodulename_[i].c_str());
809  iHists.h_drift_depth_noadc_[new_index] =
810  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
811 
812  sprintf(name, "h_BPixnew_drift_depth_%s", iHists.BPixnewmodulename_[i].c_str());
813  sprintf(title, "depth vs drift %s; drift [#mum]; production depth [#mum]", iHists.BPixnewmodulename_[i].c_str());
814  iHists.h_drift_depth_[new_index] =
815  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
816  }
817 
818  // book the track monitoring plots
819  iBooker.setCurrentFolder(fmt::sprintf("%s/TrackMonitoring", folder_.data()));
820  iHists.h_tracks_ = iBooker.book1D("h_tracks", ";tracker volume;tracks", 2, -0.5, 1.5);
821  iHists.h_tracks_->setBinLabel(1, "all tracks", 1);
822  iHists.h_tracks_->setBinLabel(2, "has pixel hits", 1);
823  iHists.h_trackEta_ = iBooker.book1D("h_trackEta", ";track #eta; #tracks", 30, -3., 3.);
824  iHists.h_trackPhi_ = iBooker.book1D("h_trackPhi", ";track #phi; #tracks", 48, -M_PI, M_PI);
825  iHists.h_trackPt_ = iBooker.book1D("h_trackPt", ";track p_{T} [GeV]; #tracks", 100, 0., 100.);
826  iHists.h_trackChi2_ = iBooker.book1D("h_trackChi2ndof", ";track #chi^{2}/ndof; #tracks", 100, 0., 10.);
827 }
828 
830  if (notInPCL_) {
831  hFile_->cd();
832  hFile_->Write();
833  hFile_->Close();
834  }
835 }
836 
837 // method used to fill per pixel info
839  Pixinfo pixinfo;
840  const std::vector<SiPixelCluster::Pixel>& pixvector = LocPix.pixels();
841  pixinfo.npix = 0;
842  for (std::vector<SiPixelCluster::Pixel>::const_iterator itPix = pixvector.begin(); itPix != pixvector.end();
843  itPix++) {
844  pixinfo.row[pixinfo.npix] = itPix->x;
845  pixinfo.col[pixinfo.npix] = itPix->y;
846  pixinfo.adc[pixinfo.npix] = itPix->adc;
847  LocalPoint lp = topol->localPosition(MeasurementPoint(itPix->x + 0.5, itPix->y + 0.5));
848  pixinfo.x[pixinfo.npix] = lp.x();
849  pixinfo.y[pixinfo.npix] = lp.y();
850  pixinfo.npix++;
851  }
852  return pixinfo;
853 }
854 
855 // method used to correct for the surface deformation
856 const std::pair<LocalPoint, LocalPoint> SiPixelLorentzAnglePCLWorker::surface_deformation(
857  const PixelTopology* topol, TrajectoryStateOnSurface& tsos, const SiPixelRecHit* recHitPix) const {
858  LocalPoint trackposition = tsos.localPosition();
859  const LocalTrajectoryParameters& ltp = tsos.localParameters();
860  const Topology::LocalTrackAngles localTrackAngles(ltp.dxdz(), ltp.dydz());
861 
862  std::pair<float, float> pixels_track = topol->pixel(trackposition, localTrackAngles);
863  std::pair<float, float> pixels_rechit = topol->pixel(recHitPix->localPosition(), localTrackAngles);
864 
865  LocalPoint lp_track = topol->localPosition(MeasurementPoint(pixels_track.first, pixels_track.second));
866 
867  LocalPoint lp_rechit = topol->localPosition(MeasurementPoint(pixels_rechit.first, pixels_rechit.second));
868 
869  std::pair<LocalPoint, LocalPoint> lps = std::make_pair(lp_track, lp_rechit);
870  return lps;
871 }
872 
873 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
876  desc.setComment("Worker module of the SiPixel Lorentz Angle PCL monitoring workflow");
877  desc.add<std::string>("folder", "AlCaReco/SiPixelLorentzAngle")->setComment("directory of PCL Worker output");
878  desc.add<bool>("notInPCL", false)->setComment("create TTree (true) or not (false)");
879  desc.add<std::string>("fileName", "testrun.root")->setComment("name of the TTree file if notInPCL = true");
880  desc.add<std::vector<std::string>>("newmodulelist", {})->setComment("the list of DetIds for new sensors");
881  desc.add<edm::InputTag>("src", edm::InputTag("TrackRefitter"))->setComment("input track collections");
882  desc.add<double>("ptMin", 3.)->setComment("minimum pt on tracks");
883  desc.add<double>("normChi2Max", 2.)->setComment("maximum reduced chi squared");
884  desc.add<std::vector<int>>("clustSizeYMin", {4, 3, 3, 2})
885  ->setComment("minimum cluster size on Y axis for all Barrel Layers");
886  desc.add<int>("clustSizeXMax", 5)->setComment("maximum cluster size on X axis");
887  desc.add<double>("residualMax", 0.005)->setComment("maximum residual");
888  desc.add<double>("clustChargeMaxPerLength", 50000)
889  ->setComment("maximum cluster charge per unit length of pixel depth (z)");
890  desc.add<int>("binsDepth", 50)->setComment("# bins for electron production depth axis");
891  desc.add<int>("binsDrift", 100)->setComment("# bins for electron drift axis");
892  descriptions.addWithDefaultLabel(desc);
893 }
894 
895 // define this as a plug-in
ClusterRef cluster() const
Definition: SiPixelRecHit.h:47
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override
unsigned int pxbLayer(const DetId &id) const
T perp() const
Definition: PV3DBase.h:69
~SiPixelLorentzAnglePCLWorker() override=default
std::vector< SiPixelTemplateStore > thePixelTemp_
virtual std::pair< float, float > pixel(const LocalPoint &p) const =0
float x[maxpix]
std::string folder_
bool interpolate(int id, float cotalpha, float cotbeta, float locBz, float locBx)
virtual LocalPoint localPosition(const MeasurementPoint &) const =0
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
unsigned int pxfBlade(const DetId &id) const
T z() const
Definition: PV3DBase.h:61
edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > topoPerEventEsToken_
int bladeName() const
blade id
int moduleName() const
module id (index in z)
float y[maxpix]
unsigned int pxfModule(const DetId &id) const
LocalVector drift(const StripGeomDetUnit *, const MagneticField &, const SiStripLorentzAngle &)
Definition: ShallowTools.cc:36
edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > geomPerEventEsToken_
float chiSquared() const
Definition: Trajectory.h:241
const LocalTrajectoryParameters & localParameters() const
edm::ESWatcher< SiPixelTemplateDBObjectESProducerRcd > watchSiPixelTemplateRcd_
unsigned int pxbLadder(const DetId &id) const
bool empty() const
return true if empty
Log< level::Error, false > LogError
float r_qMeas_qTrue()
ratio of measured to true cluster charge
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
const Pixinfo fillPix(const SiPixelCluster &LocPix, const PixelTopology *topol) const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
DataContainer const & measurements() const
Definition: Trajectory.h:178
const_iterator end() const
last iterator over the map (read only)
const std::pair< LocalPoint, LocalPoint > surface_deformation(const PixelTopology *topol, TrajectoryStateOnSurface &tsos, const SiPixelRecHit *recHitPix) const
void Fill(long long x)
virtual float thickness() const =0
double beta
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
float qscale()
charge scaling factor
Measurement2DPoint MeasurementPoint
Measurement points are two-dimensional by default.
int iEvent
Definition: GenABIO.cc:224
int ndof(bool bon=true) const
Definition: Trajectory.cc:97
const SiPixelTemplateDBObject * templateDBobject_
int diskName() const
disk id
std::shared_ptr< TrackingRecHit const > ConstRecHitPointer
const std::vector< Pixel > pixels() const
T sqrt(T t)
Definition: SSEVec.h:19
edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > topoEsToken_
LocalVector localDirection() const
std::unique_ptr< TTree > SiPixelLorentzAngleTreeBarrel_
unsigned int pxfDisk(const DetId &id) const
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
std::vector< std::string > newmodulelist_
Transition
Definition: Transition.h:12
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
bool getData(T &iHolder) const
Definition: EventSetup.h:122
SiPixelLorentzAnglePCLWorker(const edm::ParameterSet &)
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)
PXFDetId getDetId()
return DetId
#define M_PI
float adc[maxpix]
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:79
unsigned int pxfPanel(const DetId &id) const
Definition: DetId.h:17
unsigned int pxfSide(const DetId &id) const
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
double alpha
int layerName() const
layer id
SiPixelLorentzAngleCalibrationHistograms iHists
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
edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > geomEsToken_
short getTemplateID(const uint32_t &detid) const
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
static bool pushfile(int filenum, std::vector< SiPixelTemplateStore > &pixelTemp, std::string dir="CalibTracker/SiPixelESProducers/data/")
float col[maxpix]
edm::ESGetToken< SiPixelTemplateDBObject, SiPixelTemplateDBObjectESProducerRcd > siPixelTemplateEsToken_
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
const_iterator begin() const
first iterator over the map (read only)
Pixel cluster – collection of neighboring pixels above threshold.
HLT enums.
virtual const PixelTopology & specificTopology() const
Returns a reference to the pixel proxy topology.
LocalPoint localPosition() const override
static const int maxpix
edm::EDGetTokenT< TrajTrackAssociationCollection > t_trajTrack
double gamma
virtual std::pair< float, float > pitch() const =0
unsigned int pxbModule(const DetId &id) const
Log< level::Warning, false > LogWarning
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
PXBDetId getDetId()
return the DetId
void dqmEndRun(edm::Run const &, edm::EventSetup const &)
void analyze(edm::Event const &, edm::EventSetup const &) override
Definition: Run.h:45
float row[maxpix]
Our base class.
Definition: SiPixelRecHit.h:23
#define LogDebug(id)
std::unique_ptr< TTree > SiPixelLorentzAngleTreeForward_
const Bounds & bounds() const
Definition: Surface.h:87
Point3DBase< float, LocalTag > Local3DPoint
Definition: LocalPoint.h:9