12#include "ecl/geometry/shapes.h"
13#include <G4TessellatedSolid.hh>
14#include <G4TriangularFacet.hh>
15#include <G4QuadrangularFacet.hh>
16#include <G4ExtrudedSolid.hh>
18#include "ecl/geometry/BelleCrystal.h"
22#include <CLHEP/Matrix/Vector.h>
23#include <CLHEP/Matrix/Matrix.h>
24#include <G4TwoVector.hh>
25#include <G4Vector3D.hh>
26#include <framework/utilities/FileSystem.h>
27#include <framework/logging/Logger.h>
37 double cosd(
double x) {
return cos(x * (M_PI / 180));}
38 double sind(
double x) {
return sin(x * (M_PI / 180));}
39 double tand(
double x) {
return tan(x * (M_PI / 180));}
41 double volume(
const G4ThreeVector& v0,
const G4ThreeVector& v1,
const G4ThreeVector& v2,
const G4ThreeVector& v3)
43 G4ThreeVector x = v1 - v0, y = v2 - v0, z = v3 - v0;
44 return x.cross(y) * z;
47 G4ThreeVector newvertex(
double d,
const G4ThreeVector& v0,
const G4ThreeVector& v1,
const G4ThreeVector& v2,
48 const G4ThreeVector& v3)
50 G4ThreeVector x = v1 - v0, y = v2 - v0, z = v3 - v0;
51 G4ThreeVector nxy = x.cross(y).unit();
52 G4ThreeVector nyz = y.cross(z).unit();
53 G4ThreeVector nzx = z.cross(x).unit();
55 CLHEP::HepMatrix A(3, 3);
56 A[0][0] = nxy.x(), A[0][1] = nxy.y(), A[0][2] = nxy.z();
57 A[1][0] = nyz.x(), A[1][1] = nyz.y(), A[1][2] = nyz.z();
58 A[2][0] = nzx.x(), A[2][1] = nzx.y(), A[2][2] = nzx.z();
60 CLHEP::HepVector B(3);
66 CLHEP::HepVector r = A.inverse() * B;
68 return G4ThreeVector(r[0], r[1], r[2]);
71 G4ThreeVector moveto(
double r,
double phi)
73 return G4ThreeVector(r * cosd(phi), r * sind(phi), 0);
82 G4ThreeVector centerofgravity(
const map<int, G4ThreeVector>& v,
int i0,
int n)
84 double cx = 0, cy = 0, A = 0;
85 for (
int j = 0; j < n; j++) {
86 int j0 = j + i0, j1 = ((j + 1) % n) + i0;
87 const G4ThreeVector& v0 = v.find(j0)->second, &v1 = v.find(j1)->second;
88 double t = v0.x() * v1.y() - v0.y() * v1.x();
91 cx += (v0.x() + v1.x()) * t;
92 cy += (v0.y() + v1.y()) * t;
96 return G4ThreeVector(cx, cy, v.find(i0)->second.z());
99 Point_t centerofgravity(
const Point_t* b,
const Point_t* e)
101 double cx = 0, cy = 0, A = 0;
103 for (
int j = 0; j < n; j++) {
104 int j0 = j, j1 = ((j + 1) % n);
105 const Point_t& v0 = b[j0], &v1 = b[j1];
106 double t = v0.x * v1.y - v0.y * v1.x;
108 cx += (v0.x + v1.x) * t;
109 cy += (v0.y + v1.y) * t;
118 struct quadrilateral_t:
public shape_t {
120 virtual ~quadrilateral_t()
override {}
125 G4VSolid*
get_tesselatedsolid(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
130 name += to_string(
nshape);
131 G4TessellatedSolid* s =
new G4TessellatedSolid(name.c_str());
135 s->AddFacet(
new G4QuadrangularFacet(v[1], v[4], v[3], v[2], ABSOLUTE));
137 s->AddFacet(
new G4QuadrangularFacet(v[5], v[6], v[7], v[8], ABSOLUTE));
139 s->AddFacet(
new G4QuadrangularFacet(v[1], v[2], v[6], v[5], ABSOLUTE));
140 s->AddFacet(
new G4QuadrangularFacet(v[2], v[3], v[7], v[6], ABSOLUTE));
141 s->AddFacet(
new G4QuadrangularFacet(v[3], v[4], v[8], v[7], ABSOLUTE));
142 s->AddFacet(
new G4QuadrangularFacet(v[4], v[1], v[5], v[8], ABSOLUTE));
145 s->SetSolidClosed(
true);
150 G4VSolid*
get_extrudedsolid(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
155 name += to_string(
nshape);
157 std::vector<G4TwoVector> p1, p2;
158 p1.push_back(G4TwoVector(v[1].x(), v[1].y()));
159 p1.push_back(G4TwoVector(v[2].x(), v[2].y()));
160 p1.push_back(G4TwoVector(v[3].x(), v[3].y()));
161 p1.push_back(G4TwoVector(v[4].x(), v[4].y()));
163 p2.push_back(G4TwoVector(v[1 + 4].x(), v[1 + 4].y()));
164 p2.push_back(G4TwoVector(v[2 + 4].x(), v[2 + 4].y()));
165 p2.push_back(G4TwoVector(v[3 + 4].x(), v[3 + 4].y()));
166 p2.push_back(G4TwoVector(v[4 + 4].x(), v[4 + 4].y()));
168 double sum = 0, smin = 1e9, smax = -1e9;
169 for (
int i = 0; i < 4; i++) {
170 for (
int j = i + 1; j < 4; j++) {
171 double s2 = (p2[j] - p2[i]).mag2() / (p1[j] - p1[i]).mag2();
174 if (s > smax) smax = s;
175 if (s < smin) smin = s;
178 double ave = sum / 6;
181 G4TwoVector off1(0, 0), off2(scale * p1[0].x() - p2[0].x(), scale * p1[0].y() - p2[0].y());
183 return new G4ExtrudedSolid(name, p1, abs(v[1].z()), off1, 1, -off2, scale);
187 G4VSolid*
get_trapezoid(
const string& prefix,
double wrapthick, G4Translate3D& shift)
const override
192 G4ThreeVector b = v[4] - v[1];
193 G4ThreeVector d12 = v[2] - v[1], d43 = v[3] - v[4];
194 double b2 = b.mag2();
195 double h1 = b.cross(d12).mag2();
196 double h4 = b.cross(d43).mag2();
199 G4ThreeVector d24 = v[4] - v[2];
200 double d43b = d43 * b, s = (b2 * (d24 * d43) - (d24 * b) * d43b) / (d43b * d43b - b2 * d43.mag2());
201 v[3] = v[4] + s * d43;
202 v[7] = v[8] + s * (v[7] - v[8]);
204 G4ThreeVector d31 = v[1] - v[3];
205 double d12b = d12 * b, s = (b2 * (d31 * d12) - (d31 * b) * d12b) / (d12b * d12b - b2 * d12.mag2());
206 v[2] = v[1] + s * d12;
207 v[6] = v[5] + s * (v[6] - v[5]);
211 name += to_string(
nshape);
223 auto alignz = [&](
int i,
int j) {pt[j].setZ(pt[i].z());};
224 auto aligny = [&](
int i,
int j) {pt[j].setY(pt[i].y());};
240 double dx = pt[0].x() + pt[1].x() + pt[4].x() + pt[5].x() + pt[2].x() + pt[3].x() + pt[6].x() + pt[7].x();
242 double dy = pt[0].y() + pt[2].y() + pt[4].y() + pt[6].y();
244 for (
int j = 0; j < 8; j++) {
245 pt[j].setX(pt[j].x() - dx);
246 pt[j].setY(pt[j].y() - dy);
253 shift = G4Translate3D(dx, dy, 0);
254 G4VSolid* shape =
new G4Trap(name.c_str(), pt);
261 G4VSolid*
get_bellecrystal(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
266 name += to_string(
nshape);
278 for (
int i = 0; i < 8; i++) pt[i] = v[i + 1];
279 G4VSolid* shape =
new BelleCrystal(name.c_str(), 4, pt);
291 struct quadrilateral_barrel_t:
public quadrilateral_t {
294 double A, B, H, a, b, h, alpha, beta, betap, gamma, Volume, Weight;
298 quadrilateral_barrel_t() {}
299 virtual ~quadrilateral_barrel_t()
override {}
310 map<int, G4ThreeVector> v;
312 double wh = h * h, wH = H * H, wnorm = wh + wH;
313 double tn = ((b - a) / 2 / h * wh + (B - A) / 2 / H * wH) / wnorm, d = h * tn, D = H * tn;
315 double m = (a + b) * 0.5, M = (A + B) * 0.5;
317 const double eps = 0.5e-3;
318 if (fabs(a - (m - d)) > eps || fabs(b - (m + d)) > eps || fabs(A - (M - D)) > eps || fabs(B - (M + D)) > eps) {
319 double alfa =
atan(tn) * 180 / M_PI;
320 B2WARNING(
"Cannot make parallel sides better than 0.5 mcm: alpha =" << alpha <<
" alpha from sides = " << alfa <<
" da = " << a -
321 (m - d) <<
" db = " << b - (m + d) <<
" dA = " << A - (M - D) <<
" dB = " << B - (M + D));
324 v[1] = G4ThreeVector(-(m - d) / 2, h / 2, -150);
325 v[2] = G4ThreeVector(-(m + d) / 2, -h / 2, -150);
326 v[3] = G4ThreeVector((m + d) / 2, -h / 2, -150);
327 v[4] = G4ThreeVector((m - d) / 2, h / 2, -150);
328 v[5] = G4ThreeVector(-(M - D) / 2, H / 2, 150);
329 v[6] = G4ThreeVector(-(M + D) / 2, -H / 2, 150);
330 v[7] = G4ThreeVector((M + D) / 2, -H / 2, 150);
331 v[8] = G4ThreeVector((M - D) / 2, H / 2, 150);
333 if (wrapthick != 0) {
334 map<int, G4ThreeVector> nv;
335 nv[1] = newvertex(wrapthick, v[1], v[5], v[2], v[4]);
336 nv[2] = newvertex(wrapthick, v[2], v[6], v[3], v[1]);
337 nv[3] = newvertex(wrapthick, v[3], v[7], v[4], v[2]);
338 nv[4] = newvertex(wrapthick, v[4], v[8], v[1], v[3]);
339 nv[5] = newvertex(wrapthick, v[5], v[1], v[8], v[6]);
340 nv[6] = newvertex(wrapthick, v[6], v[2], v[5], v[7]);
341 nv[7] = newvertex(wrapthick, v[7], v[3], v[6], v[8]);
342 nv[8] = newvertex(wrapthick, v[8], v[4], v[7], v[5]);
353 struct quadrilateral_endcap_t:
public quadrilateral_t {
356 double A, B, C, D, a, b, c, d, H_aA, H_dD, dg13, dg24, dg57, dg68, a1, a2, a3, a4, Volume, Weight;
360 quadrilateral_endcap_t() {}
361 virtual ~quadrilateral_endcap_t()
override {}
366 double h1 = sind(a1) * D, h4 = sind(a4) * C;
367 return abs(h1 - h4) < 0.01 * h1;
373 double minh = std::min(sind(a1) * D, sind(a4) * C);
374 double h2 = minh / 2;
375 double db = (tand(a1 - 90) - tand(a4 - 90)) * h2 / 2;
377 map<int, G4ThreeVector> v;
378 v[5] = G4ThreeVector(-A / 2 + db, -h2, -150);
379 v[6] = v[5] + moveto(D, a1);
380 v[8] = G4ThreeVector(A / 2 + db, -h2, -150);
381 v[7] = v[8] + moveto(C, 180 - a4);
384 G4ThreeVector vB = v[7] - v[6], va(a, 0, 0), vd = moveto(d, a1), vc = moveto(c, 180 - a4);
385 double delta = vB.cross(va + vc - vd).z() / vB.cross(vc + vd).z();
390 v[1] = v[5] + G4ThreeVector((H_aA * cosd(a1) + H_dD) / sind(a1), H_aA, 300);
395 for (
int j = 1; j <= 8; j++) v[j] = G4ThreeVector(v[j].x(), -v[j].y(), -v[j].z());
402 if (wrapthick != 0) {
403 map<int, G4ThreeVector> nv;
404 nv[1] = newvertex(wrapthick, v[1], v[5], v[2], v[4]);
405 nv[2] = newvertex(wrapthick, v[2], v[6], v[3], v[1]);
406 nv[3] = newvertex(wrapthick, v[3], v[7], v[4], v[2]);
407 nv[4] = newvertex(wrapthick, v[4], v[8], v[1], v[3]);
408 nv[5] = newvertex(wrapthick, v[5], v[1], v[8], v[6]);
409 nv[6] = newvertex(wrapthick, v[6], v[2], v[5], v[7]);
410 nv[7] = newvertex(wrapthick, v[7], v[3], v[6], v[8]);
411 nv[8] = newvertex(wrapthick, v[8], v[4], v[7], v[5]);
420 struct pent_t:
public shape_t {
423 double A, C, D, a, c, d, B, b, H_aA, H_dD, dg13, dg24, dg57, dg68, a1, a4, a2, a3, a9, Volume, Weight;
436 H_dD -= 0.00005551197484235;
437 B += 0.0011245236213532729;
438 b += -0.00044853029662963;
444 bool istrap()
const override {
return false;}
451 double h2 = cosd(a1 - 90) * D / 2;
452 map<int, G4ThreeVector> v;
453 v[5] = G4ThreeVector(-A / 2, -h2, -150);
454 v[6] = v[5] + moveto(D, a1);
455 v[10] = v[6] + moveto(B, a1 + a2 - 180);
456 v[8] = G4ThreeVector(A / 2, -h2, -150);
457 v[7] = v[8] + moveto(D, 180 - a1);
459 v[1] = v[5] + G4ThreeVector((H_aA * cosd(a1) + H_dD) / sind(a1), H_aA, 300);
460 v[2] = v[1] + moveto(d, a1);
461 v[9] = v[2] + moveto(b, a1 + a2 - 180);
462 v[4] = v[1] + moveto(a, 0);
463 v[3] = v[4] + moveto(d, 180 - a1);
465 for (
int j = 1; j <= 10; j++) v[j] = G4ThreeVector(v[j].x(), -v[j].y(), -v[j].z());
466 if (wrapthick != 0) {
467 map<int, G4ThreeVector> nv;
468 nv[ 1] = newvertex(wrapthick, v[1], v[5], v[2], v[4]);
469 nv[ 2] = newvertex(wrapthick, v[2], v[6], v[9], v[1]);
470 nv[ 9] = newvertex(wrapthick, v[9], v[10], v[3], v[2]);
471 nv[ 3] = newvertex(wrapthick, v[3], v[7], v[4], v[9]);
472 nv[ 4] = newvertex(wrapthick, v[4], v[8], v[1], v[3]);
473 nv[ 5] = newvertex(wrapthick, v[5], v[1], v[8], v[6]);
474 nv[ 6] = newvertex(wrapthick, v[6], v[2], v[5], v[10]);
475 nv[10] = newvertex(wrapthick, v[10], v[9], v[6], v[7]);
476 nv[ 7] = newvertex(wrapthick, v[7], v[3], v[10], v[8]);
477 nv[ 8] = newvertex(wrapthick, v[8], v[4], v[7], v[5]);
484 G4VSolid*
get_tesselatedsolid(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
486 if (
nshape != 36)
return nullptr;
491 name += to_string(
nshape);
492 G4TessellatedSolid* s =
new G4TessellatedSolid(name.c_str());
496 s->AddFacet(
new G4QuadrangularFacet(v[1], v[4], v[3], v[2], ABSOLUTE));
497 s->AddFacet(
new G4TriangularFacet(v[2], v[3], v[9], ABSOLUTE));
500 s->AddFacet(
new G4QuadrangularFacet(v[5], v[6], v[7], v[8], ABSOLUTE));
501 s->AddFacet(
new G4TriangularFacet(v[6], v[10], v[7], ABSOLUTE));
504 s->AddFacet(
new G4QuadrangularFacet(v[1], v[2], v[6], v[5], ABSOLUTE));
505 s->AddFacet(
new G4QuadrangularFacet(v[2], v[9], v[10], v[6], ABSOLUTE));
506 s->AddFacet(
new G4QuadrangularFacet(v[9], v[3], v[7], v[10], ABSOLUTE));
507 s->AddFacet(
new G4QuadrangularFacet(v[3], v[4], v[8], v[7], ABSOLUTE));
508 s->AddFacet(
new G4QuadrangularFacet(v[4], v[1], v[5], v[8], ABSOLUTE));
511 s->SetSolidClosed(
true);
516 G4VSolid*
get_extrudedsolid(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
521 name += to_string(
nshape);
523 std::vector<G4TwoVector> p1, p2;
524 p1.push_back(G4TwoVector(v[1].x(), v[1].y()));
525 p1.push_back(G4TwoVector(v[2].x(), v[2].y()));
526 p1.push_back(G4TwoVector(v[9].x(), v[9].y()));
527 p1.push_back(G4TwoVector(v[3].x(), v[3].y()));
528 p1.push_back(G4TwoVector(v[4].x(), v[4].y()));
530 p2.push_back(G4TwoVector(v[1 + 4].x(), v[1 + 4].y()));
531 p2.push_back(G4TwoVector(v[2 + 4].x(), v[2 + 4].y()));
532 p2.push_back(G4TwoVector(v[ 10].x(), v[ 10].y()));
533 p2.push_back(G4TwoVector(v[3 + 4].x(), v[3 + 4].y()));
534 p2.push_back(G4TwoVector(v[4 + 4].x(), v[4 + 4].y()));
536 double sum = 0, smin = 1e9, smax = -1e9;
538 for (
int i = 0; i < 5; i++) {
539 for (
int j = i + 1; j < 5; j++) {
540 double s2 = (p2[j] - p2[i]).mag2() / (p1[j] - p1[i]).mag2();
543 if (s > smax) smax = s;
544 if (s < smin) smin = s;
548 double ave = sum / count;
551 G4TwoVector off1(0, 0), off2(scale * p1[0].x() - p2[0].x(), scale * p1[0].y() - p2[0].y());
553 return new G4ExtrudedSolid(name, p1, abs(v[1].z()), off1, 1, -off2, scale);
557 G4VSolid*
get_trapezoid(
const string& prefix,
double wrapthick, G4Translate3D& shift)
const override
559 if (
nshape != 36)
return nullptr;
564 name += to_string(
nshape);
576 auto alignz = [&](
int i,
int j) {pt[j].setZ(pt[i].z());};
577 auto aligny = [&](
int i,
int j) {pt[j].setY(pt[i].y());};
594 double dx = pt[0].x() + pt[1].x() + pt[4].x() + pt[5].x() + pt[2].x() + pt[3].x() + pt[6].x() + pt[7].x();
596 double dy = pt[0].y() + pt[2].y() + pt[4].y() + pt[6].y();
598 for (
int j = 0; j < 8; j++) {
599 pt[j].setX(pt[j].x() - dx);
600 pt[j].setY(pt[j].y() - dy);
602 shift = G4Translate3D(dx, dy, 0);
606 G4VSolid* shape =
new G4Trap(name.c_str(), pt);
612 G4VSolid*
get_bellecrystal(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
617 name += to_string(
nshape);
619 G4ThreeVector pt[10];
631 G4VSolid* shape =
new BelleCrystal(name.c_str(), 5, pt);
650 vector<shape_t*> load_shapes(
const string& fname)
652 vector<shape_t*> shapes;
655 ifstream IN(fnamef.c_str());
657 while (getline(IN, tmp)) {
658 size_t ic = tmp.find(
"#");
659 if (ic != string::npos) tmp.erase(ic);
660 istringstream iss(tmp);
662 copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(t));
664 shape_t* shape =
nullptr;
665 if (t.size() == 21) {
666 shape =
new quadrilateral_endcap_t();
667 quadrilateral_endcap_t& trap =
static_cast<quadrilateral_endcap_t&
>(*shape);
669 istringstream in(t[0]);
672 for (
size_t i = 1; i < t.size(); i++) {
673 in.str(t[i]); in.seekg(0, ios_base::beg);
676 }
else if (t.size() == 13) {
680 istringstream in(t[0]);
683 for (
size_t i = 1; i < t.size(); i++) {
684 in.str(t[i]); in.seekg(0, ios_base::beg);
687 }
else if (t.size() == 22) {
691 istringstream in(t[0]);
694 for (
size_t i = 1; i < t.size(); i++) {
695 in.str(t[i]); in.seekg(0, ios_base::beg);
700 shapes.push_back(shape);
714 vector<cplacement_t> load_placements(
const string& fname)
716 vector<cplacement_t> plcmnt;
719 ifstream IN(fnamef.c_str());
721 while (getline(IN, tmp)) {
722 size_t ic = tmp.find(
"#");
723 if (ic != string::npos) tmp.erase(ic);
724 istringstream iss(tmp);
726 copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(t));
729 istringstream in(t[0]);
731 in.str(t[1]); in.seekg(0, ios_base::beg);
733 in.str(t[2]); in.seekg(0, ios_base::beg);
735 in.str(t[3]); in.seekg(0, ios_base::beg);
737 in.str(t[4]); in.seekg(0, ios_base::beg);
739 in.str(t[5]); in.seekg(0, ios_base::beg);
741 in.str(t[6]); in.seekg(0, ios_base::beg);
752 G4Transform3D r = G4Rotate3D(t.Rphi1, G4Vector3D(sin(t.Rtheta) * cos(t.Rphi2), sin(t.Rtheta) * sin(t.Rphi2), cos(t.Rtheta)));
753 G4Transform3D p = G4Translate3D(t.Pr * sin(t.Ptheta) * cos(t.Pphi), t.Pr * sin(t.Ptheta) * sin(t.Pphi), t.Pr * cos(t.Ptheta));
757 Belle2::ECLCrystalsShapeAndPosition loadCrystalsShapeAndPosition()
760 auto fillbuffer = [&buffer](
const string & fname) {
762 ifstream IN(path.c_str());
763 buffer.clear(); buffer.str(
"");
764 buffer << IN.rdbuf();
767 Belle2::ECLCrystalsShapeAndPosition a;
768 fillbuffer(
"/ecl/data/crystal_shape_forward.dat"); a.setShapeForward(buffer.str());
769 fillbuffer(
"/ecl/data/crystal_shape_barrel.dat"); a.setShapeBarrel(buffer.str());
770 fillbuffer(
"/ecl/data/crystal_shape_backward.dat"); a.setShapeBackward(buffer.str());
771 fillbuffer(
"/ecl/data/crystal_placement_forward.dat"); a.setPlacementForward(buffer.str());
772 fillbuffer(
"/ecl/data/crystal_placement_barrel.dat"); a.setPlacementBarrel(buffer.str());
773 fillbuffer(
"/ecl/data/crystal_placement_backward.dat"); a.setPlacementBackward(buffer.str());
779 vector<shape_t*> load_shapes(stringstream& IN)
781 vector<shape_t*> shapes;
783 while (getline(IN, tmp)) {
784 size_t ic = tmp.find(
"#");
785 if (ic != string::npos) tmp.erase(ic);
786 istringstream iss(tmp);
788 copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(t));
791 if (t.size() == 21) {
795 istringstream in(t[0]);
798 for (
size_t i = 1; i < t.size(); i++) {
799 in.str(t[i]); in.seekg(0, ios_base::beg);
802 }
else if (t.size() == 13) {
806 istringstream in(t[0]);
809 for (
size_t i = 1; i < t.size(); i++) {
810 in.str(t[i]); in.seekg(0, ios_base::beg);
813 }
else if (t.size() == 22) {
817 istringstream in(t[0]);
820 for (
size_t i = 1; i < t.size(); i++) {
821 in.str(t[i]); in.seekg(0, ios_base::beg);
826 shapes.push_back(shape);
833 vector<cplacement_t> load_placements(stringstream& IN)
835 vector<cplacement_t> plcmnt;
837 while (getline(IN, tmp)) {
838 size_t ic = tmp.find(
"#");
839 if (ic != string::npos) tmp.erase(ic);
840 istringstream iss(tmp);
842 copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(t));
845 istringstream in(t[0]);
847 in.str(t[1]); in.seekg(0, ios_base::beg);
849 in.str(t[2]); in.seekg(0, ios_base::beg);
851 in.str(t[3]); in.seekg(0, ios_base::beg);
853 in.str(t[4]); in.seekg(0, ios_base::beg);
855 in.str(t[5]); in.seekg(0, ios_base::beg);
857 in.str(t[6]); in.seekg(0, ios_base::beg);
866 vector<cplacement_t> load_placements(
const Belle2::ECLCrystalsShapeAndPosition* crystals,
enum ECLParts part)
888 if (part == ECLParts::forward)
890 else if (part == ECLParts::barrel)
892 else if (part == ECLParts::backward)
894 return load_placements(IN);
897 vector<shape_t*> load_shapes(
const Belle2::ECLCrystalsShapeAndPosition* crystals,
enum ECLParts part)
900 if (part == ECLParts::forward)
902 else if (part == ECLParts::barrel)
904 else if (part == ECLParts::backward)
906 return load_shapes(IN);
911 Belle2::ECLCrystalsShapeAndPosition crystals = loadCrystalsShapeAndPosition();
912 vector<cplacement_t> bp = load_placements(&crystals, ECLParts::forward);
913 for (vector<cplacement_t>::const_iterator it = bp.begin(); it != bp.end(); ++it) {
915 cout << t.nshape <<
" " << t.Rphi1 <<
" " << t.Rtheta <<
" " << t.Rphi2 <<
" " << t.Pr <<
" " << t.Ptheta <<
" " << t.Pphi << endl;
const std::string & getPlacementBarrel() const
Return crystal placement in barrel.
const std::string & getShapeBackward() const
Return crystal shape in backward endcap.
const std::string & getShapeForward() const
Return crystal shape in forward endcap.
const std::string & getShapeBarrel() const
Return crystal shape in barrel.
const std::string & getPlacementBackward() const
Return crystal placement in backward endcap.
const std::string & getPlacementForward() const
Return crystal placement in forward endcap.
a Belle crystal in Geant4
static std::string findFile(const std::string &path, bool silent=false)
Search for given file or directory in local or central release directory, and return absolute path if...
double tan(double a)
tan for double
double atan(double a)
atan for double
double sqrt(double a)
sqrt for double
Abstract base class for different kinds of events.
G4VSolid * get_tesselatedsolid(const string &prefix, double wrapthick, G4Translate3D &shift UNUSED) const override
get tessellated solid
bool istrap() const override
is trapped?
G4VSolid * get_extrudedsolid(const string &prefix, double wrapthick, G4Translate3D &shift UNUSED) const override
get extruded solid
G4VSolid * get_bellecrystal(const string &prefix, double wrapthick, G4Translate3D &shift UNUSED) const override
get Belle crystal
void adjust()
adjust sizes to have flat sides
map< int, G4ThreeVector > make_verticies(double wrapthick) const
create map of vertices
G4VSolid * get_trapezoid(const string &prefix, double wrapthick, G4Translate3D &shift) const override
get trapezoid
bool _adjusted
are sizes adjusted?
quadrilateral struct for barrel
bool istrap() const override
is trapped
map< int, G4ThreeVector > make_verticies(double wrapthick) const override
create map of vertices
quadrilateral struct for end cap
bool istrap() const override
is trapped?
map< int, G4ThreeVector > make_verticies(double wrapthick) const override
create map of vertices
G4VSolid * get_tesselatedsolid(const string &prefix, double wrapthick, G4Translate3D &shift UNUSED) const override
get tessellated solid
virtual map< int, G4ThreeVector > make_verticies(double wrapthick) const =0
create map of vertices
G4VSolid * get_extrudedsolid(const string &prefix, double wrapthick, G4Translate3D &shift UNUSED) const override
get extruded solid
G4VSolid * get_bellecrystal(const string &prefix, double wrapthick, G4Translate3D &shift UNUSED) const override
get Belle crystal
G4VSolid * get_trapezoid(const string &prefix, double wrapthick, G4Translate3D &shift) const override
get trapezoid
G4VSolid * get_solid(const std::string &prefix, double wrapthick, G4Translate3D &shift) const
get solid
virtual G4VSolid * get_bellecrystal(const std::string &prefix, double wrapthick, G4Translate3D &shift) const =0
get Belle crystal