From 1faeeae6bc86403775bb90464a2d4940bc94f4d2 Mon Sep 17 00:00:00 2001
From: Whitney Armstrong <warmstrong@anl.gov>
Date: Wed, 7 Apr 2021 06:38:14 +0000
Subject: [PATCH] 	modified:   compact/definitions.xml

	modified:   compact/definitions.xml

	modified:   compact/definitions.xml
	modified:   compact/ecal.xml

	modified:   compact/definitions.xml

	modified:   compact/definitions.xml
	modified:   compact/ecal.xml

	modified:   compact/definitions.xml

	modified:   CMakeLists.txt
	modified:   compact/definitions.xml
	modified:   compact/ecal.xml
---
 CMakeLists.txt                          |   2 +-
 compact/cb_CTD_Si.xml                   |   3 +
 compact/cb_Solenoid.xml                 |   2 +-
 compact/definitions.xml                 | 252 ++++++++++++++----------
 compact/ecal.xml                        |  41 ++--
 compact/forward_rich.xml                |  49 +++--
 compact/refdetector_defs.xml            |  11 --
 compact/solenoid.xml                    |   2 +-
 reference_detector.xml                  |  13 +-
 scripts/view1/generate_eps              |   3 +-
 src/EcalBarrel_geo.cpp                  | 164 +++++++++++++++
 src/ForwardRICH_geo.cpp                 |  32 +--
 src/PolyhedraEndcapCalorimeter2_geo.cpp |  95 +++++----
 src/TestDetector.cpp                    |  36 ----
 src/cb_CTD_Si.cpp                       |   5 +
 src/cb_Solenoid.cpp                     |  35 ----
 src/ce_GEM.cpp                          |   5 +
 src/ffi_ZDC.cpp                         |   5 +
 18 files changed, 469 insertions(+), 286 deletions(-)
 delete mode 100644 compact/refdetector_defs.xml
 create mode 100644 src/EcalBarrel_geo.cpp
 delete mode 100644 src/TestDetector.cpp
 delete mode 100644 src/cb_Solenoid.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index b2d5e2dc..f807d33a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,7 +16,7 @@ set(a_lib_name reference_detector)
 dd4hep_configure_output()
 
 dd4hep_add_plugin(${a_lib_name} SOURCES src/*.cpp
-        USES ActsCore ActsPluginDD4hep
+  #        USES ActsCore ActsPluginDD4hep
   )
 target_link_libraries(${a_lib_name}
   PUBLIC DD4hep::DDCore  DD4hep::DDRec
diff --git a/compact/cb_CTD_Si.xml b/compact/cb_CTD_Si.xml
index 06b4f825..3deea232 100644
--- a/compact/cb_CTD_Si.xml
+++ b/compact/cb_CTD_Si.xml
@@ -3,6 +3,9 @@
   <comment> Central Barrel Tracker Silicon </comment>        
 
   <define>
+    <comment> Si layer opiton </comment>
+    <constant name="cb_CTD_Si_gap"    value="5.0 * cm"/>
+    <constant name="cb_CTD_Si_layer"  value="15"/>
   </define>
 
   <limits>
diff --git a/compact/cb_Solenoid.xml b/compact/cb_Solenoid.xml
index 2083a62d..efca08be 100644
--- a/compact/cb_Solenoid.xml
+++ b/compact/cb_Solenoid.xml
@@ -21,7 +21,7 @@
     </comment>
     <detector id="Solenoid_ID" name="cb_Solenoid" type="cb_Solenoid" insideTrackingVolume="false" vis="cb_SolenoidVis">
 	    <material name="Vacuum"/>  <!-- G4_Galactic -->	    
-      <dimensions rmin="cb_Solenoid_rmin" rmax="cb_Solenoid_rmax" z="cb_Solenoid_z" delta="cb_Solenoid_shift"/>
+      <dimensions rmin="Solenoid_rmin" rmax="Solenoid_rmax" z="b_Solenoid_z" delta="cb_Solenoid_shift"/>
     </detector>
   </detectors>
 
diff --git a/compact/definitions.xml b/compact/definitions.xml
index c23b1cc6..4ebaf809 100644
--- a/compact/definitions.xml
+++ b/compact/definitions.xml
@@ -1,15 +1,16 @@
   <define>
-    <comment>Although not explicit in the design study, the eRHIC crossing angle is not symmetric.</comment>
+    <constant name="world_side" value="30*m"/>
+    <constant name="world_x" value="world_side"/>
+    <constant name="world_y" value="world_side"/>
+    <constant name="world_z" value="100*m"/>
+
+    <comment>Although not explicit in the EIC design study, the crossing angle is not symmetric.</comment>
     <constant name="CrossingAngle" value="0.025"/>
     <constant name="ionCrossingAngle" value="0.0166667"/>
     <constant name="electronCrossingAngle" value="0.00833333"/>
     <constant name="CrossingSlope" value="0.0166682"/>
 
     <constant name="Pi" value="3.14159265359"/>
-    <constant name="world_side" value="30*m"/>
-    <constant name="world_x" value="world_side"/>
-    <constant name="world_y" value="world_side"/>
-    <constant name="world_z" value="100*m"/>
 
     <constant name="mil" value="0.0254*mm"/>
 
@@ -237,44 +238,47 @@
     </comment>
 
     <comment>
-      --------------------------
-      Solenoid Magnet Parameters
-      --------------------------
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+      Detector Definition Parameters 
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     </comment>
 
     <comment>
-      These cb_ parameters don't make sense
+      ==========================
+      Solenoid Magnet Parameters
+      ==========================
     </comment>
     <constant name="cb_Solenoid_rmin"  value="0.0 * cm"/>   <comment> Central Barrel Solenoid Inner diameter </comment>
     <constant name="cb_Solenoid_rmax"  value="137.0 * cm"/> <comment> Central Barrel Solenoid Outer diameter </comment>
     <constant name="cb_Solenoid_z"     value="400.0 * cm"/> <comment> Central Barrel Solenoid Size in Z direction </comment> 
     <constant name="cb_Solenoid_shift" value="0.0 * cm"/>
 
+    <constant name="Solenoid_length"         value="7000.0*mm"/>
+    <constant name="Solenoid_rmin"           value="3000.0*mm"/>
     <constant name="Solenoid_thickness"      value="400*mm"/>
-    <constant name="Solenoid_rmin"           value="2000.0*mm"/>
     <constant name="Solenoid_rmax"           value="Solenoid_rmin + Solenoid_thickness"/>
-    <constant name="SolenoidLength"          value="4050.0*mm"/>
 
+    <comment>Solenoid Barrel Parameters</comment>
     <constant name="SolenoidBarrelCryostatThickness"      value=" 1.0 * cm"/>
     <constant name="SolenoidBarrelGapThickness"           value=" 3.3 * cm"/>
     <constant name="SolenoidBarrelAlConductorThickness"   value="12.0 * cm"/>
     <constant name="SolenoidBarrelQuenchbackThickness"    value=" 1.5 * cm"/>
     <constant name="SolenoidBarrelOuterGapThickness"      value=" 5.6 * cm"/>
     <constant name="SolenoidBarrelOuterCryostatThickness" value=" 1.2 * cm"/>
-
     <constant name="SolenoidEndPlateGapThickness"           value=" 5.7 * cm"/>
     <constant name="SolenoidEndPlateCryostatThickness"      value=" 1.5 * cm"/>
 
+    <comment> Solenoid Yoke Endcap </comment>
+    <constant name="SolenoidYokeEndcap_thickness"  value="0.2 * m"/>
+
     <constant name="SolenoidBarrel_rmin"     value="Solenoid_rmin"/>
-    <constant name="SolenoidBarrelLenth"     value="SolenoidLength"/>
-    <constant name="SolenoidBarrel_zmax"     value="SolenoidBarrelLenth/2.0"/>
+    <constant name="SolenoidBarrel_length"   value="Solenoid_length"/>
+    <constant name="SolenoidBarrel_zmax"     value="Solenoid_length/2.0"/>
 
-    <constant name="SolenoidCoilConductor_rmin" 
-              value="SolenoidBarrel_rmin + SolenoidBarrelCryostatThickness + SolenoidBarrelGapThickness"/>
-    <constant name="SolenoidCoilConductor_rmax" 
-              value="SolenoidCoilConductor_rmin + SolenoidBarrelAlConductorThickness + SolenoidBarrelQuenchbackThickness"/>
-    <constant name="SolenoidBarrel_rmax" 
-              value="SolenoidCoilConductor_rmax + SolenoidBarrelOuterGapThickness + SolenoidBarrelOuterCryostatThickness"/>
+    <constant name="SolenoidCoilConductor_rmin" value="SolenoidBarrel_rmin + SolenoidBarrelCryostatThickness + SolenoidBarrelGapThickness"/>
+    <constant name="SolenoidCoilConductor_rmax" value="SolenoidCoilConductor_rmin + SolenoidBarrelAlConductorThickness + SolenoidBarrelQuenchbackThickness"/>
+
+    <constant name="SolenoidBarrel_rmax" value="SolenoidCoilConductor_rmax + SolenoidBarrelOuterGapThickness + SolenoidBarrelOuterCryostatThickness"/>
 
     <constant name="SolenoidCoil_zmax" 
               value="SolenoidBarrel_zmax - SolenoidEndPlateCryostatThickness - SolenoidEndPlateGapThickness"/>
@@ -282,25 +286,41 @@
     <constant name="SolenoidalFieldRadius" 
               value="SolenoidCoilConductor_rmin + SolenoidBarrelAlConductorThickness / 2.0"/>
 
-    <constant name="SolenoidCoilLength" value="SolenoidCoil_zmax*2.0"/>
-
-    <constant name="SolenoidThickness"           value="Solenoid_rmax - Solenoid_rmin"/>
+    <constant name="SolenoidCoil_length" value="SolenoidCoil_zmax*2.0"/>
 
-    <constant name="SolenoidYokeEndcapP_rmin"     value="800*mm"/>
-    <constant name="SolenoidYokeEndcapN_rmin"     value="800*mm"/>
-    <constant name="SolenoidYokeEndcapThickness"  value="0.2 * m"/>
-    <constant name="SolenoidYokeEndcap_zmin"      value="SolenoidBarrel_zmax"/>
-    <constant name="SolenoidYokeEndcap_zmax"      value="SolenoidYokeEndcap_zmin + SolenoidYokeEndcapThickness"/>
+    <constant name="SolenoidYokeEndcapP_rmin"     value="SolenoidBarrel_rmin"/>
+    <constant name="SolenoidYokeEndcapN_rmin"     value="SolenoidBarrel_rmin"/>
+    <constant name="SolenoidYokeEndcap_zmin"      value="SolenoidCoil_zmax"/>
+    <constant name="SolenoidYokeEndcap_zmax"      value="SolenoidYokeEndcap_zmin + SolenoidYokeEndcap_thickness"/>
 
     <constant name="SolenoidYokeChamferAngle"    value="0.2"/>
 
+
+    <comment>
+      ---------------------------------
+      Other Central Detector parameters
+      --------------------------------
+      These are needed here to compute the dependent parameters.
+    </comment>
+
+    <constant name="RICHLength"       value="1.1*m"/>
+    <constant name="TRDLength"        value="20.0*cm"/>
+    <constant name="ForwardTOFLength" value="10.0*cm"/>
+    <constant name="ForwardPIDLength" value="RICHLength + TRDLength + ForwardTOFLength"/>
+    
+    <constant name="BackwardCherenkovLength"   value="15.0*cm"/>
+    <constant name="BackwardTOFLength"         value="10.0*cm"/>
+    <constant name="BackwardPIDLength"         value="BackwardCherenkovLength + BackwardTOFLength"/>
+
+    <constant name="BarrelPIDThickness"        value="25.0 * cm"/>
+
     <comment>
       ============================
       Tracking Parameters
       ============================
     </comment>
     <constant name="tracker_region_rmax"            value="Solenoid_rmax/2.0"/>
-    <constant name="tracker_region_zmax"            value="SolenoidLength/2.0"/>
+    <constant name="tracker_region_zmax"            value="Solenoid_length/2.0"/>
 
     <comment>
       -------------------------
@@ -308,8 +328,8 @@
       -------------------------
     </comment>
     <constant name="VertexTrackerInnerRadius"       value="30.0*mm"/>
-    <constant name="VertexTrackerOuterRadius"       value="Solenoid_rmin/2.0"/>
-    <constant name="VertexTrackerOuterBarrelLength" value="300.0*mm"/>
+    <constant name="VertexTrackerOuterRadius"       value="90.0*mm"/>
+    <constant name="VertexTrackerOuterBarrelLength" value="400.0*mm"/>
 
 
     <comment>
@@ -318,54 +338,63 @@
       --------------------------
     </comment>
     <constant name="SiliconTrackerInnerRadius"       value="95.0*mm"/>
-    <constant name="SiliconTrackerInnerBarrelLength" value="400.0*mm"/>
-    <constant name="SiliconTrackerOuterRadius"       value="Solenoid_rmax/2.0"/>
-    <constant name="SiliconTrackerOuterBarrelLength" value="SolenoidLength/2.0"/>
+    <constant name="SiliconTrackerInnerBarrelLength" value="300.0*mm"/>
+    <constant name="SiliconTrackerOuterRadius"       value="Solenoid_rmax/3.0"/>
+    <constant name="SiliconTrackerOuterBarrelLength" value="Solenoid_length/2.5"/>
+    <constant name="SiliconTrackerOuterBarrel_zmax"  value="SiliconTrackerOuterBarrelLength/2.0"/>
 
     <comment>
       -------------------------------
       Central Barrel Tracker - Global
       -------------------------------
+
+      The cb_CTD_* parameters can probably be moved to the detector specific xml file.
     </comment>
-    <constant name="cb_CTD_rmin"   value="21.0 * cm"/>
-    <constant name="cb_CTD_rmax"   value="80.0 * cm"/>
-    <constant name="cb_CTD_zmax"   value="200.0 * cm"/>
-    <comment> Original Global parameter </comment>	    
-    <!--
-    <constant name="cb_CTD_zmax"   value="120.0 * cm"/>
-    -->	    
-    <constant name="cb_CTD_length" value="SolenoidLength - cb_CTD_zmax"/>
-    <comment> After fix cb_Solenoid parameters  </comment>
-    <!--	    
-    <constant name="cb_CTD_length" value="cb_Solenoid_z - cb_CTD_zmax"/>
-    -->
-    <comment> Si layer opiton </comment>
-    <constant name="cb_CTD_Si_gap"    value="5.0 * cm"/>
-    <constant name="cb_CTD_Si_layer"  value="15"/>
+    <constant name="cb_CTD_rmin"   value="SiliconTrackerInnerRadius"/>
+    <constant name="cb_CTD_rmax"   value="SiliconTrackerOuterRadius"/>
+    <constant name="cb_CTD_zmax"   value="SiliconTrackerOuterBarrel_zmax"/>
+    <constant name="cb_CTD_length" value="SiliconTrackerOuterBarrelLength"/>
 
     <comment>
       ------------
       Calorimeters
       ------------
+      ======================
+      Calorimeter Parameters
+      ======================
+
+    </comment>
+    <comment>
+      Ecal and Hcal Barrel
     </comment>
-    <constant name="EcalBarrel_rmin"                       value="SiliconTrackerOuterRadius + 3.0 * cm"/>
-    <constant name="HcalBarrel_rmax"                       value="Solenoid_rmin - 5.0 *cm "/>
-    <constant name="AvailTotalBarrelCalorimetryThickness"  value="HcalBarrel_rmax - EcalBarrel_rmin"/>
-    <constant name="CalBarrelDivider"                      value="0.5"/> <comment> Ecal and Hcal have the same thickness </comment>
-    <constant name="EcalBarrelAvailTotalThickness"         value="AvailTotalBarrelCalorimetryThickness * CalBarrelDivider"/>
-    <constant name="HcalBarrelAvailTotalThickness"         value="AvailTotalBarrelCalorimetryThickness * (1.0 - CalBarrelDivider)"/>
 
-    <constant name="EcalBarrelLength"                      value="SiliconTrackerOuterBarrelLength+50.0*cm"/>
-    <constant name="EcalEndcap_zmin"                       value="EcalBarrelLength/2.0"/>
+    <constant name="EcalBarrel_rmin"            value="SiliconTrackerOuterRadius + BarrelPIDThickness + 3.0 * cm"/>
+    <constant name="HcalBarrel_rmax"            value="Solenoid_rmin - 5.0 *cm "/>
+    <constant name="Barrel_TotalCalThickness"   value="HcalBarrel_rmax - EcalBarrel_rmin"/>
+    <constant name="CalBarrelDivider"           value="0.5"/> <comment> Ecal and Hcal have the same thickness </comment>
+    <constant name="EcalBarrel_TotalThickness"  value="Barrel_TotalCalThickness * CalBarrelDivider"/>
+    <constant name="HcalBarrel_TotalThickness"  value="Barrel_TotalCalThickness * (1.0 - CalBarrelDivider)"/>
 
-    <constant name="AvailTotalEndcapCalorimetryThickness"  value="(SolenoidYokeEndcap_zmin - 10.0 * mm) - (EcalEndcap_zmin + 10.0 * mm)"/>
-    <constant name="CalEndcapDivider"                      value="0.5"/> <comment> Ecal and Hcal have the same thickness </comment>
-    <constant name="EcalEndcapAvailTotalThickness"         value="AvailTotalEndcapCalorimetryThickness * CalEndcapDivider"/>
-    <constant name="HcalEndcapAvailTotalThickness"         value="AvailTotalEndcapCalorimetryThickness * (1.0 - CalEndcapDivider)"/>
+    <constant name="EcalBarrelLength"           value="SiliconTrackerOuterBarrelLength + ForwardPIDLength + BackwardPIDLength"/>
+    <constant name="EcalEndcapP_zmin"           value="SiliconTrackerOuterBarrelLength/2.0 + ForwardPIDLength"/>
+    <constant name="EcalEndcapN_zmin"           value="SiliconTrackerOuterBarrelLength/2.0 + BackwardPIDLength"/>
+    <constant name="EcalBarrel_offset"  value="(EcalEndcapP_zmin-EcalEndcapN_zmin)/2.0"/>
+
+    <constant name="EndcapP_TotalCalThickness"  value="(SolenoidYokeEndcap_zmin - 10.0 * mm) - (EcalEndcapP_zmin + 10.0 * mm)"/>
+    <constant name="EndcapN_TotalCalThickness"  value="(SolenoidYokeEndcap_zmin - 10.0 * mm) - (EcalEndcapN_zmin + 10.0 * mm)"/>
+
+    <constant name="EndcapP_CalDivide"          value="0.5"/> <comment> 0.5 means Ecal and Hcal have the same thickness </comment>
+    <constant name="EndcapN_CalDivide"          value="0.5"/> <comment> 0.5 means Ecal and Hcal have the same thickness </comment>
+
+    <constant name="EcalEndcapP_TotalThickness" value="EndcapP_TotalCalThickness * EndcapP_CalDivide"/>
+    <constant name="EcalEndcapN_TotalThickness" value="EndcapN_TotalCalThickness * EndcapN_CalDivide"/>
+
+    <constant name="HcalEndcapP_TotalThickness" value="EndcapP_TotalCalThickness * (1.0 - EndcapP_CalDivide)"/>
+    <constant name="HcalEndcapN_TotalThickness" value="EndcapN_TotalCalThickness * (1.0 - EndcapN_CalDivide)"/>
 
     <comment> These need to be set in sync with the forward and backward  detectors </comment>
-    <constant name="EcalEndcapP_rmin"                      value="250.0*mm"/>
-    <constant name="EcalEndcapN_rmin"                      value="350.0*mm"/>
+    <constant name="EcalEndcapP_rmin"                      value="200.0*mm"/>
+    <constant name="EcalEndcapN_rmin"                      value="300.0*mm"/>
 
     <constant name="HcalEndcapP_rmin"                      value="250.0 * mm"/>
     <constant name="HcalEndcapN_rmin"                      value="350.0 * mm"/>
@@ -374,44 +403,64 @@
       -------------------------
       EM Calorimeter Parameters
       -------------------------
+
+       ## Note about Calormieter parameterization.
+      
+       The logic goes like this: 
+       1. The space for the calorimeter is fixed via parameterization above.
+       2. The layer thicknesses are fixed (first parameters below)
+       3. From the space/thickness the number of layers is computed.
+
     </comment>
     <constant name="CaloSides"                  value="12"/>
 	    
     <comment>Material Thickness</comment>
-    <constant name="EcalSiliconThickness"       value="9.00 * mm"/>
-    <constant name="EcalCopperThickness"        value="0.05 * mm"/>
-    <constant name="EcalKaptonThickness"        value="0.30 * mm"/>
-    <constant name="EcalAir1Thickness"          value="0.33 * mm"/>
-    <constant name="EcalAir2Thickness"          value="0.25 * mm"/>
-    <constant name="EcalThinTungstenThickness"  value="2.50 * mm"/>
-    <constant name="EcalThickTungstenThickness" value="5.00 * mm"/>
+    <constant name="EcalSiliconThickness"       value="9.00 * mm" />
+    <constant name="EcalCopperThickness"        value="0.05 * mm" />
+    <constant name="EcalKaptonThickness"        value="0.30 * mm" />
+    <constant name="EcalAir1Thickness"          value="0.33 * mm" />
+    <constant name="EcalAir2Thickness"          value="0.25 * mm" />
+    <constant name="EcalThinTungstenThickness"  value="2.50 * mm" />
+    <constant name="EcalThickTungstenThickness" value="5.00 * mm" />
 	    
     <comment> Layer Thickness  </comment>
-    <constant name="EcalFirstLayerThickness"
-	    value="EcalSiliconThickness + EcalCopperThickness + EcalKaptonThickness + EcalAir1Thickness"/>
-    <constant name="EcalThinOneLayerThickness"   
-	    value="EcalThinTungstenThickness + EcalAir2Thickness + EcalSiliconThickness + EcalCopperThickness + EcalKaptonThickness + EcalAir1Thickness"/>
-    <constant name="EcalThickOneLayerThickness"   
-	    value="EcalThickTungstenThickness + EcalAir2Thickness + EcalSiliconThickness + EcalCopperThickness + EcalKaptonThickness + EcalAir1Thickness"/>
+    <constant name="EcalLayer1_thickness"
+	      value="EcalSiliconThickness + EcalCopperThickness + EcalKaptonThickness + EcalAir1Thickness"/>
+    <constant name="EcalLayer2_thickness"   
+	      value="EcalThinTungstenThickness + EcalAir2Thickness + EcalSiliconThickness + EcalCopperThickness + EcalKaptonThickness + EcalAir1Thickness"/>
+    <constant name="EcalLayer3_thickness"   
+	      value="EcalThickTungstenThickness + EcalAir2Thickness + EcalSiliconThickness + EcalCopperThickness + EcalKaptonThickness + EcalAir1Thickness"/>
 	    
     <comment> EM Barrel N Layer; same number of layers for EcalThin and EcalThick</comment>
     <constant name="EcalBarrelLayers" 
-	    value="floor((EcalBarrelAvailTotalThickness - EcalFirstLayerThickness) / (EcalThinOneLayerThickness + EcalThickOneLayerThickness))"/>
-    <constant name="EcalBarrelThinLayers"       value="EcalBarrelLayers"/>
-    <constant name="EcalBarrelThickLayers"      value="EcalBarrelLayers"/>
+	      value="floor((EcalBarrel_TotalThickness - EcalLayer1_thickness) / (EcalLayer2_thickness + EcalLayer3_thickness))"/>
+    <constant name="EcalBarrelLayer1_NRepeat"       value="1"/>
+    <constant name="EcalBarrelLayer2_NRepeat"       value="EcalBarrelLayers"/>
+    <constant name="EcalBarrelLayer3_NRepeat"       value="EcalBarrelLayers"/>
+
     <comment> EM Barrel Thickness </comment>
     <constant name="EcalBarrelThickness"
-	    value="EcalFirstLayerThickness + (EcalBarrelThinLayers * EcalThinOneLayerThickness) + (EcalBarrelThickLayers * EcalThickOneLayerThickness)"/>
+	      value="EcalBarrelLayer1_NRepeat*EcalLayer1_thickness + EcalBarrelLayer2_NRepeat * EcalLayer2_thickness + EcalBarrelLayer3_NRepeat * EcalLayer3_thickness"/>
     <constant name="EcalBarrel_rmax"            value="EcalBarrel_rmin + EcalBarrelThickness"/>
 
     <comment> EM Endcap N Layer; same number of layers for EcalThin and EcalThick </comment>
-    <constant name="EcalEndcapLayers" 
-	    value="floor((EcalEndcapAvailTotalThickness - EcalFirstLayerThickness) / (EcalThinOneLayerThickness + EcalThickOneLayerThickness))"/>
-    <constant name="EcalEndcapThinLayers"       value="EcalEndcapLayers"/>
-    <constant name="EcalEndcapThickLayers"      value="EcalEndcapLayers"/>
+    <constant name="EcalEndcapPLayers" 
+	      value="floor((EcalEndcapP_TotalThickness - EcalLayer1_thickness) / (EcalLayer2_thickness + EcalLayer3_thickness))"/>
+    <constant name="EcalEndcapNLayers" 
+	      value="floor((EcalEndcapN_TotalThickness - EcalLayer1_thickness) / (EcalLayer2_thickness + EcalLayer3_thickness))"/>
+    <constant name="EcalEndcapPLayer1_NRepeat"      value="1"/>
+    <constant name="EcalEndcapNLayer1_NRepeat"      value="1"/>
+    <constant name="EcalEndcapPLayer2_NRepeat"      value="EcalEndcapPLayers"/>
+    <constant name="EcalEndcapPLayer3_NRepeat"      value="EcalEndcapPLayers"/>
+    <constant name="EcalEndcapNLayer2_NRepeat"      value="EcalEndcapNLayers"/>
+    <constant name="EcalEndcapNLayer3_NRepeat"      value="EcalEndcapNLayers"/>
+
     <comment> EM Endcap Thickness </comment>
-    <constant name="EcalEndcapThickness"        
-	    value="EcalFirstLayerThickness + (EcalEndcapThinLayers * EcalThinOneLayerThickness) + (EcalEndcapThickLayers * EcalThickOneLayerThickness)"/>
+    <constant name="EcalEndcapPThickness"        
+	      value="EcalEndcapPLayer1_NRepeat*EcalLayer1_thickness + EcalEndcapPLayer2_NRepeat*EcalLayer2_thickness + EcalEndcapPLayer3_NRepeat*EcalLayer3_thickness "/>
+    <constant name="EcalEndcapNThickness"        
+	      value="EcalEndcapNLayer1_NRepeat*EcalLayer1_thickness + EcalEndcapNLayer2_NRepeat*EcalLayer2_thickness + EcalEndcapNLayer3_NRepeat*EcalLayer3_thickness"/>
+
 
     <comment>
       -------------------------------
@@ -420,7 +469,7 @@
     </comment>
     <constant name="HcalBarrel_rmin"          value="EcalBarrel_rmax+10.0*mm"/>
     <constant name="HcalBarrelAvailThickness" value="HcalBarrel_rmax - HcalBarrel_rmin"/>
-    <constant name="HcalBarrelLength"         value="EcalBarrelLength+2.0*EcalEndcapThickness + 10.0*mm "/>
+    <constant name="HcalBarrelLength"         value="EcalBarrelLength + EcalEndcapP_TotalThickness + EcalEndcapN_TotalThickness + 10.0*mm "/>
     <constant name="HcalEndcap_zmin"          value="HcalBarrelLength/2.0"/>
     <constant name="HcalEndcapAvailThickness" value="(SolenoidYokeEndcap_zmin - 10.0 * mm) - HcalEndcap_zmin"/>
 
@@ -489,10 +538,12 @@
       Gaseous RICH Parameters
       -----------------------
     </comment>
-    <constant name="RICHZMin" value="SolenoidYokeEndcap_zmin + 1 * cm"/>
-    <constant name="RICHRMin" value="15 * cm"/>
-    <constant name="RICHRMax" value="60 * cm"/>
-    <constant name="RICHDepth" value="1 * m"/>
+    <constant name="RICHZMin"  value="SiliconTrackerOuterBarrel_zmax + 1 * cm"/>
+    <constant name="RICHRMin"  value="15 * cm"/>
+    <constant name="RICH_rmax0"  value="SiliconTrackerOuterRadius"/>
+    <constant name="RICH_rmax1"  value="EcalBarrel_rmin"/>
+    <constant name="RICH_rmax2"  value="SolenoidBarrel_rmin-2*cm"/>
+    <constant name="RICHDepth" value="0.9*m"/>
 
 
     <comment>
@@ -500,15 +551,6 @@
       Forward Tracker Parameters
       --------------------------
     </comment>
-    <constant name="TempForwardTrackerSpace" value="1.5 * m"/>
-    <constant name="ForwardEcalZMin" value="RICHZMin + RICHDepth + TempForwardTrackerSpace"/>
-    <constant name="ForwardCaloAngle" value="2 * SolenoidYokeChamferAngle"/>
-    <constant name="ForwardEcalRInner" value="10 * cm"/>
-    <constant name="ForwardEcalROuter" value="EcalBarrel_rmin + tan(SolenoidYokeChamferAngle) * (RICHDepth) + tan(ForwardCaloAngle) * (ForwardEcalZMin - RICHZMin - RICHDepth)"/>
-    <constant name="ForwardHcalZMin" value="RICHZMin + RICHDepth + TempForwardTrackerSpace + EcalEndcapThickness + 1 * mm"/>
-    <constant name="ForwardHcalAngle" value="ForwardCaloAngle"/>
-    <constant name="ForwardHcalRInner" value="10 * cm"/>
-    <constant name="ForwardHcalROuter" value="ForwardEcalROuter + tan(ForwardCaloAngle) * (ForwardHcalZMin - ForwardEcalZMin)"/>
 
     <comment>
       --------------------------
@@ -528,10 +570,10 @@
       ce_MRICH Parameters
       --------------------------
     </comment>
-    <constant name="ce_MRICHRMin" value="15*cm"/>
-    <constant name="ce_MRICHRMax" value="100*cm"/>
-    <constant name="ce_MRICHLength" value="15*cm"/>
-    <constant name="ce_MRICHZMin" value="-EcalEndcap_zmin+10.*cm"/>
+    <constant name="ce_MRICHRMin"   value="15*cm"/>
+    <constant name="ce_MRICHRMax"   value="100*cm"/>
+    <constant name="ce_MRICHLength" value="BackwardCherenkovLength"/>
+    <constant name="ce_MRICHZMin"   value="-EcalEndcapN_zmin+ce_MRICHLength"/>
 
     <comment>
       ------------------
@@ -545,7 +587,7 @@
     <constant name="ce_GEM_length"          value="30.0 * cm"/>
     <constant name="ce_GEM_x_pos"           value="0.0 * cm"/>
     <constant name="ce_GEM_y_pos"           value="0.0 * cm"/>
-    <constant name="ce_GEM_z_pos"           value="-SolenoidLength/2.0 + ce_GEM_length/2.0"/>
+    <constant name="ce_GEM_z_pos"           value="-Solenoid_length/2.0 + ce_GEM_length/2.0"/>
     <constant name="ce_GEM_layer"           value="8"/>
     <constant name="ce_GEM_layer_thickness" value="1.0 * cm"/>
 
diff --git a/compact/ecal.xml b/compact/ecal.xml
index be2a125c..30cb8016 100644
--- a/compact/ecal.xml
+++ b/compact/ecal.xml
@@ -9,7 +9,7 @@
     <constant name="CrystalBox_offset"   value="0.000001*mm"/>
     <constant name="CrystalEndcap_x_pos" value="0.0*m"/>
     <constant name="CrystalEndcap_y_pos" value="0.0*m"/>
-    <constant name="CrystalEndcap_z_pos" value="-EcalEndcap_zmin"/>
+    <constant name="CrystalEndcap_z_pos" value="-EcalEndcapN_zmin"/>
   </define>
 
 
@@ -36,21 +36,23 @@
     <detector 
       id="ECalBarrel_ID"
       name="EcalBarrel"
-      type="DD4hep_EcalBarrel"
+      type="refdet_EcalBarrel"
       readout="EcalBarrelHits"
-      calorimeterType="EM_BARREL">
+      calorimeterType="EM_BARREL"
+      offset="EcalBarrel_offset"
+      >
       <dimensions 
         numsides="CaloSides" 
         rmin="EcalBarrel_rmin" 
         z="EcalBarrelLength"/>
       <staves vis="EcalBarrelVis"/>
-      <layer repeat="1">
+      <layer repeat="EcalBarrelLayer1_NRepeat">
         <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
         <slice material="Copper" thickness="EcalCopperThickness"/>
         <slice material="Kapton" thickness="EcalKaptonThickness"/>
         <slice material="Air" thickness="EcalAir1Thickness"/>
       </layer>
-      <layer repeat="EcalBarrelThinLayers">
+      <layer repeat="EcalBarrelLayer2_NRepeat">
         <slice material="TungstenDens24" thickness="EcalThinTungstenThickness"/>
         <slice material="Air" thickness="EcalAir2Thickness"/>
         <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
@@ -58,7 +60,7 @@
         <slice material="Kapton" thickness="EcalKaptonThickness"/>
         <slice material="Air" thickness="EcalAir1Thickness"/>
       </layer>
-      <layer repeat="EcalBarrelThickLayers">
+      <layer repeat="EcalBarrelLayer3_NRepeat">
         <slice material="TungstenDens24" thickness="EcalThickTungstenThickness"/>
         <slice material="Air" thickness="EcalAir2Thickness"/>
         <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
@@ -69,30 +71,30 @@
     </detector>
 
     <comment>
-      -----------------------------
-      Forward Endcap EM Calorimeter
-      -----------------------------
+      ------------------------------------------
+      Forward (Positive Z) Endcap EM Calorimeter
+      ------------------------------------------
       A layered EM calorimeter with tungsten and silicon (or scintillator) strips
     </comment>
     <detector id="ECalEndcapP_ID" 
       name="EcalEndcapP" 
       reflect="false" 
-      type="DD4hep_PolyhedraEndcapCalorimeter2" 
+      type="refdet_PolyhedraEndcapCalorimeter2" 
       readout="EcalEndcapHits" 
       vis="EcalEndcapVis" 
       calorimeterType="EM_ENDCAP" >
       <dimensions 
         numsides="CaloSides" 
-        zmin="EcalEndcap_zmin" 
+        zmin="EcalEndcapP_zmin" 
         rmin="EcalEndcapP_rmin" 
         rmax="EcalBarrel_rmax " />
-      <layer repeat="1">
+      <layer repeat="EcalEndcapPLayer1_NRepeat">
         <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
         <slice material="Copper" thickness="EcalCopperThickness"/>
         <slice material="Kapton" thickness="EcalKaptonThickness"/>
         <slice material="Air" thickness="EcalAir1Thickness"/>
       </layer>
-      <layer repeat="EcalEndcapThinLayers">
+      <layer repeat="EcalEndcapPLayer2_NRepeat">
         <slice material="TungstenDens24" thickness="EcalThinTungstenThickness"/>
         <slice material="Air" thickness="EcalAir2Thickness"/>
         <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
@@ -100,7 +102,7 @@
         <slice material="Kapton" thickness="EcalKaptonThickness"/>
         <slice material="Air" thickness="EcalAir1Thickness"/>
       </layer>
-      <layer repeat="EcalEndcapThickLayers">
+      <layer repeat="EcalEndcapPLayer3_NRepeat">
         <slice material="TungstenDens24" thickness="EcalThickTungstenThickness"/>
         <slice material="Air" thickness="EcalAir2Thickness"/>
         <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
@@ -110,7 +112,6 @@
       </layer>
     </detector>
 
-
     <comment>
       -------------------------------
       Backwards Endcap EM Calorimeter
@@ -126,16 +127,16 @@
       calorimeterType="EM_ENDCAP">
       <dimensions 
         numsides="CaloSides" 
-        zmin="EcalEndcap_zmin" 
+        zmin="EcalEndcapN_zmin" 
         rmin="EcalEndcapN_rmin" 
         rmax="EcalBarrel_rmax " />
-      <layer repeat="1">
+      <layer repeat="EcalEndcapPLayer1_NRepeat">
         <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
         <slice material="Copper" thickness="EcalCopperThickness"/>
         <slice material="Kapton" thickness="EcalKaptonThickness"/>
         <slice material="Air" thickness="EcalAir1Thickness"/>
       </layer>
-      <layer repeat="EcalEndcapThinLayers">
+      <layer repeat="EcalEndcapPLayer2_NRepeat">
         <slice material="TungstenDens24" thickness="EcalThinTungstenThickness"/>
         <slice material="Air" thickness="EcalAir2Thickness"/>
         <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
@@ -143,7 +144,7 @@
         <slice material="Kapton" thickness="EcalKaptonThickness"/>
         <slice material="Air" thickness="EcalAir1Thickness"/>
       </layer>
-      <layer repeat="EcalEndcapThickLayers">
+      <layer repeat="EcalEndcapPLayer3_NRepeat">
         <slice material="TungstenDens24" thickness="EcalThickTungstenThickness"/>
         <slice material="Air" thickness="EcalAir2Thickness"/>
         <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
@@ -179,6 +180,4 @@
   <plugins>
   </plugins>
 
-<fields>
-</fields>
 </lccdd>
diff --git a/compact/forward_rich.xml b/compact/forward_rich.xml
index d94e9e16..ca0b4ed5 100644
--- a/compact/forward_rich.xml
+++ b/compact/forward_rich.xml
@@ -5,19 +5,44 @@
 
   <detectors>
     <detector id="ForwardRICH_ID" name="ForwardRICH" type="refdet_ForwardRICH" readout="ForwardRICHHits" vis="BlueVis">
-      <dimensions z0="RICHZMin" length="RICHDepth+20*cm" rmin="RICHRMin" rmax1="RICHRMax*cm" rmax2="RICHRMin+80*cm"/>
+      <dimensions 
+        z0="RICHZMin" 
+        snout_length="RICHLength - RICHDepth"
+        length="RICHLength" 
+        rmin="RICHRMin" 
+        rmax0="RICH_rmax0" 
+        rmax1="RICH_rmax1" 
+        rmax2="RICH_rmax2"/>
       <radiator material="N2cherenkov" />
-      <mcppmt zdiff="15.0*cm" rmin="SolenoidYokeEndcapP_rmin - 10*cm" rmax="SolenoidYokeEndcapP_rmin + 80*cm" rtol="1.0*cm" vis="BlueVis"
-              module_size="10*cm" module_gap="0.2*cm" thickness="1.0*cm" material="Quartz" />
-      <tank zdiff="5.0*cm" length="RICHDepth" gas="N2cherenkov" vis="GreenVis"
-            rmin="RICHRMin" rmax1="RICHRMin+40*cm" rmax2="RICHRMin+80*cm" />
-      <mirror zdiff="RICHDepth+7.0*cm" thickness="1*mm" material="PyrexGlass" vis="GrayVis">
-        <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICHRMin+80*cm" phiw="59*degree" rotz="0*degree" />
-        <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICHRMin+80*cm" phiw="59*degree" rotz="60*degree" />
-        <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICHRMin+80*cm" phiw="59*degree" rotz="120*degree" />
-        <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICHRMin+80*cm" phiw="59*degree" rotz="180*degree" />
-        <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICHRMin+80*cm" phiw="59*degree" rotz="240*degree" />
-        <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICHRMin+80*cm" phiw="59*degree" rotz="300*degree" />
+      <tank 
+        length="RICHDepth" 
+        gas="N2cherenkov"
+        vis="GreenVis"
+        rmin="RICHRMin"
+        rmax1="RICH_rmax1"
+        rmax2="RICH_rmax2" />
+      <comment> What are the following MCP-PMT parameters?</comment>
+      <mcppmt 
+        z0="-20.0*cm" 
+        rmin="RICH_rmax1" 
+        rmax="RICH_rmax2" 
+        rtol="1.0*cm" 
+        vis="BlueVis"
+        module_size="10*cm" 
+        module_gap="0.2*cm" 
+        thickness="1.0*cm" 
+        material="Quartz" />
+      <mirror 
+        z0="RICHLength - 40*cm" 
+        thickness="1*mm" 
+        material="PyrexGlass" 
+        vis="GrayVis">
+        <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICH_rmax1" phiw="59*degree" rotz="0*degree" />
+        <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICH_rmax1" phiw="59*degree" rotz="60*degree" />
+        <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICH_rmax1" phiw="59*degree" rotz="120*degree" />
+        <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICH_rmax1" phiw="59*degree" rotz="180*degree" />
+        <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICH_rmax1" phiw="59*degree" rotz="240*degree" />
+        <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICH_rmax1" phiw="59*degree" rotz="300*degree" />
       </mirror>
     </detector>
   </detectors>
diff --git a/compact/refdetector_defs.xml b/compact/refdetector_defs.xml
deleted file mode 100644
index 067c46da..00000000
--- a/compact/refdetector_defs.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-  <!-- Define parameter -->
-  <define>
-    <constant name="world_side" value="50*m"/>
-    <constant name="world_x"    value="world_side"/>
-    <constant name="world_y"    value="world_side"/>
-    <constant name="world_z"    value="world_side"/>
-
-    <constant name="tracker_region_zmax" value="6 * m"/>
-    <constant name="tracker_region_rmax" value="6 * m"/>
-
-  </define>
diff --git a/compact/solenoid.xml b/compact/solenoid.xml
index 42ec2920..1a7ddd8d 100644
--- a/compact/solenoid.xml
+++ b/compact/solenoid.xml
@@ -79,7 +79,7 @@
         inner_z="SolenoidBarrel_zmax + SolenoidEndPlateGapThickness" 
         inner_r="SolenoidYokeEndcapP_rmin" 
         outer_r="SolenoidBarrel_rmax">
-        <slice material="Steel235" thickness="SolenoidYokeEndcapThickness/2.0" vis="SolenoidYokeVis" />
+        <slice material="Steel235" thickness="SolenoidYokeEndcap_thickness/2.0" vis="SolenoidYokeVis" />
       </layer>
     </detector>
     <!--
diff --git a/reference_detector.xml b/reference_detector.xml
index c65d5a7d..6d46ffad 100644
--- a/reference_detector.xml
+++ b/reference_detector.xml
@@ -13,9 +13,9 @@
 
   <define>
     <include ref="compact/definitions.xml" />
-    <include ref="eic/eic_defs.xml" />
     <include ref="ip6/ip6_defs.xml" />
     <!--
+    <include ref="eic/eic_defs.xml" />
     -->
   </define>
 
@@ -114,21 +114,20 @@
   <include ref="reference_detector/vertex_tracker.xml"/>
   <include ref="compact/silicon_tracker.xml"/>
   -->
-  <include ref="compact/cb_CTD_Si.xml"/>
   <include ref="ip6/beampipe.xml"/>
-  <include ref="compact/ffi_ZDC.xml"/>
   <include ref="compact/solenoid.xml"/>
   <include ref="compact/ecal.xml"/>
-  <include ref="compact/hcal.xml"/>
-  <include ref="compact/forward_rich.xml"/>
+  <include ref="compact/cb_CTD_Si.xml"/>
   <include ref="compact/ce_mrich.xml"/>
   <include ref="compact/ce_GEM.xml"/>
+  <include ref="compact/ffi_ZDC.xml"/>
+
   <!--
+  <include ref="compact/forward_rich.xml"/>
+  <include ref="compact/hcal.xml"/>
   <include ref="compact/roman_pots.xml"/>
   -->
   <include ref="eic/forward_ion_beamline.xml"/>
-  <!--
-  -->
 
   <detectors>
   </detectors>
diff --git a/scripts/view1/generate_eps b/scripts/view1/generate_eps
index c863fbad..aae587cb 100755
--- a/scripts/view1/generate_eps
+++ b/scripts/view1/generate_eps
@@ -47,6 +47,7 @@ set -- "${POSITIONAL[@]}" # restore positional parameters
 # Side  view
 dawncut 1 0 0 1 ${INPUT_FILE} ${FILE_TAG}_temp0.prim 
 dawncut -1 0 0 1 ${FILE_TAG}_temp0.prim  ${FILE_TAG}.prim
+../../bin/dawn_tweak --mag 10 
 dawn -d ${FILE_TAG}.prim 
 ps2pdf ${FILE_TAG}.eps ${FILE_TAG}_full.pdf
 gs -o ${FILE_TAG}.pdf -sDEVICE=pdfwrite \
@@ -59,7 +60,7 @@ pdftoppm ${FILE_TAG}.pdf ${FILE_TAG} -png -singlefile -cropbox
 # Top view
 dawncut 0 1 0 1 ${INPUT_FILE} ${FILE_TAG}_temp0.prim 
 dawncut 0 -1 0 1 ${FILE_TAG}_temp0.prim  ${FILE_TAG}.prim
-../../bin/dawn_tweak --theta 270
+../../bin/dawn_tweak --theta 270 --mag 20
 dawn -d ${FILE_TAG}.prim 
 ps2pdf ${FILE_TAG}.eps ${FILE_TAG}_top_full.pdf
 gs -o ${FILE_TAG}_top.pdf -sDEVICE=pdfwrite \
diff --git a/src/EcalBarrel_geo.cpp b/src/EcalBarrel_geo.cpp
new file mode 100644
index 00000000..4f3862df
--- /dev/null
+++ b/src/EcalBarrel_geo.cpp
@@ -0,0 +1,164 @@
+//==========================================================================
+//  AIDA Detector description implementation 
+//--------------------------------------------------------------------------
+// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
+// All rights reserved.
+//
+// For the licensing terms see $DD4hepINSTALL/LICENSE.
+// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
+//
+// Author     : M.Frank
+//
+//==========================================================================
+//
+// Specialized generic detector constructor
+// 
+//==========================================================================
+#include "DD4hep/DetFactoryHelper.h"
+#include "XML/Layering.h"
+
+using namespace std;
+using namespace dd4hep;
+using namespace dd4hep::detail;
+
+static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens)  {
+  static double tolerance = 0e0;
+  Layering      layering (e);
+  xml_det_t     x_det     = e;
+  Material      air       = description.air();
+  int           det_id    = x_det.id();
+  string        det_name  = x_det.nameStr();
+  xml_comp_t    x_staves  = x_det.staves();
+  xml_comp_t    x_dim     = x_det.dimensions();
+  int           nsides    = x_dim.numsides();
+  double        inner_r   = x_dim.rmin();
+  double        dphi      = (2*M_PI/nsides);
+  double        hphi      = dphi/2;
+  double        mod_z     = layering.totalThickness();
+  double        outer_r   = inner_r + mod_z;
+  double        totThick  = mod_z;
+  double        offset    = x_det.attr<double>(_Unicode(offset));
+  DetElement    sdet      (det_name,det_id);
+  Volume        motherVol = description.pickMotherVolume(sdet);
+  PolyhedraRegular hedra  (nsides,inner_r,inner_r+totThick+tolerance*2e0,x_dim.z());
+  Volume        envelope  (det_name,hedra,air);
+  PlacedVolume  env_phv   = motherVol.placeVolume(envelope,Transform3D(Translation3D(0,0,offset)*RotationZ(M_PI/nsides)));
+
+  env_phv.addPhysVolID("system",det_id);
+  env_phv.addPhysVolID("barrel",0);
+  sdet.setPlacement(env_phv);
+
+  DetElement    stave_det("stave0",det_id);
+  double dx = 0.0; //mod_z / std::sin(dphi); // dx per layer
+    
+  // Compute the top and bottom face measurements.
+  double trd_x2 = (2 * std::tan(hphi) * outer_r - dx)/2 - tolerance;
+  double trd_x1 = (2 * std::tan(hphi) * inner_r + dx)/2 - tolerance;
+  double trd_y1 = x_dim.z()/2 - tolerance;
+  double trd_y2 = trd_y1;
+  double trd_z  = mod_z/2 - tolerance;
+		
+  // Create the trapezoid for the stave.
+  Trapezoid trd(trd_x1, // Outer side, i.e. the "short" X side.
+                trd_x2, // Inner side, i.e. the "long"  X side.
+                trd_y1, // Corresponds to subdetector (or module) Z.
+                trd_y2, //
+                trd_z); // Thickness, in Y for top stave, when rotated.
+
+  Volume mod_vol("stave",trd,air);
+
+  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_x1; // Starting X dimension for the layer.
+    double l_pos_z  = -(layering.totalThickness() / 2);
+
+    // Loop over the sets of layer elements in the detector.
+    int l_num = 1;
+    for(xml_coll_t li(x_det,_U(layer)); li; ++li)  {
+      xml_comp_t x_layer = li;
+      int repeat = x_layer.repeat();
+      // Loop over number of repeats for this layer.
+      for (int j=0; j<repeat; j++)    {
+        string l_name = _toString(l_num,"layer%d");
+        double l_thickness = layering.layer(l_num-1)->thickness();  // Layer's thickness.
+
+        Position   l_pos(0,0,l_pos_z+l_thickness/2);      // Position of the layer.
+        Box        l_box(l_dim_x-tolerance,stave_z-tolerance,l_thickness / 2-tolerance);
+        Volume     l_vol(l_name,l_box,air);
+        DetElement layer(stave_det, l_name, det_id);
+
+        // Loop over the sublayers or slices for this layer.
+        int s_num = 1;
+        double s_pos_z = -(l_thickness / 2);
+        for(xml_coll_t si(x_layer,_U(slice)); si; ++si)  {
+          xml_comp_t x_slice = si;
+          string     s_name  = _toString(s_num,"slice%d");
+          double     s_thick = x_slice.thickness();
+          Box        s_box(l_dim_x-tolerance,stave_z-tolerance,s_thick / 2-tolerance);
+          Volume     s_vol(s_name,s_box,description.material(x_slice.materialStr()));
+          DetElement slice(layer,s_name,det_id);
+
+          if ( x_slice.isSensitive() ) {
+            s_vol.setSensitiveDetector(sens);
+          }
+          slice.setAttributes(description,s_vol,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
+
+          // Slice placement.
+          PlacedVolume slice_phv = l_vol.placeVolume(s_vol,Position(0,0,s_pos_z+s_thick/2));
+          slice_phv.addPhysVolID("slice", s_num);
+          slice.setPlacement(slice_phv);
+          // Increment Z position of slice.
+          s_pos_z += s_thick;
+                                        
+          // Increment slice number.
+          ++s_num;
+        }        
+
+        // Set region, limitset, and vis of layer.
+        layer.setAttributes(description,l_vol,x_layer.regionStr(),x_layer.limitsStr(),x_layer.visStr());
+
+        PlacedVolume layer_phv = mod_vol.placeVolume(l_vol,l_pos);
+        layer_phv.addPhysVolID("layer", l_num);
+        layer.setPlacement(layer_phv);
+        // Increment to next layer Z position.
+        double xcut = l_thickness * tan_hphi;
+        l_dim_x += xcut;
+        l_pos_z += l_thickness;          
+        ++l_num;
+      }
+    }
+  }
+
+  // Set stave visualization.
+  if ( x_staves )   {
+    mod_vol.setVisAttributes(description.visAttributes(x_staves.visStr()));
+  }
+  // Phi start for a stave.
+  double phi = M_PI / nsides;
+  double mod_x_off = dx / 2;             // Stave X offset, derived from the dx.
+  double mod_y_off = inner_r + mod_z/2;  // Stave Y offset
+
+  // Create nsides staves.
+  for (int i = 0; i < nsides; i++, phi -= dphi)      { // i is module number
+    // Compute the stave position
+    double m_pos_x = mod_x_off * std::cos(phi) - mod_y_off * std::sin(phi);
+    double m_pos_y = mod_x_off * std::sin(phi) + mod_y_off * std::cos(phi);
+    Transform3D tr(RotationZYX(0,phi,M_PI*0.5),Translation3D(-m_pos_x,-m_pos_y,0));
+    PlacedVolume pv = envelope.placeVolume(mod_vol,tr);
+    pv.addPhysVolID("system",det_id);
+    pv.addPhysVolID("barrel",0);
+    pv.addPhysVolID("module",i+1);
+    DetElement sd = i==0 ? stave_det : stave_det.clone(_toString(i,"stave%d"));
+    sd.setPlacement(pv);
+    sdet.add(sd);
+  }
+
+  // Set envelope volume attributes.
+  envelope.setAttributes(description,x_det.regionStr(),x_det.limitsStr(),x_det.visStr());
+  return sdet;
+}
+
+DECLARE_DETELEMENT(refdet_EcalBarrel,create_detector)
diff --git a/src/ForwardRICH_geo.cpp b/src/ForwardRICH_geo.cpp
index 3dc6417b..b88bcd7c 100644
--- a/src/ForwardRICH_geo.cpp
+++ b/src/ForwardRICH_geo.cpp
@@ -36,17 +36,20 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
     xml::Component rads = detElem.child(_Unicode(radiator));
     xml::Component mir = detElem.child(_Unicode(mirror));
     xml::Component mcp = detElem.child(_Unicode(mcppmt));
+    xml::Component tank = detElem.child(_Unicode(tank));
 
     // dimensions
     double z0 = dims.z0();
     double length = dims.length();
     double rmin = dims.rmin();
+    double rmax0 = dims.attr<double>(_Unicode(rmax0));
     double rmax1 = dims.attr<double>(_Unicode(rmax1));
     double rmax2 = dims.attr<double>(_Unicode(rmax2));
+    double snout_length = dims.attr<double>(_Unicode(snout_length));
 
     // mirror setting
     auto mThick = mir.thickness();
-    auto mirZ = mir.attr<double>(_Unicode(zdiff));
+    auto mirZ = mir.attr<double>(_Unicode(z0));
 
     // mcppmt setting
     auto pRmin = mcp.rmin();
@@ -55,27 +58,32 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
     auto pSize = mcp.attr<double>(_Unicode(module_size));
     auto pGap = mcp.attr<double>(_Unicode(module_gap));
     auto pTol = mcp.attr<double>(_Unicode(rtol));
-    auto pZ = mcp.attr<double>(_Unicode(zdiff));
+    auto pZ = mcp.attr<double>(_Unicode(z0));
+
+    // tank parameters
+    double tank_length = length - snout_length;
 
     // materials
     auto mirMat = desc.material(mir.materialStr());
     auto gasMat = desc.material(rads.materialStr());
     auto mcpMat = desc.material(mcp.materialStr());
 
+    double front_offset = snout_length+tank_length/2.0;
+
     // constants
-    auto richCenterAngle = std::atan((rmin + (rmax2 - rmin)/2.)/mirZ);
+    auto richCenterAngle = std::atan((rmin + (rmax1 - rmin)/2.)/(front_offset+mirZ));
     //std::cout << richCenterAngle*180./M_PI << std::endl;
 
     // an envelope for the detector
     // use a complicated shape to avoid conflict with the other parts
     // cone for radiator and the first set of mirrors
     double halfLength = length/2.;
-    Cone env1(halfLength, rmin, rmax1, rmin, rmax2);
+    Cone env1(snout_length/2.0, rmin, rmax0, rmin, rmax1);
     // envelope for detection plane
     // Cone env2(halfLength - pZ/2., rmin, pRmax, rmin, rmax2);
-    Tube env2(rmin, pRmax + pTol + pGap + 1.0*cm, (length - pZ)/2., 0., 2*M_PI);
+    Tube env2(rmin, pRmax + pTol + pGap + 1.0*cm, tank_length/2., 0., 2*M_PI);
 
-    UnionSolid envShape(env1, env2, Position(0., 0., pZ));
+    UnionSolid envShape(env2, env1, Position(0., 0., -tank_length/2.-snout_length/2));
 
     Volume envVol(detName + "_envelope", envShape, gasMat);
     envVol.setVisAttributes(desc.visAttributes(detElem.visStr()));
@@ -112,7 +120,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
             double rotY = -std::asin(focus/curve);
             mirVol.setSolid(Sphere(curve, curve + mThick, mTheta1, mTheta2, 0., wphi));
             // action is in a reverse order
-            Transform3D tr = Translation3D(0., 0., mirZ - halfLength)   // move for z position
+            Transform3D tr = Translation3D(0., 0., mirZ - front_offset)   // move for z position
                            * RotationZ(rotZ)                            // rotate phi angle
                            * RotationY(rotY)                            // rotate for focus point
                            * RotationX(180*degree)
@@ -122,7 +130,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
         // plane mirror
         } else {
             mirVol.setSolid(Tube(mRmin, mRmax, mThick/2.0, 0., wphi));
-            Transform3D tr = Translation3D(0., 0., mirZ - halfLength)   // move for z position
+            Transform3D tr = Translation3D(0., 0., mirZ - front_offset)   // move for z position
                            * RotationZ(rotZ)                            // rotate phi angle
                            * RotationZ(-wphi/2.);                       // center phi angle to 0. (-wphi/2., wphi/2.)
             mirPV = envVol.placeVolume(mirVol, tr);
@@ -152,11 +160,11 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
 
     // photo-detector plane envelope
     for (size_t ipd = 0; ipd < 6; ++ipd) {
-        double phmin = -M_PI/6.;
-        double phmax = M_PI/6.;
+        double phmin = -M_PI/6.5; // added 0.5 to make it smaller
+        double phmax = M_PI/6.5;
         Tube pdEnvShape(pRmin - pTol - pGap, pRmax + pTol + pGap, pThick/2.0 + 0.1*cm, phmin, phmax);
         Volume pdVol("pd_envelope", pdEnvShape, desc.material("AirOptical"));
-        auto points = ref::utils::fillSquares({0., 0.}, pSize + pGap, pRmin - pTol - pGap, pRmax + pTol + pGap, phmin, phmax);
+        auto points = ref::utils::fillSquares({0., 0.}, pSize + pGap, pRmin + pTol + pGap, pRmax + pTol + pGap, phmin, phmax);
         for (size_t i = 0; i < points.size(); ++i) {
             auto pt = points[i];
             auto mcpPV = pdVol.placeVolume(mcpVol, Position(pt.x(), pt.y(), 0.));
@@ -164,7 +172,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
             DetElement mcpDE(det, Form("MCPPMT_DE%d_%d", ipd + 1, i + 1), i + 1);
             mcpDE.setPlacement(mcpPV);
         }
-        Transform3D tr = Translation3D(0., 0., -halfLength + pZ + pThick/2.0)   // move for z position
+        Transform3D tr = Translation3D(0., 0., -front_offset + pZ + pThick/2.0)   // move for z position
                         * RotationZ(ipd*M_PI/3.)        // rotate phi angle
                         * RotationY(-richCenterAngle);  // rotate to perpendicular position
         auto pdPV = envVol.placeVolume(pdVol, tr);
diff --git a/src/PolyhedraEndcapCalorimeter2_geo.cpp b/src/PolyhedraEndcapCalorimeter2_geo.cpp
index 3469a1c6..304961cf 100644
--- a/src/PolyhedraEndcapCalorimeter2_geo.cpp
+++ b/src/PolyhedraEndcapCalorimeter2_geo.cpp
@@ -37,6 +37,11 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
     Volume endcapVol("endcap", PolyhedraRegular(numsides, rmin, rmax, totalThickness), air);
     DetElement endcap("endcap", det_id);
 
+    std::cout << "totalThickness = " << totalThickness << "\n";
+    std::cout << "zmin = " << zmin << "\n";
+    std::cout << "rmin = " << rmin << "\n";
+    std::cout << "rmax = " << rmax << "\n";
+    std::cout << "nlayers = " << std::size(layering.layers()) << "\n";
     int l_num = 1;
     int layerType = 0;
     double layerZ = -totalThickness / 2;
@@ -44,55 +49,59 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
     endcapVol.setAttributes(description, x_det.regionStr(), x_det.limitsStr(), x_det.visStr());
 
     for (xml_coll_t xc(x_det, _U(layer)); xc; ++xc) {
-        xml_comp_t x_layer = xc;
-        double l_thick = layering.layer(l_num - 1)->thickness();
-        string l_name = _toString(layerType, "layer%d");
-        int l_repeat = x_layer.repeat();
-        Volume l_vol(l_name, PolyhedraRegular(numsides, rmin, rmax, l_thick), air);
-        vector<PlacedVolume> sensitives;
+      std::cout << "l_num = " << l_num << "\n";
+      std::cout << "xc = " << xc << "\n";
+      xml_comp_t           x_layer  = xc;
+      double               l_thick  = layering.layer(l_num - 1)->thickness();
+      std::cout << "xc = " << xc << "\n";
+      string               l_name   = _toString(layerType, "layer%d");
+      int                  l_repeat = x_layer.repeat();
+      Volume               l_vol(l_name, PolyhedraRegular(numsides, rmin, rmax, l_thick), air);
+      vector<PlacedVolume> sensitives;
 
-        int s_num = 1;
-        double sliceZ = -l_thick / 2;
-        for (xml_coll_t xs(x_layer, _U(slice)); xs; ++xs) {
-            xml_comp_t x_slice = xs;
-            string s_name = _toString(s_num, "slice%d");
-            double s_thick = x_slice.thickness();
-            Material s_mat = description.material(x_slice.materialStr());
-            Volume s_vol(s_name, PolyhedraRegular(numsides, rmin, rmax, s_thick), s_mat);
+      int    s_num  = 1;
+      double sliceZ = -l_thick / 2;
+      for (xml_coll_t xs(x_layer, _U(slice)); xs; ++xs) {
+        xml_comp_t x_slice = xs;
+        string     s_name  = _toString(s_num, "slice%d");
+        double     s_thick = x_slice.thickness();
+        Material   s_mat   = description.material(x_slice.materialStr());
+        Volume     s_vol(s_name, PolyhedraRegular(numsides, rmin, rmax, s_thick), s_mat);
 
-            s_vol.setVisAttributes(description.visAttributes(x_slice.visStr()));
-            sliceZ += s_thick / 2;
-            PlacedVolume s_phv = l_vol.placeVolume(s_vol, Position(0, 0, sliceZ));
-            s_phv.addPhysVolID("slice", s_num);
-            if (x_slice.isSensitive()) {
-                sens.setType("calorimeter");
-                s_vol.setSensitiveDetector(sens);
-                sensitives.push_back(s_phv);
-            }
-            sliceZ += s_thick / 2;
-            s_num++;
+        s_vol.setVisAttributes(description.visAttributes(x_slice.visStr()));
+        sliceZ += s_thick / 2;
+        PlacedVolume s_phv = l_vol.placeVolume(s_vol, Position(0, 0, sliceZ));
+        s_phv.addPhysVolID("slice", s_num);
+        if (x_slice.isSensitive()) {
+          sens.setType("calorimeter");
+          s_vol.setSensitiveDetector(sens);
+          sensitives.push_back(s_phv);
         }
-        l_vol.setVisAttributes(description.visAttributes(x_layer.visStr()));
-        if (l_repeat <= 0) throw std::runtime_error(x_det.nameStr() + "> Invalid repeat value");
-        for (int j = 0; j < l_repeat; ++j) {
-            string phys_lay = _toString(l_num, "layer%d");
-            layerZ += l_thick / 2;
-            DetElement layer_elt(endcap, phys_lay, l_num);
-            PlacedVolume pv = endcapVol.placeVolume(l_vol, Position(0, 0, layerZ));
-            pv.addPhysVolID("layer", l_num);
-            layer_elt.setPlacement(pv);
-            for (size_t ic = 0; ic < sensitives.size(); ++ic) {
-                PlacedVolume sens_pv = sensitives[ic];
-                DetElement comp_elt(layer_elt, sens_pv.volume().name(), l_num);
-                comp_elt.setPlacement(sens_pv);
-            }
-            layerZ += l_thick / 2;
-            ++l_num;
+        sliceZ += s_thick / 2;
+        s_num++;
+      }
+      l_vol.setVisAttributes(description.visAttributes(x_layer.visStr()));
+      if (l_repeat <= 0)
+        throw std::runtime_error(x_det.nameStr() + "> Invalid repeat value");
+      for (int j = 0; j < l_repeat; ++j) {
+        string phys_lay = _toString(l_num, "layer%d");
+        layerZ += l_thick / 2;
+        DetElement   layer_elt(endcap, phys_lay, l_num);
+        PlacedVolume pv = endcapVol.placeVolume(l_vol, Position(0, 0, layerZ));
+        pv.addPhysVolID("layer", l_num);
+        layer_elt.setPlacement(pv);
+        for (size_t ic = 0; ic < sensitives.size(); ++ic) {
+          PlacedVolume sens_pv = sensitives[ic];
+          DetElement   comp_elt(layer_elt, sens_pv.volume().name(), l_num);
+          comp_elt.setPlacement(sens_pv);
         }
-        ++layerType;
+        layerZ += l_thick / 2;
+        ++l_num;
+      }
+      ++layerType;
     }
 
-    double z_pos = zmin + totalThickness / 2;
+    double       z_pos = zmin + totalThickness / 2;
     PlacedVolume pv;
     // Reflect it.
     Assembly assembly(det_name);
diff --git a/src/TestDetector.cpp b/src/TestDetector.cpp
deleted file mode 100644
index 5669184b..00000000
--- a/src/TestDetector.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-#include <XML/Helper.h>
-
-using namespace dd4hep;
-
-static Ref_t createDetector(Detector& desc, xml_h handle, SensitiveDetector sens) {
-  xml::DetElement detElem = handle;
-  std::string     detName = detElem.nameStr();
-  int             detID   = detElem.id();
-
-  xml::Component dims      = detElem.dimensions();
-  double         rInner    = dims.inner_radius();
-  double         rMin      = dims.rmin();
-  double         thickness = dims.thickness();
-  double         innerZ    = dims.inner_z();
-  double         angle     = dims.angle();
-
-  Material mat = desc.material(detElem.materialStr());
-
-  Tube             outerTubeShape(rMin, rInner + thickness, innerZ + thickness);
-  Tube             innerTubeShape(0, rInner, innerZ);
-  SubtractionSolid unchamferedShape(outerTubeShape, innerTubeShape);
-  Cone             chamferShape(thickness, 0, rMin, 0, rMin + 2 * tan(angle) * thickness);
-  SubtractionSolid detShape(unchamferedShape, chamferShape, Position(0, 0, innerZ + thickness));
-  Volume           detVol(detName, detShape, mat);
-
-  detVol.setVisAttributes(desc.visAttributes(detElem.visStr()));
-
-  DetElement   det(detName, detID);
-  Volume       motherVol = desc.pickMotherVolume(det);
-  PlacedVolume detPV     = motherVol.placeVolume(detVol);
-  det.setPlacement(detPV);
-  return det;
-}
-
-// clang-format off
-DECLARE_DETELEMENT(TestDetector, createDetector)
diff --git a/src/cb_CTD_Si.cpp b/src/cb_CTD_Si.cpp
index 4aed32b4..a6a683eb 100644
--- a/src/cb_CTD_Si.cpp
+++ b/src/cb_CTD_Si.cpp
@@ -1,4 +1,9 @@
 #include <XML/Helper.h>
+#include "DDRec/Surface.h"
+#include "DDRec/DetectorData.h"
+#include "DD4hep/OpticalSurfaces.h"
+#include "DD4hep/DetFactoryHelper.h"
+#include "DD4hep/Printout.h"
 //////////////////////////////////
 // Central Barrel Tracker Silicon
 //////////////////////////////////
diff --git a/src/cb_Solenoid.cpp b/src/cb_Solenoid.cpp
deleted file mode 100644
index 623c5204..00000000
--- a/src/cb_Solenoid.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <XML/Helper.h>
-///////////////////////////
-// Central Barrel Solenoid
-///////////////////////////
-
-using namespace dd4hep;
-
-static Ref_t createDetector(Detector& desc, xml_h handle, SensitiveDetector sens)
-{
-  xml::DetElement detElem = handle;
-  std::string     detName = detElem.nameStr();
-  int             detID   = detElem.id();
-
-  xml::Component dims = detElem.dimensions();
-  double SizeZ  = dims.z();     // Size in Z direction
-  double ROut   = dims.rmax();  // Outer diameter
-  double RIn    = dims.rmin();  // Inner diameter
-  double ShiftZ = dims.delta();
-  Material mat = desc.material(detElem.materialStr());
-
-  Tube   cb_Solenoid_GVol_Solid(RIn, ROut, SizeZ / 2., 0., 360 * deg);
-  Volume detVol("cb_Solenoid_GVol_Logic", cb_Solenoid_GVol_Solid, mat);
-
-  detVol.setVisAttributes(desc.visAttributes(detElem.visStr()));
-
-  DetElement   det(detName, detID);
-  Volume       motherVol = desc.pickMotherVolume(det);
-  Transform3D  tr(RotationZYX(0., 0., 0.), Position(0., 0., ShiftZ));
-  PlacedVolume detPV = motherVol.placeVolume(detVol, tr);
-  det.setPlacement(detPV);
-  return det;
-}
-
-// clang-format off
-DECLARE_DETELEMENT(cb_Solenoid, createDetector)
diff --git a/src/ce_GEM.cpp b/src/ce_GEM.cpp
index 92315945..24e4bff1 100644
--- a/src/ce_GEM.cpp
+++ b/src/ce_GEM.cpp
@@ -1,3 +1,8 @@
+#include "DDRec/Surface.h"
+#include "DDRec/DetectorData.h"
+#include "DD4hep/OpticalSurfaces.h"
+#include "DD4hep/DetFactoryHelper.h"
+#include "DD4hep/Printout.h"
 #include <XML/Helper.h>
 //////////////////////////////////
 // Electron Endcap GEM Tracking
diff --git a/src/ffi_ZDC.cpp b/src/ffi_ZDC.cpp
index 61ca838b..43c31e31 100644
--- a/src/ffi_ZDC.cpp
+++ b/src/ffi_ZDC.cpp
@@ -1,3 +1,8 @@
+#include "DDRec/Surface.h"
+#include "DDRec/DetectorData.h"
+#include "DD4hep/OpticalSurfaces.h"
+#include "DD4hep/DetFactoryHelper.h"
+#include "DD4hep/Printout.h"
 #include <XML/Helper.h>
 ///////////////////////////////////////////
 // Far Forward Ion Zero Degree Calorimeter
-- 
GitLab