CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes
PixelCPETemplateReco Class Reference

#include <PixelCPETemplateReco.h>

Inheritance diagram for PixelCPETemplateReco:
PixelCPEBase PixelClusterParameterEstimator

Classes

struct  ClusterParamTemplate
 

Public Member Functions

 PixelCPETemplateReco (edm::ParameterSet const &conf, const MagneticField *, const TrackerGeometry &, const TrackerTopology &, const SiPixelLorentzAngle *, const SiPixelTemplateDBObject *)
 
 ~PixelCPETemplateReco () override
 
- 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 PixelCPEBase
static void fillPSetDescription (edm::ParameterSetDescription &desc)
 

Private Member Functions

std::unique_ptr< ClusterParamcreateClusterParam (const SiPixelCluster &cl) const override
 
LocalError localError (DetParam const &theDetParam, ClusterParam &theClusterParam) const override
 
LocalPoint localPosition (DetParam const &theDetParam, ClusterParam &theClusterParam) const override
 

Private Attributes

int barrelTemplateID_
 
int forwardTemplateID_
 
int speed_
 
std::string templateDir_
 
std::vector< SiPixelTemplateStorethePixelTemp_
 
bool UseClusterSplitter_
 

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
 
- 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 inherited from PixelCPEBase
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_
 
- 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 32 of file PixelCPETemplateReco.h.

Constructor & Destructor Documentation

◆ PixelCPETemplateReco()

PixelCPETemplateReco::PixelCPETemplateReco ( edm::ParameterSet const &  conf,
const MagneticField mag,
const TrackerGeometry geom,
const TrackerTopology ttopo,
const SiPixelLorentzAngle lorentzAngle,
const SiPixelTemplateDBObject templateDBobject 
)

Definition at line 43 of file PixelCPETemplateReco.cc.

49  : PixelCPEBase(conf, mag, geom, ttopo, lorentzAngle, nullptr, templateDBobject, nullptr, 1) {
50  //cout << endl;
51  //cout << "Constructing PixelCPETemplateReco::PixelCPETemplateReco(...)................................................." << endl;
52  //cout << endl;
53 
54  // Configurable parameters
55  //DoCosmics_ = conf.getParameter<bool>("DoCosmics"); // Not used in templates
56  //LoadTemplatesFromDB_ = conf.getParameter<bool>("LoadTemplatesFromDB"); // Moved to Base
57 
58  //cout << " PixelCPETemplateReco : (int)LoadTemplatesFromDB_ = " << (int)LoadTemplatesFromDB_ << endl;
59  //cout << "field_magnitude = " << field_magnitude << endl;
60 
61  // configuration parameter to decide between DB or text file template access
62 
64  //cout << "PixelCPETemplateReco: Loading templates from database (DB) --------- " << endl;
65 
66  // Initialize template store to the selected ID [Morris, 6/25/08]
68  throw cms::Exception("PixelCPETemplateReco")
69  << "\nERROR: Templates not filled correctly. Check the sqlite file. Using SiPixelTemplateDBObject version "
70  << (*templateDBobject_).version() << "\n\n";
71  } else {
72  //cout << "PixelCPETemplateReco : Loading templates for barrel and forward from ASCII files ----------" << endl;
73  barrelTemplateID_ = conf.getParameter<int>("barrelTemplateID");
74  forwardTemplateID_ = conf.getParameter<int>("forwardTemplateID");
75  templateDir_ = conf.getParameter<int>("directoryWithTemplates");
76 
78  throw cms::Exception("PixelCPETemplateReco")
79  << "\nERROR: Template ID " << barrelTemplateID_
80  << " not loaded correctly from text file. Reconstruction will fail.\n\n";
81 
83  throw cms::Exception("PixelCPETemplateReco")
84  << "\nERROR: Template ID " << forwardTemplateID_
85  << " not loaded correctly from text file. Reconstruction will fail.\n\n";
86  }
87 
88  speed_ = conf.getParameter<int>("speed");
89  LogDebug("PixelCPETemplateReco::PixelCPETemplateReco:") << "Template speed = " << speed_ << "\n";
90 
91  UseClusterSplitter_ = conf.getParameter<bool>("UseClusterSplitter");
92 }

References barrelTemplateID_, Exception, forwardTemplateID_, edm::ParameterSet::getParameter(), PixelCPEBase::LoadTemplatesFromDB_, LogDebug, SiPixelTemplate::pushfile(), speed_, PixelCPEBase::templateDBobject_, templateDir_, thePixelTemp_, and UseClusterSplitter_.

◆ ~PixelCPETemplateReco()

PixelCPETemplateReco::~PixelCPETemplateReco ( )
override

Definition at line 97 of file PixelCPETemplateReco.cc.

97  {
98  for (auto x : thePixelTemp_)
99  x.destroy();
100 }

References thePixelTemp_, and x.

Member Function Documentation

◆ createClusterParam()

std::unique_ptr< PixelCPEBase::ClusterParam > PixelCPETemplateReco::createClusterParam ( const SiPixelCluster cl) const
overrideprivatevirtual

Implements PixelCPEBase.

Definition at line 102 of file PixelCPETemplateReco.cc.

102  {
103  return std::make_unique<ClusterParamTemplate>(cl);
104 }

References GetRecoTauVFromDQM_MC_cff::cl.

◆ fillPSetDescription()

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

Definition at line 545 of file PixelCPETemplateReco.cc.

545  {
546  desc.add<int>("barrelTemplateID", 0);
547  desc.add<int>("forwardTemplateID", 0);
548  desc.add<int>("directoryWithTemplates", 0);
549  desc.add<int>("speed", -2);
550  desc.add<bool>("UseClusterSplitter", false);
551 }

References submitPVResolutionJobs::desc.

Referenced by PixelCPETemplateRecoESProducer::fillDescriptions().

◆ localError()

LocalError PixelCPETemplateReco::localError ( DetParam const &  theDetParam,
ClusterParam theClusterParam 
) const
overrideprivatevirtual

Implements PixelCPEBase.

Definition at line 425 of file PixelCPETemplateReco.cc.

425  {
426  ClusterParamTemplate& theClusterParam = static_cast<ClusterParamTemplate&>(theClusterParamBase);
427 
428  //cout << endl;
429  //cout << "Set PixelCPETemplate errors .............................................." << endl;
430 
431  //cout << "CPETemplate : " << endl;
432 
433  //--- Default is the maximum error used for edge clusters.
434  //--- (never used, in fact: let comment it out, shut up the complains of the static analyzer, and save a few CPU cycles)
435  // const float sig12 = 1./sqrt(12.0);
436  // float xerr = theDetParam.thePitchX *sig12;
437  // float yerr = theDetParam.thePitchY *sig12;
438  float xerr, yerr;
439 
440  // Check if the errors were already set at the clusters splitting level
441  if (theClusterParam.theCluster->getSplitClusterErrorX() > 0.0f &&
442  theClusterParam.theCluster->getSplitClusterErrorX() < clusterSplitMaxError_ &&
443  theClusterParam.theCluster->getSplitClusterErrorY() > 0.0f &&
444  theClusterParam.theCluster->getSplitClusterErrorY() < clusterSplitMaxError_) {
445  xerr = theClusterParam.theCluster->getSplitClusterErrorX() * micronsToCm;
446  yerr = theClusterParam.theCluster->getSplitClusterErrorY() * micronsToCm;
447 
448  //cout << "Errors set at cluster splitting level : " << endl;
449  //cout << "xerr = " << xerr << endl;
450  //cout << "yerr = " << yerr << endl;
451  } else {
452  // If errors are not split at the cluster splitting level, set the errors here
453 
454  //cout << "Errors are not split at the cluster splitting level, set the errors here : " << endl;
455 
456  int maxPixelCol = theClusterParam.theCluster->maxPixelCol();
457  int maxPixelRow = theClusterParam.theCluster->maxPixelRow();
458  int minPixelCol = theClusterParam.theCluster->minPixelCol();
459  int minPixelRow = theClusterParam.theCluster->minPixelRow();
460 
461  //--- Are we near either of the edges?
462  bool edgex = (theDetParam.theRecTopol->isItEdgePixelInX(minPixelRow) ||
463  theDetParam.theRecTopol->isItEdgePixelInX(maxPixelRow));
464  bool edgey = (theDetParam.theRecTopol->isItEdgePixelInY(minPixelCol) ||
465  theDetParam.theRecTopol->isItEdgePixelInY(maxPixelCol));
466 
467  if (theClusterParam.ierr != 0) {
468  // If reconstruction fails the hit position is calculated from cluster center of gravity
469  // corrected in x by average Lorentz drift. Assign huge errors.
470  //xerr = 10.0 * (float)theClusterParam.theCluster->sizeX() * xerr;
471  //yerr = 10.0 * (float)theClusterParam.theCluster->sizeX() * yerr;
472 
473  if (!GeomDetEnumerators::isTrackerPixel(theDetParam.thePart))
474  throw cms::Exception("PixelCPETemplateReco::localPosition :") << "A non-pixel detector type in here?";
475 
476  // Assign better errors based on the residuals for failed template cases
477  if (GeomDetEnumerators::isBarrel(theDetParam.thePart)) {
478  xerr = 55.0f * micronsToCm;
479  yerr = 36.0f * micronsToCm;
480  } else {
481  xerr = 42.0f * micronsToCm;
482  yerr = 39.0f * micronsToCm;
483  }
484 
485  //cout << "xerr = " << xerr << endl;
486  //cout << "yerr = " << yerr << endl;
487 
488  //return LocalError(xerr*xerr, 0, yerr*yerr);
489  } else if (edgex || edgey) {
490  // for edge pixels assign errors according to observed residual RMS
491  if (edgex && !edgey) {
492  xerr = xEdgeXError_ * micronsToCm;
493  yerr = xEdgeYError_ * micronsToCm;
494  } else if (!edgex && edgey) {
495  xerr = yEdgeXError_ * micronsToCm;
496  yerr = yEdgeYError_ * micronsToCm;
497  } else if (edgex && edgey) {
498  xerr = bothEdgeXError_ * micronsToCm;
499  yerr = bothEdgeYError_ * micronsToCm;
500  } else {
501  throw cms::Exception(" PixelCPETemplateReco::localError: Something wrong with pixel edge flag !!!");
502  }
503 
504  //cout << "xerr = " << xerr << endl;
505  //cout << "yerr = " << yerr << endl;
506  } else {
507  // &&& need a class const
508  //const float micronsToCm = 1.0e-4;
509 
510  xerr = theClusterParam.templSigmaX_ * micronsToCm;
511  yerr = theClusterParam.templSigmaY_ * micronsToCm;
512 
513  //cout << "xerr = " << xerr << endl;
514  //cout << "yerr = " << yerr << endl;
515 
516  // &&& should also check ierr (saved as class variable) and return
517  // &&& nonsense (another class static) if the template fit failed.
518  }
519 
520  if (theVerboseLevel > 9) {
521  LogDebug("PixelCPETemplateReco") << " Sizex = " << theClusterParam.theCluster->sizeX()
522  << " Sizey = " << theClusterParam.theCluster->sizeY() << " Edgex = " << edgex
523  << " Edgey = " << edgey << " ErrX = " << xerr << " ErrY = " << yerr;
524  }
525 
526  } // else
527 
528  if (!(xerr > 0.0f))
529  throw cms::Exception("PixelCPETemplateReco::localError")
530  << "\nERROR: Negative pixel error xerr = " << xerr << "\n\n";
531 
532  if (!(yerr > 0.0f))
533  throw cms::Exception("PixelCPETemplateReco::localError")
534  << "\nERROR: Negative pixel error yerr = " << yerr << "\n\n";
535 
536  //cout << "Final errors set to: " << endl;
537  //cout << "xerr = " << xerr << endl;
538  //cout << "yerr = " << yerr << endl;
539  //cout << "Out of PixelCPETemplateREco..........................................................................." << endl;
540  //cout << endl;
541 
542  return LocalError(xerr * xerr, 0, yerr * yerr);
543 }

References PixelCPEBase::bothEdgeXError_, PixelCPEBase::bothEdgeYError_, PixelCPEBase::clusterSplitMaxError_, Exception, f, PixelCPETemplateReco::ClusterParamTemplate::ierr, GeomDetEnumerators::isBarrel(), RectangularPixelTopology::isItEdgePixelInX(), RectangularPixelTopology::isItEdgePixelInY(), GeomDetEnumerators::isTrackerPixel(), LogDebug, PixelCPETemplateReco::ClusterParamTemplate::templSigmaX_, PixelCPETemplateReco::ClusterParamTemplate::templSigmaY_, PixelCPEBase::DetParam::thePart, PixelCPEBase::DetParam::theRecTopol, PixelCPEBase::theVerboseLevel, PixelCPEBase::xEdgeXError_, PixelCPEBase::xEdgeYError_, PixelCPEBase::yEdgeXError_, and PixelCPEBase::yEdgeYError_.

◆ localPosition()

LocalPoint PixelCPETemplateReco::localPosition ( DetParam const &  theDetParam,
ClusterParam theClusterParam 
) const
overrideprivatevirtual

std::vector< SiPixelTemplateStore2D > thePixelTemp2D_; SiPixelTemplate2D::pushfile(ID, thePixelTemp2D_); SiPixelTemplate2D templ2D_(thePixelTemp2D_);

Implements PixelCPEBase.

Definition at line 113 of file PixelCPETemplateReco.cc.

113  {
114  ClusterParamTemplate& theClusterParam = static_cast<ClusterParamTemplate&>(theClusterParamBase);
115 
116  if (!GeomDetEnumerators::isTrackerPixel(theDetParam.thePart))
117  throw cms::Exception("PixelCPETemplateReco::localPosition :") << "A non-pixel detector type in here?";
118  // barrel(false) or forward(true)
119  const bool fpix = GeomDetEnumerators::isEndcap(theDetParam.thePart);
120 
121  int ID = -9999;
122  if (LoadTemplatesFromDB_) {
123  int ID0 = templateDBobject_->getTemplateID(theDetParam.theDet->geographicalId()); // just to comapre
124  ID = theDetParam.detTemplateId;
125  if (ID0 != ID)
126  edm::LogError("PixelCPETemplateReco") << " different id" << ID << " " << ID0 << endl;
127  } else { // from asci file
128  if (!fpix)
129  ID = barrelTemplateID_; // barrel
130  else
131  ID = forwardTemplateID_; // forward
132  }
133  //cout << "PixelCPETemplateReco : ID = " << ID << endl;
134 
136 
137  // Preparing to retrieve ADC counts from the SiPixeltheClusterParam.theCluster-> In the cluster,
138  // we have the following:
139  // int minPixelRow(); // Minimum pixel index in the x direction (low edge).
140  // int maxPixelRow(); // Maximum pixel index in the x direction (top edge).
141  // int minPixelCol(); // Minimum pixel index in the y direction (left edge).
142  // int maxPixelCol(); // Maximum pixel index in the y direction (right edge).
143  // So the pixels from minPixelRow() will go into clust_array_2d[0][*],
144  // and the pixels from minPixelCol() will go into clust_array_2d[*][0].
145 
146  int row_offset = theClusterParam.theCluster->minPixelRow();
147  int col_offset = theClusterParam.theCluster->minPixelCol();
148 
149  // Store the coordinates of the center of the (0,0) pixel of the array that
150  // gets passed to PixelTempReco1D
151  // Will add these values to the output of PixelTempReco1D
152  float tmp_x = float(row_offset) + 0.5f;
153  float tmp_y = float(col_offset) + 0.5f;
154 
155  // Store these offsets (to be added later) in a LocalPoint after tranforming
156  // them from measurement units (pixel units) to local coordinates (cm)
157 
158  // ggiurgiu@jhu.edu 12/09/2010 : update call with trk angles needed for bow/kink corrections
159  LocalPoint lp;
160 
161  if (theClusterParam.with_track_angle)
162  lp = theDetParam.theTopol->localPosition(MeasurementPoint(tmp_x, tmp_y), theClusterParam.loc_trk_pred);
163  else {
164  edm::LogError("PixelCPETemplateReco") << "@SUB = PixelCPETemplateReco::localPosition"
165  << "Should never be here. PixelCPETemplateReco should always be called with "
166  "track angles. This is a bad error !!! ";
167 
168  lp = theDetParam.theTopol->localPosition(MeasurementPoint(tmp_x, tmp_y));
169  }
170 
171  // first compute matrix size
172  int mrow = 0, mcol = 0;
173  for (int i = 0; i != theClusterParam.theCluster->size(); ++i) {
174  auto pix = theClusterParam.theCluster->pixel(i);
175  int irow = int(pix.x);
176  int icol = int(pix.y);
177  mrow = std::max(mrow, irow);
178  mcol = std::max(mcol, icol);
179  }
180  mrow -= row_offset;
181  mrow += 1;
182  mrow = std::min(mrow, cluster_matrix_size_x);
183  mcol -= col_offset;
184  mcol += 1;
185  mcol = std::min(mcol, cluster_matrix_size_y);
186  assert(mrow > 0);
187  assert(mcol > 0);
188 
189  float clustMatrix[mrow][mcol];
190  memset(clustMatrix, 0, sizeof(float) * mrow * mcol);
191 
192  // Copy clust's pixels (calibrated in electrons) into clusMatrix;
193  for (int i = 0; i != theClusterParam.theCluster->size(); ++i) {
194  auto pix = theClusterParam.theCluster->pixel(i);
195  int irow = int(pix.x) - row_offset;
196  int icol = int(pix.y) - col_offset;
197 
198  // Gavril : what do we do here if the row/column is larger than cluster_matrix_size_x/cluster_matrix_size_y ?
199  // Ignore them for the moment...
200  if ((irow < mrow) & (icol < mcol))
201  clustMatrix[irow][icol] = float(pix.adc);
202  }
203 
204  // Make and fill the bool arrays flagging double pixels
205  bool xdouble[mrow], ydouble[mcol];
206  // x directions (shorter), rows
207  for (int irow = 0; irow < mrow; ++irow)
208  xdouble[irow] = theDetParam.theRecTopol->isItBigPixelInX(irow + row_offset);
209 
210  // y directions (longer), columns
211  for (int icol = 0; icol < mcol; ++icol)
212  ydouble[icol] = theDetParam.theRecTopol->isItBigPixelInY(icol + col_offset);
213 
214  SiPixelTemplateReco::ClusMatrix clusterPayload{&clustMatrix[0][0], xdouble, ydouble, mrow, mcol};
215 
216  // Output:
217  float nonsense = -99999.9f; // nonsense init value
218  theClusterParam.templXrec_ = theClusterParam.templYrec_ = theClusterParam.templSigmaX_ =
219  theClusterParam.templSigmaY_ = nonsense;
220  // If the template recontruction fails, we want to return 1.0 for now
221  theClusterParam.templProbY_ = theClusterParam.templProbX_ = theClusterParam.templProbQ_ = 1.0f;
222  theClusterParam.templQbin_ = 0;
223  // We have a boolean denoting whether the reco failed or not
224  theClusterParam.hasFilledProb_ = false;
225 
226  float templYrec1_ = nonsense;
227  float templXrec1_ = nonsense;
228  float templYrec2_ = nonsense;
229  float templXrec2_ = nonsense;
230 
231  // ******************************************************************
232  // Do it! Use cotalpha_ and cotbeta_ calculated in PixelCPEBase
233 
234  float locBz = theDetParam.bz;
235  float locBx = theDetParam.bx;
236 
237  theClusterParam.ierr = PixelTempReco1D(ID,
238  theClusterParam.cotalpha,
239  theClusterParam.cotbeta,
240  locBz,
241  locBx,
242  clusterPayload,
243  templ,
244  theClusterParam.templYrec_,
245  theClusterParam.templSigmaY_,
246  theClusterParam.templProbY_,
247  theClusterParam.templXrec_,
248  theClusterParam.templSigmaX_,
249  theClusterParam.templProbX_,
250  theClusterParam.templQbin_,
251  speed_,
252  theClusterParam.templProbQ_);
253 
254  // ******************************************************************
255 
256  // Check exit status
257  if UNLIKELY (theClusterParam.ierr != 0) {
258  LogDebug("PixelCPETemplateReco::localPosition")
259  << "reconstruction failed with error " << theClusterParam.ierr << "\n";
260 
261  // Gavril: what do we do in this case ? For now, just return the cluster center of gravity in microns
262  // In the x case, apply a rough Lorentz drift average correction
263  // To do: call PixelCPEGeneric whenever PixelTempReco1D fails
264  float lorentz_drift = -999.9;
265  if (!fpix)
266  lorentz_drift = 60.0f; // in microns
267  else
268  lorentz_drift = 10.0f; // in microns
269  // ggiurgiu@jhu.edu, 21/09/2010 : trk angles needed to correct for bows/kinks
270  if (theClusterParam.with_track_angle) {
271  theClusterParam.templXrec_ =
272  theDetParam.theTopol->localX(theClusterParam.theCluster->x(), theClusterParam.loc_trk_pred) -
273  lorentz_drift * micronsToCm; // rough Lorentz drift correction
274  theClusterParam.templYrec_ =
275  theDetParam.theTopol->localY(theClusterParam.theCluster->y(), theClusterParam.loc_trk_pred);
276  } else {
277  edm::LogError("PixelCPETemplateReco") << "@SUB = PixelCPETemplateReco::localPosition"
278  << "Should never be here. PixelCPETemplateReco should always be called "
279  "with track angles. This is a bad error !!! ";
280 
281  theClusterParam.templXrec_ = theDetParam.theTopol->localX(theClusterParam.theCluster->x()) -
282  lorentz_drift * micronsToCm; // rough Lorentz drift correction
283  theClusterParam.templYrec_ = theDetParam.theTopol->localY(theClusterParam.theCluster->y());
284  }
285  } else if UNLIKELY (UseClusterSplitter_ && theClusterParam.templQbin_ == 0) {
286  edm::LogError("PixelCPETemplateReco") << " PixelCPETemplateReco: Qbin = 0 but using cluster splitter, we should "
287  "never be here !!!!!!!!!!!!!!!!!!!!!! \n"
288  << "(int)UseClusterSplitter_ = " << (int)UseClusterSplitter_ << endl;
289 
290  //ierr =
291  //PixelTempSplit( ID, fpix, cotalpha_, cotbeta_,
292  // clust_array_2d, ydouble, xdouble,
293  // templ,
294  // templYrec1_, templYrec2_, templSigmaY_, templProbY_,
295  // templXrec1_, templXrec2_, templSigmaX_, templProbX_,
296  // templQbin_ );
297 
298  // Commented for now (3/10/17) until we figure out how to resuscitate 2D template splitter
302 
303  theClusterParam.ierr = -123;
304  /*
305  float dchisq;
306  float templProbQ_;
307  SiPixelTemplateSplit::PixelTempSplit( ID, theClusterParam.cotalpha, theClusterParam.cotbeta,
308  clust_array_2d,
309  ydouble, xdouble,
310  templ,
311  templYrec1_, templYrec2_, theClusterParam.templSigmaY_, theClusterParam.templProbY_,
312  templXrec1_, templXrec2_, theClusterParam.templSigmaX_, theClusterParam.templProbX_,
313  theClusterParam.templQbin_,
314  templProbQ_,
315  true,
316  dchisq,
317  templ2D_ );
318 
319  */
320  if (theClusterParam.ierr != 0) {
321  LogDebug("PixelCPETemplateReco::localPosition")
322  << "reconstruction failed with error " << theClusterParam.ierr << "\n";
323 
324  // Gavril: what do we do in this case ? For now, just return the cluster center of gravity in microns
325  // In the x case, apply a rough Lorentz drift average correction
326  // To do: call PixelCPEGeneric whenever PixelTempReco1D fails
327  float lorentz_drift = -999.9f;
328  if (!fpix)
329  lorentz_drift = 60.0f; // in microns
330  else
331  lorentz_drift = 10.0f; // in microns
332 
333  // ggiurgiu@jhu.edu, 12/09/2010 : trk angles needed to correct for bows/kinks
334  if (theClusterParam.with_track_angle) {
335  theClusterParam.templXrec_ =
336  theDetParam.theTopol->localX(theClusterParam.theCluster->x(), theClusterParam.loc_trk_pred) -
337  lorentz_drift * micronsToCm; // rough Lorentz drift correction
338  theClusterParam.templYrec_ =
339  theDetParam.theTopol->localY(theClusterParam.theCluster->y(), theClusterParam.loc_trk_pred);
340  } else {
341  edm::LogError("PixelCPETemplateReco") << "@SUB = PixelCPETemplateReco::localPosition"
342  << "Should never be here. PixelCPETemplateReco should always be called "
343  "with track angles. This is a bad error !!! ";
344 
345  theClusterParam.templXrec_ = theDetParam.theTopol->localX(theClusterParam.theCluster->x()) -
346  lorentz_drift * micronsToCm; // very rough Lorentz drift correction
347  theClusterParam.templYrec_ = theDetParam.theTopol->localY(theClusterParam.theCluster->y());
348  }
349  } else {
350  // go from micrometer to centimeter
351  templXrec1_ *= micronsToCm;
352  templYrec1_ *= micronsToCm;
353  templXrec2_ *= micronsToCm;
354  templYrec2_ *= micronsToCm;
355 
356  // go back to the module coordinate system
357  templXrec1_ += lp.x();
358  templYrec1_ += lp.y();
359  templXrec2_ += lp.x();
360  templYrec2_ += lp.y();
361 
362  // calculate distance from each hit to the track and choose the hit closest to the track
363  float distX1 = std::abs(templXrec1_ - theClusterParam.trk_lp_x);
364  float distX2 = std::abs(templXrec2_ - theClusterParam.trk_lp_x);
365  float distY1 = std::abs(templYrec1_ - theClusterParam.trk_lp_y);
366  float distY2 = std::abs(templYrec2_ - theClusterParam.trk_lp_y);
367  theClusterParam.templXrec_ = (distX1 < distX2 ? templXrec1_ : templXrec2_);
368  theClusterParam.templYrec_ = (distY1 < distY2 ? templYrec1_ : templYrec2_);
369  }
370  } // else if ( UseClusterSplitter_ && templQbin_ == 0 )
371 
372  else // apparenly this is the good one!
373  {
374  // go from micrometer to centimeter
375  theClusterParam.templXrec_ *= micronsToCm;
376  theClusterParam.templYrec_ *= micronsToCm;
377 
378  // go back to the module coordinate system
379  theClusterParam.templXrec_ += lp.x();
380  theClusterParam.templYrec_ += lp.y();
381 
382  // Compute the Alignment Group Corrections [template ID should already be selected from call to reco procedure]
383  if (DoLorentz_) {
384  // Do only if the lotentzshift has meaningfull numbers
385  if (theDetParam.lorentzShiftInCmX != 0.0 || theDetParam.lorentzShiftInCmY != 0.0) {
386  // the LA width/shift returned by templates use (+)
387  // the LA width/shift produced by PixelCPEBase for positive LA is (-)
388  // correct this by iserting (-)
389  //float temp1 = -micronsToCm*templ.lorxwidth(); // old
390  //float temp2 = -micronsToCm*templ.lorywidth(); // does not incl 1/2
391  float templateLorbiasCmX = -micronsToCm * templ.lorxbias(); // new
392  float templateLorbiasCmY = -micronsToCm * templ.lorybias(); //incl. 1/2
393  // now, correctly, we can use the difference of shifts
394  //theClusterParam.templXrec_ += 0.5*(theDetParam.lorentzShiftInCmX - templateLorbiasCmX);
395  //theClusterParam.templYrec_ += 0.5*(theDetParam.lorentzShiftInCmY - templateLorbiasCmY);
396  theClusterParam.templXrec_ += (0.5 * (theDetParam.lorentzShiftInCmX) - templateLorbiasCmX);
397  theClusterParam.templYrec_ += (0.5 * (theDetParam.lorentzShiftInCmY) - templateLorbiasCmY);
398  //cout << "Templates: la lorentz offset = "
399  // <<(0.5*(theDetParam.lorentzShiftInCmX)-templateLorbiasCmX)
400  // <<" "<<templateLorbiasCmX<<" "<<templateLorbiasCmY
401  // <<" "<<temp1<<" "<<temp2
402  // <<" "<<theDetParam.lorentzShiftInCmX
403  // <<" "<<theDetParam.lorentzShiftInCmY
404  // << endl; //dk
405  } //else {cout<<" LA is 0, disable offset corrections "<<endl;} //dk
406  } //else {cout<<" Do not do LA offset correction "<<endl;} //dk
407  }
408 
409  // Save probabilities and qBin in the quantities given to us by the base class
410  // (for which there are also inline getters). &&& templProbX_ etc. should be retired...
411  theClusterParam.probabilityX_ = theClusterParam.templProbX_;
412  theClusterParam.probabilityY_ = theClusterParam.templProbY_;
413  theClusterParam.probabilityQ_ = theClusterParam.templProbQ_;
414  theClusterParam.qBin_ = theClusterParam.templQbin_;
415 
416  if (theClusterParam.ierr == 0) // always true here
417  theClusterParam.hasFilledProb_ = true;
418 
419  return LocalPoint(theClusterParam.templXrec_, theClusterParam.templYrec_);
420 }

References funct::abs(), cms::cuda::assert(), barrelTemplateID_, PixelCPEBase::DetParam::bx, PixelCPEBase::DetParam::bz, PixelCPEBase::DetParam::detTemplateId, PixelCPEBase::DoLorentz_, Exception, dqmMemoryStats::float, forwardTemplateID_, GeomDet::geographicalId(), SiPixelTemplateDBObject::getTemplateID(), mps_fire::i, PixelCPETemplateReco::ClusterParamTemplate::ierr, createfilelist::int, GeomDetEnumerators::isEndcap(), RectangularPixelTopology::isItBigPixelInX(), RectangularPixelTopology::isItBigPixelInY(), GeomDetEnumerators::isTrackerPixel(), PixelCPEBase::LoadTemplatesFromDB_, Topology::localPosition(), PixelTopology::localX(), PixelTopology::localY(), LogDebug, PixelCPEBase::DetParam::lorentzShiftInCmX, PixelCPEBase::DetParam::lorentzShiftInCmY, SiPixelTemplate::lorxbias(), SiPixelTemplate::lorybias(), SiStripPI::max, min(), SiPixelTemplateReco::PixelTempReco1D(), speed_, PixelCPEBase::templateDBobject_, PixelCPETemplateReco::ClusterParamTemplate::templProbQ_, PixelCPETemplateReco::ClusterParamTemplate::templProbX_, PixelCPETemplateReco::ClusterParamTemplate::templProbY_, PixelCPETemplateReco::ClusterParamTemplate::templQbin_, PixelCPETemplateReco::ClusterParamTemplate::templSigmaX_, PixelCPETemplateReco::ClusterParamTemplate::templSigmaY_, PixelCPETemplateReco::ClusterParamTemplate::templXrec_, PixelCPETemplateReco::ClusterParamTemplate::templYrec_, PixelCPEBase::DetParam::theDet, PixelCPEBase::DetParam::thePart, thePixelTemp_, PixelCPEBase::DetParam::theRecTopol, PixelCPEBase::DetParam::theTopol, UNLIKELY, UseClusterSplitter_, PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::y().

Member Data Documentation

◆ barrelTemplateID_

int PixelCPETemplateReco::barrelTemplateID_
private

Definition at line 84 of file PixelCPETemplateReco.h.

Referenced by localPosition(), and PixelCPETemplateReco().

◆ forwardTemplateID_

int PixelCPETemplateReco::forwardTemplateID_
private

Definition at line 85 of file PixelCPETemplateReco.h.

Referenced by localPosition(), and PixelCPETemplateReco().

◆ speed_

int PixelCPETemplateReco::speed_
private

Definition at line 79 of file PixelCPETemplateReco.h.

Referenced by localPosition(), and PixelCPETemplateReco().

◆ templateDir_

std::string PixelCPETemplateReco::templateDir_
private

Definition at line 86 of file PixelCPETemplateReco.h.

Referenced by PixelCPETemplateReco().

◆ thePixelTemp_

std::vector<SiPixelTemplateStore> PixelCPETemplateReco::thePixelTemp_
private

◆ UseClusterSplitter_

bool PixelCPETemplateReco::UseClusterSplitter_
private

Definition at line 81 of file PixelCPETemplateReco.h.

Referenced by localPosition(), and PixelCPETemplateReco().

PixelCPEBase::bothEdgeYError_
static constexpr float bothEdgeYError_
Definition: PixelCPEBase.h:263
PixelCPEBase::templateDBobject_
const SiPixelTemplateDBObject * templateDBobject_
Definition: PixelCPEBase.h:248
mps_fire.i
i
Definition: mps_fire.py:428
SiPixelTemplate::pushfile
static bool pushfile(int filenum, std::vector< SiPixelTemplateStore > &pixelTemp, std::string dir="CalibTracker/SiPixelESProducers/data/")
Definition: SiPixelTemplate.cc:129
dqmMemoryStats.float
float
Definition: dqmMemoryStats.py:127
PixelCPETemplateReco::thePixelTemp_
std::vector< SiPixelTemplateStore > thePixelTemp_
Definition: PixelCPETemplateReco.h:77
f
double f[11][100]
Definition: MuScleFitUtils.cc:78
PV3DBase::x
T x() const
Definition: PV3DBase.h:59
min
T min(T a, T b)
Definition: MathUtil.h:58
SiPixelTemplate
Definition: SiPixelTemplate.h:255
cms::cuda::assert
assert(be >=bs)
SiPixelTemplateReco::PixelTempReco1D
int PixelTempReco1D(int id, float cotalpha, float cotbeta, float locBz, float locBx, ClusMatrix &cluster, SiPixelTemplate &templ, float &yrec, float &sigmay, float &proby, float &xrec, float &sigmax, float &probx, int &qbin, int speed, bool deadpix, std::vector< std::pair< int, int > > &zeropix, float &probQ, int &nypix, int &nxpix)
Definition: SiPixelTemplateReco.cc:134
DDAxes::x
align::LocalPoint
Point3DBase< Scalar, LocalTag > LocalPoint
Definition: Definitions.h:30
PixelCPETemplateReco::barrelTemplateID_
int barrelTemplateID_
Definition: PixelCPETemplateReco.h:84
PixelCPEBase::bothEdgeXError_
static constexpr float bothEdgeXError_
Definition: PixelCPEBase.h:262
PixelCPETemplateReco::speed_
int speed_
Definition: PixelCPETemplateReco.h:79
GetRecoTauVFromDQM_MC_cff.cl
cl
Definition: GetRecoTauVFromDQM_MC_cff.py:38
UNLIKELY
#define UNLIKELY(x)
Definition: Likely.h:21
PixelCPETemplateReco::templateDir_
std::string templateDir_
Definition: PixelCPETemplateReco.h:86
relativeConstraints.geom
geom
Definition: relativeConstraints.py:72
PixelCPEBase::xEdgeXError_
static constexpr float xEdgeXError_
Definition: PixelCPEBase.h:256
Point3DBase< float, LocalTag >
PixelCPETemplateReco::forwardTemplateID_
int forwardTemplateID_
Definition: PixelCPETemplateReco.h:85
MeasurementPoint
Measurement2DPoint MeasurementPoint
Measurement points are two-dimensional by default.
Definition: MeasurementPoint.h:12
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:223
align::ID
uint32_t ID
Definition: Definitions.h:24
SiStripPI::max
Definition: SiStripPayloadInspectorHelper.h:169
LocalError
Definition: LocalError.h:12
PV3DBase::y
T y() const
Definition: PV3DBase.h:60
createfilelist.int
int
Definition: createfilelist.py:10
GeomDetEnumerators::isTrackerPixel
bool isTrackerPixel(GeomDetEnumerators::SubDetector m)
Definition: GeomDetEnumerators.cc:68
PixelCPEBase::theVerboseLevel
int theVerboseLevel
Definition: PixelCPEBase.h:235
GeomDetEnumerators::isBarrel
bool isBarrel(GeomDetEnumerators::SubDetector m)
Definition: GeomDetEnumerators.cc:57
PixelCPEBase::DoLorentz_
bool DoLorentz_
Definition: PixelCPEBase.h:251
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: PixelCPEBase.cc:30
edm::LogError
Log< level::Error, false > LogError
Definition: MessageLogger.h:123
PixelCPEBase::LoadTemplatesFromDB_
bool LoadTemplatesFromDB_
Definition: PixelCPEBase.h:252
SiPixelTemplateDBObject::getTemplateID
short getTemplateID(const uint32_t &detid) const
Definition: SiPixelTemplateDBObject.h:131
mag
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
Definition: Basic3DVectorLD.h:127
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
Exception
Definition: hltDiff.cc:246
PixelCPEBase::yEdgeYError_
static constexpr float yEdgeYError_
Definition: PixelCPEBase.h:260
SiPixelTemplateReco::ClusMatrix
Definition: SiPixelTemplateReco.h:73
PixelCPETemplateReco::UseClusterSplitter_
bool UseClusterSplitter_
Definition: PixelCPETemplateReco.h:81
PixelCPEBase::clusterSplitMaxError_
static constexpr float clusterSplitMaxError_
Definition: PixelCPEBase.h:265
cms::Exception
Definition: Exception.h:70
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
PixelCPEBase::xEdgeYError_
static constexpr float xEdgeYError_
Definition: PixelCPEBase.h:257
GeomDetEnumerators::isEndcap
bool isEndcap(GeomDetEnumerators::SubDetector m)
Definition: GeomDetEnumerators.cc:62
PixelCPEBase::yEdgeXError_
static constexpr float yEdgeXError_
Definition: PixelCPEBase.h:259