1 //--------------------------------------------------------------------------
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.
8 // Copyright Information: See EvtGen/COPYRIGHT
9 // Copyright (C) 1998 Caltech, UCSB
11 // Module: EvtTensor3C.cc
13 // Description: Implementation of 3 tensors.
15 // Modification history:
17 // RYD September 14, 1996 Module created
19 //------------------------------------------------------------------------
21 #include "EvtGenBase/EvtPatches.hh"
24 #include "EvtGenBase/EvtComplex.hh"
25 #include "EvtGenBase/EvtVector3C.hh"
26 #include "EvtGenBase/EvtTensor3C.hh"
27 #include "EvtGenBase/EvtReport.hh"
32 EvtTensor3C::~EvtTensor3C(){}
35 EvtTensor3C::EvtTensor3C( const EvtTensor3C& t1 ) {
46 EvtTensor3C::EvtTensor3C(double d11, double d22, double d33) {
64 EvtTensor3C& EvtTensor3C::operator=(const EvtTensor3C& t1) {
75 EvtTensor3C EvtTensor3C::conj() const {
82 temp.set(j,i,::conj(t[i][j]));
88 void EvtTensor3C::zero(){
92 t[i][j]=EvtComplex(0.0,0.0);
98 EvtTensor3C::EvtTensor3C(){
104 t[i][j]=EvtComplex(0.0,0.0);
110 EvtTensor3C EvtTensor3C::operator+=(const EvtTensor3C& t2) {
123 EvtTensor3C EvtTensor3C::operator-=(const EvtTensor3C& t2) {
137 EvtTensor3C EvtTensor3C::operator*=(const EvtComplex& c) {
150 EvtTensor3C EvtTensor3C::operator*=(const double c){
156 t[i][j]*=EvtComplex(c);
165 EvtTensor3C directProd(const EvtVector3C& c1,const EvtVector3C& c2){
171 temp.set(i,j,c1.get(i)*c2.get(j));
178 EvtTensor3C directProd(const EvtVector3C& c1,const EvtVector3R& c2){
184 temp.set(i,j,c1.get(i)*c2.get(j));
191 EvtTensor3C directProd(const EvtVector3R& c1,const EvtVector3R& c2){
197 temp.t[i][j]=EvtComplex(c1.get(i)*c2.get(j),0.0);
204 EvtTensor3C conj(const EvtTensor3C& t2) {
211 temp.set(i,j,::conj((t2.get(i,j))));
219 EvtTensor3C cont22(const EvtTensor3C& t1,const EvtTensor3C& t2){
227 c=t1.get(i,0)*t2.get(j,0)+t1.get(i,1)*t2.get(j,1)
228 +t1.get(i,2)*t2.get(j,2);
236 EvtTensor3C cont11(const EvtTensor3C& t1,const EvtTensor3C& t2){
244 c=t1.get(0,i)*t2.get(0,j)+t1.get(1,i)*t2.get(1,j)
245 +t1.get(2,i)*t2.get(2,j);
254 EvtVector3C EvtTensor3C::cont1(const EvtVector3C& v) const {
260 temp.set(i,t[0][i]*v.get(0)+t[1][i]*v.get(1)
267 EvtVector3C EvtTensor3C::cont2(const EvtVector3C& v) const {
273 temp.set(i,t[i][0]*v.get(0)+t[i][1]*v.get(1)
280 EvtVector3C EvtTensor3C::cont1(const EvtVector3R& v) const {
286 temp.set(i,t[0][i]*v.get(0)+t[1][i]*v.get(1)
293 EvtVector3C EvtTensor3C::cont2(const EvtVector3R& v) const {
299 temp.set(i,t[i][0]*v.get(0)+t[i][1]*v.get(1)
307 EvtTensor3C eps(const EvtVector3R& v){
315 temp.t[0][1]=v.get(2);
316 temp.t[0][2]=-v.get(1);
318 temp.t[1][0]=-v.get(2);
319 temp.t[1][2]=v.get(0);
321 temp.t[2][0]=v.get(1);
322 temp.t[2][1]=-v.get(0);
330 const EvtTensor3C& EvtTensor3C::id(){
332 static EvtTensor3C identity(1.0,1.0,1.0);
338 ostream& operator<<(ostream& s,const EvtTensor3C& v){
340 s<<endl<<"("<<v.t[0][0]<<","<<v.t[0][1]<<","<<v.t[0][2]<<")";
341 s<<endl<<"("<<v.t[1][0]<<","<<v.t[1][1]<<","<<v.t[1][2]<<")";
342 s<<endl<<"("<<v.t[2][0]<<","<<v.t[2][1]<<","<<v.t[2][2]<<")"<<endl;
348 EvtTensor3C rotateEuler(const EvtTensor3C& v,
349 double alpha,double beta,double gamma){
352 tmp.applyRotateEuler(alpha,beta,gamma);
358 void EvtTensor3C::applyRotateEuler(double phi,double theta,double ksi){
360 EvtComplex temp[3][3];
361 double sp,st,sk,cp,ct,ck;
372 r[0][0]=ck*ct*cp-sk*sp;
373 r[0][1]=ck*ct*sp+sk*cp;
376 r[1][0]=-sk*ct*cp-ck*sp;
377 r[1][1]=-sk*ct*sp+ck*cp;
388 temp[i][j]+=r[i][k]*t[k][j];
397 t[i][j]+=r[i][k]*temp[j][k];