Skip to content
Snippets Groups Projects
Commit e3022508 authored by Whitney Armstrong's avatar Whitney Armstrong
Browse files

Adding parameterized Hcal

 - The endcap and barrels were added.
parent b17dad6b
No related branches found
No related tags found
1 merge request!40Adding parameterized Hcal
Pipeline #8144 failed with stages
in 7 minutes and 5 seconds
...@@ -242,6 +242,18 @@ ...@@ -242,6 +242,18 @@
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Detector Definition Parameters Detector Definition Parameters
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## Parameter nomenclature
- "rmin", "rmax", "thickness" all refer to the radial direction.
- "zmin", "zmax", "length", "offset" all refer to the z direction.
- Positive and Negative are "EndcapP" and "EndcapN", respectively.
- All values are positive. When refering to a negative endcap z position, the values are
also positive then negated when required. (Many endcap constructions are mirrored,
hence a postive value.
- We will try to keep the subsystem component name first and the parameter after an "_" (eg, EcalBarrel_length").
TODO: fix parameter naming to be uniform in the above convention.
</comment> </comment>
<comment> <comment>
...@@ -249,83 +261,52 @@ ...@@ -249,83 +261,52 @@
Solenoid Magnet Parameters Solenoid Magnet Parameters
========================== ==========================
</comment> </comment>
<constant name="cb_Solenoid_rmin" value="0.0 * cm"/> <comment> Central Barrel Solenoid Inner diameter </comment>
<constant name="cb_Solenoid_rmax" value="137.0 * cm"/> <comment> Central Barrel Solenoid Outer diameter </comment>
<constant name="cb_Solenoid_z" value="400.0 * cm"/> <comment> Central Barrel Solenoid Size in Z direction </comment>
<constant name="cb_Solenoid_shift" value="0.0 * cm"/>
<constant name="Solenoid_length" value="7000.0*mm"/>
<constant name="Solenoid_rmin" value="3000.0*mm"/>
<constant name="Solenoid_thickness" value="400*mm"/>
<constant name="Solenoid_rmax" value="Solenoid_rmin + Solenoid_thickness"/>
<comment>Solenoid Barrel Parameters</comment>
<constant name="SolenoidBarrelCryostatThickness" value=" 1.0 * cm"/>
<constant name="SolenoidBarrelGapThickness" value=" 3.3 * cm"/>
<constant name="SolenoidBarrelAlConductorThickness" value="12.0 * cm"/>
<constant name="SolenoidBarrelQuenchbackThickness" value=" 1.5 * cm"/>
<constant name="SolenoidBarrelOuterGapThickness" value=" 5.6 * cm"/>
<constant name="SolenoidBarrelOuterCryostatThickness" value=" 1.2 * cm"/>
<constant name="SolenoidEndPlateGapThickness" value=" 5.7 * cm"/>
<constant name="SolenoidEndPlateCryostatThickness" value=" 1.5 * cm"/>
<comment> Solenoid Yoke Endcap </comment>
<constant name="SolenoidYokeEndcap_thickness" value="0.2 * m"/>
<constant name="SolenoidBarrel_rmin" value="Solenoid_rmin"/>
<constant name="SolenoidBarrel_length" value="Solenoid_length"/>
<constant name="SolenoidBarrel_zmax" value="Solenoid_length/2.0"/>
<constant name="SolenoidCoilConductor_rmin" value="SolenoidBarrel_rmin + SolenoidBarrelCryostatThickness + SolenoidBarrelGapThickness"/>
<constant name="SolenoidCoilConductor_rmax" value="SolenoidCoilConductor_rmin + SolenoidBarrelAlConductorThickness + SolenoidBarrelQuenchbackThickness"/>
<constant name="SolenoidBarrel_rmax" value="SolenoidCoilConductor_rmax + SolenoidBarrelOuterGapThickness + SolenoidBarrelOuterCryostatThickness"/>
<constant name="SolenoidCoil_zmax" <constant name="Solenoid_length" value="7000.0*mm"/>
value="SolenoidBarrel_zmax - SolenoidEndPlateCryostatThickness - SolenoidEndPlateGapThickness"/> <constant name="Solenoid_rmin" value="3000.0*mm"/>
<constant name="Solenoid_thickness" value="400*mm"/>
<constant name="Solenoid_offset" value="600.0*mm"/>
<constant name="SolenoidalFieldRadius" <constant name="Solenoid_rmax" value="Solenoid_rmin + Solenoid_thickness"/>
value="SolenoidCoilConductor_rmin + SolenoidBarrelAlConductorThickness / 2.0"/> <constant name="SolenoidBarrel_rmin" value="Solenoid_rmin"/>
<constant name="SolenoidBarrel_length" value="Solenoid_length"/>
<constant name="SolenoidCoil_length" value="SolenoidCoil_zmax*2.0"/> <constant name="SolenoidBarrel_zmax" value="Solenoid_length/2.0"/>
<constant name="SolenoidYokeEndcapP_rmin" value="SolenoidBarrel_rmin"/>
<constant name="SolenoidYokeEndcapN_rmin" value="SolenoidBarrel_rmin"/>
<constant name="SolenoidYokeEndcap_zmin" value="SolenoidCoil_zmax"/>
<constant name="SolenoidYokeEndcap_zmax" value="SolenoidYokeEndcap_zmin + SolenoidYokeEndcap_thickness"/>
<constant name="SolenoidYokeChamferAngle" value="0.2"/>
<comment> <comment>
---------------------------------
Other Central Detector parameters
-------------------------------- --------------------------------
Key Central Detector Parameters
--------------------------------
These are needed here to compute the dependent parameters. These are needed here to compute the dependent parameters.
</comment> </comment>
<constant name="RICHLength" value="1.1*m"/> <constant name="RICHLength" value="1.1*m"/>
<constant name="TRDLength" value="20.0*cm"/> <constant name="TRDLength" value="20.0*cm"/>
<constant name="ForwardTOFLength" value="10.0*cm"/> <constant name="ForwardTOFLength" value="10.0*cm"/>
<constant name="ForwardPIDLength" value="RICHLength + TRDLength + ForwardTOFLength"/>
<constant name="BackwardCherenkovLength" value="15.0*cm"/> <constant name="BackwardCherenkovLength" value="15.0*cm"/>
<constant name="BackwardTOFLength" value="10.0*cm"/> <constant name="BackwardTOFLength" value="10.0*cm"/>
<constant name="BackwardPIDLength" value="BackwardCherenkovLength + BackwardTOFLength"/>
<constant name="BarrelPIDThickness" value="25.0 * cm"/> <comment> Total length of PID detectors above</comment>
<constant name="ForwardPIDLength" value="RICHLength + TRDLength + ForwardTOFLength"/>
<constant name="BackwardPIDLength" value="BackwardCherenkovLength + BackwardTOFLength"/>
<constant name="BarrelPIDThickness" value="25.0 * cm"/>
<comment> <comment>
============================ ============================
Tracking Parameters Tracking Detector Parameters
============================ ============================
</comment> </comment>
<comment>
-------------------------
GEM Tracker Parameters
-------------------------
</comment>
<constant name="ForwardTrackingGEMLength" value="30.0*cm"/> <constant name="ForwardTrackingGEMLength" value="30.0*cm"/>
<constant name="tracker_region_rmax" value="Solenoid_rmax/2.0"/>
<constant name="tracker_region_zmax" value="Solenoid_length/2.0"/>
<comment> <comment>
------------------------- -------------------------
Vertex Tracker Parameters Vertex Tracker Parameters
...@@ -344,9 +325,23 @@ ...@@ -344,9 +325,23 @@
<constant name="SiliconTrackerInnerRadius" value="95.0*mm"/> <constant name="SiliconTrackerInnerRadius" value="95.0*mm"/>
<constant name="SiliconTrackerInnerBarrelLength" value="300.0*mm"/> <constant name="SiliconTrackerInnerBarrelLength" value="300.0*mm"/>
<constant name="SiliconTrackerOuterRadius" value="Solenoid_rmax/3.0"/> <constant name="SiliconTrackerOuterRadius" value="Solenoid_rmax/3.0"/>
<constant name="SiliconTrackerOuterBarrelLength" value="Solenoid_length/2.5 - ForwardTrackingGEMLength"/> <constant name="SiliconTrackerOuterBarrelLength" value="Solenoid_length/2.5"/>
<constant name="SiliconTrackerOuterBarrel_zmax" value="SiliconTrackerOuterBarrelLength/2.0"/> <constant name="SiliconTrackerOuterBarrel_zmax" value="SiliconTrackerOuterBarrelLength/2.0"/>
<comment>
Central tracking boundaries
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"/>
<comment> These are used by ddsim </comment>
<constant name="tracker_region_rmax" value="Solenoid_rmax/2.0"/>
<constant name="tracker_region_zmax" value="Solenoid_length/2.0"/>
<comment> <comment>
------------------------------- -------------------------------
Central Barrel Tracker - Global Central Barrel Tracker - Global
...@@ -369,39 +364,49 @@ ...@@ -369,39 +364,49 @@
</comment> </comment>
<comment> <comment>
Ecal and Hcal Barrel Ecal and Hcal Barrel/Endcap
</comment> </comment>
<constant name="EcalBarrel_rmin" value="SiliconTrackerOuterRadius + BarrelPIDThickness + 3.0 * cm"/> <constant name="ExtraHcalEndcapP_length" value="0.0*cm"/>
<constant name="HcalBarrel_rmax" value="Solenoid_rmin - 5.0 *cm "/> <constant name="ExtraHcalEndcapN_length" value="0.0*cm"/>
<constant name="SolenoidYokeEndcapP_zmin" value="Solenoid_length/2.0 + Solenoid_offset+ExtraHcalEndcapP_length"/>
<constant name="SolenoidYokeEndcapN_zmin" value="Solenoid_length/2.0 - Solenoid_offset+ExtraHcalEndcapN_length"/>
<constant name="EcalBarrel_rmin" value="SiliconTrackerOuterRadius + BarrelPIDThickness + 5.0 * mm"/>
<constant name="HcalBarrel_rmax" value="Solenoid_rmin - 40.0 *mm "/>
<constant name="Barrel_TotalCalThickness" value="HcalBarrel_rmax - EcalBarrel_rmin"/> <constant name="Barrel_TotalCalThickness" value="HcalBarrel_rmax - EcalBarrel_rmin"/>
<constant name="CalBarrelDivider" value="0.5"/> <comment> Ecal and Hcal have the same thickness </comment> <constant name="CalBarrelDivider" value="0.5"/> <comment> Ecal and Hcal have the same thickness </comment>
<constant name="EcalBarrel_TotalThickness" value="Barrel_TotalCalThickness * CalBarrelDivider"/> <constant name="EcalBarrel_TotalThickness" value="Barrel_TotalCalThickness * CalBarrelDivider"/>
<constant name="HcalBarrel_TotalThickness" value="Barrel_TotalCalThickness * (1.0 - CalBarrelDivider)"/> <constant name="HcalBarrel_TotalThickness" value="Barrel_TotalCalThickness * (1.0 - CalBarrelDivider)"/>
<constant name="EcalBarrelLength" value="SiliconTrackerOuterBarrelLength + ForwardPIDLength + BackwardPIDLength"/> <constant name="EcalBarrelLength" value="CentralTracking_length + BackwardPIDLength"/>
<constant name="EcalEndcapP_zmin" value="SiliconTrackerOuterBarrelLength/2.0 + ForwardPIDLength"/> <constant name="EcalBarrel_offset" value="(CentralTracking_length -(CentralTracking_length+BackwardPIDLength))/2.0"/>
<constant name="EcalEndcapN_zmin" value="SiliconTrackerOuterBarrelLength/2.0 + BackwardPIDLength"/>
<constant name="EcalBarrel_offset" value="(EcalEndcapP_zmin-EcalEndcapN_zmin)/2.0"/>
<constant name="EndcapP_TotalCalThickness" value="(SolenoidYokeEndcap_zmin - 10.0 * mm) - (EcalEndcapP_zmin + 10.0 * mm)"/> <constant name="EcalEndcapP_zmin" value="CentralTracking_length/2.0 + ForwardPIDLength"/>
<constant name="EndcapN_TotalCalThickness" value="(SolenoidYokeEndcap_zmin - 10.0 * mm) - (EcalEndcapN_zmin + 10.0 * mm)"/> <constant name="EcalEndcapN_zmin" value="CentralTracking_length/2.0 + BackwardPIDLength"/>
<constant name="BarrelLength" value="SiliconTrackerOuterBarrelLength + ForwardPIDLength + BackwardPIDLength"/>
<constant name="Barrel_offset" value="(EcalEndcapP_zmin-EcalEndcapN_zmin)/2.0"/>
<constant name="EndcapPTotalCal_length" value="(SolenoidYokeEndcapP_zmin - 0.0 * mm) - (EcalEndcapP_zmin + 0.0 * mm)"/>
<constant name="EndcapNTotalCal_length" value="(SolenoidYokeEndcapN_zmin - 0.0 * mm) - (EcalEndcapN_zmin + 0.0 * mm)"/>
<constant name="EndcapP_CalDivide" value="0.5"/> <comment> 0.5 means Ecal and Hcal have the same thickness </comment> <constant name="EndcapP_CalDivide" value="0.5"/> <comment> 0.5 means Ecal and Hcal have the same thickness </comment>
<constant name="EndcapN_CalDivide" value="0.5"/> <comment> 0.5 means Ecal and Hcal have the same thickness </comment> <constant name="EndcapN_CalDivide" value="0.5"/> <comment> 0.5 means Ecal and Hcal have the same thickness </comment>
<constant name="EcalEndcapP_TotalThickness" value="EndcapP_TotalCalThickness * EndcapP_CalDivide"/> <constant name="EcalEndcapP_length" value="EndcapPTotalCal_length * EndcapP_CalDivide"/>
<constant name="EcalEndcapN_TotalThickness" value="EndcapN_TotalCalThickness * EndcapN_CalDivide"/> <constant name="EcalEndcapN_length" value="EndcapNTotalCal_length * EndcapN_CalDivide"/>
<constant name="HcalEndcapP_TotalThickness" value="EndcapP_TotalCalThickness * (1.0 - EndcapP_CalDivide)"/> <constant name="HcalEndcapP_length" value="EndcapPTotalCal_length * (1.0 - EndcapP_CalDivide)"/>
<constant name="HcalEndcapN_TotalThickness" value="EndcapN_TotalCalThickness * (1.0 - EndcapN_CalDivide)"/> <constant name="HcalEndcapN_length" value="EndcapNTotalCal_length * (1.0 - EndcapN_CalDivide)"/>
<comment> These need to be set in sync with the forward and backward detectors </comment> <comment> These need to be set in sync with the forward and backward detectors </comment>
<constant name="EcalEndcapP_rmin" value="200.0*mm"/> <constant name="EcalEndcapP_rmin" value="200.0*mm"/>
<constant name="EcalEndcapN_rmin" value="300.0*mm"/> <constant name="EcalEndcapN_rmin" value="300.0*mm"/>
<constant name="HcalEndcapP_rmin" value="250.0 * mm"/> <constant name="HcalEndcapP_rmin" value="EcalEndcapP_rmin"/>
<constant name="HcalEndcapN_rmin" value="350.0 * mm"/> <constant name="HcalEndcapN_rmin" value="EcalEndcapN_rmin"/>
<comment> <comment>
------------------------- -------------------------
...@@ -449,9 +454,9 @@ ...@@ -449,9 +454,9 @@
<comment> EM Endcap N Layer; same number of layers for EcalThin and EcalThick </comment> <comment> EM Endcap N Layer; same number of layers for EcalThin and EcalThick </comment>
<constant name="EcalEndcapPLayers" <constant name="EcalEndcapPLayers"
value="floor((EcalEndcapP_TotalThickness - EcalLayer1_thickness) / (EcalLayer2_thickness + EcalLayer3_thickness))"/> value="floor((EcalEndcapP_length - EcalLayer1_thickness) / (EcalLayer2_thickness + EcalLayer3_thickness))"/>
<constant name="EcalEndcapNLayers" <constant name="EcalEndcapNLayers"
value="floor((EcalEndcapN_TotalThickness - EcalLayer1_thickness) / (EcalLayer2_thickness + EcalLayer3_thickness))"/> value="floor((EcalEndcapN_length - EcalLayer1_thickness) / (EcalLayer2_thickness + EcalLayer3_thickness))"/>
<constant name="EcalEndcapPLayer1_NRepeat" value="1"/> <constant name="EcalEndcapPLayer1_NRepeat" value="1"/>
<constant name="EcalEndcapNLayer1_NRepeat" value="1"/> <constant name="EcalEndcapNLayer1_NRepeat" value="1"/>
<constant name="EcalEndcapPLayer2_NRepeat" value="EcalEndcapPLayers"/> <constant name="EcalEndcapPLayer2_NRepeat" value="EcalEndcapPLayers"/>
...@@ -471,11 +476,12 @@ ...@@ -471,11 +476,12 @@
Hadronic Calorimeter Parameters Hadronic Calorimeter Parameters
------------------------------- -------------------------------
</comment> </comment>
<constant name="HcalBarrel_rmin" value="EcalBarrel_rmax+10.0*mm"/> <constant name="HcalBarrel_rmin" value="EcalBarrel_rmax"/>
<constant name="HcalBarrelAvailThickness" value="HcalBarrel_rmax - HcalBarrel_rmin"/> <constant name="HcalBarrelAvailThickness" value="HcalBarrel_rmax - HcalBarrel_rmin"/>
<constant name="HcalBarrelLength" value="EcalBarrelLength + EcalEndcapP_TotalThickness + EcalEndcapN_TotalThickness + 10.0*mm "/> <constant name="HcalBarrelLength" value="Solenoid_length + ExtraHcalEndcapP_length + ExtraHcalEndcapN_length- HcalEndcapP_length- HcalEndcapN_length - 10*cm"/>
<constant name="HcalEndcap_zmin" value="HcalBarrelLength/2.0"/>
<constant name="HcalEndcapAvailThickness" value="(SolenoidYokeEndcap_zmin - 10.0 * mm) - HcalEndcap_zmin"/> <constant name="HcalEndcapP_zmin" value="SolenoidYokeEndcapP_zmin - HcalEndcapP_length "/>
<constant name="HcalEndcapN_zmin" value="SolenoidYokeEndcapN_zmin - HcalEndcapN_length "/>
<comment> Material Thickness </comment> <comment> Material Thickness </comment>
<constant name="HcalSteelThickness" value="1.89 * cm"/> <constant name="HcalSteelThickness" value="1.89 * cm"/>
...@@ -484,17 +490,19 @@ ...@@ -484,17 +490,19 @@
<constant name="HcalG10Thickness" value="3.00 * mm"/> <constant name="HcalG10Thickness" value="3.00 * mm"/>
<constant name="HcalAirThickness" value="1.60 * mm"/> <constant name="HcalAirThickness" value="1.60 * mm"/>
<comment> Layer Thickness </comment> <comment> Single Layer Thickness (for both barrel and endcap)</comment>
<constant name="HcalOneLayerThickness" <constant name="HcalSingleLayerThickness"
value="HcalSteelThickness + (2 * HcalPyrexThickness) + HcalRPCGasThickness + HcalG10Thickness + HcalAirThickness"/> value="HcalSteelThickness + (2 * HcalPyrexThickness) + HcalRPCGasThickness + HcalG10Thickness + HcalAirThickness"/>
<comment> H Barrel Layers and Thickness </comment>
<constant name="HcalBarrelLayers" value="floor(HcalBarrelAvailThickness / HcalOneLayerThickness)"/>
<constant name="HcalBarrelThickness" value="HcalBarrelLayers * HcalOneLayerThickness"/>
<comment> H Endcap Layers and Thickness </comment> <comment> Hcal Barrel Layers and computed Thickness </comment>
<constant name="HcalEndcapLayers" value="floor(HcalEndcapAvailThickness / HcalOneLayerThickness)"/> <constant name="HcalBarrelLayer_NRepeat" value="floor(HcalBarrelAvailThickness / HcalSingleLayerThickness)"/>
<constant name="HcalEndcapThickness" value="HcalEndcapLayers * HcalOneLayerThickness"/> <constant name="HcalBarrelThickness" value="HcalBarrelLayer_NRepeat * HcalSingleLayerThickness"/>
<comment> Hcal Endcap Layers and computed Thickness </comment>
<constant name="HcalEndcapPLayer_NRepeat" value="floor(HcalEndcapP_length / HcalSingleLayerThickness)"/>
<constant name="HcalEndcapNLayer_NRepeat" value="floor(HcalEndcapN_length / HcalSingleLayerThickness)"/>
<constant name="HcalEndcapP_thickness" value="HcalEndcapPLayer_NRepeat * HcalSingleLayerThickness"/>
<constant name="HcalEndcapN_thickness" value="HcalEndcapNLayer_NRepeat * HcalSingleLayerThickness"/>
<comment> <comment>
---------------------- ----------------------
......
...@@ -83,6 +83,7 @@ ...@@ -83,6 +83,7 @@
readout="EcalEndcapHits" readout="EcalEndcapHits"
vis="EcalEndcapVis" vis="EcalEndcapVis"
calorimeterType="EM_ENDCAP" > calorimeterType="EM_ENDCAP" >
<position x="0" y="0" z="0"/>
<dimensions <dimensions
numsides="CaloSides" numsides="CaloSides"
zmin="EcalEndcapP_zmin" zmin="EcalEndcapP_zmin"
...@@ -125,6 +126,7 @@ ...@@ -125,6 +126,7 @@
readout="EcalEndcapHits" readout="EcalEndcapHits"
vis="EcalEndcapVis" vis="EcalEndcapVis"
calorimeterType="EM_ENDCAP"> calorimeterType="EM_ENDCAP">
<position x="0" y="0" z="0"/>
<dimensions <dimensions
numsides="CaloSides" numsides="CaloSides"
zmin="EcalEndcapN_zmin" zmin="EcalEndcapN_zmin"
......
...@@ -18,9 +18,10 @@ ...@@ -18,9 +18,10 @@
<detector <detector
id="HCalBarrel_ID" id="HCalBarrel_ID"
name="HcalBarrel" name="HcalBarrel"
type="DD4hep_PolyhedraBarrelCalorimeter2" type="refdet_EcalBarrel"
readout="HcalBarrelHits" readout="HcalBarrelHits"
calorimeterType="HAD_BARREL" calorimeterType="HAD_BARREL"
offset="Barrel_offset"
gap="0.*cm" gap="0.*cm"
material="Steel235"> material="Steel235">
<dimensions <dimensions
...@@ -28,7 +29,7 @@ ...@@ -28,7 +29,7 @@
rmin="HcalBarrel_rmin" rmin="HcalBarrel_rmin"
z="HcalBarrelLength"/> z="HcalBarrelLength"/>
<staves vis="HcalBarrelVis"/> <staves vis="HcalBarrelVis"/>
<layer repeat="HcalBarrelLayers"> <layer repeat="HcalBarrelLayer_NRepeat">
<slice material="Steel235" thickness="HcalSteelThickness"/> <slice material="Steel235" thickness="HcalSteelThickness"/>
<slice material="PyrexGlass" thickness="HcalPyrexThickness"/> <slice material="PyrexGlass" thickness="HcalPyrexThickness"/>
<slice material="RPCGasDefault" thickness="HcalRPCGasThickness" sensitive="yes" limits="cal_limits"/> <slice material="RPCGasDefault" thickness="HcalRPCGasThickness" sensitive="yes" limits="cal_limits"/>
...@@ -46,12 +47,13 @@ ...@@ -46,12 +47,13 @@
vis="HcalEndcapVis" vis="HcalEndcapVis"
calorimeterType="HAD_ENDCAP" calorimeterType="HAD_ENDCAP"
reflect="false"> reflect="false">
<position x="0" y="0" z="0"/>
<dimensions <dimensions
numsides="CaloSides" numsides="CaloSides"
zmin="HcalEndcap_zmin" zmin="HcalEndcapP_zmin"
rmin="HcalEndcapP_rmin" rmin="HcalEndcapP_rmin"
rmax="HcalBarrel_rmax"/> rmax="HcalBarrel_rmax"/>
<layer repeat="HcalEndcapLayers" vis="HcalEndcapVis" > <layer repeat="HcalEndcapPLayer_NRepeat" vis="HcalEndcapVis" >
<slice material="Steel235" thickness="HcalSteelThickness"/> <slice material="Steel235" thickness="HcalSteelThickness"/>
<slice material="PyrexGlass" thickness="HcalPyrexThickness"/> <slice material="PyrexGlass" thickness="HcalPyrexThickness"/>
<slice material="RPCGasDefault" thickness="HcalRPCGasThickness" sensitive="yes" limits="cal_limits"/> <slice material="RPCGasDefault" thickness="HcalRPCGasThickness" sensitive="yes" limits="cal_limits"/>
...@@ -68,12 +70,13 @@ ...@@ -68,12 +70,13 @@
readout="HcalEndcapHits" readout="HcalEndcapHits"
vis="HcalEndcapVis" vis="HcalEndcapVis"
calorimeterType="HAD_ENDCAP" reflect="true"> calorimeterType="HAD_ENDCAP" reflect="true">
<position x="0" y="0" z="0"/>
<dimensions <dimensions
numsides="CaloSides" numsides="CaloSides"
zmin="HcalEndcap_zmin" zmin="HcalEndcapN_zmin"
rmin="HcalEndcapN_rmin" rmin="HcalEndcapN_rmin"
rmax="HcalBarrel_rmax"/> rmax="HcalBarrel_rmax"/>
<layer repeat="HcalEndcapLayers" vis="HcalEndcapVis" > <layer repeat="HcalEndcapNLayer_NRepeat" vis="HcalEndcapVis" >
<slice material="Steel235" thickness="HcalSteelThickness"/> <slice material="Steel235" thickness="HcalSteelThickness"/>
<slice material="PyrexGlass" thickness="HcalPyrexThickness"/> <slice material="PyrexGlass" thickness="HcalPyrexThickness"/>
<slice material="RPCGasDefault" thickness="HcalRPCGasThickness" sensitive="yes" limits="cal_limits"/> <slice material="RPCGasDefault" thickness="HcalRPCGasThickness" sensitive="yes" limits="cal_limits"/>
......
...@@ -6,6 +6,39 @@ ...@@ -6,6 +6,39 @@
Solenoid Magnet Parameters Solenoid Magnet Parameters
-------------------------- --------------------------
</comment> </comment>
<comment>Solenoid Barrel Parameters</comment>
<constant name="SolenoidBarrelCryostatThickness" value=" 1.0 * cm"/>
<constant name="SolenoidBarrelGapThickness" value=" 3.3 * cm"/>
<constant name="SolenoidBarrelAlConductorThickness" value="12.0 * cm"/>
<constant name="SolenoidBarrelQuenchbackThickness" value=" 1.5 * cm"/>
<constant name="SolenoidBarrelOuterGapThickness" value=" 5.6 * cm"/>
<constant name="SolenoidBarrelOuterCryostatThickness" value=" 1.2 * cm"/>
<constant name="SolenoidEndPlateGapThickness" value=" 5.7 * cm"/>
<constant name="SolenoidEndPlateCryostatThickness" value=" 1.5 * cm"/>
<comment> Solenoid Yoke Endcap </comment>
<constant name="SolenoidYokeEndcap_thickness" value="0.2 * m"/>
<constant name="SolenoidCoilConductor_rmin" value="SolenoidBarrel_rmin + SolenoidBarrelCryostatThickness + SolenoidBarrelGapThickness"/>
<constant name="SolenoidCoilConductor_rmax" value="SolenoidCoilConductor_rmin + SolenoidBarrelAlConductorThickness + SolenoidBarrelQuenchbackThickness"/>
<constant name="SolenoidBarrel_rmax" value="SolenoidCoilConductor_rmax + SolenoidBarrelOuterGapThickness + SolenoidBarrelOuterCryostatThickness"/>
<constant name="SolenoidCoil_zmax"
value="SolenoidBarrel_zmax - SolenoidEndPlateCryostatThickness - SolenoidEndPlateGapThickness"/>
<constant name="SolenoidalFieldRadius"
value="SolenoidCoilConductor_rmin + SolenoidBarrelAlConductorThickness / 2.0"/>
<constant name="SolenoidCoil_length" value="SolenoidCoil_zmax*2.0"/>
<constant name="SolenoidYokeEndcapP_rmin" value="SolenoidBarrel_rmin"/>
<constant name="SolenoidYokeEndcapN_rmin" value="SolenoidBarrel_rmin"/>
<constant name="SolenoidYokeEndcapP_zmax" value="SolenoidYokeEndcapP_zmin + SolenoidYokeEndcap_thickness"/>
<constant name="SolenoidYokeEndcapN_zmax" value="SolenoidYokeEndcapN_zmin + SolenoidYokeEndcap_thickness"/>
<constant name="SolenoidYokeChamferAngle" value="0.2"/>
</define> </define>
<detectors> <detectors>
...@@ -19,8 +52,9 @@ ...@@ -19,8 +52,9 @@
<detector <detector
id="Solenoid_ID" id="Solenoid_ID"
name="SolenoidCoilBarrel" name="SolenoidCoilBarrel"
type="DD4hep_MultiLayerTracker" type="refdet_SolenoidCoil"
insideTrackingVolume="false"> insideTrackingVolume="false">
<position x="0" y="0" z="Solenoid_offset"/>
<layer id="1" <layer id="1"
inner_r="Solenoid_rmin" inner_r="Solenoid_rmin"
outer_z="SolenoidBarrel_zmax" outer_z="SolenoidBarrel_zmax"
...@@ -47,10 +81,11 @@ ...@@ -47,10 +81,11 @@
<detector <detector
id="SolenoidSupport_ID" id="SolenoidSupport_ID"
name="SolenoidCoilEnds" name="SolenoidCoilEnds"
type="DD4hep_DiskTracker" type="ref_SolenoidEndcap"
insideTrackingVolume="false" insideTrackingVolume="false"
reflect="true" reflect="true"
vis="SolenoidCryostatVis"> vis="SolenoidCryostatVis">
<position x="0" y="0" z="Solenoid_offset"/>
<layer id="1" <layer id="1"
inner_z="SolenoidCoil_zmax" inner_z="SolenoidCoil_zmax"
inner_r="SolenoidCoilConductor_rmin" inner_r="SolenoidCoilConductor_rmin"
...@@ -70,10 +105,11 @@ ...@@ -70,10 +105,11 @@
<detector <detector
id="SolenoidYoke_ID" id="SolenoidYoke_ID"
name="SolenoidYokeEndcaps" name="SolenoidYokeEndcaps"
type="DD4hep_DiskTracker" type="ref_SolenoidEndcap"
insideTrackingVolume="false" insideTrackingVolume="false"
reflect="true" reflect="true"
vis="SolenoidYokeVis"> vis="SolenoidYokeVis">
<position x="0" y="0" z="Solenoid_offset"/>
<layer id="1" <layer id="1"
vis="PurpleVis" vis="PurpleVis"
inner_z="SolenoidBarrel_zmax + SolenoidEndPlateGapThickness" inner_z="SolenoidBarrel_zmax + SolenoidEndPlateGapThickness"
......
...@@ -123,11 +123,11 @@ ...@@ -123,11 +123,11 @@
<include ref="compact/ffi_ZDC.xml"/> <include ref="compact/ffi_ZDC.xml"/>
<include ref="compact/ci_GEM.xml"/> <include ref="compact/ci_GEM.xml"/>
<include ref="compact/hcal.xml"/>
<!-- <!--
<include ref="compact/ci_HCAL.xml"/> <include ref="compact/ci_HCAL.xml"/>
<include ref="compact/forward_rich.xml"/> <include ref="compact/forward_rich.xml"/>
<include ref="compact/roman_pots.xml"/> <include ref="compact/roman_pots.xml"/>
<include ref="compact/hcal.xml"/>
--> -->
<include ref="eic/forward_ion_beamline.xml"/> <include ref="eic/forward_ion_beamline.xml"/>
......
...@@ -162,3 +162,4 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s ...@@ -162,3 +162,4 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
} }
DECLARE_DETELEMENT(refdet_EcalBarrel,create_detector) DECLARE_DETELEMENT(refdet_EcalBarrel,create_detector)
DECLARE_DETELEMENT(refdet_HcalBarrel,create_detector)
...@@ -21,110 +21,110 @@ using namespace std; ...@@ -21,110 +21,110 @@ using namespace std;
using namespace dd4hep; using namespace dd4hep;
using namespace dd4hep::detail; using namespace dd4hep::detail;
static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens) { static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens)
xml_det_t x_det = e; {
xml_dim_t dim = x_det.dimensions(); xml_det_t x_det = e;
int det_id = x_det.id(); xml_dim_t dim = x_det.dimensions();
bool reflect = x_det.reflect(true); int det_id = x_det.id();
string det_name = x_det.nameStr(); bool reflect = x_det.reflect(true);
Material air = description.air(); string det_name = x_det.nameStr();
int numsides = dim.numsides(); Material air = description.air();
double rmin = dim.rmin(); int numsides = dim.numsides();
double rmax = dim.rmax() * std::cos(M_PI / numsides); xml::Component pos = x_det.position();
double zmin = dim.zmin(); double rmin = dim.rmin();
Layering layering(x_det); double rmax = dim.rmax() * std::cos(M_PI / numsides);
double totalThickness = layering.totalThickness(); double zmin = dim.zmin();
Volume endcapVol("endcap", PolyhedraRegular(numsides, rmin, rmax, totalThickness), air); Layering layering(x_det);
DetElement endcap("endcap", det_id); double totalThickness = layering.totalThickness();
Volume endcapVol("endcap", PolyhedraRegular(numsides, rmin, rmax, totalThickness), air);
DetElement endcap("endcap", det_id);
std::cout << "totalThickness = " << totalThickness << "\n"; //std::cout << "totalThickness = " << totalThickness << "\n";
std::cout << "zmin = " << zmin << "\n"; //std::cout << "zmin = " << zmin << "\n";
std::cout << "rmin = " << rmin << "\n"; //std::cout << "rmin = " << rmin << "\n";
std::cout << "rmax = " << rmax << "\n"; //std::cout << "rmax = " << rmax << "\n";
std::cout << "nlayers = " << std::size(layering.layers()) << "\n"; //std::cout << "nlayers = " << std::size(layering.layers()) << "\n";
int l_num = 1; int l_num = 1;
int layerType = 0; int layerType = 0;
double layerZ = -totalThickness / 2; double layerZ = -totalThickness / 2;
endcapVol.setAttributes(description, x_det.regionStr(), x_det.limitsStr(), x_det.visStr()); endcapVol.setAttributes(description, x_det.regionStr(), x_det.limitsStr(), x_det.visStr());
for (xml_coll_t xc(x_det, _U(layer)); xc; ++xc) { for (xml_coll_t xc(x_det, _U(layer)); xc; ++xc) {
std::cout << "l_num = " << l_num << "\n"; //std::cout << "l_num = " << l_num << "\n";
std::cout << "xc = " << xc << "\n"; //std::cout << "xc = " << xc << "\n";
xml_comp_t x_layer = xc; xml_comp_t x_layer = xc;
double l_thick = layering.layer(l_num - 1)->thickness(); double l_thick = layering.layer(l_num - 1)->thickness();
std::cout << "xc = " << xc << "\n"; //std::cout << "xc = " << xc << "\n";
string l_name = _toString(layerType, "layer%d"); string l_name = _toString(layerType, "layer%d");
int l_repeat = x_layer.repeat(); int l_repeat = x_layer.repeat();
Volume l_vol(l_name, PolyhedraRegular(numsides, rmin, rmax, l_thick), air); Volume l_vol(l_name, PolyhedraRegular(numsides, rmin, rmax, l_thick), air);
vector<PlacedVolume> sensitives; vector<PlacedVolume> sensitives;
int s_num = 1; int s_num = 1;
double sliceZ = -l_thick / 2; double sliceZ = -l_thick / 2;
for (xml_coll_t xs(x_layer, _U(slice)); xs; ++xs) { for (xml_coll_t xs(x_layer, _U(slice)); xs; ++xs) {
xml_comp_t x_slice = xs; xml_comp_t x_slice = xs;
string s_name = _toString(s_num, "slice%d"); string s_name = _toString(s_num, "slice%d");
double s_thick = x_slice.thickness(); double s_thick = x_slice.thickness();
Material s_mat = description.material(x_slice.materialStr()); Material s_mat = description.material(x_slice.materialStr());
Volume s_vol(s_name, PolyhedraRegular(numsides, rmin, rmax, s_thick), s_mat); Volume s_vol(s_name, PolyhedraRegular(numsides, rmin, rmax, s_thick), s_mat);
s_vol.setVisAttributes(description.visAttributes(x_slice.visStr())); s_vol.setVisAttributes(description.visAttributes(x_slice.visStr()));
sliceZ += s_thick / 2; sliceZ += s_thick / 2;
PlacedVolume s_phv = l_vol.placeVolume(s_vol, Position(0, 0, sliceZ)); PlacedVolume s_phv = l_vol.placeVolume(s_vol, Position(0, 0, sliceZ));
s_phv.addPhysVolID("slice", s_num); s_phv.addPhysVolID("slice", s_num);
if (x_slice.isSensitive()) { if (x_slice.isSensitive()) {
sens.setType("calorimeter"); sens.setType("calorimeter");
s_vol.setSensitiveDetector(sens); s_vol.setSensitiveDetector(sens);
sensitives.push_back(s_phv); sensitives.push_back(s_phv);
}
sliceZ += s_thick / 2;
s_num++;
} }
l_vol.setVisAttributes(description.visAttributes(x_layer.visStr())); sliceZ += s_thick / 2;
if (l_repeat <= 0) s_num++;
throw std::runtime_error(x_det.nameStr() + "> Invalid repeat value"); }
for (int j = 0; j < l_repeat; ++j) { l_vol.setVisAttributes(description.visAttributes(x_layer.visStr()));
string phys_lay = _toString(l_num, "layer%d"); if (l_repeat <= 0)
layerZ += l_thick / 2; throw std::runtime_error(x_det.nameStr() + "> Invalid repeat value");
DetElement layer_elt(endcap, phys_lay, l_num); for (int j = 0; j < l_repeat; ++j) {
PlacedVolume pv = endcapVol.placeVolume(l_vol, Position(0, 0, layerZ)); string phys_lay = _toString(l_num, "layer%d");
pv.addPhysVolID("layer", l_num); layerZ += l_thick / 2;
layer_elt.setPlacement(pv); DetElement layer_elt(endcap, phys_lay, l_num);
for (size_t ic = 0; ic < sensitives.size(); ++ic) { PlacedVolume pv = endcapVol.placeVolume(l_vol, Position(0, 0, layerZ));
PlacedVolume sens_pv = sensitives[ic]; pv.addPhysVolID("layer", l_num);
DetElement comp_elt(layer_elt, sens_pv.volume().name(), l_num); layer_elt.setPlacement(pv);
comp_elt.setPlacement(sens_pv); for (size_t ic = 0; ic < sensitives.size(); ++ic) {
} PlacedVolume sens_pv = sensitives[ic];
layerZ += l_thick / 2; DetElement comp_elt(layer_elt, sens_pv.volume().name(), l_num);
++l_num; comp_elt.setPlacement(sens_pv);
} }
++layerType; layerZ += l_thick / 2;
++l_num;
} }
++layerType;
}
double z_pos = zmin + totalThickness / 2; double z_pos = zmin + totalThickness / 2;
PlacedVolume pv; PlacedVolume pv;
// Reflect it. // Reflect it.
Assembly assembly(det_name); Assembly assembly(det_name);
DetElement endcapAssyDE(det_name, det_id); DetElement endcapAssyDE(det_name, det_id);
Volume motherVol = description.pickMotherVolume(endcapAssyDE); Volume motherVol = description.pickMotherVolume(endcapAssyDE);
if (reflect) { if (reflect) {
pv = assembly.placeVolume(endcapVol, pv = assembly.placeVolume(endcapVol, Transform3D(RotationZYX(M_PI / numsides, M_PI, 0), Position(0, 0, -z_pos)));
Transform3D(RotationZYX(M_PI / numsides, M_PI, 0), Position(0, 0, -z_pos))); pv.addPhysVolID("barrel", 2);
pv.addPhysVolID("barrel", 2); Ref_t(endcap)->SetName((det_name + "_backward").c_str());
Ref_t(endcap)->SetName((det_name + "_backward").c_str()); endcap.setPlacement(pv);
endcap.setPlacement(pv); } else {
} else { pv = assembly.placeVolume(endcapVol, Transform3D(RotationZYX(M_PI / numsides, 0, 0), Position(0, 0, z_pos)));
pv = assembly.placeVolume(endcapVol, pv.addPhysVolID("barrel", 1);
Transform3D(RotationZYX(M_PI / numsides, 0, 0), Position(0, 0, z_pos))); Ref_t(endcap)->SetName((det_name + "_forward").c_str());
pv.addPhysVolID("barrel", 1); endcap.setPlacement(pv);
Ref_t(endcap)->SetName((det_name + "_forward").c_str()); }
endcap.setPlacement(pv); endcapAssyDE.add(endcap);
} pv = motherVol.placeVolume(assembly,Position(pos.x(),pos.y(),pos.z()));
endcapAssyDE.add(endcap); pv.addPhysVolID("system", det_id);
pv = motherVol.placeVolume(assembly); endcapAssyDE.setPlacement(pv);
pv.addPhysVolID("system", det_id); return endcapAssyDE;
endcapAssyDE.setPlacement(pv);
return endcapAssyDE;
} }
// clang-format off // clang-format off
......
//==========================================================================
// AIDA Detector description implementation
//--------------------------------------------------------------------------
// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
// All rights reserved.
//
// For the licensing terms see $DD4hepINSTALL/LICENSE.
// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
//
// Author : M.Frank
//
//==========================================================================
//
// Specialized generic detector constructor
//
//==========================================================================
#include "DD4hep/DetFactoryHelper.h"
using namespace std;
using namespace dd4hep;
using namespace dd4hep::detail;
static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens) {
xml_det_t x_det = e;
Material air = description.air();
string det_name = x_det.nameStr();
bool reflect = x_det.reflect();
DetElement sdet(det_name,x_det.id());
Assembly assembly(det_name);
PlacedVolume pv;
int l_num = 0;
xml::Component pos = x_det.position();
for(xml_coll_t i(x_det,_U(layer)); i; ++i, ++l_num) {
xml_comp_t x_layer = i;
string l_nam = det_name+_toString(l_num,"_layer%d");
double zmin = x_layer.inner_z();
double rmin = x_layer.inner_r();
double rmax = x_layer.outer_r();
double z = zmin, layerWidth = 0.;
int s_num = 0;
for(xml_coll_t j(x_layer,_U(slice)); j; ++j) {
double thickness = xml_comp_t(j).thickness();
layerWidth += thickness;
}
Tube l_tub(rmin,rmax,layerWidth,2*M_PI);
Volume l_vol(l_nam,l_tub,air);
l_vol.setVisAttributes(description,x_layer.visStr());
for(xml_coll_t j(x_layer,_U(slice)); j; ++j, ++s_num) {
xml_comp_t x_slice = j;
double thick = x_slice.thickness();
Material mat = description.material(x_slice.materialStr());
string s_nam = l_nam+_toString(s_num,"_slice%d");
Volume s_vol(s_nam, Tube(rmin,rmax,thick), mat);
if ( x_slice.isSensitive() ) {
sens.setType("tracker");
s_vol.setSensitiveDetector(sens);
}
s_vol.setAttributes(description,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
pv = l_vol.placeVolume(s_vol,Position(0,0,z-zmin-layerWidth/2+thick/2));
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 ) {
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));
}
}
if ( x_det.hasAttr(_U(combineHits)) ) {
sdet.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens);
}
pv = description.pickMotherVolume(sdet).placeVolume(assembly,Position(pos.x(),pos.y(),pos.z()));
pv.addPhysVolID("system", x_det.id()); // Set the subdetector system ID.
sdet.setPlacement(pv);
return sdet;
}
DECLARE_DETELEMENT(ref_DiskTracker,create_detector)
DECLARE_DETELEMENT(ref_SolenoidEndcap,create_detector)
//==========================================================================
// AIDA Detector description implementation
//--------------------------------------------------------------------------
// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
// All rights reserved.
//
// For the licensing terms see $DD4hepINSTALL/LICENSE.
// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
//
// Author : M.Frank
//
//==========================================================================
//
// Specialized generic detector constructor
//
//==========================================================================
#include "DD4hep/DetFactoryHelper.h"
using namespace std;
using namespace dd4hep;
using namespace dd4hep::detail;
static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens) {
xml_det_t x_det = e;
string det_name = x_det.nameStr();
Material air = description.air();
DetElement sdet (det_name,x_det.id());
Assembly assembly (det_name+"_assembly");
PlacedVolume pv;
int n = 0;
xml::Component pos = x_det.position();
for(xml_coll_t i(x_det,_U(layer)); i; ++i, ++n) {
xml_comp_t x_layer = i;
string l_name = det_name+_toString(n,"_layer%d");
double z = x_layer.outer_z();
double rmin = x_layer.inner_r();
double r = rmin;
DetElement layer(sdet,_toString(n,"layer%d"),x_layer.id());
Tube l_tub (rmin,2*rmin,z);
Volume l_vol(l_name,l_tub,air);
int im = 0;
for(xml_coll_t j(x_layer,_U(slice)); j; ++j, ++im) {
xml_comp_t x_slice = j;
Material mat = description.material(x_slice.materialStr());
string s_name= l_name+_toString(im,"_slice%d");
double thickness = x_slice.thickness();
Tube s_tub(r,r+thickness,z,2*M_PI);
Volume s_vol(s_name, s_tub, mat);
r += thickness;
if ( x_slice.isSensitive() ) {
sens.setType("tracker");
s_vol.setSensitiveDetector(sens);
}
// Set Attributes
s_vol.setAttributes(description,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
pv = l_vol.placeVolume(s_vol);
// Slices have no extra id. Take the ID of the layer!
pv.addPhysVolID("slice",im);
}
l_tub.setDimensions(rmin,r,z);
//cout << l_name << " " << rmin << " " << r << " " << z << endl;
l_vol.setVisAttributes(description,x_layer.visStr());
pv = assembly.placeVolume(l_vol);
pv.addPhysVolID("layer",n);
layer.setPlacement(pv);
}
if ( x_det.hasAttr(_U(combineHits)) ) {
sdet.setCombineHits(x_det.combineHits(),sens);
}
pv = description.pickMotherVolume(sdet).placeVolume(assembly,Position(pos.x(),pos.y(),pos.z()));
pv.addPhysVolID("system",sdet.id()).addPhysVolID("barrel",0);
sdet.setPlacement(pv);
return sdet;
}
DECLARE_DETELEMENT(refdet_SolenoidCoil,create_detector)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment