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 )