1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
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
22 Revision 1.2 2007/10/03 09:27:50 marian
23 Extra semicolon removed (Marian)
25 Revision 1.1 2007/10/01 14:12:45 kowal2
26 Class creating the aligmnent object fro the surveyor measurements.
31 // Creates the TPC align object
34 #include "AliTPCAlign.h"
35 #include "AliSurveyPoint.h"
36 #include "AliSurveyPoint.h"
39 #include "Riostream.h"
43 #include "AliSurveyObj.h"
44 #include "AliSurveyPoint.h"
45 #include "AliAlignObjParams.h"
46 #include "AliCDBStorage.h"
47 #include <TClonesArray.h>
50 #include "AliCDBManager.h"
56 AliTPCAlign::AliTPCAlign() :
67 // default constructor
70 //________________________________________________________________________
71 AliTPCAlign::AliTPCAlign(Int_t reportloc, Int_t reportglob) :
82 // constructor - defines data files
84 fFileLoc = new Char_t[80];
85 fFileGlob = new Char_t[80];
87 //sprintf(path,gSystem->Getenv("ALICE_ROOT"));
88 snprintf(path,50,"%s",gSystem->Getenv("ALICE_ROOT"));
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);
97 //_________________________________________________________________________
98 AliTPCAlign::AliTPCAlign(const AliTPCAlign &align) :
109 // copy constructor - dummy
111 fDebug = align.fDebug;
113 //__________________________________________________________________________
114 AliTPCAlign & AliTPCAlign::operator =(const AliTPCAlign & align)
117 // assignment operator - dummy
125 //__________________________________________________________________________
126 AliTPCAlign::~AliTPCAlign(){
130 if(fTPCAlignObj) delete fTPCAlignObj;
132 //__________________________________________________________________________
133 Bool_t AliTPCAlign::LoadSurveyData(){
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
140 AliSurveyObj * s1 = new AliSurveyObj();
141 s1->FillFromLocalFile(fFileGlob);
143 Int_t numberPoints = 8;
145 TString pointNames[8] = {"T1Final_R04241","T1Final_R05241","T1Final_R06241",
146 "T1Final_R07241","T1Final_R08241","T1Final_R10241",
147 "T1Final_R11241","T1Final_R12241"};
149 Float_t surveyedPoints[8][3];
150 AliSurveyPoint *currPoint;
152 for(Int_t i=0;i<numberPoints;i++){
154 currPoint = (AliSurveyPoint *) s1->GetData()->FindObject(pointNames[i]);
157 surveyedPoints[i][0]=currPoint->GetX();
158 surveyedPoints[i][1]=currPoint->GetY();
159 surveyedPoints[i][2]=currPoint->GetZ();
161 Printf("INFO: Point \"%s\" coordinates read.", pointNames[i].Data());
165 Printf("ERROR: Essential point missing: \"%s\"", pointNames[i].Data());
173 Float_t idealPoints[8][3];
175 AliSurveyObj * s2 = new AliSurveyObj();
176 s2->FillFromLocalFile(fFileLoc);
178 TString pointNamesL[8] ={"R04","R05","R06","R07","R08","R10","R11","R12"};
180 AliSurveyPoint *currPointL;
182 for(Int_t i=0;i<numberPoints;i++){
184 currPointL = (AliSurveyPoint *) s2->GetData()->FindObject(pointNamesL[i]);
186 idealPoints[i][0]=currPointL->GetY();
187 idealPoints[i][1]=currPointL->GetZ();
188 idealPoints[i][2]=currPointL->GetX();
190 Printf("INFO: Point \"%s\" coordinates read.", pointNamesL[i].Data());
194 Printf("ERROR: Essential point missing: \"%s\"", pointNamesL[i].Data());
199 // Create and fill matrices a & y
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];
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];
216 fA(3*i+1,0)= idealPoints[i][0];
217 fA(3*i+1,2)= -idealPoints[i][2];
219 fA(3*i+2,1)= -idealPoints[i][0];
220 fA(3*i+2,2)= idealPoints[i][1];
228 //_________________________________________________________________
229 Double_t AliTPCAlign::ComputeTransform(){
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
237 TMatrixD tt1(TMatrixD::kInverted,(TMatrixD(fA,TMatrixD::kTransposeMult,fA)));
238 fX=TMatrixD(tt1,TMatrixD::kMult,TMatrixD(fA,TMatrixD::kTransposeMult,fY));
240 TMatrixD Unit(24,24);
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));
251 //_______________________________________________________________________
252 void AliTPCAlign::CreateAlignObj(){
254 // This method creates AliAlignObj and fills it with Euler angles
255 // and shifts. The units are degrees and cm.
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;
264 theta=fX(1,0)*raddeg;
271 fTPCAlignObj->SetRotation(psi,theta,phi);
272 fTPCAlignObj->SetTranslation(dx,dy,dz);
273 fTPCAlignObj->Print("");
275 //______________________________________________________________________
276 void AliTPCAlign::Run(){
278 // runs the full chain
281 Bool_t flag = LoadSurveyData();
283 cout<<"Missing points"<<endl;
286 Double_t chi2 = ComputeTransform();
287 if(chi2>0.01) return;
292 //_________________________________________________________________________
293 void AliTPCAlign::StoreAlignObj(){
295 AliCDBManager* cdb = AliCDBManager::Instance();
296 if(!cdb->IsDefaultStorageSet()) cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
298 TClonesArray *array = new TClonesArray("AliAlignObjParams",1);
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);
308 // storing either in the OCDB or local file
310 if( TString(gSystem->Getenv("TOCDB")) != TString("kTRUE") ){
312 const char* filename = "TPCSurveyMisalignment.root";
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");
318 AliError("cannot open file for output\n");
321 AliInfo(Form("Saving alignment objects to the file %s", filename));
323 f->WriteObject(array,"TPCAlignObjs","kSingleKey");
326 // save in CDB storage
327 AliCDBStorage* storage;
329 TString Storage = gSystem->Getenv("STORAGE");
330 if(!Storage.BeginsWith("local://") && !Storage.BeginsWith("alien://")) {
332 "STORAGE variable set to %s is not valid. Exiting\n",Storage.Data()));
335 storage = cdb->GetStorage(Storage.Data());
337 AliError(Form("Unable to open storage %s\n",Storage.Data()));
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);