CMS 3D CMS Logo

PixelCPETemplateReco.cc
Go to the documentation of this file.
1 // Include our own header first
3 
4 // Geometry services
7 
8 //#define DEBUG
9 
10 // MessageLogger
12 
13 // Magnetic field
15 
16 // The template header files
18 
19 // Commented for now (3/10/17) until we figure out how to resuscitate 2D template splitter
21 
23 
24 #include <vector>
25 #include "boost/multi_array.hpp"
26 
27 #include <iostream>
28 
29 using namespace SiPixelTemplateReco;
30 //using namespace SiPixelTemplateSplit;
31 using namespace std;
32 
33 namespace {
34  constexpr float micronsToCm = 1.0e-4;
35  constexpr int cluster_matrix_size_x = 13;
36  constexpr int cluster_matrix_size_y = 21;
37 } // namespace
38 
39 //-----------------------------------------------------------------------------
40 // Constructor.
41 //
42 //-----------------------------------------------------------------------------
44  const MagneticField* mag,
45  const TrackerGeometry& geom,
46  const TrackerTopology& ttopo,
47  const SiPixelLorentzAngle* lorentzAngle,
48  const SiPixelTemplateDBObject* templateDBobject)
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 }
93 
94 //-----------------------------------------------------------------------------
95 // Clean up.
96 //-----------------------------------------------------------------------------
98 
99 std::unique_ptr<PixelCPEBase::ClusterParam> PixelCPETemplateReco::createClusterParam(const SiPixelCluster& cl) const {
100  return std::make_unique<ClusterParamTemplate>(cl);
101 }
102 
103 //------------------------------------------------------------------
104 // Public methods mandated by the base class.
105 //------------------------------------------------------------------
106 
107 //------------------------------------------------------------------
108 // The main call to the template code.
109 //------------------------------------------------------------------
110 LocalPoint PixelCPETemplateReco::localPosition(DetParam const& theDetParam, ClusterParam& theClusterParamBase) const {
111  ClusterParamTemplate& theClusterParam = static_cast<ClusterParamTemplate&>(theClusterParamBase);
112 
114  throw cms::Exception("PixelCPETemplateReco::localPosition :") << "A non-pixel detector type in here?";
115  // barrel(false) or forward(true)
116  const bool fpix = GeomDetEnumerators::isEndcap(theDetParam.thePart);
117 
118  int ID = -9999;
119  if (LoadTemplatesFromDB_) {
120  int ID0 = templateDBobject_->getTemplateID(theDetParam.theDet->geographicalId()); // just to comapre
121  ID = theDetParam.detTemplateId;
122  if (ID0 != ID)
123  edm::LogError("PixelCPETemplateReco") << " different id" << ID << " " << ID0 << endl;
124  } else { // from asci file
125  if (!fpix)
126  ID = barrelTemplateID_; // barrel
127  else
128  ID = forwardTemplateID_; // forward
129  }
130  //cout << "PixelCPETemplateReco : ID = " << ID << endl;
131 
133 
134  // Preparing to retrieve ADC counts from the SiPixeltheClusterParam.theCluster-> In the cluster,
135  // we have the following:
136  // int minPixelRow(); // Minimum pixel index in the x direction (low edge).
137  // int maxPixelRow(); // Maximum pixel index in the x direction (top edge).
138  // int minPixelCol(); // Minimum pixel index in the y direction (left edge).
139  // int maxPixelCol(); // Maximum pixel index in the y direction (right edge).
140  // So the pixels from minPixelRow() will go into clust_array_2d[0][*],
141  // and the pixels from minPixelCol() will go into clust_array_2d[*][0].
142 
143  int row_offset = theClusterParam.theCluster->minPixelRow();
144  int col_offset = theClusterParam.theCluster->minPixelCol();
145 
146  // Store the coordinates of the center of the (0,0) pixel of the array that
147  // gets passed to PixelTempReco1D
148  // Will add these values to the output of PixelTempReco1D
149  float tmp_x = float(row_offset) + 0.5f;
150  float tmp_y = float(col_offset) + 0.5f;
151 
152  // Store these offsets (to be added later) in a LocalPoint after tranforming
153  // them from measurement units (pixel units) to local coordinates (cm)
154 
155  // ggiurgiu@jhu.edu 12/09/2010 : update call with trk angles needed for bow/kink corrections
156  LocalPoint lp;
157 
158  if (theClusterParam.with_track_angle)
159  lp = theDetParam.theTopol->localPosition(MeasurementPoint(tmp_x, tmp_y), theClusterParam.loc_trk_pred);
160  else {
161  edm::LogError("PixelCPETemplateReco") << "@SUB = PixelCPETemplateReco::localPosition"
162  << "Should never be here. PixelCPETemplateReco should always be called with "
163  "track angles. This is a bad error !!! ";
164 
165  lp = theDetParam.theTopol->localPosition(MeasurementPoint(tmp_x, tmp_y));
166  }
167 
168  // first compute matrix size
169  int mrow = 0, mcol = 0;
170  for (int i = 0; i != theClusterParam.theCluster->size(); ++i) {
171  auto pix = theClusterParam.theCluster->pixel(i);
172  int irow = int(pix.x);
173  int icol = int(pix.y);
174  mrow = std::max(mrow, irow);
175  mcol = std::max(mcol, icol);
176  }
177  mrow -= row_offset;
178  mrow += 1;
179  mrow = std::min(mrow, cluster_matrix_size_x);
180  mcol -= col_offset;
181  mcol += 1;
182  mcol = std::min(mcol, cluster_matrix_size_y);
183  assert(mrow > 0);
184  assert(mcol > 0);
185 
186  float clustMatrix[mrow][mcol];
187  memset(clustMatrix, 0, sizeof(float) * mrow * mcol);
188 
189  // Copy clust's pixels (calibrated in electrons) into clusMatrix;
190  for (int i = 0; i != theClusterParam.theCluster->size(); ++i) {
191  auto pix = theClusterParam.theCluster->pixel(i);
192  int irow = int(pix.x) - row_offset;
193  int icol = int(pix.y) - col_offset;
194 
195  // Gavril : what do we do here if the row/column is larger than cluster_matrix_size_x/cluster_matrix_size_y ?
196  // Ignore them for the moment...
197  if ((irow < mrow) & (icol < mcol))
198  clustMatrix[irow][icol] = float(pix.adc);
199  }
200 
201  // Make and fill the bool arrays flagging double pixels
202  bool xdouble[mrow], ydouble[mcol];
203  // x directions (shorter), rows
204  for (int irow = 0; irow < mrow; ++irow)
205  xdouble[irow] = theDetParam.theRecTopol->isItBigPixelInX(irow + row_offset);
206 
207  // y directions (longer), columns
208  for (int icol = 0; icol < mcol; ++icol)
209  ydouble[icol] = theDetParam.theRecTopol->isItBigPixelInY(icol + col_offset);
210 
211  SiPixelTemplateReco::ClusMatrix clusterPayload{&clustMatrix[0][0], xdouble, ydouble, mrow, mcol};
212 
213  // Output:
214  float nonsense = -99999.9f; // nonsense init value
215  theClusterParam.templXrec_ = theClusterParam.templYrec_ = theClusterParam.templSigmaX_ =
216  theClusterParam.templSigmaY_ = nonsense;
217  // If the template recontruction fails, we want to return 1.0 for now
218  theClusterParam.templProbY_ = theClusterParam.templProbX_ = theClusterParam.templProbQ_ = 1.0f;
219  theClusterParam.templQbin_ = 0;
220  // We have a boolean denoting whether the reco failed or not
221  theClusterParam.hasFilledProb_ = false;
222 
223  float templYrec1_ = nonsense;
224  float templXrec1_ = nonsense;
225  float templYrec2_ = nonsense;
226  float templXrec2_ = nonsense;
227 
228  // ******************************************************************
229  // Do it! Use cotalpha_ and cotbeta_ calculated in PixelCPEBase
230 
231  float locBz = theDetParam.bz;
232  float locBx = theDetParam.bx;
233 
234  theClusterParam.ierr = PixelTempReco1D(ID,
235  theClusterParam.cotalpha,
236  theClusterParam.cotbeta,
237  locBz,
238  locBx,
239  clusterPayload,
240  templ,
241  theClusterParam.templYrec_,
242  theClusterParam.templSigmaY_,
243  theClusterParam.templProbY_,
244  theClusterParam.templXrec_,
245  theClusterParam.templSigmaX_,
246  theClusterParam.templProbX_,
247  theClusterParam.templQbin_,
248  speed_,
249  theClusterParam.templProbQ_);
250 
251  // ******************************************************************
252 
253  // Check exit status
254  if UNLIKELY (theClusterParam.ierr != 0) {
255  LogDebug("PixelCPETemplateReco::localPosition")
256  << "reconstruction failed with error " << theClusterParam.ierr << "\n";
257 
258  // Gavril: what do we do in this case ? For now, just return the cluster center of gravity in microns
259  // In the x case, apply a rough Lorentz drift average correction
260  // To do: call PixelCPEGeneric whenever PixelTempReco1D fails
261  float lorentz_drift = -999.9;
262  if (!fpix)
263  lorentz_drift = 60.0f; // in microns
264  else
265  lorentz_drift = 10.0f; // in microns
266  // ggiurgiu@jhu.edu, 21/09/2010 : trk angles needed to correct for bows/kinks
267  if (theClusterParam.with_track_angle) {
268  theClusterParam.templXrec_ =
269  theDetParam.theTopol->localX(theClusterParam.theCluster->x(), theClusterParam.loc_trk_pred) -
270  lorentz_drift * micronsToCm; // rough Lorentz drift correction
271  theClusterParam.templYrec_ =
272  theDetParam.theTopol->localY(theClusterParam.theCluster->y(), theClusterParam.loc_trk_pred);
273  } else {
274  edm::LogError("PixelCPETemplateReco") << "@SUB = PixelCPETemplateReco::localPosition"
275  << "Should never be here. PixelCPETemplateReco should always be called "
276  "with track angles. This is a bad error !!! ";
277 
278  theClusterParam.templXrec_ = theDetParam.theTopol->localX(theClusterParam.theCluster->x()) -
279  lorentz_drift * micronsToCm; // rough Lorentz drift correction
280  theClusterParam.templYrec_ = theDetParam.theTopol->localY(theClusterParam.theCluster->y());
281  }
282  } else if UNLIKELY (UseClusterSplitter_ && theClusterParam.templQbin_ == 0) {
283  edm::LogError("PixelCPETemplateReco") << " PixelCPETemplateReco: Qbin = 0 but using cluster splitter, we should "
284  "never be here !!!!!!!!!!!!!!!!!!!!!! \n"
285  << "(int)UseClusterSplitter_ = " << (int)UseClusterSplitter_ << endl;
286 
287  //ierr =
288  //PixelTempSplit( ID, fpix, cotalpha_, cotbeta_,
289  // clust_array_2d, ydouble, xdouble,
290  // templ,
291  // templYrec1_, templYrec2_, templSigmaY_, templProbY_,
292  // templXrec1_, templXrec2_, templSigmaX_, templProbX_,
293  // templQbin_ );
294 
295  // Commented for now (3/10/17) until we figure out how to resuscitate 2D template splitter
299 
300  theClusterParam.ierr = -123;
301  /*
302  float dchisq;
303  float templProbQ_;
304  SiPixelTemplateSplit::PixelTempSplit( ID, theClusterParam.cotalpha, theClusterParam.cotbeta,
305  clust_array_2d,
306  ydouble, xdouble,
307  templ,
308  templYrec1_, templYrec2_, theClusterParam.templSigmaY_, theClusterParam.templProbY_,
309  templXrec1_, templXrec2_, theClusterParam.templSigmaX_, theClusterParam.templProbX_,
310  theClusterParam.templQbin_,
311  templProbQ_,
312  true,
313  dchisq,
314  templ2D_ );
315 
316  */
317  if (theClusterParam.ierr != 0) {
318  LogDebug("PixelCPETemplateReco::localPosition")
319  << "reconstruction failed with error " << theClusterParam.ierr << "\n";
320 
321  // Gavril: what do we do in this case ? For now, just return the cluster center of gravity in microns
322  // In the x case, apply a rough Lorentz drift average correction
323  // To do: call PixelCPEGeneric whenever PixelTempReco1D fails
324  float lorentz_drift = -999.9f;
325  if (!fpix)
326  lorentz_drift = 60.0f; // in microns
327  else
328  lorentz_drift = 10.0f; // in microns
329 
330  // ggiurgiu@jhu.edu, 12/09/2010 : trk angles needed to correct for bows/kinks
331  if (theClusterParam.with_track_angle) {
332  theClusterParam.templXrec_ =
333  theDetParam.theTopol->localX(theClusterParam.theCluster->x(), theClusterParam.loc_trk_pred) -
334  lorentz_drift * micronsToCm; // rough Lorentz drift correction
335  theClusterParam.templYrec_ =
336  theDetParam.theTopol->localY(theClusterParam.theCluster->y(), theClusterParam.loc_trk_pred);
337  } else {
338  edm::LogError("PixelCPETemplateReco") << "@SUB = PixelCPETemplateReco::localPosition"
339  << "Should never be here. PixelCPETemplateReco should always be called "
340  "with track angles. This is a bad error !!! ";
341 
342  theClusterParam.templXrec_ = theDetParam.theTopol->localX(theClusterParam.theCluster->x()) -
343  lorentz_drift * micronsToCm; // very rough Lorentz drift correction
344  theClusterParam.templYrec_ = theDetParam.theTopol->localY(theClusterParam.theCluster->y());
345  }
346  } else {
347  // go from micrometer to centimeter
348  templXrec1_ *= micronsToCm;
349  templYrec1_ *= micronsToCm;
350  templXrec2_ *= micronsToCm;
351  templYrec2_ *= micronsToCm;
352 
353  // go back to the module coordinate system
354  templXrec1_ += lp.x();
355  templYrec1_ += lp.y();
356  templXrec2_ += lp.x();
357  templYrec2_ += lp.y();
358 
359  // calculate distance from each hit to the track and choose the hit closest to the track
360  float distX1 = std::abs(templXrec1_ - theClusterParam.trk_lp_x);
361  float distX2 = std::abs(templXrec2_ - theClusterParam.trk_lp_x);
362  float distY1 = std::abs(templYrec1_ - theClusterParam.trk_lp_y);
363  float distY2 = std::abs(templYrec2_ - theClusterParam.trk_lp_y);
364  theClusterParam.templXrec_ = (distX1 < distX2 ? templXrec1_ : templXrec2_);
365  theClusterParam.templYrec_ = (distY1 < distY2 ? templYrec1_ : templYrec2_);
366  }
367  } // else if ( UseClusterSplitter_ && templQbin_ == 0 )
368 
369  else // apparenly this is the good one!
370  {
371  // go from micrometer to centimeter
372  theClusterParam.templXrec_ *= micronsToCm;
373  theClusterParam.templYrec_ *= micronsToCm;
374 
375  // go back to the module coordinate system
376  theClusterParam.templXrec_ += lp.x();
377  theClusterParam.templYrec_ += lp.y();
378 
379  // Compute the Alignment Group Corrections [template ID should already be selected from call to reco procedure]
380  if (DoLorentz_) {
381  // Do only if the lotentzshift has meaningfull numbers
382  if (theDetParam.lorentzShiftInCmX != 0.0 || theDetParam.lorentzShiftInCmY != 0.0) {
383  // the LA width/shift returned by templates use (+)
384  // the LA width/shift produced by PixelCPEBase for positive LA is (-)
385  // correct this by iserting (-)
386  //float temp1 = -micronsToCm*templ.lorxwidth(); // old
387  //float temp2 = -micronsToCm*templ.lorywidth(); // does not incl 1/2
388  float templateLorbiasCmX = -micronsToCm * templ.lorxbias(); // new
389  float templateLorbiasCmY = -micronsToCm * templ.lorybias(); //incl. 1/2
390  // now, correctly, we can use the difference of shifts
391  //theClusterParam.templXrec_ += 0.5*(theDetParam.lorentzShiftInCmX - templateLorbiasCmX);
392  //theClusterParam.templYrec_ += 0.5*(theDetParam.lorentzShiftInCmY - templateLorbiasCmY);
393  theClusterParam.templXrec_ += (0.5 * (theDetParam.lorentzShiftInCmX) - templateLorbiasCmX);
394  theClusterParam.templYrec_ += (0.5 * (theDetParam.lorentzShiftInCmY) - templateLorbiasCmY);
395  //cout << "Templates: la lorentz offset = "
396  // <<(0.5*(theDetParam.lorentzShiftInCmX)-templateLorbiasCmX)
397  // <<" "<<templateLorbiasCmX<<" "<<templateLorbiasCmY
398  // <<" "<<temp1<<" "<<temp2
399  // <<" "<<theDetParam.lorentzShiftInCmX
400  // <<" "<<theDetParam.lorentzShiftInCmY
401  // << endl; //dk
402  } //else {cout<<" LA is 0, disable offset corrections "<<endl;} //dk
403  } //else {cout<<" Do not do LA offset correction "<<endl;} //dk
404  }
405 
406  // Save probabilities and qBin in the quantities given to us by the base class
407  // (for which there are also inline getters). &&& templProbX_ etc. should be retired...
408  theClusterParam.probabilityX_ = theClusterParam.templProbX_;
409  theClusterParam.probabilityY_ = theClusterParam.templProbY_;
410  theClusterParam.probabilityQ_ = theClusterParam.templProbQ_;
411  theClusterParam.qBin_ = theClusterParam.templQbin_;
412 
413  if (theClusterParam.ierr == 0) // always true here
414  theClusterParam.hasFilledProb_ = true;
415 
416  return LocalPoint(theClusterParam.templXrec_, theClusterParam.templYrec_);
417 }
418 
419 //------------------------------------------------------------------
420 // localError() relies on localPosition() being called FIRST!!!
421 //------------------------------------------------------------------
422 LocalError PixelCPETemplateReco::localError(DetParam const& theDetParam, ClusterParam& theClusterParamBase) const {
423  ClusterParamTemplate& theClusterParam = static_cast<ClusterParamTemplate&>(theClusterParamBase);
424 
425  //cout << endl;
426  //cout << "Set PixelCPETemplate errors .............................................." << endl;
427 
428  //cout << "CPETemplate : " << endl;
429 
430  //--- Default is the maximum error used for edge clusters.
431  //--- (never used, in fact: let comment it out, shut up the complains of the static analyzer, and save a few CPU cycles)
432  // const float sig12 = 1./sqrt(12.0);
433  // float xerr = theDetParam.thePitchX *sig12;
434  // float yerr = theDetParam.thePitchY *sig12;
435  float xerr, yerr;
436 
437  // Check if the errors were already set at the clusters splitting level
438  if (theClusterParam.theCluster->getSplitClusterErrorX() > 0.0f &&
439  theClusterParam.theCluster->getSplitClusterErrorX() < clusterSplitMaxError_ &&
440  theClusterParam.theCluster->getSplitClusterErrorY() > 0.0f &&
441  theClusterParam.theCluster->getSplitClusterErrorY() < clusterSplitMaxError_) {
442  xerr = theClusterParam.theCluster->getSplitClusterErrorX() * micronsToCm;
443  yerr = theClusterParam.theCluster->getSplitClusterErrorY() * micronsToCm;
444 
445  //cout << "Errors set at cluster splitting level : " << endl;
446  //cout << "xerr = " << xerr << endl;
447  //cout << "yerr = " << yerr << endl;
448  } else {
449  // If errors are not split at the cluster splitting level, set the errors here
450 
451  //cout << "Errors are not split at the cluster splitting level, set the errors here : " << endl;
452 
453  int maxPixelCol = theClusterParam.theCluster->maxPixelCol();
454  int maxPixelRow = theClusterParam.theCluster->maxPixelRow();
455  int minPixelCol = theClusterParam.theCluster->minPixelCol();
456  int minPixelRow = theClusterParam.theCluster->minPixelRow();
457 
458  //--- Are we near either of the edges?
459  bool edgex = (theDetParam.theRecTopol->isItEdgePixelInX(minPixelRow) ||
460  theDetParam.theRecTopol->isItEdgePixelInX(maxPixelRow));
461  bool edgey = (theDetParam.theRecTopol->isItEdgePixelInY(minPixelCol) ||
462  theDetParam.theRecTopol->isItEdgePixelInY(maxPixelCol));
463 
464  if (theClusterParam.ierr != 0) {
465  // If reconstruction fails the hit position is calculated from cluster center of gravity
466  // corrected in x by average Lorentz drift. Assign huge errors.
467  //xerr = 10.0 * (float)theClusterParam.theCluster->sizeX() * xerr;
468  //yerr = 10.0 * (float)theClusterParam.theCluster->sizeX() * yerr;
469 
471  throw cms::Exception("PixelCPETemplateReco::localPosition :") << "A non-pixel detector type in here?";
472 
473  // Assign better errors based on the residuals for failed template cases
474  if (GeomDetEnumerators::isBarrel(theDetParam.thePart)) {
475  xerr = 55.0f * micronsToCm;
476  yerr = 36.0f * micronsToCm;
477  } else {
478  xerr = 42.0f * micronsToCm;
479  yerr = 39.0f * micronsToCm;
480  }
481 
482  //cout << "xerr = " << xerr << endl;
483  //cout << "yerr = " << yerr << endl;
484 
485  //return LocalError(xerr*xerr, 0, yerr*yerr);
486  } else if (edgex || edgey) {
487  // for edge pixels assign errors according to observed residual RMS
488  if (edgex && !edgey) {
489  xerr = xEdgeXError_ * micronsToCm;
490  yerr = xEdgeYError_ * micronsToCm;
491  } else if (!edgex && edgey) {
492  xerr = yEdgeXError_ * micronsToCm;
493  yerr = yEdgeYError_ * micronsToCm;
494  } else if (edgex && edgey) {
495  xerr = bothEdgeXError_ * micronsToCm;
496  yerr = bothEdgeYError_ * micronsToCm;
497  } else {
498  throw cms::Exception(" PixelCPETemplateReco::localError: Something wrong with pixel edge flag !!!");
499  }
500 
501  //cout << "xerr = " << xerr << endl;
502  //cout << "yerr = " << yerr << endl;
503  } else {
504  // &&& need a class const
505  //const float micronsToCm = 1.0e-4;
506 
507  xerr = theClusterParam.templSigmaX_ * micronsToCm;
508  yerr = theClusterParam.templSigmaY_ * micronsToCm;
509 
510  //cout << "xerr = " << xerr << endl;
511  //cout << "yerr = " << yerr << endl;
512 
513  // &&& should also check ierr (saved as class variable) and return
514  // &&& nonsense (another class static) if the template fit failed.
515  }
516 
517  if (theVerboseLevel > 9) {
518  LogDebug("PixelCPETemplateReco") << " Sizex = " << theClusterParam.theCluster->sizeX()
519  << " Sizey = " << theClusterParam.theCluster->sizeY() << " Edgex = " << edgex
520  << " Edgey = " << edgey << " ErrX = " << xerr << " ErrY = " << yerr;
521  }
522 
523  } // else
524 
525  if (!(xerr > 0.0f))
526  throw cms::Exception("PixelCPETemplateReco::localError")
527  << "\nERROR: Negative pixel error xerr = " << xerr << "\n\n";
528 
529  if (!(yerr > 0.0f))
530  throw cms::Exception("PixelCPETemplateReco::localError")
531  << "\nERROR: Negative pixel error yerr = " << yerr << "\n\n";
532 
533  //cout << "Final errors set to: " << endl;
534  //cout << "xerr = " << xerr << endl;
535  //cout << "yerr = " << yerr << endl;
536  //cout << "Out of PixelCPETemplateREco..........................................................................." << endl;
537  //cout << endl;
538 
539  return LocalError(xerr * xerr, 0, yerr * yerr);
540 }
541 
543  desc.add<int>("barrelTemplateID", 0);
544  desc.add<int>("forwardTemplateID", 0);
545  desc.add<int>("directoryWithTemplates", 0);
546  desc.add<int>("speed", -2);
547  desc.add<bool>("UseClusterSplitter", false);
548 }
PixelCPEBase::ClusterParam
Definition: PixelCPEBase.h:69
PixelCPEBase::DetParam::bz
float bz
Definition: PixelCPEBase.h:58
PixelCPETemplateReco::ClusterParamTemplate
Definition: PixelCPETemplateReco.h:34
PixelCPEBase::DetParam::bx
float bx
Definition: PixelCPEBase.h:59
PixelCPEBase::DetParam::theTopol
const PixelTopology * theTopol
Definition: PixelCPEBase.h:49
PixelCPEBase::DetParam::lorentzShiftInCmY
float lorentzShiftInCmY
Definition: PixelCPEBase.h:64
PixelCPEBase::bothEdgeYError_
static constexpr float bothEdgeYError_
Definition: PixelCPEBase.h:253
PixelCPEBase::templateDBobject_
const SiPixelTemplateDBObject * templateDBobject_
Definition: PixelCPEBase.h:238
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
MessageLogger.h
dqmMemoryStats.float
float
Definition: dqmMemoryStats.py:127
PixelCPETemplateReco::thePixelTemp_
std::vector< SiPixelTemplateStore > thePixelTemp_
Definition: PixelCPETemplateReco.h:77
RectangularPixelTopology.h
f
double f[11][100]
Definition: MuScleFitUtils.cc:78
PixelCPEBase::DetParam::theRecTopol
const RectangularPixelTopology * theRecTopol
Definition: PixelCPEBase.h:50
PV3DBase::x
T x() const
Definition: PV3DBase.h:59
min
T min(T a, T b)
Definition: MathUtil.h:58
SiPixelTemplate
Definition: SiPixelTemplate.h:246
TrackerTopology
Definition: TrackerTopology.h:16
SiPixelTemplateReco.h
PixelCPETemplateReco::localPosition
LocalPoint localPosition(DetParam const &theDetParam, ClusterParam &theClusterParam) const override
Definition: PixelCPETemplateReco.cc:110
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
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
Topology::localPosition
virtual LocalPoint localPosition(const MeasurementPoint &) const =0
SiPixelCluster
Pixel cluster – collection of neighboring pixels above threshold.
Definition: SiPixelCluster.h:28
align::LocalPoint
Point3DBase< Scalar, LocalTag > LocalPoint
Definition: Definitions.h:30
PixelCPETemplateReco::barrelTemplateID_
int barrelTemplateID_
Definition: PixelCPETemplateReco.h:84
PixelCPETemplateReco::ClusterParamTemplate::templXrec_
float templXrec_
Definition: PixelCPETemplateReco.h:37
PixelCPEBase::bothEdgeXError_
static constexpr float bothEdgeXError_
Definition: PixelCPEBase.h:252
PixelCPEBase::DetParam::theDet
const PixelGeomDetUnit * theDet
Definition: PixelCPEBase.h:47
PixelCPETemplateReco::~PixelCPETemplateReco
~PixelCPETemplateReco() override
Definition: PixelCPETemplateReco.cc:97
PixelCPETemplateReco::ClusterParamTemplate::templQbin_
int templQbin_
Definition: PixelCPETemplateReco.h:48
RectangularPixelTopology::isItBigPixelInY
bool isItBigPixelInY(const int iybin) const override
Definition: RectangularPixelTopology.h:118
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
SiPixelTemplate::lorxbias
float lorxbias()
signed lorentz x-width (microns)
Definition: SiPixelTemplate.h:666
PixelCPETemplateReco::fillPSetDescription
static void fillPSetDescription(edm::ParameterSetDescription &desc)
Definition: PixelCPETemplateReco.cc:542
RectangularPixelTopology::isItBigPixelInX
bool isItBigPixelInX(const int ixbin) const override
Definition: RectangularPixelTopology.h:114
SiPixelLorentzAngle
Definition: SiPixelLorentzAngle.h:11
PixelCPETemplateReco::createClusterParam
std::unique_ptr< ClusterParam > createClusterParam(const SiPixelCluster &cl) const override
Definition: PixelCPETemplateReco.cc:99
relativeConstraints.geom
geom
Definition: relativeConstraints.py:72
SiPixelTemplateReco
Definition: SiPixelTemplateReco.h:71
PixelCPEBase::xEdgeXError_
static constexpr float xEdgeXError_
Definition: PixelCPEBase.h:246
Point3DBase< float, LocalTag >
PixelCPETemplateReco::ClusterParamTemplate::templProbY_
float templProbY_
Definition: PixelCPETemplateReco.h:44
PixelCPETemplateReco::forwardTemplateID_
int forwardTemplateID_
Definition: PixelCPETemplateReco.h:85
RectangularPixelTopology::isItEdgePixelInX
bool isItEdgePixelInX(int ixbin) const override
Definition: RectangularPixelTopology.h:143
MeasurementPoint
Measurement2DPoint MeasurementPoint
Measurement points are two-dimensional by default.
Definition: MeasurementPoint.h:12
GeomDet::geographicalId
DetId geographicalId() const
The label of this GeomDet.
Definition: GeomDet.h:64
PixelCPETemplateReco.h
PixelCPETemplateReco::PixelCPETemplateReco
PixelCPETemplateReco(edm::ParameterSet const &conf, const MagneticField *, const TrackerGeometry &, const TrackerTopology &, const SiPixelLorentzAngle *, const SiPixelTemplateDBObject *)
Definition: PixelCPETemplateReco.cc:43
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:233
edm::ParameterSet
Definition: ParameterSet.h:47
align::ID
uint32_t ID
Definition: Definitions.h:24
SiPixelTemplate::lorybias
float lorybias()
signed lorentz y-width (microns)
Definition: SiPixelTemplate.h:665
SiStripPI::max
Definition: SiStripPayloadInspectorHelper.h:169
LocalError
Definition: LocalError.h:12
PixelCPETemplateReco::ClusterParamTemplate::templSigmaX_
float templSigmaX_
Definition: PixelCPETemplateReco.h:39
PV3DBase::y
T y() const
Definition: PV3DBase.h:60
SiPixelTemplateDBObject
Definition: SiPixelTemplateDBObject.h:16
createfilelist.int
int
Definition: createfilelist.py:10
GeomDetEnumerators::isTrackerPixel
bool isTrackerPixel(GeomDetEnumerators::SubDetector m)
Definition: GeomDetEnumerators.cc:68
PixelCPETemplateReco::ClusterParamTemplate::templProbX_
float templProbX_
Definition: PixelCPETemplateReco.h:43
PixelCPEBase::theVerboseLevel
int theVerboseLevel
Definition: PixelCPEBase.h:225
GeomDetEnumerators::isBarrel
bool isBarrel(GeomDetEnumerators::SubDetector m)
Definition: GeomDetEnumerators.cc:57
PixelCPEBase::DoLorentz_
bool DoLorentz_
Definition: PixelCPEBase.h:241
PixelCPETemplateReco::localError
LocalError localError(DetParam const &theDetParam, ClusterParam &theClusterParam) const override
Definition: PixelCPETemplateReco.cc:422
PixelCPETemplateReco::ClusterParamTemplate::templProbQ_
float templProbQ_
Definition: PixelCPETemplateReco.h:46
MagneticField.h
edm::LogError
Log< level::Error, false > LogError
Definition: MessageLogger.h:123
PixelCPEBase::LoadTemplatesFromDB_
bool LoadTemplatesFromDB_
Definition: PixelCPEBase.h:242
SiPixelTemplateDBObject::getTemplateID
short getTemplateID(const uint32_t &detid) const
Definition: SiPixelTemplateDBObject.h:131
PixelCPEBase::DetParam::detTemplateId
int detTemplateId
Definition: PixelCPEBase.h:65
PixelCPEBase::DetParam::thePart
GeomDetType::SubDetector thePart
Definition: PixelCPEBase.h:52
PixelCPEBase::DetParam::lorentzShiftInCmX
float lorentzShiftInCmX
Definition: PixelCPEBase.h:63
mag
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
Definition: Basic3DVectorLD.h:127
PixelCPEBase::DetParam
Definition: PixelCPEBase.h:45
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
std
Definition: JetResolutionObject.h:76
RectangularPixelTopology::isItEdgePixelInY
bool isItEdgePixelInY(int iybin) const override
Definition: RectangularPixelTopology.h:144
PixelCPETemplateReco::ClusterParamTemplate::ierr
int ierr
Definition: PixelCPETemplateReco.h:50
Exception
Definition: hltDiff.cc:245
PixelCPEBase::yEdgeYError_
static constexpr float yEdgeYError_
Definition: PixelCPEBase.h:250
PixelTopology::localY
virtual float localY(float mpY) const =0
PixelCPEBase
Definition: PixelCPEBase.h:43
SiPixelTemplateReco::ClusMatrix
Definition: SiPixelTemplateReco.h:73
PixelGeomDetUnit.h
PixelCPETemplateReco::UseClusterSplitter_
bool UseClusterSplitter_
Definition: PixelCPETemplateReco.h:81
PixelCPETemplateReco::ClusterParamTemplate::templSigmaY_
float templSigmaY_
Definition: PixelCPETemplateReco.h:40
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
PixelCPEBase::clusterSplitMaxError_
static constexpr float clusterSplitMaxError_
Definition: PixelCPEBase.h:255
PixelTopology::localX
virtual float localX(float mpX) const =0
cms::Exception
Definition: Exception.h:70
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
MagneticField
Definition: MagneticField.h:19
PixelCPEBase::xEdgeYError_
static constexpr float xEdgeYError_
Definition: PixelCPEBase.h:247
GeomDetEnumerators::isEndcap
bool isEndcap(GeomDetEnumerators::SubDetector m)
Definition: GeomDetEnumerators.cc:62
PixelCPETemplateReco::ClusterParamTemplate::templYrec_
float templYrec_
Definition: PixelCPETemplateReco.h:38
PixelCPEBase::yEdgeXError_
static constexpr float yEdgeXError_
Definition: PixelCPEBase.h:249
TrackerGeometry
Definition: TrackerGeometry.h:14