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
1 merge request!56adjust surface of crystals
......@@ -4,13 +4,17 @@
<constant name="CrystalModule_sy" value="20.0*mm"/>
<constant name="CrystalModule_sz" value="20.0*cm"/>
<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_sy" value="40.0*mm"/>
<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="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="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>
<detectors>
<comment> Backwards Endcap EM Calorimeter, placements generated by script </comment>
......@@ -21,59 +25,57 @@
<lines sector="1" mirrorx="true" mirrory="true">
<module sizex="CrystalModule_sx" sizey="CrystalModule_sy" sizez="CrystalModule_sz" material="PbWO4" vis="AnlTeal"/>
<wrapper thickness="CrystalModule_wrap" material="Epoxy" vis="WhiteVis"/>
<position z="CrystalModule_dz"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*1/2." begin="7" nmods="17"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*3/2." begin="7" nmods="17"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*5/2." begin="7" nmods="17"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*7/2." begin="6" nmods="18"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*9/2." begin="6" nmods="18"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*11/2." begin="5" nmods="19"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*13/2." begin="3" nmods="19"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*15/2." begin="0" nmods="22"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*17/2." begin="0" nmods="22"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*19/2." begin="0" nmods="22"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*21/2." begin="0" nmods="22"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*23/2." begin="0" nmods="22"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*25/2." begin="0" nmods="20"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*27/2." begin="0" nmods="20"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*29/2." begin="0" nmods="18"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*31/2." begin="0" nmods="18"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*33/2." begin="0" nmods="16"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*35/2." begin="0" nmods="16"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*37/2." begin="0" nmods="14"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*39/2." begin="0" nmods="14"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*41/2." begin="0" nmods="12"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*43/2." begin="0" nmods="12"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*45/2." begin="0" nmods="6"/>
<line x="(CrystalModule_sx + CrystalModule_wrap)/2." y="(CrystalModule_sy + CrystalModule_wrap)*47/2." begin="0" nmods="6"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*1/2." z="CrystalModule_z0" begin="7" nmods="17"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*3/2." z="CrystalModule_z0" begin="7" nmods="17"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*5/2." z="CrystalModule_z0" begin="7" nmods="17"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*7/2." z="CrystalModule_z0" begin="6" nmods="18"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*9/2." z="CrystalModule_z0" begin="6" nmods="18"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*11/2." z="CrystalModule_z0" begin="5" nmods="19"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*13/2." z="CrystalModule_z0" begin="3" nmods="19"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*15/2." z="CrystalModule_z0" begin="0" nmods="22"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*17/2." z="CrystalModule_z0" begin="0" nmods="22"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*19/2." z="CrystalModule_z0" begin="0" nmods="22"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*21/2." z="CrystalModule_z0" begin="0" nmods="22"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*23/2." z="CrystalModule_z0" begin="0" nmods="22"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*25/2." z="CrystalModule_z0" begin="0" nmods="20"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*27/2." z="CrystalModule_z0" begin="0" nmods="20"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*29/2." z="CrystalModule_z0" begin="0" nmods="18"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*31/2." z="CrystalModule_z0" begin="0" nmods="18"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*33/2." z="CrystalModule_z0" begin="0" nmods="16"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*35/2." z="CrystalModule_z0" begin="0" nmods="16"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*37/2." z="CrystalModule_z0" begin="0" nmods="14"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*39/2." z="CrystalModule_z0" begin="0" nmods="14"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*41/2." z="CrystalModule_z0" begin="0" nmods="12"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*43/2." z="CrystalModule_z0" begin="0" nmods="12"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*45/2." z="CrystalModule_z0" begin="0" nmods="6"/>
<line axis="x" x="CrystalModule_dx/2." y="CrystalModule_dy*47/2." z="CrystalModule_z0" begin="0" nmods="6"/>
</lines>
<lines sector="2" mirrorx="true" mirrory="true">
<module sizex="GlassModule_sx" sizey="GlassModule_sy" sizez="GlassModule_sz" material="PbGlass" vis="AnlBlue"/>
<wrapper thickness="GlassModule_wrap" material="Epoxy" vis="WhiteVis"/>
<position z="GlassModule_dz"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*1/2." begin="12" nmods="11"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*3/2." begin="12" nmods="11"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*5/2." begin="12" nmods="11"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*7/2." begin="11" nmods="12"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*9/2." begin="11" nmods="12"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*11/2." begin="11" nmods="12"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*13/2." begin="10" nmods="12"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*15/2." begin="9" nmods="13"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*17/2." begin="8" nmods="13"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*19/2." begin="7" nmods="14"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*21/2." begin="6" nmods="14"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*23/2." begin="3" nmods="16"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*25/2." begin="0" nmods="19"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*27/2." begin="0" nmods="18"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*29/2." begin="0" nmods="18"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*31/2." begin="0" nmods="17"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*33/2." begin="0" nmods="17"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*35/2." begin="0" nmods="15"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*37/2." begin="0" nmods="13"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*39/2." begin="0" nmods="11"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*41/2." begin="0" nmods="10"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*43/2." begin="0" nmods="8"/>
<line x="(GlassModule_sx + GlassModule_wrap)/2." y="(GlassModule_sy + GlassModule_wrap)*45/2." begin="0" nmods="6"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*1/2." z="GlassModule_z0" begin="12" nmods="11"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*3/2." z="GlassModule_z0" begin="12" nmods="11"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*5/2." z="GlassModule_z0" begin="12" nmods="11"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*7/2." z="GlassModule_z0" begin="11" nmods="12"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*9/2." z="GlassModule_z0" begin="11" nmods="12"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*11/2." z="GlassModule_z0" begin="11" nmods="12"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*13/2." z="GlassModule_z0" begin="10" nmods="12"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*15/2." z="GlassModule_z0" begin="9" nmods="13"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*17/2." z="GlassModule_z0" begin="8" nmods="13"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*19/2." z="GlassModule_z0" begin="7" nmods="14"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*21/2." z="GlassModule_z0" begin="6" nmods="14"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*23/2." z="GlassModule_z0" begin="3" nmods="16"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*25/2." z="GlassModule_z0" begin="0" nmods="19"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*27/2." z="GlassModule_z0" begin="0" nmods="18"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*29/2." z="GlassModule_z0" begin="0" nmods="18"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*31/2." z="GlassModule_z0" begin="0" nmods="17"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*33/2." z="GlassModule_z0" begin="0" nmods="17"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*35/2." z="GlassModule_z0" begin="0" nmods="15"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*37/2." z="GlassModule_z0" begin="0" nmods="13"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*39/2." z="GlassModule_z0" begin="0" nmods="11"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*41/2." z="GlassModule_z0" begin="0" nmods="10"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*43/2." z="GlassModule_z0" begin="0" nmods="8"/>
<line axis="x" x="GlassModule_dx/2." y="GlassModule_dy*45/2." z="GlassModule_z0" begin="0" nmods="6"/>
</lines>
</placements>
</detector>
......@@ -82,8 +84,8 @@
<comment>Effectively no segmentation, the segmentation is used to provide cell dimension info</comment>
<readout name="EcalEndcapNHits">
<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="GlassSeg" key_value="2" type="CartesianGridXY" grid_size_x="GlassModule_sx + GlassModule_wrap" grid_size_y="GlassModule_sy + GlassModule_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_dx" grid_size_y="GlassModule_dy"/>
</segmentation>
<id>system:8,sector:4,module:20,x:32:-16,y:-16</id>
</readout>
......
......@@ -10,65 +10,49 @@ import argparse
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 = [
(8, 17),
(8, 17),
(8, 17),
(7, 18),
(7, 18),
(6, 19),
(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),
(7, 17), (7, 17), (7, 17), (6, 18),
(6, 18), (5, 19), (3, 19), (0, 22),
(0, 22), (0, 22), (0, 22), (0, 22),
(0, 20), (0, 20), (0, 18), (0, 18),
(0, 16), (0, 16), (0, 14), (0, 14),
(0, 12), (0, 12), (0, 6), (0, 6),
]
GLASS_ALIGNMENT = [
(13, 11),
(13, 11),
(13, 11),
(12, 12),
(12, 12),
(12, 12),
(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),
(12, 11), (12, 11), (12, 11), (11, 12),
(11, 12), (11, 12), (10, 12), (9, 13),
(8, 13), (7, 14), (6, 14), (3, 16),
(0, 19), (0, 18), (0, 18), (0, 17),
(0, 17), (0, 15), (0, 13), (0, 11),
(0, 10), (0, 8), (0, 6),
]
# calculate positions of modules with a quad-alignment and module size
def individual_placement(alignment, module_x=20.5, module_y=20.5):
placements = []
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 = np.asarray(placements)
return np.vstack((placements,
......@@ -82,27 +66,14 @@ if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-s', '--save', default='compact/ce_ecal_crystal_glass.xml',
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()
data = ET.Element('lccdd')
defines = ET.SubElement(data, 'define')
# constants: name, value
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:
for name, value in CONSTANTS:
constant = ET.SubElement(defines, 'constant')
constant.set('name', name)
constant.set('value', value)
......@@ -133,10 +104,10 @@ if __name__ == '__main__':
# placements of modules
plm = ET.SubElement(det, 'placements')
pltype = 'individuals' if args.indiv else 'lines'
# crystals
# crystal = ET.SubElement(plm, 'individuals')
crystal = ET.SubElement(plm, 'lines')
# crystal
crystal = ET.SubElement(plm, pltype)
crystal.set('sector', '1')
crystal_mod = ET.SubElement(crystal, 'module')
crystal_mod.set('sizex', 'CrystalModule_sx')
......@@ -148,30 +119,30 @@ if __name__ == '__main__':
crystal_wrap.set('thickness', 'CrystalModule_wrap')
crystal_wrap.set('material', 'Epoxy')
crystal_wrap.set('vis', 'WhiteVis')
crystal_pos = ET.SubElement(crystal, 'position')
crystal_pos.set('z', 'CrystalModule_dz')
# crystal placements (for individuals)
# for m, (x, y) in enumerate(individual_placement(CRYSTAL_ALIGNMENT)):
# module = ET.SubElement(crystal, 'placement')
# module.set('x', '{:.3f}*mm'.format(x))
# module.set('y', '{:.3f}*mm'.format(y))
# module.set('z', '0')
# module.set('id', '{:d}'.format(m))
if args.indiv:
for m, (x, y) in enumerate(individual_placement(CRYSTAL_ALIGNMENT)):
module = ET.SubElement(crystal, 'placement')
module.set('x', '{:.3f}*mm'.format(x))
module.set('y', '{:.3f}*mm'.format(y))
module.set('z', 'CrystalModule_z0')
module.set('id', '{:d}'.format(m))
# crystal placements (for lines)
crystal.set('mirrorx', 'true')
crystal.set('mirrory', 'true')
for row, (begin, nmods) in enumerate(CRYSTAL_ALIGNMENT):
line = ET.SubElement(crystal, 'line')
line.set('x', '(CrystalModule_sx + CrystalModule_wrap)/2.')
line.set('y', '(CrystalModule_sy + CrystalModule_wrap)*{:d}/2.'.format(row*2 + 1))
line.set('begin', '{:d}'.format(begin - 1))
line.set('nmods', '{:d}'.format(nmods))
else:
crystal.set('mirrorx', 'true')
crystal.set('mirrory', 'true')
for row, (begin, nmods) in enumerate(CRYSTAL_ALIGNMENT):
line = ET.SubElement(crystal, 'line')
line.set('axis', 'x')
line.set('x', 'CrystalModule_dx/2.')
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 = ET.SubElement(plm, 'individuals')
glass = ET.SubElement(plm, 'lines')
glass = ET.SubElement(plm, pltype)
glass.set('sector', '2')
glass_mod = ET.SubElement(glass, 'module')
glass_mod.set('sizex', 'GlassModule_sx')
......@@ -184,25 +155,27 @@ if __name__ == '__main__':
glass_wrap.set('thickness', 'GlassModule_wrap')
glass_wrap.set('material', 'Epoxy')
glass_wrap.set('vis', 'WhiteVis')
glass_pos = ET.SubElement(glass, 'position')
glass_pos.set('z', 'GlassModule_dz')
# crystal placements (for individuals)
# for m, (x, y) in enumerate(individual_placement(GLASS_ALIGNMENT, 41.0, 41.0)):
# module = ET.SubElement(glass, 'placement')
# module.set('x', '{:.3f}*mm'.format(x))
# module.set('y', '{:.3f}*mm'.format(y))
# module.set('z', '0')
# module.set('id', '{:d}'.format(m))
if args.indiv:
for m, (x, y) in enumerate(individual_placement(GLASS_ALIGNMENT, 41.0, 41.0)):
module = ET.SubElement(glass, 'placement')
module.set('x', '{:.3f}*mm'.format(x))
module.set('y', '{:.3f}*mm'.format(y))
module.set('z', 'GlassModule_z0')
module.set('id', '{:d}'.format(m))
# crystal placements (for lines)
glass.set('mirrorx', 'true')
glass.set('mirrory', 'true')
for row, (begin, nmods) in enumerate(GLASS_ALIGNMENT):
line = ET.SubElement(glass, 'line')
line.set('x', '(GlassModule_sx + GlassModule_wrap)/2.')
line.set('y', '(GlassModule_sy + GlassModule_wrap)*{:d}/2.'.format(row*2 + 1))
line.set('begin', '{:d}'.format(begin - 1))
line.set('nmods', '{:d}'.format(nmods))
else:
glass.set('mirrorx', 'true')
glass.set('mirrory', 'true')
for row, (begin, nmods) in enumerate(GLASS_ALIGNMENT):
line = ET.SubElement(glass, 'line')
line.set('axis', 'x')
line.set('x', 'GlassModule_dx/2.')
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
readouts = ET.SubElement(data, 'readouts')
......@@ -219,14 +192,14 @@ if __name__ == '__main__':
crystal_seg.set('name', 'CrystalSeg')
crystal_seg.set('key_value', '1')
crystal_seg.set('type', 'CartesianGridXY')
crystal_seg.set('grid_size_x', 'CrystalModule_sx + CrystalModule_wrap')
crystal_seg.set('grid_size_y', 'CrystalModule_sy + CrystalModule_wrap')
crystal_seg.set('grid_size_x', 'CrystalModule_dx')
crystal_seg.set('grid_size_y', 'CrystalModule_dy')
glass_seg = ET.SubElement(seg, 'segmentation')
glass_seg.set('name', 'GlassSeg')
glass_seg.set('key_value', '2')
glass_seg.set('type', 'CartesianGridXY')
glass_seg.set('grid_size_x', 'GlassModule_sx + GlassModule_wrap')
glass_seg.set('grid_size_y', 'GlassModule_sy + GlassModule_wrap')
glass_seg.set('grid_size_x', 'GlassModule_dx')
glass_seg.set('grid_size_y', 'GlassModule_dy')
rid = ET.SubElement(readout, 'id')
rid.text = 'system:8,sector:4,module:20,x:32:-16,y:-16'
......
......@@ -99,9 +99,9 @@ using namespace dd4hep::detail;
* <lines sector="1" mirrorx="true" mirrory="true"/>
* <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"/>
* <line x="10.25*mm" y="10.25*mm" begin="8" nmods="16"/>
* <line x="10.25*mm" y="30.75*mm" begin="8" nmods="16"/>
* <line x="10.25*mm" y="51.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" axis="y" begin="8" nmods="16"/>
* <line x="10.25*mm" y="51.25*mm" axis="z" begin="8" nmods="16"/>
* </individuals>
* </placements>
* </detector>
......@@ -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);
bool mirrorx = dd4hep::getAttrOrDefault<bool>(plm, _Unicode(mirrorx), false);
bool mirrory = dd4hep::getAttrOrDefault<bool>(plm, _Unicode(mirrory), false);
bool mirrorz = dd4hep::getAttrOrDefault<bool>(plm, _Unicode(mirrorz), false);
// line placement
int mid = 1;
......@@ -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.),
dd4hep::getAttrOrDefault<double>(pl, _Unicode(roty), 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 nmods = pl.attr<int>(_Unicode(nmods));
std::vector<std::pair<double, double>> translations;
std::vector<Position> trans;
for (int i = 0; i < nmods; ++i) {
translations.push_back(std::pair<double, double>{pos.x() + (begin + i)*modSize.x(), pos.y()});
if (mirrorx) {
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(),
(axis == "y") ? pos.y() + (begin + i)*modSize.y() : 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())
* Translation3D(p.first, p.second, pos.z());
* Translation3D(p.x(), p.y(), p.z());
auto modPV = env.placeVolume(modVol, tr);
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.
Finish editing this message first!
Please register or to comment