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

/*
$Log$
Revision 1.3  2007/10/22 14:20:25  kowal2
Hardwired "ideal" coordinates replaced with those from the DCDB.
Corrected bug in SetDebug method

Revision 1.2  2007/10/03 09:27:50  marian
Extra semicolon removed (Marian)

Revision 1.1  2007/10/01 14:12:45  kowal2
Class creating the aligmnent object fro the surveyor measurements.

*/ 

//
//  Creates the TPC align object
//

#include "AliTPCAlign.h"
#include "AliSurveyPoint.h"
#include "AliSurveyPoint.h"
//
#include "TROOT.h"
#include "Riostream.h"
#include "TFile.h"
#include "TMath.h"
#include "TSystem.h"
#include "AliSurveyObj.h"
#include "AliSurveyPoint.h"
#include "AliAlignObjParams.h"
#include "AliCDBStorage.h"
#include <TClonesArray.h>
#include <TFile.h>
#include "AliLog.h"
#include "AliCDBManager.h"

using std::cout;
using std::endl;
ClassImp(AliTPCAlign)

AliTPCAlign::AliTPCAlign() :
  TObject(),
  fFileLoc(0x0),
  fFileGlob(0x0),
  fTPCAlignObj(0x0),
  fX(),
  fA(),
  fY(),
  fDebug(0)
{
  //
  //  default constructor
  //
}   
//________________________________________________________________________
AliTPCAlign::AliTPCAlign(Int_t reportloc, Int_t reportglob) :
  TObject(),
  fFileLoc(0x0),
  fFileGlob(0x0),
  fTPCAlignObj(0x0),
  fX(6,1),
  fA(24,6),
  fY(24,1),
  fDebug(0)
{
  //
  // constructor - defines data files
  //
  fFileLoc = new Char_t[80];
  fFileGlob = new Char_t[80];
  Char_t path[50];
  //sprintf(path,gSystem->Getenv("ALICE_ROOT")); 
  snprintf(path,50,"%s",gSystem->Getenv("ALICE_ROOT"));
  //
  //sprintf(fFileLoc,"%s/TPC/Survey_%d_TPC.txt",path,reportloc);
  snprintf(fFileLoc,80,"%s/TPC/Survey_%d_TPC.txt",path,reportloc);
  //sprintf(fFileGlob,"%s/TPC/Survey_%d_TPC.txt",path,reportglob);
  snprintf(fFileGlob,80,"%s/TPC/Survey_%d_TPC.txt",path,reportglob);
  //

}
//_________________________________________________________________________
AliTPCAlign::AliTPCAlign(const AliTPCAlign &align) :
  TObject(),
  fFileLoc(0x0),
  fFileGlob(0x0),
  fTPCAlignObj(0x0),
  fX(),
  fA(),
  fY(),
  fDebug(0)
{
  //
  //  copy constructor - dummy
  //
  fDebug = align.fDebug;
}
//__________________________________________________________________________
AliTPCAlign & AliTPCAlign::operator =(const AliTPCAlign & align)
{
  //
  // assignment operator - dummy
  //
  if(this!=&align){
    fDebug=align.fDebug;
  }
  return (*this);
}

//__________________________________________________________________________
AliTPCAlign::~AliTPCAlign(){
  //
  // destructor
  //
  if(fTPCAlignObj) delete fTPCAlignObj;
}
//__________________________________________________________________________
Bool_t AliTPCAlign::LoadSurveyData(){
  //
  // for a time being it loads from the local file the surveyed point
  // and has the ideal points hardwired. I am waiting until Ricardo
  // completes his job
  // 

 AliSurveyObj * s1 = new AliSurveyObj();
 s1->FillFromLocalFile(fFileGlob);
 //
 Int_t numberPoints = 8;
 //
 TString pointNames[8] = {"T1Final_R04241","T1Final_R05241","T1Final_R06241",
                          "T1Final_R07241","T1Final_R08241","T1Final_R10241",
                          "T1Final_R11241","T1Final_R12241"};
 //
 Float_t surveyedPoints[8][3];
 AliSurveyPoint *currPoint;
 //
 for(Int_t i=0;i<numberPoints;i++){
   currPoint=0;
   currPoint = (AliSurveyPoint *) s1->GetData()->FindObject(pointNames[i]);
   //
   if(currPoint){
     surveyedPoints[i][0]=currPoint->GetX();
     surveyedPoints[i][1]=currPoint->GetY();
     surveyedPoints[i][2]=currPoint->GetZ();
     if(fDebug)
     Printf("INFO: Point \"%s\" coordinates read.", pointNames[i].Data());
   }
   else {
     if(fDebug){
    Printf("ERROR: Essential point missing: \"%s\"", pointNames[i].Data());
    return 1;
     }
   }  
 }
 //
 //  Ideal points
 //
 Float_t idealPoints[8][3];
 //
 AliSurveyObj * s2 = new AliSurveyObj();
 s2->FillFromLocalFile(fFileLoc);
 //
 TString pointNamesL[8] ={"R04","R05","R06","R07","R08","R10","R11","R12"};
 //
  AliSurveyPoint *currPointL;
  //
 for(Int_t i=0;i<numberPoints;i++){
   currPointL=0;
   currPointL = (AliSurveyPoint *) s2->GetData()->FindObject(pointNamesL[i]);
   if(currPointL){
     idealPoints[i][0]=currPointL->GetY();
     idealPoints[i][1]=currPointL->GetZ();
     idealPoints[i][2]=currPointL->GetX();
          if(fDebug)
     Printf("INFO: Point \"%s\" coordinates read.", pointNamesL[i].Data());
   }
   else{
     if(fDebug){
    Printf("ERROR: Essential point missing: \"%s\"", pointNamesL[i].Data());
    return 1; }
   }
 }
 //
 // Create and fill matrices a & y
 //
 for(Int_t i = 0;i<numberPoints;i++){
   for(Int_t j=0;j<3;j++){
     fY(i*3+j,0)=surveyedPoints[i][j]-idealPoints[i][j];

   }
 }
 fA.Zero(); 
 //
 //
 // setting matrix a
 //
 for(Int_t i=0;i<numberPoints;i++){
   fA(3*i,0)=    -idealPoints[i][1];
   fA(3*i,1)=    idealPoints[i][2];
   fA(3*i,3)=1.; 
   fA(3*i+1,0)=    idealPoints[i][0];
   fA(3*i+1,2)=    -idealPoints[i][2];
   fA(3*i+1,4)=    1.;
   fA(3*i+2,1)=   -idealPoints[i][0];
   fA(3*i+2,2)=   idealPoints[i][1];
   fA(3*i+2,5)=1.; 
 }
 //
 delete s1;
 //
 return 0;
}
//_________________________________________________________________
Double_t AliTPCAlign::ComputeTransform(){
  //
  // Here simple matrix operations for the linear least square
  // The trigonometric function sin is approximated by the angle
  // and the cos by "1", because angles are very small (Y-convention!)
  // This secures the linearity of the problem
  // This method returns a sum of squares of residuals
  //
  TMatrixD tt1(TMatrixD::kInverted,(TMatrixD(fA,TMatrixD::kTransposeMult,fA)));
  fX=TMatrixD(tt1,TMatrixD::kMult,TMatrixD(fA,TMatrixD::kTransposeMult,fY));
  //
 TMatrixD Unit(24,24);
 Unit.UnitMatrix();
 TMatrixD xxt1(TMatrixD::kInverted,TMatrixD(fA,TMatrixD::kTransposeMult,fA));
 TMatrixD t(fA,TMatrixD::kMult,TMatrixD(xxt1,TMatrixD::kMultTranspose,fA));
 TMatrixD t2(Unit,TMatrixD::kMinus,t);
 TMatrixD chi2(fY,TMatrixD::kTransposeMult,TMatrixD(t2,TMatrixD::kMult,fY));
 //

 return chi2(0,0);
 	    
}
//_______________________________________________________________________
void AliTPCAlign::CreateAlignObj(){
  //
  // This method creates AliAlignObj and fills it with Euler angles
  // and shifts. The units are degrees and cm.
  // 
 fTPCAlignObj = new AliAlignObjParams();
 fTPCAlignObj->SetSymName("ALIC_1/TPC_M_1");
 fTPCAlignObj->SetVolUID(0);
 Double_t raddeg = TMath::RadToDeg();
 Double_t phi,theta,psi;
 //
 phi=fX(0,0)*raddeg;
 theta=fX(1,0)*raddeg;
 psi=fX(2,0)*raddeg;
 //
 Double_t dx,dy,dz;
 dx=fX(3,0)*100.;
 dy=fX(4,0)*100.;
 dz=fX(5,0)*100.;
 fTPCAlignObj->SetRotation(psi,theta,phi);
 fTPCAlignObj->SetTranslation(dx,dy,dz);
 fTPCAlignObj->Print("");
}
//______________________________________________________________________
void AliTPCAlign::Run(){
  //
  // runs the full chain
  //
  SetDebug(0);
  Bool_t flag = LoadSurveyData();
  if(flag) {
    cout<<"Missing points"<<endl;
    return;
  }
  Double_t chi2 = ComputeTransform();
  if(chi2>0.01) return;
  CreateAlignObj();
  StoreAlignObj();
  //
}
//_________________________________________________________________________
void AliTPCAlign::StoreAlignObj(){
  //
AliCDBManager* cdb = AliCDBManager::Instance();
 if(!cdb->IsDefaultStorageSet()) cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
 //
TClonesArray *array = new TClonesArray("AliAlignObjParams",1);
//
 Double_t shifts[3];
 Double_t rots[3];
 //
 fTPCAlignObj->GetPars(shifts,rots);
 new((*array)[0]) AliAlignObjParams(fTPCAlignObj->GetSymName(),0,shifts[0],
                   shifts[1],shifts[2],rots[0],rots[1],rots[2],kTRUE);

//
// storing either in the OCDB or local file
//
  if( TString(gSystem->Getenv("TOCDB")) != TString("kTRUE") ){
    // save on file
    const char* filename = "TPCSurveyMisalignment.root";
    Char_t fullname[80];
    //sprintf(fullname,"%s/TPC/%s",gSystem->Getenv("ALICE_ROOT"),filename);
    snprintf(fullname,80,"%s/TPC/%s",gSystem->Getenv("ALICE_ROOT"),filename);
    TFile *f = new TFile(fullname,"RECREATE");
    if(!f){
      AliError("cannot open file for output\n");
      return;
    }
    AliInfo(Form("Saving alignment objects to the file %s", filename));
    f->cd();
    f->WriteObject(array,"TPCAlignObjs","kSingleKey");
    f->Close();
  }else{
    // save in CDB storage
    AliCDBStorage* storage;
    //
   TString Storage = gSystem->Getenv("STORAGE");
    if(!Storage.BeginsWith("local://") && !Storage.BeginsWith("alien://")) {
      AliError(Form(
      "STORAGE variable set to %s is not valid. Exiting\n",Storage.Data()));
      return;
    }
    storage = cdb->GetStorage(Storage.Data());
    if(!storage){
      AliError(Form("Unable to open storage %s\n",Storage.Data()));
      return;
    }
    //
    AliCDBMetaData* md = new AliCDBMetaData();
    md->SetResponsible("Marek Kowalski");
    md->SetComment("Full misalignment of entire TPC from surveyors");
    AliCDBId id("TPC/Align/Data",0,AliCDBRunRange::Infinity());
    storage->Put(array,id,md);
  }

}
 AliTPCAlign.cxx:1
 AliTPCAlign.cxx:2
 AliTPCAlign.cxx:3
 AliTPCAlign.cxx:4
 AliTPCAlign.cxx:5
 AliTPCAlign.cxx:6
 AliTPCAlign.cxx:7
 AliTPCAlign.cxx:8
 AliTPCAlign.cxx:9
 AliTPCAlign.cxx:10
 AliTPCAlign.cxx:11
 AliTPCAlign.cxx:12
 AliTPCAlign.cxx:13
 AliTPCAlign.cxx:14
 AliTPCAlign.cxx:15
 AliTPCAlign.cxx:16
 AliTPCAlign.cxx:17
 AliTPCAlign.cxx:18
 AliTPCAlign.cxx:19
 AliTPCAlign.cxx:20
 AliTPCAlign.cxx:21
 AliTPCAlign.cxx:22
 AliTPCAlign.cxx:23
 AliTPCAlign.cxx:24
 AliTPCAlign.cxx:25
 AliTPCAlign.cxx:26
 AliTPCAlign.cxx:27
 AliTPCAlign.cxx:28
 AliTPCAlign.cxx:29
 AliTPCAlign.cxx:30
 AliTPCAlign.cxx:31
 AliTPCAlign.cxx:32
 AliTPCAlign.cxx:33
 AliTPCAlign.cxx:34
 AliTPCAlign.cxx:35
 AliTPCAlign.cxx:36
 AliTPCAlign.cxx:37
 AliTPCAlign.cxx:38
 AliTPCAlign.cxx:39
 AliTPCAlign.cxx:40
 AliTPCAlign.cxx:41
 AliTPCAlign.cxx:42
 AliTPCAlign.cxx:43
 AliTPCAlign.cxx:44
 AliTPCAlign.cxx:45
 AliTPCAlign.cxx:46
 AliTPCAlign.cxx:47
 AliTPCAlign.cxx:48
 AliTPCAlign.cxx:49
 AliTPCAlign.cxx:50
 AliTPCAlign.cxx:51
 AliTPCAlign.cxx:52
 AliTPCAlign.cxx:53
 AliTPCAlign.cxx:54
 AliTPCAlign.cxx:55
 AliTPCAlign.cxx:56
 AliTPCAlign.cxx:57
 AliTPCAlign.cxx:58
 AliTPCAlign.cxx:59
 AliTPCAlign.cxx:60
 AliTPCAlign.cxx:61
 AliTPCAlign.cxx:62
 AliTPCAlign.cxx:63
 AliTPCAlign.cxx:64
 AliTPCAlign.cxx:65
 AliTPCAlign.cxx:66
 AliTPCAlign.cxx:67
 AliTPCAlign.cxx:68
 AliTPCAlign.cxx:69
 AliTPCAlign.cxx:70
 AliTPCAlign.cxx:71
 AliTPCAlign.cxx:72
 AliTPCAlign.cxx:73
 AliTPCAlign.cxx:74
 AliTPCAlign.cxx:75
 AliTPCAlign.cxx:76
 AliTPCAlign.cxx:77
 AliTPCAlign.cxx:78
 AliTPCAlign.cxx:79
 AliTPCAlign.cxx:80
 AliTPCAlign.cxx:81
 AliTPCAlign.cxx:82
 AliTPCAlign.cxx:83
 AliTPCAlign.cxx:84
 AliTPCAlign.cxx:85
 AliTPCAlign.cxx:86
 AliTPCAlign.cxx:87
 AliTPCAlign.cxx:88
 AliTPCAlign.cxx:89
 AliTPCAlign.cxx:90
 AliTPCAlign.cxx:91
 AliTPCAlign.cxx:92
 AliTPCAlign.cxx:93
 AliTPCAlign.cxx:94
 AliTPCAlign.cxx:95
 AliTPCAlign.cxx:96
 AliTPCAlign.cxx:97
 AliTPCAlign.cxx:98
 AliTPCAlign.cxx:99
 AliTPCAlign.cxx:100
 AliTPCAlign.cxx:101
 AliTPCAlign.cxx:102
 AliTPCAlign.cxx:103
 AliTPCAlign.cxx:104
 AliTPCAlign.cxx:105
 AliTPCAlign.cxx:106
 AliTPCAlign.cxx:107
 AliTPCAlign.cxx:108
 AliTPCAlign.cxx:109
 AliTPCAlign.cxx:110
 AliTPCAlign.cxx:111
 AliTPCAlign.cxx:112
 AliTPCAlign.cxx:113
 AliTPCAlign.cxx:114
 AliTPCAlign.cxx:115
 AliTPCAlign.cxx:116
 AliTPCAlign.cxx:117
 AliTPCAlign.cxx:118
 AliTPCAlign.cxx:119
 AliTPCAlign.cxx:120
 AliTPCAlign.cxx:121
 AliTPCAlign.cxx:122
 AliTPCAlign.cxx:123
 AliTPCAlign.cxx:124
 AliTPCAlign.cxx:125
 AliTPCAlign.cxx:126
 AliTPCAlign.cxx:127
 AliTPCAlign.cxx:128
 AliTPCAlign.cxx:129
 AliTPCAlign.cxx:130
 AliTPCAlign.cxx:131
 AliTPCAlign.cxx:132
 AliTPCAlign.cxx:133
 AliTPCAlign.cxx:134
 AliTPCAlign.cxx:135
 AliTPCAlign.cxx:136
 AliTPCAlign.cxx:137
 AliTPCAlign.cxx:138
 AliTPCAlign.cxx:139
 AliTPCAlign.cxx:140
 AliTPCAlign.cxx:141
 AliTPCAlign.cxx:142
 AliTPCAlign.cxx:143
 AliTPCAlign.cxx:144
 AliTPCAlign.cxx:145
 AliTPCAlign.cxx:146
 AliTPCAlign.cxx:147
 AliTPCAlign.cxx:148
 AliTPCAlign.cxx:149
 AliTPCAlign.cxx:150
 AliTPCAlign.cxx:151
 AliTPCAlign.cxx:152
 AliTPCAlign.cxx:153
 AliTPCAlign.cxx:154
 AliTPCAlign.cxx:155
 AliTPCAlign.cxx:156
 AliTPCAlign.cxx:157
 AliTPCAlign.cxx:158
 AliTPCAlign.cxx:159
 AliTPCAlign.cxx:160
 AliTPCAlign.cxx:161
 AliTPCAlign.cxx:162
 AliTPCAlign.cxx:163
 AliTPCAlign.cxx:164
 AliTPCAlign.cxx:165
 AliTPCAlign.cxx:166
 AliTPCAlign.cxx:167
 AliTPCAlign.cxx:168
 AliTPCAlign.cxx:169
 AliTPCAlign.cxx:170
 AliTPCAlign.cxx:171
 AliTPCAlign.cxx:172
 AliTPCAlign.cxx:173
 AliTPCAlign.cxx:174
 AliTPCAlign.cxx:175
 AliTPCAlign.cxx:176
 AliTPCAlign.cxx:177
 AliTPCAlign.cxx:178
 AliTPCAlign.cxx:179
 AliTPCAlign.cxx:180
 AliTPCAlign.cxx:181
 AliTPCAlign.cxx:182
 AliTPCAlign.cxx:183
 AliTPCAlign.cxx:184
 AliTPCAlign.cxx:185
 AliTPCAlign.cxx:186
 AliTPCAlign.cxx:187
 AliTPCAlign.cxx:188
 AliTPCAlign.cxx:189
 AliTPCAlign.cxx:190
 AliTPCAlign.cxx:191
 AliTPCAlign.cxx:192
 AliTPCAlign.cxx:193
 AliTPCAlign.cxx:194
 AliTPCAlign.cxx:195
 AliTPCAlign.cxx:196
 AliTPCAlign.cxx:197
 AliTPCAlign.cxx:198
 AliTPCAlign.cxx:199
 AliTPCAlign.cxx:200
 AliTPCAlign.cxx:201
 AliTPCAlign.cxx:202
 AliTPCAlign.cxx:203
 AliTPCAlign.cxx:204
 AliTPCAlign.cxx:205
 AliTPCAlign.cxx:206
 AliTPCAlign.cxx:207
 AliTPCAlign.cxx:208
 AliTPCAlign.cxx:209
 AliTPCAlign.cxx:210
 AliTPCAlign.cxx:211
 AliTPCAlign.cxx:212
 AliTPCAlign.cxx:213
 AliTPCAlign.cxx:214
 AliTPCAlign.cxx:215
 AliTPCAlign.cxx:216
 AliTPCAlign.cxx:217
 AliTPCAlign.cxx:218
 AliTPCAlign.cxx:219
 AliTPCAlign.cxx:220
 AliTPCAlign.cxx:221
 AliTPCAlign.cxx:222
 AliTPCAlign.cxx:223
 AliTPCAlign.cxx:224
 AliTPCAlign.cxx:225
 AliTPCAlign.cxx:226
 AliTPCAlign.cxx:227
 AliTPCAlign.cxx:228
 AliTPCAlign.cxx:229
 AliTPCAlign.cxx:230
 AliTPCAlign.cxx:231
 AliTPCAlign.cxx:232
 AliTPCAlign.cxx:233
 AliTPCAlign.cxx:234
 AliTPCAlign.cxx:235
 AliTPCAlign.cxx:236
 AliTPCAlign.cxx:237
 AliTPCAlign.cxx:238
 AliTPCAlign.cxx:239
 AliTPCAlign.cxx:240
 AliTPCAlign.cxx:241
 AliTPCAlign.cxx:242
 AliTPCAlign.cxx:243
 AliTPCAlign.cxx:244
 AliTPCAlign.cxx:245
 AliTPCAlign.cxx:246
 AliTPCAlign.cxx:247
 AliTPCAlign.cxx:248
 AliTPCAlign.cxx:249
 AliTPCAlign.cxx:250
 AliTPCAlign.cxx:251
 AliTPCAlign.cxx:252
 AliTPCAlign.cxx:253
 AliTPCAlign.cxx:254
 AliTPCAlign.cxx:255
 AliTPCAlign.cxx:256
 AliTPCAlign.cxx:257
 AliTPCAlign.cxx:258
 AliTPCAlign.cxx:259
 AliTPCAlign.cxx:260
 AliTPCAlign.cxx:261
 AliTPCAlign.cxx:262
 AliTPCAlign.cxx:263
 AliTPCAlign.cxx:264
 AliTPCAlign.cxx:265
 AliTPCAlign.cxx:266
 AliTPCAlign.cxx:267
 AliTPCAlign.cxx:268
 AliTPCAlign.cxx:269
 AliTPCAlign.cxx:270
 AliTPCAlign.cxx:271
 AliTPCAlign.cxx:272
 AliTPCAlign.cxx:273
 AliTPCAlign.cxx:274
 AliTPCAlign.cxx:275
 AliTPCAlign.cxx:276
 AliTPCAlign.cxx:277
 AliTPCAlign.cxx:278
 AliTPCAlign.cxx:279
 AliTPCAlign.cxx:280
 AliTPCAlign.cxx:281
 AliTPCAlign.cxx:282
 AliTPCAlign.cxx:283
 AliTPCAlign.cxx:284
 AliTPCAlign.cxx:285
 AliTPCAlign.cxx:286
 AliTPCAlign.cxx:287
 AliTPCAlign.cxx:288
 AliTPCAlign.cxx:289
 AliTPCAlign.cxx:290
 AliTPCAlign.cxx:291
 AliTPCAlign.cxx:292
 AliTPCAlign.cxx:293
 AliTPCAlign.cxx:294
 AliTPCAlign.cxx:295
 AliTPCAlign.cxx:296
 AliTPCAlign.cxx:297
 AliTPCAlign.cxx:298
 AliTPCAlign.cxx:299
 AliTPCAlign.cxx:300
 AliTPCAlign.cxx:301
 AliTPCAlign.cxx:302
 AliTPCAlign.cxx:303
 AliTPCAlign.cxx:304
 AliTPCAlign.cxx:305
 AliTPCAlign.cxx:306
 AliTPCAlign.cxx:307
 AliTPCAlign.cxx:308
 AliTPCAlign.cxx:309
 AliTPCAlign.cxx:310
 AliTPCAlign.cxx:311
 AliTPCAlign.cxx:312
 AliTPCAlign.cxx:313
 AliTPCAlign.cxx:314
 AliTPCAlign.cxx:315
 AliTPCAlign.cxx:316
 AliTPCAlign.cxx:317
 AliTPCAlign.cxx:318
 AliTPCAlign.cxx:319
 AliTPCAlign.cxx:320
 AliTPCAlign.cxx:321
 AliTPCAlign.cxx:322
 AliTPCAlign.cxx:323
 AliTPCAlign.cxx:324
 AliTPCAlign.cxx:325
 AliTPCAlign.cxx:326
 AliTPCAlign.cxx:327
 AliTPCAlign.cxx:328
 AliTPCAlign.cxx:329
 AliTPCAlign.cxx:330
 AliTPCAlign.cxx:331
 AliTPCAlign.cxx:332
 AliTPCAlign.cxx:333
 AliTPCAlign.cxx:334
 AliTPCAlign.cxx:335
 AliTPCAlign.cxx:336
 AliTPCAlign.cxx:337
 AliTPCAlign.cxx:338
 AliTPCAlign.cxx:339
 AliTPCAlign.cxx:340
 AliTPCAlign.cxx:341
 AliTPCAlign.cxx:342
 AliTPCAlign.cxx:343
 AliTPCAlign.cxx:344
 AliTPCAlign.cxx:345
 AliTPCAlign.cxx:346
 AliTPCAlign.cxx:347
 AliTPCAlign.cxx:348