]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/CALO/AliHLTCaloClusterizer.cxx
- changes to make the clusterisation work for EMCAL
[u/mrichter/AliRoot.git] / HLT / CALO / AliHLTCaloClusterizer.cxx
1 // $Id$\r
2 \r
3 /**************************************************************************\r
4  * This file is property of and copyright by the ALICE HLT Project        * \r
5  * All rights reserved.                                                   *\r
6  *                                                                        *\r
7  * Primary Authors: Oystein Djuvsland                                     *\r
8  *                                                                        *\r
9  * Permission to use, copy, modify and distribute this software and its   *\r
10  * documentation strictly for non-commercial purposes is hereby granted   *\r
11  * without fee, provided that the above copyright notice appears in all   *\r
12  * copies and that both the copyright notice and this permission notice   *\r
13  * appear in the supporting documentation. The authors make no claims     *\r
14  * about the suitability of this software for any purpose. It is          * \r
15  * provided "as is" without express or implied warranty.                  *\r
16  **************************************************************************/\r
17 \r
18 /** \r
19  * @file   AliHLTCaloClusterizer.cxx\r
20  * @author Oystein Djuvsland\r
21  * @date \r
22  * @brief  Clusterizer for PHOS HLT \r
23  */\r
24 \r
25 // see header file for class documentation\r
26 // or\r
27 // refer to README to build package\r
28 // or\r
29 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt\r
30 \r
31 #include "AliHLTCaloClusterizer.h"\r
32 #include "AliHLTLogging.h"\r
33 #include "TMath.h"\r
34 #include "AliHLTCaloRecPointDataStruct.h"\r
35 #include "AliHLTCaloDigitDataStruct.h"\r
36 #include "AliHLTCaloDigitContainerDataStruct.h"\r
37 #include "AliHLTCaloConstantsHandler.h"\r
38 \r
39 ClassImp(AliHLTCaloClusterizer);\r
40 \r
41 AliHLTCaloClusterizer::AliHLTCaloClusterizer(TString det):\r
42   AliHLTCaloConstantsHandler(det),\r
43   fRecPointArray(0),\r
44   fRecPointDataPtr(0),\r
45   fFirstRecPointPtr(0),\r
46   fArraySize(0),\r
47   fAvailableSize(0),\r
48   fUsedSize(0),\r
49   fNRecPoints(0),\r
50   fDigitIndexPtr(0),\r
51   fEmcClusteringThreshold(0),\r
52   fEmcMinEnergyThreshold(0),\r
53   fEmcTimeGate(0),\r
54   fDigitsInCluster(0),\r
55   fDigitsPointerArray(0),\r
56   fDigitContainerPtr(0),\r
57   fMaxDigitIndexDiff(0),\r
58   fNDigits(0)\r
59 {\r
60   //See header file for documentation\r
61   //fEmcClusteringThreshold = 0.2;\r
62   //fEmcMinEnergyThreshold = 0.03;\r
63 \r
64   fEmcClusteringThreshold = 0.1;\r
65   fEmcMinEnergyThreshold = 0.01;\r
66   fEmcTimeGate = 1.e-6 ;\r
67   \r
68   fMaxDigitIndexDiff = 2*fCaloConstants->GetNZROWSMOD();\r
69   \r
70   \r
71   fArraySize = 10;\r
72   fRecPointArray = new AliHLTCaloRecPointDataStruct*[fArraySize];\r
73   \r
74   fAvailableSize = sizeof(AliHLTCaloRecPointDataStruct) * 20;\r
75   fFirstRecPointPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(new UChar_t[fAvailableSize]);\r
76   fRecPointDataPtr = fFirstRecPointPtr;  \r
77 \r
78 }//end\r
79 \r
80 AliHLTCaloClusterizer::~AliHLTCaloClusterizer()  \r
81 {\r
82   //See header file for documentation\r
83 }\r
84 \r
85 void \r
86 AliHLTCaloClusterizer::SetRecPointDataPtr(AliHLTCaloRecPointDataStruct* recPointDataPtr)\r
87 {\r
88   // See header file for documentation\r
89   fRecPointDataPtr = recPointDataPtr;\r
90 }\r
91 \r
92 Int_t \r
93 AliHLTCaloClusterizer::ClusterizeEvent(Int_t nDigits)\r
94 {\r
95   //see header file for documentation\r
96   Int_t nRecPoints = 0;\r
97   fNRecPoints = 0;\r
98   fUsedSize = 0;\r
99   fNDigits = nDigits;\r
100   fRecPointDataPtr = fFirstRecPointPtr;\r
101   //Clusterization starts\r
102   for(Int_t i = 0; i < nDigits; i++)\r
103     { \r
104       fDigitsInCluster = 0;\r
105 \r
106       if(fDigitsPointerArray[i]->fEnergy < fEmcClusteringThreshold)\r
107         {\r
108           continue;\r
109         }\r
110       CheckArray();\r
111       CheckBuffer();\r
112 \r
113       // First digit is placed at the fDigits member variable in the recpoint\r
114       fDigitIndexPtr = &(fRecPointDataPtr->fDigits);\r
115       fUsedSize += sizeof(AliHLTCaloRecPointDataStruct);\r
116       \r
117       fRecPointDataPtr->fAmp = 0;\r
118       fRecPointDataPtr->fModule = fDigitsPointerArray[i]->fModule;\r
119 \r
120       // Assigning the digit to this rec point\r
121       fRecPointDataPtr->fDigits = i;\r
122       fUsedSize += sizeof(AliHLTCaloRecPointDataStruct);\r
123       \r
124       // Incrementing the pointer to be ready for new entry\r
125       fDigitIndexPtr++;\r
126 \r
127       fRecPointDataPtr->fAmp += fDigitsPointerArray[i]->fEnergy;\r
128       fDigitsPointerArray[i]->fEnergy = 0;\r
129       fDigitsInCluster++;\r
130       nRecPoints++;\r
131 \r
132       // Scanning for the neighbours\r
133       if(ScanForNeighbourDigits(i, fRecPointDataPtr) != 0)\r
134       {\r
135          return -1;\r
136       }\r
137 \r
138       //fUsedSize += sizeof(AliHLTCaloRecPointDataStruct) + (fDigitsInCluster-1)*sizeof(AliHLTCaloDigitDataStruct);   \r
139       \r
140       fRecPointDataPtr->fMultiplicity = fDigitsInCluster;     \r
141       fRecPointArray[fNRecPoints] = fRecPointDataPtr; \r
142       \r
143       fRecPointDataPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(fDigitIndexPtr);\r
144 \r
145       fNRecPoints++;\r
146       \r
147     }//end of clusterization\r
148    return nRecPoints;\r
149 }\r
150 \r
151 Int_t\r
152 AliHLTCaloClusterizer::ScanForNeighbourDigits(Int_t index, AliHLTCaloRecPointDataStruct* recPoint)\r
153 {\r
154   //see header file for documentation\r
155   Int_t max = TMath::Min(fNDigits, (Int_t)fMaxDigitIndexDiff+index);\r
156   Int_t min = TMath::Max(0, (Int_t)(index - (Int_t)fMaxDigitIndexDiff));\r
157 \r
158   max = fNDigits;\r
159   min = 0;\r
160   for(Int_t j = min; j < max; j++)\r
161     {\r
162       if(fDigitsPointerArray[j]->fEnergy > fEmcMinEnergyThreshold)\r
163         {\r
164           if(j != index)\r
165             {\r
166               if(AreNeighbours(fDigitsPointerArray[index],\r
167                                fDigitsPointerArray[j]))\r
168                 {\r
169 //                if((fAvailableSize - fUsedSize) < sizeof(Int_t))\r
170 //                   {\r
171 //                      UChar_t *tmp = new UChar_t[fAvailableSize*2];\r
172 //                      memcpy(tmp, fRecPointDataPtr, fAvailableSize);\r
173 //                      for(Int_t n = 0; n < fNRecPoints; n++)\r
174 //                      {\r
175 //                         fRecPointArray[n] = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(reinterpret_cast<UChar_t*>(fRecPointArray[n]) - reinterpret_cast<UChar_t*>(fFirstRecPointPtr) + reinterpret_cast<UChar_t*>(tmp));\r
176 //                      }\r
177 //                      fRecPointDataPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(tmp);\r
178 //                      fFirstRecPointPtr = fRecPointDataPtr;\r
179 //                      fUsedSize = 0;\r
180 //                   }  \r
181                   CheckBuffer();\r
182                   // Assigning index to digit\r
183                   *fDigitIndexPtr = j;\r
184                   fUsedSize += sizeof(Int_t);\r
185                   \r
186                   // Incrementing digit pointer to be ready for new entry\r
187                   fDigitIndexPtr++;\r
188 \r
189                   recPoint->fAmp += fDigitsPointerArray[j]->fEnergy;\r
190                   fDigitsPointerArray[j]->fEnergy = 0;        \r
191                   fDigitsInCluster++;\r
192                   ScanForNeighbourDigits(j, recPoint);\r
193                 }\r
194             }\r
195         }\r
196     }\r
197   return 0;\r
198 }\r
199 \r
200 Int_t \r
201 AliHLTCaloClusterizer::AreNeighbours(AliHLTCaloDigitDataStruct* digit1, \r
202                                             AliHLTCaloDigitDataStruct* digit2)\r
203 {\r
204   //see header file for documentation\r
205   if ( (digit1->fModule == digit2->fModule) /*&& (coord1[1]==coord2[1])*/ ) // inside the same PHOS module\r
206     { \r
207       Int_t rowdiff = TMath::Abs( digit1->fZ - digit2->fZ );  \r
208       Int_t coldiff = TMath::Abs( digit1->fX - digit2->fX ); \r
209       if (( coldiff <= 1   &&  rowdiff == 0 ) || ( coldiff == 0 &&  rowdiff <= 1 ))\r
210         {\r
211 //        cout << "Are neighbours: digit (E = "  << digit1->fEnergy << ") with x = " << digit1->fX << " and z = " << digit1->fZ << \r
212 //          " is neighbour with digit (E = " << digit2->fEnergy << ") with x = " << digit2->fX << " and z = " << digit2->fZ << endl;\r
213 \r
214           if(TMath::Abs(digit1->fTime - digit2->fTime ) < fEmcTimeGate)\r
215             {\r
216               return 1; \r
217             }\r
218         }\r
219 \r
220    /*   Float_t rowdiff = TMath::Abs( digit1->fZ - digit2->fZ );  \r
221       Float_t coldiff = TMath::Abs( digit1->fX - digit2->fX ); \r
222       if (( coldiff <= 2.4   &&  rowdiff < 0.4 ) || ( coldiff < 0.4 &&  rowdiff <= 2.4 ))\r
223         {\r
224           //      cout << "Are neighbours: digit (E = "  << digit1->fEnergy << ") with x = " << digit1->fX << " and z = " << digit1->fZ << \r
225           //        " is neighbour with digit (E = " << digit2->fEnergy << ") with x = " << digit2->fX << " and z = " << digit2->fZ << endl;\r
226 \r
227           if(TMath::Abs(digit1->fTime - digit2->fTime ) < fEmcTimeGate)\r
228             {\r
229               return 1; \r
230             }\r
231         }\r
232    */\r
233       else\r
234         {\r
235 //          cout << "Not neighbours: digit (E = "  << digit1->fEnergy << ") with x = " << digit1->fX << " and z = " << digit1->fZ << \r
236 //          " is not neighbour with digit (E = " << digit2->fEnergy << ") with x = " << digit2->fX << " and z = " << digit2->fZ << endl;\r
237         }\r
238     }\r
239   return 0;\r
240 }\r
241 \r
242 \r
243 \r
244 Int_t AliHLTCaloClusterizer::CheckArray()\r
245 {\r
246       if(fArraySize == fNRecPoints)\r
247         {\r
248 //         cout << "Increasing array!" << endl;\r
249            fArraySize *= 2;\r
250            AliHLTCaloRecPointDataStruct **tmp = new AliHLTCaloRecPointDataStruct*[fArraySize];\r
251            memcpy(tmp, fRecPointArray, fArraySize/2 * sizeof(AliHLTCaloRecPointDataStruct*));\r
252            delete [] fRecPointArray;\r
253            fRecPointArray = tmp;\r
254         }\r
255    return 0;\r
256 }\r
257 \r
258 Int_t AliHLTCaloClusterizer::CheckBuffer()\r
259 {\r
260    // See header file for class documentation \r
261         if((fAvailableSize - fUsedSize) < sizeof(AliHLTCaloRecPointDataStruct))\r
262         {\r
263             Int_t recPointOffset = reinterpret_cast<UChar_t*>(fRecPointDataPtr) - reinterpret_cast<UChar_t*>(fFirstRecPointPtr);\r
264             Int_t digitIndexOffset = reinterpret_cast<UChar_t*>(fDigitIndexPtr) - reinterpret_cast<UChar_t*>(fRecPointDataPtr);\r
265             UChar_t *tmp = new UChar_t[fAvailableSize*2];\r
266             memcpy(tmp, fFirstRecPointPtr, fAvailableSize);\r
267             fAvailableSize *= 2;\r
268             for(Int_t n = 0; n < fNRecPoints; n++)\r
269             {\r
270                fRecPointArray[n] = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(reinterpret_cast<UChar_t*>(fRecPointArray[n]) - reinterpret_cast<UChar_t*>(fFirstRecPointPtr) + reinterpret_cast<UChar_t*>(tmp));\r
271             }\r
272             delete [] fFirstRecPointPtr;\r
273             fFirstRecPointPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(tmp);\r
274             fRecPointDataPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(tmp + recPointOffset);\r
275             fDigitIndexPtr = reinterpret_cast<Int_t*>(reinterpret_cast<UChar_t*>(fRecPointDataPtr) + digitIndexOffset);\r
276             fUsedSize = 0;\r
277         }\r
278    return 0;\r
279 }\r
280 \r
281 Int_t AliHLTCaloClusterizer::CheckDigits(AliHLTCaloRecPointDataStruct** recArray, AliHLTCaloDigitDataStruct** digitArray, Int_t nRP)\r
282 {\r
283   AliHLTCaloRecPointDataStruct **recpoints = recArray;\r
284   AliHLTCaloDigitDataStruct **digits = digitArray;\r
285   Int_t nRecPoints = nRP;\r
286   \r
287   if(recArray == 0)\r
288   {\r
289      recpoints = fRecPointArray;\r
290   }\r
291   if(digitArray == 0)\r
292   {\r
293      digits = fDigitsPointerArray;\r
294   }\r
295   if(nRP == 0)\r
296   {\r
297      nRecPoints = fNRecPoints;\r
298   }\r
299   for(Int_t i = 0; i < nRecPoints; i++)\r
300   {\r
301           \r
302      AliHLTCaloRecPointDataStruct *recPoint = recpoints[i];\r
303 \r
304      //AliHLTCaloRecPointDataStruct *recPoint = fRecPointArray[0];\r
305      Int_t multiplicity = recPoint->fMultiplicity;\r
306      Int_t *digitIndexPtr = &(recPoint->fDigits);\r
307      for(Int_t j = 0; j < multiplicity; j++)\r
308      {\r
309         //AliHLTCaloRecPointDataStruct *recPoint = fRecPointArray[j];\r
310 //      AliHLTCaloDigitDataStruct *digit = digits[*digitIndexPtr];\r
311         digitIndexPtr++;\r
312         //recPoint = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(digitIndexPtr);\r
313      }\r
314   }\r
315      \r
316      return 0;\r
317 }\r
318 \r
319 Int_t AliHLTCaloClusterizer::CheckDigits(AliHLTCaloRecPointDataStruct** recArray, AliHLTCaloDigitDataStruct* digitArray, Int_t nRP)\r
320 {\r
321   AliHLTCaloRecPointDataStruct **recpoints = recArray;\r
322   AliHLTCaloDigitDataStruct *digits = digitArray;\r
323   Int_t nRecPoints = nRP;\r
324   \r
325   if(recArray == 0)\r
326   {\r
327      recpoints = fRecPointArray;\r
328   }\r
329     if(nRP == 0)\r
330   {\r
331      nRecPoints = fNRecPoints;\r
332   }\r
333   for(Int_t i = 0; i < nRecPoints; i++)\r
334   {\r
335           \r
336      AliHLTCaloRecPointDataStruct *recPoint = recpoints[i];\r
337 \r
338      //AliHLTCaloRecPointDataStruct *recPoint = fRecPointArray[0];\r
339      Int_t multiplicity = recPoint->fMultiplicity;\r
340      Int_t *digitIndexPtr = &(recPoint->fDigits);\r
341      for(Int_t j = 0; j < multiplicity; j++)\r
342      {\r
343         //AliHLTCaloRecPointDataStruct *recPoint = fRecPointArray[j];\r
344         AliHLTCaloDigitDataStruct digit = digits[*digitIndexPtr];\r
345         digitIndexPtr++;\r
346         //recPoint = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(digitIndexPtr);\r
347      }\r
348   }\r
349    return 0;\r
350      \r
351 }\r