CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
20 
22 
23 #include <vector>
24 #include "boost/multi_array.hpp"
25 
26 #include <iostream>
27 
28 using namespace SiPixelTemplateReco;
29 using namespace std;
30 
31 const float PI = 3.141593;
32 const float HALFPI = PI * 0.5;
33 const float degsPerRad = 57.29578;
34 
35 // &&& need a class const
36 const float micronsToCm = 1.0e-4;
37 
38 const int cluster_matrix_size_x = 13;
39 const int cluster_matrix_size_y = 21;
40 
41 //-----------------------------------------------------------------------------
42 // Constructor. All detUnit-dependent quantities will be initialized later,
43 // in setTheDet(). Here we only load the templates into the template store templ_ .
44 //-----------------------------------------------------------------------------
46  const MagneticField * mag, const SiPixelLorentzAngle * lorentzAngle,
47  const SiPixelTemplateDBObject * templateDBobject)
48  : PixelCPEBase(conf, mag, lorentzAngle, 0, templateDBobject)
49 {
50  //cout << "From PixelCPETemplateReco::PixelCPETemplateReco(...)" << endl;
51 
52  // &&& initialize the templates, etc.
53 
54  //-- Use Magnetic field at (0,0,0) to select a template ID [Morris, 6/25/08] (temporary until we implement DB access)
55 
56  DoCosmics_ = conf.getParameter<bool>("DoCosmics");
57  LoadTemplatesFromDB_ = conf.getParameter<bool>("LoadTemplatesFromDB");
58  //cout << "(int)LoadTemplatesFromDB_ = " << (int)LoadTemplatesFromDB_ << endl;
59  //cout << "field_magnitude = " << field_magnitude << endl;
60 
61  // ggiurgiu@fnal.gov, 12/17/2008: use configuration parameter to decide between DB or text file template access
62  if ( LoadTemplatesFromDB_ )
63  {
64  // Initialize template store to the selected ID [Morris, 6/25/08]
66  throw cms::Exception("PixelCPETemplateReco")
67  << "\nERROR: Templates not filled correctly. Check the sqlite file. Using SiPixelTemplateDBObject version "
68  << (*templateDBobject_).version() << "\n\n";
69  }
70  else
71  {
72  if ( !templ_.pushfile( templID_ ) )
73  throw cms::Exception("PixelCPETemplateReco")
74  << "\nERROR: Templates not loaded correctly from text file. Reconstruction will fail.\n\n";
75  }
76 
77  speed_ = conf.getParameter<int>( "speed");
78  LogDebug("PixelCPETemplateReco::PixelCPETemplateReco:") <<
79  "Template speed = " << speed_ << "\n";
80 
81  UseClusterSplitter_ = conf.getParameter<bool>("UseClusterSplitter");
82 
83 }
84 
85 //-----------------------------------------------------------------------------
86 // Clean up.
87 //-----------------------------------------------------------------------------
89 {
90  // &&& delete template store?
91 }
92 
93 
96  const GeomDetUnit & det) const
97 {
98  LocalPoint lp = localPosition(cluster,det);
99 
100  // ggiurgiu@jhu.edu 12/09/2010 : trk angles needed to correct for bows/kinks
101  if ( with_track_angle )
103  else
104  {
105  edm::LogError("PixelCPETemplateReco")
106  << "@SUB = PixelCPETemplateReco::measurementPosition"
107  << "Should never be here. PixelCPETemplateReco should always be called with track angles. This is a bad error !!! ";
108 
109  return theTopol->measurementPosition( lp );
110  }
111 }
112 
113 
114 //------------------------------------------------------------------
115 // Public methods mandated by the base class.
116 //------------------------------------------------------------------
117 
118 //------------------------------------------------------------------
119 // The main call to the template code.
120 //------------------------------------------------------------------
123 {
124  setTheDet( det, cluster );
126 
127  //int ierr; //!< return status
128  int ID = templID_;
129 
130 
131  bool fpix;
133  fpix = false; // no, it's not forward -- it's barrel
134  else
135  fpix = true; // yes, it's forward
136 
137  // Make from cluster (a SiPixelCluster) a boost multi_array_2d called
138  // clust_array_2d.
139  boost::multi_array<float, 2> clust_array_2d(boost::extents[cluster_matrix_size_x][cluster_matrix_size_y]);
140 
141  // Preparing to retrieve ADC counts from the SiPixelCluster. In the cluster,
142  // we have the following:
143  // int minPixelRow(); // Minimum pixel index in the x direction (low edge).
144  // int maxPixelRow(); // Maximum pixel index in the x direction (top edge).
145  // int minPixelCol(); // Minimum pixel index in the y direction (left edge).
146  // int maxPixelCol(); // Maximum pixel index in the y direction (right edge).
147  // So the pixels from minPixelRow() will go into clust_array_2d[0][*],
148  // and the pixels from minPixelCol() will go into clust_array_2d[*][0].
149  int row_offset = cluster.minPixelRow();
150  int col_offset = cluster.minPixelCol();
151 
152  // Store the coordinates of the center of the (0,0) pixel of the array that
153  // gets passed to PixelTempReco2D
154  // Will add these values to the output of PixelTempReco2D
155  float tmp_x = float(cluster.minPixelRow()) + 0.5;
156  float tmp_y = float(cluster.minPixelCol()) + 0.5;
157 
158  // Store these offsets (to be added later) in a LocalPoint after tranforming
159  // them from measurement units (pixel units) to local coordinates (cm)
160 
161  // ggiurgiu@jhu.edu 12/09/2010 : update call with trk angles needed for bow/kink corrections
162  LocalPoint lp;
163 
164  if ( with_track_angle )
165  lp = theTopol->localPosition( MeasurementPoint(tmp_x, tmp_y), loc_trk_pred_ );
166  else
167  {
168  edm::LogError("PixelCPETemplateReco")
169  << "@SUB = PixelCPETemplateReco::localPosition"
170  << "Should never be here. PixelCPETemplateReco should always be called with track angles. This is a bad error !!! ";
171 
172  lp = theTopol->localPosition( MeasurementPoint(tmp_x, tmp_y) );
173  }
174 
175  const std::vector<SiPixelCluster::Pixel> & pixVec = cluster.pixels();
176  std::vector<SiPixelCluster::Pixel>::const_iterator
177  pixIter = pixVec.begin(), pixEnd = pixVec.end();
178 
179  // Visualize large clusters ---------------------------------------------------------
180  // From Petar: maybe this should be moved into a method in the base class?
181  /*
182  char cluster_matrix[100][100];
183  for (int i=0; i<100; i++)
184  for (int j=0; j<100; j++)
185  cluster_matrix[i][j] = '.';
186 
187  if ( cluster.sizeX()>cluster_matrix_size_x || cluster.sizeY()>cluster_matrix_size_y )
188  {
189  cout << "cluster.size() = " << cluster.size() << endl;
190  cout << "cluster.sizeX() = " << cluster.sizeX() << endl;
191  cout << "cluster.sizeY() = " << cluster.sizeY() << endl;
192 
193  for ( std::vector<SiPixelCluster::Pixel>::const_iterator pix = pixVec.begin(); pix != pixVec.end(); ++pix )
194  {
195  int i = (int)(pix->x) - row_offset;
196  int j = (int)(pix->y) - col_offset;
197  cluster_matrix[i][j] = '*';
198  }
199 
200  for (int i=0; i<(int)cluster.sizeX()+2; i++)
201  {
202  for (int j=0; j<(int)cluster.sizeY()+2; j++)
203  cout << cluster_matrix[i][j];
204  cout << endl;
205  }
206  } // if ( cluster.sizeX()>cluster_matrix_size_x || cluster.sizeY()>cluster_matrix_size_y )
207  */
208  // End Visualize clusters ---------------------------------------------------------
209 
210 
211  // Copy clust's pixels (calibrated in electrons) into clust_array_2d;
212  for ( ; pixIter != pixEnd; ++pixIter )
213  {
214  // *pixIter dereferences to Pixel struct, with public vars x, y, adc (all float)
215  // 02/13/2008 ggiurgiu@fnal.gov: type of x, y and adc has been changed to unsigned char, unsigned short, unsigned short
216  // in DataFormats/SiPixelCluster/interface/SiPixelCluster.h so the type cast to int is redundant. Leave it there, it
217  // won't hurt.
218  int irow = int(pixIter->x) - row_offset; // &&& do we need +0.5 ???
219  int icol = int(pixIter->y) - col_offset; // &&& do we need +0.5 ???
220 
221  // ggiurgiu@jhu.edu : what do we do here if the row/column is larger than cluster_matrix_size_x/cluster_matrix_size_y = 7/21 ?
222  // Ignore them for the moment...
223  if ( irow<cluster_matrix_size_x && icol<cluster_matrix_size_y )
224  // 02/13/2008 ggiurgiu@fnal.gov typecast pixIter->adc to float
225  clust_array_2d[irow][icol] = (float)pixIter->adc;
226  }
227 
228  // Make and fill the bool arrays flagging double pixels
229  std::vector<bool> ydouble(cluster_matrix_size_y), xdouble(cluster_matrix_size_x);
230  // x directions (shorter), rows
231  for (int irow = 0; irow < cluster_matrix_size_x; ++irow)
232  {
233  xdouble[irow] = theTopol->isItBigPixelInX( irow+row_offset );
234  }
235 
236  // y directions (longer), columns
237  for (int icol = 0; icol < cluster_matrix_size_y; ++icol)
238  {
239  ydouble[icol] = theTopol->isItBigPixelInY( icol+col_offset );
240  }
241 
242  // Output:
243  float nonsense = -99999.9; // nonsense init value
245  // If the template recontruction fails, we want to return 1.0 for now
247  templQbin_ = 0;
248  // We have a boolean denoting whether the reco failed or not
249  hasFilledProb_ = false;
250 
251  float templYrec1_ = nonsense;
252  float templXrec1_ = nonsense;
253  float templYrec2_ = nonsense;
254  float templXrec2_ = nonsense;
255 
256  // ******************************************************************
257  // Do it! Use cotalpha_ and cotbeta_ calculated in PixelCPEBase
258 
260 
261  Frame detFrame( theDet->surface().position(), theDet->surface().rotation() );
262  LocalVector Bfield = detFrame.toLocal( bfield );
263  float locBz = Bfield.z();
264 
265  ierr =
267  locBz,
268  clust_array_2d, ydouble, xdouble,
269  templ_,
272  templQbin_,
273  speed_,
275  );
276 
277  // ******************************************************************
278 
279  // Check exit status
280  if ( ierr != 0 )
281  {
282  LogDebug("PixelCPETemplateReco::localPosition") <<
283  "reconstruction failed with error " << ierr << "\n";
284 
285  // ggiurgiu@jhu.edu: what do we do in this case ? For now, just return the cluster center of gravity in microns
286  // In the x case, apply a rough Lorentz drift average correction
287  // To do: call PixelCPEGeneric whenever PixelTempReco2D fails
288  double lorentz_drift = -999.9;
290  lorentz_drift = 60.0; // in microns
292  lorentz_drift = 10.0; // in microns
293  else
294  throw cms::Exception("PixelCPETemplateReco::localPosition :")
295  << "A non-pixel detector type in here?" << "\n";
296 
297  // ggiurgiu@jhu.edu, 21/09/2010 : trk angles needed to correct for bows/kinks
298  if ( with_track_angle )
299  {
300  templXrec_ = theTopol->localX( cluster.x(), loc_trk_pred_ ) - lorentz_drift * micronsToCm; // rough Lorentz drift correction
301  templYrec_ = theTopol->localY( cluster.y(), loc_trk_pred_ );
302  }
303  else
304  {
305  edm::LogError("PixelCPETemplateReco")
306  << "@SUB = PixelCPETemplateReco::localPosition"
307  << "Should never be here. PixelCPETemplateReco should always be called with track angles. This is a bad error !!! ";
308 
309  templXrec_ = theTopol->localX( cluster.x() ) - lorentz_drift * micronsToCm; // rough Lorentz drift correction
310  templYrec_ = theTopol->localY( cluster.y() );
311  }
312 
313  }
314  else if ( UseClusterSplitter_ && templQbin_ == 0 )
315  {
316  ierr =
317  PixelTempSplit( ID, fpix, cotalpha_, cotbeta_,
318  clust_array_2d, ydouble, xdouble,
319  templ_,
320  templYrec1_, templYrec2_, templSigmaY_, templProbY_,
321  templXrec1_, templXrec2_, templSigmaX_, templProbX_,
322  templQbin_ );
323 
324  if ( ierr != 0 )
325  {
326  LogDebug("PixelCPETemplateReco::localPosition") <<
327  "reconstruction failed with error " << ierr << "\n";
328 
329  // ggiurgiu@jhu.edu: what do we do in this case ? For now, just return the cluster center of gravity in microns
330  // In the x case, apply a rough Lorentz drift average correction
331  // To do: call PixelCPEGeneric whenever PixelTempReco2D fails
332  double lorentz_drift = -999.9;
334  lorentz_drift = 60.0; // in microns
336  lorentz_drift = 10.0; // in microns
337  else
338  throw cms::Exception("PixelCPETemplateReco::localPosition :")
339  << "A non-pixel detector type in here?" << "\n";
340 
341  // ggiurgiu@jhu.edu, 12/09/2010 : trk angles needed to correct for bows/kinks
342  if ( with_track_angle )
343  {
344  templXrec_ = theTopol->localX( cluster.x(),loc_trk_pred_ ) - lorentz_drift * micronsToCm; // rough Lorentz drift correction
345  templYrec_ = theTopol->localY( cluster.y(),loc_trk_pred_ );
346  }
347  else
348  {
349  edm::LogError("PixelCPETemplateReco")
350  << "@SUB = PixelCPETemplateReco::localPosition"
351  << "Should never be here. PixelCPETemplateReco should always be called with track angles. This is a bad error !!! ";
352 
353  templXrec_ = theTopol->localX( cluster.x() ) - lorentz_drift * micronsToCm; // very rough Lorentz drift correction
354  templYrec_ = theTopol->localY( cluster.y() );
355 
356  }
357  }
358  else
359  {
360  // go from micrometer to centimeter
361  templXrec1_ *= micronsToCm;
362  templYrec1_ *= micronsToCm;
363  templXrec2_ *= micronsToCm;
364  templYrec2_ *= micronsToCm;
365 
366  // go back to the module coordinate system
367  templXrec1_ += lp.x();
368  templYrec1_ += lp.y();
369  templXrec2_ += lp.x();
370  templYrec2_ += lp.y();
371 
372  // calculate distance from each hit to the track and choose the
373  // hit closest to the track
374  float distance11 = sqrt( (templXrec1_ - trk_lp_x)*(templXrec1_ - trk_lp_x) +
375  (templYrec1_ - trk_lp_y)*(templYrec1_ - trk_lp_y) );
376 
377  float distance12 = sqrt( (templXrec1_ - trk_lp_x)*(templXrec1_ - trk_lp_x) +
378  (templYrec2_ - trk_lp_y)*(templYrec2_ - trk_lp_y) );
379 
380  float distance21 = sqrt( (templXrec2_ - trk_lp_x)*(templXrec2_ - trk_lp_x) +
381  (templYrec1_ - trk_lp_y)*(templYrec1_ - trk_lp_y) );
382 
383  float distance22 = sqrt( (templXrec2_ - trk_lp_x)*(templXrec2_ - trk_lp_x) +
384  (templYrec2_ - trk_lp_y)*(templYrec2_ - trk_lp_y) );
385 
386  int index_dist = -999;
387  float min_templXrec_ = -999.9;
388  float min_templYrec_ = -999.9;
389  float distance_min = 9999999999.9;
390  if ( distance11 < distance_min )
391  {
392  distance_min = distance11;
393  min_templXrec_ = templXrec1_;
394  min_templYrec_ = templYrec1_;
395  index_dist = 1;
396  }
397  if ( distance12 < distance_min )
398  {
399  distance_min = distance12;
400  min_templXrec_ = templXrec1_;
401  min_templYrec_ = templYrec2_;
402  index_dist = 2;
403  }
404  if ( distance21 < distance_min )
405  {
406  distance_min = distance21;
407  min_templXrec_ = templXrec2_;
408  min_templYrec_ = templYrec1_;
409  index_dist = 3;
410  }
411  if ( distance22 < distance_min )
412  {
413  distance_min = distance22;
414  min_templXrec_ = templXrec2_;
415  min_templYrec_ = templYrec2_;
416  index_dist = 4;
417  }
418 
419  templXrec_ = min_templXrec_;
420  templYrec_ = min_templYrec_;
421  }
422  } // else if ( UseClusterSplitter_ && templQbin_ == 0 )
423  else
424  {
425  // go from micrometer to centimeter
428 
429  // go back to the module coordinate system
430  templXrec_ += lp.x();
431  templYrec_ += lp.y();
432  }
433 
434  // Save probabilities and qBin in the quantities given to us by the base class
435  // (for which there are also inline getters). &&& templProbX_ etc. should be retired...
439  qBin_ = templQbin_;
440  if(ierr==0) hasFilledProb_ = true;
441 
442  LocalPoint template_lp = LocalPoint( nonsense, nonsense );
443  template_lp = LocalPoint( templXrec_, templYrec_ );
444 
445  return template_lp;
446 
447 }
448 
449 //------------------------------------------------------------------
450 // localError() relies on localPosition() being called FIRST!!!
451 //------------------------------------------------------------------
452 LocalError
454  const GeomDetUnit& det ) const
455 {
456  setTheDet( det, cluster );
457 
458  //--- Default is the maximum error used for edge clusters.
459  float xerr = thePitchX / sqrt(12.0);
460  float yerr = thePitchY / sqrt(12.0);
461 
462  int maxPixelCol = cluster.maxPixelCol();
463  int maxPixelRow = cluster.maxPixelRow();
464  int minPixelCol = cluster.minPixelCol();
465  int minPixelRow = cluster.minPixelRow();
466 
467  //--- Are we near either of the edges?
468  bool edgex = ( theTopol->isItEdgePixelInX( minPixelRow ) || theTopol->isItEdgePixelInX( maxPixelRow ) );
469  bool edgey = ( theTopol->isItEdgePixelInY( minPixelCol ) || theTopol->isItEdgePixelInY( maxPixelCol ) );
470 
471  if ( ierr !=0 )
472  {
473  // If reconstruction fails the hit position is calculated from cluster center of gravity
474  // corrected in x by average Lorentz drift. Assign huge errors.
475  //xerr = 10.0 * (float)cluster.sizeX() * xerr;
476  //yerr = 10.0 * (float)cluster.sizeX() * yerr;
477 
478  // Assign better errors based on the residuals for failed template cases
480  {
481  xerr = 55.0 * micronsToCm;
482  yerr = 36.0 * micronsToCm;
483  }
485  {
486  xerr = 42.0 * micronsToCm;
487  yerr = 39.0 * micronsToCm;
488  }
489  else
490  throw cms::Exception("PixelCPETemplateReco::localError :") << "A non-pixel detector type in here?" ;
491 
492 
493  return LocalError(xerr*xerr, 0, yerr*yerr);
494  }
495  else if ( edgex || edgey )
496  {
497  // for edge pixels assign errors according to observed residual RMS
498  if ( edgex && !edgey )
499  {
500  xerr = 23.0 * micronsToCm;
501  yerr = 39.0 * micronsToCm;
502  }
503  else if ( !edgex && edgey )
504  {
505  xerr = 24.0 * micronsToCm;
506  yerr = 96.0 * micronsToCm;
507  }
508  else if ( edgex && edgey )
509  {
510  xerr = 31.0 * micronsToCm;
511  yerr = 90.0 * micronsToCm;
512  }
513  else
514  {
515  throw cms::Exception(" PixelCPETemplateReco::localError: Something wrong with pixel edge flag !!!");
516  }
517  }
518  else
519  {
520  // &&& need a class const
521  const float micronsToCm = 1.0e-4;
522 
523  xerr = templSigmaX_ * micronsToCm;
524  yerr = templSigmaY_ * micronsToCm;
525 
526  // &&& should also check ierr (saved as class variable) and return
527  // &&& nonsense (another class static) if the template fit failed.
528  }
529 
530  if (theVerboseLevel > 9)
531  {
532  LogDebug("PixelCPETemplateReco") <<
533  " Sizex = " << cluster.sizeX() << " Sizey = " << cluster.sizeY() << " Edgex = " << edgex << " Edgey = " << edgey <<
534  " ErrX = " << xerr << " ErrY = " << yerr;
535  }
536 
537  return LocalError(xerr*xerr, 0, yerr*yerr);
538 }
539 
#define LogDebug(id)
T getParameter(std::string const &) const
Topology::LocalTrackPred loc_trk_pred_
Definition: PixelCPEBase.h:270
int minPixelCol() const
bool with_track_angle
Definition: PixelCPEBase.h:220
const float micronsToCm
virtual LocalPoint localPosition(const MeasurementPoint &) const =0
#define PI
short getTemplateID(const uint32_t &detid) const
virtual GlobalVector inTesla(const GlobalPoint &gp) const =0
Field value ad specified global point, in Tesla.
uint32_t ID
Definition: Definitions.h:26
float probabilityQ_
Definition: PixelCPEBase.h:225
LocalError localError(const SiPixelCluster &cl, const GeomDetUnit &det) const
GeomDetType::SubDetector thePart
Definition: PixelCPEBase.h:188
int maxPixelRow() const
float probabilityY_
Definition: PixelCPEBase.h:224
Measurement2DPoint MeasurementPoint
Measurement points are two-dimensional by default.
virtual bool isItEdgePixelInX(int ixbin) const =0
int minPixelRow() const
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
T sqrt(T t)
Definition: SSEVec.h:28
MeasurementPoint measurementPosition(const SiPixelCluster &, const GeomDetUnit &det) const
bool hasFilledProb_
Definition: PixelCPEBase.h:230
T z() const
Definition: PV3DBase.h:58
const float HALFPI
const SiPixelTemplateDBObject * templateDBobject_
Definition: PixelCPEBase.h:263
LocalPoint localPosition(const SiPixelCluster &cluster, const GeomDetUnit &det) const
DetId geographicalId() const
The label of this GeomDet.
Definition: GeomDet.h:74
const MagneticField * magfield_
Definition: PixelCPEBase.h:257
virtual MeasurementPoint measurementPosition(const LocalPoint &) const =0
int PixelTempReco2D(int id, float cotalpha, float cotbeta, float locBz, array_2d &cluster, std::vector< bool > &ydouble, std::vector< bool > &xdouble, 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)
tuple conf
Definition: dbtoconf.py:185
virtual bool isItBigPixelInX(const int ixbin) const =0
virtual float localX(const float mpX) const =0
bool pushfile(int filenum)
LocalTrajectoryParameters loc_traj_param_
Definition: PixelCPEBase.h:272
const PixelTopology * theTopol
Definition: PixelCPEBase.h:185
int maxPixelCol() const
const int cluster_matrix_size_y
PixelCPETemplateReco(edm::ParameterSet const &conf, const MagneticField *, const SiPixelLorentzAngle *, const SiPixelTemplateDBObject *)
int sizeY() const
void setTheDet(const GeomDetUnit &det, const SiPixelCluster &cluster) const
Definition: PixelCPEBase.cc:95
Pixel cluster – collection of neighboring pixels above threshold.
virtual bool isItEdgePixelInY(int iybin) const =0
float y() const
Local3DPoint LocalPoint
Definition: LocalPoint.h:11
const RotationType & rotation() const
const int cluster_matrix_size_x
const PixelGeomDetUnit * theDet
Definition: PixelCPEBase.h:181
int PixelTempSplit(int id, bool fpix, float cotalpha, float cotbeta, array_2d cluster, std::vector< bool > ydouble, std::vector< bool > xdouble, SiPixelTemplate &templ, float &yrec1, float &yrec2, float &sigmay, float &proby, float &xrec1, float &xrec2, float &sigmax, float &probx, int &qbin, bool deadpix, std::vector< std::pair< int, int > > zeropix)
int sizeX() const
const float degsPerRad
Definition: PixelCPEBase.cc:38
float probabilityX_
Definition: PixelCPEBase.h:223
const PositionType & position() const
virtual const BoundPlane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
float x() const
const std::vector< Pixel > pixels() const
virtual float localY(const float mpY) const =0
virtual bool isItBigPixelInY(const int iybin) const =0