go-hep.org/x/hep@v0.38.1/groot/exp/rntup/rntup.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 // Package rntup contains types to handle RNTuple-related data. 6 package rntup // import "go-hep.org/x/hep/groot/exp/rntup" 7 8 import ( 9 "fmt" 10 "reflect" 11 12 "go-hep.org/x/hep/groot/rbytes" 13 "go-hep.org/x/hep/groot/root" 14 "go-hep.org/x/hep/groot/rtypes" 15 ) 16 17 type span struct { 18 seek uint64 19 nbytes uint32 20 length uint32 21 } 22 23 type NTuple struct { 24 rvers uint32 25 size uint32 26 27 header span 28 footer span 29 30 reserved uint64 31 } 32 33 func (*NTuple) Class() string { 34 return "ROOT::Experimental::RNTuple" 35 } 36 37 func (*NTuple) RVersion() int16 { 38 return 1 // FIXME(sbinet): generate through gen.rboot 39 } 40 41 func (nt *NTuple) String() string { 42 return fmt.Sprintf("NTuple{version:%d, size:%d, header:%v, footer:%v}", 43 nt.rvers, nt.size, nt.header, nt.footer, 44 ) 45 } 46 47 func (nt *NTuple) MarshalROOT(w *rbytes.WBuffer) (int, error) { 48 if w.Err() != nil { 49 return 0, w.Err() 50 } 51 52 hdr := w.WriteHeader(nt.Class(), nt.RVersion()) 53 54 w.WriteU32(nt.rvers) 55 w.WriteU32(nt.size) 56 57 w.WriteU64(nt.header.seek) 58 w.WriteU32(nt.header.nbytes) 59 w.WriteU32(nt.header.length) 60 61 w.WriteU64(nt.footer.seek) 62 w.WriteU32(nt.footer.nbytes) 63 w.WriteU32(nt.footer.length) 64 65 w.WriteU64(nt.reserved) 66 67 return w.SetHeader(hdr) 68 } 69 70 func (nt *NTuple) UnmarshalROOT(r *rbytes.RBuffer) error { 71 if r.Err() != nil { 72 return r.Err() 73 } 74 75 hdr := r.ReadHeader(nt.Class(), nt.RVersion()) 76 77 nt.rvers = r.ReadU32() 78 nt.size = r.ReadU32() 79 80 nt.header.seek = r.ReadU64() 81 nt.header.nbytes = r.ReadU32() 82 nt.header.length = r.ReadU32() 83 84 nt.footer.seek = r.ReadU64() 85 nt.footer.nbytes = r.ReadU32() 86 nt.footer.length = r.ReadU32() 87 88 nt.reserved = r.ReadU64() 89 90 r.CheckHeader(hdr) 91 return r.Err() 92 } 93 94 func init() { 95 { 96 f := func() reflect.Value { 97 o := &NTuple{} 98 return reflect.ValueOf(o) 99 } 100 rtypes.Factory.Add("ROOT::Experimental::RNTuple", f) 101 } 102 } 103 104 var ( 105 _ root.Object = (*NTuple)(nil) 106 _ rbytes.RVersioner = (*NTuple)(nil) 107 _ rbytes.Marshaler = (*NTuple)(nil) 108 _ rbytes.Unmarshaler = (*NTuple)(nil) 109 )