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  `