go-hep.org/x/hep@v0.38.1/groot/riofs/gendata/gen-join-trees.go (about) 1 // Copyright ©2020 The go-hep Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build ignore 6 7 package main 8 9 import ( 10 "flag" 11 "fmt" 12 "log" 13 "path/filepath" 14 15 "go-hep.org/x/hep/groot/riofs" 16 "go-hep.org/x/hep/groot/rtree" 17 ) 18 19 const N = 10 // number of events to generate 20 21 func main() { 22 dir := flag.String("d", "../testdata", "path to directory where to store output ROOT files") 23 24 flag.Parse() 25 26 err := gen(*dir) 27 if err != nil { 28 log.Fatalf("could not generate 'join' trees: %+v", err) 29 } 30 } 31 32 func gen(dir string) error { 33 for _, f := range []func(string) error{gen1, gen2, gen3, gen4} { 34 err := f(dir) 35 if err != nil { 36 return err 37 } 38 } 39 return nil 40 } 41 42 func gen1(dir string) error { 43 fname := filepath.Join(dir, "join1.root") 44 f, err := riofs.Create(fname) 45 if err != nil { 46 return err 47 } 48 defer f.Close() 49 50 var evt struct { 51 f1 float64 52 f2 int64 53 f3 string 54 } 55 wvars := []rtree.WriteVar{ 56 {Name: "b10", Value: &evt.f1}, 57 {Name: "b11", Value: &evt.f2}, 58 {Name: "b12", Value: &evt.f3}, 59 } 60 tree, err := rtree.NewWriter(f, "j1", wvars, rtree.WithTitle("j1-tree")) 61 if err != nil { 62 return err 63 } 64 defer tree.Close() 65 66 for i := 0; i < N; i++ { 67 evt.f1 = 100 + float64(i+1) 68 evt.f2 = 100 + int64(i+1) 69 evt.f3 = fmt.Sprintf("j1-%03d", 100+(i+1)) 70 _, err = tree.Write() 71 if err != nil { 72 return fmt.Errorf("could not write evt %d: %w", i, err) 73 } 74 } 75 76 err = tree.Close() 77 if err != nil { 78 return fmt.Errorf("could not close tree: %w", err) 79 } 80 81 err = f.Close() 82 if err != nil { 83 return fmt.Errorf("could not close file: %w", err) 84 } 85 86 return nil 87 } 88 89 func gen2(dir string) error { 90 fname := filepath.Join(dir, "join2.root") 91 f, err := riofs.Create(fname) 92 if err != nil { 93 return err 94 } 95 defer f.Close() 96 97 var evt struct { 98 f1 float64 99 f2 int64 100 f3 string 101 } 102 wvars := []rtree.WriteVar{ 103 {Name: "b20", Value: &evt.f1}, 104 {Name: "b21", Value: &evt.f2}, 105 {Name: "b22", Value: &evt.f3}, 106 } 107 tree, err := rtree.NewWriter(f, "j2", wvars, rtree.WithTitle("j2-tree")) 108 if err != nil { 109 return err 110 } 111 defer tree.Close() 112 113 for i := 0; i < N; i++ { 114 evt.f1 = 200 + float64(i+1) 115 evt.f2 = 200 + int64(i+1) 116 evt.f3 = fmt.Sprintf("j2-%03d", 200+(i+1)) 117 _, err = tree.Write() 118 if err != nil { 119 return fmt.Errorf("could not write evt %d: %w", i, err) 120 } 121 } 122 123 err = tree.Close() 124 if err != nil { 125 return fmt.Errorf("could not close tree: %w", err) 126 } 127 128 err = f.Close() 129 if err != nil { 130 return fmt.Errorf("could not close file: %w", err) 131 } 132 133 return nil 134 } 135 136 func gen3(dir string) error { 137 fname := filepath.Join(dir, "join3.root") 138 f, err := riofs.Create(fname) 139 if err != nil { 140 return err 141 } 142 defer f.Close() 143 144 var evt struct { 145 f1 float64 146 f2 int64 147 f3 string 148 } 149 wvars := []rtree.WriteVar{ 150 {Name: "b30", Value: &evt.f1}, 151 {Name: "b31", Value: &evt.f2}, 152 {Name: "b32", Value: &evt.f3}, 153 } 154 tree, err := rtree.NewWriter(f, "j3", wvars, rtree.WithTitle("j3-tree")) 155 if err != nil { 156 return err 157 } 158 defer tree.Close() 159 160 for i := 0; i < N; i++ { 161 evt.f1 = 300 + float64(i+1) 162 evt.f2 = 300 + int64(i+1) 163 evt.f3 = fmt.Sprintf("j3-%03d", 300+(i+1)) 164 _, err = tree.Write() 165 if err != nil { 166 return fmt.Errorf("could not write evt %d: %w", i, err) 167 } 168 } 169 170 err = tree.Close() 171 if err != nil { 172 return fmt.Errorf("could not close tree: %w", err) 173 } 174 175 err = f.Close() 176 if err != nil { 177 return fmt.Errorf("could not close file: %w", err) 178 } 179 180 return nil 181 } 182 183 func gen4(dir string) error { 184 fname := filepath.Join(dir, "join4.root") 185 f, err := riofs.Create(fname) 186 if err != nil { 187 return err 188 } 189 defer f.Close() 190 191 err = func() error { 192 var evt struct { 193 f1 float64 194 f2 int64 195 f3 string 196 } 197 wvars := []rtree.WriteVar{ 198 {Name: "b40", Value: &evt.f1}, 199 {Name: "b41", Value: &evt.f2}, 200 {Name: "b42", Value: &evt.f3}, 201 } 202 tree, err := rtree.NewWriter(f, "j41", wvars, rtree.WithTitle("j4-1-tree (evtmax differ)")) 203 if err != nil { 204 return err 205 } 206 defer tree.Close() 207 208 for i := 0; i < N+1; i++ { 209 evt.f1 = 400 + float64(i+1) 210 evt.f2 = 400 + int64(i+1) 211 evt.f3 = fmt.Sprintf("j4-1-%03d", 400+(i+1)) 212 _, err = tree.Write() 213 if err != nil { 214 return fmt.Errorf("could not write evt %d: %w", i, err) 215 } 216 } 217 218 err = tree.Close() 219 if err != nil { 220 return fmt.Errorf("could not close tree: %w", err) 221 } 222 return nil 223 }() 224 if err != nil { 225 return fmt.Errorf("could not generate j41 tree: %w", err) 226 } 227 228 err = func() error { 229 var evt struct { 230 f1 float64 231 f2 int32 // different type than other evt structs 232 f3 string 233 } 234 wvars := []rtree.WriteVar{ 235 {Name: "b40", Value: &evt.f1}, 236 {Name: "b11", Value: &evt.f2}, 237 {Name: "b22", Value: &evt.f3}, 238 } 239 tree, err := rtree.NewWriter(f, "j42", wvars, rtree.WithTitle("j4-2-tree (branch collision w/ j1, j2))")) 240 if err != nil { 241 return err 242 } 243 defer tree.Close() 244 245 for i := 0; i < N; i++ { 246 evt.f1 = 400 + float64(i+1) 247 evt.f2 = 400 + int32(i+1) 248 evt.f3 = fmt.Sprintf("j4-2-%03d", 400+(i+1)) 249 _, err = tree.Write() 250 if err != nil { 251 return fmt.Errorf("could not write evt %d: %w", i, err) 252 } 253 } 254 255 err = tree.Close() 256 if err != nil { 257 return fmt.Errorf("could not close tree: %w", err) 258 } 259 return nil 260 }() 261 if err != nil { 262 return fmt.Errorf("could not generate j4 tree: %w", err) 263 } 264 265 err = f.Close() 266 if err != nil { 267 return fmt.Errorf("could not close file: %w", err) 268 } 269 270 return nil 271 }