clusterizer,reconstructor + many fixes (Magnus,Stefan)
[u/mrichter/AliRoot.git] / ITS / UPGRADE / AliITSUClusterizer.h
1 #ifndef ALIITSUCLUSTERIZER_H\r
2 #define ALIITSUCLUSTERIZER_H\r
3 \r
4 #include <AliCluster.h>\r
5 #include <AliITSdigit.h>\r
6 #include <TTree.h>\r
7 #include <TObjArray.h>\r
8 #include <TClonesArray.h>\r
9 #include <AliITSUSegmentationPix.h>\r
10 \r
11 class AliITSUClusterizer : public TObject \r
12 {\r
13   //\r
14  public:\r
15   enum {kDigitChunkSize=1024};\r
16   //\r
17   AliITSUClusterizer(Int_t nrowInit=0);\r
18   virtual ~AliITSUClusterizer();\r
19   void Clusterize();\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
27   \r
28   void SetDigits(TClonesArray *digits)             {fInputDigits=digits;fInputDigitsReadIndex=0;}\r
29   void SetClusters(TClonesArray *clusters)         {fOutputClusters=clusters;}\r
30 \r
31  protected: // transient data types\r
32   struct AliITSUClusterizerClusterDigit {\r
33     AliITSUClusterizerClusterDigit *fNext;\r
34     AliITSdigit *fDigit;\r
35     Int_t fU;\r
36     Int_t fV;\r
37   };\r
38   \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
45     Int_t fUBegin;\r
46     Int_t fUEnd;\r
47   };\r
48   \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
54   };\r
55 \r
56  protected:\r
57   //\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
68 \r
69   // input "iterator"\r
70   AliITSUClusterizerClusterDigit* NextDigit();\r
71   // output "iterator"\r
72   AliCluster*                     NextCluster() {return new( (*fOutputClusters)[fOutputClusters->GetEntries()] ) AliCluster();}\r
73   \r
74   // modifiers\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
79 \r
80   void Transform(AliCluster *cluster,AliITSUClusterizerClusterCand *cand);\r
81   void CloseCand(AliITSUClusterizerClusterCand *cand);\r
82   void ClosePart(AliITSUClusterizerClusterPart *part);\r
83 \r
84   void CloseRemainingParts(AliITSUClusterizerClusterPart *part);\r
85   //\r
86  protected:\r
87   //\r
88   Int_t fVolID;                             // Volume id (module index)\r
89   const AliITSUSegmentationPix* fSegm;      // Segmentation or local coord calc.\r
90   //\r
91   // Digit Input\r
92   TClonesArray *fInputDigits;\r
93   Int_t         fInputDigitsReadIndex;\r
94   // Cluster Output\r
95   TClonesArray *fOutputClusters;\r
96     \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
105   //\r
106  private:\r
107   AliITSUClusterizer(const AliITSUClusterizer&); //Not implemented\r
108   AliITSUClusterizer& operator=(const AliITSUClusterizer&); //Not implemented\r
109   //\r
110   ClassDef(AliITSUClusterizer,0)\r
111 };\r
112 \r
113 \r
114 //_______________________________________________________________________________\r
115 inline void AliITSUClusterizer::DeallocCand(AliITSUClusterizerClusterCand *cand)\r
116 {\r
117   // free candidate\r
118   cand->fNext=fCandFreelist;\r
119   fCandFreelist=cand;\r
120 }\r
121 \r
122 //_______________________________________________________________________________\r
123 inline void AliITSUClusterizer::DeallocParts(AliITSUClusterizerClusterPart *first,AliITSUClusterizerClusterPart *last)\r
124 {\r
125   // free cluster part\r
126   last->fNextInRow=fPartFreelist;\r
127   fPartFreelist=first;\r
128 }\r
129 \r
130 //_______________________________________________________________________________\r
131 inline AliITSUClusterizer::AliITSUClusterizerClusterDigit* AliITSUClusterizer::AllocDigit()\r
132 {\r
133   // allocate digits\r
134   if (!fDigitFreelist) fDigitFreelist = AllocDigitFreelist();\r
135   AliITSUClusterizerClusterDigit *digit = fDigitFreelist;\r
136   fDigitFreelist = fDigitFreelist->fNext;\r
137   return digit;\r
138 }\r
139 \r
140 //_______________________________________________________________________________\r
141 inline AliITSUClusterizer::AliITSUClusterizerClusterPart* AliITSUClusterizer::AllocPart()\r
142 {\r
143   // allocate cluster part\r
144   AliITSUClusterizerClusterPart *part=fPartFreelist;\r
145   fPartFreelist=fPartFreelist->fNextInRow;\r
146   return part;\r
147 }\r
148 \r
149 //_______________________________________________________________________________\r
150 inline AliITSUClusterizer::AliITSUClusterizerClusterCand* AliITSUClusterizer::AllocCand()\r
151 {\r
152   // allocate cluster \r
153   AliITSUClusterizerClusterCand *cand=fCandFreelist;\r
154   fCandFreelist=fCandFreelist->fNext;\r
155   return cand;\r
156 }\r
157 \r
158 //_______________________________________________________________________________\r
159 inline void AliITSUClusterizer::DeallocDigits(AliITSUClusterizerClusterDigit *first, AliITSUClusterizerClusterDigit *last) \r
160 {\r
161   // free digit\r
162   last->fNext = fDigitFreelist;\r
163   fDigitFreelist = first;\r
164 }\r
165 \r
166 //_______________________________________________________________________________\r
167 inline void AliITSUClusterizer::AttachDigitToCand(AliITSUClusterizerClusterCand *cand,AliITSUClusterizerClusterDigit *digit) \r
168 {\r
169   // attach digit\r
170   digit->fNext = cand->fFirstDigit;\r
171   cand->fFirstDigit = digit;\r
172 }\r
173 \r
174 //_______________________________________________________________________________\r
175 inline void AliITSUClusterizer::DetachPartFromCand(AliITSUClusterizerClusterCand *cand,AliITSUClusterizerClusterPart *part) \r
176 {\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
181 }\r
182 \r
183 \r
184 #endif\r
185 \r