3 Int_t period=5; // 0=a, 1=b, 2=c
5 .L ~/alice/reconstruction/trunk/QAplots/source/highPt/AnalyzedEdx.C+
7 MakeSelectedArrays(4,4000);
8 FitSelected(10000,100000,year,period);
15 a.) Redo run wise gain calibration. Important for the bad periods
16 b.) Remove runs with outlier peak position.
17 c.) Make sector vise calibration. (To eliminate trigger bias)
29 #include "TTreeStream.h"
30 #include "AliMathBase.h"
33 #include "TDatabasePDG.h"
35 #include "AliTPCcalibBase.h"
38 #include "AliESDtrack.h"
40 #include "AliXRDPROOFtoolkit.h"
46 TTreeSRedirector *pcstream = 0; //new TTreeSRedirector("trend.root");
47 TObjArray * arrayPions=0;
48 TObjArray * arrayProtons=0;
49 TObjArray * arrayElectrons=0;
50 TMatrixD *ppullPionsV0=0;
51 TMatrixD *ppullProtonsV0=0;
52 TMatrixD *ppullElectronsV0=0;
56 //void SetPionAliases();
58 //void AnalyzedEdxFile(const char * fname="");
62 void SelectV0sforPID( const char * finput="highptAll.list"){
64 // Code to select identified V0 for the PID
65 // As an input chain of filter trees is used
67 // finput - name of the list file
69 // file - V0Selected.root
70 TChain * chain = AliXRDPROOFtoolkit::MakeChainRandom(finput,"V0s",0,1000);
71 chain->SetCacheSize(1000000000);
74 Double_t massLambda = pdg.GetParticle("Lambda0")->Mass();
75 Double_t massK0 = pdg.GetParticle("K0")->Mass();
76 Double_t massPion = pdg.GetParticle("pi+")->Mass();
77 Double_t massProton = pdg.GetParticle("proton")->Mass();
80 chain->SetAlias("massPion",Form("(%f+0)",massPion));
81 chain->SetAlias("massProton",Form("(%f+0)",massProton));
82 chain->SetAlias("massK0",Form("(%f+0)",massK0));
83 chain->SetAlias("massLambda",Form("(%f+0)",massLambda));
85 chain->SetAlias("K0Delta","(v0.GetEffMass(2,2)-massK0)");
86 chain->SetAlias("LDelta","(v0.GetEffMass(4,2)-massLambda)");
87 chain->SetAlias("ALDelta","(v0.GetEffMass(2,4)-massLambda)");
88 chain->SetAlias("EDelta","(v0.GetEffMass(0,0))");
90 chain->SetAlias("K0Pull","(v0.GetEffMass(2,2)-massK0)/v0.GetKFInfo(2,2,1)");
91 chain->SetAlias("LPull","(v0.GetEffMass(4,2)-massLambda)/v0.GetKFInfo(4,2,1)");
92 chain->SetAlias("ALPull","(v0.GetEffMass(2,4)-massLambda)/v0.GetKFInfo(2,4,1)");
93 chain->SetAlias("EPull","EDelta/v0.GetKFInfo(0,0,1)");
94 // effective pull of the mass - (empirical values form fits)
95 chain->SetAlias("K0PullEff","K0Delta/sqrt((3.63321e-03)**2+(5.68795e-04*v0.Pt())**2)");
96 chain->SetAlias("LPullEff","LDelta/sqrt((1.5e-03)**2+(1.8e-04*v0.Pt())**2)");
97 chain->SetAlias("ALPullEff","ALDelta/sqrt((1.5e-03)**2+(1.8e-04*v0.Pt())**2)");
98 chain->SetAlias("EPullEff","v0.GetEffMass(0,0)/sqrt((5e-03)**2+(1.e-04*v0.Pt())**2)");
101 chain->SetAlias("dEdx0DProton","AliMathBase::BetheBlochAleph(track0.fIp.P()/massProton)");
102 chain->SetAlias("dEdx1DProton","AliMathBase::BetheBlochAleph(track1.fIp.P()/massProton)");
103 chain->SetAlias("dEdx0DPion","AliMathBase::BetheBlochAleph(track0.fIp.P()/massPion)");
104 chain->SetAlias("dEdx1DPion","AliMathBase::BetheBlochAleph(track1.fIp.P()/massPion)");
108 chain->SetAlias("cutDist","sqrt((track0.fIp.fP[0]-track1.fIp.fP[0])**2+(track0.fIp.fP[1]-track1.fIp.fP[1])**2)>3");
109 chain->SetAlias("cutLong","track0.GetTPCClusterInfo(3,1,0)-5*abs(track0.fP[4])>130&&track1.GetTPCClusterInfo(3,1,0)>130-5*abs(track0.fP[4])");
110 chain->SetAlias("cutPID","track0.fTPCsignal>0&&track1.fTPCsignal>0");
111 chain->SetAlias("cutResol","sqrt(track0.fC[14]/track0.fP[4])<0.15&&sqrt(track1.fC[14]/track1.fP[4])<0.15");
112 chain->SetAlias("cutV0","cutPID&&cutDist&&cutLong&&cutResol");
115 chain->SetAlias("K0Selected", "abs(K0Pull)<3. &&abs(K0PullEff)<3. && abs(LPull)>3 && abs(ALPull)>3 &&v0.PtArmV0()>0.11");
116 chain->SetAlias("LambdaSelected", "abs(LPull)<3. &&abs(LPullEff)<3. && abs(K0Pull)>3 && abs(EPull)>3 && abs(EDelta)>0.05");
117 chain->SetAlias("ALambdaSelected", "abs(ALPull)<3. &&abs(ALPullEff)<3 && abs(K0Pull)>3 && abs(EPull)>3 &&abs(EDelta)>0.05");
119 chain->SetAlias("GammaSelected", "abs(EPull)<3 && abs(K0Pull)>3 && abs(LPull)>3 && abs(ALPull)>3");
121 // Gamma PID selection
127 TFile *fselected = TFile::Open("V0Selected.root","recreate");
128 TTree * treeK0 = chain->CopyTree("type==8&&cutV0&&K0Selected");
129 TTree * treeLambda = chain->CopyTree("type==4&&cutV0&&LambdaSelected");
130 TTree * treeALambda = chain->CopyTree("type==2&&cutV0&&ALambdaSelected");
131 TTree * treeGamma = chain->CopyTree("type==1&&cutV0&&GammaSelected");
133 TTree * trees[4]={treeK0,treeLambda, treeGamma,treeALambda};
134 TList * aliases = chain->GetListOfAliases();
135 Int_t nalias= aliases->GetEntries();
137 for (Int_t i=0; i<4; i++){
138 for (Int_t ialias=0; ialias<nalias; ialias++){
139 TNamed *alias = (TNamed*)aliases->At(ialias);
140 trees[i]->SetAlias(alias->GetName(),alias->GetTitle());
143 treeK0->Write("treeK0");
144 treeLambda->Write("treeLambda");
145 treeALambda->Write("treeALambda");
146 treeGamma->Write("treeGamma");
153 Double_t GetPullMass(AliESDv0 * v0, Int_t p0, Int_t p1, Int_t pdgCode){
156 // Test values: p0=2; p1=2; pdgCode=321
158 TDatabasePDG *pdg= TDatabasePDG::Instance();
159 Double_t pdgMass = pdg->GetParticle(pdgCode)->Mass();
160 Double_t recMass = v0->GetKFInfo(p0,p1, 0);
161 Double_t rmsMass = v0->GetKFInfo(p0,p1, 1);
162 if (rmsMass<=0) return -1;
163 return (recMass-pdgMass)/rmsMass;
168 void MakeSelectedArrays(Int_t scaling=20, const Int_t maxEntries=10000){
170 // Select pions, proton and electron based on the V0 information
171 // Selected tracks are written to the array in parallel with the V0 pull information
176 TFile *fselected = TFile::Open("V0Selected.root");
177 TTree * treeK0= (TTree*)fselected->Get("treeK0");
178 TTree * treeLambda= (TTree*)fselected->Get("treeLambda");
179 TTree * treeALambda= (TTree*)fselected->Get("treeALambda");
180 TTree * treeGamma= (TTree*)fselected->Get("treeGamma");
181 Int_t entriesK0= treeK0->GetEntries();
182 Int_t entriesLambda= treeLambda->GetEntries();
183 Int_t entriesALambda= treeALambda->GetEntries();
184 Int_t entriesGamma= treeGamma->GetEntries();
187 arrayPions=new TObjArray(entriesK0*2+entriesLambda+entriesALambda);
188 arrayProtons=new TObjArray(entriesLambda+entriesALambda);
189 arrayElectrons=new TObjArray(entriesGamma*2);
191 ppullElectronsV0=new TMatrixD(entriesGamma*2,2);
192 ppullPionsV0=new TMatrixD(entriesK0*2+entriesLambda+entriesALambda,2);
193 ppullProtonsV0=new TMatrixD(entriesLambda+entriesALambda,2);
194 TMatrixD & pullElectronsV0=*ppullElectronsV0;
195 TMatrixD & pullPionsV0=*ppullPionsV0;
196 TMatrixD & pullProtonsV0=*ppullProtonsV0;
198 // Use K0s, Lambda and ALambda to select pions
200 AliESDtrack * track0=0, *track1=0;
202 treeK0->SetBranchAddress("track0.",&track0);
203 treeK0->SetBranchAddress("track1.",&track1);
204 treeK0->SetBranchAddress("v0.",&v0);
206 treeLambda->SetBranchAddress("track0.",&track0);
207 treeLambda->SetBranchAddress("track1.",&track1);
208 treeLambda->SetBranchAddress("v0.",&v0);
210 treeALambda->SetBranchAddress("track0.",&track1);
211 treeALambda->SetBranchAddress("track1.",&track0);
212 treeALambda->SetBranchAddress("v0.",&v0);
214 treeGamma->SetBranchAddress("track0.",&track1);
215 treeGamma->SetBranchAddress("track1.",&track0);
216 treeGamma->SetBranchAddress("v0.",&v0);
218 Int_t counterPions=0;
219 Int_t counterProtons=0;
220 Int_t counterElectrons=0;
222 TH2F *hisPionPt = new TH2F("hisPionPt","hisPionPt", 20,0.2,20,20,-1,1);
223 TH2F *hisProtonPt = new TH2F("hisProtonPt","hisProtonPt", 20,0.2,20,20,-1,1);
224 TH2F *hisElectronPt = new TH2F("hisElectronPt","hisElectronPt", 20,0.2,20,20,-1,1);
226 AliTPCcalibBase::BinLogX(hisPionPt->GetXaxis());
227 AliTPCcalibBase::BinLogX(hisProtonPt->GetXaxis());
228 AliTPCcalibBase::BinLogX(hisElectronPt->GetXaxis());
234 for (Int_t iv0=0; iv0<entriesK0/scaling; iv0++){
235 treeK0->GetEntry(iv0);
236 Double_t pullK0= GetPullMass(v0,2,2,kK0);
238 hisPionPt->Fill(track0->Pt(),track0->GetTgl());
239 Int_t bin = hisPionPt->FindBin(track0->Pt(),track0->GetTgl());
240 Int_t entriesPt=(bin>0)? hisPionPt->GetBinContent(bin):0;
241 if (entriesPt< maxEntries) {
242 pullPionsV0(counterPions,0) =pullK0;
243 arrayPions->AddAt(track0->Clone(),counterPions); counterPions++;
246 hisPionPt->Fill(track1->Pt(), track1->GetTgl());
247 bin = hisPionPt->FindBin(track1->Pt(),track1->GetTgl());
248 entriesPt=(bin>0)? hisPionPt->GetBinContent(bin):0;
249 if (entriesPt< maxEntries) {
250 pullPionsV0(counterPions,0) =pullK0;
251 arrayPions->AddAt(track1->Clone(),counterPions);
254 if (iv0%200==0) printf("K0s %d\t%d\n",iv0, counterPions);
259 for (Int_t ilambda=0; ilambda<=1; ilambda++){
260 TTree * treeL = (ilambda==0)? treeLambda: treeALambda;
261 Int_t entriesTree=treeL->GetEntries();
262 for (Int_t iv0=0; iv0<entriesTree/scaling; iv0++){
263 treeL->GetEntry(iv0);
264 Double_t pullLambda= 0;
265 if (ilambda==0) pullLambda=GetPullMass(v0,4,2,kLambda0);
266 if (ilambda==0) pullLambda=GetPullMass(v0,2,4,kLambda0);
267 // 1 Additional cut on Gammas
268 if (TMath::Abs(v0->GetEffMass(0,0))<0.05) continue;
270 hisPionPt->Fill(track1->Pt(), track1->GetTgl());
271 Int_t bin = hisPionPt->FindBin(track1->Pt(),track1->GetTgl());
272 Int_t entriesPt=(bin>0)? hisPionPt->GetBinContent(bin):0;
273 if (entriesPt< maxEntries) {
274 arrayPions->AddAt(track1->Clone(),counterPions);
275 pullPionsV0(counterPions,0) =pullLambda;
279 hisProtonPt->Fill(track0->Pt(), track0->GetTgl());
280 bin = hisProtonPt->FindBin(track0->Pt(),track0->GetTgl());
281 entriesPt=(bin>0)? hisProtonPt->GetBinContent(bin):0;
282 if (entriesPt< maxEntries) {
283 arrayProtons->AddAt(track0->Clone(),counterProtons);
284 pullProtonsV0(counterProtons,0) =pullLambda;
287 if (iv0%200==0) printf("Lambda Protons %d\t%d\t%d\n",ilambda, iv0,counterProtons);
291 // Electrons selection
294 Int_t nel= treeGamma->Draw("track0.fTPCsignal","abs(track0.fTPCsignal/track1.fTPCsignal-1)<0.05","goff",10000);
295 Double_t meanElectron0=0, sigmaElectron0=0, meanElectron1 =0 , sigmaElectron1=0;
296 AliMathBase::EvaluateUni(nel, treeGamma->GetV1(),meanElectron0,sigmaElectron0,0.55*nel);
297 nel= treeGamma->Draw("track1.fTPCsignal",Form("abs(track0.fTPCsignal-%f)<%f&&abs(track0.fTPCsignal/track1.fTPCsignal-1)<0.15",meanElectron0,sigmaElectron0),"goff",10000);
298 AliMathBase::EvaluateUni(nel, treeGamma->GetV1(),meanElectron1,sigmaElectron1,0.55*nel);
300 for (Int_t iv0=0; iv0<entriesGamma/scaling; iv0++){
301 treeGamma->GetEntry(iv0);
302 Double_t pullGamma= GetPullMass(v0,0,0,kGamma);
305 hisElectronPt->Fill(track0->Pt(), track0->GetTgl());
306 Int_t bin = hisElectronPt->FindBin(track0->Pt(),track0->GetTgl());
307 Int_t entriesPt=(bin>0)? hisElectronPt->GetBinContent(bin):0;
308 if (entriesPt< maxEntries && TMath::Abs(track1->GetTPCsignal()-meanElectron1)<sigmaElectron1) {
309 arrayElectrons->AddAt(track0->Clone(),counterElectrons);
310 pullElectronsV0(counterElectrons,0) =pullGamma;
313 hisElectronPt->Fill(track1->Pt(), track1->GetTgl());
314 bin = hisElectronPt->FindBin(track1->Pt(),track1->GetTgl());
315 entriesPt=(bin>0)? hisElectronPt->GetBinContent(bin):0;
316 if (entriesPt< maxEntries && TMath::Abs(track0->GetTPCsignal()-meanElectron1)<sigmaElectron1) {
317 arrayElectrons->AddAt(track1->Clone(),counterElectrons);
318 pullElectronsV0(counterElectrons,0) =pullGamma;
321 if (iv0%100==0) printf("Electrons %d\t%d\n",iv0, counterElectrons);
331 AliESDtrack * track0=0;
332 TChain * chainHPT = AliXRDPROOFtoolkit::MakeChainRandom("highptAll.list","highPt",0,1000);
333 Int_t entriesHPT = chainHPT->GetEntries();
334 chainHPT->SetCacheSize(1000000000);
335 chainHPT->SetBranchAddress("esdTrack.",&track0);
336 TBranch * branchFlags = chainHPT->GetBranch("esdTrack.fFlags");
337 // TBranch * branchTOFSignal = chainHPT->GetBranch("esdTrack.fITSsignal");
338 TBranch * branchTOFSignalDX = chainHPT->GetBranch("esdTrack.fTOFsignalDx");
339 TBranch * branchParam = chainHPT->GetBranch("esdTrack.AliExternalTrackParam.fP[5]");
340 TBranch * branchTrack = chainHPT->GetBranch("esdTrack.");
343 for (Int_t i=0; i<entriesHPT; i++){
345 if (i%100000==0) printf("Entrye\t %d\t%f\n",i,counter);
346 branchFlags->GetEntry(i);
347 if (track0->IsOn(0x4)==0) continue;
349 branchTOFSignalDX->GetEntry(i);
350 if (track0->GetTOFsignalDx()>3) continue;
352 branchParam->GetEntry(i);
353 if (TMath::Abs(track0->GetParameter()[4])<0.25) continue;
354 branchTrack->GetEntry(i);
356 //esdTrack.fITSncls>4&&abs(esdTrack.fTOFsignalDx**2+esdTrack.fTOFsignalDz**2)<3&&esdTrack.fTOFsignal<esdTrack.fTrackTime[3]-400&&abs(esdTrack.fTOFsignal-esdTrack.fTrackTime[2])<300"
359 // chainHPT->Draw("esdTrack.fTPCsignal:esdTrack.P()>>his(60,0.3,6,50,30,200)","esdTrack.fITSncls>4&&abs(esdTrack.fTOFsignalDx**2+esdTrack.fTOFsignalDz**2)<4*(1+abs(esdTrack.fP[4]))&&esdTrack.fTOFsignal>esdTrack.fTrackTime[3]+500&&abs(esdTrack.fTOFsignal-esdTrack.fTrackTime[4])<4*(100+abs(esdTrack.fP[4])*100)","colz",10000000);
361 if (counter%100==0) printf("%d\t%d\t%f\n",i, counter,track0->GetTOFsignal());
371 void FitSelected( const Int_t ngener=1000, const Int_t maxEntries=10000, Int_t year=0, Int_t period=0){
373 // 1. fit the roubust means and the
376 TVectorD vecPt0(maxEntries);
377 TVectorD vecP(maxEntries);
378 TVectorD vecTheta(maxEntries);
379 TVectorD vecdEdxTheor(maxEntries);
381 TVectorD vecdEdx0(maxEntries);
382 TVectorD vecdEdx1(maxEntries);
383 TVectorD vecdEdx2(maxEntries);
384 TVectorD vecdEdxTRD(maxEntries);
385 TVectorD vecdEdxOROC(maxEntries);
386 TVectorD vecdEdxAll(maxEntries);
387 TVectorD * vecArray[6]={&vecdEdx0, &vecdEdx1, &vecdEdx2, &vecdEdxTRD, &vecdEdxOROC, &vecdEdxAll};
388 TVectorD vecMeanTrunc60(6);
389 TVectorD vecRMSTrunc60(6);
390 TVectorD vecMeanTrunc80(6);
391 TVectorD vecRMSTrunc80(6);
392 TVectorD vecMeanTrunc(6);
393 TVectorD vecRMSTrunc(6);
394 TVectorD vecMeanTruncAll(6);
395 TVectorD vecRMSTruncAll(6);
396 TVectorD vecSelected(6);
401 Double_t massPion = pdg.GetParticle("pi+")->Mass();
402 Double_t massProton = pdg.GetParticle("proton")->Mass();
403 Double_t massElectron = pdg.GetParticle("e+")->Mass();
405 TTreeSRedirector * pcstream = new TTreeSRedirector("pidDEDX.root","recreate");
409 for (Int_t isel=0; isel<ngener; isel++){
410 Double_t mcp=gRandom->Rndm()*20;
411 Double_t mctheta=2*(gRandom->Rndm()-0.5);
412 Int_t ipid= TMath::Nint(gRandom->Rndm()*3.);
413 Double_t mass=massPion;
414 TObjArray *arrayTrack = arrayPions;
415 if (ipid==1) {arrayTrack=arrayProtons; mass=massProton;}
416 if (ipid==2) {arrayTrack=arrayElectrons; mass=massElectron;}
417 Int_t entriesArray= arrayTrack->GetEntries();
420 Int_t nselectedArray[6]={0};
421 TVectorD vselectedArray(6);
423 // 1. First loop - select the tracks which fullfill the pt and theta criteria
425 for (Int_t itrack=0; itrack<entriesArray; itrack++){
426 AliESDtrack * track = (AliESDtrack*)arrayTrack->At(itrack);
427 if (!track) continue;
428 if (!track->GetInnerParam()) continue;
429 if (TMath::Abs(track->P()/mcp-1)>0.15) continue; // pt selection
430 if (TMath::Abs(track->GetTgl()-mctheta)>0.15) continue; // theta selection
431 Double_t mom = track->GetInnerParam()->P();
432 Double_t dEdxTheor=50*AliMathBase::BetheBlochAleph(mom/mass);
434 vecPt0[nselected]=track->Pt();
436 vecTheta[nselected]=track->GetTgl();
437 vecdEdxTheor[nselected]=dEdxTheor;
439 if (track->GetTPCdEdxInfo()){
440 vecdEdx0[nselectedArray[0]++]=track->GetTPCdEdxInfo()->GetSignal(0)/dEdxTheor;
441 vecdEdx1[nselectedArray[1]++]=track->GetTPCdEdxInfo()->GetSignal(1)/dEdxTheor;
442 vecdEdx2[nselectedArray[2]++]=track->GetTPCdEdxInfo()->GetSignal(2)/dEdxTheor;
443 vecdEdxOROC[nselectedArray[4]++]=track->GetTPCdEdxInfo()->GetSignal(3)/dEdxTheor;
445 if (track->GetTRDsignal()>0 && track->GetTRDncls()>80){
446 vecdEdxTRD[nselectedArray[3]++]=50.*track->GetTRDsignal()/dEdxTheor;
448 vecdEdxAll[nselectedArray[5]++]=track->GetTPCsignal()/dEdxTheor;
451 for (Int_t idedx=0; idedx<6; idedx++) vselectedArray[idedx]=nselectedArray[idedx];
452 if (nselected <20) continue;
454 Double_t meanPt=TMath::Mean(nselected,vecPt0.GetMatrixArray());
455 Double_t meanP=TMath::Mean(nselected,vecP.GetMatrixArray());
456 Double_t meanTheta=TMath::Mean(nselected,vecTheta.GetMatrixArray());
457 Double_t meanTheor=TMath::Mean(nselected,vecdEdxTheor.GetMatrixArray());
458 Double_t meanRob, rmsRob;
460 for (Int_t idet=0; idet<6; idet++){
461 vecMeanTrunc60[idet]=0;
462 vecRMSTrunc60[idet]=0;
463 vecMeanTrunc80[idet]=0;
464 vecRMSTrunc80[idet]=0;
465 vecMeanTruncAll[idet]=0;
466 vecRMSTruncAll[idet]=0;
467 if (nselectedArray[idet]<20) continue;
468 AliMathBase::EvaluateUni( nselectedArray[idet], vecArray[idet]->GetMatrixArray(), meanRob, rmsRob, nselectedArray[idet]*0.6);
469 vecMeanTrunc60[idet]=meanRob;
470 vecRMSTrunc60[idet]=rmsRob;
471 AliMathBase::EvaluateUni( nselectedArray[idet], vecArray[idet]->GetMatrixArray(), meanRob, rmsRob, nselectedArray[idet]*0.8);
472 vecMeanTrunc80[idet]=meanRob;
473 vecRMSTrunc80[idet]=rmsRob;
474 vecMeanTruncAll[idet]= TMath::Mean(nselectedArray[idet],vecArray[idet]->GetMatrixArray());
475 vecRMSTruncAll[idet] = TMath::RMS(nselectedArray[idet],vecArray[idet]->GetMatrixArray());
478 if (isel%10==0) printf("%d\n",isel);
479 Double_t dEdxTheorMeanP = AliMathBase::BetheBlochAleph(meanP/mass);
480 Double_t dEdxTheorCenterP = AliMathBase::BetheBlochAleph(mcp/mass);
482 "ipid="<<ipid<< // pid type -0 pion, 1- proton, 2 electron
483 "nAll="<<nselected<< // number of primary points
484 "year="<<year<< // year
485 "period="<<period<< // period
487 "dEdxTheorMean="<<meanTheor<< // initial dEdx hypothesis - mean over given bin
488 "dEdxTheorMeanP="<<dEdxTheorMeanP<< // initial dEdx hypothesis - for mean momenta
489 "dEdxTheorCenterP="<<dEdxTheorCenterP<< // initial dEdx hypothesis - for central momenta
491 "p="<<mcp<< // center of bin for particle momentum
492 "theta="<<mctheta<< // particle theta
494 "mass="<<mass<< // mass of particle
495 "meanPt="<<meanPt<< // mean pt in bin
497 "meanTheta="<<meanTheta<<
499 "dedxMean60.="<<&vecMeanTrunc60<<
500 "dedxRMS60.="<<&vecRMSTrunc60<<
501 "dedxMean80.="<<&vecMeanTrunc80<<
502 "dedxRMS80.="<<&vecRMSTrunc80<<
503 "dedxMeanAll.="<<&vecMeanTruncAll<<
504 "dedxRMSAll.="<<&vecRMSTruncAll<<
523 pcstream = new TTreeSRedirector("trend.root","recreate");
524 TString flist = gSystem->GetFromPipe("cat highpt.list");
525 TObjArray * array = flist.Tokenize("\n");
527 Int_t entries = array->GetEntries();
528 for (Int_t ifile=0; ifile<entries; ifile++){
529 //TString name = array->At(ifile)->GetName();
531 printf("Analyzing:\t%d\t%s\n", ifile,array->At(ifile)->GetName());
532 AnalyzedEdxFile(Form("%s#FilterEvents_Trees.root",array->At(ifile)->GetName()));
538 void AnalyzedEdxFile(const char * fname){
541 const char * fname="/hera/alice/local/filtered/alice/data/2013/LHC13e/000196201/vpass1/root_archive.zip#FilterEvents_Trees.root";
542 const char * fname="/hera/alice/local/filtered/alice/data/2013/LHC13c/000195531/ESDs/pass1/root_archive.zip#FilterEvents_Trees.root";
545 TFile * fin=TFile::Open(fname);
547 printf("File\t%s not existing\n",fname);
550 TTree * treeIn = (TTree*)fin->Get("highPt");
552 printf("Tree \t%s not existing\n",fname);
555 treeIn->SetCacheSize(1000000000.0);
556 // TFile *fout = TFile::Open("aaa.root","recreate");
558 tree =treeIn->CopyTree("esdTrack.fITSncls>0||(esdTrack.fTOFsignal<100000-1)","",50000);
560 if (tree->GetEntries()<2000) return;
565 void SetPionAliases(){
567 // Select the tracks with higher dEdx - at high momenta it is used in order to get clean sample of Pions
568 // IROC selection used to select sample for OROC
569 // OROC selection used to select sample for IROC
572 tree->SetAlias("pionOROC","(1+0)");
573 tree->SetAlias("pionIROC","(1+0)");
575 Double_t mean=0, sigma=0;
576 entries = tree->Draw("runNumber","","goff",1000);
577 run = tree->GetV1()[0];
578 {for (Int_t iter=0; iter<2; iter++){
579 entries = tree->Draw("esdTrack.fTPCdEdxInfo.fTPCsignalRegion[3]/AliMathBase::BetheBlochAleph(esdTrack.P()/0.1)>>his","esdTrack.fTPCdEdxInfo.fTPCsignalRegion[3]>0&&pionIROC", "goff");
580 AliMathBase::EvaluateUni(entries, tree->GetV1(), mean,sigma, 0.6*entries);
581 tree->SetAlias("pionOROC",Form("esdTrack.fTPCdEdxInfo.fTPCsignalRegion[3]/AliMathBase::BetheBlochAleph(esdTrack.P()/0.1)-%f>%f",mean,0.0*sigma));
582 entries = tree->Draw("esdTrack.fTPCdEdxInfo.fTPCsignalRegion[0]/AliMathBase::BetheBlochAleph(esdTrack.P()/0.1)>>his","esdTrack.fTPCdEdxInfo.fTPCsignalRegion[0]>0&&pionOROC", "goff");
583 AliMathBase::EvaluateUni(entries, tree->GetV1(), mean,sigma, 0.6*entries);
584 tree->SetAlias("pionIROC",Form("esdTrack.fTPCdEdxInfo.fTPCsignalRegion[0]/AliMathBase::BetheBlochAleph(esdTrack.P()/0.1)-%f>%f",mean,0.0*sigma));
586 printf("%s\n",tree->GetAlias("pionIROC"));
587 printf("%s\n",tree->GetAlias("pionOROC"));
595 // fit dEdx/eta for "identified high pt pions"
597 TF1 f1IROC("f1IROC","pol1");
598 TF1 f1OROC("f1IROC","pol1");
599 TVectorD vectorIROC(2);
600 TVectorD vectorOROC(2);
603 TObjArray fitIROC(3);
604 TObjArray fitOROC(3);
605 tree->Draw("esdTrack.fTPCdEdxInfo.fTPCsignalRegion[3]/AliMathBase::BetheBlochAleph(esdTrack.P()/0.1):abs(esdTrack.fP[3])>>hisOROC(5,0,1,100,20,80)","esdTrack.fTPCncls>70&&pionIROC","colz");
606 hisOROC = (TH2*)tree->GetHistogram()->Clone();
607 tree->Draw("esdTrack.fTPCdEdxInfo.fTPCsignalRegion[0]/AliMathBase::BetheBlochAleph(esdTrack.P()/0.1):abs(esdTrack.fP[3])>>hisIROC(5,0,1,100,20,80)","esdTrack.fTPCncls>70&&pionOROC","colz");
608 hisIROC = (TH2*)tree->GetHistogram()->Clone();
609 hisOROC->FitSlicesY(0,0,-1,0,"QNR",&fitOROC);
610 hisIROC->FitSlicesY(0,0,-1,0,"QNR",&fitIROC);
613 for (Int_t ihis=0; ihis<3; ihis++){
614 phisOROC[ihis]=(TH1*)fitOROC.At(ihis);
615 phisIROC[ihis]=(TH1*)fitIROC.At(ihis);
618 phisOROC[1]->SetMarkerColor(2);
619 phisOROC[1]->SetMarkerStyle(25);
620 phisIROC[1]->SetMarkerColor(2);
621 phisIROC[1]->SetMarkerStyle(25);
622 phisOROC[1]->Fit(&f1OROC);
623 f1OROC.GetParameters(vectorOROC.GetMatrixArray());
625 phisIROC[1]->Fit(&f1IROC);
626 f1IROC.GetParameters(vectorIROC.GetMatrixArray());
629 (*pcstream)<<"dedxFit"<<
631 "hisIROC1.="<<phisIROC[1]<< // IROC - dEdx/dEdxExp - mean as function of theta
632 "hisIROC2.="<<phisIROC[2]<< // IROC - dEdx/dEdxExp - RMS as function of the theta
633 "hisOROC1.="<<phisOROC[1]<< // OROC - dEdx/dEdxExp - mean as function of theta
634 "hisOROC2.="<<phisOROC[2]<< // OROC - dEdx/dEdxExp - RMS as function of theta
635 "fIROC.="<<&vectorIROC<< // IROC vector with fit parameters mean (at 0 theta) and splope IROC
636 "fOROC.="<<&vectorOROC<< // OROC vector
637 "f1IROC.="<<&f1IROC<<
638 "f1OROC.="<<&f1OROC<<
642 //resolution at given bin divided
645 TStatToolkit::MakeGraphSparse(chain,"hisOROC2.fArray[1]/hisOROC1.fArray[1]:run","",25,1,0)->Draw("alp");
646 TStatToolkit::MakeGraphSparse(chain,"hisIROC2.fArray[1]/hisIROC1.fArray[1]:run","",25,1,0)->Draw("alp")
648 TStatToolkit::MakeGraphSparse(chain,"fIROC.fElements[0]+fIROC.fElements[1]*0.5:run","",25,1,0)->Draw("alp");
657 //pdg.GetParticle("Lambda0")->Mass
660 Double_t massLambda = pdg.GetParticle("Lambda0")->Mass();
661 Double_t massK0 = pdg.GetParticle("K0")->Mass();
662 Double_t massPion = pdg.GetParticle("pi+")->Mass();
663 Double_t massProton = pdg.GetParticle("proton")->Mass();
665 chain->SetAlias("massPion",Form("(%f+0)",massPion));
666 chain->SetAlias("massProton",Form("(%f+0)",massProton));
667 chain->SetAlias("massK0",Form("(%f+0)",massK0));
668 chain->SetAlias("massLambda",Form("(%f+0)",massLambda));
669 chain->SetAlias("K0Pull","(v0.GetEffMass(2,2)-massK0)/v0.GetKFInfo(2,2,1)");
670 chain->SetAlias("LPull","(v0.GetEffMass(4,2)-massLambda)/v0.GetKFInfo(4,2,1)");
671 chain->SetAlias("K0sel", "abs(v0.GetEffMass(2,2)-massK0)<min(abs(v0.GetEffMass(4,2)-massLambda), abs(v0.GetEffMass(2,4)-massLambda))&&abs(K0Pull)<3");
675 chain->Draw("track0.fTPCsignal/AliMathBase::BetheBlochAleph(track0.fIp.P()/massPion)>>hisP(50,20,80)","K0sel","");
676 chain->Draw("track1.fTPCsignal/AliMathBase::BetheBlochAleph(track1.fIp.P()/massPion)>>+hisN(50,20,80)","K0sel","");
678 chain->Draw("track0.fTPCsignal/AliMathBase::BetheBlochAleph(track0.fIp.P()/massPion):track0.fIp.P()>>his(20,0,10,100,30,70)","K0sel","colz");
681 TH3F * hisBGPion3D = new TH3F("hisBGPion3D","hisBGPion3D",40,0.5,200,4,0,1,100,30,70);
682 TH3F * hisBGProton3D = new TH3F("hisBGProton3D","hisBGProton3D",40,0.5,200,4,0,1,100,30,70);
683 AliTPCcalibBase::BinLogX(hisBGPion3D->GetXaxis());
684 AliTPCcalibBase::BinLogX(hisBGProton3D->GetXaxis());
686 chain->Draw("track0.fTPCsignal/AliMathBase::BetheBlochAleph(track0.fIp.P()/massPion):abs(track0.fIp.fP[3]):track0.fIp.P()/massPion>>hisBGPion3D","K0sel||(track0.fTOFr[2]+track0.fTOFr[1])>0.6","");
687 chain->Draw("track0.fTPCsignal/AliMathBase::BetheBlochAleph(track0.fIp.P()/massProton):abs(track0.fIp.fP[3]):track0.fIp.P()/massProton>>hisBGProton3D","(!K0sel&&abs(LPull)<1.5)||track0.fTOFr[4]>0.6","");
690 TTreeSRedirector *pcstream = new TTreeSRedirector("bb.root","recreate");
691 TVectorD vecPionMean(4),vecPionRMS(4), vecPionEntries(4);
692 TVectorD vecProtonMean(4),vecProtonRMS(4), vecProtonEntries(4);
693 TVectorD vecTheta(4);
694 {for (Int_t ibg=2; ibg<38; ibg++){
695 for (Int_t itheta=0; itheta<4; itheta++){
696 TH1 * hisPion = hisBGPion3D->ProjectionZ("hisPion",ibg-1, ibg+1, itheta+1, itheta+1);
697 TH1 * hisProton = hisBGProton3D->ProjectionZ("hisProton",ibg-1, ibg+1, itheta+1, itheta+1);
698 hisPion->Fit("gaus");
699 vecPionMean[itheta]=gaus->GetParameter(1);
700 vecPionRMS[itheta]=gaus->GetParameter(2);
701 vecPionEntries[itheta]=hisPion->GetEntries();
702 hisProton->Fit("gaus");
703 vecProtonMean[itheta]=gaus->GetParameter(1);
704 vecProtonRMS[itheta]=gaus->GetParameter(2);
705 vecProtonEntries[itheta]=hisProton->GetEntries();
706 vecTheta[itheta]=hisBGPion3D->GetXaxis()->GetBinCenter(itheta);
711 Double_t bg = hisBGPion3D->GetXaxis()->GetBinCenter(ibg);
712 Double_t dEdxRef = AliMathBase::BetheBlochAleph(bg);
715 "dedxRef="<<dEdxRef<<
717 "pionMean.="<<&vecPionMean<<
718 "pionRMS.="<<&vecPionRMS<<
719 "pionEntries.="<<&vecPionEntries<<
720 "protonMean.="<<&vecProtonMean<<
721 "protonRMS.="<<&vecProtonRMS<<
722 "protonEntries.="<<&vecProtonEntries<<
731 hisBGPion->FitSlicesY();
732 hisBGProton->FitSlicesY();
734 hisBGPion_1->SetMarkerStyle(25);
735 hisBGProton_1->SetMarkerStyle(25);
736 hisBGPion_1->SetMarkerColor(2);
737 hisBGProton_1->SetMarkerColor(4);
740 hisBGProton_1->Draw("same");
750 TChain * chain = AliXRDPROOFtoolkit::MakeChainRandom("/hera/alice/miranov/highptAll.list","V0s",0,1000);
751 chain->SetCacheSize(1000000000);
753 TChain * chainHPT = AliXRDPROOFtoolkit::MakeChainRandom("/hera/alice/miranov/highptAll.list","highPt",0,1000);
754 chainHPT->SetCacheSize(1000000000);
755 // for Kaons not good referenece data
756 TFile ftofSelected("tofSelected.root","recreate");
757 TTree * treeTOF = chainHPT->CopyTree("abs(esdTrack.fTOFsignalDz)<5&&abs(esdTrack.fTOFsignalDx)<5&&esdTrack.fITSncls>0&&abs(1/esdTrack.fP[4])<2");
758 treeTOF->Write("treeTOF");
759 //ftofSelected.Write();
768 void DrawdEdxRatio(){
770 //pdg.GetParticle("Lambda0")->Mass
773 Double_t massLambda = pdg.GetParticle("Lambda0")->Mass();
774 Double_t massK0 = pdg.GetParticle("K0")->Mass();
775 Double_t massPion = pdg.GetParticle("pi+")->Mass();
776 Double_t massProton = pdg.GetParticle("proton")->Mass();
778 chain->SetAlias("massPion",Form("(%f+0)",massPion));
779 chain->SetAlias("massProton",Form("(%f+0)",massProton));
780 chain->SetAlias("massK0",Form("(%f+0)",massK0));
781 chain->SetAlias("massLambda",Form("(%f+0)",massLambda));
782 chain->SetAlias("K0Pull","(v0.GetEffMass(2,2)-massK0)/v0.GetKFInfo(2,2,1)");
783 chain->SetAlias("LPull","(v0.GetEffMass(4,2)-massLambda)/v0.GetKFInfo(4,2,1)");
784 chain->SetAlias("K0sel", "abs(v0.GetEffMass(2,2)-massK0)<min(abs(v0.GetEffMass(4,2)-massLambda), abs(v0.GetEffMass(2,4)-massLambda))&&abs(K0Pull)<3");
791 TH3F * hisBGPion3DR1 = new TH3F("hisBGPion3DR1","hisBGPion3DR1",40,0.5,200,4,0,1,100,0.5,1.5);
792 TH3F * hisBGProton3DR1 = new TH3F("hisBGProton3DR1","hisBGProton3DR1",40,0.5,200,4,0,1,100,0.5,1.5);
793 TH3F * hisBGPion3DR2 = new TH3F("hisBGPion3DR2","hisBGPion3DR2",40,0.5,200,4,0,1,100,0.5,1.5);
794 TH3F * hisBGProton3DR2 = new TH3F("hisBGProton3DR2","hisBGProton3DR2",40,0.5,200,4,0,1,100,0.5,1.5);
795 AliTPCcalibBase::BinLogX(hisBGPion3DR1->GetXaxis());
796 AliTPCcalibBase::BinLogX(hisBGProton3DR1->GetXaxis());
797 AliTPCcalibBase::BinLogX(hisBGPion3DR2->GetXaxis());
798 AliTPCcalibBase::BinLogX(hisBGProton3DR2->GetXaxis());
800 chain->Draw("track0.fTPCdEdxInfo.fTPCsignalRegion[1]/track0.fTPCdEdxInfo.fTPCsignalRegion[0]:abs(track0.fIp.fP[3]):track0.fIp.P()/massPion>>hisBGPion3DR1","K0sel||(track0.fTOFr[2]+track0.fTOFr[1])>0.6","");
801 chain->Draw("track0.fTPCdEdxInfo.fTPCsignalRegion[2]/track0.fTPCdEdxInfo.fTPCsignalRegion[0]:abs(track0.fIp.fP[3]):track0.fIp.P()/massPion>>hisBGPion3DR2","K0sel||(track0.fTOFr[2]+track0.fTOFr[1])>0.6","");
805 chain->Draw("track0.fTPCdEdxInfo.fTPCsignalRegion[1]/track0.fTPCdEdxInfo.fTPCsignalRegion[0]:abs(track0.fIp.fP[3]):track0.fIp.P()/massProton>>hisBGProton3DR1","(!K0sel&&abs(LPull)<1.5)||track0.fTOFr[4]>0.6","");
806 chain->Draw("track0.fTPCdEdxInfo.fTPCsignalRegion[2]/track0.fTPCdEdxInfo.fTPCsignalRegion[0]:abs(track0.fIp.fP[3]):track0.fIp.P()/massProton>>hisBGProton3DR2","(!K0sel&&abs(LPull)<1.5)||track0.fTOFr[4]>0.6","");
808 TFile fratio("bbRatio.root","recreate");
809 hisBGPion3DR1->Write();
810 hisBGPion3DR2->Write();
811 hisBGProton3DR1->Write();
812 hisBGProton3DR2->Write();
815 Double_t masses[5]={massPion, massProton,0,0,0};
816 const Double_t kB2C=-0.299792458e-3;
821 TTreeSRedirector *pcstream = new TTreeSRedirector("bbRatio.root","update");
822 TVectorD vecMean(4),vecRMS(4), vecEntries(4);
823 TVectorD vecTheta(4);
826 TVectorD vecPhi0(4); // tracklet angle at 0
827 TVectorD vecPhi1(4); // tracklet angle at 1
828 TVectorD vecPhi2(4); // tracklet angle at 2
829 TVectorD vecTheta0(4); // tracklet angle at 0
830 TVectorD vecTheta1(4); // tracklet angle at 1
831 TVectorD vecTheta2(4); // tracklet angle at 2
832 TVectorD vecL0(4); // tracklet length at 0
833 TVectorD vecL1(4); // tracklet letgth at 1
834 TVectorD vecL2(4); // tracklet length at 2
836 for (Int_t ptype=0; ptype<2; ptype++){
837 for (Int_t itype=0; itype<2; itype++){
838 for (Int_t ibg=2; ibg<38; ibg++){
839 Double_t bg = hisBGPion3DR1->GetXaxis()->GetBinCenter(ibg);
840 Double_t dEdxRef = AliMathBase::BetheBlochAleph(bg);
842 for (Int_t itheta=0; itheta<4; itheta++){
843 TH1 * hisProjection = 0;
845 if (ptype==0) hisProjection = hisBGPion3DR1->ProjectionZ("hisPion",ibg-1, ibg+1, itheta+1, itheta+1);
846 if (ptype==1) hisProjection = hisBGProton3DR1->ProjectionZ("hisProton",ibg-1, ibg+1, itheta+1, itheta+1);
849 if (ptype==0) hisProjection = hisBGPion3DR2->ProjectionZ("hisPion",ibg-1, ibg+1, itheta+1, itheta+1);
850 if (ptype==1) hisProjection = hisBGProton3DR2->ProjectionZ("hisProton",ibg-1, ibg+1, itheta+1, itheta+1);
852 hisProjection->Fit("gaus");
853 vecMean[itheta]=gaus->GetParameter(1);
854 vecRMS[itheta]=gaus->GetParameter(2);
855 vecEntries[itheta]=hisProjection->GetEntries();
856 vecTheta[itheta]=hisBGPion3DR1->GetYaxis()->GetBinCenter(itheta+1);
857 vecP[itheta]= bg*masses[ptype];
858 vecPt[itheta]=bg*masses[ptype]/TMath::Sqrt(1+vecTheta[itheta]*vecTheta[itheta]); //Pt
860 // Get angle and length
862 Double_t crv= 5*kB2C/vecPt[itheta]; //GetC(b); // bz*kB2C/pt;
863 Double_t angleIROC= TMath::ASin(TMath::Min(TMath::Abs(par.GetPadRowRadii(0, par.GetNRow(0)/2.)*crv)*0.5,1.));
864 Double_t angleOROC0= TMath::ASin(TMath::Min(TMath::Abs(par.GetPadRowRadii(36, par.GetNRowUp1()/2.)*crv)*0.5,1.));
865 Double_t angleOROC1= TMath::ASin(TMath::Min(TMath::Abs(par.GetPadRowRadii(36, par.GetNRowUp1()+par.GetNRowUp2()/2.)*crv)*0.5,1.));
866 vecPhi0[itheta]=angleIROC;
867 vecPhi1[itheta]=angleOROC0;
868 vecPhi2[itheta]=angleOROC1;
870 vecTheta0[itheta]=TMath::Sqrt(1+TMath::Tan(vecPhi0[itheta])*TMath::Tan(vecPhi0[itheta]))*vecTheta[itheta];
871 vecTheta1[itheta]=TMath::Sqrt(1+TMath::Tan(vecPhi1[itheta])*TMath::Tan(vecPhi1[itheta]))*vecTheta[itheta];
872 vecTheta2[itheta]=TMath::Sqrt(1+TMath::Tan(vecPhi2[itheta])*TMath::Tan(vecPhi2[itheta]))*vecTheta[itheta];
875 vecL0[itheta] = 0.75*TMath::Sqrt(1+TMath::Tan(vecPhi0[itheta])*TMath::Tan(vecPhi0[itheta]) + vecTheta0[itheta]*vecTheta0[itheta]);
876 vecL1[itheta] = 1.0*TMath::Sqrt(1+TMath::Tan(vecPhi1[itheta])*TMath::Tan(vecPhi1[itheta]) + vecTheta1[itheta]*vecTheta1[itheta]);
877 vecL2[itheta] = 1.5*TMath::Sqrt(1+TMath::Tan(vecPhi2[itheta])*TMath::Tan(vecPhi2[itheta]) + vecTheta2[itheta]*vecTheta2[itheta]);
878 delete hisProjection;
881 (*pcstream)<<"bbRatio"<<
882 "ptype="<<ptype<< // particle type
883 "rtype="<<itype<< // ratio type
884 "mass="<<masses[ptype]<< // mass of the
886 "dedxRef="<<dEdxRef<<
888 "vecTheta.="<<&vecTheta<<
889 "vecTheta0.="<<&vecTheta0<<
890 "vecTheta1.="<<&vecTheta1<<
891 "vecTheta2.="<<&vecTheta2<<
892 "ratioMean.="<<&vecMean<<
893 "ratioRMS.="<<&vecRMS<<
894 "ratioEntries.="<<&vecEntries<<
895 "vecP.="<<&vecP<< // momentum
896 "vecPt.="<<&vecPt<< // pt
897 "vecPhi0.="<<&vecPhi0<< // angle in the IROC
898 "vecPhi1.="<<&vecPhi1<< // angle in the OROC1
899 "vecPhi2.="<<&vecPhi2<< // angle in the OROC2
900 "vecL0.="<<&vecL0<< // angle in the IROC
901 "vecL1.="<<&vecL1<< // angle in the OROC1
902 "vecL2.="<<&vecL2<< // angle in the OROC2
914 TFile ff("bbRatio.root");
915 TTree * tree = ff.Get("bbRatio");
916 tree->SetMarkerStyle(25);
922 Int_t npointsMax=10000000;
924 TCut cutFit="ratioRMS.fElements<0.3&&ratioEntries.fElements>100&&vecL1.fElements<10&&vecL2.fElements<10";
925 TString fstringFast="";
926 fstringFast+="(1-(rtype==0)*2)++";
927 fstringFast+="(rtype==0)*vecTheta.fElements++";
928 fstringFast+="(rtype==1)*vecTheta.fElements++";
929 // fstringFast+="vecTheta.fElements++";
930 //fstringFast+="vecPhi0.fElements++";
931 fstringFast+="1/(vecL0.fElements*dedxRef)++";
932 //fstringFast+="(rtype==0)*vecPhi1.fElements++";
933 fstringFast+="(rtype==0)/(vecL1.fElements*dedxRef)++";
934 //fstringFast+="(rtype==1)*vecPhi2.fElements++";
935 fstringFast+="(rtype==1)/(vecL2.fElements*dedxRef)++";
937 TString *strDelta = TStatToolkit::FitPlaneConstrain(tree,"ratioMean.fElements:ratioRMS.fElements", fstringFast.Data(),cutFit, chi2,npoints,param,covar,0.9,0, npointsMax, 1);
938 TObjArray* tokArr = strDelta->Tokenize("++");
940 tree->SetAlias("corr",strDelta->Data());
948 TFile f("tofSelected.root");
949 TChain * chain = f.Get("highPt");
950 chain->SetAlias("ITSTOFrPion","sqrt((esdTrack.fTOFr[1]+esdTrack.fTOFr[2]+0.05)*(esdTrack.fITSr[1]+esdTrack.fITSr[2]+0.05))");
951 chain->SetAlias("ITSTOFrProton","sqrt((esdTrack.fTOFr[4]+0.05)*(esdTrack.fITSr[4]+0.05))");
952 chain->SetAlias("ITSTOFrKaon","sqrt((esdTrack.fTOFr[3]+0.05)*(esdTrack.fITSr[3]+0.05))");
954 Double_t massLambda = pdg.GetParticle("Lambda0")->Mass();
955 Double_t massK0 = pdg.GetParticle("K0")->Mass();
956 Double_t massPion = pdg.GetParticle("pi+")->Mass();
957 Double_t massProton = pdg.GetParticle("proton")->Mass();
959 chain->SetAlias("massPion",Form("(%f+0)",massPion));
960 chain->SetAlias("massProton",Form("(%f+0)",massProton));
961 chain->SetAlias("massK0",Form("(%f+0)",massK0));
964 chain->SetAlias("isPion", "((ITSTOFrPion>1.5*ITSTOFrProton&&ITSTOFrPion>1.5*ITSTOFrKaon)&&esdTrack.fTRDsignal/AliMathBase::BetheBlochAleph(esdTrack.P()/0.13-1)<0.2)");
966 chain->SetAlias("isKaon", "((ITSTOFrKaon>1.5*ITSTOFrProton&&ITSTOFrKaon>1.5*ITSTOFrPion))&&abs(esdTrack.fTRDsignal/AliMathBase::BetheBlochAleph(esdTrack.P()/massK0)-1)<0.3");
968 chain->SetAlias("isProton", "((ITSTOFrProton>1.5*ITSTOFrKaon&&ITSTOFrProton>1.5*ITSTOFrPion))");