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  }