ROOT logo
// $Id$
//
// Container with name, TClonesArray and cuts for particles
//
// Author: M. Verweij

#include <TClonesArray.h>

#include "AliVEvent.h"
#include "AliLog.h"

#include "AliParticleContainer.h"

ClassImp(AliParticleContainer)

//________________________________________________________________________
AliParticleContainer::AliParticleContainer():
  AliEmcalContainer("AliParticleContainer"),
  fParticlePtCut(0.15),
  fParticleMinEta(-0.9),
  fParticleMaxEta(0.9),
  fParticleMinPhi(-10),
  fParticleMaxPhi(10),
  fMinDistanceTPCSectorEdge(-1),
  fTrackBitMap(0),
  fMCTrackBitMap(0),
  fMinMCLabel(0),
  fMinMCLabelAccept(-1),
  fMCFlag(0),
  fGeneratorIndex(-1),
  fCharge(-1)
{
  // Default constructor.

  fClassName = "AliVParticle";
}

//________________________________________________________________________
AliParticleContainer::AliParticleContainer(const char *name):
  AliEmcalContainer(name),
  fParticlePtCut(0.15),
  fParticleMinEta(-0.9),
  fParticleMaxEta(0.9),
  fParticleMinPhi(-10),
  fParticleMaxPhi(10),
  fMinDistanceTPCSectorEdge(-1),
  fTrackBitMap(0),
  fMCTrackBitMap(0),
  fMinMCLabel(0),
  fMinMCLabelAccept(-1),
  fMCFlag(0),
  fGeneratorIndex(-1),
  fCharge(-1)
{
  // Standard constructor.

  fClassName = "AliVParticle";
}

//________________________________________________________________________
AliVParticle* AliParticleContainer::GetLeadingParticle(const char* opt) 
{
  // Get the leading particle; use p if "p" is contained in opt

  TString option(opt);
  option.ToLower();

  Int_t tempID = fCurrentID;

  AliVParticle *partMax = GetNextAcceptParticle(0);
  AliVParticle *part = 0;

  if (option.Contains("p")) {
    while ((part = GetNextAcceptParticle())) {
      if (part->P() > partMax->P()) partMax = part;
    }
  }
  else {
    while ((part = GetNextAcceptParticle())) {
      if (part->Pt() > partMax->Pt()) partMax = part;
    }
  }

  fCurrentID = tempID;

  return partMax;
}

//________________________________________________________________________
AliVParticle* AliParticleContainer::GetParticle(Int_t i) const 
{
  //Get i^th jet in array

  if(i<0 || i>=fClArray->GetEntriesFast()) return 0;
  AliVParticle *vp = static_cast<AliVParticle*>(fClArray->At(i));
  return vp;

}

//________________________________________________________________________
AliVParticle* AliParticleContainer::GetAcceptParticle(Int_t i) {
  //return pointer to particle if particle is accepted

  AliVParticle *vp = GetParticle(i);
  if(!vp) return 0;

  if(AcceptParticle(vp))
      return vp;
  else {
    AliDebug(2,"Particle not accepted.");
    return 0;
  }
}

//________________________________________________________________________
AliVParticle* AliParticleContainer::GetParticleWithLabel(Int_t lab) const 
{
  //Get particle with label lab in array
  
  Int_t i = GetIndexFromLabel(lab);
  return GetParticle(i);
}

//________________________________________________________________________
AliVParticle* AliParticleContainer::GetAcceptParticleWithLabel(Int_t lab)  
{
  //Get particle with label lab in array
  
  Int_t i = GetIndexFromLabel(lab);
  return GetAcceptParticle(i);
}


//________________________________________________________________________
AliVParticle* AliParticleContainer::GetNextAcceptParticle(Int_t i) 
{
  //Get next accepted particle; if i >= 0 (re)start counter from i; return 0 if no accepted particle could be found

  if (i>=0) fCurrentID = i;

  const Int_t n = GetNEntries();
  AliVParticle *p = 0;
  while (fCurrentID < n && !p) { 
    p = GetAcceptParticle(fCurrentID);
    fCurrentID++;
  }

  return p;
}

//________________________________________________________________________
AliVParticle* AliParticleContainer::GetNextParticle(Int_t i) 
{
  //Get next particle; if i >= 0 (re)start counter from i; return 0 if no particle could be found

  if (i>=0) fCurrentID = i;

  const Int_t n = GetNEntries();
  AliVParticle *p = 0;
  while (fCurrentID < n && !p) { 
    p = GetParticle(fCurrentID);
    fCurrentID++;
  }

  return p;
}

//________________________________________________________________________
void AliParticleContainer::GetMomentum(TLorentzVector &mom, Int_t i) const
{
  //Get momentum of the i^th particle in array

  AliVParticle *vp = GetParticle(i);
  if(vp) mom.SetPtEtaPhiM(vp->Pt(),vp->Eta(),vp->Phi(),0.139);
}

//________________________________________________________________________
Bool_t AliParticleContainer::AcceptParticle(AliVParticle *vp)
{
  // Return true if vp is accepted.

  fRejectionReason = 0;

  if (!vp) {
    fRejectionReason |= kNullObject;
    return kFALSE;
  }

  if (vp->Pt() < fParticlePtCut) {
    fRejectionReason |= kPtCut;
    return kFALSE;
  }

  if (vp->Eta() < fParticleMinEta || vp->Eta() > fParticleMaxEta || 
      vp->Phi() < fParticleMinPhi || vp->Phi() > fParticleMaxPhi) {
    fRejectionReason |= kAcceptanceCut;
    return kFALSE;
  }

  if(fMinDistanceTPCSectorEdge>0.) {
    const Double_t pi = TMath::Pi();
    const Double_t kSector = pi/9;
    Double_t phiDist = TMath::Abs(vp->Phi() - TMath::FloorNint(vp->Phi()/kSector)*kSector);
    if(phiDist<fMinDistanceTPCSectorEdge) {
      fRejectionReason |= kMinDistanceTPCSectorEdgeCut;
      return kFALSE;
    }
  }

  if (TMath::Abs(vp->GetLabel()) < fMinMCLabelAccept) {
    AliDebug(2,"Particle not accepted because label too small.");
    fRejectionReason |= kMinMCLabelAccept;
    return kFALSE;
  }

  if (TMath::Abs(vp->GetLabel()) > fMinMCLabel) {
    if(vp->TestBits(fMCTrackBitMap) != (Int_t)fMCTrackBitMap) {
      AliDebug(2,"MC particle not accepted because of MC bit map.");
      fRejectionReason |= kBitMapCut;
      return kFALSE;
    }
  }
  else {
    if(vp->TestBits(fTrackBitMap) != (Int_t)fTrackBitMap) {
      AliDebug(2,"Track not accepted because of bit map.");
      fRejectionReason |= kBitMapCut;
      return kFALSE;
    }
  }

  if ((vp->GetFlag() & fMCFlag) != fMCFlag) {
    fRejectionReason |= kMCFlag;
    return kFALSE;
  }

  if (fGeneratorIndex >= 0 && fGeneratorIndex != vp->GetGeneratorIndex()) {
    fRejectionReason |= kMCGeneratorCut;
    return kFALSE;
  }

  if (fCharge>=0 && fCharge != vp->Charge()) {
    fRejectionReason |= kChargeCut;
    return kFALSE;
  }
  
  return kTRUE;
}

//________________________________________________________________________
Int_t AliParticleContainer::GetNAcceptedParticles()
{
  // Get number of accepted particles

  Int_t nPart = 0;

  AliVParticle *vp = GetNextAcceptParticle(0);
  if(vp) nPart = 1;
  while (GetNextAcceptParticle())
    nPart++;

  return nPart;
}

//________________________________________________________________________
void AliParticleContainer::SetClassName(const char *clname)
{
  // Set the class name

  TClass cls(clname);
  if (cls.InheritsFrom("AliVParticle")) fClassName = clname;
  else AliError(Form("Unable to set class name %s for a AliParticleContainer, it must inherits from AliVParticle!",clname));
}
 AliParticleContainer.cxx:1
 AliParticleContainer.cxx:2
 AliParticleContainer.cxx:3
 AliParticleContainer.cxx:4
 AliParticleContainer.cxx:5
 AliParticleContainer.cxx:6
 AliParticleContainer.cxx:7
 AliParticleContainer.cxx:8
 AliParticleContainer.cxx:9
 AliParticleContainer.cxx:10
 AliParticleContainer.cxx:11
 AliParticleContainer.cxx:12
 AliParticleContainer.cxx:13
 AliParticleContainer.cxx:14
 AliParticleContainer.cxx:15
 AliParticleContainer.cxx:16
 AliParticleContainer.cxx:17
 AliParticleContainer.cxx:18
 AliParticleContainer.cxx:19
 AliParticleContainer.cxx:20
 AliParticleContainer.cxx:21
 AliParticleContainer.cxx:22
 AliParticleContainer.cxx:23
 AliParticleContainer.cxx:24
 AliParticleContainer.cxx:25
 AliParticleContainer.cxx:26
 AliParticleContainer.cxx:27
 AliParticleContainer.cxx:28
 AliParticleContainer.cxx:29
 AliParticleContainer.cxx:30
 AliParticleContainer.cxx:31
 AliParticleContainer.cxx:32
 AliParticleContainer.cxx:33
 AliParticleContainer.cxx:34
 AliParticleContainer.cxx:35
 AliParticleContainer.cxx:36
 AliParticleContainer.cxx:37
 AliParticleContainer.cxx:38
 AliParticleContainer.cxx:39
 AliParticleContainer.cxx:40
 AliParticleContainer.cxx:41
 AliParticleContainer.cxx:42
 AliParticleContainer.cxx:43
 AliParticleContainer.cxx:44
 AliParticleContainer.cxx:45
 AliParticleContainer.cxx:46
 AliParticleContainer.cxx:47
 AliParticleContainer.cxx:48
 AliParticleContainer.cxx:49
 AliParticleContainer.cxx:50
 AliParticleContainer.cxx:51
 AliParticleContainer.cxx:52
 AliParticleContainer.cxx:53
 AliParticleContainer.cxx:54
 AliParticleContainer.cxx:55
 AliParticleContainer.cxx:56
 AliParticleContainer.cxx:57
 AliParticleContainer.cxx:58
 AliParticleContainer.cxx:59
 AliParticleContainer.cxx:60
 AliParticleContainer.cxx:61
 AliParticleContainer.cxx:62
 AliParticleContainer.cxx:63
 AliParticleContainer.cxx:64
 AliParticleContainer.cxx:65
 AliParticleContainer.cxx:66
 AliParticleContainer.cxx:67
 AliParticleContainer.cxx:68
 AliParticleContainer.cxx:69
 AliParticleContainer.cxx:70
 AliParticleContainer.cxx:71
 AliParticleContainer.cxx:72
 AliParticleContainer.cxx:73
 AliParticleContainer.cxx:74
 AliParticleContainer.cxx:75
 AliParticleContainer.cxx:76
 AliParticleContainer.cxx:77
 AliParticleContainer.cxx:78
 AliParticleContainer.cxx:79
 AliParticleContainer.cxx:80
 AliParticleContainer.cxx:81
 AliParticleContainer.cxx:82
 AliParticleContainer.cxx:83
 AliParticleContainer.cxx:84
 AliParticleContainer.cxx:85
 AliParticleContainer.cxx:86
 AliParticleContainer.cxx:87
 AliParticleContainer.cxx:88
 AliParticleContainer.cxx:89
 AliParticleContainer.cxx:90
 AliParticleContainer.cxx:91
 AliParticleContainer.cxx:92
 AliParticleContainer.cxx:93
 AliParticleContainer.cxx:94
 AliParticleContainer.cxx:95
 AliParticleContainer.cxx:96
 AliParticleContainer.cxx:97
 AliParticleContainer.cxx:98
 AliParticleContainer.cxx:99
 AliParticleContainer.cxx:100
 AliParticleContainer.cxx:101
 AliParticleContainer.cxx:102
 AliParticleContainer.cxx:103
 AliParticleContainer.cxx:104
 AliParticleContainer.cxx:105
 AliParticleContainer.cxx:106
 AliParticleContainer.cxx:107
 AliParticleContainer.cxx:108
 AliParticleContainer.cxx:109
 AliParticleContainer.cxx:110
 AliParticleContainer.cxx:111
 AliParticleContainer.cxx:112
 AliParticleContainer.cxx:113
 AliParticleContainer.cxx:114
 AliParticleContainer.cxx:115
 AliParticleContainer.cxx:116
 AliParticleContainer.cxx:117
 AliParticleContainer.cxx:118
 AliParticleContainer.cxx:119
 AliParticleContainer.cxx:120
 AliParticleContainer.cxx:121
 AliParticleContainer.cxx:122
 AliParticleContainer.cxx:123
 AliParticleContainer.cxx:124
 AliParticleContainer.cxx:125
 AliParticleContainer.cxx:126
 AliParticleContainer.cxx:127
 AliParticleContainer.cxx:128
 AliParticleContainer.cxx:129
 AliParticleContainer.cxx:130
 AliParticleContainer.cxx:131
 AliParticleContainer.cxx:132
 AliParticleContainer.cxx:133
 AliParticleContainer.cxx:134
 AliParticleContainer.cxx:135
 AliParticleContainer.cxx:136
 AliParticleContainer.cxx:137
 AliParticleContainer.cxx:138
 AliParticleContainer.cxx:139
 AliParticleContainer.cxx:140
 AliParticleContainer.cxx:141
 AliParticleContainer.cxx:142
 AliParticleContainer.cxx:143
 AliParticleContainer.cxx:144
 AliParticleContainer.cxx:145
 AliParticleContainer.cxx:146
 AliParticleContainer.cxx:147
 AliParticleContainer.cxx:148
 AliParticleContainer.cxx:149
 AliParticleContainer.cxx:150
 AliParticleContainer.cxx:151
 AliParticleContainer.cxx:152
 AliParticleContainer.cxx:153
 AliParticleContainer.cxx:154
 AliParticleContainer.cxx:155
 AliParticleContainer.cxx:156
 AliParticleContainer.cxx:157
 AliParticleContainer.cxx:158
 AliParticleContainer.cxx:159
 AliParticleContainer.cxx:160
 AliParticleContainer.cxx:161
 AliParticleContainer.cxx:162
 AliParticleContainer.cxx:163
 AliParticleContainer.cxx:164
 AliParticleContainer.cxx:165
 AliParticleContainer.cxx:166
 AliParticleContainer.cxx:167
 AliParticleContainer.cxx:168
 AliParticleContainer.cxx:169
 AliParticleContainer.cxx:170
 AliParticleContainer.cxx:171
 AliParticleContainer.cxx:172
 AliParticleContainer.cxx:173
 AliParticleContainer.cxx:174
 AliParticleContainer.cxx:175
 AliParticleContainer.cxx:176
 AliParticleContainer.cxx:177
 AliParticleContainer.cxx:178
 AliParticleContainer.cxx:179
 AliParticleContainer.cxx:180
 AliParticleContainer.cxx:181
 AliParticleContainer.cxx:182
 AliParticleContainer.cxx:183
 AliParticleContainer.cxx:184
 AliParticleContainer.cxx:185
 AliParticleContainer.cxx:186
 AliParticleContainer.cxx:187
 AliParticleContainer.cxx:188
 AliParticleContainer.cxx:189
 AliParticleContainer.cxx:190
 AliParticleContainer.cxx:191
 AliParticleContainer.cxx:192
 AliParticleContainer.cxx:193
 AliParticleContainer.cxx:194
 AliParticleContainer.cxx:195
 AliParticleContainer.cxx:196
 AliParticleContainer.cxx:197
 AliParticleContainer.cxx:198
 AliParticleContainer.cxx:199
 AliParticleContainer.cxx:200
 AliParticleContainer.cxx:201
 AliParticleContainer.cxx:202
 AliParticleContainer.cxx:203
 AliParticleContainer.cxx:204
 AliParticleContainer.cxx:205
 AliParticleContainer.cxx:206
 AliParticleContainer.cxx:207
 AliParticleContainer.cxx:208
 AliParticleContainer.cxx:209
 AliParticleContainer.cxx:210
 AliParticleContainer.cxx:211
 AliParticleContainer.cxx:212
 AliParticleContainer.cxx:213
 AliParticleContainer.cxx:214
 AliParticleContainer.cxx:215
 AliParticleContainer.cxx:216
 AliParticleContainer.cxx:217
 AliParticleContainer.cxx:218
 AliParticleContainer.cxx:219
 AliParticleContainer.cxx:220
 AliParticleContainer.cxx:221
 AliParticleContainer.cxx:222
 AliParticleContainer.cxx:223
 AliParticleContainer.cxx:224
 AliParticleContainer.cxx:225
 AliParticleContainer.cxx:226
 AliParticleContainer.cxx:227
 AliParticleContainer.cxx:228
 AliParticleContainer.cxx:229
 AliParticleContainer.cxx:230
 AliParticleContainer.cxx:231
 AliParticleContainer.cxx:232
 AliParticleContainer.cxx:233
 AliParticleContainer.cxx:234
 AliParticleContainer.cxx:235
 AliParticleContainer.cxx:236
 AliParticleContainer.cxx:237
 AliParticleContainer.cxx:238
 AliParticleContainer.cxx:239
 AliParticleContainer.cxx:240
 AliParticleContainer.cxx:241
 AliParticleContainer.cxx:242
 AliParticleContainer.cxx:243
 AliParticleContainer.cxx:244
 AliParticleContainer.cxx:245
 AliParticleContainer.cxx:246
 AliParticleContainer.cxx:247
 AliParticleContainer.cxx:248
 AliParticleContainer.cxx:249
 AliParticleContainer.cxx:250
 AliParticleContainer.cxx:251
 AliParticleContainer.cxx:252
 AliParticleContainer.cxx:253
 AliParticleContainer.cxx:254
 AliParticleContainer.cxx:255
 AliParticleContainer.cxx:256
 AliParticleContainer.cxx:257
 AliParticleContainer.cxx:258
 AliParticleContainer.cxx:259
 AliParticleContainer.cxx:260
 AliParticleContainer.cxx:261
 AliParticleContainer.cxx:262
 AliParticleContainer.cxx:263
 AliParticleContainer.cxx:264
 AliParticleContainer.cxx:265
 AliParticleContainer.cxx:266
 AliParticleContainer.cxx:267
 AliParticleContainer.cxx:268
 AliParticleContainer.cxx:269
 AliParticleContainer.cxx:270
 AliParticleContainer.cxx:271
 AliParticleContainer.cxx:272