From d0b0be247548d37ab84aeb430a644b02a9b1e57d Mon Sep 17 00:00:00 2001
From: Whitney Armstrong <warmstrong@anl.gov>
Date: Wed, 21 Apr 2021 23:09:04 -0500
Subject: [PATCH] Added other detectors

---
 compact/definitions.xml     | 38 +++++++++-------
 compact/ecal.xml            |  6 ++-
 compact/forward_rich.xml    | 12 +++--
 compact/forward_trd.xml     |  8 ++--
 compact/hcal.xml            |  5 +--
 reference_detector.xml      | 12 +++--
 src/ForwardRICH_geo.cpp     |  4 +-
 src/ref_DiskTracker_geo.cpp | 90 +++++++++++++++++++------------------
 8 files changed, 95 insertions(+), 80 deletions(-)

diff --git a/compact/definitions.xml b/compact/definitions.xml
index bc78451..ee5fc40 100644
--- a/compact/definitions.xml
+++ b/compact/definitions.xml
@@ -322,7 +322,7 @@
 
     <constant name="ForwardRICH_length"       value="1.1*m"/>
     <constant name="ForwardTRD_length"        value="10.0*cm"/>
-    <constant name="ForwardTOF_length" value="1.0*mm"/>
+    <constant name="ForwardTOF_length"        value="10.0*mm"/>
     
     <constant name="BackwardCherenkovLength"   value="15.0*cm"/>
     <constant name="BackwardTOFLength"         value="10.0*cm"/>
@@ -331,11 +331,18 @@
     <constant name="ForwardPIDLength"    value="ForwardRICH_length + ForwardTRD_length + ForwardTOF_length"/>
     <constant name="BackwardPIDLength"   value="BackwardCherenkovLength + BackwardTOFLength"/>
 
+    <comment> For detectors adjacent to beam pipe.</comment>
+    <constant name="ForwardPID_rmin"  value="Beampipe_rmax + 10*mm"/>
+    <constant name="ForwardPID_rmin1"  value="Beampipe_rmax + 80*mm"/>
+
     <comment> Barrel PID thicknesses</comment>
     <constant name="BarrelExtraPIDThickness"  value="25.0 * cm"/>
     <constant name="BarrelTRDThickness"  value="1.0 * cm"/>
     <constant name="BarrelTOFThickness"  value="1.0 * cm"/>
 
+
+
+
     <comment>
       ============================
       Tracking Detector Parameters
@@ -351,7 +358,7 @@
       -------------------------
     </comment>
     <constant name="ForwardTrackingGEMLength" value="ForwardTrackingLength"/>
-    <constant name="ForwardTrackingGEMLength" value="BackwardTrackingLength"/>
+    <constant name="BackwardTrackingGEMLength" value="BackwardTrackingLength"/>
 
     <comment>
       -------------------------
@@ -427,8 +434,8 @@
     <constant name="SolenoidYokeEndcapN_zmin"  value="Solenoid_length/2.0 - Solenoid_offset + HcalEndcapNExtra_length"/>
 
     <constant name="EcalBarrel_rmin"            value="SiliconTrackerOuterRadius + BarrelExtraPIDThickness + 5.0 * mm"/>
-    <constant name="HcalBarrel_rmax"            value="Solenoid_rmin - 10.0 *cm "/>
-    <constant name="Barrel_TotalCalThickness"   value="HcalBarrel_rmax - EcalBarrel_rmin"/>
+    <constant name="Barrel_rmax"                value="Solenoid_rmin - 10.0 *cm "/>
+    <constant name="Barrel_TotalCalThickness"   value="Barrel_rmax - EcalBarrel_rmin"/>
 
     <constant name="CalBarrelDivider"           value="0.8"/>
     <comment> Leave room for TRD </comment>
@@ -458,8 +465,6 @@
     <constant name="EcalEndcapP_length" value="EndcapPTotalCal_length * EndcapP_CalDivide"/>
     <constant name="EcalEndcapN_length" value="EndcapNTotalCal_length * EndcapN_CalDivide"/>
 
-    <constant name="HcalEndcapP_length" value="EndcapPTotalCal_length * (1.0 - EndcapP_CalDivide)"/>
-    <constant name="HcalEndcapN_length" value="EndcapNTotalCal_length * (1.0 - EndcapN_CalDivide)"/>
 
     <comment> These need to be set in sync with the forward and backward  detectors </comment>
     <constant name="EcalEndcapP_rmin"                      value="200.0*mm"/>
@@ -536,12 +541,19 @@
       Hadronic Calorimeter Parameters
       -------------------------------
     </comment>
-    <constant name="HcalBarrel_rmin"          value="EcalBarrel_rmax"/>
-    <constant name="HcalBarrelAvailThickness" value="HcalBarrel_rmax - HcalBarrel_rmin"/>
-    <constant name="HcalBarrelLength"         value="Solenoid_length + HcalEndcapPExtra_length + HcalEndcapNExtra_length- HcalEndcapP_length- HcalEndcapN_length - 10*cm"/>
-                                                                     
+
+    <constant name="HcalEndcapP_length" value="50.0*cm"/>
+    <constant name="HcalEndcapN_length" value="50.0*cm"/>
+    <constant name="HcalBarrel_thickness" value="50.0*cm "/>
+
+    <constant name="HcalBarrel_rmin"          value="Solenoid_rmax"/>
+    <constant name="HcalBarrel_rmax"          value="HcalBarrel_rmin + HcalBarrel_thickness"/>
+
+    <constant name="HcalBarrelAvailThickness" value="HcalBarrel_thickness"/>
+
     <constant name="HcalEndcapP_zmin"          value="EcalEndcapP_zmin + EcalEndcapP_length "/>
     <constant name="HcalEndcapN_zmin"          value="EcalEndcapN_zmin + EcalEndcapN_length "/>
+    <constant name="HcalBarrelLength"          value="HcalEndcapP_zmin + HcalEndcapN_zmin "/>
 
     <comment> Material Thickness </comment>
     <constant name="HcalSteelThickness"       value="1.89 * cm"/>
@@ -610,12 +622,6 @@
       Gaseous RICH Parameters
       -----------------------
     </comment>
-    <constant name="ForwardRICH_zmin"  value="BarrelTracking_length/2.0 + ForwardTrackingLength + 1 * mm"/>
-    <constant name="ForwardRICH_rmin"  value="15 * cm"/>
-    <constant name="ForwardRICH_rmax0"  value="SiliconTrackerOuterRadius"/>
-    <constant name="ForwardRICH_rmax1"  value="EcalBarrel_rmin"/>
-    <constant name="ForwardRICH_rmax2"  value="SolenoidBarrel_rmin-2*cm"/>
-    <constant name="ForwardRICHDepth" value="0.9*m"/>
 
 
     <comment>
diff --git a/compact/ecal.xml b/compact/ecal.xml
index 1f44ac9..42fd2fb 100644
--- a/compact/ecal.xml
+++ b/compact/ecal.xml
@@ -10,6 +10,10 @@
     <constant name="CrystalEndcap_x_pos" value="0.0*m"/>
     <constant name="CrystalEndcap_y_pos" value="0.0*m"/>
     <constant name="CrystalEndcap_z_pos" value="-EcalEndcapN_zmin"/>
+
+
+
+    <constant name="EcalEndcapP_rmax" value="Solenoid_rmax "/>
   </define>
 
 
@@ -88,7 +92,7 @@
         numsides="CaloSides" 
         zmin="EcalEndcapP_zmin" 
         rmin="EcalEndcapP_rmin" 
-        rmax="EcalBarrel_rmax " />
+        rmax="EcalEndcapP_rmax " />
       <layer repeat="EcalEndcapPLayer1_NRepeat">
         <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
         <slice material="Copper" thickness="EcalCopperThickness"/>
diff --git a/compact/forward_rich.xml b/compact/forward_rich.xml
index 8350f59..e35fe98 100644
--- a/compact/forward_rich.xml
+++ b/compact/forward_rich.xml
@@ -1,10 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <lccdd>
   <define>
+    <constant name="ForwardRICH_zmin"   value="BarrelTracking_length/2.0 + ForwardTrackingLength "/>
+    <constant name="ForwardRICH_rmin"   value="ForwardPID_rmin1"/>
+    <constant name="ForwardRICH_rmax0"  value="SiliconTrackerOuterRadius"/>
+    <constant name="ForwardRICH_rmax1"  value="EcalBarrel_rmin"/>
+    <constant name="ForwardRICH_rmax2"  value="Solenoid_rmin-6*cm"/>
+    <constant name="ForwardRICHDepth"   value="0.9*m"/>
   </define>
 
   <detectors>
-    <detector id="ForwardRICH_ID" name="ForwardRICH" type="refdet_ForwardRICH" readout="ForwardRICHHits" vis="BlueVis">
+    <detector id="ForwardRICH_ID" name="ForwardRICH" type="refdet_ForwardRICH" readout="ForwardRICHHits" vis="RICHVis">
       <dimensions 
         z0="ForwardRICH_zmin" 
         snout_length="ForwardRICH_length - ForwardRICHDepth"
@@ -22,8 +28,8 @@
         rmax1="ForwardRICH_rmax1"
         rmax2="ForwardRICH_rmax2" />
       <comment> What are the following MCP-PMT parameters?</comment>
-      <mcppmt 
-        z0="-20.0*cm" 
+      <mcppmt
+        z0="0.0*cm"
         rmin="ForwardRICH_rmax1" 
         rmax="ForwardRICH_rmax2" 
         rtol="1.0*cm" 
diff --git a/compact/forward_trd.xml b/compact/forward_trd.xml
index 693f533..680bbdc 100644
--- a/compact/forward_trd.xml
+++ b/compact/forward_trd.xml
@@ -6,9 +6,9 @@
       Forward TRD Parameters
       --------------------------
     </comment>
-    <constant name="ForwardTRD_zmin" value="ForwardRICH_zmin + ForwardRICH_length+ 1*cm"/>
-    <constant name="ForwardTRD_rmin" value="ForwardRICH_rmin"/>
-    <constant name="ForwardTRD_rmax" value="EcalBarrel_rmax - 5*cm"/>
+    <constant name="ForwardTRD_zmin" value="BarrelTracking_length/2.0 + ForwardTrackingLength + ForwardRICH_length"/>
+    <constant name="ForwardTRD_rmin" value="ForwardPID_rmin1"/>
+    <constant name="ForwardTRD_rmax" value="Solenoid_rmin"/>
   </define>
 
   <detectors>
@@ -19,7 +19,7 @@
       insideTrackingVolume="true"
       reflect="false"
       vis="Argonne_Red">
-      <position x="0" y="0" z="0"/>
+      <position x="0" y="0" z="0.0"/>
       <layer id="1" 
         vis="Argonne_Blue"
         inner_z="ForwardTRD_zmin" 
diff --git a/compact/hcal.xml b/compact/hcal.xml
index f9af3d5..ad16a15 100644
--- a/compact/hcal.xml
+++ b/compact/hcal.xml
@@ -1,6 +1,7 @@
 <lccdd>
 
   <define>
+    <constant name="HcalBarrel_offset"              value="(HcalEndcapP_zmin-HcalEndcapN_zmin)/2.0" />
   </define>
 
   <limits>
@@ -15,14 +16,13 @@
   <!-- Define detector -->
   <detectors>
 
-    <!--
     <detector 
       id="HCalBarrel_ID" 
       name="HcalBarrel"
       type="refdet_EcalBarrel"
       readout="HcalBarrelHits"
       calorimeterType="HAD_BARREL"
-      offset="Barrel_offset"
+      offset="HcalBarrel_offset"
       gap="0.*cm"
       material="Steel235">
       <dimensions 
@@ -39,7 +39,6 @@
         <slice material="Air" thickness="HcalAirThickness"/>
       </layer>
     </detector>
-    -->
 
     <detector 
       id="HCalEndcapP_ID" 
diff --git a/reference_detector.xml b/reference_detector.xml
index 9608080..c04c3e6 100644
--- a/reference_detector.xml
+++ b/reference_detector.xml
@@ -12,8 +12,8 @@
   </info>
 
   <define>
+    <include ref="ip6/ip6_defs.xml" /> <comment> IP definitions should be first</comment>
     <include ref="compact/definitions.xml" />
-    <include ref="ip6/ip6_defs.xml" />
     <!--
     <include ref="eic/eic_defs.xml" />
     -->
@@ -110,11 +110,9 @@
   <include ref="compact/display.xml" />
   </display>
 
-  <!--
-  <include ref="reference_detector/vertex_tracker.xml"/>
-  <include ref="compact/silicon_tracker.xml"/>
-  -->
+  <comment> Include the IP components first </comment>
   <include ref="ip6/beampipe.xml"/>
+
   <include ref="compact/solenoid.xml"/>
   <include ref="compact/ecal.xml"/>
   <include ref="compact/ce_mrich.xml"/>
@@ -129,14 +127,14 @@
   <include ref="compact/forward_romanpot.xml"/>
   <include ref="compact/far_forward_detectors.xml"/>
   <include ref="eic/forward_ion_beamline.xml"/>
-  
   <include ref="compact/hcal.xml"/>
+  <include ref="compact/forward_rich.xml"/>
+
   <!--
   <include ref="compact/ci_GEM.xml"/>
   <include ref="compact/cb_CTD_Si.xml"/>
   <include ref="compact/cb_VTX_Barrel.xml"/>
   <include ref="compact/ci_HCAL.xml"/>
-  <include ref="compact/forward_rich.xml"/>
   <include ref="compact/roman_pots.xml"/>
   -->
 
diff --git a/src/ForwardRICH_geo.cpp b/src/ForwardRICH_geo.cpp
index b88bcd7..d715662 100644
--- a/src/ForwardRICH_geo.cpp
+++ b/src/ForwardRICH_geo.cpp
@@ -118,7 +118,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
             double mTheta1 = std::asin(mRmin/curve);
             double mTheta2 = std::asin(mRmax/curve);
             double rotY = -std::asin(focus/curve);
-            mirVol.setSolid(Sphere(curve, curve + mThick, mTheta1, mTheta2, 0., wphi));
+            mirVol.setSolid(Sphere(curve, curve + mThick, mTheta1*1.01, mTheta2*0.99, 0., wphi));
             // action is in a reverse order
             Transform3D tr = Translation3D(0., 0., mirZ - front_offset)   // move for z position
                            * RotationZ(rotZ)                            // rotate phi angle
@@ -179,7 +179,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
         pdPV.addPhysVolID("layer", ilayer).addPhysVolID("piece", ipd + 1);
     }
     Volume motherVol = desc.pickMotherVolume(det);
-    PlacedVolume envPV = motherVol.placeVolume(envVol, Position(0, 0, z0 + halfLength));
+    PlacedVolume envPV = motherVol.placeVolume(envVol, Position(0, 0, z0 + front_offset));
     envPV.addPhysVolID("system", detID);
     det.setPlacement(envPV);
 
diff --git a/src/ref_DiskTracker_geo.cpp b/src/ref_DiskTracker_geo.cpp
index 8f60a3a..4431e88 100644
--- a/src/ref_DiskTracker_geo.cpp
+++ b/src/ref_DiskTracker_geo.cpp
@@ -1,5 +1,5 @@
 //==========================================================================
-//  AIDA Detector description implementation 
+//  AIDA Detector description implementation
 //--------------------------------------------------------------------------
 // Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
 // All rights reserved.
@@ -12,7 +12,7 @@
 //==========================================================================
 //
 // Specialized generic detector constructor
-// 
+//
 //==========================================================================
 #include "DD4hep/DetFactoryHelper.h"
 
@@ -20,47 +20,49 @@ using namespace std;
 using namespace dd4hep;
 using namespace dd4hep::detail;
 
-static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens)  {
-  xml_det_t  x_det     = e;
-  Material   air       = description.air();
-  string     det_name  = x_det.nameStr();
-  bool       reflect   = x_det.reflect();
-  DetElement sdet(det_name,x_det.id());
-  Assembly   assembly(det_name);
-  PlacedVolume pv;
-  int l_num = 0;
-  xml::Component  pos  = x_det.position();
+static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens)
+{
+  xml_det_t      x_det    = e;
+  Material       air      = description.air();
+  string         det_name = x_det.nameStr();
+  bool           reflect  = x_det.reflect();
+  DetElement     sdet(det_name, x_det.id());
+  Assembly       assembly(det_name);
+  PlacedVolume   pv;
+  int            l_num = 0;
+  xml::Component pos   = x_det.position();
+
+  for (xml_coll_t i(x_det, _U(layer)); i; ++i, ++l_num) {
+    xml_comp_t x_layer    = i;
+    string     l_nam      = det_name + _toString(l_num, "_layer%d");
+    double     zmin       = x_layer.inner_z();
+    double     rmin       = x_layer.inner_r();
+    double     rmax       = x_layer.outer_r();
+    double     z          = zmin;
+    double     layerWidth = 0.;
+    int        s_num      = 0;
 
-  for(xml_coll_t i(x_det,_U(layer)); i; ++i, ++l_num)  {
-    xml_comp_t x_layer = i;
-    string l_nam = det_name+_toString(l_num,"_layer%d");
-    double  zmin = x_layer.inner_z();
-    double  rmin = x_layer.inner_r();
-    double  rmax = x_layer.outer_r();
-    double  z    = zmin, layerWidth = 0.;
-    int     s_num = 0;
-      
-    for(xml_coll_t j(x_layer,_U(slice)); j; ++j)  {
+    for (xml_coll_t j(x_layer, _U(slice)); j; ++j) {
       double thickness = xml_comp_t(j).thickness();
       layerWidth += thickness;
     }
-    Tube    l_tub(rmin,rmax,layerWidth,2*M_PI);
-    Volume  l_vol(l_nam,l_tub,air);
-    l_vol.setVisAttributes(description,x_layer.visStr());
-    for(xml_coll_t j(x_layer,_U(slice)); j; ++j, ++s_num)  {
+    Tube   l_tub(rmin, rmax, layerWidth/2.0, 2 * M_PI);
+    Volume l_vol(l_nam, l_tub, air);
+    l_vol.setVisAttributes(description, x_layer.visStr());
+    for (xml_coll_t j(x_layer, _U(slice)); j; ++j, ++s_num) {
       xml_comp_t x_slice = j;
-      double thick = x_slice.thickness();
-      Material mat = description.material(x_slice.materialStr());
-      string s_nam = l_nam+_toString(s_num,"_slice%d");
-      Volume s_vol(s_nam, Tube(rmin,rmax,thick), mat);
-        
-      if ( x_slice.isSensitive() ) {
+      double     thick   = x_slice.thickness();
+      Material   mat     = description.material(x_slice.materialStr());
+      string     s_nam   = l_nam + _toString(s_num, "_slice%d");
+      Volume     s_vol(s_nam, Tube(rmin, rmax, thick/2.0), mat);
+
+      if (x_slice.isSensitive()) {
         sens.setType("tracker");
         s_vol.setSensitiveDetector(sens);
       }
-      s_vol.setAttributes(description,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
-      pv = l_vol.placeVolume(s_vol,Position(0,0,z-zmin-layerWidth/2+thick/2));
-      pv.addPhysVolID("slice",s_num);
+      s_vol.setAttributes(description, x_slice.regionStr(), x_slice.limitsStr(), x_slice.visStr());
+      pv = l_vol.placeVolume(s_vol, Position(0, 0, z - zmin - layerWidth / 2 + thick / 2));
+      pv.addPhysVolID("slice", s_num);
     }
 
     if (!reflect) {
@@ -71,22 +73,22 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
       layer.setPlacement(pv);
     } else {
       DetElement layer(sdet, l_nam + "_neg", l_num);
-      pv = assembly.placeVolume(l_vol,Transform3D(RotationY(M_PI),Position(0,0,-zmin-layerWidth/2)));
-      pv.addPhysVolID("layer",l_num);
-      pv.addPhysVolID("barrel",1);
+      pv = assembly.placeVolume(l_vol, Transform3D(RotationY(M_PI), Position(0, 0, -zmin - layerWidth / 2)));
+      pv.addPhysVolID("layer", l_num);
+      pv.addPhysVolID("barrel", 1);
       layer.setPlacement(pv);
       // DetElement layerR = layer.clone(l_nam+"_neg");
       // sdet.add(layerR.setPlacement(pv));
     }
   }
-  if ( x_det.hasAttr(_U(combineHits)) ) {
-    sdet.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens);
+  if (x_det.hasAttr(_U(combineHits))) {
+    sdet.setCombineHits(x_det.attr<bool>(_U(combineHits)), sens);
   }
-  pv = description.pickMotherVolume(sdet).placeVolume(assembly,Position(pos.x(),pos.y(),pos.z()));
-  pv.addPhysVolID("system", x_det.id());      // Set the subdetector system ID.
+  pv = description.pickMotherVolume(sdet).placeVolume(assembly, Position(pos.x(), pos.y(), pos.z()));
+  pv.addPhysVolID("system", x_det.id()); // Set the subdetector system ID.
   sdet.setPlacement(pv);
   return sdet;
 }
 
-DECLARE_DETELEMENT(ref_DiskTracker,create_detector)
-DECLARE_DETELEMENT(ref_SolenoidEndcap,create_detector)
+DECLARE_DETELEMENT(ref_DiskTracker, create_detector)
+DECLARE_DETELEMENT(ref_SolenoidEndcap, create_detector)
-- 
GitLab