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