Improved version of alignmnet object classes (R.Grosso)
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 15 Nov 2005 15:52:24 +0000 (15:52 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 15 Nov 2005 15:52:24 +0000 (15:52 +0000)
STEER/AliAlignObj.cxx
STEER/AliAlignObj.h
STEER/AliAlignObjAngles.cxx [new file with mode: 0644]
STEER/AliAlignObjAngles.h [new file with mode: 0644]
STEER/AliAlignObjMatrix.cxx [new file with mode: 0644]
STEER/AliAlignObjMatrix.h [new file with mode: 0644]
STEER/libSTEER.pkg

index d33331b714e044639d3b7b5d01e1d556b87b7b6f..8557e1bc74d429fe2fe9594b0cf9f85de666dbee 100644 (file)
  **************************************************************************/
 
 //-----------------------------------------------------------------
-//   Implementation of the alignment object class through
-//   1) the abstract class AliAlignObj
-//   2) two derived concrete representation of alignment object class:
-//      - AliAlignObjAngles
-//      - AliAlignObjMatrix
+//   Implementation of the alignment object class through the abstract
+//  class AliAlignObj. From it two derived concrete representation of
+//  alignment object class (AliAlignObjAngles, AliAlignObjMatrix) are
+//  derived in separate files.
 //-----------------------------------------------------------------
 /*****************************************************************************
  * AliAlignObjAngles: derived alignment class storing alignment information  *
@@ -67,6 +66,28 @@ AliAlignObj::~AliAlignObj()
   // dummy destructor
 }
 
+//_____________________________________________________________________________
+void AliAlignObj::SetVolUID(ELayerID detId, Int_t modId)
+{
+  // From detector name and module number (according to detector numbering)
+  // build fVolUID, unique numerical identity of that volume inside ALICE
+  // fVolUID is 16 bits, first 5 reserved for detID (32 possible values),
+  // remaining 11 for module ID inside det (2048 possible values).
+  //
+  fVolUID = LayerToVolUID(detId,modId);
+}
+
+//_____________________________________________________________________________
+void AliAlignObj::GetVolUID(ELayerID &layerId, Int_t &modId) const
+{
+  // From detector name and module number (according to detector numbering)
+  // build fVolUID, unique numerical identity of that volume inside ALICE
+  // fVolUID is 16 bits, first 5 reserved for detID (32 possible values),
+  // remaining 11 for module ID inside det (2048 possible values).
+  //
+  layerId = VolUIDToLayer(fVolUID,modId);
+}
+
 //_____________________________________________________________________________
 void AliAlignObj::AnglesToMatrix(const Double_t *angles, Double_t *rot) const
 {
@@ -117,249 +138,47 @@ void AliAlignObj::Print(Option_t *) const
   TGeoHMatrix m;
   GetMatrix(m);
   const Double_t *rot = m.GetRotationMatrix();
-  printf("Volume=%s ID=%u\n", GetVolPath(),GetVolUID());
+//   printf("Volume=%s ID=%u\n", GetVolPath(),GetVolUID());
+  Int_t IDs[2];
+  //  GetVolUID(IDs);
+  printf("Volume=%s LayerID=%d ModuleID=%d\n", GetVolPath(),IDs[0],IDs[1]);
   printf("%12.6f%12.6f%12.6f    Tx = %12.6f    Psi   = %12.6f\n", rot[0], rot[1], rot[2], tr[0], angles[0]);
   printf("%12.6f%12.6f%12.6f    Ty = %12.6f    Theta = %12.6f\n", rot[3], rot[4], rot[5], tr[1], angles[1]);
   printf("%12.6f%12.6f%12.6f    Tz = %12.6f    Phi   = %12.6f\n", rot[6], rot[7], rot[8], tr[2], angles[2]);
 
 }
 
-
-//=============================================================================
-
-ClassImp(AliAlignObjAngles)
-
 //_____________________________________________________________________________
-AliAlignObjAngles::AliAlignObjAngles() //: AliAlignObj()
+UShort_t AliAlignObj::LayerToVolUID(ELayerID layerId, Int_t modId)
 {
-  // default constructor
-  fTranslation[0]=fTranslation[1]=fTranslation[2]=0.;
-  fRotation[0]=fRotation[1]=fRotation[2]=0.;
-}
-
-//_____________________________________________________________________________
-AliAlignObjAngles::AliAlignObjAngles(const AliAlignObjAngles& theAlignObj) :
-  AliAlignObj(theAlignObj)
-{
-  // copy constructor
-  Double_t tr[3];
-  theAlignObj.GetTranslation(tr);
-  SetTranslation(tr[0],tr[1],tr[2]);
-  Double_t rot[3];
-  theAlignObj.GetAngles(rot);
-  SetRotation(rot[0],rot[1],rot[2]);
-}
-
-//_____________________________________________________________________________
-AliAlignObjAngles &AliAlignObjAngles::operator =(const AliAlignObjAngles& theAlignObj)
-{
-  // assignment operator
-  if(this==&theAlignObj) return *this;
-  ((AliAlignObj *)this)->operator=(theAlignObj);
-
-  Double_t tr[3];
-  theAlignObj.GetTranslation(tr);
-  SetTranslation(tr[0],tr[1],tr[2]);
-  Double_t rot[3];
-  theAlignObj.GetAngles(rot);
-  SetRotation(rot[0],rot[1],rot[2]);
-  return *this;
-}
-
-//_____________________________________________________________________________
-AliAlignObjAngles::~AliAlignObjAngles()
-{
-  // default destructor
-}
-
-//_____________________________________________________________________________
-void AliAlignObjAngles::SetTranslation(const TGeoMatrix& m)
-{
-  // Sets the translation parameters from an existing TGeoMatrix
-  if(m.IsTranslation()){
-    const Double_t* tr = m.GetTranslation();
-    fTranslation[0]=tr[0];  fTranslation[1]=tr[1]; fTranslation[2]=tr[2];
-  }else{
-//     AliWarning("Argument matrix is not a translation! Setting zero-translation.");
-    fTranslation[0] = fTranslation[1] = fTranslation[2] = 0.;
-  }
-}
-
-//_____________________________________________________________________________
-Bool_t AliAlignObjAngles::SetRotation(const TGeoMatrix& m)
-{
-  // Sets the rotation components from an existing TGeoMatrix
-  if(m.IsRotation()){
-    const Double_t* rot = m.GetRotationMatrix();
-    return MatrixToAngles(rot,fRotation);
-  }else{
-//     AliWarning("Argument matrix is not a rotation! Setting yaw-pitch-roll to zero.");
-    fRotation[0] = fRotation[1] = fRotation[2] = 0.;
-    return kTRUE;
-  }
-}
-
-//_____________________________________________________________________________
-void AliAlignObjAngles::SetMatrix(const TGeoMatrix& m)
-{
-  // Sets both the rotation and translation components from an
-  // existing TGeoMatrix
-  SetTranslation(m);
-  SetRotation(m);
-}
-
-//_____________________________________________________________________________
-void AliAlignObjAngles::GetPars(Double_t tr[], Double_t angles[]) const
-{
-  // Returns the translations and the rotation angles
-  GetTranslation(tr);
-  GetAngles(angles);
-}
-
-//_____________________________________________________________________________
-void AliAlignObjAngles::GetMatrix(TGeoHMatrix& m) const
-{
-  // Extracts the information in an existing TGeoHMatrix using the translations
-  // and the rotation parameters
-  m.SetTranslation(&fTranslation[0]);
-  Double_t rot[9];
-  AnglesToMatrix(fRotation,rot);
-  m.SetRotation(rot);
-}
-
-//=============================================================================
-
-ClassImp(AliAlignObjMatrix)
-
-//_____________________________________________________________________________
-AliAlignObjMatrix::AliAlignObjMatrix() : AliAlignObj()
-{
-  // Default constructor
-}
-
-AliAlignObjMatrix::AliAlignObjMatrix(const AliAlignObjMatrix& theAlignObj) :
-  AliAlignObj(theAlignObj)
-{
-  //copy constructor
-  //
-  Double_t tr[3];
-  theAlignObj.GetTranslation(tr);
-  SetTranslation(tr[0],tr[1],tr[2]);
-  Double_t rot[3];
-  theAlignObj.GetAngles(rot);
-  SetRotation(rot[0],rot[1],rot[2]);
-}
-
-AliAlignObjMatrix &AliAlignObjMatrix::operator =(const AliAlignObjMatrix& theAlignObj)
-{  
-  // assignment operator
-  //
-  if(this==&theAlignObj) return *this;
-  ((AliAlignObj *)this)->operator=(theAlignObj);
-  Double_t tr[3];
-  theAlignObj.GetTranslation(tr);
-  SetTranslation(tr[0],tr[1],tr[2]);
-  Double_t rot[3];
-  theAlignObj.GetAngles(rot);
-  SetRotation(rot[0],rot[1],rot[2]);
-  return *this;
-}
-
-AliAlignObjMatrix::~AliAlignObjMatrix()
-{
-  // Destructor
+  // From detector (layer) name and module number (according to detector numbering)
+  // build fVolUID, unique numerical identity of that volume inside ALICE
+  // fVolUID is 16 bits, first 5 reserved for layerID (32 possible values),
+  // remaining 11 for module ID inside det (2048 possible values).
   //
+  return ((UShort_t(layerId) << 11) | UShort_t(modId));
 }
 
 //_____________________________________________________________________________
-void AliAlignObjMatrix::SetTranslation(Double_t x, Double_t y, Double_t z)
-{
-  // Sets the translation parameters
-  Double_t tr[3];
-  tr[0]=x; tr[1]=y; tr[2]=z;
-  fMatrix.SetTranslation(tr);
-}
-
-//_____________________________________________________________________________
-void AliAlignObjMatrix::SetTranslation(const TGeoMatrix& m)
-{
-  // Sets the translation parameters from an existing TGeoMatrix
-  const Double_t *tr = m.GetTranslation();
-  fMatrix.SetTranslation(tr);
-}
-
-//_____________________________________________________________________________
-void AliAlignObjMatrix::SetRotation(Double_t psi, Double_t theta, Double_t phi)
-{
-  // Sets the rotation parameters
-  Double_t angles[3] = {psi, theta, phi};
-  Double_t rot[9];
-  AnglesToMatrix(angles,rot);
-  fMatrix.SetRotation(rot);
-}
-
-//_____________________________________________________________________________
-Bool_t AliAlignObjMatrix::SetRotation(const TGeoMatrix& m)
-{
-  // Sets the rotation parameters from an existing TGeoMatrix
-  const Double_t* rot = m.GetRotationMatrix();
-  fMatrix.SetRotation(rot);
-  return kTRUE;
-}
-
-//_____________________________________________________________________________
-void AliAlignObjMatrix::SetMatrix(const TGeoMatrix& m)
-{
-  // Set rotation matrix and translation
-  // using TGeoMatrix
-  SetTranslation(m);
-  SetRotation(m);
-}
-
-//_____________________________________________________________________________
-void AliAlignObjMatrix::SetPars(Double_t x, Double_t y, Double_t z,
-                      Double_t psi, Double_t theta, Double_t phi)
-{
-  // Set rotation matrix and translation
-  // using 3 angles and 3 translations
-  SetTranslation(x,y,z);
-  SetRotation(psi,theta,phi);
-}
-
-//_____________________________________________________________________________
-void AliAlignObjMatrix::GetTranslation(Double_t *tr) const
+AliAlignObj::ELayerID AliAlignObj::VolUIDToLayer(UShort_t voluid, Int_t &modId)
 {
-  // Get Translation from TGeoMatrix
-  const Double_t* translation = fMatrix.GetTranslation();
-  tr[0] = translation[0];
-  tr[1] = translation[1];
-  tr[2] = translation[2];
-}
-
-//_____________________________________________________________________________
-Bool_t AliAlignObjMatrix::GetAngles(Double_t *angles) const
-{
-  // Get rotation angles from the TGeoHMatrix
-  const Double_t* rot = fMatrix.GetRotationMatrix();
-  return MatrixToAngles(rot,angles);
-}
+  // From detector (layer) name and module number (according to detector numbering)
+  // build fVolUID, unique numerical identity of that volume inside ALICE
+  // fVolUID is 16 bits, first 5 reserved for layerID (32 possible values),
+  // remaining 11 for module ID inside det (2048 possible values).
+  //
+  modId = voluid & 0x7ff;
 
-//_____________________________________________________________________________
-void AliAlignObjMatrix::GetPars(Double_t tr[], Double_t angles[]) const
-{
-  // Gets the translations and the rotation angles
-  GetTranslation(tr);
-  GetAngles(angles);
+  return VolUIDToLayer(voluid);
 }
 
 //_____________________________________________________________________________
-void AliAlignObjMatrix::GetMatrix(TGeoHMatrix& m) const
+AliAlignObj::ELayerID AliAlignObj::VolUIDToLayer(UShort_t voluid)
 {
-  // Extracts the translations and the rotation parameters
-  // in an existing TGeoHMatrix
-  const Double_t *tr = fMatrix.GetTranslation();
-  m.SetTranslation(tr);
-  const Double_t *rot = fMatrix.GetRotationMatrix();
-  m.SetRotation(rot);
+  // From detector (layer) name and module number (according to detector numbering)
+  // build fVolUID, unique numerical identity of that volume inside ALICE
+  // fVolUID is 16 bits, first 5 reserved for layerID (32 possible values),
+  // remaining 11 for module ID inside det (2048 possible values).
+  //
+  return ELayerID((voluid >> 11) & 0x1f);
 }
-
index 909779fd06a38d6262d466ad1a488f7d3039f0f2..9a14457a888c9c1ae2053ab9fb5f3864b187329d 100644 (file)
@@ -6,7 +6,7 @@
 //   information for a single volume, that is a translation, a rotation  *
 //   and a the identity of the volume itself in form of a TGeo path and  *
 //   as a unique integer identifier                                      *
-// ***********************************************************************
+//************************************************************************
 #include "TObject.h"
 #include "TString.h"
 #include "TGeoMatrix.h"
@@ -19,6 +19,15 @@ class AliAlignObj : public TObject {
   AliAlignObj(const AliAlignObj& theAlignObj);
   AliAlignObj& operator= (const AliAlignObj& theAlignObj);
   virtual ~AliAlignObj();
+  enum ELayerID{kSPD1=1, kSPD2=2,
+               kSDD1=3, kSDD2=4,
+               kSSD1=5, kSSD2=6,
+               kTPC1=7, kTPC2=8,
+               kTRD1=9, kTRD2=10, kTRD3=11, kTRD4=12, kTRD5=13, kTRD6=14,
+               kTOF=15,
+               kPHOS1=16, kPHOS2=17,
+               kRICH=18,
+               kMUON=19};
 
   //Setters
   virtual void SetTranslation(Double_t x, Double_t y, Double_t z) = 0;
@@ -30,10 +39,12 @@ class AliAlignObj : public TObject {
   virtual void SetMatrix(const TGeoMatrix& m) = 0;
   void  SetVolPath(const TString& volpath) {fVolPath=volpath;}
   void  SetVolUID(const UShort_t voluid) {fVolUID=voluid;}
+  void  SetVolUID(ELayerID layerId, Int_t modId);
 
   //Getters
   const char  *GetVolPath()    const {return fVolPath.Data();}
   UShort_t     GetVolUID()     const {return fVolUID;}
+  void         GetVolUID(ELayerID &layerId, Int_t &modId) const;
   virtual void GetTranslation(Double_t* tr)  const=0;
   virtual Bool_t GetAngles(Double_t* angles) const=0;
   virtual void GetPars(Double_t transl[], Double_t rot[]) const=0;
@@ -41,6 +52,9 @@ class AliAlignObj : public TObject {
 
   void  Print(Option_t *) const;
 
+  static UShort_t LayerToVolUID(ELayerID layerId, Int_t modId);
+  static ELayerID VolUIDToLayer(UShort_t voluid, Int_t &modId);
+  static ELayerID VolUIDToLayer(UShort_t voluid);
  protected:
 
   void AnglesToMatrix(const Double_t *angles, Double_t *rot) const;
@@ -53,81 +67,4 @@ class AliAlignObj : public TObject {
   ClassDef(AliAlignObj, 1)
 };
 
-//****************************************************************************
-// AliAlignObjAngles: derived alignment class storing alignment information  *
-//   for a single volume in form of three doubles for the translation        *
-//   and three doubles for the rotation expressed with the euler angles      *
-//   in the xyz-convention (http://mathworld.wolfram.com/EulerAngles.html),  *
-//   also known as roll, pitch, yaw. PLEASE NOTE THE ANGLES SIGNS ARE        *
-//   INVERSE WITH RESPECT TO THIS REFERENCE!!! In this way the representation*
-//   is fully consistent with the TGeo Rotation methods.                     *
-//****************************************************************************
-class AliAlignObjAngles : public AliAlignObj{
- public:
-  AliAlignObjAngles();
-  AliAlignObjAngles(const AliAlignObjAngles& theAlignObj);
-  AliAlignObjAngles& operator= (const AliAlignObjAngles& theAlignObj);
-  virtual ~AliAlignObjAngles();
-  
-  //Setters
-  virtual void SetTranslation(Double_t x, Double_t y, Double_t z){
-    fTranslation[0]=x; fTranslation[1]=y; fTranslation[2]=z;}
-  virtual void SetTranslation(const TGeoMatrix& m);
-  virtual void SetRotation(Double_t psi, Double_t theta, Double_t phi){
-    fRotation[0]=psi; fRotation[1]=theta; fRotation[2]=phi;}
-  virtual Bool_t SetRotation(const TGeoMatrix& m);
-  virtual void SetMatrix(const TGeoMatrix& m);
-  virtual void SetPars(Double_t x, Double_t y, Double_t z, Double_t psi,
-                  Double_t theta, Double_t phi){
-    fTranslation[0]=x; fTranslation[1]=y; fTranslation[2]=z;
-    fRotation[0]=psi; fRotation[1]=theta; fRotation[2]=phi;}
-  
-  //Getters
-  virtual void GetTranslation(Double_t *tr)  const {
-    tr[0] = fTranslation[0]; tr[1] = fTranslation[1]; tr[2] = fTranslation[2];}
-  virtual Bool_t GetAngles(Double_t* angles)   const {
-    angles[0] = fRotation[0]; angles[1] = fRotation[1];
-    angles[2] = fRotation[2]; return kTRUE;}
-  virtual void GetPars(Double_t tr[], Double_t angles[]) const;
-  virtual void GetMatrix(TGeoHMatrix& m) const;
-  
- protected:
-  Double_t fTranslation[3]; // Translation vector
-  Double_t fRotation[3]; // Roll-pitch-yaw angles
-  
-  ClassDef(AliAlignObjAngles, 1)
-};
-
-/**************************************************************************
- * AliAlignObjMatrix: derived alignment class storing alignment           *
- *   information for a single volume in form of TGeoHMatrix, which        *
- *   includes the information for a translation, a rotation and a scale   *
- *************************************************************************/
-class AliAlignObjMatrix : public AliAlignObj {
- public:
-  AliAlignObjMatrix();
-  AliAlignObjMatrix(const AliAlignObjMatrix& theAlignObj);
-  AliAlignObjMatrix& operator= (const AliAlignObjMatrix& theAlignObj);
-  virtual ~AliAlignObjMatrix();
-  
-  //Setters
-  virtual void SetTranslation(Double_t x, Double_t y, Double_t z);
-  virtual void SetTranslation(const TGeoMatrix& m);
-  virtual void SetRotation(Double_t psi, Double_t theta, Double_t phi);
-  virtual Bool_t SetRotation(const TGeoMatrix& m);
-  virtual void SetMatrix(const TGeoMatrix& m);
-  virtual void SetPars(Double_t x, Double_t y, Double_t z, Double_t psi,
-                  Double_t theta, Double_t phi);
-  //Getters
-  virtual void GetTranslation(Double_t* tr)  const;
-  virtual Bool_t GetAngles(Double_t* angles)  const;
-  virtual void GetPars(Double_t tr[], Double_t rot[]) const;
-  virtual void GetMatrix(TGeoHMatrix& m) const;
-  
- protected:
-  TGeoHMatrix fMatrix; // Transformation matrix
-  
-  ClassDef(AliAlignObjMatrix, 1)
-};
-
 #endif
diff --git a/STEER/AliAlignObjAngles.cxx b/STEER/AliAlignObjAngles.cxx
new file mode 100644 (file)
index 0000000..d27d442
--- /dev/null
@@ -0,0 +1,155 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+//-----------------------------------------------------------------
+//   Implementation of the alignment object class through
+//   the concrete representation of alignment object class
+//   AliAlignObjAngles derived from the base class AliAlignObj
+//-----------------------------------------------------------------
+
+#include "AliAlignObj.h"
+#include "AliAlignObjAngles.h"
+//#include "AliLog.h"
+
+ClassImp(AliAlignObjAngles)
+
+//_____________________________________________________________________________
+AliAlignObjAngles::AliAlignObjAngles() //: AliAlignObj()
+{
+  // default constructor
+  //
+  fTranslation[0]=fTranslation[1]=fTranslation[2]=0.;
+  fRotation[0]=fRotation[1]=fRotation[2]=0.;
+}
+
+//_____________________________________________________________________________
+AliAlignObjAngles::AliAlignObjAngles(const char* volpath, UShort_t voluid, Double_t x, Double_t y, Double_t z, Double_t psi, Double_t theta, Double_t phi)
+{
+  // standard constructor with 3 translation + 3 rotation parameters
+  //
+  fVolPath=volpath;
+  fVolUID=voluid;
+  fTranslation[0]=x; fTranslation[1]=y; fTranslation[2]=z;
+  fRotation[0]=psi; fRotation[1]=theta; fRotation[2]=phi;
+}
+
+//_____________________________________________________________________________
+AliAlignObjAngles::AliAlignObjAngles(const char* volpath, ELayerID detId, Int_t volId, Double_t x, Double_t y, Double_t z, Double_t psi, Double_t theta, Double_t phi)
+{
+  // standard constructor with 3 translation + 3 rotation parameters
+  //
+  fVolPath=volpath;
+  SetVolUID(detId,volId);
+  fTranslation[0]=x; fTranslation[1]=y; fTranslation[2]=z;
+  fRotation[0]=psi; fRotation[1]=theta; fRotation[2]=phi;
+}
+
+//_____________________________________________________________________________
+AliAlignObjAngles::AliAlignObjAngles(const char* volpath, UShort_t voluid, TGeoMatrix& m)
+{
+  // standard constructor with TGeoMatrix
+  //
+  fVolPath=volpath;
+  fVolUID=voluid;
+  SetTranslation(m);
+  SetRotation(m);
+}
+
+//_____________________________________________________________________________
+AliAlignObjAngles::AliAlignObjAngles(const AliAlignObjAngles& theAlignObj) :
+  AliAlignObj(theAlignObj)
+{
+  // copy constructor
+  //
+  Double_t tr[3];
+  theAlignObj.GetTranslation(tr);
+  SetTranslation(tr[0],tr[1],tr[2]);
+  Double_t rot[3];
+  theAlignObj.GetAngles(rot);
+  SetRotation(rot[0],rot[1],rot[2]);
+}
+
+//_____________________________________________________________________________
+AliAlignObjAngles &AliAlignObjAngles::operator =(const AliAlignObjAngles& theAlignObj)
+{
+  // assignment operator
+  //
+  if(this==&theAlignObj) return *this;
+  ((AliAlignObj *)this)->operator=(theAlignObj);
+
+  Double_t tr[3];
+  theAlignObj.GetTranslation(tr);
+  SetTranslation(tr[0],tr[1],tr[2]);
+  Double_t rot[3];
+  theAlignObj.GetAngles(rot);
+  SetRotation(rot[0],rot[1],rot[2]);
+  return *this;
+}
+
+//_____________________________________________________________________________
+AliAlignObjAngles::~AliAlignObjAngles()
+{
+  // default destructor
+  //
+}
+
+//_____________________________________________________________________________
+void AliAlignObjAngles::SetTranslation(const TGeoMatrix& m)
+{
+  if(m.IsTranslation()){
+    const Double_t* tr = m.GetTranslation();
+    fTranslation[0]=tr[0];  fTranslation[1]=tr[1]; fTranslation[2]=tr[2];
+  }else{
+//     AliWarning("Argument matrix is not a translation! Setting zero-translation.");
+    fTranslation[0] = fTranslation[1] = fTranslation[2] = 0.;
+  }
+}
+
+//_____________________________________________________________________________
+Bool_t AliAlignObjAngles::SetRotation(const TGeoMatrix& m)
+{
+  if(m.IsRotation()){
+    const Double_t* rot = m.GetRotationMatrix();
+    return MatrixToAngles(rot,fRotation);
+  }else{
+//     AliWarning("Argument matrix is not a rotation! Setting yaw-pitch-roll to zero.");
+    fRotation[0] = fRotation[1] = fRotation[2] = 0.;
+    return kTRUE;
+  }
+}
+
+//_____________________________________________________________________________
+void AliAlignObjAngles::SetMatrix(const TGeoMatrix& m)
+{
+  SetTranslation(m);
+  SetRotation(m);
+}
+
+//_____________________________________________________________________________
+void AliAlignObjAngles::GetPars(Double_t tr[], Double_t angles[]) const
+{
+  GetTranslation(tr);
+  GetAngles(angles);
+}
+
+//_____________________________________________________________________________
+void AliAlignObjAngles::GetMatrix(TGeoHMatrix& m) const
+{
+  m.SetTranslation(&fTranslation[0]);
+  Double_t rot[9];
+  AnglesToMatrix(fRotation,rot);
+  m.SetRotation(rot);
+}
+
diff --git a/STEER/AliAlignObjAngles.h b/STEER/AliAlignObjAngles.h
new file mode 100644 (file)
index 0000000..bec6326
--- /dev/null
@@ -0,0 +1,56 @@
+#ifndef ALIALIGNOBJANGLES_H
+#define ALIALIGNOBJANGLES_H
+
+/*****************************************************************************
+ * AliAlignObjAngles: derived alignment class storing alignment information  *
+ *   for a single volume in form of three doubles for the translation        *
+ *   and three doubles for the rotation expressed with the euler angles      *
+ *   in the xyz-convention (http://mathworld.wolfram.com/EulerAngles.html),  *
+ *   also known as roll, pitch, yaw. PLEASE NOTE THE ANGLES SIGNS ARE        *
+ *   INVERSE WITH RESPECT TO THIS REFERENCE!!! In this way the representation*
+ *   is fully consistent with the TGeo Rotation methods.                     *
+ *****************************************************************************/
+#include "TObject.h"
+#include "TString.h"
+#include "TGeoMatrix.h"
+
+class AliAlignObjAngles : public AliAlignObj{
+ public:
+  AliAlignObjAngles();
+  AliAlignObjAngles(const char* volpath, UShort_t voluid, Double_t x, Double_t y, Double_t z, Double_t psi, Double_t theta, Double_t phi);
+  AliAlignObjAngles(const char* volpath, ELayerID detId, Int_t volId, Double_t x, Double_t y, Double_t z, Double_t psi, Double_t theta, Double_t phi);
+  AliAlignObjAngles(const char* volpath, UShort_t voluid, TGeoMatrix& m);
+  AliAlignObjAngles(const AliAlignObjAngles& theAlignObj);
+  AliAlignObjAngles& operator= (const AliAlignObjAngles& theAlignObj);
+  virtual ~AliAlignObjAngles();
+  
+  //Setters
+  virtual void SetTranslation(Double_t x, Double_t y, Double_t z){
+    fTranslation[0]=x; fTranslation[1]=y; fTranslation[2]=z;}
+  virtual void SetTranslation(const TGeoMatrix& m);
+  virtual void SetRotation(Double_t psi, Double_t theta, Double_t phi){
+    fRotation[0]=psi; fRotation[1]=theta; fRotation[2]=phi;}
+  virtual Bool_t SetRotation(const TGeoMatrix& m);
+  virtual void SetMatrix(const TGeoMatrix& m);
+  virtual void SetPars(Double_t x, Double_t y, Double_t z, Double_t psi,
+                  Double_t theta, Double_t phi){
+    fTranslation[0]=x; fTranslation[1]=y; fTranslation[2]=z;
+    fRotation[0]=psi; fRotation[1]=theta; fRotation[2]=phi;}
+  
+  //Getters
+  virtual void GetTranslation(Double_t *tr)  const {
+    tr[0] = fTranslation[0]; tr[1] = fTranslation[1]; tr[2] = fTranslation[2];}
+  virtual Bool_t GetAngles(Double_t* angles)   const {
+    angles[0] = fRotation[0]; angles[1] = fRotation[1];
+    angles[2] = fRotation[2]; return kTRUE;}
+  virtual void GetPars(Double_t tr[], Double_t angles[]) const;
+  virtual void GetMatrix(TGeoHMatrix& m) const;
+  
+ protected:
+  Double_t fTranslation[3]; // Translation vector
+  Double_t fRotation[3]; // Roll-pitch-yaw angles
+  
+  ClassDef(AliAlignObjAngles, 1)
+};
+
+#endif
diff --git a/STEER/AliAlignObjMatrix.cxx b/STEER/AliAlignObjMatrix.cxx
new file mode 100644 (file)
index 0000000..0e47745
--- /dev/null
@@ -0,0 +1,191 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+//-----------------------------------------------------------------
+//   Implementation of the alignment object class through
+//   the derived concrete representation of alignment object class:
+//   AliAlignObjMatrix derived from the base class AliAlignObj
+//-----------------------------------------------------------------
+
+#include "AliAlignObj.h"
+#include "AliAlignObjMatrix.h"
+//#include "AliLog.h"
+
+ClassImp(AliAlignObjMatrix)
+
+//_____________________________________________________________________________
+AliAlignObjMatrix::AliAlignObjMatrix() : AliAlignObj()
+{
+  // Default constructor
+  //
+}
+
+//_____________________________________________________________________________
+AliAlignObjMatrix::AliAlignObjMatrix(const char* volpath, UShort_t voluid, Double_t x, Double_t y, Double_t z, Double_t psi, Double_t theta, Double_t phi)
+{
+  // standard constructor with 3 translation + 3 rotation parameters
+  //
+  fVolPath=volpath;
+  fVolUID=voluid;
+  SetTranslation(x, y, z);
+  SetRotation(psi, theta, phi);
+}
+
+//_____________________________________________________________________________
+AliAlignObjMatrix::AliAlignObjMatrix(const char* volpath, ELayerID detId, Int_t volId, Double_t x, Double_t y, Double_t z, Double_t psi, Double_t theta, Double_t phi)
+{
+  // standard constructor with 3 translation + 3 rotation parameters
+  //
+  fVolPath=volpath;
+  SetVolUID(detId,volId);
+  SetTranslation(x, y, z);
+  SetRotation(psi, theta, phi);
+}
+
+//_____________________________________________________________________________
+AliAlignObjMatrix::AliAlignObjMatrix(const char* volpath, UShort_t voluid, TGeoMatrix& m)
+{
+  // standard constructor with TGeoMatrix
+  //
+  fVolPath=volpath;
+  fVolUID=voluid;
+  SetTranslation(m);
+  SetRotation(m);
+}
+
+//_____________________________________________________________________________
+AliAlignObjMatrix::AliAlignObjMatrix(const AliAlignObjMatrix& theAlignObj) :
+  AliAlignObj(theAlignObj)
+{
+  //copy constructor
+  //
+  Double_t tr[3];
+  theAlignObj.GetTranslation(tr);
+  SetTranslation(tr[0],tr[1],tr[2]);
+  Double_t rot[3];
+  theAlignObj.GetAngles(rot);
+  SetRotation(rot[0],rot[1],rot[2]);
+}
+
+//_____________________________________________________________________________
+AliAlignObjMatrix &AliAlignObjMatrix::operator =(const AliAlignObjMatrix& theAlignObj)
+{  
+  // assignment operator
+  //
+  if(this==&theAlignObj) return *this;
+  ((AliAlignObj *)this)->operator=(theAlignObj);
+  Double_t tr[3];
+  theAlignObj.GetTranslation(tr);
+  SetTranslation(tr[0],tr[1],tr[2]);
+  Double_t rot[3];
+  theAlignObj.GetAngles(rot);
+  SetRotation(rot[0],rot[1],rot[2]);
+  return *this;
+}
+
+//_____________________________________________________________________________
+AliAlignObjMatrix::~AliAlignObjMatrix()
+{
+  // Destructor
+  //
+}
+
+//_____________________________________________________________________________
+void AliAlignObjMatrix::SetTranslation(Double_t x, Double_t y, Double_t z)
+{
+  Double_t tr[3];
+  tr[0]=x; tr[1]=y; tr[2]=z;
+  fMatrix.SetTranslation(tr);
+}
+
+//_____________________________________________________________________________
+void AliAlignObjMatrix::SetTranslation(const TGeoMatrix& m)
+{
+  const Double_t *tr = m.GetTranslation();
+  fMatrix.SetTranslation(tr);
+}
+
+//_____________________________________________________________________________
+void AliAlignObjMatrix::SetRotation(Double_t psi, Double_t theta, Double_t phi)
+{
+  Double_t angles[3] = {psi, theta, phi};
+  Double_t rot[9];
+  AnglesToMatrix(angles,rot);
+  fMatrix.SetRotation(rot);
+}
+
+//_____________________________________________________________________________
+Bool_t AliAlignObjMatrix::SetRotation(const TGeoMatrix& m)
+{
+  const Double_t* rot = m.GetRotationMatrix();
+  fMatrix.SetRotation(rot);
+  return kTRUE;
+}
+
+//_____________________________________________________________________________
+void AliAlignObjMatrix::SetMatrix(const TGeoMatrix& m)
+{
+  // Set rotation matrix and translation
+  // using TGeoMatrix
+  SetTranslation(m);
+  SetRotation(m);
+}
+
+//_____________________________________________________________________________
+void AliAlignObjMatrix::SetPars(Double_t x, Double_t y, Double_t z,
+                      Double_t psi, Double_t theta, Double_t phi)
+{
+  // Set rotation matrix and translation
+  // using 3 angles and 3 translations
+  SetTranslation(x,y,z);
+  SetRotation(psi,theta,phi);
+}
+
+//_____________________________________________________________________________
+void AliAlignObjMatrix::GetTranslation(Double_t *tr) const
+{
+  // Get Translation from TGeoMatrix
+  const Double_t* translation = fMatrix.GetTranslation();
+  tr[0] = translation[0];
+  tr[1] = translation[1];
+  tr[2] = translation[2];
+}
+
+//_____________________________________________________________________________
+Bool_t AliAlignObjMatrix::GetAngles(Double_t *angles) const
+{
+  // Get rotation angles from the TGeoHMatrix
+  const Double_t* rot = fMatrix.GetRotationMatrix();
+  return MatrixToAngles(rot,angles);
+}
+
+//_____________________________________________________________________________
+void AliAlignObjMatrix::GetPars(Double_t tr[], Double_t angles[]) const
+{
+  GetTranslation(tr);
+  GetAngles(angles);
+}
+
+//_____________________________________________________________________________
+void AliAlignObjMatrix::GetMatrix(TGeoHMatrix& m) const
+{
+  // Get TGeoHMatrix
+  //
+  const Double_t *tr = fMatrix.GetTranslation();
+  m.SetTranslation(tr);
+  const Double_t *rot = fMatrix.GetRotationMatrix();
+  m.SetRotation(rot);
+}
+
diff --git a/STEER/AliAlignObjMatrix.h b/STEER/AliAlignObjMatrix.h
new file mode 100644 (file)
index 0000000..1e5b620
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef ALIALIGNOBJMATRIX_H
+#define ALIALIGNOBJMATRIX_H
+
+/**************************************************************************
+ * AliAlignObjMatrix: derived alignment class storing alignment           *
+ *   information for a single volume in form of TGeoHMatrix, which        *
+ *   includes the information for a translation, a rotation and a scale   *
+ *************************************************************************/
+#include "TObject.h"
+#include "TString.h"
+#include "TGeoMatrix.h"
+
+class AliAlignObjMatrix : public AliAlignObj {
+ public:
+  AliAlignObjMatrix();
+  AliAlignObjMatrix(const char* volpath, UShort_t voluid, Double_t x, Double_t y, Double_t z, Double_t psi, Double_t theta, Double_t phi);
+  AliAlignObjMatrix(const char* volpath, ELayerID detId, Int_t volId, Double_t x, Double_t y, Double_t z, Double_t psi, Double_t theta, Double_t phi);
+  AliAlignObjMatrix(const char* volpath, UShort_t voluid, TGeoMatrix& m);
+  AliAlignObjMatrix(const AliAlignObjMatrix& theAlignObj);
+  AliAlignObjMatrix& operator= (const AliAlignObjMatrix& theAlignObj);
+  virtual ~AliAlignObjMatrix();
+  
+  //Setters
+  virtual void SetTranslation(Double_t x, Double_t y, Double_t z);
+  virtual void SetTranslation(const TGeoMatrix& m);
+  virtual void SetRotation(Double_t psi, Double_t theta, Double_t phi);
+  virtual Bool_t SetRotation(const TGeoMatrix& m);
+  virtual void SetMatrix(const TGeoMatrix& m);
+  virtual void SetPars(Double_t x, Double_t y, Double_t z, Double_t psi,
+                  Double_t theta, Double_t phi);
+  //Getters
+  virtual void GetTranslation(Double_t* tr)  const;
+  virtual Bool_t GetAngles(Double_t* angles)  const;
+  virtual void GetPars(Double_t tr[], Double_t rot[]) const;
+  virtual void GetMatrix(TGeoHMatrix& m) const;
+  
+ protected:
+  TGeoHMatrix fMatrix; // Transformation matrix
+  
+  ClassDef(AliAlignObjMatrix, 1)
+};
+
+#endif
index 54e38da4956c4fd1eddd80887f15aa0b94083c4a..78fee3980ff8387da224a35729a00f75dcb55d25 100644 (file)
@@ -24,7 +24,7 @@ AliCDBEntry.cxx AliCDBId.cxx AliCDBMetaData.cxx \
 AliCDBPath.cxx AliCDBRunRange.cxx AliCDBManager.cxx\
 AliCDBStorage.cxx AliCDBLocal.cxx AliCDBDump.cxx AliCDBGrid.cxx\
 AliReconstructor.cxx AliDetectorEventHeader.cxx TTreeStream.cxx\
-AliAlignObj.cxx
+AliAlignObj.cxx AliAlignObjAngles.cxx AliAlignObjMatrix.cxx
 
 HDRS:= $(SRCS:.cxx=.h)