go-hep.org/x/hep@v0.38.1/fwk/examples/fwk-ex-tuto-4-write-histo/htask.go (about)

     1  // Copyright ©2017 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  	"fmt"
     9  	"reflect"
    10  	"strings"
    11  
    12  	"go-hep.org/x/hep/fwk"
    13  )
    14  
    15  type testhsvc struct {
    16  	fwk.TaskBase
    17  
    18  	hsvc   fwk.HistSvc
    19  	h1d    fwk.H1D
    20  	stream string
    21  }
    22  
    23  func (tsk *testhsvc) Configure(ctx fwk.Context) error {
    24  	var err error
    25  
    26  	return err
    27  }
    28  
    29  func (tsk *testhsvc) StartTask(ctx fwk.Context) error {
    30  	var err error
    31  
    32  	svc, err := ctx.Svc("histsvc")
    33  	if err != nil {
    34  		return err
    35  	}
    36  
    37  	tsk.hsvc = svc.(fwk.HistSvc)
    38  
    39  	if !strings.HasPrefix(tsk.stream, "/") {
    40  		tsk.stream = "/" + tsk.stream
    41  	}
    42  	tsk.stream = strings.TrimSuffix(tsk.stream[:len(tsk.stream)-1], "/")
    43  
    44  	tsk.h1d, err = tsk.hsvc.BookH1D(tsk.stream+"/h1d-"+tsk.Name(), 100, -10, 10)
    45  	if err != nil {
    46  		return err
    47  	}
    48  
    49  	return err
    50  }
    51  
    52  func (tsk *testhsvc) StopTask(ctx fwk.Context) error {
    53  	var err error
    54  
    55  	h := tsk.h1d.Hist
    56  	if h.Entries() != *evtmax {
    57  		return fmt.Errorf("expected %d entries. got=%d", *evtmax, h.Entries())
    58  	}
    59  	mean := h.XMean()
    60  	if mean != 4.5 {
    61  		return fmt.Errorf("expected mean=%v. got=%v", 4.5, mean)
    62  	}
    63  
    64  	rms := h.XRMS()
    65  	if rms != 2.8722813232690143 {
    66  		return fmt.Errorf("expected RMS=%v. got=%v", 2.8722813232690143, rms)
    67  	}
    68  
    69  	msg := ctx.Msg()
    70  	msg.Infof("histo[%s]: entries=%v mean=%v RMS=%v\n",
    71  		tsk.h1d.ID,
    72  		h.Entries(),
    73  		h.XMean(),
    74  		h.XRMS(),
    75  	)
    76  
    77  	return err
    78  }
    79  
    80  func (tsk *testhsvc) Process(ctx fwk.Context) error {
    81  	var err error
    82  	id := ctx.ID()
    83  	tsk.hsvc.FillH1D(tsk.h1d.ID, float64(id), 1)
    84  	return err
    85  }
    86  
    87  func newtesthsvc(typ, name string, mgr fwk.App) (fwk.Component, error) {
    88  	var err error
    89  
    90  	tsk := &testhsvc{
    91  		TaskBase: fwk.NewTask(typ, name, mgr),
    92  		stream:   "",
    93  	}
    94  
    95  	err = tsk.DeclProp("Stream", &tsk.stream)
    96  	if err != nil {
    97  		return nil, err
    98  	}
    99  
   100  	return tsk, err
   101  }
   102  
   103  func init() {
   104  	fwk.Register(reflect.TypeOf(testhsvc{}), newtesthsvc)
   105  }