go-hep.org/x/hep@v0.38.1/fmom/ptetaphim.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 fmom 6 7 import ( 8 "fmt" 9 "math" 10 ) 11 12 type PtEtaPhiM struct { 13 P4 Vec4 14 } 15 16 func NewPtEtaPhiM(pt, eta, phi, m float64) PtEtaPhiM { 17 return PtEtaPhiM{P4: Vec4{X: pt, Y: eta, Z: phi, T: m}} 18 } 19 20 func (p4 PtEtaPhiM) String() string { 21 return fmt.Sprintf( 22 "fmom.P4{Pt:%v, Eta:%v, Phi:%v, M:%v}", 23 p4.Pt(), p4.Eta(), p4.Phi(), p4.M(), 24 ) 25 } 26 27 func (p4 *PtEtaPhiM) Clone() P4 { 28 pp := *p4 29 return &pp 30 } 31 32 func (p4 *PtEtaPhiM) Pt() float64 { 33 return p4.P4.X 34 } 35 36 func (p4 *PtEtaPhiM) Eta() float64 { 37 return p4.P4.Y 38 } 39 40 func (p4 *PtEtaPhiM) Phi() float64 { 41 return p4.P4.Z 42 } 43 44 func (p4 *PtEtaPhiM) M() float64 { 45 return p4.P4.T 46 } 47 48 func (p4 *PtEtaPhiM) E() float64 { 49 m := p4.M() 50 pt := p4.Pt() 51 pz := p4.Pz() 52 53 sign := +1.0 54 if pt < 0 { 55 sign = -1.0 56 } 57 return sign * math.Sqrt(pt*pt+pz*pz+m*m) 58 } 59 60 func (p4 *PtEtaPhiM) P() float64 { 61 pt := p4.Pt() 62 pz := p4.Pz() 63 64 sign := +1.0 65 if pt < 0 { 66 sign = -1.0 67 } 68 return sign * math.Sqrt(pt*pt+pz*pz) 69 } 70 71 func (p4 *PtEtaPhiM) P2() float64 { 72 pt := p4.Pt() 73 pz := p4.Pz() 74 75 return pt*pt + pz*pz 76 } 77 78 func (p4 *PtEtaPhiM) M2() float64 { 79 m := p4.M() 80 return m * m 81 } 82 83 func (p4 *PtEtaPhiM) CosPhi() float64 { 84 phi := p4.Phi() 85 return math.Cos(phi) 86 } 87 88 func (p4 *PtEtaPhiM) SinPhi() float64 { 89 phi := p4.Phi() 90 return math.Sin(phi) 91 } 92 93 func (p4 *PtEtaPhiM) CotTh() float64 { 94 eta := p4.Eta() 95 return math.Sinh(eta) 96 } 97 98 func (p4 *PtEtaPhiM) CosTh() float64 { 99 eta := p4.Eta() 100 return math.Tanh(eta) 101 } 102 103 func (p4 *PtEtaPhiM) SinTh() float64 { 104 eta := p4.Eta() 105 // avoid numeric overflow if very large eta 106 abseta := min(math.Abs(eta), 710) 107 return 1 / math.Cosh(abseta) 108 } 109 110 func (p4 *PtEtaPhiM) TanTh() float64 { 111 eta := p4.Eta() 112 abseta := math.Abs(eta) 113 // avoid numeric overflow if very large eta 114 if abseta > 710 { 115 if eta > 0 { 116 eta = +710 117 } else { 118 eta = -710 119 } 120 } 121 return 1 / math.Sinh(eta) 122 } 123 124 func (p4 *PtEtaPhiM) Et() float64 { 125 e := p4.E() 126 sinth := p4.SinTh() 127 return e * sinth 128 } 129 130 func (p4 *PtEtaPhiM) IPt() float64 { 131 pt := p4.Pt() 132 return 1 / pt 133 } 134 135 func (p4 *PtEtaPhiM) Rapidity() float64 { 136 e := p4.E() 137 pz := p4.Pz() 138 return 0.5 * math.Log((e+pz)/(e-pz)) 139 } 140 141 func (p4 *PtEtaPhiM) Px() float64 { 142 pt := p4.Pt() 143 cosphi := p4.CosPhi() 144 return pt * cosphi 145 } 146 147 func (p4 *PtEtaPhiM) Py() float64 { 148 pt := p4.Pt() 149 sinphi := p4.SinPhi() 150 return pt * sinphi 151 } 152 153 func (p4 *PtEtaPhiM) Pz() float64 { 154 pt := p4.Pt() 155 cotth := p4.CotTh() 156 return pt * cotth 157 } 158 159 func (p4 *PtEtaPhiM) Set(p P4) { 160 p4.P4.X = p.Pt() 161 p4.P4.Y = p.Eta() 162 p4.P4.Z = p.Phi() 163 p4.P4.T = p.M() 164 } 165 166 var ( 167 _ P4 = (*PtEtaPhiM)(nil) 168 _ fmt.Stringer = (*PtEtaPhiM)(nil) 169 )