CMS 3D CMS Logo

SiPixelTemplate2D.h
Go to the documentation of this file.
1 //
2 // SiPixelTemplate2D.h (v2.65)
3 //
4 // Full 2-D templates for cluster splitting, simulated cluster reweighting, and improved cluster probability
5 //
6 // Created by Morris Swartz on 12/01/09.
7 // V1.01 - fix qavg_ filling
8 // V1.02 - Add locBz to test if FPix use is out of range
9 // V1.03 - Fix edge checking on final template to increase template size and to properly truncate cluster
10 // v2.00 - Major changes to accommodate 2D reconstruction
11 // v2.10 - Change chi2 and error scaling information to work with partially reconstructed clusters
12 // v2.20 - Add cluster charge probability information, side loading for template generation
13 // v2.21 - Double derivative interval [improves fit convergence]
14 // v2.25 - Resize template store to accommodate FPix Templates
15 // v2.30 - Fix bug found by P. Shuetze that compromises sqlite file loading
16 // v2.35 - Add directory path selection to the ascii pushfile method
17 // v2.50 - Change template storage to dynamically allocated 2D arrays of SiPixelTemplateEntry2D structs
18 // v2.51 - Ensure that the derivative arrays are correctly zeroed between calls
19 // v2.52 - Improve cosmetics for increased style points from judges
20 // v2.60 - Fix FPix multiframe lookup problem [takes +-cotalpha and +-cotbeta]
21 // v2.61a - Code 2.60 fix correctly
22 // v2.65 - change double pixel flags to work with new shifted reco code definition
23 //
24 
25 // Build the template storage structure from several pieces
26 
27 #ifndef SiPixelTemplate2D_h
28 #define SiPixelTemplate2D_h 1
29 
30 #include <vector>
31 #include <cassert>
32 #include "boost/multi_array.hpp"
33 
34 #ifndef SI_PIXEL_TEMPLATE_STANDALONE
38 #else
39 #include "SiPixelTemplateDefs.h"
40 #endif
41 
43  int runnum;
44  float cotalpha;
45  float cotbeta;
46  float costrk[3];
47  float qavg;
48  float pixmax;
49  float sxymax;
50  int iymin;
51  int iymax;
52  int jxmin;
53  int jxmax;
54  float xypar[2][5];
55  float lanpar[2][5];
56  short int xytemp[7][7][T2YSIZE][T2XSIZE];
57  float chi2ppix;
58  float chi2scale;
59  float chi2avgone;
60  float chi2minone;
61  float clsleny;
62  float clslenx;
63  float mpvvav;
64  float sigmavav;
65  float kappavav;
66  float scalexavg;
67  float scaleyavg;
68  float delyavg;
69  float delysig;
70  float scalex[4];
71  float scaley[4];
72  float offsetx[4];
73  float offsety[4];
74  float spare[3];
75 };
76 
78  int ID;
79  int NTy;
80  int NTyx;
81  int NTxx;
82  int Dtype;
83  float qscale;
84  float lorywidth;
85  float lorxwidth;
86  float lorybias;
87  float lorxbias;
88  float Vbias;
89  float temperature;
90  float fluence;
91  float s50;
92  float ss50;
93  char title[80];
95  float Bfield;
96  float fbin[3];
97  float xsize;
98  float ysize;
99  float zsize;
100 };
101 
105  void destroy() { // deletes arrays created by pushfile method of SiPixelTemplate
106  if (entry != nullptr) {
107  delete[] entry[0];
108  delete[] entry;
109  }
110  }
111 };
112 
113 // ******************************************************************************************
131 // ******************************************************************************************
133 public:
134  SiPixelTemplate2D(const std::vector<SiPixelTemplateStore2D>& thePixelTemp) : thePixelTemp_(thePixelTemp) {
135  id_current_ = -1;
136  index_id_ = -1;
137  cota_current_ = 0.;
138  cotb_current_ = 0.;
139  }
140 
141  // load the private store with info from the
142  // file with the index (int) filenum ${dir}template_summary_zp${filenum}.out
143  static bool pushfile(int filenum, std::vector<SiPixelTemplateStore2D>& pixelTemp, std::string dir = "");
144 
145 #ifndef SI_PIXEL_TEMPLATE_STANDALONE
146  static bool pushfile(const SiPixel2DTemplateDBObject& dbobject,
147  std::vector<SiPixelTemplateStore2D>& pixelTemp); // load the private store with info from db
148 #endif
149 
150  // Initialize things before interpolating
151 
152  void sideload(SiPixelTemplateEntry2D* entry,
153  int iDtype,
154  float locBx,
155  float locBz,
156  float lorwdy,
157  float lorwdx,
158  float q50,
159  float fbin[3],
160  float xsize,
161  float ysize,
162  float zsize);
163 
164  // Initialize things before interpolating
165  bool getid(int id);
166 
167  bool interpolate(int id, float cotalpha, float cotbeta, float locBz, float locBx);
168 
169  // Interpolate input alpha and beta angles to produce a working template for each individual hit.
170 
171  // Works with Phase 0+1
172  bool xytemp(float xhit,
173  float yhit,
174  bool ydouble[BYM2],
175  bool xdouble[BXM2],
176  float template2d[BXM2][BYM2],
177  bool dervatives,
178  float dpdx2d[2][BXM2][BYM2],
179  float& QTemplate);
180 
181  // Overload for backward compatibility
182 
183  bool xytemp(float xhit, float yhit, bool ydouble[BYM2], bool xdouble[BXM2], float template2d[BXM2][BYM2]);
184 
185  // Overload for backward compatibility with re-weighting code
186 
187  bool xytemp(int id,
188  float cotalpha,
189  float cotbeta,
190  float xhit,
191  float yhit,
192  std::vector<bool>& ydouble,
193  std::vector<bool>& xdouble,
194  float template2d[BXM2][BYM2]);
195 
196  void xysigma2(float qpixel, int index, float& xysig2);
197 
198  // Get the interpolated Landau distribution parameters
199 
200  void landau_par(float lanpar[2][5]);
201 
202  float qavg() { return qavg_; }
203  float pixmax() { return pixmax_; }
204  float qscale() { return qscale_; }
205  float s50() { return s50_; }
206  float sxymax() { return sxymax_; }
207  float scalex(int i) {
208  if (checkIllegalIndex("scalex", 3, i)) {
209  return scalex_[i];
210  } else {
211  return 0.f;
212  }
213  }
214  float scaley(int i) {
215  if (checkIllegalIndex("scaley", 3, i)) {
216  return scaley_[i];
217  } else {
218  return 0.f;
219  }
220  }
221  float offsetx(int i) {
222  if (checkIllegalIndex("offsetx", 3, i)) {
223  return offsetx_[i];
224  } else {
225  return 0.f;
226  }
227  }
228  float offsety(int i) {
229  if (checkIllegalIndex("offsety", 3, i)) {
230  return offsety_[i];
231  } else {
232  return 0.f;
233  }
234  }
235  float fbin(int i) {
236  if (checkIllegalIndex("fbin", 2, i)) {
237  return fbin_[i];
238  } else {
239  return 0.f;
240  }
241  }
242  float sizex() { return clslenx_; }
243  float sizey() { return clsleny_; }
244  float chi2ppix() { return chi2ppix_; }
245  float chi2scale() { return chi2scale_; }
246  float chi2avgone() { return chi2avgone_; }
247  float chi2minone() { return chi2minone_; }
248  float mpvvav() { return mpvvav_; }
249  float sigmavav() { return sigmavav_; }
250  float kappavav() { return kappavav_; }
251  float lorydrift() { return lorydrift_; }
252  float lorxdrift() { return lorxdrift_; }
253  float clsleny() { return clsleny_; }
254  float clslenx() { return clslenx_; }
255  float scaleyavg() { return scaleyavg_; }
256  float scalexavg() { return scalexavg_; }
257  float delyavg() {
258  return delyavg_;
259  }
260  float delysig() { return delysig_; }
261  float xsize() { return xsize_; }
262  float ysize() { return ysize_; }
263  float zsize() { return zsize_; }
264  int storesize() {
265  return (int)thePixelTemp_.size();
266  }
267 
268 private:
269  bool checkIllegalIndex(const std::string whichMethod, int indMax, int i) {
270 #ifndef SI_PIXEL_TEMPLATE_STANDALONE
271  if (i < 0 || i > indMax) {
272  throw cms::Exception("DataCorrupt")
273  << "SiPixelTemplate2D::" << whichMethod << " called with illegal index = " << i << std::endl;
274  }
275 #else
276  assert(i >= 0 && i < indMax + 1);
277 
278 #endif
279  return true;
280  }
281 
282  // Keep current template interpolaion parameters
283 
285  int index_id_;
288  int Nyx_;
289  int Nxx_;
290  int Dtype_;
291  float cotbeta0_;
292  float cotbeta1_;
293  float deltacotb_;
294  float cotalpha0_;
295  float cotalpha1_;
296  float deltacota_;
297  int iy0_;
298  int iy1_;
299  float adcotb_;
300  int jx0_;
301  int jx1_;
302  float adcota_;
303  int imin_;
304  int imax_;
305  int jmin_;
306  int jmax_;
307  bool flip_y_;
308  bool flip_x_;
309  bool success_;
310 
311  // Keep results of last interpolation to return through member functions
312 
313  float qavg_;
314  float pixmax_;
315  float qscale_;
316  float s50_;
317  float sxymax_;
318  float xytemp_[BXM2][BYM2];
319  float xypary0x0_[2][5];
320  float xypary1x0_[2][5];
321  float xypary0x1_[2][5];
322  float lanpar_[2][5];
323  float chi2ppix_;
324  float chi2scale_;
325  float chi2avgone_;
326  float chi2minone_;
327  float clsleny_;
328  float clslenx_;
329  float scalexavg_;
330  float scaleyavg_;
331  float delyavg_;
332  float delysig_;
333  float scalex_[4];
334  float scaley_[4];
335  float offsetx_[4];
336  float offsety_[4];
337  float mpvvav_;
338  float sigmavav_;
339  float kappavav_;
340  float lorywidth_;
341  float lorxwidth_;
342  float lorydrift_;
343  float lorxdrift_;
344  float xsize_;
345  float ysize_;
346  float zsize_;
347  float fbin_[3];
348  const SiPixelTemplateEntry2D* entry00_; // Pointer to presently interpolated point [iy,ix]
349  const SiPixelTemplateEntry2D* entry10_; // Pointer to presently interpolated point [iy+1,ix]
350  const SiPixelTemplateEntry2D* entry01_; // Pointer to presently interpolated point [iy,ix+1]
351 
352  // The actual template store is a std::vector container
353 
354  const std::vector<SiPixelTemplateStore2D>& thePixelTemp_;
355 };
356 
357 #endif
float pixmax
maximum charge for individual pixels in cluster
bool checkIllegalIndex(const std::string whichMethod, int indMax, int i)
float adcotb_
fractional pixel distance of cot(beta) from iy0_
float kappavav_
kappa parameter in Vavilov distribution
float deltacota_
cot(alpha) bin size
float qscale
Charge scaling to match cmssw and pixelav.
float delyavg()
average difference between clsleny_ and cluster length [with threshold effects]
float chi2ppix_
average chi^2 per struck pixel
float xsize()
pixel x-size (microns)
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
float Vbias
detector bias potential in Volts
float lorxwidth
estimate of x-lorentz width for optimal resolution
float chi2ppix()
average chi^2 per struck pixel
int runnum
< Basic template entry corresponding to a single set of track angles
int jx0_
index of nearest cot(alpha) bin
float ysize
pixel size (for future use in upgraded geometry)
float deltacotb_
cot(beta) bin size
SiPixelTemplateHeader2D head
< template storage structure
float qavg_
average cluster charge for this set of track angles
float cotalpha1_
maximum cot(alpha) covered
float xsize_
Pixel x-size.
int Dtype_
flags BPix (=0) or FPix (=1)
float scalexavg()
x-reco error scaling factor
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 sxymax_
average pixel signal for y-projection of cluster
int Nxx_
number of cot(alpha)-entries (rows) in template
int index_id_
current index
const Int_t ysize
float delyavg
average length difference between template and cluster
float delysig
rms of length difference between template and cluster
float scaleyavg()
y-reco error scaling factor
float scalexavg_
average x-error scale factor
float chi2scale_
scale factor for chi2 distribution
float s50()
1/2 of the pixel threshold signal in adc units
float lorydrift_
Lorentz y-drift.
const SiPixelTemplateEntry2D * entry01_
float offsetx(int i)
x-offset in 4 charge bins
float cotbeta
cot(beta) is proportional to cluster length in y and is basis of interpolation
#define BXM2
float lorxbias
estimate of x-lorentz bias
int iymax
the maximum nonzero pixel yindex in template (saves time during interpolation)
float adcota_
fractional pixel distance of cot(alpha) from jx0_
float clslenx()
cluster x-size
#define T2XSIZE
float sigmavav_
scale factor in Vavilov distribution
int storesize()
return the size of the template store (the number of stored IDs
float ss50
1/2 of the single hit dcol threshold in electrons
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)
float chi2avgone()
average y chi^2 for 1 pixel clusters
int ID
< template header structure
int NTxx
number of Template x-entries in each slice
const SiPixelTemplateEntry2D * entry00_
float mpvvav
most probable charge in Vavilov distribution (not actually for larger kappa)
const std::vector< SiPixelTemplateStore2D > & thePixelTemp_
float s50_
1/2 of the pixel threshold signal in adc units
float cotbeta0_
minimum cot(beta) covered
float scalex[4]
x-error scale factor in 4 charge bins
int jxmax
the maximum nonzero pixel xindex in template (saves time during interpolation)
int imax_
max y index of templated cluster
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
float chi2minone_
minimum of chi^2 for 1 pixel clusters
#define BYM2
float scalex(int i)
x-error scale factor in 4 charge bins
float lorxdrift_
Lorentz x-drift.
int jxmin
the minimum nonzero pixel xindex in template (saves time during interpolation)
float chi2minone()
minimum of y chi^2 for 1 pixel clusters
float cotalpha0_
minimum cot(alpha) covered
float chi2scale()
scale factor for chi^2 distribution
float sigmavav
"sigma" scale fctor for Vavilov distribution
float cotalpha
cot(alpha) is proportional to cluster length in x and is basis of interpolation
float lorxdrift()
signed lorentz x-width (microns)
const SiPixelTemplateEntry2D * entry10_
float mpvvav()
most probable Q in Vavilov distribution
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 zsize
pixel size (for future use in upgraded geometry)
float zsize_
Pixel z-size (thickness)
SiPixelTemplate2D(const std::vector< SiPixelTemplateStore2D > &thePixelTemp)
Default constructor.
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 lorywidth
estimate of y-lorentz width for optimal resolution
float clslenx
cluster x-length in pixels at signal height sxmax/2
float kappavav()
kappa parameter in Vavilov distribution
float cota_current_
current cot alpha
float pixmax()
maximum pixel charge
float lorxwidth_
Lorentz x-width.
float lorydrift()
signed lorentz y-width (microns)
int NTy
number of Template y entries
float sxymax()
max pixel signal for pixel error calculation
float pixmax_
maximum pixel charge
float cotbeta1_
maximum cot(beta) covered
float scalexavg
average x-error scale factor
int jmax_
max x index of templated cluster
float mpvvav_
most probable Q in Vavilov distribution
int Dtype
detector type (0=BPix, 1=FPix)
float ysize()
pixel y-size (microns)
float sizex()
return x size of template cluster
float qscale()
charge scaling factor
float sizey()
return y size of template cluster
float scaley[4]
y-error scale factor in 4 charge bins
float qavg()
average cluster charge for this set of track angles
float fbin(int i)
Return lower bound of Qbin definition.
bool success_
true if cotalpha, cotbeta are inside of the acceptance (dynamically loaded)
float ysize_
Pixel y-size.
float scaleyavg_
average y-error scale factor
float cotb_current_
current cot beta
float chi2ppix
average chi^2 per pixel
int templ_version
Version number of the template to ensure code compatibility.
float delysig()
rms difference between clsleny_ and cluster length [with threshold effects]
float zsize()
pixel z-size or thickness (microns)
float s50
1/2 of the multihit dcol threshold in electrons
float temperature
detector temperature in deg K
float Bfield
Bfield in Tesla.
float offsety(int i)
y-offset in 4 charge bins
float lorywidth_
Lorentz y-width (sign corrected for fpix frame)
float qscale_
charge scaling factor
#define T2YSIZE
int iy0_
index of nearest cot(beta) bin
const Int_t xsize
float fluence
radiation fluence in n_eq/cm^2
float kappavav
kappa parameter for Vavilov distribution
float clsleny()
cluster y-size
float lorybias
estimate of y-lorentz bias
int NTyx
number of Template y-slices of x entries
int id_current_
current id
int jmin_
min x index of templated cluster
float delysig_
rms of difference between clsleny_ and cluster length [with threshold effects]
float sigmavav()
scale factor in Vavilov distribution
float scaley(int i)
y-error scale factor in 4 charge bins