diff --git a/CMakeLists.txt b/CMakeLists.txt index b2d5e2dc5b5199bb11998b9326a919d880afc286..f807d33ab82893f21128b7470bdccd27ffae20bb 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_CTD_Si.xml b/compact/cb_CTD_Si.xml index 06b4f825556ef7b826860bef188cdf11521ec55d..3deea232fa2dc4677afb8e4f754e872af0b856d2 100644 --- a/compact/cb_CTD_Si.xml +++ b/compact/cb_CTD_Si.xml @@ -3,6 +3,9 @@ <comment> Central Barrel Tracker Silicon </comment> <define> + <comment> Si layer opiton </comment> + <constant name="cb_CTD_Si_gap" value="5.0 * cm"/> + <constant name="cb_CTD_Si_layer" value="15"/> </define> <limits> diff --git a/compact/cb_Solenoid.xml b/compact/cb_Solenoid.xml index 2083a62dbdb38140ae6ebd245ed9b4c43da89b19..efca08be97e5ab9212fc4dbafc55cd144070b4cc 100644 --- a/compact/cb_Solenoid.xml +++ b/compact/cb_Solenoid.xml @@ -21,7 +21,7 @@ </comment> <detector id="Solenoid_ID" name="cb_Solenoid" type="cb_Solenoid" insideTrackingVolume="false" vis="cb_SolenoidVis"> <material name="Vacuum"/> <!-- G4_Galactic --> - <dimensions rmin="cb_Solenoid_rmin" rmax="cb_Solenoid_rmax" z="cb_Solenoid_z" delta="cb_Solenoid_shift"/> + <dimensions rmin="Solenoid_rmin" rmax="Solenoid_rmax" z="b_Solenoid_z" delta="cb_Solenoid_shift"/> </detector> </detectors> diff --git a/compact/definitions.xml b/compact/definitions.xml index c23b1cc6d5296f3853fb2c6e3af9cbfb3cad75f0..4ebaf809292550702b243de3aba3a6e0b10c342b 100644 --- a/compact/definitions.xml +++ b/compact/definitions.xml @@ -1,15 +1,16 @@ <define> - <comment>Although not explicit in the design study, the eRHIC crossing angle is not symmetric.</comment> + <constant name="world_side" value="30*m"/> + <constant name="world_x" value="world_side"/> + <constant name="world_y" value="world_side"/> + <constant name="world_z" value="100*m"/> + + <comment>Although not explicit in the EIC design study, the crossing angle is not symmetric.</comment> <constant name="CrossingAngle" value="0.025"/> <constant name="ionCrossingAngle" value="0.0166667"/> <constant name="electronCrossingAngle" value="0.00833333"/> <constant name="CrossingSlope" value="0.0166682"/> <constant name="Pi" value="3.14159265359"/> - <constant name="world_side" value="30*m"/> - <constant name="world_x" value="world_side"/> - <constant name="world_y" value="world_side"/> - <constant name="world_z" value="100*m"/> <constant name="mil" value="0.0254*mm"/> @@ -237,44 +238,47 @@ </comment> <comment> - -------------------------- - Solenoid Magnet Parameters - -------------------------- + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Detector Definition Parameters + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </comment> <comment> - These cb_ parameters don't make sense + ========================== + 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_rmin" value="2000.0*mm"/> <constant name="Solenoid_rmax" value="Solenoid_rmin + Solenoid_thickness"/> - <constant name="SolenoidLength" value="4050.0*mm"/> + <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="SolenoidBarrelLenth" value="SolenoidLength"/> - <constant name="SolenoidBarrel_zmax" value="SolenoidBarrelLenth/2.0"/> + <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="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"/> @@ -282,25 +286,41 @@ <constant name="SolenoidalFieldRadius" value="SolenoidCoilConductor_rmin + SolenoidBarrelAlConductorThickness / 2.0"/> - <constant name="SolenoidCoilLength" value="SolenoidCoil_zmax*2.0"/> - - <constant name="SolenoidThickness" value="Solenoid_rmax - Solenoid_rmin"/> + <constant name="SolenoidCoil_length" value="SolenoidCoil_zmax*2.0"/> - <constant name="SolenoidYokeEndcapP_rmin" value="800*mm"/> - <constant name="SolenoidYokeEndcapN_rmin" value="800*mm"/> - <constant name="SolenoidYokeEndcapThickness" value="0.2 * m"/> - <constant name="SolenoidYokeEndcap_zmin" value="SolenoidBarrel_zmax"/> - <constant name="SolenoidYokeEndcap_zmax" value="SolenoidYokeEndcap_zmin + SolenoidYokeEndcapThickness"/> + <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> + --------------------------------- + Other 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> ============================ Tracking Parameters ============================ </comment> <constant name="tracker_region_rmax" value="Solenoid_rmax/2.0"/> - <constant name="tracker_region_zmax" value="SolenoidLength/2.0"/> + <constant name="tracker_region_zmax" value="Solenoid_length/2.0"/> <comment> ------------------------- @@ -308,8 +328,8 @@ ------------------------- </comment> <constant name="VertexTrackerInnerRadius" value="30.0*mm"/> - <constant name="VertexTrackerOuterRadius" value="Solenoid_rmin/2.0"/> - <constant name="VertexTrackerOuterBarrelLength" value="300.0*mm"/> + <constant name="VertexTrackerOuterRadius" value="90.0*mm"/> + <constant name="VertexTrackerOuterBarrelLength" value="400.0*mm"/> <comment> @@ -318,54 +338,63 @@ -------------------------- </comment> <constant name="SiliconTrackerInnerRadius" value="95.0*mm"/> - <constant name="SiliconTrackerInnerBarrelLength" value="400.0*mm"/> - <constant name="SiliconTrackerOuterRadius" value="Solenoid_rmax/2.0"/> - <constant name="SiliconTrackerOuterBarrelLength" value="SolenoidLength/2.0"/> + <constant name="SiliconTrackerInnerBarrelLength" value="300.0*mm"/> + <constant name="SiliconTrackerOuterRadius" value="Solenoid_rmax/3.0"/> + <constant name="SiliconTrackerOuterBarrelLength" value="Solenoid_length/2.5"/> + <constant name="SiliconTrackerOuterBarrel_zmax" value="SiliconTrackerOuterBarrelLength/2.0"/> <comment> ------------------------------- Central Barrel Tracker - Global ------------------------------- + + The cb_CTD_* parameters can probably be moved to the detector specific xml file. </comment> - <constant name="cb_CTD_rmin" value="21.0 * cm"/> - <constant name="cb_CTD_rmax" value="80.0 * cm"/> - <constant name="cb_CTD_zmax" value="200.0 * cm"/> - <comment> Original Global parameter </comment> - <!-- - <constant name="cb_CTD_zmax" value="120.0 * cm"/> - --> - <constant name="cb_CTD_length" value="SolenoidLength - cb_CTD_zmax"/> - <comment> After fix cb_Solenoid parameters </comment> - <!-- - <constant name="cb_CTD_length" value="cb_Solenoid_z - cb_CTD_zmax"/> - --> - <comment> Si layer opiton </comment> - <constant name="cb_CTD_Si_gap" value="5.0 * cm"/> - <constant name="cb_CTD_Si_layer" value="15"/> + <constant name="cb_CTD_rmin" value="SiliconTrackerInnerRadius"/> + <constant name="cb_CTD_rmax" value="SiliconTrackerOuterRadius"/> + <constant name="cb_CTD_zmax" value="SiliconTrackerOuterBarrel_zmax"/> + <constant name="cb_CTD_length" value="SiliconTrackerOuterBarrelLength"/> <comment> ------------ Calorimeters ------------ + ====================== + Calorimeter Parameters + ====================== + + </comment> + <comment> + Ecal and Hcal Barrel </comment> - <constant name="EcalBarrel_rmin" value="SiliconTrackerOuterRadius + 3.0 * cm"/> - <constant name="HcalBarrel_rmax" value="Solenoid_rmin - 5.0 *cm "/> - <constant name="AvailTotalBarrelCalorimetryThickness" value="HcalBarrel_rmax - EcalBarrel_rmin"/> - <constant name="CalBarrelDivider" value="0.5"/> <comment> Ecal and Hcal have the same thickness </comment> - <constant name="EcalBarrelAvailTotalThickness" value="AvailTotalBarrelCalorimetryThickness * CalBarrelDivider"/> - <constant name="HcalBarrelAvailTotalThickness" value="AvailTotalBarrelCalorimetryThickness * (1.0 - CalBarrelDivider)"/> - <constant name="EcalBarrelLength" value="SiliconTrackerOuterBarrelLength+50.0*cm"/> - <constant name="EcalEndcap_zmin" value="EcalBarrelLength/2.0"/> + <constant name="EcalBarrel_rmin" value="SiliconTrackerOuterRadius + BarrelPIDThickness + 3.0 * cm"/> + <constant name="HcalBarrel_rmax" value="Solenoid_rmin - 5.0 *cm "/> + <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="AvailTotalEndcapCalorimetryThickness" value="(SolenoidYokeEndcap_zmin - 10.0 * mm) - (EcalEndcap_zmin + 10.0 * mm)"/> - <constant name="CalEndcapDivider" value="0.5"/> <comment> Ecal and Hcal have the same thickness </comment> - <constant name="EcalEndcapAvailTotalThickness" value="AvailTotalEndcapCalorimetryThickness * CalEndcapDivider"/> - <constant name="HcalEndcapAvailTotalThickness" value="AvailTotalEndcapCalorimetryThickness * (1.0 - CalEndcapDivider)"/> + <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="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="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="HcalEndcapP_TotalThickness" value="EndcapP_TotalCalThickness * (1.0 - EndcapP_CalDivide)"/> + <constant name="HcalEndcapN_TotalThickness" value="EndcapN_TotalCalThickness * (1.0 - EndcapN_CalDivide)"/> <comment> These need to be set in sync with the forward and backward detectors </comment> - <constant name="EcalEndcapP_rmin" value="250.0*mm"/> - <constant name="EcalEndcapN_rmin" value="350.0*mm"/> + <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"/> @@ -374,44 +403,64 @@ ------------------------- EM Calorimeter Parameters ------------------------- + + ## Note about Calormieter parameterization. + + The logic goes like this: + 1. The space for the calorimeter is fixed via parameterization above. + 2. The layer thicknesses are fixed (first parameters below) + 3. From the space/thickness the number of layers is computed. + </comment> <constant name="CaloSides" value="12"/> <comment>Material Thickness</comment> - <constant name="EcalSiliconThickness" value="9.00 * mm"/> - <constant name="EcalCopperThickness" value="0.05 * mm"/> - <constant name="EcalKaptonThickness" value="0.30 * mm"/> - <constant name="EcalAir1Thickness" value="0.33 * mm"/> - <constant name="EcalAir2Thickness" value="0.25 * mm"/> - <constant name="EcalThinTungstenThickness" value="2.50 * mm"/> - <constant name="EcalThickTungstenThickness" value="5.00 * mm"/> + <constant name="EcalSiliconThickness" value="9.00 * mm" /> + <constant name="EcalCopperThickness" value="0.05 * mm" /> + <constant name="EcalKaptonThickness" value="0.30 * mm" /> + <constant name="EcalAir1Thickness" value="0.33 * mm" /> + <constant name="EcalAir2Thickness" value="0.25 * mm" /> + <constant name="EcalThinTungstenThickness" value="2.50 * mm" /> + <constant name="EcalThickTungstenThickness" value="5.00 * mm" /> <comment> Layer Thickness </comment> - <constant name="EcalFirstLayerThickness" - value="EcalSiliconThickness + EcalCopperThickness + EcalKaptonThickness + EcalAir1Thickness"/> - <constant name="EcalThinOneLayerThickness" - value="EcalThinTungstenThickness + EcalAir2Thickness + EcalSiliconThickness + EcalCopperThickness + EcalKaptonThickness + EcalAir1Thickness"/> - <constant name="EcalThickOneLayerThickness" - value="EcalThickTungstenThickness + EcalAir2Thickness + EcalSiliconThickness + EcalCopperThickness + EcalKaptonThickness + EcalAir1Thickness"/> + <constant name="EcalLayer1_thickness" + value="EcalSiliconThickness + EcalCopperThickness + EcalKaptonThickness + EcalAir1Thickness"/> + <constant name="EcalLayer2_thickness" + value="EcalThinTungstenThickness + EcalAir2Thickness + EcalSiliconThickness + EcalCopperThickness + EcalKaptonThickness + EcalAir1Thickness"/> + <constant name="EcalLayer3_thickness" + value="EcalThickTungstenThickness + EcalAir2Thickness + EcalSiliconThickness + EcalCopperThickness + EcalKaptonThickness + EcalAir1Thickness"/> <comment> EM Barrel N Layer; same number of layers for EcalThin and EcalThick</comment> <constant name="EcalBarrelLayers" - value="floor((EcalBarrelAvailTotalThickness - EcalFirstLayerThickness) / (EcalThinOneLayerThickness + EcalThickOneLayerThickness))"/> - <constant name="EcalBarrelThinLayers" value="EcalBarrelLayers"/> - <constant name="EcalBarrelThickLayers" value="EcalBarrelLayers"/> + value="floor((EcalBarrel_TotalThickness - EcalLayer1_thickness) / (EcalLayer2_thickness + EcalLayer3_thickness))"/> + <constant name="EcalBarrelLayer1_NRepeat" value="1"/> + <constant name="EcalBarrelLayer2_NRepeat" value="EcalBarrelLayers"/> + <constant name="EcalBarrelLayer3_NRepeat" value="EcalBarrelLayers"/> + <comment> EM Barrel Thickness </comment> <constant name="EcalBarrelThickness" - value="EcalFirstLayerThickness + (EcalBarrelThinLayers * EcalThinOneLayerThickness) + (EcalBarrelThickLayers * EcalThickOneLayerThickness)"/> + value="EcalBarrelLayer1_NRepeat*EcalLayer1_thickness + EcalBarrelLayer2_NRepeat * EcalLayer2_thickness + EcalBarrelLayer3_NRepeat * EcalLayer3_thickness"/> <constant name="EcalBarrel_rmax" value="EcalBarrel_rmin + EcalBarrelThickness"/> <comment> EM Endcap N Layer; same number of layers for EcalThin and EcalThick </comment> - <constant name="EcalEndcapLayers" - value="floor((EcalEndcapAvailTotalThickness - EcalFirstLayerThickness) / (EcalThinOneLayerThickness + EcalThickOneLayerThickness))"/> - <constant name="EcalEndcapThinLayers" value="EcalEndcapLayers"/> - <constant name="EcalEndcapThickLayers" value="EcalEndcapLayers"/> + <constant name="EcalEndcapPLayers" + value="floor((EcalEndcapP_TotalThickness - EcalLayer1_thickness) / (EcalLayer2_thickness + EcalLayer3_thickness))"/> + <constant name="EcalEndcapNLayers" + value="floor((EcalEndcapN_TotalThickness - EcalLayer1_thickness) / (EcalLayer2_thickness + EcalLayer3_thickness))"/> + <constant name="EcalEndcapPLayer1_NRepeat" value="1"/> + <constant name="EcalEndcapNLayer1_NRepeat" value="1"/> + <constant name="EcalEndcapPLayer2_NRepeat" value="EcalEndcapPLayers"/> + <constant name="EcalEndcapPLayer3_NRepeat" value="EcalEndcapPLayers"/> + <constant name="EcalEndcapNLayer2_NRepeat" value="EcalEndcapNLayers"/> + <constant name="EcalEndcapNLayer3_NRepeat" value="EcalEndcapNLayers"/> + <comment> EM Endcap Thickness </comment> - <constant name="EcalEndcapThickness" - value="EcalFirstLayerThickness + (EcalEndcapThinLayers * EcalThinOneLayerThickness) + (EcalEndcapThickLayers * EcalThickOneLayerThickness)"/> + <constant name="EcalEndcapPThickness" + value="EcalEndcapPLayer1_NRepeat*EcalLayer1_thickness + EcalEndcapPLayer2_NRepeat*EcalLayer2_thickness + EcalEndcapPLayer3_NRepeat*EcalLayer3_thickness "/> + <constant name="EcalEndcapNThickness" + value="EcalEndcapNLayer1_NRepeat*EcalLayer1_thickness + EcalEndcapNLayer2_NRepeat*EcalLayer2_thickness + EcalEndcapNLayer3_NRepeat*EcalLayer3_thickness"/> + <comment> ------------------------------- @@ -420,7 +469,7 @@ </comment> <constant name="HcalBarrel_rmin" value="EcalBarrel_rmax+10.0*mm"/> <constant name="HcalBarrelAvailThickness" value="HcalBarrel_rmax - HcalBarrel_rmin"/> - <constant name="HcalBarrelLength" value="EcalBarrelLength+2.0*EcalEndcapThickness + 10.0*mm "/> + <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"/> @@ -489,10 +538,12 @@ Gaseous RICH Parameters ----------------------- </comment> - <constant name="RICHZMin" value="SolenoidYokeEndcap_zmin + 1 * cm"/> - <constant name="RICHRMin" value="15 * cm"/> - <constant name="RICHRMax" value="60 * cm"/> - <constant name="RICHDepth" value="1 * m"/> + <constant name="RICHZMin" value="SiliconTrackerOuterBarrel_zmax + 1 * cm"/> + <constant name="RICHRMin" value="15 * cm"/> + <constant name="RICH_rmax0" value="SiliconTrackerOuterRadius"/> + <constant name="RICH_rmax1" value="EcalBarrel_rmin"/> + <constant name="RICH_rmax2" value="SolenoidBarrel_rmin-2*cm"/> + <constant name="RICHDepth" value="0.9*m"/> <comment> @@ -500,15 +551,6 @@ Forward Tracker Parameters -------------------------- </comment> - <constant name="TempForwardTrackerSpace" value="1.5 * m"/> - <constant name="ForwardEcalZMin" value="RICHZMin + RICHDepth + TempForwardTrackerSpace"/> - <constant name="ForwardCaloAngle" value="2 * SolenoidYokeChamferAngle"/> - <constant name="ForwardEcalRInner" value="10 * cm"/> - <constant name="ForwardEcalROuter" value="EcalBarrel_rmin + tan(SolenoidYokeChamferAngle) * (RICHDepth) + tan(ForwardCaloAngle) * (ForwardEcalZMin - RICHZMin - RICHDepth)"/> - <constant name="ForwardHcalZMin" value="RICHZMin + RICHDepth + TempForwardTrackerSpace + EcalEndcapThickness + 1 * mm"/> - <constant name="ForwardHcalAngle" value="ForwardCaloAngle"/> - <constant name="ForwardHcalRInner" value="10 * cm"/> - <constant name="ForwardHcalROuter" value="ForwardEcalROuter + tan(ForwardCaloAngle) * (ForwardHcalZMin - ForwardEcalZMin)"/> <comment> -------------------------- @@ -528,10 +570,10 @@ ce_MRICH Parameters -------------------------- </comment> - <constant name="ce_MRICHRMin" value="15*cm"/> - <constant name="ce_MRICHRMax" value="100*cm"/> - <constant name="ce_MRICHLength" value="15*cm"/> - <constant name="ce_MRICHZMin" value="-EcalEndcap_zmin+10.*cm"/> + <constant name="ce_MRICHRMin" value="15*cm"/> + <constant name="ce_MRICHRMax" value="100*cm"/> + <constant name="ce_MRICHLength" value="BackwardCherenkovLength"/> + <constant name="ce_MRICHZMin" value="-EcalEndcapN_zmin+ce_MRICHLength"/> <comment> ------------------ @@ -545,7 +587,7 @@ <constant name="ce_GEM_length" value="30.0 * cm"/> <constant name="ce_GEM_x_pos" value="0.0 * cm"/> <constant name="ce_GEM_y_pos" value="0.0 * cm"/> - <constant name="ce_GEM_z_pos" value="-SolenoidLength/2.0 + ce_GEM_length/2.0"/> + <constant name="ce_GEM_z_pos" value="-Solenoid_length/2.0 + ce_GEM_length/2.0"/> <constant name="ce_GEM_layer" value="8"/> <constant name="ce_GEM_layer_thickness" value="1.0 * cm"/> diff --git a/compact/ecal.xml b/compact/ecal.xml index be2a125ca6a76621c663032eb0b4a74ae5d19659..30cb8016a5befe9978eff5e46f55180b61732103 100644 --- a/compact/ecal.xml +++ b/compact/ecal.xml @@ -9,7 +9,7 @@ <constant name="CrystalBox_offset" value="0.000001*mm"/> <constant name="CrystalEndcap_x_pos" value="0.0*m"/> <constant name="CrystalEndcap_y_pos" value="0.0*m"/> - <constant name="CrystalEndcap_z_pos" value="-EcalEndcap_zmin"/> + <constant name="CrystalEndcap_z_pos" value="-EcalEndcapN_zmin"/> </define> @@ -36,21 +36,23 @@ <detector id="ECalBarrel_ID" name="EcalBarrel" - type="DD4hep_EcalBarrel" + type="refdet_EcalBarrel" readout="EcalBarrelHits" - calorimeterType="EM_BARREL"> + calorimeterType="EM_BARREL" + offset="EcalBarrel_offset" + > <dimensions numsides="CaloSides" rmin="EcalBarrel_rmin" z="EcalBarrelLength"/> <staves vis="EcalBarrelVis"/> - <layer repeat="1"> + <layer repeat="EcalBarrelLayer1_NRepeat"> <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> <slice material="Copper" thickness="EcalCopperThickness"/> <slice material="Kapton" thickness="EcalKaptonThickness"/> <slice material="Air" thickness="EcalAir1Thickness"/> </layer> - <layer repeat="EcalBarrelThinLayers"> + <layer repeat="EcalBarrelLayer2_NRepeat"> <slice material="TungstenDens24" thickness="EcalThinTungstenThickness"/> <slice material="Air" thickness="EcalAir2Thickness"/> <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> @@ -58,7 +60,7 @@ <slice material="Kapton" thickness="EcalKaptonThickness"/> <slice material="Air" thickness="EcalAir1Thickness"/> </layer> - <layer repeat="EcalBarrelThickLayers"> + <layer repeat="EcalBarrelLayer3_NRepeat"> <slice material="TungstenDens24" thickness="EcalThickTungstenThickness"/> <slice material="Air" thickness="EcalAir2Thickness"/> <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> @@ -69,30 +71,30 @@ </detector> <comment> - ----------------------------- - Forward Endcap EM Calorimeter - ----------------------------- + ------------------------------------------ + Forward (Positive Z) Endcap EM Calorimeter + ------------------------------------------ A layered EM calorimeter with tungsten and silicon (or scintillator) strips </comment> <detector id="ECalEndcapP_ID" name="EcalEndcapP" reflect="false" - type="DD4hep_PolyhedraEndcapCalorimeter2" + type="refdet_PolyhedraEndcapCalorimeter2" readout="EcalEndcapHits" vis="EcalEndcapVis" calorimeterType="EM_ENDCAP" > <dimensions numsides="CaloSides" - zmin="EcalEndcap_zmin" + zmin="EcalEndcapP_zmin" rmin="EcalEndcapP_rmin" rmax="EcalBarrel_rmax " /> - <layer repeat="1"> + <layer repeat="EcalEndcapPLayer1_NRepeat"> <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> <slice material="Copper" thickness="EcalCopperThickness"/> <slice material="Kapton" thickness="EcalKaptonThickness"/> <slice material="Air" thickness="EcalAir1Thickness"/> </layer> - <layer repeat="EcalEndcapThinLayers"> + <layer repeat="EcalEndcapPLayer2_NRepeat"> <slice material="TungstenDens24" thickness="EcalThinTungstenThickness"/> <slice material="Air" thickness="EcalAir2Thickness"/> <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> @@ -100,7 +102,7 @@ <slice material="Kapton" thickness="EcalKaptonThickness"/> <slice material="Air" thickness="EcalAir1Thickness"/> </layer> - <layer repeat="EcalEndcapThickLayers"> + <layer repeat="EcalEndcapPLayer3_NRepeat"> <slice material="TungstenDens24" thickness="EcalThickTungstenThickness"/> <slice material="Air" thickness="EcalAir2Thickness"/> <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> @@ -110,7 +112,6 @@ </layer> </detector> - <comment> ------------------------------- Backwards Endcap EM Calorimeter @@ -126,16 +127,16 @@ calorimeterType="EM_ENDCAP"> <dimensions numsides="CaloSides" - zmin="EcalEndcap_zmin" + zmin="EcalEndcapN_zmin" rmin="EcalEndcapN_rmin" rmax="EcalBarrel_rmax " /> - <layer repeat="1"> + <layer repeat="EcalEndcapPLayer1_NRepeat"> <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> <slice material="Copper" thickness="EcalCopperThickness"/> <slice material="Kapton" thickness="EcalKaptonThickness"/> <slice material="Air" thickness="EcalAir1Thickness"/> </layer> - <layer repeat="EcalEndcapThinLayers"> + <layer repeat="EcalEndcapPLayer2_NRepeat"> <slice material="TungstenDens24" thickness="EcalThinTungstenThickness"/> <slice material="Air" thickness="EcalAir2Thickness"/> <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> @@ -143,7 +144,7 @@ <slice material="Kapton" thickness="EcalKaptonThickness"/> <slice material="Air" thickness="EcalAir1Thickness"/> </layer> - <layer repeat="EcalEndcapThickLayers"> + <layer repeat="EcalEndcapPLayer3_NRepeat"> <slice material="TungstenDens24" thickness="EcalThickTungstenThickness"/> <slice material="Air" thickness="EcalAir2Thickness"/> <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> @@ -179,6 +180,4 @@ <plugins> </plugins> -<fields> -</fields> </lccdd> diff --git a/compact/forward_rich.xml b/compact/forward_rich.xml index d94e9e162592d826ae9e7f1f14216cf6f39fc94f..ca0b4ed50fc7f2e49e69cb66055df693700e7bc5 100644 --- a/compact/forward_rich.xml +++ b/compact/forward_rich.xml @@ -5,19 +5,44 @@ <detectors> <detector id="ForwardRICH_ID" name="ForwardRICH" type="refdet_ForwardRICH" readout="ForwardRICHHits" vis="BlueVis"> - <dimensions z0="RICHZMin" length="RICHDepth+20*cm" rmin="RICHRMin" rmax1="RICHRMax*cm" rmax2="RICHRMin+80*cm"/> + <dimensions + z0="RICHZMin" + snout_length="RICHLength - RICHDepth" + length="RICHLength" + rmin="RICHRMin" + rmax0="RICH_rmax0" + rmax1="RICH_rmax1" + rmax2="RICH_rmax2"/> <radiator material="N2cherenkov" /> - <mcppmt zdiff="15.0*cm" rmin="SolenoidYokeEndcapP_rmin - 10*cm" rmax="SolenoidYokeEndcapP_rmin + 80*cm" rtol="1.0*cm" vis="BlueVis" - module_size="10*cm" module_gap="0.2*cm" thickness="1.0*cm" material="Quartz" /> - <tank zdiff="5.0*cm" length="RICHDepth" gas="N2cherenkov" vis="GreenVis" - rmin="RICHRMin" rmax1="RICHRMin+40*cm" rmax2="RICHRMin+80*cm" /> - <mirror zdiff="RICHDepth+7.0*cm" thickness="1*mm" material="PyrexGlass" vis="GrayVis"> - <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICHRMin+80*cm" phiw="59*degree" rotz="0*degree" /> - <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICHRMin+80*cm" phiw="59*degree" rotz="60*degree" /> - <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICHRMin+80*cm" phiw="59*degree" rotz="120*degree" /> - <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICHRMin+80*cm" phiw="59*degree" rotz="180*degree" /> - <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICHRMin+80*cm" phiw="59*degree" rotz="240*degree" /> - <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICHRMin+80*cm" phiw="59*degree" rotz="300*degree" /> + <tank + length="RICHDepth" + gas="N2cherenkov" + vis="GreenVis" + rmin="RICHRMin" + rmax1="RICH_rmax1" + rmax2="RICH_rmax2" /> + <comment> What are the following MCP-PMT parameters?</comment> + <mcppmt + z0="-20.0*cm" + rmin="RICH_rmax1" + rmax="RICH_rmax2" + rtol="1.0*cm" + vis="BlueVis" + module_size="10*cm" + module_gap="0.2*cm" + thickness="1.0*cm" + material="Quartz" /> + <mirror + z0="RICHLength - 40*cm" + thickness="1*mm" + material="PyrexGlass" + vis="GrayVis"> + <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICH_rmax1" phiw="59*degree" rotz="0*degree" /> + <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICH_rmax1" phiw="59*degree" rotz="60*degree" /> + <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICH_rmax1" phiw="59*degree" rotz="120*degree" /> + <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICH_rmax1" phiw="59*degree" rotz="180*degree" /> + <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICH_rmax1" phiw="59*degree" rotz="240*degree" /> + <slice focus="10*cm" curve="300*cm" rmin="RICHRMin" rmax="RICH_rmax1" phiw="59*degree" rotz="300*degree" /> </mirror> </detector> </detectors> diff --git a/compact/refdetector_defs.xml b/compact/refdetector_defs.xml deleted file mode 100644 index 067c46daf62dc40e69288dfaa7d55e0e408fab6d..0000000000000000000000000000000000000000 --- a/compact/refdetector_defs.xml +++ /dev/null @@ -1,11 +0,0 @@ - <!-- Define parameter --> - <define> - <constant name="world_side" value="50*m"/> - <constant name="world_x" value="world_side"/> - <constant name="world_y" value="world_side"/> - <constant name="world_z" value="world_side"/> - - <constant name="tracker_region_zmax" value="6 * m"/> - <constant name="tracker_region_rmax" value="6 * m"/> - - </define> diff --git a/compact/solenoid.xml b/compact/solenoid.xml index 42ec2920b5562da5ab695ae8e454dc39a8d027b4..1a7ddd8ddd540a1f43514dfa96cf2502f8f6cd94 100644 --- a/compact/solenoid.xml +++ b/compact/solenoid.xml @@ -79,7 +79,7 @@ inner_z="SolenoidBarrel_zmax + SolenoidEndPlateGapThickness" inner_r="SolenoidYokeEndcapP_rmin" outer_r="SolenoidBarrel_rmax"> - <slice material="Steel235" thickness="SolenoidYokeEndcapThickness/2.0" vis="SolenoidYokeVis" /> + <slice material="Steel235" thickness="SolenoidYokeEndcap_thickness/2.0" vis="SolenoidYokeVis" /> </layer> </detector> <!-- diff --git a/reference_detector.xml b/reference_detector.xml index c65d5a7d76568cc682b7c0525fbad6b7df19603d..6d46ffadf8cf6fa61388e2cfce0e109912e177ca 100644 --- a/reference_detector.xml +++ b/reference_detector.xml @@ -13,9 +13,9 @@ <define> <include ref="compact/definitions.xml" /> - <include ref="eic/eic_defs.xml" /> <include ref="ip6/ip6_defs.xml" /> <!-- + <include ref="eic/eic_defs.xml" /> --> </define> @@ -114,21 +114,20 @@ <include ref="reference_detector/vertex_tracker.xml"/> <include ref="compact/silicon_tracker.xml"/> --> - <include ref="compact/cb_CTD_Si.xml"/> <include ref="ip6/beampipe.xml"/> - <include ref="compact/ffi_ZDC.xml"/> <include ref="compact/solenoid.xml"/> <include ref="compact/ecal.xml"/> - <include ref="compact/hcal.xml"/> - <include ref="compact/forward_rich.xml"/> + <include ref="compact/cb_CTD_Si.xml"/> <include ref="compact/ce_mrich.xml"/> <include ref="compact/ce_GEM.xml"/> + <include ref="compact/ffi_ZDC.xml"/> + <!-- + <include ref="compact/forward_rich.xml"/> + <include ref="compact/hcal.xml"/> <include ref="compact/roman_pots.xml"/> --> <include ref="eic/forward_ion_beamline.xml"/> - <!-- - --> <detectors> </detectors> diff --git a/scripts/view1/generate_eps b/scripts/view1/generate_eps index c863fbaddfb46cc5d1342d0ca9eb2766b31ac3dd..aae587cbaccdc61e5c3564e159b5ec10bfbfd385 100755 --- a/scripts/view1/generate_eps +++ b/scripts/view1/generate_eps @@ -47,6 +47,7 @@ set -- "${POSITIONAL[@]}" # restore positional parameters # Side view dawncut 1 0 0 1 ${INPUT_FILE} ${FILE_TAG}_temp0.prim dawncut -1 0 0 1 ${FILE_TAG}_temp0.prim ${FILE_TAG}.prim +../../bin/dawn_tweak --mag 10 dawn -d ${FILE_TAG}.prim ps2pdf ${FILE_TAG}.eps ${FILE_TAG}_full.pdf gs -o ${FILE_TAG}.pdf -sDEVICE=pdfwrite \ @@ -59,7 +60,7 @@ pdftoppm ${FILE_TAG}.pdf ${FILE_TAG} -png -singlefile -cropbox # Top view dawncut 0 1 0 1 ${INPUT_FILE} ${FILE_TAG}_temp0.prim dawncut 0 -1 0 1 ${FILE_TAG}_temp0.prim ${FILE_TAG}.prim -../../bin/dawn_tweak --theta 270 +../../bin/dawn_tweak --theta 270 --mag 20 dawn -d ${FILE_TAG}.prim ps2pdf ${FILE_TAG}.eps ${FILE_TAG}_top_full.pdf gs -o ${FILE_TAG}_top.pdf -sDEVICE=pdfwrite \ diff --git a/src/EcalBarrel_geo.cpp b/src/EcalBarrel_geo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4f3862df8775f9daf15ce49a8e7e245a9b524c8f --- /dev/null +++ b/src/EcalBarrel_geo.cpp @@ -0,0 +1,164 @@ +//========================================================================== +// 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" +#include "XML/Layering.h" + +using namespace std; +using namespace dd4hep; +using namespace dd4hep::detail; + +static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens) { + static double tolerance = 0e0; + Layering layering (e); + xml_det_t x_det = e; + Material air = description.air(); + int det_id = x_det.id(); + string det_name = x_det.nameStr(); + xml_comp_t x_staves = x_det.staves(); + xml_comp_t x_dim = x_det.dimensions(); + int nsides = x_dim.numsides(); + double inner_r = x_dim.rmin(); + double dphi = (2*M_PI/nsides); + double hphi = dphi/2; + double mod_z = layering.totalThickness(); + double outer_r = inner_r + mod_z; + double totThick = mod_z; + double offset = x_det.attr<double>(_Unicode(offset)); + DetElement sdet (det_name,det_id); + Volume motherVol = description.pickMotherVolume(sdet); + PolyhedraRegular hedra (nsides,inner_r,inner_r+totThick+tolerance*2e0,x_dim.z()); + Volume envelope (det_name,hedra,air); + PlacedVolume env_phv = motherVol.placeVolume(envelope,Transform3D(Translation3D(0,0,offset)*RotationZ(M_PI/nsides))); + + env_phv.addPhysVolID("system",det_id); + env_phv.addPhysVolID("barrel",0); + sdet.setPlacement(env_phv); + + DetElement stave_det("stave0",det_id); + double dx = 0.0; //mod_z / std::sin(dphi); // dx per layer + + // Compute the top and bottom face measurements. + double trd_x2 = (2 * std::tan(hphi) * outer_r - dx)/2 - tolerance; + double trd_x1 = (2 * std::tan(hphi) * inner_r + dx)/2 - tolerance; + double trd_y1 = x_dim.z()/2 - tolerance; + double trd_y2 = trd_y1; + double trd_z = mod_z/2 - tolerance; + + // Create the trapezoid for the stave. + Trapezoid trd(trd_x1, // Outer side, i.e. the "short" X side. + trd_x2, // Inner side, i.e. the "long" X side. + trd_y1, // Corresponds to subdetector (or module) Z. + trd_y2, // + trd_z); // Thickness, in Y for top stave, when rotated. + + Volume mod_vol("stave",trd,air); + + sens.setType("calorimeter"); + { // ===== buildBarrelStave(description, sens, module_volume) ===== + // Parameters for computing the layer X dimension: + double stave_z = trd_y1; + double tan_hphi = std::tan(hphi); + double l_dim_x = trd_x1; // Starting X dimension for the layer. + double l_pos_z = -(layering.totalThickness() / 2); + + // Loop over the sets of layer elements in the detector. + int l_num = 1; + for(xml_coll_t li(x_det,_U(layer)); li; ++li) { + xml_comp_t x_layer = li; + int repeat = x_layer.repeat(); + // Loop over number of repeats for this layer. + for (int j=0; j<repeat; j++) { + string l_name = _toString(l_num,"layer%d"); + double l_thickness = layering.layer(l_num-1)->thickness(); // Layer's thickness. + + Position l_pos(0,0,l_pos_z+l_thickness/2); // Position of the layer. + Box l_box(l_dim_x-tolerance,stave_z-tolerance,l_thickness / 2-tolerance); + Volume l_vol(l_name,l_box,air); + DetElement layer(stave_det, l_name, det_id); + + // Loop over the sublayers or slices for this layer. + int s_num = 1; + double s_pos_z = -(l_thickness / 2); + for(xml_coll_t si(x_layer,_U(slice)); si; ++si) { + xml_comp_t x_slice = si; + string s_name = _toString(s_num,"slice%d"); + double s_thick = x_slice.thickness(); + Box s_box(l_dim_x-tolerance,stave_z-tolerance,s_thick / 2-tolerance); + Volume s_vol(s_name,s_box,description.material(x_slice.materialStr())); + DetElement slice(layer,s_name,det_id); + + if ( x_slice.isSensitive() ) { + s_vol.setSensitiveDetector(sens); + } + slice.setAttributes(description,s_vol,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr()); + + // Slice placement. + PlacedVolume slice_phv = l_vol.placeVolume(s_vol,Position(0,0,s_pos_z+s_thick/2)); + slice_phv.addPhysVolID("slice", s_num); + slice.setPlacement(slice_phv); + // Increment Z position of slice. + s_pos_z += s_thick; + + // Increment slice number. + ++s_num; + } + + // Set region, limitset, and vis of layer. + layer.setAttributes(description,l_vol,x_layer.regionStr(),x_layer.limitsStr(),x_layer.visStr()); + + PlacedVolume layer_phv = mod_vol.placeVolume(l_vol,l_pos); + layer_phv.addPhysVolID("layer", l_num); + layer.setPlacement(layer_phv); + // Increment to next layer Z position. + double xcut = l_thickness * tan_hphi; + l_dim_x += xcut; + l_pos_z += l_thickness; + ++l_num; + } + } + } + + // Set stave visualization. + if ( x_staves ) { + mod_vol.setVisAttributes(description.visAttributes(x_staves.visStr())); + } + // Phi start for a stave. + double phi = M_PI / nsides; + double mod_x_off = dx / 2; // Stave X offset, derived from the dx. + double mod_y_off = inner_r + mod_z/2; // Stave Y offset + + // Create nsides staves. + for (int i = 0; i < nsides; i++, phi -= dphi) { // i is module number + // Compute the stave position + double m_pos_x = mod_x_off * std::cos(phi) - mod_y_off * std::sin(phi); + double m_pos_y = mod_x_off * std::sin(phi) + mod_y_off * std::cos(phi); + Transform3D tr(RotationZYX(0,phi,M_PI*0.5),Translation3D(-m_pos_x,-m_pos_y,0)); + PlacedVolume pv = envelope.placeVolume(mod_vol,tr); + pv.addPhysVolID("system",det_id); + pv.addPhysVolID("barrel",0); + pv.addPhysVolID("module",i+1); + DetElement sd = i==0 ? stave_det : stave_det.clone(_toString(i,"stave%d")); + sd.setPlacement(pv); + sdet.add(sd); + } + + // Set envelope volume attributes. + envelope.setAttributes(description,x_det.regionStr(),x_det.limitsStr(),x_det.visStr()); + return sdet; +} + +DECLARE_DETELEMENT(refdet_EcalBarrel,create_detector) diff --git a/src/ForwardRICH_geo.cpp b/src/ForwardRICH_geo.cpp index 3dc6417ba4562a43e22227d8f4a7e9ec969c3bd1..b88bcd7c5ccb16799b2893e75898f53566ad81e3 100644 --- a/src/ForwardRICH_geo.cpp +++ b/src/ForwardRICH_geo.cpp @@ -36,17 +36,20 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec xml::Component rads = detElem.child(_Unicode(radiator)); xml::Component mir = detElem.child(_Unicode(mirror)); xml::Component mcp = detElem.child(_Unicode(mcppmt)); + xml::Component tank = detElem.child(_Unicode(tank)); // dimensions double z0 = dims.z0(); double length = dims.length(); double rmin = dims.rmin(); + double rmax0 = dims.attr<double>(_Unicode(rmax0)); double rmax1 = dims.attr<double>(_Unicode(rmax1)); double rmax2 = dims.attr<double>(_Unicode(rmax2)); + double snout_length = dims.attr<double>(_Unicode(snout_length)); // mirror setting auto mThick = mir.thickness(); - auto mirZ = mir.attr<double>(_Unicode(zdiff)); + auto mirZ = mir.attr<double>(_Unicode(z0)); // mcppmt setting auto pRmin = mcp.rmin(); @@ -55,27 +58,32 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec auto pSize = mcp.attr<double>(_Unicode(module_size)); auto pGap = mcp.attr<double>(_Unicode(module_gap)); auto pTol = mcp.attr<double>(_Unicode(rtol)); - auto pZ = mcp.attr<double>(_Unicode(zdiff)); + auto pZ = mcp.attr<double>(_Unicode(z0)); + + // tank parameters + double tank_length = length - snout_length; // materials auto mirMat = desc.material(mir.materialStr()); auto gasMat = desc.material(rads.materialStr()); auto mcpMat = desc.material(mcp.materialStr()); + double front_offset = snout_length+tank_length/2.0; + // constants - auto richCenterAngle = std::atan((rmin + (rmax2 - rmin)/2.)/mirZ); + auto richCenterAngle = std::atan((rmin + (rmax1 - rmin)/2.)/(front_offset+mirZ)); //std::cout << richCenterAngle*180./M_PI << std::endl; // an envelope for the detector // use a complicated shape to avoid conflict with the other parts // cone for radiator and the first set of mirrors double halfLength = length/2.; - Cone env1(halfLength, rmin, rmax1, rmin, rmax2); + Cone env1(snout_length/2.0, rmin, rmax0, rmin, rmax1); // envelope for detection plane // Cone env2(halfLength - pZ/2., rmin, pRmax, rmin, rmax2); - Tube env2(rmin, pRmax + pTol + pGap + 1.0*cm, (length - pZ)/2., 0., 2*M_PI); + Tube env2(rmin, pRmax + pTol + pGap + 1.0*cm, tank_length/2., 0., 2*M_PI); - UnionSolid envShape(env1, env2, Position(0., 0., pZ)); + UnionSolid envShape(env2, env1, Position(0., 0., -tank_length/2.-snout_length/2)); Volume envVol(detName + "_envelope", envShape, gasMat); envVol.setVisAttributes(desc.visAttributes(detElem.visStr())); @@ -112,7 +120,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec double rotY = -std::asin(focus/curve); mirVol.setSolid(Sphere(curve, curve + mThick, mTheta1, mTheta2, 0., wphi)); // action is in a reverse order - Transform3D tr = Translation3D(0., 0., mirZ - halfLength) // move for z position + Transform3D tr = Translation3D(0., 0., mirZ - front_offset) // move for z position * RotationZ(rotZ) // rotate phi angle * RotationY(rotY) // rotate for focus point * RotationX(180*degree) @@ -122,7 +130,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec // plane mirror } else { mirVol.setSolid(Tube(mRmin, mRmax, mThick/2.0, 0., wphi)); - Transform3D tr = Translation3D(0., 0., mirZ - halfLength) // move for z position + Transform3D tr = Translation3D(0., 0., mirZ - front_offset) // move for z position * RotationZ(rotZ) // rotate phi angle * RotationZ(-wphi/2.); // center phi angle to 0. (-wphi/2., wphi/2.) mirPV = envVol.placeVolume(mirVol, tr); @@ -152,11 +160,11 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec // photo-detector plane envelope for (size_t ipd = 0; ipd < 6; ++ipd) { - double phmin = -M_PI/6.; - double phmax = M_PI/6.; + double phmin = -M_PI/6.5; // added 0.5 to make it smaller + double phmax = M_PI/6.5; Tube pdEnvShape(pRmin - pTol - pGap, pRmax + pTol + pGap, pThick/2.0 + 0.1*cm, phmin, phmax); Volume pdVol("pd_envelope", pdEnvShape, desc.material("AirOptical")); - auto points = ref::utils::fillSquares({0., 0.}, pSize + pGap, pRmin - pTol - pGap, pRmax + pTol + pGap, phmin, phmax); + auto points = ref::utils::fillSquares({0., 0.}, pSize + pGap, pRmin + pTol + pGap, pRmax + pTol + pGap, phmin, phmax); for (size_t i = 0; i < points.size(); ++i) { auto pt = points[i]; auto mcpPV = pdVol.placeVolume(mcpVol, Position(pt.x(), pt.y(), 0.)); @@ -164,7 +172,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec DetElement mcpDE(det, Form("MCPPMT_DE%d_%d", ipd + 1, i + 1), i + 1); mcpDE.setPlacement(mcpPV); } - Transform3D tr = Translation3D(0., 0., -halfLength + pZ + pThick/2.0) // move for z position + Transform3D tr = Translation3D(0., 0., -front_offset + pZ + pThick/2.0) // move for z position * RotationZ(ipd*M_PI/3.) // rotate phi angle * RotationY(-richCenterAngle); // rotate to perpendicular position auto pdPV = envVol.placeVolume(pdVol, tr); diff --git a/src/PolyhedraEndcapCalorimeter2_geo.cpp b/src/PolyhedraEndcapCalorimeter2_geo.cpp index 3469a1c654074638e943b4b84442b5cfa4ef3a2b..304961cfc7937725943e934f36c6bb8ce89ccf8c 100644 --- a/src/PolyhedraEndcapCalorimeter2_geo.cpp +++ b/src/PolyhedraEndcapCalorimeter2_geo.cpp @@ -37,6 +37,11 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s 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; @@ -44,55 +49,59 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s endcapVol.setAttributes(description, x_det.regionStr(), x_det.limitsStr(), x_det.visStr()); for (xml_coll_t xc(x_det, _U(layer)); xc; ++xc) { - xml_comp_t x_layer = xc; - double l_thick = layering.layer(l_num - 1)->thickness(); - 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; + 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; + double z_pos = zmin + totalThickness / 2; PlacedVolume pv; // Reflect it. Assembly assembly(det_name); diff --git a/src/TestDetector.cpp b/src/TestDetector.cpp deleted file mode 100644 index 5669184b4de5cdaecc87ee6d8bb29df7ef910c33..0000000000000000000000000000000000000000 --- a/src/TestDetector.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include <XML/Helper.h> - -using namespace dd4hep; - -static Ref_t createDetector(Detector& desc, xml_h handle, SensitiveDetector sens) { - xml::DetElement detElem = handle; - std::string detName = detElem.nameStr(); - int detID = detElem.id(); - - xml::Component dims = detElem.dimensions(); - double rInner = dims.inner_radius(); - double rMin = dims.rmin(); - double thickness = dims.thickness(); - double innerZ = dims.inner_z(); - double angle = dims.angle(); - - Material mat = desc.material(detElem.materialStr()); - - Tube outerTubeShape(rMin, rInner + thickness, innerZ + thickness); - Tube innerTubeShape(0, rInner, innerZ); - SubtractionSolid unchamferedShape(outerTubeShape, innerTubeShape); - Cone chamferShape(thickness, 0, rMin, 0, rMin + 2 * tan(angle) * thickness); - SubtractionSolid detShape(unchamferedShape, chamferShape, Position(0, 0, innerZ + thickness)); - Volume detVol(detName, detShape, mat); - - detVol.setVisAttributes(desc.visAttributes(detElem.visStr())); - - DetElement det(detName, detID); - Volume motherVol = desc.pickMotherVolume(det); - PlacedVolume detPV = motherVol.placeVolume(detVol); - det.setPlacement(detPV); - return det; -} - -// clang-format off -DECLARE_DETELEMENT(TestDetector, createDetector) diff --git a/src/cb_CTD_Si.cpp b/src/cb_CTD_Si.cpp index 4aed32b4ac10437149b7555c171b3f2253c9fa31..a6a683eb0f4e1aff231e5a672ecd1f17c5f3e755 100644 --- a/src/cb_CTD_Si.cpp +++ b/src/cb_CTD_Si.cpp @@ -1,4 +1,9 @@ #include <XML/Helper.h> +#include "DDRec/Surface.h" +#include "DDRec/DetectorData.h" +#include "DD4hep/OpticalSurfaces.h" +#include "DD4hep/DetFactoryHelper.h" +#include "DD4hep/Printout.h" ////////////////////////////////// // Central Barrel Tracker Silicon ////////////////////////////////// diff --git a/src/cb_Solenoid.cpp b/src/cb_Solenoid.cpp deleted file mode 100644 index 623c52041cc5a6c550fd4151f1bf2f47ff792aba..0000000000000000000000000000000000000000 --- a/src/cb_Solenoid.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include <XML/Helper.h> -/////////////////////////// -// Central Barrel Solenoid -/////////////////////////// - -using namespace dd4hep; - -static Ref_t createDetector(Detector& desc, xml_h handle, SensitiveDetector sens) -{ - xml::DetElement detElem = handle; - std::string detName = detElem.nameStr(); - int detID = detElem.id(); - - xml::Component dims = detElem.dimensions(); - double SizeZ = dims.z(); // Size in Z direction - double ROut = dims.rmax(); // Outer diameter - double RIn = dims.rmin(); // Inner diameter - double ShiftZ = dims.delta(); - Material mat = desc.material(detElem.materialStr()); - - Tube cb_Solenoid_GVol_Solid(RIn, ROut, SizeZ / 2., 0., 360 * deg); - Volume detVol("cb_Solenoid_GVol_Logic", cb_Solenoid_GVol_Solid, mat); - - detVol.setVisAttributes(desc.visAttributes(detElem.visStr())); - - DetElement det(detName, detID); - Volume motherVol = desc.pickMotherVolume(det); - Transform3D tr(RotationZYX(0., 0., 0.), Position(0., 0., ShiftZ)); - PlacedVolume detPV = motherVol.placeVolume(detVol, tr); - det.setPlacement(detPV); - return det; -} - -// clang-format off -DECLARE_DETELEMENT(cb_Solenoid, createDetector) diff --git a/src/ce_GEM.cpp b/src/ce_GEM.cpp index 92315945fb6edfe117b2e846c984a879fa0fbe61..24e4bff197a798de69b1b0d07d43713225aa4f78 100644 --- a/src/ce_GEM.cpp +++ b/src/ce_GEM.cpp @@ -1,3 +1,8 @@ +#include "DDRec/Surface.h" +#include "DDRec/DetectorData.h" +#include "DD4hep/OpticalSurfaces.h" +#include "DD4hep/DetFactoryHelper.h" +#include "DD4hep/Printout.h" #include <XML/Helper.h> ////////////////////////////////// // Electron Endcap GEM Tracking diff --git a/src/ffi_ZDC.cpp b/src/ffi_ZDC.cpp index 61ca838b5a701dde41475fb106b6756a3d7c291a..43c31e31fd77a2cc44f9e635b90215c736a75ab3 100644 --- a/src/ffi_ZDC.cpp +++ b/src/ffi_ZDC.cpp @@ -1,3 +1,8 @@ +#include "DDRec/Surface.h" +#include "DDRec/DetectorData.h" +#include "DD4hep/OpticalSurfaces.h" +#include "DD4hep/DetFactoryHelper.h" +#include "DD4hep/Printout.h" #include <XML/Helper.h> /////////////////////////////////////////// // Far Forward Ion Zero Degree Calorimeter