CMS 3D CMS Logo

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

#include <PixelCPEBase.h>

Inheritance diagram for PixelCPEBase:
PixelClusterParameterEstimator PixelCPEClusterRepair PixelCPEGenericBase PixelCPETemplateReco PixelCPEFast PixelCPEGeneric

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 doLorentzFromAlignment_
 
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 useLAFromDB_
 
bool useLAOffsetFromConfig_
 
bool useLAWidthFromConfig_
 
bool useLAWidthFromDB_
 
- Protected Attributes inherited from PixelClusterParameterEstimator
unsigned int clusterProbComputationFlag_
 

Static Protected Attributes

static constexpr float bothEdgeXError_ = 31.0f
 
static constexpr float bothEdgeYError_ = 90.0f
 
static constexpr float clusterSplitMaxError_ = 7777.7f
 
static constexpr float xEdgeXError_ = 23.0f
 
static constexpr float xEdgeYError_ = 39.0f
 
static constexpr float yEdgeXError_ = 24.0f
 
static constexpr float yEdgeYError_ = 96.0f
 

Private Member Functions

virtual std::unique_ptr< 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 43 of file PixelCPEBase.h.

Member Typedef Documentation

◆ DetParams

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

Definition at line 280 of file PixelCPEBase.h.

◆ Frame

typedef GloballyPositioned<double> PixelCPEBase::Frame
protected

Definition at line 204 of file PixelCPEBase.h.

Constructor & Destructor Documentation

◆ PixelCPEBase()

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_, doLorentzFromAlignment_, fillDetParams(), genErrorDBObject_, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), createfilelist::int, lAOffset_, lAWidthBPix_, lAWidthFPix_, LoadTemplatesFromDB_, LogDebug, lorentzAngle_, lorentzAngleWidth_, templateDBobject_, theFlag_, theVerboseLevel, useLAFromDB_, 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 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  doLorentzFromAlignment_ = conf.getParameter<bool>("doLorentzFromAlignment");
110  useLAFromDB_ = conf.getParameter<bool>("useLAFromDB");
111 
112  LogDebug("PixelCPEBase") << " LA constants - " << lAOffset_ << " " << lAWidthBPix_ << " " << lAWidthFPix_
113  << endl; //dk
114 
115  fillDetParams();
116 }
const SiPixelLorentzAngle * lorentzAngleWidth_
Definition: PixelCPEBase.h:234
void fillDetParams()
bool doLorentzFromAlignment_
Definition: PixelCPEBase.h:242
bool useLAWidthFromDB_
Definition: PixelCPEBase.h:223
float lAWidthBPix_
Definition: PixelCPEBase.h:218
bool useLAWidthFromConfig_
Definition: PixelCPEBase.h:222
bool LoadTemplatesFromDB_
Definition: PixelCPEBase.h:243
const SiPixelTemplateDBObject * templateDBobject_
Definition: PixelCPEBase.h:237
const MagneticField * magfield_
Definition: PixelCPEBase.h:229
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
const TrackerTopology & ttopo_
Definition: PixelCPEBase.h:231
const SiPixelLorentzAngle * lorentzAngle_
Definition: PixelCPEBase.h:233
const SiPixelGenErrorDBObject * genErrorDBObject_
Definition: PixelCPEBase.h:236
bool useLAOffsetFromConfig_
Definition: PixelCPEBase.h:221
const TrackerGeometry & geom_
Definition: PixelCPEBase.h:230
float lAWidthFPix_
Definition: PixelCPEBase.h:219
#define LogDebug(id)

Member Function Documentation

◆ computeAnglesFromDetPosition()

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

Definition at line 291 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().

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

◆ computeAnglesFromTrajectory()

void PixelCPEBase::computeAnglesFromTrajectory ( DetParam const &  theDetParam,
ClusterParam theClusterParam,
const LocalTrajectoryParameters ltp 
) const
protected

Definition at line 257 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().

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

◆ computeLorentzShifts()

void PixelCPEBase::computeLorentzShifts ( DetParam theDetParam) const
protected

Definition at line 423 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().

423  {
424  // Max shift (at the other side of the sensor) in cm
425  theDetParam.lorentzShiftInCmX =
426  theDetParam.driftDirection.x() / theDetParam.driftDirection.z() * theDetParam.theThickness; //
427  theDetParam.lorentzShiftInCmY =
428  theDetParam.driftDirection.y() / theDetParam.driftDirection.z() * theDetParam.theThickness; //
429 
430  LogDebug("PixelCPEBase::computeLorentzShifts()")
431  << " lorentzShiftsInCmX,Y = " << theDetParam.lorentzShiftInCmX << " " << theDetParam.lorentzShiftInCmY << " "
432  << theDetParam.driftDirection;
433 }
#define LogDebug(id)

◆ createClusterParam()

virtual std::unique_ptr<ClusterParam> PixelCPEBase::createClusterParam ( const SiPixelCluster cl) const
privatepure virtual

◆ detParam()

PixelCPEBase::DetParam const & PixelCPEBase::detParam ( const GeomDetUnit det) const
protected

Definition at line 322 of file PixelCPEBase.cc.

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

Referenced by getParameters().

322  {
323  auto i = det.index();
324  //cout << "get parameters of detector " << i << endl;
325  assert(i < int(m_DetParams.size()));
326  //if (i>=int(m_DetParams.size())) m_DetParams.resize(i+1); // should never happen!
327  const DetParam& p = m_DetParams[i];
328  return p;
329 }
int index() const
Definition: GeomDet.h:83
DetParams m_DetParams
Definition: PixelCPEBase.h:282
assert(be >=bs)

◆ driftDirection() [1/2]

LocalVector PixelCPEBase::driftDirection ( DetParam theDetParam,
GlobalVector  bfield 
) const
protected

Definition at line 338 of file PixelCPEBase.cc.

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

Referenced by fillDetParams().

338  {
339  Frame detFrame(theDetParam.theDet->surface().position(), theDetParam.theDet->surface().rotation());
340  LocalVector Bfield = detFrame.toLocal(bfield);
341  return driftDirection(theDetParam, Bfield);
342 }
constexpr float Bfield
Definition: Config.h:88
LocalVector driftDirection(DetParam &theDetParam, GlobalVector bfield) const
GloballyPositioned< double > Frame
Definition: PixelCPEBase.h:204

◆ driftDirection() [2/2]

LocalVector PixelCPEBase::driftDirection ( DetParam theDetParam,
LocalVector  bfield 
) const
protected

Definition at line 344 of file PixelCPEBase.cc.

References funct::abs(), alpha2Order, mkfit::Config::Bfield, createTree::dd, f, GeomDet::geographicalId(), SiPixelLorentzAngle::getLorentzAngle(), GeomDetEnumerators::isBarrel(), GeomDetEnumerators::isTrackerPixel(), lAOffset_, lAWidthBPix_, lAWidthFPix_, LogDebug, lorentzAngle_, lorentzAngleWidth_, DetId::rawId(), L1EGammaClusterEmuProducer_cfi::scale, PixelCPEBase::DetParam::theDet, theFlag_, PixelCPEBase::DetParam::thePart, useLAOffsetFromConfig_, useLAWidthFromConfig_, useLAWidthFromDB_, PixelCPEBase::DetParam::widthLAFractionX, and PixelCPEBase::DetParam::widthLAFractionY.

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

◆ fillDetParams()

void PixelCPEBase::fillDetParams ( )
private

Definition at line 121 of file PixelCPEBase.cc.

References cms::cuda::assert(), mkfit::Config::Bfield, computeLorentzShifts(), TrackerGeometry::detUnits(), doLorentzFromAlignment_, 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, and useLAFromDB_.

Referenced by PixelCPEBase().

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

◆ fillPSetDescription()

void PixelCPEBase::fillPSetDescription ( edm::ParameterSetDescription desc)
static

Definition at line 467 of file PixelCPEBase.cc.

References submitPVResolutionJobs::desc.

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

467  {
468  desc.add<bool>("LoadTemplatesFromDB", true);
469  desc.add<bool>("Alpha2Order", true);
470  desc.add<int>("ClusterProbComputationFlag", 0);
471  desc.add<bool>("useLAWidthFromDB", true);
472  desc.add<double>("lAOffset", 0.0);
473  desc.add<double>("lAWidthBPix", 0.0);
474  desc.add<double>("lAWidthFPix", 0.0);
475  desc.add<bool>("doLorentzFromAlignment", false);
476  desc.add<bool>("useLAFromDB", true);
477 }

◆ getParameters() [1/2]

ReturnType PixelCPEBase::getParameters ( const SiPixelCluster cl,
const GeomDetUnit det 
) const
inlineoverridevirtual

Implements PixelClusterParameterEstimator.

Definition at line 134 of file PixelCPEBase.h.

References haddnano::cl, computeAnglesFromDetPosition(), createClusterParam(), detParam(), localError(), localPosition(), LogDebug, rawQualityWord(), setTheClu(), mkLumiAveragedPlots::tuple, PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::y().

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

134  {
135 #ifdef EDM_ML_DEBUG
136  nRecHitsTotal_++;
137  LogDebug("PixelCPEBase") << " in PixelCPEBase:localParameters(all) - " << nRecHitsTotal_;
138 #endif
139 
140  DetParam const& theDetParam = detParam(det);
141  std::unique_ptr<ClusterParam> theClusterParam = createClusterParam(cl);
142  setTheClu(theDetParam, *theClusterParam);
143  computeAnglesFromDetPosition(theDetParam, *theClusterParam);
144 
145  // localPosition( cl, det ) must be called before localError( cl, det ) !!!
146  LocalPoint lp = localPosition(theDetParam, *theClusterParam);
147  LocalError le = localError(theDetParam, *theClusterParam);
148  SiPixelRecHitQuality::QualWordType rqw = rawQualityWord(*theClusterParam);
149  auto tuple = std::make_tuple(lp, le, rqw);
150 
151  LogDebug("PixelCPEBase") << " in PixelCPEBase:localParameters(all) - " << lp.x() << " " << lp.y();
152  return tuple;
153  }
void computeAnglesFromDetPosition(DetParam const &theDetParam, ClusterParam &theClusterParam) const
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
SiPixelRecHitQuality::QualWordType rawQualityWord(ClusterParam &theClusterParam) const
virtual LocalPoint localPosition(DetParam const &theDetParam, ClusterParam &theClusterParam) const =0
virtual std::unique_ptr< ClusterParam > createClusterParam(const SiPixelCluster &cl) const =0
DetParam const & detParam(const GeomDetUnit &det) const
virtual LocalError localError(DetParam const &theDetParam, ClusterParam &theClusterParam) const =0
void setTheClu(DetParam const &, ClusterParam &theClusterParam) const
#define LogDebug(id)

◆ getParameters() [2/2]

ReturnType PixelCPEBase::getParameters ( const SiPixelCluster cl,
const GeomDetUnit det,
const LocalTrajectoryParameters ltp 
) const
inlineoverridevirtual

Implements PixelClusterParameterEstimator.

Definition at line 158 of file PixelCPEBase.h.

References haddnano::cl, computeAnglesFromTrajectory(), createClusterParam(), detParam(), localError(), localPosition(), LogDebug, rawQualityWord(), setTheClu(), mkLumiAveragedPlots::tuple, PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::y().

160  {
161 #ifdef EDM_ML_DEBUG
162  nRecHitsTotal_++;
163  LogDebug("PixelCPEBase") << " in PixelCPEBase:localParameters(on track) - " << nRecHitsTotal_;
164 #endif
165 
166  DetParam const& theDetParam = detParam(det);
167  std::unique_ptr<ClusterParam> theClusterParam = createClusterParam(cl);
168  setTheClu(theDetParam, *theClusterParam);
169  computeAnglesFromTrajectory(theDetParam, *theClusterParam, ltp);
170 
171  // localPosition( cl, det ) must be called before localError( cl, det ) !!!
172  LocalPoint lp = localPosition(theDetParam, *theClusterParam);
173  LocalError le = localError(theDetParam, *theClusterParam);
174  SiPixelRecHitQuality::QualWordType rqw = rawQualityWord(*theClusterParam);
175  auto tuple = std::make_tuple(lp, le, rqw);
176 
177  LogDebug("PixelCPEBase") << " in PixelCPEBase:localParameters(on track) - " << lp.x() << " " << lp.y();
178  return tuple;
179  }
void computeAnglesFromTrajectory(DetParam const &theDetParam, ClusterParam &theClusterParam, const LocalTrajectoryParameters &ltp) const
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
SiPixelRecHitQuality::QualWordType rawQualityWord(ClusterParam &theClusterParam) const
virtual LocalPoint localPosition(DetParam const &theDetParam, ClusterParam &theClusterParam) const =0
virtual std::unique_ptr< ClusterParam > createClusterParam(const SiPixelCluster &cl) const =0
DetParam const & detParam(const GeomDetUnit &det) const
virtual LocalError localError(DetParam const &theDetParam, ClusterParam &theClusterParam) const =0
void setTheClu(DetParam const &, ClusterParam &theClusterParam) const
#define LogDebug(id)

◆ localError()

virtual LocalError PixelCPEBase::localError ( DetParam const &  theDetParam,
ClusterParam theClusterParam 
) const
privatepure virtual

◆ localPosition()

virtual LocalPoint PixelCPEBase::localPosition ( DetParam const &  theDetParam,
ClusterParam theClusterParam 
) const
privatepure virtual

◆ rawQualityWord()

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 441 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().

441  {
443  if (theClusterParam.hasFilledProb_) {
444  float probabilityXY = 0;
445  if (theClusterParam.filled_from_2d)
446  probabilityXY = theClusterParam.probabilityX_;
447  else if (theClusterParam.probabilityX_ != 0 && theClusterParam.probabilityY_ != 0)
448  probabilityXY = theClusterParam.probabilityX_ * theClusterParam.probabilityY_ *
449  (1.f - std::log(theClusterParam.probabilityX_ * theClusterParam.probabilityY_));
450  SiPixelRecHitQuality::thePacking.setProbabilityXY(probabilityXY, qualWord);
451 
452  SiPixelRecHitQuality::thePacking.setProbabilityQ(theClusterParam.probabilityQ_, qualWord);
453  }
454  SiPixelRecHitQuality::thePacking.setQBin(theClusterParam.qBin_, qualWord);
455 
456  SiPixelRecHitQuality::thePacking.setIsOnEdge(theClusterParam.isOnEdge_, qualWord);
457 
458  SiPixelRecHitQuality::thePacking.setHasBadPixels(theClusterParam.hasBadPixels_, qualWord);
459 
460  SiPixelRecHitQuality::thePacking.setSpansTwoROCs(theClusterParam.spansTwoROCs_, qualWord);
461 
462  SiPixelRecHitQuality::thePacking.setHasFilledProb(theClusterParam.hasFilledProb_, qualWord);
463 
464  return qualWord;
465 }
static const Packing thePacking
void setHasBadPixels(bool flag, 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 setProbabilityQ(float prob, QualWordType &qualWord) const
void setProbabilityXY(float prob, QualWordType &qualWord) const

◆ setTheClu()

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

Definition at line 214 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().

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

Member Data Documentation

◆ alpha2Order

bool PixelCPEBase::alpha2Order
protected

Definition at line 238 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

◆ bothEdgeXError_

constexpr float PixelCPEBase::bothEdgeXError_ = 31.0f
staticprotected

◆ bothEdgeYError_

constexpr float PixelCPEBase::bothEdgeYError_ = 90.0f
staticprotected

◆ clusterSplitMaxError_

constexpr float PixelCPEBase::clusterSplitMaxError_ = 7777.7f
staticprotected

◆ doLorentzFromAlignment_

bool PixelCPEBase::doLorentzFromAlignment_
protected

◆ genErrorDBObject_

const SiPixelGenErrorDBObject* PixelCPEBase::genErrorDBObject_
protected

◆ geom_

const TrackerGeometry& PixelCPEBase::geom_
protected

Definition at line 230 of file PixelCPEBase.h.

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

◆ lAOffset_

float PixelCPEBase::lAOffset_
protected

Definition at line 217 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

◆ lAWidthBPix_

float PixelCPEBase::lAWidthBPix_
protected

Definition at line 218 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

◆ lAWidthFPix_

float PixelCPEBase::lAWidthFPix_
protected

Definition at line 219 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

◆ LoadTemplatesFromDB_

bool PixelCPEBase::LoadTemplatesFromDB_
protected

◆ lorentzAngle_

const SiPixelLorentzAngle* PixelCPEBase::lorentzAngle_
protected

Definition at line 233 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

◆ lorentzAngleWidth_

const SiPixelLorentzAngle* PixelCPEBase::lorentzAngleWidth_
protected

Definition at line 234 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

◆ m_DetParams

DetParams PixelCPEBase::m_DetParams = DetParams(1440)
protected

◆ magfield_

const MagneticField* PixelCPEBase::magfield_
protected

Definition at line 229 of file PixelCPEBase.h.

Referenced by fillDetParams().

◆ templateDBobject_

const SiPixelTemplateDBObject* PixelCPEBase::templateDBobject_
protected

◆ theFlag_

int PixelCPEBase::theFlag_
protected

Definition at line 227 of file PixelCPEBase.h.

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

◆ theVerboseLevel

int PixelCPEBase::theVerboseLevel
protected

◆ ttopo_

const TrackerTopology& PixelCPEBase::ttopo_
protected

◆ useLAFromDB_

bool PixelCPEBase::useLAFromDB_
protected

Definition at line 240 of file PixelCPEBase.h.

Referenced by fillDetParams(), and PixelCPEBase().

◆ useLAOffsetFromConfig_

bool PixelCPEBase::useLAOffsetFromConfig_
protected

Definition at line 221 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

◆ useLAWidthFromConfig_

bool PixelCPEBase::useLAWidthFromConfig_
protected

Definition at line 222 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

◆ useLAWidthFromDB_

bool PixelCPEBase::useLAWidthFromDB_
protected

Definition at line 223 of file PixelCPEBase.h.

Referenced by driftDirection(), and PixelCPEBase().

◆ xEdgeXError_

constexpr float PixelCPEBase::xEdgeXError_ = 23.0f
staticprotected

◆ xEdgeYError_

constexpr float PixelCPEBase::xEdgeYError_ = 39.0f
staticprotected

◆ yEdgeXError_

constexpr float PixelCPEBase::yEdgeXError_ = 24.0f
staticprotected

◆ yEdgeYError_

constexpr float PixelCPEBase::yEdgeYError_ = 96.0f
staticprotected