1 /**************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 //-----------------------------------------------------------------
17 // AliAnalysisTaskV2AllChAOD class
18 //-----------------------------------------------------------------
26 #include "THnSparse.h"
29 #include "AliAnalysisTask.h"
30 #include "AliAODTrack.h"
31 #include "AliAODMCParticle.h"
32 #include "AliVParticle.h"
33 #include "AliAODEvent.h"
34 #include "AliAODInputHandler.h"
35 #include "AliAnalysisTaskV2AllChAOD.h"
36 #include "AliAnalysisTaskESDfilter.h"
37 #include "AliAnalysisDataContainer.h"
38 #include "AliSpectraAODTrackCuts.h"
39 #include "AliSpectraAODEventCuts.h"
40 #include "AliPIDCombined.h"
41 #include "AliCentrality.h"
43 #include "AliVEvent.h"
45 #include <TMCProcess.h>
52 ClassImp(AliAnalysisTaskV2AllChAOD)
54 //________________________________________________________________________
55 AliAnalysisTaskV2AllChAOD::AliAnalysisTaskV2AllChAOD(const char *name) : AliAnalysisTaskSE(name),
81 f2partCumQA_vs_Cent(0),
82 f2partCumQB_vs_Cent(0),
88 f2partCumQA_vs_Cent_lq(0),
89 f2partCumQB_vs_Cent_lq(0),
92 f2partCumQA_vs_Cent_sq(0),
93 f2partCumQB_vs_Cent_sq(0),
95 fv2SPGap1A_inclusive_mb(0),
96 fv2SPGap1B_inclusive_mb(0),
97 fv2SPGap1A_inclusive_lq(0),
98 fv2SPGap1B_inclusive_lq(0),
99 fv2SPGap1A_inclusive_sq(0),
100 fv2SPGap1B_inclusive_sq(0),
101 fResSPmc_inclusive(0),
102 fv2SPGap1Amc_inclusive_mb(0),
103 fv2SPGap1Bmc_inclusive_mb(0),
104 fv2SPGap1Amc_inclusive_lq(0),
105 fv2SPGap1Bmc_inclusive_lq(0),
106 fv2SPGap1Amc_inclusive_sq(0),
107 fv2SPGap1Bmc_inclusive_sq(0),
113 fDoCentrSystCentrality(0)
116 for (Int_t i = 0; i< 9; i++){
118 fResSP_vs_Qvec[i] = 0;
134 fv2SPGap1A_lq[i] = 0;
135 fv2SPGap1B_lq[i] = 0;
137 fSinGap1Aq_lq[i] = 0;
138 fCosGap1Aq_lq[i] = 0;
139 fSinGap1Bq_lq[i] = 0;
140 fCosGap1Bq_lq[i] = 0;
148 fv2SPGap1A_sq[i] = 0;
149 fv2SPGap1B_sq[i] = 0;
151 fSinGap1Aq_sq[i] = 0;
152 fCosGap1Aq_sq[i] = 0;
153 fSinGap1Bq_sq[i] = 0;
154 fCosGap1Bq_sq[i] = 0;
163 fRecoEffList=new TList();
164 fRecoEffList->SetOwner();
165 fRecoEffList->SetName("fRecoEffList");
167 // Default constructor
168 DefineInput(0, TChain::Class());
169 DefineOutput(1, TList::Class());
170 DefineOutput(2, AliSpectraAODEventCuts::Class());
171 DefineOutput(3, AliSpectraAODTrackCuts::Class());
172 DefineOutput(4, TList::Class());
173 DefineOutput(5, TList::Class());
176 //________________________________________________________________________
177 void AliAnalysisTaskV2AllChAOD::UserCreateOutputObjects()
179 // create output objects
182 fOutput->SetName("fOutput");
184 fOutput_lq=new TList();
185 fOutput_lq->SetOwner();
186 fOutput_lq->SetName("fOutput_lq");
188 fOutput_sq=new TList();
189 fOutput_sq->SetOwner();
190 fOutput_sq->SetName("fOutput_sq");
192 if (!fTrackCuts) AliFatal("Track Cuts should be set in the steering macro");
193 if (!fEventCuts) AliFatal("Event Cuts should be set in the steering macro");
196 //dimensions of THnSparse for Q vector checks
197 const Int_t nvarev=6;
198 // cent q-rec_perc qvec-rec q-gen_tracks qvec-gen_vzero Nch
199 Int_t binsHistRealEv[nvarev] = { fnCentBins, 100, fnQvecBins, fnQvecBins, fnQvecBins, fnNchBins};
200 Double_t xminHistRealEv[nvarev] = { 0., 0., 0., 0., 0., 0.};
201 Double_t xmaxHistRealEv[nvarev] = { 100., 100., fQvecUpperLim, fQvecUpperLim, fQvecUpperLim, 2000.};
203 THnSparseF* NSparseHistEv = new THnSparseF("NSparseHistEv","NSparseHistEv",nvarev,binsHistRealEv,xminHistRealEv,xmaxHistRealEv);
204 NSparseHistEv->GetAxis(0)->SetTitle(Form("%s cent",fEventCuts->GetCentralityMethod().Data()));
205 NSparseHistEv->GetAxis(0)->SetName(Form("%s_cent",fEventCuts->GetCentralityMethod().Data()));
207 NSparseHistEv->GetAxis(1)->SetTitle("q-vec rec percentile");
208 NSparseHistEv->GetAxis(1)->SetName("Qrec_perc");
210 NSparseHistEv->GetAxis(2)->SetTitle("q-vec rec");
211 NSparseHistEv->GetAxis(2)->SetName("Qrec");
213 NSparseHistEv->GetAxis(3)->SetTitle("q-vec gen tracks");
214 NSparseHistEv->GetAxis(3)->SetName("Qgen_tracks");
216 NSparseHistEv->GetAxis(4)->SetTitle("q-vec gen vzero");
217 NSparseHistEv->GetAxis(4)->SetName("Qgen_vzero");
219 NSparseHistEv->GetAxis(5)->SetTitle("Ncharged");
220 NSparseHistEv->GetAxis(5)->SetName("Nch");
221 fOutput->Add(NSparseHistEv);
224 fCentrality = new TH1D("fCentrality", "centrality distribution; centrality", 200, 0., 100);
225 fOutput->Add(fCentrality);
227 // binning common to all the THn
228 //change it according to your needs + move it to global variables -> setter/getter
229 // Double_t ptBins[] = {0., 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.4, 2.8, 3.2, 3.6, 4.0, 4.5, 5.0, 5.5, 6.0, 7.0, 8.0, 9.0, 10.0, 12.0, 14.0, 16.0, 20.0};
230 // const Int_t nptBins = 31;
231 Double_t ptBins[] = {0., 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 3.0, 3.4, 3.8, 4.2, 4.6, 5.0, 5.5, 6.0, 7.0, 8.0, 9.0, 10.0, 12.0, 14.0, 16.0, 20.0};
232 const Int_t nptBins = 33;
234 fResSP = new TProfile("fResSP", "Resolution; centrality; Resolution", 9, -0.5, 8.5);
235 fOutput->Add(fResSP);
237 fResSP_vs_Cent = new TProfile("fResSP_vs_Cent", "Resolution; centrality; Resolution", 20., 0., 100.);
238 fOutput->Add(fResSP_vs_Cent);
240 f2partCumQA_vs_Cent = new TProfile("f2partCumQA_vs_Cent", "Resolution; centrality; Resolution", 100., 0., 100.);
241 fOutput->Add(f2partCumQA_vs_Cent);
243 f2partCumQB_vs_Cent = new TProfile("f2partCumQB_vs_Cent", "Resolution; centrality; Resolution", 100., 0., 100.);
244 fOutput->Add(f2partCumQB_vs_Cent);
246 fEta_vs_Phi_bef = new TH2D("fEta_vs_Phi_bef","eta vs phi distribution before eta gap;#eta;#phi",200.,-1.,1.,175.,0.,7.);
247 fOutput->Add(fEta_vs_Phi_bef);
249 fEta_vs_PhiA = new TH2D("fEta_vs_PhiA","eta vs phi distribution;#eta;#phi",200.,-1.,1.,175.,0.,7.);
250 fOutput->Add(fEta_vs_PhiA);
252 fEta_vs_PhiB = new TH2D("fEta_vs_PhiB","eta vs phi distribution;#eta;#phi",200.,-1.,1.,175.,0.,7.);
253 fOutput->Add(fEta_vs_PhiB);
256 fResSP_inclusive = new TProfile("fResSP_inclusive", "Resolution; ese; Resolution", 3, 0., 3.);
257 fOutput->Add(fResSP_inclusive);
259 fv2SPGap1A_inclusive_mb = new TProfile("fv2SPGap1A_inclusive_mb", "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
260 fOutput->Add(fv2SPGap1A_inclusive_mb);
262 fv2SPGap1B_inclusive_mb = new TProfile("fv2SPGap1B_inclusive_mb", "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
263 fOutput->Add(fv2SPGap1B_inclusive_mb);
267 fResSP_lq = new TProfile("fResSP_lq", "Resolution; centrality; Resolution", 9, -0.5, 8.5);
268 fOutput_lq->Add(fResSP_lq);
270 fResSP_vs_Cent_lq = new TProfile("fResSP_vs_Cent_lq", "Resolution; centrality; Resolution", 20., 0., 100.);
271 fOutput_lq->Add(fResSP_vs_Cent_lq);
273 f2partCumQA_vs_Cent_lq = new TProfile("f2partCumQA_vs_Cent_lq", "Resolution; centrality; Resolution", 100., 0., 100.);
274 fOutput_lq->Add(f2partCumQA_vs_Cent_lq);
276 f2partCumQB_vs_Cent_lq = new TProfile("f2partCumQB_vs_Cent_lq", "Resolution; centrality; Resolution", 100., 0., 100.);
277 fOutput_lq->Add(f2partCumQB_vs_Cent_lq);
280 fv2SPGap1A_inclusive_lq = new TProfile("fv2SPGap1A_inclusive_lq", "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
281 fOutput_lq->Add(fv2SPGap1A_inclusive_lq);
283 fv2SPGap1B_inclusive_lq = new TProfile("fv2SPGap1B_inclusive_lq", "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
284 fOutput_lq->Add(fv2SPGap1B_inclusive_lq);
287 fResSP_sq = new TProfile("fResSP_sq", "Resolution; centrality; Resolution", 9, -0.5, 8.5);
288 fOutput_sq->Add(fResSP_sq);
290 fResSP_vs_Cent_sq = new TProfile("fResSP_vs_Cent_sq", "Resolution; centrality; Resolution", 20., 0., 100.);
291 fOutput_sq->Add(fResSP_vs_Cent_sq);
293 f2partCumQA_vs_Cent_sq = new TProfile("f2partCumQA_vs_Cent_sq", "Resolution; centrality; Resolution", 100., 0., 100.);
294 fOutput_sq->Add(f2partCumQA_vs_Cent_sq);
296 f2partCumQB_vs_Cent_sq = new TProfile("f2partCumQB_vs_Cent_sq", "Resolution; centrality; Resolution", 100., 0., 100.);
297 fOutput_sq->Add(f2partCumQB_vs_Cent_sq);
300 fv2SPGap1A_inclusive_sq = new TProfile("fv2SPGap1A_inclusive_sq", "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
301 fOutput_sq->Add(fv2SPGap1A_inclusive_sq);
303 fv2SPGap1B_inclusive_sq = new TProfile("fv2SPGap1B_inclusive_sq", "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
304 fOutput_sq->Add(fv2SPGap1B_inclusive_sq);
306 for (Int_t iC = 0; iC < 9; iC++){
308 fResSP_vs_Qvec[iC] = new TProfile(Form("fResSP_vs_Qvec_%d", iC), "Resolution; Qvec (V0A); Resolution", 10., 0., 100.);
309 fOutput->Add(fResSP_vs_Qvec[iC]);
311 fv2SPGap1A[iC] = new TProfile(Form("fv2SPGap1A_%d", iC), "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
312 fOutput->Add(fv2SPGap1A[iC]);
314 fv2SPGap1B[iC] = new TProfile(Form("fv2SPGap1B_%d", iC), "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
315 fOutput->Add(fv2SPGap1B[iC]);
317 fSinGap1Aq[iC] = new TProfile(Form("fSinGap1Aq_%d", iC), ";p_{T} (GeV/c);#LT sin(2*#phi) #GT", nptBins, ptBins);
318 fOutput->Add(fSinGap1Aq[iC]);
320 fCosGap1Aq[iC] = new TProfile(Form("fCosGap1Aq_%d", iC), ";p_{T} (GeV/c);#LT cos(2*#phi) #GT", nptBins, ptBins);
321 fOutput->Add(fCosGap1Aq[iC]);
323 fSinGap1Bq[iC] = new TProfile(Form("fSinGap1Bq_%d", iC), ";p_{T} (GeV/c);#LT sin(2*#phi) #GT", nptBins, ptBins);
324 fOutput->Add(fSinGap1Bq[iC]);
326 fCosGap1Bq[iC] = new TProfile(Form("fCosGap1Bq_%d", iC), ";p_{T} (GeV/c);#LT cos(2*#phi) #GT", nptBins, ptBins);
327 fOutput->Add(fCosGap1Bq[iC]);
329 fSinGap1A[iC] = new TProfile(Form("fSinGap1A_%d", iC), ";p_{T} (GeV/c);#LT sin(2*#phi) #GT", nptBins, ptBins);
330 fOutput->Add(fSinGap1A[iC]);
332 fCosGap1A[iC] = new TProfile(Form("fCosGap1A_%d", iC), ";p_{T} (GeV/c);#LT cos(2*#phi) #GT", nptBins, ptBins);
333 fOutput->Add(fCosGap1A[iC]);
335 fSinGap1B[iC] = new TProfile(Form("fSinGap1B_%d", iC), ";p_{T} (GeV/c);#LT sin(2*#phi) #GT", nptBins, ptBins);
336 fOutput->Add(fSinGap1B[iC]);
338 fCosGap1B[iC] = new TProfile(Form("fCosGap1B_%d", iC), ";p_{T} (GeV/c);#LT cos(2*#phi) #GT", nptBins, ptBins);
339 fOutput->Add(fCosGap1B[iC]);
342 fv2SPGap1A_lq[iC] = new TProfile(Form("fv2SPGap1A_lq_%d", iC), "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
343 fOutput_lq->Add(fv2SPGap1A_lq[iC]);
345 fv2SPGap1B_lq[iC] = new TProfile(Form("fv2SPGap1B_lq_%d", iC), "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
346 fOutput_lq->Add(fv2SPGap1B_lq[iC]);
348 fSinGap1Aq_lq[iC] = new TProfile(Form("fSinGap1Aq_lq_%d", iC), ";p_{T} (GeV/c);#LT sin(2*#phi) #GT", nptBins, ptBins);
349 fOutput_lq->Add(fSinGap1Aq_lq[iC]);
351 fCosGap1Aq_lq[iC] = new TProfile(Form("fCosGap1Aq_lq_%d", iC), ";p_{T} (GeV/c);#LT cos(2*#phi) #GT", nptBins, ptBins);
352 fOutput_lq->Add(fCosGap1Aq_lq[iC]);
354 fSinGap1Bq_lq[iC] = new TProfile(Form("fSinGap1Bq_lq_%d", iC), ";p_{T} (GeV/c);#LT sin(2*#phi) #GT", nptBins, ptBins);
355 fOutput_lq->Add(fSinGap1Bq_lq[iC]);
357 fCosGap1Bq_lq[iC] = new TProfile(Form("fCosGap1Bq_lq_%d", iC), ";p_{T} (GeV/c);#LT cos(2*#phi) #GT", nptBins, ptBins);
358 fOutput_lq->Add(fCosGap1Bq_lq[iC]);
360 fSinGap1A_lq[iC] = new TProfile(Form("fSinGap1A_lq_%d", iC), ";p_{T} (GeV/c);#LT sin(2*#phi) #GT", nptBins, ptBins);
361 fOutput_lq->Add(fSinGap1A_lq[iC]);
363 fCosGap1A_lq[iC] = new TProfile(Form("fCosGap1A_lq_%d", iC), ";p_{T} (GeV/c);#LT cos(2*#phi) #GT", nptBins, ptBins);
364 fOutput_lq->Add(fCosGap1A_lq[iC]);
366 fSinGap1B_lq[iC] = new TProfile(Form("fSinGap1B_lq_%d", iC), ";p_{T} (GeV/c);#LT sin(2*#phi) #GT", nptBins, ptBins);
367 fOutput_lq->Add(fSinGap1B_lq[iC]);
369 fCosGap1B_lq[iC] = new TProfile(Form("fCosGap1B_lq_%d", iC), ";p_{T} (GeV/c);#LT cos(2*#phi) #GT", nptBins, ptBins);
370 fOutput_lq->Add(fCosGap1B_lq[iC]);
373 fv2SPGap1A_sq[iC] = new TProfile(Form("fv2SPGap1A_sq_%d", iC), "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
374 fOutput_sq->Add(fv2SPGap1A_sq[iC]);
376 fv2SPGap1B_sq[iC] = new TProfile(Form("fv2SPGap1B_sq_%d", iC), "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
377 fOutput_sq->Add(fv2SPGap1B_sq[iC]);
379 fSinGap1Aq_sq[iC] = new TProfile(Form("fSinGap1Aq_sq_%d", iC), ";p_{T} (GeV/c);#LT sin(2*#phi) #GT", nptBins, ptBins);
380 fOutput_sq->Add(fSinGap1Aq_sq[iC]);
382 fCosGap1Aq_sq[iC] = new TProfile(Form("fCosGap1Aq_sq_%d", iC), ";p_{T} (GeV/c);#LT cos(2*#phi) #GT", nptBins, ptBins);
383 fOutput_sq->Add(fCosGap1Aq_sq[iC]);
385 fSinGap1Bq_sq[iC] = new TProfile(Form("fSinGap1Bq_sq_%d", iC), ";p_{T} (GeV/c);#LT sin(2*#phi) #GT", nptBins, ptBins);
386 fOutput_sq->Add(fSinGap1Bq_sq[iC]);
388 fCosGap1Bq_sq[iC] = new TProfile(Form("fCosGap1Bq_sq_%d", iC), "p_{T} (GeV/c);#LT cos(2*#phi) #GT", nptBins, ptBins);
389 fOutput_sq->Add(fCosGap1Bq_sq[iC]);
391 fSinGap1A_sq[iC] = new TProfile(Form("fSinGap1A_sq_%d", iC), ";p_{T} (GeV/c);#LT sin(2*#phi) #GT", nptBins, ptBins);
392 fOutput_sq->Add(fSinGap1A_sq[iC]);
394 fCosGap1A_sq[iC] = new TProfile(Form("fCosGap1A_sq_%d", iC), ";p_{T} (GeV/c);#LT cos(2*#phi) #GT", nptBins, ptBins);
395 fOutput_sq->Add(fCosGap1A_sq[iC]);
397 fSinGap1B_sq[iC] = new TProfile(Form("fSinGap1B_sq_%d", iC), ";p_{T} (GeV/c);#LT sin(2*#phi) #GT", nptBins, ptBins);
398 fOutput_sq->Add(fSinGap1B_sq[iC]);
400 fCosGap1B_sq[iC] = new TProfile(Form("fCosGap1B_sq_%d", iC), "p_{T} (GeV/c);#LT cos(2*#phi) #GT", nptBins, ptBins);
401 fOutput_sq->Add(fCosGap1B_sq[iC]);
405 fResSPmc_inclusive = new TProfile("fResSPmc_inclusive", "Resolution; ese; Resolution", 3, 0., 3.);
406 fOutput->Add(fResSPmc_inclusive);
408 fv2SPGap1Amc_inclusive_mb = new TProfile("fv2SPGap1Amc_inclusive_mb", "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
409 fOutput->Add(fv2SPGap1Amc_inclusive_mb);
411 fv2SPGap1Bmc_inclusive_mb = new TProfile("fv2SPGap1Bmc_inclusive_mb", "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
412 fOutput->Add(fv2SPGap1Bmc_inclusive_mb);
415 fv2SPGap1Amc_inclusive_lq = new TProfile("fv2SPGap1Amc_inclusive_lq", "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
416 fOutput_lq->Add(fv2SPGap1Amc_inclusive_lq);
418 fv2SPGap1Bmc_inclusive_lq = new TProfile("fv2SPGap1Bmc_inclusive_lq", "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
419 fOutput_lq->Add(fv2SPGap1Bmc_inclusive_lq);
422 fv2SPGap1Amc_inclusive_sq = new TProfile("fv2SPGap1Amc_inclusive_sq", "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
423 fOutput_sq->Add(fv2SPGap1Amc_inclusive_sq);
425 fv2SPGap1Bmc_inclusive_sq = new TProfile("fv2SPGap1Bmc_inclusive_sq", "v_{2}{2} vs p_{T}; p_{T} (GeV/c); v_{2}{2}", nptBins, ptBins);
426 fOutput_sq->Add(fv2SPGap1Bmc_inclusive_sq);
430 PostData(1, fOutput );
431 PostData(2, fEventCuts);
432 PostData(3, fTrackCuts);
433 PostData(4, fOutput_lq );
434 PostData(5, fOutput_sq );
437 //________________________________________________________________________
439 void AliAnalysisTaskV2AllChAOD::UserExec(Option_t *)
441 //Printf("An event");
443 fAOD = dynamic_cast<AliAODEvent*>(fInputEvent);
445 AliWarning("ERROR: AliAODEvent not available \n");
449 if (strcmp(fAOD->ClassName(), "AliAODEvent"))
451 AliFatal("Not processing AODs");
454 if(!fEventCuts->IsSelected(fAOD,fTrackCuts))return;//event selection
456 //Get q-vector percentile.
458 if(fIsMC && fQvecGen) Qvec = fEventCuts->GetQvecPercentileMC(fVZEROside, fQgenType);
459 else Qvec = fEventCuts->GetQvecPercentile(fVZEROside);
462 Double_t Cent=(fDoCentrSystCentrality)?1.01*fEventCuts->GetCent():fEventCuts->GetCent();
463 fCentrality->Fill(Cent);
466 if ((Cent > 0) && (Cent <= 5.0))
468 else if ((Cent > 5.0) && (Cent <= 10.0))
470 else if ((Cent > 10.0) && (Cent <= 20.0))
472 else if ((Cent > 20.0) && (Cent <= 30.0))
474 else if ((Cent > 30.0) && (Cent <= 40.0))
476 else if ((Cent > 40.0) && (Cent <= 50.0))
478 else if ((Cent > 50.0) && (Cent <= 60.0))
480 else if ((Cent > 60.0) && (Cent <= 70.0))
482 else if ((Cent > 70.0) && (Cent <= 80.0))
485 if(fIsMC) MCclosure(Qvec); // fill mc histograms for montecarlo closure
487 Double_t QxGap1A = 0., QyGap1A = 0.;
488 Double_t QxGap1B = 0., QyGap1B = 0.;
489 Int_t multGap1A = 0, multGap1B = 0;
491 for (Int_t loop = 0; loop < 2; loop++){
493 //main loop on tracks
494 for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++) {
495 AliAODTrack* track = fAOD->GetTrack(iTracks);
496 if(fCharge != 0 && track->Charge() != fCharge) continue;//if fCharge != 0 only select fCharge
497 if (!fTrackCuts->IsSelected(track,kTRUE)) continue; //track selection (rapidity selection NOT in the standard cuts)
499 fEta_vs_Phi_bef->Fill( track->Eta(), track->Phi() );
503 // 2) reject randomly tracks at high pT until the reconstruction efficiency becomes flat (add the following before the loop == 0 part): (mail by Alexandru)
505 Double_t recoEff = GetRecoEff(track->Pt(), centV0);
507 cout<<"No reconstruction efficiency!"<<endl;
511 Double_t rndPt = gRandom->Rndm();
512 // cout<<"rndPt: "<<rndPt<<endl;
514 Double_t minRecPt = GetRecoEff(0.200001, centV0);
515 // cout<<"minRecPt: "<<minRecPt<<endl;
517 if (rndPt > minRecPt/recoEff){
518 // cout<<"Track rejected: "<<iTracks<<" from "<<fAOD->GetNumberOfTracks()<<endl;
526 if (track->Eta() > fEtaGapMax){
527 QxGap1A += TMath::Cos(2.*track->Phi());
528 QyGap1A += TMath::Sin(2.*track->Phi());
531 fSinGap1Aq[centV0]->Fill(track->Pt(), TMath::Sin(2.*track->Phi()));
532 fCosGap1Aq[centV0]->Fill(track->Pt(), TMath::Cos(2.*track->Phi()));
534 fEta_vs_PhiA->Fill( track->Eta(), track->Phi() );
536 if (Qvec > fCutLargeQperc && Qvec < 100.){
537 fSinGap1Aq_lq[centV0]->Fill(track->Pt(), TMath::Sin(2.*track->Phi()));
538 fCosGap1Aq_lq[centV0]->Fill(track->Pt(), TMath::Cos(2.*track->Phi()));
541 if (Qvec > 0. && Qvec < fCutSmallQperc){
542 fSinGap1Aq_sq[centV0]->Fill(track->Pt(), TMath::Sin(2.*track->Phi()));
543 fCosGap1Aq_sq[centV0]->Fill(track->Pt(), TMath::Cos(2.*track->Phi()));
548 if (track->Eta() < fEtaGapMin){
549 QxGap1B += TMath::Cos(2.*track->Phi());
550 QyGap1B += TMath::Sin(2.*track->Phi());
553 fCosGap1Bq[centV0]->Fill(track->Pt(), TMath::Cos(2.*track->Phi()));
554 fSinGap1Bq[centV0]->Fill(track->Pt(), TMath::Sin(2.*track->Phi()));
556 fEta_vs_PhiB->Fill( track->Eta(), track->Phi() );
558 if (Qvec > fCutLargeQperc && Qvec < 100.){
559 fSinGap1Bq_lq[centV0]->Fill(track->Pt(), TMath::Sin(2.*track->Phi()));
560 fCosGap1Bq_lq[centV0]->Fill(track->Pt(), TMath::Cos(2.*track->Phi()));
563 if (Qvec > 0. && Qvec < fCutSmallQperc){
564 fSinGap1Bq_sq[centV0]->Fill(track->Pt(), TMath::Sin(2.*track->Phi()));
565 fCosGap1Bq_sq[centV0]->Fill(track->Pt(), TMath::Cos(2.*track->Phi()));
572 //eval v2 scalar product
573 if (track->Eta() < fEtaGapMin && multGap1A > 0){
574 Double_t v2SPGap1A = (TMath::Cos(2.*track->Phi())*QxGap1A + TMath::Sin(2.*track->Phi())*QyGap1A)/(Double_t)multGap1A;
575 fv2SPGap1A[centV0]->Fill(track->Pt(), v2SPGap1A);
577 fv2SPGap1A_inclusive_mb->Fill(track->Pt(), v2SPGap1A); //mb v2 for mc closure
579 fSinGap1A[centV0]->Fill(track->Pt(), TMath::Sin(2.*track->Phi()));
580 fCosGap1A[centV0]->Fill(track->Pt(), TMath::Cos(2.*track->Phi()));
582 if (Qvec > fCutLargeQperc && Qvec < 100.){
583 fv2SPGap1A_lq[centV0]->Fill(track->Pt(), v2SPGap1A);
584 fSinGap1A_lq[centV0]->Fill(track->Pt(), TMath::Sin(2.*track->Phi()));
585 fCosGap1A_lq[centV0]->Fill(track->Pt(), TMath::Cos(2.*track->Phi()));
587 fv2SPGap1A_inclusive_lq->Fill(track->Pt(), v2SPGap1A); //lq v2 for mc closure
590 if (Qvec > 0. && Qvec < fCutSmallQperc){
591 fv2SPGap1A_sq[centV0]->Fill(track->Pt(), v2SPGap1A);
592 fSinGap1A_sq[centV0]->Fill(track->Pt(), TMath::Sin(2.*track->Phi()));
593 fCosGap1A_sq[centV0]->Fill(track->Pt(), TMath::Cos(2.*track->Phi()));
595 fv2SPGap1A_inclusive_sq->Fill(track->Pt(), v2SPGap1A); //sq v2 for mc closure
600 if (track->Eta() > fEtaGapMax && multGap1B > 0){
601 Double_t v2SPGap1B = (TMath::Cos(2.*track->Phi())*QxGap1B + TMath::Sin(2.*track->Phi())*QyGap1B)/(Double_t)multGap1B;
602 fv2SPGap1B[centV0]->Fill(track->Pt(), v2SPGap1B);
604 fv2SPGap1B_inclusive_mb->Fill(track->Pt(), v2SPGap1B); //mb v2 for mc closure
606 fCosGap1B[centV0]->Fill(track->Pt(), TMath::Cos(2.*track->Phi()));
607 fSinGap1B[centV0]->Fill(track->Pt(), TMath::Sin(2.*track->Phi()));
609 if (Qvec > fCutLargeQperc && Qvec < 100.){
610 fv2SPGap1B_lq[centV0]->Fill(track->Pt(), v2SPGap1B);
611 fSinGap1B_lq[centV0]->Fill(track->Pt(), TMath::Sin(2.*track->Phi()));
612 fCosGap1B_lq[centV0]->Fill(track->Pt(), TMath::Cos(2.*track->Phi()));
614 fv2SPGap1B_inclusive_lq->Fill(track->Pt(), v2SPGap1B); //lq v2 for mc closure
617 if (Qvec > 0. && Qvec < fCutSmallQperc){
618 fv2SPGap1B_sq[centV0]->Fill(track->Pt(), v2SPGap1B);
619 fSinGap1B_sq[centV0]->Fill(track->Pt(), TMath::Sin(2.*track->Phi()));
620 fCosGap1B_sq[centV0]->Fill(track->Pt(), TMath::Cos(2.*track->Phi()));
622 fv2SPGap1B_inclusive_sq->Fill(track->Pt(), v2SPGap1B); //sq v2 for mc closure
627 } // end loop on tracks
631 if (multGap1A > 0 && multGap1B > 0){
632 Double_t res = (QxGap1A*QxGap1B + QyGap1A*QyGap1B)/(Double_t)multGap1A/(Double_t)multGap1B;
633 fResSP->Fill((Double_t)centV0, res);
635 fResSP_inclusive->Fill(0., res); //mb v2 for mc closure
636 fResSP_vs_Cent->Fill(Cent, res);
637 fResSP_vs_Qvec[centV0]->Fill(Qvec,res);
639 Double_t f2partCumQA = -999.;
641 f2partCumQA = ( ( (QxGap1A*QxGap1A + QyGap1A*QyGap1A) - (Double_t)multGap1A ) / ((Double_t)multGap1A*((Double_t)multGap1A-1)) );
642 if(f2partCumQA>0)f2partCumQA_vs_Cent->Fill((Double_t)Cent,f2partCumQA);
644 Double_t f2partCumQB = -999.;
646 f2partCumQB = ( ( (QxGap1B*QxGap1B + QyGap1B*QyGap1B) - (Double_t)multGap1B ) / ((Double_t)multGap1B*((Double_t)multGap1B-1)) );
647 if(f2partCumQB>0)f2partCumQB_vs_Cent->Fill((Double_t)Cent,f2partCumQB);
649 if (Qvec > fCutLargeQperc && Qvec < 100.){
650 fResSP_lq->Fill((Double_t)centV0, res);
651 fResSP_vs_Cent_lq->Fill(Cent, res);
652 if(f2partCumQA>0)f2partCumQA_vs_Cent_lq->Fill((Double_t)Cent,f2partCumQA);
653 if(f2partCumQB>0)f2partCumQB_vs_Cent_lq->Fill((Double_t)Cent,f2partCumQB);
655 fResSP_inclusive->Fill(1., res); //lq v2 for mc closure
658 if (Qvec > 0. && Qvec < fCutSmallQperc){
659 fResSP_sq->Fill((Double_t)centV0, res);
660 fResSP_vs_Cent_sq->Fill(Cent, res);
661 if(f2partCumQA>0)f2partCumQA_vs_Cent_sq->Fill((Double_t)Cent,f2partCumQA);
662 if(f2partCumQB>0)f2partCumQB_vs_Cent_sq->Fill((Double_t)Cent,f2partCumQB);
664 fResSP_inclusive->Fill(2., res); //sq v2 for mc closure
666 }// end multiplicity if
673 varEv[1]=(Double_t)Qvec; // qvec_rec_perc
675 Double_t qvzero = 0.;
676 if(fVZEROside==0)qvzero=(Double_t)fEventCuts->GetqV0A();
677 else if (fVZEROside==1)qvzero=(Double_t)fEventCuts->GetqV0C(); // qvec_rec
678 varEv[2]=(Double_t)qvzero; // qvec from VZERO
680 Double_t qgen_tracks = (Double_t)fEventCuts->CalculateQVectorMC(fVZEROside, 0);
681 varEv[3]= (Double_t)qgen_tracks;
683 Double_t qgen_vzero = (Double_t)fEventCuts->CalculateQVectorMC(fVZEROside, 1);
684 varEv[4]= (Double_t)qgen_vzero;
686 varEv[5]=(Double_t)fEventCuts->GetNch(); // Nch
688 ((THnSparseF*)fOutput->FindObject("NSparseHistEv"))->Fill(varEv);//event loop
693 PostData(1, fOutput );
694 PostData(2, fEventCuts);
695 PostData(3, fTrackCuts);
696 PostData(4, fOutput_lq );
697 PostData(5, fOutput_sq );
700 //_________________________________________________________________
701 Bool_t AliAnalysisTaskV2AllChAOD::GetDCA(const AliAODTrack* trk, Double_t * p){
703 //AliAODTrack::DCA(): for newest AOD fTrack->DCA() always gives -999. This should fix.
704 //FIXME should update EventCuts?
705 //FIXME add track->GetXYZ(p) method
707 double xyz[3],cov[3];
709 if (!trk->GetXYZ(xyz)) { // dca is not stored
710 AliExternalTrackParam etp;
711 etp.CopyFromVTrack(trk);
712 AliVEvent* ev = (AliVEvent*)trk->GetEvent();
713 if (!ev) {/*printf("Event is not connected to the track\n");*/ return kFALSE;}
714 if (!etp.PropagateToDCA(ev->GetPrimaryVertex(), ev->GetMagneticField(),999,xyz,cov)) return kFALSE; // failed, track is too far from vertex
722 //_________________________________________________________________
723 void AliAnalysisTaskV2AllChAOD::MCclosure(Double_t qvec){
724 // First do MC to fill up the MC particle array
726 TClonesArray *arrayMC = 0;
729 arrayMC = (TClonesArray*) fAOD->GetList()->FindObject(AliAODMCParticle::StdBranchName());
731 AliFatal("Error: MC particles branch not found!\n");
734 Double_t QxGap1Amc = 0., QyGap1Amc = 0.;
735 Double_t QxGap1Bmc = 0., QyGap1Bmc = 0.;
736 Int_t multGap1Amc = 0, multGap1Bmc = 0;
738 for (Int_t loop = 0; loop < 2; loop++){
740 Int_t nMC = arrayMC->GetEntries();
742 for (Int_t iMC = 0; iMC < nMC; iMC++)
744 AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(iMC);
745 if(!partMC->Charge()) continue;//Skip neutrals
746 if(fCharge != 0 && partMC->Charge()*fCharge < 0.) continue;//if fCharge != 0 only select fCharge
748 if (!(partMC->IsPhysicalPrimary()))
751 if(partMC->Eta()<fTrackCuts->GetEtaMin() || partMC->Eta()>fTrackCuts->GetEtaMax()) continue;
753 //Printf("a particle");
758 if (partMC->Eta() > fEtaGapMax){
759 QxGap1Amc += TMath::Cos(2.*partMC->Phi());
760 QyGap1Amc += TMath::Sin(2.*partMC->Phi());
764 if (partMC->Eta() < fEtaGapMin){
765 QxGap1Bmc += TMath::Cos(2.*partMC->Phi());
766 QyGap1Bmc += TMath::Sin(2.*partMC->Phi());
772 //eval v2 scalar product
773 if (partMC->Eta() < fEtaGapMin && multGap1Amc > 0){
774 Double_t v2SPGap1Amc = (TMath::Cos(2.*partMC->Phi())*QxGap1Amc + TMath::Sin(2.*partMC->Phi())*QyGap1Amc)/(Double_t)multGap1Amc;
775 fv2SPGap1Amc_inclusive_mb->Fill(partMC->Pt(), v2SPGap1Amc);
777 if (qvec > fCutLargeQperc && qvec < 100.){
778 fv2SPGap1Amc_inclusive_lq->Fill(partMC->Pt(), v2SPGap1Amc);
781 if (qvec > 0. && qvec < fCutSmallQperc){
782 fv2SPGap1Amc_inclusive_sq->Fill(partMC->Pt(), v2SPGap1Amc);
787 if (partMC->Eta() > fEtaGapMax && multGap1Bmc > 0){
788 Double_t v2SPGap1Bmc = (TMath::Cos(2.*partMC->Phi())*QxGap1Bmc + TMath::Sin(2.*partMC->Phi())*QyGap1Bmc)/(Double_t)multGap1Bmc;
789 fv2SPGap1Bmc_inclusive_mb->Fill(partMC->Pt(), v2SPGap1Bmc);
791 if (qvec > fCutLargeQperc && qvec < 100.){
792 fv2SPGap1Bmc_inclusive_lq->Fill(partMC->Pt(), v2SPGap1Bmc);
795 if (qvec > 0. && qvec < fCutSmallQperc){
796 fv2SPGap1Bmc_inclusive_sq->Fill(partMC->Pt(), v2SPGap1Bmc);
803 } // end loop on partMCs
806 if (multGap1Amc > 0 && multGap1Bmc > 0){
807 Double_t resmc = (QxGap1Amc*QxGap1Bmc + QyGap1Amc*QyGap1Bmc)/(Double_t)multGap1Amc/(Double_t)multGap1Bmc;
808 fResSPmc_inclusive->Fill(0.,resmc);
810 if (qvec > fCutLargeQperc && qvec < 100.){
811 fResSPmc_inclusive->Fill(1.,resmc);
814 if (qvec > 0. && qvec < fCutSmallQperc){
815 fResSPmc_inclusive->Fill(2.,resmc);
823 //_________________________________________________________________
824 Double_t AliAnalysisTaskV2AllChAOD::GetRecoEff(Double_t pt, Int_t iC){
828 if(pt<0.2 || pt>100.) return 1.;
830 // // // //spectra ese binning
831 // // // //const Double_t ptBins[] = {0.20,0.30,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.2,1.4,1.6,1.8,2.0,2.4,2.8,3.2,3.6,4.0,5.0,6.0,7.0,8.0,9.0,10.,12.,15.,20.,25.,30.,35.,40.,50.,75.,100.};
832 // // // //const Int_t nptBins=34;
834 const Double_t fEpsilon=0.000001;
836 TH1F *h = (TH1F*)fRecoEffList->At(iC);
838 Int_t bin = h->FindBin(pt);
840 Double_t lowlim = h->GetBinLowEdge(bin);
841 Double_t uplim = h->GetBinLowEdge(bin) + h->GetBinWidth(bin);
843 if( pt>lowlim && pt<uplim ) return h->GetBinContent(bin);
844 if( pt == lowlim ) return h->GetBinContent( h->FindBin(pt+fEpsilon) );
845 if( pt == uplim ) return h->GetBinContent( h->FindBin(pt-fEpsilon) );
850 //_________________________________________________________________
851 void AliAnalysisTaskV2AllChAOD::Terminate(Option_t *)