go-hep.org/x/hep@v0.38.1/groot/rtree/reader_example_test.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 package rtree_test 6 7 import ( 8 "fmt" 9 "log" 10 11 "go-hep.org/x/hep/groot" 12 "go-hep.org/x/hep/groot/rtree" 13 "go-hep.org/x/hep/groot/rtree/rfunc" 14 ) 15 16 func ExampleReader() { 17 f, err := groot.Open("../testdata/simple.root") 18 if err != nil { 19 log.Fatalf("could not open ROOT file: %+v", err) 20 } 21 defer f.Close() 22 23 o, err := f.Get("tree") 24 if err != nil { 25 log.Fatalf("could not retrieve ROOT tree: %+v", err) 26 } 27 t := o.(rtree.Tree) 28 29 var ( 30 v1 int32 31 v2 float32 32 v3 string 33 34 rvars = []rtree.ReadVar{ 35 {Name: "one", Value: &v1}, 36 {Name: "two", Value: &v2}, 37 {Name: "three", Value: &v3}, 38 } 39 ) 40 41 r, err := rtree.NewReader(t, rvars) 42 if err != nil { 43 log.Fatalf("could not create tree reader: %+v", err) 44 } 45 defer r.Close() 46 47 err = r.Read(func(ctx rtree.RCtx) error { 48 fmt.Printf("evt[%d]: %v, %v, %v\n", ctx.Entry, v1, v2, v3) 49 return nil 50 }) 51 if err != nil { 52 log.Fatalf("could not process tree: %+v", err) 53 } 54 55 // Output: 56 // evt[0]: 1, 1.1, uno 57 // evt[1]: 2, 2.2, dos 58 // evt[2]: 3, 3.3, tres 59 // evt[3]: 4, 4.4, quatro 60 } 61 62 func ExampleReader_withRange() { 63 f, err := groot.Open("../testdata/simple.root") 64 if err != nil { 65 log.Fatalf("could not open ROOT file: %+v", err) 66 } 67 defer f.Close() 68 69 o, err := f.Get("tree") 70 if err != nil { 71 log.Fatalf("could not retrieve ROOT tree: %+v", err) 72 } 73 t := o.(rtree.Tree) 74 75 var ( 76 v1 int32 77 v2 float32 78 v3 string 79 80 rvars = []rtree.ReadVar{ 81 {Name: "one", Value: &v1}, 82 {Name: "two", Value: &v2}, 83 {Name: "three", Value: &v3}, 84 } 85 ) 86 87 r, err := rtree.NewReader(t, rvars, rtree.WithRange(1, 3)) 88 if err != nil { 89 log.Fatalf("could not create tree reader: %+v", err) 90 } 91 defer r.Close() 92 93 err = r.Read(func(ctx rtree.RCtx) error { 94 fmt.Printf("evt[%d]: %v, %v, %v\n", ctx.Entry, v1, v2, v3) 95 return nil 96 }) 97 if err != nil { 98 log.Fatalf("could not process tree: %+v", err) 99 } 100 101 // Output: 102 // evt[1]: 2, 2.2, dos 103 // evt[2]: 3, 3.3, tres 104 } 105 106 func ExampleReader_withChain() { 107 f, err := groot.Open("../testdata/simple.root") 108 if err != nil { 109 log.Fatalf("could not open ROOT file: %+v", err) 110 } 111 defer f.Close() 112 113 o, err := f.Get("tree") 114 if err != nil { 115 log.Fatalf("could not retrieve ROOT tree: %+v", err) 116 } 117 t := o.(rtree.Tree) 118 119 t = rtree.Chain(t, t, t, t) 120 121 var ( 122 v1 int32 123 v2 float32 124 v3 string 125 126 rvars = []rtree.ReadVar{ 127 {Name: "one", Value: &v1}, 128 {Name: "two", Value: &v2}, 129 {Name: "three", Value: &v3}, 130 } 131 ) 132 133 r, err := rtree.NewReader(t, rvars, 134 rtree.WithRange(0, -1), 135 rtree.WithPrefetchBaskets(2), 136 ) 137 if err != nil { 138 log.Fatalf("could not create tree reader: %+v", err) 139 } 140 defer r.Close() 141 142 err = r.Read(func(ctx rtree.RCtx) error { 143 fmt.Printf("evt[%d]: %v, %v, %v\n", ctx.Entry, v1, v2, v3) 144 return nil 145 }) 146 if err != nil { 147 log.Fatalf("could not process tree: %+v", err) 148 } 149 150 // Output: 151 // evt[0]: 1, 1.1, uno 152 // evt[1]: 2, 2.2, dos 153 // evt[2]: 3, 3.3, tres 154 // evt[3]: 4, 4.4, quatro 155 // evt[4]: 1, 1.1, uno 156 // evt[5]: 2, 2.2, dos 157 // evt[6]: 3, 3.3, tres 158 // evt[7]: 4, 4.4, quatro 159 // evt[8]: 1, 1.1, uno 160 // evt[9]: 2, 2.2, dos 161 // evt[10]: 3, 3.3, tres 162 // evt[11]: 4, 4.4, quatro 163 // evt[12]: 1, 1.1, uno 164 // evt[13]: 2, 2.2, dos 165 // evt[14]: 3, 3.3, tres 166 // evt[15]: 4, 4.4, quatro 167 } 168 169 func ExampleReader_withReadVarsFromStruct() { 170 f, err := groot.Open("../testdata/simple.root") 171 if err != nil { 172 log.Fatalf("could not open ROOT file: %+v", err) 173 } 174 defer f.Close() 175 176 o, err := f.Get("tree") 177 if err != nil { 178 log.Fatalf("could not retrieve ROOT tree: %+v", err) 179 } 180 t := o.(rtree.Tree) 181 182 var ( 183 data struct { 184 V1 int32 `groot:"one"` 185 V2 float32 `groot:"two"` 186 V3 string `groot:"three"` 187 } 188 rvars = rtree.ReadVarsFromStruct(&data) 189 ) 190 191 r, err := rtree.NewReader(t, rvars) 192 if err != nil { 193 log.Fatalf("could not create tree reader: %+v", err) 194 } 195 defer r.Close() 196 197 err = r.Read(func(ctx rtree.RCtx) error { 198 fmt.Printf("evt[%d]: %v, %v, %v\n", ctx.Entry, data.V1, data.V2, data.V3) 199 return nil 200 }) 201 if err != nil { 202 log.Fatalf("could not process tree: %+v", err) 203 } 204 205 // Output: 206 // evt[0]: 1, 1.1, uno 207 // evt[1]: 2, 2.2, dos 208 // evt[2]: 3, 3.3, tres 209 // evt[3]: 4, 4.4, quatro 210 } 211 212 func ExampleReader_withFormulaFunc() { 213 f, err := groot.Open("../testdata/simple.root") 214 if err != nil { 215 log.Fatalf("could not open ROOT file: %+v", err) 216 } 217 defer f.Close() 218 219 o, err := f.Get("tree") 220 if err != nil { 221 log.Fatalf("could not retrieve ROOT tree: %+v", err) 222 } 223 t := o.(rtree.Tree) 224 225 var ( 226 data struct { 227 V1 int32 `groot:"one"` 228 V2 float32 `groot:"two"` 229 V3 string `groot:"three"` 230 } 231 rvars = rtree.ReadVarsFromStruct(&data) 232 ) 233 234 r, err := rtree.NewReader(t, rvars) 235 if err != nil { 236 log.Fatalf("could not create tree reader: %+v", err) 237 } 238 defer r.Close() 239 240 f64, err := r.FormulaFunc( 241 []string{"one", "two", "three"}, 242 func(v1 int32, v2 float32, v3 string) float64 { 243 return float64(v2*10) + float64(1000*v1) + float64(100*len(v3)) 244 }, 245 ) 246 if err != nil { 247 log.Fatalf("could not create formula: %+v", err) 248 } 249 250 fstr, err := r.FormulaFunc( 251 []string{"one", "two", "three"}, 252 func(v1 int32, v2 float32, v3 string) string { 253 return fmt.Sprintf( 254 "%q: %v, %q: %v, %q: %v", 255 "one", v1, "two", v2, "three", v3, 256 ) 257 }, 258 ) 259 if err != nil { 260 log.Fatalf("could not create formula: %+v", err) 261 } 262 263 f1 := f64.Func().(func() float64) 264 f2 := fstr.Func().(func() string) 265 266 err = r.Read(func(ctx rtree.RCtx) error { 267 v64 := f1() 268 str := f2() 269 fmt.Printf("evt[%d]: %v, %v, %v -> %g | %s\n", ctx.Entry, data.V1, data.V2, data.V3, v64, str) 270 return nil 271 }) 272 if err != nil { 273 log.Fatalf("could not process tree: %+v", err) 274 } 275 276 // Output: 277 // evt[0]: 1, 1.1, uno -> 1311 | "one": 1, "two": 1.1, "three": uno 278 // evt[1]: 2, 2.2, dos -> 2322 | "one": 2, "two": 2.2, "three": dos 279 // evt[2]: 3, 3.3, tres -> 3433 | "one": 3, "two": 3.3, "three": tres 280 // evt[3]: 4, 4.4, quatro -> 4644 | "one": 4, "two": 4.4, "three": quatro 281 } 282 283 type UsrF64 struct { 284 rvars []string 285 v1 *int32 286 v2 *float32 287 v3 *string 288 fct func(int32, float32, string) float64 289 } 290 291 var ( 292 _ rfunc.Formula = (*UsrF64)(nil) 293 ) 294 295 func (usr *UsrF64) RVars() []string { return usr.rvars } 296 func (usr *UsrF64) Bind(args []any) error { 297 if got, want := len(args), 3; got != want { 298 return fmt.Errorf( 299 "rfunc: invalid number of bind arguments (got=%d, want=%d)", 300 got, want, 301 ) 302 } 303 usr.v1 = args[0].(*int32) 304 usr.v2 = args[1].(*float32) 305 usr.v3 = args[2].(*string) 306 return nil 307 } 308 309 func (usr *UsrF64) Func() any { 310 return func() float64 { 311 return usr.fct(*usr.v1, *usr.v2, *usr.v3) 312 } 313 } 314 315 type UsrStr struct { 316 rvars []string 317 v1 *int32 318 v2 *float32 319 v3 *string 320 fct func(int32, float32, string) string 321 } 322 323 var ( 324 _ rfunc.Formula = (*UsrStr)(nil) 325 ) 326 327 func (usr *UsrStr) RVars() []string { return usr.rvars } 328 func (usr *UsrStr) Bind(args []any) error { 329 if got, want := len(args), 3; got != want { 330 return fmt.Errorf( 331 "rfunc: invalid number of bind arguments (got=%d, want=%d)", 332 got, want, 333 ) 334 } 335 usr.v1 = args[0].(*int32) 336 usr.v2 = args[1].(*float32) 337 usr.v3 = args[2].(*string) 338 return nil 339 } 340 341 func (usr *UsrStr) Func() any { 342 return func() string { 343 return usr.fct(*usr.v1, *usr.v2, *usr.v3) 344 } 345 } 346 347 func ExampleReader_withFormulaFromUser() { 348 f, err := groot.Open("../testdata/simple.root") 349 if err != nil { 350 log.Fatalf("could not open ROOT file: %+v", err) 351 } 352 defer f.Close() 353 354 o, err := f.Get("tree") 355 if err != nil { 356 log.Fatalf("could not retrieve ROOT tree: %+v", err) 357 } 358 t := o.(rtree.Tree) 359 360 var ( 361 data struct { 362 V1 int32 `groot:"one"` 363 V2 float32 `groot:"two"` 364 V3 string `groot:"three"` 365 } 366 rvars = rtree.ReadVarsFromStruct(&data) 367 ) 368 369 r, err := rtree.NewReader(t, rvars) 370 if err != nil { 371 log.Fatalf("could not create tree reader: %+v", err) 372 } 373 defer r.Close() 374 375 f64, err := r.Formula(&UsrF64{ 376 rvars: []string{"one", "two", "three"}, 377 fct: func(v1 int32, v2 float32, v3 string) float64 { 378 return float64(v2*10) + float64(1000*v1) + float64(100*len(v3)) 379 }, 380 }) 381 if err != nil { 382 log.Fatalf("could not create formula: %+v", err) 383 } 384 385 fstr, err := r.Formula(&UsrStr{ 386 rvars: []string{"one", "two", "three"}, 387 fct: func(v1 int32, v2 float32, v3 string) string { 388 return fmt.Sprintf( 389 "%q: %v, %q: %v, %q: %v", 390 "one", v1, "two", v2, "three", v3, 391 ) 392 }, 393 }) 394 if err != nil { 395 log.Fatalf("could not create formula: %+v", err) 396 } 397 398 f1 := f64.Func().(func() float64) 399 f2 := fstr.Func().(func() string) 400 401 err = r.Read(func(ctx rtree.RCtx) error { 402 v64 := f1() 403 str := f2() 404 fmt.Printf("evt[%d]: %v, %v, %v -> %g | %s\n", ctx.Entry, data.V1, data.V2, data.V3, v64, str) 405 return nil 406 }) 407 if err != nil { 408 log.Fatalf("could not process tree: %+v", err) 409 } 410 411 // Output: 412 // evt[0]: 1, 1.1, uno -> 1311 | "one": 1, "two": 1.1, "three": uno 413 // evt[1]: 2, 2.2, dos -> 2322 | "one": 2, "two": 2.2, "three": dos 414 // evt[2]: 3, 3.3, tres -> 3433 | "one": 3, "two": 3.3, "three": tres 415 // evt[3]: 4, 4.4, quatro -> 4644 | "one": 4, "two": 4.4, "three": quatro 416 } 417 418 func ExampleReader_withReset() { 419 f, err := groot.Open("../testdata/simple.root") 420 if err != nil { 421 log.Fatalf("could not open ROOT file: %+v", err) 422 } 423 defer f.Close() 424 425 o, err := f.Get("tree") 426 if err != nil { 427 log.Fatalf("could not retrieve ROOT tree: %+v", err) 428 } 429 t := o.(rtree.Tree) 430 431 var ( 432 v1 int32 433 v2 float32 434 v3 string 435 436 rvars = []rtree.ReadVar{ 437 {Name: "one", Value: &v1}, 438 {Name: "two", Value: &v2}, 439 {Name: "three", Value: &v3}, 440 } 441 ) 442 443 r, err := rtree.NewReader(t, rvars) 444 if err != nil { 445 log.Fatalf("could not create tree reader: %+v", err) 446 } 447 defer r.Close() 448 449 err = r.Reset() 450 if err != nil { 451 log.Fatalf("could not reset tree reader: %+v", err) 452 } 453 454 err = r.Reset(rtree.WithRange(1, 3)) 455 if err != nil { 456 log.Fatalf("could not reset tree reader: %+v", err) 457 } 458 459 err = r.Read(func(ctx rtree.RCtx) error { 460 fmt.Printf("evt[%d]: %v, %v, %v\n", ctx.Entry, v1, v2, v3) 461 return nil 462 }) 463 if err != nil { 464 log.Fatalf("could not process tree: %+v", err) 465 } 466 467 // Output: 468 // evt[1]: 2, 2.2, dos 469 // evt[2]: 3, 3.3, tres 470 }