From 4150c55df7c576f13fd21a054ce0df14066d84a6 Mon Sep 17 00:00:00 2001
From: Chao Peng <cpeng@anl.gov>
Date: Mon, 14 Jun 2021 19:54:19 -0500
Subject: [PATCH] add the geometry for endcap ecal

---
 compact/ce_ecal.xml                | 109 +++++++++++++++++++++++++++++
 compact/ce_ecal_outer_glass.xml    |  33 +++++++++
 compact/ecal.xml                   |  81 ++-------------------
 src/HomogeneousCalorimeter_geo.cpp |  14 ++--
 4 files changed, 153 insertions(+), 84 deletions(-)
 create mode 100644 compact/ce_ecal.xml
 create mode 100644 compact/ce_ecal_outer_glass.xml

diff --git a/compact/ce_ecal.xml b/compact/ce_ecal.xml
new file mode 100644
index 00000000..e55739bf
--- /dev/null
+++ b/compact/ce_ecal.xml
@@ -0,0 +1,109 @@
+<lccdd>
+
+  <define>
+    <constant name="CrystalEndcap_rmin"  value="VertexTrackerBarrel_rmin"/>
+    <constant name="CrystalEndcap_rmax"  value="EcalEndcapN_rmin"/>
+    <constant name="CrystalBox_x_length" value="20.0*mm"/>
+    <constant name="CrystalBox_y_length" value="20.0*mm"/>
+    <constant name="CrystalBox_z_length" value="200.0*mm"/>
+    <constant name="CrystalBox_offset"   value="0.000001*mm"/>
+    <constant name="CrystalEndcap_x_pos" value="0.0*m"/>
+    <constant name="CrystalEndcap_y_pos" value="0.0*m"/>
+    <constant name="CrystalEndcap_z_pos" value="-EcalEndcapN_zmin"/>
+  </define>
+
+
+  <limits>
+  </limits>
+
+  <regions>
+  </regions>
+
+  <!-- Common Generic visualization attributes -->
+  <comment>Common Generic visualization attributes</comment>
+  <display>
+  </display>
+
+  <detectors>
+    <comment>
+      -------------------------------
+      Backwards Endcap EM Calorimeter
+      -------------------------------
+      A layered EM calorimeter with tungsten and silicon (or scintillator) strips
+    </comment>
+    <detector id="ECalEndcapN_ID" 
+      name="EcalEndcapN" 
+      type="refdet_PolyhedraEndcapCalorimeter2" 
+      reflect="true" 
+      readout="EcalEndcapHits" 
+      vis="EcalEndcapVis" 
+      calorimeterType="EM_ENDCAP">
+      <position x="0" y="0" z="0"/>
+      <dimensions 
+        numsides="CaloSides" 
+        zmin="EcalEndcapN_zmin" 
+        rmin="EcalEndcapN_rmin" 
+        rmax="EcalBarrel_rmin " />
+      <layer repeat="EcalEndcapNLayer1_NRepeat">
+        <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
+        <slice material="Copper" thickness="EcalCopperThickness"/>
+        <slice material="Kapton" thickness="EcalKaptonThickness"/>
+        <slice material="Air" thickness="EcalAir1Thickness"/>
+      </layer>
+      <layer repeat="EcalEndcapNLayer2_NRepeat">
+        <slice material="TungstenDens24" thickness="EcalThinTungstenThickness"/>
+        <slice material="Air" thickness="EcalAir2Thickness"/>
+        <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
+        <slice material="Copper" thickness="EcalCopperThickness"/>
+        <slice material="Kapton" thickness="EcalKaptonThickness"/>
+        <slice material="Air" thickness="EcalAir1Thickness"/>
+      </layer>
+      <layer repeat="EcalEndcapNLayer3_NRepeat">
+        <slice material="TungstenDens24" thickness="EcalThickTungstenThickness"/>
+        <slice material="Air" thickness="EcalAir2Thickness"/>
+        <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
+        <slice material="Copper" thickness="EcalCopperThickness"/>
+        <slice material="Kapton" thickness="EcalKaptonThickness"/>
+        <slice material="Air" thickness="EcalAir1Thickness"/>
+      </layer>
+    </detector>
+
+    <comment>
+      -------------------
+      Crystal Calorimeter
+      -------------------
+      Backward (negative pseudorapidity) angle electron detector
+    </comment>
+    <detector 
+      id="CrystalEndcap_ID" 
+      name="ElectronECAL" 
+      type="CrystalCalorimeterEndcap" 
+      readout="CrystalEcalHits" 
+      vis="GreenVis">
+      <position x="CrystalEndcap_x_pos" y="CrystalEndcap_y_pos" z="CrystalEndcap_z_pos" />
+      <dimensions rmin="CrystalEndcap_rmin" rmax="CrystalEndcap_rmax" x="CrystalBox_x_length" y="CrystalBox_y_length" z="CrystalBox_z_length" delta="CrystalBox_offset"/>
+    </detector>
+  </detectors>
+
+  <!--  Definition of the readout segmentation/definition  -->
+  <readouts>
+    <!--  
+    <readout name="PlaneTrackerHits">
+      <segmentation type="CartesianGridXY" grid_size_x="20.0*mm" grid_size_y="20.0*mm" />
+      <id>system:5,module:4,x:32:-16,y:-16</id>
+    </readout>
+    -->
+    <readout name="CrystalEcalHits">
+      <segmentation type="CartesianGridXY" grid_size_x="CrystalBox_x_length" grid_size_y="CrystalBox_y_length" />
+      <id>system:8,sector:4,module:20,x:48:-8,y:-8</id>
+    </readout>
+    <readout name="EcalEndcapHits">
+      <segmentation type="CartesianGridXY" grid_size_x="3.5 * mm" grid_size_y="3.5 * mm"/>
+      <id>system:8,barrel:3,module:4,layer:6,slice:5,x:32:-16,y:-16</id>
+    </readout>
+  </readouts>
+
+  <plugins>
+  </plugins>
+
+</lccdd>
diff --git a/compact/ce_ecal_outer_glass.xml b/compact/ce_ecal_outer_glass.xml
new file mode 100644
index 00000000..7ce994ae
--- /dev/null
+++ b/compact/ce_ecal_outer_glass.xml
@@ -0,0 +1,33 @@
+<lccdd>
+  <define>
+  </define>
+
+  <detectors>
+    <detector id="ECalEndcapN_ID"
+      name="EcalEndcapN"
+      type="HomogeneousCalorimeter"
+      readout="EcalEndcapNHits"
+      vis="InvisibleWithDaughters">
+      <dimensions shape="disk" rmax="EcalBarrel_rmin" rmin="VertexTrackerBarrel_rmin" length="40*cm + 1*mm"/>
+      <position x="0" y="0" z="-EcalEndcapN_zmin"/>
+      <rotation x="0" y="0" z="0"/>
+      <placements>
+        <disk rmax="EcalEndcapN_rmin" rmin="VertexTrackerBarrel_rmin" sector="1">
+          <position z="0"/>
+          <module sizex="2.05*cm" sizey="2.05*cm" sizez="20*cm" material="PbWO4" vis="AnlTeal"/>
+        </disk>
+        <disk rmax="EcalBarrel_rmin" rmin="EcalEndcapN_rmin" sector="2">
+          <position z="0"/>
+          <module sizex="4*cm" sizey="4*cm" sizez="40*cm" material="PbGlass" vis="AnlBlue"/>
+        </disk>
+      </placements>
+    </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="EcalEndcapNHits">
+      <id>system:8, sector:4, module:20</id>
+    </readout>
+  </readouts>
+</lccdd>
+
diff --git a/compact/ecal.xml b/compact/ecal.xml
index 93573377..ef511fff 100644
--- a/compact/ecal.xml
+++ b/compact/ecal.xml
@@ -1,18 +1,6 @@
 <lccdd>
 
   <define>
-    <constant name="CrystalEndcap_rmin"  value="VertexTrackerBarrel_rmin"/>
-    <constant name="CrystalEndcap_rmax"  value="EcalEndcapN_rmin"/>
-    <constant name="CrystalBox_x_length" value="20.0*mm"/>
-    <constant name="CrystalBox_y_length" value="20.0*mm"/>
-    <constant name="CrystalBox_z_length" value="200.0*mm"/>
-    <constant name="CrystalBox_offset"   value="0.000001*mm"/>
-    <constant name="CrystalEndcap_x_pos" value="0.0*m"/>
-    <constant name="CrystalEndcap_y_pos" value="0.0*m"/>
-    <constant name="CrystalEndcap_z_pos" value="-EcalEndcapN_zmin"/>
-
-
-
     <constant name="EcalEndcapP_rmax" value="Solenoid_rmax "/>
   </define>
 
@@ -29,6 +17,8 @@
   </display>
 
   <include ref="ecal_barrel.xml"/>
+  <!--<include ref="ce_ecal.xml"/>-->
+  <include ref="ce_ecal_outer_glass.xml"/>
   <detectors>
 
     <comment>
@@ -41,7 +31,7 @@
       name="EcalEndcapP" 
       reflect="false" 
       type="refdet_PolyhedraEndcapCalorimeter2" 
-      readout="EcalEndcapHits" 
+      readout="EcalEndcapPHits" 
       vis="EcalEndcapVis" 
       calorimeterType="EM_ENDCAP" >
       <position x="0" y="0" z="-0"/>
@@ -73,65 +63,6 @@
         <slice material="Air" thickness="EcalAir1Thickness"/>
       </layer>
     </detector>
-
-    <comment>
-      -------------------------------
-      Backwards Endcap EM Calorimeter
-      -------------------------------
-      A layered EM calorimeter with tungsten and silicon (or scintillator) strips
-    </comment>
-    <detector id="ECalEndcapN_ID" 
-      name="EcalEndcapN" 
-      type="refdet_PolyhedraEndcapCalorimeter2" 
-      reflect="true" 
-      readout="EcalEndcapHits" 
-      vis="EcalEndcapVis" 
-      calorimeterType="EM_ENDCAP">
-      <position x="0" y="0" z="0"/>
-      <dimensions 
-        numsides="CaloSides" 
-        zmin="EcalEndcapN_zmin" 
-        rmin="EcalEndcapN_rmin" 
-        rmax="EcalBarrel_rmin " />
-      <layer repeat="EcalEndcapNLayer1_NRepeat">
-        <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
-        <slice material="Copper" thickness="EcalCopperThickness"/>
-        <slice material="Kapton" thickness="EcalKaptonThickness"/>
-        <slice material="Air" thickness="EcalAir1Thickness"/>
-      </layer>
-      <layer repeat="EcalEndcapNLayer2_NRepeat">
-        <slice material="TungstenDens24" thickness="EcalThinTungstenThickness"/>
-        <slice material="Air" thickness="EcalAir2Thickness"/>
-        <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
-        <slice material="Copper" thickness="EcalCopperThickness"/>
-        <slice material="Kapton" thickness="EcalKaptonThickness"/>
-        <slice material="Air" thickness="EcalAir1Thickness"/>
-      </layer>
-      <layer repeat="EcalEndcapNLayer3_NRepeat">
-        <slice material="TungstenDens24" thickness="EcalThickTungstenThickness"/>
-        <slice material="Air" thickness="EcalAir2Thickness"/>
-        <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
-        <slice material="Copper" thickness="EcalCopperThickness"/>
-        <slice material="Kapton" thickness="EcalKaptonThickness"/>
-        <slice material="Air" thickness="EcalAir1Thickness"/>
-      </layer>
-    </detector>
-
-    <comment>
-      -------------------
-      Crystal Calorimeter
-      -------------------
-      Backward (negative pseudorapidity) angle electron detector
-    </comment>
-    <detector 
-      id="CrystalEndcap_ID" 
-      name="ElectronECAL" 
-      type="CrystalCalorimeterEndcap" 
-      readout="CrystalEcalHits" 
-      vis="GreenVis">
-      <position x="CrystalEndcap_x_pos" y="CrystalEndcap_y_pos" z="CrystalEndcap_z_pos" />
-      <dimensions rmin="CrystalEndcap_rmin" rmax="CrystalEndcap_rmax" x="CrystalBox_x_length" y="CrystalBox_y_length" z="CrystalBox_z_length" delta="CrystalBox_offset"/>
-    </detector>
   </detectors>
 
   <!--  Definition of the readout segmentation/definition  -->
@@ -142,11 +73,7 @@
       <id>system:5,module:4,x:32:-16,y:-16</id>
     </readout>
     -->
-    <readout name="CrystalEcalHits">
-      <segmentation type="CartesianGridXY" grid_size_x="CrystalBox_x_length" grid_size_y="CrystalBox_y_length" />
-      <id>system:8,sector:4,module:20,x:48:-8,y:-8</id>
-    </readout>
-    <readout name="EcalEndcapHits">
+    <readout name="EcalEndcapPHits">
       <segmentation type="CartesianGridXY" grid_size_x="3.5 * mm" grid_size_y="3.5 * mm"/>
       <id>system:8,barrel:3,module:4,layer:6,slice:5,x:32:-16,y:-16</id>
     </readout>
diff --git a/src/HomogeneousCalorimeter_geo.cpp b/src/HomogeneousCalorimeter_geo.cpp
index f3d74c7f..0b1fed85 100644
--- a/src/HomogeneousCalorimeter_geo.cpp
+++ b/src/HomogeneousCalorimeter_geo.cpp
@@ -73,10 +73,10 @@ using namespace dd4hep::detail;
  *       <blocks sector="1"/>
  *         <module sizex="2.05*cm" sizey="2.05*cm" sizez="20*cm" vis="GreenVis" material="PbWO4"/>
  *         <wrapper thickness="0.015*cm" material="Epoxy" vis="WhiteVis"/>
- *         <placement x="1*cm" y="1*cm" z="0"/>
- *         <placement x="-1*cm" y="1*cm" z="0"/>
- *         <placement x="1*cm" y="-1*cm" z="0"/>
- *         <placement x="-1*cm" y="-1*cm" z="0"/>
+ *         <placement x="1*cm" y="1*cm" z="0" id="1"/>
+ *         <placement x="-1*cm" y="1*cm" z="0" id="2"/>
+ *         <placement x="1*cm" y="-1*cm" z="0" id="3"/>
+ *         <placement x="-1*cm" y="-1*cm" z="0" id="4"/>
  *       </blocks>
  *     </placements>
  *   </detector>
@@ -260,21 +260,21 @@ static void add_array(Detector& desc, Volume &env, xml::Collection_t &plm, Sensi
     }
 }
 
-// place modules
+// place modules, id must be provided
 static void add_blocks(Detector& desc, Volume &env, xml::Collection_t &plm, SensitiveDetector &sens, int sid)
 {
     Position modSize;
     auto modVol = build_module(desc, plm, sens, modSize);
     int sector_id = dd4hep::getAttrOrDefault<int>(plm, _Unicode(sector), sid);
 
-    int mid = 1;
-    for (xml::Collection_t pl(plm, _Unicode(placement)); pl; ++pl, ++mid) {
+    for (xml::Collection_t pl(plm, _Unicode(placement)); pl; ++pl) {
         Position pos(dd4hep::getAttrOrDefault<double>(pl, _Unicode(x), 0.),
                      dd4hep::getAttrOrDefault<double>(pl, _Unicode(y), 0.),
                      dd4hep::getAttrOrDefault<double>(pl, _Unicode(z), 0.));
         Position rot(dd4hep::getAttrOrDefault<double>(pl, _Unicode(rotx), 0.),
                      dd4hep::getAttrOrDefault<double>(pl, _Unicode(roty), 0.),
                      dd4hep::getAttrOrDefault<double>(pl, _Unicode(rotz), 0.));
+        auto mid = pl.attr<int>(_Unicode(id));
         Transform3D tr = Translation3D(pos.x(), pos.y(), pos.z())
                        * RotationZYX(rot.z(), rot.y(), rot.x());
         auto modPV = env.placeVolume(modVol, tr);
-- 
GitLab