11 #include "AliVEvent.h"
12 #include "AliVParticle.h"
14 #include "AliESDEvent.h"
15 #include "AliESDtrack.h"
16 #include "AliMultiplicity.h"
17 #include "AliESDtrackCuts.h"
19 #include "AliAODEvent.h"
20 #include "AliAODTrack.h"
21 #include "AliAODMCParticle.h"
24 #include "AliMCEvent.h"
25 #include "AliMCParticle.h"
26 #include "AliGenEventHeader.h"
28 #include "AliAnalysisManager.h"
30 #include "AliAnalysisTaskMinijet.h"
32 // Analysis Task for mini jet activity analysis
33 // Authors: Eva Sicking
35 ClassImp(AliAnalysisTaskMinijet)
37 //________________________________________________________________________
38 AliAnalysisTaskMinijet::AliAnalysisTaskMinijet(const char *name)
39 : AliAnalysisTaskSE(name),
60 for(Int_t i = 0;i< 4;i++){
73 fDPhiDEtaEventAxis[i] = 0;
75 fTriggerTracklet[i] = 0;
79 fNch07Tracklet[i] = 0;
81 pNch07Tracklet[i] = 0;
82 for(Int_t j=0;j<150;j++){
83 fDPhiEventAxisNchBin[i][j] = 0;
84 fDPhiEventAxisNchBinTrig[i][j] = 0;
86 fDPhiEventAxisTrackletBin[i][j] = 0;
87 fDPhiEventAxisTrackletBinTrig[i][j] = 0;
90 DefineOutput(1, TList::Class());
93 //________________________________________________________________________
94 AliAnalysisTaskMinijet::~AliAnalysisTaskMinijet()
98 if (fHists && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fHists;
101 //________________________________________________________________________
102 void AliAnalysisTaskMinijet::UserCreateOutputObjects()
106 if(fDebug) Printf("In User Create Output Objects.");
108 fHistPt = new TH1F("fHistPt", "P_{T} distribution REC", 15, 0.1, 3.1);
109 fHistPt->GetXaxis()->SetTitle("P_{T} (GeV/c)");
110 fHistPt->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
111 fHistPt->SetMarkerStyle(kFullCircle);
115 fHistPtMC = new TH1F("fHistPtMC", "P_{T} distribution MC", 15, 0.1, 3.1);
116 fHistPtMC->GetXaxis()->SetTitle("P_{T} (GeV/c)");
117 fHistPtMC->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
118 fHistPtMC->SetMarkerStyle(kFullCircle);
121 fChargedPi0 = new TH2F("fChargedPi0", "fChargedPi0", 200, -0.5, 199.5, 200, -0.5, 199.5);
123 TString labels[4]={"ESDrec", "ESDmc", "AODrec", "AODmc"};
125 for(Int_t i=2*fMode+fMcOnly;i<1+2*fMode+fUseMC;i++){
127 fVertexZ[i] = new TH1F(Form("fVertexZ%s",labels[i].Data()),
128 Form("fVertexZ%s",labels[i].Data()) ,
130 fPt[i] = new TH1F(Form("fPt%s",labels[i].Data()),
131 Form("fPt%s",labels[i].Data()) ,
133 fEta[i] = new TH1F (Form("fEta%s",labels[i].Data()),
134 Form("fEta%s",labels[i].Data()) ,
136 fPhi[i] = new TH1F(Form("fPhi%s",labels[i].Data()),
137 Form("fPhi%s",labels[i].Data()) ,
138 360, 0.,2*TMath::Pi());
140 fPtSeed[i] = new TH1F(Form("fPSeedt%s",labels[i].Data()),
141 Form("fPtSeed%s",labels[i].Data()) ,
143 fEtaSeed[i] = new TH1F (Form("fEtaSeed%s",labels[i].Data()),
144 Form("fEtaSeed%s",labels[i].Data()) ,
146 fPhiSeed[i] = new TH1F(Form("fPhiSeed%s",labels[i].Data()),
147 Form("fPhiSeed%s",labels[i].Data()) ,
148 360, 0.,2*TMath::Pi());
150 fPhiEta[i] = new TH2F(Form("fPhiEta%s",labels[i].Data()),
151 Form("fPhiEta%s",labels[i].Data()) ,
152 180, 0., 2*TMath::Pi(), 100, -1.,1.);
153 fDPhiDEtaEventAxis[i] = new TH2F(Form("fDPhiDEtaEventAxis%s",labels[i].Data()),
154 Form("fDPhiDEtaEventAxis%s",labels[i].Data()) ,
155 180, -1., 2*TMath::Pi()-1, 200, -2.,2.);
156 fTriggerNch[i] = new TH1F(Form("fTriggerNch%s",labels[i].Data()),
157 Form("fTriggerNch%s",labels[i].Data()) ,
159 fTriggerTracklet[i] = new TH1F(Form("fTriggerTracklet%s",labels[i].Data()),
160 Form("fTriggerTracklet%s",labels[i].Data()) ,
162 fNch07Nch[i] = new TH2F(Form("fNch07Nch%s",labels[i].Data()),
163 Form("fNch07Nch%s",labels[i].Data()) ,
164 250, -2.5, 247.5,250, -2.5, 247.5);
165 pNch07Nch[i] = new TProfile(Form("pNch07Nch%s",labels[i].Data()),
166 Form("pNch07Nch%s",labels[i].Data()) ,
168 fNch07Tracklet[i] = new TH2F(Form("fNch07Tracklet%s",labels[i].Data()),
169 Form("fNch07Tracklet%s",labels[i].Data()) ,
170 250, -2.5, 247.5,250, -2.5, 247.5);
171 fNchTracklet[i] = new TH2F(Form("fNchTracklet%s",labels[i].Data()),
172 Form("fNchTracklet%s",labels[i].Data()) ,
173 250, -2.5, 247.5,250, -2.5, 247.5);
174 pNch07Tracklet[i] = new TProfile(Form("pNch07Tracklet%s",labels[i].Data()),
175 Form("pNch07Tracklet%s",labels[i].Data()) ,
177 for(Int_t j=0;j<150;j++){
178 fDPhiEventAxisNchBin[i][j] = new TH1F(Form("fDPhiEventAxisNchBin%s%02d",
180 Form("fDPhiEventAxisNchBin%s%02d",
181 labels[i].Data(),j) ,
182 180, 0., TMath::Pi());
183 fDPhiEventAxisNchBinTrig[i][j] = new TH1F(Form("fDPhiEventAxisNchBinTrig%s%02d",
185 Form("fDPhiEventAxisNchBinTrig%s%02d",
186 labels[i].Data(),j) ,
187 180, 0., TMath::Pi());
189 fDPhiEventAxisTrackletBin[i][j] = new TH1F(Form("fDPhiEventAxisTrackletBin%s%02d",
191 Form("fDPhiEventAxisTrackletBin%s%02d",
192 labels[i].Data(),j) ,
193 180, 0., TMath::Pi());
194 fDPhiEventAxisTrackletBinTrig[i][j] = new TH1F(Form("fDPhiEventAxisTrackletBinTrig%s%02d",
196 Form("fDPhiEventAxisTrackletBinTrig%s%02d",
197 labels[i].Data(),j) ,
198 180, 0., TMath::Pi());
202 fHists = new TList();
205 fHists->Add(fHistPt);
206 if(fUseMC)fHists->Add(fHistPtMC);
207 fHists->Add(fChargedPi0);
209 for(Int_t i=2*fMode+fMcOnly;i<1+2*fMode+fUseMC;i++){
210 fHists->Add(fVertexZ[i]);
212 fHists->Add(fEta[i]);
213 fHists->Add(fPhi[i]);
214 fHists->Add(fPtSeed[i]);
215 fHists->Add(fEtaSeed[i]);
216 fHists->Add(fPhiSeed[i]);
217 fHists->Add(fPhiEta[i]);
218 fHists->Add(fDPhiDEtaEventAxis[i]);
219 fHists->Add(fTriggerNch[i]);
220 fHists->Add(fTriggerTracklet[i]);
221 fHists->Add(fNch07Nch[i]);
222 fHists->Add(pNch07Nch[i]);
223 fHists->Add(fNch07Tracklet[i]);
224 fHists->Add(fNchTracklet[i]);
225 fHists->Add(pNch07Tracklet[i]);
226 for(Int_t j=0;j<150;j++){
227 fHists->Add(fDPhiEventAxisNchBin[i][j]);
228 fHists->Add(fDPhiEventAxisNchBinTrig[i][j]);
230 fHists->Add(fDPhiEventAxisTrackletBin[i][j]);
231 fHists->Add(fDPhiEventAxisTrackletBinTrig[i][j]);
238 //________________________________________________________________________
239 void AliAnalysisTaskMinijet::UserExec(Option_t *)
242 // Called for each event
244 AliVEvent *event = InputEvent();
246 Error("UserExec", "Could not retrieve event");
250 //get events, either ESD or AOD
251 fESDEvent = dynamic_cast<AliESDEvent*> (InputEvent());
252 fAODEvent = dynamic_cast<AliAODEvent*> (InputEvent());
255 //arrays for track properties
259 //number of accepted tracks and tracklets
260 Int_t ntracks = 0; //return value for reading functions for ESD and AOD
261 Int_t *nTracksTracklets = 0; // [0]=nAccepted,1=ntracklets,2=nall(also neutral in case of mc,
262 //for real nall=ncharged)
265 //read data and analyse. Implemented for ESD, ESDmc, AOD, AODmc
266 //-------------------------------------------------------------
267 if (fESDEvent && fMode==0) {//ESDs
268 //ESD reading and analysis
271 ntracks = LoopESD(&pt, &eta, &phi, &nTracksTracklets); //read tracks
274 Printf("ntracks=%d", nTracksTracklets[0]);
275 Printf("ntracklets=%d", nTracksTracklets[1]);
277 Analyse(pt, eta, phi, ntracks, nTracksTracklets[1], nTracksTracklets[2], 0); //analyse tracks
279 CleanArrays(pt, eta, phi, nTracksTracklets); // clean up array memory
283 //ESD MC reading and analysis
286 ntracks = LoopESDMC(&pt, &eta, &phi, &nTracksTracklets); //read mc particles
288 Analyse(pt, eta, phi, ntracks, nTracksTracklets[1], nTracksTracklets[2], 1);//analyse
290 CleanArrays(pt, eta, phi, nTracksTracklets);// clean up array memory
295 if (fAODEvent && fMode==1) {//AODs
297 //AOD reading and analysis
300 ntracks = LoopAOD(&pt, &eta, &phi, &nTracksTracklets);//read tracks
303 Printf("ntracks=%d", nTracksTracklets[0]);
304 Printf("ntracklets=%d", nTracksTracklets[1]);
306 Analyse(pt, eta, phi, ntracks, nTracksTracklets[1], nTracksTracklets[2], 2);//analyse
308 CleanArrays(pt, eta, phi, nTracksTracklets);// clean up array memory
312 //AOD MCreading and analysis
315 ntracks = LoopAODMC(&pt, &eta, &phi, &nTracksTracklets);//read tracks
317 Analyse(pt, eta, phi, ntracks, nTracksTracklets[1],nTracksTracklets[2], 3);//analyse
319 CleanArrays(pt, eta, phi, nTracksTracklets);// clean up array memory
323 //-------------------------------------------------------------
327 // PostData(1, fHists);
332 //________________________________________________________________________
333 Int_t AliAnalysisTaskMinijet::LoopESD(Float_t **ptArray, Float_t ** etaArray,
334 Float_t ** phiArray, Int_t **nTracksTracklets )
336 // gives back the number of esd tracks and pointer to arrays with track
337 // properties (pt, eta, phi)
339 // Retreive the number of all tracks for this event.
340 Int_t ntracks = fESDEvent->GetNumberOfTracks();
341 if(fDebug)Printf("all ESD tracks: %d", ntracks);
344 //first loop to check how many tracks are accepted
346 Int_t nAcceptedTracks=0;
347 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
348 AliESDtrack *track = (AliESDtrack *)fESDEvent->GetTrack(iTracks);
350 Error("UserExec", "Could not receive track %d", iTracks);
353 if (fCuts->AcceptTrack(track) && TMath::Abs(track->Eta())<fEtaCut) ++nAcceptedTracks;
358 *ptArray = new Float_t[nAcceptedTracks];
359 *etaArray = new Float_t[nAcceptedTracks];
360 *phiArray = new Float_t[nAcceptedTracks];
361 *nTracksTracklets = new Int_t[2]; //ntracksAccepted, ntracklets
363 //check if event is pile up or no tracks are accepted, return to user exec
364 // if(fESDEvent->IsPileupFromSPD(3,0,8)) return 0;
365 if(nAcceptedTracks==0) return 0;
367 //accept event only, if vertex is good and is within fVertexZcut region
368 const AliESDVertex* vertexESD = fESDEvent->GetPrimaryVertex();
369 if(vertexESD->GetNContributors()==0)return 0;
370 Float_t fVz= vertexESD->GetZ();
371 if(TMath::Abs(fVz)>fVertexZCut) return 0;
372 fVertexZ[0]->Fill(fVz);
376 Int_t iAcceptedTrack=0;
377 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
378 AliESDtrack *track = (AliESDtrack *)fESDEvent->GetTrack(iTracks);
380 Error("UserExec", "Could not receive track %d", iTracks);
383 if (fCuts->AcceptTrack(track) && TMath::Abs(track->Eta())<fEtaCut){
384 (*ptArray)[iAcceptedTrack] = track->Pt();
385 (*etaArray)[iAcceptedTrack] = track->Eta();
386 (*phiArray)[iAcceptedTrack++] = track->Phi();
387 fHistPt->Fill(track->Pt());
393 Int_t ntrackletsAccept=0;
394 AliMultiplicity * mult = (AliMultiplicity*)(fESDEvent->GetMultiplicity());
395 Int_t ntracklets = mult->GetNumberOfTracklets();
396 for(Int_t i=0;i< ntracklets;i++){
397 if(mult->GetDeltaPhi(i)<0.05){
402 (*nTracksTracklets)[0] = nAcceptedTracks;
403 (*nTracksTracklets)[1] = ntrackletsAccept;
404 (*nTracksTracklets)[2] = nAcceptedTracks;//in order to be compatible with mc analysis
405 //where here also neutral particles are counted.
407 return nAcceptedTracks;
411 //________________________________________________________________________
412 Int_t AliAnalysisTaskMinijet::LoopESDMC(Float_t **ptArray, Float_t ** etaArray,
413 Float_t ** phiArray, Int_t ** nTracksTracklets)
415 // gives back the number of charged prim MC particle and pointer to arrays
416 // with particle properties (pt, eta, phi)
418 // Printf("Event starts: Loop ESD MC");
420 AliMCEvent *mcEvent = (AliMCEvent*) MCEvent();
422 Error("UserExec", "Could not retrieve MC event");
426 AliStack* stack = 0x0;
427 if(fUseMC) stack = MCEvent()->Stack();
429 Int_t ntracks = mcEvent->GetNumberOfTracks();
430 if(fDebug)Printf("MC particles: %d", ntracks);
433 //----------------------------------
434 //first track loop to check how many chared primary tracks are available
435 Int_t nChargedPrimaries=0;
436 Int_t nAllPrimaries=0;
438 Int_t nPseudoTracklets=0;
439 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
440 AliMCParticle *track = dynamic_cast<AliMCParticle*>(mcEvent->GetTrack(iTracks));
442 Error("UserExec", "Could not receive track %d", iTracks);
447 if(//count also charged particles in case of fSelectParticles==2 (only neutral)
448 !SelectParticlePlusCharged(
451 stack->IsPhysicalPrimary(track->Label())
457 // Printf("fSelectParticles= %d\n", fSelectParticles);
458 //count number of pseudo tracklets
459 if(TMath::Abs(track->Eta())<=fEtaCut && track->Pt()>0.035) ++nPseudoTracklets;
460 //same cuts as on ESDtracks
461 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<0.2 || track->Pt()>200) continue;
463 //count all primaries
465 //count charged primaries
466 if (track->Charge() != 0) ++nChargedPrimaries;
468 // Printf("PDG=%d, IsPrim=%d", track->PdgCode(),stack->IsPhysicalPrimary(track->Label()) );
472 //----------------------------------
474 // Printf("All in acceptance=%d",nAllPrimaries);
475 // Printf("Charged in acceptance =%d",nChargedPrimaries);
477 fChargedPi0->Fill(nAllPrimaries,nChargedPrimaries);
479 if(fSelectParticles!=2){
480 *ptArray = new Float_t[nAllPrimaries];
481 *etaArray = new Float_t[nAllPrimaries];
482 *phiArray = new Float_t[nAllPrimaries];
485 *ptArray = new Float_t[nAllPrimaries-nChargedPrimaries];
486 *etaArray = new Float_t[nAllPrimaries-nChargedPrimaries];
487 *phiArray = new Float_t[nAllPrimaries-nChargedPrimaries];
490 *nTracksTracklets = new Int_t[3];
492 if(nAllPrimaries==0) return 0;
493 if(nChargedPrimaries==0) return 0;
497 AliGenEventHeader* header = MCEvent()->GenEventHeader();
499 header->PrimaryVertex(mcV);
500 Float_t vzMC = mcV[2];
501 if(TMath::Abs(vzMC)>fVertexZCut) return 0;
502 fVertexZ[1]->Fill(vzMC);
507 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
508 AliMCParticle *track = dynamic_cast<AliMCParticle*>(mcEvent->GetTrack(iTracks));
510 Error("UserExec", "Could not receive track %d", iTracks);
517 stack->IsPhysicalPrimary(track->Label())
523 //same cuts as on ESDtracks
524 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<0.2 || track->Pt()>200) continue;
526 // Printf("After: PDG=%d, IsPrim=%d", track->PdgCode(),stack->IsPhysicalPrimary(track->Label()) );
529 fHistPtMC->Fill(track->Pt());
530 //fills arrays with track properties
531 (*ptArray)[iChargedPiK] = track->Pt();
532 (*etaArray)[iChargedPiK] = track->Eta();
533 (*phiArray)[iChargedPiK++] = track->Phi();
537 (*nTracksTracklets)[0] = nChargedPrimaries;
538 (*nTracksTracklets)[1] = nPseudoTracklets;
539 if(fSelectParticles!=2){
540 (*nTracksTracklets)[2] = nAllPrimaries;
543 (*nTracksTracklets)[2] = nAllPrimaries-nChargedPrimaries; // only neutral
545 return nChargedPrimaries;
549 //________________________________________________________________________
550 Int_t AliAnalysisTaskMinijet::LoopAOD(Float_t **ptArray, Float_t ** etaArray,
551 Float_t ** phiArray, Int_t ** nTracksTracklets)
553 // gives back the number of AOD tracks and pointer to arrays with track
554 // properties (pt, eta, phi)
557 // Retreive the number of tracks for this event.
558 Int_t ntracks = fAODEvent->GetNumberOfTracks();
559 if(fDebug) Printf("AOD tracks: %d", ntracks);
562 Int_t nAcceptedTracks=0;
563 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
564 AliAODTrack *track = (AliAODTrack *)fAODEvent->GetTrack(iTracks);
566 Error("UserExec", "Could not receive track %d", iTracks);
569 if(track->TestFilterBit(16) && TMath::Abs(track->Eta())<fEtaCut) nAcceptedTracks++;
572 *ptArray = new Float_t[nAcceptedTracks];
573 *etaArray = new Float_t[nAcceptedTracks];
574 *phiArray = new Float_t[nAcceptedTracks];
575 *nTracksTracklets = new Int_t[3]; //here, third entry only copy of first (compatibility for MC)
578 if(nAcceptedTracks==0) return 0;
579 AliAODVertex* vertex= (AliAODVertex*)fAODEvent->GetPrimaryVertex();
581 // TODO: need to check how to implement IsPileupFromSPD(3,0.8)
582 // function of esd event
583 // first solution: exclude this call in esd loop for comparison (QA)
585 if(!vertex) return 0;
586 Double_t vzAOD=vertex->GetZ();
587 //if(vertex->GetNContributors()==0) return 0;
588 if(TMath::Abs(vzAOD)<1e-9) return 0;
590 if(TMath::Abs(vzAOD)>fVertexZCut) return 0;
591 fVertexZ[2]->Fill(vzAOD);
593 // Track loop to fill a pT spectrum
594 Int_t iAcceptedTracks=0;
595 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
596 AliAODTrack *track = (AliAODTrack *)fAODEvent->GetTrack(iTracks);
598 Error("UserExec", "Could not receive track %d", iTracks);
601 if(!track->TestFilterBit(16) || TMath::Abs(track->Eta())>fEtaCut) continue;
602 fHistPt->Fill(track->Pt());
604 //fills arrays with track properties
605 (*ptArray)[iAcceptedTracks] = track->Pt();
606 (*etaArray)[iAcceptedTracks] = track->Eta();
607 (*phiArray)[iAcceptedTracks++] = track->Phi();
612 Int_t ntrackletsAccept=0;
613 AliAODTracklets * mult= (AliAODTracklets*)fAODEvent->GetTracklets();
614 for(Int_t i=0;i<mult->GetNumberOfTracklets();++i){
615 if(TMath::Abs(mult->GetDeltaPhi(i))<0.05){
620 (*nTracksTracklets)[0] = nAcceptedTracks;
621 (*nTracksTracklets)[1] = ntrackletsAccept;
622 (*nTracksTracklets)[2] = nAcceptedTracks;
624 return nAcceptedTracks;
628 //________________________________________________________________________
629 Int_t AliAnalysisTaskMinijet::LoopAODMC(Float_t **ptArray, Float_t ** etaArray,
630 Float_t ** phiArray, Int_t ** nTracksTracklets)
632 // gives back the number of AOD MC particles and pointer to arrays with particle
633 // properties (pt, eta, phi)
635 //retreive MC particles from event
636 TClonesArray *mcArray = (TClonesArray*)fAODEvent->
637 FindListObject(AliAODMCParticle::StdBranchName());
639 Printf("%s:%d No MC particle branch found",(char*)__FILE__,__LINE__);
643 Int_t ntracks = mcArray->GetEntriesFast();
644 if(fDebug)Printf("MC particles: %d", ntracks);
647 // Track loop: chek how many particles will be accepted
649 Int_t nChargedPrim=0;
651 Int_t nPseudoTracklets=0;
652 for (Int_t it = 0; it < ntracks; it++) {
653 AliAODMCParticle *track = (AliAODMCParticle*)mcArray->At(it);
655 Error("UserExec", "Could not receive track %d", it);
659 if(//count also charged particles in case of fSelectParticles==2 (only neutral)
660 !SelectParticlePlusCharged(
663 track->IsPhysicalPrimary()
669 if(TMath::Abs(track->Eta())<=fEtaCut && track->Pt()>0.035)++nPseudoTracklets;
670 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<0.2 || track->Pt()>200) continue;
671 // if(TMath::Abs(track->Eta())<1e-9 && TMath::Abs(track->Phi())<1e-9)continue;
673 //same cuts as in ESD filter
674 if(!track->TestBit(16))continue; //cuts set in ESD filter during AOD generation
677 if(track->Charge()!=0) nChargedPrim++;
678 Printf("eta=%f,phi=%f,pt=%f",track->Eta(),track->Phi(),track->Pt());
679 Printf("prim=%d,pdg=%d,charge=%d",track->IsPhysicalPrimary(),track->PdgCode(),track->Charge());
682 if(nAllPrim==1) vzMC= track->Zv(); // check only one time. (only one vertex per event allowed)
685 //generate array with size of number of accepted tracks
686 fChargedPi0->Fill(nAllPrim,nChargedPrim);
688 if(fSelectParticles!=2){
689 *ptArray = new Float_t[nAllPrim];
690 *etaArray = new Float_t[nAllPrim];
691 *phiArray = new Float_t[nAllPrim];
694 *ptArray = new Float_t[nAllPrim-nChargedPrim];
695 *etaArray = new Float_t[nAllPrim-nChargedPrim];
696 *phiArray = new Float_t[nAllPrim-nChargedPrim];
700 *nTracksTracklets = new Int_t[3];
702 // Printf("nAllPrim=%d", nAllPrim);
703 // Printf("nChargedPrim=%d", nChargedPrim);
705 if(nAllPrim==0) return 0;
706 if(nChargedPrim==0) return 0;
709 if(TMath::Abs(vzMC)>fVertexZCut) return 0;
710 fVertexZ[3]->Fill(vzMC);
713 // Track loop: fill arrays for accepted tracks
714 Int_t iChargedPrim=0;
715 for (Int_t it = 0; it < ntracks; it++) {
716 AliAODMCParticle *track = (AliAODMCParticle*)mcArray->At(it);
718 Error("UserExec", "Could not receive track %d", it);
725 track->IsPhysicalPrimary()
731 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<0.2 || track->Pt()>200) continue;
732 //if(TMath::Abs(track->Eta())<1e-8 && TMath::Abs(track->Phi())<1e-8)continue;
734 //if(track->TestBit(16))continue;
736 fHistPtMC->Fill(track->Pt());
737 (*ptArray)[iChargedPrim] = track->Pt();
738 (*etaArray)[iChargedPrim] = track->Eta();
739 (*phiArray)[iChargedPrim++] = track->Phi();
743 (*nTracksTracklets)[0] = nChargedPrim;
744 (*nTracksTracklets)[1] = nPseudoTracklets;
745 (*nTracksTracklets)[2] = nAllPrim;
748 // Printf("ntracks=%d", nChargedPrim);
752 //________________________________________________________________________
753 void AliAnalysisTaskMinijet::Analyse(Float_t *pt, Float_t *eta, Float_t *phi, Int_t ntracksCharged,
754 Int_t ntracklets, Int_t nAll, Int_t mode)
757 // analyse track properties (comming from either ESDs or AODs) in order to compute
758 // mini jet activity (chared tracks) as function of charged multiplicity
760 // ntracks and ntracklets are already the number of accepted tracks and tracklets
762 if(fDebug) Printf("In Analysis\n");
764 Float_t ptEventAxis=0; // pt leading
765 Float_t etaEventAxis=0; // eta leading
766 Float_t phiEventAxis=0; // phi leading
768 Float_t ptOthers = 0; // pt others // for all other tracks around event axis -> see loop
769 Float_t etaOthers = 0; // eta others
770 Float_t phiOthers = 0; // phi others
772 Int_t *pindexInnerEta = new Int_t[nAll];
773 Float_t *ptInnerEta = new Float_t[nAll];
775 for (Int_t i = 0; i < nAll; i++) {
776 //filling of simple check plots
777 fPt[mode] -> Fill( pt[i]);
778 fEta[mode] -> Fill(eta[i]);
779 fPhi[mode] -> Fill(phi[i]);
780 fPhiEta[mode]-> Fill(phi[i], eta[i]);
782 pindexInnerEta[i]=0; //set all values to zero
783 //fill new array for eta check
784 ptInnerEta[i]= pt[i];
790 // define event axis: leading or random track (with pt>fTriggerPtCut)
791 // ---------------------------------------
792 Int_t highPtTracks=0;
793 Int_t highPtTracksInnerEta=0;
796 //count high pt tracks and high pt tracks in acceptance for seeds
797 for(Int_t i=0;i<nAll;i++){
799 if(pt[i]>fTriggerPtCut) {
803 // seed should be place in middle of acceptance, that complete cone is in acceptance
804 if(pt[i]>fTriggerPtCut && TMath::Abs(eta[i])<fEtaCutSeed){
806 // Printf("eta=%f", eta[i]);
807 highPtTracksInnerEta++;
815 //sort array in order to get highest pt tracks first
816 //index can be computed with pindexInnerEta[number]
817 if(nAll) TMath::Sort(nAll, ptInnerEta, pindexInnerEta, kTRUE);
820 // plot of multiplicity distributions
821 fNch07Nch[mode]->Fill(ntracksCharged, highPtTracks);
822 pNch07Nch[mode]->Fill(ntracksCharged, highPtTracks);
824 fNch07Tracklet[mode]->Fill(ntracklets, highPtTracks);
825 fNchTracklet[mode]->Fill(ntracklets, ntracksCharged);
826 pNch07Tracklet[mode]->Fill(ntracklets, highPtTracks);
829 //analysis can only be performed with event axis, defined by high pt track
832 if(highPtTracks>0 && highPtTracksInnerEta>0){
834 //Printf("%s:%d",(char*)__FILE__,__LINE__);
835 //check setter of event axis
836 //default option: random=1,
837 //second option:leading=0
839 if(fLeadingOrRandom==0)axis=0;
840 else if (fLeadingOrRandom==1)axis= Int_t((highPtTracksInnerEta)*gRandom->Rndm());
841 else Printf("Wrong settings for event axis.");
844 Printf("Axis tracks has pT=%f, test=%f", ptInnerEta[pindexInnerEta[axis]], pt[pindexInnerEta[axis]]);
845 Printf("Axis tracks has eta=%f", eta[pindexInnerEta[axis]]);
848 //---------------------------------------
851 if(ntracksCharged>1){ // require at least two tracks (leading and prob. accosicates)
853 //EventAxisRandom track properties
854 ptEventAxis = pt [pindexInnerEta[axis]];
855 etaEventAxis = eta[pindexInnerEta[axis]];
856 phiEventAxis = phi[pindexInnerEta[axis]];
857 fPtSeed[mode] -> Fill( ptEventAxis);
858 fEtaSeed[mode] -> Fill(etaEventAxis);
859 fPhiSeed[mode] -> Fill(phiEventAxis);
861 //track loop for event propoerties around event axis with pt>triggerPtCut
862 //loop only over already accepted tracks except event axis
863 if(ptEventAxis>fTriggerPtCut){
865 for (Int_t iTrack = 0; iTrack < nAll; iTrack++) {
867 if(pindexInnerEta[axis]==iTrack)continue; // no double counting
869 ptOthers = pt [iTrack];
870 etaOthers = eta[iTrack];
871 phiOthers = phi[iTrack];
874 if(ptOthers>fAssociatePtCut){ // only tracks which fullfill associate pt cut
876 Float_t dPhi=TMath::Abs(phiOthers-phiEventAxis);
877 if(dPhi>TMath::Pi()) dPhi=2*TMath::Pi()-dPhi;
878 Float_t dEta=etaOthers-etaEventAxis;
880 Float_t dphiplot = phiOthers-phiEventAxis;
881 if(dphiplot>2*TMath::Pi()-1) dphiplot = dphiplot-2*TMath::Pi();
882 else if(dphiplot<-1)dphiplot=dphiplot+2*TMath::Pi();
883 fDPhiDEtaEventAxis[mode]->Fill(dphiplot, dEta);
885 if(ntracksCharged<150){
886 fDPhiEventAxisNchBin[mode][ntracksCharged]->Fill(dPhi);
887 if(ptOthers>fTriggerPtCut)
888 fDPhiEventAxisNchBinTrig[mode][ntracksCharged]->Fill(dPhi);
892 fDPhiEventAxisTrackletBin[mode][ntracklets]->Fill(dPhi);
893 if(ptOthers>fTriggerPtCut)
894 fDPhiEventAxisTrackletBinTrig[mode][ntracklets]->Fill(dPhi);
897 }//tracks fulfill assoc track cut
902 // fill histogram with number of tracks (pt>fAssociatePtCut) around event axis
903 // how often is there a trigger particle at a certain Nch bin
904 fTriggerNch[mode]->Fill(ntracksCharged);
905 fTriggerTracklet[mode]->Fill(ntracklets);
907 }//if track pt is at least trigger pt
909 } //if there are more than 1 track
911 }//if there is at least one high pt track
914 if(pindexInnerEta){// clean up array memory used for TMath::Sort
915 delete[] pindexInnerEta;
919 if(ptInnerEta){// clean up array memory used for TMath::Sort
928 //________________________________________________________________________
929 void AliAnalysisTaskMinijet::Terminate(Option_t*)
931 //terminate function is called at the end
932 //can be used to draw histograms etc.
936 //________________________________________________________________________
937 Bool_t AliAnalysisTaskMinijet::SelectParticlePlusCharged(Int_t charge, Int_t pdg, Bool_t prim)
939 //selection of mc particle
940 //fSelectParticles=0: use charged primaries and pi0 and k0
941 //fSelectParticles=1: use only charged primaries
942 //fSelectParticles=2: use only pi0 and k0
944 if(fSelectParticles==0 || fSelectParticles==2){ // in case of 2: need to count also charged particles
946 if(!(pdg==111||pdg==130||pdg==310))
955 else if(fSelectParticles==1){
956 if (charge==0 || !prim){
962 Printf("Error: wrong selection of charged/pi0/k0");
970 //________________________________________________________________________
971 Bool_t AliAnalysisTaskMinijet::SelectParticle(Int_t charge, Int_t pdg, Bool_t prim)
973 //selection of mc particle
974 //fSelectParticles=0: use charged primaries and pi0 and k0
975 //fSelectParticles=1: use only charged primaries
976 //fSelectParticles=2: use only pi0 and k0
978 if(fSelectParticles==0){
980 if(!(pdg==111||pdg==130||pdg==310))
989 else if (fSelectParticles==1){
990 if (charge==0 || !prim){
994 else if(fSelectParticles==2){
995 if(!(pdg==111||pdg==130||pdg==310))
1003 //________________________________________________________________________
1004 void AliAnalysisTaskMinijet::CleanArrays(Float_t* pt, Float_t* eta, Float_t* phi,Int_t* nTracksTracklets)
1006 //clean up of memory used for arrays of track properties
1020 if(nTracksTracklets){
1021 delete[] nTracksTracklets;