ROOT logo
#ifndef ALIAODPWG4PARTICLE_H
#define ALIAODPWG4PARTICLE_H
/* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id: AliAODPWG4Particle.h  $ */

//-------------------------------------------------------------------------
//     AOD objects class in use in the CaloTrackCorrelations
//     analysis pacackge ($ALICE_ROOT/PWGGA/CaloTrackCorrelations)
//
//     Author: Gustavo Conesa Balbastre - CNRS-LPSC-Grenoble
//-------------------------------------------------------------------------

//-- ROOT system --
#include <TLorentzVector.h>
class TString;

//-- Analysis system
#include "AliVParticle.h"

class AliAODPWG4Particle : public AliVParticle {
  
 public:
  
  AliAODPWG4Particle();
  AliAODPWG4Particle(Double_t px, Double_t py, Double_t pz, Double_t e);
  AliAODPWG4Particle(TLorentzVector & p);
  
  virtual ~AliAODPWG4Particle();
  virtual void Clear(const Option_t* /*opt*/);

  AliAODPWG4Particle (           const AliAODPWG4Particle& photon);
  AliAODPWG4Particle & operator=(const AliAODPWG4Particle& photon);

  // Main methods to recover kinematics or PID
  TLorentzVector * Momentum() const                { return fMomentum ; }
  virtual void     SetMomentum(TLorentzVector *lv) { fMomentum = lv   ; }
  
  Bool_t IsPIDOK(const Int_t ipid, const Int_t pdgwanted) const;
  Double_t GetPairMass(AliAODPWG4Particle * p)const{ return (*(p->fMomentum)+*fMomentum).M(); }
  
  // AliVParticle methods
  virtual Double_t Px()         const { return fMomentum->Px();      }
  virtual Double_t Py()         const { return fMomentum->Py();      }
  virtual Double_t Pz()         const { return fMomentum->Pz();      }
  virtual Double_t Pt()         const { return fMomentum->Pt();      }
  virtual Double_t P()          const { return fMomentum->P();       }
  virtual Bool_t   PxPyPz(Double_t p[3]) const { p[0] = Px(); p[1] = Py(); p[2] = Pz(); return kTRUE; }
  virtual Double_t OneOverPt()  const { return 1. / fMomentum->Pt(); }
  virtual Double_t Phi()        const;
  virtual Double_t Theta()      const { return fMomentum->Theta();   }
  virtual Double_t E()          const { return fMomentum->E();       }
  virtual Double_t M()          const { return fMomentum->M();       }
  virtual Double_t Eta()        const { return fMomentum->Eta();     }
  virtual Double_t Y()          const { return fMomentum->Rapidity();}
  virtual Double_t Xv()         const { return -999.;} // put reasonable values here
  virtual Double_t Yv()         const { return -999.;} //
  virtual Double_t Zv()         const { return -999.;} //
  virtual Bool_t   XvYvZv(Double_t x[3]) const { x[0] = Xv(); x[1] = Yv(); x[2] = Zv(); return kTRUE; }  
  virtual void     Print(Option_t* /*option*/) const;
  
  //
  //Dummy
  virtual Short_t Charge()      const { return 0;}
  virtual const Double_t* PID() const { return NULL;}
  Int_t   PdgCode() const {return 0;}
  //

  //
  // Specific getters
  virtual Int_t   GetIdentifiedParticleType() const { return fPdg     ; }

  virtual Int_t   GetLabel()             const { return fLabel        ; }
  virtual Int_t   GetCaloLabel (Int_t i) const { return fCaloLabel[i] ; }
  virtual Int_t   GetTrackLabel(Int_t i) const { return fTrackLabel[i]; }
  virtual UInt_t  GetDetectorTag()       const { return fDetectorTag  ; }
  virtual Bool_t  GetDispBit()           const { return fDisp         ; }
  virtual Bool_t  GetTOFBit()            const { return fTof          ; }
  virtual Bool_t  GetChargedBit()        const { return fCharged      ; }
  virtual Int_t   DistToBad()            const { return fBadDist      ; }
  virtual Int_t   GetInputFileIndex()    const { return fInputFileIndex ; }
  virtual Int_t   GetFiducialArea()      const { return fFidArea      ; }

  // Tags
  virtual Int_t   GetTag()               const { return fTag          ; }
  virtual Bool_t  IsTagged()             const { return fTagged       ; }
  virtual Int_t   DecayTag()             const { return fDecayTag     ; }
  virtual Bool_t  IsIsolated()           const { return fIsolated     ; }
  virtual Bool_t  IsLeadingParticle()    const { return fLeadingParticle ; }

  // Calorimeter specific param
  virtual Int_t   GetNLM()               const { return fNLM          ; }
  virtual Float_t GetM02()               const { return fM02          ; }
  virtual Float_t GetTime()              const { return fTime         ; }
  virtual Int_t   GetNCells()            const { return fNCells       ; }
  virtual Int_t   GetSModNumber()        const { return fSuperModule  ; }

  //
  // Specific setters
  virtual void SetIdentifiedParticleType(Int_t pdg) { fPdg = pdg ; }

  virtual void SetLabel(Int_t l)         { fLabel = l ; }
  virtual void SetCaloLabel (Int_t a, Int_t b) { fCaloLabel [0] = a; fCaloLabel [1] = b  ; }
  virtual void SetTrackLabel(Int_t a, Int_t b) { fTrackLabel[0] = a; fTrackLabel[1] = b  ; }
  virtual void SetTrackLabel(Int_t a, Int_t b, Int_t c, Int_t d) 
  { fTrackLabel[0] = a; fTrackLabel[1] = b  ; fTrackLabel[2] = c; fTrackLabel[3] = d; }
  
  virtual void SetDetectorTag(UInt_t d)  { fDetectorTag = d    ; }
  virtual void SetDispBit(Bool_t disp)   { fDisp        = disp ; }
  virtual void SetTOFBit(Bool_t tof)     { fTof         = tof  ; }
  virtual void SetChargedBit(Bool_t ch)  { fCharged     = ch   ; }
  virtual void SetDistToBad(Int_t dist)  { fBadDist     = dist ; }
  virtual void SetInputFileIndex(Int_t i){ fInputFileIndex = i ; }
  virtual void SetFiducialArea(Int_t a)  { fFidArea     = a    ; }

  // Tags
  virtual void SetTag(Int_t tag)         { fTag         = tag  ; }
  virtual void SetTagged(Bool_t tag)     { fTagged      = tag  ; }
  virtual void SetDecayTag(Int_t tag)    { fDecayTag    = tag  ; }
  virtual void SetIsolated(Bool_t iso)   { fIsolated    = iso  ; }
  virtual void SetLeadingParticle(Bool_t l) { fLeadingParticle = l ; }
  
  // Calorimeter specific param
  virtual void SetNLM   (Int_t   nlm)    { fNLM         = nlm  ; }
  virtual void SetM02   (Float_t m02)    { fM02         = m02  ; }
  virtual void SetTime  (Float_t tim)    { fTime        = tim  ; }
  virtual void SetNCells(Int_t   nce)    { fNCells      = nce  ; }
  virtual void SetSModNumber(Int_t sm)   { fSuperModule = sm   ; }
  
  //
  // BTagging
  // enumerated type for various b-tags of electrons
  enum btagTypes {kDVMTag0, kDVMTag1, kDVMTag2, kTransverseIPTag, kUnknownTag};
  
  virtual void  SetBtag(Int_t tag)      { fBtag        = tag  ; }
  virtual Int_t GetBtag()         const { return fBtag        ; }

  void SetBTagBit(Int_t &tag, const UInt_t set) const {
    // Set bit of type set (btagTypes) in tag
    tag |= (1<<set) ;
  }
  
  Bool_t CheckBTagBit(const Int_t tag, const UInt_t test) const {
    // Check if in fBtag the bit test (btagTypes) is set.
    if (tag & (1<<test) ) return  kTRUE ;
    else return kFALSE ;
  }
  
 private:
  
  TLorentzVector* fMomentum; // Photon 4-momentum vector
  Int_t      fPdg ;          // type of identified particle, same code as PDG, but this is not a MonteCarlo particle 
  Int_t      fTag ;          // tag of particle (decay, fragment, prompt photon), MC
  Int_t      fLabel ;        // MC label
  Int_t      fCaloLabel[2];  // CaloCluster index, 1 for photons, 2 for pi0.
  Int_t      fTrackLabel[4]; // Track lable, 1 for pions, 2 for conversion photons 
  UInt_t     fDetectorTag ;  // Detector where particle was measured, integer
  
  // Calo specific
  Int_t      fBadDist ;      // Distance to bad module in module units
  UInt_t     fNLM ;          // Store the number of local maxima
  Float_t    fM02 ;          // Store the main axis of the calorimeter shower shape
  Float_t    fTime;          // Store the time of cluster or track, nano seconds
  Int_t      fNCells;        // Store the number of cells in cluster
  Int_t      fSuperModule;   // Store the super-module number of cluster
  
  // Tags
  Int_t      fDecayTag;      // Tag the photon as decay from, pi0, eta, pi0 side band, eta side band
  Bool_t     fIsolated ;     // Particle is isolated or not
  Bool_t     fLeadingParticle ; //Particle is leading or not

  // PID bits
  Bool_t     fDisp ;         // Dispersion bit
  Bool_t     fTof ;          // TOF bit
  Bool_t     fCharged ;      // Charged bit

  // Not in use currently ...
  Bool_t     fTagged ;       // If photon tagged (pi0 decay), not used anymore, replace by fDecayTag
  Int_t      fFidArea ;      // Type of fiducial area hit by this photon
  Int_t      fInputFileIndex;// 0, standard input, 1 first input added. Only possible one for now, not really used.
  Int_t      fBtag;          // tag particle from B.

  
  ClassDef(AliAODPWG4Particle, 6);
};

inline Double_t AliAODPWG4Particle::Phi() const
{
  // Return phi
  Double_t phi = fMomentum->Phi();
  if (phi < 0.) phi += TMath::TwoPi();
  return phi;
}

#endif //ALIAODPWG4PARTICLE_H
 AliAODPWG4Particle.h:1
 AliAODPWG4Particle.h:2
 AliAODPWG4Particle.h:3
 AliAODPWG4Particle.h:4
 AliAODPWG4Particle.h:5
 AliAODPWG4Particle.h:6
 AliAODPWG4Particle.h:7
 AliAODPWG4Particle.h:8
 AliAODPWG4Particle.h:9
 AliAODPWG4Particle.h:10
 AliAODPWG4Particle.h:11
 AliAODPWG4Particle.h:12
 AliAODPWG4Particle.h:13
 AliAODPWG4Particle.h:14
 AliAODPWG4Particle.h:15
 AliAODPWG4Particle.h:16
 AliAODPWG4Particle.h:17
 AliAODPWG4Particle.h:18
 AliAODPWG4Particle.h:19
 AliAODPWG4Particle.h:20
 AliAODPWG4Particle.h:21
 AliAODPWG4Particle.h:22
 AliAODPWG4Particle.h:23
 AliAODPWG4Particle.h:24
 AliAODPWG4Particle.h:25
 AliAODPWG4Particle.h:26
 AliAODPWG4Particle.h:27
 AliAODPWG4Particle.h:28
 AliAODPWG4Particle.h:29
 AliAODPWG4Particle.h:30
 AliAODPWG4Particle.h:31
 AliAODPWG4Particle.h:32
 AliAODPWG4Particle.h:33
 AliAODPWG4Particle.h:34
 AliAODPWG4Particle.h:35
 AliAODPWG4Particle.h:36
 AliAODPWG4Particle.h:37
 AliAODPWG4Particle.h:38
 AliAODPWG4Particle.h:39
 AliAODPWG4Particle.h:40
 AliAODPWG4Particle.h:41
 AliAODPWG4Particle.h:42
 AliAODPWG4Particle.h:43
 AliAODPWG4Particle.h:44
 AliAODPWG4Particle.h:45
 AliAODPWG4Particle.h:46
 AliAODPWG4Particle.h:47
 AliAODPWG4Particle.h:48
 AliAODPWG4Particle.h:49
 AliAODPWG4Particle.h:50
 AliAODPWG4Particle.h:51
 AliAODPWG4Particle.h:52
 AliAODPWG4Particle.h:53
 AliAODPWG4Particle.h:54
 AliAODPWG4Particle.h:55
 AliAODPWG4Particle.h:56
 AliAODPWG4Particle.h:57
 AliAODPWG4Particle.h:58
 AliAODPWG4Particle.h:59
 AliAODPWG4Particle.h:60
 AliAODPWG4Particle.h:61
 AliAODPWG4Particle.h:62
 AliAODPWG4Particle.h:63
 AliAODPWG4Particle.h:64
 AliAODPWG4Particle.h:65
 AliAODPWG4Particle.h:66
 AliAODPWG4Particle.h:67
 AliAODPWG4Particle.h:68
 AliAODPWG4Particle.h:69
 AliAODPWG4Particle.h:70
 AliAODPWG4Particle.h:71
 AliAODPWG4Particle.h:72
 AliAODPWG4Particle.h:73
 AliAODPWG4Particle.h:74
 AliAODPWG4Particle.h:75
 AliAODPWG4Particle.h:76
 AliAODPWG4Particle.h:77
 AliAODPWG4Particle.h:78
 AliAODPWG4Particle.h:79
 AliAODPWG4Particle.h:80
 AliAODPWG4Particle.h:81
 AliAODPWG4Particle.h:82
 AliAODPWG4Particle.h:83
 AliAODPWG4Particle.h:84
 AliAODPWG4Particle.h:85
 AliAODPWG4Particle.h:86
 AliAODPWG4Particle.h:87
 AliAODPWG4Particle.h:88
 AliAODPWG4Particle.h:89
 AliAODPWG4Particle.h:90
 AliAODPWG4Particle.h:91
 AliAODPWG4Particle.h:92
 AliAODPWG4Particle.h:93
 AliAODPWG4Particle.h:94
 AliAODPWG4Particle.h:95
 AliAODPWG4Particle.h:96
 AliAODPWG4Particle.h:97
 AliAODPWG4Particle.h:98
 AliAODPWG4Particle.h:99
 AliAODPWG4Particle.h:100
 AliAODPWG4Particle.h:101
 AliAODPWG4Particle.h:102
 AliAODPWG4Particle.h:103
 AliAODPWG4Particle.h:104
 AliAODPWG4Particle.h:105
 AliAODPWG4Particle.h:106
 AliAODPWG4Particle.h:107
 AliAODPWG4Particle.h:108
 AliAODPWG4Particle.h:109
 AliAODPWG4Particle.h:110
 AliAODPWG4Particle.h:111
 AliAODPWG4Particle.h:112
 AliAODPWG4Particle.h:113
 AliAODPWG4Particle.h:114
 AliAODPWG4Particle.h:115
 AliAODPWG4Particle.h:116
 AliAODPWG4Particle.h:117
 AliAODPWG4Particle.h:118
 AliAODPWG4Particle.h:119
 AliAODPWG4Particle.h:120
 AliAODPWG4Particle.h:121
 AliAODPWG4Particle.h:122
 AliAODPWG4Particle.h:123
 AliAODPWG4Particle.h:124
 AliAODPWG4Particle.h:125
 AliAODPWG4Particle.h:126
 AliAODPWG4Particle.h:127
 AliAODPWG4Particle.h:128
 AliAODPWG4Particle.h:129
 AliAODPWG4Particle.h:130
 AliAODPWG4Particle.h:131
 AliAODPWG4Particle.h:132
 AliAODPWG4Particle.h:133
 AliAODPWG4Particle.h:134
 AliAODPWG4Particle.h:135
 AliAODPWG4Particle.h:136
 AliAODPWG4Particle.h:137
 AliAODPWG4Particle.h:138
 AliAODPWG4Particle.h:139
 AliAODPWG4Particle.h:140
 AliAODPWG4Particle.h:141
 AliAODPWG4Particle.h:142
 AliAODPWG4Particle.h:143
 AliAODPWG4Particle.h:144
 AliAODPWG4Particle.h:145
 AliAODPWG4Particle.h:146
 AliAODPWG4Particle.h:147
 AliAODPWG4Particle.h:148
 AliAODPWG4Particle.h:149
 AliAODPWG4Particle.h:150
 AliAODPWG4Particle.h:151
 AliAODPWG4Particle.h:152
 AliAODPWG4Particle.h:153
 AliAODPWG4Particle.h:154
 AliAODPWG4Particle.h:155
 AliAODPWG4Particle.h:156
 AliAODPWG4Particle.h:157
 AliAODPWG4Particle.h:158
 AliAODPWG4Particle.h:159
 AliAODPWG4Particle.h:160
 AliAODPWG4Particle.h:161
 AliAODPWG4Particle.h:162
 AliAODPWG4Particle.h:163
 AliAODPWG4Particle.h:164
 AliAODPWG4Particle.h:165
 AliAODPWG4Particle.h:166
 AliAODPWG4Particle.h:167
 AliAODPWG4Particle.h:168
 AliAODPWG4Particle.h:169
 AliAODPWG4Particle.h:170
 AliAODPWG4Particle.h:171
 AliAODPWG4Particle.h:172
 AliAODPWG4Particle.h:173
 AliAODPWG4Particle.h:174
 AliAODPWG4Particle.h:175
 AliAODPWG4Particle.h:176
 AliAODPWG4Particle.h:177
 AliAODPWG4Particle.h:178
 AliAODPWG4Particle.h:179
 AliAODPWG4Particle.h:180
 AliAODPWG4Particle.h:181
 AliAODPWG4Particle.h:182
 AliAODPWG4Particle.h:183
 AliAODPWG4Particle.h:184
 AliAODPWG4Particle.h:185
 AliAODPWG4Particle.h:186
 AliAODPWG4Particle.h:187
 AliAODPWG4Particle.h:188
 AliAODPWG4Particle.h:189
 AliAODPWG4Particle.h:190
 AliAODPWG4Particle.h:191
 AliAODPWG4Particle.h:192
 AliAODPWG4Particle.h:193
 AliAODPWG4Particle.h:194
 AliAODPWG4Particle.h:195
 AliAODPWG4Particle.h:196