Belle II Software  release-08-01-10
b2test_utils_analysis.py
1 #!/usr/bin/env python3
2 
3 
10 
11 import os
12 import sys
13 import subprocess
14 import unittest
15 import glob
16 from basf2 import find_file
17 
18 
19 class ExamplesTest(unittest.TestCase):
20  """Test to run all example scripts."""
21 
22  @unittest.skipIf(not os.getenv('BELLE2_EXAMPLES_DATA_DIR'),
23  "$BELLE2_EXAMPLES_DATA_DIR not found.")
24  @unittest.skipIf(not os.getenv('BELLE2_VALIDATION_DATA_DIR'),
25  "$BELLE2_VALIDATION_DATA_DIR not found.")
26  def _test_examples_dir(self, path_to_glob, broken=None):
27  """
28  Internal function to test a directory full of example scripts with an optional list of broken scripts to be skipped.
29 
30  Parameters:
31  path_to_glob (str): the path to search for scripts
32  broken (list(str)): (optional) scripts that are known to be broken and can be skipped
33  """
34  if broken is None:
35  broken = []
36  all_egs = sorted(glob.glob(find_file(path_to_glob) + "/*.py"))
37  for eg in all_egs:
38  filename = os.path.basename(eg)
39  if filename not in broken:
40  with self.subTest(msg=filename):
41  result = subprocess.run(['basf2', '-n1', eg], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
42  if result.returncode != 0:
43  # failure running example so let's print the output
44  # on stderr so it's not split from output of unittest
45  # done like this since we don't want to decode/encode utf8
46  sys.stdout.buffer.write(result.stdout)
47  self.assertEqual(result.returncode, 0)
48 
49 
50 def scanTTree(filename):
51  from ROOT import TFile
52 
53  tfile = TFile(filename, "READ")
54  print(f"TFile: {filename}")
55 
56  # get lists of TTree in the filename
57  ttrees = [key.GetName() for key in tfile.GetListOfKeys() if key.GetClassName() == "TTree"]
58 
59  for ttree_name in ttrees:
60  print(f"TTree: {ttree_name}")
61 
62  # get TTree object
63  ttree = tfile.Get(ttree_name)
64  ttree.GetEntry(0)
65  # print name and value of all TBranch in the TTree
66  for branch in ttree.GetListOfBranches():
67  branch_name = branch.GetName()
68  branch_value = getattr(ttree, branch.GetName())
69  if isinstance(branch_value, float):
70  print(f"TBranch: {branch_name}, {branch_value:.4g}")
71  else:
72  print(f"TBranch: {branch_name}, {branch_value}")
73 
74  tfile.Close()
def _test_examples_dir(self, path_to_glob, broken=None)