From d7445e7e9a87ad74b684c122c11cd8baac736d6a Mon Sep 17 00:00:00 2001
From: Whitney Armstrong <warmstrong@anl.gov>
Date: Wed, 9 Jun 2021 02:06:48 +0000
Subject: [PATCH] Fix ecal support on outside surface

---
 compact/ecal_barrel.xml       | 28 ++++++++++++++++------------
 src/BarrelCalorimeter_geo.cpp | 35 ++++++++++++++++++++---------------
 2 files changed, 36 insertions(+), 27 deletions(-)

diff --git a/compact/ecal_barrel.xml b/compact/ecal_barrel.xml
index 05b7a9ef..6a9aa87b 100644
--- a/compact/ecal_barrel.xml
+++ b/compact/ecal_barrel.xml
@@ -1,7 +1,10 @@
 <lccdd>
 
+    <display>
+    <vis name="EcalBarrelEnvelope_vis" alpha="0.9" r="0.99" g="0.5" b="0" showDaughters="true" visible="false" />
+    <vis name="EcalBarrelStave_vis"    alpha="0.9" r="0.99" g="0.5" b="0" showDaughters="true" visible="false" />
+    </display>
   <define>
-
     <comment>
       ---------------------------------------
       EM Calorimeter Parameters with AstroPix
@@ -56,25 +59,26 @@
       type="athena_EcalBarrel"
       readout="EcalBarrelHits"
       calorimeterType="EM_BARREL"
+      vis="EcalBarrelEnvelope_vis"
       offset="EcalBarrel_offset">
       <dimensions numsides="EcalBarrel_ModRepeat" 
         rmin="EcalBarrel_rmin" 
         z="EcalBarrel_length"/>
-      <staves vis="EcalBarrelVis">
-        <support inside="true"  material="Aluminum"
+      <staves vis="EcalBarrelStave_vis">
+        <support inside="true"  material="Aluminum" vis="AnlOrange"
           thickness="EcalBarrel_Support_thickness"
           n_beams="3" grid_size="25.0*cm" >
         </support>
       </staves>
-      <layer repeat="EcalBarrel_ReadoutLayerNumber">
-        <slice material="Silicon" thickness="EcalBarrel_SiliconThickness" sensitive="yes" limits="cal_limits"/>
-        <slice material="Silicon" thickness="EcalBarrel_ElectronicsThickness"/>
-        <slice material="Copper" thickness="EcalBarrel_CopperThickness"/>
-        <slice material="Kapton" thickness="EcalBarrel_KaptonThickness"/>
-        <slice material="Epoxy" thickness="EcalBarrel_EpoxyThickness"/>
-        <slice material="CarbonFiber" thickness="EcalBarrel_CarbonThickness"/>
-        <slice material="TungstenDens24" thickness="EcalBarrel_TungstenThickness"/>
-        <slice material="Air" thickness="EcalBarrel_LayerSpacing - EcalBarrel_TungstenThickness"/>
+      <layer repeat="EcalBarrel_ReadoutLayerNumber" vis="AnlBlue">
+        <slice material="Silicon" thickness="EcalBarrel_SiliconThickness" sensitive="yes" limits="cal_limits" vis="AnlGray"/>
+        <slice material="Silicon" thickness="EcalBarrel_ElectronicsThickness" vis="AnlGold"/>
+        <slice material="Copper" thickness="EcalBarrel_CopperThickness" vis="AnlGray"/>
+        <slice material="Kapton" thickness="EcalBarrel_KaptonThickness" vis="AnlGold"/>
+        <slice material="Epoxy" thickness="EcalBarrel_EpoxyThickness" vis="AnlGray"/>
+        <slice material="CarbonFiber" thickness="EcalBarrel_CarbonThickness" vis="AnlGold"/>
+        <slice material="TungstenDens24" thickness="EcalBarrel_TungstenThickness" vis="AnlGray"/>
+        <slice material="Air" thickness="EcalBarrel_LayerSpacing - EcalBarrel_TungstenThickness" vis="AnlGold"/>
       </layer>
     </detector>
   </detectors>
diff --git a/src/BarrelCalorimeter_geo.cpp b/src/BarrelCalorimeter_geo.cpp
index 336ecb39..2f9e0ae7 100644
--- a/src/BarrelCalorimeter_geo.cpp
+++ b/src/BarrelCalorimeter_geo.cpp
@@ -72,7 +72,9 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
   Volume mod_vol("stave",trd,air);
   double l_pos_z = -(layering.totalThickness() / 2) - support_thickness/2.0;
 
-  double trd_x2_support = trd_x1;
+  //double trd_x2_support = trd_x1;
+  double trd_x1_support = (2 * std::tan(hphi) * outer_r - dx- support_thickness)/2 - tolerance;
+
   Solid  support_frame_s;
   // optional stave support
   if(x_staves.hasChild("support")){
@@ -80,13 +82,15 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
     // is the support on the inside surface?
     bool       is_inside_support = getAttrOrDefault<bool>(x_support, _Unicode(inside), true);
     // number of "beams" running the length of the stave.
-    int    n_beams           = getAttrOrDefault<int>(x_support, _Unicode(n_beams), 3);
-    trd_x2_support    = (2 * std::tan(hphi) * (inner_r + support_thickness)) / 2 - tolerance;
-    double grid_size         = getAttrOrDefault(x_support, _Unicode(grid_size), 25.0 * cm);
-    double beam_width        = 2.0*trd_x2_support/(n_beams+1); // quick hack to make some gap between T beams
-    double beam_thickness    = support_thickness/4.0;
+    int    n_beams        = getAttrOrDefault<int>(x_support, _Unicode(n_beams), 3);
+    double beam_thickness = support_thickness / 4.0; // maybe a parameter later...
+    trd_x1_support        = (2 * std::tan(hphi) * (outer_r - support_thickness + beam_thickness)) / 2 - tolerance;
+    double grid_size      = getAttrOrDefault(x_support, _Unicode(grid_size), 25.0 * cm);
+    double beam_width     = 2.0 * trd_x1_support / (n_beams + 1); // quick hack to make some gap between T beams
+
     double cross_beam_thickness    = support_thickness/4.0;
-    double trd_x1_support    = (2 * std::tan(hphi) * (inner_r + beam_thickness)) / 2 - tolerance;
+    //double trd_x1_support    = (2 * std::tan(hphi) * (inner_r + beam_thickness)) / 2 - tolerance;
+    double trd_x2_support = trd_x2;
 
     int n_cross_supports = std::floor((trd_y1-cross_beam_thickness)/grid_size);
 
@@ -105,32 +109,33 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
     }
     support_array_start_s =
         UnionSolid(support_array_start_s, beam_hori_s,
-                   Position(-1.5 * 0.5*(trd_x1+trd_x2_support) / n_beams, 0, -support_thickness / 2.0 + beam_thickness / 2.0));
+                   Position(-1.8 * 0.5*(trd_x1+trd_x2_support) / n_beams, 0, -support_thickness / 2.0 + beam_thickness / 2.0));
     support_array_start_s =
         UnionSolid(support_array_start_s, beam_hori_s,
-                   Position(1.5 * 0.5*(trd_x1+trd_x2_support) / n_beams, 0, -support_thickness / 2.0 + beam_thickness / 2.0));
+                   Position(1.8 * 0.5*(trd_x1+trd_x2_support) / n_beams, 0, -support_thickness / 2.0 + beam_thickness / 2.0));
     support_array_start_s =
-        UnionSolid(support_array_start_s, beam_vert_s, Position(-1.5 * 0.5*(trd_x1+trd_x2_support) / n_beams, 0, 0));
+        UnionSolid(support_array_start_s, beam_vert_s, Position(-1.8 * 0.5*(trd_x1+trd_x2_support) / n_beams, 0, 0));
     support_array_start_s =
-        UnionSolid(support_array_start_s, beam_vert_s, Position(1.5 * 0.5*(trd_x1+trd_x2_support) / n_beams, 0, 0));
+        UnionSolid(support_array_start_s, beam_vert_s, Position(1.8 * 0.5*(trd_x1+trd_x2_support) / n_beams, 0, 0));
 
     support_frame_s = support_array_start_s;
 
     Material support_mat = description.material(x_support.materialStr());
     Volume   support_vol("support_frame_v", support_frame_s, support_mat);
-    support_vol.setVisAttributes(description.visAttributes(x_support.visStr()));
+    support_vol.setVisAttributes(description,x_support.visStr());
 
     // figure out how to best place
-    auto pv = mod_vol.placeVolume(support_vol, Position(0.0, 0.0, l_pos_z + support_thickness / 2.0));
+    //auto pv = mod_vol.placeVolume(support_vol, Position(0.0, 0.0, l_pos_z + support_thickness / 2.0));
+    auto pv = mod_vol.placeVolume(support_vol, Position(0.0, 0.0, -l_pos_z - support_thickness / 2.0));
   }
-  l_pos_z += support_thickness;
+  //l_pos_z += support_thickness;
 
   sens.setType("calorimeter");
   { // =====  buildBarrelStave(description, sens, module_volume) =====
     // Parameters for computing the layer X dimension:
     double stave_z  = trd_y1;
     double tan_hphi = std::tan(hphi);
-    double l_dim_x  = trd_x2_support; // Starting X dimension for the layer.
+    double l_dim_x  = trd_x1; // Starting X dimension for the layer.
 
     // Loop over the sets of layer elements in the detector.
     int l_num = 1;
-- 
GitLab