Skip to content

Commit

Permalink
groot/{rhist,riofs,rvers}: add r/w support for TProfile{,2D}
Browse files Browse the repository at this point in the history
Fixes #499
  • Loading branch information
sbinet committed Feb 1, 2022
1 parent 449e81e commit 73b9506
Show file tree
Hide file tree
Showing 9 changed files with 529 additions and 12 deletions.
1 change: 1 addition & 0 deletions groot/gen.rboot.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ var (
"TH1", "TH1C", "TH1D", "TH1F", "TH1I", "TH1K", "TH1S",
"TH2", "TH2C", "TH2D", "TH2F", "TH2I", "TH2Poly", "TH2PolyBin", "TH2S",
"TLimit", "TLimitDataSource",
"TProfile", "TProfile2D",

// riofs
"TDirectory",
Expand Down
212 changes: 212 additions & 0 deletions groot/rdict/cxx_root_streamers_gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -4228,6 +4228,218 @@ func init() {
Factor: 0.000000,
}.New()},
}))
StreamerInfos.Add(NewCxxStreamerInfo("TProfile", 7, 0x4bedee54, []rbytes.StreamerElement{
NewStreamerBase(Element{
Name: *rbase.NewNamed("TH1D", "1-Dim histograms (one double per channel)"),
Type: rmeta.Base,
Size: 0,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, -105818465, 0, 0, 0},
Offset: 0,
EName: "BASE",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New(), 3),
&StreamerObjectAny{StreamerElement: Element{
Name: *rbase.NewNamed("fBinEntries", "number of entries per bin"),
Type: rmeta.Any,
Size: 24,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 0, 0, 0, 0},
Offset: 0,
EName: "TArrayD",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New()},
&StreamerBasicType{StreamerElement: Element{
Name: *rbase.NewNamed("fErrorMode", "Option to compute errors"),
Type: rmeta.Int,
Size: 4,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 0, 0, 0, 0},
Offset: 0,
EName: "EErrorType",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New()},
&StreamerBasicType{StreamerElement: Element{
Name: *rbase.NewNamed("fYmin", "Lower limit in Y (if set)"),
Type: rmeta.Double,
Size: 8,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 0, 0, 0, 0},
Offset: 0,
EName: "double",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New()},
&StreamerBasicType{StreamerElement: Element{
Name: *rbase.NewNamed("fYmax", "Upper limit in Y (if set)"),
Type: rmeta.Double,
Size: 8,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 0, 0, 0, 0},
Offset: 0,
EName: "double",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New()},
&StreamerBasicType{StreamerElement: Element{
Name: *rbase.NewNamed("fTsumwy", "Total Sum of weight*Y"),
Type: rmeta.Double,
Size: 8,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 0, 0, 0, 0},
Offset: 0,
EName: "double",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New()},
&StreamerBasicType{StreamerElement: Element{
Name: *rbase.NewNamed("fTsumwy2", "Total Sum of weight*Y*Y"),
Type: rmeta.Double,
Size: 8,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 0, 0, 0, 0},
Offset: 0,
EName: "double",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New()},
&StreamerObjectAny{StreamerElement: Element{
Name: *rbase.NewNamed("fBinSumw2", "Array of sum of squares of weights per bin"),
Type: rmeta.Any,
Size: 24,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 0, 0, 0, 0},
Offset: 0,
EName: "TArrayD",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New()},
}))
StreamerInfos.Add(NewCxxStreamerInfo("TProfile2D", 8, 0x36a142ac, []rbytes.StreamerElement{
NewStreamerBase(Element{
Name: *rbase.NewNamed("TH2D", "2-Dim histograms (one double per channel)"),
Type: rmeta.Base,
Size: 0,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 2142929648, 0, 0, 0},
Offset: 0,
EName: "BASE",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New(), 4),
&StreamerObjectAny{StreamerElement: Element{
Name: *rbase.NewNamed("fBinEntries", "number of entries per bin"),
Type: rmeta.Any,
Size: 24,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 0, 0, 0, 0},
Offset: 0,
EName: "TArrayD",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New()},
&StreamerBasicType{StreamerElement: Element{
Name: *rbase.NewNamed("fErrorMode", "Option to compute errors"),
Type: rmeta.Int,
Size: 4,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 0, 0, 0, 0},
Offset: 0,
EName: "EErrorType",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New()},
&StreamerBasicType{StreamerElement: Element{
Name: *rbase.NewNamed("fZmin", "Lower limit in Z (if set)"),
Type: rmeta.Double,
Size: 8,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 0, 0, 0, 0},
Offset: 0,
EName: "double",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New()},
&StreamerBasicType{StreamerElement: Element{
Name: *rbase.NewNamed("fZmax", "Upper limit in Z (if set)"),
Type: rmeta.Double,
Size: 8,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 0, 0, 0, 0},
Offset: 0,
EName: "double",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New()},
&StreamerBasicType{StreamerElement: Element{
Name: *rbase.NewNamed("fTsumwz", "Total Sum of weight*Z"),
Type: rmeta.Double,
Size: 8,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 0, 0, 0, 0},
Offset: 0,
EName: "double",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New()},
&StreamerBasicType{StreamerElement: Element{
Name: *rbase.NewNamed("fTsumwz2", "Total Sum of weight*Z*Z"),
Type: rmeta.Double,
Size: 8,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 0, 0, 0, 0},
Offset: 0,
EName: "double",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New()},
&StreamerObjectAny{StreamerElement: Element{
Name: *rbase.NewNamed("fBinSumw2", "Array of sum of squares of weights per bin"),
Type: rmeta.Any,
Size: 24,
ArrLen: 0,
ArrDim: 0,
MaxIdx: [5]int32{0, 0, 0, 0, 0},
Offset: 0,
EName: "TArrayD",
XMin: 0.000000,
XMax: 0.000000,
Factor: 0.000000,
}.New()},
}))
StreamerInfos.Add(NewCxxStreamerInfo("TDirectory", 5, 0x1e9b6f70, []rbytes.StreamerElement{
NewStreamerBase(Element{
Name: *rbase.NewNamed("TNamed", "The basis for a named object (name, title)"),
Expand Down
119 changes: 119 additions & 0 deletions groot/rhist/p1d.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
// Copyright ©2022 The go-hep Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package rhist

import (
"fmt"
"reflect"

"go-hep.org/x/hep/groot/rbytes"
"go-hep.org/x/hep/groot/rcont"
"go-hep.org/x/hep/groot/root"
"go-hep.org/x/hep/groot/rtypes"
"go-hep.org/x/hep/groot/rvers"
)

// Profile1D is a 1-dim profile histogram.
type Profile1D struct {
h1d H1D // base class
binEntries rcont.ArrayD // number of entries per bin
errMode int32 // Option to compute errors
ymin float64 // Lower limit in Y (if set)
ymax float64 // Upper limit in Y (if set)
sumwy float64 // Total Sum of weight*Y
sumwy2 float64 // Total Sum of weight*Y*Y
binSumw2 rcont.ArrayD // Array of sum of squares of weights per bin
}

func newProfile1D() *Profile1D {
return &Profile1D{
h1d: *newH1D(),
}
}

func (*Profile1D) Class() string {
return "TProfile"
}

func (*Profile1D) RVersion() int16 {
return rvers.Profile
}

// MarshalROOT implements rbytes.Marshaler
func (p *Profile1D) MarshalROOT(w *rbytes.WBuffer) (int, error) {
if w.Err() != nil {
return 0, w.Err()
}

pos := w.WriteVersion(p.RVersion())

if n, err := p.h1d.MarshalROOT(w); err != nil {
return n, err
}

if n, err := p.binEntries.MarshalROOT(w); err != nil {
return n, err
}
w.WriteI32(p.errMode)
w.WriteF64(p.ymin)
w.WriteF64(p.ymax)
w.WriteF64(p.sumwy)
w.WriteF64(p.sumwy2)
if n, err := p.binSumw2.MarshalROOT(w); err != nil {
return n, err
}

return w.SetByteCount(pos, p.Class())
}

// UnmarshalROOT implements rbytes.Unmarshaler
func (p *Profile1D) UnmarshalROOT(r *rbytes.RBuffer) error {
if r.Err() != nil {
return r.Err()
}

start := r.Pos()
vers, pos, bcnt := r.ReadVersion(p.Class())
if vers > rvers.Profile {
panic(fmt.Errorf("rhist: invalid TProfile version=%d > %d", vers, rvers.Profile))
}
if vers < 7 {
// tested with v7.
panic(fmt.Errorf("rhist: too old TProfile version=%d < 7", vers))
}

if err := p.h1d.UnmarshalROOT(r); err != nil {
return err
}
if err := p.binEntries.UnmarshalROOT(r); err != nil {
return err
}
p.errMode = r.ReadI32()
p.ymin = r.ReadF64()
p.ymax = r.ReadF64()
p.sumwy = r.ReadF64()
p.sumwy2 = r.ReadF64()
if err := p.binSumw2.UnmarshalROOT(r); err != nil {
return err
}

r.CheckByteCount(pos, bcnt, start, p.Class())
return r.Err()
}

func init() {
f := func() reflect.Value {
p1d := newProfile1D()
return reflect.ValueOf(p1d)
}
rtypes.Factory.Add("TProfile", f)
}

var (
_ root.Object = (*Profile1D)(nil)
_ rbytes.RVersioner = (*Profile1D)(nil)
_ rbytes.Marshaler = (*Profile1D)(nil)
_ rbytes.Unmarshaler = (*Profile1D)(nil)
)
Loading

0 comments on commit 73b9506

Please sign in to comment.