ROOT logo
#ifndef ALIITSUSENSMAP_H
#define ALIITSUSENSMAP_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice     */

//***********************************************************************
//
// It consist of a TClonesArray of objects
// and B-tree for fast sorted access
// This array can be accessed via 2 indexed
// it is used at digitization level by 
// all the ITS subdetectors
//
// The items should be added to the map like this:
// map->RegisterItem( new(map->GetFree()) ItemConstructor(...) );
//
// ***********************************************************************
#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);}             //!!! Access in sorted order !!!
  TObject* AtUnsorted(Int_t i)             const {return fItems->At(i);}             //!!! Access in unsorted order !!!
  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;              // 1st dimension of the matrix, col index may span from 0 to fDimCol
  UInt_t fDimRow;              // 2nd dimention of the matrix, row index may span from 0 to fDimRow
  UInt_t fDimCycle;            // readout cycle range, may span from -fDimCycle to fDimCycle
  TClonesArray*    fItems;   // pListItems array
  TBtree*          fBTree;   // tree for ordered access
  //
  ClassDef(AliITSUSensMap,1) // list of sensor signals (should be sortable objects)
};	

//______________________________________________________________________
inline UInt_t AliITSUSensMap::GetIndex(UInt_t col,UInt_t row, Int_t cycle) const  
{
  // linearized ID of digit
  UInt_t cyclePos = cycle+fDimCycle; // cycle may span from -fDimCycle to fDimCycle
#ifdef _ROWWISE_SORT_
  return fDimCol*(cyclePos*fDimRow+row)+col; // sorted in row, then in column
#else
  return fDimRow*(cyclePos*fDimCol+col)+row; // sorted in column, then in 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) 
{
  // returns the i,j index numbers from the linearized index computed with GetIndex
  UInt_t dcr = dcol*drow;
  cycle = int(index/dcr) - dcycle;
  index %= dcr;
#ifdef _ROWWISE_SORT_
  col = index%dcol;   // sorted in row, then in column
  row = index/dcol;
#else
  col = index/drow;   // sorted in column, then in row
  row = index%drow;
#endif  
}


#endif
 AliITSUSensMap.h:1
 AliITSUSensMap.h:2
 AliITSUSensMap.h:3
 AliITSUSensMap.h:4
 AliITSUSensMap.h:5
 AliITSUSensMap.h:6
 AliITSUSensMap.h:7
 AliITSUSensMap.h:8
 AliITSUSensMap.h:9
 AliITSUSensMap.h:10
 AliITSUSensMap.h:11
 AliITSUSensMap.h:12
 AliITSUSensMap.h:13
 AliITSUSensMap.h:14
 AliITSUSensMap.h:15
 AliITSUSensMap.h:16
 AliITSUSensMap.h:17
 AliITSUSensMap.h:18
 AliITSUSensMap.h:19
 AliITSUSensMap.h:20
 AliITSUSensMap.h:21
 AliITSUSensMap.h:22
 AliITSUSensMap.h:23
 AliITSUSensMap.h:24
 AliITSUSensMap.h:25
 AliITSUSensMap.h:26
 AliITSUSensMap.h:27
 AliITSUSensMap.h:28
 AliITSUSensMap.h:29
 AliITSUSensMap.h:30
 AliITSUSensMap.h:31
 AliITSUSensMap.h:32
 AliITSUSensMap.h:33
 AliITSUSensMap.h:34
 AliITSUSensMap.h:35
 AliITSUSensMap.h:36
 AliITSUSensMap.h:37
 AliITSUSensMap.h:38
 AliITSUSensMap.h:39
 AliITSUSensMap.h:40
 AliITSUSensMap.h:41
 AliITSUSensMap.h:42
 AliITSUSensMap.h:43
 AliITSUSensMap.h:44
 AliITSUSensMap.h:45
 AliITSUSensMap.h:46
 AliITSUSensMap.h:47
 AliITSUSensMap.h:48
 AliITSUSensMap.h:49
 AliITSUSensMap.h:50
 AliITSUSensMap.h:51
 AliITSUSensMap.h:52
 AliITSUSensMap.h:53
 AliITSUSensMap.h:54
 AliITSUSensMap.h:55
 AliITSUSensMap.h:56
 AliITSUSensMap.h:57
 AliITSUSensMap.h:58
 AliITSUSensMap.h:59
 AliITSUSensMap.h:60
 AliITSUSensMap.h:61
 AliITSUSensMap.h:62
 AliITSUSensMap.h:63
 AliITSUSensMap.h:64
 AliITSUSensMap.h:65
 AliITSUSensMap.h:66
 AliITSUSensMap.h:67
 AliITSUSensMap.h:68
 AliITSUSensMap.h:69
 AliITSUSensMap.h:70
 AliITSUSensMap.h:71
 AliITSUSensMap.h:72
 AliITSUSensMap.h:73
 AliITSUSensMap.h:74
 AliITSUSensMap.h:75
 AliITSUSensMap.h:76
 AliITSUSensMap.h:77
 AliITSUSensMap.h:78
 AliITSUSensMap.h:79
 AliITSUSensMap.h:80
 AliITSUSensMap.h:81
 AliITSUSensMap.h:82
 AliITSUSensMap.h:83
 AliITSUSensMap.h:84
 AliITSUSensMap.h:85
 AliITSUSensMap.h:86
 AliITSUSensMap.h:87
 AliITSUSensMap.h:88
 AliITSUSensMap.h:89
 AliITSUSensMap.h:90
 AliITSUSensMap.h:91
 AliITSUSensMap.h:92
 AliITSUSensMap.h:93
 AliITSUSensMap.h:94
 AliITSUSensMap.h:95
 AliITSUSensMap.h:96
 AliITSUSensMap.h:97
 AliITSUSensMap.h:98
 AliITSUSensMap.h:99
 AliITSUSensMap.h:100
 AliITSUSensMap.h:101
 AliITSUSensMap.h:102
 AliITSUSensMap.h:103
 AliITSUSensMap.h:104
 AliITSUSensMap.h:105
 AliITSUSensMap.h:106