#ifndef ALIMUONTRACKLIGHT_H
#define ALIMUONTRACKLIGHT_H
#include "TLorentzVector.h"
class AliMUONTrack;
class AliESDMuonTrack;
class AliStack;
class TParticle;
class AliMUONVTrackStore;
class AliMUONTrackLight : public TObject {
public:
AliMUONTrackLight();
AliMUONTrackLight(AliESDMuonTrack* muonTrack);
AliMUONTrackLight(const AliMUONTrackLight &muonCopy);
AliMUONTrackLight& operator=(const AliMUONTrackLight&);
virtual ~AliMUONTrackLight();
void SetPGen(TLorentzVector pgen) {fPgen = pgen;}
TLorentzVector GetPGen() const {return fPgen;}
void SetPRec(TLorentzVector prec) {fPrec = prec;}
TLorentzVector GetPRec() const {return fPrec;}
void SetVertex(Double_t *xyz) {for (Int_t i=0; i<3; i++) fXYZ[i]=xyz[i];}
Double_t GetX() const { return fXYZ[0]; }
Double_t GetY() const { return fXYZ[1]; }
Double_t GetZ() const { return fXYZ[2]; }
Double_t* GetVertex() { return fXYZ; }
void SetChi2(Double_t chi2) {fChi2=chi2;}
Double_t GetChi2() const { return fChi2; }
void SetWeight(Double_t w) {fWeight=w;}
Double_t GetWeight() const { return fWeight; }
void SetCharge(Int_t charge) {fCharge = charge;}
Int_t GetCharge() const {return fCharge;}
Int_t GetParentPDGCode(Int_t index = 0) const { return fParentPDGCode[index]; }
Int_t GetParentPythiaLine(Int_t index = 0) const { return fParentPythiaLine[index]; }
Int_t GetQuarkPDGCode(Int_t index = 0) const { return fQuarkPDGCode[index]; }
Int_t GetQuarkPythiaLine(Int_t index = 0) const { return fQuarkPythiaLine[index]; }
Int_t GetTrackPythiaLine() const {return fTrackPythiaLine;}
Int_t GetTrackPDGCode() const {return fTrackPDGCode;}
void SetTrackPythiaLine(Int_t trackLine) {fTrackPythiaLine = trackLine;}
void SetTrackPDGCode(Int_t trackPdg) {fTrackPDGCode = trackPdg;}
void FillFromESD(AliESDMuonTrack* muonTrack, Double_t zvert=-9999);
void FillFromAliMUONTrack(AliMUONTrack *trackReco,Double_t zvert=-9999);
Bool_t IsAMuon() const { return (TMath::Abs(fTrackPDGCode)==13); }
Bool_t IsParentPionOrKaon(Int_t idParent = 0);
void SetPxPyPz(Double_t px, Double_t py, Double_t pz);
void SetTriggered(Bool_t isTriggered) { fIsTriggered = isTriggered; }
Bool_t IsTriggered() const { return fIsTriggered; }
Int_t GetNParents() const {return fNParents;}
void FillMuonHistory(AliStack *stack, TParticle *part);
Bool_t IsB0(Int_t intTest) const;
Bool_t IsMotherAResonance(Int_t index=0) const;
Bool_t GetOscillation() const {return fOscillation;}
virtual void PrintInfo(const Option_t* opt);
Int_t GetParentFlavour(Int_t idParent=0) const;
Bool_t IsDiquark(Int_t pdg) const;
protected:
static const Int_t fgkNParentsMax = 5;
TLorentzVector fPrec;
Double_t fXYZ[3];
Bool_t fIsTriggered;
Int_t fCharge;
Double_t fChi2;
Float_t fCentr;
TLorentzVector fPgen;
Int_t fTrackPythiaLine;
Int_t fTrackPDGCode;
Int_t fParentPDGCode[fgkNParentsMax];
Int_t fParentPythiaLine[fgkNParentsMax];
Int_t fQuarkPDGCode[4];
Int_t fQuarkPythiaLine[4];
Bool_t fOscillation;
Int_t fNParents;
Double_t fWeight;
void SetOscillation(Bool_t oscillation) { fOscillation = oscillation; }
void SetParentPDGCode(Int_t index, Int_t pdg) { fParentPDGCode[index] = pdg; }
void SetParentPythiaLine(Int_t index, Int_t line) { fParentPythiaLine[index] = line; }
void SetQuarkPDGCode(Int_t index, Int_t pdg){ fQuarkPDGCode[index] = pdg; }
void SetQuarkPythiaLine(Int_t index, Int_t line){ fQuarkPythiaLine[index] = line; }
void ResetQuarkInfo();
ClassDef(AliMUONTrackLight,1)
};
#endif