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

modified: compact/definitions.xml

	modified:   compact/definitions.xml

	modified:   compact/definitions.xml
	modified:   compact/ecal.xml

	modified:   compact/definitions.xml

	modified:   compact/definitions.xml
	modified:   compact/ecal.xml

	modified:   compact/definitions.xml

	modified:   CMakeLists.txt
	modified:   compact/definitions.xml
	modified:   compact/ecal.xml
parent 64fcc24a
Branches
Tags
No related merge requests found
......@@ -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
......
......@@ -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>
......
......@@ -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>
......
<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="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="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="SolenoidCoil_length" value="SolenoidCoil_zmax*2.0"/>
<constant name="SolenoidThickness" value="Solenoid_rmax - Solenoid_rmin"/>
<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="EcalBarrel_rmin" value="SiliconTrackerOuterRadius + BarrelPIDThickness + 3.0 * cm"/>
<constant name="HcalBarrel_rmax" value="Solenoid_rmin - 5.0 *cm "/>
<constant name="AvailTotalBarrelCalorimetryThickness" 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="EcalBarrelAvailTotalThickness" value="AvailTotalBarrelCalorimetryThickness * CalBarrelDivider"/>
<constant name="HcalBarrelAvailTotalThickness" value="AvailTotalBarrelCalorimetryThickness * (1.0 - CalBarrelDivider)"/>
<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="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="EcalBarrelLength" value="SiliconTrackerOuterBarrelLength+50.0*cm"/>
<constant name="EcalEndcap_zmin" value="EcalBarrelLength/2.0"/>
<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="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="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,6 +403,14 @@
-------------------------
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"/>
......@@ -387,31 +424,43 @@
<constant name="EcalThickTungstenThickness" value="5.00 * mm" />
<comment> Layer Thickness </comment>
<constant name="EcalFirstLayerThickness"
<constant name="EcalLayer1_thickness"
value="EcalSiliconThickness + EcalCopperThickness + EcalKaptonThickness + EcalAir1Thickness"/>
<constant name="EcalThinOneLayerThickness"
<constant name="EcalLayer2_thickness"
value="EcalThinTungstenThickness + EcalAir2Thickness + EcalSiliconThickness + EcalCopperThickness + EcalKaptonThickness + EcalAir1Thickness"/>
<constant name="EcalThickOneLayerThickness"
<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="RICHZMin" value="SiliconTrackerOuterBarrel_zmax + 1 * cm"/>
<constant name="RICHRMin" value="15 * cm"/>
<constant name="RICHRMax" value="60 * cm"/>
<constant name="RICHDepth" value="1 * m"/>
<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>
--------------------------
......@@ -530,8 +572,8 @@
</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_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"/>
......
......@@ -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>
......@@ -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>
......
<!-- 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>
......@@ -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>
<!--
......
......@@ -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>
......
......@@ -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 \
......
//==========================================================================
// 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)
......@@ -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);
......
......@@ -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,8 +49,11 @@ 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) {
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);
......@@ -73,7 +81,8 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
s_num++;
}
l_vol.setVisAttributes(description.visAttributes(x_layer.visStr()));
if (l_repeat <= 0) throw std::runtime_error(x_det.nameStr() + "> Invalid repeat value");
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;
......
#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)
#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
//////////////////////////////////
......
#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)
#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
......
#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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment