diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c650eaaf0cdda579bcf4bd1c1a719eb016f1d9f7..3ecac4dc62a72e66c0465bf3314be719bdfa30e4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -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 diff --git a/CMakeLists.txt b/CMakeLists.txt index 6f12b924f5e359549ad5ac730aa25f40ee8c0880..219d944a012a3f75a9963864de2fbde1d735ecb1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 diff --git a/compact/central_tracker_hybrid_v2.xml b/compact/central_tracker_hybrid_v2.xml index 76e2f935b0926171ac1f9c5c18c39c20eccdc9ae..2530df0a74f2d5ec178d5bb7579e75006c62f5bc 100644 --- a/compact/central_tracker_hybrid_v2.xml +++ b/compact/central_tracker_hybrid_v2.xml @@ -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" /> diff --git a/compact/definitions.xml b/compact/definitions.xml index 63d43c68b3b40c0ad2953be927f1f94ff87cdc03..126272780c6509a686ac3eff8c9a84ea0f470861 100644 --- a/compact/definitions.xml +++ b/compact/definitions.xml @@ -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"/> diff --git a/compact/display.xml b/compact/display.xml index 01a2d888813324a12b3a71aa1060c685f3c76de1..3175dd744031017204565150ad3ffd288042cadb 100644 --- a/compact/display.xml +++ b/compact/display.xml @@ -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" /> diff --git a/compact/display_geoviewer.xml b/compact/display_geoviewer.xml index 217351bda9360f16d4f69112d2148bbb94803ee9..83f8b19b807b7a3916900a42f36e0dc294694eaf 100644 --- a/compact/display_geoviewer.xml +++ b/compact/display_geoviewer.xml @@ -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"/> diff --git a/compact/drich.xml b/compact/drich.xml index f3950cba183ee9908fbad1507527e2085e81d184..61c303d86e2861005d4ee8a9cdfb2371f5d3d0b9 100644 --- a/compact/drich.xml +++ b/compact/drich.xml @@ -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 --> diff --git a/compact/erich.xml b/compact/erich.xml new file mode 100644 index 0000000000000000000000000000000000000000..fb58dcb660a2f482fd6ed448dc1f1af5999f37ff --- /dev/null +++ b/compact/erich.xml @@ -0,0 +1,193 @@ +<?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> diff --git a/compact/optical_materials.xml b/compact/optical_materials.xml index 31bedaefffeb78eb6885162e84794b96cc61ed23..00fe17cb860fde7ea9ad021d484aff334a9f9335 100644 --- a/compact/optical_materials.xml +++ b/compact/optical_materials.xml @@ -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> diff --git a/compact/pid_config_acadia.xml b/compact/pid_config_acadia.xml index 48a099cdc81b120b2aed2061d2fdb5aefee1fc63..55d18ec5dba2b4c7ed515aa666dd48f9cbfb616d 100644 --- a/compact/pid_config_acadia.xml +++ b/compact/pid_config_acadia.xml @@ -6,4 +6,3 @@ <include ref="drich.xml"/> </lccdd> - diff --git a/compact/pid_config_canyonlands.xml b/compact/pid_config_canyonlands.xml index fb98490f6f4a1c4eb8522552be572793c48a08a5..136efd6a06c97e5dd855e9faf1afaeaa9c01ce14 100644 --- a/compact/pid_config_canyonlands.xml +++ b/compact/pid_config_canyonlands.xml @@ -4,5 +4,6 @@ <!--include ref="dirc.xml"/--> <!--include ref="mrich.xml"/--> <include ref="drich.xml"/> +<include ref="erich.xml"/> </lccdd> diff --git a/compact/subsystem_views/drich_only.xml b/compact/subsystem_views/drich_only.xml index 3b72487488dafc90364b39b7dd3b7d3c9b9d124a..d85dad6a539987fa9d58d79b2a39d74fa04f42d4 100644 --- a/compact/subsystem_views/drich_only.xml +++ b/compact/subsystem_views/drich_only.xml @@ -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> diff --git a/compact/subsystem_views/erich_only.xml b/compact/subsystem_views/erich_only.xml new file mode 100644 index 0000000000000000000000000000000000000000..b97787622871c8397dfa68e287454c023cad4ea9 --- /dev/null +++ b/compact/subsystem_views/erich_only.xml @@ -0,0 +1,71 @@ +<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> diff --git a/compact/vertex_tracker_3layers.xml b/compact/vertex_tracker_3layers.xml index 20327d9ad979d9325bb6f3c56bce8875fd1ca7f6..ceef79c338075df0a7bcb180bf86d9fd534f5ce3 100644 --- a/compact/vertex_tracker_3layers.xml +++ b/compact/vertex_tracker_3layers.xml @@ -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" diff --git a/src/ERich_geo.cpp b/src/ERich_geo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e010ed19bca34de4ac4b746ecb67c5dfd307e462 --- /dev/null +++ b/src/ERich_geo.cpp @@ -0,0 +1,281 @@ +//---------------------------------- +// 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)