ROOT logo
//
//  This class works as generic interface to each candidate resonance daughter.
//  Its main purpose is to provide a unique reference which includes all the
//  facilities available in the AliVParticle generic base class, plus all info
//  which could be needed during analysis, which are not in AliVParticle but
//  need to be accessed from ESD or AOD objects, usually in different ways.
//  When MC is available, AliRsnDaughter matches each reconstructed object with
//  its corresponding MC particle.
//
//  Currently, this interface can point to all kinds of single-particle object
//  which one can have in the reconstructed event: charged tracks, V0s and
//  cascades. It is care of the user to treat each of them in the correct way,
//  regarding cuts, functions to be computed, etc.
//
//  authors: A. Pulvirenti (alberto.pulvirenti@ct.infn.it)
//           M. Vala (martin.vala@cern.ch)
//

#include <TParticle.h>
#include <TDatabasePDG.h>

#include "AliRsnDaughter.h"

ClassImp(AliRsnDaughter)

//_____________________________________________________________________________
AliRsnDaughter::AliRsnDaughter(const AliRsnDaughter &copy) :
   TObject(copy),
   fOK(copy.fOK),
   fLabel(copy.fLabel),
   fMotherPDG(copy.fMotherPDG),
   fRsnID(copy.fRsnID),
   fPrec(copy.fPrec),
   fPsim(copy.fPsim),
   fRef(copy.fRef),
   fRefMC(copy.fRefMC),
   fOwnerEvent(copy.fOwnerEvent)
{
//
// Copy constructor.
// Pointers are NOT duplicated, since they don't come from a 'new'
// statement, but from just referencing something in the data source.
//
}

//_____________________________________________________________________________
AliRsnDaughter &AliRsnDaughter::operator=(const AliRsnDaughter &copy)
{
//
// Assignment operator.
// Pointers are NOT duplicated, since they don't come from a 'new'
// statement, but from just referencing something in the data source.
//
   if (this == &copy)
      return *this;

   fOK         = copy.fOK;
   fLabel      = copy.fLabel;
   fMotherPDG  = copy.fMotherPDG;
   fRsnID      = copy.fRsnID;
   fPsim       = copy.fPsim;
   fPrec       = copy.fPrec;
   fRef        = copy.fRef;
   fRefMC      = copy.fRefMC;
   fOwnerEvent = copy.fOwnerEvent;

   return (*this);
}

//_____________________________________________________________________________
void AliRsnDaughter::Reset()
{
//
// Reset this track to meaningless values and to a 'bad' status.
// After this has been done, this object should not be used
// for analysis unless initialized properly.
//

   fOK        = kFALSE;
   fLabel     = -1;
   fMotherPDG =  0;
   fRsnID     = -1;

   fPsim.SetXYZT(0.0, 0.0, 0.0, 0.0);
   fPrec.SetXYZT(0.0, 0.0, 0.0, 0.0);

   fRef = fRefMC = 0x0;
   fOwnerEvent = 0x0;
}

//_____________________________________________________________________________
Int_t AliRsnDaughter::GetPDG()
{
//
// Return the PDG code of the particle from MC ref (if any).
// If argument is kTRUE, returns its absolute value.
//

   if (Match(fRefMC, AliMCParticle::Class()))
      return ((AliMCParticle *)fRefMC)->Particle()->GetPdgCode();
   else if (Match(fRefMC, AliAODMCParticle::Class()))
      return ((AliAODMCParticle *)fRefMC)->GetPdgCode();
   else {
      AliWarning("Cannot retrieve PDG");
      return 0;
   }
}

//_____________________________________________________________________________
Int_t AliRsnDaughter::GetID()
{
//
// Return reference index, using the "GetID" method
// of the possible source object.
// When this method is unsuccessful (e.g.: V0s), return the label.
//

   // ESD tracks
   AliESDtrack *esd = Ref2ESDtrack();
   if (esd) return esd->GetID();

   // AOD tracks
   AliAODTrack *aod = Ref2AODtrack();
   if (aod) return aod->GetID();

   // whatever else
   return GetLabel();
}

//_____________________________________________________________________________
Int_t AliRsnDaughter::GetMother()
{
//
// Return index of the first mother of the MC reference, if any.
// Otherwise, returns -1 (the same as for primary tracks)
//

   if (!fRefMC) return -1;

   if (fRefMC->InheritsFrom(AliMCParticle::Class())) {
      AliMCParticle *mc = (AliMCParticle *)fRefMC;
      return mc->Particle()->GetFirstMother();
   } else if (fRefMC->InheritsFrom(AliAODMCParticle::Class())) {
      AliAODMCParticle *mc = (AliAODMCParticle *)fRefMC;
      return mc->GetMother();
   }
   else
      return -1;
}



//______________________________________________________________________________
void AliRsnDaughter::Print(Option_t *) const
{
//
// Override of TObject::Print()
//

   AliInfo("=== DAUGHTER INFO ======================================================================");
   AliInfo(Form(" (sim) px,py,pz = %6.2f %6.2f %6.2f", fPsim.X(), fPsim.Y(), fPsim.Z()));
   AliInfo(Form(" (rec) px,py,pz = %6.2f %6.2f %6.2f", fPrec.X(), fPrec.Y(), fPrec.Z()));
   AliInfo(Form(" OK, RsnID, Label, MotherPDG = %s, %5d, %5d, %4d", (fOK ? "true " : "false"), fRsnID, fLabel, fMotherPDG));
   AliInfo("========================================================================================");
}

//______________________________________________________________________________
const char *AliRsnDaughter::SpeciesName(ESpecies species)
{
//
// Return a string with the short name of the particle
//

   switch (species) {
      case kElectron: return "E";
      case kMuon:     return "Mu";
      case kPion:     return "Pi";
      case kKaon:     return "K";
      case kProton:   return "P";
      case kKaon0:    return "K0s";
      case kLambda:   return "Lambda";
      case kXi:       return "Xi";
      case kOmega:    return "Omega";
      default:        return "Undef";
   }
}

//______________________________________________________________________________
Int_t AliRsnDaughter::SpeciesPDG(ESpecies species)
{
//
// Return the PDG code of a particle species (abs value)
//

   switch (species) {
      case kElectron: return 11;
      case kMuon:     return 13;
      case kPion:     return 211;
      case kKaon:     return 321;
      case kProton:   return 2212;
      case kKaon0:    return 311;
      case kLambda:   return 3122;
      case kXi:       return 3312;
      case kOmega:    return 3334;
      default:        return 0;
   }
}

//______________________________________________________________________________
Double_t AliRsnDaughter::SpeciesMass(ESpecies species)
{
//
// Return the mass of a particle species
//

   TDatabasePDG *db = TDatabasePDG::Instance();
   TParticlePDG *part = 0x0;

   Int_t pdg = SpeciesPDG(species);
   if (pdg) {
      part = db->GetParticle(pdg);
      return part->Mass();
   }
   else
      return 0.0;
}

//______________________________________________________________________________
EPARTYPE AliRsnDaughter::ToAliPID(ESpecies species)
{
//
// Convert an enum element from this object
// into the enumeration of AliPID.
// If no match are cound 'kUnknown' is returned.
//

   switch (species) {
      case kElectron: return AliPID::kElectron;
      case kMuon:     return AliPID::kMuon;
      case kPion:     return AliPID::kPion;
      case kKaon:     return AliPID::kKaon;
      case kProton:   return AliPID::kProton;
      case kKaon0:    return AliPID::kKaon0;
      default:        return AliPID::kUnknown;
   }
}

//______________________________________________________________________________
AliRsnDaughter::ESpecies AliRsnDaughter::FromAliPID(EPARTYPE pid)
{
//
// Convert an enum element from AliPID
// into the enumeration of this object.
// If no match are cound 'kUnknown' is returned.
//

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