ATLAS Offline Software
PixelClusterOnTrackTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // Implementation file for class PixelClusterOnTrackTool
8 // (c) ATLAS Detector software
10 // AlgTool used for PixelClusterOnTrack object production
12 // started 1.0 21/04/2004 I.Gavrilenko - see ChangeLog
14 
22 
23 #include <cmath>
25 
26 //clustermap is most likely to be removed at later date
27 #define __clustermap
28 
29 
31 // Constructor
33 
34 namespace
35 {
36  // using x*x might be quicker than pow(x,2), depends on compiler optimisation
37  inline double
38  square(const double x) {
39  return x * x;
40  }
41 
42  double
43  distance(const std::vector<Amg::Vector2D> &vectorOfPositions,
44  const std::vector<Amg::Vector2D> &allLocalPositions,
45  const std::vector<Amg::MatrixX> &allErrorMatrix,
46  const int i, const int j, const int k) {
47  return
48  square(vectorOfPositions[i][0] - allLocalPositions[0][0]) / allErrorMatrix[0](0, 0) +
49  square(vectorOfPositions[j][0] - allLocalPositions[1][0]) / allErrorMatrix[1](0, 0) +
50  square(vectorOfPositions[k][0] - allLocalPositions[2][0]) / allErrorMatrix[2](0, 0) +
51  square(vectorOfPositions[i][1] - allLocalPositions[0][1]) / allErrorMatrix[0](1, 1) +
52  square(vectorOfPositions[j][1] - allLocalPositions[1][1]) / allErrorMatrix[1](1, 1) +
53  square(vectorOfPositions[k][1] - allLocalPositions[2][1]) / allErrorMatrix[2](1, 1);
54  }
55 }
56 
58  (const std::string &t, const std::string &n, const IInterface *p) :
59  ::AthAlgTool(t, n, p) {
60  declareInterface<IRIO_OnTrackCreator>(this);
61 }
62 
64 // Destructor
66 
68 
70 // Initialisation
72 
75 
76  ATH_MSG_DEBUG(name() << " initialize()");
77 
79  ATH_MSG_DEBUG("Error strategy is" << m_errorStrategy);
80 
81  if (m_IBLParameterSvc.retrieve().isFailure()) {
82  ATH_MSG_WARNING("Could not retrieve IBLParameterSvc");
83  } else {
84  m_IBLParameterSvc->setBoolParameters(m_applyNNcorrectionProperty.value(), "doPixelClusterSplitting");
85  m_IBLParameterSvc->setBoolParameters(m_IBLAbsent, "IBLAbsent");
86  }
88 
91 
92  // get the error scaling tool
94  if (!m_pixelErrorScalingKey.key().empty()) ATH_MSG_DEBUG("Detected need for scaling Pixel errors.");
95 
96  // get the module distortions tool
98  if (m_disableDistortions) ATH_MSG_DEBUG("No PixelDistortions will be simulated.");
99 
100  ATH_CHECK (detStore()->retrieve(m_pixelid, "PixelID"));
101 
104  ATH_CHECK(m_NnClusterizationFactory.retrieve( DisableTool{!m_applyNNcorrection} ));
105 
106  // Include IBL calibration constants
107  //Moved to initialize to remove statics and prevent repitition
108 
109  constexpr double phimin=-0.27, phimax=0.27;
110  for (int i=0; i<=s_nbinphi; i++) m_phix[i]=phimin+i*(phimax-phimin)/s_nbinphi;
111  constexpr double etacen[s_nbineta]={-0.,1.,1.55,1.9,2.15,2.35};
112  m_etax[0]=0.; m_etax[s_nbineta]=2.7;
113  for (int i=0; i<s_nbineta-1; i++) m_etax[i+1]=(etacen[i]+etacen[i+1])/2.;
114 
116 #include "IBL_calibration.h"
118 
119  ATH_CHECK(m_lorentzAngleTool.retrieve());
120  return StatusCode::SUCCESS;
121 }
122 
123 
124 
126 // Finalize
128 
131 return StatusCode::SUCCESS;
132 }
133 
135 // Trk::SiClusterOnTrack production
137 
138 
141  (const Trk::PrepRawData &rio, const Trk::TrackParameters &trackPar, const EventContext& ctx) const {
142 
143  const auto *element= dynamic_cast<const InDetDD::SiDetectorElement *>(rio.detectorElement());
144  if ((not m_applyNNcorrection) or (element and element->isBlayer() and (not m_NNIBLcorrection) and (not m_IBLAbsent))){
145  return correctDefault(rio, trackPar, ctx);
146  }else {
147  if (m_errorStrategy == 0 || m_errorStrategy == 1) {
148  // version from Giacinto
149  if (m_noNNandBroadErrors) {
150  return nullptr;
151  }
152  // if we try broad errors, get Pixel Cluster to test if it is split
153  const InDet::PixelCluster *pix = nullptr;
155  pix = static_cast<const InDet::PixelCluster *>(&rio);
156  }
157  if (!pix) {
158  return nullptr;
159  }
161  if (splitProb.isSplit()) {
162  return correctNN(rio, trackPar, ctx);
163  } else {
164  return correctDefault(rio, trackPar, ctx);
165  }
166  } else {
167  return correctNN(rio, trackPar, ctx);
168  }
169  }
170 }
171 
172 
173 
179  (const Trk::PrepRawData &rio, const Trk::TrackParameters &trackPar, const EventContext& ctx) const {
180  using CLHEP::micrometer;
181 
182  const double TOPHAT_SIGMA = 1. / std::sqrt(12.);
183 
184  const InDet::PixelCluster *pix = nullptr;
186  pix = static_cast<const InDet::PixelCluster *>(&rio);
187  }
188  else{
189  return nullptr;
190  }
191 
192  ATH_MSG_VERBOSE("Correct called with Error strategy " << m_errorStrategy);
193 
194  // PixelClusterOnTrack production
195  //
196  Trk::LocalParameters locpar;
197  Amg::Vector3D glob(pix->globalPosition());
198 
199 
200  // Get pointer to detector element
201  const InDetDD::SiDetectorElement *element = pix->detectorElement();
202  if (!element) {
203  return nullptr;
204  }
205  bool blayer = element->isBlayer();
206  IdentifierHash iH = element->identifyHash();
207 
208  double errphi = -1;
209  double erreta = -1;
210 
211  if (pix->rdoList().empty()) {
212  ATH_MSG_WARNING("Pixel RDO-list size is 0, check integrity of pixel clusters! stop ROT creation.");
213  return nullptr;
214  } else {
215  const InDetDD::PixelModuleDesign *design =
216  dynamic_cast<const InDetDD::PixelModuleDesign *>(&element->design());
217 
218  // get candidate track angle in module local frame
219  const Amg::Vector3D& my_track = trackPar.momentum();
220  const Amg::Vector3D& my_normal = element->normal();
221  const Amg::Vector3D& my_phiax = element->phiAxis();
222  const Amg::Vector3D& my_etaax = element->etaAxis();
223  float trkphicomp = my_track.dot(my_phiax);
224  float trketacomp = my_track.dot(my_etaax);
225  float trknormcomp = my_track.dot(my_normal);
226  double bowphi = std::atan2(trkphicomp, trknormcomp);
227  double boweta = std::atan2(trketacomp, trknormcomp);
228  float etatrack = trackPar.eta();
229 
230  float tanl = m_lorentzAngleTool->getTanLorentzAngle(iH, ctx);
231  int readoutside = element->design().readoutSide();
232 
233  // map the angles of inward-going tracks onto [-PI/2, PI/2]
234  if (bowphi > M_PI *0.5) {
235  bowphi -= M_PI;
236  }
237  if (bowphi < -M_PI *0.5) {
238  bowphi += M_PI;
239  }
240  // finally, subtract the Lorentz angle effect
241  // the readoutside term is needed because of a bug in old
242  // geometry versions (CSC-01-* and CSC-02-*)
243  double angle = std::atan(std::tan(bowphi) - readoutside * tanl);
244 
245  // try to understand...
246  const Identifier element_id = element->identify();
247  int PixEtaModule = m_pixelid->eta_module(element_id);
248  int PixPhiModule = m_pixelid->phi_module(element_id);
249  double PixTrkPt = trackPar.pT();
250  double PixTrkEta = trackPar.eta();
251  ATH_MSG_VERBOSE("tanl = " << tanl << " readout side is " << readoutside <<
252  " module " << PixEtaModule << " " << PixPhiModule <<
253  " track pt, eta = " << PixTrkPt << " " << PixTrkEta <<
254  " track momentum phi, norm = " << trkphicomp << " " <<
255  trknormcomp << " bowphi = " << bowphi << " angle = " << angle);
256 
257  float omegaphi = pix->omegax();
258  float omegaeta = pix->omegay();
259  double localphi = -9999.;
260  double localeta = -9999.;
261 
262  const std::vector<Identifier> & rdos = pix->rdoList();
263  InDetDD::SiLocalPosition meanpos(0, 0, 0);
264  int rowmin = 9999;
265  int rowmax = -9999;
266  int colmin = 9999;
267  int colmax = -9999;
268  for (const auto & rId:rdos) {
269  const int row = m_pixelid->phi_index(rId);
270  const int col = m_pixelid->eta_index(rId);
271  rowmin = std::min(rowmin, row);
272  rowmax = std::max(rowmax,row);
273  colmin = std::min(colmin, col);
274  colmax = std::max(colmax, col);
275  meanpos += design->positionFromColumnRow(col, row);
276  }
277  meanpos = meanpos / rdos.size();
279  design->positionFromColumnRow(colmin, rowmin);
281  design->positionFromColumnRow(colmax, rowmin);
283  design->positionFromColumnRow(colmin, rowmax);
285  design->positionFromColumnRow(colmax, rowmax);
286 
287  InDetDD::SiLocalPosition centroid = 0.25 * (pos1 + pos2 + pos3 + pos4);
288  double shift = m_lorentzAngleTool->getLorentzShift(iH, ctx);
289  int nrows = rowmax - rowmin + 1;
290  int ncol = colmax - colmin + 1;
291  double ang = 999.;
292 
293  // TOT interpolation for collision data
294  // Force IBL to use digital clustering and broad errors.
296  if (m_positionStrategy > 0 && omegaphi > -0.5 && omegaeta > -0.5) {
297  localphi = centroid.xPhi() + shift;
298  localeta = centroid.xEta();
299  // barrel
300  if (element->isBarrel()) {
301  ang = 180 * angle * M_1_PI; //M_1_PI in cmath, = 1/pi
302  double delta = 0.;
303  if (m_IBLAbsent || !blayer) {
304  delta = offlineCalibData->getPixelChargeInterpolationParameters()->getDeltaXbarrel(nrows, ang, 1);
305  } else { // special calibration for IBL
306  if (angle < m_phix[0] || angle > m_phix[s_nbinphi] || nrows != 2) {
307  delta = 0.;
308  }else {
309  int bin = -1;
310  while (angle > m_phix[bin + 1]) {
311  bin++;
312  }
313  if ((bin >= 0)and(bin < s_nbinphi)) {
314  delta = m_calphi[bin];
315  } else {
316  ATH_MSG_ERROR("bin out of range in line " << __LINE__ << " of PixelClusterOnTrackTool.cxx.");
317  }
318  }
319 
320  if (offlineCalibData->getPixelChargeInterpolationParameters()->getVersion()<-1) {
321  delta = offlineCalibData->getPixelChargeInterpolationParameters()->getDeltaXbarrel(nrows, ang, 0);
322  }
323  }
324  localphi += delta * (omegaphi - 0.5);
325  // settle the sign/pi periodicity issues
326  double thetaloc = -999.;
327  if (boweta > -0.5 * M_PI && boweta < M_PI / 2.) { //M_PI_2 in cmath
328  thetaloc = M_PI_2 - boweta;
329  }else if (boweta > M_PI_2 && boweta < M_PI) {
330  thetaloc = 1.5 * M_PI - boweta;
331  } else { // 3rd quadrant
332  thetaloc = -M_PI_2 - boweta;
333  }
334  double etaloc = -1 * log(tan(thetaloc * 0.5));
335  if (m_IBLAbsent || !blayer) {
336  delta = offlineCalibData->getPixelChargeInterpolationParameters()->getDeltaYbarrel(ncol, etaloc, 1);
337  } else { // special calibration for IBL
338  etaloc = std::abs(etaloc);
339  if (etaloc < m_etax[0] || etaloc > m_etax[s_nbineta]) {
340  delta = 0.;
341  } else {
342  int bin = -1;
343  while (etaloc > m_etax[bin + 1]) {
344  bin++;
345  }
346  if ((bin >= 0)and(bin < s_nbineta)) {
347  if (ncol == bin) {
348  delta = m_caleta[bin][0];
349  } else if (ncol == bin + 1) {
350  delta = m_caleta[bin][1];
351  } else if (ncol == bin + 2) {
352  delta = m_caleta[bin][2];
353  } else {
354  delta = 0.;
355  }
356  } else {// bin out of range of array indices
357  ATH_MSG_ERROR("bin out of range in line " << __LINE__ << " of PixelClusterOnTrackTool.cxx.");
358  }
359  }
360  if (offlineCalibData->getPixelChargeInterpolationParameters()->getVersion()<-1) {
361  delta = offlineCalibData->getPixelChargeInterpolationParameters()->getDeltaYbarrel(ncol, std::abs(etaloc), 0);
362  }
363  }
364  localeta += delta * (omegaeta - 0.5);
365  }else {
366  // collision endcap data
367  if (m_positionStrategy == 1) {
368  double deltax = offlineCalibData->getPixelChargeInterpolationParameters()->getDeltaXendcap();
369  double deltay = offlineCalibData->getPixelChargeInterpolationParameters()->getDeltaYendcap();
370  localphi += deltax * (omegaphi - 0.5);
371  localeta += deltay * (omegaeta - 0.5);
372  }
373  // SR1 cosmics endcap data
374  // some parametrization dependent on track angle
375  // would be better here
376  else if (m_positionStrategy == 20) {
377  double deltax = 35 * micrometer;
378  double deltay = 35 * micrometer;
379  localphi += deltax * (omegaphi - 0.5);
380  localeta += deltay * (omegaeta - 0.5);
381  }
382  }
383  }
384 // digital
385  else {
386  localphi = meanpos.xPhi() + shift;
387  localeta = meanpos.xEta();
388  }
389 
390  const InDet::SiWidth& width = pix->width();
391 
392  // Error strategies
393 
394  // For very shallow tracks the cluster can easily break as
395  // the average charge per pixel is of the order of the threshold
396  // In this case, an error equal to the geometrical projection
397  // of the track path in silicon onto the module surface seems
398  // appropriate
399  if (std::abs(angle) > 1) {
400  errphi = 250 * micrometer * std::tan(std::abs(angle)) * TOPHAT_SIGMA;
401  erreta = width.z() > 250 * micrometer * std::tan(std::abs(boweta)) ?
402  width.z() * TOPHAT_SIGMA : 250 * micrometer * std::tan(std::abs(boweta)) * TOPHAT_SIGMA;
403  ATH_MSG_VERBOSE("Shallow track with tanl = " << tanl << " bowphi = " <<
404  bowphi << " angle = " << angle << " width.z = " << width.z() <<
405  " errphi = " << errphi << " erreta = " << erreta);
406  }else if (m_errorStrategy == 0) {
407  errphi = width.phiR() * TOPHAT_SIGMA;
408  erreta = width.z() * TOPHAT_SIGMA;
409  }else if (m_errorStrategy == 1) {
410  errphi = (width.phiR() / nrows) * TOPHAT_SIGMA;
411  erreta = (width.z() / ncol) * TOPHAT_SIGMA;
412  }else if (m_errorStrategy == 2) {
413  if (element->isBarrel()) {
414  if (m_IBLAbsent || !blayer) {
415  int ibin = offlineCalibData->getPixelClusterOnTrackErrorData()->getBarrelBinPhi(ang, nrows);
416  errphi = offlineCalibData->getPixelClusterOnTrackErrorData()->getPixelBarrelPhiError(ibin);
417  } else { // special calibration for IBL
418  if (angle < m_phix[0] || angle > m_phix[s_nbinphi]) {
419  errphi = width.phiR() * TOPHAT_SIGMA;
420  } else {
421  int bin = -1;// cannot be used as array index, which will happen if angle<m_phix[bin+1]
422  while (angle > m_phix[bin + 1]) {
423  bin++;
424  }
425  if ((bin >= 0)and(bin < s_nbinphi)) {
426  if (nrows == 1) {
427  errphi = m_calerrphi[bin][0];
428  } else if (nrows == 2) {
429  errphi = m_calerrphi[bin][1];
430  } else {
431  errphi = m_calerrphi[bin][2];
432  }
433  } else {
434  ATH_MSG_ERROR("bin out of range in line " << __LINE__ << " of PixelClusterOnTrackTool.cxx.");
435  }
436  }
437  }
438 
439  if (m_IBLAbsent || !blayer) {
440  int ibin = offlineCalibData->getPixelClusterOnTrackErrorData()->getBarrelBinEta(std::abs(etatrack), ncol, nrows);
441  erreta = offlineCalibData->getPixelClusterOnTrackErrorData()->getPixelBarrelEtaError(ibin);
442  } else { // special calibration for IBL
443  double etaloc = std::abs(etatrack);
444  if (etaloc < m_etax[0] || etaloc > m_etax[s_nbineta]) {
445  erreta = width.z() * TOPHAT_SIGMA;
446  } else {
447  int bin = 0;
448  while (bin < s_nbineta && etaloc > m_etax[bin + 1]) {
449  ++bin;
450  }
451  if (bin >= s_nbineta) {
452  ATH_MSG_ERROR("bin out of range in line " << __LINE__ << " of PixelClusterOnTrackTool.cxx.");
453  } else {
454  if (ncol == bin) {
455  erreta = m_calerreta[bin][0];
456  } else if (ncol == bin + 1) {
457  erreta = m_calerreta[bin][1];
458  } else if (ncol == bin + 2) {
459  erreta = m_calerreta[bin][2];
460  } else {
461  erreta = width.z() * TOPHAT_SIGMA;
462  }
463  }
464  }
465  }
466  }else {
467  int ibin = offlineCalibData->getPixelClusterErrorData()->getEndcapBin(ncol, nrows);
468  errphi = offlineCalibData->getPixelClusterErrorData()->getPixelEndcapPhiError(ibin);
469  erreta = offlineCalibData->getPixelClusterErrorData()->getPixelEndcapRError(ibin);
470  }
471  if (errphi > erreta) {
472  erreta = width.z() * TOPHAT_SIGMA;
473  }
474  }
475 
476  Amg::Vector2D locpos = Amg::Vector2D(localphi, localeta);
477  if (element->isBarrel() && !m_disableDistortions) {
478  correctBow(element->identify(), locpos, bowphi, boweta,ctx);
479  }
480 
481 
482  locpar = Trk::LocalParameters(locpos);
483  centroid = InDetDD::SiLocalPosition(localeta, localphi, 0.);
484  glob = element->globalPosition(centroid);
485  }
486 
487  // Error matrix production
488 
489  Amg::MatrixX cov = pix->localCovariance();
490 
491  // corrected phi error
492  if (errphi > 0) {
493  cov(0, 0) = errphi * errphi;
494  }
495  if (erreta > 0) {
496  cov(1, 1) = erreta * erreta;
497  }
498 
499  ATH_MSG_VERBOSE(" errphi = " << errphi << " erreta = " << erreta);
500 
501  // create new copy of error matrix
502  if (!m_pixelErrorScalingKey.key().empty()) {
504  cov = Trk::ErrorScalingCast<PixelRIO_OnTrackErrorScaling>(*error_scaling)
505  ->getScaledCovariance(std::move(cov), *m_pixelid,
506  element->identify());
507  }
508  bool isbroad = m_errorStrategy == 0;
509  return new InDet::PixelClusterOnTrack(pix,
510  std::move(locpar),
511  std::move(cov), iH,
512  glob, pix->gangedPixel(), isbroad);
513 }
514 
515 void
517  const double theta, const EventContext& ctx) const {
518  Amg::Vector3D dir(tan(phi), tan(theta), 1.);
519  Amg::Vector2D newpos = SG::ReadCondHandle<PixelDistortionData>(m_distortionKey, ctx)->correctReconstruction(m_pixelid->wafer_hash(id), localpos, dir);
520 
521  localpos = newpos;
522 }
523 
526  (const Trk::PrepRawData &rio, const Trk::TrackParameters &trackPar,
528  int initial_errorStrategy;
530 
531  switch (strategy) {
532  case InDet::PIXELCLUSTER_OUTLIER: // if cluster is outlier, increase errors
534  initial_errorStrategy = m_errorStrategy;
535  m_errorStrategy = 0; // error as size of cluster /sqrt(12)
536  newROT = correct(rio, trackPar);
537  m_errorStrategy = initial_errorStrategy;
538  return newROT;
539 
540  default:
541  return correct(rio, trackPar);
542  }
543 }
544 
545 // GP: NEW correct() method in case of NN based calibration */
548  (const Trk::PrepRawData &rio,
549  const Trk::TrackParameters &trackPar,
550  const EventContext& ctx) const {
551 
552  const InDet::PixelCluster *pixelPrepCluster = nullptr;
554  pixelPrepCluster = static_cast<const InDet::PixelCluster *>(&rio);
555  }
556 
557  if (pixelPrepCluster == nullptr) {
558  ATH_MSG_WARNING("This is not a pixel cluster, return 0.");
559  return nullptr;
560  }
561 
562  const InDetDD::SiDetectorElement *element = pixelPrepCluster->detectorElement();
563  if (!element) {
564  ATH_MSG_WARNING("Cannot access detector element. Aborting cluster correction...");
565  return nullptr;
566  }
567 
568  IdentifierHash iH = element->identifyHash();
569 
570  if (m_doNotRecalibrateNN) {
571  Amg::Vector3D glob(pixelPrepCluster->globalPosition());
572 
573  const Amg::Vector3D& my_track = trackPar.momentum();
574  const Amg::Vector3D& my_normal = element->normal();
575  const Amg::Vector3D& my_phiax = element->phiAxis();
576  const Amg::Vector3D& my_etaax = element->etaAxis();
577  float trkphicomp = my_track.dot(my_phiax);
578  float trketacomp = my_track.dot(my_etaax);
579  float trknormcomp = my_track.dot(my_normal);
580  double bowphi = std::atan2(trkphicomp, trknormcomp);
581  double boweta = std::atan2(trketacomp, trknormcomp);
582 
583  Amg::Vector2D locpos = pixelPrepCluster->localPosition();
584  if (element->isBarrel() && !m_disableDistortions) {
585  correctBow(element->identify(), locpos, bowphi, boweta,ctx);
586  }
587 
589  Amg::MatrixX cov = pixelPrepCluster->localCovariance();
590 
591  return new InDet::PixelClusterOnTrack(pixelPrepCluster, std::move(locpar), std::move(cov), iH, glob,
592  pixelPrepCluster->gangedPixel(), false);
593  }
594 
595 
596 
597  Amg::Vector2D finalposition;
598  Amg::MatrixX finalerrormatrix;
599 
600  if (m_usingTIDE_Ambi) {
601  if (!getErrorsTIDE_Ambi(pixelPrepCluster, trackPar, finalposition, finalerrormatrix)) {
602  return correctDefault(rio, trackPar, ctx);
603  }
604  }else {
605  if (!getErrorsDefaultAmbi(pixelPrepCluster, trackPar, finalposition, finalerrormatrix)) {
606  return correctDefault(rio, trackPar, ctx);
607  }
608  }
609 
610  ATH_MSG_DEBUG( " Old position x: " << pixelPrepCluster->localPosition()[0]
611  << " +/- " << std::sqrt(pixelPrepCluster->localCovariance()(0, 0))
612  << " y: " << pixelPrepCluster->localPosition()[1]
613  << " +/- " << std::sqrt(pixelPrepCluster->localCovariance()(1, 1)) <<"\n"
614  << " Final position x: " << finalposition[0]
615  << " +/- " << std::sqrt(finalerrormatrix(0, 0))
616  << " y: " << finalposition[1] << " +/- "
617  <<std::sqrt(finalerrormatrix(1, 1)) );
618 
619  const Amg::Vector3D& my_track = trackPar.momentum();
620  Amg::Vector3D my_normal = element->normal();
621  Amg::Vector3D my_phiax = element->phiAxis();
622  Amg::Vector3D my_etaax = element->etaAxis();
623  float trkphicomp = my_track.dot(my_phiax);
624  float trketacomp = my_track.dot(my_etaax);
625  float trknormcomp = my_track.dot(my_normal);
626  double bowphi = std::atan2(trkphicomp, trknormcomp);
627  double boweta = std::atan2(trketacomp, trknormcomp);
628 
629  if (element->isBarrel() && !m_disableDistortions) {
630  correctBow(element->identify(), finalposition, bowphi, boweta,ctx);
631  }
632 
633  Amg::MatrixX cov = finalerrormatrix;
634  // create new copy of error matrix
635  if (!m_pixelErrorScalingKey.key().empty()) {
638  cov = Trk::ErrorScalingCast<PixelRIO_OnTrackErrorScaling>(*error_scaling)
639  ->getScaledCovariance(std::move(cov), *m_pixelid,
640  element->identify());
641  }
642 
644  finalposition[0],
645  0);
646  Trk::LocalParameters locpar = Trk::LocalParameters(finalposition);
647 
648  const Amg::Vector3D &glob = element->globalPosition(centroid);
649 
650 
651  return new InDet::PixelClusterOnTrack(pixelPrepCluster, std::move(locpar),
652  std::move(cov), iH,
653  glob,
654  pixelPrepCluster->gangedPixel(),
655  false);
656 }
657 
658 bool
660  const Trk::TrackParameters &trackPar,
661  Amg::Vector2D &finalposition,
662  Amg::MatrixX &finalerrormatrix) const {
663  std::vector<Amg::Vector2D> vectorOfPositions;
664  int numberOfSubclusters = 1;
665  vectorOfPositions.push_back(pixelPrepCluster->localPosition());
666 
667  if (m_applyNNcorrection){
669  InDet::PixelGangedClusterAmbiguities::const_iterator mapBegin = splitClusterMap->begin();
670  InDet::PixelGangedClusterAmbiguities::const_iterator mapEnd = splitClusterMap->end();
671  for (InDet::PixelGangedClusterAmbiguities::const_iterator mapIter = mapBegin; mapIter != mapEnd; ++mapIter) {
672  const SiCluster *first = (*mapIter).first;
673  const SiCluster *second = (*mapIter).second;
674  if (first == pixelPrepCluster && second != pixelPrepCluster) {
675  ATH_MSG_DEBUG("Found additional split cluster in ambiguity map (+=1).");
676  numberOfSubclusters += 1;
677  const SiCluster *otherOne = second;
678  const InDet::PixelCluster *pixelAddCluster = nullptr;
679  if (otherOne->type(Trk::PrepRawDataType::PixelCluster)) {
680  pixelAddCluster = static_cast<const InDet::PixelCluster *>(otherOne);
681  }
682  if (pixelAddCluster == nullptr) {
683  ATH_MSG_WARNING("Pixel ambiguity map has empty pixel cluster. Please DEBUG!");
684  continue;
685  }
686  vectorOfPositions.push_back(pixelAddCluster->localPosition());
687 
688  ATH_MSG_DEBUG( "Found one more pixel cluster. Position x: "
689  << pixelAddCluster->localPosition()[0] << "y: " << pixelAddCluster->localPosition()[1]);
690  }// find relevant element of map
691  }// iterate over map
692  }
693 
694  // now you have numberOfSubclusters and the vectorOfPositions (Amg::Vector2D)
695 
696  if (trackPar.surfaceType() != Trk::SurfaceType::Plane ||
697  trackPar.type() != Trk::AtaSurface) {
699  "Parameters are not at a plane ! Aborting cluster correction... ");
700  return false;
701  }
702 
703  std::vector<Amg::Vector2D> allLocalPositions;
704  std::vector<Amg::MatrixX> allErrorMatrix;
705  allLocalPositions =
706  m_NnClusterizationFactory->estimatePositions(*pixelPrepCluster,
707  trackPar.associatedSurface(),
708  trackPar,
709  allErrorMatrix,
710  numberOfSubclusters);
711 
712  if (allLocalPositions.empty()) {
713  ATH_MSG_DEBUG( " Cluster cannot be treated by NN. Giving back to default clusterization " );
714 
715  return false;
716  }
717 
718  if (allLocalPositions.size() != size_t(numberOfSubclusters)) {
719  ATH_MSG_WARNING( "Returned position vector size " << allLocalPositions.size() <<
720  " not according to expected number of subclusters: " << numberOfSubclusters << ". Abort cluster correction..." );
721  return false;
722  }
723 
724 
725  // GP: now the not so nice part of matching the new result with the old one...
726  // Takes the error into account to improve the matching
727 
728  if (numberOfSubclusters == 1) {
729  finalposition = allLocalPositions[0];
730  finalerrormatrix = allErrorMatrix[0];
731  }
732 
733  else if (numberOfSubclusters == 2) {
734  double distancesq1 =
735  square(vectorOfPositions[0][0] - allLocalPositions[0][0]) / allErrorMatrix[0](0, 0) +
736  square(vectorOfPositions[1][0] - allLocalPositions[1][0]) / allErrorMatrix[1](0, 0) +
737  square(vectorOfPositions[0][1] - allLocalPositions[0][1]) / allErrorMatrix[0](1, 1) +
738  square(vectorOfPositions[1][1] - allLocalPositions[1][1]) / allErrorMatrix[1](1, 1);
739 
740  double distancesq2 =
741  square(vectorOfPositions[1][0] - allLocalPositions[0][0]) / allErrorMatrix[0](0, 0) +
742  square(vectorOfPositions[0][0] - allLocalPositions[1][0]) / allErrorMatrix[1](0, 0) +
743  square(vectorOfPositions[1][1] - allLocalPositions[0][1]) / allErrorMatrix[0](1, 1) +
744  square(vectorOfPositions[0][1] - allLocalPositions[1][1]) / allErrorMatrix[1](1, 1);
745 
747  " Old pix (1) x: " << vectorOfPositions[0][0] << " y: " << vectorOfPositions[0][1] << "\n"
748  << " Old pix (2) x: " << vectorOfPositions[1][0] << " y: " << vectorOfPositions[1][1] << "\n"
749  << " Pix (1) x: " << allLocalPositions[0][0] << " +/- " << std::sqrt(allErrorMatrix[0](0, 0))
750  << " y: " << allLocalPositions[0][1] << " +/- " << std::sqrt(allErrorMatrix[0](1, 1)) <<"\n"
751  << " Pix (2) x: " << allLocalPositions[1][0] << " +/- " << std::sqrt(allErrorMatrix[1](0, 0))
752  << " y: " << allLocalPositions[1][1] << " +/- " << std::sqrt(allErrorMatrix[1](1, 1)) << "\n"
753  << " Old (1) new (1) dist: " << std::sqrt(distancesq1) << " Old (1) new (2) " << std::sqrt(distancesq2) );
754 
755 
756  if (distancesq1 < distancesq2) {
757  finalposition = allLocalPositions[0];
758  finalerrormatrix = allErrorMatrix[0];
759  }else {
760  finalposition = allLocalPositions[1];
761  finalerrormatrix = allErrorMatrix[1];
762  }
763  }
764 
765 
766  else if (numberOfSubclusters == 3) {
767  double distances[6];
768 
769  distances[0] = distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 0, 1, 2);
770  distances[1] = distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 0, 2, 1);
771  distances[2] = distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 1, 0, 2);
772  distances[3] = distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 1, 2, 0);
773  distances[4] = distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 2, 0, 1);
774  distances[5] = distance(vectorOfPositions, allLocalPositions, allErrorMatrix, 2, 1, 0);
775 
776  int smallestDistanceIndex = -10;
777  double minDistance = 1e10;
778 
779  for (int i = 0; i < 6; i++) {
780  ATH_MSG_VERBOSE(" distance n.: " << i << " distance is: " << distances[i]);
781 
782  if (distances[i] < minDistance) {
783  minDistance = distances[i];
784  smallestDistanceIndex = i;
785  }
786  }
787 
788  ATH_MSG_DEBUG(" The minimum distance is : " << minDistance << " for index: " << smallestDistanceIndex);
789 
790  if (smallestDistanceIndex == 0 || smallestDistanceIndex == 1) {
791  finalposition = allLocalPositions[0];
792  finalerrormatrix = allErrorMatrix[0];
793  }
794  if (smallestDistanceIndex == 2 || smallestDistanceIndex == 4) {
795  finalposition = allLocalPositions[1];
796  finalerrormatrix = allErrorMatrix[1];
797  }
798  if (smallestDistanceIndex == 3 || smallestDistanceIndex == 5) {
799  finalposition = allLocalPositions[2];
800  finalerrormatrix = allErrorMatrix[2];
801  }
802  }
803  return true;
804 }
805 
806 bool
808  const Trk::TrackParameters &trackPar,
809  Amg::Vector2D &finalposition,
810  Amg::MatrixX &finalerrormatrix) const {
812  std::vector<Amg::Vector2D> vectorOfPositions;
813  int numberOfSubclusters = 1;
816  numberOfSubclusters = 1 + splitClusterMap->count(pixelPrepCluster);
817 
818  if (splitClusterMap->count(pixelPrepCluster) == 0 && splitProb.isSplit()) {
819  numberOfSubclusters = 2;
820  }
821  if (splitClusterMap->count(pixelPrepCluster) != 0 && !splitProb.isSplit()) {
822  numberOfSubclusters = 1;
823  }
824  }
825 
826  // now you have numberOfSubclusters and the vectorOfPositions (Amg::Vector2D)
827  if (trackPar.surfaceType() != Trk::SurfaceType::Plane ||
828  trackPar.type() != Trk::AtaSurface) {
829  ATH_MSG_WARNING("Parameters are not at a plane surface ! Aborting cluster "
830  "correction... ");
831  return false;
832  }
833 
834  std::vector<Amg::Vector2D> allLocalPositions;
835  std::vector<Amg::MatrixX> allErrorMatrix;
836  allLocalPositions = m_NnClusterizationFactory->estimatePositions(
837  *pixelPrepCluster,
838  trackPar.associatedSurface(),
839  trackPar,
840  allErrorMatrix,
841  numberOfSubclusters);
842 
843  if (allLocalPositions.empty()) {
845  " Cluster cannot be treated by NN. Giving back to default clusterization, too big: " <<
846  splitProb.isTooBigToBeSplit());
847  return false;
848  }
849 
850  if (allLocalPositions.size() != size_t(numberOfSubclusters)) {
852  "Returned position vector size " << allLocalPositions.size() << " not according to expected number of subclusters: " << numberOfSubclusters <<
853  ". Abort cluster correction...");
854  return false;
855  }
856 
857  // AKM: now the not so nice part find the best match position option
858  // Takes the error into account to scale the importance of the measurement
859 
860  if (numberOfSubclusters == 1) {
861  finalposition = allLocalPositions[0];
862  finalerrormatrix = allErrorMatrix[0];
863  return true;
864  }
865 
866  // Get the track parameters local position
867  const Amg::Vector2D localpos = trackPar.localPosition();
868  // Use the track parameters cov to weight distcances
869  Amg::Vector2D localerr(0.01, 0.05);
870  if (trackPar.covariance()) {
871  localerr = Amg::Vector2D(std::sqrt((*trackPar.covariance())(0, 0)), std::sqrt((*trackPar.covariance())(1, 1)));
872  }
873 
874  double minDistance(1e300);
875  int index(0);
876 
877  for (unsigned int i(0); i < allLocalPositions.size(); ++i) {
878  double distance =
879  square(localpos[0] - allLocalPositions[i][0]) / localerr[0]
880  + square(localpos[1] - allLocalPositions[i][1]) / localerr[1];
881 
882  if (distance < minDistance) {
883  index = i;
884  minDistance = distance;
885  }
886  }
887 
888  finalposition = allLocalPositions[index];
889  finalerrormatrix = allErrorMatrix[index];
890  return true;
891 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
xAOD::strategy
strategy
Definition: L2CombinedMuon_v1.cxx:107
PixelID.h
This is an Identifier helper class for the Pixel subdetector. This class is a factory for creating co...
query_example.row
row
Definition: query_example.py:24
Trk::LocalParameters
Definition: LocalParameters.h:98
python.SystemOfUnits.second
int second
Definition: SystemOfUnits.py:120
InDet::PixelClusterOnTrackTool::m_doNotRecalibrateNN
BooleanProperty m_doNotRecalibrateNN
Definition: PixelClusterOnTrackTool.h:179
InDet::PixelClusterOnTrackTool::m_splitClusterMapKey
SG::ReadHandleKey< InDet::PixelGangedClusterAmbiguities > m_splitClusterMapKey
Definition: PixelClusterOnTrackTool.h:184
PixelClusterOnTrackTool.h
PixelCalib::PixelClusterOnTrackErrorData::getBarrelBinEta
int getBarrelBinEta(double eta, int etaClusterSize, int phiClusterSize) const
Definition: PixelClusterOnTrackErrorData.cxx:166
PixelID::phi_index
int phi_index(const Identifier &id) const
Definition: PixelID.h:658
InDet::PixelClusterOnTrackTool::m_clusterSplitProbContainer
SG::ReadHandleKey< Trk::ClusterSplitProbabilityContainer > m_clusterSplitProbContainer
Definition: PixelClusterOnTrackTool.h:187
Amg::MatrixX
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Definition: EventPrimitives.h:27
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
InDet::PixelClusterOnTrackTool::m_clusterErrorKey
SG::ReadCondHandleKey< PixelCalib::PixelOfflineCalibData > m_clusterErrorKey
Definition: PixelClusterOnTrackTool.h:136
PixelCalib::PixelClusterOnTrackErrorData::getPixelBarrelPhiError
static double getPixelBarrelPhiError(double ang, int phiClusterSize)
Definition: PixelClusterOnTrackErrorData.cxx:89
InDetDD::PixelModuleDesign
Definition: PixelModuleDesign.h:48
Trk::ClusterSplitProbabilityContainer::ProbabilityInfo::isSplit
bool isSplit() const
Definition: ClusterSplitProbabilityContainer.h:27
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
index
Definition: index.py:1
Trk::ParametersBase::associatedSurface
virtual const Surface & associatedSurface() const override=0
Access to the Surface associated to the Parameters.
InDet::SiCluster::type
virtual bool type(Trk::PrepRawDataType type) const override
Interface method checking the type.
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
Trk::ClusterSplitProbabilityContainer::ProbabilityInfo
Definition: ClusterSplitProbabilityContainer.h:22
InDet::PixelClusterOnTrackTool::m_calphi
double m_calphi[s_nbinphi]
Definition: PixelClusterOnTrackTool.h:192
InDet::PixelClusterOnTrackTool::m_NnClusterizationFactory
ToolHandle< NnClusterizationFactory > m_NnClusterizationFactory
NN clusterizationi factory for NN based positions and errors.
Definition: PixelClusterOnTrackTool.h:174
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
InDet::PixelClusterOnTrackTool::m_phix
double m_phix[s_nbinphi+1]
Definition: PixelClusterOnTrackTool.h:196
InDet::PixelClusterOnTrackTool::initialize
virtual StatusCode initialize() override
AlgTool initialisation.
Definition: PixelClusterOnTrackTool.cxx:74
InDetDD::SolidStateDetectorElementBase::etaAxis
const Amg::Vector3D & etaAxis() const
Definition: SolidStateDetectorElementBase.cxx:88
Trk::PrepRawData::localCovariance
const Amg::MatrixX & localCovariance() const
return const ref to the error matrix
Trk::ParametersBase::surfaceType
constexpr virtual SurfaceType surfaceType() const override=0
Returns the Surface Type enum for the surface used to define the derived class.
PixelCalib::PixelOfflineCalibData::getPixelClusterErrorData
PixelClusterErrorData * getPixelClusterErrorData()
Definition: PixelOfflineCalibData.h:97
plotBeamSpotVxVal.cov
cov
Definition: plotBeamSpotVxVal.py:201
M_PI
#define M_PI
Definition: ActiveFraction.h:11
bin
Definition: BinsDiffFromStripMedian.h:43
InDet::PixelClusterOnTrackTool::m_distortionKey
SG::ReadCondHandleKey< PixelDistortionData > m_distortionKey
Definition: PixelClusterOnTrackTool.h:130
InDet::PixelClusterOnTrackTool::m_disableDistortions
BooleanProperty m_disableDistortions
toolhandle for central error scaling flag storing if errors need scaling or should be kept nominal
Definition: PixelClusterOnTrackTool.h:142
InDetDD::DetectorDesign::readoutSide
int readoutSide() const
ReadoutSide.
Definition: DetectorDesign.h:291
Trk::PrepRawData::type
virtual bool type(PrepRawDataType type) const =0
Interface method checking the type.
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
x
#define x
PixelCalib::PixelChargeInterpolationParameters::getDeltaYendcap
static float getDeltaYendcap()
Definition: PixelChargeInterpolationParameters.cxx:302
InDetDD::SolidStateDetectorElementBase::identifyHash
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)
PixelCalib::PixelClusterErrorData::getPixelEndcapPhiError
float getPixelEndcapPhiError(int ibin) const
Definition: PixelClusterErrorData.cxx:71
drawFromPickle.atan
atan
Definition: drawFromPickle.py:36
InDet::PixelClusterOnTrackTool::m_pixelErrorScalingKey
SG::ReadCondHandleKey< RIO_OnTrackErrorScaling > m_pixelErrorScalingKey
Definition: PixelClusterOnTrackTool.h:138
InDet::PixelClusterOnTrackTool::m_errorStrategy
std::atomic_int m_errorStrategy
Definition: PixelClusterOnTrackTool.h:146
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
InDet::PixelClusterOnTrackTool::finalize
virtual StatusCode finalize() override
AlgTool termination.
Definition: PixelClusterOnTrackTool.cxx:130
InDetDD::SiLocalPosition
Definition: SiLocalPosition.h:31
InDetDD::PixelModuleDesign::positionFromColumnRow
SiLocalPosition positionFromColumnRow(const int column, const int row) const
Given row and column index of a diode, return position of diode center ALTERNATIVE/PREFERED way is to...
Definition: PixelModuleDesign.cxx:242
InDetDD::SiLocalPosition::xPhi
double xPhi() const
position along phi direction:
Definition: SiLocalPosition.h:123
PixelCalib::PixelOfflineCalibData::getPixelClusterOnTrackErrorData
PixelClusterOnTrackErrorData * getPixelClusterOnTrackErrorData()
Definition: PixelOfflineCalibData.h:106
InDet::PixelClusterOnTrackTool::m_IBLParameterSvc
ServiceHandle< IIBLParameterSvc > m_IBLParameterSvc
Definition: PixelClusterOnTrackTool.h:177
PixelCalib::PixelClusterOnTrackErrorData::getBarrelBinPhi
int getBarrelBinPhi(double angle, int phiClusterSize) const
Definition: PixelClusterOnTrackErrorData.cxx:149
InDet::PixelClusterOnTrackTool::s_nbinphi
static constexpr int s_nbinphi
Definition: PixelClusterOnTrackTool.h:190
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
PixelID::wafer_hash
IdentifierHash wafer_hash(Identifier wafer_id) const
wafer hash from id
Definition: PixelID.h:387
InDet::PixelClusterOnTrackTool::m_lorentzAngleTool
ToolHandle< ISiLorentzAngleTool > m_lorentzAngleTool
Definition: PixelClusterOnTrackTool.h:133
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
InDet::PixelClusterOnTrackTool::m_IBLAbsent
bool m_IBLAbsent
Definition: PixelClusterOnTrackTool.h:170
lumiFormat.i
int i
Definition: lumiFormat.py:85
InDetDD::SiLocalPosition::xEta
double xEta() const
position along eta direction:
Definition: SiLocalPosition.h:118
InDet::PixelClusterStrategy
PixelClusterStrategy
Definition: PixelClusterOnTrackTool.h:54
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
angle
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
Definition: TRTDetectorFactory_Full.cxx:73
InDet::PixelClusterOnTrackTool::m_errorStrategyProperty
IntegerProperty m_errorStrategyProperty
Definition: PixelClusterOnTrackTool.h:148
PixelID::eta_index
int eta_index(const Identifier &id) const
Definition: PixelID.h:664
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
InDet::PIXELCLUSTER_SHARED
@ PIXELCLUSTER_SHARED
Definition: PixelClusterOnTrackTool.h:57
InDet::PixelClusterOnTrackTool::m_usingTIDE_Ambi
BooleanProperty m_usingTIDE_Ambi
Enable different treatment of cluster errors based on NN information (do only if TIDE ambi is run)
Definition: PixelClusterOnTrackTool.h:182
PixelCalib::PixelClusterErrorData::getPixelEndcapRError
float getPixelEndcapRError(int ibin) const
Definition: PixelClusterErrorData.cxx:77
InDet::PixelClusterOnTrackTool::m_caleta
double m_caleta[s_nbineta][3]
Definition: PixelClusterOnTrackTool.h:193
InDet::PixelClusterOnTrackTool::getClusterSplittingProbability
const Trk::ClusterSplitProbabilityContainer::ProbabilityInfo & getClusterSplittingProbability(const InDet::PixelCluster *pix) const
Definition: PixelClusterOnTrackTool.h:113
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
InDetDD::SiDetectorElement::isBlayer
bool isBlayer() const
Definition: SiDetectorElement.cxx:53
InDet::PixelClusterOnTrackTool::m_NNIBLcorrection
BooleanProperty m_NNIBLcorrection
Definition: PixelClusterOnTrackTool.h:169
Trk::ParametersBase
Definition: ParametersBase.h:55
python.SystemOfUnits.micrometer
int micrometer
Definition: SystemOfUnits.py:71
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
Trk::ParametersBase::type
constexpr virtual ParametersType type() const override=0
Return the ParametersType enum.
InDetDD::SolidStateDetectorElementBase::normal
virtual const Amg::Vector3D & normal() const override final
Get reconstruction local normal axes in global frame.
InDet::SiCluster::detectorElement
virtual const InDetDD::SiDetectorElement * detectorElement() const override final
return the detector element corresponding to this PRD The pointer will be zero if the det el is not d...
InDet::PixelClusterOnTrackTool::m_applyNNcorrectionProperty
BooleanProperty m_applyNNcorrectionProperty
Enable NN based calibration (do only if NN calibration is applied)
Definition: PixelClusterOnTrackTool.h:167
beamspotman.dir
string dir
Definition: beamspotman.py:623
Trk::PrepRawData
Definition: PrepRawData.h:62
Trk::ParametersCommon::localPosition
Amg::Vector2D localPosition() const
Access method for the local coordinates, local parameter definitions differ for each surface type.
EventPrimitives.h
PixelID::eta_module
int eta_module(const Identifier &id) const
Definition: PixelID.h:651
Trk::ParametersBase::pT
double pT() const
Access method for transverse momentum.
InDet::PIXELCLUSTER_OUTLIER
@ PIXELCLUSTER_OUTLIER
Definition: PixelClusterOnTrackTool.h:56
InDet::SiCluster::gangedPixel
bool gangedPixel() const
return the flag of this cluster containing a gangedPixel
InDet::PixelClusterOnTrackTool::m_calerrphi
double m_calerrphi[s_nbinphi][3]
Definition: PixelClusterOnTrackTool.h:194
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
Trk::PrepRawDataType::PixelCluster
@ PixelCluster
Trk::PrepRawData::localPosition
const Amg::Vector2D & localPosition() const
return the local position reference
plotBeamSpotVxVal.bin
int bin
Definition: plotBeamSpotVxVal.py:83
PixelCalib::PixelOfflineCalibData::getPixelChargeInterpolationParameters
PixelChargeInterpolationParameters * getPixelChargeInterpolationParameters()
Definition: PixelOfflineCalibData.h:101
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
InDetDD::SiDetectorElement::isBarrel
bool isBarrel() const
PixelCalib::PixelChargeInterpolationParameters::getVersion
int getVersion() const
Definition: PixelChargeInterpolationParameters.cxx:68
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
IBL_calibration.h
query_example.col
col
Definition: query_example.py:7
SiDetectorElement.h
ErrorScalingCast.h
Trk::ClusterSplitProbabilityContainer::ProbabilityInfo::isTooBigToBeSplit
bool isTooBigToBeSplit() const
Definition: ClusterSplitProbabilityContainer.h:26
InDet::PixelClusterOnTrackTool::PixelClusterOnTrackTool
PixelClusterOnTrackTool(const std::string &, const std::string &, const IInterface *)
AlgTool constructor.
Definition: PixelClusterOnTrackTool.cxx:58
InDet::PixelCluster
Definition: InnerDetector/InDetRecEvent/InDetPrepRawData/InDetPrepRawData/PixelCluster.h:49
PixelCalib::PixelClusterErrorData::getEndcapBin
int getEndcapBin(int etaClusterSize, int phiClusterSize) const
Definition: PixelClusterErrorData.cxx:165
Trk::AtaSurface
@ AtaSurface
Definition: ParametersCommon.h:29
Trk::ParametersBase::momentum
const Amg::Vector3D & momentum() const
Access method for the momentum.
InDet::SiCluster::globalPosition
const Amg::Vector3D & globalPosition() const
return global position reference
DeMoScan.index
string index
Definition: DeMoScan.py:364
InDet::PixelClusterOnTrackTool::correctBow
void correctBow(const Identifier &, Amg::Vector2D &locpos, const double tanphi, const double taneta, const EventContext &ctx) const
Definition: PixelClusterOnTrackTool.cxx:516
InDet::PixelClusterOnTrackTool::getErrorsTIDE_Ambi
bool getErrorsTIDE_Ambi(const InDet::PixelCluster *, const Trk::TrackParameters &, Amg::Vector2D &, Amg::MatrixX &) const
Definition: PixelClusterOnTrackTool.cxx:807
NnClusterizationFactory.h
Base_Fragment.width
width
Definition: Sherpa_i/share/common/Base_Fragment.py:59
InDet::PixelClusterOnTrack
Definition: PixelClusterOnTrack.h:51
PixelCalib::PixelClusterOnTrackErrorData::getPixelBarrelEtaError
float getPixelBarrelEtaError(int ibin) const
Definition: PixelClusterOnTrackErrorData.cxx:125
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
PixelModuleDesign.h
InDetDD::SolidStateDetectorElementBase::globalPosition
HepGeom::Point3D< double > globalPosition(const HepGeom::Point3D< double > &localPos) const
transform a reconstruction local position into a global position (inline):
InDet::PixelClusterOnTrackTool::correctNN
InDet::PixelClusterOnTrack * correctNN(const Trk::PrepRawData &, const Trk::TrackParameters &, const EventContext &ctx) const
Definition: PixelClusterOnTrackTool.cxx:548
PlaneSurface.h
InDetDD::SolidStateDetectorElementBase::phiAxis
const Amg::Vector3D & phiAxis() const
Definition: SolidStateDetectorElementBase.cxx:74
DeMoScan.first
bool first
Definition: DeMoScan.py:536
PixelCalib::PixelChargeInterpolationParameters::getDeltaYbarrel
float getDeltaYbarrel(int nCol, float eta, int ilayer=0) const
Definition: PixelChargeInterpolationParameters.cxx:219
PixelCalib::PixelChargeInterpolationParameters::getDeltaXbarrel
float getDeltaXbarrel(int nRows, float angle, int ilayer=0) const
Methods to access the calibration data as a function of the cluster size, angle/pseudorapidity,...
Definition: PixelChargeInterpolationParameters.cxx:209
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
InDet::PixelClusterOnTrackTool::correct
virtual InDet::PixelClusterOnTrack * correct(const Trk::PrepRawData &, const Trk::TrackParameters &, const EventContext &ctx=Gaudi::Hive::currentContext()) const override
produces a PixelClusterOnTrack (object factory!).
Definition: PixelClusterOnTrackTool.cxx:141
InDet::SiWidth
Definition: SiWidth.h:25
InDet::PixelClusterOnTrackTool::~PixelClusterOnTrackTool
virtual ~PixelClusterOnTrackTool()
Trk::ParametersBase::eta
double eta() const
Access method for pseudorapidity - from momentum.
Trk::SurfaceType::Plane
@ Plane
InDet::PixelClusterOnTrackTool::m_calerreta
double m_calerreta[s_nbineta][3]
Definition: PixelClusterOnTrackTool.h:195
InDet::PixelClusterOnTrackTool::s_nbineta
static constexpr int s_nbineta
Definition: PixelClusterOnTrackTool.h:191
InDet::PixelClusterOnTrackTool::m_applyNNcorrection
bool m_applyNNcorrection
Definition: PixelClusterOnTrackTool.h:168
AthAlgTool
Definition: AthAlgTool.h:26
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
InDet::PixelClusterOnTrackTool::m_pixelid
const PixelID * m_pixelid
Flag controlling how module distortions are taken into account:
Definition: PixelClusterOnTrackTool.h:164
pix
Definition: PixelMapping.cxx:16
InDetDD::SiDetectorElement::design
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
PixelID::phi_module
int phi_module(const Identifier &id) const
Definition: PixelID.h:644
InDet::PixelClusterOnTrackTool::getErrorsDefaultAmbi
bool getErrorsDefaultAmbi(const InDet::PixelCluster *, const Trk::TrackParameters &, Amg::Vector2D &, Amg::MatrixX &) const
Definition: PixelClusterOnTrackTool.cxx:659
InDet::PixelClusterOnTrackTool::correctDefault
InDet::PixelClusterOnTrack * correctDefault(const Trk::PrepRawData &, const Trk::TrackParameters &, const EventContext &ctx) const
The correct method produces a PixelClusterOnTrack using the measured PixelCluster and the track predi...
Definition: PixelClusterOnTrackTool.cxx:179
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
InDet::PixelClusterOnTrackTool::m_etax
double m_etax[s_nbineta+1]
Definition: PixelClusterOnTrackTool.h:197
InDet::PixelClusterOnTrackTool::m_positionStrategy
IntegerProperty m_positionStrategy
Definition: PixelClusterOnTrackTool.h:144
InDet::SiCluster
Definition: InnerDetector/InDetRecEvent/InDetPrepRawData/InDetPrepRawData/SiCluster.h:40
InDetDD::SolidStateDetectorElementBase::identify
virtual Identifier identify() const override final
identifier of this detector element (inline)
InDet::PixelClusterOnTrackTool::m_noNNandBroadErrors
BooleanProperty m_noNNandBroadErrors
Definition: PixelClusterOnTrackTool.h:180
NSWL1::centroid
Vertex centroid(const Polygon &p)
Definition: GeoUtils.cxx:59
PixelCalib::PixelChargeInterpolationParameters::getDeltaXendcap
static float getDeltaXendcap()
Definition: PixelChargeInterpolationParameters.cxx:298
fitman.k
k
Definition: fitman.py:528
Trk::PrepRawData::detectorElement
virtual const TrkDetElementBase * detectorElement() const =0
return the detector element corresponding to this PRD The pointer will be zero if the det el is not d...
Identifier
Definition: IdentifierFieldParser.cxx:14