85e4c6b465c15f637864d67bd8532e08da0452c7
[u/mrichter/AliRoot.git] / ITS / ITSrec / AliITSClusterFinder.h
1 #ifndef ALIITSCLUSTERFINDER_H
2 #define ALIITSCLUSTERFINDER_H
3  
4 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5  * See cxx source for full Copyright notice                               */
6  
7 /* $Id$ */
8
9 ////////////////////////////////////////////////
10 //  ITS Cluster Finder Class                  //
11 //                                            //
12 //                                            //
13 ////////////////////////////////////////////////
14
15 #include <TObject.h>
16 #include <TClonesArray.h>
17 #include "AliLog.h"
18
19 class AliITSMap;
20 class AliITSresponse;
21 class AliITSsegmentation;
22 class AliITSdigit;
23 class AliITSRecPoint;
24 class AliITSDetTypeRec;
25 class AliRawReader;
26 class TArrayI;
27
28 using std::istream;
29
30 //----------------------------------------------------------------------
31 class AliITSClusterFinder :public TObject{
32   public:
33     AliITSClusterFinder(); // Default constructor
34     // Standard Constructor
35     AliITSClusterFinder(AliITSDetTypeRec* dettyp);
36     AliITSClusterFinder(AliITSDetTypeRec* dettyp,TClonesArray *digits);// Standard+ Constructor
37     virtual ~AliITSClusterFinder(); // Destructor
38     //
39     // Do the Reconstruction.
40     virtual void FindRawClusters(Int_t /*mod*/)=0; // Finds cluster of digits.
41     virtual void RawdataToClusters(AliRawReader* /*rawReader*/) {
42       AliError("Method not implemented in this class ");
43     }
44
45     // Digit
46     virtual void SetDigits(TClonesArray *itsDigits) {// set digits
47         fDigits=itsDigits;fNdigits = fDigits->GetEntriesFast();}
48     virtual AliITSdigit* GetDigit(Int_t i){ // Returns ith digit
49         return (AliITSdigit*) fDigits->UncheckedAt(i);}
50     virtual TClonesArray* Digits(){return fDigits;}// Gets fDigits
51     virtual Int_t   NDigits() const {return fNdigits;}// Get Number of Digits
52
53     // Set fClusters up
54     virtual void SetClusters(TClonesArray *itsClusters){// set clusters
55         fClusters = itsClusters;}
56     // Get fCluters
57     virtual TClonesArray* Clusters(){return fClusters;}
58     // Returns the present number of enteries
59     virtual Int_t NClusters()const {return fClusters->GetEntriesFast();}
60
61     virtual void SetModule(Int_t module){fModule = module;}// Set module number
62     virtual Int_t GetModule()const {return fModule;}// Returns module number
63
64     void SetEvent(Int_t event) { fEvent=event; }
65
66     // Others
67     virtual void  SetMap(AliITSMap *m) {fMap=m;}// map
68     AliITSMap* Map(){return fMap;}// map
69     virtual Int_t GetNPeaks() const {return fNPeaks;}// returns fNPeaks
70     //
71     virtual Bool_t IsNeighbor(TObjArray *digs,Int_t i,Int_t j[]) const;
72         // Set max. cluster size ; bigger clusters will be rejected
73
74     // IO functions
75     void Print(ostream *os) const; // Class ascii print function
76     void Read(istream *os);  // Class ascii read function
77     virtual void Print(Option_t *option="") const {TObject::Print(option);}
78     virtual Int_t Read(const char *name) {return TObject::Read(name);}
79
80     virtual void SetDetTypeRec(AliITSDetTypeRec* dtr) {fDetTypeRec=dtr;}
81     AliITSDetTypeRec* GetDetTypeRec() const {return fDetTypeRec;}
82
83     void InitGeometry(); 
84     //
85     Int_t    GetNClusters()                               const {return fNClusters;}
86     void     SetRawID2ClusID(TArrayI *arr)                      {fRawID2ClusID = arr;} 
87     TArrayI* GetRawID2ClusID()                            const {return fRawID2ClusID;} 
88     // 
89   protected:
90   class Ali1Dcluster {
91   public:
92     void SetY(Float_t y) {fY=y;}
93     void SetQ(Float_t q) {fQ=q;}
94     void SetNd(Int_t n)  {fNd=n;}
95     void SetLabels(Int_t *lab) {fLab[0]=lab[0];fLab[1]=lab[1];fLab[2]=lab[2];}
96     Float_t GetY() const {return fY;}
97     Float_t GetQ() const {return fQ;}
98     Int_t GetNd()const {return fNd;}
99     Int_t GetLabel(Int_t lab) const { return fLab[lab]; }
100   protected:
101     Float_t fY; //cluster position
102     Float_t fQ; //cluster charge
103     Int_t fNd;  //number of digits
104     Int_t fLab[3]; //track label
105   };
106   class AliBin {
107   public:
108   AliBin():fIndex(0),fMask(0xFFFFFFFE),fRawID(-1),fQ(0){}
109     void SetIndex(UInt_t idx) {fIndex=idx;}
110     void SetQ(UShort_t q)  {fQ=q;}
111     void SetMask(UInt_t m) {fMask=m;}
112     void SetRawID(Int_t id) {fRawID=id;}
113     void Reset() {fIndex=0; fMask=0xFFFFFFFE; fQ=0; fRawID=-1;}
114
115     void Use() {fMask&=0xFFFFFFFE;}
116     Bool_t IsNotUsed() const {return (fMask&1);}
117     Bool_t IsUsed() const {return !(IsNotUsed());}
118
119     UInt_t   GetIndex() const {return fIndex;}
120     UShort_t GetQ()     const {return fQ;}
121     UInt_t   GetMask()  const {return fMask;}
122     Int_t    GetRawID() const {return fRawID;}
123   protected:
124     UInt_t fIndex; //digit index
125     UInt_t fMask; //peak mask
126     Int_t  fRawID; // ID of raw word (used for embedding)
127     UShort_t fQ;  //signal
128   };
129   void MakeCluster(Int_t k,Int_t max,AliBin *bins,UInt_t m,AliITSRecPoint &c);
130   static Bool_t IsMaximum(Int_t k, Int_t max, const AliBin *bins);
131   static void FindPeaks(Int_t k,Int_t m,AliBin*b,Int_t*idx,UInt_t*msk,Int_t&n);
132   static void MarkPeak(Int_t k, Int_t max, AliBin *bins, UInt_t m);
133   static void FindCluster(Int_t k,Int_t maxz,AliBin *bins,Int_t &n,Int_t *idx);
134
135   static void CheckLabels2(Int_t lab[10]);
136   static void AddLabel(Int_t lab[10], Int_t label);      
137
138   // data members      
139
140   Int_t              fModule;        //! Module number to be reconstuctted
141   TClonesArray       *fDigits;       //! digits 
142   Int_t              fNdigits;       //! num of digits 
143   
144   AliITSDetTypeRec* fDetTypeRec; //ITS object for reconstruction
145   TClonesArray       *fClusters;     //! Array of clusters
146   AliITSMap          *fMap;          //! map
147   Int_t              fNPeaks;        //! NPeaks  
148   // Data members needed to fill AliCluster objects
149   Int_t fNdet[2200];           // detector index  
150   Int_t fNlayer[2200];         // detector layer
151   
152   Int_t fNModules;             // total number of modules    
153   Int_t fEvent;                //event number
154   Int_t fZmin;   // minimum channel in Zloc
155   Int_t fZmax;   // maximum channel in Zloc
156   Int_t fXmin;   // minimum channel in Xloc
157   Int_t fXmax;   // maximum channel in Xloc 
158   //
159   UInt_t fNClusters; // total number of clusters found
160   //
161   TArrayI* fRawID2ClusID;        //! optional array to store raw word ID -> ClusID for embedding (not owned)
162   
163   AliITSClusterFinder(const AliITSClusterFinder &source); // copy constructor
164   // assignment operator
165   AliITSClusterFinder& operator=(const AliITSClusterFinder &source);
166   
167
168   ClassDef(AliITSClusterFinder,11) //Class for clustering and reconstruction of space points
169 };
170 // Input and output functions for standard C++ input/output.
171 ostream &operator<<(ostream &os,AliITSClusterFinder &source);
172 istream &operator>>(istream &os,AliITSClusterFinder &source);
173 #endif