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
59 
60 // ROOT includes
61 #include <TTree.h>
62 #include <TFile.h>
63 #include <fstream>
64 
65 //
66 // class declaration
67 //
68 
69 static const int maxpix = 1000;
70 struct Pixinfo {
71  int npix;
72  float row[maxpix];
73  float col[maxpix];
74  float adc[maxpix];
75  float x[maxpix];
76  float y[maxpix];
77 };
78 
79 struct Hit {
80  float x;
81  float y;
82  double alpha;
83  double beta;
84  double gamma;
85 };
86 struct Clust {
87  float x;
88  float y;
89  float charge;
90  int size_x;
91  int size_y;
92  int maxPixelCol;
93  int maxPixelRow;
94  int minPixelCol;
95  int minPixelRow;
96 };
97 struct Rechit {
98  float x;
99  float y;
100 };
101 
103 
105 public:
107  ~SiPixelLorentzAnglePCLWorker() override = default;
108 
109  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
110 
111 private:
112  void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
113 
114  void analyze(edm::Event const&, edm::EventSetup const&) override;
115 
116  void dqmBeginRun(edm::Run const&, edm::EventSetup const&) override;
117 
118  void dqmEndRun(edm::Run const&, edm::EventSetup const&);
119 
120  const Pixinfo fillPix(const SiPixelCluster& LocPix, const PixelTopology* topol) const;
121  const std::pair<LocalPoint, LocalPoint> surface_deformation(const PixelTopology* topol,
123  const SiPixelRecHit* recHitPix) const;
125  // ------------ member data ------------
127 
128  // template stuff
131  const std::vector<SiPixelTemplateStore>* thePixelTemp_ = nullptr;
132 
135  bool notInPCL_;
137  std::vector<std::string> newmodulelist_;
138 
139  // tree branches barrel
140  int run_;
141  long int event_;
143  int bx_;
144  int orbit_;
145  int module_;
146  int ladder_;
147  int layer_;
149  float pt_;
150  float eta_;
151  float phi_;
152  double chi2_;
153  double ndof_;
161  float qScale_;
162  float rQmQt_;
163 
164  // tree branches forward
165  int sideF_;
166  int diskF_;
167  int bladeF_;
168  int panelF_;
169  int moduleF_;
177  float qScaleF_;
178  float rQmQtF_;
179 
180  // parameters from config file
181  double ptmin_;
182  double normChi2Max_;
183  std::vector<int> clustSizeYMin_;
185  double residualMax_;
189 
190  std::unique_ptr<TFile> hFile_;
191  std::unique_ptr<TTree> SiPixelLorentzAngleTreeBarrel_;
192  std::unique_ptr<TTree> SiPixelLorentzAngleTreeForward_;
193 
194  // es consumes
202 
203  // event consumes
205 };
206 
207 //
208 // constructors and destructor
209 //
211  : analysisType_(convertStringToLorentzAngleAnalysisTypeEnum(iConfig.getParameter<std::string>("analysisType"))),
212  folder_(iConfig.getParameter<std::string>("folder")),
213  notInPCL_(iConfig.getParameter<bool>("notInPCL")),
214  filename_(iConfig.getParameter<std::string>("fileName")),
215  newmodulelist_(iConfig.getParameter<std::vector<std::string>>("newmodulelist")),
216  ptmin_(iConfig.getParameter<double>("ptMin")),
217  normChi2Max_(iConfig.getParameter<double>("normChi2Max")),
218  clustSizeYMin_(iConfig.getParameter<std::vector<int>>("clustSizeYMin")),
219  clustSizeXMax_(iConfig.getParameter<int>("clustSizeXMax")),
220  residualMax_(iConfig.getParameter<double>("residualMax")),
221  clustChargeMaxPerLength_(iConfig.getParameter<double>("clustChargeMaxPerLength")),
222  hist_depth_(iConfig.getParameter<int>("binsDepth")),
223  hist_drift_(iConfig.getParameter<int>("binsDrift")),
224  geomEsToken_(esConsumes<edm::Transition::BeginRun>()),
225  topoEsToken_(esConsumes<edm::Transition::BeginRun>()),
226  siPixelTemplateEsToken_(esConsumes<edm::Transition::BeginRun>()),
227  siPixelTemplateStoreEsToken_(esConsumes<edm::Transition::BeginRun>()),
228  topoPerEventEsToken_(esConsumes()),
229  geomPerEventEsToken_(esConsumes()),
230  magneticFieldToken_(esConsumes()) {
231  t_trajTrack = consumes<TrajTrackAssociationCollection>(iConfig.getParameter<edm::InputTag>("src"));
232 
233  // now do what ever initialization is needed
234  int bufsize = 64000;
235  // create tree structure
236  // Barrel pixel
237  if (notInPCL_) {
238  hFile_ = std::make_unique<TFile>(filename_.c_str(), "RECREATE");
240  std::make_unique<TTree>("SiPixelLorentzAngleTreeBarrel_", "SiPixel LorentzAngle tree barrel", bufsize);
241  SiPixelLorentzAngleTreeBarrel_->Branch("run", &run_, "run/I", bufsize);
242  SiPixelLorentzAngleTreeBarrel_->Branch("event", &event_, "event/l", bufsize);
243  SiPixelLorentzAngleTreeBarrel_->Branch("lumiblock", &lumiblock_, "lumiblock/I", bufsize);
244  SiPixelLorentzAngleTreeBarrel_->Branch("bx", &bx_, "bx/I", bufsize);
245  SiPixelLorentzAngleTreeBarrel_->Branch("orbit", &orbit_, "orbit/I", bufsize);
246  SiPixelLorentzAngleTreeBarrel_->Branch("module", &module_, "module/I", bufsize);
247  SiPixelLorentzAngleTreeBarrel_->Branch("ladder", &ladder_, "ladder/I", bufsize);
248  SiPixelLorentzAngleTreeBarrel_->Branch("layer", &layer_, "layer/I", bufsize);
249  SiPixelLorentzAngleTreeBarrel_->Branch("isflipped", &isflipped_, "isflipped/I", bufsize);
250  SiPixelLorentzAngleTreeBarrel_->Branch("pt", &pt_, "pt/F", bufsize);
251  SiPixelLorentzAngleTreeBarrel_->Branch("eta", &eta_, "eta/F", bufsize);
252  SiPixelLorentzAngleTreeBarrel_->Branch("phi", &phi_, "phi/F", bufsize);
253  SiPixelLorentzAngleTreeBarrel_->Branch("chi2", &chi2_, "chi2/D", bufsize);
254  SiPixelLorentzAngleTreeBarrel_->Branch("ndof", &ndof_, "ndof/D", bufsize);
255  SiPixelLorentzAngleTreeBarrel_->Branch("trackhit", &trackhit_, "x/F:y/F:alpha/D:beta/D:gamma_/D", bufsize);
256  SiPixelLorentzAngleTreeBarrel_->Branch("npix", &pixinfo_.npix, "npix/I", bufsize);
257  SiPixelLorentzAngleTreeBarrel_->Branch("rowpix", pixinfo_.row, "row[npix]/F", bufsize);
258  SiPixelLorentzAngleTreeBarrel_->Branch("colpix", pixinfo_.col, "col[npix]/F", bufsize);
259  SiPixelLorentzAngleTreeBarrel_->Branch("adc", pixinfo_.adc, "adc[npix]/F", bufsize);
260  SiPixelLorentzAngleTreeBarrel_->Branch("xpix", pixinfo_.x, "x[npix]/F", bufsize);
261  SiPixelLorentzAngleTreeBarrel_->Branch("ypix", pixinfo_.y, "y[npix]/F", bufsize);
262 
264  "clust",
265  &clust_,
266  "x/F:y/F:charge/F:size_x/I:size_y/I:maxPixelCol/I:maxPixelRow:minPixelCol/I:minPixelRow/I",
267  bufsize);
268  SiPixelLorentzAngleTreeBarrel_->Branch("rechit", &rechit_, "x/F:y/F", bufsize);
269  SiPixelLorentzAngleTreeBarrel_->Branch("rechit_corr", &rechitCorr_, "x/F:y/F", bufsize);
270  SiPixelLorentzAngleTreeBarrel_->Branch("trackhitcorr_x", &trackhitCorrX_, "trackhitcorr_x/F", bufsize);
271  SiPixelLorentzAngleTreeBarrel_->Branch("trackhitcorr_y", &trackhitCorrY_, "trackhitcorr_y/F", bufsize);
272  SiPixelLorentzAngleTreeBarrel_->Branch("qScale", &qScale_, "qScale/F", bufsize);
273  SiPixelLorentzAngleTreeBarrel_->Branch("rQmQt", &rQmQt_, "rQmQt/F", bufsize);
274  // Forward pixel
275 
277  std::make_unique<TTree>("SiPixelLorentzAngleTreeForward_", "SiPixel LorentzAngle tree forward", bufsize);
278  SiPixelLorentzAngleTreeForward_->Branch("run", &run_, "run/I", bufsize);
279  SiPixelLorentzAngleTreeForward_->Branch("event", &event_, "event/l", bufsize);
280  SiPixelLorentzAngleTreeForward_->Branch("lumiblock", &lumiblock_, "lumiblock/I", bufsize);
281  SiPixelLorentzAngleTreeForward_->Branch("bx", &bx_, "bx/I", bufsize);
282  SiPixelLorentzAngleTreeForward_->Branch("orbit", &orbit_, "orbit/I", bufsize);
283  SiPixelLorentzAngleTreeForward_->Branch("side", &sideF_, "side/I", bufsize);
284  SiPixelLorentzAngleTreeForward_->Branch("disk", &diskF_, "disk/I", bufsize);
285  SiPixelLorentzAngleTreeForward_->Branch("blade", &bladeF_, "blade/I", bufsize);
286  SiPixelLorentzAngleTreeForward_->Branch("panel", &panelF_, "panel/I", bufsize);
287  SiPixelLorentzAngleTreeForward_->Branch("module", &moduleF_, "module/I", bufsize);
288  SiPixelLorentzAngleTreeForward_->Branch("pt", &pt_, "pt/F", bufsize);
289  SiPixelLorentzAngleTreeForward_->Branch("eta", &eta_, "eta/F", bufsize);
290  SiPixelLorentzAngleTreeForward_->Branch("phi", &phi_, "phi/F", bufsize);
291  SiPixelLorentzAngleTreeForward_->Branch("chi2", &chi2_, "chi2/D", bufsize);
292  SiPixelLorentzAngleTreeForward_->Branch("ndof", &ndof_, "ndof/D", bufsize);
293  SiPixelLorentzAngleTreeForward_->Branch("trackhit", &trackhitF_, "x/F:y/F:alpha/D:beta/D:gamma_/D", bufsize);
294  SiPixelLorentzAngleTreeForward_->Branch("npix", &pixinfoF_.npix, "npix/I", bufsize);
295  SiPixelLorentzAngleTreeForward_->Branch("rowpix", pixinfoF_.row, "row[npix]/F", bufsize);
296  SiPixelLorentzAngleTreeForward_->Branch("colpix", pixinfoF_.col, "col[npix]/F", bufsize);
297  SiPixelLorentzAngleTreeForward_->Branch("adc", pixinfoF_.adc, "adc[npix]/F", bufsize);
298  SiPixelLorentzAngleTreeForward_->Branch("xpix", pixinfoF_.x, "x[npix]/F", bufsize);
299  SiPixelLorentzAngleTreeForward_->Branch("ypix", pixinfoF_.y, "y[npix]/F", bufsize);
300 
302  "clust",
303  &clustF_,
304  "x/F:y/F:charge/F:size_x/I:size_y/I:maxPixelCol/I:maxPixelRow:minPixelCol/I:minPixelRow/I",
305  bufsize);
306  SiPixelLorentzAngleTreeForward_->Branch("rechit", &rechitF_, "x/F:y/F", bufsize);
307  SiPixelLorentzAngleTreeForward_->Branch("rechit_corr", &rechitCorrF_, "x/F:y/F", bufsize);
308  SiPixelLorentzAngleTreeForward_->Branch("trackhitcorr_x", &trackhitCorrXF_, "trackhitcorr_x/F", bufsize);
309  SiPixelLorentzAngleTreeForward_->Branch("trackhitcorr_y", &trackhitCorrYF_, "trackhitcorr_y/F", bufsize);
310  SiPixelLorentzAngleTreeForward_->Branch("qScale", &qScaleF_, "qScale/F", bufsize);
311  SiPixelLorentzAngleTreeForward_->Branch("rQmQt", &rQmQtF_, "rQmQt/F", bufsize);
312  }
313 }
314 
315 //
316 // member functions
317 //
318 
319 // ------------ method called for each event ------------
320 
322  // Retrieve tracker topology from geometry
323  const TrackerTopology* const tTopo = &iSetup.getData(topoPerEventEsToken_);
324 
325  // Retrieve track geometry
327 
328  // Retrieve magnetic field
329  const MagneticField* magField = &iSetup.getData(magneticFieldToken_);
330 
331  // get the association map between tracks and trajectories
332  edm::Handle<TrajTrackAssociationCollection> trajTrackCollectionHandle;
333  iEvent.getByToken(t_trajTrack, trajTrackCollectionHandle);
334 
335  module_ = -1;
336  layer_ = -1;
337  ladder_ = -1;
338  isflipped_ = -1;
339  pt_ = -999;
340  eta_ = 999;
341  phi_ = 999;
342  pixinfo_.npix = 0;
343 
344  run_ = iEvent.id().run();
345  event_ = iEvent.id().event();
346  lumiblock_ = iEvent.luminosityBlock();
347  bx_ = iEvent.bunchCrossing();
348  orbit_ = iEvent.orbitNumber();
349 
350  if (!trajTrackCollectionHandle->empty()) {
351  for (TrajTrackAssociationCollection::const_iterator it = trajTrackCollectionHandle->begin();
352  it != trajTrackCollectionHandle->end();
353  ++it) {
354  const reco::Track& track = *it->val;
355  const Trajectory& traj = *it->key;
356 
357  // get the trajectory measurements
358  std::vector<TrajectoryMeasurement> tmColl = traj.measurements();
359  pt_ = track.pt();
360  eta_ = track.eta();
361  phi_ = track.phi();
362  chi2_ = traj.chiSquared();
363  ndof_ = traj.ndof();
364 
365  if (pt_ < ptmin_)
366  continue;
367 
372  iHists.h_tracks_->Fill(0);
373  bool pixeltrack = false;
374 
375  // iterate over trajectory measurements
376  for (const auto& itTraj : tmColl) {
377  if (!itTraj.updatedState().isValid())
378  continue;
379  const TransientTrackingRecHit::ConstRecHitPointer& recHit = itTraj.recHit();
380  if (!recHit->isValid() || recHit->geographicalId().det() != DetId::Tracker)
381  continue;
382  unsigned int subDetID = (recHit->geographicalId().subdetId());
383  if (subDetID == PixelSubdetector::PixelBarrel || subDetID == PixelSubdetector::PixelEndcap) {
384  if (!pixeltrack) {
385  iHists.h_tracks_->Fill(1);
386  }
387  pixeltrack = true;
388  }
389 
390  if (subDetID == PixelSubdetector::PixelBarrel) {
391  DetId detIdObj = recHit->geographicalId();
392  const PixelGeomDetUnit* theGeomDet = dynamic_cast<const PixelGeomDetUnit*>(tracker->idToDet(detIdObj));
393  if (!theGeomDet)
394  continue;
395 
396  const PixelTopology* topol = &(theGeomDet->specificTopology());
397 
398  float ypitch_ = topol->pitch().second;
399  float width_ = theGeomDet->surface().bounds().thickness();
400 
401  if (!topol)
402  continue;
403 
404  layer_ = tTopo->pxbLayer(detIdObj);
405  ladder_ = tTopo->pxbLadder(detIdObj);
406  module_ = tTopo->pxbModule(detIdObj);
407 
408  float tmp1 = theGeomDet->surface().toGlobal(Local3DPoint(0., 0., 0.)).perp();
409  float tmp2 = theGeomDet->surface().toGlobal(Local3DPoint(0., 0., 1.)).perp();
410 
411  isflipped_ = (tmp2 < tmp1) ? 1 : 0;
412 
413  const SiPixelRecHit* recHitPix = dynamic_cast<const SiPixelRecHit*>((*recHit).hit());
414  if (!recHitPix)
415  continue;
416  rechit_.x = recHitPix->localPosition().x();
417  rechit_.y = recHitPix->localPosition().y();
418  SiPixelRecHit::ClusterRef const& cluster = recHitPix->cluster();
419 
420  pixinfo_ = fillPix(*cluster, topol);
421 
422  // fill entries in clust_
423 
424  clust_.x = (cluster)->x();
425  clust_.y = (cluster)->y();
426  clust_.charge = (cluster->charge()) / 1000.; // clust_.charge: in the unit of 1000e
427  clust_.size_x = cluster->sizeX();
428  clust_.size_y = cluster->sizeY();
429  clust_.maxPixelCol = cluster->maxPixelCol();
430  clust_.maxPixelRow = cluster->maxPixelRow();
431  clust_.minPixelCol = cluster->minPixelCol();
432  clust_.minPixelRow = cluster->minPixelRow();
433 
434  // fill the trackhit info
435  TrajectoryStateOnSurface tsos = itTraj.updatedState();
436  if (!tsos.isValid()) {
437  edm::LogWarning("SiPixelLorentzAnglePCLWorker") << "tsos not valid";
438  continue;
439  }
440  LocalVector trackdirection = tsos.localDirection();
441  LocalPoint trackposition = tsos.localPosition();
442 
443  if (trackdirection.z() == 0)
444  continue;
445  // the local position and direction
446  trackhit_.alpha = atan2(trackdirection.z(), trackdirection.x());
447  trackhit_.beta = atan2(trackdirection.z(), trackdirection.y());
448  trackhit_.gamma = atan2(trackdirection.x(), trackdirection.y());
449  trackhit_.x = trackposition.x();
450  trackhit_.y = trackposition.y();
451 
452  // get qScale_ = templ.qscale() and templ.r_qMeas_qTrue();
453  float cotalpha = trackdirection.x() / trackdirection.z();
454  float cotbeta = trackdirection.y() / trackdirection.z();
455  float cotbeta_min = clustSizeYMin_[layer_ - 1] * ypitch_ / width_;
456  if (std::abs(cotbeta) <= cotbeta_min)
457  continue;
458  double drdz = sqrt(1. + cotalpha * cotalpha + cotbeta * cotbeta);
459  double clusterCharge_cut = clustChargeMaxPerLength_ * drdz;
460 
461  auto detId = detIdObj.rawId();
462  int DetId_index = -1;
463 
464  const auto& newModIt = (std::find(iHists.BPixnewDetIds_.begin(), iHists.BPixnewDetIds_.end(), detId));
465  bool isNewMod = (newModIt != iHists.BPixnewDetIds_.end());
466  if (isNewMod) {
467  DetId_index = std::distance(iHists.BPixnewDetIds_.begin(), newModIt);
468  }
469 
470  if (notInPCL_) {
471  // fill the template from the store (from dqmBeginRun)
472  SiPixelTemplate theTemplate(*thePixelTemp_);
473 
474  float locBx = (cotbeta < 0.) ? -1 : 1.;
475  float locBz = (cotalpha < 0.) ? -locBx : locBx;
476 
477  int TemplID = templateDBobject_->getTemplateID(detId);
478  theTemplate.interpolate(TemplID, cotalpha, cotbeta, locBz, locBx);
479  qScale_ = theTemplate.qscale();
480  rQmQt_ = theTemplate.r_qMeas_qTrue();
481  }
482 
483  // Surface deformation
484  const auto& lp_pair = surface_deformation(topol, tsos, recHitPix);
485 
486  LocalPoint lp_track = lp_pair.first;
487  LocalPoint lp_rechit = lp_pair.second;
488 
489  rechitCorr_.x = lp_rechit.x();
490  rechitCorr_.y = lp_rechit.y();
491  trackhitCorrX_ = lp_track.x();
492  trackhitCorrY_ = lp_track.y();
493 
494  if (notInPCL_) {
496  }
497 
499  continue;
500  // is one pixel in cluster a large pixel ? (hit will be excluded)
501  bool large_pix = false;
502  for (int j = 0; j < pixinfo_.npix; j++) {
503  int colpos = static_cast<int>(pixinfo_.col[j]);
504  if (pixinfo_.row[j] == 0 || pixinfo_.row[j] == 79 || pixinfo_.row[j] == 80 || pixinfo_.row[j] == 159 ||
505  colpos % 52 == 0 || colpos % 52 == 51) {
506  large_pix = true;
507  }
508  }
509 
510  double residualsq = (trackhitCorrX_ - rechitCorr_.x) * (trackhitCorrX_ - rechitCorr_.x) +
512 
513  double xlim1 = trackhitCorrX_ - width_ * cotalpha / 2.;
514  double hypitch_ = ypitch_ / 2.;
515  double ylim1 = trackhitCorrY_ - width_ * cotbeta / 2.;
516  double ylim2 = trackhitCorrY_ + width_ * cotbeta / 2.;
517 
518  int clustSizeY_cut = clustSizeYMin_[layer_ - 1];
519 
520  if (!large_pix && (chi2_ / ndof_) < normChi2Max_ && cluster->sizeY() >= clustSizeY_cut &&
521  residualsq < residualMax_ * residualMax_ && cluster->charge() < clusterCharge_cut &&
522  cluster->sizeX() < clustSizeXMax_) {
523  // iterate over pixels in hit
524  for (int j = 0; j < pixinfo_.npix; j++) {
525  // use trackhits and include bowing correction
526  float ypixlow = pixinfo_.y[j] - hypitch_;
527  float ypixhigh = pixinfo_.y[j] + hypitch_;
528  if (cotbeta > 0.) {
529  if (ylim1 > ypixlow)
530  ypixlow = ylim1;
531  if (ylim2 < ypixhigh)
532  ypixhigh = ylim2;
533  } else {
534  if (ylim2 > ypixlow)
535  ypixlow = ylim2;
536  if (ylim1 < ypixhigh)
537  ypixhigh = ylim1;
538  }
539  float ypixavg = 0.5f * (ypixlow + ypixhigh);
540 
541  float dx = (pixinfo_.x[j] - xlim1) * siPixelLACalibration::cmToum; // dx: in the unit of micrometer
542  float dy = (ypixavg - ylim1) * siPixelLACalibration::cmToum; // dy: in the unit of micrometer
543  float depth = dy * tan(trackhit_.beta);
544  float drift = dx - dy * tan(trackhit_.gamma);
545 
546  if (isNewMod == false) {
547  int i_index = module_ + (layer_ - 1) * iHists.nModules_[layer_ - 1];
548  iHists.h_drift_depth_adc_[i_index]->Fill(drift, depth, pixinfo_.adc[j]);
550  iHists.h_drift_depth_noadc_[i_index]->Fill(drift, depth, 1.);
551  iHists.h_bySectOccupancy_->Fill(i_index - 1); // histogram starts at 0
552 
553  if (tracker->getDetectorType(subDetID) == TrackerGeometry::ModuleType::Ph1PXB) {
554  if ((module_ == 3 || module_ == 5) && (layer_ == 3 || layer_ == 4)) {
555  int i_index_merge = i_index + 1;
556  iHists.h_drift_depth_adc_[i_index_merge]->Fill(drift, depth, pixinfo_.adc[j]);
557  iHists.h_drift_depth_adc2_[i_index_merge]->Fill(drift, depth, pixinfo_.adc[j] * pixinfo_.adc[j]);
558  iHists.h_drift_depth_noadc_[i_index_merge]->Fill(drift, depth, 1.);
559  iHists.h_bySectOccupancy_->Fill(i_index_merge - 1);
560  }
561  if ((module_ == 4 || module_ == 6) && (layer_ == 3 || layer_ == 4)) {
562  int i_index_merge = i_index - 1;
563  iHists.h_drift_depth_adc_[i_index_merge]->Fill(drift, depth, pixinfo_.adc[j]);
564  iHists.h_drift_depth_adc2_[i_index_merge]->Fill(drift, depth, pixinfo_.adc[j] * pixinfo_.adc[j]);
565  iHists.h_drift_depth_noadc_[i_index_merge]->Fill(drift, depth, 1.);
566  iHists.h_bySectOccupancy_->Fill(i_index_merge - 1);
567  }
568  }
569 
570  } else {
571  int new_index = iHists.nModules_[iHists.nlay - 1] +
572  (iHists.nlay - 1) * iHists.nModules_[iHists.nlay - 1] + 1 + DetId_index;
573 
574  iHists.h_drift_depth_adc_[new_index]->Fill(drift, depth, pixinfo_.adc[j]);
575  iHists.h_drift_depth_adc2_[new_index]->Fill(drift, depth, pixinfo_.adc[j] * pixinfo_.adc[j]);
576  iHists.h_drift_depth_noadc_[new_index]->Fill(drift, depth, 1.);
577  iHists.h_bySectOccupancy_->Fill(new_index - 1); // histogram starts at 0
578  }
579  }
580  }
581  } else if (subDetID == PixelSubdetector::PixelEndcap) {
582  DetId detIdObj = recHit->geographicalId();
583  const PixelGeomDetUnit* theGeomDet = dynamic_cast<const PixelGeomDetUnit*>(tracker->idToDet(detIdObj));
584  if (!theGeomDet)
585  continue;
586 
587  const PixelTopology* topol = &(theGeomDet->specificTopology());
588 
589  if (!topol)
590  continue;
591 
592  sideF_ = tTopo->pxfSide(detIdObj);
593  diskF_ = tTopo->pxfDisk(detIdObj);
594  bladeF_ = tTopo->pxfBlade(detIdObj);
595  panelF_ = tTopo->pxfPanel(detIdObj);
596  moduleF_ = tTopo->pxfModule(detIdObj);
597 
598  const SiPixelRecHit* recHitPix = dynamic_cast<const SiPixelRecHit*>((*recHit).hit());
599  if (!recHitPix)
600  continue;
601  rechitF_.x = recHitPix->localPosition().x();
602  rechitF_.y = recHitPix->localPosition().y();
603  SiPixelRecHit::ClusterRef const& cluster = recHitPix->cluster();
604 
605  pixinfoF_ = fillPix(*cluster, topol);
606 
607  // fill entries in clust_
608 
609  clustF_.x = (cluster)->x();
610  clustF_.y = (cluster)->y();
611  clustF_.charge = (cluster->charge()) / 1000.; // clustF_.charge: in the unit of 1000e
612  clustF_.size_x = cluster->sizeX();
613  clustF_.size_y = cluster->sizeY();
614  clustF_.maxPixelCol = cluster->maxPixelCol();
615  clustF_.maxPixelRow = cluster->maxPixelRow();
616  clustF_.minPixelCol = cluster->minPixelCol();
617  clustF_.minPixelRow = cluster->minPixelRow();
618 
619  // fill the trackhit info
620  TrajectoryStateOnSurface tsos = itTraj.updatedState();
621  if (!tsos.isValid()) {
622  edm::LogWarning("SiPixelLorentzAnglePCLWorker") << "tsos not valid";
623  continue;
624  }
625  LocalVector trackdirection = tsos.localDirection();
626  LocalPoint trackposition = tsos.localPosition();
627 
628  if (trackdirection.z() == 0)
629  continue;
630  // the local position and direction
631  trackhitF_.alpha = atan2(trackdirection.z(), trackdirection.x());
632  trackhitF_.beta = atan2(trackdirection.z(), trackdirection.y());
633  trackhitF_.gamma = atan2(trackdirection.x(), trackdirection.y());
634  trackhitF_.x = trackposition.x();
635  trackhitF_.y = trackposition.y();
636 
637  float cotalpha = trackdirection.x() / trackdirection.z();
638  float cotbeta = trackdirection.y() / trackdirection.z();
639 
640  auto detId = detIdObj.rawId();
641 
642  if (notInPCL_) {
643  // fill the template from the store (from dqmBeginRun)
644  SiPixelTemplate theTemplate(*thePixelTemp_);
645 
646  float locBx = (cotbeta < 0.) ? -1 : 1.;
647  float locBz = (cotalpha < 0.) ? -locBx : locBx;
648 
649  int TemplID = templateDBobject_->getTemplateID(detId);
650  theTemplate.interpolate(TemplID, cotalpha, cotbeta, locBz, locBx);
651  qScaleF_ = theTemplate.qscale();
652  rQmQtF_ = theTemplate.r_qMeas_qTrue();
653  }
654 
655  // Surface deformation
656  const auto& lp_pair = surface_deformation(topol, tsos, recHitPix);
657 
658  LocalPoint lp_track = lp_pair.first;
659  LocalPoint lp_rechit = lp_pair.second;
660 
661  rechitCorrF_.x = lp_rechit.x();
662  rechitCorrF_.y = lp_rechit.y();
663  trackhitCorrXF_ = lp_track.x();
664  trackhitCorrYF_ = lp_track.y();
665  if (notInPCL_) {
667  }
668 
670  continue;
671 
672  int theMagField = magField->nominalValue();
673  if (theMagField < 37 || theMagField > 39)
674  continue;
675 
676  double chi2_ndof = chi2_ / ndof_;
677  if (chi2_ndof >= normChi2Max_)
678  continue;
679 
680  //--- large pixel cut
681  bool large_pix = false;
682  for (int j = 0; j < pixinfoF_.npix; j++) {
683  int colpos = static_cast<int>(pixinfoF_.col[j]);
684  if (pixinfoF_.row[j] == 0 || pixinfoF_.row[j] == 79 || pixinfoF_.row[j] == 80 || pixinfoF_.row[j] == 159 ||
685  colpos % 52 == 0 || colpos % 52 == 51) {
686  large_pix = true;
687  }
688  }
689 
690  if (large_pix)
691  continue;
692 
693  //--- residual cut
694  double residual = sqrt(pow(trackhitCorrXF_ - rechitCorrF_.x, 2) + pow(trackhitCorrYF_ - rechitCorrF_.y, 2));
695 
696  if (residual > residualMax_)
697  continue;
698 
699  int ringIdx = bladeF_ <= 22 ? 0 : 1;
700  int panelIdx = panelF_ - 1;
701  int sideIdx = sideF_ - 1;
702  int idx = iHists.nSides_ * iHists.nPanels_ * ringIdx + iHists.nSides_ * panelIdx + sideIdx;
703  int idxBeta = iHists.betaStartIdx_ + idx;
704 
705  double cotanAlpha = std::tan(M_PI / 2. - trackhitF_.alpha);
706  double cotanBeta = std::tan(M_PI / 2. - trackhitF_.beta);
707 
708  LocalVector Bfield = theGeomDet->surface().toLocal(magField->inTesla(theGeomDet->surface().position()));
709  iHists.h_fpixMagField_[0][idx]->Fill(Bfield.x());
710  iHists.h_fpixMagField_[1][idx]->Fill(Bfield.y());
711  iHists.h_fpixMagField_[2][idx]->Fill(Bfield.z());
712 
713  if (clustF_.size_y >= 2) {
714  iHists.h_fpixAngleSize_[idx]->Fill(cotanAlpha, clustF_.size_x);
715  }
716 
717  if (clust_.size_x >= 0) {
718  iHists.h_fpixAngleSize_[idxBeta]->Fill(cotanBeta, clustF_.size_y);
719  }
720  }
721  } //end iteration over trajectory measurements
722  } //end iteration over trajectories
723  }
724 }
725 
727  // geometry
728  const TrackerGeometry* geom = &iSetup.getData(geomEsToken_);
729  const TrackerTopology* tTopo = &iSetup.getData(topoEsToken_);
730 
731  if (notInPCL_) {
732  // Initialize 1D templates
733  if (watchSiPixelTemplateRcd_.check(iSetup)) {
736  }
737  }
738 
740  iHists.nlay = geom->numberOfLayers(PixelSubdetector::PixelBarrel);
741  iHists.nModules_.resize(iHists.nlay);
742  for (int i = 0; i < iHists.nlay; i++) {
743  iHists.nModules_[i] = map.getPXBModules(i + 1);
744  }
745 
746  // list of modules already filled, then return (we already entered here)
747  if (!iHists.BPixnewDetIds_.empty() || !iHists.FPixnewDetIds_.empty())
748  return;
749 
750  if (!newmodulelist_.empty()) {
751  for (auto const& modulename : newmodulelist_) {
752  if (modulename.find("BPix_") != std::string::npos) {
753  PixelBarrelName bn(modulename, true);
754  const auto& detId = bn.getDetId(tTopo);
755  iHists.BPixnewmodulename_.push_back(modulename);
756  iHists.BPixnewDetIds_.push_back(detId.rawId());
757  iHists.BPixnewModule_.push_back(bn.moduleName());
758  iHists.BPixnewLayer_.push_back(bn.layerName());
759  } else if (modulename.find("FPix_") != std::string::npos) {
760  PixelEndcapName en(modulename, true);
761  const auto& detId = en.getDetId(tTopo);
762  iHists.FPixnewmodulename_.push_back(modulename);
763  iHists.FPixnewDetIds_.push_back(detId.rawId());
764  iHists.FPixnewDisk_.push_back(en.diskName());
765  iHists.FPixnewBlade_.push_back(en.bladeName());
766  }
767  }
768  }
769 }
770 
772  edm::Run const& run,
773  edm::EventSetup const& iSetup) {
776  if (analysisType_ == eGrazingAngle) {
777  // book the by partition monitoring
778  const auto maxSect = iHists.nlay * iHists.nModules_[iHists.nlay - 1] + (int)iHists.BPixnewDetIds_.size();
779 
780  iBooker.setCurrentFolder(fmt::sprintf("%s/SectorMonitoring", folder_.data()));
781  iHists.h_bySectOccupancy_ = iBooker.book1D(
782  "h_bySectorOccupancy", "hit occupancy by sector;pixel sector;hits on track", maxSect, -0.5, maxSect - 0.5);
783 
784  iBooker.setCurrentFolder(folder_);
785  static constexpr double min_depth_ = -100.;
786  static constexpr double max_depth_ = 400.;
787  static constexpr double min_drift_ = -500.;
788  static constexpr double max_drift_ = 500.;
789 
790  // book the mean values projections and set the bin names of the by sector monitoring
791  for (int i_layer = 1; i_layer <= iHists.nlay; i_layer++) {
792  for (int i_module = 1; i_module <= iHists.nModules_[i_layer - 1]; i_module++) {
793  unsigned int i_index = i_module + (i_layer - 1) * iHists.nModules_[i_layer - 1];
794  std::string binName = fmt::sprintf("BPix Lay%i Mod%i", i_layer, i_module);
795  LogDebug("SiPixelLorentzAnglePCLWorker") << " i_index: " << i_index << " bin name: " << binName
796  << " (i_layer: " << i_layer << " i_module:" << i_module << ")";
797 
798  iHists.h_bySectOccupancy_->setBinLabel(i_index, binName);
799 
800  name = fmt::sprintf("h_mean_layer%i_module%i", i_layer, i_module);
801  title = fmt::sprintf(
802  "average drift vs depth layer%i module%i; production depth [#mum]; #LTdrift#GT [#mum]", i_layer, i_module);
803  iHists.h_mean_[i_index] = iBooker.book1D(name, title, hist_depth_, min_depth_, max_depth_);
804  }
805  }
806  for (int i = 0; i < (int)iHists.BPixnewDetIds_.size(); i++) {
807  name = fmt::sprintf("h_BPixnew_mean_%s", iHists.BPixnewmodulename_[i].c_str());
808  title = fmt::sprintf("average drift vs depth %s; production depth [#mum]; #LTdrift#GT [#mum]",
809  iHists.BPixnewmodulename_[i].c_str());
810  int new_index = iHists.nModules_[iHists.nlay - 1] + (iHists.nlay - 1) * iHists.nModules_[iHists.nlay - 1] + 1 + i;
811  iHists.h_mean_[new_index] = iBooker.book1D(name, title, hist_depth_, min_depth_, max_depth_);
812 
813  LogDebug("SiPixelLorentzAnglePCLWorker")
814  << "i_index" << new_index << " bin name: " << iHists.BPixnewmodulename_[i];
815 
817  }
818 
819  //book the 2D histograms
820  for (int i_layer = 1; i_layer <= iHists.nlay; i_layer++) {
821  iBooker.setCurrentFolder(fmt::sprintf("%s/BPix/BPixLayer%i", folder_.data(), i_layer));
822  for (int i_module = 1; i_module <= iHists.nModules_[i_layer - 1]; i_module++) {
823  unsigned int i_index = i_module + (i_layer - 1) * iHists.nModules_[i_layer - 1];
824 
825  name = fmt::sprintf("h_drift_depth_adc_layer%i_module%i", i_layer, i_module);
826  title = fmt::sprintf(
827  "depth vs drift (ADC) layer%i module%i; drift [#mum]; production depth [#mum]", i_layer, i_module);
828  iHists.h_drift_depth_adc_[i_index] =
829  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
830 
831  name = fmt::sprintf("h_drift_depth_adc2_layer%i_module%i", i_layer, i_module);
832  title = fmt::sprintf(
833  "depth vs drift (ADC^{2}) layer%i module%i; drift [#mum]; production depth [#mum]", i_layer, i_module);
834  iHists.h_drift_depth_adc2_[i_index] =
835  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
836 
837  name = fmt::sprintf("h_drift_depth_noadc_layer%i_module%i", i_layer, i_module);
838  title = fmt::sprintf(
839  "depth vs drift (no ADC) layer%i module%i; drift [#mum]; production depth [#mum]", i_layer, i_module);
840  iHists.h_drift_depth_noadc_[i_index] =
841  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
842 
843  name = fmt::sprintf("h_drift_depth_layer%i_module%i", i_layer, i_module);
844  title =
845  fmt::sprintf("depth vs drift layer%i module%i; drift [#mum]; production depth [#mum]", i_layer, i_module);
846  iHists.h_drift_depth_[i_index] =
847  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
848  }
849  }
850 
851  // book the "new" modules
852  iBooker.setCurrentFolder(fmt::sprintf("%s/BPix/NewModules", folder_.data()));
853  for (int i = 0; i < (int)iHists.BPixnewDetIds_.size(); i++) {
854  int new_index = iHists.nModules_[iHists.nlay - 1] + (iHists.nlay - 1) * iHists.nModules_[iHists.nlay - 1] + 1 + i;
855 
856  name = fmt::sprintf("h_BPixnew_drift_depth_adc_%s", iHists.BPixnewmodulename_[i].c_str());
857  title = fmt::sprintf("depth vs drift (ADC) %s; drift [#mum]; production depth [#mum]",
858  iHists.BPixnewmodulename_[i].c_str());
859  iHists.h_drift_depth_adc_[new_index] =
860  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
861 
862  name = fmt::sprintf("h_BPixnew_drift_depth_adc2_%s", iHists.BPixnewmodulename_[i].c_str());
863  title = fmt::sprintf("depth vs drift (ADC^{2}) %s; drift [#mum]; production depth [#mum]",
864  iHists.BPixnewmodulename_[i].c_str());
865  iHists.h_drift_depth_adc2_[new_index] =
866  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
867 
868  name = fmt::sprintf("h_BPixnew_drift_depth_noadc_%s", iHists.BPixnewmodulename_[i].c_str());
869  title = fmt::sprintf("depth vs drift (no ADC)%s; drift [#mum]; production depth [#mum]",
870  iHists.BPixnewmodulename_[i].c_str());
871  iHists.h_drift_depth_noadc_[new_index] =
872  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
873 
874  name = fmt::sprintf("h_BPixnew_drift_depth_%s", iHists.BPixnewmodulename_[i].c_str());
875  title = fmt::sprintf("depth vs drift %s; drift [#mum]; production depth [#mum]",
876  iHists.BPixnewmodulename_[i].c_str());
877  iHists.h_drift_depth_[new_index] =
878  iBooker.book2D(name, title, hist_drift_, min_drift_, max_drift_, hist_depth_, min_depth_, max_depth_);
879  }
880  } // end if GrazinAngleAnalysis
881  else {
882  iBooker.setCurrentFolder(folder_);
883  std::string baseName;
884  std::string baseTitle;
885 
886  for (int r = 0; r < iHists.nRings_; ++r) {
887  for (int p = 0; p < iHists.nPanels_; ++p) {
888  for (int s = 0; s < iHists.nSides_; ++s) {
889  baseName = fmt::sprintf("R%d_P%d_z%d", r + 1, p + 1, s + 1);
890  if (s == 0)
891  baseTitle = fmt::sprintf("Ring%d_Panel%d_z-", r + 1, p + 1);
892  else
893  baseTitle = fmt::sprintf("Ring%d_Panel%d_z+", r + 1, p + 1);
894 
895  int idx = iHists.nSides_ * iHists.nPanels_ * r + iHists.nSides_ * p + s;
896  int idxBeta = iHists.betaStartIdx_ + idx;
897 
898  name = fmt::sprintf("%s_alphaMean", baseName);
899  title = fmt::sprintf("%s_alphaMean;cot(#alpha); Average cluster size x (pixel)", baseTitle);
900  iHists.h_fpixMean_[idx] = iBooker.book1D(name, title, 60, -3., 3.);
901  name = fmt::sprintf("%s_betaMean", baseName);
902  title = fmt::sprintf("%s_betaMean;cot(#beta); Average cluster size y (pixel)", baseTitle);
903  iHists.h_fpixMean_[idxBeta] = iBooker.book1D(name, title, 60, -3., 3.);
904 
905  } // loop over sides
906  } // loop over panels
907  } // loop over rings
908  iBooker.setCurrentFolder(fmt::sprintf("%s/FPix", folder_.data()));
909  for (int r = 0; r < iHists.nRings_; ++r) {
910  for (int p = 0; p < iHists.nPanels_; ++p) {
911  for (int s = 0; s < iHists.nSides_; ++s) {
912  baseName = fmt::sprintf("R%d_P%d_z%d", r + 1, p + 1, s + 1);
913  if (s == 0)
914  baseTitle = fmt::sprintf("Ring%d_Panel%d_z-", r + 1, p + 1);
915  else
916  baseTitle = fmt::sprintf("Ring%d_Panel%d_z+", r + 1, p + 1);
917 
918  int idx = iHists.nSides_ * iHists.nPanels_ * r + iHists.nSides_ * p + s;
919  int idxBeta = iHists.betaStartIdx_ + idx;
920 
921  name = fmt::sprintf("%s_alpha", baseName);
922  title = fmt::sprintf("%s_alpha;cot(#alpha); Cluster size x (pixel)", baseTitle);
923  iHists.h_fpixAngleSize_[idx] = iBooker.book2D(name, title, 60, -3., 3., 10, 0.5, 10.5);
924  name = fmt::sprintf("%s_beta", baseName);
925  title = fmt::sprintf("%s_beta;cot(#beta); Cluster size y (pixel) ", baseTitle);
926  iHists.h_fpixAngleSize_[idxBeta] = iBooker.book2D(name, title, 60, -3., 3., 10, 0.5, 10.5);
927  for (int m = 0; m < 3; ++m) {
928  name = fmt::sprintf("%s_B%d", baseName, m);
929  char bComp = m == 0 ? 'x' : (m == 1 ? 'y' : 'z');
930  title = fmt::sprintf("%s_magField%d;B_{%c} [T];Entries", baseTitle, m, bComp);
931  iHists.h_fpixMagField_[m][idx] = iBooker.book1D(name, title, 10000, -5., 5.);
932  } // mag. field comps
933  } // loop over sides
934  } // loop over panels
935  } // loop over rings
936  } // if MinimalClusterSize
937 
938  // book the track monitoring plots
939  iBooker.setCurrentFolder(fmt::sprintf("%s/TrackMonitoring", folder_.data()));
940  iHists.h_tracks_ = iBooker.book1D("h_tracks", ";tracker volume;tracks", 2, -0.5, 1.5);
941  iHists.h_tracks_->setBinLabel(1, "all tracks", 1);
942  iHists.h_tracks_->setBinLabel(2, "has pixel hits", 1);
943  iHists.h_trackEta_ = iBooker.book1D("h_trackEta", ";track #eta; #tracks", 30, -3., 3.);
944  iHists.h_trackPhi_ = iBooker.book1D("h_trackPhi", ";track #phi; #tracks", 48, -M_PI, M_PI);
945  iHists.h_trackPt_ = iBooker.book1D("h_trackPt", ";track p_{T} [GeV]; #tracks", 100, 0., 100.);
946  iHists.h_trackChi2_ = iBooker.book1D("h_trackChi2ndof", ";track #chi^{2}/ndof; #tracks", 100, 0., 10.);
947 }
948 
950  if (notInPCL_) {
951  hFile_->cd();
952  hFile_->Write();
953  hFile_->Close();
954  }
955 }
956 
957 // method used to fill per pixel info
959  Pixinfo pixinfo;
960  const std::vector<SiPixelCluster::Pixel>& pixvector = LocPix.pixels();
961  pixinfo.npix = 0;
962  for (std::vector<SiPixelCluster::Pixel>::const_iterator itPix = pixvector.begin(); itPix != pixvector.end();
963  itPix++) {
964  pixinfo.row[pixinfo.npix] = itPix->x;
965  pixinfo.col[pixinfo.npix] = itPix->y;
966  pixinfo.adc[pixinfo.npix] = itPix->adc;
967  LocalPoint lp = topol->localPosition(MeasurementPoint(itPix->x + 0.5, itPix->y + 0.5));
968  pixinfo.x[pixinfo.npix] = lp.x();
969  pixinfo.y[pixinfo.npix] = lp.y();
970  pixinfo.npix++;
971  }
972  return pixinfo;
973 }
974 
975 // method used to correct for the surface deformation
976 const std::pair<LocalPoint, LocalPoint> SiPixelLorentzAnglePCLWorker::surface_deformation(
977  const PixelTopology* topol, TrajectoryStateOnSurface& tsos, const SiPixelRecHit* recHitPix) const {
978  LocalPoint trackposition = tsos.localPosition();
979  const LocalTrajectoryParameters& ltp = tsos.localParameters();
980  const Topology::LocalTrackAngles localTrackAngles(ltp.dxdz(), ltp.dydz());
981 
982  std::pair<float, float> pixels_track = topol->pixel(trackposition, localTrackAngles);
983  std::pair<float, float> pixels_rechit = topol->pixel(recHitPix->localPosition(), localTrackAngles);
984 
985  LocalPoint lp_track = topol->localPosition(MeasurementPoint(pixels_track.first, pixels_track.second));
986 
987  LocalPoint lp_rechit = topol->localPosition(MeasurementPoint(pixels_rechit.first, pixels_rechit.second));
988 
989  std::pair<LocalPoint, LocalPoint> lps = std::make_pair(lp_track, lp_rechit);
990  return lps;
991 }
992 
994  std::string type) {
995  return (type == "GrazingAngle") ? eGrazingAngle : eMinimumClusterSize;
996 }
997 
998 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
1001  desc.setComment("Worker module of the SiPixel Lorentz Angle PCL monitoring workflow");
1002  desc.add<std::string>("analysisType", "GrazingAngle")
1003  ->setComment("analysis type - GrazingAngle (default) or MinimumClusterSize");
1004  desc.add<std::string>("folder", "AlCaReco/SiPixelLorentzAngle")->setComment("directory of PCL Worker output");
1005  desc.add<bool>("notInPCL", false)->setComment("create TTree (true) or not (false)");
1006  desc.add<std::string>("fileName", "testrun.root")->setComment("name of the TTree file if notInPCL = true");
1007  desc.add<std::vector<std::string>>("newmodulelist", {})->setComment("the list of DetIds for new sensors");
1008  desc.add<edm::InputTag>("src", edm::InputTag("TrackRefitter"))->setComment("input track collections");
1009  desc.add<double>("ptMin", 3.)->setComment("minimum pt on tracks");
1010  desc.add<double>("normChi2Max", 2.)->setComment("maximum reduced chi squared");
1011  desc.add<std::vector<int>>("clustSizeYMin", {4, 3, 3, 2})
1012  ->setComment("minimum cluster size on Y axis for all Barrel Layers");
1013  desc.add<int>("clustSizeXMax", 5)->setComment("maximum cluster size on X axis");
1014  desc.add<double>("residualMax", 0.005)->setComment("maximum residual");
1015  desc.add<double>("clustChargeMaxPerLength", 50000)
1016  ->setComment("maximum cluster charge per unit length of pixel depth (z)");
1017  desc.add<int>("binsDepth", 50)->setComment("# bins for electron production depth axis");
1018  desc.add<int>("binsDrift", 100)->setComment("# bins for electron drift axis");
1019  descriptions.addWithDefaultLabel(desc);
1020 }
1021 
1022 // 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:307
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
virtual std::pair< float, float > pixel(const LocalPoint &p) const =0
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
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
virtual GlobalVector inTesla(const GlobalPoint &gp) const =0
Field value ad specified global point, in Tesla.
edm::ESGetToken< std::vector< SiPixelTemplateStore >, SiPixelTemplateDBObjectESProducerRcd > siPixelTemplateStoreEsToken_
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
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
LocalPoint toLocal(const GlobalPoint &gp) const
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:23
edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > topoEsToken_
LocalVector localDirection() const
std::unique_ptr< TTree > SiPixelLorentzAngleTreeBarrel_
constexpr float Bfield
Definition: Config.h:55
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magneticFieldToken_
unsigned int pxfDisk(const DetId &id) const
const std::vector< SiPixelTemplateStore > * thePixelTemp_
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
std::vector< std::string > newmodulelist_
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
LorentzAngleAnalysisTypeEnum convertStringToLorentzAngleAnalysisTypeEnum(std::string type)
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
const PositionType & position() const
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:221
edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > geomEsToken_
short getTemplateID(const uint32_t &detid) const
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
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
int nominalValue() const
The nominal field value for this map in kGauss.
Definition: MagneticField.h:49
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
LorentzAngleAnalysisTypeEnum analysisType_
PXBDetId getDetId()
return the DetId
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
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