CMS 3D CMS Logo

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

#include <SiPixelTemplate2D.h>

Public Member Functions

float chi2avgone ()
 average y chi^2 for 1 pixel clusters More...
 
float chi2minone ()
 minimum of y chi^2 for 1 pixel clusters More...
 
float chi2ppix ()
 average chi^2 per struck pixel More...
 
float chi2scale ()
 scale factor for chi^2 distribution More...
 
float clslenx ()
 cluster x-size More...
 
float clsleny ()
 cluster y-size More...
 
float delyavg ()
 average difference between clsleny_ and cluster length [with threshold effects] More...
 
float delysig ()
 rms difference between clsleny_ and cluster length [with threshold effects] More...
 
float fbin (int i)
 Return lower bound of Qbin definition. More...
 
bool getid (int id)
 
bool interpolate (int id, float cotalpha, float cotbeta, float locBz, float locBx)
 
float kappavav ()
 kappa parameter in Vavilov distribution More...
 
void landau_par (float lanpar[2][5])
 Return the Landau probability parameters for this set of cot(alpha, cot(beta) More...
 
float lorxdrift ()
 signed lorentz x-width (microns) More...
 
float lorydrift ()
 signed lorentz y-width (microns) More...
 
float mpvvav ()
 most probable Q in Vavilov distribution More...
 
float offsetx (int i)
 x-offset in 4 charge bins More...
 
float offsety (int i)
 y-offset in 4 charge bins More...
 
float pixmax ()
 maximum pixel charge More...
 
float qavg ()
 average cluster charge for this set of track angles More...
 
float qscale ()
 charge scaling factor More...
 
float s50 ()
 1/2 of the pixel threshold signal in adc units More...
 
float scalex (int i)
 x-error scale factor in 4 charge bins More...
 
float scalexavg ()
 x-reco error scaling factor More...
 
float scaley (int i)
 y-error scale factor in 4 charge bins More...
 
float scaleyavg ()
 y-reco error scaling factor More...
 
void sideload (SiPixelTemplateEntry2D *entry, int iDtype, float locBx, float locBz, float lorwdy, float lorwdx, float q50, float fbin[3], float xsize, float ysize, float zsize)
 
float sigmavav ()
 scale factor in Vavilov distribution More...
 
 SiPixelTemplate2D (const std::vector< SiPixelTemplateStore2D > &thePixelTemp)
 Default constructor. More...
 
float sizex ()
 return x size of template cluster More...
 
float sizey ()
 return y size of template cluster More...
 
int storesize ()
 return the size of the template store (the number of stored IDs More...
 
float sxymax ()
 max pixel signal for pixel error calculation More...
 
float xsize ()
 pixel x-size (microns) More...
 
void xysigma2 (float qpixel, int index, float &xysig2)
 
bool xytemp (float xhit, float yhit, bool ydouble[21+2], bool xdouble[13+2], float template2d[13+2][21+2], bool dervatives, float dpdx2d[2][13+2][21+2], float &QTemplate)
 
bool xytemp (float xhit, float yhit, bool ydouble[21+2], bool xdouble[13+2], float template2d[13+2][21+2])
 
bool xytemp (int id, float cotalpha, float cotbeta, float xhit, float yhit, std::vector< bool > &ydouble, std::vector< bool > &xdouble, float template2d[13+2][21+2])
 
float ysize ()
 pixel y-size (microns) More...
 
float zsize ()
 pixel z-size or thickness (microns) More...
 

Static Public Member Functions

static bool pushfile (int filenum, std::vector< SiPixelTemplateStore2D > &pixelTemp, std::string dir="")
 
static bool pushfile (const SiPixel2DTemplateDBObject &dbobject, std::vector< SiPixelTemplateStore2D > &pixelTemp)
 

Private Member Functions

bool checkIllegalIndex (const std::string whichMethod, int indMax, int i)
 

Private Attributes

float adcota_
 fractional pixel distance of cot(alpha) from jx0_ More...
 
float adcotb_
 fractional pixel distance of cot(beta) from iy0_ More...
 
float chi2avgone_
 average chi^2 for 1 pixel clusters More...
 
float chi2minone_
 minimum of chi^2 for 1 pixel clusters More...
 
float chi2ppix_
 average chi^2 per struck pixel More...
 
float chi2scale_
 scale factor for chi2 distribution More...
 
float clslenx_
 projected x-length of cluster More...
 
float clsleny_
 projected y-length of cluster More...
 
float cota_current_
 current cot alpha More...
 
float cotalpha0_
 minimum cot(alpha) covered More...
 
float cotalpha1_
 maximum cot(alpha) covered More...
 
float cotb_current_
 current cot beta More...
 
float cotbeta0_
 minimum cot(beta) covered More...
 
float cotbeta1_
 maximum cot(beta) covered More...
 
float deltacota_
 cot(alpha) bin size More...
 
float deltacotb_
 cot(beta) bin size More...
 
float delyavg_
 average difference between clsleny_ and cluster length [with threshold effects] More...
 
float delysig_
 rms of difference between clsleny_ and cluster length [with threshold effects] More...
 
int Dtype_
 flags BPix (=0) or FPix (=1) More...
 
const SiPixelTemplateEntry2Dentry00_
 
const SiPixelTemplateEntry2Dentry01_
 
const SiPixelTemplateEntry2Dentry10_
 
float fbin_ [3]
 The QBin definitions in Q_clus/Q_avg. More...
 
bool flip_x_
 flip x sign-sensitive quantities More...
 
bool flip_y_
 flip y sign-sensitive quantities More...
 
int id_current_
 current id More...
 
int imax_
 max y index of templated cluster More...
 
int imin_
 min y index of templated cluster More...
 
int index_id_
 current index More...
 
int iy0_
 index of nearest cot(beta) bin More...
 
int iy1_
 index of next-nearest cot(beta) bin More...
 
int jmax_
 max x index of templated cluster More...
 
int jmin_
 min x index of templated cluster More...
 
int jx0_
 index of nearest cot(alpha) bin More...
 
int jx1_
 index of next-nearest cot(alpha) bin More...
 
float kappavav_
 kappa parameter in Vavilov distribution More...
 
float lanpar_ [2][5]
 Interpolated Landau parameters. More...
 
float lorxdrift_
 Lorentz x-drift. More...
 
float lorxwidth_
 Lorentz x-width. More...
 
float lorydrift_
 Lorentz y-drift. More...
 
float lorywidth_
 Lorentz y-width (sign corrected for fpix frame) More...
 
float mpvvav_
 most probable Q in Vavilov distribution More...
 
int Nxx_
 number of cot(alpha)-entries (rows) in template More...
 
int Nyx_
 number of cot(beta)-entries (columns) in template More...
 
float offsetx_ [4]
 x-offset in charge bins More...
 
float offsety_ [4]
 y-offset in charge bins More...
 
float pixmax_
 maximum pixel charge More...
 
float qavg_
 average cluster charge for this set of track angles More...
 
float qscale_
 charge scaling factor More...
 
float s50_
 1/2 of the pixel threshold signal in adc units More...
 
float scalex_ [4]
 x-error scale factor in charge bins More...
 
float scalexavg_
 average x-error scale factor More...
 
float scaley_ [4]
 y-error scale factor in charge bins More...
 
float scaleyavg_
 average y-error scale factor More...
 
float sigmavav_
 scale factor in Vavilov distribution More...
 
bool success_
 true if cotalpha, cotbeta are inside of the acceptance (dynamically loaded) More...
 
float sxymax_
 average pixel signal for y-projection of cluster More...
 
const std::vector< SiPixelTemplateStore2D > & thePixelTemp_
 
float xsize_
 Pixel x-size. More...
 
float xypary0x0_ [2][5]
 Polynomial error parameterization at ix0,iy0. More...
 
float xypary0x1_ [2][5]
 Polynomial error parameterization at ix1,iy0. More...
 
float xypary1x0_ [2][5]
 Polynomial error parameterization at ix0,iy1. More...
 
float xytemp_ [13+2][21+2]
 template for xy-reconstruction More...
 
float ysize_
 Pixel y-size. More...
 
float zsize_
 Pixel z-size (thickness) More...
 

Detailed Description

A template management class. SiPixelTemplate contains thePixelTemp (a std::vector of SiPixelTemplateStore, each of which is a collection of many SiPixelTemplateEntries). Each SiPixelTemplateStore corresponds to a given detector condition, and is valid for a range of runs. We allow more than one Store since the may change over time.

This class reads templates from files via pushfile() method.

The main functionality of SiPixelTemplate is xytemp(), which produces a template on the fly, given a specific track's alpha and beta. The results are kept in data members and accessed via inline getters.

The resulting template is then used by PixelTempReco2D() (a global function) which get the reference for SiPixelTemplate & templ and uses the current template to reconstruct the SiPixelRecHit.

Definition at line 141 of file SiPixelTemplate2D.h.

Constructor & Destructor Documentation

SiPixelTemplate2D::SiPixelTemplate2D ( const std::vector< SiPixelTemplateStore2D > &  thePixelTemp)
inline

Member Function Documentation

bool SiPixelTemplate2D::checkIllegalIndex ( const std::string  whichMethod,
int  indMax,
int  i 
)
inlineprivate

Definition at line 215 of file SiPixelTemplate2D.h.

References Exception.

216  {
217 #ifndef SI_PIXEL_TEMPLATE_STANDALONE
218  if(i < 0 || i > indMax) {throw cms::Exception("DataCorrupt") << "SiPixelTemplate2D::"<< whichMethod <<" called with illegal index = " << i << std::endl;}
219 #else
220  assert(i>=0 && i<indMax+1);
221 
222 #endif
223  return true;
224  }
float SiPixelTemplate2D::chi2avgone ( )
inline

average y chi^2 for 1 pixel clusters

Definition at line 195 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::chi2minone ( )
inline

minimum of y chi^2 for 1 pixel clusters

Definition at line 196 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::chi2ppix ( )
inline

average chi^2 per struck pixel

Definition at line 193 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

float SiPixelTemplate2D::chi2scale ( )
inline

scale factor for chi^2 distribution

Definition at line 194 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

float SiPixelTemplate2D::clslenx ( )
inline

cluster x-size

Definition at line 203 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::clsleny ( )
inline

cluster y-size

Definition at line 202 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

float SiPixelTemplate2D::delyavg ( )
inline

average difference between clsleny_ and cluster length [with threshold effects]

Definition at line 206 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::delysig ( )
inline

rms difference between clsleny_ and cluster length [with threshold effects]

Definition at line 207 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::fbin ( int  i)
inline

Return lower bound of Qbin definition.

Definition at line 190 of file SiPixelTemplate2D.h.

References mps_fire::i.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

bool SiPixelTemplate2D::getid ( int  id)

Definition at line 522 of file SiPixelTemplate2D.cc.

References Exception, mps_fire::i, triggerObjects_cff::id, and createfilelist::int.

Referenced by SiPixelDigitizerAlgorithm::PixelTempRewgt2D().

523 {
524  if(id != id_current_) {
525 
526  // Find the index corresponding to id
527 
528  index_id_ = -1;
529  for(int i=0; i<(int)thePixelTemp_.size(); ++i) {
530 
531  if(id == thePixelTemp_[i].head.ID) {
532 
533  index_id_ = i;
534  id_current_ = id;
535 
536  // Copy the charge scaling factor to the private variable
537 
538  Dtype_ = thePixelTemp_[index_id_].head.Dtype;
539 
540  // Copy the charge scaling factor to the private variable
541 
542  qscale_ = thePixelTemp_[index_id_].head.qscale;
543 
544  // Copy the pseudopixel signal size to the private variable
545 
546  s50_ = thePixelTemp_[index_id_].head.s50;
547 
548  // Copy Qbinning info to private variables
549 
550  for(int j=0; j<3; ++j) {fbin_[j] = thePixelTemp_[index_id_].head.fbin[j];}
551 
552  // Copy the Lorentz widths to private variables
553 
554  lorywidth_ = thePixelTemp_[index_id_].head.lorywidth;
555  lorxwidth_ = thePixelTemp_[index_id_].head.lorxwidth;
556 
557  // Copy the pixel sizes private variables
558 
559  xsize_ = thePixelTemp_[index_id_].head.xsize;
560  ysize_ = thePixelTemp_[index_id_].head.ysize;
561  zsize_ = thePixelTemp_[index_id_].head.zsize;
562 
563  // Determine the size of this template
564 
565  Nyx_ = thePixelTemp_[index_id_].head.NTyx;
566  Nxx_ = thePixelTemp_[index_id_].head.NTxx;
567 #ifndef SI_PIXEL_TEMPLATE_STANDALONE
568  if(Nyx_ < 2 || Nxx_ < 2) {
569  throw cms::Exception("DataCorrupt") << "template ID = " << id_current_ << "has too few entries: Nyx/Nxx = " << Nyx_ << "/" << Nxx_ << std::endl;
570  }
571 #else
572  assert(Nyx_ > 1 && Nxx_ > 1);
573 #endif
574  int imidx = Nxx_/2;
575 
576  cotalpha0_ = thePixelTemp_[index_id_].entry[0][0].cotalpha;
577  cotalpha1_ = thePixelTemp_[index_id_].entry[0][Nxx_-1].cotalpha;
578  deltacota_ = (cotalpha1_-cotalpha0_)/(float)(Nxx_-1);
579 
580  cotbeta0_ = thePixelTemp_[index_id_].entry[0][imidx].cotbeta;
581  cotbeta1_ = thePixelTemp_[index_id_].entry[Nyx_-1][imidx].cotbeta;
582  deltacotb_ = (cotbeta1_-cotbeta0_)/(float)(Nyx_-1);
583 
584  break;
585  }
586  }
587  }
588 
589 #ifndef SI_PIXEL_TEMPLATE_STANDALONE
590  if(index_id_ < 0 || index_id_ >= (int)thePixelTemp_.size()) {
591  throw cms::Exception("DataCorrupt") << "SiPixelTemplate2D::interpolate can't find needed template ID = " << id
592  << ", Are you using the correct global tag?" << std::endl;
593  }
594 #else
595  assert(index_id_ >= 0 && index_id_ < (int)thePixelTemp_.size());
596 #endif
597  return true;
598 }
float deltacota_
cot(alpha) bin size
float deltacotb_
cot(beta) bin size
float cotalpha1_
maximum cot(alpha) covered
float xsize_
Pixel x-size.
int Dtype_
flags BPix (=0) or FPix (=1)
float fbin_[3]
The QBin definitions in Q_clus/Q_avg.
int Nxx_
number of cot(alpha)-entries (rows) in template
int index_id_
current index
float s50_
1/2 of the pixel threshold signal in adc units
float cotbeta0_
minimum cot(beta) covered
float cotalpha0_
minimum cot(alpha) covered
float zsize_
Pixel z-size (thickness)
int Nyx_
number of cot(beta)-entries (columns) in template
float lorxwidth_
Lorentz x-width.
float cotbeta1_
maximum cot(beta) covered
float ysize_
Pixel y-size.
float lorywidth_
Lorentz y-width (sign corrected for fpix frame)
float qscale_
charge scaling factor
const std::vector< SiPixelTemplateStore2D > & thePixelTemp_
int id_current_
current id
bool SiPixelTemplate2D::interpolate ( int  id,
float  cotalpha,
float  cotbeta,
float  locBz,
float  locBx 
)

Interpolate stored 2-D information for input angles

Parameters
id- (input) the id of the template
cotalpha- (input) the cotangent of the alpha track angle (see CMS IN 2004/014)
cotbeta- (input) the cotangent of the beta track angle (see CMS IN 2004/014)
locBz- (input) the sign of this quantity is used to determine whether to flip cot(beta)<0 quantities from cot(beta)>0 (FPix only) for Phase 0 FPix IP-related tracks, locBz < 0 for cot(beta) > 0 and locBz > 0 for cot(beta) < 0 for Phase 1 FPix IP-related tracks, see next comment
locBx- (input) the sign of this quantity is used to determine whether to flip cot(alpha/beta)<0 quantities from cot(alpha/beta)>0 (FPix only) for Phase 1 FPix IP-related tracks, locBx/locBz > 0 for cot(alpha) > 0 and locBx/locBz < 0 for cot(alpha) < 0 for Phase 1 FPix IP-related tracks, locBx > 0 for cot(beta) > 0 and locBx < 0 for cot(beta) < 0

Definition at line 613 of file SiPixelTemplate2D.cc.

References gather_cfg::cout, Exception, f, objects.autophobj::float, mps_fire::i, and createfilelist::int.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D(), and xytemp().

614 {
615 
616 
617  // Interpolate for a new set of track angles
618 
619  // Local variables
620 
621  float acotb, dcota, dcotb;
622 
623  // Check to see if interpolation is valid
624 
625  if(id != id_current_ || cotalpha != cota_current_ || cotbeta != cotb_current_) {
626  cota_current_ = cotalpha; cotb_current_ = cotbeta;
627  success_ = getid(id);
628  }
629 
630 #ifndef SI_PIXEL_TEMPLATE_STANDALONE
631  if(index_id_ < 0 || index_id_ >= (int)thePixelTemp_.size()) {
632  throw cms::Exception("DataCorrupt") << "SiPixelTemplate2D::interpolate can't find needed template ID = " << id
633  << ", Are you using the correct global tag?" << std::endl;
634  }
635 #else
636  assert(index_id_ >= 0 && index_id_ < (int)thePixelTemp_.size());
637 #endif
638 
639  // Check angle limits and et up interpolation parameters
640 
641  float cota = cotalpha;
642  flip_x_ = false;
643  flip_y_ = false;
644  switch(Dtype_) {
645  case 0:
646  if(cotbeta < 0.f) {flip_y_ = true;}
647  break;
648  case 1:
649  if(locBz > 0.f) {flip_y_ = true;}
650  break;
651  case 2:
652  case 3:
653  case 4:
654  case 5:
655  if(locBx*locBz < 0.f) {
656  cota = fabs(cotalpha);
657  flip_x_ = true;
658  }
659  if(locBx < 0.f) {flip_y_ = true;}
660  break;
661  default:
662 #ifndef SI_PIXEL_TEMPLATE_STANDALONE
663  throw cms::Exception("DataCorrupt") << "SiPixelTemplate2D::illegal subdetector ID = " << thePixelTemp_[index_id_].head.Dtype << std::endl;
664 #else
665  std::cout << "SiPixelTemplate:2D:illegal subdetector ID = " << thePixelTemp_[index_id_].head.Dtype << std::endl;
666 #endif
667  }
668 
669  if(cota < cotalpha0_) {
670  success_ = false;
671  jx0_ = 0;
672  jx1_ = 1;
673  adcota_ = 0.f;
674  } else if(cota > cotalpha1_) {
675  success_ = false;
676  jx0_ = Nxx_ - 1;
677  jx1_ = jx0_ - 1;
678  adcota_ = 0.f;
679  } else {
680  jx0_ = (int)((cota-cotalpha0_)/deltacota_+0.5f);
681  dcota = (cota - (cotalpha0_ + jx0_*deltacota_))/deltacota_;
682  adcota_ = fabs(dcota);
683  if(dcota > 0.f) {jx1_ = jx0_ + 1;if(jx1_ > Nxx_-1) jx1_ = jx0_-1;} else {jx1_ = jx0_ - 1; if(jx1_ < 0) jx1_ = jx0_+1;}
684  }
685 
686  // Interpolate the absolute value of cot(beta)
687 
688  acotb = fabs(cotbeta);
689 
690  if(acotb < cotbeta0_) {
691  success_ = false;
692  iy0_ = 0;
693  iy1_ = 1;
694  adcotb_ = 0.f;
695  } else if(acotb > cotbeta1_) {
696  success_ = false;
697  iy0_ = Nyx_ - 1;
698  iy1_ = iy0_ - 1;
699  adcotb_ = 0.f;
700  } else {
701  iy0_ = (int)((acotb-cotbeta0_)/deltacotb_+0.5f);
702  dcotb = (acotb - (cotbeta0_ + iy0_*deltacotb_))/deltacotb_;
703  adcotb_ = fabs(dcotb);
704  if(dcotb > 0.f) {iy1_ = iy0_ + 1; if(iy1_ > Nyx_-1) iy1_ = iy0_-1;} else {iy1_ = iy0_ - 1; if(iy1_ < 0) iy1_ = iy0_+1;}
705  }
706 
707  // Calculate signed quantities
708 
709  lorydrift_ = lorywidth_/2.;
711  lorxdrift_ = lorxwidth_/2.;
713 
714  // Use pointers to the three angle pairs used in the interpolation
715 
716 
720 
721  // Interpolate things in cot(alpha)-cot(beta)
722 
723  qavg_ = entry00_->qavg
726 
730 
734 
738 
742 
746 
750 
751 
755 
759 
763 
767 
771 
775 
779 
783 
787 
788  for(int i=0; i<4 ; ++i) {
789  scalex_[i] = entry00_->scalex[i]
792 
793  scaley_[i] = entry00_->scaley[i]
796 
800  if(flip_x_) offsetx_[i] = -offsetx_[i];
801 
805  if(flip_y_) offsety_[i] = -offsety_[i];
806  }
807 
808  for(int i=0; i<2 ; ++i) {
809  for(int j=0; j<5 ; ++j) {
810  // Charge loss switches sides when cot(beta) changes sign
811  if(flip_y_) {
812  xypary0x0_[1-i][j] = (float)entry00_->xypar[i][j];
813  xypary1x0_[1-i][j] = (float)entry10_->xypar[i][j];
814  xypary0x1_[1-i][j] = (float)entry01_->xypar[i][j];
815  lanpar_[1-i][j] = entry00_->lanpar[i][j]
816  +adcota_*(entry01_->lanpar[i][j] - entry00_->lanpar[i][j])
817  +adcotb_*(entry10_->lanpar[i][j] - entry00_->lanpar[i][j]);
818  } else {
819  xypary0x0_[i][j] = (float)entry00_->xypar[i][j];
820  xypary1x0_[i][j] = (float)entry10_->xypar[i][j];
821  xypary0x1_[i][j] = (float)entry01_->xypar[i][j];
822  lanpar_[i][j] = entry00_->lanpar[i][j]
823  +adcota_*(entry01_->lanpar[i][j] - entry00_->lanpar[i][j])
824  +adcotb_*(entry10_->lanpar[i][j] - entry00_->lanpar[i][j]);
825  }
826  }
827  }
828 
829  return success_;
830 } // interpolate
float pixmax
maximum charge for individual pixels in cluster
float adcotb_
fractional pixel distance of cot(beta) from iy0_
float kappavav_
kappa parameter in Vavilov distribution
float deltacota_
cot(alpha) bin size
float chi2ppix_
average chi^2 per struck pixel
float scaley_[4]
y-error scale factor in charge bins
int jx1_
index of next-nearest cot(alpha) bin
float chi2avgone
average y chi^2 for 1 pixel clusters
float qavg
average cluster charge for this set of track angles
int jx0_
index of nearest cot(alpha) bin
float deltacotb_
cot(beta) bin size
float qavg_
average cluster charge for this set of track angles
float cotalpha1_
maximum cot(alpha) covered
int Dtype_
flags BPix (=0) or FPix (=1)
bool flip_y_
flip y sign-sensitive quantities
float clslenx_
projected x-length of cluster
float clsleny
cluster y-length in pixels at signal height symax/2
float sxymax
average pixel signal for use of the error parameterization
float xypar[2][5]
pixel uncertainty parameterization
float chi2avgone_
average chi^2 for 1 pixel clusters
float scaleyavg
average y-error scale factor
float chi2minone
minimum of y chi^2 for 1 pixel clusters
float delyavg_
average difference between clsleny_ and cluster length [with threshold effects]
float xypary0x1_[2][5]
Polynomial error parameterization at ix1,iy0.
float sxymax_
average pixel signal for y-projection of cluster
int Nxx_
number of cot(alpha)-entries (rows) in template
int index_id_
current index
float delyavg
average length difference between template and cluster
float delysig
rms of length difference between template and cluster
float scalexavg_
average x-error scale factor
float chi2scale_
scale factor for chi2 distribution
float lorydrift_
Lorentz y-drift.
const SiPixelTemplateEntry2D * entry01_
float offsetx_[4]
x-offset in charge bins
float adcota_
fractional pixel distance of cot(alpha) from jx0_
float sigmavav_
scale factor in Vavilov distribution
const SiPixelTemplateEntry2D * entry00_
float mpvvav
most probable charge in Vavilov distribution (not actually for larger kappa)
float cotbeta0_
minimum cot(beta) covered
float scalex[4]
x-error scale factor in 4 charge bins
float lanpar[2][5]
pixel landau distribution parameters
float offsetx[4]
x-offset in 4 charge bins
float chi2minone_
minimum of chi^2 for 1 pixel clusters
double f[11][100]
float lorxdrift_
Lorentz x-drift.
float cotalpha0_
minimum cot(alpha) covered
float sigmavav
"sigma" scale fctor for Vavilov distribution
const SiPixelTemplateEntry2D * entry10_
int iy1_
index of next-nearest cot(beta) bin
float clsleny_
projected y-length of cluster
bool flip_x_
flip x sign-sensitive quantities
float offsety[4]
y-offset in 4 charge bins
int Nyx_
number of cot(beta)-entries (columns) in template
float chi2scale
scale factor for the chi2 distribution
float lanpar_[2][5]
Interpolated Landau parameters.
float clslenx
cluster x-length in pixels at signal height sxmax/2
float cota_current_
current cot alpha
float offsety_[4]
y-offset in charge bins
float lorxwidth_
Lorentz x-width.
float pixmax_
maximum pixel charge
float cotbeta1_
maximum cot(beta) covered
float scalexavg
average x-error scale factor
float mpvvav_
most probable Q in Vavilov distribution
float xypary1x0_[2][5]
Polynomial error parameterization at ix0,iy1.
float scaley[4]
y-error scale factor in 4 charge bins
bool success_
true if cotalpha, cotbeta are inside of the acceptance (dynamically loaded)
float scaleyavg_
average y-error scale factor
float xypary0x0_[2][5]
Polynomial error parameterization at ix0,iy0.
float cotb_current_
current cot beta
float chi2ppix
average chi^2 per pixel
float scalex_[4]
x-error scale factor in charge bins
float lorywidth_
Lorentz y-width (sign corrected for fpix frame)
int iy0_
index of nearest cot(beta) bin
const std::vector< SiPixelTemplateStore2D > & thePixelTemp_
float kappavav
kappa parameter for Vavilov distribution
int id_current_
current id
float delysig_
rms of difference between clsleny_ and cluster length [with threshold effects]
float SiPixelTemplate2D::kappavav ( )
inline

kappa parameter in Vavilov distribution

Definition at line 199 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

void SiPixelTemplate2D::landau_par ( float  lanpar[2][5])

Return the Landau probability parameters for this set of cot(alpha, cot(beta)

Definition at line 1563 of file SiPixelTemplate2D.cc.

References mps_fire::i.

Referenced by SiPixelTemplateSplit::PixelTempSplit().

1565 {
1566  // Interpolate using quantities already stored in the private variables
1567 
1568  for(int i=0; i<2; ++i) {
1569  for(int j=0; j<5; ++j) {
1570  lanpar[i][j] = lanpar_[i][j];
1571  }
1572  }
1573  return;
1574 
1575 } // End lan_par
float lanpar_[2][5]
Interpolated Landau parameters.
float SiPixelTemplate2D::lorxdrift ( )
inline

signed lorentz x-width (microns)

Definition at line 201 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

float SiPixelTemplate2D::lorydrift ( )
inline

signed lorentz y-width (microns)

Definition at line 200 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

float SiPixelTemplate2D::mpvvav ( )
inline

most probable Q in Vavilov distribution

Definition at line 197 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

float SiPixelTemplate2D::offsetx ( int  i)
inline

x-offset in 4 charge bins

Definition at line 188 of file SiPixelTemplate2D.h.

References mps_fire::i.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

float SiPixelTemplate2D::offsety ( int  i)
inline

y-offset in 4 charge bins

Definition at line 189 of file SiPixelTemplate2D.h.

References mps_fire::i.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

float SiPixelTemplate2D::pixmax ( )
inline

maximum pixel charge

Definition at line 182 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

bool SiPixelTemplate2D::pushfile ( int  filenum,
std::vector< SiPixelTemplateStore2D > &  pixelTemp,
std::string  dir = "" 
)
static

This routine initializes the global template structures from an external file template_summary_zpNNNN where NNNN are four digits of filenum.

Parameters
filenum- an integer NNNN used in the filename template_summary_zpNNNN

Alt implementation: for (unsigned cnt=4-tempfile.length(); cnt > 0; cnt– ){ tempfile = "0" + tempfile; }

Definition at line 62 of file SiPixelTemplate2D.cc.

References SiPixelTemplateHeader2D::Bfield, EnergyCorrector::c, SiPixelTemplateEntry2D::chi2ppix, SiPixelTemplateEntry2D::chi2scale, SiPixelTemplateEntry2D::clslenx, SiPixelTemplateEntry2D::clsleny, SiPixelTemplateEntry2D::costrk, SiPixelTemplateEntry2D::cotalpha, SiPixelTemplateEntry2D::cotbeta, SiPixelTemplateEntry2D::delyavg, SiPixelTemplateEntry2D::delysig, SiPixelTemplateHeader2D::Dtype, ENDL, SiPixelTemplateStore2D::entry, SiPixelTemplateHeader2D::fbin, FrontierConditions_GlobalTag_cff::file, SiPixelTemplateHeader2D::fluence, edm::FileInPath::fullPath(), SiPixelTemplateStore2D::head, mps_fire::i, SiPixelTemplateHeader2D::ID, create_public_lumi_plots::in_file, createfilelist::int, SiPixelTemplateEntry2D::iymax, SiPixelTemplateEntry2D::iymin, SiPixelTemplateEntry2D::jxmax, SiPixelTemplateEntry2D::jxmin, gen::k, SiPixelTemplateEntry2D::kappavav, checklumidiff::l, SiPixelTemplateEntry2D::lanpar, LOGERROR, LOGINFO, SiPixelTemplateHeader2D::lorxbias, SiPixelTemplateHeader2D::lorxwidth, SiPixelTemplateHeader2D::lorybias, SiPixelTemplateHeader2D::lorywidth, SiPixelTemplateEntry2D::mpvvav, SiPixelTemplateHeader2D::NTxx, SiPixelTemplateHeader2D::NTy, SiPixelTemplateHeader2D::NTyx, SiPixelTemplateEntry2D::offsetx, SiPixelTemplateEntry2D::offsety, SiPixelTemplateEntry2D::pixmax, SiPixelTemplateEntry2D::qavg, SiPixelTemplateHeader2D::qscale, SiPixelTemplateEntry2D::runnum, SiPixelTemplateHeader2D::s50, SiPixelTemplateEntry2D::scalex, SiPixelTemplateEntry2D::scalexavg, SiPixelTemplateEntry2D::scaley, SiPixelTemplateEntry2D::scaleyavg, SiPixelTemplateEntry2D::sigmavav, SiPixelTemplateEntry2D::spare, SiPixelTemplateHeader2D::ss50, AlCaHLTBitMon_QueryRunRegistry::string, SiPixelTemplateEntry2D::sxymax, T2XSIZE, T2YSIZE, SiPixelTemplateHeader2D::temperature, SiPixelTemplateHeader2D::templ_version, SiPixelTemplateHeader2D::title, SiPixelTemplateHeader2D::Vbias, SiPixelTemplateHeader2D::xsize, SiPixelTemplateEntry2D::xypar, SiPixelTemplateEntry2D::xytemp, SiPixelTemplateHeader2D::ysize, and SiPixelTemplateHeader2D::zsize.

Referenced by SiPixelDigitizerAlgorithm::init(), and PixelCPEClusterRepair::PixelCPEClusterRepair().

63 {
64  // Add template stored in external file numbered filenum to theTemplateStore
65 
66  // Local variables
67  const int code_version={21};
68 
69  // Create a filename for this run
70  std::string tempfile = std::to_string(filenum);
71 
72 
73  // Create different path in CMSSW than standalone
74 
75 #ifndef SI_PIXEL_TEMPLATE_STANDALONE
76  // If integer filenum has less than 4 digits, prepend 0's until we have four numerical characters, e.g. "0292"
77  int nzeros = 4-tempfile.length();
78  if (nzeros > 0)
79  tempfile = std::string(nzeros, '0') + tempfile;
81 
82  tempfile = dir + "template_summary2D_zp" + tempfile + ".out";
83  edm::FileInPath file( tempfile ); // Find the file in CMSSW
84  tempfile = file.fullPath(); // Put it back with the whole path.
85 
86 #else
87  // This is the same as above, but more elegant.
88  std::ostringstream tout;
89  tout << "template_summary2D_zp" << std::setw(4) << std::setfill('0') << std::right << filenum << ".out" << std::ends;
90  tempfile = tout.str();
91 
92 #endif
93 
94  // Open the template file
95  //
96  std::ifstream in_file(tempfile);
97  if(in_file.is_open() && in_file.good()) {
98 
99  // Create a local template storage entry
100  SiPixelTemplateStore2D theCurrentTemp;
101 
102  // Read-in a header string first and print it
103  char c;
104  for (int i=0; (c=in_file.get()) != '\n'; ++i) {
105  if(i < 79) {theCurrentTemp.head.title[i] = c;}
106  else {theCurrentTemp.head.title[79] ='\0';}
107  }
108  LOGINFO("SiPixelTemplate2D") << "Loading Pixel Template File - " << theCurrentTemp.head.title << ENDL;
109 
110  // next, the header information
111  in_file >> theCurrentTemp.head.ID >> theCurrentTemp.head.templ_version >> theCurrentTemp.head.Bfield >> theCurrentTemp.head.NTy >> theCurrentTemp.head.NTyx >> theCurrentTemp.head.NTxx
112  >> theCurrentTemp.head.Dtype >> theCurrentTemp.head.Vbias >> theCurrentTemp.head.temperature >> theCurrentTemp.head.fluence >> theCurrentTemp.head.qscale
113  >> theCurrentTemp.head.s50 >> theCurrentTemp.head.lorywidth >> theCurrentTemp.head.lorxwidth >> theCurrentTemp.head.ysize >> theCurrentTemp.head.xsize >> theCurrentTemp.head.zsize;
114 
115  if(in_file.fail()) {LOGERROR("SiPixelTemplate2D") << "Error reading file 0A, no template load" << ENDL; return false;}
116 
117  if(theCurrentTemp.head.templ_version > 17) {
118  in_file >> theCurrentTemp.head.ss50 >> theCurrentTemp.head.lorybias
119  >> theCurrentTemp.head.lorxbias >> theCurrentTemp.head.fbin[0]
120  >> theCurrentTemp.head.fbin[1] >> theCurrentTemp.head.fbin[2];
121 
122  if(in_file.fail()) {LOGERROR("SiPixelTemplate2D") << "Error reading file 0B, no template load"
123  << ENDL; return false;}
124  } else {
125 // This is for older [legacy] payloads
126  theCurrentTemp.head.ss50 = theCurrentTemp.head.s50;
127  theCurrentTemp.head.lorybias = theCurrentTemp.head.lorywidth/2.f;
128  theCurrentTemp.head.lorxbias = theCurrentTemp.head.lorxwidth/2.f;
129  theCurrentTemp.head.fbin[0] = 1.5f;
130  theCurrentTemp.head.fbin[1] = 1.00f;
131  theCurrentTemp.head.fbin[2] = 0.85f;
132  }
133 
134  LOGINFO("SiPixelTemplate2D") << "Template ID = " << theCurrentTemp.head.ID << ", Template Version " << theCurrentTemp.head.templ_version << ", Bfield = " << theCurrentTemp.head.Bfield
135  << ", NTy = " << theCurrentTemp.head.NTy << ", NTyx = " << theCurrentTemp.head.NTyx<< ", NTxx = " << theCurrentTemp.head.NTxx << ", Dtype = " << theCurrentTemp.head.Dtype
136  << ", Bias voltage " << theCurrentTemp.head.Vbias << ", temperature "
137  << theCurrentTemp.head.temperature << ", fluence " << theCurrentTemp.head.fluence << ", Q-scaling factor " << theCurrentTemp.head.qscale
138  << ", 1/2 multi dcol threshold " << theCurrentTemp.head.s50 << ", 1/2 single dcol threshold " << theCurrentTemp.head.ss50
139  << ", y Lorentz Width " << theCurrentTemp.head.lorywidth << ", y Lorentz Bias " << theCurrentTemp.head.lorybias
140  << ", x Lorentz width " << theCurrentTemp.head.lorxwidth << ", x Lorentz Bias " << theCurrentTemp.head.lorxbias
141  << ", Q/Q_avg fractions for Qbin defs " << theCurrentTemp.head.fbin[0] << ", " << theCurrentTemp.head.fbin[1]
142  << ", " << theCurrentTemp.head.fbin[2]
143  << ", pixel x-size " << theCurrentTemp.head.xsize << ", y-size " << theCurrentTemp.head.ysize << ", zsize " << theCurrentTemp.head.zsize << ENDL;
144 
145  if(theCurrentTemp.head.templ_version < code_version) {LOGERROR("SiPixelTemplate2D") << "code expects version " << code_version << ", no template load" << ENDL; return false;}
146 
147  if(theCurrentTemp.head.NTy != 0) {LOGERROR("SiPixelTemplate2D") << "Trying to load 1-d template info into the 2-d template object, check your DB/global tag!" << ENDL; return false;}
148 
149  // next, layout the 2-d structure needed to store template
150 
151  theCurrentTemp.entry = new SiPixelTemplateEntry2D*[theCurrentTemp.head.NTyx];
152  theCurrentTemp.entry[0] = new SiPixelTemplateEntry2D[theCurrentTemp.head.NTyx*theCurrentTemp.head.NTxx];
153  for(int i = 1; i < theCurrentTemp.head.NTyx; ++i) theCurrentTemp.entry[i] = theCurrentTemp.entry[i-1] + theCurrentTemp.head.NTxx;
154 
155  // Read in the file info
156 
157  for (int iy=0; iy < theCurrentTemp.head.NTyx; ++iy) {
158  for(int jx=0; jx < theCurrentTemp.head.NTxx; ++jx) {
159 
160  in_file >> theCurrentTemp.entry[iy][jx].runnum >> theCurrentTemp.entry[iy][jx].costrk[0]
161  >> theCurrentTemp.entry[iy][jx].costrk[1] >> theCurrentTemp.entry[iy][jx].costrk[2];
162 
163  if(in_file.fail()) {
164  LOGERROR("SiPixelTemplate2D") << "Error reading file 1, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
165  delete [] theCurrentTemp.entry[0];
166  delete [] theCurrentTemp.entry;
167  return false;
168  }
169 
170  // Calculate cot(alpha) and cot(beta) for this entry
171 
172  theCurrentTemp.entry[iy][jx].cotalpha = theCurrentTemp.entry[iy][jx].costrk[0]/theCurrentTemp.entry[iy][jx].costrk[2];
173 
174  theCurrentTemp.entry[iy][jx].cotbeta = theCurrentTemp.entry[iy][jx].costrk[1]/theCurrentTemp.entry[iy][jx].costrk[2];
175 
176  in_file >> theCurrentTemp.entry[iy][jx].qavg >> theCurrentTemp.entry[iy][jx].pixmax >> theCurrentTemp.entry[iy][jx].sxymax >> theCurrentTemp.entry[iy][jx].iymin
177  >> theCurrentTemp.entry[iy][jx].iymax >> theCurrentTemp.entry[iy][jx].jxmin >> theCurrentTemp.entry[iy][jx].jxmax;
178 
179  if(in_file.fail()) {
180  LOGERROR("SiPixelTemplate2D") << "Error reading file 2, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
181  delete [] theCurrentTemp.entry[0];
182  delete [] theCurrentTemp.entry;
183  return false;
184  }
185 
186  for (int k=0; k<2; ++k) {
187 
188  in_file >> theCurrentTemp.entry[iy][jx].xypar[k][0] >> theCurrentTemp.entry[iy][jx].xypar[k][1]
189  >> theCurrentTemp.entry[iy][jx].xypar[k][2] >> theCurrentTemp.entry[iy][jx].xypar[k][3] >> theCurrentTemp.entry[iy][jx].xypar[k][4];
190 
191  if(in_file.fail()) {
192  LOGERROR("SiPixelTemplate2D") << "Error reading file 3, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
193  delete [] theCurrentTemp.entry[0];
194  delete [] theCurrentTemp.entry;
195  return false;
196  }
197  }
198 
199  for (int k=0; k<2; ++k) {
200 
201  in_file >> theCurrentTemp.entry[iy][jx].lanpar[k][0] >> theCurrentTemp.entry[iy][jx].lanpar[k][1]
202  >> theCurrentTemp.entry[iy][jx].lanpar[k][2] >> theCurrentTemp.entry[iy][jx].lanpar[k][3] >> theCurrentTemp.entry[iy][jx].lanpar[k][4];
203 
204  if(in_file.fail()) {
205  LOGERROR("SiPixelTemplate2D") << "Error reading file 4, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
206  delete [] theCurrentTemp.entry[0];
207  delete [] theCurrentTemp.entry;
208  return false;
209  }
210 
211  }
212 
213 
214 // Read the 2D template entries as floats [they are formatted that way] and cast to short ints
215 
216  float dummy[T2YSIZE];
217  for (int l=0; l<7; ++l) {
218  for (int k=0; k<7; ++k) {
219  for (int j=0; j<T2XSIZE; ++j) {
220  for (int i=0; i<T2YSIZE; ++i) {
221  in_file >> dummy[i];
222  }
223  if(in_file.fail()) {
224  LOGERROR("SiPixelTemplate2D") << "Error reading file 5, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
225  delete [] theCurrentTemp.entry[0];
226  delete [] theCurrentTemp.entry;
227  return false;
228  }
229  for (int i=0; i<T2YSIZE; ++i) {
230  theCurrentTemp.entry[iy][jx].xytemp[k][l][i][j] = (short int)dummy[i];
231  }
232  }
233  }
234  }
235 
236 
237  in_file >> theCurrentTemp.entry[iy][jx].chi2ppix >> theCurrentTemp.entry[iy][jx].chi2scale >> theCurrentTemp.entry[iy][jx].offsetx[0] >> theCurrentTemp.entry[iy][jx].offsetx[1]
238  >> theCurrentTemp.entry[iy][jx].offsetx[2] >> theCurrentTemp.entry[iy][jx].offsetx[3]>> theCurrentTemp.entry[iy][jx].offsety[0] >> theCurrentTemp.entry[iy][jx].offsety[1]
239  >> theCurrentTemp.entry[iy][jx].offsety[2] >> theCurrentTemp.entry[iy][jx].offsety[3];
240 
241  if(in_file.fail()) {
242  LOGERROR("SiPixelTemplate2D") << "Error reading file 6, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
243  delete [] theCurrentTemp.entry[0];
244  delete [] theCurrentTemp.entry;
245  return false;
246  }
247 
248  in_file >> theCurrentTemp.entry[iy][jx].clsleny >> theCurrentTemp.entry[iy][jx].clslenx >> theCurrentTemp.entry[iy][jx].mpvvav >> theCurrentTemp.entry[iy][jx].sigmavav
249  >> theCurrentTemp.entry[iy][jx].kappavav >> theCurrentTemp.entry[iy][jx].scalexavg >> theCurrentTemp.entry[iy][jx].scaleyavg >> theCurrentTemp.entry[iy][jx].delyavg >> theCurrentTemp.entry[iy][jx].delysig >> theCurrentTemp.entry[iy][jx].spare[0];
250 
251  if(in_file.fail()) {
252  LOGERROR("SiPixelTemplate2D") << "Error reading file 7, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
253  delete [] theCurrentTemp.entry[0];
254  delete [] theCurrentTemp.entry;
255  return false;
256  }
257 
258  in_file >> theCurrentTemp.entry[iy][jx].scalex[0] >> theCurrentTemp.entry[iy][jx].scalex[1] >> theCurrentTemp.entry[iy][jx].scalex[2] >> theCurrentTemp.entry[iy][jx].scalex[3]
259  >> theCurrentTemp.entry[iy][jx].scaley[0] >> theCurrentTemp.entry[iy][jx].scaley[1] >> theCurrentTemp.entry[iy][jx].scaley[2] >> theCurrentTemp.entry[iy][jx].scaley[3]
260  >> theCurrentTemp.entry[iy][jx].spare[1] >> theCurrentTemp.entry[iy][jx].spare[2];
261 
262  if(in_file.fail()) {
263  LOGERROR("SiPixelTemplate2D") << "Error reading file 8, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
264  delete [] theCurrentTemp.entry[0];
265  delete [] theCurrentTemp.entry;
266  return false;
267  }
268 
269  }
270 
271  }
272 
273 
274  in_file.close();
275 
276  // Add this template to the store
277 
278  pixelTemp.push_back(theCurrentTemp);
279 
280  return true;
281 
282  } else {
283 
284  // If file didn't open, report this
285 
286  LOGERROR("SiPixelTemplate2D") << "Error opening File" << tempfile << ENDL;
287  return false;
288 
289  }
290 
291 } // TempInit
float pixmax
maximum charge for individual pixels in cluster
float qscale
Charge scaling to match cmssw and pixelav.
float qavg
average cluster charge for this set of track angles
float Vbias
detector bias potential in Volts
float lorxwidth
estimate of x-lorentz width for optimal resolution
int runnum
< Basic template entry corresponding to a single set of track angles
float ysize
pixel size (for future use in upgraded geometry)
SiPixelTemplateHeader2D head
< template storage structure
float clsleny
cluster y-length in pixels at signal height symax/2
float sxymax
average pixel signal for use of the error parameterization
float xypar[2][5]
pixel uncertainty parameterization
#define ENDL
float scaleyavg
average y-error scale factor
float delyavg
average length difference between template and cluster
float delysig
rms of length difference between template and cluster
SiPixelTemplateEntry2D ** entry
use 2d entry to store BPix and FPix entries [dynamically allocated]
float cotbeta
cot(beta) is proportional to cluster length in y and is basis of interpolation
float lorxbias
estimate of x-lorentz bias
int iymax
the maximum nonzero pixel yindex in template (saves time during interpolation)
float fbin[3]
The QBin definitions in Q_clus/Q_avg.
#define T2XSIZE
float ss50
1/2 of the single hit dcol threshold in electrons
int iymin
the minimum nonzero pixel yindex in template (saves time during interpolation)
short int xytemp[7][7][21][7]
templates for y-reconstruction (binned over 1 central pixel)
int ID
< template header structure
#define LOGERROR(x)
int NTxx
number of Template x-entries in each slice
float mpvvav
most probable charge in Vavilov distribution (not actually for larger kappa)
#define LOGINFO(x)
float scalex[4]
x-error scale factor in 4 charge bins
int jxmax
the maximum nonzero pixel xindex in template (saves time during interpolation)
float lanpar[2][5]
pixel landau distribution parameters
float xsize
pixel size (for future use in upgraded geometry)
float costrk[3]
direction cosines of tracks used to generate this entry
float offsetx[4]
x-offset in 4 charge bins
int jxmin
the minimum nonzero pixel xindex in template (saves time during interpolation)
float sigmavav
"sigma" scale fctor for Vavilov distribution
float cotalpha
cot(alpha) is proportional to cluster length in x and is basis of interpolation
char title[80]
template title
int k[5][pyjets_maxn]
float zsize
pixel size (for future use in upgraded geometry)
float offsety[4]
y-offset in 4 charge bins
float chi2scale
scale factor for the chi2 distribution
float lorywidth
estimate of y-lorentz width for optimal resolution
float clslenx
cluster x-length in pixels at signal height sxmax/2
int NTy
number of Template y entries
float scalexavg
average x-error scale factor
int Dtype
detector type (0=BPix, 1=FPix)
float scaley[4]
y-error scale factor in 4 charge bins
float chi2ppix
average chi^2 per pixel
int templ_version
Version number of the template to ensure code compatibility.
dbl *** dir
Definition: mlp_gen.cc:35
float s50
1/2 of the multihit dcol threshold in electrons
float temperature
detector temperature in deg K
float Bfield
Bfield in Tesla.
#define T2YSIZE
float fluence
radiation fluence in n_eq/cm^2
float kappavav
kappa parameter for Vavilov distribution
float lorybias
estimate of y-lorentz bias
int NTyx
number of Template y-slices of x entries
bool SiPixelTemplate2D::pushfile ( const SiPixel2DTemplateDBObject dbobject,
std::vector< SiPixelTemplateStore2D > &  pixelTemp 
)
static

This routine initializes the global template structures from an external file template_summary_zpNNNN where NNNN are four digits

Parameters
dbobject- db storing multiple template calibrations

Definition at line 301 of file SiPixelTemplate2D.cc.

References SiPixelTemplateHeader2D::Bfield, SiPixel2DTemplateDBObject::char2float::c, SiPixelTemplateEntry2D::chi2ppix, SiPixelTemplateEntry2D::chi2scale, SiPixelTemplateEntry2D::clslenx, SiPixelTemplateEntry2D::clsleny, SiPixelTemplateEntry2D::costrk, SiPixelTemplateEntry2D::cotalpha, SiPixelTemplateEntry2D::cotbeta, SiPixelTemplateEntry2D::delyavg, SiPixelTemplateEntry2D::delysig, SiPixelTemplateHeader2D::Dtype, ENDL, SiPixelTemplateStore2D::entry, SiPixel2DTemplateDBObject::char2float::f, SiPixel2DTemplateDBObject::fail(), SiPixelTemplateHeader2D::fbin, SiPixelTemplateHeader2D::fluence, SiPixelTemplateStore2D::head, mps_fire::i, SiPixelTemplateHeader2D::ID, SiPixel2DTemplateDBObject::incrementIndex(), SiPixel2DTemplateDBObject::index(), createfilelist::int, SiPixelTemplateEntry2D::iymax, SiPixelTemplateEntry2D::iymin, SiPixelTemplateEntry2D::jxmax, SiPixelTemplateEntry2D::jxmin, gen::k, SiPixelTemplateEntry2D::kappavav, checklumidiff::l, SiPixelTemplateEntry2D::lanpar, LOGERROR, LOGINFO, SiPixelTemplateHeader2D::lorxbias, SiPixelTemplateHeader2D::lorxwidth, SiPixelTemplateHeader2D::lorybias, SiPixelTemplateHeader2D::lorywidth, funct::m, SiPixelTemplateEntry2D::mpvvav, SiPixelTemplateHeader2D::NTxx, SiPixelTemplateHeader2D::NTy, SiPixelTemplateHeader2D::NTyx, SiPixel2DTemplateDBObject::numOfTempl(), SiPixelTemplateEntry2D::offsetx, SiPixelTemplateEntry2D::offsety, SiPixelTemplateEntry2D::pixmax, SiPixelTemplateEntry2D::qavg, SiPixelTemplateHeader2D::qscale, SiPixelTemplateEntry2D::runnum, SiPixelTemplateHeader2D::s50, SiPixelTemplateEntry2D::scalex, SiPixelTemplateEntry2D::scalexavg, SiPixelTemplateEntry2D::scaley, SiPixelTemplateEntry2D::scaleyavg, SiPixelTemplateEntry2D::sigmavav, SiPixelTemplateEntry2D::spare, SiPixelTemplateHeader2D::ss50, SiPixel2DTemplateDBObject::sVector(), SiPixelTemplateEntry2D::sxymax, T2XSIZE, T2YSIZE, groupFilesInBlocks::temp, SiPixelTemplateHeader2D::temperature, SiPixelTemplateHeader2D::templ_version, SiPixelTemplateHeader2D::title, SiPixelTemplateHeader2D::Vbias, SiPixelTemplateHeader2D::xsize, SiPixelTemplateEntry2D::xypar, SiPixelTemplateEntry2D::xytemp, SiPixelTemplateHeader2D::ysize, and SiPixelTemplateHeader2D::zsize.

302 {
303  // Add template stored in external dbobject to theTemplateStore
304 
305  const int code_version={21};
306 
307  // We must create a new object because dbobject must be a const and our stream must not be
308  SiPixel2DTemplateDBObject db = dbobject;
309 
310  // Create a local template storage entry
311  SiPixelTemplateStore2D theCurrentTemp;
312 
313  // Fill the template storage for each template calibration stored in the db
314  for(int m=0; m<db.numOfTempl(); ++m)
315  {
316 
317  // Read-in a header string first and print it
318 
320  for (int i=0; i<20; ++i) {
321  temp.f = db.sVector()[db.index()];
322  theCurrentTemp.head.title[4*i] = temp.c[0];
323  theCurrentTemp.head.title[4*i+1] = temp.c[1];
324  theCurrentTemp.head.title[4*i+2] = temp.c[2];
325  theCurrentTemp.head.title[4*i+3] = temp.c[3];
326  db.incrementIndex(1);
327  }
328  theCurrentTemp.head.title[79] = '\0';
329  LOGINFO("SiPixelTemplate2D") << "Loading Pixel Template File - " << theCurrentTemp.head.title << ENDL;
330 
331  // next, the header information
332 
333  db >> theCurrentTemp.head.ID >> theCurrentTemp.head.templ_version >> theCurrentTemp.head.Bfield >> theCurrentTemp.head.NTy >> theCurrentTemp.head.NTyx >> theCurrentTemp.head.NTxx
334  >> theCurrentTemp.head.Dtype >> theCurrentTemp.head.Vbias >> theCurrentTemp.head.temperature >> theCurrentTemp.head.fluence >> theCurrentTemp.head.qscale
335  >> theCurrentTemp.head.s50 >> theCurrentTemp.head.lorywidth >> theCurrentTemp.head.lorxwidth >> theCurrentTemp.head.ysize >> theCurrentTemp.head.xsize >> theCurrentTemp.head.zsize;
336 
337  if(db.fail()) {LOGERROR("SiPixelTemplate2D") << "Error reading file 0A, no template load" << ENDL; return false;}
338 
339  LOGINFO("SiPixelTemplate2D") << "Loading Pixel Template File - " << theCurrentTemp.head.title
340  <<" code version = "<<code_version
341  <<" object version "<<theCurrentTemp.head.templ_version
342  << ENDL;
343 
344  if(theCurrentTemp.head.templ_version > 17) {
345  db >> theCurrentTemp.head.ss50 >> theCurrentTemp.head.lorybias >> theCurrentTemp.head.lorxbias >> theCurrentTemp.head.fbin[0] >> theCurrentTemp.head.fbin[1] >> theCurrentTemp.head.fbin[2];
346 
347  if(db.fail()) {LOGERROR("SiPixelTemplate2D") << "Error reading file 0B, no template load"
348  << ENDL; return false;}
349  } else {
350 // This is for older [legacy] payloads and the numbers are indeed magic [they are part of the payload for v>17]
351  theCurrentTemp.head.ss50 = theCurrentTemp.head.s50;
352  theCurrentTemp.head.lorybias = theCurrentTemp.head.lorywidth/2.f;
353  theCurrentTemp.head.lorxbias = theCurrentTemp.head.lorxwidth/2.f;
354  theCurrentTemp.head.fbin[0] = 1.50f;
355  theCurrentTemp.head.fbin[1] = 1.00f;
356  theCurrentTemp.head.fbin[2] = 0.85f;
357  }
358 
359  LOGINFO("SiPixelTemplate2D")
360  << "Template ID = " << theCurrentTemp.head.ID << ", Template Version "
361  << theCurrentTemp.head.templ_version << ", Bfield = "
362  << theCurrentTemp.head.Bfield<< ", NTy = " << theCurrentTemp.head.NTy << ", NTyx = "
363  << theCurrentTemp.head.NTyx<< ", NTxx = " << theCurrentTemp.head.NTxx << ", Dtype = "
364  << theCurrentTemp.head.Dtype<< ", Bias voltage " << theCurrentTemp.head.Vbias << ", temperature "
365  << theCurrentTemp.head.temperature << ", fluence " << theCurrentTemp.head.fluence
366  << ", Q-scaling factor " << theCurrentTemp.head.qscale
367  << ", 1/2 multi dcol threshold " << theCurrentTemp.head.s50 << ", 1/2 single dcol threshold "
368  << theCurrentTemp.head.ss50<< ", y Lorentz Width " << theCurrentTemp.head.lorywidth
369  << ", y Lorentz Bias " << theCurrentTemp.head.lorybias
370  << ", x Lorentz width " << theCurrentTemp.head.lorxwidth
371  << ", x Lorentz Bias " << theCurrentTemp.head.lorxbias
372  << ", Q/Q_avg fractions for Qbin defs " << theCurrentTemp.head.fbin[0]
373  << ", " << theCurrentTemp.head.fbin[1]
374  << ", " << theCurrentTemp.head.fbin[2]
375  << ", pixel x-size " << theCurrentTemp.head.xsize
376  << ", y-size " << theCurrentTemp.head.ysize << ", zsize " << theCurrentTemp.head.zsize << ENDL;
377 
378  if(theCurrentTemp.head.templ_version < code_version) {
379  LOGINFO("SiPixelTemplate2D") << "code expects version "<< code_version << " finds "
380  << theCurrentTemp.head.templ_version <<", load anyway " << ENDL;
381  }
382 
383  if(theCurrentTemp.head.NTy != 0) {LOGERROR("SiPixelTemplate2D") << "Trying to load 1-d template info into the 2-d template object, check your DB/global tag!" << ENDL; return false;}
384 
385 
386  // next, layout the 2-d structure needed to store template
387 
388  theCurrentTemp.entry = new SiPixelTemplateEntry2D*[theCurrentTemp.head.NTyx];
389  theCurrentTemp.entry[0] = new SiPixelTemplateEntry2D[theCurrentTemp.head.NTyx*theCurrentTemp.head.NTxx];
390  for(int i = 1; i < theCurrentTemp.head.NTyx; ++i) theCurrentTemp.entry[i] = theCurrentTemp.entry[i-1] + theCurrentTemp.head.NTxx;
391 
392  // Read in the file info
393 
394  for (int iy=0; iy < theCurrentTemp.head.NTyx; ++iy) {
395  for(int jx=0; jx < theCurrentTemp.head.NTxx; ++jx) {
396 
397  db >> theCurrentTemp.entry[iy][jx].runnum >> theCurrentTemp.entry[iy][jx].costrk[0]
398  >> theCurrentTemp.entry[iy][jx].costrk[1] >> theCurrentTemp.entry[iy][jx].costrk[2];
399 
400  if(db.fail()) {
401  LOGERROR("SiPixelTemplate2D") << "Error reading file 1, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
402  delete [] theCurrentTemp.entry[0];
403  delete [] theCurrentTemp.entry;
404  return false;
405  }
406 
407  // Calculate cot(alpha) and cot(beta) for this entry
408 
409  theCurrentTemp.entry[iy][jx].cotalpha = theCurrentTemp.entry[iy][jx].costrk[0]/theCurrentTemp.entry[iy][jx].costrk[2];
410 
411  theCurrentTemp.entry[iy][jx].cotbeta = theCurrentTemp.entry[iy][jx].costrk[1]/theCurrentTemp.entry[iy][jx].costrk[2];
412 
413  db >> theCurrentTemp.entry[iy][jx].qavg >> theCurrentTemp.entry[iy][jx].pixmax >> theCurrentTemp.entry[iy][jx].sxymax >> theCurrentTemp.entry[iy][jx].iymin
414  >> theCurrentTemp.entry[iy][jx].iymax >> theCurrentTemp.entry[iy][jx].jxmin >> theCurrentTemp.entry[iy][jx].jxmax;
415 
416  if(db.fail()) {
417  LOGERROR("SiPixelTemplate2D") << "Error reading file 2, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
418  delete [] theCurrentTemp.entry[0];
419  delete [] theCurrentTemp.entry;
420  return false;
421  }
422 
423  for (int k=0; k<2; ++k) {
424 
425  db >> theCurrentTemp.entry[iy][jx].xypar[k][0] >> theCurrentTemp.entry[iy][jx].xypar[k][1]
426  >> theCurrentTemp.entry[iy][jx].xypar[k][2] >> theCurrentTemp.entry[iy][jx].xypar[k][3] >> theCurrentTemp.entry[iy][jx].xypar[k][4];
427 
428  if(db.fail()) {
429  LOGERROR("SiPixelTemplate2D") << "Error reading file 3, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
430  delete [] theCurrentTemp.entry[0];
431  delete [] theCurrentTemp.entry;
432  return false;
433  }
434 
435  }
436 
437  for (int k=0; k<2; ++k) {
438 
439  db >> theCurrentTemp.entry[iy][jx].lanpar[k][0] >> theCurrentTemp.entry[iy][jx].lanpar[k][1]
440  >> theCurrentTemp.entry[iy][jx].lanpar[k][2] >> theCurrentTemp.entry[iy][jx].lanpar[k][3] >> theCurrentTemp.entry[iy][jx].lanpar[k][4];
441 
442  if(db.fail()) {
443  LOGERROR("SiPixelTemplate2D") << "Error reading file 4, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
444  delete [] theCurrentTemp.entry[0];
445  delete [] theCurrentTemp.entry;
446  return false;
447  }
448 
449  }
450 
451 // Read the 2D template entries as floats [they are formatted that way] and cast to short ints
452 
453  float dummy[T2YSIZE];
454  for (int l=0; l<7; ++l) {
455  for (int k=0; k<7; ++k) {
456  for (int j=0; j<T2XSIZE; ++j) {
457  for (int i=0; i<T2YSIZE; ++i) {
458  db >> dummy[i];
459  }
460  if(db.fail()) {
461  LOGERROR("SiPixelTemplate2D") << "Error reading file 5, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
462  delete [] theCurrentTemp.entry[0];
463  delete [] theCurrentTemp.entry;
464  return false;
465  }
466  for (int i=0; i<T2YSIZE; ++i) {
467  theCurrentTemp.entry[iy][jx].xytemp[k][l][i][j] = (short int)dummy[i];
468  }
469  }
470  }
471  }
472 
473  db >> theCurrentTemp.entry[iy][jx].chi2ppix >> theCurrentTemp.entry[iy][jx].chi2scale >> theCurrentTemp.entry[iy][jx].offsetx[0] >> theCurrentTemp.entry[iy][jx].offsetx[1]
474  >> theCurrentTemp.entry[iy][jx].offsetx[2] >> theCurrentTemp.entry[iy][jx].offsetx[3]>> theCurrentTemp.entry[iy][jx].offsety[0] >> theCurrentTemp.entry[iy][jx].offsety[1]
475  >> theCurrentTemp.entry[iy][jx].offsety[2] >> theCurrentTemp.entry[iy][jx].offsety[3];
476 
477  if(db.fail()) {
478  LOGERROR("SiPixelTemplate2D") << "Error reading file 6, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
479  delete [] theCurrentTemp.entry[0];
480  delete [] theCurrentTemp.entry;
481  return false;
482  }
483 
484  db >> theCurrentTemp.entry[iy][jx].clsleny >> theCurrentTemp.entry[iy][jx].clslenx >> theCurrentTemp.entry[iy][jx].mpvvav >> theCurrentTemp.entry[iy][jx].sigmavav
485  >> theCurrentTemp.entry[iy][jx].kappavav >> theCurrentTemp.entry[iy][jx].scalexavg >> theCurrentTemp.entry[iy][jx].scaleyavg >> theCurrentTemp.entry[iy][jx].delyavg >> theCurrentTemp.entry[iy][jx].delysig >> theCurrentTemp.entry[iy][jx].spare[0];
486 
487  if(db.fail()) {
488  LOGERROR("SiPixelTemplate2D") << "Error reading file 7, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
489  delete [] theCurrentTemp.entry[0];
490  delete [] theCurrentTemp.entry;
491  return false;
492  }
493 
494  db >> theCurrentTemp.entry[iy][jx].scalex[0] >> theCurrentTemp.entry[iy][jx].scalex[1] >> theCurrentTemp.entry[iy][jx].scalex[2] >> theCurrentTemp.entry[iy][jx].scalex[3]
495  >> theCurrentTemp.entry[iy][jx].scaley[0] >> theCurrentTemp.entry[iy][jx].scaley[1] >> theCurrentTemp.entry[iy][jx].scaley[2] >> theCurrentTemp.entry[iy][jx].scaley[3]
496  >> theCurrentTemp.entry[iy][jx].spare[1] >> theCurrentTemp.entry[iy][jx].spare[2];
497 
498  if(db.fail()) {
499  LOGERROR("SiPixelTemplate2D") << "Error reading file 8, no template load, run # " << theCurrentTemp.entry[iy][jx].runnum << ENDL;
500  delete [] theCurrentTemp.entry[0];
501  delete [] theCurrentTemp.entry;
502  return false;
503  }
504 
505  }
506  }
507 
508 // Add this template to the store
509 
510  pixelTemp.push_back(theCurrentTemp);
511 
512  }
513 
514 
515  return true;
516 
517 } // TempInit
float pixmax
maximum charge for individual pixels in cluster
float qscale
Charge scaling to match cmssw and pixelav.
float qavg
average cluster charge for this set of track angles
float Vbias
detector bias potential in Volts
float lorxwidth
estimate of x-lorentz width for optimal resolution
int runnum
< Basic template entry corresponding to a single set of track angles
float ysize
pixel size (for future use in upgraded geometry)
SiPixelTemplateHeader2D head
< template storage structure
float clsleny
cluster y-length in pixels at signal height symax/2
float sxymax
average pixel signal for use of the error parameterization
float xypar[2][5]
pixel uncertainty parameterization
std::vector< float > sVector() const
#define ENDL
float scaleyavg
average y-error scale factor
float delyavg
average length difference between template and cluster
float delysig
rms of length difference between template and cluster
SiPixelTemplateEntry2D ** entry
use 2d entry to store BPix and FPix entries [dynamically allocated]
float cotbeta
cot(beta) is proportional to cluster length in y and is basis of interpolation
float lorxbias
estimate of x-lorentz bias
int iymax
the maximum nonzero pixel yindex in template (saves time during interpolation)
float fbin[3]
The QBin definitions in Q_clus/Q_avg.
#define T2XSIZE
float ss50
1/2 of the single hit dcol threshold in electrons
int iymin
the minimum nonzero pixel yindex in template (saves time during interpolation)
short int xytemp[7][7][21][7]
templates for y-reconstruction (binned over 1 central pixel)
int ID
< template header structure
#define LOGERROR(x)
int NTxx
number of Template x-entries in each slice
float mpvvav
most probable charge in Vavilov distribution (not actually for larger kappa)
#define LOGINFO(x)
float scalex[4]
x-error scale factor in 4 charge bins
int jxmax
the maximum nonzero pixel xindex in template (saves time during interpolation)
float lanpar[2][5]
pixel landau distribution parameters
float xsize
pixel size (for future use in upgraded geometry)
float costrk[3]
direction cosines of tracks used to generate this entry
float offsetx[4]
x-offset in 4 charge bins
int jxmin
the minimum nonzero pixel xindex in template (saves time during interpolation)
float sigmavav
"sigma" scale fctor for Vavilov distribution
float cotalpha
cot(alpha) is proportional to cluster length in x and is basis of interpolation
char title[80]
template title
int k[5][pyjets_maxn]
float zsize
pixel size (for future use in upgraded geometry)
float offsety[4]
y-offset in 4 charge bins
float chi2scale
scale factor for the chi2 distribution
float lorywidth
estimate of y-lorentz width for optimal resolution
float clslenx
cluster x-length in pixels at signal height sxmax/2
int NTy
number of Template y entries
float scalexavg
average x-error scale factor
int Dtype
detector type (0=BPix, 1=FPix)
float scaley[4]
y-error scale factor in 4 charge bins
float chi2ppix
average chi^2 per pixel
int templ_version
Version number of the template to ensure code compatibility.
float s50
1/2 of the multihit dcol threshold in electrons
float temperature
detector temperature in deg K
float Bfield
Bfield in Tesla.
#define T2YSIZE
float fluence
radiation fluence in n_eq/cm^2
float kappavav
kappa parameter for Vavilov distribution
float lorybias
estimate of y-lorentz bias
int NTyx
number of Template y-slices of x entries
float SiPixelTemplate2D::qavg ( )
inline

average cluster charge for this set of track angles

Definition at line 181 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

float SiPixelTemplate2D::qscale ( )
inline

charge scaling factor

Definition at line 183 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

float SiPixelTemplate2D::s50 ( )
inline

1/2 of the pixel threshold signal in adc units

Definition at line 184 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D(), and SiPixelDigitizerAlgorithm::PixelTempRewgt2D().

float SiPixelTemplate2D::scalex ( int  i)
inline

x-error scale factor in 4 charge bins

Definition at line 186 of file SiPixelTemplate2D.h.

References mps_fire::i.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

float SiPixelTemplate2D::scalexavg ( )
inline

x-reco error scaling factor

Definition at line 205 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::scaley ( int  i)
inline

y-error scale factor in 4 charge bins

Definition at line 187 of file SiPixelTemplate2D.h.

References mps_fire::i.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

float SiPixelTemplate2D::scaleyavg ( )
inline

y-reco error scaling factor

Definition at line 204 of file SiPixelTemplate2D.h.

void SiPixelTemplate2D::sideload ( SiPixelTemplateEntry2D entry,
int  iDtype,
float  locBx,
float  locBz,
float  lorwdy,
float  lorwdx,
float  q50,
float  fbin[3],
float  xsize,
float  ysize,
float  zsize 
)

Load template info for single angle point to invoke template reco for template generation

Parameters
entry- (input) pointer to template entry
sizex- (input) pixel x-size
sizey- (input) pixel y-size
sizez- (input) pixel z-size

Definition at line 841 of file SiPixelTemplate2D.cc.

References gather_cfg::cout, mps_splice::entry, Exception, f, objects.autophobj::float, mps_fire::i, xsize, and ysize.

842 {
843  // Set class variables to the input parameters
844 
845  entry00_ = entry;
846  entry01_ = entry;
847  entry10_ = entry;
848  Dtype_ = iDtype;
849  lorywidth_ = lorwdy;
850  lorxwidth_ = lorwdx;
851  xsize_ = xsize;
852  ysize_ = ysize;
853  zsize_ = zsize;
854  s50_ = q50;
855  qscale_ = 1.f;
856  for(int i=0; i<3; ++i) {fbin_[i] = fbin[i];}
857 
858  // Set other class variables
859 
860  adcota_ = 0.f;
861  adcotb_ = 0.f;
862 
863  // Interpolate things in cot(alpha)-cot(beta)
864 
865  qavg_ = entry00_->qavg;
866 
868 
870 
872 
874 
875  scaleyavg_ = 1.f;
876 
877  scalexavg_ = 1.f;
878 
879  delyavg_ = 0.f;
880 
881  delysig_ = 0.f;
882 
883  for(int i=0; i<4 ; ++i) {
884  scalex_[i] = 1.f;
885  scaley_[i] = 1.f;
886  offsetx_[i] = 0.f;
887  offsety_[i] = 0.f;
888  }
889 
890  // This works only for IP-related tracks
891 
892  flip_x_ = false;
893  flip_y_ = false;
894  float cotbeta = entry00_->cotbeta;
895  switch(Dtype_) {
896  case 0:
897  if(cotbeta < 0.f) {flip_y_ = true;}
898  break;
899  case 1:
900  if(locBz > 0.f) {
901  flip_y_ = true;
902  }
903  break;
904  case 2:
905  case 3:
906  case 4:
907  case 5:
908  if(locBx*locBz < 0.f) {
909  flip_x_ = true;
910  }
911  if(locBx < 0.f) {
912  flip_y_ = true;
913  }
914  break;
915  default:
916 #ifndef SI_PIXEL_TEMPLATE_STANDALONE
917  throw cms::Exception("DataCorrupt") << "SiPixelTemplate2D::illegal subdetector ID = " << iDtype << std::endl;
918 #else
919  std::cout << "SiPixelTemplate:2D:illegal subdetector ID = " << iDtype << std::endl;
920 #endif
921  }
922 
923  // Calculate signed quantities
924 
925  lorydrift_ = lorywidth_/2.;
927  lorxdrift_ = lorxwidth_/2.;
929 
930  for(int i=0; i<2 ; ++i) {
931  for(int j=0; j<5 ; ++j) {
932  // Charge loss switches sides when cot(beta) changes sign
933  if(flip_y_) {
934  xypary0x0_[1-i][j] = (float)entry00_->xypar[i][j];
935  xypary1x0_[1-i][j] = (float)entry00_->xypar[i][j];
936  xypary0x1_[1-i][j] = (float)entry00_->xypar[i][j];
937  lanpar_[1-i][j] = entry00_->lanpar[i][j];
938  } else {
939  xypary0x0_[i][j] = (float)entry00_->xypar[i][j];
940  xypary1x0_[i][j] = (float)entry00_->xypar[i][j];
941  xypary0x1_[i][j] = (float)entry00_->xypar[i][j];
942  lanpar_[i][j] = entry00_->lanpar[i][j];
943  }
944  }
945  }
946  return;
947 }
float pixmax
maximum charge for individual pixels in cluster
float adcotb_
fractional pixel distance of cot(beta) from iy0_
float xsize()
pixel x-size (microns)
float scaley_[4]
y-error scale factor in charge bins
float qavg
average cluster charge for this set of track angles
float qavg_
average cluster charge for this set of track angles
float xsize_
Pixel x-size.
int Dtype_
flags BPix (=0) or FPix (=1)
bool flip_y_
flip y sign-sensitive quantities
float clslenx_
projected x-length of cluster
float clsleny
cluster y-length in pixels at signal height symax/2
float sxymax
average pixel signal for use of the error parameterization
float xypar[2][5]
pixel uncertainty parameterization
float fbin_[3]
The QBin definitions in Q_clus/Q_avg.
float delyavg_
average difference between clsleny_ and cluster length [with threshold effects]
float xypary0x1_[2][5]
Polynomial error parameterization at ix1,iy0.
float sxymax_
average pixel signal for y-projection of cluster
float scalexavg_
average x-error scale factor
float lorydrift_
Lorentz y-drift.
const SiPixelTemplateEntry2D * entry01_
float cotbeta
cot(beta) is proportional to cluster length in y and is basis of interpolation
float offsetx_[4]
x-offset in charge bins
float adcota_
fractional pixel distance of cot(alpha) from jx0_
const SiPixelTemplateEntry2D * entry00_
float s50_
1/2 of the pixel threshold signal in adc units
float lanpar[2][5]
pixel landau distribution parameters
double f[11][100]
float lorxdrift_
Lorentz x-drift.
const SiPixelTemplateEntry2D * entry10_
float clsleny_
projected y-length of cluster
bool flip_x_
flip x sign-sensitive quantities
float zsize_
Pixel z-size (thickness)
float lanpar_[2][5]
Interpolated Landau parameters.
float clslenx
cluster x-length in pixels at signal height sxmax/2
float offsety_[4]
y-offset in charge bins
float lorxwidth_
Lorentz x-width.
float pixmax_
maximum pixel charge
float ysize()
pixel y-size (microns)
float xypary1x0_[2][5]
Polynomial error parameterization at ix0,iy1.
float fbin(int i)
Return lower bound of Qbin definition.
float ysize_
Pixel y-size.
float scaleyavg_
average y-error scale factor
float xypary0x0_[2][5]
Polynomial error parameterization at ix0,iy0.
float zsize()
pixel z-size or thickness (microns)
float scalex_[4]
x-error scale factor in charge bins
float lorywidth_
Lorentz y-width (sign corrected for fpix frame)
float qscale_
charge scaling factor
float delysig_
rms of difference between clsleny_ and cluster length [with threshold effects]
float SiPixelTemplate2D::sigmavav ( )
inline

scale factor in Vavilov distribution

Definition at line 198 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

float SiPixelTemplate2D::sizex ( )
inline

return x size of template cluster

Definition at line 191 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::sizey ( )
inline

return y size of template cluster

Definition at line 192 of file SiPixelTemplate2D.h.

int SiPixelTemplate2D::storesize ( )
inline

return the size of the template store (the number of stored IDs

Definition at line 211 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::sxymax ( )
inline

max pixel signal for pixel error calculation

Definition at line 185 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

float SiPixelTemplate2D::xsize ( )
inline

pixel x-size (microns)

Definition at line 208 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D(), and SiPixelDigitizerAlgorithm::PixelTempRewgt2D().

void SiPixelTemplate2D::xysigma2 ( float  qpixel,
int  index,
float &  xysig2 
)

Return y error (squared) for an input signal and yindex Add large Q scaling for use in cluster splitting.

Parameters
qpixel- (input) pixel charge
index- (input) y-index index of pixel
xysig2- (output) square error

Definition at line 1511 of file SiPixelTemplate2D.cc.

References BYM2, Exception, f, and T2HYP1.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D().

1513 {
1514  // Interpolate using quantities already stored in the private variables
1515 
1516  // Local variables
1517  float sigi, sigi2, sigi3, sigi4, qscale, err2, err00;
1518 
1519  // Make sure that input is OK
1520 
1521 #ifndef SI_PIXEL_TEMPLATE_STANDALONE
1522  if(index < 1 || index >= BYM2) {
1523  throw cms::Exception("DataCorrupt") << "SiPixelTemplate2D::ysigma2 called with index = " << index << std::endl;
1524  }
1525 #else
1526  assert(index > 0 && index < BYM2);
1527 #endif
1528 
1529  // Define the maximum signal to use in the parameterization
1530 
1531  // Evaluate pixel-by-pixel uncertainties (weights) for the templ analysis
1532 
1533  if(qpixel < sxymax_) {
1534  sigi = qpixel;
1535  qscale = 1.f;
1536  } else {
1537  sigi = sxymax_;
1538  qscale = qpixel/sxymax_;
1539  }
1540  sigi2 = sigi*sigi; sigi3 = sigi2*sigi; sigi4 = sigi3*sigi;
1541  if(index <= T2HYP1) {
1542  err00 = xypary0x0_[0][0]+xypary0x0_[0][1]*sigi+xypary0x0_[0][2]*sigi2+xypary0x0_[0][3]*sigi3+xypary0x0_[0][4]*sigi4;
1543  err2 = err00
1544  +adcota_*(xypary0x1_[0][0]+xypary0x1_[0][1]*sigi+xypary0x1_[0][2]*sigi2+xypary0x1_[0][3]*sigi3+xypary0x1_[0][4]*sigi4 - err00)
1545  +adcotb_*(xypary1x0_[0][0]+xypary1x0_[0][1]*sigi+xypary1x0_[0][2]*sigi2+xypary1x0_[0][3]*sigi3+xypary1x0_[0][4]*sigi4 - err00);
1546  } else {
1547  err00 = xypary0x0_[1][0]+xypary0x0_[1][1]*sigi+xypary0x0_[1][2]*sigi2+xypary0x0_[1][3]*sigi3+xypary0x0_[1][4]*sigi4;
1548  err2 = err00
1549  +adcota_*(xypary0x1_[1][0]+xypary0x1_[1][1]*sigi+xypary0x1_[1][2]*sigi2+xypary0x1_[1][3]*sigi3+xypary0x1_[1][4]*sigi4 - err00)
1550  +adcotb_*(xypary1x0_[1][0]+xypary1x0_[1][1]*sigi+xypary1x0_[1][2]*sigi2+xypary1x0_[1][3]*sigi3+xypary1x0_[1][4]*sigi4 - err00);
1551  }
1552  xysig2 =qscale*err2;
1553  if(xysig2 <= 0.f) {xysig2 = s50_*s50_;}
1554 
1555  return;
1556 
1557 } // End xysigma2
float adcotb_
fractional pixel distance of cot(beta) from iy0_
#define T2HYP1
float xypary0x1_[2][5]
Polynomial error parameterization at ix1,iy0.
float sxymax_
average pixel signal for y-projection of cluster
float adcota_
fractional pixel distance of cot(alpha) from jx0_
float s50_
1/2 of the pixel threshold signal in adc units
#define BYM2
double f[11][100]
float qscale()
charge scaling factor
float xypary1x0_[2][5]
Polynomial error parameterization at ix0,iy1.
float xypary0x0_[2][5]
Polynomial error parameterization at ix0,iy0.
bool SiPixelTemplate2D::xytemp ( float  xhit,
float  yhit,
bool  ydouble[21+2],
bool  xdouble[13+2],
float  template2d[13+2][21+2],
bool  derivatives,
float  dpdx2d[2][13+2][21+2],
float &  QTemplate 
)
Parameters
xhit- (input) x-position of hit relative to the lower left corner of pixel[1][1] (to allow for the "padding" of the two-d clusters in the splitter)
yhit- (input) y-position of hit relative to the lower left corner of pixel[1][1]
ydouble- (input) STL vector of 21 element array to flag a double-pixel starting at cluster[1][1]
xdouble- (input) STL vector of 11 element array to flag a double-pixel starting at cluster[1][1]
template2d- (output) 2d template of size matched to the cluster. Input must be zeroed since charge is added only.

Definition at line 958 of file SiPixelTemplate2D.cc.

References BXM2, BXM3, BYM2, BYM3, PVValHelper::dx, PVValHelper::dy, f, objects.autophobj::float, mps_fire::i, createfilelist::int, gen::k, reco::ParticleMasses::k0, funct::m, SiStripPI::max, min(), gen::n, T2HX, T2HY, T2XSIZE, and T2YSIZE.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D(), SiPixelDigitizerAlgorithm::PixelTempRewgt2D(), SiPixelTemplateSplit::PixelTempSplit(), and xytemp().

959 {
960  // Interpolate for a new set of track angles
961 
962  // Local variables
963  int pixx, pixy, k0, k1, l0, l1, deltax, deltay, iflipy, jflipx, imin, imax, jmin, jmax;
964  int m, n;
965  float dx, dy, ddx, ddy, adx, ady;
966  // const float deltaxy[2] = {8.33f, 12.5f};
967  const float deltaxy[2] = {16.67f, 25.0f};
968 
969  // Check to see if interpolation is valid
970 
971 
972  // next, determine the indices of the closest point in k (y-displacement), l (x-displacement)
973  // pixy and pixx are the indices of the struck pixel in the (Ty,Tx) system
974  // k0,k1 are the k-indices of the closest and next closest point
975  // l0,l1 are the l-indices of the closest and next closest point
976 
977  pixy = (int)floorf(yhit/ysize_);
978  dy = yhit-(pixy+0.5f)*ysize_;
979  if(flip_y_) {dy = -dy;}
980  k0 = (int)(dy/ysize_*6.f+3.5f);
981  if(k0 < 0) k0 = 0;
982  if(k0 > 6) k0 = 6;
983  ddy = 6.f*dy/ysize_ - (k0-3);
984  ady = fabs(ddy);
985  if(ddy > 0.f) {k1 = k0 + 1; if(k1 > 6) k1 = k0-1;} else {k1 = k0 - 1; if(k1 < 0) k1 = k0+1;}
986  pixx = (int)floorf(xhit/xsize_);
987  dx = xhit-(pixx+0.5f)*xsize_;
988  if(flip_x_) {dx = -dx;}
989  l0 = (int)(dx/xsize_*6.f+3.5f);
990  if(l0 < 0) l0 = 0;
991  if(l0 > 6) l0 = 6;
992  ddx = 6.f*dx/xsize_ - (l0-3);
993  adx = fabs(ddx);
994  if(ddx > 0.f) {l1 = l0 + 1; if(l1 > 6) l1 = l0-1;} else {l1 = l0 - 1; if(l1 < 0) l1 = l0+1;}
995 
996  // OK, lets do the template interpolation.
997 
998  // First find the limits of the indices for non-zero pixels
999 
1000  imin = std::min(entry00_->iymin,entry10_->iymin);
1001  imin_ = std::min(imin,entry01_->iymin);
1002 
1003  jmin = std::min(entry00_->jxmin,entry10_->jxmin);
1004  jmin_ = std::min(jmin,entry01_->jxmin);
1005 
1006  imax = std::max(entry00_->iymax,entry10_->iymax);
1007  imax_ = std::max(imax,entry01_->iymax);
1008 
1009  jmax = std::max(entry00_->jxmax,entry10_->jxmax);
1010  jmax_ = std::max(jmax,entry01_->jxmax);
1011 
1012  // Calculate the x and y offsets to make the new template
1013 
1014  // First, shift the struck pixel coordinates to the (Ty+2, Tx+2) system
1015 
1016  ++pixy; ++pixx;
1017 
1018  // In the template store, the struck pixel is always (THy,THx)
1019 
1020  deltax = pixx - T2HX;
1021  deltay = pixy - T2HY;
1022 
1023  // First zero the local 2-d template
1024 
1025  for(int j=0; j<BXM2; ++j) {for(int i=0; i<BYM2; ++i) {xytemp_[j][i] = 0.f;}}
1026 
1027  // Loop over the non-zero part of the template index space and interpolate
1028 
1029  for(int j=jmin_; j<=jmax_; ++j) {
1030  // Flip indices as needed
1031  if(flip_x_) {jflipx=T2XSIZE-1-j; m = deltax+jflipx;} else {m = deltax+j;}
1032  for(int i=imin_; i<=imax_; ++i) {
1033  if(flip_y_) {iflipy=T2YSIZE-1-i; n = deltay+iflipy;} else {n = deltay+i;}
1034  if(m>=0 && m<=BXM3 && n>=0 && n<=BYM3) {
1035  xytemp_[m][n] = (float)entry00_->xytemp[k0][l0][i][j]
1036  + adx*(float)(entry00_->xytemp[k0][l1][i][j] - entry00_->xytemp[k0][l0][i][j])
1037  + ady*(float)(entry00_->xytemp[k1][l0][i][j] - entry00_->xytemp[k0][l0][i][j])
1038  + adcota_*(float)(entry01_->xytemp[k0][l0][i][j] - entry00_->xytemp[k0][l0][i][j])
1039  + adcotb_*(float)(entry10_->xytemp[k0][l0][i][j] - entry00_->xytemp[k0][l0][i][j]);
1040  }
1041  }
1042  }
1043 
1044  //combine rows and columns to simulate double pixels
1045 
1046  for(int n=1; n<BYM3; ++n) {
1047  if(ydouble[n]) {
1048  // Combine the y-columns
1049  for(int m=1; m<BXM3; ++m) {
1050  xytemp_[m][n] += xytemp_[m][n+1];
1051  }
1052  // Now shift the remaining pixels over by one column
1053  for(int i=n+1; i<BYM3; ++i) {
1054  for(int m=1; m<BXM3; ++m) {
1055  xytemp_[m][i] = xytemp_[m][i+1];
1056  }
1057  }
1058  }
1059  }
1060 
1061  //combine rows and columns to simulate double pixels
1062 
1063  for(int m=1; m<BXM3; ++m) {
1064  if(xdouble[m]) {
1065  // Combine the x-rows
1066  for(int n=1; n<BYM3; ++n) {
1067  xytemp_[m][n] += xytemp_[m+1][n];
1068  }
1069  // Now shift the remaining pixels over by one row
1070  for(int j=m+1; j<BXM3; ++j) {
1071  for(n=1; n<BYM3; ++n) {
1072  xytemp_[j][n] = xytemp_[j+1][n];
1073  }
1074  }
1075  }
1076  }
1077 
1078  // Finally, loop through and increment the external template
1079 
1080  float qtemptot = 0.f;
1081 
1082  for(int n=1; n<BYM3; ++n) {
1083  for(int m=1; m<BXM3; ++m) {
1084  if(xytemp_[m][n] != 0.f) {template2d[m][n] += xytemp_[m][n]; qtemptot += xytemp_[m][n];}
1085  }
1086  }
1087 
1088  QTemplate = qtemptot;
1089 
1090  if(derivatives) {
1091 
1092  float dxytempdx[2][BXM2][BYM2], dxytempdy[2][BXM2][BYM2];
1093 
1094  for(int k = 0; k<2; ++k) {
1095  for(int i = 0; i<BXM2; ++i) {
1096  for(int j = 0; j<BYM2; ++j) {
1097  dxytempdx[k][i][j] = 0.f;
1098  dxytempdy[k][i][j] = 0.f;
1099  dpdx2d[k][i][j] = 0.f;
1100  }
1101  }
1102  }
1103 
1104  // First do shifted +x template
1105 
1106  pixx = (int)floorf((xhit+deltaxy[0])/xsize_);
1107  dx = (xhit+deltaxy[0])-(pixx+0.5f)*xsize_;
1108  if(flip_x_) {dx = -dx;}
1109  l0 = (int)(dx/xsize_*6.f+3.5f);
1110  if(l0 < 0) l0 = 0;
1111  if(l0 > 6) l0 = 6;
1112  ddx = 6.f*dx/xsize_ - (l0-3);
1113  adx = fabs(ddx);
1114  if(ddx > 0.f) {l1 = l0 + 1; if(l1 > 6) l1 = l0-1;} else {l1 = l0 - 1; if(l1 < 0) l1 = l0+1;}
1115 
1116  // OK, lets do the template interpolation.
1117 
1118  // Calculate the x and y offsets to make the new template
1119 
1120  // First, shift the struck pixel coordinates to the (Ty+2, Tx+2) system
1121 
1122  ++pixx;
1123 
1124  // In the template store, the struck pixel is always (THy,THx)
1125 
1126  deltax = pixx - T2HX;
1127 
1128  // Loop over the non-zero part of the template index space and interpolate
1129 
1130  for(int j=jmin_; j<=jmax_; ++j) {
1131  // Flip indices as needed
1132  if(flip_x_) {jflipx=T2XSIZE-1-j; m = deltax+jflipx;} else {m = deltax+j;}
1133  for(int i=imin_; i<=imax_; ++i) {
1134  if(flip_y_) {iflipy=T2YSIZE-1-i; n = deltay+iflipy;} else {n = deltay+i;}
1135  if(m>=0 && m<=BXM3 && n>=0 && n<=BYM3) {
1136  dxytempdx[1][m][n] = (float)entry00_->xytemp[k0][l0][i][j]
1137  + adx*(float)(entry00_->xytemp[k0][l1][i][j] - entry00_->xytemp[k0][l0][i][j])
1138  + ady*(float)(entry00_->xytemp[k1][l0][i][j] - entry00_->xytemp[k0][l0][i][j])
1139  + adcota_*(float)(entry01_->xytemp[k0][l0][i][j] - entry00_->xytemp[k0][l0][i][j])
1140  + adcotb_*(float)(entry10_->xytemp[k0][l0][i][j] - entry00_->xytemp[k0][l0][i][j]);
1141  }
1142  }
1143  }
1144 
1145  //combine rows and columns to simulate double pixels
1146 
1147  for(int n=1; n<BYM3; ++n) {
1148  if(ydouble[n]) {
1149  // Combine the y-columns
1150  for(int m=1; m<BXM3; ++m) {
1151  dxytempdx[1][m][n] += dxytempdx[1][m][n+1];
1152  }
1153  // Now shift the remaining pixels over by one column
1154  for(int i=n+1; i<BYM3; ++i) {
1155  for(int m=1; m<BXM3; ++m) {
1156  dxytempdx[1][m][i] = dxytempdx[1][m][i+1];
1157  }
1158  }
1159  }
1160  }
1161 
1162  //combine rows and columns to simulate double pixels
1163 
1164  for(int m=1; m<BXM3; ++m) {
1165  if(xdouble[m]) {
1166  // Combine the x-rows
1167  for(int n=1; n<BYM3; ++n) {
1168  dxytempdx[1][m][n] += dxytempdx[1][m+1][n];
1169  }
1170  // Now shift the remaining pixels over by one row
1171  for(int j=m+1; j<BXM3; ++j) {
1172  for(int n=1; n<BYM3; ++n) {
1173  dxytempdx[1][j][n] = dxytempdx[1][j+1][n];
1174  }
1175  }
1176  }
1177  }
1178 
1179  // Next do shifted -x template
1180 
1181  pixx = (int)floorf((xhit-deltaxy[0])/xsize_);
1182  dx = (xhit-deltaxy[0])-(pixx+0.5f)*xsize_;
1183  if(flip_x_) {dx = -dx;}
1184  l0 = (int)(dx/xsize_*6.f+3.5f);
1185  if(l0 < 0) l0 = 0;
1186  if(l0 > 6) l0 = 6;
1187  ddx = 6.f*dx/xsize_ - (l0-3);
1188  adx = fabs(ddx);
1189  if(ddx > 0.f) {l1 = l0 + 1; if(l1 > 6) l1 = l0-1;} else {l1 = l0 - 1; if(l1 < 0) l1 = l0+1;}
1190 
1191  // OK, lets do the template interpolation.
1192 
1193  // Calculate the x and y offsets to make the new template
1194 
1195  // First, shift the struck pixel coordinates to the (Ty+2, Tx+2) system
1196 
1197  ++pixx;
1198 
1199  // In the template store, the struck pixel is always (THy,THx)
1200 
1201  deltax = pixx - T2HX;
1202 
1203  // Loop over the non-zero part of the template index space and interpolate
1204 
1205  for(int j=jmin_; j<=jmax_; ++j) {
1206  // Flip indices as needed
1207  if(flip_x_) {jflipx=T2XSIZE-1-j; m = deltax+jflipx;} else {m = deltax+j;}
1208  for(int i=imin_; i<=imax_; ++i) {
1209  if(flip_y_) {iflipy=T2YSIZE-1-i; n = deltay+iflipy;} else {n = deltay+i;}
1210  if(m>=0 && m<=BXM3 && n>=0 && n<=BYM3) {
1211  dxytempdx[0][m][n] = (float)entry00_->xytemp[k0][l0][i][j]
1212  + adx*(float)(entry00_->xytemp[k0][l1][i][j] - entry00_->xytemp[k0][l0][i][j])
1213  + ady*(float)(entry00_->xytemp[k1][l0][i][j] - entry00_->xytemp[k0][l0][i][j])
1214  + adcota_*(float)(entry01_->xytemp[k0][l0][i][j] - entry00_->xytemp[k0][l0][i][j])
1215  + adcotb_*(float)(entry10_->xytemp[k0][l0][i][j] - entry00_->xytemp[k0][l0][i][j]);
1216  }
1217  }
1218  }
1219 
1220  //combine rows and columns to simulate double pixels
1221 
1222  for(int n=1; n<BYM3; ++n) {
1223  if(ydouble[n]) {
1224  // Combine the y-columns
1225  for(int m=1; m<BXM3; ++m) {
1226  dxytempdx[0][m][n] += dxytempdx[0][m][n+1];
1227  }
1228  // Now shift the remaining pixels over by one column
1229  for(int i=n+1; i<BYM3; ++i) {
1230  for(int m=1; m<BXM3; ++m) {
1231  dxytempdx[0][m][i] = dxytempdx[0][m][i+1];
1232  }
1233  }
1234  }
1235  }
1236 
1237  //combine rows and columns to simulate double pixels
1238 
1239  for(int m=1; m<BXM3; ++m) {
1240  if(xdouble[m]) {
1241  // Combine the x-rows
1242  for(int n=1; n<BYM3; ++n) {
1243  dxytempdx[0][m][n] += dxytempdx[0][m+1][n];
1244  }
1245  // Now shift the remaining pixels over by one row
1246  for(int j=m+1; j<BXM3; ++j) {
1247  for(int n=1; n<BYM3; ++n) {
1248  dxytempdx[0][j][n] = dxytempdx[0][j+1][n];
1249  }
1250  }
1251  }
1252  }
1253 
1254 
1255  // Finally, normalize the derivatives and copy the results to the output array
1256 
1257  for(int n=1; n<BYM3; ++n) {
1258  for(int m=1; m<BXM3; ++m) {
1259  dpdx2d[0][m][n] = (dxytempdx[1][m][n] - dxytempdx[0][m][n])/(2.*deltaxy[0]);
1260  }
1261  }
1262 
1263  // Next, do shifted y template
1264 
1265  pixy = (int)floorf((yhit+deltaxy[1])/ysize_);
1266  dy = (yhit+deltaxy[1])-(pixy+0.5f)*ysize_;
1267  if(flip_y_) {dy = -dy;}
1268  k0 = (int)(dy/ysize_*6.f+3.5f);
1269  if(k0 < 0) k0 = 0;
1270  if(k0 > 6) k0 = 6;
1271  ddy = 6.f*dy/ysize_ - (k0-3);
1272  ady = fabs(ddy);
1273  if(ddy > 0.f) {k1 = k0 + 1; if(k1 > 6) k1 = k0-1;} else {k1 = k0 - 1; if(k1 < 0) k1 = k0+1;}
1274  pixx = (int)floorf(xhit/xsize_);
1275  dx = xhit-(pixx+0.5f)*xsize_;
1276  if(flip_x_) {dx = -dx;}
1277  l0 = (int)(dx/xsize_*6.f+3.5f);
1278  if(l0 < 0) l0 = 0;
1279  if(l0 > 6) l0 = 6;
1280  ddx = 6.f*dx/xsize_ - (l0-3);
1281  adx = fabs(ddx);
1282  if(ddx > 0.f) {l1 = l0 + 1; if(l1 > 6) l1 = l0-1;} else {l1 = l0 - 1; if(l1 < 0) l1 = l0+1;}
1283 
1284  // OK, lets do the template interpolation.
1285 
1286  // Calculate the x and y offsets to make the new template
1287 
1288  // First, shift the struck pixel coordinates to the (Ty+2, Tx+2) system
1289 
1290  ++pixy; ++pixx;
1291 
1292  // In the template store, the struck pixel is always (THy,THx)
1293 
1294  deltax = pixx - T2HX;
1295  deltay = pixy - T2HY;
1296 
1297  // Loop over the non-zero part of the template index space and interpolate
1298 
1299  for(int j=jmin_; j<=jmax_; ++j) {
1300  // Flip indices as needed
1301  if(flip_x_) {jflipx=T2XSIZE-1-j; m = deltax+jflipx;} else {m = deltax+j;}
1302  for(int i=imin_; i<=imax_; ++i) {
1303  if(flip_y_) {iflipy=T2YSIZE-1-i; n = deltay+iflipy;} else {n = deltay+i;}
1304  if(m>=0 && m<=BXM3 && n>=0 && n<=BYM3) {
1305  dxytempdy[1][m][n] = (float)entry00_->xytemp[k0][l0][i][j]
1306  + adx*(float)(entry00_->xytemp[k0][l1][i][j] - entry00_->xytemp[k0][l0][i][j])
1307  + ady*(float)(entry00_->xytemp[k1][l0][i][j] - entry00_->xytemp[k0][l0][i][j])
1308  + adcota_*(float)(entry01_->xytemp[k0][l0][i][j] - entry00_->xytemp[k0][l0][i][j])
1309  + adcotb_*(float)(entry10_->xytemp[k0][l0][i][j] - entry00_->xytemp[k0][l0][i][j]);
1310  }
1311  }
1312  }
1313 
1314  //combine rows and columns to simulate double pixels
1315 
1316  for(int n=1; n<BYM3; ++n) {
1317  if(ydouble[n]) {
1318  // Combine the y-columns
1319  for(int m=1; m<BXM3; ++m) {
1320  dxytempdy[1][m][n] += dxytempdy[1][m][n+1];
1321  }
1322  // Now shift the remaining pixels over by one column
1323  for(int i=n+1; i<BYM3; ++i) {
1324  for(int m=1; m<BXM3; ++m) {
1325  dxytempdy[1][m][i] = dxytempdy[1][m][i+1];
1326  }
1327  }
1328  }
1329  }
1330 
1331  //combine rows and columns to simulate double pixels
1332 
1333  for(int m=1; m<BXM3; ++m) {
1334  if(xdouble[m]) {
1335  // Combine the x-rows
1336  for(int n=1; n<BYM3; ++n) {
1337  dxytempdy[1][m][n] += dxytempdy[1][m+1][n];
1338  }
1339  // Now shift the remaining pixels over by one row
1340  for(int j=m+1; j<BXM3; ++j) {
1341  for(int n=1; n<BYM3; ++n) {
1342  dxytempdy[1][j][n] = dxytempdy[1][j+1][n];
1343  }
1344  }
1345  }
1346  }
1347 
1348  // Next, do shifted -y template
1349 
1350  pixy = (int)floorf((yhit-deltaxy[1])/ysize_);
1351  dy = (yhit-deltaxy[1])-(pixy+0.5f)*ysize_;
1352  if(flip_y_) {dy = -dy;}
1353  k0 = (int)(dy/ysize_*6.f+3.5f);
1354  if(k0 < 0) k0 = 0;
1355  if(k0 > 6) k0 = 6;
1356  ddy = 6.f*dy/ysize_ - (k0-3);
1357  ady = fabs(ddy);
1358  if(ddy > 0.f) {k1 = k0 + 1; if(k1 > 6) k1 = k0-1;} else {k1 = k0 - 1; if(k1 < 0) k1 = k0+1;}
1359 
1360  // OK, lets do the template interpolation.
1361 
1362  // Calculate the x and y offsets to make the new template
1363 
1364  // First, shift the struck pixel coordinates to the (Ty+2, Tx+2) system
1365 
1366  ++pixy;
1367 
1368  // In the template store, the struck pixel is always (THy,THx)
1369 
1370  deltay = pixy - T2HY;
1371 
1372  // Loop over the non-zero part of the template index space and interpolate
1373 
1374  for(int j=jmin_; j<=jmax_; ++j) {
1375  // Flip indices as needed
1376  if(flip_x_) {jflipx=T2XSIZE-1-j; m = deltax+jflipx;} else {m = deltax+j;}
1377  for(int i=imin_; i<=imax_; ++i) {
1378  if(flip_y_) {iflipy=T2YSIZE-1-i; n = deltay+iflipy;} else {n = deltay+i;}
1379  if(m>=0 && m<=BXM3 && n>=0 && n<=BYM3) {
1380  dxytempdy[0][m][n] = (float)entry00_->xytemp[k0][l0][i][j]
1381  + adx*(float)(entry00_->xytemp[k0][l1][i][j] - entry00_->xytemp[k0][l0][i][j])
1382  + ady*(float)(entry00_->xytemp[k1][l0][i][j] - entry00_->xytemp[k0][l0][i][j])
1383  + adcota_*(float)(entry01_->xytemp[k0][l0][i][j] - entry00_->xytemp[k0][l0][i][j])
1384  + adcotb_*(float)(entry10_->xytemp[k0][l0][i][j] - entry00_->xytemp[k0][l0][i][j]);
1385  }
1386  }
1387  }
1388 
1389  //combine rows and columns to simulate double pixels
1390 
1391  for(int n=1; n<BYM3; ++n) {
1392  if(ydouble[n]) {
1393  // Combine the y-columns
1394  for(int m=1; m<BXM3; ++m) {
1395  dxytempdy[0][m][n] += dxytempdy[0][m][n+1];
1396  }
1397  // Now shift the remaining pixels over by one column
1398  for(int i=n+1; i<BYM3; ++i) {
1399  for(int m=1; m<BXM3; ++m) {
1400  dxytempdy[0][m][i] = dxytempdy[0][m][i+1];
1401  }
1402  }
1403  }
1404  }
1405 
1406  //combine rows and columns to simulate double pixels
1407 
1408  for(int m=1; m<BXM3; ++m) {
1409  if(xdouble[m]) {
1410  // Combine the x-rows
1411  for(int n=1; n<BYM3; ++n) {
1412  dxytempdy[0][m][n] += dxytempdy[0][m+1][n];
1413  }
1414  // Now shift the remaining pixels over by one row
1415  for(int j=m+1; j<BXM3; ++j) {
1416  for(int n=1; n<BYM3; ++n) {
1417  dxytempdy[0][j][n] = dxytempdy[0][j+1][n];
1418  }
1419  }
1420  }
1421  }
1422 
1423  // Finally, normalize the derivatives and copy the results to the output array
1424 
1425  for(int n=1; n<BYM3; ++n) {
1426  for(int m=1; m<BXM3; ++m) {
1427  dpdx2d[1][m][n] = (dxytempdy[1][m][n] - dxytempdy[0][m][n])/(2.*deltaxy[1]);
1428  }
1429  }
1430  }
1431 
1432  return success_;
1433 } // xytemp
float adcotb_
fractional pixel distance of cot(beta) from iy0_
float xsize_
Pixel x-size.
bool flip_y_
flip y sign-sensitive quantities
#define T2HY
#define BXM3
#define T2HX
float xytemp_[13+2][21+2]
template for xy-reconstruction
const SiPixelTemplateEntry2D * entry01_
#define BXM2
int iymax
the maximum nonzero pixel yindex in template (saves time during interpolation)
float adcota_
fractional pixel distance of cot(alpha) from jx0_
#define T2XSIZE
int imin_
min y index of templated cluster
int iymin
the minimum nonzero pixel yindex in template (saves time during interpolation)
short int xytemp[7][7][21][7]
templates for y-reconstruction (binned over 1 central pixel)
const SiPixelTemplateEntry2D * entry00_
int jxmax
the maximum nonzero pixel xindex in template (saves time during interpolation)
int imax_
max y index of templated cluster
#define BYM2
double f[11][100]
int jxmin
the minimum nonzero pixel xindex in template (saves time during interpolation)
T min(T a, T b)
Definition: MathUtil.h:58
#define BYM3
const SiPixelTemplateEntry2D * entry10_
int k[5][pyjets_maxn]
bool flip_x_
flip x sign-sensitive quantities
int jmax_
max x index of templated cluster
bool success_
true if cotalpha, cotbeta are inside of the acceptance (dynamically loaded)
float ysize_
Pixel y-size.
#define T2YSIZE
int jmin_
min x index of templated cluster
bool SiPixelTemplate2D::xytemp ( float  xhit,
float  yhit,
bool  ydouble[21+2],
bool  xdouble[13+2],
float  template2d[13+2][21+2] 
)

Interpolate stored 2-D information for input angles and hit position to make a 2-D template

Parameters
xhit- (input) x-position of hit relative to the lower left corner of pixel[1][1] (to allow for the "padding" of the two-d clusters in the splitter)
yhit- (input) y-position of hit relative to the lower left corner of pixel[1][1]
ydouble- (input) STL vector of 21 element array to flag a double-pixel starting at cluster[1][1]
xdouble- (input) STL vector of 11 element array to flag a double-pixel starting at cluster[1][1]
template2d- (output) 2d template of size matched to the cluster. Input must be zeroed since charge is added only.

Definition at line 1446 of file SiPixelTemplate2D.cc.

References BXM2, BYM2, and xytemp().

1447 {
1448  // Interpolate for a new set of track angles
1449 
1450  bool derivatives = false;
1451  float dpdx2d[2][BXM2][BYM2];
1452  float QTemplate;
1453 
1454  return SiPixelTemplate2D::xytemp(xhit, yhit, ydouble, xdouble, template2d, derivatives, dpdx2d, QTemplate);
1455 
1456 } // xytemp
bool xytemp(float xhit, float yhit, bool ydouble[21+2], bool xdouble[13+2], float template2d[13+2][21+2], bool dervatives, float dpdx2d[2][13+2][21+2], float &QTemplate)
#define BXM2
#define BYM2
bool SiPixelTemplate2D::xytemp ( int  id,
float  cotalpha,
float  cotbeta,
float  xhit,
float  yhit,
std::vector< bool > &  ydouble,
std::vector< bool > &  xdouble,
float  template2d[13+2][21+2] 
)

Interpolate stored 2-D information for input angles and hit position to make a 2-D template

Parameters
id- (input) the id of the template
cotalpha- (input) the cotangent of the alpha track angle (see CMS IN 2004/014)
cotbeta- (input) the cotangent of the beta track angle (see CMS IN 2004/014)
xhit- (input) x-position of hit relative to the lower left corner of pixel[1][1] (to allow for the "padding" of the two-d clusters in the splitter)
yhit- (input) y-position of hit relative to the lower left corner of pixel[1][1]
ydouble- (input) STL vector of 21 element array to flag a double-pixel starting at cluster[1][1]
xdouble- (input) STL vector of 11 element array to flag a double-pixel starting at cluster[1][1]
template2d- (output) 2d template of size matched to the cluster. Input must be zeroed since charge is added only.

Definition at line 1472 of file SiPixelTemplate2D.cc.

References BXM2, BYM2, f, mps_fire::i, interpolate(), TXSIZE, TYSIZE, and xytemp().

1473 {
1474 
1475  // Local variables
1476 
1477  bool derivatives = false;
1478  float dpdx2d[2][BXM2][BYM2];
1479  float QTemplate;
1480  float locBx = 1.f;
1481  if(cotbeta < 0.f) {locBx = -1.f;}
1482  float locBz = locBx;
1483  if(cotalpha < 0.f) {locBz = -locBx;}
1484 
1485  bool yd[BYM2], xd[BXM2];
1486 
1487  yd[0] = false; yd[BYM2-1] = false;
1488  for(int i=0; i<TYSIZE; ++i) { yd[i+1] = ydouble[i];}
1489  xd[0] = false; xd[BXM2-1] = false;
1490  for(int j=0; j<TXSIZE; ++j) { xd[j+1] = xdouble[j];}
1491 
1492 
1493  // Interpolate for a new set of track angles
1494 
1495  if(SiPixelTemplate2D::interpolate(id, cotalpha, cotbeta, locBz, locBx)) {
1496  return SiPixelTemplate2D::xytemp(xhit, yhit, yd, xd, template2d, derivatives, dpdx2d, QTemplate);
1497  } else {
1498  return false;
1499  }
1500 
1501 } // xytemp
bool xytemp(float xhit, float yhit, bool ydouble[21+2], bool xdouble[13+2], float template2d[13+2][21+2], bool dervatives, float dpdx2d[2][13+2][21+2], float &QTemplate)
#define TXSIZE
#define BXM2
#define BYM2
double f[11][100]
bool interpolate(int id, float cotalpha, float cotbeta, float locBz, float locBx)
#define TYSIZE
float SiPixelTemplate2D::ysize ( )
inline

pixel y-size (microns)

Definition at line 209 of file SiPixelTemplate2D.h.

Referenced by SiPixelTemplateReco2D::PixelTempReco2D(), and SiPixelDigitizerAlgorithm::PixelTempRewgt2D().

float SiPixelTemplate2D::zsize ( )
inline

pixel z-size or thickness (microns)

Definition at line 210 of file SiPixelTemplate2D.h.

Member Data Documentation

float SiPixelTemplate2D::adcota_
private

fractional pixel distance of cot(alpha) from jx0_

Definition at line 247 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::adcotb_
private

fractional pixel distance of cot(beta) from iy0_

Definition at line 244 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::chi2avgone_
private

average chi^2 for 1 pixel clusters

Definition at line 271 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::chi2minone_
private

minimum of chi^2 for 1 pixel clusters

Definition at line 272 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::chi2ppix_
private

average chi^2 per struck pixel

Definition at line 269 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::chi2scale_
private

scale factor for chi2 distribution

Definition at line 270 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::clslenx_
private

projected x-length of cluster

Definition at line 274 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::clsleny_
private

projected y-length of cluster

Definition at line 273 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::cota_current_
private

current cot alpha

Definition at line 231 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::cotalpha0_
private

minimum cot(alpha) covered

Definition at line 239 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::cotalpha1_
private

maximum cot(alpha) covered

Definition at line 240 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::cotb_current_
private

current cot beta

Definition at line 232 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::cotbeta0_
private

minimum cot(beta) covered

Definition at line 236 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::cotbeta1_
private

maximum cot(beta) covered

Definition at line 237 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::deltacota_
private

cot(alpha) bin size

Definition at line 241 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::deltacotb_
private

cot(beta) bin size

Definition at line 238 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::delyavg_
private

average difference between clsleny_ and cluster length [with threshold effects]

Definition at line 277 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::delysig_
private

rms of difference between clsleny_ and cluster length [with threshold effects]

Definition at line 278 of file SiPixelTemplate2D.h.

int SiPixelTemplate2D::Dtype_
private

flags BPix (=0) or FPix (=1)

Definition at line 235 of file SiPixelTemplate2D.h.

const SiPixelTemplateEntry2D* SiPixelTemplate2D::entry00_
private

Definition at line 294 of file SiPixelTemplate2D.h.

const SiPixelTemplateEntry2D* SiPixelTemplate2D::entry01_
private

Definition at line 296 of file SiPixelTemplate2D.h.

const SiPixelTemplateEntry2D* SiPixelTemplate2D::entry10_
private

Definition at line 295 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::fbin_[3]
private

The QBin definitions in Q_clus/Q_avg.

Definition at line 293 of file SiPixelTemplate2D.h.

bool SiPixelTemplate2D::flip_x_
private

flip x sign-sensitive quantities

Definition at line 253 of file SiPixelTemplate2D.h.

bool SiPixelTemplate2D::flip_y_
private

flip y sign-sensitive quantities

Definition at line 252 of file SiPixelTemplate2D.h.

int SiPixelTemplate2D::id_current_
private

current id

Definition at line 229 of file SiPixelTemplate2D.h.

int SiPixelTemplate2D::imax_
private

max y index of templated cluster

Definition at line 249 of file SiPixelTemplate2D.h.

int SiPixelTemplate2D::imin_
private

min y index of templated cluster

Definition at line 248 of file SiPixelTemplate2D.h.

int SiPixelTemplate2D::index_id_
private

current index

Definition at line 230 of file SiPixelTemplate2D.h.

int SiPixelTemplate2D::iy0_
private

index of nearest cot(beta) bin

Definition at line 242 of file SiPixelTemplate2D.h.

int SiPixelTemplate2D::iy1_
private

index of next-nearest cot(beta) bin

Definition at line 243 of file SiPixelTemplate2D.h.

int SiPixelTemplate2D::jmax_
private

max x index of templated cluster

Definition at line 251 of file SiPixelTemplate2D.h.

int SiPixelTemplate2D::jmin_
private

min x index of templated cluster

Definition at line 250 of file SiPixelTemplate2D.h.

int SiPixelTemplate2D::jx0_
private

index of nearest cot(alpha) bin

Definition at line 245 of file SiPixelTemplate2D.h.

int SiPixelTemplate2D::jx1_
private

index of next-nearest cot(alpha) bin

Definition at line 246 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::kappavav_
private

kappa parameter in Vavilov distribution

Definition at line 285 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::lanpar_[2][5]
private

Interpolated Landau parameters.

Definition at line 268 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::lorxdrift_
private

Lorentz x-drift.

Definition at line 289 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::lorxwidth_
private

Lorentz x-width.

Definition at line 287 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::lorydrift_
private

Lorentz y-drift.

Definition at line 288 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::lorywidth_
private

Lorentz y-width (sign corrected for fpix frame)

Definition at line 286 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::mpvvav_
private

most probable Q in Vavilov distribution

Definition at line 283 of file SiPixelTemplate2D.h.

int SiPixelTemplate2D::Nxx_
private

number of cot(alpha)-entries (rows) in template

Definition at line 234 of file SiPixelTemplate2D.h.

int SiPixelTemplate2D::Nyx_
private

number of cot(beta)-entries (columns) in template

Definition at line 233 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::offsetx_[4]
private

x-offset in charge bins

Definition at line 281 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::offsety_[4]
private

y-offset in charge bins

Definition at line 282 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::pixmax_
private

maximum pixel charge

Definition at line 260 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::qavg_
private

average cluster charge for this set of track angles

Definition at line 259 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::qscale_
private

charge scaling factor

Definition at line 261 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::s50_
private

1/2 of the pixel threshold signal in adc units

Definition at line 262 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::scalex_[4]
private

x-error scale factor in charge bins

Definition at line 279 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::scalexavg_
private

average x-error scale factor

Definition at line 275 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::scaley_[4]
private

y-error scale factor in charge bins

Definition at line 280 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::scaleyavg_
private

average y-error scale factor

Definition at line 276 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::sigmavav_
private

scale factor in Vavilov distribution

Definition at line 284 of file SiPixelTemplate2D.h.

bool SiPixelTemplate2D::success_
private

true if cotalpha, cotbeta are inside of the acceptance (dynamically loaded)

Definition at line 254 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::sxymax_
private

average pixel signal for y-projection of cluster

Definition at line 263 of file SiPixelTemplate2D.h.

const std::vector< SiPixelTemplateStore2D >& SiPixelTemplate2D::thePixelTemp_
private

Definition at line 300 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::xsize_
private

Pixel x-size.

Definition at line 290 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::xypary0x0_[2][5]
private

Polynomial error parameterization at ix0,iy0.

Definition at line 265 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::xypary0x1_[2][5]
private

Polynomial error parameterization at ix1,iy0.

Definition at line 267 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::xypary1x0_[2][5]
private

Polynomial error parameterization at ix0,iy1.

Definition at line 266 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::xytemp_[ 13+2][ 21+2]
private

template for xy-reconstruction

Definition at line 264 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::ysize_
private

Pixel y-size.

Definition at line 291 of file SiPixelTemplate2D.h.

float SiPixelTemplate2D::zsize_
private

Pixel z-size (thickness)

Definition at line 292 of file SiPixelTemplate2D.h.