//
-// Class AliRsnDaughter
-//
-// Light-weight AOD object which contains all required track details
-// which are used for resonance analysis.
-// Provides converters from all kinds of input track type: ESD, AOD and MC.
-//
-// authors: A. Pulvirenti (alberto.pulvirenti@ct.infn.it)
-// M. Vala (martin.vala@cern.ch)
+// 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 <Riostream.h>
-
#include <TParticle.h>
-#include <TString.h>
-
-#include "AliLog.h"
-#include "AliESDtrack.h"
-#include "AliAODTrack.h"
-#include "AliMCParticle.h"
+#include <TDatabasePDG.h>
-#include "AliRsnMCInfo.h"
#include "AliRsnDaughter.h"
ClassImp(AliRsnDaughter)
-AliRsnDaughter::EPIDMethod AliRsnDaughter::fgPIDMethod = AliRsnDaughter::kNoPID;
-
-//_____________________________________________________________________________
-AliRsnDaughter::AliRsnDaughter() :
- AliVParticle(),
- fIndex(-1),
- fLabel(-1),
- fCharge(0),
- fFlags(0),
- fKink(0),
- fMass(0.0),
- fChi2(0.0),
- fNSigmaToVertex(-1.0),
- fITSnum(0),
- fTPCnum(0),
- fRealisticPID(AliRsnPID::kUnknown),
- fMCInfo(0x0)
-{
-//
-// Default constructor.
-// Initializes all data-members with meaningless values.
-//
-
- Int_t i;
- for (i = 0; i < AliRsnPID::kSpecies; i++)
- {
- if (i < 3)
- {
- fP[i] = 0.0;
- fV[i] = 0.0;
- }
- fPIDWeight[i] = 0.0;
- fPIDProb[i] = 0.0;
- }
-}
-
//_____________________________________________________________________________
AliRsnDaughter::AliRsnDaughter(const AliRsnDaughter ©) :
- AliVParticle(copy),
- fIndex(copy.fIndex),
- fLabel(copy.fLabel),
- fCharge(copy.fCharge),
- fFlags(copy.fFlags),
- fKink(copy.fKink),
- fMass(copy.fMass),
- fChi2(copy.fChi2),
- fNSigmaToVertex(copy.fNSigmaToVertex),
- fITSnum(copy.fITSnum),
- fTPCnum(copy.fTPCnum),
- fRealisticPID(copy.fRealisticPID),
- fMCInfo(0x0)
+ 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.
//
-
- Int_t i;
- for (i = 0; i < AliRsnPID::kSpecies; i++)
- {
- if (i < 3)
- {
- fP[i] = copy.fP[i];
- fV[i] = copy.fV[i];
- }
- fPIDWeight[i] = copy.fPIDWeight[i];
- fPIDProb[i] = copy.fPIDProb[i];
- }
-
- // initialize particle object
- // only if it is present in the template object
- if (copy.fMCInfo) fMCInfo = new AliRsnMCInfo(*(copy.fMCInfo));
-}
-
-//_____________________________________________________________________________
-AliRsnDaughter::AliRsnDaughter(AliESDtrack *track, Bool_t useTPC) :
- AliVParticle(),
- fIndex(-1),
- fLabel(-1),
- fCharge(0),
- fFlags(0),
- fKink(0),
- fMass(0.0),
- fChi2(0.0),
- fNSigmaToVertex(-1.0),
- fITSnum(0),
- fTPCnum(0),
- fRealisticPID(AliRsnPID::kUnknown),
- fMCInfo(0x0)
-{
-//
-// Constructor to get data from an ESD track.
-//
-
- Int_t i;
- for (i = 0; i < AliRsnPID::kSpecies; i++) fPIDProb[i] = 0.0;
- Adopt(track, kEsd,0.0,useTPC);
-}
-
-//_____________________________________________________________________________
-AliRsnDaughter::AliRsnDaughter(AliAODTrack *track) :
- AliVParticle(),
- fIndex(-1),
- fLabel(-1),
- fCharge(0),
- fFlags(0),
- fKink(0),
- fMass(0.0),
- fChi2(0.0),
- fNSigmaToVertex(-1.0),
- fITSnum(0),
- fTPCnum(0),
- fRealisticPID(AliRsnPID::kUnknown),
- fMCInfo(0x0)
-{
-//
-// Constructor to get data from an AOD track.
-//
-
- Int_t i;
- for (i = 0; i < AliRsnPID::kSpecies; i++) fPIDProb[i] = 0.0;
- Adopt(track);
-}
-
-//_____________________________________________________________________________
-AliRsnDaughter::AliRsnDaughter(AliMCParticle *track) :
- AliVParticle(),
- fIndex(-1),
- fLabel(-1),
- fCharge(0),
- fFlags(0),
- fKink(0),
- fMass(0.0),
- fChi2(0.0),
- fNSigmaToVertex(-1.0),
- fITSnum(0),
- fTPCnum(0),
- fRealisticPID(AliRsnPID::kUnknown),
- fMCInfo(0x0)
-{
-//
-// Constructor to get data from an MC track.
-//
-
- Int_t i;
- for (i = 0; i < AliRsnPID::kSpecies; i++) fPIDProb[i] = 0.0;
- Adopt(track);
}
//_____________________________________________________________________________
{
//
// Assignment operator.
-// Works like the copy constructor and returns a reference
-// to the initialized object for which it is called.
-//
-
- fIndex = copy.fIndex;
- fLabel = copy.fLabel;
- fCharge = copy.fCharge;
- fFlags = copy.fFlags;
- fKink = copy.fKink;
- fChi2 = copy.fChi2;
- fNSigmaToVertex = copy.fNSigmaToVertex;
- fITSnum = copy.fITSnum;
- fTPCnum = copy.fTPCnum;
-
- Int_t i;
- for (i = 0; i < AliRsnPID::kSpecies; i++)
- {
- if (i < 3)
- {
- fP[i] = copy.fP[i];
- fV[i] = copy.fV[i];
- }
- fPIDWeight[i] = copy.fPIDWeight[i];
- fPIDProb[i] = copy.fPIDProb[i];
- }
-
- fMass = copy.fMass;
- fRealisticPID = copy.fRealisticPID;
-
- // initialize particle object
- // only if it is present in the template object;
- // otherwise, it is just cleared and not replaced with anything
- if (fMCInfo)
- {
- delete fMCInfo;
- fMCInfo = 0x0;
- }
- if (copy.fMCInfo) fMCInfo = new AliRsnMCInfo(*(copy.fMCInfo));
-
- return (*this);
-}
-
-//_____________________________________________________________________________
-AliRsnDaughter::~AliRsnDaughter()
-{
-//
-// Destructor
-//
-
- if (fMCInfo)
- {
- delete fMCInfo;
- fMCInfo = 0;
- }
-}
-
-//_____________________________________________________________________________
-void AliRsnDaughter::RotateP(Double_t angle)
-{
-//
-// Rotate the momentum along Z axis by an angle
-//
-
- Double_t s = TMath::Sin(angle);
- Double_t c = TMath::Cos(angle);
- Double_t xx = fP[0];
- fP[0] = c*xx - s*fP[1];
- fP[1] = s*xx + c*fP[1];
-}
-
-//_____________________________________________________________________________
-Double_t AliRsnDaughter::AngleTo(AliRsnDaughter *d)
-{
-//
-// Compute angle in DEGREES between the vector momentum of (this)
-// and the one of argument.
+// Pointers are NOT duplicated, since they don't come from a 'new'
+// statement, but from just referencing something in the data source.
//
- Double_t arg, dot, ptot2 = P2() * d->P2();
-
- if(ptot2 <= 0) {
- return 0.0;
- }
- else {
- dot = Px()*d->Px() + Py()*d->Py() + Pz()*d->Pz();
- arg = dot / TMath::Sqrt(ptot2);
- if (arg > 1.0) arg = 1.0;
- if (arg < -1.0) arg = -1.0;
- return TMath::ACos(arg) * TMath::RadToDeg();
- }
-}
+ 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;
-//_____________________________________________________________________________
-void AliRsnDaughter::SetPIDWeight(Int_t i, Double_t value)
-{
-//
-// I the argument 'i' is in the correct range,
-// sets the i-th PID weight to 'value'
-//
-
- if (i >= 0 && i < AliRsnPID::kSpecies) fPIDWeight[i] = value;
- else
- {
- AliError(Form("Cannot set a weight related to slot %d", i));
- }
+ return (*this);
}
//_____________________________________________________________________________
-void AliRsnDaughter::AssignRealisticPID()
+void AliRsnDaughter::Reset()
{
//
-// Assign realistic PID from largest probability
+// 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.
//
- Int_t i, imax = 0;
- Double_t pmax = fPIDProb[0];
-
- // search for maximum
- for (i = 1; i < AliRsnPID::kSpecies; i++)
- {
- if (fPIDProb[i] > pmax)
- {
- imax = i;
- pmax = fPIDProb[i];
- }
- }
+ 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);
- fRealisticPID = (AliRsnPID::EType)imax;
+ fRef = fRefMC = 0x0;
+ fOwnerEvent = 0x0;
}
//_____________________________________________________________________________
-AliRsnPID::EType AliRsnDaughter::PIDType(Double_t &prob) const
+Int_t AliRsnDaughter::GetPDG()
{
//
-// Return the PID type according to the selected method
-// in the argument passed by reference, the probability is stored.
-// It will be realistic for realistic PID and 1 for perfect PID.
+// Return the PDG code of the particle from MC ref (if any).
+// If argument is kTRUE, returns its absolute value.
//
- switch (fgPIDMethod)
- {
- case kNoPID:
- AliWarning("Requested a PIDtype call in NoPID mode");
- return AliRsnPID::kUnknown;
- case kPerfect:
- if (fMCInfo) return AliRsnPID::InternalType(fMCInfo->PDG());
- else return AliRsnPID::kUnknown;
- default:
- if (fRealisticPID > 0 && fRealisticPID < AliRsnPID::kSpecies)
- {
- prob = fPIDProb[fRealisticPID];
- return fRealisticPID;
- }
- else
- {
- prob = 1.0;
- return AliRsnPID::kUnknown;
- }
- }
+ 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;
+ }
}
//_____________________________________________________________________________
-void AliRsnDaughter::SetPIDProb(Int_t i, Double_t value)
+Int_t AliRsnDaughter::GetID()
{
//
-// I the argument 'i' is in the correct range,
-// sets the i-th PID probability to 'value'
+// Return reference index, using the "GetID" method
+// of the possible source object.
+// When this method is unsuccessful (e.g.: V0s), return the label.
//
- if (i >= 0 && i < AliRsnPID::kSpecies) fPIDProb[i] = value;
- else
- {
- AliError(Form("Cannot set a weight related to slot %d", i));
- }
-}
+ // ESD tracks
+ AliESDtrack *esd = Ref2ESDtrack();
+ if (esd) return esd->GetID();
-//_____________________________________________________________________________
-Bool_t AliRsnDaughter::Adopt(AliESDtrack* esdTrack,EPIDType pidType ,Double_t divValue, Bool_t useTPCInnerParam)
-{
-//
-// Copies data from an AliESDtrack into "this":
-// - charge sign
-// - momentum
-// - point of closest approach to primary vertex
-// - ESD pid weights
-// In case of errors returns kFALSE, otherwise kTRUE.
-//
+ // AOD tracks
+ AliAODTrack *aod = Ref2AODtrack();
+ if (aod) return aod->GetID();
- if (!esdTrack)
- {
- AliError("Passed NULL object: nothing done");
- return kFALSE;
- }
-
- // copy momentum, vertex, chi2 and number of clusters
- if (!useTPCInnerParam)
- {
- esdTrack->GetPxPyPz(fP);
- esdTrack->GetXYZ(fV);
- fChi2 = esdTrack->GetConstrainedChi2();
- fITSnum = esdTrack->GetITSclusters(0x0);
- fTPCnum = esdTrack->GetTPCclusters(0x0);
- }
- else
- {
- if (!esdTrack->GetTPCInnerParam()) return kFALSE;
- esdTrack->GetTPCInnerParam()->GetPxPyPz(fP);
- esdTrack->GetTPCInnerParam()->GetXYZ(fV);
- fChi2 = esdTrack->GetTPCchi2();
- fITSnum = 0;
- fTPCnum = esdTrack->GetTPCclusters(0x0);
- }
-
- // define the kink index:
- // 0 = no kink
- // 1 = kink daughter
- // -1 = kink mother
- Int_t i, ik[3];
- for (i = 0; i < 3; i++) ik[i] = esdTrack->GetKinkIndex(i);
- if (ik[0] < 0 || ik[1] < 0 || ik[2] < 0) fKink = -1;
- else if (ik[0] > 0 || ik[1] > 0 || ik[2] > 0) fKink = 1;
- else fKink = 0;
-
- Double_t p = esdTrack->P();
- // copy PID weights
- Double_t pid[5];
- if (!useTPCInnerParam)
- {
- GetESDPID(esdTrack,pid,pidType,divValue,p);
- }
- else
- {
-// fCurrentESDPID = kTPC;
- GetESDPID(esdTrack,pid,kTPC,0.0,p);
- }
-// for (i = 0; i < 5; i++) fPIDWeight[i] = pid[i];
-
- Double_t sum = 0.0;
- for (i = 0; i < 5; i++)
- {
- fPIDWeight[i] = pid[i];
- sum += fPIDWeight[i];
- }
-
- if (sum<=0.0) return kFALSE;
-
- // copy flags
- fFlags = esdTrack->GetStatus();
-
- // copy charge sign
- fCharge = (Short_t)esdTrack->Charge();
-
- // calculate N sigma to vertex
- AliESDtrackCuts trkCut;
- SetNSigmaToVertex(trkCut.GetSigmaToVertex(esdTrack));
-
- return kTRUE;
+ // whatever else
+ return GetLabel();
}
-
//_____________________________________________________________________________
-Bool_t AliRsnDaughter::Adopt(AliAODTrack* aodTrack)
+Int_t AliRsnDaughter::GetMother()
{
//
-// Copies data from an AliAODtrack into "this":
-// - charge sign
-// - momentum
-// - point of closest approach to primary vertex
-// - ESD pid weights
-// In case of errors returns kFALSE, otherwise kTRUE.
+// Return index of the first mother of the MC reference, if any.
+// Otherwise, returns -1 (the same as for primary tracks)
//
- if (!aodTrack)
- {
- AliError("Passed NULL object: nothing done");
- return kFALSE;
- }
-
- // copy momentum and vertex
- fP[0] = aodTrack->Px();
- fP[1] = aodTrack->Py();
- fP[2] = aodTrack->Pz();
- fV[0] = aodTrack->Xv();
- fV[1] = aodTrack->Yv();
- fV[2] = aodTrack->Zv();
-
- // chi2
- fChi2 = aodTrack->Chi2perNDF();
-
- // copy PID weights
- Int_t i;
- for (i = 0; i < 5; i++) fPIDWeight[i] = aodTrack->PID()[i];
+ if (!fRefMC) return -1;
- // copy flags
- fFlags = aodTrack->GetStatus();
-
- // copy sign
- fCharge = aodTrack->Charge();
-
- return kTRUE;
+ 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;
}
+
+
-
-//_____________________________________________________________________________
-Bool_t AliRsnDaughter::Adopt(AliMCParticle *mcParticle)
-{
-//
-// Copies data from a MCParticle into "this":
-// - charge sign
-// - momentum
-// - point of closest approach to primary vertex
-// - ESD pid weights
-// - true PDG code
-// - mother
-// In case of errors returns kFALSE, otherwise kTRUE.
-//
-
- if (!mcParticle)
- {
- AliError("Passed NULL object: nothing done");
- return kFALSE;
- }
-
- // retrieve the TParticle object from the argument
- TParticle *particle = mcParticle->Particle();
- if (!particle)
- {
- AliError("AliMCParticle::Particle() returned NULL");
- return kFALSE;
- }
-
- // copy momentum and vertex
- fP[0] = particle->Px();
- fP[1] = particle->Py();
- fP[2] = particle->Pz();
- fV[0] = particle->Vx();
- fV[1] = particle->Vy();
- fV[2] = particle->Vz();
-
- // recognize charge sign from PDG code sign
- Int_t pdg = particle->GetPdgCode();
- Int_t absPDG = TMath::Abs(pdg);
- if (absPDG == 11 || absPDG == 13)
- {
- if (pdg > 0) fCharge = -1; else fCharge = 1;
- }
- else if (absPDG == 211 || absPDG == 321 || absPDG == 2212)
- {
- if (pdg > 0) fCharge = 1; else fCharge = -1;
- }
- else
- {
- // when trying to "adopt" a neutral track (photon, neutron, etc.)
- // for the moment a "failed" message is returned
- fCharge = 0;
- return kFALSE;
- }
-
- // flags and PID weights make no sense with MC tracks
- fFlags = 0;
- for (pdg = 0; pdg < AliRsnPID::kSpecies; pdg++) fPIDWeight[pdg] = 0.0;
- fPIDWeight[AliRsnPID::InternalType(absPDG)] = 1.0;
-
- // copy other MC info (mother PDG code cannot be retrieved here)
- InitMCInfo(particle);
-
- return kTRUE;
-}
-
-//_____________________________________________________________________________
-void AliRsnDaughter::Print(Option_t *option) const
+//______________________________________________________________________________
+void AliRsnDaughter::Print(Option_t *opt) const
{
//
-// Prints the values of data members, using the options:
-// - P --> momentum
-// - V --> DCA vertex
-// - C --> electric charge
-// - F --> flags
-// - I --> identification (PID, probability and mass)
-// - W --> PID weights
-// - M --> Montecarlo (from AliRsnMCInfo)
-// - L --> index & label
-// - A --> angles
-// - ALL --> All oprions switched on
+// Override of TObject::Print()
//
-// Index and label are printed by default.
-//
-
- TString opt(option);
- opt.ToUpper();
- if (opt.Contains("L") || opt.Contains("ALL"))
- {
- cout << ".......Index : " << fIndex << endl;
- cout << ".......Label : " << fLabel << endl;
- }
- if (opt.Contains("P") || opt.Contains("ALL"))
- {
- cout << ".......Px, Py, Pz, Pt : " << Px() << ' ' << Py() << ' ' << Pz() << ' ' << Pt() << endl;
- }
- if (opt.Contains("A") || opt.Contains("ALL"))
- {
- cout << ".......Phi, Theta : " << Phi() << ' ' << Theta() << endl;
- }
- if (opt.Contains("V") || opt.Contains("ALL"))
- {
- cout << ".......Vx, Vy, Vz : " << Xv() << ' ' << Yv() << ' ' << Zv() << endl;
- }
- if (opt.Contains("I") || opt.Contains("ALL"))
- {
- AliRsnPID::EType type;
- Double_t prob;
- type = PIDType(prob);
- cout << ".......PID & prob : " << AliRsnPID::ParticleName(type) << ' ' << prob << endl;
- }
- if (opt.Contains("C") || opt.Contains("ALL"))
- {
- cout << ".......Charge : " << fCharge << endl;
- }
- if (opt.Contains("F") || opt.Contains("ALL"))
- {
- cout << ".......Flags : " << fFlags << endl;
- }
- if (opt.Contains("W") || opt.Contains("ALL"))
- {
- cout << ".......Weights : ";
- Int_t i;
- for (i = 0; i < AliRsnPID::kSpecies; i++) cout << fPIDWeight[i] << ' ';
- cout << endl;
- }
- if (opt.Contains("M") || opt.Contains("ALL"))
- {
- if (fMCInfo)
- {
- cout << ".......PDG code : " << fMCInfo->PDG() << endl;
- cout << ".......Mother (label) : " << fMCInfo->Mother() << endl;
- cout << ".......Mother (PDG code): " << fMCInfo->MotherPDG() << endl;
- }
- else
- {
- cout << ".......MC info not present" << endl;
- }
- }
+ 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("========================================================================================");
}
-//_____________________________________________________________________________
-void AliRsnDaughter::InitMCInfo()
+//______________________________________________________________________________
+const char* AliRsnDaughter::SpeciesName(ESpecies species)
{
//
-// Initializes the particle object with default constructor.
-//
-
- fMCInfo = new AliRsnMCInfo;
+// 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";
+ }
}
-//_____________________________________________________________________________
-Bool_t AliRsnDaughter::InitMCInfo(TParticle *particle)
+//______________________________________________________________________________
+Int_t AliRsnDaughter::SpeciesPDG(ESpecies species)
{
//
-// Copies data from an MC particle into the object which
-// contains all MC details taken from kinematics info.
-// If requested by second argument, momentum and vertex
-// of the Particle are copied into the 'fP' and 'fV'
-// data members, to simulate a perfect reconstruction.
-// If something goes wrong, returns kFALSE,
-// otherwise returns kTRUE.
-//
-
- // retrieve the TParticle object pointed by this MC track
- if (!particle)
- {
- AliError("Passed NULL particle object");
- return kFALSE;
- }
-
- // initialize object if not initialized yet
- if (fMCInfo) delete fMCInfo;
- fMCInfo = new AliRsnMCInfo;
- fMCInfo->Adopt(particle);
-
- return kTRUE;
+// 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 310;
+ case kLambda: return 3122;
+ case kXi: return 3312;
+ case kOmega: return 3334;
+ default: return 0;
+ }
}
-//_____________________________________________________________________________
-Bool_t AliRsnDaughter::InitMCInfo(AliMCParticle *mcParticle)
+//______________________________________________________________________________
+Double_t AliRsnDaughter::SpeciesMass(ESpecies species)
{
//
-// Copies data from an MC particle into the object which
-// contains all MC details taken from kinematics info.
-// If requested by second argument, momentum and vertex
-// of the Particle are copied into the 'fP' and 'fV'
-// data members, to simulate a perfect reconstruction.
-// If something goes wrong, returns kFALSE,
-// otherwise returns kTRUE.
+// Return the mass of a particle species
//
- // retrieve the TParticle object pointed by this MC track
- TParticle *particle = mcParticle->Particle();
- return InitMCInfo(particle);
+ 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;
}
-//_____________________________________________________________________________
-Int_t AliRsnDaughter::Compare(const TObject* obj) const
+//______________________________________________________________________________
+EPARTYPE AliRsnDaughter::ToAliPID(ESpecies species)
{
//
-// Compare two tracks with respect to their transverse momentum.
-// Citation from ROOT reference:
-// "Must return -1 if this is smaller than obj, 0 if objects are equal
-// and 1 if this is larger than obj".
+// Convert an enum element from this object
+// into the enumeration of AliPID.
+// If no match are cound 'kUnknown' is returned.
//
- AliRsnDaughter *that = (AliRsnDaughter*)obj;
- if (Pt() < that->Pt()) return 1;
- else if (Pt() > that->Pt()) return -1;
- else return 0;
+ 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;
+ }
}
-//_____________________________________________________________________________
-void AliRsnDaughter::GetESDPID
-(AliESDtrack * track, Double_t * pid, EPIDType pidType, Double_t divValue, Double_t val)
+//______________________________________________________________________________
+AliRsnDaughter::ESpecies AliRsnDaughter::FromAliPID(EPARTYPE pid)
{
//
-// A simple method to define PID weights by combining the ones
-// from single detectors by multiplication.
-// In the case when 'kITS_TPC_TOF_SP' option is chosen, a separation value
-// defines if the TOF signal must be included or not.
-// This value is usually the transverse momentum, but here it is left undefined.
+// Convert an enum element from AliPID
+// into the enumeration of this object.
+// If no match are cound 'kUnknown' is returned.
//
- Int_t i;
- Double_t ctmp[AliRsnPID::kSpecies];
-
- switch (pidType)
- {
- case kEsd :
- track->GetESDpid(pid);
- break;
- case kITS :
- track->GetITSpid(pid);
- break;
- case kTPC :
- track->GetTPCpid(pid);
- break;
- case kTOF :
- track->GetTOFpid(pid);
- break;
- case kITS_TPC :
- track->GetITSpid(pid);
- track->GetTPCpid(ctmp);
- for (i = 0; i < 5; i++) pid[i] *= ctmp[i];
- break;
- case kITS_TOF :
- track->GetITSpid(pid);
- track->GetTOFpid(ctmp);
- for (i = 0; i < AliRsnPID::kSpecies; i++) pid[i] *= ctmp[i];
- break;
- case kTPC_TOF :
- track->GetTPCpid(pid);
- track->GetTOFpid(ctmp);
- for (i = 0; i < AliRsnPID::kSpecies; i++) pid[i] *= ctmp[i];
- break;
- case kITS_TPC_TOF :
- track->GetITSpid(pid);
- track->GetTPCpid(ctmp);
- for (i = 0; i < AliRsnPID::kSpecies; i++) pid[i] *= ctmp[i];
- track->GetTOFpid(ctmp);
- for (i = 0; i < AliRsnPID::kSpecies; i++) pid[i] *= ctmp[i];
- break;
- case kITS_TPC_TOF_SP :
- if (val < divValue)
- {
- track->GetITSpid(pid);
- track->GetTPCpid(ctmp);
- for (i = 0; i < AliRsnPID::kSpecies; i++) pid[i] *= ctmp[i];
- }
- else
- {
- track->GetTOFpid(pid);
- }
- break;
- default:
- AliLog::Message(AliLog::kError,
- "Unrecognized value of EPIDType argument",
- "", "AliRsnDaughter", "GetESDPID", __FILE__, __LINE__);
- for (i = 0; i < AliRsnPID::kSpecies; i++) pid[i] = 1.0;
- break;
- }
+ 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;
+ }
}