12 #include "AliVEvent.h"
13 #include "AliVParticle.h"
15 #include "AliESDEvent.h"
16 #include "AliESDtrack.h"
17 #include "AliMultiplicity.h"
18 #include "AliESDtrackCuts.h"
20 #include "AliAODEvent.h"
21 #include "AliAODTrack.h"
22 #include "AliAODMCParticle.h"
23 #include "AliAODMCHeader.h"
26 #include "AliMCEvent.h"
27 #include "AliMCParticle.h"
28 #include "AliGenEventHeader.h"
30 #include "AliAnalysisManager.h"
31 #include "AliInputEventHandler.h"
38 #include "AliAnalysisTaskMinijet.h"
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
48 ClassImp(AliAnalysisTaskMinijet)
50 //________________________________________________________________________
51 AliAnalysisTaskMinijet::AliAnalysisTaskMinijet(const char *name)
52 : AliAnalysisTaskSE(name),
56 fAnalysePrimOnly(kFALSE),// not used
67 fSelectParticlesAssoc(1),
86 for(Int_t i = 0;i< 6;i++){
87 fMapSingleTrig[i] = 0;
112 fDPhiDEtaEventAxis[i] = 0;
113 fDPhiDEtaEventAxisSeeds[i]= 0;
116 fTriggerNchSeeds[i] = 0;
117 fTriggerTracklet[i] = 0;
122 fNch07Tracklet[i] = 0;
124 fPNch07Tracklet[i] = 0;
125 fDPhiEventAxis[i] = 0;
127 DefineOutput(1, TList::Class());
130 //________________________________________________________________________
131 AliAnalysisTaskMinijet::~AliAnalysisTaskMinijet()
135 if (fHists && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fHists;
138 //________________________________________________________________________
139 void AliAnalysisTaskMinijet::UserCreateOutputObjects()
143 if(fDebug) Printf("In User Create Output Objects.");
145 fStep = new TH1F("fStep", "fStep", 10, -0.5, 9.5);
146 fHistPt = new TH1F("fHistPt", "P_{T} distribution REC", 150, 0.1, 3.1);
147 fHistPt->GetXaxis()->SetTitle("P_{T} (GeV/c)");
148 fHistPt->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
149 fHistPt->SetMarkerStyle(kFullCircle);
152 fHistPtMC = new TH1F("fHistPtMC", "P_{T} distribution MC", 150, 0.1, 3.1);
153 fHistPtMC->GetXaxis()->SetTitle("P_{T} (GeV/c)");
154 fHistPtMC->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
155 fHistPtMC->SetMarkerStyle(kFullCircle);
157 fNmcNch = new TH2F("fNmcNch", "fNmcNch", 100,-0.5,99.5,100,-0.5,99.5);
158 fPNmcNch = new TProfile("pNmcNch", "pNmcNch", 100,-0.5,99.5);
162 fChargedPi0 = new TH2F("fChargedPi0", "fChargedPi0", 200, -0.5, 199.5, 200, -0.5, 199.5);
165 //----------------------
166 //bins for pt in THnSpare
167 Double_t ptMin = 0.0, ptMax = 100.;
169 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,
170 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,
171 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};
173 // Int_t nPtBins = 100;
174 // Double_t ptMin = 1.e-2, ptMax = 100.;
175 // Double_t *binsPt = 0;
176 // binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);
179 Double_t ptMin2 = 0.0, ptMax2 = 100.;
181 Double_t binsPt2[] = {0.1, 0.4, 0.7, 1.0, 2.0, 3.0, 4.0, 5.0, 10.0, 100.0};
183 // Int_t nPtBins2 = 10;
184 // Double_t ptMin2 = 0.4, ptMax2 = 100.;
185 // Double_t *binsPt2 = 0;
186 // binsPt2 = CreateLogAxis(nPtBins2,ptMin2,ptMax2);
189 Int_t binsEffHisto[3] = {Int_t(fEtaCut*20), nPtBins, 150 };
190 Double_t minEffHisto[3] = {-fEtaCut, ptMin, -0.5 };
191 Double_t maxEffHisto[3] = {fEtaCut, ptMax, 149.5 };
194 Int_t binsEffHisto5[6] = { nPtBins2, nPtBins2, Int_t(fEtaCut*10), 180, 150 , 2 };
195 Double_t minEffHisto5[6] = { ptMin2, ptMin2, -2*fEtaCut, -0.5*TMath::Pi(), -0.5 , -0.5 };
196 Double_t maxEffHisto5[6] = { ptMax2, ptMax2, 2*fEtaCut, 1.5*TMath::Pi(), 149.5 , 1.5 };
200 Int_t binsEvent[4] = { 150, 20, 50, nPtBins };
201 Double_t minEvent[4] = { -0.5, -10, 0, ptMin };
202 Double_t maxEvent[4] = { 149.5, 10, 10, ptMax };
205 Int_t binsAll[3] = {Int_t(fEtaCut*20), nPtBins2, 150 };
206 Double_t minAll[3] = {-fEtaCut, ptMin2, -0.5 };
207 Double_t maxAll[3] = {fEtaCut, ptMax2, 149.5 };
209 //--------------------
210 TString dataType[2] ={"ESD", "AOD"};
211 TString labels[6]={Form("%sAllAllMcNmc",dataType[fMode].Data()),
212 Form("%sTrigAllMcNmc",dataType[fMode].Data()),
213 Form("%sTrigAllMcNrec",dataType[fMode].Data()),
214 Form("%sTrigVtxMcNrec",dataType[fMode].Data()),
215 Form("%sTrigVtxRecMcPropNrec",dataType[fMode].Data()),
216 Form("%sTrigVtxRecNrec",dataType[fMode].Data())};
219 for(Int_t i=0;i<6;i++){
221 fMapSingleTrig[i] = new THnSparseD(Form("fMapSingleTrig%s", labels[i].Data()),"eta:pt:Nrec",
222 3,binsEffHisto,minEffHisto,maxEffHisto);
223 fMapSingleTrig[i]->SetBinEdges(1,binsPt);
224 fMapSingleTrig[i]->GetAxis(0)->SetTitle("#eta");
225 fMapSingleTrig[i]->GetAxis(1)->SetTitle("p_{T} (GeV/c)");
226 fMapSingleTrig[i]->GetAxis(2)->SetTitle("N_{rec}");
227 fMapSingleTrig[i]->Sumw2();
229 fMapPair[i] = new THnSparseD(Form("fMapPair%s", labels[i].Data()),"pt_trig:pt_assoc:DeltaEta:DeltaPhi:Nrec:likesign",
230 6,binsEffHisto5,minEffHisto5,maxEffHisto5);
231 fMapPair[i]->SetBinEdges(0,binsPt2);
232 fMapPair[i]->SetBinEdges(1,binsPt2);
233 fMapPair[i]->GetAxis(0)->SetTitle("p_{T, trig} (GeV/c)");
234 fMapPair[i]->GetAxis(1)->SetTitle("p_{T, assoc} (GeV/c)");
235 fMapPair[i]->GetAxis(2)->SetTitle("#Delta #eta");
236 fMapPair[i]->GetAxis(3)->SetTitle("#Delta #phi");
237 fMapPair[i]->GetAxis(4)->SetTitle("N_{rec}");
238 fMapPair[i]->GetAxis(5)->SetTitle("Like-sign or Unlike-sign");
239 fMapPair[i]->Sumw2();
242 fMapEvent[i] = new THnSparseD(Form("fMapEvent%s", labels[i].Data()),"Nrec:vertexZ:meanPt:leadingPt",
243 4,binsEvent,minEvent,maxEvent);
244 fMapEvent[i]->GetAxis(0)->SetTitle("N_{rec}");
245 fMapEvent[i]->GetAxis(1)->SetTitle("z_{vertex} (cm)");
246 fMapEvent[i]->GetAxis(2)->SetTitle("meanPt");
247 fMapEvent[i]->SetBinEdges(3,binsPt);
248 fMapEvent[i]->GetAxis(3)->SetTitle("leadingPt");
249 fMapEvent[i]->Sumw2();
251 fMapAll[i] = new THnSparseD(Form("fMapAll%s", labels[i].Data()),"eta:pt:Nrec",
252 3,binsAll,minAll,maxAll);
253 fMapAll[i]->SetBinEdges(1,binsPt2);
254 fMapAll[i]->GetAxis(0)->SetTitle("#eta");
255 fMapAll[i]->GetAxis(1)->SetTitle("p_{T} (GeV/c)");
256 fMapAll[i]->GetAxis(2)->SetTitle("N_{rec}");
260 fVertexZ[i] = new TH1F(Form("fVertexZ%s",labels[i].Data()),
261 Form("fVertexZ%s",labels[i].Data()) ,
263 fPt[i] = new TH1F(Form("fPt%s",labels[i].Data()),
264 Form("fPt%s",labels[i].Data()) ,
266 fNcharge[i] = new TH1F(Form("fNcharge%s",labels[i].Data()),
267 Form("fNcharge%s",labels[i].Data()) ,
269 fEta[i] = new TH1F (Form("fEta%s",labels[i].Data()),
270 Form("fEta%s",labels[i].Data()) ,
272 fPhi[i] = new TH1F(Form("fPhi%s",labels[i].Data()),
273 Form("fPhi%s",labels[i].Data()) ,
274 360, 0.,2*TMath::Pi());
275 fDcaXY[i] = new TH1F(Form("fDcaXY%s",labels[i].Data()),
276 Form("fDcaXY%s",labels[i].Data()) ,
278 fDcaZ[i] = new TH1F(Form("fDcaZ%s",labels[i].Data()),
279 Form("fDcaZ%s",labels[i].Data()) ,
281 fPtSeed[i] = new TH1F(Form("fPSeedt%s",labels[i].Data()),
282 Form("fPtSeed%s",labels[i].Data()) ,
284 fEtaSeed[i] = new TH1F (Form("fEtaSeed%s",labels[i].Data()),
285 Form("fEtaSeed%s",labels[i].Data()) ,
287 fPhiSeed[i] = new TH1F(Form("fPhiSeed%s",labels[i].Data()),
288 Form("fPhiSeed%s",labels[i].Data()) ,
289 360, 0.,2*TMath::Pi());
291 fPtOthers[i] = new TH1F(Form("fPOtherst%s",labels[i].Data()),
292 Form("fPtOthers%s",labels[i].Data()) ,
294 fEtaOthers[i] = new TH1F (Form("fEtaOthers%s",labels[i].Data()),
295 Form("fEtaOthers%s",labels[i].Data()) ,
297 fPhiOthers[i] = new TH1F(Form("fPhiOthers%s",labels[i].Data()),
298 Form("fPhiOthers%s",labels[i].Data()) ,
299 360, 0.,2*TMath::Pi());
300 fPtEtaOthers[i] = new TH2F(Form("fPtEtaOthers%s",labels[i].Data()),
301 Form("fPtEtaOthers%s",labels[i].Data()) ,
302 500, 0., 50, 100, -1., 1);
303 fPhiEta[i] = new TH2F(Form("fPhiEta%s",labels[i].Data()),
304 Form("fPhiEta%s",labels[i].Data()) ,
305 180, 0., 2*TMath::Pi(), 100, -1.,1.);
306 fDPhiDEtaEventAxis[i] = new TH2F(Form("fDPhiDEtaEventAxis%s",labels[i].Data()),
307 Form("fDPhiDEtaEventAxis%s",labels[i].Data()) ,
308 180, -0.5* TMath::Pi(), 1.5*TMath::Pi(), 9, -1.8,1.8);
309 fTriggerNch[i] = new TH1F(Form("fTriggerNch%s",labels[i].Data()),
310 Form("fTriggerNch%s",labels[i].Data()) ,
312 fTriggerNchSeeds[i] = new TH2F(Form("fTriggerNchSeeds%s",labels[i].Data()),
313 Form("fTriggerNchSeeds%s",labels[i].Data()) ,
314 250, -0.5, 249.5, 100, -0.5, 99.5);
315 fTriggerTracklet[i] = new TH1F(Form("fTriggerTracklet%s",labels[i].Data()),
316 Form("fTriggerTracklet%s",labels[i].Data()) ,
318 fNch07Nch[i] = new TH2F(Form("fNch07Nch%s",labels[i].Data()),
319 Form("fNch07Nch%s",labels[i].Data()) ,
320 250, -2.5, 247.5,250, -2.5, 247.5);
321 fPNch07Nch[i] = new TProfile(Form("pNch07Nch%s",labels[i].Data()),
322 Form("pNch07Nch%s",labels[i].Data()) ,
324 fNch07Tracklet[i] = new TH2F(Form("fNch07Tracklet%s",labels[i].Data()),
325 Form("fNch07Tracklet%s",labels[i].Data()) ,
326 250, -2.5, 247.5,250, -2.5, 247.5);
327 fNchTracklet[i] = new TH2F(Form("fNchTracklet%s",labels[i].Data()),
328 Form("fNchTracklet%s",labels[i].Data()) ,
329 250, -2.5, 247.5,250, -2.5, 247.5);
330 fPNch07Tracklet[i] = new TProfile(Form("pNch07Tracklet%s",labels[i].Data()),
331 Form("pNch07Tracklet%s",labels[i].Data()) ,
333 fDPhiEventAxis[i] = new TH1F(Form("fDPhiEventAxis%s",
335 Form("fDPhiEventAxis%s",
337 180, -0.5*TMath::Pi(), 1.5*TMath::Pi());
341 fHists = new TList();
345 fHists->Add(fHistPt);
348 fHists->Add(fHistPtMC);
349 fHists->Add(fNmcNch);
350 fHists->Add(fPNmcNch);
352 fHists->Add(fChargedPi0);
354 for(Int_t i=0;i<6;i++){
355 fHists->Add(fMapSingleTrig[i]);
356 fHists->Add(fMapPair[i]);
357 fHists->Add(fMapEvent[i]);
358 fHists->Add(fMapAll[i]);
359 fHists->Add(fVertexZ[i]);
361 fHists->Add(fNcharge[i]);
362 fHists->Add(fEta[i]);
363 fHists->Add(fPhi[i]);
364 fHists->Add(fDcaXY[i]);
365 fHists->Add(fDcaZ[i]);
366 fHists->Add(fPtSeed[i]);
367 fHists->Add(fEtaSeed[i]);
368 fHists->Add(fPhiSeed[i]);
369 fHists->Add(fPtOthers[i]);
370 fHists->Add(fEtaOthers[i]);
371 fHists->Add(fPhiOthers[i]);
372 fHists->Add(fPtEtaOthers[i]);
373 fHists->Add(fPhiEta[i]);
374 fHists->Add(fDPhiDEtaEventAxis[i]);
375 fHists->Add(fTriggerNch[i]);
376 fHists->Add(fTriggerNchSeeds[i]);
377 fHists->Add(fTriggerTracklet[i]);
378 fHists->Add(fNch07Nch[i]);
379 fHists->Add(fPNch07Nch[i]);
380 fHists->Add(fNch07Tracklet[i]);
381 fHists->Add(fNchTracklet[i]);
382 fHists->Add(fPNch07Tracklet[i]);
383 fHists->Add(fDPhiEventAxis[i]);
390 //________________________________________________________________________
391 void AliAnalysisTaskMinijet::UserExec(Option_t *)
393 // Main loop, called for each event
394 // Kinematics-only, ESD and AOD can be processed.
395 // Data is read (LoopESD, LoopAOD...) and then analysed (Analyse).
396 // - in case of MC with full detector simulation, all correction steps(0-5) can be processed
397 // - for Data, only step 5 is performed
398 // - for kinematics-only, only step 0 is processed
399 // step 5 = Triggered events, reconstructed accepted vertex, reconstructed tracks, reconstructed multiplicity,
400 // step 4 = Triggered events, reconstructed accepted vertex, reconstructed tracks with MC properties, reconstructed multiplicity
401 // step 3 = Triggered events, reconstructed accepted vertex, mc primary particles, reconstructed multiplicity,
402 // step 2 = Triggered events, all mc primary particles, reconstructed multiplicity
403 // step 1 = Triggered events, all mc primary particles, true multiplicity
404 // step 0 = All events, all mc primary particles, true multiplicity
406 if(fDebug) Printf("UserExec: Event starts");
408 AliVEvent *event = InputEvent();
410 Error("UserExec", "Could not retrieve event");
413 fBSign= event->GetMagneticField();
415 //get events, either ESD or AOD
416 fESDEvent = dynamic_cast<AliESDEvent*> (InputEvent());
417 fAODEvent = dynamic_cast<AliAODEvent*> (InputEvent());
422 vector<Short_t> charge;
426 vector<Float_t> theta;
429 //number of accepted tracks and tracklets
430 Int_t ntracks = 0; //return value for reading functions for ESD and AOD
431 //Int_t ntracksRemove = 0; //return value for reading functions for ESD and AOD
432 vector<Int_t> nTracksTracklets; // [0]=nAccepted,1=ntracklets,2=nall(also neutral in case of mc,
433 //for real nall=ncharged)
436 if(!fAODEvent && !fESDEvent)return;
438 //=================== AOD ===============
440 if(fAODEvent){//AOD loop
442 //reset global values
443 fNMcPrimAccept=0;// number of accepted primaries
444 fNRecAccept=0; // number of accepted tracks
446 if(CheckEvent(true)){//step 5 = TrigVtxRecNrec, step 4 = TrigVtxRecMcPropNrec ,step 3 = TrigVtxMcNrec
449 //step 5 = TrigVtxRecNrec
450 ntracks = LoopAOD(pt, eta, phi, charge, nTracksTracklets, 5);//read tracks
451 if(pt.size()){ //(internally ntracks=fNRecAccept)
452 Analyse(pt, eta, phi, charge, ntracks, nTracksTracklets[1], nTracksTracklets[2], 5);//analyse
456 // step 4 = TrigVtxRecMcPropNrec
457 ntracks = LoopAODRecMcProp(pt, eta, phi, charge, nTracksTracklets, 4);//read tracks
458 if(pt.size()){//(internally ntracks=fNRecAccept)
459 Analyse(pt, eta, phi, charge, ntracks, nTracksTracklets[1], nTracksTracklets[2], 4);//analyse
465 // step 3 = TrigVtxMcNrec
466 ntracks = LoopAODMC(pt, eta, phi, charge, nTracksTracklets, 3);//read tracks
467 if(pt.size()){//(internally ntracks=fNRecAccept)
468 Analyse(pt, eta, phi, charge, ntracks, nTracksTracklets[1],nTracksTracklets[2], 3);//analyse
473 }//check event (true)
477 fNMcPrimAccept=0;// number of accepted primaries
478 fNRecAccept=0; // number of accepted tracks
480 if(CheckEvent(false)){// all events, with and without reconstucted vertex
481 ntracks = LoopAOD (pt, eta, phi, charge, nTracksTracklets, 2);//need to compute Nrec once more for all events
482 ntracks = LoopAODMC(pt, eta, phi, charge, nTracksTracklets, 1);//read tracks
484 Analyse(pt, eta, phi, charge, fNRecAccept, nTracksTracklets[1],nTracksTracklets[2], 2); // step 2 = TrigAllMcNrec
486 Analyse(pt, eta, phi, charge, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 1); // step 1 = TrigAllMcNmc
489 //step 0 (include not triggered events) is not possible with AODs generated before October 2011
490 //step 0 can be implemented for new AODs
492 }//check event (false)
499 //=================== ESD ===============
502 if(fESDEvent){//ESD loop
505 fNMcPrimAccept=0;// number of accepted primaries
506 fNRecAccept=0; // number of accepted tracks
508 // instead of task->SelectCollisionCandidate(mask) in AddTask macro
509 Bool_t isSelected = (((AliInputEventHandler*)
510 (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
511 ->IsEventSelected() & AliVEvent::kMB);
515 Printf("IsSelected = %d", isSelected);
516 Printf("CheckEvent(true)= %d", CheckEvent(true));
517 Printf("CheckEvent(false)= %d", CheckEvent(false));
521 if(isSelected){ // has offline trigger
523 if(CheckEvent(true)){//step 5 = TrigVtxRecNrec, step 4 = TrigVtxRecMcPropNrec ,step 3 = TrigVtxMcNrec
526 //step 5 = TrigVtxRecNrec
527 ntracks = LoopESD(pt, eta, phi, charge,nTracksTracklets, 5);//read tracks
528 if(pt.size()){ //(internally ntracks=fNRecAccept)
529 Analyse(pt, eta, phi, charge, ntracks, nTracksTracklets[1], nTracksTracklets[2], 5);//analyse
533 // step 4 = TrigVtxRecMcPropNrec
534 ntracks = LoopESDRecMcProp(pt, eta, phi, charge, nTracksTracklets, 4);//read tracks
535 if(pt.size()){//(internally ntracks=fNRecAccept)
536 Analyse(pt, eta, phi, charge, ntracks, nTracksTracklets[1], nTracksTracklets[2], 4);//analyse
542 // step 3 = TrigVtxMcNrec
543 ntracks = LoopESDMC(pt, eta, phi, charge, nTracksTracklets, 3);//read tracks
544 if(pt.size()){//(internally ntracks=fNRecAccept)
545 Analyse(pt, eta, phi, charge, ntracks, nTracksTracklets[1],nTracksTracklets[2], 3);//analyse
550 }//check event (true)
553 fNMcPrimAccept=0;// number of accepted primaries
554 fNRecAccept=0; // number of accepted tracks
556 if(CheckEvent(false)){// all events, with and without reconstucted vertex
557 ntracks = LoopESD (pt, eta, phi, charge, nTracksTracklets, 2);//need to compute Nrec once more for all events
558 ntracks = LoopESDMC(pt, eta, phi, charge, nTracksTracklets, 1);//read tracks
560 Analyse(pt, eta, phi, charge, fNRecAccept, nTracksTracklets[1],nTracksTracklets[2], 2); // step 2 = TrigAllMcNrec
562 Analyse(pt, eta, phi, charge, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 1); // step 1 = TrigAllMcNmc
564 Analyse(pt, eta, phi, charge, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 0); //first part of step 0 // step 0 = AllAllMcNmc
572 else { // not selected by physics selection task = not triggered
574 if(CheckEvent(false)){
575 ntracks = LoopESDMC(pt, eta, phi, charge, nTracksTracklets, 0);//read tracks
576 if(pt.size())Analyse(pt, eta, phi, charge, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 0); //second part of step 0 // step 0 = AllAllMcNmc
591 //________________________________________________________________________
592 Int_t AliAnalysisTaskMinijet::LoopESD( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
593 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
594 vector<Int_t> &nTracksTracklets, const Int_t step)
596 // gives back the number of esd tracks and pointer to arrays with track
597 // properties (pt, eta, phi)
598 // Uses TPC tracks with SPD vertex from now on
604 nTracksTracklets.clear();
606 const AliESDVertex* vtxSPD = fESDEvent->GetPrimaryVertexSPD(); // uses track or SPD vertexer
607 fVertexZ[step]->Fill(vtxSPD->GetZ());
609 // Retreive the number of all tracks for this event.
610 Int_t ntracks = fESDEvent->GetNumberOfTracks();
611 if(fDebug>1) Printf("all ESD tracks: %d", ntracks);
613 //first loop to check how many tracks are accepted
615 Int_t nAcceptedTracks=0;
616 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
618 AliESDtrack *esdTrack = (AliESDtrack *)fESDEvent->GetTrack(iTracks);
620 Error("LoopESD", "Could not receive track %d", iTracks);
624 // use TPC only tracks with non default SPD vertex
625 AliESDtrack *track = AliESDtrackCuts::
626 GetTPCOnlyTrack(dynamic_cast<AliESDEvent*>(fESDEvent),esdTrack->GetID());
628 if(!fCuts->AcceptTrack(track)) {
630 continue;// apply TPC track cuts before constrain to SPD vertex
633 // only constrain tracks above threshold
634 AliExternalTrackParam exParam;
635 // take the B-field from the ESD, no 3D fieldMap available at this point
636 Bool_t relate = false;
637 relate = track->RelateToVertexTPC(vtxSPD,fESDEvent->GetMagneticField(),
643 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),
644 exParam.GetCovariance());
648 continue;// only if tracks have pt<=0
651 if (TMath::Abs(track->Eta())<fEtaCut && track->Pt()>fPtMin && track->Pt()<fPtMax) {
652 ptArray.push_back(track->Pt());
653 etaArray.push_back(track->Eta());
654 phiArray.push_back(track->Phi());
655 chargeArray.push_back(track->Charge());
657 fHistPt->Fill(track->Pt());
660 // TPC only track memory needs to be cleaned up
667 if(nAcceptedTracks==0) return 0;
670 Int_t ntrackletsAccept=0;
671 AliMultiplicity * mult = (AliMultiplicity*)(fESDEvent->GetMultiplicity());
672 Int_t ntracklets = mult->GetNumberOfTracklets();
673 for(Int_t i=0;i< ntracklets;i++){
674 if(mult->GetDeltaPhi(i)<0.05 && TMath::Abs(mult->GetEta(i))<fEtaCut){
678 nTracksTracklets.push_back(nAcceptedTracks);
679 nTracksTracklets.push_back(ntrackletsAccept);
680 nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis
681 //where here also neutral particles are counted.
684 fVzEvent=vtxSPD->GetZ(); // needed for correction map
685 if(step==5 || step ==2) fNRecAccept=nAcceptedTracks;
691 //________________________________________________________________________
692 Int_t AliAnalysisTaskMinijet::LoopESDRecMcProp( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
693 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
694 vector<Int_t> &nTracksTracklets, const Int_t step)
696 // gives back the number of esd tracks and pointer to arrays with track
697 // properties (pt, eta, phi) of mc particles if available
698 // Uses TPC tracks with SPD vertex from now on
704 nTracksTracklets.clear();
707 AliMCEvent *mcEvent = (AliMCEvent*) MCEvent();
709 Error("LoopESDRecMcProp", "Could not retrieve MC event");
712 AliStack* stack = MCEvent()->Stack();
716 // Retreive the number of all tracks for this event.
717 Int_t ntracks = fESDEvent->GetNumberOfTracks();
718 if(fDebug>1)Printf("all ESD tracks: %d", ntracks);
720 const AliESDVertex *vtxSPD = fESDEvent->GetPrimaryVertexSPD();
721 fVertexZ[step]->Fill(vtxSPD->GetZ());
724 Int_t nAcceptedTracks=0;
725 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
727 AliVParticle *vtrack = fESDEvent->GetTrack(iTracks);
728 AliESDtrack *esdTrack = (AliESDtrack *)fESDEvent->GetTrack(iTracks);
730 Error("LoopESDRecMcProp", "Could not receive track %d", iTracks);
734 // use TPC only tracks with non default SPD vertex
735 AliESDtrack *track = AliESDtrackCuts::
736 GetTPCOnlyTrack(dynamic_cast<AliESDEvent*>(fESDEvent),esdTrack->GetID());
738 if(!fCuts->AcceptTrack(track)) {
740 continue;// apply TPC track cuts before constrain to SPD vertex
743 // only constrain tracks above threshold
744 AliExternalTrackParam exParam;
745 // take the B-field from the ESD, no 3D fieldMap available at this point
746 Bool_t relate = false;
747 relate = track->RelateToVertexTPC(vtxSPD,fESDEvent->GetMagneticField(),
753 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),
754 exParam.GetCovariance());
758 continue;// only if tracks have pt<=0
761 //count tracks, if available, use mc particle properties
762 if(vtrack->GetLabel()<0){
763 if (TMath::Abs(track->Eta())<fEtaCut && track->Pt()>fPtMin && track->Pt()<fPtMax){
764 ptArray.push_back(track->Pt());
765 etaArray.push_back(track->Eta());
766 phiArray.push_back(track->Phi());
767 chargeArray.push_back(track->Charge());
772 TParticle *partOfTrack = stack->Particle(vtrack->GetLabel());
773 if (TMath::Abs(partOfTrack->Eta())<fEtaCut && partOfTrack->Pt()>fPtMin && partOfTrack->Pt()<fPtMax) {
774 ptArray.push_back(partOfTrack->Pt());
775 etaArray.push_back(partOfTrack->Eta());
776 phiArray.push_back(partOfTrack->Phi());
777 chargeArray.push_back(vtrack->Charge());
782 // TPC only track memory needs to be cleaned up
788 if(nAcceptedTracks==0) return 0;
791 Int_t ntrackletsAccept=0;
792 AliMultiplicity * mult = (AliMultiplicity*)(fESDEvent->GetMultiplicity());
793 Int_t ntracklets = mult->GetNumberOfTracklets();
794 for(Int_t i=0;i< ntracklets;i++){
795 if(mult->GetDeltaPhi(i)<0.05 && TMath::Abs(mult->GetEta(i))<fEtaCut){
800 nTracksTracklets.push_back(nAcceptedTracks);
801 nTracksTracklets.push_back(ntrackletsAccept);
802 nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis
803 //where here also neutral particles are counted.
806 //get mc vertex for correction maps
807 AliGenEventHeader* header = MCEvent()->GenEventHeader();
809 header->PrimaryVertex(mcV);
812 return fNRecAccept; // give back reconstructed value
820 //________________________________________________________________________
821 Int_t AliAnalysisTaskMinijet::LoopESDMC(vector<Float_t> &ptArray, vector<Float_t> &etaArray,
822 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
823 vector<Int_t> &nTracksTracklets, const Int_t step)
825 // gives back the number of charged prim MC particle and pointer to arrays
826 // with particle properties (pt, eta, phi)
832 nTracksTracklets.clear();
836 AliMCEvent *mcEvent = (AliMCEvent*) MCEvent();
838 Error("LoopESDMC", "Could not retrieve MC event");
842 AliStack* stack = MCEvent()->Stack();
845 Int_t ntracks = mcEvent->GetNumberOfTracks();
846 if(fDebug>1)Printf("MC particles: %d", ntracks);
849 AliGenEventHeader* header = MCEvent()->GenEventHeader();
853 header->PrimaryVertex(mcV);
855 fVertexZ[step]->Fill(vzMC);
858 //----------------------------------
859 //first track loop to check how many chared primary tracks are available
860 Int_t nChargedPrimaries=0;
861 Int_t nAllPrimaries=0;
863 Int_t nPseudoTracklets=0;
864 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
865 AliMCParticle *track = dynamic_cast<AliMCParticle*>(mcEvent->GetTrack(iTracks));
867 Error("LoopESDMC", "Could not receive track %d", iTracks);
872 if(//count also charged particles in case of fSelectParticles==2 (only neutral)
873 !SelectParticlePlusCharged(
876 stack->IsPhysicalPrimary(track->Label())
881 //count number of pseudo tracklets
882 if(TMath::Abs(track->Eta())<=fEtaCut && track->Pt()>0.0) ++nPseudoTracklets; //0.035
883 //same cuts as on ESDtracks
884 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue;
886 //count all primaries
888 //count charged primaries
889 if (track->Charge() != 0) ++nChargedPrimaries;
891 if(fDebug>2) Printf("PDG=%d, IsPrim=%d", track->PdgCode(),stack->IsPhysicalPrimary(track->Label()) );
895 //----------------------------------
898 Printf("All in acceptance=%d",nAllPrimaries);
899 Printf("Charged in acceptance =%d",nChargedPrimaries);
902 fChargedPi0->Fill(nAllPrimaries,nChargedPrimaries);
904 if(nAllPrimaries==0) return 0;
905 if(nChargedPrimaries==0) return 0;
908 //Int_t iChargedPiK=0;
909 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
910 AliMCParticle *track = dynamic_cast<AliMCParticle*>(mcEvent->GetTrack(iTracks));
912 Error("LoopESDMC", "Could not receive track %d", iTracks);
919 stack->IsPhysicalPrimary(track->Label())
925 //same cuts as on ESDtracks
926 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue;
928 if(fDebug>2) Printf("After: PDG=%d, IsPrim=%d", track->PdgCode(),stack->IsPhysicalPrimary(track->Label()) );
931 fHistPtMC->Fill(track->Pt());
932 //fills arrays with track properties
933 ptArray.push_back(track->Pt());
934 etaArray.push_back(track->Eta());
935 phiArray.push_back(track->Phi());
936 chargeArray.push_back(track->Charge());
941 nTracksTracklets.push_back(nChargedPrimaries);
942 nTracksTracklets.push_back(nPseudoTracklets);
943 if(fSelectParticles!=2){
944 nTracksTracklets.push_back(nAllPrimaries);
947 nTracksTracklets.push_back(nAllPrimaries-nChargedPrimaries); // only neutral
951 fNMcPrimAccept=nChargedPrimaries;
954 fNmcNch->Fill(fNMcPrimAccept,fNRecAccept);
955 fPNmcNch->Fill(fNMcPrimAccept,fNRecAccept);
963 //________________________________________________________________________
964 Int_t AliAnalysisTaskMinijet::LoopAOD( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
965 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
966 vector<Int_t> &nTracksTracklets, const Int_t step)
968 // gives back the number of AOD tracks and pointer to arrays with track
969 // properties (pt, eta, phi)
975 nTracksTracklets.clear();
977 TClonesArray *mcArray=0x0;
978 if(fAnalysePrimOnly){
979 mcArray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName());
983 AliAODVertex* vertex= (AliAODVertex*)fAODEvent->GetPrimaryVertexSPD();//GetPrimaryVertex()
984 Double_t vzAOD=vertex->GetZ();
985 fVertexZ[step]->Fill(vzAOD);
987 // Retreive the number of tracks for this event.
988 Int_t ntracks = fAODEvent->GetNumberOfTracks();
989 if(fDebug>1) Printf("AOD tracks: %d", ntracks);
992 Int_t nAcceptedTracks=0;
993 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
994 AliAODTrack *track = (AliAODTrack *)fAODEvent->GetTrack(iTracks);
996 Error("LoopAOD", "Could not receive track %d", iTracks);
1000 AliVParticle *vtrack = fAODEvent->GetTrack(iTracks);
1002 //use only tracks from primaries
1003 if(fAnalysePrimOnly){
1004 if(vtrack->GetLabel()<0)continue;
1005 if(!(static_cast<AliAODMCParticle*>(mcArray->At(vtrack->GetLabel()))->IsPhysicalPrimary()))continue;
1008 if(track->TestFilterBit(128) && TMath::Abs(track->Eta())<fEtaCut
1009 && track->Pt()>fPtMin && track->Pt()<fPtMax){
1013 // Printf("dca= %f", track->DCA());
1014 //save track properties in vector
1015 ptArray.push_back(track->Pt());
1016 etaArray.push_back(track->Eta());
1017 phiArray.push_back(track->Phi());
1018 chargeArray.push_back(track->Charge());
1019 fHistPt->Fill(track->Pt());
1023 //need to check this option for MC
1024 if(nAcceptedTracks==0) return 0;
1028 Int_t ntrackletsAccept=0;
1029 AliAODTracklets * mult= (AliAODTracklets*)fAODEvent->GetTracklets();
1030 for(Int_t i=0;i<mult->GetNumberOfTracklets();++i){
1031 if(TMath::Abs(mult->GetDeltaPhi(i))<0.05 && TMath::Abs(TMath::Log(TMath::Tan(0.5 * mult->GetTheta(i))))<fEtaCut){
1037 nTracksTracklets.push_back(nAcceptedTracks);
1038 nTracksTracklets.push_back(ntrackletsAccept);
1039 nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis
1040 //where here also neutral particles are counted.
1044 if(step==5 || step==2)fNRecAccept = nAcceptedTracks; // needed for MC case //step5 = TrigVtxRecNrec
1045 return fNRecAccept; // at the moment, always return reconstructed multiplicity
1049 //________________________________________________________________________
1050 Int_t AliAnalysisTaskMinijet::LoopAODRecMcProp( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
1051 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
1052 vector<Int_t> &nTracksTracklets, const Int_t step)
1054 // gives back the number of AOD tracks and pointer to arrays with track
1055 // properties (pt, eta, phi)
1061 chargeArray.clear();
1062 nTracksTracklets.clear();
1065 // Retreive the number of tracks for this event.
1066 Int_t ntracks = fAODEvent->GetNumberOfTracks();
1067 if(fDebug>1) Printf("AOD tracks: %d", ntracks);
1070 //get array of mc particles
1071 TClonesArray *mcArray = (TClonesArray*)fAODEvent->
1072 FindListObject(AliAODMCParticle::StdBranchName());
1074 Printf("No MC particle branch found");
1078 AliAODVertex* vtx= (AliAODVertex*)fAODEvent->GetPrimaryVertexSPD();//GetPrimaryVertex()
1079 Double_t vzAOD=vtx->GetZ();
1080 fVertexZ[step]->Fill(vzAOD);
1082 Int_t nAcceptedTracks=0;
1083 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
1084 AliAODTrack *track = (AliAODTrack *)fAODEvent->GetTrack(iTracks);
1086 AliVParticle *vtrack = fAODEvent->GetTrack(iTracks);
1089 Error("LoopAODRecMcProp", "Could not receive track %d", iTracks);
1093 //use only tracks from primaries
1094 if(fAnalysePrimOnly){
1095 if(vtrack->GetLabel()<0)continue;
1096 if(!(static_cast<AliAODMCParticle*>(mcArray->At(vtrack->GetLabel()))->IsPhysicalPrimary()))continue;
1099 if(track->TestFilterBit(128) && TMath::Abs(track->Eta())<fEtaCut &&
1100 track->Pt()>fPtMin && track->Pt()<fPtMax){
1104 //save track properties in vector
1105 if(vtrack->GetLabel()<0){ //fake tracks
1106 // Printf("Fake track");
1108 ptArray.push_back(track->Pt());
1109 etaArray.push_back(track->Eta());
1110 phiArray.push_back(track->Phi());
1111 chargeArray.push_back(track->Charge());
1113 else{//mc properties
1114 AliAODMCParticle *partOfTrack = (AliAODMCParticle*)mcArray->At(vtrack->GetLabel());
1116 ptArray.push_back(partOfTrack->Pt());
1117 etaArray.push_back(partOfTrack->Eta());
1118 phiArray.push_back(partOfTrack->Phi());
1119 chargeArray.push_back(vtrack->Charge());//partOfTrack?
1124 //need to check this option for MC
1125 if(nAcceptedTracks==0) return 0;
1128 Int_t ntrackletsAccept=0;
1129 AliAODTracklets * mult= (AliAODTracklets*)fAODEvent->GetTracklets();
1130 for(Int_t i=0;i<mult->GetNumberOfTracklets();++i){
1131 if(TMath::Abs(mult->GetDeltaPhi(i))<0.05 && TMath::Abs(TMath::Log(TMath::Tan(0.5 * mult->GetTheta(i))))<fEtaCut ){
1137 nTracksTracklets.push_back(nAcceptedTracks);
1138 nTracksTracklets.push_back(ntrackletsAccept);
1139 nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis
1140 //where here also neutral particles are counted.
1144 AliAODMCHeader *aodMCheader = (AliAODMCHeader *) fAODEvent->
1145 FindListObject(AliAODMCHeader::StdBranchName());
1146 Float_t vzMC = aodMCheader->GetVtxZ();
1149 return fNRecAccept;//this is the rec value from step 5
1155 //________________________________________________________________________
1156 Int_t AliAnalysisTaskMinijet::LoopAODMC( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
1157 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
1158 vector<Int_t> &nTracksTracklets, const Int_t step)
1160 // gives back the number of AOD MC particles and pointer to arrays with particle
1161 // properties (pt, eta, phi)
1166 chargeArray.clear();
1167 nTracksTracklets.clear();
1170 AliAODMCHeader *aodMCheader = (AliAODMCHeader *) fAODEvent->
1171 FindListObject(AliAODMCHeader::StdBranchName());
1172 Float_t vzMC = aodMCheader->GetVtxZ();
1173 fVertexZ[step]->Fill(vzMC);
1176 //retreive MC particles from event
1177 TClonesArray *mcArray = (TClonesArray*)fAODEvent->
1178 FindListObject(AliAODMCParticle::StdBranchName());
1180 Printf("No MC particle branch found");
1184 Int_t ntracks = mcArray->GetEntriesFast();
1185 if(fDebug>1)Printf("MC particles: %d", ntracks);
1188 // Track loop: chek how many particles will be accepted
1190 Int_t nChargedPrim=0;
1192 Int_t nPseudoTracklets=0;
1193 for (Int_t it = 0; it < ntracks; it++) {
1194 AliAODMCParticle *track = (AliAODMCParticle*)mcArray->At(it);
1196 Error("LoopAODMC", "Could not receive particle %d", it);
1200 if(!SelectParticlePlusCharged(
1203 track->IsPhysicalPrimary()
1208 if(TMath::Abs(track->Eta())<fEtaCut && track->Pt()>0.0)++nPseudoTracklets; //0.035
1209 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue;
1212 if(track->Charge()!=0) nChargedPrim++;
1217 if(nAllPrim==0) return 0;
1218 if(nChargedPrim==0) return 0;
1220 //generate array with size of number of accepted tracks
1221 fChargedPi0->Fill(nAllPrim,nChargedPrim);
1224 // Track loop: fill arrays for accepted tracks
1225 // Int_t iChargedPrim=0;
1226 for (Int_t it = 0; it < ntracks; it++) {
1227 AliAODMCParticle *track = (AliAODMCParticle*)mcArray->At(it);
1229 Error("LoopAODMC", "Could not receive particle %d", it);
1236 track->IsPhysicalPrimary()
1241 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue;
1243 fHistPtMC->Fill(track->Pt());
1244 ptArray.push_back(track->Pt());
1245 etaArray.push_back(track->Eta());
1246 phiArray.push_back(track->Phi());
1247 chargeArray.push_back(track->Charge());
1250 nTracksTracklets.push_back(nChargedPrim);
1251 nTracksTracklets.push_back(nPseudoTracklets);
1252 if(fSelectParticles!=2){
1253 nTracksTracklets.push_back(nAllPrim);
1256 nTracksTracklets.push_back(nAllPrim-nChargedPrim); // only neutral
1262 fNMcPrimAccept = nChargedPrim;
1263 if(step==1){ // step 1 = Trig All Mc Nmc
1264 fNmcNch->Fill( fNMcPrimAccept,fNRecAccept);
1265 fPNmcNch->Fill(fNMcPrimAccept,fNRecAccept);
1267 return fNRecAccept; // rec value from step 5 or step 2
1272 //________________________________________________________________________
1273 void AliAnalysisTaskMinijet::Analyse(const vector<Float_t> &pt,
1274 const vector<Float_t> &eta,
1275 const vector<Float_t> &phi,
1276 const vector<Short_t> &charge,
1277 const Int_t ntracksCharged,
1278 const Int_t ntracklets,
1283 // analyse track properties (comming from either ESDs or AODs) in order to compute
1284 // mini jet activity (chared tracks) as function of charged multiplicity
1289 Printf("Analysis Step=%d", step);
1291 Printf("nAll=%d",nAll);
1292 Printf("nCharged=%d",ntracksCharged);
1293 for (Int_t i = 0; i < nAll; i++) {
1294 Printf("pt[%d]=%f",i,pt[i]);
1299 //calculation of mean pt for all tracks in case of step==0
1300 if(step==5 || step ==2){ // rec step
1302 Double_t leadingPt=0.;
1303 for (Int_t i = 0; i < nAll; i++) {
1304 if(pt[i]<0.01)continue;
1306 if(leadingPt<pt[i])leadingPt=pt[i];
1310 fLeadingPtRec=leadingPt;
1313 Double_t propEvent[4] = {ntracksCharged,fVzEvent,fMeanPtRec, fLeadingPtRec}; //vz: {rec, mc, mc}, meanPt and Nrec is always rec value
1314 fMapEvent[step]->Fill(propEvent);
1316 fNcharge[step]->Fill(ntracksCharged);
1318 Float_t ptEventAxis=0; // pt event axis
1319 Float_t etaEventAxis=0; // eta event axis
1320 Float_t phiEventAxis=0; // phi event axis
1321 Short_t chargeEventAxis=0; // charge event axis
1323 Float_t ptOthers = 0; // pt others // for all other tracks around event axis -> see loop
1324 Float_t etaOthers = 0; // eta others
1325 Float_t phiOthers = 0; // phi others
1326 Short_t chargeOthers = 0; // charge others
1328 Int_t *pindexInnerEta = new Int_t [nAll+1];
1329 Float_t *ptInnerEta = new Float_t[nAll+1];
1333 for (Int_t i = 0; i < nAll; i++) {
1335 if(pt[i]<0.01)continue;
1337 //fill single particle correction for first step of pair correction
1338 Double_t propAll[3] = {eta[i],pt[i],ntracksCharged };
1339 fMapAll[step]->Fill(propAll);
1342 //filling of simple check plots
1343 if(pt[i]<0.7) continue;
1344 fPt[step] -> Fill( pt[i]);
1345 fEta[step] -> Fill(eta[i]);
1346 fPhi[step] -> Fill(phi[i]);
1347 fPhiEta[step]-> Fill(phi[i], eta[i]);
1349 pindexInnerEta[i]=0; //set all values to zero
1350 //fill new array for eta check
1351 ptInnerEta[i]= pt[i];
1357 // define event axis: leading or random track (with pt>fTriggerPtCut)
1358 // ---------------------------------------
1359 Int_t highPtTracks=0;
1360 Int_t highPtTracksInnerEta=0;
1361 // Double_t highPtTracksInnerEtaCorr=0;
1364 //count high pt tracks and high pt tracks in acceptance for seeds
1365 for(Int_t i=0;i<nAll;i++){
1367 if(pt[i]<0.01)continue;
1369 if(TMath::Abs(eta[i])<0.9){
1373 if(pt[i]>fTriggerPtCut) {
1377 // seed should be place in middle of acceptance, that complete cone is in acceptance
1378 if(pt[i]>fTriggerPtCut && TMath::Abs(eta[i])<fEtaCutSeed && charge[i]!=0){
1380 // Printf("eta=%f", eta[i]);
1381 highPtTracksInnerEta++;
1390 //sort array in order to get highest pt tracks first
1391 //index can be computed with pindexInnerEta[number]
1392 if(nAll) TMath::Sort(nAll, ptInnerEta, pindexInnerEta, kTRUE);
1394 // plot of multiplicity distributions
1395 fNch07Nch[step]->Fill(ntracksCharged, highPtTracksInnerEta);
1396 fPNch07Nch[step]->Fill(ntracksCharged, highPtTracksInnerEta);
1399 fNch07Tracklet[step]->Fill(ntracklets, highPtTracksInnerEta);//only counts tracks which can be used as seeds
1400 fNchTracklet[step]->Fill(ntracklets, ntracksCharged);
1401 fPNch07Tracklet[step]->Fill(ntracklets, highPtTracksInnerEta);//only counts tracks which can be used as seeds
1404 //analysis can only be performed with event axis, defined by high pt track
1407 if(highPtTracks>0 && highPtTracksInnerEta>0){
1409 // build pairs in two track loops
1410 // loop over all possible trigger particles (defined by pt_trig and eta_acceptance)
1411 for(Int_t axis=0;(axis<nAll) && (pt[pindexInnerEta[axis]]>=fTriggerPtCut); axis++){
1413 //EventAxisRandom track properties
1414 ptEventAxis = pt [pindexInnerEta[axis]];
1415 etaEventAxis = eta[pindexInnerEta[axis]];
1416 phiEventAxis = phi[pindexInnerEta[axis]];
1417 chargeEventAxis = charge[pindexInnerEta[axis]];
1418 fPtSeed[step] -> Fill( ptEventAxis);
1419 fEtaSeed[step] -> Fill(etaEventAxis);
1420 fPhiSeed[step] -> Fill(phiEventAxis);
1423 Double_t prop[3] = {etaEventAxis,ptEventAxis,ntracksCharged };
1424 fMapSingleTrig[step]->Fill(prop);
1427 for (Int_t iTrack = axis+1; iTrack < nAll; iTrack++) {
1429 if(pt[pindexInnerEta[iTrack]]<fAssociatePtCut) continue;
1431 if(fSelectParticlesAssoc==1){
1432 if(charge[pindexInnerEta[iTrack]]==0)continue;
1434 if(fSelectParticlesAssoc==2){
1435 if(charge[pindexInnerEta[iTrack]]!=0)continue;
1439 ptOthers = pt [pindexInnerEta[iTrack]];
1440 etaOthers = eta[pindexInnerEta[iTrack]];
1441 phiOthers = phi[pindexInnerEta[iTrack]];
1442 chargeOthers = charge[pindexInnerEta[iTrack]];
1445 //plot only properties of tracks with pt>ptassoc
1446 fPtOthers[step] -> Fill( ptOthers);
1447 fEtaOthers[step] -> Fill(etaOthers);
1448 fPhiOthers[step] -> Fill(phiOthers);
1449 fPtEtaOthers[step] -> Fill(ptOthers, etaOthers);
1451 // if(fDebug>2)Printf("%f, %f", pt[pindexInnerEta[axis]], pt[pindexInnerEta[iTrack]]);
1453 Float_t dPhi = phiOthers-phiEventAxis;
1454 if(dPhi>1.5*TMath::Pi()) dPhi = dPhi-2*TMath::Pi();
1455 else if(dPhi<-0.5*TMath::Pi())dPhi=dPhi+2*TMath::Pi();
1456 Float_t dEta=etaOthers-etaEventAxis;
1459 fDPhiDEtaEventAxis[step]->Fill(dPhi, dEta);
1460 fDPhiEventAxis[step]->Fill(dPhi);
1463 if(ptEventAxis< 0.4 || ptEventAxis > 100) Printf("particles out of range pt");
1464 if(ntracksCharged<0 || ntracksCharged>150) Printf("particles out of range ncharge");
1465 if(TMath::Abs(dEta)>2*fEtaCut) {
1466 Printf("particles out of range dEta");
1467 Printf("eta1=%f, eta2=%f", etaOthers, etaEventAxis);
1468 Printf("step=%d",step);
1470 if(dPhi<-0.5*TMath::Pi() || dPhi>1.5*TMath::Pi()){
1471 Printf("particles out of range dPhi");
1472 Printf("phi1=%f, phi2=%f", phiOthers, phiEventAxis);
1475 Bool_t isLikeSign = CheckLikeSign(chargeEventAxis, chargeOthers);
1477 Double_t prop6[6] = {ptEventAxis,ptOthers,dEta,dPhi,ntracksCharged, isLikeSign };
1478 fMapPair[step]->Fill(prop6);
1480 }// end of inner track loop
1482 } //end of outer track loop
1484 fTriggerNch[step]->Fill(ntracksCharged,highPtTracksInnerEta);
1485 fTriggerNchSeeds[step]->Fill(ntracksCharged,highPtTracksInnerEta);
1486 fTriggerTracklet[step]->Fill(ntracklets);
1489 }//if there is at least one high pt track
1492 if(pindexInnerEta){// clean up array memory used for TMath::Sort
1493 delete[] pindexInnerEta;
1497 if(ptInnerEta){// clean up array memory used for TMath::Sort
1498 delete[] ptInnerEta;
1506 //________________________________________________________________________
1507 void AliAnalysisTaskMinijet::Terminate(Option_t*)
1509 //terminate function is called at the end
1510 //can be used to draw histograms etc.
1515 //________________________________________________________________________
1516 Bool_t AliAnalysisTaskMinijet::SelectParticlePlusCharged(const Short_t charge, const Int_t pdg, Bool_t prim)
1518 //selection of mc particle
1519 //fSelectParticles=0: use charged primaries and pi0 and k0
1520 //fSelectParticles=1: use only charged primaries
1521 //fSelectParticles=2: use only pi0 and k0
1523 if(fSelectParticles==0 || fSelectParticles==2){ // in case of 2: need to count also charged particles
1525 if(!(pdg==111||pdg==130||pdg==310))
1534 else if(fSelectParticles==1){
1535 if (charge==0 || !prim){
1541 Printf("Error: wrong selection of charged/pi0/k0");
1549 //________________________________________________________________________
1550 Bool_t AliAnalysisTaskMinijet::SelectParticle(const Short_t charge, const Int_t pdg, const Bool_t prim)
1552 //selection of mc particle
1553 //fSelectParticles=0: use charged primaries and pi0 and k0
1554 //fSelectParticles=1: use only charged primaries
1555 //fSelectParticles=2: use only pi0 and k0
1557 if(fSelectParticles==0){
1559 if(!(pdg==111||pdg==130||pdg==310))
1567 else if (fSelectParticles==1){
1568 if (charge==0 || !prim){
1572 else if(fSelectParticles==2){
1573 if(!(pdg==111||pdg==130||pdg==310))
1581 //________________________________________________________________________
1582 Bool_t AliAnalysisTaskMinijet::CheckEvent(const Bool_t recVertex)
1584 // This function tests the quality of an event (ESD/AOD) (rec and/or mc part)
1585 // recVertex=false: check if Mc events and stack is there, Nmc>0
1586 // recVertex=false: " + check if there is a good, reconstructed SPD vertex
1587 // defined by |z|<fVertexCut(10cm), Contributer>0, no PileUpFromSPD(3,0,8)
1596 AliMCEvent *mcEvente = (AliMCEvent*) MCEvent();
1598 Error("CheckEvent", "Could not retrieve MC event");
1603 AliStack* stackg = MCEvent()->Stack();
1604 if(!stackg) return false;
1605 Int_t ntracksg = mcEvente->GetNumberOfTracks();
1606 if(ntracksg<0) return false;
1609 //AliGenEventHeader* headerg = MCEvent()->GenEventHeader();
1611 //headerg->PrimaryVertex(mcVg);
1612 // if(TMath::Abs(mcVg[0])<1e-8 && TMath::Abs(mcVg[0])<1e-8 &&
1613 // TMath::Abs(mcVg[0])<1e-8) return false;
1614 // Float_t vzMCg = mcVg[2];
1615 // if(TMath::Abs(vzMCg)>fVertexZCut) return false;
1619 if(recVertex==true){
1620 if(fESDEvent->IsPileupFromSPD(3,0,8))return false;
1623 // const AliESDVertex* vertexESDg = fESDEvent->GetPrimaryVertex(); // uses track or SPD vertexer
1624 // if(!vertexESDg) return false;
1625 // if(vertexESDg->GetNContributors()<=0)return false;
1626 // Float_t fVzg= vertexESDg->GetZ();
1627 // if(TMath::Abs(fVzg)>fVertexZCut) return false;
1630 const AliESDVertex *vtxSPD = fESDEvent->GetPrimaryVertexSPD();
1631 if(!vtxSPD) return false;
1632 if(vtxSPD->GetNContributors()<=0)return false;
1633 Float_t fVzSPD= vtxSPD->GetZ();
1634 if(TMath::Abs(fVzSPD)>fVertexZCut) return false;
1641 else if(fMode==1){ //aod
1645 // AliAODMCHeader *aodMCheader = (AliAODMCHeader *) fAODEvent->
1646 // FindListObject(AliAODMCHeader::StdBranchName());
1647 // Float_t vzMC = aodMCheader->GetVtxZ();
1648 // if(TMath::Abs(vzMC)>fVertexZCut) return false;
1650 //retreive MC particles from event
1651 TClonesArray *mcArray = (TClonesArray*)fAODEvent->
1652 FindListObject(AliAODMCParticle::StdBranchName());
1654 Printf("No MC particle branch found");
1660 if(recVertex==true){
1661 if(fAODEvent->IsPileupFromSPD(3,0.8))return false;
1663 // AliAODVertex* vertex= (AliAODVertex*)fAODEvent->GetPrimaryVertex();
1664 // if(!vertex) return false;
1665 // if(vertex->GetNContributors()<=0) return false;
1666 // Double_t vzAOD=vertex->GetZ();
1667 // if(TMath::Abs(vzAOD)<1e-9) return false;
1668 // if(TMath::Abs(vzAOD)>fVertexZCut) return false;
1670 AliAODVertex* vertexSPD= (AliAODVertex*)fAODEvent->GetPrimaryVertexSPD();
1671 if(!vertexSPD) return false;
1672 if(vertexSPD->GetNContributors()<=0) return false;
1673 Double_t vzSPD=vertexSPD->GetZ();
1674 //if(TMath::Abs(vzSPD)<1e-9) return false;
1675 if(TMath::Abs(vzSPD)>fVertexZCut) return false;
1682 Printf("Wrong mode!");
1688 //_____________________________________________________________________________
1689 const Double_t * AliAnalysisTaskMinijet::CreateLogAxis(const Int_t nbins,
1690 const Double_t xmin,
1691 const Double_t xmax)
1693 // returns pointer to an array with can be used to build a logarithmic axis
1694 // it is user responsibility to delete the array
1696 Double_t logxmin = TMath::Log10(xmin);
1697 Double_t logxmax = TMath::Log10(xmax);
1698 Double_t binwidth = (logxmax-logxmin)/nbins;
1700 Double_t *xbins = new Double_t[nbins+1];
1703 for (Int_t i=1;i<=nbins;i++) {
1704 xbins[i] = xmin + TMath::Power(10,logxmin+i*binwidth);
1710 //_____________________________________________________________________________
1711 Bool_t AliAnalysisTaskMinijet::CheckLikeSign(const Short_t chargeEventAxis,
1712 const Short_t chargeOthers)
1714 // compute if charge of two particles/tracks has same sign or different sign
1716 if(fDebug>2) Printf("Charge1=%d, Charge2=%d",chargeEventAxis,chargeOthers);
1718 if(chargeEventAxis<0){
1722 else if(chargeOthers>0){
1727 else if(chargeEventAxis>0){
1731 else if(chargeOthers<0){
1737 Printf("Error: Charge not lower nor higher as zero");
1741 Printf("Error: Check values of Charge");