10 #include "AliAnalysisTask.h"
11 #include "AliAnalysisManager.h"
14 #include "AliMCEvent.h"
15 #include "AliESDEvent.h"
16 #include "AliESDInputHandler.h"
17 #include "AliESDtrackCuts.h"
18 #include "AliCentrality.h"
20 #include "AliAnalysisTaskEfficiencyBF.h"
22 // ---------------------------------------------------------------------
24 // Task for calculating the efficiency of the Balance Function
25 // for single particles and pairs
27 // Authors: Panos Christakoglou, Michael Weber
29 // ---------------------------------------------------------------------
31 ClassImp(AliAnalysisTaskEfficiencyBF)
33 //________________________________________________________________________
34 AliAnalysisTaskEfficiencyBF::AliAnalysisTaskEfficiencyBF(const char *name)
35 : AliAnalysisTaskSE(name), fESD(0), fQAList(0), fOutputList(0),
36 fHistEventStats(0), fHistCentrality(0), fHistNMult(0),
37 fHistGeneratedEtaPtPhiPlus(0), fHistFindableEtaPtPhiPlus(0),
38 fHistReconstructedEtaPtPhiPlus(0), fHistSurvivedEtaPtPhiPlus(0),
39 fHistGeneratedEtaPtPhiMinus(0), fHistFindableEtaPtPhiMinus(0),
40 fHistReconstructedEtaPtPhiMinus(0), fHistSurvivedEtaPtPhiMinus(0),
41 fHistGeneratedEtaPtPlusControl(0), fHistFindableEtaPtPlusControl(0),
42 fHistReconstructedEtaPtPlusControl(0), fHistSurvivedEtaPtPlusControl(0),
43 fHistGeneratedEtaPtMinusControl(0), fHistFindableEtaPtMinusControl(0),
44 fHistReconstructedEtaPtMinusControl(0), fHistSurvivedEtaPtMinusControl(0),
45 fHistGeneratedEtaPtPlusPlus(0), fHistFindableEtaPtPlusPlus(0),
46 fHistReconstructedEtaPtPlusPlus(0), fHistSurvivedEtaPtPlusPlus(0),
47 fHistGeneratedEtaPtMinusMinus(0), fHistFindableEtaPtMinusMinus(0),
48 fHistReconstructedEtaPtMinusMinus(0), fHistSurvivedEtaPtMinusMinus(0),
49 fHistGeneratedEtaPtPlusMinus(0), fHistFindableEtaPtPlusMinus(0),
50 fHistReconstructedEtaPtPlusMinus(0), fHistSurvivedEtaPtPlusMinus(0),
51 fHistGeneratedPhiEtaPlusPlus(0), fHistFindablePhiEtaPlusPlus(0),
52 fHistReconstructedPhiEtaPlusPlus(0), fHistSurvivedPhiEtaPlusPlus(0),
53 fHistGeneratedPhiEtaMinusMinus(0), fHistFindablePhiEtaMinusMinus(0),
54 fHistReconstructedPhiEtaMinusMinus(0), fHistSurvivedPhiEtaMinusMinus(0),
55 fHistGeneratedPhiEtaPlusMinus(0), fHistFindablePhiEtaPlusMinus(0),
56 fHistReconstructedPhiEtaPlusMinus(0), fHistSurvivedPhiEtaPlusMinus(0),
57 fESDtrackCuts(0), fAnalysisMode(0),
58 fCentralityEstimator("V0M"), fCentralityPercentileMin(0.0), fCentralityPercentileMax(5.0),
59 fVxMax(3.0), fVyMax(3.0), fVzMax(10.),
60 fMinNumberOfTPCClusters(80), fMaxChi2PerTPCCluster(4.0), fMaxDCAxy(3.0), fMaxDCAz(3.0),
61 fMinPt(0.3), fMaxPt(1.5), fMinEta(-0.8), fMaxEta(0.8),fEtaRangeMin(0.0), fEtaRangeMax(1.6), fPtRangeMin(0.3), fPtRangeMax(1.5), fPhiRangeMin(0.0),fPhiRangeMax(360.),fdPhiRangeMax(180.), fEtaBin(100),fdEtaBin(64),fPtBin(49),fPhiBin(100),fdPhiBin(90) {
62 // Define input and output slots here
63 // Input slot #0 works with a TChain
64 DefineInput(0, TChain::Class());
65 // Output slot #0 id reserved by the base class for AOD
66 // Output slot #1 writes into a TH1 container
67 DefineOutput(1, TList::Class());
68 DefineOutput(2, TList::Class());
71 //________________________________________________________________________
72 void AliAnalysisTaskEfficiencyBF::UserCreateOutputObjects() {
76 fQAList = new TList();
77 fQAList->SetName("QAList");
80 fOutputList = new TList();
81 fOutputList->SetName("OutputList");
82 fOutputList->SetOwner();
85 TString gCutName[4] = {"Total","Offline trigger",
87 fHistEventStats = new TH1F("fHistEventStats",
88 "Event statistics;;N_{events}",
90 for(Int_t i = 1; i <= 4; i++)
91 fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1].Data());
92 fQAList->Add(fHistEventStats);
95 fHistCentrality = new TH1F("fHistCentrality",";Centrality bin;Events",
97 fQAList->Add(fHistCentrality);
99 //multiplicity (good MC tracks)
101 histName = "fHistNMult";
102 fHistNMult = new TH1F(histName.Data(),
105 fQAList->Add(fHistNMult);
107 //eta vs pt for MC positives
108 fHistGeneratedEtaPtPhiPlus = new TH3D("fHistGeneratedEtaPtPhiPlus",
109 "Generated positive primaries;#eta;p_{T} (GeV/c);#phi",
110 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax);
111 fOutputList->Add(fHistGeneratedEtaPtPhiPlus);
112 fHistFindableEtaPtPhiPlus = new TH3D("fHistFindableEtaPtPhiPlus",
113 "Findable positive primaries;#eta;p_{T} (GeV/c);#phi",
114 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax);
115 fOutputList->Add(fHistFindableEtaPtPhiPlus);
116 fHistReconstructedEtaPtPhiPlus = new TH3D("fHistReconstructedEtaPtPhiPlus",
117 "Reconstructed positive primaries;#eta;p_{T} (GeV/c);#phi",
118 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax);
119 fOutputList->Add(fHistReconstructedEtaPtPhiPlus);
120 fHistSurvivedEtaPtPhiPlus = new TH3D("fHistSurvivedEtaPtPhiPlus",
121 "Survived positive primaries;#eta;p_{T} (GeV/c);#phi",
122 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax);
123 fOutputList->Add(fHistSurvivedEtaPtPhiPlus);
125 //eta vs pt for MC negatives
126 fHistGeneratedEtaPtPhiMinus = new TH3D("fHistGeneratedEtaPtPhiMinus",
127 "Generated positive primaries;#eta;p_{T} (GeV/c);#phi",
128 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax);
129 fOutputList->Add(fHistGeneratedEtaPtPhiMinus);
130 fHistFindableEtaPtPhiMinus = new TH3D("fHistFindableEtaPtPhiMinus",
131 "Findable positive primaries;#eta;p_{T} (GeV/c);#phi",
132 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax);
133 fOutputList->Add(fHistFindableEtaPtPhiMinus);
134 fHistReconstructedEtaPtPhiMinus = new TH3D("fHistReconstructedEtaPtPhiMinus",
135 "Reconstructed positive primaries;#eta;p_{T} (GeV/c);#phi",
136 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax);
137 fOutputList->Add(fHistReconstructedEtaPtPhiMinus);
138 fHistSurvivedEtaPtPhiMinus = new TH3D("fHistSurvivedEtaPtPhiMinus",
139 "Survived positive primaries;#eta;p_{T} (GeV/c);#phi",
140 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax,fPhiBin,fPhiRangeMin,fPhiRangeMax);
141 fOutputList->Add(fHistSurvivedEtaPtPhiMinus);
143 //eta vs pt for MC positives (control)
144 fHistGeneratedEtaPtPlusControl = new TH2F("fHistGeneratedEtaPtPlusControl",
145 "Generated positive primaries;#eta;p_{T} (GeV/c)",
146 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax);
147 fOutputList->Add(fHistGeneratedEtaPtPlusControl);
148 fHistFindableEtaPtPlusControl = new TH2F("fHistFindableEtaPtPlusControl",
149 "Findable positive primaries;#eta;p_{T} (GeV/c)",
150 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax);
151 fOutputList->Add(fHistFindableEtaPtPlusControl);
152 fHistReconstructedEtaPtPlusControl = new TH2F("fHistReconstructedEtaPtPlusControl",
153 "Reconstructed positive primaries;#eta;p_{T} (GeV/c)",
154 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax);
155 fOutputList->Add(fHistReconstructedEtaPtPlusControl);
156 fHistSurvivedEtaPtPlusControl = new TH2F("fHistSurvivedEtaPtPlusControl",
157 "Survived positive primaries;#eta;p_{T} (GeV/c)",
158 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax);
159 fOutputList->Add(fHistSurvivedEtaPtPlusControl);
161 //eta vs pt for MC negatives (control)
162 fHistGeneratedEtaPtMinusControl = new TH2F("fHistGeneratedEtaPtMinusControl",
163 "Generated positive primaries;#eta;p_{T} (GeV/c)",
164 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax);
165 fOutputList->Add(fHistGeneratedEtaPtMinusControl);
166 fHistFindableEtaPtMinusControl = new TH2F("fHistFindableEtaPtMinusControl",
167 "Findable positive primaries;#eta;p_{T} (GeV/c)",
168 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax);
169 fOutputList->Add(fHistFindableEtaPtMinusControl);
170 fHistReconstructedEtaPtMinusControl = new TH2F("fHistReconstructedEtaPtMinusControl",
171 "Reconstructed positive primaries;#eta;p_{T} (GeV/c)",
172 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax);
173 fOutputList->Add(fHistReconstructedEtaPtMinusControl);
174 fHistSurvivedEtaPtMinusControl = new TH2F("fHistSurvivedEtaPtMinusControl",
175 "Survived positive primaries;#eta;p_{T} (GeV/c)",
176 fEtaBin,fMinEta,fMaxEta,fPtBin,fPtRangeMin,fPtRangeMax);
177 fOutputList->Add(fHistSurvivedEtaPtMinusControl);
179 //eta vs pt for MC ++
180 fHistGeneratedEtaPtPlusPlus = new TH2F("fHistGeneratedEtaPtPlusPlus",
181 "Generated ++ primaries;#Delta#eta;p_{T} (GeV/c)",
182 fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax);
183 fOutputList->Add(fHistGeneratedEtaPtPlusPlus);
184 fHistFindableEtaPtPlusPlus = new TH2F("fHistFindableEtaPtPlusPlus",
185 "Findable ++ primaries;#Delta#eta;p_{T} (GeV/c)",
186 fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax);
187 fOutputList->Add(fHistFindableEtaPtPlusPlus);
188 fHistReconstructedEtaPtPlusPlus = new TH2F("fHistReconstructedEtaPtPlusPlus",
189 "Reconstructed ++ primaries;#Delta#eta;p_{T} (GeV/c)",
190 fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax);
191 fOutputList->Add(fHistReconstructedEtaPtPlusPlus);
192 fHistSurvivedEtaPtPlusPlus = new TH2F("fHistSurvivedEtaPtPlusPlus",
193 "Survived ++ primaries;#Delta#eta;p_{T} (GeV/c)",
194 fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax);
195 fOutputList->Add(fHistSurvivedEtaPtPlusPlus);
197 //eta vs pt for MC --
198 fHistGeneratedEtaPtMinusMinus = new TH2F("fHistGeneratedEtaPtMinusMinus",
199 "Generated -- primaries;#Delta#eta;p_{T} (GeV/c)",
200 fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax);
201 fOutputList->Add(fHistGeneratedEtaPtMinusMinus);
202 fHistFindableEtaPtMinusMinus = new TH2F("fHistFindableEtaPtMinusMinus",
203 "Findable -- primaries;#Delta#eta;p_{T} (GeV/c)",
204 fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax);
205 fOutputList->Add(fHistFindableEtaPtMinusMinus);
206 fHistReconstructedEtaPtMinusMinus = new TH2F("fHistReconstructedEtaPtMinusMinus",
207 "Reconstructed -- primaries;#Delta#eta;p_{T} (GeV/c)",
208 fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax);
209 fOutputList->Add(fHistReconstructedEtaPtMinusMinus);
210 fHistSurvivedEtaPtMinusMinus = new TH2F("fHistSurvivedEtaPtMinusMinus",
211 "Survived -- primaries;#Delta#eta;p_{T} (GeV/c)",
212 fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax);
213 fOutputList->Add(fHistSurvivedEtaPtMinusMinus);
215 //eta vs pt for MC +-
216 fHistGeneratedEtaPtPlusMinus = new TH2F("fHistGeneratedEtaPtPlusMinus",
217 "Generated +- primaries;#Delta#eta;p_{T} (GeV/c)",
218 fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax);
219 fOutputList->Add(fHistGeneratedEtaPtPlusMinus);
220 fHistFindableEtaPtPlusMinus = new TH2F("fHistFindableEtaPtPlusMinus",
221 "Findable +- primaries;#Delta#eta;p_{T} (GeV/c)",
222 fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax);
223 fOutputList->Add(fHistFindableEtaPtPlusMinus);
224 fHistReconstructedEtaPtPlusMinus = new TH2F("fHistReconstructedEtaPtPlusMinus",
225 "Reconstructed +- primaries;#Delta#eta;p_{T} (GeV/c)",
226 fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax);
227 fOutputList->Add(fHistReconstructedEtaPtPlusMinus);
228 fHistSurvivedEtaPtPlusMinus = new TH2F("fHistSurvivedEtaPtPlusMinus",
229 "Survived +- primaries;#Delta#eta;p_{T} (GeV/c)",
230 fdEtaBin,fEtaRangeMin,fEtaRangeMax,fPtBin,fPtRangeMin,fPtRangeMax);
231 fOutputList->Add(fHistSurvivedEtaPtPlusMinus);
233 //=============================//
234 //phi vs eta for MC ++
235 fHistGeneratedPhiEtaPlusPlus = new TH2F("fHistGeneratedPhiEtaPlusPlus",
236 "Generated ++ primaries;#Delta#phi",
237 fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax);
238 fOutputList->Add(fHistGeneratedPhiEtaPlusPlus);
239 fHistFindablePhiEtaPlusPlus = new TH2F("fHistFindablePhiEtaPlusPlus",
240 "Findable ++ primaries;#Delta#phi;#Delta#eta",
241 fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax);
242 fOutputList->Add(fHistFindablePhiEtaPlusPlus);
243 fHistReconstructedPhiEtaPlusPlus = new TH2F("fHistReconstructedPhiEtaPlusPlus",
244 "Reconstructed ++ primaries;#Delta#phi;#Delta#eta",
245 fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax);
246 fOutputList->Add(fHistReconstructedPhiEtaPlusPlus);
247 fHistSurvivedPhiEtaPlusPlus = new TH2F("fHistSurvivedPhiEtaPlusPlus",
248 "Survived ++ primaries;#Delta#phi;#Delta#eta",
249 fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax);
250 fOutputList->Add(fHistSurvivedPhiEtaPlusPlus);
252 //phi vs eta for MC --
253 fHistGeneratedPhiEtaMinusMinus = new TH2F("fHistGeneratedPhiEtaMinusMinus",
254 "Generated -- primaries;#Delta#phi;#Delta#eta",
255 fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax);
256 fOutputList->Add(fHistGeneratedPhiEtaMinusMinus);
257 fHistFindablePhiEtaMinusMinus = new TH2F("fHistFindablePhiEtaMinusMinus",
258 "Findable -- primaries;#Delta#phi;#Delta#eta",
259 fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax);
260 fOutputList->Add(fHistFindablePhiEtaMinusMinus);
261 fHistReconstructedPhiEtaMinusMinus = new TH2F("fHistReconstructedPhiEtaMinusMinus",
262 "Reconstructed -- primaries;#Delta#phi;#Delta#eta",
263 fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax);
264 fOutputList->Add(fHistReconstructedPhiEtaMinusMinus);
265 fHistSurvivedPhiEtaMinusMinus = new TH2F("fHistSurvivedPhiEtaMinusMinus",
266 "Survived -- primaries;#Delta#phi;#Delta#eta",
267 fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax);
268 fOutputList->Add(fHistSurvivedPhiEtaMinusMinus);
270 //phi vs eta for MC +-
271 fHistGeneratedPhiEtaPlusMinus = new TH2F("fHistGeneratedPhiEtaPlusMinus",
272 "Generated +- primaries;#Delta#phi;#Delta#eta",
273 fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax);
274 fOutputList->Add(fHistGeneratedPhiEtaPlusMinus);
275 fHistFindablePhiEtaPlusMinus = new TH2F("fHistFindablePhiEtaPlusMinus",
276 "Findable +- primaries;#Delta#phi;#Delta#eta",
277 fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax);
278 fOutputList->Add(fHistFindablePhiEtaPlusMinus);
279 fHistReconstructedPhiEtaPlusMinus = new TH2F("fHistReconstructedPhiEtaPlusMinus",
280 "Reconstructed +- primaries;#Delta#phi;#Delta#eta",
281 fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax);
282 fOutputList->Add(fHistReconstructedPhiEtaPlusMinus);
283 fHistSurvivedPhiEtaPlusMinus = new TH2F("fHistSurvivedPhiEtaPlusMinus",
284 "Survived +- primaries;#Delta#phi;#Delta#eta",
285 fdPhiBin,fPhiRangeMin,fdPhiRangeMax,fdEtaBin,fEtaRangeMin,fEtaRangeMax);
286 fOutputList->Add(fHistSurvivedPhiEtaPlusMinus);
287 //=============================//
290 fOutputList->Print();
292 PostData(1, fQAList);
293 PostData(2, fOutputList);
296 //________________________________________________________________________
297 void AliAnalysisTaskEfficiencyBF::UserExec(Option_t *) {
299 // Called for each event
303 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
305 printf("ERROR: fESD not available\n");
309 AliMCEvent* mcEvent = MCEvent();
311 Printf("ERROR: Could not retrieve MC event");
314 AliStack* stack = mcEvent->Stack();
316 Printf("ERROR: Could not retrieve MC stack");
320 // arrays for 2 particle histograms
321 Int_t nMCLabelCounter = 0;
322 const Int_t maxMCLabelCounter = 20000;
324 Double_t eta[maxMCLabelCounter];
325 Double_t pt[maxMCLabelCounter];
326 Double_t phi[maxMCLabelCounter];
327 Int_t level[maxMCLabelCounter];
328 Int_t charge[maxMCLabelCounter];
330 //AliInfo(Form("%d %d",mcEvent->GetNumberOfTracks(),fESD->GetNumberOfTracks()));
331 fHistEventStats->Fill(1); //all events
334 AliCentrality *centrality = fESD->GetCentrality();
335 Int_t nCentrality = 0;
336 nCentrality = (Int_t)(centrality->GetCentralityPercentile(fCentralityEstimator.Data())/10.);
338 //Printf("Centrality: %lf",centrality->GetCentralityPercentile(fCentralityEstimator.Data()));
340 if(centrality->IsEventInCentralityClass(fCentralityPercentileMin,
341 fCentralityPercentileMax,
342 fCentralityEstimator.Data())) {
343 fHistEventStats->Fill(2); //triggered + centrality
344 fHistCentrality->Fill(nCentrality+1);
346 //Printf("Centrality selection: %lf - %lf",fCentralityPercentileMin,fCentralityPercentileMax);
348 if(fAnalysisMode.CompareTo("TPC") == 0 ) {
349 const AliESDVertex *vertex = fESD->GetPrimaryVertexTPC();
351 if(vertex->GetNContributors() > 0) {
352 if(vertex->GetZRes() != 0) {
353 fHistEventStats->Fill(3); //events with a proper vertex
354 if(TMath::Abs(vertex->GetXv()) < fVxMax) {
355 if(TMath::Abs(vertex->GetYv()) < fVyMax) {
356 if(TMath::Abs(vertex->GetZv()) < fVzMax) {
357 fHistEventStats->Fill(4); //analyzed events
359 Int_t nMCParticles = mcEvent->GetNumberOfTracks();
360 TArrayI labelMCArray(nMCParticles);
362 for (Int_t iTracks = 0; iTracks < mcEvent->GetNumberOfTracks(); iTracks++) {
363 AliMCParticle *mcTrack = (AliMCParticle*) mcEvent->GetTrack(iTracks);
365 Printf("ERROR: Could not receive track %d (mc loop)", iTracks);
369 //exclude particles generated out of the acceptance
370 Double_t vz = mcTrack->Zv();
371 if (TMath::Abs(vz) > 50.) continue;
374 if(TMath::Abs(mcTrack->Eta()) > fMaxEta)
376 if((mcTrack->Pt() > fMaxPt)||(mcTrack->Pt() < fMinPt))
378 if((mcTrack->Phi() > fPhiRangeMax)||(mcTrack->Phi() < fPhiRangeMin))
381 TParticle* particle = mcTrack->Particle();
382 if(!particle) continue;
383 if(!stack->IsPhysicalPrimary(iTracks)) continue;
385 if(iTracks <= stack->GetNprimary()) {
386 Short_t gMCCharge = mcTrack->Charge();
387 Double_t phiRad = particle->Phi();
388 Double_t phiDeg = phiRad*TMath::RadToDeg();
391 fHistGeneratedEtaPtPhiPlus->Fill(particle->Eta(),
394 else if(gMCCharge < 0)
395 fHistGeneratedEtaPtPhiMinus->Fill(particle->Eta(),
400 // findable tracks --> DOES NOT WORK????
401 // Loop over Track References
402 Bool_t labelTPC = kTRUE;
403 AliTrackReference* trackRef = 0;
405 for (Int_t iTrackRef = 0; iTrackRef < mcTrack->GetNumberOfTrackReferences(); iTrackRef++) {
406 trackRef = mcTrack->GetTrackReference(iTrackRef);
408 Int_t detectorId = trackRef->DetectorId();
409 if (detectorId == AliTrackReference::kTPC) {
414 }//loop over track references
417 labelMCArray.AddAt(iTracks,nMCLabelCounter);
419 if(nMCLabelCounter >= maxMCLabelCounter){
420 AliWarning(Form("MC Label Counter > Limit (%d) --> stop loop here",maxMCLabelCounter));
424 //fill the arrays for 2 particle analysis
425 eta[nMCLabelCounter] = particle->Eta();
426 pt[nMCLabelCounter] = particle->Pt();
427 phi[nMCLabelCounter] = particle->Phi()*TMath::RadToDeg();
428 charge[nMCLabelCounter] = gMCCharge;
430 // findable = generated in this case!
432 level[nMCLabelCounter] = 1;
433 nMCLabelCounter += 1;
437 fHistFindableEtaPtPhiPlus->Fill(particle->Eta(),
440 else if(gMCCharge < 0)
441 fHistFindableEtaPtPhiMinus->Fill(particle->Eta(),
446 }//loop over MC particles
448 fHistNMult->Fill(nMCLabelCounter);
451 //Float_t dcaXY = 0.0, dcaZ = 0.0;
454 Int_t nGoodTracks = fESD->GetNumberOfTracks();
456 TArrayI labelArray(nGoodTracks);
457 Int_t labelCounter = 0;
458 for(Int_t iTracks = 0; iTracks < nGoodTracks; iTracks++) {
459 AliESDtrack* track = fESD->GetTrack(iTracks);
460 //AliESDtrack* track = fESDtrackCuts->GetTPCOnlyTrack(fESD,iTracks);
463 AliESDtrack *tpcOnlyTrack = new AliESDtrack();
465 if (!track->FillTPCOnlyTrack(*tpcOnlyTrack)) {
470 Int_t label = TMath::Abs(track->GetTPCLabel());
471 if(IsLabelUsed(labelArray,label)) continue;
472 labelArray.AddAt(label,labelCounter);
475 Bool_t iFound = kFALSE;
476 Int_t mcGoods = nMCLabelCounter;
477 for (Int_t k = 0; k < mcGoods; k++) {
478 Int_t mcLabel = labelMCArray.At(k);
481 if (mcLabel != TMath::Abs(label)) continue;
482 if(mcLabel != label) continue;
483 if(label > stack->GetNtrack()) continue;
485 TParticle *particle = stack->Particle(label);
486 if(!particle) continue;
489 if(TMath::Abs(particle->Eta()) > fMaxEta)
491 if((particle->Pt() > fMaxPt)||(particle->Pt() < fMinPt))
493 if((particle->Phi() > fPhiRangeMax)||(particle->Phi() < fPhiRangeMin))
496 if(!stack->IsPhysicalPrimary(label)) continue;
498 if(label <= stack->GetNprimary()) {
503 Short_t gCharge = track->Charge();
504 Double_t phiRad = particle->Phi();
505 Double_t phiDeg = phiRad*TMath::RadToDeg();
508 fHistReconstructedEtaPtPhiPlus->Fill(particle->Eta(),
512 fHistReconstructedEtaPtPhiMinus->Fill(particle->Eta(),
516 // track cuts + analysis kinematic cuts
517 if(fESDtrackCuts->AcceptTrack(track) && TMath::Abs(track->Eta()) < fMaxEta && track->Pt() > fMinPt && track->Pt() < fMaxPt ){
523 fHistSurvivedEtaPtPhiPlus->Fill(particle->Eta(),
527 fHistSurvivedEtaPtPhiMinus->Fill(particle->Eta(),
533 }//findable track loop
536 labelMCArray.Reset();
544 }//number of contributors
551 // Here comes the 2 particle analysis
552 // loop over all good MC particles
553 for (Int_t i = 0; i < nMCLabelCounter ; i++) {
555 // control 1D histograms (charge might be different?)
557 if(level[i] > 0) fHistGeneratedEtaPtPlusControl->Fill(eta[i],pt[i]);
558 if(level[i] > 1) fHistReconstructedEtaPtPlusControl->Fill(eta[i],pt[i]);
559 if(level[i] > 2) fHistSurvivedEtaPtPlusControl->Fill(eta[i],pt[i]);
561 else if(charge[i] < 0){
562 if(level[i] > 0) fHistGeneratedEtaPtMinusControl->Fill(eta[i],pt[i]);
563 if(level[i] > 1) fHistReconstructedEtaPtMinusControl->Fill(eta[i],pt[i]);
564 if(level[i] > 2) fHistSurvivedEtaPtMinusControl->Fill(eta[i],pt[i]);
568 for (Int_t j = i+1; j < nMCLabelCounter ; j++) {
570 if(charge[i] > 0 && charge[j] > 0 ){
571 if(level[i] > 0 && level[j] > 0) {
572 fHistGeneratedEtaPtPlusPlus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
573 if (TMath::Abs(phi[i]-phi[j]) < 180)
574 fHistGeneratedPhiEtaPlusPlus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
576 if(level[i] > 1 && level[j] > 1) {
577 fHistReconstructedEtaPtPlusPlus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
578 if (TMath::Abs(phi[i]-phi[j]) < 180)
579 fHistReconstructedPhiEtaPlusPlus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
581 if(level[i] > 2 && level[j] > 2) {
582 fHistSurvivedEtaPtPlusPlus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
583 if (TMath::Abs(phi[i]-phi[j]) < 180)
584 fHistSurvivedPhiEtaPlusPlus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
588 else if(charge[i] < 0 && charge[j] < 0 ){
589 if(level[i] > 0 && level[j] > 0) {
590 fHistGeneratedEtaPtMinusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
591 if (TMath::Abs(phi[i]-phi[j]) < 180)
592 fHistGeneratedPhiEtaMinusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
594 if(level[i] > 1 && level[j] > 1) {
595 fHistReconstructedEtaPtMinusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
596 fHistReconstructedPhiEtaMinusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
598 if(level[i] > 2 && level[j] > 2) {
599 fHistSurvivedEtaPtMinusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
600 if (TMath::Abs(phi[i]-phi[j]) < 180)
601 fHistSurvivedPhiEtaMinusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
605 else if((charge[i] > 0 && charge[j] < 0)||(charge[i] < 0 && charge[j] > 0)){
606 if(level[i] > 0 && level[j] > 0) {
607 fHistGeneratedEtaPtPlusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
608 if (TMath::Abs(phi[i]-phi[j]) < 180)
609 fHistGeneratedPhiEtaPlusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
611 if(level[i] > 1 && level[j] > 1) {
612 fHistReconstructedEtaPtPlusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
613 fHistReconstructedPhiEtaPlusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
615 if(level[i] > 2 && level[j] > 2) {
616 fHistSurvivedEtaPtPlusMinus->Fill(TMath::Abs(eta[i]-eta[j]),pt[i]);
617 if (TMath::Abs(phi[i]-phi[j]) < 180)
618 fHistSurvivedPhiEtaPlusMinus->Fill(TMath::Abs(phi[i]-phi[j]),TMath::Abs(eta[i]-eta[j]));
624 //Checking Entries for generated and survived
625 /*TH1F* GeneratedEtaPt = (TH1F*)fHistGeneratedEtaPtPlusMinus->ProjectionX("GeneratedEtaPt",5,15);
626 Int_t xGeneratedPt = fHistGeneratedEtaPtPlusMinus->GetNbinsX();
627 for (Int_t h=1; h < xGeneratedPt+1; h++){
628 Double_t binEntriesGenerated = GeneratedEtaPt->GetBinContent(h);
629 Printf("binEntriesGenerated: %lf - xGeneratedPt: %d",binEntriesGenerated,h);
631 TH1F* GeneratedPhiEta = (TH1F*)fHistGeneratedPhiEtaPlusMinus->ProjectionY("GeneratedPhiEta",5,15);
632 Int_t yGeneratedPhi = fHistGeneratedPhiEtaPlusMinus->GetNbinsY();
633 for (Int_t h=1; h < yGeneratedPhi+1; h++){
634 Double_t binEntriesGenerated = GeneratedPhiEta->GetBinContent(h);
635 Printf("binEntriesGenerated: %lf - yGeneratedPhi: %d",binEntriesGenerated,h);
638 /*TH1F* SurvivedEtaPt = (TH1F*)fHistSurvivedEtaPtPlusMinus->ProjectionX("SurvivedEtaPt",5,15);
639 Int_t xSurvivedPt = fHistSurvivedEtaPtPlusMinus->GetNbinsX();
640 for (Int_t h=1; h < xSurvivedPt+1; h++){
641 Double_t binEntriesSurvived = SurvivedEtaPt->GetBinContent(h);
642 Printf("binEntriesSurvived: %lf - xSurvivedPt: %d",binEntriesSurvived,h);
644 TH1F* SurvivedPhiEta = (TH1F*)fHistSurvivedPhiEtaPlusMinus->ProjectionY("SurvivedPhiEta",5,15);
645 Int_t ySurvivedPhi = fHistSurvivedPhiEtaPlusMinus->GetNbinsY();
646 for (Int_t h=1; h < ySurvivedPhi+1; h++){
647 Double_t binEntriesSurvived = SurvivedPhiEta->GetBinContent(h);
648 Printf("binEntriesSurvived: %lf - ySurvivedPhi: %d",binEntriesSurvived,h);
651 //________________________________________________________________________
652 void AliAnalysisTaskEfficiencyBF::Terminate(Option_t *) {
653 // Draw result to the screen
654 // Called once at the end of the query
656 fOutputList = dynamic_cast<TList*> (GetOutputData(1));
658 printf("ERROR: Output list not available\n");
663 //____________________________________________________________________//
664 Bool_t AliAnalysisTaskEfficiencyBF::IsLabelUsed(TArrayI labelArray, Int_t label) {
665 //Checks if the label is used already
666 Bool_t status = kFALSE;
667 for(Int_t i = 0; i < labelArray.GetSize(); i++) {
668 if(labelArray.At(i) == label)