diff --git a/compact/LGC.xml b/compact/LGC.xml index c2fb7e4fc8a35b98faf653a481e3de532ffee41e..73286c1778e4c5785da92dd7ead22b7c0a690f2f 100644 --- a/compact/LGC.xml +++ b/compact/LGC.xml @@ -190,7 +190,7 @@ <rotation x="65*degree" y="0" z="0" /> <comment> TODO: implement PMT material layers </comment> <pmt_array dx="16*cm" dy="16*cm" sensitive="yes" vis="LGCPMTVis" /> - <cone thickness="4*mm" rmin="7.0*cm" rmax="21.5*cm" length="30.*cm" vis="LGCConeVis" /> + <cone shape="cone" thickness="4*mm" rmin="7.0*cm" rmax="21.5*cm" length="30.*cm" vis="LGCConeVis" /> <shield material="Lead" thickness="1.*cm" radius="11.53*cm" length="8.*cm" shift_z="1.5*cm" vis="LGCShieldVis" /> </winston_cone> diff --git a/src/GasCherenkov_geo.cpp b/src/GasCherenkov_geo.cpp index 7af0cb0f1444c7d6447aba70dd24f9f5008029d8..04216d434faf16a918e5515638772f4aaccc3bba 100644 --- a/src/GasCherenkov_geo.cpp +++ b/src/GasCherenkov_geo.cpp @@ -8,7 +8,7 @@ #include "DDRec/Surface.h" #include <XML/Helper.h> -#include "TMath.h" +#include <fmt/core.h> using namespace dd4hep; using namespace dd4hep::rec; @@ -181,12 +181,24 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec double cone_length = x_cone.length(); double cone_radius1 = x_cone.rmin(); double cone_radius2 = x_cone.rmax(); - + auto cone_shape = x_cone.attr<std::string>(_Unicode(shape)); + + Volume v_winston_cone("v_winston_cone"); + if (cone_shape == "paraboloid") { + Paraboloid winston_cone1(cone_radius1 + cone_thickness, cone_radius2 + cone_thickness, cone_length / 2.0 ); + Paraboloid winston_cone2(cone_radius1, cone_radius2, cone_length / 2.0 + 0.1*mm ); + SubtractionSolid winston_cone_solid(winston_cone1, winston_cone2); + v_winston_cone.setSolid(winston_cone_solid); + } else if (cone_shape == "cone") { + Cone winston_cone_solid(cone_length/2., cone_radius1, cone_radius1 + cone_thickness, cone_radius2, cone_radius2 + cone_thickness); + v_winston_cone.setSolid(winston_cone_solid); + } else { + printout(ERROR, "SoLID_GasCherenkov", + fmt::format("Unknown shape {} for the winston cone, please use (Paraboloid, Cone).", cone_shape)); + throw std::runtime_error("Failed to build winston cone solid for SoLID_GasCherenkov"); + } + v_winston_cone.setMaterial(winston_mat); DetElement de_winston_cone(det, "de_winston_cone", 1); - Paraboloid winston_cone1(cone_radius1 + cone_thickness, cone_radius2 + cone_thickness, cone_length / 2.0 ); - Paraboloid winston_cone2(cone_radius1, cone_radius2, cone_length / 2.0 + 0.1*mm ); - SubtractionSolid winston_cone_solid(winston_cone1, winston_cone2); - Volume v_winston_cone("v_winston_cone", winston_cone_solid, winston_mat); PlacedVolume pv_winston_cone = winston_assem.placeVolume(v_winston_cone, Position(0., 0., (cone_length + pmt_dz)/2.)); de_winston_cone.setPlacement(pv_winston_cone); v_winston_cone.setVisAttributes(desc, x_cone.attr<std::string>(_Unicode(vis)));