22 """A helper class to create the dataset for the tutorial below."""
24 main_file =
"df037_TTreeEventMatching_py_main.root"
25 aux_file_1 =
"df037_TTreeEventMatching_py_aux_1.root"
26 aux_file_2 =
"df037_TTreeEventMatching_py_aux_2.root"
27 main_tree_name =
"events"
28 aux_tree_name_1 =
"auxdata_1"
29 aux_tree_name_2 =
"auxdata_2"
32 with ROOT.TFile(self.main_file,
"RECREATE")
as f:
33 main_tree = ROOT.TTree(self.main_tree_name, self.main_tree_name)
34 idx = numpy.array([0], dtype=int)
35 x = numpy.array([0], dtype=int)
36 main_tree.Branch(
"idx", idx,
"idx/I")
37 main_tree.Branch(
"x", x,
"x/I")
52 with ROOT.TFile(self.aux_file_1,
"RECREATE")
as f:
53 aux_tree_1 = ROOT.TTree(self.aux_tree_name_1, self.aux_tree_name_1)
54 idx = numpy.array([0], dtype=int)
55 y = numpy.array([0], dtype=int)
56 aux_tree_1.Branch(
"idx", idx,
"idx/I")
57 aux_tree_1.Branch(
"y", y,
"y/I")
69 with ROOT.TFile(self.aux_file_2,
"RECREATE")
as f:
70 aux_tree_2 = ROOT.TTree(self.aux_tree_name_2, self.aux_tree_name_2)
71 idx = numpy.array([0], dtype=int)
72 z = numpy.array([0], dtype=int)
73 aux_tree_2.Branch(
"idx", idx,
"idx/I")
74 aux_tree_2.Branch(
"z", z,
"z/I")
88 def __exit__(self, *_):
89 os.remove(self.main_file)
90 os.remove(self.aux_file_1)
91 os.remove(self.aux_file_2)
101 main_chain = ROOT.TChain(dataset.main_tree_name)
102 main_chain.Add(dataset.main_file)
104 aux_chain_1 = ROOT.TChain(dataset.aux_tree_name_1)
105 aux_chain_1.Add(dataset.aux_file_1)
106 aux_chain_1.BuildIndex(
"idx")
108 aux_chain_2 = ROOT.TChain(dataset.aux_tree_name_2)
109 aux_chain_2.Add(dataset.aux_file_2)
110 aux_chain_2.BuildIndex(
"idx")
112 main_chain.AddFriend(aux_chain_1)
113 main_chain.AddFriend(aux_chain_2)
120 aux_tree_1_colidx = dataset.aux_tree_name_1 +
".idx"
121 aux_tree_1_coly = dataset.aux_tree_name_1 +
".y"
122 aux_tree_2_colidx = dataset.aux_tree_name_2 +
".idx"
123 aux_tree_2_colz = dataset.aux_tree_name_2 +
".z"
125 default_value = ROOT.std.numeric_limits[int].min()
130 df.DefaultValueFor(aux_tree_1_colidx, default_value)
131 .DefaultValueFor(aux_tree_1_coly, default_value)
132 .DefaultValueFor(aux_tree_2_colidx, default_value)
133 .DefaultValueFor(aux_tree_2_colz, default_value)
135 (
"idx", aux_tree_1_colidx, aux_tree_2_colidx,
"x", aux_tree_1_coly, aux_tree_2_colz))
142 df.DefaultValueFor(aux_tree_2_colidx, default_value)
143 .DefaultValueFor(aux_tree_2_colz, default_value)
144 .FilterAvailable(aux_tree_1_coly)
146 (
"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:
ROOT's RDataFrame offers a modern, high-level interface for analysis of data stored in TTree ,...