From 9d1184d3305784f7d3a4ef902ce967c0c491f264 Mon Sep 17 00:00:00 2001 From: Francesco Bossu <francesco.bossu@cea.fr> Date: Thu, 15 Jul 2021 17:27:32 +0200 Subject: [PATCH] MM tracker --- compact/mm_tracker_barrel.xml | 387 ++++++++++++++++++++++++++++-- src/CylinderTrackerBarrel_geo.cpp | 201 +++++++++++----- 2 files changed, 501 insertions(+), 87 deletions(-) diff --git a/compact/mm_tracker_barrel.xml b/compact/mm_tracker_barrel.xml index 6d562902..d4cb7bc0 100644 --- a/compact/mm_tracker_barrel.xml +++ b/compact/mm_tracker_barrel.xml @@ -4,18 +4,108 @@ <define> - <constant name="MMTrackerBarrel_thickness" value="TrackerBarrel_rmax - TrackerBarrel_rmax"/> + <constant name="MMTrackerBarrel_thickness" value="TrackerBarrel_rmax - TrackerBarrel_rmin"/> <constant name="MMTrackerBarrel_NLayers" value="5"/> - <constant name="MMTrackerBarrel_delta" value="MMTrackerBarrel_thickness/MMTrackerBarrel_NLayers"/> + + - <constant name="MMTrackerBarrelLayer1_rmin" value="800.0 * mm"/> - <constant name="MMTrackerBarrelLayer1_length" value="100.0 * mm"/> + <comment> global constants </comment> + <constant name="MMTrackerBarrel_maxLength" value="700.0 * mm"/> + <constant name="MMTrackerBarrel_maxWidth" value="500.0 * mm"/> + <constant name="MMTrackerBarrel_spacer" value="20.0 * mm"/> + <constant name="MMTrackerBarrel_gasGap" value="3.0 * mm"/> + <constant name="MMTrackerBarrel_support" value="20.0 * mm"/> + + <comment> constants per layers </comment> + <constant name="MMTrackerBarrelLayer1_rmin" value="465.0 * mm"/> + <constant name="MMTrackerBarrelLayer1_dz" value="0"/> + <constant name="MMTrackerBarrelLayer1_phi0" value="0"/> <constant name="MMTrackerBarrelLayer1_thickness" value="10.0 * mm"/> - <constant name="MMTrackerBarrel_NZModules" value="floor(BarrelTracking_length/MMTrackerBarrelLayer1_length)"/> + <constant name="MMTrackerBarrelLayer1_NTiles" value="ceil(MMTrackerBarrelLayer1_rmin * 2*pi / (MMTrackerBarrel_maxWidth + MMTrackerBarrel_spacer))"/> + <constant name="MMTrackerBarrelLayer1_TileWidth" value="(MMTrackerBarrelLayer1_rmin * 2*pi - MMTrackerBarrelLayer1_NTiles * MMTrackerBarrel_spacer) / MMTrackerBarrelLayer1_NTiles" /> + <constant name="MMTrackerBarrelLayer1_length" value="MMTrackerBarrel_maxLength"/> + + <constant name="MMTrackerBarrelLayer2_rmin" value="495.0 * mm"/> + <constant name="MMTrackerBarrelLayer2_dz" value="MMTrackerBarrel_support"/> + <constant name="MMTrackerBarrelLayer2_phi0" value="15*degree"/> + <constant name="MMTrackerBarrelLayer2_thickness" value="10.0 * mm"/> + <constant name="MMTrackerBarrelLayer2_NTiles" value="ceil(MMTrackerBarrelLayer2_rmin * 2*pi / (MMTrackerBarrel_maxWidth + MMTrackerBarrel_spacer))"/> + <constant name="MMTrackerBarrelLayer2_TileWidth" value="(MMTrackerBarrelLayer2_rmin * 2*pi - MMTrackerBarrelLayer2_NTiles * MMTrackerBarrel_spacer) / MMTrackerBarrelLayer2_NTiles" /> + <constant name="MMTrackerBarrelLayer2_length" value="MMTrackerBarrel_maxLength"/> + + <constant name="MMTrackerBarrelLayer3_rmin" value="690.0 * mm"/> + <constant name="MMTrackerBarrelLayer3_dz" value="MMTrackerBarrel_support"/> + <constant name="MMTrackerBarrelLayer3_phi0" value="30*degree"/> + <constant name="MMTrackerBarrelLayer3_thickness" value="10.0 * mm"/> + <constant name="MMTrackerBarrelLayer3_NTiles" value="ceil(MMTrackerBarrelLayer3_rmin * 2*pi / (MMTrackerBarrel_maxWidth + MMTrackerBarrel_spacer))"/> + <constant name="MMTrackerBarrelLayer3_TileWidth" value="(MMTrackerBarrelLayer3_rmin * 2*pi - MMTrackerBarrelLayer3_NTiles * MMTrackerBarrel_spacer) / MMTrackerBarrelLayer3_NTiles" /> + <constant name="MMTrackerBarrelLayer3_length" value="MMTrackerBarrel_maxLength"/> + + + <constant name="MMTrackerBarrelLayer4_rmin" value="720.0 * mm"/> + <constant name="MMTrackerBarrelLayer4_dz" value="0"/> + <constant name="MMTrackerBarrelLayer4_phi0" value="45*degree"/> + <constant name="MMTrackerBarrelLayer4_thickness" value="10.0 * mm"/> + <constant name="MMTrackerBarrelLayer4_NTiles" value="ceil(MMTrackerBarrelLayer4_rmin * 2*pi / (MMTrackerBarrel_maxWidth + MMTrackerBarrel_spacer))"/> + <constant name="MMTrackerBarrelLayer4_TileWidth" value="(MMTrackerBarrelLayer4_rmin * 2*pi - MMTrackerBarrelLayer4_NTiles * MMTrackerBarrel_spacer) / MMTrackerBarrelLayer4_NTiles" /> + <constant name="MMTrackerBarrelLayer4_length" value="MMTrackerBarrel_maxLength"/> + + + <constant name="MMTrackerBarrelLayer5_rmin" value="750.0 * mm"/> + <constant name="MMTrackerBarrelLayer5_dz" value="MMTrackerBarrel_support"/> + <constant name="MMTrackerBarrelLayer5_phi0" value="60*degree"/> + <constant name="MMTrackerBarrelLayer5_thickness" value="10.0 * mm"/> + <constant name="MMTrackerBarrelLayer5_NTiles" value="ceil(MMTrackerBarrelLayer5_rmin * 2*pi / (MMTrackerBarrel_maxWidth + MMTrackerBarrel_spacer))"/> + <constant name="MMTrackerBarrelLayer5_TileWidth" value="(MMTrackerBarrelLayer5_rmin * 2*pi - MMTrackerBarrelLayer5_NTiles * MMTrackerBarrel_spacer) / MMTrackerBarrelLayer5_NTiles" /> + <constant name="MMTrackerBarrelLayer5_length" value="MMTrackerBarrel_maxLength"/> + + + <constant name="MMTrackerBarrelLayer6_rmin" value="780.0 * mm"/> + <constant name="MMTrackerBarrelLayer6_dz" value="0"/> + <constant name="MMTrackerBarrelLayer6_phi0" value="75*degree"/> + <constant name="MMTrackerBarrelLayer6_thickness" value="10.0 * mm"/> + <constant name="MMTrackerBarrelLayer6_NTiles" value="ceil(MMTrackerBarrelLayer6_rmin * 2*pi / (MMTrackerBarrel_maxWidth + MMTrackerBarrel_spacer))"/> + <constant name="MMTrackerBarrelLayer6_TileWidth" value="(MMTrackerBarrelLayer6_rmin * 2*pi - MMTrackerBarrelLayer6_NTiles * MMTrackerBarrel_spacer) / MMTrackerBarrelLayer6_NTiles" /> + <constant name="MMTrackerBarrelLayer6_length" value="MMTrackerBarrel_maxLength"/> + + + + + + <constant name="MMTrackerBarrel_NZModules" value="floor(BarrelTracking_length/MMTrackerBarrel_maxLength)"/> <constant name="MMTrackerBarrelModulesTotal_length" value="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer1_length"/> </define> - + + <materials> + <material name="CopperForStrips" state="solid"> + <D type="density" unit="g/cm3" value="5.248414"/> + <composite n="1" ref="Cu"/> + </material> + + <material name="ResistivePaste" state="solid"> + <D type="density" unit="g/cm3" value="0.77906"/> + <composite n="1" ref="C"/> + </material> + + <material name="InoxForMesh" state="solid"> + <D type="density" unit="g/cm3" value="2.8548"/> + <fraction n="0.19" ref="Cr"/> + <fraction n="0.68" ref="Fe"/> + <fraction n="0.02" ref="Mn"/> + <fraction n="0.10" ref="Ni"/> + <fraction n="0.01" ref="Si"/> + </material> + + <material name="Ar90IsoButane" state="gas"> + <D type="density" unit="g/cm3" value="0.00170335"/> + <fraction n="0.90" ref="Ar"/> + <fraction n="0.0826586" ref="C"/> + <fraction n="0.0173414" ref="H"/> + </material> + + </materials> + <limits> </limits> @@ -26,26 +116,81 @@ </display> <detectors> - <detector id="MMTrackerBarrel_ID" name="MMTrackerBarrel" type="refdet_MMTrackerBarrel" readout="MMTrackerBarrelHits"> - <module name="Module1" vis="AnlGold"> + <detector id="MMTrackerBarrel_ID" + name="MMTrackerBarrel" + type="refdet_MMTrackerBarrel" + readout="MMTrackerBarrelHits" + vis="AnlRed" + > + <module name="MM_Module1" vis="AnlGold"> <module_envelope - rmin="TrackerBarrel_rmax" + rmin="MMTrackerBarrelLayer1_rmin" length="MMTrackerBarrelLayer1_length" - thickness="MMTrackerBarrel_delta" phi="90*degree" /> - <module_component thickness="1.0*mm" material="PEEK" sensitive="false"> - <position x="0" /> - </module_component> - <module_component thickness="1.0*mm" material="PEEK" sensitive="false" - length="MMTrackerBarrelLayer1_length-10.0*mm" - phi="89.0*degree" > - <position x="0" /> - </module_component> + thickness="10*mm" + phi="MMTrackerBarrelLayer1_TileWidth/(MMTrackerBarrelLayer1_rmin) * radian" /> + <comment> going from the readout side to the drift cathode </comment> + <module_component name="coverlay" thickness="0.0050000 * cm" material="Kapton"/> + <module_component name="CuGround" thickness="0.0001580 * cm" material="Copper"/> + <module_component name="PCB" thickness="0.0100000 * cm" material="Fr4"/> + <module_component name="CuStrips" thickness="0.0012000 * cm" material="Copper"/> + <module_component name="KaptonStrips" thickness="0.0075000 * cm" material="Kapton"/> + <module_component name="ResistiveStrips" thickness="0.0128000 * cm" material="ResistivePaste"/> + <module_component name="Gas1" thickness="0.0020000 * cm" material="Ar90IsoButane"/> + <module_component name="Mesh" thickness="0.0018000 * cm" material="InoxForMesh"/> + <module_component name="Gas2" + thickness="MMTrackerBarrel_gasGap" + material="Ar90IsoButane" + sensitive="true" + length="MMTrackerBarrelLayer1_length - 2 * MMTrackerBarrel_gasGap" + phi="(MMTrackerBarrelLayer1_TileWidth - 2*MMTrackerBarrel_gasGap)/(MMTrackerBarrelLayer1_rmin) * radian"/> + <module_component name="DriftCuElectrode" thickness="0.0005000 * cm" material="Copper"/> + <module_component name="DriftKapton" thickness="0.0250000 * cm" material="Kapton"/> + <module_component name="DriftCuGround" thickness="0.0000410 * cm" material="Copper"/> + + <frame material="CarbonFiber_50D" thickness="MMTrackerBarrel_gasGap" vis="AnlRed" + rmin=" + 0.0050000 + + 0.0001580 + + 0.0100000 + + 0.0012000 + + 0.0075000 + + 0.0128000 + + 0.0020000 + + 0.0018000" + > + </frame> </module> - <layer module="Module1" id="1" vis="GreenVis"> + + + <comment> small PCB on the side of each tile </comment> + <module name="MM_Module1_Meca" > + <module_envelope + rmin="MMTrackerBarrelLayer1_rmin" + length="MMTrackerBarrelLayer1_length" + thickness="1*mm" + phi="MMTrackerBarrel_spacer/(MMTrackerBarrelLayer1_rmin) * radian" /> + <module_component name="CuMeca" thickness="60 * um" material="Copper"/> + <module_component name="PCBMeca" thickness="200 * um" material="Fr4"/> + </module> + + <module name="MM_Module1_Support" > + <module_envelope + rmin="MMTrackerBarrelLayer1_rmin" + length="MMTrackerBarrel_support" + thickness="MMTrackerBarrel_support" + phi="360 * degree" /> + <module_component name="Support" + thickness="MMTrackerBarrel_support" + material="CarbonFiber_50D"/> + </module> + + + <comment> ===================== LAYER 1 ============================== </comment> + <layer module="MM_Module1" id="1" vis="GreenVis"> <barrel_envelope - inner_r="MMTrackerBarrelLayer1_rmin-20.0*mm" - outer_r="MMTrackerBarrelLayer1_rmin + 20.0*mm" - z_length="MMTrackerBarrelModulesTotal_length" /> + inner_r="MMTrackerBarrelLayer1_rmin " + outer_r="MMTrackerBarrelLayer1_rmin + 5.0*mm" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer1_length+(MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support" /> <comment> phi0 : Starting phi of first module. phi_tilt : Phi tilt of a module. @@ -56,12 +201,202 @@ nz : Number of modules to place in z. dr : Radial displacement parameter, of every other module. </comment> - <rphi_layout phi_tilt="0.0" nphi="4" phi0="0." rc="MMTrackerBarrelLayer1_rmin" dr="0.0 * mm"/> - <z_layout dr="0.0 * mm" z0="-MMTrackerBarrelModulesTotal_length/2.0 + MMTrackerBarrelLayer1_length/2.0" - nz="MMTrackerBarrel_NZModules"/> + <rphi_layout phi_tilt="0.0" nphi="MMTrackerBarrelLayer1_NTiles" phi0="MMTrackerBarrelLayer1_phi0" rc="MMTrackerBarrelLayer1_rmin" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer1_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 + MMTrackerBarrelLayer1_length/2.0" + nz="3" dz="MMTrackerBarrelLayer1_dz"/> </layer> - </detector> + + <layer module="MM_Module1_Meca" id="10" vis="RedVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer1_rmin" + outer_r="MMTrackerBarrelLayer1_rmin + 1*mm" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer1_length+(MMTrackerBarrel_NZModules)*MMTrackerBarrel_support" /> + + <rphi_layout phi_tilt="0.0" nphi="MMTrackerBarrelLayer1_NTiles" phi0="(MMTrackerBarrelLayer1_TileWidth+MMTrackerBarrel_spacer)/2/MMTrackerBarrelLayer1_rmin * radian + MMTrackerBarrelLayer1_phi0" rc="MMTrackerBarrelLayer1_rmin" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer1_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 + MMTrackerBarrelLayer1_length/2.0" + nz="3" dz="MMTrackerBarrelLayer1_dz"/> + </layer> + + + <layer module="MM_Module1_Support" id="11" vis="RedVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer1_rmin" + outer_r="MMTrackerBarrelLayer1_rmin + MMTrackerBarrel_support + 1*mm" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer1_length+(MMTrackerBarrel_NZModules+1)*MMTrackerBarrel_support" /> + <rphi_layout phi_tilt="0.0" nphi="1" phi0="0" dr="0.0 * mm" rc="MMTrackerBarrelLayer1_rmin"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer1_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 - MMTrackerBarrel_support/2" + nz="4" dz="MMTrackerBarrelLayer1_dz"/> + </layer> + + + <comment> ===================== LAYER 2 ============================== </comment> + <layer module="MM_Module1" id="2" vis="GreenVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer2_rmin " + outer_r="MMTrackerBarrelLayer2_rmin + 5.0*mm" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer2_length+(MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support + 2*MMTrackerBarrelLayer2_dz" /> + <rphi_layout phi_tilt="0.0" nphi="MMTrackerBarrelLayer2_NTiles" phi0="MMTrackerBarrelLayer2_phi0" rc="MMTrackerBarrelLayer2_rmin" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer2_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 + MMTrackerBarrelLayer2_length/2.0" + nz="3" dz="MMTrackerBarrelLayer2_dz"/> + </layer> + + <layer module="MM_Module1_Meca" id="20" vis="RedVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer2_rmin" + outer_r="MMTrackerBarrelLayer2_rmin + 1*mm" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer2_length+(MMTrackerBarrel_NZModules)*MMTrackerBarrel_support + 2*MMTrackerBarrelLayer2_dz" /> + <rphi_layout phi_tilt="0.0" nphi="MMTrackerBarrelLayer2_NTiles" phi0="(MMTrackerBarrelLayer2_TileWidth+MMTrackerBarrel_spacer)/2/MMTrackerBarrelLayer2_rmin * radian + MMTrackerBarrelLayer2_phi0" rc="MMTrackerBarrelLayer2_rmin" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer2_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 + MMTrackerBarrelLayer2_length/2.0" + nz="3" dz="MMTrackerBarrelLayer2_dz"/> + </layer> + + <layer module="MM_Module1_Support" id="21" vis="RedVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer2_rmin" + outer_r="MMTrackerBarrelLayer2_rmin + MMTrackerBarrel_support + 1*mm" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer2_length+(MMTrackerBarrel_NZModules+1)*MMTrackerBarrel_support+ 2*MMTrackerBarrelLayer2_dz" /> + <rphi_layout phi_tilt="0.0" nphi="1" phi0="0" dr="0.0 * mm" rc="MMTrackerBarrelLayer2_rmin"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer2_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 - MMTrackerBarrel_support/2" + nz="4" dz="MMTrackerBarrelLayer2_dz"/> + </layer> + + + + <comment> ===================== LAYER 3 ============================== </comment> + <layer module="MM_Module1" id="3" vis="GreenVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer3_rmin " + outer_r="MMTrackerBarrelLayer3_rmin + MMTrackerBarrel_support" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer3_length+(MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support + 2*MMTrackerBarrelLayer3_dz" /> + <rphi_layout phi_tilt="0.0" nphi="MMTrackerBarrelLayer3_NTiles" phi0="MMTrackerBarrelLayer3_phi0" rc="MMTrackerBarrelLayer3_rmin" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer3_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 + MMTrackerBarrelLayer3_length/2.0" + nz="3" dz="MMTrackerBarrelLayer3_dz"/> + </layer> + + <layer module="MM_Module1_Meca" id="30" vis="RedVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer3_rmin" + outer_r="MMTrackerBarrelLayer3_rmin + 1*mm" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer3_length+(MMTrackerBarrel_NZModules)*MMTrackerBarrel_support + 2*MMTrackerBarrelLayer3_dz" /> + <rphi_layout phi_tilt="0.0" nphi="MMTrackerBarrelLayer3_NTiles" phi0="(MMTrackerBarrelLayer3_TileWidth+MMTrackerBarrel_spacer)/2/MMTrackerBarrelLayer3_rmin * radian + MMTrackerBarrelLayer3_phi0" rc="MMTrackerBarrelLayer3_rmin" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer3_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 + MMTrackerBarrelLayer3_length/2.0" + nz="3" dz="MMTrackerBarrelLayer3_dz"/> + </layer> + + <layer module="MM_Module1_Support" id="31" vis="RedVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer3_rmin" + outer_r="MMTrackerBarrelLayer3_rmin + MMTrackerBarrel_support + 1*mm" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer3_length+(MMTrackerBarrel_NZModules+1)*MMTrackerBarrel_support + 2*MMTrackerBarrelLayer3_dz" /> + <rphi_layout phi_tilt="0.0" nphi="1" phi0="0" dr="0.0 * mm" rc="MMTrackerBarrelLayer3_rmin"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer3_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 - MMTrackerBarrel_support/2" + nz="4" dz="MMTrackerBarrelLayer3_dz"/> + </layer> + + + + <comment> ===================== LAYER 4 ============================== </comment> + <layer module="MM_Module1" id="4" vis="GreenVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer4_rmin " + outer_r="MMTrackerBarrelLayer4_rmin + 5.0*mm" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer4_length+(MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support + 2*MMTrackerBarrelLayer4_dz" /> + <rphi_layout phi_tilt="0.0" nphi="MMTrackerBarrelLayer4_NTiles" phi0="MMTrackerBarrelLayer4_phi0" rc="MMTrackerBarrelLayer4_rmin" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer4_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 + MMTrackerBarrelLayer4_length/2.0" + nz="3" dz="MMTrackerBarrelLayer4_dz"/> + </layer> + + <layer module="MM_Module1_Meca" id="40" vis="RedVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer4_rmin" + outer_r="MMTrackerBarrelLayer4_rmin + 1*mm" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer4_length+(MMTrackerBarrel_NZModules)*MMTrackerBarrel_support + 2*MMTrackerBarrelLayer4_dz" /> + <rphi_layout phi_tilt="0.0" nphi="MMTrackerBarrelLayer4_NTiles" phi0="(MMTrackerBarrelLayer4_TileWidth+MMTrackerBarrel_spacer)/2/MMTrackerBarrelLayer4_rmin * radian + MMTrackerBarrelLayer4_phi0" rc="MMTrackerBarrelLayer4_rmin" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer4_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 + MMTrackerBarrelLayer4_length/2.0" + nz="3" dz="MMTrackerBarrelLayer4_dz"/> + </layer> + + <layer module="MM_Module1_Support" id="41" vis="RedVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer4_rmin" + outer_r="MMTrackerBarrelLayer4_rmin + MMTrackerBarrel_support" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer4_length+(MMTrackerBarrel_NZModules+1)*MMTrackerBarrel_support+ 2*MMTrackerBarrelLayer4_dz" /> + <rphi_layout phi_tilt="0.0" nphi="1" phi0="0" dr="0.0 * mm" rc="MMTrackerBarrelLayer4_rmin"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer4_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 - MMTrackerBarrel_support/2" + nz="4" dz="MMTrackerBarrelLayer4_dz"/> + </layer> + + + + <comment> ===================== LAYER 5 ============================== </comment> + <layer module="MM_Module1" id="5" vis="GreenVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer5_rmin " + outer_r="MMTrackerBarrelLayer5_rmin + MMTrackerBarrel_support + 1*mm" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer5_length+(MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support + 2*MMTrackerBarrelLayer5_dz" /> + <rphi_layout phi_tilt="0.0" nphi="MMTrackerBarrelLayer5_NTiles" phi0="MMTrackerBarrelLayer5_phi0" rc="MMTrackerBarrelLayer5_rmin" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer5_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 + MMTrackerBarrelLayer5_length/2.0" + nz="3" dz="MMTrackerBarrelLayer5_dz"/> + </layer> + + <layer module="MM_Module1_Meca" id="50" vis="RedVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer5_rmin" + outer_r="MMTrackerBarrelLayer5_rmin + 1*mm" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer5_length+(MMTrackerBarrel_NZModules)*MMTrackerBarrel_support + 2*MMTrackerBarrelLayer5_dz" /> + <rphi_layout phi_tilt="0.0" nphi="MMTrackerBarrelLayer5_NTiles" phi0="(MMTrackerBarrelLayer5_TileWidth+MMTrackerBarrel_spacer)/2/MMTrackerBarrelLayer5_rmin * radian + MMTrackerBarrelLayer5_phi0" rc="MMTrackerBarrelLayer5_rmin" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer5_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 + MMTrackerBarrelLayer5_length/2.0" + nz="3" dz="MMTrackerBarrelLayer5_dz"/> + </layer> + + <layer module="MM_Module1_Support" id="51" vis="RedVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer5_rmin" + outer_r="MMTrackerBarrelLayer5_rmin + MMTrackerBarrel_support" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer5_length+(MMTrackerBarrel_NZModules+1)*MMTrackerBarrel_support + 2*MMTrackerBarrelLayer5_dz" /> + <rphi_layout phi_tilt="0.0" nphi="1" phi0="0" dr="0.0 * mm" rc="MMTrackerBarrelLayer5_rmin"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer5_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 - MMTrackerBarrel_support/2" + nz="4" dz="MMTrackerBarrelLayer5_dz"/> + </layer> + + + + + <comment> ===================== LAYER 6 ============================== </comment> + <layer module="MM_Module1" id="6" vis="GreenVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer6_rmin " + outer_r="MMTrackerBarrelLayer6_rmin + MMTrackerBarrel_support + 1*mm" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer6_length+(MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support + 2*MMTrackerBarrelLayer6_dz" /> + <rphi_layout phi_tilt="0.0" nphi="MMTrackerBarrelLayer6_NTiles" phi0="MMTrackerBarrelLayer6_phi0" rc="MMTrackerBarrelLayer6_rmin" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer6_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 + MMTrackerBarrelLayer6_length/2.0" + nz="3" dz="MMTrackerBarrelLayer6_dz"/> + </layer> + + <layer module="MM_Module1_Meca" id="60" vis="RedVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer6_rmin" + outer_r="MMTrackerBarrelLayer6_rmin + 1*mm" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer6_length+(MMTrackerBarrel_NZModules)*MMTrackerBarrel_support + 2*MMTrackerBarrelLayer6_dz" /> + <rphi_layout phi_tilt="0.0" nphi="MMTrackerBarrelLayer6_NTiles" phi0="(MMTrackerBarrelLayer6_TileWidth+MMTrackerBarrel_spacer)/2/MMTrackerBarrelLayer6_rmin * radian + MMTrackerBarrelLayer6_phi0" rc="MMTrackerBarrelLayer6_rmin" dr="0.0 * mm"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer6_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 + MMTrackerBarrelLayer6_length/2.0" + nz="3" dz="MMTrackerBarrelLayer6_dz"/> + </layer> + + <layer module="MM_Module1_Support" id="61" vis="RedVis"> + <barrel_envelope + inner_r="MMTrackerBarrelLayer6_rmin" + outer_r="MMTrackerBarrelLayer6_rmin + MMTrackerBarrel_support" + z_length="MMTrackerBarrel_NZModules*MMTrackerBarrelLayer6_length+(MMTrackerBarrel_NZModules+1)*MMTrackerBarrel_support" /> + <rphi_layout phi_tilt="0.0" nphi="1" phi0="0" dr="0.0 * mm" rc="MMTrackerBarrelLayer6_rmin"/> + <z_layout dr="0.0 * mm" z0="-(MMTrackerBarrel_NZModules*MMTrackerBarrelLayer6_length + (MMTrackerBarrel_NZModules-1)*MMTrackerBarrel_support )/2.0 - MMTrackerBarrel_support/2" + nz="4" dz="MMTrackerBarrelLayer6_dz"/> + </layer> + + + + </detector> </detectors> <readouts> diff --git a/src/CylinderTrackerBarrel_geo.cpp b/src/CylinderTrackerBarrel_geo.cpp index be2f1199..69fe9c5a 100644 --- a/src/CylinderTrackerBarrel_geo.cpp +++ b/src/CylinderTrackerBarrel_geo.cpp @@ -11,6 +11,9 @@ using namespace std; using namespace dd4hep; using namespace dd4hep::detail; + +Assembly getModule( string m_nam, int n, xml_det_t x_det, double module_rmin, Detector& description, SensitiveDetector sens, map<string, vector<PlacedVolume>> &sensitives); + /** A barrel tracker with a module that is curved (not flat). * * @@ -32,68 +35,19 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s Assembly assembly(det_name); map<string, Volume> mod_volumes; map<string, Placements> sensitives; + map<string, xml_comp_t> modules; PlacedVolume pv; sens.setType("tracker"); - int n_modules = 0; - for (xml_coll_t mi(x_det, _U(module)); mi; ++mi) { - n_modules++; - xml_comp_t x_mod = mi; - xml_comp_t m_env = x_mod.child(_U(module_envelope)); - string m_nam = x_mod.nameStr(); - - Assembly module_assembly(_toString(n_modules, "mod_assembly_%d")); - auto module_rmin = m_env.rmin(); - auto module_thickness = m_env.thickness(); - auto module_length = m_env.length(); - auto module_phi = getAttrOrDefault(m_env, _Unicode(phi), 90.0); - - Volume m_vol(m_nam, Tube(module_rmin, module_rmin + module_thickness, module_length / 2), air); - int ncomponents = 0, sensor_number = 1; - module_assembly.placeVolume(m_vol, Position(-module_rmin, 0, 0)); - mod_volumes[m_nam] = module_assembly; - m_vol.setVisAttributes(description.visAttributes(x_mod.visStr())); - - auto comp_rmin = module_rmin; - for (xml_coll_t ci(x_mod, _U(module_component)); ci; ++ci, ++ncomponents) { - xml_comp_t x_comp = ci; - xml_comp_t x_pos = x_comp.position(false); - xml_comp_t x_rot = x_comp.rotation(false); - string c_nam = _toString(ncomponents, "component%d"); - - auto comp_thickness = x_comp.thickness(); - comp_rmin = getAttrOrDefault(x_comp, _Unicode(rmin), comp_rmin); - auto comp_phi = getAttrOrDefault(x_comp, _Unicode(phi), module_phi); - auto comp_phi0 = getAttrOrDefault(x_comp, _Unicode(phi0), 0.0); - auto comp_length = getAttrOrDefault(x_comp, _Unicode(length), module_length); - - Tube c_tube(comp_rmin, comp_rmin + comp_thickness, comp_length / 2, -comp_phi / 2.0 + comp_phi0, - comp_phi / 2.0 + comp_phi0); - Volume c_vol(c_nam, c_tube, description.material(x_comp.materialStr())); - PlacedVolume c_pv; - - if (x_pos && x_rot) { - Position c_pos(x_pos.x(0), x_pos.y(0), x_pos.z(0)); - RotationZYX c_rot(x_rot.z(0), x_rot.y(0), x_rot.x(0)); - c_pv = m_vol.placeVolume(c_vol, Transform3D(c_rot, c_pos)); - } else if (x_rot) { - c_pv = m_vol.placeVolume(c_vol, RotationZYX(x_rot.z(0), x_rot.y(0), x_rot.x(0))); - } else if (x_pos) { - c_pv = m_vol.placeVolume(c_vol, Position(x_pos.x(0), x_pos.y(0), x_pos.z(0))); - } else { - c_pv = m_vol.placeVolume(c_vol); - } - c_vol.setRegion(description, x_comp.regionStr()); - c_vol.setLimitSet(description, x_comp.limitsStr()); - c_vol.setVisAttributes(description, x_comp.visStr()); - if (x_comp.isSensitive()) { - c_pv.addPhysVolID(_U(sensor), sensor_number++); - c_vol.setSensitiveDetector(sens); - sensitives[m_nam].push_back(c_pv); - } - comp_rmin = comp_rmin + comp_thickness; - } - } + + + + + + // layers + // =================== + + for (xml_coll_t li(x_det, _U(layer)); li; ++li) { xml_comp_t x_layer = li; xml_comp_t x_barrel = x_layer.child(_U(barrel_envelope)); @@ -115,7 +69,11 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s double z0 = z_layout.z0(); // Z position of first module in phi. double nz = z_layout.nz(); // Number of modules to place in z. double z_dr = z_layout.dr(); // Radial displacement parameter, of every other module. - Volume m_env = mod_volumes[m_nam]; + auto dz = getAttrOrDefault(z_layout, _Unicode(dz), 0.); // z offset + + // get the module for this layer from the xml + Volume m_env = getModule( m_nam, lay_id, x_det, x_barrel.inner_r(), description, sens, sensitives ) ; + DetElement lay_elt(sdet, _toString(x_layer.id(), "layer%d"), lay_id); //Acts::ActsExtension* layerExtension = new Acts::ActsExtension(); @@ -135,6 +93,7 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s // Loop over the number of modules in phi. for (int ii = 0; ii < nphi; ii++) { + double dx = z_dr * std::cos(phic + phi_tilt); // Delta x of module position. double dy = z_dr * std::sin(phic + phi_tilt); // Delta y of module position. double x = rc * std::cos(phic); // Basic x module position. @@ -142,6 +101,7 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s // Loop over the number of modules in z. for (int j = 0; j < nz; j++) { + string module_name = _toString(module, "module%d"); DetElement mod_elt(lay_elt, module_name, module); // Module PhysicalVolume. @@ -149,15 +109,17 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s // tr(RotationZYX(0,-((M_PI/2)-phic-phi_tilt),M_PI/2),Position(x,y,module_z)); // NOTE (Nikiforos, 26/08 Rotations needed to be fixed so that component1 (silicon) is on the // outside - Transform3D tr(RotationZYX(phic - phi_tilt, 0, 0), Position(x, y, module_z)); + Transform3D tr(RotationZYX(phic - phi_tilt, 0, 0), Position(x, y, module_z + dz)); pv = lay_vol.placeVolume(m_env, tr); pv.addPhysVolID("module", module); mod_elt.setPlacement(pv); + for (size_t ic = 0; ic < sensVols.size(); ++ic) { PlacedVolume sens_pv = sensVols[ic]; DetElement comp_elt(mod_elt, sens_pv.volume().name(), module); comp_elt.setPlacement(sens_pv); + //Acts::ActsExtension* moduleExtension = new Acts::ActsExtension("YZX"); //comp_elt.addExtension<Acts::ActsExtension>(moduleExtension); } @@ -180,6 +142,7 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s } // Create the PhysicalVolume for the layer. pv = assembly.placeVolume(lay_vol); // Place layer in mother + pv.addPhysVolID("layer", lay_id); // Set the layer ID. lay_elt.setAttributes(description, lay_vol, x_layer.regionStr(), x_layer.limitsStr(), x_layer.visStr()); lay_elt.setPlacement(pv); @@ -197,3 +160,119 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s DECLARE_DETELEMENT(refdet_CylinderTrackerBarrel, create_detector) DECLARE_DETELEMENT(refdet_MMTrackerBarrel, create_detector) DECLARE_DETELEMENT(refdet_RWellTrackerBarrel, create_detector) + + + + +Assembly getModule( string m_nam, int n, xml_det_t x_det, double module_rmin, Detector& description, SensitiveDetector sens, map<string, vector<PlacedVolume>> &sensitives){ + + Material air = description.air(); + Assembly module_assembly( _toString(n,"mod_assembly_%d")); + + int n_modules = 0; + for (xml_coll_t mi(x_det, _U(module)); mi; ++mi) { + n_modules++; + xml_comp_t x_mod = mi; + if( x_mod.nameStr() == m_nam ) { + + xml_comp_t m_env = x_mod.child(_U(module_envelope)); + string m_nam = x_mod.nameStr(); + + // auto module_rmin = m_env.rmin(); + auto module_length = m_env.length(); + auto module_phi = getAttrOrDefault(m_env, _Unicode(phi), 90.0); + + // compute thickness as the sum of all components + double total_thickness = 0.; + xml_coll_t ci(x_mod, _U(module_component)); + for (ci.reset(), total_thickness = 0.0; ci; ++ci) + total_thickness += xml_comp_t(ci).thickness(); + + Volume m_vol(m_nam, Tube(module_rmin, module_rmin + total_thickness, module_length / 2), air); + + int ncomponents = 0, sensor_number = 1; + module_assembly.placeVolume(m_vol, Position(-module_rmin, 0, 0)); + // mod_volumes[m_nam] = module_assembly; + m_vol.setVisAttributes(description.visAttributes(x_mod.visStr())); + + // loop over detector components + auto comp_rmin = module_rmin; + for (ci.reset(); ci; ++ci, ++ncomponents) { + xml_comp_t x_comp = ci; + xml_comp_t x_pos = x_comp.position(false); + xml_comp_t x_rot = x_comp.rotation(false); + string c_nam = _toString(ncomponents, "component%d_") + _toString(n); + + auto comp_thickness = x_comp.thickness(); + auto comp_phi = getAttrOrDefault(x_comp, _Unicode(phi), module_phi); + auto comp_phi0 = getAttrOrDefault(x_comp, _Unicode(phi0), 0.0); + auto comp_length = getAttrOrDefault(x_comp, _Unicode(length), module_length); + + Tube c_tube(comp_rmin, comp_rmin + comp_thickness, comp_length / 2, -comp_phi / 2.0 + comp_phi0, + comp_phi / 2.0 + comp_phi0); + Volume c_vol(c_nam, c_tube, description.material(x_comp.materialStr())); + + PlacedVolume c_pv; + + if (x_pos && x_rot) { + Position c_pos(x_pos.x(0), x_pos.y(0), x_pos.z(0)); + RotationZYX c_rot(x_rot.z(0), x_rot.y(0), x_rot.x(0)); + c_pv = m_vol.placeVolume(c_vol, Transform3D(c_rot, c_pos)); + } else if (x_rot) { + c_pv = m_vol.placeVolume(c_vol, RotationZYX(x_rot.z(0), x_rot.y(0), x_rot.x(0))); + } else if (x_pos) { + c_pv = m_vol.placeVolume(c_vol, Position(x_pos.x(0), x_pos.y(0), x_pos.z(0))); + } else { + c_pv = m_vol.placeVolume(c_vol); + } + c_vol.setRegion(description, x_comp.regionStr()); + c_vol.setLimitSet(description, x_comp.limitsStr()); + c_vol.setVisAttributes(description, x_comp.visStr()); + if (x_comp.isSensitive()) { + c_pv.addPhysVolID(_U(sensor), sensor_number++); + c_vol.setSensitiveDetector(sens); + sensitives[m_nam].push_back(c_pv); + } + comp_rmin = comp_rmin + comp_thickness; + } + + + if( x_mod.hasChild("frame")){ + // build the carbon fiber frame around the gas volume + // two bars along z and two arches at the two ends + // TODO make the frame hollow + xml_comp_t m_frame = x_mod.child(_U(frame)); + auto thickness = m_frame.thickness(); + + // get sensitive component rmin + auto m_rmin = module_rmin + m_frame.rmin(); + + + // bars + Tube c_tubeL(m_rmin, m_rmin + thickness, module_length / 2, -module_phi / 2.0, + -module_phi / 2.0 + thickness/m_rmin); + Volume c_volL( m_nam + "_barL", c_tubeL, description.material(m_frame.materialStr())); + Tube c_tubeR(m_rmin, m_rmin + thickness, module_length / 2, module_phi / 2.0 - thickness/m_rmin, + module_phi / 2.0 ); + Volume c_volR(m_nam + "_barR", c_tubeR, description.material(m_frame.materialStr())); + + //arches + Tube c_tubeN(m_rmin, m_rmin + thickness, thickness / 2, - module_phi / 2.0 + thickness/m_rmin, + module_phi / 2.0 - thickness/m_rmin ); + Volume c_volN(m_nam + "_archN", c_tubeN, description.material(m_frame.materialStr())); + c_volN.setVisAttributes( description, m_frame.visStr() ); + + PlacedVolume c_pv; + c_pv = m_vol.placeVolume(c_volL); + c_pv = m_vol.placeVolume(c_volR); + + c_pv = m_vol.placeVolume(c_volN, Position(0,0, -module_length / 2 + thickness/2) ); + c_pv = m_vol.placeVolume(c_volN, Position(0,0, module_length / 2 - thickness/2) ); + + } + + } + } + return module_assembly; +} + -- GitLab