]>
Commit | Line | Data |
---|---|---|
117f99e3 | 1 | #include <TChain.h> |
2 | #include <TList.h> | |
3 | ||
4 | #include <TTree.h> | |
5 | #include <TH1F.h> | |
6 | #include <TH2F.h> | |
7099c89a | 7 | #include <THnSparse.h> |
117f99e3 | 8 | #include <TProfile.h> |
9 | #include <TCanvas.h> | |
10 | #include "TRandom.h" | |
11 | ||
12 | #include "AliVEvent.h" | |
13 | #include "AliVParticle.h" | |
14 | ||
15 | #include "AliESDEvent.h" | |
16 | #include "AliESDtrack.h" | |
17 | #include "AliMultiplicity.h" | |
18 | #include "AliESDtrackCuts.h" | |
19 | ||
20 | #include "AliAODEvent.h" | |
21 | #include "AliAODTrack.h" | |
b7c0438e | 22 | #include "AliAODMCParticle.h" |
7099c89a | 23 | #include "AliAODMCHeader.h" |
117f99e3 | 24 | |
25 | #include "AliStack.h" | |
26 | #include "AliMCEvent.h" | |
27 | #include "AliMCParticle.h" | |
28 | #include "AliGenEventHeader.h" | |
29 | ||
30 | #include "AliAnalysisManager.h" | |
7099c89a | 31 | #include "AliInputEventHandler.h" |
32 | ||
33 | #include <vector> | |
34 | #include <algorithm> | |
35 | #include <functional> | |
36 | using namespace std; | |
117f99e3 | 37 | |
38 | #include "AliAnalysisTaskMinijet.h" | |
39 | ||
f2565a6b | 40 | // Analysis task for two-particle correlations using all particles over pt threshold |
41 | // pt_trig threshold for trigger particle (event axis) and pt_assoc for possible associated particles. | |
42 | // Extract mini-jet yield and fragmentation properties via Delta-Phi histograms of these correlations | |
43 | // post processing of analysis output via macro plot3and2Gaus.C | |
44 | // Can use ESD or AOD, reconstructed and Monte Carlo data as input | |
45 | // Author: Eva Sicking | |
46 | ||
117f99e3 | 47 | |
48 | ClassImp(AliAnalysisTaskMinijet) | |
49 | ||
50 | //________________________________________________________________________ | |
b9ad6f04 | 51 | AliAnalysisTaskMinijet::AliAnalysisTaskMinijet(const char *name) |
52 | : AliAnalysisTaskSE(name), | |
53 | fUseMC(kFALSE), | |
54 | fMcOnly(kFALSE), | |
7099c89a | 55 | fBSign(0), |
56 | fAnalysePrimOnly(kFALSE),// not used | |
57 | fPtMin(0.2), | |
58 | fPtMax(50.0), | |
b9ad6f04 | 59 | fCuts(0), |
b9ad6f04 | 60 | fTriggerPtCut(0.7), |
61 | fAssociatePtCut(0.4), | |
b9ad6f04 | 62 | fMode(0), |
8855d81c | 63 | fTriggerType(1), |
64 | fFilterBit(128), | |
b9ad6f04 | 65 | fVertexZCut(10.), |
66 | fEtaCut(0.9), | |
9ed461df | 67 | fEtaCutSeed(0.9), |
68 | fSelectParticles(1), | |
69 | fSelectParticlesAssoc(1), | |
ac305649 | 70 | fCheckSDD(true), |
71 | fSelOption(1), | |
b9ad6f04 | 72 | fESDEvent(0), |
73 | fAODEvent(0), | |
9ed461df | 74 | fNMcPrimAccept(0), |
7099c89a | 75 | fNRecAccept(0), |
1b36e9e2 | 76 | fNMcPrimAcceptTracklet(0), |
77 | fNRecAcceptTracklet(0), | |
9ed461df | 78 | fVzEvent(0), |
7099c89a | 79 | fMeanPtRec(0), |
80 | fLeadingPtRec(0), | |
b9ad6f04 | 81 | fHists(0), |
7099c89a | 82 | fStep(0), |
b9ad6f04 | 83 | fHistPt(0), |
84 | fHistPtMC(0), | |
a031a5ca | 85 | fNContrNtracklets(0), |
86 | fNContrNtracks(0), | |
9ed461df | 87 | fNmcNch(0), |
f2565a6b | 88 | fPNmcNch(0), |
bf6ba8a0 | 89 | fNmcNchVtx(0), |
90 | fPNmcNchVtx(0), | |
1b36e9e2 | 91 | fNmcNchTracklet(0), |
92 | fPNmcNchTracklet(0), | |
93 | fNmcNchVtxTracklet(0), | |
94 | fPNmcNchVtxTracklet(0), | |
9cccc98a | 95 | fChargedPi0(0), |
96 | fVertexCheck(0) | |
117f99e3 | 97 | { |
7099c89a | 98 | |
f2565a6b | 99 | //Constructor |
100 | ||
7099c89a | 101 | for(Int_t i = 0;i< 6;i++){ |
102 | fMapSingleTrig[i] = 0; | |
103 | fMapPair[i] = 0; | |
104 | fMapEvent[i] = 0; | |
105 | fMapAll[i] = 0; | |
106 | ||
b9ad6f04 | 107 | fVertexZ[i] = 0; |
7099c89a | 108 | |
109 | fNcharge[i] = 0; | |
b9ad6f04 | 110 | fPt[i] = 0; |
111 | fEta[i] = 0; | |
112 | fPhi[i] = 0; | |
9ed461df | 113 | fDcaXY[i] = 0; |
114 | fDcaZ[i] = 0; | |
b9ad6f04 | 115 | |
116 | fPtSeed[i] = 0; | |
117 | fEtaSeed[i] = 0; | |
118 | fPhiSeed[i] = 0; | |
119 | ||
9ed461df | 120 | fPtOthers[i] = 0; |
121 | fEtaOthers[i] = 0; | |
122 | fPhiOthers[i] = 0; | |
123 | fPtEtaOthers[i] = 0; | |
b18f7dfb | 124 | |
b9ad6f04 | 125 | fPhiEta[i] = 0; |
126 | ||
127 | fDPhiDEtaEventAxis[i] = 0; | |
9ed461df | 128 | fDPhiDEtaEventAxisSeeds[i]= 0; |
b9ad6f04 | 129 | fTriggerNch[i] = 0; |
7099c89a | 130 | |
9ed461df | 131 | fTriggerNchSeeds[i] = 0; |
b9ad6f04 | 132 | fTriggerTracklet[i] = 0; |
117f99e3 | 133 | |
b9ad6f04 | 134 | fNch07Nch[i] = 0; |
7099c89a | 135 | fPNch07Nch[i] = 0; |
136 | ||
b9ad6f04 | 137 | fNch07Tracklet[i] = 0; |
138 | fNchTracklet[i] = 0; | |
7099c89a | 139 | fPNch07Tracklet[i] = 0; |
140 | fDPhiEventAxis[i] = 0; | |
117f99e3 | 141 | } |
142 | DefineOutput(1, TList::Class()); | |
143 | } | |
144 | ||
145 | //________________________________________________________________________ | |
146 | AliAnalysisTaskMinijet::~AliAnalysisTaskMinijet() | |
147 | { | |
148 | // Destructor | |
149 | ||
150 | if (fHists && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fHists; | |
151 | } | |
152 | ||
153 | //________________________________________________________________________ | |
154 | void AliAnalysisTaskMinijet::UserCreateOutputObjects() | |
155 | { | |
156 | // Create histograms | |
157 | // Called once | |
b9ad6f04 | 158 | if(fDebug) Printf("In User Create Output Objects."); |
117f99e3 | 159 | |
7099c89a | 160 | fStep = new TH1F("fStep", "fStep", 10, -0.5, 9.5); |
9ed461df | 161 | fHistPt = new TH1F("fHistPt", "P_{T} distribution REC", 150, 0.1, 3.1); |
117f99e3 | 162 | fHistPt->GetXaxis()->SetTitle("P_{T} (GeV/c)"); |
163 | fHistPt->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)"); | |
164 | fHistPt->SetMarkerStyle(kFullCircle); | |
a031a5ca | 165 | fNContrNtracklets = new TH2F ("fNContrNtracklets", ";N_{tracklets};N_{vtx contrib}", 100,-0.5,99.5,100,-0.5,99.5); |
166 | fNContrNtracks = new TH2F ("fNContrNtracks", ";N_{tracks};N_{vtx contrib}", 100,-0.5,99.5,100,-0.5,99.5); | |
167 | ||
117f99e3 | 168 | if (fUseMC) { |
9ed461df | 169 | fHistPtMC = new TH1F("fHistPtMC", "P_{T} distribution MC", 150, 0.1, 3.1); |
117f99e3 | 170 | fHistPtMC->GetXaxis()->SetTitle("P_{T} (GeV/c)"); |
171 | fHistPtMC->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)"); | |
172 | fHistPtMC->SetMarkerStyle(kFullCircle); | |
7099c89a | 173 | |
9ed461df | 174 | fNmcNch = new TH2F("fNmcNch", "fNmcNch", 100,-0.5,99.5,100,-0.5,99.5); |
f2565a6b | 175 | fPNmcNch = new TProfile("pNmcNch", "pNmcNch", 100,-0.5,99.5); |
bf6ba8a0 | 176 | fNmcNchVtx = new TH2F("fNmcNchVtx", "fNmcNchVtx", 100,-0.5,99.5,100,-0.5,99.5); |
177 | fPNmcNchVtx = new TProfile("pNmcNchVtx", "pNmcNchVtx", 100,-0.5,99.5); | |
9ed461df | 178 | |
1b36e9e2 | 179 | fNmcNchTracklet = new TH2F("fNmcNchTracklet", "fNmcNchTracklet", 100,-0.5,99.5,100,-0.5,99.5); |
180 | fPNmcNchTracklet = new TProfile("pNmcNchTracklet", "pNmcNchTracklet", 100,-0.5,99.5); | |
181 | fNmcNchVtxTracklet = new TH2F("fNmcNchVtxTracklet", "fNmcNchVtxTracklet", 100,-0.5,99.5,100,-0.5,99.5); | |
182 | fPNmcNchVtxTracklet = new TProfile("pNmcNchVtxTracklet", "pNmcNchVtxTracklet", 100,-0.5,99.5); | |
183 | ||
117f99e3 | 184 | } |
185 | ||
9cccc98a | 186 | fChargedPi0 = new TH2F("fChargedPi0", "fChargedPi0", 200, -0.5, 199.5, 200, -0.5, 199.5); |
ac305649 | 187 | fVertexCheck = new TH1F("fVertexCheck", "fVertexCheck", 100, -0.5, 99.5); |
7099c89a | 188 | |
189 | ||
190 | //---------------------- | |
191 | //bins for pt in THnSpare | |
192 | Double_t ptMin = 0.0, ptMax = 100.; | |
193 | Int_t nPtBins = 39; | |
194 | Double_t binsPt[] = {0.0, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8, | |
ac305649 | 195 | 0.9, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 9.0, |
196 | 10.0, 12.0, 14.0, 16.0, 18.0, 20.0, 25.0, 30.0, 35.0, 40.0, 45.0, 50.0, 100.0}; | |
7099c89a | 197 | |
ac305649 | 198 | //Int_t nPtBinsAll = 100; |
199 | //Double_t ptMinAll = 1.e-2, ptMaxAll = 100.; | |
200 | //Double_t *binsPtAll = 0; | |
201 | //binsPtAll = (Double_t*)CreateLogAxis(nPtBinsAll,ptMinAll,ptMaxAll); | |
7099c89a | 202 | |
203 | ||
204 | Double_t ptMin2 = 0.0, ptMax2 = 100.; | |
205 | Int_t nPtBins2 = 9; | |
206 | Double_t binsPt2[] = {0.1, 0.4, 0.7, 1.0, 2.0, 3.0, 4.0, 5.0, 10.0, 100.0}; | |
207 | ||
208 | // Int_t nPtBins2 = 10; | |
209 | // Double_t ptMin2 = 0.4, ptMax2 = 100.; | |
210 | // Double_t *binsPt2 = 0; | |
211 | // binsPt2 = CreateLogAxis(nPtBins2,ptMin2,ptMax2); | |
212 | ||
213 | //3 dim matrix | |
214 | Int_t binsEffHisto[3] = {Int_t(fEtaCut*20), nPtBins, 150 }; | |
215 | Double_t minEffHisto[3] = {-fEtaCut, ptMin, -0.5 }; | |
216 | Double_t maxEffHisto[3] = {fEtaCut, ptMax, 149.5 }; | |
217 | ||
218 | //5 dim matrix | |
219 | Int_t binsEffHisto5[6] = { nPtBins2, nPtBins2, Int_t(fEtaCut*10), 180, 150 , 2 }; | |
220 | Double_t minEffHisto5[6] = { ptMin2, ptMin2, -2*fEtaCut, -0.5*TMath::Pi(), -0.5 , -0.5 }; | |
221 | Double_t maxEffHisto5[6] = { ptMax2, ptMax2, 2*fEtaCut, 1.5*TMath::Pi(), 149.5 , 1.5 }; | |
222 | ||
b9ad6f04 | 223 | |
7099c89a | 224 | //4 dim matrix |
225 | Int_t binsEvent[4] = { 150, 20, 50, nPtBins }; | |
226 | Double_t minEvent[4] = { -0.5, -10, 0, ptMin }; | |
227 | Double_t maxEvent[4] = { 149.5, 10, 10, ptMax }; | |
228 | ||
229 | //3 dim matrix | |
230 | Int_t binsAll[3] = {Int_t(fEtaCut*20), nPtBins2, 150 }; | |
231 | Double_t minAll[3] = {-fEtaCut, ptMin2, -0.5 }; | |
232 | Double_t maxAll[3] = {fEtaCut, ptMax2, 149.5 }; | |
233 | ||
234 | //-------------------- | |
235 | TString dataType[2] ={"ESD", "AOD"}; | |
236 | TString labels[6]={Form("%sAllAllMcNmc",dataType[fMode].Data()), | |
237 | Form("%sTrigAllMcNmc",dataType[fMode].Data()), | |
9cccc98a | 238 | Form("%sTrigVtxMcNmc",dataType[fMode].Data()), |
7099c89a | 239 | Form("%sTrigVtxMcNrec",dataType[fMode].Data()), |
240 | Form("%sTrigVtxRecMcPropNrec",dataType[fMode].Data()), | |
241 | Form("%sTrigVtxRecNrec",dataType[fMode].Data())}; | |
242 | ||
243 | ||
244 | for(Int_t i=0;i<6;i++){ | |
245 | ||
246 | fMapSingleTrig[i] = new THnSparseD(Form("fMapSingleTrig%s", labels[i].Data()),"eta:pt:Nrec", | |
247 | 3,binsEffHisto,minEffHisto,maxEffHisto); | |
248 | fMapSingleTrig[i]->SetBinEdges(1,binsPt); | |
249 | fMapSingleTrig[i]->GetAxis(0)->SetTitle("#eta"); | |
250 | fMapSingleTrig[i]->GetAxis(1)->SetTitle("p_{T} (GeV/c)"); | |
251 | fMapSingleTrig[i]->GetAxis(2)->SetTitle("N_{rec}"); | |
252 | fMapSingleTrig[i]->Sumw2(); | |
253 | ||
254 | fMapPair[i] = new THnSparseD(Form("fMapPair%s", labels[i].Data()),"pt_trig:pt_assoc:DeltaEta:DeltaPhi:Nrec:likesign", | |
255 | 6,binsEffHisto5,minEffHisto5,maxEffHisto5); | |
256 | fMapPair[i]->SetBinEdges(0,binsPt2); | |
257 | fMapPair[i]->SetBinEdges(1,binsPt2); | |
258 | fMapPair[i]->GetAxis(0)->SetTitle("p_{T, trig} (GeV/c)"); | |
259 | fMapPair[i]->GetAxis(1)->SetTitle("p_{T, assoc} (GeV/c)"); | |
260 | fMapPair[i]->GetAxis(2)->SetTitle("#Delta #eta"); | |
261 | fMapPair[i]->GetAxis(3)->SetTitle("#Delta #phi"); | |
262 | fMapPair[i]->GetAxis(4)->SetTitle("N_{rec}"); | |
263 | fMapPair[i]->GetAxis(5)->SetTitle("Like-sign or Unlike-sign"); | |
264 | fMapPair[i]->Sumw2(); | |
265 | ||
266 | ||
267 | fMapEvent[i] = new THnSparseD(Form("fMapEvent%s", labels[i].Data()),"Nrec:vertexZ:meanPt:leadingPt", | |
268 | 4,binsEvent,minEvent,maxEvent); | |
269 | fMapEvent[i]->GetAxis(0)->SetTitle("N_{rec}"); | |
270 | fMapEvent[i]->GetAxis(1)->SetTitle("z_{vertex} (cm)"); | |
271 | fMapEvent[i]->GetAxis(2)->SetTitle("meanPt"); | |
272 | fMapEvent[i]->SetBinEdges(3,binsPt); | |
273 | fMapEvent[i]->GetAxis(3)->SetTitle("leadingPt"); | |
274 | fMapEvent[i]->Sumw2(); | |
275 | ||
276 | fMapAll[i] = new THnSparseD(Form("fMapAll%s", labels[i].Data()),"eta:pt:Nrec", | |
277 | 3,binsAll,minAll,maxAll); | |
278 | fMapAll[i]->SetBinEdges(1,binsPt2); | |
279 | fMapAll[i]->GetAxis(0)->SetTitle("#eta"); | |
280 | fMapAll[i]->GetAxis(1)->SetTitle("p_{T} (GeV/c)"); | |
281 | fMapAll[i]->GetAxis(2)->SetTitle("N_{rec}"); | |
282 | fMapAll[i]->Sumw2(); | |
117f99e3 | 283 | |
117f99e3 | 284 | |
285 | fVertexZ[i] = new TH1F(Form("fVertexZ%s",labels[i].Data()), | |
b9ad6f04 | 286 | Form("fVertexZ%s",labels[i].Data()) , |
9cccc98a | 287 | 220, -11., 11.); |
117f99e3 | 288 | fPt[i] = new TH1F(Form("fPt%s",labels[i].Data()), |
289 | Form("fPt%s",labels[i].Data()) , | |
9ed461df | 290 | 200, 0., 50); |
7099c89a | 291 | fNcharge[i] = new TH1F(Form("fNcharge%s",labels[i].Data()), |
292 | Form("fNcharge%s",labels[i].Data()) , | |
293 | 250, -0.5, 249.5); | |
117f99e3 | 294 | fEta[i] = new TH1F (Form("fEta%s",labels[i].Data()), |
b9ad6f04 | 295 | Form("fEta%s",labels[i].Data()) , |
9ed461df | 296 | 100, -2., 2); |
117f99e3 | 297 | fPhi[i] = new TH1F(Form("fPhi%s",labels[i].Data()), |
b9ad6f04 | 298 | Form("fPhi%s",labels[i].Data()) , |
299 | 360, 0.,2*TMath::Pi()); | |
9ed461df | 300 | fDcaXY[i] = new TH1F(Form("fDcaXY%s",labels[i].Data()), |
301 | Form("fDcaXY%s",labels[i].Data()) , | |
302 | 200, -3,3); | |
303 | fDcaZ[i] = new TH1F(Form("fDcaZ%s",labels[i].Data()), | |
304 | Form("fDcaZ%s",labels[i].Data()) , | |
305 | 200, -10,10); | |
b9ad6f04 | 306 | fPtSeed[i] = new TH1F(Form("fPSeedt%s",labels[i].Data()), |
7099c89a | 307 | Form("fPtSeed%s",labels[i].Data()) , |
308 | 500, 0., 50); | |
b9ad6f04 | 309 | fEtaSeed[i] = new TH1F (Form("fEtaSeed%s",labels[i].Data()), |
7099c89a | 310 | Form("fEtaSeed%s",labels[i].Data()) , |
311 | 100, -2., 2); | |
b9ad6f04 | 312 | fPhiSeed[i] = new TH1F(Form("fPhiSeed%s",labels[i].Data()), |
7099c89a | 313 | Form("fPhiSeed%s",labels[i].Data()) , |
314 | 360, 0.,2*TMath::Pi()); | |
b9ad6f04 | 315 | |
b18f7dfb | 316 | fPtOthers[i] = new TH1F(Form("fPOtherst%s",labels[i].Data()), |
7099c89a | 317 | Form("fPtOthers%s",labels[i].Data()) , |
318 | 500, 0., 50); | |
b18f7dfb | 319 | fEtaOthers[i] = new TH1F (Form("fEtaOthers%s",labels[i].Data()), |
7099c89a | 320 | Form("fEtaOthers%s",labels[i].Data()) , |
321 | 100, -2., 2); | |
b18f7dfb | 322 | fPhiOthers[i] = new TH1F(Form("fPhiOthers%s",labels[i].Data()), |
7099c89a | 323 | Form("fPhiOthers%s",labels[i].Data()) , |
324 | 360, 0.,2*TMath::Pi()); | |
b18f7dfb | 325 | fPtEtaOthers[i] = new TH2F(Form("fPtEtaOthers%s",labels[i].Data()), |
326 | Form("fPtEtaOthers%s",labels[i].Data()) , | |
327 | 500, 0., 50, 100, -1., 1); | |
b9ad6f04 | 328 | fPhiEta[i] = new TH2F(Form("fPhiEta%s",labels[i].Data()), |
329 | Form("fPhiEta%s",labels[i].Data()) , | |
330 | 180, 0., 2*TMath::Pi(), 100, -1.,1.); | |
117f99e3 | 331 | fDPhiDEtaEventAxis[i] = new TH2F(Form("fDPhiDEtaEventAxis%s",labels[i].Data()), |
b9ad6f04 | 332 | Form("fDPhiDEtaEventAxis%s",labels[i].Data()) , |
7099c89a | 333 | 180, -0.5* TMath::Pi(), 1.5*TMath::Pi(), 9, -1.8,1.8); |
117f99e3 | 334 | fTriggerNch[i] = new TH1F(Form("fTriggerNch%s",labels[i].Data()), |
b9ad6f04 | 335 | Form("fTriggerNch%s",labels[i].Data()) , |
336 | 250, -0.5, 249.5); | |
9ed461df | 337 | fTriggerNchSeeds[i] = new TH2F(Form("fTriggerNchSeeds%s",labels[i].Data()), |
338 | Form("fTriggerNchSeeds%s",labels[i].Data()) , | |
339 | 250, -0.5, 249.5, 100, -0.5, 99.5); | |
117f99e3 | 340 | fTriggerTracklet[i] = new TH1F(Form("fTriggerTracklet%s",labels[i].Data()), |
b9ad6f04 | 341 | Form("fTriggerTracklet%s",labels[i].Data()) , |
342 | 250, -0.5, 249.5); | |
117f99e3 | 343 | fNch07Nch[i] = new TH2F(Form("fNch07Nch%s",labels[i].Data()), |
b9ad6f04 | 344 | Form("fNch07Nch%s",labels[i].Data()) , |
345 | 250, -2.5, 247.5,250, -2.5, 247.5); | |
f2565a6b | 346 | fPNch07Nch[i] = new TProfile(Form("pNch07Nch%s",labels[i].Data()), |
7099c89a | 347 | Form("pNch07Nch%s",labels[i].Data()) , |
348 | 250, -2.5, 247.5); | |
117f99e3 | 349 | fNch07Tracklet[i] = new TH2F(Form("fNch07Tracklet%s",labels[i].Data()), |
b9ad6f04 | 350 | Form("fNch07Tracklet%s",labels[i].Data()) , |
351 | 250, -2.5, 247.5,250, -2.5, 247.5); | |
117f99e3 | 352 | fNchTracklet[i] = new TH2F(Form("fNchTracklet%s",labels[i].Data()), |
b9ad6f04 | 353 | Form("fNchTracklet%s",labels[i].Data()) , |
354 | 250, -2.5, 247.5,250, -2.5, 247.5); | |
f2565a6b | 355 | fPNch07Tracklet[i] = new TProfile(Form("pNch07Tracklet%s",labels[i].Data()), |
7099c89a | 356 | Form("pNch07Tracklet%s",labels[i].Data()) , |
357 | 250, -2.5, 247.5); | |
9ed461df | 358 | fDPhiEventAxis[i] = new TH1F(Form("fDPhiEventAxis%s", |
359 | labels[i].Data()), | |
360 | Form("fDPhiEventAxis%s", | |
361 | labels[i].Data()) , | |
362 | 180, -0.5*TMath::Pi(), 1.5*TMath::Pi()); | |
363 | ||
117f99e3 | 364 | } |
365 | ||
366 | fHists = new TList(); | |
367 | fHists->SetOwner(); | |
368 | ||
7099c89a | 369 | fHists->Add(fStep); |
117f99e3 | 370 | fHists->Add(fHistPt); |
a031a5ca | 371 | fHists->Add(fNContrNtracklets); |
372 | fHists->Add(fNContrNtracks); | |
7099c89a | 373 | |
9ed461df | 374 | if(fUseMC){ |
375 | fHists->Add(fHistPtMC); | |
1b36e9e2 | 376 | |
9ed461df | 377 | fHists->Add(fNmcNch); |
f2565a6b | 378 | fHists->Add(fPNmcNch); |
bf6ba8a0 | 379 | fHists->Add(fNmcNchVtx); |
380 | fHists->Add(fPNmcNchVtx); | |
1b36e9e2 | 381 | |
382 | fHists->Add(fNmcNchTracklet); | |
383 | fHists->Add(fPNmcNchTracklet); | |
384 | fHists->Add(fNmcNchVtxTracklet); | |
385 | fHists->Add(fPNmcNchVtxTracklet); | |
9ed461df | 386 | } |
b9ad6f04 | 387 | fHists->Add(fChargedPi0); |
9cccc98a | 388 | fHists->Add(fVertexCheck); |
7099c89a | 389 | |
390 | for(Int_t i=0;i<6;i++){ | |
391 | fHists->Add(fMapSingleTrig[i]); | |
392 | fHists->Add(fMapPair[i]); | |
393 | fHists->Add(fMapEvent[i]); | |
394 | fHists->Add(fMapAll[i]); | |
117f99e3 | 395 | fHists->Add(fVertexZ[i]); |
396 | fHists->Add(fPt[i]); | |
7099c89a | 397 | fHists->Add(fNcharge[i]); |
117f99e3 | 398 | fHists->Add(fEta[i]); |
399 | fHists->Add(fPhi[i]); | |
9ed461df | 400 | fHists->Add(fDcaXY[i]); |
401 | fHists->Add(fDcaZ[i]); | |
b9ad6f04 | 402 | fHists->Add(fPtSeed[i]); |
403 | fHists->Add(fEtaSeed[i]); | |
404 | fHists->Add(fPhiSeed[i]); | |
b18f7dfb | 405 | fHists->Add(fPtOthers[i]); |
406 | fHists->Add(fEtaOthers[i]); | |
407 | fHists->Add(fPhiOthers[i]); | |
408 | fHists->Add(fPtEtaOthers[i]); | |
b9ad6f04 | 409 | fHists->Add(fPhiEta[i]); |
117f99e3 | 410 | fHists->Add(fDPhiDEtaEventAxis[i]); |
411 | fHists->Add(fTriggerNch[i]); | |
9ed461df | 412 | fHists->Add(fTriggerNchSeeds[i]); |
117f99e3 | 413 | fHists->Add(fTriggerTracklet[i]); |
414 | fHists->Add(fNch07Nch[i]); | |
f2565a6b | 415 | fHists->Add(fPNch07Nch[i]); |
117f99e3 | 416 | fHists->Add(fNch07Tracklet[i]); |
417 | fHists->Add(fNchTracklet[i]); | |
f2565a6b | 418 | fHists->Add(fPNch07Tracklet[i]); |
9ed461df | 419 | fHists->Add(fDPhiEventAxis[i]); |
117f99e3 | 420 | } |
7099c89a | 421 | |
117f99e3 | 422 | PostData(1, fHists); |
423 | ||
424 | } | |
425 | ||
426 | //________________________________________________________________________ | |
427 | void AliAnalysisTaskMinijet::UserExec(Option_t *) | |
428 | { | |
8855d81c | 429 | // Main function, called for each event |
7099c89a | 430 | // Kinematics-only, ESD and AOD can be processed. |
8855d81c | 431 | // Data is read (ReadEventESD, ReadEventAOD...) and then analysed (Analyse). |
7099c89a | 432 | // - in case of MC with full detector simulation, all correction steps(0-5) can be processed |
433 | // - for Data, only step 5 is performed | |
434 | // - for kinematics-only, only step 0 is processed | |
9cccc98a | 435 | |
436 | // - trigger - - vertex - - tracks - - multiplicity - | |
437 | // step 5 = Triggered events, reconstructed accepted vertex, reconstructed tracks, reconstructed multiplicity | |
7099c89a | 438 | // step 4 = Triggered events, reconstructed accepted vertex, reconstructed tracks with MC properties, reconstructed multiplicity |
9cccc98a | 439 | // step 3 = Triggered events, reconstructed accepted vertex, mc primary particles, reconstructed multiplicity |
440 | // step 2 = Triggered events, reconstructed accepted vertex, mc primary particles, true multiplicity | |
7099c89a | 441 | // step 1 = Triggered events, all mc primary particles, true multiplicity |
7099c89a | 442 | // step 0 = All events, all mc primary particles, true multiplicity |
443 | ||
8855d81c | 444 | |
7099c89a | 445 | if(fDebug) Printf("UserExec: Event starts"); |
9ed461df | 446 | |
117f99e3 | 447 | AliVEvent *event = InputEvent(); |
448 | if (!event) { | |
b9ad6f04 | 449 | Error("UserExec", "Could not retrieve event"); |
450 | return; | |
117f99e3 | 451 | } |
7099c89a | 452 | fBSign= event->GetMagneticField(); |
117f99e3 | 453 | |
454 | //get events, either ESD or AOD | |
455 | fESDEvent = dynamic_cast<AliESDEvent*> (InputEvent()); | |
456 | fAODEvent = dynamic_cast<AliAODEvent*> (InputEvent()); | |
457 | ||
7099c89a | 458 | vector<Float_t> pt; |
459 | vector<Float_t> eta; | |
460 | vector<Float_t> phi; | |
461 | vector<Short_t> charge; | |
462 | vector<Float_t> px; | |
463 | vector<Float_t> py; | |
464 | vector<Float_t> pz; | |
465 | vector<Float_t> theta; | |
466 | ||
117f99e3 | 467 | |
117f99e3 | 468 | //number of accepted tracks and tracklets |
469 | Int_t ntracks = 0; //return value for reading functions for ESD and AOD | |
7099c89a | 470 | //Int_t ntracksRemove = 0; //return value for reading functions for ESD and AOD |
471 | vector<Int_t> nTracksTracklets; // [0]=nAccepted,1=ntracklets,2=nall(also neutral in case of mc, | |
472 | //for real nall=ncharged) | |
473 | ||
474 | ||
475 | if(!fAODEvent && !fESDEvent)return; | |
476 | ||
ac305649 | 477 | // SDD check for LHC11a |
478 | if (fCheckSDD) { | |
7099c89a | 479 | |
ac305649 | 480 | //ESD |
481 | if(fESDEvent){ | |
482 | if(fSelOption==0){ | |
483 | const AliMultiplicity *mul = fESDEvent->GetMultiplicity(); | |
484 | Int_t nClu3 = mul->GetNumberOfITSClusters(2); | |
485 | Int_t nClu4 = mul->GetNumberOfITSClusters(3); | |
486 | if(nClu3==0 && nClu4==0) return; | |
487 | } | |
488 | else if (fSelOption==1){ | |
489 | TString trcl = fESDEvent->GetFiredTriggerClasses().Data(); | |
490 | if (!(trcl.Contains("CINT1-B-NOPF-ALLNOTRD"))) return; | |
491 | } | |
492 | } | |
8855d81c | 493 | |
ac305649 | 494 | //AOD |
495 | if(fAODEvent){ | |
496 | if(fSelOption==0){ | |
497 | Bool_t useEvent = false; | |
498 | Int_t nTracks = fAODEvent->GetNTracks(); | |
499 | for(Int_t itrack=0; itrack<nTracks; itrack++) { | |
500 | AliAODTrack * track = fAODEvent->GetTrack(itrack); | |
501 | if(TESTBIT(track->GetITSClusterMap(),2) || TESTBIT(track->GetITSClusterMap(),3) ){ | |
502 | useEvent=true; | |
503 | break; | |
504 | } | |
505 | } | |
506 | if (!useEvent) return; | |
507 | } | |
508 | else if(fSelOption==1){ | |
509 | TString trcl = fAODEvent->GetFiredTriggerClasses().Data(); | |
510 | if (!(trcl.Contains("CINT1-B-NOPF-ALLNOTRD"))) return; | |
511 | } | |
512 | } | |
513 | } | |
7099c89a | 514 | |
8855d81c | 515 | //reset values |
516 | fNMcPrimAccept=0;// number of accepted primaries | |
517 | fNRecAccept=0; // number of accepted tracks | |
1b36e9e2 | 518 | fNMcPrimAcceptTracklet=0;// number of accepted primaries (no pt cut) |
519 | fNRecAcceptTracklet=0; // number of accepted tracklets | |
7099c89a | 520 | |
8855d81c | 521 | // instead of task->SelectCollisionCandidate(mask) in AddTask macro |
522 | Bool_t isSelected = (((AliInputEventHandler*) | |
523 | (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler())) | |
524 | ->IsEventSelected() & fTriggerType); | |
525 | ||
ac305649 | 526 | |
8855d81c | 527 | if(fDebug){ |
528 | Printf("IsSelected = %d", isSelected); | |
529 | Printf("CheckEvent(true)= %d", CheckEvent(true)); | |
530 | Printf("CheckEvent(false)= %d", CheckEvent(false)); | |
531 | } | |
532 | ||
533 | //check trigger | |
534 | if(isSelected){ // has offline trigger | |
535 | ||
536 | if(CheckEvent(true)){//step 5 = TrigVtxRecNrec, step 4 = TrigVtxRecMcPropNrec ,step 3 = TrigVtxMcNrec | |
537 | ||
7099c89a | 538 | if(!fMcOnly){ |
539 | //step 5 = TrigVtxRecNrec | |
8855d81c | 540 | |
541 | // read tracks | |
542 | if(fESDEvent) ntracks = ReadEventESD(pt, eta, phi, charge,nTracksTracklets, 5); | |
543 | else if(fAODEvent)ntracks = ReadEventAOD(pt, eta, phi, charge,nTracksTracklets, 5); | |
544 | else Printf("Fatal Error"); | |
545 | ||
546 | // analyse | |
7099c89a | 547 | if(pt.size()){ //(internally ntracks=fNRecAccept) |
9cccc98a | 548 | Analyse(pt, eta, phi, charge, ntracks, nTracksTracklets[1], nTracksTracklets[2], 5);//step 5 = TrigVtxRecNrec |
7099c89a | 549 | } |
8855d81c | 550 | |
7099c89a | 551 | if(fUseMC){ |
552 | // step 4 = TrigVtxRecMcPropNrec | |
8855d81c | 553 | |
554 | // read tracks | |
555 | if(fESDEvent) ntracks = ReadEventESDRecMcProp(pt, eta, phi, charge, nTracksTracklets, 4); | |
556 | else if(fAODEvent) ntracks = ReadEventAODRecMcProp(pt, eta, phi, charge, nTracksTracklets, 4); | |
557 | else Printf("Fatal Error"); | |
558 | ||
559 | //analyse | |
7099c89a | 560 | if(pt.size()){//(internally ntracks=fNRecAccept) |
9cccc98a | 561 | Analyse(pt, eta, phi, charge, ntracks, nTracksTracklets[1], nTracksTracklets[2], 4); //step 4 = TrigVtxRecMcPropNrec |
7099c89a | 562 | } |
8855d81c | 563 | |
9cccc98a | 564 | // step 3 = TrigVtxMcNrec |
565 | ||
566 | // read tracks | |
567 | if(fESDEvent) ntracks = ReadEventESDMC(pt, eta, phi, charge, nTracksTracklets, 3); | |
568 | else if(fAODEvent) ntracks = ReadEventAODMC(pt, eta, phi, charge, nTracksTracklets, 3); | |
569 | else Printf("Fatal Error"); | |
570 | ||
571 | // analyse | |
572 | if(pt.size()){ | |
573 | Analyse(pt, eta, phi, charge, fNRecAccept, nTracksTracklets[1],nTracksTracklets[2], 3); //step 3 = TrigVtxMcNrec | |
574 | Analyse(pt, eta, phi, charge, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 2); //step 2 = TrigVtxMcNmc | |
575 | } | |
8855d81c | 576 | |
b9ad6f04 | 577 | } |
8855d81c | 578 | } |
579 | ||
7099c89a | 580 | }//check event (true) |
bf6ba8a0 | 581 | |
582 | ||
8855d81c | 583 | if(fUseMC && !fMcOnly){ |
584 | //reset values | |
dbc6d164 | 585 | fNMcPrimAccept=0;// number of accepted primaries |
586 | fNRecAccept=0; // number of accepted tracks | |
1b36e9e2 | 587 | fNMcPrimAcceptTracklet=0;// number of accepted primaries (no pt cut) |
588 | fNRecAcceptTracklet=0; // number of accepted tracklets | |
7099c89a | 589 | |
8855d81c | 590 | if(CheckEvent(false)){// all events, with and without reconstucted vertex |
9cccc98a | 591 | if(fESDEvent) ntracks = ReadEventESDMC(pt, eta, phi, charge, nTracksTracklets, 1);//read tracks |
592 | else if(fAODEvent) ntracks = ReadEventAODMC(pt, eta, phi, charge, nTracksTracklets, 1);//read tracks | |
8855d81c | 593 | else Printf("Fatal Error"); |
594 | ||
595 | // analyse | |
596 | if(pt.size()){ | |
8855d81c | 597 | Analyse(pt, eta, phi, charge, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 1); // step 1 = TrigAllMcNmc |
dbc6d164 | 598 | |
8855d81c | 599 | Analyse(pt, eta, phi, charge, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 0); //first part of step 0 // step 0 = AllAllMcNmc |
600 | } | |
dbc6d164 | 601 | |
7099c89a | 602 | |
7099c89a | 603 | } |
8855d81c | 604 | } |
605 | }// triggered event | |
7099c89a | 606 | |
8855d81c | 607 | else { // not selected by physics selection task = not triggered |
608 | if(fUseMC && !fMcOnly){ | |
609 | if(CheckEvent(false)){ | |
610 | ||
611 | //read tracks | |
612 | if(fESDEvent) ntracks = ReadEventESDMC(pt, eta, phi, charge, nTracksTracklets, 0); | |
613 | else if(fAODEvent) ntracks = ReadEventAODMC(pt, eta, phi, charge, nTracksTracklets, 0); | |
614 | else Printf("Fatal Error"); | |
615 | ||
616 | //analyse | |
617 | if(pt.size()){ | |
618 | Analyse(pt, eta, phi, charge, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 0); //second part of step 0 // step 0 = AllAllMcNmc | |
dbc6d164 | 619 | } |
117f99e3 | 620 | } |
117f99e3 | 621 | } |
8855d81c | 622 | } |
7099c89a | 623 | |
8855d81c | 624 | if(fMcOnly){ |
625 | // read event | |
626 | if(fMode==0) ntracks = ReadEventESDMC(pt, eta, phi, charge, nTracksTracklets, 0); | |
627 | else if (fMode==1) ntracks = ReadEventAODMC(pt, eta, phi, charge, nTracksTracklets, 0); | |
7099c89a | 628 | |
8855d81c | 629 | // analyse |
630 | if(pt.size()){ | |
631 | Analyse(pt, eta, phi, charge, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 0); | |
632 | } | |
633 | } | |
7099c89a | 634 | |
117f99e3 | 635 | |
636 | } | |
637 | ||
638 | ||
639 | //________________________________________________________________________ | |
8855d81c | 640 | Int_t AliAnalysisTaskMinijet::ReadEventESD( vector<Float_t> &ptArray, vector<Float_t> &etaArray, |
641 | vector<Float_t> &phiArray, vector<Short_t> &chargeArray, | |
642 | vector<Int_t> &nTracksTracklets, const Int_t step) | |
117f99e3 | 643 | { |
644 | // gives back the number of esd tracks and pointer to arrays with track | |
645 | // properties (pt, eta, phi) | |
9ed461df | 646 | // Uses TPC tracks with SPD vertex from now on |
117f99e3 | 647 | |
7099c89a | 648 | ptArray.clear(); |
649 | etaArray.clear(); | |
650 | phiArray.clear(); | |
651 | chargeArray.clear(); | |
652 | nTracksTracklets.clear(); | |
653 | ||
654 | const AliESDVertex* vtxSPD = fESDEvent->GetPrimaryVertexSPD(); // uses track or SPD vertexer | |
655 | fVertexZ[step]->Fill(vtxSPD->GetZ()); | |
656 | ||
117f99e3 | 657 | // Retreive the number of all tracks for this event. |
658 | Int_t ntracks = fESDEvent->GetNumberOfTracks(); | |
7099c89a | 659 | if(fDebug>1) Printf("all ESD tracks: %d", ntracks); |
117f99e3 | 660 | |
661 | //first loop to check how many tracks are accepted | |
662 | //------------------ | |
663 | Int_t nAcceptedTracks=0; | |
664 | for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) { | |
9ed461df | 665 | |
7099c89a | 666 | AliESDtrack *esdTrack = (AliESDtrack *)fESDEvent->GetTrack(iTracks); |
9ed461df | 667 | if (!esdTrack) { |
8855d81c | 668 | Error("ReadEventESD", "Could not receive track %d", iTracks); |
117f99e3 | 669 | continue; |
670 | } | |
7099c89a | 671 | |
9ed461df | 672 | // use TPC only tracks with non default SPD vertex |
673 | AliESDtrack *track = AliESDtrackCuts:: | |
674 | GetTPCOnlyTrack(dynamic_cast<AliESDEvent*>(fESDEvent),esdTrack->GetID()); | |
675 | if(!track) continue; | |
7099c89a | 676 | if(!fCuts->AcceptTrack(track)) { |
677 | delete track; | |
678 | continue;// apply TPC track cuts before constrain to SPD vertex | |
679 | } | |
9ed461df | 680 | if(track->Pt()>0.){ |
681 | // only constrain tracks above threshold | |
682 | AliExternalTrackParam exParam; | |
683 | // take the B-field from the ESD, no 3D fieldMap available at this point | |
684 | Bool_t relate = false; | |
685 | relate = track->RelateToVertexTPC(vtxSPD,fESDEvent->GetMagneticField(), | |
686 | kVeryBig,&exParam); | |
687 | if(!relate){ | |
688 | delete track; | |
689 | continue; | |
690 | } | |
691 | track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(), | |
692 | exParam.GetCovariance()); | |
693 | } | |
7099c89a | 694 | else{ |
695 | delete track; | |
696 | continue;// only if tracks have pt<=0 | |
697 | } | |
9ed461df | 698 | |
7099c89a | 699 | if (TMath::Abs(track->Eta())<fEtaCut && track->Pt()>fPtMin && track->Pt()<fPtMax) { |
700 | ptArray.push_back(track->Pt()); | |
701 | etaArray.push_back(track->Eta()); | |
702 | phiArray.push_back(track->Phi()); | |
703 | chargeArray.push_back(track->Charge()); | |
9ed461df | 704 | ++nAcceptedTracks; |
7099c89a | 705 | fHistPt->Fill(track->Pt()); |
706 | } | |
9ed461df | 707 | |
708 | // TPC only track memory needs to be cleaned up | |
709 | if(track) | |
710 | delete track; | |
711 | ||
117f99e3 | 712 | } |
7099c89a | 713 | |
714 | //need to be checked | |
715 | if(nAcceptedTracks==0) return 0; | |
716 | ||
717 | //tracklet loop | |
718 | Int_t ntrackletsAccept=0; | |
719 | AliMultiplicity * mult = (AliMultiplicity*)(fESDEvent->GetMultiplicity()); | |
720 | Int_t ntracklets = mult->GetNumberOfTracklets(); | |
721 | for(Int_t i=0;i< ntracklets;i++){ | |
722 | if(mult->GetDeltaPhi(i)<0.05 && TMath::Abs(mult->GetEta(i))<fEtaCut){ | |
723 | ntrackletsAccept++; | |
724 | } | |
725 | } | |
726 | nTracksTracklets.push_back(nAcceptedTracks); | |
727 | nTracksTracklets.push_back(ntrackletsAccept); | |
728 | nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis | |
729 | //where here also neutral particles are counted. | |
9ed461df | 730 | |
731 | ||
7099c89a | 732 | fVzEvent=vtxSPD->GetZ(); // needed for correction map |
1b36e9e2 | 733 | if(step==5 || step ==2) { |
734 | fNRecAccept=nAcceptedTracks; | |
735 | fNRecAcceptTracklet=ntrackletsAccept; | |
736 | } | |
7099c89a | 737 | return fNRecAccept; |
117f99e3 | 738 | |
117f99e3 | 739 | |
7099c89a | 740 | } |
9ed461df | 741 | |
7099c89a | 742 | //________________________________________________________________________ |
8855d81c | 743 | Int_t AliAnalysisTaskMinijet::ReadEventESDRecMcProp( vector<Float_t> &ptArray, vector<Float_t> &etaArray, |
7099c89a | 744 | vector<Float_t> &phiArray, vector<Short_t> &chargeArray, |
745 | vector<Int_t> &nTracksTracklets, const Int_t step) | |
746 | { | |
747 | // gives back the number of esd tracks and pointer to arrays with track | |
748 | // properties (pt, eta, phi) of mc particles if available | |
749 | // Uses TPC tracks with SPD vertex from now on | |
9ed461df | 750 | |
7099c89a | 751 | ptArray.clear(); |
752 | etaArray.clear(); | |
753 | phiArray.clear(); | |
754 | chargeArray.clear(); | |
755 | nTracksTracklets.clear(); | |
9ed461df | 756 | |
7099c89a | 757 | |
758 | AliMCEvent *mcEvent = (AliMCEvent*) MCEvent(); | |
759 | if (!mcEvent) { | |
8855d81c | 760 | Error("ReadEventESDRecMcProp", "Could not retrieve MC event"); |
7099c89a | 761 | return 0; |
762 | } | |
763 | AliStack* stack = MCEvent()->Stack(); | |
764 | if(!stack) return 0; | |
765 | ||
766 | ||
767 | // Retreive the number of all tracks for this event. | |
768 | Int_t ntracks = fESDEvent->GetNumberOfTracks(); | |
769 | if(fDebug>1)Printf("all ESD tracks: %d", ntracks); | |
770 | ||
771 | const AliESDVertex *vtxSPD = fESDEvent->GetPrimaryVertexSPD(); | |
772 | fVertexZ[step]->Fill(vtxSPD->GetZ()); | |
773 | ||
774 | //track loop | |
775 | Int_t nAcceptedTracks=0; | |
117f99e3 | 776 | for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) { |
7099c89a | 777 | |
778 | AliVParticle *vtrack = fESDEvent->GetTrack(iTracks); | |
9ed461df | 779 | AliESDtrack *esdTrack = (AliESDtrack *)fESDEvent->GetTrack(iTracks); |
780 | if (!esdTrack) { | |
8855d81c | 781 | Error("ReadEventESDRecMcProp", "Could not receive track %d", iTracks); |
117f99e3 | 782 | continue; |
783 | } | |
7099c89a | 784 | |
785 | // use TPC only tracks with non default SPD vertex | |
9ed461df | 786 | AliESDtrack *track = AliESDtrackCuts:: |
787 | GetTPCOnlyTrack(dynamic_cast<AliESDEvent*>(fESDEvent),esdTrack->GetID()); | |
788 | if(!track) continue; | |
7099c89a | 789 | if(!fCuts->AcceptTrack(track)) { |
790 | delete track; | |
791 | continue;// apply TPC track cuts before constrain to SPD vertex | |
792 | } | |
9ed461df | 793 | if(track->Pt()>0.){ |
794 | // only constrain tracks above threshold | |
795 | AliExternalTrackParam exParam; | |
796 | // take the B-field from the ESD, no 3D fieldMap available at this point | |
797 | Bool_t relate = false; | |
798 | relate = track->RelateToVertexTPC(vtxSPD,fESDEvent->GetMagneticField(), | |
799 | kVeryBig,&exParam); | |
800 | if(!relate){ | |
801 | delete track; | |
802 | continue; | |
803 | } | |
804 | track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(), | |
805 | exParam.GetCovariance()); | |
806 | } | |
7099c89a | 807 | else{ |
808 | delete track; | |
809 | continue;// only if tracks have pt<=0 | |
810 | } | |
9ed461df | 811 | |
7099c89a | 812 | //count tracks, if available, use mc particle properties |
813 | if(vtrack->GetLabel()<0){ | |
814 | if (TMath::Abs(track->Eta())<fEtaCut && track->Pt()>fPtMin && track->Pt()<fPtMax){ | |
815 | ptArray.push_back(track->Pt()); | |
816 | etaArray.push_back(track->Eta()); | |
817 | phiArray.push_back(track->Phi()); | |
818 | chargeArray.push_back(track->Charge()); | |
819 | ++nAcceptedTracks; | |
820 | } | |
117f99e3 | 821 | } |
7099c89a | 822 | else{ |
823 | TParticle *partOfTrack = stack->Particle(vtrack->GetLabel()); | |
824 | if (TMath::Abs(partOfTrack->Eta())<fEtaCut && partOfTrack->Pt()>fPtMin && partOfTrack->Pt()<fPtMax) { | |
825 | ptArray.push_back(partOfTrack->Pt()); | |
826 | etaArray.push_back(partOfTrack->Eta()); | |
827 | phiArray.push_back(partOfTrack->Phi()); | |
828 | chargeArray.push_back(vtrack->Charge()); | |
829 | ++nAcceptedTracks; | |
830 | } | |
831 | } | |
832 | ||
9ed461df | 833 | // TPC only track memory needs to be cleaned up |
834 | if(track) | |
835 | delete track; | |
836 | ||
117f99e3 | 837 | } |
838 | ||
7099c89a | 839 | if(nAcceptedTracks==0) return 0; |
117f99e3 | 840 | |
841 | //tracklet loop | |
842 | Int_t ntrackletsAccept=0; | |
843 | AliMultiplicity * mult = (AliMultiplicity*)(fESDEvent->GetMultiplicity()); | |
844 | Int_t ntracklets = mult->GetNumberOfTracklets(); | |
845 | for(Int_t i=0;i< ntracklets;i++){ | |
7099c89a | 846 | if(mult->GetDeltaPhi(i)<0.05 && TMath::Abs(mult->GetEta(i))<fEtaCut){ |
117f99e3 | 847 | ntrackletsAccept++; |
848 | } | |
849 | } | |
850 | ||
7099c89a | 851 | nTracksTracklets.push_back(nAcceptedTracks); |
852 | nTracksTracklets.push_back(ntrackletsAccept); | |
853 | nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis | |
854 | //where here also neutral particles are counted. | |
855 | ||
856 | ||
857 | //get mc vertex for correction maps | |
858 | AliGenEventHeader* header = MCEvent()->GenEventHeader(); | |
859 | TArrayF mcV; | |
860 | header->PrimaryVertex(mcV); | |
861 | fVzEvent= mcV[2]; | |
862 | ||
863 | return fNRecAccept; // give back reconstructed value | |
117f99e3 | 864 | |
117f99e3 | 865 | |
866 | } | |
867 | ||
7099c89a | 868 | |
869 | ||
870 | ||
117f99e3 | 871 | //________________________________________________________________________ |
8855d81c | 872 | Int_t AliAnalysisTaskMinijet::ReadEventESDMC(vector<Float_t> &ptArray, vector<Float_t> &etaArray, |
7099c89a | 873 | vector<Float_t> &phiArray, vector<Short_t> &chargeArray, |
874 | vector<Int_t> &nTracksTracklets, const Int_t step) | |
117f99e3 | 875 | { |
876 | // gives back the number of charged prim MC particle and pointer to arrays | |
877 | // with particle properties (pt, eta, phi) | |
878 | ||
7099c89a | 879 | ptArray.clear(); |
880 | etaArray.clear(); | |
881 | phiArray.clear(); | |
882 | chargeArray.clear(); | |
883 | nTracksTracklets.clear(); | |
884 | ||
885 | fNMcPrimAccept=0; | |
b9ad6f04 | 886 | |
117f99e3 | 887 | AliMCEvent *mcEvent = (AliMCEvent*) MCEvent(); |
888 | if (!mcEvent) { | |
8855d81c | 889 | Error("ReadEventESDMC", "Could not retrieve MC event"); |
117f99e3 | 890 | return 0; |
891 | } | |
892 | ||
9ed461df | 893 | AliStack* stack = MCEvent()->Stack(); |
894 | if(!stack) return 0; | |
117f99e3 | 895 | |
896 | Int_t ntracks = mcEvent->GetNumberOfTracks(); | |
7099c89a | 897 | if(fDebug>1)Printf("MC particles: %d", ntracks); |
117f99e3 | 898 | |
7099c89a | 899 | //vertex |
900 | AliGenEventHeader* header = MCEvent()->GenEventHeader(); | |
901 | TArrayF mcV; | |
dbc6d164 | 902 | Float_t vzMC=0.; |
903 | if(header){ | |
904 | header->PrimaryVertex(mcV); | |
905 | vzMC = mcV[2]; | |
9cccc98a | 906 | if(step==1){ |
907 | fVertexZ[0]->Fill(vzMC); | |
908 | } | |
dbc6d164 | 909 | fVertexZ[step]->Fill(vzMC); |
910 | } | |
117f99e3 | 911 | |
912 | //---------------------------------- | |
913 | //first track loop to check how many chared primary tracks are available | |
914 | Int_t nChargedPrimaries=0; | |
b9ad6f04 | 915 | Int_t nAllPrimaries=0; |
916 | ||
917 | Int_t nPseudoTracklets=0; | |
117f99e3 | 918 | for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) { |
919 | AliMCParticle *track = dynamic_cast<AliMCParticle*>(mcEvent->GetTrack(iTracks)); | |
920 | if (!track) { | |
8855d81c | 921 | Error("ReadEventESDMC", "Could not receive track %d", iTracks); |
117f99e3 | 922 | continue; |
923 | } | |
b9ad6f04 | 924 | |
925 | ||
926 | if(//count also charged particles in case of fSelectParticles==2 (only neutral) | |
927 | !SelectParticlePlusCharged( | |
7099c89a | 928 | track->Charge(), |
929 | track->PdgCode(), | |
930 | stack->IsPhysicalPrimary(track->Label()) | |
931 | ) | |
b9ad6f04 | 932 | ) |
933 | continue; | |
934 | ||
b9ad6f04 | 935 | //count number of pseudo tracklets |
7099c89a | 936 | if(TMath::Abs(track->Eta())<=fEtaCut && track->Pt()>0.0) ++nPseudoTracklets; //0.035 |
117f99e3 | 937 | //same cuts as on ESDtracks |
7099c89a | 938 | if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue; |
b9ad6f04 | 939 | |
940 | //count all primaries | |
941 | ++nAllPrimaries; | |
942 | //count charged primaries | |
943 | if (track->Charge() != 0) ++nChargedPrimaries; | |
944 | ||
7099c89a | 945 | if(fDebug>2) Printf("PDG=%d, IsPrim=%d", track->PdgCode(),stack->IsPhysicalPrimary(track->Label()) ); |
b9ad6f04 | 946 | |
947 | ||
117f99e3 | 948 | } |
949 | //---------------------------------- | |
950 | ||
7099c89a | 951 | if(fDebug>2){ |
952 | Printf("All in acceptance=%d",nAllPrimaries); | |
953 | Printf("Charged in acceptance =%d",nChargedPrimaries); | |
954 | } | |
b9ad6f04 | 955 | |
956 | fChargedPi0->Fill(nAllPrimaries,nChargedPrimaries); | |
117f99e3 | 957 | |
b9ad6f04 | 958 | if(nAllPrimaries==0) return 0; |
117f99e3 | 959 | if(nChargedPrimaries==0) return 0; |
960 | ||
117f99e3 | 961 | //track loop |
7099c89a | 962 | //Int_t iChargedPiK=0; |
117f99e3 | 963 | for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) { |
964 | AliMCParticle *track = dynamic_cast<AliMCParticle*>(mcEvent->GetTrack(iTracks)); | |
965 | if (!track) { | |
8855d81c | 966 | Error("ReadEventESDMC", "Could not receive track %d", iTracks); |
117f99e3 | 967 | continue; |
968 | } | |
b9ad6f04 | 969 | |
970 | if(!SelectParticle( | |
971 | track->Charge(), | |
972 | track->PdgCode(), | |
973 | stack->IsPhysicalPrimary(track->Label()) | |
974 | ) | |
975 | ) | |
976 | continue; | |
977 | ||
978 | ||
117f99e3 | 979 | //same cuts as on ESDtracks |
7099c89a | 980 | if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue; |
117f99e3 | 981 | |
7099c89a | 982 | if(fDebug>2) Printf("After: PDG=%d, IsPrim=%d", track->PdgCode(),stack->IsPhysicalPrimary(track->Label()) ); |
b9ad6f04 | 983 | |
117f99e3 | 984 | |
985 | fHistPtMC->Fill(track->Pt()); | |
986 | //fills arrays with track properties | |
7099c89a | 987 | ptArray.push_back(track->Pt()); |
988 | etaArray.push_back(track->Eta()); | |
989 | phiArray.push_back(track->Phi()); | |
990 | chargeArray.push_back(track->Charge()); | |
991 | ||
992 | ||
117f99e3 | 993 | } //track loop |
994 | ||
7099c89a | 995 | nTracksTracklets.push_back(nChargedPrimaries); |
996 | nTracksTracklets.push_back(nPseudoTracklets); | |
b9ad6f04 | 997 | if(fSelectParticles!=2){ |
7099c89a | 998 | nTracksTracklets.push_back(nAllPrimaries); |
b9ad6f04 | 999 | } |
1000 | else{ | |
7099c89a | 1001 | nTracksTracklets.push_back(nAllPrimaries-nChargedPrimaries); // only neutral |
b9ad6f04 | 1002 | } |
9ed461df | 1003 | |
1b36e9e2 | 1004 | fNMcPrimAccept = nChargedPrimaries; |
1005 | fNMcPrimAcceptTracklet = nPseudoTracklets; | |
7099c89a | 1006 | |
1007 | if(step==1){ | |
1008 | fNmcNch->Fill(fNMcPrimAccept,fNRecAccept); | |
1009 | fPNmcNch->Fill(fNMcPrimAccept,fNRecAccept); | |
1b36e9e2 | 1010 | fNmcNchTracklet->Fill(fNMcPrimAcceptTracklet,fNRecAcceptTracklet); |
1011 | fPNmcNchTracklet->Fill(fNMcPrimAcceptTracklet,fNRecAcceptTracklet); | |
7099c89a | 1012 | } |
bf6ba8a0 | 1013 | if(step==3){ |
1014 | fNmcNchVtx->Fill(fNMcPrimAccept,fNRecAccept); | |
1015 | fPNmcNchVtx->Fill(fNMcPrimAccept,fNRecAccept); | |
1b36e9e2 | 1016 | fNmcNchVtxTracklet->Fill(fNMcPrimAcceptTracklet,fNRecAcceptTracklet); |
1017 | fPNmcNchVtxTracklet->Fill(fNMcPrimAcceptTracklet,fNRecAcceptTracklet); | |
bf6ba8a0 | 1018 | } |
7099c89a | 1019 | |
dbc6d164 | 1020 | fVzEvent= vzMC; |
7099c89a | 1021 | return fNRecAccept; |
117f99e3 | 1022 | |
1023 | } | |
1024 | ||
1025 | //________________________________________________________________________ | |
8855d81c | 1026 | Int_t AliAnalysisTaskMinijet::ReadEventAOD( vector<Float_t> &ptArray, vector<Float_t> &etaArray, |
7099c89a | 1027 | vector<Float_t> &phiArray, vector<Short_t> &chargeArray, |
1028 | vector<Int_t> &nTracksTracklets, const Int_t step) | |
117f99e3 | 1029 | { |
1030 | // gives back the number of AOD tracks and pointer to arrays with track | |
1031 | // properties (pt, eta, phi) | |
1032 | ||
7099c89a | 1033 | ptArray.clear(); |
1034 | etaArray.clear(); | |
1035 | phiArray.clear(); | |
1036 | chargeArray.clear(); | |
1037 | nTracksTracklets.clear(); | |
1038 | ||
1039 | TClonesArray *mcArray=0x0; | |
1040 | if(fAnalysePrimOnly){ | |
1041 | mcArray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName()); | |
1042 | } | |
1043 | ||
1044 | ||
1045 | AliAODVertex* vertex= (AliAODVertex*)fAODEvent->GetPrimaryVertexSPD();//GetPrimaryVertex() | |
1046 | Double_t vzAOD=vertex->GetZ(); | |
1047 | fVertexZ[step]->Fill(vzAOD); | |
117f99e3 | 1048 | |
1049 | // Retreive the number of tracks for this event. | |
1050 | Int_t ntracks = fAODEvent->GetNumberOfTracks(); | |
7099c89a | 1051 | if(fDebug>1) Printf("AOD tracks: %d", ntracks); |
117f99e3 | 1052 | |
1053 | ||
1054 | Int_t nAcceptedTracks=0; | |
1055 | for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) { | |
1056 | AliAODTrack *track = (AliAODTrack *)fAODEvent->GetTrack(iTracks); | |
1057 | if (!track) { | |
8855d81c | 1058 | Error("ReadEventAOD", "Could not receive track %d", iTracks); |
117f99e3 | 1059 | continue; |
1060 | } | |
7099c89a | 1061 | |
1062 | AliVParticle *vtrack = fAODEvent->GetTrack(iTracks); | |
1063 | ||
1064 | //use only tracks from primaries | |
1065 | if(fAnalysePrimOnly){ | |
1066 | if(vtrack->GetLabel()<0)continue; | |
1067 | if(!(static_cast<AliAODMCParticle*>(mcArray->At(vtrack->GetLabel()))->IsPhysicalPrimary()))continue; | |
1068 | } | |
1069 | ||
8855d81c | 1070 | if(track->TestFilterBit(fFilterBit) && TMath::Abs(track->Eta())<fEtaCut |
7099c89a | 1071 | && track->Pt()>fPtMin && track->Pt()<fPtMax){ |
1072 | ||
1073 | nAcceptedTracks++; | |
1074 | ||
1075 | // Printf("dca= %f", track->DCA()); | |
1076 | //save track properties in vector | |
1077 | ptArray.push_back(track->Pt()); | |
1078 | etaArray.push_back(track->Eta()); | |
1079 | phiArray.push_back(track->Phi()); | |
1080 | chargeArray.push_back(track->Charge()); | |
1081 | fHistPt->Fill(track->Pt()); | |
1082 | ||
1083 | } | |
1084 | } | |
1085 | //need to check this option for MC | |
1086 | if(nAcceptedTracks==0) return 0; | |
1087 | ||
1088 | ||
1089 | //tracklet loop | |
1090 | Int_t ntrackletsAccept=0; | |
1091 | AliAODTracklets * mult= (AliAODTracklets*)fAODEvent->GetTracklets(); | |
1092 | for(Int_t i=0;i<mult->GetNumberOfTracklets();++i){ | |
1093 | if(TMath::Abs(mult->GetDeltaPhi(i))<0.05 && TMath::Abs(TMath::Log(TMath::Tan(0.5 * mult->GetTheta(i))))<fEtaCut){ | |
1094 | ++ntrackletsAccept; | |
1095 | } | |
117f99e3 | 1096 | } |
7099c89a | 1097 | |
1098 | ||
1099 | nTracksTracklets.push_back(nAcceptedTracks); | |
1100 | nTracksTracklets.push_back(ntrackletsAccept); | |
1101 | nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis | |
1102 | //where here also neutral particles are counted. | |
1103 | ||
117f99e3 | 1104 | |
7099c89a | 1105 | fVzEvent= vzAOD; |
1b36e9e2 | 1106 | if(step==5 || step==2){ |
1107 | fNRecAccept = nAcceptedTracks; // needed for MC case //step5 = TrigVtxRecNrec | |
1108 | fNRecAcceptTracklet = ntrackletsAccept; // needed for MC case //step5 = TrigVtxRecNrec | |
1109 | } | |
7099c89a | 1110 | return fNRecAccept; // at the moment, always return reconstructed multiplicity |
117f99e3 | 1111 | |
7099c89a | 1112 | } |
1113 | ||
1114 | //________________________________________________________________________ | |
8855d81c | 1115 | Int_t AliAnalysisTaskMinijet::ReadEventAODRecMcProp( vector<Float_t> &ptArray, vector<Float_t> &etaArray, |
7099c89a | 1116 | vector<Float_t> &phiArray, vector<Short_t> &chargeArray, |
1117 | vector<Int_t> &nTracksTracklets, const Int_t step) | |
1118 | { | |
1119 | // gives back the number of AOD tracks and pointer to arrays with track | |
1120 | // properties (pt, eta, phi) | |
1121 | ||
1122 | ||
1123 | ptArray.clear(); | |
1124 | etaArray.clear(); | |
1125 | phiArray.clear(); | |
1126 | chargeArray.clear(); | |
1127 | nTracksTracklets.clear(); | |
b9ad6f04 | 1128 | |
b9ad6f04 | 1129 | |
7099c89a | 1130 | // Retreive the number of tracks for this event. |
1131 | Int_t ntracks = fAODEvent->GetNumberOfTracks(); | |
1132 | if(fDebug>1) Printf("AOD tracks: %d", ntracks); | |
b9ad6f04 | 1133 | |
7099c89a | 1134 | |
1135 | //get array of mc particles | |
1136 | TClonesArray *mcArray = (TClonesArray*)fAODEvent-> | |
1137 | FindListObject(AliAODMCParticle::StdBranchName()); | |
1138 | if(!mcArray){ | |
1139 | Printf("No MC particle branch found"); | |
1140 | return kFALSE; | |
1141 | } | |
1142 | ||
1143 | AliAODVertex* vtx= (AliAODVertex*)fAODEvent->GetPrimaryVertexSPD();//GetPrimaryVertex() | |
1144 | Double_t vzAOD=vtx->GetZ(); | |
1145 | fVertexZ[step]->Fill(vzAOD); | |
117f99e3 | 1146 | |
7099c89a | 1147 | Int_t nAcceptedTracks=0; |
117f99e3 | 1148 | for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) { |
1149 | AliAODTrack *track = (AliAODTrack *)fAODEvent->GetTrack(iTracks); | |
7099c89a | 1150 | |
1151 | AliVParticle *vtrack = fAODEvent->GetTrack(iTracks); | |
1152 | ||
117f99e3 | 1153 | if (!track) { |
8855d81c | 1154 | Error("ReadEventAODRecMcProp", "Could not receive track %d", iTracks); |
b9ad6f04 | 1155 | continue; |
117f99e3 | 1156 | } |
7099c89a | 1157 | |
1158 | //use only tracks from primaries | |
1159 | if(fAnalysePrimOnly){ | |
1160 | if(vtrack->GetLabel()<0)continue; | |
1161 | if(!(static_cast<AliAODMCParticle*>(mcArray->At(vtrack->GetLabel()))->IsPhysicalPrimary()))continue; | |
1162 | } | |
117f99e3 | 1163 | |
8855d81c | 1164 | if(track->TestFilterBit(fFilterBit) && TMath::Abs(track->Eta())<fEtaCut && |
7099c89a | 1165 | track->Pt()>fPtMin && track->Pt()<fPtMax){ |
1166 | ||
1167 | nAcceptedTracks++; | |
1168 | ||
1169 | //save track properties in vector | |
ac305649 | 1170 | if(vtrack->GetLabel()<0){ //fake tracks before "label<0", but crash in AOD079 // what is the meaning of label 0 |
7099c89a | 1171 | // Printf("Fake track"); |
1172 | // continue; | |
1173 | ptArray.push_back(track->Pt()); | |
1174 | etaArray.push_back(track->Eta()); | |
1175 | phiArray.push_back(track->Phi()); | |
1176 | chargeArray.push_back(track->Charge()); | |
1177 | } | |
1178 | else{//mc properties | |
1179 | AliAODMCParticle *partOfTrack = (AliAODMCParticle*)mcArray->At(vtrack->GetLabel()); | |
ac305649 | 1180 | if(!partOfTrack) Printf("label=%d", vtrack->GetLabel()); |
1181 | if(partOfTrack){ | |
1182 | ptArray.push_back(partOfTrack->Pt()); | |
1183 | etaArray.push_back(partOfTrack->Eta()); | |
1184 | phiArray.push_back(partOfTrack->Phi()); | |
1185 | chargeArray.push_back(vtrack->Charge());//partOfTrack? | |
1186 | } | |
7099c89a | 1187 | } |
7099c89a | 1188 | } |
1189 | } | |
1190 | //need to check this option for MC | |
1191 | if(nAcceptedTracks==0) return 0; | |
117f99e3 | 1192 | |
1193 | //tracklet loop | |
1194 | Int_t ntrackletsAccept=0; | |
1195 | AliAODTracklets * mult= (AliAODTracklets*)fAODEvent->GetTracklets(); | |
1196 | for(Int_t i=0;i<mult->GetNumberOfTracklets();++i){ | |
7099c89a | 1197 | if(TMath::Abs(mult->GetDeltaPhi(i))<0.05 && TMath::Abs(TMath::Log(TMath::Tan(0.5 * mult->GetTheta(i))))<fEtaCut ){ |
117f99e3 | 1198 | ++ntrackletsAccept; |
1199 | } | |
1200 | } | |
1201 | ||
7099c89a | 1202 | |
1203 | nTracksTracklets.push_back(nAcceptedTracks); | |
1204 | nTracksTracklets.push_back(ntrackletsAccept); | |
1205 | nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis | |
1206 | //where here also neutral particles are counted. | |
117f99e3 | 1207 | |
117f99e3 | 1208 | |
7099c89a | 1209 | //check vertex (mc) |
1210 | AliAODMCHeader *aodMCheader = (AliAODMCHeader *) fAODEvent-> | |
1211 | FindListObject(AliAODMCHeader::StdBranchName()); | |
1212 | Float_t vzMC = aodMCheader->GetVtxZ(); | |
1213 | ||
1214 | fVzEvent= vzMC; | |
1215 | return fNRecAccept;//this is the rec value from step 5 | |
1216 | ||
1217 | } | |
1218 | ||
1219 | ||
117f99e3 | 1220 | |
1221 | //________________________________________________________________________ | |
8855d81c | 1222 | Int_t AliAnalysisTaskMinijet::ReadEventAODMC( vector<Float_t> &ptArray, vector<Float_t> &etaArray, |
7099c89a | 1223 | vector<Float_t> &phiArray, vector<Short_t> &chargeArray, |
1224 | vector<Int_t> &nTracksTracklets, const Int_t step) | |
117f99e3 | 1225 | { |
b7c0438e | 1226 | // gives back the number of AOD MC particles and pointer to arrays with particle |
1227 | // properties (pt, eta, phi) | |
117f99e3 | 1228 | |
7099c89a | 1229 | ptArray.clear(); |
1230 | etaArray.clear(); | |
1231 | phiArray.clear(); | |
1232 | chargeArray.clear(); | |
1233 | nTracksTracklets.clear(); | |
1234 | ||
1235 | //check vertex | |
1236 | AliAODMCHeader *aodMCheader = (AliAODMCHeader *) fAODEvent-> | |
1237 | FindListObject(AliAODMCHeader::StdBranchName()); | |
1238 | Float_t vzMC = aodMCheader->GetVtxZ(); | |
9cccc98a | 1239 | if(step==1){ |
1240 | fVertexZ[0]->Fill(vzMC); | |
1241 | } | |
7099c89a | 1242 | fVertexZ[step]->Fill(vzMC); |
7099c89a | 1243 | |
b7c0438e | 1244 | //retreive MC particles from event |
1245 | TClonesArray *mcArray = (TClonesArray*)fAODEvent-> | |
1246 | FindListObject(AliAODMCParticle::StdBranchName()); | |
1247 | if(!mcArray){ | |
7099c89a | 1248 | Printf("No MC particle branch found"); |
b7c0438e | 1249 | return kFALSE; |
117f99e3 | 1250 | } |
1251 | ||
b7c0438e | 1252 | Int_t ntracks = mcArray->GetEntriesFast(); |
7099c89a | 1253 | if(fDebug>1)Printf("MC particles: %d", ntracks); |
117f99e3 | 1254 | |
b7c0438e | 1255 | |
1256 | // Track loop: chek how many particles will be accepted | |
7099c89a | 1257 | //Float_t vzMC=0.; |
b9ad6f04 | 1258 | Int_t nChargedPrim=0; |
1259 | Int_t nAllPrim=0; | |
1260 | Int_t nPseudoTracklets=0; | |
b7c0438e | 1261 | for (Int_t it = 0; it < ntracks; it++) { |
1262 | AliAODMCParticle *track = (AliAODMCParticle*)mcArray->At(it); | |
117f99e3 | 1263 | if (!track) { |
8855d81c | 1264 | Error("ReadEventAODMC", "Could not receive particle %d", it); |
117f99e3 | 1265 | continue; |
1266 | } | |
b9ad6f04 | 1267 | |
b18f7dfb | 1268 | if(!SelectParticlePlusCharged( |
7099c89a | 1269 | track->Charge(), |
1270 | track->PdgCode(), | |
1271 | track->IsPhysicalPrimary() | |
1272 | ) | |
b9ad6f04 | 1273 | ) |
1274 | continue; | |
b9ad6f04 | 1275 | |
7099c89a | 1276 | if(TMath::Abs(track->Eta())<fEtaCut && track->Pt()>0.0)++nPseudoTracklets; //0.035 |
1277 | if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue; | |
1278 | ||
b9ad6f04 | 1279 | nAllPrim++; |
1280 | if(track->Charge()!=0) nChargedPrim++; | |
b18f7dfb | 1281 | |
b9ad6f04 | 1282 | } |
1283 | ||
b7c0438e | 1284 | |
b9ad6f04 | 1285 | if(nAllPrim==0) return 0; |
1286 | if(nChargedPrim==0) return 0; | |
117f99e3 | 1287 | |
7099c89a | 1288 | //generate array with size of number of accepted tracks |
1289 | fChargedPi0->Fill(nAllPrim,nChargedPrim); | |
1290 | ||
117f99e3 | 1291 | |
b7c0438e | 1292 | // Track loop: fill arrays for accepted tracks |
7099c89a | 1293 | // Int_t iChargedPrim=0; |
b7c0438e | 1294 | for (Int_t it = 0; it < ntracks; it++) { |
1295 | AliAODMCParticle *track = (AliAODMCParticle*)mcArray->At(it); | |
1296 | if (!track) { | |
8855d81c | 1297 | Error("ReadEventAODMC", "Could not receive particle %d", it); |
b7c0438e | 1298 | continue; |
1299 | } | |
b9ad6f04 | 1300 | |
1301 | if(!SelectParticle( | |
1302 | track->Charge(), | |
1303 | track->PdgCode(), | |
1304 | track->IsPhysicalPrimary() | |
1305 | ) | |
1306 | ) | |
1307 | continue; | |
1308 | ||
7099c89a | 1309 | if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue; |
1310 | ||
b9ad6f04 | 1311 | fHistPtMC->Fill(track->Pt()); |
7099c89a | 1312 | ptArray.push_back(track->Pt()); |
1313 | etaArray.push_back(track->Eta()); | |
1314 | phiArray.push_back(track->Phi()); | |
1315 | chargeArray.push_back(track->Charge()); | |
b7c0438e | 1316 | } |
b9ad6f04 | 1317 | |
7099c89a | 1318 | nTracksTracklets.push_back(nChargedPrim); |
1319 | nTracksTracklets.push_back(nPseudoTracklets); | |
b18f7dfb | 1320 | if(fSelectParticles!=2){ |
7099c89a | 1321 | nTracksTracklets.push_back(nAllPrim); |
b18f7dfb | 1322 | } |
1323 | else{ | |
7099c89a | 1324 | nTracksTracklets.push_back(nAllPrim-nChargedPrim); // only neutral |
b18f7dfb | 1325 | } |
7099c89a | 1326 | |
1327 | ||
b18f7dfb | 1328 | |
7099c89a | 1329 | fVzEvent= vzMC; |
1330 | fNMcPrimAccept = nChargedPrim; | |
1b36e9e2 | 1331 | fNMcPrimAcceptTracklet = nPseudoTracklets; |
bf6ba8a0 | 1332 | |
7099c89a | 1333 | if(step==1){ // step 1 = Trig All Mc Nmc |
1334 | fNmcNch->Fill( fNMcPrimAccept,fNRecAccept); | |
1335 | fPNmcNch->Fill(fNMcPrimAccept,fNRecAccept); | |
1b36e9e2 | 1336 | fNmcNchTracklet->Fill( fNMcPrimAcceptTracklet,fNRecAcceptTracklet); |
1337 | fPNmcNchTracklet->Fill(fNMcPrimAcceptTracklet,fNRecAcceptTracklet); | |
7099c89a | 1338 | } |
bf6ba8a0 | 1339 | if(step==3){ // step 3 = Trig vtx Mc |
1340 | fNmcNchVtx->Fill( fNMcPrimAccept,fNRecAccept); | |
1341 | fPNmcNchVtx->Fill(fNMcPrimAccept,fNRecAccept); | |
1b36e9e2 | 1342 | fNmcNchVtxTracklet->Fill( fNMcPrimAcceptTracklet,fNRecAcceptTracklet); |
1343 | fPNmcNchVtxTracklet->Fill(fNMcPrimAcceptTracklet,fNRecAcceptTracklet); | |
bf6ba8a0 | 1344 | } |
7099c89a | 1345 | return fNRecAccept; // rec value from step 5 or step 2 |
1346 | ||
117f99e3 | 1347 | |
1348 | } | |
1349 | ||
1350 | //________________________________________________________________________ | |
7099c89a | 1351 | void AliAnalysisTaskMinijet::Analyse(const vector<Float_t> &pt, |
1352 | const vector<Float_t> &eta, | |
1353 | const vector<Float_t> &phi, | |
1354 | const vector<Short_t> &charge, | |
1355 | const Int_t ntracksCharged, | |
1356 | const Int_t ntracklets, | |
1357 | const Int_t nAll, | |
1358 | const Int_t step) | |
117f99e3 | 1359 | { |
1360 | ||
1361 | // analyse track properties (comming from either ESDs or AODs) in order to compute | |
1362 | // mini jet activity (chared tracks) as function of charged multiplicity | |
1363 | ||
7099c89a | 1364 | fStep->Fill(step); |
117f99e3 | 1365 | |
b18f7dfb | 1366 | if(fDebug){ |
7099c89a | 1367 | Printf("Analysis Step=%d", step); |
1368 | if(fDebug>2){ | |
1369 | Printf("nAll=%d",nAll); | |
1370 | Printf("nCharged=%d",ntracksCharged); | |
1371 | for (Int_t i = 0; i < nAll; i++) { | |
1372 | Printf("pt[%d]=%f",i,pt[i]); | |
1373 | } | |
1374 | } | |
1375 | } | |
1376 | ||
1377 | //calculation of mean pt for all tracks in case of step==0 | |
1378 | if(step==5 || step ==2){ // rec step | |
1379 | Double_t meanPt=0.; | |
1380 | Double_t leadingPt=0.; | |
1381 | for (Int_t i = 0; i < nAll; i++) { | |
1382 | if(pt[i]<0.01)continue; | |
1383 | meanPt+=pt[i]; | |
1384 | if(leadingPt<pt[i])leadingPt=pt[i]; | |
1385 | } | |
1386 | meanPt=meanPt/nAll; | |
1387 | fMeanPtRec=meanPt; | |
1388 | fLeadingPtRec=leadingPt; | |
b18f7dfb | 1389 | } |
7099c89a | 1390 | |
1391 | Double_t propEvent[4] = {ntracksCharged,fVzEvent,fMeanPtRec, fLeadingPtRec}; //vz: {rec, mc, mc}, meanPt and Nrec is always rec value | |
1392 | fMapEvent[step]->Fill(propEvent); | |
1393 | ||
1394 | fNcharge[step]->Fill(ntracksCharged); | |
117f99e3 | 1395 | |
7099c89a | 1396 | Float_t ptEventAxis=0; // pt event axis |
1397 | Float_t etaEventAxis=0; // eta event axis | |
1398 | Float_t phiEventAxis=0; // phi event axis | |
1399 | Short_t chargeEventAxis=0; // charge event axis | |
117f99e3 | 1400 | |
1401 | Float_t ptOthers = 0; // pt others // for all other tracks around event axis -> see loop | |
1402 | Float_t etaOthers = 0; // eta others | |
1403 | Float_t phiOthers = 0; // phi others | |
7099c89a | 1404 | Short_t chargeOthers = 0; // charge others |
b18f7dfb | 1405 | |
a640cfb3 | 1406 | Int_t *pindexInnerEta = new Int_t [nAll+1]; |
1407 | Float_t *ptInnerEta = new Float_t[nAll+1]; | |
b18f7dfb | 1408 | |
7099c89a | 1409 | |
1410 | ||
b9ad6f04 | 1411 | for (Int_t i = 0; i < nAll; i++) { |
7099c89a | 1412 | |
1413 | if(pt[i]<0.01)continue; | |
1414 | ||
1415 | //fill single particle correction for first step of pair correction | |
1416 | Double_t propAll[3] = {eta[i],pt[i],ntracksCharged }; | |
1417 | fMapAll[step]->Fill(propAll); | |
1418 | ||
1419 | ||
117f99e3 | 1420 | //filling of simple check plots |
7099c89a | 1421 | if(pt[i]<0.7) continue; |
1422 | fPt[step] -> Fill( pt[i]); | |
1423 | fEta[step] -> Fill(eta[i]); | |
1424 | fPhi[step] -> Fill(phi[i]); | |
1425 | fPhiEta[step]-> Fill(phi[i], eta[i]); | |
9ed461df | 1426 | |
b9ad6f04 | 1427 | pindexInnerEta[i]=0; //set all values to zero |
1428 | //fill new array for eta check | |
1429 | ptInnerEta[i]= pt[i]; | |
1430 | ||
117f99e3 | 1431 | } |
7099c89a | 1432 | |
1433 | ||
b18f7dfb | 1434 | |
117f99e3 | 1435 | // define event axis: leading or random track (with pt>fTriggerPtCut) |
1436 | // --------------------------------------- | |
1437 | Int_t highPtTracks=0; | |
b9ad6f04 | 1438 | Int_t highPtTracksInnerEta=0; |
7099c89a | 1439 | // Double_t highPtTracksInnerEtaCorr=0; |
9ed461df | 1440 | Int_t mult09=0; |
b9ad6f04 | 1441 | |
1442 | //count high pt tracks and high pt tracks in acceptance for seeds | |
1443 | for(Int_t i=0;i<nAll;i++){ | |
1444 | ||
7099c89a | 1445 | if(pt[i]<0.01)continue; |
1446 | ||
9ed461df | 1447 | if(TMath::Abs(eta[i])<0.9){ |
1448 | mult09++; | |
1449 | } | |
1450 | ||
b9ad6f04 | 1451 | if(pt[i]>fTriggerPtCut) { |
1452 | highPtTracks++; | |
1453 | } | |
1454 | ||
1455 | // seed should be place in middle of acceptance, that complete cone is in acceptance | |
9ed461df | 1456 | if(pt[i]>fTriggerPtCut && TMath::Abs(eta[i])<fEtaCutSeed && charge[i]!=0){ |
b9ad6f04 | 1457 | |
1458 | // Printf("eta=%f", eta[i]); | |
1459 | highPtTracksInnerEta++; | |
7099c89a | 1460 | |
b9ad6f04 | 1461 | } |
1462 | else{ | |
1463 | ptInnerEta[i]=0; | |
1464 | } | |
117f99e3 | 1465 | } |
1466 | ||
b9ad6f04 | 1467 | |
1468 | //sort array in order to get highest pt tracks first | |
1469 | //index can be computed with pindexInnerEta[number] | |
1470 | if(nAll) TMath::Sort(nAll, ptInnerEta, pindexInnerEta, kTRUE); | |
1471 | ||
7099c89a | 1472 | // plot of multiplicity distributions |
1473 | fNch07Nch[step]->Fill(ntracksCharged, highPtTracksInnerEta); | |
1474 | fPNch07Nch[step]->Fill(ntracksCharged, highPtTracksInnerEta); | |
1475 | ||
117f99e3 | 1476 | if(ntracklets){ |
7099c89a | 1477 | fNch07Tracklet[step]->Fill(ntracklets, highPtTracksInnerEta);//only counts tracks which can be used as seeds |
1478 | fNchTracklet[step]->Fill(ntracklets, ntracksCharged); | |
1479 | fPNch07Tracklet[step]->Fill(ntracklets, highPtTracksInnerEta);//only counts tracks which can be used as seeds | |
117f99e3 | 1480 | } |
1481 | ||
1482 | //analysis can only be performed with event axis, defined by high pt track | |
7099c89a | 1483 | |
b9ad6f04 | 1484 | |
1485 | if(highPtTracks>0 && highPtTracksInnerEta>0){ | |
1486 | ||
7099c89a | 1487 | // build pairs in two track loops |
9ed461df | 1488 | // loop over all possible trigger particles (defined by pt_trig and eta_acceptance) |
7099c89a | 1489 | for(Int_t axis=0;(axis<nAll) && (pt[pindexInnerEta[axis]]>=fTriggerPtCut); axis++){ |
1490 | ||
117f99e3 | 1491 | //EventAxisRandom track properties |
b9ad6f04 | 1492 | ptEventAxis = pt [pindexInnerEta[axis]]; |
1493 | etaEventAxis = eta[pindexInnerEta[axis]]; | |
1494 | phiEventAxis = phi[pindexInnerEta[axis]]; | |
7099c89a | 1495 | chargeEventAxis = charge[pindexInnerEta[axis]]; |
1496 | fPtSeed[step] -> Fill( ptEventAxis); | |
1497 | fEtaSeed[step] -> Fill(etaEventAxis); | |
1498 | fPhiSeed[step] -> Fill(phiEventAxis); | |
117f99e3 | 1499 | |
117f99e3 | 1500 | |
7099c89a | 1501 | Double_t prop[3] = {etaEventAxis,ptEventAxis,ntracksCharged }; |
1502 | fMapSingleTrig[step]->Fill(prop); | |
9ed461df | 1503 | |
7099c89a | 1504 | //associated tracks |
1505 | for (Int_t iTrack = axis+1; iTrack < nAll; iTrack++) { | |
117f99e3 | 1506 | |
7099c89a | 1507 | if(pt[pindexInnerEta[iTrack]]<fAssociatePtCut) continue; |
9ed461df | 1508 | |
7099c89a | 1509 | if(fSelectParticlesAssoc==1){ |
1510 | if(charge[pindexInnerEta[iTrack]]==0)continue; | |
1511 | } | |
1512 | if(fSelectParticlesAssoc==2){ | |
1513 | if(charge[pindexInnerEta[iTrack]]!=0)continue; | |
1514 | } | |
9ed461df | 1515 | |
9ed461df | 1516 | |
7099c89a | 1517 | ptOthers = pt [pindexInnerEta[iTrack]]; |
1518 | etaOthers = eta[pindexInnerEta[iTrack]]; | |
1519 | phiOthers = phi[pindexInnerEta[iTrack]]; | |
1520 | chargeOthers = charge[pindexInnerEta[iTrack]]; | |
1521 | ||
1522 | ||
1523 | //plot only properties of tracks with pt>ptassoc | |
1524 | fPtOthers[step] -> Fill( ptOthers); | |
1525 | fEtaOthers[step] -> Fill(etaOthers); | |
1526 | fPhiOthers[step] -> Fill(phiOthers); | |
1527 | fPtEtaOthers[step] -> Fill(ptOthers, etaOthers); | |
117f99e3 | 1528 | |
7099c89a | 1529 | // if(fDebug>2)Printf("%f, %f", pt[pindexInnerEta[axis]], pt[pindexInnerEta[iTrack]]); |
9ed461df | 1530 | |
7099c89a | 1531 | Float_t dPhi = phiOthers-phiEventAxis; |
1532 | if(dPhi>1.5*TMath::Pi()) dPhi = dPhi-2*TMath::Pi(); | |
1533 | else if(dPhi<-0.5*TMath::Pi())dPhi=dPhi+2*TMath::Pi(); | |
1534 | Float_t dEta=etaOthers-etaEventAxis; | |
9ed461df | 1535 | |
1536 | ||
7099c89a | 1537 | fDPhiDEtaEventAxis[step]->Fill(dPhi, dEta); |
1538 | fDPhiEventAxis[step]->Fill(dPhi); | |
1539 | ||
1540 | //check outliers | |
1541 | if(ptEventAxis< 0.4 || ptEventAxis > 100) Printf("particles out of range pt"); | |
1542 | if(ntracksCharged<0 || ntracksCharged>150) Printf("particles out of range ncharge"); | |
1543 | if(TMath::Abs(dEta)>2*fEtaCut) { | |
1544 | Printf("particles out of range dEta"); | |
1545 | Printf("eta1=%f, eta2=%f", etaOthers, etaEventAxis); | |
1546 | Printf("step=%d",step); | |
1547 | } | |
1548 | if(dPhi<-0.5*TMath::Pi() || dPhi>1.5*TMath::Pi()){ | |
1549 | Printf("particles out of range dPhi"); | |
1550 | Printf("phi1=%f, phi2=%f", phiOthers, phiEventAxis); | |
1551 | } | |
1552 | ||
1553 | Bool_t isLikeSign = CheckLikeSign(chargeEventAxis, chargeOthers); | |
1554 | ||
1555 | Double_t prop6[6] = {ptEventAxis,ptOthers,dEta,dPhi,ntracksCharged, isLikeSign }; | |
1556 | fMapPair[step]->Fill(prop6); | |
1557 | ||
1558 | }// end of inner track loop | |
1559 | ||
1560 | } //end of outer track loop | |
1561 | ||
1562 | fTriggerNch[step]->Fill(ntracksCharged,highPtTracksInnerEta); | |
1563 | fTriggerNchSeeds[step]->Fill(ntracksCharged,highPtTracksInnerEta); | |
1564 | fTriggerTracklet[step]->Fill(ntracklets); | |
117f99e3 | 1565 | |
9ed461df | 1566 | |
117f99e3 | 1567 | }//if there is at least one high pt track |
1568 | ||
b9ad6f04 | 1569 | |
1570 | if(pindexInnerEta){// clean up array memory used for TMath::Sort | |
1571 | delete[] pindexInnerEta; | |
1572 | pindexInnerEta=0; | |
117f99e3 | 1573 | } |
1574 | ||
b9ad6f04 | 1575 | if(ptInnerEta){// clean up array memory used for TMath::Sort |
1576 | delete[] ptInnerEta; | |
1577 | ptInnerEta=0; | |
1578 | } | |
117f99e3 | 1579 | |
1580 | } | |
1581 | ||
7099c89a | 1582 | |
1583 | ||
117f99e3 | 1584 | //________________________________________________________________________ |
1585 | void AliAnalysisTaskMinijet::Terminate(Option_t*) | |
1586 | { | |
1587 | //terminate function is called at the end | |
1588 | //can be used to draw histograms etc. | |
1589 | ||
7099c89a | 1590 | |
117f99e3 | 1591 | } |
1592 | ||
1593 | //________________________________________________________________________ | |
a640cfb3 | 1594 | Bool_t AliAnalysisTaskMinijet::SelectParticlePlusCharged(const Short_t charge, const Int_t pdg, Bool_t prim) |
b9ad6f04 | 1595 | { |
1596 | //selection of mc particle | |
1597 | //fSelectParticles=0: use charged primaries and pi0 and k0 | |
1598 | //fSelectParticles=1: use only charged primaries | |
1599 | //fSelectParticles=2: use only pi0 and k0 | |
1600 | ||
1601 | if(fSelectParticles==0 || fSelectParticles==2){ // in case of 2: need to count also charged particles | |
1602 | if(charge==0){ | |
1603 | if(!(pdg==111||pdg==130||pdg==310)) | |
1604 | return false; | |
1605 | } | |
1606 | else{// charge !=0 | |
1607 | if(!prim) | |
1608 | return false; | |
1609 | } | |
1610 | } | |
1611 | ||
1612 | else if(fSelectParticles==1){ | |
1613 | if (charge==0 || !prim){ | |
1614 | return false; | |
1615 | } | |
1616 | } | |
1617 | ||
1618 | else{ | |
1619 | Printf("Error: wrong selection of charged/pi0/k0"); | |
1620 | return 0; | |
1621 | } | |
1622 | ||
1623 | return true; | |
1624 | ||
1625 | } | |
1626 | ||
1627 | //________________________________________________________________________ | |
a640cfb3 | 1628 | Bool_t AliAnalysisTaskMinijet::SelectParticle(const Short_t charge, const Int_t pdg, const Bool_t prim) |
b9ad6f04 | 1629 | { |
1630 | //selection of mc particle | |
1631 | //fSelectParticles=0: use charged primaries and pi0 and k0 | |
1632 | //fSelectParticles=1: use only charged primaries | |
1633 | //fSelectParticles=2: use only pi0 and k0 | |
1634 | ||
1635 | if(fSelectParticles==0){ | |
1636 | if(charge==0){ | |
1637 | if(!(pdg==111||pdg==130||pdg==310)) | |
1638 | return false; | |
1639 | } | |
1640 | else{// charge !=0 | |
1641 | if(!prim) | |
1642 | return false; | |
1643 | } | |
7099c89a | 1644 | } |
b9ad6f04 | 1645 | else if (fSelectParticles==1){ |
1646 | if (charge==0 || !prim){ | |
1647 | return false; | |
1648 | } | |
1649 | } | |
1650 | else if(fSelectParticles==2){ | |
1651 | if(!(pdg==111||pdg==130||pdg==310)) | |
1652 | return false; | |
1653 | } | |
1654 | ||
1655 | return true; | |
1656 | ||
1657 | } | |
1658 | ||
1659 | //________________________________________________________________________ | |
a640cfb3 | 1660 | Bool_t AliAnalysisTaskMinijet::CheckEvent(const Bool_t recVertex) |
117f99e3 | 1661 | { |
7099c89a | 1662 | // This function tests the quality of an event (ESD/AOD) (rec and/or mc part) |
1663 | // recVertex=false: check if Mc events and stack is there, Nmc>0 | |
1664 | // recVertex=false: " + check if there is a good, reconstructed SPD vertex | |
1665 | // defined by |z|<fVertexCut(10cm), Contributer>0, no PileUpFromSPD(3,0,8) | |
1666 | ||
7099c89a | 1667 | if(fMode==0){//esd |
1668 | ||
1669 | //mc | |
1670 | if(fUseMC){ | |
1671 | ||
1672 | //mc event | |
1673 | AliMCEvent *mcEvente = (AliMCEvent*) MCEvent(); | |
1674 | if (!mcEvente) { | |
1675 | Error("CheckEvent", "Could not retrieve MC event"); | |
1676 | return false; | |
1677 | } | |
1678 | ||
1679 | //stack | |
1680 | AliStack* stackg = MCEvent()->Stack(); | |
1681 | if(!stackg) return false; | |
1682 | Int_t ntracksg = mcEvente->GetNumberOfTracks(); | |
1683 | if(ntracksg<0) return false; | |
1684 | ||
1685 | //vertex | |
9cccc98a | 1686 | AliGenEventHeader* headerg = MCEvent()->GenEventHeader(); |
1687 | TArrayF mcVg; | |
1688 | headerg->PrimaryVertex(mcVg); | |
1689 | //if(TMath::Abs(mcVg[0])<1e-8 && TMath::Abs(mcVg[0])<1e-8 && | |
1690 | // TMath::Abs(mcVg[0])<1e-8) return false; | |
1691 | Float_t vzMCg = mcVg[2]; | |
1692 | if(TMath::Abs(vzMCg)>fVertexZCut) return false; | |
1693 | //hasVtxMc=true; | |
7099c89a | 1694 | } |
1695 | ||
1696 | //rec | |
1697 | if(recVertex==true){ | |
1698 | if(fESDEvent->IsPileupFromSPD(3,0,8))return false; | |
1699 | ||
1700 | //rec vertex | |
9cccc98a | 1701 | const AliESDVertex* vertexESDg = fESDEvent->GetPrimaryVertex(); // uses track or SPD vertexer |
1702 | if(!vertexESDg) return false; | |
ac305649 | 1703 | fVertexCheck->Fill(vertexESDg->GetNContributors()); |
9cccc98a | 1704 | if(vertexESDg->GetNContributors()<=0)return false; |
1705 | Float_t fVzg= vertexESDg->GetZ(); | |
1706 | if(TMath::Abs(fVzg)>fVertexZCut) return false; | |
7099c89a | 1707 | |
1708 | //rec spd vertex | |
1709 | const AliESDVertex *vtxSPD = fESDEvent->GetPrimaryVertexSPD(); | |
1710 | if(!vtxSPD) return false; | |
1711 | if(vtxSPD->GetNContributors()<=0)return false; | |
1712 | Float_t fVzSPD= vtxSPD->GetZ(); | |
1713 | if(TMath::Abs(fVzSPD)>fVertexZCut) return false; | |
ac305649 | 1714 | |
7099c89a | 1715 | } |
1716 | return true; | |
117f99e3 | 1717 | } |
7099c89a | 1718 | |
1719 | ||
1720 | else if(fMode==1){ //aod | |
1721 | ||
1722 | if(fUseMC){ | |
9cccc98a | 1723 | |
7099c89a | 1724 | //retreive MC particles from event |
1725 | TClonesArray *mcArray = (TClonesArray*)fAODEvent-> | |
1726 | FindListObject(AliAODMCParticle::StdBranchName()); | |
1727 | if(!mcArray){ | |
1728 | Printf("No MC particle branch found"); | |
1729 | return false; | |
1730 | } | |
9cccc98a | 1731 | |
1732 | //mc | |
1733 | AliAODMCHeader *aodMCheader = (AliAODMCHeader *) fAODEvent-> | |
1734 | FindListObject(AliAODMCHeader::StdBranchName()); | |
1735 | Float_t vzMC = aodMCheader->GetVtxZ(); | |
1736 | if(TMath::Abs(vzMC)>fVertexZCut) return false; | |
1737 | ||
1738 | //hasVtxMc=true; | |
7099c89a | 1739 | } |
1740 | ||
1741 | //rec | |
1742 | if(recVertex==true){ | |
9cccc98a | 1743 | if(fAODEvent->IsPileupFromSPD(3,0.8)) return false; |
1744 | ||
1745 | AliAODVertex* vertex= (AliAODVertex*)fAODEvent->GetPrimaryVertex(); | |
1746 | if(!vertex) return false; | |
a031a5ca | 1747 | TString vtxTitle(vertex->GetTitle());// only allow vertex from tracks, no vertexer z |
1748 | if (!(vtxTitle.Contains("VertexerTracksWithConstraint"))) return false; | |
ac305649 | 1749 | fVertexCheck->Fill(vertex->GetNContributors()); |
9cccc98a | 1750 | if(vertex->GetNContributors()<=0) return false; |
1751 | Double_t vzAOD=vertex->GetZ(); | |
ac305649 | 1752 | // if(TMath::Abs(vzAOD)<1e-9) return false; |
9cccc98a | 1753 | if(TMath::Abs(vzAOD)>fVertexZCut) return false; |
7099c89a | 1754 | |
1755 | AliAODVertex* vertexSPD= (AliAODVertex*)fAODEvent->GetPrimaryVertexSPD(); | |
1756 | if(!vertexSPD) return false; | |
1757 | if(vertexSPD->GetNContributors()<=0) return false; | |
1758 | Double_t vzSPD=vertexSPD->GetZ(); | |
1759 | //if(TMath::Abs(vzSPD)<1e-9) return false; | |
1760 | if(TMath::Abs(vzSPD)>fVertexZCut) return false; | |
a031a5ca | 1761 | |
1762 | //control histograms================= | |
1763 | //tracklet loop | |
1764 | Int_t ntrackletsAccept=0; | |
1765 | AliAODTracklets * mult= (AliAODTracklets*)fAODEvent->GetTracklets(); | |
1766 | for(Int_t i=0;i<mult->GetNumberOfTracklets();++i){ | |
1767 | if(TMath::Abs(mult->GetDeltaPhi(i))<0.05 && | |
1768 | TMath::Abs(TMath::Log(TMath::Tan(0.5 * mult->GetTheta(i))))<fEtaCut) ++ntrackletsAccept; | |
1769 | } | |
1770 | Int_t nAcceptedTracks=0; | |
1771 | for (Int_t iTracks = 0; iTracks < fAODEvent->GetNumberOfTracks(); iTracks++) { | |
1772 | AliAODTrack *track = (AliAODTrack *)fAODEvent->GetTrack(iTracks); | |
1773 | if (!track) continue; | |
1774 | if(track->TestFilterBit(fFilterBit) && TMath::Abs(track->Eta())<fEtaCut | |
1775 | && track->Pt()>fPtMin && track->Pt()<fPtMax) nAcceptedTracks++; | |
1776 | } | |
1777 | fNContrNtracklets->Fill(ntrackletsAccept,vertexSPD->GetNContributors()); | |
1778 | fNContrNtracks->Fill(nAcceptedTracks,vertexSPD->GetNContributors()); | |
1779 | //==================================== | |
7099c89a | 1780 | } |
1781 | return true; | |
1782 | ||
117f99e3 | 1783 | } |
7099c89a | 1784 | |
1785 | else { | |
1786 | Printf("Wrong mode!"); | |
1787 | return false; | |
9ed461df | 1788 | } |
7099c89a | 1789 | |
1790 | } | |
1791 | ||
1792 | //_____________________________________________________________________________ | |
1793 | const Double_t * AliAnalysisTaskMinijet::CreateLogAxis(const Int_t nbins, | |
1794 | const Double_t xmin, | |
1795 | const Double_t xmax) | |
1796 | { | |
1797 | // returns pointer to an array with can be used to build a logarithmic axis | |
1798 | // it is user responsibility to delete the array | |
1799 | ||
1800 | Double_t logxmin = TMath::Log10(xmin); | |
1801 | Double_t logxmax = TMath::Log10(xmax); | |
1802 | Double_t binwidth = (logxmax-logxmin)/nbins; | |
1803 | ||
1804 | Double_t *xbins = new Double_t[nbins+1]; | |
1805 | ||
1806 | xbins[0] = xmin; | |
1807 | for (Int_t i=1;i<=nbins;i++) { | |
1808 | xbins[i] = xmin + TMath::Power(10,logxmin+i*binwidth); | |
117f99e3 | 1809 | } |
1810 | ||
7099c89a | 1811 | return xbins; |
117f99e3 | 1812 | } |
b9ad6f04 | 1813 | |
7099c89a | 1814 | //_____________________________________________________________________________ |
a640cfb3 | 1815 | Bool_t AliAnalysisTaskMinijet::CheckLikeSign(const Short_t chargeEventAxis, |
1816 | const Short_t chargeOthers) | |
7099c89a | 1817 | { |
1818 | // compute if charge of two particles/tracks has same sign or different sign | |
1819 | ||
1820 | if(fDebug>2) Printf("Charge1=%d, Charge2=%d",chargeEventAxis,chargeOthers); | |
1821 | ||
1822 | if(chargeEventAxis<0){ | |
1823 | if(chargeOthers<0){ | |
1824 | return true; | |
1825 | } | |
1826 | else if(chargeOthers>0){ | |
1827 | return false; | |
1828 | } | |
1829 | } | |
1830 | ||
1831 | else if(chargeEventAxis>0){ | |
1832 | if(chargeOthers>0){ | |
1833 | return true; | |
1834 | } | |
1835 | else if(chargeOthers<0){ | |
1836 | return false; | |
1837 | } | |
1838 | } | |
1839 | ||
1840 | else{ | |
1841 | Printf("Error: Charge not lower nor higher as zero"); | |
1842 | return false; | |
1843 | } | |
1844 | ||
1845 | Printf("Error: Check values of Charge"); | |
1846 | return false; | |
1847 | } | |
1848 |