11 #include "arich/modules/arichReconstruction/Utility.h"
13 #include "TRotation.h"
28 const double HF = Z1 / 2;
29 const double C1 = 0.56418958;
31 const double P10 = +3.6767877;
32 const double Q10 = +3.2584593;
33 const double P11 = -9.7970465E-2;
35 static double P2[5] = { 7.3738883, 6.8650185, 3.0317993, 0.56316962, 4.3187787e-5 };
36 static double Q2[5] = { 7.3739609, 15.184908, 12.79553, 5.3542168, 1. };
38 const double P30 = -1.2436854E-1;
39 const double Q30 = +4.4091706E-1;
40 const double P31 = -9.6821036E-2;
48 H = x * (P10 + P11 * Y) / (Q10 + Y);
53 for (
int c1 = 3; c1 >= 0; c1--) {
57 H = 1 - exp(-V * V) * AP / AQ;
60 H = 1 - exp(-V * V) * (C1 + Y * (P30 + P31 * Y) / (Q30 + Y)) / V;
71 TVector3 Refraction(
const TVector3 s,
const double n)
76 if (x * x + y * y > 1)
return TVector3();
77 if (s.z() < 0)
return TVector3(x, y, -sqrt(1 - x * x - y * y));
78 else return TVector3(x, y, sqrt(1 - x * x - y * y));
83 int Refraction(TVector3 s, TVector3 norm,
double n, TVector3
87 double sign = (sp > 0) * 2 - 1;
88 TVector3 vsth = (s - sp * norm) * (1 / n);
89 double cth = sqrt(1 - vsth.Mag2());
90 newdir = vsth + cth * norm * sign;
95 TVector3 setThetaPhi(
double theta,
double fi)
98 r[0] = cos(fi) * sin(theta);
99 r[1] = sin(fi) * sin(theta);
106 TRotation TransformToFixed(TVector3 r)
112 double ss = 1 - r.y() * r.y();
116 fX = TVector3(fZ.z() / ss, 0, -fZ.x() / ss);
119 fZ = TVector3(0, 1, 0);
120 fX = TVector3(0, 0, 1);
121 fY = TVector3(1, 0, 0);
124 transform.RotateAxes(fX, fY, fZ);
129 TRotation TransformFromFixed(TVector3 r)
135 double ss = 1 - r.y() * r.y();
139 fX = TVector3(fZ.z() / ss, 0, -fZ.x() / ss);
142 fZ = TVector3(0, 1, 0);
143 fX = TVector3(0, 0, 1);
144 fY = TVector3(1, 0, 0);
147 transform.RotateAxes(fX, fY, fZ);
152 double ExpectedCherenkovAngle(
double p,
double mass,
double refind)
163 if (mass <= 0 || p < 0)
return 0;
165 double b = a / sqrt(1 + a * a) * refind;
166 if (b > 1)
return acos(1 / b);
170 double SquareInt(
double aaa,
double fi,
double mean,
double sigma)
173 double aa = aaa / sqrt(2);
175 fi =
fi / (2 * M_PI);
176 fi = 8 * (
fi - floor(fi));
178 if (fi < 0)
fi += 16;
179 if (fi > 8)
fi = 16 -
fi;
180 if (fi > 4)
fi = 8 -
fi;
181 if (fi > 2)
fi = 4 -
fi;
182 if (fi > 1)
fi = 2 -
fi;
185 double sf = aa * sin(fi);
186 double cf = aa * cos(fi);
190 double n0 = 2 * aa * aa / (cf + sf);
192 const double sq2pi = 1 / sqrt(2.*M_PI);
193 double sqrt2sigma = 1 / (M_SQRT2 * sigma);
196 a[0] = (mean + sf) * sqrt2sigma;
197 a[1] = (mean - sf) * sqrt2sigma;
198 a[2] = (mean + cf) * sqrt2sigma;
199 a[3] = (mean - cf) * sqrt2sigma;
201 for (
int i = 0; i < 4; i++) b[i] = exp(-a[i] * a[i]);
202 for (
int i = 0; i < 4; i++) a[i] = Erf(a[i]);
205 const double dsf = 0.001;
206 if (fabs(sf) > dsf) gint += 0.5 * n0 * (a[0] - a[1]);
208 double dy = (cf - sf);
209 double dx = (cf + sf);
211 if (fabs(dx) > dsf && fabs(dy) > dsf) {
213 double k = dy / dx + dx / dy;
218 sq2pi * k * sigma * (-b[0] - b[1] + b[2] + b[3]) +
219 0.5 * k * mean * (-a[0] - a[1] + a[2] + a[3]) +
220 0.5 * n * (-a[0] + a[1] + a[2] - a[3]);