Belle II Software  release-05-02-19
algorithms.cc
1 #include <ecl/digitization/algorithms.h>
2 #include <cmath>
3 using namespace std;
4 using namespace Belle2::ECL;
5 
6 double Belle2::ECL::ShaperDSP(double Ti)
7 {
8  return ShaperDSP(Ti, (const double*)0);
9 }
10 
11 double Belle2::ECL::ShaperDSP(double Ti, const float* sf)
12 {
13  if (sf) {
14  double sd[10];
15  for (int i = 0; i < 10; i++) sd[i] = sf[i]; // conversion to double
16  return ShaperDSP(Ti, sd);
17  }
18  return ShaperDSP(Ti, (const double*)0);
19 }
20 
21 double Belle2::ECL::ShaperDSP(double Ti, const double* s)
22 {
23  const double scale = 27.7221;
24  static const double defs[10] = {0.5, 0.6483, 0.4017, 0.3741, 0.8494, 0.00144547, 4.7071, 0.8156, 0.5556, 0.2752};
25  if (!s) s = defs;
26  double t = Ti * (127. / 144.) - s[0];
27  const double dt = 0.2;
28  // Sv123 is defined everywhere so no restriction on t
29  double fm = Sv123(t - dt, s[2], s[3], s[7], s[8], s[1], s[4]);
30  double f0 = Sv123(t , s[2], s[3], s[7], s[8], s[1], s[4]);
31  double fp = Sv123(t + dt, s[2], s[3], s[7], s[8], s[1], s[4]);
32  double w = s[9];
33  // Is this some kind of a low pass filter?
34  double svp = (1 - w) * f0 + (0.5 * w) * (fp + fm);
35 
36  if (t > 0) {
37  double y = t / s[6], z = t / s[2];
38  svp -= s[5] * exp(-y) * (1 - exp(-z) * (1 + z * (1 + z * (1 / 2. + z * (1 / 6. + z * (1 / 24. + z * (1 / 120.)))))));
39  }
40  return svp * scale;
41 }
42 //
43 double Belle2::ECL::ShaperDSPofflineFit(double Ti, const double* s, double scale)
44 {
45  //
46  //Used to fit and draw offline fit results.
47  //
48  double t = Ti - s[0];
49  const double dt = 0.2;
50  // Sv123 is defined everywhere so no restriction on t
51  double fm = Sv123(t - dt, s[2], s[3], s[7], s[8], s[1], s[4]);
52  double f0 = Sv123(t , s[2], s[3], s[7], s[8], s[1], s[4]);
53  double fp = Sv123(t + dt, s[2], s[3], s[7], s[8], s[1], s[4]);
54  double w = s[9];
55  double svp = (1 - w) * f0 + (0.5 * w) * (fp + fm);
56 
57  if (t > 0) {
58  double y = t / s[6], z = t / s[2];
59  svp -= s[5] * exp(-y) * (1 - exp(-z) * (1 + z * (1 + z * (1 / 2. + z * (1 / 6. + z * (1 / 24. + z * (1 / 120.)))))));
60  }
61  return svp * scale;
62 }