]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/UPGRADE/AliITSUClusterizer.h
Reducing the number of 1 mm overlaps in the space frame
[u/mrichter/AliRoot.git] / ITS / UPGRADE / AliITSUClusterizer.h
CommitLineData
c683985a 1#ifndef ALIITSUCLUSTERIZER_H
2#define ALIITSUCLUSTERIZER_H
3
4#include <TClonesArray.h>
5
6//#define _ClusterTopology_ // uncomment this to produce the tree with cluster topology
7
8class TTree;
9class TObjAray;
10class AliITSUSegmentationPix;
11class AliITSdigit;
12class AliCluster;
13class AliITSUClusterPix;
14class AliITSURecoParam;
15//
16#ifdef _ClusterTopology_
17#include <TBits.h>
18class TFile;
19#endif //_ClusterTopology_
20
21
22class AliITSUClusterizer : public TObject
23{
24 //
25 public:
26 enum {kDigitChunkSize=1024, kMaxLabels=20,kMaxLabInCluster=3};
27 //
28 AliITSUClusterizer(Int_t nrowInit=0);
29 virtual ~AliITSUClusterizer();
30 void SetRawData(Bool_t v=kTRUE) {fRawData = v;}
31 void Clusterize();
32 void SetSegmentation(const AliITSUSegmentationPix *segm);
33 void SetRecoParam(const AliITSURecoParam* param) {fRecoParam = param;}
34 void SetLayerID(Int_t id) {fLayerID = id;}
35 void SetVolID(Int_t id) {fVolID = id;}
36 void SetNRow(Int_t nrow);
37 void SetAllowDiagonalClusterization(Bool_t v) {fAllowDiagonalClusterization = v;}
38 void PrepareLorentzAngleCorrection(Double_t bz);
39 //
40 // interface methods
41 void MakeRecPointBranch(TTree */*treeR*/) {};
42 void SetRecPointTreeAddress(TTree */*treeR*/) {};
43 void DigitsToRecPoints(const TObjArray */*digList*/) {};
44
45 void SetDigits(const TClonesArray *digits) {fInputDigits=digits;fInputDigitsReadIndex=0;}
46 void SetClusters(TClonesArray *clusters) {fOutputClusters=clusters;}
47 //
48 // labeling methods
49 void AddLabel(int label);
50 void CheckLabels();
51 //
52 protected: // transient data types
53 struct AliITSUClusterizerClusterDigit {
54 AliITSUClusterizerClusterDigit *fNext;
55 AliITSdigit *fDigit;
56 };
57
58 struct AliITSUClusterizerClusterCand;
59 struct AliITSUClusterizerClusterPart {
60 AliITSUClusterizerClusterPart *fNextInRow;
61 AliITSUClusterizerClusterPart *fPrevInCluster;
62 AliITSUClusterizerClusterPart *fNextInCluster;
63 AliITSUClusterizerClusterCand *fParent;
64 Int_t fUBegin;
65 Int_t fUEnd;
66 };
67
68 struct AliITSUClusterizerClusterCand {
69 AliITSUClusterizerClusterCand *fNext; // only used for memory management
70 AliITSUClusterizerClusterPart *fFirstPart;
71 AliITSUClusterizerClusterDigit *fFirstDigit;
72 AliITSUClusterizerClusterDigit *fLastDigit ;
73 };
74
75 protected:
76 //
77 // allocation and deallocation
78 AliITSUClusterizerClusterDigit* AllocDigitFreelist();
79 AliITSUClusterizerClusterCand* AllocCand();
80 void DeallocCand(AliITSUClusterizerClusterCand *cand);
81 AliITSUClusterizerClusterPart* AllocPart();
82 void DeallocPart(AliITSUClusterizerClusterPart *part) {DeallocParts(part,part); }
83 void DeallocParts(AliITSUClusterizerClusterPart *first,AliITSUClusterizerClusterPart *last);
84 AliITSUClusterizerClusterDigit* AllocDigit();
85 void DeallocDigit(AliITSUClusterizerClusterDigit *digit) {DeallocDigits(digit,digit);}
86 void DeallocDigits(AliITSUClusterizerClusterDigit *first,AliITSUClusterizerClusterDigit *last);
87
88 // input "iterator"
89 AliITSUClusterizerClusterDigit* NextDigit();
90 // output "iterator"
91 AliCluster* NextCluster() {return (AliCluster*)fOutputClusters->New(fOutputClusters->GetEntriesFast());}
92
93 // modifiers
94 void SetAllowDiagonalClusterization();
95
96 void AttachDigitToCand(AliITSUClusterizerClusterCand *cand,AliITSUClusterizerClusterDigit *digit);
97 void AttachPartToCand(AliITSUClusterizerClusterCand *cand,AliITSUClusterizerClusterPart *part);
98 void DetachPartFromCand(AliITSUClusterizerClusterCand *cand,AliITSUClusterizerClusterPart *part);
99 void MergeCands(AliITSUClusterizerClusterCand *a,AliITSUClusterizerClusterCand *b);
100 void Transform(AliITSUClusterPix *cluster, AliITSUClusterizerClusterCand *cand);
101 void CloseCand(AliITSUClusterizerClusterCand *cand);
102 void ClosePart(AliITSUClusterizerClusterPart *part);
103
104 void CloseRemainingParts(AliITSUClusterizerClusterPart *part);
105 //
106 protected:
107 //
108 Int_t fVolID; // Volume id (module index)
109 Bool_t fAllowDiagonalClusterization; // allow clusters with pixels having common corners only
110 const AliITSUSegmentationPix* fSegm; // Segmentation or local coord calc.
111 const AliITSURecoParam* fRecoParam; // reco params
112 //
113 // Digit Input
114 const TClonesArray *fInputDigits; // supplied digits
115 Int_t fInputDigitsReadIndex; // digits counter
116 Int_t fLayerID; // current layer id
117 //
118 Int_t fCurrLabels[kMaxLabels]; // labels collected for current cluster
119 Int_t fNLabels; // number of collected labels
120 Bool_t fRawData; // is raw data processed?
121 //
122 Double_t fLorAngCorrection; // Lorentz Angle correction for current layer
123 // Cluster Output
124 TClonesArray *fOutputClusters; // external container to store clusters
125 //
126 // temporary variables
127 AliITSUClusterizerClusterDigit *fDigitFreelist ; //! pool of local digits
128 AliITSUClusterizerClusterPart *fPartFreelist ; //! pool of unfinished clusters
129 AliITSUClusterizerClusterCand *fCandFreelist ; //! pool of clusters
130 AliITSUClusterizerClusterDigit *fDigitFreelistBptrFirst; //! pointer in the pool
131 AliITSUClusterizerClusterDigit *fDigitFreelistBptrLast ; //! pointer in the pool
132 AliITSUClusterizerClusterPart *fPartFreelistBptr ; //! pointer in the pool
133 AliITSUClusterizerClusterCand *fCandFreelistBptr ; //!pointer in the pool
134 //
135#ifdef _ClusterTopology_
136 TTree* fTreeTopology; // output tree for the cluster topology in the special mode
137 TFile* fFileTopology; // output file for the cluster topology in the special mode
138 TBits fTopology; // container for the clusters topology pattern
139 UShort_t fMinCol; // min col number
140 UShort_t fMinRow; // min row number
141 void InitTopologyTree();
142 void SaveTopologyTree();
143 void FillClusterTopology(AliITSUClusterizerClusterCand *cand);
144#endif //_ClusterTopology_
145 private:
146 AliITSUClusterizer(const AliITSUClusterizer&); //Not implemented
147 AliITSUClusterizer& operator=(const AliITSUClusterizer&); //Not implemented
148 //
149 ClassDef(AliITSUClusterizer,0)
150};
151
152
153//_______________________________________________________________________________
154inline void AliITSUClusterizer::DeallocCand(AliITSUClusterizerClusterCand *cand)
155{
156 // free candidate
157 cand->fNext=fCandFreelist;
158 fCandFreelist=cand;
159}
160
161//_______________________________________________________________________________
162inline void AliITSUClusterizer::DeallocParts(AliITSUClusterizerClusterPart *first,AliITSUClusterizerClusterPart *last)
163{
164 // free cluster part
165 last->fNextInRow=fPartFreelist;
166 fPartFreelist=first;
167}
168
169//_______________________________________________________________________________
170inline AliITSUClusterizer::AliITSUClusterizerClusterDigit* AliITSUClusterizer::AllocDigit()
171{
172 // allocate digits
173 if (!fDigitFreelist) fDigitFreelist = AllocDigitFreelist();
174 AliITSUClusterizerClusterDigit *digit = fDigitFreelist;
175 fDigitFreelist = fDigitFreelist->fNext;
176 return digit;
177}
178
179//_______________________________________________________________________________
180inline AliITSUClusterizer::AliITSUClusterizerClusterPart* AliITSUClusterizer::AllocPart()
181{
182 // allocate cluster part
183 AliITSUClusterizerClusterPart *part=fPartFreelist;
184 fPartFreelist=fPartFreelist->fNextInRow;
185 return part;
186}
187
188//_______________________________________________________________________________
189inline AliITSUClusterizer::AliITSUClusterizerClusterCand* AliITSUClusterizer::AllocCand()
190{
191 // allocate cluster
192 AliITSUClusterizerClusterCand *cand=fCandFreelist;
193 fCandFreelist=fCandFreelist->fNext;
194 return cand;
195}
196
197//_______________________________________________________________________________
198inline void AliITSUClusterizer::DeallocDigits(AliITSUClusterizerClusterDigit *first, AliITSUClusterizerClusterDigit *last)
199{
200 // free digit
201 last->fNext = fDigitFreelist;
202 fDigitFreelist = first;
203}
204
205//_______________________________________________________________________________
206inline void AliITSUClusterizer::AttachDigitToCand(AliITSUClusterizerClusterCand *cand,AliITSUClusterizerClusterDigit *digit)
207{
208 // attach digit
209 digit->fNext = cand->fFirstDigit;
210 cand->fFirstDigit = digit;
211}
212
213//_______________________________________________________________________________
214inline void AliITSUClusterizer::DetachPartFromCand(AliITSUClusterizerClusterCand *cand,AliITSUClusterizerClusterPart *part)
215{
216 // remove cluster part
217 if (part->fPrevInCluster) part->fPrevInCluster->fNextInCluster=part->fNextInCluster;
218 else cand->fFirstPart=part->fNextInCluster;
219 if (part->fNextInCluster) part->fNextInCluster->fPrevInCluster=part->fPrevInCluster;
220}
221
222//______________________________________________________________________________
223inline void AliITSUClusterizer::AddLabel(int label)
224{
225 // add new label
226 if (fNLabels==kMaxLabels) return;
227 for (int i=fNLabels;i--;) if (fCurrLabels[i]==label) return;
228 fCurrLabels[fNLabels++] = label;
229}
230
231
232#endif
233