1 /* Leading Charged Track+V0 Correlation.(Works for Real,Monte Carlo Data)
3 * University of Houston
4 * sandun.pahula.hewage@cern.ch
5 *****************************************************************************************/
19 #include "AliAnalysisManager.h"
20 #include "AliAODTrack.h"
21 #include "AliAODEvent.h"
23 #include "AliAODVertex.h"
24 #include "AliAODPid.h"
25 #include "AliPIDResponse.h"
26 #include "AliEventPoolManager.h"
27 #include "AliCentrality.h"
28 #include "AliAODHandler.h"
29 #include "AliAODInputHandler.h"
30 #include "AliAODMCParticle.h"
31 #include "AliInputEventHandler.h"
32 #include "AliVParticle.h"
33 #include "AliMultiplicity.h"
34 #include "AliAODMCHeader.h"
36 #include "AliExternalTrackParam.h"
38 #include "AliLeadingV0Correlation.h"
43 ClassImp(AliLeadingV0Correlation)
44 ClassImp(AliLeadingBasicParticle)
46 //---------------------------------------------------------------------------------------
47 AliLeadingV0Correlation::AliLeadingV0Correlation()
48 : AliAnalysisTaskSE(),
77 fCutDCAV0Daughters(0.),
79 fSpecialArmenterosCutK0s(0.),
83 fHistMCPrimaryVertexX(0),
84 fHistMCPrimaryVertexY(0),
85 fHistMCPrimaryVertexZ(0),
87 fHistMCPtAllLambda(0),
88 fHistMCPtAllAntiLambda(0),
91 fHistMCRapAntiLambda(0),
94 fHistMCPtAntiLambda(0),
95 fHistMCPtLambdaFromSigma(0),
96 fHistMCPtAntiLambdaFromSigma(0),
97 fHistPrimRawPtVsYK0s(0),
98 fHistPrimRawPtVsYLambda(0),
99 fHistPrimRawPtVsYAntiLambda(0),
100 fHistPrimaryVertexX(0),
101 fHistPrimaryVertexY(0),
102 fHistPrimaryVertexZ(0),
103 fHistDcaPosToPrimVertexK0vsMassK0(0),
104 fHistDcaNegToPrimVertexK0vsMassK0(0),
105 fHistRadiusV0K0vsMassK0(0),
106 fHistDecayLengthV0K0vsMassK0(0),
107 fHistDcaV0DaughtersK0vsMassK0(0),
108 fHistCosPointAngleK0vsMassK0(0),
109 fHistDcaPosToPrimVertexLvsMassL(0),
110 fHistDcaNegToPrimVertexLvsMassL(0),
111 fHistRadiusV0LvsMassL(0),
112 fHistDecayLengthV0LvsMassL(0),
113 fHistDcaV0DaughtersLvsMassL(0),
114 fHistCosPointAngleLvsMassL(0),
115 fHistDcaPosToPrimVertexAntiLvsMass(0),
116 fHistDcaNegToPrimVertexAntiLvsMass(0),
117 fHistRadiusV0AntiLvsMass(0),
118 fHistDecayLengthV0AntiLvsMass(0),
119 fHistDcaV0DaughtersAntiLvsMass(0),
120 fHistCosPointAngleAntiLvsMass(0),
123 fHistMassAntiLambda(0),
125 fHistPtVsMassLambda(0),
126 fHistPtVsMassAntiLambda(0),
127 fHistArmenterosPodolanskiK0(0),
128 fHistArmenterosPodolanskiLambda(0),
129 fHistArmenterosPodolanskiAntiLambda(0),
131 fHistAsMcPtLambda(0),
132 fHistAsMcPtAntiLambda(0),
133 fHistAsMcProdRadiusK0(0),
134 fHistAsMcProdRadiusLambda(0),
135 fHistAsMcProdRadiusAntiLambda(0),
136 fHistAsMcProdRadiusXvsYK0s(0),
137 fHistAsMcProdRadiusXvsYLambda(0),
138 fHistAsMcProdRadiusXvsYAntiLambda(0),
140 fHistPidMcMassLambda(0),
141 fHistPidMcMassAntiLambda(0),
142 fHistAsMcPtLambdaFromSigma(0),
143 fHistAsMcPtAntiLambdaFromSigma(0),
144 fHistAsMcSecondaryPtVsRapK0s(0),
145 fHistAsMcSecondaryPtVsRapLambda(0),
146 fHistAsMcSecondaryPtVsRapAntiLambda(0),
147 fHistAsMcSecondaryProdRadiusK0s(0),
148 fHistAsMcSecondaryProdRadiusLambda(0),
149 fHistAsMcSecondaryProdRadiusAntiLambda(0),
150 fHistAsMcSecondaryProdRadiusXvsYK0s(0),
151 fHistAsMcSecondaryProdRadiusXvsYLambda(0),
152 fHistAsMcSecondaryProdRadiusXvsYAntiLambda(0),
153 fHistAsMcSecondaryPtLambdaFromSigma(0),
154 fHistAsMcSecondaryPtAntiLambdaFromSigma(0),
166 fHistLeadInfoMixMC(0)
171 //---------------------------------------------------------------------------------------
172 AliLeadingV0Correlation::AliLeadingV0Correlation(const char *name)
173 : AliAnalysisTaskSE(name),
202 fCutDCAV0Daughters(0.),
204 fSpecialArmenterosCutK0s(0.),
208 fHistMCPrimaryVertexX(0),
209 fHistMCPrimaryVertexY(0),
210 fHistMCPrimaryVertexZ(0),
212 fHistMCPtAllLambda(0),
213 fHistMCPtAllAntiLambda(0),
216 fHistMCRapAntiLambda(0),
219 fHistMCPtAntiLambda(0),
220 fHistMCPtLambdaFromSigma(0),
221 fHistMCPtAntiLambdaFromSigma(0),
222 fHistPrimRawPtVsYK0s(0),
223 fHistPrimRawPtVsYLambda(0),
224 fHistPrimRawPtVsYAntiLambda(0),
225 fHistPrimaryVertexX(0),
226 fHistPrimaryVertexY(0),
227 fHistPrimaryVertexZ(0),
228 fHistDcaPosToPrimVertexK0vsMassK0(0),
229 fHistDcaNegToPrimVertexK0vsMassK0(0),
230 fHistRadiusV0K0vsMassK0(0),
231 fHistDecayLengthV0K0vsMassK0(0),
232 fHistDcaV0DaughtersK0vsMassK0(0),
233 fHistCosPointAngleK0vsMassK0(0),
234 fHistDcaPosToPrimVertexLvsMassL(0),
235 fHistDcaNegToPrimVertexLvsMassL(0),
236 fHistRadiusV0LvsMassL(0),
237 fHistDecayLengthV0LvsMassL(0),
238 fHistDcaV0DaughtersLvsMassL(0),
239 fHistCosPointAngleLvsMassL(0),
240 fHistDcaPosToPrimVertexAntiLvsMass(0),
241 fHistDcaNegToPrimVertexAntiLvsMass(0),
242 fHistRadiusV0AntiLvsMass(0),
243 fHistDecayLengthV0AntiLvsMass(0),
244 fHistDcaV0DaughtersAntiLvsMass(0),
245 fHistCosPointAngleAntiLvsMass(0),
248 fHistMassAntiLambda(0),
250 fHistPtVsMassLambda(0),
251 fHistPtVsMassAntiLambda(0),
252 fHistArmenterosPodolanskiK0(0),
253 fHistArmenterosPodolanskiLambda(0),
254 fHistArmenterosPodolanskiAntiLambda(0),
256 fHistAsMcPtLambda(0),
257 fHistAsMcPtAntiLambda(0),
258 fHistAsMcProdRadiusK0(0),
259 fHistAsMcProdRadiusLambda(0),
260 fHistAsMcProdRadiusAntiLambda(0),
261 fHistAsMcProdRadiusXvsYK0s(0),
262 fHistAsMcProdRadiusXvsYLambda(0),
263 fHistAsMcProdRadiusXvsYAntiLambda(0),
265 fHistPidMcMassLambda(0),
266 fHistPidMcMassAntiLambda(0),
267 fHistAsMcPtLambdaFromSigma(0),
268 fHistAsMcPtAntiLambdaFromSigma(0),
269 fHistAsMcSecondaryPtVsRapK0s(0),
270 fHistAsMcSecondaryPtVsRapLambda(0),
271 fHistAsMcSecondaryPtVsRapAntiLambda(0),
272 fHistAsMcSecondaryProdRadiusK0s(0),
273 fHistAsMcSecondaryProdRadiusLambda(0),
274 fHistAsMcSecondaryProdRadiusAntiLambda(0),
275 fHistAsMcSecondaryProdRadiusXvsYK0s(0),
276 fHistAsMcSecondaryProdRadiusXvsYLambda(0),
277 fHistAsMcSecondaryProdRadiusXvsYAntiLambda(0),
278 fHistAsMcSecondaryPtLambdaFromSigma(0),
279 fHistAsMcSecondaryPtAntiLambdaFromSigma(0),
291 fHistLeadInfoMixMC(0)
293 DefineOutput(1, TList::Class());
296 //---------------------------------------------------------------------------------------
297 AliLeadingV0Correlation::~AliLeadingV0Correlation()
299 // Destructor. Clean-up the output list, but not the histograms that are put inside
300 // (the list is owner and will clean-up these histograms). Protect in PROOF case.
301 if (fOutputList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
305 //---------------------------------------------------------------------------------------
306 void AliLeadingV0Correlation::UserCreateOutputObjects()
308 fOutputList = new TList();
309 fOutputList->SetOwner();
311 Int_t lCustomNBins = 200;
312 Double_t lCustomPtUpperLimit = 20;
314 //---------------------------------------------- MC histograms -----------------------------------------------------//
315 fHistMCPrimaryVertexX = new TH1F("h1MCPrimaryVertexX", "MC Primary Vertex Position X;Primary Vertex Position X (cm);Events",100,-0.5,0.5);
316 fOutputList->Add(fHistMCPrimaryVertexX);
318 fHistMCPrimaryVertexY = new TH1F("h1MCPrimaryVertexY", "MC Primary Vertex Position Y;Primary Vertex Position Y (cm);Events",100,-0.5,0.5);
319 fOutputList->Add(fHistMCPrimaryVertexY);
321 fHistMCPrimaryVertexZ = new TH1F("h1MCPrimaryVertexZ", "MC Primary Vertex Position Z;Primary Vertex Position Z (cm);Events",200,-20,20);
322 fOutputList->Add(fHistMCPrimaryVertexZ);
324 fHistMCRapK0s = new TH1F("h1MCRapK0s", "K^{0};y",160,-4,4);
325 fOutputList->Add(fHistMCRapK0s);
327 fHistMCRapLambda = new TH1F("h1MCRapLambda", "#Lambda;y",160,-4,4);
328 fOutputList->Add(fHistMCRapLambda);
330 fHistMCRapAntiLambda = new TH1F("h1MCRapAntiLambda", "#bar{#Lambda};y",160,-4,4);
331 fOutputList->Add(fHistMCRapAntiLambda);
333 fHistMCPtK0s = new TH1F("h1MCPtK0s", "K^{0};p{t} (GeV/c)",240,0,12);
334 fOutputList->Add(fHistMCPtK0s);
336 fHistMCPtLambda = new TH1F("h1MCPtLambda", "#Lambda^{0};p{t} (GeV/c)",240,0,12);
337 fOutputList->Add(fHistMCPtLambda);
339 fHistMCPtAntiLambda = new TH1F("h1MCPtAntiLambda", "#AntiLambda^{0};p{t} (GeV/c)",240,0,12);
340 fOutputList->Add(fHistMCPtAntiLambda);
342 fHistMCPtLambdaFromSigma = new TH1F("h1MCPtLambdaFromSigma", "#Lambda^{0};p{t} (GeV/c)",240,0,12);
343 fOutputList->Add(fHistMCPtLambdaFromSigma);
345 fHistMCPtAntiLambdaFromSigma = new TH1F("h1MCPtAntiLambdaFromSigma", "#Lambda^{0};p{t} (GeV/c)",240,0,12);
346 fOutputList->Add(fHistMCPtAntiLambdaFromSigma);
348 fHistMCPtAllK0s = new TH1F("h1MCPtAllK0s", "Non-primary MC K^{0};p{t} (GeV/c);Counts",240,0,12);
349 fOutputList->Add(fHistMCPtAllK0s);
351 fHistMCPtAllLambda = new TH1F("h1MCPtAllLambda", "Non-primary MC #Lambda^{0};p{t} (GeV/c);Counts",240,0,12);
352 fOutputList->Add(fHistMCPtAllLambda);
354 fHistMCPtAllAntiLambda = new TH1F("h1MCPtAllAntiLambda", "Non-primary MC #bar{#Lambda}^{0};p{t} (GeV/c);Counts",240,0,12);
355 fOutputList->Add(fHistMCPtAllAntiLambda);
357 fHistPrimRawPtVsYK0s = new TH2F( "f3dHistPrimRawPtVsYVsMultK0Short", "Pt{K0S} Vs Y{K0S} Vs Multiplicity; Pt{K0S} (GeV/c); Y{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2);
358 fOutputList->Add(fHistPrimRawPtVsYK0s);
361 fHistPrimRawPtVsYLambda = new TH2F( "f3dHistPrimRawPtVsYVsMultLambda", "Pt{lambda} Vs Y{#Lambda} Vs Multiplicity; Pt{lambda} (GeV/c); Y{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2);
362 fOutputList->Add(fHistPrimRawPtVsYLambda);
364 fHistPrimRawPtVsYAntiLambda = new TH2F( "f3dHistPrimRawPtVsYVsMultAntiLambda", "Pt{antilambda} Vs Y{#Lambda} Vs Multiplicity; Pt{antilambda} (GeV/c); Y{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2);
365 fOutputList->Add(fHistPrimRawPtVsYAntiLambda);
367 //---------------------------------------------End Of MC Histos-----------------------------------------------------//
369 fHistPrimaryVertexX = new TH1F("h1PrimaryVertexX", "Primary Vertex Position X;Primary Vertex Position X (cm);Events",100,-0.5,0.5);
370 fOutputList->Add(fHistPrimaryVertexX);
372 fHistPrimaryVertexY = new TH1F("h1PrimaryVertexY", "Primary Vertex Position Y;Primary Vertex Position Y (cm);Events",100,-0.5,0.5);
373 fOutputList->Add(fHistPrimaryVertexY);
375 fHistPrimaryVertexZ = new TH1F("h1PrimaryVertexZ", "Primary Vertex Position Z;Primary Vertex Position Z (cm);Events",200,-20,20);
376 fOutputList->Add(fHistPrimaryVertexZ);
378 fHistDcaPosToPrimVertexK0vsMassK0 = new TH2F("h2DcaPosToPrimVertexK0vsMassK0", "Positive V0 daughter;dca(cm);K0s inv. mass",500,0,10,200,0.4,0.6);
379 fOutputList->Add(fHistDcaPosToPrimVertexK0vsMassK0);
381 fHistDcaNegToPrimVertexK0vsMassK0 = new TH2F("h2DcaNegToPrimVertexK0vsMassK0", "Negative V0 daughter;dca(cm);K0s inv. mass",500,0,10,200,0.4,0.6);
382 fOutputList->Add(fHistDcaNegToPrimVertexK0vsMassK0);
384 fHistRadiusV0K0vsMassK0 = new TH2F("h2RadiusV0K0vsMassK0", "Radius;Radius(cm);K0s inv. mass",110,0,110,200,0.4,0.6);
385 fOutputList->Add(fHistRadiusV0K0vsMassK0);
387 fHistDecayLengthV0K0vsMassK0 = new TH2F("h2DecayLengthV0K0vsMassK0", "V0s decay Length;decay length(cm);K0s inv. mass", 100, 0, 100,200,0.4,0.6);
388 fOutputList->Add(fHistDecayLengthV0K0vsMassK0);
390 fHistDcaV0DaughtersK0vsMassK0 = new TH2F("h2DcaV0DaughtersK0vsMassK0", "DCA between daughters;dca(cm);K0s inv. mass", 110, 0, 1.1,200,0.4,0.6);
391 fOutputList->Add(fHistDcaV0DaughtersK0vsMassK0);
393 fHistCosPointAngleK0vsMassK0 = new TH2F("h2CosPointAngleK0vsMassK0", "Cosine of V0's pointing angle", 200,0.997,1.007,200,0.4,0.6);
394 fOutputList->Add(fHistCosPointAngleK0vsMassK0);
396 fHistDcaPosToPrimVertexLvsMassL = new TH2F("h2DcaPosToPrimVertexLvsMassL", "Positive V0 daughter;dca(cm);Status",100,0,10,140, 1.06, 1.2);
397 fOutputList->Add(fHistDcaPosToPrimVertexLvsMassL);
399 fHistDcaNegToPrimVertexLvsMassL = new TH2F("h2DcaNegToPrimVertexLvsMassL", "Negative V0 daughter;dca(cm);Status",100,0,10,140, 1.06, 1.2);
400 fOutputList->Add(fHistDcaNegToPrimVertexLvsMassL);
402 fHistRadiusV0LvsMassL = new TH2F("h2RadiusV0LvsMassL", "Radius;Radius(cm);Status",110,0,110,140, 1.06, 1.2);
403 fOutputList->Add(fHistRadiusV0LvsMassL);
405 fHistDecayLengthV0LvsMassL = new TH2F("h2DecayLengthV0LvsMassL", "V0s decay Length;decay length(cm);Status", 120, 0, 120,140, 1.06, 1.2);
406 fOutputList->Add(fHistDecayLengthV0LvsMassL);
408 fHistDcaV0DaughtersLvsMassL = new TH2F("h2DcaV0DaughtersLvsMassL", "DCA between daughters;dca(cm);Status", 110, 0, 1.1,140, 1.06, 1.2);
409 fOutputList->Add(fHistDcaV0DaughtersLvsMassL);
411 fHistCosPointAngleLvsMassL = new TH2F("h2CosPointAngleLvsMassL", "Cosine of V0's pointing angle", 200,0.997,1.007,140, 1.06, 1.2);
412 fOutputList->Add(fHistCosPointAngleLvsMassL);
414 fHistDcaPosToPrimVertexAntiLvsMass = new TH2F("h2DcaPosToPrimVertexAntiLvsMass", "Positive V0 daughter;dca(cm);Status",100,0,10,140, 1.06, 1.2);
415 fOutputList->Add(fHistDcaPosToPrimVertexAntiLvsMass);
417 fHistDcaNegToPrimVertexAntiLvsMass = new TH2F("h2DcaNegToPrimVertexAntiLvsMass", "Negative V0 daughter;dca(cm);Status",100,0,10,140, 1.06, 1.2);
418 fOutputList->Add(fHistDcaNegToPrimVertexAntiLvsMass);
420 fHistRadiusV0AntiLvsMass = new TH2F("h2RadiusV0AntiLvsMass", "Radius;Radius(cm);Status",110,0,110,140, 1.06, 1.2);
421 fOutputList->Add(fHistRadiusV0AntiLvsMass);
423 fHistDecayLengthV0AntiLvsMass = new TH2F("h2DecayLengthV0AntiLvsMass", "V0s decay Length;decay length(cm);Status", 120, 0, 120,140, 1.06, 1.2);
424 fOutputList->Add(fHistDecayLengthV0AntiLvsMass);
426 fHistDcaV0DaughtersAntiLvsMass = new TH2F("h2DcaV0DaughtersAntiLvsMass", "DCA between daughters;dca(cm);Status", 110, 0, 1.1,140, 1.06, 1.2);
427 fOutputList->Add(fHistDcaV0DaughtersAntiLvsMass);
429 fHistCosPointAngleAntiLvsMass = new TH2F("h2CosPointAngleAntiLvsMass", "Cosine of V0's pointing angle", 200,0.997,1.007,140, 1.06, 1.2);
430 fOutputList->Add(fHistCosPointAngleAntiLvsMass);
432 fHistMassK0 = new TH1F("h1MassK0", "K^{0} candidates;M(#pi^{+}#pi^{-}) (GeV/c^{2});Counts", 200, 0.4, 0.6);
433 fOutputList->Add(fHistMassK0);
435 fHistMassLambda = new TH1F("h1MassLambda", "#Lambda^{0} candidates;M(p#pi^{-}) (GeV/c^{2});Counts", 150, 1.05, 1.2);
436 fOutputList->Add(fHistMassLambda);
438 fHistMassAntiLambda = new TH1F("h1MassAntiLambda", "#bar{#Lambda}^{0} candidates;M(#bar{p}#pi^{+}) (GeV/c^{2});Counts", 150, 1.05, 1.2);
439 fOutputList->Add(fHistMassAntiLambda);
441 fHistPtVsMassK0 = new TH2F("h2PtVsMassK0","K^{0} candidates;M(#pi^{+}#pi^{-}) (GeV/c^{2});p{t} (GeV/c)",400, 0.4, 0.6,240,0,12);
442 fOutputList->Add(fHistPtVsMassK0);
444 fHistPtVsMassLambda = new TH2F("h2PtVsMassLambda","#Lambda^{0} candidates;M(p#pi^{-}) (GeV/c^{2});p{t} (GeV/c)",280, 1.06, 1.2,240,0,12);
445 fOutputList->Add(fHistPtVsMassLambda);
447 fHistPtVsMassAntiLambda = new TH2F("h2PtVsMassAntiLambda","#AntiLambda^{0} candidates;M(p#pi^{-}) (GeV/c^{2});p{t} (GeV/c)",280, 1.06, 1.2,240,0,12);
448 fOutputList->Add(fHistPtVsMassAntiLambda);
450 fHistArmenterosPodolanskiK0 = new TH2F("h2ArmenterosPodolanskiK0","Armenteros-Podolanski phase space;#alpha;p{t} arm",100,-1.0,1.0,50,0,0.5);
451 fOutputList->Add(fHistArmenterosPodolanskiK0);
453 fHistArmenterosPodolanskiLambda = new TH2F("h2ArmenterosPodolanskiLambda","Armenteros-Podolanski phase space;#alpha;p{t} arm",100,-1.0,1.0,50,0,0.5);
454 fOutputList->Add(fHistArmenterosPodolanskiLambda);
456 fHistArmenterosPodolanskiAntiLambda = new TH2F("h2ArmenterosPodolanskiAntiLambda","Armenteros-Podolanski phase space;#alpha;p{t} arm",100,-1.0,1.0,50,0,0.5);
457 fOutputList->Add(fHistArmenterosPodolanskiAntiLambda);
459 //--------------------------------------------MC Associated histograms -----------------------------------------------------//
461 fHistAsMcPtK0 = new TH1F("h1AsMcPtK0", "K^{0} associated;p{t} (GeV/c);Counts", 240,0,12);
462 fOutputList->Add(fHistAsMcPtK0);
464 fHistAsMcPtLambda = new TH1F("h1AsMcPtLambda", "#Lambda^{0} associated;p{t} (GeV/c);Counts", 240,0,12);
465 fOutputList->Add(fHistAsMcPtLambda);
467 fHistAsMcPtAntiLambda = new TH1F("h1AsMcPtAntiLambda", "#AntiLambda^{0} associated;p{t} (GeV/c);Counts", 240,0,12);
468 fOutputList->Add(fHistAsMcPtAntiLambda);
470 fHistAsMcProdRadiusK0 = new TH1F("h1AsMcProdRadiusK0", "K^{0} associated;r (cm);Counts", 500, 0, 100);
471 fOutputList->Add(fHistAsMcProdRadiusK0);
473 fHistAsMcProdRadiusLambda = new TH1F("h1AsMcProdRadiusLambda", "#Lambda^{0} associated;r (cm);Counts", 500, 0, 100);
474 fOutputList->Add(fHistAsMcProdRadiusLambda);
476 fHistAsMcProdRadiusAntiLambda = new TH1F("h1AsMcProdRadiusAntiLambda", "#bar{#Lambda}^{0} associated;r (cm);Counts", 500, 0, 100);
477 fOutputList->Add(fHistAsMcProdRadiusAntiLambda);
479 fHistAsMcProdRadiusXvsYK0s = new TH2F("h2AsMcProdRadiusXvsYK0s","Associated Secondary K^{0} Production Radius;x (cm); y (cm)",200,-50,50,200,-50,50);
480 fOutputList->Add(fHistAsMcProdRadiusXvsYK0s);
482 fHistAsMcProdRadiusXvsYLambda = new TH2F("h2AsMcProdRadiusXvsYLambda","Associated Secondary #Lambda^{0} Production Radius;x (cm); y (cm)",200,-50,50,200,-50,50);
483 fOutputList->Add(fHistAsMcProdRadiusXvsYLambda);
485 fHistAsMcProdRadiusXvsYAntiLambda = new TH2F("h2AsMcProdRadiusXvsYAntiLambda","Associated Secondary #bar{#Lambda}^{0} Production Radius;x (cm); y (cm)",200,-50,50,200,-50,50);
486 fOutputList->Add(fHistAsMcProdRadiusXvsYAntiLambda);
488 fHistPidMcMassK0 = new TH1F("h1PidMcMassK0", "K^{0} MC PId checked;M(#pi^{+}#pi^{-}) (GeV/c^{2});Counts", 100, 0.4, 0.6);
489 fOutputList->Add(fHistPidMcMassK0);
491 fHistPidMcMassLambda = new TH1F("h1PidMcMassLambda", "#Lambda^{0} MC PId checked;M(p#pi^{-}) (GeV/c^{2});Counts", 75, 1.05, 1.2);
492 fOutputList->Add(fHistPidMcMassLambda);
494 fHistPidMcMassAntiLambda = new TH1F("h1PidMcMassAntiLambda", "#bar{#Lambda}^{0} MC PId checked;M(#bar{p}#pi^{+}) (GeV/c^{2});Counts", 75, 1.05, 1.2);
495 fOutputList->Add(fHistPidMcMassAntiLambda);
497 fHistAsMcPtLambdaFromSigma = new TH1F("h1AsMcPtLambdaFromSigma","#Lambda}^{0} associated from Sigma;p{t} (GeV/c);Count",240,0,12);
498 fOutputList->Add(fHistAsMcPtLambdaFromSigma);
500 fHistAsMcPtAntiLambdaFromSigma = new TH1F("h1AsMcPtAntiLambdaFromSigma","#bar{#Lambda}^{0} associated from Sigma;p{t} (GeV/c);Count",240,0,12);
501 fOutputList->Add(fHistAsMcPtAntiLambdaFromSigma);
503 fHistAsMcSecondaryPtVsRapK0s = new TH2F("h2AsMcSecondaryPtVsRapK0s", "K^{0} associated secondary;p{t} (GeV/c);rapidity",240,0,12,30,-1.5,1.5);
504 fOutputList->Add(fHistAsMcSecondaryPtVsRapK0s);
506 fHistAsMcSecondaryPtVsRapLambda = new TH2F("h2AsMcSecondaryPtVsRapLambda", "#Lambda^{0} associated secondary;p{t} (GeV/c);rapidity",240,0,12,30,-1.5,1.5);
507 fOutputList->Add(fHistAsMcSecondaryPtVsRapLambda);
509 fHistAsMcSecondaryPtVsRapAntiLambda = new TH2F("h2AsMcSecondaryPtVsRapAntiLambda", "#bar{#Lambda}^{0} associated secondary;p{t} (GeV/c);rapidity",240,0,12,30,-1.5,1.5);
510 fOutputList->Add(fHistAsMcSecondaryPtVsRapAntiLambda);
512 fHistAsMcSecondaryProdRadiusK0s = new TH1F("h1AsMcSecondaryProdRadiusK0s", "K^{0} Production Radius;r (cm);Count", 170, -2, 15);
513 fOutputList->Add(fHistAsMcSecondaryProdRadiusK0s);
515 fHistAsMcSecondaryProdRadiusLambda = new TH1F("h1AsMcSecondaryProdRadiusLambda", "#Lambda^{0} Production Radius;r (cm);Count", 170, -2, 15);
516 fOutputList->Add(fHistAsMcSecondaryProdRadiusLambda);
518 fHistAsMcSecondaryProdRadiusAntiLambda = new TH1F("h1AsMcSecondaryProdRadiusAntiLambda", "#bar{#Lambda}^{0} Production Radius;r (cm);Count", 170, -2, 15);
519 fOutputList->Add(fHistAsMcSecondaryProdRadiusAntiLambda);
521 fHistAsMcSecondaryProdRadiusXvsYK0s = new TH2F("h2AsMcSecondaryProdRadiusXvsYK0s","Associated Secondary K^{0} Production Radius;x (cm); y (cm)",200,-20,20,200,-20,20);
522 fOutputList->Add(fHistAsMcSecondaryProdRadiusXvsYK0s);
524 fHistAsMcSecondaryProdRadiusXvsYLambda = new TH2F("h2AsMcSecondaryProdRadiusXvsYLambda","Associated Secondary #Lambda^{0} Production Radius;x (cm); y (cm)",200,-20,20,200,-20,20);
525 fOutputList->Add(fHistAsMcSecondaryProdRadiusXvsYLambda);
527 fHistAsMcSecondaryProdRadiusXvsYAntiLambda = new TH2F("h2AsMcSecondaryProdRadiusXvsYAntiLambda","Associated Secondary #bar{#Lambda}^{0} Production Radius;x (cm); y (cm)",200,-20,20,200,-20,20);
528 fOutputList->Add(fHistAsMcSecondaryProdRadiusXvsYAntiLambda);
530 fHistAsMcSecondaryPtLambdaFromSigma = new TH1F("h1AsMcSecondaryPtLambdaFromSigma","#Lambda}^{0} associated from Sigma;p{t} (GeV/c);Count",240,0,12);
531 fOutputList->Add(fHistAsMcSecondaryPtLambdaFromSigma);
533 fHistAsMcSecondaryPtAntiLambdaFromSigma = new TH1F("h1AsMcSecondaryPtAntiLambdaFromSigma","#bar{#Lambda}^{0} associated from Sigma;p{t} (GeV/c);Count",240,0,12);
534 fOutputList->Add(fHistAsMcSecondaryPtAntiLambdaFromSigma);
536 //----------------------------------------------Correlation histograms -----------------------------------------------------//
538 fHistSibK0 = new TH3F("hfHistSibK0","",CorrBinsX,-TMath::Pi()/2,3*TMath::Pi()/2,CorrBinsY,-2*fTrackEtaCut,2*fTrackEtaCut,30,0,6);
539 fHistSibK0->SetStats(0);
541 fOutputList->Add(fHistSibK0);
543 fHistMixK0 = new TH3F("hfHistMixK0","",CorrBinsX,-TMath::Pi()/2,3*TMath::Pi()/2,CorrBinsY,-2*fTrackEtaCut,2*fTrackEtaCut,30,0,6);
544 fHistMixK0->SetStats(0);
546 fOutputList->Add(fHistMixK0);
548 fHistSibLambda = new TH3F("hfHistSibLambda","",CorrBinsX,-TMath::Pi()/2,3*TMath::Pi()/2,CorrBinsY,-2*fTrackEtaCut,2*fTrackEtaCut,30,0,6);
549 fHistSibLambda->SetStats(0);
550 fHistSibLambda->Sumw2();
551 fOutputList->Add(fHistSibLambda);
553 fHistMixLambda = new TH3F("hfHistMixLambda","",CorrBinsX,-TMath::Pi()/2,3*TMath::Pi()/2,CorrBinsY,-2*fTrackEtaCut,2*fTrackEtaCut,30,0,6);
554 fHistMixLambda->SetXTitle("#Delta #Phi");
555 fHistMixLambda->SetStats(0);
556 fHistMixLambda->Sumw2();
557 fOutputList->Add(fHistMixLambda);
559 fHistSibK0MC = new TH3F("hfHistSibK0MC","",CorrBinsX,-TMath::Pi()/2,3*TMath::Pi()/2,CorrBinsY,-2*fTrackEtaCut,2*fTrackEtaCut,30,0,6);
560 fHistSibK0MC->SetStats(0);
561 fHistSibK0MC->Sumw2();
562 fOutputList->Add(fHistSibK0MC);
564 fHistMixK0MC = new TH3F("hfHistMixK0MC","",CorrBinsX,-TMath::Pi()/2,3*TMath::Pi()/2,CorrBinsY,-2*fTrackEtaCut,2*fTrackEtaCut,30,0,6);
565 fHistMixK0MC->SetStats(0);
566 fHistMixK0MC->Sumw2();
567 fOutputList->Add(fHistMixK0MC);
569 fHistSibLambdaMC = new TH3F("hfHistSibLambdaMC","",CorrBinsX,-TMath::Pi()/2,3*TMath::Pi()/2,CorrBinsY,-2*fTrackEtaCut,2*fTrackEtaCut,30,0,6);
570 fHistSibLambdaMC->SetStats(0);
571 fHistSibLambdaMC->Sumw2();
572 fOutputList->Add(fHistSibLambdaMC);
574 fHistMixLambdaMC = new TH3F("hfHistMixLambdaMC","",CorrBinsX,-TMath::Pi()/2,3*TMath::Pi()/2,CorrBinsY,-2*fTrackEtaCut,2*fTrackEtaCut,30,0,6);
575 fHistMixLambdaMC->SetStats(0);
576 fHistMixLambdaMC->Sumw2();
577 fOutputList->Add(fHistMixLambdaMC);
579 fHistLeadInfo = new TH3F("hfHistLeadInfo","",60,0,12,CorrBinsY/2,-fTrackEtaCut,fTrackEtaCut,CorrBinsX/2,0,3*TMath::Pi());
580 fOutputList->Add(fHistLeadInfo);
582 fHistLeadInfoMC = new TH3F("hfHistLeadInfoMC","",60,0,12,CorrBinsY/2,-fTrackEtaCut,fTrackEtaCut,CorrBinsX/2,0,3*TMath::Pi());
583 fOutputList->Add(fHistLeadInfoMC);
585 fHistLeadInfoMix = new TH3F("hfHistLeadInfoMix","",60,0,12,CorrBinsY/2,-fTrackEtaCut,fTrackEtaCut,CorrBinsX/2,0,3*TMath::Pi());
586 fOutputList->Add(fHistLeadInfoMix);
588 fHistLeadInfoMixMC = new TH3F("hfHistLeadInfoMixMC","",60,0,12,CorrBinsY/2,-fTrackEtaCut,fTrackEtaCut,CorrBinsX/2,0,3*TMath::Pi());
589 fOutputList->Add(fHistLeadInfoMixMC);
591 //----------------------------------------------Event Pool-----------------------------------------------------//
593 fPoolMgr = new AliEventPoolManager(fPoolMaxNEvents, fPoolMinNTracks, fNCentBins, fCentBins, fNzVtxBins, fZvtxBins);
594 if(!fPoolMgr) return;
597 fPoolMgrMC = new AliEventPoolManager(fPoolMaxNEvents, fPoolMinNTracks, fNCentBins, fCentBins, fNzVtxBins, fZvtxBins);
598 if(!fPoolMgr) return;
601 PostData(1, fOutputList);
604 //---------------------------------------------------------------------------------------
605 void AliLeadingV0Correlation::UserExec(Option_t *)
608 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
609 AliInputEventHandler *inEvMain = (AliInputEventHandler*)(mgr->GetInputEventHandler());
610 if (!inEvMain) return;
612 // Pointers to PID Response objects.
613 fPIDResponse = inEvMain->GetPIDResponse();
614 if(!fPIDResponse) return;
616 fAODEvent = dynamic_cast<AliAODEvent*>(inEvMain->GetEvent());
617 if(!fAODEvent) return;
620 UInt_t maskIsSelected = inEvMain->IsEventSelected();
621 Bool_t isSelected = 0;
623 if( fTriggerMask == "kMB" )
624 isSelected = (maskIsSelected & AliVEvent::kMB) == AliVEvent::kMB;
625 if( fTriggerMask == "kINT7" )
626 isSelected = (maskIsSelected & AliVEvent::kINT7) == AliVEvent::kINT7;
627 if( fTriggerMask == "kINT8" )
628 isSelected = (maskIsSelected & AliVEvent::kINT8) == AliVEvent::kINT8;
629 if( fTriggerMask == "kAnyINT" )
630 isSelected = (maskIsSelected & AliVEvent::kAnyINT) == AliVEvent::kAnyINT;
631 if ( ! isSelected )return;
633 //-----------------------------MC Accsess------------------------------------------------
634 TClonesArray *stack = 0x0;
635 Double_t mcXv=0., mcYv=0., mcZv=0.;
636 Int_t ntrk =0, ntrk0=0;
638 TObjArray *selectedTracksLeadingMC =0x0;
640 TObjArray * selectedK0MC =new TObjArray;
641 selectedK0MC->SetOwner(kTRUE);
643 TObjArray * selectedLambdaMC =new TObjArray;
644 selectedLambdaMC->SetOwner(kTRUE);
648 TList *lst = fAODEvent->GetList();
649 stack = (TClonesArray*)lst->FindObject(AliAODMCParticle::StdBranchName());
650 if (!stack) {Printf("ERROR: stack not available");return;}
652 AliAODMCHeader *mcHdr=(AliAODMCHeader*)lst->FindObject(AliAODMCHeader::StdBranchName());
653 mcXv=mcHdr->GetVtxX(); mcYv=mcHdr->GetVtxY(); mcZv=mcHdr->GetVtxZ();
654 ntrk=stack->GetEntriesFast(), ntrk0=ntrk;
655 if(TMath::Abs(mcZv)>fpvzcut)return;
657 selectedTracksLeadingMC = FindLeadingObjectsMC(stack);
658 if(!selectedTracksLeadingMC) return;
659 selectedTracksLeadingMC->SetOwner(kTRUE);
663 Double_t lLimitPPID = 1.0;
664 Float_t cutNSigmaLowP = 3.0;
665 Float_t cutNSigmaHighP = 3.0;
666 Int_t lPdgcodeCurrentPart = 0;
667 Double_t lRapCurrentPart = 0;
668 Double_t lPtCurrentPart = 0;
669 Double_t lPhiCurrentPart = 0;
670 Double_t lEtaCurrentPart = 0;
671 Int_t lComeFromSigma = 0;
675 Int_t AntiLambdaPID = 0;
677 // current mc particle 's mother
678 Int_t iCurrentMother = 0, lPdgCurrentMother = 0;
680 // Start loop over MC particles
683 fHistMCPrimaryVertexX->Fill(mcXv);
684 fHistMCPrimaryVertexY->Fill(mcYv);
685 fHistMCPrimaryVertexZ->Fill(mcZv);
687 for (Int_t iMc = 0; iMc < (ntrk); iMc++) {
688 AliAODMCParticle *p0=(AliAODMCParticle*)stack->UncheckedAt(iMc);
691 lPdgcodeCurrentPart = p0->GetPdgCode();
693 // Keep only K0s, Lambda and AntiLambda, Xi and Phi:
694 if ( (lPdgcodeCurrentPart != 310 ) && (lPdgcodeCurrentPart != 3122 ) && (lPdgcodeCurrentPart != -3122 ) && (lPdgcodeCurrentPart != 3312 ) && (lPdgcodeCurrentPart != -3312) && (lPdgcodeCurrentPart != -333) ) continue;
696 lRapCurrentPart = p0->Y();
697 lPtCurrentPart = p0->Pt();
698 lPhiCurrentPart = p0->Phi();
699 lEtaCurrentPart = p0->Eta();
700 iCurrentMother = p0->GetMother();
702 AliAODMCParticle *Mother = (AliAODMCParticle*)stack->UncheckedAt(iCurrentMother);
703 if (iCurrentMother == -1){lPdgCurrentMother=0; } else {lPdgCurrentMother = Mother->GetPdgCode();}
705 if (( ( TMath::Abs(lPdgCurrentMother) == 3212) ||
706 ( TMath::Abs(lPdgCurrentMother) == 3224) ||
707 ( TMath::Abs(lPdgCurrentMother) == 3214) ||
708 ( TMath::Abs(lPdgCurrentMother) == 3114) )
709 && ( Mother->GetMother() == -1)
710 ) lComeFromSigma = 1;
711 else lComeFromSigma = 0;
713 Bool_t isPrimary=p0->IsPhysicalPrimary();
714 if (!isPrimary)continue; //keep only primary particles
717 if (TMath::Abs(lRapCurrentPart) > fRapidityCut) continue;
719 if (lPdgcodeCurrentPart==310) {
720 fHistMCRapK0s->Fill(lRapCurrentPart);
721 fHistMCPtK0s->Fill(lPtCurrentPart);
722 fHistPrimRawPtVsYK0s->Fill(lPtCurrentPart,lRapCurrentPart);
723 fHistMCPtAllK0s->Fill(lPtCurrentPart);
724 selectedK0MC->Add(new AliLeadingBasicParticle(lEtaCurrentPart,lPhiCurrentPart,lPtCurrentPart));
727 if (lPdgcodeCurrentPart==3122) {
728 fHistMCRapLambda->Fill(lRapCurrentPart);
729 fHistMCPtLambda->Fill(lPtCurrentPart);
730 fHistPrimRawPtVsYLambda->Fill(lPtCurrentPart,lRapCurrentPart);
731 fHistMCPtAllLambda->Fill(lPtCurrentPart);
732 if (lComeFromSigma) fHistMCPtLambdaFromSigma->Fill(lPtCurrentPart);
733 selectedLambdaMC->Add(new AliLeadingBasicParticle(lEtaCurrentPart,lPhiCurrentPart,lPtCurrentPart));
737 if (lPdgcodeCurrentPart==-3122) {
738 fHistMCRapAntiLambda->Fill(lRapCurrentPart);
739 fHistMCPtAntiLambda->Fill(lPtCurrentPart);
740 fHistPrimRawPtVsYAntiLambda->Fill(lPtCurrentPart,lRapCurrentPart);
741 fHistMCPtAllAntiLambda->Fill(lPtCurrentPart);
742 if (lComeFromSigma) fHistMCPtAntiLambdaFromSigma->Fill(lPtCurrentPart);
746 } // End Loop over MC condition
748 //-----------------------------------------------------------------------------------------
751 Double_t lPrimaryVtxPosition[3];
752 AliAODVertex *myPrimVertex = fAODEvent->GetPrimaryVertex();
753 if (!myPrimVertex) return;
754 myPrimVertex->GetXYZ(lPrimaryVtxPosition);
756 Double_t lPVx = lPrimaryVtxPosition[0];
757 Double_t lPVy = lPrimaryVtxPosition[1];
758 Double_t lPVz = lPrimaryVtxPosition[2];
759 if ((TMath::Abs(lPVz)) >= fpvzcut) return ;
761 if (TMath::Abs(lPVx)<10e-5 && TMath::Abs(lPVy)<10e-5 && TMath::Abs(lPVz)<10e-5) return;
763 fHistPrimaryVertexX->Fill(lPVx);
764 fHistPrimaryVertexY->Fill(lPVy);
765 fHistPrimaryVertexZ->Fill(lPVz);
767 // Centrality definition
768 AliCentrality *centralityObj = 0;
769 Int_t multiplicity = -1;
770 Double_t MultipOrCent = -1;
772 // initialize the pool for event mixing
773 if(fcollidingSys=="PP"){
774 multiplicity = fAODEvent->GetNTracks();
775 MultipOrCent = multiplicity; // convert from Int_t to Double_t
777 if(fcollidingSys=="PbPb"){
778 centralityObj = fAODEvent->GetHeader()->GetCentralityP();
779 MultipOrCent = centralityObj->GetCentralityPercentileUnchecked("V0M");
780 if ((MultipOrCent < 0.)||(MultipOrCent > 90.)) return;
783 Double_t * CentBins = fCentBins;
784 Double_t poolmin = CentBins[0];
785 Double_t poolmax = CentBins[fNCentBins];
787 TObjArray *selectedTracksLeading = FindLeadingObjects(fAODEvent);
788 if(!selectedTracksLeading) return;
789 selectedTracksLeading->SetOwner(kTRUE);
791 // -------------------------------------V0 loop for reconstructed event------------------------
792 Double_t lPLambda = 0;
793 Double_t lPAntiLambda = 0;
797 Double_t lV0Position[3];
799 Double_t lDcaPosToPrimVertex = 0;
800 Double_t lDcaNegToPrimVertex = 0;
801 Double_t lDcaV0Daughters = 0;
802 Double_t lV0cosPointAngle = 0;
803 Double_t lV0DecayLength = 0;
804 Double_t lV0Radius = 0;
805 Double_t lDcaV0ToPrimVertex = 0;
806 Double_t lcTauLambda = 0;
807 Double_t lcTauAntiLambda = 0;
808 Double_t lcTauK0s = 0;
810 Double_t lInvMassK0 = 0, lInvMassLambda = 0, lInvMassAntiLambda = 0;
811 Double_t lPtK0s = 0, lPtLambda = 0, lPtAntiLambda = 0;
812 Double_t lPhiK0s = 0, lPhiLambda = 0, lPhiAntiLambda = 0;
813 Double_t lEtaK0s = 0, lEtaLambda = 0, lEtaAntiLambda = 0;
814 Double_t lRapK0s = 0, lRapLambda = 0, lRapAntiLambda = 0;
815 Double_t lPzK0s = 0, lPzLambda = 0, lPzAntiLambda = 0;
816 Double_t lAlphaV0 = 0, lPtArmV0 = 0;
820 UInt_t lLabelTrackPos = 0, lLabelTrackNeg = 0;
821 Int_t lCheckPIdK0Short = 0, lCheckMcK0Short = 0;
822 Int_t lCheckPIdLambda = 0, lCheckMcLambda = 0;
823 Int_t lCheckPIdAntiLambda = 0, lCheckMcAntiLambda = 0;
824 Int_t lCheckSecondaryK0s = 0, lCheckSecondaryLambda = 0, lCheckSecondaryAntiLambda = 0;
825 Double_t mcPosMotherX = 0, mcPosMotherY = 0, mcPosMotherZ = 0;
826 Double_t mcPosMotherR = 0;
827 Double_t mcMotherPt = 0;
829 Int_t lIndexPosMother = 0;
830 Int_t lIndexNegMother = 0;
831 Int_t lIndexMotherOfMother = 0;
832 Int_t lPDGCodePosDaughter = 0;
833 Int_t lPDGCodeNegDaughter = 0;
834 Int_t lPdgcodeMother = 0;
835 Int_t lPdgcodeMotherOfMother = 0;
837 // Daughters' momentum:
838 Double_t lMomPos[3] = {999,999,999};
839 Double_t lMomNeg[3] = {999,999,999};
840 Double_t lPtPos = 999, lPtNeg = 999;
842 // Inner Wall parameters:
843 Double_t lMomInnerWallPos =999, lMomInnerWallNeg = 999;
844 Double_t ldEdxPos =0.0, ldEdxNeg = 0.0;
847 Float_t nSigmaPosPion = 0;
848 Float_t nSigmaNegPion = 0;
849 Float_t nSigmaPosProton = 0;
850 Float_t nSigmaNegProton = 0;
853 Int_t lCheckPIDK0sPosDaughter = 0, lCheckPIDK0sNegDaughter = 0;
854 Int_t lCheckPIDLambdaPosDaughter = 0, lCheckPIDLambdaNegDaughter = 0;
855 Int_t lCheckPIDAntiLambdaPosDaughter = 0, lCheckPIDAntiLambdaNegDaughter = 0;
857 //---------------------------------------------------------------------------------------------
858 TObjArray * selectedK0 = new TObjArray;
859 selectedK0->SetOwner(kTRUE);
861 TObjArray * selectedLambda = new TObjArray;
862 selectedLambda->SetOwner(kTRUE);
864 Int_t nV0s = fAODEvent->GetNumberOfV0s();
866 for (Int_t i = 0; i < nV0s; i++)
867 { // start of V0 slection loop
868 AliAODv0* aodV0 = dynamic_cast<AliAODv0 *>(fAODEvent->GetV0(i));
869 if (!aodV0) {AliError(Form("ERROR: Could not retrieve aodaodV0 %d", i));continue;}
871 lIndexPosMother = 0; lIndexNegMother = 0; lIndexMotherOfMother = 0;
872 lCheckPIdK0Short = 0; lCheckMcK0Short = 0; lCheckSecondaryK0s = 0;
873 lCheckPIdLambda = 0; lCheckMcLambda = 0; lCheckSecondaryLambda = 0;
874 lCheckPIdAntiLambda = 0; lCheckMcAntiLambda = 0; lCheckSecondaryAntiLambda = 0;
879 AliAODTrack *myTrackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
880 AliAODTrack *myTrackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
882 if (!myTrackPos || !myTrackNeg) {Printf("ERROR: Could not retreive one of the daughter track");continue;}
883 if (!IsAcseptedV0(fAODEvent,aodV0,myTrackPos,myTrackNeg)) continue;
885 // VO's main characteristics to check the reconstruction cuts
886 lDcaV0Daughters = aodV0->DcaV0Daughters();
887 lDcaV0ToPrimVertex = aodV0->DcaV0ToPrimVertex();
888 lV0cosPointAngle = aodV0->CosPointingAngle(lPrimaryVtxPosition);
890 aodV0->GetXYZ(lV0Position);
892 lV0Radius = TMath::Sqrt(lV0Position[0]*lV0Position[0]+lV0Position[1]*lV0Position[1]);
893 lV0DecayLength = TMath::Sqrt(TMath::Power(lV0Position[0] - lPrimaryVtxPosition[0],2) +
894 TMath::Power(lV0Position[1] - lPrimaryVtxPosition[1],2) +
895 TMath::Power(lV0Position[2] - lPrimaryVtxPosition[2],2 ));
897 lLabelTrackPos = (UInt_t)TMath::Abs(myTrackPos->GetLabel());
898 lLabelTrackNeg = (UInt_t)TMath::Abs(myTrackNeg->GetLabel());
900 // Daughters Pt and P:
901 lPtPos = TMath::Sqrt(lMomPos[0]*lMomPos[0] + lMomPos[1]*lMomPos[1]);
902 lPtNeg = TMath::Sqrt(lMomNeg[0]*lMomNeg[0] + lMomNeg[1]*lMomNeg[1]);
904 // Inner Wall parameter:
905 const AliAODPid *pidPos=myTrackPos->GetDetPid();
906 const AliAODPid *pidNeg=myTrackNeg->GetDetPid();
908 // innerWall momentum
909 lMomInnerWallPos = pidPos->GetTPCmomentum();
910 lMomInnerWallNeg = pidNeg->GetTPCmomentum();
912 ldEdxPos = pidPos->GetTPCsignal();
913 ldEdxNeg = pidNeg->GetTPCsignal();
915 // DCA between daughter and Primary Vertex:
916 if (myTrackPos) lDcaPosToPrimVertex = aodV0->DcaPosToPrimVertex();
917 if (myTrackNeg) lDcaNegToPrimVertex = aodV0->DcaNegToPrimVertex();
919 // Quality tracks cuts:
920 if ( !(IsAcseptedDaughterTrack(myTrackPos)) || !(IsAcseptedDaughterTrack(myTrackNeg)) ) { continue;}
922 // Armenteros variables:
923 lAlphaV0 = aodV0->AlphaV0();
924 lPtArmV0 = aodV0->PtArmV0();
927 lInvMassK0 = aodV0->MassK0Short();
928 lPtK0s = aodV0->Pt();
929 lPhiK0s= aodV0->Phi();
930 lEtaK0s= aodV0->Eta();
931 lPzK0s = aodV0->Pz();
933 lInvMassLambda = aodV0->MassLambda();
934 lPtLambda = aodV0->Pt();
935 lPhiLambda= aodV0->Phi();
936 lEtaLambda= aodV0->Eta();
937 lPzLambda = aodV0->Pz();
939 lInvMassAntiLambda = aodV0->MassAntiLambda();
940 lPtAntiLambda = aodV0->Pt();
941 lPhiAntiLambda = aodV0->Phi();
942 lEtaAntiLambda = aodV0->Eta();
943 lPzAntiLambda = aodV0->Pz();
946 lRapK0s = aodV0->RapK0Short();
947 lRapLambda = aodV0->RapLambda();
948 lRapAntiLambda = aodV0->Y(-3122);
950 if (lPtK0s==0) {continue;}
951 if (lPtLambda==0) {continue;}
952 if (lPtAntiLambda==0) {continue;}
954 if (fUsePID=="withPID") {
955 nSigmaPosPion = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kPion));
956 nSigmaNegPion = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kPion));
957 nSigmaPosProton = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kProton));
958 nSigmaNegProton = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kProton));
960 else {nSigmaPosPion = 0; nSigmaNegPion =0; nSigmaPosProton = 0; nSigmaNegProton= 0;}
962 // Monte-Carlo particle associated to reconstructed particles:
965 AliAODMCParticle *pp=(AliAODMCParticle*)stack->UncheckedAt(lLabelTrackPos);
967 AliAODMCParticle *np=(AliAODMCParticle*)stack->UncheckedAt(lLabelTrackNeg);
968 if (!np) { continue;}
970 lPDGCodePosDaughter = pp->GetPdgCode();
971 lPDGCodeNegDaughter = np->GetPdgCode();
972 lIndexPosMother = pp->GetMother();
973 lIndexNegMother = np->GetMother();
975 if (lIndexPosMother == -1) {
978 lIndexMotherOfMother = 0;
987 AliAODMCParticle *lMCAODMother=(AliAODMCParticle*)stack->UncheckedAt(lIndexPosMother);
988 if (!lMCAODMother) { continue;}
989 lPdgcodeMother = lMCAODMother->GetPdgCode();
990 lIndexMotherOfMother = lMCAODMother->GetMother();
991 if (lIndexMotherOfMother ==-1) lPdgcodeMotherOfMother = 0;
993 AliAODMCParticle *lMCAODMotherOfMother=(AliAODMCParticle*)stack->UncheckedAt(lIndexMotherOfMother);
994 if (!lMCAODMotherOfMother) {continue;}
995 lPdgcodeMotherOfMother = lMCAODMotherOfMother->GetPdgCode();
997 mcPosMotherX = lMCAODMother->Xv();
998 mcPosMotherY = lMCAODMother->Yv();
999 mcPosMotherZ = lMCAODMother->Zv();
1000 mcPosMotherR = TMath::Sqrt(mcPosMotherX*mcPosMotherX+mcPosMotherY*mcPosMotherY);
1002 mcMotherPt = lMCAODMother->Pt();
1009 if(((lPDGCodePosDaughter==+211) && (lPDGCodeNegDaughter==-211))){lCheckPIdK0Short = 1;
1010 if ( (lIndexPosMother==lIndexNegMother) &&(lPdgcodeMother==310) ){
1011 if (((AliAODMCParticle*)stack->UncheckedAt(lIndexPosMother))->IsPrimary()) lCheckMcK0Short = 1;
1012 else lCheckSecondaryK0s = 1;
1015 else if(((lPDGCodePosDaughter==+2212) && (lPDGCodeNegDaughter==-211))){lCheckPIdLambda = 1;
1016 if ((lIndexPosMother==lIndexNegMother) &&(lPdgcodeMother==3122) ){
1017 if ( ( TMath::Abs(lPdgcodeMotherOfMother) == 3212) ||
1018 ( TMath::Abs(lPdgcodeMotherOfMother) == 3224) ||
1019 ( TMath::Abs(lPdgcodeMotherOfMother) == 3214) ||
1020 ( TMath::Abs(lPdgcodeMotherOfMother) == 3114))lComeFromSigma = 1;
1021 else lComeFromSigma = 0;
1022 if (((AliAODMCParticle*)stack->UncheckedAt(lIndexPosMother))->IsPrimary()||
1023 (!(((AliAODMCParticle*)stack->UncheckedAt(lIndexPosMother))->IsPrimary() )&&
1024 (lComeFromSigma)))lCheckMcLambda = 1;
1025 else lCheckSecondaryLambda = 1;
1028 else if(((lPDGCodePosDaughter==211) && (lPDGCodeNegDaughter==-2212))){lCheckPIdAntiLambda = 1;
1029 if ( (lIndexPosMother==lIndexNegMother) &&
1030 (lPdgcodeMother==-3122) ) {
1031 if ( ( TMath::Abs(lPdgcodeMotherOfMother) == 3212) ||
1032 ( TMath::Abs(lPdgcodeMotherOfMother) == 3224) ||
1033 ( TMath::Abs(lPdgcodeMotherOfMother) == 3214) ||
1034 ( TMath::Abs(lPdgcodeMotherOfMother) == 3114)
1035 )lComeFromSigma = 1;
1036 else lComeFromSigma = 0;
1037 if (((AliAODMCParticle*)stack->UncheckedAt(lIndexPosMother))->IsPrimary() ||
1038 ((!((AliAODMCParticle*)stack->UncheckedAt(lIndexPosMother))->IsPrimary())&&
1039 (lComeFromSigma)))lCheckMcAntiLambda = 1;
1040 else lCheckSecondaryAntiLambda = 1;
1043 } // end "look for associated particles
1046 lCheckPIDK0sPosDaughter = 0, lCheckPIDK0sNegDaughter = 0;
1047 lCheckPIDLambdaPosDaughter = 0, lCheckPIDLambdaNegDaughter = 0;
1048 lCheckPIDAntiLambdaPosDaughter = 0, lCheckPIDAntiLambdaNegDaughter = 0;
1050 if (lMomInnerWallPos < lLimitPPID) {
1051 if (nSigmaPosPion < cutNSigmaLowP){
1052 lCheckPIDK0sPosDaughter = 1;
1053 lCheckPIDAntiLambdaPosDaughter = 1;
1055 if (nSigmaPosProton < cutNSigmaLowP) lCheckPIDLambdaPosDaughter = 1;
1058 else if (lMomInnerWallPos > lLimitPPID) {
1059 if (nSigmaPosPion < cutNSigmaHighP) {
1060 lCheckPIDK0sPosDaughter = 1;
1061 lCheckPIDAntiLambdaPosDaughter = 1;
1063 if (nSigmaPosProton < cutNSigmaHighP) lCheckPIDLambdaPosDaughter = 1;
1066 if (lMomInnerWallNeg < lLimitPPID) {
1067 if (nSigmaNegPion < cutNSigmaLowP){
1068 lCheckPIDK0sNegDaughter = 1;
1069 lCheckPIDLambdaNegDaughter = 1;
1071 if (nSigmaNegProton < cutNSigmaLowP) lCheckPIDAntiLambdaNegDaughter = 1;
1074 else if (lMomInnerWallNeg > lLimitPPID) {
1075 if (nSigmaNegPion < cutNSigmaHighP){
1076 lCheckPIDK0sNegDaughter = 1;
1077 lCheckPIDLambdaNegDaughter = 1;
1079 if (nSigmaNegProton < cutNSigmaHighP) lCheckPIDAntiLambdaNegDaughter = 1;
1082 //************************************filling histograms********************************//
1084 if((fUsePID=="withPID") && (lCheckPIDAntiLambdaNegDaughter==0) && lCheckPIDLambdaPosDaughter==1) LambdaPID = 1;
1086 if((fUsePID=="withPID") && (lCheckPIDLambdaPosDaughter==0) && lCheckPIDAntiLambdaNegDaughter==1) AntiLambdaPID = 1;
1087 else AntiLambdaPID =0;
1089 lPLambda = TMath::Sqrt(lPzLambda*lPzLambda + lPtLambda*lPtLambda);
1090 lPAntiLambda = TMath::Sqrt(lPzAntiLambda*lPzAntiLambda + lPtAntiLambda*lPtAntiLambda);
1091 lPK0s = TMath::Sqrt(lPzK0s*lPzK0s + lPtK0s*lPtK0s);
1093 if(lPLambda > 0) lcTauLambda = (lV0DecayLength*lInvMassLambda)/lPLambda;
1094 if(lPAntiLambda > 0) lcTauAntiLambda = (lV0DecayLength*lInvMassAntiLambda)/lPAntiLambda;
1095 if(lPK0s > 0) lcTauK0s = (lV0DecayLength*lInvMassK0)/lPK0s;
1096 //--------------------------------------------K0s---------------------------------//
1098 if (lcTauK0s< fCTauK0){
1099 if (TMath::Abs(lRapK0s) < fRapidityCut ){
1100 if(lPtArmV0*fSpecialArmenterosCutK0s>(TMath::Abs(lAlphaV0))){
1101 fHistMassK0->Fill(lInvMassK0);
1102 fHistPtVsMassK0->Fill(lInvMassK0,lPtK0s);
1103 fHistDcaPosToPrimVertexK0vsMassK0->Fill(lDcaPosToPrimVertex,lInvMassK0);
1104 fHistDcaNegToPrimVertexK0vsMassK0->Fill(lDcaNegToPrimVertex,lInvMassK0);
1105 fHistRadiusV0K0vsMassK0->Fill(lV0Radius,lInvMassK0);
1106 fHistDecayLengthV0K0vsMassK0->Fill(lV0DecayLength,lInvMassK0);
1107 fHistDcaV0DaughtersK0vsMassK0->Fill(lDcaV0Daughters,lInvMassK0);
1108 fHistCosPointAngleK0vsMassK0->Fill(lV0cosPointAngle,lInvMassK0);
1109 fHistArmenterosPodolanskiK0->Fill(lAlphaV0,lPtArmV0);
1110 if(IsK0InvMass(lInvMassK0)){selectedK0->Add(new AliLeadingBasicParticle(lEtaK0s,lPhiK0s,lPtK0s));}
1111 }//Special Armesto Cut for K0
1112 } // if rap. condition
1113 } // end cTau condition
1114 //-----------------------------------------Lambda---------------------------------//
1115 if (lcTauLambda < fCTauLambda){
1116 if ((LambdaPID==1 && lMomInnerWallPos <=1 ) || (lMomInnerWallPos >1 ) || !(fUsePID=="withPID")){
1117 if (TMath::Abs(lRapLambda) <fRapidityCut) {
1118 fHistMassLambda->Fill(lInvMassLambda);
1119 fHistPtVsMassLambda->Fill(lInvMassLambda,lPtLambda);
1120 fHistDcaPosToPrimVertexLvsMassL->Fill(lDcaPosToPrimVertex,lInvMassLambda);
1121 fHistDcaNegToPrimVertexLvsMassL->Fill(lDcaNegToPrimVertex,lInvMassLambda);
1122 fHistRadiusV0LvsMassL->Fill(lV0Radius,lInvMassLambda);
1123 fHistDecayLengthV0LvsMassL->Fill(lV0DecayLength,lInvMassLambda);
1124 fHistDcaV0DaughtersLvsMassL->Fill(lDcaV0Daughters,lInvMassLambda);
1125 fHistCosPointAngleLvsMassL->Fill(lV0cosPointAngle,lInvMassLambda);
1126 fHistArmenterosPodolanskiLambda->Fill(lAlphaV0,lPtArmV0);
1127 if(IsLambdaInvMass(lInvMassLambda)){selectedLambda->Add(new AliLeadingBasicParticle(lEtaLambda,lPhiLambda,lPtLambda));}
1128 } //end of Rap condition
1130 } //end cTau condition
1132 //--------------------------------------AntiLambda---------------------------------//
1133 if (lcTauAntiLambda < fCTauLambda){
1134 if ((AntiLambdaPID==1 && lMomInnerWallNeg <=1) || (lMomInnerWallNeg >1) || !(fUsePID=="withPID")){
1135 if (TMath::Abs(lRapAntiLambda) < fRapidityCut) {
1136 fHistMassAntiLambda->Fill(lInvMassAntiLambda);
1137 fHistPtVsMassAntiLambda->Fill(lInvMassAntiLambda,lPtAntiLambda);
1138 fHistDcaPosToPrimVertexAntiLvsMass->Fill(lDcaPosToPrimVertex,lInvMassAntiLambda);
1139 fHistDcaNegToPrimVertexAntiLvsMass->Fill(lDcaNegToPrimVertex,lInvMassAntiLambda);
1140 fHistRadiusV0AntiLvsMass->Fill(lV0Radius,lInvMassAntiLambda);
1141 fHistDecayLengthV0AntiLvsMass->Fill(lV0DecayLength,lInvMassAntiLambda);
1142 fHistDcaV0DaughtersAntiLvsMass->Fill(lDcaV0Daughters,lInvMassAntiLambda);
1143 fHistCosPointAngleAntiLvsMass->Fill(lV0cosPointAngle,lInvMassAntiLambda);
1144 fHistArmenterosPodolanskiAntiLambda->Fill(lAlphaV0,lPtArmV0);
1145 } //end of Rap condition
1146 } // end of PID condition
1147 } //end cTau condition
1150 //--------------------------------------K0s Associated---------------------------------//
1152 if (lcTauK0s< fCTauK0) {
1153 if (TMath::Abs(lRapK0s) < fRapidityCut) {
1154 if(lCheckPIdK0Short) fHistPidMcMassK0->Fill(lInvMassK0);
1155 if(lCheckMcK0Short) {
1156 fHistAsMcPtK0->Fill(lPtK0s);
1157 fHistAsMcProdRadiusK0->Fill(mcPosMotherR);
1158 fHistAsMcProdRadiusXvsYK0s->Fill(mcPosMotherX,mcPosMotherY);
1159 if(lPtArmV0*fSpecialArmenterosCutK0s>(TMath::Abs(lAlphaV0))){
1160 fHistMassK0->Fill(lInvMassK0);
1161 fHistPtVsMassK0->Fill(lInvMassK0,lPtK0s);
1162 fHistDcaPosToPrimVertexK0vsMassK0->Fill(lDcaPosToPrimVertex,lInvMassK0);
1163 fHistDcaNegToPrimVertexK0vsMassK0->Fill(lDcaNegToPrimVertex,lInvMassK0);
1164 fHistRadiusV0K0vsMassK0->Fill(lV0Radius,lInvMassK0);
1165 fHistDecayLengthV0K0vsMassK0->Fill(lV0DecayLength,lInvMassK0);
1166 fHistDcaV0DaughtersK0vsMassK0->Fill(lDcaV0Daughters,lInvMassK0);
1167 fHistCosPointAngleK0vsMassK0->Fill(lV0cosPointAngle,lInvMassK0);
1168 fHistArmenterosPodolanskiK0->Fill(lAlphaV0,lPtArmV0);
1169 if(IsK0InvMass(lInvMassK0)){selectedK0->Add(new AliLeadingBasicParticle(lEtaK0s,lPhiK0s,lPtK0s));}
1172 if (lCheckSecondaryK0s) {
1173 fHistAsMcSecondaryPtVsRapK0s->Fill(lPtK0s,lRapK0s);
1174 fHistAsMcSecondaryProdRadiusK0s->Fill(mcPosMotherR);
1175 fHistAsMcSecondaryProdRadiusXvsYK0s->Fill(mcPosMotherX,mcPosMotherY);
1177 } // end rapidity condition
1178 } //end cTau condition
1179 //-----------------------------------Lambda Associated---------------------------------//
1180 if (lcTauLambda < fCTauLambda){
1181 if (TMath::Abs(lRapLambda) < fRapidityCut) {
1182 if(lCheckPIdLambda) fHistPidMcMassLambda->Fill(lInvMassLambda);
1183 if(lCheckMcLambda) {
1184 fHistAsMcPtLambda->Fill(lPtLambda);
1185 fHistAsMcProdRadiusLambda->Fill(mcPosMotherR);
1186 fHistAsMcProdRadiusXvsYLambda->Fill(mcPosMotherX,mcPosMotherY);
1187 if (lComeFromSigma) fHistAsMcPtLambdaFromSigma->Fill(lPtLambda);
1188 fHistMassLambda->Fill(lInvMassLambda);
1189 fHistPtVsMassLambda->Fill(lInvMassLambda,lPtLambda);
1190 fHistDcaPosToPrimVertexLvsMassL->Fill(lDcaPosToPrimVertex,lInvMassLambda);
1191 fHistDcaNegToPrimVertexLvsMassL->Fill(lDcaNegToPrimVertex,lInvMassLambda);
1192 fHistRadiusV0LvsMassL->Fill(lV0Radius,lInvMassLambda);
1193 fHistDecayLengthV0LvsMassL->Fill(lV0DecayLength,lInvMassLambda);
1194 fHistDcaV0DaughtersLvsMassL->Fill(lDcaV0Daughters,lInvMassLambda);
1195 fHistCosPointAngleLvsMassL->Fill(lV0cosPointAngle,lInvMassLambda);
1196 fHistArmenterosPodolanskiLambda->Fill(lAlphaV0,lPtArmV0);
1197 if(IsLambdaInvMass(lInvMassLambda)){selectedLambda->Add(new AliLeadingBasicParticle(lEtaLambda,lPhiLambda,lPtLambda));}
1199 if (lCheckSecondaryLambda) {
1200 fHistAsMcSecondaryPtVsRapLambda->Fill(lPtLambda,lRapLambda);
1201 fHistAsMcSecondaryProdRadiusLambda->Fill(mcPosMotherR);
1202 fHistAsMcSecondaryProdRadiusXvsYLambda->Fill(mcPosMotherX,mcPosMotherY);
1203 if (lComeFromSigma) fHistAsMcSecondaryPtLambdaFromSigma->Fill(lPtLambda);
1205 } // end rapidity condition
1206 }//end cTau condition
1207 //------------------------------AntiLambda Associated---------------------------------//
1208 if (lcTauAntiLambda < fCTauLambda){
1209 if (TMath::Abs(lRapAntiLambda) < fRapidityCut) {
1210 if(lCheckPIdAntiLambda) fHistPidMcMassAntiLambda->Fill(lInvMassAntiLambda);
1211 if(lCheckMcAntiLambda) {
1212 fHistAsMcPtAntiLambda->Fill(lPtAntiLambda);
1213 fHistAsMcProdRadiusAntiLambda->Fill(mcPosMotherR);
1214 fHistAsMcProdRadiusXvsYAntiLambda->Fill(mcPosMotherX,mcPosMotherY);
1215 if (lComeFromSigma) fHistAsMcPtAntiLambdaFromSigma->Fill(lPtAntiLambda);
1216 fHistMassAntiLambda->Fill(lInvMassAntiLambda);
1217 fHistPtVsMassAntiLambda->Fill(lInvMassAntiLambda,lPtAntiLambda);
1218 fHistDcaPosToPrimVertexAntiLvsMass->Fill(lDcaPosToPrimVertex,lInvMassAntiLambda);
1219 fHistDcaNegToPrimVertexAntiLvsMass->Fill(lDcaNegToPrimVertex,lInvMassAntiLambda);
1220 fHistRadiusV0AntiLvsMass->Fill(lV0Radius,lInvMassAntiLambda);
1221 fHistDecayLengthV0AntiLvsMass->Fill(lV0DecayLength,lInvMassAntiLambda);
1222 fHistDcaV0DaughtersAntiLvsMass->Fill(lDcaV0Daughters,lInvMassAntiLambda);
1223 fHistCosPointAngleAntiLvsMass->Fill(lV0cosPointAngle,lInvMassAntiLambda);
1224 fHistArmenterosPodolanskiAntiLambda->Fill(lAlphaV0,lPtArmV0);
1226 if (lCheckSecondaryAntiLambda) {
1227 fHistAsMcSecondaryPtVsRapAntiLambda->Fill(lPtAntiLambda,lRapAntiLambda);
1228 fHistAsMcSecondaryProdRadiusAntiLambda->Fill(mcPosMotherR);
1229 fHistAsMcSecondaryProdRadiusXvsYAntiLambda->Fill(mcPosMotherX,mcPosMotherY);
1230 if (lComeFromSigma) fHistAsMcSecondaryPtAntiLambdaFromSigma->Fill(lPtAntiLambda);
1232 } // end rapidity condition
1233 }//end cTau condition
1236 FillCorrelations(selectedTracksLeadingMC,selectedK0MC,fHistSibK0MC,fHistLeadInfoMC);
1237 FillCorrelations(selectedTracksLeadingMC,selectedLambdaMC,fHistSibLambdaMC,0);
1240 if(TMath::Abs(lPVz)>=10 || MultipOrCent>poolmax || MultipOrCent < poolmin) {
1241 if(fcollidingSys=="PP")AliInfo(Form("pp Event with Zvertex = %.2f cm and multiplicity = %.0f out of pool bounds, SKIPPING",mcZv,MultipOrCent));
1242 if(fcollidingSys=="PbPb") AliInfo(Form("PbPb Event with Zvertex = %.2f cm and centrality = %.1f out of pool bounds, SKIPPING",mcZv,MultipOrCent));
1246 fPoolK0MC = fPoolMgrMC->GetEventPool(MultipOrCent, mcZv);
1247 if (!fPoolK0MC){AliInfo(Form("No pool found for multiplicity = %f, zVtx = %f cm", MultipOrCent, mcZv));return;}
1249 if (fPoolK0MC->IsReady() || fPoolK0MC->NTracksInPool() > fPoolMinNTracks || fPoolK0MC->GetCurrentNEvents() >= fMinEventsToMix)
1251 for (Int_t jMix=0; jMix<fPoolK0MC->GetCurrentNEvents(); jMix++)
1252 FillCorrelations(selectedTracksLeadingMC, fPoolK0MC->GetEvent(jMix),fHistMixK0MC,fHistLeadInfoMixMC);
1253 fPoolK0MC->UpdatePool(CloneAndReduceTrackList(selectedK0MC));
1256 fPoolLambdaMC = fPoolMgrMC->GetEventPool(MultipOrCent, mcZv);
1257 if (!fPoolLambdaMC){AliInfo(Form("No pool found for multiplicity = %f, zVtx = %f cm", MultipOrCent, mcZv));return;}
1259 if (fPoolLambdaMC->IsReady() || fPoolLambdaMC->NTracksInPool() > fPoolMinNTracks || fPoolLambdaMC->GetCurrentNEvents() >= fMinEventsToMix)
1261 for (Int_t jMix=0; jMix<fPoolLambdaMC->GetCurrentNEvents(); jMix++)
1262 FillCorrelations(selectedTracksLeadingMC, fPoolLambdaMC->GetEvent(jMix),fHistMixLambdaMC,0);
1263 fPoolLambdaMC->UpdatePool(CloneAndReduceTrackList(selectedLambdaMC));
1267 FillCorrelations(selectedTracksLeading,selectedK0,fHistSibK0,fHistLeadInfo);
1268 FillCorrelations(selectedTracksLeading,selectedLambda,fHistSibLambda,0);
1271 if(TMath::Abs(lPVz)>=10 || MultipOrCent>poolmax || MultipOrCent < poolmin) {
1272 if(fcollidingSys=="PP")AliInfo(Form("pp Event with Zvertex = %.2f cm and multiplicity = %.0f out of pool bounds, SKIPPING",lPVz,MultipOrCent));
1273 if(fcollidingSys=="PbPb") AliInfo(Form("PbPb Event with Zvertex = %.2f cm and centrality = %.1f out of pool bounds, SKIPPING",lPVz,MultipOrCent));
1277 fPoolK0 = fPoolMgr->GetEventPool(MultipOrCent, lPVz);
1278 if (!fPoolK0){AliInfo(Form("No pool found for multiplicity = %f, zVtx = %f cm", MultipOrCent, lPVz));return;}
1280 if (fPoolK0->IsReady() || fPoolK0->NTracksInPool() > fPoolMinNTracks || fPoolK0->GetCurrentNEvents() >= fMinEventsToMix)
1282 for (Int_t jMix=0; jMix<fPoolK0->GetCurrentNEvents(); jMix++)
1283 FillCorrelations(selectedTracksLeading, fPoolK0->GetEvent(jMix),fHistMixK0,fHistLeadInfoMix);
1284 fPoolK0->UpdatePool(CloneAndReduceTrackList(selectedK0));
1287 fPoolLambda = fPoolMgr->GetEventPool(MultipOrCent, lPVz);
1288 if (!fPoolLambda){AliInfo(Form("No pool found for multiplicity = %f, zVtx = %f cm", MultipOrCent, lPVz));return;}
1290 if (fPoolLambda->IsReady() || fPoolLambda->NTracksInPool() > fPoolMinNTracks || fPoolLambda->GetCurrentNEvents() >= fMinEventsToMix)
1292 for (Int_t jMix=0; jMix<fPoolLambda->GetCurrentNEvents(); jMix++)
1293 FillCorrelations(selectedTracksLeading, fPoolLambda->GetEvent(jMix),fHistMixLambda,0);
1294 fPoolLambda->UpdatePool(CloneAndReduceTrackList(selectedLambda));
1297 PostData(1, fOutputList);
1299 //---------------------------------------------------------------------------------------
1300 TObjArray* AliLeadingV0Correlation::CloneAndReduceTrackList(TObjArray* tracks)
1302 // clones a track list for mixing
1303 TObjArray* tracksClone = new TObjArray;
1304 tracksClone->SetOwner(kTRUE);
1306 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
1308 AliVParticle* particle = (AliVParticle*) tracks->At(i);
1309 tracksClone->Add(new AliLeadingBasicParticle(particle->Eta(), particle->Phi(), particle->Pt()));
1314 //---------------------------------------------------------------------------------------
1315 Int_t AliLeadingV0Correlation::NParticles(TObject* obj)
1319 if (obj->InheritsFrom("TClonesArray")){ // MC particles
1320 TClonesArray *arrayMC = static_cast<TClonesArray*>(obj);
1321 nTracks = arrayMC->GetEntriesFast();
1322 }else if (obj->InheritsFrom("TObjArray")){ // list of AliVParticle
1323 TObjArray *array = static_cast<TObjArray*>(obj);
1324 nTracks = array->GetEntriesFast();
1325 }else if (obj->InheritsFrom("AliAODEvent")){ // RECO AOD tracks
1326 AliAODEvent *aodEvent = static_cast<AliAODEvent*>(obj);
1327 nTracks = aodEvent->GetNTracks();
1329 if (fDebug > 1) AliFatal(" Analysis type not defined !!! ");
1335 //---------------------------------------------------------------------------------------
1336 Bool_t AliLeadingV0Correlation::IsAcseptedPrimaryTrack(const AliAODTrack *itrack)
1338 if (TMath::Abs(itrack->Eta())>fTrackEtaCut) return kFALSE;
1339 if (!itrack->TestFilterBit(fFilterBit)) return kFALSE;
1342 //---------------------------------------------------------------------------------------
1343 Bool_t AliLeadingV0Correlation::IsAcseptedDaughterTrack(const AliAODTrack *itrack)
1345 if(TMath::Abs(itrack->Eta())>fTrackEtaCut)return kFALSE;
1347 if (!itrack->IsOn(AliAODTrack::kTPCrefit)) return kFALSE;
1349 Float_t nCrossedRowsTPC = itrack->GetTPCClusterInfo(2,1);
1350 if (nCrossedRowsTPC < 70) return kFALSE;
1352 Int_t findable=itrack->GetTPCNclsF();
1353 if (findable <= 0) return kFALSE;
1355 if (nCrossedRowsTPC/findable < 0.8) return kFALSE;
1359 //---------------------------------------------------------------------------------------
1360 Double_t AliLeadingV0Correlation::RangePhi(Double_t DPhi)
1362 if (DPhi < -TMath::Pi()/2) DPhi += 2*TMath::Pi();
1363 if (DPhi > 3*TMath::Pi()/2) DPhi -= 2*TMath::Pi();
1366 //---------------------------------------------------------------------------------------
1367 void AliLeadingV0Correlation::FillCorrelations(TObjArray* particles, TObjArray* mixed,TH3F*histo,TH3F*leadinfo)
1369 TObjArray* input = (mixed) ? mixed : particles;
1370 TArrayF eta(input->GetEntriesFast());
1371 for (Int_t i=0; i<input->GetEntriesFast(); i++) eta[i] = ((AliVParticle*) input->At(i))->Eta();
1374 Int_t jMax = particles->GetEntriesFast();
1375 if (mixed) jMax = mixed->GetEntriesFast();
1376 for (Int_t i=0; i<particles->GetEntriesFast(); i++)
1378 AliVParticle* triggerParticle = (AliVParticle*) particles->At(0); //For leading Track
1379 // some optimization
1380 Float_t triggerEta = triggerParticle->Eta();
1382 for (Int_t j=0; j<jMax; j++)
1384 if (!mixed && i == j)continue;
1385 AliVParticle* particle = 0;
1386 if (!mixed)particle = (AliVParticle*) particles->At(0); //For leading Track
1387 else particle = (AliVParticle*) mixed->At(j);
1389 // check if both particles point to the same element (does not occur for mixed events, but if subsets are mixed within the same event for cross-checks)
1390 if (mixed && triggerParticle == particle)continue;
1392 if (particle->Pt() > triggerParticle->Pt())continue;
1394 if (((particle->Pt())<fassocPtLow)||((particle->Pt())>fassocPtHigh)) continue;
1395 if (((triggerParticle->Pt())<ftrigPtLow)||((triggerParticle->Pt())>ftrigPtHigh)) continue;
1398 vars[0] = triggerEta - eta[j];
1399 vars[1] = particle->Pt(); //Associated Pt
1400 vars[2] = triggerParticle->Pt(); //Triger Pt
1401 vars[3] = RangePhi(triggerParticle->Phi() - particle->Phi());
1403 histo->Fill(vars[3],vars[0],vars[1]);
1404 if(leadinfo)leadinfo->Fill(vars[2],triggerEta,triggerParticle->Phi());
1410 //---------------------------------------------------------------------------------------
1411 TObjArray* AliLeadingV0Correlation::FindLeadingObjects(TObject *obj)
1414 Int_t nTracks = NParticles(obj);
1415 if( !nTracks ) return 0;
1417 // Define array of AliVParticle objects
1418 TObjArray* tracks = new TObjArray(nTracks);
1420 // Loop over tracks or jets
1421 for (Int_t ipart=0; ipart<nTracks; ++ipart) {
1422 AliVParticle* part = ParticleWithCuts( obj,ipart);
1423 if (!part) continue;
1425 if(!IsAcseptedPrimaryTrack(((AliAODTrack*)part)))continue;
1426 if(!IsTrackNotFromV0(((AliAODTrack*)part)))continue;
1428 tracks->AddLast( part );
1430 // Order tracks by pT
1431 QSortTracks( *tracks, 0, tracks->GetEntriesFast() );
1433 nTracks = tracks->GetEntriesFast();
1434 if( !nTracks ) return 0;
1438 //---------------------------------------------------------------------------------------
1439 TObjArray* AliLeadingV0Correlation::FindLeadingObjectsMC(TObject *obj)
1442 Int_t nTracks = NParticles(obj);
1443 if( !nTracks ) return 0;
1445 // Define array of AliVParticle objects
1446 TObjArray* tracks = new TObjArray(nTracks);
1448 // Loop over tracks or jets
1449 for (Int_t ipart=0; ipart<nTracks; ++ipart) {
1450 AliVParticle* part = ParticleWithCuts( obj,ipart);
1451 if (!part) continue;
1452 Int_t pdgCodeCurrent = ((AliAODMCParticle*)part)->GetPdgCode();
1453 Bool_t isHadron = TMath::Abs(pdgCodeCurrent)==211 || // Pion
1454 TMath::Abs(pdgCodeCurrent)==2212 || // Proton
1455 TMath::Abs(pdgCodeCurrent)==321; // Kaon
1456 if (!isHadron) continue;
1457 tracks->AddLast( part );
1459 // Order tracks by pT
1460 QSortTracks( *tracks, 0, tracks->GetEntriesFast() );
1462 nTracks = tracks->GetEntriesFast();
1463 if( !nTracks ) return 0;
1467 //---------------------------------------------------------------------------------------
1468 void AliLeadingV0Correlation::QSortTracks(TObjArray &a, Int_t first, Int_t last)
1470 // Sort array of TObjArray of tracks by Pt using a quicksort algorithm.
1472 static TObject *tmp;
1473 static int i; // "static" to save stack space
1476 while (last - first > 1) {
1480 while (++i < last && ((AliVParticle*)a[i])->Pt() > ((AliVParticle*)a[first])->Pt() )
1482 while (--j > first && ((AliVParticle*)a[j])->Pt() < ((AliVParticle*)a[first])->Pt() )
1498 if (j - first < last - (j + 1)) {
1499 QSortTracks(a, first, j);
1500 first = j + 1; // QSortTracks(j + 1, last);
1502 QSortTracks(a, j + 1, last);
1503 last = j; // QSortTracks(first, j);
1507 //---------------------------------------------------------------------------------------
1508 AliVParticle* AliLeadingV0Correlation::ParticleWithCuts(TObject* obj, Int_t ipart)
1510 AliVParticle *part=0;
1511 if (obj->InheritsFrom("AliAODEvent")){ // RECO AOD TRACKS
1512 AliAODEvent *aodEvent = static_cast<AliAODEvent*>(obj);
1513 part = aodEvent->GetTrack(ipart);
1514 // track selection cuts
1515 if ( !(((AliAODTrack*)part)->TestFilterBit(fFilterBit))) return 0;
1517 else if(obj->InheritsFrom("TClonesArray")){ // AOD-MC PARTICLE
1518 TClonesArray *arrayMC = static_cast<TClonesArray*>(obj);
1519 part = (AliVParticle*)arrayMC->At( ipart );
1521 // eventually only primaries
1522 if (!( ((AliAODMCParticle*)part)->IsPhysicalPrimary()) )return 0;
1523 // eventually only hadrons
1524 Int_t pdgCode = ((AliAODMCParticle*)part)->GetPdgCode();
1525 Bool_t isHadron = TMath::Abs(pdgCode)==211 || // Pion
1526 TMath::Abs(pdgCode)==2212 || // Proton
1527 TMath::Abs(pdgCode)==321; // Kaon
1528 if (!isHadron) return 0;
1532 if (!part->Charge())return 0;
1535 //---------------------------------------------------------------------------------------
1536 Bool_t AliLeadingV0Correlation::IsK0InvMass(const Double_t mass) const
1539 const Float_t massK0 = 0.497;
1540 const Float_t sigmaK0 = 0.003;
1541 const Float_t nSigmaSignal = 3.5;
1543 return ((massK0-nSigmaSignal*sigmaK0)<=mass && mass<=(massK0 + nSigmaSignal*sigmaK0))?1:0;
1545 //---------------------------------------------------------------------------------------
1546 Bool_t AliLeadingV0Correlation::IsLambdaInvMass(const Double_t mass) const
1549 const Float_t massLambda = 1.116;
1550 const Float_t sigmaLambda = 0.003;
1551 const Float_t nSigmaSignal = 3.5;
1553 return ((massLambda-nSigmaSignal*sigmaLambda)<=mass && mass<=(massLambda + nSigmaSignal*sigmaLambda))?1:0;
1555 //---------------------------------------------------------------------------------------
1556 Bool_t AliLeadingV0Correlation::IsTrackNotFromV0(AliAODTrack* track)
1558 Int_t atrID = track->GetID();
1560 for(int i=0; i<fAODEvent->GetNumberOfV0s(); i++){ // loop over V0s
1561 AliAODv0* aodV0 = fAODEvent->GetV0(i);
1563 AliAODTrack *trackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
1564 AliAODTrack *trackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
1566 if ( !(IsAcseptedDaughterTrack(trackPos)) || !(IsAcseptedDaughterTrack(trackNeg)) ) continue;
1567 //----------------------------------
1568 Int_t negID = trackNeg->GetID();
1569 Int_t posID = trackPos->GetID();
1571 if ((TMath::Abs(negID)+1)==(TMath::Abs(atrID))){ return kFALSE;}
1572 if ((TMath::Abs(posID)+1)==(TMath::Abs(atrID))){ return kFALSE;}
1573 //----------------------------------
1577 //---------------------------------------------------------------------------------------
1578 Bool_t AliLeadingV0Correlation::IsAcseptedV0(const AliAODEvent*aod, const AliAODv0* aodV0, const AliAODTrack* myTrackPos, const AliAODTrack* myTrackNeg)
1580 if (!aodV0) return kFALSE;
1582 // Offline reconstructed V0 only
1583 if (aodV0->GetOnFlyStatus()) return kFALSE;
1585 // DCA of daughter track to Primary Vertex
1586 Float_t dcaNP=aodV0->DcaNegToPrimVertex();
1587 if (TMath::Abs(dcaNP)<fCutDCANegToPV) return kFALSE;
1588 Float_t dcaPP=aodV0->DcaPosToPrimVertex();
1589 if (TMath::Abs(dcaPP)<fCutDCAPosToPV) return kFALSE;
1591 // DCA of daughter tracks
1592 Double_t dcaD=aodV0->DcaV0Daughters();
1593 if (dcaD>fCutDCAV0Daughters) return kFALSE;
1595 // Cosinus of pointing angle
1596 Double_t cpa=aodV0->CosPointingAngle(aod->GetPrimaryVertex());
1597 if (cpa<fCutV0CosPA) return kFALSE;
1600 Double_t xyz[3]; aodV0->GetSecondaryVtx(xyz);
1601 Double_t r2=xyz[0]*xyz[0] + xyz[1]*xyz[1];
1602 if (r2<fCutV0Radius) return kFALSE;
1604 // Get daughters and check them
1605 myTrackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
1606 myTrackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
1608 if (!myTrackPos||!myTrackNeg) return kFALSE;
1609 // Unlike signs of daughters
1610 if (myTrackPos->Charge() == myTrackNeg->Charge()) return kFALSE;
1612 // Track cuts for daughers
1613 if ( !(IsAcseptedDaughterTrack(myTrackPos)) || !(IsAcseptedDaughterTrack(myTrackNeg)) ) return kFALSE;
1615 // Minimum pt of daughters
1616 Double_t lMomPos[3] = {999,999,999};
1617 Double_t lMomNeg[3] = {999,999,999};
1619 lMomPos[0] = aodV0->MomPosX();
1620 lMomPos[1] = aodV0->MomPosY();
1621 lMomPos[2] = aodV0->MomPosZ();
1623 lMomNeg[0] = aodV0->MomNegX();
1624 lMomNeg[1] = aodV0->MomNegY();
1625 lMomNeg[2] = aodV0->MomNegZ();
1627 Double_t lPtPos = TMath::Sqrt(lMomPos[0]*lMomPos[0] + lMomPos[1]*lMomPos[1]);
1628 Double_t lPtNeg = TMath::Sqrt(lMomNeg[0]*lMomNeg[0] + lMomNeg[1]*lMomNeg[1]);
1630 Double_t cutMinPtDaughter = 0.150;
1631 if (lPtPos<cutMinPtDaughter || lPtNeg<cutMinPtDaughter) return kFALSE;
1635 //---------------------------------------------------------------------------------------
1636 void AliLeadingV0Correlation::Terminate(Option_t *)
1638 //No need in the grid
1640 //---------------------------------------------------------------------------------------