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
69 fSelectParticlesAssoc(1),
88 for(Int_t i = 0;i< 6;i++){
89 fMapSingleTrig[i] = 0;
114 fDPhiDEtaEventAxis[i] = 0;
115 fDPhiDEtaEventAxisSeeds[i]= 0;
118 fTriggerNchSeeds[i] = 0;
119 fTriggerTracklet[i] = 0;
124 fNch07Tracklet[i] = 0;
126 fPNch07Tracklet[i] = 0;
127 fDPhiEventAxis[i] = 0;
129 DefineOutput(1, TList::Class());
132 //________________________________________________________________________
133 AliAnalysisTaskMinijet::~AliAnalysisTaskMinijet()
137 if (fHists && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fHists;
140 //________________________________________________________________________
141 void AliAnalysisTaskMinijet::UserCreateOutputObjects()
145 if(fDebug) Printf("In User Create Output Objects.");
147 fStep = new TH1F("fStep", "fStep", 10, -0.5, 9.5);
148 fHistPt = new TH1F("fHistPt", "P_{T} distribution REC", 150, 0.1, 3.1);
149 fHistPt->GetXaxis()->SetTitle("P_{T} (GeV/c)");
150 fHistPt->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
151 fHistPt->SetMarkerStyle(kFullCircle);
154 fHistPtMC = new TH1F("fHistPtMC", "P_{T} distribution MC", 150, 0.1, 3.1);
155 fHistPtMC->GetXaxis()->SetTitle("P_{T} (GeV/c)");
156 fHistPtMC->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
157 fHistPtMC->SetMarkerStyle(kFullCircle);
159 fNmcNch = new TH2F("fNmcNch", "fNmcNch", 100,-0.5,99.5,100,-0.5,99.5);
160 fPNmcNch = new TProfile("pNmcNch", "pNmcNch", 100,-0.5,99.5);
164 fChargedPi0 = new TH2F("fChargedPi0", "fChargedPi0", 200, -0.5, 199.5, 200, -0.5, 199.5);
167 //----------------------
168 //bins for pt in THnSpare
169 Double_t ptMin = 0.0, ptMax = 100.;
171 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,
172 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,
173 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};
175 // Int_t nPtBins = 100;
176 // Double_t ptMin = 1.e-2, ptMax = 100.;
177 // Double_t *binsPt = 0;
178 // binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);
181 Double_t ptMin2 = 0.0, ptMax2 = 100.;
183 Double_t binsPt2[] = {0.1, 0.4, 0.7, 1.0, 2.0, 3.0, 4.0, 5.0, 10.0, 100.0};
185 // Int_t nPtBins2 = 10;
186 // Double_t ptMin2 = 0.4, ptMax2 = 100.;
187 // Double_t *binsPt2 = 0;
188 // binsPt2 = CreateLogAxis(nPtBins2,ptMin2,ptMax2);
191 Int_t binsEffHisto[3] = {Int_t(fEtaCut*20), nPtBins, 150 };
192 Double_t minEffHisto[3] = {-fEtaCut, ptMin, -0.5 };
193 Double_t maxEffHisto[3] = {fEtaCut, ptMax, 149.5 };
196 Int_t binsEffHisto5[6] = { nPtBins2, nPtBins2, Int_t(fEtaCut*10), 180, 150 , 2 };
197 Double_t minEffHisto5[6] = { ptMin2, ptMin2, -2*fEtaCut, -0.5*TMath::Pi(), -0.5 , -0.5 };
198 Double_t maxEffHisto5[6] = { ptMax2, ptMax2, 2*fEtaCut, 1.5*TMath::Pi(), 149.5 , 1.5 };
202 Int_t binsEvent[4] = { 150, 20, 50, nPtBins };
203 Double_t minEvent[4] = { -0.5, -10, 0, ptMin };
204 Double_t maxEvent[4] = { 149.5, 10, 10, ptMax };
207 Int_t binsAll[3] = {Int_t(fEtaCut*20), nPtBins2, 150 };
208 Double_t minAll[3] = {-fEtaCut, ptMin2, -0.5 };
209 Double_t maxAll[3] = {fEtaCut, ptMax2, 149.5 };
211 //--------------------
212 TString dataType[2] ={"ESD", "AOD"};
213 TString labels[6]={Form("%sAllAllMcNmc",dataType[fMode].Data()),
214 Form("%sTrigAllMcNmc",dataType[fMode].Data()),
215 Form("%sTrigAllMcNrec",dataType[fMode].Data()),
216 Form("%sTrigVtxMcNrec",dataType[fMode].Data()),
217 Form("%sTrigVtxRecMcPropNrec",dataType[fMode].Data()),
218 Form("%sTrigVtxRecNrec",dataType[fMode].Data())};
221 for(Int_t i=0;i<6;i++){
223 fMapSingleTrig[i] = new THnSparseD(Form("fMapSingleTrig%s", labels[i].Data()),"eta:pt:Nrec",
224 3,binsEffHisto,minEffHisto,maxEffHisto);
225 fMapSingleTrig[i]->SetBinEdges(1,binsPt);
226 fMapSingleTrig[i]->GetAxis(0)->SetTitle("#eta");
227 fMapSingleTrig[i]->GetAxis(1)->SetTitle("p_{T} (GeV/c)");
228 fMapSingleTrig[i]->GetAxis(2)->SetTitle("N_{rec}");
229 fMapSingleTrig[i]->Sumw2();
231 fMapPair[i] = new THnSparseD(Form("fMapPair%s", labels[i].Data()),"pt_trig:pt_assoc:DeltaEta:DeltaPhi:Nrec:likesign",
232 6,binsEffHisto5,minEffHisto5,maxEffHisto5);
233 fMapPair[i]->SetBinEdges(0,binsPt2);
234 fMapPair[i]->SetBinEdges(1,binsPt2);
235 fMapPair[i]->GetAxis(0)->SetTitle("p_{T, trig} (GeV/c)");
236 fMapPair[i]->GetAxis(1)->SetTitle("p_{T, assoc} (GeV/c)");
237 fMapPair[i]->GetAxis(2)->SetTitle("#Delta #eta");
238 fMapPair[i]->GetAxis(3)->SetTitle("#Delta #phi");
239 fMapPair[i]->GetAxis(4)->SetTitle("N_{rec}");
240 fMapPair[i]->GetAxis(5)->SetTitle("Like-sign or Unlike-sign");
241 fMapPair[i]->Sumw2();
244 fMapEvent[i] = new THnSparseD(Form("fMapEvent%s", labels[i].Data()),"Nrec:vertexZ:meanPt:leadingPt",
245 4,binsEvent,minEvent,maxEvent);
246 fMapEvent[i]->GetAxis(0)->SetTitle("N_{rec}");
247 fMapEvent[i]->GetAxis(1)->SetTitle("z_{vertex} (cm)");
248 fMapEvent[i]->GetAxis(2)->SetTitle("meanPt");
249 fMapEvent[i]->SetBinEdges(3,binsPt);
250 fMapEvent[i]->GetAxis(3)->SetTitle("leadingPt");
251 fMapEvent[i]->Sumw2();
253 fMapAll[i] = new THnSparseD(Form("fMapAll%s", labels[i].Data()),"eta:pt:Nrec",
254 3,binsAll,minAll,maxAll);
255 fMapAll[i]->SetBinEdges(1,binsPt2);
256 fMapAll[i]->GetAxis(0)->SetTitle("#eta");
257 fMapAll[i]->GetAxis(1)->SetTitle("p_{T} (GeV/c)");
258 fMapAll[i]->GetAxis(2)->SetTitle("N_{rec}");
262 fVertexZ[i] = new TH1F(Form("fVertexZ%s",labels[i].Data()),
263 Form("fVertexZ%s",labels[i].Data()) ,
265 fPt[i] = new TH1F(Form("fPt%s",labels[i].Data()),
266 Form("fPt%s",labels[i].Data()) ,
268 fNcharge[i] = new TH1F(Form("fNcharge%s",labels[i].Data()),
269 Form("fNcharge%s",labels[i].Data()) ,
271 fEta[i] = new TH1F (Form("fEta%s",labels[i].Data()),
272 Form("fEta%s",labels[i].Data()) ,
274 fPhi[i] = new TH1F(Form("fPhi%s",labels[i].Data()),
275 Form("fPhi%s",labels[i].Data()) ,
276 360, 0.,2*TMath::Pi());
277 fDcaXY[i] = new TH1F(Form("fDcaXY%s",labels[i].Data()),
278 Form("fDcaXY%s",labels[i].Data()) ,
280 fDcaZ[i] = new TH1F(Form("fDcaZ%s",labels[i].Data()),
281 Form("fDcaZ%s",labels[i].Data()) ,
283 fPtSeed[i] = new TH1F(Form("fPSeedt%s",labels[i].Data()),
284 Form("fPtSeed%s",labels[i].Data()) ,
286 fEtaSeed[i] = new TH1F (Form("fEtaSeed%s",labels[i].Data()),
287 Form("fEtaSeed%s",labels[i].Data()) ,
289 fPhiSeed[i] = new TH1F(Form("fPhiSeed%s",labels[i].Data()),
290 Form("fPhiSeed%s",labels[i].Data()) ,
291 360, 0.,2*TMath::Pi());
293 fPtOthers[i] = new TH1F(Form("fPOtherst%s",labels[i].Data()),
294 Form("fPtOthers%s",labels[i].Data()) ,
296 fEtaOthers[i] = new TH1F (Form("fEtaOthers%s",labels[i].Data()),
297 Form("fEtaOthers%s",labels[i].Data()) ,
299 fPhiOthers[i] = new TH1F(Form("fPhiOthers%s",labels[i].Data()),
300 Form("fPhiOthers%s",labels[i].Data()) ,
301 360, 0.,2*TMath::Pi());
302 fPtEtaOthers[i] = new TH2F(Form("fPtEtaOthers%s",labels[i].Data()),
303 Form("fPtEtaOthers%s",labels[i].Data()) ,
304 500, 0., 50, 100, -1., 1);
305 fPhiEta[i] = new TH2F(Form("fPhiEta%s",labels[i].Data()),
306 Form("fPhiEta%s",labels[i].Data()) ,
307 180, 0., 2*TMath::Pi(), 100, -1.,1.);
308 fDPhiDEtaEventAxis[i] = new TH2F(Form("fDPhiDEtaEventAxis%s",labels[i].Data()),
309 Form("fDPhiDEtaEventAxis%s",labels[i].Data()) ,
310 180, -0.5* TMath::Pi(), 1.5*TMath::Pi(), 9, -1.8,1.8);
311 fTriggerNch[i] = new TH1F(Form("fTriggerNch%s",labels[i].Data()),
312 Form("fTriggerNch%s",labels[i].Data()) ,
314 fTriggerNchSeeds[i] = new TH2F(Form("fTriggerNchSeeds%s",labels[i].Data()),
315 Form("fTriggerNchSeeds%s",labels[i].Data()) ,
316 250, -0.5, 249.5, 100, -0.5, 99.5);
317 fTriggerTracklet[i] = new TH1F(Form("fTriggerTracklet%s",labels[i].Data()),
318 Form("fTriggerTracklet%s",labels[i].Data()) ,
320 fNch07Nch[i] = new TH2F(Form("fNch07Nch%s",labels[i].Data()),
321 Form("fNch07Nch%s",labels[i].Data()) ,
322 250, -2.5, 247.5,250, -2.5, 247.5);
323 fPNch07Nch[i] = new TProfile(Form("pNch07Nch%s",labels[i].Data()),
324 Form("pNch07Nch%s",labels[i].Data()) ,
326 fNch07Tracklet[i] = new TH2F(Form("fNch07Tracklet%s",labels[i].Data()),
327 Form("fNch07Tracklet%s",labels[i].Data()) ,
328 250, -2.5, 247.5,250, -2.5, 247.5);
329 fNchTracklet[i] = new TH2F(Form("fNchTracklet%s",labels[i].Data()),
330 Form("fNchTracklet%s",labels[i].Data()) ,
331 250, -2.5, 247.5,250, -2.5, 247.5);
332 fPNch07Tracklet[i] = new TProfile(Form("pNch07Tracklet%s",labels[i].Data()),
333 Form("pNch07Tracklet%s",labels[i].Data()) ,
335 fDPhiEventAxis[i] = new TH1F(Form("fDPhiEventAxis%s",
337 Form("fDPhiEventAxis%s",
339 180, -0.5*TMath::Pi(), 1.5*TMath::Pi());
343 fHists = new TList();
347 fHists->Add(fHistPt);
350 fHists->Add(fHistPtMC);
351 fHists->Add(fNmcNch);
352 fHists->Add(fPNmcNch);
354 fHists->Add(fChargedPi0);
356 for(Int_t i=0;i<6;i++){
357 fHists->Add(fMapSingleTrig[i]);
358 fHists->Add(fMapPair[i]);
359 fHists->Add(fMapEvent[i]);
360 fHists->Add(fMapAll[i]);
361 fHists->Add(fVertexZ[i]);
363 fHists->Add(fNcharge[i]);
364 fHists->Add(fEta[i]);
365 fHists->Add(fPhi[i]);
366 fHists->Add(fDcaXY[i]);
367 fHists->Add(fDcaZ[i]);
368 fHists->Add(fPtSeed[i]);
369 fHists->Add(fEtaSeed[i]);
370 fHists->Add(fPhiSeed[i]);
371 fHists->Add(fPtOthers[i]);
372 fHists->Add(fEtaOthers[i]);
373 fHists->Add(fPhiOthers[i]);
374 fHists->Add(fPtEtaOthers[i]);
375 fHists->Add(fPhiEta[i]);
376 fHists->Add(fDPhiDEtaEventAxis[i]);
377 fHists->Add(fTriggerNch[i]);
378 fHists->Add(fTriggerNchSeeds[i]);
379 fHists->Add(fTriggerTracklet[i]);
380 fHists->Add(fNch07Nch[i]);
381 fHists->Add(fPNch07Nch[i]);
382 fHists->Add(fNch07Tracklet[i]);
383 fHists->Add(fNchTracklet[i]);
384 fHists->Add(fPNch07Tracklet[i]);
385 fHists->Add(fDPhiEventAxis[i]);
392 //________________________________________________________________________
393 void AliAnalysisTaskMinijet::UserExec(Option_t *)
395 // Main function, called for each event
396 // Kinematics-only, ESD and AOD can be processed.
397 // Data is read (ReadEventESD, ReadEventAOD...) and then analysed (Analyse).
398 // - in case of MC with full detector simulation, all correction steps(0-5) can be processed
399 // - for Data, only step 5 is performed
400 // - for kinematics-only, only step 0 is processed
401 // step 5 = Triggered events, reconstructed accepted vertex, reconstructed tracks, reconstructed multiplicity,
402 // step 4 = Triggered events, reconstructed accepted vertex, reconstructed tracks with MC properties, reconstructed multiplicity
403 // step 3 = Triggered events, reconstructed accepted vertex, mc primary particles, reconstructed multiplicity,
404 // step 2 = Triggered events, all mc primary particles, reconstructed multiplicity
405 // step 1 = Triggered events, all mc primary particles, true multiplicity
406 // step 0 = All events, all mc primary particles, true multiplicity
408 // can be changed with new AOD definition -> AOD076
410 if(fDebug) Printf("UserExec: Event starts");
412 AliVEvent *event = InputEvent();
414 Error("UserExec", "Could not retrieve event");
417 fBSign= event->GetMagneticField();
419 //get events, either ESD or AOD
420 fESDEvent = dynamic_cast<AliESDEvent*> (InputEvent());
421 fAODEvent = dynamic_cast<AliAODEvent*> (InputEvent());
426 vector<Short_t> charge;
430 vector<Float_t> theta;
433 //number of accepted tracks and tracklets
434 Int_t ntracks = 0; //return value for reading functions for ESD and AOD
435 //Int_t ntracksRemove = 0; //return value for reading functions for ESD and AOD
436 vector<Int_t> nTracksTracklets; // [0]=nAccepted,1=ntracklets,2=nall(also neutral in case of mc,
437 //for real nall=ncharged)
440 if(!fAODEvent && !fESDEvent)return;
442 //=================== AOD ===============
448 fNMcPrimAccept=0;// number of accepted primaries
449 fNRecAccept=0; // number of accepted tracks
451 // instead of task->SelectCollisionCandidate(mask) in AddTask macro
452 Bool_t isSelected = (((AliInputEventHandler*)
453 (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
454 ->IsEventSelected() & fTriggerType);
458 Printf("IsSelected = %d", isSelected);
459 Printf("CheckEvent(true)= %d", CheckEvent(true));
460 Printf("CheckEvent(false)= %d", CheckEvent(false));
464 if(isSelected){ // has offline trigger
466 if(CheckEvent(true)){//step 5 = TrigVtxRecNrec, step 4 = TrigVtxRecMcPropNrec ,step 3 = TrigVtxMcNrec
469 //step 5 = TrigVtxRecNrec
472 if(fESDEvent) ntracks = ReadEventESD(pt, eta, phi, charge,nTracksTracklets, 5);
473 else if(fAODEvent)ntracks = ReadEventAOD(pt, eta, phi, charge,nTracksTracklets, 5);
474 else Printf("Fatal Error");
477 if(pt.size()){ //(internally ntracks=fNRecAccept)
478 Analyse(pt, eta, phi, charge, ntracks, nTracksTracklets[1], nTracksTracklets[2], 5);
482 // step 4 = TrigVtxRecMcPropNrec
485 if(fESDEvent) ntracks = ReadEventESDRecMcProp(pt, eta, phi, charge, nTracksTracklets, 4);
486 else if(fAODEvent) ntracks = ReadEventAODRecMcProp(pt, eta, phi, charge, nTracksTracklets, 4);
487 else Printf("Fatal Error");
490 if(pt.size()){//(internally ntracks=fNRecAccept)
491 Analyse(pt, eta, phi, charge, ntracks, nTracksTracklets[1], nTracksTracklets[2], 4);
497 // step 3 = TrigVtxMcNrec
500 if(fESDEvent) ntracks = ReadEventESDMC(pt, eta, phi, charge, nTracksTracklets, 3);
501 else if(fAODEvent) ntracks = ReadEventAODMC(pt, eta, phi, charge, nTracksTracklets, 3);
502 else Printf("Fatal Error");
505 if(pt.size()){//(internally ntracks=fNRecAccept)
506 Analyse(pt, eta, phi, charge, ntracks, nTracksTracklets[1],nTracksTracklets[2], 3);
511 }//check event (true)
512 if(fUseMC && !fMcOnly){
514 fNMcPrimAccept=0;// number of accepted primaries
515 fNRecAccept=0; // number of accepted tracks
517 if(CheckEvent(false)){// all events, with and without reconstucted vertex
519 ntracks = ReadEventESD (pt, eta, phi, charge, nTracksTracklets, 2);//need to compute Nrec once more for all events
520 ntracks = ReadEventESDMC(pt, eta, phi, charge, nTracksTracklets, 1);//read tracks
523 ntracks = ReadEventAOD (pt, eta, phi, charge, nTracksTracklets, 2);//need to compute Nrec once more for all events
524 ntracks = ReadEventAODMC(pt, eta, phi, charge, nTracksTracklets, 1);//read tracks
526 else Printf("Fatal Error");
530 Analyse(pt, eta, phi, charge, fNRecAccept, nTracksTracklets[1],nTracksTracklets[2], 2); // step 2 = TrigAllMcNrec
532 Analyse(pt, eta, phi, charge, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 1); // step 1 = TrigAllMcNmc
534 Analyse(pt, eta, phi, charge, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 0); //first part of step 0 // step 0 = AllAllMcNmc
542 else { // not selected by physics selection task = not triggered
543 if(fUseMC && !fMcOnly){
544 if(CheckEvent(false)){
547 if(fESDEvent) ntracks = ReadEventESDMC(pt, eta, phi, charge, nTracksTracklets, 0);
548 else if(fAODEvent) ntracks = ReadEventAODMC(pt, eta, phi, charge, nTracksTracklets, 0);
549 else Printf("Fatal Error");
553 Analyse(pt, eta, phi, charge, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 0); //second part of step 0 // step 0 = AllAllMcNmc
561 if(fMode==0) ntracks = ReadEventESDMC(pt, eta, phi, charge, nTracksTracklets, 0);
562 else if (fMode==1) ntracks = ReadEventAODMC(pt, eta, phi, charge, nTracksTracklets, 0);
566 Analyse(pt, eta, phi, charge, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 0);
574 //________________________________________________________________________
575 Int_t AliAnalysisTaskMinijet::ReadEventESD( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
576 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
577 vector<Int_t> &nTracksTracklets, const Int_t step)
579 // gives back the number of esd tracks and pointer to arrays with track
580 // properties (pt, eta, phi)
581 // Uses TPC tracks with SPD vertex from now on
587 nTracksTracklets.clear();
589 const AliESDVertex* vtxSPD = fESDEvent->GetPrimaryVertexSPD(); // uses track or SPD vertexer
590 fVertexZ[step]->Fill(vtxSPD->GetZ());
592 // Retreive the number of all tracks for this event.
593 Int_t ntracks = fESDEvent->GetNumberOfTracks();
594 if(fDebug>1) Printf("all ESD tracks: %d", ntracks);
596 //first loop to check how many tracks are accepted
598 Int_t nAcceptedTracks=0;
599 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
601 AliESDtrack *esdTrack = (AliESDtrack *)fESDEvent->GetTrack(iTracks);
603 Error("ReadEventESD", "Could not receive track %d", iTracks);
607 // use TPC only tracks with non default SPD vertex
608 AliESDtrack *track = AliESDtrackCuts::
609 GetTPCOnlyTrack(dynamic_cast<AliESDEvent*>(fESDEvent),esdTrack->GetID());
611 if(!fCuts->AcceptTrack(track)) {
613 continue;// apply TPC track cuts before constrain to SPD vertex
616 // only constrain tracks above threshold
617 AliExternalTrackParam exParam;
618 // take the B-field from the ESD, no 3D fieldMap available at this point
619 Bool_t relate = false;
620 relate = track->RelateToVertexTPC(vtxSPD,fESDEvent->GetMagneticField(),
626 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),
627 exParam.GetCovariance());
631 continue;// only if tracks have pt<=0
634 if (TMath::Abs(track->Eta())<fEtaCut && track->Pt()>fPtMin && track->Pt()<fPtMax) {
635 ptArray.push_back(track->Pt());
636 etaArray.push_back(track->Eta());
637 phiArray.push_back(track->Phi());
638 chargeArray.push_back(track->Charge());
640 fHistPt->Fill(track->Pt());
643 // TPC only track memory needs to be cleaned up
650 if(nAcceptedTracks==0) return 0;
653 Int_t ntrackletsAccept=0;
654 AliMultiplicity * mult = (AliMultiplicity*)(fESDEvent->GetMultiplicity());
655 Int_t ntracklets = mult->GetNumberOfTracklets();
656 for(Int_t i=0;i< ntracklets;i++){
657 if(mult->GetDeltaPhi(i)<0.05 && TMath::Abs(mult->GetEta(i))<fEtaCut){
661 nTracksTracklets.push_back(nAcceptedTracks);
662 nTracksTracklets.push_back(ntrackletsAccept);
663 nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis
664 //where here also neutral particles are counted.
667 fVzEvent=vtxSPD->GetZ(); // needed for correction map
668 if(step==5 || step ==2) fNRecAccept=nAcceptedTracks;
674 //________________________________________________________________________
675 Int_t AliAnalysisTaskMinijet::ReadEventESDRecMcProp( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
676 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
677 vector<Int_t> &nTracksTracklets, const Int_t step)
679 // gives back the number of esd tracks and pointer to arrays with track
680 // properties (pt, eta, phi) of mc particles if available
681 // Uses TPC tracks with SPD vertex from now on
687 nTracksTracklets.clear();
690 AliMCEvent *mcEvent = (AliMCEvent*) MCEvent();
692 Error("ReadEventESDRecMcProp", "Could not retrieve MC event");
695 AliStack* stack = MCEvent()->Stack();
699 // Retreive the number of all tracks for this event.
700 Int_t ntracks = fESDEvent->GetNumberOfTracks();
701 if(fDebug>1)Printf("all ESD tracks: %d", ntracks);
703 const AliESDVertex *vtxSPD = fESDEvent->GetPrimaryVertexSPD();
704 fVertexZ[step]->Fill(vtxSPD->GetZ());
707 Int_t nAcceptedTracks=0;
708 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
710 AliVParticle *vtrack = fESDEvent->GetTrack(iTracks);
711 AliESDtrack *esdTrack = (AliESDtrack *)fESDEvent->GetTrack(iTracks);
713 Error("ReadEventESDRecMcProp", "Could not receive track %d", iTracks);
717 // use TPC only tracks with non default SPD vertex
718 AliESDtrack *track = AliESDtrackCuts::
719 GetTPCOnlyTrack(dynamic_cast<AliESDEvent*>(fESDEvent),esdTrack->GetID());
721 if(!fCuts->AcceptTrack(track)) {
723 continue;// apply TPC track cuts before constrain to SPD vertex
726 // only constrain tracks above threshold
727 AliExternalTrackParam exParam;
728 // take the B-field from the ESD, no 3D fieldMap available at this point
729 Bool_t relate = false;
730 relate = track->RelateToVertexTPC(vtxSPD,fESDEvent->GetMagneticField(),
736 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),
737 exParam.GetCovariance());
741 continue;// only if tracks have pt<=0
744 //count tracks, if available, use mc particle properties
745 if(vtrack->GetLabel()<0){
746 if (TMath::Abs(track->Eta())<fEtaCut && track->Pt()>fPtMin && track->Pt()<fPtMax){
747 ptArray.push_back(track->Pt());
748 etaArray.push_back(track->Eta());
749 phiArray.push_back(track->Phi());
750 chargeArray.push_back(track->Charge());
755 TParticle *partOfTrack = stack->Particle(vtrack->GetLabel());
756 if (TMath::Abs(partOfTrack->Eta())<fEtaCut && partOfTrack->Pt()>fPtMin && partOfTrack->Pt()<fPtMax) {
757 ptArray.push_back(partOfTrack->Pt());
758 etaArray.push_back(partOfTrack->Eta());
759 phiArray.push_back(partOfTrack->Phi());
760 chargeArray.push_back(vtrack->Charge());
765 // TPC only track memory needs to be cleaned up
771 if(nAcceptedTracks==0) return 0;
774 Int_t ntrackletsAccept=0;
775 AliMultiplicity * mult = (AliMultiplicity*)(fESDEvent->GetMultiplicity());
776 Int_t ntracklets = mult->GetNumberOfTracklets();
777 for(Int_t i=0;i< ntracklets;i++){
778 if(mult->GetDeltaPhi(i)<0.05 && TMath::Abs(mult->GetEta(i))<fEtaCut){
783 nTracksTracklets.push_back(nAcceptedTracks);
784 nTracksTracklets.push_back(ntrackletsAccept);
785 nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis
786 //where here also neutral particles are counted.
789 //get mc vertex for correction maps
790 AliGenEventHeader* header = MCEvent()->GenEventHeader();
792 header->PrimaryVertex(mcV);
795 return fNRecAccept; // give back reconstructed value
803 //________________________________________________________________________
804 Int_t AliAnalysisTaskMinijet::ReadEventESDMC(vector<Float_t> &ptArray, vector<Float_t> &etaArray,
805 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
806 vector<Int_t> &nTracksTracklets, const Int_t step)
808 // gives back the number of charged prim MC particle and pointer to arrays
809 // with particle properties (pt, eta, phi)
815 nTracksTracklets.clear();
819 AliMCEvent *mcEvent = (AliMCEvent*) MCEvent();
821 Error("ReadEventESDMC", "Could not retrieve MC event");
825 AliStack* stack = MCEvent()->Stack();
828 Int_t ntracks = mcEvent->GetNumberOfTracks();
829 if(fDebug>1)Printf("MC particles: %d", ntracks);
832 AliGenEventHeader* header = MCEvent()->GenEventHeader();
836 header->PrimaryVertex(mcV);
838 fVertexZ[step]->Fill(vzMC);
841 //----------------------------------
842 //first track loop to check how many chared primary tracks are available
843 Int_t nChargedPrimaries=0;
844 Int_t nAllPrimaries=0;
846 Int_t nPseudoTracklets=0;
847 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
848 AliMCParticle *track = dynamic_cast<AliMCParticle*>(mcEvent->GetTrack(iTracks));
850 Error("ReadEventESDMC", "Could not receive track %d", iTracks);
855 if(//count also charged particles in case of fSelectParticles==2 (only neutral)
856 !SelectParticlePlusCharged(
859 stack->IsPhysicalPrimary(track->Label())
864 //count number of pseudo tracklets
865 if(TMath::Abs(track->Eta())<=fEtaCut && track->Pt()>0.0) ++nPseudoTracklets; //0.035
866 //same cuts as on ESDtracks
867 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue;
869 //count all primaries
871 //count charged primaries
872 if (track->Charge() != 0) ++nChargedPrimaries;
874 if(fDebug>2) Printf("PDG=%d, IsPrim=%d", track->PdgCode(),stack->IsPhysicalPrimary(track->Label()) );
878 //----------------------------------
881 Printf("All in acceptance=%d",nAllPrimaries);
882 Printf("Charged in acceptance =%d",nChargedPrimaries);
885 fChargedPi0->Fill(nAllPrimaries,nChargedPrimaries);
887 if(nAllPrimaries==0) return 0;
888 if(nChargedPrimaries==0) return 0;
891 //Int_t iChargedPiK=0;
892 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
893 AliMCParticle *track = dynamic_cast<AliMCParticle*>(mcEvent->GetTrack(iTracks));
895 Error("ReadEventESDMC", "Could not receive track %d", iTracks);
902 stack->IsPhysicalPrimary(track->Label())
908 //same cuts as on ESDtracks
909 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue;
911 if(fDebug>2) Printf("After: PDG=%d, IsPrim=%d", track->PdgCode(),stack->IsPhysicalPrimary(track->Label()) );
914 fHistPtMC->Fill(track->Pt());
915 //fills arrays with track properties
916 ptArray.push_back(track->Pt());
917 etaArray.push_back(track->Eta());
918 phiArray.push_back(track->Phi());
919 chargeArray.push_back(track->Charge());
924 nTracksTracklets.push_back(nChargedPrimaries);
925 nTracksTracklets.push_back(nPseudoTracklets);
926 if(fSelectParticles!=2){
927 nTracksTracklets.push_back(nAllPrimaries);
930 nTracksTracklets.push_back(nAllPrimaries-nChargedPrimaries); // only neutral
934 fNMcPrimAccept=nChargedPrimaries;
937 fNmcNch->Fill(fNMcPrimAccept,fNRecAccept);
938 fPNmcNch->Fill(fNMcPrimAccept,fNRecAccept);
946 //________________________________________________________________________
947 Int_t AliAnalysisTaskMinijet::ReadEventAOD( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
948 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
949 vector<Int_t> &nTracksTracklets, const Int_t step)
951 // gives back the number of AOD tracks and pointer to arrays with track
952 // properties (pt, eta, phi)
958 nTracksTracklets.clear();
960 TClonesArray *mcArray=0x0;
961 if(fAnalysePrimOnly){
962 mcArray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName());
966 AliAODVertex* vertex= (AliAODVertex*)fAODEvent->GetPrimaryVertexSPD();//GetPrimaryVertex()
967 Double_t vzAOD=vertex->GetZ();
968 fVertexZ[step]->Fill(vzAOD);
970 // Retreive the number of tracks for this event.
971 Int_t ntracks = fAODEvent->GetNumberOfTracks();
972 if(fDebug>1) Printf("AOD tracks: %d", ntracks);
975 Int_t nAcceptedTracks=0;
976 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
977 AliAODTrack *track = (AliAODTrack *)fAODEvent->GetTrack(iTracks);
979 Error("ReadEventAOD", "Could not receive track %d", iTracks);
983 AliVParticle *vtrack = fAODEvent->GetTrack(iTracks);
985 //use only tracks from primaries
986 if(fAnalysePrimOnly){
987 if(vtrack->GetLabel()<0)continue;
988 if(!(static_cast<AliAODMCParticle*>(mcArray->At(vtrack->GetLabel()))->IsPhysicalPrimary()))continue;
991 if(track->TestFilterBit(fFilterBit) && TMath::Abs(track->Eta())<fEtaCut
992 && track->Pt()>fPtMin && track->Pt()<fPtMax){
996 // Printf("dca= %f", track->DCA());
997 //save track properties in vector
998 ptArray.push_back(track->Pt());
999 etaArray.push_back(track->Eta());
1000 phiArray.push_back(track->Phi());
1001 chargeArray.push_back(track->Charge());
1002 fHistPt->Fill(track->Pt());
1006 //need to check this option for MC
1007 if(nAcceptedTracks==0) return 0;
1011 Int_t ntrackletsAccept=0;
1012 AliAODTracklets * mult= (AliAODTracklets*)fAODEvent->GetTracklets();
1013 for(Int_t i=0;i<mult->GetNumberOfTracklets();++i){
1014 if(TMath::Abs(mult->GetDeltaPhi(i))<0.05 && TMath::Abs(TMath::Log(TMath::Tan(0.5 * mult->GetTheta(i))))<fEtaCut){
1020 nTracksTracklets.push_back(nAcceptedTracks);
1021 nTracksTracklets.push_back(ntrackletsAccept);
1022 nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis
1023 //where here also neutral particles are counted.
1027 if(step==5 || step==2)fNRecAccept = nAcceptedTracks; // needed for MC case //step5 = TrigVtxRecNrec
1028 return fNRecAccept; // at the moment, always return reconstructed multiplicity
1032 //________________________________________________________________________
1033 Int_t AliAnalysisTaskMinijet::ReadEventAODRecMcProp( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
1034 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
1035 vector<Int_t> &nTracksTracklets, const Int_t step)
1037 // gives back the number of AOD tracks and pointer to arrays with track
1038 // properties (pt, eta, phi)
1044 chargeArray.clear();
1045 nTracksTracklets.clear();
1048 // Retreive the number of tracks for this event.
1049 Int_t ntracks = fAODEvent->GetNumberOfTracks();
1050 if(fDebug>1) Printf("AOD tracks: %d", ntracks);
1053 //get array of mc particles
1054 TClonesArray *mcArray = (TClonesArray*)fAODEvent->
1055 FindListObject(AliAODMCParticle::StdBranchName());
1057 Printf("No MC particle branch found");
1061 AliAODVertex* vtx= (AliAODVertex*)fAODEvent->GetPrimaryVertexSPD();//GetPrimaryVertex()
1062 Double_t vzAOD=vtx->GetZ();
1063 fVertexZ[step]->Fill(vzAOD);
1065 Int_t nAcceptedTracks=0;
1066 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
1067 AliAODTrack *track = (AliAODTrack *)fAODEvent->GetTrack(iTracks);
1069 AliVParticle *vtrack = fAODEvent->GetTrack(iTracks);
1072 Error("ReadEventAODRecMcProp", "Could not receive track %d", iTracks);
1076 //use only tracks from primaries
1077 if(fAnalysePrimOnly){
1078 if(vtrack->GetLabel()<0)continue;
1079 if(!(static_cast<AliAODMCParticle*>(mcArray->At(vtrack->GetLabel()))->IsPhysicalPrimary()))continue;
1082 if(track->TestFilterBit(fFilterBit) && TMath::Abs(track->Eta())<fEtaCut &&
1083 track->Pt()>fPtMin && track->Pt()<fPtMax){
1087 //save track properties in vector
1088 if(vtrack->GetLabel()<0){ //fake tracks
1089 // Printf("Fake track");
1091 ptArray.push_back(track->Pt());
1092 etaArray.push_back(track->Eta());
1093 phiArray.push_back(track->Phi());
1094 chargeArray.push_back(track->Charge());
1096 else{//mc properties
1097 AliAODMCParticle *partOfTrack = (AliAODMCParticle*)mcArray->At(vtrack->GetLabel());
1099 ptArray.push_back(partOfTrack->Pt());
1100 etaArray.push_back(partOfTrack->Eta());
1101 phiArray.push_back(partOfTrack->Phi());
1102 chargeArray.push_back(vtrack->Charge());//partOfTrack?
1107 //need to check this option for MC
1108 if(nAcceptedTracks==0) return 0;
1111 Int_t ntrackletsAccept=0;
1112 AliAODTracklets * mult= (AliAODTracklets*)fAODEvent->GetTracklets();
1113 for(Int_t i=0;i<mult->GetNumberOfTracklets();++i){
1114 if(TMath::Abs(mult->GetDeltaPhi(i))<0.05 && TMath::Abs(TMath::Log(TMath::Tan(0.5 * mult->GetTheta(i))))<fEtaCut ){
1120 nTracksTracklets.push_back(nAcceptedTracks);
1121 nTracksTracklets.push_back(ntrackletsAccept);
1122 nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis
1123 //where here also neutral particles are counted.
1127 AliAODMCHeader *aodMCheader = (AliAODMCHeader *) fAODEvent->
1128 FindListObject(AliAODMCHeader::StdBranchName());
1129 Float_t vzMC = aodMCheader->GetVtxZ();
1132 return fNRecAccept;//this is the rec value from step 5
1138 //________________________________________________________________________
1139 Int_t AliAnalysisTaskMinijet::ReadEventAODMC( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
1140 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
1141 vector<Int_t> &nTracksTracklets, const Int_t step)
1143 // gives back the number of AOD MC particles and pointer to arrays with particle
1144 // properties (pt, eta, phi)
1149 chargeArray.clear();
1150 nTracksTracklets.clear();
1153 AliAODMCHeader *aodMCheader = (AliAODMCHeader *) fAODEvent->
1154 FindListObject(AliAODMCHeader::StdBranchName());
1155 Float_t vzMC = aodMCheader->GetVtxZ();
1156 fVertexZ[step]->Fill(vzMC);
1159 //retreive MC particles from event
1160 TClonesArray *mcArray = (TClonesArray*)fAODEvent->
1161 FindListObject(AliAODMCParticle::StdBranchName());
1163 Printf("No MC particle branch found");
1167 Int_t ntracks = mcArray->GetEntriesFast();
1168 if(fDebug>1)Printf("MC particles: %d", ntracks);
1171 // Track loop: chek how many particles will be accepted
1173 Int_t nChargedPrim=0;
1175 Int_t nPseudoTracklets=0;
1176 for (Int_t it = 0; it < ntracks; it++) {
1177 AliAODMCParticle *track = (AliAODMCParticle*)mcArray->At(it);
1179 Error("ReadEventAODMC", "Could not receive particle %d", it);
1183 if(!SelectParticlePlusCharged(
1186 track->IsPhysicalPrimary()
1191 if(TMath::Abs(track->Eta())<fEtaCut && track->Pt()>0.0)++nPseudoTracklets; //0.035
1192 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue;
1195 if(track->Charge()!=0) nChargedPrim++;
1200 if(nAllPrim==0) return 0;
1201 if(nChargedPrim==0) return 0;
1203 //generate array with size of number of accepted tracks
1204 fChargedPi0->Fill(nAllPrim,nChargedPrim);
1207 // Track loop: fill arrays for accepted tracks
1208 // Int_t iChargedPrim=0;
1209 for (Int_t it = 0; it < ntracks; it++) {
1210 AliAODMCParticle *track = (AliAODMCParticle*)mcArray->At(it);
1212 Error("ReadEventAODMC", "Could not receive particle %d", it);
1219 track->IsPhysicalPrimary()
1224 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue;
1226 fHistPtMC->Fill(track->Pt());
1227 ptArray.push_back(track->Pt());
1228 etaArray.push_back(track->Eta());
1229 phiArray.push_back(track->Phi());
1230 chargeArray.push_back(track->Charge());
1233 nTracksTracklets.push_back(nChargedPrim);
1234 nTracksTracklets.push_back(nPseudoTracklets);
1235 if(fSelectParticles!=2){
1236 nTracksTracklets.push_back(nAllPrim);
1239 nTracksTracklets.push_back(nAllPrim-nChargedPrim); // only neutral
1245 fNMcPrimAccept = nChargedPrim;
1246 if(step==1){ // step 1 = Trig All Mc Nmc
1247 fNmcNch->Fill( fNMcPrimAccept,fNRecAccept);
1248 fPNmcNch->Fill(fNMcPrimAccept,fNRecAccept);
1250 return fNRecAccept; // rec value from step 5 or step 2
1255 //________________________________________________________________________
1256 void AliAnalysisTaskMinijet::Analyse(const vector<Float_t> &pt,
1257 const vector<Float_t> &eta,
1258 const vector<Float_t> &phi,
1259 const vector<Short_t> &charge,
1260 const Int_t ntracksCharged,
1261 const Int_t ntracklets,
1266 // analyse track properties (comming from either ESDs or AODs) in order to compute
1267 // mini jet activity (chared tracks) as function of charged multiplicity
1272 Printf("Analysis Step=%d", step);
1274 Printf("nAll=%d",nAll);
1275 Printf("nCharged=%d",ntracksCharged);
1276 for (Int_t i = 0; i < nAll; i++) {
1277 Printf("pt[%d]=%f",i,pt[i]);
1282 //calculation of mean pt for all tracks in case of step==0
1283 if(step==5 || step ==2){ // rec step
1285 Double_t leadingPt=0.;
1286 for (Int_t i = 0; i < nAll; i++) {
1287 if(pt[i]<0.01)continue;
1289 if(leadingPt<pt[i])leadingPt=pt[i];
1293 fLeadingPtRec=leadingPt;
1296 Double_t propEvent[4] = {ntracksCharged,fVzEvent,fMeanPtRec, fLeadingPtRec}; //vz: {rec, mc, mc}, meanPt and Nrec is always rec value
1297 fMapEvent[step]->Fill(propEvent);
1299 fNcharge[step]->Fill(ntracksCharged);
1301 Float_t ptEventAxis=0; // pt event axis
1302 Float_t etaEventAxis=0; // eta event axis
1303 Float_t phiEventAxis=0; // phi event axis
1304 Short_t chargeEventAxis=0; // charge event axis
1306 Float_t ptOthers = 0; // pt others // for all other tracks around event axis -> see loop
1307 Float_t etaOthers = 0; // eta others
1308 Float_t phiOthers = 0; // phi others
1309 Short_t chargeOthers = 0; // charge others
1311 Int_t *pindexInnerEta = new Int_t [nAll+1];
1312 Float_t *ptInnerEta = new Float_t[nAll+1];
1316 for (Int_t i = 0; i < nAll; i++) {
1318 if(pt[i]<0.01)continue;
1320 //fill single particle correction for first step of pair correction
1321 Double_t propAll[3] = {eta[i],pt[i],ntracksCharged };
1322 fMapAll[step]->Fill(propAll);
1325 //filling of simple check plots
1326 if(pt[i]<0.7) continue;
1327 fPt[step] -> Fill( pt[i]);
1328 fEta[step] -> Fill(eta[i]);
1329 fPhi[step] -> Fill(phi[i]);
1330 fPhiEta[step]-> Fill(phi[i], eta[i]);
1332 pindexInnerEta[i]=0; //set all values to zero
1333 //fill new array for eta check
1334 ptInnerEta[i]= pt[i];
1340 // define event axis: leading or random track (with pt>fTriggerPtCut)
1341 // ---------------------------------------
1342 Int_t highPtTracks=0;
1343 Int_t highPtTracksInnerEta=0;
1344 // Double_t highPtTracksInnerEtaCorr=0;
1347 //count high pt tracks and high pt tracks in acceptance for seeds
1348 for(Int_t i=0;i<nAll;i++){
1350 if(pt[i]<0.01)continue;
1352 if(TMath::Abs(eta[i])<0.9){
1356 if(pt[i]>fTriggerPtCut) {
1360 // seed should be place in middle of acceptance, that complete cone is in acceptance
1361 if(pt[i]>fTriggerPtCut && TMath::Abs(eta[i])<fEtaCutSeed && charge[i]!=0){
1363 // Printf("eta=%f", eta[i]);
1364 highPtTracksInnerEta++;
1373 //sort array in order to get highest pt tracks first
1374 //index can be computed with pindexInnerEta[number]
1375 if(nAll) TMath::Sort(nAll, ptInnerEta, pindexInnerEta, kTRUE);
1377 // plot of multiplicity distributions
1378 fNch07Nch[step]->Fill(ntracksCharged, highPtTracksInnerEta);
1379 fPNch07Nch[step]->Fill(ntracksCharged, highPtTracksInnerEta);
1382 fNch07Tracklet[step]->Fill(ntracklets, highPtTracksInnerEta);//only counts tracks which can be used as seeds
1383 fNchTracklet[step]->Fill(ntracklets, ntracksCharged);
1384 fPNch07Tracklet[step]->Fill(ntracklets, highPtTracksInnerEta);//only counts tracks which can be used as seeds
1387 //analysis can only be performed with event axis, defined by high pt track
1390 if(highPtTracks>0 && highPtTracksInnerEta>0){
1392 // build pairs in two track loops
1393 // loop over all possible trigger particles (defined by pt_trig and eta_acceptance)
1394 for(Int_t axis=0;(axis<nAll) && (pt[pindexInnerEta[axis]]>=fTriggerPtCut); axis++){
1396 //EventAxisRandom track properties
1397 ptEventAxis = pt [pindexInnerEta[axis]];
1398 etaEventAxis = eta[pindexInnerEta[axis]];
1399 phiEventAxis = phi[pindexInnerEta[axis]];
1400 chargeEventAxis = charge[pindexInnerEta[axis]];
1401 fPtSeed[step] -> Fill( ptEventAxis);
1402 fEtaSeed[step] -> Fill(etaEventAxis);
1403 fPhiSeed[step] -> Fill(phiEventAxis);
1406 Double_t prop[3] = {etaEventAxis,ptEventAxis,ntracksCharged };
1407 fMapSingleTrig[step]->Fill(prop);
1410 for (Int_t iTrack = axis+1; iTrack < nAll; iTrack++) {
1412 if(pt[pindexInnerEta[iTrack]]<fAssociatePtCut) continue;
1414 if(fSelectParticlesAssoc==1){
1415 if(charge[pindexInnerEta[iTrack]]==0)continue;
1417 if(fSelectParticlesAssoc==2){
1418 if(charge[pindexInnerEta[iTrack]]!=0)continue;
1422 ptOthers = pt [pindexInnerEta[iTrack]];
1423 etaOthers = eta[pindexInnerEta[iTrack]];
1424 phiOthers = phi[pindexInnerEta[iTrack]];
1425 chargeOthers = charge[pindexInnerEta[iTrack]];
1428 //plot only properties of tracks with pt>ptassoc
1429 fPtOthers[step] -> Fill( ptOthers);
1430 fEtaOthers[step] -> Fill(etaOthers);
1431 fPhiOthers[step] -> Fill(phiOthers);
1432 fPtEtaOthers[step] -> Fill(ptOthers, etaOthers);
1434 // if(fDebug>2)Printf("%f, %f", pt[pindexInnerEta[axis]], pt[pindexInnerEta[iTrack]]);
1436 Float_t dPhi = phiOthers-phiEventAxis;
1437 if(dPhi>1.5*TMath::Pi()) dPhi = dPhi-2*TMath::Pi();
1438 else if(dPhi<-0.5*TMath::Pi())dPhi=dPhi+2*TMath::Pi();
1439 Float_t dEta=etaOthers-etaEventAxis;
1442 fDPhiDEtaEventAxis[step]->Fill(dPhi, dEta);
1443 fDPhiEventAxis[step]->Fill(dPhi);
1446 if(ptEventAxis< 0.4 || ptEventAxis > 100) Printf("particles out of range pt");
1447 if(ntracksCharged<0 || ntracksCharged>150) Printf("particles out of range ncharge");
1448 if(TMath::Abs(dEta)>2*fEtaCut) {
1449 Printf("particles out of range dEta");
1450 Printf("eta1=%f, eta2=%f", etaOthers, etaEventAxis);
1451 Printf("step=%d",step);
1453 if(dPhi<-0.5*TMath::Pi() || dPhi>1.5*TMath::Pi()){
1454 Printf("particles out of range dPhi");
1455 Printf("phi1=%f, phi2=%f", phiOthers, phiEventAxis);
1458 Bool_t isLikeSign = CheckLikeSign(chargeEventAxis, chargeOthers);
1460 Double_t prop6[6] = {ptEventAxis,ptOthers,dEta,dPhi,ntracksCharged, isLikeSign };
1461 fMapPair[step]->Fill(prop6);
1463 }// end of inner track loop
1465 } //end of outer track loop
1467 fTriggerNch[step]->Fill(ntracksCharged,highPtTracksInnerEta);
1468 fTriggerNchSeeds[step]->Fill(ntracksCharged,highPtTracksInnerEta);
1469 fTriggerTracklet[step]->Fill(ntracklets);
1472 }//if there is at least one high pt track
1475 if(pindexInnerEta){// clean up array memory used for TMath::Sort
1476 delete[] pindexInnerEta;
1480 if(ptInnerEta){// clean up array memory used for TMath::Sort
1481 delete[] ptInnerEta;
1489 //________________________________________________________________________
1490 void AliAnalysisTaskMinijet::Terminate(Option_t*)
1492 //terminate function is called at the end
1493 //can be used to draw histograms etc.
1498 //________________________________________________________________________
1499 Bool_t AliAnalysisTaskMinijet::SelectParticlePlusCharged(const Short_t charge, const Int_t pdg, Bool_t prim)
1501 //selection of mc particle
1502 //fSelectParticles=0: use charged primaries and pi0 and k0
1503 //fSelectParticles=1: use only charged primaries
1504 //fSelectParticles=2: use only pi0 and k0
1506 if(fSelectParticles==0 || fSelectParticles==2){ // in case of 2: need to count also charged particles
1508 if(!(pdg==111||pdg==130||pdg==310))
1517 else if(fSelectParticles==1){
1518 if (charge==0 || !prim){
1524 Printf("Error: wrong selection of charged/pi0/k0");
1532 //________________________________________________________________________
1533 Bool_t AliAnalysisTaskMinijet::SelectParticle(const Short_t charge, const Int_t pdg, const Bool_t prim)
1535 //selection of mc particle
1536 //fSelectParticles=0: use charged primaries and pi0 and k0
1537 //fSelectParticles=1: use only charged primaries
1538 //fSelectParticles=2: use only pi0 and k0
1540 if(fSelectParticles==0){
1542 if(!(pdg==111||pdg==130||pdg==310))
1550 else if (fSelectParticles==1){
1551 if (charge==0 || !prim){
1555 else if(fSelectParticles==2){
1556 if(!(pdg==111||pdg==130||pdg==310))
1564 //________________________________________________________________________
1565 Bool_t AliAnalysisTaskMinijet::CheckEvent(const Bool_t recVertex)
1567 // This function tests the quality of an event (ESD/AOD) (rec and/or mc part)
1568 // recVertex=false: check if Mc events and stack is there, Nmc>0
1569 // recVertex=false: " + check if there is a good, reconstructed SPD vertex
1570 // defined by |z|<fVertexCut(10cm), Contributer>0, no PileUpFromSPD(3,0,8)
1579 AliMCEvent *mcEvente = (AliMCEvent*) MCEvent();
1581 Error("CheckEvent", "Could not retrieve MC event");
1586 AliStack* stackg = MCEvent()->Stack();
1587 if(!stackg) return false;
1588 Int_t ntracksg = mcEvente->GetNumberOfTracks();
1589 if(ntracksg<0) return false;
1592 //AliGenEventHeader* headerg = MCEvent()->GenEventHeader();
1594 //headerg->PrimaryVertex(mcVg);
1595 // if(TMath::Abs(mcVg[0])<1e-8 && TMath::Abs(mcVg[0])<1e-8 &&
1596 // TMath::Abs(mcVg[0])<1e-8) return false;
1597 // Float_t vzMCg = mcVg[2];
1598 // if(TMath::Abs(vzMCg)>fVertexZCut) return false;
1602 if(recVertex==true){
1603 if(fESDEvent->IsPileupFromSPD(3,0,8))return false;
1606 // const AliESDVertex* vertexESDg = fESDEvent->GetPrimaryVertex(); // uses track or SPD vertexer
1607 // if(!vertexESDg) return false;
1608 // if(vertexESDg->GetNContributors()<=0)return false;
1609 // Float_t fVzg= vertexESDg->GetZ();
1610 // if(TMath::Abs(fVzg)>fVertexZCut) return false;
1613 const AliESDVertex *vtxSPD = fESDEvent->GetPrimaryVertexSPD();
1614 if(!vtxSPD) return false;
1615 if(vtxSPD->GetNContributors()<=0)return false;
1616 Float_t fVzSPD= vtxSPD->GetZ();
1617 if(TMath::Abs(fVzSPD)>fVertexZCut) return false;
1624 else if(fMode==1){ //aod
1628 // AliAODMCHeader *aodMCheader = (AliAODMCHeader *) fAODEvent->
1629 // FindListObject(AliAODMCHeader::StdBranchName());
1630 // Float_t vzMC = aodMCheader->GetVtxZ();
1631 // if(TMath::Abs(vzMC)>fVertexZCut) return false;
1633 //retreive MC particles from event
1634 TClonesArray *mcArray = (TClonesArray*)fAODEvent->
1635 FindListObject(AliAODMCParticle::StdBranchName());
1637 Printf("No MC particle branch found");
1643 if(recVertex==true){
1644 if(fAODEvent->IsPileupFromSPD(3,0.8))return false;
1646 // AliAODVertex* vertex= (AliAODVertex*)fAODEvent->GetPrimaryVertex();
1647 // if(!vertex) return false;
1648 // if(vertex->GetNContributors()<=0) return false;
1649 // Double_t vzAOD=vertex->GetZ();
1650 // if(TMath::Abs(vzAOD)<1e-9) return false;
1651 // if(TMath::Abs(vzAOD)>fVertexZCut) return false;
1653 AliAODVertex* vertexSPD= (AliAODVertex*)fAODEvent->GetPrimaryVertexSPD();
1654 if(!vertexSPD) return false;
1655 if(vertexSPD->GetNContributors()<=0) return false;
1656 Double_t vzSPD=vertexSPD->GetZ();
1657 //if(TMath::Abs(vzSPD)<1e-9) return false;
1658 if(TMath::Abs(vzSPD)>fVertexZCut) return false;
1665 Printf("Wrong mode!");
1671 //_____________________________________________________________________________
1672 const Double_t * AliAnalysisTaskMinijet::CreateLogAxis(const Int_t nbins,
1673 const Double_t xmin,
1674 const Double_t xmax)
1676 // returns pointer to an array with can be used to build a logarithmic axis
1677 // it is user responsibility to delete the array
1679 Double_t logxmin = TMath::Log10(xmin);
1680 Double_t logxmax = TMath::Log10(xmax);
1681 Double_t binwidth = (logxmax-logxmin)/nbins;
1683 Double_t *xbins = new Double_t[nbins+1];
1686 for (Int_t i=1;i<=nbins;i++) {
1687 xbins[i] = xmin + TMath::Power(10,logxmin+i*binwidth);
1693 //_____________________________________________________________________________
1694 Bool_t AliAnalysisTaskMinijet::CheckLikeSign(const Short_t chargeEventAxis,
1695 const Short_t chargeOthers)
1697 // compute if charge of two particles/tracks has same sign or different sign
1699 if(fDebug>2) Printf("Charge1=%d, Charge2=%d",chargeEventAxis,chargeOthers);
1701 if(chargeEventAxis<0){
1705 else if(chargeOthers>0){
1710 else if(chargeEventAxis>0){
1714 else if(chargeOthers<0){
1720 Printf("Error: Charge not lower nor higher as zero");
1724 Printf("Error: Check values of Charge");