go-hep.org/x/hep@v0.38.1/groot/example_test.go (about) 1 // Copyright ©2018 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 groot_test 6 7 import ( 8 "compress/flate" 9 "fmt" 10 "log" 11 "os" 12 13 "go-hep.org/x/hep/groot" 14 "go-hep.org/x/hep/groot/rbase" 15 "go-hep.org/x/hep/groot/rhist" 16 "go-hep.org/x/hep/groot/riofs" 17 _ "go-hep.org/x/hep/groot/riofs/plugin/xrootd" 18 "go-hep.org/x/hep/groot/root" 19 "go-hep.org/x/hep/groot/rtree" 20 ) 21 22 func ExampleCreate_emptyFile() { 23 const fname = "empty.root" 24 defer os.Remove(fname) 25 26 w, err := groot.Create(fname) 27 if err != nil { 28 log.Fatal(err) 29 } 30 defer w.Close() 31 32 // empty file. close it. 33 err = w.Close() 34 if err != nil { 35 log.Fatalf("could not close empty file: %v", err) 36 } 37 38 // read back. 39 r, err := groot.Open(fname) 40 if err != nil { 41 log.Fatalf("could not open empty file: %v", err) 42 } 43 defer r.Close() 44 45 fmt.Printf("file: %q\n", r.Name()) 46 47 // Output: 48 // file: "empty.root" 49 } 50 51 func ExampleCreate() { 52 const fname = "objstring.root" 53 defer os.Remove(fname) 54 55 w, err := groot.Create(fname) 56 if err != nil { 57 log.Fatal(err) 58 } 59 defer w.Close() 60 61 var ( 62 k = "my-objstring" 63 v = rbase.NewObjString("Hello World from Go-HEP!") 64 ) 65 66 err = w.Put(k, v) 67 if err != nil { 68 log.Fatal(err) 69 } 70 71 fmt.Printf("wkeys: %d\n", len(w.Keys())) 72 73 err = w.Close() 74 if err != nil { 75 log.Fatalf("could not close file: %v", err) 76 } 77 78 r, err := groot.Open(fname) 79 if err != nil { 80 log.Fatalf("could not open file: %v", err) 81 } 82 defer r.Close() 83 84 fmt.Printf("rkeys: %d\n", len(r.Keys())) 85 86 for _, k := range r.Keys() { 87 fmt.Printf("key: name=%q, type=%q\n", k.Name(), k.ClassName()) 88 } 89 90 obj, err := r.Get(k) 91 if err != nil { 92 log.Fatal(err) 93 } 94 rv := obj.(root.ObjString) 95 fmt.Printf("objstring=%q\n", rv) 96 97 // Output: 98 // wkeys: 1 99 // rkeys: 1 100 // key: name="my-objstring", type="TObjString" 101 // objstring="Hello World from Go-HEP!" 102 } 103 104 func ExampleCreate_withZlib() { 105 const fname = "objstring-zlib.root" 106 defer os.Remove(fname) 107 108 w, err := groot.Create(fname, riofs.WithZlib(flate.BestCompression)) 109 if err != nil { 110 log.Fatal(err) 111 } 112 defer w.Close() 113 114 var ( 115 k = "my-objstring" 116 v = rbase.NewObjString("Hello World from Go-HEP!") 117 ) 118 119 err = w.Put(k, v) 120 if err != nil { 121 log.Fatal(err) 122 } 123 124 err = w.Close() 125 if err != nil { 126 log.Fatalf("could not close writable file: %v", err) 127 } 128 129 r, err := groot.Open(fname) 130 if err != nil { 131 log.Fatalf("could not open file: %v", err) 132 } 133 defer r.Close() 134 135 for _, k := range r.Keys() { 136 fmt.Printf("key: name=%q, type=%q\n", k.Name(), k.ClassName()) 137 } 138 139 obj, err := r.Get(k) 140 if err != nil { 141 log.Fatalf("could not get key %q: %v", k, err) 142 } 143 rv := obj.(root.ObjString) 144 fmt.Printf("objstring=%q\n", rv) 145 146 // Output: 147 // key: name="my-objstring", type="TObjString" 148 // objstring="Hello World from Go-HEP!" 149 } 150 151 func ExampleOpen() { 152 f, err := groot.Open("testdata/simple.root") 153 if err != nil { 154 log.Fatal(err) 155 } 156 defer f.Close() 157 158 for _, key := range f.Keys() { 159 fmt.Printf("key: %q cycle=%d title=%q\n", key.Name(), key.Cycle(), key.Title()) 160 } 161 162 obj, err := f.Get("tree") 163 if err != nil { 164 log.Fatal(err) 165 } 166 167 tree := obj.(rtree.Tree) 168 fmt.Printf("tree: %q, entries=%d\n", tree.Name(), tree.Entries()) 169 170 // Output: 171 // key: "tree" cycle=1 title="fake data" 172 // tree: "tree", entries=4 173 } 174 175 func ExampleOpen_overXRootD() { 176 f, err := groot.Open("root://eospublic.cern.ch//eos/root-eos/cms_opendata_2012_nanoaod/Run2012B_DoubleMuParked.root") 177 if err != nil { 178 log.Fatal(err) 179 } 180 defer f.Close() 181 182 for _, key := range f.Keys() { 183 fmt.Printf("key: %q cycle=%d title=%q\n", key.Name(), key.Cycle(), key.Title()) 184 } 185 186 obj, err := f.Get("Events") 187 if err != nil { 188 log.Fatal(err) 189 } 190 191 tree := obj.(rtree.Tree) 192 fmt.Printf("tree: %q, entries=%d\n", tree.Name(), tree.Entries()) 193 194 // Output: 195 // key: "Events" cycle=1 title="Events" 196 // tree: "Events", entries=29308627 197 } 198 199 func ExampleOpen_graph() { 200 f, err := groot.Open("testdata/graphs.root") 201 if err != nil { 202 log.Fatal(err) 203 } 204 defer f.Close() 205 206 obj, err := f.Get("tg") 207 if err != nil { 208 log.Fatal(err) 209 } 210 211 g := obj.(rhist.Graph) 212 fmt.Printf("name: %q\n", g.Name()) 213 fmt.Printf("title: %q\n", g.Title()) 214 fmt.Printf("#pts: %d\n", g.Len()) 215 for i := range g.Len() { 216 x, y := g.XY(i) 217 fmt.Printf("(x,y)[%d] = (%+e, %+e)\n", i, x, y) 218 } 219 220 // Output: 221 // name: "tg" 222 // title: "graph without errors" 223 // #pts: 4 224 // (x,y)[0] = (+1.000000e+00, +2.000000e+00) 225 // (x,y)[1] = (+2.000000e+00, +4.000000e+00) 226 // (x,y)[2] = (+3.000000e+00, +6.000000e+00) 227 // (x,y)[3] = (+4.000000e+00, +8.000000e+00) 228 } 229 230 // ExampleOpen_file shows how users can open a local ROOT file with the 'file://' protocol. 231 func ExampleOpen_file() { 232 f, err := groot.Open("file://./testdata/simple.root") 233 if err != nil { 234 log.Fatal(err) 235 } 236 defer f.Close() 237 238 for _, key := range f.Keys() { 239 fmt.Printf("key: %q cycle=%d title=%q\n", key.Name(), key.Cycle(), key.Title()) 240 } 241 242 obj, err := f.Get("tree") 243 if err != nil { 244 log.Fatal(err) 245 } 246 247 tree := obj.(rtree.Tree) 248 fmt.Printf("tree: %q, entries=%d\n", tree.Name(), tree.Entries()) 249 250 // Output: 251 // key: "tree" cycle=1 title="fake data" 252 // tree: "tree", entries=4 253 } 254 255 // ExampleOpen_mmap shows how users can open and mmap a local ROOT file. 256 // mmap-ing a file may be useful for performances reasons. 257 func ExampleOpen_mmap() { 258 f, err := groot.Open("file+mmap://./testdata/simple.root") 259 if err != nil { 260 log.Fatal(err) 261 } 262 defer f.Close() 263 264 for _, key := range f.Keys() { 265 fmt.Printf("key: %q cycle=%d title=%q\n", key.Name(), key.Cycle(), key.Title()) 266 } 267 268 obj, err := f.Get("tree") 269 if err != nil { 270 log.Fatal(err) 271 } 272 273 tree := obj.(rtree.Tree) 274 fmt.Printf("tree: %q, entries=%d\n", tree.Name(), tree.Entries()) 275 276 // Output: 277 // key: "tree" cycle=1 title="fake data" 278 // tree: "tree", entries=4 279 }