Belle II Software development
test_ntupleMetaData.py
1#!/usr/bin/env python3
2
3
10
11import socket
12from ROOT import Belle2, TFile
13import basf2 as b2
14from basf2.version import get_version
15from b2test_utils import safe_process, clean_working_directory
16
17import os
18import subprocess
19import json
20from datetime import datetime
21
22b2.set_random_seed("something random")
23
24testFile = 'ntuplemetadata.root'
25inputFile1 = 'test1.root'
26inputFile2 = 'test2.root'
27dataDescription1 = {"adding_custom_key": "works"}
28dataDescription2 = {"with_multiple": "trees"}
29
30
31def get_metadata(name="output.root"):
32 """Get the metadata out of a root file"""
33 out = TFile(name)
34 t = out.Get("persistent")
35 t.GetEntry(0)
36 return Belle2.FileMetaData(t.FileMetaData)
37
38
39def generate_test_data(filename, evtNumList, runList, expList):
40 main = b2.create_path()
41
42 main.add_module("EventInfoSetter", evtNumList=evtNumList, runList=runList, expList=expList)
43 main.add_module("RootOutput", outputFileName=filename)
44
45 b2.process(main)
46
47 return os.path.abspath(filename)
48
49
50with clean_working_directory() as tmpdir:
51
52 # generate input files
53 evtNumList = [9, 1]
54 runList = [1, 30]
55 expList = [7, 7]
56 generate_test_data(inputFile1, evtNumList, runList, expList)
57
58 evtNumList = [19, 11]
59 runList = [17, 19]
60 expList = [9, 9]
61 generate_test_data(inputFile2, evtNumList, runList, expList)
62
63 # generate a small test ntuple output file
64 main = b2.Path()
65 main.add_module('RootInput', inputFileNames=[inputFile1, inputFile2])
66 main.add_module('VariablesToNtuple',
67 fileName=testFile,
68 treeName='ntupleTree',
69 dataDescription=dataDescription1
70 )
71 main.add_module('VariablesToNtuple',
72 fileName=testFile,
73 treeName='anotherNtupleTree',
74 dataDescription=dataDescription2
75 )
76 safe_process(main)
77
78 metadata = get_metadata(testFile)
79
80 assert os.path.abspath(testFile) == tmpdir + '/' + metadata.getLfn()
81 assert 40 == metadata.getNEvents()
82 assert 40 == metadata.getNFullEvents()
83
84 assert 7 == metadata.getExperimentLow()
85 assert 1 == metadata.getRunLow()
86 assert 1 == metadata.getEventLow()
87 assert 9 == metadata.getExperimentHigh()
88 assert 19 == metadata.getRunHigh()
89 assert 11 == metadata.getEventHigh() # highest evt. no in highest run
90 assert metadata.containsEvent(7, 1, 1)
91 assert metadata.containsEvent(7, 1, 9)
92 assert metadata.containsEvent(7, 15, 1)
93 assert metadata.containsEvent(7, 16, 6)
94 assert metadata.containsEvent(9, 16, 12)
95 assert metadata.containsEvent(9, 18, 19)
96 assert metadata.containsEvent(9, 19, 11)
97 assert not metadata.containsEvent(7, 0, 10)
98 assert not metadata.containsEvent(10, 16, 6)
99 assert not metadata.containsEvent(0, 15, 6)
100
101 assert 2 == metadata.getNParents()
102 assert os.path.abspath(inputFile1) == metadata.getParent(0)
103 assert os.path.abspath(inputFile2) == metadata.getParent(1)
104
105 assert datetime.today().strftime('%Y-%m-%d') == metadata.getDate()[:10]
106 assert socket.gethostname() == metadata.getSite()
107
108 assert "something random" == metadata.getRandomSeed()
109
110 assert get_version() == metadata.getRelease()
111 assert metadata.getSteering().startswith('#!/usr/bin/env python3')
112 assert metadata.getSteering().strip().endswith('dummystring')
113 assert 40 == metadata.getMcEvents()
114
115 assert metadata.getDataDescription()["isNtupleMetaData"]
116 assert "works" == metadata.getDataDescription()["adding_custom_key"]
117 assert "trees" == metadata.getDataDescription()["with_multiple"]
118
119 os.system('touch Belle2FileCatalog.xml')
120 assert 0 == os.system('b2file-metadata-add --lfn /logical/file/name ' + testFile)
121
122 assert 0 == os.system('b2file-metadata-show ' + testFile)
123
124 # Check JSON output (contains steering file, so we cannot use .out)
125 metadata_output = subprocess.check_output(['b2file-metadata-show', '--json', testFile])
126 m = json.loads(metadata_output.decode('utf-8'))
127 assert 7 == m['experimentLow']
128 assert 1 == m['runLow']
129 assert 1 == m['eventLow']
130 assert 9 == m['experimentHigh']
131 assert 19 == m['runHigh']
132 assert 11 == m['eventHigh']
133 assert 'something random' == m['randomSeed']
134 assert 40 == m['nEvents']
135 assert isinstance(m['nEvents'], int)
136 assert 40 == m['nFullEvents']
137 assert isinstance(m['nFullEvents'], int)
138 assert '/logical/file/name' == m['LFN']
139
140 # steering file is in metadata, so we check for existence of this string:
141 # dummystring
Metadata information about a file.
Definition: FileMetaData.h:29