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 `