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  }