1 #include "ecl/geometry/shapes.h"
2 #include "G4TessellatedSolid.hh"
3 #include "G4TriangularFacet.hh"
4 #include "G4QuadrangularFacet.hh"
5 #include <G4ExtrudedSolid.hh>
7 #include "ecl/geometry/BelleCrystal.h"
11 #include "CLHEP/Matrix/Vector.h"
12 #include "CLHEP/Matrix/Matrix.h"
13 #include <G4TwoVector.hh>
14 #include <G4Vector3D.hh>
15 #include <framework/utilities/FileSystem.h>
16 #include <framework/logging/Logger.h>
26 double cosd(
double x) {
return cos(x * (M_PI / 180));}
27 double sind(
double x) {
return sin(x * (M_PI / 180));}
28 double tand(
double x) {
return tan(x * (M_PI / 180));}
30 double volume(
const G4ThreeVector& v0,
const G4ThreeVector& v1,
const G4ThreeVector& v2,
const G4ThreeVector& v3)
32 G4ThreeVector x =
v1 - v0, y =
v2 - v0, z =
v3 - v0;
33 return x.cross(y) * z;
36 G4ThreeVector newvertex(
double d,
const G4ThreeVector& v0,
const G4ThreeVector& v1,
const G4ThreeVector& v2,
37 const G4ThreeVector& v3)
39 G4ThreeVector x =
v1 - v0, y =
v2 - v0, z =
v3 - v0;
40 G4ThreeVector nxy = x.cross(y).unit();
41 G4ThreeVector nyz = y.cross(z).unit();
42 G4ThreeVector nzx = z.cross(x).unit();
44 CLHEP::HepMatrix A(3, 3);
45 A[0][0] = nxy.x(), A[0][1] = nxy.y(), A[0][2] = nxy.z();
46 A[1][0] = nyz.x(), A[1][1] = nyz.y(), A[1][2] = nyz.z();
47 A[2][0] = nzx.x(), A[2][1] = nzx.y(), A[2][2] = nzx.z();
49 CLHEP::HepVector B(3);
55 CLHEP::HepVector r = A.inverse() * B;
57 return G4ThreeVector(r[0], r[1], r[2]);
60 G4ThreeVector moveto(
double r,
double phi)
62 return G4ThreeVector(r * cosd(phi), r * sind(phi), 0);
66 G4VSolid* shape_t::get_solid(
const string& prefix,
double wrapthick, G4Translate3D& shift)
const
68 return get_bellecrystal(prefix, wrapthick, shift);
71 G4ThreeVector centerofgravity(
const map<int, G4ThreeVector>& v,
int i0,
int n)
73 double cx = 0, cy = 0, A = 0;
74 for (
int j = 0; j < n; j++) {
75 int j0 = j + i0, j1 = ((j + 1) % n) + i0;
76 const G4ThreeVector& v0 = v.find(j0)->second, &
v1 = v.find(j1)->second;
77 double t = v0.x() *
v1.y() - v0.y() *
v1.x();
80 cx += (v0.x() +
v1.x()) * t;
81 cy += (v0.y() +
v1.y()) * t;
85 return G4ThreeVector(cx, cy, v.find(i0)->second.z());
88 Point_t centerofgravity(Point_t* b, Point_t* e)
90 double cx = 0, cy = 0, A = 0;
92 for (
int j = 0; j < n; j++) {
93 int j0 = j, j1 = ((j + 1) % n);
94 const Point_t& v0 = b[j0], &
v1 = b[j1];
95 double t = v0.x *
v1.y - v0.y *
v1.x;
97 cx += (v0.x +
v1.x) * t;
98 cy += (v0.y +
v1.y) * t;
102 Point_t t = {cx, cy};
110 virtual map<int, G4ThreeVector> make_verticies(
double wrapthick)
const = 0;
112 G4VSolid* get_tesselatedsolid(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
114 map<int, G4ThreeVector> v = make_verticies(wrapthick);
117 name += to_string(nshape);
118 G4TessellatedSolid* s =
new G4TessellatedSolid(name.c_str());
122 s->AddFacet(
new G4QuadrangularFacet(v[1], v[4], v[3], v[2], ABSOLUTE));
124 s->AddFacet(
new G4QuadrangularFacet(v[5], v[6], v[7], v[8], ABSOLUTE));
126 s->AddFacet(
new G4QuadrangularFacet(v[1], v[2], v[6], v[5], ABSOLUTE));
127 s->AddFacet(
new G4QuadrangularFacet(v[2], v[3], v[7], v[6], ABSOLUTE));
128 s->AddFacet(
new G4QuadrangularFacet(v[3], v[4], v[8], v[7], ABSOLUTE));
129 s->AddFacet(
new G4QuadrangularFacet(v[4], v[1], v[5], v[8], ABSOLUTE));
132 s->SetSolidClosed(
true);
136 G4VSolid* get_extrudedsolid(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
138 map<int, G4ThreeVector> v = make_verticies(wrapthick);
141 name += to_string(nshape);
143 std::vector<G4TwoVector> p1, p2;
144 p1.push_back(G4TwoVector(v[1].x(), v[1].y()));
145 p1.push_back(G4TwoVector(v[2].x(), v[2].y()));
146 p1.push_back(G4TwoVector(v[3].x(), v[3].y()));
147 p1.push_back(G4TwoVector(v[4].x(), v[4].y()));
149 p2.push_back(G4TwoVector(v[1 + 4].x(), v[1 + 4].y()));
150 p2.push_back(G4TwoVector(v[2 + 4].x(), v[2 + 4].y()));
151 p2.push_back(G4TwoVector(v[3 + 4].x(), v[3 + 4].y()));
152 p2.push_back(G4TwoVector(v[4 + 4].x(), v[4 + 4].y()));
154 double sum = 0, sum2 = 0, smin = 1e9, smax = -1e9;
155 for (
int i = 0; i < 4; i++) {
156 for (
int j = i + 1; j < 4; j++) {
157 double s2 = (p2[j] - p2[i]).mag2() / (p1[j] - p1[i]).mag2();
161 if (s > smax) smax = s;
162 if (s < smin) smin = s;
166 double ave = sum / 6;
171 G4TwoVector off1(0, 0), off2(scale * p1[0].x() - p2[0].x(), scale * p1[0].y() - p2[0].y());
173 return new G4ExtrudedSolid(name, p1, abs(v[1].z()), off1, 1, -off2, scale);
176 G4VSolid* get_trapezoid(
const string& prefix,
double wrapthick, G4Translate3D& shift)
const override
178 map<int, G4ThreeVector> v = make_verticies(wrapthick);
181 G4ThreeVector b = v[4] - v[1];
182 G4ThreeVector d12 = v[2] - v[1], d43 = v[3] - v[4];
183 double b2 = b.mag2();
184 double h1 = b.cross(d12).mag2();
185 double h4 = b.cross(d43).mag2();
188 G4ThreeVector d24 = v[4] - v[2];
189 double d43b = d43 * b, s = (b2 * (d24 * d43) - (d24 * b) * d43b) / (d43b * d43b - b2 * d43.mag2());
190 v[3] = v[4] + s * d43;
191 v[7] = v[8] + s * (v[7] - v[8]);
193 G4ThreeVector d31 = v[1] - v[3];
194 double d12b = d12 * b, s = (b2 * (d31 * d12) - (d31 * b) * d12b) / (d12b * d12b - b2 * d12.mag2());
195 v[2] = v[1] + s * d12;
196 v[6] = v[5] + s * (v[6] - v[5]);
200 name += to_string(nshape);
212 auto alignz = [&](
int i,
int j) {pt[j].setZ(pt[i].z());};
213 auto aligny = [&](
int i,
int j) {pt[j].setY(pt[i].y());};
229 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();
231 double dy = pt[0].y() + pt[2].y() + pt[4].y() + pt[6].y();
233 for (
int j = 0; j < 8; j++) {
234 pt[j].setX(pt[j].x() - dx);
235 pt[j].setY(pt[j].y() - dy);
242 shift = G4Translate3D(dx, dy, 0);
243 G4VSolid* shape =
new G4Trap(name.c_str(), pt);
249 G4VSolid* get_bellecrystal(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
251 map<int, G4ThreeVector> v = make_verticies(wrapthick);
254 name += to_string(nshape);
266 for (
int i = 0; i < 8; i++) pt[i] = v[i + 1];
267 G4VSolid* shape =
new BelleCrystal(name.c_str(), 4, pt);
281 double A, B, H, a, b, h, alpha, beta, betap, gamma, Volume, Weight;
288 bool istrap()
const override
293 map<int, G4ThreeVector> make_verticies(
double wrapthick)
const override
295 map<int, G4ThreeVector> v;
297 double wh = h * h, wH = H * H, wnorm = wh + wH;
298 double tn = ((b - a) / 2 / h * wh + (B - A) / 2 / H * wH) / wnorm, d = h * tn, D = H * tn;
300 double m = (a + b) * 0.5, M = (A + B) * 0.5;
302 const double eps = 0.5e-3;
303 if (fabs(a - (m - d)) > eps || fabs(b - (m + d)) > eps || fabs(A - (M - D)) > eps || fabs(B - (M + D)) > eps) {
304 double alfa = atan(tn) * 180 / M_PI;
305 B2WARNING(
"Cannot make parallel sides better than 0.5 mcm: alpha =" << alpha <<
" alpha from sides = " << alfa <<
" da = " << a -
306 (m - d) <<
" db = " << b - (m + d) <<
" dA = " << A - (M - D) <<
" dB = " << B - (M + D));
309 v[1] = G4ThreeVector(-(m - d) / 2, h / 2, -150);
310 v[2] = G4ThreeVector(-(m + d) / 2, -h / 2, -150);
311 v[3] = G4ThreeVector((m + d) / 2, -h / 2, -150);
312 v[4] = G4ThreeVector((m - d) / 2, h / 2, -150);
313 v[5] = G4ThreeVector(-(M - D) / 2, H / 2, 150);
314 v[6] = G4ThreeVector(-(M + D) / 2, -H / 2, 150);
315 v[7] = G4ThreeVector((M + D) / 2, -H / 2, 150);
316 v[8] = G4ThreeVector((M - D) / 2, H / 2, 150);
318 if (wrapthick != 0) {
319 map<int, G4ThreeVector> nv;
320 nv[1] = newvertex(wrapthick, v[1], v[5], v[2], v[4]);
321 nv[2] = newvertex(wrapthick, v[2], v[6], v[3], v[1]);
322 nv[3] = newvertex(wrapthick, v[3], v[7], v[4], v[2]);
323 nv[4] = newvertex(wrapthick, v[4], v[8], v[1], v[3]);
324 nv[5] = newvertex(wrapthick, v[5], v[1], v[8], v[6]);
325 nv[6] = newvertex(wrapthick, v[6], v[2], v[5], v[7]);
326 nv[7] = newvertex(wrapthick, v[7], v[3], v[6], v[8]);
327 nv[8] = newvertex(wrapthick, v[8], v[4], v[7], v[5]);
340 double A, B, C, D, a, b, c, d, H_aA, H_dD, dg13, dg24, dg57, dg68, a1, a2, a3, a4, Volume, Weight;
347 bool istrap()
const override
349 double h1 = sind(a1) * D, h4 = sind(a4) * C;
350 return abs(h1 - h4) < 0.01 * h1;
353 map<int, G4ThreeVector> make_verticies(
double wrapthick)
const override
355 double minh = std::min(sind(a1) * D, sind(a4) * C);
356 double h2 = minh / 2;
357 double db = (tand(a1 - 90) - tand(a4 - 90)) * h2 / 2;
359 map<int, G4ThreeVector> v;
360 v[5] = G4ThreeVector(-A / 2 + db, -h2, -150);
361 v[6] = v[5] + moveto(D, a1);
362 v[8] = G4ThreeVector(A / 2 + db, -h2, -150);
363 v[7] = v[8] + moveto(C, 180 - a4);
366 G4ThreeVector vB = v[7] - v[6], va(a, 0, 0), vd = moveto(d, a1), vc = moveto(c, 180 - a4);
367 double delta = vB.cross(va + vc - vd).z() / vB.cross(vc + vd).z();
372 v[1] = v[5] + G4ThreeVector((H_aA * cosd(a1) + H_dD) / sind(a1), H_aA, 300);
377 for (
int j = 1; j <= 8; j++) v[j] = G4ThreeVector(v[j].x(), -v[j].y(), -v[j].z());
384 if (wrapthick != 0) {
385 map<int, G4ThreeVector> nv;
386 nv[1] = newvertex(wrapthick, v[1], v[5], v[2], v[4]);
387 nv[2] = newvertex(wrapthick, v[2], v[6], v[3], v[1]);
388 nv[3] = newvertex(wrapthick, v[3], v[7], v[4], v[2]);
389 nv[4] = newvertex(wrapthick, v[4], v[8], v[1], v[3]);
390 nv[5] = newvertex(wrapthick, v[5], v[1], v[8], v[6]);
391 nv[6] = newvertex(wrapthick, v[6], v[2], v[5], v[7]);
392 nv[7] = newvertex(wrapthick, v[7], v[3], v[6], v[8]);
393 nv[8] = newvertex(wrapthick, v[8], v[4], v[7], v[5]);
404 double A, C, D, a, c, d, B, b, H_aA, H_dD, dg13, dg24, dg57, dg68, a1, a4, a2, a3, a9, Volume, Weight;
409 pent_t(): _adjusted(
false) {}
416 H_dD -= 0.00005551197484235;
417 B += 0.0011245236213532729;
418 b += -0.00044853029662963;
423 bool istrap()
const override {
return false;}
425 map<int, G4ThreeVector> make_verticies(
double wrapthick)
const
429 double h2 = cosd(a1 - 90) * D / 2;
430 map<int, G4ThreeVector> v;
431 v[5] = G4ThreeVector(-A / 2, -h2, -150);
432 v[6] = v[5] + moveto(D, a1);
433 v[10] = v[6] + moveto(B, a1 + a2 - 180);
434 v[8] = G4ThreeVector(A / 2, -h2, -150);
435 v[7] = v[8] + moveto(D, 180 - a1);
437 v[1] = v[5] + G4ThreeVector((H_aA * cosd(a1) + H_dD) / sind(a1), H_aA, 300);
438 v[2] = v[1] + moveto(d, a1);
439 v[9] = v[2] + moveto(b, a1 + a2 - 180);
440 v[4] = v[1] + moveto(a, 0);
441 v[3] = v[4] + moveto(d, 180 - a1);
443 for (
int j = 1; j <= 10; j++) v[j] = G4ThreeVector(v[j].x(), -v[j].y(), -v[j].z());
444 if (wrapthick != 0) {
445 map<int, G4ThreeVector> nv;
446 nv[ 1] = newvertex(wrapthick, v[1], v[5], v[2], v[4]);
447 nv[ 2] = newvertex(wrapthick, v[2], v[6], v[9], v[1]);
448 nv[ 9] = newvertex(wrapthick, v[9], v[10], v[3], v[2]);
449 nv[ 3] = newvertex(wrapthick, v[3], v[7], v[4], v[9]);
450 nv[ 4] = newvertex(wrapthick, v[4], v[8], v[1], v[3]);
451 nv[ 5] = newvertex(wrapthick, v[5], v[1], v[8], v[6]);
452 nv[ 6] = newvertex(wrapthick, v[6], v[2], v[5], v[10]);
453 nv[10] = newvertex(wrapthick, v[10], v[9], v[6], v[7]);
454 nv[ 7] = newvertex(wrapthick, v[7], v[3], v[10], v[8]);
455 nv[ 8] = newvertex(wrapthick, v[8], v[4], v[7], v[5]);
461 G4VSolid* get_tesselatedsolid(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
463 if (nshape != 36)
return NULL;
465 map<int, G4ThreeVector> v = make_verticies(wrapthick);
468 name += to_string(nshape);
469 G4TessellatedSolid* s =
new G4TessellatedSolid(name.c_str());
473 s->AddFacet(
new G4QuadrangularFacet(v[1], v[4], v[3], v[2], ABSOLUTE));
474 s->AddFacet(
new G4TriangularFacet(v[2], v[3], v[9], ABSOLUTE));
477 s->AddFacet(
new G4QuadrangularFacet(v[5], v[6], v[7], v[8], ABSOLUTE));
478 s->AddFacet(
new G4TriangularFacet(v[6], v[10], v[7], ABSOLUTE));
481 s->AddFacet(
new G4QuadrangularFacet(v[1], v[2], v[6], v[5], ABSOLUTE));
482 s->AddFacet(
new G4QuadrangularFacet(v[2], v[9], v[10], v[6], ABSOLUTE));
483 s->AddFacet(
new G4QuadrangularFacet(v[9], v[3], v[7], v[10], ABSOLUTE));
484 s->AddFacet(
new G4QuadrangularFacet(v[3], v[4], v[8], v[7], ABSOLUTE));
485 s->AddFacet(
new G4QuadrangularFacet(v[4], v[1], v[5], v[8], ABSOLUTE));
488 s->SetSolidClosed(
true);
492 G4VSolid* get_extrudedsolid(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
494 map<int, G4ThreeVector> v = make_verticies(wrapthick);
497 name += to_string(nshape);
499 std::vector<G4TwoVector> p1, p2;
500 p1.push_back(G4TwoVector(v[1].x(), v[1].y()));
501 p1.push_back(G4TwoVector(v[2].x(), v[2].y()));
502 p1.push_back(G4TwoVector(v[9].x(), v[9].y()));
503 p1.push_back(G4TwoVector(v[3].x(), v[3].y()));
504 p1.push_back(G4TwoVector(v[4].x(), v[4].y()));
506 p2.push_back(G4TwoVector(v[1 + 4].x(), v[1 + 4].y()));
507 p2.push_back(G4TwoVector(v[2 + 4].x(), v[2 + 4].y()));
508 p2.push_back(G4TwoVector(v[ 10].x(), v[ 10].y()));
509 p2.push_back(G4TwoVector(v[3 + 4].x(), v[3 + 4].y()));
510 p2.push_back(G4TwoVector(v[4 + 4].x(), v[4 + 4].y()));
512 double sum = 0, sum2 = 0, smin = 1e9, smax = -1e9;
514 for (
int i = 0; i < 5; i++) {
515 for (
int j = i + 1; j < 5; j++) {
516 double s2 = (p2[j] - p2[i]).mag2() / (p1[j] - p1[i]).mag2();
520 if (s > smax) smax = s;
521 if (s < smin) smin = s;
526 double ave = sum / count;
531 G4TwoVector off1(0, 0), off2(scale * p1[0].x() - p2[0].x(), scale * p1[0].y() - p2[0].y());
533 return new G4ExtrudedSolid(name, p1, abs(v[1].z()), off1, 1, -off2, scale);
536 G4VSolid* get_trapezoid(
const string& prefix,
double wrapthick, G4Translate3D& shift)
const override
538 if (nshape != 36)
return NULL;
540 map<int, G4ThreeVector> v = make_verticies(wrapthick);
543 name += to_string(nshape);
555 auto alignz = [&](
int i,
int j) {pt[j].setZ(pt[i].z());};
556 auto aligny = [&](
int i,
int j) {pt[j].setY(pt[i].y());};
573 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();
575 double dy = pt[0].y() + pt[2].y() + pt[4].y() + pt[6].y();
577 for (
int j = 0; j < 8; j++) {
578 pt[j].setX(pt[j].x() - dx);
579 pt[j].setY(pt[j].y() - dy);
581 shift = G4Translate3D(dx, dy, 0);
585 G4VSolid* shape =
new G4Trap(name.c_str(), pt);
590 G4VSolid* get_bellecrystal(
const string& prefix,
double wrapthick, G4Translate3D& shift UNUSED)
const override
592 map<int, G4ThreeVector> v = make_verticies(wrapthick);
595 name += to_string(nshape);
597 G4ThreeVector pt[10];
609 G4VSolid* shape =
new BelleCrystal(name.c_str(), 5, pt);
628 vector<shape_t*> load_shapes(
const string& fname)
630 vector<shape_t*> shapes;
633 ifstream IN(fnamef.c_str());
635 while (getline(IN, tmp)) {
636 size_t ic = tmp.find(
"#");
637 if (ic != string::npos) tmp.erase(ic);
638 istringstream iss(tmp);
640 copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(t));
643 if (t.size() == 21) {
647 istringstream in(t[0]);
650 for (
size_t i = 1; i < t.size(); i++) {
651 in.str(t[i]); in.seekg(0, ios_base::beg);
654 }
else if (t.size() == 13) {
655 shape =
new quadrilateral_barrel_t();
656 quadrilateral_barrel_t& trap =
static_cast<quadrilateral_barrel_t&
>(*shape);
658 istringstream in(t[0]);
661 for (
size_t i = 1; i < t.size(); i++) {
662 in.str(t[i]); in.seekg(0, ios_base::beg);
665 }
else if (t.size() == 22) {
666 shape =
new pent_t();
667 pent_t& pent =
static_cast<pent_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);
678 shapes.push_back(shape);
692 vector<cplacement_t> load_placements(
const string& fname)
694 vector<cplacement_t> plcmnt;
697 ifstream IN(fnamef.c_str());
699 while (getline(IN, tmp)) {
700 size_t ic = tmp.find(
"#");
701 if (ic != string::npos) tmp.erase(ic);
702 istringstream iss(tmp);
704 copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(t));
707 istringstream in(t[0]);
709 in.str(t[1]); in.seekg(0, ios_base::beg);
711 in.str(t[2]); in.seekg(0, ios_base::beg);
713 in.str(t[3]); in.seekg(0, ios_base::beg);
715 in.str(t[4]); in.seekg(0, ios_base::beg);
717 in.str(t[5]); in.seekg(0, ios_base::beg);
719 in.str(t[6]); in.seekg(0, ios_base::beg);
728 G4Transform3D get_transform(
const cplacement_t& t)
730 G4Transform3D r = G4Rotate3D(t.Rphi1, G4Vector3D(sin(t.Rtheta) * cos(t.Rphi2), sin(t.Rtheta) * sin(t.Rphi2), cos(t.Rtheta)));
731 G4Transform3D p = G4Translate3D(t.Pr * sin(t.Ptheta) * cos(t.Pphi), t.Pr * sin(t.Ptheta) * sin(t.Pphi), t.Pr * cos(t.Ptheta));
738 auto fillbuffer = [&buffer](
const string & fname) {
740 ifstream IN(path.c_str());
741 buffer.clear(); buffer.str(
"");
742 buffer << IN.rdbuf();
746 fillbuffer(
"/ecl/data/crystal_shape_forward.dat"); a.setShapeForward(buffer.str());
747 fillbuffer(
"/ecl/data/crystal_shape_barrel.dat"); a.setShapeBarrel(buffer.str());
748 fillbuffer(
"/ecl/data/crystal_shape_backward.dat"); a.setShapeBackward(buffer.str());
749 fillbuffer(
"/ecl/data/crystal_placement_forward.dat"); a.setPlacementForward(buffer.str());
750 fillbuffer(
"/ecl/data/crystal_placement_barrel.dat"); a.setPlacementBarrel(buffer.str());
751 fillbuffer(
"/ecl/data/crystal_placement_backward.dat"); a.setPlacementBackward(buffer.str());
757 vector<shape_t*> load_shapes(stringstream& IN)
759 vector<shape_t*> shapes;
761 while (getline(IN, tmp)) {
762 size_t ic = tmp.find(
"#");
763 if (ic != string::npos) tmp.erase(ic);
764 istringstream iss(tmp);
766 copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(t));
768 shape_t* shape = NULL;
769 if (t.size() == 21) {
770 shape =
new quadrilateral_endcap_t();
771 quadrilateral_endcap_t& trap =
static_cast<quadrilateral_endcap_t&
>(*shape);
773 istringstream in(t[0]);
776 for (
size_t i = 1; i < t.size(); i++) {
777 in.str(t[i]); in.seekg(0, ios_base::beg);
780 }
else if (t.size() == 13) {
781 shape =
new quadrilateral_barrel_t();
782 quadrilateral_barrel_t& trap =
static_cast<quadrilateral_barrel_t&
>(*shape);
784 istringstream in(t[0]);
787 for (
size_t i = 1; i < t.size(); i++) {
788 in.str(t[i]); in.seekg(0, ios_base::beg);
791 }
else if (t.size() == 22) {
792 shape =
new pent_t();
793 pent_t& pent =
static_cast<pent_t&
>(*shape);
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);
804 shapes.push_back(shape);
811 vector<cplacement_t> load_placements(stringstream& IN)
813 vector<cplacement_t> plcmnt;
815 while (getline(IN, tmp)) {
816 size_t ic = tmp.find(
"#");
817 if (ic != string::npos) tmp.erase(ic);
818 istringstream iss(tmp);
820 copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(t));
823 istringstream in(t[0]);
825 in.str(t[1]); in.seekg(0, ios_base::beg);
827 in.str(t[2]); in.seekg(0, ios_base::beg);
829 in.str(t[3]); in.seekg(0, ios_base::beg);
831 in.str(t[4]); in.seekg(0, ios_base::beg);
833 in.str(t[5]); in.seekg(0, ios_base::beg);
835 in.str(t[6]); in.seekg(0, ios_base::beg);
866 if (part == ECLParts::forward)
868 else if (part == ECLParts::barrel)
870 else if (part == ECLParts::backward)
872 return load_placements(IN);
878 if (part == ECLParts::forward)
880 else if (part == ECLParts::barrel)
882 else if (part == ECLParts::backward)
884 return load_shapes(IN);
890 vector<cplacement_t> bp = load_placements(&crystals, ECLParts::forward);
891 for (vector<cplacement_t>::const_iterator it = bp.begin(); it != bp.end(); ++it) {
892 const cplacement_t& t = *it;
893 cout << t.nshape <<
" " << t.Rphi1 <<
" " << t.Rtheta <<
" " << t.Rphi2 <<
" " << t.Pr <<
" " << t.Ptheta <<
" " << t.Pphi << endl;