ATLAS Offline Software
Loading...
Searching...
No Matches
LArExtendedFTGrouping.py
Go to the documentation of this file.
1# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
2
3
5 def __init__(self):
6 self._EMBC=range(3,35)#+[1006]
7 self._EMBA=range(35,67)#+[1005]
8 self._EMBCPS=range(117,149)#+[]
9 self._EMBAPS=range(149,181)#+[]
10
11 #List of EMEC OW channels (C-side)
12 EMEC=(67, 68, 69, 71, 72, 74, 75, 76, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88, 90, 91)
13 self._EMECC=EMEC+(231,233,235,237) # EMEC C OW + IW
14 self._EMECA=()
15 for i in EMEC: #EMECA OW is EMECC OW +25
16 self._EMECA+=(i+25,)
17 self._EMECA+=(232,234,236,238) #EMECA OW + EMECA IW
18
19 self._EMECCPS=()
20 self._EMECAPS=()
21 for i in EMEC:
22 self._EMECCPS+=(i+114,)
23 self._EMECAPS+=(i+139,)
24
25 self._HECC=(70,77,83,89)
26 self._HECA=()
27 for i in self._HECC:
28 self._HECA+=(i+25,)
29
30 self._FCALC=(73,)
31 self._FCALA=(73+25,)
32
33 self._emptyC=(184,187,191,197,203)
34 self._emptyA=(209,212,216,222,228)
35 self._empty=self._emptyC + self._emptyA
36
37 self._withCorr=True
38
39 #Build dictionary:
40 self._partitions=dict()
41 self._partitions['EMBAPS'] = self._EMBAPS
42 self._partitions['EMBCPS'] = self._EMBCPS
43 self._partitions['EMECAPS'] = self._EMECAPS
44 self._partitions['EMECCPS'] = self._EMECCPS
45 self._partitions['EMBA'] = self._EMBA
46 self._partitions['EMBC'] = self._EMBC
47 self._partitions['EMECA']= self._EMECA
48 self._partitions['EMECC'] = self._EMECC
49 self._partitions['HECA'] = self._HECA
50 self._partitions['HECC'] = self._HECC
51 self._partitions['FCALA'] = self._FCALA
52 self._partitions['FCALC'] = self._FCALC
53 self._partitions['EMPTYA'] = self._emptyA
54 self._partitions['EMPTYC'] = self._emptyC
55
56 #Correction Channels:
57 self._corr=dict()
58 self._corr['EMBAPS'] = 1001
59 self._corr['EMBCPS'] = 1002
60 self._corr['EMECAPS'] = 1003
61 self._corr['EMECCPS'] = 1004
62 self._corr['EMBA'] = 1005
63 self._corr['EMBC'] = 1006
64 self._corr['EMECA'] = 1007
65 self._corr['EMECC'] = 1008
66 self._corr['HECA'] = 1009
67 self._corr['HECC'] = 1010
68 self._corr['FCALA'] = 1011
69 self._corr['FCALC'] = 1012
70
71 #Lookup-dict indexed by channel (partition is the payload)
72 self._revLookup=dict()
73 for (p, chs) in self._partitions.iteritems():
74 for c in chs:
75 self._revLookup[c]=p
76
77
78 def setWithCorr(self,val):
79 self._withCorr=val
80
81 def Print(self):
82 print(self._EMBC)
83 print(self._EMBA)
84
85
86 def getChannelList(self,partitions,gains=[0]):
87 chans=list()
88 for g in gains:
89 if g<0 or g>2:
90 print("ERROR: Unkown gain",g)
91 return None
92
93 extPart=list()
94 for partition in partitions:
95 p=partition.upper()
96 if (p=="ECC"):
97 extPart+=["EMECCPS","EMECC","HECC","FCALC"]
98 elif (p=="ECA"):
99 extPart+=["EMECAPS","EMECA","HECA","FCALA"]
100 elif (p=="EC"):
101 extPart+=["EMECAPS","EMECA","HECA","FCALA",
102 "EMECCPS","EMECC","HECC","FCALC"]
103 elif (p=="EMB"):
104 extPart+=["EMBA","EMBAPS","EMBC","EMBCPS"]
105 else:
106 extPart+=[p]
107
108 for p in extPart:
109 if p in self._partitions:
110 for g in gains:
111 for c in self._partitions[p]:
112 chans+=[c+(g*236)]
113 if (self._withCorr):
114 for g in gains:
115 chans+=[self._corr[p]+g*12]
116 else:
117 print("ERROR: Unkown partition '",partition,"'")
118
119 return chans
120
121 def makeRange(self,chans):
122 chans.sort()
123 retVal=""
124 if (len(chans)==0):
125 return retVal
126 retVal=str(chans[0])
127 c1=chans[0]
128 series=False
129 for c2 in chans[1:]:
130 if c1 == c2:
131 print("Duplicated entry",c2)
132 continue
133 if c2-1 == c1 or c2-1 in self._empty:
134 series=True
135 else:
136 if series:
137 retVal+=":"+str(c1)+","+str(c2)
138 series=False
139 else:
140 retVal+=","+str(c2)
141# print ("c1=",c1,"c2=",c2,"sep=",sep)
142 c1=c2
143 if series: retVal+=":"+str(c1)
144 return retVal
145
146
147
148 def getChannelSelection(self,partitions,gains):
149 return self.makeRange(self.getChannelList(partitions,gains))
150
151 def getChannelSelectionAllGains(self,partitions):
152 chans=list()
153 for p in partitions:
154 chans+=self.getChannelList([p],[0,1,2])
155 return self.makeRange(chans)
156
157
158 def getGain(self,c):
159 if c<2:
160 return (0,None)
161 if c<239:
162 return (0,c)
163 if c<475:
164 return (1,c-236)
165 if c<711:
166 return (2,c-472)
167 if c<1001:
168 return (0,None)
169 if c<1013:
170 return (0,c)
171 if c<1025:
172 return (1,c-12)
173 if c<1037:
174 return (2,c-24)
175 return (0,None)
176
177
178 def channelsPerPartition(self,chans,show=True):
179 class counterElem:
180 def __init__(self,l,n):
181 self.size=l
182 self.name=n
183 self.counts=[0,0,0]
184 def inc(self,g):
185 self.counts[g]=1+self.counts[g]
186
187 def show(self):
188 print("%7s: " % self.name, end="")
189 print("HIGH:%2i/%2i" % (self.counts[0],self.size),)
190 if self.counts[0] != self.size:
191 print ("* ",end="")
192 else:
193 print (" ",end="")
194 print ("MED:%2i/%2i" % (self.counts[1],self.size),)
195 if self.counts[1] != self.size:
196 print ("* ",end="")
197 else:
198 print (" ",end="")
199 print ("LOW:%2i/%2i" % (self.counts[2],self.size),)
200 if self.counts[2] != self.size:
201 print ("* ")
202 else:
203 print (" ")
204
205 partCounter=dict()
206 for (p, chs) in self._partitions.iteritems():
207 partCounter[p]=counterElem(len(chs),p)
208
209 for c in chans:
210 (gain,cs)=self.getGain(c)
211 if cs is None:
212 print("ERROR: Unkown channel",c)
213 else:
214 if (c<711):
215 p=self._revLookup[cs]
216 partCounter[p].inc(gain)
217
218 return partCounter
219
220
void print(char *figname, TCanvas *c1)