#ifndef ALIITSUTRACKCOND_H
#define ALIITSUTRACKCOND_H
#include <TObject.h>
#include <TArrayS.h>
#include <TArrayI.h>
class AliITSUTrackCond : public TObject
{
public:
enum {kCondStart,kNGroups,kMinClus,kNAuxSz};
enum {kShiftNcl=24};
AliITSUTrackCond(Int_t nLayers=0);
AliITSUTrackCond(const AliITSUTrackCond& src);
AliITSUTrackCond &operator=(const AliITSUTrackCond& src);
~AliITSUTrackCond() {}
void SetNLayers(Int_t nl);
void SetClSharing(Int_t lr, Char_t v=0) {fClSharing[lr] = v;}
void SetMaxBranches(Int_t lr, Int_t mb) {fMaxBranches[lr] = mb;}
void SetMaxCandidates(Int_t lr, Int_t nc) {fMaxCandidates[lr] = nc;}
void SetID(Int_t id) {SetUniqueID(id);}
void AddNewCondition(Int_t minClusters);
void AddGroupPattern(UShort_t patt,Int_t ncl);
Int_t GetID() const {return GetUniqueID();}
Int_t GetMaxBranches(Int_t lr) const {return fMaxBranches[lr];}
Int_t GetMaxCandidates(Int_t lr) const {return fMaxCandidates[lr];}
Int_t GetNConditions() const {return fNConditions;}
UShort_t GetGroup(Int_t condID,Int_t grID) const {return fConditions[fAuxData[condID*kNAuxSz+kCondStart]+grID];}
Bool_t CheckPattern(UShort_t patt) const;
virtual void Print(Option_t* option = "") const;
void SetMaxITSTPCMatchChi2(Float_t v) {fMaxITSTPCMatchChi2 = v;}
void SetMaxITSSAChi2(Int_t ncl, Float_t v) {if (ncl>0&&ncl<=2*fNLayers) fMaxITSSAChi2[ncl-1] = v;}
void SetMaxTr2ClChi2(Int_t lr, Float_t v) {fMaxTr2ClChi2[lr] = v;}
void SetMaxChi2GloNrm(Int_t lr, Float_t v) {fMaxChi2GloNrm[lr] = v;}
void SetMissPenalty(Int_t lr, Float_t v) {fMissPenalty[lr] = v;}
void SetNSigmaRoadY(Int_t lr, Float_t v) {fNSigmaRoadY[lr] = v;}
void SetNSigmaRoadZ(Int_t lr, Float_t v) {fNSigmaRoadZ[lr] = v;}
void ExcludeLayer(Int_t lr) {fAllowLayers &= ~(0x1<<lr);}
Float_t GetMaxITSTPCMatchChi2() const {return fMaxITSTPCMatchChi2;}
Float_t GetMaxITSSAChi2(Int_t ncl) const {return fMaxITSSAChi2[ncl-1];}
Char_t GetClSharing(Int_t lr) const {return fClSharing[lr];}
Float_t GetMissPenalty(Int_t lr) const {return fMissPenalty[lr];}
Float_t GetMaxTr2ClChi2(Int_t lr) const {return fMaxTr2ClChi2[lr];}
Float_t GetMaxChi2GloNrm(Int_t lr) const {return fMaxChi2GloNrm[lr];}
Float_t GetNSigmaRoadY(Int_t lr) const {return fNSigmaRoadY[lr];}
Float_t GetNSigmaRoadZ(Int_t lr) const {return fNSigmaRoadZ[lr];}
Bool_t IsLayerExcluded(Int_t lr) const {return !(fAllowLayers&(0x1<<lr));}
Int_t GetActiveLrInner() const {return fActiveLrInner;}
Int_t GetActiveLrOuter() const {return fActiveLrOuter;}
UShort_t GetAllowedLayers() const {return fAllowLayers;}
void Init();
Bool_t IsInitDone() const {return fInitDone;}
protected:
Bool_t fInitDone;
Char_t fActiveLrInner;
Char_t fActiveLrOuter;
UShort_t fAllowLayers;
Int_t fNLayers;
Int_t fMaxClus;
Float_t fMaxITSTPCMatchChi2;
Char_t* fClSharing;
Short_t* fMaxBranches;
Short_t* fMaxCandidates;
Float_t* fMaxITSSAChi2;
Float_t* fMaxTr2ClChi2;
Float_t* fMaxChi2GloNrm;
Float_t* fMissPenalty;
Float_t* fNSigmaRoadY;
Float_t* fNSigmaRoadZ;
Short_t fNConditions;
TArrayI fConditions;
TArrayS fAuxData;
static Char_t fgkClSharing;
static Int_t fgkMaxBranches;
static Int_t fgkMaxCandidates;
static Float_t fgkMaxTr2ClChi2;
static Float_t fgkMaxChi2GloNrm;
static Float_t fgkMissPenalty;
static Float_t fgkMaxMatchChi2;
static Float_t fgkMaxITSSAChi2;
ClassDef(AliITSUTrackCond,10)
};
#endif