go-hep.org/x/hep@v0.38.1/groot/riofs/gendata/gen-flat-tree.go (about) 1 // Copyright ©2019 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 <string.h> 32 #include <stdio.h> 33 34 const int ARRAYSZ = 10; 35 const int MAXSLICE = 20; 36 const int MAXSTR = 32; 37 38 #define OFFSET 0 39 40 struct Event { 41 bool Bool; 42 char Str[MAXSTR]; 43 int8_t I8; 44 int16_t I16; 45 int32_t I32; 46 int64_t I64; 47 int64_t G64; 48 uint8_t U8; 49 uint16_t U16; 50 uint32_t U32; 51 uint64_t U64; 52 uint64_t UGG; 53 float F32; 54 double F64; 55 56 Float16_t D16; 57 Double32_t D32; 58 59 bool ArrayBs[ARRAYSZ]; 60 // char ArrayStr[ARRAYSZ][MAXSTR]; 61 int8_t ArrayI8[ARRAYSZ]; 62 int16_t ArrayI16[ARRAYSZ]; 63 int32_t ArrayI32[ARRAYSZ]; 64 int64_t ArrayI64[ARRAYSZ]; 65 int64_t ArrayG64[ARRAYSZ]; 66 uint8_t ArrayU8[ARRAYSZ]; 67 uint16_t ArrayU16[ARRAYSZ]; 68 uint32_t ArrayU32[ARRAYSZ]; 69 uint64_t ArrayU64[ARRAYSZ]; 70 uint64_t ArrayUGG[ARRAYSZ]; 71 float ArrayF32[ARRAYSZ]; 72 double ArrayF64[ARRAYSZ]; 73 74 Float16_t ArrayD16[ARRAYSZ]; 75 Double32_t ArrayD32[ARRAYSZ]; 76 77 int32_t N; 78 bool SliceBs[MAXSLICE]; //[N] 79 // char SliceStr[MAXSLICE][MAXSTR]; //[N] 80 int8_t SliceI8[MAXSLICE]; //[N] 81 int16_t SliceI16[MAXSLICE]; //[N] 82 int32_t SliceI32[MAXSLICE]; //[N] 83 int64_t SliceI64[MAXSLICE]; //[N] 84 int64_t SliceG64[MAXSLICE]; //[N] 85 uint8_t SliceU8[MAXSLICE]; //[N] 86 uint16_t SliceU16[MAXSLICE]; //[N] 87 uint32_t SliceU32[MAXSLICE]; //[N] 88 uint64_t SliceU64[MAXSLICE]; //[N] 89 uint64_t SliceUGG[MAXSLICE]; //[N] 90 float SliceF32[MAXSLICE]; //[N] 91 double SliceF64[MAXSLICE]; //[N] 92 93 Float16_t SliceD16[MAXSLICE]; //[N] 94 Double32_t SliceD32[MAXSLICE]; //[N] 95 }; 96 97 void gentree(const char* fname, int splitlvl = 99) { 98 int bufsize = 32000; 99 int evtmax = 10; 100 101 auto f = TFile::Open(fname, "RECREATE"); 102 auto t = new TTree("tree", "my tree title"); 103 104 Event e; 105 106 t->Branch("B", &e.Bool, "B/O"); 107 t->Branch("Str", e.Str, "Str/C"); 108 t->Branch("I8", &e.I8, "I8/B"); 109 t->Branch("I16", &e.I16, "I16/S"); 110 t->Branch("I32", &e.I32, "I32/I"); 111 t->Branch("I64", &e.I64, "I64/L"); 112 t->Branch("G64", &e.G64, "G64/G"); 113 t->Branch("U8", &e.U8, "U8/b"); 114 t->Branch("U16", &e.U16, "U16/s"); 115 t->Branch("U32", &e.U32, "U32/i"); 116 t->Branch("U64", &e.U64, "U64/l"); 117 t->Branch("UGG", &e.UGG, "UGG/g"); 118 t->Branch("F32", &e.F32, "F32/F"); 119 t->Branch("F64", &e.F64, "F64/D"); 120 t->Branch("D16", &e.D16, "D16/f[0,0,16]"); 121 t->Branch("D32", &e.D32, "D32/d[0,0,32]"); 122 123 // static arrays 124 125 t->Branch("ArrBs", e.ArrayBs, "ArrBs[10]/O"); 126 // t->Branch("ArrStr", e.ArrayStr, "ArrStr[10][32]/C"); 127 t->Branch("ArrI8", e.ArrayI8, "ArrI8[10]/B"); 128 t->Branch("ArrI16", e.ArrayI16, "ArrI16[10]/S"); 129 t->Branch("ArrI32", e.ArrayI32, "ArrI32[10]/I"); 130 t->Branch("ArrI64", e.ArrayI64, "ArrI64[10]/L"); 131 t->Branch("ArrG64", e.ArrayG64, "ArrG64[10]/G"); 132 t->Branch("ArrU8", e.ArrayU8, "ArrU8[10]/b"); 133 t->Branch("ArrU16", e.ArrayU16, "ArrU16[10]/s"); 134 t->Branch("ArrU32", e.ArrayU32, "ArrU32[10]/i"); 135 t->Branch("ArrU64", e.ArrayU64, "ArrU64[10]/l"); 136 t->Branch("ArrUGG", e.ArrayUGG, "ArrUGG[10]/g"); 137 t->Branch("ArrF32", e.ArrayF32, "ArrF32[10]/F"); 138 t->Branch("ArrF64", e.ArrayF64, "ArrF64[10]/D"); 139 140 t->Branch("ArrD16", e.ArrayD16, "ArrD16[10]/f[0,0,16]"); 141 t->Branch("ArrD32", e.ArrayD32, "ArrD32[10]/d[0,0,32]"); 142 143 // dynamic arrays 144 145 t->Branch("N", &e.N, "N/I"); 146 t->Branch("SliBs", e.SliceBs, "SliBs[N]/O"); 147 // t->Branch("SliStr", e.SliceStr, "SliStr[N][32]/C"); 148 t->Branch("SliI8", e.SliceI8, "SliI8[N]/B"); 149 t->Branch("SliI16", e.SliceI16, "SliI16[N]/S"); 150 t->Branch("SliI32", e.SliceI32, "SliI32[N]/I"); 151 t->Branch("SliI64", e.SliceI64, "SliI64[N]/L"); 152 t->Branch("SliG64", e.SliceG64, "SliG64[N]/G"); 153 t->Branch("SliU8", e.SliceU8, "SliU8[N]/b"); 154 t->Branch("SliU16", e.SliceU16, "SliU16[N]/s"); 155 t->Branch("SliU32", e.SliceU32, "SliU32[N]/i"); 156 t->Branch("SliU64", e.SliceU64, "SliU64[N]/l"); 157 t->Branch("SliUGG", e.SliceUGG, "SliUGG[N]/g"); 158 t->Branch("SliF32", e.SliceF32, "SliF32[N]/F"); 159 t->Branch("SliF64", e.SliceF64, "SliF64[N]/D"); 160 161 t->Branch("SliD16", e.SliceD16, "SliD16[N]/f[0,0,16]"); 162 t->Branch("SliD32", e.SliceD32, "SliD32[N]/d[0,0,32]"); 163 164 165 for (int j = 0; j != evtmax; j++) { 166 int i = j + OFFSET; 167 e.Bool = (i % 2) == 0; 168 strncpy(e.Str, TString::Format("str-%d", i).Data(), 32); 169 e.I8 = -i; 170 e.I16 = -i; 171 e.I32 = -i; 172 e.I64 = -i; 173 e.G64 = -i; 174 e.U8 = i; 175 e.U16 = i; 176 e.U32 = i; 177 e.U64 = i; 178 e.UGG = i; 179 e.F32 = float(i); 180 e.F64 = double(i); 181 e.D16 = float(i); 182 e.D32 = double(i); 183 184 for (int ii = 0; ii != ARRAYSZ; ii++) { 185 e.ArrayBs[ii] = ii == i; 186 // sprintf(e.ArrayStr[ii], "ars-%d-%d", i, ii); 187 e.ArrayI8[ii] = -i; 188 e.ArrayI16[ii] = -i; 189 e.ArrayI32[ii] = -i; 190 e.ArrayI64[ii] = -i; 191 e.ArrayG64[ii] = -i; 192 e.ArrayU8[ii] = i; 193 e.ArrayU16[ii] = i; 194 e.ArrayU32[ii] = i; 195 e.ArrayU64[ii] = i; 196 e.ArrayUGG[ii] = i; 197 e.ArrayF32[ii] = float(i); 198 e.ArrayF64[ii] = double(i); 199 e.ArrayD16[ii] = float(i); 200 e.ArrayD32[ii] = double(i); 201 } 202 203 e.N = int32_t(i) % 10; 204 for (int ii = 0; ii != e.N; ii++) { 205 e.SliceBs[ii] = (ii+1) == i; 206 // strncpy(e.SliceStr[ii], TString::Format("sli-%d-%d", i, ii).Data(), 32); 207 e.SliceI8[ii] = -i; 208 e.SliceI16[ii] = -i; 209 e.SliceI32[ii] = -i; 210 e.SliceI64[ii] = -i; 211 e.SliceG64[ii] = -i; 212 e.SliceU8[ii] = i; 213 e.SliceU16[ii] = i; 214 e.SliceU32[ii] = i; 215 e.SliceU64[ii] = i; 216 e.SliceUGG[ii] = i; 217 e.SliceF32[ii] = float(i); 218 e.SliceF64[ii] = double(i); 219 e.SliceD16[ii] = float(i); 220 e.SliceD32[ii] = double(i); 221 } 222 223 t->Fill(); 224 } 225 226 f->Write(); 227 f->Close(); 228 229 exit(0); 230 } 231 `