4 #include "TLorentzVector.h"
\r
5 #include "TGraphErrors.h"
\r
10 #include "TArrayF.h"
\r
12 #include "TRandom.h"
\r
14 #include "AliAnalysisTaskSE.h"
\r
15 #include "AliAnalysisManager.h"
\r
17 #include "AliESDVertex.h"
\r
18 #include "AliESDEvent.h"
\r
19 #include "AliESDInputHandler.h"
\r
20 #include "AliAODEvent.h"
\r
21 #include "AliAODTrack.h"
\r
22 #include "AliAODInputHandler.h"
\r
23 #include "AliCollisionGeometry.h"
\r
24 #include "AliGenEventHeader.h"
\r
25 #include "AliMCEventHandler.h"
\r
26 #include "AliMCEvent.h"
\r
27 #include "AliStack.h"
\r
28 #include "AliESDtrackCuts.h"
\r
29 #include "AliEventplane.h"
\r
30 #include "AliTHn.h"
\r
32 #include "AliEventPoolManager.h"
\r
34 #include "AliPID.h"
\r
35 #include "AliPIDResponse.h"
\r
36 #include "AliPIDCombined.h"
\r
38 #include "AliAnalysisTaskBFPsi.h"
\r
39 #include "AliBalancePsi.h"
\r
40 #include "AliAnalysisTaskTriggeredBF.h"
\r
43 // Analysis task for the BF vs Psi code
\r
44 // Authors: Panos.Christakoglou@nikhef.nl
\r
49 ClassImp(AliAnalysisTaskBFPsi)
\r
51 //________________________________________________________________________
\r
52 AliAnalysisTaskBFPsi::AliAnalysisTaskBFPsi(const char *name)
\r
53 : AliAnalysisTaskSE(name),
\r
55 fRunShuffling(kFALSE),
\r
56 fShuffledBalance(0),
\r
58 fRunMixingEventPlane(kFALSE),
\r
59 fMixingTracks(50000),
\r
69 fHistTriggerStats(0),
\r
88 fHistdEdxVsPTPCbeforePID(NULL),
\r
89 fHistBetavsPTOFbeforePID(NULL),
\r
90 fHistProbTPCvsPtbeforePID(NULL),
\r
91 fHistProbTOFvsPtbeforePID(NULL),
\r
92 fHistProbTPCTOFvsPtbeforePID(NULL),
\r
93 fHistNSigmaTPCvsPtbeforePID(NULL),
\r
94 fHistNSigmaTOFvsPtbeforePID(NULL),
\r
95 fHistdEdxVsPTPCafterPID(NULL),
\r
96 fHistBetavsPTOFafterPID(NULL),
\r
97 fHistProbTPCvsPtafterPID(NULL),
\r
98 fHistProbTOFvsPtafterPID(NULL),
\r
99 fHistProbTPCTOFvsPtafterPID(NULL),
\r
100 fHistNSigmaTPCvsPtafterPID(NULL),
\r
101 fHistNSigmaTOFvsPtafterPID(NULL),
\r
104 fParticleOfInterest(kPion),
\r
105 fPidDetectorConfig(kTPCTOF),
\r
107 fUsePIDnSigma(kTRUE),
\r
108 fUsePIDPropabilities(kFALSE),
\r
110 fMinAcceptedPIDProbability(0.8),
\r
112 fCentralityEstimator("V0M"),
\r
113 fUseCentrality(kFALSE),
\r
114 fCentralityPercentileMin(0.),
\r
115 fCentralityPercentileMax(5.),
\r
116 fImpactParameterMin(0.),
\r
117 fImpactParameterMax(20.),
\r
118 fUseMultiplicity(kFALSE),
\r
119 fNumberOfAcceptedTracksMin(0),
\r
120 fNumberOfAcceptedTracksMax(10000),
\r
121 fHistNumberOfAcceptedTracks(0),
\r
122 fUseOfflineTrigger(kFALSE),
\r
126 nAODtrackCutBit(128),
\r
129 fPtMinForCorrections(0.3),//=================================correction
\r
130 fPtMaxForCorrections(1.5),//=================================correction
\r
131 fPtBinForCorrections(36), //=================================correction
\r
134 fEtaMinForCorrections(-0.8),//=================================correction
\r
135 fEtaMaxForCorrections(0.8),//=================================correction
\r
136 fEtaBinForCorrections(16), //=================================correction
\r
139 fPhiMinForCorrections(0.),//=================================correction
\r
140 fPhiMaxForCorrections(360.),//=================================correction
\r
141 fPhiBinForCorrections(100), //=================================correction
\r
145 fNClustersTPCCut(-1),
\r
146 fAcceptanceParameterization(0),
\r
147 fDifferentialV2(0),
\r
148 fUseFlowAfterBurner(kFALSE),
\r
149 fExcludeResonancesInMC(kFALSE),
\r
150 fUseMCPdgCode(kFALSE),
\r
151 fPDGCodeToBeAnalyzed(-1),
\r
152 fEventClass("EventPlane")
\r
155 // Define input and output slots here
\r
156 // Input slot #0 works with a TChain
\r
158 //======================================================correction
\r
159 for (Int_t i=0; i<kCENTRALITY; i++){
\r
160 fHistMatrixCorrectionPlus[i] = NULL;
\r
161 fHistMatrixCorrectionMinus[i] = NULL;
\r
163 //=====================================================correction
\r
165 DefineInput(0, TChain::Class());
\r
166 // Output slot #0 writes into a TH1 container
\r
167 DefineOutput(1, TList::Class());
\r
168 DefineOutput(2, TList::Class());
\r
169 DefineOutput(3, TList::Class());
\r
170 DefineOutput(4, TList::Class());
\r
171 DefineOutput(5, TList::Class());
\r
174 //________________________________________________________________________
\r
175 AliAnalysisTaskBFPsi::~AliAnalysisTaskBFPsi() {
\r
177 // delete fBalance;
\r
178 // delete fShuffledBalance;
\r
180 // delete fListBF;
\r
181 // delete fListBFS;
\r
183 // delete fHistEventStats;
\r
184 // delete fHistTrackStats;
\r
185 // delete fHistVx;
\r
186 // delete fHistVy;
\r
187 // delete fHistVz;
\r
189 // delete fHistClus;
\r
190 // delete fHistDCA;
\r
191 // delete fHistChi2;
\r
193 // delete fHistEta;
\r
194 // delete fHistPhi;
\r
195 // delete fHistV0M;
\r
198 //________________________________________________________________________
\r
199 void AliAnalysisTaskBFPsi::UserCreateOutputObjects() {
\r
200 // Create histograms
\r
203 // global switch disabling the reference
\r
204 // (to avoid "Replacing existing TH1" if several wagons are created in train)
\r
205 Bool_t oldStatus = TH1::AddDirectoryStatus();
\r
206 TH1::AddDirectory(kFALSE);
\r
209 fBalance = new AliBalancePsi();
\r
210 fBalance->SetAnalysisLevel("ESD");
\r
211 fBalance->SetEventClass(fEventClass);
\r
212 //fBalance->SetNumberOfBins(-1,16);
\r
213 //fBalance->SetInterval(-1,-0.8,0.8,16,0.,1.6,15.);
\r
215 if(fRunShuffling) {
\r
216 if(!fShuffledBalance) {
\r
217 fShuffledBalance = new AliBalancePsi();
\r
218 fShuffledBalance->SetAnalysisLevel("ESD");
\r
219 fShuffledBalance->SetEventClass(fEventClass);
\r
220 //fShuffledBalance->SetNumberOfBins(-1,16);
\r
221 //fShuffledBalance->SetInterval(-1,-0.8,0.8,16,0.,1.6,15.);
\r
225 if(!fMixedBalance) {
\r
226 fMixedBalance = new AliBalancePsi();
\r
227 fMixedBalance->SetAnalysisLevel("ESD");
\r
228 fMixedBalance->SetEventClass(fEventClass);
\r
233 fList = new TList();
\r
234 fList->SetName("listQA");
\r
237 //Balance Function list
\r
238 fListBF = new TList();
\r
239 fListBF->SetName("listBF");
\r
240 fListBF->SetOwner();
\r
242 if(fRunShuffling) {
\r
243 fListBFS = new TList();
\r
244 fListBFS->SetName("listBFShuffled");
\r
245 fListBFS->SetOwner();
\r
249 fListBFM = new TList();
\r
250 fListBFM->SetName("listTriggeredBFMixed");
\r
251 fListBFM->SetOwner();
\r
256 fHistListPIDQA = new TList();
\r
257 fHistListPIDQA->SetName("listQAPID");
\r
258 fHistListPIDQA->SetOwner();
\r
262 TString gCutName[5] = {"Total","Offline trigger",
\r
263 "Vertex","Analyzed","sel. Centrality"};
\r
264 fHistEventStats = new TH2F("fHistEventStats",
\r
265 "Event statistics;;Centrality percentile;N_{events}",
\r
266 5,0.5,5.5,220,-5,105);
\r
267 for(Int_t i = 1; i <= 5; i++)
\r
268 fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1].Data());
\r
269 fList->Add(fHistEventStats);
\r
271 TString gCentName[9] = {"V0M","FMD","TRK","TKL","CL0","CL1","V0MvsFMD","TKLvsV0M","ZEMvsZDC"};
\r
272 fHistCentStats = new TH2F("fHistCentStats",
\r
273 "Centrality statistics;;Cent percentile",
\r
274 9,-0.5,8.5,220,-5,105);
\r
275 for(Int_t i = 1; i <= 9; i++)
\r
276 fHistCentStats->GetXaxis()->SetBinLabel(i,gCentName[i-1].Data());
\r
277 fList->Add(fHistCentStats);
\r
279 fHistTriggerStats = new TH1F("fHistTriggerStats","Trigger statistics;TriggerBit;N_{events}",1025,0,1025);
\r
280 fList->Add(fHistTriggerStats);
\r
282 fHistTrackStats = new TH1F("fHistTrackStats","Event statistics;TrackFilterBit;N_{events}",16,0,16);
\r
283 fList->Add(fHistTrackStats);
\r
285 fHistNumberOfAcceptedTracks = new TH2F("fHistNumberOfAcceptedTracks",";N_{acc.};Centrality percentile;Entries",4001,-0.5,4000.5,220,-5,105);
\r
286 fList->Add(fHistNumberOfAcceptedTracks);
\r
288 // Vertex distributions
\r
289 fHistVx = new TH1F("fHistVx","Primary vertex distribution - x coordinate;V_{x} (cm);Entries",100,-0.5,0.5);
\r
290 fList->Add(fHistVx);
\r
291 fHistVy = new TH1F("fHistVy","Primary vertex distribution - y coordinate;V_{y} (cm);Entries",100,-0.5,0.5);
\r
292 fList->Add(fHistVy);
\r
293 fHistVz = new TH2F("fHistVz","Primary vertex distribution - z coordinate;V_{z} (cm);Centrality percentile;Entries",100,-20.,20.,220,-5,105);
\r
294 fList->Add(fHistVz);
\r
297 fHistEventPlane = new TH2F("fHistEventPlane",";#Psi_{2} [deg.];Centrality percentile;Counts",100,0,360.,220,-5,105);
\r
298 fList->Add(fHistEventPlane);
\r
301 fHistClus = new TH2F("fHistClus","# Cluster (TPC vs. ITS)",10,0,10,200,0,200);
\r
302 fList->Add(fHistClus);
\r
303 fHistChi2 = new TH2F("fHistChi2","Chi2/NDF distribution;#chi^{2}/ndf;Centrality percentile",200,0,10,220,-5,105);
\r
304 fList->Add(fHistChi2);
\r
305 fHistDCA = new TH2F("fHistDCA","DCA (xy vs. z)",400,-5,5,400,-5,5);
\r
306 fList->Add(fHistDCA);
\r
307 fHistPt = new TH2F("fHistPt","p_{T} distribution;p_{T} (GeV/c);Centrality percentile",200,0,10,220,-5,105);
\r
308 fList->Add(fHistPt);
\r
309 fHistEta = new TH2F("fHistEta","#eta distribution;#eta;Centrality percentile",200,-2,2,220,-5,105);
\r
310 fList->Add(fHistEta);
\r
311 fHistRapidity = new TH2F("fHistRapidity","y distribution;y;Centrality percentile",200,-2,2,220,-5,105);
\r
312 fList->Add(fHistRapidity);
\r
313 fHistPhi = new TH2F("fHistPhi","#phi distribution;#phi (rad);Centrality percentile",200,0.0,2.*TMath::Pi(),220,-5,105);
\r
314 fList->Add(fHistPhi);
\r
315 fHistPhiBefore = new TH2F("fHistPhiBefore","#phi distribution;#phi;Centrality percentile",200,0.,2*TMath::Pi(),220,-5,105);
\r
316 fList->Add(fHistPhiBefore);
\r
317 fHistPhiAfter = new TH2F("fHistPhiAfter","#phi distribution;#phi;Centrality percentile",200,0.,2*TMath::Pi(),220,-5,105);
\r
318 fList->Add(fHistPhiAfter);
\r
319 fHistPhiPos = new TH2F("fHistPhiPos","#phi distribution for positive particles;#phi;Centrality percentile",200,0.,2*TMath::Pi(),220,-5,105);
\r
320 fList->Add(fHistPhiPos);
\r
321 fHistPhiNeg = new TH2F("fHistPhiNeg","#phi distribution for negative particles;#phi;Centrality percentile",200,0.,2.*TMath::Pi(),220,-5,105);
\r
322 fList->Add(fHistPhiNeg);
\r
323 fHistV0M = new TH2F("fHistV0M","V0 Multiplicity C vs. A",500, 0, 20000, 500, 0, 20000);
\r
324 fList->Add(fHistV0M);
\r
325 TString gRefTrackName[6] = {"tracks","tracksPos","tracksNeg","tracksTPConly","clusITS0","clusITS1"};
\r
326 fHistRefTracks = new TH2F("fHistRefTracks","Nr of Ref tracks/event vs. ref track estimator;;Nr of tracks",6, 0, 6, 400, 0, 20000);
\r
327 for(Int_t i = 1; i <= 6; i++)
\r
328 fHistRefTracks->GetXaxis()->SetBinLabel(i,gRefTrackName[i-1].Data());
\r
329 fList->Add(fHistRefTracks);
\r
331 // QA histograms for HBTinspired and Conversion cuts
\r
332 fList->Add(fBalance->GetQAHistHBTbefore());
\r
333 fList->Add(fBalance->GetQAHistHBTafter());
\r
334 fList->Add(fBalance->GetQAHistConversionbefore());
\r
335 fList->Add(fBalance->GetQAHistConversionafter());
\r
336 fList->Add(fBalance->GetQAHistPsiMinusPhi());
\r
338 // Balance function histograms
\r
339 // Initialize histograms if not done yet
\r
340 if(!fBalance->GetHistNp()){
\r
341 AliWarning("Histograms not yet initialized! --> Will be done now");
\r
342 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
\r
343 fBalance->InitHistograms();
\r
346 if(fRunShuffling) {
\r
347 if(!fShuffledBalance->GetHistNp()) {
\r
348 AliWarning("Histograms (shuffling) not yet initialized! --> Will be done now");
\r
349 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
\r
350 fShuffledBalance->InitHistograms();
\r
354 //for(Int_t a = 0; a < ANALYSIS_TYPES; a++){
\r
355 fListBF->Add(fBalance->GetHistNp());
\r
356 fListBF->Add(fBalance->GetHistNn());
\r
357 fListBF->Add(fBalance->GetHistNpn());
\r
358 fListBF->Add(fBalance->GetHistNnn());
\r
359 fListBF->Add(fBalance->GetHistNpp());
\r
360 fListBF->Add(fBalance->GetHistNnp());
\r
362 if(fRunShuffling) {
\r
363 fListBFS->Add(fShuffledBalance->GetHistNp());
\r
364 fListBFS->Add(fShuffledBalance->GetHistNn());
\r
365 fListBFS->Add(fShuffledBalance->GetHistNpn());
\r
366 fListBFS->Add(fShuffledBalance->GetHistNnn());
\r
367 fListBFS->Add(fShuffledBalance->GetHistNpp());
\r
368 fListBFS->Add(fShuffledBalance->GetHistNnp());
\r
372 fListBFM->Add(fMixedBalance->GetHistNp());
\r
373 fListBFM->Add(fMixedBalance->GetHistNn());
\r
374 fListBFM->Add(fMixedBalance->GetHistNpn());
\r
375 fListBFM->Add(fMixedBalance->GetHistNnn());
\r
376 fListBFM->Add(fMixedBalance->GetHistNpp());
\r
377 fListBFM->Add(fMixedBalance->GetHistNnp());
\r
384 Int_t trackDepth = fMixingTracks;
\r
385 Int_t poolsize = 1000; // Maximum number of events, ignored in the present implemented of AliEventPoolManager
\r
388 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
389 Double_t* centbins = centralityBins;
\r
390 Int_t nCentralityBins = sizeof(centralityBins) / sizeof(Double_t) - 1;
\r
393 Double_t vertexBins[] = {-10., -7., -5., -3., -1., 1., 3., 5., 7., 10.}; // SHOULD BE DEDUCED FROM CREATED ALITHN!!!
\r
394 Double_t* vtxbins = vertexBins;
\r
395 Int_t nVertexBins = sizeof(vertexBins) / sizeof(Double_t) - 1;
\r
397 // Event plane angle (Psi) bins
\r
398 Double_t psiBins[] = {0.,45.,135.,215.,305.,360.}; // SHOULD BE DEDUCED FROM CREATED ALITHN!!!
\r
399 Double_t* psibins = psiBins;
\r
400 Int_t nPsiBins = sizeof(psiBins) / sizeof(Double_t) - 1;
\r
402 // run the event mixing also in bins of event plane (statistics!)
\r
403 if(fRunMixingEventPlane){
\r
404 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, centbins, nVertexBins, vtxbins, nPsiBins, psibins);
\r
407 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, centbins, nVertexBins, vtxbins);
\r
411 if(fESDtrackCuts) fList->Add(fESDtrackCuts);
\r
413 //====================PID========================//
\r
415 fPIDCombined = new AliPIDCombined();
\r
416 fPIDCombined->SetDefaultTPCPriors();
\r
418 fHistdEdxVsPTPCbeforePID = new TH2D ("dEdxVsPTPCbefore","dEdxVsPTPCbefore", 1000, -10.0, 10.0, 1000, 0, 1000);
\r
419 fHistListPIDQA->Add(fHistdEdxVsPTPCbeforePID); //addition
\r
421 fHistBetavsPTOFbeforePID = new TH2D ("BetavsPTOFbefore","BetavsPTOFbefore", 1000, -10.0, 10., 1000, 0, 1.2);
\r
422 fHistListPIDQA->Add(fHistBetavsPTOFbeforePID); //addition
\r
424 fHistProbTPCvsPtbeforePID = new TH2D ("ProbTPCvsPtbefore","ProbTPCvsPtbefore", 1000, -10.0,10.0, 1000, 0, 2.0);
\r
425 fHistListPIDQA->Add(fHistProbTPCvsPtbeforePID); //addition
\r
427 fHistProbTOFvsPtbeforePID = new TH2D ("ProbTOFvsPtbefore","ProbTOFvsPtbefore", 1000, -50, 50, 1000, 0, 2.0);
\r
428 fHistListPIDQA->Add(fHistProbTOFvsPtbeforePID); //addition
\r
430 fHistProbTPCTOFvsPtbeforePID =new TH2D ("ProbTPCTOFvsPtbefore","ProbTPCTOFvsPtbefore", 1000, -50, 50, 1000, 0, 2.0);
\r
431 fHistListPIDQA->Add(fHistProbTPCTOFvsPtbeforePID); //addition
\r
433 fHistNSigmaTPCvsPtbeforePID = new TH2D ("NSigmaTPCvsPtbefore","NSigmaTPCvsPtbefore", 1000, -10, 10, 1000, 0, 500);
\r
434 fHistListPIDQA->Add(fHistNSigmaTPCvsPtbeforePID); //addition
\r
436 fHistNSigmaTOFvsPtbeforePID = new TH2D ("NSigmaTOFvsPtbefore","NSigmaTOFvsPtbefore", 1000, -10, 10, 1000, 0, 500);
\r
437 fHistListPIDQA->Add(fHistNSigmaTOFvsPtbeforePID); //addition
\r
439 fHistdEdxVsPTPCafterPID = new TH2D ("dEdxVsPTPCafter","dEdxVsPTPCafter", 1000, -10, 10, 1000, 0, 1000);
\r
440 fHistListPIDQA->Add(fHistdEdxVsPTPCafterPID); //addition
\r
442 fHistBetavsPTOFafterPID = new TH2D ("BetavsPTOFafter","BetavsPTOFafter", 1000, -10, 10, 1000, 0, 1.2);
\r
443 fHistListPIDQA->Add(fHistBetavsPTOFafterPID); //addition
\r
445 fHistProbTPCvsPtafterPID = new TH2D ("ProbTPCvsPtafter","ProbTPCvsPtafter", 1000, -10, 10, 1000, 0, 2);
\r
446 fHistListPIDQA->Add(fHistProbTPCvsPtafterPID); //addition
\r
448 fHistProbTOFvsPtafterPID = new TH2D ("ProbTOFvsPtafter","ProbTOFvsPtafter", 1000, -10, 10, 1000, 0, 2);
\r
449 fHistListPIDQA->Add(fHistProbTOFvsPtafterPID); //addition
\r
451 fHistProbTPCTOFvsPtafterPID =new TH2D ("ProbTPCTOFvsPtafter","ProbTPCTOFvsPtafter", 1000, -50, 50, 1000, 0, 2.0);
\r
452 fHistListPIDQA->Add(fHistProbTPCTOFvsPtafterPID); //addition
\r
454 fHistNSigmaTPCvsPtafterPID = new TH2D ("NSigmaTPCvsPtafter","NSigmaTPCvsPtafter", 1000, -10, 10, 1000, 0, 500);
\r
455 fHistListPIDQA->Add(fHistNSigmaTPCvsPtafterPID); //addition
\r
457 fHistNSigmaTOFvsPtafterPID = new TH2D ("NSigmaTOFvsPtafter","NSigmaTOFvsPtafter", 1000, -10, 10, 1000, 0, 500);
\r
458 fHistListPIDQA->Add(fHistNSigmaTOFvsPtafterPID); //addition
\r
460 //====================PID========================//
\r
462 // Post output data.
\r
463 PostData(1, fList);
\r
464 PostData(2, fListBF);
\r
465 if(fRunShuffling) PostData(3, fListBFS);
\r
466 if(fRunMixing) PostData(4, fListBFM);
\r
467 if(fUsePID) PostData(5, fHistListPIDQA); //PID
\r
469 TH1::AddDirectory(oldStatus);
\r
473 //________________________________________________________________________
\r
474 void AliAnalysisTaskBFPsi::SetInputCorrection(const char* filename,
\r
475 const char* gCollSystem) {
\r
476 //Open files that will be used for correction
\r
477 TString gCollidingSystem = gCollSystem;
\r
479 //Open the input file
\r
480 TFile *f = TFile::Open(filename);
\r
482 Printf("File not found!!!");
\r
486 //Get the TDirectoryFile and TList
\r
487 TDirectoryFile *dir = dynamic_cast<TDirectoryFile *>(f->Get("PWGCFEbyE.outputBalanceFunctionEfficiencyAnalysis"));
\r
489 Printf("TDirectoryFile not found!!!");
\r
493 TString listEffName = "";
\r
494 for (Int_t iCent = 0; iCent < kCENTRALITY; iCent++) {
\r
495 listEffName = "listEfficiencyBF_";
\r
496 listEffName += (TString)((Int_t)(centralityArrayForPbPb[iCent]));
\r
497 listEffName += "_";
\r
498 listEffName += (TString)((Int_t)(centralityArrayForPbPb[iCent+1]));
\r
499 TList *list = (TList*)dir->Get(listEffName.Data());
\r
501 Printf("TList Efficiency not found!!!");
\r
505 TString histoName = "fHistMatrixCorrectionPlus";
\r
506 fHistMatrixCorrectionPlus[iCent]= dynamic_cast<TH3D *>(list->FindObject(histoName.Data()));
\r
507 if(!fHistMatrixCorrectionPlus[iCent]) {
\r
508 Printf("fHist not found!!!");
\r
512 histoName = "fHistMatrixCorrectionMinus";
\r
513 fHistMatrixCorrectionMinus[iCent] = dynamic_cast<TH3D *>(list->FindObject(histoName.Data()));
\r
514 if(!fHistMatrixCorrectionMinus[iCent]) {
\r
515 Printf("fHist not found!!!");
\r
518 }//loop over centralities: ONLY the PbPb case is covered
\r
520 if(fHistMatrixCorrectionPlus[0]){
\r
521 fEtaMinForCorrections = fHistMatrixCorrectionPlus[0]->GetXaxis()->GetXmin();
\r
522 fEtaMaxForCorrections = fHistMatrixCorrectionPlus[0]->GetXaxis()->GetXmax();
\r
523 fEtaBinForCorrections = fHistMatrixCorrectionPlus[0]->GetNbinsX();
\r
525 fPtMinForCorrections = fHistMatrixCorrectionPlus[0]->GetYaxis()->GetXmin();
\r
526 fPtMaxForCorrections = fHistMatrixCorrectionPlus[0]->GetYaxis()->GetXmax();
\r
527 fPtBinForCorrections = fHistMatrixCorrectionPlus[0]->GetNbinsY();
\r
529 fPhiMinForCorrections = fHistMatrixCorrectionPlus[0]->GetZaxis()->GetXmin();
\r
530 fPhiMaxForCorrections = fHistMatrixCorrectionPlus[0]->GetZaxis()->GetXmax();
\r
531 fPhiBinForCorrections = fHistMatrixCorrectionPlus[0]->GetNbinsZ();
\r
535 //________________________________________________________________________
\r
536 void AliAnalysisTaskBFPsi::UserExec(Option_t *) {
\r
538 // Called for each event
\r
540 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
541 Int_t gNumberOfAcceptedTracks = 0;
\r
542 Double_t gCentrality = -1.;
\r
543 Double_t gReactionPlane = -1.;
\r
544 Float_t bSign = 0.;
\r
546 // get the event (for generator level: MCEvent())
\r
547 AliVEvent* eventMain = NULL;
\r
548 if(gAnalysisLevel == "MC") {
\r
549 eventMain = dynamic_cast<AliVEvent*>(MCEvent());
\r
552 eventMain = dynamic_cast<AliVEvent*>(InputEvent());
\r
554 // for HBT like cuts need magnetic field sign
\r
555 bSign = (eventMain->GetMagneticField() > 0) ? 1 : -1;
\r
558 AliError("eventMain not available");
\r
562 // PID Response task active?
\r
564 fPIDResponse = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetPIDResponse();
\r
565 if (!fPIDResponse) AliFatal("This Task needs the PID response attached to the inputHandler");
\r
568 // check event cuts and fill event histograms
\r
569 if((gCentrality = IsEventAccepted(eventMain)) < 0){
\r
573 //Compute Multiplicity or Centrality variable
\r
574 Double_t lMultiplicityVar = GetRefMultiOrCentrality( eventMain );
\r
576 // get the reaction plane
\r
577 gReactionPlane = GetEventPlane(eventMain);
\r
578 fHistEventPlane->Fill(gReactionPlane,gCentrality);
\r
579 if(gReactionPlane < 0){
\r
583 // get the accepted tracks in main event
\r
584 TObjArray *tracksMain = GetAcceptedTracks(eventMain,gCentrality,gReactionPlane);
\r
585 gNumberOfAcceptedTracks = tracksMain->GetEntriesFast();
\r
587 //multiplicity cut (used in pp)
\r
588 fHistNumberOfAcceptedTracks->Fill(gNumberOfAcceptedTracks,gCentrality);
\r
589 if(fUseMultiplicity) {
\r
590 if((gNumberOfAcceptedTracks < fNumberOfAcceptedTracksMin)||(gNumberOfAcceptedTracks > fNumberOfAcceptedTracksMax))
\r
594 // store charges of all accepted tracks, shuffle and reassign (two extra loops!)
\r
595 TObjArray* tracksShuffled = NULL;
\r
597 tracksShuffled = GetShuffledTracks(tracksMain,gCentrality);
\r
603 // 1. First get an event pool corresponding in mult (cent) and
\r
604 // zvertex to the current event. Once initialized, the pool
\r
605 // should contain nMix (reduced) events. This routine does not
\r
606 // pre-scan the chain. The first several events of every chain
\r
607 // will be skipped until the needed pools are filled to the
\r
608 // specified depth. If the pool categories are not too rare, this
\r
609 // should not be a problem. If they are rare, you could lose`
\r
612 // 2. Collect the whole pool's content of tracks into one TObjArray
\r
613 // (bgTracks), which is effectively a single background super-event.
\r
615 // 3. The reduced and bgTracks arrays must both be passed into
\r
616 // FillCorrelations(). Also nMix should be passed in, so a weight
\r
617 // of 1./nMix can be applied.
\r
619 AliEventPool* pool = fPoolMgr->GetEventPool(gCentrality, eventMain->GetPrimaryVertex()->GetZ(),gReactionPlane);
\r
622 AliFatal(Form("No pool found for centrality = %f, zVtx = %f, psi = %f", gCentrality, eventMain->GetPrimaryVertex()->GetZ(),gReactionPlane));
\r
626 //pool->SetDebug(1);
\r
628 if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5){
\r
631 Int_t nMix = pool->GetCurrentNEvents();
\r
632 //cout << "nMix = " << nMix << " tracks in pool = " << pool->NTracksInPool() << endl;
\r
634 //((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(2);
\r
635 //((TH2F*) fListOfHistos->FindObject("mixedDist"))->Fill(centrality, pool->NTracksInPool());
\r
636 //if (pool->IsReady())
\r
637 //((TH1F*) fListOfHistos->FindObject("eventStat"))->Fill(3);
\r
639 // Fill mixed-event histos here
\r
640 for (Int_t jMix=0; jMix<nMix; jMix++)
\r
642 TObjArray* tracksMixed = pool->GetEvent(jMix);
\r
643 fMixedBalance->CalculateBalance(gReactionPlane,tracksMain,tracksMixed,bSign,lMultiplicityVar);
\r
647 // Update the Event pool
\r
648 pool->UpdatePool(tracksMain);
\r
649 //pool->PrintInfo();
\r
651 }//pool NULL check
\r
654 // calculate balance function
\r
655 fBalance->CalculateBalance(gReactionPlane,tracksMain,NULL,bSign,lMultiplicityVar);
\r
657 // calculate shuffled balance function
\r
658 if(fRunShuffling && tracksShuffled != NULL) {
\r
659 fShuffledBalance->CalculateBalance(gReactionPlane,tracksShuffled,NULL,bSign,lMultiplicityVar);
\r
663 //________________________________________________________________________
\r
664 Double_t AliAnalysisTaskBFPsi::IsEventAccepted(AliVEvent *event){
\r
665 // Checks the Event cuts
\r
666 // Fills Event statistics histograms
\r
668 Bool_t isSelectedMain = kTRUE;
\r
669 Float_t gCentrality = -1.;
\r
670 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
672 fHistEventStats->Fill(1,gCentrality); //all events
\r
674 // Event trigger bits
\r
675 fHistTriggerStats->Fill(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected());
\r
676 if(fUseOfflineTrigger)
\r
677 isSelectedMain = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
\r
679 if(isSelectedMain) {
\r
680 fHistEventStats->Fill(2,gCentrality); //triggered events
\r
682 //Centrality stuff
\r
683 if(fUseCentrality) {
\r
684 if(gAnalysisLevel == "AOD") { //centrality in AOD header
\r
685 AliAODHeader *header = (AliAODHeader*) event->GetHeader();
\r
687 gCentrality = header->GetCentralityP()->GetCentralityPercentile(fCentralityEstimator.Data());
\r
689 // QA for centrality estimators
\r
690 fHistCentStats->Fill(0.,header->GetCentralityP()->GetCentralityPercentile("V0M"));
\r
691 fHistCentStats->Fill(1.,header->GetCentralityP()->GetCentralityPercentile("FMD"));
\r
692 fHistCentStats->Fill(2.,header->GetCentralityP()->GetCentralityPercentile("TRK"));
\r
693 fHistCentStats->Fill(3.,header->GetCentralityP()->GetCentralityPercentile("TKL"));
\r
694 fHistCentStats->Fill(4.,header->GetCentralityP()->GetCentralityPercentile("CL0"));
\r
695 fHistCentStats->Fill(5.,header->GetCentralityP()->GetCentralityPercentile("CL1"));
\r
696 fHistCentStats->Fill(6.,header->GetCentralityP()->GetCentralityPercentile("V0MvsFMD"));
\r
697 fHistCentStats->Fill(7.,header->GetCentralityP()->GetCentralityPercentile("TKLvsV0M"));
\r
698 fHistCentStats->Fill(8.,header->GetCentralityP()->GetCentralityPercentile("ZEMvsZDC"));
\r
700 // centrality QA (V0M)
\r
701 fHistV0M->Fill(event->GetVZEROData()->GetMTotV0A(), event->GetVZEROData()->GetMTotV0C());
\r
703 // centrality QA (reference tracks)
\r
704 fHistRefTracks->Fill(0.,header->GetRefMultiplicity());
\r
705 fHistRefTracks->Fill(1.,header->GetRefMultiplicityPos());
\r
706 fHistRefTracks->Fill(2.,header->GetRefMultiplicityNeg());
\r
707 fHistRefTracks->Fill(3.,header->GetTPConlyRefMultiplicity());
\r
708 fHistRefTracks->Fill(4.,header->GetNumberOfITSClusters(0));
\r
709 fHistRefTracks->Fill(5.,header->GetNumberOfITSClusters(1));
\r
710 fHistRefTracks->Fill(6.,header->GetNumberOfITSClusters(2));
\r
711 fHistRefTracks->Fill(7.,header->GetNumberOfITSClusters(3));
\r
712 fHistRefTracks->Fill(8.,header->GetNumberOfITSClusters(4));
\r
716 else if(gAnalysisLevel == "ESD" || gAnalysisLevel == "MCESD"){ // centrality class for ESDs or MC-ESDs
\r
717 AliCentrality *centrality = event->GetCentrality();
\r
718 gCentrality = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
\r
720 // QA for centrality estimators
\r
721 fHistCentStats->Fill(0.,centrality->GetCentralityPercentile("V0M"));
\r
722 fHistCentStats->Fill(1.,centrality->GetCentralityPercentile("FMD"));
\r
723 fHistCentStats->Fill(2.,centrality->GetCentralityPercentile("TRK"));
\r
724 fHistCentStats->Fill(3.,centrality->GetCentralityPercentile("TKL"));
\r
725 fHistCentStats->Fill(4.,centrality->GetCentralityPercentile("CL0"));
\r
726 fHistCentStats->Fill(5.,centrality->GetCentralityPercentile("CL1"));
\r
727 fHistCentStats->Fill(6.,centrality->GetCentralityPercentile("V0MvsFMD"));
\r
728 fHistCentStats->Fill(7.,centrality->GetCentralityPercentile("TKLvsV0M"));
\r
729 fHistCentStats->Fill(8.,centrality->GetCentralityPercentile("ZEMvsZDC"));
\r
731 // centrality QA (V0M)
\r
732 fHistV0M->Fill(event->GetVZEROData()->GetMTotV0A(), event->GetVZEROData()->GetMTotV0C());
\r
734 else if(gAnalysisLevel == "MC"){
\r
735 Double_t gImpactParameter = 0.;
\r
736 if(dynamic_cast<AliMCEvent*>(event)){
\r
737 AliCollisionGeometry* headerH = dynamic_cast<AliCollisionGeometry*>(dynamic_cast<AliMCEvent*>(event)->GenEventHeader());
\r
739 gImpactParameter = headerH->ImpactParameter();
\r
740 gCentrality = gImpactParameter;
\r
750 if(gAnalysisLevel == "MC"){
\r
752 AliError("mcEvent not available");
\r
756 AliGenEventHeader *header = dynamic_cast<AliMCEvent*>(event)->GenEventHeader();
\r
758 TArrayF gVertexArray;
\r
759 header->PrimaryVertex(gVertexArray);
\r
760 //Printf("Vertex: %lf (x) - %lf (y) - %lf (z)",
\r
761 //gVertexArray.At(0),
\r
762 //gVertexArray.At(1),
\r
763 //gVertexArray.At(2));
\r
764 fHistEventStats->Fill(3,gCentrality); //events with a proper vertex
\r
765 if(TMath::Abs(gVertexArray.At(0)) < fVxMax) {
\r
766 if(TMath::Abs(gVertexArray.At(1)) < fVyMax) {
\r
767 if(TMath::Abs(gVertexArray.At(2)) < fVzMax) {
\r
768 fHistEventStats->Fill(4,gCentrality); //analayzed events
\r
769 fHistVx->Fill(gVertexArray.At(0));
\r
770 fHistVy->Fill(gVertexArray.At(1));
\r
771 fHistVz->Fill(gVertexArray.At(2),gCentrality);
\r
773 // take only events inside centrality class
\r
774 if((fImpactParameterMin < gCentrality) && (fImpactParameterMax > gCentrality)){
\r
775 fHistEventStats->Fill(5,gCentrality); //events with correct centrality
\r
776 return gCentrality;
\r
777 }//centrality class
\r
784 // Event Vertex AOD, ESD, ESDMC
\r
786 const AliVVertex *vertex = event->GetPrimaryVertex();
\r
789 Double32_t fCov[6];
\r
790 vertex->GetCovarianceMatrix(fCov);
\r
791 if(vertex->GetNContributors() > 0) {
\r
793 fHistEventStats->Fill(3,gCentrality); //events with a proper vertex
\r
794 if(TMath::Abs(vertex->GetX()) < fVxMax) {
\r
795 if(TMath::Abs(vertex->GetY()) < fVyMax) {
\r
796 if(TMath::Abs(vertex->GetZ()) < fVzMax) {
\r
797 fHistEventStats->Fill(4,gCentrality); //analyzed events
\r
798 fHistVx->Fill(vertex->GetX());
\r
799 fHistVy->Fill(vertex->GetY());
\r
800 fHistVz->Fill(vertex->GetZ(),gCentrality);
\r
802 // take only events inside centrality class
\r
803 if((gCentrality > fCentralityPercentileMin) && (gCentrality < fCentralityPercentileMax)){
\r
804 fHistEventStats->Fill(5,gCentrality); //events with correct centrality
\r
805 return gCentrality;
\r
806 }//centrality class
\r
810 }//proper vertex resolution
\r
811 }//proper number of contributors
\r
812 }//vertex object valid
\r
813 }//triggered event
\r
816 // in all other cases return -1 (event not accepted)
\r
821 //________________________________________________________________________
\r
822 Double_t AliAnalysisTaskBFPsi::GetRefMultiOrCentrality(AliVEvent *event){
\r
823 // Checks the Event cuts
\r
824 // Fills Event statistics histograms
\r
826 Float_t gCentrality = -1.;
\r
827 Double_t fMultiplicity = -100.;
\r
828 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
829 if(fEventClass == "Centrality"){
\r
832 if(gAnalysisLevel == "AOD") { //centrality in AOD header
\r
833 AliAODHeader *header = (AliAODHeader*) event->GetHeader();
\r
835 gCentrality = header->GetCentralityP()->GetCentralityPercentile(fCentralityEstimator.Data());
\r
839 else if(gAnalysisLevel == "ESD" || gAnalysisLevel == "MCESD"){ // centrality class for ESDs or MC-ESDs
\r
840 AliCentrality *centrality = event->GetCentrality();
\r
841 gCentrality = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
\r
843 else if(gAnalysisLevel == "MC"){
\r
844 Double_t gImpactParameter = 0.;
\r
845 if(dynamic_cast<AliMCEvent*>(event)){
\r
846 AliCollisionGeometry* headerH = dynamic_cast<AliCollisionGeometry*>(dynamic_cast<AliMCEvent*>(event)->GenEventHeader());
\r
848 gImpactParameter = headerH->ImpactParameter();
\r
849 gCentrality = gImpactParameter;
\r
856 }//End if "Centrality"
\r
857 if(fEventClass=="Multiplicity"&&gAnalysisLevel == "ESD"){
\r
858 if(dynamic_cast<AliESDEvent*>(event)){
\r
859 fMultiplicity = fESDtrackCuts->GetReferenceMultiplicity(dynamic_cast<AliESDEvent*>(event), AliESDtrackCuts::kTrackletsITSTPC,0.5);
\r
860 }//AliESDevent cast
\r
862 if(fEventClass=="Multiplicity"&&gAnalysisLevel != "ESD"){
\r
863 AliAODHeader *header = (AliAODHeader*) event->GetHeader();
\r
865 fMultiplicity = header->GetRefMultiplicity();
\r
868 Double_t lReturnVal = -100;
\r
869 if(fEventClass=="Multiplicity"){
\r
870 lReturnVal = fMultiplicity;
\r
871 }else if(fEventClass=="Centrality"){
\r
872 lReturnVal = gCentrality;
\r
877 //________________________________________________________________________
\r
878 Double_t AliAnalysisTaskBFPsi::GetEventPlane(AliVEvent *event){
\r
879 // Get the event plane
\r
881 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
883 Float_t gVZEROEventPlane = -10.;
\r
884 Float_t gReactionPlane = -10.;
\r
885 Double_t qxTot = 0.0, qyTot = 0.0;
\r
887 //MC: from reaction plane
\r
888 if(gAnalysisLevel == "MC"){
\r
890 AliError("mcEvent not available");
\r
894 if(dynamic_cast<AliMCEvent*>(event)){
\r
895 AliCollisionGeometry* headerH = dynamic_cast<AliCollisionGeometry*>(dynamic_cast<AliMCEvent*>(event)->GenEventHeader());
\r
897 gReactionPlane = headerH->ReactionPlaneAngle();
\r
898 //gReactionPlane *= TMath::RadToDeg();
\r
903 // AOD,ESD,ESDMC: from VZERO Event Plane
\r
906 AliEventplane *ep = event->GetEventplane();
\r
908 gVZEROEventPlane = ep->CalculateVZEROEventPlane(event,10,2,qxTot,qyTot);
\r
909 if(gVZEROEventPlane < 0.) gVZEROEventPlane += TMath::Pi();
\r
910 //gReactionPlane = gVZEROEventPlane*TMath::RadToDeg();
\r
911 gReactionPlane = gVZEROEventPlane;
\r
915 return gReactionPlane;
\r
918 //________________________________________________________________________
\r
919 Double_t AliAnalysisTaskBFPsi::GetTrackbyTrackCorrectionMatrix( Double_t vEta,
\r
923 Double_t gCentrality) {
\r
924 // -- Get efficiency correction of particle dependent on (eta, phi, pt, charge, centrality)
\r
926 Double_t correction = 1.;
\r
927 Int_t binEta = 0, binPt = 0, binPhi = 0;
\r
929 //Printf("EtaMAx: %lf - EtaMin: %lf - EtaBin: %lf", fEtaMaxForCorrections,fEtaMinForCorrections,fEtaBinForCorrections);
\r
930 if(fEtaBinForCorrections != 0) {
\r
931 Double_t widthEta = (fEtaMaxForCorrections - fEtaMinForCorrections)/fEtaBinForCorrections;
\r
932 if(fEtaMaxForCorrections != fEtaMinForCorrections)
\r
933 binEta = (Int_t)(vEta/widthEta)+1;
\r
936 if(fPtBinForCorrections != 0) {
\r
937 Double_t widthPt = (fPtMaxForCorrections - fPtMinForCorrections)/fPtBinForCorrections;
\r
938 if(fPtMaxForCorrections != fPtMinForCorrections)
\r
939 binPt = (Int_t)(vPt/widthPt) + 1;
\r
942 if(fPhiBinForCorrections != 0) {
\r
943 Double_t widthPhi = (fPhiMaxForCorrections - fPhiMinForCorrections)/fPhiBinForCorrections;
\r
944 if(fPhiMaxForCorrections != fPhiMinForCorrections)
\r
945 binPhi = (Int_t)(vPhi/widthPhi)+ 1;
\r
948 Int_t gCentralityInt = 1;
\r
949 for (Int_t i=0; i<kCENTRALITY; i++){
\r
950 if((centralityArrayForPbPb[i] <= gCentrality)&&(gCentrality <= centralityArrayForPbPb[i+1]))
\r
951 gCentralityInt = i;
\r
954 if(fHistMatrixCorrectionPlus[gCentralityInt]){
\r
956 correction = fHistMatrixCorrectionPlus[gCentralityInt]->GetBinContent(fHistMatrixCorrectionPlus[gCentralityInt]->GetBin(binEta, binPt, binPhi));
\r
959 correction = fHistMatrixCorrectionMinus[gCentralityInt]->GetBinContent(fHistMatrixCorrectionMinus[gCentralityInt]->GetBin(binEta, binPt, binPhi));
\r
965 if (correction == 0.) {
\r
966 AliError(Form("Should not happen : bin content = 0. >> eta: %.2f | phi : %.2f | pt : %.2f | cent %d",vEta, vPhi, vPt, gCentralityInt));
\r
973 //________________________________________________________________________
\r
974 TObjArray* AliAnalysisTaskBFPsi::GetAcceptedTracks(AliVEvent *event, Double_t gCentrality, Double_t gReactionPlane){
\r
975 // Returns TObjArray with tracks after all track cuts (only for AOD!)
\r
976 // Fills QA histograms
\r
978 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
980 //output TObjArray holding all good tracks
\r
981 TObjArray* tracksAccepted = new TObjArray;
\r
982 tracksAccepted->SetOwner(kTRUE);
\r
991 if(gAnalysisLevel == "AOD") { // handling of TPC only tracks different in AOD and ESD
\r
992 // Loop over tracks in event
\r
993 for (Int_t iTracks = 0; iTracks < event->GetNumberOfTracks(); iTracks++) {
\r
994 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack *>(event->GetTrack(iTracks));
\r
996 AliError(Form("Could not receive track %d", iTracks));
\r
1002 // For ESD Filter Information: ANALYSIS/macros/AddTaskESDfilter.C
\r
1003 // take only TPC only tracks
\r
1004 //fHistTrackStats->Fill(aodTrack->GetFilterMap());
\r
1005 for(Int_t iTrackBit = 0; iTrackBit < 16; iTrackBit++){
\r
1006 fHistTrackStats->Fill(iTrackBit,aodTrack->TestFilterBit(1<<iTrackBit));
\r
1008 if(!aodTrack->TestFilterBit(nAODtrackCutBit)) continue;
\r
1010 vCharge = aodTrack->Charge();
\r
1011 vEta = aodTrack->Eta();
\r
1012 vY = aodTrack->Y();
\r
1013 vPhi = aodTrack->Phi();// * TMath::RadToDeg();
\r
1014 vPt = aodTrack->Pt();
\r
1016 Float_t dcaXY = aodTrack->DCA(); // this is the DCA from global track (not exactly what is cut on)
\r
1017 Float_t dcaZ = aodTrack->ZAtDCA(); // this is the DCA from global track (not exactly what is cut on)
\r
1020 // Kinematics cuts from ESD track cuts
\r
1021 if( vPt < fPtMin || vPt > fPtMax) continue;
\r
1022 if( vEta < fEtaMin || vEta > fEtaMax) continue;
\r
1024 // Extra DCA cuts (for systematic studies [!= -1])
\r
1025 if( fDCAxyCut != -1 && fDCAzCut != -1){
\r
1026 if(TMath::Sqrt((dcaXY*dcaXY)/(fDCAxyCut*fDCAxyCut)+(dcaZ*dcaZ)/(fDCAzCut*fDCAzCut)) > 1 ){
\r
1027 continue; // 2D cut
\r
1031 // Extra TPC cuts (for systematic studies [!= -1])
\r
1032 if( fTPCchi2Cut != -1 && aodTrack->Chi2perNDF() > fTPCchi2Cut){
\r
1035 if( fNClustersTPCCut != -1 && aodTrack->GetTPCNcls() < fNClustersTPCCut){
\r
1039 // fill QA histograms
\r
1040 fHistClus->Fill(aodTrack->GetITSNcls(),aodTrack->GetTPCNcls());
\r
1041 fHistDCA->Fill(dcaZ,dcaXY);
\r
1042 fHistChi2->Fill(aodTrack->Chi2perNDF(),gCentrality);
\r
1043 fHistPt->Fill(vPt,gCentrality);
\r
1044 fHistEta->Fill(vEta,gCentrality);
\r
1045 fHistRapidity->Fill(vY,gCentrality);
\r
1046 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
\r
1047 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
\r
1048 fHistPhi->Fill(vPhi,gCentrality);
\r
1050 //=======================================correction
\r
1051 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
\r
1053 // add the track to the TObjArray
\r
1054 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
\r
1059 else if(gAnalysisLevel == "ESD" || gAnalysisLevel == "MCESD") { // handling of TPC only tracks different in AOD and ESD
\r
1061 AliESDtrack *trackTPC = NULL;
\r
1062 AliMCParticle *mcTrack = NULL;
\r
1064 AliMCEvent* mcEvent = NULL;
\r
1066 // for MC ESDs use also MC information
\r
1067 if(gAnalysisLevel == "MCESD"){
\r
1068 mcEvent = MCEvent();
\r
1070 AliError("mcEvent not available");
\r
1071 return tracksAccepted;
\r
1075 // Loop over tracks in event
\r
1076 for (Int_t iTracks = 0; iTracks < event->GetNumberOfTracks(); iTracks++) {
\r
1077 AliESDtrack* track = dynamic_cast<AliESDtrack *>(event->GetTrack(iTracks));
\r
1079 AliError(Form("Could not receive track %d", iTracks));
\r
1083 // for MC ESDs use also MC information --> MC track not used further???
\r
1084 if(gAnalysisLevel == "MCESD"){
\r
1085 Int_t label = TMath::Abs(track->GetLabel());
\r
1086 if(label > mcEvent->GetNumberOfTracks()) continue;
\r
1087 if(label > mcEvent->GetNumberOfPrimaries()) continue;
\r
1089 mcTrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(label));
\r
1090 if(!mcTrack) continue;
\r
1093 // take only TPC only tracks
\r
1094 trackTPC = new AliESDtrack();
\r
1095 if(!track->FillTPCOnlyTrack(*trackTPC)) continue;
\r
1098 if(fESDtrackCuts)
\r
1099 if(!fESDtrackCuts->AcceptTrack(trackTPC)) continue;
\r
1101 // fill QA histograms
\r
1104 trackTPC->GetImpactParameters(b,bCov);
\r
1105 if (bCov[0]<=0 || bCov[2]<=0) {
\r
1106 AliDebug(1, "Estimated b resolution lower or equal zero!");
\r
1107 bCov[0]=0; bCov[2]=0;
\r
1110 Int_t nClustersTPC = -1;
\r
1111 nClustersTPC = trackTPC->GetTPCNclsIter1(); // TPC standalone
\r
1112 //nClustersTPC = track->GetTPCclusters(0); // global track
\r
1113 Float_t chi2PerClusterTPC = -1;
\r
1114 if (nClustersTPC!=0) {
\r
1115 chi2PerClusterTPC = trackTPC->GetTPCchi2Iter1()/Float_t(nClustersTPC); // TPC standalone
\r
1116 //chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC); // global track
\r
1119 //===========================PID===============================//
\r
1121 Double_t prob[AliPID::kSPECIES]={0.};
\r
1122 Double_t probTPC[AliPID::kSPECIES]={0.};
\r
1123 Double_t probTOF[AliPID::kSPECIES]={0.};
\r
1124 Double_t probTPCTOF[AliPID::kSPECIES]={0.};
\r
1126 Double_t nSigma = 0.;
\r
1127 UInt_t detUsedTPC = 0;
\r
1128 UInt_t detUsedTOF = 0;
\r
1129 UInt_t detUsedTPCTOF = 0;
\r
1131 //Decide what detector configuration we want to use
\r
1132 switch(fPidDetectorConfig) {
\r
1134 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
\r
1135 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)fParticleOfInterest));
\r
1136 detUsedTPC = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPC);
\r
1137 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
\r
1138 prob[iSpecies] = probTPC[iSpecies];
\r
1141 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF);
\r
1142 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)fParticleOfInterest));
\r
1143 detUsedTOF = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTOF);
\r
1144 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
\r
1145 prob[iSpecies] = probTOF[iSpecies];
\r
1148 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC);
\r
1149 detUsedTPCTOF = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPCTOF);
\r
1150 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
\r
1151 prob[iSpecies] = probTPCTOF[iSpecies];
\r
1155 }//end switch: define detector mask
\r
1157 //Filling the PID QA
\r
1158 Double_t tofTime = -999., length = 999., tof = -999.;
\r
1159 Double_t c = TMath::C()*1.E-9;// m/ns
\r
1160 Double_t beta = -999.;
\r
1161 Double_t nSigmaTOFForParticleOfInterest = -999.;
\r
1162 if ( (track->IsOn(AliESDtrack::kTOFin)) &&
\r
1163 (track->IsOn(AliESDtrack::kTIME)) ) {
\r
1164 tofTime = track->GetTOFsignal();//in ps
\r
1165 length = track->GetIntegratedLength();
\r
1166 tof = tofTime*1E-3; // ns
\r
1169 //Printf("WARNING: track with negative TOF time found! Skipping this track for PID checks\n");
\r
1173 //printf("WARNING: track with negative length found!Skipping this track for PID checks\n");
\r
1177 length = length*0.01; // in meters
\r
1179 beta = length/tof;
\r
1181 nSigmaTOFForParticleOfInterest = fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)fParticleOfInterest);
\r
1182 fHistBetavsPTOFbeforePID ->Fill(track->P()*track->Charge(),beta);
\r
1183 fHistProbTOFvsPtbeforePID ->Fill(track->Pt(),probTOF[fParticleOfInterest]);
\r
1184 fHistNSigmaTOFvsPtbeforePID ->Fill(track->Pt(),nSigmaTOFForParticleOfInterest);
\r
1188 Double_t nSigmaTPCForParticleOfInterest = fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)fParticleOfInterest);
\r
1189 fHistdEdxVsPTPCbeforePID -> Fill(track->P()*track->Charge(),track->GetTPCsignal());
\r
1190 fHistProbTPCvsPtbeforePID -> Fill(track->Pt(),probTPC[fParticleOfInterest]);
\r
1191 fHistNSigmaTPCvsPtbeforePID -> Fill(track->Pt(),nSigmaTPCForParticleOfInterest);
\r
1192 fHistProbTPCTOFvsPtbeforePID -> Fill(track->Pt(),probTPCTOF[fParticleOfInterest]);
\r
1193 //end of QA-before pid
\r
1195 if ((detUsedTPC != 0)||(detUsedTOF != 0)||(detUsedTPCTOF != 0)) {
\r
1196 //Make the decision based on the n-sigma
\r
1197 if(fUsePIDnSigma) {
\r
1198 if(nSigma > fPIDNSigma) continue;}
\r
1200 //Make the decision based on the bayesian
\r
1201 else if(fUsePIDPropabilities) {
\r
1202 if(fParticleOfInterest != TMath::LocMax(AliPID::kSPECIES,prob)) continue;
\r
1203 if (prob[fParticleOfInterest] < fMinAcceptedPIDProbability) continue;
\r
1206 //Fill QA after the PID
\r
1207 fHistBetavsPTOFafterPID ->Fill(track->P()*track->Charge(),beta);
\r
1208 fHistProbTOFvsPtafterPID ->Fill(track->Pt(),probTOF[fParticleOfInterest]);
\r
1209 fHistNSigmaTOFvsPtafterPID ->Fill(track->Pt(),nSigmaTOFForParticleOfInterest);
\r
1211 fHistdEdxVsPTPCafterPID -> Fill(track->P()*track->Charge(),track->GetTPCsignal());
\r
1212 fHistProbTPCvsPtafterPID -> Fill(track->Pt(),probTPC[fParticleOfInterest]);
\r
1213 fHistProbTPCTOFvsPtafterPID -> Fill(track->Pt(),probTPCTOF[fParticleOfInterest]);
\r
1214 fHistNSigmaTPCvsPtafterPID -> Fill(track->Pt(),nSigmaTPCForParticleOfInterest);
\r
1217 //===========================PID===============================//
\r
1218 vCharge = trackTPC->Charge();
\r
1219 vY = trackTPC->Y();
\r
1220 vEta = trackTPC->Eta();
\r
1221 vPhi = trackTPC->Phi();// * TMath::RadToDeg();
\r
1222 vPt = trackTPC->Pt();
\r
1223 fHistClus->Fill(trackTPC->GetITSclusters(0),nClustersTPC);
\r
1224 fHistDCA->Fill(b[1],b[0]);
\r
1225 fHistChi2->Fill(chi2PerClusterTPC,gCentrality);
\r
1226 fHistPt->Fill(vPt,gCentrality);
\r
1227 fHistEta->Fill(vEta,gCentrality);
\r
1228 fHistPhi->Fill(vPhi,gCentrality);
\r
1229 fHistRapidity->Fill(vY,gCentrality);
\r
1230 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
\r
1231 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
\r
1233 //=======================================correction
\r
1234 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
\r
1236 // add the track to the TObjArray
\r
1237 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
\r
1243 else if(gAnalysisLevel == "MC"){
\r
1245 AliError("mcEvent not available");
\r
1249 // Loop over tracks in event
\r
1250 for (Int_t iTracks = 0; iTracks < dynamic_cast<AliMCEvent*>(event)->GetNumberOfPrimaries(); iTracks++) {
\r
1251 AliMCParticle* track = dynamic_cast<AliMCParticle *>(event->GetTrack(iTracks));
\r
1253 AliError(Form("Could not receive particle %d", iTracks));
\r
1257 //exclude non stable particles
\r
1258 if(!(dynamic_cast<AliMCEvent*>(event)->IsPhysicalPrimary(iTracks))) continue;
\r
1260 vEta = track->Eta();
\r
1261 vPt = track->Pt();
\r
1264 if( vPt < fPtMin || vPt > fPtMax)
\r
1267 if( vEta < fEtaMin || vEta > fEtaMax) continue;
\r
1269 else if (fUsePID){
\r
1270 if( vY < fEtaMin || vY > fEtaMax) continue;
\r
1273 //analyze one set of particles
\r
1274 if(fUseMCPdgCode) {
\r
1275 TParticle *particle = track->Particle();
\r
1276 if(!particle) continue;
\r
1278 Int_t gPdgCode = particle->GetPdgCode();
\r
1279 if(TMath::Abs(fPDGCodeToBeAnalyzed) != TMath::Abs(gPdgCode))
\r
1283 //Use the acceptance parameterization
\r
1284 if(fAcceptanceParameterization) {
\r
1285 Double_t gRandomNumber = gRandom->Rndm();
\r
1286 if(gRandomNumber > fAcceptanceParameterization->Eval(track->Pt()))
\r
1290 //Exclude resonances
\r
1291 if(fExcludeResonancesInMC) {
\r
1292 TParticle *particle = track->Particle();
\r
1293 if(!particle) continue;
\r
1295 Bool_t kExcludeParticle = kFALSE;
\r
1296 Int_t gMotherIndex = particle->GetFirstMother();
\r
1297 if(gMotherIndex != -1) {
\r
1298 AliMCParticle* motherTrack = dynamic_cast<AliMCParticle *>(event->GetTrack(gMotherIndex));
\r
1300 TParticle *motherParticle = motherTrack->Particle();
\r
1301 if(motherParticle) {
\r
1302 Int_t pdgCodeOfMother = motherParticle->GetPdgCode();
\r
1303 //if((pdgCodeOfMother == 113)||(pdgCodeOfMother == 213)||(pdgCodeOfMother == 221)||(pdgCodeOfMother == 223)||(pdgCodeOfMother == 331)||(pdgCodeOfMother == 333)) {
\r
1304 if(pdgCodeOfMother == 113) {
\r
1305 kExcludeParticle = kTRUE;
\r
1311 //Exclude from the analysis decay products of rho0, rho+, eta, eta' and phi
\r
1312 if(kExcludeParticle) continue;
\r
1315 vCharge = track->Charge();
\r
1316 vPhi = track->Phi();
\r
1317 //Printf("phi (before): %lf",vPhi);
\r
1319 fHistPt->Fill(vPt,gCentrality);
\r
1320 fHistEta->Fill(vEta,gCentrality);
\r
1321 fHistPhi->Fill(vPhi,gCentrality);
\r
1322 //fHistPhi->Fill(vPhi*TMath::RadToDeg(),gCentrality);
\r
1323 fHistRapidity->Fill(vY,gCentrality);
\r
1324 //if(vCharge > 0) fHistPhiPos->Fill(vPhi*TMath::RadToDeg(),gCentrality);
\r
1325 //else if(vCharge < 0) fHistPhiNeg->Fill(vPhi*TMath::RadToDeg(),gCentrality);
\r
1326 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
\r
1327 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
\r
1329 //Flow after burner
\r
1330 if(fUseFlowAfterBurner) {
\r
1331 Double_t precisionPhi = 0.001;
\r
1332 Int_t maxNumberOfIterations = 100;
\r
1334 Double_t phi0 = vPhi;
\r
1335 Double_t gV2 = fDifferentialV2->Eval(vPt);
\r
1337 for (Int_t j = 0; j < maxNumberOfIterations; j++) {
\r
1338 Double_t phiprev = vPhi;
\r
1339 Double_t fl = vPhi - phi0 + gV2*TMath::Sin(2.*(vPhi - gReactionPlane*TMath::DegToRad()));
\r
1340 Double_t fp = 1.0 + 2.0*gV2*TMath::Cos(2.*(vPhi - gReactionPlane*TMath::DegToRad()));
\r
1342 if (TMath::AreEqualAbs(phiprev,vPhi,precisionPhi)) break;
\r
1344 //Printf("phi (after): %lf\n",vPhi);
\r
1345 Double_t vDeltaphiBefore = phi0 - gReactionPlane*TMath::DegToRad();
\r
1346 if(vDeltaphiBefore < 0) vDeltaphiBefore += 2*TMath::Pi();
\r
1347 fHistPhiBefore->Fill(vDeltaphiBefore,gCentrality);
\r
1349 Double_t vDeltaphiAfter = vPhi - gReactionPlane*TMath::DegToRad();
\r
1350 if(vDeltaphiAfter < 0) vDeltaphiAfter += 2*TMath::Pi();
\r
1351 fHistPhiAfter->Fill(vDeltaphiAfter,gCentrality);
\r
1355 //vPhi *= TMath::RadToDeg();
\r
1357 //=======================================correction
\r
1358 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
\r
1360 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
\r
1365 return tracksAccepted;
\r
1367 //________________________________________________________________________
\r
1368 TObjArray* AliAnalysisTaskBFPsi::GetShuffledTracks(TObjArray *tracks, Double_t gCentrality){
\r
1369 // Clones TObjArray and returns it with tracks after shuffling the charges
\r
1371 TObjArray* tracksShuffled = new TObjArray;
\r
1372 tracksShuffled->SetOwner(kTRUE);
\r
1374 vector<Short_t> *chargeVector = new vector<Short_t>; //original charge of accepted tracks
\r
1376 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
\r
1378 AliVParticle* track = (AliVParticle*) tracks->At(i);
\r
1379 chargeVector->push_back(track->Charge());
\r
1382 random_shuffle(chargeVector->begin(), chargeVector->end());
\r
1384 for(Int_t i = 0; i < tracks->GetEntriesFast(); i++){
\r
1385 AliVParticle* track = (AliVParticle*) tracks->At(i);
\r
1386 //==============================correction
\r
1387 Double_t correction = GetTrackbyTrackCorrectionMatrix(track->Eta(), track->Phi(),track->Pt(), chargeVector->at(i), gCentrality);
\r
1388 tracksShuffled->Add(new AliBFBasicParticle(track->Eta(), track->Phi(), track->Pt(),chargeVector->at(i), correction));
\r
1391 delete chargeVector;
\r
1393 return tracksShuffled;
\r
1397 //________________________________________________________________________
\r
1398 void AliAnalysisTaskBFPsi::FinishTaskOutput(){
\r
1399 //Printf("END BF");
\r
1402 AliError("fBalance not available");
\r
1405 if(fRunShuffling) {
\r
1406 if (!fShuffledBalance) {
\r
1407 AliError("fShuffledBalance not available");
\r
1414 //________________________________________________________________________
\r
1415 void AliAnalysisTaskBFPsi::Terminate(Option_t *) {
\r
1416 // Draw result to the screen
\r
1417 // Called once at the end of the query
\r
1419 // not implemented ...
\r