]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGJE/FlavourJetTasks/AliAnalysisTaskEmcalJetV0CF.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[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"));
301//=============================================================================
302
303 AliPicoV0MC *pV0 = 0;
304 for (Int_t i=0; i<fV0s->GetEntriesFast(); i++) {
305 pV0 = static_cast<AliPicoV0MC*>(fV0s->At(i)); if (!pV0) continue;
306
307 if (!pV0->IsV0PhysicalPrimary()) { pV0 = 0; continue; }
308 if (!pV0->IsV0InEtaAcc(fV0CutMinEta,fV0CutMaxEta)) { pV0 = 0; continue; }
309
310 TVector3 vV0 = pV0->KineMC().Vect();
311 Double_t dPt = vV0.Pt();
312 Double_t dVar[8];
313
314 dVar[0] = -1.;
315 if (pV0->IsKshort()) {
316 Int_t k = fHistoKshortInvM->FindBin(dPt); if (k<=0) { pV0 = 0; continue; }
317
318 Double_t dMean = fHistoKshortInvM->GetBinContent(k);
319 Double_t dSigma = fHistoKshortInvM->GetBinError(k);
320
321 Double_t dUpperL = dMean - (fKaCutNS * dSigma);
322 Double_t dLowerR = dMean + (fKaCutNS * dSigma);
323
324 Double_t dInvM = pV0->KineKshort().M();
325 if ((dInvM<dUpperL) || (dInvM>=dLowerR)) { pV0 = 0; continue; }
326
327 dVar[0] = 0.;
328 }
329
330 if (pV0->IsLambda()) {
331 Int_t k = fHistoLambdaInvM->FindBin(dPt); if (k<=0) { pV0 = 0; continue; }
332
333 Double_t dMean = fHistoLambdaInvM->GetBinContent(k);
334 Double_t dSigma = fHistoLambdaInvM->GetBinError(k);
335
336 Double_t dUpperL = dMean - (fLaCutNS * dSigma);
337 Double_t dLowerR = dMean + (fLaCutNS * dSigma);
338
339 Double_t dInvM = pV0->KineLambda().M();
340 if ((dInvM<dUpperL) || (dInvM>=dLowerR)) { pV0 = 0; continue; }
341
342 dVar[0] = 1.;
343 }
344
345 if (pV0->IsAntiLa()) {
346 Int_t k = fHistoAntiLaInvM->FindBin(dPt); if (k<=0) { pV0 = 0; continue; }
347
348 Double_t dMean = fHistoAntiLaInvM->GetBinContent(k);
349 Double_t dSigma = fHistoAntiLaInvM->GetBinError(k);
350
351 Double_t dUpperL = dMean - (fLaCutNS * dSigma);
352 Double_t dLowerR = dMean + (fLaCutNS * dSigma);
353
354 Double_t dInvM = pV0->KineAntiLa().M();
355 if ((dInvM<dUpperL) || (dInvM>=dLowerR)) { pV0 = 0; continue; }
356
357 dVar[0] = 2.;
358 }
359
360 if (dVar[0]<-0.5) { pV0 = 0; continue; }
361
362 dVar[1] = -1.;
363 if (IsV0InJet(vV0,10.)) dVar[1] = 0.5;
364 if (IsV0InJet(vV0,15.)) dVar[1] = 1.5;
365 if (IsV0InJet(vV0,20.)) dVar[1] = 2.5;
366 if (IsV0InJet(vV0,25.)) dVar[1] = 3.5;
367 if (dVar[1]<0.) { pV0 = 0; continue; }
368
369 dVar[2] = dV0M;
370 dVar[3] = dV0A;
371 dVar[4] = dCL1;
372 dVar[5] = dZNA;
373
374 dVar[6] = vV0.Eta();
375 dVar[7] = dPt;
376
377 hs->Fill(dVar);
378
379 pV0 = 0;
380 }
381
382 return kFALSE;
383}
384
385//_____________________________________________________________________________
386Bool_t AliAnalysisTaskEmcalJetV0CF::FillKineInfo()
387{
388//
389// AliAnalysisTaskEmcalJetV0CF::FillKineInfo
390//
391
392 Double_t dV0M = fCentInfo->GetCentralityPercentile("V0M");
393 Double_t dV0A = fCentInfo->GetCentralityPercentile("V0A");
394 Double_t dCL1 = fCentInfo->GetCentralityPercentile("CL1");
395 Double_t dZNA = fCentInfo->GetCentralityPercentile("ZNA");
396
397 THnSparseD *hs = dynamic_cast<THnSparseD*>(fListUserOutputs->FindObject("hsKine"));
398//=============================================================================
399
400 AliStack *pStack = 0;
401 if (fEventESD) { pStack = MCEvent()->Stack(); if (!pStack) return kTRUE; }
402//=============================================================================
403
404 TParticle *pESD = 0;
405 AliAODMCParticle *pAOD = 0;
406 for (Int_t i=0; i<MCEvent()->GetNumberOfTracks(); i++) {
407 if (fEventAOD) { pAOD = (AliAODMCParticle*)MCEvent()->GetTrack(i); if (!pAOD) continue; }
408 if (fEventESD) { pESD = ((AliMCParticle*)MCEvent()->GetTrack(i))->Particle(); if (!pESD) continue; }
409
410 Bool_t bPhy = kFALSE;
411 if (pAOD) bPhy = pAOD->IsPhysicalPrimary();
412 if (pESD) bPhy = pStack->IsPhysicalPrimary(i);
413 if (!bPhy) { pAOD=0; pESD=0; continue; }
414
415 Double_t dEta = 0.;
416 if (pAOD) dEta = pAOD->Eta();
417 if (pESD) dEta = pESD->Eta();
418 if ((dEta<fV0CutMinEta) || (dEta>=fV0CutMaxEta)) { pAOD=0; pESD=0; continue; }
419
420 Int_t id = 0;
421 if (pAOD) id = pAOD->GetPdgCode();
422 if (pESD) id = pESD->GetPdgCode();
423
424 Double_t dVar[8]; dVar[0] = -1.;
425 if (id== 310 ) dVar[0] = 0.;
426 if (id== 3122) dVar[0] = 1.;
427 if (id==-3122) dVar[0] = 2.;
428 if (dVar[0]<-0.5) { pAOD=0; pESD=0; continue; }
429
430 TVector3 vV0;
431 if (pAOD) vV0.SetXYZ(pAOD->Px(), pAOD->Py(), pAOD->Pz());
432 if (pESD) vV0.SetXYZ(pESD->Px(), pESD->Py(), pESD->Pz());
433
434 dVar[1] = -1.;
435 if (IsV0InJet(vV0,10.)) dVar[1] = 0.5;
436 if (IsV0InJet(vV0,15.)) dVar[1] = 1.5;
437 if (IsV0InJet(vV0,20.)) dVar[1] = 2.5;
438 if (IsV0InJet(vV0,25.)) dVar[1] = 3.5;
439 if (dVar[1]<0.) { pAOD=0; pESD=0; continue; }
440
441 dVar[2] = dV0M;
442 dVar[3] = dV0A;
443 dVar[4] = dCL1;
444 dVar[5] = dZNA;
445 dVar[6] = dEta;
446 if (pAOD) dVar[7] = pAOD->Pt();
447 if (pESD) dVar[7] = pESD->Pt();
448 hs->Fill(dVar);
449
450 pAOD = 0;
451 pESD = 0;
452 }
453
454 return kFALSE;
455}
456
457//_____________________________________________________________________________
458Bool_t AliAnalysisTaskEmcalJetV0CF::IsV0InJet(TVector3 vV0, Double_t dJetPtMin)
459{
460//
461// AliAnalysisTaskEmcalJetV0CF::IsV0InJet
462//
463
464 if (!fJetsContRD) return kFALSE;
465//=============================================================================
466
467 TVector3 vJet;
468 Double_t dJetRadius = fJetsContRD->GetJetRadius();
469 AliEmcalJet *pJet = fJetsContRD->GetNextAcceptJet(0); while (pJet) {
470 Double_t dPt = fJetsContRD->GetJetPtCorr(fJetsContRD->GetCurrentID());
471 if (dPt<dJetPtMin) { pJet = fJetsContRD->GetNextAcceptJet(); continue; }
472
473 vJet.SetPtEtaPhi(dPt, pJet->Eta(), pJet->Phi());
474 if (vJet.DeltaR(vV0)<dJetRadius) return kTRUE;
475 pJet = fJetsContRD->GetNextAcceptJet();
476 }
477
478 return kFALSE;
479}