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
751 AliGenEventHeader *header = dynamic_cast<AliMCEvent*>(event)->GenEventHeader();
\r
753 TArrayF gVertexArray;
\r
754 header->PrimaryVertex(gVertexArray);
\r
755 //Printf("Vertex: %lf (x) - %lf (y) - %lf (z)",
\r
756 //gVertexArray.At(0),
\r
757 //gVertexArray.At(1),
\r
758 //gVertexArray.At(2));
\r
759 fHistEventStats->Fill(3,gCentrality); //events with a proper vertex
\r
760 if(TMath::Abs(gVertexArray.At(0)) < fVxMax) {
\r
761 if(TMath::Abs(gVertexArray.At(1)) < fVyMax) {
\r
762 if(TMath::Abs(gVertexArray.At(2)) < fVzMax) {
\r
763 fHistEventStats->Fill(4,gCentrality); //analayzed events
\r
764 fHistVx->Fill(gVertexArray.At(0));
\r
765 fHistVy->Fill(gVertexArray.At(1));
\r
766 fHistVz->Fill(gVertexArray.At(2),gCentrality);
\r
768 // take only events inside centrality class
\r
769 if((fImpactParameterMin < gCentrality) && (fImpactParameterMax > gCentrality)){
\r
770 fHistEventStats->Fill(5,gCentrality); //events with correct centrality
\r
771 return gCentrality;
\r
772 }//centrality class
\r
779 // Event Vertex AOD, ESD, ESDMC
\r
781 const AliVVertex *vertex = event->GetPrimaryVertex();
\r
784 Double32_t fCov[6];
\r
785 vertex->GetCovarianceMatrix(fCov);
\r
786 if(vertex->GetNContributors() > 0) {
\r
788 fHistEventStats->Fill(3,gCentrality); //events with a proper vertex
\r
789 if(TMath::Abs(vertex->GetX()) < fVxMax) {
\r
790 if(TMath::Abs(vertex->GetY()) < fVyMax) {
\r
791 if(TMath::Abs(vertex->GetZ()) < fVzMax) {
\r
792 fHistEventStats->Fill(4,gCentrality); //analyzed events
\r
793 fHistVx->Fill(vertex->GetX());
\r
794 fHistVy->Fill(vertex->GetY());
\r
795 fHistVz->Fill(vertex->GetZ(),gCentrality);
\r
797 // take only events inside centrality class
\r
798 if((gCentrality > fCentralityPercentileMin) && (gCentrality < fCentralityPercentileMax)){
\r
799 fHistEventStats->Fill(5,gCentrality); //events with correct centrality
\r
800 return gCentrality;
\r
801 }//centrality class
\r
805 }//proper vertex resolution
\r
806 }//proper number of contributors
\r
807 }//vertex object valid
\r
808 }//triggered event
\r
811 // in all other cases return -1 (event not accepted)
\r
816 //________________________________________________________________________
\r
817 Double_t AliAnalysisTaskBFPsi::GetRefMultiOrCentrality(AliVEvent *event){
\r
818 // Checks the Event cuts
\r
819 // Fills Event statistics histograms
\r
821 Float_t gCentrality = -1.;
\r
822 Double_t fMultiplicity = -100.;
\r
823 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
824 if(fEventClass == "Centrality"){
\r
827 if(gAnalysisLevel == "AOD") { //centrality in AOD header
\r
828 AliAODHeader *header = (AliAODHeader*) event->GetHeader();
\r
830 gCentrality = header->GetCentralityP()->GetCentralityPercentile(fCentralityEstimator.Data());
\r
834 else if(gAnalysisLevel == "ESD" || gAnalysisLevel == "MCESD"){ // centrality class for ESDs or MC-ESDs
\r
835 AliCentrality *centrality = event->GetCentrality();
\r
836 gCentrality = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
\r
838 else if(gAnalysisLevel == "MC"){
\r
839 Double_t gImpactParameter = 0.;
\r
840 if(dynamic_cast<AliMCEvent*>(event)){
\r
841 AliCollisionGeometry* headerH = dynamic_cast<AliCollisionGeometry*>(dynamic_cast<AliMCEvent*>(event)->GenEventHeader());
\r
843 gImpactParameter = headerH->ImpactParameter();
\r
844 gCentrality = gImpactParameter;
\r
851 }//End if "Centrality"
\r
852 if(fEventClass=="Multiplicity"&&gAnalysisLevel == "ESD"){
\r
853 if(dynamic_cast<AliESDEvent*>(event)){
\r
854 fMultiplicity = fESDtrackCuts->GetReferenceMultiplicity(dynamic_cast<AliESDEvent*>(event), AliESDtrackCuts::kTrackletsITSTPC,0.5);
\r
855 }//AliESDevent cast
\r
857 if(fEventClass=="Multiplicity"&&gAnalysisLevel != "ESD"){
\r
858 AliAODHeader *header = (AliAODHeader*) event->GetHeader();
\r
860 fMultiplicity = header->GetRefMultiplicity();
\r
863 Double_t lReturnVal = -100;
\r
864 if(fEventClass=="Multiplicity"){
\r
865 lReturnVal = fMultiplicity;
\r
866 }else if(fEventClass=="Centrality"){
\r
867 lReturnVal = gCentrality;
\r
872 //________________________________________________________________________
\r
873 Double_t AliAnalysisTaskBFPsi::GetEventPlane(AliVEvent *event){
\r
874 // Get the event plane
\r
876 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
878 Float_t gVZEROEventPlane = -10.;
\r
879 Float_t gReactionPlane = -10.;
\r
880 Double_t qxTot = 0.0, qyTot = 0.0;
\r
882 //MC: from reaction plane
\r
883 if(gAnalysisLevel == "MC"){
\r
884 if(dynamic_cast<AliMCEvent*>(event)){
\r
885 AliCollisionGeometry* headerH = dynamic_cast<AliCollisionGeometry*>(dynamic_cast<AliMCEvent*>(event)->GenEventHeader());
\r
887 gReactionPlane = headerH->ReactionPlaneAngle();
\r
888 //gReactionPlane *= TMath::RadToDeg();
\r
893 // AOD,ESD,ESDMC: from VZERO Event Plane
\r
896 AliEventplane *ep = event->GetEventplane();
\r
898 gVZEROEventPlane = ep->CalculateVZEROEventPlane(event,10,2,qxTot,qyTot);
\r
899 if(gVZEROEventPlane < 0.) gVZEROEventPlane += TMath::Pi();
\r
900 //gReactionPlane = gVZEROEventPlane*TMath::RadToDeg();
\r
901 gReactionPlane = gVZEROEventPlane;
\r
905 return gReactionPlane;
\r
908 //________________________________________________________________________
\r
909 Double_t AliAnalysisTaskBFPsi::GetTrackbyTrackCorrectionMatrix( Double_t vEta,
\r
913 Double_t gCentrality) {
\r
914 // -- Get efficiency correction of particle dependent on (eta, phi, pt, charge, centrality)
\r
916 Double_t correction = 1.;
\r
917 Int_t binEta = 0, binPt = 0, binPhi = 0;
\r
919 //Printf("EtaMAx: %lf - EtaMin: %lf - EtaBin: %lf", fEtaMaxForCorrections,fEtaMinForCorrections,fEtaBinForCorrections);
\r
920 if(fEtaBinForCorrections != 0) {
\r
921 Double_t widthEta = (fEtaMaxForCorrections - fEtaMinForCorrections)/fEtaBinForCorrections;
\r
922 if(fEtaMaxForCorrections != fEtaMinForCorrections)
\r
923 binEta = (Int_t)(vEta/widthEta)+1;
\r
926 if(fPtBinForCorrections != 0) {
\r
927 Double_t widthPt = (fPtMaxForCorrections - fPtMinForCorrections)/fPtBinForCorrections;
\r
928 if(fPtMaxForCorrections != fPtMinForCorrections)
\r
929 binPt = (Int_t)(vPt/widthPt) + 1;
\r
932 if(fPhiBinForCorrections != 0) {
\r
933 Double_t widthPhi = (fPhiMaxForCorrections - fPhiMinForCorrections)/fPhiBinForCorrections;
\r
934 if(fPhiMaxForCorrections != fPhiMinForCorrections)
\r
935 binPhi = (Int_t)(vPhi/widthPhi)+ 1;
\r
938 Int_t gCentralityInt = 1;
\r
939 for (Int_t i=0; i<=kCENTRALITY; i++){
\r
940 if((centralityArrayForPbPb[i] <= gCentrality)&&(gCentrality <= centralityArrayForPbPb[i+1]))
\r
941 gCentralityInt = i;
\r
944 if(fHistMatrixCorrectionPlus[gCentralityInt]){
\r
946 correction = fHistMatrixCorrectionPlus[gCentralityInt]->GetBinContent(fHistMatrixCorrectionPlus[gCentralityInt]->GetBin(binEta, binPt, binPhi));
\r
949 correction = fHistMatrixCorrectionMinus[gCentralityInt]->GetBinContent(fHistMatrixCorrectionMinus[gCentralityInt]->GetBin(binEta, binPt, binPhi));
\r
955 if (correction == 0.) {
\r
956 AliError(Form("Should not happen : bin content = 0. >> eta: %.2f | phi : %.2f | pt : %.2f | cent %d",vEta, vPhi, vPt, gCentralityInt));
\r
963 //________________________________________________________________________
\r
964 TObjArray* AliAnalysisTaskBFPsi::GetAcceptedTracks(AliVEvent *event, Double_t gCentrality, Double_t gReactionPlane){
\r
965 // Returns TObjArray with tracks after all track cuts (only for AOD!)
\r
966 // Fills QA histograms
\r
968 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
970 //output TObjArray holding all good tracks
\r
971 TObjArray* tracksAccepted = new TObjArray;
\r
972 tracksAccepted->SetOwner(kTRUE);
\r
981 if(gAnalysisLevel == "AOD") { // handling of TPC only tracks different in AOD and ESD
\r
982 // Loop over tracks in event
\r
983 for (Int_t iTracks = 0; iTracks < event->GetNumberOfTracks(); iTracks++) {
\r
984 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack *>(event->GetTrack(iTracks));
\r
986 AliError(Form("Could not receive track %d", iTracks));
\r
992 // For ESD Filter Information: ANALYSIS/macros/AddTaskESDfilter.C
\r
993 // take only TPC only tracks
\r
994 //fHistTrackStats->Fill(aodTrack->GetFilterMap());
\r
995 for(Int_t iTrackBit = 0; iTrackBit < 16; iTrackBit++){
\r
996 fHistTrackStats->Fill(iTrackBit,aodTrack->TestFilterBit(1<<iTrackBit));
\r
998 if(!aodTrack->TestFilterBit(nAODtrackCutBit)) continue;
\r
1000 vCharge = aodTrack->Charge();
\r
1001 vEta = aodTrack->Eta();
\r
1002 vY = aodTrack->Y();
\r
1003 vPhi = aodTrack->Phi();// * TMath::RadToDeg();
\r
1004 vPt = aodTrack->Pt();
\r
1006 Float_t dcaXY = aodTrack->DCA(); // this is the DCA from global track (not exactly what is cut on)
\r
1007 Float_t dcaZ = aodTrack->ZAtDCA(); // this is the DCA from global track (not exactly what is cut on)
\r
1010 // Kinematics cuts from ESD track cuts
\r
1011 if( vPt < fPtMin || vPt > fPtMax) continue;
\r
1012 if( vEta < fEtaMin || vEta > fEtaMax) continue;
\r
1014 // Extra DCA cuts (for systematic studies [!= -1])
\r
1015 if( fDCAxyCut != -1 && fDCAzCut != -1){
\r
1016 if(TMath::Sqrt((dcaXY*dcaXY)/(fDCAxyCut*fDCAxyCut)+(dcaZ*dcaZ)/(fDCAzCut*fDCAzCut)) > 1 ){
\r
1017 continue; // 2D cut
\r
1021 // Extra TPC cuts (for systematic studies [!= -1])
\r
1022 if( fTPCchi2Cut != -1 && aodTrack->Chi2perNDF() > fTPCchi2Cut){
\r
1025 if( fNClustersTPCCut != -1 && aodTrack->GetTPCNcls() < fNClustersTPCCut){
\r
1029 // fill QA histograms
\r
1030 fHistClus->Fill(aodTrack->GetITSNcls(),aodTrack->GetTPCNcls());
\r
1031 fHistDCA->Fill(dcaZ,dcaXY);
\r
1032 fHistChi2->Fill(aodTrack->Chi2perNDF(),gCentrality);
\r
1033 fHistPt->Fill(vPt,gCentrality);
\r
1034 fHistEta->Fill(vEta,gCentrality);
\r
1035 fHistRapidity->Fill(vY,gCentrality);
\r
1036 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
\r
1037 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
\r
1038 fHistPhi->Fill(vPhi,gCentrality);
\r
1040 //=======================================correction
\r
1041 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
\r
1043 // add the track to the TObjArray
\r
1044 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
\r
1049 else if(gAnalysisLevel == "ESD" || gAnalysisLevel == "MCESD") { // handling of TPC only tracks different in AOD and ESD
\r
1051 AliESDtrack *trackTPC = NULL;
\r
1052 AliMCParticle *mcTrack = NULL;
\r
1054 AliMCEvent* mcEvent = NULL;
\r
1056 // for MC ESDs use also MC information
\r
1057 if(gAnalysisLevel == "MCESD"){
\r
1058 mcEvent = MCEvent();
\r
1060 AliError("mcEvent not available");
\r
1061 return tracksAccepted;
\r
1065 // Loop over tracks in event
\r
1066 for (Int_t iTracks = 0; iTracks < event->GetNumberOfTracks(); iTracks++) {
\r
1067 AliESDtrack* track = dynamic_cast<AliESDtrack *>(event->GetTrack(iTracks));
\r
1069 AliError(Form("Could not receive track %d", iTracks));
\r
1073 // for MC ESDs use also MC information --> MC track not used further???
\r
1074 if(gAnalysisLevel == "MCESD"){
\r
1075 Int_t label = TMath::Abs(track->GetLabel());
\r
1076 if(label > mcEvent->GetNumberOfTracks()) continue;
\r
1077 if(label > mcEvent->GetNumberOfPrimaries()) continue;
\r
1079 mcTrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(label));
\r
1080 if(!mcTrack) continue;
\r
1083 // take only TPC only tracks
\r
1084 trackTPC = new AliESDtrack();
\r
1085 if(!track->FillTPCOnlyTrack(*trackTPC)) continue;
\r
1088 if(fESDtrackCuts)
\r
1089 if(!fESDtrackCuts->AcceptTrack(trackTPC)) continue;
\r
1091 // fill QA histograms
\r
1094 trackTPC->GetImpactParameters(b,bCov);
\r
1095 if (bCov[0]<=0 || bCov[2]<=0) {
\r
1096 AliDebug(1, "Estimated b resolution lower or equal zero!");
\r
1097 bCov[0]=0; bCov[2]=0;
\r
1100 Int_t nClustersTPC = -1;
\r
1101 nClustersTPC = trackTPC->GetTPCNclsIter1(); // TPC standalone
\r
1102 //nClustersTPC = track->GetTPCclusters(0); // global track
\r
1103 Float_t chi2PerClusterTPC = -1;
\r
1104 if (nClustersTPC!=0) {
\r
1105 chi2PerClusterTPC = trackTPC->GetTPCchi2Iter1()/Float_t(nClustersTPC); // TPC standalone
\r
1106 //chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC); // global track
\r
1109 //===========================PID===============================//
\r
1111 Double_t prob[AliPID::kSPECIES]={0.};
\r
1112 Double_t probTPC[AliPID::kSPECIES]={0.};
\r
1113 Double_t probTOF[AliPID::kSPECIES]={0.};
\r
1114 Double_t probTPCTOF[AliPID::kSPECIES]={0.};
\r
1116 Double_t nSigma = 0.;
\r
1117 UInt_t detUsedTPC = 0;
\r
1118 UInt_t detUsedTOF = 0;
\r
1119 UInt_t detUsedTPCTOF = 0;
\r
1121 //Decide what detector configuration we want to use
\r
1122 switch(fPidDetectorConfig) {
\r
1124 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
\r
1125 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)fParticleOfInterest));
\r
1126 detUsedTPC = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPC);
\r
1127 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
\r
1128 prob[iSpecies] = probTPC[iSpecies];
\r
1131 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF);
\r
1132 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)fParticleOfInterest));
\r
1133 detUsedTOF = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTOF);
\r
1134 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
\r
1135 prob[iSpecies] = probTOF[iSpecies];
\r
1138 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC);
\r
1139 detUsedTPCTOF = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPCTOF);
\r
1140 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
\r
1141 prob[iSpecies] = probTPCTOF[iSpecies];
\r
1145 }//end switch: define detector mask
\r
1147 //Filling the PID QA
\r
1148 Double_t tofTime = -999., length = 999., tof = -999.;
\r
1149 Double_t c = TMath::C()*1.E-9;// m/ns
\r
1150 Double_t beta = -999.;
\r
1151 Double_t nSigmaTOFForParticleOfInterest = -999.;
\r
1152 if ( (track->IsOn(AliESDtrack::kTOFin)) &&
\r
1153 (track->IsOn(AliESDtrack::kTIME)) ) {
\r
1154 tofTime = track->GetTOFsignal();//in ps
\r
1155 length = track->GetIntegratedLength();
\r
1156 tof = tofTime*1E-3; // ns
\r
1159 //Printf("WARNING: track with negative TOF time found! Skipping this track for PID checks\n");
\r
1163 //printf("WARNING: track with negative length found!Skipping this track for PID checks\n");
\r
1167 length = length*0.01; // in meters
\r
1169 beta = length/tof;
\r
1171 nSigmaTOFForParticleOfInterest = fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)fParticleOfInterest);
\r
1172 fHistBetavsPTOFbeforePID ->Fill(track->P()*track->Charge(),beta);
\r
1173 fHistProbTOFvsPtbeforePID ->Fill(track->Pt(),probTOF[fParticleOfInterest]);
\r
1174 fHistNSigmaTOFvsPtbeforePID ->Fill(track->Pt(),nSigmaTOFForParticleOfInterest);
\r
1178 Double_t nSigmaTPCForParticleOfInterest = fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)fParticleOfInterest);
\r
1179 fHistdEdxVsPTPCbeforePID -> Fill(track->P()*track->Charge(),track->GetTPCsignal());
\r
1180 fHistProbTPCvsPtbeforePID -> Fill(track->Pt(),probTPC[fParticleOfInterest]);
\r
1181 fHistNSigmaTPCvsPtbeforePID -> Fill(track->Pt(),nSigmaTPCForParticleOfInterest);
\r
1182 fHistProbTPCTOFvsPtbeforePID -> Fill(track->Pt(),probTPCTOF[fParticleOfInterest]);
\r
1183 //end of QA-before pid
\r
1185 if ((detUsedTPC != 0)||(detUsedTOF != 0)||(detUsedTPCTOF != 0)) {
\r
1186 //Make the decision based on the n-sigma
\r
1187 if(fUsePIDnSigma) {
\r
1188 if(nSigma > fPIDNSigma) continue;}
\r
1190 //Make the decision based on the bayesian
\r
1191 else if(fUsePIDPropabilities) {
\r
1192 if(fParticleOfInterest != TMath::LocMax(AliPID::kSPECIES,prob)) continue;
\r
1193 if (prob[fParticleOfInterest] < fMinAcceptedPIDProbability) continue;
\r
1196 //Fill QA after the PID
\r
1197 fHistBetavsPTOFafterPID ->Fill(track->P()*track->Charge(),beta);
\r
1198 fHistProbTOFvsPtafterPID ->Fill(track->Pt(),probTOF[fParticleOfInterest]);
\r
1199 fHistNSigmaTOFvsPtafterPID ->Fill(track->Pt(),nSigmaTOFForParticleOfInterest);
\r
1201 fHistdEdxVsPTPCafterPID -> Fill(track->P()*track->Charge(),track->GetTPCsignal());
\r
1202 fHistProbTPCvsPtafterPID -> Fill(track->Pt(),probTPC[fParticleOfInterest]);
\r
1203 fHistProbTPCTOFvsPtafterPID -> Fill(track->Pt(),probTPCTOF[fParticleOfInterest]);
\r
1204 fHistNSigmaTPCvsPtafterPID -> Fill(track->Pt(),nSigmaTPCForParticleOfInterest);
\r
1207 //===========================PID===============================//
\r
1208 vCharge = trackTPC->Charge();
\r
1209 vY = trackTPC->Y();
\r
1210 vEta = trackTPC->Eta();
\r
1211 vPhi = trackTPC->Phi();// * TMath::RadToDeg();
\r
1212 vPt = trackTPC->Pt();
\r
1213 fHistClus->Fill(trackTPC->GetITSclusters(0),nClustersTPC);
\r
1214 fHistDCA->Fill(b[1],b[0]);
\r
1215 fHistChi2->Fill(chi2PerClusterTPC,gCentrality);
\r
1216 fHistPt->Fill(vPt,gCentrality);
\r
1217 fHistEta->Fill(vEta,gCentrality);
\r
1218 fHistPhi->Fill(vPhi,gCentrality);
\r
1219 fHistRapidity->Fill(vY,gCentrality);
\r
1220 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
\r
1221 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
\r
1223 //=======================================correction
\r
1224 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
\r
1226 // add the track to the TObjArray
\r
1227 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
\r
1233 else if(gAnalysisLevel == "MC"){
\r
1235 // Loop over tracks in event
\r
1236 for (Int_t iTracks = 0; iTracks < dynamic_cast<AliMCEvent*>(event)->GetNumberOfPrimaries(); iTracks++) {
\r
1237 AliMCParticle* track = dynamic_cast<AliMCParticle *>(event->GetTrack(iTracks));
\r
1239 AliError(Form("Could not receive particle %d", iTracks));
\r
1243 //exclude non stable particles
\r
1244 if(!(dynamic_cast<AliMCEvent*>(event)->IsPhysicalPrimary(iTracks))) continue;
\r
1246 vEta = track->Eta();
\r
1247 vPt = track->Pt();
\r
1250 if( vPt < fPtMin || vPt > fPtMax)
\r
1253 if( vEta < fEtaMin || vEta > fEtaMax) continue;
\r
1255 else if (fUsePID){
\r
1256 if( vY < fEtaMin || vY > fEtaMax) continue;
\r
1259 //analyze one set of particles
\r
1260 if(fUseMCPdgCode) {
\r
1261 TParticle *particle = track->Particle();
\r
1262 if(!particle) continue;
\r
1264 Int_t gPdgCode = particle->GetPdgCode();
\r
1265 if(TMath::Abs(fPDGCodeToBeAnalyzed) != TMath::Abs(gPdgCode))
\r
1269 //Use the acceptance parameterization
\r
1270 if(fAcceptanceParameterization) {
\r
1271 Double_t gRandomNumber = gRandom->Rndm();
\r
1272 if(gRandomNumber > fAcceptanceParameterization->Eval(track->Pt()))
\r
1276 //Exclude resonances
\r
1277 if(fExcludeResonancesInMC) {
\r
1278 TParticle *particle = track->Particle();
\r
1279 if(!particle) continue;
\r
1281 Bool_t kExcludeParticle = kFALSE;
\r
1282 Int_t gMotherIndex = particle->GetFirstMother();
\r
1283 if(gMotherIndex != -1) {
\r
1284 AliMCParticle* motherTrack = dynamic_cast<AliMCParticle *>(event->GetTrack(gMotherIndex));
\r
1286 TParticle *motherParticle = motherTrack->Particle();
\r
1287 if(motherParticle) {
\r
1288 Int_t pdgCodeOfMother = motherParticle->GetPdgCode();
\r
1289 //if((pdgCodeOfMother == 113)||(pdgCodeOfMother == 213)||(pdgCodeOfMother == 221)||(pdgCodeOfMother == 223)||(pdgCodeOfMother == 331)||(pdgCodeOfMother == 333)) {
\r
1290 if(pdgCodeOfMother == 113) {
\r
1291 kExcludeParticle = kTRUE;
\r
1297 //Exclude from the analysis decay products of rho0, rho+, eta, eta' and phi
\r
1298 if(kExcludeParticle) continue;
\r
1301 vCharge = track->Charge();
\r
1302 vPhi = track->Phi();
\r
1303 //Printf("phi (before): %lf",vPhi);
\r
1305 fHistPt->Fill(vPt,gCentrality);
\r
1306 fHistEta->Fill(vEta,gCentrality);
\r
1307 fHistPhi->Fill(vPhi,gCentrality);
\r
1308 //fHistPhi->Fill(vPhi*TMath::RadToDeg(),gCentrality);
\r
1309 fHistRapidity->Fill(vY,gCentrality);
\r
1310 //if(vCharge > 0) fHistPhiPos->Fill(vPhi*TMath::RadToDeg(),gCentrality);
\r
1311 //else if(vCharge < 0) fHistPhiNeg->Fill(vPhi*TMath::RadToDeg(),gCentrality);
\r
1312 if(vCharge > 0) fHistPhiPos->Fill(vPhi,gCentrality);
\r
1313 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi,gCentrality);
\r
1315 //Flow after burner
\r
1316 if(fUseFlowAfterBurner) {
\r
1317 Double_t precisionPhi = 0.001;
\r
1318 Int_t maxNumberOfIterations = 100;
\r
1320 Double_t phi0 = vPhi;
\r
1321 Double_t gV2 = fDifferentialV2->Eval(vPt);
\r
1323 for (Int_t j = 0; j < maxNumberOfIterations; j++) {
\r
1324 Double_t phiprev = vPhi;
\r
1325 Double_t fl = vPhi - phi0 + gV2*TMath::Sin(2.*(vPhi - gReactionPlane*TMath::DegToRad()));
\r
1326 Double_t fp = 1.0 + 2.0*gV2*TMath::Cos(2.*(vPhi - gReactionPlane*TMath::DegToRad()));
\r
1328 if (TMath::AreEqualAbs(phiprev,vPhi,precisionPhi)) break;
\r
1330 //Printf("phi (after): %lf\n",vPhi);
\r
1331 Double_t vDeltaphiBefore = phi0 - gReactionPlane*TMath::DegToRad();
\r
1332 if(vDeltaphiBefore < 0) vDeltaphiBefore += 2*TMath::Pi();
\r
1333 fHistPhiBefore->Fill(vDeltaphiBefore,gCentrality);
\r
1335 Double_t vDeltaphiAfter = vPhi - gReactionPlane*TMath::DegToRad();
\r
1336 if(vDeltaphiAfter < 0) vDeltaphiAfter += 2*TMath::Pi();
\r
1337 fHistPhiAfter->Fill(vDeltaphiAfter,gCentrality);
\r
1341 //vPhi *= TMath::RadToDeg();
\r
1343 //=======================================correction
\r
1344 Double_t correction = GetTrackbyTrackCorrectionMatrix(vEta, vPhi, vPt, vCharge, gCentrality);
\r
1346 tracksAccepted->Add(new AliBFBasicParticle(vEta, vPhi, vPt, vCharge, correction));
\r
1351 return tracksAccepted;
\r
1353 //________________________________________________________________________
\r
1354 TObjArray* AliAnalysisTaskBFPsi::GetShuffledTracks(TObjArray *tracks, Double_t gCentrality){
\r
1355 // Clones TObjArray and returns it with tracks after shuffling the charges
\r
1357 TObjArray* tracksShuffled = new TObjArray;
\r
1358 tracksShuffled->SetOwner(kTRUE);
\r
1360 vector<Short_t> *chargeVector = new vector<Short_t>; //original charge of accepted tracks
\r
1362 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
\r
1364 AliVParticle* track = (AliVParticle*) tracks->At(i);
\r
1365 chargeVector->push_back(track->Charge());
\r
1368 random_shuffle(chargeVector->begin(), chargeVector->end());
\r
1370 for(Int_t i = 0; i < tracks->GetEntriesFast(); i++){
\r
1371 AliVParticle* track = (AliVParticle*) tracks->At(i);
\r
1372 //==============================correction
\r
1373 Double_t correction = GetTrackbyTrackCorrectionMatrix(track->Eta(), track->Phi(),track->Pt(), chargeVector->at(i), gCentrality);
\r
1374 tracksShuffled->Add(new AliBFBasicParticle(track->Eta(), track->Phi(), track->Pt(),chargeVector->at(i), correction));
\r
1377 delete chargeVector;
\r
1379 return tracksShuffled;
\r
1383 //________________________________________________________________________
\r
1384 void AliAnalysisTaskBFPsi::FinishTaskOutput(){
\r
1385 //Printf("END BF");
\r
1388 AliError("fBalance not available");
\r
1391 if(fRunShuffling) {
\r
1392 if (!fShuffledBalance) {
\r
1393 AliError("fShuffledBalance not available");
\r
1400 //________________________________________________________________________
\r
1401 void AliAnalysisTaskBFPsi::Terminate(Option_t *) {
\r
1402 // Draw result to the screen
\r
1403 // Called once at the end of the query
\r
1405 // not implemented ...
\r