#ifndef ALIRSNEVENT_H
#define ALIRSNEVENT_H
#include <TClonesArray.h>
#include "AliLog.h"
#include "AliStack.h"
#include "AliVEvent.h"
#include "AliMCEvent.h"
#include "AliESDEvent.h"
#include "AliAODEvent.h"
#include "AliAODMCParticle.h"
#include "AliRsnDaughter.h"
class AliRsnCutSet;
class AliPIDResponse;
class AliRsnEvent : public TObject {
public:
AliRsnEvent(AliVEvent *ref = 0, AliVEvent *refMC = 0);
AliRsnEvent(const AliRsnEvent ©);
AliRsnEvent &operator= (const AliRsnEvent ©);
virtual ~AliRsnEvent();
void SetRef(AliVEvent *ref) {fRef = ref;}
void SetRefMC(AliVEvent *refmc);
void SetPIDResponse(AliPIDResponse *pid) {fPID = pid;}
AliVEvent *GetRef() {return fRef;}
AliVEvent *GetRefMC() {return fRefMC;}
Int_t GetLeadingIndex() const {return fLeading;}
AliPIDResponse *GetPIDResponse() {return fPID;}
Bool_t Match(AliVEvent *ev, TClass *ref) {if (ev) return (ev->InheritsFrom(ref)); return kFALSE;}
Bool_t IsESD() {return (Match(fRef, AliESDEvent::Class()));}
Bool_t IsAOD() {return (Match(fRef, AliAODEvent::Class()));}
Bool_t InputOK();
AliESDEvent *GetRefESD() {if (IsESD()) return (AliESDEvent *)fRef; return 0x0;}
AliMCEvent *GetRefMCESD() {if (IsESD()) return (AliMCEvent *)fRefMC; return 0x0;}
AliAODEvent *GetRefAOD() {if (IsAOD()) return (AliAODEvent *)fRef; return 0x0;}
AliAODEvent *GetRefMCAOD() {if (IsAOD()) return (AliAODEvent *)fRefMC; return 0x0;}
TClonesArray *GetAODList() {return fAODList;}
Bool_t HasMC() {if (IsESD()) return (fRefMC != 0x0); else if (IsAOD()) return (fRefMC != 0x0 && fAODList != 0x0); return kFALSE;}
void SetDaughter (AliRsnDaughter &daughter, Int_t index, Bool_t fromMC = kFALSE);
AliRsnDaughter GetDaughter (Int_t index, Bool_t fromMC);
void SetDaughterESDtrack (AliRsnDaughter &target, Int_t index);
void SetDaughterESDv0 (AliRsnDaughter &target, Int_t index);
void SetDaughterESDcascade(AliRsnDaughter &target, Int_t index);
void SetDaughterESDMCtrack(AliRsnDaughter &target, Int_t index);
void SetDaughterAODtrack (AliRsnDaughter &target, Int_t index);
void SetDaughterAODv0 (AliRsnDaughter &target, Int_t index);
void SetDaughterAODcascade(AliRsnDaughter &target, Int_t index);
void SetDaughterAODMCtrack(AliRsnDaughter &target, Int_t index);
Bool_t SetMCInfoESD (AliRsnDaughter &target);
Bool_t SetMCInfoAOD (AliRsnDaughter &target);
Int_t GetAbsoluteSum() {if (fRef) return (fRef->GetNumberOfTracks() + fRef->GetNumberOfV0s() + fRef->GetNumberOfCascades()); return 0;}
Bool_t ConvertAbsoluteIndex(Int_t index, Int_t &realIndex, AliRsnDaughter::ERefType &type);
Int_t ConvertRealIndex(Int_t index, AliRsnDaughter::ERefType type);
void SetLeadingParticle(AliRsnDaughter &leading) {if (fLeading >= 0) SetDaughter(leading, fLeading, kFALSE);}
Int_t SelectLeadingParticle(AliRsnCutSet *cuts = 0x0);
private:
AliVEvent *fRef;
AliVEvent *fRefMC;
Int_t fLeading;
AliPIDResponse *fPID;
TClonesArray *fAODList;
ClassDef(AliRsnEvent, 6);
};
inline Bool_t AliRsnEvent::InputOK()
{
if (IsESD()) {
AliDebugClass(1, "Input is ESD");
return kTRUE;
} else if (IsAOD()) {
AliDebugClass(1, "Input is AOD");
return kTRUE;
} else {
AliError("Need to process ESD or AOD input");
return kFALSE;
}
}
inline void AliRsnEvent::SetRefMC(AliVEvent *mc)
{
if (!mc) {
fRefMC = 0x0;
fAODList = 0x0;
return;
}
fRefMC = mc;
fAODList = 0x0;
if (fRefMC->InheritsFrom(AliAODEvent::Class())) {
AliAODEvent *aod = (AliAODEvent *)mc;
fAODList = (TClonesArray *)(aod->GetList()->FindObject(AliAODMCParticle::StdBranchName()));
if (!fAODList) fRefMC = 0x0;
}
}
#endif