4 #include "TLorentzVector.h"
5 #include "TGraphErrors.h"
12 #include "AliAnalysisTaskSE.h"
13 #include "AliAnalysisManager.h"
15 #include "AliESDVertex.h"
16 #include "AliESDEvent.h"
17 #include "AliESDInputHandler.h"
18 #include "AliAODEvent.h"
19 #include "AliAODTrack.h"
20 #include "AliAODInputHandler.h"
21 #include "AliGenEventHeader.h"
22 #include "AliGenHijingEventHeader.h"
23 #include "AliMCEventHandler.h"
24 #include "AliMCEvent.h"
26 #include "AliESDtrackCuts.h"
30 #include "AliPIDResponse.h"
31 #include "AliPIDCombined.h"
33 #include "AliAnalysisTaskBF.h"
34 #include "AliBalance.h"
37 // Analysis task for the BF code
38 // Authors: Panos.Christakoglou@nikhef.nl
40 ClassImp(AliAnalysisTaskBF)
42 //________________________________________________________________________
43 AliAnalysisTaskBF::AliAnalysisTaskBF(const char *name)
44 : AliAnalysisTaskSE(name),
46 fRunShuffling(kFALSE),
72 fHistdEdxVsPTPCbeforePID(NULL),
73 fHistBetavsPTOFbeforePID(NULL),
74 fHistProbTPCvsPtbeforePID(NULL),
75 fHistProbTOFvsPtbeforePID(NULL),
76 fHistProbTPCTOFvsPtbeforePID(NULL),
77 fHistNSigmaTPCvsPtbeforePID(NULL),
78 fHistNSigmaTOFvsPtbeforePID(NULL),
79 fHistdEdxVsPTPCafterPID(NULL),
80 fHistBetavsPTOFafterPID(NULL),
81 fHistProbTPCvsPtafterPID(NULL),
82 fHistProbTOFvsPtafterPID(NULL),
83 fHistProbTPCTOFvsPtafterPID(NULL),
84 fHistNSigmaTPCvsPtafterPID(NULL),
85 fHistNSigmaTOFvsPtafterPID(NULL),
88 fParticleOfInterest(kPion),
89 fPidDetectorConfig(kTPCTOF),
92 fUsePIDPropabilities(kFALSE),
94 fMinAcceptedPIDProbability(0.8),
96 fCentralityEstimator("V0M"),
97 fUseCentrality(kFALSE),
98 fCentralityPercentileMin(0.),
99 fCentralityPercentileMax(5.),
100 fImpactParameterMin(0.),
101 fImpactParameterMax(20.),
102 fUseMultiplicity(kFALSE),
103 fNumberOfAcceptedTracksMin(0),
104 fNumberOfAcceptedTracksMax(10000),
105 fHistNumberOfAcceptedTracks(0),
106 fUseOfflineTrigger(kFALSE),
110 fAODtrackCutBit(128),
118 fNClustersTPCCut(-1),
119 fAcceptanceParameterization(0),
121 fUseFlowAfterBurner(kFALSE),
122 fExcludeResonancesInMC(kFALSE),
123 fUseMCPdgCode(kFALSE),
124 fPDGCodeToBeAnalyzed(-1) {
126 // Define input and output slots here
127 // Input slot #0 works with a TChain
128 DefineInput(0, TChain::Class());
129 // Output slot #0 writes into a TH1 container
130 DefineOutput(1, TList::Class());
131 DefineOutput(2, TList::Class());
132 DefineOutput(3, TList::Class());
133 DefineOutput(4, TList::Class());
136 //________________________________________________________________________
137 AliAnalysisTaskBF::~AliAnalysisTaskBF() {
140 // delete fShuffledBalance;
145 // delete fHistEventStats;
146 // delete fHistTrackStats;
160 //________________________________________________________________________
161 void AliAnalysisTaskBF::UserCreateOutputObjects() {
165 fBalance = new AliBalance();
166 fBalance->SetAnalysisLevel("ESD");
167 //fBalance->SetNumberOfBins(-1,16);
168 fBalance->SetInterval(-1,-0.8,0.8,16,0.,1.6);
171 if(!fShuffledBalance) {
172 fShuffledBalance = new AliBalance();
173 fShuffledBalance->SetAnalysisLevel("ESD");
174 //fShuffledBalance->SetNumberOfBins(-1,16);
175 fShuffledBalance->SetInterval(-1,-0.8,0.8,16,0.,1.6);
181 fList->SetName("listQA");
184 //Balance Function list
185 fListBF = new TList();
186 fListBF->SetName("listBF");
190 fListBFS = new TList();
191 fListBFS->SetName("listBFShuffled");
192 fListBFS->SetOwner();
197 fHistListPIDQA = new TList();
198 fHistListPIDQA->SetName("listQAPID");
199 fHistListPIDQA->SetOwner();
203 TString gCutName[4] = {"Total","Offline trigger",
204 "Vertex","Analyzed"};
205 fHistEventStats = new TH1F("fHistEventStats",
206 "Event statistics;;N_{events}",
208 for(Int_t i = 1; i <= 4; i++)
209 fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1].Data());
210 fList->Add(fHistEventStats);
212 TString gCentName[9] = {"V0M","FMD","TRK","TKL","CL0","CL1","V0MvsFMD","TKLvsV0M","ZEMvsZDC"};
213 fHistCentStats = new TH2F("fHistCentStats",
214 "Centrality statistics;;Cent percentile",
215 9,-0.5,8.5,220,-5,105);
216 for(Int_t i = 1; i <= 9; i++)
217 fHistCentStats->GetXaxis()->SetBinLabel(i,gCentName[i-1].Data());
218 fList->Add(fHistCentStats);
220 fHistTriggerStats = new TH1F("fHistTriggerStats","Trigger statistics;TriggerBit;N_{events}",130,0,130);
221 fList->Add(fHistTriggerStats);
223 fHistTrackStats = new TH1F("fHistTrackStats","Event statistics;TrackFilterBit;N_{events}",130,0,130);
224 fList->Add(fHistTrackStats);
226 fHistNumberOfAcceptedTracks = new TH1F("fHistNumberOfAcceptedTracks",";N_{acc.};Entries",4001,-0.5,4000.5);
227 fList->Add(fHistNumberOfAcceptedTracks);
229 // Vertex distributions
230 fHistVx = new TH1F("fHistVx","Primary vertex distribution - x coordinate;V_{x} (cm);Entries",100,-0.5,0.5);
232 fHistVy = new TH1F("fHistVy","Primary vertex distribution - y coordinate;V_{y} (cm);Entries",100,-0.5,0.5);
234 fHistVz = new TH1F("fHistVz","Primary vertex distribution - z coordinate;V_{z} (cm);Entries",100,-20.,20.);
238 fHistClus = new TH2F("fHistClus","# Cluster (TPC vs. ITS)",10,0,10,200,0,200);
239 fList->Add(fHistClus);
240 fHistChi2 = new TH1F("fHistChi2","Chi2/NDF distribution",200,0,10);
241 fList->Add(fHistChi2);
242 fHistDCA = new TH2F("fHistDCA","DCA (xy vs. z)",400,-5,5,400,-5,5);
243 fList->Add(fHistDCA);
244 fHistPt = new TH1F("fHistPt","p_{T} distribution",200,0,10);
246 fHistEta = new TH1F("fHistEta","#eta distribution",200,-2,2);
247 fList->Add(fHistEta);
248 fHistRapidity = new TH1F("fHistRapidity","y distribution",200,-2,2);
249 fList->Add(fHistRapidity);
250 fHistPhi = new TH1F("fHistPhi","#phi distribution",200,-20,380);
251 fList->Add(fHistPhi);
252 fHistPhiBefore = new TH1F("fHistPhiBefore","#phi distribution",200,0.,2*TMath::Pi());
253 fList->Add(fHistPhiBefore);
254 fHistPhiAfter = new TH1F("fHistPhiAfter","#phi distribution",200,0.,2*TMath::Pi());
255 fList->Add(fHistPhiAfter);
256 fHistPhiPos = new TH1F("fHistPhiPos","#phi distribution for positive particles",200,-20,380);
257 fList->Add(fHistPhiPos);
258 fHistPhiNeg = new TH1F("fHistPhiNeg","#phi distribution for negative particles",200,-20,380);
259 fList->Add(fHistPhiNeg);
260 fHistV0M = new TH2F("fHistV0M","V0 Multiplicity C vs. A",500, 0, 20000, 500, 0, 20000);
261 fList->Add(fHistV0M);
262 TString gRefTrackName[6] = {"tracks","tracksPos","tracksNeg","tracksTPConly","clusITS0","clusITS1"};
263 fHistRefTracks = new TH2F("fHistRefTracks","Nr of Ref tracks/event vs. ref track estimator;;Nr of tracks",6, 0, 6, 400, 0, 20000);
264 for(Int_t i = 1; i <= 6; i++)
265 fHistRefTracks->GetXaxis()->SetBinLabel(i,gRefTrackName[i-1].Data());
266 fList->Add(fHistRefTracks);
268 // QA histograms for HBTinspired and Conversion cuts
269 fList->Add(fBalance->GetQAHistHBTbefore());
270 fList->Add(fBalance->GetQAHistHBTafter());
271 fList->Add(fBalance->GetQAHistConversionbefore());
272 fList->Add(fBalance->GetQAHistConversionafter());
274 // Balance function histograms
275 // Initialize histograms if not done yet
276 if(!fBalance->GetHistNp(0)){
277 AliWarning("Histograms not yet initialized! --> Will be done now");
278 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
279 fBalance->InitHistograms();
283 if(!fShuffledBalance->GetHistNp(0)) {
284 AliWarning("Histograms (shuffling) not yet initialized! --> Will be done now");
285 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
286 fShuffledBalance->InitHistograms();
290 for(Int_t a = 0; a < ANALYSIS_TYPES; a++){
291 fListBF->Add(fBalance->GetHistNp(a));
292 fListBF->Add(fBalance->GetHistNn(a));
293 fListBF->Add(fBalance->GetHistNpn(a));
294 fListBF->Add(fBalance->GetHistNnn(a));
295 fListBF->Add(fBalance->GetHistNpp(a));
296 fListBF->Add(fBalance->GetHistNnp(a));
299 fListBFS->Add(fShuffledBalance->GetHistNp(a));
300 fListBFS->Add(fShuffledBalance->GetHistNn(a));
301 fListBFS->Add(fShuffledBalance->GetHistNpn(a));
302 fListBFS->Add(fShuffledBalance->GetHistNnn(a));
303 fListBFS->Add(fShuffledBalance->GetHistNpp(a));
304 fListBFS->Add(fShuffledBalance->GetHistNnp(a));
308 if(fESDtrackCuts) fList->Add(fESDtrackCuts);
310 //====================PID========================//
312 fPIDCombined = new AliPIDCombined();
313 fPIDCombined->SetDefaultTPCPriors();
315 fHistdEdxVsPTPCbeforePID = new TH2D ("dEdxVsPTPCbefore","dEdxVsPTPCbefore", 1000, -10.0, 10.0, 1000, 0, 1000);
316 fHistListPIDQA->Add(fHistdEdxVsPTPCbeforePID); //addition
318 fHistBetavsPTOFbeforePID = new TH2D ("BetavsPTOFbefore","BetavsPTOFbefore", 1000, -10.0, 10., 1000, 0, 1.2);
319 fHistListPIDQA->Add(fHistBetavsPTOFbeforePID); //addition
321 fHistProbTPCvsPtbeforePID = new TH2D ("ProbTPCvsPtbefore","ProbTPCvsPtbefore", 1000, -10.0,10.0, 1000, 0, 2.0);
322 fHistListPIDQA->Add(fHistProbTPCvsPtbeforePID); //addition
324 fHistProbTOFvsPtbeforePID = new TH2D ("ProbTOFvsPtbefore","ProbTOFvsPtbefore", 1000, -50, 50, 1000, 0, 2.0);
325 fHistListPIDQA->Add(fHistProbTOFvsPtbeforePID); //addition
327 fHistProbTPCTOFvsPtbeforePID =new TH2D ("ProbTPCTOFvsPtbefore","ProbTPCTOFvsPtbefore", 1000, -50, 50, 1000, 0, 2.0);
328 fHistListPIDQA->Add(fHistProbTPCTOFvsPtbeforePID); //addition
330 fHistNSigmaTPCvsPtbeforePID = new TH2D ("NSigmaTPCvsPtbefore","NSigmaTPCvsPtbefore", 1000, -10, 10, 1000, 0, 500);
331 fHistListPIDQA->Add(fHistNSigmaTPCvsPtbeforePID); //addition
333 fHistNSigmaTOFvsPtbeforePID = new TH2D ("NSigmaTOFvsPtbefore","NSigmaTOFvsPtbefore", 1000, -10, 10, 1000, 0, 500);
334 fHistListPIDQA->Add(fHistNSigmaTOFvsPtbeforePID); //addition
336 fHistdEdxVsPTPCafterPID = new TH2D ("dEdxVsPTPCafter","dEdxVsPTPCafter", 1000, -10, 10, 1000, 0, 1000);
337 fHistListPIDQA->Add(fHistdEdxVsPTPCafterPID); //addition
339 fHistBetavsPTOFafterPID = new TH2D ("BetavsPTOFafter","BetavsPTOFafter", 1000, -10, 10, 1000, 0, 1.2);
340 fHistListPIDQA->Add(fHistBetavsPTOFafterPID); //addition
342 fHistProbTPCvsPtafterPID = new TH2D ("ProbTPCvsPtafter","ProbTPCvsPtafter", 1000, -10, 10, 1000, 0, 2);
343 fHistListPIDQA->Add(fHistProbTPCvsPtafterPID); //addition
345 fHistProbTOFvsPtafterPID = new TH2D ("ProbTOFvsPtafter","ProbTOFvsPtafter", 1000, -10, 10, 1000, 0, 2);
346 fHistListPIDQA->Add(fHistProbTOFvsPtafterPID); //addition
348 fHistProbTPCTOFvsPtafterPID =new TH2D ("ProbTPCTOFvsPtafter","ProbTPCTOFvsPtafter", 1000, -50, 50, 1000, 0, 2.0);
349 fHistListPIDQA->Add(fHistProbTPCTOFvsPtafterPID); //addition
351 fHistNSigmaTPCvsPtafterPID = new TH2D ("NSigmaTPCvsPtafter","NSigmaTPCvsPtafter", 1000, -10, 10, 1000, 0, 500);
352 fHistListPIDQA->Add(fHistNSigmaTPCvsPtafterPID); //addition
354 fHistNSigmaTOFvsPtafterPID = new TH2D ("NSigmaTOFvsPtafter","NSigmaTOFvsPtafter", 1000, -10, 10, 1000, 0, 500);
355 fHistListPIDQA->Add(fHistNSigmaTOFvsPtafterPID); //addition
357 //====================PID========================//
361 PostData(2, fListBF);
362 if(fRunShuffling) PostData(3, fListBFS);
363 if(fUsePID) PostData(4, fHistListPIDQA); //PID
366 //________________________________________________________________________
367 void AliAnalysisTaskBF::UserExec(Option_t *) {
369 // Called for each event
370 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
372 AliESDtrack *trackTPC = NULL;
374 Int_t gNumberOfAcceptedTracks = 0;
375 Float_t fCentrality = 0.;
377 // for HBT like cuts need magnetic field sign
378 Float_t bSign = 0; // only used in AOD so far
380 // vector holding the charges/kinematics of all tracks (charge,y,eta,phi,p0,p1,p2,pt,E)
381 vector<Double_t> *chargeVectorShuffle[9]; // this will be shuffled
382 vector<Double_t> *chargeVector[9]; // original charge
383 for(Int_t i = 0; i < 9; i++){
384 chargeVectorShuffle[i] = new vector<Double_t>;
385 chargeVector[i] = new vector<Double_t>;
397 fPIDResponse = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetPIDResponse();
398 if (!fPIDResponse) AliFatal("This Task needs the PID response attached to the inputHandler");
402 if(gAnalysisLevel == "ESD") {
403 AliESDEvent* gESD = dynamic_cast<AliESDEvent*>(InputEvent()); // from TaskSE
405 Printf("ERROR: gESD not available");
409 // store offline trigger bits
410 fHistTriggerStats->Fill(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected());
412 // event selection done in AliAnalysisTaskSE::Exec() --> this is not used
413 fHistEventStats->Fill(1); //all events
414 Bool_t isSelected = kTRUE;
415 if(fUseOfflineTrigger)
416 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
418 fHistEventStats->Fill(2); //triggered events
422 AliCentrality *centrality = gESD->GetCentrality();
424 fCentrality = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
426 // take only events inside centrality class
427 if(!centrality->IsEventInCentralityClass(fCentralityPercentileMin,
428 fCentralityPercentileMax,
429 fCentralityEstimator.Data()))
432 // centrality QA (V0M)
433 fHistV0M->Fill(gESD->GetVZEROData()->GetMTotV0A(), gESD->GetVZEROData()->GetMTotV0C());
436 const AliESDVertex *vertex = gESD->GetPrimaryVertex();
438 if(vertex->GetNContributors() > 0) {
439 if(vertex->GetZRes() != 0) {
440 fHistEventStats->Fill(3); //events with a proper vertex
441 if(TMath::Abs(vertex->GetXv()) < fVxMax) {
442 if(TMath::Abs(vertex->GetYv()) < fVyMax) {
443 if(TMath::Abs(vertex->GetZv()) < fVzMax) {
444 fHistEventStats->Fill(4); //analayzed events
445 fHistVx->Fill(vertex->GetXv());
446 fHistVy->Fill(vertex->GetYv());
447 fHistVz->Fill(vertex->GetZv());
449 //Printf("There are %d tracks in this event", gESD->GetNumberOfTracks());
450 for (Int_t iTracks = 0; iTracks < gESD->GetNumberOfTracks(); iTracks++) {
451 AliESDtrack* track = dynamic_cast<AliESDtrack *>(gESD->GetTrack(iTracks));
453 Printf("ERROR: Could not receive track %d", iTracks);
457 // take only TPC only tracks
458 trackTPC = new AliESDtrack();
459 if(!track->FillTPCOnlyTrack(*trackTPC)) continue;
463 if(!fESDtrackCuts->AcceptTrack(trackTPC)) continue;
465 // fill QA histograms
468 trackTPC->GetImpactParameters(b,bCov);
469 if (bCov[0]<=0 || bCov[2]<=0) {
470 AliDebug(1, "Estimated b resolution lower or equal zero!");
471 bCov[0]=0; bCov[2]=0;
474 Int_t nClustersTPC = -1;
475 nClustersTPC = trackTPC->GetTPCNclsIter1(); // TPC standalone
476 //nClustersTPC = track->GetTPCclusters(0); // global track
477 Float_t chi2PerClusterTPC = -1;
478 if (nClustersTPC!=0) {
479 chi2PerClusterTPC = trackTPC->GetTPCchi2Iter1()/Float_t(nClustersTPC); // TPC standalone
480 //chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC); // global track
483 //===========================PID===============================//
485 Double_t prob[AliPID::kSPECIES]={0.};
486 Double_t probTPC[AliPID::kSPECIES]={0.};
487 Double_t probTOF[AliPID::kSPECIES]={0.};
488 Double_t probTPCTOF[AliPID::kSPECIES]={0.};
490 Double_t nSigma = 0.;
491 UInt_t detUsedTPC = 0;
492 UInt_t detUsedTOF = 0;
493 UInt_t detUsedTPCTOF = 0;
495 //Decide what detector configuration we want to use
496 switch(fPidDetectorConfig) {
498 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
499 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)fParticleOfInterest));
500 detUsedTPC = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPC);
501 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
502 prob[iSpecies] = probTPC[iSpecies];
505 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF);
506 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)fParticleOfInterest));
507 detUsedTOF = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTOF);
508 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
509 prob[iSpecies] = probTOF[iSpecies];
512 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC);
513 detUsedTPCTOF = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPCTOF);
514 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
515 prob[iSpecies] = probTPCTOF[iSpecies];
519 }//end switch: define detector mask
522 Double_t tofTime = -999., length = 999., tof = -999.;
523 Double_t c = TMath::C()*1.E-9;// m/ns
524 Double_t beta = -999.;
525 Double_t nSigmaTOFForParticleOfInterest = -999.;
526 if ( (track->IsOn(AliESDtrack::kTOFin)) &&
527 (track->IsOn(AliESDtrack::kTIME)) ) {
528 tofTime = track->GetTOFsignal();//in ps
529 length = track->GetIntegratedLength();
530 tof = tofTime*1E-3; // ns
533 //Printf("WARNING: track with negative TOF time found! Skipping this track for PID checks\n");
537 //printf("WARNING: track with negative length found!Skipping this track for PID checks\n");
541 length = length*0.01; // in meters
545 nSigmaTOFForParticleOfInterest = fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)fParticleOfInterest);
546 fHistBetavsPTOFbeforePID ->Fill(track->P()*track->Charge(),beta);
547 fHistProbTOFvsPtbeforePID ->Fill(track->Pt(),probTOF[fParticleOfInterest]);
548 fHistNSigmaTOFvsPtbeforePID ->Fill(track->Pt(),nSigmaTOFForParticleOfInterest);
552 Double_t nSigmaTPCForParticleOfInterest = fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)fParticleOfInterest);
553 fHistdEdxVsPTPCbeforePID -> Fill(track->P()*track->Charge(),track->GetTPCsignal());
554 fHistProbTPCvsPtbeforePID -> Fill(track->Pt(),probTPC[fParticleOfInterest]);
555 fHistNSigmaTPCvsPtbeforePID -> Fill(track->Pt(),nSigmaTPCForParticleOfInterest);
556 fHistProbTPCTOFvsPtbeforePID -> Fill(track->Pt(),probTPCTOF[fParticleOfInterest]);
557 //end of QA-before pid
559 if ((detUsedTPC != 0)||(detUsedTOF != 0)||(detUsedTPCTOF != 0)) {
560 //Make the decision based on the n-sigma
562 if(nSigma > fPIDNSigma) continue;}
564 //Make the decision based on the bayesian
565 else if(fUsePIDPropabilities) {
566 if(fParticleOfInterest != TMath::LocMax(AliPID::kSPECIES,prob)) continue;
567 if (prob[fParticleOfInterest] < fMinAcceptedPIDProbability) continue;
570 //Fill QA after the PID
571 fHistBetavsPTOFafterPID ->Fill(track->P()*track->Charge(),beta);
572 fHistProbTOFvsPtafterPID ->Fill(track->Pt(),probTOF[fParticleOfInterest]);
573 fHistNSigmaTOFvsPtafterPID ->Fill(track->Pt(),nSigmaTOFForParticleOfInterest);
575 fHistdEdxVsPTPCafterPID -> Fill(track->P()*track->Charge(),track->GetTPCsignal());
576 fHistProbTPCvsPtafterPID -> Fill(track->Pt(),probTPC[fParticleOfInterest]);
577 fHistProbTPCTOFvsPtafterPID -> Fill(track->Pt(),probTPCTOF[fParticleOfInterest]);
578 fHistNSigmaTPCvsPtafterPID -> Fill(track->Pt(),nSigmaTPCForParticleOfInterest);
581 PostData(4, fHistListPIDQA);
583 //===========================PID===============================//
584 vCharge = trackTPC->Charge();
586 vEta = trackTPC->Eta();
587 vPhi = trackTPC->Phi() * TMath::RadToDeg();
589 vPt = trackTPC->Pt();
590 trackTPC->PxPyPz(vP);
591 fHistClus->Fill(trackTPC->GetITSclusters(0),nClustersTPC);
592 fHistDCA->Fill(b[1],b[0]);
593 fHistChi2->Fill(chi2PerClusterTPC);
595 fHistEta->Fill(vEta);
596 fHistPhi->Fill(vPhi);
597 fHistRapidity->Fill(vY);
598 if(vCharge > 0) fHistPhiPos->Fill(vPhi);
599 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi);
601 // fill charge vector
602 chargeVector[0]->push_back(vCharge);
603 chargeVector[1]->push_back(vY);
604 chargeVector[2]->push_back(vEta);
605 chargeVector[3]->push_back(vPhi);
606 chargeVector[4]->push_back(vP[0]);
607 chargeVector[5]->push_back(vP[1]);
608 chargeVector[6]->push_back(vP[2]);
609 chargeVector[7]->push_back(vPt);
610 chargeVector[8]->push_back(vE);
613 chargeVectorShuffle[0]->push_back(vCharge);
614 chargeVectorShuffle[1]->push_back(vY);
615 chargeVectorShuffle[2]->push_back(vEta);
616 chargeVectorShuffle[3]->push_back(vPhi);
617 chargeVectorShuffle[4]->push_back(vP[0]);
618 chargeVectorShuffle[5]->push_back(vP[1]);
619 chargeVectorShuffle[6]->push_back(vP[2]);
620 chargeVectorShuffle[7]->push_back(vPt);
621 chargeVectorShuffle[8]->push_back(vE);
630 }//proper vertex resolution
631 }//proper number of contributors
632 }//vertex object valid
636 //AOD analysis (vertex and track cuts also here!!!!)
637 else if(gAnalysisLevel == "AOD") {
638 AliAODEvent* gAOD = dynamic_cast<AliAODEvent*>(InputEvent()); // from TaskSE
640 Printf("ERROR: gAOD not available");
644 // for HBT like cuts need magnetic field sign
645 bSign = (gAOD->GetMagneticField() > 0) ? 1 : -1;
647 AliAODHeader *aodHeader = gAOD->GetHeader();
649 // store offline trigger bits
650 fHistTriggerStats->Fill(aodHeader->GetOfflineTrigger());
652 // event selection done in AliAnalysisTaskSE::Exec() --> this is not used
653 fHistEventStats->Fill(1); //all events
654 Bool_t isSelected = kTRUE;
655 if(fUseOfflineTrigger)
656 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
658 fHistEventStats->Fill(2); //triggered events
660 //Centrality stuff (centrality in AOD header)
662 fCentrality = aodHeader->GetCentralityP()->GetCentralityPercentile(fCentralityEstimator.Data());
664 // in OLD AODs (i.e. AOD049) fCentrality can be == 0
668 // QA for centrality estimators
669 fHistCentStats->Fill(0.,aodHeader->GetCentralityP()->GetCentralityPercentile("V0M"));
670 fHistCentStats->Fill(1.,aodHeader->GetCentralityP()->GetCentralityPercentile("FMD"));
671 fHistCentStats->Fill(2.,aodHeader->GetCentralityP()->GetCentralityPercentile("TRK"));
672 fHistCentStats->Fill(3.,aodHeader->GetCentralityP()->GetCentralityPercentile("TKL"));
673 fHistCentStats->Fill(4.,aodHeader->GetCentralityP()->GetCentralityPercentile("CL0"));
674 fHistCentStats->Fill(5.,aodHeader->GetCentralityP()->GetCentralityPercentile("CL1"));
675 fHistCentStats->Fill(6.,aodHeader->GetCentralityP()->GetCentralityPercentile("V0MvsFMD"));
676 fHistCentStats->Fill(7.,aodHeader->GetCentralityP()->GetCentralityPercentile("TKLvsV0M"));
677 fHistCentStats->Fill(8.,aodHeader->GetCentralityP()->GetCentralityPercentile("ZEMvsZDC"));
679 // take only events inside centrality class
680 if((fCentrality < fCentralityPercentileMin) || (fCentrality > fCentralityPercentileMax))
683 // centrality QA (V0M)
684 fHistV0M->Fill(gAOD->GetVZEROData()->GetMTotV0A(), gAOD->GetVZEROData()->GetMTotV0C());
686 // centrality QA (reference tracks)
687 fHistRefTracks->Fill(0.,aodHeader->GetRefMultiplicity());
688 fHistRefTracks->Fill(1.,aodHeader->GetRefMultiplicityPos());
689 fHistRefTracks->Fill(2.,aodHeader->GetRefMultiplicityNeg());
690 fHistRefTracks->Fill(3.,aodHeader->GetTPConlyRefMultiplicity());
691 fHistRefTracks->Fill(4.,aodHeader->GetNumberOfITSClusters(0));
692 fHistRefTracks->Fill(5.,aodHeader->GetNumberOfITSClusters(1));
693 fHistRefTracks->Fill(6.,aodHeader->GetNumberOfITSClusters(2));
694 fHistRefTracks->Fill(7.,aodHeader->GetNumberOfITSClusters(3));
695 fHistRefTracks->Fill(8.,aodHeader->GetNumberOfITSClusters(4));
698 const AliAODVertex *vertex = gAOD->GetPrimaryVertex();
702 vertex->GetCovarianceMatrix(fCov);
704 if(vertex->GetNContributors() > 0) {
706 fHistEventStats->Fill(3); //events with a proper vertex
707 if(TMath::Abs(vertex->GetX()) < fVxMax) {
708 if(TMath::Abs(vertex->GetY()) < fVyMax) {
709 if(TMath::Abs(vertex->GetZ()) < fVzMax) {
710 fHistEventStats->Fill(4); //analyzed events
711 fHistVx->Fill(vertex->GetX());
712 fHistVy->Fill(vertex->GetY());
713 fHistVz->Fill(vertex->GetZ());
715 //===========================================//
716 TExMap *trackMap = new TExMap();
717 for (Int_t iTracks = 0; iTracks < gAOD->GetNumberOfTracks(); iTracks++) {
718 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack *>(gAOD->GetTrack(iTracks));
720 Printf("ERROR: Could not receive track %d", iTracks);
723 Int_t gID = aodTrack->GetID();
724 //if (!aodTrack->TestFilterBit(fAODtrackCutBit)) trackMap->Add(gID, iTracks);
725 if (aodTrack->TestFilterBit(1)) trackMap->Add(gID, iTracks);
727 AliAODTrack* newAodTrack;
728 //===========================================//
730 //Printf("There are %d tracks in this event", gAOD->GetNumberOfTracks());
731 for (Int_t iTracks = 0; iTracks < gAOD->GetNumberOfTracks(); iTracks++) {
732 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack *>(gAOD->GetTrack(iTracks));
734 Printf("ERROR: Could not receive track %d", iTracks);
739 // For ESD Filter Information: ANALYSIS/macros/AddTaskESDfilter.C
740 //===========================================//
741 // take only TPC only tracks
742 fHistTrackStats->Fill(aodTrack->GetFilterMap());
743 if(!aodTrack->TestFilterBit(fAODtrackCutBit)) continue;
745 Int_t gID = aodTrack->GetID();
746 newAodTrack = gID >= 0 ? aodTrack : gAOD->GetTrack(trackMap->GetValue(-1-gID));
747 //Printf("Label: %d - Pt: %lf (old) - %d - Pt: %lf(new)",gID,aodTrack->Pt(), newAodTrack->GetID(), newAodTrack->Pt());
748 //===========================================//
750 //fHistTrackStats->Fill(aodTrack->GetFilterMap());
751 //if(!aodTrack->TestFilterBit(fAODtrackCutBit)) continue;
753 vCharge = aodTrack->Charge();
755 vEta = aodTrack->Eta();
756 vPhi = aodTrack->Phi() * TMath::RadToDeg();
758 vPt = aodTrack->Pt();
759 aodTrack->PxPyPz(vP);
761 Float_t dcaXY = aodTrack->DCA(); // this is the DCA from global track (not exactly what is cut on)
762 Float_t dcaZ = aodTrack->ZAtDCA(); // this is the DCA from global track (not exactly what is cut on)
765 // Kinematics cuts from ESD track cuts
766 if( vPt < fPtMin || vPt > fPtMax) continue;
769 if( vEta < fEtaMin || vEta > fEtaMax) continue;
773 if( vY < fEtaMin || vY > fEtaMax) continue;
776 // Extra DCA cuts (for systematic studies [!= -1])
777 if( fDCAxyCut != -1 && fDCAzCut != -1){
778 if(TMath::Sqrt((dcaXY*dcaXY)/(fDCAxyCut*fDCAxyCut)+(dcaZ*dcaZ)/(fDCAzCut*fDCAzCut)) > 1 ){
783 // Extra TPC cuts (for systematic studies [!= -1])
784 if( fTPCchi2Cut != -1 && aodTrack->Chi2perNDF() > fTPCchi2Cut){
787 if( fNClustersTPCCut != -1 && aodTrack->GetTPCNcls() < fNClustersTPCCut){
791 //===============================================PID==================================//
793 Double_t prob[AliPID::kSPECIES]={0.};
794 Double_t probTPC[AliPID::kSPECIES]={0.};
795 Double_t probTOF[AliPID::kSPECIES]={0.};
796 Double_t probTPCTOF[AliPID::kSPECIES]={0.};
798 Double_t nSigma = 0.;
799 UInt_t detUsedTPC = 0;
800 UInt_t detUsedTOF = 0;
801 UInt_t detUsedTPCTOF = 0;
803 //Decide what detector configuration we want to use
804 switch(fPidDetectorConfig) {
806 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
807 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(newAodTrack,(AliPID::EParticleType)fParticleOfInterest));
808 //detUsedTPC = fPIDCombined->ComputeProbabilities(aodTrack, fPIDResponse, probTPC);
809 detUsedTPC = (AliPIDResponse::kDetTPC);
810 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
811 prob[iSpecies] = probTPC[iSpecies];
814 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF);
815 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(newAodTrack,(AliPID::EParticleType)fParticleOfInterest));
816 //detUsedTOF = fPIDCombined->ComputeProbabilities(aodTrack, fPIDResponse, probTOF);
817 detUsedTPC = (AliPIDResponse::kDetTPC);
818 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
819 prob[iSpecies] = probTOF[iSpecies];
822 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC);
823 //detUsedTPCTOF = fPIDCombined->ComputeProbabilities(newAodTrack, fPIDResponse, probTPCTOF);
824 detUsedTPC = (AliPIDResponse::kDetTPC);
825 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
826 prob[iSpecies] = probTPCTOF[iSpecies];
830 }//end switch: define detector mask
833 Double_t tofTime = -999., tof = -999.; //length = 999., tof = -999.;
834 //Double_t c = TMath::C()*1.E-9;// m/ns
835 //Double_t beta = -999.;
836 Double_t nSigmaTOFForParticleOfInterest = -999.;
837 if ( (newAodTrack->IsOn(AliAODTrack::kTOFin)) &&
838 (newAodTrack->IsOn(AliAODTrack::kTIME)) ) {
839 tofTime = newAodTrack->GetTOFsignal();//in ps
840 //length = newAodTrack->GetIntegratedLength();
841 tof = tofTime*1E-3; // ns
844 //Printf("WARNING: track with negative TOF time found! Skipping this track for PID checks\n");
848 //printf("WARNING: track with negative length found!Skipping this track for PID checks\n");
852 //length = length*0.01; // in meters
856 nSigmaTOFForParticleOfInterest = fPIDResponse->NumberOfSigmasTOF(newAodTrack,(AliPID::EParticleType)fParticleOfInterest);
857 //fHistBetavsPTOFbeforePID ->Fill(aodTrack->P()*aodTrack->Charge(),beta);
858 fHistProbTOFvsPtbeforePID ->Fill(newAodTrack->Pt(),probTOF[fParticleOfInterest]);
859 fHistNSigmaTOFvsPtbeforePID ->Fill(newAodTrack->Pt(),nSigmaTOFForParticleOfInterest);
863 Double_t nSigmaTPCForParticleOfInterest = fPIDResponse->NumberOfSigmasTPC(newAodTrack,(AliPID::EParticleType)fParticleOfInterest);
864 fHistdEdxVsPTPCbeforePID -> Fill(newAodTrack->P()*newAodTrack->Charge(),newAodTrack->GetTPCsignal());
865 fHistProbTPCvsPtbeforePID -> Fill(newAodTrack->Pt(),probTPC[fParticleOfInterest]);
866 fHistNSigmaTPCvsPtbeforePID -> Fill(newAodTrack->Pt(),nSigmaTPCForParticleOfInterest);
867 fHistProbTPCTOFvsPtbeforePID -> Fill(newAodTrack->Pt(),probTPCTOF[fParticleOfInterest]);
868 //end of QA-before pid
870 if ((detUsedTPC != 0)||(detUsedTOF != 0)||(detUsedTPCTOF != 0)) {
871 //Make the decision based on the n-sigma
873 if(nSigma > fPIDNSigma) continue;}
875 //Make the decision based on the bayesian
876 else if(fUsePIDPropabilities) {
877 if(fParticleOfInterest != TMath::LocMax(AliPID::kSPECIES,prob)) continue;
878 if (prob[fParticleOfInterest] < fMinAcceptedPIDProbability) continue;
881 //Fill QA after the PID
882 //fHistBetavsPTOFafterPID ->Fill(newAodTrack->P()*newAodTrack->Charge(),beta);
883 fHistProbTOFvsPtafterPID ->Fill(newAodTrack->Pt(),probTOF[fParticleOfInterest]);
884 fHistNSigmaTOFvsPtafterPID ->Fill(newAodTrack->Pt(),nSigmaTOFForParticleOfInterest);
886 fHistdEdxVsPTPCafterPID -> Fill(newAodTrack->P()*newAodTrack->Charge(),newAodTrack->GetTPCsignal());
887 fHistProbTPCvsPtafterPID -> Fill(newAodTrack->Pt(),probTPC[fParticleOfInterest]);
888 fHistProbTPCTOFvsPtafterPID -> Fill(newAodTrack->Pt(),probTPCTOF[fParticleOfInterest]);
889 fHistNSigmaTPCvsPtafterPID -> Fill(newAodTrack->Pt(),nSigmaTPCForParticleOfInterest);
892 PostData(4, fHistListPIDQA);
895 //=========================================================PID=================================================================//
897 // fill QA histograms
898 fHistClus->Fill(aodTrack->GetITSNcls(),aodTrack->GetTPCNcls());
899 fHistDCA->Fill(dcaZ,dcaXY);
900 fHistChi2->Fill(aodTrack->Chi2perNDF());
902 fHistEta->Fill(vEta);
903 fHistPhi->Fill(vPhi);
904 fHistRapidity->Fill(vY);
905 if(vCharge > 0) fHistPhiPos->Fill(vPhi);
906 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi);
908 // fill charge vector
909 chargeVector[0]->push_back(vCharge);
910 chargeVector[1]->push_back(vY);
911 chargeVector[2]->push_back(vEta);
912 chargeVector[3]->push_back(vPhi);
913 chargeVector[4]->push_back(vP[0]);
914 chargeVector[5]->push_back(vP[1]);
915 chargeVector[6]->push_back(vP[2]);
916 chargeVector[7]->push_back(vPt);
917 chargeVector[8]->push_back(vE);
920 chargeVectorShuffle[0]->push_back(vCharge);
921 chargeVectorShuffle[1]->push_back(vY);
922 chargeVectorShuffle[2]->push_back(vEta);
923 chargeVectorShuffle[3]->push_back(vPhi);
924 chargeVectorShuffle[4]->push_back(vP[0]);
925 chargeVectorShuffle[5]->push_back(vP[1]);
926 chargeVectorShuffle[6]->push_back(vP[2]);
927 chargeVectorShuffle[7]->push_back(vPt);
928 chargeVectorShuffle[8]->push_back(vE);
931 gNumberOfAcceptedTracks += 1;
937 }//proper vertex resolution
938 }//proper number of contributors
939 }//vertex object valid
944 if(gAnalysisLevel == "MCESD") {
945 AliMCEvent* mcEvent = MCEvent();
947 Printf("ERROR: mcEvent not available");
951 AliESDEvent* gESD = dynamic_cast<AliESDEvent*>(InputEvent()); // from TaskSE
953 Printf("ERROR: gESD not available");
957 // store offline trigger bits
958 fHistTriggerStats->Fill(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected());
960 // event selection done in AliAnalysisTaskSE::Exec() --> this is not used
961 fHistEventStats->Fill(1); //all events
962 Bool_t isSelected = kTRUE;
963 if(fUseOfflineTrigger)
964 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
966 fHistEventStats->Fill(2); //triggered events
970 AliCentrality *centrality = gESD->GetCentrality();
972 fCentrality = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
974 // take only events inside centrality class
975 if(!centrality->IsEventInCentralityClass(fCentralityPercentileMin,
976 fCentralityPercentileMax,
977 fCentralityEstimator.Data()))
980 // centrality QA (V0M)
981 fHistV0M->Fill(gESD->GetVZEROData()->GetMTotV0A(), gESD->GetVZEROData()->GetMTotV0C());
984 const AliESDVertex *vertex = gESD->GetPrimaryVertex();
986 if(vertex->GetNContributors() > 0) {
987 if(vertex->GetZRes() != 0) {
988 fHistEventStats->Fill(3); //events with a proper vertex
989 if(TMath::Abs(vertex->GetXv()) < fVxMax) {
990 if(TMath::Abs(vertex->GetYv()) < fVyMax) {
991 if(TMath::Abs(vertex->GetZv()) < fVzMax) {
992 fHistEventStats->Fill(4); //analayzed events
993 fHistVx->Fill(vertex->GetXv());
994 fHistVy->Fill(vertex->GetYv());
995 fHistVz->Fill(vertex->GetZv());
997 //Printf("There are %d tracks in this event", gESD->GetNumberOfTracks());
998 for (Int_t iTracks = 0; iTracks < gESD->GetNumberOfTracks(); iTracks++) {
999 AliESDtrack* track = dynamic_cast<AliESDtrack *>(gESD->GetTrack(iTracks));
1001 Printf("ERROR: Could not receive track %d", iTracks);
1005 Int_t label = TMath::Abs(track->GetLabel());
1006 if(label > mcEvent->GetNumberOfTracks()) continue;
1007 if(label > mcEvent->GetNumberOfPrimaries()) continue;
1009 AliMCParticle* mcTrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(label));
1010 if(!mcTrack) continue;
1012 // take only TPC only tracks
1013 trackTPC = new AliESDtrack();
1014 if(!track->FillTPCOnlyTrack(*trackTPC)) continue;
1018 if(!fESDtrackCuts->AcceptTrack(trackTPC)) continue;
1020 // fill QA histograms
1023 trackTPC->GetImpactParameters(b,bCov);
1024 if (bCov[0]<=0 || bCov[2]<=0) {
1025 AliDebug(1, "Estimated b resolution lower or equal zero!");
1026 bCov[0]=0; bCov[2]=0;
1029 Int_t nClustersTPC = -1;
1030 nClustersTPC = trackTPC->GetTPCNclsIter1(); // TPC standalone
1031 //nClustersTPC = track->GetTPCclusters(0); // global track
1032 Float_t chi2PerClusterTPC = -1;
1033 if (nClustersTPC!=0) {
1034 chi2PerClusterTPC = trackTPC->GetTPCchi2Iter1()/Float_t(nClustersTPC); // TPC standalone
1035 //chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC); // global track
1038 vCharge = trackTPC->Charge();
1040 vEta = trackTPC->Eta();
1041 vPhi = trackTPC->Phi() * TMath::RadToDeg();
1043 vPt = trackTPC->Pt();
1044 trackTPC->PxPyPz(vP);
1046 fHistClus->Fill(trackTPC->GetITSclusters(0),nClustersTPC);
1047 fHistDCA->Fill(b[1],b[0]);
1048 fHistChi2->Fill(chi2PerClusterTPC);
1050 fHistEta->Fill(vEta);
1051 fHistPhi->Fill(vPhi);
1052 fHistRapidity->Fill(vY);
1053 if(vCharge > 0) fHistPhiPos->Fill(vPhi);
1054 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi);
1056 // fill charge vector
1057 chargeVector[0]->push_back(vCharge);
1058 chargeVector[1]->push_back(vY);
1059 chargeVector[2]->push_back(vEta);
1060 chargeVector[3]->push_back(vPhi);
1061 chargeVector[4]->push_back(vP[0]);
1062 chargeVector[5]->push_back(vP[1]);
1063 chargeVector[6]->push_back(vP[2]);
1064 chargeVector[7]->push_back(vPt);
1065 chargeVector[8]->push_back(vE);
1068 chargeVectorShuffle[0]->push_back(vCharge);
1069 chargeVectorShuffle[1]->push_back(vY);
1070 chargeVectorShuffle[2]->push_back(vEta);
1071 chargeVectorShuffle[3]->push_back(vPhi);
1072 chargeVectorShuffle[4]->push_back(vP[0]);
1073 chargeVectorShuffle[5]->push_back(vP[1]);
1074 chargeVectorShuffle[6]->push_back(vP[2]);
1075 chargeVectorShuffle[7]->push_back(vPt);
1076 chargeVectorShuffle[8]->push_back(vE);
1080 gNumberOfAcceptedTracks += 1;
1086 }//proper vertex resolution
1087 }//proper number of contributors
1088 }//vertex object valid
1093 else if(gAnalysisLevel == "MC") {
1094 AliMCEvent* mcEvent = MCEvent();
1096 Printf("ERROR: mcEvent not available");
1099 fHistEventStats->Fill(1); //total events
1100 fHistEventStats->Fill(2); //offline trigger
1102 Double_t gReactionPlane = 0., gImpactParameter = 0.;
1103 if(fUseCentrality) {
1105 AliGenHijingEventHeader* headerH = dynamic_cast<AliGenHijingEventHeader*>(mcEvent->GenEventHeader());
1107 //Printf("=====================================================");
1108 //Printf("Reaction plane angle: %lf",headerH->ReactionPlaneAngle());
1109 //Printf("Impact parameter: %lf",headerH->ImpactParameter());
1110 //Printf("=====================================================");
1111 gReactionPlane = headerH->ReactionPlaneAngle();
1112 gImpactParameter = headerH->ImpactParameter();
1113 fCentrality = gImpactParameter;
1115 fCentrality = gImpactParameter;
1117 // take only events inside centrality class (DIDN'T CHANGE THIS UP TO NOW)
1118 if((fImpactParameterMin > gImpactParameter) || (fImpactParameterMax < gImpactParameter))
1122 AliGenEventHeader *header = mcEvent->GenEventHeader();
1125 TArrayF gVertexArray;
1126 header->PrimaryVertex(gVertexArray);
1127 //Printf("Vertex: %lf (x) - %lf (y) - %lf (z)",
1128 //gVertexArray.At(0),
1129 //gVertexArray.At(1),
1130 //gVertexArray.At(2));
1131 fHistEventStats->Fill(3); //events with a proper vertex
1132 if(TMath::Abs(gVertexArray.At(0)) < fVxMax) {
1133 if(TMath::Abs(gVertexArray.At(1)) < fVyMax) {
1134 if(TMath::Abs(gVertexArray.At(2)) < fVzMax) {
1135 fHistEventStats->Fill(4); //analayzed events
1136 fHistVx->Fill(gVertexArray.At(0));
1137 fHistVy->Fill(gVertexArray.At(1));
1138 fHistVz->Fill(gVertexArray.At(2));
1140 Printf("There are %d tracks in this event", mcEvent->GetNumberOfPrimaries());
1141 for (Int_t iTracks = 0; iTracks < mcEvent->GetNumberOfPrimaries(); iTracks++) {
1142 AliMCParticle* track = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(iTracks));
1144 Printf("ERROR: Could not receive particle %d", iTracks);
1148 //exclude non stable particles
1149 if(!mcEvent->IsPhysicalPrimary(iTracks)) continue;
1151 vEta = track->Eta();
1155 if( vPt < fPtMin || vPt > fPtMax)
1158 if( vEta < fEtaMin || vEta > fEtaMax) continue;
1161 if( vY < fEtaMin || vY > fEtaMax) continue;
1164 //analyze one set of particles
1166 TParticle *particle = track->Particle();
1167 if(!particle) continue;
1169 Int_t gPdgCode = particle->GetPdgCode();
1170 if(TMath::Abs(fPDGCodeToBeAnalyzed) != TMath::Abs(gPdgCode))
1174 //Use the acceptance parameterization
1175 if(fAcceptanceParameterization) {
1176 Double_t gRandomNumber = gRandom->Rndm();
1177 if(gRandomNumber > fAcceptanceParameterization->Eval(track->Pt()))
1181 //Exclude resonances
1182 if(fExcludeResonancesInMC) {
1183 TParticle *particle = track->Particle();
1184 if(!particle) continue;
1186 Bool_t kExcludeParticle = kFALSE;
1187 Int_t gMotherIndex = particle->GetFirstMother();
1188 if(gMotherIndex != -1) {
1189 AliMCParticle* motherTrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(gMotherIndex));
1191 TParticle *motherParticle = motherTrack->Particle();
1192 if(motherParticle) {
1193 Int_t pdgCodeOfMother = motherParticle->GetPdgCode();
1194 //if((pdgCodeOfMother == 113)||(pdgCodeOfMother == 213)||(pdgCodeOfMother == 221)||(pdgCodeOfMother == 223)||(pdgCodeOfMother == 331)||(pdgCodeOfMother == 333)) {
1195 if(pdgCodeOfMother == 113) {
1196 kExcludeParticle = kTRUE;
1202 //Exclude from the analysis decay products of rho0, rho+, eta, eta' and phi
1203 if(kExcludeParticle) continue;
1206 vCharge = track->Charge();
1207 vPhi = track->Phi();
1210 //Printf("phi (before): %lf",vPhi);
1213 fHistEta->Fill(vEta);
1214 fHistPhi->Fill(vPhi);
1215 fHistRapidity->Fill(vY);
1216 if(vCharge > 0) fHistPhiPos->Fill(vPhi);
1217 else if(vCharge < 0) fHistPhiNeg->Fill(vPhi);
1220 if(fUseFlowAfterBurner) {
1221 Double_t precisionPhi = 0.001;
1222 Int_t maxNumberOfIterations = 100;
1224 Double_t phi0 = vPhi;
1225 Double_t gV2 = fDifferentialV2->Eval(vPt);
1227 for (Int_t j = 0; j < maxNumberOfIterations; j++) {
1228 Double_t phiprev = vPhi;
1229 Double_t fl = vPhi - phi0 + gV2*TMath::Sin(2.*(vPhi - gReactionPlane));
1230 Double_t fp = 1.0 + 2.0*gV2*TMath::Cos(2.*(vPhi - gReactionPlane));
1232 if (TMath::AreEqualAbs(phiprev,vPhi,precisionPhi)) break;
1234 //Printf("phi (after): %lf\n",vPhi);
1235 Double_t vDeltaphiBefore = phi0 - gReactionPlane;
1236 if(vDeltaphiBefore < 0) vDeltaphiBefore += 2*TMath::Pi();
1237 fHistPhiBefore->Fill(vDeltaphiBefore);
1239 Double_t vDeltaphiAfter = vPhi - gReactionPlane;
1240 if(vDeltaphiAfter < 0) vDeltaphiAfter += 2*TMath::Pi();
1241 fHistPhiAfter->Fill(vDeltaphiAfter);
1244 vPhi *= TMath::RadToDeg();
1246 // fill charge vector
1247 chargeVector[0]->push_back(vCharge);
1248 chargeVector[1]->push_back(vY);
1249 chargeVector[2]->push_back(vEta);
1250 chargeVector[3]->push_back(vPhi);
1251 chargeVector[4]->push_back(vP[0]);
1252 chargeVector[5]->push_back(vP[1]);
1253 chargeVector[6]->push_back(vP[2]);
1254 chargeVector[7]->push_back(vPt);
1255 chargeVector[8]->push_back(vE);
1258 chargeVectorShuffle[0]->push_back(vCharge);
1259 chargeVectorShuffle[1]->push_back(vY);
1260 chargeVectorShuffle[2]->push_back(vEta);
1261 chargeVectorShuffle[3]->push_back(vPhi);
1262 chargeVectorShuffle[4]->push_back(vP[0]);
1263 chargeVectorShuffle[5]->push_back(vP[1]);
1264 chargeVectorShuffle[6]->push_back(vP[2]);
1265 chargeVectorShuffle[7]->push_back(vPt);
1266 chargeVectorShuffle[8]->push_back(vE);
1268 gNumberOfAcceptedTracks += 1;
1276 //multiplicity cut (used in pp)
1277 if(fUseMultiplicity) {
1278 if((gNumberOfAcceptedTracks < fNumberOfAcceptedTracksMin)||(gNumberOfAcceptedTracks > fNumberOfAcceptedTracksMax))
1281 fHistNumberOfAcceptedTracks->Fill(gNumberOfAcceptedTracks);
1283 // calculate balance function
1284 if(fUseMultiplicity)
1285 fBalance->CalculateBalance(gNumberOfAcceptedTracks,chargeVector,bSign);
1287 fBalance->CalculateBalance(fCentrality,chargeVector,bSign);
1291 random_shuffle( chargeVectorShuffle[0]->begin(), chargeVectorShuffle[0]->end() );
1292 if(fUseMultiplicity)
1293 fShuffledBalance->CalculateBalance(gNumberOfAcceptedTracks,chargeVectorShuffle,bSign);
1295 fShuffledBalance->CalculateBalance(fCentrality,chargeVectorShuffle,bSign);
1299 //________________________________________________________________________
1300 void AliAnalysisTaskBF::FinishTaskOutput(){
1304 Printf("ERROR: fBalance not available");
1308 if (!fShuffledBalance) {
1309 Printf("ERROR: fShuffledBalance not available");
1316 //________________________________________________________________________
1317 void AliAnalysisTaskBF::Terminate(Option_t *) {
1318 // Draw result to the screen
1319 // Called once at the end of the query
1321 // not implemented ...