1 #ifndef ALIITSUCLUSTERIZER_H
\r
2 #define ALIITSUCLUSTERIZER_H
\r
4 #include <AliCluster.h>
\r
5 #include <AliITSdigit.h>
\r
7 #include <TObjArray.h>
\r
8 #include <TClonesArray.h>
\r
9 #include <AliITSUSegmentationPix.h>
\r
11 class AliITSUClusterizer : public TObject
\r
15 enum {kDigitChunkSize=1024};
\r
17 AliITSUClusterizer(Int_t nrowInit=0);
\r
18 virtual ~AliITSUClusterizer();
\r
20 void SetSegmentation(const AliITSUSegmentationPix *segm);
\r
21 void SetVolID(Int_t id) {fVolID = id;}
\r
22 void SetNRow(Int_t nrow);
\r
23 // interface methods
\r
24 void MakeRecPointBranch(TTree */*treeR*/) {};
\r
25 void SetRecPointTreeAddress(TTree */*treeR*/) {};
\r
26 void DigitsToRecPoints(const TObjArray */*digList*/) {};
\r
28 void SetDigits(TClonesArray *digits) {fInputDigits=digits;fInputDigitsReadIndex=0;}
\r
29 void SetClusters(TClonesArray *clusters) {fOutputClusters=clusters;}
\r
31 protected: // transient data types
\r
32 struct AliITSUClusterizerClusterDigit {
\r
33 AliITSUClusterizerClusterDigit *fNext;
\r
34 AliITSdigit *fDigit;
\r
39 struct AliITSUClusterizerClusterCand;
\r
40 struct AliITSUClusterizerClusterPart {
\r
41 AliITSUClusterizerClusterPart *fNextInRow;
\r
42 AliITSUClusterizerClusterPart *fPrevInCluster;
\r
43 AliITSUClusterizerClusterPart *fNextInCluster;
\r
44 AliITSUClusterizerClusterCand *fParent;
\r
49 struct AliITSUClusterizerClusterCand {
\r
50 AliITSUClusterizerClusterCand *fNext; // only used for memory management
\r
51 AliITSUClusterizerClusterPart *fFirstPart;
\r
52 AliITSUClusterizerClusterDigit *fFirstDigit;
\r
53 AliITSUClusterizerClusterDigit *fLastDigit ;
\r
58 // allocation and deallocation
\r
59 AliITSUClusterizerClusterDigit* AllocDigitFreelist();
\r
60 AliITSUClusterizerClusterCand* AllocCand();
\r
61 void DeallocCand(AliITSUClusterizerClusterCand *cand);
\r
62 AliITSUClusterizerClusterPart* AllocPart();
\r
63 void DeallocPart(AliITSUClusterizerClusterPart *part) {DeallocParts(part,part); }
\r
64 void DeallocParts(AliITSUClusterizerClusterPart *first,AliITSUClusterizerClusterPart *last);
\r
65 AliITSUClusterizerClusterDigit* AllocDigit();
\r
66 void DeallocDigit(AliITSUClusterizerClusterDigit *digit) {DeallocDigits(digit,digit);}
\r
67 void DeallocDigits(AliITSUClusterizerClusterDigit *first,AliITSUClusterizerClusterDigit *last);
\r
70 AliITSUClusterizerClusterDigit* NextDigit();
\r
71 // output "iterator"
\r
72 AliCluster* NextCluster() {return new( (*fOutputClusters)[fOutputClusters->GetEntries()] ) AliCluster();}
\r
75 void AttachDigitToCand(AliITSUClusterizerClusterCand *cand,AliITSUClusterizerClusterDigit *digit);
\r
76 void AttachPartToCand(AliITSUClusterizerClusterCand *cand,AliITSUClusterizerClusterPart *part);
\r
77 void DetachPartFromCand(AliITSUClusterizerClusterCand *cand,AliITSUClusterizerClusterPart *part);
\r
78 void MergeCands(AliITSUClusterizerClusterCand *a,AliITSUClusterizerClusterCand *b);
\r
80 void Transform(AliCluster *cluster,AliITSUClusterizerClusterCand *cand);
\r
81 void CloseCand(AliITSUClusterizerClusterCand *cand);
\r
82 void ClosePart(AliITSUClusterizerClusterPart *part);
\r
84 void CloseRemainingParts(AliITSUClusterizerClusterPart *part);
\r
88 Int_t fVolID; // Volume id (module index)
\r
89 const AliITSUSegmentationPix* fSegm; // Segmentation or local coord calc.
\r
92 TClonesArray *fInputDigits;
\r
93 Int_t fInputDigitsReadIndex;
\r
95 TClonesArray *fOutputClusters;
\r
97 // temporary variables
\r
98 AliITSUClusterizerClusterDigit *fDigitFreelist ; //!
\r
99 AliITSUClusterizerClusterPart *fPartFreelist ; //!
\r
100 AliITSUClusterizerClusterCand *fCandFreelist ; //!
\r
101 AliITSUClusterizerClusterDigit *fDigitFreelistBptrFirst; //!
\r
102 AliITSUClusterizerClusterDigit *fDigitFreelistBptrLast ; //!
\r
103 AliITSUClusterizerClusterPart *fPartFreelistBptr ; //!
\r
104 AliITSUClusterizerClusterCand *fCandFreelistBptr ; //!
\r
107 AliITSUClusterizer(const AliITSUClusterizer&); //Not implemented
\r
108 AliITSUClusterizer& operator=(const AliITSUClusterizer&); //Not implemented
\r
110 ClassDef(AliITSUClusterizer,0)
\r
114 //_______________________________________________________________________________
\r
115 inline void AliITSUClusterizer::DeallocCand(AliITSUClusterizerClusterCand *cand)
\r
118 cand->fNext=fCandFreelist;
\r
119 fCandFreelist=cand;
\r
122 //_______________________________________________________________________________
\r
123 inline void AliITSUClusterizer::DeallocParts(AliITSUClusterizerClusterPart *first,AliITSUClusterizerClusterPart *last)
\r
125 // free cluster part
\r
126 last->fNextInRow=fPartFreelist;
\r
127 fPartFreelist=first;
\r
130 //_______________________________________________________________________________
\r
131 inline AliITSUClusterizer::AliITSUClusterizerClusterDigit* AliITSUClusterizer::AllocDigit()
\r
134 if (!fDigitFreelist) fDigitFreelist = AllocDigitFreelist();
\r
135 AliITSUClusterizerClusterDigit *digit = fDigitFreelist;
\r
136 fDigitFreelist = fDigitFreelist->fNext;
\r
140 //_______________________________________________________________________________
\r
141 inline AliITSUClusterizer::AliITSUClusterizerClusterPart* AliITSUClusterizer::AllocPart()
\r
143 // allocate cluster part
\r
144 AliITSUClusterizerClusterPart *part=fPartFreelist;
\r
145 fPartFreelist=fPartFreelist->fNextInRow;
\r
149 //_______________________________________________________________________________
\r
150 inline AliITSUClusterizer::AliITSUClusterizerClusterCand* AliITSUClusterizer::AllocCand()
\r
152 // allocate cluster
\r
153 AliITSUClusterizerClusterCand *cand=fCandFreelist;
\r
154 fCandFreelist=fCandFreelist->fNext;
\r
158 //_______________________________________________________________________________
\r
159 inline void AliITSUClusterizer::DeallocDigits(AliITSUClusterizerClusterDigit *first, AliITSUClusterizerClusterDigit *last)
\r
162 last->fNext = fDigitFreelist;
\r
163 fDigitFreelist = first;
\r
166 //_______________________________________________________________________________
\r
167 inline void AliITSUClusterizer::AttachDigitToCand(AliITSUClusterizerClusterCand *cand,AliITSUClusterizerClusterDigit *digit)
\r
170 digit->fNext = cand->fFirstDigit;
\r
171 cand->fFirstDigit = digit;
\r
174 //_______________________________________________________________________________
\r
175 inline void AliITSUClusterizer::DetachPartFromCand(AliITSUClusterizerClusterCand *cand,AliITSUClusterizerClusterPart *part)
\r
177 // remove cluster part
\r
178 if (part->fPrevInCluster) part->fPrevInCluster->fNextInCluster=part->fNextInCluster;
\r
179 else cand->fFirstPart=part->fNextInCluster;
\r
180 if (part->fNextInCluster) part->fNextInCluster->fPrevInCluster=part->fPrevInCluster;
\r