From 314d828b81a614286e15f2f85149e9f7cb0de902 Mon Sep 17 00:00:00 2001
From: "jihee.kim" <jihee.kim@anl.gov>
Date: Wed, 14 Apr 2021 21:19:39 -0500
Subject: [PATCH] Added endcaps ladder

---
 src/cb_VTX.cpp | 110 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 108 insertions(+), 2 deletions(-)

diff --git a/src/cb_VTX.cpp b/src/cb_VTX.cpp
index 3d58b10..808641b 100644
--- a/src/cb_VTX.cpp
+++ b/src/cb_VTX.cpp
@@ -31,7 +31,9 @@ static Ref_t createDetector(Detector& desc, xml_h e, SensitiveDetector sens)
   Volume detVol("cb_VTX_GVol_Logic", cb_VTX_GVol_Solid, Vacuum);
   detVol.setVisAttributes(desc.visAttributes(x_det.visStr()));
 
+  //////////////////
   // Barrel Ladder
+  //////////////////
   xml_comp_t x_layer = x_det.child(_U(layer));
   const int repeat   = x_layer.repeat();
   
@@ -57,7 +59,8 @@ static Ref_t createDetector(Detector& desc, xml_h e, SensitiveDetector sens)
   lay_Dx[4] = 0.150 * mm; lay_Dy[4] = 4.0 * cm; lay_Dz[4] = 36.0 * cm; lay_Rin[4] = 13.5 * cm;
   lay_Dx[5] = 0.150 * mm; lay_Dy[5] = 4.0 * cm; lay_Dz[5] = 48.0 * cm; lay_Rin[5] = 15.5 * cm;
 
-  int i_module = 0.0;
+  int i_layer = 0;
+  int i_module = 0;
   // Loop over layers
   for(int i = 0; i < repeat; i++) {
     double cb_VTX_ladder_DZ = lay_Dz[i];
@@ -83,6 +86,7 @@ static Ref_t createDetector(Detector& desc, xml_h e, SensitiveDetector sens)
     ladderVol.setVisAttributes(desc,x_layer.visStr());
     sens.setType("tracker");
     ladderVol.setSensitiveDetector(sens);
+    i_layer++;
 
     for (int ia = 0; ia < laddersCount; ia++) {
       phi = (ia * (cb_VTX_ladder_deltaphi));
@@ -94,7 +98,109 @@ static Ref_t createDetector(Detector& desc, xml_h e, SensitiveDetector sens)
       string ladderName = detName + _toString(i, "_ladder_Phys_%d") + _toString(ia, "_%d"); 
       PlacedVolume ladderPV = detVol.placeVolume(ladderVol, Transform3D(ladder_rot, ladder_pos));
       i_module++;
-      ladderPV.addPhysVolID("layer", i+1).addPhysVolID("module", i_module);
+      ladderPV.addPhysVolID("layer", i_layer).addPhysVolID("module", i_module);
+    }
+  }
+
+  // TODO: Pixels
+
+  //////////////////
+  // Endcaps Ladder
+  //////////////////
+  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 = -44.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), slice_mat);
+    for (int ia = 0; ia < NUMF; ia++) {
+      phi = ia * Fdeltaphi;
+      x = -RxF[lay] * cos(phi) * cm;
+      y = -RyF[lay] * sin(phi) * cm;
+      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);
+    }
+
+    // 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), slice_mat);
+    for (int ia = 0; ia < NUMF; ia++) {
+      phi = ia * Fdeltaphi;
+      x = -RxF2[lay] * cos(phi) * cm;
+      y = -RyF2[lay] * sin(phi) * cm;
+      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);
     }
   }
 
-- 
GitLab