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  )