// @(#)root/physics:$Id$
// Author: Pasha Murat, Peter Malzacher   12/02/99
//    Aug 11 1999: added Pt == 0 guard to Eta()
//    Oct  8 1999: changed Warning to Error and
//                 return fX in Double_t & operator()
//    Oct 20 1999: Bug fix: sign in PseudoRapidity
//                 Warning-> Error in Double_t operator()

//______________________________________________________________________________
//*-*-*-*-*-*-*-*-*-*-*-*The Physics Vector package *-*-*-*-*-*-*-*-*-*-*-*
//*-*                    ==========================                       *
//*-* The Physics Vector package consists of five classes:                *
//*-*   - TVector2                                                        *
//*-*   - TVector3                                                        *
//*-*   - TRotation                                                       *
//*-*   - TLorentzVector                                                  *
//*-*   - TLorentzRotation                                                *
//*-* It is a combination of CLHEPs Vector package written by             *
//*-* Leif Lonnblad, Andreas Nilsson and Evgueni Tcherniaev               *
//*-* and a ROOT package written by Pasha Murat.                          *
//*-* for CLHEP see:  http://wwwinfo.cern.ch/asd/lhc++/clhep/             *
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
//BEGIN_HTML <!--
/* -->
<H2>
TVector3</H2>
<TT>TVector3</TT> is a general three vector class, which can be used for
the description of different vectors in 3D.
<H3>
Declaration / Access to the components</H3>
<TT>TVector3</TT> has been implemented as a vector of three <TT>Double_t</TT>
variables, representing the cartesian coordinates. By default all components
are initialized to zero:

<P><TT>&nbsp; TVector3 v1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //
v1 = (0,0,0)</TT>
<BR><TT>&nbsp; TVector3 v3(1,2,3); // v3 = (1,2,3)</TT>
<BR><TT>&nbsp; TVector3 v4(v2);&nbsp;&nbsp;&nbsp; // v4 = v2</TT>

<P>It is also possible (but not recommended) to initialize a <TT>TVector3</TT>
with a <TT>Double_t</TT> or <TT>Float_t</TT> C array.

<P>You can get the basic components either by name or by index using <TT>operator()</TT>:

<P><TT>&nbsp; xx = v1.X();&nbsp;&nbsp;&nbsp; or&nbsp;&nbsp;&nbsp; xx =
v1(0);</TT>
<BR><TT>&nbsp; yy = v1.Y();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
yy = v1(1);</TT>
<BR><TT>&nbsp; zz = v1.Z();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
zz = v1(2);</TT>

<P>The memberfunctions <TT>SetX()</TT>, <TT>SetY()</TT>, <TT>SetZ()</TT>
and<TT> SetXYZ()</TT> allow to set the components:

<P><TT>&nbsp; v1.SetX(1.); v1.SetY(2.); v1.SetZ(3.);</TT>
<BR><TT>&nbsp; v1.SetXYZ(1.,2.,3.);</TT>
<BR>&nbsp;
<H3>
Noncartesian coordinates</H3>
To get information on the <TT>TVector3</TT> in spherical (rho,phi,theta)
or cylindrical (z,r,theta) coordinates, the
<BR>the member functions <TT>Mag()</TT> (=magnitude=rho in spherical coordinates),
<TT>Mag2()</TT>, <TT>Theta()</TT>, <TT>CosTheta()</TT>, <TT>Phi()</TT>,
<TT>Perp()</TT> (the transverse component=r in cylindrical coordinates),
<TT>Perp2()</TT> can be used:

<P><TT>&nbsp; Double_t m&nbsp; = v.Mag();&nbsp;&nbsp;&nbsp; // get magnitude
(=rho=Sqrt(x*x+y*y+z*z)))</TT>
<BR><TT>&nbsp; Double_t m2 = v.Mag2();&nbsp;&nbsp; // get magnitude squared</TT>
<BR><TT>&nbsp; Double_t t&nbsp; = v.Theta();&nbsp; // get polar angle</TT>
<BR><TT>&nbsp; Double_t ct = v.CosTheta();// get cos of theta</TT>
<BR><TT>&nbsp; Double_t p&nbsp; = v.Phi();&nbsp;&nbsp;&nbsp; // get azimuth
angle</TT>
<BR><TT>&nbsp; Double_t pp = v.Perp();&nbsp;&nbsp; // get transverse component</TT>
<BR><TT>&nbsp; Double_t pp2= v.Perp2();&nbsp; // get transvers component
squared</TT>

<P>It is also possible to get the transverse component with respect to
another vector:

<P><TT>&nbsp; Double_t ppv1 = v.Perp(v1);</TT>
<BR><TT>&nbsp; Double_t pp2v1 = v.Perp2(v1);</TT>

<P>The pseudo-rapidity ( eta=-ln (tan (theta/2)) ) can be obtained by <TT>Eta()</TT>
or <TT>PseudoRapidity()</TT>:
<BR>&nbsp;
<BR><TT>&nbsp; Double_t eta = v.PseudoRapidity();</TT>

<P>There are set functions to change one of the noncartesian coordinates:

<P><TT>&nbsp; v.SetTheta(.5); // keeping rho and phi</TT>
<BR><TT>&nbsp; v.SetPhi(.8);&nbsp;&nbsp; // keeping rho and theta</TT>
<BR><TT>&nbsp; v.SetMag(10.);&nbsp; // keeping theta and phi</TT>
<BR><TT>&nbsp; v.SetPerp(3.);&nbsp; // keeping z and phi</TT>
<BR>&nbsp;
<H3>
Arithmetic / Comparison</H3>
The <TT>TVector3</TT> class provides the operators to add, subtract, scale and compare
vectors:

<P><TT>&nbsp; v3&nbsp; = -v1;</TT>
<BR><TT>&nbsp; v1&nbsp; = v2+v3;</TT>
<BR><TT>&nbsp; v1 += v3;</TT>
<BR><TT>&nbsp; v1&nbsp; = v1 - v3</TT>
<BR><TT>&nbsp; v1 -= v3;</TT>
<BR><TT>&nbsp; v1 *= 10;</TT>
<BR><TT>&nbsp; v1&nbsp; = 5*v2;</TT>

<P><TT>&nbsp; if(v1==v2) {...}</TT>
<BR><TT>&nbsp; if(v1!=v2) {...}</TT>
<BR>&nbsp;
<H3>
Related Vectors</H3>
<TT>&nbsp; v2 = v1.Unit();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // get unit
vector parallel to v1</TT>
<BR><TT>&nbsp; v2 = v1.Orthogonal(); // get vector orthogonal to v1</TT>
<H3>
Scalar and vector products</H3>
<TT>&nbsp; s = v1.Dot(v2);&nbsp;&nbsp; // scalar product</TT>
<BR><TT>&nbsp; s = v1 * v2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // scalar product</TT>
<BR><TT>&nbsp; v = v1.Cross(v2); // vector product</TT>
<H3>
&nbsp;Angle between two vectors</H3>
<TT>&nbsp; Double_t a = v1.Angle(v2);</TT>
<H3>
Rotations</H3>

<H5>
Rotation around axes</H5>
<TT>&nbsp; v.RotateX(.5);</TT>
<BR><TT>&nbsp; v.RotateY(TMath::Pi());</TT>
<BR><TT>&nbsp; v.RotateZ(angle);</TT>
<H5>
Rotation around a vector</H5>
<TT>&nbsp; v1.Rotate(TMath::Pi()/4, v2); // rotation around v2</TT>
<H5>
Rotation by TRotation</H5>
<TT>TVector3</TT> objects can be rotated by objects of the <TT>TRotation</TT>
class using the <TT>Transform()</TT> member functions,
<BR>the <TT>operator *=</TT> or the <TT>operator *</TT> of the TRotation
class:

<P><TT>&nbsp; TRotation m;</TT>
<BR><TT>&nbsp; ...</TT>
<BR><TT>&nbsp; v1.transform(m);</TT>
<BR><TT>&nbsp; v1 = m*v1;</TT>
<BR><TT>&nbsp; v1 *= m; // Attention v1 = m*v1</TT>
<H5>
Transformation from rotated frame</H5>
<TT>&nbsp; TVector3 direction = v.Unit()</TT>
<BR><TT>&nbsp; v1.RotateUz(direction); // direction must be TVector3 of
unit length</TT>

<P>transforms v1 from the rotated frame (z' parallel to direction, x' in
the theta plane and y' in the xy plane as well as perpendicular to the
theta plane) to the (x,y,z) frame.

<!--*/
// -->END_HTML
//

#include "TVector3.h"
#include "TRotation.h"
#include "TMath.h"
#include "TClass.h"

ClassImp(TVector3)

//______________________________________________________________________________
TVector3::TVector3()
: fX(0.0), fY(0.0), fZ(0.0) {}

TVector3::TVector3(const TVector3 & p) : TObject(p),
  fX(p.fX), fY(p.fY), fZ(p.fZ) {}

TVector3::TVector3(Double_t xx, Double_t yy, Double_t zz)
: fX(xx), fY(yy), fZ(zz) {}

TVector3::TVector3(const Double_t * x0)
: fX(x0[0]), fY(x0[1]), fZ(x0[2]) {}

TVector3::TVector3(const Float_t * x0)
: fX(x0[0]), fY(x0[1]), fZ(x0[2]) {}

TVector3::~TVector3() {}

//______________________________________________________________________________
Double_t TVector3::operator () (int i) const {
   //dereferencing operator const
   switch(i) {
      case 0:
         return fX;
      case 1:
         return fY;
      case 2:
         return fZ;
      default:
         Error("operator()(i)", "bad index (%d) returning 0",i);
   }
   return 0.;
}

//______________________________________________________________________________
Double_t & TVector3::operator () (int i) {
   //dereferencing operator
   switch(i) {
      case 0:
         return fX;
      case 1:
         return fY;
      case 2:
         return fZ;
      default:
         Error("operator()(i)", "bad index (%d) returning &fX",i);
   }
   return fX;
}

//______________________________________________________________________________
TVector3 & TVector3::operator *= (const TRotation & m){
   //multiplication operator
   return *this = m * (*this);
}

//______________________________________________________________________________
TVector3 & TVector3::Transform(const TRotation & m) {
   //transform this vector with a TRotation
   return *this = m * (*this);
}

//______________________________________________________________________________
Double_t TVector3::Angle(const TVector3 & q) const
{
   // return the angle w.r.t. another 3-vector
   Double_t ptot2 = Mag2()*q.Mag2();
   if(ptot2 <= 0) {
      return 0.0;
   } else {
      Double_t arg = Dot(q)/TMath::Sqrt(ptot2);
      if(arg >  1.0) arg =  1.0;
      if(arg < -1.0) arg = -1.0;
      return TMath::ACos(arg);
   }
}

//______________________________________________________________________________
Double_t TVector3::Mag() const
{
   // return the magnitude (rho in spherical coordinate system)

   return TMath::Sqrt(Mag2());
}

//______________________________________________________________________________
Double_t TVector3::Perp() const
{
   //return the transverse component  (R in cylindrical coordinate system)

   return TMath::Sqrt(Perp2());
}


//______________________________________________________________________________
Double_t TVector3::Perp(const TVector3 & p) const
{
   //return the transverse component (R in cylindrical coordinate system)

   return TMath::Sqrt(Perp2(p));
}

//______________________________________________________________________________
Double_t TVector3::Phi() const
{
   //return the  azimuth angle. returns phi from -pi to pi
   return fX == 0.0 && fY == 0.0 ? 0.0 : TMath::ATan2(fY,fX);
}

//______________________________________________________________________________
Double_t TVector3::Theta() const
{
   //return the polar angle
   return fX == 0.0 && fY == 0.0 && fZ == 0.0 ? 0.0 : TMath::ATan2(Perp(),fZ);
}

//______________________________________________________________________________
TVector3 TVector3::Unit() const
{
   // return unit vector parallel to this.
   Double_t  tot2 = Mag2();
   Double_t tot = (tot2 > 0) ?  1.0/TMath::Sqrt(tot2) : 1.0;
   TVector3 p(fX*tot,fY*tot,fZ*tot);
   return p;
}

//______________________________________________________________________________
void TVector3::RotateX(Double_t angle) {
   //rotate vector around X
   Double_t s = TMath::Sin(angle);
   Double_t c = TMath::Cos(angle);
   Double_t yy = fY;
   fY = c*yy - s*fZ;
   fZ = s*yy + c*fZ;
}

//______________________________________________________________________________
void TVector3::RotateY(Double_t angle) {
   //rotate vector around Y
   Double_t s = TMath::Sin(angle);
   Double_t c = TMath::Cos(angle);
   Double_t zz = fZ;
   fZ = c*zz - s*fX;
   fX = s*zz + c*fX;
}

//______________________________________________________________________________
void TVector3::RotateZ(Double_t angle) {
   //rotate vector around Z
   Double_t s = TMath::Sin(angle);
   Double_t c = TMath::Cos(angle);
   Double_t xx = fX;
   fX = c*xx - s*fY;
   fY = s*xx + c*fY;
}

//______________________________________________________________________________
void TVector3::Rotate(Double_t angle, const TVector3 & axis){
   //rotate vector
   TRotation trans;
   trans.Rotate(angle, axis);
   operator*=(trans);
}

//______________________________________________________________________________
void TVector3::RotateUz(const TVector3& NewUzVector) {
   // NewUzVector must be normalized !

   Double_t u1 = NewUzVector.fX;
   Double_t u2 = NewUzVector.fY;
   Double_t u3 = NewUzVector.fZ;
   Double_t up = u1*u1 + u2*u2;

   if (up) {
      up = TMath::Sqrt(up);
      Double_t px = fX,  py = fY,  pz = fZ;
      fX = (u1*u3*px - u2*py + u1*up*pz)/up;
      fY = (u2*u3*px + u1*py + u2*up*pz)/up;
      fZ = (u3*u3*px -    px + u3*up*pz)/up;
   } else if (u3 < 0.) { fX = -fX; fZ = -fZ; }      // phi=0  teta=pi
   else {};
}

//______________________________________________________________________________
Double_t TVector3::PseudoRapidity() const {
   //Double_t m = Mag();
   //return 0.5*log( (m+fZ)/(m-fZ) );
   // guard against Pt=0
   double cosTheta = CosTheta();
   if (cosTheta*cosTheta < 1) return -0.5* TMath::Log( (1.0-cosTheta)/(1.0+cosTheta) );
   if (fZ == 0) return 0;
   Warning("PseudoRapidity","transvers momentum = 0! return +/- 10e10");
   if (fZ > 0) return 10e10;
   else        return -10e10;
}

//______________________________________________________________________________
void TVector3::SetPtEtaPhi(Double_t pt, Double_t eta, Double_t phi) {
   //set Pt, Eta and Phi
   Double_t apt = TMath::Abs(pt);
   SetXYZ(apt*TMath::Cos(phi), apt*TMath::Sin(phi), apt/TMath::Tan(2.0*TMath::ATan(TMath::Exp(-eta))) );
}

//______________________________________________________________________________
void TVector3::SetPtThetaPhi(Double_t pt, Double_t theta, Double_t phi) {
   //set Pt, Theta and Phi
   fX = pt * TMath::Cos(phi);
   fY = pt * TMath::Sin(phi);
   Double_t tanTheta = TMath::Tan(theta);
   fZ = tanTheta ? pt / tanTheta : 0;
}

//______________________________________________________________________________
void TVector3::SetTheta(Double_t th)
{
   // Set theta keeping mag and phi constant (BaBar).
   Double_t ma   = Mag();
   Double_t ph   = Phi();
   SetX(ma*TMath::Sin(th)*TMath::Cos(ph));
   SetY(ma*TMath::Sin(th)*TMath::Sin(ph));
   SetZ(ma*TMath::Cos(th));
}

//______________________________________________________________________________
void TVector3::SetPhi(Double_t ph)
{
   // Set phi keeping mag and theta constant (BaBar).
   Double_t xy   = Perp();
   SetX(xy*TMath::Cos(ph));
   SetY(xy*TMath::Sin(ph));
}

//______________________________________________________________________________
Double_t TVector3::DeltaR(const TVector3 & v) const
{
   //return deltaR with respect to v
   Double_t deta = Eta()-v.Eta();
   Double_t dphi = TVector2::Phi_mpi_pi(Phi()-v.Phi());
   return TMath::Sqrt( deta*deta+dphi*dphi );
}

//______________________________________________________________________________
void TVector3::SetMagThetaPhi(Double_t mag, Double_t theta, Double_t phi)
{
   //setter with mag, theta, phi
   Double_t amag = TMath::Abs(mag);
   fX = amag * TMath::Sin(theta) * TMath::Cos(phi);
   fY = amag * TMath::Sin(theta) * TMath::Sin(phi);
   fZ = amag * TMath::Cos(theta);
}

//______________________________________________________________________________
void TVector3::Streamer(TBuffer &R__b)
{
   // Stream an object of class TVector3.

   if (R__b.IsReading()) {
      UInt_t R__s, R__c;
      Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
      if (R__v > 2) {
         R__b.ReadClassBuffer(TVector3::Class(), this, R__v, R__s, R__c);
         return;
      }
      //====process old versions before automatic schema evolution
      if (R__v < 2) TObject::Streamer(R__b);
      R__b >> fX;
      R__b >> fY;
      R__b >> fZ;
      R__b.CheckByteCount(R__s, R__c, TVector3::IsA());
      //====end of old versions

   } else {
      R__b.WriteClassBuffer(TVector3::Class(),this);
   }
}

TVector3 operator + (const TVector3 & a, const TVector3 & b) {
   return TVector3(a.X() + b.X(), a.Y() + b.Y(), a.Z() + b.Z());
}

TVector3 operator - (const TVector3 & a, const TVector3 & b) {
   return TVector3(a.X() - b.X(), a.Y() - b.Y(), a.Z() - b.Z());
}

TVector3 operator * (const TVector3 & p, Double_t a) {
   return TVector3(a*p.X(), a*p.Y(), a*p.Z());
}

TVector3 operator * (Double_t a, const TVector3 & p) {
   return TVector3(a*p.X(), a*p.Y(), a*p.Z());
}

Double_t operator * (const TVector3 & a, const TVector3 & b) {
   return a.Dot(b);
}

TVector3 operator * (const TMatrix & m, const TVector3 & v ) {
   return TVector3( m(0,0)*v.X()+m(0,1)*v.Y()+m(0,2)*v.Z(),
                    m(1,0)*v.X()+m(1,1)*v.Y()+m(1,2)*v.Z(),
                    m(2,0)*v.X()+m(2,1)*v.Y()+m(2,2)*v.Z());
}


//const TVector3 kXHat(1.0, 0.0, 0.0);
//const TVector3 kYHat(0.0, 1.0, 0.0);
//const TVector3 kZHat(0.0, 0.0, 1.0);

void TVector3::Print(Option_t*)const
{
   //print vector parameters
   Printf("%s %s (x,y,z)=(%f,%f,%f) (rho,theta,phi)=(%f,%f,%f)",GetName(),GetTitle(),X(),Y(),Z(),
                                          Mag(),Theta()*TMath::RadToDeg(),Phi()*TMath::RadToDeg());
}
 TVector3.cxx:1
 TVector3.cxx:2
 TVector3.cxx:3
 TVector3.cxx:4
 TVector3.cxx:5
 TVector3.cxx:6
 TVector3.cxx:7
 TVector3.cxx:8
 TVector3.cxx:9
 TVector3.cxx:10
 TVector3.cxx:11
 TVector3.cxx:12
 TVector3.cxx:13
 TVector3.cxx:14
 TVector3.cxx:15
 TVector3.cxx:16
 TVector3.cxx:17
 TVector3.cxx:18
 TVector3.cxx:19
 TVector3.cxx:20
 TVector3.cxx:21
 TVector3.cxx:22
 TVector3.cxx:23
 TVector3.cxx:24
 TVector3.cxx:25
 TVector3.cxx:26
 TVector3.cxx:27
 TVector3.cxx:28
 TVector3.cxx:29
 TVector3.cxx:30
 TVector3.cxx:31
 TVector3.cxx:32
 TVector3.cxx:33
 TVector3.cxx:34
 TVector3.cxx:35
 TVector3.cxx:36
 TVector3.cxx:37
 TVector3.cxx:38
 TVector3.cxx:39
 TVector3.cxx:40
 TVector3.cxx:41
 TVector3.cxx:42
 TVector3.cxx:43
 TVector3.cxx:44
 TVector3.cxx:45
 TVector3.cxx:46
 TVector3.cxx:47
 TVector3.cxx:48
 TVector3.cxx:49
 TVector3.cxx:50
 TVector3.cxx:51
 TVector3.cxx:52
 TVector3.cxx:53
 TVector3.cxx:54
 TVector3.cxx:55
 TVector3.cxx:56
 TVector3.cxx:57
 TVector3.cxx:58
 TVector3.cxx:59
 TVector3.cxx:60
 TVector3.cxx:61
 TVector3.cxx:62
 TVector3.cxx:63
 TVector3.cxx:64
 TVector3.cxx:65
 TVector3.cxx:66
 TVector3.cxx:67
 TVector3.cxx:68
 TVector3.cxx:69
 TVector3.cxx:70
 TVector3.cxx:71
 TVector3.cxx:72
 TVector3.cxx:73
 TVector3.cxx:74
 TVector3.cxx:75
 TVector3.cxx:76
 TVector3.cxx:77
 TVector3.cxx:78
 TVector3.cxx:79
 TVector3.cxx:80
 TVector3.cxx:81
 TVector3.cxx:82
 TVector3.cxx:83
 TVector3.cxx:84
 TVector3.cxx:85
 TVector3.cxx:86
 TVector3.cxx:87
 TVector3.cxx:88
 TVector3.cxx:89
 TVector3.cxx:90
 TVector3.cxx:91
 TVector3.cxx:92
 TVector3.cxx:93
 TVector3.cxx:94
 TVector3.cxx:95
 TVector3.cxx:96
 TVector3.cxx:97
 TVector3.cxx:98
 TVector3.cxx:99
 TVector3.cxx:100
 TVector3.cxx:101
 TVector3.cxx:102
 TVector3.cxx:103
 TVector3.cxx:104
 TVector3.cxx:105
 TVector3.cxx:106
 TVector3.cxx:107
 TVector3.cxx:108
 TVector3.cxx:109
 TVector3.cxx:110
 TVector3.cxx:111
 TVector3.cxx:112
 TVector3.cxx:113
 TVector3.cxx:114
 TVector3.cxx:115
 TVector3.cxx:116
 TVector3.cxx:117
 TVector3.cxx:118
 TVector3.cxx:119
 TVector3.cxx:120
 TVector3.cxx:121
 TVector3.cxx:122
 TVector3.cxx:123
 TVector3.cxx:124
 TVector3.cxx:125
 TVector3.cxx:126
 TVector3.cxx:127
 TVector3.cxx:128
 TVector3.cxx:129
 TVector3.cxx:130
 TVector3.cxx:131
 TVector3.cxx:132
 TVector3.cxx:133
 TVector3.cxx:134
 TVector3.cxx:135
 TVector3.cxx:136
 TVector3.cxx:137
 TVector3.cxx:138
 TVector3.cxx:139
 TVector3.cxx:140
 TVector3.cxx:141
 TVector3.cxx:142
 TVector3.cxx:143
 TVector3.cxx:144
 TVector3.cxx:145
 TVector3.cxx:146
 TVector3.cxx:147
 TVector3.cxx:148
 TVector3.cxx:149
 TVector3.cxx:150
 TVector3.cxx:151
 TVector3.cxx:152
 TVector3.cxx:153
 TVector3.cxx:154
 TVector3.cxx:155
 TVector3.cxx:156
 TVector3.cxx:157
 TVector3.cxx:158
 TVector3.cxx:159
 TVector3.cxx:160
 TVector3.cxx:161
 TVector3.cxx:162
 TVector3.cxx:163
 TVector3.cxx:164
 TVector3.cxx:165
 TVector3.cxx:166
 TVector3.cxx:167
 TVector3.cxx:168
 TVector3.cxx:169
 TVector3.cxx:170
 TVector3.cxx:171
 TVector3.cxx:172
 TVector3.cxx:173
 TVector3.cxx:174
 TVector3.cxx:175
 TVector3.cxx:176
 TVector3.cxx:177
 TVector3.cxx:178
 TVector3.cxx:179
 TVector3.cxx:180
 TVector3.cxx:181
 TVector3.cxx:182
 TVector3.cxx:183
 TVector3.cxx:184
 TVector3.cxx:185
 TVector3.cxx:186
 TVector3.cxx:187
 TVector3.cxx:188
 TVector3.cxx:189
 TVector3.cxx:190
 TVector3.cxx:191
 TVector3.cxx:192
 TVector3.cxx:193
 TVector3.cxx:194
 TVector3.cxx:195
 TVector3.cxx:196
 TVector3.cxx:197
 TVector3.cxx:198
 TVector3.cxx:199
 TVector3.cxx:200
 TVector3.cxx:201
 TVector3.cxx:202
 TVector3.cxx:203
 TVector3.cxx:204
 TVector3.cxx:205
 TVector3.cxx:206
 TVector3.cxx:207
 TVector3.cxx:208
 TVector3.cxx:209
 TVector3.cxx:210
 TVector3.cxx:211
 TVector3.cxx:212
 TVector3.cxx:213
 TVector3.cxx:214
 TVector3.cxx:215
 TVector3.cxx:216
 TVector3.cxx:217
 TVector3.cxx:218
 TVector3.cxx:219
 TVector3.cxx:220
 TVector3.cxx:221
 TVector3.cxx:222
 TVector3.cxx:223
 TVector3.cxx:224
 TVector3.cxx:225
 TVector3.cxx:226
 TVector3.cxx:227
 TVector3.cxx:228
 TVector3.cxx:229
 TVector3.cxx:230
 TVector3.cxx:231
 TVector3.cxx:232
 TVector3.cxx:233
 TVector3.cxx:234
 TVector3.cxx:235
 TVector3.cxx:236
 TVector3.cxx:237
 TVector3.cxx:238
 TVector3.cxx:239
 TVector3.cxx:240
 TVector3.cxx:241
 TVector3.cxx:242
 TVector3.cxx:243
 TVector3.cxx:244
 TVector3.cxx:245
 TVector3.cxx:246
 TVector3.cxx:247
 TVector3.cxx:248
 TVector3.cxx:249
 TVector3.cxx:250
 TVector3.cxx:251
 TVector3.cxx:252
 TVector3.cxx:253
 TVector3.cxx:254
 TVector3.cxx:255
 TVector3.cxx:256
 TVector3.cxx:257
 TVector3.cxx:258
 TVector3.cxx:259
 TVector3.cxx:260
 TVector3.cxx:261
 TVector3.cxx:262
 TVector3.cxx:263
 TVector3.cxx:264
 TVector3.cxx:265
 TVector3.cxx:266
 TVector3.cxx:267
 TVector3.cxx:268
 TVector3.cxx:269
 TVector3.cxx:270
 TVector3.cxx:271
 TVector3.cxx:272
 TVector3.cxx:273
 TVector3.cxx:274
 TVector3.cxx:275
 TVector3.cxx:276
 TVector3.cxx:277
 TVector3.cxx:278
 TVector3.cxx:279
 TVector3.cxx:280
 TVector3.cxx:281
 TVector3.cxx:282
 TVector3.cxx:283
 TVector3.cxx:284
 TVector3.cxx:285
 TVector3.cxx:286
 TVector3.cxx:287
 TVector3.cxx:288
 TVector3.cxx:289
 TVector3.cxx:290
 TVector3.cxx:291
 TVector3.cxx:292
 TVector3.cxx:293
 TVector3.cxx:294
 TVector3.cxx:295
 TVector3.cxx:296
 TVector3.cxx:297
 TVector3.cxx:298
 TVector3.cxx:299
 TVector3.cxx:300
 TVector3.cxx:301
 TVector3.cxx:302
 TVector3.cxx:303
 TVector3.cxx:304
 TVector3.cxx:305
 TVector3.cxx:306
 TVector3.cxx:307
 TVector3.cxx:308
 TVector3.cxx:309
 TVector3.cxx:310
 TVector3.cxx:311
 TVector3.cxx:312
 TVector3.cxx:313
 TVector3.cxx:314
 TVector3.cxx:315
 TVector3.cxx:316
 TVector3.cxx:317
 TVector3.cxx:318
 TVector3.cxx:319
 TVector3.cxx:320
 TVector3.cxx:321
 TVector3.cxx:322
 TVector3.cxx:323
 TVector3.cxx:324
 TVector3.cxx:325
 TVector3.cxx:326
 TVector3.cxx:327
 TVector3.cxx:328
 TVector3.cxx:329
 TVector3.cxx:330
 TVector3.cxx:331
 TVector3.cxx:332
 TVector3.cxx:333
 TVector3.cxx:334
 TVector3.cxx:335
 TVector3.cxx:336
 TVector3.cxx:337
 TVector3.cxx:338
 TVector3.cxx:339
 TVector3.cxx:340
 TVector3.cxx:341
 TVector3.cxx:342
 TVector3.cxx:343
 TVector3.cxx:344
 TVector3.cxx:345
 TVector3.cxx:346
 TVector3.cxx:347
 TVector3.cxx:348
 TVector3.cxx:349
 TVector3.cxx:350
 TVector3.cxx:351
 TVector3.cxx:352
 TVector3.cxx:353
 TVector3.cxx:354
 TVector3.cxx:355
 TVector3.cxx:356
 TVector3.cxx:357
 TVector3.cxx:358
 TVector3.cxx:359
 TVector3.cxx:360
 TVector3.cxx:361
 TVector3.cxx:362
 TVector3.cxx:363
 TVector3.cxx:364
 TVector3.cxx:365
 TVector3.cxx:366
 TVector3.cxx:367
 TVector3.cxx:368
 TVector3.cxx:369
 TVector3.cxx:370
 TVector3.cxx:371
 TVector3.cxx:372
 TVector3.cxx:373
 TVector3.cxx:374
 TVector3.cxx:375
 TVector3.cxx:376
 TVector3.cxx:377
 TVector3.cxx:378
 TVector3.cxx:379
 TVector3.cxx:380
 TVector3.cxx:381
 TVector3.cxx:382
 TVector3.cxx:383
 TVector3.cxx:384
 TVector3.cxx:385
 TVector3.cxx:386
 TVector3.cxx:387
 TVector3.cxx:388
 TVector3.cxx:389
 TVector3.cxx:390
 TVector3.cxx:391
 TVector3.cxx:392
 TVector3.cxx:393
 TVector3.cxx:394
 TVector3.cxx:395
 TVector3.cxx:396
 TVector3.cxx:397
 TVector3.cxx:398
 TVector3.cxx:399
 TVector3.cxx:400
 TVector3.cxx:401
 TVector3.cxx:402
 TVector3.cxx:403
 TVector3.cxx:404
 TVector3.cxx:405
 TVector3.cxx:406
 TVector3.cxx:407
 TVector3.cxx:408
 TVector3.cxx:409
 TVector3.cxx:410
 TVector3.cxx:411
 TVector3.cxx:412
 TVector3.cxx:413
 TVector3.cxx:414
 TVector3.cxx:415
 TVector3.cxx:416
 TVector3.cxx:417
 TVector3.cxx:418
 TVector3.cxx:419
 TVector3.cxx:420
 TVector3.cxx:421
 TVector3.cxx:422
 TVector3.cxx:423
 TVector3.cxx:424
 TVector3.cxx:425
 TVector3.cxx:426
 TVector3.cxx:427
 TVector3.cxx:428
 TVector3.cxx:429
 TVector3.cxx:430
 TVector3.cxx:431
 TVector3.cxx:432
 TVector3.cxx:433
 TVector3.cxx:434
 TVector3.cxx:435
 TVector3.cxx:436
 TVector3.cxx:437
 TVector3.cxx:438
 TVector3.cxx:439
 TVector3.cxx:440
 TVector3.cxx:441
 TVector3.cxx:442
 TVector3.cxx:443
 TVector3.cxx:444
 TVector3.cxx:445
 TVector3.cxx:446
 TVector3.cxx:447
 TVector3.cxx:448
 TVector3.cxx:449
 TVector3.cxx:450
 TVector3.cxx:451
 TVector3.cxx:452
 TVector3.cxx:453
 TVector3.cxx:454
 TVector3.cxx:455
 TVector3.cxx:456
 TVector3.cxx:457
 TVector3.cxx:458
 TVector3.cxx:459
 TVector3.cxx:460
 TVector3.cxx:461
 TVector3.cxx:462
 TVector3.cxx:463
 TVector3.cxx:464
 TVector3.cxx:465
 TVector3.cxx:466
 TVector3.cxx:467
 TVector3.cxx:468
 TVector3.cxx:469
 TVector3.cxx:470
 TVector3.cxx:471
 TVector3.cxx:472
 TVector3.cxx:473
 TVector3.cxx:474
 TVector3.cxx:475
 TVector3.cxx:476
 TVector3.cxx:477
 TVector3.cxx:478
 TVector3.cxx:479
 TVector3.cxx:480
 TVector3.cxx:481