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),
59 for(Int_t i = 0;i< 4;i++){
77 fDPhiDEtaEventAxis[i] = 0;
79 fTriggerTracklet[i] = 0;
83 fNch07Tracklet[i] = 0;
85 pNch07Tracklet[i] = 0;
86 for(Int_t j=0;j<150;j++){
87 fDPhiEventAxisNchBin[i][j] = 0;
88 fDPhiEventAxisNchBinTrig[i][j] = 0;
90 fDPhiEventAxisTrackletBin[i][j] = 0;
91 fDPhiEventAxisTrackletBinTrig[i][j] = 0;
94 DefineOutput(1, TList::Class());
97 //________________________________________________________________________
98 AliAnalysisTaskMinijet::~AliAnalysisTaskMinijet()
102 if (fHists && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fHists;
105 //________________________________________________________________________
106 void AliAnalysisTaskMinijet::UserCreateOutputObjects()
110 if(fDebug) Printf("In User Create Output Objects.");
112 fHistPt = new TH1F("fHistPt", "P_{T} distribution REC", 15, 0.1, 3.1);
113 fHistPt->GetXaxis()->SetTitle("P_{T} (GeV/c)");
114 fHistPt->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
115 fHistPt->SetMarkerStyle(kFullCircle);
119 fHistPtMC = new TH1F("fHistPtMC", "P_{T} distribution MC", 15, 0.1, 3.1);
120 fHistPtMC->GetXaxis()->SetTitle("P_{T} (GeV/c)");
121 fHistPtMC->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
122 fHistPtMC->SetMarkerStyle(kFullCircle);
125 fChargedPi0 = new TH2F("fChargedPi0", "fChargedPi0", 200, -0.5, 199.5, 200, -0.5, 199.5);
127 TString labels[4]={"ESDrec", "ESDmc", "AODrec", "AODmc"};
129 // for(Int_t i=2*fMode+fMcOnly;i<1+2*fMode+fUseMC;i++){
130 for(Int_t i=0;i<4;i++){
132 fVertexZ[i] = new TH1F(Form("fVertexZ%s",labels[i].Data()),
133 Form("fVertexZ%s",labels[i].Data()) ,
135 fPt[i] = new TH1F(Form("fPt%s",labels[i].Data()),
136 Form("fPt%s",labels[i].Data()) ,
138 fEta[i] = new TH1F (Form("fEta%s",labels[i].Data()),
139 Form("fEta%s",labels[i].Data()) ,
141 fPhi[i] = new TH1F(Form("fPhi%s",labels[i].Data()),
142 Form("fPhi%s",labels[i].Data()) ,
143 360, 0.,2*TMath::Pi());
145 fPtSeed[i] = new TH1F(Form("fPSeedt%s",labels[i].Data()),
146 Form("fPtSeed%s",labels[i].Data()) ,
148 fEtaSeed[i] = new TH1F (Form("fEtaSeed%s",labels[i].Data()),
149 Form("fEtaSeed%s",labels[i].Data()) ,
151 fPhiSeed[i] = new TH1F(Form("fPhiSeed%s",labels[i].Data()),
152 Form("fPhiSeed%s",labels[i].Data()) ,
153 360, 0.,2*TMath::Pi());
155 fPtOthers[i] = new TH1F(Form("fPOtherst%s",labels[i].Data()),
156 Form("fPtOthers%s",labels[i].Data()) ,
158 fEtaOthers[i] = new TH1F (Form("fEtaOthers%s",labels[i].Data()),
159 Form("fEtaOthers%s",labels[i].Data()) ,
161 fPhiOthers[i] = new TH1F(Form("fPhiOthers%s",labels[i].Data()),
162 Form("fPhiOthers%s",labels[i].Data()) ,
163 360, 0.,2*TMath::Pi());
164 fPtEtaOthers[i] = new TH2F(Form("fPtEtaOthers%s",labels[i].Data()),
165 Form("fPtEtaOthers%s",labels[i].Data()) ,
166 500, 0., 50, 100, -1., 1);
168 fPhiEta[i] = new TH2F(Form("fPhiEta%s",labels[i].Data()),
169 Form("fPhiEta%s",labels[i].Data()) ,
170 180, 0., 2*TMath::Pi(), 100, -1.,1.);
171 fDPhiDEtaEventAxis[i] = new TH2F(Form("fDPhiDEtaEventAxis%s",labels[i].Data()),
172 Form("fDPhiDEtaEventAxis%s",labels[i].Data()) ,
173 180, -1., 2*TMath::Pi()-1, 200, -2.,2.);
174 fTriggerNch[i] = new TH1F(Form("fTriggerNch%s",labels[i].Data()),
175 Form("fTriggerNch%s",labels[i].Data()) ,
177 fTriggerTracklet[i] = new TH1F(Form("fTriggerTracklet%s",labels[i].Data()),
178 Form("fTriggerTracklet%s",labels[i].Data()) ,
180 fNch07Nch[i] = new TH2F(Form("fNch07Nch%s",labels[i].Data()),
181 Form("fNch07Nch%s",labels[i].Data()) ,
182 250, -2.5, 247.5,250, -2.5, 247.5);
183 pNch07Nch[i] = new TProfile(Form("pNch07Nch%s",labels[i].Data()),
184 Form("pNch07Nch%s",labels[i].Data()) ,
186 fNch07Tracklet[i] = new TH2F(Form("fNch07Tracklet%s",labels[i].Data()),
187 Form("fNch07Tracklet%s",labels[i].Data()) ,
188 250, -2.5, 247.5,250, -2.5, 247.5);
189 fNchTracklet[i] = new TH2F(Form("fNchTracklet%s",labels[i].Data()),
190 Form("fNchTracklet%s",labels[i].Data()) ,
191 250, -2.5, 247.5,250, -2.5, 247.5);
192 pNch07Tracklet[i] = new TProfile(Form("pNch07Tracklet%s",labels[i].Data()),
193 Form("pNch07Tracklet%s",labels[i].Data()) ,
195 for(Int_t j=0;j<150;j++){
196 fDPhiEventAxisNchBin[i][j] = new TH1F(Form("fDPhiEventAxisNchBin%s%02d",
198 Form("fDPhiEventAxisNchBin%s%02d",
199 labels[i].Data(),j) ,
200 180, 0., TMath::Pi());
201 fDPhiEventAxisNchBinTrig[i][j] = new TH1F(Form("fDPhiEventAxisNchBinTrig%s%02d",
203 Form("fDPhiEventAxisNchBinTrig%s%02d",
204 labels[i].Data(),j) ,
205 180, 0., TMath::Pi());
207 fDPhiEventAxisTrackletBin[i][j] = new TH1F(Form("fDPhiEventAxisTrackletBin%s%02d",
209 Form("fDPhiEventAxisTrackletBin%s%02d",
210 labels[i].Data(),j) ,
211 180, 0., TMath::Pi());
212 fDPhiEventAxisTrackletBinTrig[i][j] = new TH1F(Form("fDPhiEventAxisTrackletBinTrig%s%02d",
214 Form("fDPhiEventAxisTrackletBinTrig%s%02d",
215 labels[i].Data(),j) ,
216 180, 0., TMath::Pi());
220 fHists = new TList();
223 fHists->Add(fHistPt);
224 if(fUseMC)fHists->Add(fHistPtMC);
225 fHists->Add(fChargedPi0);
227 //for(Int_t i=2*fMode+fMcOnly;i<1+2*fMode+fUseMC;i++){
228 for(Int_t i=0;i<4;i++){
229 fHists->Add(fVertexZ[i]);
231 fHists->Add(fEta[i]);
232 fHists->Add(fPhi[i]);
233 fHists->Add(fPtSeed[i]);
234 fHists->Add(fEtaSeed[i]);
235 fHists->Add(fPhiSeed[i]);
236 fHists->Add(fPtOthers[i]);
237 fHists->Add(fEtaOthers[i]);
238 fHists->Add(fPhiOthers[i]);
239 fHists->Add(fPtEtaOthers[i]);
240 fHists->Add(fPhiEta[i]);
241 fHists->Add(fDPhiDEtaEventAxis[i]);
242 fHists->Add(fTriggerNch[i]);
243 fHists->Add(fTriggerTracklet[i]);
244 fHists->Add(fNch07Nch[i]);
245 fHists->Add(pNch07Nch[i]);
246 fHists->Add(fNch07Tracklet[i]);
247 fHists->Add(fNchTracklet[i]);
248 fHists->Add(pNch07Tracklet[i]);
249 for(Int_t j=0;j<150;j++){
250 fHists->Add(fDPhiEventAxisNchBin[i][j]);
251 fHists->Add(fDPhiEventAxisNchBinTrig[i][j]);
253 fHists->Add(fDPhiEventAxisTrackletBin[i][j]);
254 fHists->Add(fDPhiEventAxisTrackletBinTrig[i][j]);
261 //________________________________________________________________________
262 void AliAnalysisTaskMinijet::UserExec(Option_t *)
265 // Called for each event
267 AliVEvent *event = InputEvent();
269 Error("UserExec", "Could not retrieve event");
273 //get events, either ESD or AOD
274 fESDEvent = dynamic_cast<AliESDEvent*> (InputEvent());
275 fAODEvent = dynamic_cast<AliAODEvent*> (InputEvent());
278 //arrays for track properties
282 //number of accepted tracks and tracklets
283 Int_t ntracks = 0; //return value for reading functions for ESD and AOD
284 Int_t *nTracksTracklets = 0; // [0]=nAccepted,1=ntracklets,2=nall(also neutral in case of mc,
285 //for real nall=ncharged)
288 //read data and analyse. Implemented for ESD, ESDmc, AOD, AODmc
289 //-------------------------------------------------------------
290 if (fESDEvent && fMode==0) {//ESDs
291 //ESD reading and analysis
294 ntracks = LoopESD(&pt, &eta, &phi, &nTracksTracklets); //read tracks
297 Printf("ntracks=%d", nTracksTracklets[0]);
298 Printf("ntracklets=%d", nTracksTracklets[1]);
300 Analyse(pt, eta, phi, ntracks, nTracksTracklets[1], nTracksTracklets[2], 0); //analyse tracks
302 CleanArrays(pt, eta, phi, nTracksTracklets); // clean up array memory
306 //ESD MC reading and analysis
309 ntracks = LoopESDMC(&pt, &eta, &phi, &nTracksTracklets); //read mc particles
311 Analyse(pt, eta, phi, ntracks, nTracksTracklets[1], nTracksTracklets[2], 1);//analyse
313 CleanArrays(pt, eta, phi, nTracksTracklets);// clean up array memory
318 if (fAODEvent && fMode==1) {//AODs
320 //AOD reading and analysis
323 ntracks = LoopAOD(&pt, &eta, &phi, &nTracksTracklets);//read tracks
326 Printf("ntracks=%d", nTracksTracklets[0]);
327 Printf("ntracklets=%d", nTracksTracklets[1]);
329 Analyse(pt, eta, phi, ntracks, nTracksTracklets[1], nTracksTracklets[2], 2);//analyse
331 CleanArrays(pt, eta, phi, nTracksTracklets);// clean up array memory
335 //AOD MCreading and analysis
338 ntracks = LoopAODMC(&pt, &eta, &phi, &nTracksTracklets);//read tracks
340 Analyse(pt, eta, phi, ntracks, nTracksTracklets[1],nTracksTracklets[2], 3);//analyse
342 CleanArrays(pt, eta, phi, nTracksTracklets);// clean up array memory
346 //-------------------------------------------------------------
350 // PostData(1, fHists);
355 //________________________________________________________________________
356 Int_t AliAnalysisTaskMinijet::LoopESD(Float_t **ptArray, Float_t ** etaArray,
357 Float_t ** phiArray, Int_t **nTracksTracklets )
359 // gives back the number of esd tracks and pointer to arrays with track
360 // properties (pt, eta, phi)
362 // Retreive the number of all tracks for this event.
363 Int_t ntracks = fESDEvent->GetNumberOfTracks();
364 if(fDebug)Printf("all ESD tracks: %d", ntracks);
367 //first loop to check how many tracks are accepted
369 Int_t nAcceptedTracks=0;
370 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
371 AliESDtrack *track = (AliESDtrack *)fESDEvent->GetTrack(iTracks);
373 Error("UserExec", "Could not receive track %d", iTracks);
376 if (fCuts->AcceptTrack(track) && TMath::Abs(track->Eta())<fEtaCut) ++nAcceptedTracks;
381 *ptArray = new Float_t[nAcceptedTracks];
382 *etaArray = new Float_t[nAcceptedTracks];
383 *phiArray = new Float_t[nAcceptedTracks];
384 *nTracksTracklets = new Int_t[3]; //ntracksAccepted, ntracklets
386 //check if event is pile up or no tracks are accepted, return to user exec
387 // if(fESDEvent->IsPileupFromSPD(3,0,8)) return 0;
388 if(nAcceptedTracks==0) return 0;
390 //accept event only, if vertex is good and is within fVertexZcut region
391 const AliESDVertex* vertexESD = fESDEvent->GetPrimaryVertex();
392 if(vertexESD->GetNContributors()==0)return 0;
393 Float_t fVz= vertexESD->GetZ();
394 if(TMath::Abs(fVz)>fVertexZCut) return 0;
395 fVertexZ[0]->Fill(fVz);
399 Int_t iAcceptedTrack=0;
400 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
401 AliESDtrack *track = (AliESDtrack *)fESDEvent->GetTrack(iTracks);
403 Error("UserExec", "Could not receive track %d", iTracks);
406 if (fCuts->AcceptTrack(track) && TMath::Abs(track->Eta())<fEtaCut){
407 (*ptArray)[iAcceptedTrack] = track->Pt();
408 (*etaArray)[iAcceptedTrack] = track->Eta();
409 (*phiArray)[iAcceptedTrack++] = track->Phi();
410 fHistPt->Fill(track->Pt());
416 Int_t ntrackletsAccept=0;
417 AliMultiplicity * mult = (AliMultiplicity*)(fESDEvent->GetMultiplicity());
418 Int_t ntracklets = mult->GetNumberOfTracklets();
419 for(Int_t i=0;i< ntracklets;i++){
420 if(mult->GetDeltaPhi(i)<0.05){
425 (*nTracksTracklets)[0] = nAcceptedTracks;
426 (*nTracksTracklets)[1] = ntrackletsAccept;
427 (*nTracksTracklets)[2] = nAcceptedTracks;//in order to be compatible with mc analysis
428 //where here also neutral particles are counted.
430 return nAcceptedTracks;
434 //________________________________________________________________________
435 Int_t AliAnalysisTaskMinijet::LoopESDMC(Float_t **ptArray, Float_t ** etaArray,
436 Float_t ** phiArray, Int_t ** nTracksTracklets)
438 // gives back the number of charged prim MC particle and pointer to arrays
439 // with particle properties (pt, eta, phi)
441 // Printf("Event starts: Loop ESD MC");
443 AliMCEvent *mcEvent = (AliMCEvent*) MCEvent();
445 Error("UserExec", "Could not retrieve MC event");
449 AliStack* stack = 0x0;
450 if(fUseMC) stack = MCEvent()->Stack();
452 Int_t ntracks = mcEvent->GetNumberOfTracks();
453 if(fDebug)Printf("MC particles: %d", ntracks);
456 //----------------------------------
457 //first track loop to check how many chared primary tracks are available
458 Int_t nChargedPrimaries=0;
459 Int_t nAllPrimaries=0;
461 Int_t nPseudoTracklets=0;
462 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
463 AliMCParticle *track = dynamic_cast<AliMCParticle*>(mcEvent->GetTrack(iTracks));
465 Error("UserExec", "Could not receive track %d", iTracks);
470 if(//count also charged particles in case of fSelectParticles==2 (only neutral)
471 !SelectParticlePlusCharged(
474 stack->IsPhysicalPrimary(track->Label())
480 // Printf("fSelectParticles= %d\n", fSelectParticles);
481 //count number of pseudo tracklets
482 if(TMath::Abs(track->Eta())<=fEtaCut && track->Pt()>0.035) ++nPseudoTracklets;
483 //same cuts as on ESDtracks
484 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<0.2 || track->Pt()>200) continue;
486 //count all primaries
488 //count charged primaries
489 if (track->Charge() != 0) ++nChargedPrimaries;
491 // Printf("PDG=%d, IsPrim=%d", track->PdgCode(),stack->IsPhysicalPrimary(track->Label()) );
495 //----------------------------------
497 // Printf("All in acceptance=%d",nAllPrimaries);
498 // Printf("Charged in acceptance =%d",nChargedPrimaries);
500 fChargedPi0->Fill(nAllPrimaries,nChargedPrimaries);
502 if(fSelectParticles!=2){
503 *ptArray = new Float_t[nAllPrimaries];
504 *etaArray = new Float_t[nAllPrimaries];
505 *phiArray = new Float_t[nAllPrimaries];
508 *ptArray = new Float_t[nAllPrimaries-nChargedPrimaries];
509 *etaArray = new Float_t[nAllPrimaries-nChargedPrimaries];
510 *phiArray = new Float_t[nAllPrimaries-nChargedPrimaries];
513 *nTracksTracklets = new Int_t[3];
515 if(nAllPrimaries==0) return 0;
516 if(nChargedPrimaries==0) return 0;
520 AliGenEventHeader* header = MCEvent()->GenEventHeader();
522 header->PrimaryVertex(mcV);
523 Float_t vzMC = mcV[2];
524 if(TMath::Abs(vzMC)>fVertexZCut) return 0;
525 fVertexZ[1]->Fill(vzMC);
530 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
531 AliMCParticle *track = dynamic_cast<AliMCParticle*>(mcEvent->GetTrack(iTracks));
533 Error("UserExec", "Could not receive track %d", iTracks);
540 stack->IsPhysicalPrimary(track->Label())
546 //same cuts as on ESDtracks
547 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<0.2 || track->Pt()>200) continue;
549 // Printf("After: PDG=%d, IsPrim=%d", track->PdgCode(),stack->IsPhysicalPrimary(track->Label()) );
552 fHistPtMC->Fill(track->Pt());
553 //fills arrays with track properties
554 (*ptArray)[iChargedPiK] = track->Pt();
555 (*etaArray)[iChargedPiK] = track->Eta();
556 (*phiArray)[iChargedPiK++] = track->Phi();
560 (*nTracksTracklets)[0] = nChargedPrimaries;
561 (*nTracksTracklets)[1] = nPseudoTracklets;
562 if(fSelectParticles!=2){
563 (*nTracksTracklets)[2] = nAllPrimaries;
566 (*nTracksTracklets)[2] = nAllPrimaries-nChargedPrimaries; // only neutral
568 return nChargedPrimaries;
572 //________________________________________________________________________
573 Int_t AliAnalysisTaskMinijet::LoopAOD(Float_t **ptArray, Float_t ** etaArray,
574 Float_t ** phiArray, Int_t ** nTracksTracklets)
576 // gives back the number of AOD tracks and pointer to arrays with track
577 // properties (pt, eta, phi)
580 // Retreive the number of tracks for this event.
581 Int_t ntracks = fAODEvent->GetNumberOfTracks();
582 if(fDebug) Printf("AOD tracks: %d", ntracks);
585 Int_t nAcceptedTracks=0;
586 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
587 AliAODTrack *track = (AliAODTrack *)fAODEvent->GetTrack(iTracks);
589 Error("UserExec", "Could not receive track %d", iTracks);
592 if(track->TestFilterBit(16) && TMath::Abs(track->Eta())<fEtaCut) nAcceptedTracks++;
595 *ptArray = new Float_t[nAcceptedTracks];
596 *etaArray = new Float_t[nAcceptedTracks];
597 *phiArray = new Float_t[nAcceptedTracks];
598 *nTracksTracklets = new Int_t[3]; //here, third entry only copy of first (compatibility for MC)
601 if(nAcceptedTracks==0) return 0;
602 AliAODVertex* vertex= (AliAODVertex*)fAODEvent->GetPrimaryVertex();
604 // TODO: need to check how to implement IsPileupFromSPD(3,0.8)
605 // function of esd event
606 // first solution: exclude this call in esd loop for comparison (QA)
608 if(!vertex) return 0;
609 Double_t vzAOD=vertex->GetZ();
610 //if(vertex->GetNContributors()==0) return 0;
611 if(TMath::Abs(vzAOD)<1e-9) return 0;
613 if(TMath::Abs(vzAOD)>fVertexZCut) return 0;
614 fVertexZ[2]->Fill(vzAOD);
616 // Track loop to fill a pT spectrum
617 Int_t iAcceptedTracks=0;
618 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
619 AliAODTrack *track = (AliAODTrack *)fAODEvent->GetTrack(iTracks);
621 Error("UserExec", "Could not receive track %d", iTracks);
624 if(!track->TestFilterBit(16) || TMath::Abs(track->Eta())>fEtaCut) continue;
625 fHistPt->Fill(track->Pt());
627 //fills arrays with track properties
628 (*ptArray)[iAcceptedTracks] = track->Pt();
629 (*etaArray)[iAcceptedTracks] = track->Eta();
630 (*phiArray)[iAcceptedTracks++] = track->Phi();
635 Int_t ntrackletsAccept=0;
636 AliAODTracklets * mult= (AliAODTracklets*)fAODEvent->GetTracklets();
637 for(Int_t i=0;i<mult->GetNumberOfTracklets();++i){
638 if(TMath::Abs(mult->GetDeltaPhi(i))<0.05){
643 (*nTracksTracklets)[0] = nAcceptedTracks;
644 (*nTracksTracklets)[1] = ntrackletsAccept;
645 (*nTracksTracklets)[2] = nAcceptedTracks;
647 return nAcceptedTracks;
651 //________________________________________________________________________
652 Int_t AliAnalysisTaskMinijet::LoopAODMC(Float_t **ptArray, Float_t ** etaArray,
653 Float_t ** phiArray, Int_t ** nTracksTracklets)
655 // gives back the number of AOD MC particles and pointer to arrays with particle
656 // properties (pt, eta, phi)
658 //retreive MC particles from event
659 TClonesArray *mcArray = (TClonesArray*)fAODEvent->
660 FindListObject(AliAODMCParticle::StdBranchName());
662 Printf("%s:%d No MC particle branch found",(char*)__FILE__,__LINE__);
666 Int_t ntracks = mcArray->GetEntriesFast();
667 if(fDebug)Printf("MC particles: %d", ntracks);
670 // Track loop: chek how many particles will be accepted
672 Int_t nChargedPrim=0;
674 Int_t nPseudoTracklets=0;
675 for (Int_t it = 0; it < ntracks; it++) {
676 AliAODMCParticle *track = (AliAODMCParticle*)mcArray->At(it);
678 Error("UserExec", "Could not receive track %d", it);
682 if(!SelectParticlePlusCharged(
685 track->IsPhysicalPrimary()
690 if(TMath::Abs(track->Eta())<=fEtaCut && track->Pt()>0.035)++nPseudoTracklets;
691 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<0.2 || track->Pt()>200) continue;
692 // if(TMath::Abs(track->Eta())<1e-9 && TMath::Abs(track->Phi())<1e-9)continue;
694 //same cuts as in ESD filter
695 if(!track->TestBit(16))continue; //cuts set in ESD filter during AOD generation
698 if(track->Charge()!=0) nChargedPrim++;
700 // Printf("eta=%f,phi=%f,pt=%f",track->Eta(),track->Phi(),track->Pt());
701 // Printf("prim=%d,pdg=%d,charge=%d",track->IsPhysicalPrimary(),track->PdgCode(),track->Charge());
704 if(nAllPrim==1) vzMC= track->Zv(); // check only one time. (only one vertex per event allowed)
707 //generate array with size of number of accepted tracks
708 fChargedPi0->Fill(nAllPrim,nChargedPrim);
710 if(fSelectParticles!=2){
711 *ptArray = new Float_t[nAllPrim];
712 *etaArray = new Float_t[nAllPrim];
713 *phiArray = new Float_t[nAllPrim];
716 *ptArray = new Float_t[nAllPrim-nChargedPrim];
717 *etaArray = new Float_t[nAllPrim-nChargedPrim];
718 *phiArray = new Float_t[nAllPrim-nChargedPrim];
722 *nTracksTracklets = new Int_t[3];
724 Printf("nAllPrim=%d", nAllPrim);
725 Printf("nChargedPrim=%d", nChargedPrim);
727 if(nAllPrim==0) return 0;
728 if(nChargedPrim==0) return 0;
731 if(TMath::Abs(vzMC)>fVertexZCut) return 0;
732 fVertexZ[3]->Fill(vzMC);
735 // Track loop: fill arrays for accepted tracks
736 Int_t iChargedPrim=0;
737 for (Int_t it = 0; it < ntracks; it++) {
738 AliAODMCParticle *track = (AliAODMCParticle*)mcArray->At(it);
740 Error("UserExec", "Could not receive track %d", it);
747 track->IsPhysicalPrimary()
753 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<0.2 || track->Pt()>200) continue;
754 //if(TMath::Abs(track->Eta())<1e-8 && TMath::Abs(track->Phi())<1e-8)continue;
756 //Printf("eta=%f,phi=%f,pt=%f",track->Eta(),track->Phi(),track->Pt());
757 Printf("prim=%d,pdg=%d,charge=%d",track->IsPhysicalPrimary(),track->PdgCode(),track->Charge());
759 //if(track->TestBit(16))continue;
761 fHistPtMC->Fill(track->Pt());
762 (*ptArray)[iChargedPrim] = track->Pt();
763 (*etaArray)[iChargedPrim] = track->Eta();
764 (*phiArray)[iChargedPrim++] = track->Phi();
768 (*nTracksTracklets)[0] = nChargedPrim;
769 (*nTracksTracklets)[1] = nPseudoTracklets;
770 if(fSelectParticles!=2){
771 (*nTracksTracklets)[2] = nAllPrim;
774 (*nTracksTracklets)[2] = nAllPrim-nChargedPrim; // only neutral
779 // Printf("ntracks=%d", nChargedPrim);
783 //________________________________________________________________________
784 void AliAnalysisTaskMinijet::Analyse(Float_t *pt, Float_t *eta, Float_t *phi, Int_t ntracksCharged,
785 Int_t ntracklets, Int_t nAll, Int_t mode)
788 // analyse track properties (comming from either ESDs or AODs) in order to compute
789 // mini jet activity (chared tracks) as function of charged multiplicity
791 // ntracks and ntracklets are already the number of accepted tracks and tracklets
794 Printf("In Analysis\n");
795 Printf("nAll=%d",nAll);
796 Printf("nCharged=%d",ntracksCharged);
799 Float_t ptEventAxis=0; // pt leading
800 Float_t etaEventAxis=0; // eta leading
801 Float_t phiEventAxis=0; // phi leading
803 Float_t ptOthers = 0; // pt others // for all other tracks around event axis -> see loop
804 Float_t etaOthers = 0; // eta others
805 Float_t phiOthers = 0; // phi others
807 Int_t *pindexInnerEta = new Int_t[nAll];
808 Float_t *ptInnerEta = new Float_t[nAll];
810 for (Int_t i = 0; i < nAll; i++) {
811 //filling of simple check plots
812 fPt[mode] -> Fill( pt[i]);
813 fEta[mode] -> Fill(eta[i]);
814 fPhi[mode] -> Fill(phi[i]);
815 fPhiEta[mode]-> Fill(phi[i], eta[i]);
817 pindexInnerEta[i]=0; //set all values to zero
818 //fill new array for eta check
819 ptInnerEta[i]= pt[i];
823 // define event axis: leading or random track (with pt>fTriggerPtCut)
824 // ---------------------------------------
825 Int_t highPtTracks=0;
826 Int_t highPtTracksInnerEta=0;
829 //count high pt tracks and high pt tracks in acceptance for seeds
830 for(Int_t i=0;i<nAll;i++){
832 if(pt[i]>fTriggerPtCut) {
836 // seed should be place in middle of acceptance, that complete cone is in acceptance
837 if(pt[i]>fTriggerPtCut && TMath::Abs(eta[i])<fEtaCutSeed){
839 // Printf("eta=%f", eta[i]);
840 highPtTracksInnerEta++;
848 //sort array in order to get highest pt tracks first
849 //index can be computed with pindexInnerEta[number]
850 if(nAll) TMath::Sort(nAll, ptInnerEta, pindexInnerEta, kTRUE);
853 // plot of multiplicity distributions
854 fNch07Nch[mode]->Fill(ntracksCharged, highPtTracks);
855 pNch07Nch[mode]->Fill(ntracksCharged, highPtTracks);
857 fNch07Tracklet[mode]->Fill(ntracklets, highPtTracks);
858 fNchTracklet[mode]->Fill(ntracklets, ntracksCharged);
859 pNch07Tracklet[mode]->Fill(ntracklets, highPtTracks);
862 //analysis can only be performed with event axis, defined by high pt track
865 if(highPtTracks>0 && highPtTracksInnerEta>0){
867 //Printf("%s:%d",(char*)__FILE__,__LINE__);
868 //check setter of event axis
869 //default option: random=1,
870 //second option:leading=0
872 if(fLeadingOrRandom==0)axis=0;
873 else if (fLeadingOrRandom==1)axis= Int_t((highPtTracksInnerEta)*gRandom->Rndm());
874 else Printf("Wrong settings for event axis.");
877 Printf("Axis tracks has pT=%f, test=%f", ptInnerEta[pindexInnerEta[axis]], pt[pindexInnerEta[axis]]);
878 Printf("Axis tracks has eta=%f", eta[pindexInnerEta[axis]]);
881 //---------------------------------------
884 if(ntracksCharged>1){ // require at least two tracks (leading and prob. accosicates)
886 //EventAxisRandom track properties
887 ptEventAxis = pt [pindexInnerEta[axis]];
888 etaEventAxis = eta[pindexInnerEta[axis]];
889 phiEventAxis = phi[pindexInnerEta[axis]];
890 fPtSeed[mode] -> Fill( ptEventAxis);
891 fEtaSeed[mode] -> Fill(etaEventAxis);
892 fPhiSeed[mode] -> Fill(phiEventAxis);
894 //track loop for event propoerties around event axis with pt>triggerPtCut
895 //loop only over already accepted tracks except event axis
896 if(ptEventAxis>fTriggerPtCut){
898 for (Int_t iTrack = 0; iTrack < nAll; iTrack++) {
900 if(pindexInnerEta[axis]==iTrack)continue; // no double counting
902 ptOthers = pt [iTrack];
903 etaOthers = eta[iTrack];
904 phiOthers = phi[iTrack];
906 //if(ptOthers>fAssociatePtCut && ptOthers<fTriggerPtCut){ // only tracks which fullfill associate pt cut
907 if(ptOthers>fAssociatePtCut){ // only tracks which fullfill associate pt cut
909 //plot only properties of tracks with pt>ptassoc
910 fPtOthers[mode] -> Fill( ptOthers);
911 fEtaOthers[mode] -> Fill(etaOthers);
912 fPhiOthers[mode] -> Fill(phiOthers);
913 fPtEtaOthers[mode] -> Fill(ptOthers, etaOthers);
915 Float_t dPhi=TMath::Abs(phiOthers-phiEventAxis);
916 if(dPhi>TMath::Pi()) dPhi=2*TMath::Pi()-dPhi;
917 Float_t dEta=etaOthers-etaEventAxis;
919 Float_t dphiplot = phiOthers-phiEventAxis;
920 if(dphiplot>2*TMath::Pi()-1) dphiplot = dphiplot-2*TMath::Pi();
921 else if(dphiplot<-1)dphiplot=dphiplot+2*TMath::Pi();
922 fDPhiDEtaEventAxis[mode]->Fill(dphiplot, dEta);
924 if(ntracksCharged<150){
925 fDPhiEventAxisNchBin[mode][ntracksCharged]->Fill(dPhi);
926 if(ptOthers>fTriggerPtCut)
927 fDPhiEventAxisNchBinTrig[mode][ntracksCharged]->Fill(dPhi);
931 fDPhiEventAxisTrackletBin[mode][ntracklets]->Fill(dPhi);
932 if(ptOthers>fTriggerPtCut)
933 fDPhiEventAxisTrackletBinTrig[mode][ntracklets]->Fill(dPhi);
936 }//tracks fulfill assoc track cut
941 // fill histogram with number of tracks (pt>fAssociatePtCut) around event axis
942 // how often is there a trigger particle at a certain Nch bin
943 fTriggerNch[mode]->Fill(ntracksCharged);
944 fTriggerTracklet[mode]->Fill(ntracklets);
946 }//if track pt is at least trigger pt
948 } //if there are more than 1 track
950 }//if there is at least one high pt track
953 if(pindexInnerEta){// clean up array memory used for TMath::Sort
954 delete[] pindexInnerEta;
958 if(ptInnerEta){// clean up array memory used for TMath::Sort
967 //________________________________________________________________________
968 void AliAnalysisTaskMinijet::Terminate(Option_t*)
970 //terminate function is called at the end
971 //can be used to draw histograms etc.
975 //________________________________________________________________________
976 Bool_t AliAnalysisTaskMinijet::SelectParticlePlusCharged(Short_t charge, Int_t pdg, Bool_t prim)
978 //selection of mc particle
979 //fSelectParticles=0: use charged primaries and pi0 and k0
980 //fSelectParticles=1: use only charged primaries
981 //fSelectParticles=2: use only pi0 and k0
983 if(fSelectParticles==0 || fSelectParticles==2){ // in case of 2: need to count also charged particles
985 if(!(pdg==111||pdg==130||pdg==310))
994 else if(fSelectParticles==1){
995 if (charge==0 || !prim){
1001 Printf("Error: wrong selection of charged/pi0/k0");
1009 //________________________________________________________________________
1010 Bool_t AliAnalysisTaskMinijet::SelectParticle(Short_t charge, Int_t pdg, Bool_t prim)
1012 //selection of mc particle
1013 //fSelectParticles=0: use charged primaries and pi0 and k0
1014 //fSelectParticles=1: use only charged primaries
1015 //fSelectParticles=2: use only pi0 and k0
1017 if(fSelectParticles==0){
1019 if(!(pdg==111||pdg==130||pdg==310))
1028 else if (fSelectParticles==1){
1029 if (charge==0 || !prim){
1033 else if(fSelectParticles==2){
1034 if(!(pdg==111||pdg==130||pdg==310))
1042 //________________________________________________________________________
1043 void AliAnalysisTaskMinijet::CleanArrays(Float_t* pt, Float_t* eta, Float_t* phi,Int_t* nTracksTracklets)
1045 //clean up of memory used for arrays of track properties
1059 if(nTracksTracklets){
1060 delete[] nTracksTracklets;