]> git.uio.no Git - u/mrichter/AliRoot.git/blob - JETAN/AliTkHijingAna.cxx
Version of the jet analysis module from v4-01-Release
[u/mrichter/AliRoot.git] / JETAN / AliTkHijingAna.cxx
1 // $Id$
2
3 #include <Riostream.h>
4 #include <TROOT.h>
5 #include <TParticle.h>
6 #include <TClonesArray.h>
7
8 #include "AliTkChargedJetFinder.h"
9 #include "AliTkHijingAna.h"
10
11 void AliTkHijingAna::setCenter(Float_t eta, Float_t phi) {
12   center.setEta(eta);
13   center.setPhi(phi);
14   // new center makes particle list invalid
15   clearCone();
16 }
17
18 Float_t AliTkHijingAna::getCenterEta() const {
19   return center.Eta();
20 }
21
22 Float_t AliTkHijingAna::getCenterPhi() const {
23   return center.Phi();
24 }
25
26 Bool_t AliTkHijingAna::isParticleInRadius(TParticle *particle,Float_t radius) {
27   AliTkEtaPhiVector p(particle->Eta(),particle->Phi());
28   if (center.diff(p) < radius) {
29     return kTRUE;
30   } else {
31     return kFALSE;
32   }
33 }
34
35 Bool_t AliTkHijingAna::isParticleAccepted(TParticle *particle,Float_t pt,Bool_t neutral) {
36
37   //check if particle was final  
38   UInt_t status = 0;
39   status = (particle->GetStatusCode() % 100);
40   if (status != 1) {
41     return kFALSE;
42   }
43
44   // if !neutral accept only charged particles, else accept everything
45   if(particle->Pt()<pt) return kFALSE;
46   if(!neutral){
47     TParticlePDG *partPDG = particle->GetPDG();
48     if (partPDG->Charge() == 0) {
49       return kFALSE;
50     }
51   }
52
53   return kTRUE;
54 }
55
56 Bool_t AliTkHijingAna::isParticleAcceptedALICE(TParticle *particle,Float_t /*pt*/,Bool_t /*neutral*/) {
57   // fake ALICE acceptance, only particles in |eta|<0.9
58
59   if (/*(isParticleAccepted(particle,pt,neutral)) &&*/ (TMath::Abs(particle->Eta()) < 0.9)) {
60     return kTRUE;
61   }
62
63   return kFALSE;
64 }
65
66 void AliTkHijingAna::clear() {
67   // clear TClonesArrays
68   if (oParticles) {
69     oParticles->Delete();
70     delete oParticles;
71     oParticles = NULL;
72   }
73   if (mParticles) {
74     mParticles->Delete();
75     delete mParticles;
76     mParticles = NULL;
77   }
78   mRadius = -1;
79   updated = kFALSE;
80 }
81
82 void AliTkHijingAna::clearCone() {
83   if (mParticles) {
84     mParticles->Delete();
85     delete mParticles;
86     mParticles = NULL;
87   }
88   mRadius = -1;
89   updated = kFALSE;
90 }
91
92 void AliTkHijingAna::setParticles(TClonesArray *particles) {
93   // take particles and dont apply any further cuts
94   if (!particles) {
95     return;
96   }
97
98   clear();
99   oParticles = new TClonesArray("TParticle",100000);
100   TIterator *iter = particles->MakeIterator();
101   TParticle *particle;
102   UInt_t pos = 0;
103   while ((particle = (TParticle *) iter->Next()) != NULL) {
104     new ((*oParticles)[pos++]) TParticle(*particle);
105   }
106   delete iter;
107
108 }
109
110 void AliTkHijingAna::setParticles(TClonesArray *particles,Float_t pt,Bool_t neutral) {
111   // we are only interested in (charged) particles, to reduce computing time
112   // create a copy which contains only the charged particles
113   if (!particles) {
114     return;
115   }
116   // new particle list makes old one invalid...
117   clear();
118   oParticles = new TClonesArray("TParticle",100000);
119   TIterator *iter = particles->MakeIterator();
120   TParticle *particle;
121   UInt_t pos = 0;
122   while ((particle = (TParticle *) iter->Next()) != NULL) {
123     if (isParticleAccepted(particle,pt,neutral)) {
124       new ((*oParticles)[pos++]) TParticle(*particle);
125     }
126   }
127   delete iter;
128 }
129
130 TClonesArray *AliTkHijingAna::getParticlesInRadius(Float_t radius) {
131   return getParticlesInRadius(NULL,radius);
132 }
133
134 TClonesArray *AliTkHijingAna::getParticlesInRadius(TClonesArray *particles, 
135                                                 Float_t radius) {
136   // this creates a TClonesArray with all charged particles in radius
137   // and ALICE acceptance
138
139   // uses the list of all charged particles (if created)
140   // OR
141   // used a previous list if radius < mRadius
142
143   if (updated && (mParticles != NULL) && (radius < mRadius)) {
144     particles = mParticles;
145   } else {
146     if (oParticles) {
147       particles = oParticles;
148     }
149   }
150   if (!particles) {
151     return NULL;
152   }
153
154   mRadius = radius;
155   TClonesArray *MyParticles = new TClonesArray("TParticle",100000);
156   TParticle *particle;
157
158   TIterator *iter = particles->MakeIterator();
159   UInt_t pos = 0;
160   while ((particle = (TParticle *) iter->Next()) != NULL) {
161     if (/*isParticleAcceptedALICE(particle) &&*/
162         isParticleInRadius(particle,mRadius)) {
163       new ((*MyParticles)[pos++]) TParticle(*particle);
164     }
165   }
166
167   // clean up
168   delete iter;
169   if (mParticles) {
170     mParticles->Delete();
171     delete mParticles;
172   }
173   mParticles = MyParticles;
174   updated = kTRUE;
175   
176   return mParticles;
177 }
178
179 Int_t AliTkHijingAna::getNParticlesInRadius(Float_t ptCut) {
180   if (!updated) {
181     // must call getParticlesInRadius before!
182     return -1;
183   }
184   // returns number of particles in cone with pt>ptCut
185   TIterator *iter = mParticles->MakeIterator();
186   TParticle *particle;
187   Int_t nPart = 0;
188   while ((particle = (TParticle *) iter->Next()) != NULL) {
189     if (particle->Pt() > ptCut) {
190       nPart++;
191     }
192   }
193   delete iter;
194   return nPart;
195 }
196
197 Float_t AliTkHijingAna::getEtInRadius(Float_t ptCut) {
198   if (!updated) {
199     // must call getParticlesInRadius before!
200     return -1;
201   }
202   // returns Et in cone using massless particles with pT>ptCut
203   TIterator *iter = mParticles->MakeIterator();
204   TParticle *particle;
205   Float_t Et = 0;
206   while((particle = (TParticle*) iter->Next()) != NULL) {
207     if (particle->Pt() > ptCut) {
208       Et += particle->Pt(); // assume massless particle...
209     }
210   }
211   delete iter;
212   return Et;
213 }  
214
215 Float_t AliTkHijingAna::getEtInRadius(TClonesArray *particles,Float_t radius) {
216   TIterator *iter = particles->MakeIterator();
217   TParticle *particle;
218   Float_t Et = 0;
219   while((particle = (TParticle*) iter->Next()) != NULL) {
220     if (/*isParticleAccepted(particle) &&*/
221         isParticleInRadius(particle,radius)) {
222       Et += particle->Pt(); // assume massless particle...
223     }
224   }
225   delete iter;
226   return Et;
227 }
228
229
230 ClassImp(AliTkHijingAna)