AliRoot Core  a565103 (a565103)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AliTPCAlign.cxx
Go to the documentation of this file.
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  * *
4  * Author: The ALICE Off-line Project. *
5  * Contributors are mentioned in the code where appropriate. *
6  * *
7  * Permission to use, copy, modify and distribute this software and its *
8  * documentation strictly for non-commercial purposes is hereby granted *
9  * without fee, provided that the above copyright notice appears in all *
10  * copies and that both the copyright notice and this permission notice *
11  * appear in the supporting documentation. The authors make no claims *
12  * about the suitability of this software for any purpose. It is *
13  * provided "as is" without express or implied warranty. *
14  **************************************************************************/
15 
16 /*
17 $Log$
18 Revision 1.3 2007/10/22 14:20:25 kowal2
19 Hardwired "ideal" coordinates replaced with those from the DCDB.
20 Corrected bug in SetDebug method
21 
22 Revision 1.2 2007/10/03 09:27:50 marian
23 Extra semicolon removed (Marian)
24 
25 Revision 1.1 2007/10/01 14:12:45 kowal2
26 Class creating the aligmnent object fro the surveyor measurements.
27 
28 */
29 
30 //
31 // Creates the TPC align object
32 //
33 
34 #include "AliTPCAlign.h"
35 #include "AliSurveyPoint.h"
36 #include "AliSurveyPoint.h"
37 //
38 #include "TROOT.h"
39 #include "Riostream.h"
40 #include "TFile.h"
41 #include "TMath.h"
42 #include "TSystem.h"
43 #include "AliSurveyObj.h"
44 #include "AliSurveyPoint.h"
45 #include "AliAlignObjParams.h"
46 #include "AliCDBStorage.h"
47 #include <TClonesArray.h>
48 #include <TFile.h>
49 #include "AliLog.h"
50 #include "AliCDBManager.h"
51 
52 using std::cout;
53 using std::endl;
55 
57  TObject(),
58  fFileLoc(0x0),
59  fFileGlob(0x0),
60  fTPCAlignObj(0x0),
61  fX(),
62  fA(),
63  fY(),
64  fDebug(0)
65 {
66  //
67  // default constructor
68  //
69 }
70 //________________________________________________________________________
71 AliTPCAlign::AliTPCAlign(Int_t reportloc, Int_t reportglob) :
72  TObject(),
73  fFileLoc(0x0),
74  fFileGlob(0x0),
75  fTPCAlignObj(0x0),
76  fX(6,1),
77  fA(24,6),
78  fY(24,1),
79  fDebug(0)
80 {
81  //
82  // constructor - defines data files
83  //
84  fFileLoc = new Char_t[80];
85  fFileGlob = new Char_t[80];
86  Char_t path[50];
87  //sprintf(path,gSystem->Getenv("ALICE_ROOT"));
88  snprintf(path,50,"%s",gSystem->Getenv("ALICE_ROOT"));
89  //
90  //sprintf(fFileLoc,"%s/TPC/Survey_%d_TPC.txt",path,reportloc);
91  snprintf(fFileLoc,80,"%s/TPC/Survey_%d_TPC.txt",path,reportloc);
92  //sprintf(fFileGlob,"%s/TPC/Survey_%d_TPC.txt",path,reportglob);
93  snprintf(fFileGlob,80,"%s/TPC/Survey_%d_TPC.txt",path,reportglob);
94  //
95 
96 }
97 //_________________________________________________________________________
99  TObject(),
100  fFileLoc(0x0),
101  fFileGlob(0x0),
102  fTPCAlignObj(0x0),
103  fX(),
104  fA(),
105  fY(),
106  fDebug(0)
107 {
108  //
109  // copy constructor - dummy
110  //
111  fDebug = align.fDebug;
112 }
113 //__________________________________________________________________________
115 {
116  //
117  // assignment operator - dummy
118  //
119  if(this!=&align){
120  fDebug=align.fDebug;
121  }
122  return (*this);
123 }
124 
125 //__________________________________________________________________________
127  //
128  // destructor
129  //
130  if(fTPCAlignObj) delete fTPCAlignObj;
131 }
132 //__________________________________________________________________________
134  //
135  // for a time being it loads from the local file the surveyed point
136  // and has the ideal points hardwired. I am waiting until Ricardo
137  // completes his job
138  //
139 
140  AliSurveyObj * s1 = new AliSurveyObj();
141  s1->FillFromLocalFile(fFileGlob);
142  //
143  Int_t numberPoints = 8;
144  //
145  TString pointNames[8] = {"T1Final_R04241","T1Final_R05241","T1Final_R06241",
146  "T1Final_R07241","T1Final_R08241","T1Final_R10241",
147  "T1Final_R11241","T1Final_R12241"};
148  //
149  Float_t surveyedPoints[8][3];
150  AliSurveyPoint *currPoint;
151  //
152  for(Int_t i=0;i<numberPoints;i++){
153  currPoint=0;
154  currPoint = (AliSurveyPoint *) s1->GetData()->FindObject(pointNames[i]);
155  //
156  if(currPoint){
157  surveyedPoints[i][0]=currPoint->GetX();
158  surveyedPoints[i][1]=currPoint->GetY();
159  surveyedPoints[i][2]=currPoint->GetZ();
160  if(fDebug)
161  Printf("INFO: Point \"%s\" coordinates read.", pointNames[i].Data());
162  }
163  else {
164  if(fDebug){
165  Printf("ERROR: Essential point missing: \"%s\"", pointNames[i].Data());
166  return 1;
167  }
168  }
169  }
170  //
171  // Ideal points
172  //
173  Float_t idealPoints[8][3];
174  //
175  AliSurveyObj * s2 = new AliSurveyObj();
176  s2->FillFromLocalFile(fFileLoc);
177  //
178  TString pointNamesL[8] ={"R04","R05","R06","R07","R08","R10","R11","R12"};
179  //
180  AliSurveyPoint *currPointL;
181  //
182  for(Int_t i=0;i<numberPoints;i++){
183  currPointL=0;
184  currPointL = (AliSurveyPoint *) s2->GetData()->FindObject(pointNamesL[i]);
185  if(currPointL){
186  idealPoints[i][0]=currPointL->GetY();
187  idealPoints[i][1]=currPointL->GetZ();
188  idealPoints[i][2]=currPointL->GetX();
189  if(fDebug)
190  Printf("INFO: Point \"%s\" coordinates read.", pointNamesL[i].Data());
191  }
192  else{
193  if(fDebug){
194  Printf("ERROR: Essential point missing: \"%s\"", pointNamesL[i].Data());
195  return 1; }
196  }
197  }
198  //
199  // Create and fill matrices a & y
200  //
201  for(Int_t i = 0;i<numberPoints;i++){
202  for(Int_t j=0;j<3;j++){
203  fY(i*3+j,0)=surveyedPoints[i][j]-idealPoints[i][j];
204 
205  }
206  }
207  fA.Zero();
208  //
209  //
210  // setting matrix a
211  //
212  for(Int_t i=0;i<numberPoints;i++){
213  fA(3*i,0)= -idealPoints[i][1];
214  fA(3*i,1)= idealPoints[i][2];
215  fA(3*i,3)=1.;
216  fA(3*i+1,0)= idealPoints[i][0];
217  fA(3*i+1,2)= -idealPoints[i][2];
218  fA(3*i+1,4)= 1.;
219  fA(3*i+2,1)= -idealPoints[i][0];
220  fA(3*i+2,2)= idealPoints[i][1];
221  fA(3*i+2,5)=1.;
222  }
223  //
224  delete s1;
225  //
226  return 0;
227 }
228 //_________________________________________________________________
230  //
231  // Here simple matrix operations for the linear least square
232  // The trigonometric function sin is approximated by the angle
233  // and the cos by "1", because angles are very small (Y-convention!)
234  // This secures the linearity of the problem
235  // This method returns a sum of squares of residuals
236  //
237  TMatrixD tt1(TMatrixD::kInverted,(TMatrixD(fA,TMatrixD::kTransposeMult,fA)));
238  fX=TMatrixD(tt1,TMatrixD::kMult,TMatrixD(fA,TMatrixD::kTransposeMult,fY));
239  //
240  TMatrixD Unit(24,24);
241  Unit.UnitMatrix();
242  TMatrixD xxt1(TMatrixD::kInverted,TMatrixD(fA,TMatrixD::kTransposeMult,fA));
243  TMatrixD t(fA,TMatrixD::kMult,TMatrixD(xxt1,TMatrixD::kMultTranspose,fA));
244  TMatrixD t2(Unit,TMatrixD::kMinus,t);
245  TMatrixD chi2(fY,TMatrixD::kTransposeMult,TMatrixD(t2,TMatrixD::kMult,fY));
246  //
247 
248  return chi2(0,0);
249 
250 }
251 //_______________________________________________________________________
253  //
254  // This method creates AliAlignObj and fills it with Euler angles
255  // and shifts. The units are degrees and cm.
256  //
257  fTPCAlignObj = new AliAlignObjParams();
258  fTPCAlignObj->SetSymName("ALIC_1/TPC_M_1");
259  fTPCAlignObj->SetVolUID(0);
260  Double_t raddeg = TMath::RadToDeg();
261  Double_t phi,theta,psi;
262  //
263  phi=fX(0,0)*raddeg;
264  theta=fX(1,0)*raddeg;
265  psi=fX(2,0)*raddeg;
266  //
267  Double_t dx,dy,dz;
268  dx=fX(3,0)*100.;
269  dy=fX(4,0)*100.;
270  dz=fX(5,0)*100.;
271  fTPCAlignObj->SetRotation(psi,theta,phi);
272  fTPCAlignObj->SetTranslation(dx,dy,dz);
273  fTPCAlignObj->Print("");
274 }
275 //______________________________________________________________________
277  //
278  // runs the full chain
279  //
280  SetDebug(0);
281  Bool_t flag = LoadSurveyData();
282  if(flag) {
283  cout<<"Missing points"<<endl;
284  return;
285  }
286  Double_t chi2 = ComputeTransform();
287  if(chi2>0.01) return;
288  CreateAlignObj();
289  StoreAlignObj();
290  //
291 }
292 //_________________________________________________________________________
294  //
295 AliCDBManager* cdb = AliCDBManager::Instance();
296  if(!cdb->IsDefaultStorageSet()) cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
297  //
298 TClonesArray *array = new TClonesArray("AliAlignObjParams",1);
299 //
300  Double_t shifts[3];
301  Double_t rots[3];
302  //
303  fTPCAlignObj->GetPars(shifts,rots);
304  new((*array)[0]) AliAlignObjParams(fTPCAlignObj->GetSymName(),0,shifts[0],
305  shifts[1],shifts[2],rots[0],rots[1],rots[2],kTRUE);
306 
307 //
308 // storing either in the OCDB or local file
309 //
310  if( TString(gSystem->Getenv("TOCDB")) != TString("kTRUE") ){
311  // save on file
312  const char* filename = "TPCSurveyMisalignment.root";
313  Char_t fullname[80];
314  //sprintf(fullname,"%s/TPC/%s",gSystem->Getenv("ALICE_ROOT"),filename);
315  snprintf(fullname,80,"%s/TPC/%s",gSystem->Getenv("ALICE_ROOT"),filename);
316  TFile *f = new TFile(fullname,"RECREATE");
317  if(!f){
318  AliError("cannot open file for output\n");
319  return;
320  }
321  AliInfo(Form("Saving alignment objects to the file %s", filename));
322  f->cd();
323  f->WriteObject(array,"TPCAlignObjs","kSingleKey");
324  f->Close();
325  }else{
326  // save in CDB storage
327  AliCDBStorage* storage;
328  //
329  TString Storage = gSystem->Getenv("STORAGE");
330  if(!Storage.BeginsWith("local://") && !Storage.BeginsWith("alien://")) {
331  AliError(Form(
332  "STORAGE variable set to %s is not valid. Exiting\n",Storage.Data()));
333  return;
334  }
335  storage = cdb->GetStorage(Storage.Data());
336  if(!storage){
337  AliError(Form("Unable to open storage %s\n",Storage.Data()));
338  return;
339  }
340  //
341  AliCDBMetaData* md = new AliCDBMetaData();
342  md->SetResponsible("Marek Kowalski");
343  md->SetComment("Full misalignment of entire TPC from surveyors");
344  AliCDBId id("TPC/Align/Data",0,AliCDBRunRange::Infinity());
345  storage->Put(array,id,md);
346  }
347 
348 }
AliTPCcalibAlign align
Definition: CalibAlign.C:43
virtual ~AliTPCAlign()
TMatrixD fY
Definition: AliTPCAlign.h:39
TFile f("CalibObjects.root")
AliTPCAlign & operator=(const AliTPCAlign &align)
TMatrixD fX
Definition: AliTPCAlign.h:37
TObjArray * array
Definition: AnalyzeLaser.C:12
ClassImp(AliTPCAlign) AliTPCAlign
Definition: AliTPCAlign.cxx:54
void SetDebug(Int_t debug)
Definition: AliTPCAlign.h:28
Double_t chi2
Definition: AnalyzeLaser.C:7
Bool_t LoadSurveyData()
Int_t fDebug
Definition: AliTPCAlign.h:40
TMatrixD fA
Definition: AliTPCAlign.h:38
Char_t * fFileGlob
Definition: AliTPCAlign.h:35
AliAlignObjParams * fTPCAlignObj
Definition: AliTPCAlign.h:36
void StoreAlignObj()
void CreateAlignObj()
Double_t ComputeTransform()
Char_t * fFileLoc
Definition: AliTPCAlign.h:34