ROOT logo
/**************************************************************************
 * 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.                  *
 **************************************************************************/

/* $Id$ */

//-----------------------------------------------------------------
//  Implementation of the alignment object class, holding the alignment
//  constants for a single volume, through the abstract class AliAlignObj.
//  From it two derived concrete representation of alignment object class
//  (AliAlignObjParams, AliAlignObjMatrix) are derived in separate files.
//-----------------------------------------------------------------

#include <TGeoManager.h>
#include <TGeoMatrix.h>
#include <TGeoPhysicalNode.h>
#include <TGeoOverlap.h>
#include <TMath.h>

#include "AliAlignObj.h"
#include "AliTrackPointArray.h"
#include "AliLog.h"
 
ClassImp(AliAlignObj)

//_____________________________________________________________________________
AliAlignObj::AliAlignObj():
  TObject(),
  fVolPath(),
  fVolUID(0)
{
  // default constructor
  for(Int_t i=0; i<6; i++) fDiag[i]=-999.;
  for(Int_t i=0; i<15; i++) fODia[i]=-999.;
}

//_____________________________________________________________________________
AliAlignObj::AliAlignObj(const char* symname, UShort_t voluid) :
  TObject(),
  fVolPath(symname),
  fVolUID(voluid)
{
  // standard constructor
  //
  for(Int_t i=0; i<6; i++) fDiag[i]=-999.;
  for(Int_t i=0; i<15; i++) fODia[i]=-999.;
}

//_____________________________________________________________________________
AliAlignObj::AliAlignObj(const char* symname, UShort_t voluid, Double_t* cmat) :
  TObject(),
  fVolPath(symname),
  fVolUID(voluid)
{
  // standard constructor
  //
  SetCorrMatrix(cmat);
}

//_____________________________________________________________________________
AliAlignObj::AliAlignObj(const AliAlignObj& theAlignObj) :
  TObject(theAlignObj),
  fVolPath(theAlignObj.GetSymName()),
  fVolUID(theAlignObj.GetVolUID())
{
  //copy constructor
  for(Int_t i=0; i<6; i++) fDiag[i]=theAlignObj.fDiag[i];
  for(Int_t i=0; i<15; i++) fODia[i]=theAlignObj.fODia[i];
}

//_____________________________________________________________________________
AliAlignObj &AliAlignObj::operator =(const AliAlignObj& theAlignObj)
{
  // assignment operator
  if(this==&theAlignObj) return *this;
  fVolPath = theAlignObj.GetSymName();
  fVolUID = theAlignObj.GetVolUID();
  for(Int_t i=0; i<6; i++) fDiag[i]=theAlignObj.fDiag[i];
  for(Int_t i=0; i<15; i++) fODia[i]=theAlignObj.fODia[i];
  return *this;
}

//_____________________________________________________________________________
AliAlignObj &AliAlignObj::operator*=(const AliAlignObj& theAlignObj)
{
  // multiplication operator
  // The operator can be used to 'combine'
  // two alignment objects
  TGeoHMatrix m1;
  GetMatrix(m1);
  TGeoHMatrix m2;
  theAlignObj.GetMatrix(m2);
  m1.MultiplyLeft(&m2);
  SetMatrix(m1);
  // temporary solution: the covariance matrix of the resulting combined object
  // is set equal to the covariance matrix of the right operand
  // (not to be used for combining alignment objects for different levels)
  for(Int_t i=0; i<6; i++)  fDiag[i] = theAlignObj.fDiag[i];
  for(Int_t i=0; i<15; i++)  fODia[i] = theAlignObj.fODia[i];  
  return *this;
}

//_____________________________________________________________________________
AliAlignObj::~AliAlignObj()
{
  // dummy destructor
}

//_____________________________________________________________________________
void AliAlignObj::SetVolUID(AliGeomManager::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 = AliGeomManager::LayerToVolUID(detId,modId);
}

//_____________________________________________________________________________
void AliAlignObj::GetVolUID(AliGeomManager::ELayerID &layerId, Int_t &modId) const
{
  // From the fVolUID, unique numerical identity of that volume inside ALICE,
  // (voluid is 16 bits, first 5 reserved for layerID (32 possible values),
  // remaining 11 for module ID inside det (2048 possible values)), sets
  // the argument layerId to the identity of the layer to which that volume
  // belongs and sets the argument modId to the identity of that volume
  // internally to the layer.
  //
  layerId = AliGeomManager::VolUIDToLayer(fVolUID,modId);
}

//_____________________________________________________________________________
Bool_t AliAlignObj::GetPars(Double_t tr[], Double_t angles[]) const
{
  GetTranslation(tr);
  return GetAngles(angles);
}

//_____________________________________________________________________________
Int_t AliAlignObj::GetLevel() const
{
  // Return the geometry level of the alignable volume to which
  // the alignment object is associated; this is the number of
  // slashes in the corresponding volume path
  //
  if(!gGeoManager){
    AliWarning("gGeoManager doesn't exist or it is still open: unable to return meaningful level value.");
    return (-1);
  }
  const char* symname = GetSymName();
  const char* path;
  TGeoPNEntry* pne = gGeoManager->GetAlignableEntry(symname);
  if(pne){
    path = pne->GetTitle();
  }else{
    path = symname;
  }

  TString pathStr = path;
  if(pathStr[0]!='/') pathStr.Prepend('/');
  return pathStr.CountChar('/');
}

//_____________________________________________________________________________
Int_t AliAlignObj::Compare(const TObject *obj) const
{
  // Compare the levels of two
  // alignment objects
  // Used in the sorting during
  // the application of alignment
  // objects to the geometry
  //
  Int_t level = GetLevel();
  Int_t level2 = ((AliAlignObj *)obj)->GetLevel();
  if (level == level2)
    return 0;
  else
    return ((level > level2) ? 1 : -1);
}

//______________________________________________________________________________
void AliAlignObj::GetCovMatrix(Double_t *cmat) const
{
  // Fills the cmat argument with the coefficients of the external cov matrix (21 elements)
  // calculating them from the correlation matrix data member
  //

  for(Int_t i=0; i<6; ++i) {
    // Off diagonal elements
    for(Int_t j=0; j<i; ++j) {
      cmat[i*(i+1)/2+j] = (fDiag[j] >= 0. && fDiag[i] >= 0.) ? fODia[(i-1)*i/2+j]*fDiag[j]*fDiag[i]: -999.;
    }

    // Diagonal elements
    cmat[i*(i+1)/2+i] = (fDiag[i] >= 0.) ? fDiag[i]*fDiag[i] : -999.;
  }

  return;
}

//______________________________________________________________________________
void AliAlignObj::GetCovMatrix(TMatrixDSym& mcov) const
{
  // Fills the matrix m passed as argument as the covariance matrix calculated
  // from the coefficients of the reduced covariance matrix data members
  //

  for(Int_t i=0; i<6; ++i) {
    // Off diagonal elements
    for(Int_t j=0; j<i; ++j) {
      mcov(j,i) = mcov(i,j) = (fDiag[j] >= 0. && fDiag[i] >= 0.) ? fODia[(i-1)*i/2+j]*fDiag[j]*fDiag[i]: -999.;
    }

    // Diagonal elements
    mcov(i,i) = (fDiag[i] >= 0.) ? fDiag[i]*fDiag[i] : -999.;
  }

}

//______________________________________________________________________________
Bool_t AliAlignObj::GetLocalCovMatrix(TMatrixDSym& lCov) const
{
  // Calculates the covariance matrix (6x6) associated to the six parameters
  // defining the current alignment in the global coordinates system (and sets
  // in the internal data members) from the covariance matrix (6x6) for the six
  // parameters defining the alignment transformation in the local coordinates
  // system, passed as an argument.
  //
  TMatrixD mJ(6,6);// the jacobian of the transformation from local to global parameters
  if(!GetJacobian(mJ)) return kFALSE;
  
  TMatrixDSym gCov(6);
  GetCovMatrix(gCov);
  
  // Compute the local covariance matrix lcov = mJ^T gcov mJ
  TMatrixD gcovJ(gCov,TMatrixD::kMult,mJ);
  TMatrixD lCovM(mJ,TMatrixD::kTransposeMult,gcovJ);
  // To be done: somehow check that lCovM is close enough to be symmetric
  for(Int_t i=0; i<6; i++)
  {
    lCov(i,i) = lCovM(i,i);
    for(Int_t j=i+1; j<6; j++)
    {
      lCov(i,j)=lCovM(i,j);
      lCov(j,i)=lCovM(i,j);
    }
  }
  
  return kTRUE;
  
}

//______________________________________________________________________________
Bool_t AliAlignObj::GetLocalCovMatrix(Double_t *lCov) const
{
  // Calculates the covariance matrix (6x6) associated to the six parameters
  // defining the current alignment in the global coordinates system (and sets
  // in the internal data members) from the covariance matrix (6x6) for the six
  // parameters defining the alignment transformation in the local coordinates
  // system, passed as an argument.
  //
  TMatrixDSym lCovMatrix(6);
  GetLocalCovMatrix(lCovMatrix);
  
  Int_t k=0;
  for(Int_t i=0; i<6; i++)
    for(Int_t j=i; j<6; j++)
    {
       lCov[k++] = lCovMatrix(i,j);
    }
			
  return kTRUE;
}

//______________________________________________________________________________
Bool_t AliAlignObj::GetJacobian(TMatrixD& mJ) const
{
  // Compute the jacobian J of the transformation of the six local to the six global delta parameters
  //
  // R00 R01 R02 | (R01Rk2 - R02Rk1)Tk  (R02Rk0 - R00Rk2)Tk  (R00Rk1 - R01Rk0)Tk
  // R00 R01 R02 | (R11Rk2 - R12Rk1)Tk  (R12Rk0 - R10Rk2)Tk  (R10Rk1 - R11Rk0)Tk
  // R00 R01 R02 | (R21Rk2 - R22Rk1)Tk  (R22Rk0 - R20Rk2)Tk  (R20Rk1 - R21Rk0)Tk
  //  -  -   -   -   -   -   -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  //  0   0   0  |   R11R22 - R12R21      R12R20 - R10R22      R10R21 - R11R20
  //  0   0   0  |   R21R02 - R22R01      R22R00 - R20R02      R20R01 - R21R00
  //  0   0   0  |   R01R12 - R02R11      R02R10 - R00R12      R00R11 - R01R10
  //
  if (!gGeoManager || !gGeoManager->IsClosed()) {
    AliError("Can't compute the global covariance matrix from the local one without an open geometry!");
    return kFALSE;
  }

  const char* symname = GetSymName();
  TGeoPhysicalNode* node;
  TGeoPNEntry* pne = gGeoManager->GetAlignableEntry(symname);
  if(pne){
    if(!pne->GetPhysicalNode()){
      node = gGeoManager->MakeAlignablePN(pne);
    }else{
      node = pne->GetPhysicalNode();
    }
  }else{
    AliWarning(Form("The symbolic volume name %s does not correspond to a physical entry. Using it as volume path!",symname));
    node = (TGeoPhysicalNode*) gGeoManager->MakePhysicalNode(symname);
  }

  if (!node) {
    AliError(Form("Volume name or path %s not valid!",symname));
    return kFALSE;
  }

  TGeoHMatrix gm; //global matrix
  gm = *node->GetMatrix();
  Double_t *tr  = gm.GetTranslation();
  Double_t *rot = gm.GetRotationMatrix();
  
  TGeoHMatrix m; // global delta transformation matrix
  GetMatrix(m);
  // We should probably check that it's sufficinetly close to identity
  // if it's not return because the "small angles" approximation cannot hold

  // 3x3 upper left part (global shifts derived w.r.t. local shifts)
  for(Int_t i=0; i<3; i++)
  {
    for(Int_t j=0; j<3; j++)
    {
      mJ(i,j) = rot[i+3*j];
    }
  }
  
  // 3x3 lower left part (global angles derived w.r.t. local shifts)
  for(Int_t i=0; i<3; i++)
  {
    for(Int_t j=0; j<3; j++)
    {
      mJ(i+3,j) = 0.;
    }
  }
  
  // 3x3 upper right part (global shifts derived w.r.t. local angles)
  for(Int_t i=0; i<3; i++)
  {
    for(Int_t j=0; j<3; j++)
    {
      Double_t mEl = 0.;
      Int_t b = (j+1)%3;
      Int_t d = (j+2)%3;
      for(Int_t k=0; k<3; k++)
      {
	mEl += (rot[3*i+b]*rot[3*k+d])*tr[k]-(rot[3*i+d]*rot[3*k+b])*tr[k];
      }
      mJ(i,j+3) = mEl;
    }
  }
  
  // 3x3 lower right part (global angles derived w.r.t. local angles)
  for(Int_t i=0; i<3; i++)
    for(Int_t j=0; j<3; j++)
    {
      Int_t a = (i+1)%3;
      Int_t b = (j+1)%3;
      Int_t c = (i+2)%3;
      Int_t d = (j+2)%3;
      mJ(i+3,j+3) = rot[3*a+b]*rot[3*c+d]-rot[3*a+d]*rot[3*c+b];
    }

  return kTRUE;

}

//______________________________________________________________________________
Bool_t AliAlignObj::SetFromLocalCov(TMatrixDSym& lCov)
{
  // Calculates the covariance matrix (6x6) associated to the six parameters
  // defining the current alignment in the global coordinates system (and sets
  // in the internal data members) from the covariance matrix (6x6) for the six
  // parameters defining the alignment transformation in the local coordinates
  // system, passed as an argument.
  //
  TMatrixD mJ(6,6);// the jacobian of the transformation from local to global parameters
  if(!GetJacobian(mJ)) return kFALSE;
  
  // Compute the global covariance matrix gcov = mJ lcov mJ'
  TMatrixD trJ(TMatrixD::kTransposed, mJ);
  TMatrixD lcovTrJ(lCov,TMatrixD::kMult,trJ);
  TMatrixD gCovM(mJ,TMatrixD::kMult,lcovTrJ);
  // To be done: somehow check that gCovM is close enough to be symmetric
  TMatrixDSym gCov(6);
  for(Int_t i=0; i<6; i++)
  {
    gCov(i,i) = gCovM(i,i);
    for(Int_t j=i+1; j<6; j++)
    {
      gCov(i,j)=gCovM(i,j);
      gCov(j,i)=gCovM(i,j);
    }
  }
  SetCorrMatrix(gCov);

  return kTRUE;
  
}

//______________________________________________________________________________
Bool_t AliAlignObj::SetFromLocalCov(Double_t *lCov)
{
  // Calculates the covariance matrix (6x6) associated to the six parameters
  // defining the current alignment in the global coordinates system, and sets
  // in the internal data members, from the 21 coefficients, passed as argument,
  // of the covariance matrix (6x6) for the six parameters defining the
  // alignment transformation in the local coordinates system.
  //
  TMatrixDSym lCovMatrix(6);
  
  Int_t k=0;
  for(Int_t i=0; i<6; i++)
    for(Int_t j=i; j<6; j++)
    {
      lCovMatrix(i,j) = lCov[k++];
      if(j!=i) lCovMatrix(j,i) = lCovMatrix(i,j);
    }
			
  return SetFromLocalCov(lCovMatrix);

}
  

//______________________________________________________________________________
void AliAlignObj::SetCorrMatrix(Double_t *cmat)
{
  // Sets the correlation matrix data member from the coefficients of the external covariance
  // matrix (21 elements passed as argument). 
  //
  if(cmat) {

    // Diagonal elements first
    for(Int_t i=0; i<6; ++i) {
      fDiag[i] = (cmat[i*(i+1)/2+i] >= 0.) ? TMath::Sqrt(cmat[i*(i+1)/2+i]) : -999.;
    }

    // ... then the ones off diagonal
    for(Int_t i=0; i<6; ++i)
      // Off diagonal elements
      for(Int_t j=0; j<i; ++j) {
	fODia[(i-1)*i/2+j] = (fDiag[i] > 0. && fDiag[j] > 0.) ? cmat[i*(i+1)/2+j]/(fDiag[j]*fDiag[i]) : 0.;       // check for division by zero (due to diagonal element of 0) and for fDiag != -999. (due to negative input diagonal element).
	if (fODia[(i-1)*i/2+j]>1.)  fODia[(i-1)*i/2+j] =  1.; // check upper boundary
	if (fODia[(i-1)*i/2+j]<-1.) fODia[(i-1)*i/2+j] = -1.; // check lower boundary
      }
  } else {
    for(Int_t i=0; i< 6; ++i) fDiag[i]=-999.;
    for(Int_t i=0; i< 6*(6-1)/2; ++i) fODia[i]=0.;
  }

  return;
}

//______________________________________________________________________________
void AliAlignObj::SetCorrMatrix(TMatrixDSym& mcov)
{
  // Sets the correlation matrix data member from the covariance matrix mcov passed
  // passed as argument. 
  //
  if(mcov.IsValid()) {

    // Diagonal elements first
    for(Int_t i=0; i<6; ++i) {
      fDiag[i] = (mcov(i,i) >= 0.) ? TMath::Sqrt(mcov(i,i)) : -999.;
    }

    // ... then the ones off diagonal
    for(Int_t i=0; i<6; ++i)
      // Off diagonal elements
      for(Int_t j=0; j<i; ++j) {
	fODia[(i-1)*i/2+j] = (fDiag[i] > 0. && fDiag[j] > 0.) ? mcov(i,j)/(fDiag[j]*fDiag[i]) : 0.;       // check for division by zero (due to diagonal element of 0) and for fDiag != -999. (due to negative input diagonal element).
	if (fODia[(i-1)*i/2+j]>1.)  fODia[(i-1)*i/2+j] =  1.; // check upper boundary
	if (fODia[(i-1)*i/2+j]<-1.) fODia[(i-1)*i/2+j] = -1.; // check lower boundary
      }
  } else {
    for(Int_t i=0; i< 6; ++i) fDiag[i]=-999.;
    for(Int_t i=0; i< 6*(6-1)/2; ++i) fODia[i]=0.;
  }

  return;
}

//_____________________________________________________________________________
void AliAlignObj::AnglesToMatrix(const Double_t *angles, Double_t *rot) const
{
  // Calculates the rotation matrix using the 
  // Euler angles in "x y z" notation
  //
  Double_t degrad = TMath::DegToRad();
  Double_t sinpsi = TMath::Sin(degrad*angles[0]);
  Double_t cospsi = TMath::Cos(degrad*angles[0]);
  Double_t sinthe = TMath::Sin(degrad*angles[1]);
  Double_t costhe = TMath::Cos(degrad*angles[1]);
  Double_t sinphi = TMath::Sin(degrad*angles[2]);
  Double_t cosphi = TMath::Cos(degrad*angles[2]);

  rot[0] =  costhe*cosphi;
  rot[1] = -costhe*sinphi;
  rot[2] =  sinthe;
  rot[3] =  sinpsi*sinthe*cosphi + cospsi*sinphi;
  rot[4] = -sinpsi*sinthe*sinphi + cospsi*cosphi;
  rot[5] = -costhe*sinpsi;
  rot[6] = -cospsi*sinthe*cosphi + sinpsi*sinphi;
  rot[7] =  cospsi*sinthe*sinphi + sinpsi*cosphi;
  rot[8] =  costhe*cospsi;
}

//_____________________________________________________________________________
Bool_t AliAlignObj::MatrixToAngles(const Double_t *rot, Double_t *angles) const
{
  // Calculates the Euler angles in "x y z" notation
  // using the rotation matrix
  // Returns false in case the rotation angles can not be
  // extracted from the matrix
  //
  if(TMath::Abs(rot[0])<1e-7 || TMath::Abs(rot[8])<1e-7) {
    AliError("Failed to extract roll-pitch-yall angles!");
    return kFALSE;
  }
  Double_t raddeg = TMath::RadToDeg();
  angles[0]=raddeg*TMath::ATan2(-rot[5],rot[8]);
  angles[1]=raddeg*TMath::ASin(rot[2]);
  angles[2]=raddeg*TMath::ATan2(-rot[1],rot[0]);
  return kTRUE;
}

//______________________________________________________________________________
void AliAlignObj::Transform(AliTrackPoint &p, Bool_t copycov) const
{
  // The method transforms the space-point coordinates using the
  // transformation matrix provided by the AliAlignObj
  // In case the copycov flag is set to kTRUE, the covariance matrix 
  // of the alignment object is copied into the space-point
  //
  if (fVolUID != p.GetVolumeID())
    AliWarning(Form("Alignment object ID is not equal to the space-point ID (%d != %d)",fVolUID,p.GetVolumeID())); 

  TGeoHMatrix m;
  GetMatrix(m);
  Double_t *rot = m.GetRotationMatrix();
  Double_t *tr  = m.GetTranslation();

  Float_t xyzin[3],xyzout[3];
  p.GetXYZ(xyzin);
  for (Int_t i = 0; i < 3; i++)
    xyzout[i] = tr[i]+
                xyzin[0]*rot[3*i]+
                xyzin[1]*rot[3*i+1]+
                xyzin[2]*rot[3*i+2];
  p.SetXYZ(xyzout);

  if(copycov){
    TMatrixDSym covmat(6);
    GetCovMatrix(covmat); 
    p.SetAlignCovMatrix(covmat);
  }
  
}

//_____________________________________________________________________________
void AliAlignObj::Transform(AliTrackPointArray &array) const
{
  // This method is used to transform all the track points
  // from the input AliTrackPointArray
  // 
  AliTrackPoint p;
  for (Int_t i = 0; i < array.GetNPoints(); i++) {
    array.GetPoint(p,i);
    Transform(p);
    array.AddPoint(i,&p);
  }
}

//_____________________________________________________________________________
void AliAlignObj::Print(Option_t *) const
{
  // Print the contents of the
  // alignment object in angles and
  // matrix representations
  //
  Double_t tr[3];
  GetTranslation(tr);
  Double_t angles[3];
  GetAngles(angles);
  TGeoHMatrix m;
  GetMatrix(m);
  const Double_t *rot = m.GetRotationMatrix();

  printf("Volume=%s\n",GetSymName());
  if (GetVolUID() != 0) {
    AliGeomManager::ELayerID layerId;
    Int_t modId;
    GetVolUID(layerId,modId);
    printf("VolumeID=%d LayerID=%d ( %s ) ModuleID=%d\n", GetVolUID(),layerId,AliGeomManager::LayerName(layerId),modId);
  }
  printf("%12.8f%12.8f%12.8f    Tx = %12.8f    Psi   = %12.8f\n", rot[0], rot[1], rot[2], tr[0], angles[0]);
  printf("%12.8f%12.8f%12.8f    Ty = %12.8f    Theta = %12.8f\n", rot[3], rot[4], rot[5], tr[1], angles[1]);
  printf("%12.8f%12.8f%12.8f    Tz = %12.8f    Phi   = %12.8f\n", rot[6], rot[7], rot[8], tr[2], angles[2]);

}

//_____________________________________________________________________________
void AliAlignObj::SetPars(Double_t x, Double_t y, Double_t z,
			  Double_t psi, Double_t theta, Double_t phi)
{
  // Set the global delta transformation by passing 3 angles (expressed in
  // degrees) and 3 shifts (in centimeters)
  // 
  SetTranslation(x,y,z);
  SetRotation(psi,theta,phi);
}

//_____________________________________________________________________________
Bool_t AliAlignObj::SetLocalPars(Double_t x, Double_t y, Double_t z,
				 Double_t psi, Double_t theta, Double_t phi)
{
  // Set the global delta transformation by passing the parameters
  // for the local delta transformation (3 shifts and 3 angles).
  // In case that the TGeo was not initialized or not closed,
  // returns false and the object parameters are not set.
  //
  TGeoHMatrix m;
  Double_t tr[3] = {x, y, z};
  m.SetTranslation(tr);
  Double_t angles[3] = {psi, theta, phi};
  Double_t rot[9];
  AnglesToMatrix(angles,rot);
  m.SetRotation(rot);

  return SetLocalMatrix(m);

}

//_____________________________________________________________________________
Bool_t AliAlignObj::SetLocalTranslation(Double_t x, Double_t y, Double_t z)
{
  // Set the global delta transformation by passing the three shifts giving
  // the translation in the local reference system of the alignable
  // volume (known by TGeo geometry).
  // In case that the TGeo was not initialized or not closed,
  // returns false and the object parameters are not set.
  //
  TGeoHMatrix m;
  Double_t tr[3] = {x, y, z};
  m.SetTranslation(tr);

  return SetLocalMatrix(m);

}

//_____________________________________________________________________________
Bool_t AliAlignObj::SetLocalTranslation(const TGeoMatrix& m)
{
  // Set the global delta transformation by passing the matrix of
  // the local delta transformation and taking its translational part
  // In case that the TGeo was not initialized or not closed,
  // returns false and the object parameters are not set.
  //
  const Double_t* tr = m.GetTranslation();
  TGeoHMatrix mtr;
  mtr.SetTranslation(tr);

  return SetLocalMatrix(mtr);

}

//_____________________________________________________________________________
Bool_t AliAlignObj::SetLocalRotation(Double_t psi, Double_t theta, Double_t phi)
{
  // Set the global delta transformation by passing the three angles giving
  // the rotation in the local reference system of the alignable
  // volume (known by TGeo geometry).
  // In case that the TGeo was not initialized or not closed,
  // returns false and the object parameters are not set.
  //
  TGeoHMatrix m;
  Double_t angles[3] = {psi, theta, phi};
  Double_t rot[9];
  AnglesToMatrix(angles,rot);
  m.SetRotation(rot);

  return SetLocalMatrix(m);

}

//_____________________________________________________________________________
Bool_t AliAlignObj::SetLocalRotation(const TGeoMatrix& m)
{
  // Set the global delta transformation by passing the matrix of
  // the local delta transformation and taking its rotational part
  // In case that the TGeo was not initialized or not closed,
  // returns false and the object parameters are not set.
  //
  TGeoHMatrix rotm;
  const Double_t* rot = m.GetRotationMatrix();
  rotm.SetRotation(rot);

  return SetLocalMatrix(rotm);

}

//_____________________________________________________________________________
Bool_t AliAlignObj::SetLocalMatrix(const TGeoMatrix& m)
{
  // Set the global delta transformation by passing the TGeo matrix
  // for the local delta transformation.
  // In case that the TGeo was not initialized or not closed,
  // returns false and the object parameters are not set.
  //
  if (!gGeoManager || !gGeoManager->IsClosed()) {
    AliError("Can't set the local alignment object parameters! gGeoManager doesn't exist or it is still open!");
    return kFALSE;
  }

  const char* symname = GetSymName();
  TGeoHMatrix gprime,gprimeinv;
  TGeoPhysicalNode* pn = 0;
  TGeoPNEntry* pne = gGeoManager->GetAlignableEntry(symname);
  if(pne)
  {
    pn = pne->GetPhysicalNode();
    if(pn){
      if (pn->IsAligned())
	AliWarning(Form("Volume %s has been misaligned already!",symname));
      gprime = *pn->GetMatrix();
    }else{
      gprime = pne->GetGlobalOrig();
    }
  }else{
    AliWarning(Form("The symbolic volume name %s does not correspond to a physical entry. Using it as volume path!",symname));
    if(!gGeoManager->cd(symname)) {
      AliError(Form("Volume name or path %s not valid!",symname));
      return kFALSE;
    }
    gprime = *gGeoManager->GetCurrentMatrix();
  }

  TGeoHMatrix m1; // the TGeoHMatrix copy of the local delta "m"
  const Double_t *tr = m.GetTranslation();
  m1.SetTranslation(tr);
  const Double_t* rot = m.GetRotationMatrix();
  m1.SetRotation(rot);

  gprimeinv = gprime.Inverse();
  m1.Multiply(&gprimeinv);
  m1.MultiplyLeft(&gprime);

  return SetMatrix(m1);
}

//_____________________________________________________________________________
Bool_t AliAlignObj::SetMatrix(const TGeoMatrix& m)
{
  // Set the global delta transformation by passing the TGeoMatrix
  // for it
  //
  SetTranslation(m);
  return SetRotation(m);
}

//_____________________________________________________________________________
Bool_t AliAlignObj::GetLocalPars(Double_t transl[], Double_t angles[]) const
{
  // Get the translations and angles (in degrees) expressing the
  // local delta transformation.
  // In case that the TGeo was not initialized or not closed,
  // returns false and the object parameters are not set.
  //
  if(!GetLocalTranslation(transl)) return kFALSE;
  return GetLocalAngles(angles);
}

//_____________________________________________________________________________
Bool_t AliAlignObj::GetLocalTranslation(Double_t* tr) const
{
  // Get the 3 shifts giving the translational part of the local
  // delta transformation.
  // In case that the TGeo was not initialized or not closed,
  // returns false and the object parameters are not set.
  //
  TGeoHMatrix ml;
  if(!GetLocalMatrix(ml)) return kFALSE;
  const Double_t* transl;
  transl = ml.GetTranslation();
  tr[0]=transl[0];
  tr[1]=transl[1];
  tr[2]=transl[2];
  return kTRUE;
}

//_____________________________________________________________________________
Bool_t AliAlignObj::GetLocalAngles(Double_t* angles) const
{
  // Get the 3 angles giving the rotational part of the local
  // delta transformation.
  // In case that the TGeo was not initialized or not closed,
  // returns false and the object parameters are not set.
  //
  TGeoHMatrix ml;
  if(!GetLocalMatrix(ml)) return kFALSE;
  const Double_t *rot = ml.GetRotationMatrix();
  return MatrixToAngles(rot,angles);
}

//_____________________________________________________________________________
Bool_t AliAlignObj::GetLocalMatrix(TGeoHMatrix& m) const
{
  // Get the matrix for the local delta transformation.
  // In case that the TGeo was not initialized or not closed,
  // returns false and the object parameters are not set.
  //
  if (!gGeoManager || !gGeoManager->IsClosed()) {
    AliError("Can't get the local alignment object parameters! gGeoManager doesn't exist or it is still open!");
    return kFALSE;
  }

  const char* symname = GetSymName();
  TGeoPhysicalNode* node;
  TGeoPNEntry* pne = gGeoManager->GetAlignableEntry(symname);
  if(pne){
    if(!pne->GetPhysicalNode()){
      node = gGeoManager->MakeAlignablePN(pne);
    }else{
      node = pne->GetPhysicalNode();
    }
  }else{
    AliWarning(Form("The symbolic volume name %s does not correspond to a physical entry. Using it as volume path!",symname));
    node = (TGeoPhysicalNode*) gGeoManager->MakePhysicalNode(symname);
  }

  if (!node) {
    AliError(Form("Volume name or path %s not valid!",symname));
    return kFALSE;
  }
//  if (node->IsAligned())
//    AliWarning(Form("Volume %s has been misaligned already!",symname));

  GetMatrix(m);
  TGeoHMatrix gprime,gprimeinv;
  gprime = *node->GetMatrix();
  gprimeinv = gprime.Inverse();
  m.Multiply(&gprime);
  m.MultiplyLeft(&gprimeinv);

  return kTRUE;
}

//_____________________________________________________________________________
Bool_t AliAlignObj::ApplyToGeometry(Bool_t ovlpcheck)
{
  // Apply the current alignment object to the TGeo geometry
  // This method returns FALSE if the symname of the object was not
  // valid neither to get a TGeoPEntry nor as a volume path
  //
  if (!gGeoManager || !gGeoManager->IsClosed()) {
    AliError("Can't apply the alignment object! gGeoManager doesn't exist or it is still open!");
    return kFALSE;
  }

  if (gGeoManager->IsLocked()){
    AliError("Can't apply the alignment object! Geometry is locked!");
    return kFALSE;
  }

  const char* symname = GetSymName();
  const char* path;
  TGeoPhysicalNode* node;
  TGeoPNEntry* pne = gGeoManager->GetAlignableEntry(symname);
  if(pne){
    path = pne->GetTitle();
    node = gGeoManager->MakeAlignablePN(pne);
  }else{
    AliDebug(1,Form("The symbolic volume name %s does not correspond to a physical entry. Using it as a volume path!",symname));
    path=symname;
    if (!gGeoManager->CheckPath(path)) {
      AliDebug(1,Form("Volume path %s not valid!",path));
      return kFALSE;
    }
    if (gGeoManager->GetListOfPhysicalNodes()->FindObject(path)) {
      AliError(Form("Volume %s has been misaligned already!",path));
      return kFALSE;
    }
    node = (TGeoPhysicalNode*) gGeoManager->MakePhysicalNode(path);
  }

  if (!node) {
    AliError(Form("Volume path %s not valid!",path));
    return kFALSE;
  }

  //  Double_t threshold = 0.001;
  
  TGeoHMatrix align,gprime;
  gprime = *node->GetMatrix();
  GetMatrix(align);
  gprime.MultiplyLeft(&align);
  TGeoHMatrix *ginv = new TGeoHMatrix;
  TGeoHMatrix *g = node->GetMatrix(node->GetLevel()-1);
  *ginv = g->Inverse();
  *ginv *= gprime;
  AliGeomManager::ELayerID layerId; // unique identity for layer in the alobj
  Int_t modId; // unique identity for volume inside layer in the alobj
  GetVolUID(layerId, modId);
  AliDebug(2,Form("Aligning volume %s of detector layer %d with local ID %d",symname,layerId,modId));
  if(ovlpcheck){
    node->Align(ginv,0,kTRUE); //(trunk of root takes threshold as additional argument)
  }else{
    node->Align(ginv,0,kFALSE);
  }
  if(ovlpcheck)
  {
    TObjArray* ovlpArray =  gGeoManager->GetListOfOverlaps();
    Int_t nOvlp = ovlpArray->GetEntriesFast();
    if(nOvlp)
    {
      AliInfo(Form("Misalignment of node %s generated the following overlaps/extrusions:",node->GetName()));
      for(Int_t i=0; i<nOvlp; i++)
	((TGeoOverlap*)ovlpArray->UncheckedAt(i))->PrintInfo();
    }
  }
      
  return kTRUE;
}


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