diff --git a/.gitignore b/.gitignore
index 96a61480e4e3cbb4d1cda1cc90743187155d5772..b364cf88d73433cb8f67468e10b6e3299934733c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -27,3 +27,5 @@ fieldmaps
 manifest.txt
 acts.txt
 acts2.txt
+
+materials-map.cbor
diff --git a/calibrations/calo_digi_canyonlands.json b/calibrations/calo_digi_canyonlands.json
new file mode 100644
index 0000000000000000000000000000000000000000..f98ff251ddee1e5b63a6543696165820988524a8
--- /dev/null
+++ b/calibrations/calo_digi_canyonlands.json
@@ -0,0 +1,58 @@
+{
+    "ecal_neg_endcap": {
+        "readout": "module",
+        "dynamicRange": "20*GeV",
+        "capacityBitsADC": 14,
+        "pedestalMean": 100,
+        "pedestalSigma": 1,
+        "thresholdValue": 3
+    },
+    "hcal_neg_endcap": {
+        "readout": "tile",
+        "dynamicRange": "20*MeV",
+        "capacityBitsADC": 8,
+        "pedestalMean": 20,
+        "pedestalSigma": 0.3,
+        "thresholdValue": 1
+    },
+    "ecal_pos_endcap": {
+        "readout": "module",
+        "dynamicRange": "3*GeV",
+        "capacityBitsADC": 14,
+        "pedestalMean": 100,
+        "pedestalSigma": 0.7,
+        "thresholdValue": 2
+    },
+    "hcal_pos_endcap": {
+        "readout": "tile",
+        "dynamicRange": "3.6*GeV",
+        "capacityBitsADC": 10,
+        "pedestalMean": 20,
+        "pedestalSigma": 0.8,
+        "thresholdValue": 3
+    },
+    "ecal_barrel_imaging": {
+        "readout": "pixel",
+        "dynamicRange": "3*MeV",
+        "capacityBitsADC": 13,
+        "pedestalMean": 100,
+        "pedestalSigma": 14,
+        "thresholdValue": 50
+    },
+    "ecal_barrel_scfi": {
+        "readout": "light_guide",
+        "dynamicRange": "750*MeV",
+        "capacityBitsADC": 14,
+        "pedestalMean": 20,
+        "pedestalSigma": 0.3,
+        "thresholdValue": 1
+    },
+    "hcal_barrel": {
+        "readout": "tile",
+        "dynamicRange": "20*MeV",
+        "capacityBitsADC": 8,
+        "pedestalMean": 20,
+        "pedestalSigma": 0.3,
+        "thresholdValue": 1
+    }
+}
diff --git a/calibrations/calo_digi_default.json b/calibrations/calo_digi_default.json
new file mode 120000
index 0000000000000000000000000000000000000000..54f309b2bc9e467585089271e738d0477458bbfa
--- /dev/null
+++ b/calibrations/calo_digi_default.json
@@ -0,0 +1 @@
+calo_digi_canyonlands.json
\ No newline at end of file
diff --git a/compact/central_tracker_hybrid_v2.xml b/compact/central_tracker_hybrid_v2.xml
index 2530df0a74f2d5ec178d5bb7579e75006c62f5bc..f9b5899e4d89b14e6790e386bede483d6583c718 100644
--- a/compact/central_tracker_hybrid_v2.xml
+++ b/compact/central_tracker_hybrid_v2.xml
@@ -285,14 +285,14 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="InnerTrackerEndcapMod1_zmin"  value="InnerTrackerEndcap_zmin" />
     <constant name="InnerTrackerEndcapMod1_rmin"  value="InnerTrackerEndcap_rmin" />
     <constant name="InnerTrackerEndcapMod1_rmax"  value="min(InnerTrackerEndcapMod1_zmin * TrackerMainDiagonal_tan * 0.995, SiTrackerCyl_rmin)" />
-    <constant name="InnerTrackerEndcapMod1_x1"    value="2 * InnerTrackerEndcapMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
+    <constant name="InnerTrackerEndcapMod1_x1"    value="2 * InnerTrackerEndcapMod1_rmin * tan(SiTrackerEndcapMod_angle/2)" />
     <constant name="InnerTrackerEndcapMod1_x2"    value="2 * InnerTrackerEndcapMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="InnerTrackerEndcapMod1_y"     value="InnerTrackerEndcapMod1_rmax * cos(SiTrackerEndcapMod_angle/2) - InnerTrackerEndcapMod1_rmin" />
 
     <constant name="InnerTrackerEndcapMod2_zmin"  value="InnerTrackerEndcapMod1_zmin + 1 * InnerTrackerEndcap_offset" />
     <constant name="InnerTrackerEndcapMod2_rmin"  value="InnerTrackerEndcap_rmin" />
     <constant name="InnerTrackerEndcapMod2_rmax"  value="min(InnerTrackerEndcapMod2_zmin * TrackerMainDiagonal_tan * 0.995, SiTrackerCyl_rmin)" />
-    <constant name="InnerTrackerEndcapMod2_x1"    value="2 * InnerTrackerEndcapMod2_rmin * sin(SiTrackerEndcapMod_angle/2)" />
+    <constant name="InnerTrackerEndcapMod2_x1"    value="2 * InnerTrackerEndcapMod2_rmin * tan(SiTrackerEndcapMod_angle/2)" />
     <constant name="InnerTrackerEndcapMod2_x2"    value="2 * InnerTrackerEndcapMod2_rmax * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="InnerTrackerEndcapMod2_y"     value="InnerTrackerEndcapMod2_rmax * cos(SiTrackerEndcapMod_angle/2) - InnerTrackerEndcapMod2_rmin" />
 
@@ -580,7 +580,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="MedialTrackerEndcapPMod1_zmin"  value="MedialTrackerEndcap_zmin" />
     <constant name="MedialTrackerEndcapPMod1_rmin"  value="MedialTrackerEndcapP_rmin" />
     <constant name="MedialTrackerEndcapPMod1_rmax"  value="min(MedialTrackerEndcapPMod1_zmin * TrackerMainDiagonal_tan * 0.995, SiTrackerCyl_rmin)" />
-    <constant name="MedialTrackerEndcapPMod1_x1"    value="2 * MedialTrackerEndcapPMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
+    <constant name="MedialTrackerEndcapPMod1_x1"    value="2 * MedialTrackerEndcapPMod1_rmin * tan(SiTrackerEndcapMod_angle/2)" />
     <constant name="MedialTrackerEndcapPMod1_x2"    value="2 * MedialTrackerEndcapPMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="MedialTrackerEndcapPMod1_y"     value="MedialTrackerEndcapPMod1_rmax * cos(SiTrackerEndcapMod_angle/2) - MedialTrackerEndcapPMod1_rmin" />
 
@@ -591,7 +591,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="MedialTrackerEndcapNMod1_zmin"  value="MedialTrackerEndcap_zmin" />
     <constant name="MedialTrackerEndcapNMod1_rmin"  value="MedialTrackerEndcapN_rmin" />
     <constant name="MedialTrackerEndcapNMod1_rmax"  value="min(MedialTrackerEndcapNMod1_zmin * TrackerMainDiagonal_tan * 0.995, SiTrackerCyl_rmin)" />
-    <constant name="MedialTrackerEndcapNMod1_x1"    value="2 * MedialTrackerEndcapNMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
+    <constant name="MedialTrackerEndcapNMod1_x1"    value="2 * MedialTrackerEndcapNMod1_rmin * tan(SiTrackerEndcapMod_angle/2)" />
     <constant name="MedialTrackerEndcapNMod1_x2"    value="2 * MedialTrackerEndcapNMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="MedialTrackerEndcapNMod1_y"     value="MedialTrackerEndcapNMod1_rmax * cos(SiTrackerEndcapMod_angle/2) - MedialTrackerEndcapNMod1_rmin" />
 
@@ -778,7 +778,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="OuterTrackerEndcapPMod1_zmin" value="OuterTrackerEndcapP_zmin" />
     <constant name="OuterTrackerEndcapPMod1_rmin" value="OuterTrackerEndcapPMod1_zmin * CentralTrackingRegionP_tan * 0.99" />
     <constant name="OuterTrackerEndcapPMod1_rmax"  value="SiTrackerCyl_rmin" />
-    <constant name="OuterTrackerEndcapPMod1_x1"    value="2 * OuterTrackerEndcapPMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
+    <constant name="OuterTrackerEndcapPMod1_x1"    value="2 * OuterTrackerEndcapPMod1_rmin * tan(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapPMod1_x2"    value="2 * OuterTrackerEndcapPMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapPMod1_y"     value="OuterTrackerEndcapPMod1_rmax * cos(SiTrackerEndcapMod_angle/2) - OuterTrackerEndcapPMod1_rmin" />
     <constant name="OuterTrackerEndcapPLayer1_rmin"  value="OuterTrackerEndcapPMod1_rmin - 1*um" />
@@ -788,7 +788,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="OuterTrackerEndcapPMod2_zmin" value="OuterTrackerEndcapP_zmin + 1 * OuterTrackerEndcapP_offset" />
     <constant name="OuterTrackerEndcapPMod2_rmin" value="OuterTrackerEndcapPMod2_zmin * CentralTrackingRegionP_tan * 0.99" />
     <constant name="OuterTrackerEndcapPMod2_rmax"  value="SiTrackerCyl_rmin" />
-    <constant name="OuterTrackerEndcapPMod2_x1"    value="2 * OuterTrackerEndcapPMod2_rmin * sin(SiTrackerEndcapMod_angle/2)" />
+    <constant name="OuterTrackerEndcapPMod2_x1"    value="2 * OuterTrackerEndcapPMod2_rmin * tan(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapPMod2_x2"    value="2 * OuterTrackerEndcapPMod2_rmax * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapPMod2_y"     value="OuterTrackerEndcapPMod2_rmax * cos(SiTrackerEndcapMod_angle/2) - OuterTrackerEndcapPMod2_rmin" />
     <constant name="OuterTrackerEndcapPLayer2_rmin"  value="OuterTrackerEndcapPMod2_rmin - 1*um" />
@@ -798,7 +798,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="OuterTrackerEndcapPMod3_zmin" value="OuterTrackerEndcapP_zmin + 2 * OuterTrackerEndcapP_offset" />
     <constant name="OuterTrackerEndcapPMod3_rmin" value="OuterTrackerEndcapPMod3_zmin * CentralTrackingRegionP_tan * 1.00" />
     <constant name="OuterTrackerEndcapPMod3_rmax"  value="SiTrackerCyl_rmin" />
-    <constant name="OuterTrackerEndcapPMod3_x1"    value="2 * OuterTrackerEndcapPMod3_rmin * sin(SiTrackerEndcapMod_angle/2)" />
+    <constant name="OuterTrackerEndcapPMod3_x1"    value="2 * OuterTrackerEndcapPMod3_rmin * tan(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapPMod3_x2"    value="2 * OuterTrackerEndcapPMod3_rmax * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapPMod3_y"     value="OuterTrackerEndcapPMod3_rmax * cos(SiTrackerEndcapMod_angle/2) - OuterTrackerEndcapPMod3_rmin" />
     <constant name="OuterTrackerEndcapPLayer3_rmin"  value="OuterTrackerEndcapPMod3_rmin - 1*um" />
@@ -816,7 +816,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="OuterTrackerEndcapNMod1_zmin" value="OuterTrackerEndcapN_zmin" />
     <constant name="OuterTrackerEndcapNMod1_rmin" value="OuterTrackerEndcapNMod1_zmin * CentralTrackingRegionN_tan * 1.00" />
     <constant name="OuterTrackerEndcapNMod1_rmax"  value="SiTrackerCyl_rmin" />
-    <constant name="OuterTrackerEndcapNMod1_x1"    value="2 * OuterTrackerEndcapNMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
+    <constant name="OuterTrackerEndcapNMod1_x1"    value="2 * OuterTrackerEndcapNMod1_rmin * tan(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapNMod1_x2"    value="2 * OuterTrackerEndcapNMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapNMod1_y"     value="OuterTrackerEndcapNMod1_rmax * cos(SiTrackerEndcapMod_angle/2) - OuterTrackerEndcapNMod1_rmin" />
     <constant name="OuterTrackerEndcapNLayer1_rmin"  value="OuterTrackerEndcapNMod1_rmin - 1*um" />
@@ -826,7 +826,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="OuterTrackerEndcapNMod2_zmin" value="OuterTrackerEndcapN_zmin + 1 * OuterTrackerEndcapN_offset" />
     <constant name="OuterTrackerEndcapNMod2_rmin" value="OuterTrackerEndcapNMod2_zmin * CentralTrackingRegionN_tan * 1.00" />
     <constant name="OuterTrackerEndcapNMod2_rmax"  value="SiTrackerCyl_rmin" />
-    <constant name="OuterTrackerEndcapNMod2_x1"    value="2 * OuterTrackerEndcapNMod2_rmin * sin(SiTrackerEndcapMod_angle/2)" />
+    <constant name="OuterTrackerEndcapNMod2_x1"    value="2 * OuterTrackerEndcapNMod2_rmin * tan(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapNMod2_x2"    value="2 * OuterTrackerEndcapNMod2_rmax * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapNMod2_y"     value="OuterTrackerEndcapNMod2_rmax * cos(SiTrackerEndcapMod_angle/2) - OuterTrackerEndcapNMod2_rmin" />
     <constant name="OuterTrackerEndcapNLayer2_rmin"  value="OuterTrackerEndcapNMod2_rmin - 1*um" />
@@ -996,14 +996,14 @@ total X0 0.24% per disk layer (4 sectors per disk):
 
     <comment> Parameters for the "ring" GEMS around the silicon tracker, which are all identical </comment>
     <constant name="GEMEndcapRingMod_rmin"          value="SiTrackerSupportCyl_rmax + GEMFrameBotEdge_width" />
-    <constant name="GEMEndcapRingMod_rmax"          value="CentralTrackingRegion_rmax - GEMFrameTopEdge_width * 1.3" />
-    <constant name="GEMEndcapRingMod_x1"            value="2 * GEMEndcapRingMod_rmin * sin(GEMEndcapMod_angle/2)" />
+    <constant name="GEMEndcapRingMod_rmax"          value="min(min(GEMEndcapPDisk1_zmin, GEMEndcapN_zmin) * TrackerMainDiagonal_tan * 0.995, CentralTrackingRegion_rmax) - GEMFrameTopEdge_width" />
+    <constant name="GEMEndcapRingMod_x1"            value="2 * GEMEndcapRingMod_rmin * tan(GEMEndcapMod_angle/2)" />
     <constant name="GEMEndcapRingMod_x2"            value="2 * GEMEndcapRingMod_rmax * sin(GEMEndcapMod_angle/2)" />
     <constant name="GEMEndcapRingMod_y"             value="GEMEndcapRingMod_rmax * cos(GEMEndcapMod_angle/2) - GEMEndcapRingMod_rmin" />
     <constant name="GEMEndcapRingModBotFrame_rmin"  value="SiTrackerSupportCyl_rmax" />
     <constant name="GEMEndcapRingModBotFrame_y"     value="GEMFrameBotEdge_width" />
     <constant name="GEMEndcapRingModBotFrame_rmax"  value="(GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y)/cos(GEMEndcapMod_angle/2)" />
-    <constant name="GEMEndcapRingModBotFrame_x1"    value="2 * GEMEndcapRingModBotFrame_rmin * sin(GEMEndcapMod_angle/2)" />
+    <constant name="GEMEndcapRingModBotFrame_x1"    value="2 * GEMEndcapRingModBotFrame_rmin * tan(GEMEndcapMod_angle/2)" />
     <constant name="GEMEndcapRingModBotFrame_x2"    value="2 * GEMEndcapRingModBotFrame_rmax * sin(GEMEndcapMod_angle/2)" />
     <constant name="GEMEndcapRingModTopFrame_rmin"  value="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y" />
     <constant name="GEMEndcapRingModTopFrame_y"     value="GEMFrameTopEdge_width" />
@@ -1096,40 +1096,6 @@ total X0 0.24% per disk layer (4 sectors per disk):
         <trd x1="GEMSpoke_width/2" x2="GEMSpoke_width/2" z="GEMEndcapRingModSpoke_length/2"/>
         <module_component thickness="GEMSpoke_thickness" material="Mylar" vis="TrackerSupportVis"/>
       </module>
-      <module name="LargeModule" vis="TrackerGEMModuleVis">
-        <trd x1="GEMEndcapLargeMod_x1/2" x2="GEMEndcapLargeMod_x2/2" z="GEMEndcapLargeMod_y/2" />
-        <comment> going from back to front </comment>
-        <module_component name="exit_window"      thickness="GEMMylar_thickness"        material="Mylar" vis="TrackerServiceVis" />
-        <module_component name="exit_region"      thickness="GEMGas_thickness"          material="Ar10CO2"/>
-        <module_component name="readout_cu"       thickness="GEMCuElectrode_thickness"  material="Copper"/>
-        <module_component name="readout_foil"     thickness="GEMKapton_thickness"       material="Kapton"/>
-        <module_component name="induction_region" thickness="GEMGas_thickness"          material="Ar10CO2"/>
-        <module_component name="gem_foil_3_cu"    thickness="GEMCuElectrode_thickness * GEMAreaFactor"  material="Copper"/>
-        <module_component name="gem_foil_3"       thickness="GEMKapton_thickness * GEMAreaFactor"       material="Kapton"/>
-        <module_component name="transfer_region2" thickness="GEMGas_thickness"                          material="Ar10CO2"/>
-        <module_component name="gem_foil_2_cu"    thickness="GEMCuElectrode_thickness * GEMAreaFactor"  material="Copper"/>
-        <module_component name="gem_foil_2"       thickness="GEMKapton_thickness * GEMAreaFactor"       material="Kapton"/>
-        <module_component name="transfer_region1" thickness="GEMGas_thickness"                          material="Ar10CO2"/>
-        <module_component name="gem_foil_1_cu"    thickness="GEMCuElectrode_thickness * GEMAreaFactor"  material="Copper"/>
-        <module_component name="gem_foil_1"       thickness="GEMKapton_thickness * GEMAreaFactor"       material="Kapton"/>
-        <module_component name="drift_region"     thickness="GEMDriftRegion_thickness"                  material="Ar10CO2" sensitive="true"/>
-        <module_component name="cathode_cu"       thickness="GEMCuElectrode_thickness"  material="Copper"/>
-        <module_component name="cathode_foil"     thickness="GEMKapton_thickness"       material="Kapton"/>
-        <module_component name="entrance_region"  thickness="GEMGas_thickness"          material="Ar10CO2"/>
-        <module_component name="entrance_window"  thickness="GEMMylar_thickness"        material="Mylar" vis="TrackerMPGDVis" />
-      </module>
-      <module name="LargeBotFrame" vis="TrackerSupportVis">
-        <trd x1="GEMEndcapLargeModBotFrame_x1/2" x2="GEMEndcapLargeModBotFrame_x2/2" z="GEMEndcapLargeModBotFrame_y/2" />
-        <module_component name="frame" thickness="GEMFrame_thickness" material="CarbonFiber" vis="TrackerSupportVis" />
-      </module>
-      <module name="LargeTopFrame" vis="TrackerSupportVis">
-        <trd x1="GEMEndcapLargeModTopFrame_x1/2" x2="GEMEndcapLargeModTopFrame_x2/2" z="GEMEndcapLargeModTopFrame_y/2" />
-        <module_component name="frame" thickness="GEMFrame_thickness" material="CarbonFiber" vis="TrackerSupportVis" />
-      </module>
-      <module name="LargeSpoke" vis="TrackerSupportVis">
-        <trd x1="GEMSpoke_width/2" x2="GEMSpoke_width/2" z="GEMEndcapLargeModSpoke_length/2"/>
-        <module_component thickness="GEMSpoke_thickness" material="Mylar" vis="TrackerSupportVis"/>
-      </module>
       <layer id="1">
         <envelope vis="TrackerLayerVis"
           rmin="GEMEndcapRingLayer_rmin"
@@ -1138,29 +1104,32 @@ total X0 0.24% per disk layer (4 sectors per disk):
           zstart="GEMEndcapPLayer1_zmin" />
         <layer_material surface="representing" binning="binPhi,binR" bins0="20*GEMEndcapMod_count" bins1="256"/>
         <ring 
-          r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="GEMEndcapMod_dz"
+          r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
           module="RingModule" />
         <ring 
-          r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="GEMEndcapMod_dz"
+          r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingModule" />
+        <ring 
+          r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
           module="RingBotFrame" />
         <ring 
-          r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="GEMEndcapMod_dz"
+          r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingBotFrame" />
+        <ring 
+          r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
           module="RingTopFrame" />
         <ring 
-          r="GEMEndcapRingModSpoke_r"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="0"
-          phi0="GEMEndcapMod_angle/2"
+          r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingTopFrame" />
+        <ring 
+          r="GEMEndcapRingModSpoke_r" zstart="0" dz="0"
+          nmodules="GEMEndcapMod_count/2" phi0="3*GEMEndcapMod_angle/2"
           module="RingSpoke" />
       </layer>
       <layer id="2">
@@ -1171,63 +1140,33 @@ total X0 0.24% per disk layer (4 sectors per disk):
           zstart="GEMEndcapPLayer2_zmin" />
         <layer_material surface="representing" binning="binPhi,binR" bins0="20*GEMEndcapMod_count" bins1="256"/>
         <ring 
-          r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="GEMEndcapMod_dz"
+          r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
           module="RingModule" />
         <ring 
-          r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="GEMEndcapMod_dz"
-          module="RingBotFrame" />
-        <ring 
-          r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="GEMEndcapMod_dz"
-          module="RingTopFrame" />
+          r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingModule" />
         <ring 
-          r="GEMEndcapRingModSpoke_r"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="0"
-          phi0="GEMEndcapMod_angle/2"
-          module="RingSpoke" />
-      </layer>
-      <layer id="3">
-        <envelope vis="TrackerLayerVis"
-          rmin="GEMEndcapLargeLayer_rmin"
-          rmax="GEMEndcapLargeLayer_rmax"
-          length="GEMEndcapLayer_thickness"
-          zstart="GEMEndcapPLayer3_zmin" />
-        <layer_material surface="representing" binning="binPhi,binR" bins0="20*GEMEndcapMod_count" bins1="256"/>
+          r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingBotFrame" />
         <ring 
-          r="GEMEndcapLargeMod_rmin + GEMEndcapLargeMod_y/2"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="GEMEndcapMod_dz"
-          module="LargeModule" />
+          r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingBotFrame" />
         <ring 
-          r="GEMEndcapLargeModBotFrame_rmin + GEMEndcapLargeModBotFrame_y/2"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="GEMEndcapMod_dz"
-          module="LargeBotFrame" />
+          r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingTopFrame" />
         <ring 
-          r="GEMEndcapLargeModTopFrame_rmin + GEMEndcapLargeModTopFrame_y/2"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="GEMEndcapMod_dz"
-          module="LargeTopFrame" />
+          r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingTopFrame" />
         <ring 
-          r="GEMEndcapLargeModSpoke_r"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="0"
-          phi0="GEMEndcapMod_angle/2"
-          module="LargeSpoke" />
+          r="GEMEndcapRingModSpoke_r" zstart="0" dz="0"
+          nmodules="GEMEndcapMod_count/2" phi0="3*GEMEndcapMod_angle/2"
+          module="RingSpoke" />
       </layer>
     </detector>
     <detector
@@ -1313,29 +1252,32 @@ total X0 0.24% per disk layer (4 sectors per disk):
           zstart="GEMEndcapNLayer1_zmin" />
         <layer_material surface="representing" binning="binPhi,binR" bins0="20*GEMEndcapMod_count" bins1="256"/>
         <ring 
-          r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="GEMEndcapMod_dz"
+          r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
           module="RingModule" />
         <ring 
-          r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="GEMEndcapMod_dz"
+          r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingModule" />
+        <ring 
+          r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
           module="RingBotFrame" />
         <ring 
-          r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="GEMEndcapMod_dz"
+          r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingBotFrame" />
+        <ring 
+          r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
           module="RingTopFrame" />
         <ring 
-          r="GEMEndcapRingModSpoke_r"
-          zstart="0"
-          nmodules="GEMEndcapMod_count"
-          dz="0"
-          phi0="GEMEndcapMod_angle/2"
+          r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingTopFrame" />
+        <ring 
+          r="GEMEndcapRingModSpoke_r" zstart="0" dz="0"
+          nmodules="GEMEndcapMod_count/2" phi0="3*GEMEndcapMod_angle/2"
           module="RingSpoke" />
       </layer>
       <layer id="2">
@@ -1346,30 +1288,108 @@ total X0 0.24% per disk layer (4 sectors per disk):
           zstart="GEMEndcapNLayer2_zmin" />
         <layer_material surface="representing" binning="binPhi,binR" bins0="20*GEMEndcapMod_count" bins1="256"/>
         <ring 
-          r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2"
+          r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingModule" />
+        <ring 
+          r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingModule" />
+        <ring 
+          r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingBotFrame" />
+        <ring 
+          r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingBotFrame" />
+        <ring 
+          r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingTopFrame" />
+        <ring 
+          r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz"
+          phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2"
+          module="RingTopFrame" />
+        <ring 
+          r="GEMEndcapRingModSpoke_r" zstart="0" dz="0"
+          nmodules="GEMEndcapMod_count/2" phi0="3*GEMEndcapMod_angle/2"
+          module="RingSpoke" />
+      </layer>
+    </detector>
+    <detector
+      id="TrackerEndcapP_4_ID"
+      name="ForwardGEM"
+      type="athena_TrapEndcapTracker"
+      readout="GEMTrackerEndcapHits"
+      vis="TrackerVis"
+      reflect="false">
+      <module name="LargeModule" vis="TrackerGEMModuleVis">
+        <trd x1="GEMEndcapLargeMod_x1/2" x2="GEMEndcapLargeMod_x2/2" z="GEMEndcapLargeMod_y/2" />
+        <comment> going from back to front </comment>
+        <module_component name="exit_window"      thickness="GEMMylar_thickness"        material="Mylar" vis="TrackerServiceVis" />
+        <module_component name="exit_region"      thickness="GEMGas_thickness"          material="Ar10CO2"/>
+        <module_component name="readout_cu"       thickness="GEMCuElectrode_thickness"  material="Copper"/>
+        <module_component name="readout_foil"     thickness="GEMKapton_thickness"       material="Kapton"/>
+        <module_component name="induction_region" thickness="GEMGas_thickness"          material="Ar10CO2"/>
+        <module_component name="gem_foil_3_cu"    thickness="GEMCuElectrode_thickness * GEMAreaFactor"  material="Copper"/>
+        <module_component name="gem_foil_3"       thickness="GEMKapton_thickness * GEMAreaFactor"       material="Kapton"/>
+        <module_component name="transfer_region2" thickness="GEMGas_thickness"                          material="Ar10CO2"/>
+        <module_component name="gem_foil_2_cu"    thickness="GEMCuElectrode_thickness * GEMAreaFactor"  material="Copper"/>
+        <module_component name="gem_foil_2"       thickness="GEMKapton_thickness * GEMAreaFactor"       material="Kapton"/>
+        <module_component name="transfer_region1" thickness="GEMGas_thickness"                          material="Ar10CO2"/>
+        <module_component name="gem_foil_1_cu"    thickness="GEMCuElectrode_thickness * GEMAreaFactor"  material="Copper"/>
+        <module_component name="gem_foil_1"       thickness="GEMKapton_thickness * GEMAreaFactor"       material="Kapton"/>
+        <module_component name="drift_region"     thickness="GEMDriftRegion_thickness"                  material="Ar10CO2" sensitive="true"/>
+        <module_component name="cathode_cu"       thickness="GEMCuElectrode_thickness"  material="Copper"/>
+        <module_component name="cathode_foil"     thickness="GEMKapton_thickness"       material="Kapton"/>
+        <module_component name="entrance_region"  thickness="GEMGas_thickness"          material="Ar10CO2"/>
+        <module_component name="entrance_window"  thickness="GEMMylar_thickness"        material="Mylar" vis="TrackerMPGDVis" />
+      </module>
+      <module name="LargeBotFrame" vis="TrackerSupportVis">
+        <trd x1="GEMEndcapLargeModBotFrame_x1/2" x2="GEMEndcapLargeModBotFrame_x2/2" z="GEMEndcapLargeModBotFrame_y/2" />
+        <module_component name="frame" thickness="GEMFrame_thickness" material="CarbonFiber" vis="TrackerSupportVis" />
+      </module>
+      <module name="LargeTopFrame" vis="TrackerSupportVis">
+        <trd x1="GEMEndcapLargeModTopFrame_x1/2" x2="GEMEndcapLargeModTopFrame_x2/2" z="GEMEndcapLargeModTopFrame_y/2" />
+        <module_component name="frame" thickness="GEMFrame_thickness" material="CarbonFiber" vis="TrackerSupportVis" />
+      </module>
+      <module name="LargeSpoke" vis="TrackerSupportVis">
+        <trd x1="GEMSpoke_width/2" x2="GEMSpoke_width/2" z="GEMEndcapLargeModSpoke_length/2"/>
+        <module_component thickness="GEMSpoke_thickness" material="Mylar" vis="TrackerSupportVis"/>
+      </module>
+      <layer id="1">
+        <envelope vis="TrackerLayerVis"
+          rmin="GEMEndcapLargeLayer_rmin"
+          rmax="GEMEndcapLargeLayer_rmax"
+          length="GEMEndcapLayer_thickness"
+          zstart="GEMEndcapPLayer3_zmin" />
+        <layer_material surface="representing" binning="binPhi,binR" bins0="20*GEMEndcapMod_count" bins1="256"/>
+        <ring 
+          r="GEMEndcapLargeMod_rmin + GEMEndcapLargeMod_y/2"
           zstart="0"
           nmodules="GEMEndcapMod_count"
           dz="GEMEndcapMod_dz"
-          module="RingModule" />
+          module="LargeModule" />
         <ring 
-          r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2"
+          r="GEMEndcapLargeModBotFrame_rmin + GEMEndcapLargeModBotFrame_y/2"
           zstart="0"
           nmodules="GEMEndcapMod_count"
           dz="GEMEndcapMod_dz"
-          module="RingBotFrame" />
+          module="LargeBotFrame" />
         <ring 
-          r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2"
+          r="GEMEndcapLargeModTopFrame_rmin + GEMEndcapLargeModTopFrame_y/2"
           zstart="0"
           nmodules="GEMEndcapMod_count"
           dz="GEMEndcapMod_dz"
-          module="RingTopFrame" />
+          module="LargeTopFrame" />
         <ring 
-          r="GEMEndcapRingModSpoke_r"
+          r="GEMEndcapLargeModSpoke_r"
           zstart="0"
           nmodules="GEMEndcapMod_count"
           dz="0"
           phi0="GEMEndcapMod_angle/2"
-          module="RingSpoke" />
+          module="LargeSpoke" />
       </layer>
     </detector>
   </detectors>
diff --git a/compact/definitions.xml b/compact/definitions.xml
index c8744e9f30e7eb6301f24a5be812c13642ee5590..7ce5757eb67b9e3bf956462957b29ea218e331b2 100644
--- a/compact/definitions.xml
+++ b/compact/definitions.xml
@@ -311,6 +311,13 @@ Examples:
     <constant name="Eta3_9_tan"       value="tan(2*atan(exp(-3.9)))" />
     <constant name="Eta4_0_tan"       value="tan(2*atan(exp(-4.0)))" />
     <constant name="Eta4_1_tan"       value="tan(2*atan(exp(-4.1)))" />
+    <constant name="Eta4_2_tan"       value="tan(2*atan(exp(-4.2)))" />
+    <constant name="Eta4_3_tan"       value="tan(2*atan(exp(-4.3)))" />
+    <constant name="Eta4_4_tan"       value="tan(2*atan(exp(-4.4)))" />
+    <constant name="Eta4_5_tan"       value="tan(2*atan(exp(-4.5)))" />
+    <constant name="Eta4_6_tan"       value="tan(2*atan(exp(-4.6)))" />
+    <constant name="Eta4_7_tan"       value="tan(2*atan(exp(-4.7)))" />
+    <constant name="Eta4_8_tan"       value="tan(2*atan(exp(-4.8)))" />
 
     <comment>Solenoid option</comment>
 
@@ -381,11 +388,11 @@ Examples:
     <constant name="ForwardPIDRegion_zmin"        value="CentralTrackingRegionP_zmax" />
     <constant name="ForwardPIDRegion_length"      value="140.0*cm" />
     <comment> tangent of the opening angle at the front and back of the RICH </comment>
-    <constant name="ForwardPIDRegion_tan1"        value="CentralTrackingRegionP_tan * 1.00" />
-    <constant name="ForwardPIDRegion_tan2"        value="Eta3_6_tan * 1.01" />
+    <constant name="ForwardPIDRegion_tan1"        value="CentralTrackingRegionP_tan * 0.88" />
+    <constant name="ForwardPIDRegion_tan2"        value="Eta3_6_tan * 0.89" />
 
     <constant name="BackwardPIDRegion_zmin"       value="CentralTrackingRegionN_zmax" />
-    <constant name="BackwardPIDRegion_tan"        value="CentralTrackingRegionN_tan" />
+    <constant name="BackwardPIDRegion_tan"        value="CentralTrackingRegionN_tan * 0.92" />
     <constant name="BackwardPIDRegion_length"     value="60.0*cm" />
     <constant name="BackwardPIDRegion_rmax"       value="CentralTrackingRegion_rmax" />
 
@@ -429,7 +436,12 @@ Service gaps in FW direction (before endcapP ECAL) and BW direction (before endc
 
     <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)" />
+    <comment>
+      rmin1: rmin round electron pipe (ignoring the hadron pipe)
+      rmin2: rmin around both beam pipes
+    </comment>
+    <constant name="EcalEndcapN_rmin1"               value="Eta4_6_tan * EcalEndcapN_zmin" />
+    <constant name="EcalEndcapN_rmin2"               value="Eta4_1_tan * EcalEndcapN_zmin" />
     <constant name="EcalEndcapN_rmax"               value="CentralTrackingRegion_rmax" />
 
     <constant name="EcalBarrelRegion_thickness"     value="45.0*cm"/>
diff --git a/compact/display.xml b/compact/display.xml
index cb021b22a60df4930cba2eb8aefa4bf7d52d7219..7cb035a0dfcabfd998a7b59a520b9f3e82c569bd 100644
--- a/compact/display.xml
+++ b/compact/display.xml
@@ -125,6 +125,7 @@
     <vis name="DRICH_filter_vis"  alpha="1.0" r="1.0" g="1.0" b="0.0" showDaughters="true" visible="true" />
     <vis name="DRICH_mirror_vis"  ref="AnlGray" showDaughters="true" visible="true" />
     <vis name="DRICH_sensor_vis"  ref="AnlBlue" showDaughters="true" visible="true" />
+    <vis name="ERICH_sensor_vis"  ref="AnlBlue" showDaughters="true" visible="true" />
 
     <vis name="MRICH_aerogel_vis" ref="AnlTeal" showDaughters="true" visible="true" />
     <vis name="MRICH_frame_vis" ref="AnlGold" showDaughters="true" visible="true" />
diff --git a/compact/display_geoviewer.xml b/compact/display_geoviewer.xml
index 4dc26ceb3701342bbd2c37edf213cfc4b75d2fe0..42555347086562e9421ed9ea74bdec316e8d36c5 100644
--- a/compact/display_geoviewer.xml
+++ b/compact/display_geoviewer.xml
@@ -114,6 +114,7 @@
     <vis name="DRICH_filter_vis"  alpha="1.0" r="1.0" g="1.0" b="0.0" showDaughters="true" visible="true" />
     <vis name="DRICH_mirror_vis"  ref="AnlGray" showDaughters="true" visible="true" />
     <vis name="DRICH_sensor_vis"  ref="AnlGreen" showDaughters="true" visible="true" />
+    <vis name="ERICH_sensor_vis"  ref="AnlBlue" showDaughters="true" visible="false" /> <!-- invisible, to speedup graphics -->
 
     <vis name="MRICH_aerogel_vis" ref="AnlTeal" showDaughters="true" visible="true" />
     <vis name="MRICH_frame_vis" ref="AnlGold" showDaughters="true" visible="true" />
diff --git a/compact/drich.xml b/compact/drich.xml
index 1aa239f23f864966ce87ee3e391db4a383d9cd37..9c27e4db2a0e29a885b630bc3278fe0a39596d33 100644
--- a/compact/drich.xml
+++ b/compact/drich.xml
@@ -94,13 +94,14 @@
   filter; the filter is applied to the back of the aerogel, so that it separates
   the aerogel and gas radiators
 - dimensions:
+  - `frontplane`: front of the aerogel, w.r.t. front plane of the vessel envelope
+  - `rmin` and `rmax`: inner and outer radius (at the front plane; radial bounds are conical)
   - `phiw`: azimuthal width of wedge
   - `thickness`: radiator thickness, defined separately for aerogel and filter
-  - `frontplane`: front of the aerogel, w.r.t. front plane of the vessel envelope
   - `pitch`: controls the angle of the radiator (0=vertical)
 </documentation>
 <radiator
-  rmin="DRICH_rmin0 + DRICH_wall_thickness + 2.0*cm"
+  rmin="DRICH_rmin0 + DRICH_wall_thickness + 0.2*cm"
   rmax="DRICH_rmax0 - DRICH_wall_thickness - 0.2*cm"
   phiw="60*degree"
   frontplane="DRICH_window_thickness + 0.5*DRICH_aerogel_thickness"
@@ -142,17 +143,16 @@
   material="Acrylic_DRICH"
   surface="MirrorSurface_DRICH"
   vis="DRICH_mirror_vis"
-  backplane="DRICH_window_thickness + 5.0*cm"
+  backplane="DRICH_window_thickness + 1.0*cm"
   rmin="DRICH_rmin1 + DRICH_wall_thickness - 1.0*cm"
-  rmax="DRICH_rmax2 - DRICH_wall_thickness - 5.0*cm"
+  rmax="DRICH_rmax2 - DRICH_wall_thickness - 1.0*cm"
   phiw="59.5*degree"
   thickness="0.2*cm"
-  focus_tune_x="40.0*cm"
-  focus_tune_z="-30.0*cm"
+  focus_tune_x="30.0*cm"
+  focus_tune_z="-40.0*cm"
   debug="DRICH_debug_mirror"
   />
 
-
 <!-- /detectors/detector/sensors -->
 <documentation level="10">
 #### Sensors
@@ -205,14 +205,14 @@
     - `zmin`: z-plane cut
 </documentation>
 <sphere
-  centerz="-80.0 * cm"
+  centerz="-55.0 * cm"
   centerx="DRICH_rmax2 - 35.0*cm"
-  radius="100.0 * cm"
+  radius="85.0 * cm"
   debug="DRICH_debug_sensors"
   />
 <sphericalpatch
   phiw="18*degree"
-  rmin="DRICH_rmax1 + 0.0*cm"
+  rmin="DRICH_rmax1 + 5.0*cm"
   rmax="DRICH_rmax2 - 5.0*cm"
   zmin="DRICH_SnoutLength + 5.0*cm"
   />
diff --git a/compact/ecal_backward_hybrid.xml b/compact/ecal_backward_hybrid.xml
index 9115722f9eee729507e90407d2be5c0d5b2b4d3d..e7b8380d0c6558784c14ac674ccaf968bf2cef73 100644
--- a/compact/ecal_backward_hybrid.xml
+++ b/compact/ecal_backward_hybrid.xml
@@ -34,6 +34,8 @@
     <constant name="GlassModule_wrap" value="2*CrystalModule_wrap"/>
     <constant name="GlassModule_z0" value="0.0*cm"/>
 
+    <constant name="EcalEndcapNIonCutout_dphi" value="30*degree"/>
+
     <constant name="EcalEndcapN_thickness" value="GlassModule_length"/>
     <constant name="EcalEndcapN_z0" value="-EcalEndcapN_zmin - EcalEndcapN_thickness/2"/>
     <constant name="EcalEndcapNCrystal_rmax" value="40*cm"/>
diff --git a/compact/erich.xml b/compact/erich.xml
index 0dca595123975379eefb9b87f72fc069f6f70191..f678748c905df9d6475a994458363394f5fffb4d 100644
--- a/compact/erich.xml
+++ b/compact/erich.xml
@@ -13,10 +13,11 @@
 <constant name="ERICH_window_thickness"   value="0.1*cm"/>  <!-- thickness of entrance and exit walls -->
 <!-- additional parameters -->
 <constant name="ERICH_aerogel_thickness"  value="3.0*cm"/>  <!-- aerogel thickness -->
-<constant name="ERICH_sensor_active_size" value="2*24.0*mm"/> <!-- sensor side length (effective area) -->
-<constant name="ERICH_sensor_full_size"   value="2*25.8*mm"/> <!-- sensor side length (full size, with enclosure) -->
+<constant name="ERICH_sensor_active_size" value="24.0*mm"/> <!-- sensor side length (effective area) -->
+<constant name="ERICH_sensor_full_size"   value="25.8*mm"/> <!-- sensor side length (full size, with enclosure) -->
 <constant name="ERICH_sensor_thickness"   value="1.5*mm"/> <!-- sensor thickness -->
-<constant name="ERICH_num_px"             value="2*8"/> <!-- number of pixels along one side of the sensor -->
+<constant name="ERICH_sensor_dist"        value="40*cm"/> <!-- distance between aerogel exit plane and sensor entrance plane -->
+<constant name="ERICH_num_px"             value="8"/> <!-- number of pixels along one side of the sensor -->
 <!-- debugging switches -->
 <comment>
 - `ERICH_debug_optics`:  1 = all components become vacuum; test opticalphotons from IP
@@ -55,7 +56,6 @@
   - `length`: overall z-length of the full vessel
   - `rmin0` and `rmin1`: bore radius at front plane and back plane, respectively
   - `rmax0` and `rmax1`: outer radius of vessel, at front plane and back plane, respectively
-  - `nsectors`: number of azimuthal sectors
   - `wall_thickness`: thickness of radial walls
   - `window_thickness`: thickness of entrance and exit disks
 </documentation>
@@ -67,7 +67,6 @@
   rmin1="ERICH_rmin1"
   rmax0="ERICH_rmax"
   rmax1="ERICH_rmax"
-  nsectors="6"
   wall_thickness="ERICH_wall_thickness"
   window_thickness="ERICH_window_thickness"
   />
@@ -81,14 +80,14 @@
   the aerogel and gas radiators
 - dimensions:
   - `frontplane`: front of the aerogel, w.r.t. front plane of the vessel envelope
-  - `rmin` and `rmax`: inner and outer radius
+  - `rmin` and `rmax`: inner and outer radius (at the front plane; radial bounds are conical)
   - `phiw`: azimuthal width of wedge
   - `thickness`: radiator thickness, defined separately for aerogel and filter
   - `pitch`: controls the angle of the radiator (0=vertical)
 </documentation>
 <radiator
   frontplane="-ERICH_window_thickness"
-  rmin="ERICH_rmin0 + ERICH_wall_thickness + 0.5*cm"
+  rmin="ERICH_rmin0 + ERICH_wall_thickness + 0.2*cm"
   rmax="(ERICH_rmax/ERICH_zmax)*ERICH_zmin + 8.0*cm"
   phiw="60*degree"
   pitch="0*degree"
@@ -132,7 +131,7 @@
 <module
   material="Silicon"
   surface="SensorSurface_DRICH"
-  vis="DRICH_sensor_vis"
+  vis="ERICH_sensor_vis"
   side="ERICH_sensor_active_size"
   thickness="ERICH_sensor_thickness"
   gap="0.5*(ERICH_sensor_full_size-ERICH_sensor_active_size) + 0.5*mm"
@@ -144,20 +143,26 @@
 ##### Sensor plane
 - sensors will be placed on a plane
   - plane dimensions:
-    - `frontplane`: z-position of the sensor plane active surface (e.g., photocathode), w.r.t aerogel backplane;
-      absolute value of this number is the distance between aerogel/filter boundary and sensor surface
+    - `sensordist`: distance between sensor plane active surface (e.g., photocathode) and aerogel backplane
     - `rmin`: minimum radial position of a sensor's centroid
     - `rmax`: maximum radial position of a sensor's centroid
 </documentation>
 <plane
-  frontplane="-40*cm"
+  sensordist="ERICH_sensor_dist"
   rmin="ERICH_rmin1 + 2*cm"
   rmax="ERICH_rmax  - 4*cm"
   />
 
 <services>
-  <comment> SJJ: random standin for readout + electronics + cooling @FIXME </comment>
-  <component name="aluminum" thickness="10*mm" vis="RICHServiceVis" material="Aluminum"/>
+  <comment> 
+    Material should be equivallent with 3x0.5cm Al, spread over the entire available distance.
+    This was confirmed by Silvia.
+  </comment>
+  <component name="aluminum" thickness="5*mm" vis="RICHServiceVis" material="Aluminum"/>
+  <component name="air" thickness="40*mm" vis="InvisibleNoDaughters" material="Air"/>
+  <component name="aluminum" thickness="5*mm" vis="RICHServiceVis" material="Aluminum"/>
+  <component name="air" thickness="40*mm" vis="InvisibleNoDaughters" material="Air"/>
+  <component name="aluminum" thickness="5*mm" vis="RICHServiceVis" material="Aluminum"/>
 </services>
 
 </sensors>
diff --git a/compact/materials.xml b/compact/materials.xml
index dd89084b2f3c19e9d097085325314a5fdd848753..bdc108fccfc954bd6cf2d6d4f4d81e5385e97cc9 100644
--- a/compact/materials.xml
+++ b/compact/materials.xml
@@ -348,5 +348,9 @@
     <composite n="0.009" ref="H"/>
     <composite n="0.041"  ref="C"/>
   </material>
-
+  <material name="WSciFi_UCLA_Abs">
+    <D type="density" value="12.4" unit="g / cm3"/>
+    <fraction n="0.96" ref="W"/>
+    <fraction n="0.04" ref="Polystyrene"/>
+  </material>  
 </materials>
diff --git a/compact/optical_materials.xml b/compact/optical_materials.xml
index 00fe17cb860fde7ea9ad021d484aff334a9f9335..552ba5c495155b3ef861a83c401d69c697e8477f 100644
--- a/compact/optical_materials.xml
+++ b/compact/optical_materials.xml
@@ -427,8 +427,8 @@
       4.85156*eV  6.0*m
       6.19921*eV  6.0*m
       "/>
-    <!-- dRICh aerogel -->
-    <matrix name="RINDEX__Aerogel_DRICH" coldim="2" values="
+    <!-- dRICh aerogel, for density=0.11 g/cm3 (OLD versions are for 0.1g/cm3) -->
+    <matrix name="RINDEX__Aerogel_DRICH_OLD" coldim="2" values="
       1.87855*eV  1.01638
       1.96673*eV  1.01642
       2.0549*eV   1.01647
@@ -480,7 +480,59 @@
       6.11103*eV  1.02147
       6.19921*eV  1.02167
       "/>
-    <matrix name="ABSLENGTH__Aerogel_DRICH" coldim="2" values="
+    <matrix name="RINDEX__Aerogel_DRICH" coldim="2" values="
+      1.87855*eV  1.01852
+      1.96673*eV  1.01856
+      2.05490*eV  1.01861
+      2.14308*eV  1.01866
+      2.23126*eV  1.01871
+      2.31943*eV  1.01876
+      2.40761*eV  1.01881
+      2.49579*eV  1.01887
+      2.58396*eV  1.01893
+      2.67214*eV  1.01899
+      2.76032*eV  1.01905
+      2.84849*eV  1.01912
+      2.93667*eV  1.01919
+      3.02485*eV  1.01926
+      3.11302*eV  1.01933
+      3.20120*eV  1.01941
+      3.28938*eV  1.01948
+      3.37755*eV  1.01956
+      3.46573*eV  1.01965
+      3.55391*eV  1.01973
+      3.64208*eV  1.01982
+      3.73026*eV  1.01991
+      3.81844*eV  1.02001
+      3.90661*eV  1.02010
+      3.99479*eV  1.02020
+      4.08297*eV  1.02030
+      4.17114*eV  1.02041
+      4.25932*eV  1.02052
+      4.34750*eV  1.02063
+      4.43567*eV  1.02074
+      4.52385*eV  1.02086
+      4.61203*eV  1.02098
+      4.70020*eV  1.02111
+      4.78838*eV  1.02123
+      4.87656*eV  1.02136
+      4.96473*eV  1.02150
+      5.05291*eV  1.02164
+      5.14109*eV  1.02178
+      5.22927*eV  1.02193
+      5.31744*eV  1.02208
+      5.40562*eV  1.02223
+      5.49380*eV  1.02239
+      5.58197*eV  1.02255
+      5.67015*eV  1.02271
+      5.75833*eV  1.02288
+      5.84650*eV  1.02306
+      5.93468*eV  1.02324
+      6.02286*eV  1.02342
+      6.11103*eV  1.02361
+      6.19921*eV  1.02381
+      "/>
+    <matrix name="ABSLENGTH__Aerogel_DRICH_OLD" coldim="2" values="
       1.87855*eV  154*mm
       1.96673*eV  156.17*mm
       2.0549*eV   158.154*mm
@@ -532,7 +584,59 @@
       6.11103*eV  7.29168*mm
       6.19921*eV  6.69064*mm
       "/>
-    <matrix name="RAYLEIGH__Aerogel_DRICH" coldim="2" values="
+    <matrix name="ABSLENGTH__Aerogel_DRICH" coldim="2" values="
+      1.87855*eV  140.000*mm
+      1.96673*eV  141.973*mm
+      2.05490*eV  143.776*mm
+      2.14308*eV  145.431*mm
+      2.23126*eV  146.955*mm
+      2.31943*eV  148.364*mm
+      2.40761*eV  149.669*mm
+      2.49579*eV  150.882*mm
+      2.58396*eV  152.012*mm
+      2.67214*eV  153.067*mm
+      2.76032*eV  154.055*mm
+      2.84849*eV  154.982*mm
+      2.93667*eV  155.854*mm
+      3.02485*eV  156.674*mm
+      3.11302*eV  157.448*mm
+      3.20120*eV  158.180*mm
+      3.28938*eV  158.872*mm
+      3.37755*eV  159.528*mm
+      3.46573*eV  160.150*mm
+      3.55391*eV  160.742*mm
+      3.64208*eV  147.916*mm
+      3.73026*eV  128.139*mm
+      3.81844*eV  111.378*mm
+      3.90661*eV   97.121*mm
+      3.99479*eV   84.948*mm
+      4.08297*eV   74.518*mm
+      4.17114*eV   65.552*mm
+      4.25932*eV   57.819*mm
+      4.34750*eV   51.130*mm
+      4.43567*eV   45.327*mm
+      4.52385*eV   40.278*mm
+      4.61203*eV   35.873*mm
+      4.70020*eV   32.019*mm
+      4.78838*eV   28.641*mm
+      4.87656*eV   25.670*mm
+      4.96473*eV   23.054*mm
+      5.05291*eV   20.742*mm
+      5.14109*eV   18.698*mm
+      5.22927*eV   16.884*mm
+      5.31744*eV   15.272*mm
+      5.40562*eV   13.837*mm
+      5.49380*eV   12.557*mm
+      5.58197*eV   11.413*mm
+      5.67015*eV   10.389*mm
+      5.75833*eV    9.470*mm
+      5.84650*eV    8.645*mm
+      5.93468*eV    7.902*mm
+      6.02286*eV    7.233*mm
+      6.11103*eV    6.629*mm
+      6.19921*eV    6.082*mm
+      "/>
+    <matrix name="RAYLEIGH__Aerogel_DRICH_OLD" coldim="2" values="
       1.87855*eV  309.218*mm
       1.96673*eV  257.383*mm
       2.0549*eV   215.968*mm
@@ -584,6 +688,58 @@
       6.11103*eV  2.76144*mm
       6.19921*eV  2.607*mm
       "/>
+    <matrix name="RAYLEIGH__Aerogel_DRICH" coldim="2" values="
+      1.87855*eV  281.107*mm
+      1.96673*eV  233.984*mm
+      2.05490*eV  196.334*mm
+      2.14308*eV  165.962*mm
+      2.23126*eV  141.242*mm
+      2.31943*eV  120.958*mm
+      2.40761*eV  104.188*mm
+      2.49579*eV   90.226*mm
+      2.58396*eV   78.527*mm
+      2.67214*eV   68.663*mm
+      2.76032*eV   60.301*mm
+      2.84849*eV   53.174*mm
+      2.93667*eV   47.070*mm
+      3.02485*eV   41.816*mm
+      3.11302*eV   37.277*mm
+      3.20120*eV   33.336*mm
+      3.28938*eV   29.903*mm
+      3.37755*eV   26.900*mm
+      3.46573*eV   24.265*mm
+      3.55391*eV   21.946*mm
+      3.64208*eV   19.896*mm
+      3.73026*eV   18.080*mm
+      3.81844*eV   16.468*mm
+      3.90661*eV   15.030*mm
+      3.99479*eV   13.746*mm
+      4.08297*eV   12.596*mm
+      4.17114*eV   11.564*mm
+      4.25932*eV   10.637*mm
+      4.34750*eV    9.799*mm
+      4.43567*eV    9.043*mm
+      4.52385*eV    8.358*mm
+      4.61203*eV    7.738*mm
+      4.70020*eV    7.172*mm
+      4.78838*eV    6.659*mm
+      4.87656*eV    6.191*mm
+      4.96473*eV    5.762*mm
+      5.05291*eV    5.370*mm
+      5.14109*eV    5.011*mm
+      5.22927*eV    4.681*mm
+      5.31744*eV    4.379*mm
+      5.40562*eV    4.100*mm
+      5.49380*eV    3.844*mm
+      5.58197*eV    3.606*mm
+      5.67015*eV    3.386*mm
+      5.75833*eV    3.184*mm
+      5.84650*eV    2.996*mm
+      5.93468*eV    2.822*mm
+      6.02286*eV    2.660*mm
+      6.11103*eV    2.510*mm
+      6.19921*eV    2.370*mm
+      "/>
     <!-- dRICh acrylic -->
     <matrix name="RINDEX__Acrylic_DRICH" coldim="2" values="
       4.13281*eV  1.5017
@@ -753,11 +909,20 @@
       <property name="RINDEX"    ref="RINDEX__C4F10_ERICH"/>
       <property name="ABSLENGTH" ref="ABSLENGTH__C4F10_ERICH"/>
     </material>
-    <material name="Aerogel_DRICH">
-      <D type="density" value="0.1" unit="g/cm3"/>
+    <material name="Aerogel_DRICH_OLD">
+      <D type="density" value="0.100" unit="g/cm3"/>
       <comment> n_air = [dens(Si02)-dens(aerogel)] / [dens(Si02)-dens(Air) ] </comment>
       <fraction n="    (2.32-0.1) / (2.32-0.0012)" ref="Air"/>
       <fraction n="1 - (2.32-0.1) / (2.32-0.0012)" ref="SiliconDioxide"/>
+      <property name="RINDEX"    ref="RINDEX__Aerogel_DRICH_OLD"/>
+      <property name="ABSLENGTH" ref="ABSLENGTH__Aerogel_DRICH_OLD"/>
+      <property name="RAYLEIGH"  ref="RAYLEIGH__Aerogel_DRICH_OLD"/>
+    </material>
+    <material name="Aerogel_DRICH">
+      <D type="density" value="0.110" unit="g/cm3"/>
+      <comment> n_air = [dens(Si02)-dens(aerogel)] / [dens(Si02)-dens(Air) ] </comment>
+      <fraction n="    (2.32-0.11) / (2.32-0.0012)" ref="Air"/>
+      <fraction n="1 - (2.32-0.11) / (2.32-0.0012)" ref="SiliconDioxide"/>
       <property name="RINDEX"    ref="RINDEX__Aerogel_DRICH"/>
       <property name="ABSLENGTH" ref="ABSLENGTH__Aerogel_DRICH"/>
       <property name="RAYLEIGH"  ref="RAYLEIGH__Aerogel_DRICH"/>
diff --git a/compact/subsystem_views/drich_only.xml b/compact/subsystem_views/drich_only.xml
index d85dad6a539987fa9d58d79b2a39d74fa04f42d4..d1dff27e3ea1654aa0db437b577a3554ba3fb3d5 100644
--- a/compact/subsystem_views/drich_only.xml
+++ b/compact/subsystem_views/drich_only.xml
@@ -67,7 +67,7 @@
     ## dRICh only
   </documentation>
 
-  <include ref="ip6/beampipe.xml" /> 
+  <include ref="ip6/beampipe.xml" />
   <include ref="compact/drich.xml" />
 
 </lccdd>
diff --git a/compact/tracking_config_canyonlands.xml b/compact/tracking_config_canyonlands.xml
index 153c0670d08eceda2dabe7b26f494f110b889902..574c9c8b8fc3e4d2c4aa363673471e5b250ac793 100644
--- a/compact/tracking_config_canyonlands.xml
+++ b/compact/tracking_config_canyonlands.xml
@@ -43,6 +43,20 @@
       <composite name="OuterTrackerBarrel"/>
       <composite name="OuterTrackerCompositeEndcapP"/>
     </detector>
+    <!--
+    <detector id="TrackerSubAssembly_3_ID"
+      name="EcalBarrelSubAssembly"
+      type="DD4hep_SubdetectorAssembly"
+      vis="TrackerSubAssemblyVis">
+    </detector>
+    -->
+    <detector id="TrackerSubAssembly_4_ID"
+      name="ForwardBackwardTrackerSubAssembly"
+      type="DD4hep_SubdetectorAssembly"
+      vis="TrackerSubAssemblyVis">
+      <composite name="ForwardGEM"/>
+      <composite name="BackwardNullTracker"/>
+    </detector>
     <detector id="TrackerCompositeEndcapN_0_ID"
       name="OuterTrackerCompositeEndcapN"
       type="athena_CompositeTracker"
@@ -61,6 +75,13 @@
       <composite name="OuterTrackerEndcapP"/>
       <composite name="GEMEndcapP"/>
     </detector>
+    <detector id="TrackerCompositeEndcapN_1_ID"
+      name="BackwardNullTracker"
+      type="athena_CompositeTracker"
+      actsType="endcap"
+      vis="TrackerSubAssemblyVis">
+      <position x="0*cm" y="0*cm" z="-1*um" />
+    </detector>
 
   </detectors>
 
@@ -71,7 +92,7 @@
   <plugins>
     <plugin name="FileLoader">
       <arg value="file:calibrations/materials-map.cbor"/>
-      <arg value="url:https://eicweb.phy.anl.gov/EIC/detectors/athena/uploads/cff8f8d5919d8e78561e8caf2b4fad2b/material-maps.cbor"/>
+      <arg value="url:https://eicweb.phy.anl.gov/EIC/detectors/athena/uploads/979a4ed2d01a023b70237e39670bd31b/material-maps.cbor"/>
     </plugin>
   </plugins>
 
diff --git a/src/BarrelCalorimeterInterlayers_geo.cpp b/src/BarrelCalorimeterInterlayers_geo.cpp
index d3ed41c62a5be4edbd4202eaea3bf1123a00026d..92ac1d9320f121a7b6a28ac5aced84fedefdc8ad 100644
--- a/src/BarrelCalorimeterInterlayers_geo.cpp
+++ b/src/BarrelCalorimeterInterlayers_geo.cpp
@@ -284,11 +284,13 @@ void buildSupport(Detector& desc, Volume &mod_vol, xml_comp_t x_support,
   double beam_pos_z      = -beam_thickness / 2.;
   double beam_center_z   = support_thickness / 2. + beam_pos_z;
 
-  Box        beam_vert_s(beam_thickness / 2. , trd_y, cross_thickness / 2.);
+  // Box        beam_vert_s(beam_thickness / 2., trd_y, cross_thickness / 2.);
+  Box        beam_vert_s(beam_thickness / 2., trd_y, beam_space_z / 2.);
   Box        beam_hori_s(beam_width / 2., trd_y, beam_thickness / 2.);
-  UnionSolid T_beam_s(beam_hori_s, beam_vert_s, Position(0., 0., beam_space_z / 2.));
-  UnionSolid H_beam_s(T_beam_s, beam_hori_s, Position(0., 0., support_thickness - beam_thickness));
-  Volume H_beam_vol("H_beam", H_beam_s, desc.material(x_support.materialStr()));
+  // UnionSolid T_beam_s(beam_hori_s, beam_vert_s, Position(0., 0., beam_space_z / 2.));
+  // UnionSolid H_beam_s(T_beam_s, beam_hori_s, Position(0., 0., support_thickness - beam_thickness));
+  UnionSolid T_beam_s(beam_hori_s, beam_vert_s, Position(0., 0., support_thickness / 2.));
+  Volume H_beam_vol("H_beam", T_beam_s, desc.material(x_support.materialStr()));
   H_beam_vol.setVisAttributes(desc, x_support.visStr());
   // place H beams first
   double beam_start_x = - (n_beams - 1) * (beam_width + beam_gap) / 2.;
diff --git a/src/DRich_geo.cpp b/src/DRich_geo.cpp
index 388feae695e0375bc1c991861f17e2b073a1c718..a53fa0514cdec3012e55e1f8db0102615a2349de 100644
--- a/src/DRich_geo.cpp
+++ b/src/DRich_geo.cpp
@@ -132,6 +132,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
 
   // snout solids
   double boreDelta = vesselRmin1 - vesselRmin0;
+  double snoutDelta = vesselRmax1 - vesselRmax0;
   Cone vesselSnout(
       snoutLength/2.0,
       vesselRmin0,
@@ -219,6 +220,59 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
   sens.setType("photoncounter");
 
 
+  // BUILD RADIATOR ====================================================================
+
+  // attributes
+  double airGap = 0.01*mm; // air gap between aerogel and filter (FIXME? actually it's currently a gas gap)
+
+  // solid and volume: create aerogel and filter
+  Cone aerogelSolid(
+      aerogelThickness/2,
+      radiatorRmin,
+      radiatorRmax,
+      radiatorRmin + boreDelta  * aerogelThickness / vesselLength,
+      radiatorRmax + snoutDelta * aerogelThickness / snoutLength
+      );
+  Cone filterSolid(
+      filterThickness/2,
+      radiatorRmin + boreDelta  * (aerogelThickness + airGap) / vesselLength,
+      radiatorRmax + snoutDelta * (aerogelThickness + airGap) / snoutLength,
+      radiatorRmin + boreDelta  * (aerogelThickness + airGap + filterThickness) / vesselLength,
+      radiatorRmax + snoutDelta * (aerogelThickness + airGap + filterThickness) / snoutLength
+      );
+
+  Volume aerogelVol( detName+"_aerogel", aerogelSolid, aerogelMat );
+  Volume filterVol(  detName+"_filter",  filterSolid,  filterMat );
+  aerogelVol.setVisAttributes(aerogelVis);
+  filterVol.setVisAttributes(filterVis);
+
+  // aerogel placement and surface properties
+  // TODO [low-priority]: define skin properties for aerogel and filter
+  auto radiatorPos = Position(0., 0., radiatorFrontplane) + originFront;
+  auto aerogelPV = gasvolVol.placeVolume(aerogelVol,
+        Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z()) // re-center to originFront
+      * RotationY(radiatorPitch) // change polar angle to specified pitch // FIXME: probably broken (not yet in use anyway)
+      );
+  DetElement aerogelDE(det, "aerogel_de", 0);
+  aerogelDE.setPlacement(aerogelPV);
+  //SkinSurface aerogelSkin(desc, aerogelDE, "mirror_optical_surface", aerogelSurf, aerogelVol);
+  //aerogelSkin.isValid();
+
+  // filter placement and surface properties
+  if(!debug_optics) {
+    auto filterPV = gasvolVol.placeVolume(filterVol,
+          Translation3D(0., 0., airGap) // add an air gap
+        * Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z()) // re-center to originFront
+        * RotationY(radiatorPitch) // change polar angle
+        * Translation3D(0., 0., (aerogelThickness+filterThickness)/2.) // move to aerogel backplane
+        );
+    DetElement filterDE(det, "filter_de", 0);
+    filterDE.setPlacement(filterPV);
+    //SkinSurface filterSkin(desc, filterDE, "mirror_optical_surface", filterSurf, filterVol);
+    //filterSkin.isValid();
+  };
+
+
   // SECTOR LOOP //////////////////////////////////
   for(int isec=0; isec<nSectors; isec++) {
 
@@ -230,43 +284,6 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
     std::string secName = "sec" + std::to_string(isec);
 
 
-    // BUILD RADIATOR ====================================================================
-
-    // solid and volume: create aerogel and filter sectors
-    Tube aerogelSolid(radiatorRmin, radiatorRmax, aerogelThickness/2, -radiatorPhiw/2.0, radiatorPhiw/2.0);
-    Tube filterSolid( radiatorRmin, radiatorRmax, filterThickness/2,  -radiatorPhiw/2.0, radiatorPhiw/2.0);
-    Volume aerogelVol( detName+"_aerogel_"+secName, aerogelSolid, aerogelMat );
-    Volume filterVol(  detName+"_filter_"+secName,  filterSolid,  filterMat );
-    aerogelVol.setVisAttributes(aerogelVis);
-    filterVol.setVisAttributes(filterVis);
-
-    // aerogel placement and surface properties
-    // TODO [low-priority]: define skin properties for aerogel and filter
-    auto radiatorPos = Position(0., 0., radiatorFrontplane) + originFront;
-    auto aerogelPV = gasvolVol.placeVolume(aerogelVol,
-          RotationZ(sectorRotation) // rotate about beam axis to sector
-        * Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z()) // re-center to originFront
-        * RotationY(radiatorPitch) // change polar angle to specified pitch
-        );
-    DetElement aerogelDE(det, Form("aerogel_de%d", isec), isec);
-    aerogelDE.setPlacement(aerogelPV);
-    //SkinSurface aerogelSkin(desc, aerogelDE, Form("mirror_optical_surface%d", isec), aerogelSurf, aerogelVol);
-    //aerogelSkin.isValid();
-
-    // filter placement and surface properties
-    if(!debug_optics) {
-      auto filterPV = gasvolVol.placeVolume(filterVol,
-            RotationZ(sectorRotation) // rotate about beam axis to sector
-          * Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z()) // re-center to originFront
-          * RotationY(radiatorPitch) // change polar angle
-          * Translation3D(0., 0., (aerogelThickness+filterThickness)/2.) // move to aerogel backplane
-          );
-      DetElement filterDE(det, Form("filter_de%d", isec), isec);
-      filterDE.setPlacement(filterPV);
-      //SkinSurface filterSkin(desc, filterDE, Form("mirror_optical_surface%d", isec), filterSurf, filterVol);
-      //filterSkin.isValid();
-    };
-
 
     // BUILD SENSORS ====================================================================
 
@@ -370,7 +387,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
 
           // properties
           sensorPV.addPhysVolID("sector", isec).addPhysVolID("module", imod);
-          DetElement sensorDE(det, Form("sensor_de%d_%d", isec, imod), 10000*isec+imod);
+          DetElement sensorDE(det, Form("sensor_de%d_%d", isec, imod), (imod<<3)|isec ); // id must match IRTAlgorithm usage
           sensorDE.setPlacement(sensorPV);
           if(!debug_optics) {
             SkinSurface sensorSkin(desc, sensorDE, Form("sensor_optical_surface%d", isec), sensorSurf, sensorVol);
@@ -446,17 +463,6 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
     double xF = xS + focusTuneX;
     FocusMirror(zF,xF,B);
 
-    /*
-    // print some calculated parameters, viz. mirror attributes
-    //printf("(zC,xC) = ( %.2f, %.2f )\n",zC,xC);
-    //printf("zS = %f\n",zS);
-    //printf("xS = %f\n",xS);
-    //printf("B = %f\n",B);
-    printf("zM = %f\n",zM);
-    printf("xM = %f\n",xM);
-    printf("rM = %f\n",rM);
-    */
-
     // re-define mirror attributes to be w.r.t vessel front plane
     double mirrorCenterZ = zM - vesselZmin;
     double mirrorCenterX = xM;
@@ -481,6 +487,18 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
         40*degree
         );
 
+    /* CAUTION: if any of the relative placements or boolean operations below
+     * are changed, you MUST make sure this does not break access to the sphere
+     * primitive and positioning in Juggler `IRTAlgorithm`; cross check the
+     * mirror sphere attributes carefully!
+     */
+    /*
+    // PRINT MIRROR ATTRIBUTES (before any sector z-rotation)
+    printf("zM = %f\n",zM); // sphere centerZ, w.r.t. IP
+    printf("xM = %f\n",xM); // sphere centerX, w.r.t. IP
+    printf("rM = %f\n",rM); // sphere radius
+    */
+
     // mirror placement transformation (note: transformations are in reverse order)
     auto mirrorPos = Position(mirrorCenterX, 0., mirrorCenterZ) + originFront;
     Transform3D mirrorPlacement(
diff --git a/src/ERich_geo.cpp b/src/ERich_geo.cpp
index 19bf3f4653b1fca8c5bde61756480522d6500559..b10b2746a4fca2a051e52866c2690edc9c2691d6 100644
--- a/src/ERich_geo.cpp
+++ b/src/ERich_geo.cpp
@@ -37,7 +37,6 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
   double vesselRmin1     = dims.attr<double>(_Unicode(rmin1));
   double vesselRmax0     = dims.attr<double>(_Unicode(rmax0));
   double vesselRmax1     = dims.attr<double>(_Unicode(rmax1));
-  int    nSectors        = dims.attr<int>(_Unicode(nsectors));
   double wallThickness   = dims.attr<double>(_Unicode(wall_thickness));
   double windowThickness = dims.attr<double>(_Unicode(window_thickness));
   auto   vesselMat       = desc.material(detElem.attr<std::string>(_Unicode(material)));
@@ -70,10 +69,10 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
   double sensorGap       = sensorElem.attr<double>(_Unicode(gap));
   double sensorThickness = sensorElem.attr<double>(_Unicode(thickness));
   // - sensor plane
-  auto   sensorPlaneElem       = detElem.child(_Unicode(sensors)).child(_Unicode(plane));
-  double sensorPlaneFrontplane = sensorPlaneElem.attr<double>(_Unicode(frontplane));
-  double sensorPlaneRmin       = sensorPlaneElem.attr<double>(_Unicode(rmin));
-  double sensorPlaneRmax       = sensorPlaneElem.attr<double>(_Unicode(rmax));
+  auto   sensorPlaneElem = detElem.child(_Unicode(sensors)).child(_Unicode(plane));
+  double sensorPlaneDist = sensorPlaneElem.attr<double>(_Unicode(sensordist));
+  double sensorPlaneRmin = sensorPlaneElem.attr<double>(_Unicode(rmin));
+  double sensorPlaneRmax = sensorPlaneElem.attr<double>(_Unicode(rmax));
   // - debugging switches
   int debug_optics_mode = detElem.attr<int>(_Unicode(debug_optics));
 
@@ -103,6 +102,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
    */
 
   // tank solids
+  double boreDelta = vesselRmin1 - vesselRmin0;
   Cone vesselTank(vesselLength / 2.0, vesselRmin1, vesselRmax1, vesselRmin0, vesselRmax0);
   Cone gasvolTank(vesselLength / 2.0 - windowThickness, vesselRmin1 + wallThickness, vesselRmax1 - wallThickness,
                   vesselRmin0 + wallThickness, vesselRmax0 - wallThickness);
@@ -147,56 +147,60 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
   // sensitive detector type
   sens.setType("photoncounter");
 
-  // SECTOR LOOP //////////////////////////////////
-  for (int isec = 0; isec < nSectors; isec++) {
-
-    // debugging filters, limiting the number of sectors
-    // if( debug_optics && isec!=0) continue;
-
-    // sector rotation about z axis
-    double      sectorRotation = isec * 360 / nSectors * degree;
-    std::string secName        = "sec" + std::to_string(isec);
-
-    // BUILD RADIATOR //////////////////////////////////////
-
-    // solid and volume: create aerogel and filter sectors
-    Tube   aerogelSolid(radiatorRmin, radiatorRmax, aerogelThickness / 2, -radiatorPhiw / 2.0, radiatorPhiw / 2.0);
-    Tube   filterSolid(radiatorRmin, radiatorRmax, filterThickness / 2, -radiatorPhiw / 2.0, radiatorPhiw / 2.0);
-    Volume aerogelVol(detName + "_aerogel_" + secName, aerogelSolid, aerogelMat);
-    Volume filterVol(detName + "_filter_" + secName, filterSolid, filterMat);
-    aerogelVol.setVisAttributes(aerogelVis);
-    filterVol.setVisAttributes(filterVis);
-
-    // aerogel placement and surface properties
-    // TODO [low-priority]: define skin properties for aerogel and filter
-    auto radiatorPos = Position(0., 0., radiatorFrontplane - 0.5 * aerogelThickness) + originFront;
-    auto aerogelPV   = gasvolVol.placeVolume(
-        aerogelVol,
-        RotationZ(sectorRotation)                                              // rotate about beam axis to sector
-            * Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z()) // re-center to originFront
-            * RotationY(radiatorPitch) // change polar angle to specified pitch
-    );
-    DetElement aerogelDE(det, Form("aerogel_de%d", isec), isec);
-    aerogelDE.setPlacement(aerogelPV);
-    // SkinSurface aerogelSkin(desc, aerogelDE, Form("mirror_optical_surface%d", isec), aerogelSurf, aerogelVol);
-    // aerogelSkin.isValid();
-
-    // filter placement and surface properties
-    if (!debug_optics) {
-      auto filterPV = gasvolVol.placeVolume(
-          filterVol,
-          RotationZ(sectorRotation)                                               // rotate about beam axis to sector
-              * Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z())  // re-center to originFront
-              * RotationY(radiatorPitch)                                          // change polar angle
-              * Translation3D(0., 0., -(aerogelThickness + filterThickness) / 2.) // move to aerogel backplane
+
+  // BUILD RADIATOR //////////////////////////////////////
+
+  // attributes
+  double airGap = 0.01*mm; // air gap between aerogel and filter (FIXME? actually it's currently a gas gap)
+
+  // solid and volume: create aerogel and filter
+  Cone aerogelSolid(
+      aerogelThickness/2,
+      radiatorRmin + boreDelta * aerogelThickness / vesselLength, /* at backplane */
+      radiatorRmax,
+      radiatorRmin, /* at frontplane */
+      radiatorRmax
       );
-      DetElement filterDE(det, Form("filter_de%d", isec), isec);
-      filterDE.setPlacement(filterPV);
-      // SkinSurface filterSkin(desc, filterDE, Form("mirror_optical_surface%d", isec), filterSurf, filterVol);
-      // filterSkin.isValid();
-    };
+  Cone filterSolid(
+      filterThickness/2,
+      radiatorRmin + boreDelta * (aerogelThickness + airGap + filterThickness) / vesselLength, /* at backplane */
+      radiatorRmax,
+      radiatorRmin + boreDelta * (aerogelThickness + airGap) / vesselLength, /* at frontplane */
+      radiatorRmax
+      );
+  Volume aerogelVol(detName + "_aerogel", aerogelSolid, aerogelMat);
+  Volume filterVol(detName + "_filter", filterSolid, filterMat);
+  aerogelVol.setVisAttributes(aerogelVis);
+  filterVol.setVisAttributes(filterVis);
+
+  // aerogel placement and surface properties
+  // TODO [low-priority]: define skin properties for aerogel and filter
+  auto radiatorPos = Position(0., 0., radiatorFrontplane - 0.5 * aerogelThickness) + originFront;
+  auto aerogelPV = gasvolVol.placeVolume(
+      aerogelVol,
+      Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z()) // re-center to originFront
+          * RotationY(radiatorPitch) // change polar angle to specified pitch // (FIXME: probably broken, currently not in use)
+  );
+  DetElement aerogelDE(det, "aerogel_de", 0);
+  aerogelDE.setPlacement(aerogelPV);
+  // SkinSurface aerogelSkin(desc, aerogelDE, "mirror_optical_surface", aerogelSurf, aerogelVol);
+  // aerogelSkin.isValid();
+
+  // filter placement and surface properties
+  if (!debug_optics) {
+    auto filterPV = gasvolVol.placeVolume(
+        filterVol,
+        Translation3D(0., 0., -airGap) // add an airgap (FIXME: actually a gas gap)
+            * Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z())  // re-center to originFront
+            * RotationY(radiatorPitch) // change polar angle
+            * Translation3D(0., 0., -(aerogelThickness + filterThickness) / 2.) // move to aerogel backplane
+    );
+    DetElement filterDE(det, "filter_de", 0);
+    filterDE.setPlacement(filterPV);
+    // SkinSurface filterSkin(desc, filterDE, "mirror_optical_surface", filterSurf, filterVol);
+    // filterSkin.isValid();
+  };
 
-  }; // END SECTOR LOOP //////////////////////////
 
   // BUILD SENSORS ///////////////////////
 
@@ -209,9 +213,9 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
   if (!debug_optics)
     sensorVol.setSensitiveDetector(sens);
 
-  // sensor plane positioning: we want |`sensorPlaneFrontplane`| to be the distance between the
+  // sensor plane positioning: we want `sensorPlaneDist` to be the distance between the
   // aerogel backplane (i.e., aerogel/filter boundary) and the sensor active surface (e.g, photocathode)
-  double sensorZpos     = radiatorFrontplane - aerogelThickness + sensorPlaneFrontplane - 0.5 * sensorThickness;
+  double sensorZpos     = radiatorFrontplane - aerogelThickness - sensorPlaneDist - 0.5 * sensorThickness;
   auto   sensorPlanePos = Position(0., 0., sensorZpos) + originFront; // reference position
   // miscellaneous
   int    imod    = 0;           // module number
@@ -249,7 +253,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
 
           // properties
           sensorPV.addPhysVolID("module", imod);
-          DetElement sensorDE(det, Form("sensor_de_%d", imod), 10000 * imod); // TODO: what is this 10000?
+          DetElement sensorDE(det, Form("sensor_de_%d", imod), imod);
           sensorDE.setPlacement(sensorPV);
           if (!debug_optics) {
             SkinSurface sensorSkin(desc, sensorDE, "sensor_optical_surface", sensorSurf,
@@ -283,7 +287,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
     for (xml_coll_t ci(x_service, _Unicode(component)); ci; ++ci, ncomponents++) {
       xml_comp_t x_comp    = ci;
       double     thickness = x_comp.thickness();
-      Tube       c_tube{sensorPlaneRmin, sensorPlaneRmax, thickness};
+      Tube       c_tube{sensorPlaneRmin, sensorPlaneRmax, thickness/2};
       Volume     c_vol{_toString(ncomponents, "component%d"), c_tube, desc.material(x_comp.materialStr())};
       c_vol.setVisAttributes(desc, x_comp.visStr());
       service_vol.placeVolume(c_vol, Position(0, 0, thickness_sum + thickness / 2.0));
diff --git a/src/FieldMapBrBz.cpp b/src/FieldMapBrBz.cpp
index bcfe4ae20a86314d103f482d305bfe320c4991fc..ddac9a9f2c00af41236b993ee0b1dbe7b99b21ff 100644
--- a/src/FieldMapBrBz.cpp
+++ b/src/FieldMapBrBz.cpp
@@ -189,8 +189,8 @@ static Ref_t create_field_map_brbz(Detector & /*lcdd*/, xml::Handle_t handle)
 
     if( !fs::exists(fs::path(field_map_file))  ) {
       auto ret = std::system(("mkdir -p fieldmaps && "
-                             "wget " +
-                             field_map_url + " -O " + field_map_file).c_str());
+                             "curl --retry 5 -f " +
+                             field_map_url + " -o " + field_map_file).c_str());
 
       if (!fs::exists(fs::path(field_map_file))) {
         std::cerr << "ERROR: file, " << field_map_file << ", does not exist\n";
diff --git a/src/FileLoader.cpp b/src/FileLoader.cpp
index 63c7017e4c5c113227d6efb975be2595f2459971..3ab9bdc6953ec2db1d1ab141bb76c4f748605b4d 100644
--- a/src/FileLoader.cpp
+++ b/src/FileLoader.cpp
@@ -38,7 +38,7 @@ long load_file(
   if (!fs::exists(fs::path(file))) {
     std::string parent_path = fs::path(file).parent_path();
     auto ret = std::system(("mkdir -p " + parent_path + " && "
-                            "wget " + url + " -O " + file).c_str());
+                            "curl --retry 5 -f " + url + " -o " + file).c_str());
     if (!fs::exists(fs::path(file))) {
       std::cerr << "ERROR: file, " << file << ", does not exist\n";
       std::quick_exit(1);
diff --git a/src/HybridCalorimeter_geo.cpp b/src/HybridCalorimeter_geo.cpp
index c7d613304491565a874d04931bbcca7076d632d1..bcc04451238df7689d823f9332e0203a33d96295 100644
--- a/src/HybridCalorimeter_geo.cpp
+++ b/src/HybridCalorimeter_geo.cpp
@@ -40,7 +40,9 @@ static Ref_t create_detector(Detector& desc, xml::Handle_t handle, SensitiveDete
     auto air_material = desc.material("Air");
 
     double ROut = desc.constantAsDouble("EcalEndcapN_rmax");
-    double RIn = desc.constantAsDouble("EcalEndcapN_rmin");
+    double RIn_el = desc.constantAsDouble("EcalEndcapN_rmin1");
+    double ionCutout_dphi = desc.constantAsDouble("EcalEndcapNIonCutout_dphi");
+    double RIn = desc.constantAsDouble("EcalEndcapN_rmin2");
     double SizeZ = desc.constantAsDouble("EcalEndcapN_thickness");
     double thickness = desc.constantAsDouble("EcalEndcapN_thickness");
     double trans_radius = desc.constantAsDouble("EcalEndcapNCrystal_rmax");
@@ -57,23 +59,35 @@ static Ref_t create_detector(Detector& desc, xml::Handle_t handle, SensitiveDete
     double Crystal_z0 = desc.constantAsDouble("CrystalModule_z0");
 
     // RIn and ROut will define outer tube embedding the calorimeter
-    // centers_rin/out define the maximum radius of module centers
+    // centers_rmin/out define the maximum radius of module centers
     // so that modules are not overlapping with mother tube volume
-    double hypotenuse = sqrt(0.5 * glass_distance * glass_distance);
-    double centers_rin = RIn + hypotenuse + 1*mm;
-    double centers_rout = ROut - hypotenuse - 1*mm;
-
-    const double Crystal_offset = -0.5*(Crystal_thickness - thickness);
+    const double glassHypotenuse = std::hypot(glass_distance, glass_distance)/2;
+    const double crystalHypotenuse = glassHypotenuse/2;
+    // Offset these values a bit so we don't miss edge-blocks
+    const double glassCenters_rmax  = ROut - glassHypotenuse + 1 * mm;
+    const double crystalCenters_rmin = RIn + crystalHypotenuse - 1 * mm;
+    // Also limits of the inner crystal blocks fill
+    const double cutout_tan = tan(ionCutout_dphi/2);
+    const double cutout_rmin = RIn_el + crystalHypotenuse - 1 * mm;
+
+    // Offset to align the modules at the zmin of the endcap,
+    const double Crystal_offset = -0.5 * (Crystal_thickness - thickness);
     const double Glass_offset = -0.5*(Glass_thickness - thickness);
 
     // envelope
-
-    // Assembly assembly(detName);
-
-    Tube outer_tube(RIn, ROut, SizeZ / 2.0, 0., 360.0 * deg);
-    Volume ecal_vol("negative_ecal", outer_tube, air_material);
+    // consists of an glass tube of the full thickness, and a crystal inner tube
+    // for the crystal that allows us to get closet to the beampipe without
+    // overlaps, and a partial electron tube that allows us to get closer to the
+    // electron beampipe in the region where there is no ion beampipe
+    Tube glass_tube(min(RIn + glassHypotenuse*2, trans_radius), ROut, SizeZ / 2.0, 0., 360.0 * deg);
+    Tube crystal_tube(RIn, min(RIn + glassHypotenuse*2, trans_radius), Crystal_thickness/ 2.0, 0., 360.0 * deg);
+    Tube electron_tube(RIn_el, RIn, Crystal_thickness / 2., ionCutout_dphi / 2., 360.0 * deg - ionCutout_dphi / 2);
+    UnionSolid outer_envelope(glass_tube, crystal_tube, Position(0,0,Crystal_offset));
+    UnionSolid envelope(outer_envelope, electron_tube, Position(0,0,Crystal_offset));
+    Volume ecal_vol("negative_ecal", envelope, air_material);
     ecal_vol.setVisAttributes(desc.visAttributes("HybridEcalOuterVis"));
 
+    // TODO why 1cm and not something else?
     double Glass_OuterR = ROut - 1 * cm ;
     double Glass_InnerR = trans_radius;
 
@@ -91,9 +105,11 @@ static Ref_t create_detector(Detector& desc, xml::Handle_t handle, SensitiveDete
     // GLASS
     double diameter = 2 * Glass_OuterR;
 
-    // How many towers do we have per row/columnt?
-    // Add a gap + diameter as if we have N towers, we have N-1 gaps;
-    int towersInRow = std::ceil((diameter + Glass_Gap) /  (Glass_Width + Glass_Gap));
+    // Can we fit an even or odd amount of glass blocks within our rmax?
+    // This determines the transition points between crystal and glass as we need the
+    // outer crystal arangement to be in multiples of 2 (aligned with glass)
+    const int towersInRow = std::ceil((diameter + Glass_Gap) /  (Glass_Width + Glass_Gap));
+    const bool align_even = (towersInRow % 2);
 
     // Is it odd or even number of towersInRow
     double leftTowerPos, topTowerPos;
@@ -114,109 +130,39 @@ static Ref_t create_detector(Detector& desc, xml::Handle_t handle, SensitiveDete
 
     int moduleIndex = 0;
 
-//    fmt::print("\nCE EMCAL GLASS SQUARE START\n");
-//    fmt::print("Glass_thickness = {} cm;\n", Glass_thickness / cm);
-//    fmt::print("Glass_Width     = {} cm;\n", Glass_Width / cm);
-//    fmt::print("Glass_Gap       = {} cm;\n", Glass_Gap / cm);
-//    fmt::print("Glass_InnerR    = {} cm;\n", Glass_InnerR / cm);
-//    fmt::print("Glass_OuterR    = {} cm;\n", Glass_OuterR / cm);
-//    fmt::print("Glass_PosZ      = {} cm;\n", glass_shift_z / cm);
-//    fmt::print("Towers in Row/Col   = {} cm;\n", glass_shift_z / cm);
-//    fmt::print("Top left tower pos  = {:<10} {:<10} cm;\n", -leftTowerPos / cm, topTowerPos / cm);
-// fmt::print("#Towers info:\n");
-// fmt::print("#{:<5} {:<6} {:<3} {:<3} {:>10} {:>10}   {}\n", "idx",  "code", "col", "row", "x", "y", "name");
-
-
-    // We first do a "dry run", not really placing modules,
-    // but figuring out the ID scheme, number of modules, etc.
-    int glassModuleCount = 0;
-    int crystalModuleCount = 0;
-    int firstCrystRow = 1000000;   // The first row, where crystals are started
-    int firstCrystCol = 1000000;   // The fist column, where crystals are started
-    for(int rowIndex=0; rowIndex < towersInRow; rowIndex++) {
-      for(int colIndex=0; colIndex < towersInRow; colIndex++) {
-        double glass_x = leftTowerPos + colIndex * glass_distance;
-        double glass_y = topTowerPos + rowIndex * glass_distance;
-        double r = sqrt(glass_x * glass_x + glass_y * glass_y);
-
-        if (r < centers_rout && r > centers_rin) {
-          // we are placing something
-          if(r<trans_radius) {
-            // 4 crystal modules will be placed
-            crystalModuleCount+=4;
-
-            // Finding the first col and row where crystals start
-            // is the same algorithm as finding a minimum in array
-            if(colIndex<firstCrystCol) {
-              firstCrystCol = colIndex;
-            }
-            if(rowIndex<firstCrystRow) {
-              firstCrystRow = rowIndex;
-            }
-          }
-          else
-          {
-            // glass module will be places
-            glassModuleCount++;
-          }
-        }
-      }
-    }
-    // fmt::print("#Towers info:\n");
-    // fmt::print("#{:<5} {:<6} {:<3} {:<3} {:>10} {:>10}   {}\n", "idx",  "code", "col", "row", "x", "y", "name");
     int glass_module_index = 0;
     int cryst_module_index = 0;
     for(int rowIndex=0; rowIndex < towersInRow; rowIndex++) {
       for(int colIndex=0; colIndex < towersInRow; colIndex++) {
-        double glass_x = leftTowerPos + colIndex * (Glass_Width + Glass_Gap);
-        double glass_y = topTowerPos + rowIndex * (Glass_Width + Glass_Gap);
-        double r = sqrt(glass_x * glass_x + glass_y * glass_y);
-
-        if (r < centers_rout && r > centers_rin) {
-          int code = 1000 * rowIndex + colIndex;
-          std::string name = fmt::format("ce_EMCAL_glass_phys_{}", code);
-
-          if(r<trans_radius) {
-
-            // first crystal module
-            double crystal_x = glass_x - crystal_distance / 2;
-            double crystal_y = glass_y - crystal_distance / 2;
-            auto   placement = ecal_vol.placeVolume(crystal_module, Position(crystal_x, crystal_y, Crystal_z0 + Crystal_offset));
-            placement.addPhysVolID("sector", 1);
-            placement.addPhysVolID("module", cryst_module_index++);
-
-            // second crystal module
-            crystal_x = glass_x + crystal_distance / 2;
-            crystal_y = glass_y - crystal_distance / 2;
-            placement = ecal_vol.placeVolume(crystal_module, Position(crystal_x, crystal_y, Crystal_z0 + Crystal_offset));
-            placement.addPhysVolID("sector", 1);
-            placement.addPhysVolID("module", cryst_module_index++);
-
-            // third crystal module
-            crystal_x = glass_x - crystal_distance / 2;
-            crystal_y = glass_y + crystal_distance / 2;
-            placement = ecal_vol.placeVolume(crystal_module, Position(crystal_x, crystal_y, Crystal_z0 + Crystal_offset));
-            placement.addPhysVolID("sector", 1);
-            placement.addPhysVolID("module", cryst_module_index++);
-
-            // forth crystal module
-            crystal_x = glass_x + crystal_distance / 2;
-            crystal_y = glass_y + crystal_distance / 2;
-            placement = ecal_vol.placeVolume(crystal_module, Position(crystal_x, crystal_y, Crystal_z0 + Crystal_offset));
-            placement.addPhysVolID("sector", 1);
-            placement.addPhysVolID("module", cryst_module_index++);
-          }
-          else
-          {
-            // glass module
-            auto placement = ecal_vol.placeVolume(glass_module, Position(glass_x, glass_y, Glass_z0 + Glass_offset));
-            placement.addPhysVolID("sector", 2);
-            placement.addPhysVolID("module", glass_module_index++);
+        const double glass_x = leftTowerPos + colIndex * (Glass_Width + Glass_Gap);
+        const double glass_y = topTowerPos + rowIndex * (Glass_Width + Glass_Gap);
+        const double r = std::hypot(glass_x, glass_y);
+        // crystal if within the transition radius (as defined by the equivalent glass
+        // block)
+        if (r < trans_radius) {
+          for (const auto dx : {-1, 1}) {
+            for (const auto& dy : {-1, 1}) {
+              const double crystal_x = glass_x + dx * crystal_distance / 2;
+              const double crystal_y = glass_y + dy * crystal_distance / 2;
+              const double crystal_r = std::hypot(crystal_x, crystal_y);
+              // check if crystal in the main crystal ring?
+              const bool mainRing = (crystal_r > crystalCenters_rmin);
+              const bool innerRing = !mainRing && crystal_r > cutout_rmin;
+              const bool ionCutout = crystal_x > 0 && fabs(crystal_y / crystal_x) < cutout_tan;
+              if (mainRing || (innerRing && !ionCutout)) {
+                auto placement =
+                    ecal_vol.placeVolume(crystal_module, Position(crystal_x, crystal_y, Crystal_z0 + Crystal_offset));
+                placement.addPhysVolID("sector", 1);
+                placement.addPhysVolID("module", cryst_module_index++);
+              }
+            }
           }
-
-
-          // fmt::print(" {:<5} {:<6} {:<3} {:<3} {:>10.4f} {:>10.4f}   {}\n", towerIndex, code, colIndex, rowIndex, x / cm, y / cm, name);
-          //glass_module_index++;
+        // Glass block if within the rmax
+        } else if (r < glassCenters_rmax) {
+          // glass module
+          auto placement = ecal_vol.placeVolume(glass_module, Position(glass_x, glass_y, Glass_z0 + Glass_offset));
+          placement.addPhysVolID("sector", 2);
+          placement.addPhysVolID("module", glass_module_index++);
         }
       }
     }