Lines getting the matched track moved to a method in AliCalorimeterUtils. Lines copie...
[u/mrichter/AliRoot.git] / PWG2 / FEMTOSCOPY / AliFemto / AliFmLorentzVector.h
CommitLineData
67427ff7 1/***************************************************************************
2 *
3 * $Id$
4 *
5 * Author: Brian Lasiuk, Thomas Ullrich, April 1998
6 ***************************************************************************
7 *
8 * Description:
9 *
10 * Remarks: Since not all compilers support member templates
11 * we have to specialize the templated member on these
12 * platforms. If member templates are not supported the
13 * ST_NO_MEMBER_TEMPLATES flag has to be set. tu.
14 *
15 * In the near future when all compilers can handle member
16 * templates this class should be cleaned up. A lot of
17 * redundant code can be removed as soon as the compilers
18 * are up-to-date. tu
19 *
20 ***************************************************************************
21 *
22 * $Log$
d0e92d9a 23 * Revision 1.1.1.1 2007/04/25 15:38:41 panos
24 * Importing the HBT code dir
25 *
67427ff7 26 * Revision 1.1.1.1 2007/03/07 10:14:49 mchojnacki
27 * First version on CVS
28 *
29 * Revision 1.11 2005/09/22 20:09:20 fisyak
30 * Make AliFmLorentzVector persistent
31 *
32 * Revision 1.10 2005/07/06 18:49:56 fisyak
33 * Replace AliFmHelixD, AliFmLorentzVectorD,AliFmLorentzVectorF,AliFmMatrixD,AliFmMatrixF,AliFmPhysicalHelixD,AliFmThreeVectorD,AliFmThreeVectorF by templated version
34 *
35 * Revision 1.9 2005/03/28 06:02:45 perev
36 * Defence FPE added
37 *
38 * Revision 1.8 2003/09/02 17:59:35 perev
39 * gcc 3.2 updates + WarnOff
40 *
41 * Revision 1.7 2003/05/01 19:24:31 ullrich
42 * Corrected problem in boost().
43 *
44 * Revision 1.6 1999/10/15 15:56:36 ullrich
45 * Changed output format in operator<<, added operator>>
46 *
47 * Revision 1.5 1999/06/04 18:01:36 ullrich
48 * New operators operator() and operator[] which can be used
49 * as lvalues.
50 *
51 * Revision 1.4 1999/04/14 23:12:07 fisyak
52 * Add __CINT__ to handle references
53 *
54 * Revision 1.3 1999/02/17 11:38:36 ullrich
55 * Removed specialization for 'long double'.
56 *
57 * Revision 1.2 1999/02/14 23:11:42 fisyak
58 * Fixes for Rootcint
59 *
60 * Revision 1.1 1999/01/30 03:59:02 fisyak
61 * Root Version of AliFmarClassLibrary
62 *
63 * Revision 1.1 1999/01/23 00:27:52 ullrich
64 * Initial Revision
65 *
66 **************************************************************************/
59c8f7b2 67/*//
68//// General class for a Lorentz four-vector
69///*/
67427ff7 70#ifndef ST_LORENTZ_VECTOR_HH
71#define ST_LORENTZ_VECTOR_HH
72
73#include "AliFmThreeVector.h"
74template<class T> class AliFmLorentzVector {
75public:
76 AliFmLorentzVector(T = 0, T = 0, T = 0, T = 0);
77 virtual ~AliFmLorentzVector();
78
79#ifndef ST_NO_MEMBER_TEMPLATES
80 template<class X> AliFmLorentzVector(const AliFmThreeVector<X>&, T);
81 template<class X> AliFmLorentzVector(T, const AliFmThreeVector<X>&);
82
83 template<class X> AliFmLorentzVector(const AliFmLorentzVector<X>&);
84 template<class X> AliFmLorentzVector<T>& operator=(const AliFmLorentzVector<X>&);
85 // AliFmLorentzVector(const AliFmLorentzVector<T>&); use default
86 // AliFmLorentzVector<T>& operator=(const AliFmLorentzVector<T>&); use default
87#else
88 AliFmLorentzVector(const AliFmThreeVector<float>&, T);
89 AliFmLorentzVector(T, const AliFmThreeVector<float>&);
90 AliFmLorentzVector(const AliFmLorentzVector<float>&);
91
92 AliFmLorentzVector(const AliFmThreeVector<double>&, T);
93 AliFmLorentzVector(T, const AliFmThreeVector<double>&);
94 AliFmLorentzVector(const AliFmLorentzVector<double>&);
95
96 AliFmLorentzVector<T>& operator=(const AliFmLorentzVector<float>&);
97 AliFmLorentzVector<T>& operator=(const AliFmLorentzVector<double>&);
98#endif
99
100 T x() const;
101 T y() const;
102 T z() const;
103 T t() const;
104 T px() const;
105 T py() const;
106 T pz() const;
107 T e() const;
108 T operator() (size_t) const;
109 T operator[] (size_t) const;
110
111 T& operator() (size_t);
112 T& operator[] (size_t);
113
114 const AliFmThreeVector<T>& vect() const;
115
a19edcc9 116 void SetX(T);
117 void SetY(T);
118 void SetZ(T);
119 void SetPx(T);
120 void SetPy(T);
121 void SetPz(T);
122 void SetE(T);
123 void SetT(T);
67427ff7 124
125#ifndef ST_NO_MEMBER_TEMPLATES
a19edcc9 126 template <class X> void SetVect(const AliFmThreeVector<X>&);
67427ff7 127#else
a19edcc9 128 void SetVect(const AliFmThreeVector<float>&);
129 void SetVect(const AliFmThreeVector<double>&);
67427ff7 130#endif
131
59c8f7b2 132 T Perp() const;
133 T Perp2() const;
134 T PseudoRapidity() const;
135 T Phi() const;
136 T Theta() const;
137 T CosTheta() const;
67427ff7 138
59c8f7b2 139 T Plus() const;
140 T Minus() const;
67427ff7 141
142 T m() const;
143 T m2() const;
144 T mt() const;
145 T mt2() const;
59c8f7b2 146 T Rapidity() const;
67427ff7 147
148#ifndef ST_NO_MEMBER_TEMPLATES
149 template<class X> AliFmLorentzVector<T> boost(const AliFmLorentzVector<X>&) const;
150#else
151 AliFmLorentzVector<T> boost(const AliFmLorentzVector<float>&) const;
152 AliFmLorentzVector<T> boost(const AliFmLorentzVector<double>&) const;
153#endif
154
155 AliFmLorentzVector<T> operator- ();
156 AliFmLorentzVector<T> operator+ ();
157 AliFmLorentzVector<T>& operator*= (double);
158 AliFmLorentzVector<T>& operator/= (double);
159
160#ifndef ST_NO_MEMBER_TEMPLATES
161 template<class X> bool operator == (const AliFmLorentzVector<X>&) const;
162 template<class X> bool operator != (const AliFmLorentzVector<X>&) const;
163 template<class X> AliFmLorentzVector<T>& operator+= (const AliFmLorentzVector<X>&);
164 template<class X> AliFmLorentzVector<T>& operator-= (const AliFmLorentzVector<X>&);
165#else
166 bool operator == (const AliFmLorentzVector<float>&) const;
167 bool operator != (const AliFmLorentzVector<float>&) const;
168 bool operator == (const AliFmLorentzVector<double>&) const;
169 bool operator != (const AliFmLorentzVector<double>&) const;
170
171 AliFmLorentzVector<T>& operator+= (const AliFmLorentzVector<float>&);
172 AliFmLorentzVector<T>& operator-= (const AliFmLorentzVector<float>&);
173 AliFmLorentzVector<T>& operator+= (const AliFmLorentzVector<double>&);
174 AliFmLorentzVector<T>& operator-= (const AliFmLorentzVector<double>&);
175#endif
176
177protected:
283ac554 178 AliFmThreeVector<T> fThreeVector; // The spatial three-vector
179 T fX4; // The fourth components
67427ff7 180#ifdef __ROOT__
181 ClassDef(AliFmLorentzVector,3)
182#endif
183};
184#ifndef __CINT__
185//
186// Implementation of member functions
187//
188template<class T>
9064872d 189AliFmLorentzVector<T>::AliFmLorentzVector(T ax, T ay, T az, T at)
283ac554 190 : fThreeVector(ax, ay, az), fX4(at) { /* nop */ }
67427ff7 191
192template<class T>
193AliFmLorentzVector<T>::~AliFmLorentzVector() { /* nopt */ }
194
195template<class T>
196const AliFmThreeVector<T>& AliFmLorentzVector<T>::vect() const
197{
283ac554 198 return fThreeVector;
67427ff7 199}
200
201template<class T>
202T AliFmLorentzVector<T>::m2() const
203{
283ac554 204 return (fX4*fX4 - fThreeVector*fThreeVector);
67427ff7 205}
206
207template<class T>
59c8f7b2 208T AliFmLorentzVector<T>::Plus() const { return (e() + pz()); }
67427ff7 209
210template<class T>
59c8f7b2 211T AliFmLorentzVector<T>::Minus() const { return (e() - pz()); }
67427ff7 212
213template<class T>
214T AliFmLorentzVector<T>::m() const
215{
216 T mass2 = m2();
217 if (mass2 < 0)
218 return -::sqrt(-mass2);
219 else
220 return ::sqrt(mass2);
221}
222
223template<class T>
224T AliFmLorentzVector<T>::mt2() const
225{
59c8f7b2 226 return this->Perp2() + m2();
67427ff7 227}
228
229template<class T>
230T AliFmLorentzVector<T>::mt() const
231{
232 //
233 // change to more optimal code ?
234 // return e()*e() - pz()*pz();
235 T massPerp2 = mt2();
236 if (massPerp2 < 0)
237 return -::sqrt(-massPerp2);
238 else
239 return ::sqrt(massPerp2);
240}
241
242template<class T>
283ac554 243void AliFmLorentzVector<T>::SetPx(T ax) {fThreeVector.SetX(ax);}
67427ff7 244
245template<class T>
283ac554 246void AliFmLorentzVector<T>::SetPy(T ay) {fThreeVector.SetY(ay);}
67427ff7 247
248template<class T>
283ac554 249void AliFmLorentzVector<T>::SetPz(T az) {fThreeVector.SetZ(az);}
67427ff7 250
251template<class T>
283ac554 252void AliFmLorentzVector<T>::SetX(T ax) {fThreeVector.SetX(ax);}
67427ff7 253
254template<class T>
283ac554 255void AliFmLorentzVector<T>::SetY(T ay) {fThreeVector.SetY(ay);}
67427ff7 256
257template<class T>
283ac554 258void AliFmLorentzVector<T>::SetZ(T az) {fThreeVector.SetZ(az);}
67427ff7 259
260template<class T>
283ac554 261void AliFmLorentzVector<T>::SetT(T at) {fX4 = at;}
67427ff7 262
263template<class T>
283ac554 264void AliFmLorentzVector<T>::SetE(T ae) {fX4 = ae;}
67427ff7 265
266template<class T>
283ac554 267T AliFmLorentzVector<T>::x() const {return fThreeVector.x();}
67427ff7 268
269template<class T>
283ac554 270T AliFmLorentzVector<T>::y() const {return fThreeVector.y();}
67427ff7 271
272template<class T>
283ac554 273T AliFmLorentzVector<T>::z() const {return fThreeVector.z();}
67427ff7 274
275template<class T>
283ac554 276T AliFmLorentzVector<T>::px() const {return fThreeVector.x();}
67427ff7 277
278template<class T>
283ac554 279T AliFmLorentzVector<T>::py() const {return fThreeVector.y();}
67427ff7 280
281template<class T>
283ac554 282T AliFmLorentzVector<T>::pz() const {return fThreeVector.z();}
67427ff7 283
284template<class T>
283ac554 285T AliFmLorentzVector<T>::e() const {return fX4;}
67427ff7 286
287template<class T>
283ac554 288T AliFmLorentzVector<T>::t() const {return fX4;}
67427ff7 289
290template<class T>
283ac554 291T AliFmLorentzVector<T>::Perp() const {return fThreeVector.Perp();}
67427ff7 292
293template<class T>
283ac554 294T AliFmLorentzVector<T>::Perp2() const {return fThreeVector.Perp2();}
67427ff7 295
296template<class T>
283ac554 297T AliFmLorentzVector<T>::PseudoRapidity() const {return fThreeVector.PseudoRapidity();}
67427ff7 298
299template<class T>
283ac554 300T AliFmLorentzVector<T>::Phi() const {return fThreeVector.Phi();}
67427ff7 301
302template<class T>
283ac554 303T AliFmLorentzVector<T>::Theta() const {return fThreeVector.Theta();}
67427ff7 304
305template<class T>
283ac554 306T AliFmLorentzVector<T>::CosTheta() const {return fThreeVector.CosTheta();}
67427ff7 307
308template<class T>
309T AliFmLorentzVector<T>::operator() (size_t i) const
310{
311 if (i < 3)
283ac554 312 return fThreeVector(i);
67427ff7 313 else if (i == 3)
283ac554 314 return fX4;
67427ff7 315 else {
316#ifndef ST_NO_EXCEPTIONS
317 throw out_of_range("AliFmLorentzVector<T>::operator(): bad index");
318#else
319 cerr << "AliFmLorentzVector<T>::operator(): bad index." << endl;
320#endif
321 return 0;
322 }
323}
324
325template<class T>
326T& AliFmLorentzVector<T>::operator() (size_t i)
327{
328 if (i < 3)
283ac554 329 return fThreeVector(i);
67427ff7 330 else if (i == 3)
283ac554 331 return fX4;
67427ff7 332 else {
333#ifndef ST_NO_EXCEPTIONS
334 throw out_of_range("AliFmLorentzVector<T>::operator(): bad index");
335#else
336 cerr << "AliFmLorentzVector<T>::operator(): bad index." << endl;
283ac554 337 return fX4;
1bec8ced 338#endif
67427ff7 339 }
340}
341
342template<class T>
343T AliFmLorentzVector<T>::operator[] (size_t i) const
344{
345 if (i < 3)
283ac554 346 return fThreeVector[i];
67427ff7 347 else if (i == 3)
283ac554 348 return fX4;
67427ff7 349 else {
350#ifndef ST_NO_EXCEPTIONS
351 throw out_of_range("AliFmLorentzVector<T>::operator[]: bad index");
352#else
353 cerr << "AliFmLorentzVector<T>::operator[]: bad index." << endl;
67427ff7 354 return 0;
1bec8ced 355#endif
67427ff7 356 }
357}
358
359template<class T>
360T& AliFmLorentzVector<T>::operator[] (size_t i)
361{
362 if (i < 3)
283ac554 363 return fThreeVector[i];
67427ff7 364 else if (i == 3)
283ac554 365 return fX4;
67427ff7 366 else {
367#ifndef ST_NO_EXCEPTIONS
368 throw out_of_range("AliFmLorentzVector<T>::operator[]: bad index");
369#else
370 cerr << "AliFmLorentzVector<T>::operator[]: bad index." << endl;
283ac554 371 return fX4;
1bec8ced 372#endif
67427ff7 373 }
374}
375
376template<class T>
59c8f7b2 377T AliFmLorentzVector<T>::Rapidity() const
67427ff7 378{
283ac554 379 return 0.5*::log((fX4+fThreeVector.z())/(fX4-fThreeVector.z())+1e-20);
67427ff7 380}
381
382template<class T>
383AliFmLorentzVector<T> AliFmLorentzVector<T>::operator- ()
384{
283ac554 385 return AliFmLorentzVector<T>(-fX4,-fThreeVector);
67427ff7 386}
387
388template<class T>
389AliFmLorentzVector<T> AliFmLorentzVector<T>::operator+ ()
390{
391 return *this;
392}
393
394template<class T>
395AliFmLorentzVector<T>& AliFmLorentzVector<T>::operator*= (double c)
396{
283ac554 397 fThreeVector *= c;
398 fX4 *= c;
67427ff7 399 return *this;
400}
401
402template<class T>
403AliFmLorentzVector<T>& AliFmLorentzVector<T>::operator/= (double c)
404{
283ac554 405 fThreeVector /= c;
406 fX4 /= c;
67427ff7 407 return *this;
408}
409
410#ifndef ST_NO_MEMBER_TEMPLATES
411#ifndef WIN32
412
413template<class T>
414template<class X>
9064872d 415AliFmLorentzVector<T>::AliFmLorentzVector(const AliFmThreeVector<X> &vec, T at)
283ac554 416 : fThreeVector(vec), fX4(at) { /* nop */ }
67427ff7 417
418template<class T>
419template<class X>
9064872d 420AliFmLorentzVector<T>::AliFmLorentzVector(T at, const AliFmThreeVector<X> &vec)
283ac554 421 : fThreeVector(vec), fX4(at) { /* nop */ }
67427ff7 422
423template<class T>
424template<class X>
425AliFmLorentzVector<T>::AliFmLorentzVector(const AliFmLorentzVector<X> &vec)
283ac554 426 : fThreeVector(vec.vect()), fX4(vec.t()) { /* nop */ }
67427ff7 427
428template<class T>
429template<class X>
430AliFmLorentzVector<T>
431AliFmLorentzVector<T>::boost(const AliFmLorentzVector<X>& pframe) const
432{
433 T mass = abs(pframe);
434 AliFmThreeVector<T> eta = (-1./mass)*pframe.vect(); // gamma*beta
435 T gamma = fabs(pframe.e())/mass;
436 AliFmThreeVector<T> pl = ((this->vect()*eta)/(eta*eta))*eta; // longitudinal momentum
437 return AliFmLorentzVector<T>(gamma*this->e() - this->vect()*eta,
438 this->vect() + (gamma-1.)*pl - this->e()*eta);
439}
440
441template<class T>
442template<class X>
a19edcc9 443void AliFmLorentzVector<T>::SetVect(const AliFmThreeVector<X>& v)
67427ff7 444{
283ac554 445 fThreeVector = v;
67427ff7 446}
447
448template<class T>
449template<class X>
450AliFmLorentzVector<T>&
451AliFmLorentzVector<T>::operator=(const AliFmLorentzVector<X>& vec)
452{
283ac554 453 fThreeVector = vec.vect();
454 fX4 = vec.t();
67427ff7 455 return *this;
456}
457
458template<class T>
459template<class X>
460bool
461AliFmLorentzVector<T>::operator== (const AliFmLorentzVector<X>& v) const
462{
283ac554 463 return (fThreeVector == v.vect()) && (fX4 == v.t());
67427ff7 464}
465
466template<class T>
467template<class X>
468bool
469AliFmLorentzVector<T>::operator!= (const AliFmLorentzVector<X>& v) const
470{
471 return !(*this == v);
472}
473
474template<class T>
475template<class X>
476AliFmLorentzVector<T>&
477AliFmLorentzVector<T>::operator+= (const AliFmLorentzVector<X>& v)
478{
283ac554 479 fThreeVector += v.vect();
480 fX4 += v.t();
67427ff7 481 return *this;
482}
483
484template<class T>
485template<class X>
486AliFmLorentzVector<T>&
487AliFmLorentzVector<T>::operator-= (const AliFmLorentzVector<X>& v)
488{
283ac554 489 fThreeVector -= v.vect();
490 fX4 -= v.t();
67427ff7 491 return *this;
492}
493
494#endif
495#else
496
497template<class T>
498AliFmLorentzVector<T>::AliFmLorentzVector(const AliFmThreeVector<float> &vec, T t)
283ac554 499 : fThreeVector(vec), fX4(t) { /* nop */ }
67427ff7 500
501template<class T>
502AliFmLorentzVector<T>::AliFmLorentzVector(const AliFmThreeVector<double> &vec, T t)
283ac554 503 : fThreeVector(vec), fX4(t) { /* nop */ }
67427ff7 504
505template<class T>
506AliFmLorentzVector<T>::AliFmLorentzVector(T t, const AliFmThreeVector<float> &vec)
283ac554 507 : fThreeVector(vec), fX4(t) { /* nop */ }
67427ff7 508
509template<class T>
510AliFmLorentzVector<T>::AliFmLorentzVector(T t, const AliFmThreeVector<double> &vec)
283ac554 511 : fThreeVector(vec), fX4(t) { /* nop */ }
67427ff7 512
513template<class T>
514AliFmLorentzVector<T>::AliFmLorentzVector(const AliFmLorentzVector<float> &vec)
283ac554 515 : fThreeVector(vec.vect()), fX4(vec.t()) { /* nop */ }
67427ff7 516
517template<class T>
518AliFmLorentzVector<T>::AliFmLorentzVector(const AliFmLorentzVector<double> &vec)
283ac554 519 : fThreeVector(vec.vect()), fX4(vec.t()) { /* nop */ }
67427ff7 520
521template<class T>
522AliFmLorentzVector<T>
523AliFmLorentzVector<T>::boost(const AliFmLorentzVector<float>& pframe) const
524{
525 T mass = abs(pframe);
526 AliFmThreeVector<T> eta = (-1./mass)*pframe.vect(); // gamma*beta
527 T gamma = fabs(pframe.e())/mass;
528 AliFmThreeVector<T> pl = ((this->vect()*eta)/(eta*eta))*eta; // longitudinal momentum
529 return AliFmLorentzVector<T>(gamma*this->e() - this->vect()*eta,
530 this->vect() + (gamma-1.)*pl - this->e()*eta);
531}
532
533template<class T>
534AliFmLorentzVector<T>
535AliFmLorentzVector<T>::boost(const AliFmLorentzVector<double>& pframe) const
536{
537 T mass = abs(pframe);
538 AliFmThreeVector<T> eta = (-1./mass)*pframe.vect(); // gamma*beta
539 T gamma = fabs(pframe.e())/mass;
540 AliFmThreeVector<T> pl = ((this->vect()*eta)/(eta*eta))*eta; // longitudinal momentum
541 return AliFmLorentzVector<T>(gamma*this->e() - this->vect()*eta,
542 this->vect() + (gamma-1.)*pl - this->e()*eta);
543}
544
545template<class T>
a19edcc9 546void AliFmLorentzVector<T>::SetVect(const AliFmThreeVector<float>& v)
67427ff7 547{
283ac554 548 fThreeVector = v;
67427ff7 549}
550
551template<class T>
a19edcc9 552void AliFmLorentzVector<T>::SetVect(const AliFmThreeVector<double>& v)
67427ff7 553{
283ac554 554 fThreeVector = v;
67427ff7 555}
556
557template<class T>
558AliFmLorentzVector<T>&
559AliFmLorentzVector<T>::operator=(const AliFmLorentzVector<float>& vec)
560{
283ac554 561 fThreeVector = vec.vect();
562 fX4 = vec.t();
67427ff7 563 return *this;
564}
565
566template<class T>
567AliFmLorentzVector<T>&
568AliFmLorentzVector<T>::operator=(const AliFmLorentzVector<double>& vec)
569{
283ac554 570 fThreeVector = vec.vect();
571 fX4 = vec.t();
67427ff7 572 return *this;
573}
574
575template<class T>
576bool
577AliFmLorentzVector<T>::operator== (const AliFmLorentzVector<float>& v) const
578{
283ac554 579 return (this->vect() == v.vect()) && (fX4 == v.t());
67427ff7 580}
581
582template<class T>
583bool
584AliFmLorentzVector<T>::operator== (const AliFmLorentzVector<double>& v) const
585{
283ac554 586 return (fThreeVector == v.vect()) && (fX4 == v.t());
67427ff7 587}
588
589template<class T>
590bool
591AliFmLorentzVector<T>::operator!= (const AliFmLorentzVector<float>& v) const
592{
593 return !(*this == v);
594}
595
596template<class T>
597bool
598AliFmLorentzVector<T>::operator!= (const AliFmLorentzVector<double>& v) const
599{
600 return !(*this == v);
601}
602
603template<class T>
604AliFmLorentzVector<T>&
605AliFmLorentzVector<T>::operator+= (const AliFmLorentzVector<float>& v)
606{
283ac554 607 fThreeVector += v.vect();
608 fX4 += v.t();
67427ff7 609 return *this;
610}
611
612template<class T>
613AliFmLorentzVector<T>&
614AliFmLorentzVector<T>::operator+= (const AliFmLorentzVector<double>& v)
615{
283ac554 616 fThreeVector += v.vect();
617 fX4 += v.t();
67427ff7 618 return *this;
619}
620
621template<class T>
622AliFmLorentzVector<T>&
623AliFmLorentzVector<T>::operator-= (const AliFmLorentzVector<float>& v)
624{
283ac554 625 fThreeVector -= v.vect();
626 fX4 -= v.t();
67427ff7 627 return *this;
628}
629
630template<class T>
631AliFmLorentzVector<T>&
632AliFmLorentzVector<T>::operator-= (const AliFmLorentzVector<double>& v)
633{
283ac554 634 fThreeVector -= v.vect();
635 fX4 -= v.t();
67427ff7 636 return *this;
637}
638
639#endif // ST_NO_MEMBER_TEMPLATES
640#endif /* ! __CINT__ */
641#ifdef __CINT__
642template<> AliFmLorentzVector<double> operator+ (const AliFmLorentzVector<double>& v1, const AliFmLorentzVector<double>& v2);
643template<> AliFmLorentzVector<double> operator+ (const AliFmLorentzVector<double>& v1, const AliFmLorentzVector<float>& v2);
644template<> AliFmLorentzVector<double> operator+ (const AliFmLorentzVector<float>& v1, const AliFmLorentzVector<double>& v2);
645template<> AliFmLorentzVector<float> operator+ (const AliFmLorentzVector<float>& v1, const AliFmLorentzVector<float>& v2);
646template<> AliFmLorentzVector<double> operator- (const AliFmLorentzVector<double>& v1, const AliFmLorentzVector<double>& v2);
647template<> AliFmLorentzVector<double> operator- (const AliFmLorentzVector<double>& v1, const AliFmLorentzVector<float>& v2);
648template<> AliFmLorentzVector<double> operator- (const AliFmLorentzVector<float>& v1, const AliFmLorentzVector<double>& v2);
649template<> AliFmLorentzVector<float> operator- (const AliFmLorentzVector<float>& v1, const AliFmLorentzVector<float>& v2);
650template<> AliFmLorentzVector<double> operator* (const AliFmLorentzVector<double>& v1, const AliFmLorentzVector<double>& v2);
651template<> AliFmLorentzVector<double> operator* (const AliFmLorentzVector<double>& v1, const AliFmLorentzVector<float>& v2);
652template<> AliFmLorentzVector<double> operator* (const AliFmLorentzVector<float>& v1, const AliFmLorentzVector<double>& v2);
653template<> AliFmLorentzVector<float> operator* (const AliFmLorentzVector<float>& v1, const AliFmLorentzVector<float>& v2);
654template<> AliFmLorentzVector<double> operator* (const double v1, const AliFmLorentzVector<double>& v2);
655template<> AliFmLorentzVector<double> operator* (const double v1, const AliFmLorentzVector<float>& v2);
656template<> AliFmLorentzVector<double> operator* (const AliFmLorentzVector<double>& v1, const double v2);
657template<> AliFmLorentzVector<double> operator* (const AliFmLorentzVector<float>& v1, const double v2);
658template<> AliFmLorentzVector<double> operator/ (const AliFmLorentzVector<double>& v1, const AliFmLorentzVector<double>& v2);
659template<> AliFmLorentzVector<double> operator/ (const AliFmLorentzVector<double>& v1, const AliFmLorentzVector<float>& v2);
660template<> AliFmLorentzVector<double> operator/ (const AliFmLorentzVector<float>& v1, const AliFmLorentzVector<double>& v2);
661template<> AliFmLorentzVector<float> operator/ (const AliFmLorentzVector<float>& v1, const AliFmLorentzVector<float>& v2);
662template<> AliFmLorentzVector<double> operator/ (const double v1, const AliFmLorentzVector<double>& v2);
663template<> AliFmLorentzVector<double> operator/ (const double v1, const AliFmLorentzVector<float>& v2);
664template<> AliFmLorentzVector<double> operator/ (const AliFmLorentzVector<double>& v1, const double v2);
665template<> AliFmLorentzVector<double> operator/ (const AliFmLorentzVector<float>& v1, const double v2);
666template<> istream& operator>> (istream& is, const AliFmLorentzVector<double>& v);
667template<> ostream& operator<< (ostream& os, const AliFmLorentzVector<double>& v);
668template<> istream& operator>> (istream& is, const AliFmLorentzVector<float>& v);
669template<> ostream& operator<< (ostream& os, const AliFmLorentzVector<float>& v);
670template<> double abs(const AliFmLorentzVector<double>& v);
671template<> float abs(const AliFmLorentzVector<float>& v);
672#else
673//
674// Non-member operators
675//
676template<class T, class X>
677AliFmLorentzVector<T>
678operator+ (const AliFmLorentzVector<T>& v1, const AliFmLorentzVector<X>& v2)
679{
680 return AliFmLorentzVector<T>(v1) += v2;
681}
682
683template<class T, class X>
684AliFmLorentzVector<T>
685operator- (const AliFmLorentzVector<T>& v1, const AliFmLorentzVector<X>& v2)
686{
687 return AliFmLorentzVector<T>(v1) -= v2;
688}
689
690template<class T, class X>
691T
692operator* (const AliFmLorentzVector<T>& v1, const AliFmLorentzVector<X>& v2)
693{
694 return v1.t()*v2.t() - v1.vect()*v2.vect();
695}
696
697template<class T>
698AliFmLorentzVector<T>
699operator* (const AliFmLorentzVector<T>& v, double c)
700{
701 return AliFmLorentzVector<T>(v) *= c;
702}
703
704template<class T>
705AliFmLorentzVector<T> operator* (double c, const AliFmLorentzVector<T>& v)
706{
707 return AliFmLorentzVector<T>(v) *= c;
708}
709
710template<class T, class X>
711AliFmLorentzVector<T> operator/ (const AliFmLorentzVector<T>& v, X c)
712{
713 return AliFmLorentzVector<T>(v) /= c;
714}
715
716template<class T>
717ostream& operator<< (ostream& os, const AliFmLorentzVector<T>& v)
718{
719 return os << v.vect() << "\t\t" << v.t();
720}
721
722template<class T>
723istream& operator>>(istream& is, AliFmLorentzVector<T>& v)
724{
725 T x, y, z, t;
726 is >> x >> y >> z >> t;
a19edcc9 727 v.SetX(x);
728 v.SetY(y);
729 v.SetZ(z);
730 v.SetT(t);
67427ff7 731 return is;
732}
733
734//
735// Non-member functions
736//
737template<class T>
738T abs(const AliFmLorentzVector<T>& v) {return v.m();}
739
740#endif /* __CINT__ */
741#endif