ROOT logo
#ifndef ALIRSNDAUGHTER_H
#define ALIRSNDAUGHTER_H

//
// Interface to single daughter candidate.
// Used for old-version analysis and for
// selecting tracks in mini package
//

#include <TMath.h>
#include <TLorentzVector.h>

#include "AliPID.h"
#include "AliVTrack.h"
#include "AliESDtrack.h"
#include "AliESDv0.h"
#include "AliESDcascade.h"
#include "AliMCParticle.h"
#include "AliAODTrack.h"
#include "AliAODv0.h"
#include "AliAODcascade.h"
#include "AliAODMCParticle.h"

class AliRsnEvent;

typedef AliPID::EParticleType EPARTYPE;

class AliRsnDaughter : public TObject {
public:

   enum ERefType {
      kTrack,
      kV0,
      kCascade,
      kNoType
   };

   enum ESpecies {
      kElectron,
      kMuon,
      kPion,
      kKaon,
      kProton,
      kKaon0,
      kLambda,
      kXi,
      kOmega,
      kUnknown
   };

   AliRsnDaughter() : fOK(kFALSE), fLabel(-1), fMotherPDG(0), fRsnID(-1),
      fPrec(), fPsim(), fRef(0x0), fRefMC(0x0), fOwnerEvent(0x0) { }
   AliRsnDaughter(const AliRsnDaughter &copy);
   AliRsnDaughter &operator= (const AliRsnDaughter &copy);
   virtual ~AliRsnDaughter() { /*empty, since pointers must not be deleted*/ }

   // basic getters
   Bool_t          IsOK()          const {return fOK;}
   Int_t           GetLabel()      const {return fLabel;}
   Int_t           GetMotherPDG()  const {return fMotherPDG;}
   Int_t           GetRsnID()      const {return fRsnID;}
   AliVParticle   *GetRef()              {return fRef;}
   AliVParticle   *GetRefMC()            {return fRefMC;}
   AliRsnEvent    *GetOwnerEvent()       {return fOwnerEvent;}
   TLorentzVector &P(Bool_t mc)          {return (mc ? fPsim : fPrec);}
   TLorentzVector &Prec()                {return fPrec;}
   TLorentzVector &Psim()                {return fPsim;}
   Int_t           GetPDG();
   Int_t           GetPDGAbs()           {return TMath::Abs(GetPDG());}
   Int_t           GetID();
   Int_t           GetMother();

   // basic setters (for data members)
   void  Reset();
   void  SetOK(Bool_t ok)              {fOK = ok;}
   void  SetBad()                      {fOK = kFALSE;}
   void  SetGood()                     {fOK = kTRUE;}
   void  SetLabel(Int_t label)         {fLabel = label;}
   void  SetMotherPDG(Int_t value)     {fMotherPDG = value;}
   void  SetRsnID(Int_t id)            {fRsnID = id;}
   void  SetRef(AliVParticle *p)       {fRef = p;}
   void  SetRefMC(AliVParticle *p)     {fRefMC = p;}
   void  SetOwnerEvent(AliRsnEvent *e) {fOwnerEvent = e;}

   // additional functions
   void  FillP(Double_t mass);
   void  Print(Option_t *o = "") const;

   // getters related to charge
   Bool_t   IsPos()      const {if (fRef) return (fRef->Charge() > 0); return kFALSE;}
   Bool_t   IsNeg()      const {if (fRef) return (fRef->Charge() < 0); return kFALSE;}
   Bool_t   IsCharged()  const {if (fRef) return (IsPos() || IsNeg()); return kFALSE;}
   Bool_t   IsNeutral()  const {if (fRef) return (!IsCharged());       return kFALSE;}
   Short_t  ChargeS()    const {if (IsPos()) return  1 ; else if (IsNeg()) return -1 ; else return  0 ;}
   Char_t   ChargeC()    const {if (IsPos()) return '+'; else if (IsNeg()) return '-'; else return '0';}

   // getters which automatically convert refs into allowed types
   static Bool_t     Match(AliVParticle *p, TClass *ref) {if (p) return (p->InheritsFrom(ref)); return kFALSE;}
   Bool_t            MatchRef(TClass *ref)               {return Match(fRef, ref);}
   Bool_t            MatchRefMC(TClass *ref)             {return Match(fRefMC, ref);}
   ERefType          RefType();
   Bool_t            IsESD();
   Bool_t            IsAOD();

   AliVTrack        *Ref2Vtrack()        {if (Match(fRef, AliVTrack    ::Class())) return static_cast<AliVTrack *>       (fRef); return 0x0;}
   AliESDtrack      *Ref2ESDtrack()      {if (Match(fRef, AliESDtrack  ::Class())) return static_cast<AliESDtrack *>     (fRef); return 0x0;}
   AliAODTrack      *Ref2AODtrack()      {if (Match(fRef, AliAODTrack  ::Class())) return static_cast<AliAODTrack *>     (fRef); return 0x0;}
   AliMCParticle    *Ref2MCparticle()    {if (Match(fRef, AliMCParticle::Class())) return static_cast<AliMCParticle *>   (fRef); return 0x0;}
   AliAODMCParticle *Ref2AODMCparticle() {if (Match(fRef, AliMCParticle::Class())) return static_cast<AliAODMCParticle *>(fRef); return 0x0;}

   AliESDv0         *Ref2ESDv0()         {if (Match(fRef, AliESDv0     ::Class())) return static_cast<AliESDv0 *>(fRef); return 0x0;}
   AliAODv0         *Ref2AODv0()         {if (Match(fRef, AliAODv0     ::Class())) return static_cast<AliAODv0 *>(fRef); return 0x0;}

   AliESDcascade    *Ref2ESDcascade()    {if (Match(fRef, AliESDcascade::Class())) return static_cast<AliESDcascade *>(fRef); return 0x0;}
   AliAODcascade    *Ref2AODcascade()    {if (Match(fRef, AliAODcascade::Class())) return static_cast<AliAODcascade *>(fRef); return 0x0;}

   AliMCParticle    *RefMC2ESD()         {if (Match(fRefMC, AliMCParticle   ::Class())) return static_cast<AliMCParticle *>   (fRef)  ; return 0x0;}
   AliAODMCParticle *RefMC2AOD()         {if (Match(fRefMC, AliAODMCParticle::Class())) return static_cast<AliAODMCParticle *>(fRefMC); return 0x0;}

   // static functions related to internal ESpecies enum
   static ERefType    RefType(ESpecies species);
   static Bool_t      IsCharged(ESpecies species) {return (species <= kProton);}
   static const char *SpeciesName(ESpecies species);
   static Int_t       SpeciesPDG(ESpecies species);
   static Double_t    SpeciesMass(ESpecies species);
   static EPARTYPE    ToAliPID(ESpecies species);
   static ESpecies    FromAliPID(EPARTYPE species);

private:

   Bool_t         fOK;          // internal utility flag which is kFALSE when this object should not be used
   Int_t          fLabel;       // index of MC particle
   Int_t          fMotherPDG;   // PDG code of mother (makes sense only if fRefMC is defined)
   Int_t          fRsnID;       // internal ID for monitoring purposes

   TLorentzVector fPrec;        // 4-momentum for rec
   TLorentzVector fPsim;        // 4-momentum for MC

   AliVParticle  *fRef;         // reference to reconstructed object
   AliVParticle  *fRefMC;       // reference to corresponding MC particle
   AliRsnEvent   *fOwnerEvent;  // pointer to owner event

   ClassDef(AliRsnDaughter, 12)
};

//__________________________________________________________________________________________________
inline AliRsnDaughter::ERefType AliRsnDaughter::RefType()
{
//
// Returns the enum value corresponding to the real nature
// of the object pointed by the fRef data member
//

   if (Match(fRef, AliESDtrack  ::Class())) return kTrack;
   if (Match(fRef, AliESDv0     ::Class())) return kV0;
   if (Match(fRef, AliESDcascade::Class())) return kCascade;
   if (Match(fRef, AliAODTrack  ::Class())) return kTrack;
   if (Match(fRef, AliAODv0     ::Class())) return kV0;
   if (Match(fRef, AliAODcascade::Class())) return kCascade;
   if (Match(fRef, AliMCParticle::Class())) return kTrack;

   return kNoType;
}

//__________________________________________________________________________________________________
inline Bool_t AliRsnDaughter::IsESD()
{
//
// Tells if the object pointed by fRef data member is ESD
// NOTE: it is true even when fRef is the MC corresponding
//       object (= AliMCParticle)
//

   if (Match(fRef, AliESDtrack  ::Class())) return kTRUE;
   if (Match(fRef, AliESDv0     ::Class())) return kTRUE;
   if (Match(fRef, AliESDcascade::Class())) return kTRUE;
   if (Match(fRef, AliMCParticle::Class())) return kTRUE;

   return kFALSE;
}

//__________________________________________________________________________________________________
inline Bool_t AliRsnDaughter::IsAOD()
{
//
// Tells if the object pointed by fRef data member is AOD
// NOTE: it is true even when fRef is the MC corresponding
//       object (= AliAODMCParticle)
//

   if (Match(fRef, AliAODTrack     ::Class())) return kTRUE;
   if (Match(fRef, AliAODv0        ::Class())) return kTRUE;
   if (Match(fRef, AliAODcascade   ::Class())) return kTRUE;
   if (Match(fRef, AliAODMCParticle::Class())) return kTRUE;

   return kFALSE;
}

//__________________________________________________________________________________________________
inline AliRsnDaughter::ERefType AliRsnDaughter::RefType(ESpecies species)
{
//
// Returns the expected object type for a candidate daughter
// of the given species.
//

   switch (species) {
      case kElectron:
      case kMuon:
      case kPion:
      case kKaon:
      case kProton:
         return kTrack;
      case kKaon0:
      case kLambda:
         return kV0;
      case kXi:
      case kOmega:
         return kCascade;
      default:
         return kNoType;
   }
}

//__________________________________________________________________________________________________
inline void AliRsnDaughter::FillP(Double_t mass)
{
//
// Fills the 4-momentum data member using the values in the
// AliVParticle pointer data members, choosing according to arguments
//

   if (fRefMC) fPsim.SetXYZM(fRefMC->Px(), fRefMC->Py(), fRefMC->Pz(), mass);
   if (fRef)   fPrec.SetXYZM(fRef  ->Px(), fRef  ->Py(), fRef  ->Pz(), mass);
}

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