Skip to content

Commit b57330a

Browse files
committed
groot/{rcmd,riofs,rtree,rvers}: add rtree.Reader support for TNtuple{,D}
Signed-off-by: Sebastien Binet <binet@cern.ch>
1 parent 24ff587 commit b57330a

File tree

11 files changed

+225
-1
lines changed

11 files changed

+225
-1
lines changed

groot/gen.rboot.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ var (
9696
"TLeafF", "TLeafD",
9797
"TLeafF16", "TLeafD32",
9898
"TLeafC",
99-
"TNtuple",
99+
"TNtuple", "TNtupleD",
100100
"TTree",
101101
}
102102
)

groot/rcmd/dump_test.go

+50
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,56 @@ func TestDump(t *testing.T) {
5252
[000][branch1.floatleaf]: 15.5
5353
[000][branch2.intleaf]: 20
5454
[000][branch2.floatleaf]: 781.2
55+
`,
56+
},
57+
{
58+
name: "../testdata/tntuple.root",
59+
want: `key[000]: ntup;1 "my ntuple title" (TNtuple)
60+
[000][x]: 0
61+
[000][y]: 0.5
62+
[001][x]: 1
63+
[001][y]: 1.5
64+
[002][x]: 2
65+
[002][y]: 2.5
66+
[003][x]: 3
67+
[003][y]: 3.5
68+
[004][x]: 4
69+
[004][y]: 4.5
70+
[005][x]: 5
71+
[005][y]: 5.5
72+
[006][x]: 6
73+
[006][y]: 6.5
74+
[007][x]: 7
75+
[007][y]: 7.5
76+
[008][x]: 8
77+
[008][y]: 8.5
78+
[009][x]: 9
79+
[009][y]: 9.5
80+
`,
81+
},
82+
{
83+
name: "../testdata/tntupled.root",
84+
want: `key[000]: ntup;1 "my ntuple title" (TNtupleD)
85+
[000][x]: 0
86+
[000][y]: 0.5
87+
[001][x]: 1
88+
[001][y]: 1.5
89+
[002][x]: 2
90+
[002][y]: 2.5
91+
[003][x]: 3
92+
[003][y]: 3.5
93+
[004][x]: 4
94+
[004][y]: 4.5
95+
[005][x]: 5
96+
[005][y]: 5.5
97+
[006][x]: 6
98+
[006][y]: 6.5
99+
[007][x]: 7
100+
[007][y]: 7.5
101+
[008][x]: 8
102+
[008][y]: 8.5
103+
[009][x]: 9
104+
[009][y]: 9.5
55105
`,
56106
},
57107
{

groot/rdict/cxx_root_streamers_gen.go

+28
Original file line numberDiff line numberDiff line change
@@ -5268,6 +5268,34 @@ func init() {
52685268
Factor: 0.000000,
52695269
}.New()},
52705270
}))
5271+
StreamerInfos.Add(NewCxxStreamerInfo("TNtupleD", 1, 0x8de8d873, []rbytes.StreamerElement{
5272+
NewStreamerBase(Element{
5273+
Name: *rbase.NewNamed("TTree", "Tree descriptor (the main ROOT I/O class)"),
5274+
Type: rmeta.Base,
5275+
Size: 0,
5276+
ArrLen: 0,
5277+
ArrDim: 0,
5278+
MaxIdx: [5]int32{0, 1919213695, 0, 0, 0},
5279+
Offset: 0,
5280+
EName: "BASE",
5281+
XMin: 0.000000,
5282+
XMax: 0.000000,
5283+
Factor: 0.000000,
5284+
}.New(), 20),
5285+
&StreamerBasicType{StreamerElement: Element{
5286+
Name: *rbase.NewNamed("fNvar", "Number of columns"),
5287+
Type: rmeta.Int,
5288+
Size: 4,
5289+
ArrLen: 0,
5290+
ArrDim: 0,
5291+
MaxIdx: [5]int32{0, 0, 0, 0, 0},
5292+
Offset: 0,
5293+
EName: "int",
5294+
XMin: 0.000000,
5295+
XMax: 0.000000,
5296+
Factor: 0.000000,
5297+
}.New()},
5298+
}))
52715299
StreamerInfos.Add(NewCxxStreamerInfo("TTree", 20, 0x7264e07f, []rbytes.StreamerElement{
52725300
NewStreamerBase(Element{
52735301
Name: *rbase.NewNamed("TNamed", "The basis for a named object (name, title)"),

groot/riofs/gendata/gen-tntuple.go

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright ©2022 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+
// +build ignore
7+
8+
package main
9+
10+
import (
11+
"flag"
12+
"log"
13+
14+
"go-hep.org/x/hep/groot/internal/rtests"
15+
)
16+
17+
var (
18+
root = flag.String("f", "test-tntuple.root", "output ROOT file")
19+
)
20+
21+
func main() {
22+
flag.Parse()
23+
24+
out, err := rtests.RunCxxROOT("gentntuple", []byte(script), *root)
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+
void gentntuple(const char* fname) {
32+
int bufsize = 32000;
33+
int evtmax = 10;
34+
35+
auto f = TFile::Open(fname, "RECREATE");
36+
auto t = new TNtuple("ntup", "my ntuple title", "x:y");
37+
38+
for (int i = 0; i != evtmax; i++) {
39+
t->Fill(i, i+0.5);
40+
}
41+
f->Write();
42+
f->Close();
43+
44+
exit(0);
45+
}
46+
`

groot/riofs/gendata/gen-tntupled.go

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright ©2022 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+
// +build ignore
7+
8+
package main
9+
10+
import (
11+
"flag"
12+
"log"
13+
14+
"go-hep.org/x/hep/groot/internal/rtests"
15+
)
16+
17+
var (
18+
root = flag.String("f", "test-tntupled.root", "output ROOT file")
19+
)
20+
21+
func main() {
22+
flag.Parse()
23+
24+
out, err := rtests.RunCxxROOT("gentntuple", []byte(script), *root)
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+
void gentntuple(const char* fname) {
32+
int bufsize = 32000;
33+
int evtmax = 10;
34+
35+
auto f = TFile::Open(fname, "RECREATE");
36+
auto t = new TNtupleD("ntup", "my ntuple title", "x:y");
37+
38+
for (int i = 0; i != evtmax; i++) {
39+
t->Fill(i, i+0.5);
40+
}
41+
f->Write();
42+
f->Close();
43+
44+
exit(0);
45+
}
46+
`

groot/riofs/riofs.go

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import (
2626
//go:generate go run ./gendata/gen-tlv.go -f ../testdata/tlv-split00.root -split=0
2727
//go:generate go run ./gendata/gen-tlv.go -f ../testdata/tlv-split01.root -split=1
2828
//go:generate go run ./gendata/gen-tlv.go -f ../testdata/tlv-split99.root -split=99
29+
//go:generate go run ./gendata/gen-tntuple.go -f ../testdata/tntuple.root
30+
//go:generate go run ./gendata/gen-tntupled.go -f ../testdata/tntupled.root
2931

3032
// Directory describes a ROOT directory structure in memory.
3133
type Directory interface {

groot/rtree/reader.go

+4
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,10 @@ func newReader(t Tree, rvars []ReadVar, n int, beg, end int64) reader {
253253
switch t := t.(type) {
254254
case *ttree:
255255
return newRTree(t, rvars, n, beg, end)
256+
case *tntuple:
257+
return newRTree(&t.ttree, rvars, n, beg, end)
258+
case *tntupleD:
259+
return newRTree(&t.ttree, rvars, n, beg, end)
256260
case *chain:
257261
return newRChain(t, rvars, n, beg, end)
258262
case *join:

groot/rtree/tree.go

+47
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,10 @@ type tntuple struct {
646646
nvars int
647647
}
648648

649+
func (*tntuple) RVersion() int16 {
650+
return rvers.Ntuple
651+
}
652+
649653
func (*tntuple) Class() string {
650654
return "TNtuple"
651655
}
@@ -668,6 +672,37 @@ func (nt *tntuple) UnmarshalROOT(r *rbytes.RBuffer) error {
668672
return r.Err()
669673
}
670674

675+
type tntupleD struct {
676+
ttree
677+
nvars int
678+
}
679+
680+
func (*tntupleD) RVersion() int16 {
681+
return rvers.NtupleD
682+
}
683+
684+
func (*tntupleD) Class() string {
685+
return "TNtupleD"
686+
}
687+
688+
func (nt *tntupleD) UnmarshalROOT(r *rbytes.RBuffer) error {
689+
if r.Err() != nil {
690+
return r.Err()
691+
}
692+
693+
beg := r.Pos()
694+
/*vers*/ _, pos, bcnt := r.ReadVersion(nt.Class())
695+
696+
if err := nt.ttree.UnmarshalROOT(r); err != nil {
697+
return err
698+
}
699+
700+
nt.nvars = int(r.ReadI32())
701+
702+
r.CheckByteCount(pos, bcnt, beg, nt.Class())
703+
return r.Err()
704+
}
705+
671706
type tioFeatures uint8
672707

673708
func (*tioFeatures) Class() string { return "TIOFeatures" }
@@ -739,6 +774,13 @@ func init() {
739774
}
740775
rtypes.Factory.Add("TNtuple", f)
741776
}
777+
{
778+
f := func() reflect.Value {
779+
o := &tntupleD{}
780+
return reflect.ValueOf(o)
781+
}
782+
rtypes.Factory.Add("TNtupleD", f)
783+
}
742784
}
743785

744786
var (
@@ -753,6 +795,11 @@ var (
753795
_ Tree = (*tntuple)(nil)
754796
_ rbytes.Unmarshaler = (*tntuple)(nil)
755797

798+
_ root.Object = (*tntupleD)(nil)
799+
_ root.Named = (*tntupleD)(nil)
800+
_ Tree = (*tntupleD)(nil)
801+
_ rbytes.Unmarshaler = (*tntupleD)(nil)
802+
756803
_ root.Object = (*tioFeatures)(nil)
757804
_ rbytes.Marshaler = (*tioFeatures)(nil)
758805
_ rbytes.Unmarshaler = (*tioFeatures)(nil)

groot/rvers/versions_gen.go

+1
Original file line numberDiff line numberDiff line change
@@ -104,5 +104,6 @@ const (
104104
LeafD32 = 1 // ROOT version for TLeafD32
105105
LeafC = 1 // ROOT version for TLeafC
106106
Ntuple = 2 // ROOT version for TNtuple
107+
NtupleD = 1 // ROOT version for TNtupleD
107108
Tree = 20 // ROOT version for TTree
108109
)

groot/testdata/tntuple.root

5.67 KB
Binary file not shown.

groot/testdata/tntupled.root

5.71 KB
Binary file not shown.

0 commit comments

Comments
 (0)