ATLAS Offline Software
xAODRootTest.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration.
2 #
3 # File: share/xAODRootTest.py
4 # Author: snyder@bnl.gov
5 # Date: Jun 2014
6 # Purpose: Test reading xAOD objects directly from root.
7 #
8 
9 # Work around library loading order issue seen with the LTO build.
10 # Otherwise we can get inconsistent resolution of a static std::string,
11 # leading to a free() failure during exit().
12 import ROOT
13 if ROOT.gSystem.FindDynamicLibrary ("libGaudiKernel", True):
14  ROOT.gSystem.Load("libGaudiKernel")
15 
16 import cppyy
17 
18 import sys
19 cppyy.load_library("libDataModelTestDataCommonDict")
20 if 'LOAD_WRITE_DIR' in globals():
21  cppyy.load_library("libDataModelTestDataWriteDict")
22 else:
23  cppyy.load_library("libDataModelTestDataReadDict")
24 
25 def CHECK(sc):
26  if not sc.isSuccess():
27  raise Exception ('bad StatusCode')
28  return
29 
30 
31 
32 reg=ROOT.SG.AuxTypeRegistry.instance()
33 
34 def _typename(t):
35  return getattr (t, '__cpp_name__', t.__name__)
36 
37 def xAODInit():
38  ROOT.xAOD.TEvent
39  CHECK(ROOT.xAOD.Init())
40 
41  # Monkey-patch...
42  ROOT.xAOD.TEvent.record_impl = ROOT.xAOD.TEvent.record
43  def record (event, obj, key, basketSize=32000, splitLevel = 1):
44  return event.record_impl (obj,
45  _typename (obj.__class__),
46  key,
47  basketSize, splitLevel)
48  ROOT.xAOD.TEvent.record = record
49  return
50 
51 
52 
53 cvec_cls=ROOT.DataVector(ROOT.DMTest.C_v1)
54 cel_cls=ROOT.ElementLink(cvec_cls)
55 
56 
57 
58 def format_int(x): return '%d'%x
59 def format_float(x): return '%.1f'%x
60 def format_el(x): return '%s[%d]' % (x.dataID(), x.index())
62  l = [format_float(x) for x in v]
63  return '[' + ','.join(l) + ']'
65  l = [format_int(x) for x in v]
66  return '[' + ','.join(l) + ']'
67 accessors = {
68  'int' : (ROOT.SG.ConstAccessor(int), format_int),
69  'unsigned int' : (getattr (ROOT, 'SG::ConstAccessor<unsigned int>'), format_int),
70  'float' : (ROOT.SG.ConstAccessor(float), format_float),
71  'std::vector<float>' : (getattr (ROOT, 'SG::ConstAccessor<std::vector<float> >'), format_float_vec),
72  'std::vector<int>' : (getattr (ROOT, 'SG::ConstAccessor<std::vector<int> >'), format_int_vec),
73  'ElementLink<DataVector<DMTest::C_v1> >' :
74  (ROOT.SG.ConstAccessor(cel_cls), format_el),
75  }
76 
77 def dump_auxitem (x, auxid, f = sys.stdout):
78  tname = reg.getTypeName (auxid)
79  ac_p = accessors.get (tname)
80  if not ac_p:
81  print ('<unknown %s>'%tname, end='', file=f)
82  else:
83  (ac_cl, formatter) = ac_p
84  val = ac_cl(reg.getName(auxid))(x)
85  print (formatter(val) + '; ', end='', file=f)
86  return
87 
88 
89 def dump_auxdata (x, exclude=[], f = sys.stdout):
90  auxids = list(x.getAuxIDs())
91  auxids = [(reg.getName(id), id) for id in auxids]
92  auxids.sort()
93  for name, auxid in auxids:
94  if name in exclude: continue
95  print (name + ': ', file=f, end='')
96  dump_auxitem (x, auxid, f)
97  return
98 
99 
100 def dump_c (c, f=sys.stdout):
101  if hasattr(c, '__deref__'):
102  c = c.__deref__()
103  print (' anInt1: %d; aFloat: %.1f; ' % (c.anInt(), c.aFloat()), end='')
104  dump_auxdata (c, exclude = ['anInt1', 'aFloat'])
105  print ('')
106  return
107 
108 
109 def dump_h (h, f=sys.stdout):
110  if hasattr(h, '__deref__'):
111  h = h.__deref__()
112  dump_auxdata (h)
113  print ('')
114  return
115 
116 
117 def copy_obj (event, obj, key):
118  copy = obj.__class__()
119  copy_aux = obj.getConstStore().__class__()
120  copy.setNonConstStore (copy_aux)
121  copy.__assign__ (obj)
122  CHECK (event.record (copy, key))
123  CHECK (event.record (copy_aux, key + 'Aux.'))
124  ROOT.SetOwnership (copy, False)
125  ROOT.SetOwnership (copy_aux, False)
126  return
127 
128 
129 def copy_vec (event, obj, key):
130  copy = obj.__class__()
131  copy_aux = obj.getConstStore().__class__()
132  copy.setNonConstStore (copy_aux)
133  for i in range(obj.size()):
134  elt_orig = obj[i]
135  if _typename (elt_orig.__class__).startswith ('DataModel_detail::ElementProxy<'):
136  elt_orig = elt_orig.__follow__()
137  elt = elt_orig.__class__()
138  copy.push_back(elt)
139  ROOT.SetOwnership (elt, False)
140  elt.__assign__ (elt_orig)
141  CHECK (event.record (copy, key))
142  CHECK (event.record (copy_aux, key + 'Aux.'))
143  ROOT.SetOwnership (copy, False)
144  ROOT.SetOwnership (copy_aux, False)
145  return
146 
147 
148 def copy_view (event, obj, key):
149  copy = obj.__class__(obj)
150  copy.toPersistent()
151  CHECK (event.record (copy, key))
152  ROOT.SetOwnership (copy, False)
153  return
154 
155 
157  def __init__ (self, readPrefix = ''):
158  self.readPrefix = readPrefix
159  return
160 
161 
162  def execute (self, tree, event=None):
163  print (self.readPrefix + 'cvec')
164  vec = getattr (tree, self.readPrefix + 'cvec')
165  for c in vec:
166  dump_c (c)
167 
168  print (self.readPrefix + 'cinfo')
169  cinfo = getattr (tree, self.readPrefix + 'cinfo')
170  dump_c (cinfo)
171 
172  print (self.readPrefix + 'ctrig')
173  ctrig = getattr (tree, self.readPrefix + 'ctrig')
174  for c in ctrig:
175  dump_c (c)
176 
177  vec = getattr (tree, self.readPrefix + 'cvecWD')
178  print (self.readPrefix + 'cvecWD' + ' ', vec.meta1)
179  for c in vec:
180  dump_c (c)
181 
182  vec = getattr (tree, self.readPrefix + 'cview')
183  print (self.readPrefix + 'cview')
184  for c in vec:
185  dump_c (c)
186 
187  print (self.readPrefix + 'hvec')
188  vec = getattr (tree, self.readPrefix + 'hvec')
189  for h in vec:
190  dump_h (h)
191 
192  #vec = getattr (tree, self.readPrefix + 'hview')
193  #print (self.readPrefix + 'hview')
194  #for h in vec:
195  # dump_h (h)
196 
197  return
198 
199 
201  def __init__ (self, readPrefix = '', writePrefix = None):
202  self.readPrefix = readPrefix
203  self.writePrefix = writePrefix
204  return
205 
206  def execute (self, tree, event):
207  CHECK (event.copy (self.readPrefix + 'cvec'))
208  CHECK (event.copy (self.readPrefix + 'cinfo'))
209  CHECK (event.copy (self.readPrefix + 'ctrig'))
210  CHECK (event.copy (self.readPrefix + 'cvecWD'))
211  CHECK (event.copy (self.readPrefix + 'cview'))
212  CHECK (event.copy (self.readPrefix + 'hvec'))
213  #CHECK (event.copy (self.readPrefix + 'hview'))
214 
215  if self.writePrefix != None:
216  cinfo = getattr (tree, self.readPrefix + 'cinfo')
217  copy_obj (event, cinfo, self.writePrefix + 'cinfo')
218 
219  cvec = getattr (tree, self.readPrefix + 'cvec')
220  copy_vec (event, cvec, self.writePrefix + 'cvec')
221 
222  ctrig = getattr (tree, self.readPrefix + 'ctrig')
223  copy_vec (event, ctrig, self.writePrefix + 'ctrig')
224 
225  cvecwd = getattr (tree, self.readPrefix + 'cvecWD')
226  copy_vec (event, cvecwd, self.writePrefix + 'cvecWD')
227 
228  cview = getattr (tree, self.readPrefix + 'cview')
229  copy_view (event, cview, self.writePrefix + 'cview')
230 
231  hvec = getattr (tree, self.readPrefix + 'hvec')
232  copy_vec (event, hvec, self.writePrefix + 'hvec')
233 
234  #hview = getattr (tree, self.readPrefix + 'hview')
235  #copy_view (event, hview, self.writePrefix + 'hview')
236 
237  return
238 
239 
241  def __init__ (self, decorName, offset=0, readPrefix = ''):
242  self.readPrefix = readPrefix
243  self.offset = offset
244  self.decor = ROOT.SG.Decorator(int)(decorName)
245  return
246 
247 
248  def execute (self, tree, event=None):
249  cvec = getattr (tree, self.readPrefix + 'cvec')
250  for c in cvec:
251  self.decor.set(c, self.offset + c.anInt())
252 
253  ctrig = getattr (tree, self.readPrefix + 'ctrig')
254  for c in cvec:
255  self.decor.set(c, self.offset + c.anInt())
256 
257  cinfo = getattr (tree, self.readPrefix + 'cinfo')
258  self.decor.set(cinfo, self.offset + cinfo.anInt())
259  return
260 
261 
263  def __init__ (self, decorName, offset=0, readPrefix = ''):
264  self.readPrefix = readPrefix
265  self.offset = offset
266  self.decor = ROOT.SG.Decorator(int)(decorName)
267  return
268 
269 
270  def execute (self, tree, event=None):
271  cvec = getattr (tree, self.readPrefix + 'cvec')
272  assert cvec.setOption (self.decor.auxid(), ROOT.SG.AuxDataOption ('nbins', 23))
273  for c in cvec:
274  self.decor.set(c, self.offset + c.anInt())
275  return
276 
277 
279  def __init__ (self, readPrefix = ''):
280  self.readPrefix = readPrefix
281  return
282 
283 
284  def execute (self, tree, event=None):
285  cvec = getattr (tree, self.readPrefix + 'cvec')
286  cvec.clearDecorations()
287 
288  ctrig = getattr (tree, self.readPrefix + 'ctrig')
289  ctrig.clearDecorations()
290 
291  cinfo = getattr (tree, self.readPrefix + 'cinfo')
292  cinfo.clearDecorations()
293  return
294 
295 
296 
298  def execute (self, tree, event=None):
299  cont = tree.AllocTest
300  print ('AllocTest: ', end='')
301  for a in cont:
302  print (a.atInt1(), a.atInt2(), end=' ')
303  print()
304  return
305 
306 
307 
308 class Analysis:
309  def __init__ (self, ifname, ofname = None):
310  self.algs = []
311  self.f = ROOT.TFile (ifname)
312  self.event = ROOT.xAOD.TEvent (ROOT.xAOD.TEvent.kAthenaAccess)
313  CHECK (self.event.readFrom (self.f, True, 'CollectionTree'))
314  self.tree = ROOT.xAOD.MakeTransientTree(self.event, 'CollectionTree')
315  self.fout = None
316  if ofname:
317  self.fout = ROOT.TFile.Open (ofname, 'recreate')
318  CHECK (self.event.writeTo (self.fout))
319  return
320 
321  def add (self, alg):
322  self.algs.append (alg)
323  return
324 
325  def run (self, n=None):
326  nent = self.tree.GetEntries()
327  if n != None:
328  nent = min (n, nent)
329  for i in range(nent):
330  self.tree.GetEntry(i)
331  print ('---> Event', i)
332  for a in self.algs:
333  a.execute (self.tree, self.event)
334  if self.fout != None:
335  self.event.fill()
336  return
337 
338  def finalize (self):
339  if self.fout:
340  CHECK (self.event.finishWritingTo (self.fout))
341  return
342 
343 
xAODRootTest.xAODTestClearDecor
Definition: xAODRootTest.py:278
xAODRootTest.AllocTestRead
Definition: xAODRootTest.py:297
xAODRootTest.xAODTestRead.execute
def execute(self, tree, event=None)
Definition: xAODRootTest.py:162
xAODRootTest.xAODTestPDecor
Definition: xAODRootTest.py:262
xAODRootTest.xAODTestClearDecor.__init__
def __init__(self, readPrefix='')
Definition: xAODRootTest.py:279
xAODRootTest.xAODTestCopy.writePrefix
writePrefix
Definition: xAODRootTest.py:203
xAODRootTest.xAODTestCopy.execute
def execute(self, tree, event)
Definition: xAODRootTest.py:206
xAODRootTest.xAODTestPDecor.readPrefix
readPrefix
Definition: xAODRootTest.py:264
xAODRootTest.xAODTestPDecor.decor
decor
Definition: xAODRootTest.py:266
xAODRootTest._typename
def _typename(t)
Definition: xAODRootTest.py:34
xAODRootTest.format_int_vec
def format_int_vec(v)
Definition: xAODRootTest.py:64
xAODRootTest.dump_c
def dump_c(c, f=sys.stdout)
Definition: xAODRootTest.py:100
xAODRootTest.Analysis.event
event
Definition: xAODRootTest.py:312
xAODRootTest.xAODTestDecor.__init__
def __init__(self, decorName, offset=0, readPrefix='')
Definition: xAODRootTest.py:241
xAODRootTest.xAODTestDecor.decor
decor
Definition: xAODRootTest.py:244
xAODRootTest.xAODTestRead
Definition: xAODRootTest.py:156
xAODRootTest.xAODTestDecor.offset
offset
Definition: xAODRootTest.py:243
xAODRootTest.Analysis
Definition: xAODRootTest.py:308
xAODRootTest.xAODTestCopy
Definition: xAODRootTest.py:200
xAODRootTest.Analysis.finalize
def finalize(self)
Definition: xAODRootTest.py:338
xAODRootTest.xAODTestDecor.execute
def execute(self, tree, event=None)
Definition: xAODRootTest.py:248
xAODRootTest.format_int
def format_int(x)
Definition: xAODRootTest.py:58
xAODRootTest.AllocTestRead.execute
def execute(self, tree, event=None)
Definition: xAODRootTest.py:298
xAODRootTest.Analysis.algs
algs
Definition: xAODRootTest.py:310
xAODRootTest.format_el
def format_el(x)
Definition: xAODRootTest.py:60
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
xAODRootTest.Analysis.f
f
Definition: xAODRootTest.py:311
xAODRootTest.Analysis.__init__
def __init__(self, ifname, ofname=None)
Definition: xAODRootTest.py:309
xAODRootTest.xAODTestPDecor.execute
def execute(self, tree, event=None)
Definition: xAODRootTest.py:270
xAODRootTest.copy_view
def copy_view(event, obj, key)
Definition: xAODRootTest.py:148
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
CxxUtils::set
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition: bitmask.h:224
xAODRootTest.xAODTestCopy.readPrefix
readPrefix
Definition: xAODRootTest.py:202
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
xAODRootTest.xAODTestClearDecor.readPrefix
readPrefix
Definition: xAODRootTest.py:280
vtune_athena.formatter
formatter
Definition: vtune_athena.py:19
xAODRootTest.format_float
def format_float(x)
Definition: xAODRootTest.py:59
xAODRootTest.xAODInit
def xAODInit()
Definition: xAODRootTest.py:37
xAODRootTest.xAODTestPDecor.__init__
def __init__(self, decorName, offset=0, readPrefix='')
Definition: xAODRootTest.py:263
xAODRootTest.xAODTestDecor.readPrefix
readPrefix
Definition: xAODRootTest.py:242
xAODRootTest.dump_auxitem
def dump_auxitem(x, auxid, f=sys.stdout)
Definition: xAODRootTest.py:77
lumiFormat.fill
fill
Definition: lumiFormat.py:111
xAODRootTest.CHECK
def CHECK(sc)
Definition: xAODRootTest.py:25
xAODRootTest.xAODTestRead.__init__
def __init__(self, readPrefix='')
Definition: xAODRootTest.py:157
generate::GetEntries
double GetEntries(TH1D *h, int ilow, int ihi)
Definition: rmsFrac.cxx:20
Muon::print
std::string print(const MuPatSegment &)
Definition: MuonTrackSteering.cxx:28
xAODRootTest.xAODTestClearDecor.execute
def execute(self, tree, event=None)
Definition: xAODRootTest.py:284
xAODRootTest.copy_obj
def copy_obj(event, obj, key)
Definition: xAODRootTest.py:117
xAODRootTest.Analysis.add
def add(self, alg)
Definition: xAODRootTest.py:321
xAODRootTest.dump_h
def dump_h(h, f=sys.stdout)
Definition: xAODRootTest.py:109
xAODRootTest.xAODTestDecor
Definition: xAODRootTest.py:240
xAODRootTest.xAODTestCopy.__init__
def __init__(self, readPrefix='', writePrefix=None)
Definition: xAODRootTest.py:201
xAODRootTest.xAODTestPDecor.offset
offset
Definition: xAODRootTest.py:265
xAODRootTest.format_float_vec
def format_float_vec(v)
Definition: xAODRootTest.py:61
xAODRootTest.Analysis.fout
fout
Definition: xAODRootTest.py:315
xAODRootTest.Analysis.tree
tree
Definition: xAODRootTest.py:314
xAODRootTest.xAODTestRead.readPrefix
readPrefix
Definition: xAODRootTest.py:158
xAODRootTest.copy_vec
def copy_vec(event, obj, key)
Definition: xAODRootTest.py:129
xAODRootTest.Analysis.run
def run(self, n=None)
Definition: xAODRootTest.py:325
xAODRootTest.dump_auxdata
def dump_auxdata(x, exclude=[], f=sys.stdout)
Definition: xAODRootTest.py:89