From 8069afab24fb2af600784e73e229560b3b06d34a Mon Sep 17 00:00:00 2001
From: "jihee.kim" <jihee.kim@anl.gov>
Date: Thu, 15 Apr 2021 16:23:06 -0500
Subject: [PATCH] Added endcaps

---
 compact/cb_VTX_Endcaps.xml |  43 ++++++++++++
 compact/definitions.xml    |  23 ++++++-
 compact/display.xml        |   1 +
 reference_detector.xml     |   7 +-
 src/cb_VTX_EndcapN.cpp     | 134 +++++++++++++++++++++++++++++++++++++
 src/cb_VTX_EndcapP.cpp     | 134 +++++++++++++++++++++++++++++++++++++
 6 files changed, 337 insertions(+), 5 deletions(-)
 create mode 100644 compact/cb_VTX_Endcaps.xml
 create mode 100644 src/cb_VTX_EndcapN.cpp
 create mode 100644 src/cb_VTX_EndcapP.cpp

diff --git a/compact/cb_VTX_Endcaps.xml b/compact/cb_VTX_Endcaps.xml
new file mode 100644
index 0000000..21b8804
--- /dev/null
+++ b/compact/cb_VTX_Endcaps.xml
@@ -0,0 +1,43 @@
+<lccdd>
+
+  <comment> Central Vertex Endcaps Detector </comment>        
+
+  <define>
+  </define>
+
+  <limits>
+  </limits>
+
+  <regions>
+  </regions>
+
+  <display>
+  </display>
+
+  <detectors>
+    <detector id="cb_VTX_EndcapP_ID" name="cb_VTX_EndcapP" type="cb_VTX_EndcapP" readout="cb_VTX_Endcaps_Hits" vis="cb_VTX_EndcapsVis" reflect="false" insideTrackingVloume="true">
+      <dimensions rmin="cb_VTX_EndcapP_rmin" rmax="cb_VTX_EndcapP_rmax" length="cb_VTX_EndcapP_length"/>
+      <position x="cb_VTX_EndcapP_x_pos" y="cb_VTX_EndcapP_y_pos" z="cb_VTX_EndcapP_z_pos"/>
+      <material name="Si"/>
+    </detector>
+
+    <detector id="cb_VTX_EndcapN_ID" name="cb_VTX_EndcapN" type="cb_VTX_EndcapN" readout="cb_VTX_Endcaps_Hits" vis="cb_VTX_EndcapsVis" reflect="true" insideTrackingVloume="true">
+      <dimensions rmin="cb_VTX_EndcapN_rmin" rmax="cb_VTX_EndcapN_rmax" length="cb_VTX_EndcapN_length"/>
+      <position x="cb_VTX_EndcapN_x_pos" y="cb_VTX_EndcapN_y_pos" z="cb_VTX_EndcapN_z_pos"/>
+      <material name="Si"/>
+    </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="cb_VTX_Endcaps_Hits">
+      <segmentation type="CartesianGridXY" grid_size_x="1.0*mm" grid_size_y="1.0*mm" />
+      <id>system:8,barrel:4,layer:4,module:8,x:32:-16,y:-16</id>  
+    </readout>
+  </readouts>
+
+  <plugins>
+  </plugins>
+
+  <fields>
+  </fields>
+</lccdd>
diff --git a/compact/definitions.xml b/compact/definitions.xml
index 5b7f725..ce3ab4a 100644
--- a/compact/definitions.xml
+++ b/compact/definitions.xml
@@ -68,7 +68,9 @@
       Layer 4 subassembly ID: 29
       Layer 5 subassembly ID: 30
     </comment>
-    <constant name="cb_VTX_Barrel_ID" value="25"/>
+    <constant name="cb_VTX_Barrel_ID" value="31"/>
+    <constant name="cb_VTX_EndcapP_ID" value="32"/>
+    <constant name="cb_VTX_EndcapN_ID" value="33"/>
     <comment>
       Unused values reserved for vertex:
       constant name="SiVertexSubAssemblyLayer1_ID" value="121"
@@ -78,6 +80,7 @@
       constant name="SiVertexSubAssemblyLayer5_ID" value="125"
     </comment>
 
+
     <comment>
       ===============================
       (50-74) Silicon Tracker System
@@ -340,13 +343,29 @@
     
     <constant name="cb_VTX_Barrel_rmin"   value="33.0*mm"/>
     <constant name="cb_VTX_Barrel_rmax"   value="165.0*mm"/>
-    <constant name="cb_VTX_Barrel_length" value="740.0*mm"/>
+    <constant name="cb_VTX_Barrel_length" value="500.0*mm"/>
 
     <constant name="cb_VTX_Barrel_x_pos"   value="0.0*mm"/>
     <constant name="cb_VTX_Barrel_y_pos"   value="0.0*mm"/>
     <constant name="cb_VTX_Barrel_z_pos"   value="0.0*mm"/>
 
     <constant name="cb_VTX_Barrel_layer"   value="6"/>
+
+    <constant name="cb_VTX_EndcapP_rmin"   value="33.0*mm"/>
+    <constant name="cb_VTX_EndcapP_rmax"   value="165.0*mm"/>
+    <constant name="cb_VTX_EndcapP_length" value="250.0*mm"/>
+
+    <constant name="cb_VTX_EndcapP_x_pos"  value="0.0*mm"/>
+    <constant name="cb_VTX_EndcapP_y_pos"  value="0.0*mm"/>
+    <constant name="cb_VTX_EndcapP_z_pos"  value="25.0*mm"/>
+
+    <constant name="cb_VTX_EndcapN_rmin"   value="33.0*mm"/>
+    <constant name="cb_VTX_EndcapN_rmax"   value="165.0*mm"/>
+    <constant name="cb_VTX_EndcapN_length" value="250.0*mm"/>
+
+    <constant name="cb_VTX_EndcapN_x_pos"  value="0.0*mm"/>
+    <constant name="cb_VTX_EndcapN_y_pos"  value="0.0*mm"/>
+    <constant name="cb_VTX_EndcapN_z_pos"  value="-25.0*mm"/>
     <comment>
       --------------------------
       Silicon Tracker Parameters
diff --git a/compact/display.xml b/compact/display.xml
index a51b769..bcc5336 100644
--- a/compact/display.xml
+++ b/compact/display.xml
@@ -57,6 +57,7 @@
     <vis name="cb_GEM_layerVis"    alpha="0.8"  r= "0.8"  g="0.4"  b="0.3"  showDaughters="true" visible="true"/>
     <vis name="cb_VTX_BarrelVis"          alpha="0.1"  r= "0.1"  g="0.0"  b="1.0"  showDaughters="true" visible="true"/>
     <vis name="cb_VTX_Barrel_layerVis"    alpha="2.0"  r= "0.0"  g="0.2"  b="0.8"  showDaughters="true" visible="true"/>
+    <vis name="cb_VTX_EndcapsVis"          alpha="0.1"  r= "0.1"  g="0.0"  b="1.0"  showDaughters="true" visible="true"/>
 
     <vis name="ci_GEMVis"  r= "0.8"  g="0.4"  b="0.3" alpha="0.8" showDaughters="true" visible="true"/>
     <vis name="ci_HCALVis"  r= "0.6"  g="0"  b="0.6" alpha="1.0" showDaughters="true" visible="true"/>
diff --git a/reference_detector.xml b/reference_detector.xml
index 518c5ff..3a5e89c 100644
--- a/reference_detector.xml
+++ b/reference_detector.xml
@@ -114,7 +114,7 @@
   <include ref="reference_detector/vertex_tracker.xml"/>
   <include ref="compact/silicon_tracker.xml"/>
   -->
-  <include ref="ip6/beampipe.xml"/>
+  <!--<include ref="ip6/beampipe.xml"/>
   <include ref="compact/solenoid.xml"/>
   <include ref="compact/ecal.xml"/>
   <include ref="compact/cb_CTD_Si.xml"/>
@@ -124,14 +124,15 @@
   <include ref="compact/ci_GEM.xml"/>
   <include ref="compact/hcal.xml"/>
   <include ref="compact/forward_trd.xml"/>
-  <include ref="compact/B0_tracker.xml"/>
+  <include ref="compact/B0_tracker.xml"/>-->
   <include ref="compact/cb_VTX_Barrel.xml"/>
+  <include ref="compact/cb_VTX_Endcaps.xml"/>
   <!--
   <include ref="compact/ci_HCAL.xml"/>
   <include ref="compact/forward_rich.xml"/>
   <include ref="compact/roman_pots.xml"/>
   -->
-  <include ref="eic/forward_ion_beamline.xml"/>
+  <!--<include ref="eic/forward_ion_beamline.xml"/>-->
 
 
   <detectors>
diff --git a/src/cb_VTX_EndcapN.cpp b/src/cb_VTX_EndcapN.cpp
new file mode 100644
index 0000000..80fdf07
--- /dev/null
+++ b/src/cb_VTX_EndcapN.cpp
@@ -0,0 +1,134 @@
+#include <XML/Helper.h>
+#include "DDRec/Surface.h"
+#include "DDRec/DetectorData.h"
+#include "DD4hep/OpticalSurfaces.h"
+#include "DD4hep/DetFactoryHelper.h"
+#include "DD4hep/Printout.h"
+//////////////////////////////////
+// Central Vertex Endcap Detector
+//////////////////////////////////
+
+using namespace std;
+using namespace dd4hep;
+
+static Ref_t createDetector(Detector& desc, xml_h e, SensitiveDetector sens)
+{
+  xml_det_t  x_det      = e;
+  string     detName    = x_det.nameStr();
+  int        detID      = x_det.id();
+
+  xml_dim_t  dim        = x_det.dimensions();
+  double     RIn        = dim.rmin();
+  double     ROut       = dim.rmax();
+  double     SizeZ      = dim.length();
+
+  xml_dim_t  pos        = x_det.position();
+
+  Material   Vacuum     = desc.material("Vacuum");
+
+  // Create Global Volume 
+  Tube cb_VTX_EndcapN_GVol_Solid(RIn, ROut, SizeZ / 2.0, 0., 360.0 * deg);
+  Volume detVol("cb_VTX_EndcapN_GVol_Logic", cb_VTX_EndcapN_GVol_Solid, Vacuum);
+  detVol.setVisAttributes(desc.visAttributes(x_det.visStr()));
+  Material mat = desc.material(x_det.materialStr()); 
+
+  //////////////////
+  // Endcaps Ladder
+  //////////////////
+  double x = 0.0 * cm;
+  double y = 0.0 * cm;
+  double z = 0.0 * cm;
+  double phi = 0.0;
+  int i_layer = 0;
+  int i_module = 0;
+  int lay = 0;
+  int NUMF;
+  phi = 0.0; x = 0.0; y = 0.0; z = 0.0;
+  double Fdeltaphi, Ftheta, F2theta;
+  double RxF[10], RyF[10], RzF[10], RxF2[10], RyF2[10], RzF2[10];
+  double Rzshift = 24.0 * cm;
+  double fVTX_END_EDY = 12.0 * cm;
+  double fVTX_END_EDZ = 0.05 * cm;
+  double fVTX_END_EDX1 = 6.0 * cm;
+  double fVTX_END_EDX2 = 4.0 * cm;
+
+  for (lay = 0; lay < 3; lay++) {
+    if (lay == 3) {
+      fVTX_END_EDY = 18.0 * cm;
+      NUMF = 24;
+      Fdeltaphi = 15.0 * deg;
+      Ftheta = -40.0 * deg;
+      RxF[lay] = 1.3 * cm;
+      RyF[lay] = RxF[lay];
+      RzF[lay] = -Rzshift - 5.5 * cm;
+      RxF2[lay] = 1.3 * cm;
+      RyF2[lay] = RxF2[lay];
+      RzF2[lay] = Rzshift + 5.5 * cm;
+    }
+    if (lay == 2) {
+      NUMF = 20;
+      fVTX_END_EDY = 16.0 * cm;
+      Fdeltaphi = 18.0 * deg;
+      Ftheta = -38.0 * deg;
+      RxF[lay] = 1.1 * cm;
+      RyF[lay] = RxF[lay];
+      RzF[lay] = -Rzshift - 5.5 * cm;
+      RxF2[lay] = 1.1 * cm;
+      RyF2[lay] = RxF2[lay];
+      RzF2[lay] = Rzshift + 5.5 * cm;
+    }
+    if (lay == 1) {
+      NUMF = 18;
+      fVTX_END_EDY = 14.0 * cm;
+      Fdeltaphi = 20.0 * deg;
+      Ftheta = -45.0 * deg;
+      RxF[lay] = 1.0 * cm;
+      RyF[lay] = RxF[lay];
+      RzF[lay] = -Rzshift + 1.0 * cm;
+      RxF2[lay] = 1.0 * cm;
+      RyF2[lay] = RxF2[lay];
+      RzF2[lay] = Rzshift - 1.0 * cm;
+    }
+    if (lay == 0) {
+      NUMF = 12;
+      fVTX_END_EDY = 12.0 * cm;
+      Fdeltaphi = 30.0 * deg;
+      Ftheta = -55.0 * deg;
+      RxF[lay] = 0.8 * cm;
+      RyF[lay] = RxF[lay];
+      RzF[lay] = -Rzshift + 7.0 * cm;
+      RxF2[lay] = 0.8 * cm;
+      RyF2[lay] = RxF2[lay];
+      RzF2[lay] = Rzshift - 7.0 * cm;
+    }
+
+    i_layer++;
+    // Electron going side Endcap
+    string logicladderENDEName = detName + _toString(lay, "_logic_ladder_END_E%d");
+    Volume ladderENDEVol(logicladderENDEName,Trap(fVTX_END_EDZ,fVTX_END_EDY + lay * 2.0, fVTX_END_EDX1, fVTX_END_EDX2), mat);
+    for (int ia = 0; ia < NUMF; ia++) {
+      phi = ia * Fdeltaphi;
+      x = -RxF[lay] * cos(phi);
+      y = -RyF[lay] * sin(phi);
+      z = RzF[lay];
+
+      RotationZYX ladder_ENDE_rot = RotationZYX(-90.0 + (Fdeltaphi * (ia + 1)), 0.0, Ftheta);
+      Position ladder_ENDE_pos = Position(x,y,z);
+      string ladderName = detName + _toString(lay, "_ladder_END_E_Phys_%d") + _toString(ia, "_%d");
+      PlacedVolume ladderENDEPV = detVol.placeVolume(ladderENDEVol, Transform3D(ladder_ENDE_rot, ladder_ENDE_pos));
+      i_module++;
+      ladderENDEPV.addPhysVolID("layer", i_layer).addPhysVolID("module", i_module);
+    }
+  }
+
+  DetElement   det(detName, detID);
+  Volume       motherVol = desc.pickMotherVolume(det);
+  Transform3D  tr(RotationZYX(0.0, 0.0, 0.0), Position(pos.x(), pos.y(), pos.z()));
+  PlacedVolume detPV = motherVol.placeVolume(detVol, tr);
+  detPV.addPhysVolID("system", detID);
+  detPV.addPhysVolID("barrel", 1);
+  det.setPlacement(detPV);
+  return det;
+}
+
+DECLARE_DETELEMENT(cb_VTX_EndcapN, createDetector)
diff --git a/src/cb_VTX_EndcapP.cpp b/src/cb_VTX_EndcapP.cpp
new file mode 100644
index 0000000..5f61c55
--- /dev/null
+++ b/src/cb_VTX_EndcapP.cpp
@@ -0,0 +1,134 @@
+#include <XML/Helper.h>
+#include "DDRec/Surface.h"
+#include "DDRec/DetectorData.h"
+#include "DD4hep/OpticalSurfaces.h"
+#include "DD4hep/DetFactoryHelper.h"
+#include "DD4hep/Printout.h"
+//////////////////////////////////
+// Central Vertex Endcap Detector
+//////////////////////////////////
+
+using namespace std;
+using namespace dd4hep;
+
+static Ref_t createDetector(Detector& desc, xml_h e, SensitiveDetector sens)
+{
+  xml_det_t  x_det      = e;
+  string     detName    = x_det.nameStr();
+  int        detID      = x_det.id();
+
+  xml_dim_t  dim        = x_det.dimensions();
+  double     RIn        = dim.rmin();
+  double     ROut       = dim.rmax();
+  double     SizeZ      = dim.length();
+
+  xml_dim_t  pos        = x_det.position();
+
+  Material   Vacuum     = desc.material("Vacuum");
+
+  // Create Global Volume 
+  Tube cb_VTX_EndcapP_GVol_Solid(RIn, ROut, SizeZ / 2.0, 0., 360.0 * deg);
+  Volume detVol("cb_VTX_EndcapP_GVol_Logic", cb_VTX_EndcapP_GVol_Solid, Vacuum);
+  detVol.setVisAttributes(desc.visAttributes(x_det.visStr()));
+  Material mat = desc.material(x_det.materialStr()); 
+
+  //////////////////
+  // Endcaps Ladder
+  //////////////////
+  double x = 0.0 * cm;
+  double y = 0.0 * cm;
+  double z = 0.0 * cm;
+  double phi = 0.0;
+  int i_layer = 0;
+  int i_module = 0;
+  int lay = 0;
+  int NUMF;
+  phi = 0.0; x = 0.0; y = 0.0; z = 0.0;
+  double Fdeltaphi, Ftheta, F2theta;
+  double RxF[10], RyF[10], RzF[10], RxF2[10], RyF2[10], RzF2[10];
+  double Rzshift = 24.0 * cm;
+  double fVTX_END_EDY = 12.0 * cm;
+  double fVTX_END_EDZ = 0.05 * cm;
+  double fVTX_END_EDX1 = 6.0 * cm;
+  double fVTX_END_EDX2 = 4.0 * cm;
+
+  for (lay = 0; lay < 3; lay++) {
+    if (lay == 3) {
+      fVTX_END_EDY = 18.0 * cm;
+      NUMF = 24;
+      Fdeltaphi = 15.0 * deg;
+      Ftheta = -40.0 * deg;
+      RxF[lay] = 1.3 * cm;
+      RyF[lay] = RxF[lay];
+      RzF[lay] = -Rzshift - 5.5 * cm;
+      RxF2[lay] = 1.3 * cm;
+      RyF2[lay] = RxF2[lay];
+      RzF2[lay] = Rzshift + 5.5 * cm;
+    }
+    if (lay == 2) {
+      NUMF = 20;
+      fVTX_END_EDY = 16.0 * cm;
+      Fdeltaphi = 18.0 * deg;
+      Ftheta = -38.0 * deg;
+      RxF[lay] = 1.1 * cm;
+      RyF[lay] = RxF[lay];
+      RzF[lay] = -Rzshift - 5.5 * cm;
+      RxF2[lay] = 1.1 * cm;
+      RyF2[lay] = RxF2[lay];
+      RzF2[lay] = Rzshift + 5.5 * cm;
+    }
+    if (lay == 1) {
+      NUMF = 18;
+      fVTX_END_EDY = 14.0 * cm;
+      Fdeltaphi = 20.0 * deg;
+      Ftheta = -45.0 * deg;
+      RxF[lay] = 1.0 * cm;
+      RyF[lay] = RxF[lay];
+      RzF[lay] = -Rzshift + 1.0 * cm;
+      RxF2[lay] = 1.0 * cm;
+      RyF2[lay] = RxF2[lay];
+      RzF2[lay] = Rzshift - 1.0 * cm;
+    }
+    if (lay == 0) {
+      NUMF = 12;
+      fVTX_END_EDY = 12.0 * cm;
+      Fdeltaphi = 30.0 * deg;
+      Ftheta = -55.0 * deg;
+      RxF[lay] = 0.8 * cm;
+      RyF[lay] = RxF[lay];
+      RzF[lay] = -Rzshift + 7.0 * cm;
+      RxF2[lay] = 0.8 * cm;
+      RyF2[lay] = RxF2[lay];
+      RzF2[lay] = Rzshift - 7.0 * cm;
+    }
+
+    i_layer++;
+    // Hadron going side Endcap
+    string logicladderENDHName = detName + _toString(lay, "_logic_ladder_END_H%d");
+    Volume ladderENDHVol(logicladderENDHName,Trap(fVTX_END_EDZ, fVTX_END_EDY, fVTX_END_EDX1, fVTX_END_EDX2), mat);
+    for (int ia = 0; ia < NUMF; ia++) {
+      phi = ia * Fdeltaphi;
+      x = -RxF2[lay] * cos(phi);
+      y = -RyF2[lay] * sin(phi);
+      z = RzF2[lay];
+
+      RotationZYX ladder_ENDH_rot = RotationZYX(-90.0 + (Fdeltaphi * (ia + 1)), 0.0, -Ftheta);
+      Position ladder_ENDH_pos = Position(x,y,z);
+      string ladderName = detName + _toString(lay, "_ladder_END_H_Phys_%d") + _toString(ia, "_%d");
+      PlacedVolume ladderENDHPV = detVol.placeVolume(ladderENDHVol, Transform3D(ladder_ENDH_rot, ladder_ENDH_pos));
+      i_module++;
+      ladderENDHPV.addPhysVolID("layer", i_layer).addPhysVolID("module", i_module);
+    }
+  }
+
+  DetElement   det(detName, detID);
+  Volume       motherVol = desc.pickMotherVolume(det);
+  Transform3D  tr(RotationZYX(0.0, 0.0, 0.0), Position(pos.x(), pos.y(), pos.z()));
+  PlacedVolume detPV = motherVol.placeVolume(detVol, tr);
+  detPV.addPhysVolID("system", detID);
+  detPV.addPhysVolID("barrel", 1);
+  det.setPlacement(detPV);
+  return det;
+}
+
+DECLARE_DETELEMENT(cb_VTX_EndcapP, createDetector)
-- 
GitLab