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  `