90def numberExtraPayloadWords(rob):
91 """Number extra payload words (this includes the time since last L1A)"""
92 v = ctpFormatVersion(rob)
96 return ((rob.rod_minor_version() >> _versioned(CTPdataformat,'ProgrammableExtraWordsShift',v)
97 & _versioned(CTPdataformat,'ProgrammableExtraWordsMask',v)))
103def hltExtraPayloadWords(rob):
104 n = numberHltExtraPayloadWords(rob)
106 if ctpFormatVersion(rob)>=3:
107 offset = 1 # for turn counter
108 return rob.rod_data()[-numberHltExtraPayloadWords(rob)+offset:] if n>0 else []
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):
116 x = _CTPfragment.ExtraPayload(v)
119def setHltExtraPayloadWords(rob, extraWords):
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)
128 # Append new extra words and set in ROB
129 v = ctpFormatVersion(wrob)
131 setCtpFormatVersion(wrob, 2) # need at least V2
132 data.extend([0]) # time since last L1A
133 data.extend(extraWords)
136 # Set new payload length (including words reserved by CTP)
137 ctp_extras = 1 # time since last L1A
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)
145 return wrob.readonly()
147def lvl1AcceptBunch(rob):
148 """Get position of LVL1-Accept Bunch from ROD Fragment"""
150 v = ctpFormatVersion(rob)
151 shift = _versioned(CTPdataformat,'L1APositionShift',v)
153 return (rob.rod_detev_type() >> shift) & CTPdataformat.L1APositionMask
155 return (rob.rod_minor_version() >> shift) & CTPdataformat.L1APositionMask
157def getTriggerWords(rob,name='TAV'):
158 """Get trigger words"""
161 v = ctpFormatVersion(rob)
162 pos = _versioned(CTPdataformat,name+'pos',min(v,4))
163 words = _versioned(CTPdataformat,name+'words',min(v,4))
165 if v>4 and rob.source_id().module_id()==1:
166 pos = _versioned(CTPdataformat,name+'pos',5)
170 l1abunch = 0 if rob.source_id().module_id()==1 else lvl1AcceptBunch(rob)
172 data = [d for d in rob.rod_data()]
173 pos = l1abunch*_versioned(CTPdataformat,'DAQwordsPerBunch',v) + pos
174 return data[pos:pos+words]
181 from optparse import OptionParser
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]')
188 (opt, args) = parser.parse_args()
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]
199 print("Cannot find CTP ROB with module ID %d" % opt.moduleid)
203 fe = _CTPfragment.FolderEntry()
207 fe2 = _CTPfragment.FolderEntry()
211 #x = getExtraPayloadObject(rob)
212 x = _CTPfragment.ExtraPayload()
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))
223 new_event.append(eformat.write.ROBFragment(new_ctp_rob))
225 event = new_event.readonly()
226 #new_ctp_rob = eformat.write.ROBFragment(new_ctp_rob)
227 #setHltCounter(new_ctp_rob,100)
230 x = getExtraPayloadObject(rob)
231 folderUpdates = _CTPfragment.getFolderUpdates(x)
233 for f in folderUpdates:
234 upd += ('[%d,%d]' % (f.second.folderIndex,f.second.lumiBlock))
236 print("L1ID %10d, LB %4d, Version %d, Bunch %d, HLT counter: %3d, Payload #%d %s L1PSK %d BGK %d COOLUPD %s" % (
239 ctpFormatVersion(rob),
240 lvl1AcceptBunch(rob),
242 numberHltExtraPayloadWords(rob),
243 hltExtraPayloadWords(rob),