go-hep.org/x/hep@v0.38.1/cmd/yoda2root/main_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 main 6 7 import ( 8 "compress/gzip" 9 "io" 10 "os" 11 "reflect" 12 "strings" 13 "testing" 14 15 "go-hep.org/x/hep/groot" 16 "go-hep.org/x/hep/groot/rhist" 17 "go-hep.org/x/hep/hbook" 18 "go-hep.org/x/hep/hbook/rootcnv" 19 "go-hep.org/x/hep/hbook/yodacnv" 20 ) 21 22 func TestYODA2ROOT(t *testing.T) { 23 24 h1 := hbook.NewH1D(10, -4, 4) 25 h1.Annotation()["name"] = "h1-name" 26 h1.Annotation()["title"] = "h1-title" 27 h1.Fill(1, 1) 28 h1.Fill(2, 1) 29 30 h2 := hbook.NewH2D(10, -4, 4, 20, -5, 5) 31 h2.Annotation()["name"] = "h2-name" 32 h2.Annotation()["title"] = "h2-title" 33 h2.Fill(1, 1, 1) 34 h2.Fill(2, 2, 2) 35 36 s2 := hbook.NewS2DFrom([]float64{1, 2, 3, 4, 5}, []float64{1, 4, 9, 16, 25}) 37 s2.Annotation()["name"] = "s2-name" 38 s2.Annotation()["title"] = "s2-title" 39 40 anon := hbook.NewS2DFrom([]float64{10, 20}, []float64{10, 40}) 41 anon.Annotation()["title"] = "no-title" 42 43 for _, tc := range []struct { 44 yfname string 45 rfname string 46 }{ 47 { 48 yfname: "f1.yoda", 49 rfname: "f1.root", 50 }, 51 { 52 yfname: "f2.yoda.gz", 53 rfname: "f2.root", 54 }, 55 } { 56 t.Run(tc.yfname, func(t *testing.T) { 57 yfname := tc.yfname 58 rfname := tc.rfname 59 60 defer os.Remove(yfname) 61 defer os.Remove(rfname) 62 63 f, err := os.Create(yfname) 64 if err != nil { 65 t.Fatal(err) 66 } 67 defer f.Close() 68 69 var yf io.WriteCloser = f 70 71 if strings.HasSuffix(yfname, ".gz") { 72 yf = gzip.NewWriter(f) 73 } 74 75 err = yodacnv.Write(yf, h1, h2, s2, anon) 76 if err != nil { 77 t.Fatal(err) 78 } 79 80 err = yf.Close() 81 if err != nil { 82 t.Fatal(err) 83 } 84 85 if strings.HasSuffix(yfname, ".gz") { 86 err = f.Close() 87 if err != nil { 88 t.Fatal(err) 89 } 90 } 91 92 o, err := groot.Create(rfname) 93 if err != nil { 94 t.Fatal(err) 95 } 96 defer o.Close() 97 98 err = convert(o, yfname) 99 if err != nil { 100 t.Fatal(err) 101 } 102 103 err = o.Close() 104 if err != nil { 105 t.Fatal(err) 106 } 107 108 rf, err := groot.Open(rfname) 109 if err != nil { 110 t.Fatal(err) 111 } 112 113 robj, err := rf.Get("h1-name") 114 if err != nil { 115 t.Fatal(err) 116 } 117 118 rh1 := rootcnv.H1D(robj.(rhist.H1)) 119 120 if got, want := rh1.XMean(), h1.XMean(); got != want { 121 t.Fatalf("h1 round-trip failed: got: %v, want: %v", got, want) 122 } 123 124 robj, err = rf.Get("h2-name") 125 if err != nil { 126 t.Fatal(err) 127 } 128 129 rh2 := rootcnv.H2D(robj.(rhist.H2)) 130 131 if got, want := rh2.XMean(), h2.XMean(); got != want { 132 t.Fatalf("h2 round-trip failed: got: %v, want: %v", got, want) 133 } 134 135 robj, err = rf.Get("s2-name") 136 if err != nil { 137 t.Fatal(err) 138 } 139 140 rs2 := rootcnv.S2D(robj.(rhist.GraphErrors)) 141 142 if !reflect.DeepEqual(rs2, s2) { 143 t.Fatalf("s2 round-trip failed") 144 } 145 146 robj, err = rf.Get("yoda-scatter-003") 147 if err != nil { 148 t.Fatal(err) 149 } 150 151 ranon := rootcnv.S2D(robj.(rhist.GraphErrors)) 152 153 if !reflect.DeepEqual(ranon.Points(), anon.Points()) { 154 t.Fatalf("s2-anon round-trip failed") 155 } 156 }) 157 } 158 159 }