3 // Container with name, TClonesArray and cuts for particles
7 #include <TClonesArray.h>
12 #include "AliParticleContainer.h"
14 ClassImp(AliParticleContainer)
16 //________________________________________________________________________
17 AliParticleContainer::AliParticleContainer():
18 AliEmcalContainer("AliParticleContainer"),
20 fParticleMinEta(-0.9),
24 fMinDistanceTPCSectorEdge(-1),
28 fMinMCLabelAccept(-1),
33 // Default constructor.
35 fClassName = "AliVParticle";
38 //________________________________________________________________________
39 AliParticleContainer::AliParticleContainer(const char *name):
40 AliEmcalContainer(name),
42 fParticleMinEta(-0.9),
46 fMinDistanceTPCSectorEdge(-1),
50 fMinMCLabelAccept(-1),
55 // Standard constructor.
57 fClassName = "AliVParticle";
60 //________________________________________________________________________
61 AliVParticle* AliParticleContainer::GetLeadingParticle(const char* opt)
63 // Get the leading particle; use p if "p" is contained in opt
68 Int_t tempID = fCurrentID;
70 AliVParticle *partMax = GetNextAcceptParticle(0);
71 AliVParticle *part = 0;
73 if (option.Contains("p")) {
74 while ((part = GetNextAcceptParticle())) {
75 if (part->P() > partMax->P()) partMax = part;
79 while ((part = GetNextAcceptParticle())) {
80 if (part->Pt() > partMax->Pt()) partMax = part;
89 //________________________________________________________________________
90 AliVParticle* AliParticleContainer::GetParticle(Int_t i) const
92 //Get i^th jet in array
94 if(i<0 || i>=fClArray->GetEntriesFast()) return 0;
95 AliVParticle *vp = static_cast<AliVParticle*>(fClArray->At(i));
100 //________________________________________________________________________
101 AliVParticle* AliParticleContainer::GetAcceptParticle(Int_t i) {
102 //return pointer to particle if particle is accepted
104 AliVParticle *vp = GetParticle(i);
107 if(AcceptParticle(vp))
110 AliDebug(2,"Particle not accepted.");
115 //________________________________________________________________________
116 AliVParticle* AliParticleContainer::GetParticleWithLabel(Int_t lab) const
118 //Get particle with label lab in array
120 Int_t i = GetIndexFromLabel(lab);
121 return GetParticle(i);
124 //________________________________________________________________________
125 AliVParticle* AliParticleContainer::GetAcceptParticleWithLabel(Int_t lab)
127 //Get particle with label lab in array
129 Int_t i = GetIndexFromLabel(lab);
130 return GetAcceptParticle(i);
134 //________________________________________________________________________
135 AliVParticle* AliParticleContainer::GetNextAcceptParticle(Int_t i)
137 //Get next accepted particle; if i >= 0 (re)start counter from i; return 0 if no accepted particle could be found
139 if (i>=0) fCurrentID = i;
141 const Int_t n = GetNEntries();
143 while (fCurrentID < n && !p) {
144 p = GetAcceptParticle(fCurrentID);
151 //________________________________________________________________________
152 AliVParticle* AliParticleContainer::GetNextParticle(Int_t i)
154 //Get next particle; if i >= 0 (re)start counter from i; return 0 if no particle could be found
156 if (i>=0) fCurrentID = i;
158 const Int_t n = GetNEntries();
160 while (fCurrentID < n && !p) {
161 p = GetParticle(fCurrentID);
168 //________________________________________________________________________
169 void AliParticleContainer::GetMomentum(TLorentzVector &mom, Int_t i) const
171 //Get momentum of the i^th particle in array
173 AliVParticle *vp = GetParticle(i);
174 if(vp) mom.SetPtEtaPhiM(vp->Pt(),vp->Eta(),vp->Phi(),0.139);
177 //________________________________________________________________________
178 Bool_t AliParticleContainer::AcceptParticle(AliVParticle *vp)
180 // Return true if vp is accepted.
182 fRejectionReason = 0;
185 fRejectionReason |= kNullObject;
189 if (vp->Pt() < fParticlePtCut) {
190 fRejectionReason |= kPtCut;
194 if (vp->Eta() < fParticleMinEta || vp->Eta() > fParticleMaxEta ||
195 vp->Phi() < fParticleMinPhi || vp->Phi() > fParticleMaxPhi) {
196 fRejectionReason |= kAcceptanceCut;
200 if(fMinDistanceTPCSectorEdge>0.) {
201 const Double_t pi = TMath::Pi();
202 const Double_t kSector = pi/9;
203 Double_t phiDist = TMath::Abs(vp->Phi() - TMath::FloorNint(vp->Phi()/kSector)*kSector);
204 if(phiDist<fMinDistanceTPCSectorEdge) {
205 fRejectionReason |= kMinDistanceTPCSectorEdgeCut;
210 if (TMath::Abs(vp->GetLabel()) < fMinMCLabelAccept) {
211 AliDebug(2,"Particle not accepted because label too small.");
212 fRejectionReason |= kMinMCLabelAccept;
216 if (TMath::Abs(vp->GetLabel()) > fMinMCLabel) {
217 if(vp->TestBits(fMCTrackBitMap) != (Int_t)fMCTrackBitMap) {
218 AliDebug(2,"MC particle not accepted because of MC bit map.");
219 fRejectionReason |= kBitMapCut;
224 if(vp->TestBits(fTrackBitMap) != (Int_t)fTrackBitMap) {
225 AliDebug(2,"Track not accepted because of bit map.");
226 fRejectionReason |= kBitMapCut;
231 if ((vp->GetFlag() & fMCFlag) != fMCFlag) {
232 fRejectionReason |= kMCFlag;
236 if (fGeneratorIndex >= 0 && fGeneratorIndex != vp->GetGeneratorIndex()) {
237 fRejectionReason |= kMCGeneratorCut;
241 if (fCharge>=0 && fCharge != vp->Charge()) {
242 fRejectionReason |= kChargeCut;
249 //________________________________________________________________________
250 Int_t AliParticleContainer::GetNAcceptedParticles()
252 // Get number of accepted particles
256 AliVParticle *vp = GetNextAcceptParticle(0);
258 while (GetNextAcceptParticle())
264 //________________________________________________________________________
265 void AliParticleContainer::SetClassName(const char *clname)
267 // Set the class name
270 if (cls.InheritsFrom("AliVParticle")) fClassName = clname;
271 else AliError(Form("Unable to set class name %s for a AliParticleContainer, it must inherits from AliVParticle!",clname));