HIPO4 C++ Library 4.4.1
Columnar I/O library for CLAS12 physics data
Loading...
Searching...
No Matches
fizika.h
Go to the documentation of this file.
1/*****************************************************************************************
2* ██╗ ██╗███████╗ ██████╗████████╗ ██████╗ ██████╗
3* ██║ ██║██╔════╝██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗
4* ██║ ██║█████╗ ██║ ██║ ██║ ██║██████╔╝
5* ╚██╗ ██╔╝██╔══╝ ██║ ██║ ██║ ██║██╔══██╗
6* ╚████╔╝ ███████╗╚██████╗ ██║ ╚██████╔╝██║ ██║
7* ╚═══╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝
8*
9* ██╗ ██╗██████╗ ██████╗ █████╗ ██████╗ ██╗ ██╗
10* ██║ ██║██╔══██╗██╔══██╗██╔══██╗██╔══██╗╚██╗ ██╔╝
11* ██║ ██║██████╔╝██████╔╝███████║██████╔╝ ╚████╔╝
12* ██║ ██║██╔══██╗██╔══██╗██╔══██║██╔══██╗ ╚██╔╝
13* ███████╗██║██████╔╝██║ ██║██║ ██║██║ ██║ ██║
14* ╚══════╝╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝
15* DESCRIPTION: VECTOR LIBRARY for physics calcuations, includes a 3d vector class and
16* a Lorentz vector class. The library comes as an include file only.
17* thre is no need to compile, just include this file into your code.
18* Author: G.Gavalian
19* Date : Wed Nov 18 22:43:50 EST 2009
20*********************************************************************************************/
21
22#ifndef __VECTOR_LIB__
23#define __VECTOR_LIB__
24
25
26#include <iostream>
27#include <string>
28#include <vector>
29#include <fstream>
30#include <iomanip>
31#include <cmath>
32
33namespace fizika {
34
35class vector3 {
36private:
37 double cX;
38 double cY;
39 double cZ;
40public:
41
43vector3 (double x, double y, double z){setXYZ(x,y,z);}
44
46
47 void setXYZ(double x, double y, double z){cX=x;cY=y;cZ=z;}
48void setMagThetaPhi(double mag, double theta, double phi)
49{
50 double amag = fabs(mag); cX = amag * sin(theta) * cos(phi);
51 cY = amag * sin(theta) * sin(phi);cZ = amag * cos(theta);
52}
53
54
55double theta() const
56{ return cX == 0.0 && cY == 0.0 && cZ == 0.0 ? 0.0 : atan2(perp(),cZ);}
57
58double phi() const
59{ return cX == 0.0 && cY == 0.0 ? 0.0 : atan2(cY,cX);}
60
61double perp() const
62{ return sqrt(cX*cX + cY*cY);}
63
64double perp2() const
65{ return (cX*cX + cY*cY);}
66
67double mag2() const
68{return (cX*cX + cY*cY + cZ*cZ);}
69
70double mag() const
71{ return sqrt(mag2());}
72
73 double x() const { return cX;};
74 double y() const { return cY;};
75 double z() const { return cZ;};
76
77 void setX(double _x){cX=_x;};
78 void setY(double _y){cY=_y;};
79 void setZ(double _z){cZ=_z;};
80
81 double angle(const vector3 &q){
82 double ptot2 = mag2()*q.mag2();
83 if(ptot2 <= 0) {
84 return 0.0;
85 } else {
86 double arg = dot(q)/sqrt(ptot2);
87 if(arg > 1.0) arg = 1.0;
88 if(arg < -1.0) arg = -1.0;
89 return acos(arg);
90 }
91 }
92void rotateX(double angle)
93{
94 double s = sin(angle); double c = cos(angle); double yy = cY;
95 cY = c*yy - s*cZ; cZ = s*yy + c*cZ;
96}
97 //------------------------------------------------------
98void rotateY(double angle)
99{
100 double s = sin(angle); double c = cos(angle); double zz = cZ;
101 cZ = c*zz - s*cX; cX = s*zz + c*cX;
102}
103//------------------------------------------------------
104void rotateZ(double angle)
105{
106 double s = sin(angle); double c = cos(angle); double xx = cX;
107 cX = c*xx - s*cY; cY = s*xx + c*cY;
108}
109
110vector3 unit() const;
111
112vector3 cross(const vector3 &vec) const
113{
114 return vector3(cY*vec.z()-vec.y()*cZ, cZ*vec.x()-vec.z()*cX,
115 cX*vec.y()-vec.x()*cY);
116}
117double dot(const vector3 &vec) const
118{ return (cX*vec.x() + cY*vec.y() + cZ*vec.z());}
119
120
121 void print(const char *_line = "V3 ")
122 {printf("%s : %9.5f %9.5f %9.5f (Mag = %9.5f )\n",
123 _line,x(),y(),z(),mag());};
124
125 const vector3 &operator=(const vector3 &vec){
126 this->setXYZ(vec.x(),vec.y(),vec.z());
127 return *this;
128 }
129 inline vector3 &operator += (const vector3 &);
130 inline vector3 &operator -= (const vector3 &);
131
132};
133
134
135vector3 operator+(const vector3 &a, const vector3 &b)
136{ return vector3(a.x() + b.x(),a.y() + b.y(),a.z() + b.z());}
137
138vector3 operator-(const vector3 &a, const vector3 &b)
139{ return vector3(a.x() - b.x(), a.y() - b.y(), a.z() - b.z());}
140
141vector3 operator*(double a, const vector3 &b)
142{ return vector3(a*b.x(),a*b.y(),a*b.z());}
143
144vector3 operator*(const vector3 &b,double a)
145{return vector3(a*b.x(),a*b.y(),a*b.z());}
146
147//-----------------------------------------------------------
149{ cX += p.cX; cY += p.cY; cZ += p.cZ; return *this; }
150
152{ cX -= p.cX; cY -= p.cY; cZ -= p.cZ; return *this; }
153
154
155/*=================================================================================
156 * lorentz4 CLASS
157 ==================================================================================*/
158
159class lorentz4 {
160private:
161
162 vector3 fVect;
163 double fE;
164
165public:
166
168lorentz4 (double _px, double _py, double _pz, double _e)
169{ fVect.setXYZ(_px,_py,_pz);fE = _e;}
170 lorentz4 (vector3 v, double energy) { fVect = v; fE = energy;};
172
173double px() const {return fVect.x();};
174 double py() const {return fVect.y();};
175 double pz() const {return fVect.z();};
176 double x() const {return fVect.x();};
177 double y() const {return fVect.y();};
178 double z() const {return fVect.z();};
179 double theta() const {return fVect.theta();};
180 double phi() const {return fVect.phi();};
181
182 double m2() const {return (fE*fE-fVect.mag2());};
183 double p() const {return vect().mag();};
184 //{ if(M2()>0) return sqrt(M2()); else return sqrt(-M2());};
185 double e() const {return fE;};
186 double t() const {return fE;};
187 vector3 vect() const {return fVect;};
188
189
190 void setX(double _p){fVect.setX(_p);};
191 void setY(double _p){fVect.setY(_p);};
192 void setZ(double _p){fVect.setZ(_p);};
193 void setT(double _eg){fE=_eg;};
194
195 void setXYZM(double _x, double _y, double _z, double _m)
196{ if(_m>0)
197 setXYZE(_x,_y,_z,sqrt(_x*_x+_y*_y+_z*_z+_m*_m));
198 else
199 setXYZE(_x,_y,_z,sqrt(_x*_x+_y*_y+_z*_z));
200}
201
202void setXYZE(double _x, double _y, double _z, double _e)
203{
204 fVect.setXYZ(_x,_y,_z);
205 fE = _e;
206}
207
208void setVectM(vector3 &_v, double _mass)
209{
210 setXYZM(_v.x(),_v.y(),_v.z(),_mass);
211}
212
213void rotateX(double angle)
214 { fVect.rotateX(angle);};
215 void rotateY(double angle)
216 { fVect.rotateY(angle);};
217 void rotateZ(double angle)
218 { fVect.rotateZ(angle);};
219
220double m() const
221{
222 double mm = m2();
223 return mm < 0.0 ? -sqrt(-mm) : sqrt(mm);
224}
225
227{
228 // if(T()==0)
229 return vector3(px()/t(),py()/t(),pz()/t());
230}
232{
233 boost(vb.x(),vb.y(),vb.z());
234}
235
236void boost(double bx, double by, double bz)
237{
238 double b2 = bx*bx + by*by + bz*bz;
239 //register
240 double gamma = 1.0 / sqrt(1.0 - b2);
241 //register
242 double bp = bx*x() + by*y() + bz*z();
243 //register
244 double gamma2 = b2 > 0 ? (gamma - 1.0)/b2 : 0.0;
245
246 setX(x() + gamma2*bp*bx + gamma*bx*t());
247 setY(y() + gamma2*bp*by + gamma*by*t());
248 setZ(z() + gamma2*bp*bz + gamma*bz*t());
249 setT(gamma*(t() + bp));
250}
251
252 void print(const char *_line = "LV ")
253 {printf("%s : %9.5f %9.5f %9.5f (Mag = %9.5f , M = %9.5f)\n",
254 _line,vect().x(),vect().y(),vect().z(),vect().mag(),m());};
255
256 inline lorentz4 & operator = (const lorentz4 &);
257 inline lorentz4 operator + (const lorentz4 &) const;
258 inline lorentz4 operator - (const lorentz4 &) const;
259 inline lorentz4 & operator += (const lorentz4 &);
260 inline lorentz4 & operator -= (const lorentz4 &);
261};
262
264{
265 fVect = q.vect();
266 fE = q.t();
267 return *this;
268}
269inline lorentz4 lorentz4::operator + (const lorentz4 & q) const {
270 return lorentz4(fVect+q.vect(), fE+q.t());
271}
272inline lorentz4 &lorentz4::operator += (const lorentz4 & q) { fVect += q.vect(); fE += q.t(); return *this;
273}
274inline lorentz4 lorentz4::operator - (const lorentz4 & q) const {
275return lorentz4(fVect-q.vect(), fE-q.t());
276}
278 fVect -= q.vect(); fE -= q.t(); return *this;
279}
280
281}
282#endif
Definition fizika.h:159
lorentz4(double _px, double _py, double _pz, double _e)
Definition fizika.h:168
void boost(double bx, double by, double bz)
Definition fizika.h:236
void setY(double _p)
Definition fizika.h:191
void rotateY(double angle)
Definition fizika.h:215
lorentz4()
Definition fizika.h:167
void setZ(double _p)
Definition fizika.h:192
lorentz4 & operator+=(const lorentz4 &)
Definition fizika.h:272
double y() const
Definition fizika.h:177
double py() const
Definition fizika.h:174
double p() const
Definition fizika.h:183
lorentz4(vector3 v, double energy)
Definition fizika.h:170
void rotateX(double angle)
Definition fizika.h:213
vector3 boostVector()
Definition fizika.h:226
double m() const
Definition fizika.h:220
double x() const
Definition fizika.h:176
void setX(double _p)
Definition fizika.h:190
double e() const
Definition fizika.h:185
void setXYZE(double _x, double _y, double _z, double _e)
Definition fizika.h:202
double t() const
Definition fizika.h:186
double phi() const
Definition fizika.h:180
double m2() const
Definition fizika.h:182
void rotateZ(double angle)
Definition fizika.h:217
void setXYZM(double _x, double _y, double _z, double _m)
Definition fizika.h:195
double pz() const
Definition fizika.h:175
void boost(vector3 vb)
Definition fizika.h:231
void setT(double _eg)
Definition fizika.h:193
void setVectM(vector3 &_v, double _mass)
Definition fizika.h:208
lorentz4 & operator=(const lorentz4 &)
Definition fizika.h:263
lorentz4 & operator-=(const lorentz4 &)
Definition fizika.h:277
void print(const char *_line="LV ")
Definition fizika.h:252
double z() const
Definition fizika.h:178
vector3 vect() const
Definition fizika.h:187
~lorentz4()
Definition fizika.h:171
double theta() const
Definition fizika.h:179
lorentz4 operator-(const lorentz4 &) const
Definition fizika.h:274
lorentz4 operator+(const lorentz4 &) const
Definition fizika.h:269
double px() const
Definition fizika.h:173
Definition fizika.h:35
vector3 & operator+=(const vector3 &)
Definition fizika.h:148
double mag2() const
Definition fizika.h:67
void rotateZ(double angle)
Definition fizika.h:104
void setXYZ(double x, double y, double z)
Definition fizika.h:47
double theta() const
Definition fizika.h:55
double perp2() const
Definition fizika.h:64
double z() const
Definition fizika.h:75
vector3 & operator-=(const vector3 &)
Definition fizika.h:151
double x() const
Definition fizika.h:73
void setZ(double _z)
Definition fizika.h:79
double mag() const
Definition fizika.h:70
void print(const char *_line="V3 ")
Definition fizika.h:121
~vector3()
Definition fizika.h:45
vector3 cross(const vector3 &vec) const
Definition fizika.h:112
const vector3 & operator=(const vector3 &vec)
Definition fizika.h:125
void setX(double _x)
Definition fizika.h:77
void setMagThetaPhi(double mag, double theta, double phi)
Definition fizika.h:48
double y() const
Definition fizika.h:74
double phi() const
Definition fizika.h:58
double perp() const
Definition fizika.h:61
vector3(double x, double y, double z)
Definition fizika.h:43
double dot(const vector3 &vec) const
Definition fizika.h:117
double angle(const vector3 &q)
Definition fizika.h:81
void rotateY(double angle)
Definition fizika.h:98
void setY(double _y)
Definition fizika.h:78
vector3 unit() const
vector3()
Definition fizika.h:42
void rotateX(double angle)
Definition fizika.h:92
Definition fizika.h:33
vector3 operator*(double a, const vector3 &b)
Definition fizika.h:141
vector3 operator+(const vector3 &a, const vector3 &b)
Definition fizika.h:135
vector3 operator-(const vector3 &a, const vector3 &b)
Definition fizika.h:138