Skip to content
Snippets Groups Projects
Commit 9d1184d3 authored by Francesco Bossù's avatar Francesco Bossù
Browse files

MM tracker

parent 2e7fa037
No related tags found
1 merge request!74Draft: Resolve "MM Tracker Implementation"
......@@ -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>
......
......@@ -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;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment