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