1 #include <ecl/geometry/BelleCrystal.h>
2 #include <ecl/geometry/BelleLathe.h>
3 #include <gtest/gtest.h>
4 #include "ecl/geometry/shapes.h"
13 class BelleCrystalTest :
public ::testing::Test {};
16 class BelleLatheTest :
public ::testing::Test {
18 double absolute_tolerance = 0.00001;
21 TEST_F(BelleCrystalTest, BoundingBoxFourSides)
24 G4ThreeVector vertices[] = {G4ThreeVector(-1, -1, -1), G4ThreeVector(1, -1, -1), G4ThreeVector(1, 1, -1), G4ThreeVector(-1, 1, -1),
25 G4ThreeVector(-1, -1, 1), G4ThreeVector(1, -1, 1), G4ThreeVector(1, 1, 1), G4ThreeVector(-1, 1, 1)
30 G4ThreeVector pMin; G4ThreeVector pMax;
34 G4ThreeVector pMin_real(-1, -1, -1); G4ThreeVector pMax_real(1, 1, 1);
36 EXPECT_DOUBLE_EQ(pMin_real.x(), pMin.x());
37 EXPECT_DOUBLE_EQ(pMin_real.y(), pMin.y());
38 EXPECT_DOUBLE_EQ(pMin_real.z(), pMin.z());
40 EXPECT_DOUBLE_EQ(pMax_real.x(), pMax.x());
41 EXPECT_DOUBLE_EQ(pMax_real.y(), pMax.y());
42 EXPECT_DOUBLE_EQ(pMax_real.z(), pMax.z());
45 TEST_F(BelleCrystalTest, BoundingBoxFiveSides)
49 double c1 = 0.25 * (sqrt(5) - 1), c2 = 0.25 * (sqrt(5) + 1);
50 double s1 = 0.25 * sqrt(10 + 2 * sqrt(5)), s2 = 0.25 * sqrt(10 - 2 * sqrt(5));
51 G4ThreeVector vertices[] = {G4ThreeVector(0, 1, -z), G4ThreeVector(-s1, c1, -z), G4ThreeVector(-s2, -c2, -z), G4ThreeVector(s2, -c2, -z), G4ThreeVector(s1, c1, -z),
52 G4ThreeVector(0, 1, z), G4ThreeVector(-s1, c1, z), G4ThreeVector(-s2, -c2, z), G4ThreeVector(s2, -c2, z), G4ThreeVector(s1, c1, z)
57 G4ThreeVector pMin; G4ThreeVector pMax;
61 G4ThreeVector pMin_real(-s1, -c2, -z); G4ThreeVector pMax_real(s1, 1, z);
63 EXPECT_DOUBLE_EQ(pMin_real.x(), pMin.x());
64 EXPECT_DOUBLE_EQ(pMin_real.y(), pMin.y());
65 EXPECT_DOUBLE_EQ(pMin_real.z(), pMin.z());
67 EXPECT_DOUBLE_EQ(pMax_real.x(), pMax.x());
68 EXPECT_DOUBLE_EQ(pMax_real.y(), pMax.y());
69 EXPECT_DOUBLE_EQ(pMax_real.z(), pMax.z());
72 TEST_F(BelleCrystalTest, PentagonSurface)
76 double c1 = 0.25 * (sqrt(5) - 1), c2 = 0.25 * (sqrt(5) + 1);
77 double s1 = 0.25 * sqrt(10 + 2 * sqrt(5)), s2 = 0.25 * sqrt(10 - 2 * sqrt(5));
78 G4ThreeVector p0m(0, 1, -z), p1m(-s1, c1, -z), p2m(-s2, -c2, -z), p3m(s2, -c2, -z), p4m(s1, c1, -z);
79 G4ThreeVector p0p(0, 1, z), p1p(-s1, c1, z), p2p(-s2, -c2, z), p3p(s2, -c2, z), p4p(s1, c1, z);
80 G4ThreeVector vertices[] = {p0m, p1m, p2m, p3m, p4m, p0p, p1p, p2p, p3p, p4p};
83 for (
int i = 0; i < 1000 * 100; i++) {
84 G4ThreeVector p = c->GetPointOnSurface();
85 EXPECT_EQ(c->Inside(p), kSurface);
90 TEST_F(BelleCrystalTest, BarrelSurfaces)
92 vector<shape_t*> cryst = load_shapes(
"/ecl/data/crystal_shape_barrel.dat");
93 double wrapthickness = 0.17;
94 for (
auto it = cryst.begin(); it != cryst.end(); it++) {
96 std::string prefix(
"sv_"); prefix +=
"barrel"; prefix +=
"_wrap";
98 G4VSolid* c = s->get_solid(prefix, wrapthickness, tw);
99 for (
int i = 0; i < 1000 * 100; i++) {
100 G4ThreeVector p = c->GetPointOnSurface();
101 EInside I = c->Inside(p);
102 EXPECT_EQ(I, kSurface);
106 for (
auto it = cryst.begin(); it != cryst.end(); it++)
delete *it;
109 TEST_F(BelleCrystalTest, ForwardSurfaces)
111 vector<shape_t*> cryst = load_shapes(
"/ecl/data/crystal_shape_forward.dat");
112 double wrapthickness = 0.17;
113 for (
auto it = cryst.begin(); it != cryst.end(); it++) {
115 std::string prefix(
"sv_"); prefix +=
"barrel"; prefix +=
"_wrap";
117 G4VSolid* c = s->get_solid(prefix, wrapthickness, tw);
118 for (
int i = 0; i < 1000 * 100; i++) {
119 G4ThreeVector p = c->GetPointOnSurface();
120 EInside I = c->Inside(p);
121 EXPECT_EQ(I, kSurface);
125 for (
auto it = cryst.begin(); it != cryst.end(); it++)
delete *it;
128 TEST_F(BelleCrystalTest, BackwardSurfaces)
130 vector<shape_t*> cryst = load_shapes(
"/ecl/data/crystal_shape_backward.dat");
131 double wrapthickness = 0.17;
132 for (
auto it = cryst.begin(); it != cryst.end(); it++) {
134 std::string prefix(
"sv_"); prefix +=
"barrel"; prefix +=
"_wrap";
136 G4VSolid* c = s->get_solid(prefix, wrapthickness, tw);
137 for (
int i = 0; i < 1000 * 100; i++) {
138 G4ThreeVector p = c->GetPointOnSurface();
139 EInside I = c->Inside(p);
140 EXPECT_EQ(I, kSurface);
144 for (
auto it = cryst.begin(); it != cryst.end(); it++)
delete *it;
148 TEST_F(BelleLatheTest, BoundingBoxSect0)
151 zr_t bint[] = {{ -1, 0}, {1, 0}, {1, 1}, { -1, 1}};
152 std::vector<zr_t> contourb(bint, bint +
sizeof(bint) /
sizeof(
zr_t));
156 G4ThreeVector pMin; G4ThreeVector pMax;
160 G4ThreeVector pMin_real(-1, -1, -1);
161 G4ThreeVector pMax_real(0, 1, 1);
163 EXPECT_NEAR(pMin_real.x(), pMin.x(), absolute_tolerance);
164 EXPECT_NEAR(pMin_real.y(), pMin.y(), absolute_tolerance);
165 EXPECT_NEAR(pMin_real.z(), pMin.z(), absolute_tolerance);
167 EXPECT_NEAR(pMax_real.x(), pMax.x(), absolute_tolerance);
168 EXPECT_NEAR(pMax_real.y(), pMax.y(), absolute_tolerance);
169 EXPECT_NEAR(pMax_real.z(), pMax.z(), absolute_tolerance);
173 TEST_F(BelleLatheTest, BoundingBoxSect1)
176 zr_t bint[] = {{ -1, 0}, {1, 0}, {1, 1}, { -1, 1}};
177 std::vector<zr_t> contourb(bint, bint +
sizeof(bint) /
sizeof(
zr_t));
181 G4ThreeVector pMin; G4ThreeVector pMax;
185 G4ThreeVector pMin_real(0, -1, -1);
186 G4ThreeVector pMax_real(1, 1, 1);
188 EXPECT_NEAR(pMin_real.x(), pMin.x(), absolute_tolerance);
189 EXPECT_NEAR(pMin_real.y(), pMin.y(), absolute_tolerance);
190 EXPECT_NEAR(pMin_real.z(), pMin.z(), absolute_tolerance);
192 EXPECT_NEAR(pMax_real.x(), pMax.x(), absolute_tolerance);
193 EXPECT_NEAR(pMax_real.y(), pMax.y(), absolute_tolerance);
194 EXPECT_NEAR(pMax_real.z(), pMax.z(), absolute_tolerance);
198 TEST_F(BelleLatheTest, BoundingBoxSect2)
201 zr_t bint[] = {{ -1, 0}, {1, 0}, {1, 1}, { -1, 1}};
202 std::vector<zr_t> contourb(bint, bint +
sizeof(bint) /
sizeof(
zr_t));
206 G4ThreeVector pMin; G4ThreeVector pMax;
210 G4ThreeVector pMin_real(-1, -1, -1);
211 G4ThreeVector pMax_real(0, 0, 1);
213 EXPECT_NEAR(pMin_real.x(), pMin.x(), absolute_tolerance);
214 EXPECT_NEAR(pMin_real.y(), pMin.y(), absolute_tolerance);
215 EXPECT_NEAR(pMin_real.z(), pMin.z(), absolute_tolerance);
217 EXPECT_NEAR(pMax_real.x(), pMax.x(), absolute_tolerance);
218 EXPECT_NEAR(pMax_real.y(), pMax.y(), absolute_tolerance);
219 EXPECT_NEAR(pMax_real.z(), pMax.z(), absolute_tolerance);
223 TEST_F(BelleLatheTest, BoundingBoxSect3)
226 zr_t bint[] = {{ -1, 0}, {1, 0}, {1, 1}, { -1, 1}};
227 std::vector<zr_t> contourb(bint, bint +
sizeof(bint) /
sizeof(
zr_t));
231 G4ThreeVector pMin; G4ThreeVector pMax;
235 G4ThreeVector pMin_real(-1, -1, -1);
236 G4ThreeVector pMax_real(1, 1, 1);
238 EXPECT_NEAR(pMin_real.x(), pMin.x(), absolute_tolerance);
239 EXPECT_NEAR(pMin_real.y(), pMin.y(), absolute_tolerance);
240 EXPECT_NEAR(pMin_real.z(), pMin.z(), absolute_tolerance);
242 EXPECT_NEAR(pMax_real.x(), pMax.x(), absolute_tolerance);
243 EXPECT_NEAR(pMax_real.y(), pMax.y(), absolute_tolerance);
244 EXPECT_NEAR(pMax_real.z(), pMax.z(), absolute_tolerance);
248 TEST_F(BelleLatheTest, BoundingBoxSect4)
251 zr_t bint[] = {{ -1, 0.5}, {1, 0.5}, {1, 1}, { -1, 1}};
252 std::vector<zr_t> contourb(bint, bint +
sizeof(bint) /
sizeof(
zr_t));
256 G4ThreeVector pMin; G4ThreeVector pMax;
260 G4ThreeVector pMin_real(cos(3 * M_PI / 4), 0.5 * sin(M_PI / 4), -1);
261 G4ThreeVector pMax_real(cos(M_PI / 4), 1, 1);
263 EXPECT_NEAR(pMin_real.x(), pMin.x(), absolute_tolerance);
264 EXPECT_NEAR(pMin_real.y(), pMin.y(), absolute_tolerance);
265 EXPECT_NEAR(pMin_real.z(), pMin.z(), absolute_tolerance);
267 EXPECT_NEAR(pMax_real.x(), pMax.x(), absolute_tolerance);
268 EXPECT_NEAR(pMax_real.y(), pMax.y(), absolute_tolerance);
269 EXPECT_NEAR(pMax_real.z(), pMax.z(), absolute_tolerance);