From d442744e6f07f757351c0cd6ce234eb6b48fb20e Mon Sep 17 00:00:00 2001 From: Chao Peng <cpeng@anl.gov> Date: Fri, 17 May 2024 02:42:51 -0500 Subject: [PATCH] update LGC --- compact/LGC.xml | 14 +++++--- compact/optics.xml | 4 +-- src/GasCherenkov_geo.cpp | 69 +++++++++++++++++----------------------- 3 files changed, 42 insertions(+), 45 deletions(-) diff --git a/compact/LGC.xml b/compact/LGC.xml index 0eb3ddd..3fbee3f 100644 --- a/compact/LGC.xml +++ b/compact/LGC.xml @@ -19,7 +19,10 @@ vis="RedVis"> <placement x="0*cm" y="0*cm" z="260*cm" /> -<dimensions numsides="30" rmin="10*cm" rmax1="80*cm" rmax2="120*cm" zmin="20*cm" zmax="220*cm"/> +<dimensions numsides="30"> + <main rmin1="71*cm" rmax1="265*cm" rmin2="85*cm" rmax2="265*cm" length="155*cm" /> + <snout rmin1="58*cm" rmax1="127*cm" rmin2="58*cm" rmax2="144*cm" length="107*cm" /> +</dimensions> <radiator material="N2Optical"/> <comment> @@ -27,12 +30,12 @@ </comment> <mirrors> <support material="Copper"/> - <piece id="1" material="PyrexGlassOptical"> + <piece id="1" material="N2Optical" surface="MirrorOpticalSurface"> <dimensions radius="277.51*cm" length="114.53*cm" width1="16.26*cm" width2="36.03*cm" thickness="2.0*mm"/> <placement x="0*cm" y="129.9*cm" z="30.3125*cm"/> <rotation x="135.0*degree" y="180*degree" z="180*degree"/> </piece> - <piece id="2" material="PyrexGlassOptical"> + <piece id="2" material="PyrexGlassOptical" surface="MirrorOpticalSurface"> <dimensions radius="157.99*cm" length="59.260*cm" width1="37.06*cm" width2="45.95*cm" thickness="2.0*mm"/> <placement x="0*cm" y="211.411*cm" z="50.6678*cm"/> <rotation x="85.0*degree" y="180*degree" z="180*degree"/> @@ -42,13 +45,16 @@ <comment> Light Gas Cherenkov: Winston cones </comment> -<winston_cone material="PyrexGlassOptical"> +<winston_cone material="PyrexGlassOptical" surface="MirrorOpticalSurface"> <placement x="0*cm" y="255*cm" z="-40*cm"/> <rotation x="55.0*degree" y="0" z="0"/> <cone_dimensions thickness="4*mm" length="30.*cm" radius1="7.0*cm" radius2="21.0*cm"/> <cone_dimensions thickness="4*mm" length="30.*cm" radius1="7.0*cm" radius2="15.0*cm"/> <tube_dimensions radius="11.28*cm" length="30.*cm"/> </winston_cone> +<pmt_array surface="PMTOpticalSurface"> + <dimensions x="20*cm" y="20*cm"/> +</pmt_aarray> <comment> Light Gas Cherenkov End diff --git a/compact/optics.xml b/compact/optics.xml index 95a2c61..85cae59 100644 --- a/compact/optics.xml +++ b/compact/optics.xml @@ -45,7 +45,7 @@ </comment> - <matrix name= "REFLECTIVITY_LGCMirror" coldim="2" values=" + <matrix name= "REFLECTIVITY_Mirror" coldim="2" values=" 1.0*eV 0.8 4.0*eV 0.8 5.1*eV 0.8 @@ -147,7 +147,7 @@ </materials> <surfaces> <opticalsurface finish="polished" model="glisur" name="MirrorOpticalSurface" type="dielectric_metal" value="0"> - <property name="REFLECTIVITY" ref="REFLECTIVITY_LGCMirror"/> + <property name="REFLECTIVITY" ref="REFLECTIVITY_Mirror"/> <property name="RINDEX" coldim="2" values="1.034*eV 1.5 4.136*eV 1.5"/> <!--<property name="EFFICIENCY" ref="EFFICIENCY0x8b77240"/>--> </opticalsurface> diff --git a/src/GasCherenkov_geo.cpp b/src/GasCherenkov_geo.cpp index 57ea561..fe1d098 100644 --- a/src/GasCherenkov_geo.cpp +++ b/src/GasCherenkov_geo.cpp @@ -33,31 +33,15 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec sens.setType("tracker"); auto dims = x_det.dimensions(); - auto r0 = dims.rmin(); - auto r1 = dims.rmax1(); - auto r2 = dims.rmax2(); - auto zmin = dims.zmin(); - auto zmax = dims.zmax(); int nsec = dims.numsides(); + xml_dim_t dims_tank = dims.child(_Unicode(main)); + xml_dim_t dims_snout = dims.child(_Unicode(snout)); xml_dim_t x_place = x_det.child(_U(placement)); auto pos_x = x_place.x(); auto pos_y = x_place.y(); auto pos_z = x_place.z(); - double LGC_inner_radius1 = 71.0*cm; - double LGC_inner_radius2 = 85.0*cm; - double LGC_outer_radius1 = 265.0*cm; - double LGC_main_length = 105.0*cm; - double LGC_snout_length = 107.0*cm; - double LGC_snout_inner_radius1 = 58.0*cm; - double LGC_snout_inner_radius2 = LGC_inner_radius1; - double LGC_snout_outer_radius1 = 127.0*cm; - double LGC_snout_outer_radius2 = 144.0*cm; - double LGC_entrance_window_thickness = 0.05*mm; // something tells this might be 5 mil, not mm - double LGC_exit_window_thickness = 0.1*mm; // same here - double LGC_pmt_array_size = 20.0*cm; - // Everything that goes in the tank will be copies of the sector assembly volume Assembly v_sector("cherenkov_sector_1"); DetElement de_sector("de_sector" + std::to_string(1), 1); @@ -65,11 +49,9 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec // gas tank auto x_rad = x_det.child(_U(radiator)); auto rad_mat = desc.material(x_rad.attr<std::string>(_U(material))); - ConeSegment tank_main(0.5 * LGC_main_length, LGC_inner_radius1, LGC_outer_radius1, - LGC_inner_radius2, LGC_outer_radius1); - ConeSegment tank_snout(0.5 * LGC_snout_length, LGC_snout_inner_radius1, LGC_snout_outer_radius1, - LGC_snout_inner_radius2, LGC_snout_outer_radius2); - UnionSolid tank_solid(tank_main,tank_snout,Position(0, 0, -0.5 * LGC_main_length - 0.5 * LGC_snout_length)); + ConeSegment tank_main(dims_tank.length()/2., dims_tank.rmin1(), dims_tank.rmax1(), dims_tank.rmin2(), dims_tank.rmax2()); + ConeSegment tank_snout(dims_snout.length()/2., dims_snout.rmin1(), dims_snout.rmax1(), dims_snout.rmin2(), dims_snout.rmax2()); + UnionSolid tank_solid(tank_main,tank_snout,Position(0, 0, -(dims_tank.length() + dims_snout.length())/2.)); Volume v_tank("vol_gas_tank", tank_solid, rad_mat); v_tank.setVisAttributes(desc, dd4hep::getAttrOrDefault<std::string>(x_det, _Unicode(vis), "BlueVis")); Volume motherVol = desc.pickMotherVolume(det); @@ -77,10 +59,8 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec envPV.addPhysVolID("system", det_id); det.setPlacement(envPV); - // optical surfaces - OpticalSurfaceManager surfMgr = desc.surfaceManager(); - OpticalSurface mirrorSurf = surfMgr.opticalSurface("MirrorOpticalSurface"); - OpticalSurface pmtSurf = surfMgr.opticalSurface("PMTOpticalSurface"); + // optical surface manager + OpticalSurfaceManager surfMgr = desc.surfaceManager(); // mirrors auto x_mirrors = x_det.child(_Unicode(mirrors)); @@ -96,17 +76,20 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec Trd1 mir_cutout(mdim.attr<double>(_Unicode(width1))/2., mdim.attr<double>(_Unicode(width2))/2., mdim.length()/2., mdim.length()/2.); auto mir_trans = RotationX(M_PI/2.)*Transform3D(Position(0., 0., -mdim.radius())); + Volume v_mir("vol_mirror_" + std::to_string(i), IntersectionSolid(mir_cutout, mir_shell, mir_trans), mmat); auto mir_trans2 = Transform3D(Position(mloc.x(), mloc.y(), mloc.z()))*RotationZYX(mrot.z(), mrot.y(), mrot.x()); PlacedVolume pv_mir = v_sector.placeVolume(v_mir, mir_trans2); DetElement de_mir(det, "de_mirror" + std::to_string(i), i); pv_mir.addPhysVolID("mirror", i); de_mir.setPlacement(pv_mir); - v_mir.setSensitiveDetector(sens); + // v_mir.setSensitiveDetector(sens); + + auto surface = surfMgr.opticalSurface(x_mir.attr<std::string>(_Unicode(surface))); // optical surface - // SkinSurface mirrorBorder_Surf(desc, de_mir, "LGCmirror", mirrorSurf, v_mir); - // mirrorBorder_Surf.isValid(); + SkinSurface mirror_skin(desc, de_mir, "mirror_surface_" + std::to_string(i), surface, v_mir); + mirror_skin.isValid(); i++; } @@ -152,13 +135,20 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec Transform3D(Position(0, 0, tube_length / 2.0 + 5.0 * mm))); de_winston_cone.setPlacement(pv_winston_cone_solid); // optical surface - SkinSurface winstonBorder_Surf(desc, de_winston_cone, "LGCWinstonCone", mirrorSurf, v_winston_cone_solid); - winstonBorder_Surf.isValid(); + auto surface = surfMgr.opticalSurface(x_winston.attr<std::string>(_Unicode(surface))); + SkinSurface winston_skin(desc, de_winston_cone, "winston_surface", surface, v_winston_cone_solid); + winston_skin.isValid(); + + // --------------- + // Dummy PMT surface + auto x_pmt = x_det.child(_Unicode(pmt_array)); + xml_dim_t dims_pmt = x_pmt.child(_Unicode(dimensions)); + auto pmt_x = dims_pmt.x(); + auto pmt_y = dims_pmt.y(); + auto pmt_surf = surfMgr.opticalSurface(x_pmt.attr<std::string>(_Unicode(surface))); - //// --------------- - //// Dummy PMT surface DetElement de_pmt_array(det, "PMT_DE", 1); - Box pmt_array(LGC_pmt_array_size / 2.0, LGC_pmt_array_size / 2.0, 5 * mm / 2.0); + Box pmt_array(pmt_x/2., pmt_y/2., 5 * mm / 2.0); Volume v_pmt_array("v_pmt_array", pmt_array, rad_mat); PlacedVolume pv_pmt_array = v_sector.placeVolume(v_pmt_array, Transform3D(Position(wpl.x(), wpl.y(), wpl.z())) * @@ -169,14 +159,15 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec v_pmt_array.setSensitiveDetector(sens); // optical surface - SkinSurface pmtBorder_Surf(desc, de_pmt_array, "LGCPMTsurface", pmtSurf, v_pmt_array); - pmtBorder_Surf.isValid(); + SkinSurface pmt_skin(desc, de_pmt_array, "LGCPMTsurface", pmt_surf, v_pmt_array); + pmt_skin.isValid(); // copper layer inside to stop photons - Box pmt_array_backing(LGC_pmt_array_size/2.0, LGC_pmt_array_size/2.0, 1*mm/2.0); + Box pmt_array_backing(pmt_x/2., pmt_y/2., 1*mm/2.0); auto Copper = desc.material("Copper"); Volume v_pmt_array_backing("v_pmt_array_backing", pmt_array_backing, Copper); - PlacedVolume pv_pmt_array_backing = v_pmt_array.placeVolume(v_pmt_array_backing, Position(0,0,0)); + // PlacedVolume pv_pmt_array_backing = + v_pmt_array.placeVolume(v_pmt_array_backing, Position(0,0,0)); return det; } -- GitLab