From a5c379bf150f876391f2edbc23b624b6a297d656 Mon Sep 17 00:00:00 2001
From: Whitney Armstrong <warmstrong@anl.gov>
Date: Wed, 24 Mar 2021 20:29:49 +0000
Subject: [PATCH] 	new file:   ecal.xml 	new file:  
 ../src/cb_EMCAL.cpp

---
 compact/ecal.xml                        | 184 ++++++++++++++++++++++++
 reference_detector.xml                  |   2 +-
 scripts/view1/.DAWN_1.history           |  31 ++++
 scripts/view2/.DAWN_1.history           |  31 ++++
 scripts/view3/.DAWN_1.history           |  31 ++++
 scripts/view4/.DAWN_1.history           |  31 ++++
 scripts/view7/.DAWN_1.history           |  31 ++++
 src/PolyhedraEndcapCalorimeter2_geo.cpp | 122 ++++++++++++++++
 8 files changed, 462 insertions(+), 1 deletion(-)
 create mode 100644 compact/ecal.xml
 create mode 100644 scripts/view1/.DAWN_1.history
 create mode 100644 scripts/view2/.DAWN_1.history
 create mode 100644 scripts/view3/.DAWN_1.history
 create mode 100644 scripts/view4/.DAWN_1.history
 create mode 100644 scripts/view7/.DAWN_1.history
 create mode 100644 src/PolyhedraEndcapCalorimeter2_geo.cpp

diff --git a/compact/ecal.xml b/compact/ecal.xml
new file mode 100644
index 00000000..be2a125c
--- /dev/null
+++ b/compact/ecal.xml
@@ -0,0 +1,184 @@
+<lccdd>
+
+  <define>
+    <constant name="CrystalEndcap_rmin"  value="VertexTrackerInnerRadius"/>
+    <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="-EcalEndcap_zmin"/>
+  </define>
+
+
+  <limits>
+  </limits>
+
+  <regions>
+  </regions>
+
+  <!-- Common Generic visualization attributes -->
+  <comment>Common Generic visualization attributes</comment>
+  <display>
+  </display>
+
+
+  <detectors>
+
+    <comment>
+      ---------------------
+      Barrel EM Calorimeter
+      ---------------------
+      A layered EM calorimeter with tungsten and silicon (or scintillator) strips
+    </comment>
+    <detector 
+      id="ECalBarrel_ID"
+      name="EcalBarrel"
+      type="DD4hep_EcalBarrel"
+      readout="EcalBarrelHits"
+      calorimeterType="EM_BARREL">
+      <dimensions 
+        numsides="CaloSides" 
+        rmin="EcalBarrel_rmin" 
+        z="EcalBarrelLength"/>
+      <staves vis="EcalBarrelVis"/>
+      <layer repeat="1">
+        <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
+        <slice material="Copper" thickness="EcalCopperThickness"/>
+        <slice material="Kapton" thickness="EcalKaptonThickness"/>
+        <slice material="Air" thickness="EcalAir1Thickness"/>
+      </layer>
+      <layer repeat="EcalBarrelThinLayers">
+        <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="EcalBarrelThickLayers">
+        <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>
+      -----------------------------
+      Forward Endcap EM Calorimeter
+      -----------------------------
+      A layered EM calorimeter with tungsten and silicon (or scintillator) strips
+    </comment>
+    <detector id="ECalEndcapP_ID" 
+      name="EcalEndcapP" 
+      reflect="false" 
+      type="DD4hep_PolyhedraEndcapCalorimeter2" 
+      readout="EcalEndcapHits" 
+      vis="EcalEndcapVis" 
+      calorimeterType="EM_ENDCAP" >
+      <dimensions 
+        numsides="CaloSides" 
+        zmin="EcalEndcap_zmin" 
+        rmin="EcalEndcapP_rmin" 
+        rmax="EcalBarrel_rmax " />
+      <layer repeat="1">
+        <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
+        <slice material="Copper" thickness="EcalCopperThickness"/>
+        <slice material="Kapton" thickness="EcalKaptonThickness"/>
+        <slice material="Air" thickness="EcalAir1Thickness"/>
+      </layer>
+      <layer repeat="EcalEndcapThinLayers">
+        <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="EcalEndcapThickLayers">
+        <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>
+      -------------------------------
+      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">
+      <dimensions 
+        numsides="CaloSides" 
+        zmin="EcalEndcap_zmin" 
+        rmin="EcalEndcapN_rmin" 
+        rmax="EcalBarrel_rmax " />
+      <layer repeat="1">
+        <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/>
+        <slice material="Copper" thickness="EcalCopperThickness"/>
+        <slice material="Kapton" thickness="EcalKaptonThickness"/>
+        <slice material="Air" thickness="EcalAir1Thickness"/>
+      </layer>
+      <layer repeat="EcalEndcapThinLayers">
+        <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="EcalEndcapThickLayers">
+        <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>
+  </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="EcalBarrelHits">
+      <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>
+    <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>
+
+<fields>
+</fields>
+</lccdd>
diff --git a/reference_detector.xml b/reference_detector.xml
index 1fda57fc..c4d74d09 100644
--- a/reference_detector.xml
+++ b/reference_detector.xml
@@ -115,8 +115,8 @@
   <include ref="compact/silicon_tracker.xml"/>
   -->
   <include ref="compact/solenoid.xml"/>
-  <!--
   <include ref="compact/ecal.xml"/>
+  <!--
   <include ref="compact/solenoid.xml"/>
   <include ref="compact/hcal.xml"/>
   <include ref="compact/reference_detector_rich.xml"/>
diff --git a/scripts/view1/.DAWN_1.history b/scripts/view1/.DAWN_1.history
new file mode 100644
index 00000000..42729c65
--- /dev/null
+++ b/scripts/view1/.DAWN_1.history
@@ -0,0 +1,31 @@
+1.34392e+07
+90
+180
+0
+0
+0
+0
+16.4
+1
+0.001
+0
+1
+1
+1
+0.5
+0.5
+0.5
+19
+71
+0.001
+0.001
+0.001
+3
+71
+0.001
+0
+0
+1
+evince
+0
+0
diff --git a/scripts/view2/.DAWN_1.history b/scripts/view2/.DAWN_1.history
new file mode 100644
index 00000000..16311bf7
--- /dev/null
+++ b/scripts/view2/.DAWN_1.history
@@ -0,0 +1,31 @@
+1.34392e+07
+0
+180
+0
+0
+0
+0
+8
+3
+0.001
+0
+1
+1
+1
+0.5
+0.5
+0.5
+19
+71
+0.01
+0.01
+0.01
+3
+70
+0.01
+1
+1
+1
+evince
+0
+0
diff --git a/scripts/view3/.DAWN_1.history b/scripts/view3/.DAWN_1.history
new file mode 100644
index 00000000..91340011
--- /dev/null
+++ b/scripts/view3/.DAWN_1.history
@@ -0,0 +1,31 @@
+1.34392e+07
+28.5
+151.5
+0
+0
+0
+0
+8
+5
+0.001
+0
+1
+1
+1
+0.5
+0.5
+0.5
+19
+71
+0.01
+0.01
+0.01
+3
+70
+0.01
+1
+1
+1
+evince
+0
+0
diff --git a/scripts/view4/.DAWN_1.history b/scripts/view4/.DAWN_1.history
new file mode 100644
index 00000000..9bc2199f
--- /dev/null
+++ b/scripts/view4/.DAWN_1.history
@@ -0,0 +1,31 @@
+1.34392e+07
+90
+0
+1
+0
+0
+491.1
+1.2
+5
+0.001
+0
+1
+1
+1
+0.5
+0.5
+0.5
+19
+71
+0.01
+0.01
+0.01
+3
+70
+0.01
+1
+1
+1
+evince
+0
+0
diff --git a/scripts/view7/.DAWN_1.history b/scripts/view7/.DAWN_1.history
new file mode 100644
index 00000000..558cf94b
--- /dev/null
+++ b/scripts/view7/.DAWN_1.history
@@ -0,0 +1,31 @@
+1.34392e+07
+0
+180
+0
+0
+0
+0
+18.6
+1
+0.001
+0
+1
+1
+1
+0.5
+0.5
+0.5
+19
+71
+0.01
+0.01
+0.01
+3
+70
+0.01
+1
+1
+1
+evince
+0
+0
diff --git a/src/PolyhedraEndcapCalorimeter2_geo.cpp b/src/PolyhedraEndcapCalorimeter2_geo.cpp
new file mode 100644
index 00000000..3469a1c6
--- /dev/null
+++ b/src/PolyhedraEndcapCalorimeter2_geo.cpp
@@ -0,0 +1,122 @@
+//==========================================================================
+//  AIDA Detector description implementation
+//--------------------------------------------------------------------------
+// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
+// All rights reserved.
+//
+// For the licensing terms see $DD4hepINSTALL/LICENSE.
+// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
+//
+// Author     : M.Frank
+//
+//==========================================================================
+//
+// Modified for TOPSiDE detector
+//
+//==========================================================================
+#include "DD4hep/DetFactoryHelper.h"
+#include "XML/Layering.h"
+
+using namespace std;
+using namespace dd4hep;
+using namespace dd4hep::detail;
+
+static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens) {
+    xml_det_t x_det = e;
+    xml_dim_t dim = x_det.dimensions();
+    int det_id = x_det.id();
+    bool reflect = x_det.reflect(true);
+    string det_name = x_det.nameStr();
+    Material air = description.air();
+    int numsides = dim.numsides();
+    double rmin = dim.rmin();
+    double rmax = dim.rmax() * std::cos(M_PI / numsides);
+    double zmin = dim.zmin();
+    Layering layering(x_det);
+    double totalThickness = layering.totalThickness();
+    Volume endcapVol("endcap", PolyhedraRegular(numsides, rmin, rmax, totalThickness), air);
+    DetElement endcap("endcap", det_id);
+
+    int l_num = 1;
+    int layerType = 0;
+    double layerZ = -totalThickness / 2;
+
+    endcapVol.setAttributes(description, x_det.regionStr(), x_det.limitsStr(), x_det.visStr());
+
+    for (xml_coll_t xc(x_det, _U(layer)); xc; ++xc) {
+        xml_comp_t x_layer = xc;
+        double l_thick = layering.layer(l_num - 1)->thickness();
+        string l_name = _toString(layerType, "layer%d");
+        int l_repeat = x_layer.repeat();
+        Volume l_vol(l_name, PolyhedraRegular(numsides, rmin, rmax, l_thick), air);
+        vector<PlacedVolume> sensitives;
+
+        int s_num = 1;
+        double sliceZ = -l_thick / 2;
+        for (xml_coll_t xs(x_layer, _U(slice)); xs; ++xs) {
+            xml_comp_t x_slice = xs;
+            string s_name = _toString(s_num, "slice%d");
+            double s_thick = x_slice.thickness();
+            Material s_mat = description.material(x_slice.materialStr());
+            Volume s_vol(s_name, PolyhedraRegular(numsides, rmin, rmax, s_thick), s_mat);
+
+            s_vol.setVisAttributes(description.visAttributes(x_slice.visStr()));
+            sliceZ += s_thick / 2;
+            PlacedVolume s_phv = l_vol.placeVolume(s_vol, Position(0, 0, sliceZ));
+            s_phv.addPhysVolID("slice", s_num);
+            if (x_slice.isSensitive()) {
+                sens.setType("calorimeter");
+                s_vol.setSensitiveDetector(sens);
+                sensitives.push_back(s_phv);
+            }
+            sliceZ += s_thick / 2;
+            s_num++;
+        }
+        l_vol.setVisAttributes(description.visAttributes(x_layer.visStr()));
+        if (l_repeat <= 0) throw std::runtime_error(x_det.nameStr() + "> Invalid repeat value");
+        for (int j = 0; j < l_repeat; ++j) {
+            string phys_lay = _toString(l_num, "layer%d");
+            layerZ += l_thick / 2;
+            DetElement layer_elt(endcap, phys_lay, l_num);
+            PlacedVolume pv = endcapVol.placeVolume(l_vol, Position(0, 0, layerZ));
+            pv.addPhysVolID("layer", l_num);
+            layer_elt.setPlacement(pv);
+            for (size_t ic = 0; ic < sensitives.size(); ++ic) {
+                PlacedVolume sens_pv = sensitives[ic];
+                DetElement comp_elt(layer_elt, sens_pv.volume().name(), l_num);
+                comp_elt.setPlacement(sens_pv);
+            }
+            layerZ += l_thick / 2;
+            ++l_num;
+        }
+        ++layerType;
+    }
+
+    double z_pos = zmin + totalThickness / 2;
+    PlacedVolume pv;
+    // Reflect it.
+    Assembly assembly(det_name);
+    DetElement endcapAssyDE(det_name, det_id);
+    Volume motherVol = description.pickMotherVolume(endcapAssyDE);
+    if (reflect) {
+        pv = assembly.placeVolume(endcapVol,
+                                  Transform3D(RotationZYX(M_PI / numsides, M_PI, 0), Position(0, 0, -z_pos)));
+        pv.addPhysVolID("barrel", 2);
+        Ref_t(endcap)->SetName((det_name + "_backward").c_str());
+        endcap.setPlacement(pv);
+    } else {
+        pv = assembly.placeVolume(endcapVol,
+                                  Transform3D(RotationZYX(M_PI / numsides, 0, 0), Position(0, 0, z_pos)));
+        pv.addPhysVolID("barrel", 1);
+        Ref_t(endcap)->SetName((det_name + "_forward").c_str());
+        endcap.setPlacement(pv);
+    }
+    endcapAssyDE.add(endcap);
+    pv = motherVol.placeVolume(assembly);
+    pv.addPhysVolID("system", det_id);
+    endcapAssyDE.setPlacement(pv);
+    return endcapAssyDE;
+}
+
+// clang-format off
+DECLARE_DETELEMENT(refdet_PolyhedraEndcapCalorimeter2, create_detector)
-- 
GitLab