// @(#)root/eve:$Id$
// Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

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

#include "TEveTrans.h"
#include "TEveUtil.h"

#include "TMath.h"
#include "TClass.h"

#include "Riostream.h"

#include <cctype>

#define F00  0
#define F01  4
#define F02  8
#define F03 12

#define F10  1
#define F11  5
#define F12  9
#define F13 13

#define F20  2
#define F21  6
#define F22 10
#define F23 14

#define F30  3
#define F31  7
#define F32 11
#define F33 15

//______________________________________________________________________________
//
// TEveTrans is a 4x4 transformation matrix for homogeneous coordinates
// stored internaly in a column-major order to allow direct usage by
// GL. The element type is Double32_t as statically the floats would
// be precise enough but continuous operations on the matrix must
// retain precision of column vectors.
//
// Cartan angles are stored in fA[1-3] (+z, -y, +x). They are
// recalculated on demand.
//
// Direct  element access (first two should be used with care):
// operator[i]    direct access to elements,   i:0->15
// CM(i,j)        element 4*j + i;           i,j:0->3    { CM ~ c-matrix }
// operator(i,j)  element 4*(j-1) + i - 1    i,j:1->4
//
// Column-vector access:
// USet Get/SetBaseVec(), Get/SetPos() and Arr[XYZT]() methods.
//
// For all methods taking the matrix indices:
// 1->X, 2->Y, 3->Z; 4->Position (if applicable). 0 reserved for time.
//
// Shorthands in method-names:
// LF ~ LocalFrame; PF ~ ParentFrame; IP ~ InPlace

ClassImp(TEveTrans);

//______________________________________________________________________________
TEveTrans::TEveTrans() :
   TObject(),
   fA1(0), fA2(0), fA3(0), fAsOK(kFALSE),
   fUseTrans (kTRUE),
   fEditTrans(kFALSE),
   fEditRotation(kTRUE),
   fEditScale(kTRUE)
{
   // Default constructor.

   UnitTrans();
}

//______________________________________________________________________________
TEveTrans::TEveTrans(const TEveTrans& t) :
   TObject(),
   fA1(t.fA1), fA2(t.fA2), fA3(t.fA3), fAsOK(t.fAsOK),
   fUseTrans (t.fUseTrans),
   fEditTrans(t.fEditTrans),
   fEditRotation(kTRUE),
   fEditScale(kTRUE)
{
   // Constructor.

   SetTrans(t, kFALSE);
}

//______________________________________________________________________________
TEveTrans::TEveTrans(const Double_t arr[16]) :
   TObject(),
   fA1(0), fA2(0), fA3(0), fAsOK(kFALSE),
   fUseTrans (kTRUE),
   fEditTrans(kFALSE),
   fEditRotation(kTRUE),
   fEditScale(kTRUE)
{
   // Constructor.

   SetFromArray(arr);
}

//______________________________________________________________________________
TEveTrans::TEveTrans(const Float_t arr[16]) :
   TObject(),
   fA1(0), fA2(0), fA3(0), fAsOK(kFALSE),
   fUseTrans (kTRUE),
   fEditTrans(kFALSE),
   fEditRotation(kTRUE),
   fEditScale(kTRUE)
{
   // Constructor.

   SetFromArray(arr);
}

/******************************************************************************/

//______________________________________________________________________________
void TEveTrans::UnitTrans()
{
   // Reset matrix to unity.

   memset(fM, 0, 16*sizeof(Double_t));
   fM[F00] = fM[F11] = fM[F22] = fM[F33] = 1;
   fA1 = fA2 = fA3 = 0;
   fAsOK = kTRUE;
}

//______________________________________________________________________________
void TEveTrans::ZeroTrans(Double_t w)
{
   // Reset matrix to zero, only the perspective scaling is set to w
   // (1 by default).

   memset(fM, 0, 16*sizeof(Double_t));
   fM[F33] = w;
   fA1 = fA2 = fA3 = 0;
   fAsOK = kFALSE;
}

//______________________________________________________________________________
void TEveTrans::UnitRot()
{
   // Reset rotation part of the matrix to unity.

   memset(fM, 0, 12*sizeof(Double_t));
   fM[F00] = fM[F11] = fM[F22] = 1;
   fA1 = fA2 = fA3 = 0;
   fAsOK = kTRUE;
}

//______________________________________________________________________________
void TEveTrans::SetTrans(const TEveTrans& t, Bool_t copyAngles)
{
   // Set matrix from another,

   memcpy(fM, t.fM, sizeof(fM));
   if (copyAngles && t.fAsOK) {
      fAsOK = kTRUE;
      fA1 = t.fA1; fA2 = t.fA2; fA3 = t.fA3;
   } else {
      fAsOK = kFALSE;
   }
}

//______________________________________________________________________________
void TEveTrans::SetFromArray(const Double_t arr[16])
{
   // Set matrix from Double_t array.

   for(Int_t i=0; i<16; ++i) fM[i] = arr[i];
   fAsOK = kFALSE;
}

//______________________________________________________________________________
void TEveTrans::SetFromArray(const Float_t arr[16])
{
   // Set matrix from Float_t array.

   for(Int_t i=0; i<16; ++i) fM[i] = arr[i];
   fAsOK = kFALSE;
}

//______________________________________________________________________________
void TEveTrans::SetupRotation(Int_t i, Int_t j, Double_t f)
{
   // Setup the matrix as an elementary rotation.
   // Optimized versions of left/right multiplication with an elementary
   // rotation matrix are implemented in RotatePF/RotateLF.
   // Expects identity matrix.

   if(i == j) return;
   TEveTrans& t = *this;
   t(i,i) = t(j,j) = TMath::Cos(f);
   Double_t s = TMath::Sin(f);
   t(i,j) = -s; t(j,i) = s;
   fAsOK = kFALSE;
}

//______________________________________________________________________________
void TEveTrans::SetupFromToVec(const TEveVector& from, const TEveVector& to)
{
   // A function for creating a rotation matrix that rotates a vector called
   // "from" into another vector called "to".
   // Input : from[3], to[3] which both must be *normalized* non-zero vectors
   // Output: mtx[3][3] -- a 3x3 matrix in colum-major form
   // Authors: Tomas Möller, John Hughes
   //          "Efficiently Building a Matrix to Rotate One Vector to Another"
   //          Journal of Graphics Tools, 4(4):1-4, 1999

   static const float kFromToEpsilon = 0.000001f;

   ZeroTrans();

   Float_t e, f;
   e = from.Dot(to);
   f = (e < 0.0f) ? -e : e;

   if (f > 1.0f - kFromToEpsilon) /* "from" and "to"-vector almost parallel */
   {
      TEveVector u, v;       /* temporary storage vectors */
      TEveVector x;          /* vector most nearly orthogonal to "from" */
      Float_t    c1, c2, c3; /* coefficients for later use */

      x.fX = (from.fX > 0.0f) ? from.fX : -from.fX;
      x.fY = (from.fY > 0.0f) ? from.fY : -from.fY;
      x.fZ = (from.fZ > 0.0f) ? from.fZ : -from.fZ;

      if (x.fX < x.fY)
      {
         if (x.fX < x.fZ) {
            x.fX = 1.0f; x.fY = x.fZ = 0.0f;
         } else {
            x.fZ = 1.0f; x.fX = x.fY = 0.0f;
         }
      }
      else
      {
         if (x.fY < x.fZ) {
            x.fY = 1.0f; x.fX = x.fZ = 0.0f;
         } else {
            x.fZ = 1.0f; x.fX = x.fY = 0.0f;
         }
      }

      u.Sub(x, from);
      v.Sub(x, to);

      c1 = 2.0f / u.Mag2();
      c2 = 2.0f / v.Mag2();
      c3 = c1 * c2  * u.Dot(v);

      for (int i = 0; i < 3; i++) {
         for (int j = 0; j < 3; j++) {
            CM(i, j) =  - c1 * u[i] * u[j]
               - c2 * v[i] * v[j]
               + c3 * v[i] * u[j];
         }
         CM(i, i) += 1.0;
      }
   }
   else  /* the most common case, unless "from"="to", or "from"=-"to" */
   {
      TEveVector v = from.Cross(to);

      Float_t h, hvx, hvz, hvxy, hvxz, hvyz;
      h   = 1.0f/(1.0f + e);
      hvx = h * v.fX;
      hvz = h * v.fZ;
      hvxy = hvx * v.fY;
      hvxz = hvx * v.fZ;
      hvyz = hvz * v.fY;

      CM(0, 0) = e + hvx * v.fX;
      CM(0, 1) = hvxy - v.fZ;
      CM(0, 2) = hvxz + v.fY;

      CM(1, 0) = hvxy + v.fZ;
      CM(1, 1) = e + h * v.fY * v.fY;
      CM(1, 2) = hvyz - v.fX;

      CM(2, 0) = hvxz - v.fY;
      CM(2, 1) = hvyz + v.fX;
      CM(2, 2) = e + hvz * v.fZ;
   }
}

/******************************************************************************/

// OrtoNorm3 and Invert are near the bottom.

/******************************************************************************/

//______________________________________________________________________________
void TEveTrans::MultLeft(const TEveTrans& t)
{
   // Multiply from left: this = t * this.

   Double_t  buf[4];
   Double_t* col = fM;
   for(int c=0; c<4; ++c, col+=4) {
      const Double_t* row = t.fM;
      for(int r=0; r<4; ++r, ++row)
         buf[r] = row[0]*col[0] + row[4]*col[1] + row[8]*col[2] + row[12]*col[3];
      col[0] = buf[0]; col[1] = buf[1]; col[2] = buf[2]; col[3] = buf[3];
   }
   fAsOK = kFALSE;
}

//______________________________________________________________________________
void TEveTrans::MultRight(const TEveTrans& t)
{
   // Multiply from right: this = this * t.

   Double_t  buf[4];
   Double_t* row = fM;
   for(int r=0; r<4; ++r, ++row) {
      const Double_t* col = t.fM;
      for(int c=0; c<4; ++c, col+=4)
         buf[c] = row[0]*col[0] + row[4]*col[1] + row[8]*col[2] + row[12]*col[3];
      row[0] = buf[0]; row[4] = buf[1]; row[8] = buf[2]; row[12] = buf[3];
   }
   fAsOK = kFALSE;
}

//______________________________________________________________________________
TEveTrans TEveTrans::operator*(const TEveTrans& t)
{
   // Copy, multiply from right and return product.
   // Avoid unless necessary.

   TEveTrans b(*this);
   b.MultRight(t);
   return b;
}

/******************************************************************************/

//______________________________________________________________________________
void TEveTrans::TransposeRotationPart()
{
   // Transpose 3x3 rotation sub-matrix.

   Double_t x;
   x = fM[F01]; fM[F01] = fM[F10]; fM[F10] = x;
   x = fM[F02]; fM[F02] = fM[F20]; fM[F20] = x;
   x = fM[F12]; fM[F12] = fM[F21]; fM[F21] = x;
   fAsOK = kFALSE;
}

/******************************************************************************/
// Move & Rotate
/******************************************************************************/

//______________________________________________________________________________
void TEveTrans::MoveLF(Int_t ai, Double_t amount)
{
   // Move in local-frame along axis with index ai.

   const Double_t *col = fM + 4*--ai;
   fM[F03] += amount*col[0]; fM[F13] += amount*col[1]; fM[F23] += amount*col[2];
}

//______________________________________________________________________________
void TEveTrans::Move3LF(Double_t x, Double_t y, Double_t z)
{
   // General move in local-frame.

   fM[F03] += x*fM[0] + y*fM[4] + z*fM[8];
   fM[F13] += x*fM[1] + y*fM[5] + z*fM[9];
   fM[F23] += x*fM[2] + y*fM[6] + z*fM[10];
}

//______________________________________________________________________________
void TEveTrans::RotateLF(Int_t i1, Int_t i2, Double_t amount)
{
   // Rotate in local frame. Does optimised version of MultRight.

   if(i1 == i2) return;
   // Algorithm: TEveTrans a; a.SetupRotation(i1, i2, amount); MultRight(a);
   // Optimized version:
   const Double_t cos = TMath::Cos(amount), sin = TMath::Sin(amount);
   Double_t  b1, b2;
   Double_t* row = fM;
   --i1 <<= 2; --i2 <<= 2; // column major
   for (int r=0; r<4; ++r, ++row) {
      b1 = cos*row[i1] + sin*row[i2];
      b2 = cos*row[i2] - sin*row[i1];
      row[i1] = b1; row[i2] = b2;
   }
   fAsOK = kFALSE;
}

/******************************************************************************/

//______________________________________________________________________________
void TEveTrans::MovePF(Int_t ai, Double_t amount)
{
   // Move in parent-frame along axis index ai.

   fM[F03 + --ai] += amount;
}

//______________________________________________________________________________
void TEveTrans::Move3PF(Double_t x, Double_t y, Double_t z)
{
   // General move in parent-frame.

   fM[F03] += x;
   fM[F13] += y;
   fM[F23] += z;
}

//______________________________________________________________________________
void TEveTrans::RotatePF(Int_t i1, Int_t i2, Double_t amount)
{
   // Rotate in parent frame. Does optimised version of MultLeft.

   if(i1 == i2) return;
   // Algorithm: TEveTrans a; a.SetupRotation(i1, i2, amount); MultLeft(a);

   // Optimized version:
   const Double_t cos = TMath::Cos(amount), sin = TMath::Sin(amount);
   Double_t  b1, b2;
   Double_t* col = fM;
   --i1; --i2;
   for(int c=0; c<4; ++c, col+=4) {
      b1 = cos*col[i1] - sin*col[i2];
      b2 = cos*col[i2] + sin*col[i1];
      col[i1] = b1; col[i2] = b2;
   }
   fAsOK = kFALSE;
}

/******************************************************************************/

//______________________________________________________________________________
void TEveTrans::Move(const TEveTrans& a, Int_t ai, Double_t amount)
{
   // Move in a's coord-system along axis-index ai.

   const Double_t* vec = a.fM + 4*--ai;
   fM[F03] += amount*vec[0];
   fM[F13] += amount*vec[1];
   fM[F23] += amount*vec[2];
}

//______________________________________________________________________________
void TEveTrans::Move3(const TEveTrans& a, Double_t x, Double_t y, Double_t z)
{
   // General move in a's coord-system.

   const Double_t* m = a.fM;
   fM[F03] += x*m[F00] + y*m[F01] + z*m[F02];
   fM[F13] += x*m[F10] + y*m[F11] + z*m[F12];
   fM[F23] += x*m[F20] + y*m[F21] + z*m[F22];
}

//______________________________________________________________________________
void TEveTrans::Rotate(const TEveTrans& a, Int_t i1, Int_t i2, Double_t amount)
{
   // Rotate in a's coord-system, rotating base vector with index i1
   // into i2.

   if(i1 == i2) return;
   TEveTrans x(a);
   x.Invert();
   MultLeft(x);
   RotatePF(i1, i2, amount);
   MultLeft(a);
   fAsOK = kFALSE;
}

/******************************************************************************/
// Base-vector interface
/******************************************************************************/

//______________________________________________________________________________
void TEveTrans::SetBaseVec(Int_t b, Double_t x, Double_t y, Double_t z)
{
   // Set base-vector with index b.

   Double_t* col = fM + 4*--b;
   col[0] = x; col[1] = y; col[2] = z;
   fAsOK = kFALSE;
}

//______________________________________________________________________________
void TEveTrans::SetBaseVec(Int_t b, const TVector3& v)
{
   // Set base-vector with index b.

   Double_t* col = fM + 4*--b;
   v.GetXYZ(col);
   fAsOK = kFALSE;
}

//______________________________________________________________________________
TVector3 TEveTrans::GetBaseVec(Int_t b) const
{
   // Get base-vector with index b.

   return TVector3(&fM[4*--b]);
}

void TEveTrans::GetBaseVec(Int_t b, TVector3& v) const
{
   // Get base-vector with index b.

   const Double_t* col = fM + 4*--b;
   v.SetXYZ(col[0], col[1], col[2]);
}

/******************************************************************************/
// Position interface
/******************************************************************************/

//______________________________________________________________________________
void TEveTrans::SetPos(Double_t x, Double_t y, Double_t z)
{
   // Set position (base-vec 4).
   fM[F03] = x; fM[F13] = y; fM[F23] = z;
}

void TEveTrans::SetPos(Double_t* x)
{
   // Set position (base-vec 4).
   fM[F03] = x[0]; fM[F13] = x[1]; fM[F23] = x[2];
}

void TEveTrans::SetPos(Float_t* x)
{
   // Set position (base-vec 4).
   fM[F03] = x[0]; fM[F13] = x[1]; fM[F23] = x[2];
}

void TEveTrans::SetPos(const TEveTrans& t)
{
   // Set position (base-vec 4).
   const Double_t* m = t.fM;
   fM[F03] = m[F03]; fM[F13] = m[F13]; fM[F23] = m[F23];
}

//______________________________________________________________________________
void TEveTrans::GetPos(Double_t& x, Double_t& y, Double_t& z) const
{
   // Get position (base-vec 4).
   x = fM[F03]; y = fM[F13]; z = fM[F23];
}

void TEveTrans::GetPos(Double_t* x) const
{
   // Get position (base-vec 4).
   x[0] = fM[F03]; x[1] = fM[F13]; x[2] = fM[F23];
}

void TEveTrans::GetPos(Float_t* x) const
{
   // Get position (base-vec 4).
   x[0] = fM[F03]; x[1] = fM[F13]; x[2] = fM[F23];
}

void TEveTrans::GetPos(TVector3& v) const
{
   // Get position (base-vec 4).
   v.SetXYZ(fM[F03], fM[F13], fM[F23]);
}

TVector3 TEveTrans::GetPos() const
{
   // Get position (base-vec 4).
   return TVector3(fM[F03], fM[F13], fM[F23]);
}

/******************************************************************************/
// Cardan angle interface
/******************************************************************************/

namespace
{
inline void clamp_angle(Float_t& a)
{
   while(a < -TMath::TwoPi()) a += TMath::TwoPi();
   while(a >  TMath::TwoPi()) a -= TMath::TwoPi();
}
}

void TEveTrans::SetRotByAngles(Float_t a1, Float_t a2, Float_t a3)
{
   // Sets Rotation part as given by angles:
   // a1 around z, -a2 around y, a3 around x.

   clamp_angle(a1); clamp_angle(a2); clamp_angle(a3);

   Double_t a, b, c, d, e, f;
   a = TMath::Cos(a3); b = TMath::Sin(a3);
   c = TMath::Cos(a2); d = TMath::Sin(a2); // should be -sin(a2) for positive direction
   e = TMath::Cos(a1); f = TMath::Sin(a1);
   Double_t ad = a*d, bd = b*d;

   fM[F00] = c*e; fM[F01] = -bd*e - a*f; fM[F02] = -ad*e + b*f;
   fM[F10] = c*f; fM[F11] = -bd*f + a*e; fM[F12] = -ad*f - b*e;
   fM[F20] = d;   fM[F21] =  b*c;        fM[F22] =  a*c;

   fA1 = a1; fA2 = a2; fA3 = a3;
   fAsOK = kTRUE;
}

//______________________________________________________________________________
void TEveTrans::SetRotByAnyAngles(Float_t a1, Float_t a2, Float_t a3,
                                  const char* pat)
{
   // Sets Rotation part as given by angles a1, a1, a3 and pattern pat.
   // Pattern consists of "XxYyZz" characters.
   // eg: x means rotate about x axis, X means rotate in negative direction
   // xYz -> R_x(a3) * R_y(-a2) * R_z(a1); (standard Gled representation)
   // Note that angles and pattern elements have inversed order!
   //
   // Implements Eulerian/Cardanian angles in a uniform way.

   int n = strspn(pat, "XxYyZz"); if(n > 3) n = 3;
   // Build Trans ... assign ...
   Float_t a[] = { a3, a2, a1 };
   UnitRot();
   for(int i=0; i<n; i++) {
      if(isupper(pat[i])) a[i] = -a[i];
      switch(pat[i]) {
         case 'x': case 'X': RotateLF(2, 3, a[i]); break;
         case 'y': case 'Y': RotateLF(3, 1, a[i]); break;
         case 'z': case 'Z': RotateLF(1, 2, a[i]); break;
      }
   }
   fAsOK = kFALSE;
}

//______________________________________________________________________________
void TEveTrans::GetRotAngles(Float_t* x) const
{
   // Get Cardan rotation angles (pattern xYz above).

   if(!fAsOK) {
      Double_t sx, sy, sz;
      GetScale(sx, sy, sz);
      Double_t d = fM[F20]/sx;
      if(d>1) d=1; else if(d<-1) d=-1; // Fix numerical errors
      fA2 = TMath::ASin(d);
      Double_t cos = TMath::Cos(fA2);
      if(TMath::Abs(cos) > 8.7e-6) {
         fA1 = TMath::ATan2(fM[F10], fM[F00]);
         fA3 = TMath::ATan2(fM[F21]/sy, fM[F22]/sz);
      } else {
         fA1 = TMath::ATan2(fM[F10]/sx, fM[F11]/sy);
         fA3 = 0;
      }
      fAsOK = kTRUE;
   }
   x[0] = fA1; x[1] = fA2; x[2] = fA3;
}

/******************************************************************************/
// Scaling
/******************************************************************************/

//______________________________________________________________________________
void TEveTrans::Scale(Double_t sx, Double_t sy, Double_t sz)
{
   // Scale matrix. Translation part untouched.

   fM[F00] *= sx; fM[F10] *= sx; fM[F20] *= sx;
   fM[F01] *= sy; fM[F11] *= sy; fM[F21] *= sy;
   fM[F02] *= sz; fM[F12] *= sz; fM[F22] *= sz;
}

//______________________________________________________________________________
Double_t TEveTrans::Unscale()
{
   // Remove scaling, make all base vectors of unit length.

   Double_t sx, sy, sz;
   Unscale(sx, sy, sz);
   return (sx + sy + sz)/3;
}

//______________________________________________________________________________
void TEveTrans::Unscale(Double_t& sx, Double_t& sy, Double_t& sz)
{
   // Remove scaling, make all base vectors of unit length.

   GetScale(sx, sy, sz);
   fM[F00] /= sx; fM[F10] /= sx; fM[F20] /= sx;
   fM[F01] /= sy; fM[F11] /= sy; fM[F21] /= sy;
   fM[F02] /= sz; fM[F12] /= sz; fM[F22] /= sz;
}

//______________________________________________________________________________
void TEveTrans::GetScale(Double_t& sx, Double_t& sy, Double_t& sz) const
{
   // Deduce scales from sizes of base vectors.

   sx = TMath::Sqrt( fM[F00]*fM[F00] + fM[F10]*fM[F10] + fM[F20]*fM[F20] );
   sy = TMath::Sqrt( fM[F01]*fM[F01] + fM[F11]*fM[F11] + fM[F21]*fM[F21] );
   sz = TMath::Sqrt( fM[F02]*fM[F02] + fM[F12]*fM[F12] + fM[F22]*fM[F22] );
}

//______________________________________________________________________________
void TEveTrans::SetScale(Double_t sx, Double_t sy, Double_t sz)
{
   // Set scaling.

   sx /= TMath::Sqrt( fM[F00]*fM[F00] + fM[F10]*fM[F10] + fM[F20]*fM[F20] );
   sy /= TMath::Sqrt( fM[F01]*fM[F01] + fM[F11]*fM[F11] + fM[F21]*fM[F21] );
   sz /= TMath::Sqrt( fM[F02]*fM[F02] + fM[F12]*fM[F12] + fM[F22]*fM[F22] );

   fM[F00] *= sx; fM[F10] *= sx; fM[F20] *= sx;
   fM[F01] *= sy; fM[F11] *= sy; fM[F21] *= sy;
   fM[F02] *= sz; fM[F12] *= sz; fM[F22] *= sz;
}

//______________________________________________________________________________
void TEveTrans::SetScaleX(Double_t sx)
{
   // Change x scaling.

   sx /= TMath::Sqrt( fM[F00]*fM[F00] + fM[F10]*fM[F10] + fM[F20]*fM[F20] );
   fM[F00] *= sx; fM[F10] *= sx; fM[F20] *= sx;
}

//______________________________________________________________________________
void TEveTrans::SetScaleY(Double_t sy)
{
   // Change y scaling.

   sy /= TMath::Sqrt( fM[F01]*fM[F01] + fM[F11]*fM[F11] + fM[F21]*fM[F21] );
   fM[F01] *= sy; fM[F11] *= sy; fM[F21] *= sy;
}

//______________________________________________________________________________
void TEveTrans::SetScaleZ(Double_t sz)
{
   // Change z scaling.

   sz /= TMath::Sqrt( fM[F02]*fM[F02] + fM[F12]*fM[F12] + fM[F22]*fM[F22] );
   fM[F02] *= sz; fM[F12] *= sz; fM[F22] *= sz;
}


/******************************************************************************/
// Operations on vectors
/******************************************************************************/

//______________________________________________________________________________
void TEveTrans::MultiplyIP(TVector3& v, Double_t w) const
{
   // Multiply vector in-place.

   v.SetXYZ(fM[F00]*v.x() + fM[F01]*v.y() + fM[F02]*v.z() + fM[F03]*w,
            fM[F10]*v.x() + fM[F11]*v.y() + fM[F12]*v.z() + fM[F13]*w,
            fM[F20]*v.x() + fM[F21]*v.y() + fM[F22]*v.z() + fM[F23]*w);
}

//______________________________________________________________________________
void TEveTrans::MultiplyIP(Double_t* v, Double_t w) const
{
   // Multiply vector in-place.

   Double_t r[3] = { v[0], v[1], v[2] };
   v[0] = fM[F00]*r[0] + fM[F01]*r[1] + fM[F02]*r[2] + fM[F03]*w;
   v[1] = fM[F10]*r[0] + fM[F11]*r[1] + fM[F12]*r[2] + fM[F13]*w;
   v[2] = fM[F20]*r[0] + fM[F21]*r[1] + fM[F22]*r[2] + fM[F23]*w;
}

//______________________________________________________________________________
void TEveTrans::MultiplyIP(Float_t* v, Double_t w) const
{
   // Multiply vector in-place.

   Double_t r[3] = { v[0], v[1], v[2] };
   v[0] = fM[F00]*r[0] + fM[F01]*r[1] + fM[F02]*r[2] + fM[F03]*w;
   v[1] = fM[F10]*r[0] + fM[F11]*r[1] + fM[F12]*r[2] + fM[F13]*w;
   v[2] = fM[F20]*r[0] + fM[F21]*r[1] + fM[F22]*r[2] + fM[F23]*w;
}

//______________________________________________________________________________
TVector3 TEveTrans::Multiply(const TVector3& v, Double_t w) const
{
   // Multiply vector and return it.

   return TVector3(fM[F00]*v.x() + fM[F01]*v.y() + fM[F02]*v.z() + fM[F03]*w,
                   fM[F10]*v.x() + fM[F11]*v.y() + fM[F12]*v.z() + fM[F13]*w,
                   fM[F20]*v.x() + fM[F21]*v.y() + fM[F22]*v.z() + fM[F23]*w);
}

//______________________________________________________________________________
void TEveTrans::Multiply(const Double_t *vin, Double_t* vout, Double_t w) const
{
   // Multiply vector and fill output array vout.

   vout[0] = fM[F00]*vin[0] + fM[F01]*vin[1] + fM[F02]*vin[2] + fM[F03]*w;
   vout[1] = fM[F10]*vin[0] + fM[F11]*vin[1] + fM[F12]*vin[1] + fM[F13]*w;
   vout[2] = fM[F20]*vin[0] + fM[F21]*vin[1] + fM[F22]*vin[1] + fM[F23]*w;
}

//______________________________________________________________________________
void TEveTrans::RotateIP(TVector3& v) const
{
   // Rotate vector in-place. Translation is NOT applied.

   v.SetXYZ(fM[F00]*v.x() + fM[F01]*v.y() + fM[F02]*v.z(),
            fM[F10]*v.x() + fM[F11]*v.y() + fM[F12]*v.z(),
            fM[F20]*v.x() + fM[F21]*v.y() + fM[F22]*v.z());
}

//______________________________________________________________________________
void TEveTrans::RotateIP(Double_t* v) const
{
   // Rotate vector in-place. Translation is NOT applied.

   Double_t t[3] = { v[0], v[1], v[2] };

   v[0] = fM[F00]*t[0] + fM[F01]*t[1] + fM[F02]*t[2];
   v[1] = fM[F10]*t[0] + fM[F11]*t[1] + fM[F12]*t[2];
   v[2] = fM[F20]*t[0] + fM[F21]*t[1] + fM[F22]*t[2];
}

//______________________________________________________________________________
void TEveTrans::RotateIP(Float_t* v) const
{
   // Rotate vector in-place. Translation is NOT applied.

   Double_t t[3] = { v[0], v[1], v[2] };

   v[0] = fM[F00]*t[0] + fM[F01]*t[1] + fM[F02]*t[2];
   v[1] = fM[F10]*t[0] + fM[F11]*t[1] + fM[F12]*t[2];
   v[2] = fM[F20]*t[0] + fM[F21]*t[1] + fM[F22]*t[2];
}

//______________________________________________________________________________
TVector3 TEveTrans::Rotate(const TVector3& v) const
{
   // Rotate vector and return the rotated vector. Translation is NOT applied.

   return TVector3(fM[F00]*v.x() + fM[F01]*v.y() + fM[F02]*v.z(),
                   fM[F10]*v.x() + fM[F11]*v.y() + fM[F12]*v.z(),
                   fM[F20]*v.x() + fM[F21]*v.y() + fM[F22]*v.z());
}

/******************************************************************************/
// Normalization, ortogonalization
/******************************************************************************/

//______________________________________________________________________________
Double_t TEveTrans::Norm3Column(Int_t col)
{
   // Norm 3-vector in column col.

   Double_t* c = fM + 4*--col;
   const Double_t  l = TMath::Sqrt(c[0]*c[0] + c[1]*c[1] + c[2]*c[2]);
   c[0] /= l; c[1] /= l; c[2] /= l;
   return l;
}

//______________________________________________________________________________
Double_t TEveTrans::Orto3Column(Int_t col, Int_t ref)
{
   // Orto-norm 3-vector in column col with respect to column ref.

   Double_t* c =  fM + 4*--col;
   Double_t* rc = fM + 4*--ref;
   const Double_t dp = c[0]*rc[0] + c[1]*rc[1] + c[2]*rc[2];
   c[0] -= rc[0]*dp; c[1] -= rc[1]*dp; c[2] -= rc[2]*dp;
   return dp;
}

//______________________________________________________________________________
void TEveTrans::OrtoNorm3()
{
   // Orto-norm columns 1 to 3.

   Norm3Column(1);
   Orto3Column(2,1); Norm3Column(2);
   fM[F02] = fM[F10]*fM[F21] - fM[F11]*fM[F20];
   fM[F12] = fM[F20]*fM[F01] - fM[F21]*fM[F00];
   fM[F22] = fM[F00]*fM[F11] - fM[F01]*fM[F10];
   // Cross-product faster than the following.
   // Orto3Column(3,1); Orto3Column(3,2); Norm3Column(3);
}

/******************************************************************************/
// Inversion
/******************************************************************************/

//______________________________________________________________________________
Double_t TEveTrans::Invert()
{
   // Invert matrix.
   // Copied from ROOT's TMatrixFCramerInv.

   static const TEveException eh("TEveTrans::Invert ");

   // Find all NECESSARY 2x2 dets:  (18 of them)
   const Double_t det2_12_01 = fM[F10]*fM[F21] - fM[F11]*fM[F20];
   const Double_t det2_12_02 = fM[F10]*fM[F22] - fM[F12]*fM[F20];
   const Double_t det2_12_03 = fM[F10]*fM[F23] - fM[F13]*fM[F20];
   const Double_t det2_12_13 = fM[F11]*fM[F23] - fM[F13]*fM[F21];
   const Double_t det2_12_23 = fM[F12]*fM[F23] - fM[F13]*fM[F22];
   const Double_t det2_12_12 = fM[F11]*fM[F22] - fM[F12]*fM[F21];
   const Double_t det2_13_01 = fM[F10]*fM[F31] - fM[F11]*fM[F30];
   const Double_t det2_13_02 = fM[F10]*fM[F32] - fM[F12]*fM[F30];
   const Double_t det2_13_03 = fM[F10]*fM[F33] - fM[F13]*fM[F30];
   const Double_t det2_13_12 = fM[F11]*fM[F32] - fM[F12]*fM[F31];
   const Double_t det2_13_13 = fM[F11]*fM[F33] - fM[F13]*fM[F31];
   const Double_t det2_13_23 = fM[F12]*fM[F33] - fM[F13]*fM[F32];
   const Double_t det2_23_01 = fM[F20]*fM[F31] - fM[F21]*fM[F30];
   const Double_t det2_23_02 = fM[F20]*fM[F32] - fM[F22]*fM[F30];
   const Double_t det2_23_03 = fM[F20]*fM[F33] - fM[F23]*fM[F30];
   const Double_t det2_23_12 = fM[F21]*fM[F32] - fM[F22]*fM[F31];
   const Double_t det2_23_13 = fM[F21]*fM[F33] - fM[F23]*fM[F31];
   const Double_t det2_23_23 = fM[F22]*fM[F33] - fM[F23]*fM[F32];

   // Find all NECESSARY 3x3 dets:   (16 of them)
   const Double_t det3_012_012 = fM[F00]*det2_12_12 - fM[F01]*det2_12_02 + fM[F02]*det2_12_01;
   const Double_t det3_012_013 = fM[F00]*det2_12_13 - fM[F01]*det2_12_03 + fM[F03]*det2_12_01;
   const Double_t det3_012_023 = fM[F00]*det2_12_23 - fM[F02]*det2_12_03 + fM[F03]*det2_12_02;
   const Double_t det3_012_123 = fM[F01]*det2_12_23 - fM[F02]*det2_12_13 + fM[F03]*det2_12_12;
   const Double_t det3_013_012 = fM[F00]*det2_13_12 - fM[F01]*det2_13_02 + fM[F02]*det2_13_01;
   const Double_t det3_013_013 = fM[F00]*det2_13_13 - fM[F01]*det2_13_03 + fM[F03]*det2_13_01;
   const Double_t det3_013_023 = fM[F00]*det2_13_23 - fM[F02]*det2_13_03 + fM[F03]*det2_13_02;
   const Double_t det3_013_123 = fM[F01]*det2_13_23 - fM[F02]*det2_13_13 + fM[F03]*det2_13_12;
   const Double_t det3_023_012 = fM[F00]*det2_23_12 - fM[F01]*det2_23_02 + fM[F02]*det2_23_01;
   const Double_t det3_023_013 = fM[F00]*det2_23_13 - fM[F01]*det2_23_03 + fM[F03]*det2_23_01;
   const Double_t det3_023_023 = fM[F00]*det2_23_23 - fM[F02]*det2_23_03 + fM[F03]*det2_23_02;
   const Double_t det3_023_123 = fM[F01]*det2_23_23 - fM[F02]*det2_23_13 + fM[F03]*det2_23_12;
   const Double_t det3_123_012 = fM[F10]*det2_23_12 - fM[F11]*det2_23_02 + fM[F12]*det2_23_01;
   const Double_t det3_123_013 = fM[F10]*det2_23_13 - fM[F11]*det2_23_03 + fM[F13]*det2_23_01;
   const Double_t det3_123_023 = fM[F10]*det2_23_23 - fM[F12]*det2_23_03 + fM[F13]*det2_23_02;
   const Double_t det3_123_123 = fM[F11]*det2_23_23 - fM[F12]*det2_23_13 + fM[F13]*det2_23_12;

   // Find the 4x4 det:
   const Double_t det = fM[F00]*det3_123_123 - fM[F01]*det3_123_023 +
      fM[F02]*det3_123_013 - fM[F03]*det3_123_012;

   if(det == 0) {
      throw(eh + "matrix is singular.");
   }

   const Double_t oneOverDet = 1.0/det;
   const Double_t mn1OverDet = - oneOverDet;

   fM[F00] = det3_123_123 * oneOverDet;
   fM[F01] = det3_023_123 * mn1OverDet;
   fM[F02] = det3_013_123 * oneOverDet;
   fM[F03] = det3_012_123 * mn1OverDet;

   fM[F10] = det3_123_023 * mn1OverDet;
   fM[F11] = det3_023_023 * oneOverDet;
   fM[F12] = det3_013_023 * mn1OverDet;
   fM[F13] = det3_012_023 * oneOverDet;

   fM[F20] = det3_123_013 * oneOverDet;
   fM[F21] = det3_023_013 * mn1OverDet;
   fM[F22] = det3_013_013 * oneOverDet;
   fM[F23] = det3_012_013 * mn1OverDet;

   fM[F30] = det3_123_012 * mn1OverDet;
   fM[F31] = det3_023_012 * oneOverDet;
   fM[F32] = det3_013_012 * mn1OverDet;
   fM[F33] = det3_012_012 * oneOverDet;

   fAsOK = kFALSE;
   return det;
}

/******************************************************************************/

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

   if (R__b.IsReading()) {
      TEveTrans::Class()->ReadBuffer(R__b, this);
      fAsOK = kFALSE;
   } else {
      TEveTrans::Class()->WriteBuffer(R__b, this);
   }
}

/******************************************************************************/
/******************************************************************************/

//______________________________________________________________________________
void TEveTrans::Print(Option_t* /*option*/) const
{
   // Print in reasonable format.

   const Double_t* row = fM;
   for(Int_t i=0; i<4; ++i, ++row)
      printf("%8.3f %8.3f %8.3f | %8.3f\n", row[0], row[4], row[8], row[12]);
}

#include <iomanip>

//______________________________________________________________________________
std::ostream& operator<<(std::ostream& s, const TEveTrans& t)
{
   // Print to std::ostream.

   s.setf(std::ios::fixed, std::ios::floatfield);
   s.precision(3);
   for(Int_t i=1; i<=4; i++)
      for(Int_t j=1; j<=4; j++)
         s << t(i,j) << ((j==4) ? "\n" : "\t");
   return s;
}

/******************************************************************************/
// TEveUtil stuff
/******************************************************************************/

#include "TGeoMatrix.h"
#include "TBuffer3D.h"

void TEveTrans::SetFrom(Double_t* carr)
{
   // Initialize from array.

   fUseTrans = kTRUE;
   memcpy(fM, carr, 16*sizeof(Double_t));
   fAsOK = kFALSE;
}

//______________________________________________________________________________
void TEveTrans::SetFrom(const TGeoMatrix& mat)
{
   // Initialize from TGeoMatrix.

   fUseTrans = kTRUE;
   const Double_t *r = mat.GetRotationMatrix();
   const Double_t *t = mat.GetTranslation();
   Double_t       *m = fM;
   if (mat.IsScale())
   {
      const Double_t *s = mat.GetScale();
      m[0]  = r[0]*s[0]; m[1]  = r[3]*s[0]; m[2]  = r[6]*s[0]; m[3]  = 0;
      m[4]  = r[1]*s[1]; m[5]  = r[4]*s[1]; m[6]  = r[7]*s[1]; m[7]  = 0;
      m[8]  = r[2]*s[2]; m[9]  = r[5]*s[2]; m[10] = r[8]*s[2]; m[11] = 0;
      m[12] = t[0];      m[13] = t[1];      m[14] = t[2];      m[15] = 1;
   }
   else
   {
      m[0]  = r[0];      m[1]  = r[3];      m[2]  = r[6];      m[3]  = 0;
      m[4]  = r[1];      m[5]  = r[4];      m[6]  = r[7];      m[7]  = 0;
      m[8]  = r[2];      m[9]  = r[5];      m[10] = r[8];      m[11] = 0;
      m[12] = t[0];      m[13] = t[1];      m[14] = t[2];      m[15] = 1;
   }
   fAsOK = kFALSE;
}

//______________________________________________________________________________
void TEveTrans::SetGeoHMatrix(TGeoHMatrix& mat)
{
   // Set TGeoHMatrix mat.

   Double_t *r = mat.GetRotationMatrix();
   Double_t *t = mat.GetTranslation();
   Double_t *s = mat.GetScale();
   if (fUseTrans)
   {
      mat.SetBit(TGeoMatrix::kGeoGenTrans);
      Double_t *m = fM;
      GetScale(s[0], s[1], s[2]);
      r[0] = m[0]/s[0]; r[3] = m[1]/s[0]; r[6] = m[2]/s[0]; m += 4;
      r[1] = m[0]/s[1]; r[4] = m[1]/s[1]; r[7] = m[2]/s[1]; m += 4;
      r[2] = m[0]/s[2]; r[5] = m[1]/s[2]; r[8] = m[2]/s[2]; m += 4;
      t[0] = m[0];      t[1] = m[1];      t[2] = m[2];
   }
   else
   {
      mat.ResetBit(TGeoMatrix::kGeoGenTrans);
      r[0] = 1; r[3] = 0; r[6] = 0;
      r[1] = 0; r[4] = 1; r[7] = 0;
      r[2] = 0; r[5] = 0; r[8] = 1;
      s[0] = s[1] = s[2] = 1;
      t[0] = t[1] = t[2] = 0;
   }
}

//______________________________________________________________________________
void TEveTrans::SetBuffer3D(TBuffer3D& buff)
{
   // Fill transformation part TBuffer3D core section.

   buff.fLocalFrame = fUseTrans;
   if (fUseTrans) {
      // In phys-shape ctor the rotation part is transposed, due to
      // TGeo's convention for rotation matrix. So we have to transpose
      // it here, also.
      Double_t *m = buff.fLocalMaster;
      m[0]  = fM[0];  m[1]  = fM[4];  m[2]  = fM[8];  m[3]  = fM[3];
      m[4]  = fM[1];  m[5]  = fM[5];  m[6]  = fM[9];  m[7]  = fM[7];
      m[8]  = fM[2];  m[9]  = fM[6];  m[10] = fM[10]; m[11] = fM[11];
      m[12] = fM[12]; m[13] = fM[13]; m[14] = fM[14]; m[15] = fM[15];
      // Otherwise this would do:
      // memcpy(buff.fLocalMaster, fM, 16*sizeof(Double_t));
   }
}

//______________________________________________________________________________
Bool_t TEveTrans::IsScale(Double_t low, Double_t high) const
{
   // Test if the transformation is a scale.
   // To be used by ROOT TGLObject descendants that potentially need to
   // use GL_NORMALIZE.
   // The low/high limits are expected to be squares of acutal limits.
   //
   // Ideally this should be done by the TGLViewer [but is not].

   if (!fUseTrans) return kFALSE;
   Double_t s;
   s = fM[F00]*fM[F00] + fM[F10]*fM[F10] + fM[F20]*fM[F20];
   if (s < low || s > high) return kTRUE;
   s = fM[F01]*fM[F01] + fM[F11]*fM[F11] + fM[F21]*fM[F21];
   if (s < low || s > high) return kTRUE;
   s = fM[F02]*fM[F02] + fM[F12]*fM[F12] + fM[F22]*fM[F22];
   if (s < low || s > high) return kTRUE;
   return kFALSE;
}
 TEveTrans.cxx:1
 TEveTrans.cxx:2
 TEveTrans.cxx:3
 TEveTrans.cxx:4
 TEveTrans.cxx:5
 TEveTrans.cxx:6
 TEveTrans.cxx:7
 TEveTrans.cxx:8
 TEveTrans.cxx:9
 TEveTrans.cxx:10
 TEveTrans.cxx:11
 TEveTrans.cxx:12
 TEveTrans.cxx:13
 TEveTrans.cxx:14
 TEveTrans.cxx:15
 TEveTrans.cxx:16
 TEveTrans.cxx:17
 TEveTrans.cxx:18
 TEveTrans.cxx:19
 TEveTrans.cxx:20
 TEveTrans.cxx:21
 TEveTrans.cxx:22
 TEveTrans.cxx:23
 TEveTrans.cxx:24
 TEveTrans.cxx:25
 TEveTrans.cxx:26
 TEveTrans.cxx:27
 TEveTrans.cxx:28
 TEveTrans.cxx:29
 TEveTrans.cxx:30
 TEveTrans.cxx:31
 TEveTrans.cxx:32
 TEveTrans.cxx:33
 TEveTrans.cxx:34
 TEveTrans.cxx:35
 TEveTrans.cxx:36
 TEveTrans.cxx:37
 TEveTrans.cxx:38
 TEveTrans.cxx:39
 TEveTrans.cxx:40
 TEveTrans.cxx:41
 TEveTrans.cxx:42
 TEveTrans.cxx:43
 TEveTrans.cxx:44
 TEveTrans.cxx:45
 TEveTrans.cxx:46
 TEveTrans.cxx:47
 TEveTrans.cxx:48
 TEveTrans.cxx:49
 TEveTrans.cxx:50
 TEveTrans.cxx:51
 TEveTrans.cxx:52
 TEveTrans.cxx:53
 TEveTrans.cxx:54
 TEveTrans.cxx:55
 TEveTrans.cxx:56
 TEveTrans.cxx:57
 TEveTrans.cxx:58
 TEveTrans.cxx:59
 TEveTrans.cxx:60
 TEveTrans.cxx:61
 TEveTrans.cxx:62
 TEveTrans.cxx:63
 TEveTrans.cxx:64
 TEveTrans.cxx:65
 TEveTrans.cxx:66
 TEveTrans.cxx:67
 TEveTrans.cxx:68
 TEveTrans.cxx:69
 TEveTrans.cxx:70
 TEveTrans.cxx:71
 TEveTrans.cxx:72
 TEveTrans.cxx:73
 TEveTrans.cxx:74
 TEveTrans.cxx:75
 TEveTrans.cxx:76
 TEveTrans.cxx:77
 TEveTrans.cxx:78
 TEveTrans.cxx:79
 TEveTrans.cxx:80
 TEveTrans.cxx:81
 TEveTrans.cxx:82
 TEveTrans.cxx:83
 TEveTrans.cxx:84
 TEveTrans.cxx:85
 TEveTrans.cxx:86
 TEveTrans.cxx:87
 TEveTrans.cxx:88
 TEveTrans.cxx:89
 TEveTrans.cxx:90
 TEveTrans.cxx:91
 TEveTrans.cxx:92
 TEveTrans.cxx:93
 TEveTrans.cxx:94
 TEveTrans.cxx:95
 TEveTrans.cxx:96
 TEveTrans.cxx:97
 TEveTrans.cxx:98
 TEveTrans.cxx:99
 TEveTrans.cxx:100
 TEveTrans.cxx:101
 TEveTrans.cxx:102
 TEveTrans.cxx:103
 TEveTrans.cxx:104
 TEveTrans.cxx:105
 TEveTrans.cxx:106
 TEveTrans.cxx:107
 TEveTrans.cxx:108
 TEveTrans.cxx:109
 TEveTrans.cxx:110
 TEveTrans.cxx:111
 TEveTrans.cxx:112
 TEveTrans.cxx:113
 TEveTrans.cxx:114
 TEveTrans.cxx:115
 TEveTrans.cxx:116
 TEveTrans.cxx:117
 TEveTrans.cxx:118
 TEveTrans.cxx:119
 TEveTrans.cxx:120
 TEveTrans.cxx:121
 TEveTrans.cxx:122
 TEveTrans.cxx:123
 TEveTrans.cxx:124
 TEveTrans.cxx:125
 TEveTrans.cxx:126
 TEveTrans.cxx:127
 TEveTrans.cxx:128
 TEveTrans.cxx:129
 TEveTrans.cxx:130
 TEveTrans.cxx:131
 TEveTrans.cxx:132
 TEveTrans.cxx:133
 TEveTrans.cxx:134
 TEveTrans.cxx:135
 TEveTrans.cxx:136
 TEveTrans.cxx:137
 TEveTrans.cxx:138
 TEveTrans.cxx:139
 TEveTrans.cxx:140
 TEveTrans.cxx:141
 TEveTrans.cxx:142
 TEveTrans.cxx:143
 TEveTrans.cxx:144
 TEveTrans.cxx:145
 TEveTrans.cxx:146
 TEveTrans.cxx:147
 TEveTrans.cxx:148
 TEveTrans.cxx:149
 TEveTrans.cxx:150
 TEveTrans.cxx:151
 TEveTrans.cxx:152
 TEveTrans.cxx:153
 TEveTrans.cxx:154
 TEveTrans.cxx:155
 TEveTrans.cxx:156
 TEveTrans.cxx:157
 TEveTrans.cxx:158
 TEveTrans.cxx:159
 TEveTrans.cxx:160
 TEveTrans.cxx:161
 TEveTrans.cxx:162
 TEveTrans.cxx:163
 TEveTrans.cxx:164
 TEveTrans.cxx:165
 TEveTrans.cxx:166
 TEveTrans.cxx:167
 TEveTrans.cxx:168
 TEveTrans.cxx:169
 TEveTrans.cxx:170
 TEveTrans.cxx:171
 TEveTrans.cxx:172
 TEveTrans.cxx:173
 TEveTrans.cxx:174
 TEveTrans.cxx:175
 TEveTrans.cxx:176
 TEveTrans.cxx:177
 TEveTrans.cxx:178
 TEveTrans.cxx:179
 TEveTrans.cxx:180
 TEveTrans.cxx:181
 TEveTrans.cxx:182
 TEveTrans.cxx:183
 TEveTrans.cxx:184
 TEveTrans.cxx:185
 TEveTrans.cxx:186
 TEveTrans.cxx:187
 TEveTrans.cxx:188
 TEveTrans.cxx:189
 TEveTrans.cxx:190
 TEveTrans.cxx:191
 TEveTrans.cxx:192
 TEveTrans.cxx:193
 TEveTrans.cxx:194
 TEveTrans.cxx:195
 TEveTrans.cxx:196
 TEveTrans.cxx:197
 TEveTrans.cxx:198
 TEveTrans.cxx:199
 TEveTrans.cxx:200
 TEveTrans.cxx:201
 TEveTrans.cxx:202
 TEveTrans.cxx:203
 TEveTrans.cxx:204
 TEveTrans.cxx:205
 TEveTrans.cxx:206
 TEveTrans.cxx:207
 TEveTrans.cxx:208
 TEveTrans.cxx:209
 TEveTrans.cxx:210
 TEveTrans.cxx:211
 TEveTrans.cxx:212
 TEveTrans.cxx:213
 TEveTrans.cxx:214
 TEveTrans.cxx:215
 TEveTrans.cxx:216
 TEveTrans.cxx:217
 TEveTrans.cxx:218
 TEveTrans.cxx:219
 TEveTrans.cxx:220
 TEveTrans.cxx:221
 TEveTrans.cxx:222
 TEveTrans.cxx:223
 TEveTrans.cxx:224
 TEveTrans.cxx:225
 TEveTrans.cxx:226
 TEveTrans.cxx:227
 TEveTrans.cxx:228
 TEveTrans.cxx:229
 TEveTrans.cxx:230
 TEveTrans.cxx:231
 TEveTrans.cxx:232
 TEveTrans.cxx:233
 TEveTrans.cxx:234
 TEveTrans.cxx:235
 TEveTrans.cxx:236
 TEveTrans.cxx:237
 TEveTrans.cxx:238
 TEveTrans.cxx:239
 TEveTrans.cxx:240
 TEveTrans.cxx:241
 TEveTrans.cxx:242
 TEveTrans.cxx:243
 TEveTrans.cxx:244
 TEveTrans.cxx:245
 TEveTrans.cxx:246
 TEveTrans.cxx:247
 TEveTrans.cxx:248
 TEveTrans.cxx:249
 TEveTrans.cxx:250
 TEveTrans.cxx:251
 TEveTrans.cxx:252
 TEveTrans.cxx:253
 TEveTrans.cxx:254
 TEveTrans.cxx:255
 TEveTrans.cxx:256
 TEveTrans.cxx:257
 TEveTrans.cxx:258
 TEveTrans.cxx:259
 TEveTrans.cxx:260
 TEveTrans.cxx:261
 TEveTrans.cxx:262
 TEveTrans.cxx:263
 TEveTrans.cxx:264
 TEveTrans.cxx:265
 TEveTrans.cxx:266
 TEveTrans.cxx:267
 TEveTrans.cxx:268
 TEveTrans.cxx:269
 TEveTrans.cxx:270
 TEveTrans.cxx:271
 TEveTrans.cxx:272
 TEveTrans.cxx:273
 TEveTrans.cxx:274
 TEveTrans.cxx:275
 TEveTrans.cxx:276
 TEveTrans.cxx:277
 TEveTrans.cxx:278
 TEveTrans.cxx:279
 TEveTrans.cxx:280
 TEveTrans.cxx:281
 TEveTrans.cxx:282
 TEveTrans.cxx:283
 TEveTrans.cxx:284
 TEveTrans.cxx:285
 TEveTrans.cxx:286
 TEveTrans.cxx:287
 TEveTrans.cxx:288
 TEveTrans.cxx:289
 TEveTrans.cxx:290
 TEveTrans.cxx:291
 TEveTrans.cxx:292
 TEveTrans.cxx:293
 TEveTrans.cxx:294
 TEveTrans.cxx:295
 TEveTrans.cxx:296
 TEveTrans.cxx:297
 TEveTrans.cxx:298
 TEveTrans.cxx:299
 TEveTrans.cxx:300
 TEveTrans.cxx:301
 TEveTrans.cxx:302
 TEveTrans.cxx:303
 TEveTrans.cxx:304
 TEveTrans.cxx:305
 TEveTrans.cxx:306
 TEveTrans.cxx:307
 TEveTrans.cxx:308
 TEveTrans.cxx:309
 TEveTrans.cxx:310
 TEveTrans.cxx:311
 TEveTrans.cxx:312
 TEveTrans.cxx:313
 TEveTrans.cxx:314
 TEveTrans.cxx:315
 TEveTrans.cxx:316
 TEveTrans.cxx:317
 TEveTrans.cxx:318
 TEveTrans.cxx:319
 TEveTrans.cxx:320
 TEveTrans.cxx:321
 TEveTrans.cxx:322
 TEveTrans.cxx:323
 TEveTrans.cxx:324
 TEveTrans.cxx:325
 TEveTrans.cxx:326
 TEveTrans.cxx:327
 TEveTrans.cxx:328
 TEveTrans.cxx:329
 TEveTrans.cxx:330
 TEveTrans.cxx:331
 TEveTrans.cxx:332
 TEveTrans.cxx:333
 TEveTrans.cxx:334
 TEveTrans.cxx:335
 TEveTrans.cxx:336
 TEveTrans.cxx:337
 TEveTrans.cxx:338
 TEveTrans.cxx:339
 TEveTrans.cxx:340
 TEveTrans.cxx:341
 TEveTrans.cxx:342
 TEveTrans.cxx:343
 TEveTrans.cxx:344
 TEveTrans.cxx:345
 TEveTrans.cxx:346
 TEveTrans.cxx:347
 TEveTrans.cxx:348
 TEveTrans.cxx:349
 TEveTrans.cxx:350
 TEveTrans.cxx:351
 TEveTrans.cxx:352
 TEveTrans.cxx:353
 TEveTrans.cxx:354
 TEveTrans.cxx:355
 TEveTrans.cxx:356
 TEveTrans.cxx:357
 TEveTrans.cxx:358
 TEveTrans.cxx:359
 TEveTrans.cxx:360
 TEveTrans.cxx:361
 TEveTrans.cxx:362
 TEveTrans.cxx:363
 TEveTrans.cxx:364
 TEveTrans.cxx:365
 TEveTrans.cxx:366
 TEveTrans.cxx:367
 TEveTrans.cxx:368
 TEveTrans.cxx:369
 TEveTrans.cxx:370
 TEveTrans.cxx:371
 TEveTrans.cxx:372
 TEveTrans.cxx:373
 TEveTrans.cxx:374
 TEveTrans.cxx:375
 TEveTrans.cxx:376
 TEveTrans.cxx:377
 TEveTrans.cxx:378
 TEveTrans.cxx:379
 TEveTrans.cxx:380
 TEveTrans.cxx:381
 TEveTrans.cxx:382
 TEveTrans.cxx:383
 TEveTrans.cxx:384
 TEveTrans.cxx:385
 TEveTrans.cxx:386
 TEveTrans.cxx:387
 TEveTrans.cxx:388
 TEveTrans.cxx:389
 TEveTrans.cxx:390
 TEveTrans.cxx:391
 TEveTrans.cxx:392
 TEveTrans.cxx:393
 TEveTrans.cxx:394
 TEveTrans.cxx:395
 TEveTrans.cxx:396
 TEveTrans.cxx:397
 TEveTrans.cxx:398
 TEveTrans.cxx:399
 TEveTrans.cxx:400
 TEveTrans.cxx:401
 TEveTrans.cxx:402
 TEveTrans.cxx:403
 TEveTrans.cxx:404
 TEveTrans.cxx:405
 TEveTrans.cxx:406
 TEveTrans.cxx:407
 TEveTrans.cxx:408
 TEveTrans.cxx:409
 TEveTrans.cxx:410
 TEveTrans.cxx:411
 TEveTrans.cxx:412
 TEveTrans.cxx:413
 TEveTrans.cxx:414
 TEveTrans.cxx:415
 TEveTrans.cxx:416
 TEveTrans.cxx:417
 TEveTrans.cxx:418
 TEveTrans.cxx:419
 TEveTrans.cxx:420
 TEveTrans.cxx:421
 TEveTrans.cxx:422
 TEveTrans.cxx:423
 TEveTrans.cxx:424
 TEveTrans.cxx:425
 TEveTrans.cxx:426
 TEveTrans.cxx:427
 TEveTrans.cxx:428
 TEveTrans.cxx:429
 TEveTrans.cxx:430
 TEveTrans.cxx:431
 TEveTrans.cxx:432
 TEveTrans.cxx:433
 TEveTrans.cxx:434
 TEveTrans.cxx:435
 TEveTrans.cxx:436
 TEveTrans.cxx:437
 TEveTrans.cxx:438
 TEveTrans.cxx:439
 TEveTrans.cxx:440
 TEveTrans.cxx:441
 TEveTrans.cxx:442
 TEveTrans.cxx:443
 TEveTrans.cxx:444
 TEveTrans.cxx:445
 TEveTrans.cxx:446
 TEveTrans.cxx:447
 TEveTrans.cxx:448
 TEveTrans.cxx:449
 TEveTrans.cxx:450
 TEveTrans.cxx:451
 TEveTrans.cxx:452
 TEveTrans.cxx:453
 TEveTrans.cxx:454
 TEveTrans.cxx:455
 TEveTrans.cxx:456
 TEveTrans.cxx:457
 TEveTrans.cxx:458
 TEveTrans.cxx:459
 TEveTrans.cxx:460
 TEveTrans.cxx:461
 TEveTrans.cxx:462
 TEveTrans.cxx:463
 TEveTrans.cxx:464
 TEveTrans.cxx:465
 TEveTrans.cxx:466
 TEveTrans.cxx:467
 TEveTrans.cxx:468
 TEveTrans.cxx:469
 TEveTrans.cxx:470
 TEveTrans.cxx:471
 TEveTrans.cxx:472
 TEveTrans.cxx:473
 TEveTrans.cxx:474
 TEveTrans.cxx:475
 TEveTrans.cxx:476
 TEveTrans.cxx:477
 TEveTrans.cxx:478
 TEveTrans.cxx:479
 TEveTrans.cxx:480
 TEveTrans.cxx:481
 TEveTrans.cxx:482
 TEveTrans.cxx:483
 TEveTrans.cxx:484
 TEveTrans.cxx:485
 TEveTrans.cxx:486
 TEveTrans.cxx:487
 TEveTrans.cxx:488
 TEveTrans.cxx:489
 TEveTrans.cxx:490
 TEveTrans.cxx:491
 TEveTrans.cxx:492
 TEveTrans.cxx:493
 TEveTrans.cxx:494
 TEveTrans.cxx:495
 TEveTrans.cxx:496
 TEveTrans.cxx:497
 TEveTrans.cxx:498
 TEveTrans.cxx:499
 TEveTrans.cxx:500
 TEveTrans.cxx:501
 TEveTrans.cxx:502
 TEveTrans.cxx:503
 TEveTrans.cxx:504
 TEveTrans.cxx:505
 TEveTrans.cxx:506
 TEveTrans.cxx:507
 TEveTrans.cxx:508
 TEveTrans.cxx:509
 TEveTrans.cxx:510
 TEveTrans.cxx:511
 TEveTrans.cxx:512
 TEveTrans.cxx:513
 TEveTrans.cxx:514
 TEveTrans.cxx:515
 TEveTrans.cxx:516
 TEveTrans.cxx:517
 TEveTrans.cxx:518
 TEveTrans.cxx:519
 TEveTrans.cxx:520
 TEveTrans.cxx:521
 TEveTrans.cxx:522
 TEveTrans.cxx:523
 TEveTrans.cxx:524
 TEveTrans.cxx:525
 TEveTrans.cxx:526
 TEveTrans.cxx:527
 TEveTrans.cxx:528
 TEveTrans.cxx:529
 TEveTrans.cxx:530
 TEveTrans.cxx:531
 TEveTrans.cxx:532
 TEveTrans.cxx:533
 TEveTrans.cxx:534
 TEveTrans.cxx:535
 TEveTrans.cxx:536
 TEveTrans.cxx:537
 TEveTrans.cxx:538
 TEveTrans.cxx:539
 TEveTrans.cxx:540
 TEveTrans.cxx:541
 TEveTrans.cxx:542
 TEveTrans.cxx:543
 TEveTrans.cxx:544
 TEveTrans.cxx:545
 TEveTrans.cxx:546
 TEveTrans.cxx:547
 TEveTrans.cxx:548
 TEveTrans.cxx:549
 TEveTrans.cxx:550
 TEveTrans.cxx:551
 TEveTrans.cxx:552
 TEveTrans.cxx:553
 TEveTrans.cxx:554
 TEveTrans.cxx:555
 TEveTrans.cxx:556
 TEveTrans.cxx:557
 TEveTrans.cxx:558
 TEveTrans.cxx:559
 TEveTrans.cxx:560
 TEveTrans.cxx:561
 TEveTrans.cxx:562
 TEveTrans.cxx:563
 TEveTrans.cxx:564
 TEveTrans.cxx:565
 TEveTrans.cxx:566
 TEveTrans.cxx:567
 TEveTrans.cxx:568
 TEveTrans.cxx:569
 TEveTrans.cxx:570
 TEveTrans.cxx:571
 TEveTrans.cxx:572
 TEveTrans.cxx:573
 TEveTrans.cxx:574
 TEveTrans.cxx:575
 TEveTrans.cxx:576
 TEveTrans.cxx:577
 TEveTrans.cxx:578
 TEveTrans.cxx:579
 TEveTrans.cxx:580
 TEveTrans.cxx:581
 TEveTrans.cxx:582
 TEveTrans.cxx:583
 TEveTrans.cxx:584
 TEveTrans.cxx:585
 TEveTrans.cxx:586
 TEveTrans.cxx:587
 TEveTrans.cxx:588
 TEveTrans.cxx:589
 TEveTrans.cxx:590
 TEveTrans.cxx:591
 TEveTrans.cxx:592
 TEveTrans.cxx:593
 TEveTrans.cxx:594
 TEveTrans.cxx:595
 TEveTrans.cxx:596
 TEveTrans.cxx:597
 TEveTrans.cxx:598
 TEveTrans.cxx:599
 TEveTrans.cxx:600
 TEveTrans.cxx:601
 TEveTrans.cxx:602
 TEveTrans.cxx:603
 TEveTrans.cxx:604
 TEveTrans.cxx:605
 TEveTrans.cxx:606
 TEveTrans.cxx:607
 TEveTrans.cxx:608
 TEveTrans.cxx:609
 TEveTrans.cxx:610
 TEveTrans.cxx:611
 TEveTrans.cxx:612
 TEveTrans.cxx:613
 TEveTrans.cxx:614
 TEveTrans.cxx:615
 TEveTrans.cxx:616
 TEveTrans.cxx:617
 TEveTrans.cxx:618
 TEveTrans.cxx:619
 TEveTrans.cxx:620
 TEveTrans.cxx:621
 TEveTrans.cxx:622
 TEveTrans.cxx:623
 TEveTrans.cxx:624
 TEveTrans.cxx:625
 TEveTrans.cxx:626
 TEveTrans.cxx:627
 TEveTrans.cxx:628
 TEveTrans.cxx:629
 TEveTrans.cxx:630
 TEveTrans.cxx:631
 TEveTrans.cxx:632
 TEveTrans.cxx:633
 TEveTrans.cxx:634
 TEveTrans.cxx:635
 TEveTrans.cxx:636
 TEveTrans.cxx:637
 TEveTrans.cxx:638
 TEveTrans.cxx:639
 TEveTrans.cxx:640
 TEveTrans.cxx:641
 TEveTrans.cxx:642
 TEveTrans.cxx:643
 TEveTrans.cxx:644
 TEveTrans.cxx:645
 TEveTrans.cxx:646
 TEveTrans.cxx:647
 TEveTrans.cxx:648
 TEveTrans.cxx:649
 TEveTrans.cxx:650
 TEveTrans.cxx:651
 TEveTrans.cxx:652
 TEveTrans.cxx:653
 TEveTrans.cxx:654
 TEveTrans.cxx:655
 TEveTrans.cxx:656
 TEveTrans.cxx:657
 TEveTrans.cxx:658
 TEveTrans.cxx:659
 TEveTrans.cxx:660
 TEveTrans.cxx:661
 TEveTrans.cxx:662
 TEveTrans.cxx:663
 TEveTrans.cxx:664
 TEveTrans.cxx:665
 TEveTrans.cxx:666
 TEveTrans.cxx:667
 TEveTrans.cxx:668
 TEveTrans.cxx:669
 TEveTrans.cxx:670
 TEveTrans.cxx:671
 TEveTrans.cxx:672
 TEveTrans.cxx:673
 TEveTrans.cxx:674
 TEveTrans.cxx:675
 TEveTrans.cxx:676
 TEveTrans.cxx:677
 TEveTrans.cxx:678
 TEveTrans.cxx:679
 TEveTrans.cxx:680
 TEveTrans.cxx:681
 TEveTrans.cxx:682
 TEveTrans.cxx:683
 TEveTrans.cxx:684
 TEveTrans.cxx:685
 TEveTrans.cxx:686
 TEveTrans.cxx:687
 TEveTrans.cxx:688
 TEveTrans.cxx:689
 TEveTrans.cxx:690
 TEveTrans.cxx:691
 TEveTrans.cxx:692
 TEveTrans.cxx:693
 TEveTrans.cxx:694
 TEveTrans.cxx:695
 TEveTrans.cxx:696
 TEveTrans.cxx:697
 TEveTrans.cxx:698
 TEveTrans.cxx:699
 TEveTrans.cxx:700
 TEveTrans.cxx:701
 TEveTrans.cxx:702
 TEveTrans.cxx:703
 TEveTrans.cxx:704
 TEveTrans.cxx:705
 TEveTrans.cxx:706
 TEveTrans.cxx:707
 TEveTrans.cxx:708
 TEveTrans.cxx:709
 TEveTrans.cxx:710
 TEveTrans.cxx:711
 TEveTrans.cxx:712
 TEveTrans.cxx:713
 TEveTrans.cxx:714
 TEveTrans.cxx:715
 TEveTrans.cxx:716
 TEveTrans.cxx:717
 TEveTrans.cxx:718
 TEveTrans.cxx:719
 TEveTrans.cxx:720
 TEveTrans.cxx:721
 TEveTrans.cxx:722
 TEveTrans.cxx:723
 TEveTrans.cxx:724
 TEveTrans.cxx:725
 TEveTrans.cxx:726
 TEveTrans.cxx:727
 TEveTrans.cxx:728
 TEveTrans.cxx:729
 TEveTrans.cxx:730
 TEveTrans.cxx:731
 TEveTrans.cxx:732
 TEveTrans.cxx:733
 TEveTrans.cxx:734
 TEveTrans.cxx:735
 TEveTrans.cxx:736
 TEveTrans.cxx:737
 TEveTrans.cxx:738
 TEveTrans.cxx:739
 TEveTrans.cxx:740
 TEveTrans.cxx:741
 TEveTrans.cxx:742
 TEveTrans.cxx:743
 TEveTrans.cxx:744
 TEveTrans.cxx:745
 TEveTrans.cxx:746
 TEveTrans.cxx:747
 TEveTrans.cxx:748
 TEveTrans.cxx:749
 TEveTrans.cxx:750
 TEveTrans.cxx:751
 TEveTrans.cxx:752
 TEveTrans.cxx:753
 TEveTrans.cxx:754
 TEveTrans.cxx:755
 TEveTrans.cxx:756
 TEveTrans.cxx:757
 TEveTrans.cxx:758
 TEveTrans.cxx:759
 TEveTrans.cxx:760
 TEveTrans.cxx:761
 TEveTrans.cxx:762
 TEveTrans.cxx:763
 TEveTrans.cxx:764
 TEveTrans.cxx:765
 TEveTrans.cxx:766
 TEveTrans.cxx:767
 TEveTrans.cxx:768
 TEveTrans.cxx:769
 TEveTrans.cxx:770
 TEveTrans.cxx:771
 TEveTrans.cxx:772
 TEveTrans.cxx:773
 TEveTrans.cxx:774
 TEveTrans.cxx:775
 TEveTrans.cxx:776
 TEveTrans.cxx:777
 TEveTrans.cxx:778
 TEveTrans.cxx:779
 TEveTrans.cxx:780
 TEveTrans.cxx:781
 TEveTrans.cxx:782
 TEveTrans.cxx:783
 TEveTrans.cxx:784
 TEveTrans.cxx:785
 TEveTrans.cxx:786
 TEveTrans.cxx:787
 TEveTrans.cxx:788
 TEveTrans.cxx:789
 TEveTrans.cxx:790
 TEveTrans.cxx:791
 TEveTrans.cxx:792
 TEveTrans.cxx:793
 TEveTrans.cxx:794
 TEveTrans.cxx:795
 TEveTrans.cxx:796
 TEveTrans.cxx:797
 TEveTrans.cxx:798
 TEveTrans.cxx:799
 TEveTrans.cxx:800
 TEveTrans.cxx:801
 TEveTrans.cxx:802
 TEveTrans.cxx:803
 TEveTrans.cxx:804
 TEveTrans.cxx:805
 TEveTrans.cxx:806
 TEveTrans.cxx:807
 TEveTrans.cxx:808
 TEveTrans.cxx:809
 TEveTrans.cxx:810
 TEveTrans.cxx:811
 TEveTrans.cxx:812
 TEveTrans.cxx:813
 TEveTrans.cxx:814
 TEveTrans.cxx:815
 TEveTrans.cxx:816
 TEveTrans.cxx:817
 TEveTrans.cxx:818
 TEveTrans.cxx:819
 TEveTrans.cxx:820
 TEveTrans.cxx:821
 TEveTrans.cxx:822
 TEveTrans.cxx:823
 TEveTrans.cxx:824
 TEveTrans.cxx:825
 TEveTrans.cxx:826
 TEveTrans.cxx:827
 TEveTrans.cxx:828
 TEveTrans.cxx:829
 TEveTrans.cxx:830
 TEveTrans.cxx:831
 TEveTrans.cxx:832
 TEveTrans.cxx:833
 TEveTrans.cxx:834
 TEveTrans.cxx:835
 TEveTrans.cxx:836
 TEveTrans.cxx:837
 TEveTrans.cxx:838
 TEveTrans.cxx:839
 TEveTrans.cxx:840
 TEveTrans.cxx:841
 TEveTrans.cxx:842
 TEveTrans.cxx:843
 TEveTrans.cxx:844
 TEveTrans.cxx:845
 TEveTrans.cxx:846
 TEveTrans.cxx:847
 TEveTrans.cxx:848
 TEveTrans.cxx:849
 TEveTrans.cxx:850
 TEveTrans.cxx:851
 TEveTrans.cxx:852
 TEveTrans.cxx:853
 TEveTrans.cxx:854
 TEveTrans.cxx:855
 TEveTrans.cxx:856
 TEveTrans.cxx:857
 TEveTrans.cxx:858
 TEveTrans.cxx:859
 TEveTrans.cxx:860
 TEveTrans.cxx:861
 TEveTrans.cxx:862
 TEveTrans.cxx:863
 TEveTrans.cxx:864
 TEveTrans.cxx:865
 TEveTrans.cxx:866
 TEveTrans.cxx:867
 TEveTrans.cxx:868
 TEveTrans.cxx:869
 TEveTrans.cxx:870
 TEveTrans.cxx:871
 TEveTrans.cxx:872
 TEveTrans.cxx:873
 TEveTrans.cxx:874
 TEveTrans.cxx:875
 TEveTrans.cxx:876
 TEveTrans.cxx:877
 TEveTrans.cxx:878
 TEveTrans.cxx:879
 TEveTrans.cxx:880
 TEveTrans.cxx:881
 TEveTrans.cxx:882
 TEveTrans.cxx:883
 TEveTrans.cxx:884
 TEveTrans.cxx:885
 TEveTrans.cxx:886
 TEveTrans.cxx:887
 TEveTrans.cxx:888
 TEveTrans.cxx:889
 TEveTrans.cxx:890
 TEveTrans.cxx:891
 TEveTrans.cxx:892
 TEveTrans.cxx:893
 TEveTrans.cxx:894
 TEveTrans.cxx:895
 TEveTrans.cxx:896
 TEveTrans.cxx:897
 TEveTrans.cxx:898
 TEveTrans.cxx:899
 TEveTrans.cxx:900
 TEveTrans.cxx:901
 TEveTrans.cxx:902
 TEveTrans.cxx:903
 TEveTrans.cxx:904
 TEveTrans.cxx:905
 TEveTrans.cxx:906
 TEveTrans.cxx:907
 TEveTrans.cxx:908
 TEveTrans.cxx:909
 TEveTrans.cxx:910
 TEveTrans.cxx:911
 TEveTrans.cxx:912
 TEveTrans.cxx:913
 TEveTrans.cxx:914
 TEveTrans.cxx:915
 TEveTrans.cxx:916
 TEveTrans.cxx:917
 TEveTrans.cxx:918
 TEveTrans.cxx:919
 TEveTrans.cxx:920
 TEveTrans.cxx:921
 TEveTrans.cxx:922
 TEveTrans.cxx:923
 TEveTrans.cxx:924
 TEveTrans.cxx:925
 TEveTrans.cxx:926
 TEveTrans.cxx:927
 TEveTrans.cxx:928
 TEveTrans.cxx:929
 TEveTrans.cxx:930
 TEveTrans.cxx:931
 TEveTrans.cxx:932
 TEveTrans.cxx:933
 TEveTrans.cxx:934
 TEveTrans.cxx:935
 TEveTrans.cxx:936
 TEveTrans.cxx:937
 TEveTrans.cxx:938
 TEveTrans.cxx:939
 TEveTrans.cxx:940
 TEveTrans.cxx:941
 TEveTrans.cxx:942
 TEveTrans.cxx:943
 TEveTrans.cxx:944
 TEveTrans.cxx:945
 TEveTrans.cxx:946
 TEveTrans.cxx:947
 TEveTrans.cxx:948
 TEveTrans.cxx:949
 TEveTrans.cxx:950
 TEveTrans.cxx:951
 TEveTrans.cxx:952
 TEveTrans.cxx:953
 TEveTrans.cxx:954
 TEveTrans.cxx:955
 TEveTrans.cxx:956
 TEveTrans.cxx:957
 TEveTrans.cxx:958
 TEveTrans.cxx:959
 TEveTrans.cxx:960
 TEveTrans.cxx:961
 TEveTrans.cxx:962
 TEveTrans.cxx:963
 TEveTrans.cxx:964
 TEveTrans.cxx:965
 TEveTrans.cxx:966
 TEveTrans.cxx:967
 TEveTrans.cxx:968
 TEveTrans.cxx:969
 TEveTrans.cxx:970
 TEveTrans.cxx:971
 TEveTrans.cxx:972
 TEveTrans.cxx:973
 TEveTrans.cxx:974
 TEveTrans.cxx:975
 TEveTrans.cxx:976
 TEveTrans.cxx:977
 TEveTrans.cxx:978
 TEveTrans.cxx:979
 TEveTrans.cxx:980
 TEveTrans.cxx:981
 TEveTrans.cxx:982
 TEveTrans.cxx:983
 TEveTrans.cxx:984
 TEveTrans.cxx:985
 TEveTrans.cxx:986
 TEveTrans.cxx:987
 TEveTrans.cxx:988
 TEveTrans.cxx:989
 TEveTrans.cxx:990
 TEveTrans.cxx:991
 TEveTrans.cxx:992
 TEveTrans.cxx:993
 TEveTrans.cxx:994
 TEveTrans.cxx:995
 TEveTrans.cxx:996
 TEveTrans.cxx:997
 TEveTrans.cxx:998
 TEveTrans.cxx:999
 TEveTrans.cxx:1000
 TEveTrans.cxx:1001
 TEveTrans.cxx:1002
 TEveTrans.cxx:1003
 TEveTrans.cxx:1004
 TEveTrans.cxx:1005
 TEveTrans.cxx:1006
 TEveTrans.cxx:1007
 TEveTrans.cxx:1008
 TEveTrans.cxx:1009
 TEveTrans.cxx:1010
 TEveTrans.cxx:1011
 TEveTrans.cxx:1012
 TEveTrans.cxx:1013
 TEveTrans.cxx:1014
 TEveTrans.cxx:1015
 TEveTrans.cxx:1016
 TEveTrans.cxx:1017
 TEveTrans.cxx:1018
 TEveTrans.cxx:1019
 TEveTrans.cxx:1020
 TEveTrans.cxx:1021
 TEveTrans.cxx:1022
 TEveTrans.cxx:1023
 TEveTrans.cxx:1024
 TEveTrans.cxx:1025
 TEveTrans.cxx:1026
 TEveTrans.cxx:1027
 TEveTrans.cxx:1028
 TEveTrans.cxx:1029
 TEveTrans.cxx:1030
 TEveTrans.cxx:1031
 TEveTrans.cxx:1032
 TEveTrans.cxx:1033
 TEveTrans.cxx:1034
 TEveTrans.cxx:1035
 TEveTrans.cxx:1036
 TEveTrans.cxx:1037
 TEveTrans.cxx:1038
 TEveTrans.cxx:1039
 TEveTrans.cxx:1040
 TEveTrans.cxx:1041
 TEveTrans.cxx:1042
 TEveTrans.cxx:1043
 TEveTrans.cxx:1044
 TEveTrans.cxx:1045
 TEveTrans.cxx:1046
 TEveTrans.cxx:1047
 TEveTrans.cxx:1048
 TEveTrans.cxx:1049
 TEveTrans.cxx:1050
 TEveTrans.cxx:1051
 TEveTrans.cxx:1052
 TEveTrans.cxx:1053
 TEveTrans.cxx:1054
 TEveTrans.cxx:1055
 TEveTrans.cxx:1056
 TEveTrans.cxx:1057
 TEveTrans.cxx:1058
 TEveTrans.cxx:1059
 TEveTrans.cxx:1060
 TEveTrans.cxx:1061
 TEveTrans.cxx:1062
 TEveTrans.cxx:1063
 TEveTrans.cxx:1064
 TEveTrans.cxx:1065
 TEveTrans.cxx:1066
 TEveTrans.cxx:1067
 TEveTrans.cxx:1068
 TEveTrans.cxx:1069
 TEveTrans.cxx:1070
 TEveTrans.cxx:1071
 TEveTrans.cxx:1072
 TEveTrans.cxx:1073
 TEveTrans.cxx:1074
 TEveTrans.cxx:1075
 TEveTrans.cxx:1076
 TEveTrans.cxx:1077
 TEveTrans.cxx:1078
 TEveTrans.cxx:1079
 TEveTrans.cxx:1080
 TEveTrans.cxx:1081
 TEveTrans.cxx:1082
 TEveTrans.cxx:1083
 TEveTrans.cxx:1084
 TEveTrans.cxx:1085
 TEveTrans.cxx:1086
 TEveTrans.cxx:1087
 TEveTrans.cxx:1088
 TEveTrans.cxx:1089
 TEveTrans.cxx:1090
 TEveTrans.cxx:1091
 TEveTrans.cxx:1092
 TEveTrans.cxx:1093
 TEveTrans.cxx:1094
 TEveTrans.cxx:1095
 TEveTrans.cxx:1096
 TEveTrans.cxx:1097
 TEveTrans.cxx:1098
 TEveTrans.cxx:1099
 TEveTrans.cxx:1100
 TEveTrans.cxx:1101
 TEveTrans.cxx:1102
 TEveTrans.cxx:1103
 TEveTrans.cxx:1104
 TEveTrans.cxx:1105
 TEveTrans.cxx:1106
 TEveTrans.cxx:1107
 TEveTrans.cxx:1108
 TEveTrans.cxx:1109
 TEveTrans.cxx:1110
 TEveTrans.cxx:1111
 TEveTrans.cxx:1112
 TEveTrans.cxx:1113
 TEveTrans.cxx:1114
 TEveTrans.cxx:1115
 TEveTrans.cxx:1116
 TEveTrans.cxx:1117
 TEveTrans.cxx:1118
 TEveTrans.cxx:1119
 TEveTrans.cxx:1120
 TEveTrans.cxx:1121
 TEveTrans.cxx:1122
 TEveTrans.cxx:1123
 TEveTrans.cxx:1124
 TEveTrans.cxx:1125
 TEveTrans.cxx:1126
 TEveTrans.cxx:1127
 TEveTrans.cxx:1128
 TEveTrans.cxx:1129
 TEveTrans.cxx:1130
 TEveTrans.cxx:1131
 TEveTrans.cxx:1132
 TEveTrans.cxx:1133
 TEveTrans.cxx:1134
 TEveTrans.cxx:1135
 TEveTrans.cxx:1136