6 from itertools
import groupby
7 from operator
import attrgetter
8 from math
import pi
as PI
12 """Represents a single input ROI (one line in the .dat file)
14 def __init__(self, subsystid, sectorid, roi, etamin, etamax, phimin, phimax, eta, phi, slot, connector, sectorname, mioct, sectoraddress, etacode, phicode):
43 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)
56 filename = os.path.basename(sys.argv[1]).
replace(
'.dat',
'.xml')
57 xml =
open(filename,
"w")
58 print(
'<?xml version="1.0" ?>\n', file=xml)
59 print(
'<!DOCTYPE MuCTPiGeometry SYSTEM "MUCTPIGeometry.dtd">\n', file=xml)
60 print(
'<MuCTPiGeometry>', file=xml)
61 for mioct
in sorted(g.keys()):
64 allSectorNames =
set()
65 for sector
in g[mioct].
values():
66 allSlots.update( [e.slot
for e
in sector] )
67 allSectorNames.update( [e.sectorname
for e
in sector] )
68 if len(allSlots) != 1:
69 raise RuntimeError(
"More than one slot defined for MIOCT %i" % mioct)
71 allSectorNames =
sorted(
list( allSectorNames ))
73 print(
' <MIOCT id="%i" slot="%s">' % ( mioct, slot ), file=xml)
74 print(
' <!-- contains sectors %s -->' %
", ".
join(allSectorNames), file=xml)
76 sector =
sorted(g[mioct][connector], key=attrgetter(
'eta',
'phi',
'etacode',
'phicode'))
77 print(
' <Sector connector="%s" name="%s">' % (connector,
", ".
join(
set([
str(e.sectorname)
for e
in sector])) ), file=xml)
78 print(
' <!-- contains %i ROIs -->' % len(sector), file=xml)
79 print(
' <!-- mapping from ROI to coding scheme -->', file=xml)
81 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)
82 print(
' </Sector>', file=xml)
85 map(allROIsInMIOCT.extend, g[mioct].
values())
87 print(
' <Decode>', file=xml)
89 for (eta_code,phi_code), rois
in groupby(
sorted(allROIsInMIOCT,key=attrgetter(
'etacode',
'phicode')), key=attrgetter(
'etacode',
'phicode')):
93 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)
94 print(
' </Decode>', file=xml)
95 print(
' </MIOCT>', file=xml)
97 print(
' <PtEncoding>', file=xml)
98 print(
' <PtCodeElement pt="1" code="0" value="4"/>', file=xml)
99 print(
' <PtCodeElement pt="2" code="1" value="6"/>', file=xml)
100 print(
' <PtCodeElement pt="3" code="2" value="10"/>', file=xml)
101 print(
' <PtCodeElement pt="4" code="2" value="11"/>', file=xml)
102 print(
' <PtCodeElement pt="5" code="2" value="15"/>', file=xml)
103 print(
' <PtCodeElement pt="6" code="2" value="20"/>', file=xml)
104 print(
' </PtEncoding>', file=xml)
105 print(
'</MuCTPiGeometry>', file=xml)
107 print(
"Wrote %s" % filename)
123 cellsEta = [(
min(e.etamin,e.etamax),
max(e.etamin,e.etamax))
for e
in rois]
124 etamins, etamaxs = zip(*cellsEta)
125 etamin =
min( [
min(e.etamin,e.etamax)
for e
in rois] )
126 etamax =
max( [
max(e.etamin,e.etamax)
for e
in rois] )
127 eta = (etamin+etamax)/2
133 cellsPhi = [(e.phimin, e.phimax)
for e
in rois]
136 upperedge = any([e.phi>6.2
for e
in rois])
137 loweredge = any([e.phi<0.2
for e
in rois])
138 splitTopoCell = upperedge
and loweredge
142 maxAtLowerEdge =
max([e.phimax
for e
in rois
if e.phi<1])
143 minAtUpperEdge =
min([e.phimin
for e
in rois
if e.phi>5])
144 centerTopoCell = minAtUpperEdge + maxAtLowerEdge
145 if centerTopoCell>=2*PI:
146 phimin = minAtUpperEdge - 2 * PI
147 phimax = maxAtLowerEdge
149 phimin = minAtUpperEdge
150 phimax = maxAtLowerEdge + 2 * PI
151 phi = (phimin+phimax)/2
155 phimins, phimaxs = zip(*cellsPhi)
156 phimin =
min(phimins)
157 phimax =
max(phimaxs)
158 phi = (phimin+phimax)/2
179 return (eta, phi, ieta, iphi, etamin, etamax, phimin, phimax)
190 print(
"Usage: %s <geomety.dat>" % os.path.basename(sys.argv[0]))
194 data =
open(sys.argv[1])
195 lines = [
Entry(*l.rstrip().
split())
for l
in data.readlines()
if not l.startswith(
'#')]
196 lines =
sorted(lines, key = attrgetter(
'mioct',
'connector') )
200 for k, g
in groupby(lines, key=attrgetter(
'mioct')):
202 for k2, g2
in groupby(g, key = attrgetter(
'connector')):
203 groups[k][k2] =
list(g2)
212 if __name__==
"__main__":
217 traceback.print_exc()