8 #include "ecl/geometry/shapes.h"
9 #include "G4TessellatedSolid.hh"
10 #include "G4TriangularFacet.hh"
11 #include "G4QuadrangularFacet.hh"
12 #include <G4ExtrudedSolid.hh>
14 #include "ecl/geometry/BelleCrystal.h"
18 #include "CLHEP/Matrix/Vector.h"
19 #include "CLHEP/Matrix/Matrix.h"
20 #include <G4TwoVector.hh>
21 #include <G4Vector3D.hh>
22 #include <framework/utilities/FileSystem.h>
23 #include <framework/logging/Logger.h>
33 double cosd(
double x) {
return cos(x * (M_PI / 180));}
34 double sind(
double x) {
return sin(x * (M_PI / 180));}
35 double tand(
double x) {
return tan(x * (M_PI / 180));}
37 double volume(
const G4ThreeVector& v0,
const G4ThreeVector& v1,
const G4ThreeVector& v2,
const G4ThreeVector& v3)
39 G4ThreeVector x =
v1 - v0, y =
v2 - v0, z =
v3 - v0;
40 return x.cross(y) * z;
43 G4ThreeVector newvertex(
double d,
const G4ThreeVector& v0,
const G4ThreeVector& v1,
const G4ThreeVector& v2,
44 const G4ThreeVector& v3)
46 G4ThreeVector x =
v1 - v0, y =
v2 - v0, z =
v3 - v0;
47 G4ThreeVector nxy = x.cross(y).unit();
48 G4ThreeVector nyz = y.cross(z).unit();
49 G4ThreeVector nzx = z.cross(x).unit();
51 CLHEP::HepMatrix A(3, 3);
52 A[0][0] = nxy.x(), A[0][1] = nxy.y(), A[0][2] = nxy.z();
53 A[1][0] = nyz.x(), A[1][1] = nyz.y(), A[1][2] = nyz.z();
54 A[2][0] = nzx.x(), A[2][1] = nzx.y(), A[2][2] = nzx.z();
56 CLHEP::HepVector B(3);
62 CLHEP::HepVector r = A.inverse() * B;
64 return G4ThreeVector(r[0], r[1], r[2]);
67 G4ThreeVector moveto(
double r,
double phi)
69 return G4ThreeVector(r * cosd(phi), r * sind(phi), 0);
73 G4VSolid* shape_t::get_solid(
const string& prefix,
double wrapthick, G4Translate3D& shift)
const
75 return get_bellecrystal(prefix, wrapthick, shift);
78 G4ThreeVector centerofgravity(
const map<int, G4ThreeVector>& v,
int i0,
int n)
80 double cx = 0, cy = 0, A = 0;
81 for (
int j = 0; j < n; j++) {
82 int j0 = j + i0, j1 = ((j + 1) % n) + i0;
83 const G4ThreeVector& v0 = v.find(j0)->second, &
v1 = v.find(j1)->second;
84 double t = v0.x() *
v1.y() - v0.y() *
v1.x();
87 cx += (v0.x() +
v1.x()) * t;
88 cy += (v0.y() +
v1.y()) * t;
92 return G4ThreeVector(cx, cy, v.find(i0)->second.z());
95 Point_t centerofgravity(Point_t* b, Point_t* e)
97 double cx = 0, cy = 0, A = 0;
99 for (
int j = 0; j < n; j++) {
100 int j0 = j, j1 = ((j + 1) % n);
101 const Point_t& v0 = b[j0], &
v1 = b[j1];
102 double t = v0.x *
v1.y - v0.y *
v1.x;
104 cx += (v0.x +
v1.x) * t;
105 cy += (v0.y +
v1.y) * t;
109 Point_t t = {cx, cy};
117 virtual map<int, G4ThreeVector> make_verticies(
double wrapthick)
const = 0;
119 G4VSolid* get_tesselatedsolid(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
121 map<int, G4ThreeVector> v = make_verticies(wrapthick);
124 name += to_string(nshape);
125 G4TessellatedSolid* s =
new G4TessellatedSolid(name.c_str());
129 s->AddFacet(
new G4QuadrangularFacet(v[1], v[4], v[3], v[2], ABSOLUTE));
131 s->AddFacet(
new G4QuadrangularFacet(v[5], v[6], v[7], v[8], ABSOLUTE));
133 s->AddFacet(
new G4QuadrangularFacet(v[1], v[2], v[6], v[5], ABSOLUTE));
134 s->AddFacet(
new G4QuadrangularFacet(v[2], v[3], v[7], v[6], ABSOLUTE));
135 s->AddFacet(
new G4QuadrangularFacet(v[3], v[4], v[8], v[7], ABSOLUTE));
136 s->AddFacet(
new G4QuadrangularFacet(v[4], v[1], v[5], v[8], ABSOLUTE));
139 s->SetSolidClosed(
true);
143 G4VSolid* get_extrudedsolid(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
145 map<int, G4ThreeVector> v = make_verticies(wrapthick);
148 name += to_string(nshape);
150 std::vector<G4TwoVector> p1, p2;
151 p1.push_back(G4TwoVector(v[1].x(), v[1].y()));
152 p1.push_back(G4TwoVector(v[2].x(), v[2].y()));
153 p1.push_back(G4TwoVector(v[3].x(), v[3].y()));
154 p1.push_back(G4TwoVector(v[4].x(), v[4].y()));
156 p2.push_back(G4TwoVector(v[1 + 4].x(), v[1 + 4].y()));
157 p2.push_back(G4TwoVector(v[2 + 4].x(), v[2 + 4].y()));
158 p2.push_back(G4TwoVector(v[3 + 4].x(), v[3 + 4].y()));
159 p2.push_back(G4TwoVector(v[4 + 4].x(), v[4 + 4].y()));
161 double sum = 0, smin = 1e9, smax = -1e9;
162 for (
int i = 0; i < 4; i++) {
163 for (
int j = i + 1; j < 4; j++) {
164 double s2 = (p2[j] - p2[i]).mag2() / (p1[j] - p1[i]).mag2();
167 if (s > smax) smax = s;
168 if (s < smin) smin = s;
171 double ave = sum / 6;
174 G4TwoVector off1(0, 0), off2(scale * p1[0].x() - p2[0].x(), scale * p1[0].y() - p2[0].y());
176 return new G4ExtrudedSolid(name, p1, abs(v[1].z()), off1, 1, -off2, scale);
179 G4VSolid* get_trapezoid(
const string& prefix,
double wrapthick, G4Translate3D& shift)
const override
181 map<int, G4ThreeVector> v = make_verticies(wrapthick);
184 G4ThreeVector b = v[4] - v[1];
185 G4ThreeVector d12 = v[2] - v[1], d43 = v[3] - v[4];
186 double b2 = b.mag2();
187 double h1 = b.cross(d12).mag2();
188 double h4 = b.cross(d43).mag2();
191 G4ThreeVector d24 = v[4] - v[2];
192 double d43b = d43 * b, s = (b2 * (d24 * d43) - (d24 * b) * d43b) / (d43b * d43b - b2 * d43.mag2());
193 v[3] = v[4] + s * d43;
194 v[7] = v[8] + s * (v[7] - v[8]);
196 G4ThreeVector d31 = v[1] - v[3];
197 double d12b = d12 * b, s = (b2 * (d31 * d12) - (d31 * b) * d12b) / (d12b * d12b - b2 * d12.mag2());
198 v[2] = v[1] + s * d12;
199 v[6] = v[5] + s * (v[6] - v[5]);
203 name += to_string(nshape);
215 auto alignz = [&](
int i,
int j) {pt[j].setZ(pt[i].z());};
216 auto aligny = [&](
int i,
int j) {pt[j].setY(pt[i].y());};
232 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();
234 double dy = pt[0].y() + pt[2].y() + pt[4].y() + pt[6].y();
236 for (
int j = 0; j < 8; j++) {
237 pt[j].setX(pt[j].x() - dx);
238 pt[j].setY(pt[j].y() - dy);
245 shift = G4Translate3D(dx, dy, 0);
246 G4VSolid* shape =
new G4Trap(name.c_str(), pt);
252 G4VSolid* get_bellecrystal(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
254 map<int, G4ThreeVector> v = make_verticies(wrapthick);
257 name += to_string(nshape);
269 for (
int i = 0; i < 8; i++) pt[i] = v[i + 1];
270 G4VSolid* shape =
new BelleCrystal(name.c_str(), 4, pt);
284 double A, B, H, a, b, h, alpha, beta, betap, gamma, Volume, Weight;
291 bool istrap()
const override
296 map<int, G4ThreeVector> make_verticies(
double wrapthick)
const override
298 map<int, G4ThreeVector> v;
300 double wh = h * h, wH = H * H, wnorm = wh + wH;
301 double tn = ((b - a) / 2 / h * wh + (B - A) / 2 / H * wH) / wnorm, d = h * tn, D = H * tn;
303 double m = (a + b) * 0.5, M = (A + B) * 0.5;
305 const double eps = 0.5e-3;
306 if (fabs(a - (m - d)) > eps || fabs(b - (m + d)) > eps || fabs(A - (M - D)) > eps || fabs(B - (M + D)) > eps) {
307 double alfa = atan(tn) * 180 / M_PI;
308 B2WARNING(
"Cannot make parallel sides better than 0.5 mcm: alpha =" << alpha <<
" alpha from sides = " << alfa <<
" da = " << a -
309 (m - d) <<
" db = " << b - (m + d) <<
" dA = " << A - (M - D) <<
" dB = " << B - (M + D));
312 v[1] = G4ThreeVector(-(m - d) / 2, h / 2, -150);
313 v[2] = G4ThreeVector(-(m + d) / 2, -h / 2, -150);
314 v[3] = G4ThreeVector((m + d) / 2, -h / 2, -150);
315 v[4] = G4ThreeVector((m - d) / 2, h / 2, -150);
316 v[5] = G4ThreeVector(-(M - D) / 2, H / 2, 150);
317 v[6] = G4ThreeVector(-(M + D) / 2, -H / 2, 150);
318 v[7] = G4ThreeVector((M + D) / 2, -H / 2, 150);
319 v[8] = G4ThreeVector((M - D) / 2, H / 2, 150);
321 if (wrapthick != 0) {
322 map<int, G4ThreeVector> nv;
323 nv[1] = newvertex(wrapthick, v[1], v[5], v[2], v[4]);
324 nv[2] = newvertex(wrapthick, v[2], v[6], v[3], v[1]);
325 nv[3] = newvertex(wrapthick, v[3], v[7], v[4], v[2]);
326 nv[4] = newvertex(wrapthick, v[4], v[8], v[1], v[3]);
327 nv[5] = newvertex(wrapthick, v[5], v[1], v[8], v[6]);
328 nv[6] = newvertex(wrapthick, v[6], v[2], v[5], v[7]);
329 nv[7] = newvertex(wrapthick, v[7], v[3], v[6], v[8]);
330 nv[8] = newvertex(wrapthick, v[8], v[4], v[7], v[5]);
343 double A, B, C, D, a, b, c, d, H_aA, H_dD, dg13, dg24, dg57, dg68, a1, a2, a3, a4, Volume, Weight;
350 bool istrap()
const override
352 double h1 = sind(a1) * D, h4 = sind(a4) * C;
353 return abs(h1 - h4) < 0.01 * h1;
356 map<int, G4ThreeVector> make_verticies(
double wrapthick)
const override
358 double minh = std::min(sind(a1) * D, sind(a4) * C);
359 double h2 = minh / 2;
360 double db = (tand(a1 - 90) - tand(a4 - 90)) * h2 / 2;
362 map<int, G4ThreeVector> v;
363 v[5] = G4ThreeVector(-A / 2 + db, -h2, -150);
364 v[6] = v[5] + moveto(D, a1);
365 v[8] = G4ThreeVector(A / 2 + db, -h2, -150);
366 v[7] = v[8] + moveto(C, 180 - a4);
369 G4ThreeVector vB = v[7] - v[6], va(a, 0, 0), vd = moveto(d, a1), vc = moveto(c, 180 - a4);
370 double delta = vB.cross(va + vc - vd).z() / vB.cross(vc + vd).z();
375 v[1] = v[5] + G4ThreeVector((H_aA * cosd(a1) + H_dD) / sind(a1), H_aA, 300);
380 for (
int j = 1; j <= 8; j++) v[j] = G4ThreeVector(v[j].x(), -v[j].y(), -v[j].z());
387 if (wrapthick != 0) {
388 map<int, G4ThreeVector> nv;
389 nv[1] = newvertex(wrapthick, v[1], v[5], v[2], v[4]);
390 nv[2] = newvertex(wrapthick, v[2], v[6], v[3], v[1]);
391 nv[3] = newvertex(wrapthick, v[3], v[7], v[4], v[2]);
392 nv[4] = newvertex(wrapthick, v[4], v[8], v[1], v[3]);
393 nv[5] = newvertex(wrapthick, v[5], v[1], v[8], v[6]);
394 nv[6] = newvertex(wrapthick, v[6], v[2], v[5], v[7]);
395 nv[7] = newvertex(wrapthick, v[7], v[3], v[6], v[8]);
396 nv[8] = newvertex(wrapthick, v[8], v[4], v[7], v[5]);
407 double A, C, D, a, c, d, B, b, H_aA, H_dD, dg13, dg24, dg57, dg68, a1, a4, a2, a3, a9, Volume, Weight;
412 pent_t(): _adjusted(
false) {}
419 H_dD -= 0.00005551197484235;
420 B += 0.0011245236213532729;
421 b += -0.00044853029662963;
426 bool istrap()
const override {
return false;}
428 map<int, G4ThreeVector> make_verticies(
double wrapthick)
const
432 double h2 = cosd(a1 - 90) * D / 2;
433 map<int, G4ThreeVector> v;
434 v[5] = G4ThreeVector(-A / 2, -h2, -150);
435 v[6] = v[5] + moveto(D, a1);
436 v[10] = v[6] + moveto(B, a1 + a2 - 180);
437 v[8] = G4ThreeVector(A / 2, -h2, -150);
438 v[7] = v[8] + moveto(D, 180 - a1);
440 v[1] = v[5] + G4ThreeVector((H_aA * cosd(a1) + H_dD) / sind(a1), H_aA, 300);
441 v[2] = v[1] + moveto(d, a1);
442 v[9] = v[2] + moveto(b, a1 + a2 - 180);
443 v[4] = v[1] + moveto(a, 0);
444 v[3] = v[4] + moveto(d, 180 - a1);
446 for (
int j = 1; j <= 10; j++) v[j] = G4ThreeVector(v[j].x(), -v[j].y(), -v[j].z());
447 if (wrapthick != 0) {
448 map<int, G4ThreeVector> nv;
449 nv[ 1] = newvertex(wrapthick, v[1], v[5], v[2], v[4]);
450 nv[ 2] = newvertex(wrapthick, v[2], v[6], v[9], v[1]);
451 nv[ 9] = newvertex(wrapthick, v[9], v[10], v[3], v[2]);
452 nv[ 3] = newvertex(wrapthick, v[3], v[7], v[4], v[9]);
453 nv[ 4] = newvertex(wrapthick, v[4], v[8], v[1], v[3]);
454 nv[ 5] = newvertex(wrapthick, v[5], v[1], v[8], v[6]);
455 nv[ 6] = newvertex(wrapthick, v[6], v[2], v[5], v[10]);
456 nv[10] = newvertex(wrapthick, v[10], v[9], v[6], v[7]);
457 nv[ 7] = newvertex(wrapthick, v[7], v[3], v[10], v[8]);
458 nv[ 8] = newvertex(wrapthick, v[8], v[4], v[7], v[5]);
464 G4VSolid* get_tesselatedsolid(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
466 if (nshape != 36)
return nullptr;
468 map<int, G4ThreeVector> v = make_verticies(wrapthick);
471 name += to_string(nshape);
472 G4TessellatedSolid* s =
new G4TessellatedSolid(name.c_str());
476 s->AddFacet(
new G4QuadrangularFacet(v[1], v[4], v[3], v[2], ABSOLUTE));
477 s->AddFacet(
new G4TriangularFacet(v[2], v[3], v[9], ABSOLUTE));
480 s->AddFacet(
new G4QuadrangularFacet(v[5], v[6], v[7], v[8], ABSOLUTE));
481 s->AddFacet(
new G4TriangularFacet(v[6], v[10], v[7], ABSOLUTE));
484 s->AddFacet(
new G4QuadrangularFacet(v[1], v[2], v[6], v[5], ABSOLUTE));
485 s->AddFacet(
new G4QuadrangularFacet(v[2], v[9], v[10], v[6], ABSOLUTE));
486 s->AddFacet(
new G4QuadrangularFacet(v[9], v[3], v[7], v[10], ABSOLUTE));
487 s->AddFacet(
new G4QuadrangularFacet(v[3], v[4], v[8], v[7], ABSOLUTE));
488 s->AddFacet(
new G4QuadrangularFacet(v[4], v[1], v[5], v[8], ABSOLUTE));
491 s->SetSolidClosed(
true);
495 G4VSolid* get_extrudedsolid(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
497 map<int, G4ThreeVector> v = make_verticies(wrapthick);
500 name += to_string(nshape);
502 std::vector<G4TwoVector> p1, p2;
503 p1.push_back(G4TwoVector(v[1].x(), v[1].y()));
504 p1.push_back(G4TwoVector(v[2].x(), v[2].y()));
505 p1.push_back(G4TwoVector(v[9].x(), v[9].y()));
506 p1.push_back(G4TwoVector(v[3].x(), v[3].y()));
507 p1.push_back(G4TwoVector(v[4].x(), v[4].y()));
509 p2.push_back(G4TwoVector(v[1 + 4].x(), v[1 + 4].y()));
510 p2.push_back(G4TwoVector(v[2 + 4].x(), v[2 + 4].y()));
511 p2.push_back(G4TwoVector(v[ 10].x(), v[ 10].y()));
512 p2.push_back(G4TwoVector(v[3 + 4].x(), v[3 + 4].y()));
513 p2.push_back(G4TwoVector(v[4 + 4].x(), v[4 + 4].y()));
515 double sum = 0, smin = 1e9, smax = -1e9;
517 for (
int i = 0; i < 5; i++) {
518 for (
int j = i + 1; j < 5; j++) {
519 double s2 = (p2[j] - p2[i]).mag2() / (p1[j] - p1[i]).mag2();
522 if (s > smax) smax = s;
523 if (s < smin) smin = s;
527 double ave = sum / count;
530 G4TwoVector off1(0, 0), off2(scale * p1[0].x() - p2[0].x(), scale * p1[0].y() - p2[0].y());
532 return new G4ExtrudedSolid(name, p1, abs(v[1].z()), off1, 1, -off2, scale);
535 G4VSolid* get_trapezoid(
const string& prefix,
double wrapthick, G4Translate3D& shift)
const override
537 if (nshape != 36)
return nullptr;
539 map<int, G4ThreeVector> v = make_verticies(wrapthick);
542 name += to_string(nshape);
554 auto alignz = [&](
int i,
int j) {pt[j].setZ(pt[i].z());};
555 auto aligny = [&](
int i,
int j) {pt[j].setY(pt[i].y());};
572 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();
574 double dy = pt[0].y() + pt[2].y() + pt[4].y() + pt[6].y();
576 for (
int j = 0; j < 8; j++) {
577 pt[j].setX(pt[j].x() - dx);
578 pt[j].setY(pt[j].y() - dy);
580 shift = G4Translate3D(dx, dy, 0);
584 G4VSolid* shape =
new G4Trap(name.c_str(), pt);
589 G4VSolid* get_bellecrystal(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
591 map<int, G4ThreeVector> v = make_verticies(wrapthick);
594 name += to_string(nshape);
596 G4ThreeVector pt[10];
608 G4VSolid* shape =
new BelleCrystal(name.c_str(), 5, pt);
627 vector<shape_t*> load_shapes(
const string& fname)
629 vector<shape_t*> shapes;
632 ifstream IN(fnamef.c_str());
634 while (getline(IN, tmp)) {
635 size_t ic = tmp.find(
"#");
636 if (ic != string::npos) tmp.erase(ic);
637 istringstream iss(tmp);
639 copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(t));
642 if (t.size() == 21) {
646 istringstream in(t[0]);
649 for (
size_t i = 1; i < t.size(); i++) {
650 in.str(t[i]); in.seekg(0, ios_base::beg);
653 }
else if (t.size() == 13) {
654 shape =
new quadrilateral_barrel_t();
655 quadrilateral_barrel_t& trap =
static_cast<quadrilateral_barrel_t&
>(*shape);
657 istringstream in(t[0]);
660 for (
size_t i = 1; i < t.size(); i++) {
661 in.str(t[i]); in.seekg(0, ios_base::beg);
664 }
else if (t.size() == 22) {
665 shape =
new pent_t();
666 pent_t& pent =
static_cast<pent_t&
>(*shape);
668 istringstream in(t[0]);
671 for (
size_t i = 1; i < t.size(); i++) {
672 in.str(t[i]); in.seekg(0, ios_base::beg);
677 shapes.push_back(shape);
691 vector<cplacement_t> load_placements(
const string& fname)
693 vector<cplacement_t> plcmnt;
696 ifstream IN(fnamef.c_str());
698 while (getline(IN, tmp)) {
699 size_t ic = tmp.find(
"#");
700 if (ic != string::npos) tmp.erase(ic);
701 istringstream iss(tmp);
703 copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(t));
706 istringstream in(t[0]);
708 in.str(t[1]); in.seekg(0, ios_base::beg);
710 in.str(t[2]); in.seekg(0, ios_base::beg);
712 in.str(t[3]); in.seekg(0, ios_base::beg);
714 in.str(t[4]); in.seekg(0, ios_base::beg);
716 in.str(t[5]); in.seekg(0, ios_base::beg);
718 in.str(t[6]); in.seekg(0, ios_base::beg);
727 G4Transform3D get_transform(
const cplacement_t& t)
729 G4Transform3D r = G4Rotate3D(t.Rphi1, G4Vector3D(sin(t.Rtheta) * cos(t.Rphi2), sin(t.Rtheta) * sin(t.Rphi2), cos(t.Rtheta)));
730 G4Transform3D p = G4Translate3D(t.Pr * sin(t.Ptheta) * cos(t.Pphi), t.Pr * sin(t.Ptheta) * sin(t.Pphi), t.Pr * cos(t.Ptheta));
737 auto fillbuffer = [&buffer](
const string & fname) {
739 ifstream IN(path.c_str());
740 buffer.clear(); buffer.str(
"");
741 buffer << IN.rdbuf();
745 fillbuffer(
"/ecl/data/crystal_shape_forward.dat"); a.setShapeForward(buffer.str());
746 fillbuffer(
"/ecl/data/crystal_shape_barrel.dat"); a.setShapeBarrel(buffer.str());
747 fillbuffer(
"/ecl/data/crystal_shape_backward.dat"); a.setShapeBackward(buffer.str());
748 fillbuffer(
"/ecl/data/crystal_placement_forward.dat"); a.setPlacementForward(buffer.str());
749 fillbuffer(
"/ecl/data/crystal_placement_barrel.dat"); a.setPlacementBarrel(buffer.str());
750 fillbuffer(
"/ecl/data/crystal_placement_backward.dat"); a.setPlacementBackward(buffer.str());
756 vector<shape_t*> load_shapes(stringstream& IN)
758 vector<shape_t*> shapes;
760 while (getline(IN, tmp)) {
761 size_t ic = tmp.find(
"#");
762 if (ic != string::npos) tmp.erase(ic);
763 istringstream iss(tmp);
765 copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(t));
767 shape_t* shape =
nullptr;
768 if (t.size() == 21) {
769 shape =
new quadrilateral_endcap_t();
770 quadrilateral_endcap_t& trap =
static_cast<quadrilateral_endcap_t&
>(*shape);
772 istringstream in(t[0]);
775 for (
size_t i = 1; i < t.size(); i++) {
776 in.str(t[i]); in.seekg(0, ios_base::beg);
779 }
else if (t.size() == 13) {
780 shape =
new quadrilateral_barrel_t();
781 quadrilateral_barrel_t& trap =
static_cast<quadrilateral_barrel_t&
>(*shape);
783 istringstream in(t[0]);
786 for (
size_t i = 1; i < t.size(); i++) {
787 in.str(t[i]); in.seekg(0, ios_base::beg);
790 }
else if (t.size() == 22) {
791 shape =
new pent_t();
792 pent_t& pent =
static_cast<pent_t&
>(*shape);
794 istringstream in(t[0]);
797 for (
size_t i = 1; i < t.size(); i++) {
798 in.str(t[i]); in.seekg(0, ios_base::beg);
803 shapes.push_back(shape);
810 vector<cplacement_t> load_placements(stringstream& IN)
812 vector<cplacement_t> plcmnt;
814 while (getline(IN, tmp)) {
815 size_t ic = tmp.find(
"#");
816 if (ic != string::npos) tmp.erase(ic);
817 istringstream iss(tmp);
819 copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(t));
822 istringstream in(t[0]);
824 in.str(t[1]); in.seekg(0, ios_base::beg);
826 in.str(t[2]); in.seekg(0, ios_base::beg);
828 in.str(t[3]); in.seekg(0, ios_base::beg);
830 in.str(t[4]); in.seekg(0, ios_base::beg);
832 in.str(t[5]); in.seekg(0, ios_base::beg);
834 in.str(t[6]); in.seekg(0, ios_base::beg);
865 if (part == ECLParts::forward)
867 else if (part == ECLParts::barrel)
869 else if (part == ECLParts::backward)
871 return load_placements(IN);
877 if (part == ECLParts::forward)
879 else if (part == ECLParts::barrel)
881 else if (part == ECLParts::backward)
883 return load_shapes(IN);
889 vector<cplacement_t> bp = load_placements(&crystals, ECLParts::forward);
890 for (vector<cplacement_t>::const_iterator it = bp.begin(); it != bp.end(); ++it) {
891 const cplacement_t& t = *it;
892 cout << t.nshape <<
" " << t.Rphi1 <<
" " << t.Rtheta <<
" " << t.Rphi2 <<
" " << t.Pr <<
" " << t.Ptheta <<
" " << t.Pphi << endl;
Crystal shapes and positions.
const std::string & getShapeBackward() const
Return crystal shape in backward endcap.
const std::string & getPlacementBackward() const
Return crystal placement in backward endcap.
const std::string & getShapeForward() const
Return crystal shape in forward endcap.
const std::string & getPlacementForward() const
Return crystal placement in forward endcap.
const std::string & getShapeBarrel() const
Return crystal shape in barrel.
const std::string & getPlacementBarrel() const
Return crystal placement in barrel.
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...
Abstract base class for different kinds of events.
const std::vector< double > v3
MATLAB generated random vector.
const std::vector< double > v2
MATLAB generated random vector.
const std::vector< double > v1
MATLAB generated random vector.