8 #include <TDatabasePDG.h>
9 #include <TClonesArray.h>
12 #include "AliAODMCHeader.h"
13 #include "AliAODMCParticle.h"
15 #include "AliAODEvent.h"
17 #include "AliAODcascade.h"
19 #include "AliCentrality.h"
22 #include "AliPIDResponse.h"
23 #include "AliAODPid.h"
25 #include "AliInputEventHandler.h"
26 #include "AliAnalysisManager.h"
28 #include "AliAnalysisTaskCTauPbPbaod.h"
30 //extern TROOT *gROOT;
32 ClassImp(AliAnalysisTaskCTauPbPbaod)
36 // This is a little task for checking the c*tau of the strange particles
39 AliAnalysisTaskCTauPbPbaod::AliAnalysisTaskCTauPbPbaod(const char *name) :
40 AliAnalysisTaskSE(name),
88 fLambdaBarFromXiBar(0),
92 // Constructor. Initialization of pointers
93 DefineOutput(1, TList::Class());
96 void AliAnalysisTaskCTauPbPbaod::UserCreateOutputObjects()
98 Int_t nbins=100; // number of bins
102 fOutput = new TList();
106 fMult=new TH1F("fMult","Multiplicity",1100,0.,3300);
107 fMult->GetXaxis()->SetTitle("N tracks");
110 fCosPA=new TH1F("fCosPA","Cos(PA) distribution",50,0.9975,1.0005);
111 fCosPA->GetXaxis()->SetTitle("Cos(PA)");
112 fOutput->Add(fCosPA);
114 fDtrDCA=new TH1F("fDtrDCA","DCA between V0 daughters",50,0.0,1.5);
115 fDtrDCA->GetXaxis()->SetTitle("DCA (rel. u.)");
116 fOutput->Add(fDtrDCA);
118 fTPCrows=new TH1F("fTPCrows","TPC crossed pad rows",180,0.,180.);
119 fTPCrows->GetXaxis()->SetTitle("TPC crossed pad rows");
120 fOutput->Add(fTPCrows);
122 fTPCratio=new TH1F("fTPCratio","TPC crossed/findable pad rows",50,0.0,1.5);
123 fTPCratio->GetXaxis()->SetTitle("TPC crossed/findable pad rows");
124 fOutput->Add(fTPCratio);
126 fPrimDCA=new TH1F("fPrimDCA","DCA wrt the primary vertex",50,0.0,1.5);
127 fPrimDCA->GetXaxis()->SetTitle("DCA wrt the PV (cm)");
128 fOutput->Add(fPrimDCA);
130 fR=new TH1F("fR","Radius of the V0 vertices",101,0.0,102);
131 fR->GetXaxis()->SetTitle("R (cm)");
134 fdEdx=new TH2F("fdEdx","dE/dx",50,0.2,3,50,0.,6.);
137 fdEdxPid=new TH2F("fdEdxPid","dE/dx with PID",50,0.2,3,50,0.,6.);
138 fOutput->Add(fdEdxPid);
141 new TH2F("fK0sM", "Mass for K^{0}_{s}", nbins/2,0.448,0.548,nbins,0.,ptMax);
142 fK0sM->GetXaxis()->SetTitle("Mass (GeV/c)");
146 new TH2F("fK0sSi","L_{T} vs p_{T} for K^{0}_{s}, side-band subtracted",
147 nbins,0.,ptMax,nbins,0.,ltMax);
148 fK0sSi->GetXaxis()->SetTitle("p_{T} (GeV/c)");
149 fK0sSi->GetYaxis()->SetTitle("L_{T} (cm)");
150 fOutput->Add(fK0sSi);
153 new TH2F("fK0sMC","L_{T} vs p_{T} for K^{0}_{s}, from MC stack",
154 nbins,0.,ptMax,nbins,0.,ltMax);
155 fK0sMC->GetXaxis()->SetTitle("p_{T} (GeV/c)");
156 fK0sMC->GetYaxis()->SetTitle("L_{T} (cm)");
157 fOutput->Add(fK0sMC);
160 new TH2F("fK0sAs", "L_{T} vs p_{T} for K^{0}_{s}, associated",
161 nbins,0.,ptMax,nbins,0.,ltMax);
162 fK0sAs->GetXaxis()->SetTitle("p_{T} (GeV/c)");
163 fK0sAs->GetYaxis()->SetTitle("L_{T} (cm)");
164 fOutput->Add(fK0sAs);
166 //----------------------
169 new TH2F("fLambdaM","Mass for \\Lambda", nbins, 1.065, 1.165,nbins,0.,ptMax);
170 fLambdaM->GetXaxis()->SetTitle("Mass (GeV/c)");
171 fOutput->Add(fLambdaM);
174 new TH2F("fLambdaSi","L_{T} vs p_{T} for \\Lambda, side-band subtructed",
175 nbins,0.,ptMax,nbins,0.,ltMax);
176 fLambdaSi->GetXaxis()->SetTitle("p_{T} (GeV/c)");
177 fLambdaSi->GetYaxis()->SetTitle("L_{T} (cm)");
178 fOutput->Add(fLambdaSi);
181 new TH2F("fLambdaMC","L_{T} vs p_{T} for \\Lambda, from MC stack",
182 nbins,0.,ptMax,nbins,0.,ltMax);
183 fLambdaMC->GetXaxis()->SetTitle("p_{T} (GeV/c)");
184 fLambdaMC->GetYaxis()->SetTitle("L_{T} (cm)");
185 fOutput->Add(fLambdaMC);
188 new TH2F("fLambdaAs","L_{T} vs p_{T} for \\Lambda, associated",
189 nbins,0.,ptMax,nbins,0.,ltMax);
190 fLambdaAs->GetXaxis()->SetTitle("p_{T} (GeV/c)");
191 fLambdaAs->GetYaxis()->SetTitle("L_{T} (cm)");
192 fOutput->Add(fLambdaAs);
194 //----------------------
196 fLambdaEff=fLambdaAs->ProjectionX();
197 fLambdaEff->SetName("fLambdaEff");
198 fLambdaEff->SetTitle("Efficiency for #Lambda");
199 fOutput->Add(fLambdaEff);
201 fLambdaPt=fLambdaAs->ProjectionX();
202 fLambdaPt->SetName("fLambdaPt");
203 fLambdaPt->SetTitle("Raw #Lambda pT spectrum");
204 fOutput->Add(fLambdaPt);
206 //----------------------
209 new TH2F("fLambdaBarM","Mass for anti-\\Lambda", nbins, 1.065, 1.165,nbins,0.,ptMax);
210 fLambdaBarM->GetXaxis()->SetTitle("Mass (GeV/c)");
211 fOutput->Add(fLambdaBarM);
214 new TH2F("fLambdaBarSi","L_{T} vs p_{T} for anti-\\Lambda, side-band subtructed",
215 nbins,0.,ptMax,nbins,0.,ltMax);
216 fLambdaBarSi->GetXaxis()->SetTitle("p_{T} (GeV/c)");
217 fLambdaBarSi->GetYaxis()->SetTitle("L_{T} (cm)");
218 fOutput->Add(fLambdaBarSi);
221 new TH2F("fLambdaBarMC","L_{T} vs p_{T} for anti-\\Lambda, from MC stack",
222 nbins,0.,ptMax,nbins,0.,ltMax);
223 fLambdaBarMC->GetXaxis()->SetTitle("p_{T} (GeV/c)");
224 fLambdaBarMC->GetYaxis()->SetTitle("L_{T} (cm)");
225 fOutput->Add(fLambdaBarMC);
228 new TH2F("fLambdaBarAs","L_{T} vs p_{T} for anti-\\Lambda, associated",
229 nbins,0.,ptMax,nbins,0.,ltMax);
230 fLambdaBarAs->GetXaxis()->SetTitle("p_{T} (GeV/c)");
231 fLambdaBarAs->GetYaxis()->SetTitle("L_{T} (cm)");
232 fOutput->Add(fLambdaBarAs);
235 //----------------------
237 fLambdaBarEff=fLambdaBarAs->ProjectionX();
238 fLambdaBarEff->SetName("fLambdaBarEff");
239 fLambdaBarEff->SetTitle("Efficiency for anti-#Lambda");
240 fOutput->Add(fLambdaBarEff);
242 fLambdaBarPt=fLambdaBarAs->ProjectionX();
243 fLambdaBarPt->SetName("fLambdaBarPt");
244 fLambdaBarPt->SetTitle("Raw anti-#Lambda pT spectrum");
245 fOutput->Add(fLambdaBarPt);
247 //----------------------
249 fLambdaFromXi=new TH3F("fLambdaFromXi","L_{T} vs p_{T} vs p_{T} of \\Xi for \\Lambda from \\Xi",
250 nbins,0.,ptMax,nbins,0.,ltMax,33,0.,ptMax+2);
251 fOutput->Add(fLambdaFromXi);
254 new TH2F("fXiM", "\\Xi mass distribution", 50, 1.271, 1.371,33,0.,ptMax+2);
257 fXiSiP = new TH1F("fXiSiP", "Pt for \\Xi, side-band subracted",
259 fOutput->Add(fXiSiP);
262 fLambdaBarFromXiBar=new TH3F("fLambdaBarFromXiBar","L_{T} vs p_{T} vs p_{T} of anti-\\Xi for anti-\\Lambda from anti-\\Xi",
263 nbins,0.,ptMax,nbins,0.,ltMax,33,0.,ptMax+2);
264 fOutput->Add(fLambdaBarFromXiBar);
267 new TH2F("fXiBarM", "anti-\\Xi mass distribution", 50, 1.271, 1.371,33,0.,ptMax+2);
268 fOutput->Add(fXiBarM);
270 fXiBarSiP = new TH1F("fXiBarSiP", "Pt for anti-\\Xi, side-band subracted",
272 fOutput->Add(fXiBarSiP);
275 PostData(1, fOutput);
278 Bool_t AliAnalysisTaskCTauPbPbaod::AcceptTrack(const AliAODTrack *t) {
279 if (!t->IsOn(AliAODTrack::kTPCrefit)) return kFALSE;
280 //if (t->GetKinkIndex(0)>0) return kFALSE;
282 Float_t nCrossedRowsTPC = t->GetTPCClusterInfo(2,1);
283 if (nCrossedRowsTPC < fTPCcr) return kFALSE;
284 Int_t findable=t->GetTPCNclsF();
285 if (findable <= 0) return kFALSE;
286 if (nCrossedRowsTPC/findable < fTPCcrfd) return kFALSE;
288 if (TMath::Abs(t->Eta()) > 0.8) return kFALSE;
290 fTPCrows->Fill(nCrossedRowsTPC);
291 fTPCratio->Fill(nCrossedRowsTPC/findable);
297 AliAnalysisTaskCTauPbPbaod::AcceptV0(const AliAODv0 *v0,const AliAODEvent *aod)
299 if (v0->GetOnFlyStatus()) return kFALSE;
301 Double_t cpa=v0->CosPointingAngle(aod->GetPrimaryVertex());
302 if (cpa < fCPA) return kFALSE;
304 Double_t dca=v0->DcaV0Daughters();
305 if (dca > fDCA) return kFALSE;
307 const AliAODTrack *ntrack=(AliAODTrack *)v0->GetDaughter(1);
308 if (!AcceptTrack(ntrack)) return kFALSE;
310 const AliAODTrack *ptrack=(AliAODTrack *)v0->GetDaughter(0);
311 if (!AcceptTrack(ptrack)) return kFALSE;
313 Float_t xyn=v0->DcaNegToPrimVertex();
314 if (TMath::Abs(xyn)<fDCApv) return kFALSE;
315 Float_t xyp=v0->DcaPosToPrimVertex();
316 if (TMath::Abs(xyp)<fDCApv) return kFALSE;
318 Double_t xyz[3]; v0->GetSecondaryVtx(xyz);
319 Double_t r2=xyz[0]*xyz[0] + xyz[1]*xyz[1];
320 if (r2<fRmin*fRmin) return kFALSE;
321 if (r2>fRmax*fRmax) return kFALSE;
325 fPrimDCA->Fill(xyn); fPrimDCA->Fill(xyp);
326 fR->Fill(TMath::Sqrt(r2));
331 Bool_t AliAnalysisTaskCTauPbPbaod::AcceptCascade(const AliAODcascade *cs, const AliAODEvent *aod) {
333 AliAODVertex *xi = cs->GetDecayVertexXi();
334 const AliAODTrack *bach=(AliAODTrack *)xi->GetDaughter(0);
335 if (!AcceptTrack(bach)) return kFALSE;
337 Double_t xy=cs->DcaBachToPrimVertex();
338 if (TMath::Abs(xy) < 0.03) return kFALSE;
340 const AliAODVertex *vtx=aod->GetPrimaryVertex();
341 Double_t xv=vtx->GetX(), yv=vtx->GetY(), zv=vtx->GetZ();
342 Double_t cpa=cs->CosPointingAngleXi(xv,yv,zv);
343 if (cpa<0.999) return kFALSE;
345 if (cs->DcaXiDaughters() > 0.3) return kFALSE;
350 static Bool_t AcceptPID(const AliPIDResponse *pidResponse,
351 const AliAODTrack *ptrack, const TClonesArray *stack) {
353 const AliAODPid *pid=ptrack->GetDetPid();
354 if (!pid) return kTRUE;
355 if (pid->GetTPCmomentum() > 1.) return kTRUE;
359 Int_t plab=TMath::Abs(ptrack->GetLabel());
360 AliAODMCParticle *pp=(AliAODMCParticle*)(*stack)[plab];
361 if (!pp) return kTRUE;
362 if (pp->Charge() > 0) {
363 if (pp->GetPdgCode() == kProton) return kTRUE;
365 if (pp->GetPdgCode() == kProtonBar) return kTRUE;
369 Double_t nsig=pidResponse->NumberOfSigmasTPC(ptrack,AliPID::kProton);
370 if (TMath::Abs(nsig) < 3.) return kTRUE;
376 static AliAODMCParticle*
377 AssociateV0(const AliAODTrack *ptrack, const AliAODTrack *ntrack,
378 const TClonesArray *stack, AliAODMCParticle *&mcp) {
380 // Try to associate the V0 with the daughters ptrack and ntrack
381 // with the Monte Carlo
383 if (!stack) return 0;
385 Int_t nlab=TMath::Abs(ntrack->GetLabel());
386 AliAODMCParticle *n=(AliAODMCParticle*)(*stack)[nlab];
389 Int_t plab=TMath::Abs(ptrack->GetLabel());
390 AliAODMCParticle *p=(AliAODMCParticle*)(*stack)[plab];
393 Int_t imp=p->GetMother(); //V0 particle, the mother of the pos. track
394 AliAODMCParticle *p0=(AliAODMCParticle*)(*stack)[imp];
397 Int_t imn=n->GetMother();
398 if (imp != imn) { // Check decays of the daughters
402 Int_t code=p0->GetPdgCode();
403 if (code != kK0Short)
404 if (code != kLambda0)
405 if (code != kLambda0Bar) return 0;
413 void AliAnalysisTaskCTauPbPbaod::UserExec(Option_t *)
415 const Double_t yMax=0.5;
416 const Double_t pMin=0.0;
417 const Double_t lMax=0.001;
419 AliAODEvent *aod=(AliAODEvent *)InputEvent();
422 Printf("ERROR: aod not available");
427 const AliAODVertex *vtx=aod->GetPrimaryVertex();
428 if (vtx->GetNContributors()<3) return;
429 Double_t xv=vtx->GetX(), yv=vtx->GetY(), zv=vtx->GetZ();
431 if (TMath::Abs(zv) > 10.) return ;
435 AliAnalysisManager *mgr= AliAnalysisManager::GetAnalysisManager();
436 AliInputEventHandler *hdr=(AliInputEventHandler*)mgr->GetInputEventHandler();
437 UInt_t maskIsSelected = hdr->IsEventSelected();
438 Bool_t isSelected = (maskIsSelected & AliVEvent::kMB);
439 if (!isSelected) return;
441 fMult->Fill(-100); //event counter
443 // Centrality selection
444 AliCentrality *cent=aod->GetCentrality();
445 if (!cent->IsEventInCentralityClass(fCMin,fCMax,"V0M")) return;
447 AliPIDResponse *pidResponse = hdr->GetPIDResponse();
452 TClonesArray *stack = 0x0;
453 Double_t mcXv=0., mcYv=0., mcZv=0.;
456 TList *lst = aod->GetList();
457 stack = (TClonesArray*)lst->FindObject(AliAODMCParticle::StdBranchName());
459 Printf("ERROR: stack not available");
463 mcHdr=(AliAODMCHeader*)lst->FindObject(AliAODMCHeader::StdBranchName());
465 mcXv=mcHdr->GetVtxX(); mcYv=mcHdr->GetVtxY(); mcZv=mcHdr->GetVtxZ();
467 Int_t ntrk=stack->GetEntriesFast();
469 AliAODMCParticle *p0=(AliAODMCParticle*)stack->UncheckedAt(ntrk);
470 Int_t code=p0->GetPdgCode();
471 if (code != kK0Short)
472 if (code != kLambda0)
473 if (code != kLambda0Bar) continue;
475 Int_t plab=p0->GetDaughter(0), nlab=p0->GetDaughter(1);
476 if (nlab==plab) continue;
477 AliAODMCParticle *part=(AliAODMCParticle*)(*stack)[plab];
479 Double_t charge=part->Charge();
480 if (charge == 0.) continue;
482 Double_t pt=p0->Pt();
483 if (pt<pMin) continue;
484 if (TMath::Abs(p0->Y())>yMax) continue;
486 Double_t x=p0->Xv(), y=p0->Yv(), z=p0->Zv();
487 Double_t dxmc=mcXv-x, dymc=mcYv-y, dzmc=mcZv-z;
488 Double_t l=TMath::Sqrt(dxmc*dxmc + dymc*dymc + dzmc*dzmc);
490 if (l > lMax) continue; // secondary V0
492 x=part->Xv(); y=part->Yv();
493 dxmc=mcXv-x; dymc=mcYv-y;
494 Double_t lt=TMath::Sqrt(dxmc*dxmc + dymc*dymc);
501 fLambdaMC->Fill(pt,lt);
504 fLambdaBarMC->Fill(pt,lt);
513 Int_t ntrk1=aod->GetNumberOfTracks();
515 for (Int_t i=0; i<ntrk1; i++) {
516 AliAODTrack *t=dynamic_cast<AliAODTrack*>(aod->GetTrack(i));
517 if(!t) { AliFatal("Not a standard AOD"); return; }
518 if (t->IsMuonTrack()) continue;
519 if (!t->IsOn(AliAODTrack::kTPCrefit)) continue;
522 if (t->GetPosition(xyz)) continue;
523 if (TMath::Abs(xyz[0])>3.) continue;
524 if (TMath::Abs(xyz[1])>3.) continue;
526 Double_t pt=t->Pt(),pz=t->Pz();
527 if (TMath::Abs(pz/pt)>0.8) continue;
531 const AliAODPid *pid=t->GetDetPid();
534 Double_t p=pid->GetTPCmomentum();
535 Double_t dedx=pid->GetTPCsignal()/47.;
536 fdEdx->Fill(p,dedx,1);
538 Double_t nsig=pidResponse->NumberOfSigmasTPC(t,AliPID::kProton);
539 if (TMath::Abs(nsig) < 3.) fdEdxPid->Fill(p,dedx,1);
545 Int_t nv0 = aod->GetNumberOfV0s();
547 AliAODv0 *v0=aod->GetV0(nv0);
549 Double_t pt=TMath::Sqrt(v0->Pt2V0());
550 if (pt < pMin) continue;
552 if (!AcceptV0(v0,aod)) continue;
554 const AliAODTrack *ntrack=(AliAODTrack *)v0->GetDaughter(1);
555 const AliAODTrack *ptrack=(AliAODTrack *)v0->GetDaughter(0);
557 Double_t xyz[3]; v0->GetSecondaryVtx(xyz);
558 Double_t dxv=xyz[0]-xv, dyv=xyz[1]-yv;
559 Double_t lt=TMath::Sqrt(dxv*dxv + dyv*dyv);
561 if (lt/pt > 3*7.89/1.1157) continue;
565 Bool_t isLambda=kTRUE;
566 Bool_t isLambdaBar=kTRUE;
568 if (0.4977*lt/pt > 3*2.68) isK0s=kFALSE;
569 if (1.1157*lt/pt > 3*7.89) isLambdaBar=isLambda=kFALSE;
571 if (!AcceptPID(pidResponse, ptrack, stack)) isLambda=kFALSE;
572 if (!AcceptPID(pidResponse, ntrack, stack)) isLambdaBar=kFALSE;
574 Double_t yK0s=TMath::Abs(v0->RapK0Short());
575 Double_t yLam=TMath::Abs(v0->RapLambda());
576 if (yK0s > yMax) isK0s=kFALSE;
577 if (yLam > yMax) isLambda=isLambdaBar=kFALSE;
580 Double_t mass=0., m=0., s=0.;
582 mass=v0->MassK0Short();
583 fK0sM->Fill(mass,pt);
585 m=TDatabasePDG::Instance()->GetParticle(kK0Short)->Mass();
586 s=0.0044 + (0.008-0.0044)/(10-1)*(pt - 1.);
587 if (TMath::Abs(m-mass) < 3*s) {
592 if (TMath::Abs(m-mass + 4.5*s) < 1.5*s) {
593 fK0sSi->Fill(pt,lt,-1);
595 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
596 fK0sSi->Fill(pt,lt,-1);
601 mass=v0->MassLambda();
602 fLambdaM->Fill(mass,pt);
604 m=TDatabasePDG::Instance()->GetParticle(kLambda0)->Mass();
605 //s=0.0027 + (0.004-0.0027)/(10-1)*(pt-1);
606 //s=0.0015 + (0.002-0.0015)/(2.6-1)*(pt-1);
607 s=0.0023 + (0.004-0.0023)/(6-1)*(pt-1);
608 if (TMath::Abs(m-mass) < 3*s) {
609 fLambdaSi->Fill(pt,lt);
613 if (TMath::Abs(m-mass + 4.5*s) < 1.5*s) {
614 fLambdaSi->Fill(pt,lt,-1);
616 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
617 fLambdaSi->Fill(pt,lt,-1);
622 mass=v0->MassAntiLambda();
623 fLambdaBarM->Fill(mass,pt);
625 m=TDatabasePDG::Instance()->GetParticle(kLambda0Bar)->Mass();
626 //s=0.0027 + (0.004-0.0027)/(10-1)*(pt-1);
627 //s=0.0015 + (0.002-0.0015)/(2.6-1)*(pt-1);
628 s=0.0023 + (0.004-0.0023)/(6-1)*(pt-1);
629 if (TMath::Abs(m-mass) < 3*s) {
630 fLambdaBarSi->Fill(pt,lt);
634 if (TMath::Abs(m-mass + 4.5*s) < 1.5*s) {
635 fLambdaBarSi->Fill(pt,lt,-1);
637 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
638 fLambdaBarSi->Fill(pt,lt,-1);
642 if (!fIsMC) continue;
647 if (!isLambdaBar) continue;//check MC only for the accepted V0s
649 AliAODMCParticle *mcp=0;
650 AliAODMCParticle *mc0=AssociateV0(ptrack,ntrack,stack,mcp);
653 Double_t ptAs=mc0->Pt();
654 if (ptAs < pMin) continue;
655 Double_t yAs=mc0->Y();
656 if (TMath::Abs(yAs) > yMax) continue;
658 Int_t code=mc0->GetPdgCode();
660 Double_t dx = mcXv - mcp->Xv(), dy = mcYv - mcp->Yv();
661 Double_t ltAs=TMath::Sqrt(dx*dx + dy*dy);
663 Double_t dz=mcZv - mc0->Zv(); dy=mcYv - mc0->Yv(); dx=mcXv - mc0->Xv();
664 Double_t l = TMath::Sqrt(dx*dx + dy*dy + dz*dz);
665 if (l<lMax) { // Primary V0s
668 if (isK0s) fK0sAs->Fill(ptAs,ltAs);
671 if (isLambda) fLambdaAs->Fill(ptAs,ltAs);
674 if (isLambdaBar) fLambdaBarAs->Fill(ptAs,ltAs);
679 if (code==kK0Short) continue;
681 Int_t nx=mc0->GetMother();
682 AliAODMCParticle *xi=(AliAODMCParticle*)(*stack)[nx];
684 Int_t xcode=xi->GetPdgCode();
689 if ((xcode==kXiMinus) || (xcode==3322))
690 fLambdaFromXi->Fill(ptAs,ltAs,xi->Pt());
694 if ((xcode==kXiPlusBar)||(xcode==-3322))
695 fLambdaBarFromXiBar->Fill(ptAs,ltAs,xi->Pt());
704 Int_t ncs=aod->GetNumberOfCascades();
705 for (Int_t i=0; i<ncs; i++) {
706 AliAODcascade *cs=aod->GetCascade(i);
708 Double_t pt=TMath::Sqrt(cs->Pt2Xi());
709 if (pt < pMin) continue;
710 if (TMath::Abs(cs->RapXi()) > yMax) continue;
711 if (!AcceptCascade(cs,aod)) continue;
713 const AliAODv0 *v0=(AliAODv0*)cs;
714 if (v0->RapLambda() > yMax) continue;
715 if (!AcceptV0(v0,aod)) continue;
717 //--- Cascade switches
718 Bool_t isXiMinus=kTRUE;
719 Bool_t isXiPlusBar=kTRUE;
721 const AliAODTrack *ptrack=(AliAODTrack *)v0->GetDaughter(0);
722 if (!AcceptPID(pidResponse, ptrack, stack)) isXiMinus=kFALSE;
724 const AliAODTrack *ntrack=(AliAODTrack *)v0->GetDaughter(1);
725 if (!AcceptPID(pidResponse, ntrack, stack)) isXiPlusBar=kFALSE;
727 Int_t charge=cs->ChargeXi();
728 if (charge > 0) isXiMinus=kFALSE;
729 if (charge < 0) isXiPlusBar=kFALSE;
733 Double_t mass=cs->MassXi();
735 Double_t m=TDatabasePDG::Instance()->GetParticle(kXiMinus)->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) {
746 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
752 Double_t mass=cs->MassXi();
753 fXiBarM->Fill(mass,pt);
754 Double_t m=TDatabasePDG::Instance()->GetParticle(kXiPlusBar)->Mass();
756 Double_t s=0.002 + (0.0032-0.002)/(6-1.5)*(pt-1.5);
757 if (TMath::Abs(m-mass) < 3*s) {
762 if (TMath::Abs(m-mass + 4.5*s) < 1.5*s) {
763 fXiBarSiP->Fill(pt,-1);
765 if (TMath::Abs(m-mass - 4.5*s) < 1.5*s) {
766 fXiBarSiP->Fill(pt,-1);
770 if (!fIsMC) continue;
774 if (!isXiPlusBar) continue;//check MC only for the accepted cascades
775 // Here is the future association with MC
781 void AliAnalysisTaskCTauPbPbaod::Terminate(Option_t *)
783 // The Terminate() function is the last function to be called during
784 // a query. It always runs on the client, it can be used to present
785 // the results graphically or save the results to file.
787 fOutput=(TList*)GetOutputData(1);
789 Printf("ERROR: fOutput not available");
793 fMult = dynamic_cast<TH1F*>(fOutput->FindObject("fMult")) ;
795 Printf("ERROR: fMult not available");
799 fdEdx = dynamic_cast<TH2F*>(fOutput->FindObject("fdEdx")) ;
801 Printf("ERROR: fdEdx not available");
805 fdEdxPid = dynamic_cast<TH2F*>(fOutput->FindObject("fdEdxPid")) ;
807 Printf("ERROR: fdEdxPid not available");
812 fK0sMC = dynamic_cast<TH2F*>(fOutput->FindObject("fK0sMC")) ;
814 Printf("ERROR: fK0sMC not available");
817 TH1D *k0sMcPx=fK0sMC->ProjectionX(); k0sMcPx->Sumw2();
818 fK0sAs = dynamic_cast<TH2F*>(fOutput->FindObject("fK0sAs")) ;
820 Printf("ERROR: fK0sAs not available");
823 TH1D *k0sAsPx=fK0sAs->ProjectionX();
824 k0sAsPx->Sumw2(); //k0sAsPx->Scale(0.69);
829 fLambdaFromXi = dynamic_cast<TH3F*>(fOutput->FindObject("fLambdaFromXi")) ;
830 if (!fLambdaFromXi) {
831 Printf("ERROR: fLambdaFromXi not available");
834 TH1D *lambdaFromXiPx=fLambdaFromXi->ProjectionX(); lambdaFromXiPx->Sumw2();
836 fLambdaMC = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaMC")) ;
838 Printf("ERROR: fLambdaMC not available");
841 TH1D *lambdaMcPx=fLambdaMC->ProjectionX(); lambdaMcPx->Sumw2();
843 fLambdaAs = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaAs")) ;
845 Printf("ERROR: fLambdaAs not available");
848 TH1D *lambdaAsPx=fLambdaAs->ProjectionX();
849 lambdaAsPx->Sumw2(); //lambdaAsPx->Scale(0.64);
851 fLambdaSi = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaSi")) ;
853 Printf("ERROR: fLambdaSi not available");
856 TH1D *lambdaSiPx=fLambdaSi->ProjectionX();
857 lambdaSiPx->SetName("fLambdaPt");
860 fLambdaEff = dynamic_cast<TH1D*>(fOutput->FindObject("fLambdaEff")) ;
862 Printf("ERROR: fLambdaEff not available");
865 fLambdaPt = dynamic_cast<TH1D*>(fOutput->FindObject("fLambdaPt")) ;
867 Printf("ERROR: fLambdaPt not available");
872 // anti-Lambda histograms
873 fLambdaBarFromXiBar =
874 dynamic_cast<TH3F*>(fOutput->FindObject("fLambdaBarFromXiBar")) ;
875 if (!fLambdaBarFromXiBar) {
876 Printf("ERROR: fLambdaBarFromXiBar not available");
879 TH1D *lambdaBarFromXiBarPx=
880 fLambdaBarFromXiBar->ProjectionX("Bar"); lambdaBarFromXiBarPx->Sumw2();
882 fLambdaBarMC = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaBarMC")) ;
884 Printf("ERROR: fLambdaBarMC not available");
887 TH1D *lambdaBarMcPx=fLambdaBarMC->ProjectionX(); lambdaBarMcPx->Sumw2();
889 fLambdaBarAs = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaBarAs")) ;
891 Printf("ERROR: fLambdaBarAs not available");
894 TH1D *lambdaBarAsPx=fLambdaBarAs->ProjectionX();
895 lambdaBarAsPx->Sumw2(); //lambdaBarAsPx->Scale(0.64);
897 fLambdaBarSi = dynamic_cast<TH2F*>(fOutput->FindObject("fLambdaBarSi")) ;
899 Printf("ERROR: fLambdaBarSi not available");
902 TH1D *lambdaBarSiPx=fLambdaBarSi->ProjectionX();
903 lambdaBarSiPx->SetName("fLambdaBarPt");
904 lambdaBarSiPx->Sumw2();
906 fLambdaBarEff = dynamic_cast<TH1D*>(fOutput->FindObject("fLambdaBarEff")) ;
907 if (!fLambdaBarEff) {
908 Printf("ERROR: fLambdaBarEff not available");
911 fLambdaBarPt = dynamic_cast<TH1D*>(fOutput->FindObject("fLambdaBarPt")) ;
913 Printf("ERROR: fLambdaBarPt not available");
918 if (!gROOT->IsBatch()) {
920 TCanvas *c1 = new TCanvas("c1","Mulitplicity");
924 new TCanvas("c2","dE/dx");
927 new TCanvas("c3","dE/dx with PID");
928 fdEdxPid->DrawCopy() ;
932 TH1D effK(*k0sAsPx); effK.SetTitle("Efficiency for K0s");
933 effK.Divide(k0sAsPx,k0sMcPx,1,1,"b");
934 new TCanvas("c4","Efficiency for K0s");
939 fLambdaEff->Divide(lambdaAsPx,lambdaMcPx,1,1,"b");
940 new TCanvas("c5","Efficiency for #Lambda");
941 fLambdaEff->DrawCopy("E") ;
943 lambdaSiPx->Add(lambdaFromXiPx,-1);
944 lambdaSiPx->Divide(fLambdaEff);
946 new TCanvas("c6","Corrected #Lambda pt");
947 lambdaSiPx->SetTitle("Corrected #Lambda pt");
948 *fLambdaPt = *lambdaSiPx;
949 fLambdaPt->SetLineColor(2);
950 fLambdaPt->DrawCopy("E");
952 lambdaMcPx->DrawCopy("same");
956 fLambdaBarEff->Divide(lambdaBarAsPx,lambdaBarMcPx,1,1,"b");
957 new TCanvas("c7","Efficiency for anti-#Lambda");
958 fLambdaBarEff->DrawCopy("E") ;
960 lambdaBarSiPx->Add(lambdaBarFromXiBarPx,-1);
961 lambdaBarSiPx->Divide(fLambdaBarEff);
963 new TCanvas("c8","Corrected anti-#Lambda pt");
964 lambdaBarSiPx->SetTitle("Corrected anti-#Lambda pt");
965 *fLambdaBarPt = *lambdaBarSiPx;
966 fLambdaBarPt->SetLineColor(2);
967 fLambdaBarPt->DrawCopy("E");
969 lambdaBarMcPx->DrawCopy("same");
971 new TCanvas("c6","Raw #Lambda pt");
972 lambdaSiPx->SetTitle("Raw #Lambda pt");
973 *fLambdaPt = *lambdaSiPx;
974 fLambdaPt->SetLineColor(2);
975 fLambdaPt->DrawCopy("E");
978 new TCanvas("c7","Raw anti-#Lambda pt");
979 lambdaBarSiPx->SetTitle("Raw anti-#Lambda pt");
980 *fLambdaBarPt = *lambdaBarSiPx;
981 fLambdaBarPt->SetLineColor(2);
982 fLambdaBarPt->DrawCopy("E");