ROOT logo
// @(#)root/g3d:$Id: TRotMatrix.cxx 20882 2007-11-19 11:31:26Z rdm $
// Author: Rene Brun   14/09/95

/*************************************************************************
 * Copyright (C) 1995-2000, 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 "TGeometry.h"
#include "TRotMatrix.h"
#include "TClass.h"
#include "TMath.h"

ClassImp(TRotMatrix)


//______________________________________________________________________________
//
// Manages a detector rotation matrix. See class TGeometry.
//


//______________________________________________________________________________
TRotMatrix::TRotMatrix()
{
   // RotMatrix default constructor.
}


//______________________________________________________________________________
TRotMatrix::TRotMatrix(const char *name, const char *title, Double_t *matrix)
           :TNamed(name,title)
{
   // RotMatrix normal constructor.

   if (!matrix) { Error("ctor","No rotation is supplied"); return; }

   SetMatrix(matrix);
   if (!gGeometry) gGeometry = new TGeometry();
   fNumber = gGeometry->GetListOfMatrices()->GetSize();
   gGeometry->GetListOfMatrices()->Add(this);
}


//______________________________________________________________________________
TRotMatrix::TRotMatrix(const char *name, const char *title, Double_t theta, Double_t phi, Double_t psi)
           :TNamed(name,title)
{
   // RotMatrix normal constructor.

   printf("ERROR: This form of TRotMatrix constructor not implemented yet\n");

   Int_t i;
   fTheta  = theta;
   fPhi    = phi;
   fPsi    = psi;
   fType   = 2;
   for (i=0;i<9;i++) fMatrix[i] = 0;
   fMatrix[0] = 1;   fMatrix[4] = 1;   fMatrix[8] = 1;

   if (!gGeometry) gGeometry = new TGeometry();
   fNumber = gGeometry->GetListOfMatrices()->GetSize();
   gGeometry->GetListOfMatrices()->Add(this);
}


//______________________________________________________________________________
TRotMatrix::TRotMatrix(const char *name, const char *title, Double_t theta1, Double_t phi1
                                                  , Double_t theta2, Double_t phi2
                                                  , Double_t theta3, Double_t phi3)
                :TNamed(name,title)
{
   // RotMatrix normal constructor defined a la GEANT.
   //
   // The TRotMatrix constructor with six angles uses the GEANT convention:
   //
   // theta1 is the polar angle of the x-prim axis in the main reference system
   // (MRS), theta2 and theta3 have the same meaning for the y-prim and z-prim
   // axis.
   //
   // Phi1 is the azimuthal angle of the x-prim in the MRS and phi2 and phi3
   // have the same meaning for y-prim and z-prim.
   //
   //
   // for example, the unit matrix is defined in the following way.
   //
   //     x-prim || x, y-prim || y, z-prim || z
   //
   //     means:  theta1=90, theta2=90, theta3=0, phi1=0, phi2=90, phi3=0

   SetAngles(theta1,phi1,theta2,phi2,theta3,phi3);

   if (!gGeometry) gGeometry = new TGeometry();
   fNumber = gGeometry->GetListOfMatrices()->GetSize();
   gGeometry->GetListOfMatrices()->Add(this);
}


//______________________________________________________________________________
TRotMatrix::~TRotMatrix()
{
   // RotMatrix default destructor.

   if (gGeometry) gGeometry->GetListOfMatrices()->Remove(this);
}


//______________________________________________________________________________
Double_t  TRotMatrix::Determinant() const
{
   // Determinant() returns the value of the determiant of this matrix

   return
      fMatrix[0] * (fMatrix[4]*fMatrix[8] - fMatrix[7]*fMatrix[5])
    - fMatrix[3] * (fMatrix[1]*fMatrix[8] - fMatrix[7]*fMatrix[2])
    + fMatrix[6] * (fMatrix[1]*fMatrix[5] - fMatrix[4]*fMatrix[2]);
}


//______________________________________________________________________________
Double_t* TRotMatrix::GetGLMatrix(Double_t *rGLMatrix) const
{
   //  Convert this matrix to the OpenGL [4x4]
   //
   //  [  fMatrix[0]   fMatrix[1]   fMatrix[2]    0  ]
   //  [  fMatrix[3]   fMatrix[4]   fMatrix[5]    0  ]
   //  [  fMatrix[6]   fMatrix[7]   fMatrix[8]    0  ]
   //  [     0             0           0          1  ]
   //
   //  Input:
   //  -----
   //  Double_t *rGLMatrix - pointer to Double_t 4x4 buffer array
   //
   //  Return:
   //  ------
   //  Double_t pointer to the input buffer

   Double_t *glmatrix = rGLMatrix;
   const Double_t *matrix   = fMatrix;
   if (rGLMatrix)
   {
      for (Int_t i=0;i<3;i++) {
         for (Int_t j=0;j<3;j++) memcpy(glmatrix,matrix,3*sizeof(Double_t));
         matrix   += 3;
         glmatrix += 3;
         *glmatrix = 0.0;
         glmatrix++;
      }
      for (Int_t j=0;j<3;j++) {
         *glmatrix = 0.0;
         glmatrix++;
      }
      *glmatrix = 1.0;
   }
   return rGLMatrix;
}


//______________________________________________________________________________
const Double_t* TRotMatrix::SetAngles(Double_t theta1, Double_t phi1,
                Double_t theta2, Double_t phi2,Double_t theta3, Double_t phi3)
{
   // theta1 is the polar angle of the x-prim axis in the main reference system
   // (MRS), theta2 and theta3 have the same meaning for the y-prim and z-prim
   // axis.
   //
   // Phi1 is the azimuthal angle of the x-prim in the MRS and phi2 and phi3
   // have the same meaning for y-prim and z-prim.
   //
   //
   // for example, the unit matrix is defined in the following way.
   //
   //     x-prim || x, y-prim || y, z-prim || z
   //
   //     means:  theta1=90, theta2=90, theta3=0, phi1=0, phi2=90, phi3=0

   const Double_t degrad = 0.0174532925199432958;

   fTheta  = theta1;
   fPhi    = phi1;
   fPsi    = theta2;

   fType   = 2;
   if (!strcmp(GetName(),"Identity")) fType = 0;

   fMatrix[0] = TMath::Sin(theta1*degrad)*TMath::Cos(phi1*degrad);
   fMatrix[1] = TMath::Sin(theta1*degrad)*TMath::Sin(phi1*degrad);
   fMatrix[2] = TMath::Cos(theta1*degrad);
   fMatrix[3] = TMath::Sin(theta2*degrad)*TMath::Cos(phi2*degrad);
   fMatrix[4] = TMath::Sin(theta2*degrad)*TMath::Sin(phi2*degrad);
   fMatrix[5] = TMath::Cos(theta2*degrad);
   fMatrix[6] = TMath::Sin(theta3*degrad)*TMath::Cos(phi3*degrad);
   fMatrix[7] = TMath::Sin(theta3*degrad)*TMath::Sin(phi3*degrad);
   fMatrix[8] = TMath::Cos(theta3*degrad);

   SetReflection();
   return fMatrix;
}


//______________________________________________________________________________
void TRotMatrix::SetMatrix(const Double_t *matrix)
{
   // copy predefined 3x3 matrix into TRotMatrix object

   fTheta  = 0;
   fPhi    = 0;
   fPsi    = 0;
   fType   = 0;
   if (!matrix) return;
   fType   = 2;
   memcpy(fMatrix,matrix,9*sizeof(Double_t));
   SetReflection();
}


//______________________________________________________________________________
void TRotMatrix::SetReflection()
{
   // SetReflection() -  checks whether the determinant of this
   //                    matrix defines the reflection transformation
   //                    and set the "reflection" flag if any

   ResetBit(kReflection);
   if (Determinant() < 0) { fType=1; SetBit(kReflection);}
}


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

   if (R__b.IsReading()) {
      UInt_t R__s, R__c;
      Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
      if (R__v > 1) {
         R__b.ReadClassBuffer(TRotMatrix::Class(), this, R__v, R__s, R__c);
         return;
      }
      //====process old versions before automatic schema evolution
      TNamed::Streamer(R__b);
      R__b >> fNumber;
      R__b >> fType;
      R__b >> fTheta;
      R__b >> fPhi;
      R__b >> fPsi;
      R__b.ReadStaticArray(fMatrix);
      R__b.CheckByteCount(R__s, R__c, TRotMatrix::IsA());
      //====end of old versions
      
   } else {
      R__b.WriteClassBuffer(TRotMatrix::Class(),this);
   }
}
 TRotMatrix.cxx:1
 TRotMatrix.cxx:2
 TRotMatrix.cxx:3
 TRotMatrix.cxx:4
 TRotMatrix.cxx:5
 TRotMatrix.cxx:6
 TRotMatrix.cxx:7
 TRotMatrix.cxx:8
 TRotMatrix.cxx:9
 TRotMatrix.cxx:10
 TRotMatrix.cxx:11
 TRotMatrix.cxx:12
 TRotMatrix.cxx:13
 TRotMatrix.cxx:14
 TRotMatrix.cxx:15
 TRotMatrix.cxx:16
 TRotMatrix.cxx:17
 TRotMatrix.cxx:18
 TRotMatrix.cxx:19
 TRotMatrix.cxx:20
 TRotMatrix.cxx:21
 TRotMatrix.cxx:22
 TRotMatrix.cxx:23
 TRotMatrix.cxx:24
 TRotMatrix.cxx:25
 TRotMatrix.cxx:26
 TRotMatrix.cxx:27
 TRotMatrix.cxx:28
 TRotMatrix.cxx:29
 TRotMatrix.cxx:30
 TRotMatrix.cxx:31
 TRotMatrix.cxx:32
 TRotMatrix.cxx:33
 TRotMatrix.cxx:34
 TRotMatrix.cxx:35
 TRotMatrix.cxx:36
 TRotMatrix.cxx:37
 TRotMatrix.cxx:38
 TRotMatrix.cxx:39
 TRotMatrix.cxx:40
 TRotMatrix.cxx:41
 TRotMatrix.cxx:42
 TRotMatrix.cxx:43
 TRotMatrix.cxx:44
 TRotMatrix.cxx:45
 TRotMatrix.cxx:46
 TRotMatrix.cxx:47
 TRotMatrix.cxx:48
 TRotMatrix.cxx:49
 TRotMatrix.cxx:50
 TRotMatrix.cxx:51
 TRotMatrix.cxx:52
 TRotMatrix.cxx:53
 TRotMatrix.cxx:54
 TRotMatrix.cxx:55
 TRotMatrix.cxx:56
 TRotMatrix.cxx:57
 TRotMatrix.cxx:58
 TRotMatrix.cxx:59
 TRotMatrix.cxx:60
 TRotMatrix.cxx:61
 TRotMatrix.cxx:62
 TRotMatrix.cxx:63
 TRotMatrix.cxx:64
 TRotMatrix.cxx:65
 TRotMatrix.cxx:66
 TRotMatrix.cxx:67
 TRotMatrix.cxx:68
 TRotMatrix.cxx:69
 TRotMatrix.cxx:70
 TRotMatrix.cxx:71
 TRotMatrix.cxx:72
 TRotMatrix.cxx:73
 TRotMatrix.cxx:74
 TRotMatrix.cxx:75
 TRotMatrix.cxx:76
 TRotMatrix.cxx:77
 TRotMatrix.cxx:78
 TRotMatrix.cxx:79
 TRotMatrix.cxx:80
 TRotMatrix.cxx:81
 TRotMatrix.cxx:82
 TRotMatrix.cxx:83
 TRotMatrix.cxx:84
 TRotMatrix.cxx:85
 TRotMatrix.cxx:86
 TRotMatrix.cxx:87
 TRotMatrix.cxx:88
 TRotMatrix.cxx:89
 TRotMatrix.cxx:90
 TRotMatrix.cxx:91
 TRotMatrix.cxx:92
 TRotMatrix.cxx:93
 TRotMatrix.cxx:94
 TRotMatrix.cxx:95
 TRotMatrix.cxx:96
 TRotMatrix.cxx:97
 TRotMatrix.cxx:98
 TRotMatrix.cxx:99
 TRotMatrix.cxx:100
 TRotMatrix.cxx:101
 TRotMatrix.cxx:102
 TRotMatrix.cxx:103
 TRotMatrix.cxx:104
 TRotMatrix.cxx:105
 TRotMatrix.cxx:106
 TRotMatrix.cxx:107
 TRotMatrix.cxx:108
 TRotMatrix.cxx:109
 TRotMatrix.cxx:110
 TRotMatrix.cxx:111
 TRotMatrix.cxx:112
 TRotMatrix.cxx:113
 TRotMatrix.cxx:114
 TRotMatrix.cxx:115
 TRotMatrix.cxx:116
 TRotMatrix.cxx:117
 TRotMatrix.cxx:118
 TRotMatrix.cxx:119
 TRotMatrix.cxx:120
 TRotMatrix.cxx:121
 TRotMatrix.cxx:122
 TRotMatrix.cxx:123
 TRotMatrix.cxx:124
 TRotMatrix.cxx:125
 TRotMatrix.cxx:126
 TRotMatrix.cxx:127
 TRotMatrix.cxx:128
 TRotMatrix.cxx:129
 TRotMatrix.cxx:130
 TRotMatrix.cxx:131
 TRotMatrix.cxx:132
 TRotMatrix.cxx:133
 TRotMatrix.cxx:134
 TRotMatrix.cxx:135
 TRotMatrix.cxx:136
 TRotMatrix.cxx:137
 TRotMatrix.cxx:138
 TRotMatrix.cxx:139
 TRotMatrix.cxx:140
 TRotMatrix.cxx:141
 TRotMatrix.cxx:142
 TRotMatrix.cxx:143
 TRotMatrix.cxx:144
 TRotMatrix.cxx:145
 TRotMatrix.cxx:146
 TRotMatrix.cxx:147
 TRotMatrix.cxx:148
 TRotMatrix.cxx:149
 TRotMatrix.cxx:150
 TRotMatrix.cxx:151
 TRotMatrix.cxx:152
 TRotMatrix.cxx:153
 TRotMatrix.cxx:154
 TRotMatrix.cxx:155
 TRotMatrix.cxx:156
 TRotMatrix.cxx:157
 TRotMatrix.cxx:158
 TRotMatrix.cxx:159
 TRotMatrix.cxx:160
 TRotMatrix.cxx:161
 TRotMatrix.cxx:162
 TRotMatrix.cxx:163
 TRotMatrix.cxx:164
 TRotMatrix.cxx:165
 TRotMatrix.cxx:166
 TRotMatrix.cxx:167
 TRotMatrix.cxx:168
 TRotMatrix.cxx:169
 TRotMatrix.cxx:170
 TRotMatrix.cxx:171
 TRotMatrix.cxx:172
 TRotMatrix.cxx:173
 TRotMatrix.cxx:174
 TRotMatrix.cxx:175
 TRotMatrix.cxx:176
 TRotMatrix.cxx:177
 TRotMatrix.cxx:178
 TRotMatrix.cxx:179
 TRotMatrix.cxx:180
 TRotMatrix.cxx:181
 TRotMatrix.cxx:182
 TRotMatrix.cxx:183
 TRotMatrix.cxx:184
 TRotMatrix.cxx:185
 TRotMatrix.cxx:186
 TRotMatrix.cxx:187
 TRotMatrix.cxx:188
 TRotMatrix.cxx:189
 TRotMatrix.cxx:190
 TRotMatrix.cxx:191
 TRotMatrix.cxx:192
 TRotMatrix.cxx:193
 TRotMatrix.cxx:194
 TRotMatrix.cxx:195
 TRotMatrix.cxx:196
 TRotMatrix.cxx:197
 TRotMatrix.cxx:198
 TRotMatrix.cxx:199
 TRotMatrix.cxx:200
 TRotMatrix.cxx:201
 TRotMatrix.cxx:202
 TRotMatrix.cxx:203
 TRotMatrix.cxx:204
 TRotMatrix.cxx:205
 TRotMatrix.cxx:206
 TRotMatrix.cxx:207
 TRotMatrix.cxx:208
 TRotMatrix.cxx:209
 TRotMatrix.cxx:210
 TRotMatrix.cxx:211
 TRotMatrix.cxx:212
 TRotMatrix.cxx:213
 TRotMatrix.cxx:214
 TRotMatrix.cxx:215
 TRotMatrix.cxx:216
 TRotMatrix.cxx:217
 TRotMatrix.cxx:218
 TRotMatrix.cxx:219
 TRotMatrix.cxx:220
 TRotMatrix.cxx:221
 TRotMatrix.cxx:222
 TRotMatrix.cxx:223
 TRotMatrix.cxx:224
 TRotMatrix.cxx:225
 TRotMatrix.cxx:226
 TRotMatrix.cxx:227
 TRotMatrix.cxx:228
 TRotMatrix.cxx:229
 TRotMatrix.cxx:230
 TRotMatrix.cxx:231
 TRotMatrix.cxx:232
 TRotMatrix.cxx:233
 TRotMatrix.cxx:234
 TRotMatrix.cxx:235
 TRotMatrix.cxx:236
 TRotMatrix.cxx:237
 TRotMatrix.cxx:238
 TRotMatrix.cxx:239
 TRotMatrix.cxx:240
 TRotMatrix.cxx:241
 TRotMatrix.cxx:242
 TRotMatrix.cxx:243
 TRotMatrix.cxx:244
 TRotMatrix.cxx:245
 TRotMatrix.cxx:246
 TRotMatrix.cxx:247
 TRotMatrix.cxx:248
 TRotMatrix.cxx:249
 TRotMatrix.cxx:250
 TRotMatrix.cxx:251
 TRotMatrix.cxx:252
 TRotMatrix.cxx:253
 TRotMatrix.cxx:254
 TRotMatrix.cxx:255
 TRotMatrix.cxx:256
 TRotMatrix.cxx:257
 TRotMatrix.cxx:258