1 /// \file MakeAlignCalPad.C
3 /// \author marian.ivanov@cern.ch
5 /// Macro to create alignment/distortion maps
6 /// As a input output of AliTPCcalibAlign is used.
10 /// In the setup without the magnetic field the tracks are fitted using the linear track model.
11 /// ( in y-rphi coordinate the primary vertex is also used as a constrain)
12 /// Residuals (deltas0 between the track and clusters in Y and in z direction are filled in the 4 D histogram:
13 /// Delta: phi(180 bins): localX(53 bins): tan(phi): tan(theta)(10 bins)
15 /// Distortion map are extracted form the residual histograms as a mean value at each bin.
16 /// Linear fits are then performed for each pad - delta as function of theta
19 /// Delta Ymeas = offsetY+slopeY*tan(theta)
20 /// Delta Zmeas = offsetZ+slopeZ*tan(theta)
23 /// Resulting residuals exported into the OCDB are:
33 /// make calpad+ make report ps file:
36 /// aliroot -b -q ~/NimStyle.C ../ConfigCalibTrain.C\(119037\) $ALICE_ROOT/TPC/CalibMacros/MakeAlignCalPad.C\(1\)
39 /// make only report ps file:
42 /// aliroot -b -q ~/NimStyle.C $ALICE_ROOT/TPC/CalibMacros/MakeAlignCalPad.C\(3\)
45 /// Making fit - iterative procedure - see below:
48 /// gROOT->Macro("~/rootlogon.C");
49 /// gSystem->Load("libANALYSIS");
50 /// gSystem->Load("libSTAT");
51 /// gSystem->Load("libTPCcalib");
52 /// gSystem->AddIncludePath("-I$ALICE_ROOT/TPC/macros -I$ALICE_ROOT/TPC/TPC -I$ALICE_ROOT/STAT");
53 /// .L $ALICE_ROOT/TPC/CalibMacros/MakeAlignCalPad.C+
56 /// gROOT->Macro("../ConfigCalibTrain.C(119037)");
59 /// MakeFits(); // this is logn proceure 30 minutes
61 /// //UpdateOCDB(0,AliCDBRunRange::Infinity());
63 /// gROOT->Macro("~/NimStyle.C")
66 #if !defined(__CINT__) || defined(__MAKECINT__)
69 #include "THnSparse.h"
71 #include "TTreeStream.h"
73 #include "AliTPCcalibAlign.h"
74 #include "AliTPCROC.h"
75 #include "AliTPCCalROC.h"
76 #include "AliTPCCalPad.h"
82 #include "AliTPCPreprocessorOnline.h"
83 #include "AliTPCcalibDB.h"
84 #include "AliTPCkalmanAlign.h"
85 #include "TPostScript.h"
90 #include "AliTPCExBEffectiveSector.h"
91 #include "AliTPCComposedCorrection.h"
93 #include "AliCDBMetaData.h"
95 #include "AliCDBManager.h"
96 #include "AliCDBStorage.h"
97 #include "AliCDBEntry.h"
98 #include "TStatToolkit.h"
109 AliTPCROC *proc = AliTPCROC::Instance();
110 AliTPCExBEffectiveSector * geffCorr=0;
112 Double_t GetCorr(Double_t sector, Double_t localX, Double_t kZ,Int_t type);
118 void MakeAlignCalPad(Int_t mode){
119 /// Make AlignCalpad and make report
121 gSystem->Load("libANALYSIS");
122 gSystem->Load("libSTAT");
123 gSystem->Load("libTPCcalib");
124 printf("Make report mode\t%d\n", mode);
129 printf("Make report\n");
134 /// read the TPC alignment
136 TFile fcalib("CalibObjects.root");
137 TObjArray * array = (TObjArray*)fcalib.Get("TPCCalib");
139 palign = ( AliTPCcalibAlign *)array->FindObject("alignTPC");
141 palign = ( AliTPCcalibAlign *)fcalib.Get("alignTPC");
144 TFile fcalib2("TPCAlignObjects.root");
145 palign = ( AliTPCcalibAlign *)fcalib2.Get("alignTPC");
151 AliTPCcalibAlign * align = (AliTPCcalibAlign *)palign;
152 THnSparse * hdY = align->GetClusterDelta(0);
153 THnSparse * hdZ = align->GetClusterDelta(1);
154 AliTPCExBEffectiveSector::MakeResidualMap(hdY,"clusterDY.root");
155 AliTPCExBEffectiveSector::MakeResidualMap(hdZ,"clusterDZ.root");
158 void FitdY(TTree * tree){
161 AliTPCROC * roc = AliTPCROC::Instance();
162 Double_t xquadrant = roc->GetPadRowRadii(36,53);
163 Double_t xIO = ( roc->GetPadRowRadii(0,roc->GetNRows(0)-1)+roc->GetPadRowRadii(36,0))*0.5;
166 tree->SetAlias("diffS","(sector-int(sector)-0.5)");
167 tree->SetAlias("diffQ",Form("(localX-%f)",xquadrant));
168 tree->SetAlias("diffIO",Form("(localX-%f)",xIO));
169 tree->SetAlias("iroc",Form("(localX<%f)",xIO)); // bool IROC
170 tree->SetAlias("dqLR0",Form("(localX<%f)*(-1+(diffS<0)*2)",xIO)); //sign LeftRight
171 tree->SetAlias("dqLR2",Form("(localX>%f)*(-1+(diffS<0)*2)",xquadrant)); //sign LeftRight up
173 tree->SetAlias("diffIFC","abs(localX-80)");
174 tree->SetAlias("diffOFC","abs(250-localX)");
175 tree->SetAlias("drift","(1-abs(kZ*localX)/250.)");
177 tree->SetAlias("dIFC2",Form("drift/(1+abs(diffIFC^2/(%f^2)))",10.));
178 tree->SetAlias("dIFC",Form("drift/(1+abs(diffIFC/(%f)))",5.));
179 tree->SetAlias("dOFC2",Form("drift/(1+abs(diffOFC^2/(%f^2)))",10.));
180 tree->SetAlias("dOFC",Form("drift/(1+abs(diffOFC/(%f)))",5.));
184 TStatToolkit toolkit;
190 fstringG+="(iroc)++"; //1 iroc shift
191 fstringG+="(dqLR0)++";
192 fstringG+="(dqLR2)++";
193 fstringG+="(diffIO*iroc)++"; // iroc rotation
194 fstringG+="(diffIO*dqLR0)++";
195 fstringG+="(diffQ*dqLR2)++";
197 fstringG+="(dIFC+dIFC2)++"; //9
198 fstringG+="(diffS*(dIFC+dIFC2))++";
199 fstringG+="(diffS^2*(dIFC+dIFC2))++";
200 fstringG+="(dIFC-dIFC2)++"; //9
201 fstringG+="(diffS*(dIFC-dIFC2))++";
202 fstringG+="(diffS^2*(dIFC-dIFC2))++";
205 fstringG+="(dOFC+dOFC2)++"; //9
206 fstringG+="(diffS*(dOFC+dOFC2))++";
207 fstringG+="(diffS^2*(dOFC+dOFC2))++";
208 fstringG+="(dOFC-dOFC2)++"; //9
209 fstringG+="(diffS*(dOFC-dOFC2))++";
210 fstringG+="(diffS^2*(dOFC-dOFC2))++";
214 TTreeSRedirector *pcstream=new TTreeSRedirector("dyFit.root");
215 {for (Int_t isec=0; isec<18; isec++){
216 {for (Int_t iside=0; iside<=1; iside++){
217 TCut cutS=Form("abs(sector-%d.5)<0.5&&kZ*%d>0&&entries>2000",isec,(iside>0)?-1:1);
218 TString *strFitG = TStatToolkit::FitPlane(tree,"mean", fstringG.Data(),cutS, chi2,npoints,param,covar,-1,0, 10000000, kTRUE);
219 tree->SetAlias("fitG",strFitG->Data());
220 tree->Draw("mean-fitG",cutS,"");
222 printf("%d\t%d\t%f\n",iside,isec,TMath::Sqrt(chi2/npoints));
223 (*pcstream)<<"fitDy"<<
227 "npoints="<<npoints<<
239 void DumpDerivative(TH3 * his){
242 Int_t nbins0=his->GetXaxis()->GetNbins();
243 Int_t nbins1=his->GetYaxis()->GetNbins();
244 Int_t nbins2=his->GetZaxis()->GetNbins();
245 TTreeSRedirector *pcstream = new TTreeSRedirector("aaa.root");
246 for (Int_t ibin0=1; ibin0<nbins0; ibin0++)
247 for (Int_t ibin1=1; ibin1<nbins1; ibin1++)
248 for (Int_t ibin2=1; ibin2<nbins2; ibin2++){
249 Float_t x= his->GetXaxis()->GetBinCenter(ibin0);
250 Float_t y= his->GetYaxis()->GetBinCenter(ibin1);
251 Float_t z= his->GetZaxis()->GetBinCenter(ibin2);
252 Float_t c= his->GetBinContent(ibin0,ibin1,ibin2);
253 Float_t c0M=his->GetBinContent(ibin0-1,ibin1,ibin2);
254 Float_t c0P=his->GetBinContent(ibin0+1,ibin1,ibin2);
255 Float_t c1M=his->GetBinContent(ibin0,ibin1-1,ibin2);
256 Float_t c1P=his->GetBinContent(ibin0,ibin1+1,ibin2);
257 Float_t c2M=his->GetBinContent(ibin0,ibin1,ibin2-1);
258 Float_t c2P=his->GetBinContent(ibin0,ibin1,ibin2+1);
259 printf("%f\t%f\t%f\t%f\n",x,y,z,c);
276 Double_t GetCorr(Double_t sector, Double_t localX, Double_t kZ, Int_t type){
277 /// calculate the correction at given position - check the geffCorr
279 Double_t phi=sector*TMath::Pi()/9.;
280 Double_t gx = localX*TMath::Cos(phi);
281 Double_t gy = localX*TMath::Sin(phi);
282 Double_t gz = localX*kZ;
283 Int_t nsector=(gz>0) ? 0:18;
287 Float_t distPoint[3]={gx,gy,gz};
288 geffCorr->DistortPoint(distPoint, nsector);
289 Double_t r0=TMath::Sqrt(gx*gx+gy*gy);
290 Double_t r1=TMath::Sqrt(distPoint[0]*distPoint[0]+distPoint[1]*distPoint[1]);
291 Double_t phi0=TMath::ATan2(gy,gx);
292 Double_t phi1=TMath::ATan2(distPoint[1],distPoint[0]);
293 if (type==0) return r1-r0;
294 if (type==1) return (phi1-phi0)*r0;
300 void LoadDistortionTrees(){
301 /// Load distortion tree
303 TFile *fp = new TFile("clusterDYPlus.root");
304 TFile *fm = new TFile("clusterDYMinus.root");
305 TFile *f0 = new TFile("clusterDY0.root");
306 TFile *fpz= new TFile("clusterDZPlus.root");
307 TFile *fmz= new TFile("clusterDZMinus.root");
308 TFile *f0z=new TFile("clusterDZ0.root");
309 treeP=(TTree*)fp->Get("delta");
310 treeM=(TTree*)fm->Get("delta");
311 tree0=(TTree*)f0->Get("delta");
312 treePZ=(TTree*)fpz->Get("delta");
313 treeMZ=(TTree*)fmz->Get("delta");
314 tree0Z=(TTree*)f0z->Get("delta");
315 tree0->AddFriend(treeP,"P");
316 tree0->AddFriend(treeM,"M");
317 tree0->AddFriend(treePZ,"PZ");
318 tree0->AddFriend(treeMZ,"MZ");
319 tree0->AddFriend(tree0Z,"Z");
320 tree0->SetMarkerStyle(25);
321 tree0->SetMarkerSize(0.4);
324 void UpdateEffSectorOCDB(){
325 /// Incremeantal update ot the correction maps
326 /// corrections on top of previous corrections
328 TFile fp("clusterDYPlus.root");
329 TFile fm("clusterDYMinus.root");
330 TFile f0("clusterDY0.root");
331 TFile f0z("clusterDZ0.root");
333 TH3F *his3D0=(TH3F*)f0.Get("his3D");
334 TH3F *his3DP=(TH3F*)fp.Get("his3D");
335 TH3F *his3DM=(TH3F*)fm.Get("his3D");
336 TH3F *his3DZ=(TH3F*)f0z.Get("his3D");
337 TH3F *hisR=0; //half of difference (Plus-Minus) scaled by c1
338 hisR=(TH3F*)his3DP->Clone();
339 hisR->Add(his3DM,-1);
341 hisR->Scale(1/0.3); // c1 factor to be added there //is sign correct?
344 AliTPCExBEffectiveSector *effSector = new AliTPCExBEffectiveSector;
345 effSector->SetName("EffSector");
346 effSector->SetTitle("EffSector");
347 effSector->fCorrectionRPhi=(TH3F*)his3D0->Clone();
348 effSector->fCorrectionR=(TH3F*)hisR->Clone();
349 effSector->fCorrectionZ=(TH3F*)his3DZ->Clone();
351 AliTPCCorrection::AddVisualCorrection(geffCorr,0);
355 AliTPCcalibDB * calib = AliTPCcalibDB::Instance();
356 TObjArray *arr = calib->GetTPCComposedCorrectionArray();
357 {for (Int_t i=0; i<arr->GetEntries(); i++){
358 AliTPCComposedCorrection * corr=(AliTPCComposedCorrection*)arr->At(i);
360 AliTPCExBEffectiveSector * corrSec=( AliTPCExBEffectiveSector *)corr->GetCorrections()->FindObject("EffSector");
361 if (i==0) geffCorr=(AliTPCExBEffectiveSector *)corrSec;
362 if (!corrSec) corr->GetCorrections()->Add(effSector->Clone());
364 if (corrSec->fCorrectionRPhi) corrSec->fCorrectionRPhi->Add(effSector->fCorrectionRPhi);
365 else corrSec->fCorrectionRPhi=(TH3F*)effSector->fCorrectionRPhi->Clone();
366 if (corrSec->fCorrectionR) corrSec->fCorrectionR->Add(effSector->fCorrectionR);
367 else corrSec->fCorrectionR=(TH3F*)effSector->fCorrectionR->Clone();
368 if (corrSec->fCorrectionZ) corrSec->fCorrectionR->Add(effSector->fCorrectionZ);
369 else corrSec->fCorrectionZ=(TH3F*)effSector->fCorrectionZ->Clone();
371 if (i==0) AliTPCCorrection::AddVisualCorrection(corrSec,1);
374 TString userName=gSystem->GetFromPipe("echo $USER");
375 TString date=gSystem->GetFromPipe("date");
376 TString ocdbStorage="local:////";
377 ocdbStorage+=gSystem->GetFromPipe("pwd");
378 ocdbStorage+="/OCDB";
380 AliCDBMetaData *metaData= new AliCDBMetaData();
381 metaData->SetObjectClassName("TObjArray");
382 metaData->SetResponsible("Marian Ivanov");
383 metaData->SetBeamPeriod(1);
384 metaData->SetAliRootVersion("05-27-04"); //root version
385 metaData->SetComment(Form("Correction calibration. User: %s\n Data%s",userName.Data(),date.Data()));
387 id1=new AliCDBId("TPC/Calib/Correction", 0, AliCDBRunRange::Infinity());
388 AliCDBStorage* gStorage = 0;
390 gStorage=AliCDBManager::Instance()->GetStorage((ocdbStorage+"Update").Data());
391 gStorage->Put(arr, (*id1), metaData);
398 TFile f0("../mergeField0/mean.root");
399 TFile fP("../mergePlus/mean.root");
400 TFile fM("../mergeMinus/mean.root");
402 TTree *itsdy0=(TTree*)f0.Get("ITSdy");
403 TTree *itsdyP=(TTree*)fP.Get("ITSdy");
404 TTree *itsdyM=(TTree*)fM.Get("ITSdy");
405 TTree *vdy0=(TTree*)f0.Get("Vertexdy");
406 TTree *vdyP=(TTree*)fP.Get("Vertexdy");
407 TTree *vdyM=(TTree*)fM.Get("Vertexdy");
408 itsdy0->SetMarkerStyle(25);
409 itsdy0->SetMarkerSize(0.3);
410 itsdy0->AddFriend(itsdyP,"P");
411 itsdy0->AddFriend(itsdyM,"M");
412 itsdy0->AddFriend(vdy0,"V");
413 itsdy0->AddFriend(vdyP,"VP");
414 itsdy0->AddFriend(vdyM,"VM");
415 itsdy0->SetMarkerStyle(25);
416 itsdy0->SetMarkerSize(0.4);
424 void MakePlotDeltaZ(){
427 TCut cut="entries>500&&PZ.entries>500&&MZ.entries>500";
428 TCanvas *cA = new TCanvas("deltaZA","deltaZA",900,700);
429 TCanvas *cC = new TCanvas("deltaZC","deltaZC",900,700);
430 TCanvas *cARef = new TCanvas("deltaZARef","deltaZARef",1000,800);
431 TCanvas *cCRef = new TCanvas("deltaZCRef","deltaZCRef",1000,800);
433 TH1::AddDirectory(0);
436 for (Int_t isec=0; isec<18; isec++){
438 TCut cutS=Form("abs(sector-0.5-%d)<0.1",isec);
439 tree0->Draw("Z.mean*10.:localX:abs(kZ)",cutS+"entries>4000&&P.entries>200&&localX<250&&kZ>0&&abs(kZ)<1","colz");
440 his=(TH1*)tree0->GetHistogram()->Clone();
441 his->GetXaxis()->SetTitle("r (cm)");
442 his->GetYaxis()->SetTitle("#Delta_{z} (mm)");
443 his->GetZaxis()->SetTitle("tan($theta)");
449 for (Int_t isec=0; isec<18; isec++){
451 TCut cutS=Form("abs(sector-0.5-%d)<0.1",isec);
452 tree0->Draw("Z.mean*10.:localX:abs(kZ)",cutS+"entries>4000&&P.entries>200&&localX<250&&kZ<0&&abs(kZ)<1","colz");
453 his=(TH1*)tree0->GetHistogram()->Clone();
454 his->GetXaxis()->SetTitle("r (cm)");
455 his->GetYaxis()->SetTitle("#Delta_{z} (mm)");
456 his->GetZaxis()->SetTitle("tan($theta)");
462 for (Int_t isec=0; isec<18; isec++){
464 TCut cutS=Form("abs(sector-0.5-%d)<0.1",isec);
465 tree0->Draw("(PZ.mean-MZ.mean)*10.:localX:abs(kZ)",cutS+cut+"kZ>0&&abs(kZ)<1","colz");
466 his=(TH1*)tree0->GetHistogram()->Clone();
467 his->GetXaxis()->SetTitle("r (cm)");
468 his->GetYaxis()->SetTitle("#Delta_{z} (mm)");
469 his->GetZaxis()->SetTitle("tan($theta)");
475 for (Int_t isec=0; isec<18; isec++){
477 TCut cutS=Form("abs(sector-0.5-%d)<0.1",isec);
478 tree0->Draw("(PZ.mean-MZ.mean)*10.:localX:abs(kZ)",cutS+cut+"kZ<0&&abs(kZ)<1","colz");
479 his=(TH1*)tree0->GetHistogram()->Clone();
480 his->GetXaxis()->SetTitle("r (cm)");
481 his->GetYaxis()->SetTitle("#Delta_{z} (mm)");
482 his->GetZaxis()->SetTitle("tan($theta)");
486 TPostScript *ps = new TPostScript("distortionZ.ps", 112);
504 /// make sector alignment - using Kalman filter method -AliTPCkalmanAlign
505 /// Combined information is used, mean residuals are minimized:
507 /// 1. TPC-TPC sector alignment
508 /// 2. TPC-ITS alignment
509 /// 3. TPC vertex alignment
511 TFile fcalib("../mergeField0/TPCAlignObjects.root");
512 AliTPCcalibAlign * align = ( AliTPCcalibAlign *)fcalib.Get("alignTPC");
513 TFile f0("../mergeField0/mean.root");
516 TTree *itsdy=(TTree*)f0.Get("ITSdy");
517 TTree *itsdp=(TTree*)f0.Get("ITSdsnp");
518 TTree *itsdz=(TTree*)f0.Get("ITSdz");
519 TTree *itsdt=(TTree*)f0.Get("ITSdtheta");
521 TTree *vdy=(TTree*)f0.Get("Vertexdy");
522 TTree *vds=(TTree*)f0.Get("Vertexdsnp");
523 TTree *vdz=(TTree*)f0.Get("Vertexdz");
524 TTree *vdt=(TTree*)f0.Get("Vertexdtheta");
526 itsdy->AddFriend(itsdp,"Snp");
527 itsdy->AddFriend(itsdz,"Z");
528 itsdy->AddFriend(itsdt,"T");
530 itsdy->AddFriend(vdy,"V");
531 itsdy->AddFriend(vds,"VSnp");
532 itsdy->AddFriend(vdz,"VZ");
533 itsdy->AddFriend(vdt,"VT");
534 itsdy->SetMarkerStyle(25);
535 itsdy->SetMarkerSize(0.4);
537 TCut cutQ="entries>500&&abs(theta)<0.8&&abs(snp)<0.2";
538 TH1F his1("hdeltaY1","hdeltaY1",100,-0.5,0.5);
539 TMatrixD vecAlign(72,1);
540 TMatrixD covAlign(72,72);
541 AliTPCkalmanAlign::BookAlign1D(vecAlign,covAlign,0,0.0005);
542 TVectorD vecITSY(72);
543 TVectorD vecITSS(72);
545 TVectorD vecITSTan(72);
546 TVectorD vecVTan(72);
547 {for (Int_t isec0=0; isec0<36; isec0++){
548 Double_t phi0=(isec0%18+0.5)*TMath::Pi()/9.;
549 if (phi0>TMath::Pi()) phi0-=TMath::TwoPi();
550 Int_t iside0=(isec0%36<18)? 0:1;
551 TCut cutSector=Form("abs(%f-phi)<0.14",phi0);
552 TCut cutSide = (iside0==0)? "theta>0":"theta<0";
553 itsdy->Draw("mean",cutQ+cutSector+cutSide);
554 Double_t meanITSY=itsdy->GetHistogram()->GetMean()/83.6;
555 vecITSY[isec0]=meanITSY;
556 vecITSY[isec0+36]=meanITSY;
557 itsdy->Draw("Snp.mean",cutQ+cutSector+cutSide);
558 Double_t meanITSS=itsdy->GetHistogram()->GetMean();
559 vecITSS[isec0]=meanITSS;
560 vecITSS[isec0+36]=meanITSS;
561 itsdy->Draw("VSnp.mean",cutQ+cutSector+cutSide);
562 Double_t meanVS=itsdy->GetHistogram()->GetMean();
564 vecVS[isec0+36]=meanVS;
567 AliTPCROC * roc = AliTPCROC::Instance();
568 Double_t fXIROC = (roc->GetPadRowRadii(0,0)+roc->GetPadRowRadii(0,roc->GetNRows(0)-1))*0.5;
569 Double_t fXOROC = (roc->GetPadRowRadii(36,0)+roc->GetPadRowRadii(36,roc->GetNRows(36)-1))*0.5;
570 Double_t fXmiddle = ( roc->GetPadRowRadii(0,0)+roc->GetPadRowRadii(36,roc->GetNRows(36)-1))*0.5;
571 Double_t fXIO = ( roc->GetPadRowRadii(0,roc->GetNRows(0)-1)+roc->GetPadRowRadii(36,0))*0.5;
573 TTreeSRedirector *pcstream=new TTreeSRedirector("combAlign.root");
576 for (Int_t iter=0; iter<2; iter++){
577 for (Int_t isec0=0; isec0<72; isec0++){
578 for (Int_t isec1=0; isec1<72; isec1++){
579 TH1 * his = align->GetHisto(AliTPCcalibAlign::kY,isec0,isec1);
580 TH1 * hisPhi = align->GetHisto(AliTPCcalibAlign::kPhi,isec0,isec1);
582 if (his->GetEntries()<100) continue;
584 if (isec0<36&&isec1<36) xref=fXIROC;
585 if (isec0>=36&&isec1>=36) xref=fXOROC;
586 Double_t meanTPC=his->GetMean()/xref;
587 Double_t meanTPCPhi=hisPhi->GetMean();
588 Double_t meanITS0=vecITSY[isec0];
589 Double_t meanITS1=vecITSY[isec1];
590 Double_t meanITSS0=vecITSS[isec0];
591 Double_t meanITSS1=vecITSS[isec1];
592 Double_t meanVS0=vecVS[isec0];
593 Double_t meanVS1=vecVS[isec1];
594 AliTPCkalmanAlign::UpdateAlign1D(meanTPC, 0.001, isec0,isec1, vecAlign,covAlign);
595 AliTPCkalmanAlign::UpdateAlign1D(meanTPCPhi, 0.001, isec0,isec1, vecAlign,covAlign);
596 AliTPCkalmanAlign::UpdateAlign1D(meanITS1-meanITS0, 0.001, isec0,isec1, vecAlign,covAlign);
597 AliTPCkalmanAlign::UpdateAlign1D(meanITSS1-meanITSS0, 0.001, isec0,isec1, vecAlign,covAlign);
598 AliTPCkalmanAlign::UpdateAlign1D(meanVS1-meanVS0, 0.001, isec0,isec1, vecAlign,covAlign);
599 //printf("isec0\t%d\tisec1\t%d\t%f\t%f\t%f\n",isec0,isec1, meanTPC, meanITS0,meanITS1);
600 Double_t kalman0= vecAlign(isec0,0);
601 Double_t kalman1= vecAlign(isec1,0);
602 if (iter>0) (*pcstream)<<"align"<<
608 "mTPCPhi="<<meanTPCPhi<<
611 "mITSS0="<<meanITSS0<<
612 "mITSS1="<<meanITSS1<<
622 pcstream->GetFile()->cd();
623 vecAlign.Write("alignPhiMean");
624 covAlign.Write("alingPhiCovar");
626 TFile f("combAlign.root");
627 TTree * treeA = (TTree*)f.Get("align");
628 treeA->SetMarkerStyle(25);
629 treeA->SetMarkerSize(0.5);