go-hep.org/x/hep@v0.38.1/groot/riofs/gendata/gen-evnt-tree.go (about)

     1  // Copyright ©2018 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  	"log"
    12  
    13  	"go-hep.org/x/hep/groot/internal/rtests"
    14  )
    15  
    16  var (
    17  	root  = flag.String("f", "test-small.root", "output ROOT file")
    18  	split = flag.Int("split", 0, "default split-level for TTree")
    19  )
    20  
    21  func main() {
    22  	flag.Parse()
    23  
    24  	out, err := rtests.RunCxxROOT("gentree", []byte(script), *root, *split)
    25  	if err != nil {
    26  		log.Fatalf("could not run ROOT macro:\noutput:\n%v\nerror: %+v", string(out), err)
    27  	}
    28  }
    29  
    30  const script = `
    31  #include <vector>
    32  #include <string>
    33  
    34  const int ARRAYSZ = 10;
    35  
    36  struct P3 {
    37  	int32_t Px;
    38  	double  Py;
    39  	int32_t Pz;
    40  };
    41  
    42  struct Event {
    43  	TString  Beg;
    44  	int16_t  I16;
    45  	int32_t  I32;
    46  	int64_t  I64;
    47  	uint16_t U16;
    48  	uint32_t U32;
    49  	uint64_t U64;
    50  	float    F32;
    51  	double   F64;
    52  	TString  Str;
    53  	P3       P3;
    54  
    55  	int16_t  ArrayI16[ARRAYSZ];
    56  	int32_t  ArrayI32[ARRAYSZ];
    57  	int64_t  ArrayI64[ARRAYSZ];
    58  	uint16_t ArrayU16[ARRAYSZ];
    59  	uint32_t ArrayU32[ARRAYSZ];
    60  	uint64_t ArrayU64[ARRAYSZ];
    61  	float    ArrayF32[ARRAYSZ];
    62  	double   ArrayF64[ARRAYSZ];
    63  
    64  	int32_t  N;
    65  	int16_t  *SliceI16;  //[N]
    66  	int32_t  *SliceI32;  //[N]
    67  	int64_t  *SliceI64;  //[N]
    68  	uint16_t *SliceU16;  //[N]
    69  	uint32_t *SliceU32;  //[N]
    70  	uint64_t *SliceU64;  //[N]
    71  	float    *SliceF32;  //[N]
    72  	double   *SliceF64;  //[N]
    73  
    74  	std::string StdStr;
    75  
    76  	std::vector<int16_t> StlVecI16;
    77  	std::vector<int32_t> StlVecI32;
    78  	std::vector<int64_t> StlVecI64;
    79  	std::vector<uint16_t> StlVecU16;
    80  	std::vector<uint32_t> StlVecU32;
    81  	std::vector<uint64_t> StlVecU64;
    82  	std::vector<float> StlVecF32;
    83  	std::vector<double> StlVecF64;
    84  	std::vector<std::string> StlVecStr;
    85  
    86  	TString End;
    87  };
    88  
    89  void gentree(const char* fname, int splitlvl = 99) {
    90  	int bufsize = 32000;
    91  	int evtmax = 100;
    92  
    93  	auto f = TFile::Open(fname, "RECREATE");
    94  	auto t = new TTree("tree", "my tree title");
    95  
    96  	Event e;
    97  
    98  	t->Branch("evt", &e, bufsize, splitlvl);
    99  
   100  	for (int i = 0; i != evtmax; i++) {
   101  		e.Beg = TString::Format("beg-%03d", i);
   102  		e.I16 = i;
   103  		e.I32 = i;
   104  		e.I64 = i;
   105  		e.U16 = i;
   106  		e.U32 = i;
   107  		e.U64 = i;
   108  		e.F32 = float(i);
   109  		e.F64 = double(i);
   110  		e.Str = TString::Format("evt-%03d", i);
   111  		e.P3.Px = i-1;
   112  		e.P3.Py = double(i);
   113  		e.P3.Pz = i-1;
   114  
   115  		for (int ii = 0; ii != ARRAYSZ; ii++) {
   116  			e.ArrayI16[ii] = i;
   117  			e.ArrayI32[ii] = i;
   118  			e.ArrayI64[ii] = i;
   119  			e.ArrayU16[ii] = i;
   120  			e.ArrayU32[ii] = i;
   121  			e.ArrayU64[ii] = i;
   122  			e.ArrayF32[ii] = float(i);
   123  			e.ArrayF64[ii] = double(i);
   124  		}
   125  
   126  		e.N = int32_t(i) % 10;
   127  		e.SliceI16 = (int16_t*)malloc(sizeof(int16_t)*e.N);
   128  		e.SliceI32 = (int32_t*)malloc(sizeof(int32_t)*e.N);
   129  		e.SliceI64 = (int64_t*)malloc(sizeof(int64_t)*e.N);
   130  		e.SliceU16 = (uint16_t*)malloc(sizeof(uint16_t)*e.N);
   131  		e.SliceU32 = (uint32_t*)malloc(sizeof(uint32_t)*e.N);
   132  		e.SliceU64 = (uint64_t*)malloc(sizeof(uint64_t)*e.N);
   133  		e.SliceF32 = (float*)malloc(sizeof(float)*e.N);
   134  		e.SliceF64 = (double*)malloc(sizeof(double)*e.N);
   135  
   136  		for (int ii = 0; ii != e.N; ii++) {
   137  			e.SliceI16[ii] = i;
   138  			e.SliceI32[ii] = i;
   139  			e.SliceI64[ii] = i;
   140  			e.SliceU16[ii] = i;
   141  			e.SliceU32[ii] = i;
   142  			e.SliceU64[ii] = i;
   143  			e.SliceF32[ii] = float(i);
   144  			e.SliceF64[ii] = double(i);
   145  		}
   146  
   147  		e.StdStr = std::string(TString::Format("std-%03d", i));
   148  		e.StlVecI16.resize(e.N);
   149  		e.StlVecI32.resize(e.N);
   150  		e.StlVecI64.resize(e.N);
   151  		e.StlVecU16.resize(e.N);
   152  		e.StlVecU32.resize(e.N);
   153  		e.StlVecU64.resize(e.N);
   154  		e.StlVecF32.resize(e.N);
   155  		e.StlVecF64.resize(e.N);
   156  		e.StlVecStr.resize(e.N);
   157  		for (int ii =0; ii != e.N; ii++) {
   158  			e.StlVecI16[ii] = i;
   159  			e.StlVecI32[ii] = i;
   160  			e.StlVecI64[ii] = i;
   161  			e.StlVecU16[ii] = i;
   162  			e.StlVecU32[ii] = i;
   163  			e.StlVecU64[ii] = i;
   164  			e.StlVecF32[ii] = float(i);
   165  			e.StlVecF64[ii] = double(i);
   166  			e.StlVecStr[ii] = std::string(TString::Format("vec-%03d", i));
   167  		}
   168  		e.End = TString::Format("end-%03d", i);
   169  		t->Fill();
   170  	}
   171  
   172  	f->Write();
   173  	f->Close();
   174  
   175  	exit(0);
   176  }
   177  `