Belle II Software  release-05-01-25
ShapeFitter.cc
1 #include <ecl/digitization/algorithms.h>
2 #include <iostream>
3 
4 using namespace std;
5 
6 void Belle2::ECL::shapeFitter(short int* id, int* f, int* f1, int* fg41, int* fg43, int* fg31, int* fg32, int* fg33, int* y,
7  int* ttrig2, int* n16, int* lar, int* ltr, int* lq, int* hi2)
8 {
9  static long long int k_np[16] = {
10  65536,
11  32768,
12  21845,
13  16384,
14  13107,
15  10923,
16  9362,
17  8192,
18  7282,
19  6554,
20  5958,
21  5461,
22  5041,
23  4681,
24  4369,
25  4096
26  };
27 
28 
29  int A0 = (int) * (id + 0) - 128;
30  int Askip = (int) * (id + 1) - 128;
31 
32  int ttrig;
33  int Ahard = (int) * (id + 2);
34  int k_a = (int) * ((unsigned char*)id + 26);
35  int k_b = (int) * ((unsigned char*)id + 27);
36  int k_c = (int) * ((unsigned char*)id + 28);
37  int k_16 = (int) * ((unsigned char*)id + 29);
38  int k1_chi = (int) * ((unsigned char*)id + 24);
39  int k2_chi = (int) * ((unsigned char*)id + 25);
40 
41  int chi_thres = (int) * (id + 15);
42 
43 
44 
45  int s1, s2;
46 
47  long long int z00;
48 
49  int ys;
50  ys = 0;
51  int it, it0;
52 // long long d_it;
53  int it_h, it_l;
54  long long A1, B1, A2, C1, ch1, ch2, B2, B3, B5 ;
55  int low_ampl, i, T, iter;
56  ch1 = -1;
57 
58  ttrig = *ttrig2 / 6;
59 
60 
61  if (k_16 + *n16 != 16) {
62  cout << "disagreement in number of the points " << k_16 << "and " << *n16 << endl;
63  }
64 
65 
66  int validity_code = 0;
67  for (i = ys, z00 = 0; i < 16; i++) {
68  z00 += y[i];
69 
70  }
71  //initial time index
72 
73 
74 
75  it0 = 48 + ((143 - *ttrig2) << 2) / 6;
76 
77 
78  if (ttrig > 23) {cout << "*Ttrig Warning" << ttrig << endl; ttrig = 23;}
79  if (ttrig < 0) {cout << "*Ttrig Warning" << ttrig << endl; ttrig = 0;}
80 
81 
82 
83 
84  it_h = 191;
85  it_l = 0;
86  if (it0 < it_l)it0 = it_l;
87  if (it0 > it_h)it0 = it_h;
88  it = it0;
89 
90  //first approximation without time correction
91 
92  // int it00=23-it0;
93 
94  s1 = (*(fg41 + ttrig * 16));
95 
96 
97  A2 = (s1 * z00);
98 
99 
100 
101  for (i = 1; i < 16; i++) {
102  s1 = (*(fg41 + ttrig * 16 + i));
103  B3 = y[15 + i];
104  B3 = s1 * B3;
105  A2 += B3;
106 
107 
108  }
109 
110 
111  A2 += (1 << (k_a - 1));
112  A2 >>= k_a;
113  T = -2048;
114  //too large amplitude
115  if (A2 > 262143) {
116  A1 = A2 >> 3;
117  validity_code = 1;
118 
119  goto ou;
120  }
121 
122 
123  low_ampl = 0;
124 
125 
126 
127  if (A2 >= A0) {
128 
129  for (iter = 0, it = it0; iter < 3;) {
130  iter++;
131  s1 = (*(fg31 + it * 16));
132  s2 = (*(fg32 + it * 16));
133  A1 = (s1 * z00);
134  B1 = (s2 * z00);
135 
136 
137 
138  for (i = 1; i < 16; i++) {
139  s1 = (*(fg31 + i + it * 16));
140  s2 = (*(fg32 + i + it * 16));
141 
142  B5 = y[15 + i];
143 
144  B5 = s1 * B5;
145  A1 += B5;
146 
147 
148  B3 = y[15 + i];
149  B3 = s2 * B3;
150  B1 += B3;
151  }
152  A1 += (1 << (k_a - 1));
153  A1 = A1 >> k_a;
154 
155 
156 
157  if (A1 > 262143)
158  goto ou;
159  if (A1 < A0) {
160 
161  low_ampl = 1;
162  it = it0;
163 
164  goto lam;
165  }
166 
167  if (iter != 3) {
168 
169  B2 = B1 >> (k_b - 9);
170  B1 = B2 >> 9;
171 
172  B2 += (A1 << 9);
173 
174 
175  B3 = (B2 / A1);
176 
177 
178  it += ((B3 + 1) >> 1) - 256;
179  it = it > it_h ? it_h : it;
180  it = it < it_l ? it_l : it;
181  } else {
182  B2 = B1 >> (k_b - 11);
183  B5 = B1 >> (k_b - 9);
184 
185  B2 += (A1 << 11);
186  B3 = (B2 / A1);
187 
188  T = ((it) << 3) + ((it) << 2) + ((B3 + 1) >> 1) + B3 - 3072;
189 
190  T = ((215 - *ttrig2) << 3) - 4 - T;
191 
192  B1 = B5 >> 9;
193  B5 += (A1 << 9);
194  B3 = (B5 / A1);
195  it += ((B3 + 1) >> 1) - 256;
196  it = it > it_h ? it_h : it;
197  it = it < it_l ? it_l : it;
198 
199  T = T > 2046 ? 2047 : T;
200 
201  T = T < -2046 ? -2047 : T;
202 
203  C1 = (*(fg33 + it * 16) * z00);
204 
205  for (i = 1; i < 16; i++)
206  C1 += *(fg33 + i + it * 16) * y[15 + i];
207  C1 += (1 << (k_c - 1));
208  C1 >>= k_c;
209 
210 
211  }
212 
213  }
214  } else
215  low_ampl = 1;
216 
217  if (low_ampl == 1) {
218 
219 lam:
220  A1 = A2;
221  validity_code = 0;
222  B1 = 0;
223  C1 = (*(fg43 + ttrig * 16) * z00);
224  for (i = 1; i < 16; i++) {
225  B5 = y[15 + i];
226  C1 += *(fg43 + i + ttrig * 16) * B5;
227  }
228  C1 += (1 << (k_c - 1));
229  C1 >>= k_c;
230  }
231 
232 
233  ch2 = z00 - *n16 * C1;
234  ch1 = ((ch2) * (ch2));
235  ch1 = ch1 * k_np[*n16 - 1];
236  ch1 = ch1 >> 16;
237  for (i = 1; i < 16; i++) {
238  ch2 = A1 * (*(f + i + it * 16)) + B1 * (*(f1 + i + it * 16));
239  ch2 >>= k1_chi;
240  ch2 = (y[i + 15] - ch2 - C1);
241 
242  ch1 = ch1 + ch2 * ch2;
243 
244  }
245  B2 = (A1 >> 1) * (A1 >> 1);
246  B2 >>= (k2_chi - 2);
247  B2 += chi_thres;
248  if (ch1 > B2)validity_code = 3;
249 ou:
250 
251  *lar = A1;
252  *ltr = T;
253  *hi2 = ch1;
254 
255 
256  if (A1 < Askip)validity_code = validity_code + 8;
257 
258  int ss = (y[20] + y[21]);
259 
260  if (ss <= Ahard)validity_code = validity_code + 4;
261 
262 
263  *lq = validity_code;
264 
265 
266  return ;
267 }