#ifndef ALIITSPLIST_H
#define ALIITSPLIST_H
#include "TArrayI.h"
#include "TClonesArray.h"
#include "AliLog.h"
#include "AliITSMap.h"
#include "AliITSpListItem.h"
class AliITSpList: public AliITSMap {
public:
AliITSpList();
AliITSpList(Int_t imax,Int_t jmax);
virtual ~AliITSpList();
AliITSpList(const AliITSpList &source);
virtual AliITSpList& operator=(const AliITSpList &source);
void GetMaxMapIndex(Int_t &ni,Int_t &nj) const {ni=fNi;nj=fNj;return;}
Int_t GetMaxIndex() const {return fNi*fNj;}
Int_t GetEntries() const {return fEntries;}
Int_t GetNEntries() const {return AliITSpListItem::GetMaxKept();}
void GetMapIndex(Int_t index,Int_t &i,Int_t &j) const {
i = index/fNj;j = index - fNj*i;
if(i<0||i>=fNi || j<0||j>=fNj){i=-1;j=-1; return;}
}
Double_t GetSignal(Int_t index) {
if(GetpListItem(index)==0) return 0.0;
return GetpListItem(index)->GetSumSignal();
}
virtual Double_t GetSignal(Int_t i,Int_t j) const {
if(GetpListItem(i,j)==0) return 0.0;
return GetpListItem(i,j)->GetSumSignal();
}
Double_t GetSignalOnly(Int_t i,Int_t j)const {
if(GetpListItem(i,j)==0) return 0.0;
return GetpListItem(i,j)->GetSignal();
}
Double_t GetNoise(Int_t i,Int_t j) const {
if(GetpListItem(i,j)==0) return 0.0;
return GetpListItem(i,j)->GetNoise();
}
Double_t GetTSignal(Int_t i,Int_t j,Int_t k) const {
if(GetpListItem(i,j)==0) return 0.0;
return GetpListItem(i,j)->GetSignal(k);
}
Int_t GetTrack(Int_t i,Int_t j,Int_t k) const {
if(GetpListItem(i,j)==0) return -2;
return GetpListItem(i,j)->GetTrack(k);
}
Int_t GetHit(Int_t i,Int_t j,Int_t k) const {
if(GetpListItem(i,j)==0) return -2;
return GetpListItem(i,j)->GetHit(k);
}
Int_t GetNSignals(Int_t i,Int_t j) const {
if(GetpListItem(i,j)==0) return 0;
return GetpListItem(i,j)->GetNsignals();
}
virtual void AddItemTo(Int_t fileIndex, AliITSpListItem *pl);
void AddSignal(Int_t i,Int_t j,Int_t trk,Int_t ht,Int_t mod,Double_t sig);
void AddNoise(Int_t i,Int_t j,Int_t mod,Double_t noise);
virtual void ClearMap();
virtual void DeleteHit(Int_t i,Int_t j);
virtual Int_t GetHitIndex(Int_t i,Int_t j) const {return GetIndex(i,j);}
TObject * GetHit(Int_t i,Int_t j) const {return (TObject*)GetpListItem(i,j);}
virtual FlagTypeITS TestHit(Int_t i,Int_t j){if(GetpListItem(i,j)==0) return kEmptyITS;
else if(GetSignal(i,j)<=0) return kUnusedITS; else return kUsedITS;}
AliITSpListItem* GetpListItem(Int_t index) { if((fa[index]).IsUsed())
return &(fa[index]);
else return NULL;}
AliITSpListItem* GetpListItem(Int_t i,Int_t j) const {
if((fa[GetIndex(i,j)]).IsUsed())return &(fa[GetIndex(i,j)]);
else return NULL; }
virtual void FillMap(){NotImplemented("FillMap");}
virtual void FillMap2() {NotImplemented("FillMap2");}
virtual void SetThreshold(Int_t ){NotImplemented("SetThreshold");}
virtual void SetThresholdArr(TArrayI ) {NotImplemented("SetThresholdArr");}
virtual void SetHit(Int_t ,Int_t ,Int_t ){NotImplemented("SetHit");}
virtual void FlagHit(Int_t ,Int_t ){NotImplemented("FlagHit");}
virtual void GetCell(Int_t index,Int_t &i,Int_t &j) const;
static Int_t GetIndex(Int_t i,Int_t j,Int_t maxj){
return maxj*i+j;}
private:
Int_t GetIndex(Int_t i,Int_t j) const {
if(i<0||i>=fNi || j<0||j>=fNj){AliWarning(Form("Index out of range 0<i=%d<%d and 0<0j=%d<%d",i,fNi,j,fNj)); return -1;}
return GetIndex(i,j,fNj);}
void NotImplemented(const char *method) const {if(gDebug>0)
Warning(method,"This method is not implemented for this class");}
Int_t fNi,fNj;
AliITSpListItem *fa;
Int_t fEntries;
ClassDef(AliITSpList,5)
};
#endif