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 // G. Giurgiu (ggiurgiu@pha.jhu.edu), 12/01/06, implemented the function:
4 // computeAnglesFromDetPosition(const SiPixelCluster & cl,
5 // change to use Lorentz angle from DB Lotte Wilke, Jan. 31st, 2008
6 // Change to use Generic error & Template calibration from DB - D.Fehling 11/08
7 
8 
12 
14 
15 #define CORRECT_FOR_BIG_PIXELS
16 
17 // MessageLogger
19 
20 // Magnetic field
22 
23 
24 #include <iostream>
25 
26 using namespace std;
27 
28 #define NEW_CPEERROR // must be constistent with base.cc, generic cc/h and genericProducer.cc
29 
30 namespace {
31 #ifndef NEW_CPEERROR
32  //const bool useNewSimplerErrors = true;
33  const bool useNewSimplerErrors = false; // must be tha same as in generic
34 #endif
35 }
36 
37 //-----------------------------------------------------------------------------
38 // A constructor run for generic and templates
39 //
40 //-----------------------------------------------------------------------------
42  const MagneticField *mag,
43  const TrackerGeometry& geom,
44  const TrackerTopology& ttopo,
45  const SiPixelLorentzAngle * lorentzAngle,
46  const SiPixelGenErrorDBObject * genErrorDBObject,
47  const SiPixelTemplateDBObject * templateDBobject,
48  const SiPixelLorentzAngle * lorentzAngleWidth,
49  int flag)
50  // : useLAAlignmentOffsets_(false), useLAOffsetFromConfig_(false),
51  : useLAOffsetFromConfig_(false),
52  useLAWidthFromConfig_(false), useLAWidthFromDB_(false), theFlag_(flag),
53  magfield_(mag), geom_(geom), ttopo_(ttopo)
54 {
55 
56 #ifdef EDM_ML_DEBUG
57  nRecHitsTotal_=0;
58  nRecHitsUsedEdge_=0,
59 #endif
60 
61  //--- Lorentz angle tangent per Tesla
62  lorentzAngle_ = lorentzAngle;
63  lorentzAngleWidth_ = lorentzAngleWidth;
64 
65  //-- GenError Calibration Object (different from SiPixelCPEGenericErrorParm) from DB
66  genErrorDBObject_ = genErrorDBObject;
67  //cout<<" new errors "<<genErrorDBObject<<" "<<genErrorDBObject_<<endl;
68 
69  //-- Template Calibration Object from DB
70 #ifdef NEW_CPEERROR
71  if(theFlag_!=0) templateDBobject_ = templateDBobject; // flag to check if it is generic or templates
72 #else
73  templateDBobject_ = templateDBobject;
74 #endif
75 
76  // Configurables
77  // For both templates & generic
78 
79  // Read templates and/or generic errors from DB
80  LoadTemplatesFromDB_ = conf.getParameter<bool>("LoadTemplatesFromDB");
81  //cout<<" use generros/templaets "<<LoadTemplatesFromDB_<<endl;
82 
83  //--- Algorithm's verbosity
85  conf.getUntrackedParameter<int>("VerboseLevel",0);
86 
87  //-- Switch on/off E.B
88  alpha2Order = conf.getParameter<bool>("Alpha2Order");
89 
90  //--- A flag that could be used to change the behavior of
91  //--- clusterProbability() in TSiPixelRecHit (the *transient* one).
92  //--- The problem is that the transient hits are made after the CPE runs
93  //--- and they don't get the access to the PSet, so we pass it via the
94  //--- CPE itself...
95  //
97  = (unsigned int) conf.getParameter<int>("ClusterProbComputationFlag");
98 
99  // This LA related parameters are only relevant for the Generic algo
100  // They still have to be used in Base since the LA computation is in Base
101 
102  // Use LA-width from DB.
103  // If both (this and from config) are false LA-width is calcuated from LA-offset
104  useLAWidthFromDB_ = conf.existsAs<bool>("useLAWidthFromDB")?
105  conf.getParameter<bool>("useLAWidthFromDB"):false;
106 
107  // Use Alignment LA-offset in generic
108  //useLAAlignmentOffsets_ = conf.existsAs<bool>("useLAAlignmentOffsets")?
109  //conf.getParameter<bool>("useLAAlignmentOffsets"):false;
110 
111  // Used only for testing
112  lAOffset_ = conf.existsAs<double>("lAOffset")? // fixed LA value
113  conf.getParameter<double>("lAOffset"):0.0;
114  lAWidthBPix_ = conf.existsAs<double>("lAWidthBPix")? // fixed LA width
115  conf.getParameter<double>("lAWidthBPix"):0.0;
116  lAWidthFPix_ = conf.existsAs<double>("lAWidthFPix")? // fixed LA width
117  conf.getParameter<double>("lAWidthFPix"):0.0;
118 
119  // Use LA-offset from config, for testing only
120  if(lAOffset_>0.0) useLAOffsetFromConfig_ = true;
121  // Use LA-width from config, split into fpix & bpix, for testing only
122  if(lAWidthBPix_>0.0 || lAWidthFPix_>0.0) useLAWidthFromConfig_ = true;
123 
124 
125  // For Templates only
126  // Compute the Lorentz shifts for this detector element for templates (from Alignment)
127  DoLorentz_ = conf.existsAs<bool>("DoLorentz")?conf.getParameter<bool>("DoLorentz"):false;
128 
129  LogDebug("PixelCPEBase") <<" LA constants - "
130  <<lAOffset_<<" "<<lAWidthBPix_<<" "<<lAWidthFPix_<<endl; //dk
131 
132  fillDetParams();
133 
134  //cout<<" LA "<<lAOffset_<<" "<<lAWidthBPix_<<" "<<lAWidthFPix_<<endl; //dk
135 }
136 
137 //-----------------------------------------------------------------------------
138 // Fill all variables which are constant for an event (geometry)
139 //-----------------------------------------------------------------------------
141 {
142  //cout<<" in fillDetParams "<<theFlag_<<endl;
143 
144  auto const & dus = geom_.detUnits();
145  unsigned m_detectors = dus.size();
146  for(unsigned int i=1;i<7;++i) {
147  LogDebug("LookingForFirstStrip") << "Subdetector " << i
148  << " GeomDetEnumerator " << GeomDetEnumerators::tkDetEnum[i]
149  << " offset " << geom_.offsetDU(GeomDetEnumerators::tkDetEnum[i])
150  << " is it strip? " << (geom_.offsetDU(GeomDetEnumerators::tkDetEnum[i]) != dus.size() ?
151  dus[geom_.offsetDU(GeomDetEnumerators::tkDetEnum[i])]->type().isTrackerStrip() : false);
152  if(geom_.offsetDU(GeomDetEnumerators::tkDetEnum[i]) != dus.size() &&
153  dus[geom_.offsetDU(GeomDetEnumerators::tkDetEnum[i])]->type().isTrackerStrip()) {
155  }
156  }
157  LogDebug("LookingForFirstStrip") << " Chosen offset: " << m_detectors;
158 
159 
160  m_DetParams.resize(m_detectors);
161  //cout<<"caching "<<m_detectors<<" pixel detectors"<<endl;
162  for (unsigned i=0; i!=m_detectors;++i) {
163  auto & p=m_DetParams[i];
164  p.theDet = dynamic_cast<const PixelGeomDetUnit*>(dus[i]);
165  assert(p.theDet);
166  assert(p.theDet->index()==int(i));
167 
168  p.theOrigin = p.theDet->surface().toLocal(GlobalPoint(0,0,0));
169 
170  //--- p.theDet->type() returns a GeomDetType, which implements subDetector()
171  p.thePart = p.theDet->type().subDetector();
172 
173  //cout<<" in PixelCPEBase - in det "<<thePart<<endl; //dk
174 
175  //--- The location in of this DetUnit in a cyllindrical coord system (R,Z)
176  //--- The call goes via BoundSurface, returned by p.theDet->surface(), but
177  //--- position() is implemented in GloballyPositioned<> template
178  //--- ( BoundSurface : Surface : GloballyPositioned<float> )
179  //p.theDetR = p.theDet->surface().position().perp(); //Not used, AH
180  //p.theDetZ = p.theDet->surface().position().z(); //Not used, AH
181  //--- Define parameters for chargewidth calculation
182 
183  //--- bounds() is implemented in BoundSurface itself.
184  p.theThickness = p.theDet->surface().bounds().thickness();
185 
186  // Cache the det id for templates and generic erros
187 
188  if(theFlag_==0) { // for generic
189 #ifdef NEW_CPEERROR
190  if(LoadTemplatesFromDB_ ) // do only if genError requested
191  p.detTemplateId = genErrorDBObject_->getGenErrorID(p.theDet->geographicalId().rawId());
192 #else
193  if(useNewSimplerErrors)
194  p.detTemplateId = genErrorDBObject_->getGenErrorID(p.theDet->geographicalId().rawId());
195  else
196  p.detTemplateId = templateDBobject_->getTemplateID(p.theDet->geographicalId().rawId());
197 #endif
198  } else { // for templates
199  p.detTemplateId = templateDBobject_->getTemplateID(p.theDet->geographicalId());
200  }
201 
202  // just for testing
203  //int i1 = 0;
204  //if(theFlag_==0) i1 = genErrorDBObject_->getGenErrorID(p.theDet->geographicalId().rawId());
205  //int i2= templateDBobject_->getTemplateID(p.theDet->geographicalId().rawId());
206  //int i3= templateDBobject_->getTemplateID(p.theDet->geographicalId());
207  //if(i2!=i3) cout<<i2<<" != "<<i3<<endl;
208  //cout<<i<<" "<<p.detTemplateId<<" "<<i1<<" "<<i2<<" "<<i3<<endl;
209 
210  auto topol = &(p.theDet->specificTopology());
211  p.theTopol=topol;
212  auto const proxyT = dynamic_cast<const ProxyPixelTopology*>(p.theTopol);
213  if (proxyT) p.theRecTopol = dynamic_cast<const RectangularPixelTopology*>(&(proxyT->specificTopology()));
214  else p.theRecTopol = dynamic_cast<const RectangularPixelTopology*>(p.theTopol);
215  assert(p.theRecTopol);
216 
217  //---- The geometrical description of one module/plaquette
218  //p.theNumOfRow = p.theRecTopol->nrows(); // rows in x //Not used, AH
219  //p.theNumOfCol = p.theRecTopol->ncolumns(); // cols in y //Not used, AH
220  std::pair<float,float> pitchxy = p.theRecTopol->pitch();
221  p.thePitchX = pitchxy.first; // pitch along x
222  p.thePitchY = pitchxy.second; // pitch along y
223 
224  //p.theSign = isFlipped(&p) ? -1 : 1; //Not used, AH
225 
226  LocalVector Bfield = p.theDet->surface().toLocal(magfield_->inTesla(p.theDet->surface().position()));
227  p.bz = Bfield.z();
228 
229 
230  // Compute the Lorentz shifts for this detector element
231  if ( (theFlag_==0) || DoLorentz_ ) { // do always for generic and if(DOLorentz) for templates
232  p.driftDirection = driftDirection(p, Bfield );
234  }
235 
236 
237  LogDebug("PixelCPEBase") << "***** PIXEL LAYOUT *****"
238  << " thePart = " << p.thePart
239  << " theThickness = " << p.theThickness
240  << " thePitchX = " << p.thePitchX
241  << " thePitchY = " << p.thePitchY;
242  // << " theLShiftX = " << p.theLShiftX;
243 
244 
245  }
246 }
247 
248 //-----------------------------------------------------------------------------
249 // One function to cache the variables common for one DetUnit.
250 //-----------------------------------------------------------------------------
251 void
252 PixelCPEBase::setTheClu( DetParam const & theDetParam, ClusterParam & theClusterParam ) const
253 {
254 
255  //--- Geometric Quality Information
256  int minInX,minInY,maxInX,maxInY=0;
257  minInX = theClusterParam.theCluster->minPixelRow();
258  minInY = theClusterParam.theCluster->minPixelCol();
259  maxInX = theClusterParam.theCluster->maxPixelRow();
260  maxInY = theClusterParam.theCluster->maxPixelCol();
261 
262  theClusterParam.isOnEdge_ = theDetParam.theRecTopol->isItEdgePixelInX(minInX) | theDetParam.theRecTopol->isItEdgePixelInX(maxInX) |
263  theDetParam.theRecTopol->isItEdgePixelInY(minInY) | theDetParam.theRecTopol->isItEdgePixelInY(maxInY) ;
264 
265  // FOR NOW UNUSED. KEEP IT IN CASE WE WANT TO USE IT IN THE FUTURE
266  // Bad Pixels have their charge set to 0 in the clusterizer
267  //hasBadPixels_ = false;
268  //for(unsigned int i=0; i<theClusterParam.theCluster->pixelADC().size(); ++i) {
269  //if(theClusterParam.theCluster->pixelADC()[i] == 0) { hasBadPixels_ = true; break;}
270  //}
271 
272  theClusterParam.spansTwoROCs_ = theDetParam.theRecTopol->containsBigPixelInX(minInX,maxInX) |
273  theDetParam.theRecTopol->containsBigPixelInY(minInY,maxInY);
274 
275 }
276 
277 
278 //-----------------------------------------------------------------------------
279 // Compute alpha_ and beta_ from the LocalTrajectoryParameters.
280 // Note: should become const after both localParameters() become const.
281 //-----------------------------------------------------------------------------
282 void PixelCPEBase::
283 computeAnglesFromTrajectory( DetParam const & theDetParam, ClusterParam & theClusterParam,
284  const LocalTrajectoryParameters & ltp) const
285 {
286  //cout<<" in PixelCPEBase:computeAnglesFromTrajectory - "<<endl; //dk
287 
288  //theClusterParam.loc_traj_param = ltp;
289 
290  LocalVector localDir = ltp.momentum();
291 
292 
293  float locx = localDir.x();
294  float locy = localDir.y();
295  float locz = localDir.z();
296 
297  /*
298  // Danek's definition
299  alpha_ = acos(locx/sqrt(locx*locx+locz*locz));
300  if ( isFlipped() ) // &&& check for FPIX !!!
301  alpha_ = PI - alpha_ ;
302  beta_ = acos(locy/sqrt(locy*locy+locz*locz));
303  */
304 
305 
306  theClusterParam.cotalpha = locx/locz;
307  theClusterParam.cotbeta = locy/locz;
308  //theClusterParam.zneg = (locz < 0); // Not used, AH
309 
310 
311  LocalPoint trk_lp = ltp.position();
312  theClusterParam.trk_lp_x = trk_lp.x();
313  theClusterParam.trk_lp_y = trk_lp.y();
314 
315  theClusterParam.with_track_angle = true;
316 
317 
318  // ggiurgiu@jhu.edu 12/09/2010 : needed to correct for bows/kinks
319  AlgebraicVector5 vec_trk_parameters = ltp.mixedFormatVector();
320  theClusterParam.loc_trk_pred = Topology::LocalTrackPred( vec_trk_parameters );
321 
322 }
323 
324 //-----------------------------------------------------------------------------
325 // Estimate theAlpha for barrel, based on the det position.
326 // &&& Needs to be consolidated from the above.
327 //-----------------------------------------------------------------------------
328 //float
329 //PixelCPEBase::estimatedAlphaForBarrel(float centerx) const
330 //{
331 // float tanalpha = theSign * (centerx-theOffsetX) * thePitchX / theDetR;
332 // return PI/2.0 - atan(tanalpha);
333 //}
334 
335 
336 
337 
338 //-----------------------------------------------------------------------------
339 // Compute alpha_ and beta_ from the position of this DetUnit.
340 // &&& DOES NOT WORK FOR NOW. d.k. 6/06
341 // The angles from dets are calculated internaly in the PixelCPEInitial class
342 //-----------------------------------------------------------------------------
343 // G. Giurgiu, 12/01/06 : implement the function
344 void PixelCPEBase::
345 computeAnglesFromDetPosition(DetParam const & theDetParam, ClusterParam & theClusterParam ) const
346 {
347 
348 
349  /*
350  // get cluster center of gravity (of charge)
351  float xcenter = cl.x();
352  float ycenter = cl.y();
353 
354  // get the cluster position in local coordinates (cm)
355 
356  // ggiurgiu@jhu.edu 12/09/2010 : This function is called without track info, therefore there are no track
357  // angles to provide here. Call the default localPosition (without track info)
358  LocalPoint lp = theTopol->localPosition( MeasurementPoint(xcenter, ycenter) );
359 
360 
361  // get the cluster position in global coordinates (cm)
362  GlobalPoint gp = theDet->surface().toGlobal( lp );
363  float gp_mod = sqrt( gp.x()*gp.x() + gp.y()*gp.y() + gp.z()*gp.z() );
364 
365  // normalize
366  float gpx = gp.x()/gp_mod;
367  float gpy = gp.y()/gp_mod;
368  float gpz = gp.z()/gp_mod;
369 
370  // make a global vector out of the global point; this vector will point from the
371  // origin of the detector to the cluster
372  GlobalVector gv(gpx, gpy, gpz);
373 
374  // make local unit vector along local X axis
375  const Local3DVector lvx(1.0, 0.0, 0.0);
376 
377  // get the unit X vector in global coordinates/
378  GlobalVector gvx = theDet->surface().toGlobal( lvx );
379 
380  // make local unit vector along local Y axis
381  const Local3DVector lvy(0.0, 1.0, 0.0);
382 
383  // get the unit Y vector in global coordinates
384  GlobalVector gvy = theDet->surface().toGlobal( lvy );
385 
386  // make local unit vector along local Z axis
387  const Local3DVector lvz(0.0, 0.0, 1.0);
388 
389  // get the unit Z vector in global coordinates
390  GlobalVector gvz = theDet->surface().toGlobal( lvz );
391 
392  // calculate the components of gv (the unit vector pointing to the cluster)
393  // in the local coordinate system given by the basis {gvx, gvy, gvz}
394  // note that both gv and the basis {gvx, gvy, gvz} are given in global coordinates
395  float gv_dot_gvx = gv.x()*gvx.x() + gv.y()*gvx.y() + gv.z()*gvx.z();
396  float gv_dot_gvy = gv.x()*gvy.x() + gv.y()*gvy.y() + gv.z()*gvy.z();
397  float gv_dot_gvz = gv.x()*gvz.x() + gv.y()*gvz.y() + gv.z()*gvz.z();
398  */
399 
400  // all the above is equivalent to
401  LocalPoint lp = theDetParam.theTopol->localPosition( MeasurementPoint(theClusterParam.theCluster->x(), theClusterParam.theCluster->y()) );
402  auto gvx = lp.x()-theDetParam.theOrigin.x();
403  auto gvy = lp.y()-theDetParam.theOrigin.y();
404  auto gvz = -1.f/theDetParam.theOrigin.z();
405  // normalization not required as only ratio used...
406 
407 
408  //theClusterParam.zneg = (gvz < 0); // Not used, AH
409 
410  // calculate angles
411  theClusterParam.cotalpha = gvx*gvz;
412  theClusterParam.cotbeta = gvy*gvz;
413 
414  theClusterParam.with_track_angle = false;
415 
416 
417  /*
418  // used only in dberror param...
419  auto alpha = HALF_PI - std::atan(cotalpha_);
420  auto beta = HALF_PI - std::atan(cotbeta_);
421  if (zneg) { beta -=PI; alpha -=PI;}
422 
423  auto alpha_ = atan2( gv_dot_gvz, gv_dot_gvx );
424  auto beta_ = atan2( gv_dot_gvz, gv_dot_gvy );
425 
426  assert(std::abs(std::round(alpha*10000.f)-std::round(alpha_*10000.f))<2);
427  assert(std::abs(std::round(beta*10000.f)-std::round(beta_*10000.f))<2);
428  */
429 
430 }
431 
432 
433 
434 //-----------------------------------------------------------------------------
435 // The isFlipped() is a silly way to determine which detectors are inverted.
436 // In the barrel for every 2nd ladder the E field direction is in the
437 // global r direction (points outside from the z axis), every other
438 // ladder has the E field inside. Something similar is in the
439 // forward disks (2 sides of the blade). This has to be recognised
440 // because the charge sharing effect is different.
441 //
442 // The isFliped does it by looking and the relation of the local (z always
443 // in the E direction) to global coordinates. There is probably a much
444 // better way.
445 //-----------------------------------------------------------------------------
446 bool PixelCPEBase::isFlipped(DetParam const & theDetParam) const
447 {
448  // Check the relative position of the local +/- z in global coordinates.
449  float tmp1 = theDetParam.theDet->surface().toGlobal(Local3DPoint(0.,0.,0.)).perp2();
450  float tmp2 = theDetParam.theDet->surface().toGlobal(Local3DPoint(0.,0.,1.)).perp2();
451  //cout << " 1: " << tmp1 << " 2: " << tmp2 << endl;
452  if ( tmp2<tmp1 ) return true;
453  else return false;
454 }
455 //------------------------------------------------------------------------
457  auto i = det.index();
458  //cout << "get parameters of detector " << i << endl;
459  assert(i<int(m_DetParams.size()));
460  //if (i>=int(m_DetParams.size())) m_DetParams.resize(i+1); // should never happen!
461  const DetParam & p = m_DetParams[i];
462  return p;
463 }
464 
465 //-----------------------------------------------------------------------------
466 // Drift direction.
467 // Works OK for barrel and forward.
468 // The formulas used for dir_x,y,z have to be exactly the same as the ones
469 // used in the digitizer (SiPixelDigitizerAlgorithm.cc).
470 //
471 //-----------------------------------------------------------------------------
473 PixelCPEBase::driftDirection(DetParam & theDetParam, GlobalVector bfield ) const {
474 
475  Frame detFrame(theDetParam.theDet->surface().position(), theDetParam.theDet->surface().rotation());
476  LocalVector Bfield = detFrame.toLocal(bfield);
477  return driftDirection(theDetParam,Bfield);
478 
479 }
480 
482 PixelCPEBase::driftDirection(DetParam & theDetParam, LocalVector Bfield ) const {
483  const bool LocalPrint = false;
484 
485  // Use LA from DB or from config
486  float langle = 0.;
487  if( !useLAOffsetFromConfig_ ) { // get it from DB
488  if(lorentzAngle_ != NULL) { // a real LA object
489  langle = lorentzAngle_->getLorentzAngle(theDetParam.theDet->geographicalId().rawId());
490  //cout<<" la "<<langle<<" "<< theDetParam.theDet->geographicalId().rawId() <<endl;
491  } else { // no LA, unused
492  //cout<<" LA object is NULL, assume LA = 0"<<endl; //dk
493  langle = 0; // set to a fake value
494  }
495  if(LocalPrint) cout<<" Will use LA Offset from DB "<<langle<<endl;
496  } else { // from config file
497  langle = lAOffset_;
498  if(LocalPrint) cout<<" Will use LA Offset from config "<<langle<<endl;
499  }
500 
501  // Now do the LA width stuff
502  theDetParam.widthLAFractionX = 1.; // predefine to 1 (default) if things fail
503  theDetParam.widthLAFractionY = 1.;
504 
505  // Compute the charge width, generic only
506  if(theFlag_==0) {
507 
509  // take it from a seperate, special LA DB object (forWidth)
510 
511  auto langleWidth = lorentzAngleWidth_->getLorentzAngle(theDetParam.theDet->geographicalId().rawId());
512  if(langleWidth!=0.0) theDetParam.widthLAFractionX = std::abs(langleWidth/langle);
513  // leave the widthLAFractionY=1.
514  //cout<<" LAWidth lorentz width "<<theDetParam.widthLAFractionX<<" "<<theDetParam.widthLAFractionY<<endl;
515 
516  } else if(useLAWidthFromConfig_) { // get from config
517 
518  double lAWidth=0;
519  if( GeomDetEnumerators::isTrackerPixel(theDetParam.thePart) && GeomDetEnumerators::isBarrel(theDetParam.thePart) ) lAWidth = lAWidthBPix_; // barrel
520  else lAWidth = lAWidthFPix_;
521 
522  if(langle!=0.0) theDetParam.widthLAFractionX = std::abs(lAWidth/langle);
523  // fix the FractionY at 1
524 
525  //cout<<" Lorentz width from config "<<theDetParam.widthLAFractionX<<" "<<theDetParam.widthLAFractionY<<endl;
526 
527  } else { // get if from the offset LA (old method used until 2013)
528  // do nothing
529  //cout<<" Old default LA width method "<<theDetParam.widthLAFractionX<<" "<<theDetParam.widthLAFractionY<<endl;
530 
531  }
532 
533  //cout<<" Final LA fraction "<<theDetParam.widthLAFractionX<<" "<<theDetParam.widthLAFractionY<<endl;
534 
535  } // if flag
536 
537 
538  if(LocalPrint) cout<<" in PixelCPEBase:driftDirection - "<<langle<<" "<<Bfield<<endl; //dk
539 
540  float alpha2 = alpha2Order ? langle*langle : 0; //
541 
542  // **********************************************************************
543  // Our convention is the following:
544  // +x is defined by the direction of the Lorentz drift!
545  // +z is defined by the direction of E field (so electrons always go into -z!)
546  // +y is defined by +x and +z, and it turns out to be always opposite to the +B field.
547  // **********************************************************************
548 
549  float dir_x = -( langle * Bfield.y() + alpha2* Bfield.z()* Bfield.x() );
550  float dir_y = ( langle * Bfield.x() - alpha2* Bfield.z()* Bfield.y() );
551  float dir_z = -( 1.f + alpha2* Bfield.z()*Bfield.z() );
552  auto scale = 1.f/std::abs( dir_z ); // same as 1 + alpha2*Bfield.z()*Bfield.z()
553  LocalVector dd(dir_x*scale, dir_y*scale, -1.f ); // last is -1 !
554 
555  LogDebug("PixelCPEBase") << " The drift direction in local coordinate is " << dd ;
556 
557  return dd;
558 }
559 
560 //-----------------------------------------------------------------------------
561 // One-shot computation of the driftDirection and both lorentz shifts
562 //-----------------------------------------------------------------------------
563 void
565 
566  //cout<<" in PixelCPEBase:computeLorentzShifts - "<<driftDirection_<<endl; //dk
567 
568  // Max shift (at the other side of the sensor) in cm
569  theDetParam.lorentzShiftInCmX = theDetParam.driftDirection.x()/theDetParam.driftDirection.z() * theDetParam.theThickness; //
570  theDetParam.lorentzShiftInCmY = theDetParam.driftDirection.y()/theDetParam.driftDirection.z() * theDetParam.theThickness; //
571 
572  //cout<<" in PixelCPEBase:computeLorentzShifts - "
573  //<<lorentzShiftInCmX_<<" "
574  //<<lorentzShiftInCmY_<<" "
575  //<<endl; //dk
576 
577  LogDebug("PixelCPEBase") << " The drift direction in local coordinate is "
578  << theDetParam.driftDirection ;
579 }
580 
581 //-----------------------------------------------------------------------------
586 //-----------------------------------------------------------------------------
589 {
591  float probabilityXY;
592  if ( theClusterParam.probabilityX_ !=0 && theClusterParam.probabilityY_ !=0 )
593  probabilityXY = theClusterParam.probabilityX_ * theClusterParam.probabilityY_ * (1.f - std::log(theClusterParam.probabilityX_ * theClusterParam.probabilityY_) ) ;
594  else
595  probabilityXY = 0;
597  qualWord );
598 
600  qualWord );
601 
602  SiPixelRecHitQuality::thePacking.setQBin ( (int)theClusterParam.qBin_,
603  qualWord );
604 
606  qualWord );
607 
609  qualWord );
610 
612  qualWord );
613 
615  qualWord );
616 
617  return qualWord;
618 }
#define LogDebug(id)
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:106
T getParameter(std::string const &) const
bool containsBigPixelInY(int iymin, int iymax) const
void setProbabilityXY(float prob, QualWordType &qualWord) const
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
static const Packing thePacking
int minPixelCol() const
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:186
Local3DPoint theOrigin
Definition: PixelCPEBase.h:66
bool isItEdgePixelInY(int iybin) const
virtual LocalPoint localPosition(const MeasurementPoint &) const =0
const SiPixelLorentzAngle * lorentzAngleWidth_
Definition: PixelCPEBase.h:246
LocalVector driftDirection(DetParam &theDetParam, GlobalVector bfield) const
short getTemplateID(const uint32_t &detid) 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())
const SiPixelCluster * theCluster
Definition: PixelCPEBase.h:90
bool isBarrel(GeomDetEnumerators::SubDetector m)
assert(m_qm.get())
bool isItEdgePixelInX(int ixbin) const
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:63
bool isFlipped(DetParam const &theDetParam) const
#define NULL
Definition: scimark2.h:8
DetParams m_DetParams
Definition: PixelCPEBase.h:282
T perp2() const
Definition: PV3DBase.h:71
void fillDetParams()
short getGenErrorID(const uint32_t &detid) const
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:40
const PixelGeomDetUnit * theDet
Definition: PixelCPEBase.h:60
GeomDetType::SubDetector thePart
Definition: PixelCPEBase.h:65
const RectangularPixelTopology * theRecTopol
Definition: PixelCPEBase.h:63
bool useLAWidthFromDB_
Definition: PixelCPEBase.h:235
float lAWidthBPix_
Definition: PixelCPEBase.h:230
int maxPixelRow() const
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
bool useLAWidthFromConfig_
Definition: PixelCPEBase.h:234
virtual const DetUnitContainer & detUnits() const
Returm a vector of all GeomDetUnit.
Measurement2DPoint MeasurementPoint
Measurement points are two-dimensional by default.
const PixelTopology * theTopol
Definition: PixelCPEBase.h:62
int minPixelRow() const
bool LoadTemplatesFromDB_
Definition: PixelCPEBase.h:255
void computeAnglesFromTrajectory(DetParam const &theDetParam, ClusterParam &theClusterParam, const LocalTrajectoryParameters &ltp) const
unsigned int offsetDU(SubDetector sid) const
T z() const
Definition: PV3DBase.h:64
void computeLorentzShifts(DetParam &) const
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const SiPixelTemplateDBObject * templateDBobject_
Definition: PixelCPEBase.h:251
void setHasBadPixels(bool flag, QualWordType &qualWord) const
DetId geographicalId() const
The label of this GeomDet.
Definition: GeomDet.h:77
double f[11][100]
const MagneticField * magfield_
Definition: PixelCPEBase.h:241
LocalVector momentum() const
Momentum vector in the local frame.
int index() const
Definition: GeomDet.h:97
void computeAnglesFromDetPosition(DetParam const &theDetParam, ClusterParam &theClusterParam) const
void setProbabilityQ(float prob, QualWordType &qualWord) const
bool containsBigPixelInX(int ixmin, int ixmax) const
SiPixelRecHitQuality::QualWordType rawQualityWord(ClusterParam &theClusterParam) const
SubDetector tkDetEnum[8]
void setSpansTwoROCs(bool flag, QualWordType &qualWord) const
Point3DBase< float, LocalTag > Local3DPoint
Definition: LocalPoint.h:9
Topology::LocalTrackPred loc_trk_pred
Definition: PixelCPEBase.h:103
void setIsOnEdge(bool flag, QualWordType &qualWord) const
ROOT::Math::SVector< double, 5 > AlgebraicVector5
const SiPixelLorentzAngle * lorentzAngle_
Definition: PixelCPEBase.h:245
const SiPixelGenErrorDBObject * genErrorDBObject_
Definition: PixelCPEBase.h:248
void setTheClu(DetParam const &, ClusterParam &theClusterParam) const
int maxPixelCol() const
bool isTrackerPixel(const GeomDetEnumerators::SubDetector m)
AlgebraicVector5 mixedFormatVector() const
bool useLAOffsetFromConfig_
Definition: PixelCPEBase.h:233
const TrackerGeometry & geom_
Definition: PixelCPEBase.h:242
PixelCPEBase(edm::ParameterSet const &conf, const MagneticField *mag, const TrackerGeometry &geom, const TrackerTopology &ttopo, const SiPixelLorentzAngle *lorentzAngle, const SiPixelGenErrorDBObject *genErrorDBObject, const SiPixelTemplateDBObject *templateDBobject, const SiPixelLorentzAngle *lorentzAngleWidth, int flag=0)
Definition: PixelCPEBase.cc:41
float getLorentzAngle(const uint32_t &) const
float y() const
LocalVector driftDirection
Definition: PixelCPEBase.h:77
const RotationType & rotation() const
tuple cout
Definition: gather_cfg.py:145
volatile std::atomic< bool > shutdown_flag false
void setHasFilledProb(bool flag, QualWordType &qualWord) const
T x() const
Definition: PV3DBase.h:62
const PositionType & position() const
void setQBin(int qbin, QualWordType &qualWord) const
float x() const
float lAWidthFPix_
Definition: PixelCPEBase.h:231
DetParam const & detParam(const GeomDetUnit &det) const