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 nAODtrackCutBit(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 // Balance function histograms
269 // Initialize histograms if not done yet
270 if(!fBalance->GetHistNp(0)){
271 AliWarning("Histograms not yet initialized! --> Will be done now");
272 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
273 fBalance->InitHistograms();
277 if(!fShuffledBalance->GetHistNp(0)) {
278 AliWarning("Histograms (shuffling) not yet initialized! --> Will be done now");
279 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
280 fShuffledBalance->InitHistograms();
284 for(Int_t a = 0; a < ANALYSIS_TYPES; a++){
285 fListBF->Add(fBalance->GetHistNp(a));
286 fListBF->Add(fBalance->GetHistNn(a));
287 fListBF->Add(fBalance->GetHistNpn(a));
288 fListBF->Add(fBalance->GetHistNnn(a));
289 fListBF->Add(fBalance->GetHistNpp(a));
290 fListBF->Add(fBalance->GetHistNnp(a));
293 fListBFS->Add(fShuffledBalance->GetHistNp(a));
294 fListBFS->Add(fShuffledBalance->GetHistNn(a));
295 fListBFS->Add(fShuffledBalance->GetHistNpn(a));
296 fListBFS->Add(fShuffledBalance->GetHistNnn(a));
297 fListBFS->Add(fShuffledBalance->GetHistNpp(a));
298 fListBFS->Add(fShuffledBalance->GetHistNnp(a));
302 if(fESDtrackCuts) fList->Add(fESDtrackCuts);
304 //====================PID========================//
306 fPIDCombined = new AliPIDCombined();
307 fPIDCombined->SetDefaultTPCPriors();
309 fHistdEdxVsPTPCbeforePID = new TH2D ("dEdxVsPTPCbefore","dEdxVsPTPCbefore", 1000, -10.0, 10.0, 1000, 0, 1000);
310 fHistListPIDQA->Add(fHistdEdxVsPTPCbeforePID); //addition
312 fHistBetavsPTOFbeforePID = new TH2D ("BetavsPTOFbefore","BetavsPTOFbefore", 1000, -10.0, 10., 1000, 0, 1.2);
313 fHistListPIDQA->Add(fHistBetavsPTOFbeforePID); //addition
315 fHistProbTPCvsPtbeforePID = new TH2D ("ProbTPCvsPtbefore","ProbTPCvsPtbefore", 1000, -10.0,10.0, 1000, 0, 2.0);
316 fHistListPIDQA->Add(fHistProbTPCvsPtbeforePID); //addition
318 fHistProbTOFvsPtbeforePID = new TH2D ("ProbTOFvsPtbefore","ProbTOFvsPtbefore", 1000, -50, 50, 1000, 0, 2.0);
319 fHistListPIDQA->Add(fHistProbTOFvsPtbeforePID); //addition
321 fHistProbTPCTOFvsPtbeforePID =new TH2D ("ProbTPCTOFvsPtbefore","ProbTPCTOFvsPtbefore", 1000, -50, 50, 1000, 0, 2.0);
322 fHistListPIDQA->Add(fHistProbTPCTOFvsPtbeforePID); //addition
324 fHistNSigmaTPCvsPtbeforePID = new TH2D ("NSigmaTPCvsPtbefore","NSigmaTPCvsPtbefore", 1000, -10, 10, 1000, 0, 500);
325 fHistListPIDQA->Add(fHistNSigmaTPCvsPtbeforePID); //addition
327 fHistNSigmaTOFvsPtbeforePID = new TH2D ("NSigmaTOFvsPtbefore","NSigmaTOFvsPtbefore", 1000, -10, 10, 1000, 0, 500);
328 fHistListPIDQA->Add(fHistNSigmaTOFvsPtbeforePID); //addition
330 fHistdEdxVsPTPCafterPID = new TH2D ("dEdxVsPTPCafter","dEdxVsPTPCafter", 1000, -10, 10, 1000, 0, 1000);
331 fHistListPIDQA->Add(fHistdEdxVsPTPCafterPID); //addition
333 fHistBetavsPTOFafterPID = new TH2D ("BetavsPTOFafter","BetavsPTOFafter", 1000, -10, 10, 1000, 0, 1.2);
334 fHistListPIDQA->Add(fHistBetavsPTOFafterPID); //addition
336 fHistProbTPCvsPtafterPID = new TH2D ("ProbTPCvsPtafter","ProbTPCvsPtafter", 1000, -10, 10, 1000, 0, 2);
337 fHistListPIDQA->Add(fHistProbTPCvsPtafterPID); //addition
339 fHistProbTOFvsPtafterPID = new TH2D ("ProbTOFvsPtafter","ProbTOFvsPtafter", 1000, -10, 10, 1000, 0, 2);
340 fHistListPIDQA->Add(fHistProbTOFvsPtafterPID); //addition
342 fHistProbTPCTOFvsPtafterPID =new TH2D ("ProbTPCTOFvsPtafter","ProbTPCTOFvsPtafter", 1000, -50, 50, 1000, 0, 2.0);
343 fHistListPIDQA->Add(fHistProbTPCTOFvsPtafterPID); //addition
345 fHistNSigmaTPCvsPtafterPID = new TH2D ("NSigmaTPCvsPtafter","NSigmaTPCvsPtafter", 1000, -10, 10, 1000, 0, 500);
346 fHistListPIDQA->Add(fHistNSigmaTPCvsPtafterPID); //addition
348 fHistNSigmaTOFvsPtafterPID = new TH2D ("NSigmaTOFvsPtafter","NSigmaTOFvsPtafter", 1000, -10, 10, 1000, 0, 500);
349 fHistListPIDQA->Add(fHistNSigmaTOFvsPtafterPID); //addition
351 //====================PID========================//
355 PostData(2, fListBF);
356 if(fRunShuffling) PostData(3, fListBFS);
357 if(fUsePID) PostData(4, fHistListPIDQA); //PID
360 //________________________________________________________________________
361 void AliAnalysisTaskBF::UserExec(Option_t *) {
363 // Called for each event
364 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
366 AliESDtrack *track_TPC = NULL;
368 Int_t gNumberOfAcceptedTracks = 0;
369 Float_t fCentrality = 0.;
371 // for HBT like cuts need magnetic field sign
372 Float_t bSign = 0; // only used in AOD so far
374 // vector holding the charges/kinematics of all tracks (charge,y,eta,phi,p0,p1,p2,pt,E)
375 vector<Double_t> *chargeVectorShuffle[9]; // this will be shuffled
376 vector<Double_t> *chargeVector[9]; // original charge
377 for(Int_t i = 0; i < 9; i++){
378 chargeVectorShuffle[i] = new vector<Double_t>;
379 chargeVector[i] = new vector<Double_t>;
391 fPIDResponse = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetPIDResponse();
392 if (!fPIDResponse) AliFatal("This Task needs the PID response attached to the inputHandler");
396 if(gAnalysisLevel == "ESD") {
397 AliESDEvent* gESD = dynamic_cast<AliESDEvent*>(InputEvent()); // from TaskSE
399 Printf("ERROR: gESD not available");
403 // store offline trigger bits
404 fHistTriggerStats->Fill(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected());
406 // event selection done in AliAnalysisTaskSE::Exec() --> this is not used
407 fHistEventStats->Fill(1); //all events
408 Bool_t isSelected = kTRUE;
409 if(fUseOfflineTrigger)
410 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
412 fHistEventStats->Fill(2); //triggered events
416 AliCentrality *centrality = gESD->GetCentrality();
418 fCentrality = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
420 // take only events inside centrality class
421 if(!centrality->IsEventInCentralityClass(fCentralityPercentileMin,
422 fCentralityPercentileMax,
423 fCentralityEstimator.Data()))
426 // centrality QA (V0M)
427 fHistV0M->Fill(gESD->GetVZEROData()->GetMTotV0A(), gESD->GetVZEROData()->GetMTotV0C());
430 const AliESDVertex *vertex = gESD->GetPrimaryVertex();
432 if(vertex->GetNContributors() > 0) {
433 if(vertex->GetZRes() != 0) {
434 fHistEventStats->Fill(3); //events with a proper vertex
435 if(TMath::Abs(vertex->GetXv()) < fVxMax) {
436 if(TMath::Abs(vertex->GetYv()) < fVyMax) {
437 if(TMath::Abs(vertex->GetZv()) < fVzMax) {
438 fHistEventStats->Fill(4); //analayzed events
439 fHistVx->Fill(vertex->GetXv());
440 fHistVy->Fill(vertex->GetYv());
441 fHistVz->Fill(vertex->GetZv());
443 //Printf("There are %d tracks in this event", gESD->GetNumberOfTracks());
444 for (Int_t iTracks = 0; iTracks < gESD->GetNumberOfTracks(); iTracks++) {
445 AliESDtrack* track = dynamic_cast<AliESDtrack *>(gESD->GetTrack(iTracks));
447 Printf("ERROR: Could not receive track %d", iTracks);
451 // take only TPC only tracks
452 track_TPC = new AliESDtrack();
453 if(!track->FillTPCOnlyTrack(*track_TPC)) continue;
457 if(!fESDtrackCuts->AcceptTrack(track_TPC)) continue;
459 // fill QA histograms
462 track_TPC->GetImpactParameters(b,bCov);
463 if (bCov[0]<=0 || bCov[2]<=0) {
464 AliDebug(1, "Estimated b resolution lower or equal zero!");
465 bCov[0]=0; bCov[2]=0;
468 Int_t nClustersTPC = -1;
469 nClustersTPC = track_TPC->GetTPCNclsIter1(); // TPC standalone
470 //nClustersTPC = track->GetTPCclusters(0); // global track
471 Float_t chi2PerClusterTPC = -1;
472 if (nClustersTPC!=0) {
473 chi2PerClusterTPC = track_TPC->GetTPCchi2Iter1()/Float_t(nClustersTPC); // TPC standalone
474 //chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC); // global track
477 //===========================PID===============================//
479 Double_t prob[AliPID::kSPECIES]={0.};
480 Double_t probTPC[AliPID::kSPECIES]={0.};
481 Double_t probTOF[AliPID::kSPECIES]={0.};
482 Double_t probTPCTOF[AliPID::kSPECIES]={0.};
484 Double_t nSigma = 0.;
485 UInt_t detUsedTPC = 0;
486 UInt_t detUsedTOF = 0;
487 UInt_t detUsedTPCTOF = 0;
489 //Decide what detector configuration we want to use
490 switch(fPidDetectorConfig) {
492 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
493 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)fParticleOfInterest));
494 detUsedTPC = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPC);
495 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
496 prob[iSpecies] = probTPC[iSpecies];
499 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF);
500 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)fParticleOfInterest));
501 detUsedTOF = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTOF);
502 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
503 prob[iSpecies] = probTOF[iSpecies];
506 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC);
507 detUsedTPCTOF = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPCTOF);
508 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
509 prob[iSpecies] = probTPCTOF[iSpecies];
513 }//end switch: define detector mask
516 Double_t tofTime = -999., length = 999., tof = -999.;
517 Double_t c = TMath::C()*1.E-9;// m/ns
518 Double_t beta = -999.;
519 Double_t nSigmaTOFForParticleOfInterest = -999.;
520 if ( (track->IsOn(AliESDtrack::kTOFin)) &&
521 (track->IsOn(AliESDtrack::kTIME)) ) {
522 tofTime = track->GetTOFsignal();//in ps
523 length = track->GetIntegratedLength();
524 tof = tofTime*1E-3; // ns
527 //Printf("WARNING: track with negative TOF time found! Skipping this track for PID checks\n");
531 //printf("WARNING: track with negative length found!Skipping this track for PID checks\n");
535 length = length*0.01; // in meters
539 nSigmaTOFForParticleOfInterest = fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)fParticleOfInterest);
540 fHistBetavsPTOFbeforePID ->Fill(track->P()*track->Charge(),beta);
541 fHistProbTOFvsPtbeforePID ->Fill(track->Pt(),probTOF[fParticleOfInterest]);
542 fHistNSigmaTOFvsPtbeforePID ->Fill(track->Pt(),nSigmaTOFForParticleOfInterest);
546 Double_t nSigmaTPCForParticleOfInterest = fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)fParticleOfInterest);
547 fHistdEdxVsPTPCbeforePID -> Fill(track->P()*track->Charge(),track->GetTPCsignal());
548 fHistProbTPCvsPtbeforePID -> Fill(track->Pt(),probTPC[fParticleOfInterest]);
549 fHistNSigmaTPCvsPtbeforePID -> Fill(track->Pt(),nSigmaTPCForParticleOfInterest);
550 fHistProbTPCTOFvsPtbeforePID -> Fill(track->Pt(),probTPCTOF[fParticleOfInterest]);
551 //end of QA-before pid
553 if ((detUsedTPC != 0)||(detUsedTOF != 0)||(detUsedTPCTOF != 0)) {
554 //Make the decision based on the n-sigma
556 if(nSigma > fPIDNSigma) continue;}
558 //Make the decision based on the bayesian
559 else if(fUsePIDPropabilities) {
560 if(fParticleOfInterest != TMath::LocMax(AliPID::kSPECIES,prob)) continue;
561 if (prob[fParticleOfInterest] < fMinAcceptedPIDProbability) continue;
564 //Fill QA after the PID
565 fHistBetavsPTOFafterPID ->Fill(track->P()*track->Charge(),beta);
566 fHistProbTOFvsPtafterPID ->Fill(track->Pt(),probTOF[fParticleOfInterest]);
567 fHistNSigmaTOFvsPtafterPID ->Fill(track->Pt(),nSigmaTOFForParticleOfInterest);
569 fHistdEdxVsPTPCafterPID -> Fill(track->P()*track->Charge(),track->GetTPCsignal());
570 fHistProbTPCvsPtafterPID -> Fill(track->Pt(),probTPC[fParticleOfInterest]);
571 fHistProbTPCTOFvsPtafterPID -> Fill(track->Pt(),probTPCTOF[fParticleOfInterest]);
572 fHistNSigmaTPCvsPtafterPID -> Fill(track->Pt(),nSigmaTPCForParticleOfInterest);
575 PostData(4, fHistListPIDQA);
577 //===========================PID===============================//
578 v_charge = track_TPC->Charge();
579 v_y = track_TPC->Y();
580 v_eta = track_TPC->Eta();
581 v_phi = track_TPC->Phi() * TMath::RadToDeg();
582 v_E = track_TPC->E();
583 v_pt = track_TPC->Pt();
584 track_TPC->PxPyPz(v_p);
585 fHistClus->Fill(track_TPC->GetITSclusters(0),nClustersTPC);
586 fHistDCA->Fill(b[1],b[0]);
587 fHistChi2->Fill(chi2PerClusterTPC);
589 fHistEta->Fill(v_eta);
590 fHistPhi->Fill(v_phi);
591 fHistRapidity->Fill(v_y);
592 if(v_charge > 0) fHistPhiPos->Fill(v_phi);
593 else if(v_charge < 0) fHistPhiNeg->Fill(v_phi);
595 // fill charge vector
596 chargeVector[0]->push_back(v_charge);
597 chargeVector[1]->push_back(v_y);
598 chargeVector[2]->push_back(v_eta);
599 chargeVector[3]->push_back(v_phi);
600 chargeVector[4]->push_back(v_p[0]);
601 chargeVector[5]->push_back(v_p[1]);
602 chargeVector[6]->push_back(v_p[2]);
603 chargeVector[7]->push_back(v_pt);
604 chargeVector[8]->push_back(v_E);
607 chargeVectorShuffle[0]->push_back(v_charge);
608 chargeVectorShuffle[1]->push_back(v_y);
609 chargeVectorShuffle[2]->push_back(v_eta);
610 chargeVectorShuffle[3]->push_back(v_phi);
611 chargeVectorShuffle[4]->push_back(v_p[0]);
612 chargeVectorShuffle[5]->push_back(v_p[1]);
613 chargeVectorShuffle[6]->push_back(v_p[2]);
614 chargeVectorShuffle[7]->push_back(v_pt);
615 chargeVectorShuffle[8]->push_back(v_E);
624 }//proper vertex resolution
625 }//proper number of contributors
626 }//vertex object valid
630 //AOD analysis (vertex and track cuts also here!!!!)
631 else if(gAnalysisLevel == "AOD") {
632 AliAODEvent* gAOD = dynamic_cast<AliAODEvent*>(InputEvent()); // from TaskSE
634 Printf("ERROR: gAOD not available");
638 // for HBT like cuts need magnetic field sign
639 bSign = (gAOD->GetMagneticField() > 0) ? 1 : -1;
641 AliAODHeader *aodHeader = gAOD->GetHeader();
643 // store offline trigger bits
644 fHistTriggerStats->Fill(aodHeader->GetOfflineTrigger());
646 // event selection done in AliAnalysisTaskSE::Exec() --> this is not used
647 fHistEventStats->Fill(1); //all events
648 Bool_t isSelected = kTRUE;
649 if(fUseOfflineTrigger)
650 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
652 fHistEventStats->Fill(2); //triggered events
654 //Centrality stuff (centrality in AOD header)
656 fCentrality = aodHeader->GetCentralityP()->GetCentralityPercentile(fCentralityEstimator.Data());
658 // QA for centrality estimators
659 fHistCentStats->Fill(0.,aodHeader->GetCentralityP()->GetCentralityPercentile("V0M"));
660 fHistCentStats->Fill(1.,aodHeader->GetCentralityP()->GetCentralityPercentile("FMD"));
661 fHistCentStats->Fill(2.,aodHeader->GetCentralityP()->GetCentralityPercentile("TRK"));
662 fHistCentStats->Fill(3.,aodHeader->GetCentralityP()->GetCentralityPercentile("TKL"));
663 fHistCentStats->Fill(4.,aodHeader->GetCentralityP()->GetCentralityPercentile("CL0"));
664 fHistCentStats->Fill(5.,aodHeader->GetCentralityP()->GetCentralityPercentile("CL1"));
665 fHistCentStats->Fill(6.,aodHeader->GetCentralityP()->GetCentralityPercentile("V0MvsFMD"));
666 fHistCentStats->Fill(7.,aodHeader->GetCentralityP()->GetCentralityPercentile("TKLvsV0M"));
667 fHistCentStats->Fill(8.,aodHeader->GetCentralityP()->GetCentralityPercentile("ZEMvsZDC"));
669 // take only events inside centrality class
670 if((fCentrality < fCentralityPercentileMin) || (fCentrality > fCentralityPercentileMax))
673 // centrality QA (V0M)
674 fHistV0M->Fill(gAOD->GetVZEROData()->GetMTotV0A(), gAOD->GetVZEROData()->GetMTotV0C());
676 // centrality QA (reference tracks)
677 fHistRefTracks->Fill(0.,aodHeader->GetRefMultiplicity());
678 fHistRefTracks->Fill(1.,aodHeader->GetRefMultiplicityPos());
679 fHistRefTracks->Fill(2.,aodHeader->GetRefMultiplicityNeg());
680 fHistRefTracks->Fill(3.,aodHeader->GetTPConlyRefMultiplicity());
681 fHistRefTracks->Fill(4.,aodHeader->GetNumberOfITSClusters(0));
682 fHistRefTracks->Fill(5.,aodHeader->GetNumberOfITSClusters(1));
683 fHistRefTracks->Fill(6.,aodHeader->GetNumberOfITSClusters(2));
684 fHistRefTracks->Fill(7.,aodHeader->GetNumberOfITSClusters(3));
685 fHistRefTracks->Fill(8.,aodHeader->GetNumberOfITSClusters(4));
688 const AliAODVertex *vertex = gAOD->GetPrimaryVertex();
692 vertex->GetCovarianceMatrix(fCov);
694 if(vertex->GetNContributors() > 0) {
696 fHistEventStats->Fill(3); //events with a proper vertex
697 if(TMath::Abs(vertex->GetX()) < fVxMax) {
698 if(TMath::Abs(vertex->GetY()) < fVyMax) {
699 if(TMath::Abs(vertex->GetZ()) < fVzMax) {
700 fHistEventStats->Fill(4); //analyzed events
701 fHistVx->Fill(vertex->GetX());
702 fHistVy->Fill(vertex->GetY());
703 fHistVz->Fill(vertex->GetZ());
705 //===========================================//
706 TExMap *trackMap = new TExMap();
707 for (Int_t iTracks = 0; iTracks < gAOD->GetNumberOfTracks(); iTracks++) {
708 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack *>(gAOD->GetTrack(iTracks));
710 Printf("ERROR: Could not receive track %d", iTracks);
713 Int_t gID = aodTrack->GetID();
714 //if (!aodTrack->TestFilterBit(nAODtrackCutBit)) trackMap->Add(gID, iTracks);
715 if (aodTrack->TestFilterBit(1)) trackMap->Add(gID, iTracks);
717 AliAODTrack* newAodTrack;
718 //===========================================//
720 //Printf("There are %d tracks in this event", gAOD->GetNumberOfTracks());
721 for (Int_t iTracks = 0; iTracks < gAOD->GetNumberOfTracks(); iTracks++) {
722 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack *>(gAOD->GetTrack(iTracks));
724 Printf("ERROR: Could not receive track %d", iTracks);
729 // For ESD Filter Information: ANALYSIS/macros/AddTaskESDfilter.C
730 //===========================================//
731 // take only TPC only tracks
732 fHistTrackStats->Fill(aodTrack->GetFilterMap());
733 if(!aodTrack->TestFilterBit(nAODtrackCutBit)) continue;
735 Int_t gID = aodTrack->GetID();
736 newAodTrack = gID >= 0 ? aodTrack : gAOD->GetTrack(trackMap->GetValue(-1-gID));
737 //Printf("Label: %d - Pt: %lf (old) - %d - Pt: %lf(new)",gID,aodTrack->Pt(), newAodTrack->GetID(), newAodTrack->Pt());
738 //===========================================//
740 //fHistTrackStats->Fill(aodTrack->GetFilterMap());
741 //if(!aodTrack->TestFilterBit(nAODtrackCutBit)) continue;
743 v_charge = aodTrack->Charge();
745 v_eta = aodTrack->Eta();
746 v_phi = aodTrack->Phi() * TMath::RadToDeg();
748 v_pt = aodTrack->Pt();
749 aodTrack->PxPyPz(v_p);
751 Float_t DCAxy = aodTrack->DCA(); // this is the DCA from global track (not exactly what is cut on)
752 Float_t DCAz = aodTrack->ZAtDCA(); // this is the DCA from global track (not exactly what is cut on)
755 // Kinematics cuts from ESD track cuts
756 if( v_pt < fPtMin || v_pt > fPtMax) continue;
759 if( v_eta < fEtaMin || v_eta > fEtaMax) continue;
763 if( v_y < fEtaMin || v_y > fEtaMax) continue;
766 // Extra DCA cuts (for systematic studies [!= -1])
767 if( fDCAxyCut != -1 && fDCAzCut != -1){
768 if(TMath::Sqrt((DCAxy*DCAxy)/(fDCAxyCut*fDCAxyCut)+(DCAz*DCAz)/(fDCAzCut*fDCAzCut)) > 1 ){
773 // Extra TPC cuts (for systematic studies [!= -1])
774 if( fTPCchi2Cut != -1 && aodTrack->Chi2perNDF() > fTPCchi2Cut){
777 if( fNClustersTPCCut != -1 && aodTrack->GetTPCNcls() < fNClustersTPCCut){
781 //===============================================PID==================================//
783 Double_t prob[AliPID::kSPECIES]={0.};
784 Double_t probTPC[AliPID::kSPECIES]={0.};
785 Double_t probTOF[AliPID::kSPECIES]={0.};
786 Double_t probTPCTOF[AliPID::kSPECIES]={0.};
788 Double_t nSigma = 0.;
789 UInt_t detUsedTPC = 0;
790 UInt_t detUsedTOF = 0;
791 UInt_t detUsedTPCTOF = 0;
793 //Decide what detector configuration we want to use
794 switch(fPidDetectorConfig) {
796 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
797 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(newAodTrack,(AliPID::EParticleType)fParticleOfInterest));
798 //detUsedTPC = fPIDCombined->ComputeProbabilities(aodTrack, fPIDResponse, probTPC);
799 detUsedTPC = (AliPIDResponse::kDetTPC);
800 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
801 prob[iSpecies] = probTPC[iSpecies];
804 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF);
805 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(newAodTrack,(AliPID::EParticleType)fParticleOfInterest));
806 //detUsedTOF = fPIDCombined->ComputeProbabilities(aodTrack, fPIDResponse, probTOF);
807 detUsedTPC = (AliPIDResponse::kDetTPC);
808 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
809 prob[iSpecies] = probTOF[iSpecies];
812 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC);
813 //detUsedTPCTOF = fPIDCombined->ComputeProbabilities(newAodTrack, fPIDResponse, probTPCTOF);
814 detUsedTPC = (AliPIDResponse::kDetTPC);
815 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
816 prob[iSpecies] = probTPCTOF[iSpecies];
820 }//end switch: define detector mask
823 Double_t tofTime = -999., tof = -999.; //length = 999., tof = -999.;
824 //Double_t c = TMath::C()*1.E-9;// m/ns
825 //Double_t beta = -999.;
826 Double_t nSigmaTOFForParticleOfInterest = -999.;
827 if ( (newAodTrack->IsOn(AliAODTrack::kTOFin)) &&
828 (newAodTrack->IsOn(AliAODTrack::kTIME)) ) {
829 tofTime = newAodTrack->GetTOFsignal();//in ps
830 //length = newAodTrack->GetIntegratedLength();
831 tof = tofTime*1E-3; // ns
834 //Printf("WARNING: track with negative TOF time found! Skipping this track for PID checks\n");
838 //printf("WARNING: track with negative length found!Skipping this track for PID checks\n");
842 //length = length*0.01; // in meters
846 nSigmaTOFForParticleOfInterest = fPIDResponse->NumberOfSigmasTOF(newAodTrack,(AliPID::EParticleType)fParticleOfInterest);
847 //fHistBetavsPTOFbeforePID ->Fill(aodTrack->P()*aodTrack->Charge(),beta);
848 fHistProbTOFvsPtbeforePID ->Fill(newAodTrack->Pt(),probTOF[fParticleOfInterest]);
849 fHistNSigmaTOFvsPtbeforePID ->Fill(newAodTrack->Pt(),nSigmaTOFForParticleOfInterest);
853 Double_t nSigmaTPCForParticleOfInterest = fPIDResponse->NumberOfSigmasTPC(newAodTrack,(AliPID::EParticleType)fParticleOfInterest);
854 fHistdEdxVsPTPCbeforePID -> Fill(newAodTrack->P()*newAodTrack->Charge(),newAodTrack->GetTPCsignal());
855 fHistProbTPCvsPtbeforePID -> Fill(newAodTrack->Pt(),probTPC[fParticleOfInterest]);
856 fHistNSigmaTPCvsPtbeforePID -> Fill(newAodTrack->Pt(),nSigmaTPCForParticleOfInterest);
857 fHistProbTPCTOFvsPtbeforePID -> Fill(newAodTrack->Pt(),probTPCTOF[fParticleOfInterest]);
858 //end of QA-before pid
860 if ((detUsedTPC != 0)||(detUsedTOF != 0)||(detUsedTPCTOF != 0)) {
861 //Make the decision based on the n-sigma
863 if(nSigma > fPIDNSigma) continue;}
865 //Make the decision based on the bayesian
866 else if(fUsePIDPropabilities) {
867 if(fParticleOfInterest != TMath::LocMax(AliPID::kSPECIES,prob)) continue;
868 if (prob[fParticleOfInterest] < fMinAcceptedPIDProbability) continue;
871 //Fill QA after the PID
872 //fHistBetavsPTOFafterPID ->Fill(newAodTrack->P()*newAodTrack->Charge(),beta);
873 fHistProbTOFvsPtafterPID ->Fill(newAodTrack->Pt(),probTOF[fParticleOfInterest]);
874 fHistNSigmaTOFvsPtafterPID ->Fill(newAodTrack->Pt(),nSigmaTOFForParticleOfInterest);
876 fHistdEdxVsPTPCafterPID -> Fill(newAodTrack->P()*newAodTrack->Charge(),newAodTrack->GetTPCsignal());
877 fHistProbTPCvsPtafterPID -> Fill(newAodTrack->Pt(),probTPC[fParticleOfInterest]);
878 fHistProbTPCTOFvsPtafterPID -> Fill(newAodTrack->Pt(),probTPCTOF[fParticleOfInterest]);
879 fHistNSigmaTPCvsPtafterPID -> Fill(newAodTrack->Pt(),nSigmaTPCForParticleOfInterest);
882 PostData(4, fHistListPIDQA);
885 //=========================================================PID=================================================================//
887 // fill QA histograms
888 fHistClus->Fill(aodTrack->GetITSNcls(),aodTrack->GetTPCNcls());
889 fHistDCA->Fill(DCAz,DCAxy);
890 fHistChi2->Fill(aodTrack->Chi2perNDF());
892 fHistEta->Fill(v_eta);
893 fHistPhi->Fill(v_phi);
894 fHistRapidity->Fill(v_y);
895 if(v_charge > 0) fHistPhiPos->Fill(v_phi);
896 else if(v_charge < 0) fHistPhiNeg->Fill(v_phi);
898 // fill charge vector
899 chargeVector[0]->push_back(v_charge);
900 chargeVector[1]->push_back(v_y);
901 chargeVector[2]->push_back(v_eta);
902 chargeVector[3]->push_back(v_phi);
903 chargeVector[4]->push_back(v_p[0]);
904 chargeVector[5]->push_back(v_p[1]);
905 chargeVector[6]->push_back(v_p[2]);
906 chargeVector[7]->push_back(v_pt);
907 chargeVector[8]->push_back(v_E);
910 chargeVectorShuffle[0]->push_back(v_charge);
911 chargeVectorShuffle[1]->push_back(v_y);
912 chargeVectorShuffle[2]->push_back(v_eta);
913 chargeVectorShuffle[3]->push_back(v_phi);
914 chargeVectorShuffle[4]->push_back(v_p[0]);
915 chargeVectorShuffle[5]->push_back(v_p[1]);
916 chargeVectorShuffle[6]->push_back(v_p[2]);
917 chargeVectorShuffle[7]->push_back(v_pt);
918 chargeVectorShuffle[8]->push_back(v_E);
921 gNumberOfAcceptedTracks += 1;
927 }//proper vertex resolution
928 }//proper number of contributors
929 }//vertex object valid
934 if(gAnalysisLevel == "MCESD") {
935 AliMCEvent* mcEvent = MCEvent();
937 Printf("ERROR: mcEvent not available");
941 AliESDEvent* gESD = dynamic_cast<AliESDEvent*>(InputEvent()); // from TaskSE
943 Printf("ERROR: gESD not available");
947 // store offline trigger bits
948 fHistTriggerStats->Fill(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected());
950 // event selection done in AliAnalysisTaskSE::Exec() --> this is not used
951 fHistEventStats->Fill(1); //all events
952 Bool_t isSelected = kTRUE;
953 if(fUseOfflineTrigger)
954 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
956 fHistEventStats->Fill(2); //triggered events
960 AliCentrality *centrality = gESD->GetCentrality();
962 fCentrality = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
964 // take only events inside centrality class
965 if(!centrality->IsEventInCentralityClass(fCentralityPercentileMin,
966 fCentralityPercentileMax,
967 fCentralityEstimator.Data()))
970 // centrality QA (V0M)
971 fHistV0M->Fill(gESD->GetVZEROData()->GetMTotV0A(), gESD->GetVZEROData()->GetMTotV0C());
974 const AliESDVertex *vertex = gESD->GetPrimaryVertex();
976 if(vertex->GetNContributors() > 0) {
977 if(vertex->GetZRes() != 0) {
978 fHistEventStats->Fill(3); //events with a proper vertex
979 if(TMath::Abs(vertex->GetXv()) < fVxMax) {
980 if(TMath::Abs(vertex->GetYv()) < fVyMax) {
981 if(TMath::Abs(vertex->GetZv()) < fVzMax) {
982 fHistEventStats->Fill(4); //analayzed events
983 fHistVx->Fill(vertex->GetXv());
984 fHistVy->Fill(vertex->GetYv());
985 fHistVz->Fill(vertex->GetZv());
987 //Printf("There are %d tracks in this event", gESD->GetNumberOfTracks());
988 for (Int_t iTracks = 0; iTracks < gESD->GetNumberOfTracks(); iTracks++) {
989 AliESDtrack* track = dynamic_cast<AliESDtrack *>(gESD->GetTrack(iTracks));
991 Printf("ERROR: Could not receive track %d", iTracks);
995 Int_t label = TMath::Abs(track->GetLabel());
996 if(label > mcEvent->GetNumberOfTracks()) continue;
997 if(label > mcEvent->GetNumberOfPrimaries()) continue;
999 AliMCParticle* mcTrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(label));
1000 if(!mcTrack) continue;
1002 // take only TPC only tracks
1003 track_TPC = new AliESDtrack();
1004 if(!track->FillTPCOnlyTrack(*track_TPC)) continue;
1008 if(!fESDtrackCuts->AcceptTrack(track_TPC)) continue;
1010 // fill QA histograms
1013 track_TPC->GetImpactParameters(b,bCov);
1014 if (bCov[0]<=0 || bCov[2]<=0) {
1015 AliDebug(1, "Estimated b resolution lower or equal zero!");
1016 bCov[0]=0; bCov[2]=0;
1019 Int_t nClustersTPC = -1;
1020 nClustersTPC = track_TPC->GetTPCNclsIter1(); // TPC standalone
1021 //nClustersTPC = track->GetTPCclusters(0); // global track
1022 Float_t chi2PerClusterTPC = -1;
1023 if (nClustersTPC!=0) {
1024 chi2PerClusterTPC = track_TPC->GetTPCchi2Iter1()/Float_t(nClustersTPC); // TPC standalone
1025 //chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC); // global track
1028 v_charge = track_TPC->Charge();
1029 v_y = track_TPC->Y();
1030 v_eta = track_TPC->Eta();
1031 v_phi = track_TPC->Phi() * TMath::RadToDeg();
1032 v_E = track_TPC->E();
1033 v_pt = track_TPC->Pt();
1034 track_TPC->PxPyPz(v_p);
1036 fHistClus->Fill(track_TPC->GetITSclusters(0),nClustersTPC);
1037 fHistDCA->Fill(b[1],b[0]);
1038 fHistChi2->Fill(chi2PerClusterTPC);
1039 fHistPt->Fill(v_pt);
1040 fHistEta->Fill(v_eta);
1041 fHistPhi->Fill(v_phi);
1042 fHistRapidity->Fill(v_y);
1043 if(v_charge > 0) fHistPhiPos->Fill(v_phi);
1044 else if(v_charge < 0) fHistPhiNeg->Fill(v_phi);
1046 // fill charge vector
1047 chargeVector[0]->push_back(v_charge);
1048 chargeVector[1]->push_back(v_y);
1049 chargeVector[2]->push_back(v_eta);
1050 chargeVector[3]->push_back(v_phi);
1051 chargeVector[4]->push_back(v_p[0]);
1052 chargeVector[5]->push_back(v_p[1]);
1053 chargeVector[6]->push_back(v_p[2]);
1054 chargeVector[7]->push_back(v_pt);
1055 chargeVector[8]->push_back(v_E);
1058 chargeVectorShuffle[0]->push_back(v_charge);
1059 chargeVectorShuffle[1]->push_back(v_y);
1060 chargeVectorShuffle[2]->push_back(v_eta);
1061 chargeVectorShuffle[3]->push_back(v_phi);
1062 chargeVectorShuffle[4]->push_back(v_p[0]);
1063 chargeVectorShuffle[5]->push_back(v_p[1]);
1064 chargeVectorShuffle[6]->push_back(v_p[2]);
1065 chargeVectorShuffle[7]->push_back(v_pt);
1066 chargeVectorShuffle[8]->push_back(v_E);
1070 gNumberOfAcceptedTracks += 1;
1076 }//proper vertex resolution
1077 }//proper number of contributors
1078 }//vertex object valid
1083 else if(gAnalysisLevel == "MC") {
1084 AliMCEvent* mcEvent = MCEvent();
1086 Printf("ERROR: mcEvent not available");
1089 fHistEventStats->Fill(1); //total events
1090 fHistEventStats->Fill(2); //offline trigger
1092 Double_t gReactionPlane = 0., gImpactParameter = 0.;
1093 if(fUseCentrality) {
1095 AliGenHijingEventHeader* headerH = dynamic_cast<AliGenHijingEventHeader*>(mcEvent->GenEventHeader());
1097 //Printf("=====================================================");
1098 //Printf("Reaction plane angle: %lf",headerH->ReactionPlaneAngle());
1099 //Printf("Impact parameter: %lf",headerH->ImpactParameter());
1100 //Printf("=====================================================");
1101 gReactionPlane = headerH->ReactionPlaneAngle();
1102 gImpactParameter = headerH->ImpactParameter();
1103 fCentrality = gImpactParameter;
1105 fCentrality = gImpactParameter;
1107 // take only events inside centrality class (DIDN'T CHANGE THIS UP TO NOW)
1108 if((fImpactParameterMin > gImpactParameter) || (fImpactParameterMax < gImpactParameter))
1112 AliGenEventHeader *header = mcEvent->GenEventHeader();
1115 TArrayF gVertexArray;
1116 header->PrimaryVertex(gVertexArray);
1117 //Printf("Vertex: %lf (x) - %lf (y) - %lf (z)",
1118 //gVertexArray.At(0),
1119 //gVertexArray.At(1),
1120 //gVertexArray.At(2));
1121 fHistEventStats->Fill(3); //events with a proper vertex
1122 if(TMath::Abs(gVertexArray.At(0)) < fVxMax) {
1123 if(TMath::Abs(gVertexArray.At(1)) < fVyMax) {
1124 if(TMath::Abs(gVertexArray.At(2)) < fVzMax) {
1125 fHistEventStats->Fill(4); //analayzed events
1126 fHistVx->Fill(gVertexArray.At(0));
1127 fHistVy->Fill(gVertexArray.At(1));
1128 fHistVz->Fill(gVertexArray.At(2));
1130 Printf("There are %d tracks in this event", mcEvent->GetNumberOfPrimaries());
1131 for (Int_t iTracks = 0; iTracks < mcEvent->GetNumberOfPrimaries(); iTracks++) {
1132 AliMCParticle* track = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(iTracks));
1134 Printf("ERROR: Could not receive particle %d", iTracks);
1138 //exclude non stable particles
1139 if(!mcEvent->IsPhysicalPrimary(iTracks)) continue;
1141 v_eta = track->Eta();
1145 if( v_pt < fPtMin || v_pt > fPtMax)
1148 if( v_eta < fEtaMin || v_eta > fEtaMax) continue;
1151 if( v_y < fEtaMin || v_y > fEtaMax) continue;
1154 //analyze one set of particles
1156 TParticle *particle = track->Particle();
1157 if(!particle) continue;
1159 Int_t gPdgCode = particle->GetPdgCode();
1160 if(TMath::Abs(fPDGCodeToBeAnalyzed) != TMath::Abs(gPdgCode))
1164 //Use the acceptance parameterization
1165 if(fAcceptanceParameterization) {
1166 Double_t gRandomNumber = gRandom->Rndm();
1167 if(gRandomNumber > fAcceptanceParameterization->Eval(track->Pt()))
1171 //Exclude resonances
1172 if(fExcludeResonancesInMC) {
1173 TParticle *particle = track->Particle();
1174 if(!particle) continue;
1176 Bool_t kExcludeParticle = kFALSE;
1177 Int_t gMotherIndex = particle->GetFirstMother();
1178 if(gMotherIndex != -1) {
1179 AliMCParticle* motherTrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(gMotherIndex));
1181 TParticle *motherParticle = motherTrack->Particle();
1182 if(motherParticle) {
1183 Int_t pdgCodeOfMother = motherParticle->GetPdgCode();
1184 //if((pdgCodeOfMother == 113)||(pdgCodeOfMother == 213)||(pdgCodeOfMother == 221)||(pdgCodeOfMother == 223)||(pdgCodeOfMother == 331)||(pdgCodeOfMother == 333)) {
1185 if(pdgCodeOfMother == 113) {
1186 kExcludeParticle = kTRUE;
1192 //Exclude from the analysis decay products of rho0, rho+, eta, eta' and phi
1193 if(kExcludeParticle) continue;
1196 v_charge = track->Charge();
1197 v_phi = track->Phi();
1200 //Printf("phi (before): %lf",v_phi);
1202 fHistPt->Fill(v_pt);
1203 fHistEta->Fill(v_eta);
1204 fHistPhi->Fill(v_phi);
1205 fHistRapidity->Fill(v_y);
1206 if(v_charge > 0) fHistPhiPos->Fill(v_phi);
1207 else if(v_charge < 0) fHistPhiNeg->Fill(v_phi);
1210 if(fUseFlowAfterBurner) {
1211 Double_t precisionPhi = 0.001;
1212 Int_t maxNumberOfIterations = 100;
1214 Double_t phi0 = v_phi;
1215 Double_t gV2 = fDifferentialV2->Eval(v_pt);
1217 for (Int_t j = 0; j < maxNumberOfIterations; j++) {
1218 Double_t phiprev = v_phi;
1219 Double_t fl = v_phi - phi0 + gV2*TMath::Sin(2.*(v_phi - gReactionPlane));
1220 Double_t fp = 1.0 + 2.0*gV2*TMath::Cos(2.*(v_phi - gReactionPlane));
1222 if (TMath::AreEqualAbs(phiprev,v_phi,precisionPhi)) break;
1224 //Printf("phi (after): %lf\n",v_phi);
1225 Double_t v_DeltaphiBefore = phi0 - gReactionPlane;
1226 if(v_DeltaphiBefore < 0) v_DeltaphiBefore += 2*TMath::Pi();
1227 fHistPhiBefore->Fill(v_DeltaphiBefore);
1229 Double_t v_DeltaphiAfter = v_phi - gReactionPlane;
1230 if(v_DeltaphiAfter < 0) v_DeltaphiAfter += 2*TMath::Pi();
1231 fHistPhiAfter->Fill(v_DeltaphiAfter);
1234 v_phi *= TMath::RadToDeg();
1236 // fill charge vector
1237 chargeVector[0]->push_back(v_charge);
1238 chargeVector[1]->push_back(v_y);
1239 chargeVector[2]->push_back(v_eta);
1240 chargeVector[3]->push_back(v_phi);
1241 chargeVector[4]->push_back(v_p[0]);
1242 chargeVector[5]->push_back(v_p[1]);
1243 chargeVector[6]->push_back(v_p[2]);
1244 chargeVector[7]->push_back(v_pt);
1245 chargeVector[8]->push_back(v_E);
1248 chargeVectorShuffle[0]->push_back(v_charge);
1249 chargeVectorShuffle[1]->push_back(v_y);
1250 chargeVectorShuffle[2]->push_back(v_eta);
1251 chargeVectorShuffle[3]->push_back(v_phi);
1252 chargeVectorShuffle[4]->push_back(v_p[0]);
1253 chargeVectorShuffle[5]->push_back(v_p[1]);
1254 chargeVectorShuffle[6]->push_back(v_p[2]);
1255 chargeVectorShuffle[7]->push_back(v_pt);
1256 chargeVectorShuffle[8]->push_back(v_E);
1258 gNumberOfAcceptedTracks += 1;
1266 //multiplicity cut (used in pp)
1267 if(fUseMultiplicity) {
1268 if((gNumberOfAcceptedTracks < fNumberOfAcceptedTracksMin)||(gNumberOfAcceptedTracks > fNumberOfAcceptedTracksMax))
1271 fHistNumberOfAcceptedTracks->Fill(gNumberOfAcceptedTracks);
1273 // calculate balance function
1274 if(fUseMultiplicity)
1275 fBalance->CalculateBalance(gNumberOfAcceptedTracks,chargeVector,bSign);
1277 fBalance->CalculateBalance(fCentrality,chargeVector,bSign);
1281 random_shuffle( chargeVectorShuffle[0]->begin(), chargeVectorShuffle[0]->end() );
1282 if(fUseMultiplicity)
1283 fShuffledBalance->CalculateBalance(gNumberOfAcceptedTracks,chargeVectorShuffle,bSign);
1285 fShuffledBalance->CalculateBalance(fCentrality,chargeVectorShuffle,bSign);
1289 //________________________________________________________________________
1290 void AliAnalysisTaskBF::FinishTaskOutput(){
1294 Printf("ERROR: fBalance not available");
1298 if (!fShuffledBalance) {
1299 Printf("ERROR: fShuffledBalance not available");
1306 //________________________________________________________________________
1307 void AliAnalysisTaskBF::Terminate(Option_t *) {
1308 // Draw result to the screen
1309 // Called once at the end of the query
1311 // not implemented ...