func BenchmarkH1DFillFlat(b *testing.B) { b.StopTimer() h1 := hbook.NewH1D(100, 0., 100.) b.StartTimer() for i := 0; i < b.N; i++ { h1.Fill(rnd()*100., 1.) } }
func BenchmarkH1DSTFillConst(b *testing.B) { b.StopTimer() h1 := hbook.NewH1D(100, 0., 100.) b.StartTimer() for i := 0; i < b.N; i++ { h1.Fill(10., 1.) } }
func TestNTupleScanH1DFromCSV(t *testing.T) { db, err := csvdriver.Conn{ File: "testdata/simple.csv", Comma: ';', Comment: '#', }.Open() if err != nil { t.Fatalf("error opening CSV db: %v\n", err) } defer db.Close() nt, err := hbook.OpenNTuple(db, "csv") if err != nil { t.Fatalf("error opening ntuple: %v\n", err) } h := hbook.NewH1D(10, 0, 10) h, err = nt.ScanH1D("var2", h) if err != nil { t.Errorf("error running query: %v\n", err) } want := struct { entries int64 len int mean float64 rms float64 }{ entries: 10, len: 10, mean: 4.5, rms: 2.8722813232690143, } if h.Entries() != want.entries { t.Errorf("error. got %v entries. want=%v\n", h.Entries(), want.entries) } if h.Len() != want.len { t.Errorf("error. got %v bins. want=%d\n", h.Len(), want.len) } for i := 0; i < h.Len(); i++ { v := h.Value(i) if v != 1 { t.Errorf("error bin(%d)=%v. want=1\n", i, v) } } if mean := h.Mean(); mean != want.mean { t.Errorf("error: mean=%v. want=%v\n", mean, want.mean) } if rms := h.RMS(); rms != want.rms { t.Errorf("error: rms=%v. want=%v\n", rms, want.rms) } }
func (svc *hsvc) BookH1D(name string, nbins int, low, high float64) (fwk.H1D, error) { var err error var h fwk.H1D if !(fsm.Configured < svc.FSMState() && svc.FSMState() < fsm.Running) { return h, fwk.Errorf("fwk: can not book histograms during FSM-state %v", svc.FSMState()) } stream, hid := svc.split(name) h = fwk.H1D{ ID: fwk.HID(hid), Hist: hbook.NewH1D(nbins, low, high), } switch stream { case "": // ok, temporary histo. default: sname := "/" + stream str, ok := svc.streams[sname] if !ok { return h, fwk.Errorf("fwk: no stream [%s] declared", sname) } switch str.Mode { case Read: r, ok := svc.r[sname] if !ok { return h, fwk.Errorf("fwk: no read-stream [%s] declared", sname) } err = r.read(hid, h.Hist) if err != nil { return h, err } r.objs = append(r.objs, h) svc.r[sname] = r case Write: w, ok := svc.w[sname] if !ok { return h, fwk.Errorf("fwk: no write-stream [%s] declared: %v", sname, svc.w) } w.objs = append(w.objs, h) svc.w[sname] = w default: return h, fwk.Errorf("%s: invalid stream mode (%d)", svc.Name(), str.Mode) } } hh := &h1d{H1D: h} svc.h1ds[h.ID] = hh return hh.H1D, err }
func BenchmarkNH1DFillFlat(b *testing.B) { b.StopTimer() hists := make([]*hbook.H1D, 100) for i := 0; i < 100; i++ { hists[i] = hbook.NewH1D(100, 0., 100.) } b.StartTimer() for i := 0; i < b.N; i++ { st_process_evts(100, hists, st_process_evts_flat) } }
func TestH1DSerialization(t *testing.T) { const nentries = 50 href := hbook.NewH1D(100, 0., 100.) for i := 0; i < nentries; i++ { href.Fill(rnd()*100., 1.) } href.Annotation()["title"] = "histo title" href.Annotation()["name"] = "histo name" // test gob.GobDecode/gob.GobEncode interface func() { buf := new(bytes.Buffer) enc := gob.NewEncoder(buf) err := enc.Encode(href) if err != nil { t.Fatalf("could not serialize histogram: %v", err) } var hnew hbook.H1D dec := gob.NewDecoder(buf) err = dec.Decode(&hnew) if err != nil { t.Fatalf("could not deserialize histogram: %v", err) } if !reflect.DeepEqual(href, &hnew) { t.Fatalf("ref=%v\nnew=%v\n", href, &hnew) } }() // test rio.Marshaler/Unmarshaler func() { buf := new(bytes.Buffer) err := href.RioMarshal(buf) if err != nil { t.Fatalf("could not serialize histogram: %v", err) } var hnew hbook.H1D err = hnew.RioUnmarshal(buf) if err != nil { t.Fatalf("could not deserialize histogram: %v", err) } if !reflect.DeepEqual(href, &hnew) { t.Fatalf("ref=%v\nnew=%v\n", href, &hnew) } }() }
func (svc *hsvc) BookH1D(name string, nbins int, low, high float64) (fwk.H1D, error) { var err error h := fwk.H1D{ ID: fwk.HID(name), Hist: hbook.NewH1D(nbins, low, high), } if !(svc.FSMState() < fsm.Running) { return h, fwk.Errorf("fwk: can not book histograms during FSM-state %v", svc.FSMState()) } hh := &h1d{H1D: h} svc.h1ds[h.ID] = hh return hh.H1D, err }
func TestH1D(t *testing.T) { h1 := hbook.NewH1D(100, 0., 100.) if h1 == nil { t.Errorf("nil pointer to H1D") } h1.Annotation()["name"] = "h1" n := h1.Name() if n != "h1" { t.Errorf("expected H1D.Name() == %q (got %q)\n", n, "h1") } nbins := h1.Axis().Bins() if nbins != 100 { t.Errorf("expected H1D.Axis.Bins() == %v (got %v)\n", 100, nbins, ) } low := h1.Axis().LowerEdge() if low != 0. { t.Errorf("expected H1D.Axis.LowerEdge() == %v (got %v)\n", 0., low, ) } up := h1.Axis().UpperEdge() if up != 100. { t.Errorf("expected H1D.Axis.UpperEdge() == %v (got %v)\n", 100., up, ) } for idx := 0; idx < nbins; idx++ { size := h1.Axis().BinWidth(idx) if size != 1. { t.Errorf("expected H1D.Axis.BinWidth(%v) == %v (got %v)\n", idx, 1., size, ) } } var _ plotter.XYer = h1 var _ plotter.Valuer = h1 }
func TestNTupleScanH1DWhere(t *testing.T) { h := hbook.NewH1D(10, 0, 10) h, err := nt.ScanH1D("x where (id > 4 && id < 10)", h) if err != nil { t.Errorf("error running query: %v\n", err) } want := struct { entries int64 len int mean float64 rms float64 }{ entries: 5, len: 10, mean: 7, rms: 1.4142135623730951, } if h.Entries() != want.entries { t.Errorf("error. got %v entries. want=%v\n", h.Entries(), want.entries) } if h.Len() != want.len { t.Errorf("error. got %v bins. want=%d\n", h.Len(), want.len) } for i := 0; i < h.Len(); i++ { v := h.Value(i) want := float64(0) if i > 4 { want = 1 } if v != want { t.Errorf("error bin(%d)=%v. want=%v\n", i, v, want) } } if mean := h.Mean(); mean != want.mean { t.Errorf("error: mean=%v. want=%v\n", mean, want.mean) } if rms := h.RMS(); rms != want.rms { t.Errorf("error: rms=%v. want=%v\n", rms, want.rms) } }
func TestNTupleScan(t *testing.T) { h := hbook.NewH1D(10, 0, 10) err := nt.Scan("id, x", func(id int64, x float64) error { h.Fill(x, 1) return nil }) if err != nil { t.Errorf("error running query: %v\n", err) } want := struct { entries int64 len int mean float64 rms float64 }{ entries: 10, len: 10, mean: 4.5, rms: 2.8722813232690143, } if h.Entries() != want.entries { t.Errorf("error. got %v entries. want=%v\n", h.Entries(), want.entries) } if h.Len() != want.len { t.Errorf("error. got %v bins. want=%d\n", h.Len(), want.len) } for i := 0; i < h.Len(); i++ { v := h.Value(i) if v != 1 { t.Errorf("error bin(%d)=%v. want=1\n", i, v) } } if mean := h.Mean(); mean != want.mean { t.Errorf("error: mean=%v. want=%v\n", mean, want.mean) } if rms := h.RMS(); rms != want.rms { t.Errorf("error: rms=%v. want=%v\n", rms, want.rms) } }
func BenchmarkH1DFillFlatGo(b *testing.B) { b.StopTimer() h1 := hbook.NewH1D(100, 0., 100.) wg := new(sync.WaitGroup) //wg.Add(b.N) b.StartTimer() // throttle... q := make(chan struct{}, 1000) for i := 0; i < b.N; i++ { q <- struct{}{} go func() { wg.Add(1) h1.Fill(rnd()*100., 1.) <-q wg.Done() }() } wg.Wait() }