]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/STRANGENESS/LambdaK0PbPb/AliAnalysisTaskCTauPbPb.cxx
Minor updates, code cleanup (Zaida)
[u/mrichter/AliRoot.git] / PWGLF / STRANGENESS / LambdaK0PbPb / AliAnalysisTaskCTauPbPb.cxx
CommitLineData
e26966dc 1#include <TCanvas.h>
2#include <TTree.h>
3#include <TFile.h>
4#include <TH1F.h>
5#include <TH2F.h>
6#include <TH3F.h>
7#include <TPDGCode.h>
8#include <TDatabasePDG.h>
9#include <TParticlePDG.h>
10#include <TParticle.h>
11#include <TROOT.h>
12
13#include "AliESDEvent.h"
14#include "AliESDv0.h"
15#include "AliESDcascade.h"
16
17#include "AliCentrality.h"
18
19#include "AliMCEvent.h"
20#include "AliStack.h"
21
22#include "AliPID.h"
23#include "AliPIDResponse.h"
24
25#include "AliInputEventHandler.h"
26#include "AliAnalysisManager.h"
27
28#include "AliAnalysisTaskCTauPbPb.h"
29
30extern TROOT *gROOT;
31
32ClassImp(AliAnalysisTaskCTauPbPb)
33
e26966dc 34
35//
36// This is a little task for checking the c*tau of the strange particles
37//
38
39AliAnalysisTaskCTauPbPb::AliAnalysisTaskCTauPbPb(const char *name) :
40AliAnalysisTaskSE(name),
41fIsMC(kFALSE),
42fCMin(0.),
43fCMax(90.),
44fOutput(0),
45fMult(0),
46fdEdx(0),
47fdEdxPid(0),
48
49fK0sM(0),
50fK0sSi(0),
51fK0sMC(0),
52fK0sAs(0),
53
54fLambdaM(0),
55fLambdaSi(0),
56fLambdaMC(0),
57fLambdaAs(0),
58
c13a47f5 59fLambdaEff(0),
60fLambdaPt(0),
61
0b384e23 62fLambdaBarM(0),
63fLambdaBarSi(0),
64fLambdaBarMC(0),
65fLambdaBarAs(0),
66
c13a47f5 67fLambdaBarEff(0),
68fLambdaBarPt(0),
e26966dc 69
70fLambdaFromXi(0),
71fXiM(0),
0b384e23 72fXiSiP(0),
73
74fLambdaBarFromXiBar(0),
75fXiBarM(0),
76fXiBarSiP(0)
e26966dc 77{
78 // Constructor. Initialization of pointers
79 DefineOutput(1, TList::Class());
80}
81
82void AliAnalysisTaskCTauPbPb::UserCreateOutputObjects()
83{
c13a47f5 84 Int_t nbins=100; // number of bins
85 Double_t ltMax=100.;
86 Double_t ptMax=10.;
87
e26966dc 88 fOutput = new TList();
89 fOutput->SetOwner();
90
91
92 fMult=new TH1F("fMult","Multiplicity",1100,0.,3300);
93 fMult->GetXaxis()->SetTitle("N tracks");
94 fOutput->Add(fMult);
95
96 fdEdx=new TH2F("fdEdx","dE/dx",50,0.2,3,50,0.,6.);
97 fOutput->Add(fdEdx);
98
99 fdEdxPid=new TH2F("fdEdxPid","dE/dx with PID",50,0.2,3,50,0.,6.);
100 fOutput->Add(fdEdxPid);
101
102 fK0sM =
c13a47f5 103 new TH2F("fK0sM", "Mass for K^{0}_{s}", nbins/2, 0.448, 0.548, nbins,0.,ptMax);
e26966dc 104 fK0sM->GetXaxis()->SetTitle("Mass [GeV/c]");
105 fOutput->Add(fK0sM);
106
107 fK0sSi =
108 new TH2F("fK0sSi","L_{T} vs p_{T} for K^{0}_{s}, side-band subtracted",
c13a47f5 109 nbins,0.,ptMax,nbins,0.,ltMax);
e26966dc 110 fK0sSi->GetXaxis()->SetTitle("p_{T} [GeV/c]");
111 fK0sSi->GetYaxis()->SetTitle("L_{T} [cm]");
112 fOutput->Add(fK0sSi);
113
114 fK0sMC =
115 new TH2F("fK0sMC","L_{T} vs p_{T} for K^{0}_{s}, from MC stack",
c13a47f5 116 nbins,0.,ptMax,nbins,0.,ltMax);
e26966dc 117 fK0sMC->GetXaxis()->SetTitle("p_{T} [GeV/c]");
118 fK0sMC->GetYaxis()->SetTitle("L_{T} [cm]");
119 fOutput->Add(fK0sMC);
120
121 fK0sAs =
122 new TH2F("fK0sAs", "L_{T} vs p_{T} for K^{0}_{s}, associated",
c13a47f5 123 nbins,0.,ptMax,nbins,0.,ltMax);
e26966dc 124 fK0sAs->GetXaxis()->SetTitle("p_{T} [GeV/c]");
125 fK0sAs->GetYaxis()->SetTitle("L_{T} [cm]");
126 fOutput->Add(fK0sAs);
127
128 //----------------------
129
130 fLambdaM =
c13a47f5 131 new TH2F("fLambdaM","Mass for \\Lambda", nbins, 1.065, 1.165,nbins,0.,ptMax);
e26966dc 132 fLambdaM->GetXaxis()->SetTitle("Mass [GeV/c]");
133 fOutput->Add(fLambdaM);
134
135 fLambdaSi =
136 new TH2F("fLambdaSi","L_{T} vs p_{T} for \\Lambda, side-band subtructed",
c13a47f5 137 nbins,0.,ptMax,nbins,0.,ltMax);
e26966dc 138 fLambdaSi->GetXaxis()->SetTitle("p_{T} [GeV/c]");
139 fLambdaSi->GetYaxis()->SetTitle("L_{T} [cm]");
140 fOutput->Add(fLambdaSi);
141
142 fLambdaMC =
143 new TH2F("fLambdaMC","c\\tau for \\Lambda, from MC stack",
c13a47f5 144 nbins,0.,ptMax,nbins,0.,ltMax);
e26966dc 145 fLambdaMC->GetXaxis()->SetTitle("p_{T} [GeV/c]");
146 fLambdaMC->GetYaxis()->SetTitle("L_{T} [cm]");
147 fOutput->Add(fLambdaMC);
148
149 fLambdaAs =
150 new TH2F("fLambdaAs","c\\tau for \\Lambda, associated",
c13a47f5 151 nbins,0.,ptMax,nbins,0.,ltMax);
e26966dc 152 fLambdaAs->GetXaxis()->SetTitle("p_{T} [GeV/c]");
153 fLambdaAs->GetYaxis()->SetTitle("L_{T} [cm]");
154 fOutput->Add(fLambdaAs);
155
c13a47f5 156 //----------------------
157
158 fLambdaEff=fLambdaAs->ProjectionX();
159 fLambdaEff->SetName("fLambdaEff");
160 fLambdaEff->SetTitle("Efficiency for #Lambda");
161 fOutput->Add(fLambdaEff);
162
163 fLambdaPt=fLambdaAs->ProjectionX();
164 fLambdaPt->SetName("fLambdaPt");
165 fLambdaPt->SetTitle("Raw #Lambda pT spectrum");
166 fOutput->Add(fLambdaPt);
167
168 //----------------------
0b384e23 169
170 fLambdaBarM =
c13a47f5 171 new TH2F("fLambdaBarM","Mass for anti-\\Lambda", nbins, 1.065, 1.165,nbins,0.,ptMax);
0b384e23 172 fLambdaBarM->GetXaxis()->SetTitle("Mass [GeV/c]");
173 fOutput->Add(fLambdaBarM);
174
175 fLambdaBarSi =
176 new TH2F("fLambdaBarSi","L_{T} vs p_{T} for anti-\\Lambda, side-band subtructed",
c13a47f5 177 nbins,0.,ptMax,nbins,0.,ltMax);
0b384e23 178 fLambdaBarSi->GetXaxis()->SetTitle("p_{T} [GeV/c]");
179 fLambdaBarSi->GetYaxis()->SetTitle("L_{T} [cm]");
180 fOutput->Add(fLambdaBarSi);
181
182 fLambdaBarMC =
183 new TH2F("fLambdaBarMC","c\\tau for anti-\\Lambda, from MC stack",
c13a47f5 184 nbins,0.,ptMax,nbins,0.,ltMax);
0b384e23 185 fLambdaBarMC->GetXaxis()->SetTitle("p_{T} [GeV/c]");
186 fLambdaBarMC->GetYaxis()->SetTitle("L_{T} [cm]");
187 fOutput->Add(fLambdaBarMC);
188
189 fLambdaBarAs =
190 new TH2F("fLambdaBarAs","c\\tau for anti-\\Lambda, associated",
c13a47f5 191 nbins,0.,ptMax,nbins,0.,ltMax);
0b384e23 192 fLambdaBarAs->GetXaxis()->SetTitle("p_{T} [GeV/c]");
193 fLambdaBarAs->GetYaxis()->SetTitle("L_{T} [cm]");
194 fOutput->Add(fLambdaBarAs);
195
196
c13a47f5 197 //----------------------
0b384e23 198
c13a47f5 199 fLambdaBarEff=fLambdaBarAs->ProjectionX();
200 fLambdaBarEff->SetName("fLambdaBarEff");
201 fLambdaBarEff->SetTitle("Efficiency for anti-#Lambda");
202 fOutput->Add(fLambdaBarEff);
e26966dc 203
c13a47f5 204 fLambdaBarPt=fLambdaBarAs->ProjectionX();
205 fLambdaBarPt->SetName("fLambdaBarPt");
206 fLambdaBarPt->SetTitle("Raw anti-#Lambda pT spectrum");
207 fOutput->Add(fLambdaBarPt);
e26966dc 208
209 //----------------------
210
0b384e23 211 fLambdaFromXi=new TH3F("fLambdaFromXi","L_{T} vs p_{T} vs p_{T} of \\Xi for \\Lambda from \\Xi",
c13a47f5 212 nbins,0.,ptMax,nbins,0.,ltMax,33,0.,ptMax+2);
e26966dc 213 fOutput->Add(fLambdaFromXi);
214
215 fXiM =
c13a47f5 216 new TH2F("fXiM", "\\Xi mass distribution", 50, 1.271, 1.371,12,0.,ptMax+2);
e26966dc 217 fOutput->Add(fXiM);
218
219 fXiSiP = new TH1F("fXiSiP", "Pt for \\Xi, side-band subracted",
c13a47f5 220 33,0.,ptMax+2);
e26966dc 221 fOutput->Add(fXiSiP);
222
223
0b384e23 224 fLambdaBarFromXiBar=new TH3F("fLambdaBarFromXiBar","L_{T} vs p_{T} vs p_{T} of anti-\\Xi for anti-\\Lambda from anti-\\Xi",
c13a47f5 225 nbins,0.,ptMax,nbins,0.,ltMax,33,0.,ptMax+2);
0b384e23 226 fOutput->Add(fLambdaBarFromXiBar);
227
228 fXiBarM =
c13a47f5 229 new TH2F("fXiBarM", "anti-\\Xi mass distribution", 50, 1.271, 1.371,12,0.,ptMax+2);
0b384e23 230 fOutput->Add(fXiBarM);
231
232 fXiBarSiP = new TH1F("fXiBarSiP", "Pt for anti-\\Xi, side-band subracted",
c13a47f5 233 33,0.,ptMax+2);
0b384e23 234 fOutput->Add(fXiBarSiP);
235
236
e26966dc 237 PostData(1, fOutput);
238}
239
240static Bool_t AcceptTrack(const AliESDtrack *t) {
241 if (!t->IsOn(AliESDtrack::kTPCrefit)) return kFALSE;
242 if (t->GetKinkIndex(0)>0) return kFALSE;
243
244 Float_t nCrossedRowsTPC = t->GetTPCClusterInfo(2,1);
245 if (nCrossedRowsTPC < 70) return kFALSE;
246 Int_t findable=t->GetTPCNclsF();
247 if (findable <= 0) return kFALSE;
248 if (nCrossedRowsTPC/findable < 0.8) return kFALSE;
249
ff909752 250 if (TMath::Abs(t->Eta()) > 0.8) return kFALSE;
251
e26966dc 252 return kTRUE;
253}
254
255static Bool_t AcceptV0(const AliESDv0 *v0, const AliESDEvent *esd) {
256
257 if (v0->GetOnFlyStatus()) return kFALSE;
258
e26966dc 259 Int_t nidx=TMath::Abs(v0->GetNindex());
260 AliESDtrack *ntrack=esd->GetTrack(nidx);
261 if (!AcceptTrack(ntrack)) return kFALSE;
262
263 Int_t pidx=TMath::Abs(v0->GetPindex());
264 AliESDtrack *ptrack=esd->GetTrack(pidx);
265 if (!AcceptTrack(ptrack)) return kFALSE;
266
267 Float_t xy,z0;
268 ntrack->GetImpactParameters(xy,z0);
269 if (TMath::Abs(xy)<0.1) return kFALSE;
270 ptrack->GetImpactParameters(xy,z0);
271 if (TMath::Abs(xy)<0.1) return kFALSE;
272
273 Double_t dca=v0->GetDcaV0Daughters();
274 if (dca>1.0) return kFALSE;
275 //if (dca>0.7) return kFALSE;
276 //if (dca>0.4) return kFALSE;
277
278 Double_t cpa=v0->GetV0CosineOfPointingAngle();
279 if (cpa<0.998) return kFALSE;
280 //if (cpa<0.99875) return kFALSE;
281 //if (cpa<0.9995) return kFALSE;
282
283 Double_t xx,yy,zz; v0->GetXYZ(xx,yy,zz);
284 Double_t r2=xx*xx + yy*yy;
285 if (r2<0.9*0.9) return kFALSE;
286 if (r2>100*100) return kFALSE;
287
288 return kTRUE;
289}
290
291static Bool_t AcceptCascade(const AliESDcascade *cs, const AliESDEvent *esd) {
292
e26966dc 293 Int_t bidx=TMath::Abs(cs->GetBindex());
294 AliESDtrack *btrack=esd->GetTrack(bidx);
295 if (!AcceptTrack(btrack)) return kFALSE;
296
297 Float_t xy,z0;
298 btrack->GetImpactParameters(xy,z0);
299 if (TMath::Abs(xy)<0.03) return kFALSE;
300
301 const AliESDVertex *vtx=esd->GetPrimaryVertexSPD();
302 if (!vtx->GetStatus()) {
303 vtx=esd->GetPrimaryVertexTracks();
304 if (!vtx->GetStatus()) return kFALSE;
305 }
306 Double_t xv=vtx->GetXv(), yv=vtx->GetYv(), zv=vtx->GetZv();
307 if (cs->GetCascadeCosineOfPointingAngle(xv,yv,zv) < 0.999) return kFALSE;
308
309 if (cs->GetDcaXiDaughters() > 0.3) return kFALSE;
310
311 return kTRUE;
312}
313
1c102c9a 314static Bool_t AcceptPID(const AliPIDResponse *pidResponse,
315 const AliESDtrack *ptrack, AliStack *stack) {
316
f6357875 317 const AliExternalTrackParam *par=ptrack->GetInnerParam();
318 if (!par) return kTRUE;
319 if (par->GetP() > 1.) return kTRUE;
1c102c9a 320
c13a47f5 321
1c102c9a 322 if (stack) {
323 // MC PID
1c102c9a 324 Int_t plab=TMath::Abs(ptrack->GetLabel());
c13a47f5 325 TParticle *pp=stack->Particle(plab);
326 if (!pp) return kTRUE;
327 if (pp->GetPDG()->Charge() > 0) {
328 if (pp->GetPdgCode() == kProton) return kTRUE;
329 } else {
330 if (pp->GetPdgCode() == kProtonBar) return kTRUE;
331 }
1c102c9a 332 } else {
333 // Real PID
f6357875 334 Double_t nsig=pidResponse->NumberOfSigmasTPC(ptrack,AliPID::kProton);
335 if (TMath::Abs(nsig) < 3.) return kTRUE;
1c102c9a 336 }
337
f6357875 338 return kFALSE;
1c102c9a 339}
340
c13a47f5 341static TParticle*
ee053f63 342AssociateV0(const AliESDtrack *ptrack,const AliESDtrack *ntrack,AliStack *stack,
c13a47f5 343TParticle *&mcp) {
344 //
345 // Try to associate the V0 with the daughters ptrack and ntrack
346 // with the Monte Carlo
347 //
348 if (!stack) return 0;
349
350 Int_t nlab=TMath::Abs(ntrack->GetLabel());
351 TParticle *n=stack->Particle(nlab);
352 if (!n) return 0;
353
354 Int_t plab=TMath::Abs(ptrack->GetLabel());
355 TParticle *p=stack->Particle(plab);
356 if (!p) return 0;
357
358 Int_t imp=p->GetFirstMother();
359 if (imp<0) return 0;
360 if (imp>=stack->GetNtrack()) return 0;
361 TParticle *p0=stack->Particle(imp); // V0 particle, mother of the pos. track
362 if (!p0) return 0;
363
364 Int_t imn=n->GetFirstMother();
365 if (imp != imn) { // Check decays of the daughters
366 return 0; // Fixme
367 }
368
369 Int_t code=p0->GetPdgCode();
370 if (code != kK0Short)
371 if (code != kLambda0)
372 if (code != kLambda0Bar) return 0;
373
374 mcp=p;
375
376 return p0;
c13a47f5 377}
378
379
e26966dc 380void AliAnalysisTaskCTauPbPb::UserExec(Option_t *)
381{
c13a47f5 382 const Double_t yMax=0.5;
383 const Double_t pMin=0.0;
384 const Double_t lMax=0.001;
e26966dc 385
386 AliESDEvent *esd=(AliESDEvent *)InputEvent();
387
388 if (!esd) {
389 Printf("ERROR: esd not available");
390 return;
391 }
392
0b384e23 393 // Vertex selection
394 const AliESDVertex *vtx=esd->GetPrimaryVertexSPD();
395 if (!vtx->GetStatus()) {
396 vtx=esd->GetPrimaryVertexTracks();
397 if (!vtx->GetStatus()) return;
398 }
399 Double_t xv=vtx->GetXv(), yv=vtx->GetYv(), zv=vtx->GetZv();
400
401 if (TMath::Abs(zv) > 10.) return ;
402
e26966dc 403
404 // Physics selection
405 AliAnalysisManager *mgr= AliAnalysisManager::GetAnalysisManager();
406 AliInputEventHandler *hdr=(AliInputEventHandler*)mgr->GetInputEventHandler();
407 UInt_t maskIsSelected = hdr->IsEventSelected();
408 Bool_t isSelected = (maskIsSelected & AliVEvent::kMB);
409 if (!isSelected) return;
410
0b384e23 411
412 fMult->Fill(-100); //event counter
413
414
e26966dc 415 // Centrality selection
416 AliCentrality *cent=esd->GetCentrality();
417 if (!cent->IsEventInCentralityClass(fCMin,fCMax,"V0M")) return;
418
e26966dc 419 AliPIDResponse *pidResponse = hdr->GetPIDResponse();
420
e26966dc 421
422 //+++++++ MC
423 AliStack *stack = 0x0;
424 Double_t mcXv=0., mcYv=0., mcZv=0.;
425
426 if (fIsMC) {
427 AliMCEvent *mcEvent = MCEvent();
428 stack = mcEvent->Stack();
429 if (!stack) {
430 Printf("ERROR: stack not available");
431 return;
432 }
433
434 const AliVVertex *mcVtx=mcEvent->GetPrimaryVertex();
435
436 mcXv=mcVtx->GetX(); mcYv=mcVtx->GetY(); mcZv=mcVtx->GetZ();
437
c13a47f5 438 Int_t ntrk=stack->GetNtrack();
e26966dc 439 while (ntrk--) {
440 TParticle *p0=stack->Particle(ntrk);
441 Int_t code=p0->GetPdgCode();
442 if (code != kK0Short)
0b384e23 443 if (code != kLambda0)
444 if (code != kLambda0Bar) continue;
e26966dc 445
446 Int_t plab=p0->GetFirstDaughter(), nlab=p0->GetLastDaughter();
447 if (nlab==plab) continue;
e26966dc 448 TParticle *part = stack->Particle(plab);
449 if (!part) continue;
450 TParticlePDG *partPDG = part->GetPDG();
451 if (!partPDG) continue;
452 Double_t charge=partPDG->Charge();
453 if (charge == 0.) continue;
454
455 Double_t pt=p0->Pt();
456 if (pt<pMin) continue;
457 if (TMath::Abs(p0->Y())>yMax) continue;
458
459 Double_t x=p0->Vx(), y=p0->Vy(), z=p0->Vz();
460 Double_t dx=mcXv-x, dy=mcYv-y, dz=mcZv-z;
461 Double_t l=TMath::Sqrt(dx*dx + dy*dy + dz*dz);
462
c13a47f5 463 if (l > lMax) continue; // secondary V0
e26966dc 464
465 x=part->Vx(); y=part->Vy();
466 dx=mcXv-x; dy=mcYv-y;
467 Double_t lt=TMath::Sqrt(dx*dx + dy*dy);
468
c13a47f5 469 switch (code) {
470 case kK0Short:
e26966dc 471 fK0sMC->Fill(pt,lt);
c13a47f5 472 break;
473 case kLambda0:
e26966dc 474 fLambdaMC->Fill(pt,lt);
c13a47f5 475 break;
476 case kLambda0Bar:
0b384e23 477 fLambdaBarMC->Fill(pt,lt);
c13a47f5 478 break;
479 default: break;
0b384e23 480 }
e26966dc 481 }
482 }
0b384e23 483 //+++++++
e26966dc 484
485
076bd7b1 486 Int_t ntrk1=esd->GetNumberOfTracks();
e26966dc 487 Int_t mult=0;
076bd7b1 488 for (Int_t i=0; i<ntrk1; i++) {
e26966dc 489 AliESDtrack *t=esd->GetTrack(i);
490 if (!t->IsOn(AliESDtrack::kTPCrefit)) continue;
491 Float_t xy,z0;
492 t->GetImpactParameters(xy,z0);
493 if (TMath::Abs(xy)>3.) continue;
494 if (TMath::Abs(z0)>3.) continue;
495 Double_t pt=t->Pt(),pz=t->Pz();
496 if (TMath::Abs(pz/pt)>0.8) continue;
497 mult++;
498
499 Double_t p=t->GetInnerParam()->GetP();
500 Double_t dedx=t->GetTPCsignal()/47.;
501 fdEdx->Fill(p,dedx,1);
502
1c102c9a 503 Double_t nsig=pidResponse->NumberOfSigmasTPC(t,AliPID::kProton);
e26966dc 504 if (TMath::Abs(nsig) < 3.) fdEdxPid->Fill(p,dedx,1);
505
506 }
507 fMult->Fill(mult);
508
509
510 Int_t nv0 = esd->GetNumberOfV0s();
511 while (nv0--) {
512 AliESDv0 *v0=esd->GetV0(nv0);
513
c13a47f5 514 Double_t pt=v0->Pt();
515 if (pt < pMin) continue;
516
e26966dc 517 if (!AcceptV0(v0,esd)) continue;
518
519 Int_t nidx=TMath::Abs(v0->GetNindex());
520 AliESDtrack *ntrack=esd->GetTrack(nidx);
521 Int_t pidx=TMath::Abs(v0->GetPindex());
522 AliESDtrack *ptrack=esd->GetTrack(pidx);
523
524 Double_t x,y,z; v0->GetXYZ(x,y,z);
076bd7b1 525 Double_t dx1=x-xv, dy1=y-yv;
526 Double_t lt=TMath::Sqrt(dx1*dx1 + dy1*dy1);
e26966dc 527
c13a47f5 528 if (lt/pt > 3*7.89/1.1157) continue;
e26966dc 529
ee053f63 530 //--- V0 switches
531 Bool_t isK0s=kTRUE;
532 Bool_t isLambda=kTRUE;
533 Bool_t isLambdaBar=kTRUE;
534
c13a47f5 535 if (0.4977*lt/pt > 3*2.68) isK0s=kFALSE;
536 if (1.1157*lt/pt > 3*7.89) isLambdaBar=isLambda=kFALSE;
e26966dc 537
ee053f63 538 if (!AcceptPID(pidResponse, ptrack, stack)) isLambda=kFALSE;
539 if (!AcceptPID(pidResponse, ntrack, stack)) isLambdaBar=kFALSE;
1c102c9a 540
c13a47f5 541 Double_t yK0s=TMath::Abs(v0->RapK0Short());
542 Double_t yLam=TMath::Abs(v0->RapLambda());
ee053f63 543 if (yK0s > yMax) isK0s=kFALSE;
544 if (yLam > yMax) isLambda=isLambdaBar=kFALSE;
545 //---
e26966dc 546
547 Double_t mass=0., m=0., s=0.;
c13a47f5 548 if (isK0s) {
e26966dc 549 v0->ChangeMassHypothesis(kK0Short);
550
551 mass=v0->GetEffMass();
552 fK0sM->Fill(mass,pt);
553
554 m=TDatabasePDG::Instance()->GetParticle(kK0Short)->Mass();
555 s=0.0044 + (0.008-0.0044)/(10-1)*(pt - 1.);
556 if (TMath::Abs(m-mass) < 3*s) {
557 fK0sSi->Fill(pt,lt);
c13a47f5 558 } else {
559 isK0s=kFALSE;
e26966dc 560 }
561 if (TMath::Abs(m-mass + 4.5*s) < 1.5*s) {
562 fK0sSi->Fill(pt,lt,-1);
563 }
564 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
565 fK0sSi->Fill(pt,lt,-1);
566 }
567 }
568
c13a47f5 569 if (isLambda) {
e26966dc 570 v0->ChangeMassHypothesis(kLambda0);
571
572 mass=v0->GetEffMass();
573 fLambdaM->Fill(mass,pt);
574
575 m=TDatabasePDG::Instance()->GetParticle(kLambda0)->Mass();
576 //s=0.0027 + (0.004-0.0027)/(10-1)*(pt-1);
577 //s=0.0015 + (0.002-0.0015)/(2.6-1)*(pt-1);
578 s=0.0023 + (0.004-0.0023)/(6-1)*(pt-1);
579 if (TMath::Abs(m-mass) < 3*s) {
580 fLambdaSi->Fill(pt,lt);
c13a47f5 581 } else {
582 isLambda=kFALSE;
583 }
e26966dc 584 if (TMath::Abs(m-mass + 4.5*s) < 1.5*s) {
585 fLambdaSi->Fill(pt,lt,-1);
e26966dc 586 }
587 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
588 fLambdaSi->Fill(pt,lt,-1);
e26966dc 589 }
590 }
0b384e23 591
c13a47f5 592 if (isLambdaBar) {
0b384e23 593 v0->ChangeMassHypothesis(kLambda0Bar);
594
595 mass=v0->GetEffMass();
596 fLambdaBarM->Fill(mass,pt);
597
598 m=TDatabasePDG::Instance()->GetParticle(kLambda0Bar)->Mass();
599 //s=0.0027 + (0.004-0.0027)/(10-1)*(pt-1);
600 //s=0.0015 + (0.002-0.0015)/(2.6-1)*(pt-1);
601 s=0.0023 + (0.004-0.0023)/(6-1)*(pt-1);
602 if (TMath::Abs(m-mass) < 3*s) {
603 fLambdaBarSi->Fill(pt,lt);
c13a47f5 604 } else {
605 isLambdaBar=kFALSE;
0b384e23 606 }
607 if (TMath::Abs(m-mass + 4.5*s) < 1.5*s) {
608 fLambdaBarSi->Fill(pt,lt,-1);
0b384e23 609 }
610 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
611 fLambdaBarSi->Fill(pt,lt,-1);
0b384e23 612 }
613 }
c13a47f5 614
615 if (!fIsMC) continue;
616
617 //++++++ MC
618 if (!isK0s)
619 if (!isLambda)
620 if (!isLambdaBar) continue;//check MC only for the accepted V0s
621
622 TParticle *mcp=0;
ee053f63 623 TParticle *mc0=AssociateV0(ptrack,ntrack,stack,mcp);
c13a47f5 624 if (!mc0) continue;
625
626 Double_t ptAs=mc0->Pt();
627 if (ptAs < pMin) continue;
628 Double_t yAs=mc0->Y();
629 if (TMath::Abs(yAs) > yMax) continue;
630
631 Int_t code=mc0->GetPdgCode();
632
633 Double_t dx = mcXv - mcp->Vx(), dy = mcYv - mcp->Vy();
634 Double_t ltAs=TMath::Sqrt(dx*dx + dy*dy);
635
636 Double_t dz=mcZv - mc0->Vz(); dy=mcYv - mc0->Vy(); dx=mcXv - mc0->Vx();
637 Double_t l = TMath::Sqrt(dx*dx + dy*dy + dz*dz);
638 if (l<lMax) { // Primary V0s
639 switch (code) {
640 case kK0Short:
641 if (isK0s) fK0sAs->Fill(ptAs,ltAs);
642 break;
643 case kLambda0:
644 if (isLambda) fLambdaAs->Fill(ptAs,ltAs);
645 break;
646 case kLambda0Bar:
647 if (isLambdaBar) fLambdaBarAs->Fill(ptAs,ltAs);
648 break;
649 default: break;
650 }
651 } else {
652 if (code==kK0Short) continue;
653
654 Int_t nx=mc0->GetFirstMother();
655 if (nx<0) continue;
656 if (nx>=stack->GetNtrack()) continue;
657 TParticle *xi=stack->Particle(nx);
658 if (!xi) continue;
659 Int_t xcode=xi->GetPdgCode();
660
661 switch (code) {
662 case kLambda0:
663 if (isLambda)
664 if ((xcode==kXiMinus) || (xcode==3322))
665 fLambdaFromXi->Fill(ptAs,ltAs,xi->Pt());
666 break;
667 case kLambda0Bar:
668 if (isLambdaBar)
669 if ((xcode==kXiPlusBar)||(xcode==-3322))
670 fLambdaBarFromXiBar->Fill(ptAs,ltAs,xi->Pt());
671 break;
672 default: break;
673 }
674 }
675 //++++++
676
e26966dc 677 }
678
679 Double_t kine0;
680 Int_t ncs=esd->GetNumberOfCascades();
681 for (Int_t i=0; i<ncs; i++) {
682 AliESDcascade *cs=esd->GetCascade(i);
683
ee053f63 684 Double_t pt=cs->Pt();
685 if (pt < pMin) continue;
e26966dc 686 if (TMath::Abs(cs->RapXi()) > yMax) continue;
687 if (!AcceptCascade(cs,esd)) continue;
688
689 AliESDv0 *v0 = (AliESDv0*)cs;
c13a47f5 690 if (v0->Pt() < pMin) continue;
e26966dc 691 if (TMath::Abs(v0->RapLambda()) > yMax) continue;
692 if (!AcceptV0(v0,esd)) continue;
693
ee053f63 694 //--- Cascade switches
695 Bool_t isXiMinus=kTRUE;
696 Bool_t isXiPlusBar=kTRUE;
e26966dc 697
1c102c9a 698 Int_t pidx=TMath::Abs(v0->GetPindex());
699 AliESDtrack *ptrack=esd->GetTrack(pidx);
ee053f63 700 if (!AcceptPID(pidResponse, ptrack, stack)) isXiMinus=kFALSE;
1c102c9a 701
0b384e23 702 Int_t nidx=TMath::Abs(v0->GetNindex());
703 AliESDtrack *ntrack=esd->GetTrack(nidx);
ee053f63 704 if (!AcceptPID(pidResponse, ntrack, stack)) isXiPlusBar=kFALSE;
1c102c9a 705
ee053f63 706 Int_t charge=cs->Charge();
707 if (charge > 0) isXiMinus=kFALSE;
708 if (charge < 0) isXiPlusBar=kFALSE;
709 //---
710
711 if (isXiMinus) {
e26966dc 712 cs->ChangeMassHypothesis(kine0,kXiMinus);
713 Double_t mass=cs->GetEffMassXi();
e26966dc 714 fXiM->Fill(mass,pt);
715 Double_t m=TDatabasePDG::Instance()->GetParticle(kXiMinus)->Mass();
716 //Double_t s=0.0037;
717 Double_t s=0.002 + (0.0032-0.002)/(6-1.5)*(pt-1.5);
718 if (TMath::Abs(m-mass) < 3*s) {
719 fXiSiP->Fill(pt);
ee053f63 720 } else {
721 isXiMinus=kFALSE;
e26966dc 722 }
723 if (TMath::Abs(m-mass + 4.5*s) < 1.5*s) {
724 fXiSiP->Fill(pt,-1);
725 }
726 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
727 fXiSiP->Fill(pt,-1);
728 }
729 }
ee053f63 730
731 if (isXiPlusBar) {
0b384e23 732 cs->ChangeMassHypothesis(kine0,kXiPlusBar);
733 Double_t mass=cs->GetEffMassXi();
0b384e23 734 fXiBarM->Fill(mass,pt);
735 Double_t m=TDatabasePDG::Instance()->GetParticle(kXiPlusBar)->Mass();
736 //Double_t s=0.0037;
737 Double_t s=0.002 + (0.0032-0.002)/(6-1.5)*(pt-1.5);
738 if (TMath::Abs(m-mass) < 3*s) {
739 fXiBarSiP->Fill(pt);
ee053f63 740 } else {
741 isXiPlusBar=kFALSE;
0b384e23 742 }
743 if (TMath::Abs(m-mass + 4.5*s) < 1.5*s) {
744 fXiBarSiP->Fill(pt,-1);
745 }
746 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
747 fXiBarSiP->Fill(pt,-1);
748 }
749 }
ee053f63 750
751 if (!fIsMC) continue;
752
753 //++++++ MC
754 if (!isXiMinus)
755 if (!isXiPlusBar) continue;//check MC only for the accepted cascades
756 // Here is the future association with MC
e26966dc 757 }
758
759}
760
761void AliAnalysisTaskCTauPbPb::Terminate(Option_t *)
762{
763 // The Terminate() function is the last function to be called during
764 // a query. It always runs on the client, it can be used to present
765 // the results graphically or save the results to file.
766
767 fOutput=(TList*)GetOutputData(1);
768 if (!fOutput) {
769 Printf("ERROR: fOutput not available");
770 return;
771 }
772
773 fMult = dynamic_cast<TH1F*>(fOutput->FindObject("fMult")) ;
774 if (!fMult) {
775 Printf("ERROR: fMult not available");
776 return;
777 }
778
779 fdEdx = dynamic_cast<TH2F*>(fOutput->FindObject("fdEdx")) ;
780 if (!fdEdx) {
781 Printf("ERROR: fdEdx not available");
782 return;
783 }
784
785 fdEdxPid = dynamic_cast<TH2F*>(fOutput->FindObject("fdEdxPid")) ;
786 if (!fdEdxPid) {
787 Printf("ERROR: fdEdxPid not available");
788 return;
789 }
790
791
792 fK0sMC = dynamic_cast<TH2F*>(fOutput->FindObject("fK0sMC")) ;
793 if (!fK0sMC) {
794 Printf("ERROR: fK0sMC not available");
795 return;
796 }
797 TH1D *k0sMcPx=fK0sMC->ProjectionX(); k0sMcPx->Sumw2();
798 fK0sAs = dynamic_cast<TH2F*>(fOutput->FindObject("fK0sAs")) ;
799 if (!fK0sAs) {
800 Printf("ERROR: fK0sAs not available");
801 return;
802 }
803 TH1D *k0sAsPx=fK0sAs->ProjectionX();
804 k0sAsPx->Sumw2(); //k0sAsPx->Scale(0.69);
805
806
807
c13a47f5 808 // Lambda histograms
e26966dc 809 fLambdaFromXi = dynamic_cast<TH3F*>(fOutput->FindObject("fLambdaFromXi")) ;
810 if (!fLambdaFromXi) {
811 Printf("ERROR: fLambdaFromXi not available");
812 return;
813 }
814 TH1D *lambdaFromXiPx=fLambdaFromXi->ProjectionX(); lambdaFromXiPx->Sumw2();
815
e26966dc 816 fLambdaMC = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaMC")) ;
817 if (!fLambdaMC) {
818 Printf("ERROR: fLambdaMC not available");
819 return;
820 }
821 TH1D *lambdaMcPx=fLambdaMC->ProjectionX(); lambdaMcPx->Sumw2();
822
823 fLambdaAs = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaAs")) ;
824 if (!fLambdaAs) {
825 Printf("ERROR: fLambdaAs not available");
826 return;
827 }
828 TH1D *lambdaAsPx=fLambdaAs->ProjectionX();
829 lambdaAsPx->Sumw2(); //lambdaAsPx->Scale(0.64);
830
831 fLambdaSi = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaSi")) ;
832 if (!fLambdaSi) {
833 Printf("ERROR: fLambdaSi not available");
834 return;
835 }
836 TH1D *lambdaSiPx=fLambdaSi->ProjectionX();
837 lambdaSiPx->SetName("fLambdaPt");
838 lambdaSiPx->Sumw2();
839
840 fLambdaEff = dynamic_cast<TH1D*>(fOutput->FindObject("fLambdaEff")) ;
841 if (!fLambdaEff) {
842 Printf("ERROR: fLambdaEff not available");
843 return;
844 }
845 fLambdaPt = dynamic_cast<TH1D*>(fOutput->FindObject("fLambdaPt")) ;
846 if (!fLambdaPt) {
847 Printf("ERROR: fLambdaPt not available");
848 return;
849 }
850
851
c13a47f5 852 // anti-Lambda histograms
853 fLambdaBarFromXiBar =
854 dynamic_cast<TH3F*>(fOutput->FindObject("fLambdaBarFromXiBar")) ;
855 if (!fLambdaBarFromXiBar) {
856 Printf("ERROR: fLambdaBarFromXiBar not available");
857 return;
858 }
859 TH1D *lambdaBarFromXiBarPx=
860 fLambdaBarFromXiBar->ProjectionX("Bar"); lambdaBarFromXiBarPx->Sumw2();
861
862 fLambdaBarMC = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaBarMC")) ;
863 if (!fLambdaBarMC) {
864 Printf("ERROR: fLambdaBarMC not available");
865 return;
866 }
867 TH1D *lambdaBarMcPx=fLambdaBarMC->ProjectionX(); lambdaBarMcPx->Sumw2();
868
869 fLambdaBarAs = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaBarAs")) ;
870 if (!fLambdaBarAs) {
871 Printf("ERROR: fLambdaBarAs not available");
872 return;
873 }
874 TH1D *lambdaBarAsPx=fLambdaBarAs->ProjectionX();
875 lambdaBarAsPx->Sumw2(); //lambdaBarAsPx->Scale(0.64);
876
877 fLambdaBarSi = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaBarSi")) ;
878 if (!fLambdaBarSi) {
879 Printf("ERROR: fLambdaBarSi not available");
880 return;
881 }
882 TH1D *lambdaBarSiPx=fLambdaBarSi->ProjectionX();
883 lambdaBarSiPx->SetName("fLambdaBarPt");
884 lambdaBarSiPx->Sumw2();
885
886 fLambdaBarEff = dynamic_cast<TH1D*>(fOutput->FindObject("fLambdaBarEff")) ;
887 if (!fLambdaBarEff) {
888 Printf("ERROR: fLambdaBarEff not available");
889 return;
890 }
891 fLambdaBarPt = dynamic_cast<TH1D*>(fOutput->FindObject("fLambdaBarPt")) ;
892 if (!fLambdaBarPt) {
893 Printf("ERROR: fLambdaBarPt not available");
894 return;
895 }
896
897
e26966dc 898 if (!gROOT->IsBatch()) {
899
900 TCanvas *c1 = new TCanvas("c1","Mulitplicity");
901 c1->SetLogy();
902 fMult->DrawCopy() ;
903
904 new TCanvas("c2","dE/dx");
905 fdEdx->DrawCopy() ;
906
907 new TCanvas("c3","dE/dx with PID");
908 fdEdxPid->DrawCopy() ;
909
910 if (fIsMC) {
911 /*
912 TH1D effK(*k0sAsPx); effK.SetTitle("Efficiency for K0s");
913 effK.Divide(k0sAsPx,k0sMcPx,1,1,"b");
914 new TCanvas("c4","Efficiency for K0s");
915 effK.DrawCopy("E") ;
916 */
917
c13a47f5 918 //+++ Lambdas
e26966dc 919 fLambdaEff->Divide(lambdaAsPx,lambdaMcPx,1,1,"b");
920 new TCanvas("c5","Efficiency for #Lambda");
921 fLambdaEff->DrawCopy("E") ;
922
923 lambdaSiPx->Add(lambdaFromXiPx,-1);
924 lambdaSiPx->Divide(fLambdaEff);
925
926 new TCanvas("c6","Corrected #Lambda pt");
927 lambdaSiPx->SetTitle("Corrected #Lambda pt");
928 *fLambdaPt = *lambdaSiPx;
929 fLambdaPt->SetLineColor(2);
930 fLambdaPt->DrawCopy("E");
931
932 lambdaMcPx->DrawCopy("same");
933
c13a47f5 934
935 //+++ anti-Lambdas
936 fLambdaBarEff->Divide(lambdaBarAsPx,lambdaBarMcPx,1,1,"b");
937 new TCanvas("c7","Efficiency for anti-#Lambda");
938 fLambdaBarEff->DrawCopy("E") ;
939
940 lambdaBarSiPx->Add(lambdaBarFromXiBarPx,-1);
941 lambdaBarSiPx->Divide(fLambdaBarEff);
942
943 new TCanvas("c8","Corrected anti-#Lambda pt");
944 lambdaBarSiPx->SetTitle("Corrected anti-#Lambda pt");
945 *fLambdaBarPt = *lambdaBarSiPx;
946 fLambdaBarPt->SetLineColor(2);
947 fLambdaBarPt->DrawCopy("E");
948
949 lambdaBarMcPx->DrawCopy("same");
e26966dc 950 } else {
951 new TCanvas("c6","Raw #Lambda pt");
952 lambdaSiPx->SetTitle("Raw #Lambda pt");
953 *fLambdaPt = *lambdaSiPx;
954 fLambdaPt->SetLineColor(2);
955 fLambdaPt->DrawCopy("E");
c13a47f5 956
957
958 new TCanvas("c7","Raw anti-#Lambda pt");
959 lambdaBarSiPx->SetTitle("Raw anti-#Lambda pt");
960 *fLambdaBarPt = *lambdaBarSiPx;
961 fLambdaBarPt->SetLineColor(2);
962 fLambdaBarPt->DrawCopy("E");
e26966dc 963 }
964 }
965}