ROOT logo
// $Id: HTrans.h 2419 2010-07-25 18:22:36Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#ifndef GledCore_HTrans_H
#define GledCore_HTrans_H

#include <TMath.h>

#ifndef __CINT__
namespace Opcode
{
  class Point;
  class Matrix4x4;
}
#endif

template<class TT> class HTrans;

//==============================================================================
// HPoint -- a simple 3D point
//==============================================================================

template<class TT>
class HPoint
{
public:
  TT x, y, z;

  HPoint() : x(0), y(0), z(0) {}
  HPoint(const Float_t* p)  : x(p[0]), y(p[1]), z(p[2]) {}
  HPoint(const Double_t* p) : x(p[0]), y(p[1]), z(p[2]) {}
  HPoint(TT _x, TT _y, TT _z) : x(_x), y(_y), z(_z) {}

  operator const TT*() const { return &x; }
  operator       TT*()       { return &x; }

  const TT* Arr() const { return &x; }
        TT* Arr()       { return &x; }

  TT  operator [] (Int_t idx) const { return (&x)[idx]; }
  TT& operator [] (Int_t idx)       { return (&x)[idx]; }

  void Set(TT _x, TT _y, TT _z) { x = _x; y = _y; z = _z; }
  void Set(const Float_t* p)    { x = p[0]; y = p[1]; z = p[2]; }
  void Set(const Double_t* p)   { x = p[0]; y = p[1]; z = p[2]; }
  void Zero()                   { x = y = z = 0; }

  HPoint& Neg() { x = -x; y = -y; z = -z; return *this; }

  HPoint& Add(TT _x, TT _y, TT _z) { x += _x; y += _y; z += _z; return *this; }

  HPoint& operator+=(const HPoint& a)   { x += a.x;  y += a.y;  z += a.z;  return *this; }
  HPoint& operator+=(const Float_t*  v) { x += v[0]; y += v[1]; z += v[2]; return *this; }
  HPoint& operator+=(const Double_t* v) { x += v[0]; y += v[1]; z += v[2]; return *this; }

  HPoint& operator-=(const HPoint& a)   { x -= a.x;  y -= a.y;  z -= a.z;  return *this; }
  HPoint& operator-=(const Float_t*  v) { x -= v[0]; y -= v[1]; z -= v[2]; return *this; }
  HPoint& operator-=(const Double_t* v) { x -= v[0]; y -= v[1]; z -= v[2]; return *this; }

  HPoint& operator*=(TT f) { x *= f; y *= f; z *= f; return *this; }
  HPoint& operator/=(TT d) { return operator*=(1/d); }

  TT Dot(const HPoint& v)   const { return x*v.x  + y*v.y  + z*v.z;  }
  TT Dot(const Float_t* v)  const { return x*v[0] + y*v[1] + z*v[2]; }
  TT Dot(const Double_t* v) const { return x*v[0] + y*v[1] + z*v[2]; }

  TT SquareMagnitude() const { return x*x + y*y + z*z; }
  TT Magnitude()       const { return TMath::Sqrt(SquareMagnitude()); }
  TT Mag2()            const { return x*x + y*y + z*z; }
  TT Mag()             const { return TMath::Sqrt(SquareMagnitude()); }

  TT   Perp2() const { return x*x + y*y; }
  TT   Perp()  const { return TMath::Sqrt(Perp2()); }

  TT   Phi()      const { return TMath::ATan2(y, x); }
  TT   Theta()    const { return TMath::ATan2(Perp(), z); }
  TT   CosTheta() const { TT m = Mag(); return m == 0 ? 1 : z / m; }
  TT   Eta()      const;

  TT Normalize(TT length=1);

  TT SquareDistance(const HPoint& v) const;
  TT Distance(const HPoint& v) const;

  HPoint& Cross(const HPoint& a, const HPoint& b);
  HPoint  Cross(const HPoint& b) const;

  HPoint  Orthogonal() const;
  void    OrthoNormBase(HPoint& a, HPoint& b) const;

  void Print() const;

  // No ClassDef
};

template<class TT>
std::ostream& operator<<(std::ostream& s, const HPoint<TT>& t);

//------------------------------------------------------------------------------

template<typename TT>
inline TT HPoint<TT>::SquareDistance(const HPoint& b) const
{
   return ((x - b.x) * (x - b.x) +
           (y - b.y) * (y - b.y) +
           (z - b.z) * (z - b.z));
}

template<typename TT>
inline TT HPoint<TT>::Distance(const HPoint& b) const
{
  return TMath::Sqrt(SquareDistance(b));
}

template<typename TT>
HPoint<TT> HPoint<TT>::Cross(const HPoint<TT>& b) const
{
  return HPoint<TT>(y * b.z - z * b.y,
		    z * b.x - x * b.z,
		    x * b.y - y * b.x);
}

template<typename TT>
HPoint<TT>& HPoint<TT>::Cross(const HPoint<TT>& a, const HPoint<TT>& b)
{
  x = a.y * b.z - a.z * b.y;
  y = a.z * b.x - a.x * b.z;
  z = a.x * b.y - a.y * b.x;
  return *this;
}

//------------------------------------------------------------------------------

template<typename TT>
inline HPoint<TT> operator+(const HPoint<TT>& a, const HPoint<TT>& b)
{
   HPoint<TT> r(a);
   return r += b;
}

template<typename TT>
inline HPoint<TT> operator-(const HPoint<TT>& a, const HPoint<TT>& b)
{
   HPoint<TT> r(a);
   return r -= b;
}

template<typename TT>
inline HPoint<TT> operator*(const HPoint<TT>& a, TT b)
{
   HPoint<TT> r(a);
   return r *= b;
}

template<typename TT>
inline HPoint<TT> operator*(TT b, const HPoint<TT>& a)
{
   HPoint<TT> r(a);
   return r *= b;
}

template<typename TT>
inline HPoint<TT> operator/(const HPoint<TT>& a, TT b)
{
   HPoint<TT> r(a);
   return r /= b;
}

//------------------------------------------------------------------------------
// HPointF
//------------------------------------------------------------------------------

class HPointF : public HPoint<Float_t>
{
  typedef HPoint<Float_t> TP;

public:
  HPointF() : TP() {}
  HPointF(const Float_t* p)  : TP(p) {}
  HPointF(const Double_t* p) : TP(p) {}
  HPointF(Float_t _x, Float_t _y, Float_t _z) : TP(_x, _y, _z) {}
  template <typename OO>
  HPointF(const HPoint<OO>& v) : TP(v.x, v.y, v.z) {}

#ifndef __CINT__
  operator Opcode::Point* () { return  (Opcode::Point*) &x; }
  operator Opcode::Point& () { return *(Opcode::Point*) &x; }
  operator const Opcode::Point* () const { return  (Opcode::Point*) &x; }
  operator const Opcode::Point& () const { return *(Opcode::Point*) &x; }
#endif

  ClassDefNV(HPointF, 1); // Simple, streamable 3D point.
};

//------------------------------------------------------------------------------
// HPointD
//------------------------------------------------------------------------------

class HPointD : public HPoint<Double_t>
{
  typedef HPoint<Double_t> TP;

public:
  HPointD() : TP() {}
  HPointD(const Float_t* p)  : TP(p) {}
  HPointD(const Double_t* p) : TP(p) {}
  HPointD(Double_t _x, Double_t _y, Double_t _z) : TP(_x, _y, _z) {}
  template <typename OO>
  HPointD(const HPoint<OO>& v) : TP(v.x, v.y, v.z) {}

  ClassDefNV(HPointD, 1); // Simple, streamable 3D point.
};


//==============================================================================
// HTrans -- 3D transformation in generalised coordinates
//==============================================================================

template<class TT>
class HTrans
{
protected:
  TT       M[16];

public:
  HTrans();
  HTrans(const HTrans& z);
  HTrans(const Float_t*  x);
  HTrans(const Double_t* x);

  operator const TT*() const { return M; }
  operator       TT*()       { return M; }


  // Element access

  TT* Array() { return M; }      const TT* Array() const { return M; }
  TT* ArrX()  { return M; }      const TT* ArrX()  const { return M; }
  TT* ArrY()  { return M +  4; } const TT* ArrY()  const { return M +  4; }
  TT* ArrZ()  { return M +  8; } const TT* ArrZ()  const { return M +  8; }
  TT* ArrT()  { return M + 12; } const TT* ArrT()  const { return M + 12; }

  TT  operator[](Int_t i) const { return M[i]; }
  TT& operator[](Int_t i)       { return M[i]; }

  TT  CM(Int_t i, Int_t j) const { return M[4*j + i]; }
  TT& CM(Int_t i, Int_t j)       { return M[4*j + i]; }

  TT  operator()(Int_t i, Int_t j) const { return M[4*j + i - 5]; }
  TT& operator()(Int_t i, Int_t j)       { return M[4*j + i - 5]; }


  // General operations

  void UnitTrans();
  void UnitRot();
  void SetTrans(const HTrans& t);
  void SetFromArray(const Float_t*  arr);
  void SetFromArray(const Double_t* arr);
  void SetupRotation(Int_t i, Int_t j, TT f);

  TT   Norm3Column(Int_t col);
  TT   Orto3Column(Int_t col, Int_t ref);
  TT   OrtoNorm3Column(Int_t col, Int_t ref);
  void OrtoNorm3();
  void SetBaseVecViaCross(Int_t i);

  void Transpose();
  void TransposeRotationPart();
  TT   Invert();
  TT   InvertWithoutRow4();

  void MultLeft(const HTrans& t);
  void MultRight(const HTrans& t);
  void operator*=(const HTrans& t) { MultRight(t); }

  HTrans operator*(const HTrans& t);

  void MultLeft3x3(const TT* m);
  void MultRight3x3(const TT* m);

  void MultLeft3x3transposed(const TT* m);
  void MultRight3x3transposed(const TT* m);

  // Move & Rotate

  void MoveLF(Int_t ai, TT amount);
  void Move3LF(TT x, TT y, TT z);
  void RotateLF(Int_t i1, Int_t i2, TT amount);

  void MovePF(Int_t ai, TT amount);
  void Move3PF(TT x, TT y, TT z);
  void RotatePF(Int_t i1, Int_t i2, TT amount);

  void Move(const HTrans& a, Int_t ai, TT amount);
  void Move3(const HTrans& a, TT x, TT y, TT z);
  void Rotate(const HTrans& a, Int_t i1, Int_t i2, TT amount);


  // Base-vector interface

  void SetBaseVec(Int_t b, TT x, TT y, TT z)
  { TT* C = M + 4*--b; C[0] = x; C[1] = y; C[2] = z; }

  template <typename OO>
  void SetBaseVec(Int_t b, const HPoint<OO>& v)
  { SetBaseVec(b, v.x, v.y, v.z); }

  void SetBaseVec(Int_t b, Float_t* x)
  { TT* C = M + 4*--b; C[0] = x[0]; C[1] = x[1]; C[2] = x[2]; }

  void SetBaseVec(Int_t b, Double_t* x)
  { TT* C = M + 4*--b; C[0] = x[0]; C[1] = x[1]; C[2] = x[2]; }

  TT*       PtrBaseVec(Int_t b)       { return &M[4*(b-1)]; }
  const TT* PtrBaseVec(Int_t b) const { return &M[4*(b-1)]; }
  TT*       PtrBaseVecX()             { return &M[0]; }
  const TT* PtrBaseVecX()       const { return &M[0]; }
  TT*       PtrBaseVecY()             { return &M[4]; }
  const TT* PtrBaseVecY()       const { return &M[4]; }
  TT*       PtrBaseVecZ()             { return &M[8]; }
  const TT* PtrBaseVecZ()       const { return &M[8]; }

  HPoint<TT> GetBaseVec(Int_t b) const
  { const TT* C = M + 4*--b; return HPoint<TT>(C[0], C[1], C[2]); }

  void GetBaseVec(Int_t b, Float_t* x) const
  { const TT* C = M + 4*--b; x[0] = C[0], x[1] = C[1], x[2] = C[2]; }

  void GetBaseVec(Int_t b, Double_t* x) const
  { const TT* C = M + 4*--b; x[0] = C[0], x[1] = C[1], x[2] = C[2]; }


  // Position interface (can also use base-vec with idx 4)

  void SetPos(TT x, TT y, TT z) { M[12] = x; M[13] = y; M[14] = z; }
  template <typename OO>
  void SetPos(const HPoint<OO>& v) { SetPos(v.x,   v.y,   v.z);   }
  void SetPos(const Float_t* x)    { SetPos(x[0],  x[1],  x[2]);  }
  void SetPos(const Double_t* x)   { SetPos(x[0],  x[1],  x[2]);  }
  void SetPos(const HTrans& t)     { SetPos(t[12], t[13], t[14]); }

  void GetPos(TT& x, TT& y, TT& z) const { x = M[12]; y = M[13]; z = M[14];  }
  HPoint<TT> GetPos()              const { return HPoint<TT>(M[12], M[13], M[14]); }
  void GetPos(Float_t* x)          const { x[0] = M[12]; x[1] = M[13]; x[2] = M[14]; }
  void GetPos(Double_t* x)         const { x[0] = M[12]; x[1] = M[13]; x[2] = M[14]; }
  TT*  PtrPos()                          { return &M[12]; }


  // Cardan angle interface

  void SetRotByAngles(Float_t a1, Float_t a2, Float_t a3);
  void SetRotByAnyAngles(Float_t a1, Float_t a2, Float_t a3, const Text_t* pat);
  void GetRotAngles(Float_t* x) const;


  // Scaling

  void Scale(TT sx, TT sy, TT sz);
  void GetScale(TT& sx, TT& sy, TT& sz) const;
  void Unscale(TT& sx, TT& sy, TT& sz);
  TT   Unscale();


  // Operations on vectors

  void MultiplyIP(HPoint<TT>& v, TT w=1) const;
  void RotateIP(HPoint<TT>& v) const;

  HPoint<TT> Multiply(const HPoint<TT>& v, TT w=1) const;
  HPoint<TT> Rotate(const HPoint<TT>& v) const;

  void MultiplyVec3IP(TT* in, TT w) const;
  void MultiplyVec3(const TT* in, TT w, TT* out) const;
  void RotateVec3IP(TT* in) const;
  void RotateVec3(const TT* in, TT* out) const;
  void RotateBackVec3(const TT* in, TT* out) const;

  void Print() const;

  // No ClassDef
};


template<class TT>
std::ostream& operator<<(std::ostream& s, const HTrans<TT>& t);


//------------------------------------------------------------------------------
// HTransF
//------------------------------------------------------------------------------

class HTransF : public HTrans<Float_t>
{
  typedef HTrans<Float_t> TP;

public:
  HTransF()                          : TP()  {}
  HTransF(const HTransF& z)          : TP(z) {}
  HTransF(const HTrans<Double_t>& z) : HTrans<Float_t>(z.Array()) {}
  ~HTransF() {}

#ifndef __CINT__
  Opcode::Point& ref_base_vec(Int_t i) { return * (Opcode::Point*) PtrBaseVec(i); }
  Opcode::Point& ref_base_vec_x()      { return * (Opcode::Point*) PtrBaseVecX(); }
  Opcode::Point& ref_base_vec_y()      { return * (Opcode::Point*) PtrBaseVecY(); }
  Opcode::Point& ref_base_vec_z()      { return * (Opcode::Point*) PtrBaseVecZ(); }
  Opcode::Point& ref_pos()             { return * (Opcode::Point*) PtrPos(); }

  operator Opcode::Matrix4x4* () { return  (Opcode::Matrix4x4*)M; }
  operator Opcode::Matrix4x4& () { return *(Opcode::Matrix4x4*)M; }
  operator const Opcode::Matrix4x4* () const { return  (Opcode::Matrix4x4*)M; }
  operator const Opcode::Matrix4x4& () const { return *(Opcode::Matrix4x4*)M; }
#endif

  ClassDefNV(HTransF, 1);
};


//------------------------------------------------------------------------------
// HTransD
//------------------------------------------------------------------------------

class HTransD : public HTrans<Double_t>
{
  typedef HTrans<Double_t> TP;

public:
  HTransD() : TP() {}
  HTransD(const HTransD& z)         : TP(z) {}
  HTransD(const HTrans<Float_t>& z) : TP(z.Array()) {}
  ~HTransD() {}

  ClassDefNV(HTransD, 1);
};

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