diff --git a/compact/definitions.xml b/compact/definitions.xml index 36d9cf551608f36b07c2a90339a46b1c513cd70c..06a23d73bf2b12a15497c2b4698e94232a500c7e 100644 --- a/compact/definitions.xml +++ b/compact/definitions.xml @@ -242,6 +242,18 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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> @@ -249,83 +261,52 @@ Solenoid Magnet Parameters ========================== </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" - value="SolenoidBarrel_zmax - SolenoidEndPlateCryostatThickness - SolenoidEndPlateGapThickness"/> + <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_offset" value="600.0*mm"/> - <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="SolenoidYokeEndcap_zmin" value="SolenoidCoil_zmax"/> - <constant name="SolenoidYokeEndcap_zmax" value="SolenoidYokeEndcap_zmin + SolenoidYokeEndcap_thickness"/> - - <constant name="SolenoidYokeChamferAngle" value="0.2"/> + <constant name="Solenoid_rmax" value="Solenoid_rmin + Solenoid_thickness"/> + <constant name="SolenoidBarrel_rmin" value="Solenoid_rmin"/> + <constant name="SolenoidBarrel_length" value="Solenoid_length"/> + <constant name="SolenoidBarrel_zmax" value="Solenoid_length/2.0"/> <comment> - --------------------------------- - Other Central Detector parameters -------------------------------- + Key Central Detector Parameters + -------------------------------- + These are needed here to compute the dependent parameters. </comment> <constant name="RICHLength" value="1.1*m"/> <constant name="TRDLength" value="20.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="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> ============================ - Tracking Parameters + Tracking Detector Parameters ============================ </comment> + <comment> + ------------------------- + GEM Tracker Parameters + ------------------------- + </comment> <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> ------------------------- Vertex Tracker Parameters @@ -344,9 +325,23 @@ <constant name="SiliconTrackerInnerRadius" value="95.0*mm"/> <constant name="SiliconTrackerInnerBarrelLength" value="300.0*mm"/> <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"/> + <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> ------------------------------- Central Barrel Tracker - Global @@ -369,39 +364,49 @@ </comment> <comment> - Ecal and Hcal Barrel + Ecal and Hcal Barrel/Endcap </comment> - <constant name="EcalBarrel_rmin" value="SiliconTrackerOuterRadius + BarrelPIDThickness + 3.0 * cm"/> - <constant name="HcalBarrel_rmax" value="Solenoid_rmin - 5.0 *cm "/> + <constant name="ExtraHcalEndcapP_length" value="0.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="CalBarrelDivider" value="0.5"/> <comment> Ecal and Hcal have the same thickness </comment> + <constant name="EcalBarrel_TotalThickness" value="Barrel_TotalCalThickness * CalBarrelDivider"/> <constant name="HcalBarrel_TotalThickness" value="Barrel_TotalCalThickness * (1.0 - CalBarrelDivider)"/> - <constant name="EcalBarrelLength" value="SiliconTrackerOuterBarrelLength + ForwardPIDLength + BackwardPIDLength"/> - <constant name="EcalEndcapP_zmin" value="SiliconTrackerOuterBarrelLength/2.0 + ForwardPIDLength"/> - <constant name="EcalEndcapN_zmin" value="SiliconTrackerOuterBarrelLength/2.0 + BackwardPIDLength"/> - <constant name="EcalBarrel_offset" value="(EcalEndcapP_zmin-EcalEndcapN_zmin)/2.0"/> + <constant name="EcalBarrelLength" value="CentralTracking_length + BackwardPIDLength"/> + <constant name="EcalBarrel_offset" value="(CentralTracking_length -(CentralTracking_length+BackwardPIDLength))/2.0"/> - <constant name="EndcapP_TotalCalThickness" value="(SolenoidYokeEndcap_zmin - 10.0 * mm) - (EcalEndcapP_zmin + 10.0 * mm)"/> - <constant name="EndcapN_TotalCalThickness" value="(SolenoidYokeEndcap_zmin - 10.0 * mm) - (EcalEndcapN_zmin + 10.0 * mm)"/> + <constant name="EcalEndcapP_zmin" value="CentralTracking_length/2.0 + ForwardPIDLength"/> + <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="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="EcalEndcapN_TotalThickness" value="EndcapN_TotalCalThickness * EndcapN_CalDivide"/> + <constant name="EcalEndcapP_length" value="EndcapPTotalCal_length * EndcapP_CalDivide"/> + <constant name="EcalEndcapN_length" value="EndcapNTotalCal_length * EndcapN_CalDivide"/> - <constant name="HcalEndcapP_TotalThickness" value="EndcapP_TotalCalThickness * (1.0 - EndcapP_CalDivide)"/> - <constant name="HcalEndcapN_TotalThickness" value="EndcapN_TotalCalThickness * (1.0 - EndcapN_CalDivide)"/> + <constant name="HcalEndcapP_length" value="EndcapPTotalCal_length * (1.0 - EndcapP_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> <constant name="EcalEndcapP_rmin" value="200.0*mm"/> <constant name="EcalEndcapN_rmin" value="300.0*mm"/> - <constant name="HcalEndcapP_rmin" value="250.0 * mm"/> - <constant name="HcalEndcapN_rmin" value="350.0 * mm"/> + <constant name="HcalEndcapP_rmin" value="EcalEndcapP_rmin"/> + <constant name="HcalEndcapN_rmin" value="EcalEndcapN_rmin"/> <comment> ------------------------- @@ -449,9 +454,9 @@ <comment> EM Endcap N Layer; same number of layers for EcalThin and EcalThick </comment> <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" - 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="EcalEndcapNLayer1_NRepeat" value="1"/> <constant name="EcalEndcapPLayer2_NRepeat" value="EcalEndcapPLayers"/> @@ -471,11 +476,12 @@ Hadronic Calorimeter Parameters ------------------------------- </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="HcalBarrelLength" value="EcalBarrelLength + EcalEndcapP_TotalThickness + EcalEndcapN_TotalThickness + 10.0*mm "/> - <constant name="HcalEndcap_zmin" value="HcalBarrelLength/2.0"/> - <constant name="HcalEndcapAvailThickness" value="(SolenoidYokeEndcap_zmin - 10.0 * mm) - HcalEndcap_zmin"/> + <constant name="HcalBarrelLength" value="Solenoid_length + ExtraHcalEndcapP_length + ExtraHcalEndcapN_length- HcalEndcapP_length- HcalEndcapN_length - 10*cm"/> + + <constant name="HcalEndcapP_zmin" value="SolenoidYokeEndcapP_zmin - HcalEndcapP_length "/> + <constant name="HcalEndcapN_zmin" value="SolenoidYokeEndcapN_zmin - HcalEndcapN_length "/> <comment> Material Thickness </comment> <constant name="HcalSteelThickness" value="1.89 * cm"/> @@ -484,17 +490,19 @@ <constant name="HcalG10Thickness" value="3.00 * mm"/> <constant name="HcalAirThickness" value="1.60 * mm"/> - <comment> Layer Thickness </comment> - <constant name="HcalOneLayerThickness" + <comment> Single Layer Thickness (for both barrel and endcap)</comment> + <constant name="HcalSingleLayerThickness" 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> - <constant name="HcalEndcapLayers" value="floor(HcalEndcapAvailThickness / HcalOneLayerThickness)"/> - <constant name="HcalEndcapThickness" value="HcalEndcapLayers * HcalOneLayerThickness"/> + <comment> Hcal Barrel Layers and computed Thickness </comment> + <constant name="HcalBarrelLayer_NRepeat" value="floor(HcalBarrelAvailThickness / HcalSingleLayerThickness)"/> + <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> ---------------------- diff --git a/compact/ecal.xml b/compact/ecal.xml index 30cb8016a5befe9978eff5e46f55180b61732103..6e8c6398e0cf893bdc36c5b0878a8374090df072 100644 --- a/compact/ecal.xml +++ b/compact/ecal.xml @@ -83,6 +83,7 @@ readout="EcalEndcapHits" vis="EcalEndcapVis" calorimeterType="EM_ENDCAP" > + <position x="0" y="0" z="0"/> <dimensions numsides="CaloSides" zmin="EcalEndcapP_zmin" @@ -125,6 +126,7 @@ readout="EcalEndcapHits" vis="EcalEndcapVis" calorimeterType="EM_ENDCAP"> + <position x="0" y="0" z="0"/> <dimensions numsides="CaloSides" zmin="EcalEndcapN_zmin" diff --git a/compact/hcal.xml b/compact/hcal.xml index 3edc03e2ba259bb42ed30715350d6c1acf147ab3..a05bfe7234775a1d9546d1536b676a76157e0938 100644 --- a/compact/hcal.xml +++ b/compact/hcal.xml @@ -18,9 +18,10 @@ <detector id="HCalBarrel_ID" name="HcalBarrel" - type="DD4hep_PolyhedraBarrelCalorimeter2" + type="refdet_EcalBarrel" readout="HcalBarrelHits" calorimeterType="HAD_BARREL" + offset="Barrel_offset" gap="0.*cm" material="Steel235"> <dimensions @@ -28,7 +29,7 @@ rmin="HcalBarrel_rmin" z="HcalBarrelLength"/> <staves vis="HcalBarrelVis"/> - <layer repeat="HcalBarrelLayers"> + <layer repeat="HcalBarrelLayer_NRepeat"> <slice material="Steel235" thickness="HcalSteelThickness"/> <slice material="PyrexGlass" thickness="HcalPyrexThickness"/> <slice material="RPCGasDefault" thickness="HcalRPCGasThickness" sensitive="yes" limits="cal_limits"/> @@ -46,12 +47,13 @@ vis="HcalEndcapVis" calorimeterType="HAD_ENDCAP" reflect="false"> + <position x="0" y="0" z="0"/> <dimensions numsides="CaloSides" - zmin="HcalEndcap_zmin" + zmin="HcalEndcapP_zmin" rmin="HcalEndcapP_rmin" rmax="HcalBarrel_rmax"/> - <layer repeat="HcalEndcapLayers" vis="HcalEndcapVis" > + <layer repeat="HcalEndcapPLayer_NRepeat" vis="HcalEndcapVis" > <slice material="Steel235" thickness="HcalSteelThickness"/> <slice material="PyrexGlass" thickness="HcalPyrexThickness"/> <slice material="RPCGasDefault" thickness="HcalRPCGasThickness" sensitive="yes" limits="cal_limits"/> @@ -68,12 +70,13 @@ readout="HcalEndcapHits" vis="HcalEndcapVis" calorimeterType="HAD_ENDCAP" reflect="true"> + <position x="0" y="0" z="0"/> <dimensions numsides="CaloSides" - zmin="HcalEndcap_zmin" + zmin="HcalEndcapN_zmin" rmin="HcalEndcapN_rmin" rmax="HcalBarrel_rmax"/> - <layer repeat="HcalEndcapLayers" vis="HcalEndcapVis" > + <layer repeat="HcalEndcapNLayer_NRepeat" vis="HcalEndcapVis" > <slice material="Steel235" thickness="HcalSteelThickness"/> <slice material="PyrexGlass" thickness="HcalPyrexThickness"/> <slice material="RPCGasDefault" thickness="HcalRPCGasThickness" sensitive="yes" limits="cal_limits"/> diff --git a/compact/solenoid.xml b/compact/solenoid.xml index 1a7ddd8ddd540a1f43514dfa96cf2502f8f6cd94..1ccfcd5557345e8817726fd2c2382dfe9d50c1e6 100644 --- a/compact/solenoid.xml +++ b/compact/solenoid.xml @@ -6,6 +6,39 @@ Solenoid Magnet Parameters -------------------------- </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> <detectors> @@ -19,8 +52,9 @@ <detector id="Solenoid_ID" name="SolenoidCoilBarrel" - type="DD4hep_MultiLayerTracker" + type="refdet_SolenoidCoil" insideTrackingVolume="false"> + <position x="0" y="0" z="Solenoid_offset"/> <layer id="1" inner_r="Solenoid_rmin" outer_z="SolenoidBarrel_zmax" @@ -47,10 +81,11 @@ <detector id="SolenoidSupport_ID" name="SolenoidCoilEnds" - type="DD4hep_DiskTracker" + type="ref_SolenoidEndcap" insideTrackingVolume="false" reflect="true" vis="SolenoidCryostatVis"> + <position x="0" y="0" z="Solenoid_offset"/> <layer id="1" inner_z="SolenoidCoil_zmax" inner_r="SolenoidCoilConductor_rmin" @@ -70,10 +105,11 @@ <detector id="SolenoidYoke_ID" name="SolenoidYokeEndcaps" - type="DD4hep_DiskTracker" + type="ref_SolenoidEndcap" insideTrackingVolume="false" reflect="true" vis="SolenoidYokeVis"> + <position x="0" y="0" z="Solenoid_offset"/> <layer id="1" vis="PurpleVis" inner_z="SolenoidBarrel_zmax + SolenoidEndPlateGapThickness" diff --git a/reference_detector.xml b/reference_detector.xml index b040d8db3ea9b1e997273807341501de4f530d56..0aa5cd1cf3a5c0c9699539db03ead4608dfe70df 100644 --- a/reference_detector.xml +++ b/reference_detector.xml @@ -123,11 +123,11 @@ <include ref="compact/ffi_ZDC.xml"/> <include ref="compact/ci_GEM.xml"/> + <include ref="compact/hcal.xml"/> <!-- <include ref="compact/ci_HCAL.xml"/> <include ref="compact/forward_rich.xml"/> <include ref="compact/roman_pots.xml"/> - <include ref="compact/hcal.xml"/> --> <include ref="eic/forward_ion_beamline.xml"/> diff --git a/src/EcalBarrel_geo.cpp b/src/BarrelCalorimeter_geo.cpp similarity index 99% rename from src/EcalBarrel_geo.cpp rename to src/BarrelCalorimeter_geo.cpp index 4f3862df8775f9daf15ce49a8e7e245a9b524c8f..634a45f433e419b15880b756066cf55d89c7ba06 100644 --- a/src/EcalBarrel_geo.cpp +++ b/src/BarrelCalorimeter_geo.cpp @@ -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_HcalBarrel,create_detector) diff --git a/src/PolyhedraEndcapCalorimeter2_geo.cpp b/src/PolyhedraEndcapCalorimeter2_geo.cpp index 304961cfc7937725943e934f36c6bb8ce89ccf8c..e7e268875a9210d58142e32120781bf41c675f0f 100644 --- a/src/PolyhedraEndcapCalorimeter2_geo.cpp +++ b/src/PolyhedraEndcapCalorimeter2_geo.cpp @@ -21,110 +21,110 @@ 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; - xml_dim_t dim = x_det.dimensions(); - int det_id = x_det.id(); - bool reflect = x_det.reflect(true); - string det_name = x_det.nameStr(); - Material air = description.air(); - int numsides = dim.numsides(); - double rmin = dim.rmin(); - double rmax = dim.rmax() * std::cos(M_PI / numsides); - double zmin = dim.zmin(); - Layering layering(x_det); - double totalThickness = layering.totalThickness(); - Volume endcapVol("endcap", PolyhedraRegular(numsides, rmin, rmax, totalThickness), air); - DetElement endcap("endcap", det_id); +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(); + int det_id = x_det.id(); + bool reflect = x_det.reflect(true); + string det_name = x_det.nameStr(); + Material air = description.air(); + int numsides = dim.numsides(); + xml::Component pos = x_det.position(); + double rmin = dim.rmin(); + double rmax = dim.rmax() * std::cos(M_PI / numsides); + double zmin = dim.zmin(); + Layering layering(x_det); + 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 << "zmin = " << zmin << "\n"; - std::cout << "rmin = " << rmin << "\n"; - std::cout << "rmax = " << rmax << "\n"; - std::cout << "nlayers = " << std::size(layering.layers()) << "\n"; - int l_num = 1; - int layerType = 0; - double layerZ = -totalThickness / 2; + //std::cout << "totalThickness = " << totalThickness << "\n"; + //std::cout << "zmin = " << zmin << "\n"; + //std::cout << "rmin = " << rmin << "\n"; + //std::cout << "rmax = " << rmax << "\n"; + //std::cout << "nlayers = " << std::size(layering.layers()) << "\n"; + int l_num = 1; + int layerType = 0; + 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) { - std::cout << "l_num = " << l_num << "\n"; - std::cout << "xc = " << xc << "\n"; - xml_comp_t x_layer = xc; - double l_thick = layering.layer(l_num - 1)->thickness(); - std::cout << "xc = " << xc << "\n"; - string l_name = _toString(layerType, "layer%d"); - int l_repeat = x_layer.repeat(); - Volume l_vol(l_name, PolyhedraRegular(numsides, rmin, rmax, l_thick), air); - vector<PlacedVolume> sensitives; + for (xml_coll_t xc(x_det, _U(layer)); xc; ++xc) { + //std::cout << "l_num = " << l_num << "\n"; + //std::cout << "xc = " << xc << "\n"; + xml_comp_t x_layer = xc; + double l_thick = layering.layer(l_num - 1)->thickness(); + //std::cout << "xc = " << xc << "\n"; + string l_name = _toString(layerType, "layer%d"); + int l_repeat = x_layer.repeat(); + Volume l_vol(l_name, PolyhedraRegular(numsides, rmin, rmax, l_thick), air); + vector<PlacedVolume> sensitives; - int s_num = 1; - double sliceZ = -l_thick / 2; - for (xml_coll_t xs(x_layer, _U(slice)); xs; ++xs) { - xml_comp_t x_slice = xs; - string s_name = _toString(s_num, "slice%d"); - double s_thick = x_slice.thickness(); - Material s_mat = description.material(x_slice.materialStr()); - Volume s_vol(s_name, PolyhedraRegular(numsides, rmin, rmax, s_thick), s_mat); + int s_num = 1; + double sliceZ = -l_thick / 2; + for (xml_coll_t xs(x_layer, _U(slice)); xs; ++xs) { + xml_comp_t x_slice = xs; + string s_name = _toString(s_num, "slice%d"); + double s_thick = x_slice.thickness(); + Material s_mat = description.material(x_slice.materialStr()); + Volume s_vol(s_name, PolyhedraRegular(numsides, rmin, rmax, s_thick), s_mat); - s_vol.setVisAttributes(description.visAttributes(x_slice.visStr())); - sliceZ += s_thick / 2; - PlacedVolume s_phv = l_vol.placeVolume(s_vol, Position(0, 0, sliceZ)); - s_phv.addPhysVolID("slice", s_num); - if (x_slice.isSensitive()) { - sens.setType("calorimeter"); - s_vol.setSensitiveDetector(sens); - sensitives.push_back(s_phv); - } - sliceZ += s_thick / 2; - s_num++; + s_vol.setVisAttributes(description.visAttributes(x_slice.visStr())); + sliceZ += s_thick / 2; + PlacedVolume s_phv = l_vol.placeVolume(s_vol, Position(0, 0, sliceZ)); + s_phv.addPhysVolID("slice", s_num); + if (x_slice.isSensitive()) { + sens.setType("calorimeter"); + s_vol.setSensitiveDetector(sens); + sensitives.push_back(s_phv); } - l_vol.setVisAttributes(description.visAttributes(x_layer.visStr())); - if (l_repeat <= 0) - throw std::runtime_error(x_det.nameStr() + "> Invalid repeat value"); - for (int j = 0; j < l_repeat; ++j) { - string phys_lay = _toString(l_num, "layer%d"); - layerZ += l_thick / 2; - DetElement layer_elt(endcap, phys_lay, l_num); - PlacedVolume pv = endcapVol.placeVolume(l_vol, Position(0, 0, layerZ)); - pv.addPhysVolID("layer", l_num); - layer_elt.setPlacement(pv); - for (size_t ic = 0; ic < sensitives.size(); ++ic) { - PlacedVolume sens_pv = sensitives[ic]; - DetElement comp_elt(layer_elt, sens_pv.volume().name(), l_num); - comp_elt.setPlacement(sens_pv); - } - layerZ += l_thick / 2; - ++l_num; + sliceZ += s_thick / 2; + s_num++; + } + l_vol.setVisAttributes(description.visAttributes(x_layer.visStr())); + if (l_repeat <= 0) + throw std::runtime_error(x_det.nameStr() + "> Invalid repeat value"); + for (int j = 0; j < l_repeat; ++j) { + string phys_lay = _toString(l_num, "layer%d"); + layerZ += l_thick / 2; + DetElement layer_elt(endcap, phys_lay, l_num); + PlacedVolume pv = endcapVol.placeVolume(l_vol, Position(0, 0, layerZ)); + pv.addPhysVolID("layer", l_num); + layer_elt.setPlacement(pv); + for (size_t ic = 0; ic < sensitives.size(); ++ic) { + PlacedVolume sens_pv = sensitives[ic]; + DetElement comp_elt(layer_elt, sens_pv.volume().name(), l_num); + comp_elt.setPlacement(sens_pv); } - ++layerType; + layerZ += l_thick / 2; + ++l_num; } + ++layerType; + } - double z_pos = zmin + totalThickness / 2; - PlacedVolume pv; - // Reflect it. - Assembly assembly(det_name); - DetElement endcapAssyDE(det_name, det_id); - Volume motherVol = description.pickMotherVolume(endcapAssyDE); - if (reflect) { - pv = assembly.placeVolume(endcapVol, - Transform3D(RotationZYX(M_PI / numsides, M_PI, 0), Position(0, 0, -z_pos))); - pv.addPhysVolID("barrel", 2); - Ref_t(endcap)->SetName((det_name + "_backward").c_str()); - endcap.setPlacement(pv); - } else { - pv = assembly.placeVolume(endcapVol, - Transform3D(RotationZYX(M_PI / numsides, 0, 0), Position(0, 0, z_pos))); - pv.addPhysVolID("barrel", 1); - Ref_t(endcap)->SetName((det_name + "_forward").c_str()); - endcap.setPlacement(pv); - } - endcapAssyDE.add(endcap); - pv = motherVol.placeVolume(assembly); - pv.addPhysVolID("system", det_id); - endcapAssyDE.setPlacement(pv); - return endcapAssyDE; + double z_pos = zmin + totalThickness / 2; + PlacedVolume pv; + // Reflect it. + Assembly assembly(det_name); + DetElement endcapAssyDE(det_name, det_id); + Volume motherVol = description.pickMotherVolume(endcapAssyDE); + if (reflect) { + pv = assembly.placeVolume(endcapVol, Transform3D(RotationZYX(M_PI / numsides, M_PI, 0), Position(0, 0, -z_pos))); + pv.addPhysVolID("barrel", 2); + Ref_t(endcap)->SetName((det_name + "_backward").c_str()); + endcap.setPlacement(pv); + } else { + pv = assembly.placeVolume(endcapVol, Transform3D(RotationZYX(M_PI / numsides, 0, 0), Position(0, 0, z_pos))); + pv.addPhysVolID("barrel", 1); + 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())); + pv.addPhysVolID("system", det_id); + endcapAssyDE.setPlacement(pv); + return endcapAssyDE; } // clang-format off diff --git a/src/ref_DiskTracker_geo.cpp b/src/ref_DiskTracker_geo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..60ebe9abfc15e84f82ba29be86342c688e75a4d0 --- /dev/null +++ b/src/ref_DiskTracker_geo.cpp @@ -0,0 +1,89 @@ +//========================================================================== +// 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) diff --git a/src/ref_SolenoidCoil_geo.cpp b/src/ref_SolenoidCoil_geo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d4cdb6ddba7d6da4edc60fe7ebd976ece64d4550 --- /dev/null +++ b/src/ref_SolenoidCoil_geo.cpp @@ -0,0 +1,81 @@ +//========================================================================== +// 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)