CMS 3D CMS Logo

HFTimingTrustFlag.cc
Go to the documentation of this file.
3 
4 namespace HFTimingTrust {
5  // Template class checks HF timing, sets rechit
6  // timing status bits according to its uncertainty;
7 
8  double timerr_hf(double rectime, double ampl);
9 
10  template <class T, class V>
11  void checkHFTimErr(T& rechit, const V& digi, int level1, int level2) {
12  // Get rechit timing
13  double rectime = rechit.time();
14 
15  if (rectime > -100 && rectime < 250) {
16  // Get signal from digi
17  double ampl = 0;
18  double sum = 0;
19  int maxI = -1;
20  for (int i = 0; i < digi.size(); ++i) {
21  sum += digi.sample(i).nominal_fC();
22  if (digi.sample(i).nominal_fC() > ampl) {
23  ampl = digi.sample(i).nominal_fC();
24  maxI = i;
25  }
26  }
27  if (ampl > 1 && maxI > 0 && maxI < digi.size() - 1) {
28  ampl = ampl + digi.sample(maxI - 1).nominal_fC() + digi.sample(maxI + 1).nominal_fC();
29  ampl -= (sum - ampl) * 3.0 / (digi.size() - 3);
30  if (ampl > 3) {
31  int timerr = (int)timerr_hf(rectime, ampl);
32  uint32_t status = 0;
33  if (timerr < 0)
34  status = 3; // unreconstructable time
35  else if (timerr <= level1)
36  status = 0; // time reconstructed; precision better than level1 value
37  else if (timerr <= level2)
38  status = 1; // precision worse than level1 value
39  else
40  status = 2; //precision worse than level 2 value
41  rechit.setFlagField(status, HcalCaloFlagLabels::HFTimingTrustBits, 2);
42  return;
43  }
44  }
45 
46  } // if (rectime > -100 && rectime < -250)
47  // if rectime outside expected range, set flag field to 3 (unreconstructable)?
48  rechit.setFlagField(3, HcalCaloFlagLabels::HFTimingTrustBits, 2);
49  return;
50  }
51 
52  static const float hfterrlut[195] = {
53  3.42, 3.04, 9.18, 8.97, 8.49, 8.08, 8.01, 8.30, 8.75, 8.22, 7.21, 5.04, 2.98, 2.04, 1.22, 7.58, 7.79, 7.11,
54  6.93, 7.03, 7.27, 7.23, 6.53, 4.59, 2.40, 1.46, 1.31, 0.42, 5.95, 6.48, 6.29, 5.84, 5.97, 6.31, 6.00, 4.37,
55  2.37, 1.03, 0.72, 0.81, 0.27, 3.98, 5.57, 5.04, 5.10, 5.21, 5.18, 4.22, 2.23, 1.07, 0.66, 0.40, 0.48, 0.17,
56  2.51, 4.70, 4.28, 4.29, 4.36, 3.84, 2.40, 1.15, 0.68, 0.40, 0.24, 0.29, 0.11, 0.81, 3.71, 3.47, 3.48, 3.52,
57  2.58, 1.25, 0.71, 0.41, 0.26, 0.16, 0.16, 0.08, 0.27, 2.88, 2.63, 2.76, 2.33, 1.31, 0.72, 0.44, 0.27, 0.16,
58  0.11, 0.10, 0.06, 0.15, 2.11, 2.00, 1.84, 1.46, 0.79, 0.45, 0.26, 0.17, 0.10, 0.08, 0.05, 0.04, 0.10, 1.58,
59  1.49, 1.25, 0.90, 0.48, 0.29, 0.17, 0.10, 0.06, 0.06, 0.02, 0.03, 0.06, 1.26, 1.03, 0.77, 0.57, 0.30, 0.18,
60  0.11, 0.06, 0.04, 0.05, 0.01, 0.02, 0.04, 0.98, 0.66, 0.47, 0.39, 0.18, 0.11, 0.07, 0.04, 0.03, 0.04, 0.01,
61  0.02, 0.02, 0.86, 0.44, 0.30, 0.27, 0.11, 0.07, 0.04, 0.03, 0.02, 0.04, 0.01, 0.02, 0.02, 0.80, 0.30, 0.21,
62  0.17, 0.07, 0.04, 0.03, 0.02, 0.01, 0.04, 0.01, 0.02, 0.01, 0.76, 0.22, 0.17, 0.12, 0.05, 0.03, 0.02, 0.01,
63  0.01, 0.04, 0.01, 0.02, 0.01, 0.76, 0.17, 0.14, 0.09, 0.03, 0.02, 0.01, 0.01, 0.01, 0.04};
64 
65  double timerr_hf(double rectime, double ampl) {
66  int itim, iampl, index;
67  double tim;
68  if (rectime > 0)
69  tim = rectime - ((int)(rectime / 25)) * 25;
70  else
71  tim = rectime - ((int)(rectime / 25)) * 25 + 25;
72  itim = (int)(tim / 2.0);
73 
74  iampl = 0;
75  static const double bampl[15] = {3, 5, 8, 12, 19, 30, 47, 73, 115, 182, 287, 452, 712, 1120, 1766};
76  if (ampl >= bampl[14])
77  iampl = 14;
78  else {
79  for (int i = 1; i <= 14; i++) {
80  if (ampl < bampl[i]) {
81  iampl = i - 1;
82  break;
83  }
84  }
85  }
86 
87  index = itim + iampl * 13;
88 
89  double y1 = hfterrlut[index];
90  double y2 = 0;
91  double v1 = y1;
92  if (itim < 12) {
93  y2 = hfterrlut[index + 1];
94  v1 = y1 + (y2 - y1) * (tim / 2.0 - (float)itim);
95  }
96  double yy1 = 0;
97  double yy2 = 0;
98  double v2 = 0;
99  if (iampl < 14) {
100  yy1 = hfterrlut[index + 13];
101  if (itim == 12)
102  v2 = yy1;
103  else {
104  yy2 = hfterrlut[index + 14];
105  v2 = yy1 + (yy2 - yy1) * (tim / 2.0 - (float)itim);
106  }
107  v1 = v1 + (v2 - v1) * (ampl - bampl[iampl]) / (bampl[iampl + 1] - bampl[iampl]);
108  }
109 
110  return v1;
111  }
112 
113 } // namespace HFTimingTrust
114 
115 using namespace HFTimingTrust;
116 
118  HFTimingTrustLevel1_ = 1; // time precision 1ns
119  HFTimingTrustLevel2_ = 4; // time precision 4ns
120 }
121 
123  HFTimingTrustLevel1_ = level1; // allow user to set t-trust level
124  HFTimingTrustLevel2_ = level2;
125 }
126 
128 
130  checkHFTimErr<HFRecHit, HFDataFrame>(rechit, digi, HFTimingTrustLevel1_, HFTimingTrustLevel2_);
131  return;
132 }
void setHFTimingTrustFlag(HFRecHit &rechit, const HFDataFrame &digi)
void checkHFTimErr(T &rechit, const V &digi, int level1, int level2)
level1
Definition: getInfo.py:10
uint32_t T const *__restrict__ uint32_t const *__restrict__ int32_t int Histo::index_type cudaStream_t V
double timerr_hf(double rectime, double ampl)
static const float hfterrlut[195]
long double T