diff --git a/.gitignore b/.gitignore index 96a61480e4e3cbb4d1cda1cc90743187155d5772..b364cf88d73433cb8f67468e10b6e3299934733c 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,5 @@ fieldmaps manifest.txt acts.txt acts2.txt + +materials-map.cbor diff --git a/calibrations/calo_digi_canyonlands.json b/calibrations/calo_digi_canyonlands.json new file mode 100644 index 0000000000000000000000000000000000000000..f98ff251ddee1e5b63a6543696165820988524a8 --- /dev/null +++ b/calibrations/calo_digi_canyonlands.json @@ -0,0 +1,58 @@ +{ + "ecal_neg_endcap": { + "readout": "module", + "dynamicRange": "20*GeV", + "capacityBitsADC": 14, + "pedestalMean": 100, + "pedestalSigma": 1, + "thresholdValue": 3 + }, + "hcal_neg_endcap": { + "readout": "tile", + "dynamicRange": "20*MeV", + "capacityBitsADC": 8, + "pedestalMean": 20, + "pedestalSigma": 0.3, + "thresholdValue": 1 + }, + "ecal_pos_endcap": { + "readout": "module", + "dynamicRange": "3*GeV", + "capacityBitsADC": 14, + "pedestalMean": 100, + "pedestalSigma": 0.7, + "thresholdValue": 2 + }, + "hcal_pos_endcap": { + "readout": "tile", + "dynamicRange": "3.6*GeV", + "capacityBitsADC": 10, + "pedestalMean": 20, + "pedestalSigma": 0.8, + "thresholdValue": 3 + }, + "ecal_barrel_imaging": { + "readout": "pixel", + "dynamicRange": "3*MeV", + "capacityBitsADC": 13, + "pedestalMean": 100, + "pedestalSigma": 14, + "thresholdValue": 50 + }, + "ecal_barrel_scfi": { + "readout": "light_guide", + "dynamicRange": "750*MeV", + "capacityBitsADC": 14, + "pedestalMean": 20, + "pedestalSigma": 0.3, + "thresholdValue": 1 + }, + "hcal_barrel": { + "readout": "tile", + "dynamicRange": "20*MeV", + "capacityBitsADC": 8, + "pedestalMean": 20, + "pedestalSigma": 0.3, + "thresholdValue": 1 + } +} diff --git a/calibrations/calo_digi_default.json b/calibrations/calo_digi_default.json new file mode 120000 index 0000000000000000000000000000000000000000..54f309b2bc9e467585089271e738d0477458bbfa --- /dev/null +++ b/calibrations/calo_digi_default.json @@ -0,0 +1 @@ +calo_digi_canyonlands.json \ No newline at end of file diff --git a/compact/central_tracker_hybrid_v2.xml b/compact/central_tracker_hybrid_v2.xml index 2530df0a74f2d5ec178d5bb7579e75006c62f5bc..f9b5899e4d89b14e6790e386bede483d6583c718 100644 --- a/compact/central_tracker_hybrid_v2.xml +++ b/compact/central_tracker_hybrid_v2.xml @@ -285,14 +285,14 @@ total X0 0.24% per disk layer (4 sectors per disk): <constant name="InnerTrackerEndcapMod1_zmin" value="InnerTrackerEndcap_zmin" /> <constant name="InnerTrackerEndcapMod1_rmin" value="InnerTrackerEndcap_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_x1" value="2 * InnerTrackerEndcapMod1_rmin * tan(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_tan * 0.995, SiTrackerCyl_rmin)" /> - <constant name="InnerTrackerEndcapMod2_x1" value="2 * InnerTrackerEndcapMod2_rmin * sin(SiTrackerEndcapMod_angle/2)" /> + <constant name="InnerTrackerEndcapMod2_x1" value="2 * InnerTrackerEndcapMod2_rmin * tan(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" /> @@ -580,7 +580,7 @@ total X0 0.24% per disk layer (4 sectors per disk): <constant name="MedialTrackerEndcapPMod1_zmin" value="MedialTrackerEndcap_zmin" /> <constant name="MedialTrackerEndcapPMod1_rmin" value="MedialTrackerEndcapP_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_x1" value="2 * MedialTrackerEndcapPMod1_rmin * tan(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" /> @@ -591,7 +591,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_tan * 0.995, SiTrackerCyl_rmin)" /> - <constant name="MedialTrackerEndcapNMod1_x1" value="2 * MedialTrackerEndcapNMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" /> + <constant name="MedialTrackerEndcapNMod1_x1" value="2 * MedialTrackerEndcapNMod1_rmin * tan(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" /> @@ -778,7 +778,7 @@ total X0 0.24% per disk layer (4 sectors per disk): <constant name="OuterTrackerEndcapPMod1_zmin" value="OuterTrackerEndcapP_zmin" /> <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_x1" value="2 * OuterTrackerEndcapPMod1_rmin * tan(SiTrackerEndcapMod_angle/2)" /> <constant name="OuterTrackerEndcapPMod1_x2" value="2 * OuterTrackerEndcapPMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" /> <constant name="OuterTrackerEndcapPMod1_y" value="OuterTrackerEndcapPMod1_rmax * cos(SiTrackerEndcapMod_angle/2) - OuterTrackerEndcapPMod1_rmin" /> <constant name="OuterTrackerEndcapPLayer1_rmin" value="OuterTrackerEndcapPMod1_rmin - 1*um" /> @@ -788,7 +788,7 @@ total X0 0.24% per disk layer (4 sectors per disk): <constant name="OuterTrackerEndcapPMod2_zmin" value="OuterTrackerEndcapP_zmin + 1 * OuterTrackerEndcapP_offset" /> <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_x1" value="2 * OuterTrackerEndcapPMod2_rmin * tan(SiTrackerEndcapMod_angle/2)" /> <constant name="OuterTrackerEndcapPMod2_x2" value="2 * OuterTrackerEndcapPMod2_rmax * sin(SiTrackerEndcapMod_angle/2)" /> <constant name="OuterTrackerEndcapPMod2_y" value="OuterTrackerEndcapPMod2_rmax * cos(SiTrackerEndcapMod_angle/2) - OuterTrackerEndcapPMod2_rmin" /> <constant name="OuterTrackerEndcapPLayer2_rmin" value="OuterTrackerEndcapPMod2_rmin - 1*um" /> @@ -798,7 +798,7 @@ total X0 0.24% per disk layer (4 sectors per disk): <constant name="OuterTrackerEndcapPMod3_zmin" value="OuterTrackerEndcapP_zmin + 2 * OuterTrackerEndcapP_offset" /> <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_x1" value="2 * OuterTrackerEndcapPMod3_rmin * tan(SiTrackerEndcapMod_angle/2)" /> <constant name="OuterTrackerEndcapPMod3_x2" value="2 * OuterTrackerEndcapPMod3_rmax * sin(SiTrackerEndcapMod_angle/2)" /> <constant name="OuterTrackerEndcapPMod3_y" value="OuterTrackerEndcapPMod3_rmax * cos(SiTrackerEndcapMod_angle/2) - OuterTrackerEndcapPMod3_rmin" /> <constant name="OuterTrackerEndcapPLayer3_rmin" value="OuterTrackerEndcapPMod3_rmin - 1*um" /> @@ -816,7 +816,7 @@ total X0 0.24% per disk layer (4 sectors per disk): <constant name="OuterTrackerEndcapNMod1_zmin" value="OuterTrackerEndcapN_zmin" /> <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_x1" value="2 * OuterTrackerEndcapNMod1_rmin * tan(SiTrackerEndcapMod_angle/2)" /> <constant name="OuterTrackerEndcapNMod1_x2" value="2 * OuterTrackerEndcapNMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" /> <constant name="OuterTrackerEndcapNMod1_y" value="OuterTrackerEndcapNMod1_rmax * cos(SiTrackerEndcapMod_angle/2) - OuterTrackerEndcapNMod1_rmin" /> <constant name="OuterTrackerEndcapNLayer1_rmin" value="OuterTrackerEndcapNMod1_rmin - 1*um" /> @@ -826,7 +826,7 @@ total X0 0.24% per disk layer (4 sectors per disk): <constant name="OuterTrackerEndcapNMod2_zmin" value="OuterTrackerEndcapN_zmin + 1 * OuterTrackerEndcapN_offset" /> <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_x1" value="2 * OuterTrackerEndcapNMod2_rmin * tan(SiTrackerEndcapMod_angle/2)" /> <constant name="OuterTrackerEndcapNMod2_x2" value="2 * OuterTrackerEndcapNMod2_rmax * sin(SiTrackerEndcapMod_angle/2)" /> <constant name="OuterTrackerEndcapNMod2_y" value="OuterTrackerEndcapNMod2_rmax * cos(SiTrackerEndcapMod_angle/2) - OuterTrackerEndcapNMod2_rmin" /> <constant name="OuterTrackerEndcapNLayer2_rmin" value="OuterTrackerEndcapNMod2_rmin - 1*um" /> @@ -996,14 +996,14 @@ total X0 0.24% per disk layer (4 sectors per disk): <comment> Parameters for the "ring" GEMS around the silicon tracker, which are all identical </comment> <constant name="GEMEndcapRingMod_rmin" value="SiTrackerSupportCyl_rmax + GEMFrameBotEdge_width" /> - <constant name="GEMEndcapRingMod_rmax" value="CentralTrackingRegion_rmax - GEMFrameTopEdge_width * 1.3" /> - <constant name="GEMEndcapRingMod_x1" value="2 * GEMEndcapRingMod_rmin * sin(GEMEndcapMod_angle/2)" /> + <constant name="GEMEndcapRingMod_rmax" value="min(min(GEMEndcapPDisk1_zmin, GEMEndcapN_zmin) * TrackerMainDiagonal_tan * 0.995, CentralTrackingRegion_rmax) - GEMFrameTopEdge_width" /> + <constant name="GEMEndcapRingMod_x1" value="2 * GEMEndcapRingMod_rmin * tan(GEMEndcapMod_angle/2)" /> <constant name="GEMEndcapRingMod_x2" value="2 * GEMEndcapRingMod_rmax * sin(GEMEndcapMod_angle/2)" /> <constant name="GEMEndcapRingMod_y" value="GEMEndcapRingMod_rmax * cos(GEMEndcapMod_angle/2) - GEMEndcapRingMod_rmin" /> <constant name="GEMEndcapRingModBotFrame_rmin" value="SiTrackerSupportCyl_rmax" /> <constant name="GEMEndcapRingModBotFrame_y" value="GEMFrameBotEdge_width" /> <constant name="GEMEndcapRingModBotFrame_rmax" value="(GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y)/cos(GEMEndcapMod_angle/2)" /> - <constant name="GEMEndcapRingModBotFrame_x1" value="2 * GEMEndcapRingModBotFrame_rmin * sin(GEMEndcapMod_angle/2)" /> + <constant name="GEMEndcapRingModBotFrame_x1" value="2 * GEMEndcapRingModBotFrame_rmin * tan(GEMEndcapMod_angle/2)" /> <constant name="GEMEndcapRingModBotFrame_x2" value="2 * GEMEndcapRingModBotFrame_rmax * sin(GEMEndcapMod_angle/2)" /> <constant name="GEMEndcapRingModTopFrame_rmin" value="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y" /> <constant name="GEMEndcapRingModTopFrame_y" value="GEMFrameTopEdge_width" /> @@ -1096,40 +1096,6 @@ total X0 0.24% per disk layer (4 sectors per disk): <trd x1="GEMSpoke_width/2" x2="GEMSpoke_width/2" z="GEMEndcapRingModSpoke_length/2"/> <module_component thickness="GEMSpoke_thickness" material="Mylar" vis="TrackerSupportVis"/> </module> - <module name="LargeModule" vis="TrackerGEMModuleVis"> - <trd x1="GEMEndcapLargeMod_x1/2" x2="GEMEndcapLargeMod_x2/2" z="GEMEndcapLargeMod_y/2" /> - <comment> going from back to front </comment> - <module_component name="exit_window" thickness="GEMMylar_thickness" material="Mylar" vis="TrackerServiceVis" /> - <module_component name="exit_region" thickness="GEMGas_thickness" material="Ar10CO2"/> - <module_component name="readout_cu" thickness="GEMCuElectrode_thickness" material="Copper"/> - <module_component name="readout_foil" thickness="GEMKapton_thickness" material="Kapton"/> - <module_component name="induction_region" thickness="GEMGas_thickness" material="Ar10CO2"/> - <module_component name="gem_foil_3_cu" thickness="GEMCuElectrode_thickness * GEMAreaFactor" material="Copper"/> - <module_component name="gem_foil_3" thickness="GEMKapton_thickness * GEMAreaFactor" material="Kapton"/> - <module_component name="transfer_region2" thickness="GEMGas_thickness" material="Ar10CO2"/> - <module_component name="gem_foil_2_cu" thickness="GEMCuElectrode_thickness * GEMAreaFactor" material="Copper"/> - <module_component name="gem_foil_2" thickness="GEMKapton_thickness * GEMAreaFactor" material="Kapton"/> - <module_component name="transfer_region1" thickness="GEMGas_thickness" material="Ar10CO2"/> - <module_component name="gem_foil_1_cu" thickness="GEMCuElectrode_thickness * GEMAreaFactor" material="Copper"/> - <module_component name="gem_foil_1" thickness="GEMKapton_thickness * GEMAreaFactor" material="Kapton"/> - <module_component name="drift_region" thickness="GEMDriftRegion_thickness" material="Ar10CO2" sensitive="true"/> - <module_component name="cathode_cu" thickness="GEMCuElectrode_thickness" material="Copper"/> - <module_component name="cathode_foil" thickness="GEMKapton_thickness" material="Kapton"/> - <module_component name="entrance_region" thickness="GEMGas_thickness" material="Ar10CO2"/> - <module_component name="entrance_window" thickness="GEMMylar_thickness" material="Mylar" vis="TrackerMPGDVis" /> - </module> - <module name="LargeBotFrame" vis="TrackerSupportVis"> - <trd x1="GEMEndcapLargeModBotFrame_x1/2" x2="GEMEndcapLargeModBotFrame_x2/2" z="GEMEndcapLargeModBotFrame_y/2" /> - <module_component name="frame" thickness="GEMFrame_thickness" material="CarbonFiber" vis="TrackerSupportVis" /> - </module> - <module name="LargeTopFrame" vis="TrackerSupportVis"> - <trd x1="GEMEndcapLargeModTopFrame_x1/2" x2="GEMEndcapLargeModTopFrame_x2/2" z="GEMEndcapLargeModTopFrame_y/2" /> - <module_component name="frame" thickness="GEMFrame_thickness" material="CarbonFiber" vis="TrackerSupportVis" /> - </module> - <module name="LargeSpoke" vis="TrackerSupportVis"> - <trd x1="GEMSpoke_width/2" x2="GEMSpoke_width/2" z="GEMEndcapLargeModSpoke_length/2"/> - <module_component thickness="GEMSpoke_thickness" material="Mylar" vis="TrackerSupportVis"/> - </module> <layer id="1"> <envelope vis="TrackerLayerVis" rmin="GEMEndcapRingLayer_rmin" @@ -1138,29 +1104,32 @@ total X0 0.24% per disk layer (4 sectors per disk): zstart="GEMEndcapPLayer1_zmin" /> <layer_material surface="representing" binning="binPhi,binR" bins0="20*GEMEndcapMod_count" bins1="256"/> <ring - r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="GEMEndcapMod_dz" + r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" module="RingModule" /> <ring - r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="GEMEndcapMod_dz" + r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingModule" /> + <ring + r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" module="RingBotFrame" /> <ring - r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="GEMEndcapMod_dz" + r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingBotFrame" /> + <ring + r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" module="RingTopFrame" /> <ring - r="GEMEndcapRingModSpoke_r" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="0" - phi0="GEMEndcapMod_angle/2" + r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingTopFrame" /> + <ring + r="GEMEndcapRingModSpoke_r" zstart="0" dz="0" + nmodules="GEMEndcapMod_count/2" phi0="3*GEMEndcapMod_angle/2" module="RingSpoke" /> </layer> <layer id="2"> @@ -1171,63 +1140,33 @@ total X0 0.24% per disk layer (4 sectors per disk): zstart="GEMEndcapPLayer2_zmin" /> <layer_material surface="representing" binning="binPhi,binR" bins0="20*GEMEndcapMod_count" bins1="256"/> <ring - r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="GEMEndcapMod_dz" + r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" module="RingModule" /> <ring - r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="GEMEndcapMod_dz" - module="RingBotFrame" /> - <ring - r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="GEMEndcapMod_dz" - module="RingTopFrame" /> + r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingModule" /> <ring - r="GEMEndcapRingModSpoke_r" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="0" - phi0="GEMEndcapMod_angle/2" - module="RingSpoke" /> - </layer> - <layer id="3"> - <envelope vis="TrackerLayerVis" - rmin="GEMEndcapLargeLayer_rmin" - rmax="GEMEndcapLargeLayer_rmax" - length="GEMEndcapLayer_thickness" - zstart="GEMEndcapPLayer3_zmin" /> - <layer_material surface="representing" binning="binPhi,binR" bins0="20*GEMEndcapMod_count" bins1="256"/> + r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingBotFrame" /> <ring - r="GEMEndcapLargeMod_rmin + GEMEndcapLargeMod_y/2" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="GEMEndcapMod_dz" - module="LargeModule" /> + r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingBotFrame" /> <ring - r="GEMEndcapLargeModBotFrame_rmin + GEMEndcapLargeModBotFrame_y/2" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="GEMEndcapMod_dz" - module="LargeBotFrame" /> + r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingTopFrame" /> <ring - r="GEMEndcapLargeModTopFrame_rmin + GEMEndcapLargeModTopFrame_y/2" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="GEMEndcapMod_dz" - module="LargeTopFrame" /> + r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingTopFrame" /> <ring - r="GEMEndcapLargeModSpoke_r" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="0" - phi0="GEMEndcapMod_angle/2" - module="LargeSpoke" /> + r="GEMEndcapRingModSpoke_r" zstart="0" dz="0" + nmodules="GEMEndcapMod_count/2" phi0="3*GEMEndcapMod_angle/2" + module="RingSpoke" /> </layer> </detector> <detector @@ -1313,29 +1252,32 @@ total X0 0.24% per disk layer (4 sectors per disk): zstart="GEMEndcapNLayer1_zmin" /> <layer_material surface="representing" binning="binPhi,binR" bins0="20*GEMEndcapMod_count" bins1="256"/> <ring - r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="GEMEndcapMod_dz" + r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" module="RingModule" /> <ring - r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="GEMEndcapMod_dz" + r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingModule" /> + <ring + r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" module="RingBotFrame" /> <ring - r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="GEMEndcapMod_dz" + r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingBotFrame" /> + <ring + r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" module="RingTopFrame" /> <ring - r="GEMEndcapRingModSpoke_r" - zstart="0" - nmodules="GEMEndcapMod_count" - dz="0" - phi0="GEMEndcapMod_angle/2" + r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingTopFrame" /> + <ring + r="GEMEndcapRingModSpoke_r" zstart="0" dz="0" + nmodules="GEMEndcapMod_count/2" phi0="3*GEMEndcapMod_angle/2" module="RingSpoke" /> </layer> <layer id="2"> @@ -1346,30 +1288,108 @@ total X0 0.24% per disk layer (4 sectors per disk): zstart="GEMEndcapNLayer2_zmin" /> <layer_material surface="representing" binning="binPhi,binR" bins0="20*GEMEndcapMod_count" bins1="256"/> <ring - r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" + r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingModule" /> + <ring + r="GEMEndcapRingMod_rmin + GEMEndcapRingMod_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingModule" /> + <ring + r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingBotFrame" /> + <ring + r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingBotFrame" /> + <ring + r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="GEMEndcapMod_angle" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingTopFrame" /> + <ring + r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" zstart="0" dz="GEMEndcapMod_dz" + phi0="0*degree" dphi="GEMEndcapMod_angle" nmodules="GEMEndcapMod_count/2" + module="RingTopFrame" /> + <ring + r="GEMEndcapRingModSpoke_r" zstart="0" dz="0" + nmodules="GEMEndcapMod_count/2" phi0="3*GEMEndcapMod_angle/2" + module="RingSpoke" /> + </layer> + </detector> + <detector + id="TrackerEndcapP_4_ID" + name="ForwardGEM" + type="athena_TrapEndcapTracker" + readout="GEMTrackerEndcapHits" + vis="TrackerVis" + reflect="false"> + <module name="LargeModule" vis="TrackerGEMModuleVis"> + <trd x1="GEMEndcapLargeMod_x1/2" x2="GEMEndcapLargeMod_x2/2" z="GEMEndcapLargeMod_y/2" /> + <comment> going from back to front </comment> + <module_component name="exit_window" thickness="GEMMylar_thickness" material="Mylar" vis="TrackerServiceVis" /> + <module_component name="exit_region" thickness="GEMGas_thickness" material="Ar10CO2"/> + <module_component name="readout_cu" thickness="GEMCuElectrode_thickness" material="Copper"/> + <module_component name="readout_foil" thickness="GEMKapton_thickness" material="Kapton"/> + <module_component name="induction_region" thickness="GEMGas_thickness" material="Ar10CO2"/> + <module_component name="gem_foil_3_cu" thickness="GEMCuElectrode_thickness * GEMAreaFactor" material="Copper"/> + <module_component name="gem_foil_3" thickness="GEMKapton_thickness * GEMAreaFactor" material="Kapton"/> + <module_component name="transfer_region2" thickness="GEMGas_thickness" material="Ar10CO2"/> + <module_component name="gem_foil_2_cu" thickness="GEMCuElectrode_thickness * GEMAreaFactor" material="Copper"/> + <module_component name="gem_foil_2" thickness="GEMKapton_thickness * GEMAreaFactor" material="Kapton"/> + <module_component name="transfer_region1" thickness="GEMGas_thickness" material="Ar10CO2"/> + <module_component name="gem_foil_1_cu" thickness="GEMCuElectrode_thickness * GEMAreaFactor" material="Copper"/> + <module_component name="gem_foil_1" thickness="GEMKapton_thickness * GEMAreaFactor" material="Kapton"/> + <module_component name="drift_region" thickness="GEMDriftRegion_thickness" material="Ar10CO2" sensitive="true"/> + <module_component name="cathode_cu" thickness="GEMCuElectrode_thickness" material="Copper"/> + <module_component name="cathode_foil" thickness="GEMKapton_thickness" material="Kapton"/> + <module_component name="entrance_region" thickness="GEMGas_thickness" material="Ar10CO2"/> + <module_component name="entrance_window" thickness="GEMMylar_thickness" material="Mylar" vis="TrackerMPGDVis" /> + </module> + <module name="LargeBotFrame" vis="TrackerSupportVis"> + <trd x1="GEMEndcapLargeModBotFrame_x1/2" x2="GEMEndcapLargeModBotFrame_x2/2" z="GEMEndcapLargeModBotFrame_y/2" /> + <module_component name="frame" thickness="GEMFrame_thickness" material="CarbonFiber" vis="TrackerSupportVis" /> + </module> + <module name="LargeTopFrame" vis="TrackerSupportVis"> + <trd x1="GEMEndcapLargeModTopFrame_x1/2" x2="GEMEndcapLargeModTopFrame_x2/2" z="GEMEndcapLargeModTopFrame_y/2" /> + <module_component name="frame" thickness="GEMFrame_thickness" material="CarbonFiber" vis="TrackerSupportVis" /> + </module> + <module name="LargeSpoke" vis="TrackerSupportVis"> + <trd x1="GEMSpoke_width/2" x2="GEMSpoke_width/2" z="GEMEndcapLargeModSpoke_length/2"/> + <module_component thickness="GEMSpoke_thickness" material="Mylar" vis="TrackerSupportVis"/> + </module> + <layer id="1"> + <envelope vis="TrackerLayerVis" + rmin="GEMEndcapLargeLayer_rmin" + rmax="GEMEndcapLargeLayer_rmax" + length="GEMEndcapLayer_thickness" + zstart="GEMEndcapPLayer3_zmin" /> + <layer_material surface="representing" binning="binPhi,binR" bins0="20*GEMEndcapMod_count" bins1="256"/> + <ring + r="GEMEndcapLargeMod_rmin + GEMEndcapLargeMod_y/2" zstart="0" nmodules="GEMEndcapMod_count" dz="GEMEndcapMod_dz" - module="RingModule" /> + module="LargeModule" /> <ring - r="GEMEndcapRingModBotFrame_rmin + GEMEndcapRingModBotFrame_y/2" + r="GEMEndcapLargeModBotFrame_rmin + GEMEndcapLargeModBotFrame_y/2" zstart="0" nmodules="GEMEndcapMod_count" dz="GEMEndcapMod_dz" - module="RingBotFrame" /> + module="LargeBotFrame" /> <ring - r="GEMEndcapRingModTopFrame_rmin + GEMEndcapRingModTopFrame_y/2" + r="GEMEndcapLargeModTopFrame_rmin + GEMEndcapLargeModTopFrame_y/2" zstart="0" nmodules="GEMEndcapMod_count" dz="GEMEndcapMod_dz" - module="RingTopFrame" /> + module="LargeTopFrame" /> <ring - r="GEMEndcapRingModSpoke_r" + r="GEMEndcapLargeModSpoke_r" zstart="0" nmodules="GEMEndcapMod_count" dz="0" phi0="GEMEndcapMod_angle/2" - module="RingSpoke" /> + module="LargeSpoke" /> </layer> </detector> </detectors> diff --git a/compact/definitions.xml b/compact/definitions.xml index c8744e9f30e7eb6301f24a5be812c13642ee5590..7ce5757eb67b9e3bf956462957b29ea218e331b2 100644 --- a/compact/definitions.xml +++ b/compact/definitions.xml @@ -311,6 +311,13 @@ Examples: <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)))" /> + <constant name="Eta4_2_tan" value="tan(2*atan(exp(-4.2)))" /> + <constant name="Eta4_3_tan" value="tan(2*atan(exp(-4.3)))" /> + <constant name="Eta4_4_tan" value="tan(2*atan(exp(-4.4)))" /> + <constant name="Eta4_5_tan" value="tan(2*atan(exp(-4.5)))" /> + <constant name="Eta4_6_tan" value="tan(2*atan(exp(-4.6)))" /> + <constant name="Eta4_7_tan" value="tan(2*atan(exp(-4.7)))" /> + <constant name="Eta4_8_tan" value="tan(2*atan(exp(-4.8)))" /> <comment>Solenoid option</comment> @@ -381,11 +388,11 @@ Examples: <constant name="ForwardPIDRegion_zmin" value="CentralTrackingRegionP_zmax" /> <constant name="ForwardPIDRegion_length" value="140.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="ForwardPIDRegion_tan1" value="CentralTrackingRegionP_tan * 0.88" /> + <constant name="ForwardPIDRegion_tan2" value="Eta3_6_tan * 0.89" /> <constant name="BackwardPIDRegion_zmin" value="CentralTrackingRegionN_zmax" /> - <constant name="BackwardPIDRegion_tan" value="CentralTrackingRegionN_tan" /> + <constant name="BackwardPIDRegion_tan" value="CentralTrackingRegionN_tan * 0.92" /> <constant name="BackwardPIDRegion_length" value="60.0*cm" /> <constant name="BackwardPIDRegion_rmax" value="CentralTrackingRegion_rmax" /> @@ -429,7 +436,12 @@ Service gaps in FW direction (before endcapP ECAL) and BW direction (before endc <constant name="EcalEndcapN_zmin" value="BackwardPIDRegion_zmin + BackwardInnerEndcapRegion_length"/> <constant name="EcalEndcapN_length" value="60*cm" /> - <constant name="EcalEndcapN_rmin" value="max((EcalEndcapN_zmin + EcalEndcapN_length) * tan(abs(CrossingAngle)) + 15.5 * mm, 5*cm)" /> + <comment> + rmin1: rmin round electron pipe (ignoring the hadron pipe) + rmin2: rmin around both beam pipes + </comment> + <constant name="EcalEndcapN_rmin1" value="Eta4_6_tan * EcalEndcapN_zmin" /> + <constant name="EcalEndcapN_rmin2" value="Eta4_1_tan * EcalEndcapN_zmin" /> <constant name="EcalEndcapN_rmax" value="CentralTrackingRegion_rmax" /> <constant name="EcalBarrelRegion_thickness" value="45.0*cm"/> diff --git a/compact/display.xml b/compact/display.xml index cb021b22a60df4930cba2eb8aefa4bf7d52d7219..7cb035a0dfcabfd998a7b59a520b9f3e82c569bd 100644 --- a/compact/display.xml +++ b/compact/display.xml @@ -125,6 +125,7 @@ <vis name="DRICH_filter_vis" alpha="1.0" r="1.0" g="1.0" b="0.0" showDaughters="true" visible="true" /> <vis name="DRICH_mirror_vis" ref="AnlGray" showDaughters="true" visible="true" /> <vis name="DRICH_sensor_vis" ref="AnlBlue" showDaughters="true" visible="true" /> + <vis name="ERICH_sensor_vis" ref="AnlBlue" showDaughters="true" visible="true" /> <vis name="MRICH_aerogel_vis" ref="AnlTeal" showDaughters="true" visible="true" /> <vis name="MRICH_frame_vis" ref="AnlGold" showDaughters="true" visible="true" /> diff --git a/compact/display_geoviewer.xml b/compact/display_geoviewer.xml index 4dc26ceb3701342bbd2c37edf213cfc4b75d2fe0..42555347086562e9421ed9ea74bdec316e8d36c5 100644 --- a/compact/display_geoviewer.xml +++ b/compact/display_geoviewer.xml @@ -114,6 +114,7 @@ <vis name="DRICH_filter_vis" alpha="1.0" r="1.0" g="1.0" b="0.0" showDaughters="true" visible="true" /> <vis name="DRICH_mirror_vis" ref="AnlGray" showDaughters="true" visible="true" /> <vis name="DRICH_sensor_vis" ref="AnlGreen" showDaughters="true" visible="true" /> + <vis name="ERICH_sensor_vis" ref="AnlBlue" showDaughters="true" visible="false" /> <!-- invisible, to speedup graphics --> <vis name="MRICH_aerogel_vis" ref="AnlTeal" showDaughters="true" visible="true" /> <vis name="MRICH_frame_vis" ref="AnlGold" showDaughters="true" visible="true" /> diff --git a/compact/drich.xml b/compact/drich.xml index 1aa239f23f864966ce87ee3e391db4a383d9cd37..9c27e4db2a0e29a885b630bc3278fe0a39596d33 100644 --- a/compact/drich.xml +++ b/compact/drich.xml @@ -94,13 +94,14 @@ 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 (at the front plane; radial bounds are conical) - `phiw`: azimuthal width of wedge - `thickness`: radiator thickness, defined separately for aerogel and filter - - `frontplane`: front of the aerogel, w.r.t. front plane of the vessel envelope - `pitch`: controls the angle of the radiator (0=vertical) </documentation> <radiator - rmin="DRICH_rmin0 + DRICH_wall_thickness + 2.0*cm" + rmin="DRICH_rmin0 + DRICH_wall_thickness + 0.2*cm" rmax="DRICH_rmax0 - DRICH_wall_thickness - 0.2*cm" phiw="60*degree" frontplane="DRICH_window_thickness + 0.5*DRICH_aerogel_thickness" @@ -142,17 +143,16 @@ material="Acrylic_DRICH" surface="MirrorSurface_DRICH" vis="DRICH_mirror_vis" - backplane="DRICH_window_thickness + 5.0*cm" + backplane="DRICH_window_thickness + 1.0*cm" rmin="DRICH_rmin1 + DRICH_wall_thickness - 1.0*cm" - rmax="DRICH_rmax2 - DRICH_wall_thickness - 5.0*cm" + rmax="DRICH_rmax2 - DRICH_wall_thickness - 1.0*cm" phiw="59.5*degree" thickness="0.2*cm" - focus_tune_x="40.0*cm" - focus_tune_z="-30.0*cm" + focus_tune_x="30.0*cm" + focus_tune_z="-40.0*cm" debug="DRICH_debug_mirror" /> - <!-- /detectors/detector/sensors --> <documentation level="10"> #### Sensors @@ -205,14 +205,14 @@ - `zmin`: z-plane cut </documentation> <sphere - centerz="-80.0 * cm" + centerz="-55.0 * cm" centerx="DRICH_rmax2 - 35.0*cm" - radius="100.0 * cm" + radius="85.0 * cm" debug="DRICH_debug_sensors" /> <sphericalpatch phiw="18*degree" - rmin="DRICH_rmax1 + 0.0*cm" + rmin="DRICH_rmax1 + 5.0*cm" rmax="DRICH_rmax2 - 5.0*cm" zmin="DRICH_SnoutLength + 5.0*cm" /> diff --git a/compact/ecal_backward_hybrid.xml b/compact/ecal_backward_hybrid.xml index 9115722f9eee729507e90407d2be5c0d5b2b4d3d..e7b8380d0c6558784c14ac674ccaf968bf2cef73 100644 --- a/compact/ecal_backward_hybrid.xml +++ b/compact/ecal_backward_hybrid.xml @@ -34,6 +34,8 @@ <constant name="GlassModule_wrap" value="2*CrystalModule_wrap"/> <constant name="GlassModule_z0" value="0.0*cm"/> + <constant name="EcalEndcapNIonCutout_dphi" value="30*degree"/> + <constant name="EcalEndcapN_thickness" value="GlassModule_length"/> <constant name="EcalEndcapN_z0" value="-EcalEndcapN_zmin - EcalEndcapN_thickness/2"/> <constant name="EcalEndcapNCrystal_rmax" value="40*cm"/> diff --git a/compact/erich.xml b/compact/erich.xml index 0dca595123975379eefb9b87f72fc069f6f70191..f678748c905df9d6475a994458363394f5fffb4d 100644 --- a/compact/erich.xml +++ b/compact/erich.xml @@ -13,10 +13,11 @@ <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_active_size" value="24.0*mm"/> <!-- sensor side length (effective area) --> +<constant name="ERICH_sensor_full_size" value="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 --> +<constant name="ERICH_sensor_dist" value="40*cm"/> <!-- distance between aerogel exit plane and sensor entrance plane --> +<constant name="ERICH_num_px" value="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 @@ -55,7 +56,6 @@ - `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> @@ -67,7 +67,6 @@ rmin1="ERICH_rmin1" rmax0="ERICH_rmax" rmax1="ERICH_rmax" - nsectors="6" wall_thickness="ERICH_wall_thickness" window_thickness="ERICH_window_thickness" /> @@ -81,14 +80,14 @@ 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 + - `rmin` and `rmax`: inner and outer radius (at the front plane; radial bounds are conical) - `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" + rmin="ERICH_rmin0 + ERICH_wall_thickness + 0.2*cm" rmax="(ERICH_rmax/ERICH_zmax)*ERICH_zmin + 8.0*cm" phiw="60*degree" pitch="0*degree" @@ -132,7 +131,7 @@ <module material="Silicon" surface="SensorSurface_DRICH" - vis="DRICH_sensor_vis" + vis="ERICH_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" @@ -144,20 +143,26 @@ ##### 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 + - `sensordist`: distance between sensor plane active surface (e.g., photocathode) and aerogel backplane - `rmin`: minimum radial position of a sensor's centroid - `rmax`: maximum radial position of a sensor's centroid </documentation> <plane - frontplane="-40*cm" + sensordist="ERICH_sensor_dist" rmin="ERICH_rmin1 + 2*cm" rmax="ERICH_rmax - 4*cm" /> <services> - <comment> SJJ: random standin for readout + electronics + cooling @FIXME </comment> - <component name="aluminum" thickness="10*mm" vis="RICHServiceVis" material="Aluminum"/> + <comment> + Material should be equivallent with 3x0.5cm Al, spread over the entire available distance. + This was confirmed by Silvia. + </comment> + <component name="aluminum" thickness="5*mm" vis="RICHServiceVis" material="Aluminum"/> + <component name="air" thickness="40*mm" vis="InvisibleNoDaughters" material="Air"/> + <component name="aluminum" thickness="5*mm" vis="RICHServiceVis" material="Aluminum"/> + <component name="air" thickness="40*mm" vis="InvisibleNoDaughters" material="Air"/> + <component name="aluminum" thickness="5*mm" vis="RICHServiceVis" material="Aluminum"/> </services> </sensors> diff --git a/compact/materials.xml b/compact/materials.xml index dd89084b2f3c19e9d097085325314a5fdd848753..bdc108fccfc954bd6cf2d6d4f4d81e5385e97cc9 100644 --- a/compact/materials.xml +++ b/compact/materials.xml @@ -348,5 +348,9 @@ <composite n="0.009" ref="H"/> <composite n="0.041" ref="C"/> </material> - + <material name="WSciFi_UCLA_Abs"> + <D type="density" value="12.4" unit="g / cm3"/> + <fraction n="0.96" ref="W"/> + <fraction n="0.04" ref="Polystyrene"/> + </material> </materials> diff --git a/compact/optical_materials.xml b/compact/optical_materials.xml index 00fe17cb860fde7ea9ad021d484aff334a9f9335..552ba5c495155b3ef861a83c401d69c697e8477f 100644 --- a/compact/optical_materials.xml +++ b/compact/optical_materials.xml @@ -427,8 +427,8 @@ 4.85156*eV 6.0*m 6.19921*eV 6.0*m "/> - <!-- dRICh aerogel --> - <matrix name="RINDEX__Aerogel_DRICH" coldim="2" values=" + <!-- dRICh aerogel, for density=0.11 g/cm3 (OLD versions are for 0.1g/cm3) --> + <matrix name="RINDEX__Aerogel_DRICH_OLD" coldim="2" values=" 1.87855*eV 1.01638 1.96673*eV 1.01642 2.0549*eV 1.01647 @@ -480,7 +480,59 @@ 6.11103*eV 1.02147 6.19921*eV 1.02167 "/> - <matrix name="ABSLENGTH__Aerogel_DRICH" coldim="2" values=" + <matrix name="RINDEX__Aerogel_DRICH" coldim="2" values=" + 1.87855*eV 1.01852 + 1.96673*eV 1.01856 + 2.05490*eV 1.01861 + 2.14308*eV 1.01866 + 2.23126*eV 1.01871 + 2.31943*eV 1.01876 + 2.40761*eV 1.01881 + 2.49579*eV 1.01887 + 2.58396*eV 1.01893 + 2.67214*eV 1.01899 + 2.76032*eV 1.01905 + 2.84849*eV 1.01912 + 2.93667*eV 1.01919 + 3.02485*eV 1.01926 + 3.11302*eV 1.01933 + 3.20120*eV 1.01941 + 3.28938*eV 1.01948 + 3.37755*eV 1.01956 + 3.46573*eV 1.01965 + 3.55391*eV 1.01973 + 3.64208*eV 1.01982 + 3.73026*eV 1.01991 + 3.81844*eV 1.02001 + 3.90661*eV 1.02010 + 3.99479*eV 1.02020 + 4.08297*eV 1.02030 + 4.17114*eV 1.02041 + 4.25932*eV 1.02052 + 4.34750*eV 1.02063 + 4.43567*eV 1.02074 + 4.52385*eV 1.02086 + 4.61203*eV 1.02098 + 4.70020*eV 1.02111 + 4.78838*eV 1.02123 + 4.87656*eV 1.02136 + 4.96473*eV 1.02150 + 5.05291*eV 1.02164 + 5.14109*eV 1.02178 + 5.22927*eV 1.02193 + 5.31744*eV 1.02208 + 5.40562*eV 1.02223 + 5.49380*eV 1.02239 + 5.58197*eV 1.02255 + 5.67015*eV 1.02271 + 5.75833*eV 1.02288 + 5.84650*eV 1.02306 + 5.93468*eV 1.02324 + 6.02286*eV 1.02342 + 6.11103*eV 1.02361 + 6.19921*eV 1.02381 + "/> + <matrix name="ABSLENGTH__Aerogel_DRICH_OLD" coldim="2" values=" 1.87855*eV 154*mm 1.96673*eV 156.17*mm 2.0549*eV 158.154*mm @@ -532,7 +584,59 @@ 6.11103*eV 7.29168*mm 6.19921*eV 6.69064*mm "/> - <matrix name="RAYLEIGH__Aerogel_DRICH" coldim="2" values=" + <matrix name="ABSLENGTH__Aerogel_DRICH" coldim="2" values=" + 1.87855*eV 140.000*mm + 1.96673*eV 141.973*mm + 2.05490*eV 143.776*mm + 2.14308*eV 145.431*mm + 2.23126*eV 146.955*mm + 2.31943*eV 148.364*mm + 2.40761*eV 149.669*mm + 2.49579*eV 150.882*mm + 2.58396*eV 152.012*mm + 2.67214*eV 153.067*mm + 2.76032*eV 154.055*mm + 2.84849*eV 154.982*mm + 2.93667*eV 155.854*mm + 3.02485*eV 156.674*mm + 3.11302*eV 157.448*mm + 3.20120*eV 158.180*mm + 3.28938*eV 158.872*mm + 3.37755*eV 159.528*mm + 3.46573*eV 160.150*mm + 3.55391*eV 160.742*mm + 3.64208*eV 147.916*mm + 3.73026*eV 128.139*mm + 3.81844*eV 111.378*mm + 3.90661*eV 97.121*mm + 3.99479*eV 84.948*mm + 4.08297*eV 74.518*mm + 4.17114*eV 65.552*mm + 4.25932*eV 57.819*mm + 4.34750*eV 51.130*mm + 4.43567*eV 45.327*mm + 4.52385*eV 40.278*mm + 4.61203*eV 35.873*mm + 4.70020*eV 32.019*mm + 4.78838*eV 28.641*mm + 4.87656*eV 25.670*mm + 4.96473*eV 23.054*mm + 5.05291*eV 20.742*mm + 5.14109*eV 18.698*mm + 5.22927*eV 16.884*mm + 5.31744*eV 15.272*mm + 5.40562*eV 13.837*mm + 5.49380*eV 12.557*mm + 5.58197*eV 11.413*mm + 5.67015*eV 10.389*mm + 5.75833*eV 9.470*mm + 5.84650*eV 8.645*mm + 5.93468*eV 7.902*mm + 6.02286*eV 7.233*mm + 6.11103*eV 6.629*mm + 6.19921*eV 6.082*mm + "/> + <matrix name="RAYLEIGH__Aerogel_DRICH_OLD" coldim="2" values=" 1.87855*eV 309.218*mm 1.96673*eV 257.383*mm 2.0549*eV 215.968*mm @@ -584,6 +688,58 @@ 6.11103*eV 2.76144*mm 6.19921*eV 2.607*mm "/> + <matrix name="RAYLEIGH__Aerogel_DRICH" coldim="2" values=" + 1.87855*eV 281.107*mm + 1.96673*eV 233.984*mm + 2.05490*eV 196.334*mm + 2.14308*eV 165.962*mm + 2.23126*eV 141.242*mm + 2.31943*eV 120.958*mm + 2.40761*eV 104.188*mm + 2.49579*eV 90.226*mm + 2.58396*eV 78.527*mm + 2.67214*eV 68.663*mm + 2.76032*eV 60.301*mm + 2.84849*eV 53.174*mm + 2.93667*eV 47.070*mm + 3.02485*eV 41.816*mm + 3.11302*eV 37.277*mm + 3.20120*eV 33.336*mm + 3.28938*eV 29.903*mm + 3.37755*eV 26.900*mm + 3.46573*eV 24.265*mm + 3.55391*eV 21.946*mm + 3.64208*eV 19.896*mm + 3.73026*eV 18.080*mm + 3.81844*eV 16.468*mm + 3.90661*eV 15.030*mm + 3.99479*eV 13.746*mm + 4.08297*eV 12.596*mm + 4.17114*eV 11.564*mm + 4.25932*eV 10.637*mm + 4.34750*eV 9.799*mm + 4.43567*eV 9.043*mm + 4.52385*eV 8.358*mm + 4.61203*eV 7.738*mm + 4.70020*eV 7.172*mm + 4.78838*eV 6.659*mm + 4.87656*eV 6.191*mm + 4.96473*eV 5.762*mm + 5.05291*eV 5.370*mm + 5.14109*eV 5.011*mm + 5.22927*eV 4.681*mm + 5.31744*eV 4.379*mm + 5.40562*eV 4.100*mm + 5.49380*eV 3.844*mm + 5.58197*eV 3.606*mm + 5.67015*eV 3.386*mm + 5.75833*eV 3.184*mm + 5.84650*eV 2.996*mm + 5.93468*eV 2.822*mm + 6.02286*eV 2.660*mm + 6.11103*eV 2.510*mm + 6.19921*eV 2.370*mm + "/> <!-- dRICh acrylic --> <matrix name="RINDEX__Acrylic_DRICH" coldim="2" values=" 4.13281*eV 1.5017 @@ -753,11 +909,20 @@ <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"/> + <material name="Aerogel_DRICH_OLD"> + <D type="density" value="0.100" unit="g/cm3"/> <comment> n_air = [dens(Si02)-dens(aerogel)] / [dens(Si02)-dens(Air) ] </comment> <fraction n=" (2.32-0.1) / (2.32-0.0012)" ref="Air"/> <fraction n="1 - (2.32-0.1) / (2.32-0.0012)" ref="SiliconDioxide"/> + <property name="RINDEX" ref="RINDEX__Aerogel_DRICH_OLD"/> + <property name="ABSLENGTH" ref="ABSLENGTH__Aerogel_DRICH_OLD"/> + <property name="RAYLEIGH" ref="RAYLEIGH__Aerogel_DRICH_OLD"/> + </material> + <material name="Aerogel_DRICH"> + <D type="density" value="0.110" unit="g/cm3"/> + <comment> n_air = [dens(Si02)-dens(aerogel)] / [dens(Si02)-dens(Air) ] </comment> + <fraction n=" (2.32-0.11) / (2.32-0.0012)" ref="Air"/> + <fraction n="1 - (2.32-0.11) / (2.32-0.0012)" ref="SiliconDioxide"/> <property name="RINDEX" ref="RINDEX__Aerogel_DRICH"/> <property name="ABSLENGTH" ref="ABSLENGTH__Aerogel_DRICH"/> <property name="RAYLEIGH" ref="RAYLEIGH__Aerogel_DRICH"/> diff --git a/compact/subsystem_views/drich_only.xml b/compact/subsystem_views/drich_only.xml index d85dad6a539987fa9d58d79b2a39d74fa04f42d4..d1dff27e3ea1654aa0db437b577a3554ba3fb3d5 100644 --- a/compact/subsystem_views/drich_only.xml +++ b/compact/subsystem_views/drich_only.xml @@ -67,7 +67,7 @@ ## dRICh only </documentation> - <include ref="ip6/beampipe.xml" /> + <include ref="ip6/beampipe.xml" /> <include ref="compact/drich.xml" /> </lccdd> diff --git a/compact/tracking_config_canyonlands.xml b/compact/tracking_config_canyonlands.xml index 153c0670d08eceda2dabe7b26f494f110b889902..574c9c8b8fc3e4d2c4aa363673471e5b250ac793 100644 --- a/compact/tracking_config_canyonlands.xml +++ b/compact/tracking_config_canyonlands.xml @@ -43,6 +43,20 @@ <composite name="OuterTrackerBarrel"/> <composite name="OuterTrackerCompositeEndcapP"/> </detector> + <!-- + <detector id="TrackerSubAssembly_3_ID" + name="EcalBarrelSubAssembly" + type="DD4hep_SubdetectorAssembly" + vis="TrackerSubAssemblyVis"> + </detector> + --> + <detector id="TrackerSubAssembly_4_ID" + name="ForwardBackwardTrackerSubAssembly" + type="DD4hep_SubdetectorAssembly" + vis="TrackerSubAssemblyVis"> + <composite name="ForwardGEM"/> + <composite name="BackwardNullTracker"/> + </detector> <detector id="TrackerCompositeEndcapN_0_ID" name="OuterTrackerCompositeEndcapN" type="athena_CompositeTracker" @@ -61,6 +75,13 @@ <composite name="OuterTrackerEndcapP"/> <composite name="GEMEndcapP"/> </detector> + <detector id="TrackerCompositeEndcapN_1_ID" + name="BackwardNullTracker" + type="athena_CompositeTracker" + actsType="endcap" + vis="TrackerSubAssemblyVis"> + <position x="0*cm" y="0*cm" z="-1*um" /> + </detector> </detectors> @@ -71,7 +92,7 @@ <plugins> <plugin name="FileLoader"> <arg value="file:calibrations/materials-map.cbor"/> - <arg value="url:https://eicweb.phy.anl.gov/EIC/detectors/athena/uploads/cff8f8d5919d8e78561e8caf2b4fad2b/material-maps.cbor"/> + <arg value="url:https://eicweb.phy.anl.gov/EIC/detectors/athena/uploads/979a4ed2d01a023b70237e39670bd31b/material-maps.cbor"/> </plugin> </plugins> diff --git a/src/BarrelCalorimeterInterlayers_geo.cpp b/src/BarrelCalorimeterInterlayers_geo.cpp index d3ed41c62a5be4edbd4202eaea3bf1123a00026d..92ac1d9320f121a7b6a28ac5aced84fedefdc8ad 100644 --- a/src/BarrelCalorimeterInterlayers_geo.cpp +++ b/src/BarrelCalorimeterInterlayers_geo.cpp @@ -284,11 +284,13 @@ void buildSupport(Detector& desc, Volume &mod_vol, xml_comp_t x_support, double beam_pos_z = -beam_thickness / 2.; double beam_center_z = support_thickness / 2. + beam_pos_z; - Box beam_vert_s(beam_thickness / 2. , trd_y, cross_thickness / 2.); + // Box beam_vert_s(beam_thickness / 2., trd_y, cross_thickness / 2.); + Box beam_vert_s(beam_thickness / 2., trd_y, beam_space_z / 2.); Box beam_hori_s(beam_width / 2., trd_y, beam_thickness / 2.); - UnionSolid T_beam_s(beam_hori_s, beam_vert_s, Position(0., 0., beam_space_z / 2.)); - UnionSolid H_beam_s(T_beam_s, beam_hori_s, Position(0., 0., support_thickness - beam_thickness)); - Volume H_beam_vol("H_beam", H_beam_s, desc.material(x_support.materialStr())); + // UnionSolid T_beam_s(beam_hori_s, beam_vert_s, Position(0., 0., beam_space_z / 2.)); + // UnionSolid H_beam_s(T_beam_s, beam_hori_s, Position(0., 0., support_thickness - beam_thickness)); + UnionSolid T_beam_s(beam_hori_s, beam_vert_s, Position(0., 0., support_thickness / 2.)); + Volume H_beam_vol("H_beam", T_beam_s, desc.material(x_support.materialStr())); H_beam_vol.setVisAttributes(desc, x_support.visStr()); // place H beams first double beam_start_x = - (n_beams - 1) * (beam_width + beam_gap) / 2.; diff --git a/src/DRich_geo.cpp b/src/DRich_geo.cpp index 388feae695e0375bc1c991861f17e2b073a1c718..a53fa0514cdec3012e55e1f8db0102615a2349de 100644 --- a/src/DRich_geo.cpp +++ b/src/DRich_geo.cpp @@ -132,6 +132,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec // snout solids double boreDelta = vesselRmin1 - vesselRmin0; + double snoutDelta = vesselRmax1 - vesselRmax0; Cone vesselSnout( snoutLength/2.0, vesselRmin0, @@ -219,6 +220,59 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec sens.setType("photoncounter"); + // BUILD RADIATOR ==================================================================== + + // attributes + double airGap = 0.01*mm; // air gap between aerogel and filter (FIXME? actually it's currently a gas gap) + + // solid and volume: create aerogel and filter + Cone aerogelSolid( + aerogelThickness/2, + radiatorRmin, + radiatorRmax, + radiatorRmin + boreDelta * aerogelThickness / vesselLength, + radiatorRmax + snoutDelta * aerogelThickness / snoutLength + ); + Cone filterSolid( + filterThickness/2, + radiatorRmin + boreDelta * (aerogelThickness + airGap) / vesselLength, + radiatorRmax + snoutDelta * (aerogelThickness + airGap) / snoutLength, + radiatorRmin + boreDelta * (aerogelThickness + airGap + filterThickness) / vesselLength, + radiatorRmax + snoutDelta * (aerogelThickness + airGap + filterThickness) / snoutLength + ); + + Volume aerogelVol( detName+"_aerogel", aerogelSolid, aerogelMat ); + Volume filterVol( detName+"_filter", 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) + originFront; + auto aerogelPV = gasvolVol.placeVolume(aerogelVol, + Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z()) // re-center to originFront + * RotationY(radiatorPitch) // change polar angle to specified pitch // FIXME: probably broken (not yet in use anyway) + ); + DetElement aerogelDE(det, "aerogel_de", 0); + aerogelDE.setPlacement(aerogelPV); + //SkinSurface aerogelSkin(desc, aerogelDE, "mirror_optical_surface", aerogelSurf, aerogelVol); + //aerogelSkin.isValid(); + + // filter placement and surface properties + if(!debug_optics) { + auto filterPV = gasvolVol.placeVolume(filterVol, + Translation3D(0., 0., airGap) // add an air gap + * 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, "filter_de", 0); + filterDE.setPlacement(filterPV); + //SkinSurface filterSkin(desc, filterDE, "mirror_optical_surface", filterSurf, filterVol); + //filterSkin.isValid(); + }; + + // SECTOR LOOP ////////////////////////////////// for(int isec=0; isec<nSectors; isec++) { @@ -230,43 +284,6 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec 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) + 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(); - }; - // BUILD SENSORS ==================================================================== @@ -370,7 +387,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec // properties sensorPV.addPhysVolID("sector", isec).addPhysVolID("module", imod); - DetElement sensorDE(det, Form("sensor_de%d_%d", isec, imod), 10000*isec+imod); + DetElement sensorDE(det, Form("sensor_de%d_%d", isec, imod), (imod<<3)|isec ); // id must match IRTAlgorithm usage sensorDE.setPlacement(sensorPV); if(!debug_optics) { SkinSurface sensorSkin(desc, sensorDE, Form("sensor_optical_surface%d", isec), sensorSurf, sensorVol); @@ -446,17 +463,6 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec double xF = xS + focusTuneX; FocusMirror(zF,xF,B); - /* - // print some calculated parameters, viz. mirror attributes - //printf("(zC,xC) = ( %.2f, %.2f )\n",zC,xC); - //printf("zS = %f\n",zS); - //printf("xS = %f\n",xS); - //printf("B = %f\n",B); - printf("zM = %f\n",zM); - printf("xM = %f\n",xM); - printf("rM = %f\n",rM); - */ - // re-define mirror attributes to be w.r.t vessel front plane double mirrorCenterZ = zM - vesselZmin; double mirrorCenterX = xM; @@ -481,6 +487,18 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec 40*degree ); + /* CAUTION: if any of the relative placements or boolean operations below + * are changed, you MUST make sure this does not break access to the sphere + * primitive and positioning in Juggler `IRTAlgorithm`; cross check the + * mirror sphere attributes carefully! + */ + /* + // PRINT MIRROR ATTRIBUTES (before any sector z-rotation) + printf("zM = %f\n",zM); // sphere centerZ, w.r.t. IP + printf("xM = %f\n",xM); // sphere centerX, w.r.t. IP + printf("rM = %f\n",rM); // sphere radius + */ + // mirror placement transformation (note: transformations are in reverse order) auto mirrorPos = Position(mirrorCenterX, 0., mirrorCenterZ) + originFront; Transform3D mirrorPlacement( diff --git a/src/ERich_geo.cpp b/src/ERich_geo.cpp index 19bf3f4653b1fca8c5bde61756480522d6500559..b10b2746a4fca2a051e52866c2690edc9c2691d6 100644 --- a/src/ERich_geo.cpp +++ b/src/ERich_geo.cpp @@ -37,7 +37,6 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec 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))); @@ -70,10 +69,10 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec 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)); + auto sensorPlaneElem = detElem.child(_Unicode(sensors)).child(_Unicode(plane)); + double sensorPlaneDist = sensorPlaneElem.attr<double>(_Unicode(sensordist)); + 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)); @@ -103,6 +102,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec */ // tank solids + double boreDelta = vesselRmin1 - vesselRmin0; Cone vesselTank(vesselLength / 2.0, vesselRmin1, vesselRmax1, vesselRmin0, vesselRmax0); Cone gasvolTank(vesselLength / 2.0 - windowThickness, vesselRmin1 + wallThickness, vesselRmax1 - wallThickness, vesselRmin0 + wallThickness, vesselRmax0 - wallThickness); @@ -147,56 +147,60 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec // 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 + + // BUILD RADIATOR ////////////////////////////////////// + + // attributes + double airGap = 0.01*mm; // air gap between aerogel and filter (FIXME? actually it's currently a gas gap) + + // solid and volume: create aerogel and filter + Cone aerogelSolid( + aerogelThickness/2, + radiatorRmin + boreDelta * aerogelThickness / vesselLength, /* at backplane */ + radiatorRmax, + radiatorRmin, /* at frontplane */ + radiatorRmax ); - 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(); - }; + Cone filterSolid( + filterThickness/2, + radiatorRmin + boreDelta * (aerogelThickness + airGap + filterThickness) / vesselLength, /* at backplane */ + radiatorRmax, + radiatorRmin + boreDelta * (aerogelThickness + airGap) / vesselLength, /* at frontplane */ + radiatorRmax + ); + Volume aerogelVol(detName + "_aerogel", aerogelSolid, aerogelMat); + Volume filterVol(detName + "_filter", 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, + Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z()) // re-center to originFront + * RotationY(radiatorPitch) // change polar angle to specified pitch // (FIXME: probably broken, currently not in use) + ); + DetElement aerogelDE(det, "aerogel_de", 0); + aerogelDE.setPlacement(aerogelPV); + // SkinSurface aerogelSkin(desc, aerogelDE, "mirror_optical_surface", aerogelSurf, aerogelVol); + // aerogelSkin.isValid(); + + // filter placement and surface properties + if (!debug_optics) { + auto filterPV = gasvolVol.placeVolume( + filterVol, + Translation3D(0., 0., -airGap) // add an airgap (FIXME: actually a gas gap) + * 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, "filter_de", 0); + filterDE.setPlacement(filterPV); + // SkinSurface filterSkin(desc, filterDE, "mirror_optical_surface", filterSurf, filterVol); + // filterSkin.isValid(); + }; - }; // END SECTOR LOOP ////////////////////////// // BUILD SENSORS /////////////////////// @@ -209,9 +213,9 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec if (!debug_optics) sensorVol.setSensitiveDetector(sens); - // sensor plane positioning: we want |`sensorPlaneFrontplane`| to be the distance between the + // sensor plane positioning: we want `sensorPlaneDist` 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; + double sensorZpos = radiatorFrontplane - aerogelThickness - sensorPlaneDist - 0.5 * sensorThickness; auto sensorPlanePos = Position(0., 0., sensorZpos) + originFront; // reference position // miscellaneous int imod = 0; // module number @@ -249,7 +253,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec // properties sensorPV.addPhysVolID("module", imod); - DetElement sensorDE(det, Form("sensor_de_%d", imod), 10000 * imod); // TODO: what is this 10000? + DetElement sensorDE(det, Form("sensor_de_%d", imod), imod); sensorDE.setPlacement(sensorPV); if (!debug_optics) { SkinSurface sensorSkin(desc, sensorDE, "sensor_optical_surface", sensorSurf, @@ -283,7 +287,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec for (xml_coll_t ci(x_service, _Unicode(component)); ci; ++ci, ncomponents++) { xml_comp_t x_comp = ci; double thickness = x_comp.thickness(); - Tube c_tube{sensorPlaneRmin, sensorPlaneRmax, thickness}; + Tube c_tube{sensorPlaneRmin, sensorPlaneRmax, thickness/2}; Volume c_vol{_toString(ncomponents, "component%d"), c_tube, desc.material(x_comp.materialStr())}; c_vol.setVisAttributes(desc, x_comp.visStr()); service_vol.placeVolume(c_vol, Position(0, 0, thickness_sum + thickness / 2.0)); diff --git a/src/FieldMapBrBz.cpp b/src/FieldMapBrBz.cpp index bcfe4ae20a86314d103f482d305bfe320c4991fc..ddac9a9f2c00af41236b993ee0b1dbe7b99b21ff 100644 --- a/src/FieldMapBrBz.cpp +++ b/src/FieldMapBrBz.cpp @@ -189,8 +189,8 @@ static Ref_t create_field_map_brbz(Detector & /*lcdd*/, xml::Handle_t handle) if( !fs::exists(fs::path(field_map_file)) ) { auto ret = std::system(("mkdir -p fieldmaps && " - "wget " + - field_map_url + " -O " + field_map_file).c_str()); + "curl --retry 5 -f " + + field_map_url + " -o " + field_map_file).c_str()); if (!fs::exists(fs::path(field_map_file))) { std::cerr << "ERROR: file, " << field_map_file << ", does not exist\n"; diff --git a/src/FileLoader.cpp b/src/FileLoader.cpp index 63c7017e4c5c113227d6efb975be2595f2459971..3ab9bdc6953ec2db1d1ab141bb76c4f748605b4d 100644 --- a/src/FileLoader.cpp +++ b/src/FileLoader.cpp @@ -38,7 +38,7 @@ long load_file( if (!fs::exists(fs::path(file))) { std::string parent_path = fs::path(file).parent_path(); auto ret = std::system(("mkdir -p " + parent_path + " && " - "wget " + url + " -O " + file).c_str()); + "curl --retry 5 -f " + url + " -o " + file).c_str()); if (!fs::exists(fs::path(file))) { std::cerr << "ERROR: file, " << file << ", does not exist\n"; std::quick_exit(1); diff --git a/src/HybridCalorimeter_geo.cpp b/src/HybridCalorimeter_geo.cpp index c7d613304491565a874d04931bbcca7076d632d1..bcc04451238df7689d823f9332e0203a33d96295 100644 --- a/src/HybridCalorimeter_geo.cpp +++ b/src/HybridCalorimeter_geo.cpp @@ -40,7 +40,9 @@ static Ref_t create_detector(Detector& desc, xml::Handle_t handle, SensitiveDete auto air_material = desc.material("Air"); double ROut = desc.constantAsDouble("EcalEndcapN_rmax"); - double RIn = desc.constantAsDouble("EcalEndcapN_rmin"); + double RIn_el = desc.constantAsDouble("EcalEndcapN_rmin1"); + double ionCutout_dphi = desc.constantAsDouble("EcalEndcapNIonCutout_dphi"); + double RIn = desc.constantAsDouble("EcalEndcapN_rmin2"); double SizeZ = desc.constantAsDouble("EcalEndcapN_thickness"); double thickness = desc.constantAsDouble("EcalEndcapN_thickness"); double trans_radius = desc.constantAsDouble("EcalEndcapNCrystal_rmax"); @@ -57,23 +59,35 @@ static Ref_t create_detector(Detector& desc, xml::Handle_t handle, SensitiveDete double Crystal_z0 = desc.constantAsDouble("CrystalModule_z0"); // RIn and ROut will define outer tube embedding the calorimeter - // centers_rin/out define the maximum radius of module centers + // centers_rmin/out define the maximum radius of module centers // so that modules are not overlapping with mother tube volume - double hypotenuse = sqrt(0.5 * glass_distance * glass_distance); - double centers_rin = RIn + hypotenuse + 1*mm; - double centers_rout = ROut - hypotenuse - 1*mm; - - const double Crystal_offset = -0.5*(Crystal_thickness - thickness); + const double glassHypotenuse = std::hypot(glass_distance, glass_distance)/2; + const double crystalHypotenuse = glassHypotenuse/2; + // Offset these values a bit so we don't miss edge-blocks + const double glassCenters_rmax = ROut - glassHypotenuse + 1 * mm; + const double crystalCenters_rmin = RIn + crystalHypotenuse - 1 * mm; + // Also limits of the inner crystal blocks fill + const double cutout_tan = tan(ionCutout_dphi/2); + const double cutout_rmin = RIn_el + crystalHypotenuse - 1 * mm; + + // Offset to align the modules at the zmin of the endcap, + const double Crystal_offset = -0.5 * (Crystal_thickness - thickness); const double Glass_offset = -0.5*(Glass_thickness - thickness); // envelope - - // Assembly assembly(detName); - - Tube outer_tube(RIn, ROut, SizeZ / 2.0, 0., 360.0 * deg); - Volume ecal_vol("negative_ecal", outer_tube, air_material); + // consists of an glass tube of the full thickness, and a crystal inner tube + // for the crystal that allows us to get closet to the beampipe without + // overlaps, and a partial electron tube that allows us to get closer to the + // electron beampipe in the region where there is no ion beampipe + Tube glass_tube(min(RIn + glassHypotenuse*2, trans_radius), ROut, SizeZ / 2.0, 0., 360.0 * deg); + Tube crystal_tube(RIn, min(RIn + glassHypotenuse*2, trans_radius), Crystal_thickness/ 2.0, 0., 360.0 * deg); + Tube electron_tube(RIn_el, RIn, Crystal_thickness / 2., ionCutout_dphi / 2., 360.0 * deg - ionCutout_dphi / 2); + UnionSolid outer_envelope(glass_tube, crystal_tube, Position(0,0,Crystal_offset)); + UnionSolid envelope(outer_envelope, electron_tube, Position(0,0,Crystal_offset)); + Volume ecal_vol("negative_ecal", envelope, air_material); ecal_vol.setVisAttributes(desc.visAttributes("HybridEcalOuterVis")); + // TODO why 1cm and not something else? double Glass_OuterR = ROut - 1 * cm ; double Glass_InnerR = trans_radius; @@ -91,9 +105,11 @@ static Ref_t create_detector(Detector& desc, xml::Handle_t handle, SensitiveDete // GLASS double diameter = 2 * Glass_OuterR; - // How many towers do we have per row/columnt? - // Add a gap + diameter as if we have N towers, we have N-1 gaps; - int towersInRow = std::ceil((diameter + Glass_Gap) / (Glass_Width + Glass_Gap)); + // Can we fit an even or odd amount of glass blocks within our rmax? + // This determines the transition points between crystal and glass as we need the + // outer crystal arangement to be in multiples of 2 (aligned with glass) + const int towersInRow = std::ceil((diameter + Glass_Gap) / (Glass_Width + Glass_Gap)); + const bool align_even = (towersInRow % 2); // Is it odd or even number of towersInRow double leftTowerPos, topTowerPos; @@ -114,109 +130,39 @@ static Ref_t create_detector(Detector& desc, xml::Handle_t handle, SensitiveDete int moduleIndex = 0; -// fmt::print("\nCE EMCAL GLASS SQUARE START\n"); -// fmt::print("Glass_thickness = {} cm;\n", Glass_thickness / cm); -// fmt::print("Glass_Width = {} cm;\n", Glass_Width / cm); -// fmt::print("Glass_Gap = {} cm;\n", Glass_Gap / cm); -// fmt::print("Glass_InnerR = {} cm;\n", Glass_InnerR / cm); -// fmt::print("Glass_OuterR = {} cm;\n", Glass_OuterR / cm); -// fmt::print("Glass_PosZ = {} cm;\n", glass_shift_z / cm); -// fmt::print("Towers in Row/Col = {} cm;\n", glass_shift_z / cm); -// fmt::print("Top left tower pos = {:<10} {:<10} cm;\n", -leftTowerPos / cm, topTowerPos / cm); -// fmt::print("#Towers info:\n"); -// fmt::print("#{:<5} {:<6} {:<3} {:<3} {:>10} {:>10} {}\n", "idx", "code", "col", "row", "x", "y", "name"); - - - // We first do a "dry run", not really placing modules, - // but figuring out the ID scheme, number of modules, etc. - int glassModuleCount = 0; - int crystalModuleCount = 0; - int firstCrystRow = 1000000; // The first row, where crystals are started - int firstCrystCol = 1000000; // The fist column, where crystals are started - for(int rowIndex=0; rowIndex < towersInRow; rowIndex++) { - for(int colIndex=0; colIndex < towersInRow; colIndex++) { - double glass_x = leftTowerPos + colIndex * glass_distance; - double glass_y = topTowerPos + rowIndex * glass_distance; - double r = sqrt(glass_x * glass_x + glass_y * glass_y); - - if (r < centers_rout && r > centers_rin) { - // we are placing something - if(r<trans_radius) { - // 4 crystal modules will be placed - crystalModuleCount+=4; - - // Finding the first col and row where crystals start - // is the same algorithm as finding a minimum in array - if(colIndex<firstCrystCol) { - firstCrystCol = colIndex; - } - if(rowIndex<firstCrystRow) { - firstCrystRow = rowIndex; - } - } - else - { - // glass module will be places - glassModuleCount++; - } - } - } - } - // fmt::print("#Towers info:\n"); - // fmt::print("#{:<5} {:<6} {:<3} {:<3} {:>10} {:>10} {}\n", "idx", "code", "col", "row", "x", "y", "name"); int glass_module_index = 0; int cryst_module_index = 0; for(int rowIndex=0; rowIndex < towersInRow; rowIndex++) { for(int colIndex=0; colIndex < towersInRow; colIndex++) { - double glass_x = leftTowerPos + colIndex * (Glass_Width + Glass_Gap); - double glass_y = topTowerPos + rowIndex * (Glass_Width + Glass_Gap); - double r = sqrt(glass_x * glass_x + glass_y * glass_y); - - if (r < centers_rout && r > centers_rin) { - int code = 1000 * rowIndex + colIndex; - std::string name = fmt::format("ce_EMCAL_glass_phys_{}", code); - - if(r<trans_radius) { - - // first crystal module - double crystal_x = glass_x - crystal_distance / 2; - double crystal_y = glass_y - crystal_distance / 2; - auto placement = ecal_vol.placeVolume(crystal_module, Position(crystal_x, crystal_y, Crystal_z0 + Crystal_offset)); - placement.addPhysVolID("sector", 1); - placement.addPhysVolID("module", cryst_module_index++); - - // second crystal module - crystal_x = glass_x + crystal_distance / 2; - crystal_y = glass_y - crystal_distance / 2; - placement = ecal_vol.placeVolume(crystal_module, Position(crystal_x, crystal_y, Crystal_z0 + Crystal_offset)); - placement.addPhysVolID("sector", 1); - placement.addPhysVolID("module", cryst_module_index++); - - // third crystal module - crystal_x = glass_x - crystal_distance / 2; - crystal_y = glass_y + crystal_distance / 2; - placement = ecal_vol.placeVolume(crystal_module, Position(crystal_x, crystal_y, Crystal_z0 + Crystal_offset)); - placement.addPhysVolID("sector", 1); - placement.addPhysVolID("module", cryst_module_index++); - - // forth crystal module - crystal_x = glass_x + crystal_distance / 2; - crystal_y = glass_y + crystal_distance / 2; - placement = ecal_vol.placeVolume(crystal_module, Position(crystal_x, crystal_y, Crystal_z0 + Crystal_offset)); - placement.addPhysVolID("sector", 1); - placement.addPhysVolID("module", cryst_module_index++); - } - else - { - // glass module - auto placement = ecal_vol.placeVolume(glass_module, Position(glass_x, glass_y, Glass_z0 + Glass_offset)); - placement.addPhysVolID("sector", 2); - placement.addPhysVolID("module", glass_module_index++); + const double glass_x = leftTowerPos + colIndex * (Glass_Width + Glass_Gap); + const double glass_y = topTowerPos + rowIndex * (Glass_Width + Glass_Gap); + const double r = std::hypot(glass_x, glass_y); + // crystal if within the transition radius (as defined by the equivalent glass + // block) + if (r < trans_radius) { + for (const auto dx : {-1, 1}) { + for (const auto& dy : {-1, 1}) { + const double crystal_x = glass_x + dx * crystal_distance / 2; + const double crystal_y = glass_y + dy * crystal_distance / 2; + const double crystal_r = std::hypot(crystal_x, crystal_y); + // check if crystal in the main crystal ring? + const bool mainRing = (crystal_r > crystalCenters_rmin); + const bool innerRing = !mainRing && crystal_r > cutout_rmin; + const bool ionCutout = crystal_x > 0 && fabs(crystal_y / crystal_x) < cutout_tan; + if (mainRing || (innerRing && !ionCutout)) { + auto placement = + ecal_vol.placeVolume(crystal_module, Position(crystal_x, crystal_y, Crystal_z0 + Crystal_offset)); + placement.addPhysVolID("sector", 1); + placement.addPhysVolID("module", cryst_module_index++); + } + } } - - - // fmt::print(" {:<5} {:<6} {:<3} {:<3} {:>10.4f} {:>10.4f} {}\n", towerIndex, code, colIndex, rowIndex, x / cm, y / cm, name); - //glass_module_index++; + // Glass block if within the rmax + } else if (r < glassCenters_rmax) { + // glass module + auto placement = ecal_vol.placeVolume(glass_module, Position(glass_x, glass_y, Glass_z0 + Glass_offset)); + placement.addPhysVolID("sector", 2); + placement.addPhysVolID("module", glass_module_index++); } } }