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