From 7f31c86dfc045126e58fb7899912473c173e14bf Mon Sep 17 00:00:00 2001 From: Whitney Armstrong <warmstrong@anl.gov> Date: Thu, 15 Apr 2021 14:02:43 -0500 Subject: [PATCH] Added parameterized vertex tracker - Vertex tracker endcaps are simple disk trackers. --- CMakeLists.txt | 2 +- compact/cb_VTX_Barrel.xml | 106 +++++++++++++++++ compact/definitions.xml | 22 ++-- compact/vertex_tracker.xml | 204 +++++++++++++++++++++++++++++++++ reference_detector.xml | 3 +- src/SiVertexBarrel.cpp | 223 ++++++++++++++++++++++++++++++++++++ src/cb_VTX_Barrel.cpp | 12 +- src/ref_DiskTracker_geo.cpp | 21 ++-- 8 files changed, 563 insertions(+), 30 deletions(-) create mode 100644 compact/vertex_tracker.xml create mode 100644 src/SiVertexBarrel.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index f807d33a..11865bd4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,7 @@ set(a_lib_name reference_detector) dd4hep_configure_output() dd4hep_add_plugin(${a_lib_name} SOURCES src/*.cpp - # USES ActsCore ActsPluginDD4hep + USES ActsCore ActsPluginDD4hep ) target_link_libraries(${a_lib_name} PUBLIC DD4hep::DDCore DD4hep::DDRec diff --git a/compact/cb_VTX_Barrel.xml b/compact/cb_VTX_Barrel.xml index 4481871a..7979a82d 100644 --- a/compact/cb_VTX_Barrel.xml +++ b/compact/cb_VTX_Barrel.xml @@ -3,6 +3,32 @@ <comment> Central Barrel Vertex Detector </comment> <define> + <constant name="cb_VTX_Barrel_rmin" value="VertexTrackerInnerRadius"/> + <constant name="cb_VTX_Barrel_rmax" value="VertexTrackerOuterRadius"/> + <constant name="cb_VTX_Barrel_length" value="VertexTrackerOuterBarrelLength"/> + + <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"/> + + <comment> Need to cleanup and be more consistent with naming here </comment> + + <constant name="VertexTrackerBarrelLength" value="400.0*mm"/> + + <constant name="SiVertexEndcapP_rmin" value="VertexTrackerInnerRadius"/> + <constant name="SiVertexEndcapP_rmax" value="VertexTrackerOuterRadius"/> + <constant name="SiVertexEndcapP_zmin" value="VertexTrackerBarrelLength + 5*mm"/> + + <constant name="SiVertexEndcapN_rmin" value="VertexTrackerInnerRadius"/> + <constant name="SiVertexEndcapN_rmax" value="VertexTrackerOuterRadius"/> + <constant name="SiVertexEndcapN_zmin" value="VertexTrackerBarrelLength + 5*mm"/> + + <constant name="SiVertexEndcap_NLayers" value="5"/> + <constant name="SiVertexEndcapP_zmax" value="VertexTrackingRegion_length/2 - SiVertexEndcapN_zmin"/> + <constant name="SiVertexEndcapP_zmax" value="VertexTrackingRegion_length/2 - SiVertexEndcapN_zmin"/> + <constant name="SiVertexEndcap_delta" value="(SiVertexEndcapP_zmax - SiVertexEndcapP_zmin)/SiVertexEndcap_NLayers"/> </define> <limits> @@ -15,6 +41,16 @@ </display> <detectors> + + <detector id="SiVertexSubAssembly_ID" + name="SiVertexSubAssembly" + type="DD4hep_SubdetectorAssembly" + vis="SiTrackerSubAssemblyVis"> + <composite name="SiVertexEndcapN"/> + <composite name="SiVertexEndcapP"/> + <composite name="cb_VTX_Barrel"/> + </detector> + <detector id="cb_VTX_Barrel_ID" name="cb_VTX_Barrel" type="cb_VTX_Barrel" readout="cb_VTX_Barrel_Hits" vis="cb_VTX_BarrelVis" insideTrackingVloume="true"> <dimensions rmin="cb_VTX_Barrel_rmin" rmax="cb_VTX_Barrel_rmax" length="cb_VTX_Barrel_length"/> <position x="cb_VTX_Barrel_x_pos" y="cb_VTX_Barrel_y_pos" z="cb_VTX_Barrel_z_pos"/> @@ -22,6 +58,76 @@ <slice name="Silicon_slice" material="Si" sensitive="true"/> </layer> </detector> + + <detector id="SiVertexEndcapP_ID" name="SiVertexEndcapP" type="ref_DiskTracker" + insideTrackingVolume="true" reflect="false" vis="Argonne_Red"> + <position x="0" y="0" z="0"/> + <layer id="1" vis="Argonne_Orange" + inner_z="SiVertexEndcapP_zmin + 0*SiVertexEndcap_delta" + inner_r="SiVertexEndcapP_rmin" + outer_r="SiVertexEndcapP_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="2" vis="Argonne_Orange" + inner_z="SiVertexEndcapP_zmin + 1*SiVertexEndcap_delta" + inner_r="SiVertexEndcapP_rmin" + outer_r="SiVertexEndcapP_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="3" vis="Argonne_Orange" + inner_z="SiVertexEndcapP_zmin + 2*SiVertexEndcap_delta" + inner_r="SiVertexEndcapP_rmin" + outer_r="SiVertexEndcapP_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="4" vis="Argonne_Orange" + inner_z="SiVertexEndcapP_zmin + 3*SiVertexEndcap_delta" + inner_r="SiVertexEndcapP_rmin" + outer_r="SiVertexEndcapP_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="5" vis="Argonne_Orange" + inner_z="SiVertexEndcapP_zmin + 4*SiVertexEndcap_delta" + inner_r="SiVertexEndcapP_rmin" + outer_r="SiVertexEndcapP_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + </detector> + + <detector id="SiVertexEndcapN_ID" name="SiVertexEndcapN" type="ref_DiskTracker" + insideTrackingVolume="true" reflect="true" vis="Argonne_Red"> + <position x="0" y="0" z="0"/> + <layer id="1" vis="Argonne_Orange" + inner_z="SiVertexEndcapN_zmin + 0*SiVertexEndcap_delta" + inner_r="SiVertexEndcapN_rmin" + outer_r="SiVertexEndcapN_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="2" vis="Argonne_Orange" + inner_z="SiVertexEndcapN_zmin + 1*SiVertexEndcap_delta" + inner_r="SiVertexEndcapN_rmin" + outer_r="SiVertexEndcapN_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="3" vis="Argonne_Orange" + inner_z="SiVertexEndcapN_zmin + 2*SiVertexEndcap_delta" + inner_r="SiVertexEndcapN_rmin" + outer_r="SiVertexEndcapN_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="4" vis="Argonne_Orange" + inner_z="SiVertexEndcapN_zmin + 3*SiVertexEndcap_delta" + inner_r="SiVertexEndcapN_rmin" + outer_r="SiVertexEndcapN_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="5" vis="Argonne_Orange" + inner_z="SiVertexEndcapN_zmin + 4*SiVertexEndcap_delta" + inner_r="SiVertexEndcapN_rmin" + outer_r="SiVertexEndcapN_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + </detector> </detectors> <readouts> diff --git a/compact/definitions.xml b/compact/definitions.xml index bd787896..d52994d6 100644 --- a/compact/definitions.xml +++ b/compact/definitions.xml @@ -69,6 +69,11 @@ Layer 5 subassembly ID: 30 </comment> <constant name="cb_VTX_Barrel_ID" value="25"/> + <constant name="SiVertexBarrel_ID" value="cb_VTX_Barrel_ID"/> + <constant name="SiVertexSubAssembly_ID" value="26"/> + <constant name="SiVertexEndcapP_ID" value="30"/> + <constant name="SiVertexEndcapN_ID" value="40"/> + <comment> Unused values reserved for vertex: constant name="SiVertexSubAssemblyLayer1_ID" value="121" @@ -338,19 +343,9 @@ ------------------------- </comment> <constant name="VertexTrackerInnerRadius" value="30.0*mm"/> - <constant name="VertexTrackerOuterRadius" value="90.0*mm"/> + <constant name="VertexTrackerOuterRadius" value="150.0*mm"/> <constant name="VertexTrackerOuterBarrelLength" value="400.0*mm"/> - - <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_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"/> <comment> -------------------------- Silicon Tracker Parameters @@ -368,8 +363,9 @@ The central tracking detectors are assumed to be symmtric about the origin. </comment> - <constant name="CentralTracking_rmax" value="SiliconTrackerOuterRadius"/> - <constant name="CentralTracking_length" value="SiliconTrackerOuterBarrelLength + ForwardTrackingGEMLength"/> + <constant name="CentralTracking_rmax" value="SiliconTrackerOuterRadius"/> + <constant name="CentralTracking_length" value="SiliconTrackerOuterBarrelLength + ForwardTrackingGEMLength"/> + <constant name="VertexTrackingRegion_length" value="SiliconTrackerOuterBarrelLength"/> <comment> These are used by ddsim </comment> <constant name="tracker_region_rmax" value="Solenoid_rmax/2.0"/> diff --git a/compact/vertex_tracker.xml b/compact/vertex_tracker.xml new file mode 100644 index 00000000..7cdb8a16 --- /dev/null +++ b/compact/vertex_tracker.xml @@ -0,0 +1,204 @@ +<?xml version="1.0" encoding="UTF-8"?> +<lccdd> + <define> + + <constant name="VertexTrackerRadius1" value="30*mm"/> + <constant name="VertexTrackerRadius2" value="38*mm"/> + <constant name="VertexTrackerRadius3" value="46*mm"/> + <constant name="VertexTrackerRadius4" value="54*mm"/> + <constant name="VertexTrackerRadius5" value="62*mm"/> + <constant name="VertexTrackerRadius6" value="70*mm"/> + <constant name="VertexTrackerRadius7" value="78*mm"/> + <constant name="VertexTrackerRadius8" value="86*mm"/> + <constant name="VertexTrackerNModules1" value="14"/> + <constant name="VertexTrackerNModules2" value="18"/> + <constant name="VertexTrackerNModules3" value="22"/> + <constant name="VertexTrackerNModules4" value="24"/> + <constant name="VertexTrackerNModules5" value="28"/> + <constant name="VertexTrackerNModules6" value="32"/> + <constant name="VertexTrackerNModules7" value="36"/> + <constant name="VertexTrackerNModules8" value="40"/> + + <constant name="VertexTrackerBarrelLength" value="400.0*mm"/> + + <constant name="SiVertexEndcapP_rmin" value="VertexTrackerInnerRadius"/> + <constant name="SiVertexEndcapP_rmax" value="VertexTrackerOuterRadius"/> + <constant name="SiVertexEndcapP_zmin" value="VertexTrackerBarrelLength + 5*mm"/> + + <constant name="SiVertexEndcapN_rmin" value="VertexTrackerInnerRadius"/> + <constant name="SiVertexEndcapN_rmax" value="VertexTrackerOuterRadius"/> + <constant name="SiVertexEndcapN_zmin" value="VertexTrackerBarrelLength + 5*mm"/> + + <constant name="SiVertexEndcap_NLayers" value="5"/> + <constant name="SiVertexEndcapP_zmax" value="VertexTrackingRegion_length/2 - SiVertexEndcapN_zmin"/> + <constant name="SiVertexEndcapP_zmax" value="VertexTrackingRegion_length/2 - SiVertexEndcapN_zmin"/> + <constant name="SiVertexEndcap_delta" value="(SiVertexEndcapP_zmax - SiVertexEndcapP_zmin)/SiVertexEndcap_NLayers"/> + + +</define> + + + <display> + </display> + + + <detectors> + + <detector id="SiVertexSubAssembly_ID" + name="SiVertexSubAssembly" + type="DD4hep_SubdetectorAssembly" + vis="SiTrackerSubAssemblyVis"> + <composite name="SiVertexEndcapN"/> + <composite name="SiVertexEndcapP"/> + <composite name="SiVertexBarrel"/> + </detector> + + + <detector id="SiVertexBarrel_ID" name="SiVertexBarrel" type="refdet_SiVertexBarrel" + readout="SiVertexBarrelHits" insideTrackingVolume="true" > + <dimensions rmin="VertexTrackerRadius1-5*mm" rmax="VertexTrackerRadius8+5*mm" length="VertexTrackerBarrelLength+1.0*mm"/> + <comment> Define available modules </comment> + <module name="SOIPIXD" vis="PurpleVis"> + <frame width="15*mm" height="3.0*mm" length="VertexTrackerBarrelLength" thickness="0.1 * mm" material="CarbonFiber_25percent" vis="BlueGreenVis" /> + <module_component name="silicon" width="14.0*mm" length="VertexTrackerBarrelLength-0.1*mm" + thickness="0.05*mm" material="Silicon" sensitive="true"> + <position z="-0.025*mm" y="0*mm"/> + </module_component> + </module> + <module name="UFSD"> + <frame width="15*mm" height="3.0*mm" length="VertexTrackerBarrelLength" thickness="0.1 * mm" material="CarbonFiber_25percent" vis="BlueGreenVis" /> + <module_component name="silicon" width="14.0*mm" length="VertexTrackerBarrelLength-0.1*mm" + thickness="0.05*mm" material="Silicon" sensitive="true"> + <position z="-0.025*mm" y="0*mm"/> + </module_component> + </module> + <comment> Layers composed of many arrayed modules </comment> + <layer module="SOIPIXD" id="2" vis="InvisibleWithDaughters"> + <barrel_envelope inner_r="(VertexTrackerRadius1+VertexTrackerRadius2)/2" + outer_r="(VertexTrackerRadius2+VertexTrackerRadius3)/2" z_length="VertexTrackerBarrelLength+0.1*mm"/> + <rphi_layout phi_tilt="10.0*degree" nphi="VertexTrackerNModules2" phi0="0.0" rc="VertexTrackerRadius2" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/> + </layer> + <layer module="UFSD" id="3" vis="InvisibleWithDaughters"> + <barrel_envelope inner_r="(VertexTrackerRadius2+VertexTrackerRadius3)/2" + outer_r="(VertexTrackerRadius3+VertexTrackerRadius4)/2" z_length="VertexTrackerBarrelLength+0.1*mm"/> + <rphi_layout phi_tilt="10.0*degree" nphi="VertexTrackerNModules3" phi0="0.0" rc="VertexTrackerRadius3" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/> + </layer> + <layer module="UFSD" id="4" vis="InvisibleWithDaughters"> + <barrel_envelope inner_r="(VertexTrackerRadius3+VertexTrackerRadius4)/2" + outer_r="(VertexTrackerRadius4+VertexTrackerRadius5)/2" z_length="VertexTrackerBarrelLength+0.1*mm"/> + <rphi_layout phi_tilt="10.0*degree" nphi="VertexTrackerNModules4" phi0="0.0" rc="VertexTrackerRadius4" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/> + </layer> + <layer module="UFSD" id="5" vis="InvisibleWithDaughters"> + <barrel_envelope inner_r="(VertexTrackerRadius4+VertexTrackerRadius5)/2" + outer_r="(VertexTrackerRadius5+VertexTrackerRadius6)/2" z_length="VertexTrackerBarrelLength+0.1*mm"/> + <rphi_layout phi_tilt="10.0*degree" nphi="VertexTrackerNModules5" phi0="0.0" rc="VertexTrackerRadius5" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/> + </layer> + <layer module="UFSD" id="6" vis="InvisibleWithDaughters"> + <barrel_envelope inner_r="(VertexTrackerRadius5+VertexTrackerRadius6)/2" + outer_r="(VertexTrackerRadius6+VertexTrackerRadius7)/2" z_length="VertexTrackerBarrelLength+0.1*mm"/> + <rphi_layout phi_tilt="10.0*degree" nphi="VertexTrackerNModules6" phi0="0.0" rc="VertexTrackerRadius6" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/> + </layer> + <layer module="SOIPIXD" id="7" vis="InvisibleWithDaughters"> + <barrel_envelope inner_r="(VertexTrackerRadius6+VertexTrackerRadius7)/2" + outer_r="(VertexTrackerRadius7+VertexTrackerRadius8)/2" z_length="VertexTrackerBarrelLength+0.1*mm"/> + <rphi_layout phi_tilt="10.0*degree" nphi="VertexTrackerNModules7" phi0="0.0" rc="VertexTrackerRadius7" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/> + </layer> + <layer module="SOIPIXD" id="8" vis="InvisibleWithDaughters"> + <barrel_envelope inner_r="(VertexTrackerRadius7+VertexTrackerRadius8)/2" + outer_r="VertexTrackerRadius8+5*mm" z_length="VertexTrackerBarrelLength+0.1*mm"/> + <rphi_layout phi_tilt="10.0*degree" nphi="VertexTrackerNModules8" phi0="0.0" rc="VertexTrackerRadius8" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/> + </layer> + </detector> + + <detector id="SiVertexEndcapP_ID" name="SiVertexEndcapP" type="ref_DiskTracker" + insideTrackingVolume="true" reflect="false" vis="Argonne_Red"> + <position x="0" y="0" z="0"/> + <layer id="1" vis="Argonne_Orange" + inner_z="SiVertexEndcapP_zmin + 0*SiVertexEndcap_delta" + inner_r="SiVertexEndcapP_rmin" + outer_r="SiVertexEndcapP_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="2" vis="Argonne_Orange" + inner_z="SiVertexEndcapP_zmin + 1*SiVertexEndcap_delta" + inner_r="SiVertexEndcapP_rmin" + outer_r="SiVertexEndcapP_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="3" vis="Argonne_Orange" + inner_z="SiVertexEndcapP_zmin + 2*SiVertexEndcap_delta" + inner_r="SiVertexEndcapP_rmin" + outer_r="SiVertexEndcapP_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="4" vis="Argonne_Orange" + inner_z="SiVertexEndcapP_zmin + 3*SiVertexEndcap_delta" + inner_r="SiVertexEndcapP_rmin" + outer_r="SiVertexEndcapP_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="5" vis="Argonne_Orange" + inner_z="SiVertexEndcapP_zmin + 4*SiVertexEndcap_delta" + inner_r="SiVertexEndcapP_rmin" + outer_r="SiVertexEndcapP_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + </detector> + + <detector id="SiVertexEndcapN_ID" name="SiVertexEndcapN" type="ref_DiskTracker" + insideTrackingVolume="true" reflect="true" vis="Argonne_Red"> + <position x="0" y="0" z="0"/> + <layer id="1" vis="Argonne_Orange" + inner_z="SiVertexEndcapN_zmin + 0*SiVertexEndcap_delta" + inner_r="SiVertexEndcapN_rmin" + outer_r="SiVertexEndcapN_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="2" vis="Argonne_Orange" + inner_z="SiVertexEndcapN_zmin + 1*SiVertexEndcap_delta" + inner_r="SiVertexEndcapN_rmin" + outer_r="SiVertexEndcapN_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="3" vis="Argonne_Orange" + inner_z="SiVertexEndcapN_zmin + 2*SiVertexEndcap_delta" + inner_r="SiVertexEndcapN_rmin" + outer_r="SiVertexEndcapN_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="4" vis="Argonne_Orange" + inner_z="SiVertexEndcapN_zmin + 3*SiVertexEndcap_delta" + inner_r="SiVertexEndcapN_rmin" + outer_r="SiVertexEndcapN_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + <layer id="5" vis="Argonne_Orange" + inner_z="SiVertexEndcapN_zmin + 4*SiVertexEndcap_delta" + inner_r="SiVertexEndcapN_rmin" + outer_r="SiVertexEndcapN_rmax"> + <slice material="Air" thickness="1.0*mm" vis="Argonne_Orange" /> + </layer> + </detector> + + </detectors> + + <readouts> + <readout name="SiVertexBarrelHits"> + <segmentation type="CartesianGridXY" grid_size_x="0.20*mm" grid_size_y="0.20*mm" /> + <id>system:8,barrel:2,layer:4,module:12,sensor:2,x:32:-16,y:-16</id> + </readout> + <readout name="SiVertexEndcapHits"> + <segmentation type="CartesianGridXY" grid_size_x="0.20*mm" grid_size_y="0.20*mm" /> + <id>system:8,barrel:2,layer:4,module:12,sensor:2,x:32:-16,y:-16</id> + </readout> + </readouts> + + +</lccdd> diff --git a/reference_detector.xml b/reference_detector.xml index d18223e2..103d8b5d 100644 --- a/reference_detector.xml +++ b/reference_detector.xml @@ -127,8 +127,9 @@ <include ref="compact/B0_tracker.xml"/> <include ref="compact/forward_romanpot.xml"/> <include ref="compact/forward_offM_tracker.xml"/> - <include ref="compact/cb_VTX_Barrel.xml"/> + <include ref="compact/vertex_tracker.xml"/> <!-- + <include ref="compact/cb_VTX_Barrel.xml"/> <include ref="compact/ci_HCAL.xml"/> <include ref="compact/forward_rich.xml"/> <include ref="compact/roman_pots.xml"/> diff --git a/src/SiVertexBarrel.cpp b/src/SiVertexBarrel.cpp new file mode 100644 index 00000000..3a0927d2 --- /dev/null +++ b/src/SiVertexBarrel.cpp @@ -0,0 +1,223 @@ +/** \addtogroup VertexTracker Vertex Trackers + * \brief Type: **SiVertexBarrel**. + * \author W. Armstrong + * \ingroup trackers + * + * + * \code + * \endcode + * + * @{ + */ +#include "DD4hep/DetFactoryHelper.h" +#include "DD4hep/Printout.h" +#include "DD4hep/Shapes.h" +#include "DDRec/Surface.h" +#include "DDRec/DetectorData.h" +#include "XML/Layering.h" +#include "Acts/Plugins/DD4hep/ActsExtension.hpp" +#include "Acts/Surfaces/PlanarBounds.hpp" +#include "Acts/Surfaces/RectangleBounds.hpp" +#include "Acts/Surfaces/TrapezoidBounds.hpp" +#include "Acts/Definitions/Units.hpp" + + +using namespace std; +using namespace dd4hep; +using namespace dd4hep::rec; +using namespace dd4hep::detail; + +static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens) { + typedef vector<PlacedVolume> Placements; + xml_det_t x_det = e; + Material air = description.air(); + int det_id = x_det.id(); + string det_name = x_det.nameStr(); + DetElement sdet(det_name, det_id); + //Assembly assembly(det_name); + map<string, Volume> volumes; + map<string, Placements> sensitives; + map<string, xml_h> xmleles; + PlacedVolume pv; + dd4hep::xml::Dimension dimensions(x_det.dimensions()); + + Acts::ActsExtension* detWorldExt = new Acts::ActsExtension(); + detWorldExt->addType("barrel", "detector"); + sdet.addExtension<Acts::ActsExtension>(detWorldExt); + Tube topVolumeShape(dimensions.rmin(), dimensions.rmax(), dimensions.length() * 0.5); + Volume assembly(det_name,topVolumeShape,air); + + + sens.setType("tracker"); + + // loop over the modules + for (xml_coll_t mi(x_det, _U(module)); mi; ++mi) { + xml_comp_t x_mod = mi; + xml_comp_t m_env = x_mod.child(_U(frame)); + string m_nam = x_mod.nameStr(); + xmleles[m_nam] = x_mod; + + // triangular volume envelope + double frame_thickness = m_env.thickness(); + double frame_width = m_env.width(); + double frame_height = getAttrOrDefault<double>(m_env, _U(height), 5.0 * mm); + double tanth = frame_height/(frame_width/2.0); + double frame_height2 = frame_height-frame_thickness-frame_thickness/tanth; + double frame_width2 = 2.0*frame_height2/tanth; + + Trd1 moduleframe_part1(frame_width / 2, 0.001 * mm, m_env.length() / 2, + frame_height / 2); + Trd1 moduleframe_part2(frame_width2/2, 0.001 * mm, + m_env.length() / 2, frame_height2/2); + SubtractionSolid moduleframe(moduleframe_part1, moduleframe_part2,Position(0.0,frame_thickness,0.0)); + Volume v_module(m_nam+"_vol", moduleframe, description.material(m_env.materialStr())); + v_module.setVisAttributes(description, m_env.visStr()); + + // module assembly + Assembly m_vol( m_nam ); + m_vol.placeVolume(v_module, Position(0.0,0.0,frame_height/2)); + + int ncomponents = 0; + int sensor_number = 1; + + if (volumes.find(m_nam) != volumes.end()) { + printout(ERROR, "SiTrackerBarrel", "Logics error in building modules."); + throw runtime_error("Logics error in building modules."); + } + volumes[m_nam] = m_vol; + m_vol.setVisAttributes(description.visAttributes(x_mod.visStr())); + + for (xml_coll_t ci(x_mod, _U(module_component)); ci; ++ci, ++ncomponents) { + xml_comp_t x_comp = ci; + xml_comp_t x_pos = x_comp.position(false); + xml_comp_t x_rot = x_comp.rotation(false); + string c_nam = _toString(ncomponents, "component%d"); + Box c_box(x_comp.width() / 2, x_comp.length() / 2, x_comp.thickness() / 2); + Volume c_vol(c_nam, c_box, description.material(x_comp.materialStr())); + + if (x_pos && x_rot) { + Position c_pos(x_pos.x(0), x_pos.y(0), x_pos.z(0)); + RotationZYX c_rot(x_rot.z(0), x_rot.y(0), x_rot.x(0)); + pv = m_vol.placeVolume(c_vol, Transform3D(c_rot, c_pos)); + } else if (x_rot) { + pv = m_vol.placeVolume(c_vol, RotationZYX(x_rot.z(0), x_rot.y(0), x_rot.x(0))); + } else if (x_pos) { + pv = m_vol.placeVolume(c_vol, Position(x_pos.x(0), x_pos.y(0), x_pos.z(0))); + } else { + pv = m_vol.placeVolume(c_vol); + } + c_vol.setRegion(description, x_comp.regionStr()); + c_vol.setLimitSet(description, x_comp.limitsStr()); + c_vol.setVisAttributes(description, x_comp.visStr()); + if (x_comp.isSensitive()) { + pv.addPhysVolID(_U(sensor), sensor_number++); + c_vol.setSensitiveDetector(sens); + sensitives[m_nam].push_back(pv); + } + } + } + + // now build the layers + for (xml_coll_t li(x_det, _U(layer)); li; ++li) { + xml_comp_t x_layer = li; + xml_comp_t x_barrel = x_layer.child(_U(barrel_envelope)); + xml_comp_t x_layout = x_layer.child(_U(rphi_layout)); + xml_comp_t z_layout = x_layer.child(_U(z_layout)); // Get the <z_layout> element. + int lay_id = x_layer.id(); + string m_nam = x_layer.moduleStr(); + string lay_nam = _toString(x_layer.id(), "layer%d"); + Tube lay_tub(x_barrel.inner_r()+0.1*mm, x_barrel.outer_r()-0.1*mm, x_barrel.z_length() / 2); + Volume lay_vol(lay_nam, lay_tub, air); // Create the layer envelope volume. + lay_vol.setVisAttributes(description.visAttributes(x_layer.visStr())); + double phi0 = x_layout.phi0(); // Starting phi of first module. + double phi_tilt = x_layout.phi_tilt(); // Phi tilt of a module. + double rc = x_layout.rc(); // Radius of the module center. + int nphi = x_layout.nphi(); // Number of modules in phi. + double rphi_dr = x_layout.dr(); // The delta radius of every other module. + double phi_incr = (M_PI * 2) / nphi; // Phi increment for one module. + double phic = phi0; // Phi of the module center. + double z0 = z_layout.z0(); // Z position of first module in phi. + double nz = z_layout.nz(); // Number of modules to place in z. + double z_dr = z_layout.dr(); // Radial displacement parameter, of every other module. + Volume module_env = volumes[m_nam]; + DetElement lay_elt(sdet, _toString(x_layer.id(), "layer%d"), lay_id); + Placements& sensVols = sensitives[m_nam]; + + // the local coordinate systems of modules in dd4hep and acts differ + // see http://acts.web.cern.ch/ACTS/latest/doc/group__DD4hepPlugins.html + Acts::ActsExtension* layerExtension = new Acts::ActsExtension(); + layerExtension->addType("sensitive cylinder", "layer"); + //layerExtension->addType("axes", "definitions", "XzY"); + lay_elt.addExtension<Acts::ActsExtension>(layerExtension); + + // Z increment for module placement along Z axis. + // Adjust for z0 at center of module rather than + // the end of cylindrical envelope. + double z_incr = nz > 1 ? (2.0 * z0) / (nz - 1) : 0.0; + // Starting z for module placement along Z axis. + double module_z = -z0; + int module = 1; + + // Loop over the number of modules in phi. + for (int ii = 0; ii < nphi; ii++) { + double dx = z_dr * std::cos(phic + phi_tilt); // Delta x of module position. + double dy = z_dr * std::sin(phic + phi_tilt); // Delta y of module position. + double x = rc * std::cos(phic); // Basic x module position. + double y = rc * std::sin(phic); // Basic y module position. + + // Loop over the number of modules in z. + for (int j = 0; j < nz; j++) { + string module_name = _toString(module, "module%d"); + DetElement mod_elt(lay_elt, module_name, module); + + Transform3D tr(RotationZYX(0, ((M_PI / 2) - phic - phi_tilt), -M_PI / 2), + Position(x, y, module_z)); + + pv = lay_vol.placeVolume(module_env, tr); + pv.addPhysVolID("module", module); + mod_elt.setPlacement(pv); + for (size_t ic = 0; ic < sensVols.size(); ++ic) { + PlacedVolume sens_pv = sensVols[ic]; + DetElement comp_de(mod_elt, std::string("de_") + sens_pv.volume().name(), module); + comp_de.setPlacement(sens_pv); + Acts::ActsExtension* moduleExtension = new Acts::ActsExtension(); + comp_de.addExtension<Acts::ActsExtension>(moduleExtension); + comp_de.setAttributes(description, sens_pv.volume(), x_layer.regionStr(), x_layer.limitsStr(), + xml_det_t(xmleles[m_nam]).visStr()); + } + + /// Increase counters etc. + module++; + // Adjust the x and y coordinates of the module. + x += dx; + y += dy; + // Flip sign of x and y adjustments. + dx *= -1; + dy *= -1; + // Add z increment to get next z placement pos. + module_z += z_incr; + } + phic += phi_incr; // Increment the phi placement of module. + rc += rphi_dr; // Increment the center radius according to dr parameter. + rphi_dr *= -1; // Flip sign of dr parameter. + module_z = -z0; // Reset the Z placement parameter for module. + } + // Create the PhysicalVolume for the layer. + pv = assembly.placeVolume(lay_vol); // Place layer in mother + pv.addPhysVolID("layer", lay_id); // Set the layer ID. + lay_elt.setAttributes(description, lay_vol, x_layer.regionStr(), x_layer.limitsStr(), + x_layer.visStr()); + lay_elt.setPlacement(pv); + } + sdet.setAttributes(description, assembly, x_det.regionStr(), x_det.limitsStr(), x_det.visStr()); + assembly.setVisAttributes(description.invisible()); + pv = description.pickMotherVolume(sdet).placeVolume(assembly); + pv.addPhysVolID("system", det_id); // Set the subdetector system ID. + pv.addPhysVolID("barrel", 1); // Flag this as a barrel subdetector. + sdet.setPlacement(pv); + return sdet; +} + +//@} +// clang-format off +DECLARE_DETELEMENT(refdet_SiVertexBarrel, create_detector) diff --git a/src/cb_VTX_Barrel.cpp b/src/cb_VTX_Barrel.cpp index 511f4a26..23b27c22 100644 --- a/src/cb_VTX_Barrel.cpp +++ b/src/cb_VTX_Barrel.cpp @@ -52,12 +52,12 @@ static Ref_t createDetector(Detector& desc, xml_h e, SensitiveDetector sens) double lay_Dy[6]; double lay_Dz[6]; double lay_Rin[6]; - lay_Dx[0] = 0.050 * mm; lay_Dy[0] = 2.0 * cm; lay_Dz[0] = 10.0 * cm; lay_Rin[0] = 3.5 * cm; - lay_Dx[1] = 0.050 * mm; lay_Dy[1] = 2.0 * cm; lay_Dz[1] = 11.0 * cm; lay_Rin[1] = 4.5 * cm; - lay_Dx[2] = 0.150 * mm; lay_Dy[2] = 4.0 * cm; lay_Dz[2] = 18.0 * cm; lay_Rin[2] = 6.5 * cm; - lay_Dx[3] = 0.150 * mm; lay_Dy[3] = 4.0 * cm; lay_Dz[3] = 24.0 * cm; lay_Rin[3] = 10.5 * cm; - 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; + lay_Dx[0] = 0.050 * mm; lay_Dy[0] = 1.0 * cm; lay_Dz[0] = 10.0 * cm; lay_Rin[0] = 3.5 * cm; + lay_Dx[1] = 0.050 * mm; lay_Dy[1] = 1.0 * cm; lay_Dz[1] = 11.0 * cm; lay_Rin[1] = 4.5 * cm; + lay_Dx[2] = 0.150 * mm; lay_Dy[2] = 2.0 * cm; lay_Dz[2] = 18.0 * cm; lay_Rin[2] = 6.5 * cm; + lay_Dx[3] = 0.150 * mm; lay_Dy[3] = 2.0 * cm; lay_Dz[3] = 24.0 * cm; lay_Rin[3] = 10.5 * cm; + lay_Dx[4] = 0.150 * mm; lay_Dy[4] = 3.0 * cm; lay_Dz[4] = 36.0 * cm; lay_Rin[4] = 13.5 * cm; + lay_Dx[5] = 0.150 * mm; lay_Dy[5] = 3.0 * cm; lay_Dz[5] = 48.0 * cm; lay_Rin[5] = 15.5 * cm; int i_layer = 0; int i_module = 0; diff --git a/src/ref_DiskTracker_geo.cpp b/src/ref_DiskTracker_geo.cpp index 60ebe9ab..8f60a3a5 100644 --- a/src/ref_DiskTracker_geo.cpp +++ b/src/ref_DiskTracker_geo.cpp @@ -63,17 +63,20 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s pv.addPhysVolID("slice",s_num); } - DetElement layer(sdet,l_nam+"_pos",l_num); - pv = assembly.placeVolume(l_vol,Position(0,0,zmin+layerWidth/2.)); - pv.addPhysVolID("layer",l_num); - pv.addPhysVolID("barrel",1); - layer.setPlacement(pv); - if ( reflect ) { + if (!reflect) { + DetElement layer(sdet, l_nam + "_pos", l_num); + pv = assembly.placeVolume(l_vol, Position(0, 0, zmin + layerWidth / 2.)); + pv.addPhysVolID("layer", l_num); + pv.addPhysVolID("barrel", 1); + layer.setPlacement(pv); + } else { + DetElement layer(sdet, l_nam + "_neg", l_num); pv = assembly.placeVolume(l_vol,Transform3D(RotationY(M_PI),Position(0,0,-zmin-layerWidth/2))); pv.addPhysVolID("layer",l_num); - pv.addPhysVolID("barrel",2); - DetElement layerR = layer.clone(l_nam+"_neg"); - sdet.add(layerR.setPlacement(pv)); + pv.addPhysVolID("barrel",1); + layer.setPlacement(pv); + // DetElement layerR = layer.clone(l_nam+"_neg"); + // sdet.add(layerR.setPlacement(pv)); } } if ( x_det.hasAttr(_U(combineHits)) ) { -- GitLab