24 """A helper class to create the dataset for the tutorial below."""
26 main_file =
"df037_TTreeEventMatching_py_main.root"
27 aux_file_1 =
"df037_TTreeEventMatching_py_aux_1.root"
28 aux_file_2 =
"df037_TTreeEventMatching_py_aux_2.root"
29 main_tree_name =
"events"
30 aux_tree_name_1 =
"auxdata_1"
31 aux_tree_name_2 =
"auxdata_2"
34 with ROOT.TFile(self.main_file,
"RECREATE"):
35 main_tree = ROOT.TTree(self.main_tree_name, self.main_tree_name)
36 idx = array.array(
"i", [0])
37 x = array.array(
"i", [0])
38 main_tree.Branch(
"idx", idx,
"idx/I")
39 main_tree.Branch(
"x", x,
"x/I")
54 with ROOT.TFile(self.aux_file_1,
"RECREATE"):
55 aux_tree_1 = ROOT.TTree(self.aux_tree_name_1, self.aux_tree_name_1)
56 idx = array.array(
"i", [0])
57 y = array.array(
"i", [0])
58 aux_tree_1.Branch(
"idx", idx,
"idx/I")
59 aux_tree_1.Branch(
"y", y,
"y/I")
71 with ROOT.TFile(self.aux_file_2,
"RECREATE"):
72 aux_tree_2 = ROOT.TTree(self.aux_tree_name_2, self.aux_tree_name_2)
73 idx = array.array(
"i", [0])
74 z = array.array(
"i", [0])
75 aux_tree_2.Branch(
"idx", idx,
"idx/I")
76 aux_tree_2.Branch(
"z", z,
"z/I")
90 def __exit__(self, *_):
91 os.remove(self.main_file)
92 os.remove(self.aux_file_1)
93 os.remove(self.aux_file_2)
96def df037_TTreeEventMatching(dataset: DatasetContext):
103 main_chain = ROOT.TChain(dataset.main_tree_name)
104 main_chain.Add(dataset.main_file)
106 aux_chain_1 = ROOT.TChain(dataset.aux_tree_name_1)
107 aux_chain_1.Add(dataset.aux_file_1)
108 aux_chain_1.BuildIndex(
"idx")
110 aux_chain_2 = ROOT.TChain(dataset.aux_tree_name_2)
111 aux_chain_2.Add(dataset.aux_file_2)
112 aux_chain_2.BuildIndex(
"idx")
114 main_chain.AddFriend(aux_chain_1)
115 main_chain.AddFriend(aux_chain_2)
122 aux_tree_1_colidx = dataset.aux_tree_name_1 +
".idx"
123 aux_tree_1_coly = dataset.aux_tree_name_1 +
".y"
124 aux_tree_2_colidx = dataset.aux_tree_name_2 +
".idx"
125 aux_tree_2_colz = dataset.aux_tree_name_2 +
".z"
127 default_value = ROOT.std.numeric_limits[int].min()
132 df.DefaultValueFor(aux_tree_1_colidx, default_value)
133 .DefaultValueFor(aux_tree_1_coly, default_value)
134 .DefaultValueFor(aux_tree_2_colidx, default_value)
135 .DefaultValueFor(aux_tree_2_colz, default_value)
136 .Display((
"idx", aux_tree_1_colidx, aux_tree_2_colidx,
"x", aux_tree_1_coly, aux_tree_2_colz))
143 df.DefaultValueFor(aux_tree_2_colidx, default_value)
144 .DefaultValueFor(aux_tree_2_colz, default_value)
145 .FilterAvailable(aux_tree_1_coly)
146 .Display((
"idx", aux_tree_1_colidx, aux_tree_2_colidx,
"x", aux_tree_1_coly, aux_tree_2_colz))
151 display_3 = df.FilterMissing(aux_tree_1_colidx).Display((
"idx",
"x"))
153 print(
"Example 1: provide default values for all columns")
155 print(
"Example 2: always skip the entry when there is no match")
157 print(
"Example 3: keep entries from the main tree for which there is no match in the auxiliary tree")
161if __name__ ==
"__main__":
162 with DatasetContext()
as dataset:
163 df037_TTreeEventMatching(dataset)
ROOT's RDataFrame offers a modern, high-level interface for analysis of data stored in TTree ,...