1 #include <framework/utilities/TestHelpers.h>
2 #include <framework/geometry/B2Vector3.h>
6 #include <gtest/gtest.h>
13 struct PointRThetaPhi {
double r;
double theta;
double phi; };
14 struct PointXYZ {
double x;
double y;
double z; };
15 std::vector<PointRThetaPhi> test_vectors(
const std::vector<double>& R = {1},
int nTheta = 3,
int nPhi = 4,
bool prune =
true)
17 std::vector<PointRThetaPhi> result;
18 auto get_theta = [nTheta](
int i) ->
double {
19 if (nTheta < 2)
return 0.;
20 return M_PI / (nTheta - 1) * i;
22 auto get_phi = [nPhi](
int i) ->
double {
23 if (nPhi < 2)
return 0.;
24 return 2 * M_PI / nPhi * i;
28 for (
int i = 0; i < nTheta || (nTheta < 2 && i == 0); ++i) {
29 double theta = get_theta(i);
30 for (
int j = 0; j < nPhi || (nPhi < 2 && j == 0); ++j) {
31 double phi = get_phi(j);
32 result.push_back(PointRThetaPhi{r, theta, phi});
34 if (prune && (theta == 0 || theta == M_PI))
break;
37 if (prune && r == 0)
break;
45 gErrorIgnoreLevel = kError;
48 for (
auto& rtp : test_vectors({0, 1, 1e20}, 64, 64)) {
51 EXPECT_EQ(bvec, tvec);
54 EXPECT_EQ(bvec2, bvec);
55 TVector3 tvec2 = bvec;
56 EXPECT_EQ(tvec2, tvec);
69 EXPECT_DOUBLE_EQ(bvec.
x(), tvec.x()) << bvec.
PrintString();
70 EXPECT_DOUBLE_EQ(bvec.
y(), tvec.y()) << bvec.
PrintString();
71 EXPECT_DOUBLE_EQ(bvec.
z(), tvec.z()) << bvec.
PrintString();
72 EXPECT_DOUBLE_EQ(bvec.
X(), tvec.X()) << bvec.
PrintString();
73 EXPECT_DOUBLE_EQ(bvec.
Y(), tvec.Y()) << bvec.
PrintString();
74 EXPECT_DOUBLE_EQ(bvec.
Z(), tvec.Z()) << bvec.
PrintString();
85 gErrorIgnoreLevel = kError;
88 for (
auto& rtp : test_vectors({0, 1, 1e20}, 16, 16)) {
94 for (
auto& rtp2 : test_vectors({0, 1, 1e20}, 16, 16)) {
113 gErrorIgnoreLevel = kError;
119 tvec.SetXYZ(1., 0., 0.);
121 tvec.Rotate(M_PI_2, TVector3(0., 0., 1.));
126 EXPECT_NEAR(bvec.
x(), tvec.x(), 1e-14) << bvec.
PrintString();
127 EXPECT_NEAR(bvec.
y(), tvec.y(), 1e-14) << bvec.
PrintString();
128 EXPECT_NEAR(bvec.
z(), tvec.z(), 1e-14) << bvec.
PrintString();
132 tvec.SetXYZ(1., 0., 0.);
134 tvec.Rotate(M_PI, TVector3(0., 0., 1.));
135 EXPECT_NEAR(bvec.
x(), -1., 1e-14) << bvec.
PrintString();
139 EXPECT_NEAR(bvec.
x(), tvec.x(), 1e-14) << bvec.
PrintString();
140 EXPECT_NEAR(bvec.
y(), tvec.y(), 1e-14) << bvec.
PrintString();
141 EXPECT_NEAR(bvec.
z(), tvec.z(), 1e-14) << bvec.
PrintString();
145 tvec.SetXYZ(4., 3., 2.);
147 tvec.Rotate(M_PI / 2.5, TVector3(1., 2., 3.));
154 EXPECT_NEAR(bvec.
X(), tvec.X(), 1e-14) << bvec.
PrintString();
155 EXPECT_NEAR(bvec.
Y(), tvec.Y(), 1e-14) << bvec.
PrintString();
156 EXPECT_NEAR(bvec.
Z(), tvec.Z(), 1e-14) << bvec.
PrintString();
160 const TVector3 taxis(4., 3., -2.);
162 for (
auto& rtp : test_vectors({0, 1, 1e20}, 64, 64)) {
164 double epsilon = (rtp.r < 1e10 ? 1
e-10 : rtp.r * 1
e-10);
167 for (
int i = 0; i < 28; i++) {
168 double angle = 2.*M_PI / 28 * i;
169 tvec.SetMagThetaPhi(rtp.r, rtp.theta, rtp.phi);
171 bvec.
Rotate(angle, baxis);
172 tvec.Rotate(angle, taxis);
176 if (fabs(fabs(bvec.
Phi() - tvec.Phi()) - 2.*M_PI) < 1
e-14) {
188 EXPECT_NEAR(bvec.
X(), tvec.X(), epsilon) << bvec.
PrintString();
189 EXPECT_NEAR(bvec.
Y(), tvec.Y(), epsilon) << bvec.
PrintString();
190 EXPECT_NEAR(bvec.
Z(), tvec.Z(), epsilon) << bvec.
PrintString();