CMS 3D CMS Logo

List of all members | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes
PixelCPEGeneric Class Reference

#include <PixelCPEGeneric.h>

Inheritance diagram for PixelCPEGeneric:
PixelCPEGenericBase PixelCPEBase PixelClusterParameterEstimator

Public Member Functions

 PixelCPEGeneric (edm::ParameterSet const &conf, const MagneticField *, const TrackerGeometry &, const TrackerTopology &, const SiPixelLorentzAngle *, const SiPixelGenErrorDBObject *, const SiPixelLorentzAngle *)
 The constructor. More...
 
 ~PixelCPEGeneric () override=default
 
- Public Member Functions inherited from PixelCPEGenericBase
 PixelCPEGenericBase (edm::ParameterSet const &conf, const MagneticField *mag, const TrackerGeometry &geom, const TrackerTopology &ttopo, const SiPixelLorentzAngle *lorentzAngle, const SiPixelGenErrorDBObject *genErrorDBObject, const SiPixelLorentzAngle *lorentzAngleWidth)
 
 ~PixelCPEGenericBase () override=default
 
- Public Member Functions inherited from PixelCPEBase
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)
 
- Static Public Member Functions inherited from PixelCPEGenericBase
static void fillPSetDescription (edm::ParameterSetDescription &desc)
 
- Static Public Member Functions inherited from PixelCPEBase
static void fillPSetDescription (edm::ParameterSetDescription &desc)
 

Protected Member Functions

float err2X (bool &, int &) const
 
float err2Y (bool &, int &) const
 
LocalError localError (DetParam const &theDetParam, ClusterParam &theClusterParam) const override
 
LocalPoint localPosition (DetParam const &theDetParam, ClusterParam &theClusterParam) const override
 
- Protected Member Functions inherited from PixelCPEGenericBase
std::unique_ptr< ClusterParamcreateClusterParam (const SiPixelCluster &cl) const override
 
void initializeLocalErrorVariables (float &xerr, float &yerr, bool &edgex, bool &edgey, bool &bigInX, bool &bigInY, int &maxPixelCol, int &maxPixelRow, int &minPixelCol, int &minPixelRow, uint &sizex, uint &sizey, DetParam const &theDetParam, ClusterParamGeneric const &theClusterParam) const
 
void setXYErrors (float &xerr, float &yerr, const bool edgex, const bool edgey, const unsigned int sizex, const unsigned int sizey, const bool bigInX, const bool bigInY, const bool useTemplateErrors, DetParam const &theDetParam, ClusterParamGeneric const &theClusterParam) const
 
- Protected Member Functions inherited from PixelCPEBase
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 DoCosmics_
 
bool inflate_all_errors_no_trk_angle
 
bool inflate_errors
 
bool IrradiationBiasCorrection_
 
bool isPhase2_
 
bool NoTemplateErrorsWhenNoTrkAngles_
 
float the_eff_charge_cut_highX
 
float the_eff_charge_cut_highY
 
float the_eff_charge_cut_lowX
 
float the_eff_charge_cut_lowY
 
float the_size_cutX
 
float the_size_cutY
 
std::vector< SiPixelGenErrorStorethePixelGenError_
 
- Protected Attributes inherited from PixelCPEGenericBase
const float edgeClusterErrorX_
 
const float edgeClusterErrorY_
 
const bool truncatePixelCharge_
 
bool useErrorsFromTemplates_
 
const std::vector< float > xerr_barrel_l1_
 
const float xerr_barrel_l1_def_
 
const std::vector< float > xerr_barrel_ln_
 
const float xerr_barrel_ln_def_
 
const std::vector< float > xerr_endcap_
 
const float xerr_endcap_def_
 
const std::vector< float > yerr_barrel_l1_
 
const float yerr_barrel_l1_def_
 
const std::vector< float > yerr_barrel_ln_
 
const float yerr_barrel_ln_def_
 
const std::vector< float > yerr_endcap_
 
const float yerr_endcap_def_
 
- Protected Attributes inherited from PixelCPEBase
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_
 

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
 
- Protected Types inherited from PixelCPEBase
using DetParams = std::vector< DetParam >
 
typedef GloballyPositioned< double > Frame
 
- Static Protected Member Functions inherited from PixelCPEGenericBase
static void collect_edge_charges (ClusterParam &theClusterParam, int &q_f_X, int &q_l_X, int &q_f_Y, int &q_l_Y, bool truncate)
 
- Static Protected Attributes inherited from PixelCPEBase
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
 

Detailed Description

Definition at line 51 of file PixelCPEGeneric.h.

Constructor & Destructor Documentation

◆ PixelCPEGeneric()

PixelCPEGeneric::PixelCPEGeneric ( edm::ParameterSet const &  conf,
const MagneticField mag,
const TrackerGeometry geom,
const TrackerTopology ttopo,
const SiPixelLorentzAngle lorentzAngle,
const SiPixelGenErrorDBObject genErrorDBObject,
const SiPixelLorentzAngle lorentzAngleWidth = nullptr 
)

The constructor.

Definition at line 29 of file PixelCPEGeneric.cc.

References gather_cfg::cout, DoCosmics_, Exception, PixelCPEBase::genErrorDBObject_, edm::ParameterSet::getParameter(), inflate_all_errors_no_trk_angle, inflate_errors, createfilelist::int, IrradiationBiasCorrection_, isPhase2_, PixelCPEBase::LoadTemplatesFromDB_, LogDebug, NoTemplateErrorsWhenNoTrkAngles_, SiPixelGenError::pushfile(), the_eff_charge_cut_highX, the_eff_charge_cut_highY, the_eff_charge_cut_lowX, the_eff_charge_cut_lowY, the_size_cutX, the_size_cutY, thePixelGenError_, PixelCPEBase::theVerboseLevel, PixelCPEGenericBase::truncatePixelCharge_, and PixelCPEGenericBase::useErrorsFromTemplates_.

36  : PixelCPEGenericBase(conf, mag, geom, ttopo, lorentzAngle, genErrorDBObject, lorentzAngleWidth) {
37  if (theVerboseLevel > 0)
38  LogDebug("PixelCPEGeneric") << " constructing a generic algorithm for ideal pixel detector.\n"
39  << " CPEGeneric:: VerboseLevel = " << theVerboseLevel;
40 
41  // Externally settable cuts
42  the_eff_charge_cut_lowX = conf.getParameter<double>("eff_charge_cut_lowX");
43  the_eff_charge_cut_lowY = conf.getParameter<double>("eff_charge_cut_lowY");
44  the_eff_charge_cut_highX = conf.getParameter<double>("eff_charge_cut_highX");
45  the_eff_charge_cut_highY = conf.getParameter<double>("eff_charge_cut_highY");
46  the_size_cutX = conf.getParameter<double>("size_cutX");
47  the_size_cutY = conf.getParameter<double>("size_cutY");
48 
49  // Externally settable flags to inflate errors
50  inflate_errors = conf.getParameter<bool>("inflate_errors");
51  inflate_all_errors_no_trk_angle = conf.getParameter<bool>("inflate_all_errors_no_trk_angle");
52 
53  NoTemplateErrorsWhenNoTrkAngles_ = conf.getParameter<bool>("NoTemplateErrorsWhenNoTrkAngles");
54  IrradiationBiasCorrection_ = conf.getParameter<bool>("IrradiationBiasCorrection");
55  DoCosmics_ = conf.getParameter<bool>("DoCosmics");
56 
57  isPhase2_ = conf.getParameter<bool>("isPhase2");
58 
59  // For cosmics force the use of simple errors
60  if ((DoCosmics_))
62 
64  throw cms::Exception("PixelCPEGeneric::PixelCPEGeneric: ")
65  << "\nERROR: useErrorsFromTemplates_ is set to False in PixelCPEGeneric_cfi.py. "
66  << " In this case it does not make sense to set any of the following to True: "
67  << " truncatePixelCharge_, IrradiationBiasCorrection_, DoCosmics_, LoadTemplatesFromDB_ !!!"
68  << "\n\n";
69  }
70 
71  // Use errors from templates or from GenError
73  if (LoadTemplatesFromDB_) { // From DB
75  throw cms::Exception("InvalidCalibrationLoaded")
76  << "ERROR: GenErrors not filled correctly. Check the sqlite file. Using SiPixelTemplateDBObject version "
77  << (*genErrorDBObject_).version();
78  LogDebug("PixelCPEGeneric") << "Loaded genErrorDBObject v" << (*genErrorDBObject_).version();
79  } else { // From file
81  throw cms::Exception("InvalidCalibrationLoaded")
82  << "ERROR: GenErrors not loaded correctly from text file. Reconstruction will fail.";
83  } // if load from DB
84 
85  } else {
86 #ifdef EDM_ML_DEBUG
87  cout << " Use simple parametrised errors " << endl;
88 #endif
89  } // if ( useErrorsFromTemplates_ )
90 
91 #ifdef EDM_ML_DEBUG
92  cout << "From PixelCPEGeneric::PixelCPEGeneric(...)" << endl;
93  cout << "(int)useErrorsFromTemplates_ = " << (int)useErrorsFromTemplates_ << endl;
94  cout << "truncatePixelCharge_ = " << (int)truncatePixelCharge_ << endl;
95  cout << "IrradiationBiasCorrection_ = " << (int)IrradiationBiasCorrection_ << endl;
96  cout << "(int)DoCosmics_ = " << (int)DoCosmics_ << endl;
97  cout << "(int)LoadTemplatesFromDB_ = " << (int)LoadTemplatesFromDB_ << endl;
98 #endif
99 }
static bool pushfile(int filenum, std::vector< SiPixelGenErrorStore > &pixelTemp, std::string dir="")
float the_eff_charge_cut_highY
std::vector< SiPixelGenErrorStore > thePixelGenError_
bool IrradiationBiasCorrection_
bool NoTemplateErrorsWhenNoTrkAngles_
bool LoadTemplatesFromDB_
Definition: PixelCPEBase.h:243
float the_eff_charge_cut_lowX
bool inflate_all_errors_no_trk_angle
PixelCPEGenericBase(edm::ParameterSet const &conf, const MagneticField *mag, const TrackerGeometry &geom, const TrackerTopology &ttopo, const SiPixelLorentzAngle *lorentzAngle, const SiPixelGenErrorDBObject *genErrorDBObject, const SiPixelLorentzAngle *lorentzAngleWidth)
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
const SiPixelGenErrorDBObject * genErrorDBObject_
Definition: PixelCPEBase.h:236
float the_eff_charge_cut_lowY
#define LogDebug(id)
float the_eff_charge_cut_highX

◆ ~PixelCPEGeneric()

PixelCPEGeneric::~PixelCPEGeneric ( )
overridedefault

Member Function Documentation

◆ err2X()

float PixelCPEGeneric::err2X ( bool &  ,
int &   
) const
protected

◆ err2Y()

float PixelCPEGeneric::err2Y ( bool &  ,
int &   
) const
protected

◆ fillPSetDescription()

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

Definition at line 435 of file PixelCPEGeneric.cc.

References submitPVResolutionJobs::desc, and PixelCPEGenericBase::fillPSetDescription().

Referenced by PixelCPEGenericESProducer::fillDescriptions().

435  {
437  desc.add<double>("eff_charge_cut_highX", 1.0);
438  desc.add<double>("eff_charge_cut_highY", 1.0);
439  desc.add<double>("eff_charge_cut_lowX", 0.0);
440  desc.add<double>("eff_charge_cut_lowY", 0.0);
441  desc.add<double>("size_cutX", 3.0);
442  desc.add<double>("size_cutY", 3.0);
443  desc.add<double>("EdgeClusterErrorX", 50.0);
444  desc.add<double>("EdgeClusterErrorY", 85.0);
445  desc.add<bool>("inflate_errors", false);
446  desc.add<bool>("inflate_all_errors_no_trk_angle", false);
447  desc.add<bool>("NoTemplateErrorsWhenNoTrkAngles", false);
448  desc.add<bool>("UseErrorsFromTemplates", true);
449  desc.add<bool>("TruncatePixelCharge", true);
450  desc.add<bool>("IrradiationBiasCorrection", false);
451  desc.add<bool>("DoCosmics", false);
452  desc.add<bool>("isPhase2", false);
453  desc.add<bool>("SmallPitch", false);
454 }
static void fillPSetDescription(edm::ParameterSetDescription &desc)

◆ localError()

LocalError PixelCPEGeneric::localError ( DetParam const &  theDetParam,
ClusterParam theClusterParam 
) const
overrideprotectedvirtual

Implements PixelCPEBase.

Definition at line 349 of file PixelCPEGeneric.cc.

References Exception, f, nano_mu_digi_cff::float, HLTSiStripMonitoring_cff::inflate_errors, RectangularPixelTopology::isItBigPixelInX(), RectangularPixelTopology::isItBigPixelInY(), LogDebug, PixelCPEBase::ClusterParam::qBin_, mathSSE::sqrt(), PixelCPEBase::DetParam::thePitchX, PixelCPEBase::DetParam::thePitchY, PixelCPEBase::DetParam::theRecTopol, parallelization::uint, and PixelCPEBase::ClusterParam::with_track_angle.

349  {
350  ClusterParamGeneric& theClusterParam = static_cast<ClusterParamGeneric&>(theClusterParamBase);
351 
352  // local variables
353  float xerr, yerr;
354  bool edgex, edgey, bigInX, bigInY;
355  int maxPixelCol, maxPixelRow, minPixelCol, minPixelRow;
356  uint sizex, sizey;
357 
359  yerr,
360  edgex,
361  edgey,
362  bigInX,
363  bigInY,
364  maxPixelCol,
365  maxPixelRow,
366  minPixelCol,
367  minPixelRow,
368  sizex,
369  sizey,
370  theDetParam,
371  theClusterParam);
372 
373  bool useTempErrors =
374  useErrorsFromTemplates_ && (!NoTemplateErrorsWhenNoTrkAngles_ || theClusterParam.with_track_angle);
375 
376  if (int(sizex) != (maxPixelRow - minPixelRow + 1))
377  LogDebug("PixelCPEGeneric") << " wrong x";
378  if (int(sizey) != (maxPixelCol - minPixelCol + 1))
379  LogDebug("PixelCPEGeneric") << " wrong y";
380 
381  LogDebug("PixelCPEGeneric") << " edge clus " << xerr << " " << yerr; //dk
382  if (bigInX || bigInY)
383  LogDebug("PixelCPEGeneric") << " big " << bigInX << " " << bigInY;
384  if (edgex || edgey)
385  LogDebug("PixelCPEGeneric") << " edge " << edgex << " " << edgey;
386  LogDebug("PixelCPEGeneric") << " before if " << useErrorsFromTemplates_ << " " << theClusterParam.qBin_;
387  if (theClusterParam.qBin_ == 0)
388  LogDebug("PixelCPEGeneric") << " qbin 0! " << edgex << " " << edgey << " " << bigInX << " " << bigInY << " "
389  << sizex << " " << sizey;
390 
391  // from PixelCPEGenericBase
392  setXYErrors(xerr, yerr, edgex, edgey, sizex, sizey, bigInX, bigInY, useTempErrors, theDetParam, theClusterParam);
393 
394  if (!useTempErrors) {
395  LogDebug("PixelCPEGeneric") << "Track angles are not known.\n"
396  << "Default angle estimation which assumes track from PV (0,0,0) does not work.";
397  }
398 
399  if (!useTempErrors && inflate_errors) {
400  int n_bigx = 0;
401  int n_bigy = 0;
402 
403  for (int irow = 0; irow < 7; ++irow) {
404  if (theDetParam.theRecTopol->isItBigPixelInX(irow + minPixelRow))
405  ++n_bigx;
406  }
407 
408  for (int icol = 0; icol < 21; ++icol) {
409  if (theDetParam.theRecTopol->isItBigPixelInY(icol + minPixelCol))
410  ++n_bigy;
411  }
412 
413  xerr = (float)(sizex + n_bigx) * theDetParam.thePitchX / std::sqrt(12.0f);
414  yerr = (float)(sizey + n_bigy) * theDetParam.thePitchY / std::sqrt(12.0f);
415  }
416 
417 #ifdef EDM_ML_DEBUG
418  if (!(xerr > 0.0))
419  throw cms::Exception("PixelCPEGeneric::localError") << "\nERROR: Negative pixel error xerr = " << xerr << "\n\n";
420 
421  if (!(yerr > 0.0))
422  throw cms::Exception("PixelCPEGeneric::localError") << "\nERROR: Negative pixel error yerr = " << yerr << "\n\n";
423 #endif
424 
425  LogDebug("PixelCPEGeneric") << " errors " << xerr << " " << yerr; //dk
426  if (theClusterParam.qBin_ == 0)
427  LogDebug("PixelCPEGeneric") << " qbin 0 " << xerr << " " << yerr;
428 
429  auto xerr_sq = xerr * xerr;
430  auto yerr_sq = yerr * yerr;
431 
432  return LocalError(xerr_sq, 0, yerr_sq);
433 }
bool NoTemplateErrorsWhenNoTrkAngles_
T sqrt(T t)
Definition: SSEVec.h:19
double f[11][100]
void setXYErrors(float &xerr, float &yerr, const bool edgex, const bool edgey, const unsigned int sizex, const unsigned int sizey, const bool bigInX, const bool bigInY, const bool useTemplateErrors, DetParam const &theDetParam, ClusterParamGeneric const &theClusterParam) const
void initializeLocalErrorVariables(float &xerr, float &yerr, bool &edgex, bool &edgey, bool &bigInX, bool &bigInY, int &maxPixelCol, int &maxPixelRow, int &minPixelCol, int &minPixelRow, uint &sizex, uint &sizey, DetParam const &theDetParam, ClusterParamGeneric const &theClusterParam) const
#define LogDebug(id)

◆ localPosition()

LocalPoint PixelCPEGeneric::localPosition ( DetParam const &  theDetParam,
ClusterParam theClusterParamBase 
) const
overrideprotectedvirtual

Hit position in the local frame (in cm). Unlike other CPE's, this one converts everything from the measurement frame (in channel numbers) into the local frame (in centimeters).

< Q of the first pixel in X

< Q of the last pixel in X

< Q of the first pixel in Y

< Q of the last pixel in Y

Implements PixelCPEBase.

Definition at line 106 of file PixelCPEGeneric.cc.

References PixelCPEBase::DetParam::bx, PixelCPEBase::DetParam::bz, SiPixelCluster::charge(), PixelCPEBase::ClusterParam::cotalpha, PixelCPEBase::ClusterParam::cotbeta, gather_cfg::cout, PixelCPEGenericBase::ClusterParamGeneric::deltax, PixelCPEGenericBase::ClusterParamGeneric::deltay, PixelCPEBase::DetParam::detTemplateId, PixelCPEGenericBase::ClusterParamGeneric::dx1, PixelCPEGenericBase::ClusterParamGeneric::dx2, PixelCPEGenericBase::ClusterParamGeneric::dy1, PixelCPEGenericBase::ClusterParamGeneric::dy2, siPixelUtils::generic_position_formula(), RectangularPixelTopology::isItBigPixelInX(), RectangularPixelTopology::isItBigPixelInY(), PixelCPEBase::ClusterParam::loc_trk_pred, Topology::localPosition(), LogDebug, PixelCPEBase::DetParam::lorentzShiftInCmX, PixelCPEBase::DetParam::lorentzShiftInCmY, SiPixelGenError::lorxwidth(), SiPixelGenError::lorywidth(), SiPixelCluster::maxPixelCol(), SiPixelCluster::maxPixelRow(), pixelCPEforDevice::micronsToCm, SiPixelCluster::minPixelCol(), SiPixelCluster::minPixelRow(), PixelCPEGenericBase::ClusterParamGeneric::pixmx, SiPixelGenError::qbin(), PixelCPEBase::ClusterParam::qBin_, PixelCPEGenericBase::ClusterParamGeneric::sigmax, PixelCPEGenericBase::ClusterParamGeneric::sigmay, SiPixelCluster::sizeX(), SiPixelCluster::sizeY(), PixelCPEGenericBase::ClusterParamGeneric::sx1, PixelCPEGenericBase::ClusterParamGeneric::sx2, PixelCPEGenericBase::ClusterParamGeneric::sy1, PixelCPEGenericBase::ClusterParamGeneric::sy2, PixelCPEBase::ClusterParam::theCluster, PixelCPEBase::DetParam::thePitchX, PixelCPEBase::DetParam::thePitchY, PixelCPEBase::DetParam::theRecTopol, PixelCPEBase::DetParam::theThickness, PixelCPEBase::DetParam::theTopol, theVerboseLevel, PixelCPEBase::DetParam::widthLAFractionX, PixelCPEBase::DetParam::widthLAFractionY, PixelCPEBase::ClusterParam::with_track_angle, PV2DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::x(), SiPixelCluster::x(), PV2DBase< T, PVType, FrameType >::y(), PV3DBase< T, PVType, FrameType >::y(), and SiPixelCluster::y().

106  {
107  ClusterParamGeneric& theClusterParam = static_cast<ClusterParamGeneric&>(theClusterParamBase);
108 
109  //cout<<" in PixelCPEGeneric:localPosition - "<<endl; //dk
110 
111  float chargeWidthX = (theDetParam.lorentzShiftInCmX * theDetParam.widthLAFractionX);
112  float chargeWidthY = (theDetParam.lorentzShiftInCmY * theDetParam.widthLAFractionY);
113  float shiftX = 0.5f * theDetParam.lorentzShiftInCmX;
114  float shiftY = 0.5f * theDetParam.lorentzShiftInCmY;
115 
116  //cout<<" main la width "<<chargeWidthX<<" "<<chargeWidthY<<endl;
117 
119  float qclus = theClusterParam.theCluster->charge();
120  float locBz = theDetParam.bz;
121  float locBx = theDetParam.bx;
122  //cout << "PixelCPEGeneric::localPosition(...) : locBz = " << locBz << endl;
123 
124  theClusterParam.pixmx = -999; // max pixel charge for truncation of 2-D cluster
125  theClusterParam.sigmay = -999.9; // CPE Generic y-error for multi-pixel cluster
126  theClusterParam.deltay = -999.9; // CPE Generic y-bias for multi-pixel cluster
127  theClusterParam.sigmax = -999.9; // CPE Generic x-error for multi-pixel cluster
128  theClusterParam.deltax = -999.9; // CPE Generic x-bias for multi-pixel cluster
129  theClusterParam.sy1 = -999.9; // CPE Generic y-error for single single-pixel
130  theClusterParam.dy1 = -999.9; // CPE Generic y-bias for single single-pixel cluster
131  theClusterParam.sy2 = -999.9; // CPE Generic y-error for single double-pixel cluster
132  theClusterParam.dy2 = -999.9; // CPE Generic y-bias for single double-pixel cluster
133  theClusterParam.sx1 = -999.9; // CPE Generic x-error for single single-pixel cluster
134  theClusterParam.dx1 = -999.9; // CPE Generic x-bias for single single-pixel cluster
135  theClusterParam.sx2 = -999.9; // CPE Generic x-error for single double-pixel cluster
136  theClusterParam.dx2 = -999.9; // CPE Generic x-bias for single double-pixel cluster
137 
139  int gtemplID_ = theDetParam.detTemplateId;
140 
141  //int gtemplID0 = genErrorDBObject_->getGenErrorID(theDetParam.theDet->geographicalId().rawId());
142  //if(gtemplID0!=gtemplID_) cout<<" different id "<< gtemplID_<<" "<<gtemplID0<<endl;
143 
144  theClusterParam.qBin_ = gtempl.qbin(gtemplID_,
145  theClusterParam.cotalpha,
146  theClusterParam.cotbeta,
147  locBz,
148  locBx,
149  qclus,
151  theClusterParam.pixmx,
152  theClusterParam.sigmay,
153  theClusterParam.deltay,
154  theClusterParam.sigmax,
155  theClusterParam.deltax,
156  theClusterParam.sy1,
157  theClusterParam.dy1,
158  theClusterParam.sy2,
159  theClusterParam.dy2,
160  theClusterParam.sx1,
161  theClusterParam.dx1,
162  theClusterParam.sx2,
163  theClusterParam.dx2);
164 
165  // now use the charge widths stored in the new generic template headers (change to the
166  // incorrect sign convention of the base class)
167  bool useLAWidthFromGenError = false;
168  if (useLAWidthFromGenError) {
169  chargeWidthX = (-micronsToCm * gtempl.lorxwidth());
170  chargeWidthY = (-micronsToCm * gtempl.lorywidth());
171  LogDebug("PixelCPE localPosition():") << "redefine la width (gen-error)" << chargeWidthX << chargeWidthY;
172  }
173  LogDebug("PixelCPE localPosition():") << "GenError:" << gtemplID_;
174 
175  // These numbers come in microns from the qbin(...) call. Transform them to cm.
176  theClusterParam.deltax = theClusterParam.deltax * micronsToCm;
177  theClusterParam.dx1 = theClusterParam.dx1 * micronsToCm;
178  theClusterParam.dx2 = theClusterParam.dx2 * micronsToCm;
179 
180  theClusterParam.deltay = theClusterParam.deltay * micronsToCm;
181  theClusterParam.dy1 = theClusterParam.dy1 * micronsToCm;
182  theClusterParam.dy2 = theClusterParam.dy2 * micronsToCm;
183 
184  theClusterParam.sigmax = theClusterParam.sigmax * micronsToCm;
185  theClusterParam.sx1 = theClusterParam.sx1 * micronsToCm;
186  theClusterParam.sx2 = theClusterParam.sx2 * micronsToCm;
187 
188  theClusterParam.sigmay = theClusterParam.sigmay * micronsToCm;
189  theClusterParam.sy1 = theClusterParam.sy1 * micronsToCm;
190  theClusterParam.sy2 = theClusterParam.sy2 * micronsToCm;
191 
192  } // if ( useErrorsFromTemplates_ )
193  else {
194  theClusterParam.qBin_ = 0;
195  }
196 
197  int q_f_X;
198  int q_l_X;
199  int q_f_Y;
200  int q_l_Y;
201  collect_edge_charges(theClusterParam, q_f_X, q_l_X, q_f_Y, q_l_Y, useErrorsFromTemplates_ && truncatePixelCharge_);
202 
203  //--- Find the inner widths along X and Y in one shot. We
204  //--- compute the upper right corner of the inner pixels
205  //--- (== lower left corner of upper right pixel) and
206  //--- the lower left corner of the inner pixels
207  //--- (== upper right corner of lower left pixel), and then
208  //--- subtract these two points in the formula.
209 
210  //--- Upper Right corner of Lower Left pixel -- in measurement frame
211  MeasurementPoint meas_URcorn_LLpix(theClusterParam.theCluster->minPixelRow() + 1.0,
212  theClusterParam.theCluster->minPixelCol() + 1.0);
213 
214  //--- Lower Left corner of Upper Right pixel -- in measurement frame
215  MeasurementPoint meas_LLcorn_URpix(theClusterParam.theCluster->maxPixelRow(),
216  theClusterParam.theCluster->maxPixelCol());
217 
218  //--- These two now converted into the local
219  LocalPoint local_URcorn_LLpix;
220  LocalPoint local_LLcorn_URpix;
221 
222  // PixelCPEGeneric can be used with or without track angles
223  // If PixelCPEGeneric is called with track angles, use them to correct for bows/kinks:
224  if (theClusterParam.with_track_angle) {
225  local_URcorn_LLpix = theDetParam.theTopol->localPosition(meas_URcorn_LLpix, theClusterParam.loc_trk_pred);
226  local_LLcorn_URpix = theDetParam.theTopol->localPosition(meas_LLcorn_URpix, theClusterParam.loc_trk_pred);
227  } else {
228  local_URcorn_LLpix = theDetParam.theTopol->localPosition(meas_URcorn_LLpix);
229  local_LLcorn_URpix = theDetParam.theTopol->localPosition(meas_LLcorn_URpix);
230  }
231 
232 #ifdef EDM_ML_DEBUG
233  if (theVerboseLevel > 20) {
234  cout << "\n\t >>> theClusterParam.theCluster->x = " << theClusterParam.theCluster->x()
235  << "\n\t >>> theClusterParam.theCluster->y = " << theClusterParam.theCluster->y()
236  << "\n\t >>> cluster: minRow = " << theClusterParam.theCluster->minPixelRow()
237  << " minCol = " << theClusterParam.theCluster->minPixelCol()
238  << "\n\t >>> cluster: maxRow = " << theClusterParam.theCluster->maxPixelRow()
239  << " maxCol = " << theClusterParam.theCluster->maxPixelCol()
240  << "\n\t >>> meas: inner lower left = " << meas_URcorn_LLpix.x() << "," << meas_URcorn_LLpix.y()
241  << "\n\t >>> meas: inner upper right = " << meas_LLcorn_URpix.x() << "," << meas_LLcorn_URpix.y() << endl;
242  }
243 #endif
244 
245  //--- &&& Note that the cuts below should not be hardcoded (like in Orca and
246  //--- &&& CPEFromDetPosition/PixelCPEInitial), but rather be
247  //--- &&& externally settable (but tracked) parameters.
248 
249  //--- Position, including the half lorentz shift
250 
251 #ifdef EDM_ML_DEBUG
252  if (theVerboseLevel > 20)
253  cout << "\t >>> Generic:: processing X" << endl;
254 #endif
255 
257  theClusterParam.theCluster->sizeX(),
258  q_f_X,
259  q_l_X,
260  local_URcorn_LLpix.x(),
261  local_LLcorn_URpix.x(),
262  chargeWidthX, // lorentz shift in cm
263  theDetParam.theThickness,
264  theClusterParam.cotalpha,
265  theDetParam.thePitchX,
266  theDetParam.theRecTopol->isItBigPixelInX(theClusterParam.theCluster->minPixelRow()),
267  theDetParam.theRecTopol->isItBigPixelInX(theClusterParam.theCluster->maxPixelRow()),
270  the_size_cutX); // cut for eff charge width &&&
271 
272  // apply the lorentz offset correction
273  xPos = xPos + shiftX;
274 
275 #ifdef EDM_ML_DEBUG
276  if (theVerboseLevel > 20)
277  cout << "\t >>> Generic:: processing Y" << endl;
278 #endif
279 
281  theClusterParam.theCluster->sizeY(),
282  q_f_Y,
283  q_l_Y,
284  local_URcorn_LLpix.y(),
285  local_LLcorn_URpix.y(),
286  chargeWidthY, // lorentz shift in cm
287  theDetParam.theThickness,
288  theClusterParam.cotbeta,
289  theDetParam.thePitchY,
290  theDetParam.theRecTopol->isItBigPixelInY(theClusterParam.theCluster->minPixelCol()),
291  theDetParam.theRecTopol->isItBigPixelInY(theClusterParam.theCluster->maxPixelCol()),
294  the_size_cutY); // cut for eff charge width &&&
295 
296  // apply the lorentz offset correction
297  yPos = yPos + shiftY;
298 
299  // Apply irradiation corrections
301  if (theClusterParam.theCluster->sizeX() == 1) { // size=1
302  // ggiurgiu@jhu.edu, 02/03/09 : for size = 1, the Lorentz shift is already accounted by the irradiation correction
303  //float tmp1 = (0.5 * theDetParam.lorentzShiftInCmX);
304  //cout << "Apply correction correction_dx1 = " << theClusterParam.dx1 << " to xPos = " << xPos;
305  xPos = xPos - (0.5f * theDetParam.lorentzShiftInCmX);
306  // Find if pixel is double (big).
307  bool bigInX = theDetParam.theRecTopol->isItBigPixelInX(theClusterParam.theCluster->maxPixelRow());
308  if (!bigInX)
309  xPos -= theClusterParam.dx1;
310  else
311  xPos -= theClusterParam.dx2;
312  //cout<<" to "<<xPos<<" "<<(tmp1+theClusterParam.dx1)<<endl;
313  } else { // size>1
314  //cout << "Apply correction correction_deltax = " << theClusterParam.deltax << " to xPos = " << xPos;
315  xPos -= theClusterParam.deltax;
316  //cout<<" to "<<xPos<<endl;
317  }
318 
319  if (theClusterParam.theCluster->sizeY() == 1) {
320  // ggiurgiu@jhu.edu, 02/03/09 : for size = 1, the Lorentz shift is already accounted by the irradiation correction
321  yPos = yPos - (0.5f * theDetParam.lorentzShiftInCmY);
322 
323  // Find if pixel is double (big).
324  bool bigInY = theDetParam.theRecTopol->isItBigPixelInY(theClusterParam.theCluster->maxPixelCol());
325  if (!bigInY)
326  yPos -= theClusterParam.dy1;
327  else
328  yPos -= theClusterParam.dy2;
329 
330  } else {
331  //cout << "Apply correction correction_deltay = " << theClusterParam.deltay << " to yPos = " << yPos << endl;
332  yPos -= theClusterParam.deltay;
333  }
334 
335  } // if ( IrradiationBiasCorrection_ )
336 
337  //cout<<" in PixelCPEGeneric:localPosition - pos = "<<xPos<<" "<<yPos<<endl; //dk
338 
339  //--- Now put the two together
340  LocalPoint pos_in_local(xPos, yPos);
341  return pos_in_local;
342 }
float the_eff_charge_cut_highY
float generic_position_formula(int size, int q_f, int q_l, float upper_edge_first_pix, float lower_edge_last_pix, float lorentz_shift, float theThickness, float cot_angle, float pitch, bool first_is_big, bool last_is_big, float eff_charge_cut_low, float eff_charge_cut_high, float size_cut)
Definition: SiPixelUtils.cc:16
static void collect_edge_charges(ClusterParam &theClusterParam, int &q_f_X, int &q_l_X, int &q_f_Y, int &q_l_Y, bool truncate)
std::vector< SiPixelGenErrorStore > thePixelGenError_
bool IrradiationBiasCorrection_
constexpr float micronsToCm
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
float the_eff_charge_cut_lowX
float the_eff_charge_cut_lowY
#define LogDebug(id)
float the_eff_charge_cut_highX

Member Data Documentation

◆ DoCosmics_

bool PixelCPEGeneric::DoCosmics_
protected

Definition at line 88 of file PixelCPEGeneric.h.

Referenced by PixelCPEGeneric().

◆ inflate_all_errors_no_trk_angle

bool PixelCPEGeneric::inflate_all_errors_no_trk_angle
protected

Definition at line 86 of file PixelCPEGeneric.h.

Referenced by PixelCPEGeneric().

◆ inflate_errors

bool PixelCPEGeneric::inflate_errors
protected

Definition at line 85 of file PixelCPEGeneric.h.

Referenced by PixelCPEGeneric().

◆ IrradiationBiasCorrection_

bool PixelCPEGeneric::IrradiationBiasCorrection_
protected

Definition at line 89 of file PixelCPEGeneric.h.

Referenced by PixelCPEGeneric().

◆ isPhase2_

bool PixelCPEGeneric::isPhase2_
protected

Definition at line 90 of file PixelCPEGeneric.h.

Referenced by PixelCPEGeneric().

◆ NoTemplateErrorsWhenNoTrkAngles_

bool PixelCPEGeneric::NoTemplateErrorsWhenNoTrkAngles_
protected

Definition at line 91 of file PixelCPEGeneric.h.

Referenced by PixelCPEGeneric().

◆ the_eff_charge_cut_highX

float PixelCPEGeneric::the_eff_charge_cut_highX
protected

Definition at line 80 of file PixelCPEGeneric.h.

Referenced by PixelCPEGeneric().

◆ the_eff_charge_cut_highY

float PixelCPEGeneric::the_eff_charge_cut_highY
protected

Definition at line 81 of file PixelCPEGeneric.h.

Referenced by PixelCPEGeneric().

◆ the_eff_charge_cut_lowX

float PixelCPEGeneric::the_eff_charge_cut_lowX
protected

Definition at line 78 of file PixelCPEGeneric.h.

Referenced by PixelCPEGeneric().

◆ the_eff_charge_cut_lowY

float PixelCPEGeneric::the_eff_charge_cut_lowY
protected

Definition at line 79 of file PixelCPEGeneric.h.

Referenced by PixelCPEGeneric().

◆ the_size_cutX

float PixelCPEGeneric::the_size_cutX
protected

Definition at line 82 of file PixelCPEGeneric.h.

Referenced by PixelCPEGeneric().

◆ the_size_cutY

float PixelCPEGeneric::the_size_cutY
protected

Definition at line 83 of file PixelCPEGeneric.h.

Referenced by PixelCPEGeneric().

◆ thePixelGenError_

std::vector<SiPixelGenErrorStore> PixelCPEGeneric::thePixelGenError_
protected

Definition at line 94 of file PixelCPEGeneric.h.

Referenced by PixelCPEGeneric().