From f2f53aae22f4c298ecbba036b74cc97d0aad83a6 Mon Sep 17 00:00:00 2001
From: myliu <201916234@mail.sdu.edu.cn>
Date: Tue, 23 Mar 2021 20:54:51 +0800
Subject: [PATCH] Use segmentation to divide the layer

---
 Detector/DetDriftChamber/compact/det.xml      | 53 +++++++++++++------
 .../src/driftchamber/DriftChamber.cpp         | 43 ++++++++-------
 .../DetSegmentation/GridDriftChamber.h        | 17 ++++++
 .../DetSegmentation/src/GridDriftChamber.cpp  | 27 ++++++++--
 4 files changed, 101 insertions(+), 39 deletions(-)

diff --git a/Detector/DetDriftChamber/compact/det.xml b/Detector/DetDriftChamber/compact/det.xml
index 55176dae..3b098e64 100644
--- a/Detector/DetDriftChamber/compact/det.xml
+++ b/Detector/DetDriftChamber/compact/det.xml
@@ -35,14 +35,26 @@
     <constant name="SDT_length" value="SDT_half_length*2"/>
     <constant name="DC_length" value="SDT_length-DC_Endcap_dz*2"/>
 
-    <constant name="DC_safe_distance" value="0.02*mm"/>
+    <constant name="DC_safe_distance" value="0.2*mm"/>
 
-    <constant name="SDT_inner_chamber_radius_min" value="235*mm-DC_safe_distance"/>
-    <constant name="SDT_inner_chamber_radius_max" value="906*mm"/>
+    <constant name="DC_inner_chamber_layer_rbegin" value="235*mm"/>
+    <constant name="DC_inner_chamber_layer_rend" value="905*mm"/>
+
+    <constant name="DC_outer_chamber_layer_rbegin" value="1085*mm"/>
+    <constant name="DC_outer_chamber_layer_rend" value="1715*mm"/>
+
+    <constant name="DC_inner_chamber_radius_min" value="DC_inner_chamber_layer_rbegin"/>
+    <constant name="DC_inner_chamber_radius_max" value="909*mm"/>
+
+    <constant name="DC_outer_chamber_radius_min" value="DC_outer_chamber_layer_rbegin"/>
+    <constant name="DC_outer_chamber_radius_max" value="1716*mm"/>
+
+    <constant name="SDT_inner_chamber_radius_min" value="DC_inner_chamber_layer_rbegin-DC_safe_distance"/>
+    <constant name="SDT_inner_chamber_radius_max" value="DC_inner_chamber_radius_max"/>
     <constant name="SDT_inner_chamber_length" value="DC_length"/>
 
-    <constant name="SDT_outer_chamber_radius_min" value="1085*mm-DC_safe_distance"/>
-    <constant name="SDT_outer_chamber_radius_max" value="1715*mm+DC_safe_distance"/>
+    <constant name="SDT_outer_chamber_radius_min" value="DC_outer_chamber_layer_rbegin-DC_safe_distance"/>
+    <constant name="SDT_outer_chamber_radius_max" value="DC_outer_chamber_radius_max"/>
     <constant name="SDT_outer_chamber_length" value="DC_length"/>
 
     <constant name="SDT_inner_chamber_layer_number" value="67"/>
@@ -50,14 +62,17 @@
     <constant name="SDT_chamber_layer_width" value="10*mm"/>
     <constant name="Epsilon" value="0*deg"/>
 
-    <constant name="SDT_inner_chamber_inner_wall_radius_min" value="234.6*mm"/>
-    <constant name="SDT_inner_chamber_inner_wall_radius_max" value="234.8*mm"/>
-    <constant name="SDT_inner_chamber_outer_wall_radius_min" value="906*mm"/>
-    <constant name="SDT_inner_chamber_outer_wall_radius_max" value="908.8*mm"/>
-    <constant name="SDT_outer_chamber_inner_wall_radius_min" value="1084*mm"/>
-    <constant name="SDT_outer_chamber_inner_wall_radius_max" value="1084.2*mm"/>
-    <constant name="SDT_outer_chamber_outer_wall_radius_min" value="1716*mm"/>
-    <constant name="SDT_outer_chamber_outer_wall_radius_max" value="1718.8*mm"/>
+    <constant name="SDT_inner_wall_thickness" value="0.2*mm"/>
+    <constant name="SDT_outer_wall_thickness" value="2.8*mm"/>
+
+    <constant name="SDT_inner_chamber_inner_wall_radius_min" value="SDT_inner_chamber_radius_min-SDT_inner_wall_thickness"/>
+    <constant name="SDT_inner_chamber_inner_wall_radius_max" value="SDT_inner_chamber_radius_min"/>
+    <constant name="SDT_inner_chamber_outer_wall_radius_min" value="SDT_inner_chamber_radius_max"/>
+    <constant name="SDT_inner_chamber_outer_wall_radius_max" value="SDT_inner_chamber_radius_max+SDT_outer_wall_thickness"/>
+    <constant name="SDT_outer_chamber_inner_wall_radius_min" value="SDT_outer_chamber_radius_min-SDT_inner_wall_thickness"/>
+    <constant name="SDT_outer_chamber_inner_wall_radius_max" value="SDT_outer_chamber_radius_min"/>
+    <constant name="SDT_outer_chamber_outer_wall_radius_min" value="SDT_outer_chamber_radius_max"/>
+    <constant name="SDT_outer_chamber_outer_wall_radius_max" value="SDT_outer_chamber_radius_max+SDT_outer_wall_thickness"/>
 
     <constant name="DC_Endcap_rmin" value="SDT_radius_min"/>
     <constant name="DC_Endcap_rmax" value="SDT_radius_max"/>
@@ -76,16 +91,22 @@
     <vis name="YellowVis" alpha="1.0" r="1.0" g="1.0"  b="0.0"   showDaughters="true"  visible="true"/>
   </display>
 
+  <limits>
+    <limitset name="DC_limits">
+      <limit name="step_length_max" particles="*" value="0.5" unit="mm" />
+    </limitset>
+  </limits>
+
   <regions>
     <region name="DriftChamberRegion">
     </region>
   </regions>
 
   <detectors>
-    <detector id="7" name="DriftChamber" type="DriftChamber" readout="DriftChamberHitsCollection" vis="VisibleBlue" sensitive="true" region="DriftChamberRegion">
+    <detector id="7" name="DriftChamber" type="DriftChamber" readout="DriftChamberHitsCollection" vis="VisibleBlue" sensitive="true" region="DriftChamberRegion" limits="DC_limits">
       <envelope vis="SeeThrough">
         <shape type="BooleanShape" operation="Union" material="Air">
-          <shape type="Tube" rmin="SDT_radius_min" rmax="909*mm" dz="SDT_half_length" />
+          <shape type="Tube" rmin="SDT_radius_min" rmax="SDT_inner_chamber_outer_wall_radius_max" dz="SDT_half_length" />
           <shape type="Tube" rmin="SDT_outer_chamber_inner_wall_radius_min" rmax="SDT_radius_max" dz="SDT_half_length" />
         </shape>
       </envelope>
@@ -108,7 +129,7 @@
 
   <readouts>
     <readout name="DriftChamberHitsCollection">
-      <segmentation type="GridDriftChamber" cell_size="10*mm" epsilon0="Epsilon" detector_length="DC_length" identifier_phi="cellID" DC_inner_rmin="SDT_inner_chamber_radius_min" DC_inner_rmax="SDT_inner_chamber_radius_max" DC_outer_rmin="SDT_outer_chamber_radius_min" DC_outer_rmax="SDT_outer_chamber_radius_max" layerID="layer"/>
+      <segmentation type="GridDriftChamber" cell_size="10*mm" epsilon0="Epsilon" detector_length="DC_length" identifier_phi="cellID" DC_inner_rbegin="DC_inner_chamber_layer_rbegin" DC_inner_rend="DC_inner_chamber_layer_rend" DC_outer_rbegin="DC_outer_chamber_layer_rbegin" DC_outer_rend="DC_outer_chamber_layer_rend" DC_inner_rmin="SDT_inner_chamber_radius_min" DC_inner_rmax="SDT_inner_chamber_radius_max" DC_outer_rmin="SDT_outer_chamber_radius_min" DC_outer_rmax="SDT_outer_chamber_radius_max" DC_inner_layer_number="SDT_inner_chamber_layer_number" DC_outer_layer_number="SDT_outer_chamber_layer_number" safe_distance="DC_safe_distance" layerID="layer" layer_width="SDT_chamber_layer_width"/>
 
       <id>system:8,chamber:1,layer:8,cellID:16</id>
     </readout>
diff --git a/Detector/DetDriftChamber/src/driftchamber/DriftChamber.cpp b/Detector/DetDriftChamber/src/driftchamber/DriftChamber.cpp
index 411edaa8..9ca01521 100644
--- a/Detector/DetDriftChamber/src/driftchamber/DriftChamber.cpp
+++ b/Detector/DetDriftChamber/src/driftchamber/DriftChamber.cpp
@@ -57,6 +57,10 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
     int inner_chamber_layer_number = theDetector.constant<int>("SDT_inner_chamber_layer_number");
     int outer_chamber_layer_number = theDetector.constant<int>("SDT_outer_chamber_layer_number");
     double chamber_layer_width  = theDetector.constant<double>("SDT_chamber_layer_width");
+    double inner_chamber_layer_rbegin = theDetector.constant<double>("DC_inner_chamber_layer_rbegin");
+    double inner_chamber_layer_rend = theDetector.constant<double>("DC_inner_chamber_layer_rend");
+    double outer_chamber_layer_rbegin = theDetector.constant<double>("DC_outer_chamber_layer_rbegin");
+    double outer_chamber_layer_rend = theDetector.constant<double>("DC_outer_chamber_layer_rend");
 
     double epsilon = theDetector.constant<double>("Epsilon");
 
@@ -64,8 +68,6 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
     int inner_chamber_enabled = theDetector.constant<int>("DC_inner_chamber_enabled");
     int outer_chamber_enabled = theDetector.constant<int>("DC_outer_chamber_enabled");
 
-    // - safe distance
-    double safe_diatance = theDetector.constant<double>("DC_safe_distance");
 
     // =======================================================================
     // Detector Construction
@@ -89,10 +91,21 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
     // - inner
     dd4hep::Tube det_inner_chamber_solid(inner_chamber_radius_min, inner_chamber_radius_max, inner_chamber_length*0.5);
     dd4hep::Volume det_inner_chamber_vol(det_name+"_inner_chamber_vol", det_inner_chamber_solid, chamber_mat);
+    if ( x_det.isSensitive() )   {
+       det_inner_chamber_vol.setRegion(theDetector,x_det.regionStr());
+       det_inner_chamber_vol.setLimitSet(theDetector,x_det.limitsStr());
+       det_inner_chamber_vol.setSensitiveDetector(sens);
+       sd.setType("tracker");
+    }
 
-    // - outer
-    dd4hep::Tube det_outer_chamber_solid(outer_chamber_radius_min, outer_chamber_radius_max, outer_chamber_length*0.5);
-    dd4hep::Volume det_outer_chamber_vol(det_name+"_outer_chamber_vol", det_outer_chamber_solid, chamber_mat);
+     // - outer
+     dd4hep::Tube det_outer_chamber_solid(outer_chamber_radius_min, outer_chamber_radius_max, outer_chamber_length*0.5);
+     dd4hep::Volume det_outer_chamber_vol(det_name+"_outer_chamber_vol", det_outer_chamber_solid, chamber_mat);
+     if ( x_det.isSensitive() )   {
+        det_outer_chamber_vol.setRegion(theDetector,x_det.regionStr());
+        det_outer_chamber_vol.setSensitiveDetector(sens);
+        sd.setType("tracker");
+     }
 
     // - wall
     double inner_chamber_inner_wall_rmin = theDetector.constant<double>("SDT_inner_chamber_inner_wall_radius_min");
@@ -163,19 +176,15 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
     // - layer
     for(int layer_id = 0; layer_id < (inner_chamber_layer_number+outer_chamber_layer_number); layer_id++) {
         double rmin,rmax,offset=0;
-        std::string layer_name;
         dd4hep::Volume* current_vol_ptr = nullptr;
-        dd4hep::Material layer_mat(theDetector.material("GasHe_90Isob_10"));
         if(inner_chamber_enabled && (layer_id < inner_chamber_layer_number)) {
            current_vol_ptr = &det_inner_chamber_vol;
-           rmin = inner_chamber_radius_min+safe_diatance+(layer_id*chamber_layer_width);
+           rmin = inner_chamber_layer_rbegin+(layer_id*chamber_layer_width);
            rmax = rmin+chamber_layer_width;
-           layer_name = det_name+"_inner_chamber_vol"+_toString(layer_id,"_layer%d");
-        } else if(outer_chamber_enabled && (layer_id > (inner_chamber_layer_number-1))) {
+        } else if(outer_chamber_enabled && (layer_id >= inner_chamber_layer_number)) {
            current_vol_ptr = &det_outer_chamber_vol;
-           rmin = outer_chamber_radius_min+safe_diatance+((layer_id-inner_chamber_layer_number)*chamber_layer_width);
+           rmin = outer_chamber_layer_rbegin+((layer_id-inner_chamber_layer_number)*chamber_layer_width);
            rmax = rmin+chamber_layer_width;
-           layer_name = det_name+"_outer_chamber_vol"+_toString(layer_id,"_layer%d");
         } else continue;
 
         //Construction of drift chamber layers
@@ -208,7 +217,7 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
             dd4hep::PlacedVolume module_phy = (*current_vol_ptr).placeVolume(module_vol,transform_module);
            // - Field wire
             dd4hep::PlacedVolume Module_phy;
-            double radius[9] = {rmid-chamber_layer_width*0.5+safe_diatance,rmid-chamber_layer_width*0.5+safe_diatance,rmid-chamber_layer_width*0.5+safe_diatance,rmid-chamber_layer_width*0.5+safe_diatance,rmid,rmid+chamber_layer_width*0.5-safe_diatance,rmid+chamber_layer_width*0.5-safe_diatance,rmid+chamber_layer_width*0.5-safe_diatance,rmid+chamber_layer_width*0.5-safe_diatance};
+            double radius[9] = {rmid-chamber_layer_width*0.5,rmid-chamber_layer_width*0.5,rmid-chamber_layer_width*0.5,rmid-chamber_layer_width*0.5,rmid,rmid+chamber_layer_width*0.5,rmid+chamber_layer_width*0.5,rmid+chamber_layer_width*0.5,rmid+chamber_layer_width*0.5};
             double phi[9] = {wire_phi+layer_Phi*0.25,wire_phi,wire_phi-layer_Phi*0.25,wire_phi-layer_Phi*0.5,wire_phi-layer_Phi*0.5,wire_phi-layer_Phi*0.5,wire_phi-layer_Phi*0.25,wire_phi,wire_phi+layer_Phi*0.25};
             int num = 5;
             if(layer_id==(inner_chamber_layer_number-1)||layer_id==(inner_chamber_layer_number+outer_chamber_layer_number-1)) { num = 9; }
@@ -219,9 +228,9 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
                 Module_phy = (*current_vol_ptr).placeVolume(Module_vol,transform_Module);
             }
         }
-//  }
+  }
 
-    }
+//  }
 
     // - place in det
     // inner
@@ -232,8 +241,6 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
                  transform_inner_chamber);
 
          det_inner_chamber_phy.addPhysVolID("chamber", 0);
-         det_inner_chamber_vol.setSensitiveDetector(sens);
-         sd.setType("tracker");
     }
     // outer
     dd4hep::Transform3D transform_outer_chamber(dd4hep::Rotation3D(),
@@ -243,8 +250,6 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
                transform_inner_chamber);
 
        det_outer_chamber_phy.addPhysVolID("chamber", 1);
-       det_outer_chamber_vol.setSensitiveDetector(sens);
-       sd.setType("tracker");
     }
     // - place in world
     dd4hep::Transform3D transform(dd4hep::Rotation3D(),
diff --git a/Detector/DetSegmentation/include/DetSegmentation/GridDriftChamber.h b/Detector/DetSegmentation/include/DetSegmentation/GridDriftChamber.h
index 28ad791c..2e58013c 100644
--- a/Detector/DetSegmentation/include/DetSegmentation/GridDriftChamber.h
+++ b/Detector/DetSegmentation/include/DetSegmentation/GridDriftChamber.h
@@ -52,10 +52,18 @@ public:
   inline double cell_Size() const { return m_cellSize; }
   inline double epsilon0() const { return m_epsilon0; }
   inline double detectorLength() const { return m_detectorLength; }
+  inline double DC_inner_rbegin() const { return m_DC_inner_rbegin; }
+  inline double DC_inner_rend() const { return m_DC_inner_rend; }
+  inline double DC_outer_rbegin() const { return m_DC_outer_rbegin; }
+  inline double DC_outer_rend() const { return m_DC_outer_rend; }
   inline double DC_inner_rmin() const { return m_DC_inner_rmin; }
   inline double DC_inner_rmax() const { return m_DC_inner_rmax; }
   inline double DC_outer_rmin() const { return m_DC_outer_rmin; }
   inline double DC_outer_rmax() const { return m_DC_outer_rmax; }
+  inline double safe_distance() const { return m_safe_distance; }
+  inline double layer_width() const { return m_layer_width; }
+  inline int DC_inner_layer_number() const { return m_DC_inner_layer_number; }
+  inline int DC_outer_layer_number() const { return m_DC_outer_layer_number; }
   inline const std::string& fieldNamePhi() const { return m_phiID; }
   inline const std::string& Layerid() const { return layer_id; }
   // Setters
@@ -141,10 +149,19 @@ protected:
   double m_cellSize;
   double m_epsilon0;
   double m_detectorLength;
+  double m_DC_inner_rbegin;
+  double m_DC_inner_rend;
+  double m_DC_outer_rbegin;
+  double m_DC_outer_rend;
   double m_DC_inner_rmin;
   double m_DC_inner_rmax;
   double m_DC_outer_rmin;
   double m_DC_outer_rmax;
+  double m_layer_width;
+  double m_safe_distance;
+  int m_DC_inner_layer_number;
+  int m_DC_outer_layer_number;
+
   std::string m_phiID;
   std::string layer_id;
 
diff --git a/Detector/DetSegmentation/src/GridDriftChamber.cpp b/Detector/DetSegmentation/src/GridDriftChamber.cpp
index 6cff5423..ec8f97f8 100644
--- a/Detector/DetSegmentation/src/GridDriftChamber.cpp
+++ b/Detector/DetSegmentation/src/GridDriftChamber.cpp
@@ -30,10 +30,18 @@ GridDriftChamber::GridDriftChamber(const BitFieldCoder* decoder) : Segmentation(
   registerParameter("detector_length", "Length of the wire", m_detectorLength, 1., SegmentationParameter::LengthUnit);
   registerIdentifier("identifier_phi", "Cell ID identifier for phi", m_phiID, "cellID");
   registerIdentifier("layerID", "layer id", layer_id, "layer");
+  registerParameter("DC_inner_rbegin", "DC_inner_rbegin", m_DC_inner_rbegin, 0., SegmentationParameter::LengthUnit);
+  registerParameter("DC_inner_rend", "DC_inner_rend", m_DC_inner_rend, 0., SegmentationParameter::LengthUnit);
+  registerParameter("DC_outer_rbegin", "DC_outer_rbegin", m_DC_outer_rbegin, 0., SegmentationParameter::LengthUnit);
+  registerParameter("DC_outer_rend", "DC_outer_rend", m_DC_outer_rend, 0., SegmentationParameter::LengthUnit);
   registerParameter("DC_inner_rmin", "DC_inner_rmin", m_DC_inner_rmin, 0., SegmentationParameter::LengthUnit);
   registerParameter("DC_inner_rmax", "DC_inner_rmax", m_DC_inner_rmax, 0., SegmentationParameter::LengthUnit);
   registerParameter("DC_outer_rmin", "DC_outer_rmin", m_DC_outer_rmin, 0., SegmentationParameter::LengthUnit);
   registerParameter("DC_outer_rmax", "DC_outer_rmax", m_DC_outer_rmax, 0., SegmentationParameter::LengthUnit);
+  registerParameter("safe_distance", "safe_distance", m_safe_distance, 0., SegmentationParameter::LengthUnit);
+  registerParameter("layer_width", "layer_width", m_layer_width, 0., SegmentationParameter::LengthUnit);
+  registerParameter("DC_inner_layer_number", "DC_inner_layer_number", m_DC_inner_layer_number, 0,SegmentationParameter::LengthUnit);
+  registerParameter("DC_outer_layer_number", "DC_outer_layer_number", m_DC_outer_layer_number, 0, SegmentationParameter::LengthUnit);
 }
 
 Vector3D GridDriftChamber::position(const CellID& /*cID*/) const {
@@ -50,11 +58,22 @@ CellID GridDriftChamber::cellID(const Vector3D& /*localPosition*/, const Vector3
   double posy = globalPosition.Y;
   double radius = sqrt(posx*posx+posy*posy);
 
+  double DC_layerdelta = m_layer_width;
+
   int layerid;
-  if(radius > m_DC_inner_rmin && radius < m_DC_inner_rmax) layerid = floor(radius-m_DC_inner_rmin);
-  else if (radius > m_DC_outer_rmin && radius < m_DC_outer_rmax)
-           layerid = floor(radius-m_DC_outer_rmin)+floor(m_DC_inner_rmax-m_DC_inner_rmin);
-  else return -1;
+  if( radius<= m_DC_inner_rend && radius>= m_DC_inner_rbegin) {
+      layerid = floor((radius - m_DC_inner_rbegin)/DC_layerdelta);
+  } else if ( radius<= m_DC_outer_rend && radius>= m_DC_outer_rbegin ) {
+      layerid = floor((radius - m_DC_outer_rbegin)/DC_layerdelta)+m_DC_inner_layer_number;
+  } else if ( radius>= (m_DC_inner_rmin-m_safe_distance) && radius < m_DC_inner_rbegin) {
+      layerid = 0;
+  } else if ( radius> m_DC_inner_rend && radius <= (m_DC_inner_rmax+m_safe_distance)) {
+      layerid = m_DC_inner_layer_number-1;
+  } else if ( radius>= (m_DC_outer_rmin-m_safe_distance) && radius < m_DC_outer_rbegin) {
+      layerid = m_DC_inner_layer_number;
+  } else if ( radius> m_DC_outer_rend && radius <= (m_DC_outer_rmax+m_safe_distance)) {
+      layerid = m_DC_inner_layer_number+ m_DC_outer_layer_number-1;
+  }
 
   updateParams(layerid);
 
-- 
GitLab