#ifndef ALIRSNMINIOUTPUT_H
#define ALIRSNMINIOUTPUT_H
#include "AliRsnEvent.h"
#include "AliRsnDaughter.h"
#include "AliRsnMiniParticle.h"
class THnSparse;
class TList;
class TH1;
class TList;
class TClonesArray;
class AliRsnMiniAxis;
class AliRsnMiniPair;
class AliRsnMiniEvent;
typedef AliRsnDaughter::ESpecies RSNPID;
class AliRsnMiniOutput : public TNamed {
public:
enum EOutputType {
kHistogram,
kHistogramSparse,
kTypes
};
enum EComputation {
kEventOnly,
kTrackPair,
kTrackPairMix,
kTrackPairRotated1,
kTrackPairRotated2,
kTruePair,
kMother,
kMotherInAcc,
kComputations
};
AliRsnMiniOutput();
AliRsnMiniOutput(const char *name, EOutputType type, EComputation src = kTrackPair);
AliRsnMiniOutput(const char *name, const char *outType, const char *compType);
AliRsnMiniOutput(const AliRsnMiniOutput ©);
AliRsnMiniOutput &operator=(const AliRsnMiniOutput ©);
Bool_t IsEventOnly() const {return (fComputation == kEventOnly);}
Bool_t IsTrackPair() const {return (fComputation == kTrackPair);}
Bool_t IsTrackPairMix() const {return (fComputation == kTrackPairMix);}
Bool_t IsTruePair() const {return (fComputation == kTruePair);}
Bool_t IsMother() const {return (fComputation == kMother);}
Bool_t IsMotherInAcc() const {return (fComputation == kMotherInAcc);}
Bool_t IsDefined() const {return (IsEventOnly() || IsTrackPair() || IsTrackPairMix() || IsTruePair() || IsMother());}
Bool_t IsLikeSign() const {return (fCharge[0] == fCharge[1]);}
Bool_t IsSameCut() const {return (fCutID[0] == fCutID[1]);}
Bool_t IsSameDaughter() const {return (fDaughter[0] == fDaughter[1]);}
Bool_t IsSymmetric() const {return (IsLikeSign() && IsSameDaughter());}
EOutputType GetOutputType() const {return fOutputType;}
EComputation GetComputation() const {return fComputation;}
Int_t GetCutID(Int_t i) const {if (i <= 0) return fCutID [0]; else return fCutID [1];}
RSNPID GetDaughter(Int_t i) const {if (i <= 0) return fDaughter[0]; else return fDaughter[1];}
Double_t GetMass(Int_t i) const {return AliRsnDaughter::SpeciesMass(GetDaughter(i));}
Int_t GetPDG(Int_t i) const {return AliRsnDaughter::SpeciesPDG(GetDaughter(i));}
Int_t GetCharge(Int_t i) const {if (i <= 0) return fCharge[0]; else return fCharge[1];}
Int_t GetMotherPDG() const {return fMotherPDG;}
Double_t GetMotherMass() const {return fMotherMass;}
Bool_t GetFillHistogramOnlyInRange() { return fCheckHistRange; }
Short_t GetMaxNSisters() {return fMaxNSisters;}
void SetOutputType(EOutputType type) {fOutputType = type;}
void SetComputation(EComputation src) {fComputation = src;}
void SetCutID(Int_t i, Int_t value) {if (i <= 0) fCutID [0] = value; else fCutID [1] = value;}
void SetDaughter(Int_t i, RSNPID value) {if (i <= 0) fDaughter[0] = value; else fDaughter[1] = value;}
void SetCharge(Int_t i, Char_t value) {if (i <= 0) fCharge[0] = value; else fCharge[1] = value;}
void SetMotherPDG(Int_t pdg) {fMotherPDG = pdg;}
void SetMotherMass(Double_t mass) {fMotherMass = mass;}
void SetPairCuts(AliRsnCutSet *set) {fPairCuts = set;}
void SetFillHistogramOnlyInRange(Bool_t fillInRangeOnly) { fCheckHistRange = fillInRangeOnly; }
void SetMaxNSisters(Short_t n) {fMaxNSisters = n;}
void SetCheckMomentumConservation(Bool_t checkP) {fCheckP = checkP;}
void SetCheckFeedDown(Bool_t checkFeedDown) {fCheckFeedDown = checkFeedDown;}
void SetDselection(UShort_t originDselection);
void SetRejectCandidateIfNotFromQuark(Bool_t opt){fRejectIfNoQuark=opt;}
void AddAxis(Int_t id, Int_t nbins, Double_t min, Double_t max);
void AddAxis(Int_t id, Double_t min, Double_t max, Double_t step);
void AddAxis(Int_t id, Int_t nbins, Double_t *values);
AliRsnMiniAxis *GetAxis(Int_t i) {if (i >= 0 && i < fAxes.GetEntries()) return (AliRsnMiniAxis *)fAxes[i]; return 0x0;}
Double_t *GetAllComputed() {return fComputed.GetArray();}
AliRsnMiniPair &Pair() {return fPair;}
Bool_t Init(const char *prefix, TList *list);
Bool_t FillMother(const AliRsnMiniPair *pair, AliRsnMiniEvent *event, TClonesArray *valueList);
Bool_t FillMotherInAcceptance(const AliRsnMiniPair *pair, AliRsnMiniEvent *event, TClonesArray *valueList);
Bool_t FillEvent(AliRsnMiniEvent *event, TClonesArray *valueList);
Int_t FillPair(AliRsnMiniEvent *event1, AliRsnMiniEvent *event2, TClonesArray *valueList, Bool_t refFirst = kTRUE);
private:
void CreateHistogram(const char *name);
void CreateHistogramSparse(const char *name);
void ComputeValues(AliRsnMiniEvent *event, TClonesArray *valueList);
void FillHistogram();
EOutputType fOutputType;
EComputation fComputation;
Int_t fCutID[2];
RSNPID fDaughter[2];
Char_t fCharge[2];
Int_t fMotherPDG;
Double_t fMotherMass;
AliRsnCutSet *fPairCuts;
Int_t fOutputID;
TClonesArray fAxes;
TArrayD fComputed;
AliRsnMiniPair fPair;
TList *fList;
TArrayI fSel1;
TArrayI fSel2;
Short_t fMaxNSisters;
Bool_t fCheckP;
Bool_t fCheckFeedDown;
UShort_t fOriginDselection;
Bool_t fKeepDfromB;
Bool_t fKeepDfromBOnly;
Bool_t fRejectIfNoQuark;
Bool_t fCheckHistRange;
ClassDef(AliRsnMiniOutput, 4)
};
#endif