11 #include "AliAnalysisTask.h"
12 #include "AliAnalysisManager.h"
15 #include "AliMCEvent.h"
16 #include "AliAODEvent.h"
17 #include "AliAODInputHandler.h"
18 #include "AliAODMCParticle.h"
19 #include "AliAODMCHeader.h"
20 #include "AliCentrality.h"
21 #include "AliGenEventHeader.h"
24 #include "AliAnalysisTaskEffContBF.h"
26 // ---------------------------------------------------------------------
28 // Task for calculating the efficiency of the Balance Function
29 // for single particles and pairs
31 // ---------------------------------------------------------------------
33 ClassImp(AliAnalysisTaskEffContBF)
35 //________________________________________________________________________
36 AliAnalysisTaskEffContBF::AliAnalysisTaskEffContBF(const char *name)
37 : AliAnalysisTaskSE(name),
46 fHistContaminationSecondariesPlus(0),
47 fHistContaminationSecondariesMinus(0), //
48 fHistContaminationPrimariesPlus(0),
49 fHistContaminationPrimariesMinus(0), //
50 fHistGeneratedEtaPtPhiPlus(0),
51 fHistSurvivedEtaPtPhiPlus(0),
52 fHistGeneratedEtaPtPhiMinus(0),
53 fHistSurvivedEtaPtPhiMinus(0),
54 fHistGeneratedEtaPtPlusControl(0),
55 fHistSurvivedEtaPtPlusControl(0),
56 fHistGeneratedEtaPtMinusControl(0),
57 fHistSurvivedEtaPtMinusControl(0),
58 fHistGeneratedEtaPtPlusPlus(0),
59 fHistSurvivedEtaPtPlusPlus(0),
60 fHistGeneratedEtaPtMinusMinus(0),
61 fHistSurvivedEtaPtMinusMinus(0),
62 fHistGeneratedEtaPtPlusMinus(0),
63 fHistSurvivedEtaPtPlusMinus(0),
64 fHistGeneratedPhiEtaPlusPlus(0),
65 fHistSurvivedPhiEtaPlusPlus(0),
66 fHistGeneratedPhiEtaMinusMinus(0),
67 fHistSurvivedPhiEtaMinusMinus(0),
68 fHistGeneratedPhiEtaPlusMinus(0),
69 fHistSurvivedPhiEtaPlusMinus(0),
70 fUseCentrality(kFALSE),
71 fCentralityEstimator("V0M"),
72 fCentralityPercentileMin(0.0),
73 fCentralityPercentileMax(5.0),
78 fMinNumberOfTPCClusters(80),
79 fMaxChi2PerTPCCluster(4.0),
90 fEtaBin(100), //=100 (BF) 16
91 fdEtaBin(64), //=64 (BF) 16
92 fPtBin(100), //=100 (BF) 36
93 fHistSurvived4EtaPtPhiPlus(0),
94 fHistSurvived8EtaPtPhiPlus(0)
97 // Define input and output slots here
98 // Input slot #0 works with a TChain
99 DefineInput(0, TChain::Class());
100 // Output slot #0 id reserved by the base class for AOD
101 // Output slot #1 writes into a TH1 container
102 DefineOutput(1, TList::Class());
103 DefineOutput(2, TList::Class());
106 //________________________________________________________________________
107 void AliAnalysisTaskEffContBF::UserCreateOutputObjects() {
111 fQAList = new TList();
112 fQAList->SetName("QAList");
115 fOutputList = new TList();
116 fOutputList->SetName("OutputList");
117 fOutputList->SetOwner();
120 TString gCutName[4] = {"Total","Offline trigger",
121 "Vertex","Analyzed"};
122 fHistEventStats = new TH1F("fHistEventStats",
123 "Event statistics;;N_{events}",
125 for(Int_t i = 1; i <= 4; i++)
126 fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1].Data());
127 fQAList->Add(fHistEventStats);
129 //====================================================//
134 Double_t nArrayPt[37]={0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 7.0, 8.0, 9.0, 10.0, 15.0, 20.0};
135 Double_t nArrayEta[17]={-0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8};
137 Double_t nArrayPhi[phiBin+1];
138 for(Int_t iBin = 0; iBin <= phiBin; iBin++)
139 nArrayPhi[iBin] = iBin*TMath::TwoPi()/phiBin;
143 Double_t nArrayDPhi[dphiBin+1];
144 for(Int_t iBin = 0; iBin <= phiBin; iBin++)
145 nArrayDPhi[iBin] = iBin*TMath::TwoPi()/dphiBin;
146 Double_t nArrayDEta[17]={0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6};
147 //====================================================//
150 fHistCentrality = new TH1F("fHistCentrality",";Centrality bin;Events",
152 fQAList->Add(fHistCentrality);
154 //multiplicity (good MC tracks)
156 histName = "fHistNMult";
157 fHistNMult = new TH1F(histName.Data(),
160 fQAList->Add(fHistNMult);
162 //Vz addition+++++++++++++++++++++++++++++
163 fHistVz = new TH1F("fHistVz","Primary vertex distribution - z coordinate;V_{z} (cm);Entries",100,-20.,20.);
164 fQAList->Add(fHistVz);
166 //Contamination for Secondaries
167 fHistContaminationSecondariesPlus = new TH3D("fHistContaminationSecondariesPlus","Secondaries;#eta;p_{T} (GeV/c);#varphi",etaBin,nArrayEta,ptBin,nArrayPt,phiBin,nArrayPhi);
168 fOutputList->Add(fHistContaminationSecondariesPlus);
170 fHistContaminationSecondariesMinus = new TH3D("fHistContaminationSecondariesMinus","Secondaries;#eta;p_{T} (GeV/c);#varphi",etaBin,nArrayEta,ptBin,nArrayPt,phiBin,nArrayPhi);
171 fOutputList->Add(fHistContaminationSecondariesMinus);
173 //Contamination for Primaries
174 fHistContaminationPrimariesPlus = new TH3D("fHistContaminationPrimariesPlus","Primaries;#eta;p_{T} (GeV/c);#varphi",etaBin,nArrayEta,ptBin,nArrayPt,phiBin,nArrayPhi);
175 fOutputList->Add(fHistContaminationPrimariesPlus);
177 fHistContaminationPrimariesMinus = new TH3D("fHistContaminationPrimariesMinus","Primaries;#eta;p_{T} (GeV/c);#varphi",etaBin,nArrayEta,ptBin,nArrayPt,phiBin,nArrayPhi);
178 fOutputList->Add(fHistContaminationPrimariesMinus);
180 //eta vs pt for MC positives
181 fHistGeneratedEtaPtPhiPlus = new TH3D("fHistGeneratedEtaPtPhiPlus",
182 "Generated positive primaries;#eta;p_{T} (GeV/c);#phi",
183 etaBin,nArrayEta, ptBin, nArrayPt,phiBin, nArrayPhi);
184 // fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,nArrayPhi);
185 fOutputList->Add(fHistGeneratedEtaPtPhiPlus);
186 fHistSurvivedEtaPtPhiPlus = new TH3D("fHistSurvivedEtaPtPhiPlus",
187 "Survived positive primaries;#eta;p_{T} (GeV/c);#phi",
188 etaBin,nArrayEta,ptBin,nArrayPt,phiBin,nArrayPhi);
189 fOutputList->Add(fHistSurvivedEtaPtPhiPlus);
191 //eta vs pt for MC negatives
192 fHistGeneratedEtaPtPhiMinus = new TH3D("fHistGeneratedEtaPtPhiMinus",
193 "Generated positive primaries;#eta;p_{T} (GeV/c);#phi",
194 etaBin,nArrayEta,ptBin,nArrayPt,phiBin,nArrayPhi);
195 fOutputList->Add(fHistGeneratedEtaPtPhiMinus);
196 fHistSurvivedEtaPtPhiMinus = new TH3D("fHistSurvivedEtaPtPhiMinus",
197 "Survived positive primaries;#eta;p_{T} (GeV/c);#phi",
198 etaBin,nArrayEta,ptBin,nArrayPt,phiBin,nArrayPhi);
199 fOutputList->Add(fHistSurvivedEtaPtPhiMinus);
201 //eta vs pt for MC positives (control)
202 fHistGeneratedEtaPtPlusControl = new TH2F("fHistGeneratedEtaPtPlusControl",
203 "Generated positive primaries;#eta;p_{T} (GeV/c)",
204 etaBin,nArrayEta,ptBin,nArrayPt);
205 fOutputList->Add(fHistGeneratedEtaPtPlusControl);
206 fHistSurvivedEtaPtPlusControl = new TH2F("fHistSurvivedEtaPtPlusControl",
207 "Survived positive primaries;#eta;p_{T} (GeV/c)",
208 etaBin,nArrayEta,ptBin,nArrayPt);
209 fOutputList->Add(fHistSurvivedEtaPtPlusControl);
211 //eta vs pt for MC negatives (control)
212 fHistGeneratedEtaPtMinusControl = new TH2F("fHistGeneratedEtaPtMinusControl",
213 "Generated positive primaries;#eta;p_{T} (GeV/c)",
214 etaBin,nArrayEta,ptBin,nArrayPt);
215 fOutputList->Add(fHistGeneratedEtaPtMinusControl);
216 fHistSurvivedEtaPtMinusControl = new TH2F("fHistSurvivedEtaPtMinusControl",
217 "Survived positive primaries;#eta;p_{T} (GeV/c)",
218 etaBin,nArrayEta,ptBin,nArrayPt);
219 fOutputList->Add(fHistSurvivedEtaPtMinusControl);
221 //eta vs pt for MC ++
222 fHistGeneratedEtaPtPlusPlus = new TH2F("fHistGeneratedEtaPtPlusPlus",
223 "Generated ++ primaries;#Delta#eta;p_{T} (GeV/c)",
224 detaBin,nArrayDEta,ptBin,nArrayPt);
225 fOutputList->Add(fHistGeneratedEtaPtPlusPlus);
226 fHistSurvivedEtaPtPlusPlus = new TH2F("fHistSurvivedEtaPtPlusPlus",
227 "Survived ++ primaries;#Delta#eta;p_{T} (GeV/c)",
228 detaBin,nArrayDEta,ptBin,nArrayPt);
229 fOutputList->Add(fHistSurvivedEtaPtPlusPlus);
231 //eta vs pt for MC --
232 fHistGeneratedEtaPtMinusMinus = new TH2F("fHistGeneratedEtaPtMinusMinus",
233 "Generated -- primaries;#Delta#eta;p_{T} (GeV/c)",
234 detaBin,nArrayDEta,ptBin,nArrayPt);
235 fOutputList->Add(fHistGeneratedEtaPtMinusMinus);
236 fHistSurvivedEtaPtMinusMinus = new TH2F("fHistSurvivedEtaPtMinusMinus",
237 "Survived -- primaries;#Delta#eta;p_{T} (GeV/c)",
238 detaBin,nArrayDEta,ptBin,nArrayPt);
239 fOutputList->Add(fHistSurvivedEtaPtMinusMinus);
241 //eta vs pt for MC +-
242 fHistGeneratedEtaPtPlusMinus = new TH2F("fHistGeneratedEtaPtPlusMinus",
243 "Generated +- primaries;#Delta#eta;p_{T} (GeV/c)",
244 detaBin,nArrayDEta,ptBin,nArrayPt);
245 fOutputList->Add(fHistGeneratedEtaPtPlusMinus);
246 fHistSurvivedEtaPtPlusMinus = new TH2F("fHistSurvivedEtaPtPlusMinus",
247 "Survived +- primaries;#Delta#eta;p_{T} (GeV/c)",
248 detaBin,nArrayDEta,ptBin,nArrayPt);
249 fOutputList->Add(fHistSurvivedEtaPtPlusMinus);
251 //=============================//
252 //phi vs eta for MC ++
253 fHistGeneratedPhiEtaPlusPlus = new TH2F("fHistGeneratedPhiEtaPlusPlus",
254 "Generated ++ primaries;#Delta#phi",
255 dphiBin,nArrayDPhi,detaBin,nArrayDEta);
256 fOutputList->Add(fHistGeneratedPhiEtaPlusPlus);
257 fHistSurvivedPhiEtaPlusPlus = new TH2F("fHistSurvivedPhiEtaPlusPlus",
258 "Survived ++ primaries;#Delta#phi;#Delta#eta",
259 dphiBin,nArrayDPhi,detaBin,nArrayDEta);
260 fOutputList->Add(fHistSurvivedPhiEtaPlusPlus);
262 //phi vs eta for MC --
263 fHistGeneratedPhiEtaMinusMinus = new TH2F("fHistGeneratedPhiEtaMinusMinus",
264 "Generated -- primaries;#Delta#phi;#Delta#eta",
265 dphiBin,nArrayDPhi,detaBin,nArrayDEta);
266 fOutputList->Add(fHistGeneratedPhiEtaMinusMinus);
267 fHistSurvivedPhiEtaMinusMinus = new TH2F("fHistSurvivedPhiEtaMinusMinus",
268 "Survived -- primaries;#Delta#phi;#Delta#eta",
269 dphiBin,nArrayDPhi,detaBin,nArrayDEta);
270 fOutputList->Add(fHistSurvivedPhiEtaMinusMinus);
272 //phi vs eta for MC +-
273 fHistGeneratedPhiEtaPlusMinus = new TH2F("fHistGeneratedPhiEtaPlusMinus",
274 "Generated +- primaries;#Delta#phi;#Delta#eta",
275 dphiBin,nArrayDPhi,detaBin,nArrayDEta);
276 fOutputList->Add(fHistGeneratedPhiEtaPlusMinus);
277 fHistSurvivedPhiEtaPlusMinus = new TH2F("fHistSurvivedPhiEtaPlusMinus",
278 "Survived +- primaries;#Delta#phi;#Delta#eta",
279 dphiBin,nArrayDPhi,detaBin,nArrayDEta);
280 fOutputList->Add(fHistSurvivedPhiEtaPlusMinus);
282 fHistSurvived4EtaPtPhiPlus = new TH3F("fHistSurvived4EtaPtPhiPlus",
283 "Survived4 + primaries;#eta;p_{T} (GeV/c);#phi",
284 etaBin,nArrayEta,ptBin,nArrayPt,phiBin,nArrayPhi);
285 fOutputList->Add(fHistSurvived4EtaPtPhiPlus);
286 fHistSurvived8EtaPtPhiPlus = new TH3F("fHistSurvived8EtaPtPhiPlus",
287 "Survived8 + primaries;#eta;p_{T} (GeV/c);#phi",
288 etaBin,nArrayEta,ptBin,nArrayPt,phiBin,nArrayPhi);
289 fOutputList->Add(fHistSurvived8EtaPtPhiPlus);
292 //fOutputList->Print();
293 PostData(1, fQAList);
294 PostData(2, fOutputList);
297 //________________________________________________________________________
298 void AliAnalysisTaskEffContBF::UserExec(Option_t *) {
300 // Called for each event
302 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
304 printf("ERROR: fAOD not available\n");
308 fArrayMC = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
310 AliFatal("No array of MC particles found !!!"); // MW no AliFatal use return values
312 AliMCEvent* mcEvent = MCEvent();
314 AliError("ERROR: Could not retrieve MC event");
318 // ==============================================================================================
319 // Copy from AliAnalysisTaskPhiCorrelations:
320 // For productions with injected signals, figure out above which label to skip particles/tracks
321 Int_t skipParticlesAbove = 0;
322 if (fInjectedSignals)
324 AliGenEventHeader* eventHeader = 0;
328 AliAODMCHeader* header = (AliAODMCHeader*) fAOD->GetList()->FindObject(AliAODMCHeader::StdBranchName());
330 AliFatal("fInjectedSignals set but no MC header found");
332 headers = header->GetNCocktailHeaders();
333 eventHeader = header->GetCocktailHeader(0);
338 // We avoid AliFatal here, because the AOD productions sometimes have events where the MC header is missing
339 // (due to unreadable Kinematics) and we don't want to loose the whole job because of a few events
340 AliError("First event header not found. Skipping this event.");
344 skipParticlesAbove = eventHeader->NProduced();
345 AliInfo(Form("Injected signals in this event (%d headers). Keeping particles/tracks of %s. Will skip particles/tracks above %d.", headers, eventHeader->ClassName(), skipParticlesAbove));
347 // ==============================================================================================
350 // arrays for 2 particle histograms
351 Int_t nMCLabelCounter = 0;
352 const Int_t maxMCLabelCounter = 20000;
354 Double_t eta[maxMCLabelCounter];
355 Double_t pt[maxMCLabelCounter];
356 Double_t phi[maxMCLabelCounter];
357 Int_t level[maxMCLabelCounter];
358 Int_t charge[maxMCLabelCounter];
360 //AliInfo(Form("%d %d",mcEvent->GetNumberOfTracks(),fAOD->GetNumberOfTracks()));
362 fHistEventStats->Fill(1); //all events
365 AliAODHeader *header = dynamic_cast<AliAODHeader*>(fAOD->GetHeader());
366 Double_t nCentrality = 0;
369 AliCentrality *centrality = header->GetCentralityP();
370 nCentrality =centrality->GetCentralityPercentile(fCentralityEstimator.Data());
373 if(!centrality->IsEventInCentralityClass(fCentralityPercentileMin,
374 fCentralityPercentileMax,
375 fCentralityEstimator.Data()))
378 fHistEventStats->Fill(2); //triggered + centrality
379 fHistCentrality->Fill(nCentrality);
382 //Printf("Centrality selection: %lf - %lf",fCentralityPercentileMin,fCentralityPercentileMax);
384 const AliAODVertex *vertex = fAOD->GetPrimaryVertex();
386 if(vertex->GetNContributors() > 0) {
388 vertex->GetCovarianceMatrix(fCov);
390 fHistEventStats->Fill(3); //events with a proper vertex
391 if(TMath::Abs(vertex->GetX()) < fVxMax) { // antes Xv
392 //Printf("X Vertex: %lf", vertex->GetX());
393 //Printf("Y Vertex: %lf", vertex->GetY());
394 if(TMath::Abs(vertex->GetY()) < fVyMax) { // antes Yv
395 if(TMath::Abs(vertex->GetZ()) < fVzMax) { // antes Zv
396 //Printf("Z Vertex: %lf", vertex->GetZ());
398 fHistEventStats->Fill(4); //analyzed events
399 fHistVz->Fill(vertex->GetZ());
401 //++++++++++++++++++CONTAMINATION++++++++++++++++++//
402 Int_t nGoodAODTracks = fAOD->GetNumberOfTracks();
403 Int_t nMCParticles = mcEvent->GetNumberOfTracks();
404 TArrayI labelMCArray(nMCParticles);
406 for(Int_t jTracks = 0; jTracks < nGoodAODTracks; jTracks++) {
407 AliAODTrack* track = fAOD->GetTrack(jTracks);
410 if (!track->TestFilterBit(fAODTrackCutBit))
414 if(TMath::Abs(track->Eta()) > fMaxEta)
416 if((track->Pt() > fMaxPt)||(track->Pt() < fMinPt))
419 Double_t phiRad = track->Phi();
421 Int_t label = TMath::Abs(track->GetLabel());
422 if(label > nMCParticles) continue;
423 AliAODMCParticle *AODmcTrack = (AliAODMCParticle*) mcEvent->GetTrack(label);
424 Short_t gAODmcCharge = AODmcTrack->Charge();////
425 //fHistContaminationPrimaries->Fill(track->Eta(),track->Pt(),phiDeg);
426 //if (!(AODmcTrack->IsPhysicalPrimary())) {
427 //fHistContaminationSecondaries->Fill(track->Eta(),track->Pt(),phiDeg);
430 // ==============================================================================================
431 // Partial copy from AliAnalyseLeadingTrackUE::RemoveInjectedSignals:
432 // Skip tracks that come from injected signals
433 if (fInjectedSignals)
436 AliAODMCParticle* mother = AODmcTrack;
438 // find the primary mother (if not already physical primary)
439 while (!((AliAODMCParticle*)mother)->IsPhysicalPrimary())
441 if (((AliAODMCParticle*)mother)->GetMother() < 0)
447 mother = (AliAODMCParticle*) fArrayMC->At(((AliAODMCParticle*)mother)->GetMother());
455 AliError(Form("WARNING: No mother found for particle %d:", AODmcTrack->GetLabel()));
459 if (mother->GetLabel() >= skipParticlesAbove)
461 //AliInfo(Form("Remove particle %d (>= %d)",mother->GetLabel(),skipParticlesAbove));
465 // ==============================================================================================
467 if (AODmcTrack->IsPhysicalPrimary()) {
468 if(gAODmcCharge > 0){
469 fHistContaminationPrimariesPlus->Fill(track->Eta(),track->Pt(),phiRad);
471 if(gAODmcCharge < 0){
472 fHistContaminationPrimariesMinus->Fill(track->Eta(),track->Pt(),phiRad);
476 if(gAODmcCharge > 0){
477 fHistContaminationSecondariesPlus->Fill(track->Eta(),track->Pt(),phiRad);
479 if(gAODmcCharge < 0){
480 fHistContaminationSecondariesMinus->Fill(track->Eta(),track->Pt(),phiRad);
484 //++++++++++++++++++CONTAMINATION++++++++++++++++++//
486 //++++++++++++++++++EFFICIENCY+++++++++++++++++++++//
487 for (Int_t iTracks = 0; iTracks < mcEvent->GetNumberOfTracks(); iTracks++) {
488 AliAODMCParticle *mcTrack = (AliAODMCParticle*) mcEvent->GetTrack(iTracks);
490 AliError(Form("ERROR: Could not receive track %d (mc loop)", iTracks));
494 //exclude particles generated out of the acceptance
495 Double_t vz = mcTrack->Zv();
496 if (TMath::Abs(vz) > 50.) continue;
498 if(TMath::Abs(mcTrack->Eta()) > fMaxEta)
500 if((mcTrack->Pt() > fMaxPt)||(mcTrack->Pt() < fMinPt))
503 if(!mcTrack->IsPhysicalPrimary()) continue;
505 Short_t gMCCharge = mcTrack->Charge();
506 Double_t phiRad = mcTrack->Phi();
509 fHistGeneratedEtaPtPhiPlus->Fill(mcTrack->Eta(),
512 else if(gMCCharge < 0)
513 fHistGeneratedEtaPtPhiMinus->Fill(mcTrack->Eta(),
517 Bool_t labelTPC = kTRUE;
519 labelMCArray.AddAt(iTracks,nMCLabelCounter);
520 if(nMCLabelCounter >= maxMCLabelCounter){
521 AliWarning(Form("MC Label Counter > Limit (%d) --> stop loop here",maxMCLabelCounter));
524 //fill the arrays for 2 particle analysis
525 eta[nMCLabelCounter] = mcTrack->Eta();
526 pt[nMCLabelCounter] = mcTrack->Pt();
527 phi[nMCLabelCounter] = mcTrack->Phi();
528 charge[nMCLabelCounter] = gMCCharge;
530 level[nMCLabelCounter] = 1;
531 nMCLabelCounter += 1;
533 }//loop over MC particles
535 fHistNMult->Fill(nMCLabelCounter);
538 Int_t nGoodTracks = fAOD->GetNumberOfTracks();
539 TArrayI labelArray(nGoodTracks);
540 Int_t labelCounter = 0;
542 for(Int_t iTracks = 0; iTracks < nGoodTracks; iTracks++) {
543 AliAODTrack *trackAOD = static_cast<AliAODTrack*>(fAOD->GetTrack(iTracks));
544 if(!trackAOD) continue;
547 if (!trackAOD->TestFilterBit(fAODTrackCutBit))
550 Int_t label = TMath::Abs(trackAOD->GetLabel());
551 if(IsLabelUsed(labelArray,label)) continue;
552 labelArray.AddAt(label,labelCounter);
555 Bool_t iFound = kFALSE;
556 Int_t mcGoods = nMCLabelCounter;
557 for (Int_t k = 0; k < mcGoods; k++) {
558 Int_t mcLabel = labelMCArray.At(k);
561 if (mcLabel != TMath::Abs(label)) continue;
562 if(mcLabel != label) continue;
563 if(label > trackAOD->GetLabel()) continue;
566 if(TMath::Abs(trackAOD->Eta()) > fMaxEta)
568 if((trackAOD->Pt() > fMaxPt)||(trackAOD->Pt() < fMinPt))
571 Short_t gCharge = trackAOD->Charge();
572 Double_t phiRad = trackAOD->Phi();
574 if(TMath::Abs(trackAOD->Eta()) < fMaxEta && trackAOD->Pt() > fMinPt&&trackAOD->Pt() < fMaxPt){
578 fHistSurvivedEtaPtPhiPlus->Fill(trackAOD->Eta(),
582 fHistSurvivedEtaPtPhiMinus->Fill(trackAOD->Eta(),
589 labelMCArray.Reset();
596 }//number of contributors
599 // Here comes the 2 particle analysis
600 // loop over all good MC particles
601 for (Int_t i = 0; i < nMCLabelCounter ; i++) {
602 // control 1D histograms (charge might be different?)
604 if(level[i] > 0) fHistGeneratedEtaPtPlusControl->Fill(eta[i],pt[i]);
605 if(level[i] > 1) fHistSurvivedEtaPtPlusControl->Fill(eta[i],pt[i]);
607 else if(charge[i] < 0){
608 if(level[i] > 0) fHistGeneratedEtaPtMinusControl->Fill(eta[i],pt[i]);
609 if(level[i] > 1) fHistSurvivedEtaPtMinusControl->Fill(eta[i],pt[i]);
613 for (Int_t j = i+1; j < nMCLabelCounter ; j++) {
615 if(charge[i] > 0 && charge[j] > 0 ){
616 if(level[i] > 0 && level[j] > 0) {
617 fHistGeneratedEtaPtPlusPlus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
618 if (TMath::Abs(phi[i]-phi[j]) < TMath::Pi())
619 fHistGeneratedPhiEtaPlusPlus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
621 if(level[i] > 1 && level[j] > 1) {
622 fHistSurvivedEtaPtPlusPlus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
623 if (TMath::Abs(phi[i]-phi[j]) < TMath::Pi())
624 fHistSurvivedPhiEtaPlusPlus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
628 else if(charge[i] < 0 && charge[j] < 0 ){
629 if(level[i] > 0 && level[j] > 0) {
630 fHistGeneratedEtaPtMinusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
631 if (TMath::Abs(phi[i]-phi[j]) < TMath::Pi())
632 fHistGeneratedPhiEtaMinusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
634 if(level[i] > 2 && level[j] > 1) {
635 fHistSurvivedEtaPtMinusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
636 if (TMath::Abs(phi[i]-phi[j]) < TMath::Pi())
637 fHistSurvivedPhiEtaMinusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
641 else if((charge[i] > 0 && charge[j] < 0)||(charge[i] < 0 && charge[j] > 0)){
642 if(level[i] > 0 && level[j] > 0) {
643 fHistGeneratedEtaPtPlusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
644 if (TMath::Abs(phi[i]-phi[j]) < TMath::Pi())
645 fHistGeneratedPhiEtaPlusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
647 if(level[i] > 2 && level[j] > 1) {
648 fHistSurvivedEtaPtPlusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
649 if (TMath::Abs(phi[i]-phi[j]) < TMath::Pi())
650 fHistSurvivedPhiEtaPlusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
657 //________________________________________________________________________
658 void AliAnalysisTaskEffContBF::Terminate(Option_t *) {
659 // Draw result to the screen
660 // Called once at the end of the query
662 fOutputList = dynamic_cast<TList*> (GetOutputData(1));
664 printf("ERROR: Output list not available\n");
669 //____________________________________________________________________//
670 Bool_t AliAnalysisTaskEffContBF::IsLabelUsed(TArrayI labelArray, Int_t label) {
671 //Checks if the label is used already
672 Bool_t status = kFALSE;
673 for(Int_t i = 0; i < labelArray.GetSize(); i++) {
674 if(labelArray.At(i) == label)