Skip to content
Snippets Groups Projects
Commit ee95dfa7 authored by Chao Peng's avatar Chao Peng
Browse files

adjust surface of crystals

parent 0258f588
No related branches found
No related tags found
No related merge requests found
...@@ -4,13 +4,17 @@ ...@@ -4,13 +4,17 @@
<constant name="CrystalModule_sy" value="20.0*mm"/> <constant name="CrystalModule_sy" value="20.0*mm"/>
<constant name="CrystalModule_sz" value="20.0*cm"/> <constant name="CrystalModule_sz" value="20.0*cm"/>
<constant name="CrystalModule_wrap" value="0.5*mm"/> <constant name="CrystalModule_wrap" value="0.5*mm"/>
<constant name="CrystalModule_dz" value="-8*cm"/>
<constant name="GlassModule_sx" value="40.0*mm"/> <constant name="GlassModule_sx" value="40.0*mm"/>
<constant name="GlassModule_sy" value="40.0*mm"/> <constant name="GlassModule_sy" value="40.0*mm"/>
<constant name="GlassModule_sz" value="40.0*cm"/> <constant name="GlassModule_sz" value="40.0*cm"/>
<constant name="GlassModule_dz" value="0.0*cm"/>
<constant name="GlassModule_wrap" value="1.0*mm"/> <constant name="GlassModule_wrap" value="1.0*mm"/>
<constant name="CrystalModule_z0" value="10.*cm"/>
<constant name="GlassModule_z0" value="0.0*cm"/>
<constant name="EcalEndcapN_z0" value="-EcalEndcapN_zmin-max(CrystalModule_sz,GlassModule_sz)/2."/> <constant name="EcalEndcapN_z0" value="-EcalEndcapN_zmin-max(CrystalModule_sz,GlassModule_sz)/2."/>
<constant name="CrystalModule_dx" value="CrystalModule_sx + CrystalModule_wrap"/>
<constant name="CrystalModule_dy" value="CrystalModule_sy + CrystalModule_wrap"/>
<constant name="GlassModule_dx" value="GlassModule_sx + GlassModule_wrap"/>
<constant name="GlassModule_dy" value="GlassModule_sy + GlassModule_wrap"/>
</define> </define>
<detectors> <detectors>
<comment> Backwards Endcap EM Calorimeter, placements generated by script </comment> <comment> Backwards Endcap EM Calorimeter, placements generated by script </comment>
...@@ -21,59 +25,57 @@ ...@@ -21,59 +25,57 @@
<lines sector="1" mirrorx="true" mirrory="true"> <lines sector="1" mirrorx="true" mirrory="true">
<module sizex="CrystalModule_sx" sizey="CrystalModule_sy" sizez="CrystalModule_sz" material="PbWO4" vis="AnlTeal"/> <module sizex="CrystalModule_sx" sizey="CrystalModule_sy" sizez="CrystalModule_sz" material="PbWO4" vis="AnlTeal"/>
<wrapper thickness="CrystalModule_wrap" material="Epoxy" vis="WhiteVis"/> <wrapper thickness="CrystalModule_wrap" material="Epoxy" vis="WhiteVis"/>
<position z="CrystalModule_dz"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*1/2." z="CrystalModule_z0" begin="7" nmods="17"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*1/2." begin="7" nmods="17"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*3/2." z="CrystalModule_z0" begin="7" nmods="17"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*3/2." begin="7" nmods="17"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*5/2." z="CrystalModule_z0" begin="7" nmods="17"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*5/2." begin="7" nmods="17"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*7/2." z="CrystalModule_z0" begin="6" nmods="18"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*7/2." begin="6" nmods="18"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*9/2." z="CrystalModule_z0" begin="6" nmods="18"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*9/2." begin="6" nmods="18"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*11/2." z="CrystalModule_z0" begin="5" nmods="19"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*11/2." begin="5" nmods="19"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*13/2." z="CrystalModule_z0" begin="3" nmods="19"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*13/2." begin="3" nmods="19"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*15/2." z="CrystalModule_z0" begin="0" nmods="22"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*15/2." begin="0" nmods="22"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*17/2." z="CrystalModule_z0" begin="0" nmods="22"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*17/2." begin="0" nmods="22"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*19/2." z="CrystalModule_z0" begin="0" nmods="22"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*19/2." begin="0" nmods="22"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*21/2." z="CrystalModule_z0" begin="0" nmods="22"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*21/2." begin="0" nmods="22"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*23/2." z="CrystalModule_z0" begin="0" nmods="22"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*23/2." begin="0" nmods="22"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*25/2." z="CrystalModule_z0" begin="0" nmods="20"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*25/2." begin="0" nmods="20"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*27/2." z="CrystalModule_z0" begin="0" nmods="20"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*27/2." begin="0" nmods="20"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*29/2." z="CrystalModule_z0" begin="0" nmods="18"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*29/2." begin="0" nmods="18"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*31/2." z="CrystalModule_z0" begin="0" nmods="18"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*31/2." begin="0" nmods="18"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*33/2." z="CrystalModule_z0" begin="0" nmods="16"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*33/2." begin="0" nmods="16"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*35/2." z="CrystalModule_z0" begin="0" nmods="16"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*35/2." begin="0" nmods="16"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*37/2." z="CrystalModule_z0" begin="0" nmods="14"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*37/2." begin="0" nmods="14"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*39/2." z="CrystalModule_z0" begin="0" nmods="14"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*39/2." begin="0" nmods="14"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*41/2." z="CrystalModule_z0" begin="0" nmods="12"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*41/2." begin="0" nmods="12"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*43/2." z="CrystalModule_z0" begin="0" nmods="12"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*43/2." begin="0" nmods="12"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*45/2." z="CrystalModule_z0" begin="0" nmods="6"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*45/2." begin="0" nmods="6"/> <line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*47/2." z="CrystalModule_z0" begin="0" nmods="6"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*47/2." begin="0" nmods="6"/>
</lines> </lines>
<lines sector="2" mirrorx="true" mirrory="true"> <lines sector="2" mirrorx="true" mirrory="true">
<module sizex="GlassModule_sx" sizey="GlassModule_sy" sizez="GlassModule_sz" material="PbGlass" vis="AnlBlue"/> <module sizex="GlassModule_sx" sizey="GlassModule_sy" sizez="GlassModule_sz" material="PbGlass" vis="AnlBlue"/>
<wrapper thickness="GlassModule_wrap" material="Epoxy" vis="WhiteVis"/> <wrapper thickness="GlassModule_wrap" material="Epoxy" vis="WhiteVis"/>
<position z="GlassModule_dz"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*1/2." z="GlassModule_z0" begin="12" nmods="11"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*1/2." begin="12" nmods="11"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*3/2." z="GlassModule_z0" begin="12" nmods="11"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*3/2." begin="12" nmods="11"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*5/2." z="GlassModule_z0" begin="12" nmods="11"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*5/2." begin="12" nmods="11"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*7/2." z="GlassModule_z0" begin="11" nmods="12"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*7/2." begin="11" nmods="12"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*9/2." z="GlassModule_z0" begin="11" nmods="12"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*9/2." begin="11" nmods="12"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*11/2." z="GlassModule_z0" begin="11" nmods="12"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*11/2." begin="11" nmods="12"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*13/2." z="GlassModule_z0" begin="10" nmods="12"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*13/2." begin="10" nmods="12"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*15/2." z="GlassModule_z0" begin="9" nmods="13"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*15/2." begin="9" nmods="13"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*17/2." z="GlassModule_z0" begin="8" nmods="13"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*17/2." begin="8" nmods="13"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*19/2." z="GlassModule_z0" begin="7" nmods="14"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*19/2." begin="7" nmods="14"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*21/2." z="GlassModule_z0" begin="6" nmods="14"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*21/2." begin="6" nmods="14"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*23/2." z="GlassModule_z0" begin="3" nmods="16"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*23/2." begin="3" nmods="16"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*25/2." z="GlassModule_z0" begin="0" nmods="19"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*25/2." begin="0" nmods="19"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*27/2." z="GlassModule_z0" begin="0" nmods="18"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*27/2." begin="0" nmods="18"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*29/2." z="GlassModule_z0" begin="0" nmods="18"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*29/2." begin="0" nmods="18"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*31/2." z="GlassModule_z0" begin="0" nmods="17"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*31/2." begin="0" nmods="17"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*33/2." z="GlassModule_z0" begin="0" nmods="17"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*33/2." begin="0" nmods="17"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*35/2." z="GlassModule_z0" begin="0" nmods="15"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*35/2." begin="0" nmods="15"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*37/2." z="GlassModule_z0" begin="0" nmods="13"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*37/2." begin="0" nmods="13"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*39/2." z="GlassModule_z0" begin="0" nmods="11"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*39/2." begin="0" nmods="11"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*41/2." z="GlassModule_z0" begin="0" nmods="10"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*41/2." begin="0" nmods="10"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*43/2." z="GlassModule_z0" begin="0" nmods="8"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*43/2." begin="0" nmods="8"/> <line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*45/2." z="GlassModule_z0" begin="0" nmods="6"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*45/2." begin="0" nmods="6"/>
</lines> </lines>
</placements> </placements>
</detector> </detector>
...@@ -82,8 +84,8 @@ ...@@ -82,8 +84,8 @@
<comment>Effectively no segmentation, the segmentation is used to provide cell dimension info</comment> <comment>Effectively no segmentation, the segmentation is used to provide cell dimension info</comment>
<readout name="EcalEndcapNHits"> <readout name="EcalEndcapNHits">
<segmentation type="MultiSegmentation" key="sector"> <segmentation type="MultiSegmentation" key="sector">
<segmentation name="CrystalSeg" key_value="1" type="CartesianGridXY" grid_size_x="CrystalModule_sx + CrystalModule_wrap" grid_size_y="CrystalModule_sy + CrystalModule_wrap"/> <segmentation name="CrystalSeg" key_value="1" type="CartesianGridXY" grid_size_x="CrystalModule_dx" grid_size_y="CrystalModule_dy"/>
<segmentation name="GlassSeg" key_value="2" type="CartesianGridXY" grid_size_x="GlassModule_sx + GlassModule_wrap" grid_size_y="GlassModule_sy + GlassModule_wrap"/> <segmentation name="GlassSeg" key_value="2" type="CartesianGridXY" grid_size_x="GlassModule_dx" grid_size_y="GlassModule_dy"/>
</segmentation> </segmentation>
<id>system:8,sector:4,module:20,x:32:-16,y:-16</id> <id>system:8,sector:4,module:20,x:32:-16,y:-16</id>
</readout> </readout>
......
...@@ -10,65 +10,49 @@ import argparse ...@@ -10,65 +10,49 @@ import argparse
from lxml import etree as ET from lxml import etree as ET
# start pos, total number of blocks # constants: name, value
CONSTANTS = [
('CrystalModule_sx', '20.0*mm'),
('CrystalModule_sy', '20.0*mm'),
('CrystalModule_sz', '20.0*cm'),
('CrystalModule_wrap', '0.5*mm'),
('GlassModule_sx', '40.0*mm'),
('GlassModule_sy', '40.0*mm'),
('GlassModule_sz', '40.0*cm'),
('GlassModule_wrap', '1.0*mm'),
('CrystalModule_z0', '10.*cm'),
('GlassModule_z0', '0.0*cm'),
('EcalEndcapN_z0', '-EcalEndcapN_zmin-max(CrystalModule_sz,GlassModule_sz)/2.'),
('CrystalModule_dx', 'CrystalModule_sx + CrystalModule_wrap'),
('CrystalModule_dy', 'CrystalModule_sy + CrystalModule_wrap'),
('GlassModule_dx', 'GlassModule_sx + GlassModule_wrap'),
('GlassModule_dy', 'GlassModule_sy + GlassModule_wrap'),
]
# line-by-line alignment start pos, total number of blocks
CRYSTAL_ALIGNMENT = [ CRYSTAL_ALIGNMENT = [
(8, 17), (7, 17), (7, 17), (7, 17), (6, 18),
(8, 17), (6, 18), (5, 19), (3, 19), (0, 22),
(8, 17), (0, 22), (0, 22), (0, 22), (0, 22),
(7, 18), (0, 20), (0, 20), (0, 18), (0, 18),
(7, 18), (0, 16), (0, 16), (0, 14), (0, 14),
(6, 19), (0, 12), (0, 12), (0, 6), (0, 6),
(4, 19),
(1, 22),
(1, 22),
(1, 22),
(1, 22),
(1, 22),
(1, 20),
(1, 20),
(1, 18),
(1, 18),
(1, 16),
(1, 16),
(1, 14),
(1, 14),
(1, 12),
(1, 12),
(1, 6),
(1, 6),
] ]
GLASS_ALIGNMENT = [ GLASS_ALIGNMENT = [
(13, 11), (12, 11), (12, 11), (12, 11), (11, 12),
(13, 11), (11, 12), (11, 12), (10, 12), (9, 13),
(13, 11), (8, 13), (7, 14), (6, 14), (3, 16),
(12, 12), (0, 19), (0, 18), (0, 18), (0, 17),
(12, 12), (0, 17), (0, 15), (0, 13), (0, 11),
(12, 12), (0, 10), (0, 8), (0, 6),
(11, 12),
(10, 13),
(9, 13),
(8, 14),
(7, 14),
(4, 16),
(1, 19),
(1, 18),
(1, 18),
(1, 17),
(1, 17),
(1, 15),
(1, 13),
(1, 11),
(1, 10),
(1, 8),
(1, 6),
] ]
# calculate positions of modules with a quad-alignment and module size # calculate positions of modules with a quad-alignment and module size
def individual_placement(alignment, module_x=20.5, module_y=20.5): def individual_placement(alignment, module_x=20.5, module_y=20.5):
placements = [] placements = []
for row, (start, num) in enumerate(alignment): for row, (start, num) in enumerate(alignment):
for col in np.arange(start - 1, start + num - 1): for col in np.arange(start, start + num):
placements.append(((col + 0.5)*module_y, (row + 0.5)*module_x)) placements.append(((col + 0.5)*module_y, (row + 0.5)*module_x))
placements = np.asarray(placements) placements = np.asarray(placements)
return np.vstack((placements, return np.vstack((placements,
...@@ -82,27 +66,14 @@ if __name__ == '__main__': ...@@ -82,27 +66,14 @@ if __name__ == '__main__':
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('-s', '--save', default='compact/ce_ecal_crystal_glass.xml', parser.add_argument('-s', '--save', default='compact/ce_ecal_crystal_glass.xml',
help='path to save compact file.') help='path to save compact file.')
parser.add_argument('--individual', dest='indiv', action='store_true',
help='individual block placements instead of line placements')
args = parser.parse_args() args = parser.parse_args()
data = ET.Element('lccdd') data = ET.Element('lccdd')
defines = ET.SubElement(data, 'define') defines = ET.SubElement(data, 'define')
# constants: name, value for name, value in CONSTANTS:
consts = [
('CrystalModule_sx', '20.0*mm'),
('CrystalModule_sy', '20.0*mm'),
('CrystalModule_sz', '20.0*cm'),
('CrystalModule_wrap', '0.5*mm'),
('CrystalModule_dz', '-8*cm'),
('GlassModule_sx', '40.0*mm'),
('GlassModule_sy', '40.0*mm'),
('GlassModule_sz', '40.0*cm'),
('GlassModule_dz', '0.0*cm'),
('GlassModule_wrap', '1.0*mm'),
('EcalEndcapN_z0', '-EcalEndcapN_zmin-max(CrystalModule_sz,GlassModule_sz)/2.'),
]
for name, value in consts:
constant = ET.SubElement(defines, 'constant') constant = ET.SubElement(defines, 'constant')
constant.set('name', name) constant.set('name', name)
constant.set('value', value) constant.set('value', value)
...@@ -133,10 +104,10 @@ if __name__ == '__main__': ...@@ -133,10 +104,10 @@ if __name__ == '__main__':
# placements of modules # placements of modules
plm = ET.SubElement(det, 'placements') plm = ET.SubElement(det, 'placements')
pltype = 'individuals' if args.indiv else 'lines'
# crystals # crystal
# crystal = ET.SubElement(plm, 'individuals') crystal = ET.SubElement(plm, pltype)
crystal = ET.SubElement(plm, 'lines')
crystal.set('sector', '1') crystal.set('sector', '1')
crystal_mod = ET.SubElement(crystal, 'module') crystal_mod = ET.SubElement(crystal, 'module')
crystal_mod.set('sizex', 'CrystalModule_sx') crystal_mod.set('sizex', 'CrystalModule_sx')
...@@ -148,30 +119,30 @@ if __name__ == '__main__': ...@@ -148,30 +119,30 @@ if __name__ == '__main__':
crystal_wrap.set('thickness', 'CrystalModule_wrap') crystal_wrap.set('thickness', 'CrystalModule_wrap')
crystal_wrap.set('material', 'Epoxy') crystal_wrap.set('material', 'Epoxy')
crystal_wrap.set('vis', 'WhiteVis') crystal_wrap.set('vis', 'WhiteVis')
crystal_pos = ET.SubElement(crystal, 'position')
crystal_pos.set('z', 'CrystalModule_dz')
# crystal placements (for individuals) # crystal placements (for individuals)
# for m, (x, y) in enumerate(individual_placement(CRYSTAL_ALIGNMENT)): if args.indiv:
# module = ET.SubElement(crystal, 'placement') for m, (x, y) in enumerate(individual_placement(CRYSTAL_ALIGNMENT)):
# module.set('x', '{:.3f}*mm'.format(x)) module = ET.SubElement(crystal, 'placement')
# module.set('y', '{:.3f}*mm'.format(y)) module.set('x', '{:.3f}*mm'.format(x))
# module.set('z', '0') module.set('y', '{:.3f}*mm'.format(y))
# module.set('id', '{:d}'.format(m)) module.set('z', 'CrystalModule_z0')
module.set('id', '{:d}'.format(m))
# crystal placements (for lines) # crystal placements (for lines)
crystal.set('mirrorx', 'true') else:
crystal.set('mirrory', 'true') crystal.set('mirrorx', 'true')
for row, (begin, nmods) in enumerate(CRYSTAL_ALIGNMENT): crystal.set('mirrory', 'true')
line = ET.SubElement(crystal, 'line') for row, (begin, nmods) in enumerate(CRYSTAL_ALIGNMENT):
line.set('x', '(CrystalModule_sx + CrystalModule_wrap)/2.') line = ET.SubElement(crystal, 'line')
line.set('y', '(CrystalModule_sy + CrystalModule_wrap)*{:d}/2.'.format(row*2 + 1)) line.set('axis', 'x')
line.set('begin', '{:d}'.format(begin - 1)) line.set('x', 'CrystalModule_dx/2.')
line.set('nmods', '{:d}'.format(nmods)) line.set('y', 'CrystalModule_dy*{:d}/2.'.format(row*2 + 1))
line.set('z', 'CrystalModule_z0')
line.set('begin', '{:d}'.format(begin))
line.set('nmods', '{:d}'.format(nmods))
# glass # glass
# glass = ET.SubElement(plm, 'individuals') glass = ET.SubElement(plm, pltype)
glass = ET.SubElement(plm, 'lines')
glass.set('sector', '2') glass.set('sector', '2')
glass_mod = ET.SubElement(glass, 'module') glass_mod = ET.SubElement(glass, 'module')
glass_mod.set('sizex', 'GlassModule_sx') glass_mod.set('sizex', 'GlassModule_sx')
...@@ -184,25 +155,27 @@ if __name__ == '__main__': ...@@ -184,25 +155,27 @@ if __name__ == '__main__':
glass_wrap.set('thickness', 'GlassModule_wrap') glass_wrap.set('thickness', 'GlassModule_wrap')
glass_wrap.set('material', 'Epoxy') glass_wrap.set('material', 'Epoxy')
glass_wrap.set('vis', 'WhiteVis') glass_wrap.set('vis', 'WhiteVis')
glass_pos = ET.SubElement(glass, 'position')
glass_pos.set('z', 'GlassModule_dz')
# crystal placements (for individuals) # crystal placements (for individuals)
# for m, (x, y) in enumerate(individual_placement(GLASS_ALIGNMENT, 41.0, 41.0)): if args.indiv:
# module = ET.SubElement(glass, 'placement') for m, (x, y) in enumerate(individual_placement(GLASS_ALIGNMENT, 41.0, 41.0)):
# module.set('x', '{:.3f}*mm'.format(x)) module = ET.SubElement(glass, 'placement')
# module.set('y', '{:.3f}*mm'.format(y)) module.set('x', '{:.3f}*mm'.format(x))
# module.set('z', '0') module.set('y', '{:.3f}*mm'.format(y))
# module.set('id', '{:d}'.format(m)) module.set('z', 'GlassModule_z0')
module.set('id', '{:d}'.format(m))
# crystal placements (for lines) # crystal placements (for lines)
glass.set('mirrorx', 'true') else:
glass.set('mirrory', 'true') glass.set('mirrorx', 'true')
for row, (begin, nmods) in enumerate(GLASS_ALIGNMENT): glass.set('mirrory', 'true')
line = ET.SubElement(glass, 'line') for row, (begin, nmods) in enumerate(GLASS_ALIGNMENT):
line.set('x', '(GlassModule_sx + GlassModule_wrap)/2.') line = ET.SubElement(glass, 'line')
line.set('y', '(GlassModule_sy + GlassModule_wrap)*{:d}/2.'.format(row*2 + 1)) line.set('axis', 'x')
line.set('begin', '{:d}'.format(begin - 1)) line.set('x', 'GlassModule_dx/2.')
line.set('nmods', '{:d}'.format(nmods)) line.set('y', 'GlassModule_dy*{:d}/2.'.format(row*2 + 1))
line.set('z', 'GlassModule_z0')
line.set('begin', '{:d}'.format(begin))
line.set('nmods', '{:d}'.format(nmods))
# readout # readout
readouts = ET.SubElement(data, 'readouts') readouts = ET.SubElement(data, 'readouts')
...@@ -219,14 +192,14 @@ if __name__ == '__main__': ...@@ -219,14 +192,14 @@ if __name__ == '__main__':
crystal_seg.set('name', 'CrystalSeg') crystal_seg.set('name', 'CrystalSeg')
crystal_seg.set('key_value', '1') crystal_seg.set('key_value', '1')
crystal_seg.set('type', 'CartesianGridXY') crystal_seg.set('type', 'CartesianGridXY')
crystal_seg.set('grid_size_x', 'CrystalModule_sx + CrystalModule_wrap') crystal_seg.set('grid_size_x', 'CrystalModule_dx')
crystal_seg.set('grid_size_y', 'CrystalModule_sy + CrystalModule_wrap') crystal_seg.set('grid_size_y', 'CrystalModule_dy')
glass_seg = ET.SubElement(seg, 'segmentation') glass_seg = ET.SubElement(seg, 'segmentation')
glass_seg.set('name', 'GlassSeg') glass_seg.set('name', 'GlassSeg')
glass_seg.set('key_value', '2') glass_seg.set('key_value', '2')
glass_seg.set('type', 'CartesianGridXY') glass_seg.set('type', 'CartesianGridXY')
glass_seg.set('grid_size_x', 'GlassModule_sx + GlassModule_wrap') glass_seg.set('grid_size_x', 'GlassModule_dx')
glass_seg.set('grid_size_y', 'GlassModule_sy + GlassModule_wrap') glass_seg.set('grid_size_y', 'GlassModule_dy')
rid = ET.SubElement(readout, 'id') rid = ET.SubElement(readout, 'id')
rid.text = 'system:8,sector:4,module:20,x:32:-16,y:-16' rid.text = 'system:8,sector:4,module:20,x:32:-16,y:-16'
......
...@@ -99,9 +99,9 @@ using namespace dd4hep::detail; ...@@ -99,9 +99,9 @@ using namespace dd4hep::detail;
* <lines sector="1" mirrorx="true" mirrory="true"/> * <lines sector="1" mirrorx="true" mirrory="true"/>
* <module sizex="2.05*cm" sizey="2.05*cm" sizez="20*cm" vis="GreenVis" material="PbWO4"/> * <module sizex="2.05*cm" sizey="2.05*cm" sizez="20*cm" vis="GreenVis" material="PbWO4"/>
* <wrapper thickness="0.015*cm" material="Epoxy" vis="WhiteVis"/> * <wrapper thickness="0.015*cm" material="Epoxy" vis="WhiteVis"/>
* <line x="10.25*mm" y="10.25*mm" begin="8" nmods="16"/> * <line x="10.25*mm" y="10.25*mm" axis="x" begin="8" nmods="16"/>
* <line x="10.25*mm" y="30.75*mm" begin="8" nmods="16"/> * <line x="10.25*mm" y="30.75*mm" axis="y" begin="8" nmods="16"/>
* <line x="10.25*mm" y="51.25*mm" begin="8" nmods="16"/> * <line x="10.25*mm" y="51.25*mm" axis="z" begin="8" nmods="16"/>
* </individuals> * </individuals>
* </placements> * </placements>
* </detector> * </detector>
...@@ -297,6 +297,7 @@ static void add_lines(Detector& desc, Assembly &env, xml::Collection_t &plm, Sen ...@@ -297,6 +297,7 @@ static void add_lines(Detector& desc, Assembly &env, xml::Collection_t &plm, Sen
int id_begin = dd4hep::getAttrOrDefault<int>(plm, _Unicode(id_begin), 1); int id_begin = dd4hep::getAttrOrDefault<int>(plm, _Unicode(id_begin), 1);
bool mirrorx = dd4hep::getAttrOrDefault<bool>(plm, _Unicode(mirrorx), false); bool mirrorx = dd4hep::getAttrOrDefault<bool>(plm, _Unicode(mirrorx), false);
bool mirrory = dd4hep::getAttrOrDefault<bool>(plm, _Unicode(mirrory), false); bool mirrory = dd4hep::getAttrOrDefault<bool>(plm, _Unicode(mirrory), false);
bool mirrorz = dd4hep::getAttrOrDefault<bool>(plm, _Unicode(mirrorz), false);
// line placement // line placement
int mid = 1; int mid = 1;
...@@ -307,26 +308,50 @@ static void add_lines(Detector& desc, Assembly &env, xml::Collection_t &plm, Sen ...@@ -307,26 +308,50 @@ static void add_lines(Detector& desc, Assembly &env, xml::Collection_t &plm, Sen
Position rot(dd4hep::getAttrOrDefault<double>(pl, _Unicode(rotx), 0.), Position rot(dd4hep::getAttrOrDefault<double>(pl, _Unicode(rotx), 0.),
dd4hep::getAttrOrDefault<double>(pl, _Unicode(roty), 0.), dd4hep::getAttrOrDefault<double>(pl, _Unicode(roty), 0.),
dd4hep::getAttrOrDefault<double>(pl, _Unicode(rotz), 0.)); dd4hep::getAttrOrDefault<double>(pl, _Unicode(rotz), 0.));
// determine axis
std::string axis = dd4hep::getAttrOrDefault(pl, _Unicode(axis), "x");
std::transform(axis.begin(), axis.end(), axis.begin(), [](char c) { return std::tolower(c); });
if ((axis != "x") && (axis != "y") && (axis != "z")) {
std::cerr << "HomogeneousCalorimeter Error: cannot determine axis of line " << axis
<< ", abort placement of this line." << std::endl;
continue;
}
int begin = dd4hep::getAttrOrDefault<int>(pl, _Unicode(begin), 0); int begin = dd4hep::getAttrOrDefault<int>(pl, _Unicode(begin), 0);
int nmods = pl.attr<int>(_Unicode(nmods)); int nmods = pl.attr<int>(_Unicode(nmods));
std::vector<std::pair<double, double>> translations; std::vector<Position> trans;
for (int i = 0; i < nmods; ++i) { for (int i = 0; i < nmods; ++i) {
translations.push_back(std::pair<double, double>{pos.x() + (begin + i)*modSize.x(), pos.y()}); Position tran{ (axis == "x") ? pos.x() + (begin + i)*modSize.x() : pos.x(),
if (mirrorx) { (axis == "y") ? pos.y() + (begin + i)*modSize.y() : pos.y(),
translations.push_back(std::pair<double, double>{-pos.x() - (begin + i)*modSize.x(), pos.y()}); (axis == "z") ? pos.z() + (begin + i)*modSize.z() : pos.z() };
trans.push_back(tran);
}
// mirror placement
if (mirrorx) {
int curr_size = trans.size();
for (size_t i = 0; i < curr_size; ++i) {
trans.push_back(Position{-trans[i].x(), trans[i].y(), trans[i].z()});
} }
if (mirrory) { }
translations.push_back(std::pair<double, double>{pos.x() + (begin + i)*modSize.x(), -pos.y()}); if (mirrory) {
int curr_size = trans.size();
for (size_t i = 0; i < curr_size; ++i) {
trans.push_back(Position{trans[i].x(), -trans[i].y(), trans[i].z()});
} }
if (mirrorx && mirrory) { }
translations.push_back(std::pair<double, double>{-pos.x() - (begin + i)*modSize.x(), -pos.y()}); if (mirrorz) {
int curr_size = trans.size();
for (size_t i = 0; i < curr_size; ++i) {
trans.push_back(Position{trans[i].x(), trans[i].y(), -trans[i].z()});
} }
} }
for (auto &p : translations) { // place volume
for (auto &p : trans) {
Transform3D tr = RotationZYX(rot.z(), rot.y(), rot.x()) Transform3D tr = RotationZYX(rot.z(), rot.y(), rot.x())
* Translation3D(p.first, p.second, pos.z()); * Translation3D(p.x(), p.y(), p.z());
auto modPV = env.placeVolume(modVol, tr); auto modPV = env.placeVolume(modVol, tr);
modPV.addPhysVolID("sector", sector_id).addPhysVolID("module", id_begin + mid++); modPV.addPhysVolID("sector", sector_id).addPhysVolID("module", id_begin + mid++);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment