]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGJE/FlavourJetTasks/AliAnalysisTaskEmcalJetV0CF.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGJE / FlavourJetTasks / AliAnalysisTaskEmcalJetV0CF.cxx
CommitLineData
b254f323 1#include <THnSparse.h>
2#include <TClonesArray.h>
3#include <TParticle.h>
4
5#include "AliAODEvent.h"
6#include "AliESDEvent.h"
7#include "AliMCEvent.h"
8#include "AliStack.h"
9#include "AliMCParticle.h"
10#include "AliAODMCParticle.h"
11
12#include "AliEmcalJet.h"
13#include "AliJetContainer.h"
14#include "AliParticleContainer.h"
15#include "AliClusterContainer.h"
16
17#include "AliPicoV0MC.h"
18#include "AliAnalysisTaskEmcalJetV0CF.h"
19
20ClassImp(AliAnalysisTaskEmcalJetV0CF)
21
22//_____________________________________________________________________________
23AliAnalysisTaskEmcalJetV0CF::AliAnalysisTaskEmcalJetV0CF() :
24AliAnalysisTaskEmcalJet(),
25fKaCutNS(0.),
26fLaCutNS(0.),
27fV0CutMinEta(0.),
28fV0CutMaxEta(0.),
29fEventAOD(0),
30fEventESD(0),
31fCentInfo(0),
32fJetsContRD(0),
33fTracksContRD(0),
34fCaloClustersContRD(0),
35fJetsContMC(0),
36fTracksContMC(0),
37fV0s(0),
38fHistoKshortInvM(0),
39fHistoLambdaInvM(0),
40fHistoAntiLaInvM(0),
41fListUserOutputs(0)
42{
43//
44// AliAnalysisTaskEmcalJetV0CF::AliAnalysisTaskEmcalJetV0CF
45//
46}
47
48//_____________________________________________________________________________
49AliAnalysisTaskEmcalJetV0CF::AliAnalysisTaskEmcalJetV0CF(const char *name, Bool_t bHistos) :
50AliAnalysisTaskEmcalJet(name,bHistos),
51fKaCutNS(6.),
52fLaCutNS(6.),
53fV0CutMinEta(-10.),
54fV0CutMaxEta(10.),
55fEventAOD(0),
56fEventESD(0),
57fCentInfo(0),
58fJetsContRD(0),
59fTracksContRD(0),
60fCaloClustersContRD(0),
61fJetsContMC(0),
62fTracksContMC(0),
63fV0s(0),
64fHistoKshortInvM(0),
65fHistoLambdaInvM(0),
66fHistoAntiLaInvM(0),
67fListUserOutputs(0)
68{
69//
70// AliAnalysisTaskEmcalJetV0CF::AliAnalysisTaskEmcalJetV0CF
71//
72
73 AliAnalysisTaskEmcal::fGeneralHistograms = bHistos;
74
75 DefineOutput(2, TList::Class());
76}
77
78//_____________________________________________________________________________
79AliAnalysisTaskEmcalJetV0CF::~AliAnalysisTaskEmcalJetV0CF()
80{
81//
82// AliAnalysisTaskEmcalJetV0CF::~AliAnalysisTaskEmcalJetV0CF
83//
84
85 if (fEventAOD) { delete fEventAOD; fEventAOD = 0; }
86 if (fEventESD) { delete fEventESD; fEventESD = 0; }
87 if (fCentInfo) { delete fCentInfo; fCentInfo = 0; }
88
89 if (fJetsContRD) { delete fJetsContRD; fJetsContRD = 0; }
90 if (fTracksContRD) { delete fTracksContRD; fTracksContRD = 0; }
91 if (fCaloClustersContRD) { delete fCaloClustersContRD; fCaloClustersContRD = 0; }
92
93 if (fJetsContMC) { delete fJetsContMC; fJetsContMC = 0; }
94 if (fTracksContMC) { delete fTracksContMC; fTracksContMC = 0; }
95
96 if (fV0s) { delete fV0s; fV0s = 0; }
97
98 if (fHistoKshortInvM) { delete fHistoKshortInvM; fHistoKshortInvM = 0; }
99 if (fHistoLambdaInvM) { delete fHistoLambdaInvM; fHistoLambdaInvM = 0; }
100 if (fHistoAntiLaInvM) { delete fHistoAntiLaInvM; fHistoAntiLaInvM = 0; }
101
102 if (fListUserOutputs) { delete fListUserOutputs; fListUserOutputs = 0; }
103}
104
105//_____________________________________________________________________________
106void AliAnalysisTaskEmcalJetV0CF::Init()
107{
108//
109// AliAnalysisTaskEmcalJetV0CF::Init
110//
111
112 return;
113}
114
115//_____________________________________________________________________________
116void AliAnalysisTaskEmcalJetV0CF::UserCreateOutputObjects()
117{
118//
119// AliAnalysisTaskEmcalJetV0CF::UserCreateOutputObjects
120//
121
122 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
123//=============================================================================
124
125 fJetsContRD = GetJetContainer(0);
126 if (fJetsContRD) {
127 fTracksContRD = fJetsContRD->GetParticleContainer();
128 fCaloClustersContRD = fJetsContRD->GetClusterContainer();
129 }
130
131 fJetsContMC = GetJetContainer(1);
132 if (fJetsContMC) fTracksContMC = fJetsContMC->GetParticleContainer();
133//=============================================================================
134
135 fListUserOutputs = new TList();
136 fListUserOutputs->SetOwner();
137 CreateUserOutputHistograms();
138 PostData(2, fListUserOutputs);
139 return;
140}
141
142//_____________________________________________________________________________
143void AliAnalysisTaskEmcalJetV0CF::Terminate(Option_t *opt)
144{
145//
146// AliAnalysisTaskEmcalJetV0CF::Terminate
147//
148
149 AliAnalysisTaskEmcalJet::Terminate(opt);
150
151 return;
152}
153
154//_____________________________________________________________________________
155Bool_t AliAnalysisTaskEmcalJetV0CF::Run()
156{
157//
158// AliAnalysisTaskEmcalJetV0CF::Run
159//
160
161 if (!AliAnalysisTaskEmcalJet::Run()) return kFALSE;
162
163 return kTRUE;
164}
165
166//_____________________________________________________________________________
167Bool_t AliAnalysisTaskEmcalJetV0CF::RetrieveEventObjects()
168{
169//
170// AliAnalysisTaskEmcalJetV0CF::RetrieveEventObjects
171//
172
173 if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects()) return kFALSE;
174
175 fCentInfo = InputEvent()->GetCentrality(); if (!fCentInfo) return kFALSE;
176
177 fEventAOD = dynamic_cast<AliAODEvent*>(InputEvent());
178 fEventESD = dynamic_cast<AliESDEvent*>(InputEvent());
179 if ((!fEventAOD) && (!fEventESD)) return kFALSE;
180
181 return kTRUE;
182}
183
184//_____________________________________________________________________________
185Bool_t AliAnalysisTaskEmcalJetV0CF::IsEventSelected()
186{
187//
188// AliAnalysisTaskEmcalJetV0CF::IsEventSelected
189//
190
191 if (!AliAnalysisTaskEmcalJet::IsEventSelected()) return kFALSE;
192
193 return kTRUE;
194}
195
196//_____________________________________________________________________________
197Bool_t AliAnalysisTaskEmcalJetV0CF::FillHistograms()
198{
199//
200// AliAnalysisTaskEmcalJetV0CF::FillHistograms
201//
202
203 if (!AliAnalysisTaskEmcalJet::FillHistograms()) return kFALSE;
204
205 if (FillRecoInfo()) return kFALSE;
206 if (FillKineInfo()) return kFALSE;
207
208 return kTRUE;
209}
210
211//_____________________________________________________________________________
212Bool_t AliAnalysisTaskEmcalJetV0CF::FillGeneralHistograms()
213{
214//
215// AliAnalysisTaskEmcalJetV0CF::FillGeneralHistograms
216//
217
218 if (!AliAnalysisTaskEmcalJet::FillGeneralHistograms()) return kFALSE;
219
220 return kTRUE;
221}
222
223//_____________________________________________________________________________
224void AliAnalysisTaskEmcalJetV0CF::ExecOnce()
225{
226//
227// AliAnalysisTaskEmcalJetV0CF::ExecOnce
228//
229
230 AliAnalysisTaskEmcalJet::ExecOnce();
231
232 if (!fInitialized) return;
233
234 if (!fV0s) {
235 fV0s = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject("PicoV0s"));
236
237 if (!fV0s) {
238 AliError(Form("%s: Could not retrieve V0 %s!", GetName(), "PicoV0s"));
239 fInitialized = kFALSE;
240 return;
241 }
242 }
243
244 return;
245}
246
247//_____________________________________________________________________________
248void AliAnalysisTaskEmcalJetV0CF::CreateUserOutputHistograms()
249{
250//
251// AliAnalysisTaskEmcalJetV0CF::CreateUserOutputHistograms
252//
253
254 if (!fListUserOutputs) return;
255
256 Bool_t bStatusTmpH = TH1::AddDirectoryStatus();
257 TH1::AddDirectory(kFALSE);
258
259 const Int_t nV0 = 8; // 0: particle type
260 // ==0, Kshort
261 // ==1, Lambda
262 // ==2, AntiLa
263 // 1: Jet pT bin
264 // == 0.5, jet pT>10.
265 // == 1.5, jet pT>15.
266 // == 2.5, jet pT>20.
267 // == 3.5, jet pT>25.
268 // 2: V0M
269 // 3: V0A
270 // 4: CL1
271 // 5: ZNA
272 // 6: eta
273 // 7: Pt
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. };
277
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);
280
281 TH1::AddDirectory(bStatusTmpH);
282 return;
283}
284
285//_____________________________________________________________________________
286Bool_t AliAnalysisTaskEmcalJetV0CF::FillRecoInfo()
287{
288//
289// AliAnalysisTaskEmcalJetV0CF::FillRecoInfo
290//
291
292 if (!fV0s) return kTRUE;
293//=============================================================================
294
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");
299
300 THnSparseD *hs = dynamic_cast<THnSparseD*>(fListUserOutputs->FindObject("hsReco"));
81fe377a 301 if (!hs)
302 return kTRUE; // should not happen; make Coverity happen
b254f323 303//=============================================================================
304
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;
308
309 if (!pV0->IsV0PhysicalPrimary()) { pV0 = 0; continue; }
310 if (!pV0->IsV0InEtaAcc(fV0CutMinEta,fV0CutMaxEta)) { pV0 = 0; continue; }
311
312 TVector3 vV0 = pV0->KineMC().Vect();
313 Double_t dPt = vV0.Pt();
314 Double_t dVar[8];
315
316 dVar[0] = -1.;
317 if (pV0->IsKshort()) {
318 Int_t k = fHistoKshortInvM->FindBin(dPt); if (k<=0) { pV0 = 0; continue; }
319
320 Double_t dMean = fHistoKshortInvM->GetBinContent(k);
321 Double_t dSigma = fHistoKshortInvM->GetBinError(k);
322
323 Double_t dUpperL = dMean - (fKaCutNS * dSigma);
324 Double_t dLowerR = dMean + (fKaCutNS * dSigma);
325
326 Double_t dInvM = pV0->KineKshort().M();
327 if ((dInvM<dUpperL) || (dInvM>=dLowerR)) { pV0 = 0; continue; }
328
329 dVar[0] = 0.;
330 }
331
332 if (pV0->IsLambda()) {
333 Int_t k = fHistoLambdaInvM->FindBin(dPt); if (k<=0) { pV0 = 0; continue; }
334
335 Double_t dMean = fHistoLambdaInvM->GetBinContent(k);
336 Double_t dSigma = fHistoLambdaInvM->GetBinError(k);
337
338 Double_t dUpperL = dMean - (fLaCutNS * dSigma);
339 Double_t dLowerR = dMean + (fLaCutNS * dSigma);
340
341 Double_t dInvM = pV0->KineLambda().M();
342 if ((dInvM<dUpperL) || (dInvM>=dLowerR)) { pV0 = 0; continue; }
343
344 dVar[0] = 1.;
345 }
346
347 if (pV0->IsAntiLa()) {
348 Int_t k = fHistoAntiLaInvM->FindBin(dPt); if (k<=0) { pV0 = 0; continue; }
349
350 Double_t dMean = fHistoAntiLaInvM->GetBinContent(k);
351 Double_t dSigma = fHistoAntiLaInvM->GetBinError(k);
352
353 Double_t dUpperL = dMean - (fLaCutNS * dSigma);
354 Double_t dLowerR = dMean + (fLaCutNS * dSigma);
355
356 Double_t dInvM = pV0->KineAntiLa().M();
357 if ((dInvM<dUpperL) || (dInvM>=dLowerR)) { pV0 = 0; continue; }
358
359 dVar[0] = 2.;
360 }
361
362 if (dVar[0]<-0.5) { pV0 = 0; continue; }
363
364 dVar[1] = -1.;
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; }
370
371 dVar[2] = dV0M;
372 dVar[3] = dV0A;
373 dVar[4] = dCL1;
374 dVar[5] = dZNA;
375
376 dVar[6] = vV0.Eta();
377 dVar[7] = dPt;
378
379 hs->Fill(dVar);
380
381 pV0 = 0;
382 }
383
384 return kFALSE;
385}
386
387//_____________________________________________________________________________
388Bool_t AliAnalysisTaskEmcalJetV0CF::FillKineInfo()
389{
390//
391// AliAnalysisTaskEmcalJetV0CF::FillKineInfo
392//
393
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");
398
399 THnSparseD *hs = dynamic_cast<THnSparseD*>(fListUserOutputs->FindObject("hsKine"));
81fe377a 400 if (!hs) {
401 return kTRUE; // Should not happen; make Coverity happy
402 }
b254f323 403//=============================================================================
404
405 AliStack *pStack = 0;
406 if (fEventESD) { pStack = MCEvent()->Stack(); if (!pStack) return kTRUE; }
407//=============================================================================
408
409 TParticle *pESD = 0;
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; }
414
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; }
419
420 Double_t dEta = 0.;
421 if (pAOD) dEta = pAOD->Eta();
422 if (pESD) dEta = pESD->Eta();
423 if ((dEta<fV0CutMinEta) || (dEta>=fV0CutMaxEta)) { pAOD=0; pESD=0; continue; }
424
425 Int_t id = 0;
426 if (pAOD) id = pAOD->GetPdgCode();
427 if (pESD) id = pESD->GetPdgCode();
428
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; }
434
435 TVector3 vV0;
436 if (pAOD) vV0.SetXYZ(pAOD->Px(), pAOD->Py(), pAOD->Pz());
437 if (pESD) vV0.SetXYZ(pESD->Px(), pESD->Py(), pESD->Pz());
438
439 dVar[1] = -1.;
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; }
445
446 dVar[2] = dV0M;
447 dVar[3] = dV0A;
448 dVar[4] = dCL1;
449 dVar[5] = dZNA;
450 dVar[6] = dEta;
451 if (pAOD) dVar[7] = pAOD->Pt();
452 if (pESD) dVar[7] = pESD->Pt();
453 hs->Fill(dVar);
454
455 pAOD = 0;
456 pESD = 0;
457 }
458
459 return kFALSE;
460}
461
462//_____________________________________________________________________________
463Bool_t AliAnalysisTaskEmcalJetV0CF::IsV0InJet(TVector3 vV0, Double_t dJetPtMin)
464{
465//
466// AliAnalysisTaskEmcalJetV0CF::IsV0InJet
467//
468
469 if (!fJetsContRD) return kFALSE;
470//=============================================================================
471
472 TVector3 vJet;
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; }
477
478 vJet.SetPtEtaPhi(dPt, pJet->Eta(), pJet->Phi());
479 if (vJet.DeltaR(vV0)<dJetRadius) return kTRUE;
480 pJet = fJetsContRD->GetNextAcceptJet();
481 }
482
483 return kFALSE;
484}