go-hep.org/x/hep@v0.38.1/groot/rphys/lorentzvector.go (about) 1 // Copyright ©2020 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 rphys 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/root" 14 "go-hep.org/x/hep/groot/rtypes" 15 "go-hep.org/x/hep/groot/rvers" 16 ) 17 18 type LorentzVector struct { 19 obj rbase.Object 20 p Vector3 // 3-vector component 21 e float64 // time or energy 22 } 23 24 func NewLorentzVector(px, py, pz, e float64) *LorentzVector { 25 return &LorentzVector{ 26 obj: *rbase.NewObject(), 27 p: *NewVector3(px, py, pz), 28 e: e, 29 } 30 } 31 32 func (*LorentzVector) RVersion() int16 { 33 return rvers.LorentzVector 34 } 35 36 func (*LorentzVector) Class() string { 37 return "TLorentzVector" 38 } 39 40 func (vec *LorentzVector) Px() float64 { return vec.p.x } 41 func (vec *LorentzVector) Py() float64 { return vec.p.y } 42 func (vec *LorentzVector) Pz() float64 { return vec.p.z } 43 func (vec *LorentzVector) E() float64 { return vec.e } 44 45 func (vec *LorentzVector) SetPxPyPzE(px, py, pz, e float64) { 46 vec.p.x = px 47 vec.p.y = py 48 vec.p.z = pz 49 vec.e = e 50 } 51 52 func (vec *LorentzVector) MarshalROOT(w *rbytes.WBuffer) (int, error) { 53 if w.Err() != nil { 54 return 0, w.Err() 55 } 56 57 hdr := w.WriteHeader(vec.Class(), vec.RVersion()) 58 w.WriteObject(&vec.obj) 59 w.WriteObject(&vec.p) 60 w.WriteF64(vec.e) 61 62 return w.SetHeader(hdr) 63 } 64 65 func (vec *LorentzVector) UnmarshalROOT(r *rbytes.RBuffer) error { 66 if r.Err() != nil { 67 return r.Err() 68 } 69 70 hdr := r.ReadHeader(vec.Class(), vec.RVersion()) 71 72 r.ReadObject(&vec.obj) 73 r.ReadObject(&vec.p) 74 vec.e = r.ReadF64() 75 76 r.CheckHeader(hdr) 77 return r.Err() 78 } 79 80 func (vec *LorentzVector) String() string { 81 return fmt.Sprintf( 82 "TLorentzVector{P: {%v, %v, %v}, E: %v}", 83 vec.p.x, vec.p.y, vec.p.z, 84 vec.e, 85 ) 86 } 87 88 func init() { 89 { 90 f := func() reflect.Value { 91 o := &LorentzVector{} 92 return reflect.ValueOf(o) 93 } 94 rtypes.Factory.Add("TLorentzVector", f) 95 } 96 } 97 98 var ( 99 _ root.Object = (*LorentzVector)(nil) 100 _ rbytes.Marshaler = (*LorentzVector)(nil) 101 _ rbytes.Unmarshaler = (*LorentzVector)(nil) 102 )