evtgen is hosted by Hepforge, IPPP Durham
EvtGen  2.0.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
EvtVector4R.hh
Go to the documentation of this file.
1 
2 /***********************************************************************
3 * Copyright 1998-2020 CERN for the benefit of the EvtGen authors *
4 * *
5 * This file is part of EvtGen. *
6 * *
7 * EvtGen is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * EvtGen is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
19 ***********************************************************************/
20 
21 #ifndef EVTVECTOR4R_HH
22 #define EVTVECTOR4R_HH
23 
24 #include <iostream>
25 #include <math.h>
26 
27 class EvtVector3R;
28 
29 class EvtVector4R {
30  inline friend EvtVector4R operator*( double d, const EvtVector4R& v2 );
31  inline friend EvtVector4R operator*( const EvtVector4R& v2, double d );
32  inline friend EvtVector4R operator/( const EvtVector4R& v2, double d );
33  inline friend double operator*( const EvtVector4R& v1, const EvtVector4R& v2 );
34  inline friend EvtVector4R operator+( const EvtVector4R& v1,
35  const EvtVector4R& v2 );
36  inline friend EvtVector4R operator-( const EvtVector4R& v1,
37  const EvtVector4R& v2 );
38 
39  public:
40  EvtVector4R();
41  EvtVector4R( double e, double px, double py, double pz );
42  inline void set( int i, double d );
43  inline void set( double e, double px, double py, double pz );
44  inline EvtVector4R& operator*=( double c );
45  inline EvtVector4R& operator/=( double c );
46  inline EvtVector4R& operator+=( const EvtVector4R& v2 );
47  inline EvtVector4R& operator-=( const EvtVector4R& v2 );
48  inline double get( int i ) const;
49  inline double cont( const EvtVector4R& v4 ) const;
50  friend std::ostream& operator<<( std::ostream& s, const EvtVector4R& v );
51  double mass2() const;
52  double mass() const;
53  void applyRotateEuler( double alpha, double beta, double gamma );
54  void applyBoostTo( const EvtVector4R& p4, bool inverse = false );
55  void applyBoostTo( const EvtVector3R& boost, bool inverse = false );
56  EvtVector4R cross( const EvtVector4R& v2 );
57  double dot( const EvtVector4R& v2 ) const;
58  double d3mag() const;
59 
60  // Added by AJB - calculate scalars in the rest frame of the current object
61  double scalartripler3( const EvtVector4R& p1, const EvtVector4R& p2,
62  const EvtVector4R& p3 ) const;
63  double dotr3( const EvtVector4R& p1, const EvtVector4R& p2 ) const;
64  double mag2r3( const EvtVector4R& p1 ) const;
65  double magr3( const EvtVector4R& p1 ) const;
66 
67  private:
68  double v[4];
69 
70  inline double Square( double x ) const { return x * x; }
71 };
72 
73 EvtVector4R rotateEuler( const EvtVector4R& rs, double alpha, double beta,
74  double gamma );
75 EvtVector4R boostTo( const EvtVector4R& rs, const EvtVector4R& p4,
76  bool inverse = false );
77 EvtVector4R boostTo( const EvtVector4R& rs, const EvtVector3R& boost,
78  bool inverse = false );
79 
81 {
82  v[0] += v2.v[0];
83  v[1] += v2.v[1];
84  v[2] += v2.v[2];
85  v[3] += v2.v[3];
86 
87  return *this;
88 }
89 
91 {
92  v[0] -= v2.v[0];
93  v[1] -= v2.v[1];
94  v[2] -= v2.v[2];
95  v[3] -= v2.v[3];
96 
97  return *this;
98 }
99 
100 inline double EvtVector4R::mass2() const
101 {
102  return v[0] * v[0] - v[1] * v[1] - v[2] * v[2] - v[3] * v[3];
103 }
104 
105 inline EvtVector4R operator*( double c, const EvtVector4R& v2 )
106 {
107  return EvtVector4R( v2 ) *= c;
108 }
109 
110 inline EvtVector4R operator*( const EvtVector4R& v2, double c )
111 {
112  return EvtVector4R( v2 ) *= c;
113 }
114 
115 inline EvtVector4R operator/( const EvtVector4R& v2, double c )
116 {
117  return EvtVector4R( v2 ) /= c;
118 }
119 
121 {
122  v[0] *= c;
123  v[1] *= c;
124  v[2] *= c;
125  v[3] *= c;
126 
127  return *this;
128 }
129 
131 {
132  double cinv = 1.0 / c;
133  v[0] *= cinv;
134  v[1] *= cinv;
135  v[2] *= cinv;
136  v[3] *= cinv;
137 
138  return *this;
139 }
140 
141 inline double operator*( const EvtVector4R& v1, const EvtVector4R& v2 )
142 {
143  return v1.v[0] * v2.v[0] - v1.v[1] * v2.v[1] - v1.v[2] * v2.v[2] -
144  v1.v[3] * v2.v[3];
145 }
146 
147 inline double EvtVector4R::cont( const EvtVector4R& v4 ) const
148 {
149  return v[0] * v4.v[0] - v[1] * v4.v[1] - v[2] * v4.v[2] - v[3] * v4.v[3];
150 }
151 
152 inline EvtVector4R operator-( const EvtVector4R& v1, const EvtVector4R& v2 )
153 {
154  return EvtVector4R( v1 ) -= v2;
155 }
156 
157 inline EvtVector4R operator+( const EvtVector4R& v1, const EvtVector4R& v2 )
158 {
159  return EvtVector4R( v1 ) += v2;
160 }
161 
162 inline double EvtVector4R::get( int i ) const
163 {
164  return v[i];
165 }
166 
167 inline void EvtVector4R::set( int i, double d )
168 {
169  v[i] = d;
170 }
171 
172 inline void EvtVector4R::set( double e, double p1, double p2, double p3 )
173 {
174  v[0] = e;
175  v[1] = p1;
176  v[2] = p2;
177  v[3] = p3;
178 }
179 
180 #endif
void applyRotateEuler(double alpha, double beta, double gamma)
Definition: EvtVector4R.cpp:83
EvtVector4R operator+(const EvtVector4R &v1, const EvtVector4R &v2)
Definition: EvtVector4R.hh:157
double dotr3(const EvtVector4R &p1, const EvtVector4R &p2) const
friend std::ostream & operator<<(std::ostream &s, const EvtVector4R &v)
double magr3(const EvtVector4R &p1) const
double v[4]
Definition: EvtVector4R.hh:68
EvtVector4R operator/(const EvtVector4R &v2, double c)
Definition: EvtVector4R.hh:115
double Square(double x) const
Definition: EvtVector4R.hh:70
double cont(const EvtVector4R &v4) const
Definition: EvtVector4R.hh:147
EvtVector4R cross(const EvtVector4R &v2)
double mass() const
Definition: EvtVector4R.cpp:49
friend EvtVector4R operator+(const EvtVector4R &v1, const EvtVector4R &v2)
Definition: EvtVector4R.hh:157
EvtVector4R boostTo(const EvtVector4R &rs, const EvtVector4R &p4, bool inverse=false)
Definition: EvtVector4R.cpp:68
void set(int i, double d)
Definition: EvtVector4R.hh:167
double mag2r3(const EvtVector4R &p1) const
double mass2() const
Definition: EvtVector4R.hh:100
EvtVector4R rotateEuler(const EvtVector4R &rs, double alpha, double beta, double gamma)
Definition: EvtVector4R.cpp:60
double get(int i) const
Definition: EvtVector4R.hh:162
EvtVector4R & operator *=(double c)
Definition: EvtVector4R.hh:120
EvtVector4R & operator-=(const EvtVector4R &v2)
Definition: EvtVector4R.hh:90
void applyBoostTo(const EvtVector4R &p4, bool inverse=false)
double d3mag() const
EvtVector4R operator *(double c, const EvtVector4R &v2)
Definition: EvtVector4R.hh:105
EvtVector4R operator-(const EvtVector4R &v1, const EvtVector4R &v2)
Definition: EvtVector4R.hh:152
friend EvtVector4R operator/(const EvtVector4R &v2, double d)
Definition: EvtVector4R.hh:115
double scalartripler3(const EvtVector4R &p1, const EvtVector4R &p2, const EvtVector4R &p3) const
friend EvtVector4R operator *(double d, const EvtVector4R &v2)
Definition: EvtVector4R.hh:105
EvtVector4R & operator/=(double c)
Definition: EvtVector4R.hh:130
friend EvtVector4R operator-(const EvtVector4R &v1, const EvtVector4R &v2)
Definition: EvtVector4R.hh:152
EvtVector4R & operator+=(const EvtVector4R &v2)
Definition: EvtVector4R.hh:80
double dot(const EvtVector4R &v2) const