go-hep.org/x/hep@v0.38.1/groot/rhist/efficiency.go (about)

     1  // Copyright ©2022 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 rhist
     6  
     7  import (
     8  	"fmt"
     9  	"reflect"
    10  
    11  	"go-hep.org/x/hep/groot/rbase"
    12  	"go-hep.org/x/hep/groot/rbytes"
    13  	"go-hep.org/x/hep/groot/rcont"
    14  	"go-hep.org/x/hep/groot/root"
    15  	"go-hep.org/x/hep/groot/rtypes"
    16  	"go-hep.org/x/hep/groot/rvers"
    17  )
    18  
    19  // Efficiency handles efficiency histograms.
    20  type Efficiency struct {
    21  	named   rbase.Named
    22  	attline rbase.AttLine
    23  	attfill rbase.AttFill
    24  	attmark rbase.AttMarker
    25  
    26  	betaAlpha float64 // global parameter for prior beta distribution (default = 1)
    27  	betaBeta  float64 // global parameter for prior beta distribution (default = 1)
    28  
    29  	betaBinParams [][2]float64 // parameter for prior beta distribution different bin by bin
    30  
    31  	confLvl float64    // confidence level (default = 0.683, 1 sigma)
    32  	funcs   rcont.List // ->pointer to list of functions
    33  
    34  	passedHist H1      // histogram for events which passed certain criteria
    35  	statOpt    int32   // defines how the confidence intervals are determined
    36  	totHist    H1      // histogram for total number of events
    37  	weight     float64 // weight for all events (default = 1)
    38  }
    39  
    40  func (*Efficiency) Class() string {
    41  	return "TEfficiency"
    42  }
    43  
    44  func (*Efficiency) RVersion() int16 {
    45  	return rvers.Efficiency
    46  }
    47  
    48  // MarshalROOT implements rbytes.Marshaler
    49  func (o *Efficiency) MarshalROOT(w *rbytes.WBuffer) (int, error) {
    50  	if w.Err() != nil {
    51  		return 0, w.Err()
    52  	}
    53  
    54  	hdr := w.WriteHeader(o.Class(), o.RVersion())
    55  
    56  	w.WriteObject(&o.named)
    57  	w.WriteObject(&o.attline)
    58  	w.WriteObject(&o.attfill)
    59  	w.WriteObject(&o.attmark)
    60  	w.WriteF64(o.betaAlpha)
    61  	w.WriteF64(o.betaBeta)
    62  	writeVecPairF64(w, o.betaBinParams)
    63  	w.WriteF64(o.confLvl)
    64  	w.WriteObject(&o.funcs)        // obj-ptr
    65  	w.WriteObjectAny(o.passedHist) // obj-ptr
    66  	w.WriteI32(o.statOpt)
    67  	w.WriteObjectAny(o.totHist) // obj-ptr
    68  	w.WriteF64(o.weight)
    69  
    70  	return w.SetHeader(hdr)
    71  }
    72  
    73  func writeVecPairF64(w *rbytes.WBuffer, vs [][2]float64) {
    74  	if w.Err() != nil {
    75  		return
    76  	}
    77  	const typename = "vector<pair<double,double> >"
    78  	hdr := w.WriteHeader(typename, rvers.StreamerBaseSTL|rbytes.StreamedMemberWise)
    79  	w.WriteI16(0)        // class version
    80  	w.WriteU32(0xd7bed2) // checksum
    81  	w.WriteI32(int32(len(vs)))
    82  	for i := range vs {
    83  		w.WriteF64(vs[i][0])
    84  	}
    85  	for i := range vs {
    86  		w.WriteF64(vs[i][1])
    87  	}
    88  
    89  	_, _ = w.SetHeader(hdr)
    90  }
    91  
    92  // UnmarshalROOT implements rbytes.Unmarshaler
    93  func (o *Efficiency) UnmarshalROOT(r *rbytes.RBuffer) error {
    94  	if r.Err() != nil {
    95  		return r.Err()
    96  	}
    97  
    98  	hdr := r.ReadHeader(o.Class(), o.RVersion())
    99  
   100  	r.ReadObject(&o.named)
   101  	r.ReadObject(&o.attline)
   102  	r.ReadObject(&o.attfill)
   103  	r.ReadObject(&o.attmark)
   104  	o.betaAlpha = r.ReadF64()
   105  	o.betaBeta = r.ReadF64()
   106  	if err := readVecPairF64(r, &o.betaBinParams); err != nil {
   107  		return err
   108  	}
   109  	o.confLvl = r.ReadF64()
   110  	r.ReadObject(&o.funcs)
   111  	{
   112  		o.passedHist = nil
   113  		if oo := r.ReadObjectAny(); oo != nil { // obj-ptr
   114  			o.passedHist = oo.(H1)
   115  		}
   116  	}
   117  	o.statOpt = r.ReadI32()
   118  	{
   119  		o.totHist = nil
   120  		if oo := r.ReadObjectAny(); oo != nil { // obj-ptr
   121  			o.totHist = oo.(H1)
   122  		}
   123  	}
   124  	o.weight = r.ReadF64()
   125  
   126  	r.CheckHeader(hdr)
   127  	return r.Err()
   128  }
   129  
   130  func readVecPairF64(r *rbytes.RBuffer, vs *[][2]float64) error {
   131  	if r.Err() != nil {
   132  		return r.Err()
   133  	}
   134  
   135  	hdr := r.ReadHeader("vector<pair<double,double> >", rvers.StreamerBaseSTL)
   136  	if hdr.Vers > rvers.StreamerBaseSTL {
   137  		r.SetErr(fmt.Errorf(
   138  			"rbytes: invalid version for %q. got=%v, want=%v",
   139  			hdr.Name, hdr.Vers, rvers.StreamerBaseSTL,
   140  		))
   141  		return r.Err()
   142  	}
   143  	if hdr.MemberWise {
   144  		clvers := r.ReadI16()
   145  		switch {
   146  		case clvers == 1:
   147  			// TODO
   148  		case clvers <= 0:
   149  			/*chksum*/ _ = r.ReadU32()
   150  		}
   151  	}
   152  	n := int(r.ReadI32())
   153  	if n == 0 {
   154  		*vs = nil
   155  		r.CheckHeader(hdr)
   156  		return r.Err()
   157  	}
   158  
   159  	*vs = make([][2]float64, n)
   160  	switch {
   161  	case hdr.MemberWise:
   162  		p := make([]float64, n)
   163  		r.ReadArrayF64(p)
   164  		for i := range *vs {
   165  			(*vs)[i][0] = p[i]
   166  		}
   167  		r.ReadArrayF64(p)
   168  		for i := range *vs {
   169  			(*vs)[i][1] = p[i]
   170  		}
   171  	default:
   172  		for i := range *vs {
   173  			(*vs)[i][0] = r.ReadF64()
   174  			(*vs)[i][1] = r.ReadF64()
   175  		}
   176  	}
   177  
   178  	r.CheckHeader(hdr)
   179  	return r.Err()
   180  }
   181  
   182  func init() {
   183  	f := func() reflect.Value {
   184  		var o Efficiency
   185  		return reflect.ValueOf(&o)
   186  	}
   187  	rtypes.Factory.Add("TEfficiency", f)
   188  }
   189  
   190  var (
   191  	_ root.Object        = (*Efficiency)(nil)
   192  	_ rbytes.RVersioner  = (*Efficiency)(nil)
   193  	_ rbytes.Marshaler   = (*Efficiency)(nil)
   194  	_ rbytes.Unmarshaler = (*Efficiency)(nil)
   195  )