4 #include "TLorentzVector.h"
\r
5 #include "TGraphErrors.h"
\r
11 #include "TArrayF.h"
\r
13 #include "TRandom.h"
\r
15 #include "AliAnalysisTaskSE.h"
\r
16 #include "AliAnalysisManager.h"
\r
18 #include "AliESDVertex.h"
\r
19 #include "AliESDEvent.h"
\r
20 #include "AliESDInputHandler.h"
\r
21 #include "AliAODEvent.h"
\r
22 #include "AliAODTrack.h"
\r
23 #include "AliAODInputHandler.h"
\r
24 #include "AliCollisionGeometry.h"
\r
25 #include "AliGenEventHeader.h"
\r
26 #include "AliMCEventHandler.h"
\r
27 #include "AliMCEvent.h"
\r
28 #include "AliStack.h"
\r
29 #include "AliESDtrackCuts.h"
\r
30 #include "AliEventplane.h"
\r
31 #include "AliTHn.h"
\r
33 #include "AliEventPoolManager.h"
\r
35 #include "AliPID.h"
\r
36 #include "AliPIDResponse.h"
\r
37 #include "AliPIDCombined.h"
\r
39 #include "AliAnalysisTaskBFPsi.h"
\r
40 #include "AliBalancePsi.h"
\r
41 #include "AliAnalysisTaskTriggeredBF.h"
\r
44 // Analysis task for the BF vs Psi code
\r
45 // Authors: Panos.Christakoglou@nikhef.nl
\r
50 ClassImp(AliAnalysisTaskBFPsi)
\r
52 //________________________________________________________________________
\r
53 AliAnalysisTaskBFPsi::AliAnalysisTaskBFPsi(const char *name)
\r
54 : AliAnalysisTaskSE(name),
\r
56 fRunShuffling(kFALSE),
\r
57 fShuffledBalance(0),
\r
59 fRunMixingEventPlane(kFALSE),
\r
60 fMixingTracks(50000),
\r
70 fHistTriggerStats(0),
\r
91 fHistdEdxVsPTPCbeforePID(NULL),
\r
92 fHistBetavsPTOFbeforePID(NULL),
\r
93 fHistProbTPCvsPtbeforePID(NULL),
\r
94 fHistProbTOFvsPtbeforePID(NULL),
\r
95 fHistProbTPCTOFvsPtbeforePID(NULL),
\r
96 fHistNSigmaTPCvsPtbeforePID(NULL),
\r
97 fHistNSigmaTOFvsPtbeforePID(NULL),
\r
98 fHistdEdxVsPTPCafterPID(NULL),
\r
99 fHistBetavsPTOFafterPID(NULL),
\r
100 fHistProbTPCvsPtafterPID(NULL),
\r
101 fHistProbTOFvsPtafterPID(NULL),
\r
102 fHistProbTPCTOFvsPtafterPID(NULL),
\r
103 fHistNSigmaTPCvsPtafterPID(NULL),
\r
104 fHistNSigmaTOFvsPtafterPID(NULL),
\r
107 fParticleOfInterest(kPion),
\r
108 fPidDetectorConfig(kTPCTOF),
\r
110 fUsePIDnSigma(kTRUE),
\r
111 fUsePIDPropabilities(kFALSE),
\r
113 fMinAcceptedPIDProbability(0.8),
\r
115 fCentralityEstimator("V0M"),
\r
116 fUseCentrality(kFALSE),
\r
117 fCentralityPercentileMin(0.),
\r
118 fCentralityPercentileMax(5.),
\r
119 fImpactParameterMin(0.),
\r
120 fImpactParameterMax(20.),
\r
121 fUseMultiplicity(kFALSE),
\r
122 fNumberOfAcceptedTracksMin(0),
\r
123 fNumberOfAcceptedTracksMax(10000),
\r
124 fHistNumberOfAcceptedTracks(0),
\r
125 fUseOfflineTrigger(kFALSE),
\r
129 nAODtrackCutBit(128),
\r
132 fPtMinForCorrections(0.3),//=================================correction
\r
133 fPtMaxForCorrections(1.5),//=================================correction
\r
134 fPtBinForCorrections(36), //=================================correction
\r
137 fEtaMinForCorrections(-0.8),//=================================correction
\r
138 fEtaMaxForCorrections(0.8),//=================================correction
\r
139 fEtaBinForCorrections(16), //=================================correction
\r
142 fPhiMinForCorrections(0.),//=================================correction
\r
143 fPhiMaxForCorrections(360.),//=================================correction
\r
144 fPhiBinForCorrections(100), //=================================correction
\r
148 fNClustersTPCCut(-1),
\r
149 fAcceptanceParameterization(0),
\r
150 fDifferentialV2(0),
\r
151 fUseFlowAfterBurner(kFALSE),
\r
152 fExcludeResonancesInMC(kFALSE),
\r
153 fUseMCPdgCode(kFALSE),
\r
154 fPDGCodeToBeAnalyzed(-1),
\r
155 fEventClass("EventPlane")
\r
158 // Define input and output slots here
\r
159 // Input slot #0 works with a TChain
\r
161 //======================================================correction
\r
162 for (Int_t i=0; i<kCENTRALITY; i++){
\r
163 fHistMatrixCorrectionPlus[i] = NULL;
\r
164 fHistMatrixCorrectionMinus[i] = NULL;
\r
166 //=====================================================correction
\r
168 DefineInput(0, TChain::Class());
\r
169 // Output slot #0 writes into a TH1 container
\r
170 DefineOutput(1, TList::Class());
\r
171 DefineOutput(2, TList::Class());
\r
172 DefineOutput(3, TList::Class());
\r
173 DefineOutput(4, TList::Class());
\r
174 DefineOutput(5, TList::Class());
\r
177 //________________________________________________________________________
\r
178 AliAnalysisTaskBFPsi::~AliAnalysisTaskBFPsi() {
\r
180 // delete fBalance;
\r
181 // delete fShuffledBalance;
\r
183 // delete fListBF;
\r
184 // delete fListBFS;
\r
186 // delete fHistEventStats;
\r
187 // delete fHistTrackStats;
\r
188 // delete fHistVx;
\r
189 // delete fHistVy;
\r
190 // delete fHistVz;
\r
192 // delete fHistClus;
\r
193 // delete fHistDCA;
\r
194 // delete fHistChi2;
\r
196 // delete fHistEta;
\r
197 // delete fHistPhi;
\r
198 // delete fHistEtaPhiPos;
\r
199 // delete fHistEtaPhiNeg;
\r
200 // delete fHistV0M;
\r
203 //________________________________________________________________________
\r
204 void AliAnalysisTaskBFPsi::UserCreateOutputObjects() {
\r
205 // Create histograms
\r
208 // global switch disabling the reference
\r
209 // (to avoid "Replacing existing TH1" if several wagons are created in train)
\r
210 Bool_t oldStatus = TH1::AddDirectoryStatus();
\r
211 TH1::AddDirectory(kFALSE);
\r
214 fBalance = new AliBalancePsi();
\r
215 fBalance->SetAnalysisLevel("ESD");
\r
216 fBalance->SetEventClass(fEventClass);
\r
217 //fBalance->SetNumberOfBins(-1,16);
\r
218 //fBalance->SetInterval(-1,-0.8,0.8,16,0.,1.6,15.);
\r
220 if(fRunShuffling) {
\r
221 if(!fShuffledBalance) {
\r
222 fShuffledBalance = new AliBalancePsi();
\r
223 fShuffledBalance->SetAnalysisLevel("ESD");
\r
224 fShuffledBalance->SetEventClass(fEventClass);
\r
225 //fShuffledBalance->SetNumberOfBins(-1,16);
\r
226 //fShuffledBalance->SetInterval(-1,-0.8,0.8,16,0.,1.6,15.);
\r
230 if(!fMixedBalance) {
\r
231 fMixedBalance = new AliBalancePsi();
\r
232 fMixedBalance->SetAnalysisLevel("ESD");
\r
233 fMixedBalance->SetEventClass(fEventClass);
\r
238 fList = new TList();
\r
239 fList->SetName("listQA");
\r
242 //Balance Function list
\r
243 fListBF = new TList();
\r
244 fListBF->SetName("listBF");
\r
245 fListBF->SetOwner();
\r
247 if(fRunShuffling) {
\r
248 fListBFS = new TList();
\r
249 fListBFS->SetName("listBFShuffled");
\r
250 fListBFS->SetOwner();
\r
254 fListBFM = new TList();
\r
255 fListBFM->SetName("listTriggeredBFMixed");
\r
256 fListBFM->SetOwner();
\r
261 fHistListPIDQA = new TList();
\r
262 fHistListPIDQA->SetName("listQAPID");
\r
263 fHistListPIDQA->SetOwner();
\r
267 TString gCutName[5] = {"Total","Offline trigger",
\r
268 "Vertex","Analyzed","sel. Centrality"};
\r
269 fHistEventStats = new TH2F("fHistEventStats",
\r
270 "Event statistics;;Centrality percentile;N_{events}",
\r
271 5,0.5,5.5,220,-5,105);
\r
272 for(Int_t i = 1; i <= 5; i++)
\r
273 fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1].Data());
\r
274 fList->Add(fHistEventStats);
\r
276 TString gCentName[9] = {"V0M","FMD","TRK","TKL","CL0","CL1","V0MvsFMD","TKLvsV0M","ZEMvsZDC"};
\r
277 fHistCentStats = new TH2F("fHistCentStats",
\r
278 "Centrality statistics;;Cent percentile",
\r
279 9,-0.5,8.5,220,-5,105);
\r
280 for(Int_t i = 1; i <= 9; i++)
\r
281 fHistCentStats->GetXaxis()->SetBinLabel(i,gCentName[i-1].Data());
\r
282 fList->Add(fHistCentStats);
\r
284 fHistTriggerStats = new TH1F("fHistTriggerStats","Trigger statistics;TriggerBit;N_{events}",1025,0,1025);
\r
285 fList->Add(fHistTriggerStats);
\r
287 fHistTrackStats = new TH1F("fHistTrackStats","Event statistics;TrackFilterBit;N_{events}",16,0,16);
\r
288 fList->Add(fHistTrackStats);
\r
290 fHistNumberOfAcceptedTracks = new TH2F("fHistNumberOfAcceptedTracks",";N_{acc.};Centrality percentile;Entries",4001,-0.5,4000.5,220,-5,105);
\r
291 fList->Add(fHistNumberOfAcceptedTracks);
\r
293 // Vertex distributions
\r
294 fHistVx = new TH1F("fHistVx","Primary vertex distribution - x coordinate;V_{x} (cm);Entries",100,-0.5,0.5);
\r
295 fList->Add(fHistVx);
\r
296 fHistVy = new TH1F("fHistVy","Primary vertex distribution - y coordinate;V_{y} (cm);Entries",100,-0.5,0.5);
\r
297 fList->Add(fHistVy);
\r
298 fHistVz = new TH2F("fHistVz","Primary vertex distribution - z coordinate;V_{z} (cm);Centrality percentile;Entries",100,-20.,20.,220,-5,105);
\r
299 fList->Add(fHistVz);
\r
302 fHistEventPlane = new TH2F("fHistEventPlane",";#Psi_{2} [deg.];Centrality percentile;Counts",100,0,360.,220,-5,105);
\r
303 fList->Add(fHistEventPlane);
\r
306 fHistClus = new TH2F("fHistClus","# Cluster (TPC vs. ITS)",10,0,10,200,0,200);
\r
307 fList->Add(fHistClus);
\r
308 fHistChi2 = new TH2F("fHistChi2","Chi2/NDF distribution;#chi^{2}/ndf;Centrality percentile",200,0,10,220,-5,105);
\r
309 fList->Add(fHistChi2);
\r
310 fHistDCA = new TH2F("fHistDCA","DCA (xy vs. z)",400,-5,5,400,-5,5);
\r
311 fList->Add(fHistDCA);
\r
312 fHistPt = new TH2F("fHistPt","p_{T} distribution;p_{T} (GeV/c);Centrality percentile",200,0,10,220,-5,105);
\r
313 fList->Add(fHistPt);
\r
314 fHistEta = new TH2F("fHistEta","#eta distribution;#eta;Centrality percentile",200,-2,2,220,-5,105);
\r
315 fList->Add(fHistEta);
\r
316 fHistRapidity = new TH2F("fHistRapidity","y distribution;y;Centrality percentile",200,-2,2,220,-5,105);
\r
317 fList->Add(fHistRapidity);
\r
318 fHistPhi = new TH2F("fHistPhi","#phi distribution;#phi (rad);Centrality percentile",200,0.0,2.*TMath::Pi(),220,-5,105);
\r
319 fList->Add(fHistPhi);
\r
320 fHistEtaPhiPos = new TH3F("fHistEtaPhiPos","#eta-#phi distribution (+);#eta;#phi (rad);Centrality percentile",80,-2,2,72,0.0,2.*TMath::Pi(),220,-5,105);
\r
321 fList->Add(fHistEtaPhiPos);
\r
322 fHistEtaPhiNeg = new TH3F("fHistEtaPhiNeg","#eta-#phi distribution (-);#eta;#phi (rad);Centrality percentile",80,-2,2,72,0.0,2.*TMath::Pi(),220,-5,105);
\r
323 fList->Add(fHistEtaPhiNeg);
\r
324 fHistPhiBefore = new TH2F("fHistPhiBefore","#phi distribution;#phi;Centrality percentile",200,0.,2*TMath::Pi(),220,-5,105);
\r
325 fList->Add(fHistPhiBefore);
\r
326 fHistPhiAfter = new TH2F("fHistPhiAfter","#phi distribution;#phi;Centrality percentile",200,0.,2*TMath::Pi(),220,-5,105);
\r
327 fList->Add(fHistPhiAfter);
\r
328 fHistPhiPos = new TH2F("fHistPhiPos","#phi distribution for positive particles;#phi;Centrality percentile",200,0.,2*TMath::Pi(),220,-5,105);
\r
329 fList->Add(fHistPhiPos);
\r
330 fHistPhiNeg = new TH2F("fHistPhiNeg","#phi distribution for negative particles;#phi;Centrality percentile",200,0.,2.*TMath::Pi(),220,-5,105);
\r
331 fList->Add(fHistPhiNeg);
\r
332 fHistV0M = new TH2F("fHistV0M","V0 Multiplicity C vs. A",500, 0, 20000, 500, 0, 20000);
\r
333 fList->Add(fHistV0M);
\r
334 TString gRefTrackName[6] = {"tracks","tracksPos","tracksNeg","tracksTPConly","clusITS0","clusITS1"};
\r
335 fHistRefTracks = new TH2F("fHistRefTracks","Nr of Ref tracks/event vs. ref track estimator;;Nr of tracks",6, 0, 6, 400, 0, 20000);
\r
336 for(Int_t i = 1; i <= 6; i++)
\r
337 fHistRefTracks->GetXaxis()->SetBinLabel(i,gRefTrackName[i-1].Data());
\r
338 fList->Add(fHistRefTracks);
\r
340 // QA histograms for different cuts
\r
341 fList->Add(fBalance->GetQAHistHBTbefore());
\r
342 fList->Add(fBalance->GetQAHistHBTafter());
\r
343 fList->Add(fBalance->GetQAHistConversionbefore());
\r
344 fList->Add(fBalance->GetQAHistConversionafter());
\r
345 fList->Add(fBalance->GetQAHistPsiMinusPhi());
\r
346 fList->Add(fBalance->GetQAHistResonancesBefore());
\r
347 fList->Add(fBalance->GetQAHistResonancesRho());
\r
348 fList->Add(fBalance->GetQAHistResonancesK0());
\r
349 fList->Add(fBalance->GetQAHistResonancesLambda());
\r
350 fList->Add(fBalance->GetQAHistQbefore());
\r
351 fList->Add(fBalance->GetQAHistQafter());
\r
353 // Balance function histograms
\r
354 // Initialize histograms if not done yet
\r
355 if(!fBalance->GetHistNp()){
\r
356 AliWarning("Histograms not yet initialized! --> Will be done now");
\r
357 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
\r
358 fBalance->InitHistograms();
\r
361 if(fRunShuffling) {
\r
362 if(!fShuffledBalance->GetHistNp()) {
\r
363 AliWarning("Histograms (shuffling) not yet initialized! --> Will be done now");
\r
364 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
\r
365 fShuffledBalance->InitHistograms();
\r
369 //for(Int_t a = 0; a < ANALYSIS_TYPES; a++){
\r
370 fListBF->Add(fBalance->GetHistNp());
\r
371 fListBF->Add(fBalance->GetHistNn());
\r
372 fListBF->Add(fBalance->GetHistNpn());
\r
373 fListBF->Add(fBalance->GetHistNnn());
\r
374 fListBF->Add(fBalance->GetHistNpp());
\r
375 fListBF->Add(fBalance->GetHistNnp());
\r
377 if(fRunShuffling) {
\r
378 fListBFS->Add(fShuffledBalance->GetHistNp());
\r
379 fListBFS->Add(fShuffledBalance->GetHistNn());
\r
380 fListBFS->Add(fShuffledBalance->GetHistNpn());
\r
381 fListBFS->Add(fShuffledBalance->GetHistNnn());
\r
382 fListBFS->Add(fShuffledBalance->GetHistNpp());
\r
383 fListBFS->Add(fShuffledBalance->GetHistNnp());
\r
387 fListBFM->Add(fMixedBalance->GetHistNp());
\r
388 fListBFM->Add(fMixedBalance->GetHistNn());
\r
389 fListBFM->Add(fMixedBalance->GetHistNpn());
\r
390 fListBFM->Add(fMixedBalance->GetHistNnn());
\r
391 fListBFM->Add(fMixedBalance->GetHistNpp());
\r
392 fListBFM->Add(fMixedBalance->GetHistNnp());
\r
399 Int_t trackDepth = fMixingTracks;
\r
400 Int_t poolsize = 1000; // Maximum number of events, ignored in the present implemented of AliEventPoolManager
\r
403 Double_t centralityBins[] = {0.,1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,15.,20.,25.,30.,35.,40.,45.,50.,55.,60.,65.,70.,75.,80.,90.,100.}; // SHOULD BE DEDUCED FROM CREATED ALITHN!!!
\r
404 Double_t* centbins = centralityBins;
\r
405 Int_t nCentralityBins = sizeof(centralityBins) / sizeof(Double_t) - 1;
\r
408 Double_t vertexBins[] = {-10., -7., -5., -3., -1., 1., 3., 5., 7., 10.}; // SHOULD BE DEDUCED FROM CREATED ALITHN!!!
\r
409 Double_t* vtxbins = vertexBins;
\r
410 Int_t nVertexBins = sizeof(vertexBins) / sizeof(Double_t) - 1;
\r
412 // Event plane angle (Psi) bins
\r
413 Double_t psiBins[] = {0.,45.,135.,215.,305.,360.}; // SHOULD BE DEDUCED FROM CREATED ALITHN!!!
\r
414 Double_t* psibins = psiBins;
\r
415 Int_t nPsiBins = sizeof(psiBins) / sizeof(Double_t) - 1;
\r
417 // run the event mixing also in bins of event plane (statistics!)
\r
418 if(fRunMixingEventPlane){
\r
419 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, centbins, nVertexBins, vtxbins, nPsiBins, psibins);
\r
422 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, centbins, nVertexBins, vtxbins);
\r
426 if(fESDtrackCuts) fList->Add(fESDtrackCuts);
\r
428 //====================PID========================//
\r
430 fPIDCombined = new AliPIDCombined();
\r
431 fPIDCombined->SetDefaultTPCPriors();
\r
433 fHistdEdxVsPTPCbeforePID = new TH2D ("dEdxVsPTPCbefore","dEdxVsPTPCbefore", 1000, -10.0, 10.0, 1000, 0, 1000);
\r
434 fHistListPIDQA->Add(fHistdEdxVsPTPCbeforePID); //addition
\r
436 fHistBetavsPTOFbeforePID = new TH2D ("BetavsPTOFbefore","BetavsPTOFbefore", 1000, -10.0, 10., 1000, 0, 1.2);
\r
437 fHistListPIDQA->Add(fHistBetavsPTOFbeforePID); //addition
\r
439 fHistProbTPCvsPtbeforePID = new TH2D ("ProbTPCvsPtbefore","ProbTPCvsPtbefore", 1000, -10.0,10.0, 1000, 0, 2.0);
\r
440 fHistListPIDQA->Add(fHistProbTPCvsPtbeforePID); //addition
\r
442 fHistProbTOFvsPtbeforePID = new TH2D ("ProbTOFvsPtbefore","ProbTOFvsPtbefore", 1000, -50, 50, 1000, 0, 2.0);
\r
443 fHistListPIDQA->Add(fHistProbTOFvsPtbeforePID); //addition
\r
445 fHistProbTPCTOFvsPtbeforePID =new TH2D ("ProbTPCTOFvsPtbefore","ProbTPCTOFvsPtbefore", 1000, -50, 50, 1000, 0, 2.0);
\r
446 fHistListPIDQA->Add(fHistProbTPCTOFvsPtbeforePID); //addition
\r
448 fHistNSigmaTPCvsPtbeforePID = new TH2D ("NSigmaTPCvsPtbefore","NSigmaTPCvsPtbefore", 1000, -10, 10, 1000, 0, 500);
\r
449 fHistListPIDQA->Add(fHistNSigmaTPCvsPtbeforePID); //addition
\r
451 fHistNSigmaTOFvsPtbeforePID = new TH2D ("NSigmaTOFvsPtbefore","NSigmaTOFvsPtbefore", 1000, -10, 10, 1000, 0, 500);
\r
452 fHistListPIDQA->Add(fHistNSigmaTOFvsPtbeforePID); //addition
\r
454 fHistdEdxVsPTPCafterPID = new TH2D ("dEdxVsPTPCafter","dEdxVsPTPCafter", 1000, -10, 10, 1000, 0, 1000);
\r
455 fHistListPIDQA->Add(fHistdEdxVsPTPCafterPID); //addition
\r
457 fHistBetavsPTOFafterPID = new TH2D ("BetavsPTOFafter","BetavsPTOFafter", 1000, -10, 10, 1000, 0, 1.2);
\r
458 fHistListPIDQA->Add(fHistBetavsPTOFafterPID); //addition
\r
460 fHistProbTPCvsPtafterPID = new TH2D ("ProbTPCvsPtafter","ProbTPCvsPtafter", 1000, -10, 10, 1000, 0, 2);
\r
461 fHistListPIDQA->Add(fHistProbTPCvsPtafterPID); //addition
\r
463 fHistProbTOFvsPtafterPID = new TH2D ("ProbTOFvsPtafter","ProbTOFvsPtafter", 1000, -10, 10, 1000, 0, 2);
\r
464 fHistListPIDQA->Add(fHistProbTOFvsPtafterPID); //addition
\r
466 fHistProbTPCTOFvsPtafterPID =new TH2D ("ProbTPCTOFvsPtafter","ProbTPCTOFvsPtafter", 1000, -50, 50, 1000, 0, 2.0);
\r
467 fHistListPIDQA->Add(fHistProbTPCTOFvsPtafterPID); //addition
\r
469 fHistNSigmaTPCvsPtafterPID = new TH2D ("NSigmaTPCvsPtafter","NSigmaTPCvsPtafter", 1000, -10, 10, 1000, 0, 500);
\r
470 fHistListPIDQA->Add(fHistNSigmaTPCvsPtafterPID); //addition
\r
472 fHistNSigmaTOFvsPtafterPID = new TH2D ("NSigmaTOFvsPtafter","NSigmaTOFvsPtafter", 1000, -10, 10, 1000, 0, 500);
\r
473 fHistListPIDQA->Add(fHistNSigmaTOFvsPtafterPID); //addition
\r
475 //====================PID========================//
\r
477 // Post output data.
\r
478 PostData(1, fList);
\r
479 PostData(2, fListBF);
\r
480 if(fRunShuffling) PostData(3, fListBFS);
\r
481 if(fRunMixing) PostData(4, fListBFM);
\r
482 if(fUsePID) PostData(5, fHistListPIDQA); //PID
\r
484 TH1::AddDirectory(oldStatus);
\r
488 //________________________________________________________________________
\r
489 void AliAnalysisTaskBFPsi::SetInputCorrection(const char* filename,
\r
490 const char* gCollSystem) {
\r
491 //Open files that will be used for correction
\r
492 TString gCollidingSystem = gCollSystem;
\r
494 //Open the input file
\r
495 TFile *f = TFile::Open(filename);
\r
497 Printf("File not found!!!");
\r
501 //Get the TDirectoryFile and TList
\r
502 TDirectoryFile *dir = dynamic_cast<TDirectoryFile *>(f->Get("PWGCFEbyE.outputBalanceFunctionEfficiencyAnalysis"));
\r
504 Printf("TDirectoryFile not found!!!");
\r
508 TString listEffName = "";
\r
509 for (Int_t iCent = 0; iCent < kCENTRALITY; iCent++) {
\r
510 listEffName = "listEfficiencyBF_";
\r
511 listEffName += (TString)((Int_t)(centralityArrayForPbPb[iCent]));
\r
512 listEffName += "_";
\r
513 listEffName += (TString)((Int_t)(centralityArrayForPbPb[iCent+1]));
\r
514 TList *list = (TList*)dir->Get(listEffName.Data());
\r
516 Printf("TList Efficiency not found!!!");
\r
520 TString histoName = "fHistMatrixCorrectionPlus";
\r
521 fHistMatrixCorrectionPlus[iCent]= dynamic_cast<TH3D *>(list->FindObject(histoName.Data()));
\r
522 if(!fHistMatrixCorrectionPlus[iCent]) {
\r
523 Printf("fHist not found!!!");
\r
527 histoName = "fHistMatrixCorrectionMinus";
\r
528 fHistMatrixCorrectionMinus[iCent] = dynamic_cast<TH3D *>(list->FindObject(histoName.Data()));
\r
529 if(!fHistMatrixCorrectionMinus[iCent]) {
\r
530 Printf("fHist not found!!!");
\r
533 }//loop over centralities: ONLY the PbPb case is covered
\r
535 if(fHistMatrixCorrectionPlus[0]){
\r
536 fEtaMinForCorrections = fHistMatrixCorrectionPlus[0]->GetXaxis()->GetXmin();
\r
537 fEtaMaxForCorrections = fHistMatrixCorrectionPlus[0]->GetXaxis()->GetXmax();
\r
538 fEtaBinForCorrections = fHistMatrixCorrectionPlus[0]->GetNbinsX();
\r
540 fPtMinForCorrections = fHistMatrixCorrectionPlus[0]->GetYaxis()->GetXmin();
\r
541 fPtMaxForCorrections = fHistMatrixCorrectionPlus[0]->GetYaxis()->GetXmax();
\r
542 fPtBinForCorrections = fHistMatrixCorrectionPlus[0]->GetNbinsY();
\r
544 fPhiMinForCorrections = fHistMatrixCorrectionPlus[0]->GetZaxis()->GetXmin();
\r
545 fPhiMaxForCorrections = fHistMatrixCorrectionPlus[0]->GetZaxis()->GetXmax();
\r
546 fPhiBinForCorrections = fHistMatrixCorrectionPlus[0]->GetNbinsZ();
\r
550 //________________________________________________________________________
\r
551 void AliAnalysisTaskBFPsi::UserExec(Option_t *) {
\r
553 // Called for each event
\r
555 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
556 Int_t gNumberOfAcceptedTracks = 0;
\r
557 Double_t gCentrality = -1.;
\r
558 Double_t gReactionPlane = -1.;
\r
559 Float_t bSign = 0.;
\r
561 // get the event (for generator level: MCEvent())
\r
562 AliVEvent* eventMain = NULL;
\r
563 if(gAnalysisLevel == "MC") {
\r
564 eventMain = dynamic_cast<AliVEvent*>(MCEvent());
\r
567 eventMain = dynamic_cast<AliVEvent*>(InputEvent());
\r
569 // for HBT like cuts need magnetic field sign
\r
570 bSign = (eventMain->GetMagneticField() > 0) ? 1 : -1;
\r
573 AliError("eventMain not available");
\r
577 // PID Response task active?
\r
579 fPIDResponse = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetPIDResponse();
\r
580 if (!fPIDResponse) AliFatal("This Task needs the PID response attached to the inputHandler");
\r
583 // check event cuts and fill event histograms
\r
584 if((gCentrality = IsEventAccepted(eventMain)) < 0){
\r
588 //Compute Multiplicity or Centrality variable
\r
589 Double_t lMultiplicityVar = GetRefMultiOrCentrality( eventMain );
\r
591 // get the reaction plane
\r
592 gReactionPlane = GetEventPlane(eventMain);
\r
593 fHistEventPlane->Fill(gReactionPlane,gCentrality);
\r
594 if(gReactionPlane < 0){
\r
598 // get the accepted tracks in main event
\r
599 TObjArray *tracksMain = GetAcceptedTracks(eventMain,gCentrality,gReactionPlane);
\r
600 gNumberOfAcceptedTracks = tracksMain->GetEntriesFast();
\r
602 //multiplicity cut (used in pp)
\r
603 fHistNumberOfAcceptedTracks->Fill(gNumberOfAcceptedTracks,gCentrality);
\r
604 if(fUseMultiplicity) {
\r
605 if((gNumberOfAcceptedTracks < fNumberOfAcceptedTracksMin)||(gNumberOfAcceptedTracks > fNumberOfAcceptedTracksMax))
\r
609 // store charges of all accepted tracks, shuffle and reassign (two extra loops!)
\r
610 TObjArray* tracksShuffled = NULL;
\r
612 tracksShuffled = GetShuffledTracks(tracksMain,gCentrality);
\r
618 // 1. First get an event pool corresponding in mult (cent) and
\r
619 // zvertex to the current event. Once initialized, the pool
\r
620 // should contain nMix (reduced) events. This routine does not
\r
621 // pre-scan the chain. The first several events of every chain
\r
622 // will be skipped until the needed pools are filled to the
\r
623 // specified depth. If the pool categories are not too rare, this
\r
624 // should not be a problem. If they are rare, you could lose`
\r
627 // 2. Collect the whole pool's content of tracks into one TObjArray
\r
628 // (bgTracks), which is effectively a single background super-event.
\r
630 // 3. The reduced and bgTracks arrays must both be passed into
\r
631 // FillCorrelations(). Also nMix should be passed in, so a weight
\r
632 // of 1./nMix can be applied.
\r
634 AliEventPool* pool = fPoolMgr->GetEventPool(gCentrality, eventMain->GetPrimaryVertex()->GetZ(),gReactionPlane);
\r
637 AliFatal(Form("No pool found for centrality = %f, zVtx = %f, psi = %f", gCentrality, eventMain->GetPrimaryVertex()->GetZ(),gReactionPlane));
\r
641 //pool->SetDebug(1);
\r
643 if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5){
\r
646 Int_t nMix = pool->GetCurrentNEvents();
\r
647 //cout << "nMix = " << nMix << " tracks in pool = " << pool->NTracksInPool() << endl;
\r
649 //((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(2);
\r
650 //((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool->NTracksInPool());
\r
651 //if (pool->IsReady())
\r
652 //((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(3);
\r
654 // Fill mixed-event histos here
\r
655 for (Int_t jMix=0; jMix<nMix; jMix++)
\r
657 TObjArray* tracksMixed = pool->GetEvent(jMix);
\r
658 fMixedBalance->CalculateBalance(gReactionPlane,tracksMain,tracksMixed,bSign,lMultiplicityVar,eventMain->GetPrimaryVertex()->GetZ());
\r
662 // Update the Event pool
\r
663 pool->UpdatePool(tracksMain);
\r
664 //pool->PrintInfo();
\r
666 }//pool NULL check
\r
669 // calculate balance function
\r
670 fBalance->CalculateBalance(gReactionPlane,tracksMain,NULL,bSign,lMultiplicityVar,eventMain->GetPrimaryVertex()->GetZ());
\r
672 // calculate shuffled balance function
\r
673 if(fRunShuffling && tracksShuffled != NULL) {
\r
674 fShuffledBalance->CalculateBalance(gReactionPlane,tracksShuffled,NULL,bSign,lMultiplicityVar,eventMain->GetPrimaryVertex()->GetZ());
\r
678 //________________________________________________________________________
\r
679 Double_t AliAnalysisTaskBFPsi::IsEventAccepted(AliVEvent *event){
\r
680 // Checks the Event cuts
\r
681 // Fills Event statistics histograms
\r
683 Bool_t isSelectedMain = kTRUE;
\r
684 Float_t gCentrality = -1.;
\r
685 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
687 fHistEventStats->Fill(1,gCentrality); //all events
\r
689 // Event trigger bits
\r
690 fHistTriggerStats->Fill(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected());
\r
691 if(fUseOfflineTrigger)
\r
692 isSelectedMain = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
\r
694 if(isSelectedMain) {
\r
695 fHistEventStats->Fill(2,gCentrality); //triggered events
\r
697 //Centrality stuff
\r
698 if(fUseCentrality) {
\r
699 if(gAnalysisLevel == "AOD") { //centrality in AOD header
\r
700 AliAODHeader *header = (AliAODHeader*) event->GetHeader();
\r
702 gCentrality = header->GetCentralityP()->GetCentralityPercentile(fCentralityEstimator.Data());
\r
704 // QA for centrality estimators
\r
705 fHistCentStats->Fill(0.,header->GetCentralityP()->GetCentralityPercentile("V0M"));
\r
706 fHistCentStats->Fill(1.,header->GetCentralityP()->GetCentralityPercentile("FMD"));
\r
707 fHistCentStats->Fill(2.,header->GetCentralityP()->GetCentralityPercentile("TRK"));
\r
708 fHistCentStats->Fill(3.,header->GetCentralityP()->GetCentralityPercentile("TKL"));
\r
709 fHistCentStats->Fill(4.,header->GetCentralityP()->GetCentralityPercentile("CL0"));
\r
710 fHistCentStats->Fill(5.,header->GetCentralityP()->GetCentralityPercentile("CL1"));
\r
711 fHistCentStats->Fill(6.,header->GetCentralityP()->GetCentralityPercentile("V0MvsFMD"));
\r
712 fHistCentStats->Fill(7.,header->GetCentralityP()->GetCentralityPercentile("TKLvsV0M"));
\r
713 fHistCentStats->Fill(8.,header->GetCentralityP()->GetCentralityPercentile("ZEMvsZDC"));
\r
715 // centrality QA (V0M)
\r
716 fHistV0M->Fill(event->GetVZEROData()->GetMTotV0A(), event->GetVZEROData()->GetMTotV0C());
\r
718 // centrality QA (reference tracks)
\r
719 fHistRefTracks->Fill(0.,header->GetRefMultiplicity());
\r
720 fHistRefTracks->Fill(1.,header->GetRefMultiplicityPos());
\r
721 fHistRefTracks->Fill(2.,header->GetRefMultiplicityNeg());
\r
722 fHistRefTracks->Fill(3.,header->GetTPConlyRefMultiplicity());
\r
723 fHistRefTracks->Fill(4.,header->GetNumberOfITSClusters(0));
\r
724 fHistRefTracks->Fill(5.,header->GetNumberOfITSClusters(1));
\r
725 fHistRefTracks->Fill(6.,header->GetNumberOfITSClusters(2));
\r
726 fHistRefTracks->Fill(7.,header->GetNumberOfITSClusters(3));
\r
727 fHistRefTracks->Fill(8.,header->GetNumberOfITSClusters(4));
\r
731 else if(gAnalysisLevel == "ESD" || gAnalysisLevel == "MCESD"){ // centrality class for ESDs or MC-ESDs
\r
732 AliCentrality *centrality = event->GetCentrality();
\r
733 gCentrality = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
\r
735 // QA for centrality estimators
\r
736 fHistCentStats->Fill(0.,centrality->GetCentralityPercentile("V0M"));
\r
737 fHistCentStats->Fill(1.,centrality->GetCentralityPercentile("FMD"));
\r
738 fHistCentStats->Fill(2.,centrality->GetCentralityPercentile("TRK"));
\r
739 fHistCentStats->Fill(3.,centrality->GetCentralityPercentile("TKL"));
\r
740 fHistCentStats->Fill(4.,centrality->GetCentralityPercentile("CL0"));
\r
741 fHistCentStats->Fill(5.,centrality->GetCentralityPercentile("CL1"));
\r
742 fHistCentStats->Fill(6.,centrality->GetCentralityPercentile("V0MvsFMD"));
\r
743 fHistCentStats->Fill(7.,centrality->GetCentralityPercentile("TKLvsV0M"));
\r
744 fHistCentStats->Fill(8.,centrality->GetCentralityPercentile("ZEMvsZDC"));
\r
746 // centrality QA (V0M)
\r
747 fHistV0M->Fill(event->GetVZEROData()->GetMTotV0A(), event->GetVZEROData()->GetMTotV0C());
\r
749 else if(gAnalysisLevel == "MC"){
\r
750 Double_t gImpactParameter = 0.;
\r
751 if(dynamic_cast<AliMCEvent*>(event)){
\r
752 AliCollisionGeometry* headerH = dynamic_cast<AliCollisionGeometry*>(dynamic_cast<AliMCEvent*>(event)->GenEventHeader());
\r
754 gImpactParameter = headerH->ImpactParameter();
\r
755 gCentrality = gImpactParameter;
\r
765 if(gAnalysisLevel == "MC"){
\r
767 AliError("mcEvent not available");
\r
771 AliGenEventHeader *header = dynamic_cast<AliMCEvent*>(event)->GenEventHeader();
\r
773 TArrayF gVertexArray;
\r
774 header->PrimaryVertex(gVertexArray);
\r
775 //Printf("Vertex: %lf (x) - %lf (y) - %lf (z)",
\r
776 //gVertexArray.At(0),
\r
777 //gVertexArray.At(1),
\r
778 //gVertexArray.At(2));
\r
779 fHistEventStats->Fill(3,gCentrality); //events with a proper vertex
\r
780 if(TMath::Abs(gVertexArray.At(0)) < fVxMax) {
\r
781 if(TMath::Abs(gVertexArray.At(1)) < fVyMax) {
\r
782 if(TMath::Abs(gVertexArray.At(2)) < fVzMax) {
\r
783 fHistEventStats->Fill(4,gCentrality); //analayzed events
\r
784 fHistVx->Fill(gVertexArray.At(0));
\r
785 fHistVy->Fill(gVertexArray.At(1));
\r
786 fHistVz->Fill(gVertexArray.At(2),gCentrality);
\r
788 // take only events inside centrality class
\r
789 if((fImpactParameterMin < gCentrality) && (fImpactParameterMax > gCentrality)){
\r
790 fHistEventStats->Fill(5,gCentrality); //events with correct centrality
\r
791 return gCentrality;
\r
792 }//centrality class
\r
799 // Event Vertex AOD, ESD, ESDMC
\r
801 const AliVVertex *vertex = event->GetPrimaryVertex();
\r
804 Double32_t fCov[6];
\r
805 vertex->GetCovarianceMatrix(fCov);
\r
806 if(vertex->GetNContributors() > 0) {
\r
808 fHistEventStats->Fill(3,gCentrality); //events with a proper vertex
\r
809 if(TMath::Abs(vertex->GetX()) < fVxMax) {
\r
810 if(TMath::Abs(vertex->GetY()) < fVyMax) {
\r
811 if(TMath::Abs(vertex->GetZ()) < fVzMax) {
\r
812 fHistEventStats->Fill(4,gCentrality); //analyzed events
\r
813 fHistVx->Fill(vertex->GetX());
\r
814 fHistVy->Fill(vertex->GetY());
\r
815 fHistVz->Fill(vertex->GetZ(),gCentrality);
\r
817 // take only events inside centrality class
\r
818 if((gCentrality > fCentralityPercentileMin) && (gCentrality < fCentralityPercentileMax)){
\r
819 fHistEventStats->Fill(5,gCentrality); //events with correct centrality
\r
820 return gCentrality;
\r
821 }//centrality class
\r
825 }//proper vertex resolution
\r
826 }//proper number of contributors
\r
827 }//vertex object valid
\r
828 }//triggered event
\r
831 // in all other cases return -1 (event not accepted)
\r
836 //________________________________________________________________________
\r
837 Double_t AliAnalysisTaskBFPsi::GetRefMultiOrCentrality(AliVEvent *event){
\r
838 // Checks the Event cuts
\r
839 // Fills Event statistics histograms
\r
841 Float_t gCentrality = -1.;
\r
842 Double_t fMultiplicity = -100.;
\r
843 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
844 if(fEventClass == "Centrality"){
\r
847 if(gAnalysisLevel == "AOD") { //centrality in AOD header
\r
848 AliAODHeader *header = (AliAODHeader*) event->GetHeader();
\r
850 gCentrality = header->GetCentralityP()->GetCentralityPercentile(fCentralityEstimator.Data());
\r
854 else if(gAnalysisLevel == "ESD" || gAnalysisLevel == "MCESD"){ // centrality class for ESDs or MC-ESDs
\r
855 AliCentrality *centrality = event->GetCentrality();
\r
856 gCentrality = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
\r
858 else if(gAnalysisLevel == "MC"){
\r
859 Double_t gImpactParameter = 0.;
\r
860 if(dynamic_cast<AliMCEvent*>(event)){
\r
861 AliCollisionGeometry* headerH = dynamic_cast<AliCollisionGeometry*>(dynamic_cast<AliMCEvent*>(event)->GenEventHeader());
\r
863 gImpactParameter = headerH->ImpactParameter();
\r
864 gCentrality = gImpactParameter;
\r
871 }//End if "Centrality"
\r
872 if(fEventClass=="Multiplicity"&&gAnalysisLevel == "ESD"){
\r
873 if(dynamic_cast<AliESDEvent*>(event)){
\r
874 fMultiplicity = fESDtrackCuts->GetReferenceMultiplicity(dynamic_cast<AliESDEvent*>(event), AliESDtrackCuts::kTrackletsITSTPC,0.5);
\r
875 }//AliESDevent cast
\r
877 if(fEventClass=="Multiplicity"&&gAnalysisLevel != "ESD"){
\r
878 AliAODHeader *header = (AliAODHeader*) event->GetHeader();
\r
880 fMultiplicity = header->GetRefMultiplicity();
\r
883 Double_t lReturnVal = -100;
\r
884 if(fEventClass=="Multiplicity"){
\r
885 lReturnVal = fMultiplicity;
\r
886 }else if(fEventClass=="Centrality"){
\r
887 lReturnVal = gCentrality;
\r
892 //________________________________________________________________________
\r
893 Double_t AliAnalysisTaskBFPsi::GetEventPlane(AliVEvent *event){
\r
894 // Get the event plane
\r
896 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
898 Float_t gVZEROEventPlane = -10.;
\r
899 Float_t gReactionPlane = -10.;
\r
900 Double_t qxTot = 0.0, qyTot = 0.0;
\r
902 //MC: from reaction plane
\r
903 if(gAnalysisLevel == "MC"){
\r
905 AliError("mcEvent not available");
\r
909 if(dynamic_cast<AliMCEvent*>(event)){
\r
910 AliCollisionGeometry* headerH = dynamic_cast<AliCollisionGeometry*>(dynamic_cast<AliMCEvent*>(event)->GenEventHeader());
\r
912 gReactionPlane = headerH->ReactionPlaneAngle();
\r
913 //gReactionPlane *= TMath::RadToDeg();
\r
918 // AOD,ESD,ESDMC: from VZERO Event Plane
\r
921 AliEventplane *ep = event->GetEventplane();
\r
923 gVZEROEventPlane = ep->CalculateVZEROEventPlane(event,10,2,qxTot,qyTot);
\r
924 if(gVZEROEventPlane < 0.) gVZEROEventPlane += TMath::Pi();
\r
925 //gReactionPlane = gVZEROEventPlane*TMath::RadToDeg();
\r
926 gReactionPlane = gVZEROEventPlane;
\r
930 return gReactionPlane;
\r
933 //________________________________________________________________________
\r
934 Double_t AliAnalysisTaskBFPsi::GetTrackbyTrackCorrectionMatrix( Double_t vEta,
\r
938 Double_t gCentrality) {
\r
939 // -- Get efficiency correction of particle dependent on (eta, phi, pt, charge, centrality)
\r
941 Double_t correction = 1.;
\r
942 Int_t binEta = 0, binPt = 0, binPhi = 0;
\r
944 //Printf("EtaMAx: %lf - EtaMin: %lf - EtaBin: %lf", fEtaMaxForCorrections,fEtaMinForCorrections,fEtaBinForCorrections);
\r
945 if(fEtaBinForCorrections != 0) {
\r
946 Double_t widthEta = (fEtaMaxForCorrections - fEtaMinForCorrections)/fEtaBinForCorrections;
\r
947 if(fEtaMaxForCorrections != fEtaMinForCorrections)
\r
948 binEta = (Int_t)(vEta/widthEta)+1;
\r
951 if(fPtBinForCorrections != 0) {
\r
952 Double_t widthPt = (fPtMaxForCorrections - fPtMinForCorrections)/fPtBinForCorrections;
\r
953 if(fPtMaxForCorrections != fPtMinForCorrections)
\r
954 binPt = (Int_t)(vPt/widthPt) + 1;
\r
957 if(fPhiBinForCorrections != 0) {
\r
958 Double_t widthPhi = (fPhiMaxForCorrections - fPhiMinForCorrections)/fPhiBinForCorrections;
\r
959 if(fPhiMaxForCorrections != fPhiMinForCorrections)
\r
960 binPhi = (Int_t)(vPhi/widthPhi)+ 1;
\r
963 Int_t gCentralityInt = 1;
\r
964 for (Int_t i=0; i<kCENTRALITY; i++){
\r
965 if((centralityArrayForPbPb[i] <= gCentrality)&&(gCentrality <= centralityArrayForPbPb[i+1]))
\r
966 gCentralityInt = i;
\r
969 if(fHistMatrixCorrectionPlus[gCentralityInt]){
\r
971 correction = fHistMatrixCorrectionPlus[gCentralityInt]->GetBinContent(fHistMatrixCorrectionPlus[gCentralityInt]->GetBin(binEta, binPt, binPhi));
\r
974 correction = fHistMatrixCorrectionMinus[gCentralityInt]->GetBinContent(fHistMatrixCorrectionMinus[gCentralityInt]->GetBin(binEta, binPt, binPhi));
\r
980 if (correction == 0.) {
\r
981 AliError(Form("Should not happen : bin content = 0. >> eta: %.2f | phi : %.2f | pt : %.2f | cent %d",vEta, vPhi, vPt, gCentralityInt));
\r
988 //________________________________________________________________________
\r
989 TObjArray* AliAnalysisTaskBFPsi::GetAcceptedTracks(AliVEvent *event, Double_t gCentrality, Double_t gReactionPlane){
\r
990 // Returns TObjArray with tracks after all track cuts (only for AOD!)
\r
991 // Fills QA histograms
\r
993 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
995 //output TObjArray holding all good tracks
\r
996 TObjArray* tracksAccepted = new TObjArray;
\r
997 tracksAccepted->SetOwner(kTRUE);
\r
1006 if(gAnalysisLevel == "AOD") { // handling of TPC only tracks different in AOD and ESD
\r
1007 // Loop over tracks in event
\r
1008 for (Int_t iTracks = 0; iTracks < event->GetNumberOfTracks(); iTracks++) {
\r
1009 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack *>(event->GetTrack(iTracks));
\r
1011 AliError(Form("Could not receive track %d", iTracks));
\r
1017 // For ESD Filter Information: ANALYSIS/macros/AddTaskESDfilter.C
\r
1018 // take only TPC only tracks
\r
1019 //fHistTrackStats->Fill(aodTrack->GetFilterMap());
\r
1020 for(Int_t iTrackBit = 0; iTrackBit < 16; iTrackBit++){
\r
1021 fHistTrackStats->Fill(iTrackBit,aodTrack->TestFilterBit(1<<iTrackBit));
\r
1023 if(!aodTrack->TestFilterBit(nAODtrackCutBit)) continue;
\r
1025 vCharge = aodTrack->Charge();
\r
1026 vEta = aodTrack->Eta();
\r
1027 vY = aodTrack->Y();
\r
1028 vPhi = aodTrack->Phi();// * TMath::RadToDeg();
\r
1029 vPt = aodTrack->Pt();
\r
1031 Float_t dcaXY = aodTrack->DCA(); // this is the DCA from global track (not exactly what is cut on)
\r
1032 Float_t dcaZ = aodTrack->ZAtDCA(); // this is the DCA from global track (not exactly what is cut on)
\r
1035 // Kinematics cuts from ESD track cuts
\r
1036 if( vPt < fPtMin || vPt > fPtMax) continue;
\r
1037 if( vEta < fEtaMin || vEta > fEtaMax) continue;
\r
1039 // Extra DCA cuts (for systematic studies [!= -1])
\r
1040 if( fDCAxyCut != -1 && fDCAzCut != -1){
\r
1041 if(TMath::Sqrt((dcaXY*dcaXY)/(fDCAxyCut*fDCAxyCut)+(dcaZ*dcaZ)/(fDCAzCut*fDCAzCut)) > 1 ){
\r
1042 continue; // 2D cut
\r
1046 // Extra TPC cuts (for systematic studies [!= -1])
\r
1047 if( fTPCchi2Cut != -1 && aodTrack->Chi2perNDF() > fTPCchi2Cut){
\r
1050 if( fNClustersTPCCut != -1 && aodTrack->GetTPCNcls() < fNClustersTPCCut){
\r
1054 // fill QA histograms
\r
1055 fHistClus->Fill(aodTrack->GetITSNcls(),aodTrack->GetTPCNcls());
\r
1056 fHistDCA->Fill(dcaZ,dcaXY);
\r
1057 fHistChi2->Fill(aodTrack->Chi2perNDF(),gCentrality);
\r
1058 fHistPt->Fill(vPt,gCentrality);
\r
1059 fHistEta->Fill(vEta,gCentrality);
\r
1060 fHistRapidity->Fill(vY,gCentrality);
\r
1061 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
\r
1062 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
\r
1063 fHistPhi->Fill(vPhi,gCentrality);
\r
1064 if(vCharge > 0) fHistEtaPhiPos->Fill(vEta,vPhi,gCentrality);
\r
1065 else if(vCharge < 0) fHistEtaPhiNeg->Fill(vEta,vPhi,gCentrality);
\r
1067 //=======================================correction
\r
1068 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
\r
1070 // add the track to the TObjArray
\r
1071 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
\r
1076 else if(gAnalysisLevel == "ESD" || gAnalysisLevel == "MCESD") { // handling of TPC only tracks different in AOD and ESD
\r
1078 AliESDtrack *trackTPC = NULL;
\r
1079 AliMCParticle *mcTrack = NULL;
\r
1081 AliMCEvent* mcEvent = NULL;
\r
1083 // for MC ESDs use also MC information
\r
1084 if(gAnalysisLevel == "MCESD"){
\r
1085 mcEvent = MCEvent();
\r
1087 AliError("mcEvent not available");
\r
1088 return tracksAccepted;
\r
1092 // Loop over tracks in event
\r
1093 for (Int_t iTracks = 0; iTracks < event->GetNumberOfTracks(); iTracks++) {
\r
1094 AliESDtrack* track = dynamic_cast<AliESDtrack *>(event->GetTrack(iTracks));
\r
1096 AliError(Form("Could not receive track %d", iTracks));
\r
1100 // for MC ESDs use also MC information --> MC track not used further???
\r
1101 if(gAnalysisLevel == "MCESD"){
\r
1102 Int_t label = TMath::Abs(track->GetLabel());
\r
1103 if(label > mcEvent->GetNumberOfTracks()) continue;
\r
1104 if(label > mcEvent->GetNumberOfPrimaries()) continue;
\r
1106 mcTrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(label));
\r
1107 if(!mcTrack) continue;
\r
1110 // take only TPC only tracks
\r
1111 trackTPC = new AliESDtrack();
\r
1112 if(!track->FillTPCOnlyTrack(*trackTPC)) continue;
\r
1115 if(fESDtrackCuts)
\r
1116 if(!fESDtrackCuts->AcceptTrack(trackTPC)) continue;
\r
1118 // fill QA histograms
\r
1121 trackTPC->GetImpactParameters(b,bCov);
\r
1122 if (bCov[0]<=0 || bCov[2]<=0) {
\r
1123 AliDebug(1, "Estimated b resolution lower or equal zero!");
\r
1124 bCov[0]=0; bCov[2]=0;
\r
1127 Int_t nClustersTPC = -1;
\r
1128 nClustersTPC = trackTPC->GetTPCNclsIter1(); // TPC standalone
\r
1129 //nClustersTPC = track->GetTPCclusters(0); // global track
\r
1130 Float_t chi2PerClusterTPC = -1;
\r
1131 if (nClustersTPC!=0) {
\r
1132 chi2PerClusterTPC = trackTPC->GetTPCchi2Iter1()/Float_t(nClustersTPC); // TPC standalone
\r
1133 //chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC); // global track
\r
1136 //===========================PID===============================//
\r
1138 Double_t prob[AliPID::kSPECIES]={0.};
\r
1139 Double_t probTPC[AliPID::kSPECIES]={0.};
\r
1140 Double_t probTOF[AliPID::kSPECIES]={0.};
\r
1141 Double_t probTPCTOF[AliPID::kSPECIES]={0.};
\r
1143 Double_t nSigma = 0.;
\r
1144 UInt_t detUsedTPC = 0;
\r
1145 UInt_t detUsedTOF = 0;
\r
1146 UInt_t detUsedTPCTOF = 0;
\r
1148 //Decide what detector configuration we want to use
\r
1149 switch(fPidDetectorConfig) {
\r
1151 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
\r
1152 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)fParticleOfInterest));
\r
1153 detUsedTPC = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPC);
\r
1154 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
\r
1155 prob[iSpecies] = probTPC[iSpecies];
\r
1158 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF);
\r
1159 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)fParticleOfInterest));
\r
1160 detUsedTOF = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTOF);
\r
1161 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
\r
1162 prob[iSpecies] = probTOF[iSpecies];
\r
1165 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC);
\r
1166 detUsedTPCTOF = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPCTOF);
\r
1167 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
\r
1168 prob[iSpecies] = probTPCTOF[iSpecies];
\r
1172 }//end switch: define detector mask
\r
1174 //Filling the PID QA
\r
1175 Double_t tofTime = -999., length = 999., tof = -999.;
\r
1176 Double_t c = TMath::C()*1.E-9;// m/ns
\r
1177 Double_t beta = -999.;
\r
1178 Double_t nSigmaTOFForParticleOfInterest = -999.;
\r
1179 if ( (track->IsOn(AliESDtrack::kTOFin)) &&
\r
1180 (track->IsOn(AliESDtrack::kTIME)) ) {
\r
1181 tofTime = track->GetTOFsignal();//in ps
\r
1182 length = track->GetIntegratedLength();
\r
1183 tof = tofTime*1E-3; // ns
\r
1186 //Printf("WARNING: track with negative TOF time found! Skipping this track for PID checks\n");
\r
1190 //printf("WARNING: track with negative length found!Skipping this track for PID checks\n");
\r
1194 length = length*0.01; // in meters
\r
1196 beta = length/tof;
\r
1198 nSigmaTOFForParticleOfInterest = fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)fParticleOfInterest);
\r
1199 fHistBetavsPTOFbeforePID ->Fill(track->P()*track->Charge(),beta);
\r
1200 fHistProbTOFvsPtbeforePID ->Fill(track->Pt(),probTOF[fParticleOfInterest]);
\r
1201 fHistNSigmaTOFvsPtbeforePID ->Fill(track->Pt(),nSigmaTOFForParticleOfInterest);
\r
1205 Double_t nSigmaTPCForParticleOfInterest = fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)fParticleOfInterest);
\r
1206 fHistdEdxVsPTPCbeforePID -> Fill(track->P()*track->Charge(),track->GetTPCsignal());
\r
1207 fHistProbTPCvsPtbeforePID -> Fill(track->Pt(),probTPC[fParticleOfInterest]);
\r
1208 fHistNSigmaTPCvsPtbeforePID -> Fill(track->Pt(),nSigmaTPCForParticleOfInterest);
\r
1209 fHistProbTPCTOFvsPtbeforePID -> Fill(track->Pt(),probTPCTOF[fParticleOfInterest]);
\r
1210 //end of QA-before pid
\r
1212 if ((detUsedTPC != 0)||(detUsedTOF != 0)||(detUsedTPCTOF != 0)) {
\r
1213 //Make the decision based on the n-sigma
\r
1214 if(fUsePIDnSigma) {
\r
1215 if(nSigma > fPIDNSigma) continue;}
\r
1217 //Make the decision based on the bayesian
\r
1218 else if(fUsePIDPropabilities) {
\r
1219 if(fParticleOfInterest != TMath::LocMax(AliPID::kSPECIES,prob)) continue;
\r
1220 if (prob[fParticleOfInterest] < fMinAcceptedPIDProbability) continue;
\r
1223 //Fill QA after the PID
\r
1224 fHistBetavsPTOFafterPID ->Fill(track->P()*track->Charge(),beta);
\r
1225 fHistProbTOFvsPtafterPID ->Fill(track->Pt(),probTOF[fParticleOfInterest]);
\r
1226 fHistNSigmaTOFvsPtafterPID ->Fill(track->Pt(),nSigmaTOFForParticleOfInterest);
\r
1228 fHistdEdxVsPTPCafterPID -> Fill(track->P()*track->Charge(),track->GetTPCsignal());
\r
1229 fHistProbTPCvsPtafterPID -> Fill(track->Pt(),probTPC[fParticleOfInterest]);
\r
1230 fHistProbTPCTOFvsPtafterPID -> Fill(track->Pt(),probTPCTOF[fParticleOfInterest]);
\r
1231 fHistNSigmaTPCvsPtafterPID -> Fill(track->Pt(),nSigmaTPCForParticleOfInterest);
\r
1234 //===========================PID===============================//
\r
1235 vCharge = trackTPC->Charge();
\r
1236 vY = trackTPC->Y();
\r
1237 vEta = trackTPC->Eta();
\r
1238 vPhi = trackTPC->Phi();// * TMath::RadToDeg();
\r
1239 vPt = trackTPC->Pt();
\r
1240 fHistClus->Fill(trackTPC->GetITSclusters(0),nClustersTPC);
\r
1241 fHistDCA->Fill(b[1],b[0]);
\r
1242 fHistChi2->Fill(chi2PerClusterTPC,gCentrality);
\r
1243 fHistPt->Fill(vPt,gCentrality);
\r
1244 fHistEta->Fill(vEta,gCentrality);
\r
1245 fHistPhi->Fill(vPhi,gCentrality);
\r
1246 if(vCharge > 0) fHistEtaPhiPos->Fill(vEta,vPhi,gCentrality);
\r
1247 else if(vCharge < 0) fHistEtaPhiNeg->Fill(vEta,vPhi,gCentrality);
\r
1248 fHistRapidity->Fill(vY,gCentrality);
\r
1249 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
\r
1250 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
\r
1252 //=======================================correction
\r
1253 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
\r
1255 // add the track to the TObjArray
\r
1256 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
\r
1262 else if(gAnalysisLevel == "MC"){
\r
1264 AliError("mcEvent not available");
\r
1268 // Loop over tracks in event
\r
1269 for (Int_t iTracks = 0; iTracks < dynamic_cast<AliMCEvent*>(event)->GetNumberOfPrimaries(); iTracks++) {
\r
1270 AliMCParticle* track = dynamic_cast<AliMCParticle *>(event->GetTrack(iTracks));
\r
1272 AliError(Form("Could not receive particle %d", iTracks));
\r
1276 //exclude non stable particles
\r
1277 if(!(dynamic_cast<AliMCEvent*>(event)->IsPhysicalPrimary(iTracks))) continue;
\r
1279 vEta = track->Eta();
\r
1280 vPt = track->Pt();
\r
1283 if( vPt < fPtMin || vPt > fPtMax)
\r
1286 if( vEta < fEtaMin || vEta > fEtaMax) continue;
\r
1288 else if (fUsePID){
\r
1289 if( vY < fEtaMin || vY > fEtaMax) continue;
\r
1292 //analyze one set of particles
\r
1293 if(fUseMCPdgCode) {
\r
1294 TParticle *particle = track->Particle();
\r
1295 if(!particle) continue;
\r
1297 Int_t gPdgCode = particle->GetPdgCode();
\r
1298 if(TMath::Abs(fPDGCodeToBeAnalyzed) != TMath::Abs(gPdgCode))
\r
1302 //Use the acceptance parameterization
\r
1303 if(fAcceptanceParameterization) {
\r
1304 Double_t gRandomNumber = gRandom->Rndm();
\r
1305 if(gRandomNumber > fAcceptanceParameterization->Eval(track->Pt()))
\r
1309 //Exclude resonances
\r
1310 if(fExcludeResonancesInMC) {
\r
1311 TParticle *particle = track->Particle();
\r
1312 if(!particle) continue;
\r
1314 Bool_t kExcludeParticle = kFALSE;
\r
1315 Int_t gMotherIndex = particle->GetFirstMother();
\r
1316 if(gMotherIndex != -1) {
\r
1317 AliMCParticle* motherTrack = dynamic_cast<AliMCParticle *>(event->GetTrack(gMotherIndex));
\r
1319 TParticle *motherParticle = motherTrack->Particle();
\r
1320 if(motherParticle) {
\r
1321 Int_t pdgCodeOfMother = motherParticle->GetPdgCode();
\r
1322 //if((pdgCodeOfMother == 113)||(pdgCodeOfMother == 213)||(pdgCodeOfMother == 221)||(pdgCodeOfMother == 223)||(pdgCodeOfMother == 331)||(pdgCodeOfMother == 333)) {
\r
1323 if(pdgCodeOfMother == 113) {
\r
1324 kExcludeParticle = kTRUE;
\r
1330 //Exclude from the analysis decay products of rho0, rho+, eta, eta' and phi
\r
1331 if(kExcludeParticle) continue;
\r
1334 vCharge = track->Charge();
\r
1335 vPhi = track->Phi();
\r
1336 //Printf("phi (before): %lf",vPhi);
\r
1338 fHistPt->Fill(vPt,gCentrality);
\r
1339 fHistEta->Fill(vEta,gCentrality);
\r
1340 fHistPhi->Fill(vPhi,gCentrality);
\r
1341 if(vCharge > 0) fHistEtaPhiPos->Fill(vEta,vPhi,gCentrality);
\r
1342 else if(vCharge < 0) fHistEtaPhiNeg->Fill(vEta,vPhi,gCentrality);
\r
1343 //fHistPhi->Fill(vPhi*TMath::RadToDeg(),gCentrality);
\r
1344 fHistRapidity->Fill(vY,gCentrality);
\r
1345 //if(vCharge > 0) fHistPhiPos->Fill(vPhi*TMath::RadToDeg(),gCentrality);
\r
1346 //else if(vCharge < 0) fHistPhiNeg->Fill(vPhi*TMath::RadToDeg(),gCentrality);
\r
1347 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
\r
1348 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
\r
1350 //Flow after burner
\r
1351 if(fUseFlowAfterBurner) {
\r
1352 Double_t precisionPhi = 0.001;
\r
1353 Int_t maxNumberOfIterations = 100;
\r
1355 Double_t phi0 = vPhi;
\r
1356 Double_t gV2 = fDifferentialV2->Eval(vPt);
\r
1358 for (Int_t j = 0; j < maxNumberOfIterations; j++) {
\r
1359 Double_t phiprev = vPhi;
\r
1360 Double_t fl = vPhi - phi0 + gV2*TMath::Sin(2.*(vPhi - gReactionPlane*TMath::DegToRad()));
\r
1361 Double_t fp = 1.0 + 2.0*gV2*TMath::Cos(2.*(vPhi - gReactionPlane*TMath::DegToRad()));
\r
1363 if (TMath::AreEqualAbs(phiprev,vPhi,precisionPhi)) break;
\r
1365 //Printf("phi (after): %lf\n",vPhi);
\r
1366 Double_t vDeltaphiBefore = phi0 - gReactionPlane*TMath::DegToRad();
\r
1367 if(vDeltaphiBefore < 0) vDeltaphiBefore += 2*TMath::Pi();
\r
1368 fHistPhiBefore->Fill(vDeltaphiBefore,gCentrality);
\r
1370 Double_t vDeltaphiAfter = vPhi - gReactionPlane*TMath::DegToRad();
\r
1371 if(vDeltaphiAfter < 0) vDeltaphiAfter += 2*TMath::Pi();
\r
1372 fHistPhiAfter->Fill(vDeltaphiAfter,gCentrality);
\r
1376 //vPhi *= TMath::RadToDeg();
\r
1378 //=======================================correction
\r
1379 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
\r
1381 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
\r
1386 return tracksAccepted;
\r
1388 //________________________________________________________________________
\r
1389 TObjArray* AliAnalysisTaskBFPsi::GetShuffledTracks(TObjArray *tracks, Double_t gCentrality){
\r
1390 // Clones TObjArray and returns it with tracks after shuffling the charges
\r
1392 TObjArray* tracksShuffled = new TObjArray;
\r
1393 tracksShuffled->SetOwner(kTRUE);
\r
1395 vector<Short_t> *chargeVector = new vector<Short_t>; //original charge of accepted tracks
\r
1397 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
\r
1399 AliVParticle* track = (AliVParticle*) tracks->At(i);
\r
1400 chargeVector->push_back(track->Charge());
\r
1403 random_shuffle(chargeVector->begin(), chargeVector->end());
\r
1405 for(Int_t i = 0; i < tracks->GetEntriesFast(); i++){
\r
1406 AliVParticle* track = (AliVParticle*) tracks->At(i);
\r
1407 //==============================correction
\r
1408 Double_t correction = GetTrackbyTrackCorrectionMatrix(track->Eta(), track->Phi(),track->Pt(), chargeVector->at(i), gCentrality);
\r
1409 tracksShuffled->Add(new AliBFBasicParticle(track->Eta(), track->Phi(), track->Pt(),chargeVector->at(i), correction));
\r
1412 delete chargeVector;
\r
1414 return tracksShuffled;
\r
1418 //________________________________________________________________________
\r
1419 void AliAnalysisTaskBFPsi::FinishTaskOutput(){
\r
1420 //Printf("END BF");
\r
1423 AliError("fBalance not available");
\r
1426 if(fRunShuffling) {
\r
1427 if (!fShuffledBalance) {
\r
1428 AliError("fShuffledBalance not available");
\r
1435 //________________________________________________________________________
\r
1436 void AliAnalysisTaskBFPsi::Terminate(Option_t *) {
\r
1437 // Draw result to the screen
\r
1438 // Called once at the end of the query
\r
1440 // not implemented ...
\r