66 #if !defined(__CINT__) || defined(__MAKECINT__)
69 #include "THnSparse.h"
71 #include "TTreeStream.h"
73 #include "AliTPCcalibAlign.h"
84 #include "AliTPCkalmanAlign.h"
85 #include "TPostScript.h"
93 #include "AliCDBMetaData.h"
95 #include "AliCDBManager.h"
96 #include "AliCDBStorage.h"
97 #include "AliCDBEntry.h"
98 #include "TStatToolkit.h"
112 Double_t
GetCorr(Double_t sector, Double_t localX, Double_t kZ,Int_t type);
121 gSystem->Load(
"libANALYSIS");
122 gSystem->Load(
"libSTAT");
123 gSystem->Load(
"libTPCcalib");
124 printf(
"Make report mode\t%d\n", mode);
136 TFile fcalib(
"CalibObjects.root");
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");
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));
170 tree->SetAlias(
"dqLR0",Form(
"(localX<%f)*(-1+(diffS<0)*2)",xIO));
171 tree->SetAlias(
"dqLR2",Form(
"(localX>%f)*(-1+(diffS<0)*2)",xquadrant));
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.));
190 fstringG+=
"(iroc)++";
191 fstringG+=
"(dqLR0)++";
192 fstringG+=
"(dqLR2)++";
193 fstringG+=
"(diffIO*iroc)++";
194 fstringG+=
"(diffIO*dqLR0)++";
195 fstringG+=
"(diffQ*dqLR2)++";
197 fstringG+=
"(dIFC+dIFC2)++";
198 fstringG+=
"(diffS*(dIFC+dIFC2))++";
199 fstringG+=
"(diffS^2*(dIFC+dIFC2))++";
200 fstringG+=
"(dIFC-dIFC2)++";
201 fstringG+=
"(diffS*(dIFC-dIFC2))++";
202 fstringG+=
"(diffS^2*(dIFC-dIFC2))++";
205 fstringG+=
"(dOFC+dOFC2)++";
206 fstringG+=
"(diffS*(dOFC+dOFC2))++";
207 fstringG+=
"(diffS^2*(dOFC+dOFC2))++";
208 fstringG+=
"(dOFC-dOFC2)++";
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<<
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){
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};
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;
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");
320 tree0->SetMarkerStyle(25);
321 tree0->SetMarkerSize(0.4);
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");
338 hisR=(TH3F*)his3DP->Clone();
339 hisR->Add(his3DM,-1);
345 effSector->SetName(
"EffSector");
346 effSector->SetTitle(
"EffSector");
357 {
for (Int_t i=0; i<arr->GetEntries(); i++){
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");
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);
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);
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;
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++){
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);
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);
static AliTPCcalibDB * Instance()
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
AliTPCExBEffectiveSector * geffCorr
TH3F * fCorrectionR
radial correction
Class providing the calibration parameters by accessing the CDB.
UInt_t GetNRows(UInt_t sector) const
TFile f("CalibObjects.root")
TFile fp("/data/calib/CalibTreePulser_run33834_Cside.root")
TTreeSRedirector * pcstream
TH3F * fCorrectionRPhi
r-phi correction
AliTPCComposedCorrection class.
void MakeAlignCalPad(Int_t mode)
void UpdateEffSectorOCDB()
Geometry class for a single ROC.
TObjArray * GetTPCComposedCorrectionArray() const
static void AddVisualCorrection(AliTPCCorrection *corr, Int_t position)
void DumpDerivative(TH3 *his)
TCollection * GetCorrections() const
void DistortPoint(Float_t x[], Short_t roc)
static AliTPCROC * Instance()
Double_t GetCorr(Double_t sector, Double_t localX, Double_t kZ, Int_t type)
Correct for the rest of ExB effect which are not covered yet by physical models.
void LoadDistortionTrees()
Float_t GetPadRowRadii(UInt_t isec, UInt_t irow) const
TH3F * fCorrectionZ
z correction