]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGJE/StrangenessInJets/AliAnalysisTaskV0sInJets.cxx
Fixed type conversion.
[u/mrichter/AliRoot.git] / PWGJE / StrangenessInJets / AliAnalysisTaskV0sInJets.cxx
CommitLineData
257f0eee 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
7729cc34 16// task for analysis of V0s (K0S, (anti-)Lambda) in charged jets
17// Author: Vit Kucera (vit.kucera@cern.ch)
18
19#include "TChain.h"
20#include "TTree.h"
21#include "TH1D.h"
22#include "TH2D.h"
23#include "THnSparse.h"
24#include "TCanvas.h"
25
26#include "AliAnalysisTask.h"
27#include "AliAnalysisManager.h"
28
29#include "AliESDEvent.h"
30#include "AliAODEvent.h"
31#include "AliAODTrack.h"
32#include <TDatabasePDG.h>
33#include <TPDGCode.h>
34#include "AliPIDResponse.h"
35#include "AliInputEventHandler.h"
36#include "AliAODMCHeader.h"
37#include "AliAODMCParticle.h"
38#include "TClonesArray.h"
39//#include "AliEventInfoObject.cxx"
40//#include "AliV0Object.cxx"
41//#include "AliJetObject.cxx"
42#include "TRandom3.h"
43
44#include "AliAnalysisTaskV0sInJets.h"
45
46ClassImp(AliAnalysisTaskV0sInJets)
47
48// upper edges of centrality bins
9706bde3 49//const Int_t AliAnalysisTaskV0sInJets::fgkiCentBinRanges[AliAnalysisTaskV0sInJets::fgkiNBinsCent] = {10, 30, 50, 80}; // Alice Zimmermann
7729cc34 50//const Int_t AliAnalysisTaskV0sInJets::fgkiCentBinRanges[AliAnalysisTaskV0sInJets::fgkiNBinsCent] = {10, 20, 40, 60, 80}; // Vit Kucera, initial binning
51//const Int_t AliAnalysisTaskV0sInJets::fgkiCentBinRanges[AliAnalysisTaskV0sInJets::fgkiNBinsCent] = {5, 10, 20, 40, 60, 80}; // Iouri Belikov, LF analysis
9706bde3 52const Int_t AliAnalysisTaskV0sInJets::fgkiCentBinRanges[AliAnalysisTaskV0sInJets::fgkiNBinsCent] = {10}; // only central
7729cc34 53
54// axis: pT of V0
9706bde3 55const Double_t AliAnalysisTaskV0sInJets::fgkdBinsPtV0[2] = {0, 12};
7495a67b 56const Int_t AliAnalysisTaskV0sInJets::fgkiNBinsPtV0 = sizeof(AliAnalysisTaskV0sInJets::fgkdBinsPtV0) / sizeof((AliAnalysisTaskV0sInJets::fgkdBinsPtV0)[0]) - 1;
57const Int_t AliAnalysisTaskV0sInJets::fgkiNBinsPtV0Init = int(((AliAnalysisTaskV0sInJets::fgkdBinsPtV0)[AliAnalysisTaskV0sInJets::fgkiNBinsPtV0] - (AliAnalysisTaskV0sInJets::fgkdBinsPtV0)[0]) / 0.1); // bin width 0.1 GeV/c
7729cc34 58// axis: pT of jets
59const Double_t AliAnalysisTaskV0sInJets::fgkdBinsPtJet[2] = {0, 100};
7495a67b 60const Int_t AliAnalysisTaskV0sInJets::fgkiNBinsPtJet = sizeof(AliAnalysisTaskV0sInJets::fgkdBinsPtJet) / sizeof(AliAnalysisTaskV0sInJets::fgkdBinsPtJet[0]) - 1;
61const Int_t AliAnalysisTaskV0sInJets::fgkiNBinsPtJetInit = int(((AliAnalysisTaskV0sInJets::fgkdBinsPtJet)[AliAnalysisTaskV0sInJets::fgkiNBinsPtJet] - (AliAnalysisTaskV0sInJets::fgkdBinsPtJet)[0]) / 5.); // bin width 5 GeV/c
7729cc34 62// axis: K0S invariant mass
9706bde3 63const Int_t AliAnalysisTaskV0sInJets::fgkiNBinsMassK0s = 300;
64const Double_t AliAnalysisTaskV0sInJets::fgkdMassK0sMin = 0.35;
65const Double_t AliAnalysisTaskV0sInJets::fgkdMassK0sMax = 0.65;
7729cc34 66// axis: Lambda invariant mass
67const Int_t AliAnalysisTaskV0sInJets::fgkiNBinsMassLambda = 200;
87e23d3e 68const Double_t AliAnalysisTaskV0sInJets::fgkdMassLambdaMin = 1.05;
69const Double_t AliAnalysisTaskV0sInJets::fgkdMassLambdaMax = 1.25;
7729cc34 70
71
72// Default constructor
73AliAnalysisTaskV0sInJets::AliAnalysisTaskV0sInJets():
74 AliAnalysisTaskSE(),
75 fAODIn(0),
76 fAODOut(0),
77 fOutputListStd(0),
78 fOutputListQA(0),
79 fOutputListCuts(0),
80 fOutputListMC(0),
81// ftreeOut(0),
82
83 fiAODAnalysis(1),
7495a67b 84 fbIsPbPb(1),
7729cc34 85
86 fdCutDCAToPrimVtxMin(0.1),
87 fdCutDCADaughtersMax(1.),
88 fdCutNSigmadEdxMax(3),
89 fdCutCPAMin(0.998),
90 fdCutNTauMax(5),
91
92 fsJetBranchName(0),
9706bde3 93 fsJetBgBranchName(0),
87e23d3e 94 fdCutPtJetMin(0),
95 fdCutPtTrackMin(5),
96 fdRadiusJet(0.4),
7495a67b 97 fdRadiusJetBg(0.4),
7729cc34 98 fbJetSelection(0),
99 fbMCAnalysis(0),
100// fbTreeOutput(0),
101 fRandom(0),
102
87e23d3e 103 fdCutVertexZ(10),
104 fdCutVertexR2(1),
105 fdCutCentLow(0),
106 fdCutCentHigh(80),
7729cc34 107
108/*
109 fBranchV0Rec(0),
110 fBranchV0Gen(0),
111 fBranchJet(0),
112 fEventInfo(0),
113*/
87e23d3e 114 fdCentrality(0),
7729cc34 115 fh1EventCounterCut(0),
116 fh1EventCent(0),
117 fh1EventCent2(0),
169867f8 118 fh1EventCent2Jets(0),
119 fh1EventCent2NoJets(0),
7729cc34 120 fh2EventCentTracks(0),
121 fh1V0CandPerEvent(0),
122 fh1NRndConeCent(0),
9706bde3 123 fh1NMedConeCent(0),
7729cc34 124 fh1AreaExcluded(0),
125
126 fh2CCK0s(0),
127 fh2CCLambda(0),
128 fh3CCMassCorrelBoth(0),
129 fh3CCMassCorrelKNotL(0),
130 fh3CCMassCorrelLNotK(0)
131{
7495a67b 132 for(Int_t i = 0; i < fgkiNQAIndeces; i++)
133 {
134 fh1QAV0Status[i] = 0;
135 fh1QAV0TPCRefit[i] = 0;
136 fh1QAV0TPCRows[i] = 0;
137 fh1QAV0TPCFindable[i] = 0;
138 fh1QAV0TPCRowsFind[i] = 0;
139 fh1QAV0Eta[i] = 0;
140 fh2QAV0EtaRows[i] = 0;
141 fh2QAV0PtRows[i] = 0;
142 fh2QAV0PhiRows[i] = 0;
143 fh2QAV0NClRows[i] = 0;
144 fh2QAV0EtaNCl[i] = 0;
145
146 fh2QAV0EtaPtK0sPeak[i] = 0;
147 fh2QAV0EtaEtaK0s[i] = 0;
148 fh2QAV0PhiPhiK0s[i] = 0;
149 fh1QAV0RapK0s[i] = 0;
150 fh2QAV0PtPtK0sPeak[i] = 0;
151 fh2ArmPodK0s[i] = 0;
152
153 fh2QAV0EtaPtLambdaPeak[i] = 0;
154 fh2QAV0EtaEtaLambda[i] = 0;
155 fh2QAV0PhiPhiLambda[i] = 0;
156 fh1QAV0RapLambda[i] = 0;
157 fh2QAV0PtPtLambdaPeak[i] = 0;
158 fh2ArmPodLambda[i] = 0;
159
160 fh2QAV0EtaPtALambdaPeak[i] = 0;
161 fh2QAV0EtaEtaALambda[i] = 0;
162 fh2QAV0PhiPhiALambda[i] = 0;
163 fh1QAV0RapALambda[i] = 0;
164 fh2QAV0PtPtALambdaPeak[i] = 0;
165 fh2ArmPodALambda[i] = 0;
166
167 fh1QAV0Pt[i] = 0;
168 fh1QAV0Charge[i] = 0;
169 fh1QAV0DCAVtx[i] = 0;
170 fh1QAV0DCAV0[i] = 0;
171 fh1QAV0Cos[i] = 0;
172 fh1QAV0R[i] = 0;
173 fh1QACTau2D[i] = 0;
174 fh1QACTau3D[i] = 0;
175
176 fh2ArmPod[i] = 0;
177
178 /*
179 fh2CutTPCRowsK0s[i] = 0;
180 fh2CutTPCRowsLambda[i] = 0;
181 fh2CutPtPosK0s[i] = 0;
182 fh2CutPtNegK0s[i] = 0;
183 fh2CutPtPosLambda[i] = 0;
184 fh2CutPtNegLambda[i] = 0;
185 fh2CutDCAVtx[i] = 0;
186 fh2CutDCAV0[i] = 0;
187 fh2CutCos[i] = 0;
188 fh2CutR[i] = 0;
189 fh2CutEtaK0s[i] = 0;
190 fh2CutEtaLambda[i] = 0;
191 fh2CutRapK0s[i] = 0;
192 fh2CutRapLambda[i] = 0;
193 fh2CutCTauK0s[i] = 0;
194 fh2CutCTauLambda[i] = 0;
195 fh2CutPIDPosK0s[i] = 0;
196 fh2CutPIDNegK0s[i] = 0;
197 fh2CutPIDPosLambda[i] = 0;
198 fh2CutPIDNegLambda[i] = 0;
199
200 fh2Tau3DVs2D[i] = 0;
201 */
202 }
203 for(Int_t i = 0; i < fgkiNCategV0; i++)
204 {
205 fh1V0InvMassK0sAll[i] = 0;
206 fh1V0InvMassLambdaAll[i] = 0;
207 fh1V0InvMassALambdaAll[i] = 0;
208 }
209 for(Int_t i = 0; i < fgkiNBinsCent; i++)
210 {
211 fh1EventCounterCutCent[i] = 0;
212 fh1V0CounterCentK0s[i] = 0;
213 fh1V0CounterCentLambda[i] = 0;
214 fh1V0CounterCentALambda[i] = 0;
215 fh1V0CandPerEventCentK0s[i] = 0;
216 fh1V0CandPerEventCentLambda[i] = 0;
217 fh1V0CandPerEventCentALambda[i] = 0;
218 fh1V0InvMassK0sCent[i] = 0;
219 fh1V0InvMassLambdaCent[i] = 0;
220 fh1V0InvMassALambdaCent[i] = 0;
221 fh1V0K0sPtMCGen[i] = 0;
222 fh2V0K0sPtMassMCRec[i] = 0;
223 fh1V0K0sPtMCRecFalse[i] = 0;
224 fh2V0K0sEtaPtMCGen[i] = 0;
225 fh3V0K0sEtaPtMassMCRec[i] = 0;
226 fh2V0K0sInJetPtMCGen[i] = 0;
227 fh3V0K0sInJetPtMassMCRec[i] = 0;
228 fh3V0K0sInJetEtaPtMCGen[i] = 0;
229 fh4V0K0sInJetEtaPtMassMCRec[i] = 0;
230 fh2V0K0sMCResolMPt[i] = 0;
231 fh2V0K0sMCPtGenPtRec[i] = 0;
232 fh1V0LambdaPtMCGen[i] = 0;
233 fh2V0LambdaPtMassMCRec[i] = 0;
234 fh1V0LambdaPtMCRecFalse[i] = 0;
235 fh2V0LambdaEtaPtMCGen[i] = 0;
236 fh3V0LambdaEtaPtMassMCRec[i] = 0;
237 fh2V0LambdaInJetPtMCGen[i] = 0;
238 fh3V0LambdaInJetPtMassMCRec[i] = 0;
239 fh3V0LambdaInJetEtaPtMCGen[i] = 0;
240 fh4V0LambdaInJetEtaPtMassMCRec[i] = 0;
241 fh2V0LambdaMCResolMPt[i] = 0;
242 fh2V0LambdaMCPtGenPtRec[i] = 0;
243 fhnV0LambdaInclMCFD[i] = 0;
244 fhnV0LambdaInJetsMCFD[i] = 0;
245 fhnV0LambdaBulkMCFD[i] = 0;
246 fh1V0XiPtMCGen[i] = 0;
247 fh1V0ALambdaPt[i] = 0;
248 fh1V0ALambdaPtMCGen[i] = 0;
249 fh1V0ALambdaPtMCRec[i] = 0;
250 fh2V0ALambdaPtMassMCRec[i] = 0;
251 fh1V0ALambdaPtMCRecFalse[i] = 0;
252 fh2V0ALambdaEtaPtMCGen[i] = 0;
253 fh3V0ALambdaEtaPtMassMCRec[i] = 0;
254 fh2V0ALambdaInJetPtMCGen[i] = 0;
255 fh2V0ALambdaInJetPtMCRec[i] = 0;
256 fh3V0ALambdaInJetPtMassMCRec[i] = 0;
257 fh3V0ALambdaInJetEtaPtMCGen[i] = 0;
258 fh4V0ALambdaInJetEtaPtMassMCRec[i] = 0;
259 fh2V0ALambdaMCResolMPt[i] = 0;
260 fh2V0ALambdaMCPtGenPtRec[i] = 0;
261 fhnV0ALambdaInclMCFD[i] = 0;
262 fhnV0ALambdaInJetsMCFD[i] = 0;
263 fhnV0ALambdaBulkMCFD[i] = 0;
264 fh1V0AXiPtMCGen[i] = 0;
265
266 // eta daughters
7729cc34 267// fhnV0K0sInclDaughterEtaPtPtMCGen[i] = 0;
7495a67b 268 fhnV0K0sInclDaughterEtaPtPtMCRec[i] = 0;
7729cc34 269// fhnV0K0sInJetsDaughterEtaPtPtMCGen[i] = 0;
7495a67b 270 fhnV0K0sInJetsDaughterEtaPtPtMCRec[i] = 0;
7729cc34 271// fhnV0LambdaInclDaughterEtaPtPtMCGen[i] = 0;
7495a67b 272 fhnV0LambdaInclDaughterEtaPtPtMCRec[i] = 0;
7729cc34 273// fhnV0LambdaInJetsDaughterEtaPtPtMCGen[i] = 0;
7495a67b 274 fhnV0LambdaInJetsDaughterEtaPtPtMCRec[i] = 0;
7729cc34 275// fhnV0ALambdaInclDaughterEtaPtPtMCGen[i] = 0;
7495a67b 276 fhnV0ALambdaInclDaughterEtaPtPtMCRec[i] = 0;
7729cc34 277// fhnV0ALambdaInJetsDaughterEtaPtPtMCGen[i] = 0;
7495a67b 278 fhnV0ALambdaInJetsDaughterEtaPtPtMCRec[i] = 0;
279
280 // Inclusive
281 fhnV0InclusiveK0s[i] = 0;
282 fhnV0InclusiveLambda[i] = 0;
283 fhnV0InclusiveALambda[i] = 0;
284 // Cones
285 fhnV0InJetK0s[i] = 0;
286 fhnV0InPerpK0s[i] = 0;
287 fhnV0InRndK0s[i] = 0;
288 fhnV0InMedK0s[i] = 0;
289 fhnV0OutJetK0s[i] = 0;
290 fhnV0NoJetK0s[i] = 0;
291 fhnV0InJetLambda[i] = 0;
292 fhnV0InPerpLambda[i] = 0;
293 fhnV0InRndLambda[i] = 0;
294 fhnV0InMedLambda[i] = 0;
295 fhnV0OutJetLambda[i] = 0;
296 fhnV0NoJetLambda[i] = 0;
297 fhnV0InJetALambda[i] = 0;
298 fhnV0InPerpALambda[i] = 0;
299 fhnV0InRndALambda[i] = 0;
300 fhnV0InMedALambda[i] = 0;
301 fhnV0OutJetALambda[i] = 0;
302 fhnV0NoJetALambda[i] = 0;
303
304 fh2V0PtJetAngleK0s[i] = 0;
305 fh2V0PtJetAngleLambda[i] = 0;
306 fh2V0PtJetAngleALambda[i] = 0;
307 fh1DCAInK0s[i] = 0;
308 fh1DCAInLambda[i] = 0;
309 fh1DCAInALambda[i] = 0;
310 fh1DCAOutK0s[i] = 0;
311 fh1DCAOutLambda[i] = 0;
312 fh1DCAOutALambda[i] = 0;
313// fh1DeltaZK0s[i] = 0;
314// fh1DeltaZLambda[i] = 0;
315// fh1DeltaZALambda[i] = 0;
316
317 fh1PtJet[i] = 0;
318 fh1EtaJet[i] = 0;
319 fh2EtaPtJet[i] = 0;
320 fh1PhiJet[i] = 0;
321 fh1NJetPerEvent[i] = 0;
322 fh2EtaPhiRndCone[i] = 0;
323 fh2EtaPhiMedCone[i] = 0;
324
325 fh1VtxZ[i] = 0;
326 fh2VtxXY[i] = 0;
327 }
7729cc34 328}
329
330// Constructor
331AliAnalysisTaskV0sInJets::AliAnalysisTaskV0sInJets(const char* name):
332 AliAnalysisTaskSE(name),
333 fAODIn(0),
334 fAODOut(0),
335 fOutputListStd(0),
336 fOutputListQA(0),
337 fOutputListCuts(0),
338 fOutputListMC(0),
339// ftreeOut(0),
340
341 fiAODAnalysis(1),
7495a67b 342 fbIsPbPb(1),
7729cc34 343
344 fdCutDCAToPrimVtxMin(0.1),
345 fdCutDCADaughtersMax(1.),
346 fdCutNSigmadEdxMax(3),
347 fdCutCPAMin(0.998),
348 fdCutNTauMax(5),
349
350 fsJetBranchName(0),
9706bde3 351 fsJetBgBranchName(0),
87e23d3e 352 fdCutPtJetMin(0),
353 fdCutPtTrackMin(5),
354 fdRadiusJet(0.4),
7495a67b 355 fdRadiusJetBg(0.4),
7729cc34 356 fbJetSelection(0),
357 fbMCAnalysis(0),
358// fbTreeOutput(0),
359 fRandom(0),
360
87e23d3e 361 fdCutVertexZ(10),
362 fdCutVertexR2(1),
363 fdCutCentLow(0),
364 fdCutCentHigh(80),
7729cc34 365/*
366 fBranchV0Rec(0),
367 fBranchV0Gen(0),
368 fBranchJet(0),
369 fEventInfo(0),
370*/
87e23d3e 371 fdCentrality(0),
7729cc34 372 fh1EventCounterCut(0),
373 fh1EventCent(0),
374 fh1EventCent2(0),
169867f8 375 fh1EventCent2Jets(0),
376 fh1EventCent2NoJets(0),
7729cc34 377 fh2EventCentTracks(0),
378 fh1V0CandPerEvent(0),
379 fh1NRndConeCent(0),
9706bde3 380 fh1NMedConeCent(0),
7729cc34 381 fh1AreaExcluded(0),
382
383 fh2CCK0s(0),
384 fh2CCLambda(0),
385 fh3CCMassCorrelBoth(0),
386 fh3CCMassCorrelKNotL(0),
387 fh3CCMassCorrelLNotK(0)
388{
7495a67b 389 for(Int_t i = 0; i < fgkiNQAIndeces; i++)
390 {
391 fh1QAV0Status[i] = 0;
392 fh1QAV0TPCRefit[i] = 0;
393 fh1QAV0TPCRows[i] = 0;
394 fh1QAV0TPCFindable[i] = 0;
395 fh1QAV0TPCRowsFind[i] = 0;
396 fh1QAV0Eta[i] = 0;
397 fh2QAV0EtaRows[i] = 0;
398 fh2QAV0PtRows[i] = 0;
399 fh2QAV0PhiRows[i] = 0;
400 fh2QAV0NClRows[i] = 0;
401 fh2QAV0EtaNCl[i] = 0;
402
403 fh2QAV0EtaPtK0sPeak[i] = 0;
404 fh2QAV0EtaEtaK0s[i] = 0;
405 fh2QAV0PhiPhiK0s[i] = 0;
406 fh1QAV0RapK0s[i] = 0;
407 fh2QAV0PtPtK0sPeak[i] = 0;
408 fh2ArmPodK0s[i] = 0;
409
410 fh2QAV0EtaPtLambdaPeak[i] = 0;
411 fh2QAV0EtaEtaLambda[i] = 0;
412 fh2QAV0PhiPhiLambda[i] = 0;
413 fh1QAV0RapLambda[i] = 0;
414 fh2QAV0PtPtLambdaPeak[i] = 0;
415 fh2ArmPodLambda[i] = 0;
416
417 fh2QAV0EtaPtALambdaPeak[i] = 0;
418 fh2QAV0EtaEtaALambda[i] = 0;
419 fh2QAV0PhiPhiALambda[i] = 0;
420 fh1QAV0RapALambda[i] = 0;
421 fh2QAV0PtPtALambdaPeak[i] = 0;
422 fh2ArmPodALambda[i] = 0;
423
424 fh1QAV0Pt[i] = 0;
425 fh1QAV0Charge[i] = 0;
426 fh1QAV0DCAVtx[i] = 0;
427 fh1QAV0DCAV0[i] = 0;
428 fh1QAV0Cos[i] = 0;
429 fh1QAV0R[i] = 0;
430 fh1QACTau2D[i] = 0;
431 fh1QACTau3D[i] = 0;
432
433 fh2ArmPod[i] = 0;
434
435 /*
436 fh2CutTPCRowsK0s[i] = 0;
437 fh2CutTPCRowsLambda[i] = 0;
438 fh2CutPtPosK0s[i] = 0;
439 fh2CutPtNegK0s[i] = 0;
440 fh2CutPtPosLambda[i] = 0;
441 fh2CutPtNegLambda[i] = 0;
442 fh2CutDCAVtx[i] = 0;
443 fh2CutDCAV0[i] = 0;
444 fh2CutCos[i] = 0;
445 fh2CutR[i] = 0;
446 fh2CutEtaK0s[i] = 0;
447 fh2CutEtaLambda[i] = 0;
448 fh2CutRapK0s[i] = 0;
449 fh2CutRapLambda[i] = 0;
450 fh2CutCTauK0s[i] = 0;
451 fh2CutCTauLambda[i] = 0;
452 fh2CutPIDPosK0s[i] = 0;
453 fh2CutPIDNegK0s[i] = 0;
454 fh2CutPIDPosLambda[i] = 0;
455 fh2CutPIDNegLambda[i] = 0;
456
457 fh2Tau3DVs2D[i] = 0;
458 */
459 }
460 for(Int_t i = 0; i < fgkiNCategV0; i++)
461 {
462 fh1V0InvMassK0sAll[i] = 0;
463 fh1V0InvMassLambdaAll[i] = 0;
464 fh1V0InvMassALambdaAll[i] = 0;
465 }
466 for(Int_t i = 0; i < fgkiNBinsCent; i++)
467 {
468 fh1EventCounterCutCent[i] = 0;
469 fh1V0CounterCentK0s[i] = 0;
470 fh1V0CounterCentLambda[i] = 0;
471 fh1V0CounterCentALambda[i] = 0;
472 fh1V0CandPerEventCentK0s[i] = 0;
473 fh1V0CandPerEventCentLambda[i] = 0;
474 fh1V0CandPerEventCentALambda[i] = 0;
475 fh1V0InvMassK0sCent[i] = 0;
476 fh1V0InvMassLambdaCent[i] = 0;
477 fh1V0InvMassALambdaCent[i] = 0;
478 fh1V0K0sPtMCGen[i] = 0;
479 fh2V0K0sPtMassMCRec[i] = 0;
480 fh1V0K0sPtMCRecFalse[i] = 0;
481 fh2V0K0sEtaPtMCGen[i] = 0;
482 fh3V0K0sEtaPtMassMCRec[i] = 0;
483 fh2V0K0sInJetPtMCGen[i] = 0;
484 fh3V0K0sInJetPtMassMCRec[i] = 0;
485 fh3V0K0sInJetEtaPtMCGen[i] = 0;
486 fh4V0K0sInJetEtaPtMassMCRec[i] = 0;
487 fh2V0K0sMCResolMPt[i] = 0;
488 fh2V0K0sMCPtGenPtRec[i] = 0;
489 fh1V0LambdaPtMCGen[i] = 0;
490 fh2V0LambdaPtMassMCRec[i] = 0;
491 fh1V0LambdaPtMCRecFalse[i] = 0;
492 fh2V0LambdaEtaPtMCGen[i] = 0;
493 fh3V0LambdaEtaPtMassMCRec[i] = 0;
494 fh2V0LambdaInJetPtMCGen[i] = 0;
495 fh3V0LambdaInJetPtMassMCRec[i] = 0;
496 fh3V0LambdaInJetEtaPtMCGen[i] = 0;
497 fh4V0LambdaInJetEtaPtMassMCRec[i] = 0;
498 fh2V0LambdaMCResolMPt[i] = 0;
499 fh2V0LambdaMCPtGenPtRec[i] = 0;
500 fhnV0LambdaInclMCFD[i] = 0;
501 fhnV0LambdaInJetsMCFD[i] = 0;
502 fhnV0LambdaBulkMCFD[i] = 0;
503 fh1V0XiPtMCGen[i] = 0;
504 fh1V0ALambdaPt[i] = 0;
505 fh1V0ALambdaPtMCGen[i] = 0;
506 fh1V0ALambdaPtMCRec[i] = 0;
507 fh2V0ALambdaPtMassMCRec[i] = 0;
508 fh1V0ALambdaPtMCRecFalse[i] = 0;
509 fh2V0ALambdaEtaPtMCGen[i] = 0;
510 fh3V0ALambdaEtaPtMassMCRec[i] = 0;
511 fh2V0ALambdaInJetPtMCGen[i] = 0;
512 fh2V0ALambdaInJetPtMCRec[i] = 0;
513 fh3V0ALambdaInJetPtMassMCRec[i] = 0;
514 fh3V0ALambdaInJetEtaPtMCGen[i] = 0;
515 fh4V0ALambdaInJetEtaPtMassMCRec[i] = 0;
516 fh2V0ALambdaMCResolMPt[i] = 0;
517 fh2V0ALambdaMCPtGenPtRec[i] = 0;
518 fhnV0ALambdaInclMCFD[i] = 0;
519 fhnV0ALambdaInJetsMCFD[i] = 0;
520 fhnV0ALambdaBulkMCFD[i] = 0;
521 fh1V0AXiPtMCGen[i] = 0;
522
523 // eta daughters
7729cc34 524// fhnV0K0sInclDaughterEtaPtPtMCGen[i] = 0;
7495a67b 525 fhnV0K0sInclDaughterEtaPtPtMCRec[i] = 0;
7729cc34 526// fhnV0K0sInJetsDaughterEtaPtPtMCGen[i] = 0;
7495a67b 527 fhnV0K0sInJetsDaughterEtaPtPtMCRec[i] = 0;
7729cc34 528// fhnV0LambdaInclDaughterEtaPtPtMCGen[i] = 0;
7495a67b 529 fhnV0LambdaInclDaughterEtaPtPtMCRec[i] = 0;
7729cc34 530// fhnV0LambdaInJetsDaughterEtaPtPtMCGen[i] = 0;
7495a67b 531 fhnV0LambdaInJetsDaughterEtaPtPtMCRec[i] = 0;
7729cc34 532// fhnV0ALambdaInclDaughterEtaPtPtMCGen[i] = 0;
7495a67b 533 fhnV0ALambdaInclDaughterEtaPtPtMCRec[i] = 0;
7729cc34 534// fhnV0ALambdaInJetsDaughterEtaPtPtMCGen[i] = 0;
7495a67b 535 fhnV0ALambdaInJetsDaughterEtaPtPtMCRec[i] = 0;
536
537 // Inclusive
538 fhnV0InclusiveK0s[i] = 0;
539 fhnV0InclusiveLambda[i] = 0;
540 fhnV0InclusiveALambda[i] = 0;
541 // Cones
542 fhnV0InJetK0s[i] = 0;
543 fhnV0InPerpK0s[i] = 0;
544 fhnV0InRndK0s[i] = 0;
545 fhnV0InMedK0s[i] = 0;
546 fhnV0OutJetK0s[i] = 0;
547 fhnV0NoJetK0s[i] = 0;
548 fhnV0InJetLambda[i] = 0;
549 fhnV0InPerpLambda[i] = 0;
550 fhnV0InRndLambda[i] = 0;
551 fhnV0InMedLambda[i] = 0;
552 fhnV0OutJetLambda[i] = 0;
553 fhnV0NoJetLambda[i] = 0;
554 fhnV0InJetALambda[i] = 0;
555 fhnV0InPerpALambda[i] = 0;
556 fhnV0InRndALambda[i] = 0;
557 fhnV0InMedALambda[i] = 0;
558 fhnV0OutJetALambda[i] = 0;
559 fhnV0NoJetALambda[i] = 0;
560
561 fh2V0PtJetAngleK0s[i] = 0;
562 fh2V0PtJetAngleLambda[i] = 0;
563 fh2V0PtJetAngleALambda[i] = 0;
564 fh1DCAInK0s[i] = 0;
565 fh1DCAInLambda[i] = 0;
566 fh1DCAInALambda[i] = 0;
567 fh1DCAOutK0s[i] = 0;
568 fh1DCAOutLambda[i] = 0;
569 fh1DCAOutALambda[i] = 0;
570// fh1DeltaZK0s[i] = 0;
571// fh1DeltaZLambda[i] = 0;
572// fh1DeltaZALambda[i] = 0;
573
574 fh1PtJet[i] = 0;
575 fh1EtaJet[i] = 0;
576 fh2EtaPtJet[i] = 0;
577 fh1PhiJet[i] = 0;
578 fh1NJetPerEvent[i] = 0;
579 fh2EtaPhiRndCone[i] = 0;
580 fh2EtaPhiMedCone[i] = 0;
581
582 fh1VtxZ[i] = 0;
583 fh2VtxXY[i] = 0;
584 }
7729cc34 585 // Define input and output slots here
586 // Input slot #0 works with a TChain
587 DefineInput(0, TChain::Class());
588 // Output slot #0 id reserved by the base class for AOD
589 // Output slot #1 writes into a TList container
590 DefineOutput(1, TList::Class());
591 DefineOutput(2, TList::Class());
592 DefineOutput(3, TList::Class());
593 DefineOutput(4, TList::Class());
594 DefineOutput(5, TTree::Class());
595}
596
597AliAnalysisTaskV0sInJets::~AliAnalysisTaskV0sInJets()
598{
7495a67b 599/*
600 if (fBranchV0Rec)
601 fBranchV0Rec->Delete();
602 delete fBranchV0Rec;
603 fBranchV0Rec = 0;
604 if (fBranchV0Gen)
605 fBranchV0Gen->Delete();
606 delete fBranchV0Gen;
607 fBranchV0Gen = 0;
608 if (fBranchJet)
609 fBranchJet->Delete();
610 delete fBranchJet;
611 fBranchJet = 0;
612 if (fEventInfo)
613 fEventInfo->Delete();
614 delete fEventInfo;
615 fEventInfo = 0;
616*/
7729cc34 617 delete fRandom;
618 fRandom = 0;
619}
620
621void AliAnalysisTaskV0sInJets::UserCreateOutputObjects()
622{
623 // Create histograms
624 // Called once
625
626 fRandom = new TRandom3(0);
627
7495a67b 628/*
629 if (!fBranchV0Rec && fbTreeOutput)
630 {
631// fBranchV0Rec = new TClonesArray("AliAODv0",0);
632 fBranchV0Rec = new TClonesArray("AliV0Object",0);
633 fBranchV0Rec->SetName("branch_V0Rec");
634 }
635 if (!fBranchV0Gen && fbTreeOutput)
636 {
637 fBranchV0Gen = new TClonesArray("AliAODMCParticle",0);
638 fBranchV0Gen->SetName("branch_V0Gen");
639 }
640 if (!fBranchJet && fbTreeOutput)
641 {
642// fBranchJet = new TClonesArray("AliAODJet",0);
643 fBranchJet = new TClonesArray("AliJetObject",0);
644 fBranchJet->SetName("branch_Jet");
645 }
646 if (!fEventInfo && fbTreeOutput)
7729cc34 647 {
7495a67b 648 fEventInfo = new AliEventInfoObject();
649 fEventInfo->SetName("eventInfo");
7729cc34 650 }
7495a67b 651 Int_t dSizeBuffer = 32000; // default 32000
652 if (fbTreeOutput)
653 {
654 ftreeOut = new TTree("treeV0","Tree V0");
655 ftreeOut->Branch("branch_V0Rec",&fBranchV0Rec,dSizeBuffer,2);
656 ftreeOut->Branch("branch_V0Gen",&fBranchV0Gen,dSizeBuffer,2);
657 ftreeOut->Branch("branch_Jet",&fBranchJet,dSizeBuffer,2);
658 ftreeOut->Branch("eventInfo",&fEventInfo,dSizeBuffer,2);
659 }
660*/
7729cc34 661
662 fOutputListStd = new TList();
663 fOutputListStd->SetOwner();
664 fOutputListQA = new TList();
665 fOutputListQA->SetOwner();
666 fOutputListCuts = new TList();
667 fOutputListCuts->SetOwner();
668 fOutputListMC = new TList();
669 fOutputListMC->SetOwner();
670
671 // event categories
672 const Int_t iNCategEvent = 6;
7495a67b 673 TString categEvent[iNCategEvent] = {"coll. candid.", "AOD OK", "vtx & cent", "with V0", "with jets", "jet selection"};
7729cc34 674 // labels for stages of V0 selection
7495a67b 675 TString categV0[fgkiNCategV0] = {"all"/*0*/, "mass range"/*1*/, "rec. method"/*2*/, "tracks TPC"/*3*/, "track pt"/*4*/, "DCA prim v"/*5*/, "DCA daughters"/*6*/, "CPA"/*7*/, "volume"/*8*/, "track #it{#eta}"/*9*/, "V0 #it{y} & #it{#eta}"/*10*/, "lifetime"/*11*/, "PID"/*12*/, "Arm.-Pod."/*13*/, "inclusive"/*14*/, "in jet event"/*15*/, "in jet"/*16*/};
676
677 fh1EventCounterCut = new TH1D("fh1EventCounterCut", "Number of events after filtering;selection filter;counts", iNCategEvent, 0, iNCategEvent);
678 for(Int_t i = 0; i < iNCategEvent; i++)
679 fh1EventCounterCut->GetXaxis()->SetBinLabel(i + 1, categEvent[i].Data());
680 fh1EventCent2 = new TH1D("fh1EventCent2", "Number of events vs centrality;centrality;counts", 100, 0, 100);
681 fh1EventCent2Jets = new TH1D("fh1EventCent2Jets", "Number of sel.-jet events vs centrality;centrality;counts", 100, 0, 100);
682 fh1EventCent2NoJets = new TH1D("fh1EventCent2NoJets", "Number of no-jet events vs centrality;centrality;counts", 100, 0, 100);
683 fh2EventCentTracks = new TH2D("fh2EventCentTracks", "Number of tracks vs centrality;centrality;tracks;counts", 100, 0, 100, 150, 0, 15e3);
684 fh1EventCent = new TH1D("fh1EventCent", "Number of events in centrality bins;centrality;counts", fgkiNBinsCent, 0, fgkiNBinsCent);
685 for(Int_t i = 0; i < fgkiNBinsCent; i++)
686 fh1EventCent->GetXaxis()->SetBinLabel(i + 1, GetCentBinLabel(i).Data());
687 fh1NRndConeCent = new TH1D("fh1NRndConeCent", "Number of rnd. cones in centrality bins;centrality;counts", fgkiNBinsCent, 0, fgkiNBinsCent);
688 for(Int_t i = 0; i < fgkiNBinsCent; i++)
689 fh1NRndConeCent->GetXaxis()->SetBinLabel(i + 1, GetCentBinLabel(i).Data());
690 fh1NMedConeCent = new TH1D("fh1NMedConeCent", "Number of med.-cl. cones in centrality bins;centrality;counts", fgkiNBinsCent, 0, fgkiNBinsCent);
691 for(Int_t i = 0; i < fgkiNBinsCent; i++)
692 fh1NMedConeCent->GetXaxis()->SetBinLabel(i + 1, GetCentBinLabel(i).Data());
693 fh1AreaExcluded = new TH1D("fh1AreaExcluded", "Area of excluded cones in centrality bins;centrality;area", fgkiNBinsCent, 0, fgkiNBinsCent);
694 for(Int_t i = 0; i < fgkiNBinsCent; i++)
695 fh1AreaExcluded->GetXaxis()->SetBinLabel(i + 1, GetCentBinLabel(i).Data());
7729cc34 696 fOutputListStd->Add(fh1EventCounterCut);
697 fOutputListStd->Add(fh1EventCent);
698 fOutputListStd->Add(fh1EventCent2);
169867f8 699 fOutputListStd->Add(fh1EventCent2Jets);
700 fOutputListStd->Add(fh1EventCent2NoJets);
7729cc34 701 fOutputListStd->Add(fh1NRndConeCent);
9706bde3 702 fOutputListStd->Add(fh1NMedConeCent);
7729cc34 703 fOutputListStd->Add(fh1AreaExcluded);
704 fOutputListStd->Add(fh2EventCentTracks);
705
7495a67b 706 fh1V0CandPerEvent = new TH1D("fh1V0CandPerEvent", "Number of all V0 candidates per event;candidates;events", 1000, 0, 1000);
7729cc34 707 fOutputListStd->Add(fh1V0CandPerEvent);
708
7495a67b 709 for(Int_t i = 0; i < fgkiNBinsCent; i++)
710 {
711 fh1EventCounterCutCent[i] = new TH1D(Form("fh1EventCounterCutCent_%d", i), Form("Number of events after filtering, cent %s;selection filter;counts", GetCentBinLabel(i).Data()), iNCategEvent, 0, iNCategEvent);
712 for(Int_t j = 0; j < iNCategEvent; j++)
713 fh1EventCounterCutCent[i]->GetXaxis()->SetBinLabel(j + 1, categEvent[j].Data());
714 fh1V0CandPerEventCentK0s[i] = new TH1D(Form("fh1V0CandPerEventCentK0s_%d", i), Form("Number of selected K0s candidates per event, cent %s;candidates;events", GetCentBinLabel(i).Data()), 100, 0, 100);
715 fh1V0CandPerEventCentLambda[i] = new TH1D(Form("fh1V0CandPerEventCentLambda_%d", i), Form("Number of selected Lambda candidates per event, cent %s;candidates;events", GetCentBinLabel(i).Data()), 100, 0, 100);
716 fh1V0CandPerEventCentALambda[i] = new TH1D(Form("fh1V0CandPerEventCentALambda_%d", i), Form("Number of selected ALambda candidates per event, cent %s;candidates;events", GetCentBinLabel(i).Data()), 100, 0, 100);
717 fh1V0CounterCentK0s[i] = new TH1D(Form("fh1V0CounterCentK0s_%d", i), Form("Number of K0s candidates after cuts, cent %s;cut;counts", GetCentBinLabel(i).Data()), fgkiNCategV0, 0, fgkiNCategV0);
718 fh1V0CounterCentLambda[i] = new TH1D(Form("fh1V0CounterCentLambda_%d", i), Form("Number of Lambda candidates after cuts, cent %s;cut;counts", GetCentBinLabel(i).Data()), fgkiNCategV0, 0, fgkiNCategV0);
719 fh1V0CounterCentALambda[i] = new TH1D(Form("fh1V0CounterCentALambda_%d", i), Form("Number of ALambda candidates after cuts, cent %s;cut;counts", GetCentBinLabel(i).Data()), fgkiNCategV0, 0, fgkiNCategV0);
720 for(Int_t j = 0; j < fgkiNCategV0; j++)
7729cc34 721 {
7495a67b 722 fh1V0CounterCentK0s[i]->GetXaxis()->SetBinLabel(j + 1, categV0[j].Data());
723 fh1V0CounterCentLambda[i]->GetXaxis()->SetBinLabel(j + 1, categV0[j].Data());
724 fh1V0CounterCentALambda[i]->GetXaxis()->SetBinLabel(j + 1, categV0[j].Data());
7729cc34 725 }
7495a67b 726 fOutputListStd->Add(fh1EventCounterCutCent[i]);
727 fOutputListStd->Add(fh1V0CandPerEventCentK0s[i]);
728 fOutputListStd->Add(fh1V0CandPerEventCentLambda[i]);
729 fOutputListStd->Add(fh1V0CandPerEventCentALambda[i]);
730 fOutputListStd->Add(fh1V0CounterCentK0s[i]);
731 fOutputListStd->Add(fh1V0CounterCentLambda[i]);
732 fOutputListStd->Add(fh1V0CounterCentALambda[i]);
733 }
7729cc34 734 // pt binning for V0 and jets
735 Int_t iNBinsPtV0 = fgkiNBinsPtV0Init;
87e23d3e 736 Double_t dPtV0Min = fgkdBinsPtV0[0];
737 Double_t dPtV0Max = fgkdBinsPtV0[fgkiNBinsPtV0];
7729cc34 738 Int_t iNJetPtBins = fgkiNBinsPtJetInit;
87e23d3e 739 Double_t dJetPtMin = fgkdBinsPtJet[0];
740 Double_t dJetPtMax = fgkdBinsPtJet[fgkiNBinsPtJet];
7729cc34 741
7495a67b 742 fh2CCK0s = new TH2D("fh2CCK0s", "K0s candidates in Lambda peak", fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax, iNBinsPtV0, dPtV0Min, dPtV0Max);
743 fh2CCLambda = new TH2D("fh2CCLambda", "Lambda candidates in K0s peak", fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax, iNBinsPtV0, dPtV0Min, dPtV0Max);
7729cc34 744 Int_t binsCorrel[3] = {fgkiNBinsMassK0s, fgkiNBinsMassLambda, iNBinsPtV0};
87e23d3e 745 Double_t xminCorrel[3] = {fgkdMassK0sMin, fgkdMassLambdaMin, dPtV0Min};
746 Double_t xmaxCorrel[3] = {fgkdMassK0sMax, fgkdMassLambdaMax, dPtV0Max};
7729cc34 747// Int_t binsCorrel[3] = {200, 200, iNBinsPtV0};
87e23d3e 748// Double_t xminCorrel[3] = {0, 0, dPtV0Min};
749// Double_t xmaxCorrel[3] = {2, 2, dPtV0Max};
7495a67b 750 fh3CCMassCorrelBoth = new THnSparseD("fh3CCMassCorrelBoth", "Mass correlation: K0S && Lambda;m K0S;m Lambda;pT", 3, binsCorrel, xminCorrel, xmaxCorrel);
751 fh3CCMassCorrelKNotL = new THnSparseD("fh3CCMassCorrelKNotL", "Mass correlation: K0S, not Lambda;m K0S;m Lambda;pT", 3, binsCorrel, xminCorrel, xmaxCorrel);
752 fh3CCMassCorrelLNotK = new THnSparseD("fh3CCMassCorrelLNotK", "Mass correlation: Lambda, not K0S;m K0S;m Lambda;pT", 3, binsCorrel, xminCorrel, xmaxCorrel);
7729cc34 753 fOutputListQA->Add(fh2CCK0s);
754 fOutputListQA->Add(fh2CCLambda);
755 fOutputListQA->Add(fh3CCMassCorrelBoth);
756 fOutputListQA->Add(fh3CCMassCorrelKNotL);
757 fOutputListQA->Add(fh3CCMassCorrelLNotK);
758
87e23d3e 759 Double_t dStepEtaV0 = 0.025;
760 Double_t dRangeEtaV0Max = 0.8;
7495a67b 761 const Int_t iNBinsEtaV0 = 2 * Int_t(dRangeEtaV0Max / dStepEtaV0);
7729cc34 762 // inclusive
763 const Int_t iNDimIncl = 3;
764 Int_t binsKIncl[iNDimIncl] = {fgkiNBinsMassK0s, iNBinsPtV0, iNBinsEtaV0};
87e23d3e 765 Double_t xminKIncl[iNDimIncl] = {fgkdMassK0sMin, dPtV0Min, -dRangeEtaV0Max};
766 Double_t xmaxKIncl[iNDimIncl] = {fgkdMassK0sMax, dPtV0Max, dRangeEtaV0Max};
7729cc34 767 Int_t binsLIncl[iNDimIncl] = {fgkiNBinsMassLambda, iNBinsPtV0, iNBinsEtaV0};
87e23d3e 768 Double_t xminLIncl[iNDimIncl] = {fgkdMassLambdaMin, dPtV0Min, -dRangeEtaV0Max};
769 Double_t xmaxLIncl[iNDimIncl] = {fgkdMassLambdaMax, dPtV0Max, dRangeEtaV0Max};
7729cc34 770 // binning in jets
771 const Int_t iNDimInJC = 4;
772 Int_t binsKInJC[iNDimInJC] = {fgkiNBinsMassK0s, iNBinsPtV0, iNBinsEtaV0, iNJetPtBins};
87e23d3e 773 Double_t xminKInJC[iNDimInJC] = {fgkdMassK0sMin, dPtV0Min, -dRangeEtaV0Max, dJetPtMin};
774 Double_t xmaxKInJC[iNDimInJC] = {fgkdMassK0sMax, dPtV0Max, dRangeEtaV0Max, dJetPtMax};
7729cc34 775 Int_t binsLInJC[iNDimInJC] = {fgkiNBinsMassLambda, iNBinsPtV0, iNBinsEtaV0, iNJetPtBins};
87e23d3e 776 Double_t xminLInJC[iNDimInJC] = {fgkdMassLambdaMin, dPtV0Min, -dRangeEtaV0Max, dJetPtMin};
777 Double_t xmaxLInJC[iNDimInJC] = {fgkdMassLambdaMax, dPtV0Max, dRangeEtaV0Max, dJetPtMax};
7729cc34 778
779 // binning eff inclusive vs eta-pT
87e23d3e 780 Double_t dStepDeltaEta = 0.1;
781 Double_t dRangeDeltaEtaMax = 0.5;
7495a67b 782 const Int_t iNBinsDeltaEta = 2 * Int_t(dRangeDeltaEtaMax / dStepDeltaEta);
7729cc34 783 Int_t binsEtaK[3] = {fgkiNBinsMassK0s, iNBinsPtV0, iNBinsEtaV0};
87e23d3e 784 Double_t xminEtaK[3] = {fgkdMassK0sMin, dPtV0Min, -dRangeEtaV0Max};
785 Double_t xmaxEtaK[3] = {fgkdMassK0sMax, dPtV0Max, dRangeEtaV0Max};
7729cc34 786 Int_t binsEtaL[3] = {fgkiNBinsMassLambda, iNBinsPtV0, iNBinsEtaV0};
87e23d3e 787 Double_t xminEtaL[3] = {fgkdMassLambdaMin, dPtV0Min, -dRangeEtaV0Max};
788 Double_t xmaxEtaL[3] = {fgkdMassLambdaMax, dPtV0Max, dRangeEtaV0Max};
7729cc34 789 // binning eff in jets vs eta-pT
790 // associated
791 Int_t binsEtaKInRec[5] = {fgkiNBinsMassK0s, iNBinsPtV0, iNBinsEtaV0, iNJetPtBins, iNBinsDeltaEta};
87e23d3e 792 Double_t xminEtaKInRec[5] = {fgkdMassK0sMin, dPtV0Min, -dRangeEtaV0Max, dJetPtMin, -dRangeDeltaEtaMax};
793 Double_t xmaxEtaKInRec[5] = {fgkdMassK0sMax, dPtV0Max, dRangeEtaV0Max, dJetPtMax, dRangeDeltaEtaMax};
7729cc34 794 Int_t binsEtaLInRec[5] = {fgkiNBinsMassLambda, iNBinsPtV0, iNBinsEtaV0, iNJetPtBins, iNBinsDeltaEta};
87e23d3e 795 Double_t xminEtaLInRec[5] = {fgkdMassLambdaMin, dPtV0Min, -dRangeEtaV0Max, dJetPtMin, -dRangeDeltaEtaMax};
796 Double_t xmaxEtaLInRec[5] = {fgkdMassLambdaMax, dPtV0Max, dRangeEtaV0Max, dJetPtMax, dRangeDeltaEtaMax};
7729cc34 797 // generated
798 Int_t binsEtaInGen[4] = {iNBinsPtV0, iNBinsEtaV0, iNJetPtBins, iNBinsDeltaEta};
87e23d3e 799 Double_t xminEtaInGen[4] = {dPtV0Min, -dRangeEtaV0Max, dJetPtMin, -dRangeDeltaEtaMax};
800 Double_t xmaxEtaInGen[4] = {dPtV0Max, dRangeEtaV0Max, dJetPtMax, dRangeDeltaEtaMax};
7729cc34 801 // daughter eta: charge-etaD-ptD-etaV0-ptV0-ptJet
802 const Int_t iNDimEtaD = 6;
803 Int_t binsEtaDaughter[iNDimEtaD] = {2, 20, iNBinsPtV0, iNBinsEtaV0, iNBinsPtV0, iNJetPtBins};
87e23d3e 804 Double_t xminEtaDaughter[iNDimEtaD] = {0, -1, dPtV0Min, -dRangeEtaV0Max, dPtV0Min, dJetPtMin};
805 Double_t xmaxEtaDaughter[iNDimEtaD] = {2, 1, dPtV0Max, dRangeEtaV0Max, dPtV0Max, dJetPtMax};
7729cc34 806
7495a67b 807 for(Int_t i = 0; i < fgkiNBinsCent; i++)
808 {
809 fh1V0InvMassK0sCent[i] = new TH1D(Form("fh1V0InvMassK0sCent_%d", i), Form("K0s: V0 invariant mass, cent %s;#it{m}_{inv} (GeV/#it{c}^{2});counts", GetCentBinLabel(i).Data()), fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax);
810 fh1V0InvMassLambdaCent[i] = new TH1D(Form("fh1V0InvMassLambdaCent_%d", i), Form("Lambda: V0 invariant mass, cent %s;#it{m}_{inv} (GeV/#it{c}^{2});counts", GetCentBinLabel(i).Data()), fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax);
811 fh1V0InvMassALambdaCent[i] = new TH1D(Form("fh1V0InvMassALambdaCent_%d", i), Form("ALambda: V0 invariant mass, cent %s;#it{m}_{inv} (GeV/#it{c}^{2});counts", GetCentBinLabel(i).Data()), fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax);
812 fOutputListStd->Add(fh1V0InvMassK0sCent[i]);
813 fOutputListStd->Add(fh1V0InvMassLambdaCent[i]);
814 fOutputListStd->Add(fh1V0InvMassALambdaCent[i]);
815 // Inclusive
816 fhnV0InclusiveK0s[i] = new THnSparseD(Form("fhnV0InclusiveK0s_C%d", i), "K0s: V0 invariant mass vs pt;#it{m}_{inv} (GeV/#it{c}^{2});pt (GeV/#it{c});counts", iNDimIncl, binsKIncl, xminKIncl, xmaxKIncl);
817 fhnV0InclusiveLambda[i] = new THnSparseD(Form("fhnV0InclusiveLambda_C%d", i), "Lambda: V0 invariant mass vs pt;#it{m}_{inv} (GeV/#it{c}^{2});pt (GeV/#it{c});counts", iNDimIncl, binsLIncl, xminLIncl, xmaxLIncl);
818 fhnV0InclusiveALambda[i] = new THnSparseD(Form("fhnV0InclusiveALambda_C%d", i), "ALambda: V0 invariant mass vs pt;#it{m}_{inv} (GeV/#it{c}^{2});pt (GeV/#it{c});counts", iNDimIncl, binsLIncl, xminLIncl, xmaxLIncl);
819 fOutputListStd->Add(fhnV0InclusiveK0s[i]);
820 fOutputListStd->Add(fhnV0InclusiveLambda[i]);
821 fOutputListStd->Add(fhnV0InclusiveALambda[i]);
822 // In cones
823 fhnV0InJetK0s[i] = new THnSparseD(Form("fhnV0InJetK0s_%d", i), Form("K0s: Mass vs Pt in jets, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimInJC, binsKInJC, xminKInJC, xmaxKInJC);
824 fOutputListStd->Add(fhnV0InJetK0s[i]);
825 fhnV0InPerpK0s[i] = new THnSparseD(Form("fhnV0InPerpK0s_%d", i), Form("K0s: Mass vs Pt in perp. cones, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimInJC, binsKInJC, xminKInJC, xmaxKInJC);
826 fOutputListStd->Add(fhnV0InPerpK0s[i]);
827 fhnV0InRndK0s[i] = new THnSparseD(Form("fhnV0InRndK0s_%d", i), Form("K0s: Mass vs Pt in rnd. cones, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimIncl, binsKIncl, xminKIncl, xmaxKIncl);
828 fOutputListStd->Add(fhnV0InRndK0s[i]);
829 fhnV0InMedK0s[i] = new THnSparseD(Form("fhnV0InMedK0s_%d", i), Form("K0s: Mass vs Pt in med.-cl. cones, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimIncl, binsKIncl, xminKIncl, xmaxKIncl);
830 fOutputListStd->Add(fhnV0InMedK0s[i]);
831 fhnV0OutJetK0s[i] = new THnSparseD(Form("fhnV0OutJetK0s_%d", i), Form("K0s: Pt outside jets, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimIncl, binsKIncl, xminKIncl, xmaxKIncl);
832 fOutputListStd->Add(fhnV0OutJetK0s[i]);
833 fhnV0NoJetK0s[i] = new THnSparseD(Form("fhnV0NoJetK0s_%d", i), Form("K0s: Pt in jet-less events, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimIncl, binsKIncl, xminKIncl, xmaxKIncl);
834 fOutputListStd->Add(fhnV0NoJetK0s[i]);
835 fhnV0InJetLambda[i] = new THnSparseD(Form("fhnV0InJetLambda_%d", i), Form("Lambda: Mass vs Pt in jets, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimInJC, binsLInJC, xminLInJC, xmaxLInJC);
836 fOutputListStd->Add(fhnV0InJetLambda[i]);
837 fhnV0InPerpLambda[i] = new THnSparseD(Form("fhnV0InPerpLambda_%d", i), Form("Lambda: Mass vs Pt in perp. cones, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimInJC, binsLInJC, xminLInJC, xmaxLInJC);
838 fOutputListStd->Add(fhnV0InPerpLambda[i]);
839 fhnV0InRndLambda[i] = new THnSparseD(Form("fhnV0InRndLambda_%d", i), Form("Lambda: Mass vs Pt in rnd. cones, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimIncl, binsLIncl, xminLIncl, xmaxLIncl);
840 fOutputListStd->Add(fhnV0InRndLambda[i]);
841 fhnV0InMedLambda[i] = new THnSparseD(Form("fhnV0InMedLambda_%d", i), Form("Lambda: Mass vs Pt in med.-cl. cones, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimIncl, binsLIncl, xminLIncl, xmaxLIncl);
842 fOutputListStd->Add(fhnV0InMedLambda[i]);
843 fhnV0OutJetLambda[i] = new THnSparseD(Form("fhnV0OutJetLambda_%d", i), Form("Lambda: Pt outside jets, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimIncl, binsLIncl, xminLIncl, xmaxLIncl);
844 fOutputListStd->Add(fhnV0OutJetLambda[i]);
845 fhnV0NoJetLambda[i] = new THnSparseD(Form("fhnV0NoJetLambda_%d", i), Form("Lambda: Pt in jet-less events, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimIncl, binsLIncl, xminLIncl, xmaxLIncl);
846 fOutputListStd->Add(fhnV0NoJetLambda[i]);
847 fhnV0InJetALambda[i] = new THnSparseD(Form("fhnV0InJetALambda_%d", i), Form("ALambda: Mass vs Pt in jets, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimInJC, binsLInJC, xminLInJC, xmaxLInJC);
848 fOutputListStd->Add(fhnV0InJetALambda[i]);
849 fhnV0InPerpALambda[i] = new THnSparseD(Form("fhnV0InPerpALambda_%d", i), Form("ALambda: Mass vs Pt in perp. cones, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimInJC, binsLInJC, xminLInJC, xmaxLInJC);
850 fOutputListStd->Add(fhnV0InPerpALambda[i]);
851 fhnV0InRndALambda[i] = new THnSparseD(Form("fhnV0InRndALambda_%d", i), Form("ALambda: Mass vs Pt in rnd. cones, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimIncl, binsLIncl, xminLIncl, xmaxLIncl);
852 fOutputListStd->Add(fhnV0InRndALambda[i]);
853 fhnV0InMedALambda[i] = new THnSparseD(Form("fhnV0InMedALambda_%d", i), Form("ALambda: Mass vs Pt in med.-cl. cones, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimIncl, binsLIncl, xminLIncl, xmaxLIncl);
854 fOutputListStd->Add(fhnV0InMedALambda[i]);
855 fhnV0OutJetALambda[i] = new THnSparseD(Form("fhnV0OutJetALambda_%d", i), Form("ALambda: Pt outside jets, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimIncl, binsLIncl, xminLIncl, xmaxLIncl);
856 fOutputListStd->Add(fhnV0OutJetALambda[i]);
857 fhnV0NoJetALambda[i] = new THnSparseD(Form("fhnV0NoJetALambda_%d", i), Form("ALambda: Pt in jet-less events, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});#it{p}_{T}^{V0} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimIncl, binsLIncl, xminLIncl, xmaxLIncl);
858 fOutputListStd->Add(fhnV0NoJetALambda[i]);
859
860 fh2V0PtJetAngleK0s[i] = new TH2D(Form("fh2V0PtJetAngleK0s_%d", i), Form("K0s: #it{p}_{T}^{jet} vs angle V0-jet, cent: %s;#it{p}_{T}^{jet};#it{#alpha}", GetCentBinLabel(i).Data()), iNJetPtBins, dJetPtMin, dJetPtMax, 100, 0, fdRadiusJet + 0.1);
861 fOutputListStd->Add(fh2V0PtJetAngleK0s[i]);
862 fh2V0PtJetAngleLambda[i] = new TH2D(Form("fh2V0PtJetAngleLambda_%d", i), Form("Lambda: #it{p}_{T}^{jet} vs angle V0-jet, cent: %s;#it{p}_{T}^{jet};#it{#alpha}", GetCentBinLabel(i).Data()), iNJetPtBins, dJetPtMin, dJetPtMax, 100, 0, fdRadiusJet + 0.1);
863 fOutputListStd->Add(fh2V0PtJetAngleLambda[i]);
864 fh2V0PtJetAngleALambda[i] = new TH2D(Form("fh2V0PtJetAngleALambda_%d", i), Form("ALambda: #it{p}_{T}^{jet} vs angle V0-jet, cent: %s;#it{p}_{T}^{jet};#it{#alpha}", GetCentBinLabel(i).Data()), iNJetPtBins, dJetPtMin, dJetPtMax, 100, 0, fdRadiusJet + 0.1);
865 fOutputListStd->Add(fh2V0PtJetAngleALambda[i]);
866
867 fh1DCAInK0s[i] = new TH1D(Form("fh1DCAInK0s_%d", i), Form("K0s in jets: DCA daughters, cent %s;DCA (#sigma)", GetCentBinLabel(i).Data()), 50, 0, 1);
868 fOutputListQA->Add(fh1DCAInK0s[i]);
869 fh1DCAInLambda[i] = new TH1D(Form("fh1DCAInLambda_%d", i), Form("Lambda in jets: DCA daughters, cent %s;DCA (#sigma)", GetCentBinLabel(i).Data()), 50, 0, 1);
870 fOutputListQA->Add(fh1DCAInLambda[i]);
871 fh1DCAInALambda[i] = new TH1D(Form("fh1DCAInALambda_%d", i), Form("ALambda in jets: DCA daughters, cent %s;DCA (#sigma)", GetCentBinLabel(i).Data()), 50, 0, 1);
872 fOutputListQA->Add(fh1DCAInALambda[i]);
873
874 fh1DCAOutK0s[i] = new TH1D(Form("fh1DCAOutK0s_%d", i), Form("K0s outside jets: DCA daughters, cent %s;DCA (#sigma)", GetCentBinLabel(i).Data()), 50, 0, 1);
875 fOutputListQA->Add(fh1DCAOutK0s[i]);
876 fh1DCAOutLambda[i] = new TH1D(Form("fh1DCAOutLambda_%d", i), Form("Lambda outside jets: DCA daughters, cent %s;DCA (#sigma)", GetCentBinLabel(i).Data()), 50, 0, 1);
877 fOutputListQA->Add(fh1DCAOutLambda[i]);
878 fh1DCAOutALambda[i] = new TH1D(Form("fh1DCAOutALambda_%d", i), Form("ALambda outside jets: DCA daughters, cent %s;DCA (#sigma)", GetCentBinLabel(i).Data()), 50, 0, 1);
879 fOutputListQA->Add(fh1DCAOutALambda[i]);
880
881 /*
882 fh1DeltaZK0s[i] = new TH1D(Form("fh1DeltaZK0s_%d", i), Form("K0s: #Delta#it{z} vertices, cent %s;#it{z} (cm)", GetCentBinLabel(i).Data()), 50, -10, 10);
883 fOutputListQA->Add(fh1DeltaZK0s[i]);
884 fh1DeltaZLambda[i] = new TH1D(Form("fh1DeltaZLambda_%d", i), Form("Lambda: #Delta#it{z} vertices, cent %s;#it{z} (cm)", GetCentBinLabel(i).Data()), 50, -10, 10);
885 fOutputListQA->Add(fh1DeltaZLambda[i]);
886 fh1DeltaZALambda[i] = new TH1D(Form("fh1DeltaZALambda_%d", i), Form("ALambda: #Delta#it{z} vertices, cent %s;#it{z} (cm)", GetCentBinLabel(i).Data()), 50, -10, 10);
887 fOutputListQA->Add(fh1DeltaZALambda[i]);
888 */
889
890 // jet histograms
891 fh1PtJet[i] = new TH1D(Form("fh1PtJet_%d", i), Form("Jet pt spectrum, cent: %s;#it{p}_{T} jet (GeV/#it{c})", GetCentBinLabel(i).Data()), iNJetPtBins, dJetPtMin, dJetPtMax);
892 fOutputListStd->Add(fh1PtJet[i]);
893 fh1EtaJet[i] = new TH1D(Form("fh1EtaJet_%d", i), Form("Jet eta spectrum, cent: %s;#it{#eta} jet", GetCentBinLabel(i).Data()), 80, -1., 1.);
894 fOutputListStd->Add(fh1EtaJet[i]);
895 fh2EtaPtJet[i] = new TH2D(Form("fh2EtaPtJet_%d", i), Form("Jet eta vs pT spectrum, cent: %s;#it{#eta} jet;#it{p}_{T} jet (GeV/#it{c})", GetCentBinLabel(i).Data()), 80, -1., 1., iNJetPtBins, dJetPtMin, dJetPtMax);
896 fOutputListStd->Add(fh2EtaPtJet[i]);
897 fh2EtaPhiRndCone[i] = new TH2D(Form("fh2EtaPhiRndCone_%d", i), Form("Rnd. cones: eta vs phi, cent: %s;#it{#eta} cone;#it{#phi} cone", GetCentBinLabel(i).Data()), 80, -1., 1., 100, 0., TMath::TwoPi());
898 fOutputListStd->Add(fh2EtaPhiRndCone[i]);
899 fh2EtaPhiMedCone[i] = new TH2D(Form("fh2EtaPhiMedCone_%d", i), Form("Med.-cl. cones: eta vs phi, cent: %s;#it{#eta} cone;#it{#phi} cone", GetCentBinLabel(i).Data()), 80, -1., 1., 100, 0., TMath::TwoPi());
900 fOutputListStd->Add(fh2EtaPhiMedCone[i]);
901 fh1PhiJet[i] = new TH1D(Form("fh1PhiJet_%d", i), Form("Jet phi spectrum, cent: %s;#it{#phi} jet", GetCentBinLabel(i).Data()), 100, 0., TMath::TwoPi());
902 fOutputListStd->Add(fh1PhiJet[i]);
903 fh1NJetPerEvent[i] = new TH1D(Form("fh1NJetPerEvent_%d", i), Form("Number of selected jets per event, cent: %s;# jets;# events", GetCentBinLabel(i).Data()), 100, 0., 100.);
904 fOutputListStd->Add(fh1NJetPerEvent[i]);
905 // event histograms
906 fh1VtxZ[i] = new TH1D(Form("fh1VtxZ_%d", i), Form("#it{z} coordinate of the primary vertex, cent: %s;#it{z} (cm)", GetCentBinLabel(i).Data()), 150, -1.5 * fdCutVertexZ, 1.5 * fdCutVertexZ);
907 fOutputListQA->Add(fh1VtxZ[i]);
908 fh2VtxXY[i] = new TH2D(Form("fh2VtxXY_%d", i), Form("#it{xy} coordinate of the primary vertex, cent: %s;#it{x} (cm);#it{y} (cm)", GetCentBinLabel(i).Data()), 200, -0.2, 0.2, 500, -0.5, 0.5);
909 fOutputListQA->Add(fh2VtxXY[i]);
910 // fOutputListStd->Add([i]);
911 if(fbMCAnalysis)
7729cc34 912 {
7495a67b 913 // inclusive pt
914 fh1V0K0sPtMCGen[i] = new TH1D(Form("fh1V0K0sPtMCGen_%d", i), Form("MC K0s generated: pt spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max);
915 fOutputListMC->Add(fh1V0K0sPtMCGen[i]);
916 fh2V0K0sPtMassMCRec[i] = new TH2D(Form("fh2V0K0sPtMassMCRec_%d", i), Form("MC K0s associated: pt-m spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c});#it{m}_{inv} (GeV/#it{c}^{2})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max, fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax);
917 fOutputListMC->Add(fh2V0K0sPtMassMCRec[i]);
918 fh1V0K0sPtMCRecFalse[i] = new TH1D(Form("fh1V0K0sPtMCRecFalse_%d", i), Form("MC K0s false: pt spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max);
919 fOutputListMC->Add(fh1V0K0sPtMCRecFalse[i]);
920 // inclusive pt-eta
921 fh2V0K0sEtaPtMCGen[i] = new TH2D(Form("fh2V0K0sEtaPtMCGen_%d", i), Form("MC K0s generated: pt-eta spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c});#eta", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max, iNBinsEtaV0, -dRangeEtaV0Max, dRangeEtaV0Max);
922 fOutputListMC->Add(fh2V0K0sEtaPtMCGen[i]);
923 fh3V0K0sEtaPtMassMCRec[i] = new THnSparseD(Form("fh3V0K0sEtaPtMassMCRec_%d", i), Form("MC K0s associated: m-pt-eta spectrum, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});MC #it{p}_{T} (GeV/#it{c});#eta", GetCentBinLabel(i).Data()), 3, binsEtaK, xminEtaK, xmaxEtaK);
924 fOutputListMC->Add(fh3V0K0sEtaPtMassMCRec[i]);
925 // in jet pt
926 fh2V0K0sInJetPtMCGen[i] = new TH2D(Form("fh2V0K0sInJetPtMCGen_%d", i), Form("MC K0s in jet generated: pt-ptJet spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max, iNJetPtBins, dJetPtMin, dJetPtMax);
927 fOutputListMC->Add(fh2V0K0sInJetPtMCGen[i]);
928 fh3V0K0sInJetPtMassMCRec[i] = new THnSparseD(Form("fh3V0K0sInJetPtMassMCRec_%d", i), Form("MC K0s in jet associated: m-pt-ptJet spectrum, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});MC #it{p}_{T} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimInJC, binsKInJC, xminKInJC, xmaxKInJC);
929 fOutputListMC->Add(fh3V0K0sInJetPtMassMCRec[i]);
930 // in jet pt-eta
931 fh3V0K0sInJetEtaPtMCGen[i] = new THnSparseD(Form("fh3V0K0sInJetEtaPtMCGen_%d", i), Form("MC K0s generated: pt-eta-ptJet spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c});#eta;#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), 4, binsEtaInGen, xminEtaInGen, xmaxEtaInGen);
932 fOutputListMC->Add(fh3V0K0sInJetEtaPtMCGen[i]);
933 fh4V0K0sInJetEtaPtMassMCRec[i] = new THnSparseD(Form("fh4V0K0sInJetEtaPtMassMCRec_%d", i), Form("MC K0s associated: m-pt-eta-ptJet spectrum, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});MC #it{p}_{T} (GeV/#it{c});#eta;#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), 5, binsEtaKInRec, xminEtaKInRec, xmaxEtaKInRec);
934 fOutputListMC->Add(fh4V0K0sInJetEtaPtMassMCRec[i]);
935
936 fh2V0K0sMCResolMPt[i] = new TH2D(Form("fh2V0K0sMCResolMPt_%d", i), Form("MC K0s associated: #Delta#it{m} vs pt, cent %s;#Delta#it{m} = #it{m}_{inv} - #it{m}_{true} (GeV/#it{c}^{2});#it{p}_{T}^{rec} (GeV/#it{c})", GetCentBinLabel(i).Data()), 100, -0.02, 0.02, iNBinsPtV0, dPtV0Min, dPtV0Max);
937 fOutputListMC->Add(fh2V0K0sMCResolMPt[i]);
938 fh2V0K0sMCPtGenPtRec[i] = new TH2D(Form("fh2V0K0sMCPtGenPtRec_%d", i), Form("MC K0s associated: pt gen vs pt rec, cent %s;#it{p}_{T}^{gen} (GeV/#it{c});#it{p}_{T}^{rec} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max, iNBinsPtV0, dPtV0Min, dPtV0Max);
939 fOutputListMC->Add(fh2V0K0sMCPtGenPtRec[i]);
940
941 // inclusive pt
942 fh1V0LambdaPtMCGen[i] = new TH1D(Form("fh1V0LambdaPtMCGen_%d", i), Form("MC Lambda generated: pt spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max);
943 fOutputListMC->Add(fh1V0LambdaPtMCGen[i]);
944 fh2V0LambdaPtMassMCRec[i] = new TH2D(Form("fh2V0LambdaPtMassMCRec_%d", i), Form("MC Lambda associated: pt-m spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c});#it{m}_{inv} (GeV/#it{c}^{2})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max, fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax);
945 fOutputListMC->Add(fh2V0LambdaPtMassMCRec[i]);
946 fh1V0LambdaPtMCRecFalse[i] = new TH1D(Form("fh1V0LambdaPtMCRecFalse_%d", i), Form("MC Lambda false: pt spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max);
947 fOutputListMC->Add(fh1V0LambdaPtMCRecFalse[i]);
948 // inclusive pt-eta
949 fh2V0LambdaEtaPtMCGen[i] = new TH2D(Form("fh2V0LambdaEtaPtMCGen_%d", i), Form("MC Lambda generated: pt-eta spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c});#eta", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max, iNBinsEtaV0, -dRangeEtaV0Max, dRangeEtaV0Max);
950 fOutputListMC->Add(fh2V0LambdaEtaPtMCGen[i]);
951 fh3V0LambdaEtaPtMassMCRec[i] = new THnSparseD(Form("fh3V0LambdaEtaPtMassMCRec_%d", i), Form("MC Lambda associated: m-pt-eta spectrum, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});MC #it{p}_{T} (GeV/#it{c});#eta", GetCentBinLabel(i).Data()), 3, binsEtaL, xminEtaL, xmaxEtaL);
952 fOutputListMC->Add(fh3V0LambdaEtaPtMassMCRec[i]);
953 // in jet pt
954 fh2V0LambdaInJetPtMCGen[i] = new TH2D(Form("fh2V0LambdaInJetPtMCGen_%d", i), Form("MC Lambda in jet generated: pt-ptJet spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max, iNJetPtBins, dJetPtMin, dJetPtMax);
955 fOutputListMC->Add(fh2V0LambdaInJetPtMCGen[i]);
956 fh3V0LambdaInJetPtMassMCRec[i] = new THnSparseD(Form("fh3V0LambdaInJetPtMassMCRec_%d", i), Form("MC Lambda in jet associated: m-pt-ptJet spectrum, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});MC #it{p}_{T} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimInJC, binsLInJC, xminLInJC, xmaxLInJC);
957 fOutputListMC->Add(fh3V0LambdaInJetPtMassMCRec[i]);
958 // in jet pt-eta
959 fh3V0LambdaInJetEtaPtMCGen[i] = new THnSparseD(Form("fh3V0LambdaInJetEtaPtMCGen_%d", i), Form("MC Lambda generated: pt-eta-ptJet spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c});#eta;#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), 4, binsEtaInGen, xminEtaInGen, xmaxEtaInGen);
960 fOutputListMC->Add(fh3V0LambdaInJetEtaPtMCGen[i]);
961 fh4V0LambdaInJetEtaPtMassMCRec[i] = new THnSparseD(Form("fh4V0LambdaInJetEtaPtMassMCRec_%d", i), Form("MC Lambda associated: m-pt-eta-ptJet spectrum, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});MC #it{p}_{T} (GeV/#it{c});#eta;#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), 5, binsEtaLInRec, xminEtaLInRec, xmaxEtaLInRec);
962 fOutputListMC->Add(fh4V0LambdaInJetEtaPtMassMCRec[i]);
963
964 fh2V0LambdaMCResolMPt[i] = new TH2D(Form("fh2V0LambdaMCResolMPt_%d", i), Form("MC Lambda associated: #Delta#it{m} vs pt, cent %s;#Delta#it{m} = #it{m}_{inv} - #it{m}_{true} (GeV/#it{c}^{2});#it{p}_{T}^{rec} (GeV/#it{c})", GetCentBinLabel(i).Data()), 100, -0.02, 0.02, iNBinsPtV0, dPtV0Min, dPtV0Max);
965 fOutputListMC->Add(fh2V0LambdaMCResolMPt[i]);
966 fh2V0LambdaMCPtGenPtRec[i] = new TH2D(Form("fh2V0LambdaMCPtGenPtRec_%d", i), Form("MC Lambda associated: pt gen vs pt rec, cent %s;#it{p}_{T}^{gen} (GeV/#it{c});#it{p}_{T}^{rec} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max, iNBinsPtV0, dPtV0Min, dPtV0Max);
967 fOutputListMC->Add(fh2V0LambdaMCPtGenPtRec[i]);
968
969 // inclusive pt
970 fh1V0ALambdaPtMCGen[i] = new TH1D(Form("fh1V0ALambdaPtMCGen_%d", i), Form("MC ALambda generated: pt spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max);
971 fOutputListMC->Add(fh1V0ALambdaPtMCGen[i]);
972 fh2V0ALambdaPtMassMCRec[i] = new TH2D(Form("fh2V0ALambdaPtMassMCRec_%d", i), Form("MC ALambda associated: pt-m spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c});#it{m}_{inv} (GeV/#it{c}^{2})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max, fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax);
973 fOutputListMC->Add(fh2V0ALambdaPtMassMCRec[i]);
974 fh1V0ALambdaPtMCRecFalse[i] = new TH1D(Form("fh1V0ALambdaPtMCRecFalse_%d", i), Form("MC ALambda false: pt spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max);
975 fOutputListMC->Add(fh1V0ALambdaPtMCRecFalse[i]);
976 // inclusive pt-eta
977 fh2V0ALambdaEtaPtMCGen[i] = new TH2D(Form("fh2V0ALambdaEtaPtMCGen_%d", i), Form("MC ALambda generated: pt-eta spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c});#eta", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max, iNBinsEtaV0, -dRangeEtaV0Max, dRangeEtaV0Max);
978 fOutputListMC->Add(fh2V0ALambdaEtaPtMCGen[i]);
979 fh3V0ALambdaEtaPtMassMCRec[i] = new THnSparseD(Form("fh3V0ALambdaEtaPtMassMCRec_%d", i), Form("MC ALambda associated: m-pt-eta spectrum, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});MC #it{p}_{T} (GeV/#it{c});#eta", GetCentBinLabel(i).Data()), 3, binsEtaL, xminEtaL, xmaxEtaL);
980 fOutputListMC->Add(fh3V0ALambdaEtaPtMassMCRec[i]);
981 // in jet pt
982 fh2V0ALambdaInJetPtMCGen[i] = new TH2D(Form("fh2V0ALambdaInJetPtMCGen_%d", i), Form("MC ALambda in jet generated: pt-ptJet spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max, iNJetPtBins, dJetPtMin, dJetPtMax);
983 fOutputListMC->Add(fh2V0ALambdaInJetPtMCGen[i]);
984 fh3V0ALambdaInJetPtMassMCRec[i] = new THnSparseD(Form("fh3V0ALambdaInJetPtMassMCRec_%d", i), Form("MC ALambda in jet associated: m-pt-ptJet spectrum, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});MC #it{p}_{T} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimInJC, binsLInJC, xminLInJC, xmaxLInJC);
985 fOutputListMC->Add(fh3V0ALambdaInJetPtMassMCRec[i]);
986 // in jet pt-eta
987 fh3V0ALambdaInJetEtaPtMCGen[i] = new THnSparseD(Form("fh3V0ALambdaInJetEtaPtMCGen_%d", i), Form("MC ALambda generated: pt-eta-ptJet spectrum, cent: %s;MC #it{p}_{T} (GeV/#it{c});#eta;#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), 4, binsEtaInGen, xminEtaInGen, xmaxEtaInGen);
988 fOutputListMC->Add(fh3V0ALambdaInJetEtaPtMCGen[i]);
989 fh4V0ALambdaInJetEtaPtMassMCRec[i] = new THnSparseD(Form("fh4V0ALambdaInJetEtaPtMassMCRec_%d", i), Form("MC ALambda associated: m-pt-eta-ptJet spectrum, cent: %s;#it{m}_{inv} (GeV/#it{c}^{2});MC #it{p}_{T} (GeV/#it{c});#eta;#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), 5, binsEtaLInRec, xminEtaLInRec, xmaxEtaLInRec);
990 fOutputListMC->Add(fh4V0ALambdaInJetEtaPtMassMCRec[i]);
991
992 fh2V0ALambdaMCResolMPt[i] = new TH2D(Form("fh2V0ALambdaMCResolMPt_%d", i), Form("MC ALambda associated: #Delta#it{m} vs pt, cent %s;#Delta#it{m} = #it{m}_{inv} - #it{m}_{true} (GeV/#it{c}^{2});#it{p}_{T}^{rec} (GeV/#it{c})", GetCentBinLabel(i).Data()), 100, -0.02, 0.02, iNBinsPtV0, dPtV0Min, dPtV0Max);
993 fOutputListMC->Add(fh2V0ALambdaMCResolMPt[i]);
994 fh2V0ALambdaMCPtGenPtRec[i] = new TH2D(Form("fh2V0ALambdaMCPtGenPtRec_%d", i), Form("MC ALambda associated: pt gen vs pt rec, cent %s;#it{p}_{T}^{gen} (GeV/#it{c});#it{p}_{T}^{rec} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNBinsPtV0, dPtV0Min, dPtV0Max, iNBinsPtV0, dPtV0Min, dPtV0Max);
995 fOutputListMC->Add(fh2V0ALambdaMCPtGenPtRec[i]);
996
997 Int_t iNBinsPtXi = 80;
998 Double_t dPtXiMin = 0;
999 Double_t dPtXiMax = 8;
1000 const Int_t iNDimFD = 3;
1001 Int_t binsFD[iNDimFD] = {iNBinsPtV0, iNBinsPtXi, iNJetPtBins};
1002 Double_t xminFD[iNDimFD] = {dPtV0Min, dPtXiMin, dJetPtMin};
1003 Double_t xmaxFD[iNDimFD] = {dPtV0Max, dPtXiMax, dJetPtMax};
1004 fhnV0LambdaInclMCFD[i] = new THnSparseD(Form("fhnV0LambdaInclMCFD_%d", i), Form("MC Lambda associated, inclusive, from Xi: pt-pt, cent %s;#it{p}_{T}^{#Lambda,gen.} (GeV/#it{c});#it{p}_{T}^{#Xi,gen.} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimFD, binsFD, xminFD, xmaxFD);
1005 fOutputListMC->Add(fhnV0LambdaInclMCFD[i]);
1006 fhnV0LambdaInJetsMCFD[i] = new THnSparseD(Form("fhnV0LambdaInJetsMCFD_%d", i), Form("MC Lambda associated, in JC, from Xi: pt-pt-ptJet, cent %s;#it{p}_{T}^{#Lambda,gen.} (GeV/#it{c});#it{p}_{T}^{#Xi,gen.} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimFD, binsFD, xminFD, xmaxFD);
1007 fOutputListMC->Add(fhnV0LambdaInJetsMCFD[i]);
1008 fhnV0LambdaBulkMCFD[i] = new THnSparseD(Form("fhnV0LambdaBulkMCFD_%d", i), Form("MC Lambda associated, in no jet events, from Xi: pt-pt, cent %s;#it{p}_{T}^{#Lambda,gen.} (GeV/#it{c});#it{p}_{T}^{#Xi,gen.} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimFD, binsFD, xminFD, xmaxFD);
1009 fOutputListMC->Add(fhnV0LambdaBulkMCFD[i]);
1010 fh1V0XiPtMCGen[i] = new TH1D(Form("fh1V0XiPtMCGen_%d", i), Form("MC Xi^{-} generated: Pt spectrum, cent %s;#it{p}_{T}^{#Xi^{-},gen.} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNBinsPtXi, dPtXiMin, dPtXiMax);
1011 fOutputListMC->Add(fh1V0XiPtMCGen[i]);
1012 fhnV0ALambdaInclMCFD[i] = new THnSparseD(Form("fhnV0ALambdaInclMCFD_%d", i), Form("MC ALambda associated, from AXi: pt-pt, cent %s;#it{p}_{T}^{A#Lambda,gen.} (GeV/#it{c});#it{p}_{T}^{A#Xi,gen.} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimFD, binsFD, xminFD, xmaxFD);
1013 fOutputListMC->Add(fhnV0ALambdaInclMCFD[i]);
1014 fhnV0ALambdaInJetsMCFD[i] = new THnSparseD(Form("fhnV0ALambdaInJetsMCFD_%d", i), Form("MC ALambda associated, in JC, from AXi: pt-pt-ptJet, cent %s;#it{p}_{T}^{A#Lambda,gen.} (GeV/#it{c});#it{p}_{T}^{A#Xi,gen.} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimFD, binsFD, xminFD, xmaxFD);
1015 fOutputListMC->Add(fhnV0ALambdaInJetsMCFD[i]);
1016 fhnV0ALambdaBulkMCFD[i] = new THnSparseD(Form("fhnV0ALambdaBulkMCFD_%d", i), Form("MC ALambda associated, in no jet events, from AXi: pt-pt-ptJet, cent %s;#it{p}_{T}^{A#Lambda,gen.} (GeV/#it{c});#it{p}_{T}^{A#Xi,gen.} (GeV/#it{c});#it{p}_{T}^{jet} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNDimFD, binsFD, xminFD, xmaxFD);
1017 fOutputListMC->Add(fhnV0ALambdaBulkMCFD[i]);
1018 fh1V0AXiPtMCGen[i] = new TH1D(Form("fh1V0AXiPtMCGen_%d", i), Form("MC AXi^{-} generated: Pt spectrum, cent %s;#it{p}_{T}^{A#Xi^{-},gen.} (GeV/#it{c})", GetCentBinLabel(i).Data()), iNBinsPtXi, dPtXiMin, dPtXiMax);
1019 fOutputListMC->Add(fh1V0AXiPtMCGen[i]);
1020
1021 // daughter eta
7729cc34 1022// fhnV0K0sInclDaughterEtaPtPtMCGen[i] = new THnSparseD(Form("fhnV0K0sInclDaughterEtaPtPtMCGen_%d",i),Form("MC K0S, inclusive, gen., daughters: charge-etaD-ptD-etaV0-ptV0-ptJet, cent: %s;charge;eta daughter;pT daughter;eta V0;pT V0;pT jet",GetCentBinLabel(i).Data()),iNDimEtaD,binsEtaDaughter,xminEtaDaughter,xmaxEtaDaughter);
7495a67b 1023 fhnV0K0sInclDaughterEtaPtPtMCRec[i] = new THnSparseD(Form("fhnV0K0sInclDaughterEtaPtPtMCRec_%d", i), Form("MC K0S, inclusive, assoc., daughters: charge-etaD-ptD-etaV0-ptV0-ptJet, cent: %s;charge;eta daughter;pT daughter;eta V0;pT V0;pT jet", GetCentBinLabel(i).Data()), iNDimEtaD, binsEtaDaughter, xminEtaDaughter, xmaxEtaDaughter);
7729cc34 1024// fhnV0K0sInJetsDaughterEtaPtPtMCGen[i] = new THnSparseD(Form("fhnV0K0sInJetsDaughterEtaPtPtMCGen_%d",i),Form("MC K0S, in JC, gen., daughters: charge-etaD-ptD-etaV0-ptV0-ptJet, cent: %s;charge;eta daughter;pT daughter;eta V0;pT V0;pT jet",GetCentBinLabel(i).Data()),iNDimEtaD,binsEtaDaughter,xminEtaDaughter,xmaxEtaDaughter);
7495a67b 1025 fhnV0K0sInJetsDaughterEtaPtPtMCRec[i] = new THnSparseD(Form("fhnV0K0sInJetsDaughterEtaPtPtMCRec_%d", i), Form("MC K0S, in JC, assoc., daughters: charge-etaD-ptD-etaV0-ptV0-ptJet, cent: %s;charge;eta daughter;pT daughter;eta V0;pT V0;pT jet", GetCentBinLabel(i).Data()), iNDimEtaD, binsEtaDaughter, xminEtaDaughter, xmaxEtaDaughter);
7729cc34 1026// fhnV0LambdaInclDaughterEtaPtPtMCGen[i] = new THnSparseD(Form("fhnV0LambdaInclDaughterEtaPtPtMCGen_%d",i),Form("MC Lambda, inclusive, gen., daughters: charge-etaD-ptD-etaV0-ptV0-ptJet, cent: %s;charge;eta daughter;pT daughter;eta V0;pT V0;pT jet",GetCentBinLabel(i).Data()),iNDimEtaD,binsEtaDaughter,xminEtaDaughter,xmaxEtaDaughter);
7495a67b 1027 fhnV0LambdaInclDaughterEtaPtPtMCRec[i] = new THnSparseD(Form("fhnV0LambdaInclDaughterEtaPtPtMCRec_%d", i), Form("MC Lambda, inclusive, assoc., daughters: charge-etaD-ptD-etaV0-ptV0-ptJet, cent: %s;charge;eta daughter;pT daughter;eta V0;pT V0;pT jet", GetCentBinLabel(i).Data()), iNDimEtaD, binsEtaDaughter, xminEtaDaughter, xmaxEtaDaughter);
7729cc34 1028// fhnV0LambdaInJetsDaughterEtaPtPtMCGen[i] = new THnSparseD(Form("fhnV0LambdaInJetsDaughterEtaPtPtMCGen_%d",i),Form("MC Lambda, in JC, gen., daughters: charge-etaD-ptD-etaV0-ptV0-ptJet, cent: %s;charge;eta daughter;pT daughter;eta V0;pT V0;pT jet",GetCentBinLabel(i).Data()),iNDimEtaD,binsEtaDaughter,xminEtaDaughter,xmaxEtaDaughter);
7495a67b 1029 fhnV0LambdaInJetsDaughterEtaPtPtMCRec[i] = new THnSparseD(Form("fhnV0LambdaInJetsDaughterEtaPtPtMCRec_%d", i), Form("MC Lambda, in JC, assoc., daughters: charge-etaD-ptD-etaV0-ptV0-ptJet, cent: %s;charge;eta daughter;pT daughter;eta V0;pT V0;pT jet", GetCentBinLabel(i).Data()), iNDimEtaD, binsEtaDaughter, xminEtaDaughter, xmaxEtaDaughter);
7729cc34 1030// fhnV0ALambdaInclDaughterEtaPtPtMCGen[i] = new THnSparseD(Form("fhnV0ALambdaInclDaughterEtaPtPtMCGen_%d",i),Form("MC ALambda, inclusive, gen., daughters: charge-etaD-ptD-etaV0-ptV0-ptJet, cent: %s;charge;eta daughter;pT daughter;eta V0;pT V0;pT jet",GetCentBinLabel(i).Data()),iNDimEtaD,binsEtaDaughter,xminEtaDaughter,xmaxEtaDaughter);
7495a67b 1031 fhnV0ALambdaInclDaughterEtaPtPtMCRec[i] = new THnSparseD(Form("fhnV0ALambdaInclDaughterEtaPtPtMCRec_%d", i), Form("MC ALambda, inclusive, assoc., daughters: charge-etaD-ptD-etaV0-ptV0-ptJet, cent: %s;charge;eta daughter;pT daughter;eta V0;pT V0;pT jet", GetCentBinLabel(i).Data()), iNDimEtaD, binsEtaDaughter, xminEtaDaughter, xmaxEtaDaughter);
7729cc34 1032// fhnV0ALambdaInJetsDaughterEtaPtPtMCGen[i] = new THnSparseD(Form("fhnV0ALambdaInJetsDaughterEtaPtPtMCGen_%d",i),Form("MC ALambda, in JC, gen., daughters: charge-etaD-ptD-etaV0-ptV0-ptJet, cent: %s;charge;eta daughter;pT daughter;eta V0;pT V0;pT jet",GetCentBinLabel(i).Data()),iNDimEtaD,binsEtaDaughter,xminEtaDaughter,xmaxEtaDaughter);
7495a67b 1033 fhnV0ALambdaInJetsDaughterEtaPtPtMCRec[i] = new THnSparseD(Form("fhnV0ALambdaInJetsDaughterEtaPtPtMCRec_%d", i), Form("MC ALambda, in JC, assoc., daughters: charge-etaD-ptD-etaV0-ptV0-ptJet, cent: %s;charge;eta daughter;pT daughter;eta V0;pT V0;pT jet", GetCentBinLabel(i).Data()), iNDimEtaD, binsEtaDaughter, xminEtaDaughter, xmaxEtaDaughter);
7729cc34 1034
1035// fOutputListMC->Add(fhnV0K0sInclDaughterEtaPtPtMCGen[i]);
7495a67b 1036 fOutputListMC->Add(fhnV0K0sInclDaughterEtaPtPtMCRec[i]);
7729cc34 1037// fOutputListMC->Add(fhnV0K0sInJetsDaughterEtaPtPtMCGen[i]);
7495a67b 1038 fOutputListMC->Add(fhnV0K0sInJetsDaughterEtaPtPtMCRec[i]);
7729cc34 1039// fOutputListMC->Add(fhnV0LambdaInclDaughterEtaPtPtMCGen[i]);
7495a67b 1040 fOutputListMC->Add(fhnV0LambdaInclDaughterEtaPtPtMCRec[i]);
7729cc34 1041// fOutputListMC->Add(fhnV0LambdaInJetsDaughterEtaPtPtMCGen[i]);
7495a67b 1042 fOutputListMC->Add(fhnV0LambdaInJetsDaughterEtaPtPtMCRec[i]);
7729cc34 1043// fOutputListMC->Add(fhnV0ALambdaInclDaughterEtaPtPtMCGen[i]);
7495a67b 1044 fOutputListMC->Add(fhnV0ALambdaInclDaughterEtaPtPtMCRec[i]);
7729cc34 1045// fOutputListMC->Add(fhnV0ALambdaInJetsDaughterEtaPtPtMCGen[i]);
7495a67b 1046 fOutputListMC->Add(fhnV0ALambdaInJetsDaughterEtaPtPtMCRec[i]);
7729cc34 1047 }
7495a67b 1048 }
7729cc34 1049
1050 // QA Histograms
7495a67b 1051 for(Int_t i = 0; i < fgkiNQAIndeces; i++)
1052 {
7729cc34 1053// [i] = new TH1D(Form("%d",i),";;Counts",,,);
7495a67b 1054 fh1QAV0Status[i] = new TH1D(Form("fh1QAV0Status_%d", i), "QA: V0 status", 2, 0, 2);
1055 fh1QAV0TPCRefit[i] = new TH1D(Form("fh1QAV0TPCRefit_%d", i), "QA: TPC refit", 2, 0, 2);
1056 fh1QAV0TPCRows[i] = new TH1D(Form("fh1QAV0TPCRows_%d", i), "QA: TPC Rows", 160, 0, 160);
1057 fh1QAV0TPCFindable[i] = new TH1D(Form("fh1QAV0TPCFindable_%d", i), "QA: TPC Findable", 160, 0, 160);
1058 fh1QAV0TPCRowsFind[i] = new TH1D(Form("fh1QAV0TPCRowsFind_%d", i), "QA: TPC Rows/Findable", 100, 0, 2);
1059 fh1QAV0Eta[i] = new TH1D(Form("fh1QAV0Eta_%d", i), "QA: Daughter Eta", 200, -2, 2);
1060 fh2QAV0EtaRows[i] = new TH2D(Form("fh2QAV0EtaRows_%d", i), "QA: Daughter Eta vs TPC rows;#eta;TPC rows", 200, -2, 2, 160, 0, 160);
1061 fh2QAV0PtRows[i] = new TH2D(Form("fh2QAV0PtRows_%d", i), "QA: Daughter Pt vs TPC rows;pt;TPC rows", 100, 0, 10, 160, 0, 160);
1062 fh2QAV0PhiRows[i] = new TH2D(Form("fh2QAV0PhiRows_%d", i), "QA: Daughter Phi vs TPC rows;#phi;TPC rows", 100, 0, TMath::TwoPi(), 160, 0, 160);
1063 fh2QAV0NClRows[i] = new TH2D(Form("fh2QAV0NClRows_%d", i), "QA: Daughter NCl vs TPC rows;findable clusters;TPC rows", 100, 0, 160, 160, 0, 160);
1064 fh2QAV0EtaNCl[i] = new TH2D(Form("fh2QAV0EtaNCl_%d", i), "QA: Daughter Eta vs NCl;#eta;findable clusters", 200, -2, 2, 160, 0, 160);
1065
1066 fh2QAV0EtaPtK0sPeak[i] = new TH2D(Form("fh2QAV0EtaPtK0sPeak_%d", i), "QA: K0s: Daughter Eta vs V0 pt, peak;track eta;V0 pt", 200, -2, 2, iNBinsPtV0, dPtV0Min, dPtV0Max);
1067 fh2QAV0EtaEtaK0s[i] = new TH2D(Form("fh2QAV0EtaEtaK0s_%d", i), "QA: K0s: Eta vs Eta Daughter", 200, -2, 2, 200, -2, 2);
1068 fh2QAV0PhiPhiK0s[i] = new TH2D(Form("fh2QAV0PhiPhiK0s_%d", i), "QA: K0s: Phi vs Phi Daughter", 200, 0, TMath::TwoPi(), 200, 0, TMath::TwoPi());
1069 fh1QAV0RapK0s[i] = new TH1D(Form("fh1QAV0RapK0s_%d", i), "QA: K0s: V0 Rapidity", 200, -2, 2);
1070 fh2QAV0PtPtK0sPeak[i] = new TH2D(Form("fh2QAV0PtPtK0sPeak_%d", i), "QA: K0s: Daughter Pt vs Pt;neg pt;pos pt", 100, 0, 5, 100, 0, 5);
1071
1072 fh2QAV0EtaPtLambdaPeak[i] = new TH2D(Form("fh2QAV0EtaPtLambdaPeak_%d", i), "QA: Lambda: Daughter Eta vs V0 pt, peak;track eta;V0 pt", 200, -2, 2, iNBinsPtV0, dPtV0Min, dPtV0Max);
1073 fh2QAV0EtaEtaLambda[i] = new TH2D(Form("fh2QAV0EtaEtaLambda_%d", i), "QA: Lambda: Eta vs Eta Daughter", 200, -2, 2, 200, -2, 2);
1074 fh2QAV0PhiPhiLambda[i] = new TH2D(Form("fh2QAV0PhiPhiLambda_%d", i), "QA: Lambda: Phi vs Phi Daughter", 200, 0, TMath::TwoPi(), 200, 0, TMath::TwoPi());
1075 fh1QAV0RapLambda[i] = new TH1D(Form("fh1QAV0RapLambda_%d", i), "QA: Lambda: V0 Rapidity", 200, -2, 2);
1076 fh2QAV0PtPtLambdaPeak[i] = new TH2D(Form("fh2QAV0PtPtLambdaPeak_%d", i), "QA: Lambda: Daughter Pt vs Pt;neg pt;pos pt", 100, 0, 5, 100, 0, 5);
1077
1078 fh1QAV0Pt[i] = new TH1D(Form("fh1QAV0Pt_%d", i), "QA: Daughter Pt", 100, 0, 5);
1079 fh1QAV0Charge[i] = new TH1D(Form("fh1QAV0Charge_%d", i), "QA: V0 Charge", 3, -1, 2);
1080 fh1QAV0DCAVtx[i] = new TH1D(Form("fh1QAV0DCAVtx_%d", i), "QA: DCA daughters to primary vertex", 100, 0, 10);
1081 fh1QAV0DCAV0[i] = new TH1D(Form("fh1QAV0DCAV0_%d", i), "QA: DCA daughters", 100, 0, 2);
1082 fh1QAV0Cos[i] = new TH1D(Form("fh1QAV0Cos_%d", i), "QA: CPA", 10000, 0.9, 1);
1083 fh1QAV0R[i] = new TH1D(Form("fh1QAV0R_%d", i), "QA: R", 1500, 0, 150);
1084 fh1QACTau2D[i] = new TH1D(Form("fh1QACTau2D_%d", i), "QA: K0s: c#tau 2D;mR/pt#tau", 100, 0, 10);
1085 fh1QACTau3D[i] = new TH1D(Form("fh1QACTau3D_%d", i), "QA: K0s: c#tau 3D;mL/p#tau", 100, 0, 10);
1086
1087 fh2ArmPod[i] = new TH2D(Form("fh2ArmPod_%d", i), "Armenteros-Podolanski;#alpha;#it{p}_{T}^{Arm}", 100, -1., 1., 50, 0., 0.25);
1088 fh2ArmPodK0s[i] = new TH2D(Form("fh2ArmPodK0s_%d", i), "K0s: Armenteros-Podolanski;#alpha;#it{p}_{T}^{Arm}", 100, -1., 1., 50, 0., 0.25);
1089 fh2ArmPodLambda[i] = new TH2D(Form("fh2ArmPodLambda_%d", i), "Lambda: Armenteros-Podolanski;#alpha;#it{p}_{T}^{Arm}", 100, -1., 1., 50, 0., 0.25);
1090 fh2ArmPodALambda[i] = new TH2D(Form("fh2ArmPodALambda_%d", i), "ALambda: Armenteros-Podolanski;#alpha;#it{p}_{T}^{Arm}", 100, -1., 1., 50, 0., 0.25);
1091
1092 fOutputListQA->Add(fh1QAV0Status[i]);
1093 fOutputListQA->Add(fh1QAV0TPCRefit[i]);
1094 fOutputListQA->Add(fh1QAV0TPCRows[i]);
1095 fOutputListQA->Add(fh1QAV0TPCFindable[i]);
1096 fOutputListQA->Add(fh1QAV0TPCRowsFind[i]);
1097 fOutputListQA->Add(fh1QAV0Eta[i]);
1098 fOutputListQA->Add(fh2QAV0EtaRows[i]);
1099 fOutputListQA->Add(fh2QAV0PtRows[i]);
1100 fOutputListQA->Add(fh2QAV0PhiRows[i]);
1101 fOutputListQA->Add(fh2QAV0NClRows[i]);
1102 fOutputListQA->Add(fh2QAV0EtaNCl[i]);
1103
1104 fOutputListQA->Add(fh2QAV0EtaPtK0sPeak[i]);
1105 fOutputListQA->Add(fh2QAV0EtaEtaK0s[i]);
1106 fOutputListQA->Add(fh2QAV0PhiPhiK0s[i]);
1107 fOutputListQA->Add(fh1QAV0RapK0s[i]);
1108 fOutputListQA->Add(fh2QAV0PtPtK0sPeak[i]);
1109
1110 fOutputListQA->Add(fh2QAV0EtaPtLambdaPeak[i]);
1111 fOutputListQA->Add(fh2QAV0EtaEtaLambda[i]);
1112 fOutputListQA->Add(fh2QAV0PhiPhiLambda[i]);
1113 fOutputListQA->Add(fh1QAV0RapLambda[i]);
1114 fOutputListQA->Add(fh2QAV0PtPtLambdaPeak[i]);
1115
1116 fOutputListQA->Add(fh1QAV0Pt[i]);
1117 fOutputListQA->Add(fh1QAV0Charge[i]);
1118 fOutputListQA->Add(fh1QAV0DCAVtx[i]);
1119 fOutputListQA->Add(fh1QAV0DCAV0[i]);
1120 fOutputListQA->Add(fh1QAV0Cos[i]);
1121 fOutputListQA->Add(fh1QAV0R[i]);
1122 fOutputListQA->Add(fh1QACTau2D[i]);
1123 fOutputListQA->Add(fh1QACTau3D[i]);
1124
1125 fOutputListQA->Add(fh2ArmPod[i]);
1126 fOutputListQA->Add(fh2ArmPodK0s[i]);
1127 fOutputListQA->Add(fh2ArmPodLambda[i]);
1128 fOutputListQA->Add(fh2ArmPodALambda[i]);
1129
1130 /*
1131 fh2CutTPCRowsK0s[i] = new TH2D(Form("fh2CutTPCRowsK0s_%d", i), "Cuts: K0s: TPC Rows vs mass;#it{m}_{inv} (GeV/#it{c}^{2});TPC rows", fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax, 160, 0, 160);
1132 fh2CutTPCRowsLambda[i] = new TH2D(Form("fh2CutTPCRowsLambda_%d", i), "Cuts: Lambda: TPC Rows vs mass;#it{m}_{inv} (GeV/#it{c}^{2});TPC rows", fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax, 160, 0, 160);
1133 fh2CutPtPosK0s[i] = new TH2D(Form("fh2CutPtPosK0s_%d", i), "Cuts: K0s: Pt pos;#it{m}_{inv} (GeV/#it{c}^{2});pt pos", fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax, 100, 0, 5);
1134 fh2CutPtNegK0s[i] = new TH2D(Form("fh2CutPtNegK0s_%d", i), "Cuts: K0s: Pt neg;#it{m}_{inv} (GeV/#it{c}^{2});pt neg", fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax, 100, 0, 5);
1135 fh2CutPtPosLambda[i] = new TH2D(Form("fh2CutPtPosLambda_%d", i), "Cuts: Lambda: Pt pos;#it{m}_{inv} (GeV/#it{c}^{2});pt pos", fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax, 100, 0, 5);
1136 fh2CutPtNegLambda[i] = new TH2D(Form("fh2CutPtNegLambda_%d", i), "Cuts: Lambda: Pt neg;#it{m}_{inv} (GeV/#it{c}^{2});pt neg", fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax, 100, 0, 5);
1137 fh2CutDCAVtx[i] = new TH2D(Form("fh2CutDCAVtx_%d", i), "Cuts: DCA daughters to prim. vtx.;#it{m}_{inv} (GeV/#it{c}^{2});DCA daughter to prim. vtx. (cm)", fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax, 100, 0, 10);
1138 fh2CutDCAV0[i] = new TH2D(Form("fh2CutDCAV0_%d", i), "Cuts: DCA daughters;#it{m}_{inv} (GeV/#it{c}^{2});DCA daughters / #sigma_{TPC}", fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax, 100, 0, 2);
1139 fh2CutCos[i] = new TH2D(Form("fh2CutCos_%d", i), "Cuts: CPA;#it{m}_{inv} (GeV/#it{c}^{2});CPA", fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax, 10000, 0.9, 1);
1140 fh2CutR[i] = new TH2D(Form("fh2CutR_%d", i), "Cuts: R;#it{m}_{inv} (GeV/#it{c}^{2});R (cm)", fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax, 1500, 0, 150);
1141 fh2CutEtaK0s[i] = new TH2D(Form("fh2CutEtaK0s_%d", i), "Cuts: K0s: Eta;#it{m}_{inv} (GeV/#it{c}^{2});#eta", fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax, 200, -2, 2);
1142 fh2CutEtaLambda[i] = new TH2D(Form("fh2CutEtaLambda_%d", i), "Cuts: Lambda: Eta;#it{m}_{inv} (GeV/#it{c}^{2});#eta", fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax, 200, -2, 2);
1143 fh2CutRapK0s[i] = new TH2D(Form("fh2CutRapK0s_%d", i), "Cuts: K0s: Rapidity;#it{m}_{inv} (GeV/#it{c}^{2});y", fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax, 200, -2, 2);
1144 fh2CutRapLambda[i] = new TH2D(Form("fh2CutRapLambda_%d", i), "Cuts: Lambda: Rapidity;#it{m}_{inv} (GeV/#it{c}^{2});y", fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax, 200, -2, 2);
1145 fh2CutCTauK0s[i] = new TH2D(Form("fh2CutCTauK0s_%d", i), "Cuts: K0s: #it{c#tau};#it{m}_{inv} (GeV/#it{c}^{2});#it{mL/p#tau}", fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax, 100, 0, 10);
1146 fh2CutCTauLambda[i] = new TH2D(Form("fh2CutCTauLambda_%d", i), "Cuts: Lambda: #it{c#tau};#it{m}_{inv} (GeV/#it{c}^{2});#it{mL/p#tau}", fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax, 100, 0, 10);
1147 fh2CutPIDPosK0s[i] = new TH2D(Form("fh2CutPIDPosK0s_%d", i), "Cuts: K0s: PID pos;#it{m}_{inv} (GeV/#it{c}^{2});##sigma_{d#it{E}/d#it{x}}", fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax, 100, 0, 10);
1148 fh2CutPIDNegK0s[i] = new TH2D(Form("fh2CutPIDNegK0s_%d", i), "Cuts: K0s: PID neg;#it{m}_{inv} (GeV/#it{c}^{2});##sigma_{d#it{E}/d#it{x}}", fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax, 100, 0, 10);
1149 fh2CutPIDPosLambda[i] = new TH2D(Form("fh2CutPIDPosLambda_%d", i), "Cuts: Lambda: PID pos;#it{m}_{inv} (GeV/#it{c}^{2});##sigma_{d#it{E}/d#it{x}}", fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax, 100, 0, 10);
1150 fh2CutPIDNegLambda[i] = new TH2D(Form("fh2CutPIDNegLambda_%d", i), "Cuts: Lambda: PID neg;#it{m}_{inv} (GeV/#it{c}^{2});##sigma_{d#it{E}/d#it{x}}", fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax, 100, 0, 10);
1151 fh2Tau3DVs2D[i] = new TH2D(Form("fh2Tau3DVs2D_%d", i), "Decay 3D vs 2D;pt;3D/2D", 100, 0, 10, 200, 0.5, 1.5);
1152
1153 fOutputListCuts->Add(fh2CutTPCRowsK0s[i]);
1154 fOutputListCuts->Add(fh2CutTPCRowsLambda[i]);
1155 fOutputListCuts->Add(fh2CutPtPosK0s[i]);
1156 fOutputListCuts->Add(fh2CutPtNegK0s[i]);
1157 fOutputListCuts->Add(fh2CutPtPosLambda[i]);
1158 fOutputListCuts->Add(fh2CutPtNegLambda[i]);
1159 fOutputListCuts->Add(fh2CutDCAVtx[i]);
1160 fOutputListCuts->Add(fh2CutDCAV0[i]);
1161 fOutputListCuts->Add(fh2CutCos[i]);
1162 fOutputListCuts->Add(fh2CutR[i]);
1163 fOutputListCuts->Add(fh2CutEtaK0s[i]);
1164 fOutputListCuts->Add(fh2CutEtaLambda[i]);
1165 fOutputListCuts->Add(fh2CutRapK0s[i]);
1166 fOutputListCuts->Add(fh2CutRapLambda[i]);
1167 fOutputListCuts->Add(fh2CutCTauK0s[i]);
1168 fOutputListCuts->Add(fh2CutCTauLambda[i]);
1169 fOutputListCuts->Add(fh2CutPIDPosK0s[i]);
1170 fOutputListCuts->Add(fh2CutPIDNegK0s[i]);
1171 fOutputListCuts->Add(fh2CutPIDPosLambda[i]);
1172 fOutputListCuts->Add(fh2CutPIDNegLambda[i]);
1173 fOutputListCuts->Add(fh2Tau3DVs2D[i]);
1174 */
1175 }
1176
1177 for(Int_t i = 0; i < fgkiNCategV0; i++)
1178 {
1179 fh1V0InvMassK0sAll[i] = new TH1D(Form("fh1V0InvMassK0sAll_%d", i), Form("K0s: V0 invariant mass, %s;#it{m}_{inv} (GeV/#it{c}^{2});counts", categV0[i].Data()), fgkiNBinsMassK0s, fgkdMassK0sMin, fgkdMassK0sMax);
1180 fh1V0InvMassLambdaAll[i] = new TH1D(Form("fh1V0InvMassLambdaAll_%d", i), Form("Lambda: V0 invariant mass, %s;#it{m}_{inv} (GeV/#it{c}^{2});counts", categV0[i].Data()), fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax);
1181 fh1V0InvMassALambdaAll[i] = new TH1D(Form("fh1V0InvMassALambdaAll_%d", i), Form("ALambda: V0 invariant mass, %s;#it{m}_{inv} (GeV/#it{c}^{2});counts", categV0[i].Data()), fgkiNBinsMassLambda, fgkdMassLambdaMin, fgkdMassLambdaMax);
1182 fOutputListStd->Add(fh1V0InvMassK0sAll[i]);
1183 fOutputListStd->Add(fh1V0InvMassLambdaAll[i]);
1184 fOutputListStd->Add(fh1V0InvMassALambdaAll[i]);
1185 }
1186
1187 for(Int_t i = 0; i < fOutputListStd->GetEntries(); ++i)
1188 {
1189 TH1* h1 = dynamic_cast<TH1*>(fOutputListStd->At(i));
1190 if(h1)
7729cc34 1191 {
7495a67b 1192 h1->Sumw2();
1193 continue;
7729cc34 1194 }
7495a67b 1195 THnSparse* hn = dynamic_cast<THnSparse*>(fOutputListStd->At(i));
1196 if(hn) hn->Sumw2();
1197 }
1198 for(Int_t i = 0; i < fOutputListQA->GetEntries(); ++i)
1199 {
1200 TH1* h1 = dynamic_cast<TH1*>(fOutputListQA->At(i));
1201 if(h1)
7729cc34 1202 {
7495a67b 1203 h1->Sumw2();
1204 continue;
7729cc34 1205 }
7495a67b 1206 THnSparse* hn = dynamic_cast<THnSparse*>(fOutputListQA->At(i));
1207 if(hn) hn->Sumw2();
1208 }
1209 for(Int_t i = 0; i < fOutputListCuts->GetEntries(); ++i)
1210 {
1211 TH1* h1 = dynamic_cast<TH1*>(fOutputListCuts->At(i));
1212 if(h1)
7729cc34 1213 {
7495a67b 1214 h1->Sumw2();
1215 continue;
7729cc34 1216 }
7495a67b 1217 THnSparse* hn = dynamic_cast<THnSparse*>(fOutputListCuts->At(i));
1218 if(hn) hn->Sumw2();
1219 }
1220 for(Int_t i = 0; i < fOutputListMC->GetEntries(); ++i)
1221 {
1222 TH1* h1 = dynamic_cast<TH1*>(fOutputListMC->At(i));
1223 if(h1)
7729cc34 1224 {
7495a67b 1225 h1->Sumw2();
1226 continue;
7729cc34 1227 }
7495a67b 1228 THnSparse* hn = dynamic_cast<THnSparse*>(fOutputListMC->At(i));
1229 if(hn) hn->Sumw2();
1230 }
1231
1232 PostData(1, fOutputListStd);
1233 PostData(2, fOutputListQA);
1234 PostData(3, fOutputListCuts);
1235 PostData(4, fOutputListMC);
7729cc34 1236// if (fbTreeOutput)
1237// PostData(5,ftreeOut);
1238}
1239
7495a67b 1240void AliAnalysisTaskV0sInJets::UserExec(Option_t*)
7729cc34 1241{
1242 // Main loop, called for each event
7495a67b 1243 if(fDebug > 5) printf("TaskV0sInJets: UserExec: Start\n");
1244/*
1245 // reset branches for each event
1246 if (fBranchV0Rec)
1247 fBranchV0Rec->Clear();
1248 if (fBranchV0Gen)
1249 fBranchV0Gen->Clear();
1250 if (fBranchJet)
1251 fBranchJet->Clear();
1252 if (fEventInfo)
1253 fEventInfo->Reset();
1254*/
1255 if(!fiAODAnalysis)
7729cc34 1256 return;
1257
7495a67b 1258 if(fDebug > 2) printf("TaskV0sInJets: AOD analysis\n");
7729cc34 1259 fh1EventCounterCut->Fill(0); // all available selected events (collision candidates)
1260
7495a67b 1261 if(fDebug > 5) printf("TaskV0sInJets: UserExec: Loading AOD\n");
7729cc34 1262 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent()); // input AOD
1263 fAODOut = AODEvent(); // output AOD
7495a67b 1264 if(!fAODOut)
1265 {
1266 if(fDebug > 0) printf("TaskV0sInJets: No output AOD found\n");
1267 return;
1268 }
1269 if(!fAODIn)
1270 {
1271 if(fDebug > 0) printf("TaskV0sInJets: No input AOD found\n");
1272 return;
1273 }
1274 if(fDebug > 5) printf("TaskV0sInJets: UserExec: Loading AOD OK\n");
7729cc34 1275
1276 TClonesArray* arrayMC = 0; // array particles in the MC event
1277 AliAODMCHeader* headerMC = 0; // MC header
1278 Int_t iNTracksMC = 0; // number of MC tracks
7495a67b 1279 Double_t dPrimVtxMCX = 0., dPrimVtxMCY = 0., dPrimVtxMCZ = 0.; // position of the MC primary vertex
7729cc34 1280
1281 // Simulation info
7495a67b 1282 if(fbMCAnalysis)
1283 {
1284 arrayMC = (TClonesArray*)fAODIn->FindListObject(AliAODMCParticle::StdBranchName());
1285 if(!arrayMC)
7729cc34 1286 {
7495a67b 1287 if(fDebug > 0) printf("TaskV0sInJets: No MC array found\n");
1288 return;
1289 }
1290 if(fDebug > 5) printf("TaskV0sInJets: MC array found\n");
1291 iNTracksMC = arrayMC->GetEntriesFast();
1292 if(fDebug > 5) printf("TaskV0sInJets: There are %d MC tracks in this event\n", iNTracksMC);
7729cc34 1293// if (!iNTracksMC)
1294// return;
7495a67b 1295 headerMC = (AliAODMCHeader*)fAODIn->FindListObject(AliAODMCHeader::StdBranchName());
1296 if(!headerMC)
1297 {
1298 if(fDebug > 0) printf("TaskV0sInJets: No MC header found\n");
1299 return;
7729cc34 1300 }
7495a67b 1301 // get position of the MC primary vertex
1302 dPrimVtxMCX = headerMC->GetVtxX();
1303 dPrimVtxMCY = headerMC->GetVtxY();
1304 dPrimVtxMCZ = headerMC->GetVtxZ();
1305 }
7729cc34 1306
1307 // PID Response Task object
1308 AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
1309 AliInputEventHandler* inputHandler = (AliInputEventHandler*)mgr->GetInputEventHandler();
1310 AliPIDResponse* fPIDResponse = inputHandler->GetPIDResponse();
7495a67b 1311 if(!fPIDResponse)
1312 {
1313 if(fDebug > 0) printf("TaskV0sInJets: No PID response object found\n");
1314 return;
1315 }
7729cc34 1316
1317 // AOD files are OK
1318 fh1EventCounterCut->Fill(1);
1319
1320 // Event selection
7495a67b 1321 if(!IsSelectedForJets(fAODIn, fdCutVertexZ, fdCutVertexR2, fdCutCentLow, fdCutCentHigh, 1, 0.1)) // cut on |delta z| in 2011 data between SPD vertex and nominal primary vertex
87e23d3e 1322// if (!IsSelectedForJets(fAODIn,fdCutVertexZ,fdCutVertexR2,fdCutCentLow,fdCutCentHigh)) // no need for cutting in 2010 data
7495a67b 1323 {
1324 if(fDebug > 5) printf("TaskV0sInJets: Event rejected\n");
1325 return;
1326 }
7729cc34 1327
87e23d3e 1328// fdCentrality = fAODIn->GetHeader()->GetCentrality(); // event centrality
1329 fdCentrality = fAODIn->GetHeader()->GetCentralityP()->GetCentralityPercentile("V0M"); // event centrality
7495a67b 1330 if(!fbIsPbPb)
1331 fdCentrality = 0.;
87e23d3e 1332 Int_t iCentIndex = GetCentralityBinIndex(fdCentrality); // get index of centrality bin
7495a67b 1333 if(iCentIndex < 0)
1334 {
1335 if(fDebug > 5) printf("TaskV0sInJets: Event is out of histogram range\n");
1336 return;
1337 }
7729cc34 1338 fh1EventCounterCut->Fill(2); // selected events (vertex, centrality)
1339 fh1EventCounterCutCent[iCentIndex]->Fill(2);
1340
1341 UInt_t iNTracks = fAODIn->GetNumberOfTracks(); // get number of tracks in event
7495a67b 1342 if(fDebug > 5) printf("TaskV0sInJets: There are %d tracks in this event\n", iNTracks);
7729cc34 1343// if (!iNTracks)
1344// return;
1345
1346 Int_t iNV0s = fAODIn->GetNumberOfV0s(); // get the number of V0 candidates
7495a67b 1347 if(!iNV0s)
1348 {
1349 if(fDebug > 2) printf("TaskV0sInJets: No V0s found in event\n");
7729cc34 1350// return;
7495a67b 1351 }
7729cc34 1352
7495a67b 1353 //===== Event is OK for the analysis =====
7729cc34 1354 fh1EventCent->Fill(iCentIndex);
87e23d3e 1355 fh1EventCent2->Fill(fdCentrality);
7495a67b 1356 fh2EventCentTracks->Fill(fdCentrality, iNTracks);
7729cc34 1357
1358// if (fbTreeOutput)
1359// fEventInfo->SetAODEvent(fAODIn);
1360// printf("V0sInJets: EventInfo: Centrality: %f\n",fEventInfo->GetCentrality());
1361
7495a67b 1362 if(iNV0s)
1363 {
1364 fh1EventCounterCut->Fill(3); // events with V0s
1365 fh1EventCounterCutCent[iCentIndex]->Fill(3);
1366 }
7729cc34 1367
1368// Int_t iNV0SelV0Rec = 0;
1369// Int_t iNV0SelV0Gen = 0;
1370
7729cc34 1371 AliAODv0* v0 = 0; // pointer to V0 candidates
1372// AliV0Object* objectV0 = 0;
1373 TVector3 vecV0Momentum; // 3D vector of V0 momentum
87e23d3e 1374 Double_t dMassV0K0s = 0; // invariant mass of the K0s candidate
1375 Double_t dMassV0Lambda = 0; // invariant mass of the Lambda candidate
1376 Double_t dMassV0ALambda = 0; // invariant mass of the Lambda candidate
7729cc34 1377 Int_t iNV0CandTot = 0; // counter of all V0 candidates at the beginning
1378 Int_t iNV0CandK0s = 0; // counter of K0s candidates at the end
1379 Int_t iNV0CandLambda = 0; // counter of Lambda candidates at the end
1380 Int_t iNV0CandALambda = 0; // counter of Lambda candidates at the end
1381
1382 Bool_t bUseOldCuts = 0; // old reconstruction cuts
1383 Bool_t bUseAliceCuts = 0; // cuts used by Alice Zimmermann
1384 Bool_t bUseIouriCuts = 0; // cuts used by Iouri
87e23d3e 1385 Bool_t bPrintCuts = 0; // print out which cuts are applied
7729cc34 1386 Bool_t bPrintJetSelection = 0; // print out which jets are selected
1387
1388 // Values of V0 reconstruction cuts:
1389 // Daughter tracks
1390 Int_t iRefit = AliAODTrack::kTPCrefit; // TPC refit for daughter tracks
87e23d3e 1391 Double_t dDCAToPrimVtxMin = fdCutDCAToPrimVtxMin; // 0.1; // [cm] min DCA of daughters to the prim vtx
1392 Double_t dDCADaughtersMax = fdCutDCADaughtersMax; // 1.; // [sigma of TPC tracking] max DCA between daughters
1393 Double_t dEtaDaughterMax = 0.8; // max |pseudorapidity| of daughter tracks
1394 Double_t dNSigmadEdxMax = fdCutNSigmadEdxMax;// 3.; // [sigma dE/dx] max difference between measured and expected signal of dE/dx in the TPC
1395 Double_t dPtProtonPIDMax = 1.; // [GeV/c] maxium pT of proton for applying PID cut
7729cc34 1396 // V0 candidate
1397 Bool_t bOnFly = 0; // on-the-fly (yes) or offline (no) reconstructed
87e23d3e 1398 Double_t dCPAMin = fdCutCPAMin;// 0.998; // min cosine of the pointing angle
1399 Double_t dRadiusDecayMin = 5.; // [cm] min radial distance of the decay vertex
1400 Double_t dRadiusDecayMax = 100.; // [cm] max radial distance of the decay vertex
1401 Double_t dEtaMax = 0.7; // max |pseudorapidity| of V0
1402 Double_t dNTauMax = fdCutNTauMax; // 5.0; // [tau] max proper lifetime in multiples of the mean lifetime
7729cc34 1403
1404 // Old cuts Start
87e23d3e 1405 Double_t dNCrossedRowsTPCMin = 70.; // min number of crossed TPC rows (turned off)
1406// Double_t dCrossedRowsOverFindMin = 0.8; // min ratio crossed rows / findable clusters (turned off)
1407// Double_t dCrossedRowsOverFindMax = 1e3; // max ratio crossed rows / findable clusters (turned off)
1408 Double_t dPtDaughterMin = 0.150; // [GeV/c] min transverse momentum of daughter tracks (turned off)
1409 Double_t dRapMax = 0.75; // max |rapidity| of V0 (turned off)
7729cc34 1410 // Old cuts End
1411
1412 // Other cuts
87e23d3e 1413 Double_t dNSigmaMassMax = 3.; // [sigma m] max difference between candidate mass and real particle mass (used only for mass peak method of signal extraction)
1414 Double_t dDistPrimaryMax = 0.01; // [cm] max distance of production point to the primary vertex (criterion for choice of MC particles considered as primary)
7729cc34 1415
1416 // Selection of active cuts
1417 Bool_t bCutEtaDaughter = 1; // daughter pseudorapidity
1418 Bool_t bCutRapV0 = 0; // V0 rapidity
1419 Bool_t bCutEtaV0 = 1; // V0 pseudorapidity
1420 Bool_t bCutTau = 1; // V0 lifetime
1421 Bool_t bCutPid = 1; // PID (TPC dE/dx)
1422 Bool_t bCutArmPod = 1; // Armenteros-Podolanski for K0S
1423// Bool_t bCutCross = 0; // cross contamination
1424
7495a67b 1425 if(bUseOldCuts)
1426 {
1427 bCutRapV0 = 1;
1428 dEtaMax = 0.75;
1429 dNTauMax = 3.0;
1430 }
1431 else if(bUseAliceCuts)
1432 {
7729cc34 1433// bOnFly = 1;
7495a67b 1434 dEtaMax = 0.75;
1435 dNTauMax = 5.0;
1436 }
1437 else if(bUseIouriCuts)
1438 {
1439 bCutRapV0 = 1;
1440 bCutEtaV0 = 0;
1441 dNTauMax = 3.0;
1442 dRapMax = 0.5;
1443 }
7729cc34 1444
87e23d3e 1445 Double_t dCTauK0s = 2.6844; // [cm] c tau of K0S
1446 Double_t dCTauLambda = 7.89; // [cm] c tau of Lambda
7729cc34 1447
1448 // Load PDG values of particle masses
87e23d3e 1449 Double_t dMassPDGK0s = TDatabasePDG::Instance()->GetParticle(kK0Short)->Mass();
1450 Double_t dMassPDGLambda = TDatabasePDG::Instance()->GetParticle(kLambda0)->Mass();
7729cc34 1451
1452 // PDG codes of used particles
1453 Int_t iPdgCodePion = 211;
1454 Int_t iPdgCodeProton = 2212;
1455 Int_t iPdgCodeK0s = 310;
1456 Int_t iPdgCodeLambda = 3122;
1457
87e23d3e 1458 // Jet selection: fdCutPtJetMin, fdCutPtTrackMin
7495a67b 1459 Double_t dJetEtaWindow = dEtaMax - fdRadiusJet; // max jet |pseudorapidity|, to make sure that V0s can appear in the entire jet area
1460 Double_t dCutJetAreaMin = 0.6 * TMath::Pi() * fdRadiusJet * fdRadiusJet; // minimum jet area
1461 Double_t dRadiusExcludeCone = 2 * fdRadiusJet; // radius of cones around jets excluded for V0 outside jets
7729cc34 1462 Bool_t bLeadingJetOnly = 0;
1463
7495a67b 1464 if(bUseAliceCuts)
1465 {
1466 fdCutPtJetMin = 5;
1467 fdCutPtTrackMin = 5;
1468 dCutJetAreaMin = 0;
1469 bLeadingJetOnly = 0;
1470 }
7729cc34 1471
1472// Int_t iNJetAll = 0; // number of reconstructed jets in fBranchJet
1473// iNJetAll = fBranchJet->GetEntriesFast(); // number of reconstructed jets
1474 TClonesArray* jetArray = 0; // object where the input jets are stored
9706bde3 1475 TClonesArray* jetArrayBg = 0; // object where the kt clusters are stored
7729cc34 1476 Int_t iNJet = 0; // number of reconstructed jets in the input
7495a67b 1477 TClonesArray* jetArraySel = new TClonesArray("AliAODJet", 0); // object where the selected jets are copied
7729cc34 1478 Int_t iNJetSel = 0; // number of selected reconstructed jets
1479// iNJetSel = jetArraySel->GetEntriesFast(); // number of selected reconstructed jets
7495a67b 1480 TClonesArray* jetArrayPerp = new TClonesArray("AliAODJet", 0); // object where the perp. cones are stored
7729cc34 1481 Int_t iNJetPerp = 0; // number of perpendicular cones
1482
1483 AliAODJet* jet = 0; // pointer to a jet
1484// AliJetObject* objectJet = 0;
1485 AliAODJet* jetPerp = 0; // pointer to a perp. cone
1486 AliAODJet* jetRnd = 0; // pointer to a rand. cone
9706bde3 1487 AliAODJet* jetMed = 0; // pointer to a median cluster
7729cc34 1488 TVector3 vecJetMomentum; // 3D vector of jet momentum
1489// TVector3 vecPerpConeMomentum; // 3D vector of perpendicular cone momentum
1490// TVector3 vecRndConeMomentum; // 3D vector of random cone momentum
1491 Bool_t bJetEventGood = kTRUE; // indicator of good jet events
1492
1493// printf("iNJetAll, iNJetSel: %d %d\n",iNJetAll,iNJetSel);
1494
7495a67b 1495 if(fbJetSelection) // analysis of V0s in jets is switched on
1496 {
1497 jetArray = (TClonesArray*)(fAODOut->FindListObject(fsJetBranchName.Data())); // find object with jets in the output AOD
1498 if(!jetArray)
1499 {
1500 if(fDebug > 0) printf("TaskV0sInJets: No array of name: %s\n", fsJetBranchName.Data());
1501 bJetEventGood = kFALSE;
1502 }
1503 if(bJetEventGood)
1504 iNJet = jetArray->GetEntriesFast();
1505 if(bJetEventGood && !iNJet) // check whether there are some jets
1506 {
1507 if(fDebug > 2) printf("TaskV0sInJets: No jets in array\n");
1508 bJetEventGood = kFALSE;
1509 }
1510 if(bJetEventGood)
7729cc34 1511 {
9706bde3 1512// printf("TaskV0sInJets: Loading bg array of name: %s\n",fsJetBgBranchName.Data());
7495a67b 1513 jetArrayBg = (TClonesArray*)(fAODOut->FindListObject(fsJetBgBranchName.Data())); // find object with jets in the output AOD
1514 if(!jetArrayBg)
1515 {
1516 if(fDebug > 0) printf("TaskV0sInJets: No bg array of name: %s\n", fsJetBgBranchName.Data());
9706bde3 1517// bJetEventGood = kFALSE;
7495a67b 1518 }
7729cc34 1519 }
7495a67b 1520 }
7729cc34 1521 else // no in-jet analysis
1522 bJetEventGood = kFALSE;
1523
1524 // select good jets and copy them to another array
7495a67b 1525 if(bJetEventGood)
1526 {
1527 if(bLeadingJetOnly)
1528 iNJet = 1; // only leading jets
1529 if(fDebug > 5) printf("TaskV0sInJets: Jet selection for %d jets\n", iNJet);
1530 for(Int_t iJet = 0; iJet < iNJet; iJet++)
7729cc34 1531 {
7495a67b 1532 AliAODJet* jetSel = (AliAODJet*)jetArray->At(iJet); // load a jet in the list
1533 if(!jetSel)
1534 {
1535 if(fDebug > 0) printf("TaskV0sInJets: Cannot load jet %d\n", iJet);
1536 continue;
1537 }
1538 if(bPrintJetSelection)
1539 if(fDebug > 7) printf("jet: i = %d, pT = %f, eta = %f, phi = %f, pt lead tr = %f ", iJet, jetSel->Pt(), jetSel->Eta(), jetSel->Phi(), jetSel->GetPtLeading());
87e23d3e 1540// printf("TaskV0sInJets: Checking pt > %.2f for jet %d with pt %.2f\n",fdCutPtJetMin,iJet,jetSel->Pt());
7495a67b 1541 if(jetSel->Pt() < fdCutPtJetMin) // selection of high-pt jets
1542 {
1543 if(bPrintJetSelection)
1544 if(fDebug > 7) printf("rejected (pt)\n");
1545 continue;
1546 }
87e23d3e 1547// printf("TaskV0sInJets: Checking |eta| < %.2f for jet %d with |eta| %.2f\n",dJetEtaWindow,iJet,TMath::Abs(jetSel->Eta()));
7495a67b 1548 if(TMath::Abs(jetSel->Eta()) > dJetEtaWindow) // selection of jets in the chosen pseudorapidity range
1549 {
1550 if(bPrintJetSelection)
1551 if(fDebug > 7) printf("rejected (eta)\n");
1552 continue;
1553 }
1554 if(!bUseOldCuts)
1555 {
1556 if(jetSel->EffectiveAreaCharged() < dCutJetAreaMin)
1557 continue;
1558 }
1559 Int_t iNTracksInJet = 0;
1560 Double_t dPtLeadTrack = 0; // pt of the leading track
7729cc34 1561// Int_t iLeadTrack = 0;
7495a67b 1562 iNTracksInJet = jetSel->GetRefTracks()->GetEntriesFast(); // number od tracks that constitute the jet
7729cc34 1563// printf("TaskV0sInJets: Searching for leading track from %d tracks in jet %d\n",iNTracksInJet,iJet);
7495a67b 1564 if(fdCutPtTrackMin > 0) // a positive min leading track pt is set
1565 {
1566 for(Int_t j = 0; j < iNTracksInJet; j++) // find the track with the highest pt
1567 {
1568 AliAODTrack* track = (AliAODTrack*)jetSel->GetTrack(j); // is this the leading track?
1569 if(!track)
1570 continue;
7729cc34 1571// printf("TaskV0sInJets: %d: %.2f\n",j,track->Pt());
7495a67b 1572 if(track->Pt() > dPtLeadTrack)
1573 {
1574 dPtLeadTrack = track->Pt();
7729cc34 1575// iLeadTrack = j;
7495a67b 1576 }
7729cc34 1577 }
7495a67b 1578// printf("Leading track pT: my: %f, ali: %f\n",dPtLeadTrack,jetSel->GetPtLeading());
1579// printf("TaskV0sInJets: Checking leading track pt > %.2f for pt %.2f of track %d in jet %d\n",fdCutPtTrackMin,dPtLeadTrack,iLeadTrack,iJet);
1580 if(dPtLeadTrack < fdCutPtTrackMin) // selection of high-pt jet-track events
7729cc34 1581 {
7495a67b 1582 if(bPrintJetSelection)
1583 if(fDebug > 7) printf("rejected (track pt)\n");
1584 continue;
7729cc34 1585 }
7495a67b 1586 }
1587 if(bPrintJetSelection)
1588 if(fDebug > 7) printf("accepted\n");
1589 if(fDebug > 5) printf("TaskV0sInJets: Jet %d with pt %.2f passed selection\n", iJet, jetSel->Pt());
1590/*
1591 if (fbTreeOutput)
1592 {
1593// new ((*fBranchJet)[iNJetAll++]) AliAODJet(*((AliAODJet*)jetSel));
1594 objectJet = new ((*fBranchJet)[iNJetAll++]) AliJetObject(jetSel); // copy selected jet to the array
1595// objectJet->SetPtLeadingTrack(dPtLeadTrack);
1596 objectJet->SetRadius(fdRadiusJet);
1597 objectJet = 0;
1598 }
1599*/
1600 TLorentzVector vecPerpPlus(*(jetSel->MomentumVector()));
1601 vecPerpPlus.RotateZ(TMath::Pi() / 2.); // rotate vector by 90 deg around z
1602 TLorentzVector vecPerpMinus(*(jetSel->MomentumVector()));
1603 vecPerpMinus.RotateZ(-TMath::Pi() / 2.); // rotate vector by -90 deg around z
1604// AliAODJet jetTmp = AliAODJet(vecPerp);
1605 if(fDebug > 5) printf("TaskV0sInJets: Adding perp. cones number %d, %d\n", iNJetPerp, iNJetPerp + 1);
1606// printf("TaskV0sInJets: Adding perp. cone number %d: pT %f, phi %f, eta %f, pT %f, phi %f, eta %f\n",iNJetSel,vecPerp.Pt(),vecPerp.Phi(),vecPerp.Eta(),jetTmp.Pt(),jetTmp.Phi(),jetTmp.Eta());
1607 new((*jetArrayPerp)[iNJetPerp++]) AliAODJet(vecPerpPlus); // write perp. cone to the array
1608 new((*jetArrayPerp)[iNJetPerp++]) AliAODJet(vecPerpMinus); // write perp. cone to the array
1609 if(fDebug > 5) printf("TaskV0sInJets: Adding jet number %d\n", iNJetSel);
1610// printf("TaskV0sInJets: Adding jet number %d: pT %f, phi %f, eta %f\n",iNJetSel,jetSel->Pt(),jetSel->Phi(),jetSel->Eta());
1611 new((*jetArraySel)[iNJetSel++]) AliAODJet(*((AliAODJet*)jetSel)); // copy selected jet to the array
7729cc34 1612 }
7495a67b 1613 if(fDebug > 5) printf("TaskV0sInJets: Added jets: %d\n", iNJetSel);
1614 iNJetSel = jetArraySel->GetEntriesFast();
1615 if(fDebug > 2) printf("TaskV0sInJets: Selected jets in array: %d\n", iNJetSel);
1616 fh1NJetPerEvent[iCentIndex]->Fill(iNJetSel);
1617 // fill jet spectra
1618 for(Int_t iJet = 0; iJet < iNJetSel; iJet++)
7729cc34 1619 {
7495a67b 1620 jet = (AliAODJet*)jetArraySel->At(iJet); // load a jet in the list
1621 fh1PtJet[iCentIndex]->Fill(jet->Pt()); // pt spectrum of selected jets
1622 fh1EtaJet[iCentIndex]->Fill(jet->Eta()); // eta spectrum of selected jets
1623 fh2EtaPtJet[iCentIndex]->Fill(jet->Eta(), jet->Pt()); // eta-pT spectrum of selected jets
1624 fh1PhiJet[iCentIndex]->Fill(jet->Phi()); // phi spectrum of selected jets
1625 Double_t dAreaExcluded = TMath::Pi() * dRadiusExcludeCone * dRadiusExcludeCone; // area of the cone
1626 dAreaExcluded -= AreaCircSegment(dRadiusExcludeCone, dEtaMax - jet->Eta()); // positive eta overhang
1627 dAreaExcluded -= AreaCircSegment(dRadiusExcludeCone, dEtaMax + jet->Eta()); // negative eta overhang
1628 fh1AreaExcluded->Fill(iCentIndex, dAreaExcluded);
7729cc34 1629 }
7495a67b 1630 jet = 0;
1631 }
1632
1633 if(bJetEventGood) // there should be some reconstructed jets
1634 {
1635 fh1EventCounterCut->Fill(4); // events with jet(s)
1636 fh1EventCounterCutCent[iCentIndex]->Fill(4); // events with jet(s)
1637 if(iNJetSel)
1638 {
1639 fh1EventCounterCut->Fill(5); // events with selected jets
1640 fh1EventCounterCutCent[iCentIndex]->Fill(5);
1641 }
1642 }
1643 if(iNJetSel)
169867f8 1644 fh1EventCent2Jets->Fill(fdCentrality);
1645 else
1646 fh1EventCent2NoJets->Fill(fdCentrality);
7729cc34 1647
7495a67b 1648 if(iNJetSel)
1649 {
1650 jetRnd = GetRandomCone(jetArraySel, dJetEtaWindow, 2 * fdRadiusJet);
1651 if(jetRnd)
7729cc34 1652 {
7495a67b 1653 fh1NRndConeCent->Fill(iCentIndex);
1654 fh2EtaPhiRndCone[iCentIndex]->Fill(jetRnd->Eta(), jetRnd->Phi());
1655 }
1656 jetMed = GetMedianCluster(jetArrayBg, dJetEtaWindow);
1657 if(jetMed)
1658 {
1659 fh1NMedConeCent->Fill(iCentIndex);
1660 fh2EtaPhiMedCone[iCentIndex]->Fill(jetMed->Eta(), jetMed->Phi());
7729cc34 1661 }
7495a67b 1662 }
7729cc34 1663
1664 // Loading primary vertex info
1665 AliAODVertex* primVtx = fAODIn->GetPrimaryVertex(); // get the primary vertex
1666 Double_t dPrimVtxPos[3]; // primary vertex position {x,y,z}
1667 primVtx->GetXYZ(dPrimVtxPos);
1668 fh1VtxZ[iCentIndex]->Fill(dPrimVtxPos[2]);
7495a67b 1669 fh2VtxXY[iCentIndex]->Fill(dPrimVtxPos[0], dPrimVtxPos[1]);
1670
1671 //===== Start of loop over V0 candidates =====
1672 if(fDebug > 2) printf("TaskV0sInJets: Start of V0 loop\n");
1673 for(Int_t iV0 = 0; iV0 < iNV0s; iV0++)
1674 {
1675 v0 = fAODIn->GetV0(iV0); // get next candidate from the list in AOD
1676 if(!v0)
1677 continue;
1678
1679 iNV0CandTot++;
1680
1681 // Initialization of status indicators
1682 Bool_t bIsCandidateK0s = kTRUE; // candidate for K0s
1683 Bool_t bIsCandidateLambda = kTRUE; // candidate for Lambda
1684 Bool_t bIsCandidateALambda = kTRUE; // candidate for Lambda
1685 Bool_t bIsInPeakK0s = kFALSE; // candidate within the K0s mass peak
1686 Bool_t bIsInPeakLambda = kFALSE; // candidate within the Lambda mass peak
1687 Bool_t bIsInConeJet = kFALSE; // candidate within the jet cones
1688 Bool_t bIsInConePerp = kFALSE; // candidate within the perpendicular cone
1689 Bool_t bIsInConeRnd = kFALSE; // candidate within the random cone
1690 Bool_t bIsInConeMed = kFALSE; // candidate within the median-cluster cone
1691 Bool_t bIsOutsideCones = kFALSE; // candidate outside excluded cones
1692
1693 // Invariant mass calculation
1694 dMassV0K0s = v0->MassK0Short();
1695 dMassV0Lambda = v0->MassLambda();
1696 dMassV0ALambda = v0->MassAntiLambda();
1697
1698 Int_t iCutIndex = 0; // indicator of current selection step
1699 // 0
1700 // All V0 candidates
1701 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
1702 iCutIndex++;
1703
1704 // Skip candidates outside the histogram range
1705 if((dMassV0K0s < fgkdMassK0sMin) || (dMassV0K0s >= fgkdMassK0sMax))
1706 bIsCandidateK0s = kFALSE;
1707 if((dMassV0Lambda < fgkdMassLambdaMin) || (dMassV0Lambda >= fgkdMassLambdaMax))
1708 bIsCandidateLambda = kFALSE;
1709 if((dMassV0ALambda < fgkdMassLambdaMin) || (dMassV0ALambda >= fgkdMassLambdaMax))
1710 bIsCandidateALambda = kFALSE;
1711 if(!bIsCandidateK0s && !bIsCandidateLambda && !bIsCandidateALambda)
1712 continue;
1713
1714 Double_t dPtV0 = TMath::Sqrt(v0->Pt2V0()); // transverse momentum of V0
1715 vecV0Momentum = TVector3(v0->Px(), v0->Py(), v0->Pz()); // set the vector of V0 momentum
1716
1717 // Sigma of the mass peak window
1718 Double_t dMassPeakWindowK0s = dNSigmaMassMax * MassPeakSigmaOld(dPtV0, 0);
1719 Double_t dMassPeakWindowLambda = dNSigmaMassMax * MassPeakSigmaOld(dPtV0, 1);
87e23d3e 1720// Double_t dMassPeakWindowK0s = dNSigmaMassMax*MassPeakSigma(iCentIndex,dPtV0,0);
1721// Double_t dMassPeakWindowLambda = dNSigmaMassMax*MassPeakSigma(iCentIndex,dPtV0,1);
7729cc34 1722
7495a67b 1723 // Invariant mass peak selection
1724 if(TMath::Abs(dMassV0K0s - dMassPDGK0s) < dMassPeakWindowK0s)
1725 bIsInPeakK0s = kTRUE;
1726 if(TMath::Abs(dMassV0Lambda - dMassPDGLambda) < dMassPeakWindowLambda)
1727 bIsInPeakLambda = kTRUE;
1728
1729 // Retrieving all relevant properties of the V0 candidate
1730 Bool_t bOnFlyStatus = v0->GetOnFlyStatus(); // online (on fly) reconstructed vs offline reconstructed
1731 const AliAODTrack* trackPos = (AliAODTrack*)v0->GetDaughter(0); // positive daughter track
1732 const AliAODTrack* trackNeg = (AliAODTrack*)v0->GetDaughter(1); // negative daughter track
1733 Double_t dPtDaughterPos = trackPos->Pt(); // transverse momentum of a daughter track
1734 Double_t dPtDaughterNeg = trackNeg->Pt();
1735 Double_t dNRowsPos = trackPos->GetTPCClusterInfo(2, 1); // crossed TPC pad rows of a daughter track
1736 Double_t dNRowsNeg = trackNeg->GetTPCClusterInfo(2, 1);
1737 Double_t dDCAToPrimVtxPos = TMath::Abs(v0->DcaPosToPrimVertex()); // dca of a daughter to the primary vertex
1738 Double_t dDCAToPrimVtxNeg = TMath::Abs(v0->DcaNegToPrimVertex());
1739 Double_t dDCADaughters = v0->DcaV0Daughters(); // dca between daughters
1740 Double_t dCPA = v0->CosPointingAngle(primVtx); // cosine of the pointing angle
1741 Double_t dSecVtxPos[3]; // V0 vertex position {x,y,z}
7729cc34 1742// Double_t dSecVtxPos[3] = {v0->DecayVertexV0X(),v0->DecayVertexV0Y(),v0->DecayVertexV0Z()}; // V0 vertex position
7495a67b 1743 v0->GetSecondaryVtx(dSecVtxPos);
1744 Double_t dRadiusDecay = TMath::Sqrt(dSecVtxPos[0] * dSecVtxPos[0] + dSecVtxPos[1] * dSecVtxPos[1]); // distance of the V0 vertex from the z-axis
1745 Double_t dEtaDaughterNeg = trackNeg->Eta(); // = v0->EtaProng(1), pseudorapidity of a daughter track
1746 Double_t dEtaDaughterPos = trackPos->Eta(); // = v0->EtaProng(0)
1747 Double_t dRapK0s = v0->RapK0Short(); // rapidity calculated for K0s assumption
1748 Double_t dRapLambda = v0->RapLambda(); // rapidity calculated for Lambda assumption
1749 Double_t dEtaV0 = v0->Eta(); // V0 pseudorapidity
87e23d3e 1750// Double_t dPhiV0 = v0->Phi(); // V0 pseudorapidity
7495a67b 1751 Double_t dDecayPath[3];
1752 for(Int_t iPos = 0; iPos < 3; iPos++)
1753 dDecayPath[iPos] = dSecVtxPos[iPos] - dPrimVtxPos[iPos]; // vector of the V0 path
1754 Double_t dDecLen = TMath::Sqrt(dDecayPath[0] * dDecayPath[0] + dDecayPath[1] * dDecayPath[1] + dDecayPath[2] * dDecayPath[2]); // path length L
1755 Double_t dDecLen2D = TMath::Sqrt(dDecayPath[0] * dDecayPath[0] + dDecayPath[1] * dDecayPath[1]); // transverse path length R
1756 Double_t dLOverP = dDecLen / v0->P(); // L/p
1757 Double_t dROverPt = dDecLen2D / dPtV0; // R/pT
1758 Double_t dMLOverPK0s = dMassPDGK0s * dLOverP; // m*L/p = c*(proper lifetime)
87e23d3e 1759// Double_t dMLOverPLambda = dMassPDGLambda*dLOverP; // m*L/p
7495a67b 1760 Double_t dMROverPtK0s = dMassPDGK0s * dROverPt; // m*R/pT
1761 Double_t dMROverPtLambda = dMassPDGLambda * dROverPt; // m*R/pT
1762 Double_t dNSigmaPosPion = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(trackPos, AliPID::kPion)); // difference between measured and expected signal of the dE/dx in the TPC
1763 Double_t dNSigmaPosProton = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(trackPos, AliPID::kProton));
1764 Double_t dNSigmaNegPion = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(trackNeg, AliPID::kPion));
1765 Double_t dNSigmaNegProton = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(trackNeg, AliPID::kProton));
1766 Double_t dAlpha = v0->AlphaV0(); // Armenteros-Podolanski alpha
1767 Double_t dPtArm = v0->PtArmV0(); // Armenteros-Podolanski pT
1768 AliAODVertex* prodVtxDaughterPos = (AliAODVertex*)(trackPos->GetProdVertex()); // production vertex of the positive daughter track
1769 Char_t cTypeVtxProdPos = prodVtxDaughterPos->GetType(); // type of the production vertex
1770 AliAODVertex* prodVtxDaughterNeg = (AliAODVertex*)(trackNeg->GetProdVertex()); // production vertex of the negative daughter track
1771 Char_t cTypeVtxProdNeg = prodVtxDaughterNeg->GetType(); // type of the production vertex
1772
1773// fh2Tau3DVs2D[0]->Fill(dPtV0, dLOverP / dROverPt);
1774
1775 // QA histograms before cuts
1776 FillQAHistogramV0(primVtx, v0, 0, bIsCandidateK0s, bIsCandidateLambda, bIsInPeakK0s, bIsInPeakLambda);
1777 // Cut vs mass histograms before cuts
1778 /*
1779 if(bIsCandidateK0s)
1780 {
1781 fh2CutTPCRowsK0s[0]->Fill(dMassV0K0s, dNRowsPos);
1782 fh2CutTPCRowsK0s[0]->Fill(dMassV0K0s, dNRowsNeg);
1783 fh2CutPtPosK0s[0]->Fill(dMassV0K0s, dPtDaughterPos);
1784 fh2CutPtNegK0s[0]->Fill(dMassV0K0s, dPtDaughterNeg);
1785 fh2CutDCAVtx[0]->Fill(dMassV0K0s, dDCAToPrimVtxPos);
1786 fh2CutDCAVtx[0]->Fill(dMassV0K0s, dDCAToPrimVtxNeg);
1787 fh2CutDCAV0[0]->Fill(dMassV0K0s, dDCADaughters);
1788 fh2CutCos[0]->Fill(dMassV0K0s, dCPA);
1789 fh2CutR[0]->Fill(dMassV0K0s, dRadiusDecay);
1790 fh2CutEtaK0s[0]->Fill(dMassV0K0s, dEtaDaughterPos);
1791 fh2CutEtaK0s[0]->Fill(dMassV0K0s, dEtaDaughterNeg);
1792 fh2CutRapK0s[0]->Fill(dMassV0K0s, dRapK0s);
1793 fh2CutCTauK0s[0]->Fill(dMassV0K0s, dMROverPtK0s / dCTauK0s);
1794 fh2CutPIDPosK0s[0]->Fill(dMassV0K0s, dNSigmaPosPion);
1795 fh2CutPIDNegK0s[0]->Fill(dMassV0K0s, dNSigmaNegPion);
1796 }
1797 if(bIsCandidateLambda)
1798 {
1799 fh2CutTPCRowsLambda[0]->Fill(dMassV0Lambda, dNRowsPos);
1800 fh2CutTPCRowsLambda[0]->Fill(dMassV0Lambda, dNRowsNeg);
1801 fh2CutPtPosLambda[0]->Fill(dMassV0Lambda, dPtDaughterPos);
1802 fh2CutPtNegLambda[0]->Fill(dMassV0Lambda, dPtDaughterNeg);
1803 fh2CutEtaLambda[0]->Fill(dMassV0Lambda, dEtaDaughterPos);
1804 fh2CutEtaLambda[0]->Fill(dMassV0Lambda, dEtaDaughterNeg);
1805 fh2CutRapLambda[0]->Fill(dMassV0Lambda, dRapLambda);
1806 fh2CutCTauLambda[0]->Fill(dMassV0Lambda, dMROverPtLambda / dCTauLambda);
1807 fh2CutPIDPosLambda[0]->Fill(dMassV0Lambda, dNSigmaPosProton);
1808 fh2CutPIDNegLambda[0]->Fill(dMassV0Lambda, dNSigmaNegPion);
1809 }
1810 */
1811
1812 //===== Start of reconstruction cutting =====
1813
1814 // 1
1815 // All V0 candidates
1816 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
1817 iCutIndex++;
1818
1819 // Start of global cuts
1820 // 2
1821 // Reconstruction method
1822 if(bPrintCuts) printf("Rec: Applying cut: Reconstruction method: on-the-fly? %s\n", (bOnFly ? "yes" : "no"));
1823 if(bOnFlyStatus != bOnFly)
1824 continue;
1825 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
1826 iCutIndex++;
1827
1828 // 3
1829 // Tracks TPC OK
1830 if(bPrintCuts) printf("Rec: Applying cut: Correct charge of daughters\n");
1831 if(!trackNeg || !trackPos)
1832 continue;
1833 if(trackNeg->Charge() == trackPos->Charge()) // daughters have different charge?
1834 continue;
1835 if(trackNeg->Charge() != -1) // daughters have expected charge?
1836 continue;
1837 if(trackPos->Charge() != 1) // daughters have expected charge?
1838 continue;
1839
1840 if(bPrintCuts) printf("Rec: Applying cut: TPC refit: %d\n", iRefit);
1841 if(!trackNeg->IsOn(iRefit)) // TPC refit is ON?
1842 continue;
1843 if(bPrintCuts) printf("Rec: Applying cut: Type of production vertex of daughter: Not %d\n", AliAODVertex::kKink);
1844 if(cTypeVtxProdNeg == AliAODVertex::kKink) // kink daughter rejection
1845 continue;
1846 // Old cuts Start
1847 if(bUseOldCuts)
1848 {
1849 if(bPrintCuts) printf("Rec: Applying cut: Number of TPC rows: > %f\n", dNCrossedRowsTPCMin);
1850 if(dNRowsNeg < dNCrossedRowsTPCMin) // Crossed TPC padrows
7729cc34 1851 continue;
7729cc34 1852// Int_t findable = trackNeg->GetTPCNclsF(); // Findable clusters
1853// if (findable <= 0)
1854// continue;
87e23d3e 1855// if (dNRowsNeg/findable < dCrossedRowsOverFindMin)
7729cc34 1856// continue;
87e23d3e 1857// if (dNRowsNeg/findable > dCrossedRowsOverFindMax)
7729cc34 1858// continue;
7495a67b 1859 }
1860 // Old cuts End
1861
1862 if(!trackPos->IsOn(iRefit))
1863 continue;
1864 if(cTypeVtxProdPos == AliAODVertex::kKink) // kink daughter rejection
1865 continue;
1866 // Old cuts Start
1867 if(bUseOldCuts)
1868 {
1869 if(dNRowsPos < dNCrossedRowsTPCMin)
7729cc34 1870 continue;
7729cc34 1871// findable = trackPos->GetTPCNclsF();
1872// if (findable <= 0)
1873// continue;
87e23d3e 1874// if (dNRowsPos/findable < dCrossedRowsOverFindMin)
7729cc34 1875// continue;
87e23d3e 1876// if (dNRowsPos/findable > dCrossedRowsOverFindMax)
7729cc34 1877// continue;
7495a67b 1878 }
1879 // Old cuts End
7729cc34 1880
7495a67b 1881 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
1882 iCutIndex++;
7729cc34 1883
7495a67b 1884 // 4
1885 // Daughters: transverse momentum cut
1886 if(bUseOldCuts)
1887 {
1888 if(bPrintCuts) printf("Rec: Applying cut: Daughter pT: > %f\n", dPtDaughterMin);
1889 if((dPtDaughterNeg < dPtDaughterMin) || (dPtDaughterPos < dPtDaughterMin))
7729cc34 1890 continue;
87e23d3e 1891 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
7495a67b 1892 }
1893 iCutIndex++;
1894
1895 // 5
1896 // Daughters: Impact parameter of daughters to prim vtx
1897 if(bPrintCuts) printf("Rec: Applying cut: Daughter DCA to prim vtx: > %f\n", dDCAToPrimVtxMin);
1898 if((dDCAToPrimVtxNeg < dDCAToPrimVtxMin) || (dDCAToPrimVtxPos < dDCAToPrimVtxMin))
1899 continue;
1900 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
1901 iCutIndex++;
1902
1903 // 6
1904 // Daughters: DCA
1905 if(bPrintCuts) printf("Rec: Applying cut: DCA between daughters: < %f\n", dDCADaughtersMax);
1906 if(dDCADaughters > dDCADaughtersMax)
1907 continue;
1908 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
1909 iCutIndex++;
1910
1911 // 7
1912 // V0: Cosine of the pointing angle
1913 if(bPrintCuts) printf("Rec: Applying cut: CPA: > %f\n", dCPAMin);
1914 if(dCPA < dCPAMin)
1915 continue;
1916 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
1917 iCutIndex++;
1918
1919 // 8
1920 // V0: Fiducial volume
1921 if(bPrintCuts) printf("Rec: Applying cut: Decay radius: > %f, < %f\n", dRadiusDecayMin, dRadiusDecayMax);
1922 if((dRadiusDecay < dRadiusDecayMin) || (dRadiusDecay > dRadiusDecayMax))
1923 continue;
1924 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
1925 iCutIndex++;
1926
1927 // 9
1928 // Daughters: pseudorapidity cut
1929 if(bCutEtaDaughter)
1930 {
1931 if(bPrintCuts) printf("Rec: Applying cut: Daughter |eta|: < %f\n", dEtaDaughterMax);
1932 if((TMath::Abs(dEtaDaughterNeg) > dEtaDaughterMax) || (TMath::Abs(dEtaDaughterPos) > dEtaDaughterMax))
7729cc34 1933 continue;
87e23d3e 1934 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
7495a67b 1935 }
1936 iCutIndex++;
1937 // End of global cuts
7729cc34 1938
7495a67b 1939 // Start of particle-dependent cuts
1940 // 10
1941 // V0: rapidity cut & pseudorapidity cut
1942 if(bCutRapV0)
1943 {
1944 if(bPrintCuts) printf("Rec: Applying cut: V0 |y|: < %f\n", dRapMax);
1945 if(TMath::Abs(dRapK0s) > dRapMax)
1946 bIsCandidateK0s = kFALSE;
1947 if(TMath::Abs(dRapLambda) > dRapMax)
1948 {
1949 bIsCandidateLambda = kFALSE;
1950 bIsCandidateALambda = kFALSE;
1951 }
1952 }
1953 if(bCutEtaV0)
1954 {
1955 if(bPrintCuts) printf("Rec: Applying cut: V0 |eta|: < %f\n", dEtaMax);
1956 if(TMath::Abs(dEtaV0) > dEtaMax)
1957 {
1958 bIsCandidateK0s = kFALSE;
1959 bIsCandidateLambda = kFALSE;
1960 bIsCandidateALambda = kFALSE;
1961 }
87e23d3e 1962 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
7495a67b 1963 }
1964 iCutIndex++;
7729cc34 1965
7495a67b 1966 // 11
1967 // Lifetime cut
1968 if(bCutTau)
1969 {
1970 if(bPrintCuts) printf("Rec: Applying cut: Proper lifetime: < %f\n", dNTauMax);
1971 if(dMROverPtK0s > dNTauMax * dCTauK0s)
1972 bIsCandidateK0s = kFALSE;
1973 if(dMROverPtLambda > dNTauMax * dCTauLambda)
1974 {
1975 bIsCandidateLambda = kFALSE;
1976 bIsCandidateALambda = kFALSE;
1977 }
87e23d3e 1978 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
7495a67b 1979 }
1980 iCutIndex++;
7729cc34 1981
7495a67b 1982 // 12
1983 // Daughter PID
1984 if(bCutPid)
1985 {
1986 if(bUseOldCuts)
1987 {
1988 if(bPrintCuts) printf("Rec: Applying cut: Delta dE/dx (both daughters): < %f\n", dNSigmadEdxMax);
1989 if(dNSigmaPosPion > dNSigmadEdxMax || dNSigmaNegPion > dNSigmadEdxMax) // pi+, pi-
1990 bIsCandidateK0s = kFALSE;
1991 if(dNSigmaPosProton > dNSigmadEdxMax || dNSigmaNegPion > dNSigmadEdxMax) // p+, pi-
1992 bIsCandidateLambda = kFALSE;
1993 if(dNSigmaNegProton > dNSigmadEdxMax || dNSigmaPosPion > dNSigmadEdxMax) // p-, pi+
1994 bIsCandidateALambda = kFALSE;
1995 }
1996 else
1997 {
1998 if(bPrintCuts) printf("Rec: Applying cut: Delta dE/dx (proton below %f GeV/c): < %f\n", dPtProtonPIDMax, dNSigmadEdxMax);
1999 if((dPtDaughterPos < dPtProtonPIDMax) && (dNSigmaPosProton > dNSigmadEdxMax)) // p+
2000 bIsCandidateLambda = kFALSE;
2001 if((dPtDaughterNeg < dPtProtonPIDMax) && (dNSigmaNegProton > dNSigmadEdxMax)) // p-
2002 bIsCandidateALambda = kFALSE;
2003 }
2004 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
2005 }
2006 iCutIndex++;
2007
2008 Double_t valueCorrel[3] = {dMassV0K0s, dMassV0Lambda, dPtV0};
2009 if(bIsCandidateK0s && bIsCandidateLambda)
2010 fh3CCMassCorrelBoth->Fill(valueCorrel); // correlation of mass distribution of candidates selected as both K0s and Lambda
2011 if(bIsCandidateK0s && !bIsCandidateLambda)
2012 fh3CCMassCorrelKNotL->Fill(valueCorrel); // correlation of mass distribution of candidates selected as K0s and not Lambda
2013 if(!bIsCandidateK0s && bIsCandidateLambda)
2014 fh3CCMassCorrelLNotK->Fill(valueCorrel); // correlation of mass distribution of candidates selected as not K0s and Lambda
2015
2016 // 13
2017 // Armenteros-Podolanski cut
2018 if(bCutArmPod)
2019 {
2020 if(bPrintCuts) printf("Rec: Applying cut: Armenteros-Podolanski (K0S): pT > %f * |alpha|\n", 0.2);
2021 if(dPtArm < TMath::Abs(0.2 * dAlpha))
2022 bIsCandidateK0s = kFALSE;
2023// if(dPtArm < 0.025)
2024// {
2025// bIsCandidateLambda = kFALSE;
2026// bIsCandidateALambda = kFALSE;
2027// }
2028 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
2029 }
2030 iCutIndex++;
7729cc34 2031
7495a67b 2032 // Cross contamination
2033 if(bIsInPeakK0s)
2034 {
2035 if(bIsCandidateLambda) // Lambda candidates in K0s peak, excluded from Lambda candidates by CC cut
2036 fh2CCLambda->Fill(dMassV0Lambda, dPtV0);
2037 }
2038 if(bIsInPeakLambda)
2039 {
2040 if(bIsCandidateK0s) // K0s candidates in Lambda peak, excluded from K0s candidates by CC cut
2041 fh2CCK0s->Fill(dMassV0K0s, dPtV0);
2042 }
7729cc34 2043// if (bCutCross)
2044// {
2045// if (bIsInPeakK0s)
2046// bIsCandidateLambda = kFALSE;
2047// if (bIsInPeakLambda)
2048// bIsCandidateK0s = kFALSE;
87e23d3e 2049// FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, bIsCandidateLambda, bIsCandidateALambda, iCutIndex, iCentIndex);
7729cc34 2050// }
2051// iCutIndex++;
2052
7495a67b 2053 // End of particle-dependent cuts
7729cc34 2054
7495a67b 2055 //===== End of reconstruction cutting =====
7729cc34 2056
7495a67b 2057 if(!bIsCandidateK0s && !bIsCandidateLambda && !bIsCandidateALambda)
2058 continue;
7729cc34 2059
7495a67b 2060/*
2061 if(fDebug>5) printf("TaskV0sInJets: Adding selected V0 to branch\n");
2062 // Add selected candidates to the output tree branch
2063 if ((bIsCandidateK0s || bIsCandidateLambda || bIsCandidateALambda) && fbTreeOutput)
2064 {
2065 objectV0 = new ((*fBranchV0Rec)[iNV0SelV0Rec++]) AliV0Object(v0,primVtx);
2066// new ((*fBranchV0Rec)[iNV0SelV0Rec++]) AliAODv0(*((AliAODv0*)v0));
2067 objectV0->SetIsCandidateK0S(bIsCandidateK0s);
2068 objectV0->SetIsCandidateLambda(bIsCandidateLambda);
2069 objectV0->SetIsCandidateALambda(bIsCandidateALambda);
2070 objectV0->SetNSigmaPosProton(dNSigmaPosProton);
2071 objectV0->SetNSigmaNegProton(dNSigmaNegProton);
2072 }
2073*/
2074
2075 // Selection of V0s in jet cones, perpendicular cones, random cones, outside cones
2076 if(bJetEventGood && iNJetSel && (bIsCandidateK0s || bIsCandidateLambda || bIsCandidateALambda))
2077 {
2078 // Selection of V0s in jet cones
2079 if(fDebug > 5) printf("TaskV0sInJets: Searching for V0 %d %d in %d jet cones\n", bIsCandidateK0s, bIsCandidateLambda, iNJetSel);
2080 for(Int_t iJet = 0; iJet < iNJetSel; iJet++)
2081 {
2082 jet = (AliAODJet*)jetArraySel->At(iJet); // load a jet in the list
2083 vecJetMomentum = TVector3(jet->Px(), jet->Py(), jet->Pz()); // set the vector of jet momentum
2084 if(fDebug > 5) printf("TaskV0sInJets: Checking if V0 %d %d in jet cone %d\n", bIsCandidateK0s, bIsCandidateLambda, iJet);
2085 if(IsParticleInCone(v0, jet, fdRadiusJet)) // If good jet in event, find out whether V0 is in that jet
7729cc34 2086 {
7495a67b 2087 if(fDebug > 5) printf("TaskV0sInJets: V0 %d %d found in jet cone %d\n", bIsCandidateK0s, bIsCandidateLambda, iJet);
2088 bIsInConeJet = kTRUE;
2089 break;
7729cc34 2090 }
7495a67b 2091 }
2092 // Selection of V0s in perp. cones
2093 if(fDebug > 5) printf("TaskV0sInJets: Searching for V0 %d %d in %d perp. cones\n", bIsCandidateK0s, bIsCandidateLambda, iNJetSel);
2094 for(Int_t iJet = 0; iJet < iNJetPerp; iJet++)
2095 {
2096 jetPerp = (AliAODJet*)jetArrayPerp->At(iJet); // load a jet in the list
2097 if(fDebug > 5) printf("TaskV0sInJets: Checking if V0 %d %d in perp. cone %d\n", bIsCandidateK0s, bIsCandidateLambda, iJet);
2098 if(IsParticleInCone(v0, jetPerp, fdRadiusJet)) // V0 in perp. cone
7729cc34 2099 {
7495a67b 2100 if(fDebug > 5) printf("TaskV0sInJets: V0 %d %d found in perp. cone %d\n", bIsCandidateK0s, bIsCandidateLambda, iJet);
2101 bIsInConePerp = kTRUE;
2102 break;
7729cc34 2103 }
7495a67b 2104 }
2105 // Selection of V0s in random cones
2106 if(jetRnd)
2107 {
2108 if(fDebug > 5) printf("TaskV0sInJets: Searching for V0 %d %d in the rnd. cone\n", bIsCandidateK0s, bIsCandidateLambda);
2109 if(IsParticleInCone(v0, jetRnd, fdRadiusJet)) // V0 in rnd. cone?
7729cc34 2110 {
7495a67b 2111 if(fDebug > 5) printf("TaskV0sInJets: V0 %d %d found in the rnd. cone\n", bIsCandidateK0s, bIsCandidateLambda);
2112 bIsInConeRnd = kTRUE;
7729cc34 2113 }
7495a67b 2114 }
2115 // Selection of V0s in median-cluster cones
2116 if(jetMed)
2117 {
2118 if(fDebug > 5) printf("TaskV0sInJets: Searching for V0 %d %d in the med. cone\n", bIsCandidateK0s, bIsCandidateLambda);
2119 if(IsParticleInCone(v0, jetMed, fdRadiusJet)) // V0 in med. cone?
7729cc34 2120 {
7495a67b 2121 if(fDebug > 5) printf("TaskV0sInJets: V0 %d %d found in the med. cone\n", bIsCandidateK0s, bIsCandidateLambda);
2122 bIsInConeMed = kTRUE;
7729cc34 2123 }
7495a67b 2124 }
2125 // Selection of V0s outside jet cones
2126 if(fDebug > 5) printf("TaskV0sInJets: Searching for V0 %d %d outside jet cones\n", bIsCandidateK0s, bIsCandidateLambda);
2127 if(!OverlapWithJets(jetArraySel, v0, dRadiusExcludeCone)) // V0 oustide jet cones
2128 {
2129 if(fDebug > 5) printf("TaskV0sInJets: V0 %d %d found outside jet cones\n", bIsCandidateK0s, bIsCandidateLambda);
2130 bIsOutsideCones = kTRUE;
2131 }
2132 }
7729cc34 2133
7495a67b 2134 // QA histograms after cuts
2135 FillQAHistogramV0(primVtx, v0, 1, bIsCandidateK0s, bIsCandidateLambda, bIsInPeakK0s, bIsInPeakLambda);
2136 // Cut vs mass histograms after cuts
2137 /*
2138 if(bIsCandidateK0s)
2139 {
2140 fh2CutTPCRowsK0s[1]->Fill(dMassV0K0s, dNRowsPos);
2141 fh2CutTPCRowsK0s[1]->Fill(dMassV0K0s, dNRowsNeg);
2142 fh2CutPtPosK0s[1]->Fill(dMassV0K0s, dPtDaughterPos);
2143 fh2CutPtNegK0s[1]->Fill(dMassV0K0s, dPtDaughterNeg);
2144 fh2CutDCAVtx[1]->Fill(dMassV0K0s, dDCAToPrimVtxPos);
2145 fh2CutDCAVtx[1]->Fill(dMassV0K0s, dDCAToPrimVtxNeg);
2146 fh2CutDCAV0[1]->Fill(dMassV0K0s, dDCADaughters);
2147 fh2CutCos[1]->Fill(dMassV0K0s, dCPA);
2148 fh2CutR[1]->Fill(dMassV0K0s, dRadiusDecay);
2149 fh2CutEtaK0s[1]->Fill(dMassV0K0s, dEtaDaughterPos);
2150 fh2CutEtaK0s[1]->Fill(dMassV0K0s, dEtaDaughterNeg);
2151 fh2CutRapK0s[1]->Fill(dMassV0K0s, dRapK0s);
2152 fh2CutCTauK0s[1]->Fill(dMassV0K0s, dMROverPtK0s / dCTauK0s);
2153 fh2CutPIDPosK0s[1]->Fill(dMassV0K0s, dNSigmaPosPion);
2154 fh2CutPIDNegK0s[1]->Fill(dMassV0K0s, dNSigmaNegPion);
2155 fh1DeltaZK0s[iCentIndex]->Fill(dDecayPath[2]);
2156 }
2157 if(bIsCandidateLambda)
2158 {
2159 fh2CutTPCRowsLambda[1]->Fill(dMassV0Lambda, dNRowsPos);
2160 fh2CutTPCRowsLambda[1]->Fill(dMassV0Lambda, dNRowsNeg);
2161 fh2CutPtPosLambda[1]->Fill(dMassV0Lambda, dPtDaughterPos);
2162 fh2CutPtNegLambda[1]->Fill(dMassV0Lambda, dPtDaughterNeg);
2163 fh2CutEtaLambda[1]->Fill(dMassV0Lambda, dEtaDaughterPos);
2164 fh2CutEtaLambda[1]->Fill(dMassV0Lambda, dEtaDaughterNeg);
2165 fh2CutRapLambda[1]->Fill(dMassV0Lambda, dRapLambda);
2166 fh2CutCTauLambda[1]->Fill(dMassV0Lambda, dMROverPtLambda / dCTauLambda);
2167 fh2CutPIDPosLambda[1]->Fill(dMassV0Lambda, dNSigmaPosProton);
2168 fh2CutPIDNegLambda[1]->Fill(dMassV0Lambda, dNSigmaNegPion);
2169 fh1DeltaZLambda[iCentIndex]->Fill(dDecayPath[2]);
2170 }
2171 */
2172
2173 //===== Start of filling V0 spectra =====
2174
2175 Double_t dAngle = TMath::Pi(); // angle between V0 momentum and jet momentum
2176 if(bIsInConeJet)
2177 {
2178 dAngle = vecV0Momentum.Angle(vecJetMomentum);
2179 }
2180
2181 // iCutIndex = 14
2182 if(bIsCandidateK0s)
2183 {
2184 // 14 K0s candidates after cuts
87e23d3e 2185// printf("K0S: i = %d, m = %f, pT = %f, eta = %f, phi = %f\n",iV0,dMassV0K0s,dPtV0,dEtaV0,dPhiV0);
7495a67b 2186 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, kFALSE, kFALSE, iCutIndex, iCentIndex);
2187 Double_t valueKIncl[3] = {dMassV0K0s, dPtV0, dEtaV0};
2188 fhnV0InclusiveK0s[iCentIndex]->Fill(valueKIncl);
2189 fh1V0InvMassK0sCent[iCentIndex]->Fill(dMassV0K0s);
2190
2191 fh1QACTau2D[1]->Fill(dMROverPtK0s / dCTauK0s);
2192 fh1QACTau3D[1]->Fill(dMLOverPK0s / dCTauK0s);
2193// fh2Tau3DVs2D[1]->Fill(dPtV0, dLOverP / dROverPt);
2194
2195 if(iNJetSel)
2196 {
2197 // 15 K0s in jet events
2198 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, kFALSE, kFALSE, iCutIndex + 1, iCentIndex);
2199 }
2200 if(bIsInConeJet)
2201 {
2202 // 16 K0s in jets
2203 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, bIsCandidateK0s, kFALSE, kFALSE, iCutIndex + 2, iCentIndex);
2204 Double_t valueKInJC[4] = {dMassV0K0s, dPtV0, dEtaV0, jet->Pt()};
2205 fhnV0InJetK0s[iCentIndex]->Fill(valueKInJC);
2206 fh2V0PtJetAngleK0s[iCentIndex]->Fill(jet->Pt(), dAngle);
2207 }
2208 if(bIsOutsideCones)
2209 {
2210 Double_t valueKOutJC[3] = {dMassV0K0s, dPtV0, dEtaV0};
2211 fhnV0OutJetK0s[iCentIndex]->Fill(valueKOutJC);
2212 }
2213 if(bIsInConePerp)
2214 {
2215 Double_t valueKInPC[4] = {dMassV0K0s, dPtV0, dEtaV0, jetPerp->Pt()};
2216 fhnV0InPerpK0s[iCentIndex]->Fill(valueKInPC);
2217 }
2218 if(bIsInConeRnd)
2219 {
2220 Double_t valueKInRnd[3] = {dMassV0K0s, dPtV0, dEtaV0};
2221 fhnV0InRndK0s[iCentIndex]->Fill(valueKInRnd);
2222 }
2223 if(bIsInConeMed)
2224 {
2225 Double_t valueKInMed[3] = {dMassV0K0s, dPtV0, dEtaV0};
2226 fhnV0InMedK0s[iCentIndex]->Fill(valueKInMed);
2227 }
2228 if(!iNJetSel)
2229 {
2230 Double_t valueKNoJet[3] = {dMassV0K0s, dPtV0, dEtaV0};
2231 fhnV0NoJetK0s[iCentIndex]->Fill(valueKNoJet);
2232 }
2233 iNV0CandK0s++;
2234 }
2235 if(bIsCandidateLambda)
2236 {
2237 // 14 Lambda candidates after cuts
87e23d3e 2238// printf("La: i = %d, m = %f, pT = %f, eta = %f, phi = %f\n",iV0,dMassV0Lambda,dPtV0,dEtaV0,dPhiV0);
7495a67b 2239 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, kFALSE, bIsCandidateLambda, kFALSE, iCutIndex, iCentIndex);
2240 Double_t valueLIncl[3] = {dMassV0Lambda, dPtV0, dEtaV0};
2241 fhnV0InclusiveLambda[iCentIndex]->Fill(valueLIncl);
2242 fh1V0InvMassLambdaCent[iCentIndex]->Fill(dMassV0Lambda);
2243 if(iNJetSel)
2244 {
2245 // 15 Lambda in jet events
2246 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, kFALSE, bIsCandidateLambda, kFALSE, iCutIndex + 1, iCentIndex);
2247 }
2248 if(bIsInConeJet)
2249 {
2250 // 16 Lambda in jets
2251 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, kFALSE, bIsCandidateLambda, kFALSE, iCutIndex + 2, iCentIndex);
2252 Double_t valueLInJC[4] = {dMassV0Lambda, dPtV0, dEtaV0, jet->Pt()};
2253 fhnV0InJetLambda[iCentIndex]->Fill(valueLInJC);
2254 fh2V0PtJetAngleLambda[iCentIndex]->Fill(jet->Pt(), dAngle);
2255 }
2256 if(bIsOutsideCones)
2257 {
2258 Double_t valueLOutJet[3] = {dMassV0Lambda, dPtV0, dEtaV0};
2259 fhnV0OutJetLambda[iCentIndex]->Fill(valueLOutJet);
2260 }
2261 if(bIsInConePerp)
2262 {
2263 Double_t valueLInPC[4] = {dMassV0Lambda, dPtV0, dEtaV0, jetPerp->Pt()};
2264 fhnV0InPerpLambda[iCentIndex]->Fill(valueLInPC);
2265 }
2266 if(bIsInConeRnd)
2267 {
2268 Double_t valueLInRnd[3] = {dMassV0Lambda, dPtV0, dEtaV0};
2269 fhnV0InRndLambda[iCentIndex]->Fill(valueLInRnd);
2270 }
2271 if(bIsInConeMed)
2272 {
2273 Double_t valueLInMed[3] = {dMassV0Lambda, dPtV0, dEtaV0};
2274 fhnV0InMedLambda[iCentIndex]->Fill(valueLInMed);
2275 }
2276 if(!iNJetSel)
2277 {
2278 Double_t valueLNoJet[3] = {dMassV0Lambda, dPtV0, dEtaV0};
2279 fhnV0NoJetLambda[iCentIndex]->Fill(valueLNoJet);
2280 }
2281 iNV0CandLambda++;
2282 }
2283 if(bIsCandidateALambda)
2284 {
2285 // 14 ALambda candidates after cuts
87e23d3e 2286// printf("AL: i = %d, m = %f, pT = %f, eta = %f, phi = %f\n",iV0,dMassV0ALambda,dPtV0,dEtaV0,dPhiV0);
7495a67b 2287 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, kFALSE, kFALSE, bIsCandidateALambda, iCutIndex, iCentIndex);
2288 Double_t valueALIncl[3] = {dMassV0ALambda, dPtV0, dEtaV0};
2289 fhnV0InclusiveALambda[iCentIndex]->Fill(valueALIncl);
2290 fh1V0InvMassALambdaCent[iCentIndex]->Fill(dMassV0ALambda);
2291 if(iNJetSel)
2292 {
2293 // 15 ALambda in jet events
2294 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, kFALSE, kFALSE, bIsCandidateALambda, iCutIndex + 1, iCentIndex);
2295 }
2296 if(bIsInConeJet)
2297 {
2298 // 16 ALambda in jets
2299 FillCandidates(dMassV0K0s, dMassV0Lambda, dMassV0ALambda, kFALSE, kFALSE, bIsCandidateALambda, iCutIndex + 2, iCentIndex);
2300 Double_t valueLInJC[4] = {dMassV0ALambda, dPtV0, dEtaV0, jet->Pt()};
2301 fhnV0InJetALambda[iCentIndex]->Fill(valueLInJC);
2302 fh2V0PtJetAngleALambda[iCentIndex]->Fill(jet->Pt(), dAngle);
2303 }
2304 if(bIsOutsideCones)
2305 {
2306 Double_t valueALOutJet[3] = {dMassV0ALambda, dPtV0, dEtaV0};
2307 fhnV0OutJetALambda[iCentIndex]->Fill(valueALOutJet);
2308 }
2309 if(bIsInConePerp)
2310 {
2311 Double_t valueLInPC[4] = {dMassV0ALambda, dPtV0, dEtaV0, jetPerp->Pt()};
2312 fhnV0InPerpALambda[iCentIndex]->Fill(valueLInPC);
2313 }
2314 if(bIsInConeRnd)
2315 {
2316 Double_t valueALInRnd[3] = {dMassV0ALambda, dPtV0, dEtaV0};
2317 fhnV0InRndALambda[iCentIndex]->Fill(valueALInRnd);
2318 }
2319 if(bIsInConeMed)
2320 {
2321 Double_t valueALInMed[3] = {dMassV0ALambda, dPtV0, dEtaV0};
2322 fhnV0InMedALambda[iCentIndex]->Fill(valueALInMed);
2323 }
2324 if(!iNJetSel)
2325 {
2326 Double_t valueALNoJet[3] = {dMassV0ALambda, dPtV0, dEtaV0};
2327 fhnV0NoJetALambda[iCentIndex]->Fill(valueALNoJet);
2328 }
2329 iNV0CandALambda++;
2330 }
2331 //===== End of filling V0 spectra =====
7729cc34 2332
2333
7495a67b 2334 //===== Association of reconstructed V0 candidates with MC particles =====
2335 if(fbMCAnalysis)
2336 {
2337 // Associate selected candidates only
7729cc34 2338// if ( !(bIsCandidateK0s && bIsInPeakK0s) && !(bIsCandidateLambda && bIsInPeakLambda) ) // signal candidates
7495a67b 2339 if(!(bIsCandidateK0s) && !(bIsCandidateLambda) && !(bIsCandidateALambda)) // chosen candidates with any mass
2340 continue;
7729cc34 2341
7495a67b 2342 // Get MC labels of reconstructed daughter tracks
2343 Int_t iLabelPos = TMath::Abs(trackPos->GetLabel());
2344 Int_t iLabelNeg = TMath::Abs(trackNeg->GetLabel());
7729cc34 2345
7495a67b 2346 // Make sure MC daughters are in the array range
2347 if((iLabelNeg < 0) || (iLabelNeg >= iNTracksMC) || (iLabelPos < 0) || (iLabelPos >= iNTracksMC))
2348 continue;
7729cc34 2349
7495a67b 2350 // Get MC particles corresponding to reconstructed daughter tracks
2351 AliAODMCParticle* particleMCDaughterNeg = (AliAODMCParticle*)arrayMC->At(iLabelNeg);
2352 AliAODMCParticle* particleMCDaughterPos = (AliAODMCParticle*)arrayMC->At(iLabelPos);
2353 if(!particleMCDaughterNeg || !particleMCDaughterPos)
2354 continue;
7729cc34 2355
7495a67b 2356 // Make sure MC daughter particles are not physical primary
2357 if((particleMCDaughterNeg->IsPhysicalPrimary()) || (particleMCDaughterPos->IsPhysicalPrimary()))
2358 continue;
7729cc34 2359
7495a67b 2360 // Get identities of MC daughter particles
2361 Int_t iPdgCodeDaughterPos = particleMCDaughterPos->GetPdgCode();
2362 Int_t iPdgCodeDaughterNeg = particleMCDaughterNeg->GetPdgCode();
7729cc34 2363
7495a67b 2364 // Get index of the mother particle for each MC daughter particle
2365 Int_t iIndexMotherPos = particleMCDaughterPos->GetMother();
2366 Int_t iIndexMotherNeg = particleMCDaughterNeg->GetMother();
7729cc34 2367
7495a67b 2368 if((iIndexMotherNeg < 0) || (iIndexMotherNeg >= iNTracksMC) || (iIndexMotherPos < 0) || (iIndexMotherPos >= iNTracksMC))
2369 continue;
7729cc34 2370
7495a67b 2371 // Check whether MC daughter particles have the same mother
2372 if(iIndexMotherNeg != iIndexMotherPos)
2373 continue;
7729cc34 2374
7495a67b 2375 // Get the MC mother particle of both MC daughter particles
2376 AliAODMCParticle* particleMCMother = (AliAODMCParticle*)arrayMC->At(iIndexMotherPos);
2377 if(!particleMCMother)
2378 continue;
7729cc34 2379
7495a67b 2380 // Get identity of the MC mother particle
2381 Int_t iPdgCodeMother = particleMCMother->GetPdgCode();
7729cc34 2382
7495a67b 2383 // Skip not interesting particles
2384 if((iPdgCodeMother != iPdgCodeK0s) && (TMath::Abs(iPdgCodeMother) != iPdgCodeLambda))
2385 continue;
7729cc34 2386
7495a67b 2387 // Check identity of the MC mother particle and the decay channel
2388 // Is MC mother particle K0S?
2389 Bool_t bV0MCIsK0s = ((iPdgCodeMother == iPdgCodeK0s) && (iPdgCodeDaughterPos == +iPdgCodePion) && (iPdgCodeDaughterNeg == -iPdgCodePion));
2390 // Is MC mother particle Lambda?
2391 Bool_t bV0MCIsLambda = ((iPdgCodeMother == +iPdgCodeLambda) && (iPdgCodeDaughterPos == +iPdgCodeProton) && (iPdgCodeDaughterNeg == -iPdgCodePion));
2392 // Is MC mother particle anti-Lambda?
2393 Bool_t bV0MCIsALambda = ((iPdgCodeMother == -iPdgCodeLambda) && (iPdgCodeDaughterPos == +iPdgCodePion) && (iPdgCodeDaughterNeg == -iPdgCodeProton));
7729cc34 2394
7495a67b 2395 Double_t dPtV0Gen = particleMCMother->Pt();
87e23d3e 2396// Double_t dRapV0MC = particleMCMother->Y();
7495a67b 2397 Double_t dEtaV0Gen = particleMCMother->Eta();
87e23d3e 2398// Double_t dPhiV0Gen = particleMCMother->Phi();
7729cc34 2399
7495a67b 2400 // Is MC mother particle physical primary? Attention!! Definition of IsPhysicalPrimary may change!!
7729cc34 2401// Bool_t bV0MCIsPrimary = particleMCMother->IsPhysicalPrimary();
7495a67b 2402 // Get the MC mother particle of the MC mother particle
2403 Int_t iIndexMotherOfMother = particleMCMother->GetMother();
2404 AliAODMCParticle* particleMCMotherOfMother = 0;
2405 if(iIndexMotherOfMother >= 0)
2406 particleMCMotherOfMother = (AliAODMCParticle*)arrayMC->At(iIndexMotherOfMother);
2407 // Get identity of the MC mother particle of the MC mother particle if it exists
2408 Int_t iPdgCodeMotherOfMother = 0;
2409 if(particleMCMotherOfMother)
2410 iPdgCodeMotherOfMother = particleMCMotherOfMother->GetPdgCode();
2411 // Check if the MC mother particle of the MC mother particle is a physical primary Sigma (3212 - Sigma0, 3224 - Sigma*+, 3214 - Sigma*0, 3114 - Sigma*-)
7729cc34 2412// Bool_t bV0MCComesFromSigma = kFALSE; // Is MC mother particle daughter of a Sigma?
2413// if ( (particleMCMotherOfMother && particleMCMotherOfMother->IsPhysicalPrimary()) && ( (TMath::Abs(iPdgCodeMotherOfMother)==3212) || (TMath::Abs(iPdgCodeMotherOfMother)==3224) || (TMath::Abs(iPdgCodeMotherOfMother)==3214) || (TMath::Abs(iPdgCodeMotherOfMother)==3114) ) )
2414// bV0MCComesFromSigma = kTRUE;
7495a67b 2415 // Should MC mother particle be considered as primary when it is Lambda?
7729cc34 2416// Bool_t bV0MCIsPrimaryLambda = (bV0MCIsPrimary || bV0MCComesFromSigma);
7495a67b 2417 // Check if the MC mother particle of the MC mother particle is a Xi (3322 - Xi0, 3312 - Xi-)
2418 Bool_t bV0MCComesFromXi = ((particleMCMotherOfMother) && ((iPdgCodeMotherOfMother == 3322) || (iPdgCodeMotherOfMother == 3312))); // Is MC mother particle daughter of a Xi?
2419 Bool_t bV0MCComesFromAXi = ((particleMCMotherOfMother) && ((iPdgCodeMotherOfMother == -3322) || (iPdgCodeMotherOfMother == -3312))); // Is MC mother particle daughter of a anti-Xi?
2420
2421 // Get the distance between production point of the MC mother particle and the primary vertex
2422 Double_t dx = dPrimVtxMCX - particleMCMother->Xv();
2423 Double_t dy = dPrimVtxMCY - particleMCMother->Yv();
2424 Double_t dz = dPrimVtxMCZ - particleMCMother->Zv();
2425 Double_t dDistPrimary = TMath::Sqrt(dx * dx + dy * dy + dz * dz);
2426 Bool_t bV0MCIsPrimaryDist = (dDistPrimary < dDistPrimaryMax); // Is close enough to be considered primary-like?
2427
2428 // phi, eta resolution for V0-reconstruction
87e23d3e 2429// Double_t dResolutionV0Eta = particleMCMother->Eta()-v0->Eta();
2430// Double_t dResolutionV0Phi = particleMCMother->Phi()-v0->Phi();
7729cc34 2431
7495a67b 2432/*
2433 if (fbTreeOutput)
2434 {
2435 objectV0->SetPtTrue(dPtV0Gen);
2436 objectV0->SetEtaTrue(dEtaV0Gen);
2437 objectV0->SetPhiTrue(dPhiV0Gen);
2438 objectV0->SetPDGCode(iPdgCodeMother);
2439 objectV0->SetPDGCodeMother(iPdgCodeMotherOfMother);
2440 }
2441*/
2442
2443 // K0s
7729cc34 2444// if (bIsCandidateK0s && bIsInPeakK0s) // selected candidates in peak
7495a67b 2445 if(bIsCandidateK0s) // selected candidates with any mass
2446 {
7729cc34 2447// if (bV0MCIsK0s && bV0MCIsPrimary) // well reconstructed candidates
7495a67b 2448 if(bV0MCIsK0s && bV0MCIsPrimaryDist) // well reconstructed candidates
2449 {
7729cc34 2450// if (fbTreeOutput)
2451// objectV0->SetOrigin(1);
7495a67b 2452 fh2V0K0sPtMassMCRec[iCentIndex]->Fill(dPtV0Gen, dMassV0K0s);
2453 Double_t valueEtaK[3] = {dMassV0K0s, dPtV0Gen, dEtaV0Gen};
2454 fh3V0K0sEtaPtMassMCRec[iCentIndex]->Fill(valueEtaK);
2455
2456 Double_t valueEtaDKNeg[6] = {0, particleMCDaughterNeg->Eta(), particleMCDaughterNeg->Pt(), dEtaV0Gen, dPtV0Gen, 0};
2457 fhnV0K0sInclDaughterEtaPtPtMCRec[iCentIndex]->Fill(valueEtaDKNeg);
2458 Double_t valueEtaDKPos[6] = {1, particleMCDaughterPos->Eta(), particleMCDaughterPos->Pt(), dEtaV0Gen, dPtV0Gen, 0};
2459 fhnV0K0sInclDaughterEtaPtPtMCRec[iCentIndex]->Fill(valueEtaDKPos);
2460
2461 fh2V0K0sMCResolMPt[iCentIndex]->Fill(dMassV0K0s - dMassPDGK0s, dPtV0);
2462 fh2V0K0sMCPtGenPtRec[iCentIndex]->Fill(dPtV0Gen, dPtV0);
2463 if(bIsInConeJet) // true V0 associated to a candidate in jet
2464 {
2465 Double_t valueKInJCMC[4] = {dMassV0K0s, dPtV0Gen, dEtaV0Gen, jet->Pt()};
2466 fh3V0K0sInJetPtMassMCRec[iCentIndex]->Fill(valueKInJCMC);
2467 Double_t valueEtaKIn[5] = {dMassV0K0s, dPtV0Gen, dEtaV0Gen, jet->Pt(), dEtaV0Gen - jet->Eta()};
2468 fh4V0K0sInJetEtaPtMassMCRec[iCentIndex]->Fill(valueEtaKIn);
2469
2470 Double_t valueEtaDKJCNeg[6] = {0, particleMCDaughterNeg->Eta(), particleMCDaughterNeg->Pt(), dEtaV0Gen, dPtV0Gen, jet->Pt()};
2471 fhnV0K0sInJetsDaughterEtaPtPtMCRec[iCentIndex]->Fill(valueEtaDKJCNeg);
2472 Double_t valueEtaDKJCPos[6] = {1, particleMCDaughterPos->Eta(), particleMCDaughterPos->Pt(), dEtaV0Gen, dPtV0Gen, jet->Pt()};
2473 fhnV0K0sInJetsDaughterEtaPtPtMCRec[iCentIndex]->Fill(valueEtaDKJCPos);
2474 }
2475 }
2476 if(bV0MCIsK0s && !bV0MCIsPrimaryDist) // not primary K0s
2477 {
7729cc34 2478// if (fbTreeOutput)
2479// objectV0->SetOrigin(-1);
7495a67b 2480 fh1V0K0sPtMCRecFalse[iCentIndex]->Fill(dPtV0Gen);
2481 }
2482 }
2483 // Lambda
7729cc34 2484// if (bIsCandidateLambda && bIsInPeakLambda) // selected candidates in peak
7495a67b 2485 if(bIsCandidateLambda) // selected candidates with any mass
2486 {
7729cc34 2487// if (bV0MCIsLambda && bV0MCIsPrimaryLambda) // well reconstructed candidates
7495a67b 2488 if(bV0MCIsLambda && bV0MCIsPrimaryDist) // well reconstructed candidates
2489 {
7729cc34 2490// if (fbTreeOutput)
2491// objectV0->SetOrigin(1);
7495a67b 2492 fh2V0LambdaPtMassMCRec[iCentIndex]->Fill(dPtV0Gen, dMassV0Lambda);
2493 Double_t valueEtaL[3] = {dMassV0Lambda, dPtV0Gen, dEtaV0Gen};
2494 fh3V0LambdaEtaPtMassMCRec[iCentIndex]->Fill(valueEtaL);
2495
2496 Double_t valueEtaDLNeg[6] = {0, particleMCDaughterNeg->Eta(), particleMCDaughterNeg->Pt(), dEtaV0Gen, dPtV0Gen, 0};
2497 fhnV0LambdaInclDaughterEtaPtPtMCRec[iCentIndex]->Fill(valueEtaDLNeg);
2498 Double_t valueEtaDLPos[6] = {1, particleMCDaughterPos->Eta(), particleMCDaughterPos->Pt(), dEtaV0Gen, dPtV0Gen, 0};
2499 fhnV0LambdaInclDaughterEtaPtPtMCRec[iCentIndex]->Fill(valueEtaDLPos);
2500
2501 fh2V0LambdaMCResolMPt[iCentIndex]->Fill(dMassV0Lambda - dMassPDGLambda, dPtV0);
2502 fh2V0LambdaMCPtGenPtRec[iCentIndex]->Fill(dPtV0Gen, dPtV0);
2503 if(bIsInConeJet) // true V0 associated to a reconstructed candidate in jet
2504 {
2505 Double_t valueLInJCMC[4] = {dMassV0Lambda, dPtV0Gen, dEtaV0Gen, jet->Pt()};
2506 fh3V0LambdaInJetPtMassMCRec[iCentIndex]->Fill(valueLInJCMC);
2507 Double_t valueEtaLIn[5] = {dMassV0Lambda, dPtV0Gen, dEtaV0Gen, jet->Pt(), dEtaV0Gen - jet->Eta()};
2508 fh4V0LambdaInJetEtaPtMassMCRec[iCentIndex]->Fill(valueEtaLIn);
2509
2510 Double_t valueEtaDLJCNeg[6] = {0, particleMCDaughterNeg->Eta(), particleMCDaughterNeg->Pt(), dEtaV0Gen, dPtV0Gen, jet->Pt()};
2511 fhnV0LambdaInJetsDaughterEtaPtPtMCRec[iCentIndex]->Fill(valueEtaDLJCNeg);
2512 Double_t valueEtaDLJCPos[6] = {1, particleMCDaughterPos->Eta(), particleMCDaughterPos->Pt(), dEtaV0Gen, dPtV0Gen, jet->Pt()};
2513 fhnV0LambdaInJetsDaughterEtaPtPtMCRec[iCentIndex]->Fill(valueEtaDLJCPos);
2514 }
2515 }
2516 // Fill the feed-down histograms
2517 if(bV0MCIsLambda && bV0MCComesFromXi)
2518 {
7729cc34 2519// if (fbTreeOutput)
2520// objectV0->SetOrigin(2);
7495a67b 2521 Double_t valueFDLIncl[3] = {dPtV0Gen, particleMCMotherOfMother->Pt(), 0.};
2522 fhnV0LambdaInclMCFD[iCentIndex]->Fill(valueFDLIncl);
2523 if(bIsInConeRnd)
2524 {
2525 fhnV0LambdaBulkMCFD[iCentIndex]->Fill(valueFDLIncl);
2526 }
2527 if(bIsInConeJet)
2528 {
2529 Double_t valueFDLInJets[3] = {dPtV0Gen, particleMCMotherOfMother->Pt(), jet->Pt()};
2530 fhnV0LambdaInJetsMCFD[iCentIndex]->Fill(valueFDLInJets);
2531 }
2532 }
2533 if(bV0MCIsLambda && !bV0MCIsPrimaryDist && !bV0MCComesFromXi) // not primary Lambda
2534 {
7729cc34 2535// if (fbTreeOutput)
2536// objectV0->SetOrigin(-1);
7495a67b 2537 fh1V0LambdaPtMCRecFalse[iCentIndex]->Fill(dPtV0Gen);
2538 }
2539 }
2540 // anti-Lambda
7729cc34 2541// if (bIsCandidateALambda && bIsInPeakALambda) // selected candidates in peak
7495a67b 2542 if(bIsCandidateALambda) // selected candidates with any mass
2543 {
7729cc34 2544// if (bV0MCIsALambda && bV0MCIsPrimaryALambda) // well reconstructed candidates
7495a67b 2545 if(bV0MCIsALambda && bV0MCIsPrimaryDist) // well reconstructed candidates
2546 {
7729cc34 2547// if (fbTreeOutput)
2548// objectV0->SetOrigin(1);
7495a67b 2549 fh2V0ALambdaPtMassMCRec[iCentIndex]->Fill(dPtV0Gen, dMassV0ALambda);
2550 Double_t valueEtaAL[3] = {dMassV0ALambda, dPtV0Gen, dEtaV0Gen};
2551 fh3V0ALambdaEtaPtMassMCRec[iCentIndex]->Fill(valueEtaAL);
2552
2553 Double_t valueEtaDALNeg[6] = {0, particleMCDaughterNeg->Eta(), particleMCDaughterNeg->Pt(), dEtaV0Gen, dPtV0Gen, 0};
2554 fhnV0ALambdaInclDaughterEtaPtPtMCRec[iCentIndex]->Fill(valueEtaDALNeg);
2555 Double_t valueEtaDALPos[6] = {1, particleMCDaughterPos->Eta(), particleMCDaughterPos->Pt(), dEtaV0Gen, dPtV0Gen, 0};
2556 fhnV0ALambdaInclDaughterEtaPtPtMCRec[iCentIndex]->Fill(valueEtaDALPos);
2557
2558 fh2V0ALambdaMCResolMPt[iCentIndex]->Fill(dMassV0ALambda - dMassPDGLambda, dPtV0);
2559 fh2V0ALambdaMCPtGenPtRec[iCentIndex]->Fill(dPtV0Gen, dPtV0);
2560 if(bIsInConeJet) // true V0 associated to a reconstructed candidate in jet
2561 {
2562 Double_t valueALInJCMC[4] = {dMassV0ALambda, dPtV0Gen, dEtaV0Gen, jet->Pt()};
2563 fh3V0ALambdaInJetPtMassMCRec[iCentIndex]->Fill(valueALInJCMC);
2564 Double_t valueEtaALIn[5] = {dMassV0ALambda, dPtV0Gen, dEtaV0Gen, jet->Pt(), dEtaV0Gen - jet->Eta()};
2565 fh4V0ALambdaInJetEtaPtMassMCRec[iCentIndex]->Fill(valueEtaALIn);
2566
2567 Double_t valueEtaDALJCNeg[6] = {0, particleMCDaughterNeg->Eta(), particleMCDaughterNeg->Pt(), dEtaV0Gen, dPtV0Gen, jet->Pt()};
2568 fhnV0ALambdaInJetsDaughterEtaPtPtMCRec[iCentIndex]->Fill(valueEtaDALJCNeg);
2569 Double_t valueEtaDALJCPos[6] = {1, particleMCDaughterPos->Eta(), particleMCDaughterPos->Pt(), dEtaV0Gen, dPtV0Gen, jet->Pt()};
2570 fhnV0ALambdaInJetsDaughterEtaPtPtMCRec[iCentIndex]->Fill(valueEtaDALJCPos);
2571 }
2572 }
2573 // Fill the feed-down histograms
2574 if(bV0MCIsALambda && bV0MCComesFromAXi)
2575 {
7729cc34 2576// if (fbTreeOutput)
2577// objectV0->SetOrigin(2);
7495a67b 2578 Double_t valueFDALIncl[3] = {dPtV0Gen, particleMCMotherOfMother->Pt(), 0.};
2579 fhnV0ALambdaInclMCFD[iCentIndex]->Fill(valueFDALIncl);
2580 if(bIsInConeRnd)
2581 {
2582 fhnV0ALambdaBulkMCFD[iCentIndex]->Fill(valueFDALIncl);
2583 }
2584 if(bIsInConeJet)
2585 {
2586 Double_t valueFDALInJets[3] = {dPtV0Gen, particleMCMotherOfMother->Pt(), jet->Pt()};
2587 fhnV0ALambdaInJetsMCFD[iCentIndex]->Fill(valueFDALInJets);
2588 }
2589 }
2590 if(bV0MCIsALambda && !bV0MCIsPrimaryDist && !bV0MCComesFromAXi) // not primary anti-Lambda
2591 {
7729cc34 2592// if (fbTreeOutput)
2593// objectV0->SetOrigin(-1);
7495a67b 2594 fh1V0ALambdaPtMCRecFalse[iCentIndex]->Fill(dPtV0Gen);
7729cc34 2595 }
7495a67b 2596 }
7729cc34 2597 }
7495a67b 2598 //===== End Association of reconstructed V0 candidates with MC particles =====
2599 }
2600 //===== End of V0 loop =====
7729cc34 2601
2602 fh1V0CandPerEvent->Fill(iNV0CandTot);
2603 fh1V0CandPerEventCentK0s[iCentIndex]->Fill(iNV0CandK0s);
2604 fh1V0CandPerEventCentLambda[iCentIndex]->Fill(iNV0CandLambda);
2605 fh1V0CandPerEventCentALambda[iCentIndex]->Fill(iNV0CandALambda);
2606
7495a67b 2607 if(fDebug > 2) printf("TaskV0sInJets: End of V0 loop\n");
7729cc34 2608
2609 // Spectra of generated particles
7495a67b 2610 if(fbMCAnalysis)
2611 {
2612 for(Int_t iPartMC = 0; iPartMC < iNTracksMC; iPartMC++)
7729cc34 2613 {
7495a67b 2614 // Get MC particle
2615 AliAODMCParticle* particleMC = (AliAODMCParticle*)arrayMC->At(iPartMC);
2616 if(!particleMC)
2617 continue;
7729cc34 2618
7495a67b 2619 // Get identity of MC particle
2620 Int_t iPdgCodeParticleMC = particleMC->GetPdgCode();
2621 // Fill Xi spectrum (3322 - Xi0, 3312 - Xi-)
7729cc34 2622// if ( (iPdgCodeParticleMC==3322) || (iPdgCodeParticleMC==3312) )
7495a67b 2623 if((iPdgCodeParticleMC == 3312) && (TMath::Abs(particleMC->Y()) < 0.5))
2624 {
7729cc34 2625// if (fbTreeOutput)
2626// new ((*fBranchV0Gen)[iNV0SelV0Gen++]) AliAODMCParticle(*((AliAODMCParticle*)particleMC));
7495a67b 2627 fh1V0XiPtMCGen[iCentIndex]->Fill(particleMC->Pt());
2628 }
2629 if((iPdgCodeParticleMC == -3312) && (TMath::Abs(particleMC->Y()) < 0.5))
2630 {
7729cc34 2631// if (fbTreeOutput)
2632// new ((*fBranchV0Gen)[iNV0SelV0Gen++]) AliAODMCParticle(*((AliAODMCParticle*)particleMC));
7495a67b 2633 fh1V0AXiPtMCGen[iCentIndex]->Fill(particleMC->Pt());
2634 }
2635 // Skip not interesting particles
2636 if((iPdgCodeParticleMC != iPdgCodeK0s) && (TMath::Abs(iPdgCodeParticleMC) != iPdgCodeLambda))
2637 continue;
7729cc34 2638
7495a67b 2639 // Check identity of the MC V0 particle
2640 // Is MC V0 particle K0S?
2641 Bool_t bV0MCIsK0s = (iPdgCodeParticleMC == iPdgCodeK0s);
2642 // Is MC V0 particle Lambda?
2643 Bool_t bV0MCIsLambda = (iPdgCodeParticleMC == +iPdgCodeLambda);
2644 // Is MC V0 particle anti-Lambda?
2645 Bool_t bV0MCIsALambda = (iPdgCodeParticleMC == -iPdgCodeLambda);
2646
2647 Double_t dPtV0Gen = particleMC->Pt();
2648 Double_t dRapV0Gen = particleMC->Y();
2649 Double_t dEtaV0Gen = particleMC->Eta();
2650
2651 // V0 rapidity cut
2652 if(bCutRapV0)
2653 {
2654 if(bPrintCuts) printf("Gen: Applying cut: V0 |y|: < %f\n", dRapMax);
2655 if((TMath::Abs(dRapV0Gen) > dRapMax))
2656 continue;
2657 }
2658 // V0 pseudorapidity cut
2659 if(bCutEtaV0)
2660 {
2661 if(bPrintCuts) printf("Gen: Applying cut: V0 |eta|: < %f\n", dEtaMax);
2662 if((TMath::Abs(dEtaV0Gen) > dEtaMax))
2663 continue;
2664 }
2665/*
2666 // Is MC V0 particle physical primary? Attention!! Definition of IsPhysicalPrimary may change!!
2667 Bool_t bV0MCIsPrimary = particleMC->IsPhysicalPrimary();
2668
2669 // Get the MC mother particle of the MC V0 particle
2670 Int_t iIndexMotherOfMother = particleMC->GetMother();
2671 AliAODMCParticle* particleMCMotherOfMother = 0;
2672 if (iIndexMotherOfMother >= 0)
2673 particleMCMotherOfMother = (AliAODMCParticle*)arrayMC->At(iIndexMotherOfMother);
2674 // Get identity of the MC mother particle of the MC V0 particle if it exists
2675 Int_t iPdgCodeMotherOfMother = 0;
2676 if (particleMCMotherOfMother)
2677 iPdgCodeMotherOfMother = particleMCMotherOfMother->GetPdgCode();
2678 // Check if the MC mother particle is a physical primary Sigma
2679 Bool_t bV0MCComesFromSigma = kFALSE;
2680 if ((particleMCMotherOfMother && particleMCMotherOfMother->IsPhysicalPrimary()) && (TMath::Abs(iPdgCodeMotherOfMother)==3212) || (TMath::Abs(iPdgCodeMotherOfMother)==3224) || (TMath::Abs(iPdgCodeMotherOfMother)==3214) || (TMath::Abs(iPdgCodeMotherOfMother)==3114) )
2681 bV0MCComesFromSigma = kTRUE;
2682 // Should the MC V0 particle be considered as primary when it is Lambda?
2683 Bool_t bV0MCIsPrimaryLambda = (bV0MCIsPrimary || bV0MCComesFromSigma);
2684*/
2685 // Reject non primary particles
7729cc34 2686// if (!bV0MCIsPrimaryLambda)
2687// continue;
2688
7495a67b 2689 // Get the distance between the production point of the MC V0 particle and the primary vertex
2690 Double_t dx = dPrimVtxMCX - particleMC->Xv();
2691 Double_t dy = dPrimVtxMCY - particleMC->Yv();
2692 Double_t dz = dPrimVtxMCZ - particleMC->Zv();
2693 Double_t dDistPrimary = TMath::Sqrt(dx * dx + dy * dy + dz * dz);
2694 Bool_t bV0MCIsPrimaryDist = (dDistPrimary < dDistPrimaryMax); // Is close enough to be considered primary-like?
2695
2696 // Check whether the MC V0 particle is in a MC jet
2697 AliAODJet* jetMC = 0;
2698 Bool_t bIsMCV0InJet = kFALSE;
2699 if(iNJetSel)
2700 {
2701 if(fDebug > 5) printf("TaskV0sInJets: Searching for gen V0 in %d MC jets\n", iNJetSel);
2702 for(Int_t iJet = 0; iJet < iNJetSel; iJet++)
2703 {
2704 jetMC = (AliAODJet*)jetArraySel->At(iJet); // load a jet in the list
2705 if(fDebug > 5) printf("TaskV0sInJets: Checking if gen V0 in MC jet %d\n", iJet);
2706 if(IsParticleInCone(particleMC, jetMC, fdRadiusJet)) // If good jet in event, find out whether V0 is in that jet
2707 {
2708 if(fDebug > 5) printf("TaskV0sInJets: gen V0 found in MC jet %d\n", iJet);
2709 bIsMCV0InJet = kTRUE;
2710 break;
2711 }
2712 }
2713 }
2714
2715 // Select only primary-like MC V0 particles
2716 // K0s
7729cc34 2717// if (bV0MCIsK0s && bV0MCIsPrimary) // well reconstructed candidates
7495a67b 2718 if(bV0MCIsK0s && bV0MCIsPrimaryDist) // well reconstructed candidates
2719 {
7729cc34 2720// if (fbTreeOutput)
2721// new ((*fBranchV0Gen)[iNV0SelV0Gen++]) AliAODMCParticle(*((AliAODMCParticle*)particleMC));
7495a67b 2722 fh1V0K0sPtMCGen[iCentIndex]->Fill(dPtV0Gen);
2723 fh2V0K0sEtaPtMCGen[iCentIndex]->Fill(dPtV0Gen, dEtaV0Gen);
2724 if(bIsMCV0InJet)
2725 {
2726 fh2V0K0sInJetPtMCGen[iCentIndex]->Fill(dPtV0Gen, jetMC->Pt());
2727 Double_t valueEtaKInGen[4] = {dPtV0Gen, dEtaV0Gen, jetMC->Pt(), dEtaV0Gen - jetMC->Eta()};
2728 fh3V0K0sInJetEtaPtMCGen[iCentIndex]->Fill(valueEtaKInGen);
2729 }
2730 }
2731 // Lambda
7729cc34 2732// if (bV0MCIsLambda && bV0MCIsPrimaryLambda) // well reconstructed candidates
7495a67b 2733 if(bV0MCIsLambda && bV0MCIsPrimaryDist) // well reconstructed candidates
2734 {
7729cc34 2735// if (fbTreeOutput)
2736// new ((*fBranchV0Gen)[iNV0SelV0Gen++]) AliAODMCParticle(*((AliAODMCParticle*)particleMC));
7495a67b 2737 fh1V0LambdaPtMCGen[iCentIndex]->Fill(dPtV0Gen);
2738 fh2V0LambdaEtaPtMCGen[iCentIndex]->Fill(dPtV0Gen, dEtaV0Gen);
2739 if(bIsMCV0InJet)
2740 {
2741 fh2V0LambdaInJetPtMCGen[iCentIndex]->Fill(dPtV0Gen, jetMC->Pt());
2742 Double_t valueEtaLInGen[4] = {dPtV0Gen, dEtaV0Gen, jetMC->Pt(), dEtaV0Gen - jetMC->Eta()};
2743 fh3V0LambdaInJetEtaPtMCGen[iCentIndex]->Fill(valueEtaLInGen);
2744 }
2745 }
2746 // anti-Lambda
7729cc34 2747// if (bV0MCIsALambda && bV0MCIsPrimaryALambda) // well reconstructed candidates
7495a67b 2748 if(bV0MCIsALambda && bV0MCIsPrimaryDist) // well reconstructed candidates
2749 {
7729cc34 2750// if (fbTreeOutput)
2751// new ((*fBranchV0Gen)[iNV0SelV0Gen++]) AliAODMCParticle(*((AliAODMCParticle*)particleMC));
7495a67b 2752 fh1V0ALambdaPtMCGen[iCentIndex]->Fill(dPtV0Gen);
2753 fh2V0ALambdaEtaPtMCGen[iCentIndex]->Fill(dPtV0Gen, dEtaV0Gen);
2754 if(bIsMCV0InJet)
2755 {
2756 fh2V0ALambdaInJetPtMCGen[iCentIndex]->Fill(dPtV0Gen, jetMC->Pt());
2757 Double_t valueEtaALInGen[4] = {dPtV0Gen, dEtaV0Gen, jetMC->Pt(), dEtaV0Gen - jetMC->Eta()};
2758 fh3V0ALambdaInJetEtaPtMCGen[iCentIndex]->Fill(valueEtaALInGen);
7729cc34 2759 }
7495a67b 2760 }
7729cc34 2761 }
7495a67b 2762 }
7729cc34 2763
2764// if (fbTreeOutput)
2765// ftreeOut->Fill();
2766
2767 jetArraySel->Delete();
2768 delete jetArraySel;
2769 jetArrayPerp->Delete();
2770 delete jetArrayPerp;
7495a67b 2771 if(jetRnd)
7729cc34 2772 delete jetRnd;
2773 jetRnd = 0;
2774
7495a67b 2775 PostData(1, fOutputListStd);
2776 PostData(2, fOutputListQA);
2777 PostData(3, fOutputListCuts);
2778 PostData(4, fOutputListMC);
7729cc34 2779// if (fbTreeOutput)
2780// PostData(5,ftreeOut);
2781// if(fDebug>5) printf("TaskV0sInJets: UserExec: End\n");
2782}
2783
2784void AliAnalysisTaskV0sInJets::FillQAHistogramV0(AliAODVertex* vtx, const AliAODv0* vZero, Int_t iIndexHisto, Bool_t IsCandK0s, Bool_t IsCandLambda, Bool_t IsInPeakK0s, Bool_t IsInPeakLambda)
2785{
7495a67b 2786 if(!IsCandK0s && !IsCandLambda)
7729cc34 2787 return;
2788
87e23d3e 2789// Double_t dMassK0s = vZero->MassK0Short();
2790// Double_t dMassLambda = vZero->MassLambda();
7729cc34 2791
2792 fh1QAV0Status[iIndexHisto]->Fill(vZero->GetOnFlyStatus());
2793
7495a67b 2794 AliAODTrack* trackNeg = (AliAODTrack*)vZero->GetDaughter(1); // negative track
2795 AliAODTrack* trackPos = (AliAODTrack*)vZero->GetDaughter(0); // positive track
7729cc34 2796
2797 Short_t fTotalCharge = 0;
7495a67b 2798 for(Int_t i = 0; i < 2; i++)
2799 {
2800 AliAODTrack* track = (AliAODTrack*)vZero->GetDaughter(i); // track
2801 // Tracks TPC OK
2802 fh1QAV0TPCRefit[iIndexHisto]->Fill(track->IsOn(AliAODTrack::kTPCrefit));
2803 Double_t nCrossedRowsTPC = track->GetTPCClusterInfo(2, 1);
2804 fh1QAV0TPCRows[iIndexHisto]->Fill(nCrossedRowsTPC);
2805 Int_t findable = track->GetTPCNclsF();
2806 fh1QAV0TPCFindable[iIndexHisto]->Fill(findable);
2807 if(findable != 0)
7729cc34 2808 {
7495a67b 2809 fh1QAV0TPCRowsFind[iIndexHisto]->Fill(nCrossedRowsTPC / findable);
2810 }
2811 // Daughters: pseudo-rapidity cut
2812 fh1QAV0Eta[iIndexHisto]->Fill(track->Eta());
2813 if((nCrossedRowsTPC > (160. / (250. - 85.) * (255.*TMath::Abs(tan(track->Theta())) - 85.)) + 20.) && (track->Eta() < 0) && (track->Pt() > 0.15))
7729cc34 2814// if (IsCandK0s)
7495a67b 2815 {
2816 fh2QAV0EtaRows[iIndexHisto]->Fill(track->Eta(), nCrossedRowsTPC);
2817 fh2QAV0PtRows[iIndexHisto]->Fill(track->Pt(), nCrossedRowsTPC);
2818 fh2QAV0PhiRows[iIndexHisto]->Fill(track->Phi(), nCrossedRowsTPC);
2819 fh2QAV0NClRows[iIndexHisto]->Fill(findable, nCrossedRowsTPC);
2820 fh2QAV0EtaNCl[iIndexHisto]->Fill(track->Eta(), findable);
7729cc34 2821 }
7495a67b 2822
2823 // Daughters: transverse momentum cut
2824 fh1QAV0Pt[iIndexHisto]->Fill(track->Pt());
2825 fTotalCharge += track->Charge();
2826 }
7729cc34 2827 fh1QAV0Charge[iIndexHisto]->Fill(fTotalCharge);
2828
2829 // Daughters: Impact parameter of daughters to prim vtx
2830 fh1QAV0DCAVtx[iIndexHisto]->Fill(TMath::Abs(vZero->DcaNegToPrimVertex()));
2831 fh1QAV0DCAVtx[iIndexHisto]->Fill(TMath::Abs(vZero->DcaPosToPrimVertex()));
87e23d3e 2832// fh2CutDCAVtx[iIndexHisto]->Fill(dMassK0s,TMath::Abs(vZero->DcaNegToPrimVertex()));
7729cc34 2833
2834 // Daughters: DCA
2835 fh1QAV0DCAV0[iIndexHisto]->Fill(vZero->DcaV0Daughters());
87e23d3e 2836// fh2CutDCAV0[iIndexHisto]->Fill(dMassK0s,vZero->DcaV0Daughters());
7729cc34 2837
2838 // V0: Cosine of the pointing angle
2839 fh1QAV0Cos[iIndexHisto]->Fill(vZero->CosPointingAngle(vtx));
87e23d3e 2840// fh2CutCos[iIndexHisto]->Fill(dMassK0s,vZero->CosPointingAngle(vtx));
7729cc34 2841
2842 // V0: Fiducial volume
2843 Double_t xyz[3];
2844 vZero->GetSecondaryVtx(xyz);
7495a67b 2845 Double_t r2 = xyz[0] * xyz[0] + xyz[1] * xyz[1];
7729cc34 2846 fh1QAV0R[iIndexHisto]->Fill(TMath::Sqrt(r2));
2847
87e23d3e 2848 Double_t dAlpha = vZero->AlphaV0();
2849 Double_t dPtArm = vZero->PtArmV0();
7729cc34 2850
7495a67b 2851 if(IsCandK0s)
2852 {
2853 if(IsInPeakK0s)
7729cc34 2854 {
7729cc34 2855// fh2QAV0EtaPtK0sPeak[iIndexHisto]->Fill(trackNeg->Eta(),vZero->Pt());
2856// fh2QAV0EtaPtK0sPeak[iIndexHisto]->Fill(trackPos->Eta(),vZero->Pt());
7495a67b 2857 fh2QAV0EtaPtK0sPeak[iIndexHisto]->Fill(vZero->Eta(), vZero->Pt());
2858 fh2QAV0PtPtK0sPeak[iIndexHisto]->Fill(trackNeg->Pt(), trackPos->Pt());
2859 fh2ArmPodK0s[iIndexHisto]->Fill(dAlpha, dPtArm);
7729cc34 2860 }
7495a67b 2861 fh2QAV0EtaEtaK0s[iIndexHisto]->Fill(trackNeg->Eta(), trackPos->Eta());
2862 fh2QAV0PhiPhiK0s[iIndexHisto]->Fill(trackNeg->Phi(), trackPos->Phi());
2863 fh1QAV0RapK0s[iIndexHisto]->Fill(vZero->RapK0Short());
2864 }
2865
2866 if(IsCandLambda)
2867 {
2868 if(IsInPeakLambda)
7729cc34 2869 {
7729cc34 2870// fh2QAV0EtaPtLambdaPeak[iIndexHisto]->Fill(trackNeg->Eta(),vZero->Pt());
2871// fh2QAV0EtaPtLambdaPeak[iIndexHisto]->Fill(trackPos->Eta(),vZero->Pt());
7495a67b 2872 fh2QAV0EtaPtLambdaPeak[iIndexHisto]->Fill(vZero->Eta(), vZero->Pt());
2873 fh2QAV0PtPtLambdaPeak[iIndexHisto]->Fill(trackNeg->Pt(), trackPos->Pt());
2874 fh2ArmPodLambda[iIndexHisto]->Fill(dAlpha, dPtArm);
7729cc34 2875 }
7495a67b 2876 fh2QAV0EtaEtaLambda[iIndexHisto]->Fill(trackNeg->Eta(), trackPos->Eta());
2877 fh2QAV0PhiPhiLambda[iIndexHisto]->Fill(trackNeg->Phi(), trackPos->Phi());
2878 fh1QAV0RapLambda[iIndexHisto]->Fill(vZero->RapLambda());
2879 }
7729cc34 2880
7495a67b 2881 fh2ArmPod[iIndexHisto]->Fill(dAlpha, dPtArm);
7729cc34 2882
2883}
2884
2885void AliAnalysisTaskV0sInJets::FillCandidates(Double_t mK, Double_t mL, Double_t mAL, Bool_t isK, Bool_t isL, Bool_t isAL, Int_t iCut/*cut index*/, Int_t iCent/*cent index*/)
2886{
7495a67b 2887 if(isK)
2888 {
2889 fh1V0CounterCentK0s[iCent]->Fill(iCut);
2890 fh1V0InvMassK0sAll[iCut]->Fill(mK);
2891 }
2892 if(isL)
2893 {
2894 fh1V0CounterCentLambda[iCent]->Fill(iCut);
2895 fh1V0InvMassLambdaAll[iCut]->Fill(mL);
2896 }
2897 if(isAL)
2898 {
2899 fh1V0CounterCentALambda[iCent]->Fill(iCut);
2900 fh1V0InvMassALambdaAll[iCut]->Fill(mAL);
2901 }
7729cc34 2902}
2903
2904Bool_t AliAnalysisTaskV0sInJets::IsParticleInCone(const AliVParticle* part1, const AliVParticle* part2, Double_t dRMax) const
2905{
2906// decides whether a particle is inside a jet cone
7495a67b 2907 if(!part1 || !part2)
7729cc34 2908 return kFALSE;
2909
7495a67b 2910 TVector3 vecMom2(part2->Px(), part2->Py(), part2->Pz());
2911 TVector3 vecMom1(part1->Px(), part1->Py(), part1->Pz());
7729cc34 2912 Double_t dR = vecMom2.DeltaR(vecMom1); // = sqrt(dEta*dEta+dPhi*dPhi)
7495a67b 2913 if(dR < dRMax) // momentum vectors of part1 and part2 are closer than dRMax
7729cc34 2914 return kTRUE;
2915 return kFALSE;
2916}
2917
2918Bool_t AliAnalysisTaskV0sInJets::OverlapWithJets(const TClonesArray* array, const AliVParticle* part, Double_t dDistance) const
2919{
2920// decides whether a cone overlaps with other jets
7495a67b 2921 if(!part)
2922 {
2923 if(fDebug > 0) printf("AliAnalysisTaskV0sInJets::OverlapWithJets: Error: No part\n");
2924 return kFALSE;
2925 }
2926 if(!array)
2927 {
2928 if(fDebug > 0) printf("AliAnalysisTaskV0sInJets::OverlapWithJets: Error: No array\n");
2929 return kFALSE;
2930 }
7729cc34 2931 Int_t iNJets = array->GetEntriesFast();
7495a67b 2932 if(iNJets <= 0)
2933 {
2934 if(fDebug > 2) printf("AliAnalysisTaskV0sInJets::OverlapWithJets: Warning: No jets\n");
2935 return kFALSE;
2936 }
7729cc34 2937 AliVParticle* jet = 0;
7495a67b 2938 for(Int_t iJet = 0; iJet < iNJets; iJet++)
2939 {
2940 jet = (AliVParticle*)array->At(iJet);
2941 if(!jet)
7729cc34 2942 {
7495a67b 2943 if(fDebug > 0) printf("AliAnalysisTaskV0sInJets::OverlapWithJets: Error: Failed to load jet %d/%d\n", iJet, iNJets);
2944 continue;
7729cc34 2945 }
7495a67b 2946 if(IsParticleInCone(part, jet, dDistance))
2947 return kTRUE;
2948 }
7729cc34 2949 return kFALSE;
2950}
2951
9706bde3 2952AliAODJet* AliAnalysisTaskV0sInJets::GetRandomCone(const TClonesArray* array, Double_t dEtaConeMax, Double_t dDistance) const
7729cc34 2953{
2954// generate a random cone which does not overlap with selected jets
2955// printf("Generating random cone...\n");
2956 TLorentzVector vecCone;
2957 AliAODJet* part = 0;
2958 Double_t dEta, dPhi;
2959 Int_t iNTrialsMax = 10;
2960 Bool_t bStatus = kFALSE;
7495a67b 2961 for(Int_t iTry = 0; iTry < iNTrialsMax; iTry++)
2962 {
7729cc34 2963// printf("Try %d\n",iTry);
7495a67b 2964 dEta = dEtaConeMax * (2 * fRandom->Rndm() - 1.); // random eta in [-dEtaConeMax,+dEtaConeMax]
2965 dPhi = TMath::TwoPi() * fRandom->Rndm(); // random phi in [0,2*Pi]
2966 vecCone.SetPtEtaPhiM(1., dEta, dPhi, 0.);
2967 part = new AliAODJet(vecCone);
2968 if(!OverlapWithJets(array, part, dDistance))
2969 {
2970 bStatus = kTRUE;
7729cc34 2971// printf("Success\n");
7495a67b 2972 break;
7729cc34 2973 }
7495a67b 2974 else
2975 delete part;
2976 }
2977 if(!bStatus)
7729cc34 2978 part = 0;
2979 return part;
2980}
2981
9706bde3 2982AliAODJet* AliAnalysisTaskV0sInJets::GetMedianCluster(const TClonesArray* array, Double_t dEtaConeMax) const
2983{
f8afd72f 2984// sort kt clusters by pT/area and return the middle one, based on code in AliAnalysisTaskJetChem
7495a67b 2985 if(!array)
2986 {
2987 if(fDebug > 0) printf("AliAnalysisTaskV0sInJets::GetMedianCluster: Error: No array\n");
2988 return NULL;
2989 }
2990 Int_t iNClTot = array->GetEntriesFast(); // number of all clusters in the array
2991 Int_t iNCl = 0; // number of accepted clusters
9706bde3 2992
2993 // get list of densities
7495a67b 2994 std::vector<std::vector<Double_t> > vecListClusters; // vector that contains pairs [ index, density ]
2995// printf("AliAnalysisTaskV0sInJets::GetMedianCluster: Loop over %d clusters.\n", iNClTot);
2996 for(Int_t ij = 0; ij < iNClTot; ij++)
2997 {
2998 AliAODJet* clusterBg = (AliAODJet*)(array->At(ij));
2999 if(!clusterBg)
9706bde3 3000 {
7495a67b 3001// printf("AliAnalysisTaskV0sInJets::GetMedianCluster: cluster %d/%d not ok\n", ij, iNClTot);
3002 return NULL;
9706bde3 3003 }
7495a67b 3004 if(TMath::Abs(clusterBg->Eta()) > 0.9 - fdRadiusJetBg)
3005 continue;
3006// fh2EtaPhiMedCone[0]->Fill(clusterBg->Eta(), clusterBg->Phi());
3007// printf("AliAnalysisTaskV0sInJets::GetMedianCluster: Cluster %d/%d used as accepted cluster %d.\n", ij, iNClTot, int(vecListClusters.size()));
3008 Double_t dPtBg = clusterBg->Pt();
3009 Double_t dAreaBg = clusterBg->EffectiveAreaCharged();
3010 Double_t dDensityBg = 0;
3011 if(dAreaBg > 0)
3012 dDensityBg = dPtBg / dAreaBg;
3013 std::vector<Double_t> vecCluster;
3014 vecCluster.push_back(ij);
3015 vecCluster.push_back(dDensityBg);
3016 vecListClusters.push_back(vecCluster);
3017 }
3018 iNCl = vecListClusters.size();
3019 if(iNCl < 3) // need at least 3 clusters (skipping 2 highest)
3020 {
3021// if(fDebug > 2) printf("AliAnalysisTaskV0sInJets::GetMedianCluster: Warning: Too little clusters\n");
3022 return NULL;
3023 }
3024
3025// printf("AliAnalysisTaskV0sInJets::GetMedianCluster: Original lists:\n");
3026// for(Int_t i = 0; i < iNCl; i++)
3027// printf("%g %g\n", (vecListClusters[i])[0], (vecListClusters[i])[1]);
3028
3029 // sort list of indeces by density in descending order
3030 std::sort(vecListClusters.begin(), vecListClusters.end(), CompareClusters);
3031
3032// printf("AliAnalysisTaskV0sInJets::GetMedianCluster: Sorted lists:\n");
3033// for(Int_t i = 0; i < iNCl; i++)
3034// printf("%g %g\n", (vecListClusters[i])[0], (vecListClusters[i])[1]);
9706bde3 3035
3036 // get median cluster with median density
3037 AliAODJet* clusterMed = 0;
7495a67b 3038 Int_t iIndex = 0; // index of the median cluster in the sorted list
3039 Int_t iIndexMed = 0; // index of the median cluster in the original array
3040 if(TMath::Odd(iNCl)) // odd number of clusters
3041 {
3042 iIndex = (Int_t)(0.5 * (iNCl + 1)); // = (n - skip + 1)/2 + 1, skip = 2
3043// printf("AliAnalysisTaskV0sInJets::GetMedianCluster: Odd, median index = %d/%d\n", iIndex, iNCl);
3044 }
9706bde3 3045 else // even number: picking randomly one of the two closest to median
7495a67b 3046 {
3047 Int_t iIndex1 = (Int_t)(0.5 * iNCl); // = (n - skip)/2 + 1, skip = 2
3048 Int_t iIndex2 = (Int_t)(0.5 * iNCl + 1); // = (n - skip)/2 + 1 + 1, skip = 2
3049 iIndex = ((fRandom->Rndm() > 0.5) ? iIndex1 : iIndex2);
3050// printf("AliAnalysisTaskV0sInJets::GetMedianCluster: Even, median index = %d or %d -> %d/%d\n", iIndex1, iIndex2, iIndex, iNCl);
3051 }
90db0a5c 3052 iIndexMed = Int_t((vecListClusters[iIndex])[0]);
7495a67b 3053
3054// printf("AliAnalysisTaskV0sInJets::GetMedianCluster: getting median cluster %d/%d ok, rho = %g\n", iIndexMed, iNClTot, (vecListClusters[iIndex])[1]);
9706bde3 3055 clusterMed = (AliAODJet*)(array->At(iIndexMed));
3056
7495a67b 3057 if(TMath::Abs(clusterMed->Eta()) > dEtaConeMax)
9706bde3 3058 return NULL;
7495a67b 3059
9706bde3 3060 return clusterMed;
3061}
3062
7729cc34 3063Double_t AliAnalysisTaskV0sInJets::AreaCircSegment(Double_t dRadius, Double_t dDistance) const
3064{
3065// calculate area of a circular segment defined by the circle radius and the (oriented) distance between the secant line and the circle centre
3066 Double_t dEpsilon = 1e-2;
3067 Double_t dR = dRadius;
3068 Double_t dD = dDistance;
7495a67b 3069 if(TMath::Abs(dR) < dEpsilon)
3070 {
3071 if(fDebug > 0) printf("AliAnalysisTaskV0sInJets::AreaCircSegment: Error: Too small radius: %f < %f\n", dR, dEpsilon);
3072 return 0.;
3073 }
3074 if(dD >= dR)
7729cc34 3075 return 0.;
7495a67b 3076 if(dD <= -dR)
3077 return TMath::Pi() * dR * dR;
3078 return dR * dR * TMath::ACos(dD / dR) - dD * TMath::Sqrt(dR * dR - dD * dD);
7729cc34 3079}
3080
87e23d3e 3081Bool_t AliAnalysisTaskV0sInJets::IsSelectedForJets(AliAODEvent* fAOD, Double_t dVtxZCut, Double_t dVtxR2Cut, Double_t dCentCutLo, Double_t dCentCutUp, Bool_t bCutDeltaZ, Double_t dDeltaZMax)
7729cc34 3082{
3083// event selection
3084 AliAODVertex* vertex = fAOD->GetPrimaryVertex();
7495a67b 3085 if(!vertex)
7729cc34 3086 return kFALSE;
7495a67b 3087 Int_t iNContribMin = 3;
3088 if(!fbIsPbPb)
3089 iNContribMin = 2;
3090 if(vertex->GetNContributors() < iNContribMin)
7729cc34 3091 return kFALSE;
3092 TString vtxTitle(vertex->GetTitle());
7495a67b 3093 if(vtxTitle.Contains("TPCVertex"))
7729cc34 3094 return kFALSE;
3095 Double_t zVertex = vertex->GetZ();
7495a67b 3096 if(TMath::Abs(zVertex) > dVtxZCut)
7729cc34 3097 return kFALSE;
7495a67b 3098 if(bCutDeltaZ)
3099 {
3100 AliAODVertex* vertexSPD = fAOD->GetPrimaryVertexSPD();
3101 if(!vertexSPD)
7729cc34 3102 {
7729cc34 3103// printf("IsSelectedForJets: Error: No SPD vertex\n");
7495a67b 3104 return kFALSE;
3105 }
3106 Double_t zVertexSPD = vertexSPD->GetZ();
3107 if(TMath::Abs(zVertex - zVertexSPD) > dDeltaZMax)
3108 {
7729cc34 3109// printf("IsSelectedForJets: Rejecting event due to delta z = %f - %f = %f\n",zVertex,zVertexSPD,zVertex-zVertexSPD);
7495a67b 3110 return kFALSE;
7729cc34 3111 }
7495a67b 3112// printf("IsSelectedForJets: Event OK: %f - %f = %f\n",zVertex,zVertexSPD,zVertex-zVertexSPD);
3113 }
7729cc34 3114 Double_t xVertex = vertex->GetX();
3115 Double_t yVertex = vertex->GetY();
7495a67b 3116 Double_t radiusSq = yVertex * yVertex + xVertex * xVertex;
3117 if(radiusSq > dVtxR2Cut)
7729cc34 3118 return kFALSE;
3119 Double_t centrality;
3120// centrality = fAOD->GetHeader()->GetCentrality();
3121 centrality = fAOD->GetHeader()->GetCentralityP()->GetCentralityPercentile("V0M");
7495a67b 3122 if(fbIsPbPb)
3123 {
3124 if(centrality < 0)
3125 return kFALSE;
3126 if((dCentCutUp < 0) || (dCentCutLo < 0) || (dCentCutUp > 100) || (dCentCutLo > 100) || (dCentCutLo > dCentCutUp))
3127 return kFALSE;
3128 if((centrality < dCentCutLo) || (centrality > dCentCutUp))
3129 return kFALSE;
3130 }
3131 else
3132 {
3133 if(centrality != -1)
3134 return kFALSE;
3135 }
7729cc34 3136 return kTRUE;
3137}
3138
3139Int_t AliAnalysisTaskV0sInJets::GetCentralityBinIndex(Double_t centrality)
3140{
3141// returns index of the centrality bin corresponding to the provided value of centrality
7495a67b 3142 if(centrality < 0 || centrality > fgkiCentBinRanges[fgkiNBinsCent - 1])
7729cc34 3143 return -1;
7495a67b 3144 for(Int_t i = 0; i < fgkiNBinsCent; i++)
3145 {
3146 if(centrality <= fgkiCentBinRanges[i])
3147 return i;
3148 }
7729cc34 3149 return -1;
3150}
3151
3152Int_t AliAnalysisTaskV0sInJets::GetCentralityBinEdge(Int_t index)
3153{
3154// returns the upper edge of the centrality bin corresponding to the provided value of index
7495a67b 3155 if(index < 0 || index >= fgkiNBinsCent)
7729cc34 3156 return -1;
3157 return fgkiCentBinRanges[index];
3158}
3159
3160TString AliAnalysisTaskV0sInJets::GetCentBinLabel(Int_t index)
3161{
3162// get string with centrality range for given bin
7495a67b 3163 TString lowerEdge = ((index == 0) ? "0" : Form("%d", GetCentralityBinEdge(index - 1)));
3164 TString upperEdge = Form("%d", GetCentralityBinEdge(index));
3165 return Form("%s-%s %%", lowerEdge.Data(), upperEdge.Data());
7729cc34 3166}
3167
3168Double_t AliAnalysisTaskV0sInJets::MassPeakSigmaOld(Double_t pt, Int_t particle)
3169{
3170// estimation of the sigma of the invariant-mass peak as a function of pT and particle type
7495a67b 3171 switch(particle)
3172 {
7729cc34 3173 case 0: // K0S
7495a67b 3174 return 0.0044 + 0.0004 * (pt - 1.);
7729cc34 3175 break;
3176 case 1: // Lambda
7495a67b 3177 return 0.0023 + 0.00034 * (pt - 1.);
7729cc34 3178 break;
3179 default:
3180 return 0;
3181 break;
7495a67b 3182 }
3183}
3184
3185bool AliAnalysisTaskV0sInJets::CompareClusters(const std::vector<Double_t> cluster1, const std::vector<Double_t> cluster2)
3186{
3187 return (cluster1[1] > cluster2[1]);
7729cc34 3188}