Skip to content
Snippets Groups Projects
Commit 70fee922 authored by Christopher Dilks's avatar Christopher Dilks Committed by Sylvester Joosten
Browse files

implement proximity focusing RICH for e-endcap

parent 42346a74
No related branches found
No related tags found
No related merge requests found
......@@ -118,8 +118,10 @@ dump_geometry:
## disable fibers in SciFi endcap ECAL for better performance
## not needed, as we have no fibers in the current setup
#- sed -i '/<fiber/,+4d' ${DETECTOR_PATH}/compact/ci_ecal_scfi.xml
## subsystem views
## finally: remove tracking subassemblies as they lower the display priority
## of some tracking detectors
- |
sed -i -e '/<detectors>/,/<\/detectors>/d' ${DETECTOR_PATH}/compact/tracking_config*.xml
mv ${DETECTOR_PATH}/compact/display_geoviewer.xml ${DETECTOR_PATH}/compact/display.xml
mv ${DETECTOR_PATH}/compact/colors_geoviewer.xml ${DETECTOR_PATH}/compact/colors.xml
for xml in ${DETECTOR_PATH}/compact/subsystem_views/*.xml; do
......@@ -196,6 +198,8 @@ overlap_check_tgeo:
needs:
- ["common:detector"]
script:
## disable fibers in ECAL for normal overlap check
- sed -i '/<fiber/,+6d' ${DETECTOR_PATH}/compact/ecal_barrel_interlayers.xml
- checkOverlaps -c ${DETECTOR_PATH}/athena.xml | tee doc/overlap_check_tgeo.out
- echo "$(cat doc/overlap_check_tgeo.out | grep ovlp | wc -l) overlaps..."
- if [[ "$(cat doc/overlap_check_tgeo.out | grep ovlp | wc -l)" -gt "0" ]] ; then echo "Overlaps exist!" && false ; fi
......
......@@ -34,6 +34,7 @@ dd4hep_add_plugin(${a_lib_name} SOURCES
src/CylinderTrackerBarrel_geo.cpp
src/DIRC_geo.cpp
src/DRich_geo.cpp
src/ERich_geo.cpp
src/FieldMapBrBz.cpp
src/GaseousRICH_geo.cpp
src/GeometryHelpers.cpp
......
......@@ -2,15 +2,25 @@
<lccdd>
<comment>
Master tracker parameters
Central Tracking region consists of:
|----------------------------------------------------------------------------|
| | OuterBarrel | |
| |--------------------------------------------------------| |
| | | MedialBarrel | | |
| | |------------------------------------| | |
| | | | InnerBarrel | | | |
| | | |----------------| | | |
| Outer | Medial | Inner | Vertex Tracker | Inner | Medial | Outer |
| EndcapN | EndcapN | EndcapN | Vertex Tracker | EndcapP | EndcapP | EndcapP |
|----------------------------------------------------------------------------|
^ ^
CentralTrackingRegionN_zmax CentralTrackingRegionP_zmax
</comment>
<define>
<comment> Main diagonal direction for barrel/endcap transitions </comment>
<constant name="TrackerMainDiagonal_tantheta" value="Eta1_1_tantheta"/>
<comment> Outer tracker endcap radial limits (somewhat adjusted in the parametrization).</comment>
<constant name="TrackerEndcapP_tanthetamax" value="Eta3_8_tantheta"/>
<constant name="TrackerEndcapN_tanthetamax" value="Eta4_0_tantheta"/>
<constant name="TrackerForward_tanthetamax" value="Eta3_5_tantheta"/>
<constant name="TrackerMainDiagonal_tan" value="Eta1_1_tan"/>
<comment> Inner tracker setup </comment>
<constant name="InnerTrackerBarrel_rmin" value="13.38*cm"/>
......@@ -137,11 +147,11 @@ total X0 0.24% per disk layer (4 sectors per disk):
<constant name="InnerTrackerBarrelCone_z" value="(InnerTrackerBarrelCone_zmax + InnerTrackerBarrelCone_zmin)/2" />
<constant name="InnerTrackerBarrelCone_thickness" value="SiTrackerSupportConeCF_thickness + SiTrackerServiceConeAl_thickness" />
<comment> Shorten Module (with non-zero thickness!) to avoid overlaps with support cone</comment>
<constant name="InnerTrackerBarrelMod1_length" value="2 * InnerTrackerBarrelMod1_rmin / TrackerMainDiagonal_tantheta - 0.5*cm - 2. * InnerTrackerBarrelCone_thickness" />
<constant name="InnerTrackerBarrelMod2_length" value="2 * InnerTrackerBarrelMod2_rmin / TrackerMainDiagonal_tantheta - 0.5*cm - 2. * InnerTrackerBarrelCone_thickness" />
<constant name="InnerTrackerBarrelServiceCone_rmin1" value="InnerTrackerBarrelCone_zmin * TrackerMainDiagonal_tantheta" />
<constant name="InnerTrackerBarrelMod1_length" value="2 * InnerTrackerBarrelMod1_rmin / TrackerMainDiagonal_tan - 0.5*cm - 2. * InnerTrackerBarrelCone_thickness" />
<constant name="InnerTrackerBarrelMod2_length" value="2 * InnerTrackerBarrelMod2_rmin / TrackerMainDiagonal_tan - 0.5*cm - 2. * InnerTrackerBarrelCone_thickness" />
<constant name="InnerTrackerBarrelServiceCone_rmin1" value="InnerTrackerBarrelCone_zmin * TrackerMainDiagonal_tan" />
<constant name="InnerTrackerBarrelServiceCone_rmax1" value="InnerTrackerBarrelServiceCone_rmin1 + SiTrackerServiceConeAl_thickness" />
<constant name="InnerTrackerBarrelServiceCone_rmin2" value="InnerTrackerBarrelCone_zmax * TrackerMainDiagonal_tantheta" />
<constant name="InnerTrackerBarrelServiceCone_rmin2" value="InnerTrackerBarrelCone_zmax * TrackerMainDiagonal_tan" />
<constant name="InnerTrackerBarrelServiceCone_rmax2" value="InnerTrackerBarrelServiceCone_rmin2 + SiTrackerServiceConeAl_thickness" />
<constant name="InnerTrackerBarrelSupportCone_rmin1" value="InnerTrackerBarrelServiceCone_rmax1" />
<constant name="InnerTrackerBarrelSupportCone_rmax1" value="InnerTrackerBarrelSupportCone_rmin1 + SiTrackerSupportConeCF_thickness" />
......@@ -274,14 +284,14 @@ total X0 0.24% per disk layer (4 sectors per disk):
<comment> Inner Si endcap setup </comment>
<constant name="InnerTrackerEndcapMod1_zmin" value="InnerTrackerEndcap_zmin" />
<constant name="InnerTrackerEndcapMod1_rmin" value="InnerTrackerEndcap_rmin" />
<constant name="InnerTrackerEndcapMod1_rmax" value="min(InnerTrackerEndcapMod1_zmin * TrackerMainDiagonal_tantheta * 0.995, SiTrackerCyl_rmin)" />
<constant name="InnerTrackerEndcapMod1_rmax" value="min(InnerTrackerEndcapMod1_zmin * TrackerMainDiagonal_tan * 0.995, SiTrackerCyl_rmin)" />
<constant name="InnerTrackerEndcapMod1_x1" value="2 * InnerTrackerEndcapMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
<constant name="InnerTrackerEndcapMod1_x2" value="2 * InnerTrackerEndcapMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
<constant name="InnerTrackerEndcapMod1_y" value="InnerTrackerEndcapMod1_rmax * cos(SiTrackerEndcapMod_angle/2) - InnerTrackerEndcapMod1_rmin" />
<constant name="InnerTrackerEndcapMod2_zmin" value="InnerTrackerEndcapMod1_zmin + 1 * InnerTrackerEndcap_offset" />
<constant name="InnerTrackerEndcapMod2_rmin" value="InnerTrackerEndcap_rmin" />
<constant name="InnerTrackerEndcapMod2_rmax" value="min(InnerTrackerEndcapMod2_zmin * TrackerMainDiagonal_tantheta * 0.995, SiTrackerCyl_rmin)" />
<constant name="InnerTrackerEndcapMod2_rmax" value="min(InnerTrackerEndcapMod2_zmin * TrackerMainDiagonal_tan * 0.995, SiTrackerCyl_rmin)" />
<constant name="InnerTrackerEndcapMod2_x1" value="2 * InnerTrackerEndcapMod2_rmin * sin(SiTrackerEndcapMod_angle/2)" />
<constant name="InnerTrackerEndcapMod2_x2" value="2 * InnerTrackerEndcapMod2_rmax * sin(SiTrackerEndcapMod_angle/2)" />
<constant name="InnerTrackerEndcapMod2_y" value="InnerTrackerEndcapMod2_rmax * cos(SiTrackerEndcapMod_angle/2) - InnerTrackerEndcapMod2_rmin" />
......@@ -294,11 +304,11 @@ total X0 0.24% per disk layer (4 sectors per disk):
<constant name="InnerTrackerEndcapLayer2_zmin" value="InnerTrackerEndcapMod2_zmin - SiTrackerEndcapLayer_thickness/2" />
<constant name="InnerTrackerEndcapCone_zmin" value="InnerTrackerBarrelCone_zmax" />
<constant name="InnerTrackerEndcapServiceCone_rmin1" value="InnerTrackerEndcapCone_zmin * TrackerMainDiagonal_tantheta" />
<constant name="InnerTrackerEndcapServiceCone_rmin1" value="InnerTrackerEndcapCone_zmin * TrackerMainDiagonal_tan" />
<constant name="InnerTrackerEndcapServiceCone_rmax1" value="InnerTrackerEndcapServiceCone_rmin1 + SiTrackerServiceConeAl_thickness" />
<constant name="InnerTrackerEndcapServiceCone_rmin2" value="SiTrackerServiceCyl_rmin" />
<constant name="InnerTrackerEndcapServiceCone_rmax2" value="SiTrackerServiceCyl_rmax" />
<constant name="InnerTrackerEndcapCone_zmax" value="InnerTrackerEndcapServiceCone_rmin2 / TrackerMainDiagonal_tantheta" />
<constant name="InnerTrackerEndcapCone_zmax" value="InnerTrackerEndcapServiceCone_rmin2 / TrackerMainDiagonal_tan" />
<constant name="InnerTrackerEndcapCone_z" value="(InnerTrackerEndcapCone_zmax + InnerTrackerEndcapCone_zmin)/2" />
<constant name="InnerTrackerEndcapCone_length" value="InnerTrackerEndcapCone_zmax - InnerTrackerEndcapCone_zmin" />
<constant name="InnerTrackerEndcapSupportCone_rmin1" value="InnerTrackerEndcapServiceCone_rmax1" />
......@@ -307,7 +317,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
<constant name="InnerTrackerEndcapSupportCone_rmax2" value="SiTrackerSupportCyl_rmax" />
<comment> The tracker endcap ends at the same place as the medial tracker barrel that sits around it </comment>
<constant name="InnerTrackerEndcap_zmax" value="MedialTrackerBarrel_rmin / TrackerMainDiagonal_tantheta" />
<constant name="InnerTrackerEndcap_zmax" value="MedialTrackerBarrel_rmin / TrackerMainDiagonal_tan" />
<constant name="InnerTrackerEndcapCyl_zmin" value="InnerTrackerEndcapCone_zmax" />
<constant name="InnerTrackerEndcapCyl_zmax" value="InnerTrackerEndcap_zmax" />
<constant name="InnerTrackerEndcapCyl_z" value="(InnerTrackerEndcapCyl_zmin + InnerTrackerEndcapCyl_zmax)/2" />
......@@ -569,7 +579,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
<comment> Medial Si endcap setup </comment>
<constant name="MedialTrackerEndcapPMod1_zmin" value="MedialTrackerEndcap_zmin" />
<constant name="MedialTrackerEndcapPMod1_rmin" value="MedialTrackerEndcapP_rmin" />
<constant name="MedialTrackerEndcapPMod1_rmax" value="min(MedialTrackerEndcapPMod1_zmin * TrackerMainDiagonal_tantheta * 0.995, SiTrackerCyl_rmin)" />
<constant name="MedialTrackerEndcapPMod1_rmax" value="min(MedialTrackerEndcapPMod1_zmin * TrackerMainDiagonal_tan * 0.995, SiTrackerCyl_rmin)" />
<constant name="MedialTrackerEndcapPMod1_x1" value="2 * MedialTrackerEndcapPMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
<constant name="MedialTrackerEndcapPMod1_x2" value="2 * MedialTrackerEndcapPMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
<constant name="MedialTrackerEndcapPMod1_y" value="MedialTrackerEndcapPMod1_rmax * cos(SiTrackerEndcapMod_angle/2) - MedialTrackerEndcapPMod1_rmin" />
......@@ -580,7 +590,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
<constant name="MedialTrackerEndcapNMod1_zmin" value="MedialTrackerEndcap_zmin" />
<constant name="MedialTrackerEndcapNMod1_rmin" value="MedialTrackerEndcapN_rmin" />
<constant name="MedialTrackerEndcapNMod1_rmax" value="min(MedialTrackerEndcapNMod1_zmin * TrackerMainDiagonal_tantheta * 0.995, SiTrackerCyl_rmin)" />
<constant name="MedialTrackerEndcapNMod1_rmax" value="min(MedialTrackerEndcapNMod1_zmin * TrackerMainDiagonal_tan * 0.995, SiTrackerCyl_rmin)" />
<constant name="MedialTrackerEndcapNMod1_x1" value="2 * MedialTrackerEndcapNMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
<constant name="MedialTrackerEndcapNMod1_x2" value="2 * MedialTrackerEndcapNMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
<constant name="MedialTrackerEndcapNMod1_y" value="MedialTrackerEndcapNMod1_rmax * cos(SiTrackerEndcapMod_angle/2) - MedialTrackerEndcapNMod1_rmin" />
......@@ -590,7 +600,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
<constant name="MedialTrackerEndcapNLayer1_zmin" value="MedialTrackerEndcapNMod1_zmin - SiTrackerEndcapLayer_thickness/2" />
<comment> The tracker endcap ends at the same place as the outer tracker barrel that sits around it </comment>
<constant name="MedialTrackerEndcap_zmax" value="OuterTrackerBarrel_rmin / TrackerMainDiagonal_tantheta" />
<constant name="MedialTrackerEndcap_zmax" value="OuterTrackerBarrel_rmin / TrackerMainDiagonal_tan" />
<constant name="MedialTrackerEndcapCyl_zmin" value="InnerTrackerEndcap_zmax" />
<constant name="MedialTrackerEndcapCyl_zmax" value="MedialTrackerEndcap_zmax" />
<constant name="MedialTrackerEndcapCyl_z" value="(MedialTrackerEndcapCyl_zmin + MedialTrackerEndcapCyl_zmax)/2" />
......@@ -766,7 +776,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
<define>
<comment> Positive disks </comment>
<constant name="OuterTrackerEndcapPMod1_zmin" value="OuterTrackerEndcapP_zmin" />
<constant name="OuterTrackerEndcapPMod1_rmin" value="OuterTrackerEndcapPMod1_zmin * TrackerEndcapP_tanthetamax * 1.07" />
<constant name="OuterTrackerEndcapPMod1_rmin" value="OuterTrackerEndcapPMod1_zmin * CentralTrackingRegionP_tan * 0.99" />
<constant name="OuterTrackerEndcapPMod1_rmax" value="SiTrackerCyl_rmin" />
<constant name="OuterTrackerEndcapPMod1_x1" value="2 * OuterTrackerEndcapPMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
<constant name="OuterTrackerEndcapPMod1_x2" value="2 * OuterTrackerEndcapPMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
......@@ -776,7 +786,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
<constant name="OuterTrackerEndcapPLayer1_zmin" value="OuterTrackerEndcapPMod1_zmin - SiTrackerEndcapLayer_thickness/2" />
<constant name="OuterTrackerEndcapPMod2_zmin" value="OuterTrackerEndcapP_zmin + 1 * OuterTrackerEndcapP_offset" />
<constant name="OuterTrackerEndcapPMod2_rmin" value="OuterTrackerEndcapPMod2_zmin * TrackerEndcapP_tanthetamax * 1.08" />
<constant name="OuterTrackerEndcapPMod2_rmin" value="OuterTrackerEndcapPMod2_zmin * CentralTrackingRegionP_tan * 0.99" />
<constant name="OuterTrackerEndcapPMod2_rmax" value="SiTrackerCyl_rmin" />
<constant name="OuterTrackerEndcapPMod2_x1" value="2 * OuterTrackerEndcapPMod2_rmin * sin(SiTrackerEndcapMod_angle/2)" />
<constant name="OuterTrackerEndcapPMod2_x2" value="2 * OuterTrackerEndcapPMod2_rmax * sin(SiTrackerEndcapMod_angle/2)" />
......@@ -786,7 +796,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
<constant name="OuterTrackerEndcapPLayer2_zmin" value="OuterTrackerEndcapPMod2_zmin - SiTrackerEndcapLayer_thickness/2" />
<constant name="OuterTrackerEndcapPMod3_zmin" value="OuterTrackerEndcapP_zmin + 2 * OuterTrackerEndcapP_offset" />
<constant name="OuterTrackerEndcapPMod3_rmin" value="OuterTrackerEndcapPMod3_zmin * TrackerEndcapP_tanthetamax * 1.09" />
<constant name="OuterTrackerEndcapPMod3_rmin" value="OuterTrackerEndcapPMod3_zmin * CentralTrackingRegionP_tan * 1.00" />
<constant name="OuterTrackerEndcapPMod3_rmax" value="SiTrackerCyl_rmin" />
<constant name="OuterTrackerEndcapPMod3_x1" value="2 * OuterTrackerEndcapPMod3_rmin * sin(SiTrackerEndcapMod_angle/2)" />
<constant name="OuterTrackerEndcapPMod3_x2" value="2 * OuterTrackerEndcapPMod3_rmax * sin(SiTrackerEndcapMod_angle/2)" />
......@@ -804,7 +814,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
<comment> Negative disks </comment>
<constant name="OuterTrackerEndcapNMod1_zmin" value="OuterTrackerEndcapN_zmin" />
<constant name="OuterTrackerEndcapNMod1_rmin" value="OuterTrackerEndcapNMod1_zmin * TrackerEndcapN_tanthetamax * 0.99" />
<constant name="OuterTrackerEndcapNMod1_rmin" value="OuterTrackerEndcapNMod1_zmin * CentralTrackingRegionN_tan * 1.00" />
<constant name="OuterTrackerEndcapNMod1_rmax" value="SiTrackerCyl_rmin" />
<constant name="OuterTrackerEndcapNMod1_x1" value="2 * OuterTrackerEndcapNMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
<constant name="OuterTrackerEndcapNMod1_x2" value="2 * OuterTrackerEndcapNMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
......@@ -814,7 +824,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
<constant name="OuterTrackerEndcapNLayer1_zmin" value="OuterTrackerEndcapNMod1_zmin - SiTrackerEndcapLayer_thickness/2" />
<constant name="OuterTrackerEndcapNMod2_zmin" value="OuterTrackerEndcapN_zmin + 1 * OuterTrackerEndcapN_offset" />
<constant name="OuterTrackerEndcapNMod2_rmin" value="OuterTrackerEndcapNMod2_zmin * TrackerEndcapN_tanthetamax * 0.98" />
<constant name="OuterTrackerEndcapNMod2_rmin" value="OuterTrackerEndcapNMod2_zmin * CentralTrackingRegionN_tan * 1.00" />
<constant name="OuterTrackerEndcapNMod2_rmax" value="SiTrackerCyl_rmin" />
<constant name="OuterTrackerEndcapNMod2_x1" value="2 * OuterTrackerEndcapNMod2_rmin * sin(SiTrackerEndcapMod_angle/2)" />
<constant name="OuterTrackerEndcapNMod2_x2" value="2 * OuterTrackerEndcapNMod2_rmax * sin(SiTrackerEndcapMod_angle/2)" />
......@@ -1022,14 +1032,14 @@ total X0 0.24% per disk layer (4 sectors per disk):
<constant name="GEMEndcapPMod3_zmin" value="GEMEndcapPDisk3_zmin" />
<constant name="GEMEndcapPLayer3_zmin" value="GEMEndcapPMod3_zmin - GEMEndcapLayer_thickness/2" />
<constant name="GEMEndcapLargeModBotFrame_rmin" value="GEMEndcapPMod3_zmin * TrackerForward_tanthetamax" />
<constant name="GEMEndcapLargeModBotFrame_rmin" value="GEMEndcapPMod3_zmin * ForwardTrackingRegion_tan" />
<constant name="GEMEndcapLargeModBotFrame_y" value="GEMFrameBotEdge_width" />
<constant name="GEMEndcapLargeModBotFrame_rmax" value="(GEMEndcapLargeModBotFrame_rmin + GEMEndcapLargeModBotFrame_y)/cos(GEMEndcapMod_angle/2)" />
<constant name="GEMEndcapLargeModBotFrame_x1" value="2 * GEMEndcapLargeModBotFrame_rmin * sin(GEMEndcapMod_angle/2)" />
<constant name="GEMEndcapLargeModBotFrame_x2" value="2 * GEMEndcapLargeModBotFrame_rmax * sin(GEMEndcapMod_angle/2)" />
<constant name="GEMEndcapLargeMod_rmin" value="GEMEndcapPMod3_zmin * TrackerForward_tanthetamax + GEMFrameBotEdge_width" />
<constant name="GEMEndcapLargeMod_rmin" value="GEMEndcapPMod3_zmin * ForwardTrackingRegion_tan + GEMFrameBotEdge_width" />
<comment> Ensure there's always the length of the service gap in space available above the large GEM (top frame can extend into this at the corners). </comment>
<constant name="GEMEndcapLargeMod_rmax" value="min(GEMEndcapPMod3_zmin * TrackerMainDiagonal_tantheta, Solenoid_rmax-ForwardServiceGap_length)" />
<constant name="GEMEndcapLargeMod_rmax" value="min(GEMEndcapPMod3_zmin * TrackerMainDiagonal_tan, Solenoid_rmax-ForwardServiceGap_length)" />
<constant name="GEMEndcapLargeMod_x1" value="2 * GEMEndcapLargeMod_rmin * sin(GEMEndcapMod_angle/2)" />
<constant name="GEMEndcapLargeMod_x2" value="2 * GEMEndcapLargeMod_rmax * sin(GEMEndcapMod_angle/2)" />
<constant name="GEMEndcapLargeMod_y" value="GEMEndcapLargeMod_rmax * cos(GEMEndcapMod_angle/2) - GEMEndcapLargeMod_rmin" />
......
......@@ -301,11 +301,15 @@ Examples:
<documentation>
## Rapidity constants
</documentation>
<constant name="Eta1_1_tantheta" value="tan(2*atan(exp(-1.1)))" />
<constant name="Eta1_4_tantheta" value="tan(2*atan(exp(-1.4)))" />
<constant name="Eta3_5_tantheta" value="tan(2*atan(exp(-3.5)))" />
<constant name="Eta3_8_tantheta" value="tan(2*atan(exp(-3.8)))" />
<constant name="Eta4_0_tantheta" value="tan(2*atan(exp(-4.0)))" />
<constant name="Eta1_1_tan" value="tan(2*atan(exp(-1.1)))" />
<constant name="Eta1_4_tan" value="tan(2*atan(exp(-1.4)))" />
<constant name="Eta3_5_tan" value="tan(2*atan(exp(-3.5)))" />
<constant name="Eta3_6_tan" value="tan(2*atan(exp(-3.6)))" />
<constant name="Eta3_7_tan" value="tan(2*atan(exp(-3.7)))" />
<constant name="Eta3_8_tan" value="tan(2*atan(exp(-3.8)))" />
<constant name="Eta3_9_tan" value="tan(2*atan(exp(-3.9)))" />
<constant name="Eta4_0_tan" value="tan(2*atan(exp(-4.0)))" />
<constant name="Eta4_1_tan" value="tan(2*atan(exp(-4.1)))" />
<comment>Solenoid option</comment>
......@@ -351,16 +355,23 @@ Examples:
<constant name="VertexTrackingRegion_length" value="VertexTrackingRegionP_zmax + VertexTrackingRegionN_zmax" />
<documentation>
### Central Tracker Region
### Central Tracking Region
TrackerBarrel_rmax: also the rmin for the barrel PID system (DIRC)
Note: The barrel rmax and endcap lengths are the maximum extent allowed for
the barrel and endcap layers, not the position of the final layer.
</documentation>
<constant name="CentralTrackingRegion_rmax" value="950.0*mm" />
<constant name="CentralTrackingRegionP_zmax" value="1900.0*mm" />
<constant name="CentralTrackingRegionN_zmax" value="1370.0*mm" />
<constant name="CentralTrackingRegionN_zmax" value="1500.0*mm" />
<constant name="CentralTrackingRegion_length" value="CentralTrackingRegionP_zmax + CentralTrackingRegionN_zmax" />
<comment>
tan(theta) to determine rmin in the outer tracking region (due to tapered beampipe)
</comment>
<constant name="CentralTrackingRegionP_tan" value="Eta3_7_tan * 1.00" />
<constant name="CentralTrackingRegionN_tan" value="Eta4_0_tan * 0.99" />
<documentation level="0">
### PID Detector Region Parameters
......@@ -368,11 +379,13 @@ Examples:
<constant name="ForwardPIDRegion_zmin" value="CentralTrackingRegionP_zmax" />
<constant name="ForwardPIDRegion_length" value="140.0*cm" />
<constant name="ForwardPIDRegion_rmin1" value="Beampipe_rmax + 90*mm" />
<constant name="ForwardPIDRegion_rmin2" value="18.0*cm" />
<comment> tangent of the opening angle at the front and back of the RICH </comment>
<constant name="ForwardPIDRegion_tan1" value="CentralTrackingRegionP_tan * 1.00" />
<constant name="ForwardPIDRegion_tan2" value="Eta3_6_tan * 1.01" />
<constant name="BackwardPIDRegion_zmin" value="CentralTrackingRegionN_zmax" />
<constant name="BackwardPIDRegion_length" value="40.0*cm" />
<constant name="BackwardPIDRegion_tan" value="CentralTrackingRegionN_tan" />
<constant name="BackwardPIDRegion_length" value="60.0*cm" />
<constant name="BackwardPIDRegion_rmax" value="CentralTrackingRegion_rmax" />
<comment> Note: PID has space for DIRC, ExtraSpace sits past the PID</comment>
......@@ -383,10 +396,12 @@ Examples:
## Forward/backward tracking region behind the PID detectors
</documentation>
<constant name="BackwardTrackingRegion_zmin" value="BackwardPIDRegion_zmin + BackwardPIDRegion_length" />
<constant name="ForwardTrackingRegion_zmin" value="ForwardPIDRegion_zmin + ForwardPIDRegion_length" />
<constant name="ForwardTrackingRegion_length" value="10.0*cm" />
<constant name="BackwardTrackingRegion_length" value="8.0*cm" />
<constant name="BackwardTrackingRegion_tan" value="CentralTrackingRegionN_tan" />
<constant name="BackwardTrackingRegion_zmin" value="BackwardPIDRegion_zmin + BackwardPIDRegion_length" />
<constant name="ForwardTrackingRegion_tan" value="ForwardPIDRegion_tan2" />
<constant name="ForwardTrackingRegion_zmin" value="ForwardPIDRegion_zmin + ForwardPIDRegion_length" />
<constant name="ForwardTrackingRegion_length" value="10.0*cm" />
<constant name="BackwardTrackingRegion_length" value="0.0*cm" />
<comment> Total length of the endcap detectors in front of the calorimeter</comment>
<constant name="BackwardInnerEndcapRegion_length" value="BackwardPIDRegion_length + BackwardTrackingRegion_length"/>
......
......@@ -20,7 +20,8 @@
<vis name="TrackerGEMModuleVis" ref="TrackerMPGDVis" visible="true" showDaughters="false" />
<vis name="TrackerMMGASLayerVis" ref="TrackerMPGDVis" visible="true" showDaughters="false" />
<vis name="VertexSupportVis" ref="AnlBlue" showDaughters="false" />
<vis name="VertexSupportLayerVis" ref="AnlBlue" visible="true" showDaughters="false" />
<vis name="VertexSupportVis" ref="VertexSupportLayerVis" visible="true" showDaughters="true" />
<vis name="VertexLayerVis" ref="AnlGray" visible="true" showDaughters="true" />
<vis name="VertexModuleVis" ref="TrackerLayerVis" visible="true" showDaughters="false" />
......
......@@ -17,21 +17,22 @@
<vis name="TrackerModuleVis" ref="TrackerLayerVis" visible="true" showDaughters="true" />
<vis name="TrackerMPGDVis" ref="AnlRed" visible="true" showDaughters="true" />
<comment> Simple visualization for Barrel MMGAS (apply to layers) and GEM endcap (apply to modules) for better performance </comment>
<vis name="TrackerGEMModuleVis" ref="TrackerMPGDVis" visible="true" showDaughters="false" />
<vis name="TrackerMMGASLayerVis" ref="TrackerMPGDVis" visible="true" showDaughters="false" />
<vis name="TrackerGEMModuleVis" ref="TrackerMPGDVis" visible="true" showDaughters="false" />
<vis name="TrackerMMGASLayerVis" ref="TrackerMPGDVis" visible="true" showDaughters="false" />
<vis name="VertexSupportVis" ref="AnlBlue" visible="true" showDaughters="true" />
<vis name="VertexLayerVis" ref="AnlGray" visible="true" showDaughters="true" />
<vis name="VertexModuleVis" ref="TrackerLayerVis" visible="true" showDaughters="true" />
<vis name="VertexLayerVis" ref="AnlGray" visible="true" showDaughters="false" />
<vis name="VertexSupportLayerVis" ref="AnlBlue" visible="true" showDaughters="false" />
<vis name="VertexSupportVis" ref="VertexSupportLayerVis" visible="true" showDaughters="true" />
<vis name="VertexModuleVis" ref="TrackerLayerVis" visible="true" showDaughters="true" />
<vis name="TOFVis" ref="AnlTeal" showDaughters="true" visible="true"/>
<comment>
ECal Vis
</comment>
<vis name="EcalBarrelLayerVis" ref="AnlGold"/>
<vis name="EcalBarrelLayerVis" ref="AnlGold" showDaughters="false" visible="true"/>
<vis name="EcalBarrelEnvelopeVis" ref="AnlGold" showDaughters="true" visible="false" />
<vis name="EcalBarrelStaveVis" ref="AnlOrange" showDaughters="true" visible="false" />
<vis name="EcalBarrelStaveVis" ref="AnlGold" showDaughters="true" visible="true" />
<vis name="EcalBarrelFiberLayerVis" ref="AnlGold" showDaughters="false" visible="true" />
<vis name="EcalBarrelSliceVis" ref="AnlGray"/>
<vis name="EcalBarrelSupportVis" ref="AnlOrange"/>
......@@ -69,7 +70,7 @@
<vis name="RICHVis" ref="AnlTeal" showDaughters="true"/>
<vis name="DIRCVis" ref="AnlTeal" showDaughters="true" visible="true"/>
<vis name="DIRCLayerVis" ref="AnlTeal" showDaughters="true" visible="true"/>
<vis name="DIRCLayerVis" ref="AnlTeal" showDaughters="false" visible="true"/>
<vis name="DIRCModuleVis" ref="AnlTeal" showDaughters="true" visible="true"/>
<vis name="DIRCSupportVis" ref="AnlTeal" showDaughters="true" visible="true"/>
<vis name="DIRCFrameVis" ref="AnlOrange" showDaughters="true" visible="true"/>
......
......@@ -5,8 +5,8 @@
<!-- vessel (=snout+tank) geometry -->
<constant name="DRICH_zmin" value="ForwardPIDRegion_zmin"/> <!-- vessel front -->
<constant name="DRICH_Length" value="ForwardPIDRegion_length"/> <!-- overall vessel length (including snout) -->
<constant name="DRICH_rmin0" value="ForwardPIDRegion_rmin1"/> <!-- bore radius at dRICh vessel frontplane -->
<constant name="DRICH_rmin1" value="ForwardPIDRegion_rmin2"/> <!-- bore radius at dRICh vessel backplane -->
<constant name="DRICH_rmin0" value="ForwardPIDRegion_zmin * ForwardPIDRegion_tan1"/> <!-- bore radius at dRICh vessel frontplane -->
<constant name="DRICH_rmin1" value="(ForwardPIDRegion_zmin + ForwardPIDRegion_length) * ForwardPIDRegion_tan2"/> <!-- bore radius at dRICh vessel backplane -->
<constant name="DRICH_wall_thickness" value="0.5*cm"/> <!-- thickness of radial walls -->
<constant name="DRICH_window_thickness" value="0.1*cm"/> <!-- thickness of entrance and exit walls -->
<!-- tank geometry: cylinder, holding the majority of detector components -->
......
<?xml version="1.0" encoding="UTF-8"?>
<lccdd>
<define>
<!-- vessel geometry -->
<constant name="ERICH_Length" value="BackwardPIDRegion_length"/> <!-- vessel z-length -->
<constant name="ERICH_zmin" value="-BackwardPIDRegion_zmin"/> <!-- vessel front -->
<constant name="ERICH_zmax" value="ERICH_zmin - ERICH_Length"/> <!-- vessel back -->
<constant name="ERICH_rmin0" value="BackwardPIDRegion_tan * BackwardPIDRegion_zmin"/> <!-- bore radius at vessel frontplane -->
<constant name="ERICH_rmin1" value="BackwardPIDRegion_tan * (BackwardPIDRegion_zmin + BackwardPIDRegion_length)"/> <!-- bore radius at vessel backplane -->
<constant name="ERICH_rmax" value="BackwardPIDRegion_rmax - 2*cm"/> <!-- vessel backplane radius -->
<constant name="ERICH_wall_thickness" value="0.5*cm"/> <!-- thickness of radial walls -->
<constant name="ERICH_window_thickness" value="0.1*cm"/> <!-- thickness of entrance and exit walls -->
<!-- additional parameters -->
<constant name="ERICH_aerogel_thickness" value="3.0*cm"/> <!-- aerogel thickness -->
<constant name="ERICH_sensor_active_size" value="2*24.0*mm"/> <!-- sensor side length (effective area) -->
<constant name="ERICH_sensor_full_size" value="2*25.8*mm"/> <!-- sensor side length (full size, with enclosure) -->
<constant name="ERICH_sensor_thickness" value="1.5*mm"/> <!-- sensor thickness -->
<constant name="ERICH_num_px" value="2*8"/> <!-- number of pixels along one side of the sensor -->
<!-- debugging switches -->
<comment>
- `ERICH_debug_optics`: 1 = all components become vacuum; test opticalphotons from IP
2 = all components become vacuum, except for `gasvol`, test charged particles from IP
0 = off
</comment>
<constant name="ERICH_debug_optics" value="0"/>
</define>
<detectors>
<!-- /detectors/detector -->
<documentation level="10">
### eRICH: Electron Endcap RICH (name TBD)
</documentation>
<detector
id="BackwardRICH_ID"
name="ERICH"
type="athena_ERICH"
readout="ERICHHits"
gas="C4F10_ERICH"
material="Aluminum"
vis_vessel="DRICH_vessel_vis"
vis_gas="DRICH_gas_vis"
debug_optics="ERICH_debug_optics"
>
<!-- /detectors/detector/dimensions -->
<documentation level="10">
#### Vessel
- dimensions:
- `zmin`: z-position of vessel front plane
- `length`: overall z-length of the full vessel
- `rmin0` and `rmin1`: bore radius at front plane and back plane, respectively
- `rmax0` and `rmax1`: outer radius of vessel, at front plane and back plane, respectively
- `nsectors`: number of azimuthal sectors
- `wall_thickness`: thickness of radial walls
- `window_thickness`: thickness of entrance and exit disks
</documentation>
<dimensions
zmin="ERICH_zmin"
zmax="ERICH_zmax"
length="ERICH_Length"
rmin0="ERICH_rmin0"
rmin1="ERICH_rmin1"
rmax0="ERICH_rmax"
rmax1="ERICH_rmax"
nsectors="6"
wall_thickness="ERICH_wall_thickness"
window_thickness="ERICH_window_thickness"
/>
<!-- /detectors/detector/radiator -->
<documentation level="10">
#### Radiator
- radiator is defined in a wedge of azimuthal space, composed of aerogel and a
filter; the filter is applied to the back of the aerogel, so that it separates
the aerogel and gas radiators
- dimensions:
- `frontplane`: front of the aerogel, w.r.t. front plane of the vessel envelope
- `rmin` and `rmax`: inner and outer radius
- `phiw`: azimuthal width of wedge
- `thickness`: radiator thickness, defined separately for aerogel and filter
- `pitch`: controls the angle of the radiator (0=vertical)
</documentation>
<radiator
frontplane="-ERICH_window_thickness"
rmin="ERICH_rmin0 + ERICH_wall_thickness + 0.5*cm"
rmax="(ERICH_rmax/ERICH_zmax)*ERICH_zmin + 8.0*cm"
phiw="60*degree"
pitch="0*degree"
>
<aerogel
material="Aerogel_DRICH"
vis="DRICH_aerogel_vis"
thickness="ERICH_aerogel_thickness"
/>
<filter
material="Acrylic_DRICH"
vis="DRICH_filter_vis"
thickness="0.3*mm"
/>
</radiator>
<!-- /detectors/detector/sensors -->
<documentation level="10">
#### Sensors
</documentation>
<sensors>
<!-- /detectors/detector/sensors/module -->
<documentation level="10">
##### Sensor module
- based on Hamamatsu S13361-3050AE-08
- effective area: 24.0 x 24.0 mm
- enclosure size: 25.8 x 25.8 mm
- pixel size: 3x3 mm (8x8 matrix)
- thickness: 1.5 mm
- dimensions:
- `side`: side length of the square module
- `thickness`: thickness of the sensor module
- `gap`: provides room between the squares, to help prevent them from overlapping
- note: the values of `side` and `gap` will determine how many sensors there are, since the
sensor placement algorithm will try to place as many as it can in the specified region
</documentation>
<module
material="Silicon"
surface="SensorSurface_DRICH"
vis="DRICH_sensor_vis"
side="ERICH_sensor_active_size"
thickness="ERICH_sensor_thickness"
gap="0.5*(ERICH_sensor_full_size-ERICH_sensor_active_size) + 0.5*mm"
/>
<!-- /detectors/detector/sensors/plane -->
<documentation level="10">
##### Sensor plane
- sensors will be placed on a plane
- plane dimensions:
- `frontplane`: z-position of the sensor plane active surface (e.g., photocathode), w.r.t aerogel backplane;
absolute value of this number is the distance between aerogel/filter boundary and sensor surface
- `rmin`: minimum radial position of a sensor's centroid
- `rmax`: maximum radial position of a sensor's centroid
</documentation>
<plane
frontplane="-40*cm"
rmin="ERICH_rmin1 + 2*cm"
rmax="ERICH_rmax - 4*cm"
/>
</sensors>
</detector>
</detectors>
<documentation level="10">
#### Readout
- segmentation: square matrix of pixels
- `grid_size_x,y`: size of each sensor, but note we must divide sensor size
by 1 less than the number of pixels, to account for fenceposting
- `offset_x,y`: specified such that the `x` and `y` indicators are unsigned
- indicators and `cellID` bits:
| indicator | offset | length |
|-----------|--------|--------|
| eRICH ID | 0 | 8 |
| sensor | 8 | 12 |
| x pixel | 20 | 16 |
| y pixel | 36 | 16 |
</documentation>
<readouts>
<readout name="ERICHHits">
<segmentation
type="CartesianGridXY"
grid_size_x="ERICH_sensor_active_size/(ERICH_num_px-1)"
grid_size_y="ERICH_sensor_active_size/(ERICH_num_px-1)"
offset_x="-ERICH_sensor_active_size/2.0"
offset_y="-ERICH_sensor_active_size/2.0"
/>
<id>system:8,module:12,x:20:16,y:16</id>
</readout>
</readouts>
</lccdd>
......@@ -373,7 +373,7 @@
1240*eV/210 10*mm
1240*eV/200 0*mm
"/>
<!-- BEGIN dRICh material properties
<!-- BEGIN dRICh and eRICh material properties
- dumped from fun4all implementation
- see https://github.com/cisbani/dRICh/blob/main/share/source/g4dRIChOptics.hh
-->
......@@ -402,6 +402,31 @@
4.85156*eV 10.0*m
6.19921*eV 10.0*m
"/>
<!-- eRICh gas -->
<matrix name="RINDEX__C4F10_ERICH" coldim="2" values="
1.7712*eV 1.0013
1.92389*eV 1.0013
2.10539*eV 1.00131
2.3247*eV 1.00131
2.59502*eV 1.00132
2.93647*eV 1.00133
3.38139*eV 1.00134
3.98521*eV 1.00136
4.85156*eV 1.0014
6.19921*eV 1.00149
"/>
<matrix name="ABSLENGTH__C4F10_ERICH" coldim="2" values="
1.7712*eV 6.0*m
1.92389*eV 6.0*m
2.10539*eV 6.0*m
2.3247*eV 6.0*m
2.59502*eV 6.0*m
2.93647*eV 6.0*m
3.38139*eV 6.0*m
3.98521*eV 6.0*m
4.85156*eV 6.0*m
6.19921*eV 6.0*m
"/>
<!-- dRICh aerogel -->
<matrix name="RINDEX__Aerogel_DRICH" coldim="2" values="
1.87855*eV 1.01638
......@@ -713,7 +738,7 @@
<property name="RINDEX" ref="RINDEX__Acrylic"/>
<property name="ABSLENGTH" ref="ABSLENGTH__Acrylic"/>
</material>
<!-- BEGIN dRICh material definitions -->
<!-- BEGIN dRICh and eRICh material definitions -->
<material name="C2F6_DRICH">
<D type="density" value="0.005734" unit="g/cm3"/>
<composite n="2" ref="C"/>
......@@ -721,6 +746,13 @@
<property name="RINDEX" ref="RINDEX__C2F6_DRICH"/>
<property name="ABSLENGTH" ref="ABSLENGTH__C2F6_DRICH"/>
</material>
<material name="C4F10_ERICH">
<D type="density" value="0.009935" unit="g/cm3"/>
<composite n="4" ref="C"/>
<composite n="10" ref="F"/>
<property name="RINDEX" ref="RINDEX__C4F10_ERICH"/>
<property name="ABSLENGTH" ref="ABSLENGTH__C4F10_ERICH"/>
</material>
<material name="Aerogel_DRICH">
<D type="density" value="0.1" unit="g/cm3"/>
<comment> n_air = [dens(Si02)-dens(aerogel)] / [dens(Si02)-dens(Air) ] </comment>
......
......@@ -6,4 +6,3 @@
<include ref="drich.xml"/>
</lccdd>
......@@ -4,5 +4,6 @@
<!--include ref="dirc.xml"/-->
<!--include ref="mrich.xml"/-->
<include ref="drich.xml"/>
<include ref="erich.xml"/>
</lccdd>
......@@ -59,104 +59,15 @@
<display>
<include ref="compact/colors.xml" />
<!--include ref="compact/colors2.xml"/-->
<include ref="compact/display.xml" />
<!--include ref="compact/display_detailed.xml"/-->
</display>
<documentation level="0">
## Detector Subsystems
### IP Subsystems
The interaction point subsystems are included before the central detector subsystems.
This is becuase the IP subsystems, for exmaple the beampipe, will define paramters
which are subsquently used in the central detector construction -- e.g. the vertex tracker
uses the beampipe OD to help define its placement.
The IP subsystems include the Far forward and backward regions. The list of subsystem includes:
- Interaction region beampipe
- B0 tracker
- Off-momentum tracker
- Far forward roman pots
- Zero Degree Calorimeter
- Beam line magnets.
- and more...
</documentation>
<documentation level="10">
### dRICh only
## dRICh only
</documentation>
<include ref="compact/drich.xml" />
<fields>
<field name="B0PF_Magnet" type="MultipoleMagnet">
<position x="B0PF_XPosition" y="0" z="B0PF_CenterPosition"/>
<rotation x="0" y="B0PF_RotationAngle" z="0"/>
<shape type="Tube" rmin="0.0" rmax="B0PF_InnerRadius" dz="B0PF_Length*0.5"/>
<coefficient coefficient="B0PF_Bmax" skew="0.0*tesla"/>
<!--<coefficient coefficient="2.0*tesla/cm" skew="0.2*tesla/cm"/> -->
</field>
<field name="B0APF_Magnet" type="MultipoleMagnet">
<position x="B0APF_XPosition" y="0" z="B0APF_CenterPosition"/>
<rotation x="0" y="B0APF_RotationAngle" z="0"/>
<shape type="Tube" rmin="0.0" rmax="B0APF_InnerRadius" dz="B0APF_Length*0.5"/>
<coefficient coefficient="B0APF_Bmax" skew="0.0*tesla"/>
<!--<coefficient coefficient="2.0*tesla/cm" skew="0.2*tesla/cm"/> -->
</field>
<field name="Q1APF_Magnet" type="MultipoleMagnet">
<position x="Q1APF_XPosition" y="0" z="Q1APF_CenterPosition"/>
<rotation x="0" y="Q1APF_RotationAngle" z="0"/>
<shape type="Tube" rmin="0.0" rmax="Q1APF_InnerRadius" dz="Q1APF_Length*0.5"/>
<coefficient coefficient="Q1APF_Bmax" skew="0.0*tesla"/>
<coefficient coefficient="Q1APF_GradientMax" skew="0.0*tesla/cm"/>
</field>
<field name="Q1BPF_Magnet" type="MultipoleMagnet">
<position x="Q1BPF_XPosition" y="0" z="Q1BPF_CenterPosition"/>
<rotation x="0" y="Q1BPF_RotationAngle" z="0"/>
<shape type="Tube" rmin="0.0" rmax="Q1BPF_InnerRadius" dz="Q1BPF_Length*0.5"/>
<coefficient coefficient="Q1BPF_Bmax" skew="0.0*tesla"/>
<coefficient coefficient="Q1BPF_GradientMax" skew="0.0*tesla/cm"/>
</field>
<field name="Q2PF_Magnet" type="MultipoleMagnet">
<position x="Q2PF_XPosition" y="0" z="Q2PF_CenterPosition"/>
<rotation x="0" y="Q2PF_RotationAngle" z="pi/2.0"/>
<shape type="Tube" rmin="0.0" rmax="Q2PF_InnerRadius" dz="Q2PF_Length*0.5"/>
<coefficient coefficient="Q2PF_Bmax" skew="0.0*tesla"/>
<coefficient coefficient="Q2PF_GradientMax" skew="0.0*tesla/cm"/>
</field>
<field name="B1PF_Magnet" type="MultipoleMagnet">
<position x="B1PF_XPosition" y="0" z="B1PF_CenterPosition"/>
<rotation x="0" y="B1PF_RotationAngle" z="0"/>
<shape type="Tube" rmin="0.0" rmax="B1PF_InnerRadius" dz="B1PF_Length*0.5"/>
<coefficient coefficient="B1PF_Bmax" skew="0.0*tesla"/>
<coefficient coefficient="B1PF_GradientMax" skew="0.0*tesla/cm"/>
</field>
<field name="B1APF_Magnet" type="MultipoleMagnet">
<position x="B1APF_XPosition" y="0" z="B1APF_CenterPosition"/>
<rotation x="0" y="B1APF_RotationAngle" z="0"/>
<shape type="Tube" rmin="0.0" rmax="B1APF_InnerRadius" dz="B1APF_Length*0.5"/>
<coefficient coefficient="B1APF_Bmax" skew="0.0*tesla"/>
<coefficient coefficient="B1APF_GradientMax" skew="0.0*tesla/cm"/>
</field>
<field name="B2PF_Magnet" type="MultipoleMagnet">
<position x="B2PF_XPosition" y="0" z="B2PF_CenterPosition"/>
<rotation x="0" y="B2PF_RotationAngle" z="0"/>
<shape type="Tube" rmin="0.0" rmax="B2PF_InnerRadius" dz="B2PF_Length*0.5"/>
<coefficient coefficient="B2PF_Bmax" skew="0.0*tesla"/>
<coefficient coefficient="B2PF_GradientMax" skew="0.0*tesla/cm"/>
</field>
</fields>
<comment>
FB elements
-----------
None (TODO)
What is FB?
</comment>
<readouts>
</readouts>
<include ref="ip6/beampipe.xml" />
<include ref="compact/drich.xml" />
</lccdd>
<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
<debug>
<type name="surface" value="0"/>
<type name="material" value="0"/>
<type name="readout" value="0"/>
<type name="segmentation" value="0"/>
<type name="limits" value="0"/>
<type name="region" value="0"/>
<type name="includes" value="0"/>
</debug>
<documentation level="-1">
# Athena Detector
- https://eicweb.phy.anl.gov/EIC/detectors/athena.git
- https://eicweb.phy.anl.gov/EIC/detectors/ip6.git
</documentation>
<!-- Some information about detector -->
<info name="Athena Detector" title="Athena Detector"
author="Athena Collaboration"
url="https://eicweb.phy.anl.gov/EIC/detectors/athena.git"
status="development"
version="v1 2021-03-16">
<comment> Athena </comment>
</info>
<define>
<documentation level="2">
## Main Constant Definitions
The ip6 (or other ip) defines should be included first.
These files have only a define tags.
</documentation>
<include ref="ip6/ip6_defs.xml" />
<include ref="ip6/far_forward_fields_275.xml" />
<include ref="compact/definitions.xml" />
</define>
<includes>
<gdmlFile ref="compact/elements.xml"/>
<gdmlFile ref="compact/materials.xml"/>
<file ref="compact/optical_materials.xml"/>
</includes>
<limits>
<limitset name="EICBeamlineLimits">
<limit name="step_length_max" particles="*" value="1.0" unit="mm" />
<limit name="track_length_max" particles="*" value="1.0" unit="mm" />
<limit name="time_max" particles="*" value="0.1" unit="ns" />
<limit name="ekin_min" particles="*" value="0.001" unit="MeV" />
<limit name="range_min" particles="*" value="0.1" unit="mm" />
</limitset>
<limitset name="cal_limits">
<limit name="step_length_max" particles="*" value="5.0" unit="mm"/>
</limitset>
</limits>
<display>
<include ref="compact/colors.xml" />
<include ref="compact/display.xml" />
</display>
<documentation level="10">
## eRICH only
</documentation>
<include ref="ip6/beampipe.xml" />
<include ref="compact/erich.xml" />
</lccdd>
......@@ -32,7 +32,7 @@ Simple carbon fiber support shell.
</documentation>
<constant name="VertexBarrelEnvelope_length" value="VertexTrackingRegion_length"/>
<constant name="VertexBarrelLayer_length" value="VertexBarrelEnvelope_length - 1*mm"/>
<constant name="VertexBarrelLayer_length" value="VertexBarrelMod_length + 1*um"/>
<constant name="VertexBarrelLayer_thickness" value="0.2*cm"/>
<constant name="VertexBarrelMod_thickness" value="0.1*cm"/>
......@@ -163,7 +163,7 @@ Simple carbon fiber support shell.
<rphi_layout phi_tilt="0.0*degree" nphi="VertexBarrelStave_count" phi0="0.0" rc="VertexBarrelMod3_rmin" dr="0.0 * mm"/>
<z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/>
</layer>
<layer module="SupportShell" id="VertexBarrelMod_count + 1" vis="VertexSupportVis">
<layer module="SupportShell" id="VertexBarrelMod_count + 1" vis="VertexSupportLayerVis">
<barrel_envelope
inner_r="VertexBarrelSupport_rmin"
outer_r="VertexBarrelSupport_rmax"
......
//----------------------------------
// eRICH: Electron endcap RICH
// Author: C. Dilks
//----------------------------------
#include <XML/Helper.h>
#include "TMath.h"
#include "TString.h"
#include "GeometryHelpers.h"
#include "Math/Point2D.h"
#include "DDRec/Surface.h"
#include "DDRec/DetectorData.h"
#include "DD4hep/OpticalSurfaces.h"
#include "DD4hep/DetFactoryHelper.h"
#include "DD4hep/Printout.h"
using namespace dd4hep;
using namespace dd4hep::rec;
// create the detector
static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetector sens) {
xml::DetElement detElem = handle;
std::string detName = detElem.nameStr();
int detID = detElem.id();
DetElement det(detName, detID);
xml::Component dims = detElem.dimensions();
OpticalSurfaceManager surfMgr = desc.surfaceManager();
// attributes -----------------------------------------------------------
// - vessel
double vesselLength = dims.attr<double>(_Unicode(length));
double vesselZmin = dims.attr<double>(_Unicode(zmin));
double vesselZmax = dims.attr<double>(_Unicode(zmax));
double vesselRmin0 = dims.attr<double>(_Unicode(rmin0));
double vesselRmin1 = dims.attr<double>(_Unicode(rmin1));
double vesselRmax0 = dims.attr<double>(_Unicode(rmax0));
double vesselRmax1 = dims.attr<double>(_Unicode(rmax1));
int nSectors = dims.attr<int>(_Unicode(nsectors));
double wallThickness = dims.attr<double>(_Unicode(wall_thickness));
double windowThickness = dims.attr<double>(_Unicode(window_thickness));
auto vesselMat = desc.material(detElem.attr<std::string>(_Unicode(material)));
auto gasvolMat = desc.material(detElem.attr<std::string>(_Unicode(gas)));
auto vesselVis = desc.visAttributes(detElem.attr<std::string>(_Unicode(vis_vessel)));
auto gasvolVis = desc.visAttributes(detElem.attr<std::string>(_Unicode(vis_gas)));
// - radiator (applies to aerogel and filter)
auto radiatorElem = detElem.child(_Unicode(radiator));
double radiatorRmin = radiatorElem.attr<double>(_Unicode(rmin));
double radiatorRmax = radiatorElem.attr<double>(_Unicode(rmax));
double radiatorPhiw = radiatorElem.attr<double>(_Unicode(phiw));
double radiatorPitch = radiatorElem.attr<double>(_Unicode(pitch));
double radiatorFrontplane = radiatorElem.attr<double>(_Unicode(frontplane));
// - aerogel
auto aerogelElem = radiatorElem.child(_Unicode(aerogel));
auto aerogelMat = desc.material(aerogelElem.attr<std::string>(_Unicode(material)));
auto aerogelVis = desc.visAttributes(aerogelElem.attr<std::string>(_Unicode(vis)));
double aerogelThickness = aerogelElem.attr<double>(_Unicode(thickness));
// - filter
auto filterElem = radiatorElem.child(_Unicode(filter));
auto filterMat = desc.material(filterElem.attr<std::string>(_Unicode(material)));
auto filterVis = desc.visAttributes(filterElem.attr<std::string>(_Unicode(vis)));
double filterThickness = filterElem.attr<double>(_Unicode(thickness));
// - sensor module
auto sensorElem = detElem.child(_Unicode(sensors)).child(_Unicode(module));
auto sensorMat = desc.material(sensorElem.attr<std::string>(_Unicode(material)));
auto sensorVis = desc.visAttributes(sensorElem.attr<std::string>(_Unicode(vis)));
auto sensorSurf = surfMgr.opticalSurface(sensorElem.attr<std::string>(_Unicode(surface)));
double sensorSide = sensorElem.attr<double>(_Unicode(side));
double sensorGap = sensorElem.attr<double>(_Unicode(gap));
double sensorThickness = sensorElem.attr<double>(_Unicode(thickness));
// - sensor plane
auto sensorPlaneElem = detElem.child(_Unicode(sensors)).child(_Unicode(plane));
double sensorPlaneFrontplane = sensorPlaneElem.attr<double>(_Unicode(frontplane));
double sensorPlaneRmin = sensorPlaneElem.attr<double>(_Unicode(rmin));
double sensorPlaneRmax = sensorPlaneElem.attr<double>(_Unicode(rmax));
// - debugging switches
int debug_optics_mode = detElem.attr<int>(_Unicode(debug_optics));
// if debugging optics, override some settings
bool debug_optics = debug_optics_mode > 0;
if(debug_optics) {
printout(WARNING,"ERich_geo","DEBUGGING ERICH OPTICS");
switch(debug_optics_mode) {
case 1: vesselMat = aerogelMat = filterMat = sensorMat = gasvolMat = desc.material("VacuumOptical"); break;
case 2: vesselMat = aerogelMat = filterMat = sensorMat = desc.material("VacuumOptical"); break;
default: printout(FATAL,"ERich_geo","UNKNOWN debug_optics_mode"); return det;
};
aerogelVis = sensorVis;
gasvolVis = vesselVis = desc.invisible();
};
// BUILD VESSEL //////////////////////////////////////
/* - `vessel`: aluminum enclosure, the mother volume of the eRICh
* - `gasvol`: gas volume, which fills `vessel`; all other volumes defined below
* are children of `gasvol`
*/
// tank solids
Cone vesselTank(
vesselLength/2.0,
vesselRmin1,
vesselRmax1,
vesselRmin0,
vesselRmax0
);
Cone gasvolTank(
vesselLength/2.0 - windowThickness,
vesselRmin1 + wallThickness,
vesselRmax1 - wallThickness,
vesselRmin0 + wallThickness,
vesselRmax0 - wallThickness
);
// extra solids for `debug_optics` only
Box vesselBox(1001,1001,1001);
Box gasvolBox(1000,1000,1000);
// choose vessel and gasvol solids (depending on `debug_optics_mode` (0=disabled))
Solid vesselSolid, gasvolSolid;
switch(debug_optics_mode) {
case 0: vesselSolid=vesselTank; gasvolSolid=gasvolTank; break; // `!debug_optics`
case 1: vesselSolid=vesselBox; gasvolSolid=gasvolBox; break;
case 2: vesselSolid=vesselBox; gasvolSolid=gasvolTank; break;
};
// volumes
Volume vesselVol(detName, vesselSolid, vesselMat);
Volume gasvolVol(detName+"_gas", gasvolSolid, gasvolMat);
vesselVol.setVisAttributes(vesselVis);
gasvolVol.setVisAttributes(gasvolVis);
// reference positions
// - the vessel is created such that the center of the cylindrical tank volume
// coincides with the origin; this is called the "origin position" of the vessel
// - when the vessel (and its children volumes) is placed, it is translated in
// the z-direction to be in the proper ATHENA-integration location
// - these reference positions are for the frontplane and backplane of the vessel,
// with respect to the vessel origin position
auto originFront = Position(0., 0., vesselLength/2.0 );
auto originBack = Position(0., 0., -vesselLength/2.0 );
// sensitive detector type
sens.setType("photoncounter");
// SECTOR LOOP //////////////////////////////////
for(int isec=0; isec<nSectors; isec++) {
// debugging filters, limiting the number of sectors
//if( debug_optics && isec!=0) continue;
// sector rotation about z axis
double sectorRotation = isec * 360/nSectors * degree;
std::string secName = "sec" + std::to_string(isec);
// BUILD RADIATOR //////////////////////////////////////
// solid and volume: create aerogel and filter sectors
Tube aerogelSolid(radiatorRmin, radiatorRmax, aerogelThickness/2, -radiatorPhiw/2.0, radiatorPhiw/2.0);
Tube filterSolid( radiatorRmin, radiatorRmax, filterThickness/2, -radiatorPhiw/2.0, radiatorPhiw/2.0);
Volume aerogelVol( detName+"_aerogel_"+secName, aerogelSolid, aerogelMat );
Volume filterVol( detName+"_filter_"+secName, filterSolid, filterMat );
aerogelVol.setVisAttributes(aerogelVis);
filterVol.setVisAttributes(filterVis);
// aerogel placement and surface properties
// TODO [low-priority]: define skin properties for aerogel and filter
auto radiatorPos = Position(0., 0., radiatorFrontplane-0.5*aerogelThickness) + originFront;
auto aerogelPV = gasvolVol.placeVolume(aerogelVol,
RotationZ(sectorRotation) // rotate about beam axis to sector
* Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z()) // re-center to originFront
* RotationY(radiatorPitch) // change polar angle to specified pitch
);
DetElement aerogelDE(det, Form("aerogel_de%d", isec), isec);
aerogelDE.setPlacement(aerogelPV);
//SkinSurface aerogelSkin(desc, aerogelDE, Form("mirror_optical_surface%d", isec), aerogelSurf, aerogelVol);
//aerogelSkin.isValid();
// filter placement and surface properties
if(!debug_optics) {
auto filterPV = gasvolVol.placeVolume(filterVol,
RotationZ(sectorRotation) // rotate about beam axis to sector
* Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z()) // re-center to originFront
* RotationY(radiatorPitch) // change polar angle
* Translation3D(0., 0., -(aerogelThickness+filterThickness)/2.) // move to aerogel backplane
);
DetElement filterDE(det, Form("filter_de%d", isec), isec);
filterDE.setPlacement(filterPV);
//SkinSurface filterSkin(desc, filterDE, Form("mirror_optical_surface%d", isec), filterSurf, filterVol);
//filterSkin.isValid();
};
}; // END SECTOR LOOP //////////////////////////
// BUILD SENSORS ///////////////////////
// solid and volume: single sensor module
Box sensorSolid(sensorSide/2., sensorSide/2., sensorThickness/2.);
Volume sensorVol(detName+"_sensor", sensorSolid, sensorMat);
sensorVol.setVisAttributes(sensorVis);
// sensitivity
if(!debug_optics) sensorVol.setSensitiveDetector(sens);
// sensor plane positioning: we want |`sensorPlaneFrontplane`| to be the distance between the
// aerogel backplane (i.e., aerogel/filter boundary) and the sensor active surface (e.g, photocathode)
double sensorZpos = radiatorFrontplane - aerogelThickness + sensorPlaneFrontplane - 0.5*sensorThickness;
auto sensorPlanePos = Position(0., 0., sensorZpos) + originFront; // reference position
// miscellaneous
int imod=0; // module number
double tBoxMax = vesselRmax1; // sensors will be tiled in tBox, within annular limits
// SENSOR MODULE LOOP ------------------------
/* cartesian tiling loop
* - start at (x=0,y=0), to center the grid
* - loop over positive-x positions; for each, place the corresponding negative-x sensor too
* - nested similar loop over y positions
*/
double sx,sy;
for(double usx=0; usx<=tBoxMax; usx+=sensorSide+sensorGap) {
for(int sgnx=1; sgnx>=(usx>0?-1:1); sgnx-=2) {
for(double usy=0; usy<=tBoxMax; usy+=sensorSide+sensorGap) {
for(int sgny=1; sgny>=(usy>0?-1:1); sgny-=2) {
// sensor (x,y) center
sx = sgnx*usx;
sy = sgny*usy;
// annular cut
if(std::hypot(sx,sy)<sensorPlaneRmin || std::hypot(sx,sy)>sensorPlaneRmax) continue;
// placement (note: transformations are in reverse order)
auto sensorPV = gasvolVol.placeVolume(sensorVol,Transform3D(
Translation3D(sensorPlanePos.x(), sensorPlanePos.y(), sensorPlanePos.z()) // move to reference position
* Translation3D(sx, sy, 0.) // move to grid position
));
// generate LUT for module number -> sensor position, for readout mapping tests
//printf("%d %f %f\n",imod,sensorPV.position().x(),sensorPV.position().y());
// properties
sensorPV.addPhysVolID("module", imod);
DetElement sensorDE(det, Form("sensor_de_%d", imod), 10000*imod); // TODO: what is this 10000?
sensorDE.setPlacement(sensorPV);
if(!debug_optics) {
SkinSurface sensorSkin(desc, sensorDE, "sensor_optical_surface", sensorSurf, sensorVol); // TODO: 3rd arg needs `imod`?
sensorSkin.isValid();
};
// increment sensor module number
imod++;
};
};
};
};
// END SENSOR MODULE LOOP ------------------------
// place gas volume
PlacedVolume gasvolPV = vesselVol.placeVolume(gasvolVol,Position(0, 0, 0));
DetElement gasvolDE(det, "gasvol_de", 0);
gasvolDE.setPlacement(gasvolPV);
// place mother volume (vessel)
Volume motherVol = desc.pickMotherVolume(det);
PlacedVolume vesselPV = motherVol.placeVolume(vesselVol,
Position(0, 0, vesselZmin) - originFront
);
vesselPV.addPhysVolID("system", detID);
det.setPlacement(vesselPV);
return det;
};
// clang-format off
DECLARE_DETELEMENT(athena_ERICH, createDetector)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment