7 #include <phparameter/PHParameters.h>
19 #include <Geant4/G4Box.hh>
20 #include <Geant4/G4Colour.hh>
21 #include <Geant4/G4DisplacedSolid.hh>
22 #include <Geant4/G4LogicalVolume.hh>
23 #include <Geant4/G4Material.hh>
24 #include <Geant4/G4PVPlacement.hh>
25 #include <Geant4/G4PhysicalConstants.hh>
26 #include <Geant4/G4String.hh>
27 #include <Geant4/G4SubtractionSolid.hh>
28 #include <Geant4/G4SystemOfUnits.hh>
29 #include <Geant4/G4ThreeVector.hh>
30 #include <Geant4/G4Transform3D.hh>
31 #include <Geant4/G4Trap.hh>
32 #include <Geant4/G4Tubs.hh>
33 #include <Geant4/G4Types.hh>
34 #include <Geant4/G4UserLimits.hh>
35 #include <Geant4/G4Vector3D.hh>
36 #include <Geant4/G4VisAttributes.hh>
38 #include <boost/foreach.hpp>
60 , construction_params(parameters)
61 , cylinder_solid(nullptr)
62 , cylinder_logic(nullptr)
63 , cylinder_physi(nullptr)
69 , clading_step_limits(nullptr)
70 , fiber_core_step_limits(nullptr)
118 "PHCompositeNode",
"RUN"));
146 "z_rotation_degree") *
152 "enclosure_x_shift") *
177 cylinder_solid =
new G4DisplacedSolid(G4String(
GetName() +
"_displaced"),
179 G4ThreeVector(box_x_shift, 0, box_z_shift));
181 G4Material* cylinder_mat = G4Material::GetMaterial(
"G4_AIR");
184 cylinder_logic =
new G4LogicalVolume(cylinder_solid, cylinder_mat,
186 G4VisAttributes* VisAtt =
new G4VisAttributes();
187 VisAtt->SetColour(G4Colour::White());
188 VisAtt->SetVisibility(
true);
189 VisAtt->SetForceSolid(
false);
190 VisAtt->SetForceWireframe(
true);
193 G4Transform3D cylinder_place(
196 * G4RotateZ3D(z_rotation)
206 G4LogicalVolume* sec_logic = psec.first;
207 const G4Transform3D& sec_trans = psec.second;
210 const int sec = val.first;
211 const double rot = val.second;
213 G4Transform3D sec_place = G4RotateZ3D(rot) * sec_trans;
216 name <<
GetName() <<
"_sec" << sec;
218 G4PVPlacement* calo_phys =
new G4PVPlacement(sec_place, sec_logic,
227 "electronics_thickness") *
230 "electronics_material");
232 G4VSolid* electronics_solid =
new G4Box(G4String(
GetName()),
233 electronics_thickness / 2.0,
239 electronics_solid =
new G4DisplacedSolid(G4String(
GetName() +
"_displaced"),
246 electronics_thickness,
249 G4Material* electronics_mat = G4Material::GetMaterial(electronics_material);
252 G4LogicalVolume* electronics_logic =
new G4LogicalVolume(electronics_solid,
253 electronics_mat, G4String(
GetName()) +
"_Electronics", 0, 0, 0);
254 VisAtt =
new G4VisAttributes();
256 VisAtt->SetVisibility(
true);
258 electronics_logic->SetVisAttributes(VisAtt);
260 new G4PVPlacement(G4Transform3D::Identity, electronics_logic,
266 "enclosure_thickness") *
269 "enclosure_material");
271 G4VSolid* outer_enclosur_solid =
new G4Box(
272 G4String(
GetName()) +
"_outer_enclosur_solid", enclosure_x * 0.5,
275 G4VSolid* inner_enclosur_solid =
new G4Box(
276 G4String(
GetName()) +
"_inner_enclosur_solid",
277 enclosure_x * 0.5 - enclosure_thickness,
278 enclosure_y * 0.5 - enclosure_thickness,
279 enclosure_z * 0.5 - enclosure_thickness);
280 G4VSolid* enclosure_solid =
new G4SubtractionSolid(
281 G4String(
GetName()) +
"_enclosure_solid",
282 outer_enclosur_solid, inner_enclosur_solid);
283 enclosure_solid =
new G4DisplacedSolid(
284 G4String(
GetName() +
"_enclosure_solid_displaced"), enclosure_solid, 0,
285 G4ThreeVector(box_x_shift, 0, box_z_shift));
287 G4Material* enclosure_mat = G4Material::GetMaterial(enclosure_material);
290 G4LogicalVolume* enclosure_logic =
new G4LogicalVolume(enclosure_solid,
291 enclosure_mat, G4String(
GetName()) +
"_enclosure", 0, 0, 0);
292 VisAtt =
new G4VisAttributes();
294 VisAtt->SetVisibility(
true);
296 enclosure_logic->SetVisAttributes(VisAtt);
298 new G4PVPlacement(G4Transform3D::Identity, enclosure_logic,
304 ostringstream geonode;
323 geonode.str(),
"PHObject");
332 cout <<
"PHG4SpacalPrototype4Detector::Construct::" <<
GetName()
333 <<
" - Print Layer Geometry:" << endl;
340 ostringstream geonode;
347 geonode <<
"CYLINDERGEOM_ABSORBER_" <<
detector_type <<
"_" << 0;
366 cout <<
"PHG4SpacalPrototype4Detector::Construct::" <<
GetName()
367 <<
" - Print Absorber Layer Geometry:" << endl;
374 cout <<
"PHG4SpacalPrototype4Detector::Construct::" <<
GetName()
375 <<
" - Completed. Print G4 Geometry:" << endl;
377 cout <<
"box_x_shift = " << box_x_shift << endl;
378 cout <<
"box_z_shift = " << box_z_shift << endl;
382 std::pair<G4LogicalVolume*, G4Transform3D>
389 const G4double half_chord_backend =
392 const G4double reduced_outer_radius = sqrt(pow(
_geom->
get_max_radius() *
cm, 2) - half_chord_backend * half_chord_backend);
393 const G4double enclosure_depth = reduced_outer_radius -
_geom->
get_radius() *
cm;
400 const G4double center_adj = (width_adj1 + width_adj2) * 0.5;
401 const G4double center_tilt_angle = atan2(center_adj, enclosure_depth * 0.5);
402 const G4double inner_half_width = enclosure_half_height_half_width + 0.5 * (width_adj1 - width_adj2);
403 const G4double outter_half_width = enclosure_half_height_half_width + 0.5 * (-width_adj1 + width_adj2);
406 const G4double edge1_tilt_angle = atan2(width_adj1, enclosure_depth * 0.5);
407 const G4double edge2_tilt_angle = atan2(width_adj2, enclosure_depth * 0.5);
412 const G4double half_projection_ratio = 0.5 * (-width_adj1 + width_adj2) / enclosure_half_height_half_width;
413 const G4double projection_center_y = enclosure_center - ((enclosure_depth * 0.5) / half_projection_ratio);
414 const G4double projection_center_x = center_adj / half_projection_ratio;
418 assert(phi_bin_in_sec >= 1);
419 const G4double block_azimuth_angle = (edge2_tilt_angle - edge1_tilt_angle) / phi_bin_in_sec;
420 assert(block_azimuth_angle > 0);
421 if (!(fabs(block_azimuth_angle - M_PI * 2 /
_geom->
get_azimuthal_n_sec() / phi_bin_in_sec) < M_PI * numeric_limits<G4double>::epsilon()))
423 cout <<
"angle/nsec out of range: " << M_PI * numeric_limits<G4double>::epsilon() << endl;
428 G4double block_width_ratio = 0;
429 for (
int s = 0;
s < phi_bin_in_sec; ++
s)
431 block_width_ratio += 1 / cos(block_azimuth_angle * (0.5 +
s) + edge1_tilt_angle);
433 const G4double block_half_height_width = (block_edge1_half_width + block_edge2_half_width) / block_width_ratio;
434 assert(block_half_height_width > 0);
438 struct block_azimuth_geom
441 G4double projection_center_y;
442 G4double projection_center_x;
443 G4double projection_length;
445 vector<block_azimuth_geom> block_azimuth_geoms(phi_bin_in_sec,
447 numeric_limits<double>::signaling_NaN(),
448 numeric_limits<double>::signaling_NaN(),
449 numeric_limits<double>::signaling_NaN(),
450 numeric_limits<double>::signaling_NaN()});
451 G4double block_x_edge1 = block_edge1_half_width;
452 for (
int s = 0;
s < phi_bin_in_sec; ++
s)
454 block_azimuth_geom& geom = block_azimuth_geoms[
s];
456 geom.angle = block_azimuth_angle * (0.5 +
s) + edge1_tilt_angle;
457 const G4double block_x_size = block_half_height_width / cos(geom.angle);
459 const G4double x_center = block_x_edge1 - 0.5 * block_x_size;
462 geom.projection_length = block_half_height_width / 2. / tan(block_azimuth_angle / 2.);
463 assert(geom.projection_length > 0);
464 geom.projection_center_y = enclosure_center - geom.projection_length * cos(geom.angle);
465 geom.projection_center_x = x_center + geom.projection_length * sin(geom.angle);
468 block_x_edge1 -= block_x_size;
472 struct block_divider_azimuth_geom
475 G4double projection_center_y;
476 G4double projection_center_x;
478 G4double radial_displacement;
481 assert(phi_bin_in_sec >= 1);
482 vector<block_divider_azimuth_geom> divider_azimuth_geoms(phi_bin_in_sec - 1,
483 block_divider_azimuth_geom{
484 numeric_limits<double>::signaling_NaN(),
485 numeric_limits<double>::signaling_NaN(),
486 numeric_limits<double>::signaling_NaN(),
487 numeric_limits<double>::signaling_NaN(),
488 numeric_limits<double>::signaling_NaN(),
489 numeric_limits<double>::signaling_NaN()});
493 for (
int s = 0;
s < phi_bin_in_sec - 1; ++
s)
495 block_divider_azimuth_geom& geom = divider_azimuth_geoms[
s];
497 geom.angle = 0.5 * (block_azimuth_geoms[
s].angle + block_azimuth_geoms[
s + 1].angle);
498 geom.projection_center_y = 0.5 * (block_azimuth_geoms[
s].projection_center_y + block_azimuth_geoms[
s + 1].projection_center_y);
499 geom.projection_center_x = 0.5 * (block_azimuth_geoms[
s].projection_center_x + block_azimuth_geoms[
s + 1].projection_center_x);
500 geom.radial_displacement = 0.5 * (block_azimuth_geoms[
s].projection_length + block_azimuth_geoms[
s + 1].projection_length);
509 cout <<
"PHG4SpacalPrototype4Detector::Construct_AzimuthalSeg - ERROR - " << endl
510 <<
"\t block_x_edge1 = " << block_x_edge1 << endl
511 <<
"\t block_edge2_half_width = " << block_edge2_half_width << endl
512 <<
"\t fabs(block_x_edge1 - (-block_edge2_half_width)) = " << fabs(block_x_edge1 - (-block_edge2_half_width)) << endl
517 cout <<
"PHG4SpacalPrototype4Detector::Construct_AzimuthalSeg - ERROR - closure check failed: " << fabs(block_x_edge1 - (-block_edge2_half_width)) << endl;
523 cout <<
"PHG4SpacalPrototype4Detector::Construct_AzimuthalSeg - " << endl
524 <<
"\t edge1_tilt_angle = " << edge1_tilt_angle << endl
525 <<
"\t edge2_tilt_angle = " << edge2_tilt_angle << endl
526 <<
"\t projection_center_y = " << projection_center_y << endl
527 <<
"\t projection_center_x = " << projection_center_x << endl
528 <<
"\t block_azimuth_angle = " << block_azimuth_angle << endl
529 <<
"\t block_edge1_half_width = " << block_edge1_half_width << endl
530 <<
"\t block_edge2_half_width = " << block_edge2_half_width << endl
531 <<
"\t block_width_ratio = " << block_width_ratio << endl
532 <<
"\t block_half_height_width = " << block_half_height_width << endl;
534 for (
int s = 0;
s < phi_bin_in_sec; ++
s)
536 cout <<
"\t block[" <<
s <<
"].angle = " << block_azimuth_geoms[
s].angle << endl;
537 cout <<
"\t block[" <<
s <<
"].projection_center_y = " << block_azimuth_geoms[
s].projection_center_y << endl;
538 cout <<
"\t block[" <<
s <<
"].projection_center_x = " << block_azimuth_geoms[
s].projection_center_x << endl;
540 for (
int s = 0;
s < phi_bin_in_sec - 1; ++
s)
542 cout <<
"\t divider[" <<
s <<
"].angle = " << divider_azimuth_geoms[
s].angle << endl;
543 cout <<
"\t divider[" <<
s <<
"].projection_center_x = " << divider_azimuth_geoms[
s].projection_center_x << endl;
544 cout <<
"\t divider[" <<
s <<
"].projection_center_y = " << divider_azimuth_geoms[
s].projection_center_y << endl;
545 cout <<
"\t divider[" <<
s <<
"].radial_displacement = " << divider_azimuth_geoms[
s].radial_displacement << endl;
546 cout <<
"\t divider[" <<
s <<
"].thickness = " << divider_azimuth_geoms[
s].thickness << endl;
547 cout <<
"\t divider[" <<
s <<
"].width = " << divider_azimuth_geoms[
s].width << endl;
553 G4VSolid* sec_solid =
new G4Trap(
554 G4String(
GetName() +
string(
"_sec_trap")),
555 enclosure_depth * 0.5,
556 center_tilt_angle, halfpi,
563 G4Transform3D sec_solid_transform =
564 G4TranslateZ3D(box_z_shift) * G4TranslateY3D(enclosure_center) * G4RotateY3D(halfpi) * G4RotateX3D(-halfpi);
565 G4VSolid* sec_solid_place =
new G4DisplacedSolid(
566 G4String(
GetName() +
string(
"_sec")), sec_solid, sec_solid_transform);
568 G4Material* cylinder_mat = G4Material::GetMaterial(
"G4_AIR");
571 G4LogicalVolume* sec_logic =
new G4LogicalVolume(sec_solid_place, cylinder_mat,
572 G4String(G4String(
GetName() +
string(
"_sec"))), 0, 0,
nullptr);
574 G4VisAttributes* VisAtt =
new G4VisAttributes();
575 VisAtt->SetColor(.5, .9, .5, .1);
576 VisAtt->SetVisibility(
true);
577 VisAtt->SetForceSolid(
false);
578 VisAtt->SetForceWireframe(
true);
579 sec_logic->SetVisAttributes(VisAtt);
765 const int tower_id = g_tower.
id;
766 const int tower_phi_id_in_sec = tower_id % 10;
767 assert(tower_phi_id_in_sec >= 0);
768 assert(tower_phi_id_in_sec < phi_bin_in_sec);
770 const auto& block_azimuth_geom = block_azimuth_geoms.at(tower_phi_id_in_sec);
774 G4Transform3D block_trans =
775 G4TranslateX3D(block_azimuth_geom.projection_center_x) *
776 G4TranslateY3D(block_azimuth_geom.projection_center_y) *
777 G4RotateZ3D(block_azimuth_geom.angle) *
785 G4PVPlacement* block_phys =
new G4PVPlacement(block_trans, LV_tower,
787 g_tower.
id, overlapcheck_block);
796 for (
int ix = 0; ix < g_tower.
NSubtowerX; ix++)
799 for (
int iy = 0; iy < g_tower.
NSubtowerY; iy++)
805 G4PVPlacement* lg_phys =
new G4PVPlacement(block_trans, LV_lg, LV_lg->GetName(),
806 sec_logic,
false, g_tower.
id, overlapcheck_block);
808 block_vol[lg_phys] = g_tower.
id * 100 + ix * 10 + iy;
817 cout <<
"PHG4SpacalPrototype4Detector::Construct_AzimuthalSeg::" <<
GetName()
819 <<
" unique towers" << endl;
821 return make_pair(sec_logic, G4Transform3D::Identity);
828 G4Tubs* fiber_solid =
new G4Tubs(G4String(
GetName() +
string(
"_fiber") +
id),
831 G4Material* clading_mat = G4Material::GetMaterial(
835 G4LogicalVolume* fiber_logic =
new G4LogicalVolume(fiber_solid, clading_mat,
836 G4String(G4String(
GetName() +
string(
"_fiber") +
id)), 0, 0,
840 G4VisAttributes* VisAtt =
new G4VisAttributes();
844 fiber_logic->SetVisAttributes(VisAtt);
847 G4Tubs* core_solid =
new G4Tubs(
848 G4String(
GetName() +
string(
"_fiber_core") +
id), 0,
854 G4LogicalVolume* core_logic =
new G4LogicalVolume(core_solid, core_mat,
855 G4String(G4String(
GetName() +
string(
"_fiber_core") +
id)), 0, 0,
859 G4VisAttributes* VisAtt =
new G4VisAttributes();
861 VisAtt->SetVisibility(
false);
862 VisAtt->SetForceSolid(
false);
863 core_logic->SetVisAttributes(VisAtt);
867 G4PVPlacement* core_physi =
new G4PVPlacement(0, G4ThreeVector(), core_logic,
868 G4String(G4String(
GetName() +
string(
"_fiber_core") +
id)), fiber_logic,
869 false, 0, overlapcheck_fiber);
879 cout <<
"PHG4SpacalPrototype4Detector::Print::" <<
GetName()
880 <<
" - Print Geometry:" << endl;
889 G4LogicalVolume* LV_tower)
897 typedef map<int, pair<G4Vector3D, G4Vector3D> > fiber_par_map;
898 fiber_par_map fiber_par;
899 G4double min_fiber_length = g_tower.
pDz *
cm * 4;
901 G4Vector3D v_zshift = G4Vector3D(tan(g_tower.
pTheta) * cos(g_tower.
pPhi),
905 for (
int ix = 0; ix < g_tower.
NFiberX; ix++)
908 const double weighted_ix =
static_cast<double>(ix) / (g_tower.
NFiberX - 1.);
916 for (
int iy = 0; iy < g_tower.
NFiberY; iy++)
919 if ((ix + iy) % 2 == 1)
922 const double weighted_iy =
static_cast<double>(iy) / (g_tower.
NFiberY - 1.);
927 const double weighted_pDx12 = weighted_pDx1 * (1 - weighted_iy) + weighted_pDx2 * (weighted_iy) + weighted_pDy1 * tan(g_tower.
pAlp1);
928 const double weighted_pDx34 = weighted_pDx3 * (1 - weighted_iy) + weighted_pDx4 * (weighted_iy) + weighted_pDy1 * tan(g_tower.
pAlp2);
930 G4Vector3D
v1 = G4Vector3D(weighted_pDx12, weighted_pDy1, 0) - v_zshift;
931 G4Vector3D
v2 = G4Vector3D(weighted_pDx34, weighted_pDy2, 0) + v_zshift;
933 G4Vector3D vector_fiber = (v2 -
v1);
935 G4Vector3D center_fiber = (v2 +
v1) / 2;
942 fiber_par[fiber_ID] = make_pair(vector_fiber, center_fiber);
944 const G4double fiber_length = vector_fiber.mag();
946 min_fiber_length =
min(fiber_length, min_fiber_length);
954 const G4double fiber_length = min_fiber_length;
955 vector<G4double> fiber_cut;
958 ss <<
string(
"_Tower") << g_tower.
id;
959 G4LogicalVolume* fiber_logic =
Construct_Fiber(fiber_length, ss.str());
963 const int fiber_ID = val.first;
964 G4Vector3D vector_fiber = val.second.first;
965 G4Vector3D center_fiber = val.second.second;
966 const G4double optimal_fiber_length = vector_fiber.mag();
968 const G4Vector3D
v1 = center_fiber - 0.5 * vector_fiber;
971 assert(optimal_fiber_length - fiber_length >= 0);
972 fiber_cut.push_back(optimal_fiber_length - fiber_length);
974 center_fiber += (fiber_length / optimal_fiber_length - 1) * 0.5 * vector_fiber;
975 vector_fiber *= fiber_length / optimal_fiber_length;
981 <<
"PHG4SpacalPrototype4Detector::Construct_Fibers_SameLengthFiberPerTower::"
982 <<
GetName() <<
" - constructed fiber " << fiber_ID << ss.str()
984 <<
", Length = " << optimal_fiber_length <<
"-"
985 << (optimal_fiber_length - fiber_length) <<
"mm, "
986 <<
"x = " << center_fiber.x() <<
"mm, "
987 <<
"y = " << center_fiber.y() <<
"mm, "
988 <<
"z = " << center_fiber.z() <<
"mm, "
989 <<
"vx = " << vector_fiber.x() <<
"mm, "
990 <<
"vy = " << vector_fiber.y() <<
"mm, "
991 <<
"vz = " << vector_fiber.z() <<
"mm, "
994 const G4double rotation_angle = G4Vector3D(0, 0, 1).angle(vector_fiber);
995 const G4Vector3D rotation_axis =
996 rotation_angle == 0 ? G4Vector3D(1, 0, 0) : G4Vector3D(0, 0, 1).cross(vector_fiber);
998 G4Transform3D fiber_place(
999 G4Translate3D(center_fiber.x(), center_fiber.y(), center_fiber.z()) * G4Rotate3D(rotation_angle, rotation_axis));
1006 G4PVPlacement* fiber_physi =
new G4PVPlacement(fiber_place, fiber_logic,
1007 G4String(name.str()), LV_tower,
false, fiber_ID,
1008 overlapcheck_fiber);
1016 <<
"PHG4SpacalPrototype4Detector::Construct_Fibers_SameLengthFiberPerTower::"
1017 <<
GetName() <<
" - constructed tower ID " << g_tower.
id <<
" with "
1018 << fiber_count <<
" fibers. Average fiber length cut = "
1019 << accumulate(fiber_cut.begin(), fiber_cut.end(), 0.0) / fiber_cut.size() <<
" mm" << endl;
1033 cout <<
"PHG4SpacalPrototype4Detector::Construct_Tower::" <<
GetName()
1034 <<
" - constructed tower ID " << g_tower.
id
1035 <<
" with geometry parameter: ";
1039 std::ostringstream sout;
1040 sout <<
"_" << g_tower.
id;
1041 const G4String sTowerID(sout.str());
1045 G4Trap* block_solid =
new G4Trap(
1046 G4String(
GetName()) + sTowerID,
1055 G4Material* cylinder_mat = G4Material::GetMaterial(
1059 G4LogicalVolume* block_logic =
new G4LogicalVolume(block_solid, cylinder_mat,
1060 G4String(G4String(
GetName()) +
string(
"_Tower") + sTowerID), 0, 0,
1063 G4VisAttributes* VisAtt =
new G4VisAttributes();
1065 VisAtt->SetColor(.3, .3, .3, .3);
1066 VisAtt->SetVisibility(
1069 block_logic->SetVisAttributes(VisAtt);
1073 int fiber_count = 0;
1078 cout <<
"PHG4SpacalPrototype4Detector::Construct_Tower::" <<
GetName()
1079 <<
" - constructed tower ID " << g_tower.
id <<
" with " << fiber_count
1080 <<
" fibers using Construct_Fibers_SameLengthFiberPerTower" << endl;
1088 const int index_x,
const int index_y)
1092 std::ostringstream sout;
1093 sout <<
"_Lightguide_" << g_tower.
id <<
"_" << index_x <<
"_" << index_y;
1094 const G4String sTowerID(sout.str());
1100 const double weight_x2 = 1 - (
double) (index_y + 1) / g_tower.
NSubtowerY;
1101 const double weight_xcenter = 1 - (
double) (index_y + 0.5) / g_tower.
NSubtowerY;
1103 assert(weight_x1 >= 0 and weight_x1 <= 1);
1104 assert(weight_x2 >= 0 and weight_x2 <= 1);
1105 assert(weight_xcenter >= 0 and weight_xcenter <= 1);
1107 const double lg_pDx1 = (g_tower.
pDx1 * weight_x1
1108 + g_tower.
pDx2 * (1 - weight_x1)) /
1110 const double lg_pDx2 = (g_tower.
pDx1 * weight_x2
1111 + g_tower.
pDx2 * (1 - weight_x2)) /
1114 const double lg_Alp1 = atan(
1117 const double shift_xcenter = (g_tower.
pDx1 * weight_xcenter
1118 + g_tower.
pDx2 * (1 - weight_xcenter))
1121 const double shift_ycenter = g_tower.
pDy1
1125 G4VSolid* block_solid =
new G4Trap(
1126 G4String(
GetName()) + sTowerID,
1133 lg_pDy1 * cm, lg_pDx1 * cm, lg_pDx2 * cm,
1137 block_solid =
new G4DisplacedSolid(G4String(
GetName() +
"_displaced"),
1140 tan(g_tower.
pTheta * rad) * cos(g_tower.
pPhi * rad),
1141 tan(g_tower.
pTheta * rad) * sin(g_tower.
pPhi * rad),
1145 + G4ThreeVector(shift_xcenter * cm, shift_ycenter * cm, 0)
1149 G4Material* cylinder_mat = G4Material::GetMaterial(
1153 G4LogicalVolume* block_logic =
new G4LogicalVolume(block_solid, cylinder_mat,
1154 G4String(G4String(
GetName()) +
string(
"_Tower") + sTowerID), 0, 0,
1157 G4VisAttributes* VisAtt =
new G4VisAttributes();
1160 VisAtt->SetVisibility(
1163 block_logic->SetVisAttributes(VisAtt);