Line data Source code
1 : //--------------------------------------------------------------------------
2 : //
3 : // Environment:
4 : // This software is part of the EvtGen package developed jointly
5 : // for the BaBar and CLEO collaborations. If you use all or part
6 : // of it, please give an appropriate acknowledgement.
7 : //
8 : // Copyright Information: See EvtGen/COPYRIGHT
9 : // Copyright (C) 1998 Caltech, UCSB
10 : //
11 : // Module: EvtGen/EvtTensor3C.hh
12 : //
13 : // Description: Class to handle complex 3 tensors
14 : //
15 : // Modification history:
16 : //
17 : // RYD September 14, 1997 Module created
18 : //
19 : //------------------------------------------------------------------------
20 :
21 : #ifndef EVTTENSOR3C_HH
22 : #define EVTTENSOR3C_HH
23 :
24 : #include <iostream>
25 : #include "EvtGenBase/EvtComplex.hh"
26 :
27 : class EvtVector3C;
28 : class EvtVector3R;
29 :
30 : class EvtTensor3C;
31 :
32 : namespace EvtGenFunctions {
33 : EvtTensor3C eps(const EvtVector3R& v);
34 : EvtTensor3C rotateEuler(const EvtTensor3C& v,
35 : double phi,double theta,double ksi);
36 : EvtTensor3C directProd(const EvtVector3C& c1,const EvtVector3C& c2);
37 : EvtTensor3C directProd(const EvtVector3C& c1,const EvtVector3R& c2);
38 : EvtTensor3C directProd(const EvtVector3R& c1,const EvtVector3R& c2);
39 : };
40 :
41 : class EvtTensor3C {
42 : friend EvtTensor3C operator*(
43 : const EvtComplex& c,const EvtTensor3C& t2);
44 : friend EvtTensor3C operator*(const double d,const EvtTensor3C& t2);
45 : friend EvtTensor3C operator*(
46 : const EvtTensor3C& t2,const EvtComplex& c);
47 : friend EvtTensor3C operator*(const EvtTensor3C& t2,const double d);
48 : friend EvtTensor3C operator+(
49 : const EvtTensor3C& t1,const EvtTensor3C& t2);
50 : friend EvtTensor3C operator-(
51 : const EvtTensor3C& t1,const EvtTensor3C& t2);
52 : friend EvtTensor3C EvtGenFunctions::directProd(const EvtVector3C& c1,const EvtVector3C& c2);
53 : friend EvtTensor3C EvtGenFunctions::directProd(const EvtVector3C& c1,const EvtVector3R& c2);
54 : friend EvtTensor3C EvtGenFunctions::directProd(const EvtVector3R& c1,const EvtVector3R& c2);
55 : friend EvtTensor3C conj(const EvtTensor3C& t2);
56 : //Contract the second index of two tensors result(i,j) = t1(i,k)t2(j,k)
57 : friend EvtTensor3C cont22(const EvtTensor3C& t1,const EvtTensor3C& t2);
58 : //Contract the first index of two tensors result(i,j) = t1(k,i)t2(k,j)
59 : friend EvtTensor3C cont11(const EvtTensor3C& t1,const EvtTensor3C& t2);
60 : //Contract the last index of eps_{ijk} with w
61 : friend EvtTensor3C EvtGenFunctions::eps(const EvtVector3R& v);
62 : friend std::ostream& operator<<(std::ostream& c,const EvtTensor3C& v);
63 :
64 : public:
65 : EvtTensor3C();
66 : EvtTensor3C(const EvtTensor3C& t1 );
67 : EvtTensor3C(double d11, double d22, double d33);
68 : virtual ~EvtTensor3C();
69 : EvtTensor3C& operator=(const EvtTensor3C& t1);
70 : inline void set(int i,int j,const EvtComplex& c);
71 : inline const EvtComplex& get(int i, int j) const;
72 : inline EvtComplex trace() const;
73 : static const EvtTensor3C& id();
74 : void zero();
75 : void applyRotateEuler(double phi,double theta,double ksi);
76 :
77 : EvtTensor3C operator+=(const EvtTensor3C& t2);
78 : EvtTensor3C operator-=(const EvtTensor3C& t2);
79 : EvtTensor3C operator*=(const double d);
80 : EvtTensor3C operator*=(const EvtComplex& c);
81 : EvtTensor3C conj() const;
82 : EvtVector3C cont1(const EvtVector3C& v) const;
83 : EvtVector3C cont2(const EvtVector3C& v) const;
84 : EvtVector3C cont1(const EvtVector3R& v) const;
85 : EvtVector3C cont2(const EvtVector3R& v) const;
86 :
87 : private:
88 :
89 : EvtComplex t[3][3];
90 :
91 : };
92 :
93 : inline EvtTensor3C operator*(const EvtComplex& c,const EvtTensor3C& t2){
94 0 : return EvtTensor3C(t2)*=c;
95 0 : }
96 :
97 : inline EvtTensor3C operator*(const double d,const EvtTensor3C& t2){
98 : return EvtTensor3C(t2)*=d;
99 : }
100 :
101 : inline EvtTensor3C operator*(const EvtTensor3C& t2,const EvtComplex& c){
102 : return EvtTensor3C(t2)*=c;
103 : }
104 :
105 : inline EvtTensor3C operator*(const EvtTensor3C& t2,const double d){
106 : return EvtTensor3C(t2)*=d;
107 : }
108 :
109 : inline EvtTensor3C operator+(const EvtTensor3C& t1,const EvtTensor3C& t2){
110 0 : return EvtTensor3C(t1)+=t2;
111 0 : }
112 :
113 : inline EvtTensor3C operator-(const EvtTensor3C& t1,const EvtTensor3C& t2){
114 : return EvtTensor3C(t1)-=t2;
115 : }
116 :
117 : inline void EvtTensor3C::set(int i,int j,const EvtComplex& c){
118 0 : t[i][j]=c;
119 0 : }
120 :
121 : inline const EvtComplex& EvtTensor3C::get(int i,int j) const{
122 0 : return t[i][j];
123 : }
124 :
125 : inline EvtComplex EvtTensor3C::trace() const{
126 : return t[0][0]+t[1][1]+t[2][2];
127 : }
128 :
129 : #endif
130 :
|