]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/EMCAL/AliParticleContainer.cxx
AcceptJet, AcceptParticle and AcceptCluster now return the rejection reason in a...
[u/mrichter/AliRoot.git] / PWG / EMCAL / AliParticleContainer.cxx
1 // $Id$
2 //
3 // Container with name, TClonesArray and cuts for particles
4 //
5 // Author: M. Verweij
6
7 #include <TClonesArray.h>
8
9 #include "AliVEvent.h"
10 #include "AliLog.h"
11
12 #include "AliParticleContainer.h"
13
14 ClassImp(AliParticleContainer)
15
16 //________________________________________________________________________
17 AliParticleContainer::AliParticleContainer():
18   AliEmcalContainer("AliParticleContainer"),
19   fParticlePtCut(0.15),
20   fParticleMinEta(-0.9),
21   fParticleMaxEta(0.9),
22   fParticleMinPhi(-10),
23   fParticleMaxPhi(10),
24   fTrackBitMap(0),
25   fMCTrackBitMap(0),
26   fMinMCLabel(0),
27   fMCFlag(0),
28   fGeneratorIndex(-1),
29   fCharge(-1)
30 {
31   // Default constructor.
32
33   fClassName = "AliVParticle";
34 }
35
36 //________________________________________________________________________
37 AliParticleContainer::AliParticleContainer(const char *name):
38   AliEmcalContainer(name),
39   fParticlePtCut(0.15),
40   fParticleMinEta(-0.9),
41   fParticleMaxEta(0.9),
42   fParticleMinPhi(-10),
43   fParticleMaxPhi(10),
44   fTrackBitMap(0),
45   fMCTrackBitMap(0),
46   fMinMCLabel(0),
47   fMCFlag(0),
48   fGeneratorIndex(-1),
49   fCharge(-1)
50 {
51   // Standard constructor.
52
53   fClassName = "AliVParticle";
54 }
55
56 //________________________________________________________________________
57 AliVParticle* AliParticleContainer::GetLeadingParticle(const char* opt) 
58 {
59   // Get the leading particle; use p if "p" is contained in opt
60
61   TString option(opt);
62   option.ToLower();
63
64   Int_t tempID = fCurrentID;
65
66   AliVParticle *partMax = GetNextAcceptParticle(0);
67   AliVParticle *part = 0;
68
69   if (option.Contains("p")) {
70     while ((part = GetNextAcceptParticle())) {
71       if (part->P() > partMax->P()) partMax = part;
72     }
73   }
74   else {
75     while ((part = GetNextAcceptParticle())) {
76       if (part->Pt() > partMax->Pt()) partMax = part;
77     }
78   }
79
80   fCurrentID = tempID;
81
82   return partMax;
83 }
84
85 //________________________________________________________________________
86 AliVParticle* AliParticleContainer::GetParticle(Int_t i) const 
87 {
88   //Get i^th jet in array
89
90   if(i<0 || i>=fClArray->GetEntriesFast()) return 0;
91   AliVParticle *vp = static_cast<AliVParticle*>(fClArray->At(i));
92   return vp;
93
94 }
95
96 //________________________________________________________________________
97 AliVParticle* AliParticleContainer::GetAcceptParticle(Int_t i) {
98   //return pointer to particle if particle is accepted
99
100   AliVParticle *vp = GetParticle(i);
101   if(!vp) return 0;
102
103   if(AcceptParticle(vp))
104       return vp;
105   else {
106     AliDebug(2,"Particle not accepted.");
107     return 0;
108   }
109 }
110
111 //________________________________________________________________________
112 AliVParticle* AliParticleContainer::GetParticleWithLabel(Int_t lab) const 
113 {
114   //Get particle with label lab in array
115   
116   Int_t i = GetIndexFromLabel(lab);
117   return GetParticle(i);
118 }
119
120 //________________________________________________________________________
121 AliVParticle* AliParticleContainer::GetAcceptParticleWithLabel(Int_t lab)  
122 {
123   //Get particle with label lab in array
124   
125   Int_t i = GetIndexFromLabel(lab);
126   return GetAcceptParticle(i);
127 }
128
129
130 //________________________________________________________________________
131 AliVParticle* AliParticleContainer::GetNextAcceptParticle(Int_t i) 
132 {
133   //Get next accepted particle; if i >= 0 (re)start counter from i; return 0 if no accepted particle could be found
134
135   if (i>=0) fCurrentID = i;
136
137   const Int_t n = GetNEntries();
138   AliVParticle *p = 0;
139   while (fCurrentID < n && !p) { 
140     p = GetAcceptParticle(fCurrentID);
141     fCurrentID++;
142   }
143
144   return p;
145 }
146
147 //________________________________________________________________________
148 AliVParticle* AliParticleContainer::GetNextParticle(Int_t i) 
149 {
150   //Get next particle; if i >= 0 (re)start counter from i; return 0 if no particle could be found
151
152   if (i>=0) fCurrentID = i;
153
154   const Int_t n = GetNEntries();
155   AliVParticle *p = 0;
156   while (fCurrentID < n && !p) { 
157     p = GetParticle(fCurrentID);
158     fCurrentID++;
159   }
160
161   return p;
162 }
163
164 //________________________________________________________________________
165 void AliParticleContainer::GetMomentum(TLorentzVector &mom, Int_t i) const
166 {
167   //Get momentum of the i^th particle in array
168
169   AliVParticle *vp = GetParticle(i);
170   if(vp) mom.SetPtEtaPhiM(vp->Pt(),vp->Eta(),vp->Phi(),0.139);
171 }
172
173 //________________________________________________________________________
174 Bool_t AliParticleContainer::AcceptParticle(AliVParticle *vp)
175 {
176   // Return true if vp is accepted.
177
178   fRejectionReason = 0;
179
180   if (!vp) {
181     fRejectionReason |= kNullObject;
182     return kFALSE;
183   }
184
185   if (vp->Pt() < fParticlePtCut) {
186     fRejectionReason |= kPtCut;
187     return kFALSE;
188   }
189
190   if (vp->Eta() < fParticleMinEta || vp->Eta() > fParticleMaxEta || 
191       vp->Phi() < fParticleMinPhi || vp->Phi() > fParticleMaxPhi) {
192     fRejectionReason |= kAcceptanceCut;
193     return kFALSE;
194   }
195
196   if (TMath::Abs(vp->GetLabel()) > fMinMCLabel) {
197     if(vp->TestBits(fMCTrackBitMap) != (Int_t)fMCTrackBitMap) {
198       AliDebug(2,"MC particle not accepted because of MC bit map.");
199       fRejectionReason |= kBitMapCut;
200       return kFALSE;
201     }
202   }
203   else {
204     if(vp->TestBits(fTrackBitMap) != (Int_t)fTrackBitMap) {
205       AliDebug(2,"Track not accepted because of bit map.");
206       fRejectionReason |= kBitMapCut;
207       return kFALSE;
208     }
209   }
210
211   if ((vp->GetFlag() & fMCFlag) != fMCFlag) {
212     fRejectionReason |= kMCFlag;
213     return kFALSE;
214   }
215
216   if (fGeneratorIndex >= 0 && fGeneratorIndex != vp->GetGeneratorIndex()) {
217     fRejectionReason |= kMCGeneratorCut;
218     return kFALSE;
219   }
220
221   if (fCharge>=0 && fCharge != vp->Charge()) {
222     fRejectionReason |= kChargeCut;
223     return kFALSE;
224   }
225   
226   return kTRUE;
227 }
228
229 //________________________________________________________________________
230 Int_t AliParticleContainer::GetNAcceptedParticles()
231 {
232   // Get number of accepted particles
233
234   Int_t nPart = 0;
235
236   AliVParticle *vp = GetNextAcceptParticle(0);
237   if(vp) nPart = 1;
238   while (GetNextAcceptParticle())
239     nPart++;
240
241   return nPart;
242 }
243
244 //________________________________________________________________________
245 void AliParticleContainer::SetClassName(const char *clname)
246 {
247   // Set the class name
248
249   TClass cls(clname);
250   if (cls.InheritsFrom("AliVParticle")) fClassName = clname;
251   else AliError(Form("Unable to set class name %s for a AliParticleContainer, it must inherits from AliVParticle!",clname));
252 }