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.
EvtVector4C.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 EVTVECTOR4C_HH
22 #define EVTVECTOR4C_HH
23 
24 #include "EvtGenBase/EvtComplex.hh"
27 
28 #include <iosfwd>
29 
30 class EvtVector4C final {
31  inline friend EvtVector4C operator*( double d, const EvtVector4C& v2 );
32  inline friend EvtVector4C operator*( const EvtComplex& c,
33  const EvtVector4C& v2 );
34  inline friend EvtVector4C operator*( const EvtVector4C& v2,
35  const EvtComplex& c );
36  inline friend EvtVector4C operator*( const EvtComplex& c,
37  const EvtVector4R& v2 );
38  inline friend EvtComplex operator*( const EvtVector4R& v1,
39  const EvtVector4C& v2 );
40  inline friend EvtComplex operator*( const EvtVector4C& v1,
41  const EvtVector4R& v2 );
42  inline friend EvtComplex operator*( const EvtVector4C& v1,
43  const EvtVector4C& v2 );
44  friend EvtVector4C operator+( const EvtVector4C& v1, const EvtVector4C& v2 );
45  friend EvtVector4C operator-( const EvtVector4C& v1, const EvtVector4C& v2 );
46 
47  public:
48  EvtVector4C();
49  EvtVector4C( const EvtComplex&, const EvtComplex&, const EvtComplex&,
50  const EvtComplex& );
51  inline void set( int, const EvtComplex& );
52  inline void set( const EvtComplex&, const EvtComplex&, const EvtComplex&,
53  const EvtComplex& );
54  inline void set( double, double, double, double );
55  inline EvtVector4C( const EvtVector4R& v1 );
56  inline const EvtComplex& get( int ) const;
57  inline EvtComplex cont( const EvtVector4C& v4 ) const;
58  inline EvtVector4C conj() const;
59  EvtVector3C vec() const;
60  inline EvtVector4C& operator-=( const EvtVector4C& v2 );
61  inline EvtVector4C& operator+=( const EvtVector4C& v2 );
62  inline EvtVector4C& operator*=( const EvtComplex& c );
63  void applyRotateEuler( double alpha, double beta, double gamma );
64  void applyBoostTo( const EvtVector4R& p4 );
65  void applyBoostTo( const EvtVector3R& boost );
66  friend std::ostream& operator<<( std::ostream& s, const EvtVector4C& v );
67  double dot( const EvtVector4C& p2 );
68 
69  private:
71 };
72 
73 EvtVector4C rotateEuler( const EvtVector4C& e, double alpha, double beta,
74  double gamma );
75 EvtVector4C boostTo( const EvtVector4C& e, const EvtVector4R p4 );
76 EvtVector4C boostTo( const EvtVector4C& e, const EvtVector3R boost );
77 
79 {
80  v[0] += v2.v[0];
81  v[1] += v2.v[1];
82  v[2] += v2.v[2];
83  v[3] += v2.v[3];
84 
85  return *this;
86 }
87 
89 {
90  v[0] -= v2.v[0];
91  v[1] -= v2.v[1];
92  v[2] -= v2.v[2];
93  v[3] -= v2.v[3];
94 
95  return *this;
96 }
97 
98 inline void EvtVector4C::set( int i, const EvtComplex& c )
99 {
100  v[i] = c;
101 }
102 
104 {
105  return EvtVector3C( v[1], v[2], v[3] );
106 }
107 
108 inline void EvtVector4C::set( const EvtComplex& e, const EvtComplex& p1,
109  const EvtComplex& p2, const EvtComplex& p3 )
110 {
111  v[0] = e;
112  v[1] = p1;
113  v[2] = p2;
114  v[3] = p3;
115 }
116 
117 inline void EvtVector4C::set( double e, double p1, double p2, double p3 )
118 {
119  v[0] = EvtComplex( e );
120  v[1] = EvtComplex( p1 );
121  v[2] = EvtComplex( p2 );
122  v[3] = EvtComplex( p3 );
123 }
124 
125 inline const EvtComplex& EvtVector4C::get( int i ) const
126 {
127  return v[i];
128 }
129 
130 inline EvtVector4C operator+( const EvtVector4C& v1, const EvtVector4C& v2 )
131 {
132  return EvtVector4C( v1 ) += v2;
133 }
134 
135 inline EvtVector4C operator-( const EvtVector4C& v1, const EvtVector4C& v2 )
136 {
137  return EvtVector4C( v1 ) -= v2;
138 }
139 
140 inline EvtComplex EvtVector4C::cont( const EvtVector4C& v4 ) const
141 {
142  return v[0] * v4.v[0] - v[1] * v4.v[1] - v[2] * v4.v[2] - v[3] * v4.v[3];
143 }
144 
146 {
147  v[0] *= c;
148  v[1] *= c;
149  v[2] *= c;
150  v[3] *= c;
151 
152  return *this;
153 }
154 
155 inline EvtVector4C operator*( double d, const EvtVector4C& v2 )
156 {
157  return EvtVector4C( v2.v[0] * d, v2.v[1] * d, v2.v[2] * d, v2.v[3] * d );
158 }
159 
160 inline EvtVector4C operator*( const EvtComplex& c, const EvtVector4C& v2 )
161 {
162  return EvtVector4C( v2 ) *= c;
163 }
164 
165 inline EvtVector4C operator*( const EvtVector4C& v2, const EvtComplex& c )
166 {
167  return EvtVector4C( v2 ) *= c;
168 }
169 
170 inline EvtVector4C operator*( const EvtComplex& c, const EvtVector4R& v2 )
171 {
172  return EvtVector4C( c * v2.get( 0 ), c * v2.get( 1 ), c * v2.get( 2 ),
173  c * v2.get( 3 ) );
174 }
175 
177 {
178  v[0] = EvtComplex( v1.get( 0 ) );
179  v[1] = EvtComplex( v1.get( 1 ) );
180  v[2] = EvtComplex( v1.get( 2 ) );
181  v[3] = EvtComplex( v1.get( 3 ) );
182 }
183 
184 inline EvtComplex operator*( const EvtVector4R& v1, const EvtVector4C& v2 )
185 {
186  return v1.get( 0 ) * v2.v[0] - v1.get( 1 ) * v2.v[1] -
187  v1.get( 2 ) * v2.v[2] - v1.get( 3 ) * v2.v[3];
188 }
189 
190 inline EvtComplex operator*( const EvtVector4C& v1, const EvtVector4R& v2 )
191 {
192  return v1.v[0] * v2.get( 0 ) - v1.v[1] * v2.get( 1 ) -
193  v1.v[2] * v2.get( 2 ) - v1.v[3] * v2.get( 3 );
194 }
195 
196 inline EvtComplex operator*( const EvtVector4C& v1, const EvtVector4C& v2 )
197 {
198  return v1.v[0] * v2.v[0] - v1.v[1] * v2.v[1] - v1.v[2] * v2.v[2] -
199  v1.v[3] * v2.v[3];
200 }
201 
203 {
204  return EvtVector4C( ::conj( v[0] ), ::conj( v[1] ), ::conj( v[2] ),
205  ::conj( v[3] ) );
206 }
207 
208 #endif
EvtVector4C operator+(const EvtVector4C &v1, const EvtVector4C &v2)
Definition: EvtVector4C.hh:130
EvtVector4C & operator+=(const EvtVector4C &v2)
Definition: EvtVector4C.hh:78
EvtVector4C operator *(double d, const EvtVector4C &v2)
Definition: EvtVector4C.hh:155
void applyRotateEuler(double alpha, double beta, double gamma)
void set(int, const EvtComplex &)
Definition: EvtVector4C.hh:98
friend EvtVector4C operator+(const EvtVector4C &v1, const EvtVector4C &v2)
Definition: EvtVector4C.hh:130
EvtVector4C rotateEuler(const EvtVector4C &e, double alpha, double beta, double gamma)
Definition: EvtVector4C.cpp:48
EvtVector3C vec() const
Definition: EvtVector4C.hh:103
EvtComplex v[4]
Definition: EvtVector4C.hh:70
friend EvtVector4C operator-(const EvtVector4C &v1, const EvtVector4C &v2)
Definition: EvtVector4C.hh:135
double get(int i) const
Definition: EvtVector4R.hh:162
EvtVector4C & operator-=(const EvtVector4C &v2)
Definition: EvtVector4C.hh:88
EvtVector4C & operator *=(const EvtComplex &c)
Definition: EvtVector4C.hh:145
EvtVector4C boostTo(const EvtVector4C &e, const EvtVector4R p4)
Definition: EvtVector4C.cpp:56
const EvtComplex & get(int) const
Definition: EvtVector4C.hh:125
EvtVector4C conj() const
Definition: EvtVector4C.hh:202
double dot(const EvtVector4C &p2)
EvtComplex cont(const EvtVector4C &v4) const
Definition: EvtVector4C.hh:140
friend EvtVector4C operator *(double d, const EvtVector4C &v2)
Definition: EvtVector4C.hh:155
friend std::ostream & operator<<(std::ostream &s, const EvtVector4C &v)
EvtVector4C operator-(const EvtVector4C &v1, const EvtVector4C &v2)
Definition: EvtVector4C.hh:135
void applyBoostTo(const EvtVector4R &p4)
Definition: EvtVector4C.cpp:70