Function to actually create the geometry, has to be overridden by derived classes.
70 vector<double> bar = content.getArray(
"bar");
71 B2INFO(
"Contents of bar: ");
72 BOOST_FOREACH(
double value, bar) {
73 B2INFO(
"value: " << value);
88 BOOST_FOREACH(
const GearDir & activeParams, content.getNodes(
"Active")) {
91 double x_tpcbeamR = activeParams.getLength(
"x_tpcbeamR") * CLHEP::cm;
92 double y_tpcbeamR = activeParams.getLength(
"y_tpcbeamR") * CLHEP::cm;
93 double z_tpcbeamR = activeParams.getLength(
"z_tpcbeamR") * CLHEP::cm;
94 double x_tpcbeamL = activeParams.getLength(
"x_tpcbeamL") * CLHEP::cm;
95 double y_tpcbeamL = activeParams.getLength(
"y_tpcbeamL") * CLHEP::cm;
96 double z_tpcbeamL = activeParams.getLength(
"z_tpcbeamL") * CLHEP::cm;
97 double x_tpcbeamT = activeParams.getLength(
"x_tpcbeamT") * CLHEP::cm;
98 double y_tpcbeamT = activeParams.getLength(
"y_tpcbeamT") * CLHEP::cm;
99 double z_tpcbeamT = activeParams.getLength(
"z_tpcbeamT") * CLHEP::cm;
100 double x_tpcbeamB = activeParams.getLength(
"x_tpcbeamB") * CLHEP::cm;
101 double y_tpcbeamB = activeParams.getLength(
"y_tpcbeamB") * CLHEP::cm;
102 double z_tpcbeamB = activeParams.getLength(
"z_tpcbeamB") * CLHEP::cm;
114 double betpcbeam = 190.8 / 2. * CLHEP::mm;
115 G4double dx_tpcbeam = 2.54 * 1.63 / 2.*CLHEP::cm;
116 G4double dy_tpcbeam = 2.54 * 1.63 / 2.*CLHEP::cm;
117 G4double dz_tpcbeam = 2200. / 2.*CLHEP::mm;
118 G4double dw_tpcbeam = 2.54 * 0.25 / 2.*CLHEP::cm;
122 G4double dx_plate_short = 0.5 / 2. * CLHEP::cm;
123 G4double dy_plate_short = 27.47788 / 2.*CLHEP::cm;
124 G4double dz_plate_short = 40. / 2.*CLHEP::cm;
126 G4double dx_plate = 0.5 / 2. * CLHEP::cm;
127 G4double dy_plate = 32. / 2.*CLHEP::cm;
128 G4double dz_plate = 50. / 2.*CLHEP::cm;
132 G4VSolid* s_plate =
new G4Box(
"s_plate", dx_plate, dy_plate, dz_plate);
133 G4VSolid* s_plate_short =
new G4Box(
"s_plate_short", dx_plate_short, dy_plate_short, dz_plate_short);
137 G4LogicalVolume* l_plate_short =
new G4LogicalVolume(s_plate_short,
geometry::Materials::get(
"Al") ,
"l_plate_short", 0, 0);
138 G4VisAttributes* white =
new G4VisAttributes(G4Colour(1, 1, 1));
139 white->SetForceAuxEdgeVisible(
true);
140 l_plate->SetVisAttributes(white);
141 l_plate_short->SetVisAttributes(white);
143 G4VSolid* s_tpcbeam_a =
new G4Box(
"s_tpcbeam_a", dx_tpcbeam, dy_tpcbeam, dz_tpcbeam);
144 G4VSolid* s_tpcbeam_b =
new G4Box(
"s_tpcbeam_b", dx_tpcbeam - 2.*dw_tpcbeam, dy_tpcbeam - dw_tpcbeam, dz_tpcbeam);
145 G4VSolid* s_tpcbeampos =
new G4SubtractionSolid(
"s_tpcbeampos", s_tpcbeam_a, s_tpcbeam_b, 0, G4ThreeVector(0, dw_tpcbeam, 0));
146 G4VSolid* s_tpcbeamneg =
new G4SubtractionSolid(
"s_tpcbeamneg", s_tpcbeam_a, s_tpcbeam_b, 0, G4ThreeVector(0, -dw_tpcbeam, 0));
147 G4VSolid* s_tpcbeam =
new G4UnionSolid(
"s_tpcbeam", s_tpcbeampos, s_tpcbeamneg, 0, G4ThreeVector(0, -2.*dy_tpcbeam, 0));
150 G4LogicalVolume* l_tpcbeam =
new G4LogicalVolume(s_tpcbeam,
geometry::Materials::get(
"FG_Epoxy") ,
"l_tpcbeam", 0, 0);
153 G4ThreeVector PH1SUSTRpos = G4ThreeVector(
158 new G4PVPlacement(0, PH1SUSTRpos, l_plate,
"p_plateR", &topVolume,
false, 1);
162 G4double offset_h = dz_tpcbeam + 80.*CLHEP::cm - 2. * dz_tpcbeam;
171 G4Transform3D TransForm = G4Translate3D(x_tpcbeamR + dx_plate + dx_tpcbeam,
172 y_tpcbeamR + betpcbeam + 2. * dy_tpcbeam,
173 -offset_h / 2.) * G4RotateZ3D(90.*CLHEP::deg);
174 new G4PVPlacement(TransForm, l_tpcbeam,
"p_tpcbeamR1", &topVolume,
false, 1);
183 TransForm = G4Translate3D(x_tpcbeamR + dx_plate + dx_tpcbeam,
184 y_tpcbeamR - betpcbeam - 2. * dy_tpcbeam,
185 -offset_h / 2.) * G4RotateZ3D(90.*CLHEP::deg);
186 new G4PVPlacement(TransForm, l_tpcbeam,
"p_tpcbeamR2", &topVolume,
false, 1);
190 PH1SUSTRpos = G4ThreeVector(
195 new G4PVPlacement(0, PH1SUSTRpos, l_plate,
"p_plateL", &topVolume,
false, 1);
204 TransForm = G4Translate3D(x_tpcbeamL - dx_plate - 3. * dx_tpcbeam,
205 y_tpcbeamL + betpcbeam + 2. * dy_tpcbeam,
206 -offset_h / 2.) * G4RotateZ3D(90.*CLHEP::deg);
207 new G4PVPlacement(TransForm, l_tpcbeam,
"p_tpcbeamL1", &topVolume,
false, 1);
216 TransForm = G4Translate3D(x_tpcbeamL - dx_plate - 3. * dx_tpcbeam,
217 y_tpcbeamL - betpcbeam - 2. * dy_tpcbeam,
218 -offset_h / 2.) * G4RotateZ3D(90.*CLHEP::deg);
219 new G4PVPlacement(TransForm, l_tpcbeam,
"p_tpcbeamL2", &topVolume,
false, 1);
222 G4RotationMatrix* rotXx =
new G4RotationMatrix();
223 double Angle = 90. * CLHEP::deg;
224 rotXx->rotateZ(Angle);
226 PH1SUSTRpos = G4ThreeVector(
231 new G4PVPlacement(rotXx, PH1SUSTRpos, l_plate_short,
"p_plateB", &topVolume,
false, 1);
240 TransForm = G4Translate3D(x_tpcbeamB + betpcbeam + 1.5 * dx_tpcbeam,
241 y_tpcbeamB - dx_plate - 1.5 * dy_tpcbeam,
243 new G4PVPlacement(TransForm, l_tpcbeam,
"p_tpcbeamB1", &topVolume,
false, 1);
252 TransForm = G4Translate3D(x_tpcbeamB - betpcbeam - 1.5 * dx_tpcbeam,
253 y_tpcbeamB - dx_plate - 1.5 * dy_tpcbeam,
255 new G4PVPlacement(TransForm, l_tpcbeam,
"p_tpcbeamB2", &topVolume,
false, 1);
261 PH1SUSTRpos = G4ThreeVector(
266 new G4PVPlacement(rotXx, PH1SUSTRpos, l_plate,
"p_plateT", &topVolume,
false, 1);
275 TransForm = G4Translate3D(x_tpcbeamT + betpcbeam + 1.5 * dx_tpcbeam,
276 y_tpcbeamT + dx_plate + 3. * dy_tpcbeam,
278 new G4PVPlacement(TransForm, l_tpcbeam,
"p_tpcbeamT1", &topVolume,
false, 1);
287 TransForm = G4Translate3D(x_tpcbeamT - betpcbeam - 1.5 * dx_tpcbeam,
288 y_tpcbeamT + dx_plate + 3 * dy_tpcbeam,
290 new G4PVPlacement(TransForm, l_tpcbeam,
"p_tpcbeamT2", &topVolume,
false, 1);
294 G4double dz_tpcbeamv = 1583. / 2.*CLHEP::mm;
295 G4VSolid* s_tpcbeamv_a =
new G4Box(
"s_tpcbeamv_a", dx_tpcbeam, dy_tpcbeam, dz_tpcbeamv);
296 G4VSolid* s_tpcbeamv_b =
new G4Box(
"s_tpcbeamv_b", dx_tpcbeam - 2.*dw_tpcbeam, dy_tpcbeam - dw_tpcbeam, dz_tpcbeamv);
297 G4VSolid* s_tpcbeamvpos =
new G4SubtractionSolid(
"s_tpcbeamvpos", s_tpcbeamv_a, s_tpcbeamv_b, 0, G4ThreeVector(0, dw_tpcbeam, 0));
298 G4VSolid* s_tpcbeamvneg =
new G4SubtractionSolid(
"s_tpcbeamvneg", s_tpcbeamv_a, s_tpcbeamv_b, 0, G4ThreeVector(0, -dw_tpcbeam, 0));
299 G4VSolid* s_tpcbeamv =
new G4UnionSolid(
"s_tpcbeamv", s_tpcbeamvpos, s_tpcbeamvneg, 0, G4ThreeVector(0, -2.*dy_tpcbeam, 0));
300 G4LogicalVolume* l_tpcbeamv =
new G4LogicalVolume(s_tpcbeamv,
geometry::Materials::get(
"FG_Epoxy") ,
"l_tpcbeamv", 0, 0);
304 G4double offset_v = fabs(110.*CLHEP::cm - 2. * dz_tpcbeamv) / 2.;
307 G4RotationMatrix* rotX =
new G4RotationMatrix();
308 rotX->rotateX(90.*CLHEP::deg);
309 PH1SUSTRpos = G4ThreeVector(
310 x_tpcbeamL - dx_plate - 3 * dx_tpcbeam - 2.*dx_tpcbeam,
314 new G4PVPlacement(rotX, PH1SUSTRpos, l_tpcbeamv,
"p_tpcbeamv1", &topVolume,
false, 0);
316 PH1SUSTRpos = G4ThreeVector(
317 x_tpcbeamR + dx_plate + 3.*dx_tpcbeam + 2.*dx_tpcbeam,
321 new G4PVPlacement(rotX, PH1SUSTRpos, l_tpcbeamv,
"p_tpcbeamv2", &topVolume,
false, 0);
323 PH1SUSTRpos = G4ThreeVector(
324 x_tpcbeamL - dx_plate - 3.*dx_tpcbeam - 2.*dx_tpcbeam,
328 new G4PVPlacement(rotX, PH1SUSTRpos, l_tpcbeamv,
"p_tpcbeamv3", &topVolume,
false, 0);
330 PH1SUSTRpos = G4ThreeVector(
331 x_tpcbeamR + dx_plate + 3.*dx_tpcbeam + 2.*dx_tpcbeam,
335 new G4PVPlacement(rotX, PH1SUSTRpos, l_tpcbeamv,
"p_tpcbeamv4", &topVolume,
false, 0);
339 G4double dz_tpcbeamh = 1614. / 2.*CLHEP::mm;
340 G4VSolid* s_tpcbeamh_a =
new G4Box(
"s_tpcbeamh_a", dx_tpcbeam, dy_tpcbeam, dz_tpcbeamh);
341 G4VSolid* s_tpcbeamh_b =
new G4Box(
"s_tpcbeamh_b", dx_tpcbeam - 2.*dw_tpcbeam, dy_tpcbeam - dw_tpcbeam, dz_tpcbeamh);
342 G4VSolid* s_tpcbeamhpos =
new G4SubtractionSolid(
"s_tpcbeamhpos", s_tpcbeamh_a, s_tpcbeamh_b, 0, G4ThreeVector(0, dw_tpcbeam, 0));
343 G4VSolid* s_tpcbeamhneg =
new G4SubtractionSolid(
"s_tpcbeanhneg", s_tpcbeamh_a, s_tpcbeamh_b, 0, G4ThreeVector(0, -dw_tpcbeam, 0));
344 G4VSolid* s_tpcbeamh =
new G4UnionSolid(
"s_tpcbeamh", s_tpcbeamhpos, s_tpcbeamhneg, 0, G4ThreeVector(0, -2.*dy_tpcbeam, 0));
346 G4LogicalVolume* l_tpcbeamh =
new G4LogicalVolume(s_tpcbeamh,
geometry::Materials::get(
"FG_Epoxy") ,
"l_tpcbeamh", 0, 0);
349 G4RotationMatrix* rotY =
new G4RotationMatrix();
350 rotY->rotateY(90.*CLHEP::deg);
351 PH1SUSTRpos = G4ThreeVector(
353 y_tpcbeamB - dx_plate - 4. * dy_tpcbeam - 2. * dy_tpcbeam,
354 1100.*CLHEP::mm - 2. * dy_tpcbeam
356 new G4PVPlacement(rotY, PH1SUSTRpos, l_tpcbeamh,
"p_tpcbeamh1", &topVolume,
false, 0);
359 PH1SUSTRpos = G4ThreeVector(
361 y_tpcbeamT + dx_plate + 5. * dy_tpcbeam + 2. * dy_tpcbeam,
362 1100.*CLHEP::mm - 2. * dy_tpcbeam
364 new G4PVPlacement(rotY, PH1SUSTRpos, l_tpcbeamh,
"p_tpcbeamh2", &topVolume,
false, 0);
367 PH1SUSTRpos = G4ThreeVector(
369 y_tpcbeamB - dx_plate - 4. * dy_tpcbeam - 2. * dy_tpcbeam,
370 -800.*CLHEP::mm + 4. * dy_tpcbeam
372 new G4PVPlacement(rotY, PH1SUSTRpos, l_tpcbeamh,
"p_tpcbeamh3", &topVolume,
false, 0);
375 PH1SUSTRpos = G4ThreeVector(
377 y_tpcbeamT + dx_plate + 5. * dy_tpcbeam + 2. * dy_tpcbeam,
378 -800.*CLHEP::mm + 4. * dy_tpcbeam
380 new G4PVPlacement(rotY, PH1SUSTRpos, l_tpcbeamh,
"p_tpcbeamh4", &topVolume,
false, 0);
382 G4VisAttributes* brown =
new G4VisAttributes(G4Colour(.5, .5, 0));
383 brown->SetForceAuxEdgeVisible(
true);
384 l_tpcbeam->SetVisAttributes(brown);
385 l_tpcbeamv->SetVisAttributes(brown);
386 l_tpcbeamh->SetVisAttributes(brown);
389 G4double dz_csibeamh = activeParams.getLength(
"lcsiBeamh") * CLHEP::cm / 2.;
390 G4VSolid* s_csibeamh_a =
new G4Box(
"s_csibeamh_a", dx_tpcbeam, dy_tpcbeam, dz_csibeamh);
391 G4VSolid* s_csibeamh_b =
new G4Box(
"s_csibeamh_b", dx_tpcbeam - 2.*dw_tpcbeam, dy_tpcbeam - dw_tpcbeam, dz_csibeamh);
392 G4VSolid* s_csibeamhpos =
new G4SubtractionSolid(
"s_csibeamhpos", s_csibeamh_a, s_csibeamh_b, 0, G4ThreeVector(0, dw_tpcbeam, 0));
393 G4VSolid* s_csibeamhneg =
new G4SubtractionSolid(
"s_csibeamhneg", s_csibeamh_a, s_csibeamh_b, 0, G4ThreeVector(0, -dw_tpcbeam, 0));
396 G4VSolid* s_csibeamh =
new G4UnionSolid(
"s_csibeamh", s_csibeamhpos, s_csibeamhneg, 0, G4ThreeVector(0, -2.*dy_tpcbeam, 0));
397 G4LogicalVolume* l_csibeamh =
new G4LogicalVolume(s_csibeamh,
geometry::Materials::get(
"FG_Epoxy") ,
"l_csibeamh", 0, 0);
401 int xdimcsiBeamh = 0;
402 int ydimcsiBeamh = 0;
403 int zdimcsiBeamh = 0;
404 int xdimcsiBeamvF = 0;
405 int ydimcsiBeamvF = 0;
406 int zdimcsiBeamvF = 0;
407 int xdimcsiBeamvB = 0;
408 int ydimcsiBeamvB = 0;
409 int zdimcsiBeamvB = 0;
410 int xdimbgobeamv = 0;
411 int ydimbgobeamv = 0;
412 int zdimbgobeamv = 0;
413 int xdimbgobeamh = 0;
414 int ydimbgobeamh = 0;
415 int zdimbgobeamh = 0;
416 int xdimbgobeamt = 0;
417 int ydimbgobeamt = 0;
418 int zdimbgobeamt = 0;
419 int xdimbgobeamb = 0;
420 int ydimbgobeamb = 0;
421 int zdimbgobeamb = 0;
422 int xdimtpcbeamb = 0;
423 int ydimtpcbeamb = 0;
424 int zdimtpcbeamb = 0;
434 double xcsibeamh[100];
435 double ycsibeamh[100];
436 double zcsibeamh[100];
437 double xcsibeamvF[100];
438 double ycsibeamvF[100];
439 double zcsibeamvF[100];
440 double xcsibeamvB[100];
441 double ycsibeamvB[100];
442 double zcsibeamvB[100];
443 double xbgobeamv[100];
444 double ybgobeamv[100];
445 double zbgobeamv[100];
446 double xbgobeamh[100];
447 double ybgobeamh[100];
448 double zbgobeamh[100];
449 double xbgobeamt[100];
450 double ybgobeamt[100];
451 double zbgobeamt[100];
452 double xbgobeamb[100];
453 double ybgobeamb[100];
454 double zbgobeamb[100];
455 double xtpcbeamb[100];
456 double ytpcbeamb[100];
457 double ztpcbeamb[100];
465 double x_offset = activeParams.getLength(
"x_offset") * CLHEP::cm;
466 double y_offset = activeParams.getLength(
"y_offset") * CLHEP::cm;
468 for (
double xcsiBeamh : activeParams.getArray(
"xcsiBeamh", {0})) {
469 xcsiBeamh *= CLHEP::cm;
470 xcsibeamh[xdimcsiBeamh] = xcsiBeamh - x_offset;
473 for (
double ycsiBeamh : activeParams.getArray(
"ycsiBeamh", {0})) {
474 ycsiBeamh *= CLHEP::cm;
475 ycsibeamh[ydimcsiBeamh] = ycsiBeamh - y_offset;
478 for (
double zcsiBeamh : activeParams.getArray(
"zcsiBeamh", {0})) {
479 zcsiBeamh *= CLHEP::cm;
480 zcsibeamh[zdimcsiBeamh] = zcsiBeamh;
483 for (
int i = 0; i < xdimcsiBeamh; i++) {
484 G4Transform3D transform = G4Translate3D(xcsibeamh[i], ycsibeamh[i] - dy_tpcbeam,
485 zcsibeamh[i] + 2. * dy_tpcbeam) * G4RotateY3D(90.*CLHEP::deg) * G4RotateZ3D(90.*CLHEP::deg);
486 new G4PVPlacement(transform, l_csibeamh, TString::Format(
"p_csibeamh1_%d", i).Data(), &topVolume,
false, 1);
487 transform = G4Translate3D(xcsibeamh[i], ycsibeamh[i] + dy_tpcbeam,
488 zcsibeamh[i] + 2. * dy_tpcbeam) * G4RotateY3D(90.*CLHEP::deg) * G4RotateZ3D(90.*CLHEP::deg);
489 new G4PVPlacement(transform, l_csibeamh, TString::Format(
"p_csibeamh2_%d", i).Data(), &topVolume,
false, 1);
496 G4double dz_csibeamvF = activeParams.getLength(
"lcsiBeamvF") * CLHEP::cm / 2.;
497 G4VSolid* s_csibeamvF_a =
new G4Box(
"s_csibeamvF_a", dx_tpcbeam, dy_tpcbeam, dz_csibeamvF);
498 G4VSolid* s_csibeamvF_b =
new G4Box(
"s_csibeamvF_b", dx_tpcbeam - 2.*dw_tpcbeam, dy_tpcbeam - dw_tpcbeam, dz_csibeamvF);
499 G4VSolid* s_csibeamvFpos =
new G4SubtractionSolid(
"s_csibeamvFpos", s_csibeamvF_a, s_csibeamvF_b, 0, G4ThreeVector(0, dw_tpcbeam,
501 G4VSolid* s_csibeamvFneg =
new G4SubtractionSolid(
"s_csibeamvFneg", s_csibeamvF_a, s_csibeamvF_b, 0, G4ThreeVector(0, -dw_tpcbeam,
503 G4VSolid* s_csibeamvF =
new G4UnionSolid(
"s_csibeamvF", s_csibeamvFpos, s_csibeamvFneg, 0, G4ThreeVector(0, -2.*dy_tpcbeam, 0));
504 G4LogicalVolume* l_csibeamvF =
new G4LogicalVolume(s_csibeamvF,
geometry::Materials::get(
"FG_Epoxy") ,
"l_csibeamvF", 0, 0);
506 for (
double xcsiBeamvF : activeParams.getArray(
"xcsiBeamvF", {0})) {
507 xcsiBeamvF *= CLHEP::cm;
508 xcsibeamvF[xdimcsiBeamvF] = xcsiBeamvF - x_offset;
511 for (
double ycsiBeamvF : activeParams.getArray(
"ycsiBeamvF", {0})) {
512 ycsiBeamvF *= CLHEP::cm;
513 ycsibeamvF[ydimcsiBeamvF] = ycsiBeamvF - y_offset ;
516 for (
double zcsiBeamvF : activeParams.getArray(
"zcsiBeamvF", {0})) {
517 zcsiBeamvF *= CLHEP::cm;
518 zcsibeamvF[zdimcsiBeamvF] = zcsiBeamvF ;
521 for (
int i = 0; i < xdimcsiBeamvF; i++) {
523 PH1SUSTRpos = G4ThreeVector(xcsibeamvF[i], ycsibeamvF[i], zcsibeamvF[i]);
524 new G4PVPlacement(rotX, PH1SUSTRpos, l_csibeamvF, TString::Format(
"p_csibeamvF_%d", i).Data(), &topVolume,
false, 0);
527 G4double dz_csibeamvB = activeParams.getLength(
"lcsiBeamvB") * CLHEP::cm / 2.;
528 G4VSolid* s_csibeamvB_a =
new G4Box(
"s_csibeamvB_a", dx_tpcbeam, dy_tpcbeam, dz_csibeamvB);
529 G4VSolid* s_csibeamvB_b =
new G4Box(
"s_csibeamvB_b", dx_tpcbeam - 2.*dw_tpcbeam, dy_tpcbeam - dw_tpcbeam, dz_csibeamvB);
530 G4VSolid* s_csibeamvBpos =
new G4SubtractionSolid(
"s_csibeamvBpos", s_csibeamvB_a, s_csibeamvB_b, 0, G4ThreeVector(0, dw_tpcbeam,
532 G4VSolid* s_csibeamvBneg =
new G4SubtractionSolid(
"s_csibeamvBneg", s_csibeamvB_a, s_csibeamvB_b, 0, G4ThreeVector(0, -dw_tpcbeam,
534 G4VSolid* s_csibeamvB =
new G4UnionSolid(
"s_csibeamvB", s_csibeamvBpos, s_csibeamvBneg, 0, G4ThreeVector(0, -2.*dy_tpcbeam, 0));
535 G4LogicalVolume* l_csibeamvB =
new G4LogicalVolume(s_csibeamvB,
geometry::Materials::get(
"FG_Epoxy") ,
"l_csibeamvB", 0, 0);
537 for (
double xcsiBeamvB : activeParams.getArray(
"xcsiBeamvB", {0})) {
538 xcsiBeamvB *= CLHEP::cm;
539 xcsibeamvB[xdimcsiBeamvB] = xcsiBeamvB - x_offset;
542 for (
double ycsiBeamvB : activeParams.getArray(
"ycsiBeamvB", {0})) {
543 ycsiBeamvB *= CLHEP::cm;
544 ycsibeamvB[ydimcsiBeamvB] = ycsiBeamvB - y_offset ;
547 for (
double zcsiBeamvB : activeParams.getArray(
"zcsiBeamvB", {0})) {
548 zcsiBeamvB *= CLHEP::cm;
549 zcsibeamvB[zdimcsiBeamvB] = zcsiBeamvB ;
552 for (
int i = 0; i < xdimcsiBeamvB; i++) {
553 PH1SUSTRpos = G4ThreeVector(xcsibeamvB[i], ycsibeamvB[i], zcsibeamvB[i]);
554 new G4PVPlacement(rotX, PH1SUSTRpos, l_csibeamvB, TString::Format(
"p_csibeamvB_%d", i).Data(), &topVolume,
false, 0);
557 G4double dz_base = activeParams.getLength(
"lBase") * CLHEP::cm / 2.;
558 G4VSolid* s_base_a =
new G4Box(
"s_base_a", dx_tpcbeam, dy_tpcbeam, dz_base);
559 G4VSolid* s_base_b =
new G4Box(
"s_base_b", dx_tpcbeam - 2.*dw_tpcbeam, dy_tpcbeam - dw_tpcbeam, dz_base);
560 G4VSolid* s_base =
new G4SubtractionSolid(
"s_base", s_base_a, s_base_b, 0, G4ThreeVector(0, dw_tpcbeam, 0));
563 for (
double xBase : activeParams.getArray(
"xBase", {0})) {
565 xbase[xdimbase] = xBase - x_offset;
568 for (
double yBase : activeParams.getArray(
"yBase", {0})) {
570 ybase[ydimbase] = yBase - y_offset;
573 for (
double zBase : activeParams.getArray(
"zBase", {0})) {
575 zbase[zdimbase] = zBase ;
578 for (
int i = 0; i < xdimbase; i++) {
579 PH1SUSTRpos = G4ThreeVector(xbase[i], ybase[i], zbase[i]);
580 new G4PVPlacement(0, PH1SUSTRpos, l_base, TString::Format(
"p_base_%d", i).Data(), &topVolume,
false, 0);
583 G4double dz_bgobeamv = activeParams.getLength(
"lbgoBeamv") * CLHEP::cm / 2.;
584 G4VSolid* s_bgobeamv_a =
new G4Box(
"s_bgobeamv_a", dx_tpcbeam, dy_tpcbeam, dz_bgobeamv);
585 G4VSolid* s_bgobeamv_b =
new G4Box(
"s_bgobeamv_b", dx_tpcbeam - 2.*dw_tpcbeam, dy_tpcbeam - dw_tpcbeam, dz_bgobeamv);
586 G4VSolid* s_bgobeamvpos =
new G4SubtractionSolid(
"s_bgobeamvpos", s_bgobeamv_a, s_bgobeamv_b, 0, G4ThreeVector(0, dw_tpcbeam, 0));
587 G4VSolid* s_bgobeamvneg =
new G4SubtractionSolid(
"s_bgobeamvneg", s_bgobeamv_a, s_bgobeamv_b, 0, G4ThreeVector(0, -dw_tpcbeam, 0));
588 G4VSolid* s_bgobeamv =
new G4UnionSolid(
"s_bgobeamv", s_bgobeamvpos, s_bgobeamvneg, 0, G4ThreeVector(0, -2.*dy_tpcbeam, 0));
589 G4LogicalVolume* l_bgobeamv =
new G4LogicalVolume(s_bgobeamv,
geometry::Materials::get(
"FG_Epoxy") ,
"l_bgobeamv", 0, 0);
591 for (
double xbgoBeamv : activeParams.getArray(
"xbgoBeamv", {0})) {
592 xbgoBeamv *= CLHEP::cm;
593 xbgobeamv[xdimbgobeamv] = xbgoBeamv;
596 for (
double ybgoBeamv : activeParams.getArray(
"ybgoBeamv", {0})) {
597 ybgoBeamv *= CLHEP::cm;
598 ybgobeamv[ydimbgobeamv] = ybgoBeamv - y_offset;
601 for (
double zbgoBeamv : activeParams.getArray(
"zbgoBeamv", {0})) {
602 zbgoBeamv *= CLHEP::cm;
603 zbgobeamv[zdimbgobeamv] = zbgoBeamv ;
606 for (
int i = 0; i < xdimbgobeamv; i++) {
607 PH1SUSTRpos = G4ThreeVector(xbgobeamv[i], ybgobeamv[i], zbgobeamv[i]);
608 new G4PVPlacement(rotX, PH1SUSTRpos, l_bgobeamv, TString::Format(
"p_bgobeamv_%d", i).Data(), &topVolume,
false, 0);
611 G4double dz_bgobeamh = activeParams.getLength(
"lbgoBeamh") * CLHEP::cm / 2.;
612 G4VSolid* s_bgobeamh_a =
new G4Box(
"s_bgobeamh_a", dx_tpcbeam, dy_tpcbeam, dz_bgobeamh);
613 G4VSolid* s_bgobeamh_b =
new G4Box(
"s_bgobeamh_b", dx_tpcbeam - 2.*dw_tpcbeam, dy_tpcbeam - dw_tpcbeam, dz_bgobeamh);
614 G4VSolid* s_bgobeamhpos =
new G4SubtractionSolid(
"s_bgobeamhpos", s_bgobeamh_a, s_bgobeamh_b, 0, G4ThreeVector(0, dw_tpcbeam, 0));
615 G4VSolid* s_bgobeamhneg =
new G4SubtractionSolid(
"s_bgobeamhneg", s_bgobeamh_a, s_bgobeamh_b, 0, G4ThreeVector(0, -dw_tpcbeam, 0));
616 G4VSolid* s_bgobeamh =
new G4UnionSolid(
"s_bgobeamh", s_bgobeamhpos, s_bgobeamhneg, 0, G4ThreeVector(0, -2.*dy_tpcbeam, 0));
617 G4LogicalVolume* l_bgobeamh =
new G4LogicalVolume(s_bgobeamh,
geometry::Materials::get(
"FG_Epoxy") ,
"l_bgobeamh", 0, 0);
619 for (
double xbgoBeamh : activeParams.getArray(
"xbgoBeamh", {0})) {
620 xbgoBeamh *= CLHEP::cm;
621 xbgobeamh[xdimbgobeamh] = xbgoBeamh;
624 for (
double ybgoBeamh : activeParams.getArray(
"ybgoBeamh", {0})) {
625 ybgoBeamh *= CLHEP::cm;
626 ybgobeamh[ydimbgobeamh] = ybgoBeamh - y_offset;
629 for (
double zbgoBeamh : activeParams.getArray(
"zbgoBeamh", {0})) {
630 zbgoBeamh *= CLHEP::cm;
631 zbgobeamh[zdimbgobeamh] = zbgoBeamh ;
634 for (
int i = 0; i < xdimbgobeamh; i++) {
635 G4Transform3D transform = G4Translate3D(xbgobeamh[i], ybgobeamh[i],
636 zbgobeamh[i] + 2. * dy_tpcbeam) * G4RotateY3D(90.*CLHEP::deg) * G4RotateZ3D(90.*CLHEP::deg);
637 new G4PVPlacement(transform, l_bgobeamh, TString::Format(
"p_bgobeamh_%d", i).Data(), &topVolume,
false, 0);
640 G4double dz_bgobeamt = activeParams.getLength(
"lbgoBeamt") * CLHEP::cm / 2.;
641 G4VSolid* s_bgobeamt_a =
new G4Box(
"s_bgobeamt_a", dx_tpcbeam, dy_tpcbeam, dz_bgobeamt);
642 G4VSolid* s_bgobeamt_b =
new G4Box(
"s_bgobeamt_b", dx_tpcbeam - 2.*dw_tpcbeam, dy_tpcbeam - dw_tpcbeam, dz_bgobeamt);
643 G4VSolid* s_bgobeamt =
new G4SubtractionSolid(
"s_bgobeamt", s_bgobeamt_a, s_bgobeamt_b, 0, G4ThreeVector(0, dw_tpcbeam, 0));
644 G4LogicalVolume* l_bgobeamt =
new G4LogicalVolume(s_bgobeamt,
geometry::Materials::get(
"FG_Epoxy") ,
"l_bgobeamt", 0, 0);
646 for (
double xbgoBeamt : activeParams.getArray(
"xbgoBeamt", {0})) {
647 xbgoBeamt *= CLHEP::cm;
648 xbgobeamt[xdimbgobeamt] = xbgoBeamt;
651 for (
double ybgoBeamt : activeParams.getArray(
"ybgoBeamt", {0})) {
652 ybgoBeamt *= CLHEP::cm;
653 ybgobeamt[ydimbgobeamt] = ybgoBeamt - y_offset;
656 for (
double zbgoBeamt : activeParams.getArray(
"zbgoBeamt", {0})) {
657 zbgoBeamt *= CLHEP::cm;
658 zbgobeamt[zdimbgobeamt] = zbgoBeamt ;
661 for (
int i = 0; i < xdimbgobeamt; i++) {
662 PH1SUSTRpos = G4ThreeVector(xbgobeamt[i], ybgobeamt[i], zbgobeamt[i]);
663 new G4PVPlacement(0, PH1SUSTRpos, l_bgobeamt, TString::Format(
"p_bgobeamt_%d", i).Data(), &topVolume,
false, 0);
666 G4double dz_bgobeamb = activeParams.getLength(
"lbgoBeamb") * CLHEP::cm / 2.;
667 G4VSolid* s_bgobeamb_a =
new G4Box(
"s_bgobeamb_a", dx_tpcbeam, dy_tpcbeam, dz_bgobeamb);
668 G4VSolid* s_bgobeamb_b =
new G4Box(
"s_bgobeamb_b", dx_tpcbeam - 2.*dw_tpcbeam, dy_tpcbeam - dw_tpcbeam, dz_bgobeamb);
669 G4VSolid* s_bgobeambpos =
new G4SubtractionSolid(
"s_bgobeambpos", s_bgobeamb_a, s_bgobeamb_b, 0, G4ThreeVector(0, dw_tpcbeam, 0));
670 G4VSolid* s_bgobeambneg =
new G4SubtractionSolid(
"s_bgobeambneg", s_bgobeamb_a, s_bgobeamb_b, 0, G4ThreeVector(0, -dw_tpcbeam, 0));
671 G4VSolid* s_bgobeamb =
new G4UnionSolid(
"s_bgobeamb", s_bgobeambpos, s_bgobeambneg, 0, G4ThreeVector(0, -2.*dy_tpcbeam, 0));
672 G4LogicalVolume* l_bgobeamb =
new G4LogicalVolume(s_bgobeamb,
geometry::Materials::get(
"FG_Epoxy") ,
"l_bgobeamb", 0, 0);
673 for (
double xbgoBeamb : activeParams.getArray(
"xbgoBeamb", {0})) {
674 xbgoBeamb *= CLHEP::cm;
675 xbgobeamb[xdimbgobeamb] = xbgoBeamb - x_offset;
678 for (
double ybgoBeamb : activeParams.getArray(
"ybgoBeamb", {0})) {
679 ybgoBeamb *= CLHEP::cm;
680 ybgobeamb[ydimbgobeamb] = ybgoBeamb - y_offset;
683 for (
double zbgoBeamb : activeParams.getArray(
"zbgoBeamb", {0})) {
684 zbgoBeamb *= CLHEP::cm;
685 zbgobeamb[zdimbgobeamb] = zbgoBeamb ;
688 for (
int i = 0; i < xdimbgobeamb; i++) {
689 G4Transform3D transform = G4Translate3D(xbgobeamb[i], ybgobeamb[i],
690 zbgobeamb[i] + 2. * dy_tpcbeam) * G4RotateY3D(90.*CLHEP::deg) * G4RotateZ3D(90.*CLHEP::deg);
691 new G4PVPlacement(transform, l_bgobeamb, TString::Format(
"p_bgobeamb_%d", i).Data(), &topVolume,
false, 1);
694 G4double dz_tpcbeamb = activeParams.getLength(
"ltpcBeamb") * CLHEP::cm / 2.;
695 G4VSolid* s_tpcbeamb_a =
new G4Box(
"s_tpcbeamb_a", dx_tpcbeam, dy_tpcbeam, dz_tpcbeamb);
696 G4VSolid* s_tpcbeamb_b =
new G4Box(
"s_tpcbeamb_b", dx_tpcbeam - 2.*dw_tpcbeam, dy_tpcbeam - dw_tpcbeam, dz_tpcbeamb);
697 G4VSolid* s_tpcbeambpos =
new G4SubtractionSolid(
"s_tpcbeambpos", s_tpcbeamb_a, s_tpcbeamb_b, 0, G4ThreeVector(0, dw_tpcbeam, 0));
698 G4VSolid* s_tpcbeambneg =
new G4SubtractionSolid(
"s_tpcbeambneg", s_tpcbeamb_a, s_tpcbeamb_b, 0, G4ThreeVector(0, -dw_tpcbeam, 0));
699 G4VSolid* s_tpcbeamb =
new G4UnionSolid(
"s_tpcbeamb", s_tpcbeambpos, s_tpcbeambneg, 0, G4ThreeVector(0, -2.*dy_tpcbeam, 0));
700 G4LogicalVolume* l_tpcbeamb =
new G4LogicalVolume(s_tpcbeamb,
geometry::Materials::get(
"FG_Epoxy") ,
"l_tpcbeamb", 0, 0);
701 for (
double xtpcBeamb : activeParams.getArray(
"xtpcBeamb", {0})) {
702 xtpcBeamb *= CLHEP::cm;
703 xtpcbeamb[xdimtpcbeamb] = xtpcBeamb - x_offset;
706 for (
double ytpcBeamb : activeParams.getArray(
"ytpcBeamb", {0})) {
707 ytpcBeamb *= CLHEP::cm;
708 ytpcbeamb[ydimtpcbeamb] = ytpcBeamb - y_offset;
711 for (
double ztpcBeamb : activeParams.getArray(
"ztpcBeamb", {0})) {
712 ztpcBeamb *= CLHEP::cm;
713 ztpcbeamb[zdimtpcbeamb] = ztpcBeamb ;
716 for (
int i = 0; i < xdimtpcbeamb; i++) {
717 G4Transform3D transform = G4Translate3D(xtpcbeamb[i], ytpcbeamb[i],
718 ztpcbeamb[i] + 2. * dy_tpcbeam) * G4RotateY3D(90.*CLHEP::deg) * G4RotateZ3D(90.*CLHEP::deg);
719 new G4PVPlacement(transform, l_tpcbeamb, TString::Format(
"p_tpcbeamb_%d", i).Data(), &topVolume,
false, 1);
784 G4double dz_fangsbeamhf = activeParams.getLength(
"lfangsBeamhf") * CLHEP::cm / 2.;
785 G4VSolid* s_fangsbeamhf_a =
new G4Box(
"s_fangsbeamhf_a", dx_tpcbeam, dy_tpcbeam, dz_fangsbeamhf);
786 G4VSolid* s_fangsbeamhf_b =
new G4Box(
"s_fangsbeamhf_b", dx_tpcbeam - 2.*dw_tpcbeam, dy_tpcbeam - dw_tpcbeam, dz_fangsbeamhf);
787 G4VSolid* s_fangsbeamhf =
new G4SubtractionSolid(
"s_fangsbeamhf", s_fangsbeamhf_a, s_fangsbeamhf_b, 0, G4ThreeVector(0, dw_tpcbeam,
789 G4LogicalVolume* l_fangsbeamhf =
new G4LogicalVolume(s_fangsbeamhf,
geometry::Materials::get(
"FG_Epoxy") ,
"l_fangsbeamhf", 0, 0);
790 double xfangsbeamhf = activeParams.getLength(
"xfangsBeamhf") * CLHEP::cm;
791 double yfangsbeamhf = activeParams.getLength(
"yfangsBeamhf") * CLHEP::cm;
792 double zfangsbeamhf = activeParams.getLength(
"zfangsBeamhf") * CLHEP::cm;
793 PH1SUSTRpos = G4ThreeVector(xfangsbeamhf, yfangsbeamhf, zfangsbeamhf);
794 new G4PVPlacement(rotY, PH1SUSTRpos, l_fangsbeamhf,
"p_fangsbeamhf", &topVolume,
false, 0);
796 G4double dz_fangsbeamhb = activeParams.getLength(
"lfangsBeamhb") * CLHEP::cm / 2.;
797 G4VSolid* s_fangsbeamhb_a =
new G4Box(
"s_fangsbeamhb_a", dx_tpcbeam, dy_tpcbeam, dz_fangsbeamhb);
798 G4VSolid* s_fangsbeamhb_b =
new G4Box(
"s_fangsbeamhb_b", dx_tpcbeam - 2.*dw_tpcbeam, dy_tpcbeam - dw_tpcbeam, dz_fangsbeamhb);
799 G4VSolid* s_fangsbeamhbpos =
new G4SubtractionSolid(
"s_fangsbeamhbpos", s_fangsbeamhb_a, s_fangsbeamhb_b, 0, G4ThreeVector(0,
801 G4VSolid* s_fangsbeamhbneg =
new G4SubtractionSolid(
"s_fangsbeamhbneg", s_fangsbeamhb_a, s_fangsbeamhb_b, 0, G4ThreeVector(0,
803 G4VSolid* s_fangsbeamhb =
new G4UnionSolid(
"s_fangsbeamhb", s_fangsbeamhbpos, s_fangsbeamhbneg, 0, G4ThreeVector(0, -2.*dy_tpcbeam,
805 G4LogicalVolume* l_fangsbeamhb =
new G4LogicalVolume(s_fangsbeamhb,
geometry::Materials::get(
"FG_Epoxy") ,
"l_fangsbeamhb", 0, 0);
806 double xfangsbeamhb = activeParams.getLength(
"xfangsBeamhb") * CLHEP::cm;
807 double yfangsbeamhb = activeParams.getLength(
"yfangsBeamhb") * CLHEP::cm;
808 double zfangsbeamhb = activeParams.getLength(
"zfangsBeamhb") * CLHEP::cm;
809 TransForm = G4Translate3D(xfangsbeamhb, yfangsbeamhb, zfangsbeamhb) * G4RotateY3D(90.*CLHEP::deg);
810 new G4PVPlacement(TransForm, l_fangsbeamhb,
"p_fangsbeamhb", &topVolume,
false, 1);