CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PixelCPEBase.cc
Go to the documentation of this file.
1 // Move geomCorrection to the concrete class. d.k. 06/06.
2 // Change drift direction. d.k. 06/06
3 
4 // G. Giurgiu (ggiurgiu@pha.jhu.edu), 12/01/06, implemented the function:
5 // computeAnglesFromDetPosition(const SiPixelCluster & cl,
6 // const GeomDetUnit & det ) const
7 // 09/09/07, replaced assert statements with throw cms::Exception
8 // and fix an invalid pointer check in setTheDet function
9 // 09/21/07, implement caching of Lorentz drift direction
10 // 01/24/09, use atan2 to get the alpha and beta angles
11 // change to use Lorentz angle from DB Lotte Wilke, Jan. 31st, 2008
12 // Change to use Generic error & Template calibration from DB - D.Fehling 11/08
13 
14 
18 
20 
21 //#define TPDEBUG
22 #define CORRECT_FOR_BIG_PIXELS
23 
24 // MessageLogger
26 
27 // Magnetic field
29 
33 
34 #include <iostream>
35 
36 using namespace std;
37 
38 
39 namespace {
40  constexpr float degsPerRad = 57.29578;
41  constexpr float HALF_PI = 1.57079632679489656;
42  constexpr float PI = 2*HALF_PI;
43 }
44 
45 //-----------------------------------------------------------------------------
46 // A fairly boring constructor. All quantities are DetUnit-dependent, and
47 // will be initialized in setTheDet().
48 //-----------------------------------------------------------------------------
50  const SiPixelCPEGenericErrorParm * genErrorParm, const SiPixelTemplateDBObject * templateDBobject)
51  : theDet(nullptr), theTopol(nullptr), theRecTopol(nullptr), theParam(nullptr), nRecHitsTotal_(0), nRecHitsUsedEdge_(0),
52  probabilityX_(0.0), probabilityY_(0.0),
53  probabilityQ_(0.0), qBin_(0),
54  isOnEdge_(false), hasBadPixels_(false),
55  spansTwoROCs_(false), hasFilledProb_(false),
56  loc_trk_pred_(0.0, 0.0, 0.0, 0.0)
57 {
58  //--- Lorentz angle tangent per Tesla
59 
60  lorentzAngle_ = lorentzAngle;
61 
62  //--- Algorithm's verbosity
64  conf.getUntrackedParameter<int>("VerboseLevel",0);
65 
66  //-- Magnetic Field
67  magfield_ = mag;
68 
69  //-- Error Parametriaztion from DB for CPE Generic
70  genErrorParm_ = genErrorParm;
71 
72  //-- Template Calibration Object from DB
73  templateDBobject_ = templateDBobject;
74 
75  //-- Switch on/off E.B
76  alpha2Order = conf.getParameter<bool>("Alpha2Order");
77 
78  //--- A flag that could be used to change the behavior of
79  //--- clusterProbability() in TSiPixelRecHit (the *transient* one).
80  //--- The problem is that the transient hits are made after the CPE runs
81  //--- and they don't get the access to the PSet, so we pass it via the
82  //--- CPE itself...
83  //
85  = (unsigned int) conf.getParameter<int>("ClusterProbComputationFlag");
86 
87 }
88 
89 //-----------------------------------------------------------------------------
90 // One function to cache the variables common for one DetUnit.
91 //-----------------------------------------------------------------------------
92 void
93 PixelCPEBase::setTheDet( const GeomDetUnit & det, const SiPixelCluster & cluster ) const
94 {
95  if ( theDet != &det ) {
96 
97  //--- This is a new det unit, so cache it
98  theDet = dynamic_cast<const PixelGeomDetUnit*>( &det );
99 
100  if unlikely( !theDet ) {
101  throw cms::Exception(" PixelCPEBase::setTheDet : ")
102  << " Wrong pointer to PixelGeomDetUnit object !!!";
103  }
104 
106 
107  //--- theDet->type() returns a GeomDetType, which implements subDetector()
109 
110 #ifdef EDM_ML_DEBUG
111  switch ( thePart ) {
113  // A barrel! A barrel!
114  break;
116  // A forward! A forward!
117  break;
118  default:
119  throw cms::Exception("PixelCPEBase::setTheDet :")
120  << "PixelCPEBase: A non-pixel detector type in here?" ;
121  }
122 #endif
123 
124  //--- The location in of this DetUnit in a cyllindrical coord system (R,Z)
125  //--- The call goes via BoundSurface, returned by theDet->surface(), but
126  //--- position() is implemented in GloballyPositioned<> template
127  //--- ( BoundSurface : Surface : GloballyPositioned<float> )
129  theDetZ = theDet->surface().position().z();
130  //--- Define parameters for chargewidth calculation
131 
132  //--- bounds() is implemented in BoundSurface itself.
134 
135  //--- Cache the topology.
136  // ggiurgiu@jhu.edu 12/09/2010 : no longer need to dynamyc cast to RectangularPixelTopology
137  //theTopol
138  //= dynamic_cast<const RectangularPixelTopology*>( & (theDet->specificTopology()) );
139 
140  auto topol = &(theDet->specificTopology());
141  if unlikely(topol!=theTopol) { // there is ONE topology!)
142  theTopol=topol;
143  auto const proxyT = dynamic_cast<const ProxyPixelTopology*>(theTopol);
144  if (proxyT) theRecTopol = dynamic_cast<const RectangularPixelTopology*>(&(proxyT->specificTopology()));
145  else theRecTopol = dynamic_cast<const RectangularPixelTopology*>(theTopol);
146  assert(theRecTopol);
147 
148  //---- The geometrical description of one module/plaquette
149  theNumOfRow = theRecTopol->nrows(); // rows in x
150  theNumOfCol = theRecTopol->ncolumns(); // cols in y
151  std::pair<float,float> pitchxy = theRecTopol->pitch();
152  thePitchX = pitchxy.first; // pitch along x
153  thePitchY = pitchxy.second; // pitch along y
154  }
155 
156  theSign = isFlipped() ? -1 : 1;
157 
158 
159  // will cache if not yest there (need some of the above)
160  theParam = &param();
161 
162  // this "has wrong sign..."
163  driftDirection_ = (*theParam).drift;
164 
165 
166  //--- The Lorentz shift.
168 
170 
171  // testing
173  //cout<<" lorentz shift "<<theLShiftX<<" "<<theLShiftY<<endl;
174  theLShiftY=0.;
175  }
176 
177  LogDebug("PixelCPEBase") << "***** PIXEL LAYOUT *****"
178  << " thePart = " << thePart
179  << " theThickness = " << theThickness
180  << " thePitchX = " << thePitchX
181  << " thePitchY = " << thePitchY
182  << " theLShiftX = " << theLShiftX;
183 
184 
185  }
186 
187 
188  //--- Geometric Quality Information
189  int minInX,minInY,maxInX,maxInY=0;
190  minInX = cluster.minPixelRow();
191  minInY = cluster.minPixelCol();
192  maxInX = cluster.maxPixelRow();
193  maxInY = cluster.maxPixelCol();
194 
195  isOnEdge_ = theRecTopol->isItEdgePixelInX(minInX) | theRecTopol->isItEdgePixelInX(maxInX) |
196  theRecTopol->isItEdgePixelInY(minInY) | theRecTopol->isItEdgePixelInY(maxInY) ;
197 
198  // Bad Pixels have their charge set to 0 in the clusterizer
199  hasBadPixels_ = false;
200  for(unsigned int i=0; i<cluster.pixelADC().size(); ++i) {
201  if(cluster.pixelADC()[i] == 0) { hasBadPixels_ = true; break;}
202  }
203 
204  spansTwoROCs_ = theRecTopol->containsBigPixelInX(minInX,maxInX) |
205  theRecTopol->containsBigPixelInY(minInY,maxInY);
206 
207 }
208 
209 
210 //-----------------------------------------------------------------------------
211 // Compute alpha_ and beta_ from the LocalTrajectoryParameters.
212 // Note: should become const after both localParameters() become const.
213 //-----------------------------------------------------------------------------
214 void PixelCPEBase::
216  const LocalTrajectoryParameters & ltp) const
217 {
218  loc_traj_param_ = ltp;
219 
220  LocalVector localDir = ltp.momentum();
221 
222 
223  float locx = localDir.x();
224  float locy = localDir.y();
225  float locz = localDir.z();
226 
227  /*
228  // Danek's definition
229  alpha_ = acos(locx/sqrt(locx*locx+locz*locz));
230  if ( isFlipped() ) // &&& check for FPIX !!!
231  alpha_ = PI - alpha_ ;
232  beta_ = acos(locy/sqrt(locy*locy+locz*locz));
233  */
234 
235 
236  cotalpha_ = locx/locz;
237  cotbeta_ = locy/locz;
238  zneg = (locz < 0);
239 
240 
241  LocalPoint trk_lp = ltp.position();
242  trk_lp_x = trk_lp.x();
243  trk_lp_y = trk_lp.y();
244 
245  with_track_angle = true;
246 
247 
248  // ggiurgiu@jhu.edu 12/09/2010 : needed to correct for bows/kinks
249  AlgebraicVector5 vec_trk_parameters = ltp.mixedFormatVector();
250  loc_trk_pred_ = Topology::LocalTrackPred( vec_trk_parameters );
251 
252 }
253 
254 //-----------------------------------------------------------------------------
255 // Estimate theAlpha for barrel, based on the det position.
256 // &&& Needs to be consolidated from the above.
257 //-----------------------------------------------------------------------------
258 //float
259 //PixelCPEBase::estimatedAlphaForBarrel(float centerx) const
260 //{
261 // float tanalpha = theSign * (centerx-theOffsetX) * thePitchX / theDetR;
262 // return PI/2.0 - atan(tanalpha);
263 //}
264 
265 
266 
267 
268 //-----------------------------------------------------------------------------
269 // Compute alpha_ and beta_ from the position of this DetUnit.
270 // &&& DOES NOT WORK FOR NOW. d.k. 6/06
271 // The angles from dets are calculated internaly in the PixelCPEInitial class
272 //-----------------------------------------------------------------------------
273 // G. Giurgiu, 12/01/06 : implement the function
274 void PixelCPEBase::
276 {
277 
278 
279  /*
280  // get cluster center of gravity (of charge)
281  float xcenter = cl.x();
282  float ycenter = cl.y();
283 
284  // get the cluster position in local coordinates (cm)
285 
286  // ggiurgiu@jhu.edu 12/09/2010 : This function is called without track info, therefore there are no track
287  // angles to provide here. Call the default localPosition (without track info)
288  LocalPoint lp = theTopol->localPosition( MeasurementPoint(xcenter, ycenter) );
289 
290 
291  // get the cluster position in global coordinates (cm)
292  GlobalPoint gp = theDet->surface().toGlobal( lp );
293  float gp_mod = sqrt( gp.x()*gp.x() + gp.y()*gp.y() + gp.z()*gp.z() );
294 
295  // normalize
296  float gpx = gp.x()/gp_mod;
297  float gpy = gp.y()/gp_mod;
298  float gpz = gp.z()/gp_mod;
299 
300  // make a global vector out of the global point; this vector will point from the
301  // origin of the detector to the cluster
302  GlobalVector gv(gpx, gpy, gpz);
303 
304  // make local unit vector along local X axis
305  const Local3DVector lvx(1.0, 0.0, 0.0);
306 
307  // get the unit X vector in global coordinates/
308  GlobalVector gvx = theDet->surface().toGlobal( lvx );
309 
310  // make local unit vector along local Y axis
311  const Local3DVector lvy(0.0, 1.0, 0.0);
312 
313  // get the unit Y vector in global coordinates
314  GlobalVector gvy = theDet->surface().toGlobal( lvy );
315 
316  // make local unit vector along local Z axis
317  const Local3DVector lvz(0.0, 0.0, 1.0);
318 
319  // get the unit Z vector in global coordinates
320  GlobalVector gvz = theDet->surface().toGlobal( lvz );
321 
322  // calculate the components of gv (the unit vector pointing to the cluster)
323  // in the local coordinate system given by the basis {gvx, gvy, gvz}
324  // note that both gv and the basis {gvx, gvy, gvz} are given in global coordinates
325  float gv_dot_gvx = gv.x()*gvx.x() + gv.y()*gvx.y() + gv.z()*gvx.z();
326  float gv_dot_gvy = gv.x()*gvy.x() + gv.y()*gvy.y() + gv.z()*gvy.z();
327  float gv_dot_gvz = gv.x()*gvz.x() + gv.y()*gvz.y() + gv.z()*gvz.z();
328  */
329 
330  // all the above is equivalent to
331  LocalPoint lp = theTopol->localPosition( MeasurementPoint(cl.x(), cl.y()) );
332  auto gvx = lp.x()-theOrigin.x();
333  auto gvy = lp.y()-theOrigin.y();
334  auto gvz = -1.f/theOrigin.z();
335  // normalization not required as only ratio used...
336 
337 
338  zneg = (gvz < 0);
339 
340  // calculate angles
341  cotalpha_ = gvx*gvz;
342  cotbeta_ = gvy*gvz;
343 
344  with_track_angle = false;
345 
346 
347  /*
348  // used only in dberror param...
349  auto alpha = HALF_PI - std::atan(cotalpha_);
350  auto beta = HALF_PI - std::atan(cotbeta_);
351  if (zneg) { beta -=PI; alpha -=PI;}
352 
353  auto alpha_ = atan2( gv_dot_gvz, gv_dot_gvx );
354  auto beta_ = atan2( gv_dot_gvz, gv_dot_gvy );
355 
356  std::cout << "alpha/beta " << alpha_ <<','<<alpha <<' '<< beta_<<','<<beta <<','<< HALF_PI-beta << std::endl;
357  assert(std::abs(std::round(alpha*10000.f)-std::round(alpha_*10000.f))<2);
358  assert(std::abs(std::round(beta*10000.f)-std::round(beta_*10000.f))<2);
359  */
360 
361 }
362 
363 
364 
365 //-----------------------------------------------------------------------------
366 // The isFlipped() is a silly way to determine which detectors are inverted.
367 // In the barrel for every 2nd ladder the E field direction is in the
368 // global r direction (points outside from the z axis), every other
369 // ladder has the E field inside. Something similar is in the
370 // forward disks (2 sides of the blade). This has to be recognised
371 // because the charge sharing effect is different.
372 //
373 // The isFliped does it by looking and the relation of the local (z always
374 // in the E direction) to global coordinates. There is probably a much
375 // better way.
376 //-----------------------------------------------------------------------------
378 {
379  // Check the relative position of the local +/- z in global coordinates.
380  float tmp1 = theDet->surface().toGlobal(Local3DPoint(0.,0.,0.)).perp2();
381  float tmp2 = theDet->surface().toGlobal(Local3DPoint(0.,0.,1.)).perp2();
382  //cout << " 1: " << tmp1 << " 2: " << tmp2 << endl;
383  if ( tmp2<tmp1 ) return true;
384  else return false;
385 }
386 
388  auto i = theDet->index();
389  if (i>=int(m_Params.size())) m_Params.resize(i+1); // should never happen!
390  Param & p = m_Params[i];
391  if unlikely ( p.bz<-1.e10f ) {
393  p.drift = driftDirection(Bfield );
394  p.bz = Bfield.z();
395  }
396  return p;
397 }
398 
399 
400 //-----------------------------------------------------------------------------
401 // HALF OF the Lorentz shift (so for the full shift multiply by 2), and
402 // in the units of pitch. (So note these are neither local nor measurement
403 // units!)
404 //-----------------------------------------------------------------------------
406 {
408 
409  // max shift in cm
410  float xdrift = dir.x()/dir.z() * theThickness;
411  // express the shift in units of pitch,
412  // divide by 2 to get the average correction
413  float lshift = xdrift / (thePitchX*2.);
414 
415  return lshift;
416 
417 
418 }
419 
421 {
422 
424 
425  float ydrift = dir.y()/dir.z() * theThickness;
426  float lshift = ydrift / (thePitchY * 2.f);
427  return lshift;
428 
429 
430 }
431 
432 
433 //-----------------------------------------------------------------------------
434 // Drift direction.
435 // Works OK for barrel and forward.
436 // The formulas used for dir_x,y,z have to be exactly the same as the ones
437 // used in the digitizer (SiPixelDigitizerAlgorithm.cc).
438 // Assumption: setTheDet() has been called already.
439 //
440 // Petar (2/23/07): uhm, actually, there is a bug in the sign for both X and Y!
441 // (The signs have been fixed in SiPixelDigitizer, but not in here.)
442 //-----------------------------------------------------------------------------
445 
446  Frame detFrame(theDet->surface().position(), theDet->surface().rotation());
447  LocalVector Bfield = detFrame.toLocal(bfield);
448  return driftDirection(Bfield);
449 
450 }
451 
454 
455 
457  float alpha2 = alpha2Order ? langle*langle : 0;
458 
459 
460  // &&& dir_x should have a "-" and dir_y a "+"
461  // **********************************************************************
462  // Our convention is the following:
463  // +x is defined by the direction of the Lorentz drift!
464  // +z is defined by the direction of E field (so electrons always go into -z!)
465  // +y is defined by +x and +z, and it turns out to be always opposite to the +B field.
466  // **********************************************************************
467 
468  float dir_x = ( langle * Bfield.y() + alpha2* Bfield.z()* Bfield.x() );
469  float dir_y = -( langle * Bfield.x() - alpha2* Bfield.z()* Bfield.y() );
470  float dir_z = -( 1.f + alpha2* Bfield.z()*Bfield.z() );
471  auto scale = 1.f/std::abs( dir_z ); // same as 1 + alpha2*Bfield.z()*Bfield.z()
472  LocalVector dd(dir_x*scale, dir_y*scale, -1.f ); // last is -1 !
473 
474  LogDebug("PixelCPEBase") << " The drift direction in local coordinate is " << dd ;
475 
476  return dd;
477 }
478 
479 //-----------------------------------------------------------------------------
480 // One-shot computation of the driftDirection and both lorentz shifts
481 //-----------------------------------------------------------------------------
482 void
484  // this "has wrong sign..." so "corrected below
486 
487  // Max shift (at the other side of the sensor) in cm
489  // Express the shift in units of pitch,
491 
492  // Max shift (at the other side of the sensor) in cm
494  // Express the shift in units of pitch,
496 
497 
498  LogDebug("PixelCPEBase") << " The drift direction in local coordinate is "
499  << driftDirection_ ;
500 }
501 
502 //-----------------------------------------------------------------------------
507 //-----------------------------------------------------------------------------
510 {
512 
514  qualWord );
515 
517  qualWord );
518 
520  qualWord );
521 
523  qualWord );
524 
526  qualWord );
527 
529  qualWord );
530 
532  qualWord );
533 
534  return qualWord;
535 }
#define LogDebug(id)
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:114
T getParameter(std::string const &) const
void setProbabilityXY(float prob, QualWordType &qualWord) const
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
Topology::LocalTrackPred loc_trk_pred_
Definition: PixelCPEBase.h:253
static const Packing thePacking
PixelCPEBase(edm::ParameterSet const &conf, const MagneticField *mag=0, const SiPixelLorentzAngle *lorentzAngle=0, const SiPixelCPEGenericErrorParm *genErrorParm=0, const SiPixelTemplateDBObject *templateDBobject=0)
Definition: PixelCPEBase.cc:49
int minPixelCol() const
float theNumOfRow
Definition: PixelCPEBase.h:181
bool with_track_angle
Definition: PixelCPEBase.h:203
T perp() const
Definition: PV3DBase.h:72
virtual LocalPoint localPosition(const MeasurementPoint &) const =0
#define PI
void computeAnglesFromDetPosition(const SiPixelCluster &cl) const
LocalPoint position() const
Local x and y position coordinates.
virtual GlobalVector inTesla(const GlobalPoint &gp) const =0
Field value ad specified global point, in Tesla.
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
float theLShiftY
Definition: PixelCPEBase.h:186
float theThickness
Definition: PixelCPEBase.h:176
#define nullptr
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
unsigned int clusterProbComputationFlag_
Definition: PixelCPEBase.h:221
T y() const
Definition: PV3DBase.h:63
SiPixelRecHitQuality::QualWordType rawQualityWord() const
float lorentzShiftX_
Definition: PixelCPEBase.h:230
const Bounds & bounds() const
Definition: Surface.h:128
float probabilityQ_
Definition: PixelCPEBase.h:208
T perp2() const
Definition: PV3DBase.h:71
bool spansTwoROCs_
Definition: PixelCPEBase.h:212
GeomDetType::SubDetector thePart
Definition: PixelCPEBase.h:173
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:35
float theNumOfCol
Definition: PixelCPEBase.h:182
int maxPixelRow() const
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
virtual float thickness() const =0
#define unlikely(x)
Definition: Likely.h:21
LocalVector drift
Definition: PixelCPEBase.h:54
Measurement2DPoint MeasurementPoint
Measurement points are two-dimensional by default.
int minPixelRow() const
bool hasBadPixels_
Definition: PixelCPEBase.h:211
LocalVector driftDirection_
Definition: PixelCPEBase.h:229
float lorentzShiftY_
Definition: PixelCPEBase.h:231
void computeLorentzShifts() const
bool isFlipped() const
Param const & param() const
LocalPoint toLocal(const GlobalPoint &gp) const
bool hasFilledProb_
Definition: PixelCPEBase.h:213
T z() const
Definition: PV3DBase.h:64
LocalVector driftDirection(GlobalVector bfield) const
float lorentzShiftInCmY_
Definition: PixelCPEBase.h:233
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const float degsPerRad
const SiPixelTemplateDBObject * templateDBobject_
Definition: PixelCPEBase.h:246
void setHasBadPixels(bool flag, QualWordType &qualWord) const
DetId geographicalId() const
The label of this GeomDet.
Definition: GeomDet.h:72
double f[11][100]
const MagneticField * magfield_
Definition: PixelCPEBase.h:240
LocalVector momentum() const
Momentum vector in the local frame.
int index() const
Definition: GeomDet.h:92
void setProbabilityQ(float prob, QualWordType &qualWord) const
void setSpansTwoROCs(bool flag, QualWordType &qualWord) const
const std::vector< uint16_t > & pixelADC() const
tuple conf
Definition: dbtoconf.py:185
Local3DPoint theOrigin
Definition: PixelCPEBase.h:174
Point3DBase< float, LocalTag > Local3DPoint
Definition: LocalPoint.h:9
void setIsOnEdge(bool flag, QualWordType &qualWord) const
const RectangularPixelTopology * theRecTopol
Definition: PixelCPEBase.h:169
ROOT::Math::SVector< double, 5 > AlgebraicVector5
LocalTrajectoryParameters loc_traj_param_
Definition: PixelCPEBase.h:255
const SiPixelLorentzAngle * lorentzAngle_
Definition: PixelCPEBase.h:242
virtual const PixelTopology & specificTopology() const
Returns a reference to the pixel proxy topology.
const PixelTopology * theTopol
Definition: PixelCPEBase.h:168
int maxPixelCol() const
AlgebraicVector5 mixedFormatVector() const
void setTheDet(const GeomDetUnit &det, const SiPixelCluster &cluster) const
Definition: PixelCPEBase.cc:93
float lorentzShiftX() const
Pixel cluster – collection of neighboring pixels above threshold.
float lorentzShiftInCmX_
Definition: PixelCPEBase.h:232
LocalVector const & getDrift() const
Definition: PixelCPEBase.h:288
float probabilityXY() const
Definition: PixelCPEBase.h:120
float getLorentzAngle(const uint32_t &) const
float y() const
const RotationType & rotation() const
Params m_Params
Definition: PixelCPEBase.h:297
virtual const GeomDetType & type() const
dbl *** dir
Definition: mlp_gen.cc:35
volatile std::atomic< bool > shutdown_flag false
const PixelGeomDetUnit * theDet
Definition: PixelCPEBase.h:164
Param const * theParam
Definition: PixelCPEBase.h:171
float theLShiftX
Definition: PixelCPEBase.h:185
void setHasFilledProb(bool flag, QualWordType &qualWord) const
float lorentzShiftY() const
T x() const
Definition: PV3DBase.h:62
const PositionType & position() const
void setQBin(int qbin, QualWordType &qualWord) const
float x() const
SubDetector subDetector() const
Definition: GeomDetType.h:22
#define constexpr
void computeAnglesFromTrajectory(const SiPixelCluster &cl, const LocalTrajectoryParameters &ltp) const
const SiPixelCPEGenericErrorParm * genErrorParm_
Definition: PixelCPEBase.h:244