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


//-------------------------------------------------------------------------
//     AliVParticle realisation for MC Particles in the AOD
//     Stripped dow AliMCParticle
//     Author: Christian Klein Bösing, CERN
//-------------------------------------------------------------------------

#include <Rtypes.h>
#include <TParticlePDG.h>
#include <TExMap.h>
#include <TString.h>


#include "AliTrackReference.h"
#include "AliVParticle.h"
#include "AliMCParticle.h"

class AliAODEvent;
class TParticle;
class TClonesArray;

class AliAODMCParticle: public AliVParticle {
 public:
  AliAODMCParticle();
  AliAODMCParticle(const AliMCParticle* part, Int_t label=0,Int_t flag = 0);
  virtual ~AliAODMCParticle(){};
  AliAODMCParticle(const AliAODMCParticle& mcPart); 
  AliAODMCParticle& operator=(const AliAODMCParticle& mcPart);
  
  // Kinematics
    virtual Double_t Px()        const;
    virtual Double_t Py()        const;
    virtual Double_t Pz()        const;
    virtual Double_t Pt()        const;
    virtual Double_t P()         const;
    virtual Bool_t   PxPyPz(Double_t p[3]) const;
    
    virtual Double_t OneOverPt() const;
    virtual Double_t Phi()       const;
    virtual Double_t Theta()     const;
    
    virtual Double_t Xv() const;
    virtual Double_t Yv() const;
    virtual Double_t Zv() const;
    virtual Bool_t   XvYvZv(Double_t x[3]) const;  
    virtual Double_t T() const;

    virtual Double_t E()          const;
    virtual Double_t M()          const;
    
    virtual Double_t Eta()        const;
    virtual Double_t Y()          const;
    
    virtual Short_t Charge()      const;

    virtual Int_t   Label()       const;
    virtual Int_t   GetLabel()    const {return Label();} 
	    
    // PID
    virtual const Double_t *PID() const {return 0;} // return PID object (to be defined, still)

    // 
    virtual Double_t GetCalcMass() const;
    virtual void SetDaughter(Int_t i,Int_t id){if(i<2)fDaughter[i] = id;}
    virtual Int_t GetDaughter(Int_t i) const {if(i<2)return fDaughter[i];else return -1;}
    virtual Int_t GetNDaughters  () const { return fDaughter[1]>0 ? fDaughter[1]-fDaughter[0]+1 : (fDaughter[0]>0 ? 1:0 ) ;}
    virtual void SetMother(Int_t im){fMother = im;}
    virtual Int_t GetMother() const {return fMother;}

    virtual Int_t   GetFirstDaughter()   const {return fDaughter[0];}
    virtual Int_t   GetLastDaughter()    const {return fDaughter[1];}

    virtual void Print(const Option_t *opt = "") const;
    virtual Int_t GetPdgCode() const { return fPdgCode;}
    virtual Int_t PdgCode()    const { return GetPdgCode();}
    virtual void    SetGeneratorIndex(Short_t i) {fGeneratorIndex = i;}
    virtual Short_t GetGeneratorIndex() const {return fGeneratorIndex;}
    enum { kPrimary = 1<<0, kPhysicalPrim = 1<<1, kSecondaryFromWeakDecay = 1<<2, kSecondaryFromMaterial = 1 <<3}; // use only the first 8bits!
    virtual void SetFlag(UInt_t flag){fFlag = flag;} // carefull flag encodes three different types of information 
    virtual UInt_t GetFlag() const {return fFlag;}


    // for the status we use the upper 16 bits/2 bytes of the flag word
    void SetStatus(Int_t status){
      if(status<0)return; // a TParticle can have a negative status, catch this here and do nothing
      fFlag &= 0xffff;    // reset the upper bins keep the lower bins
      fFlag |= (((UInt_t)status)<<16); // bit shift by 16
    }
    virtual UInt_t GetStatus() const {
      // bit shift by 16
      return fFlag>>16;
    }

    // Bitwise operations
    void SetPrimary(Bool_t b = kTRUE){
      if(b)fFlag |= kPrimary;
      else fFlag &= ~kPrimary;
    }
    virtual Bool_t IsPrimary() const {return ((fFlag&kPrimary)==kPrimary);} 

    void SetPhysicalPrimary(Bool_t b = kTRUE){
     if(b)fFlag |= kPhysicalPrim;
     else fFlag &= ~kPhysicalPrim; 
    } 
    Bool_t IsPhysicalPrimary() const {return ((fFlag&kPhysicalPrim)==kPhysicalPrim);} 

    void SetSecondaryFromWeakDecay(Bool_t b = kTRUE){
     if(b)fFlag |= kSecondaryFromWeakDecay;
     else fFlag &= ~kSecondaryFromWeakDecay; 
    } 
    Bool_t IsSecondaryFromWeakDecay() const {return ((fFlag&kSecondaryFromWeakDecay)==kSecondaryFromWeakDecay);} 

    void SetSecondaryFromMaterial(Bool_t b = kTRUE){
     if(b)fFlag |= kSecondaryFromMaterial;
     else fFlag &= ~kSecondaryFromMaterial; 
    } 
    Bool_t IsSecondaryFromMaterial() const {return ((fFlag&kSecondaryFromMaterial)==kSecondaryFromMaterial);} 


    void SetMCProcessCode(UInt_t mcProcess){
      if(mcProcess>1<<7)return; // should not be larger than 46 (see TMCProcess) allow up to 128
      fFlag &= 0xffff00ff; // keep the upper bins and the lower bins just reset 9-16
      fFlag |= (mcProcess<<8); // bit shift by 8
    }

    UInt_t GetMCProcessCode(){
      return ((fFlag&0xff00)>>8); // just return bit shifted bits 9-16 
    }
    

    
    

    static const char* StdBranchName(){return fgkStdBranchName.Data();}

 private:

    static TString fgkStdBranchName;      // Standard branch name


  Int_t            fPdgCode;              // PDG code of the particle
  UInt_t           fFlag;                 // Flag for indication of primary etc, Status code in the upper 16 bits 17-32, MC process id (AKA UniqueID) in bins 16-9)  
  Int_t            fLabel;                // Label of the original MCParticle 
  Int_t            fMother;               // Index of the mother particles
  Int_t            fDaughter[2];          // Indices of the daughter particles
  Double32_t       fPx;                   // x component of momentum
  Double32_t       fPy;                   // y component of momentum
  Double32_t       fPz;                   // z component of momentum
  Double32_t       fE;                    // Energy

  Double32_t       fVx;                   // [0.,0.,12] x of production vertex
  Double32_t       fVy;                   // [0.,0.,12] y of production vertex
  Double32_t       fVz;                   // [0.,0.,12] z of production vertex
  Double32_t       fVt;                   // [0.,0.,12] t of production vertex
  Short_t          fGeneratorIndex;       //! Index of generator in cocktail     
  // Copy the uniquID to another data member? unique ID is correctly handled 
  // via TOBject Copy construct but not by AliVParticle ctor (no passing of 
  // TParticles
  // Need a flag for primaries?

  /*
    const TMCProcess kMCprocesses[kMaxMCProcess] =
    {
     kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL,
     kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
     kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
     kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic,
     kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess,
     kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
    };
  */

  ClassDef(AliAODMCParticle,8)  // AliVParticle realisation for AODMCParticles

};

inline Double_t AliAODMCParticle::Px()        const {return fPx;}
inline Double_t AliAODMCParticle::Py()        const {return fPy;}
inline Double_t AliAODMCParticle::Pz()        const {return fPz;}
inline Double_t AliAODMCParticle::Pt()        const {return TMath::Sqrt(fPx*fPx+fPy*fPy);}
inline Double_t AliAODMCParticle::P()         const {return TMath::Sqrt(fPx*fPx+fPy*fPy+fPz*fPz); }
inline Double_t AliAODMCParticle::OneOverPt() const {return 1. / Pt();}
inline Bool_t   AliAODMCParticle::PxPyPz(Double_t p[3]) const { p[0] = fPx; p[1] = fPy; p[2] = fPz; return kTRUE; }
inline Double_t AliAODMCParticle::Phi()       const {return TMath::Pi()+TMath::ATan2(-fPy,-fPx); }  // note that Phi() returns an angle between 0 and 2pi
inline Double_t AliAODMCParticle::Theta()     const {return (fPz==0)?TMath::PiOver2():TMath::ACos(fPz/P()); }
inline Double_t AliAODMCParticle::Xv()        const {return fVx;}
inline Double_t AliAODMCParticle::Yv()        const {return fVy;}
inline Double_t AliAODMCParticle::Zv()        const {return fVz;}
inline Bool_t   AliAODMCParticle::XvYvZv(Double_t x[3]) const { x[0] = fVx; x[1] = fVy; x[2] = fVz; return kTRUE; }
inline Double_t AliAODMCParticle::T()         const {return fVt;}
inline Double_t AliAODMCParticle::E()         const {return fE;}
inline Double_t AliAODMCParticle::Eta()       const {  
  Double_t pmom = P();
  if (pmom != TMath::Abs(fPz)) return 0.5*TMath::Log((pmom+fPz)/(pmom-fPz));
  else                         return 1.e30;
}


inline Double_t AliAODMCParticle::Y()         const 
{
    Double_t e  = E();
    Double_t pz = Pz();
    
    if (e > TMath::Abs(pz)) { 
	return 0.5*TMath::Log((e+pz)/(e-pz));
    } else { 
	return -999.;
    }
}

inline Int_t AliAODMCParticle::Label()       const {return fLabel;}

inline Double_t AliAODMCParticle::GetCalcMass() const {

  Double_t m2 = E()*E()-Px()*Px()-Py()*Py()-Pz()*Pz();
  if(m2<0)return 0;
  return TMath::Sqrt(m2);
}


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