CMS 3D CMS Logo

PixelCPEGeneric Class Reference

#include <RecoLocalTracker/SiPixelRecHits/interface/PixelCPEGeneric.h>

Inheritance diagram for PixelCPEGeneric:

PixelCPEBase ClusterParameterEstimator< SiPixelCluster >

List of all members.

Public Member Functions

LocalError localError (const SiPixelCluster &cl, const GeomDetUnit &det) const
LocalPoint localPosition (const SiPixelCluster &cluster, const GeomDetUnit &det) const
 Hit position in the local frame (in cm).
MeasurementPoint measurementPosition (const SiPixelCluster &, const GeomDetUnit &det) const
 PixelCPEGeneric (edm::ParameterSet const &conf, const MagneticField *, const SiPixelLorentzAngle *)
 The constructor.
 ~PixelCPEGeneric ()

Protected Member Functions

float xpos (const SiPixelCluster &) const
float ypos (const SiPixelCluster &) const

Private Member Functions

void collect_edge_charges (const SiPixelCluster &cluster, float &Q_f_X, float &Q_l_X, float &Q_m_X, float &Q_f_Y, float &Q_l_Y, float &Q_m_Y) const
 Collect the edge charges in x and y, in a single pass over the pixel vector.
float err2X (bool &, int &) const
float err2Y (bool &, int &) const
double generic_position_formula (int size, double Q_f, double Q_l, double upper_edge_first_pix, double lower_edge_last_pix, double half_lorentz_shift, double cot_angle, double pitch, bool first_is_big, bool last_is_big, double eff_charge_cut_low, double eff_charge_cut_high, double size_cut, float &cot_angle_from_length) const
 A generic version of the position formula.

Private Attributes

double the_eff_charge_cut_highX
double the_eff_charge_cut_highY
double the_eff_charge_cut_lowX
double the_eff_charge_cut_lowY
double the_size_cutX
double the_size_cutY


Detailed Description

Definition at line 55 of file PixelCPEGeneric.h.


Constructor & Destructor Documentation

PixelCPEGeneric::PixelCPEGeneric ( edm::ParameterSet const &  conf,
const MagneticField mag,
const SiPixelLorentzAngle lorentzAngle 
)

The constructor.

Definition at line 20 of file PixelCPEGeneric.cc.

References edm::ParameterSet::getUntrackedParameter(), LogDebug, 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, and PixelCPEBase::theVerboseLevel.

00022   : PixelCPEBase(conf, mag, lorentzAngle)
00023 {
00024   if (theVerboseLevel > 0) 
00025     LogDebug("PixelCPEGeneric") 
00026       << " constructing a generic algorithm for ideal pixel detector.\n"
00027       << " CPEGeneric:: VerboseLevel = " << theVerboseLevel;
00028 
00029   //dfehling  
00030   the_eff_charge_cut_lowX = conf.getUntrackedParameter<double>("eff_charge_cut_lowX");
00031   the_eff_charge_cut_lowY = conf.getUntrackedParameter<double>("eff_charge_cut_lowY");
00032   the_eff_charge_cut_highX = conf.getUntrackedParameter<double>("eff_charge_cut_highX");
00033   the_eff_charge_cut_highY = conf.getUntrackedParameter<double>("eff_charge_cut_highY");
00034   the_size_cutX = conf.getUntrackedParameter<double>("size_cutX");
00035   the_size_cutY = conf.getUntrackedParameter<double>("size_cutY");
00036 }

PixelCPEGeneric::~PixelCPEGeneric (  )  [inline]

Definition at line 60 of file PixelCPEGeneric.h.

00061 {;}


Member Function Documentation

void PixelCPEGeneric::collect_edge_charges ( const SiPixelCluster cluster,
float &  Q_f_X,
float &  Q_l_X,
float &  Q_m_X,
float &  Q_f_Y,
float &  Q_l_Y,
float &  Q_m_Y 
) const [private]

Collect the edge charges in x and y, in a single pass over the pixel vector.

Calculate charge in the first and last pixel projected in x and y and the inner cluster charge, projected in x and y.

Parameters:
cluster  input, the cluster
Q_f_X  output, Q first in X
Q_l_X  output, Q last in X
Q_m_X  output, Q middle in X
Q_f_Y  output, Q first in Y
Q_l_Y  output, Q last in Y
Q_m_Y  output, Q middle in Y

Definition at line 288 of file PixelCPEGeneric.cc.

References ecalMGPA::adc(), i, SiPixelCluster::maxPixelCol(), SiPixelCluster::maxPixelRow(), SiPixelCluster::minPixelCol(), SiPixelCluster::minPixelRow(), SiPixelCluster::pixels(), x, y, gen_jpsi2muons_cfg::ymax, and gen_jpsi2muons_cfg::ymin.

Referenced by localPosition().

00296 {
00297   // Initialize return variables.
00298   Q_f_X = Q_l_X = Q_m_X = 0.0;
00299   Q_f_Y = Q_l_Y = Q_m_Y = 0.0;
00300 
00301   // Fetch the pixels vector from the cluster.
00302   const vector<SiPixelCluster::Pixel>& pixelsVec = cluster.pixels();
00303 
00304   // Obtain boundaries in index units
00305   int xmin = cluster.minPixelRow();
00306   int xmax = cluster.maxPixelRow();
00307   int ymin = cluster.minPixelCol();
00308   int ymax = cluster.maxPixelCol();
00309 
00310 //   // Obtain the cluster boundaries (note: in measurement units!)
00311 //   float xmin = cluster.minPixelRow()+0.5;
00312 //   float xmax = cluster.maxPixelRow()+0.5;  
00313 //   float ymin = cluster.minPixelCol()+0.5;
00314 //   float ymax = cluster.maxPixelCol()+0.5;
00315   
00316   // Iterate over the pixels.
00317   int isize = pixelsVec.size();
00318   for (int i = 0;  i < isize; ++i) {
00319     //
00320     // X projection
00321     if (pixelsVec[i].x == xmin)       // need to match with tolerance!!! &&&
00322       Q_f_X += float(pixelsVec[i].adc);
00323     else if (pixelsVec[i].x == xmax) 
00324       Q_l_X += float(pixelsVec[i].adc);
00325     else 
00326       Q_m_X += float(pixelsVec[i].adc);
00327     //
00328     // Y projection
00329     if (pixelsVec[i].y == ymin) 
00330       Q_f_Y += float(pixelsVec[i].adc);
00331     else if (pixelsVec[i].y == ymax) 
00332       Q_l_Y += float(pixelsVec[i].adc);
00333     else 
00334       Q_m_Y += float(pixelsVec[i].adc);
00335   }
00336 
00337   return;
00338 } 

float PixelCPEGeneric::err2X ( bool edgex,
int sizex 
) const [private]

Definition at line 403 of file PixelCPEGeneric.cc.

References GeomDetEnumerators::PixelBarrel, PixelCPEBase::thePart, and PixelCPEBase::thePitchX.

Referenced by localError().

00404 {
00405 // Assign maximum error
00406   // if edge cluster the maximum error is assigned: Pitch/sqrt(12)=43mu
00407   //  float xerr = 0.0043; 
00408   float xerr = thePitchX/3.464;
00409   //
00410   // Pixels not at the edge: errors parameterized as function of the cluster size
00411   // V.Chiochia - 12/4/06
00412   //
00413   if (!edgex){
00414     //    if (fabs(thePitchX-0.010)<0.001){   // 100um pixel size
00415       if (thePart == GeomDetEnumerators::PixelBarrel) {
00416         if ( sizex == 1) xerr = 0.00115;      // Size = 1 -> Sigma = 11.5 um 
00417         else if ( sizex == 2) xerr = 0.0012;  // Size = 2 -> Sigma = 12 um      
00418         else if ( sizex == 3) xerr = 0.00088; // Size = 3 -> Sigma = 8.8 um
00419         else xerr = 0.0103;
00420       } else { //forward
00421         if ( sizex == 1) {
00422           xerr = 0.0020;
00423         }  else if ( sizex == 2) {
00424           xerr = 0.0020;
00425           // xerr = (0.005351 - atan(fabs(theDetZ/theDetR)) * 0.003291);  
00426         } else {
00427           xerr = 0.0020;
00428           //xerr = (0.003094 - atan(fabs(theDetZ/theDetR)) * 0.001854);  
00429         }
00430       }
00431       //    }
00432 //     }else if (fabs(thePitchX-0.015)<0.001){  // 150 um pixel size
00433 //       if (thePart == GeomDetEnumerators::PixelBarrel) {
00434 //      if ( sizex == 1) xerr = 0.0014;     // 14um 
00435 //      else xerr = 0.0008;   // 8um      
00436 //       } else { //forward
00437 //      if ( sizex == 1) 
00438 //        xerr = (-0.00385 + atan(fabs(theDetZ/theDetR)) * 0.00407);
00439 //      else xerr = (0.00366 - atan(fabs(theDetZ/theDetR)) * 0.00209);  
00440 //       }
00441 //     }
00442 
00443   }
00444   return xerr*xerr;
00445 }

float PixelCPEGeneric::err2Y ( bool edgey,
int sizey 
) const [private]

Definition at line 454 of file PixelCPEGeneric.cc.

References GeomDetEnumerators::PixelBarrel, PixelCPEBase::thePart, and PixelCPEBase::thePitchY.

Referenced by localError().

00455 {
00456 // Assign maximum error
00457 // if edge cluster the maximum error is assigned: Pitch/sqrt(12)=43mu
00458 //  float yerr = 0.0043;
00459   float yerr = thePitchY/3.464; 
00460           if (!edgey){
00461     if (thePart == GeomDetEnumerators::PixelBarrel) { // Barrel
00462       if ( sizey == 1) {
00463         yerr = 0.00375;     // 37.5um 
00464       } else if ( sizey == 2) {
00465         yerr = 0.0023;   // 23 um      
00466       } else if ( sizey == 3) {
00467         yerr = 0.0025; // 25 um
00468       } else if ( sizey == 4) {
00469         yerr = 0.0025; // 25um
00470       } else if ( sizey == 5) {
00471         yerr = 0.0023; // 23um
00472       } else if ( sizey == 6) {
00473         yerr = 0.0023; // 23um
00474       } else if ( sizey == 7) {
00475         yerr = 0.0021; // 21um
00476       } else if ( sizey == 8) {
00477         yerr = 0.0021; // 21um
00478       } else if ( sizey == 9) {
00479         yerr = 0.0024; // 24um
00480       } else if ( sizey >= 10) {
00481         yerr = 0.0021; // 21um
00482       }
00483     } else { // Endcaps
00484       if ( sizey == 1)      yerr = 0.0021; // 21 um
00485       else if ( sizey >= 2) yerr = 0.00075;// 7.5 um
00486     }
00487   }
00488   return yerr*yerr;
00489 }

double PixelCPEGeneric::generic_position_formula ( int  size,
double  Q_f,
double  Q_l,
double  upper_edge_first_pix,
double  lower_edge_last_pix,
double  half_lorentz_shift,
double  cot_angle,
double  pitch,
bool  first_is_big,
bool  last_is_big,
double  eff_charge_cut_low,
double  eff_charge_cut_high,
double  size_cut,
float &  cot_angle_from_length 
) const [private]

A generic version of the position formula.

Since it works for both X and Y, in the interest of the simplicity of the code, all parameters are passed by the caller. The only class variable used by this method is the theThickness, since that's common for both X and Y.

Parameters:
size  Size of this projection.
Q_f  Charge in the first pixel.
Q_l  Charge in the last pixel.
upper_edge_first_pix  As the name says.
lower_edge_last_pix  As the name says.
half_lorentz_shift  L-shift at half thickness
cot_angle  cot of alpha_ or beta_
pitch  thePitchX or thePitchY
first_is_big  true if the first is big
last_is_big  true if the last is big
eff_charge_cut_low  Use edge if > W_eff (in pix) &&&
eff_charge_cut_high  Use edge if < W_eff (in pix) &&&
size_cut  Use edge when size == cuts
cot_angle_from_length  Aux output: angle from len

Definition at line 160 of file PixelCPEGeneric.cc.

References GenMuonPlsPt100GeV_cfg::cout, lat::endl(), PixelCPEBase::nRecHitsTotal_, PixelCPEBase::nRecHitsUsedEdge_, GeomDetEnumerators::PixelBarrel, PixelCPEBase::thePart, PixelCPEBase::theThickness, and PixelCPEBase::theVerboseLevel.

Referenced by localPosition().

00173                                                                         : angle from len
00174                           ) const
00175 {
00176   double geom_center = 0.5 * ( upper_edge_first_pix + lower_edge_last_pix );
00177 
00178   //--- The case of only one pixel in this projection is separate.  Note that
00179   //--- here first_pix == last_pix, so the average of the two is still the
00180   //--- center of the pixel.
00181   if (size == 1) {
00182     return geom_center + half_lorentz_shift;
00183   }
00184 
00185 
00186   //--- Width of the clusters minus the edge (first and last) pixels.
00187   //--- In the note, they are denoted x_F and x_L (and y_F and y_L)
00188   double W_inner      = lower_edge_last_pix - upper_edge_first_pix;  // in cm
00189 
00190 
00191   //--- Predicted charge width from geometry
00192   double W_pred = 
00193     theThickness * cot_angle                     // geometric correction (in cm)
00194     - 2 * half_lorentz_shift;                    // (in cm) &&& check fpix!  
00195   
00196 
00197   //--- Total length of the two edge pixels (first+last)
00198   double sum_of_edge = 0.0;
00199   if (first_is_big) sum_of_edge += 2.0;
00200   else              sum_of_edge += 1.0;
00201   
00202   if (last_is_big)  sum_of_edge += 2.0;
00203   else              sum_of_edge += 1.0;
00204   
00205 
00206   //--- The `effective' charge width -- particle's path in first and last pixels only
00207   double W_eff = fabs( W_pred ) - W_inner;
00208 
00209 
00210   //--- If the observed charge width is inconsistent with the expectations
00211   //--- based on the track, do *not* use W_pred-W_innner.  Instead, replace
00212   //--- it with an *average* effective charge width, which is the average
00213   //--- length of the edge pixels.
00214   //
00215   bool usedEdgeAlgo = false;
00216   if (( W_eff/pitch < eff_charge_cut_low ) ||
00217       ( W_eff/pitch > eff_charge_cut_high ) || (size >= size_cut)) 
00218     {
00219       W_eff = pitch * 0.5 * sum_of_edge;  // ave. length of edge pixels (first+last) (cm)
00220       usedEdgeAlgo = true;
00221       nRecHitsUsedEdge_++;
00222     }
00223 
00224   
00225   //--- Finally, compute the position in this projection
00226   double Qdiff = Q_l - Q_f;
00227   double Qsum  = Q_l + Q_f;
00228   double hit_pos = geom_center + 0.5*(Qdiff/Qsum) * W_eff + half_lorentz_shift;
00229   
00230 
00231 
00232   //--- At the end, also compute the *average* angle consistent
00233   //--- with the cluster length in this dimension.  This variable will
00234   //--- be copied to cotAlphaFromCluster_ and cotBetaFromCluster_.  It's
00235   //--- basically inverting W_pred to get cot_angle, except this one is
00236   //--- driven by the cluster length.
00237   //--- (See the comment in PixelCPEBase header file for what these are for.)
00238   double ave_path_length_projected =
00239     pitch*0.5*sum_of_edge + W_inner - 2*half_lorentz_shift;
00240   cot_angle_from_length = ave_path_length_projected / theThickness;
00241 
00242   
00243   //--- Debugging output
00244   if (theVerboseLevel > 20) {
00245     if ( thePart == GeomDetEnumerators::PixelBarrel ) {
00246       cout << "\t >>> We are in the Barrel." ;
00247     } else {
00248       cout << "\t >>> We are in the Forward." ;
00249     }
00250     cout 
00251       << "\n\t >>> cot(angle) = " << cot_angle << "  pitch = " << pitch << "  size = " << size
00252       << "\n\t >>> upper_edge_first_pix = " << upper_edge_first_pix
00253       << "\n\t >>> lower_edge_last_pix  = " << lower_edge_last_pix
00254       << "\n\t >>> geom_center          = " << geom_center
00255       << "\n\t >>> half_lorentz_shift   = " << half_lorentz_shift
00256       << "\n\t >>> W_inner              = " << W_inner
00257       << "\n\t >>> W_pred               = " << W_pred
00258       << "\n\t >>> W_eff(orig)          = " << fabs( W_pred ) - W_inner
00259       << "\n\t >>> W_eff(used)          = " << W_eff
00260       << "\n\t >>> sum_of_edge          = " << sum_of_edge
00261       << "\n\t >>> Qdiff = " << Qdiff << "  Qsum = " << Qsum 
00262       << "\n\t >>> hit_pos              = " << hit_pos 
00263       << "\n\t >>> RecHits: total = " << nRecHitsTotal_ 
00264       << "  used edge = " << nRecHitsUsedEdge_
00265       << endl;
00266     if (usedEdgeAlgo) 
00267       cout << "\n\t >>> Used Edge algorithm." ;
00268     else
00269       cout << "\n\t >>> Used angle information." ;
00270     cout << endl;
00271   }
00272 
00273 
00274   return hit_pos;
00275 }

LocalError PixelCPEGeneric::localError ( const SiPixelCluster cl,
const GeomDetUnit det 
) const [virtual]

Implements PixelCPEBase.

Definition at line 361 of file PixelCPEGeneric.cc.

References err2X(), err2Y(), RectangularPixelTopology::isItEdgePixelInX(), RectangularPixelTopology::isItEdgePixelInY(), LogDebug, SiPixelCluster::maxPixelCol(), SiPixelCluster::maxPixelRow(), SiPixelCluster::minPixelCol(), SiPixelCluster::minPixelRow(), PixelCPEBase::setTheDet(), SiPixelCluster::sizeX(), SiPixelCluster::sizeY(), PixelCPEBase::theTopol, and PixelCPEBase::theVerboseLevel.

00362                                                                {
00363   setTheDet( det );
00364   int sizex = cluster.sizeX();
00365   int sizey = cluster.sizeY();
00366 
00367   // Find edge clusters
00368   //bool edgex = (cluster.edgeHitX()) || (cluster.maxPixelRow()> theNumOfRow);//wrong 
00369   //bool edgey = (cluster.edgeHitY()) || (cluster.maxPixelCol() > theNumOfCol);   
00370   /* bool edgex = (cluster.minPixelRow()==0) ||  // use min and max pixels
00371    (cluster.maxPixelRow()==(theNumOfRow-1));
00372    bool edgey = (cluster.minPixelCol()==0) ||
00373    (cluster.maxPixelCol()==(theNumOfCol-1));*/
00374 
00375   // Use edge methods from the Toplogy class
00376   int maxPixelCol = cluster.maxPixelCol();
00377   int maxPixelRow = cluster.maxPixelRow();
00378   int minPixelCol = cluster.minPixelCol();
00379   int minPixelRow = cluster.minPixelRow();       
00380   // edge method moved to topologu class
00381   bool edgex = (theTopol->isItEdgePixelInX(minPixelRow)) ||
00382     (theTopol->isItEdgePixelInX(maxPixelRow));
00383   bool edgey = (theTopol->isItEdgePixelInY(minPixelCol)) ||
00384     (theTopol->isItEdgePixelInY(maxPixelCol));
00385   
00386   //&&& testing...
00387   if (theVerboseLevel > 9) {
00388     LogDebug("PixelCPEGeneric") <<
00389       "Sizex = " << sizex << 
00390       " Sizey = " << sizey << 
00391       " Edgex = " << edgex << 
00392       " Edgey = " << edgey ;
00393   }
00394 
00395   return LocalError( err2X(edgex, sizex), 0, err2Y(edgey, sizey) );
00396 }

LocalPoint PixelCPEGeneric::localPosition ( const SiPixelCluster cluster,
const GeomDetUnit det 
) const [virtual]

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

< Initialize this det unit

< correctly compute lorentz shifts in X and Y

< Q of the first pixel in X

< Q of the last pixel in X

< Q of the middle pixels in X

< Q of the first pixel in Y

< Q of the last pixel in Y

< Q of the middle pixels in Y

Reimplemented from PixelCPEBase.

Definition at line 55 of file PixelCPEGeneric.cc.

References collect_edge_charges(), PixelCPEBase::computeLorentzShifts(), PixelCPEBase::cotalpha_, PixelCPEBase::cotAlphaFromCluster_, PixelCPEBase::cotbeta_, PixelCPEBase::cotBetaFromCluster_, GenMuonPlsPt100GeV_cfg::cout, lat::endl(), generic_position_formula(), RectangularPixelTopology::isItBigPixelInX(), RectangularPixelTopology::isItBigPixelInY(), RectangularPixelTopology::localPosition(), PixelCPEBase::lorentzShiftInCmX_, PixelCPEBase::lorentzShiftInCmY_, SiPixelCluster::maxPixelCol(), SiPixelCluster::maxPixelRow(), SiPixelCluster::minPixelCol(), SiPixelCluster::minPixelRow(), PixelCPEBase::setTheDet(), SiPixelCluster::sizeX(), SiPixelCluster::sizeY(), 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, PixelCPEBase::thePitchX, PixelCPEBase::thePitchY, PixelCPEBase::theTopol, PixelCPEBase::theVerboseLevel, SiPixelCluster::x(), PV3DBase< T, PVType, FrameType >::x(), SiPixelCluster::y(), and PV3DBase< T, PVType, FrameType >::y().

Referenced by measurementPosition().

00057 {
00058   setTheDet( det );  
00059   computeLorentzShifts();  
00060 
00061   float Q_f_X = 0.0;        
00062   float Q_l_X = 0.0;        
00063   float Q_m_X = 0.0;        
00064   float Q_f_Y = 0.0;        
00065   float Q_l_Y = 0.0;        
00066   float Q_m_Y = 0.0;        
00067   collect_edge_charges( cluster, 
00068                         Q_f_X, Q_l_X, Q_m_X, 
00069                         Q_f_Y, Q_l_Y, Q_m_Y );
00070 
00071   //--- Find the inner widths along X and Y in one shot.  We
00072   //--- compute the upper right corner of the inner pixels
00073   //--- (== lower left corner of upper right pixel) and
00074   //--- the lower left corner of the inner pixels
00075   //--- (== upper right corner of lower left pixel), and then
00076   //--- subtract these two points in the formula.
00077 
00078   //--- Upper Right corner of Lower Left pixel -- in measurement frame
00079   MeasurementPoint meas_URcorn_LLpix( cluster.minPixelRow()+1.0,
00080                                       cluster.minPixelCol()+1.0 );
00081 
00082   //--- Lower Left corner of Upper Right pixel -- in measurement frame
00083   MeasurementPoint meas_LLcorn_URpix( cluster.maxPixelRow(),
00084                                       cluster.maxPixelCol() );
00085 
00086   //--- These two now converted into the local
00087   LocalPoint local_URcorn_LLpix = theTopol->localPosition(meas_URcorn_LLpix);
00088   LocalPoint local_LLcorn_URpix = theTopol->localPosition(meas_LLcorn_URpix);
00089   if (theVerboseLevel > 20) {
00090     cout  
00091       << "\n\t >>> cluster.x = " << cluster.x()
00092       << "\n\t >>> cluster.y = " << cluster.y()
00093       << "\n\t >>> cluster: minRow = " << cluster.minPixelRow()
00094       << "  minCol = " << cluster.minPixelCol()
00095       << "\n\t >>> cluster: maxRow = " << cluster.maxPixelRow()
00096       << "  maxCol = " << cluster.maxPixelCol()
00097       << "\n\t >>> meas: inner lower left  = " << meas_URcorn_LLpix.x() 
00098       << "," << meas_URcorn_LLpix.y()
00099       << "\n\t >>> meas: inner upper right = " << meas_LLcorn_URpix.x() 
00100       << "," << meas_LLcorn_URpix.y() 
00101       << endl;
00102   }
00103 
00104   //--- &&& Note that the cuts below should not be hardcoded (like in Orca and
00105   //--- &&& CPEFromDetPosition/PixelCPEInitial), but rather be
00106   //--- &&& externally settable (but tracked) parameters.  
00107 
00108   double angle_from_clust = 0;
00109 
00110   //--- Position, including the half lorentz shift
00111   if (theVerboseLevel > 20) 
00112     cout << "\t >>> Generic:: processing X" << endl;
00113   float xPos = 
00114     generic_position_formula( cluster.sizeX(),
00115                               Q_f_X, Q_l_X, 
00116                               local_URcorn_LLpix.x(), local_LLcorn_URpix.x(),
00117                               0.5*lorentzShiftInCmX_,   // 0.5 * lorentz shift in 
00118                               cotalpha_,
00119                               thePitchX,
00120                               theTopol->isItBigPixelInX( cluster.minPixelRow() ),
00121                               theTopol->isItBigPixelInX( cluster.maxPixelRow() ),
00122                               the_eff_charge_cut_lowX,
00123                               the_eff_charge_cut_highX,
00124                               the_size_cutX,           // cut for eff charge width &&&
00125                               cotAlphaFromCluster_ );  // returned to us
00126 
00127 
00128   if (theVerboseLevel > 20) 
00129     cout << "\t >>> Generic:: processing Y" << endl;
00130   float yPos = 
00131     generic_position_formula( cluster.sizeY(),
00132                               Q_f_Y, Q_l_Y, 
00133                               local_URcorn_LLpix.y(), local_LLcorn_URpix.y(),
00134                               0.5*lorentzShiftInCmY_,   // 0.5 * lorentz shift in cm
00135                               cotbeta_,
00136                               thePitchY,   // 0.5 * lorentz shift (may be 0)
00137                               theTopol->isItBigPixelInY( cluster.minPixelCol() ),
00138                               theTopol->isItBigPixelInY( cluster.maxPixelCol() ),
00139                               the_eff_charge_cut_lowY,
00140                               the_eff_charge_cut_highY,
00141                               the_size_cutY,           // cut for eff charge width &&&
00142                               cotBetaFromCluster_ );   // returned to us
00143 
00144 
00145   //--- Now put the two together
00146   LocalPoint pos_in_local(xPos,yPos);
00147   return pos_in_local;
00148 }

MeasurementPoint PixelCPEGeneric::measurementPosition ( const SiPixelCluster cluster,
const GeomDetUnit det 
) const

Reimplemented from PixelCPEBase.

Definition at line 40 of file PixelCPEGeneric.cc.

References localPosition(), lp, RectangularPixelTopology::measurementPosition(), and PixelCPEBase::theTopol.

00042 {
00043   LocalPoint lp = localPosition(cluster,det);
00044   return theTopol->measurementPosition(lp);
00045 }

float PixelCPEGeneric::xpos ( const SiPixelCluster  )  const [inline, protected, virtual]

Implements PixelCPEBase.

Definition at line 120 of file PixelCPEGeneric.h.

00121 { return -999000.0; }  // &&& should abort

float PixelCPEGeneric::ypos ( const SiPixelCluster  )  const [inline, protected, virtual]

Implements PixelCPEBase.

Definition at line 121 of file PixelCPEGeneric.h.

00121 { return -999000.0; }  // &&& should abort


Member Data Documentation

double PixelCPEGeneric::the_eff_charge_cut_highX [private]

Definition at line 112 of file PixelCPEGeneric.h.

Referenced by localPosition(), and PixelCPEGeneric().

double PixelCPEGeneric::the_eff_charge_cut_highY [private]

Definition at line 113 of file PixelCPEGeneric.h.

Referenced by localPosition(), and PixelCPEGeneric().

double PixelCPEGeneric::the_eff_charge_cut_lowX [private]

Definition at line 110 of file PixelCPEGeneric.h.

Referenced by localPosition(), and PixelCPEGeneric().

double PixelCPEGeneric::the_eff_charge_cut_lowY [private]

Definition at line 111 of file PixelCPEGeneric.h.

Referenced by localPosition(), and PixelCPEGeneric().

double PixelCPEGeneric::the_size_cutX [private]

Definition at line 114 of file PixelCPEGeneric.h.

Referenced by localPosition(), and PixelCPEGeneric().

double PixelCPEGeneric::the_size_cutY [private]

Definition at line 115 of file PixelCPEGeneric.h.

Referenced by localPosition(), and PixelCPEGeneric().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:30:00 2009 for CMSSW by  doxygen 1.5.4