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