]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PYTHIA8/pythia8170/htmldoc/FourVectors.html
Protection for dereferencing fTDCErrorBuffer. see ALIROOT-5749
[u/mrichter/AliRoot.git] / PYTHIA8 / pythia8170 / htmldoc / FourVectors.html
CommitLineData
63ba5337 1<html>
2<head>
3<title>Four-Vectors</title>
4<link rel="stylesheet" type="text/css" href="pythia.css"/>
5<link rel="shortcut icon" href="pythia32.gif"/>
6</head>
7<body>
8
9<h2>Four-Vectors</h2>
10
11The <code>Vec4</code> class gives a simple implementation of four-vectors.
12The member function names are based on the assumption that these
13represent four-momentum vectors. Thus one can get or set
14<i>p_x, p_y, p_z</i> and <i>e</i>, but not <i>x, y, z</i>
15or <i>t</i>. This is only a matter of naming, however; a
16<code>Vec4</code> can equally well be used to store a space-time
17four-vector.
18
19<p/>
20The <code>Particle</code> object contains a <code>Vec4 p</code> that
21stores the particle four-momentum, and another <code>Vec4 vProd</code>
22for the production vertex. For the latter the input/output method
23names are adapted to the space-time character rather than the normal
24energy-momentum one. Thus a user would not normally access the
25<code>Vec4</code> classes directly, but only via the methods of the
26<code>Particle</code> class,
27see <a href="ParticleProperties.html" target="page">Particle Properties</a>.
28
29<p/>
30Nevertheless you are free to use the PYTHIA four-vectors, e.g. as
31part of some simple analysis code based directly on the PYTHIA output,
32say to define the four-vector sum of a set of particles. But note that
33this class was never set up to allow complete generality, only to
34provide the operations that are of use inside PYTHIA. There is no
35separate class for three-vectors, since such can easily be represented
36by four-vectors where the fourth component is not used.
37
38<p/>
39Four-vectors have the expected functionality: they can be created,
40copied, added, multiplied, rotated, boosted, and manipulated in other
41ways. Operator overloading is implemented where reasonable. Properties
42can be read out, not only the components themselves but also for derived
43quantities such as absolute momentum and direction angles.
44
45<h3>Constructors and basic operators</h3>
46
47A few methods are available to create or copy a four-vector:
48
49<a name="method1"></a>
50<p/><strong>Vec4::Vec4() &nbsp;</strong> <br/>
51creates a four-vector with all components set to 0.
52
53
54<a name="method2"></a>
55<p/><strong>Vec4::Vec4(const Vec4& v) &nbsp;</strong> <br/>
56creates a four-vector copy of the input four-vector.
57
58
59<a name="method3"></a>
60<p/><strong>Vec4& Vec4::operator=(const Vec4& v) &nbsp;</strong> <br/>
61copies the input four-vector.
62
63
64<a name="method4"></a>
65<p/><strong>Vec4& Vec4::operator=(double value) &nbsp;</strong> <br/>
66gives a four-vector with all components set to <i>value</i>.
67
68
69<h3>Member methods for input</h3>
70
71The values stored in a four-vector can be modified in a few different
72ways:
73
74<a name="method5"></a>
75<p/><strong>void Vec4::reset() &nbsp;</strong> <br/>
76sets all components to 0.
77
78
79<a name="method6"></a>
80<p/><strong>void Vec4::p(double pxIn, double pyIn, double pzIn, double eIn) &nbsp;</strong> <br/>
81sets all components to their input values.
82
83
84<a name="method7"></a>
85<p/><strong>void Vec4::p(Vec4 pIn) &nbsp;</strong> <br/>
86sets all components equal to those of the input four-vector.
87
88
89<a name="method8"></a>
90<p/><strong>void Vec4::px(double pxIn) &nbsp;</strong> <br/>
91
92<strong>void Vec4::py(double pyIn) &nbsp;</strong> <br/>
93
94<strong>void Vec4::pz(double pzIn) &nbsp;</strong> <br/>
95
96<strong>void Vec4::e(double eIn) &nbsp;</strong> <br/>
97sets the respective component to the input value.
98
99
100<h3>Member methods for output</h3>
101
102A number of methods provides output of basic or derived quantities:
103
104<a name="method9"></a>
105<p/><strong>double Vec4::px() &nbsp;</strong> <br/>
106
107<strong>double Vec4::py() &nbsp;</strong> <br/>
108
109<strong>double Vec4::pz() &nbsp;</strong> <br/>
110
111<strong>double Vec4::e() &nbsp;</strong> <br/>
112gets the respective component.
113
114
115<a name="method10"></a>
116<p/><strong>double Vec4::mCalc() &nbsp;</strong> <br/>
117
118<strong>double Vec4::m2Calc() &nbsp;</strong> <br/>
119the (squared) mass, calculated from the four-vectors.
120If <i>m^2 &lt; 0</i> the mass is given with a minus sign,
121<i>-sqrt(-m^2)</i>. Note the possible loss of precision
122in the calculation of <i>E^2 - p^2</i>; for particles the
123correct mass is stored separately to avoid such problems.
124
125
126<a name="method11"></a>
127<p/><strong>double Vec4::pT() &nbsp;</strong> <br/>
128
129<strong>double Vec4::pT2() &nbsp;</strong> <br/>
130the (squared) transverse momentum.
131
132
133<a name="method12"></a>
134<p/><strong>double Vec4::pAbs() &nbsp;</strong> <br/>
135
136<strong>double Vec4::pAbs2() &nbsp;</strong> <br/>
137the (squared) absolute momentum.
138
139
140<a name="method13"></a>
141<p/><strong>double Vec4::eT() &nbsp;</strong> <br/>
142
143<strong>double Vec4::eT2() &nbsp;</strong> <br/>
144the (squared) transverse energy,
145<i>eT = e * sin(theta) = e * pT / pAbs</i>.
146
147
148<a name="method14"></a>
149<p/><strong>double Vec4::theta() &nbsp;</strong> <br/>
150the polar angle, in the range 0 through
151<i>pi</i>.
152
153
154<a name="method15"></a>
155<p/><strong>double Vec4::phi() &nbsp;</strong> <br/>
156the azimuthal angle, in the range <i>-pi</i> through <i>pi</i>.
157
158
159<a name="method16"></a>
160<p/><strong>double Vec4::thetaXZ() &nbsp;</strong> <br/>
161the angle in the <i>xz</i> plane, in the range <i>-pi</i> through
162<i>pi</i>, with 0 along the <i>+z</i> axis.
163
164
165<a name="method17"></a>
166<p/><strong>double Vec4::pPos() &nbsp;</strong> <br/>
167
168<strong>double Vec4::pNeg() &nbsp;</strong> <br/>
169the combinations <i>E+-p_z</i>.
170
171<h3>Friend methods for output</h3>
172
173There are also some <code>friend</code> methods that take one, two
174or three four-vectors as argument. Several of them only use the
175three-vector part of the four-vector.
176
177<a name="method18"></a>
178<p/><strong>friend ostream& operator&lt;&lt;(ostream&, const Vec4& v) &nbsp;</strong> <br/>
179writes out the values of the four components of a <code>Vec4</code> and,
180within brackets, a fifth component being the invariant length of the
181four-vector, as provided by <code>mCalc()</code> above, and it all
182ended with a newline.
183
184
185<a name="method19"></a>
186<p/><strong>friend double m(const Vec4& v1, const Vec4& v2) &nbsp;</strong> <br/>
187
188<strong>friend double m2(const Vec4& v1, const Vec4& v2) &nbsp;</strong> <br/>
189the (squared) invariant mass.
190
191
192<a name="method20"></a>
193<p/><strong>friend double dot3(const Vec4& v1, const Vec4& v2) &nbsp;</strong> <br/>
194the three-product.
195
196
197<a name="method21"></a>
198<p/><strong>friend double cross3(const Vec4& v1, const Vec4& v2) &nbsp;</strong> <br/>
199the cross-product.
200
201
202<a name="method22"></a>
203<p/><strong>friend double theta(const Vec4& v1, const Vec4& v2) &nbsp;</strong> <br/>
204
205<strong>friend double costheta(const Vec4& v1, const Vec4& v2) &nbsp;</strong> <br/>
206the (cosine) of the opening angle between the vectors,
207in the range 0 through <i>pi</i>.
208
209
210<a name="method23"></a>
211<p/><strong>friend double phi(const Vec4& v1, const Vec4& v2) &nbsp;</strong> <br/>
212
213<strong>friend double cosphi(const Vec4& v1, const Vec4& v2) &nbsp;</strong> <br/>
214the (cosine) of the azimuthal angle between the vectors around the
215<i>z</i> axis, in the range 0 through <i>pi</i>.
216
217
218<a name="method24"></a>
219<p/><strong>friend double phi(const Vec4& v1, const Vec4& v2, const Vec4& v3) &nbsp;</strong> <br/>
220
221<strong>friend double cosphi(const Vec4& v1, const Vec4& v2, const Vec4& v3) &nbsp;</strong> <br/>
222the (cosine) of the azimuthal angle between the first two vectors
223around the direction of the third, in the range 0 through <i>pi</i>.
224
225
226<h3>Operations with four-vectors</h3>
227
228Of course one should be able to add, subtract and scale four-vectors,
229and more:
230
231<a name="method25"></a>
232<p/><strong>Vec4 Vec4::operator-() &nbsp;</strong> <br/>
233return a vector with flipped sign for all components, while leaving
234the original vector unchanged.
235
236
237<a name="method26"></a>
238<p/><strong>Vec4& Vec4::operator+=(const Vec4& v) &nbsp;</strong> <br/>
239add a four-vector to an existing one.
240
241
242<a name="method27"></a>
243<p/><strong>Vec4& Vec4::operator-=(const Vec4& v) &nbsp;</strong> <br/>
244subtract a four-vector from an existing one.
245
246
247<a name="method28"></a>
248<p/><strong>Vec4& Vec4::operator*=(double f) &nbsp;</strong> <br/>
249multiply all four-vector components by a real number.
250
251
252<a name="method29"></a>
253<p/><strong>Vec4& Vec4::operator/=(double f) &nbsp;</strong> <br/>
254divide all four-vector components by a real number.
255
256
257<a name="method30"></a>
258<p/><strong>friend Vec4 operator+(const Vec4& v1, const Vec4& v2) &nbsp;</strong> <br/>
259add two four-vectors.
260
261
262<a name="method31"></a>
263<p/><strong>friend Vec4 operator-(const Vec4& v1, const Vec4& v2) &nbsp;</strong> <br/>
264subtract two four-vectors.
265
266
267<a name="method32"></a>
268<p/><strong>friend Vec4 operator*(double f, const Vec4& v) &nbsp;</strong> <br/>
269
270<strong>friend Vec4 operator*(const Vec4& v, double f) &nbsp;</strong> <br/>
271multiply a four-vector by a real number.
272
273
274<a name="method33"></a>
275<p/><strong>friend Vec4 operator/(const Vec4& v, double f) &nbsp;</strong> <br/>
276divide a four-vector by a real number.
277
278
279<a name="method34"></a>
280<p/><strong>friend double operator*(const Vec4& v1, const Vec4 v2) &nbsp;</strong> <br/>
281four-vector product.
282
283
284<p/>
285There are also a few related operations that are normal member methods:
286
287<a name="method35"></a>
288<p/><strong>void Vec4::rescale3(double f) &nbsp;</strong> <br/>
289multiply the three-vector components by <i>f</i>, but keep the
290fourth component unchanged.
291
292
293<a name="method36"></a>
294<p/><strong>void Vec4::rescale4(double f) &nbsp;</strong> <br/>
295multiply all four-vector components by <i>f</i>.
296
297
298<a name="method37"></a>
299<p/><strong>void Vec4::flip3() &nbsp;</strong> <br/>
300flip the sign of the three-vector components, but keep the
301fourth component unchanged.
302
303
304<a name="method38"></a>
305<p/><strong>void Vec4::flip4() &nbsp;</strong> <br/>
306flip the sign of all four-vector components.
307
308
309<h3>Rotations and boosts</h3>
310
311A common task is to rotate or boost four-vectors. In case only one
312four-vector is affected the operation may be performed directly on it.
313However, in case many particles are affected, the helper class
314<code>RotBstMatrix</code> can be used to speed up operations.
315
316<a name="method39"></a>
317<p/><strong>void Vec4::rot(double theta, double phi) &nbsp;</strong> <br/>
318rotate the three-momentum with the polar angle <i>theta</i>
319and the azimuthal angle <i>phi</i>.
320
321
322<a name="method40"></a>
323<p/><strong>void Vec4::rotaxis(double phi, double nx, double ny, double nz) &nbsp;</strong> <br/>
324rotate the three-momentum with the azimuthal angle <i>phi</i>
325around the direction defined by the <i>(n_x, n_y, n_z)</i>
326three-vector.
327
328
329<a name="method41"></a>
330<p/><strong>void Vec4::rotaxis(double phi, Vec4& n) &nbsp;</strong> <br/>
331rotate the three-momentum with the azimuthal angle <i>phi</i>
332around the direction defined by the three-vector part of <i>n</i>.
333
334
335<a name="method42"></a>
336<p/><strong>void Vec4::bst(double betaX, double betaY, double betaZ) &nbsp;</strong> <br/>
337boost the four-momentum by <i>beta = (beta_x, beta_y, beta_z)</i>.
338
339
340<a name="method43"></a>
341<p/><strong>void Vec4::bst(double betaX, double betaY, double betaZ,double gamma) &nbsp;</strong> <br/>
342boost the four-momentum by <i>beta = (beta_x, beta_y, beta_z)</i>,
343where the <i>gamma = 1/sqrt(1 - beta^2)</i> is also input to allow
344better precision when <i>beta</i> is close to unity.
345
346
347<a name="method44"></a>
348<p/><strong>void Vec4::bst(const Vec4& p) &nbsp;</strong> <br/>
349boost the four-momentum by <i>beta = (p_x/E, p_y/E, p_z/E)</i>.
350
351
352<a name="method45"></a>
353<p/><strong>void Vec4::bst(const Vec4& p, double m) &nbsp;</strong> <br/>
354boost the four-momentum by <i>beta = (p_x/E, p_y/E, p_z/E)</i>,
355where the <i>gamma = E/m</i> is also calculated from input to allow
356better precision when <i>beta</i> is close to unity.
357
358
359<a name="method46"></a>
360<p/><strong>void Vec4::bstback(const Vec4& p) &nbsp;</strong> <br/>
361boost the four-momentum by <i>beta = (-p_x/E, -p_y/E, -p_z/E)</i>.
362
363
364<a name="method47"></a>
365<p/><strong>void Vec4::bstback(const Vec4& p, double m) &nbsp;</strong> <br/>
366boost the four-momentum by <i>beta = (-p_x/E, -p_y/E, -p_z/E)</i>,
367where the <i>gamma = E/m</i> is also calculated from input to allow
368better precision when <i>beta</i> is close to unity.
369
370
371<a name="method48"></a>
372<p/><strong>void Vec4::rotbst(const RotBstMatrix& M) &nbsp;</strong> <br/>
373perform a combined rotation and boost; see below for a description
374of the <code>RotBstMatrix</code>.
375
376
377<p/>
378For a longer sequence of rotations and boosts, and where several
379<code>Vec4</code> are to be rotated and boosted in the same way,
380a more efficient approach is to define a <code>RotBstMatrix</code>,
381which forms a separate auxiliary class. You can build up this
3824-by-4 matrix by successive calls to the methods of the class,
383such that the matrix encodes the full sequence of operations.
384The order in which you do these calls must agree with the imagined
385order in which the rotations/boosts should be applied to a
386four-momentum, since in general the operations do not commute.
387
388<a name="method49"></a>
389<p/><strong>RotBstMatrix::RotBstMatrix() &nbsp;</strong> <br/>
390creates a diagonal unit matrix, i.e. one that leaves a four-vector
391unchanged.
392
393
394<a name="method50"></a>
395<p/><strong>RotBstMatrix::RotBstMatrix(const RotBstMatrix& Min) &nbsp;</strong> <br/>
396creates a copy of the input matrix.
397
398
399<a name="method51"></a>
400<p/><strong>RotBstMatrix& RotBstMatrix::operator=(const RotBstMatrix4& Min) &nbsp;</strong> <br/>
401copies the input matrix.
402
403
404<a name="method52"></a>
405<p/><strong>void RotBstMatrix::rot(double theta = 0., double phi = 0.) &nbsp;</strong> <br/>
406rotate by this polar and azimuthal angle.
407
408
409<a name="method53"></a>
410<p/><strong>void RotBstMatrix::rot(const Vec4& p) &nbsp;</strong> <br/>
411rotate so that a vector originally along the <i>+z</i> axis becomes
412parallel with <i>p</i>. More specifically, rotate by <i>-phi</i>,
413<i>theta</i> and <i>phi</i>, with angles defined by <i>p</i>.
414
415
416<a name="method54"></a>
417<p/><strong>void RotBstMatrix::bst(double betaX = 0., double betaY = 0., double betaZ = 0.) &nbsp;</strong> <br/>
418boost by this <i>beta</i> vector.
419
420
421<a name="method55"></a>
422<p/><strong>void RotBstMatrix::bst(const Vec4&) &nbsp;</strong> <br/>
423
424<strong>void RotBstMatrix::bstback(const Vec4&) &nbsp;</strong> <br/>
425boost with a <i>beta = p/E</i> or <i>beta = -p/E</i>, respectively.
426
427
428<a name="method56"></a>
429<p/><strong>void RotBstMatrix::bst(const Vec4& p1, const Vec4& p2) &nbsp;</strong> <br/>
430boost so that <i>p_1</i> is transformed to <i>p_2</i>. It is assumed
431that the two vectors obey <i>p_1^2 = p_2^2</i>.
432
433
434<a name="method57"></a>
435<p/><strong>void RotBstMatrix::toCMframe(const Vec4& p1, const Vec4& p2) &nbsp;</strong> <br/>
436boost and rotate to the rest frame of <i>p_1</i> and <i>p_2</i>,
437with <i>p_1</i> along the <i>+z</i> axis.
438
439
440<a name="method58"></a>
441<p/><strong>void RotBstMatrix::fromCMframe(const Vec4& p1, const Vec4& p2) &nbsp;</strong> <br/>
442rotate and boost from the rest frame of <i>p_1</i> and <i>p_2</i>,
443with <i>p_1</i> along the <i>+z</i> axis, to the actual frame of
444<i>p_1</i> and <i>p_2</i>, i.e. the inverse of the above.
445
446
447<a name="method59"></a>
448<p/><strong>void RotBstMatrix::rotbst(const RotBstMatrix& Min); &nbsp;</strong> <br/>
449combine the current matrix with another one.
450
451
452<a name="method60"></a>
453<p/><strong>void RotBstMatrix::invert() &nbsp;</strong> <br/>
454invert the matrix, which corresponds to an opposite sequence and sign
455of rotations and boosts.
456
457
458<a name="method61"></a>
459<p/><strong>void RotBstMatrix::reset() &nbsp;</strong> <br/>
460reset to no rotation/boost; i.e. the default at creation.
461
462
463<a name="method62"></a>
464<p/><strong>double RotBstMatrix::deviation() &nbsp;</strong> <br/>
465crude estimate how much a matrix deviates from the unit matrix:
466the sum of the absolute values of all non-diagonal matrix elements
467plus the sum of the absolute deviation of the diagonal matrix
468elements from unity.
469
470
471<a name="method63"></a>
472<p/><strong>friend ostream& operator&lt;&lt;(ostream&, const RotBstMatrix& M) &nbsp;</strong> <br/>
473writes out the values of the sixteen components of a
474<code>RotBstMatrix</code>, on four consecutive lines and
475ended with a newline.
476
477
478</body>
479</html>
480
481<!-- Copyright (C) 2012 Torbjorn Sjostrand -->