]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGCF/EBYE/BalanceFunctions/AliAnalysisTaskBFPsi.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGCF / EBYE / BalanceFunctions / AliAnalysisTaskBFPsi.cxx
CommitLineData
c683985a 1#include "TChain.h"
2#include "TList.h"
3#include "TCanvas.h"
4#include "TLorentzVector.h"
5#include "TGraphErrors.h"
6#include "TH1F.h"
7#include "TH2F.h"
8#include "TH3F.h"
9#include "TH2D.h"
10#include "TH3D.h"
11#include "TArrayF.h"
12#include "TF1.h"
13#include "TRandom.h"
3b408588 14#include "TROOT.h"
c683985a 15
16#include "AliAnalysisTaskSE.h"
17#include "AliAnalysisManager.h"
18
19#include "AliESDVertex.h"
20#include "AliESDEvent.h"
21#include "AliESDInputHandler.h"
22#include "AliAODEvent.h"
23#include "AliAODTrack.h"
24#include "AliAODInputHandler.h"
25#include "AliAODMCParticle.h"
26#include "AliCollisionGeometry.h"
27#include "AliGenEventHeader.h"
28#include "AliMCEventHandler.h"
29#include "AliMCEvent.h"
30#include "AliStack.h"
31#include "AliESDtrackCuts.h"
32#include "AliEventplane.h"
33#include "AliTHn.h"
34#include "AliLog.h"
35#include "AliAnalysisUtils.h"
36
37#include "AliEventPoolManager.h"
38
39#include "AliPID.h"
40#include "AliPIDResponse.h"
41#include "AliPIDCombined.h"
42
43#include "AliAnalysisTaskBFPsi.h"
44#include "AliBalancePsi.h"
45#include "AliAnalysisTaskTriggeredBF.h"
46
47
48// Analysis task for the BF vs Psi code
49// Authors: Panos.Christakoglou@nikhef.nl
50
51using std::cout;
52using std::endl;
53
54ClassImp(AliAnalysisTaskBFPsi)
55
56//________________________________________________________________________
57AliAnalysisTaskBFPsi::AliAnalysisTaskBFPsi(const char *name)
58: AliAnalysisTaskSE(name),
59 fDebugLevel(kFALSE),
e573a392 60 fArrayMC(0),
c683985a 61 fBalance(0),
62 fRunShuffling(kFALSE),
63 fShuffledBalance(0),
64 fRunMixing(kFALSE),
65 fRunMixingEventPlane(kFALSE),
66 fMixingTracks(50000),
67 fMixedBalance(0),
68 fPoolMgr(0),
69 fList(0),
70 fListBF(0),
71 fListBFS(0),
72 fListBFM(0),
73 fHistListPIDQA(0),
74 fHistEventStats(0),
75 fHistCentStats(0),
76 fHistCentStatsUsed(0),
77 fHistTriggerStats(0),
78 fHistTrackStats(0),
79 fHistVx(0),
80 fHistVy(0),
81 fHistVz(0),
82 fHistTPCvsVZEROMultiplicity(0),
83 fHistVZEROSignal(0),
84 fHistEventPlane(0),
85 fHistClus(0),
86 fHistDCA(0),
87 fHistChi2(0),
88 fHistPt(0),
89 fHistEta(0),
90 fHistRapidity(0),
91 fHistPhi(0),
92 fHistEtaPhiPos(0),
93 fHistEtaPhiNeg(0),
94 fHistPhiBefore(0),
95 fHistPhiAfter(0),
96 fHistPhiPos(0),
97 fHistPhiNeg(0),
98 fHistV0M(0),
99 fHistRefTracks(0),
100 fHistdEdxVsPTPCbeforePID(NULL),
101 fHistBetavsPTOFbeforePID(NULL),
102 fHistProbTPCvsPtbeforePID(NULL),
103 fHistProbTOFvsPtbeforePID(NULL),
104 fHistProbTPCTOFvsPtbeforePID(NULL),
105 fHistNSigmaTPCvsPtbeforePID(NULL),
106 fHistNSigmaTOFvsPtbeforePID(NULL),
e573a392 107 fHistBetaVsdEdXbeforePID(NULL),
108 fHistNSigmaTPCTOFvsPtbeforePID(NULL),
109 fHistNSigmaTPCTOFPbefPID(NULL),
c683985a 110 fHistdEdxVsPTPCafterPID(NULL),
111 fHistBetavsPTOFafterPID(NULL),
112 fHistProbTPCvsPtafterPID(NULL),
113 fHistProbTOFvsPtafterPID(NULL),
114 fHistProbTPCTOFvsPtafterPID(NULL),
115 fHistNSigmaTPCvsPtafterPID(NULL),
116 fHistNSigmaTOFvsPtafterPID(NULL),
e573a392 117 fHistBetaVsdEdXafterPID(NULL),
118 fHistNSigmaTPCTOFvsPtafterPID(NULL),
119 fHistNSigmaTPCTOFPafterPID(NULL),
120 fHistdEdxVsPTPCbeforePIDelectron(NULL),
121 fHistNSigmaTPCvsPtbeforePIDelectron(NULL),
122 fHistdEdxVsPTPCafterPIDelectron(NULL),
123 fHistNSigmaTPCvsPtafterPIDelectron(NULL),
c683985a 124 fCentralityArrayBinsForCorrections(kCENTRALITY),
125 fCentralityWeights(0x0),
126 fPIDResponse(0x0),
127 fPIDCombined(0x0),
128 fParticleOfInterest(kPion),
129 fPidDetectorConfig(kTPCTOF),
130 fUsePID(kFALSE),
131 fUsePIDnSigma(kTRUE),
132 fUsePIDPropabilities(kFALSE),
133 fPIDNSigma(3.),
134 fMinAcceptedPIDProbability(0.8),
135 fElectronRejection(kFALSE),
136 fElectronOnlyRejection(kFALSE),
137 fElectronRejectionNSigma(-1.),
138 fElectronRejectionMinPt(0.),
139 fElectronRejectionMaxPt(1000.),
140 fESDtrackCuts(0),
141 fCentralityEstimator("V0M"),
142 fUseCentrality(kFALSE),
143 fCentralityPercentileMin(0.),
144 fCentralityPercentileMax(5.),
145 fImpactParameterMin(0.),
146 fImpactParameterMax(20.),
147 fMultiplicityEstimator("V0A"),
148 fUseMultiplicity(kFALSE),
149 fNumberOfAcceptedTracksMin(0),
150 fNumberOfAcceptedTracksMax(10000),
151 fHistNumberOfAcceptedTracks(0),
152 fHistMultiplicity(0),
153 fUseOfflineTrigger(kFALSE),
154 fCheckFirstEventInChunk(kFALSE),
155 fCheckPileUp(kFALSE),
156 fCheckPrimaryFlagAOD(kFALSE),
157 fUseMCforKinematics(kFALSE),
158 fVxMax(0.3),
159 fVyMax(0.3),
160 fVzMax(10.),
161 fnAODtrackCutBit(128),
162 fPtMin(0.3),
163 fPtMax(1.5),
c683985a 164 fEtaMin(-0.8),
b66d1de3 165 fEtaMax(0.8),
c683985a 166 fPhiMin(0.),
167 fPhiMax(360.),
c683985a 168 fDCAxyCut(-1),
169 fDCAzCut(-1),
170 fTPCchi2Cut(-1),
171 fNClustersTPCCut(-1),
096141dd 172 fTPCsharedCut(-1),
c683985a 173 fAcceptanceParameterization(0),
174 fDifferentialV2(0),
175 fUseFlowAfterBurner(kFALSE),
176 fExcludeResonancesInMC(kFALSE),
177 fExcludeElectronsInMC(kFALSE),
178 fUseMCPdgCode(kFALSE),
179 fPDGCodeToBeAnalyzed(-1),
180 fEventClass("EventPlane"),
181 fCustomBinning(""),
182 fHistVZEROAGainEqualizationMap(0),
183 fHistVZEROCGainEqualizationMap(0),
184 fHistVZEROChannelGainEqualizationMap(0) {
185 // Constructor
186 // Define input and output slots here
187 // Input slot #0 works with a TChain
188
189 //======================================================correction
190 for (Int_t i=0; i<kCENTRALITY; i++){
191 fHistCorrectionPlus[i] = NULL;
192 fHistCorrectionMinus[i] = NULL;
193 fCentralityArrayForCorrections[i] = -1.;
194 }
195 //=====================================================correction
196
197 DefineInput(0, TChain::Class());
198 // Output slot #0 writes into a TH1 container
199 DefineOutput(1, TList::Class());
200 DefineOutput(2, TList::Class());
201 DefineOutput(3, TList::Class());
202 DefineOutput(4, TList::Class());
203 DefineOutput(5, TList::Class());
204}
205
206//________________________________________________________________________
207AliAnalysisTaskBFPsi::~AliAnalysisTaskBFPsi() {
208
209 // delete fBalance;
210 // delete fShuffledBalance;
211 // delete fList;
212 // delete fListBF;
213 // delete fListBFS;
214
215 // delete fHistEventStats;
216 // delete fHistTrackStats;
217 // delete fHistVx;
218 // delete fHistVy;
219 // delete fHistVz;
220
221 // delete fHistClus;
222 // delete fHistDCA;
223 // delete fHistChi2;
224 // delete fHistPt;
225 // delete fHistEta;
226 // delete fHistPhi;
227 // delete fHistEtaPhiPos;
228 // delete fHistEtaPhiNeg;
229 // delete fHistV0M;
230}
231
232//________________________________________________________________________
233void AliAnalysisTaskBFPsi::UserCreateOutputObjects() {
234 // Create histograms
235 // Called once
236
237 // global switch disabling the reference
238 // (to avoid "Replacing existing TH1" if several wagons are created in train)
239 Bool_t oldStatus = TH1::AddDirectoryStatus();
240 TH1::AddDirectory(kFALSE);
241
242 if(!fBalance) {
243 fBalance = new AliBalancePsi();
244 fBalance->SetAnalysisLevel("ESD");
245 fBalance->SetEventClass(fEventClass);
246 //fBalance->SetNumberOfBins(-1,16);
247 //fBalance->SetInterval(-1,-0.8,0.8,16,0.,1.6,15.);
248 }
249 if(fRunShuffling) {
250 if(!fShuffledBalance) {
251 fShuffledBalance = new AliBalancePsi();
252 fShuffledBalance->SetAnalysisLevel("ESD");
253 fShuffledBalance->SetEventClass(fEventClass);
254 //fShuffledBalance->SetNumberOfBins(-1,16);
255 //fShuffledBalance->SetInterval(-1,-0.8,0.8,16,0.,1.6,15.);
256 }
257 }
258 if(fRunMixing) {
259 if(!fMixedBalance) {
260 fMixedBalance = new AliBalancePsi();
261 fMixedBalance->SetAnalysisLevel("ESD");
262 fMixedBalance->SetEventClass(fEventClass);
263 }
264 }
265
266 //QA list
267 fList = new TList();
268 fList->SetName("listQA");
269 fList->SetOwner();
270
271 //Balance Function list
272 fListBF = new TList();
273 fListBF->SetName("listBF");
274 fListBF->SetOwner();
275
276 if(fRunShuffling) {
277 fListBFS = new TList();
278 fListBFS->SetName("listBFShuffled");
279 fListBFS->SetOwner();
280 }
281
282 if(fRunMixing) {
283 fListBFM = new TList();
284 fListBFM->SetName("listTriggeredBFMixed");
285 fListBFM->SetOwner();
286 }
287
288 //PID QA list
289 if(fUsePID || fElectronRejection) {
290 fHistListPIDQA = new TList();
291 fHistListPIDQA->SetName("listQAPID");
292 fHistListPIDQA->SetOwner();
293 }
294
295 //Event stats.
296 TString gCutName[7] = {"Total","Offline trigger",
297 "Vertex","Analyzed","sel. Centrality","Not1stEvInChunk","No Pile-Up"};
298 fHistEventStats = new TH2F("fHistEventStats",
299 "Event statistics;;Centrality percentile;N_{events}",
300 7,0.5,7.5,220,-5,105);
301 for(Int_t i = 1; i <= 7; i++)
302 fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1].Data());
303 fList->Add(fHistEventStats);
304
305 TString gCentName[13] = {"V0M","V0A","V0C","FMD","TRK","TKL","CL0","CL1","ZNA","ZPA","V0MvsFMD","TKLvsV0M","ZEMvsZDC"};
306 fHistCentStats = new TH2F("fHistCentStats",
307 "Centrality statistics;;Cent percentile",
308 13,-0.5,12.5,220,-5,105);
309 for(Int_t i = 1; i <= 13; i++){
310 fHistCentStats->GetXaxis()->SetBinLabel(i,gCentName[i-1].Data());
311 //fHistCentStatsUsed->GetXaxis()->SetBinLabel(i,gCentName[i-1].Data());
312 }
313 fList->Add(fHistCentStats);
314
315 fHistCentStatsUsed = new TH2F("fHistCentStatsUsed","Centrality statistics;;Cent percentile", 1,-0.5,0.5,220,-5,105);
316 fHistCentStatsUsed->GetXaxis()->SetBinLabel(1,fCentralityEstimator.Data());
317 fList->Add(fHistCentStatsUsed);
318
319 fHistTriggerStats = new TH1F("fHistTriggerStats","Trigger statistics;TriggerBit;N_{events}",1025,0,1025);
320 fList->Add(fHistTriggerStats);
321
322 fHistTrackStats = new TH1F("fHistTrackStats","Event statistics;TrackFilterBit;N_{events}",16,0,16);
323 fList->Add(fHistTrackStats);
324
325 fHistNumberOfAcceptedTracks = new TH2F("fHistNumberOfAcceptedTracks",";N_{acc.};Centrality percentile;Entries",4001,-0.5,4000.5,220,-5,105);
326 fList->Add(fHistNumberOfAcceptedTracks);
327
328 fHistMultiplicity = new TH1F("fHistMultiplicity",";N_{ch.};Entries",30001,-0.5,30000.5);
329 fList->Add(fHistMultiplicity);
330
331 // Vertex distributions
332 fHistVx = new TH1F("fHistVx","Primary vertex distribution - x coordinate;V_{x} (cm);Entries",100,-0.5,0.5);
333 fList->Add(fHistVx);
334 fHistVy = new TH1F("fHistVy","Primary vertex distribution - y coordinate;V_{y} (cm);Entries",100,-0.5,0.5);
335 fList->Add(fHistVy);
336 fHistVz = new TH2F("fHistVz","Primary vertex distribution - z coordinate;V_{z} (cm);Centrality percentile;Entries",100,-20.,20.,220,-5,105);
337 fList->Add(fHistVz);
338
339 //TPC vs VZERO multiplicity
340 fHistTPCvsVZEROMultiplicity = new TH2F("fHistTPCvsVZEROMultiplicity","VZERO vs TPC multiplicity",10001,-0.5,10000.5,4001,-0.5,4000.5);
341 if(fMultiplicityEstimator == "V0A")
342 fHistTPCvsVZEROMultiplicity->GetXaxis()->SetTitle("VZERO-A multiplicity (a.u.)");
343 else if(fMultiplicityEstimator == "V0C")
344 fHistTPCvsVZEROMultiplicity->GetXaxis()->SetTitle("VZERO-C multiplicity (a.u.)");
345 else
346 fHistTPCvsVZEROMultiplicity->GetXaxis()->SetTitle("VZERO multiplicity (a.u.)");
347 fList->Add(fHistTPCvsVZEROMultiplicity);
348
349 fHistVZEROSignal = new TH2F("fHistVZEROSignal","VZERO signal vs VZERO channel;VZERO channel; Signal (a.u.)",64,0.5,64.5,3001,-0.5,30000.5);
350 fList->Add(fHistVZEROSignal);
351
352 //Event plane
353 fHistEventPlane = new TH2F("fHistEventPlane",";#Psi_{2} [deg.];Centrality percentile;Counts",100,0,360.,220,-5,105);
354 fList->Add(fHistEventPlane);
355
356 // QA histograms
357 fHistClus = new TH2F("fHistClus","# Cluster (TPC vs. ITS)",10,0,10,200,0,200);
358 fList->Add(fHistClus);
359 fHistChi2 = new TH2F("fHistChi2","Chi2/NDF distribution;#chi^{2}/ndf;Centrality percentile",200,0,10,220,-5,105);
360 fList->Add(fHistChi2);
361 fHistDCA = new TH2F("fHistDCA","DCA (xy vs. z)",400,-5,5,400,-5,5);
362 fList->Add(fHistDCA);
363 fHistPt = new TH2F("fHistPt","p_{T} distribution;p_{T} (GeV/c);Centrality percentile",200,0,10,220,-5,105);
364 fList->Add(fHistPt);
365 fHistEta = new TH2F("fHistEta","#eta distribution;#eta;Centrality percentile",200,-2,2,220,-5,105);
366 fList->Add(fHistEta);
367 fHistRapidity = new TH2F("fHistRapidity","y distribution;y;Centrality percentile",200,-2,2,220,-5,105);
368 fList->Add(fHistRapidity);
369 fHistPhi = new TH2F("fHistPhi","#phi distribution;#phi (rad);Centrality percentile",200,0.0,2.*TMath::Pi(),220,-5,105);
370 fList->Add(fHistPhi);
d2d3c6cd 371 fHistEtaPhiPos = new TH3F("fHistEtaPhiPos","#eta-#phi distribution (+);#eta;#phi (rad);Centrality percentile",40,-1.6,1.6,72,0.,2.*TMath::Pi(),220,-5,105);
c683985a 372 fList->Add(fHistEtaPhiPos);
d2d3c6cd 373 fHistEtaPhiNeg = new TH3F("fHistEtaPhiNeg","#eta-#phi distribution (-);#eta;#phi (rad);Centrality percentile",40,-1.6,1.6,72,0.,2.*TMath::Pi(),220,-5,105);
c683985a 374 fList->Add(fHistEtaPhiNeg);
375 fHistPhiBefore = new TH2F("fHistPhiBefore","#phi distribution;#phi;Centrality percentile",200,0.,2*TMath::Pi(),220,-5,105);
376 fList->Add(fHistPhiBefore);
377 fHistPhiAfter = new TH2F("fHistPhiAfter","#phi distribution;#phi;Centrality percentile",200,0.,2*TMath::Pi(),220,-5,105);
378 fList->Add(fHistPhiAfter);
379 fHistPhiPos = new TH2F("fHistPhiPos","#phi distribution for positive particles;#phi;Centrality percentile",200,0.,2*TMath::Pi(),220,-5,105);
380 fList->Add(fHistPhiPos);
381 fHistPhiNeg = new TH2F("fHistPhiNeg","#phi distribution for negative particles;#phi;Centrality percentile",200,0.,2.*TMath::Pi(),220,-5,105);
382 fList->Add(fHistPhiNeg);
383 fHistV0M = new TH2F("fHistV0M","V0 Multiplicity C vs. A",500, 0, 20000, 500, 0, 20000);
384 fList->Add(fHistV0M);
385 TString gRefTrackName[6] = {"tracks","tracksPos","tracksNeg","tracksTPConly","clusITS0","clusITS1"};
386 fHistRefTracks = new TH2F("fHistRefTracks","Nr of Ref tracks/event vs. ref track estimator;;Nr of tracks",6, 0, 6, 400, 0, 20000);
387 for(Int_t i = 1; i <= 6; i++)
388 fHistRefTracks->GetXaxis()->SetBinLabel(i,gRefTrackName[i-1].Data());
389 fList->Add(fHistRefTracks);
390
391 // Balance function histograms
392 // Initialize histograms if not done yet (including the custom binning)
393 if(!fBalance->GetHistNp()){
394 AliInfo("Histograms not yet initialized! --> Will be done now");
395 fBalance->SetCustomBinning(fCustomBinning);
396 fBalance->InitHistograms();
397 }
398
399 if(fRunShuffling) {
400 if(!fShuffledBalance->GetHistNp()) {
401 AliInfo("Histograms (shuffling) not yet initialized! --> Will be done now");
402 fShuffledBalance->SetCustomBinning(fCustomBinning);
403 fShuffledBalance->InitHistograms();
404 }
405 }
406
407 if(fRunMixing) {
408 if(!fMixedBalance->GetHistNp()) {
409 AliInfo("Histograms (mixing) not yet initialized! --> Will be done now");
410 fMixedBalance->SetCustomBinning(fCustomBinning);
411 fMixedBalance->InitHistograms();
412 }
413 }
414
415 // QA histograms for different cuts
416 fList->Add(fBalance->GetQAHistHBTbefore());
417 fList->Add(fBalance->GetQAHistHBTafter());
418 fList->Add(fBalance->GetQAHistConversionbefore());
419 fList->Add(fBalance->GetQAHistConversionafter());
420 fList->Add(fBalance->GetQAHistPsiMinusPhi());
421 fList->Add(fBalance->GetQAHistResonancesBefore());
422 fList->Add(fBalance->GetQAHistResonancesRho());
423 fList->Add(fBalance->GetQAHistResonancesK0());
424 fList->Add(fBalance->GetQAHistResonancesLambda());
425 fList->Add(fBalance->GetQAHistQbefore());
426 fList->Add(fBalance->GetQAHistQafter());
427
428 //for(Int_t a = 0; a < ANALYSIS_TYPES; a++){
429 fListBF->Add(fBalance->GetHistNp());
430 fListBF->Add(fBalance->GetHistNn());
431 fListBF->Add(fBalance->GetHistNpn());
432 fListBF->Add(fBalance->GetHistNnn());
433 fListBF->Add(fBalance->GetHistNpp());
434 fListBF->Add(fBalance->GetHistNnp());
435
436 if(fRunShuffling) {
437 fListBFS->Add(fShuffledBalance->GetHistNp());
438 fListBFS->Add(fShuffledBalance->GetHistNn());
439 fListBFS->Add(fShuffledBalance->GetHistNpn());
440 fListBFS->Add(fShuffledBalance->GetHistNnn());
441 fListBFS->Add(fShuffledBalance->GetHistNpp());
442 fListBFS->Add(fShuffledBalance->GetHistNnp());
443 }
444
445 if(fRunMixing) {
446 fListBFM->Add(fMixedBalance->GetHistNp());
447 fListBFM->Add(fMixedBalance->GetHistNn());
448 fListBFM->Add(fMixedBalance->GetHistNpn());
449 fListBFM->Add(fMixedBalance->GetHistNnn());
450 fListBFM->Add(fMixedBalance->GetHistNpp());
451 fListBFM->Add(fMixedBalance->GetHistNnp());
452 }
453 //}
454
455
456 // Event Mixing
457 if(fRunMixing){
458 Int_t trackDepth = fMixingTracks;
459 Int_t poolsize = 1000; // Maximum number of events, ignored in the present implemented of AliEventPoolManager
460
461 // centrality bins
462 Double_t* centbins = NULL;
463 Int_t nCentralityBins;
464 if(fBalance->IsUseVertexBinning()){
465 centbins = fBalance->GetBinning(fBalance->GetBinningString(), "centralityVertex", nCentralityBins);
466 }
467 else{
468 centbins = fBalance->GetBinning(fBalance->GetBinningString(), "centrality", nCentralityBins);
469 }
470
471 // multiplicity bins
472 Double_t* multbins = NULL;
473 Int_t nMultiplicityBins;
474 multbins = fBalance->GetBinning(fBalance->GetBinningString(), "multiplicity", nMultiplicityBins);
475
476 // Zvtx bins
477 Double_t* vtxbins = NULL;
478 Int_t nVertexBins;
479 if(fBalance->IsUseVertexBinning()){
480 vtxbins = fBalance->GetBinning(fBalance->GetBinningString(), "vertexVertex", nVertexBins);
481 }
482 else{
483 vtxbins = fBalance->GetBinning(fBalance->GetBinningString(), "vertex", nVertexBins);
484 }
485
486 // Event plane angle (Psi) bins
487 Double_t* psibins = NULL;
488 Int_t nPsiBins;
489 psibins = fBalance->GetBinning(fBalance->GetBinningString(), "eventPlane", nPsiBins);
490
b78ae8b4 491
c683985a 492 // run the event mixing also in bins of event plane (statistics!)
493 if(fRunMixingEventPlane){
494 if(fEventClass=="Multiplicity"){
495 if(multbins && vtxbins && psibins){
496 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nMultiplicityBins, multbins, nVertexBins, vtxbins, nPsiBins, psibins);
497 }
498 }
499 else{
500 if(centbins && vtxbins && psibins){
501 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, centbins, nVertexBins, vtxbins, nPsiBins, psibins);
502 }
503 }
504 }
505 else{
506 if(fEventClass=="Multiplicity"){
507 if(multbins && vtxbins){
508 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nMultiplicityBins, multbins, nVertexBins, vtxbins);
509 }
510 }
511 else{
512 if(centbins && vtxbins){
513 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, centbins, nVertexBins, vtxbins);
514 }
515 }
516 }
b78ae8b4 517
518 if(centbins) delete [] centbins;
519 if(multbins) delete [] multbins;
520 if(vtxbins) delete [] vtxbins;
70de3ddf 521 if(psibins) delete [] psibins;
169d1fcf 522
523 // set minimum values for track depth, fraction, and number of events
524 fPoolMgr->SetTargetValues(fMixingTracks, 0.1, 5);
b78ae8b4 525
c683985a 526 // check pool manager
527 if(!fPoolMgr){
528 AliError("Event Mixing required, but Pool Manager not initialized...");
529 return;
530 }
531 }
532
533 if(fESDtrackCuts) fList->Add(fESDtrackCuts);
534
535 //====================PID========================//
536 if(fUsePID) {
537 fPIDCombined = new AliPIDCombined();
538 fPIDCombined->SetDefaultTPCPriors();
539
540 fHistdEdxVsPTPCbeforePID = new TH2D ("dEdxVsPTPCbefore","dEdxVsPTPCbefore", 1000, -10.0, 10.0, 1000, 0, 1000);
541 fHistListPIDQA->Add(fHistdEdxVsPTPCbeforePID);
542
543 fHistBetavsPTOFbeforePID = new TH2D ("BetavsPTOFbefore","BetavsPTOFbefore", 1000, -10.0, 10., 1000, 0, 1.2);
544 fHistListPIDQA->Add(fHistBetavsPTOFbeforePID);
545
546 fHistProbTPCvsPtbeforePID = new TH2D ("ProbTPCvsPtbefore","ProbTPCvsPtbefore", 1000, -10.0,10.0, 1000, 0, 2.0);
547 fHistListPIDQA->Add(fHistProbTPCvsPtbeforePID);
548
549 fHistProbTOFvsPtbeforePID = new TH2D ("ProbTOFvsPtbefore","ProbTOFvsPtbefore", 1000, -50, 50, 1000, 0, 2.0);
550 fHistListPIDQA->Add(fHistProbTOFvsPtbeforePID);
551
552 fHistProbTPCTOFvsPtbeforePID =new TH2D ("ProbTPCTOFvsPtbefore","ProbTPCTOFvsPtbefore", 1000, -50, 50, 1000, 0, 2.0);
553 fHistListPIDQA->Add(fHistProbTPCTOFvsPtbeforePID);
554
e573a392 555 fHistNSigmaTPCvsPtbeforePID = new TH2D ("NSigmaTPCvsPtbefore","NSigmaTPCvsPtbefore", 1000, -10, 10, 1000, -25, 25);
c683985a 556 fHistListPIDQA->Add(fHistNSigmaTPCvsPtbeforePID);
557
e573a392 558 fHistNSigmaTOFvsPtbeforePID = new TH2D ("NSigmaTOFvsPtbefore","NSigmaTOFvsPtbefore", 1000, -10, 10, 1000, -25, 25);
c683985a 559 fHistListPIDQA->Add(fHistNSigmaTOFvsPtbeforePID);
560
561 fHistBetaVsdEdXbeforePID = new TH2D ("BetaVsdEdXbefore","BetaVsdEdXbefore", 1000, 0., 1000, 1000, 0, 1.2);
e573a392 562 fHistListPIDQA->Add(fHistBetaVsdEdXbeforePID);
c683985a 563
e573a392 564 fHistNSigmaTPCTOFvsPtbeforePID = new TH2D ("NSigmaTPCTOFvsPtbefore","NSigmaTPCTOFvsPtbefore", 1000, -10., 10., 1000, -25, 25);
565 fHistListPIDQA->Add(fHistNSigmaTPCTOFvsPtbeforePID);
c683985a 566
e573a392 567 //+++++++++++++++++//
568 //p array
569 const Int_t pBins = 36;
570 Double_t nArrayP[pBins+1]={0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 7.0, 8.0, 9.0, 10.0, 15.0, 20.0};
571 //nSigma Array
572 const Int_t nSigmaBins = 250;
573 Double_t nArrayS[nSigmaBins+1];
574 for (Int_t i = 0; i <= nSigmaBins; i++){
575 nArrayS[i]=i-125; //i+1
576 //Printf("nS: %lf - i: %d", nSigmaArray[i], i);
577 }
578
579 fHistNSigmaTPCTOFPbefPID = new TH3D ("fHistNSigmaTPCTOFPbefPID","fHistNSigmaTPCTOFPbefPID;#sigma_{TPC};#sigma_{TOF};p_{T} (GeV/c)", nSigmaBins, nArrayS, nSigmaBins, nArrayS, pBins,nArrayP);
580 fHistListPIDQA->Add(fHistNSigmaTPCTOFPbefPID);
581 //++++++++++++++//
582
c683985a 583 fHistdEdxVsPTPCafterPID = new TH2D ("dEdxVsPTPCafter","dEdxVsPTPCafter", 1000, -10, 10, 1000, 0, 1000);
584 fHistListPIDQA->Add(fHistdEdxVsPTPCafterPID);
585
586 fHistBetavsPTOFafterPID = new TH2D ("BetavsPTOFafter","BetavsPTOFafter", 1000, -10, 10, 1000, 0, 1.2);
587 fHistListPIDQA->Add(fHistBetavsPTOFafterPID);
588
589 fHistProbTPCvsPtafterPID = new TH2D ("ProbTPCvsPtafter","ProbTPCvsPtafter", 1000, -10, 10, 1000, 0, 2);
590 fHistListPIDQA->Add(fHistProbTPCvsPtafterPID);
591
592 fHistProbTOFvsPtafterPID = new TH2D ("ProbTOFvsPtafter","ProbTOFvsPtafter", 1000, -10, 10, 1000, 0, 2);
593 fHistListPIDQA->Add(fHistProbTOFvsPtafterPID);
594
595 fHistProbTPCTOFvsPtafterPID =new TH2D ("ProbTPCTOFvsPtafter","ProbTPCTOFvsPtafter", 1000, -50, 50, 1000, 0, 2.0);
596 fHistListPIDQA->Add(fHistProbTPCTOFvsPtafterPID);
597
e573a392 598 fHistNSigmaTPCvsPtafterPID = new TH2D ("NSigmaTPCvsPtafter","NSigmaTPCvsPtafter", 1000, -10, 10, 1000, -25, 25);
c683985a 599 fHistListPIDQA->Add(fHistNSigmaTPCvsPtafterPID);
600
e573a392 601 fHistNSigmaTOFvsPtafterPID = new TH2D ("NSigmaTOFvsPtafter","NSigmaTOFvsPtafter", 1000, -10, 10, 1000, -25, 25);
c683985a 602 fHistListPIDQA->Add(fHistNSigmaTOFvsPtafterPID);
603
604 fHistBetaVsdEdXafterPID = new TH2D ("BetaVsdEdXafter","BetaVsdEdXafter", 1000, 0., 1000, 1000, 0, 1.2);
e573a392 605 fHistListPIDQA->Add(fHistBetaVsdEdXafterPID);
c683985a 606
e573a392 607 fHistNSigmaTPCTOFvsPtafterPID = new TH2D ("NSigmaTPCTOFvsPtafter","NSigmaTPCTOFvsPtafter", 1000, -10., 10., 1000, -25, 25);
608 fHistListPIDQA->Add(fHistNSigmaTPCTOFvsPtafterPID);
609
610 fHistNSigmaTPCTOFPafterPID = new TH3D ("fHistNSigmaTPCTOFPafterPID","fHistNSigmaTPCTOFPafterPID;#sigma_{TPC};#sigma_{TOF};p_{T} (GeV/c)", nSigmaBins, nArrayS, nSigmaBins, nArrayS, pBins,nArrayP);
611 fHistListPIDQA->Add(fHistNSigmaTPCTOFPafterPID); //++++++++++++++
c683985a 612 }
613
614 // for electron rejection only TPC nsigma histograms
615 if(fElectronRejection) {
616
617 fHistdEdxVsPTPCbeforePIDelectron = new TH2D ("dEdxVsPTPCbeforeelectron","dEdxVsPTPCbeforeelectron", 1000, -10.0, 10.0, 1000, 0, 1000);
618 fHistListPIDQA->Add(fHistdEdxVsPTPCbeforePIDelectron);
619
620 fHistNSigmaTPCvsPtbeforePIDelectron = new TH2D ("NSigmaTPCvsPtbeforeelectron","NSigmaTPCvsPtbeforeelectron", 1000, -10, 10, 1000, 0, 500);
621 fHistListPIDQA->Add(fHistNSigmaTPCvsPtbeforePIDelectron);
622
623 fHistdEdxVsPTPCafterPIDelectron = new TH2D ("dEdxVsPTPCafterelectron","dEdxVsPTPCafterelectron", 1000, -10, 10, 1000, 0, 1000);
624 fHistListPIDQA->Add(fHistdEdxVsPTPCafterPIDelectron);
625
626 fHistNSigmaTPCvsPtafterPIDelectron = new TH2D ("NSigmaTPCvsPtafterelectron","NSigmaTPCvsPtafterelectron", 1000, -10, 10, 1000, 0, 500);
627 fHistListPIDQA->Add(fHistNSigmaTPCvsPtafterPIDelectron);
628 }
629 //====================PID========================//
630
631 // Post output data.
632 PostData(1, fList);
633 PostData(2, fListBF);
634 if(fRunShuffling) PostData(3, fListBFS);
635 if(fRunMixing) PostData(4, fListBFM);
636 if(fUsePID || fElectronRejection) PostData(5, fHistListPIDQA); //PID
637
638 AliInfo("Finished setting up the Output");
639
640 TH1::AddDirectory(oldStatus);
b78ae8b4 641
c683985a 642}
643
644
645//________________________________________________________________________
646void AliAnalysisTaskBFPsi::SetInputCorrection(TString filename,
647 Int_t nCentralityBins,
648 Double_t *centralityArrayForCorrections) {
649 //Open files that will be used for correction
650 fCentralityArrayBinsForCorrections = nCentralityBins;
651 for (Int_t i=0; i<nCentralityBins; i++)
652 fCentralityArrayForCorrections[i] = centralityArrayForCorrections[i];
653
654 // No file specified -> run without corrections
655 if(!filename.Contains(".root")) {
656 AliInfo(Form("No correction file specified (= %s) --> run without corrections",filename.Data()));
657 return;
658 }
659
660 //Open the input file
661 TFile *f = TFile::Open(filename);
662 if(!f->IsOpen()) {
663 AliInfo(Form("File %s not found --> run without corrections",filename.Data()));
664 return;
665 }
666
667 //TString listEffName = "";
668 for (Int_t iCent = 0; iCent < fCentralityArrayBinsForCorrections-1; iCent++) {
669 //Printf("iCent %d:",iCent);
670 TString histoName = "fHistCorrectionPlus";
671 histoName += Form("%d-%d",(Int_t)(fCentralityArrayForCorrections[iCent]),(Int_t)(fCentralityArrayForCorrections[iCent+1]));
672 fHistCorrectionPlus[iCent]= dynamic_cast<TH3F *>(f->Get(histoName.Data()));
673 if(!fHistCorrectionPlus[iCent]) {
674 AliError(Form("fHist %s not found!!!",histoName.Data()));
675 return;
676 }
677
678 histoName = "fHistCorrectionMinus";
679 histoName += Form("%d-%d",(Int_t)(fCentralityArrayForCorrections[iCent]),(Int_t)(fCentralityArrayForCorrections[iCent+1]));
680 fHistCorrectionMinus[iCent] = dynamic_cast<TH3F *>(f->Get(histoName.Data()));
681 if(!fHistCorrectionMinus[iCent]) {
682 AliError(Form("fHist %s not found!!!",histoName.Data()));
683 return;
684 }
685 }//loop over centralities: ONLY the PbPb case is covered
c683985a 686}
687
688//________________________________________________________________________
689void AliAnalysisTaskBFPsi::UserExec(Option_t *) {
690 // Main loop
691 // Called for each event
692
693 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
694 Int_t gNumberOfAcceptedTracks = 0;
695 Double_t lMultiplicityVar = -999.; //-1
696 Double_t gReactionPlane = -1.;
697 Float_t bSign = 0.;
698
699 // get the event (for generator level: MCEvent())
700 AliVEvent* eventMain = NULL;
701 if(gAnalysisLevel == "MC") {
702 eventMain = dynamic_cast<AliVEvent*>(MCEvent());
703 }
704 else{
705 eventMain = dynamic_cast<AliVEvent*>(InputEvent());
706 // for HBT like cuts need magnetic field sign
707 bSign = (eventMain->GetMagneticField() > 0) ? 1 : -1;
708 }
709 if(!eventMain) {
710 AliError("eventMain not available");
711 return;
712 }
713
714 // PID Response task active?
715 if(fUsePID || fElectronRejection) {
716 fPIDResponse = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetPIDResponse();
717 if (!fPIDResponse) AliFatal("This Task needs the PID response attached to the inputHandler");
718 }
719
720 // check event cuts and fill event histograms
721 if((lMultiplicityVar = IsEventAccepted(eventMain)) < 0){
722 return;
723 }
724 // get the reaction plane
3b408588 725 if(fEventClass != "Multiplicity" && gAnalysisLevel!="AODnano") {
c683985a 726 gReactionPlane = GetEventPlane(eventMain);
727 fHistEventPlane->Fill(gReactionPlane,lMultiplicityVar);
728 if(gReactionPlane < 0){
729 return;
730 }
731 }
732
733 // get the accepted tracks in main event
734 TObjArray *tracksMain = GetAcceptedTracks(eventMain,lMultiplicityVar,gReactionPlane);
735 gNumberOfAcceptedTracks = tracksMain->GetEntriesFast();
736
737 //multiplicity cut (used in pp)
738 fHistNumberOfAcceptedTracks->Fill(gNumberOfAcceptedTracks,lMultiplicityVar);
739
740 // store charges of all accepted tracks,shuffle and reassign(two extra loops)
741 TObjArray* tracksShuffled = NULL;
742 if(fRunShuffling){
743 tracksShuffled = GetShuffledTracks(tracksMain,lMultiplicityVar);
744 }
745
746 // Event mixing
747 if (fRunMixing)
748 {
749 // 1. First get an event pool corresponding in mult (cent) and
750 // zvertex to the current event. Once initialized, the pool
751 // should contain nMix (reduced) events. This routine does not
752 // pre-scan the chain. The first several events of every chain
753 // will be skipped until the needed pools are filled to the
754 // specified depth. If the pool categories are not too rare, this
755 // should not be a problem. If they are rare, you could lose`
756 // statistics.
757
758 // 2. Collect the whole pool's content of tracks into one TObjArray
759 // (bgTracks), which is effectively a single background super-event.
760
761 // 3. The reduced and bgTracks arrays must both be passed into
762 // FillCorrelations(). Also nMix should be passed in, so a weight
763 // of 1./nMix can be applied.
764
765 AliEventPool* pool = fPoolMgr->GetEventPool(lMultiplicityVar, eventMain->GetPrimaryVertex()->GetZ(),gReactionPlane);
766
767 if (!pool){
768 AliFatal(Form("No pool found for centrality = %f, zVtx = %f, psi = %f", lMultiplicityVar, eventMain->GetPrimaryVertex()->GetZ(),gReactionPlane));
769 }
770 else{
771
772 //pool->SetDebug(1);
773
169d1fcf 774 if (pool->IsReady()){
c683985a 775
776
777 Int_t nMix = pool->GetCurrentNEvents();
778 //cout << "nMix = " << nMix << " tracks in pool = " << pool->NTracksInPool() << endl;
779
780 //((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(2);
781 //((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool->NTracksInPool());
782 //if (pool->IsReady())
783 //((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(3);
784
785 // Fill mixed-event histos here
786 for (Int_t jMix=0; jMix<nMix; jMix++)
787 {
788 TObjArray* tracksMixed = pool->GetEvent(jMix);
789 fMixedBalance->CalculateBalance(gReactionPlane,tracksMain,tracksMixed,bSign,lMultiplicityVar,eventMain->GetPrimaryVertex()->GetZ());
790 }
791 }
792
793 // Update the Event pool
794 pool->UpdatePool(tracksMain);
795 //pool->PrintInfo();
796
797 }//pool NULL check
798 }//run mixing
799
800 // calculate balance function
801 fBalance->CalculateBalance(gReactionPlane,tracksMain,NULL,bSign,lMultiplicityVar,eventMain->GetPrimaryVertex()->GetZ());
802
803 // calculate shuffled balance function
804 if(fRunShuffling && tracksShuffled != NULL) {
805 fShuffledBalance->CalculateBalance(gReactionPlane,tracksShuffled,NULL,bSign,lMultiplicityVar,eventMain->GetPrimaryVertex()->GetZ());
806 }
807}
808
809//________________________________________________________________________
810Double_t AliAnalysisTaskBFPsi::IsEventAccepted(AliVEvent *event){
811 // Checks the Event cuts
812 // Fills Event statistics histograms
813
814 Bool_t isSelectedMain = kTRUE;
815 Float_t gRefMultiplicity = -1.;
816 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
817
818 AliMCEvent *mcevent = dynamic_cast<AliMCEvent*>(event);
819
820 fHistEventStats->Fill(1,gRefMultiplicity); //all events
821
822 // check first event in chunk (is not needed for new reconstructions)
823 if(fCheckFirstEventInChunk){
824 AliAnalysisUtils ut;
825 if(ut.IsFirstEventInChunk(event))
826 return -1.;
827 fHistEventStats->Fill(6,gRefMultiplicity);
828 }
829 // check for pile-up event
830 if(fCheckPileUp){
831 AliAnalysisUtils ut;
832 ut.SetUseMVPlpSelection(kTRUE);
833 ut.SetUseOutOfBunchPileUp(kTRUE);
834 if(ut.IsPileUpEvent(event))
835 return -1.;
836 fHistEventStats->Fill(7,gRefMultiplicity);
837 }
838
839 // Event trigger bits
840 fHistTriggerStats->Fill(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected());
841 if(fUseOfflineTrigger)
842 isSelectedMain = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
843
844 if(isSelectedMain) {
845 fHistEventStats->Fill(2,gRefMultiplicity); //triggered events
846
847 // Event Vertex MC
848 if(gAnalysisLevel == "MC") {
849 if(!event) {
850 AliError("mcEvent not available");
851 return 0x0;
852 }
853
854 if(mcevent){
855 AliGenEventHeader *header = dynamic_cast<AliGenEventHeader*>(mcevent->GenEventHeader());
856 if(header){
857 TArrayF gVertexArray;
858 header->PrimaryVertex(gVertexArray);
859 //Printf("Vertex: %lf (x) - %lf (y) - %lf (z)",
860 //gVertexArray.At(0),
861 //gVertexArray.At(1),
862 //gVertexArray.At(2));
863 fHistEventStats->Fill(3,gRefMultiplicity); //events with a proper vertex
864 if(TMath::Abs(gVertexArray.At(0)) < fVxMax) {
865 if(TMath::Abs(gVertexArray.At(1)) < fVyMax) {
866 if(TMath::Abs(gVertexArray.At(2)) < fVzMax) {
867 fHistEventStats->Fill(4,gRefMultiplicity);//analyzed events
868
869 // get the reference multiplicty or centrality
870 gRefMultiplicity = GetRefMultiOrCentrality(event);
871
872 fHistVx->Fill(gVertexArray.At(0));
873 fHistVy->Fill(gVertexArray.At(1));
874 fHistVz->Fill(gVertexArray.At(2),gRefMultiplicity);
875
876 // take only events inside centrality class
877 if(fUseCentrality) {
878 if((fImpactParameterMin < gRefMultiplicity) && (fImpactParameterMax > gRefMultiplicity)){
879 fHistEventStats->Fill(5,gRefMultiplicity); //events with correct centrality
880 return gRefMultiplicity;
881 }//centrality class
882 }
883 // take events only within the same multiplicity class
884 else if(fUseMultiplicity) {
885 if((gRefMultiplicity > fNumberOfAcceptedTracksMin) && (gRefMultiplicity < fNumberOfAcceptedTracksMax)) {
886 fHistEventStats->Fill(5,gRefMultiplicity); //events with correct multiplicity
887 return gRefMultiplicity;
888 }
889 }//multiplicity range
890 }//Vz cut
891 }//Vy cut
892 }//Vx cut
893 }//header
894 }//MC event object
895 }//MC
896
897 // Event Vertex AOD, ESD, ESDMC
898 else{
899 const AliVVertex *vertex = event->GetPrimaryVertex();
900
901 if(vertex) {
902 Double32_t fCov[6];
903 vertex->GetCovarianceMatrix(fCov);
904 if(vertex->GetNContributors() > 0) {
905 if(fCov[5] != 0) {
906 fHistEventStats->Fill(3,gRefMultiplicity); //proper vertex
907 if(TMath::Abs(vertex->GetX()) < fVxMax) {
908 if(TMath::Abs(vertex->GetY()) < fVyMax) {
909 if(TMath::Abs(vertex->GetZ()) < fVzMax) {
910 fHistEventStats->Fill(4,gRefMultiplicity);//analyzed events
911
912 // get the reference multiplicty or centrality
913 gRefMultiplicity = GetRefMultiOrCentrality(event);
914
915 fHistVx->Fill(vertex->GetX());
916 fHistVy->Fill(vertex->GetY());
917 fHistVz->Fill(vertex->GetZ(),gRefMultiplicity);
918
919 // take only events inside centrality class
920 if(fUseCentrality) {
921 if((gRefMultiplicity > fCentralityPercentileMin) && (gRefMultiplicity < fCentralityPercentileMax)){
922
923 // centrality weighting (optional for 2011 if central and semicentral triggers are used)
924 if (fCentralityWeights && !AcceptEventCentralityWeight(gRefMultiplicity)){
925 AliInfo(Form("Rejecting event because of centrality weighting: %f", gRefMultiplicity));
926 return -1;
927 }
928
929 fHistEventStats->Fill(5,gRefMultiplicity); //events with correct centrality
930 return gRefMultiplicity;
931 }//centrality class
932 }
933 // take events only within the same multiplicity class
934 else if(fUseMultiplicity) {
935 //if(fDebugLevel)
936 //Printf("N(min): %.0f, N(max): %.0f - N(ref): %.0f",fNumberOfAcceptedTracksMin,
937 //fNumberOfAcceptedTracksMax,gRefMultiplicity);
938
939 if((gRefMultiplicity > fNumberOfAcceptedTracksMin) && (gRefMultiplicity < fNumberOfAcceptedTracksMax)) {
940 fHistEventStats->Fill(5,gRefMultiplicity); //events with correct multiplicity
941 return gRefMultiplicity;
942 }
943 }//multiplicity range
944 }//Vz cut
945 }//Vy cut
946 }//Vx cut
947 }//proper vertex resolution
948 }//proper number of contributors
949 }//vertex object valid
950 }//triggered event
951 }//AOD,ESD,ESDMC
952
953 // in all other cases return -1 (event not accepted)
954 return -1;
955}
956
957
958//________________________________________________________________________
959Double_t AliAnalysisTaskBFPsi::GetRefMultiOrCentrality(AliVEvent *event){
960 // Checks the Event cuts
961 // Fills Event statistics histograms
3b408588 962
c683985a 963 Float_t gCentrality = -1.;
964 Double_t gMultiplicity = -1.;
965 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
966
967
968 // calculate centrality always (not only in centrality mode)
969 if(gAnalysisLevel == "AOD"|| gAnalysisLevel == "MCAOD" || gAnalysisLevel == "MCAODrec" ) { //centrality in AOD header //++++++++++++++
970 AliAODHeader *header = (AliAODHeader*) event->GetHeader();
971 if(header){
972 gCentrality = header->GetCentralityP()->GetCentralityPercentile(fCentralityEstimator.Data());
973
974 // QA for centrality estimators
975 fHistCentStats->Fill(0.,header->GetCentralityP()->GetCentralityPercentile("V0M"));
976 fHistCentStats->Fill(1.,header->GetCentralityP()->GetCentralityPercentile("V0A"));
977 fHistCentStats->Fill(2.,header->GetCentralityP()->GetCentralityPercentile("V0C"));
978 fHistCentStats->Fill(3.,header->GetCentralityP()->GetCentralityPercentile("FMD"));
979 fHistCentStats->Fill(4.,header->GetCentralityP()->GetCentralityPercentile("TRK"));
980 fHistCentStats->Fill(5.,header->GetCentralityP()->GetCentralityPercentile("TKL"));
981 fHistCentStats->Fill(6.,header->GetCentralityP()->GetCentralityPercentile("CL0"));
982 fHistCentStats->Fill(7.,header->GetCentralityP()->GetCentralityPercentile("CL1"));
983 fHistCentStats->Fill(8.,header->GetCentralityP()->GetCentralityPercentile("ZNA"));
984 fHistCentStats->Fill(9.,header->GetCentralityP()->GetCentralityPercentile("ZPA"));
985 fHistCentStats->Fill(10.,header->GetCentralityP()->GetCentralityPercentile("V0MvsFMD"));
986 fHistCentStats->Fill(11.,header->GetCentralityP()->GetCentralityPercentile("TKLvsV0M"));
987 fHistCentStats->Fill(12.,header->GetCentralityP()->GetCentralityPercentile("ZEMvsZDC"));
988
989 // Centrality estimator USED ++++++++++++++++++++++++++++++
990 fHistCentStatsUsed->Fill(0.,header->GetCentralityP()->GetCentralityPercentile(fCentralityEstimator.Data()));
991
992 // centrality QA (V0M)
993 fHistV0M->Fill(event->GetVZEROData()->GetMTotV0A(), event->GetVZEROData()->GetMTotV0C());
994
995 // centrality QA (reference tracks)
996 fHistRefTracks->Fill(0.,header->GetRefMultiplicity());
997 fHistRefTracks->Fill(1.,header->GetRefMultiplicityPos());
998 fHistRefTracks->Fill(2.,header->GetRefMultiplicityNeg());
999 fHistRefTracks->Fill(3.,header->GetTPConlyRefMultiplicity());
1000 fHistRefTracks->Fill(4.,header->GetNumberOfITSClusters(0));
1001 fHistRefTracks->Fill(5.,header->GetNumberOfITSClusters(1));
1002 fHistRefTracks->Fill(6.,header->GetNumberOfITSClusters(2));
1003 fHistRefTracks->Fill(7.,header->GetNumberOfITSClusters(3));
1004 fHistRefTracks->Fill(8.,header->GetNumberOfITSClusters(4));
1005
1006 }//AOD header
1007 }//AOD
3b408588 1008
1009 // calculate centrality always (not only in centrality mode)
1010 else if(gAnalysisLevel == "AODnano" ) { //centrality via JF workaround
1011
1012 AliAODHeader *header = (AliAODHeader*) event->GetHeader();
1013 if(header){
1014 gCentrality = (Float_t) gROOT->ProcessLine(Form("100.0 + 100.0 * ((AliNanoAODHeader*) %p)->GetCentrality(\"%s\")", header,fCentralityEstimator.Data())) / 100 - 1.0;
1015
1016 // QA histogram
1017 fHistCentStatsUsed->Fill(0.,gCentrality);
1018
1019 }//AOD header
1020 }//AODnano
c683985a 1021
1022 else if(gAnalysisLevel == "ESD" || gAnalysisLevel == "MCESD"){ // centrality class for ESDs or MC-ESDs
1023 AliCentrality *centrality = event->GetCentrality();
1024 gCentrality = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
1025
1026 // QA for centrality estimators
1027 fHistCentStats->Fill(0.,centrality->GetCentralityPercentile("V0M"));
1028 fHistCentStats->Fill(1.,centrality->GetCentralityPercentile("V0A"));
1029 fHistCentStats->Fill(2.,centrality->GetCentralityPercentile("V0C"));
1030 fHistCentStats->Fill(3.,centrality->GetCentralityPercentile("FMD"));
1031 fHistCentStats->Fill(4.,centrality->GetCentralityPercentile("TRK"));
1032 fHistCentStats->Fill(5.,centrality->GetCentralityPercentile("TKL"));
1033 fHistCentStats->Fill(6.,centrality->GetCentralityPercentile("CL0"));
1034 fHistCentStats->Fill(7.,centrality->GetCentralityPercentile("CL1"));
1035 fHistCentStats->Fill(8.,centrality->GetCentralityPercentile("ZNA"));
1036 fHistCentStats->Fill(9.,centrality->GetCentralityPercentile("ZPA"));
1037 fHistCentStats->Fill(10.,centrality->GetCentralityPercentile("V0MvsFMD"));
1038 fHistCentStats->Fill(11.,centrality->GetCentralityPercentile("TKLvsV0M"));
1039 fHistCentStats->Fill(12.,centrality->GetCentralityPercentile("ZEMvsZDC"));
1040
1041 // Centrality estimator USED ++++++++++++++++++++++++++++++
1042 fHistCentStatsUsed->Fill(0.,centrality->GetCentralityPercentile(fCentralityEstimator.Data()));
1043
1044 // centrality QA (V0M)
1045 fHistV0M->Fill(event->GetVZEROData()->GetMTotV0A(), event->GetVZEROData()->GetMTotV0C());
1046 }//ESD
1047
1048 else if(gAnalysisLevel == "MC"){
1049 Double_t gImpactParameter = 0.;
1050 AliMCEvent *gMCEvent = dynamic_cast<AliMCEvent*>(event);
1051 if(gMCEvent){
1052 AliCollisionGeometry* headerH = dynamic_cast<AliCollisionGeometry*>(gMCEvent->GenEventHeader());
1053 if(headerH){
1054 gImpactParameter = headerH->ImpactParameter();
1055 gCentrality = gImpactParameter;
1056 }//MC header
1057 }//MC event cast
1058 }//MC
1059
1060 else{
1061 gCentrality = -1.;
1062 }
1063
1064 // calculate reference multiplicity always (not only in multiplicity mode)
1065 if(gAnalysisLevel == "ESD" || gAnalysisLevel == "MCESD"){
1066 AliESDEvent* gESDEvent = dynamic_cast<AliESDEvent*>(event);
1067 if(gESDEvent){
1068 gMultiplicity = fESDtrackCuts->GetReferenceMultiplicity(gESDEvent, AliESDtrackCuts::kTrackletsITSTPC,0.5);
1069 fHistMultiplicity->Fill(gMultiplicity);
1070 }//AliESDevent cast
1071 }//ESD mode
1072
1073 else if(gAnalysisLevel == "AOD"|| gAnalysisLevel == "MCAOD" || gAnalysisLevel == "MCAODrec" ){
1074 AliAODHeader *header = (AliAODHeader*) event->GetHeader();
1075 if ((fMultiplicityEstimator == "V0M")||
1076 (fMultiplicityEstimator == "V0A")||
1077 (fMultiplicityEstimator == "V0C") ||
1078 (fMultiplicityEstimator == "TPC")) {
1079 gMultiplicity = GetReferenceMultiplicityFromAOD(event);
1080 if(fDebugLevel) Printf("Reference multiplicity (calculated): %.0f",gMultiplicity);
1081 }
1082 else {
1083 if(header)
1084 gMultiplicity = header->GetRefMultiplicity();
1085 if(fDebugLevel) Printf("Reference multiplicity (AOD header): %.0f",gMultiplicity);
1086 }
1087 fHistMultiplicity->Fill(gMultiplicity);
1088 }//AOD mode
1089 else if(gAnalysisLevel == "MC") {
1090 AliMCEvent* gMCEvent = dynamic_cast<AliMCEvent*>(event);
1091 //Calculating the multiplicity as the number of charged primaries
1092 //within \pm 0.8 in eta and pT > 0.1 GeV/c
1093 for(Int_t iParticle = 0; iParticle < gMCEvent->GetNumberOfPrimaries(); iParticle++) {
1094 AliMCParticle* track = dynamic_cast<AliMCParticle *>(gMCEvent->GetTrack(iParticle));
1095 if (!track) {
1096 AliError(Form("Could not receive particle %d", iParticle));
1097 continue;
1098 }
1099
1100 //exclude non stable particles
1101 if(!(gMCEvent->IsPhysicalPrimary(iParticle))) continue;
1102
1103 //++++++++++++++++
1104 if (fMultiplicityEstimator == "V0M") {
1105 if((track->Eta() > 5.1 || track->Eta() < 2.8)&&(track->Eta() < -3.7 || track->Eta() > -1.7))
1106 continue;}
1107 else if (fMultiplicityEstimator == "V0A") {
1108 if(track->Eta() > 5.1 || track->Eta() < 2.8) continue;}
1109 else if (fMultiplicityEstimator == "V0C") {
1110 if(track->Eta() > -1.7 || track->Eta() < -3.7) continue;}
1111 else if (fMultiplicityEstimator == "TPC") {
1112 if(track->Eta() < fEtaMin || track->Eta() > fEtaMax) continue;
1113 if(track->Pt() < fPtMin || track->Pt() > fPtMax) continue;
1114 }
1115 else{
1116 if(track->Pt() < fPtMin || track->Pt() > fPtMax) continue;
1117 if(track->Eta() < fEtaMin || track->Eta() > fEtaMax) continue;
1118 }
1119 //++++++++++++++++
1120
1121 if(track->Charge() == 0) continue;
1122
1123 gMultiplicity += 1;
1124 }//loop over primaries
1125 fHistMultiplicity->Fill(gMultiplicity);
1126 }//MC mode
1127 else{
1128 gMultiplicity = -1;
1129 }
1130
1131
1132 // decide what should be returned only here
1133 Double_t lReturnVal = -100;
1134 if(fEventClass=="Multiplicity"){
1135 lReturnVal = gMultiplicity;
1136 }else if(fEventClass=="Centrality"){
1137 lReturnVal = gCentrality;
1138 }
1139 return lReturnVal;
1140}
1141
1142//________________________________________________________________________
1143Double_t AliAnalysisTaskBFPsi::GetReferenceMultiplicityFromAOD(AliVEvent *event){
1144 //Function that returns the reference multiplicity from AODs (data or reco MC)
1145 //Different ref. mult. implemented: V0M, V0A, V0C, TPC
1146 Double_t gRefMultiplicity = 0., gRefMultiplicityTPC = 0.;
1147 Double_t gRefMultiplicityVZERO = 0., gRefMultiplicityVZEROA = 0., gRefMultiplicityVZEROC = 0.;
1148
1149 AliAODHeader *header = dynamic_cast<AliAODHeader *>(event->GetHeader());
1150 if(!header) {
1151 Printf("ERROR: AOD header not available");
1152 return -999;
1153 }
1154 Int_t gRunNumber = header->GetRunNumber();
1155
1156 // Loop over tracks in event
1157 for (Int_t iTracks = 0; iTracks < event->GetNumberOfTracks(); iTracks++) {
1158 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack *>(event->GetTrack(iTracks));
1159 if (!aodTrack) {
1160 AliError(Form("Could not receive track %d", iTracks));
1161 continue;
1162 }
1163
1164 // AOD track cuts
1165 if(!aodTrack->TestFilterBit(fnAODtrackCutBit)) continue;
1166
1167 if(aodTrack->Charge() == 0) continue;
1168 // Kinematics cuts from ESD track cuts
1169 if( aodTrack->Pt() < fPtMin || aodTrack->Pt() > fPtMax) continue;
1170 if( aodTrack->Eta() < fEtaMin || aodTrack->Eta() > fEtaMax) continue;
1171
1172 //=================PID (so far only for electron rejection)==========================//
1173 if(fElectronRejection) {
1174 // get the electron nsigma
1175 Double_t nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(aodTrack,(AliPID::EParticleType)AliPID::kElectron));
1176
1177 // check only for given momentum range
1178 if( aodTrack->Pt() > fElectronRejectionMinPt && aodTrack->Pt() < fElectronRejectionMaxPt ){
1179 //look only at electron nsigma
1180 if(!fElectronOnlyRejection) {
1181 //Make the decision based on the n-sigma of electrons
1182 if(nSigma < fElectronRejectionNSigma) continue;
1183 }
1184 else {
1185 Double_t nSigmaPions = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(aodTrack,(AliPID::EParticleType)AliPID::kPion));
1186 Double_t nSigmaKaons = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(aodTrack,(AliPID::EParticleType)AliPID::kKaon));
1187 Double_t nSigmaProtons = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(aodTrack,(AliPID::EParticleType)AliPID::kProton));
1188
1189 //Make the decision based on the n-sigma of electrons exclusively ( = track not in nsigma region for other species)
1190 if(nSigma < fElectronRejectionNSigma
1191 && nSigmaPions > fElectronRejectionNSigma
1192 && nSigmaKaons > fElectronRejectionNSigma
1193 && nSigmaProtons > fElectronRejectionNSigma ) continue;
1194 }
1195 }
1196 }//electron rejection
1197
1198 gRefMultiplicityTPC += 1.0;
1199 }// track loop
1200
1201 //VZERO segmentation in two detectors (0-31: VZERO-C, 32-63: VZERO-A)
1202 for(Int_t iChannel = 0; iChannel < 64; iChannel++) {
1203 fHistVZEROSignal->Fill(iChannel,event->GetVZEROEqMultiplicity(iChannel));
1204
1205 if(iChannel < 32)
1206 gRefMultiplicityVZEROC += event->GetVZEROEqMultiplicity(iChannel);
1207 else if(iChannel >= 32)
1208 gRefMultiplicityVZEROA += event->GetVZEROEqMultiplicity(iChannel);
1209 }//loop over PMTs
1210
1211 //Equalization of gain
1212 Double_t gFactorA = GetEqualizationFactor(gRunNumber,"A");
1213 if(gFactorA != 0)
1214 gRefMultiplicityVZEROA /= gFactorA;
1215 Double_t gFactorC = GetEqualizationFactor(gRunNumber,"C");
1216 if(gFactorC != 0)
1217 gRefMultiplicityVZEROC /= gFactorC;
1218 if((gFactorA != 0)&&(gFactorC != 0))
1219 gRefMultiplicityVZERO = (gRefMultiplicityVZEROA/gFactorA)+(gRefMultiplicityVZEROC/gFactorC);
1220
1221 if(fDebugLevel)
1222 Printf("VZERO multiplicity: %.0f - TPC multiplicity: %.0f",gRefMultiplicityVZERO,gRefMultiplicityTPC);
1223
1224 fHistTPCvsVZEROMultiplicity->Fill(gRefMultiplicityVZERO,gRefMultiplicityTPC);
1225
1226 if(fMultiplicityEstimator == "TPC")
1227 gRefMultiplicity = gRefMultiplicityTPC;
1228 else if(fMultiplicityEstimator == "V0M")
1229 gRefMultiplicity = gRefMultiplicityVZERO;
1230 else if(fMultiplicityEstimator == "V0A")
1231 gRefMultiplicity = gRefMultiplicityVZEROA;
1232 else if(fMultiplicityEstimator == "V0C")
1233 gRefMultiplicity = gRefMultiplicityVZEROC;
1234
1235 return gRefMultiplicity;
1236}
1237
1238//________________________________________________________________________
1239Double_t AliAnalysisTaskBFPsi::GetEventPlane(AliVEvent *event){
1240 // Get the event plane
1241
1242 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
1243
1244 Float_t gVZEROEventPlane = -10.;
1245 Float_t gReactionPlane = -10.;
1246 Double_t qxTot = 0.0, qyTot = 0.0;
1247
1248 //MC: from reaction plane
1249 if(gAnalysisLevel == "MC"){
1250 if(!event) {
1251 AliError("mcEvent not available");
1252 return 0x0;
1253 }
1254
1255 AliMCEvent *gMCEvent = dynamic_cast<AliMCEvent*>(event);
1256 if(gMCEvent){
1257 AliCollisionGeometry* headerH = dynamic_cast<AliCollisionGeometry*>(gMCEvent->GenEventHeader());
1258 if (headerH) {
1259 gReactionPlane = headerH->ReactionPlaneAngle();
1260 //gReactionPlane *= TMath::RadToDeg();
1261 }//MC header
1262 }//MC event cast
1263 }//MC
1264
1265 // AOD,ESD,ESDMC: from VZERO Event Plane
1266 else{
1267
1268 AliEventplane *ep = event->GetEventplane();
1269 if(ep){
1270 gVZEROEventPlane = ep->CalculateVZEROEventPlane(event,10,2,qxTot,qyTot);
1271 if(gVZEROEventPlane < 0.) gVZEROEventPlane += TMath::Pi();
1272 //gReactionPlane = gVZEROEventPlane*TMath::RadToDeg();
1273 gReactionPlane = gVZEROEventPlane;
1274 }
1275 }//AOD,ESD,ESDMC
1276
1277 return gReactionPlane;
1278}
1279
1280//________________________________________________________________________
1281Double_t AliAnalysisTaskBFPsi::GetTrackbyTrackCorrectionMatrix( Double_t vEta,
1282 Double_t vPhi,
1283 Double_t vPt,
1284 Short_t vCharge,
1285 Double_t gCentrality) {
1286 // -- Get efficiency correction of particle dependent on (eta, phi, pt, charge, centrality)
1287
1288 Double_t correction = 1.;
c683985a 1289 Int_t gCentralityInt = -1;
967e4db5 1290
c683985a 1291 for (Int_t i=0; i<fCentralityArrayBinsForCorrections-1; i++){
1292 if((fCentralityArrayForCorrections[i] <= gCentrality)&&(gCentrality <= fCentralityArrayForCorrections[i+1])){
1293 gCentralityInt = i;
1294 break;
1295 }
1296 }
1297
1298 // centrality not in array --> no correction
1299 if(gCentralityInt < 0){
1300 correction = 1.;
1301 }
1302 else{
1303
1304 //Printf("//=============CENTRALITY=============// %d:",gCentralityInt);
1305
1306 if(fHistCorrectionPlus[gCentralityInt]){
1307 if (vCharge > 0) {
967e4db5 1308 correction = fHistCorrectionPlus[gCentralityInt]->GetBinContent(fHistCorrectionPlus[gCentralityInt]->FindBin(vEta,vPt,vPhi));
c683985a 1309 //Printf("CORRECTIONplus: %.2f | Centrality %d",correction,gCentralityInt);
1310 }
1311 if (vCharge < 0) {
967e4db5 1312 correction = fHistCorrectionPlus[gCentralityInt]->GetBinContent(fHistCorrectionMinus[gCentralityInt]->FindBin(vEta,vPt,vPhi));
1313 //Printf("CORRECTIONminus: %.2f | Centrality %d",correction,gCentralityInt);
c683985a 1314 }
1315 }
1316 else {
1317 correction = 1.;
1318 }
1319 }//centrality in array
1320
1321 if (correction == 0.) {
1322 AliError(Form("Should not happen : bin content = 0. >> eta: %.2f | phi : %.2f | pt : %.2f | cent %d",vEta, vPhi, vPt, gCentralityInt));
1323 correction = 1.;
1324 }
1325
1326 return correction;
1327}
1328
1329//________________________________________________________________________
1330TObjArray* AliAnalysisTaskBFPsi::GetAcceptedTracks(AliVEvent *event, Double_t gCentrality, Double_t gReactionPlane){
1331 // Returns TObjArray with tracks after all track cuts (only for AOD!)
1332 // Fills QA histograms
1333
1334 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
1335
1336 //output TObjArray holding all good tracks
1337 TObjArray* tracksAccepted = new TObjArray;
1338 tracksAccepted->SetOwner(kTRUE);
1339
1340 Short_t vCharge;
1341 Double_t vEta;
1342 Double_t vY;
1343 Double_t vPhi;
1344 Double_t vPt;
1345
1346
1347 if(gAnalysisLevel == "AOD") { // handling of TPC only tracks different in AOD and ESD
1348 // Loop over tracks in event
1349
1350 for (Int_t iTracks = 0; iTracks < event->GetNumberOfTracks(); iTracks++) {
1351 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack *>(event->GetTrack(iTracks));
1352 if (!aodTrack) {
1353 AliError(Form("Could not receive track %d", iTracks));
1354 continue;
1355 }
1356
1357 // AOD track cuts
1358
1359 // For ESD Filter Information: ANALYSIS/macros/AddTaskESDfilter.C
1360 // take only TPC only tracks
1361 //fHistTrackStats->Fill(aodTrack->GetFilterMap());
1362 for(Int_t iTrackBit = 0; iTrackBit < 16; iTrackBit++){
1363 fHistTrackStats->Fill(iTrackBit,aodTrack->TestFilterBit(1<<iTrackBit));
1364 }
1365
1366 if(!aodTrack->TestFilterBit(fnAODtrackCutBit)) continue;
1367
1368
1369 // additional check on kPrimary flag
1370 if(fCheckPrimaryFlagAOD){
1371 if(aodTrack->GetType() != AliAODTrack::kPrimary)
1372 continue;
1373 }
1374
1375
1376 vCharge = aodTrack->Charge();
1377 vEta = aodTrack->Eta();
1378 vY = aodTrack->Y();
1379 vPhi = aodTrack->Phi();// * TMath::RadToDeg();
1380 vPt = aodTrack->Pt();
1381
1382 //===========================PID (so far only for electron rejection)===============================//
1383 if(fElectronRejection) {
1384
1385 // get the electron nsigma
1386 Double_t nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(aodTrack,(AliPID::EParticleType)AliPID::kElectron));
1387
1388 //Fill QA before the PID
1389 fHistdEdxVsPTPCbeforePIDelectron -> Fill(aodTrack->P()*aodTrack->Charge(),aodTrack->GetTPCsignal());
1390 fHistNSigmaTPCvsPtbeforePIDelectron -> Fill(aodTrack->P()*aodTrack->Charge(),nSigma);
1391 //end of QA-before pid
1392
1393 // check only for given momentum range
1394 if( vPt > fElectronRejectionMinPt && vPt < fElectronRejectionMaxPt ){
1395
1396 //look only at electron nsigma
1397 if(!fElectronOnlyRejection){
1398
1399 //Make the decision based on the n-sigma of electrons
1400 if(nSigma < fElectronRejectionNSigma) continue;
1401 }
1402 else{
1403
1404 Double_t nSigmaPions = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(aodTrack,(AliPID::EParticleType)AliPID::kPion));
1405 Double_t nSigmaKaons = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(aodTrack,(AliPID::EParticleType)AliPID::kKaon));
1406 Double_t nSigmaProtons = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(aodTrack,(AliPID::EParticleType)AliPID::kProton));
1407
1408 //Make the decision based on the n-sigma of electrons exclusively ( = track not in nsigma region for other species)
1409 if(nSigma < fElectronRejectionNSigma
1410 && nSigmaPions > fElectronRejectionNSigma
1411 && nSigmaKaons > fElectronRejectionNSigma
1412 && nSigmaProtons > fElectronRejectionNSigma ) continue;
1413 }
1414 }
1415
1416 //Fill QA after the PID
1417 fHistdEdxVsPTPCafterPIDelectron -> Fill(aodTrack->P()*aodTrack->Charge(),aodTrack->GetTPCsignal());
1418 fHistNSigmaTPCvsPtafterPIDelectron -> Fill(aodTrack->P()*aodTrack->Charge(),nSigma);
1419
1420 }
1421 //===========================end of PID (so far only for electron rejection)===============================//
1422
1423 //+++++++++++++++++++++++++++++//
1424 //===========================PID===============================//
1425 if(fUsePID) {
1426 Double_t prob[AliPID::kSPECIES]={0.};
1427 Double_t probTPC[AliPID::kSPECIES]={0.};
1428 Double_t probTOF[AliPID::kSPECIES]={0.};
1429 Double_t probTPCTOF[AliPID::kSPECIES]={0.};
1430
1431 Double_t nSigma = 0.;
e573a392 1432 Double_t nSigmaTPC = 0.;
1433 Double_t nSigmaTOF = 0.;
1434 Double_t nSigmaTPCTOF = 0.;
c683985a 1435 UInt_t detUsedTPC = 0;
1436 UInt_t detUsedTOF = 0;
1437 UInt_t detUsedTPCTOF = 0;
1438
e573a392 1439 nSigmaTPC = fPIDResponse->NumberOfSigmasTPC(aodTrack,(AliPID::EParticleType)fParticleOfInterest);
1440 nSigmaTOF = fPIDResponse->NumberOfSigmasTOF(aodTrack,(AliPID::EParticleType)fParticleOfInterest);
c683985a 1441 nSigmaTPCTOF = TMath::Sqrt(nSigmaTPC*nSigmaTPC + nSigmaTOF*nSigmaTOF);
e573a392 1442 if (nSigmaTOF == 999 || nSigmaTOF == -999){
1443 nSigmaTPCTOF = nSigmaTPC;
1444 }
c683985a 1445
1446 //Decide what detector configuration we want to use
1447 switch(fPidDetectorConfig) {
1448 case kTPCpid:
1449 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
1450 nSigma = nSigmaTPC;
1451 detUsedTPC = fPIDCombined->ComputeProbabilities(aodTrack, fPIDResponse, probTPC);
1452 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
1453 prob[iSpecies] = probTPC[iSpecies];
1454 break;
1455 case kTOFpid:
1456 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF);
1457 nSigma = nSigmaTOF;
1458 detUsedTOF = fPIDCombined->ComputeProbabilities(aodTrack, fPIDResponse, probTOF);
1459 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
1460 prob[iSpecies] = probTOF[iSpecies];
1461 break;
1462 case kTPCTOF:
1463 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC);
1464 nSigma = nSigmaTPCTOF;
1465 detUsedTPCTOF = fPIDCombined->ComputeProbabilities(aodTrack, fPIDResponse, probTPCTOF);
1466 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
1467 prob[iSpecies] = probTPCTOF[iSpecies];
1468 break;
1469 default:
1470 break;
1471 }//end switch: define detector mask
1472
1473 //Filling the PID QA
1474 Double_t tofTime = -999., length = 999., tof = -999.;
1475 Double_t c = TMath::C()*1.E-9;// m/ns
1476 Double_t beta = -999.;
c683985a 1477
e573a392 1478 Float_t probMis = fPIDResponse->GetTOFMismatchProbability(aodTrack);
1479 if (probMis < 0.01) { //if u want to reduce mismatch using also TPC
1480
1481 if ((aodTrack->IsOn(AliAODTrack::kITSin)) && (aodTrack->IsOn(AliAODTrack::kTOFpid)) ) { //leonardo's analysis
c683985a 1482
e573a392 1483 tofTime = aodTrack->GetTOFsignal();//in ps
1484 length = aodTrack->GetIntegratedLength();
1485 tof = tofTime*1E-3; // ns
1486 if (tof <= 0) {
1487 //Printf("WARNING: track with negative TOF time found! Skipping this track for PID checks\n");
1488 continue;
1489 }
1490 if (length <= 0){
1491 //printf("WARNING: track with negative length found!Skipping this track for PID checks\n");
1492 continue;
1493 }
1494 length = length*0.01; // in meters
1495 tof = tof*c;
1496 beta = length/tof;
1497
1498 fHistBetavsPTOFbeforePID ->Fill(aodTrack->P()*aodTrack->Charge(),beta);
1499 fHistProbTOFvsPtbeforePID ->Fill(aodTrack->Pt(),probTOF[fParticleOfInterest]);
1500 fHistNSigmaTOFvsPtbeforePID ->Fill(aodTrack->Pt(),nSigmaTOF);
1501 }//TOF signal
c683985a 1502
e573a392 1503 fHistdEdxVsPTPCbeforePID -> Fill(aodTrack->GetTPCmomentum()*aodTrack->Charge(),aodTrack->GetTPCsignal()); //aodTrack->P()*aodTrack->Charge()
1504 fHistProbTPCvsPtbeforePID -> Fill(aodTrack->Pt(),probTPC[fParticleOfInterest]);
1505 fHistNSigmaTPCvsPtbeforePID -> Fill(aodTrack->Pt(),nSigmaTPC);
1506 fHistProbTPCTOFvsPtbeforePID -> Fill(aodTrack->Pt(),probTPCTOF[fParticleOfInterest]);
c683985a 1507
e573a392 1508 //combined TPC&TOF
1509 fHistBetaVsdEdXbeforePID->Fill(aodTrack->GetTPCsignal(),beta);
1510 fHistNSigmaTPCTOFvsPtbeforePID -> Fill(aodTrack->Pt(),nSigmaTPCTOF);
1511 fHistNSigmaTPCTOFPbefPID ->Fill(nSigmaTPC,nSigmaTOF,aodTrack->P()); //++++++++++++++
1512 //Printf("NSIGMA: %lf - nSigmaTOF: %lf - nSigmaTPC: %lf - nSigmaTPCTOF: %lf",nSigma,nSigmaTOF,nSigmaTPC,nSigmaTPCTOF);
1513 //end of QA-before pid
1514
1515 if ((detUsedTPC != 0)||(detUsedTOF != 0)||(detUsedTPCTOF != 0)) {
1516 //Make the decision based on the n-sigma
1517 if(fUsePIDnSigma) {
1518 if(nSigma > fPIDNSigma || nSigma < -fPIDNSigma) continue;
1519
1520 fHistNSigmaTOFvsPtafterPID ->Fill(aodTrack->Pt(),nSigmaTOF);
1521 fHistNSigmaTPCvsPtafterPID ->Fill(aodTrack->Pt(),nSigmaTPC);
1522 fHistNSigmaTPCTOFvsPtafterPID ->Fill(aodTrack->Pt(),nSigmaTPCTOF);
1523 fHistNSigmaTPCTOFPafterPID ->Fill(nSigmaTPC,nSigmaTOF,aodTrack->P()); //++++++++++++++
1524 }
1525 //Make the decision based on the bayesian
1526 else if(fUsePIDPropabilities) {
1527 if(fParticleOfInterest != TMath::LocMax(AliPID::kSPECIES,prob)) continue;
1528 if (prob[fParticleOfInterest] < fMinAcceptedPIDProbability) continue;
1529
1530 fHistProbTOFvsPtafterPID ->Fill(aodTrack->Pt(),probTOF[fParticleOfInterest]);
1531 fHistProbTPCvsPtafterPID ->Fill(aodTrack->Pt(),probTPC[fParticleOfInterest]);
1532 fHistProbTPCTOFvsPtafterPID ->Fill(aodTrack->Pt(),probTPCTOF[fParticleOfInterest]);
1533 }
c683985a 1534
e573a392 1535 //Fill QA after the PID
1536 fHistBetavsPTOFafterPID ->Fill(aodTrack->P()*aodTrack->Charge(),beta);
1537 fHistdEdxVsPTPCafterPID ->Fill(aodTrack->P()*aodTrack->Charge(),aodTrack->GetTPCsignal());
1538 fHistBetaVsdEdXafterPID ->Fill(aodTrack->GetTPCsignal(),beta);
1539 }
c683985a 1540 }
1541 }
1542 //===========================PID===============================//
1543 //+++++++++++++++++++++++++++++//
1544
1545
1546 Float_t dcaXY = aodTrack->DCA(); // this is the DCA from global track (not exactly what is cut on)
1547 Float_t dcaZ = aodTrack->ZAtDCA(); // this is the DCA from global track (not exactly what is cut on)
1548
1549
1550 // Kinematics cuts from ESD track cuts
1551 if( vPt < fPtMin || vPt > fPtMax) continue;
1552 if( vEta < fEtaMin || vEta > fEtaMax) continue;
1553
1554 // Extra DCA cuts (for systematic studies [!= -1])
1555 if( fDCAxyCut != -1 && fDCAzCut != -1){
1556 if(TMath::Sqrt((dcaXY*dcaXY)/(fDCAxyCut*fDCAxyCut)+(dcaZ*dcaZ)/(fDCAzCut*fDCAzCut)) > 1 ){
1557 continue; // 2D cut
1558 }
1559 }
1560
1561 // Extra TPC cuts (for systematic studies [!= -1])
1562 if( fTPCchi2Cut != -1 && aodTrack->Chi2perNDF() > fTPCchi2Cut){
1563 continue;
1564 }
1565 if( fNClustersTPCCut != -1 && aodTrack->GetTPCNcls() < fNClustersTPCCut){
1566 continue;
1567 }
096141dd 1568
1569 // Extra cut on shared clusters
1570 if( fTPCsharedCut != -1 && aodTrack->GetTPCnclsS() > fTPCsharedCut){
1571 continue;
1572 }
c683985a 1573
1574 // fill QA histograms
1575 fHistClus->Fill(aodTrack->GetITSNcls(),aodTrack->GetTPCNcls());
1576 fHistDCA->Fill(dcaZ,dcaXY);
1577 fHistChi2->Fill(aodTrack->Chi2perNDF(),gCentrality);
1578 fHistPt->Fill(vPt,gCentrality);
1579 fHistEta->Fill(vEta,gCentrality);
1580 fHistRapidity->Fill(vY,gCentrality);
1581 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
1582 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
1583 fHistPhi->Fill(vPhi,gCentrality);
1584 if(vCharge > 0) fHistEtaPhiPos->Fill(vEta,vPhi,gCentrality);
1585 else if(vCharge < 0) fHistEtaPhiNeg->Fill(vEta,vPhi,gCentrality);
1586
1587 //=======================================correction
1588 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
1589 //Printf("CORRECTIONminus: %.2f | Centrality %lf",correction,gCentrality);
1590
1591 // add the track to the TObjArray
1592 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
1593 }//track loop
1594 }// AOD analysis
1595
b66d1de3 1596
3b408588 1597 // nano AODs
1598 else if(gAnalysisLevel == "AODnano") { // not fully supported yet (PID missing)
1599 // Loop over tracks in event
1600
1601 for (Int_t iTracks = 0; iTracks < event->GetNumberOfTracks(); iTracks++) {
b66d1de3 1602 AliVTrack* aodTrack = dynamic_cast<AliVTrack *>(event->GetTrack(iTracks));
3b408588 1603 if (!aodTrack) {
1604 AliError(Form("Could not receive track %d", iTracks));
1605 continue;
1606 }
1607
b66d1de3 1608 // AOD track cuts (not needed)
1609 //if(!aodTrack->TestFilterBit(fnAODtrackCutBit)) continue;
3b408588 1610
1611 vCharge = aodTrack->Charge();
1612 vEta = aodTrack->Eta();
b66d1de3 1613 vY = -999.;
3b408588 1614 vPhi = aodTrack->Phi();// * TMath::RadToDeg();
1615 vPt = aodTrack->Pt();
b66d1de3 1616
3b408588 1617
1618 // Kinematics cuts from ESD track cuts
1619 if( vPt < fPtMin || vPt > fPtMax) continue;
1620 if( vEta < fEtaMin || vEta > fEtaMax) continue;
1621
b66d1de3 1622
3b408588 1623 // fill QA histograms
3b408588 1624 fHistPt->Fill(vPt,gCentrality);
1625 fHistEta->Fill(vEta,gCentrality);
1626 fHistRapidity->Fill(vY,gCentrality);
1627 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
1628 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
1629 fHistPhi->Fill(vPhi,gCentrality);
1630 if(vCharge > 0) fHistEtaPhiPos->Fill(vEta,vPhi,gCentrality);
1631 else if(vCharge < 0) fHistEtaPhiNeg->Fill(vEta,vPhi,gCentrality);
1632
1633 //=======================================correction
1634 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
1635 //Printf("CORRECTIONminus: %.2f | Centrality %lf",correction,gCentrality);
1636
1637 // add the track to the TObjArray
1638 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
1639 }//track loop
1640 }// AOD nano analysis
1641
1642
c683985a 1643 //==============================================================================================================
1644 else if(gAnalysisLevel == "MCAOD") {
1645
1646 AliMCEvent* mcEvent = MCEvent();
1647 if (!mcEvent) {
1648 AliError("ERROR: Could not retrieve MC event");
1649 }
1650 else{
1651
1652 for (Int_t iTracks = 0; iTracks < mcEvent->GetNumberOfTracks(); iTracks++) {
1653 AliAODMCParticle *aodTrack = (AliAODMCParticle*) mcEvent->GetTrack(iTracks);
1654 if (!aodTrack) {
1655 AliError(Form("ERROR: Could not receive track %d (mc loop)", iTracks));
1656 continue;
1657 }
1658
1659 if(!aodTrack->IsPhysicalPrimary()) continue;
1660
1661 vCharge = aodTrack->Charge();
1662 vEta = aodTrack->Eta();
1663 vY = aodTrack->Y();
1664 vPhi = aodTrack->Phi();// * TMath::RadToDeg();
1665 vPt = aodTrack->Pt();
1666
1667 // Kinematics cuts from ESD track cuts
1668 if( vPt < fPtMin || vPt > fPtMax) continue;
1669 if( vEta < fEtaMin || vEta > fEtaMax) continue;
1670
1671 // Remove neutral tracks
1672 if( vCharge == 0 ) continue;
1673
1674 //Exclude resonances
1675 if(fExcludeResonancesInMC) {
1676
1677 Bool_t kExcludeParticle = kFALSE;
1678 Int_t gMotherIndex = aodTrack->GetMother();
1679 if(gMotherIndex != -1) {
1680 AliAODMCParticle* motherTrack = dynamic_cast<AliAODMCParticle *>(mcEvent->GetTrack(gMotherIndex));
1681 if(motherTrack) {
1682 Int_t pdgCodeOfMother = motherTrack->GetPdgCode();
1683 //if((pdgCodeOfMother == 113)||(pdgCodeOfMother == 213)||(pdgCodeOfMother == 221)||(pdgCodeOfMother == 223)||(pdgCodeOfMother == 331)||(pdgCodeOfMother == 333)) {
1684 //if(pdgCodeOfMother == 113) {
1685 if(pdgCodeOfMother == 113 // rho0
1686 || pdgCodeOfMother == 213 || pdgCodeOfMother == -213 // rho+
1687 // || pdgCodeOfMother == 221 // eta
1688 // || pdgCodeOfMother == 331 // eta'
1689 // || pdgCodeOfMother == 223 // omega
1690 // || pdgCodeOfMother == 333 // phi
1691 || pdgCodeOfMother == 311 || pdgCodeOfMother == -311 // K0
1692 // || pdgCodeOfMother == 313 || pdgCodeOfMother == -313 // K0*
1693 // || pdgCodeOfMother == 323 || pdgCodeOfMother == -323 // K+*
1694 || pdgCodeOfMother == 3122 || pdgCodeOfMother == -3122 // Lambda
1695 || pdgCodeOfMother == 111 // pi0 Dalitz
1696 || pdgCodeOfMother == 22 // photon
1697 ) {
1698 kExcludeParticle = kTRUE;
1699 }
1700 }
1701 }
1702
1703 //Exclude from the analysis decay products of rho0, rho+, eta, eta' and phi
1704 if(kExcludeParticle) continue;
1705 }
1706
1707 //Exclude electrons with PDG
1708 if(fExcludeElectronsInMC) {
1709
1710 if(TMath::Abs(aodTrack->GetPdgCode()) == 11) continue;
1711
1712 }
1713
1714 // fill QA histograms
1715 fHistPt->Fill(vPt,gCentrality);
1716 fHistEta->Fill(vEta,gCentrality);
1717 fHistRapidity->Fill(vY,gCentrality);
1718 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
1719 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
1720 fHistPhi->Fill(vPhi,gCentrality);
1721 if(vCharge > 0) fHistEtaPhiPos->Fill(vEta,vPhi,gCentrality);
1722 else if(vCharge < 0) fHistEtaPhiNeg->Fill(vEta,vPhi,gCentrality);
1723
1724 //=======================================correction
1725 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
1726 //Printf("CORRECTIONminus: %.2f | Centrality %lf",correction,gCentrality);
1727
1728 // add the track to the TObjArray
1729 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
1730 }//aodTracks
1731 }//MC event
1732 }//MCAOD
1733 //==============================================================================================================
1734
1735 //==============================================================================================================
1736 else if(gAnalysisLevel == "MCAODrec") {
1737
1738 /* fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
1739 if (!fAOD) {
1740 printf("ERROR: fAOD not available\n");
1741 return;
1742 }*/
1743
1744 fArrayMC = dynamic_cast<TClonesArray*>(event->FindListObject(AliAODMCParticle::StdBranchName()));
1745 if (!fArrayMC) {
1746 AliError("No array of MC particles found !!!");
1747 }
1748
1749 AliMCEvent* mcEvent = MCEvent();
1750 if (!mcEvent) {
1751 AliError("ERROR: Could not retrieve MC event");
1752 return tracksAccepted;
1753 }
1754
1755 for (Int_t iTracks = 0; iTracks < event->GetNumberOfTracks(); iTracks++) {
1756 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack *>(event->GetTrack(iTracks));
1757 if (!aodTrack) {
1758 AliError(Form("Could not receive track %d", iTracks));
1759 continue;
1760 }
1761
1762 for(Int_t iTrackBit = 0; iTrackBit < 16; iTrackBit++){
1763 fHistTrackStats->Fill(iTrackBit,aodTrack->TestFilterBit(1<<iTrackBit));
1764 }
1765 if(!aodTrack->TestFilterBit(fnAODtrackCutBit)) continue;
1766
1767 vCharge = aodTrack->Charge();
1768 vEta = aodTrack->Eta();
1769 vY = aodTrack->Y();
1770 vPhi = aodTrack->Phi();// * TMath::RadToDeg();
1771 vPt = aodTrack->Pt();
1772
1773 //===========================use MC information for Kinematics===============================//
1774 if(fUseMCforKinematics){
1775
1776 Int_t label = TMath::Abs(aodTrack->GetLabel());
1777 AliAODMCParticle *AODmcTrack = (AliAODMCParticle*) fArrayMC->At(label);
1778
1779 if(AODmcTrack){
1780 vCharge = AODmcTrack->Charge();
1781 vEta = AODmcTrack->Eta();
1782 vY = AODmcTrack->Y();
1783 vPhi = AODmcTrack->Phi();// * TMath::RadToDeg();
1784 vPt = AODmcTrack->Pt();
1785 }
1786 else{
1787 AliDebug(1, "no MC particle for this track");
1788 continue;
1789 }
1790 }
1791 //===========================end of use MC information for Kinematics========================//
1792
1793
1794 //===========================PID (so far only for electron rejection)===============================//
1795 if(fElectronRejection) {
1796
1797 // get the electron nsigma
1798 Double_t nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(aodTrack,(AliPID::EParticleType)AliPID::kElectron));
1799
1800 //Fill QA before the PID
1801 fHistdEdxVsPTPCbeforePIDelectron -> Fill(aodTrack->P()*aodTrack->Charge(),aodTrack->GetTPCsignal());
1802 fHistNSigmaTPCvsPtbeforePIDelectron -> Fill(aodTrack->P()*aodTrack->Charge(),nSigma);
1803 //end of QA-before pid
1804
1805 // check only for given momentum range
1806 if( vPt > fElectronRejectionMinPt && vPt < fElectronRejectionMaxPt ){
1807
1808 //look only at electron nsigma
1809 if(!fElectronOnlyRejection){
1810
1811 //Make the decision based on the n-sigma of electrons
1812 if(nSigma < fElectronRejectionNSigma) continue;
1813 }
1814 else{
1815
1816 Double_t nSigmaPions = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(aodTrack,(AliPID::EParticleType)AliPID::kPion));
1817 Double_t nSigmaKaons = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(aodTrack,(AliPID::EParticleType)AliPID::kKaon));
1818 Double_t nSigmaProtons = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(aodTrack,(AliPID::EParticleType)AliPID::kProton));
1819
1820 //Make the decision based on the n-sigma of electrons exclusively ( = track not in nsigma region for other species)
1821 if(nSigma < fElectronRejectionNSigma
1822 && nSigmaPions > fElectronRejectionNSigma
1823 && nSigmaKaons > fElectronRejectionNSigma
1824 && nSigmaProtons > fElectronRejectionNSigma ) continue;
1825 }
1826 }
1827
1828 //Fill QA after the PID
1829 fHistdEdxVsPTPCafterPIDelectron -> Fill(aodTrack->P()*aodTrack->Charge(),aodTrack->GetTPCsignal());
1830 fHistNSigmaTPCvsPtafterPIDelectron -> Fill(aodTrack->P()*aodTrack->Charge(),nSigma);
1831
1832 }
1833 //===========================end of PID (so far only for electron rejection)===============================//
1834
1835 Float_t dcaXY = aodTrack->DCA(); // this is the DCA from global track (not exactly what is cut on)
1836 Float_t dcaZ = aodTrack->ZAtDCA(); // this is the DCA from global track (not exactly what is cut on)
1837
1838 // Kinematics cuts from ESD track cuts
1839 if( vPt < fPtMin || vPt > fPtMax) continue;
1840 if( vEta < fEtaMin || vEta > fEtaMax) continue;
1841
1842 // Extra DCA cuts (for systematic studies [!= -1])
1843 if( fDCAxyCut != -1 && fDCAzCut != -1){
1844 if(TMath::Sqrt((dcaXY*dcaXY)/(fDCAxyCut*fDCAxyCut)+(dcaZ*dcaZ)/(fDCAzCut*fDCAzCut)) > 1 ){
1845 continue; // 2D cut
1846 }
1847 }
1848
1849 // Extra TPC cuts (for systematic studies [!= -1])
1850 if( fTPCchi2Cut != -1 && aodTrack->Chi2perNDF() > fTPCchi2Cut){
1851 continue;
1852 }
1853 if( fNClustersTPCCut != -1 && aodTrack->GetTPCNcls() < fNClustersTPCCut){
1854 continue;
1855 }
1856
096141dd 1857 // Extra cut on shared clusters
1858 if( fTPCsharedCut != -1 && aodTrack->GetTPCnclsS() > fTPCsharedCut){
1859 continue;
1860 }
1861
c683985a 1862 //Exclude resonances
1863 if(fExcludeResonancesInMC) {
1864
1865 Bool_t kExcludeParticle = kFALSE;
1866
1867 Int_t label = TMath::Abs(aodTrack->GetLabel());
1868 AliAODMCParticle *AODmcTrack = (AliAODMCParticle*) fArrayMC->At(label);
1869
1870 if (AODmcTrack){
1871 //if (AODmcTrack->IsPhysicalPrimary()){
1872
1873 Int_t gMotherIndex = AODmcTrack->GetMother();
1874 if(gMotherIndex != -1) {
1875 AliAODMCParticle* motherTrack = dynamic_cast<AliAODMCParticle *>(mcEvent->GetTrack(gMotherIndex));
1876 if(motherTrack) {
1877 Int_t pdgCodeOfMother = motherTrack->GetPdgCode();
1878 if(pdgCodeOfMother == 113 // rho0
1879 || pdgCodeOfMother == 213 || pdgCodeOfMother == -213 // rho+
1880 // || pdgCodeOfMother == 221 // eta
1881 // || pdgCodeOfMother == 331 // eta'
1882 // || pdgCodeOfMother == 223 // omega
1883 // || pdgCodeOfMother == 333 // phi
1884 || pdgCodeOfMother == 311 || pdgCodeOfMother == -311 // K0
1885 // || pdgCodeOfMother == 313 || pdgCodeOfMother == -313 // K0*
1886 // || pdgCodeOfMother == 323 || pdgCodeOfMother == -323 // K+*
1887 || pdgCodeOfMother == 3122 || pdgCodeOfMother == -3122 // Lambda
1888 || pdgCodeOfMother == 111 // pi0 Dalitz
1889 || pdgCodeOfMother == 22 // photon
1890 ) {
1891 kExcludeParticle = kTRUE;
1892 }
1893 }
1894 }
1895 }
1896 //Exclude from the analysis decay products of rho0, rho+, eta, eta' and phi
1897 if(kExcludeParticle) continue;
1898 }
1899
1900 //Exclude electrons with PDG
1901 if(fExcludeElectronsInMC) {
1902
1903 Int_t label = TMath::Abs(aodTrack->GetLabel());
1904 AliAODMCParticle *AODmcTrack = (AliAODMCParticle*) fArrayMC->At(label);
1905
1906 if (AODmcTrack){
1907 if(TMath::Abs(AODmcTrack->GetPdgCode()) == 11) continue;
1908 }
1909 }
1910
1911 // fill QA histograms
1912 fHistClus->Fill(aodTrack->GetITSNcls(),aodTrack->GetTPCNcls());
1913 fHistDCA->Fill(dcaZ,dcaXY);
1914 fHistChi2->Fill(aodTrack->Chi2perNDF(),gCentrality);
1915 fHistPt->Fill(vPt,gCentrality);
1916 fHistEta->Fill(vEta,gCentrality);
1917 fHistRapidity->Fill(vY,gCentrality);
1918 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
1919 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
1920 fHistPhi->Fill(vPhi,gCentrality);
1921 if(vCharge > 0) fHistEtaPhiPos->Fill(vEta,vPhi,gCentrality);
1922 else if(vCharge < 0) fHistEtaPhiNeg->Fill(vEta,vPhi,gCentrality);
1923
1924 //=======================================correction
1925 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
1926 //Printf("CORRECTIONminus: %.2f | Centrality %lf",correction,gCentrality);
1927
1928 // add the track to the TObjArray
1929 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
1930 }//track loop
1931 }//MCAODrec
1932 //==============================================================================================================
1933
1934 else if(gAnalysisLevel == "ESD" || gAnalysisLevel == "MCESD") { // handling of TPC only tracks different in AOD and ESD
1935
1936 AliESDtrack *trackTPC = NULL;
1937 AliMCParticle *mcTrack = NULL;
1938
1939 AliMCEvent* mcEvent = NULL;
1940
1941 // for MC ESDs use also MC information
1942 if(gAnalysisLevel == "MCESD"){
1943 mcEvent = MCEvent();
1944 if (!mcEvent) {
1945 AliError("mcEvent not available");
1946 return tracksAccepted;
1947 }
1948 }
1949
1950 // Loop over tracks in event
1951 for (Int_t iTracks = 0; iTracks < event->GetNumberOfTracks(); iTracks++) {
1952 AliESDtrack* track = dynamic_cast<AliESDtrack *>(event->GetTrack(iTracks));
1953 if (!track) {
1954 AliError(Form("Could not receive track %d", iTracks));
1955 continue;
1956 }
1957
1958 // for MC ESDs use also MC information --> MC track not used further???
1959 if(gAnalysisLevel == "MCESD"){
1960 Int_t label = TMath::Abs(track->GetLabel());
1961 if(label > mcEvent->GetNumberOfTracks()) continue;
1962 if(label > mcEvent->GetNumberOfPrimaries()) continue;
1963
1964 mcTrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(label));
1965 if(!mcTrack) continue;
1966 }
1967
1968 // take only TPC only tracks
1969 trackTPC = new AliESDtrack();
1970 if(!track->FillTPCOnlyTrack(*trackTPC)) continue;
1971
1972 //ESD track cuts
1973 if(fESDtrackCuts)
1974 if(!fESDtrackCuts->AcceptTrack(trackTPC)) continue;
1975
1976 // fill QA histograms
1977 Float_t b[2];
1978 Float_t bCov[3];
1979 trackTPC->GetImpactParameters(b,bCov);
1980 if (bCov[0]<=0 || bCov[2]<=0) {
1981 AliDebug(1, "Estimated b resolution lower or equal zero!");
1982 bCov[0]=0; bCov[2]=0;
1983 }
1984
1985 Int_t nClustersTPC = -1;
1986 nClustersTPC = trackTPC->GetTPCNclsIter1(); // TPC standalone
1987 //nClustersTPC = track->GetTPCclusters(0); // global track
1988 Float_t chi2PerClusterTPC = -1;
1989 if (nClustersTPC!=0) {
1990 chi2PerClusterTPC = trackTPC->GetTPCchi2Iter1()/Float_t(nClustersTPC); // TPC standalone
1991 //chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC); // global track
1992 }
1993
1994 //===========================PID===============================//
1995 if(fUsePID) {
1996 Double_t prob[AliPID::kSPECIES]={0.};
1997 Double_t probTPC[AliPID::kSPECIES]={0.};
1998 Double_t probTOF[AliPID::kSPECIES]={0.};
1999 Double_t probTPCTOF[AliPID::kSPECIES]={0.};
2000
2001 Double_t nSigma = 0.;
2002 UInt_t detUsedTPC = 0;
2003 UInt_t detUsedTOF = 0;
2004 UInt_t detUsedTPCTOF = 0;
2005
2006 //Decide what detector configuration we want to use
2007 switch(fPidDetectorConfig) {
2008 case kTPCpid:
2009 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
2010 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)fParticleOfInterest));
2011 detUsedTPC = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPC);
2012 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
2013 prob[iSpecies] = probTPC[iSpecies];
2014 break;
2015 case kTOFpid:
2016 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF);
2017 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)fParticleOfInterest));
2018 detUsedTOF = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTOF);
2019 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
2020 prob[iSpecies] = probTOF[iSpecies];
2021 break;
2022 case kTPCTOF:
2023 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC);
2024 detUsedTPCTOF = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPCTOF);
2025 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
2026 prob[iSpecies] = probTPCTOF[iSpecies];
2027 break;
2028 default:
2029 break;
2030 }//end switch: define detector mask
2031
2032 //Filling the PID QA
2033 Double_t tofTime = -999., length = 999., tof = -999.;
2034 Double_t c = TMath::C()*1.E-9;// m/ns
2035 Double_t beta = -999.;
2036 Double_t nSigmaTOFForParticleOfInterest = -999.;
2037 if ( (track->IsOn(AliESDtrack::kTOFin)) &&
2038 (track->IsOn(AliESDtrack::kTIME)) ) {
2039 tofTime = track->GetTOFsignal();//in ps
2040 length = track->GetIntegratedLength();
2041 tof = tofTime*1E-3; // ns
2042
2043 if (tof <= 0) {
2044 //Printf("WARNING: track with negative TOF time found! Skipping this track for PID checks\n");
2045 continue;
2046 }
2047 if (length <= 0){
2048 //printf("WARNING: track with negative length found!Skipping this track for PID checks\n");
2049 continue;
2050 }
2051
2052 length = length*0.01; // in meters
2053 tof = tof*c;
2054 beta = length/tof;
2055
2056 nSigmaTOFForParticleOfInterest = fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)fParticleOfInterest);
2057 fHistBetavsPTOFbeforePID ->Fill(track->P()*track->Charge(),beta);
2058 fHistProbTOFvsPtbeforePID ->Fill(track->Pt(),probTOF[fParticleOfInterest]);
2059 fHistNSigmaTOFvsPtbeforePID ->Fill(track->Pt(),nSigmaTOFForParticleOfInterest);
2060 }//TOF signal
2061
2062
2063 Double_t nSigmaTPCForParticleOfInterest = fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)fParticleOfInterest);
2064 fHistdEdxVsPTPCbeforePID -> Fill(track->P()*track->Charge(),track->GetTPCsignal());
2065 fHistProbTPCvsPtbeforePID -> Fill(track->Pt(),probTPC[fParticleOfInterest]);
2066 fHistNSigmaTPCvsPtbeforePID -> Fill(track->Pt(),nSigmaTPCForParticleOfInterest);
2067 fHistProbTPCTOFvsPtbeforePID -> Fill(track->Pt(),probTPCTOF[fParticleOfInterest]);
2068 //end of QA-before pid
2069
2070 if ((detUsedTPC != 0)||(detUsedTOF != 0)||(detUsedTPCTOF != 0)) {
2071 //Make the decision based on the n-sigma
2072 if(fUsePIDnSigma) {
2073 if(nSigma > fPIDNSigma) continue;}
2074
2075 //Make the decision based on the bayesian
2076 else if(fUsePIDPropabilities) {
2077 if(fParticleOfInterest != TMath::LocMax(AliPID::kSPECIES,prob)) continue;
2078 if (prob[fParticleOfInterest] < fMinAcceptedPIDProbability) continue;
2079 }
2080
2081 //Fill QA after the PID
2082 fHistBetavsPTOFafterPID ->Fill(track->P()*track->Charge(),beta);
2083 fHistProbTOFvsPtafterPID ->Fill(track->Pt(),probTOF[fParticleOfInterest]);
2084 fHistNSigmaTOFvsPtafterPID ->Fill(track->Pt(),nSigmaTOFForParticleOfInterest);
2085
2086 fHistdEdxVsPTPCafterPID -> Fill(track->P()*track->Charge(),track->GetTPCsignal());
2087 fHistProbTPCvsPtafterPID -> Fill(track->Pt(),probTPC[fParticleOfInterest]);
2088 fHistProbTPCTOFvsPtafterPID -> Fill(track->Pt(),probTPCTOF[fParticleOfInterest]);
2089 fHistNSigmaTPCvsPtafterPID -> Fill(track->Pt(),nSigmaTPCForParticleOfInterest);
2090 }
2091 }
2092 //===========================PID===============================//
2093 vCharge = trackTPC->Charge();
2094 vY = trackTPC->Y();
2095 vEta = trackTPC->Eta();
2096 vPhi = trackTPC->Phi();// * TMath::RadToDeg();
2097 vPt = trackTPC->Pt();
2098 fHistClus->Fill(trackTPC->GetITSclusters(0),nClustersTPC);
2099 fHistDCA->Fill(b[1],b[0]);
2100 fHistChi2->Fill(chi2PerClusterTPC,gCentrality);
2101 fHistPt->Fill(vPt,gCentrality);
2102 fHistEta->Fill(vEta,gCentrality);
2103 fHistPhi->Fill(vPhi,gCentrality);
2104 if(vCharge > 0) fHistEtaPhiPos->Fill(vEta,vPhi,gCentrality);
2105 else if(vCharge < 0) fHistEtaPhiNeg->Fill(vEta,vPhi,gCentrality);
2106 fHistRapidity->Fill(vY,gCentrality);
2107 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
2108 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
2109
2110 //=======================================correction
2111 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
2112 //Printf("CORRECTIONminus: %.2f | Centrality %lf",correction,gCentrality);
2113
2114 // add the track to the TObjArray
2115 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
2116
2117 delete trackTPC;
2118 }//track loop
2119 }// ESD analysis
2120
2121 else if(gAnalysisLevel == "MC"){
2122 if(!event) {
2123 AliError("mcEvent not available");
2124 return 0x0;
2125 }
2126
2127 AliMCEvent *gMCEvent = dynamic_cast<AliMCEvent*>(event);
2128 if(gMCEvent) {
2129 // Loop over tracks in event
2130 for (Int_t iTracks = 0; iTracks < gMCEvent->GetNumberOfPrimaries(); iTracks++) {
2131 AliMCParticle* track = dynamic_cast<AliMCParticle *>(gMCEvent->GetTrack(iTracks));
2132 if (!track) {
2133 AliError(Form("Could not receive particle %d", iTracks));
2134 continue;
2135 }
2136
2137 //exclude non stable particles
2138 if(!(gMCEvent->IsPhysicalPrimary(iTracks))) continue;
2139
2140 vCharge = track->Charge();
2141 vEta = track->Eta();
2142 vPt = track->Pt();
2143 vY = track->Y();
2144
2145 if( vPt < fPtMin || vPt > fPtMax)
2146 continue;
2147 if (!fUsePID) {
2148 if( vEta < fEtaMin || vEta > fEtaMax) continue;
2149 }
2150 else if (fUsePID){
2151 if( vY < fEtaMin || vY > fEtaMax) continue;
2152 }
2153
2154 // Remove neutral tracks
2155 if( vCharge == 0 ) continue;
2156
2157 //analyze one set of particles
2158 if(fUseMCPdgCode) {
2159 TParticle *particle = track->Particle();
2160 if(!particle) continue;
2161
2162 Int_t gPdgCode = particle->GetPdgCode();
2163 if(TMath::Abs(fPDGCodeToBeAnalyzed) != TMath::Abs(gPdgCode))
2164 continue;
2165 }
2166
2167 //Use the acceptance parameterization
2168 if(fAcceptanceParameterization) {
2169 Double_t gRandomNumber = gRandom->Rndm();
2170 if(gRandomNumber > fAcceptanceParameterization->Eval(track->Pt()))
2171 continue;
2172 }
2173
2174 //Exclude resonances
2175 if(fExcludeResonancesInMC) {
2176 TParticle *particle = track->Particle();
2177 if(!particle) continue;
2178
2179 Bool_t kExcludeParticle = kFALSE;
2180 Int_t gMotherIndex = particle->GetFirstMother();
a91427fd 2181
6883527a 2182 if(TMath::Abs(particle->GetPdgCode()) != 321) {
a91427fd 2183 // AliMCParticle* motherTrack = dynamic_cast<AliMCParticle *>(event->GetTrack(gMotherIndex));
2184 // if(motherTrack) {
2185 // TParticle *motherParticle = motherTrack->Particle();
2186 // if(motherParticle) {
2187 // Int_t pdgCodeOfMother = motherParticle->GetPdgCode();
2188 // //if((pdgCodeOfMother == 113)||(pdgCodeOfMother == 213)||(pdgCodeOfMother == 221)||(pdgCodeOfMother == 223)||(pdgCodeOfMother == 331)||(pdgCodeOfMother == 333)) {
2189 // if(pdgCodeOfMother == 113 // rho0
2190 // || pdgCodeOfMother == 213 || pdgCodeOfMother == -213 // rho+
2191 // // || pdgCodeOfMother == 221 // eta
2192 // // || pdgCodeOfMother == 331 // eta'
2193 // // || pdgCodeOfMother == 223 // omega
2194 // // || pdgCodeOfMother == 333 // phi
2195 // || pdgCodeOfMother == 311 || pdgCodeOfMother == -311 // K0
2196 // // || pdgCodeOfMother == 313 || pdgCodeOfMother == -313 // K0*
2197 // // || pdgCodeOfMother == 323 || pdgCodeOfMother == -323 // K+*
2198 // || pdgCodeOfMother == 3122 || pdgCodeOfMother == -3122 // Lambda
2199 // || pdgCodeOfMother == 111 // pi0 Dalitz
2200 // ) {
2201 kExcludeParticle = kTRUE;
2202 // }
2203 // }
2204 //}
c683985a 2205 }
2206
2207 //Exclude from the analysis decay products of rho0, rho+, eta, eta' and phi
2208 if(kExcludeParticle) continue;
a91427fd 2209
c683985a 2210 }
2211
2212 //Exclude electrons with PDG
2213 if(fExcludeElectronsInMC) {
2214
2215 TParticle *particle = track->Particle();
2216
2217 if (particle){
2218 if(TMath::Abs(particle->GetPdgCode()) == 11) continue;
2219 }
2220 }
2221
2222 vPhi = track->Phi();
2223 //Printf("phi (before): %lf",vPhi);
2224
2225 fHistPt->Fill(vPt,gCentrality);
2226 fHistEta->Fill(vEta,gCentrality);
2227 fHistPhi->Fill(vPhi,gCentrality);
2228 if(vCharge > 0) fHistEtaPhiPos->Fill(vEta,vPhi,gCentrality);
2229 else if(vCharge < 0) fHistEtaPhiNeg->Fill(vEta,vPhi,gCentrality);
2230 //fHistPhi->Fill(vPhi*TMath::RadToDeg(),gCentrality);
2231 fHistRapidity->Fill(vY,gCentrality);
2232 //if(vCharge > 0) fHistPhiPos->Fill(vPhi*TMath::RadToDeg(),gCentrality);
2233 //else if(vCharge < 0) fHistPhiNeg->Fill(vPhi*TMath::RadToDeg(),gCentrality);
2234 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
2235 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
2236
2237 //Flow after burner
2238 if(fUseFlowAfterBurner) {
2239 Double_t precisionPhi = 0.001;
2240 Int_t maxNumberOfIterations = 100;
2241
2242 Double_t phi0 = vPhi;
2243 Double_t gV2 = fDifferentialV2->Eval(vPt);
2244
2245 for (Int_t j = 0; j < maxNumberOfIterations; j++) {
2246 Double_t phiprev = vPhi;
2247 Double_t fl = vPhi - phi0 + gV2*TMath::Sin(2.*(vPhi - gReactionPlane*TMath::DegToRad()));
2248 Double_t fp = 1.0 + 2.0*gV2*TMath::Cos(2.*(vPhi - gReactionPlane*TMath::DegToRad()));
2249 vPhi -= fl/fp;
2250 if (TMath::AreEqualAbs(phiprev,vPhi,precisionPhi)) break;
2251 }
2252 //Printf("phi (after): %lf\n",vPhi);
2253 Double_t vDeltaphiBefore = phi0 - gReactionPlane*TMath::DegToRad();
2254 if(vDeltaphiBefore < 0) vDeltaphiBefore += 2*TMath::Pi();
2255 fHistPhiBefore->Fill(vDeltaphiBefore,gCentrality);
2256
2257 Double_t vDeltaphiAfter = vPhi - gReactionPlane*TMath::DegToRad();
2258 if(vDeltaphiAfter < 0) vDeltaphiAfter += 2*TMath::Pi();
2259 fHistPhiAfter->Fill(vDeltaphiAfter,gCentrality);
2260
2261 }
2262
2263 //vPhi *= TMath::RadToDeg();
2264
2265 //=======================================correction
2266 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
2267 //Printf("CORRECTIONminus: %.2f | Centrality %lf",correction,gCentrality);
2268
2269 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
2270 } //track loop
2271 }//MC event object
2272 }//MC
2273
2274 return tracksAccepted;
2275}
2276
2277//________________________________________________________________________
2278TObjArray* AliAnalysisTaskBFPsi::GetShuffledTracks(TObjArray *tracks, Double_t gCentrality){
2279 // Clones TObjArray and returns it with tracks after shuffling the charges
2280
2281 TObjArray* tracksShuffled = new TObjArray;
2282 tracksShuffled->SetOwner(kTRUE);
2283
2284 vector<Short_t> *chargeVector = new vector<Short_t>; //original charge of accepted tracks
2285
2286 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
2287 {
2288 AliVParticle* track = (AliVParticle*) tracks->At(i);
2289 chargeVector->push_back(track->Charge());
2290 }
2291
2292 random_shuffle(chargeVector->begin(), chargeVector->end());
2293
2294 for(Int_t i = 0; i < tracks->GetEntriesFast(); i++){
2295 AliVParticle* track = (AliVParticle*) tracks->At(i);
2296 //==============================correction
2297 Double_t correction = GetTrackbyTrackCorrectionMatrix(track->Eta(), track->Phi(),track->Pt(), chargeVector->at(i), gCentrality);
2298 //Printf("CORRECTIONminus: %.2f | Centrality %lf",correction,gCentrality);
2299 tracksShuffled->Add(new AliBFBasicParticle(track->Eta(), track->Phi(), track->Pt(),chargeVector->at(i), correction));
2300 }
2301
2302 delete chargeVector;
2303
2304 return tracksShuffled;
2305}
2306
2307//________________________________________________________________________
2308void AliAnalysisTaskBFPsi::SetVZEROCalibrationFile(const char* filename,
2309 const char* lhcPeriod) {
2310 //Function to setup the VZERO gain equalization
2311 //============Get the equilization map============//
2312 TFile *calibrationFile = TFile::Open(filename);
2313 if((!calibrationFile)||(!calibrationFile->IsOpen())) {
2314 Printf("No calibration file found!!!");
2315 return;
2316 }
2317
2318 TList *list = dynamic_cast<TList *>(calibrationFile->Get(lhcPeriod));
2319 if(!list) {
2320 Printf("Calibration TList not found!!!");
2321 return;
2322 }
2323
2324 fHistVZEROAGainEqualizationMap = dynamic_cast<TH1F *>(list->FindObject("gHistVZEROAGainEqualizationMap"));
2325 if(!fHistVZEROAGainEqualizationMap) {
2326 Printf("VZERO-A calibration object not found!!!");
2327 return;
2328 }
2329 fHistVZEROCGainEqualizationMap = dynamic_cast<TH1F *>(list->FindObject("gHistVZEROCGainEqualizationMap"));
2330 if(!fHistVZEROCGainEqualizationMap) {
2331 Printf("VZERO-C calibration object not found!!!");
2332 return;
2333 }
2334
2335 fHistVZEROChannelGainEqualizationMap = dynamic_cast<TH2F *>(list->FindObject("gHistVZEROChannelGainEqualizationMap"));
2336 if(!fHistVZEROChannelGainEqualizationMap) {
2337 Printf("VZERO channel calibration object not found!!!");
2338 return;
2339 }
2340}
2341
2342//________________________________________________________________________
2343Double_t AliAnalysisTaskBFPsi::GetChannelEqualizationFactor(Int_t run,
2344 Int_t channel) {
2345 //
2346 if(!fHistVZEROAGainEqualizationMap) return 1.0;
2347
2348 for(Int_t iBinX = 1; iBinX <= fHistVZEROChannelGainEqualizationMap->GetNbinsX(); iBinX++) {
2349 Int_t gRunNumber = atoi(fHistVZEROChannelGainEqualizationMap->GetXaxis()->GetBinLabel(iBinX));
2350 if(gRunNumber == run)
2351 return fHistVZEROChannelGainEqualizationMap->GetBinContent(iBinX,channel+1);
2352 }
2353
2354 return 1.0;
2355}
2356
2357//________________________________________________________________________
2358Double_t AliAnalysisTaskBFPsi::GetEqualizationFactor(Int_t run,
2359 const char* side) {
2360 //
2361 if(!fHistVZEROAGainEqualizationMap) return 1.0;
2362
2363 TString gVZEROSide = side;
2364 for(Int_t iBinX = 1; iBinX < fHistVZEROAGainEqualizationMap->GetNbinsX(); iBinX++) {
2365 Int_t gRunNumber = atoi(fHistVZEROAGainEqualizationMap->GetXaxis()->GetBinLabel(iBinX));
2366 //cout<<"Looking for run "<<run<<" - current run: "<<gRunNumber<<endl;
2367 if(gRunNumber == run) {
2368 if(gVZEROSide == "A")
2369 return fHistVZEROAGainEqualizationMap->GetBinContent(iBinX);
2370 else if(gVZEROSide == "C")
2371 return fHistVZEROCGainEqualizationMap->GetBinContent(iBinX);
2372 }
2373 }
2374
2375 return 1.0;
2376}
2377
2378//____________________________________________________________________
2379Bool_t AliAnalysisTaskBFPsi::AcceptEventCentralityWeight(Double_t centrality)
2380{
2381 // copied from AliAnalysisTaskPhiCorrelations
2382 //
2383 // rejects "randomly" events such that the centrality gets flat
2384 // uses fCentralityWeights histogram
2385
2386 // TODO code taken and adapted from AliRDHFCuts; waiting for general class AliCentralityFlattening
2387
2388 Double_t weight = fCentralityWeights->GetBinContent(fCentralityWeights->FindBin(centrality));
2389 Double_t centralityDigits = centrality*100. - (Int_t)(centrality*100.);
2390
2391 Bool_t result = kFALSE;
2392 if (centralityDigits < weight)
2393 result = kTRUE;
2394
2395 AliInfo(Form("Centrality: %f; Digits: %f; Weight: %f; Result: %d", centrality, centralityDigits, weight, result));
2396
2397 return result;
2398}
2399
2400//________________________________________________________________________
2401void AliAnalysisTaskBFPsi::FinishTaskOutput(){
2402 //Printf("END BF");
2403
2404 if (!fBalance) {
2405 AliError("fBalance not available");
2406 return;
2407 }
2408 if(fRunShuffling) {
2409 if (!fShuffledBalance) {
2410 AliError("fShuffledBalance not available");
2411 return;
2412 }
2413 }
2414
2415}
2416
2417//________________________________________________________________________
2418void AliAnalysisTaskBFPsi::Terminate(Option_t *) {
2419 // Draw result to the screen
2420 // Called once at the end of the query
2421
2422 // not implemented ...
2423
2424}
2425