ROOT logo
#ifndef ALIITSURECOLAYER
#define ALIITSURECOLAYER

#include <TNamed.h>
#include <TObjArray.h>
#include <TClonesArray.h>
#include "AliITSURecoSens.h"

class AliITSUGeomTGeo;
class AliITSsegmentation;
class AliCluster;


///////////////////////////////////////////////////////////////////////
//                                                                   //
//  Class AliITSURecoLayer                                           //
//  Interface between the framework and reconstruction for ITS layer //
//                                                                   //
///////////////////////////////////////////////////////////////////////


class AliITSURecoLayer : public TNamed
{
 public:
  //
  enum {kMaxSensMatching=9}; // max number of sensors returned by FindSensors
  //
  enum {kPassive=BIT(14)                 // layer is passive
	,kOwnsClusterArray=BIT(15)       // owner of cluster array, delete in destructor
  };
  AliITSURecoLayer(const char* name=0);
  AliITSURecoLayer(const char* name, Int_t activeID,AliITSUGeomTGeo* gm);
  virtual ~AliITSURecoLayer();
  //
  void               ProcessClusters(Int_t mode=0);
  //
  Int_t              GetID()                       const {return (int)GetUniqueID();}
  Int_t              GetActiveID()                 const {return fActiveID;}
  Int_t              GetNSensors()                 const {return fNSensors;}
  Int_t              GetNSensorRows()              const {return fNSensorRows;}
  Int_t              GetNSensorsPerRow()           const {return fNSensorsPerRow;}
  Double_t           GetRMin()                     const {return fRMin;}
  Double_t           GetRMax()                     const {return fRMax;}
  Double_t           GetDR()                       const {return fRMax-fRMin;}
  Double_t           GetR()                        const {return fR;}
  Double_t           GetR(Int_t dir)               const {return dir==0 ? fR : (dir<0 ? fRMin : fRMax);}
  Double_t           GetZMin()                     const {return fZMin;}
  Double_t           GetZMax()                     const {return fZMax;}
  Double_t           GetMaxStep()                  const {return fMaxStep;}
  Bool_t             IsActive()                    const {return !TestBit(kPassive);}
  Bool_t             IsPassive()                   const {return TestBit(kPassive);}
  Bool_t             GetOwnsClusterArray()         const {return TestBit(kOwnsClusterArray);}
  //
  void               SetID(Int_t i)                      {SetUniqueID(i);} 
  void               SetActiveID(Int_t i)                {fActiveID = i;} 
  void               SetRMin(Double_t r)                 {fRMin = r;}
  void               SetRMax(Double_t r)                 {fRMax = r;}
  void               SetR(Double_t r)                    {fR = r;}
  void               SetZMin(Double_t z)                 {fZMin = z;}
  void               SetZMax(Double_t z)                 {fZMax = z;}
  void               SetPassive(Bool_t v=kTRUE)          {SetBit(kPassive,v);}
  void               SetOwnsClusterArray(Bool_t v=kTRUE) {SetBit(kOwnsClusterArray,v);}
  void               SetMaxStep(Double_t st)             {fMaxStep = st>0 ? st : 0.1;}
  //
  AliITSURecoSens*   GetSensor(Int_t i)            const {return (AliITSURecoSens*)fSensors->UncheckedAt(i);}
  AliITSURecoSens*   GetSensor(Int_t row,Int_t sinrow)  const {return GetSensor(sinrow+row*fNSensorsPerRow);}
  //
  AliITSURecoSens*   GetSensorFromID(Int_t i)      const;
  TClonesArray*      GetClusters()                 const {return (TClonesArray*)fClusters;}
  TClonesArray**     GetClustersAddress()                {return (TClonesArray**)&fClusters;}  
  Int_t              GetNClusters()                const {return fClusters ? fClusters->GetEntriesFast() : 0;}
  AliCluster*        GetCluster(Int_t icl)         const {return (AliCluster*)fClusters->UncheckedAt(icl);}
  void               SetClusters(TClonesArray* cl)       {fClusters = cl;}
  //
  //  Int_t              FindSensors(const double* impPar, AliITSURecoSens *sensors[AliITSURecoSens::kNNeighbors], int mcLab=-1);
  Int_t              FindSensors(const double* impPar, AliITSURecoSens *sensors[kMaxSensMatching]);
  //
  virtual void       Print(Option_t* option = "")  const;
  virtual Bool_t     IsSortable()                  const {return kTRUE;}
  virtual Bool_t     IsEqual(const TObject* obj)   const;
  virtual Int_t      Compare(const TObject* obj)   const;
  //
 protected:
  void               Build();
  Int_t              SensVIDtoMatrixID(Int_t i)    const {return fSensVIDtoMatrixID[i];}
  //
 protected:
  Int_t              fActiveID;  // ID within active layers
  Int_t              fNSensors;  // N of chips
  Int_t              fNSensorRows; // N of sensor rows (sensors aligned at same phi and spanning the Z range of the layer)
  Int_t              fNSensorsPerRow; // number of sensors in a row
  Int_t*             fSensVIDtoMatrixID; //[fNSensors]
  Double_t           fR;         // mean R
  Double_t           fRMax;      // max  R
  Double_t           fRMin;      // min  R
  Double_t           fZMax;      // max  Z
  Double_t           fZMin;      // min  Z
  Double_t           fPhiOffs;   // offset in phi for 1st stave
  Double_t           fSensDZInv; // inverse mean sensor Z span
  Double_t           fSensDPhiInv;// inverse mean sensor dphi
  Double_t           fMaxStep;   // max step in tracking X allowed within layer
  TObjArray*         fSensors;   // sensors
  AliITSUGeomTGeo*   fITSGeom;   // geometry interface
  TClonesArray*      fClusters;  // clusters of the layer
  //
 private:
  AliITSURecoLayer(const AliITSURecoLayer &source); 
  AliITSURecoLayer& operator=(const AliITSURecoLayer &source); 
  //

  ClassDef(AliITSURecoLayer,1); // helper for layer data used in reco
};

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