ATLAS Offline Software
Loading...
Searching...
No Matches
python.CTPfragment Namespace Reference

Functions

 _versioned (obj, name, version)
 _setBits32 (bitset, value, shift, mask)
 decodeTriggerBits (info)
 encodeTriggerBits (bits, len=1)
 ctpFormatVersion (rob)
 setCtpFormatVersion (rob, version)
 hltCounter (rob)
 setHltCounter (rob, hltCounter)
 lumiBlock (rob)
 setLumiBlock (rob, lb)
 numberExtraPayloadWords (rob)
 numberHltExtraPayloadWords (rob)
 hltExtraPayloadWords (rob)
 getExtraPayloadObject (rob)
 setHltExtraPayloadWords (rob, extraWords)
 lvl1AcceptBunch (rob)
 getTriggerWords (rob, name='TAV')
 main ()

Variables

 FolderEntry = _CTPfragment.FolderEntry
 ExtraPayload = _CTPfragment.ExtraPayload

Detailed Description

Minimal python module for CTP fragment access/modification

For C++ implementation see:
https://gitlab.cern.ch/atlas-tdaq-software/CTPfragment

Function Documentation

◆ _setBits32()

python.CTPfragment._setBits32 ( bitset,
value,
shift,
mask )
protected
Set value in bitset using mask and shifting n bits to the left

Definition at line 35 of file CTPfragment.py.

35def _setBits32(bitset, value, shift, mask):
36 """Set value in bitset using mask and shifting n bits to the left"""
37 v = bitset & (0xffffffff ^ (mask << shift))
38 v = v | (value << shift)
39 return v
40

◆ _versioned()

python.CTPfragment._versioned ( obj,
name,
version )
protected
Helper to return versioned members of CTPdataformat

Definition at line 24 of file CTPfragment.py.

24def _versioned(obj, name, version):
25 """Helper to return versioned members of CTPdataformat"""
26 attr = ''
27 v = version
28 while v>=0: # decrement version until found
29 attr = '%s_v%d' % (name, v)
30 if hasattr(obj,attr):
31 break
32 v -= 1
33 return getattr(obj,attr)
34

◆ ctpFormatVersion()

python.CTPfragment.ctpFormatVersion ( rob)
Get CTP fragment format version

Definition at line 61 of file CTPfragment.py.

61def ctpFormatVersion(rob):
62 """Get CTP fragment format version"""
63 v = (rob.rod_minor_version() >> CTPdataformat.CTPFormatVersionShift) & CTPdataformat.CTPFormatVersionMask
64 return v
65

◆ decodeTriggerBits()

python.CTPfragment.decodeTriggerBits ( info)
Return list of bits [0,1,1,0,...] from list of 32-bit trigger words

Definition at line 41 of file CTPfragment.py.

41def decodeTriggerBits(info):
42 """Return list of bits [0,1,1,0,...] from list of 32-bit trigger words"""
43 if type(info)==int:
44 info=[info]
45 bits=[]
46 cnt=0
47 for word in info:
48 for i in range(32):
49 if word&(1<<i):
50 bits+=[cnt]
51 cnt+=1
52 return bits
53

◆ encodeTriggerBits()

python.CTPfragment.encodeTriggerBits ( bits,
len = 1 )
Return list of trigger words from list of bits

Definition at line 54 of file CTPfragment.py.

54def encodeTriggerBits(bits,len=1):
55 """Return list of trigger words from list of bits"""
56 words = [0] * len
57 for bit in bits:
58 words[bit//32] |= 1<<(bit%32)
59 return words
60

◆ getExtraPayloadObject()

python.CTPfragment.getExtraPayloadObject ( rob)
Return CTPfragment::ExtraPayload object created from CTP ROB

Definition at line 110 of file CTPfragment.py.

110def getExtraPayloadObject(rob):
111 """Return CTPfragment::ExtraPayload object created from CTP ROB"""
112 v = cppyy.gbl.std.vector('unsigned int')()
113 for p in hltExtraPayloadWords(rob):
114 v.push_back(p)
115
116 x = _CTPfragment.ExtraPayload(v)
117 return x
118

◆ getTriggerWords()

python.CTPfragment.getTriggerWords ( rob,
name = 'TAV' )
Get trigger words

Definition at line 157 of file CTPfragment.py.

157def getTriggerWords(rob,name='TAV'):
158 """Get trigger words"""
159
160 name = name.upper()
161 v = ctpFormatVersion(rob)
162 pos = _versioned(CTPdataformat,name+'pos',min(v,4))
163 words = _versioned(CTPdataformat,name+'words',min(v,4))
164 # No TAP in RoI ROB
165 if v>4 and rob.source_id().module_id()==1:
166 pos = _versioned(CTPdataformat,name+'pos',5)
167 if name=='TAP':
168 return []
169
170 l1abunch = 0 if rob.source_id().module_id()==1 else lvl1AcceptBunch(rob)
171
172 data = [d for d in rob.rod_data()]
173 pos = l1abunch*_versioned(CTPdataformat,'DAQwordsPerBunch',v) + pos
174 return data[pos:pos+words]
175
176#
177# For testing
178#
179
#define min(a, b)
Definition cfImp.cxx:40

◆ hltCounter()

python.CTPfragment.hltCounter ( rob)
Get HLT counter

Definition at line 72 of file CTPfragment.py.

72def hltCounter(rob):
73 """Get HLT counter"""
74 v = ctpFormatVersion(rob)
75 return (rob.rod_detev_type() >> _versioned(CTPdataformat,'HltCounterShift',v) & _versioned(CTPdataformat,'HltCounterMask',v))
76

◆ hltExtraPayloadWords()

python.CTPfragment.hltExtraPayloadWords ( rob)

Definition at line 103 of file CTPfragment.py.

103def hltExtraPayloadWords(rob):
104 n = numberHltExtraPayloadWords(rob)
105 offset = 0
106 if ctpFormatVersion(rob)>=3:
107 offset = 1 # for turn counter
108 return rob.rod_data()[-numberHltExtraPayloadWords(rob)+offset:] if n>0 else []
109

◆ lumiBlock()

python.CTPfragment.lumiBlock ( rob)

Definition at line 83 of file CTPfragment.py.

83def lumiBlock(rob):
84 return (rob.rod_detev_type() >> CTPdataformat.LumiBlockShift & CTPdataformat.LumiBlockMask)
85

◆ lvl1AcceptBunch()

python.CTPfragment.lvl1AcceptBunch ( rob)
Get position of LVL1-Accept Bunch from ROD Fragment

Definition at line 147 of file CTPfragment.py.

147def lvl1AcceptBunch(rob):
148 """Get position of LVL1-Accept Bunch from ROD Fragment"""
149
150 v = ctpFormatVersion(rob)
151 shift = _versioned(CTPdataformat,'L1APositionShift',v)
152 if v==0:
153 return (rob.rod_detev_type() >> shift) & CTPdataformat.L1APositionMask
154 else:
155 return (rob.rod_minor_version() >> shift) & CTPdataformat.L1APositionMask
156

◆ main()

python.CTPfragment.main ( )

Definition at line 180 of file CTPfragment.py.

180def main():
181 from optparse import OptionParser
182 import eformat
183
184 parser = OptionParser(usage='%prog FILE')
185 parser.add_option('-m', '--moduleid', type='int', action='store', default=0,
186 help='Module ID of CTP fragment [%default]')
187
188 (opt, args) = parser.parse_args()
189 if len(args)!=1:
190 parser.print_help()
191 return 1
192
193 for event in eformat.istream(args[0]):
194 ctp_robs = [rob for rob in event.children()
195 if rob.source_id().subdetector_id() == eformat.helper.SubDetector.TDAQ_CTP
196 and rob.source_id().module_id() == opt.moduleid]
197
198 if len(ctp_robs)==0:
199 print("Cannot find CTP ROB with module ID %d" % opt.moduleid)
200 continue
201
202 rob = ctp_robs[0]
203 fe = _CTPfragment.FolderEntry()
204 fe.folderIndex = 1
205 fe.lumiBlock = 54
206
207 fe2 = _CTPfragment.FolderEntry()
208 fe2.folderIndex = 2
209 fe2.lumiBlock = 59
210
211 #x = getExtraPayloadObject(rob)
212 x = _CTPfragment.ExtraPayload()
213 x.setL1PSK(255)
214 x.updateFolder(fe)
215 x.updateFolder(fe2)
216 new_ctp_rob = setHltExtraPayloadWords(rob, [d for d in x.serialize()])
217 new_event = eformat.write.FullEventFragment()
218 new_event.copy_header(event)
219 for r in event.children():
220 if r.source_id().subdetector_id() != eformat.helper.SubDetector.TDAQ_CTP:
221 new_event.append(eformat.write.ROBFragment(r))
222
223 new_event.append(eformat.write.ROBFragment(new_ctp_rob))
224
225 event = new_event.readonly()
226 #new_ctp_rob = eformat.write.ROBFragment(new_ctp_rob)
227 #setHltCounter(new_ctp_rob,100)
228 rob = new_ctp_rob
229
230 x = getExtraPayloadObject(rob)
231 folderUpdates = _CTPfragment.getFolderUpdates(x)
232 upd = ''
233 for f in folderUpdates:
234 upd += ('[%d,%d]' % (f.second.folderIndex,f.second.lumiBlock))
235
236 print("L1ID %10d, LB %4d, Version %d, Bunch %d, HLT counter: %3d, Payload #%d %s L1PSK %d BGK %d COOLUPD %s" % (
237 event.lvl1_id(),
238 event.lumi_block(),
239 ctpFormatVersion(rob),
240 lvl1AcceptBunch(rob),
241 hltCounter(rob),
242 numberHltExtraPayloadWords(rob),
243 hltExtraPayloadWords(rob),
244 x.getL1PSK(),
245 x.getBGK(),
246 upd
247 ))
248
void print(char *figname, TCanvas *c1)
int main()
Definition hello.cxx:18

◆ numberExtraPayloadWords()

python.CTPfragment.numberExtraPayloadWords ( rob)
Number extra payload words (this includes the time since last L1A)

Definition at line 90 of file CTPfragment.py.

90def numberExtraPayloadWords(rob):
91 """Number extra payload words (this includes the time since last L1A)"""
92 v = ctpFormatVersion(rob)
93 if v < 2:
94 return 0
95 else:
96 return ((rob.rod_minor_version() >> _versioned(CTPdataformat,'ProgrammableExtraWordsShift',v)
97 & _versioned(CTPdataformat,'ProgrammableExtraWordsMask',v)))
98

◆ numberHltExtraPayloadWords()

python.CTPfragment.numberHltExtraPayloadWords ( rob)
Number extra payload words (this does NOT include the time since last L1A)

Definition at line 99 of file CTPfragment.py.

99def numberHltExtraPayloadWords(rob):
100 """Number extra payload words (this does NOT include the time since last L1A)"""
101 return max(numberExtraPayloadWords(rob)-1, 0)
102
#define max(a, b)
Definition cfImp.cxx:41

◆ setCtpFormatVersion()

python.CTPfragment.setCtpFormatVersion ( rob,
version )
Set CTP fragment format version

Definition at line 66 of file CTPfragment.py.

66def setCtpFormatVersion(rob, version):
67 """Set CTP fragment format version"""
68 V = _setBits32(rob.rod_minor_version(), version,
69 CTPdataformat.CTPFormatVersionShift, CTPdataformat.CTPFormatVersionMask)
70 rob.rod_minor_version(V)
71

◆ setHltCounter()

python.CTPfragment.setHltCounter ( rob,
hltCounter )
Set HLT counter

Definition at line 77 of file CTPfragment.py.

77def setHltCounter(rob, hltCounter):
78 """Set HLT counter"""
79 v = ctpFormatVersion(rob)
80 c = _setBits32(rob.rod_detev_type(), hltCounter, _versioned(CTPdataformat,'HltCounterShift',v), _versioned(CTPdataformat,'HltCounterMask',v))
81 rob.rod_detev_type(c)
82

◆ setHltExtraPayloadWords()

python.CTPfragment.setHltExtraPayloadWords ( rob,
extraWords )

Definition at line 119 of file CTPfragment.py.

119def setHltExtraPayloadWords(rob, extraWords):
120
121 # Make writable ROB
122 wrob = eformat.write.ROBFragment(rob)
123 # Copy ROD data, except extra words
124 data = [d for d in wrob.rod_data()]
125 n = numberHltExtraPayloadWords(rob)
126 if n>0:
127 data = data[:-n]
128 # Append new extra words and set in ROB
129 v = ctpFormatVersion(wrob)
130 if v<2:
131 setCtpFormatVersion(wrob, 2) # need at least V2
132 data.extend([0]) # time since last L1A
133 data.extend(extraWords)
134 wrob.rod_data(data)
135
136 # Set new payload length (including words reserved by CTP)
137 ctp_extras = 1 # time since last L1A
138 if v>=3:
139 ctp_extras = 2 # turn counter
140 V = _setBits32(wrob.rod_minor_version(), len(extraWords)+ctp_extras,
141 _versioned(CTPdataformat,'ProgrammableExtraWordsShift',v),
142 _versioned(CTPdataformat,'ProgrammableExtraWordsMask',v))
143 wrob.rod_minor_version(V)
144
145 return wrob.readonly()
146

◆ setLumiBlock()

python.CTPfragment.setLumiBlock ( rob,
lb )

Definition at line 86 of file CTPfragment.py.

86def setLumiBlock(rob, lb):
87 lbits = _setBits32(rob.rod_detev_type(), lb, CTPdataformat.LumiBlockShift, CTPdataformat.LumiBlockMask)
88 rob.rod_detev_type(lbits)
89

Variable Documentation

◆ ExtraPayload

python.CTPfragment.ExtraPayload = _CTPfragment.ExtraPayload

Definition at line 22 of file CTPfragment.py.

◆ FolderEntry

python.CTPfragment.FolderEntry = _CTPfragment.FolderEntry

Definition at line 21 of file CTPfragment.py.