6 from itertools
import groupby
7 from operator
import attrgetter
8 from math
import pi
as PI
17 """Represents a single input ROI (one line in the .dat file)
19 def __init__(self, subsystid, sectorid, roi, etamin, etamax, phimin, phimax, eta, phi, slot, connector, sectorname, mioct, sectoraddress, etacode, phicode):
50 return "mioct=%i (slot %i), sector=%i, roi=%i, eta=%f, phi=%f, conn=%i, %s" % (self.
mioct, self.
slot, self.
sectorid, self.
roi, self.
eta, self.
phi, self.
connector, self.
sectorname)
63 filename = os.path.basename(sys.argv[1]).
replace(
'.dat',
'.xml')
64 xml =
open(filename,
"w")
65 print(
'<?xml version="1.0" ?>\n', file=xml)
66 print(
'<!DOCTYPE MuCTPiGeometry SYSTEM "MUCTPIGeometry.dtd">\n', file=xml)
67 print(
'<MuCTPiGeometry>', file=xml)
68 for mioct
in sorted(g.keys()):
71 allSectorNames =
set()
72 for sector
in g[mioct].
values():
73 allSlots.update( [e.slot
for e
in sector] )
74 allSectorNames.update( [e.sectorname
for e
in sector] )
75 if len(allSlots) != 1:
76 raise RuntimeError(
"More than one slot defined for MIOCT %i" % mioct)
78 allSectorNames =
sorted(
list( allSectorNames ))
80 print(
' <MIOCT id="%i" slot="%s">' % ( mioct, slot ), file=xml)
81 print(
' <!-- contains sectors %s -->' %
", ".
join(allSectorNames), file=xml)
83 sector =
sorted(g[mioct][connector], key=attrgetter(
'eta',
'phi',
'etacode',
'phicode'))
84 print(
' <Sector connector="%s" name="%s">' % (connector,
", ".
join(
set([
str(e.sectorname)
for e
in sector])) ), file=xml)
85 print(
' <!-- contains %i ROIs -->' % len(sector), file=xml)
86 print(
' <!-- mapping from ROI to coding scheme -->', file=xml)
88 print(
' <ROI eta="%f" phi="%f" etacode="%s" phicode="%s" etamin="%f" etamax="%f" phimin="%f" phimax="%f" roiid="%i"/>' % (e.eta, e.phi, e.etacode, e.phicode, e.etamin, e.etamax, e.phimin, e.phimax, e.roi), file=xml)
89 print(
' </Sector>', file=xml)
92 map(allROIsInMIOCT.extend, g[mioct].
values())
94 print(
' <Decode>', file=xml)
96 for (eta_code,phi_code), rois
in groupby(
sorted(allROIsInMIOCT,key=attrgetter(
'etacode',
'phicode')), key=attrgetter(
'etacode',
'phicode')):
100 print(
' <TopoCell etacode="%s" phicode="%s" eta="%f" phi="%f" ieta="%i" iphi="%i" etamin="%f" etamax="%f" phimin="%f" phimax="%f"/>' % (eta_code, phi_code, eta, phi, ieta, iphi, etamin, etamax, phimin, phimax), file=xml)
101 print(
' </Decode>', file=xml)
102 print(
' </MIOCT>', file=xml)
104 print(
' <PtEncoding>', file=xml)
105 print(
' <PtCodeElement pt="1" code="0" value="4"/>', file=xml)
106 print(
' <PtCodeElement pt="2" code="1" value="6"/>', file=xml)
107 print(
' <PtCodeElement pt="3" code="2" value="10"/>', file=xml)
108 print(
' <PtCodeElement pt="4" code="2" value="11"/>', file=xml)
109 print(
' <PtCodeElement pt="5" code="2" value="15"/>', file=xml)
110 print(
' <PtCodeElement pt="6" code="2" value="20"/>', file=xml)
111 print(
' </PtEncoding>', file=xml)
112 print(
'</MuCTPiGeometry>', file=xml)
114 print(
"Wrote %s" % filename)
130 cellsEta = [(
min(e.etamin,e.etamax),
max(e.etamin,e.etamax))
for e
in rois]
131 etamins, etamaxs = zip(*cellsEta)
132 etamin =
min( [
min(e.etamin,e.etamax)
for e
in rois] )
133 etamax =
max( [
max(e.etamin,e.etamax)
for e
in rois] )
134 eta = (etamin+etamax)/2
140 cellsPhi = [(e.phimin, e.phimax)
for e
in rois]
143 upperedge = any([e.phi>6.2
for e
in rois])
144 loweredge = any([e.phi<0.2
for e
in rois])
145 splitTopoCell = upperedge
and loweredge
149 maxAtLowerEdge =
max([e.phimax
for e
in rois
if e.phi<1])
150 minAtUpperEdge =
min([e.phimin
for e
in rois
if e.phi>5])
151 centerTopoCell = minAtUpperEdge + maxAtLowerEdge
152 if centerTopoCell>=2*PI:
153 phimin = minAtUpperEdge - 2 * PI
154 phimax = maxAtLowerEdge
156 phimin = minAtUpperEdge
157 phimax = maxAtLowerEdge + 2 * PI
158 phi = (phimin+phimax)/2
162 phimins, phimaxs = zip(*cellsPhi)
163 phimin =
min(phimins)
164 phimax =
max(phimaxs)
165 phi = (phimin+phimax)/2
186 return (eta, phi, ieta, iphi, etamin, etamax, phimin, phimax)
197 print(
"Usage: %s <geomety.dat>" % os.path.basename(sys.argv[0]))
201 data =
open(sys.argv[1])
202 lines = [
Entry(*l.rstrip().
split())
for l
in data.readlines()
if not l.startswith(
'#')]
203 lines =
sorted(lines, key = attrgetter(
'mioct',
'connector') )
207 for k, g
in groupby(lines, key=attrgetter(
'mioct')):
209 for k2, g2
in groupby(g, key = attrgetter(
'connector')):
210 groups[k][k2] =
list(g2)
219 if __name__==
"__main__":
224 traceback.print_exc()