```// @(#)root/eve:\$Id\$
// Author: Matevz Tadel 2007

/*************************************************************************
* Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
*                                                                       *
* For the licensing terms see \$ROOTSYS/LICENSE.                         *
* For the list of contributors see \$ROOTSYS/README/CREDITS.             *
*************************************************************************/

#include "TEveVector.h"
#include "TVector3.h"

//==============================================================================
// TEveVector
//==============================================================================

//______________________________________________________________________________
//
// Minimal, templated three-vector.
// No TObject inheritance and virtual functions.
// Also used in VSD.

ClassImp(TEveVectorT<Float_t>);
ClassImp(TEveVectorT<Double_t>);

//______________________________________________________________________________
template<typename TT> void TEveVectorT<TT>::Dump() const
{
// Dump to stdout as "(x, y, z)\n".

printf("(%f, %f, %f)\n", fX, fY, fZ);
}

//______________________________________________________________________________
template<typename TT> void TEveVectorT<TT>::Set(const TVector3& v)
{
// Set from TVector3.

fX = v.x(); fY = v.y(); fZ = v.z();
}

//______________________________________________________________________________
template<typename TT> TT TEveVectorT<TT>::Eta() const
{
// Calculate eta of the point, pretending it's a momentum vector.

TT cosTheta = CosTheta();
if (cosTheta*cosTheta < 1) return -0.5* TMath::Log( (1.0-cosTheta)/(1.0+cosTheta) );
Warning("Eta","transverse momentum = 0, returning +/- 1e10");
return (fZ >= 0) ? 1e10 : -1e10;
}

//______________________________________________________________________________
template<typename TT> TT TEveVectorT<TT>::Normalize(TT length)
{
// Normalize the vector to length if current length is non-zero.
// Returns the old magnitude.

TT m = Mag();
if (m != 0)
{
length /= m;
fX *= length; fY *= length; fZ *= length;
}
return m;
}

//______________________________________________________________________________
template<typename TT> TEveVectorT<TT> TEveVectorT<TT>::Orthogonal() const
{
// Returns an orthogonal vector (not normalized).

Float_t xx = fX < 0 ? -fX : fX;
Float_t yy = fY < 0 ? -fY : fY;
Float_t zz = fZ < 0 ? -fZ : fZ;
if (xx < yy) {
return xx < zz ? TEveVectorT<TT>(0,fZ,-fY) : TEveVectorT<TT>(fY,-fX,0);
} else {
return yy < zz ? TEveVectorT<TT>(-fZ,0,fX) : TEveVectorT<TT>(fY,-fX,0);
}
}

//______________________________________________________________________________
template<typename TT> void TEveVectorT<TT>::OrthoNormBase(TEveVectorT<TT>& a, TEveVectorT<TT>& b) const
{
// Set vectors a and b to be normal to this and among themselves,
// both of length 1.

a = Orthogonal();
TMath::Cross(this->Arr(), a.Arr(), b.Arr());
a.Normalize();
b.Normalize();
}

template class TEveVectorT<Float_t>;
template class TEveVectorT<Double_t>;

//==============================================================================
// TEveVector4
//==============================================================================

//______________________________________________________________________________
//
// Minimal, templated four-vector.
// No TObject inheritance and virtual functions.
// Also used in VSD.

ClassImp(TEveVector4T<Float_t>);
ClassImp(TEveVector4T<Double_t>);

//______________________________________________________________________________
template<typename TT> void TEveVector4T<TT>::Dump() const
{
// Dump to stdout as "(x, y, z; t)\n".

printf("(%f, %f, %f; %f)\n", TP::fX, TP::fY, TP::fZ, fT);
}

template class TEveVector4T<Float_t>;
template class TEveVector4T<Double_t>;

//==============================================================================
// TEveVector2T
//==============================================================================

//______________________________________________________________________________
//
// Minimal, templated two-vector.
// No TObject inheritance and virtual functions.
// Also used in VSD.

ClassImp(TEveVector2T<Float_t>);
ClassImp(TEveVector2T<Double_t>);

//______________________________________________________________________________
template<typename TT> void TEveVector2T<TT>::Normalize(TT length)
{
// Normalize the vector to length if current length is non-zero.

Float_t m = Mag();
if (m != 0)
{
m = length / m;
fX *= m; fY *= m;
}
}

//______________________________________________________________________________
template<typename TT> void TEveVector2T<TT>::Dump() const
{
// Dump to stdout as "(x, y)\n".

printf("(%f, %f)\n", fX, fY);
}

template class TEveVector2T<Float_t>;
template class TEveVector2T<Double_t>;
```
TEveVector.cxx:1
TEveVector.cxx:2
TEveVector.cxx:3
TEveVector.cxx:4
TEveVector.cxx:5
TEveVector.cxx:6
TEveVector.cxx:7
TEveVector.cxx:8
TEveVector.cxx:9
TEveVector.cxx:10
TEveVector.cxx:11
TEveVector.cxx:12
TEveVector.cxx:13
TEveVector.cxx:14
TEveVector.cxx:15
TEveVector.cxx:16
TEveVector.cxx:17
TEveVector.cxx:18
TEveVector.cxx:19
TEveVector.cxx:20
TEveVector.cxx:21
TEveVector.cxx:22
TEveVector.cxx:23
TEveVector.cxx:24
TEveVector.cxx:25
TEveVector.cxx:26
TEveVector.cxx:27
TEveVector.cxx:28
TEveVector.cxx:29
TEveVector.cxx:30
TEveVector.cxx:31
TEveVector.cxx:32
TEveVector.cxx:33
TEveVector.cxx:34
TEveVector.cxx:35
TEveVector.cxx:36
TEveVector.cxx:37
TEveVector.cxx:38
TEveVector.cxx:39
TEveVector.cxx:40
TEveVector.cxx:41
TEveVector.cxx:42
TEveVector.cxx:43
TEveVector.cxx:44
TEveVector.cxx:45
TEveVector.cxx:46
TEveVector.cxx:47
TEveVector.cxx:48
TEveVector.cxx:49
TEveVector.cxx:50
TEveVector.cxx:51
TEveVector.cxx:52
TEveVector.cxx:53
TEveVector.cxx:54
TEveVector.cxx:55
TEveVector.cxx:56
TEveVector.cxx:57
TEveVector.cxx:58
TEveVector.cxx:59
TEveVector.cxx:60
TEveVector.cxx:61
TEveVector.cxx:62
TEveVector.cxx:63
TEveVector.cxx:64
TEveVector.cxx:65
TEveVector.cxx:66
TEveVector.cxx:67
TEveVector.cxx:68
TEveVector.cxx:69
TEveVector.cxx:70
TEveVector.cxx:71
TEveVector.cxx:72
TEveVector.cxx:73
TEveVector.cxx:74
TEveVector.cxx:75
TEveVector.cxx:76
TEveVector.cxx:77
TEveVector.cxx:78
TEveVector.cxx:79
TEveVector.cxx:80
TEveVector.cxx:81
TEveVector.cxx:82
TEveVector.cxx:83
TEveVector.cxx:84
TEveVector.cxx:85
TEveVector.cxx:86
TEveVector.cxx:87
TEveVector.cxx:88
TEveVector.cxx:89
TEveVector.cxx:90
TEveVector.cxx:91
TEveVector.cxx:92
TEveVector.cxx:93
TEveVector.cxx:94
TEveVector.cxx:95
TEveVector.cxx:96
TEveVector.cxx:97
TEveVector.cxx:98
TEveVector.cxx:99
TEveVector.cxx:100
TEveVector.cxx:101
TEveVector.cxx:102
TEveVector.cxx:103
TEveVector.cxx:104
TEveVector.cxx:105
TEveVector.cxx:106
TEveVector.cxx:107
TEveVector.cxx:108
TEveVector.cxx:109
TEveVector.cxx:110
TEveVector.cxx:111
TEveVector.cxx:112
TEveVector.cxx:113
TEveVector.cxx:114
TEveVector.cxx:115
TEveVector.cxx:116
TEveVector.cxx:117
TEveVector.cxx:118
TEveVector.cxx:119
TEveVector.cxx:120
TEveVector.cxx:121
TEveVector.cxx:122
TEveVector.cxx:123
TEveVector.cxx:124
TEveVector.cxx:125
TEveVector.cxx:126
TEveVector.cxx:127
TEveVector.cxx:128
TEveVector.cxx:129
TEveVector.cxx:130
TEveVector.cxx:131
TEveVector.cxx:132
TEveVector.cxx:133
TEveVector.cxx:134
TEveVector.cxx:135
TEveVector.cxx:136
TEveVector.cxx:137
TEveVector.cxx:138
TEveVector.cxx:139
TEveVector.cxx:140
TEveVector.cxx:141
TEveVector.cxx:142
TEveVector.cxx:143
TEveVector.cxx:144
TEveVector.cxx:145
TEveVector.cxx:146
TEveVector.cxx:147
TEveVector.cxx:148
TEveVector.cxx:149
TEveVector.cxx:150
TEveVector.cxx:151
TEveVector.cxx:152
TEveVector.cxx:153
TEveVector.cxx:154
TEveVector.cxx:155
TEveVector.cxx:156
TEveVector.cxx:157
TEveVector.cxx:158
TEveVector.cxx:159
TEveVector.cxx:160
TEveVector.cxx:161