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$ */
///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// An AliTRDalignment object contains the alignment data (3 shifts and 3     //
// tilts) for all the alignable volumes of the TRD, i.e. for 18 supermodules //
// and 540 chambers. The class provides simple tools for reading and writing //
// these data in different formats, and for generating fake data that can be //
// used to simulate misalignment.                                            //
// The six alignment variables have the following meaning:                   //
// shift in rphi                                                             //
// shift in z                                                                //
// shift in r                                                                //
// tilt around rphi                                                          //
// tilt around z                                                             //
// tilt around r                                                             //
// The shifts are in cm and the tilts are in degrees.                        //
// The currently supported formats are:                                      //
// - ascii                                                                   //
// - root file containing a TClonesArray of alignment objects                //
// - offline conditions database                                             //
// - OCDB-like root file                                                     //
// - geometry file (like misaligned_geometry.root)                           //
//                                                                           //
// Some examples of usage (in an aliroot session):                           //
// AliTRDalignment a,b,c,d,e;                                                //
// double xsm[]={0,0,0,-70,0,0};                                             //
// double xch[]={0,0,-50,0,0,0};                                             //
// a.SetSm(4,xsm);                                                           // 
// a.SetCh(120,xch);                                                         //
// a.WriteAscii("kuku.dat");                                                 //
// TGeoManager::Import("geometry.root"); a.WriteRoot("kuku.root");           //
// TGeoManager::Import("geometry.root"); a.WriteDB("kukudb.root",0,0);       //
// TGeoManager::Import("geometry.root");                                     //
// a.WriteDB("local://$ALICE_ROOT/OCDB", "TRD/Align/Data", 0,0);                  //
// TGeoManager::Import("geometry.root"); a.WriteGeo("kukugeometry.root");    //
//                                                                           //
// b.ReadAscii("kuku.dat");                                                  //
// TGeoManager::Import("geometry.root"); c.ReadRoot("kuku.root");            //
// TGeoManager::Import("geometry.root"); d.ReadDB("kukudb.root");            //
// TGeoManager::Import("kukugeometry.root"); e.ReadCurrentGeo();             //
//                                                                           //
// e.PrintSm(4);                                                             //
// e.PrintCh(120);                                                           // 
// a.PrintRMS();                                                             //
// b.PrintRMS();                                                             //
// e.PrintRMS();                                                             //
//                                                                           //
//                                                                           //
// D.Miskowiec, November 2006                                                //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <fstream>

#include "TMath.h"
#include "TFile.h"
#include "TGeoManager.h"
#include "TGeoPhysicalNode.h"
#include "TClonesArray.h"
#include "TString.h"
#include "TFitter.h"
#include "TMinuit.h"

#include "AliLog.h"
#include "AliAlignObj.h"
#include "AliAlignObjParams.h"
#include "AliCDBManager.h"
#include "AliCDBStorage.h"
#include "AliCDBMetaData.h"
#include "AliCDBEntry.h"
#include "AliSurveyObj.h"
#include "AliSurveyPoint.h"

#include "AliTRDalignment.h"

void trdAlignmentFcn(Int_t &npar, Double_t *gin, Double_t &f, Double_t *x, Int_t iflag);

using std::ostream;
using std::fstream;
ClassImp(AliTRDalignment)

//_____________________________________________________________________________
AliTRDalignment::AliTRDalignment() 
  :TObject()
  ,fComment()
  ,fRan(0)
{
  //
  // constructor
  //

  SetZero();

  for (int i=0; i<18; i++) for (int j=0; j<2; j++) for (int k=0; k<2; k++) for (int l=0; l<2; l++) {
    fSurveyX[i][j][k][l] = 0.0;
    fSurveyY[i][j][k][l] = 0.0;
    fSurveyZ[i][j][k][l] = 0.0;
    fSurveyEX[i][j][k][l] = 0.0;
    fSurveyEY[i][j][k][l] = 0.0;
    fSurveyEZ[i][j][k][l] = 0.0;
  }

  // Initialize the nominal positions of the survey points 
  // in the local frame of supermodule (where y is the long side, 
  // z corresponds to the radius in lab, and x to the phi in lab).
  // Four survey marks are on each z-side of the supermodule. 
  //               A           B
  //           ----o-----------o----        x |
  //           \                   /          |
  //            \                 /           |
  //             \               /            |
  //              \             /             |
  //               ---o-----o---              -------------->
  //                  C     D                              y
  // 
  // For the purpose of this explanation lets define the origin such that 
  // the supermodule occupies 0 < x < 77.9 cm. Then the coordinates (x,y) 
  // are (in cm) 
  // A (76.2,-30.25)
  // B (76.2,+30.25)
  // C ( 2.2,-22.5 )
  // D ( 2.2,+22.5 )
  // 

  double x[2] = {22.5,30.25};                   // lab phi, or tracking-y
  double y[2] = {353.0, -353.0};                // lab z; inc. 2 cm survey target offset
  double z[2] = {-(77.9/2.0-2.0),77.9/2.0-1.5}; // lab r, or better tracking-x

  for (int j=0; j<2; j++) for (int k=0; k<2; k++) for (int l=0; l<2; l++) {
    fSurveyX0[j][k][l] = -TMath::Power(-1,l) * x[k];
    fSurveyY0[j][k][l] = y[j];
    fSurveyZ0[j][k][l] = z[k];
  }

  for (int i=0; i<1000; i++) {
    fIbuffer[i] = 0;
    fDbuffer[i] = 0.0;
  }

}

//_____________________________________________________________________________
AliTRDalignment::AliTRDalignment(const AliTRDalignment& source) 
  :TObject(source)
  ,fComment(source.fComment)
  ,fRan(source.fRan)
{
  //
  // copy constructor
  //

  for (int i=0; i<18; i++) SetSm(i,source.fSm[i]);
  for (int i=0; i<540; i++) SetCh(i,source.fCh[i]);
  for (int i=0; i<18; i++) for (int j=0; j<2; j++) for (int k=0; k<2; k++) for (int l=0; l<2; l++) {
    fSurveyX[i][j][k][l] = source.fSurveyX[i][j][k][l];
    fSurveyY[i][j][k][l] = source.fSurveyY[i][j][k][l];
    fSurveyZ[i][j][k][l] = source.fSurveyZ[i][j][k][l];
    fSurveyEX[i][j][k][l] = source.fSurveyEX[i][j][k][l];
    fSurveyEY[i][j][k][l] = source.fSurveyEY[i][j][k][l];
    fSurveyEZ[i][j][k][l] = source.fSurveyEZ[i][j][k][l];
  }
  for (int j=0; j<2; j++) for (int k=0; k<2; k++) for (int l=0; l<2; l++) {
    fSurveyX0[j][k][l] = source.fSurveyX0[j][k][l];
    fSurveyY0[j][k][l] = source.fSurveyY0[j][k][l];
    fSurveyZ0[j][k][l] = source.fSurveyZ0[j][k][l];
  }
  for (int i=0; i<1000; i++) {
    fIbuffer[i] = 0;
    fDbuffer[i] = 0.0;
  }

}

//_____________________________________________________________________________
AliTRDalignment& AliTRDalignment::operator=(const AliTRDalignment &source) 
{
  //
  // assignment operator
  //

  if (this != &source) {
    for (int i = 0; i <  18; i++) SetSm(i,source.fSm[i]);
    for (int i = 0; i < 540; i++) SetCh(i,source.fCh[i]);
    for (int i=0; i<18; i++) for (int j=0; j<2; j++) for (int k=0; k<2; k++) for (int l=0; l<2; l++) {
      fSurveyX[i][j][k][l] = source.fSurveyX[i][j][k][l];
      fSurveyY[i][j][k][l] = source.fSurveyY[i][j][k][l];
      fSurveyZ[i][j][k][l] = source.fSurveyZ[i][j][k][l];
      fSurveyEX[i][j][k][l] = source.fSurveyEX[i][j][k][l];
      fSurveyEY[i][j][k][l] = source.fSurveyEY[i][j][k][l];
      fSurveyEZ[i][j][k][l] = source.fSurveyEZ[i][j][k][l];
    }
    for (int j=0; j<2; j++) for (int k=0; k<2; k++) for (int l=0; l<2; l++) {
      fSurveyX0[j][k][l] = source.fSurveyX0[j][k][l];
      fSurveyY0[j][k][l] = source.fSurveyY0[j][k][l];
      fSurveyZ0[j][k][l] = source.fSurveyZ0[j][k][l];
    }
    fComment = source.fComment;
  }

  return *this;

}

//_____________________________________________________________________________
AliTRDalignment& AliTRDalignment::operator*=(double fac) 
{
  //
  // multiplication operator
  //

  for (int i = 0; i <  18; i++) for (int j = 0; j < 6; j++) this->fSm[i][j] *= fac;
  for (int i = 0; i < 540; i++) for (int j = 0; j < 6; j++) this->fCh[i][j] *= fac;

  return *this;

}

//_____________________________________________________________________________
AliTRDalignment& AliTRDalignment::operator+=(const AliTRDalignment &source) 
{
  //
  // addition operator
  //

  for (int i = 0; i <  18; i++) for (int j = 0; j < 6; j++) this->fSm[i][j] += source.fSm[i][j];
  for (int i = 0; i < 540; i++) for (int j = 0; j < 6; j++) this->fCh[i][j] += source.fCh[i][j];

  return *this;

}

//_____________________________________________________________________________
AliTRDalignment& AliTRDalignment::operator-=(const AliTRDalignment &source) 
{
  //
  // subtraction operator
  //

  for (int i = 0; i <  18; i++) for (int j = 0; j < 6; j++) fSm[i][j] -= source.fSm[i][j];
  for (int i = 0; i < 540; i++) for (int j = 0; j < 6; j++) fCh[i][j] -= source.fCh[i][j];

  return *this;

}

//_____________________________________________________________________________
Bool_t AliTRDalignment::operator==(const AliTRDalignment &source) const
{
  //
  // comparison operator
  //

  Bool_t areEqual = 1;

  for (int i = 0; i <  18; i++) for (int j = 0; j < 6; j++) areEqual &= (fSm[i][j] == source.fSm[i][j]);
  for (int i = 0; i < 540; i++) for (int j = 0; j < 6; j++) areEqual &= (fCh[i][j] == source.fCh[i][j]);

  return areEqual;

}

//_____________________________________________________________________________
void AliTRDalignment::SetSmZero() 
{
  //
  // reset to zero supermodule data
  //

  memset(&fSm[0][0],0,sizeof(fSm));

}

//_____________________________________________________________________________
void AliTRDalignment::SetChZero() 
{
  //
  // reset to zero chamber data
  //

  memset(&fCh[0][0],0,sizeof(fCh));

}

//_____________________________________________________________________________
void AliTRDalignment::SetSmRandom(double a[6]) 
{
  //
  // generate random gaussian supermodule data with sigmas a
  //

  double x[6];
  double xmax[6]={999, 0.6, 999, 999, 999, 999};

  for (int i = 0; i < 18; i++) {
    for (int j = 0; j < 6; j++) {
      do {x[j] = fRan.Gaus(0,a[j]);} while (TMath::Abs(x[j]) > xmax[j]);
    }
    SetSm(i,x);
    //PrintSm(i);
  }

}

//_____________________________________________________________________________
void AliTRDalignment::SetChRandom(double a[6]) 
{
  //
  // generate random gaussian chamber data with sigmas a
  //

  double x[6];

  for (int i = 0; i < 540; i++) {
    fRan.Rannor(x[0],x[1]);
    fRan.Rannor(x[2],x[3]);
    fRan.Rannor(x[4],x[5]);
    for (int j = 0; j < 6; j++) x[j] *= a[j];
    SetCh(i,x);
    //PrintCh(i);
  }

}

//_____________________________________________________________________________
void AliTRDalignment::SetSmFull() 
{
  //
  // generate random gaussian supermodule data similar to the misalignment 
  // expected from the mechanical precision 
  //

  double a[6];

  a[0] = 0.3; // phi
  a[1] = 0.3; // z
  a[2] = 0.3; // r
  a[3] = 0.4/1000.0 / TMath::Pi()*180.0; // phi
  a[4] = 2.0/1000.0 / TMath::Pi()*180.0; // z
  a[5] = 0.4/1000.0 / TMath::Pi()*180.0; // r

  SetSmRandom(a);

}

//_____________________________________________________________________________
void AliTRDalignment::SetChFull() 
{
  //
  // generate random gaussian chamber data similar to the misalignment 
  // expected from the mechanical precision 
  //

  double a[6];

  a[0] = 0.1; // phi
  a[1] = 0.1; // z
  a[2] = 0.1; // r
  a[3] = 1.0/1000.0 / TMath::Pi()*180.0; // phi
  a[4] = 1.0/1000.0 / TMath::Pi()*180.0; // z
  a[5] = 0.7/1000.0 / TMath::Pi()*180.0; // r

  SetChRandom(a);

}

//_____________________________________________________________________________
void AliTRDalignment::SetSmResidual() 
{
  //
  // generate random gaussian supermodule data similar to the misalignment 
  // remaining after full calibration
  // I assume that it will be negligible
  //

  SetSmZero();

}

//_____________________________________________________________________________
void AliTRDalignment::SetChResidual() 
{
  //
  // generate random gaussian chamber data similar to the misalignment 
  // remaining after full calibration
  //

  double a[6];

  a[0] = 0.002; // phi
  a[1] = 0.003; // z
  a[2] = 0.007; // r
  a[3] = 0.3/1000.0 / TMath::Pi()*180.0; // phi
  a[4] = 0.3/1000.0 / TMath::Pi()*180.0; // z
  a[5] = 0.1/1000.0 / TMath::Pi()*180.0; // r

  SetChRandom(a);

}

//_____________________________________________________________________________
void AliTRDalignment::PrintSm(int i, FILE * const fp) const 
{
  //
  // print the supermodule data
  //

  fprintf(fp,"%4d   %11.4f %11.4f  %11.4f      %11.5f  %11.5f  %11.5f   %6d  %s\n"
	 ,i,fSm[i][0],fSm[i][1],fSm[i][2],fSm[i][3],fSm[i][4],fSm[i][5]
	 ,0,GetSmName(i));

}

//_____________________________________________________________________________
void AliTRDalignment::PrintCh(int i, FILE * const fp) const 
{
  //
  // print the chamber data
  //

  fprintf(fp,"%4d   %11.4f %11.4f  %11.4f      %11.5f  %11.5f  %11.5f   %6d  %s\n"
	 ,i,fCh[i][0],fCh[i][1],fCh[i][2],fCh[i][3],fCh[i][4],fCh[i][5]
	 ,GetVoi(i),GetChName(i));

}

//_____________________________________________________________________________
void AliTRDalignment::ReadAscii(const char * const filename) 
{
  //
  // read the alignment data from ascii file
  //

  double x[6];      // alignment data
  int volid;        // volume id
  std::string syna; // symbolic name
  int j;            // dummy index

  fstream fi(filename,fstream::in);
  if (!fi) {
    AliError(Form("cannot open input file %s",filename));
    return;
  }

  // supermodules

  for (int i = 0; i < 18; i++) {
    fi>>j>>x[0]>>x[1]>>x[2]>>x[3]>>x[4]>>x[5]>>volid>>syna;
    if (j != i) AliError(Form("sm %d expected, %d found",i,j));
    if (volid != 0) AliError(Form("sm %d volume id %d expected, %d found",i,0,volid));
    std::string symnam = GetSmName(i);
    if (syna != symnam) AliError(Form("sm %d name %s expected, %s found",i,symnam.data(),syna.data()));
    SetSm(i,x);
  }

  // chambers

  for (int i = 0; i < 540; i++) {
    fi>>j>>x[0]>>x[1]>>x[2]>>x[3]>>x[4]>>x[5]>>volid>>syna;
    if (j != i) AliError(Form("ch %d expected, %d found",i,j));
    if (volid != GetVoi(i)) AliError(Form("ch %d volume id %d expected, %d found",i,GetVoi(i),volid));
    std::string symnam = GetChName(i);
    if (syna != symnam) AliError(Form("ch %d name %s expected, %s found",i,symnam.data(),syna.data()));
    SetCh(i,x);
  }

  fi.close();

}

//_____________________________________________________________________________
void AliTRDalignment::ReadCurrentGeo() 
{
  //
  // use currently loaded geometry to determine misalignment by comparing 
  // original and misaligned matrix of the last node
  // Now, original, does not mean "ideal". It is the matrix before the alignment. 
  // So, if alignment was applied more than once, the numbers extracted will 
  // represent just the last alignment. -- check this!
  //

  TGeoPNEntry *pne;
  TGeoHMatrix *ideSm[18];  // ideal
  TGeoHMatrix *misSm[18];  // misaligned
  for (int i = 0; i < 18; i++) if ((pne = gGeoManager->GetAlignableEntry(GetSmName(i)))) {

    // read misaligned and original matrices

    TGeoPhysicalNode *node = pne->GetPhysicalNode();
    if (!node) AliError(Form("physical node entry %s has no physical node",GetSmName(i)));
    if (!node) continue;
    misSm[i] = new TGeoHMatrix(*node->GetNode(node->GetLevel())->GetMatrix());
    ideSm[i] = new TGeoHMatrix(*node->GetOriginalMatrix());

    // calculate the local misalignment matrices as inverse misaligned times ideal

    TGeoHMatrix mat(ideSm[i]->Inverse()); 
    mat.Multiply(misSm[i]);
    double *tra = mat.GetTranslation();
    double *rot = mat.GetRotationMatrix();
    double pars[6];
    pars[0] = tra[0];
    pars[1] = tra[1];
    pars[2] = tra[2];
    if (TMath::Abs(rot[0])<1e-7 || TMath::Abs(rot[8])<1e-7) AliError("Failed to extract roll-pitch-yall angles!");
    double raddeg = TMath::RadToDeg();
    pars[3] = raddeg * TMath::ATan2(-rot[5],rot[8]);
    pars[4] = raddeg * TMath::ASin(rot[2]);
    pars[5] = raddeg * TMath::ATan2(-rot[1],rot[0]);
    SetSm(i,pars);

    // cleanup

    delete ideSm[i];
    delete misSm[i];
  }

  TGeoHMatrix *ideCh[540]; // ideal
  TGeoHMatrix *misCh[540]; // misaligned
  for (int i = 0; i < 540; i++) if ((pne = gGeoManager->GetAlignableEntry(GetChName(i)))) {

    // read misaligned and original matrices

    TGeoPhysicalNode *node = pne->GetPhysicalNode();
    if (!node) AliError(Form("physical node entry %s has no physical node",GetChName(i)));
    if (!node) continue;
    misCh[i] = new TGeoHMatrix(*node->GetNode(node->GetLevel())->GetMatrix());
    ideCh[i] = new TGeoHMatrix(*node->GetOriginalMatrix());

    // calculate the local misalignment matrices as inverse misaligned times ideal

    TGeoHMatrix mat(ideCh[i]->Inverse()); 
    mat.Multiply(misCh[i]);
    double *tra = mat.GetTranslation();
    double *rot = mat.GetRotationMatrix();
    double pars[6];
    pars[0] = tra[0];
    pars[1] = tra[1];
    pars[2] = tra[2];
    if(TMath::Abs(rot[0])<1e-7 || TMath::Abs(rot[8])<1e-7) {
      AliError("Failed to extract roll-pitch-yall angles!");
      return;
    }
    double raddeg = TMath::RadToDeg();
    pars[3] = raddeg * TMath::ATan2(-rot[5],rot[8]);
    pars[4] = raddeg * TMath::ASin(rot[2]);
    pars[5] = raddeg * TMath::ATan2(-rot[1],rot[0]);
    SetCh(i,pars);

    // cleanup
    delete ideCh[i];
    delete misCh[i];
  }

  return;

}

//_____________________________________________________________________________
void AliTRDalignment::ReadRoot(const char * const filename) 
{
  //
  // read the alignment data from root file
  //

  TFile fi(filename,"READ");

  if (fi.IsOpen()) {
    TClonesArray *ar = (TClonesArray*) fi.Get("TRDAlignObjs");
    ArToNumbers(ar);
    fi.Close();
  } 
  else AliError(Form("cannot open input file %s",filename));

  return;

}

//_____________________________________________________________________________
void AliTRDalignment::ReadDB(const char * const filename) 
{
  //
  // read the alignment data from database file
  //

  TFile fi(filename,"READ");

  if (fi.IsOpen()) {
    AliCDBEntry  *e  = (AliCDBEntry *) fi.Get("AliCDBEntry");
    e->PrintMetaData();
    fComment.SetString(e->GetMetaData()->GetComment());
    TClonesArray *ar = (TClonesArray *) e->GetObject();
    ArToNumbers(ar);
    fi.Close();
  } 
  else AliError(Form("cannot open input file %s",filename));

  return;

}

//_____________________________________________________________________________
void AliTRDalignment::ReadDB(const char * const db, const char * const path, 
			     int run, int version, int subversion)
{
  //
  // read the alignment data from database
  //

  AliCDBManager *cdb     = AliCDBManager::Instance();
  AliCDBStorage *storLoc = cdb->GetStorage(db);
  AliCDBEntry   *e       = storLoc->Get(path,run,version,subversion);
  if (e) {
    e->PrintMetaData();
    fComment.SetString(e->GetMetaData()->GetComment());
    TClonesArray  *ar      =  (TClonesArray *) e->GetObject();
    ArToNumbers(ar);
  }
}

//_____________________________________________________________________________
Bool_t AliTRDalignment::DecodeSurveyPointName(TString pna, Int_t &sm, Int_t &iz, 
					      Int_t &ir, Int_t &iphi) {
  // decode the survey point name and extract the sm, z, r and phi indices
  
  if (pna(0,6)!="TRD_sm") {
    AliError(Form("unexpected point name: %s",pna.Data()));
    return kFALSE;
  }
  sm = atoi(pna(6,2).Data()); // supermodule number
  iz = -1;
  if (pna(8) == 'a') iz=0; // anticlockwise, positive z
  if (pna(8) == 'c') iz=1; // clockwise, negative z
  ir = -1;
  if (pna(9) == 'l') ir=0; // low radius
  if (pna(9) == 'h') ir=1; // high radius
  iphi = -1;
  if (pna(10) == '0') iphi = 0; // low phi within supermodule
  if (pna(10) == '1') iphi = 1; // high phi within supermodule
  if (sm>=0 && sm<18 && iz>=0 && iz<2 && ir>=0 && ir<2 && iphi>=0 && iphi<2) return kTRUE;
  AliError(Form("cannot decode point name: %s",pna.Data()));
  return kFALSE;
}

//_____________________________________________________________________________
void AliTRDalignment::ReadSurveyReport(const char * const filename) 
{
  //
  // Read survey report and store the numbers in fSurveyX, fSurveyY, fSurveyZ, 
  // and fSurveyE.  Store the survey info in the fComment.
  // Each supermodule has 8 survey points. The point names look like 
  // TRD_sm08ah0 and have the following meaning. 
  //
  // sm00..17 mean supermodule 0 through 17, following the phi.
  // Supermodule 00 is between phi=0 and phi=20 degrees.
  //
  // a or c denotes the anticlockwise and clockwise end of the supermodule
  // in z. Clockwise end is where z is negative and where the muon arm sits.
  //
  // l or h denote low radius and high radius holes
  //
  // 0 or 1 denote the hole at smaller and at larger phi, respectively.
  //

  // read the survey file

  fstream in(filename,fstream::in);
  if (!in) {
    AliError(Form("cannot open input file %s",filename));
    return;
  }

  // loop through the lines of the file until the beginning of data

  TString title,date,subdetector,url,version,observations,system,units;
  while (1) {
    char pee=in.peek();
    if (pee==EOF) break; 
    TString line;
    line.ReadLine(in);
    if (line.Contains("Title:"))        title.ReadLine(in);
    if (line.Contains("Date:"))         date.ReadLine(in);
    if (line.Contains("Subdetector:"))  subdetector.ReadLine(in);
    if (line.Contains("URL:"))          url.ReadLine(in);
    if (line.Contains("Version:"))      version.ReadLine(in);
    if (line.Contains("Observations:")) observations.ReadLine(in);
    if (line.Contains("System:"))       system.ReadLine(in);
    if (line.Contains("Units:"))        units.ReadLine(in);
    if (line.Contains("Data:"))         break;
  }

  // check what we found so far (watch out, they have \r at the end)

  std::cout<<"title .........."<<title<<std::endl;
  std::cout<<"date ..........."<<date<<std::endl;
  std::cout<<"subdetector ...."<<subdetector<<std::endl;
  std::cout<<"url ............"<<url<<std::endl;
  std::cout<<"version ........"<<version<<std::endl;
  std::cout<<"observations ..."<<observations<<std::endl;
  std::cout<<"system ........."<<system<<std::endl;
  std::cout<<"units .........."<<units<<std::endl;

  if (!subdetector.Contains("TRD")) {
    AliWarning(Form("Not a TRD survey file, subdetector = %s",subdetector.Data()));
    return;
  }
  double tocm = 0; // we want to have it in cm
  if (units.Contains("mm"))      tocm = 0.1;
  else if (units.Contains("cm")) tocm = 1.0;
  else if (units.Contains("m"))  tocm = 100.0;
  else if (units.Contains("pc")) tocm = 3.24078e-15;
  else {
    AliError(Form("unexpected units: %s",units.Data()));
    return;
  }
  if (!system.Contains("ALICEPH")) {
    AliError(Form("wrong system: %s, should be ALICEPH",system.Data()));
    return;
  }

  // scan the rest of the file which should contain list of surveyed points
  // for every point, decode the point name and store the numbers in the right 
  // place in the arrays fSurveyX etc.

  while (1) {
    TString pna; // point name
    char type, target;
    double x,y,z,precision;
    
    in >> pna >> x >> y >> z >> type >> target >> precision;  
    if (in.fail()) break;
    Int_t i,j,k,l;
    if (DecodeSurveyPointName(pna,i,j,k,l)) {
      fSurveyX[i][j][k][l] = tocm*x;
      fSurveyY[i][j][k][l] = tocm*y;
      fSurveyZ[i][j][k][l] = tocm*z;
      fSurveyEX[i][j][k][l] = precision/10; // "precision" is supposed to be in mm
      fSurveyEY[i][j][k][l] = precision/10; // "precision" is supposed to be in mm
      fSurveyEZ[i][j][k][l] = precision/10; // "precision" is supposed to be in mm
      // if, at some point, separate precision numbers for x,y,z show up in the 
      // survey reports the function will fail here
      printf("decoded %s %02d %d %d %d  %8.2f %8.2f %8.2f %6.2f %6.2f %6.2f\n", 
	     pna.Data(), i, j, k, l,
	     fSurveyX[i][j][k][l], fSurveyY[i][j][k][l], fSurveyZ[i][j][k][l],
	     fSurveyEX[i][j][k][l], fSurveyEY[i][j][k][l], fSurveyEZ[i][j][k][l]);
    } else AliError(Form("cannot decode point name: %s",pna.Data()));
  }
  in.close();
  TString info = "Survey "+title+" "+date+" "+url+" "+version+" "+observations;
  info.ReplaceAll("\r","");
  fComment.SetString(info.Data());
 
}

//_____________________________________________________________________________
void AliTRDalignment::ReadSurveyReport(const AliSurveyObj * const so) 
{
  //
  // Read survey report and store the numbers in fSurveyX, fSurveyY, fSurveyZ, 
  // and fSurveyE.  Store the survey info in the fComment.
  // Each supermodule has 8 survey points. The point names look like 
  // TRD_sm08ah0 and have the following meaning. 
  //
  // sm00..17 mean supermodule 0 through 17, following the phi.
  // Supermodule 00 is between phi=0 and phi=20 degrees.
  //
  // a or c denotes the anticlockwise and clockwise end of the supermodule
  // in z. Clockwise end is where z is negative and where the muon arm sits.
  //
  // l or h denote low radius and high radius holes
  //
  // 0 or 1 denote the hole at smaller and at larger phi, respectively.
  //

  // read and process the data from the survey object

  Int_t size = so->GetEntries();
  printf("-> %d\n", size);

  TString title        = so->GetReportTitle();
  TString date         = so->GetReportDate();
  TString subdetector  = so->GetDetector();
  TString url          = so->GetURL();
  TString report       = so->GetReportNumber();
  TString version      = so->GetReportVersion();
  TString observations = so->GetObservations();
  TString system       = so->GetCoordSys();
  TString units        = so->GetUnits();

  // check what we found so far (watch out, they have \r at the end)

  std::cout<<"title .........."<<title<<std::endl;
  std::cout<<"date ..........."<<date<<std::endl;
  std::cout<<"subdetector ...."<<subdetector<<std::endl;
  std::cout<<"url ............"<<url<<std::endl;
  std::cout<<"version ........"<<version<<std::endl;
  std::cout<<"observations ..."<<observations<<std::endl;
  std::cout<<"system ........."<<system<<std::endl;
  std::cout<<"units .........."<<units<<std::endl;

  if (!subdetector.Contains("TRD")) {
    AliWarning(Form("Not a TRD survey file, subdetector = %s",subdetector.Data()));
    return;
  }
  double tocm = 0; // we want to have it in cm
  if (units.Contains("mm"))      tocm = 0.1;
  else if (units.Contains("cm")) tocm = 1.0;
  else if (units.Contains("m"))  tocm = 100.0;
  else if (units.Contains("pc")) tocm = 3.24078e-15;
  else {
    AliError(Form("unexpected units: %s",units.Data()));
    return;
  }
  if (!system.Contains("ALICEPH")) {
    AliError(Form("wrong system: %s, should be ALICEPH",system.Data()));
    return;
  }

  // for every survey point, decode the point name and store the numbers in 
  // the right place in the arrays fSurveyX etc.

  TObjArray *points = so->GetData();
  for (int ip = 0; ip<points->GetEntries(); ++ip) {
    AliSurveyPoint *po = (AliSurveyPoint *) points->At(ip);
    TString pna = po->GetPointName();
    Int_t i,j,k,l;
    if (DecodeSurveyPointName(pna,i,j,k,l)) {
      fSurveyX[i][j][k][l] = tocm*po->GetX();
      fSurveyY[i][j][k][l] = tocm*po->GetY();
      fSurveyZ[i][j][k][l] = tocm*po->GetZ();
      fSurveyEX[i][j][k][l] = po->GetPrecisionX()/10; // "precision" is supposed to be in mm
      fSurveyEY[i][j][k][l] = po->GetPrecisionY()/10;
      fSurveyEZ[i][j][k][l] = po->GetPrecisionZ()/10;
      printf("decoded %s %02d %d %d %d  %8.2f %8.2f %8.2f %6.2f %6.2f %6.2f\n", 
	     pna.Data(), i, j, k, l,
	     fSurveyX[i][j][k][l], fSurveyY[i][j][k][l], fSurveyZ[i][j][k][l],
	     fSurveyEX[i][j][k][l], fSurveyEY[i][j][k][l], fSurveyEZ[i][j][k][l]);
    } else AliError(Form("cannot decode point name: %s",pna.Data()));
  }

  TString info = "Survey "+title+" "+date+" "+url+" "+report+" "+version+" "+observations;
  info.ReplaceAll("\r","");
  fComment.SetString(info.Data());			 
}

//_____________________________________________________________________________
double AliTRDalignment::SurveyChi2(int i, const double * const a) {

  //
  // Compare the survey results to the ideal positions of the survey marks
  // in the local frame of supermodule. When transforming, use the alignment 
  // parameters a[6]. Return chi-squared.
  //

  if (!IsGeoLoaded()) return 0;
  printf("Survey of supermodule %d\n",i);
  AliAlignObjParams al(GetSmName(i),0,a[0],a[1],a[2],a[3],a[4],a[5],0);

  TGeoPNEntry      *pne  = gGeoManager->GetAlignableEntry(GetSmName(i));
  if (!pne) AliError(Form("no such physical node entry: %s",GetSmName(i)));
  TGeoPhysicalNode *node = pne->GetPhysicalNode();
  if (!node) {
    AliWarning(Form("physical node entry %s has no physical node; making a new one",GetSmName(i))); 
    node = gGeoManager->MakeAlignablePN(pne);
  }

  //  al.ApplyToGeometry();    
  //  node = pne->GetPhysicalNode(); // changed in the meantime
  //  TGeoHMatrix *ma = node->GetMatrix();

  // a less destructive method (it does not modify geometry), gives the same result:

  TGeoHMatrix *ma = new TGeoHMatrix();
  al.GetLocalMatrix(*ma);
  ma->MultiplyLeft(node->GetMatrix()); // global trafo, modified by a[]

  double chi2=0;
  printf("              sm   z   r  phi    x (lab phi)  y (lab z)   z (lab r)   all in cm\n");
  for (int j=0; j<2; j++) for (int k=0; k<2; k++) for (int l=0; l<2; l++) {
    if (fSurveyEX[i][j][k][l] == 0.0 
	&& fSurveyEY[i][j][k][l] == 0.0 
	&& fSurveyEZ[i][j][k][l] == 0.0) continue; // no data for this survey point
    double master[3] = {fSurveyX[i][j][k][l],fSurveyY[i][j][k][l],fSurveyZ[i][j][k][l]};
    double local[3];
    ma->MasterToLocal(master,local);
    double dx = local[0]-fSurveyX0[j][k][l];
    double dy = local[1]-fSurveyY0[j][k][l];
    double dz = local[2]-fSurveyZ0[j][k][l];
    chi2 += dx*dx/fSurveyEX[i][j][k][l]/fSurveyEX[i][j][k][l];
    chi2 += dy*dy/fSurveyEY[i][j][k][l]/fSurveyEY[i][j][k][l];
    chi2 += dz*dz/fSurveyEZ[i][j][k][l]/fSurveyEZ[i][j][k][l];
    printf("local survey %3d %3d %3d %3d %12.3f %12.3f %12.3f\n",i,j,k,l,local[0],local[1],local[2]);
    printf("local ideal                  %12.3f %12.3f %12.3f\n",fSurveyX0[j][k][l],
	   fSurveyY0[j][k][l],fSurveyZ0[j][k][l]);
    printf("difference                   %12.3f %12.3f %12.3f\n",dx,dy,dz);
  }
  printf("chi2 = %.2f\n",chi2);
  return chi2;
}

//_____________________________________________________________________________
void trdAlignmentFcn(int &npar, double *g, double &f, double *par, int iflag) {

  // 
  // Standard function as needed by Minuit-like minimization procedures. 
  // For the set of parameters par calculates and returns chi-squared.
  //

  // smuggle a C++ object into a C function
  AliTRDalignment *alignment = (AliTRDalignment*) gMinuit->GetObjectFit(); 

  f = alignment->SurveyChi2(par);
  if (iflag==3) {}
  if (npar) {} 
  if (g) {} // no warnings about unused stuff...

}

//_____________________________________________________________________________
void AliTRDalignment::SurveyToAlignment(int i, const char * const flag) {

  //
  // Find the supermodule alignment parameters needed to make the survey 
  // results coincide with the ideal positions of the survey marks.
  // The string flag should look like "101000"; the six characters corresponds 
  // to the six alignment parameters and 0/1 mean that the parameter should 
  // be fixed/released in the fit. 

  if (strlen(flag)!=6) {
    AliError(Form("unexpected flag: %s",flag));
    return;
  }

  printf("Finding alignment matrix for supermodule %d\n",i);
  fIbuffer[0] = i; // store the sm number in the buffer so minuit can see it

  TFitter fitter(100);
  gMinuit->SetObjectFit(this);
  fitter.SetFCN(trdAlignmentFcn);
  fitter.SetParameter(0,"dx",0,0.5,0,0);
  fitter.SetParameter(1,"dy",0,0.5,0,0);
  fitter.SetParameter(2,"dz",0,0.5,0,0);
  fitter.SetParameter(3,"rx",0,0.1,0,0);
  fitter.SetParameter(4,"ry",0,0.1,0,0);
  fitter.SetParameter(5,"rz",0,0.1,0,0);

  for (int j=0; j<6; j++) if (flag[j]=='0') fitter.FixParameter(j);

  double arglist[100];
  arglist[0] = 2;
  fitter.ExecuteCommand("SET PRINT", arglist, 1);
  fitter.ExecuteCommand("SET ERR", arglist, 1);
  arglist[0]=50;
  //fitter.ExecuteCommand("SIMPLEX", arglist, 1);
  fitter.ExecuteCommand("MINIMIZE", arglist, 1);
  fitter.ExecuteCommand("CALL 3", arglist,0);
  double a[6];
  for (int j=0; j<6; j++) a[j] = fitter.GetParameter(j);
  SetSm(i,a);
  for (int j=0; j<6; j++) printf("%10.3f ",fitter.GetParameter(j));   
  printf("\n");
  for (int j=0; j<6; j++) printf("%10.3f ",fitter.GetParError(j));
  printf("\n");

}

//_____________________________________________________________________________
void AliTRDalignment::ReadAny(const char * const filename) 
{
  //
  // read the alignment data from any kind of file
  //

  TString fist(filename);
  if (fist.EndsWith(".txt")) ReadAscii(filename);
  if (fist.EndsWith(".dat")) ReadAscii(filename);
  if (fist.EndsWith(".root")) {
    if (fist.Contains("Run")) ReadDB(filename);
    else ReadRoot(filename);
  }

}

//_____________________________________________________________________________
void AliTRDalignment::WriteAscii(const char * const filename) const
{
  //
  // store the alignment data on ascii file
  //

  FILE *fp = fopen(filename, "w");
  if (!fp) {
    AliError(Form("cannot open output file %s",filename));
    return;
  }

  PrintSm(fp);
  PrintCh(fp);
  
  fclose(fp);

}

//_____________________________________________________________________________
void AliTRDalignment::WriteRoot(const char * const filename) 
{
  //
  // store the alignment data on root file
  //

  TClonesArray *ar = new TClonesArray("AliAlignObjParams",10000);
  NumbersToAr(ar);
  TFile fo(filename,"RECREATE");
  if (fo.IsOpen()) {
    fo.cd();
    fo.WriteObject(ar,"TRDAlignObjs","kSingleKey");
    fo.Close();
  } 
  else AliError(Form("cannot open output file %s",filename));

  delete ar;

}

//_____________________________________________________________________________
void AliTRDalignment::WriteDB(const char * const filename, int run0, int run1, int ver, int subver) 
{
  //
  // dumping on a DB-like file
  //

  TClonesArray   *ar = new TClonesArray("AliAlignObjParams",10000);
  NumbersToAr(ar);
  const Char_t *path = "TRD/Align/Data";
  AliCDBId id(path,run0,run1);
  AliCDBMetaData *md = new AliCDBMetaData();
  md->SetResponsible("Dariusz Miskowiec");
  md->SetComment(fComment.GetString().Data());
  AliCDBEntry *e  = new AliCDBEntry(ar, id, md);
  e->SetVersion(ver);
  e->SetSubVersion(subver);
  TFile fi(filename,"RECREATE");
  if (fi.IsOpen()) {
    e->Write();
    fi.Close();
  } 
  else AliError(Form("cannot open input file %s",filename));

  delete e;
  delete md;
  delete ar;

  return;

}

//_____________________________________________________________________________
void AliTRDalignment::WriteDB(char * const db, const char * const path, int run0, int run1) 
{
  //
  // store the alignment data in database
  //

  TClonesArray   *ar      = new TClonesArray("AliAlignObjParams",10000);
  NumbersToAr(ar);
  AliCDBManager  *cdb     = AliCDBManager::Instance();
  AliCDBStorage  *storLoc = cdb->GetStorage(db);
  AliCDBMetaData *md      = new AliCDBMetaData();
  md->SetResponsible("Dariusz Miskowiec");
  md->SetComment(fComment.GetString().Data());
  AliCDBId id(path,run0,run1);
  storLoc->Put(ar,id,md);
  md->Delete();
  delete ar;

}

//_____________________________________________________________________________
void AliTRDalignment::WriteGeo(char *filename) 
{
  //
  // apply misalignment to current geometry and store the 
  // resulting geometry on a root file
  //

  TClonesArray *ar = new TClonesArray("AliAlignObjParams",10000);
  NumbersToAr(ar);
  delete ar;
  gGeoManager->Export(filename);

}

//_____________________________________________________________________________
double AliTRDalignment::GetSmRMS(int xyz) const 
{
  //
  // rms fSm[][xyz]
  //

  double s1 = 0.0;
  double s2 = 0.0;
  for (int i = 0; i < 18; i++) {
    s1 += fSm[i][xyz];
    s2 += fSm[i][xyz]*fSm[i][xyz];
  }
  double rms2 = s2/18.0 - s1*s1/18.0/18.0;

  return rms2>0 ? sqrt(rms2) : 0.0;

}

//_____________________________________________________________________________
double AliTRDalignment::GetChRMS(int xyz) const
{
  //
  // rms fCh[][xyz]
  //

  double s1 =0.0;
  double s2 =0.0;
  for (int i = 0; i < 540; i++) {
    s1 += fCh[i][xyz];
    s2 += fCh[i][xyz]*fCh[i][xyz];
  }
  double rms2 = s2/540.0 - s1*s1/540.0/540.0;

  return rms2>0 ? sqrt(rms2) : 0.0;

}

//_____________________________________________________________________________
void AliTRDalignment::PrintSmRMS() const
{
  //
  // dump rms of fSm
  //

  printf("       %11.4f %11.4f  %11.4f      %11.5f  %11.5f  %11.5f  supermodule rms\n"
	,GetSmRMS(0),GetSmRMS(1),GetSmRMS(2),GetSmRMS(3),GetSmRMS(4),GetSmRMS(5));

}

//_____________________________________________________________________________
void AliTRDalignment::PrintChRMS() const
{
  //
  // dump rms of fCh
  //

  printf("       %11.4f %11.4f  %11.4f      %11.5f  %11.5f  %11.5f  chamber rms\n"
	,GetChRMS(0),GetChRMS(1),GetChRMS(2),GetChRMS(3),GetChRMS(4),GetChRMS(5));

}

//_____________________________________________________________________________
void AliTRDalignment::ArToNumbers(TClonesArray * const ar) 
{
  //
  // for each of the alignment objects in array ar extract the six local 
  // alignment parameters; recognize by name to which supermodule or chamber 
  // the alignment object pertains; set the respective fSm or fCh
  //

  ar->Sort();
  if (!IsGeoLoaded()) return;
  for (int i = 0; i < ar->GetEntries(); i++) {
    AliAlignObj *aao = (AliAlignObj *) ar->At(i);
    aao->ApplyToGeometry();
  }
  SetZero();
  ReadCurrentGeo();

}

//_____________________________________________________________________________
void AliTRDalignment::NumbersToAr(TClonesArray * const ar) 
{
  //
  // build array of AliAlignObj objects based on fSm and fCh data
  // at the same time, apply misalignment to the currently loaded geometry
  // it is important to apply misalignment of supermodules before creating 
  // alignment objects for chambers
  //

  if (!IsGeoLoaded()) return;
  TClonesArray &alobj = *ar;
  int nobj = 0;
  for (int i = 0; i <  18; i++) {      
      new(alobj[nobj]) AliAlignObjParams(GetSmName(i)
                                        ,0 
					,fSm[i][0],fSm[i][1],fSm[i][2]
					,fSm[i][3],fSm[i][4],fSm[i][5]
					,0);
    ((AliAlignObj *) alobj[nobj])->ApplyToGeometry();
    nobj++;
  }

  for (int i = 0; i < 540; i++) {
    if (gGeoManager->GetAlignableEntry(GetChName(i))) {
      new(alobj[nobj]) AliAlignObjParams(GetChName(i)
					 ,GetVoi(i)
					 ,fCh[i][0],fCh[i][1],fCh[i][2]
					 ,fCh[i][3],fCh[i][4],fCh[i][5]
					 ,0);
      ((AliAlignObj *) alobj[nobj])->ApplyToGeometry();
      nobj++;
    }
  }
  AliInfo("current geometry modified");

}

//_____________________________________________________________________________
int AliTRDalignment::IsGeoLoaded() 
{
  //
  // check whether a geometry is loaded
  // issue a warning if geometry is not ideal
  //

  if (gGeoManager) {
    if (gGeoManager->GetListOfPhysicalNodes()->GetEntries()) AliWarning("current geometry is not ideal");
    return 1;
  } else {
    AliError("first load geometry by calling TGeoManager::Import(filename)");
    return 0;
  }

}

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