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 "AliGenEventHeader.h"
\r
24 #include "AliGenHijingEventHeader.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
31 #include "AliPID.h"
\r
32 #include "AliPIDResponse.h"
\r
33 #include "AliPIDCombined.h"
\r
35 #include "AliAnalysisTaskBFPsi.h"
\r
36 #include "AliBalancePsi.h"
\r
39 // Analysis task for the BF vs Psi code
\r
40 // Authors: Panos.Christakoglou@nikhef.nl
\r
42 ClassImp(AliAnalysisTaskBFPsi)
\r
44 //________________________________________________________________________
\r
45 AliAnalysisTaskBFPsi::AliAnalysisTaskBFPsi(const char *name)
\r
46 : AliAnalysisTaskSE(name),
\r
48 fRunShuffling(kFALSE),
\r
49 fShuffledBalance(0),
\r
56 fHistTriggerStats(0),
\r
75 fHistdEdxVsPTPCbeforePID(NULL),
\r
76 fHistBetavsPTOFbeforePID(NULL),
\r
77 fHistProbTPCvsPtbeforePID(NULL),
\r
78 fHistProbTOFvsPtbeforePID(NULL),
\r
79 fHistProbTPCTOFvsPtbeforePID(NULL),
\r
80 fHistNSigmaTPCvsPtbeforePID(NULL),
\r
81 fHistNSigmaTOFvsPtbeforePID(NULL),
\r
82 fHistdEdxVsPTPCafterPID(NULL),
\r
83 fHistBetavsPTOFafterPID(NULL),
\r
84 fHistProbTPCvsPtafterPID(NULL),
\r
85 fHistProbTOFvsPtafterPID(NULL),
\r
86 fHistProbTPCTOFvsPtafterPID(NULL),
\r
87 fHistNSigmaTPCvsPtafterPID(NULL),
\r
88 fHistNSigmaTOFvsPtafterPID(NULL),
\r
91 fParticleOfInterest(kPion),
\r
92 fPidDetectorConfig(kTPCTOF),
\r
94 fUsePIDnSigma(kTRUE),
\r
95 fUsePIDPropabilities(kFALSE),
\r
97 fMinAcceptedPIDProbability(0.8),
\r
99 fCentralityEstimator("V0M"),
\r
100 fUseCentrality(kFALSE),
\r
101 fCentralityPercentileMin(0.),
\r
102 fCentralityPercentileMax(5.),
\r
103 fImpactParameterMin(0.),
\r
104 fImpactParameterMax(20.),
\r
105 fUseMultiplicity(kFALSE),
\r
106 fNumberOfAcceptedTracksMin(0),
\r
107 fNumberOfAcceptedTracksMax(10000),
\r
108 fHistNumberOfAcceptedTracks(0),
\r
109 fUseOfflineTrigger(kFALSE),
\r
113 nAODtrackCutBit(128),
\r
121 fNClustersTPCCut(-1),
\r
122 fAcceptanceParameterization(0),
\r
123 fDifferentialV2(0),
\r
124 fUseFlowAfterBurner(kFALSE),
\r
125 fExcludeResonancesInMC(kFALSE),
\r
126 fUseMCPdgCode(kFALSE),
\r
127 fPDGCodeToBeAnalyzed(-1) {
\r
129 // Define input and output slots here
\r
130 // Input slot #0 works with a TChain
\r
131 DefineInput(0, TChain::Class());
\r
132 // Output slot #0 writes into a TH1 container
\r
133 DefineOutput(1, TList::Class());
\r
134 DefineOutput(2, TList::Class());
\r
135 DefineOutput(3, TList::Class());
\r
136 DefineOutput(4, TList::Class());
\r
139 //________________________________________________________________________
\r
140 AliAnalysisTaskBFPsi::~AliAnalysisTaskBFPsi() {
\r
142 // delete fBalance;
\r
143 // delete fShuffledBalance;
\r
145 // delete fListBF;
\r
146 // delete fListBFS;
\r
148 // delete fHistEventStats;
\r
149 // delete fHistTrackStats;
\r
150 // delete fHistVx;
\r
151 // delete fHistVy;
\r
152 // delete fHistVz;
\r
154 // delete fHistClus;
\r
155 // delete fHistDCA;
\r
156 // delete fHistChi2;
\r
158 // delete fHistEta;
\r
159 // delete fHistPhi;
\r
160 // delete fHistV0M;
\r
163 //________________________________________________________________________
\r
164 void AliAnalysisTaskBFPsi::UserCreateOutputObjects() {
\r
165 // Create histograms
\r
168 fBalance = new AliBalancePsi();
\r
169 fBalance->SetAnalysisLevel("ESD");
\r
170 //fBalance->SetNumberOfBins(-1,16);
\r
171 fBalance->SetInterval(-1,-0.8,0.8,16,0.,1.6,15.);
\r
173 if(fRunShuffling) {
\r
174 if(!fShuffledBalance) {
\r
175 fShuffledBalance = new AliBalancePsi();
\r
176 fShuffledBalance->SetAnalysisLevel("ESD");
\r
177 //fShuffledBalance->SetNumberOfBins(-1,16);
\r
178 fShuffledBalance->SetInterval(-1,-0.8,0.8,16,0.,1.6,15.);
\r
183 fList = new TList();
\r
184 fList->SetName("listQA");
\r
187 //Balance Function list
\r
188 fListBF = new TList();
\r
189 fListBF->SetName("listBF");
\r
190 fListBF->SetOwner();
\r
192 if(fRunShuffling) {
\r
193 fListBFS = new TList();
\r
194 fListBFS->SetName("listBFShuffled");
\r
195 fListBFS->SetOwner();
\r
200 fHistListPIDQA = new TList();
\r
201 fHistListPIDQA->SetName("listQAPID");
\r
202 fHistListPIDQA->SetOwner();
\r
206 TString gCutName[4] = {"Total","Offline trigger",
\r
207 "Vertex","Analyzed"};
\r
208 fHistEventStats = new TH2F("fHistEventStats",
\r
209 "Event statistics;;Centrality percentile;N_{events}",
\r
210 4,0.5,4.5,220,-5,105);
\r
211 for(Int_t i = 1; i <= 4; i++)
\r
212 fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1].Data());
\r
213 fList->Add(fHistEventStats);
\r
215 TString gCentName[9] = {"V0M","FMD","TRK","TKL","CL0","CL1","V0MvsFMD","TKLvsV0M","ZEMvsZDC"};
\r
216 fHistCentStats = new TH2F("fHistCentStats",
\r
217 "Centrality statistics;;Cent percentile",
\r
218 9,-0.5,8.5,220,-5,105);
\r
219 for(Int_t i = 1; i <= 9; i++)
\r
220 fHistCentStats->GetXaxis()->SetBinLabel(i,gCentName[i-1].Data());
\r
221 fList->Add(fHistCentStats);
\r
223 fHistTriggerStats = new TH1F("fHistTriggerStats","Trigger statistics;TriggerBit;N_{events}",130,0,130);
\r
224 fList->Add(fHistTriggerStats);
\r
226 fHistTrackStats = new TH1F("fHistTrackStats","Event statistics;TrackFilterBit;N_{events}",130,0,130);
\r
227 fList->Add(fHistTrackStats);
\r
229 fHistNumberOfAcceptedTracks = new TH2F("fHistNumberOfAcceptedTracks",";N_{acc.};Centrality percentile;Entries",4001,-0.5,4000.5,220,-5,105);
\r
230 fList->Add(fHistNumberOfAcceptedTracks);
\r
232 // Vertex distributions
\r
233 fHistVx = new TH1F("fHistVx","Primary vertex distribution - x coordinate;V_{x} (cm);Entries",100,-0.5,0.5);
\r
234 fList->Add(fHistVx);
\r
235 fHistVy = new TH1F("fHistVy","Primary vertex distribution - y coordinate;V_{y} (cm);Entries",100,-0.5,0.5);
\r
236 fList->Add(fHistVy);
\r
237 fHistVz = new TH2F("fHistVz","Primary vertex distribution - z coordinate;V_{z} (cm);Centrality percentile;Entries",100,-20.,20.,220,-5,105);
\r
238 fList->Add(fHistVz);
\r
241 fHistEventPlane = new TH2F("fHistEventPlane",";#Psi_{2} [deg.];Centrality percentile;Counts",100,0,360.,220,-5,105);
\r
242 fList->Add(fHistEventPlane);
\r
245 fHistClus = new TH2F("fHistClus","# Cluster (TPC vs. ITS)",10,0,10,200,0,200);
\r
246 fList->Add(fHistClus);
\r
247 fHistChi2 = new TH2F("fHistChi2","Chi2/NDF distribution;#chi^{2}/ndf;Centrality percentile",200,0,10,220,-5,105);
\r
248 fList->Add(fHistChi2);
\r
249 fHistDCA = new TH2F("fHistDCA","DCA (xy vs. z)",400,-5,5,400,-5,5);
\r
250 fList->Add(fHistDCA);
\r
251 fHistPt = new TH2F("fHistPt","p_{T} distribution;p_{T} (GeV/c);Centrality percentile",200,0,10,220,-5,105);
\r
252 fList->Add(fHistPt);
\r
253 fHistEta = new TH2F("fHistEta","#eta distribution;#eta;Centrality percentile",200,-2,2,220,-5,105);
\r
254 fList->Add(fHistEta);
\r
255 fHistRapidity = new TH2F("fHistRapidity","y distribution;y;Centrality percentile",200,-2,2,220,-5,105);
\r
256 fList->Add(fHistRapidity);
\r
257 fHistPhi = new TH2F("fHistPhi","#phi distribution;#phi;Centrality percentile",200,-20,380,220,-5,105);
\r
258 fList->Add(fHistPhi);
\r
259 fHistPhiBefore = new TH2F("fHistPhiBefore","#phi distribution;#phi;Centrality percentile",200,0.,2*TMath::Pi(),220,-5,105);
\r
260 fList->Add(fHistPhiBefore);
\r
261 fHistPhiAfter = new TH2F("fHistPhiAfter","#phi distribution;#phi;Centrality percentile",200,0.,2*TMath::Pi(),220,-5,105);
\r
262 fList->Add(fHistPhiAfter);
\r
263 fHistPhiPos = new TH2F("fHistPhiPos","#phi distribution for positive particles;#phi;Centrality percentile",200,-20,380,220,-5,105);
\r
264 fList->Add(fHistPhiPos);
\r
265 fHistPhiNeg = new TH2F("fHistPhiNeg","#phi distribution for negative particles;#phi;Centrality percentile",200,-20,380,220,-5,105);
\r
266 fList->Add(fHistPhiNeg);
\r
267 fHistV0M = new TH2F("fHistV0M","V0 Multiplicity C vs. A",500, 0, 20000, 500, 0, 20000);
\r
268 fList->Add(fHistV0M);
\r
269 TString gRefTrackName[6] = {"tracks","tracksPos","tracksNeg","tracksTPConly","clusITS0","clusITS1"};
\r
270 fHistRefTracks = new TH2F("fHistRefTracks","Nr of Ref tracks/event vs. ref track estimator;;Nr of tracks",6, 0, 6, 400, 0, 20000);
\r
271 for(Int_t i = 1; i <= 6; i++)
\r
272 fHistRefTracks->GetXaxis()->SetBinLabel(i,gRefTrackName[i-1].Data());
\r
273 fList->Add(fHistRefTracks);
\r
275 // Balance function histograms
\r
276 // Initialize histograms if not done yet
\r
277 if(!fBalance->GetHistNp(0)){
\r
278 AliWarning("Histograms not yet initialized! --> Will be done now");
\r
279 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
\r
280 fBalance->InitHistograms();
\r
283 if(fRunShuffling) {
\r
284 if(!fShuffledBalance->GetHistNp(0)) {
\r
285 AliWarning("Histograms (shuffling) not yet initialized! --> Will be done now");
\r
286 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
\r
287 fShuffledBalance->InitHistograms();
\r
291 for(Int_t a = 0; a < ANALYSIS_TYPES; a++){
\r
292 fListBF->Add(fBalance->GetHistNp(a));
\r
293 fListBF->Add(fBalance->GetHistNn(a));
\r
294 fListBF->Add(fBalance->GetHistNpn(a));
\r
295 fListBF->Add(fBalance->GetHistNnn(a));
\r
296 fListBF->Add(fBalance->GetHistNpp(a));
\r
297 fListBF->Add(fBalance->GetHistNnp(a));
\r
299 if(fRunShuffling) {
\r
300 fListBFS->Add(fShuffledBalance->GetHistNp(a));
\r
301 fListBFS->Add(fShuffledBalance->GetHistNn(a));
\r
302 fListBFS->Add(fShuffledBalance->GetHistNpn(a));
\r
303 fListBFS->Add(fShuffledBalance->GetHistNnn(a));
\r
304 fListBFS->Add(fShuffledBalance->GetHistNpp(a));
\r
305 fListBFS->Add(fShuffledBalance->GetHistNnp(a));
\r
309 if(fESDtrackCuts) fList->Add(fESDtrackCuts);
\r
311 //====================PID========================//
\r
313 fPIDCombined = new AliPIDCombined();
\r
314 fPIDCombined->SetDefaultTPCPriors();
\r
316 fHistdEdxVsPTPCbeforePID = new TH2D ("dEdxVsPTPCbefore","dEdxVsPTPCbefore", 1000, -10.0, 10.0, 1000, 0, 1000);
\r
317 fHistListPIDQA->Add(fHistdEdxVsPTPCbeforePID); //addition
\r
319 fHistBetavsPTOFbeforePID = new TH2D ("BetavsPTOFbefore","BetavsPTOFbefore", 1000, -10.0, 10., 1000, 0, 1.2);
\r
320 fHistListPIDQA->Add(fHistBetavsPTOFbeforePID); //addition
\r
322 fHistProbTPCvsPtbeforePID = new TH2D ("ProbTPCvsPtbefore","ProbTPCvsPtbefore", 1000, -10.0,10.0, 1000, 0, 2.0);
\r
323 fHistListPIDQA->Add(fHistProbTPCvsPtbeforePID); //addition
\r
325 fHistProbTOFvsPtbeforePID = new TH2D ("ProbTOFvsPtbefore","ProbTOFvsPtbefore", 1000, -50, 50, 1000, 0, 2.0);
\r
326 fHistListPIDQA->Add(fHistProbTOFvsPtbeforePID); //addition
\r
328 fHistProbTPCTOFvsPtbeforePID =new TH2D ("ProbTPCTOFvsPtbefore","ProbTPCTOFvsPtbefore", 1000, -50, 50, 1000, 0, 2.0);
\r
329 fHistListPIDQA->Add(fHistProbTPCTOFvsPtbeforePID); //addition
\r
331 fHistNSigmaTPCvsPtbeforePID = new TH2D ("NSigmaTPCvsPtbefore","NSigmaTPCvsPtbefore", 1000, -10, 10, 1000, 0, 500);
\r
332 fHistListPIDQA->Add(fHistNSigmaTPCvsPtbeforePID); //addition
\r
334 fHistNSigmaTOFvsPtbeforePID = new TH2D ("NSigmaTOFvsPtbefore","NSigmaTOFvsPtbefore", 1000, -10, 10, 1000, 0, 500);
\r
335 fHistListPIDQA->Add(fHistNSigmaTOFvsPtbeforePID); //addition
\r
337 fHistdEdxVsPTPCafterPID = new TH2D ("dEdxVsPTPCafter","dEdxVsPTPCafter", 1000, -10, 10, 1000, 0, 1000);
\r
338 fHistListPIDQA->Add(fHistdEdxVsPTPCafterPID); //addition
\r
340 fHistBetavsPTOFafterPID = new TH2D ("BetavsPTOFafter","BetavsPTOFafter", 1000, -10, 10, 1000, 0, 1.2);
\r
341 fHistListPIDQA->Add(fHistBetavsPTOFafterPID); //addition
\r
343 fHistProbTPCvsPtafterPID = new TH2D ("ProbTPCvsPtafter","ProbTPCvsPtafter", 1000, -10, 10, 1000, 0, 2);
\r
344 fHistListPIDQA->Add(fHistProbTPCvsPtafterPID); //addition
\r
346 fHistProbTOFvsPtafterPID = new TH2D ("ProbTOFvsPtafter","ProbTOFvsPtafter", 1000, -10, 10, 1000, 0, 2);
\r
347 fHistListPIDQA->Add(fHistProbTOFvsPtafterPID); //addition
\r
349 fHistProbTPCTOFvsPtafterPID =new TH2D ("ProbTPCTOFvsPtafter","ProbTPCTOFvsPtafter", 1000, -50, 50, 1000, 0, 2.0);
\r
350 fHistListPIDQA->Add(fHistProbTPCTOFvsPtafterPID); //addition
\r
352 fHistNSigmaTPCvsPtafterPID = new TH2D ("NSigmaTPCvsPtafter","NSigmaTPCvsPtafter", 1000, -10, 10, 1000, 0, 500);
\r
353 fHistListPIDQA->Add(fHistNSigmaTPCvsPtafterPID); //addition
\r
355 fHistNSigmaTOFvsPtafterPID = new TH2D ("NSigmaTOFvsPtafter","NSigmaTOFvsPtafter", 1000, -10, 10, 1000, 0, 500);
\r
356 fHistListPIDQA->Add(fHistNSigmaTOFvsPtafterPID); //addition
\r
358 //====================PID========================//
\r
360 // Post output data.
\r
361 PostData(1, fList);
\r
362 PostData(2, fListBF);
\r
363 if(fRunShuffling) PostData(3, fListBFS);
\r
364 if(fUsePID) PostData(4, fHistListPIDQA); //PID
\r
367 //________________________________________________________________________
\r
368 void AliAnalysisTaskBFPsi::UserExec(Option_t *) {
\r
370 // Called for each event
\r
371 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
373 AliESDtrack *track_TPC = NULL;
\r
375 Int_t gNumberOfAcceptedTracks = 0;
\r
376 Float_t fCentrality = 0.;
\r
377 Double_t gReactionPlane = 0.;
\r
379 // vector holding the charges/kinematics of all tracks (charge,y,eta,phi,p0,p1,p2,pt,E)
\r
380 vector<Double_t> *chargeVectorShuffle[9]; // this will be shuffled
\r
381 vector<Double_t> *chargeVector[9]; // original charge
\r
382 for(Int_t i = 0; i < 9; i++){
\r
383 chargeVectorShuffle[i] = new vector<Double_t>;
\r
384 chargeVector[i] = new vector<Double_t>;
\r
396 fPIDResponse = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetPIDResponse();
\r
397 if (!fPIDResponse) AliFatal("This Task needs the PID response attached to the inputHandler");
\r
401 if(gAnalysisLevel == "ESD") {
\r
402 AliESDEvent* gESD = dynamic_cast<AliESDEvent*>(InputEvent()); // from TaskSE
\r
404 Printf("ERROR: gESD not available");
\r
408 // store offline trigger bits
\r
409 fHistTriggerStats->Fill(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected());
\r
411 // event selection done in AliAnalysisTaskSE::Exec() --> this is not used
\r
412 fHistEventStats->Fill(1,fCentrality); //all events
\r
413 Bool_t isSelected = kTRUE;
\r
414 if(fUseOfflineTrigger)
\r
415 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
\r
417 fHistEventStats->Fill(2,fCentrality); //triggered events
\r
419 if(fUseCentrality) {
\r
421 AliCentrality *centrality = gESD->GetCentrality();
\r
423 fCentrality = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
\r
425 // take only events inside centrality class
\r
426 if(!centrality->IsEventInCentralityClass(fCentralityPercentileMin,
\r
427 fCentralityPercentileMax,
\r
428 fCentralityEstimator.Data()))
\r
431 // centrality QA (V0M)
\r
432 fHistV0M->Fill(gESD->GetVZEROData()->GetMTotV0A(), gESD->GetVZEROData()->GetMTotV0C());
\r
435 const AliESDVertex *vertex = gESD->GetPrimaryVertex();
\r
437 if(vertex->GetNContributors() > 0) {
\r
438 if(vertex->GetZRes() != 0) {
\r
439 fHistEventStats->Fill(3,fCentrality); //events with a proper vertex
\r
440 if(TMath::Abs(vertex->GetXv()) < fVxMax) {
\r
441 if(TMath::Abs(vertex->GetYv()) < fVyMax) {
\r
442 if(TMath::Abs(vertex->GetZv()) < fVzMax) {
\r
443 fHistEventStats->Fill(4,fCentrality); //analayzed events
\r
444 fHistVx->Fill(vertex->GetXv());
\r
445 fHistVy->Fill(vertex->GetYv());
\r
446 fHistVz->Fill(vertex->GetZv(),fCentrality);
\r
448 //========Get the VZERO event plane========//
\r
449 Double_t gVZEROEventPlane = -10.0;
\r
450 Double_t qxTot = 0.0, qyTot = 0.0;
\r
451 AliEventplane *ep = gESD->GetEventplane();
\r
453 gVZEROEventPlane = ep->CalculateVZEROEventPlane(gESD,10,2,qxTot,qyTot);
\r
454 if(gVZEROEventPlane < 0.) gVZEROEventPlane += TMath::Pi();
\r
455 gReactionPlane = gVZEROEventPlane*TMath::RadToDeg();
\r
456 fHistEventPlane->Fill(gReactionPlane,fCentrality);
\r
457 //========Get the VZERO event plane========//
\r
459 //Printf("There are %d tracks in this event", gESD->GetNumberOfTracks());
\r
460 for (Int_t iTracks = 0; iTracks < gESD->GetNumberOfTracks(); iTracks++) {
\r
461 AliESDtrack* track = dynamic_cast<AliESDtrack *>(gESD->GetTrack(iTracks));
\r
463 Printf("ERROR: Could not receive track %d", iTracks);
\r
467 // take only TPC only tracks
\r
468 track_TPC = new AliESDtrack();
\r
469 if(!track->FillTPCOnlyTrack(*track_TPC)) continue;
\r
473 if(!fESDtrackCuts->AcceptTrack(track_TPC)) continue;
\r
475 // fill QA histograms
\r
478 track_TPC->GetImpactParameters(b,bCov);
\r
479 if (bCov[0]<=0 || bCov[2]<=0) {
\r
480 AliDebug(1, "Estimated b resolution lower or equal zero!");
\r
481 bCov[0]=0; bCov[2]=0;
\r
484 Int_t nClustersTPC = -1;
\r
485 nClustersTPC = track_TPC->GetTPCNclsIter1(); // TPC standalone
\r
486 //nClustersTPC = track->GetTPCclusters(0); // global track
\r
487 Float_t chi2PerClusterTPC = -1;
\r
488 if (nClustersTPC!=0) {
\r
489 chi2PerClusterTPC = track_TPC->GetTPCchi2Iter1()/Float_t(nClustersTPC); // TPC standalone
\r
490 //chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC); // global track
\r
493 //===========================PID===============================//
\r
495 Double_t prob[AliPID::kSPECIES]={0.};
\r
496 Double_t probTPC[AliPID::kSPECIES]={0.};
\r
497 Double_t probTOF[AliPID::kSPECIES]={0.};
\r
498 Double_t probTPCTOF[AliPID::kSPECIES]={0.};
\r
500 Double_t nSigma = 0.;
\r
501 UInt_t detUsedTPC = 0;
\r
502 UInt_t detUsedTOF = 0;
\r
503 UInt_t detUsedTPCTOF = 0;
\r
505 //Decide what detector configuration we want to use
\r
506 switch(fPidDetectorConfig) {
\r
508 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
\r
509 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)fParticleOfInterest));
\r
510 detUsedTPC = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPC);
\r
511 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
\r
512 prob[iSpecies] = probTPC[iSpecies];
\r
515 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF);
\r
516 nSigma = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)fParticleOfInterest));
\r
517 detUsedTOF = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTOF);
\r
518 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
\r
519 prob[iSpecies] = probTOF[iSpecies];
\r
522 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC);
\r
523 detUsedTPCTOF = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPCTOF);
\r
524 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++)
\r
525 prob[iSpecies] = probTPCTOF[iSpecies];
\r
529 }//end switch: define detector mask
\r
531 //Filling the PID QA
\r
532 Double_t tofTime = -999., length = 999., tof = -999.;
\r
533 Double_t c = TMath::C()*1.E-9;// m/ns
\r
534 Double_t beta = -999.;
\r
535 Double_t nSigmaTOFForParticleOfInterest = -999.;
\r
536 if ( (track->IsOn(AliESDtrack::kTOFin)) &&
\r
537 (track->IsOn(AliESDtrack::kTIME)) ) {
\r
538 tofTime = track->GetTOFsignal();//in ps
\r
539 length = track->GetIntegratedLength();
\r
540 tof = tofTime*1E-3; // ns
\r
543 //Printf("WARNING: track with negative TOF time found! Skipping this track for PID checks\n");
\r
547 //printf("WARNING: track with negative length found!Skipping this track for PID checks\n");
\r
551 length = length*0.01; // in meters
\r
555 nSigmaTOFForParticleOfInterest = fPIDResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)fParticleOfInterest);
\r
556 fHistBetavsPTOFbeforePID ->Fill(track->P()*track->Charge(),beta);
\r
557 fHistProbTOFvsPtbeforePID ->Fill(track->Pt(),probTOF[fParticleOfInterest]);
\r
558 fHistNSigmaTOFvsPtbeforePID ->Fill(track->Pt(),nSigmaTOFForParticleOfInterest);
\r
562 Double_t nSigmaTPCForParticleOfInterest = fPIDResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)fParticleOfInterest);
\r
563 fHistdEdxVsPTPCbeforePID -> Fill(track->P()*track->Charge(),track->GetTPCsignal());
\r
564 fHistProbTPCvsPtbeforePID -> Fill(track->Pt(),probTPC[fParticleOfInterest]);
\r
565 fHistNSigmaTPCvsPtbeforePID -> Fill(track->Pt(),nSigmaTPCForParticleOfInterest);
\r
566 fHistProbTPCTOFvsPtbeforePID -> Fill(track->Pt(),probTPCTOF[fParticleOfInterest]);
\r
567 //end of QA-before pid
\r
569 if ((detUsedTPC != 0)||(detUsedTOF != 0)||(detUsedTPCTOF != 0)) {
\r
570 //Make the decision based on the n-sigma
\r
571 if(fUsePIDnSigma) {
\r
572 if(nSigma > fPIDNSigma) continue;}
\r
574 //Make the decision based on the bayesian
\r
575 else if(fUsePIDPropabilities) {
\r
576 if(fParticleOfInterest != TMath::LocMax(AliPID::kSPECIES,prob)) continue;
\r
577 if (prob[fParticleOfInterest] < fMinAcceptedPIDProbability) continue;
\r
580 //Fill QA after the PID
\r
581 fHistBetavsPTOFafterPID ->Fill(track->P()*track->Charge(),beta);
\r
582 fHistProbTOFvsPtafterPID ->Fill(track->Pt(),probTOF[fParticleOfInterest]);
\r
583 fHistNSigmaTOFvsPtafterPID ->Fill(track->Pt(),nSigmaTOFForParticleOfInterest);
\r
585 fHistdEdxVsPTPCafterPID -> Fill(track->P()*track->Charge(),track->GetTPCsignal());
\r
586 fHistProbTPCvsPtafterPID -> Fill(track->Pt(),probTPC[fParticleOfInterest]);
\r
587 fHistProbTPCTOFvsPtafterPID -> Fill(track->Pt(),probTPCTOF[fParticleOfInterest]);
\r
588 fHistNSigmaTPCvsPtafterPID -> Fill(track->Pt(),nSigmaTPCForParticleOfInterest);
\r
591 PostData(4, fHistListPIDQA);
\r
593 //===========================PID===============================//
\r
594 v_charge = track_TPC->Charge();
\r
595 v_y = track_TPC->Y();
\r
596 v_eta = track_TPC->Eta();
\r
597 v_phi = track_TPC->Phi() * TMath::RadToDeg();
\r
598 v_E = track_TPC->E();
\r
599 v_pt = track_TPC->Pt();
\r
600 track_TPC->PxPyPz(v_p);
\r
601 fHistClus->Fill(track_TPC->GetITSclusters(0),nClustersTPC);
\r
602 fHistDCA->Fill(b[1],b[0]);
\r
603 fHistChi2->Fill(chi2PerClusterTPC,fCentrality);
\r
604 fHistPt->Fill(v_pt,fCentrality);
\r
605 fHistEta->Fill(v_eta,fCentrality);
\r
606 fHistPhi->Fill(v_phi,fCentrality);
\r
607 fHistRapidity->Fill(v_y,fCentrality);
\r
608 if(v_charge > 0) fHistPhiPos->Fill(v_phi,fCentrality);
\r
609 else if(v_charge < 0) fHistPhiNeg->Fill(v_phi,fCentrality);
\r
611 // fill charge vector
\r
612 chargeVector[0]->push_back(v_charge);
\r
613 chargeVector[1]->push_back(v_y);
\r
614 chargeVector[2]->push_back(v_eta);
\r
615 chargeVector[3]->push_back(v_phi);
\r
616 chargeVector[4]->push_back(v_p[0]);
\r
617 chargeVector[5]->push_back(v_p[1]);
\r
618 chargeVector[6]->push_back(v_p[2]);
\r
619 chargeVector[7]->push_back(v_pt);
\r
620 chargeVector[8]->push_back(v_E);
\r
622 if(fRunShuffling) {
\r
623 chargeVectorShuffle[0]->push_back(v_charge);
\r
624 chargeVectorShuffle[1]->push_back(v_y);
\r
625 chargeVectorShuffle[2]->push_back(v_eta);
\r
626 chargeVectorShuffle[3]->push_back(v_phi);
\r
627 chargeVectorShuffle[4]->push_back(v_p[0]);
\r
628 chargeVectorShuffle[5]->push_back(v_p[1]);
\r
629 chargeVectorShuffle[6]->push_back(v_p[2]);
\r
630 chargeVectorShuffle[7]->push_back(v_pt);
\r
631 chargeVectorShuffle[8]->push_back(v_E);
\r
640 }//proper vertex resolution
\r
641 }//proper number of contributors
\r
642 }//vertex object valid
\r
643 }//triggered event
\r
646 //AOD analysis (vertex and track cuts also here!!!!)
\r
647 else if(gAnalysisLevel == "AOD") {
\r
648 AliAODEvent* gAOD = dynamic_cast<AliAODEvent*>(InputEvent()); // from TaskSE
\r
650 Printf("ERROR: gAOD not available");
\r
654 AliAODHeader *aodHeader = gAOD->GetHeader();
\r
656 // store offline trigger bits
\r
657 fHistTriggerStats->Fill(aodHeader->GetOfflineTrigger());
\r
659 // event selection done in AliAnalysisTaskSE::Exec() --> this is not used
\r
660 fHistEventStats->Fill(1,fCentrality); //all events
\r
661 Bool_t isSelected = kTRUE;
\r
662 if(fUseOfflineTrigger)
\r
663 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
\r
665 fHistEventStats->Fill(2,fCentrality); //triggered events
\r
667 //Centrality stuff (centrality in AOD header)
\r
668 if(fUseCentrality) {
\r
669 fCentrality = aodHeader->GetCentralityP()->GetCentralityPercentile(fCentralityEstimator.Data());
\r
671 // QA for centrality estimators
\r
672 fHistCentStats->Fill(0.,aodHeader->GetCentralityP()->GetCentralityPercentile("V0M"));
\r
673 fHistCentStats->Fill(1.,aodHeader->GetCentralityP()->GetCentralityPercentile("FMD"));
\r
674 fHistCentStats->Fill(2.,aodHeader->GetCentralityP()->GetCentralityPercentile("TRK"));
\r
675 fHistCentStats->Fill(3.,aodHeader->GetCentralityP()->GetCentralityPercentile("TKL"));
\r
676 fHistCentStats->Fill(4.,aodHeader->GetCentralityP()->GetCentralityPercentile("CL0"));
\r
677 fHistCentStats->Fill(5.,aodHeader->GetCentralityP()->GetCentralityPercentile("CL1"));
\r
678 fHistCentStats->Fill(6.,aodHeader->GetCentralityP()->GetCentralityPercentile("V0MvsFMD"));
\r
679 fHistCentStats->Fill(7.,aodHeader->GetCentralityP()->GetCentralityPercentile("TKLvsV0M"));
\r
680 fHistCentStats->Fill(8.,aodHeader->GetCentralityP()->GetCentralityPercentile("ZEMvsZDC"));
\r
682 // take only events inside centrality class
\r
683 if((fCentrality < fCentralityPercentileMin) || (fCentrality > fCentralityPercentileMax))
\r
686 // centrality QA (V0M)
\r
687 fHistV0M->Fill(gAOD->GetVZEROData()->GetMTotV0A(), gAOD->GetVZEROData()->GetMTotV0C());
\r
689 // centrality QA (reference tracks)
\r
690 fHistRefTracks->Fill(0.,aodHeader->GetRefMultiplicity());
\r
691 fHistRefTracks->Fill(1.,aodHeader->GetRefMultiplicityPos());
\r
692 fHistRefTracks->Fill(2.,aodHeader->GetRefMultiplicityNeg());
\r
693 fHistRefTracks->Fill(3.,aodHeader->GetTPConlyRefMultiplicity());
\r
694 fHistRefTracks->Fill(4.,aodHeader->GetNumberOfITSClusters(0));
\r
695 fHistRefTracks->Fill(5.,aodHeader->GetNumberOfITSClusters(1));
\r
696 fHistRefTracks->Fill(6.,aodHeader->GetNumberOfITSClusters(2));
\r
697 fHistRefTracks->Fill(7.,aodHeader->GetNumberOfITSClusters(3));
\r
698 fHistRefTracks->Fill(8.,aodHeader->GetNumberOfITSClusters(4));
\r
701 const AliAODVertex *vertex = gAOD->GetPrimaryVertex();
\r
704 Double32_t fCov[6];
\r
705 vertex->GetCovarianceMatrix(fCov);
\r
707 if(vertex->GetNContributors() > 0) {
\r
709 fHistEventStats->Fill(3,fCentrality); //events with a proper vertex
\r
710 if(TMath::Abs(vertex->GetX()) < fVxMax) {
\r
711 if(TMath::Abs(vertex->GetY()) < fVyMax) {
\r
712 if(TMath::Abs(vertex->GetZ()) < fVzMax) {
\r
713 fHistEventStats->Fill(4,fCentrality); //analyzed events
\r
714 fHistVx->Fill(vertex->GetX());
\r
715 fHistVy->Fill(vertex->GetY());
\r
716 fHistVz->Fill(vertex->GetZ(),fCentrality);
\r
718 //========Get the VZERO event plane========//
\r
719 Double_t gVZEROEventPlane = -10.0;
\r
720 Double_t qxTot = 0.0, qyTot = 0.0;
\r
721 AliEventplane *ep = gAOD->GetEventplane();
\r
723 gVZEROEventPlane = ep->CalculateVZEROEventPlane(gAOD,10,2,qxTot,qyTot);
\r
724 if(gVZEROEventPlane < 0.) gVZEROEventPlane += TMath::Pi();
\r
725 gReactionPlane = gVZEROEventPlane*TMath::RadToDeg();
\r
726 fHistEventPlane->Fill(gReactionPlane);
\r
727 //========Get the VZERO event plane========//
\r
729 //Printf("There are %d tracks in this event", gAOD->GetNumberOfTracks());
\r
730 for (Int_t iTracks = 0; iTracks < gAOD->GetNumberOfTracks(); iTracks++) {
\r
731 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack *>(gAOD->GetTrack(iTracks));
\r
733 Printf("ERROR: Could not receive track %d", iTracks);
\r
739 // For ESD Filter Information: ANALYSIS/macros/AddTaskESDfilter.C
\r
740 // take only TPC only tracks
\r
741 fHistTrackStats->Fill(aodTrack->GetFilterMap());
\r
742 if(!aodTrack->TestFilterBit(nAODtrackCutBit)) continue;
\r
744 v_charge = aodTrack->Charge();
\r
745 v_y = aodTrack->Y();
\r
746 v_eta = aodTrack->Eta();
\r
747 v_phi = aodTrack->Phi() * TMath::RadToDeg();
\r
748 v_E = aodTrack->E();
\r
749 v_pt = aodTrack->Pt();
\r
750 aodTrack->PxPyPz(v_p);
\r
752 Float_t DCAxy = aodTrack->DCA(); // this is the DCA from global track (not exactly what is cut on)
\r
753 Float_t DCAz = aodTrack->ZAtDCA(); // this is the DCA from global track (not exactly what is cut on)
\r
756 // Kinematics cuts from ESD track cuts
\r
757 if( v_pt < fPtMin || v_pt > fPtMax) continue;
\r
759 if( v_eta < fEtaMin || v_eta > fEtaMax) continue;
\r
762 if( v_y < fEtaMin || v_y > fEtaMax) continue;
\r
765 // Extra DCA cuts (for systematic studies [!= -1])
\r
766 if( fDCAxyCut != -1 && fDCAzCut != -1){
\r
767 if(TMath::Sqrt((DCAxy*DCAxy)/(fDCAxyCut*fDCAxyCut)+(DCAz*DCAz)/(fDCAzCut*fDCAzCut)) > 1 ){
\r
768 continue; // 2D cut
\r
772 // Extra TPC cuts (for systematic studies [!= -1])
\r
773 if( fTPCchi2Cut != -1 && aodTrack->Chi2perNDF() > fTPCchi2Cut){
\r
776 if( fNClustersTPCCut != -1 && aodTrack->GetTPCNcls() < fNClustersTPCCut){
\r
780 // fill QA histograms
\r
781 fHistClus->Fill(aodTrack->GetITSNcls(),aodTrack->GetTPCNcls());
\r
782 fHistDCA->Fill(DCAz,DCAxy);
\r
783 fHistChi2->Fill(aodTrack->Chi2perNDF(),fCentrality);
\r
784 fHistPt->Fill(v_pt,fCentrality);
\r
785 fHistEta->Fill(v_eta,fCentrality);
\r
786 fHistPhi->Fill(v_phi,fCentrality);
\r
787 fHistRapidity->Fill(v_y,fCentrality);
\r
788 if(v_charge > 0) fHistPhiPos->Fill(v_phi,fCentrality);
\r
789 else if(v_charge < 0) fHistPhiNeg->Fill(v_phi,fCentrality);
\r
791 // fill charge vector
\r
792 chargeVector[0]->push_back(v_charge);
\r
793 chargeVector[1]->push_back(v_y);
\r
794 chargeVector[2]->push_back(v_eta);
\r
795 chargeVector[3]->push_back(v_phi);
\r
796 chargeVector[4]->push_back(v_p[0]);
\r
797 chargeVector[5]->push_back(v_p[1]);
\r
798 chargeVector[6]->push_back(v_p[2]);
\r
799 chargeVector[7]->push_back(v_pt);
\r
800 chargeVector[8]->push_back(v_E);
\r
802 if(fRunShuffling) {
\r
803 chargeVectorShuffle[0]->push_back(v_charge);
\r
804 chargeVectorShuffle[1]->push_back(v_y);
\r
805 chargeVectorShuffle[2]->push_back(v_eta);
\r
806 chargeVectorShuffle[3]->push_back(v_phi);
\r
807 chargeVectorShuffle[4]->push_back(v_p[0]);
\r
808 chargeVectorShuffle[5]->push_back(v_p[1]);
\r
809 chargeVectorShuffle[6]->push_back(v_p[2]);
\r
810 chargeVectorShuffle[7]->push_back(v_pt);
\r
811 chargeVectorShuffle[8]->push_back(v_E);
\r
814 gNumberOfAcceptedTracks += 1;
\r
820 }//proper vertex resolution
\r
821 }//proper number of contributors
\r
822 }//vertex object valid
\r
823 }//triggered event
\r
827 if(gAnalysisLevel == "MCESD") {
\r
828 AliMCEvent* mcEvent = MCEvent();
\r
830 Printf("ERROR: mcEvent not available");
\r
834 AliESDEvent* gESD = dynamic_cast<AliESDEvent*>(InputEvent()); // from TaskSE
\r
836 Printf("ERROR: gESD not available");
\r
840 // store offline trigger bits
\r
841 fHistTriggerStats->Fill(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected());
\r
843 // event selection done in AliAnalysisTaskSE::Exec() --> this is not used
\r
844 fHistEventStats->Fill(1,fCentrality); //all events
\r
845 Bool_t isSelected = kTRUE;
\r
846 if(fUseOfflineTrigger)
\r
847 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
\r
849 fHistEventStats->Fill(2,fCentrality); //triggered events
\r
851 if(fUseCentrality) {
\r
853 AliCentrality *centrality = gESD->GetCentrality();
\r
855 fCentrality = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
\r
857 // take only events inside centrality class
\r
858 if(!centrality->IsEventInCentralityClass(fCentralityPercentileMin,
\r
859 fCentralityPercentileMax,
\r
860 fCentralityEstimator.Data()))
\r
863 // centrality QA (V0M)
\r
864 fHistV0M->Fill(gESD->GetVZEROData()->GetMTotV0A(), gESD->GetVZEROData()->GetMTotV0C());
\r
867 const AliESDVertex *vertex = gESD->GetPrimaryVertex();
\r
869 if(vertex->GetNContributors() > 0) {
\r
870 if(vertex->GetZRes() != 0) {
\r
871 fHistEventStats->Fill(3,fCentrality); //events with a proper vertex
\r
872 if(TMath::Abs(vertex->GetXv()) < fVxMax) {
\r
873 if(TMath::Abs(vertex->GetYv()) < fVyMax) {
\r
874 if(TMath::Abs(vertex->GetZv()) < fVzMax) {
\r
875 fHistEventStats->Fill(4,fCentrality); //analayzed events
\r
876 fHistVx->Fill(vertex->GetXv());
\r
877 fHistVy->Fill(vertex->GetYv());
\r
878 fHistVz->Fill(vertex->GetZv(),fCentrality);
\r
880 //========Get the VZERO event plane========//
\r
881 Double_t gVZEROEventPlane = -10.0;
\r
882 Double_t qxTot = 0.0, qyTot = 0.0;
\r
883 AliEventplane *ep = gESD->GetEventplane();
\r
885 gVZEROEventPlane = ep->CalculateVZEROEventPlane(gESD,10,2,qxTot,qyTot);
\r
886 if(gVZEROEventPlane < 0.) gVZEROEventPlane += TMath::Pi();
\r
887 gReactionPlane = gVZEROEventPlane*TMath::RadToDeg();
\r
888 fHistEventPlane->Fill(gReactionPlane,fCentrality);
\r
889 //========Get the VZERO event plane========//
\r
891 //Printf("There are %d tracks in this event", gESD->GetNumberOfTracks());
\r
892 for (Int_t iTracks = 0; iTracks < gESD->GetNumberOfTracks(); iTracks++) {
\r
893 AliESDtrack* track = dynamic_cast<AliESDtrack *>(gESD->GetTrack(iTracks));
\r
895 Printf("ERROR: Could not receive track %d", iTracks);
\r
899 Int_t label = TMath::Abs(track->GetLabel());
\r
900 if(label > mcEvent->GetNumberOfTracks()) continue;
\r
901 if(label > mcEvent->GetNumberOfPrimaries()) continue;
\r
903 AliMCParticle* mcTrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(label));
\r
904 if(!mcTrack) continue;
\r
906 // take only TPC only tracks
\r
907 track_TPC = new AliESDtrack();
\r
908 if(!track->FillTPCOnlyTrack(*track_TPC)) continue;
\r
912 if(!fESDtrackCuts->AcceptTrack(track_TPC)) continue;
\r
914 // fill QA histograms
\r
917 track_TPC->GetImpactParameters(b,bCov);
\r
918 if (bCov[0]<=0 || bCov[2]<=0) {
\r
919 AliDebug(1, "Estimated b resolution lower or equal zero!");
\r
920 bCov[0]=0; bCov[2]=0;
\r
923 Int_t nClustersTPC = -1;
\r
924 nClustersTPC = track_TPC->GetTPCNclsIter1(); // TPC standalone
\r
925 //nClustersTPC = track->GetTPCclusters(0); // global track
\r
926 Float_t chi2PerClusterTPC = -1;
\r
927 if (nClustersTPC!=0) {
\r
928 chi2PerClusterTPC = track_TPC->GetTPCchi2Iter1()/Float_t(nClustersTPC); // TPC standalone
\r
929 //chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC); // global track
\r
932 v_charge = track_TPC->Charge();
\r
933 v_y = track_TPC->Y();
\r
934 v_eta = track_TPC->Eta();
\r
935 v_phi = track_TPC->Phi() * TMath::RadToDeg();
\r
936 v_E = track_TPC->E();
\r
937 v_pt = track_TPC->Pt();
\r
938 track_TPC->PxPyPz(v_p);
\r
940 fHistClus->Fill(track_TPC->GetITSclusters(0),nClustersTPC);
\r
941 fHistDCA->Fill(b[1],b[0]);
\r
942 fHistChi2->Fill(chi2PerClusterTPC,fCentrality);
\r
943 fHistPt->Fill(v_pt,fCentrality);
\r
944 fHistEta->Fill(v_eta,fCentrality);
\r
945 fHistPhi->Fill(v_phi,fCentrality);
\r
946 fHistRapidity->Fill(v_y,fCentrality);
\r
947 if(v_charge > 0) fHistPhiPos->Fill(v_phi,fCentrality);
\r
948 else if(v_charge < 0) fHistPhiNeg->Fill(v_phi,fCentrality);
\r
950 // fill charge vector
\r
951 chargeVector[0]->push_back(v_charge);
\r
952 chargeVector[1]->push_back(v_y);
\r
953 chargeVector[2]->push_back(v_eta);
\r
954 chargeVector[3]->push_back(v_phi);
\r
955 chargeVector[4]->push_back(v_p[0]);
\r
956 chargeVector[5]->push_back(v_p[1]);
\r
957 chargeVector[6]->push_back(v_p[2]);
\r
958 chargeVector[7]->push_back(v_pt);
\r
959 chargeVector[8]->push_back(v_E);
\r
961 if(fRunShuffling) {
\r
962 chargeVectorShuffle[0]->push_back(v_charge);
\r
963 chargeVectorShuffle[1]->push_back(v_y);
\r
964 chargeVectorShuffle[2]->push_back(v_eta);
\r
965 chargeVectorShuffle[3]->push_back(v_phi);
\r
966 chargeVectorShuffle[4]->push_back(v_p[0]);
\r
967 chargeVectorShuffle[5]->push_back(v_p[1]);
\r
968 chargeVectorShuffle[6]->push_back(v_p[2]);
\r
969 chargeVectorShuffle[7]->push_back(v_pt);
\r
970 chargeVectorShuffle[8]->push_back(v_E);
\r
974 gNumberOfAcceptedTracks += 1;
\r
980 }//proper vertex resolution
\r
981 }//proper number of contributors
\r
982 }//vertex object valid
\r
983 }//triggered event
\r
987 else if(gAnalysisLevel == "MC") {
\r
988 AliMCEvent* mcEvent = MCEvent();
\r
990 Printf("ERROR: mcEvent not available");
\r
993 fHistEventStats->Fill(1,fCentrality); //total events
\r
994 fHistEventStats->Fill(2,fCentrality); //offline trigger
\r
996 Double_t gImpactParameter = 0.;
\r
997 if(fUseCentrality) {
\r
998 //Get the MC header
\r
999 AliGenHijingEventHeader* headerH = dynamic_cast<AliGenHijingEventHeader*>(mcEvent->GenEventHeader());
\r
1001 //Printf("=====================================================");
\r
1002 //Printf("Reaction plane angle: %lf",headerH->ReactionPlaneAngle());
\r
1003 //Printf("Impact parameter: %lf",headerH->ImpactParameter());
\r
1004 //Printf("=====================================================");
\r
1005 gReactionPlane = headerH->ReactionPlaneAngle();
\r
1006 gImpactParameter = headerH->ImpactParameter();
\r
1007 fCentrality = gImpactParameter;
\r
1009 fCentrality = gImpactParameter;
\r
1010 fHistEventPlane->Fill(gReactionPlane*TMath::RadToDeg(),fCentrality);
\r
1012 // take only events inside centrality class (DIDN'T CHANGE THIS UP TO NOW)
\r
1013 if((fImpactParameterMin > gImpactParameter) || (fImpactParameterMax < gImpactParameter))
\r
1017 AliGenEventHeader *header = mcEvent->GenEventHeader();
\r
1018 if(!header) return;
\r
1020 TArrayF gVertexArray;
\r
1021 header->PrimaryVertex(gVertexArray);
\r
1022 //Printf("Vertex: %lf (x) - %lf (y) - %lf (z)",
\r
1023 //gVertexArray.At(0),
\r
1024 //gVertexArray.At(1),
\r
1025 //gVertexArray.At(2));
\r
1026 fHistEventStats->Fill(3,fCentrality); //events with a proper vertex
\r
1027 if(TMath::Abs(gVertexArray.At(0)) < fVxMax) {
\r
1028 if(TMath::Abs(gVertexArray.At(1)) < fVyMax) {
\r
1029 if(TMath::Abs(gVertexArray.At(2)) < fVzMax) {
\r
1030 fHistEventStats->Fill(4,fCentrality); //analayzed events
\r
1031 fHistVx->Fill(gVertexArray.At(0));
\r
1032 fHistVy->Fill(gVertexArray.At(1));
\r
1033 fHistVz->Fill(gVertexArray.At(2),fCentrality);
\r
1035 Printf("There are %d tracks in this event", mcEvent->GetNumberOfPrimaries());
\r
1036 for (Int_t iTracks = 0; iTracks < mcEvent->GetNumberOfPrimaries(); iTracks++) {
\r
1037 AliMCParticle* track = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(iTracks));
\r
1039 Printf("ERROR: Could not receive particle %d", iTracks);
\r
1043 //exclude non stable particles
\r
1044 if(!mcEvent->IsPhysicalPrimary(iTracks)) continue;
\r
1046 v_eta = track->Eta();
\r
1047 v_pt = track->Pt();
\r
1050 if( v_pt < fPtMin || v_pt > fPtMax)
\r
1053 if( v_eta < fEtaMin || v_eta > fEtaMax) continue;
\r
1055 else if (fUsePID){
\r
1056 if( v_y < fEtaMin || v_y > fEtaMax) continue;
\r
1059 //analyze one set of particles
\r
1060 if(fUseMCPdgCode) {
\r
1061 TParticle *particle = track->Particle();
\r
1062 if(!particle) continue;
\r
1064 Int_t gPdgCode = particle->GetPdgCode();
\r
1065 if(TMath::Abs(fPDGCodeToBeAnalyzed) != TMath::Abs(gPdgCode))
\r
1069 //Use the acceptance parameterization
\r
1070 if(fAcceptanceParameterization) {
\r
1071 Double_t gRandomNumber = gRandom->Rndm();
\r
1072 if(gRandomNumber > fAcceptanceParameterization->Eval(track->Pt()))
\r
1076 //Exclude resonances
\r
1077 if(fExcludeResonancesInMC) {
\r
1078 TParticle *particle = track->Particle();
\r
1079 if(!particle) continue;
\r
1081 Bool_t kExcludeParticle = kFALSE;
\r
1082 Int_t gMotherIndex = particle->GetFirstMother();
\r
1083 if(gMotherIndex != -1) {
\r
1084 AliMCParticle* motherTrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(gMotherIndex));
\r
1086 TParticle *motherParticle = motherTrack->Particle();
\r
1087 if(motherParticle) {
\r
1088 Int_t pdgCodeOfMother = motherParticle->GetPdgCode();
\r
1089 //if((pdgCodeOfMother == 113)||(pdgCodeOfMother == 213)||(pdgCodeOfMother == 221)||(pdgCodeOfMother == 223)||(pdgCodeOfMother == 331)||(pdgCodeOfMother == 333)) {
\r
1090 if(pdgCodeOfMother == 113) {
\r
1091 kExcludeParticle = kTRUE;
\r
1097 //Exclude from the analysis decay products of rho0, rho+, eta, eta' and phi
\r
1098 if(kExcludeParticle) continue;
\r
1101 v_charge = track->Charge();
\r
1102 v_phi = track->Phi();
\r
1104 track->PxPyPz(v_p);
\r
1105 //Printf("phi (before): %lf",v_phi);
\r
1107 fHistPt->Fill(v_pt,fCentrality);
\r
1108 fHistEta->Fill(v_eta,fCentrality);
\r
1109 fHistPhi->Fill(v_phi*TMath::RadToDeg(),fCentrality);
\r
1110 fHistRapidity->Fill(v_y,fCentrality);
\r
1111 if(v_charge > 0) fHistPhiPos->Fill(v_phi*TMath::RadToDeg(),fCentrality);
\r
1112 else if(v_charge < 0) fHistPhiNeg->Fill(v_phi*TMath::RadToDeg(),fCentrality);
\r
1114 //Flow after burner
\r
1115 if(fUseFlowAfterBurner) {
\r
1116 Double_t precisionPhi = 0.001;
\r
1117 Int_t maxNumberOfIterations = 100;
\r
1119 Double_t phi0 = v_phi;
\r
1120 Double_t gV2 = fDifferentialV2->Eval(v_pt);
\r
1122 for (Int_t j = 0; j < maxNumberOfIterations; j++) {
\r
1123 Double_t phiprev = v_phi;
\r
1124 Double_t fl = v_phi - phi0 + gV2*TMath::Sin(2.*(v_phi - gReactionPlane));
\r
1125 Double_t fp = 1.0 + 2.0*gV2*TMath::Cos(2.*(v_phi - gReactionPlane));
\r
1127 if (TMath::AreEqualAbs(phiprev,v_phi,precisionPhi)) break;
\r
1129 //Printf("phi (after): %lf\n",v_phi);
\r
1130 Double_t v_DeltaphiBefore = phi0 - gReactionPlane;
\r
1131 if(v_DeltaphiBefore < 0) v_DeltaphiBefore += 2*TMath::Pi();
\r
1132 fHistPhiBefore->Fill(v_DeltaphiBefore,fCentrality);
\r
1134 Double_t v_DeltaphiAfter = v_phi - gReactionPlane;
\r
1135 if(v_DeltaphiAfter < 0) v_DeltaphiAfter += 2*TMath::Pi();
\r
1136 fHistPhiAfter->Fill(v_DeltaphiAfter,fCentrality);
\r
1139 v_phi *= TMath::RadToDeg();
\r
1141 // fill charge vector
\r
1142 chargeVector[0]->push_back(v_charge);
\r
1143 chargeVector[1]->push_back(v_y);
\r
1144 chargeVector[2]->push_back(v_eta);
\r
1145 chargeVector[3]->push_back(v_phi);
\r
1146 chargeVector[4]->push_back(v_p[0]);
\r
1147 chargeVector[5]->push_back(v_p[1]);
\r
1148 chargeVector[6]->push_back(v_p[2]);
\r
1149 chargeVector[7]->push_back(v_pt);
\r
1150 chargeVector[8]->push_back(v_E);
\r
1152 if(fRunShuffling) {
\r
1153 chargeVectorShuffle[0]->push_back(v_charge);
\r
1154 chargeVectorShuffle[1]->push_back(v_y);
\r
1155 chargeVectorShuffle[2]->push_back(v_eta);
\r
1156 chargeVectorShuffle[3]->push_back(v_phi);
\r
1157 chargeVectorShuffle[4]->push_back(v_p[0]);
\r
1158 chargeVectorShuffle[5]->push_back(v_p[1]);
\r
1159 chargeVectorShuffle[6]->push_back(v_p[2]);
\r
1160 chargeVectorShuffle[7]->push_back(v_pt);
\r
1161 chargeVectorShuffle[8]->push_back(v_E);
\r
1163 gNumberOfAcceptedTracks += 1;
\r
1166 gReactionPlane *= TMath::RadToDeg();
\r
1172 //multiplicity cut (used in pp)
\r
1173 if(fUseMultiplicity) {
\r
1174 if((gNumberOfAcceptedTracks < fNumberOfAcceptedTracksMin)||(gNumberOfAcceptedTracks > fNumberOfAcceptedTracksMax))
\r
1177 fHistNumberOfAcceptedTracks->Fill(gNumberOfAcceptedTracks,fCentrality);
\r
1179 // calculate balance function
\r
1180 if(fUseMultiplicity)
\r
1181 fBalance->CalculateBalance(gNumberOfAcceptedTracks,gReactionPlane,chargeVector);
\r
1183 fBalance->CalculateBalance(fCentrality,gReactionPlane,chargeVector);
\r
1185 if(fRunShuffling) {
\r
1186 // shuffle charges
\r
1187 random_shuffle( chargeVectorShuffle[0]->begin(), chargeVectorShuffle[0]->end() );
\r
1188 if(fUseMultiplicity)
\r
1189 fShuffledBalance->CalculateBalance(gNumberOfAcceptedTracks,gReactionPlane,chargeVectorShuffle);
\r
1191 fShuffledBalance->CalculateBalance(fCentrality,gReactionPlane,chargeVectorShuffle);
\r
1195 //________________________________________________________________________
\r
1196 void AliAnalysisTaskBFPsi::FinishTaskOutput(){
\r
1197 //Printf("END BF");
\r
1200 Printf("ERROR: fBalance not available");
\r
1203 if(fRunShuffling) {
\r
1204 if (!fShuffledBalance) {
\r
1205 Printf("ERROR: fShuffledBalance not available");
\r
1212 //________________________________________________________________________
\r
1213 void AliAnalysisTaskBFPsi::Terminate(Option_t *) {
\r
1214 // Draw result to the screen
\r
1215 // Called once at the end of the query
\r
1217 // not implemented ...
\r