37 #include "TDatabasePDG.h" 39 #include "TGraphErrors.h" 40 #include "TStopwatch.h" 46 #include "AliTPCcalibBase.h" 54 Int_t
pdgs[4]={11,211,321,2212};
56 const char *
partName[4]={
"Electron",
"Pion",
"Kaon",
"Proton"};
57 const Int_t
colors[5]={kGreen,kBlack,kRed,kBlue,5};
73 for (Int_t ihis=0; ihis<4; ihis++)
massPDG [ihis]= TDatabasePDG::Instance()->GetParticle(
pdgs[ihis])->Mass();
93 cutGeom=TString::Format(
"esdTrack.GetLengthInActiveZone(0,3,236, -5 ,0,0)> %f*(130-5*abs(esdTrack.fP[4]))",fgeom);
103 cutNcr=TString::Format(
"esdTrack.GetTPCClusterInfo(3,1,0,159,1)>%f*(130-5*abs(esdTrack.fP[4]))",fcr);
112 cutNcl=TString::Format(
"esdTrack.fTPCncls>%f*(130-5*abs(esdTrack.fP[4]))",fcl);
116 cutFiducial=
"abs(esdTrack.fP[3])<1&&abs(esdTrack.fD)<1";
128 TTree * treeMC = (TTree*)ff->Get(
"highPt");
135 TH3D * hisdEdx3D[4]={0};
137 for (Int_t ihis=0; ihis<4; ihis++) {
138 massPDG [ihis]= TDatabasePDG::Instance()->GetParticle(
pdgs[ihis])->Mass();
139 treeMC->SetAlias(TString::Format(
"cut%s",
partName[ihis]), TString::Format(
"abs(particle.fPdgCode)==%d",
pdgs[ihis]));
140 treeMC->SetAlias(TString::Format(
"dEdxp%s",
partName[ihis]), TString::Format(
"AliTPCParam::BetheBlochAleph(esdTrack.fIp.P()/%f,1)",
massPDG[ihis]));
146 if (pcstream->
GetFile()->Get(
"RatioP_QMax0Pion3D")==0){
149 for (Int_t iDetType=0; iDetType<9; iDetType++){
150 for (Int_t ihis=0; ihis<4; ihis++){
151 printf(
"%d\t%d\n",iDetType,ihis);
153 TString detType=
"All";
154 TString dedx =
"esdTrack.fTPCsignal";
156 detType=TString::Format(
"Q%s%d",(iDetType-1)/4>0?
"Max":
"Tot",(iDetType-1)%4);
157 if (iDetType<5) dedx=TString::Format(
"esdTrack.fTPCdEdxInfo.GetSignalTot(%d)",(iDetType-1)%4);
158 if (iDetType>5) dedx=TString::Format(
"esdTrack.fTPCdEdxInfo.GetSignalMax(%d)",(iDetType-1)%4);
161 TCut cutPDG=TString::Format(
"abs(particle.fPdgCode)==%d",
pdgs[ihis]).Data();
162 TString hname= TString::Format(
"RatioP_%s%s3D",detType.Data(),
partName[ihis]);
163 TString query= TString::Format(
"%s/AliTPCParam::BetheBlochAleph(esdTrack.fIp.P()/%f,1):abs(esdTrack.fP[3]):esdTrack.fIp.P()>>%s",dedx.Data(),
massPDG[ihis],hname.Data());
164 hisdEdx3D[ihis] =
new TH3D(hname.Data(),hname.Data(), 50, 0.2,25, 10,0,1, 100,20,80);
165 AliTPCcalibBase::BinLogX(hisdEdx3D[ihis]->GetXaxis());
168 hisdEdx3D[ihis]->GetXaxis()->SetTitle(
"p (GeV/c)");
169 hisdEdx3D[ihis]->GetYaxis()->SetTitle(
"dEdx/dEdx_{BB} (a.u.)");
171 hisdEdx3D[ihis]->Write(hname.Data());
182 for (Int_t iDetType=0; iDetType<9; iDetType++){
183 TString detType=
"All";
185 detType=TString::Format(
"Q%s%d",(iDetType-1)/4>0?
"Max":
"Tot",(iDetType-1)%4);
187 for (Int_t ihis=0; ihis<4; ihis++){
188 TString hname= TString::Format(
"RatioP_%s%s3D",detType.Data(),
partName[ihis]);
189 hisdEdx3D[ihis] = (TH3D*)pcstream->
GetFile()->Get(hname.Data());
190 Int_t nbinsP = hisdEdx3D[0]->GetXaxis()->GetNbins();
191 Int_t nbinsTgl = hisdEdx3D[0]->GetYaxis()->GetNbins();
193 for (Int_t ibinP=2; ibinP<nbinsP; ibinP++){
194 for (Int_t ibinTgl=2; ibinTgl<nbinsTgl; ibinTgl++){
196 Double_t pCenter = hisdEdx3D[0]->GetXaxis()->GetBinCenter(ibinP);
197 Double_t tglCenter = hisdEdx3D[0]->GetYaxis()->GetBinCenter(ibinTgl);
198 TH1D * hisProj =hisdEdx3D[ihis]->ProjectionZ(
"xxx", ibinP-1,ibinP+1, ibinTgl-1,ibinTgl+1);
199 Double_t entries = hisProj->GetEntries();
200 if (entries<10)
continue;
201 Double_t mean = hisProj->GetMean();
202 Double_t rms = hisProj->GetRMS();
203 hisProj->Fit(&fg,
"",
"");
204 TVectorD vecFit(3, fg.GetParameters());
205 TVectorD vecFitErr(3, fg.GetParErrors());
206 Double_t
chi2=fg.GetChisquare();
209 Bool_t isAll=(iDetType==0);
210 Bool_t isMax=(iDetType-1)/4>0;
211 Bool_t isTot=(iDetType-1)/4==0;
212 Int_t dType=(iDetType-1)%4;
213 Double_t dEdx = mean*dEdxExp;
215 (*pcstream)<<
"fitdEdxG"<<
224 "entries="<<entries<<
225 "ibinTgl="<<ibinTgl<<
227 "pCenter="<<pCenter<<
228 "tglCenter="<<tglCenter<<
231 "dEdxExp="<<dEdxExp<<
236 "vecFit.="<<&vecFit<<
237 "vecFitErr.="<<&vecFitErr<<
257 treeFit->SetCacheSize(200000000);
258 for (Int_t isMax=0; isMax<=1; isMax++){
259 for (Int_t dType=0; dType<4; dType++){
260 for (Int_t skipKaon=0; skipKaon<=1; skipKaon++){
261 for (Float_t maxP=3; maxP<21; maxP+=3){
262 printf(
"%d\t%d\t%d\t%f\n",isMax,dType,skipKaon,maxP);
279 treeFit->SetCacheSize(200000000);
280 for (Int_t isMax=0; isMax<=1; isMax++){
281 for (Int_t dType=0; dType<4; dType++){
283 for (Int_t tgl=2; tgl<10; tgl++){
284 for (Int_t skipKaon=0; skipKaon<=1; skipKaon++){
285 for (Float_t maxP=3; maxP<21; maxP+=3){
286 printf(
"%d\t%d\t%d\t%d\t%f\n",isMax,dType,tgl,skipKaon,maxP);
312 treeFit->SetCacheSize(100000000);
314 const char *chfitType[4] = {
"dEdx_{BB}=k(#theta)dEdx_{rec}",
315 "dEdx_{BB}=k(#theta)dEdx_{rec}+#Delta(#theta)",
316 "dEdx_{BB}=k(#theta,#phi)dEdx_{rec}+#Delta(#theta,#phi)",
317 "dEdx_{BB}=k(#theta,#phi,1/Q)dEdx_{rec}+#Delta(#theta,#phi,1/Q)",
320 treeFit->SetAlias(
"isOK",
"entries>100&&chi2<80");
321 treeFit->SetAlias(
"dEdxM",
"(vecFit.fElements[1]*dEdxExp)/50.");
322 treeFit->SetAlias(
"dEdxMErr",
"(vecFitErr.fElements[1]*dEdxExp)/50.");
325 Int_t npointsMax=30000000;
327 Double_t chi20=0,chi21=0,chi22=0,chi23=0;
329 TVectorD param0,param1,param2,param3;
330 TMatrixD covar0,covar1,covar2,covar3;
331 TString fstringFast0=
"";
332 fstringFast0+=
"dEdxM++";
334 TString fstringFast=
"";
335 fstringFast+=
"dEdxM++";
336 fstringFast+=
"(1/pCenter)++";
337 fstringFast+=
"(1/pCenter)^2++";
338 fstringFast+=
"(1/pCenter)*dEdxM++";
339 fstringFast+=
"((1/pCenter)^2)*dEdxM++";
342 TCut cutUse=TString::Format(
"isOK&&isMax==%d&&dType==%d&&ibinTgl==%d",isMax,dType,tgl).Data();
343 TCut cutFit=cutUse+TString::Format(
"pCenter<%f",maxP).Data();
344 if (skipKaon) cutFit+=
"pType!=3";
345 TCut cutDraw =
"(ibinP%2)==0";
346 TString *strDeltaFit0 =
TStatToolkit::FitPlane(
treeFit,
"dEdxExp:dEdxMErr", fstringFast0.Data(),cutFit, chi20,
npoints,param0,covar0,-1,0, npointsMax, 1);
347 TString *strDeltaFit1 =
TStatToolkit::FitPlane(
treeFit,
"dEdxExp:dEdxMErr", fstringFast0.Data(),cutFit, chi21,
npoints,param1,covar1,-1,0, npointsMax, 0);
348 TString *strDeltaFit2 =
TStatToolkit::FitPlane(
treeFit,
"dEdxExp:dEdxMErr", fstringFast.Data(),cutFit, chi22,
npoints,param2,covar2,-1,0, npointsMax, 0);
350 fstringFast+=
"(1/pCenter)/dEdxM++";
351 fstringFast+=
"((1/pCenter)^2)/dEdxM++";
352 TString *strDeltaFit3 =
TStatToolkit::FitPlane(
treeFit,
"dEdxExp:dEdxMErr", fstringFast.Data(),cutFit, chi23,
npoints,param3,covar3,-1,0, npointsMax, 0);
354 treeFit->SetAlias(
"fitdEdx0",strDeltaFit0->Data());
355 treeFit->SetAlias(
"fitdEdx1",strDeltaFit1->Data());
356 treeFit->SetAlias(
"fitdEdx2",strDeltaFit2->Data());
357 treeFit->SetAlias(
"fitdEdx3",strDeltaFit3->Data());
359 strDeltaFit0->Tokenize(
"++")->Print();
360 strDeltaFit1->Tokenize(
"++")->Print();
361 strDeltaFit2->Tokenize(
"++")->Print();
362 strDeltaFit3->Tokenize(
"++")->Print();
364 (*pcstream)<<
"fitTheta"<<
368 "skipKaon="<<skipKaon<<
370 "npoints="<<npoints<<
373 "param0.="<<¶m0<<
374 "covar0.="<<&covar0<<
377 "param1.="<<¶m1<<
378 "covar1.="<<&covar1<<
381 "param2.="<<¶m2<<
382 "covar2.="<<&covar2<<
385 "param3.="<<¶m3<<
386 "covar3.="<<&covar3<<
390 TGraphErrors * graphs[4] ={0};
392 TCanvas *canvasdEdxFit =
new TCanvas(
"canvasdEdxFit",
"canvasdEdxFit",800,800);
393 canvasdEdxFit->SetLeftMargin(0.15);
394 canvasdEdxFit->SetRightMargin(0.1);
395 canvasdEdxFit->SetBottomMargin(0.15);
396 canvasdEdxFit->Divide(2,2,0,0);
398 for (Int_t fitType=0; fitType<4; fitType++){
399 canvasdEdxFit->cd(fitType+1);
400 TLegend * legendPart =
new TLegend(0.16+0.1*(fitType%2==0),0.16-0.14*(fitType<2),0.89,0.4,TString::Format(
"%s",chfitType[fitType]));
401 legendPart->SetTextSize(0.05);
402 legendPart->SetBorderSize(0);
403 for (Int_t ihis=3; ihis>=0;ihis--){
405 TString expr= TString::Format(
"100*(dEdxExp-fitdEdx%d)/dEdxExp:pCenter:100*dEdxMErr",fitType);
407 graphs[ihis]->SetMinimum(-5);
408 graphs[ihis]->SetMaximum(5);
409 graphs[ihis]->GetXaxis()->SetTitle(
"#it{p} (GeV/c)");
410 graphs[ihis]->GetXaxis()->SetTitleSize(0.06);
411 graphs[ihis]->GetYaxis()->SetTitleSize(0.06);
412 graphs[ihis]->GetYaxis()->SetTitle(
"#Delta(d#it{E}dx)/d#it{E}dx_{BB}(#beta#gamma) (%)");
413 if (ihis==3) graphs[ihis]->Draw(
"alp");
414 graphs[ihis]->Draw(
"lp");
415 legendPart->AddEntry(graphs[ihis],
partName[ihis],
"p");
420 latexDraw.SetTextSize(0.045);
422 const char *chDType[4]={
"IROC",
"OROC medium",
"OROC long",
"OROC"};
424 if (isMax) latexDraw.DrawLatex(1,4,
"Q_{Max}");
425 if (!isMax) latexDraw.DrawLatex(1,4,
"Q_{tot}");
426 latexDraw.DrawLatex(1,3.5,chDType[dType%4]);
427 latexDraw.DrawLatex(1,3,TString::Format(
"#Theta=%1.1f",tgl/10.));
428 latexDraw.DrawLatex(1,2.5,TString::Format(
"Fit: p_{t}<%1.1f (GeV/c)",maxP));
429 latexDraw.DrawLatex(1,2.,TString::Format(
"Fit: Skip Kaon=%d",skipKaon));
433 canvasdEdxFit->SaveAs(TString::Format(
"fitTransfer_Max%d_Det_%dTheta%d_SkipKaon%d_MaxP%1.0f.pdf",isMax,dType,tgl, skipKaon,maxP));
434 canvasdEdxFit->SaveAs(TString::Format(
"fitTransfer_Max%d_Det_%dTheta%d_SkipKaon%d_MaxP%1.0f.png",isMax,dType,tgl, skipKaon,maxP));
452 treeFit->SetCacheSize(100000000);
454 const char *chfitType[4] = {
"dEdx_{BB}=k(#theta)dEdx_{rec}",
455 "dEdx_{BB}=k(#theta)dEdx_{rec}+#Delta(#theta)",
456 "dEdx_{BB}=k(#theta,#phi)dEdx_{rec}+#Delta(#theta,#phi)",
457 "dEdx_{BB}=k(#theta,#phi,1/Q)dEdx_{rec}+#Delta(#theta,#phi,1/Q)",
460 treeFit->SetAlias(
"isOK",
"entries>100&&chi2<80");
461 treeFit->SetAlias(
"dEdxM",
"(vecFit.fElements[1]*dEdxExp)/50.");
462 treeFit->SetAlias(
"dEdxMErr",
"(vecFitErr.fElements[1]*dEdxExp)/50.");
465 Int_t npointsMax=30000000;
467 Double_t chi20=0,chi21=0,chi22=0,chi23=0;
469 TVectorD param0,param1,param2,param3;
470 TMatrixD covar0,covar1,covar2,covar3;
474 TString fstringFast0=
"";
475 fstringFast0+=
"dEdxM++";
476 fstringFast0+=
"(tglCenter-0.5)++";
477 fstringFast0+=
"(tglCenter-0.5)*dEdxM++";
479 TString fstringFast1=
"";
480 fstringFast1+=
"dEdxM++";
481 fstringFast1+=
"(tglCenter-0.5)++";
482 fstringFast1+=
"(tglCenter-0.5)*dEdxM++";
483 fstringFast1+=
"(tglCenter-0.5)^2++";
484 fstringFast1+=
"((tglCenter-0.5)^2)*dEdxM++";
486 TString fstringFast2=
"";
487 fstringFast2+=
"dEdxM++";
488 fstringFast2+=
"(1/pCenter)++";
489 fstringFast2+=
"(1/pCenter)^2++";
490 fstringFast2+=
"(1/pCenter)*dEdxM++";
491 fstringFast2+=
"((1/pCenter)^2)*dEdxM++";
493 fstringFast2+=
"(tglCenter-0.5)*dEdxM++";
494 fstringFast2+=
"(tglCenter-0.5)*(1/pCenter)++";
495 fstringFast2+=
"(tglCenter-0.5)*(1/pCenter)^2++";
496 fstringFast2+=
"(tglCenter-0.5)*(1/pCenter)*dEdxM++";
497 fstringFast2+=
"(tglCenter-0.5)*((1/pCenter)^2)*dEdxM++";
500 fstringFast2+=
"((tglCenter-0.5)^2)*dEdxM++";
501 fstringFast2+=
"((tglCenter-0.5)^2)*(1/pCenter)++";
502 fstringFast2+=
"((tglCenter-0.5)^2)*(1/pCenter)^2++";
503 fstringFast2+=
"((tglCenter-0.5)^2)*(1/pCenter)*dEdxM++";
504 fstringFast2+=
"((tglCenter-0.5)^2)*((1/pCenter)^2)*dEdxM++";
505 TString fstringFast3=fstringFast2;
507 fstringFast3+=
"(1/pCenter)/dEdxM++";
508 fstringFast3+=
"((1/pCenter)^2)/dEdxM++";
509 fstringFast3+=
"(tglCenter-0.5)*(1/pCenter)/dEdxM++";
510 fstringFast3+=
"(tglCenter-0.5)*((1/pCenter)^2)/dEdxM++";
511 fstringFast3+=
"((tglCenter-0.5)^2)*(1/pCenter)/dEdxM++";
512 fstringFast3+=
"((tglCenter-0.5)^2)*((1/pCenter)^2)/dEdxM++";
516 TCut cutUse=TString::Format(
"isOK&&isMax==%d&&dType==%d",isMax,dType).Data();
517 TCut cutFit=cutUse+TString::Format(
"pCenter<%f",maxP).Data();
518 if (skipKaon) cutFit+=
"pType!=3";
519 TCut cutDraw =
"(ibinP%2)==0";
520 TString *strDeltaFit0 =
TStatToolkit::FitPlane(
treeFit,
"dEdxExp:dEdxMErr", fstringFast0.Data(),cutFit, chi20,
npoints,param0,covar0,-1,0, npointsMax, 1);
521 TString *strDeltaFit1 =
TStatToolkit::FitPlane(
treeFit,
"dEdxExp:dEdxMErr", fstringFast1.Data(),cutFit, chi21,
npoints,param1,covar1,-1,0, npointsMax, 0);
522 TString *strDeltaFit2 =
TStatToolkit::FitPlane(
treeFit,
"dEdxExp:dEdxMErr", fstringFast2.Data(),cutFit, chi22,
npoints,param2,covar2,-1,0, npointsMax, 0);
524 TString *strDeltaFit3 =
TStatToolkit::FitPlane(
treeFit,
"dEdxExp:dEdxMErr", fstringFast3.Data(),cutFit, chi23,
npoints,param3,covar3,-1,0, npointsMax, 0);
526 treeFit->SetAlias(
"fitdEdx0",strDeltaFit0->Data());
527 treeFit->SetAlias(
"fitdEdx1",strDeltaFit1->Data());
528 treeFit->SetAlias(
"fitdEdx2",strDeltaFit2->Data());
529 treeFit->SetAlias(
"fitdEdx3",strDeltaFit3->Data());
531 strDeltaFit0->Tokenize(
"++")->Print();
532 strDeltaFit1->Tokenize(
"++")->Print();
533 strDeltaFit2->Tokenize(
"++")->Print();
534 strDeltaFit3->Tokenize(
"++")->Print();
536 (*pcstream)<<
"fitAll"<<
539 "skipKaon="<<skipKaon<<
541 "npoints="<<npoints<<
544 "param0.="<<¶m0<<
545 "covar0.="<<&covar0<<
548 "param1.="<<¶m1<<
549 "covar1.="<<&covar1<<
552 "param2.="<<¶m2<<
553 "covar2.="<<&covar2<<
556 "param3.="<<¶m3<<
557 "covar3.="<<&covar3<<
561 TGraphErrors * graphs[4] ={0};
563 TCanvas *canvasdEdxFit =
new TCanvas(
"canvasdEdxFit",
"canvasdEdxFit",800,800);
564 canvasdEdxFit->SetLeftMargin(0.15);
565 canvasdEdxFit->SetRightMargin(0.1);
566 canvasdEdxFit->SetBottomMargin(0.15);
567 canvasdEdxFit->Divide(2,2,0,0);
569 for (Int_t fitType=0; fitType<4; fitType++){
570 canvasdEdxFit->cd(fitType+1);
571 TLegend * legendPart =
new TLegend(0.16+0.1*(fitType%2==0),0.16-0.14*(fitType<2),0.89,0.4,TString::Format(
"%s",chfitType[fitType]));
572 legendPart->SetTextSize(0.05);
573 legendPart->SetBorderSize(0);
574 for (Int_t ihis=3; ihis>=0;ihis--){
576 TString expr= TString::Format(
"100*(dEdxExp-fitdEdx%d)/dEdxExp:pCenter:100*dEdxMErr",fitType);
578 graphs[ihis]->SetMinimum(-5);
579 graphs[ihis]->SetMaximum(5);
580 graphs[ihis]->GetXaxis()->SetTitle(
"#it{p} (GeV/c)");
581 graphs[ihis]->GetXaxis()->SetTitleSize(0.06);
582 graphs[ihis]->GetYaxis()->SetTitleSize(0.06);
583 graphs[ihis]->GetYaxis()->SetTitle(
"#Delta(d#it{E}dx)/d#it{E}dx_{BB}(#beta#gamma) (%)");
584 if (ihis==3) graphs[ihis]->Draw(
"alp");
585 graphs[ihis]->Draw(
"lp");
586 legendPart->AddEntry(graphs[ihis],
partName[ihis],
"p");
591 latexDraw.SetTextSize(0.045);
593 const char *chDType[4]={
"IROC",
"OROC medium",
"OROC long",
"OROC"};
595 if (isMax) latexDraw.DrawLatex(1,4,
"Q_{Max}");
596 if (!isMax) latexDraw.DrawLatex(1,4,
"Q_{tot}");
597 latexDraw.DrawLatex(1,3.5,chDType[dType%4]);
598 latexDraw.DrawLatex(1,2.5,TString::Format(
"Fit: p_{t}<%1.1f (GeV/c)",maxP));
599 latexDraw.DrawLatex(1,2.,TString::Format(
"Fit: Skip Kaon=%d",skipKaon));
603 canvasdEdxFit->SaveAs(TString::Format(
"fitTransfer_Max%d_Det_%dSkipKaon%d_MaxP%1.0f.pdf",isMax,dType, skipKaon,maxP));
604 canvasdEdxFit->SaveAs(TString::Format(
"fitTransfer_Max%d_Det_%dSkipKaon%d_MaxP%1.0f.png",isMax,dType, skipKaon,maxP));
613 TTree * treeTheta=(TTree*)pcstream->
GetFile()->Get(
"fitTheta");
614 treeTheta->SetMarkerStyle(25);
615 TTree * treeAll=(TTree*)pcstream->
GetFile()->Get(
"fitAll");
616 treeAll->SetMarkerStyle(25);
static Double_t BetheBlochAleph(Double_t bb, Int_t type=0)
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
void MakeESDCutsPID(Double_t fgeom=1, Double_t fcr=0.85, Double_t fcl=0.7)
TFile * Open(const char *filename, Long64_t &nevents)
Manager and of geomety classes for set: TPC.
static TVectorD * GetBetheBlochParamAlice()
void makeBBfit(Int_t ntracks=100000)
TTreeSRedirector * pcstream
const Float_t markerSize[5]
static void RegisterBBParam(TVectorD *param, Int_t position)
void FitTransferFunctionScanAll()
void FitTransferFunctionScanTheta()
void FitTransferFunctionTheta(Bool_t isMax, Int_t dType, Int_t tgl, Bool_t skipKaon, Double_t maxP, TTreeSRedirector *pcstream, Bool_t doDraw)
void FitTransferFunctionAll(Bool_t isMax, Int_t dType, Bool_t skipKaon, Double_t maxP, TTreeSRedirector *pcstream, Bool_t doDraw)