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  }