go-hep.org/x/hep@v0.38.1/groot/riofs/gendata/gen-bitset-tree.go (about)

     1  // Copyright ©2020 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  	"os"
    13  
    14  	"go-hep.org/x/hep/groot/internal/rtests"
    15  )
    16  
    17  var (
    18  	root  = flag.String("f", "std-bitset.root", "output ROOT file")
    19  	split = flag.Int("split", 0, "default split-level for TTree")
    20  )
    21  
    22  func main() {
    23  	flag.Parse()
    24  
    25  	tmp, err := os.MkdirTemp("", "groot-")
    26  	if err != nil {
    27  		log.Fatalf("could not created tmp dir: %+v", err)
    28  	}
    29  	defer os.RemoveAll(tmp)
    30  
    31  	dict, err := rtests.GenROOTDictCode(event, link)
    32  	if err != nil {
    33  		log.Fatalf("could not run ROOT dict: %+v", err)
    34  	}
    35  
    36  	out, err := rtests.RunCxxROOT("gentree", []byte(event+string(dict)+script), *root, *split)
    37  	if err != nil {
    38  		log.Fatalf("could not run ROOT macro:\noutput:\n%v\nerror: %+v", string(out), err)
    39  	}
    40  }
    41  
    42  const event = `
    43  #ifndef EVENT_H
    44  #define EVENT_H 1
    45  
    46  #include <bitset>
    47  #include <vector>
    48  
    49  struct Event {
    50  	std::bitset<8> Bs8;
    51  	std::vector<std::bitset<8> > VecBs8;
    52  
    53  	void clear() {
    54  		this->VecBs8.clear();
    55  	}
    56  };
    57  
    58  #endif // EVENT_H
    59  `
    60  
    61  const link = `
    62  #ifdef __CINT__
    63  
    64  #pragma link off all globals;
    65  #pragma link off all classes;
    66  #pragma link off all functions;
    67  
    68  #pragma link C++ class Event+;
    69  
    70  #endif
    71  `
    72  
    73  const script = `
    74  void gentree(const char* fname, int splitlvl = 99) {
    75  	int bufsize = 32000;
    76  	int evtmax = 2;
    77  
    78  	auto f = TFile::Open(fname, "RECREATE");
    79  	auto t = new TTree("tree", "my tree title");
    80  
    81  	Event e;
    82  
    83  	t->Branch("evt", &e, bufsize, splitlvl);
    84  
    85  	// 0
    86  	e.clear();
    87  	e.Bs8 = std::bitset<8>("00010001");
    88  	e.VecBs8.push_back(std::bitset<8>("11101110"));
    89  	t->Fill();
    90  
    91  	// 1
    92  	e.clear();
    93  	e.Bs8 = std::bitset<8>("10011001");
    94  	e.VecBs8.push_back(std::bitset<8>("00010001"));
    95  	e.VecBs8.push_back(std::bitset<8>("11101110"));
    96  	t->Fill();
    97  
    98  	// 2
    99  	e.clear();
   100  	e.Bs8 = std::bitset<8>("01100110");
   101  	e.VecBs8.push_back(std::bitset<8>("10011001"));
   102  	e.VecBs8.push_back(std::bitset<8>("01100110"));
   103  	e.VecBs8.push_back(std::bitset<8>("11001100"));
   104  	t->Fill();
   105  
   106  	f->Write();
   107  	f->Close();
   108  
   109  	exit(0);
   110  }
   111  `