From f2821b0b02f19222e19cb9f8a33faea46ff2bd48 Mon Sep 17 00:00:00 2001
From: Sylvester Joosten <sjoosten@anl.gov>
Date: Wed, 20 Oct 2021 20:03:36 +0000
Subject: [PATCH] Resolve "Negative endcap (HCAL) geometry"

---
 compact/definitions.xml       | 16 ++++++++++------
 compact/display.xml           |  5 +++++
 compact/display_geoviewer.xml |  5 +++++
 compact/hcal.xml              | 23 +++++++++++++++++++++--
 4 files changed, 41 insertions(+), 8 deletions(-)

diff --git a/compact/definitions.xml b/compact/definitions.xml
index 3b6af4bf..683a1497 100644
--- a/compact/definitions.xml
+++ b/compact/definitions.xml
@@ -190,6 +190,7 @@ The unused IDs below are saved for future use.
     <constant name="HCalBarrel_ID"      value="111"/>
     <constant name="HCalEndcapP_ID"     value="112"/>
     <constant name="HCalEndcapN_ID"     value="113"/>
+    <constant name="PassiveSteelRingEndcapP_ID" value="114"/>
     <documentation> 
       #### (120-129) (near) Forward reserved
 
@@ -423,9 +424,10 @@ Service gaps in FW direction (before endcapP ECAL) and BW direction (before endc
     <constant name="EcalEndcapP_zmin"               value="ForwardPIDRegion_zmin + ForwardInnerEndcapRegion_length + ForwardServiceGap_length" />
     <constant name="EcalEndcapP_length"             value="30*cm" />
     <constant name="EcalEndcapP_rmin"               value="200.0*mm" />
-    <constant name="EcalEndcapP_rmax"               value="Solenoid_rmax "/>
+    <comment> extra 50cm rmax that "protrudes" into the HCAL</comment>
+    <constant name="EcalEndcapP_rmax"               value="Solenoid_rmax + 50*cm"/>
 
-    <constant name="EcalEndcapN_zmin"               value="max(BackwardPIDRegion_zmin + BackwardInnerEndcapRegion_length, SolenoidBackward_zmax)"/>
+    <constant name="EcalEndcapN_zmin"               value="BackwardPIDRegion_zmin + BackwardInnerEndcapRegion_length"/>
     <constant name="EcalEndcapN_length"             value="60*cm" />
     <constant name="EcalEndcapN_rmin"               value="max((EcalEndcapN_zmin + EcalEndcapN_length) * tan(abs(CrossingAngle)) + 15.5 * mm, 5*cm)" />
     <constant name="EcalEndcapN_rmax"               value="CentralTrackingRegion_rmax" />
@@ -436,6 +438,7 @@ Service gaps in FW direction (before endcapP ECAL) and BW direction (before endc
     <constant name="EcalBarrelBackward_zmax"        value="EcalEndcapN_zmin + 30*cm"/>
     <constant name="EcalBarrel_length"              value="EcalBarrelForward_zmax + EcalBarrelBackward_zmax"/>
     <constant name="EcalBarrel_offset"              value="(EcalBarrelForward_zmax - EcalBarrelBackward_zmax)/2.0"/>
+    <constant name="EcalBarrelReadout_length"       value="20*cm"/>
 
 
   <documentation level="3">
@@ -443,8 +446,8 @@ Service gaps in FW direction (before endcapP ECAL) and BW direction (before endc
   </documentation>
     <constant name="DIRCReadout_length"         value="30*cm"/>
     <constant name="DIRCForward_length"         value="0*cm"/>
-    <constant name="DIRCForward_zmax"           value="ForwardPIDRegion_zmin + DIRCForward_length"/>
-    <constant name="DIRCBackward_zmax"          value="BackwardPIDRegion_zmin + BackwardInnerEndcapRegion_length + EcalEndcapN_length + DIRCReadout_length"/>
+    <constant name="DIRCForward_zmax"           value="EcalBarrelForward_zmax "/>
+    <constant name="DIRCBackward_zmax"          value="EcalBarrelBackward_zmax + EcalBarrelReadout_length +DIRCReadout_length "/>
     <constant name="DIRC_length"                value="DIRCForward_zmax + DIRCBackward_zmax"/>
     <constant name="DIRC_offset"                value="(DIRCForward_zmax - DIRCBackward_zmax)/2"/>
     <constant name="DIRC_rmin"                  value="CentralTrackingRegion_rmax"/>
@@ -459,7 +462,7 @@ Service gaps in FW direction (before endcapP ECAL) and BW direction (before endc
     <comment> HcalEndcapP needs to clear the expanding beampipe with 2 * crossing angle + its radius of BeampipeOD / 2</comment>
     <constant name="HcalEndcapP_rmin"     value="max((HcalEndcapP_zmin + HcalEndcapP_length) * tan(2.0 * abs(CrossingAngle)) + BeampipeOD / 2.0, 15 * cm)"/>
 
-    <constant name="HcalEndcapN_zmin"     value="DIRCBackward_zmax + BackwardServiceGap_length"/>
+    <constant name="HcalEndcapN_zmin"     value="max(DIRCBackward_zmax + BackwardServiceGap_length, 335*cm)"/>
     <constant name="HcalEndcapN_length"   value="105.0*cm"/>
     <comment> HcalEndcapN needs to clear the straight beampipe with 1 * crossing angle + its radius of 22.25 mm </comment>
     <constant name="HcalEndcapN_rmin"     value="max((HcalEndcapN_zmin + HcalEndcapN_length) * tan(abs(CrossingAngle)) + 22.25 * mm, 11 * cm)"/>
@@ -467,7 +470,8 @@ Service gaps in FW direction (before endcapP ECAL) and BW direction (before endc
     <constant name="HcalBarrel_thickness" value="100.0*cm "/>
     <constant name="HcalBarrel_rmin"      value="Solenoid_rmax"/>
     <constant name="HcalBarrel_rmax"      value="HcalBarrel_rmin + HcalBarrel_thickness"/>
-    <constant name="HcalBarrel_length"    value="HcalEndcapP_zmin + HcalEndcapN_zmin "/>
+    <constant name="HcalBarrelForward_zmax" value="HcalEndcapP_zmin - ForwardServiceGap_length - EcalEndcapP_length"/>
+    <constant name="HcalBarrelBackward_zmax" value="HcalEndcapN_zmin - BackwardServiceGap_length"/>
 
     <comment> 
       These are used by ddsim, the region where we store all secondaries 
diff --git a/compact/display.xml b/compact/display.xml
index 3175dd74..8740861f 100644
--- a/compact/display.xml
+++ b/compact/display.xml
@@ -57,6 +57,11 @@
     <vis name="HcalSensorVis"         ref="AnlBlue"   showDaughters="false" visible="false"/>
     <vis name="HcalAbsorberVis"       ref="AnlGray"   showDaughters="false" visible="false"/>
 
+    <comment>
+      Passive steel for flux return
+    </comment>
+    <vis name="PassiveSteelVis"       ref="AnlViolet" showDaughters="false" visible="true"/>
+
     <comment>
       Solenoid
     </comment>
diff --git a/compact/display_geoviewer.xml b/compact/display_geoviewer.xml
index 83f8b19b..ba8d7128 100644
--- a/compact/display_geoviewer.xml
+++ b/compact/display_geoviewer.xml
@@ -56,6 +56,11 @@
     <vis name="HcalSensorVis"         ref="AnlBlue"     showDaughters="true" visible="true"/>
     <vis name="HcalAbsorberVis"       ref="AnlGray"   showDaughters="true" visible="true"/>
 
+    <comment>
+      Passive steel for flux return
+    </comment>
+    <vis name="PassiveSteelVis"       ref="AnlViolet" showDaughters="false" visible="true"/>
+
     <comment>
       Solenoid
     </comment>
diff --git a/compact/hcal.xml b/compact/hcal.xml
index 19adfa57..27bf87f9 100644
--- a/compact/hcal.xml
+++ b/compact/hcal.xml
@@ -1,9 +1,10 @@
 <lccdd>
 
   <define>
-    <constant name="HcalBarrel_offset"              value="(HcalEndcapP_zmin-HcalEndcapN_zmin)/2.0" />
-
+    <constant name="HcalBarrel_length"    value="HcalBarrelForward_zmax + HcalBarrelBackward_zmax"/>
+    <constant name="HcalBarrel_offset"    value="(HcalBarrelForward_zmax - HcalBarrelBackward_zmax)/2"/>
     <constant name="HcalBarrelAvailThickness" value="HcalBarrel_thickness"/>
+
     <documentation>
       #### Material Thickness 
     </documentation>
@@ -93,6 +94,24 @@
       </layer>
     </detector>
 
+    <detector 
+      id="PassiveSteelRingEndcapP_ID" 
+      name="PassiveSteelRingEndcapP" 
+      type="athena_PolyhedraEndcapCalorimeter2" 
+      vis="PassiveSteelVis" 
+      calorimeterType="HAD_ENDCAP"
+      reflect="false">
+      <position x="0" y="0" z="0"/>
+      <dimensions 
+        numsides="CaloSides" 
+        zmin="EcalEndcapP_zmin" 
+        rmin="EcalEndcapP_rmax"
+        rmax="HcalBarrel_rmax"/>
+      <layer repeat="1">
+        <slice material="Steel235" thickness="EcalEndcapP_length" vis="HcalAbsorberVis"/>
+      </layer>
+    </detector>
+
     <detector 
       id="HCalEndcapN_ID" 
       name="HcalEndcapN" 
-- 
GitLab