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