2 #include <TClonesArray.h>
5 #include "AliAODEvent.h"
6 #include "AliESDEvent.h"
7 #include "AliMCEvent.h"
9 #include "AliMCParticle.h"
10 #include "AliAODMCParticle.h"
12 #include "AliEmcalJet.h"
13 #include "AliJetContainer.h"
14 #include "AliParticleContainer.h"
15 #include "AliClusterContainer.h"
17 #include "AliPicoV0MC.h"
18 #include "AliAnalysisTaskEmcalJetV0CF.h"
20 ClassImp(AliAnalysisTaskEmcalJetV0CF)
22 //_____________________________________________________________________________
23 AliAnalysisTaskEmcalJetV0CF::AliAnalysisTaskEmcalJetV0CF() :
24 AliAnalysisTaskEmcalJet(),
34 fCaloClustersContRD(0),
44 // AliAnalysisTaskEmcalJetV0CF::AliAnalysisTaskEmcalJetV0CF
48 //_____________________________________________________________________________
49 AliAnalysisTaskEmcalJetV0CF::AliAnalysisTaskEmcalJetV0CF(const char *name, Bool_t bHistos) :
50 AliAnalysisTaskEmcalJet(name,bHistos),
60 fCaloClustersContRD(0),
70 // AliAnalysisTaskEmcalJetV0CF::AliAnalysisTaskEmcalJetV0CF
73 AliAnalysisTaskEmcal::fGeneralHistograms = bHistos;
75 DefineOutput(2, TList::Class());
78 //_____________________________________________________________________________
79 AliAnalysisTaskEmcalJetV0CF::~AliAnalysisTaskEmcalJetV0CF()
82 // AliAnalysisTaskEmcalJetV0CF::~AliAnalysisTaskEmcalJetV0CF
85 if (fEventAOD) { delete fEventAOD; fEventAOD = 0; }
86 if (fEventESD) { delete fEventESD; fEventESD = 0; }
87 if (fCentInfo) { delete fCentInfo; fCentInfo = 0; }
89 if (fJetsContRD) { delete fJetsContRD; fJetsContRD = 0; }
90 if (fTracksContRD) { delete fTracksContRD; fTracksContRD = 0; }
91 if (fCaloClustersContRD) { delete fCaloClustersContRD; fCaloClustersContRD = 0; }
93 if (fJetsContMC) { delete fJetsContMC; fJetsContMC = 0; }
94 if (fTracksContMC) { delete fTracksContMC; fTracksContMC = 0; }
96 if (fV0s) { delete fV0s; fV0s = 0; }
98 if (fHistoKshortInvM) { delete fHistoKshortInvM; fHistoKshortInvM = 0; }
99 if (fHistoLambdaInvM) { delete fHistoLambdaInvM; fHistoLambdaInvM = 0; }
100 if (fHistoAntiLaInvM) { delete fHistoAntiLaInvM; fHistoAntiLaInvM = 0; }
102 if (fListUserOutputs) { delete fListUserOutputs; fListUserOutputs = 0; }
105 //_____________________________________________________________________________
106 void AliAnalysisTaskEmcalJetV0CF::Init()
109 // AliAnalysisTaskEmcalJetV0CF::Init
115 //_____________________________________________________________________________
116 void AliAnalysisTaskEmcalJetV0CF::UserCreateOutputObjects()
119 // AliAnalysisTaskEmcalJetV0CF::UserCreateOutputObjects
122 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
123 //=============================================================================
125 fJetsContRD = GetJetContainer(0);
127 fTracksContRD = fJetsContRD->GetParticleContainer();
128 fCaloClustersContRD = fJetsContRD->GetClusterContainer();
131 fJetsContMC = GetJetContainer(1);
132 if (fJetsContMC) fTracksContMC = fJetsContMC->GetParticleContainer();
133 //=============================================================================
135 fListUserOutputs = new TList();
136 fListUserOutputs->SetOwner();
137 CreateUserOutputHistograms();
138 PostData(2, fListUserOutputs);
142 //_____________________________________________________________________________
143 void AliAnalysisTaskEmcalJetV0CF::Terminate(Option_t *opt)
146 // AliAnalysisTaskEmcalJetV0CF::Terminate
149 AliAnalysisTaskEmcalJet::Terminate(opt);
154 //_____________________________________________________________________________
155 Bool_t AliAnalysisTaskEmcalJetV0CF::Run()
158 // AliAnalysisTaskEmcalJetV0CF::Run
161 if (!AliAnalysisTaskEmcalJet::Run()) return kFALSE;
166 //_____________________________________________________________________________
167 Bool_t AliAnalysisTaskEmcalJetV0CF::RetrieveEventObjects()
170 // AliAnalysisTaskEmcalJetV0CF::RetrieveEventObjects
173 if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects()) return kFALSE;
175 fCentInfo = InputEvent()->GetCentrality(); if (!fCentInfo) return kFALSE;
177 fEventAOD = dynamic_cast<AliAODEvent*>(InputEvent());
178 fEventESD = dynamic_cast<AliESDEvent*>(InputEvent());
179 if ((!fEventAOD) && (!fEventESD)) return kFALSE;
184 //_____________________________________________________________________________
185 Bool_t AliAnalysisTaskEmcalJetV0CF::IsEventSelected()
188 // AliAnalysisTaskEmcalJetV0CF::IsEventSelected
191 if (!AliAnalysisTaskEmcalJet::IsEventSelected()) return kFALSE;
196 //_____________________________________________________________________________
197 Bool_t AliAnalysisTaskEmcalJetV0CF::FillHistograms()
200 // AliAnalysisTaskEmcalJetV0CF::FillHistograms
203 if (!AliAnalysisTaskEmcalJet::FillHistograms()) return kFALSE;
205 if (FillRecoInfo()) return kFALSE;
206 if (FillKineInfo()) return kFALSE;
211 //_____________________________________________________________________________
212 Bool_t AliAnalysisTaskEmcalJetV0CF::FillGeneralHistograms()
215 // AliAnalysisTaskEmcalJetV0CF::FillGeneralHistograms
218 if (!AliAnalysisTaskEmcalJet::FillGeneralHistograms()) return kFALSE;
223 //_____________________________________________________________________________
224 void AliAnalysisTaskEmcalJetV0CF::ExecOnce()
227 // AliAnalysisTaskEmcalJetV0CF::ExecOnce
230 AliAnalysisTaskEmcalJet::ExecOnce();
232 if (!fInitialized) return;
235 fV0s = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject("PicoV0s"));
238 AliError(Form("%s: Could not retrieve V0 %s!", GetName(), "PicoV0s"));
239 fInitialized = kFALSE;
247 //_____________________________________________________________________________
248 void AliAnalysisTaskEmcalJetV0CF::CreateUserOutputHistograms()
251 // AliAnalysisTaskEmcalJetV0CF::CreateUserOutputHistograms
254 if (!fListUserOutputs) return;
256 Bool_t bStatusTmpH = TH1::AddDirectoryStatus();
257 TH1::AddDirectory(kFALSE);
259 const Int_t nV0 = 8; // 0: particle type
264 // == 0.5, jet pT>10.
265 // == 1.5, jet pT>15.
266 // == 2.5, jet pT>20.
267 // == 3.5, jet pT>25.
274 const Int_t nV0Bin[nV0] = { 3, 4, 210, 210, 210, 210, 100, 1000 };
275 const Double_t dV0Min[nV0] = { -0.5, 0., -10., -10., -10., -10., -5., 0. };
276 const Double_t dV0Max[nV0] = { 2.5, 4., 200., 200., 200., 200., 5., 100. };
278 THnSparseD *hsReco = new THnSparseD("hsReco", "", nV0, nV0Bin, dV0Min, dV0Max); fListUserOutputs->Add(hsReco);
279 THnSparseD *hsKine = new THnSparseD("hsKine", "", nV0, nV0Bin, dV0Min, dV0Max); fListUserOutputs->Add(hsKine);
281 TH1::AddDirectory(bStatusTmpH);
285 //_____________________________________________________________________________
286 Bool_t AliAnalysisTaskEmcalJetV0CF::FillRecoInfo()
289 // AliAnalysisTaskEmcalJetV0CF::FillRecoInfo
292 if (!fV0s) return kTRUE;
293 //=============================================================================
295 Double_t dV0M = fCentInfo->GetCentralityPercentile("V0M");
296 Double_t dV0A = fCentInfo->GetCentralityPercentile("V0A");
297 Double_t dCL1 = fCentInfo->GetCentralityPercentile("CL1");
298 Double_t dZNA = fCentInfo->GetCentralityPercentile("ZNA");
300 THnSparseD *hs = dynamic_cast<THnSparseD*>(fListUserOutputs->FindObject("hsReco"));
302 return kTRUE; // should not happen; make Coverity happen
303 //=============================================================================
305 AliPicoV0MC *pV0 = 0;
306 for (Int_t i=0; i<fV0s->GetEntriesFast(); i++) {
307 pV0 = static_cast<AliPicoV0MC*>(fV0s->At(i)); if (!pV0) continue;
309 if (!pV0->IsV0PhysicalPrimary()) { pV0 = 0; continue; }
310 if (!pV0->IsV0InEtaAcc(fV0CutMinEta,fV0CutMaxEta)) { pV0 = 0; continue; }
312 TVector3 vV0 = pV0->KineMC().Vect();
313 Double_t dPt = vV0.Pt();
317 if (pV0->IsKshort()) {
318 Int_t k = fHistoKshortInvM->FindBin(dPt); if (k<=0) { pV0 = 0; continue; }
320 Double_t dMean = fHistoKshortInvM->GetBinContent(k);
321 Double_t dSigma = fHistoKshortInvM->GetBinError(k);
323 Double_t dUpperL = dMean - (fKaCutNS * dSigma);
324 Double_t dLowerR = dMean + (fKaCutNS * dSigma);
326 Double_t dInvM = pV0->KineKshort().M();
327 if ((dInvM<dUpperL) || (dInvM>=dLowerR)) { pV0 = 0; continue; }
332 if (pV0->IsLambda()) {
333 Int_t k = fHistoLambdaInvM->FindBin(dPt); if (k<=0) { pV0 = 0; continue; }
335 Double_t dMean = fHistoLambdaInvM->GetBinContent(k);
336 Double_t dSigma = fHistoLambdaInvM->GetBinError(k);
338 Double_t dUpperL = dMean - (fLaCutNS * dSigma);
339 Double_t dLowerR = dMean + (fLaCutNS * dSigma);
341 Double_t dInvM = pV0->KineLambda().M();
342 if ((dInvM<dUpperL) || (dInvM>=dLowerR)) { pV0 = 0; continue; }
347 if (pV0->IsAntiLa()) {
348 Int_t k = fHistoAntiLaInvM->FindBin(dPt); if (k<=0) { pV0 = 0; continue; }
350 Double_t dMean = fHistoAntiLaInvM->GetBinContent(k);
351 Double_t dSigma = fHistoAntiLaInvM->GetBinError(k);
353 Double_t dUpperL = dMean - (fLaCutNS * dSigma);
354 Double_t dLowerR = dMean + (fLaCutNS * dSigma);
356 Double_t dInvM = pV0->KineAntiLa().M();
357 if ((dInvM<dUpperL) || (dInvM>=dLowerR)) { pV0 = 0; continue; }
362 if (dVar[0]<-0.5) { pV0 = 0; continue; }
365 if (IsV0InJet(vV0,10.)) dVar[1] = 0.5;
366 if (IsV0InJet(vV0,15.)) dVar[1] = 1.5;
367 if (IsV0InJet(vV0,20.)) dVar[1] = 2.5;
368 if (IsV0InJet(vV0,25.)) dVar[1] = 3.5;
369 if (dVar[1]<0.) { pV0 = 0; continue; }
387 //_____________________________________________________________________________
388 Bool_t AliAnalysisTaskEmcalJetV0CF::FillKineInfo()
391 // AliAnalysisTaskEmcalJetV0CF::FillKineInfo
394 Double_t dV0M = fCentInfo->GetCentralityPercentile("V0M");
395 Double_t dV0A = fCentInfo->GetCentralityPercentile("V0A");
396 Double_t dCL1 = fCentInfo->GetCentralityPercentile("CL1");
397 Double_t dZNA = fCentInfo->GetCentralityPercentile("ZNA");
399 THnSparseD *hs = dynamic_cast<THnSparseD*>(fListUserOutputs->FindObject("hsKine"));
401 return kTRUE; // Should not happen; make Coverity happy
403 //=============================================================================
405 AliStack *pStack = 0;
406 if (fEventESD) { pStack = MCEvent()->Stack(); if (!pStack) return kTRUE; }
407 //=============================================================================
410 AliAODMCParticle *pAOD = 0;
411 for (Int_t i=0; i<MCEvent()->GetNumberOfTracks(); i++) {
412 if (fEventAOD) { pAOD = (AliAODMCParticle*)MCEvent()->GetTrack(i); if (!pAOD) continue; }
413 if (fEventESD) { pESD = ((AliMCParticle*)MCEvent()->GetTrack(i))->Particle(); if (!pESD) continue; }
415 Bool_t bPhy = kFALSE;
416 if (pAOD) bPhy = pAOD->IsPhysicalPrimary();
417 if (pESD) bPhy = pStack->IsPhysicalPrimary(i);
418 if (!bPhy) { pAOD=0; pESD=0; continue; }
421 if (pAOD) dEta = pAOD->Eta();
422 if (pESD) dEta = pESD->Eta();
423 if ((dEta<fV0CutMinEta) || (dEta>=fV0CutMaxEta)) { pAOD=0; pESD=0; continue; }
426 if (pAOD) id = pAOD->GetPdgCode();
427 if (pESD) id = pESD->GetPdgCode();
429 Double_t dVar[8]; dVar[0] = -1.;
430 if (id== 310 ) dVar[0] = 0.;
431 if (id== 3122) dVar[0] = 1.;
432 if (id==-3122) dVar[0] = 2.;
433 if (dVar[0]<-0.5) { pAOD=0; pESD=0; continue; }
436 if (pAOD) vV0.SetXYZ(pAOD->Px(), pAOD->Py(), pAOD->Pz());
437 if (pESD) vV0.SetXYZ(pESD->Px(), pESD->Py(), pESD->Pz());
440 if (IsV0InJet(vV0,10.)) dVar[1] = 0.5;
441 if (IsV0InJet(vV0,15.)) dVar[1] = 1.5;
442 if (IsV0InJet(vV0,20.)) dVar[1] = 2.5;
443 if (IsV0InJet(vV0,25.)) dVar[1] = 3.5;
444 if (dVar[1]<0.) { pAOD=0; pESD=0; continue; }
451 if (pAOD) dVar[7] = pAOD->Pt();
452 if (pESD) dVar[7] = pESD->Pt();
462 //_____________________________________________________________________________
463 Bool_t AliAnalysisTaskEmcalJetV0CF::IsV0InJet(TVector3 vV0, Double_t dJetPtMin)
466 // AliAnalysisTaskEmcalJetV0CF::IsV0InJet
469 if (!fJetsContRD) return kFALSE;
470 //=============================================================================
473 Double_t dJetRadius = fJetsContRD->GetJetRadius();
474 AliEmcalJet *pJet = fJetsContRD->GetNextAcceptJet(0); while (pJet) {
475 Double_t dPt = fJetsContRD->GetJetPtCorr(fJetsContRD->GetCurrentID());
476 if (dPt<dJetPtMin) { pJet = fJetsContRD->GetNextAcceptJet(); continue; }
478 vJet.SetPtEtaPhi(dPt, pJet->Eta(), pJet->Phi());
479 if (vJet.DeltaR(vV0)<dJetRadius) return kTRUE;
480 pJet = fJetsContRD->GetNextAcceptJet();