diff --git a/compact/ce_ecal_crystal_glass.xml b/compact/ce_ecal_crystal_glass.xml index cc36383be8b946cbd200512db58a969baa5d4387..19156a0df841163a4bee35a1026641b73f62c195 100644 --- a/compact/ce_ecal_crystal_glass.xml +++ b/compact/ce_ecal_crystal_glass.xml @@ -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> diff --git a/scripts/ce_ecal_placement.py b/scripts/ce_ecal_placement.py index 138bc7c43ce70cf1ea018e24359d764dd1b642b4..83c1d20d7b11e354e8b9eab21cd99515ee86fd36 100644 --- a/scripts/ce_ecal_placement.py +++ b/scripts/ce_ecal_placement.py @@ -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' diff --git a/src/HomogeneousCalorimeter_geo.cpp b/src/HomogeneousCalorimeter_geo.cpp index 5ed339dc3dddce25f725a1981b45f243eb44ca42..65fb78dddbaab2fd75d41094699b481d78d0d75a 100644 --- a/src/HomogeneousCalorimeter_geo.cpp +++ b/src/HomogeneousCalorimeter_geo.cpp @@ -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++); }