SiPixelTemplate2D

SiPixelTemplateEntry2D

SiPixelTemplateHeader2D

SiPixelTemplateStore2D

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
//
//  SiPixelTemplate2D.h (v2.65)
//
//  Full 2-D templates for cluster splitting, simulated cluster reweighting, and improved cluster probability
//
// Created by Morris Swartz on 12/01/09.
// V1.01 - fix qavg_ filling
// V1.02 - Add locBz to test if FPix use is out of range
// V1.03 - Fix edge checking on final template to increase template size and to properly truncate cluster
// v2.00 - Major changes to accommodate 2D reconstruction
// v2.10 - Change chi2 and error scaling information to work with partially reconstructed clusters
// v2.20 - Add cluster charge probability information, side loading for template generation
// v2.21 - Double derivative interval [improves fit convergence]
// v2.25 - Resize template store to accommodate FPix Templates
// v2.30 - Fix bug found by P. Shuetze that compromises sqlite file loading
// v2.35 - Add directory path selection to the ascii pushfile method
// v2.50 - Change template storage to dynamically allocated 2D arrays of SiPixelTemplateEntry2D structs
// v2.51 - Ensure that the derivative arrays are correctly zeroed between calls
// v2.52 - Improve cosmetics for increased style points from judges
// v2.60 - Fix FPix multiframe lookup problem [takes +-cotalpha and +-cotbeta]
// v2.61a - Code 2.60 fix correctly
// v2.65 - change double pixel flags to work with new shifted reco code definition
//

// Build the template storage structure from several pieces

#ifndef SiPixelTemplate2D_h
#define SiPixelTemplate2D_h 1

#include <vector>
#include <cassert>
#include "boost/multi_array.hpp"

#ifndef SI_PIXEL_TEMPLATE_STANDALONE
#include "CondFormats/SiPixelObjects/interface/SiPixel2DTemplateDBObject.h"
#include "FWCore/Utilities/interface/Exception.h"
#include "CondFormats/SiPixelTransient/interface/SiPixelTemplateDefs.h"
#else
#include "SiPixelTemplateDefs.h"
#endif

struct SiPixelTemplateEntry2D {  //!< Basic template entry corresponding to a single set of track angles
  int runnum;                    //!< number of pixelav run used to generate this entry
  float cotalpha;                //!< cot(alpha) is proportional to cluster length in x and is basis of interpolation
  float cotbeta;                 //!< cot(beta) is proportional to cluster length in y and is basis of interpolation
  float costrk[3];               //!< direction cosines of tracks used to generate this entry
  float qavg;                    //!< average cluster charge for this set of track angles
  float pixmax;                  //!< maximum charge for individual pixels in cluster
  float sxymax;                  //!< average pixel signal for use of the error parameterization
  int iymin;                     //!< the minimum nonzero pixel yindex in template (saves time during interpolation)
  int iymax;                     //!< the maximum nonzero pixel yindex in template (saves time during interpolation)
  int jxmin;                     //!< the minimum nonzero pixel xindex in template (saves time during interpolation)
  int jxmax;                     //!< the maximum nonzero pixel xindex in template (saves time during interpolation)
  float xypar[2][5];             //!< pixel uncertainty parameterization
  float lanpar[2][5];            //!< pixel landau distribution parameters
  short int xytemp[7][7][T2YSIZE][T2XSIZE];  //!< templates for y-reconstruction (binned over 1 central pixel)
  float chi2ppix;                            //!< average chi^2 per pixel
  float chi2scale;                           //!< scale factor for the chi2 distribution
  float chi2avgone;                          //!< average y chi^2 for 1 pixel clusters
  float chi2minone;                          //!< minimum of y chi^2 for 1 pixel clusters
  float clsleny;                             //!< cluster y-length in pixels at signal height symax/2
  float clslenx;                             //!< cluster x-length in pixels at signal height sxmax/2
  float mpvvav;      //!< most probable charge in Vavilov distribution (not actually for larger kappa)
  float sigmavav;    //!< "sigma" scale fctor for Vavilov distribution
  float kappavav;    //!< kappa parameter for Vavilov distribution
  float scalexavg;   //!< average x-error scale factor
  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
  float scalex[4];   //!< x-error scale factor in 4 charge bins
  float scaley[4];   //!< y-error scale factor in 4 charge bins
  float offsetx[4];  //!< x-offset in 4 charge bins
  float offsety[4];  //!< y-offset in 4 charge bins
  float spare[3];
};

struct SiPixelTemplateHeader2D {  //!< template header structure
  int ID;                         //!< template ID number
  int NTy;                        //!< number of Template y entries
  int NTyx;                       //!< number of Template y-slices of x entries
  int NTxx;                       //!< number of Template x-entries in each slice
  int Dtype;                      //!< detector type (0=BPix, 1=FPix)
  float qscale;                   //!< Charge scaling to match cmssw and pixelav
  float lorywidth;                //!< estimate of y-lorentz width for optimal resolution
  float lorxwidth;                //!< estimate of x-lorentz width for optimal resolution
  float lorybias;                 //!< estimate of y-lorentz bias
  float lorxbias;                 //!< estimate of x-lorentz bias
  float Vbias;                    //!< detector bias potential in Volts
  float temperature;              //!< detector temperature in deg K
  float fluence;                  //!< radiation fluence in n_eq/cm^2
  float s50;                      //!< 1/2 of the multihit dcol threshold in electrons
  float ss50;                     //!< 1/2 of the single hit dcol threshold in electrons
  char title[80];                 //!< template title
  int templ_version;              //!< Version number of the template to ensure code compatibility
  float Bfield;                   //!< Bfield in Tesla
  float fbin[3];                  //!< The QBin definitions in Q_clus/Q_avg
  float xsize;                    //!< pixel size (for future use in upgraded geometry)
  float ysize;                    //!< pixel size (for future use in upgraded geometry)
  float zsize;                    //!< pixel size (for future use in upgraded geometry)
};

struct SiPixelTemplateStore2D {  //!< template storage structure

  void resize(int ny, int nx) {
    entry.resize(ny);
    store.resize(nx * ny);
    int off = 0;
    for (int i = 0; i < ny; ++i) {
      entry[i] = store.data() + off;
      off += nx;
    }
    assert(nx * ny == off);
  }

  SiPixelTemplateHeader2D head;  //!< Header information

  //!< use 2d entry to store BPix and FPix entries [dynamically allocated
  std::vector<SiPixelTemplateEntry2D*> entry;

  std::vector<SiPixelTemplateEntry2D> store;
};

// ******************************************************************************************
//! \class SiPixelTemplate2D
//!
//!  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.
// ******************************************************************************************
class SiPixelTemplate2D {
public:
  SiPixelTemplate2D(const std::vector<SiPixelTemplateStore2D>& thePixelTemp) : thePixelTemp_(thePixelTemp) {
    id_current_ = -1;
    index_id_ = -1;
    cota_current_ = 0.;
    cotb_current_ = 0.;
  }  //!< Default constructor

  // load the private store with info from the
  // file with the index (int) filenum ${dir}template_summary_zp${filenum}.out
#ifdef SI_PIXEL_TEMPLATE_STANDALONE
  static bool pushfile(int filenum, std::vector<SiPixelTemplateStore2D>& pixelTemp, std::string dir = "");

  // For calibrations only: load precalculated values -- no interpolation.
  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);

#else
  static bool pushfile(int filenum,
                       std::vector<SiPixelTemplateStore2D>& pixelTemp,
                       std::string dir = "CalibTracker/SiPixelESProducers/data/");

  // Load from the DB (the default in CMSSW):
  static bool pushfile(const SiPixel2DTemplateDBObject& dbobject, std::vector<SiPixelTemplateStore2D>& pixelTemp);

#endif

  //  Initialize things before interpolating
  bool getid(int id);

  bool interpolate(int id, float cotalpha, float cotbeta, float locBz, float locBx);

  // Interpolate input alpha and beta angles to produce a working template for each individual hit.

  // Works with Phase 0+1
  bool xytemp(float xhit,
              float yhit,
              bool ydouble[BYM2],
              bool xdouble[BXM2],
              float template2d[BXM2][BYM2],
              bool dervatives,
              float dpdx2d[2][BXM2][BYM2],
              float& QTemplate);

  // Overload for backward compatibility

  bool xytemp(float xhit, float yhit, bool ydouble[BYM2], bool xdouble[BXM2], float template2d[BXM2][BYM2]);

  // Overload for backward compatibility with re-weighting code

  bool xytemp(int id,
              float cotalpha,
              float cotbeta,
              float xhit,
              float yhit,
              std::vector<bool>& ydouble,
              std::vector<bool>& xdouble,
              float template2d[BXM2][BYM2]);

  void xysigma2(float qpixel, int index, float& xysig2);

  // Get the interpolated Landau distribution parameters

  void landau_par(float lanpar[2][5]);

  float qavg() { return qavg_; }      //!< average cluster charge for this set of track angles
  float pixmax() { return pixmax_; }  //!< maximum pixel charge
  float qscale() { return qscale_; }  //!< charge scaling factor
  float s50() { return s50_; }        //!< 1/2 of the pixel threshold signal in adc units
  float sxymax() { return sxymax_; }  //!< max pixel signal for pixel error calculation
  float scalex(int i) {
    if (checkIllegalIndex("scalex", 3, i)) {
      return scalex_[i];
    } else {
      return 0.f;
    }
  }  //!< x-error scale factor in 4 charge bins
  float scaley(int i) {
    if (checkIllegalIndex("scaley", 3, i)) {
      return scaley_[i];
    } else {
      return 0.f;
    }
  }  //!< y-error scale factor in 4 charge bins
  float offsetx(int i) {
    if (checkIllegalIndex("offsetx", 3, i)) {
      return offsetx_[i];
    } else {
      return 0.f;
    }
  }  //!< x-offset in 4 charge bins
  float offsety(int i) {
    if (checkIllegalIndex("offsety", 3, i)) {
      return offsety_[i];
    } else {
      return 0.f;
    }
  }  //!< y-offset in 4 charge bins
  float fbin(int i) {
    if (checkIllegalIndex("fbin", 2, i)) {
      return fbin_[i];
    } else {
      return 0.f;
    }
  }  //!< Return lower bound of Qbin definition
  float sizex() { return clslenx_; }          //!< return x size of template cluster
  float sizey() { return clsleny_; }          //!< return y size of template cluster
  float chi2ppix() { return chi2ppix_; }      //!< average chi^2 per struck pixel
  float chi2scale() { return chi2scale_; }    //!< scale factor for chi^2 distribution
  float chi2avgone() { return chi2avgone_; }  //!< average y chi^2 for 1 pixel clusters
  float chi2minone() { return chi2minone_; }  //!< minimum of y chi^2 for 1 pixel clusters
  float mpvvav() { return mpvvav_; }          //!< most probable Q in Vavilov distribution
  float sigmavav() { return sigmavav_; }      //!< scale factor in Vavilov distribution
  float kappavav() { return kappavav_; }      //!< kappa parameter in Vavilov distribution
  float lorydrift() { return lorydrift_; }    //!< signed lorentz y-width (microns)
  float lorxdrift() { return lorxdrift_; }    //!< signed lorentz x-width (microns)
  float clsleny() { return clsleny_; }        //!< cluster y-size
  float clslenx() { return clslenx_; }        //!< cluster x-size
  float scaleyavg() { return scaleyavg_; }    //!< y-reco error scaling factor
  float scalexavg() { return scalexavg_; }    //!< x-reco error scaling factor
  float delyavg() {
    return delyavg_;
  }  //!< average difference between clsleny_ and cluster length [with threshold effects]
  float delysig() { return delysig_; }  //!< rms difference between clsleny_ and cluster length [with threshold effects]
  float xsize() { return xsize_; }      //!< pixel x-size (microns)
  float ysize() { return ysize_; }      //!< pixel y-size (microns)
  float zsize() { return zsize_; }      //!< pixel z-size or thickness (microns)
  int storesize() {
    return (int)thePixelTemp_.size();
  }  //!< return the size of the template store (the number of stored IDs

private:
  bool checkIllegalIndex(const std::string whichMethod, int indMax, int i) {
#ifndef SI_PIXEL_TEMPLATE_STANDALONE
    if (i < 0 || i > indMax) {
      throw cms::Exception("DataCorrupt")
          << "SiPixelTemplate2D::" << whichMethod << " called with illegal index = " << i << std::endl;
    }
#else
    assert(i >= 0 && i < indMax + 1);

#endif
    return true;
  }

  // Keep current template interpolaion parameters

  int id_current_;      //!< current id
  int index_id_;        //!< current index
  float cota_current_;  //!< current cot alpha
  float cotb_current_;  //!< current cot beta
  int Nyx_;             //!< number of cot(beta)-entries (columns) in template
  int Nxx_;             //!< number of cot(alpha)-entries (rows) in template
  int Dtype_;           //!< flags BPix (=0) or FPix (=1)
  float cotbeta0_;      //!< minimum cot(beta) covered
  float cotbeta1_;      //!< maximum cot(beta) covered
  float deltacotb_;     //!< cot(beta) bin size
  float cotalpha0_;     //!< minimum cot(alpha) covered
  float cotalpha1_;     //!< maximum cot(alpha) covered
  float deltacota_;     //!< cot(alpha) bin size
  int iy0_;             //!< index of nearest cot(beta) bin
  int iy1_;             //!< index of next-nearest cot(beta) bin
  float adcotb_;        //!< fractional pixel distance of cot(beta) from iy0_
  int jx0_;             //!< index of nearest cot(alpha) bin
  int jx1_;             //!< index of next-nearest cot(alpha) bin
  float adcota_;        //!< fractional pixel distance of cot(alpha) from jx0_
  int imin_;            //!< min y index of templated cluster
  int imax_;            //!< max y index of templated cluster
  int jmin_;            //!< min x index of templated cluster
  int jmax_;            //!< max x index of templated cluster
  bool flip_y_;         //!< flip y sign-sensitive quantities
  bool flip_x_;         //!< flip x sign-sensitive quantities
  bool success_;        //!< true if cotalpha, cotbeta are inside of the acceptance (dynamically loaded)

  // Keep results of last interpolation to return through member functions

  float qavg_;                //!< average cluster charge for this set of track angles
  float pixmax_;              //!< maximum pixel charge
  float qscale_;              //!< charge scaling factor
  float s50_;                 //!< 1/2 of the pixel threshold signal in adc units
  float sxymax_;              //!< average pixel signal for y-projection of cluster
  float xytemp_[BXM2][BYM2];  //!< template for xy-reconstruction
  float xypary0x0_[2][5];     //!< Polynomial error parameterization at ix0,iy0
  float xypary1x0_[2][5];     //!< Polynomial error parameterization at ix0,iy1
  float xypary0x1_[2][5];     //!< Polynomial error parameterization at ix1,iy0
  float lanpar_[2][5];        //!< Interpolated Landau parameters
  float chi2ppix_;            //!< average chi^2 per struck pixel
  float chi2scale_;           //!< scale factor for chi2 distribution
  float chi2avgone_;          //!< average chi^2 for 1 pixel clusters
  float chi2minone_;          //!< minimum of chi^2 for 1 pixel clusters
  float clsleny_;             //!< projected y-length of cluster
  float clslenx_;             //!< projected x-length of cluster
  float scalexavg_;           //!< average x-error scale factor
  float scaleyavg_;           //!< average y-error scale factor
  float delyavg_;             //!< average difference between clsleny_ and cluster length [with threshold effects]
  float delysig_;             //!< rms of difference between clsleny_ and cluster length [with threshold effects]
  float scalex_[4];           //!< x-error scale factor in charge bins
  float scaley_[4];           //!< y-error scale factor in charge bins
  float offsetx_[4];          //!< x-offset in charge bins
  float offsety_[4];          //!< y-offset in charge bins
  float mpvvav_;              //!< most probable Q in Vavilov distribution
  float sigmavav_;            //!< scale factor in Vavilov distribution
  float kappavav_;            //!< kappa parameter in Vavilov distribution
  float lorywidth_;           //!< Lorentz y-width (sign corrected for fpix frame)
  float lorxwidth_;           //!< Lorentz x-width
  float lorydrift_;           //!< Lorentz y-drift
  float lorxdrift_;           //!< Lorentz x-drift
  float xsize_;               //!< Pixel x-size
  float ysize_;               //!< Pixel y-size
  float zsize_;               //!< Pixel z-size (thickness)
  float fbin_[3];             //!< The QBin definitions in Q_clus/Q_avg
  const SiPixelTemplateEntry2D* entry00_;  // Pointer to presently interpolated point [iy,ix]
  const SiPixelTemplateEntry2D* entry10_;  // Pointer to presently interpolated point [iy+1,ix]
  const SiPixelTemplateEntry2D* entry01_;  // Pointer to presently interpolated point [iy,ix+1]

  // The actual template store is a std::vector container
  const std::vector<SiPixelTemplateStore2D>& thePixelTemp_;
};

#endif