CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | Private Member Functions
PixelCPEBase Class Referenceabstract

#include <PixelCPEBase.h>

Inheritance diagram for PixelCPEBase:
PixelClusterParameterEstimator PixelCPEClusterRepair PixelCPEGeneric PixelCPETemplateReco

Classes

struct  ClusterParam
 
struct  DetParam
 

Public Member Functions

ReturnType getParameters (const SiPixelCluster &cl, const GeomDetUnit &det) const override
 
ReturnType getParameters (const SiPixelCluster &cl, const GeomDetUnit &det, const LocalTrajectoryParameters &ltp) const override
 
 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)
 
- Public Member Functions inherited from PixelClusterParameterEstimator
unsigned int clusterProbComputationFlag () const
 
virtual ReturnType getParameters (const SiPixelCluster &cl, const GeomDetUnit &det, const TrajectoryStateOnSurface &tsos) const
 
virtual VLocalValues localParametersV (const SiPixelCluster &cluster, const GeomDetUnit &gd) const
 
virtual VLocalValues localParametersV (const SiPixelCluster &cluster, const GeomDetUnit &gd, TrajectoryStateOnSurface &tsos) const
 
 PixelClusterParameterEstimator ()
 
virtual ~PixelClusterParameterEstimator ()
 

Static Public Member Functions

static void fillPSetDescription (edm::ParameterSetDescription &desc)
 

Protected Types

using DetParams = std::vector< DetParam >
 
typedef GloballyPositioned< double > Frame
 

Protected Member Functions

void computeAnglesFromDetPosition (DetParam const &theDetParam, ClusterParam &theClusterParam) const
 
void computeAnglesFromTrajectory (DetParam const &theDetParam, ClusterParam &theClusterParam, const LocalTrajectoryParameters &ltp) const
 
void computeLorentzShifts (DetParam &) const
 
DetParam const & detParam (const GeomDetUnit &det) const
 
LocalVector driftDirection (DetParam &theDetParam, GlobalVector bfield) const
 
LocalVector driftDirection (DetParam &theDetParam, LocalVector bfield) const
 
void setTheClu (DetParam const &, ClusterParam &theClusterParam) const
 

Protected Attributes

bool alpha2Order
 
bool DoLorentz_
 
const SiPixelGenErrorDBObjectgenErrorDBObject_
 
const TrackerGeometrygeom_
 
float lAOffset_
 
float lAWidthBPix_
 
float lAWidthFPix_
 
bool LoadTemplatesFromDB_
 
const SiPixelLorentzAnglelorentzAngle_
 
const SiPixelLorentzAnglelorentzAngleWidth_
 
DetParams m_DetParams = DetParams(1440)
 
const MagneticFieldmagfield_
 
const SiPixelTemplateDBObjecttemplateDBobject_
 
int theFlag_
 
int theVerboseLevel
 
const TrackerTopologyttopo_
 
bool useLAOffsetFromConfig_
 
bool useLAWidthFromConfig_
 
bool useLAWidthFromDB_
 
- Protected Attributes inherited from PixelClusterParameterEstimator
unsigned int clusterProbComputationFlag_
 

Private Member Functions

virtual ClusterParamcreateClusterParam (const SiPixelCluster &cl) const =0
 
void fillDetParams ()
 
virtual LocalError localError (DetParam const &theDetParam, ClusterParam &theClusterParam) const =0
 
virtual LocalPoint localPosition (DetParam const &theDetParam, ClusterParam &theClusterParam) const =0
 
SiPixelRecHitQuality::QualWordType rawQualityWord (ClusterParam &theClusterParam) const
 

Additional Inherited Members

- Public Types inherited from PixelClusterParameterEstimator
typedef std::pair< LocalPoint, LocalErrorLocalValues
 
using ReturnType = std::tuple< LocalPoint, LocalError, SiPixelRecHitQuality::QualWordType >
 
typedef std::vector< LocalValuesVLocalValues
 

Detailed Description

Definition at line 54 of file PixelCPEBase.h.

Member Typedef Documentation

using PixelCPEBase::DetParams = std::vector<DetParam>
protected

Definition at line 278 of file PixelCPEBase.h.

typedef GloballyPositioned<double> PixelCPEBase::Frame
protected

Definition at line 215 of file PixelCPEBase.h.

Constructor & Destructor Documentation

PixelCPEBase::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 at line 30 of file PixelCPEBase.cc.

References alpha2Order, PixelClusterParameterEstimator::clusterProbComputationFlag_, DoLorentz_, fillDetParams(), genErrorDBObject_, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), createfilelist::int, lAOffset_, lAWidthBPix_, lAWidthFPix_, LoadTemplatesFromDB_, LogDebug, lorentzAngle_, lorentzAngleWidth_, templateDBobject_, theFlag_, theVerboseLevel, useLAOffsetFromConfig_, useLAWidthFromConfig_, and useLAWidthFromDB_.

40  : useLAOffsetFromConfig_(false),
41  useLAWidthFromConfig_(false),
42  useLAWidthFromDB_(false),
43  theFlag_(flag),
44  magfield_(mag),
45  geom_(geom),
46  ttopo_(ttopo) {
47 #ifdef EDM_ML_DEBUG
48  nRecHitsTotal_ = 0;
49  nRecHitsUsedEdge_ = 0,
50 #endif
51 
52  //--- Lorentz angle tangent per Tesla
53  lorentzAngle_ = lorentzAngle;
54  lorentzAngleWidth_ = lorentzAngleWidth;
55 
56  //-- GenError Calibration Object (different from SiPixelCPEGenericErrorParm) from DB
57  genErrorDBObject_ = genErrorDBObject;
58 
59  //-- Template Calibration Object from DB
60  if (theFlag_ != 0)
61  templateDBobject_ = templateDBobject; // flag to check if it is generic or templates
62 
63  // Configurables
64  // For both templates & generic
65 
66  // Read templates and/or generic errors from DB
67  LoadTemplatesFromDB_ = conf.getParameter<bool>("LoadTemplatesFromDB");
68 
69  //--- Algorithm's verbosity
70  theVerboseLevel = conf.getUntrackedParameter<int>("VerboseLevel", 0);
71 
72  //-- Switch on/off E.B
73  alpha2Order = conf.getParameter<bool>("Alpha2Order");
74 
75  //--- A flag that could be used to change the behavior of
76  //--- clusterProbability() in TSiPixelRecHit (the *transient* one).
77  //--- The problem is that the transient hits are made after the CPE runs
78  //--- and they don't get the access to the PSet, so we pass it via the
79  //--- CPE itself...
80  //
81  clusterProbComputationFlag_ = (unsigned int)conf.getParameter<int>("ClusterProbComputationFlag");
82 
83  // This LA related parameters are only relevant for the Generic algo
84  // They still have to be used in Base since the LA computation is in Base
85 
86  // Use LA-width from DB.
87  // If both (this and from config) are false LA-width is calcuated from LA-offset
88  useLAWidthFromDB_ = conf.getParameter<bool>("useLAWidthFromDB");
89 
90  // Use Alignment LA-offset in generic
91  // (Experimental; leave commented out)
92  //useLAAlignmentOffsets_ = conf.existsAs<bool>("useLAAlignmentOffsets")?
93  //conf.getParameter<bool>("useLAAlignmentOffsets"):false;
94 
95  // Used only for testing
96  lAOffset_ = conf.getParameter<double>("lAOffset");
97  lAWidthBPix_ = conf.getParameter<double>("lAWidthBPix");
98  lAWidthFPix_ = conf.getParameter<double>("lAWidthFPix");
99 
100  // Use LA-offset from config, for testing only
101  if (lAOffset_ > 0.0)
102  useLAOffsetFromConfig_ = true;
103  // Use LA-width from config, split into fpix & bpix, for testing only
104  if (lAWidthBPix_ > 0.0 || lAWidthFPix_ > 0.0)
105  useLAWidthFromConfig_ = true;
106 
107  // For Templates only
108  // Compute the Lorentz shifts for this detector element for templates (from Alignment)
109  DoLorentz_ = conf.getParameter<bool>("DoLorentz");
110 
111  LogDebug("PixelCPEBase") << " LA constants - " << lAOffset_ << " " << lAWidthBPix_ << " " << lAWidthFPix_
112  << endl; //dk
113 
114  fillDetParams();
115 }
#define LogDebug(id)
const SiPixelLorentzAngle * lorentzAngleWidth_
Definition: PixelCPEBase.h:245
void fillDetParams()
bool useLAWidthFromDB_
Definition: PixelCPEBase.h:234
float lAWidthBPix_
Definition: PixelCPEBase.h:229
bool useLAWidthFromConfig_
Definition: PixelCPEBase.h:233
bool LoadTemplatesFromDB_
Definition: PixelCPEBase.h:254
const SiPixelTemplateDBObject * templateDBobject_
Definition: PixelCPEBase.h:250
const MagneticField * magfield_
Definition: PixelCPEBase.h:240
const TrackerTopology & ttopo_
Definition: PixelCPEBase.h:242
const SiPixelLorentzAngle * lorentzAngle_
Definition: PixelCPEBase.h:244
const SiPixelGenErrorDBObject * genErrorDBObject_
Definition: PixelCPEBase.h:247
bool useLAOffsetFromConfig_
Definition: PixelCPEBase.h:232
const TrackerGeometry & geom_
Definition: PixelCPEBase.h:241
float lAWidthFPix_
Definition: PixelCPEBase.h:230

Member Function Documentation

void PixelCPEBase::computeAnglesFromDetPosition ( DetParam const &  theDetParam,
ClusterParam theClusterParam 
) const
protected

Definition at line 289 of file PixelCPEBase.cc.

References PixelCPEBase::ClusterParam::cotalpha, PixelCPEBase::ClusterParam::cotbeta, Topology::localPosition(), PixelCPEBase::ClusterParam::theCluster, PixelCPEBase::DetParam::theOrigin, PixelCPEBase::DetParam::theTopol, PixelCPEBase::ClusterParam::with_track_angle, PV3DBase< T, PVType, FrameType >::x(), SiPixelCluster::x(), PV3DBase< T, PVType, FrameType >::y(), SiPixelCluster::y(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by getParameters().

289  {
290  LocalPoint lp = theDetParam.theTopol->localPosition(
291  MeasurementPoint(theClusterParam.theCluster->x(), theClusterParam.theCluster->y()));
292  auto gvx = lp.x() - theDetParam.theOrigin.x();
293  auto gvy = lp.y() - theDetParam.theOrigin.y();
294  auto gvz = -1.f / theDetParam.theOrigin.z();
295  //--- Note that the normalization is not required as only the ratio used
296 
297  //theClusterParam.zneg = (gvz < 0); // Not used, AH
298 
299  // calculate angles
300  theClusterParam.cotalpha = gvx * gvz;
301  theClusterParam.cotbeta = gvy * gvz;
302 
303  theClusterParam.with_track_angle = false;
304 
305  /*
306  // used only in dberror param...
307  auto alpha = HALF_PI - std::atan(cotalpha_);
308  auto beta = HALF_PI - std::atan(cotbeta_);
309  if (zneg) { beta -=PI; alpha -=PI;}
310 
311  auto alpha_ = atan2( gv_dot_gvz, gv_dot_gvx );
312  auto beta_ = atan2( gv_dot_gvz, gv_dot_gvy );
313 
314  assert(std::abs(std::round(alpha*10000.f)-std::round(alpha_*10000.f))<2);
315  assert(std::abs(std::round(beta*10000.f)-std::round(beta_*10000.f))<2);
316  */
317 }
T y() const
Definition: PV3DBase.h:60
Measurement2DPoint MeasurementPoint
Measurement points are two-dimensional by default.
T x() const
Definition: PV3DBase.h:59
void PixelCPEBase::computeAnglesFromTrajectory ( DetParam const &  theDetParam,
ClusterParam theClusterParam,
const LocalTrajectoryParameters ltp 
) const
protected

Definition at line 255 of file PixelCPEBase.cc.

References PixelCPEBase::ClusterParam::cotalpha, PixelCPEBase::ClusterParam::cotbeta, LocalTrajectoryParameters::dxdz(), LocalTrajectoryParameters::dydz(), PixelCPEBase::ClusterParam::loc_trk_pred, LocalTrajectoryParameters::position(), PixelCPEBase::ClusterParam::trk_lp_x, PixelCPEBase::ClusterParam::trk_lp_y, PixelCPEBase::ClusterParam::with_track_angle, PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::y().

Referenced by getParameters().

257  {
258  theClusterParam.cotalpha = ltp.dxdz();
259  theClusterParam.cotbeta = ltp.dydz();
260 
261  LocalPoint trk_lp = ltp.position();
262  theClusterParam.trk_lp_x = trk_lp.x();
263  theClusterParam.trk_lp_y = trk_lp.y();
264 
265  theClusterParam.with_track_angle = true;
266 
267  // GG: needed to correct for bows/kinks
268  theClusterParam.loc_trk_pred = Topology::LocalTrackPred(
269  theClusterParam.trk_lp_x, theClusterParam.trk_lp_y, theClusterParam.cotalpha, theClusterParam.cotbeta);
270 }
LocalPoint position() const
Local x and y position coordinates.
T y() const
Definition: PV3DBase.h:60
T x() const
Definition: PV3DBase.h:59
void PixelCPEBase::computeLorentzShifts ( DetParam theDetParam) const
protected

Definition at line 421 of file PixelCPEBase.cc.

References PixelCPEBase::DetParam::driftDirection, LogDebug, PixelCPEBase::DetParam::lorentzShiftInCmX, PixelCPEBase::DetParam::lorentzShiftInCmY, PixelCPEBase::DetParam::theThickness, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by fillDetParams().

421  {
422  // Max shift (at the other side of the sensor) in cm
423  theDetParam.lorentzShiftInCmX =
424  theDetParam.driftDirection.x() / theDetParam.driftDirection.z() * theDetParam.theThickness; //
425  theDetParam.lorentzShiftInCmY =
426  theDetParam.driftDirection.y() / theDetParam.driftDirection.z() * theDetParam.theThickness; //
427 
428  LogDebug("PixelCPEBase::computeLorentzShifts()")
429  << " lorentzShiftsInCmX,Y = " << theDetParam.lorentzShiftInCmX << " " << theDetParam.lorentzShiftInCmY << " "
430  << theDetParam.driftDirection;
431 }
#define LogDebug(id)
virtual ClusterParam* PixelCPEBase::createClusterParam ( const SiPixelCluster cl) const
privatepure virtual
PixelCPEBase::DetParam const & PixelCPEBase::detParam ( const GeomDetUnit det) const
protected

Definition at line 320 of file PixelCPEBase.cc.

References mps_fire::i, GeomDet::index(), m_DetParams, and AlCaHLTBitMon_ParallelJobs::p.

Referenced by getParameters().

320  {
321  auto i = det.index();
322  //cout << "get parameters of detector " << i << endl;
323  assert(i < int(m_DetParams.size()));
324  //if (i>=int(m_DetParams.size())) m_DetParams.resize(i+1); // should never happen!
325  const DetParam& p = m_DetParams[i];
326  return p;
327 }
DetParams m_DetParams
Definition: PixelCPEBase.h:280
int index() const
Definition: GeomDet.h:83
LocalVector PixelCPEBase::driftDirection ( DetParam theDetParam,
GlobalVector  bfield 
) const
protected

Definition at line 336 of file PixelCPEBase.cc.

References GloballyPositioned< T >::position(), GloballyPositioned< T >::rotation(), GeomDet::surface(), and PixelCPEBase::DetParam::theDet.

Referenced by fillDetParams().

336  {
337  Frame detFrame(theDetParam.theDet->surface().position(), theDetParam.theDet->surface().rotation());
338  LocalVector Bfield = detFrame.toLocal(bfield);
339  return driftDirection(theDetParam, Bfield);
340 }
LocalVector driftDirection(DetParam &theDetParam, GlobalVector bfield) const
GloballyPositioned< double > Frame
Definition: PixelCPEBase.h:215
LocalVector PixelCPEBase::driftDirection ( DetParam theDetParam,
LocalVector  bfield 
) const
protected

Definition at line 342 of file PixelCPEBase.cc.

References funct::abs(), alpha2Order, createTree::dd, f, GeomDet::geographicalId(), SiPixelLorentzAngle::getLorentzAngle(), GeomDetEnumerators::isBarrel(), GeomDetEnumerators::isTrackerPixel(), lAOffset_, lAWidthBPix_, lAWidthFPix_, LogDebug, lorentzAngle_, lorentzAngleWidth_, DetId::rawId(), Scenarios_cff::scale, PixelCPEBase::DetParam::theDet, theFlag_, PixelCPEBase::DetParam::thePart, useLAOffsetFromConfig_, useLAWidthFromConfig_, useLAWidthFromDB_, PixelCPEBase::DetParam::widthLAFractionX, PixelCPEBase::DetParam::widthLAFractionY, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

342  {
343  // Use LA from DB or from config
344  float langle = 0.;
345  if (!useLAOffsetFromConfig_) { // get it from DB
346  if (lorentzAngle_ != nullptr) { // a real LA object
347  langle = lorentzAngle_->getLorentzAngle(theDetParam.theDet->geographicalId().rawId());
348  LogDebug("PixelCPEBase::driftDirection()")
349  << " la " << langle << " " << theDetParam.theDet->geographicalId().rawId() << endl;
350  } else { // no LA, unused
351  langle = 0; // set to a fake value
352  LogDebug("PixelCPEBase::driftDirection()") << " LA object is NULL, assume LA = 0" << endl; //dk
353  }
354  LogDebug("PixelCPEBase::driftDirection()") << " Will use LA Offset from DB " << langle << endl;
355  } else { // from config file
356  langle = lAOffset_;
357  LogDebug("PixelCPEBase::driftDirection()") << " Will use LA Offset from config " << langle << endl;
358  }
359 
360  // Now do the LA width stuff
361  theDetParam.widthLAFractionX = 1.; // predefine to 1 (default) if things fail
362  theDetParam.widthLAFractionY = 1.;
363 
364  // Compute the charge width, generic only
365  if (theFlag_ == 0) {
366  if (useLAWidthFromDB_ && (lorentzAngleWidth_ != nullptr)) {
367  // take it from a separate, special LA DB object (forWidth)
368 
369  auto langleWidth = lorentzAngleWidth_->getLorentzAngle(theDetParam.theDet->geographicalId().rawId());
370  if (langleWidth != 0.0)
371  theDetParam.widthLAFractionX = std::abs(langleWidth / langle);
372  // leave the widthLAFractionY=1.
373  //cout<<" LAWidth lorentz width "<<theDetParam.widthLAFractionX<<" "<<theDetParam.widthLAFractionY<<endl;
374 
375  } else if (useLAWidthFromConfig_) { // get from config
376 
377  double lAWidth = 0;
378  if (GeomDetEnumerators::isTrackerPixel(theDetParam.thePart) && GeomDetEnumerators::isBarrel(theDetParam.thePart))
379  lAWidth = lAWidthBPix_; // barrel
380  else
381  lAWidth = lAWidthFPix_;
382 
383  if (langle != 0.0)
384  theDetParam.widthLAFractionX = std::abs(lAWidth / langle);
385  // fix the FractionY at 1
386 
387  //cout<<" Lorentz width from config "<<theDetParam.widthLAFractionX<<" "<<theDetParam.widthLAFractionY<<endl;
388 
389  } else { // get if from the offset LA (old method used until 2013)
390  // do nothing
391  //cout<<" Old default LA width method "<<theDetParam.widthLAFractionX<<" "<<theDetParam.widthLAFractionY<<endl;
392  }
393 
394  //cout<<" Final LA fraction "<<theDetParam.widthLAFractionX<<" "<<theDetParam.widthLAFractionY<<endl;
395 
396  } // if flag
397 
398  float alpha2 = alpha2Order ? langle * langle : 0; //
399 
400  // **********************************************************************
401  // Our convention is the following:
402  // +x is defined by the direction of the Lorentz drift!
403  // +z is defined by the direction of E field (so electrons always go into -z!)
404  // +y is defined by +x and +z, and it turns out to be always opposite to the +B field.
405  // **********************************************************************
406 
407  float dir_x = -(langle * Bfield.y() + alpha2 * Bfield.z() * Bfield.x());
408  float dir_y = (langle * Bfield.x() - alpha2 * Bfield.z() * Bfield.y());
409  float dir_z = -(1.f + alpha2 * Bfield.z() * Bfield.z());
410  auto scale = 1.f / std::abs(dir_z); // same as 1 + alpha2*Bfield.z()*Bfield.z()
411  LocalVector dd(dir_x * scale, dir_y * scale, -1.f); // last is -1 !
412 
413  LogDebug("PixelCPEBase") << " The drift direction in local coordinate is " << dd;
414 
415  return dd;
416 }
#define LogDebug(id)
const SiPixelLorentzAngle * lorentzAngleWidth_
Definition: PixelCPEBase.h:245
bool isBarrel(GeomDetEnumerators::SubDetector m)
bool useLAWidthFromDB_
Definition: PixelCPEBase.h:234
float lAWidthBPix_
Definition: PixelCPEBase.h:229
bool useLAWidthFromConfig_
Definition: PixelCPEBase.h:233
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
const SiPixelLorentzAngle * lorentzAngle_
Definition: PixelCPEBase.h:244
bool useLAOffsetFromConfig_
Definition: PixelCPEBase.h:232
float getLorentzAngle(const uint32_t &) const
bool isTrackerPixel(GeomDetEnumerators::SubDetector m)
float lAWidthFPix_
Definition: PixelCPEBase.h:230
void PixelCPEBase::fillDetParams ( )
private

Definition at line 120 of file PixelCPEBase.cc.

References computeLorentzShifts(), TrackerGeometry::detUnits(), DoLorentz_, driftDirection(), genErrorDBObject_, geom_, SiPixelGenErrorDBObject::getGenErrorID(), SiPixelTemplateDBObject::getTemplateID(), mps_fire::i, createfilelist::int, MagneticField::inTesla(), LoadTemplatesFromDB_, LogDebug, m_DetParams, magfield_, TrackerGeometry::offsetDU(), AlCaHLTBitMon_ParallelJobs::p, templateDBobject_, theFlag_, GeomDetEnumerators::tkDetEnum, PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by getParameters(), and PixelCPEBase().

120  {
121  // MM: this code finds the last Pixel (Inner Tracker) DetUnit to loop upon when filling the det params, by looking the first detId which is from
122  // the Outer Tracker (Strips in case of the Phase-0/1 detector).
123 
124  auto const& dus = geom_.detUnits();
125  unsigned m_detectors = dus.size();
126  for (unsigned int i = 1; i < 7; ++i) {
127  LogDebug("PixelCPEBase:: LookingForFirstStrip")
128  << "Subdetector " << i << " GeomDetEnumerator " << GeomDetEnumerators::tkDetEnum[i] << " offset "
129  << geom_.offsetDU(GeomDetEnumerators::tkDetEnum[i]) << " is it strip? "
130  << (geom_.offsetDU(GeomDetEnumerators::tkDetEnum[i]) != dus.size()
131  ? dus[geom_.offsetDU(GeomDetEnumerators::tkDetEnum[i])]->type().isOuterTracker()
132  : false);
133 
134  if (geom_.offsetDU(GeomDetEnumerators::tkDetEnum[i]) != dus.size() &&
135  dus[geom_.offsetDU(GeomDetEnumerators::tkDetEnum[i])]->type().isOuterTracker()) {
136  if (geom_.offsetDU(GeomDetEnumerators::tkDetEnum[i]) < m_detectors) {
137  m_detectors = geom_.offsetDU(GeomDetEnumerators::tkDetEnum[i]);
138  }
139  }
140  }
141  LogDebug("LookingForFirstStrip") << " Chosen offset: " << m_detectors;
142 
143  m_DetParams.resize(m_detectors);
144  LogDebug("PixelCPEBase::fillDetParams():") << "caching " << m_detectors << " pixel detectors" << endl;
145  for (unsigned i = 0; i != m_detectors; ++i) {
146  auto& p = m_DetParams[i];
147  p.theDet = dynamic_cast<const PixelGeomDetUnit*>(dus[i]);
148  assert(p.theDet);
149  assert(p.theDet->index() == int(i));
150 
151  p.theOrigin = p.theDet->surface().toLocal(GlobalPoint(0, 0, 0));
152 
153  //--- p.theDet->type() returns a GeomDetType, which implements subDetector()
154  p.thePart = p.theDet->type().subDetector();
155 
156  //--- The location in of this DetUnit in a cyllindrical coord system (R,Z)
157  //--- The call goes via BoundSurface, returned by p.theDet->surface(), but
158  //--- position() is implemented in GloballyPositioned<> template
159  //--- ( BoundSurface : Surface : GloballyPositioned<float> )
160  //p.theDetR = p.theDet->surface().position().perp(); //Not used, AH
161  //p.theDetZ = p.theDet->surface().position().z(); //Not used, AH
162  //--- Define parameters for chargewidth calculation
163 
164  //--- bounds() is implemented in BoundSurface itself.
165  p.theThickness = p.theDet->surface().bounds().thickness();
166 
167  // Cache the det id for templates and generic erros
168 
169  if (theFlag_ == 0) { // for generic
170  if (LoadTemplatesFromDB_) // do only if genError requested
171  p.detTemplateId = genErrorDBObject_->getGenErrorID(p.theDet->geographicalId().rawId());
172  } else { // for templates
173  p.detTemplateId = templateDBobject_->getTemplateID(p.theDet->geographicalId());
174  }
175 
176  auto topol = &(p.theDet->specificTopology());
177  p.theTopol = topol;
178  auto const proxyT = dynamic_cast<const ProxyPixelTopology*>(p.theTopol);
179  if (proxyT)
180  p.theRecTopol = dynamic_cast<const RectangularPixelTopology*>(&(proxyT->specificTopology()));
181  else
182  p.theRecTopol = dynamic_cast<const RectangularPixelTopology*>(p.theTopol);
183  assert(p.theRecTopol);
184 
185  //--- The geometrical description of one module/plaquette
186  //p.theNumOfRow = p.theRecTopol->nrows(); // rows in x //Not used, AH. PM: leave commented out.
187  //p.theNumOfCol = p.theRecTopol->ncolumns(); // cols in y //Not used, AH. PM: leave commented out.
188  std::pair<float, float> pitchxy = p.theRecTopol->pitch();
189  p.thePitchX = pitchxy.first; // pitch along x
190  p.thePitchY = pitchxy.second; // pitch along y
191 
192  LocalVector Bfield = p.theDet->surface().toLocal(magfield_->inTesla(p.theDet->surface().position()));
193  p.bz = Bfield.z();
194  p.bx = Bfield.x();
195 
196  //--- Compute the Lorentz shifts for this detector element
197  if ((theFlag_ == 0) || DoLorentz_) { // do always for generic and if(DOLorentz) for templates
198  p.driftDirection = driftDirection(p, Bfield);
200  }
201 
202  LogDebug("PixelCPEBase::fillDetParams()") << "***** PIXEL LAYOUT *****"
203  << " thePart = " << p.thePart << " theThickness = " << p.theThickness
204  << " thePitchX = " << p.thePitchX << " thePitchY = " << p.thePitchY;
205  // << " theLShiftX = " << p.theLShiftX;
206  }
207 }
#define LogDebug(id)
const DetContainer & detUnits() const override
Returm a vector of all GeomDet.
LocalVector driftDirection(DetParam &theDetParam, GlobalVector bfield) const
short getTemplateID(const uint32_t &detid) const
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
DetParams m_DetParams
Definition: PixelCPEBase.h:280
short getGenErrorID(const uint32_t &detid) const
bool LoadTemplatesFromDB_
Definition: PixelCPEBase.h:254
unsigned int offsetDU(SubDetector sid) const
T z() const
Definition: PV3DBase.h:61
void computeLorentzShifts(DetParam &) const
const SiPixelTemplateDBObject * templateDBobject_
Definition: PixelCPEBase.h:250
const MagneticField * magfield_
Definition: PixelCPEBase.h:240
SubDetector tkDetEnum[8]
virtual GlobalVector inTesla(const GlobalPoint &gp) const =0
Field value ad specified global point, in Tesla.
const SiPixelGenErrorDBObject * genErrorDBObject_
Definition: PixelCPEBase.h:247
const TrackerGeometry & geom_
Definition: PixelCPEBase.h:241
T x() const
Definition: PV3DBase.h:59
void PixelCPEBase::fillPSetDescription ( edm::ParameterSetDescription desc)
static

Definition at line 465 of file PixelCPEBase.cc.

References edm::ParameterSetDescription::add().

Referenced by PixelCPETemplateRecoESProducer::fillDescriptions(), PixelCPEClusterRepairESProducer::fillDescriptions(), and PixelCPEGenericESProducer::fillDescriptions().

465  {
466  desc.add<bool>("LoadTemplatesFromDB", true);
467  desc.add<bool>("Alpha2Order", true);
468  desc.add<int>("ClusterProbComputationFlag", 0);
469  desc.add<bool>("useLAWidthFromDB", true);
470  desc.add<double>("lAOffset", 0.0);
471  desc.add<double>("lAWidthBPix", 0.0);
472  desc.add<double>("lAWidthFPix", 0.0);
473 }
ParameterDescriptionBase * add(U const &iLabel, T const &value)
ReturnType PixelCPEBase::getParameters ( const SiPixelCluster cl,
const GeomDetUnit det 
) const
inlineoverridevirtual

Implements PixelClusterParameterEstimator.

Definition at line 143 of file PixelCPEBase.h.

References computeAnglesFromDetPosition(), createClusterParam(), detParam(), localError(), localPosition(), rawQualityWord(), and setTheClu().

Referenced by cms::SiPixelRecHitConverter::produce().

143  {
144 #ifdef EDM_ML_DEBUG
145  nRecHitsTotal_++;
146  //std::cout<<" in PixelCPEBase:localParameters(all) - "<<nRecHitsTotal_<<std::endl; //dk
147 #endif
148 
149  DetParam const& theDetParam = detParam(det);
150  ClusterParam* theClusterParam = createClusterParam(cl);
151  setTheClu(theDetParam, *theClusterParam);
152  computeAnglesFromDetPosition(theDetParam, *theClusterParam);
153 
154  // localPosition( cl, det ) must be called before localError( cl, det ) !!!
155  LocalPoint lp = localPosition(theDetParam, *theClusterParam);
156  LocalError le = localError(theDetParam, *theClusterParam);
157  SiPixelRecHitQuality::QualWordType rqw = rawQualityWord(*theClusterParam);
158  auto tuple = std::make_tuple(lp, le, rqw);
159  delete theClusterParam;
160 
161  //std::cout<<" in PixelCPEBase:localParameters(all) - "<<lp.x()<<" "<<lp.y()<<std::endl; //dk
162  return tuple;
163  }
virtual ClusterParam * createClusterParam(const SiPixelCluster &cl) const =0
void computeAnglesFromDetPosition(DetParam const &theDetParam, ClusterParam &theClusterParam) const
SiPixelRecHitQuality::QualWordType rawQualityWord(ClusterParam &theClusterParam) const
void setTheClu(DetParam const &, ClusterParam &theClusterParam) const
virtual LocalError localError(DetParam const &theDetParam, ClusterParam &theClusterParam) const =0
virtual LocalPoint localPosition(DetParam const &theDetParam, ClusterParam &theClusterParam) const =0
DetParam const & detParam(const GeomDetUnit &det) const
ReturnType PixelCPEBase::getParameters ( const SiPixelCluster cl,
const GeomDetUnit det,
const LocalTrajectoryParameters ltp 
) const
inlineoverridevirtual

Implements PixelClusterParameterEstimator.

Definition at line 168 of file PixelCPEBase.h.

References GetRecoTauVFromDQM_MC_cff::cl, computeAnglesFromTrajectory(), createClusterParam(), detParam(), fillDetParams(), localError(), localPosition(), rawQualityWord(), and setTheClu().

170  {
171 #ifdef EDM_ML_DEBUG
172  nRecHitsTotal_++;
173  //std::cout<<" in PixelCPEBase:localParameters(on track) - "<<nRecHitsTotal_<<std::endl; //dk
174 #endif
175 
176  DetParam const& theDetParam = detParam(det);
177  ClusterParam* theClusterParam = createClusterParam(cl);
178  setTheClu(theDetParam, *theClusterParam);
179  computeAnglesFromTrajectory(theDetParam, *theClusterParam, ltp);
180 
181  // localPosition( cl, det ) must be called before localError( cl, det ) !!!
182  LocalPoint lp = localPosition(theDetParam, *theClusterParam);
183  LocalError le = localError(theDetParam, *theClusterParam);
184  SiPixelRecHitQuality::QualWordType rqw = rawQualityWord(*theClusterParam);
185  auto tuple = std::make_tuple(lp, le, rqw);
186  delete theClusterParam;
187 
188  //std::cout<<" in PixelCPEBase:localParameters(on track) - "<<lp.x()<<" "<<lp.y()<<std::endl; //dk
189  return tuple;
190  }
void computeAnglesFromTrajectory(DetParam const &theDetParam, ClusterParam &theClusterParam, const LocalTrajectoryParameters &ltp) const
virtual ClusterParam * createClusterParam(const SiPixelCluster &cl) const =0
SiPixelRecHitQuality::QualWordType rawQualityWord(ClusterParam &theClusterParam) const
void setTheClu(DetParam const &, ClusterParam &theClusterParam) const
virtual LocalError localError(DetParam const &theDetParam, ClusterParam &theClusterParam) const =0
virtual LocalPoint localPosition(DetParam const &theDetParam, ClusterParam &theClusterParam) const =0
DetParam const & detParam(const GeomDetUnit &det) const
virtual LocalError PixelCPEBase::localError ( DetParam const &  theDetParam,
ClusterParam theClusterParam 
) const
privatepure virtual
virtual LocalPoint PixelCPEBase::localPosition ( DetParam const &  theDetParam,
ClusterParam theClusterParam 
) const
privatepure virtual
SiPixelRecHitQuality::QualWordType PixelCPEBase::rawQualityWord ( ClusterParam theClusterParam) const
private

A convenience method to fill a whole SiPixelRecHitQuality word in one shot. This way, we can keep the details of what is filled within the pixel code and not expose the Transient SiPixelRecHit to it as well. The name of this function is chosen to match the one in SiPixelRecHit.

Definition at line 439 of file PixelCPEBase.cc.

References PixelCPEBase::ClusterParam::filled_from_2d, PixelCPEBase::ClusterParam::hasBadPixels_, PixelCPEBase::ClusterParam::hasFilledProb_, PixelCPEBase::ClusterParam::isOnEdge_, dqm-mbProfile::log, PixelCPEBase::ClusterParam::probabilityQ_, PixelCPEBase::ClusterParam::probabilityX_, PixelCPEBase::ClusterParam::probabilityY_, PixelCPEBase::ClusterParam::qBin_, SiPixelRecHitQuality::Packing::setHasBadPixels(), SiPixelRecHitQuality::Packing::setHasFilledProb(), SiPixelRecHitQuality::Packing::setIsOnEdge(), SiPixelRecHitQuality::Packing::setProbabilityQ(), SiPixelRecHitQuality::Packing::setProbabilityXY(), SiPixelRecHitQuality::Packing::setQBin(), SiPixelRecHitQuality::Packing::setSpansTwoROCs(), PixelCPEBase::ClusterParam::spansTwoROCs_, and SiPixelRecHitQuality::thePacking.

Referenced by getParameters().

439  {
441  if (theClusterParam.hasFilledProb_) {
442  float probabilityXY = 0;
443  if (theClusterParam.filled_from_2d)
444  probabilityXY = theClusterParam.probabilityX_;
445  else if (theClusterParam.probabilityX_ != 0 && theClusterParam.probabilityY_ != 0)
446  probabilityXY = theClusterParam.probabilityX_ * theClusterParam.probabilityY_ *
447  (1.f - std::log(theClusterParam.probabilityX_ * theClusterParam.probabilityY_));
448  SiPixelRecHitQuality::thePacking.setProbabilityXY(probabilityXY, qualWord);
449 
450  SiPixelRecHitQuality::thePacking.setProbabilityQ(theClusterParam.probabilityQ_, qualWord);
451  }
452  SiPixelRecHitQuality::thePacking.setQBin(theClusterParam.qBin_, qualWord);
453 
454  SiPixelRecHitQuality::thePacking.setIsOnEdge(theClusterParam.isOnEdge_, qualWord);
455 
456  SiPixelRecHitQuality::thePacking.setHasBadPixels(theClusterParam.hasBadPixels_, qualWord);
457 
458  SiPixelRecHitQuality::thePacking.setSpansTwoROCs(theClusterParam.spansTwoROCs_, qualWord);
459 
460  SiPixelRecHitQuality::thePacking.setHasFilledProb(theClusterParam.hasFilledProb_, qualWord);
461 
462  return qualWord;
463 }
void setProbabilityXY(float prob, QualWordType &qualWord) const
static const Packing thePacking
void setHasBadPixels(bool flag, QualWordType &qualWord) const
void setProbabilityQ(float prob, QualWordType &qualWord) const
void setSpansTwoROCs(bool flag, QualWordType &qualWord) const
void setIsOnEdge(bool flag, QualWordType &qualWord) const
void setHasFilledProb(bool flag, QualWordType &qualWord) const
void setQBin(int qbin, QualWordType &qualWord) const
void PixelCPEBase::setTheClu ( DetParam const &  theDetParam,
ClusterParam theClusterParam 
) const
protected

Definition at line 212 of file PixelCPEBase.cc.

References RectangularPixelTopology::containsBigPixelInX(), RectangularPixelTopology::containsBigPixelInY(), PixelCPEBase::ClusterParam::edgeTypeX_, PixelCPEBase::ClusterParam::edgeTypeY_, PixelCPEBase::ClusterParam::isOnEdge_, SiPixelCluster::maxPixelCol(), SiPixelCluster::maxPixelRow(), SiPixelCluster::minPixelCol(), SiPixelCluster::minPixelRow(), RectangularPixelTopology::ncolumns(), RectangularPixelTopology::nrows(), PixelCPEBase::ClusterParam::spansTwoROCs_, PixelCPEBase::ClusterParam::theCluster, and PixelCPEBase::DetParam::theRecTopol.

Referenced by getParameters().

212  {
213  //--- Geometric Quality Information
214  int minInX, minInY, maxInX, maxInY = 0;
215  minInX = theClusterParam.theCluster->minPixelRow();
216  minInY = theClusterParam.theCluster->minPixelCol();
217  maxInX = theClusterParam.theCluster->maxPixelRow();
218  maxInY = theClusterParam.theCluster->maxPixelCol();
219 
220  int min_row(0), min_col(0);
221  int max_row = theDetParam.theRecTopol->nrows() - 1;
222  int max_col = theDetParam.theRecTopol->ncolumns() - 1;
223 
224  if (minInX == min_row)
225  theClusterParam.edgeTypeX_ = 1;
226  else if (maxInX == max_row)
227  theClusterParam.edgeTypeX_ = 2;
228  else
229  theClusterParam.edgeTypeX_ = 0;
230 
231  if (minInY == min_col)
232  theClusterParam.edgeTypeY_ = 1;
233  else if (maxInY == max_col)
234  theClusterParam.edgeTypeY_ = 2;
235  else
236  theClusterParam.edgeTypeY_ = 0;
237 
238  theClusterParam.isOnEdge_ = (theClusterParam.edgeTypeX_ || theClusterParam.edgeTypeY_);
239 
240  // &&& FOR NOW UNUSED. KEEP IT IN CASE WE WANT TO USE IT IN THE FUTURE
241  // Bad Pixels have their charge set to 0 in the clusterizer
242  //hasBadPixels_ = false;
243  //for(unsigned int i=0; i<theClusterParam.theCluster->pixelADC().size(); ++i) {
244  //if(theClusterParam.theCluster->pixelADC()[i] == 0) { hasBadPixels_ = true; break;}
245  //}
246 
247  theClusterParam.spansTwoROCs_ = theDetParam.theRecTopol->containsBigPixelInX(minInX, maxInX) |
248  theDetParam.theRecTopol->containsBigPixelInY(minInY, maxInY);
249 }

Member Data Documentation

bool PixelCPEBase::alpha2Order
protected

Definition at line 251 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

bool PixelCPEBase::DoLorentz_
protected
const SiPixelGenErrorDBObject* PixelCPEBase::genErrorDBObject_
protected

Definition at line 247 of file PixelCPEBase.h.

Referenced by fillDetParams(), PixelCPEBase(), and PixelCPEGeneric::PixelCPEGeneric().

const TrackerGeometry& PixelCPEBase::geom_
protected

Definition at line 241 of file PixelCPEBase.h.

Referenced by PixelCPEClusterRepair::fill2DTemplIDs(), and fillDetParams().

float PixelCPEBase::lAOffset_
protected

Definition at line 228 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

float PixelCPEBase::lAWidthBPix_
protected

Definition at line 229 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

float PixelCPEBase::lAWidthFPix_
protected

Definition at line 230 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

bool PixelCPEBase::LoadTemplatesFromDB_
protected
const SiPixelLorentzAngle* PixelCPEBase::lorentzAngle_
protected

Definition at line 244 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

const SiPixelLorentzAngle* PixelCPEBase::lorentzAngleWidth_
protected

Definition at line 245 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

DetParams PixelCPEBase::m_DetParams = DetParams(1440)
protected

Definition at line 280 of file PixelCPEBase.h.

Referenced by detParam(), PixelCPEClusterRepair::fill2DTemplIDs(), and fillDetParams().

const MagneticField* PixelCPEBase::magfield_
protected

Definition at line 240 of file PixelCPEBase.h.

Referenced by fillDetParams().

const SiPixelTemplateDBObject* PixelCPEBase::templateDBobject_
protected
int PixelCPEBase::theFlag_
protected

Definition at line 238 of file PixelCPEBase.h.

Referenced by driftDirection(), fillDetParams(), and PixelCPEBase().

int PixelCPEBase::theVerboseLevel
protected
const TrackerTopology& PixelCPEBase::ttopo_
protected
bool PixelCPEBase::useLAOffsetFromConfig_
protected

Definition at line 232 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

bool PixelCPEBase::useLAWidthFromConfig_
protected

Definition at line 233 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

bool PixelCPEBase::useLAWidthFromDB_
protected

Definition at line 234 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().