8 #include <TDatabasePDG.h>
9 #include <TParticlePDG.h>
10 #include <TParticle.h>
13 #include "AliESDEvent.h"
15 #include "AliESDcascade.h"
17 #include "AliCentrality.h"
19 #include "AliMCEvent.h"
23 #include "AliPIDResponse.h"
25 #include "AliInputEventHandler.h"
26 #include "AliAnalysisManager.h"
28 #include "AliAnalysisTaskCTauPbPb.h"
32 ClassImp(AliAnalysisTaskCTauPbPb)
36 // This is a little task for checking the c*tau of the strange particles
39 AliAnalysisTaskCTauPbPb::AliAnalysisTaskCTauPbPb(const char *name) :
40 AliAnalysisTaskSE(name),
74 fLambdaBarFromXiBar(0),
78 // Constructor. Initialization of pointers
79 DefineOutput(1, TList::Class());
82 void AliAnalysisTaskCTauPbPb::UserCreateOutputObjects()
84 Int_t nbins=100; // number of bins
88 fOutput = new TList();
92 fMult=new TH1F("fMult","Multiplicity",1100,0.,3300);
93 fMult->GetXaxis()->SetTitle("N tracks");
96 fdEdx=new TH2F("fdEdx","dE/dx",50,0.2,3,50,0.,6.);
99 fdEdxPid=new TH2F("fdEdxPid","dE/dx with PID",50,0.2,3,50,0.,6.);
100 fOutput->Add(fdEdxPid);
103 new TH2F("fK0sM", "Mass for K^{0}_{s}", nbins/2, 0.448, 0.548, nbins,0.,ptMax);
104 fK0sM->GetXaxis()->SetTitle("Mass [GeV/c]");
108 new TH2F("fK0sSi","L_{T} vs p_{T} for K^{0}_{s}, side-band subtracted",
109 nbins,0.,ptMax,nbins,0.,ltMax);
110 fK0sSi->GetXaxis()->SetTitle("p_{T} [GeV/c]");
111 fK0sSi->GetYaxis()->SetTitle("L_{T} [cm]");
112 fOutput->Add(fK0sSi);
115 new TH2F("fK0sMC","L_{T} vs p_{T} for K^{0}_{s}, from MC stack",
116 nbins,0.,ptMax,nbins,0.,ltMax);
117 fK0sMC->GetXaxis()->SetTitle("p_{T} [GeV/c]");
118 fK0sMC->GetYaxis()->SetTitle("L_{T} [cm]");
119 fOutput->Add(fK0sMC);
122 new TH2F("fK0sAs", "L_{T} vs p_{T} for K^{0}_{s}, associated",
123 nbins,0.,ptMax,nbins,0.,ltMax);
124 fK0sAs->GetXaxis()->SetTitle("p_{T} [GeV/c]");
125 fK0sAs->GetYaxis()->SetTitle("L_{T} [cm]");
126 fOutput->Add(fK0sAs);
128 //----------------------
131 new TH2F("fLambdaM","Mass for \\Lambda", nbins, 1.065, 1.165,nbins,0.,ptMax);
132 fLambdaM->GetXaxis()->SetTitle("Mass [GeV/c]");
133 fOutput->Add(fLambdaM);
136 new TH2F("fLambdaSi","L_{T} vs p_{T} for \\Lambda, side-band subtructed",
137 nbins,0.,ptMax,nbins,0.,ltMax);
138 fLambdaSi->GetXaxis()->SetTitle("p_{T} [GeV/c]");
139 fLambdaSi->GetYaxis()->SetTitle("L_{T} [cm]");
140 fOutput->Add(fLambdaSi);
143 new TH2F("fLambdaMC","c\\tau for \\Lambda, from MC stack",
144 nbins,0.,ptMax,nbins,0.,ltMax);
145 fLambdaMC->GetXaxis()->SetTitle("p_{T} [GeV/c]");
146 fLambdaMC->GetYaxis()->SetTitle("L_{T} [cm]");
147 fOutput->Add(fLambdaMC);
150 new TH2F("fLambdaAs","c\\tau for \\Lambda, associated",
151 nbins,0.,ptMax,nbins,0.,ltMax);
152 fLambdaAs->GetXaxis()->SetTitle("p_{T} [GeV/c]");
153 fLambdaAs->GetYaxis()->SetTitle("L_{T} [cm]");
154 fOutput->Add(fLambdaAs);
156 //----------------------
158 fLambdaEff=fLambdaAs->ProjectionX();
159 fLambdaEff->SetName("fLambdaEff");
160 fLambdaEff->SetTitle("Efficiency for #Lambda");
161 fOutput->Add(fLambdaEff);
163 fLambdaPt=fLambdaAs->ProjectionX();
164 fLambdaPt->SetName("fLambdaPt");
165 fLambdaPt->SetTitle("Raw #Lambda pT spectrum");
166 fOutput->Add(fLambdaPt);
168 //----------------------
171 new TH2F("fLambdaBarM","Mass for anti-\\Lambda", nbins, 1.065, 1.165,nbins,0.,ptMax);
172 fLambdaBarM->GetXaxis()->SetTitle("Mass [GeV/c]");
173 fOutput->Add(fLambdaBarM);
176 new TH2F("fLambdaBarSi","L_{T} vs p_{T} for anti-\\Lambda, side-band subtructed",
177 nbins,0.,ptMax,nbins,0.,ltMax);
178 fLambdaBarSi->GetXaxis()->SetTitle("p_{T} [GeV/c]");
179 fLambdaBarSi->GetYaxis()->SetTitle("L_{T} [cm]");
180 fOutput->Add(fLambdaBarSi);
183 new TH2F("fLambdaBarMC","c\\tau for anti-\\Lambda, from MC stack",
184 nbins,0.,ptMax,nbins,0.,ltMax);
185 fLambdaBarMC->GetXaxis()->SetTitle("p_{T} [GeV/c]");
186 fLambdaBarMC->GetYaxis()->SetTitle("L_{T} [cm]");
187 fOutput->Add(fLambdaBarMC);
190 new TH2F("fLambdaBarAs","c\\tau for anti-\\Lambda, associated",
191 nbins,0.,ptMax,nbins,0.,ltMax);
192 fLambdaBarAs->GetXaxis()->SetTitle("p_{T} [GeV/c]");
193 fLambdaBarAs->GetYaxis()->SetTitle("L_{T} [cm]");
194 fOutput->Add(fLambdaBarAs);
197 //----------------------
199 fLambdaBarEff=fLambdaBarAs->ProjectionX();
200 fLambdaBarEff->SetName("fLambdaBarEff");
201 fLambdaBarEff->SetTitle("Efficiency for anti-#Lambda");
202 fOutput->Add(fLambdaBarEff);
204 fLambdaBarPt=fLambdaBarAs->ProjectionX();
205 fLambdaBarPt->SetName("fLambdaBarPt");
206 fLambdaBarPt->SetTitle("Raw anti-#Lambda pT spectrum");
207 fOutput->Add(fLambdaBarPt);
209 //----------------------
211 fLambdaFromXi=new TH3F("fLambdaFromXi","L_{T} vs p_{T} vs p_{T} of \\Xi for \\Lambda from \\Xi",
212 nbins,0.,ptMax,nbins,0.,ltMax,33,0.,ptMax+2);
213 fOutput->Add(fLambdaFromXi);
216 new TH2F("fXiM", "\\Xi mass distribution", 50, 1.271, 1.371,33,0.,ptMax+2);
219 fXiSiP = new TH1F("fXiSiP", "Pt for \\Xi, side-band subracted",
221 fOutput->Add(fXiSiP);
224 fLambdaBarFromXiBar=new TH3F("fLambdaBarFromXiBar","L_{T} vs p_{T} vs p_{T} of anti-\\Xi for anti-\\Lambda from anti-\\Xi",
225 nbins,0.,ptMax,nbins,0.,ltMax,33,0.,ptMax+2);
226 fOutput->Add(fLambdaBarFromXiBar);
229 new TH2F("fXiBarM", "anti-\\Xi mass distribution", 50, 1.271, 1.371,33,0.,ptMax+2);
230 fOutput->Add(fXiBarM);
232 fXiBarSiP = new TH1F("fXiBarSiP", "Pt for anti-\\Xi, side-band subracted",
234 fOutput->Add(fXiBarSiP);
237 PostData(1, fOutput);
240 static Bool_t AcceptTrack(const AliESDtrack *t) {
241 if (!t->IsOn(AliESDtrack::kTPCrefit)) return kFALSE;
242 if (t->GetKinkIndex(0)>0) return kFALSE;
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;
250 if (TMath::Abs(t->Eta()) > 0.8) return kFALSE;
255 static Bool_t AcceptV0(const AliESDv0 *v0, const AliESDEvent *esd) {
257 if (v0->GetOnFlyStatus()) return kFALSE;
259 Int_t nidx=TMath::Abs(v0->GetNindex());
260 AliESDtrack *ntrack=esd->GetTrack(nidx);
261 if (!AcceptTrack(ntrack)) return kFALSE;
263 Int_t pidx=TMath::Abs(v0->GetPindex());
264 AliESDtrack *ptrack=esd->GetTrack(pidx);
265 if (!AcceptTrack(ptrack)) return kFALSE;
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;
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;
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;
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;
291 static Bool_t AcceptCascade(const AliESDcascade *cs, const AliESDEvent *esd) {
293 Int_t bidx=TMath::Abs(cs->GetBindex());
294 AliESDtrack *btrack=esd->GetTrack(bidx);
295 if (!AcceptTrack(btrack)) return kFALSE;
298 btrack->GetImpactParameters(xy,z0);
299 if (TMath::Abs(xy)<0.03) return kFALSE;
301 const AliESDVertex *vtx=esd->GetPrimaryVertexSPD();
302 if (!vtx->GetStatus()) {
303 vtx=esd->GetPrimaryVertexTracks();
304 if (!vtx->GetStatus()) return kFALSE;
306 Double_t xv=vtx->GetXv(), yv=vtx->GetYv(), zv=vtx->GetZv();
307 if (cs->GetCascadeCosineOfPointingAngle(xv,yv,zv) < 0.999) return kFALSE;
309 if (cs->GetDcaXiDaughters() > 0.3) return kFALSE;
314 static Bool_t AcceptPID(const AliPIDResponse *pidResponse,
315 const AliESDtrack *ptrack, AliStack *stack) {
317 const AliExternalTrackParam *par=ptrack->GetInnerParam();
318 if (!par) return kTRUE;
319 if (par->GetP() > 1.) return kTRUE;
324 Int_t plab=TMath::Abs(ptrack->GetLabel());
325 TParticle *pp=stack->Particle(plab);
326 if (!pp) return kTRUE;
327 if (pp->GetPDG()->Charge() > 0) {
328 if (pp->GetPdgCode() == kProton) return kTRUE;
330 if (pp->GetPdgCode() == kProtonBar) return kTRUE;
334 Double_t nsig=pidResponse->NumberOfSigmasTPC(ptrack,AliPID::kProton);
335 if (TMath::Abs(nsig) < 3.) return kTRUE;
342 AssociateV0(const AliESDtrack *ptrack,const AliESDtrack *ntrack,AliStack *stack,
345 // Try to associate the V0 with the daughters ptrack and ntrack
346 // with the Monte Carlo
348 if (!stack) return 0;
350 Int_t nlab=TMath::Abs(ntrack->GetLabel());
351 TParticle *n=stack->Particle(nlab);
354 Int_t plab=TMath::Abs(ptrack->GetLabel());
355 TParticle *p=stack->Particle(plab);
358 Int_t imp=p->GetFirstMother();
360 if (imp>=stack->GetNtrack()) return 0;
361 TParticle *p0=stack->Particle(imp); // V0 particle, mother of the pos. track
364 Int_t imn=n->GetFirstMother();
365 if (imp != imn) { // Check decays of the daughters
369 Int_t code=p0->GetPdgCode();
370 if (code != kK0Short)
371 if (code != kLambda0)
372 if (code != kLambda0Bar) return 0;
380 void AliAnalysisTaskCTauPbPb::UserExec(Option_t *)
382 const Double_t yMax=0.5;
383 const Double_t pMin=0.0;
384 const Double_t lMax=0.001;
386 AliESDEvent *esd=(AliESDEvent *)InputEvent();
389 Printf("ERROR: esd not available");
394 const AliESDVertex *vtx=esd->GetPrimaryVertexSPD();
395 if (!vtx->GetStatus()) {
396 vtx=esd->GetPrimaryVertexTracks();
397 if (!vtx->GetStatus()) return;
399 Double_t xv=vtx->GetXv(), yv=vtx->GetYv(), zv=vtx->GetZv();
401 if (TMath::Abs(zv) > 10.) return ;
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;
412 fMult->Fill(-100); //event counter
415 // Centrality selection
416 AliCentrality *cent=esd->GetCentrality();
417 if (!cent->IsEventInCentralityClass(fCMin,fCMax,"V0M")) return;
419 AliPIDResponse *pidResponse = hdr->GetPIDResponse();
423 AliStack *stack = 0x0;
424 Double_t mcXv=0., mcYv=0., mcZv=0.;
427 AliMCEvent *mcEvent = MCEvent();
428 stack = mcEvent->Stack();
430 Printf("ERROR: stack not available");
434 const AliVVertex *mcVtx=mcEvent->GetPrimaryVertex();
436 mcXv=mcVtx->GetX(); mcYv=mcVtx->GetY(); mcZv=mcVtx->GetZ();
438 Int_t ntrk=stack->GetNtrack();
440 TParticle *p0=stack->Particle(ntrk);
441 Int_t code=p0->GetPdgCode();
442 if (code != kK0Short)
443 if (code != kLambda0)
444 if (code != kLambda0Bar) continue;
446 Int_t plab=p0->GetFirstDaughter(), nlab=p0->GetLastDaughter();
447 if (nlab==plab) continue;
448 TParticle *part = stack->Particle(plab);
450 TParticlePDG *partPDG = part->GetPDG();
451 if (!partPDG) continue;
452 Double_t charge=partPDG->Charge();
453 if (charge == 0.) continue;
455 Double_t pt=p0->Pt();
456 if (pt<pMin) continue;
457 if (TMath::Abs(p0->Y())>yMax) continue;
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);
463 if (l > lMax) continue; // secondary V0
465 x=part->Vx(); y=part->Vy();
466 dx=mcXv-x; dy=mcYv-y;
467 Double_t lt=TMath::Sqrt(dx*dx + dy*dy);
474 fLambdaMC->Fill(pt,lt);
477 fLambdaBarMC->Fill(pt,lt);
486 Int_t ntrk1=esd->GetNumberOfTracks();
488 for (Int_t i=0; i<ntrk1; i++) {
489 AliESDtrack *t=esd->GetTrack(i);
490 if (!t->IsOn(AliESDtrack::kTPCrefit)) continue;
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;
499 Double_t p=t->GetInnerParam()->GetP();
500 Double_t dedx=t->GetTPCsignal()/47.;
501 fdEdx->Fill(p,dedx,1);
503 Double_t nsig=pidResponse->NumberOfSigmasTPC(t,AliPID::kProton);
504 if (TMath::Abs(nsig) < 3.) fdEdxPid->Fill(p,dedx,1);
510 Int_t nv0 = esd->GetNumberOfV0s();
512 AliESDv0 *v0=esd->GetV0(nv0);
514 Double_t pt=v0->Pt();
515 if (pt < pMin) continue;
517 if (!AcceptV0(v0,esd)) continue;
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);
524 Double_t x,y,z; v0->GetXYZ(x,y,z);
525 Double_t dx1=x-xv, dy1=y-yv;
526 Double_t lt=TMath::Sqrt(dx1*dx1 + dy1*dy1);
528 if (lt/pt > 3*7.89/1.1157) continue;
532 Bool_t isLambda=kTRUE;
533 Bool_t isLambdaBar=kTRUE;
535 if (0.4977*lt/pt > 3*2.68) isK0s=kFALSE;
536 if (1.1157*lt/pt > 3*7.89) isLambdaBar=isLambda=kFALSE;
538 if (!AcceptPID(pidResponse, ptrack, stack)) isLambda=kFALSE;
539 if (!AcceptPID(pidResponse, ntrack, stack)) isLambdaBar=kFALSE;
541 Double_t yK0s=TMath::Abs(v0->RapK0Short());
542 Double_t yLam=TMath::Abs(v0->RapLambda());
543 if (yK0s > yMax) isK0s=kFALSE;
544 if (yLam > yMax) isLambda=isLambdaBar=kFALSE;
547 Double_t mass=0., m=0., s=0.;
549 v0->ChangeMassHypothesis(kK0Short);
551 mass=v0->GetEffMass();
552 fK0sM->Fill(mass,pt);
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) {
561 if (TMath::Abs(m-mass + 4.5*s) < 1.5*s) {
562 fK0sSi->Fill(pt,lt,-1);
564 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
565 fK0sSi->Fill(pt,lt,-1);
570 v0->ChangeMassHypothesis(kLambda0);
572 mass=v0->GetEffMass();
573 fLambdaM->Fill(mass,pt);
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);
584 if (TMath::Abs(m-mass + 4.5*s) < 1.5*s) {
585 fLambdaSi->Fill(pt,lt,-1);
587 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
588 fLambdaSi->Fill(pt,lt,-1);
593 v0->ChangeMassHypothesis(kLambda0Bar);
595 mass=v0->GetEffMass();
596 fLambdaBarM->Fill(mass,pt);
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);
607 if (TMath::Abs(m-mass + 4.5*s) < 1.5*s) {
608 fLambdaBarSi->Fill(pt,lt,-1);
610 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
611 fLambdaBarSi->Fill(pt,lt,-1);
615 if (!fIsMC) continue;
620 if (!isLambdaBar) continue;//check MC only for the accepted V0s
623 TParticle *mc0=AssociateV0(ptrack,ntrack,stack,mcp);
626 Double_t ptAs=mc0->Pt();
627 if (ptAs < pMin) continue;
628 Double_t yAs=mc0->Y();
629 if (TMath::Abs(yAs) > yMax) continue;
631 Int_t code=mc0->GetPdgCode();
633 Double_t dx = mcXv - mcp->Vx(), dy = mcYv - mcp->Vy();
634 Double_t ltAs=TMath::Sqrt(dx*dx + dy*dy);
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
641 if (isK0s) fK0sAs->Fill(ptAs,ltAs);
644 if (isLambda) fLambdaAs->Fill(ptAs,ltAs);
647 if (isLambdaBar) fLambdaBarAs->Fill(ptAs,ltAs);
652 if (code==kK0Short) continue;
654 Int_t nx=mc0->GetFirstMother();
656 if (nx>=stack->GetNtrack()) continue;
657 TParticle *xi=stack->Particle(nx);
659 Int_t xcode=xi->GetPdgCode();
664 if ((xcode==kXiMinus) || (xcode==3322))
665 fLambdaFromXi->Fill(ptAs,ltAs,xi->Pt());
669 if ((xcode==kXiPlusBar)||(xcode==-3322))
670 fLambdaBarFromXiBar->Fill(ptAs,ltAs,xi->Pt());
680 Int_t ncs=esd->GetNumberOfCascades();
681 for (Int_t i=0; i<ncs; i++) {
682 AliESDcascade *cs=esd->GetCascade(i);
684 Double_t pt=cs->Pt();
685 if (pt < pMin) continue;
686 if (TMath::Abs(cs->RapXi()) > yMax) continue;
687 if (!AcceptCascade(cs,esd)) continue;
689 AliESDv0 *v0 = (AliESDv0*)cs;
690 if (v0->Pt() < pMin) continue;
691 if (TMath::Abs(v0->RapLambda()) > yMax) continue;
692 if (!AcceptV0(v0,esd)) continue;
694 //--- Cascade switches
695 Bool_t isXiMinus=kTRUE;
696 Bool_t isXiPlusBar=kTRUE;
698 Int_t pidx=TMath::Abs(v0->GetPindex());
699 AliESDtrack *ptrack=esd->GetTrack(pidx);
700 if (!AcceptPID(pidResponse, ptrack, stack)) isXiMinus=kFALSE;
702 Int_t nidx=TMath::Abs(v0->GetNindex());
703 AliESDtrack *ntrack=esd->GetTrack(nidx);
704 if (!AcceptPID(pidResponse, ntrack, stack)) isXiPlusBar=kFALSE;
706 Int_t charge=cs->Charge();
707 if (charge > 0) isXiMinus=kFALSE;
708 if (charge < 0) isXiPlusBar=kFALSE;
712 cs->ChangeMassHypothesis(kine0,kXiMinus);
713 Double_t mass=cs->GetEffMassXi();
715 Double_t m=TDatabasePDG::Instance()->GetParticle(kXiMinus)->Mass();
717 Double_t s=0.002 + (0.0032-0.002)/(6-1.5)*(pt-1.5);
718 if (TMath::Abs(m-mass) < 3*s) {
723 if (TMath::Abs(m-mass + 4.5*s) < 1.5*s) {
726 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
732 cs->ChangeMassHypothesis(kine0,kXiPlusBar);
733 Double_t mass=cs->GetEffMassXi();
734 fXiBarM->Fill(mass,pt);
735 Double_t m=TDatabasePDG::Instance()->GetParticle(kXiPlusBar)->Mass();
737 Double_t s=0.002 + (0.0032-0.002)/(6-1.5)*(pt-1.5);
738 if (TMath::Abs(m-mass) < 3*s) {
743 if (TMath::Abs(m-mass + 4.5*s) < 1.5*s) {
744 fXiBarSiP->Fill(pt,-1);
746 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
747 fXiBarSiP->Fill(pt,-1);
751 if (!fIsMC) continue;
755 if (!isXiPlusBar) continue;//check MC only for the accepted cascades
756 // Here is the future association with MC
761 void AliAnalysisTaskCTauPbPb::Terminate(Option_t *)
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.
767 fOutput=(TList*)GetOutputData(1);
769 Printf("ERROR: fOutput not available");
773 fMult = dynamic_cast<TH1F*>(fOutput->FindObject("fMult")) ;
775 Printf("ERROR: fMult not available");
779 fdEdx = dynamic_cast<TH2F*>(fOutput->FindObject("fdEdx")) ;
781 Printf("ERROR: fdEdx not available");
785 fdEdxPid = dynamic_cast<TH2F*>(fOutput->FindObject("fdEdxPid")) ;
787 Printf("ERROR: fdEdxPid not available");
792 fK0sMC = dynamic_cast<TH2F*>(fOutput->FindObject("fK0sMC")) ;
794 Printf("ERROR: fK0sMC not available");
797 TH1D *k0sMcPx=fK0sMC->ProjectionX(); k0sMcPx->Sumw2();
798 fK0sAs = dynamic_cast<TH2F*>(fOutput->FindObject("fK0sAs")) ;
800 Printf("ERROR: fK0sAs not available");
803 TH1D *k0sAsPx=fK0sAs->ProjectionX();
804 k0sAsPx->Sumw2(); //k0sAsPx->Scale(0.69);
809 fLambdaFromXi = dynamic_cast<TH3F*>(fOutput->FindObject("fLambdaFromXi")) ;
810 if (!fLambdaFromXi) {
811 Printf("ERROR: fLambdaFromXi not available");
814 TH1D *lambdaFromXiPx=fLambdaFromXi->ProjectionX(); lambdaFromXiPx->Sumw2();
816 fLambdaMC = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaMC")) ;
818 Printf("ERROR: fLambdaMC not available");
821 TH1D *lambdaMcPx=fLambdaMC->ProjectionX(); lambdaMcPx->Sumw2();
823 fLambdaAs = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaAs")) ;
825 Printf("ERROR: fLambdaAs not available");
828 TH1D *lambdaAsPx=fLambdaAs->ProjectionX();
829 lambdaAsPx->Sumw2(); //lambdaAsPx->Scale(0.64);
831 fLambdaSi = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaSi")) ;
833 Printf("ERROR: fLambdaSi not available");
836 TH1D *lambdaSiPx=fLambdaSi->ProjectionX();
837 lambdaSiPx->SetName("fLambdaPt");
840 fLambdaEff = dynamic_cast<TH1D*>(fOutput->FindObject("fLambdaEff")) ;
842 Printf("ERROR: fLambdaEff not available");
845 fLambdaPt = dynamic_cast<TH1D*>(fOutput->FindObject("fLambdaPt")) ;
847 Printf("ERROR: fLambdaPt not available");
852 // anti-Lambda histograms
853 fLambdaBarFromXiBar =
854 dynamic_cast<TH3F*>(fOutput->FindObject("fLambdaBarFromXiBar")) ;
855 if (!fLambdaBarFromXiBar) {
856 Printf("ERROR: fLambdaBarFromXiBar not available");
859 TH1D *lambdaBarFromXiBarPx=
860 fLambdaBarFromXiBar->ProjectionX("Bar"); lambdaBarFromXiBarPx->Sumw2();
862 fLambdaBarMC = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaBarMC")) ;
864 Printf("ERROR: fLambdaBarMC not available");
867 TH1D *lambdaBarMcPx=fLambdaBarMC->ProjectionX(); lambdaBarMcPx->Sumw2();
869 fLambdaBarAs = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaBarAs")) ;
871 Printf("ERROR: fLambdaBarAs not available");
874 TH1D *lambdaBarAsPx=fLambdaBarAs->ProjectionX();
875 lambdaBarAsPx->Sumw2(); //lambdaBarAsPx->Scale(0.64);
877 fLambdaBarSi = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaBarSi")) ;
879 Printf("ERROR: fLambdaBarSi not available");
882 TH1D *lambdaBarSiPx=fLambdaBarSi->ProjectionX();
883 lambdaBarSiPx->SetName("fLambdaBarPt");
884 lambdaBarSiPx->Sumw2();
886 fLambdaBarEff = dynamic_cast<TH1D*>(fOutput->FindObject("fLambdaBarEff")) ;
887 if (!fLambdaBarEff) {
888 Printf("ERROR: fLambdaBarEff not available");
891 fLambdaBarPt = dynamic_cast<TH1D*>(fOutput->FindObject("fLambdaBarPt")) ;
893 Printf("ERROR: fLambdaBarPt not available");
898 if (!gROOT->IsBatch()) {
900 TCanvas *c1 = new TCanvas("c1","Mulitplicity");
904 new TCanvas("c2","dE/dx");
907 new TCanvas("c3","dE/dx with PID");
908 fdEdxPid->DrawCopy() ;
912 TH1D effK(*k0sAsPx); effK.SetTitle("Efficiency for K0s");
913 effK.Divide(k0sAsPx,k0sMcPx,1,1,"b");
914 new TCanvas("c4","Efficiency for K0s");
919 fLambdaEff->Divide(lambdaAsPx,lambdaMcPx,1,1,"b");
920 new TCanvas("c5","Efficiency for #Lambda");
921 fLambdaEff->DrawCopy("E") ;
923 lambdaSiPx->Add(lambdaFromXiPx,-1);
924 lambdaSiPx->Divide(fLambdaEff);
926 new TCanvas("c6","Corrected #Lambda pt");
927 lambdaSiPx->SetTitle("Corrected #Lambda pt");
928 *fLambdaPt = *lambdaSiPx;
929 fLambdaPt->SetLineColor(2);
930 fLambdaPt->DrawCopy("E");
932 lambdaMcPx->DrawCopy("same");
936 fLambdaBarEff->Divide(lambdaBarAsPx,lambdaBarMcPx,1,1,"b");
937 new TCanvas("c7","Efficiency for anti-#Lambda");
938 fLambdaBarEff->DrawCopy("E") ;
940 lambdaBarSiPx->Add(lambdaBarFromXiBarPx,-1);
941 lambdaBarSiPx->Divide(fLambdaBarEff);
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");
949 lambdaBarMcPx->DrawCopy("same");
951 new TCanvas("c6","Raw #Lambda pt");
952 lambdaSiPx->SetTitle("Raw #Lambda pt");
953 *fLambdaPt = *lambdaSiPx;
954 fLambdaPt->SetLineColor(2);
955 fLambdaPt->DrawCopy("E");
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");