4 #include "TLorentzVector.h"
\r
5 #include "TGraphErrors.h"
\r
10 #include "AliAnalysisTaskSE.h"
\r
11 #include "AliAnalysisManager.h"
\r
13 #include "AliESDVertex.h"
\r
14 #include "AliESDEvent.h"
\r
15 #include "AliESDInputHandler.h"
\r
16 #include "AliAODEvent.h"
\r
17 #include "AliAODTrack.h"
\r
18 #include "AliAODInputHandler.h"
\r
19 #include "AliGenEventHeader.h"
\r
20 #include "AliGenHijingEventHeader.h"
\r
21 #include "AliMCEventHandler.h"
\r
22 #include "AliMCEvent.h"
\r
23 #include "AliStack.h"
\r
24 #include "AliESDtrackCuts.h"
\r
26 #include "AliAnalysisTaskBF.h"
\r
27 #include "AliBalance.h"
\r
30 // Analysis task for the BF code
\r
31 // Authors: Panos.Christakoglou@nikhef.nl
\r
33 ClassImp(AliAnalysisTaskBF)
\r
35 //________________________________________________________________________
\r
36 AliAnalysisTaskBF::AliAnalysisTaskBF(const char *name)
\r
37 : AliAnalysisTaskSE(name),
\r
39 fRunShuffling(kFALSE),
\r
40 fShuffledBalance(0),
\r
46 fHistTriggerStats(0),
\r
60 fCentralityEstimator("V0M"),
\r
61 fUseCentrality(kFALSE),
\r
62 fCentralityPercentileMin(0.),
\r
63 fCentralityPercentileMax(5.),
\r
64 fImpactParameterMin(0.),
\r
65 fImpactParameterMax(20.),
\r
66 fUseMultiplicity(kFALSE),
\r
67 fNumberOfAcceptedTracksMin(0),
\r
68 fNumberOfAcceptedTracksMax(10000),
\r
69 fUseOfflineTrigger(kFALSE),
\r
73 nAODtrackCutBit(128),
\r
81 fNClustersTPCCut(-1){
\r
84 // Define input and output slots here
\r
85 // Input slot #0 works with a TChain
\r
86 DefineInput(0, TChain::Class());
\r
87 // Output slot #0 writes into a TH1 container
\r
88 DefineOutput(1, TList::Class());
\r
89 DefineOutput(2, TList::Class());
\r
90 DefineOutput(3, TList::Class());
\r
93 //________________________________________________________________________
\r
94 AliAnalysisTaskBF::~AliAnalysisTaskBF() {
\r
96 // delete fBalance;
\r
97 // delete fShuffledBalance;
\r
100 // delete fListBFS;
\r
102 // delete fHistEventStats;
\r
103 // delete fHistTrackStats;
\r
104 // delete fHistVx;
\r
105 // delete fHistVy;
\r
106 // delete fHistVz;
\r
108 // delete fHistClus;
\r
109 // delete fHistDCA;
\r
110 // delete fHistChi2;
\r
112 // delete fHistEta;
\r
113 // delete fHistPhi;
\r
114 // delete fHistV0M;
\r
117 //________________________________________________________________________
\r
118 void AliAnalysisTaskBF::UserCreateOutputObjects() {
\r
119 // Create histograms
\r
122 fBalance = new AliBalance();
\r
123 fBalance->SetAnalysisLevel("ESD");
\r
124 //fBalance->SetNumberOfBins(-1,16);
\r
125 fBalance->SetInterval(-1,-0.8,0.8,16,0.,1.6);
\r
127 if(fRunShuffling) {
\r
128 if(!fShuffledBalance) {
\r
129 fShuffledBalance = new AliBalance();
\r
130 fShuffledBalance->SetAnalysisLevel("ESD");
\r
131 //fShuffledBalance->SetNumberOfBins(-1,16);
\r
132 fShuffledBalance->SetInterval(-1,-0.8,0.8,16,0.,1.6);
\r
137 fList = new TList();
\r
138 fList->SetName("listQA");
\r
141 //Balance Function list
\r
142 fListBF = new TList();
\r
143 fListBF->SetName("listBF");
\r
144 fListBF->SetOwner();
\r
146 if(fRunShuffling) {
\r
147 fListBFS = new TList();
\r
148 fListBFS->SetName("listBFShuffled");
\r
149 fListBFS->SetOwner();
\r
153 TString gCutName[4] = {"Total","Offline trigger",
\r
154 "Vertex","Analyzed"};
\r
155 fHistEventStats = new TH1F("fHistEventStats",
\r
156 "Event statistics;;N_{events}",
\r
158 for(Int_t i = 1; i <= 4; i++)
\r
159 fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1].Data());
\r
160 fList->Add(fHistEventStats);
\r
162 TString gCentName[9] = {"V0M","FMD","TRK","TKL","CL0","CL1","V0MvsFMD","TKLvsV0M","ZEMvsZDC"};
\r
163 fHistCentStats = new TH2F("fHistCentStats",
\r
164 "Centrality statistics;;Cent percentile",
\r
165 9,-0.5,8.5,220,-5,105);
\r
166 for(Int_t i = 1; i <= 9; i++)
\r
167 fHistCentStats->GetXaxis()->SetBinLabel(i,gCentName[i-1].Data());
\r
168 fList->Add(fHistCentStats);
\r
170 fHistTriggerStats = new TH1F("fHistTriggerStats","Trigger statistics;TriggerBit;N_{events}",130,0,130);
\r
171 fList->Add(fHistTriggerStats);
\r
173 fHistTrackStats = new TH1F("fHistTrackStats","Event statistics;TrackFilterBit;N_{events}",130,0,130);
\r
174 fList->Add(fHistTrackStats);
\r
176 // Vertex distributions
\r
177 fHistVx = new TH1F("fHistVx","Primary vertex distribution - x coordinate;V_{x} (cm);Entries",100,-0.5,0.5);
\r
178 fList->Add(fHistVx);
\r
179 fHistVy = new TH1F("fHistVy","Primary vertex distribution - y coordinate;V_{y} (cm);Entries",100,-0.5,0.5);
\r
180 fList->Add(fHistVy);
\r
181 fHistVz = new TH1F("fHistVz","Primary vertex distribution - z coordinate;V_{z} (cm);Entries",100,-20.,20.);
\r
182 fList->Add(fHistVz);
\r
185 fHistClus = new TH2F("fHistClus","# Cluster (TPC vs. ITS)",10,0,10,200,0,200);
\r
186 fList->Add(fHistClus);
\r
187 fHistChi2 = new TH1F("fHistChi2","Chi2/NDF distribution",200,0,10);
\r
188 fList->Add(fHistChi2);
\r
189 fHistDCA = new TH2F("fHistDCA","DCA (xy vs. z)",400,-5,5,400,-5,5);
\r
190 fList->Add(fHistDCA);
\r
191 fHistPt = new TH1F("fHistPt","p_{T} distribution",200,0,10);
\r
192 fList->Add(fHistPt);
\r
193 fHistEta = new TH1F("fHistEta","#eta distribution",200,-2,2);
\r
194 fList->Add(fHistEta);
\r
195 fHistPhi = new TH1F("fHistPhi","#phi distribution",200,-20,380);
\r
196 fList->Add(fHistPhi);
\r
197 fHistV0M = new TH2F("fHistV0M","V0 Multiplicity C vs. A",500, 0, 20000, 500, 0, 20000);
\r
198 fList->Add(fHistV0M);
\r
199 TString gRefTrackName[6] = {"tracks","tracksPos","tracksNeg","tracksTPConly","clusITS0","clusITS1"};
\r
200 fHistRefTracks = new TH2F("fHistRefTracks","Nr of Ref tracks/event vs. ref track estimator;;Nr of tracks",6, 0, 6, 400, 0, 20000);
\r
201 for(Int_t i = 1; i <= 6; i++)
\r
202 fHistRefTracks->GetXaxis()->SetBinLabel(i,gRefTrackName[i-1].Data());
\r
203 fList->Add(fHistRefTracks);
\r
206 // Balance function histograms
\r
208 // Initialize histograms if not done yet
\r
209 if(!fBalance->GetHistNp(0)){
\r
210 AliWarning("Histograms not yet initialized! --> Will be done now");
\r
211 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
\r
212 fBalance->InitHistograms();
\r
215 if(fRunShuffling) {
\r
216 if(!fShuffledBalance->GetHistNp(0)) {
\r
217 AliWarning("Histograms (shuffling) not yet initialized! --> Will be done now");
\r
218 AliWarning("--> Add 'gBalance->InitHistograms()' in your configBalanceFunction");
\r
219 fShuffledBalance->InitHistograms();
\r
223 for(Int_t a = 0; a < ANALYSIS_TYPES; a++){
\r
224 fListBF->Add(fBalance->GetHistNp(a));
\r
225 fListBF->Add(fBalance->GetHistNn(a));
\r
226 fListBF->Add(fBalance->GetHistNpn(a));
\r
227 fListBF->Add(fBalance->GetHistNnn(a));
\r
228 fListBF->Add(fBalance->GetHistNpp(a));
\r
229 fListBF->Add(fBalance->GetHistNnp(a));
\r
231 if(fRunShuffling) {
\r
232 fListBFS->Add(fShuffledBalance->GetHistNp(a));
\r
233 fListBFS->Add(fShuffledBalance->GetHistNn(a));
\r
234 fListBFS->Add(fShuffledBalance->GetHistNpn(a));
\r
235 fListBFS->Add(fShuffledBalance->GetHistNnn(a));
\r
236 fListBFS->Add(fShuffledBalance->GetHistNpp(a));
\r
237 fListBFS->Add(fShuffledBalance->GetHistNnp(a));
\r
241 if(fESDtrackCuts) fList->Add(fESDtrackCuts);
\r
243 // Post output data.
\r
244 PostData(1, fList);
\r
245 PostData(2, fListBF);
\r
246 if(fRunShuffling) PostData(3, fListBFS);
\r
249 //________________________________________________________________________
\r
250 void AliAnalysisTaskBF::UserExec(Option_t *) {
\r
252 // Called for each event
\r
253 TString gAnalysisLevel = fBalance->GetAnalysisLevel();
\r
255 TObjArray *array = new TObjArray();
\r
256 AliESDtrack *track_TPC = NULL;
\r
258 Int_t gNumberOfAcceptedTracks = 0;
\r
260 // vector holding the charges of all tracks
\r
261 vector<Int_t> chargeVectorShuffle; // this will be shuffled
\r
262 vector<Int_t> chargeVector; // original charge
\r
265 if(gAnalysisLevel == "ESD") {
\r
266 AliESDEvent* gESD = dynamic_cast<AliESDEvent*>(InputEvent()); // from TaskSE
\r
268 Printf("ERROR: gESD not available");
\r
272 // store offline trigger bits
\r
273 fHistTriggerStats->Fill(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected());
\r
275 // event selection done in AliAnalysisTaskSE::Exec() --> this is not used
\r
276 fHistEventStats->Fill(1); //all events
\r
277 Bool_t isSelected = kTRUE;
\r
278 if(fUseOfflineTrigger)
\r
279 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
\r
281 fHistEventStats->Fill(2); //triggered events
\r
283 if(fUseCentrality) {
\r
285 AliCentrality *centrality = gESD->GetCentrality();
\r
286 //Int_t nCentrality = 0;
\r
287 //nCentrality = centrality->GetCentralityClass5(fCentralityEstimator.Data());
\r
288 //cout<<nCentrality<<" "<<centrality->IsEventInCentralityClass(fCentralityPercentileMin,fCentralityPercentileMax,fCentralityEstimator.Data())<<endl;
\r
290 // take only events inside centrality class
\r
291 if(!centrality->IsEventInCentralityClass(fCentralityPercentileMin,
\r
292 fCentralityPercentileMax,
\r
293 fCentralityEstimator.Data()))
\r
296 // centrality QA (V0M)
\r
297 fHistV0M->Fill(gESD->GetVZEROData()->GetMTotV0A(), gESD->GetVZEROData()->GetMTotV0C());
\r
300 const AliESDVertex *vertex = gESD->GetPrimaryVertex();
\r
302 if(vertex->GetNContributors() > 0) {
\r
303 if(vertex->GetZRes() != 0) {
\r
304 fHistEventStats->Fill(3); //events with a proper vertex
\r
305 if(TMath::Abs(vertex->GetXv()) < fVxMax) {
\r
306 if(TMath::Abs(vertex->GetYv()) < fVyMax) {
\r
307 if(TMath::Abs(vertex->GetZv()) < fVzMax) {
\r
308 fHistEventStats->Fill(4); //analayzed events
\r
309 fHistVx->Fill(vertex->GetXv());
\r
310 fHistVy->Fill(vertex->GetYv());
\r
311 fHistVz->Fill(vertex->GetZv());
\r
313 //Printf("There are %d tracks in this event", gESD->GetNumberOfTracks());
\r
314 for (Int_t iTracks = 0; iTracks < gESD->GetNumberOfTracks(); iTracks++) {
\r
315 AliESDtrack* track = dynamic_cast<AliESDtrack *>(gESD->GetTrack(iTracks));
\r
317 Printf("ERROR: Could not receive track %d", iTracks);
\r
321 // take only TPC only tracks
\r
322 track_TPC = new AliESDtrack();
\r
323 if(!track->FillTPCOnlyTrack(*track_TPC)) continue;
\r
327 if(!fESDtrackCuts->AcceptTrack(track_TPC)) continue;
\r
329 // fill QA histograms
\r
332 track_TPC->GetImpactParameters(b,bCov);
\r
333 if (bCov[0]<=0 || bCov[2]<=0) {
\r
334 AliDebug(1, "Estimated b resolution lower or equal zero!");
\r
335 bCov[0]=0; bCov[2]=0;
\r
338 Int_t nClustersTPC = -1;
\r
339 nClustersTPC = track_TPC->GetTPCNclsIter1(); // TPC standalone
\r
340 //nClustersTPC = track->GetTPCclusters(0); // global track
\r
341 Float_t chi2PerClusterTPC = -1;
\r
342 if (nClustersTPC!=0) {
\r
343 chi2PerClusterTPC = track_TPC->GetTPCchi2Iter1()/Float_t(nClustersTPC); // TPC standalone
\r
344 //chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC); // global track
\r
347 fHistClus->Fill(track_TPC->GetITSclusters(0),nClustersTPC);
\r
348 fHistDCA->Fill(b[1],b[0]);
\r
349 fHistChi2->Fill(chi2PerClusterTPC);
\r
350 fHistPt->Fill(track_TPC->Pt());
\r
351 fHistEta->Fill(track_TPC->Eta());
\r
352 fHistPhi->Fill(track_TPC->Phi()*TMath::RadToDeg());
\r
355 array->Add(track_TPC);
\r
357 // fill charge vector
\r
358 chargeVector.push_back(track_TPC->Charge());
\r
360 chargeVectorShuffle.push_back(track_TPC->Charge());
\r
369 }//proper vertex resolution
\r
370 }//proper number of contributors
\r
371 }//vertex object valid
\r
372 }//triggered event
\r
375 //AOD analysis (vertex and track cuts also here!!!!)
\r
376 else if(gAnalysisLevel == "AOD") {
\r
377 AliAODEvent* gAOD = dynamic_cast<AliAODEvent*>(InputEvent()); // from TaskSE
\r
379 Printf("ERROR: gAOD not available");
\r
383 AliAODHeader *aodHeader = gAOD->GetHeader();
\r
385 // store offline trigger bits
\r
386 fHistTriggerStats->Fill(aodHeader->GetOfflineTrigger());
\r
388 // event selection done in AliAnalysisTaskSE::Exec() --> this is not used
\r
389 fHistEventStats->Fill(1); //all events
\r
390 Bool_t isSelected = kTRUE;
\r
391 if(fUseOfflineTrigger)
\r
392 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
\r
394 fHistEventStats->Fill(2); //triggered events
\r
396 //Centrality stuff (centrality in AOD header)
\r
397 if(fUseCentrality) {
\r
398 Float_t fCentrality = aodHeader->GetCentralityP()->GetCentralityPercentile(fCentralityEstimator.Data());
\r
399 // cout<<fCentralityEstimator.Data()<<" = "<<fCentrality<<" , others are V0M = "
\r
400 // << aodHeader->GetCentralityP()->GetCentralityPercentile("V0M")
\r
401 // <<" FMD = "<<aodHeader->GetCentralityP()->GetCentralityPercentile("FMD")
\r
402 // <<" TRK = "<<aodHeader->GetCentralityP()->GetCentralityPercentile("TRK")
\r
403 // <<" TKL = "<<aodHeader->GetCentralityP()->GetCentralityPercentile("TKL")
\r
404 // <<" CL0 ="<<aodHeader->GetCentralityP()->GetCentralityPercentile("CL0")
\r
405 // <<" CL1 ="<<aodHeader->GetCentralityP()->GetCentralityPercentile("CL1")
\r
406 // <<" V0MvsFMD = "<<aodHeader->GetCentralityP()->GetCentralityPercentile("V0MvsFMD")
\r
407 // <<" TKLvsV0M = "<<aodHeader->GetCentralityP()->GetCentralityPercentile("TKLvsV0M")
\r
408 // <<" ZEMvsZDC = "<<aodHeader->GetCentralityP()->GetCentralityPercentile("ZEMvsZDC")
\r
411 // QA for centrality estimators
\r
412 fHistCentStats->Fill(0.,aodHeader->GetCentralityP()->GetCentralityPercentile("V0M"));
\r
413 fHistCentStats->Fill(1.,aodHeader->GetCentralityP()->GetCentralityPercentile("FMD"));
\r
414 fHistCentStats->Fill(2.,aodHeader->GetCentralityP()->GetCentralityPercentile("TRK"));
\r
415 fHistCentStats->Fill(3.,aodHeader->GetCentralityP()->GetCentralityPercentile("TKL"));
\r
416 fHistCentStats->Fill(4.,aodHeader->GetCentralityP()->GetCentralityPercentile("CL0"));
\r
417 fHistCentStats->Fill(5.,aodHeader->GetCentralityP()->GetCentralityPercentile("CL1"));
\r
418 fHistCentStats->Fill(6.,aodHeader->GetCentralityP()->GetCentralityPercentile("V0MvsFMD"));
\r
419 fHistCentStats->Fill(7.,aodHeader->GetCentralityP()->GetCentralityPercentile("TKLvsV0M"));
\r
420 fHistCentStats->Fill(8.,aodHeader->GetCentralityP()->GetCentralityPercentile("ZEMvsZDC"));
\r
422 // take only events inside centrality class
\r
423 if((fCentrality < fCentralityPercentileMin) || (fCentrality > fCentralityPercentileMax))
\r
426 // centrality QA (V0M)
\r
427 fHistV0M->Fill(gAOD->GetVZEROData()->GetMTotV0A(), gAOD->GetVZEROData()->GetMTotV0C());
\r
429 // centrality QA (reference tracks)
\r
430 fHistRefTracks->Fill(0.,aodHeader->GetRefMultiplicity());
\r
431 fHistRefTracks->Fill(1.,aodHeader->GetRefMultiplicityPos());
\r
432 fHistRefTracks->Fill(2.,aodHeader->GetRefMultiplicityNeg());
\r
433 fHistRefTracks->Fill(3.,aodHeader->GetTPConlyRefMultiplicity());
\r
434 fHistRefTracks->Fill(4.,aodHeader->GetNumberOfITSClusters(0));
\r
435 fHistRefTracks->Fill(5.,aodHeader->GetNumberOfITSClusters(1));
\r
436 fHistRefTracks->Fill(6.,aodHeader->GetNumberOfITSClusters(2));
\r
437 fHistRefTracks->Fill(7.,aodHeader->GetNumberOfITSClusters(3));
\r
438 fHistRefTracks->Fill(8.,aodHeader->GetNumberOfITSClusters(4));
\r
441 const AliAODVertex *vertex = gAOD->GetPrimaryVertex();
\r
444 Double32_t fCov[6];
\r
445 vertex->GetCovarianceMatrix(fCov);
\r
447 if(vertex->GetNContributors() > 0) {
\r
449 fHistEventStats->Fill(3); //events with a proper vertex
\r
450 if(TMath::Abs(vertex->GetX()) < fVxMax) {
\r
451 if(TMath::Abs(vertex->GetY()) < fVyMax) {
\r
452 if(TMath::Abs(vertex->GetZ()) < fVzMax) {
\r
453 fHistEventStats->Fill(4); //analyzed events
\r
454 fHistVx->Fill(vertex->GetX());
\r
455 fHistVy->Fill(vertex->GetY());
\r
456 fHistVz->Fill(vertex->GetZ());
\r
458 //Printf("There are %d tracks in this event", gAOD->GetNumberOfTracks());
\r
459 for (Int_t iTracks = 0; iTracks < gAOD->GetNumberOfTracks(); iTracks++) {
\r
460 AliAODTrack* aodTrack = dynamic_cast<AliAODTrack *>(gAOD->GetTrack(iTracks));
\r
462 Printf("ERROR: Could not receive track %d", iTracks);
\r
468 // For ESD Filter Information: ANALYSIS/macros/AddTaskESDfilter.C
\r
469 // take only TPC only tracks
\r
470 fHistTrackStats->Fill(aodTrack->GetFilterMap());
\r
471 if(!aodTrack->TestFilterBit(nAODtrackCutBit)) continue;
\r
473 Float_t pt = aodTrack->Pt();
\r
474 Float_t eta = aodTrack->Eta();
\r
476 Float_t DCAxy = aodTrack->DCA(); // this is the DCA from global track (not exactly what is cut on)
\r
477 Float_t DCAz = aodTrack->ZAtDCA(); // this is the DCA from global track (not exactly what is cut on)
\r
480 // Kinematics cuts from ESD track cuts
\r
481 if( pt < fPtMin || pt > fPtMax) continue;
\r
482 if( eta < fEtaMin || eta > fEtaMax) continue;
\r
484 // Extra DCA cuts (for systematic studies [!= -1])
\r
485 if( fDCAxyCut != -1 && fDCAxyCut != -1){
\r
486 if(TMath::Sqrt((DCAxy*DCAxy)/(fDCAxyCut*fDCAxyCut)+(DCAz*DCAz)/(fDCAzCut*fDCAzCut)) > 1 ){
\r
487 continue; // 2D cut
\r
491 // Extra TPC cuts (for systematic studies [!= -1])
\r
492 if( fTPCchi2Cut != -1 && aodTrack->Chi2perNDF() > fTPCchi2Cut){
\r
495 if( fNClustersTPCCut != -1 && aodTrack->GetTPCNcls() < fNClustersTPCCut){
\r
500 // fill QA histograms
\r
501 fHistClus->Fill(aodTrack->GetITSNcls(),aodTrack->GetTPCNcls());
\r
502 fHistDCA->Fill(DCAz,DCAxy);
\r
503 fHistChi2->Fill(aodTrack->Chi2perNDF());
\r
505 fHistEta->Fill(eta);
\r
506 fHistPhi->Fill(aodTrack->Phi()*TMath::RadToDeg());
\r
508 gNumberOfAcceptedTracks += 1;
\r
510 array->Add(aodTrack);
\r
512 // fill charge vector
\r
513 chargeVector.push_back(aodTrack->Charge());
\r
514 if(fRunShuffling) {
\r
515 chargeVectorShuffle.push_back(aodTrack->Charge());
\r
521 }//proper vertex resolution
\r
522 }//proper number of contributors
\r
523 }//vertex object valid
\r
524 }//triggered event
\r
528 if(gAnalysisLevel == "MCESD") {
\r
529 AliMCEvent* mcEvent = MCEvent();
\r
531 Printf("ERROR: mcEvent not available");
\r
535 AliESDEvent* gESD = dynamic_cast<AliESDEvent*>(InputEvent()); // from TaskSE
\r
537 Printf("ERROR: gESD not available");
\r
541 // store offline trigger bits
\r
542 fHistTriggerStats->Fill(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected());
\r
544 // event selection done in AliAnalysisTaskSE::Exec() --> this is not used
\r
545 fHistEventStats->Fill(1); //all events
\r
546 Bool_t isSelected = kTRUE;
\r
547 if(fUseOfflineTrigger)
\r
548 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
\r
550 fHistEventStats->Fill(2); //triggered events
\r
552 if(fUseCentrality) {
\r
554 AliCentrality *centrality = gESD->GetCentrality();
\r
555 //Int_t nCentrality = 0;
\r
556 //nCentrality = centrality->GetCentralityClass5(fCentralityEstimator.Data());
\r
557 //cout<<nCentrality<<" "<<centrality->IsEventInCentralityClass(fCentralityPercentileMin,fCentralityPercentileMax,fCentralityEstimator.Data())<<endl;
\r
559 // take only events inside centrality class
\r
560 if(!centrality->IsEventInCentralityClass(fCentralityPercentileMin,
\r
561 fCentralityPercentileMax,
\r
562 fCentralityEstimator.Data()))
\r
565 // centrality QA (V0M)
\r
566 fHistV0M->Fill(gESD->GetVZEROData()->GetMTotV0A(), gESD->GetVZEROData()->GetMTotV0C());
\r
569 const AliESDVertex *vertex = gESD->GetPrimaryVertex();
\r
571 if(vertex->GetNContributors() > 0) {
\r
572 if(vertex->GetZRes() != 0) {
\r
573 fHistEventStats->Fill(3); //events with a proper vertex
\r
574 if(TMath::Abs(vertex->GetXv()) < fVxMax) {
\r
575 if(TMath::Abs(vertex->GetYv()) < fVyMax) {
\r
576 if(TMath::Abs(vertex->GetZv()) < fVzMax) {
\r
577 fHistEventStats->Fill(4); //analayzed events
\r
578 fHistVx->Fill(vertex->GetXv());
\r
579 fHistVy->Fill(vertex->GetYv());
\r
580 fHistVz->Fill(vertex->GetZv());
\r
582 //Printf("There are %d tracks in this event", gESD->GetNumberOfTracks());
\r
583 for (Int_t iTracks = 0; iTracks < gESD->GetNumberOfTracks(); iTracks++) {
\r
584 AliESDtrack* track = dynamic_cast<AliESDtrack *>(gESD->GetTrack(iTracks));
\r
586 Printf("ERROR: Could not receive track %d", iTracks);
\r
590 Int_t label = TMath::Abs(track->GetLabel());
\r
591 if(label > mcEvent->GetNumberOfTracks()) continue;
\r
592 if(label > mcEvent->GetNumberOfPrimaries()) continue;
\r
594 AliMCParticle* mcTrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(label));
\r
595 if(!mcTrack) continue;
\r
597 // take only TPC only tracks
\r
598 track_TPC = new AliESDtrack();
\r
599 if(!track->FillTPCOnlyTrack(*track_TPC)) continue;
\r
603 if(!fESDtrackCuts->AcceptTrack(track_TPC)) continue;
\r
605 // fill QA histograms
\r
608 track_TPC->GetImpactParameters(b,bCov);
\r
609 if (bCov[0]<=0 || bCov[2]<=0) {
\r
610 AliDebug(1, "Estimated b resolution lower or equal zero!");
\r
611 bCov[0]=0; bCov[2]=0;
\r
614 Int_t nClustersTPC = -1;
\r
615 nClustersTPC = track_TPC->GetTPCNclsIter1(); // TPC standalone
\r
616 //nClustersTPC = track->GetTPCclusters(0); // global track
\r
617 Float_t chi2PerClusterTPC = -1;
\r
618 if (nClustersTPC!=0) {
\r
619 chi2PerClusterTPC = track_TPC->GetTPCchi2Iter1()/Float_t(nClustersTPC); // TPC standalone
\r
620 //chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC); // global track
\r
623 fHistClus->Fill(track_TPC->GetITSclusters(0),nClustersTPC);
\r
624 fHistDCA->Fill(b[1],b[0]);
\r
625 fHistChi2->Fill(chi2PerClusterTPC);
\r
626 fHistPt->Fill(mcTrack->Pt());
\r
627 fHistEta->Fill(mcTrack->Eta());
\r
628 fHistPhi->Fill(mcTrack->Phi()*TMath::RadToDeg());
\r
631 array->Add(track_TPC);
\r
633 // fill charge vector
\r
634 chargeVector.push_back(track_TPC->Charge());
\r
636 chargeVectorShuffle.push_back(track_TPC->Charge());
\r
645 }//proper vertex resolution
\r
646 }//proper number of contributors
\r
647 }//vertex object valid
\r
648 }//triggered event
\r
652 else if(gAnalysisLevel == "MC") {
\r
653 AliMCEvent* mcEvent = MCEvent();
\r
655 Printf("ERROR: mcEvent not available");
\r
659 Double_t gReactionPlane = 0., gImpactParameter = 0.;
\r
660 if(fUseCentrality) {
\r
661 //Get the MC header
\r
662 AliGenHijingEventHeader* headerH = dynamic_cast<AliGenHijingEventHeader*>(mcEvent->GenEventHeader());
\r
664 //Printf("=====================================================");
\r
665 //Printf("Reaction plane angle: %lf",headerH->ReactionPlaneAngle());
\r
666 //Printf("Impact parameter: %lf",headerH->ImpactParameter());
\r
667 //Printf("=====================================================");
\r
668 gReactionPlane = headerH->ReactionPlaneAngle();
\r
669 gImpactParameter = headerH->ImpactParameter();
\r
671 // take only events inside centrality class
\r
672 if((fImpactParameterMin > gImpactParameter) || (fImpactParameterMax < gImpactParameter))
\r
676 AliGenEventHeader *header = mcEvent->GenEventHeader();
\r
677 if(!header) return;
\r
679 TArrayF gVertexArray;
\r
680 header->PrimaryVertex(gVertexArray);
\r
681 //Printf("Vertex: %lf (x) - %lf (y) - %lf (z)",
\r
682 //gVertexArray.At(0),
\r
683 //gVertexArray.At(1),
\r
684 //gVertexArray.At(2));
\r
685 fHistEventStats->Fill(3); //events with a proper vertex
\r
686 if(TMath::Abs(gVertexArray.At(0)) < fVxMax) {
\r
687 if(TMath::Abs(gVertexArray.At(1)) < fVyMax) {
\r
688 if(TMath::Abs(gVertexArray.At(2)) < fVzMax) {
\r
689 fHistEventStats->Fill(4); //analayzed events
\r
690 fHistVx->Fill(gVertexArray.At(0));
\r
691 fHistVy->Fill(gVertexArray.At(1));
\r
692 fHistVz->Fill(gVertexArray.At(2));
\r
694 Printf("There are %d tracks in this event", mcEvent->GetNumberOfPrimaries());
\r
695 for (Int_t iTracks = 0; iTracks < mcEvent->GetNumberOfPrimaries(); iTracks++) {
\r
696 AliMCParticle* track = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(iTracks));
\r
698 Printf("ERROR: Could not receive particle %d", iTracks);
\r
702 if( track->Pt() < fPtMin || track->Pt() > fPtMax)
\r
704 if( track->Eta() < fEtaMin || track->Eta() > fEtaMax)
\r
709 // fill charge vector
\r
710 chargeVector.push_back(track->Charge());
\r
711 if(fRunShuffling) {
\r
712 chargeVectorShuffle.push_back(track->Charge());
\r
720 if(fUseMultiplicity)
\r
721 if((gNumberOfAcceptedTracks < fNumberOfAcceptedTracksMin)||(gNumberOfAcceptedTracks > fNumberOfAcceptedTracksMax))
\r
724 // calculate balance function
\r
725 fBalance->CalculateBalance(array,chargeVector);
\r
727 if(fRunShuffling) {
\r
729 random_shuffle( chargeVectorShuffle.begin(), chargeVectorShuffle.end() );
\r
730 fShuffledBalance->CalculateBalance(array,chargeVectorShuffle);
\r
736 //________________________________________________________________________
\r
737 void AliAnalysisTaskBF::FinishTaskOutput(){
\r
738 //Printf("END BF");
\r
741 Printf("ERROR: fBalance not available");
\r
744 if(fRunShuffling) {
\r
745 if (!fShuffledBalance) {
\r
746 Printf("ERROR: fShuffledBalance not available");
\r
753 //________________________________________________________________________
\r
754 void AliAnalysisTaskBF::Terminate(Option_t *) {
\r
755 // Draw result to the screen
\r
756 // Called once at the end of the query
\r
758 // not implemented ...
\r