9 #include "TParticlePDG.h"
15 #include "AliAnalysisTask.h"
16 #include "AliAnalysisManager.h"
18 #include "AliESDEvent.h"
20 #include "AliMCParticle.h"
21 #include "AliMCEvent.h"
24 #include "AliESDVertex.h"
25 #include "AliESDInputHandler.h"
26 #include "AliESDtrackCuts.h"
27 #include "AliMultiplicity.h"
29 #include "AliAnalysisTaskHardSoft.h"
30 #include "AliExternalTrackParam.h"
31 #include "AliTrackReference.h"
32 #include "AliHeader.h"
33 #include "AliGenEventHeader.h"
34 #include "AliGenDPMjetEventHeader.h"
36 // Analysis Task for Hard and Soft event characteristics
40 ClassImp(AliAnalysisTaskHardSoft)
42 //________________________________________________________________________
43 AliAnalysisTaskHardSoft::AliAnalysisTaskHardSoft(const char *name)
44 : AliAnalysisTaskSE(name)
57 for(Int_t i = 0;i< 2;i++){
62 fEtaPhiLeading[i] = 0;
69 fRadiusLeading[i] = 0;
71 fRadiusLeadingR[i] = 0;
72 fDPhiLeadingRS[i] = 0;
73 fRadiusLeadingRS[i] = 0;
77 for(Int_t j=0;j<100;j++){
78 fDPhiLeadingNchBin[i][j] = 0;
81 for(Int_t j=0;j<2;j++){
82 fNchHardSoft[i][j] = 0;
83 fPtHardSoft[i][j] = 0;
84 fPtAvHardSoftNch[i][j] = 0;
87 DefineOutput(1, TList::Class());
91 //________________________________________________________________________
92 void AliAnalysisTaskHardSoft::UserCreateOutputObjects()
97 Bool_t oldStatus = TH1::AddDirectoryStatus();
98 TH1::AddDirectory(kFALSE);
100 fHists = new TList();
108 for(Int_t i=0;i<2;i++){
109 fPt[i] = new TH1F(Form("fPt%s",labels[i].Data()),
110 Form("fPt%s",labels[i].Data()) ,
112 fEta[i] = new TH1F (Form("fEta%s",labels[i].Data()),
113 Form("fEta%s",labels[i].Data()) ,
115 fPhi[i] = new TH1F(Form("fPhi%s",labels[i].Data()),
116 Form("fPhi%s",labels[i].Data()) ,
117 360, 0.,2*TMath::Pi());
118 fEtaPhi[i] = new TH2F(Form("fEtaPhi%s",labels[i].Data()),
119 Form("fEtaPhi%s",labels[i].Data()) ,
121 360, 0.,2*TMath::Pi());
122 fEtaPhiLeading[i] = new TH2F(Form("fEtaPhiLeading%s",labels[i].Data()),
123 Form("fEtaPhiLeading%s",labels[i].Data()) ,
125 360, 0.,2*TMath::Pi());
126 fNch[i] = new TH1F(Form("fNch%s",labels[i].Data()),
127 Form("fNch%s",labels[i].Data()) ,
129 fPtLeading[i] = new TH1F(Form("fPtLeading%s",labels[i].Data()),
130 Form("fPtLeading%s",labels[i].Data()) ,
132 fPtLeadingNch[i] = new TProfile(Form("fPtLeadingNch%s",labels[i].Data()),
133 Form("fPtLeadingNch%s",labels[i].Data()) ,
135 fPtSumNch[i] = new TProfile(Form("fPtSumNch%s",labels[i].Data()),
136 Form("fPtSumNch%s",labels[i].Data()) ,
138 fPtAvNch[i] = new TProfile(Form("fPtAvNch%s",labels[i].Data()),
139 Form("fPtAvNch%s",labels[i].Data()) ,
141 fDPhiLeading[i] = new TH1F(Form("fDPhiLeading%s",labels[i].Data()),
142 Form("fDPhiLeading%s",labels[i].Data()) ,
143 180, 0., TMath::Pi());
144 fRadiusLeading[i] = new TH1F(Form("fRadiusLeading%s",labels[i].Data()),
145 Form("fRadiusLeading%s",labels[i].Data()) ,
146 180, 0., 2*TMath::Pi());
147 fDPhiLeadingR[i] = new TH1F(Form("fDPhiLeadingR%s",labels[i].Data()),
148 Form("fDPhiLeadingR%s",labels[i].Data()) ,
149 180, 0., TMath::Pi());
150 fRadiusLeadingR[i] = new TH1F(Form("fRadiusLeadingR%s",labels[i].Data()),
151 Form("fRadiusLeadingR%s",labels[i].Data()) ,
152 180, 0., 2*TMath::Pi());
153 fDPhiLeadingRS[i] = new TH1F(Form("fDPhiLeadingRS%s",labels[i].Data()),
154 Form("fDPhiLeadingRS%s",labels[i].Data()) ,
155 180, 0., TMath::Pi());
156 fRadiusLeadingRS[i] = new TH1F(Form("fRadiusLeadingRS%s",labels[i].Data()),
157 Form("fRadiusLeadingRS%s",labels[i].Data()) ,
158 180, 0., 2*TMath::Pi());
159 fNchAssInR[i] = new TProfile(Form("fNchAssInR%s",labels[i].Data()),
160 Form("fNchAssInR%s",labels[i].Data()) ,
162 fTrigger[i] = new TH1F(Form("fTrigger%s",labels[i].Data()),
163 Form("fTrigger%s",labels[i].Data()) ,
165 for(Int_t j=0;j<100;j++){
166 fDPhiLeadingNchBin[i][j] = new TH1F(Form("fDPhiLeadingNchBin%s%02d",labels[i].Data(),j),
167 Form("fDPhiLeadingNchBin%s%02d",labels[i].Data(),j) ,
168 180, 0., TMath::Pi());
171 for(Int_t j=0;j<2;j++){
172 fNchHardSoft[i][j] = new TH1F(Form("fNchHardSoft%s%d",labels[i].Data(),j),
173 Form("fNchHardSoft%s%d",labels[i].Data(),j) ,
175 fPtHardSoft[i][j] = new TH1F(Form("fPtHardSoft%s%d",labels[i].Data(),j),
176 Form("fPtHardSoft%s%d",labels[i].Data(),j) ,
178 fPtAvHardSoftNch[i][j] = new TProfile(Form("fPtAvHardSoftNch%s%d",labels[i].Data(),j),
179 Form("fPtAvHardSoftNch%s%d",labels[i].Data(),j) ,
187 for(Int_t i=0;i<2;i++){
189 fHists->Add(fEta[i]);
190 fHists->Add(fPhi[i]);
191 fHists->Add(fEtaPhi[i]);
192 fHists->Add(fEtaPhiLeading[i]);
193 fHists->Add(fNch[i]);
194 fHists->Add(fPtLeading[i]);
195 fHists->Add(fPtLeadingNch[i]);
196 fHists->Add(fPtSumNch[i]);
197 fHists->Add(fPtAvNch[i]);
198 fHists->Add(fDPhiLeading[i]);
199 fHists->Add(fRadiusLeading[i]);
200 fHists->Add(fDPhiLeadingR[i]);
201 fHists->Add(fRadiusLeadingR[i]);
202 fHists->Add(fDPhiLeadingRS[i]);
203 fHists->Add(fRadiusLeadingRS[i]);
204 fHists->Add(fNchAssInR[i]);
205 fHists->Add(fTrigger[i]);
207 for(Int_t j=0;j<100;j++){
208 fHists->Add(fDPhiLeadingNchBin[i][j]);
211 for(Int_t j=0;j<2;j++){
212 fHists->Add(fNchHardSoft[i][j]);
213 fHists->Add(fPtHardSoft[i][j]);
214 fHists->Add(fPtAvHardSoftNch[i][j]);
219 TH1::AddDirectory(oldStatus);
222 //__________________________________________________________
224 void AliAnalysisTaskHardSoft::UserExec(Option_t *)
226 Int_t nentries[2] = {0,0}; // tracks in event (before selection)
227 Int_t nTracksAll[2] = {0,0}; // accepted tracks in event
228 Int_t nTracksAssociate[2] = {0,0}; // accepted tracks in event within R=fRadiusCut around leading track
230 Float_t pt[2] = {0.,0.}; // pt
231 Float_t eta[2] = {0.,0.}; // eta
232 Float_t phi[2] = {0.,0.}; // phi
233 Float_t ptSum[2] = {0.,0.}; // pt sum
234 Float_t ptAv[2] = {0.,0.}; // average pt
237 Float_t ptLeading[2] = {0.,0.}; // pt leading
238 Float_t etaLeading[2] = {0.,0.}; // eta leading
239 Float_t phiLeading[2] = {0.,0.}; // phi leading
241 Float_t ptOthers[2] = {0.,0.}; // pt others // for second track loop around leading track
242 Float_t etaOthers[2] = {0.,0.}; // eta others
243 Float_t phiOthers[2] = {0.,0.}; // phi others
245 Double_t etaLeadingRandom[2] = {0.,0.}; // eta leading for random particle position (from fMapLeading)
246 Double_t phiLeadingRandom[2] = {0.,0.}; // phi leading "
247 Double_t etaOthersRandom[2] = {0.,0.}; // eta others for random particle position (from fMap)
248 Double_t phiOthersRandom[2] = {0.,0.}; // phi others "
250 Int_t fEventType[2]={1,1}; //hard=0, soft=1 -> set to hard if trigger and associate particle
253 //get event and vertex cut :(MC and ESD)
254 //---------------------
256 //---------------------
257 AliStack *stack = 0x0; // needed for MC studies
258 Float_t vzMC=0.; // MC vertex position in z
260 stack = MCEvent()->Stack();
261 AliGenEventHeader* header = MCEvent()->GenEventHeader();
263 header->PrimaryVertex(mcV);
266 //---------------------
268 //---------------------
269 AliVEvent* event = InputEvent();
271 Printf("ERROR: Could not retrieve event");
275 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(event);
276 if(esd)Printf("We are reading from ESD");
278 const AliVVertex* vertex = event->GetPrimaryVertex();
279 Float_t vz = vertex->GetZ();
280 //---------------------
285 //Selection of particle(mcesd=0) or esdtracks(mcesd=1)
286 for(Int_t mcesd=0;mcesd<2;mcesd++){
288 if(fUseMc==false) //MC part can be switched off for real data by function SetUserMc(kFALSE)
292 // vertex cut and number of particles/tracks per event
293 //---------------------------------------
294 if(mcesd==0){//mc particles
295 if (TMath::Abs(vzMC) > 10.) return;
296 nentries[mcesd]=MCEvent()->GetNumberOfTracks();
299 if (TMath::Abs(vz) > 10.) return;
300 nentries[mcesd]=event->GetNumberOfTracks();
301 }//---------------------------------------
306 // arrays for leading track determination (done with TMath::Sort of Array)
307 Float_t * ptArray = new Float_t[nentries[mcesd]];
309 //array of track properties
310 Float_t * etaArray = new Float_t[nentries[mcesd]];
311 Float_t * phiArray = new Float_t[nentries[mcesd]];
313 Int_t *pindex = new Int_t[nentries[mcesd]];
314 for (Int_t i = 0; i < nentries[mcesd]; i++) {
325 for (Int_t iTrack = 0; iTrack < nentries[mcesd]; iTrack++) {
331 //get properties of mc particle
333 AliMCParticle* mcP = (AliMCParticle*) MCEvent()->GetTrack(iTrack);
335 if (!(stack->IsPhysicalPrimary(mcP->Label()))) continue;
336 if(!fUseNeutral)if (mcP->Particle()->GetPDG()->Charge() == 0) continue;
337 //same cuts as on ESDtracks
338 if(TMath::Abs(mcP->Eta())>0.9)continue;
339 if(mcP->Pt()<0.2)continue;
340 if(mcP->Pt()>200)continue;
342 pt[mcesd] = mcP->Pt();
343 eta[mcesd] = mcP->Eta();
344 phi[mcesd] = mcP->Phi();
347 //get properties of esdtracks
349 AliVParticle *track = event->GetTrack(iTrack);
351 Printf("ERROR: Could not receive track %d", iTrack);
354 AliESDtrack *esdtrack = dynamic_cast<AliESDtrack*>(track);
355 if(!esdtrack)continue;
356 if (!fCuts->AcceptTrack(esdtrack)) continue;
358 pt[mcesd]=esdtrack->Pt();
359 eta[mcesd]=esdtrack->Eta();
360 phi[mcesd]=esdtrack->Phi();
363 ptArray[nTracksAll[mcesd]] = pt[mcesd]; // fill pt array
364 etaArray[nTracksAll[mcesd]] = eta[mcesd]; // fill eta array
365 phiArray[nTracksAll[mcesd]++] = phi[mcesd]; // count tracks and fill phi array
367 fPt[mcesd] -> Fill(pt[mcesd]);
368 fEta[mcesd] -> Fill(eta[mcesd]);
369 fPhi[mcesd] -> Fill(phi[mcesd]);
370 fEtaPhi[mcesd] -> Fill(eta[mcesd],phi[mcesd]);
373 }//end first track loop
375 fNch[mcesd] -> Fill(nTracksAll[mcesd]);
378 //find leading pt tracks
379 if(nentries[mcesd]>0) TMath::Sort(nentries[mcesd], ptArray, pindex, kTRUE);
380 //for(Int_t i=0;i<nTracksAll[mcesd];i++){//show just the filled entries, skip empty ones.
381 // printf("%d: pt = %f, number %i \n",mcesd, ptArray[pindex[i]],i);
385 if(nTracksAll[mcesd]>0){
386 fPtLeading[mcesd]->Fill(ptArray[pindex[0]]); //first entry in array is highest
387 fPtLeadingNch[mcesd]->Fill(nTracksAll[mcesd],ptArray[pindex[0]]);
389 for(Int_t i=0;i<nTracksAll[mcesd];i++){ //calculate ptsum
390 ptSum[mcesd]+=ptArray[pindex[i]];
392 ptAv[mcesd]=ptSum[mcesd]/nTracksAll[mcesd]; //calculate <pt>
394 fPtSumNch[mcesd]->Fill(nTracksAll[mcesd],ptSum[mcesd]);
395 fPtAvNch[mcesd]->Fill(nTracksAll[mcesd],ptAv[mcesd]);
399 if(nTracksAll[mcesd]>1){ // require at least two tracks (leading and prob. accosicates)
401 //Leading track properties
402 ptLeading[mcesd] = ptArray[pindex[0]];
403 etaLeading[mcesd] = etaArray[pindex[0]];
404 phiLeading[mcesd] = phiArray[pindex[0]];
406 fEtaPhiLeading[mcesd] -> Fill(etaLeading[mcesd],phiLeading[mcesd]);
408 fMapLeading->GetRandom2(etaLeadingRandom[mcesd],phiLeadingRandom[mcesd]);
410 //second track loop for event propoerties around leading tracks with pt>triggerPtCut
411 //loop only over already accepted tracks except leading track
412 if(ptLeading[mcesd]>fTriggerPtCut){
414 fTrigger[mcesd]->Fill(nTracksAll[mcesd]); // how often is there a trigger particle at a certain Nch bin
416 for (Int_t iTrack = 1; iTrack < nTracksAll[mcesd]; iTrack++) { // starting at second highest track
418 ptOthers[mcesd] = ptArray[pindex[iTrack]];
419 etaOthers[mcesd] = etaArray[pindex[iTrack]];
420 phiOthers[mcesd] = phiArray[pindex[iTrack]];
422 fMap->GetRandom2(etaOthersRandom[mcesd],phiOthersRandom[mcesd]);
424 if(ptOthers[mcesd]>fAssociatePtCut){ // only tracks which fullfill associate pt cut
428 Float_t dPhi=TMath::Abs(phiOthers[mcesd]-phiLeading[mcesd]);
429 if(dPhi>TMath::Pi()) dPhi=2*TMath::Pi()-dPhi;
430 Float_t dEta=etaOthers[mcesd]-etaLeading[mcesd];
432 Float_t radius=TMath::Sqrt(dPhi*dPhi+dEta*dEta);
433 fRadiusLeading[mcesd]->Fill(radius);
434 fDPhiLeading[mcesd]->Fill(dPhi);
435 if(nTracksAll[mcesd]<100)fDPhiLeadingNchBin[mcesd][nTracksAll[mcesd]]->Fill(dPhi);
437 if(radius<fRadiusCut){
439 nTracksAssociate[mcesd]++;
443 Float_t dPhiR=TMath::Abs(phiOthersRandom[mcesd]-phiLeadingRandom[mcesd]);
444 if(dPhiR>TMath::Pi()) dPhiR=dPhiR-2*TMath::Pi();
445 Float_t dEtaR=etaOthersRandom[mcesd]-etaLeadingRandom[mcesd];
447 Float_t radiusR=TMath::Sqrt(dPhiR*dPhiR+dEtaR*dEtaR);
448 fRadiusLeadingR[mcesd]->Fill(radiusR);
449 fDPhiLeadingR[mcesd]->Fill(dPhiR);
453 //3. random position of leading particle
454 Float_t dPhiRS=TMath::Abs(phiOthers[mcesd]-phiLeadingRandom[mcesd]);
455 if(dPhiRS>TMath::Pi()) dPhiRS=dPhiRS-2*TMath::Pi();
456 Float_t dEtaRS=etaOthers[mcesd]-etaLeadingRandom[mcesd];
458 Float_t radiusRS=TMath::Sqrt(dPhiRS*dPhiRS+dEtaRS*dEtaRS);
459 fRadiusLeadingRS[mcesd]->Fill(radiusRS);
460 fDPhiLeadingRS[mcesd]->Fill(dPhiRS);
466 //fill histogram with number of tracks (pt>fAssociatePtCut) around leading track
467 fNchAssInR[mcesd]->Fill(nTracksAll[mcesd],nTracksAssociate[mcesd]);
472 fNchHardSoft[mcesd][fEventType[mcesd]]->Fill(nTracksAll[mcesd]);
474 for(Int_t i=0;i<nTracksAll[mcesd];i++){
475 fPtHardSoft[mcesd][fEventType[mcesd]]->Fill(ptArray[i]);
478 fPtAvHardSoftNch[mcesd][fEventType[mcesd]]->Fill(nTracksAll[mcesd],ptAv[mcesd]);
481 }//double loop over mcP and ESD
493 //________________________________________________________________________
494 void AliAnalysisTaskHardSoft::Terminate(Option_t *)