#ifndef ALIITSUSENSMAP_H
#define ALIITSUSENSMAP_H
#include <TClonesArray.h>
#include <TBtree.h>
#define _ROWWISE_SORT_
class AliITSUSensMap: public TObject
{
public:
enum {kDisableBit=BIT(14)};
AliITSUSensMap();
AliITSUSensMap(const char* className, UInt_t dimCol,UInt_t dimRow,UInt_t dimCycle=1);
virtual ~AliITSUSensMap();
AliITSUSensMap(const AliITSUSensMap &source);
AliITSUSensMap& operator=(const AliITSUSensMap &source);
void Clear(Option_t* option = "");
void DeleteItem(UInt_t col,UInt_t row, Int_t cycle);
void DeleteItem(TObject* obj);
void SetDimensions(UInt_t dimCol,UInt_t dimRow,UInt_t dimCycle=1);
void GetMaxIndex(UInt_t &col,UInt_t &row,UInt_t &cycle) const {col=fDimCol; row=fDimRow; cycle=fDimCycle;}
Int_t GetMaxIndex() const {return fDimCol*fDimRow*(fDimCycle*2+1);}
Int_t GetEntries() const {return fBTree->GetEntries();}
Int_t GetEntriesUnsorted() const {return fItems->GetEntriesFast();}
void GetMapIndex(UInt_t index,UInt_t &col,UInt_t &row,Int_t &cycle) const {return GetCell(index,fDimCol,fDimRow,fDimCycle,col,row,cycle);}
void GetCell(UInt_t index,UInt_t &col,UInt_t &row,Int_t &cycle) const {return GetCell(index,fDimCol,fDimRow,fDimCycle,col,row,cycle);}
TObject* GetItem(UInt_t col,UInt_t row,Int_t cycle) {SetUniqueID(GetIndex(col,row,cycle)); return fBTree->FindObject(this);}
TObject* GetItem(UInt_t index) {SetUniqueID(index); return fBTree->FindObject(this);}
TObject* GetItem(const TObject* obj) {return fBTree->FindObject(obj);}
TObject* At(Int_t i) const {return fBTree->At(i);}
TObject* AtUnsorted(Int_t i) const {return fItems->At(i);}
TObject* RegisterItem(TObject* obj) {fBTree->Add(obj); return obj;}
TObject* GetFree() {return (*fItems)[fItems->GetEntriesFast()];}
UInt_t GetIndex(UInt_t col,UInt_t row,Int_t cycle=0) const;
TClonesArray* GetItems() const {return fItems;}
TBtree* GetItemsBTree() const {return fBTree;}
Bool_t IsSortable() const {return kTRUE;}
Bool_t IsEqual(const TObject* obj) const {return GetUniqueID()==obj->GetUniqueID();}
Int_t Compare(const TObject* obj) const {return (GetUniqueID()<obj->GetUniqueID()) ? -1 : ((GetUniqueID()>obj->GetUniqueID()) ? 1 : 0 );}
static Bool_t IsDisabled(TObject* obj) {return obj ? obj->TestBit(kDisableBit) : kFALSE;}
static void Disable(TObject* obj) {if (obj) obj->SetBit(kDisableBit);}
static void Enable(TObject* obj) {if (obj) obj->ResetBit(kDisableBit);}
static void GetCell(UInt_t index,UInt_t dcol,UInt_t drow,UInt_t dcycle,UInt_t &col,UInt_t &row,Int_t &cycle);
protected:
UInt_t fDimCol;
UInt_t fDimRow;
UInt_t fDimCycle;
TClonesArray* fItems;
TBtree* fBTree;
ClassDef(AliITSUSensMap,1)
};
inline UInt_t AliITSUSensMap::GetIndex(UInt_t col,UInt_t row, Int_t cycle) const
{
UInt_t cyclePos = cycle+fDimCycle;
#ifdef _ROWWISE_SORT_
return fDimCol*(cyclePos*fDimRow+row)+col;
#else
return fDimRow*(cyclePos*fDimCol+col)+row;
#endif
}
inline void AliITSUSensMap::GetCell(UInt_t index,UInt_t dcol,UInt_t drow,UInt_t dcycle,UInt_t &col,UInt_t &row,Int_t &cycle)
{
UInt_t dcr = dcol*drow;
cycle = int(index/dcr) - dcycle;
index %= dcr;
#ifdef _ROWWISE_SORT_
col = index%dcol;
row = index/dcol;
#else
col = index/drow;
row = index%drow;
#endif
}
#endif