Belle II Software development
EnergyMask.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <top/reconstruction_cpp/EnergyMask.h>
10#include <framework/logging/Logger.h>
11#include <algorithm>
12#include <cmath>
13
14
15namespace Belle2 {
20 namespace TOP {
21
22 unsigned EnergyMask::s_Nmin = 4;
23 unsigned EnergyMask::s_Nmax = 256;
24
25 EnergyMask::EnergyMask(double dyde, double dydL, double dydx, double dy, double dL, double dx, double dE):
26 m_dE(dE), m_Wy(dy / std::abs(dyde))
27 {
28 if (dy <= 0) {
29 B2ERROR("TOP::EnergyMask: dy must be > 0");
30 return;
31 }
32
33 std::vector<double> x;
34 x.push_back(m_Wy);
35 x.push_back(std::abs(dL * dydL / dyde));
36 x.push_back(std::abs(dx * dydx / dyde));
37 std::sort(x.begin(), x.end());
38
39 m_A = x[2];
40 m_B = x[1];
41 m_C = x[0];
42 m_threeSquare = (m_C / m_A > 0.001);
43
44 unsigned N = (m_A + m_B + m_C) / 2.0 / dE + 1;
45 if (N < s_Nmin or N > s_Nmax) return;
46
47 if (m_threeSquare) {
48 for (unsigned i = 0; i <= N; i++) {
49 double E = i * dE;
50 double p = threeSquareConvolution(E);
51 m_mask.push_back(p);
52 }
53 } else {
54 for (unsigned i = 0; i <= N; i++) {
55 double E = i * dE;
56 double p = twoSquareConvolution(E);
57 m_mask.push_back(p);
58 }
59 }
60 }
61
62
63 double EnergyMask::getMask(double E) const
64 {
65 if (m_threeSquare) {
67 } else {
68 return twoSquareConvolution(E);
69 }
70 }
71
72
73 double EnergyMask::getMask(int i) const
74 {
75 if (m_mask.empty()) return getMask(i * m_dE);
76 return mask(i);
77 }
78
79
80 double EnergyMask::getMask(int i, double fract) const
81 {
82 if (m_mask.empty()) return getMask((i + fract) * m_dE);
83
84 if (fract < 0) {
85 i--;
86 fract += 1;
87 }
88 return mask(i) * (1 - fract) + mask(i + 1) * fract;
89 }
90
91
93 {
94 double x1 = (m_A - m_B) / 2;
95 double x2 = (m_A + m_B) / 2;
96 double x = std::abs(E);
97
98 if (x < x1) {
99 return 1 / m_A * m_Wy;
100 } else if (x < x2) {
101 return (x2 - x) / (x2 - x1) / m_A * m_Wy;
102 } else {
103 return 0;
104 }
105 }
106
107
109 {
110 double halfWid = (m_A + m_B + m_C) / 2;
111 if (std::abs(E) >= halfWid) return 0;
112
113 double t1 = halfWid - E;
114 double t2 = halfWid + E;
115 double p = t1 * t1 + t2 * t2;
116
117 double t3 = t1 - m_A;
118 double t4 = t2 - m_A;
119 p -= copysign(t3 * t3, t3) + copysign(t4 * t4, t4);
120
121 t3 = t1 - m_B;
122 t4 = t2 - m_B;
123 p -= copysign(t3 * t3, t3) + copysign(t4 * t4, t4);
124
125 t3 = t1 - m_C;
126 t4 = t2 - m_C;
127 p -= copysign(t3 * t3, t3) + copysign(t4 * t4, t4);
128
129 return p / (4 * m_A * m_B * m_C) * m_Wy;
130 }
131
132 } //TOP
134} //Belle2
R E
internal precision of FFTW codelets
const std::vector< double > & getMask() const
Returns discrete mask (note: only half of the mask is stored)
Definition EnergyMask.h:68
double threeSquareConvolution(double E) const
Returns a value of convolution of three square distributions at given photon energy.
double m_C
the smallset energy full width
Definition EnergyMask.h:129
double mask(int i) const
Returns mask value at given index from stored discrete mask.
Definition EnergyMask.h:139
double twoSquareConvolution(double E) const
Returns a value of convolution of two square distributions at given photon energy using the largest t...
Definition EnergyMask.cc:92
double m_Wy
enegy full width of dy
Definition EnergyMask.h:126
std::vector< double > m_mask
discrete mask (half of)
Definition EnergyMask.h:131
bool m_threeSquare
true if the three-square convolution must be used (m_C/m_A > 0.001)
Definition EnergyMask.h:130
EnergyMask(double dyde, double dydL, double dydx, double dy, double dL, double dx, double dE)
Constructor.
Definition EnergyMask.cc:25
double m_A
the largest energy full width
Definition EnergyMask.h:127
double m_B
the middle energy full width
Definition EnergyMask.h:128
static unsigned s_Nmin
minimal mask size
Definition EnergyMask.h:133
double m_dE
energy step
Definition EnergyMask.h:125
static unsigned s_Nmax
maximal mask size
Definition EnergyMask.h:134
Abstract base class for different kinds of events.
STL namespace.