3 /**************************************************************************
\r
4 * This file is property of and copyright by the ALICE HLT Project *
\r
5 * All rights reserved. *
\r
7 * Primary Authors: Oystein Djuvsland *
\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
19 * @file AliHLTCaloClusterizer.cxx
\r
20 * @author Oystein Djuvsland
\r
22 * @brief Clusterizer for PHOS HLT
\r
25 // see header file for class documentation
\r
27 // refer to README to build package
\r
29 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
\r
31 #include "AliHLTCaloClusterizer.h"
\r
32 #include "AliHLTLogging.h"
\r
34 #include "AliHLTCaloRecPointDataStruct.h"
\r
35 #include "AliHLTCaloDigitDataStruct.h"
\r
36 #include "AliHLTCaloDigitContainerDataStruct.h"
\r
37 #include "AliHLTCaloConstantsHandler.h"
\r
39 ClassImp(AliHLTCaloClusterizer);
\r
41 AliHLTCaloClusterizer::AliHLTCaloClusterizer(TString det):
\r
42 AliHLTCaloConstantsHandler(det),
\r
44 fRecPointDataPtr(0),
\r
45 fFirstRecPointPtr(0),
\r
51 fEmcClusteringThreshold(0),
\r
52 fEmcMinEnergyThreshold(0),
\r
54 fDigitsInCluster(0),
\r
55 fDigitsPointerArray(0),
\r
56 fDigitContainerPtr(0),
\r
57 fMaxDigitIndexDiff(0),
\r
60 //See header file for documentation
\r
61 fEmcClusteringThreshold = 0.2;
\r
62 fEmcMinEnergyThreshold = 0.03;
\r
63 fEmcTimeGate = 1.e-6 ;
\r
65 fMaxDigitIndexDiff = 2*fCaloConstants->GetNZROWSMOD();
\r
69 fRecPointArray = new AliHLTCaloRecPointDataStruct*[fArraySize];
\r
71 fAvailableSize = sizeof(AliHLTCaloRecPointDataStruct) * 20;
\r
72 fRecPointDataPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(new UChar_t[fAvailableSize]);
\r
73 fFirstRecPointPtr = fRecPointDataPtr;
\r
74 printf("Start of rec point data: %x, end of rec point data: %x\n", fRecPointDataPtr, reinterpret_cast<UChar_t*>(fRecPointDataPtr) + fAvailableSize);
\r
78 AliHLTCaloClusterizer::~AliHLTCaloClusterizer()
\r
80 //See header file for documentation
\r
84 AliHLTCaloClusterizer::SetRecPointDataPtr(AliHLTCaloRecPointDataStruct* recPointDataPtr)
\r
86 // See header file for documentation
\r
87 fRecPointDataPtr = recPointDataPtr;
\r
91 AliHLTCaloClusterizer::ClusterizeEvent(Int_t nDigits)
\r
93 //see header file for documentation
\r
94 Int_t nRecPoints = 0;
\r
98 fRecPointDataPtr = fFirstRecPointPtr;
\r
99 //Clusterization starts
\r
100 for(Int_t i = 0; i < nDigits; i++)
\r
102 fDigitsInCluster = 0;
\r
103 // printf("ENERGY: %f\n", fDigitsPointerArray[i]->fEnergy);
\r
104 if(fDigitsPointerArray[i]->fEnergy < fEmcClusteringThreshold)
\r
110 // printf("cluster candidate!\n");
\r
111 // First digit is placed at the fDigits member variable in the recpoint
\r
112 fDigitIndexPtr = &(fRecPointDataPtr->fDigits);
\r
114 fRecPointDataPtr->fAmp = 0;
\r
115 fRecPointDataPtr->fModule = fDigitsPointerArray[i]->fModule;
\r
117 // Assigning the digit to this rec point
\r
118 fRecPointDataPtr->fDigits = i;
\r
119 printf("Clusterizier: adding digit: index pointer: %x, index: %d\n", fDigitIndexPtr, *fDigitIndexPtr);
\r
120 fUsedSize += sizeof(AliHLTCaloRecPointDataStruct);
\r
122 // Incrementing the pointer to be ready for new entry
\r
125 fRecPointDataPtr->fAmp += fDigitsPointerArray[i]->fEnergy;
\r
126 fDigitsPointerArray[i]->fEnergy = 0;
\r
127 fDigitsInCluster++;
\r
130 // Scanning for the neighbours
\r
131 if(ScanForNeighbourDigits(i, fRecPointDataPtr) != 0)
\r
136 //fUsedSize += sizeof(AliHLTCaloRecPointDataStruct) + (fDigitsInCluster-1)*sizeof(AliHLTCaloDigitDataStruct);
\r
138 fRecPointDataPtr->fMultiplicity = fDigitsInCluster;
\r
139 printf("Rec point energy: %f\n", fRecPointDataPtr->fAmp);
\r
140 printf("Multiplicity: %d\n", fDigitsInCluster);
\r
141 fRecPointArray[fNRecPoints] = fRecPointDataPtr;
\r
143 fRecPointDataPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(fDigitIndexPtr);
\r
145 }//end of clusterization
\r
146 fNRecPoints = nRecPoints;
\r
151 AliHLTCaloClusterizer::ScanForNeighbourDigits(Int_t index, AliHLTCaloRecPointDataStruct* recPoint)
\r
153 //see header file for documentation
\r
154 Int_t max = TMath::Min(fNDigits, (Int_t)fMaxDigitIndexDiff+index);
\r
155 Int_t min = TMath::Max(0, (Int_t)(index - (Int_t)fMaxDigitIndexDiff));
\r
159 for(Int_t j = min; j < max; j++)
\r
161 if(fDigitsPointerArray[j]->fEnergy > fEmcMinEnergyThreshold)
\r
165 if(AreNeighbours(fDigitsPointerArray[index],
\r
166 fDigitsPointerArray[j]))
\r
168 // if((fAvailableSize - fUsedSize) < sizeof(Int_t))
\r
170 // UChar_t *tmp = new UChar_t[fAvailableSize*2];
\r
171 // memcpy(tmp, fRecPointDataPtr, fAvailableSize);
\r
172 // for(Int_t n = 0; n < fNRecPoints; n++)
\r
174 // fRecPointArray[n] = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(reinterpret_cast<UChar_t*>(fRecPointArray[n]) - reinterpret_cast<UChar_t*>(fFirstRecPointPtr) + reinterpret_cast<UChar_t*>(tmp));
\r
176 // fRecPointDataPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(tmp);
\r
177 // fFirstRecPointPtr = fRecPointDataPtr;
\r
181 // Assigning index to digit
\r
182 printf("Digit index pointer: %x\n", fDigitIndexPtr);
\r
183 *fDigitIndexPtr = j;
\r
184 fUsedSize += sizeof(Int_t);
\r
186 printf("Clusterizier: adding digit: index pointer: %x, index: %d\n", fDigitIndexPtr, *fDigitIndexPtr);
\r
187 // Incrementing digit pointer to be ready for new entry
\r
190 recPoint->fAmp += fDigitsPointerArray[j]->fEnergy;
\r
191 fDigitsPointerArray[j]->fEnergy = 0;
\r
192 fDigitsInCluster++;
\r
193 ScanForNeighbourDigits(j, recPoint);
\r
202 AliHLTCaloClusterizer::AreNeighbours(AliHLTCaloDigitDataStruct* digit1,
\r
203 AliHLTCaloDigitDataStruct* digit2)
\r
205 //see header file for documentation
\r
206 if ( (digit1->fModule == digit2->fModule) /*&& (coord1[1]==coord2[1])*/ ) // inside the same PHOS module
\r
208 Int_t rowdiff = TMath::Abs( digit1->fZ - digit2->fZ );
\r
209 Int_t coldiff = TMath::Abs( digit1->fX - digit2->fX );
\r
210 if (( coldiff <= 1 && rowdiff == 0 ) || ( coldiff == 0 && rowdiff <= 1 ))
\r
212 // cout << "Are neighbours: digit (E = " << digit1->fEnergy << ") with x = " << digit1->fX << " and z = " << digit1->fZ <<
\r
213 // " is neighbour with digit (E = " << digit2->fEnergy << ") with x = " << digit2->fX << " and z = " << digit2->fZ << endl;
\r
215 if(TMath::Abs(digit1->fTime - digit2->fTime ) < fEmcTimeGate)
\r
221 /* Float_t rowdiff = TMath::Abs( digit1->fZ - digit2->fZ );
\r
222 Float_t coldiff = TMath::Abs( digit1->fX - digit2->fX );
\r
223 if (( coldiff <= 2.4 && rowdiff < 0.4 ) || ( coldiff < 0.4 && rowdiff <= 2.4 ))
\r
225 // cout << "Are neighbours: digit (E = " << digit1->fEnergy << ") with x = " << digit1->fX << " and z = " << digit1->fZ <<
\r
226 // " is neighbour with digit (E = " << digit2->fEnergy << ") with x = " << digit2->fX << " and z = " << digit2->fZ << endl;
\r
228 if(TMath::Abs(digit1->fTime - digit2->fTime ) < fEmcTimeGate)
\r
236 // cout << "Not neighbours: digit (E = " << digit1->fEnergy << ") with x = " << digit1->fX << " and z = " << digit1->fZ <<
\r
237 // " is not neighbour with digit (E = " << digit2->fEnergy << ") with x = " << digit2->fX << " and z = " << digit2->fZ << endl;
\r
245 Int_t AliHLTCaloClusterizer::CheckArray()
\r
247 printf("CheckArray: fArraySize: %d, fNRecPoints: %d\n", fArraySize, fNRecPoints);
\r
248 if(fArraySize == fNRecPoints)
\r
250 printf("Expanding array...");
\r
252 AliHLTCaloRecPointDataStruct **tmp = new AliHLTCaloRecPointDataStruct*[fArraySize];
\r
253 memcpy(tmp, fRecPointArray, fArraySize/2 * sizeof(AliHLTCaloRecPointDataStruct*));
\r
254 delete fRecPointArray;
\r
255 fRecPointArray = tmp;
\r
260 Int_t AliHLTCaloClusterizer::CheckBuffer()
\r
262 // See header file for class documentation
\r
263 printf("CheckBuffer: Used size %d, fAvailableSize: %d\n", fUsedSize, fAvailableSize);
\r
264 if((fAvailableSize - fUsedSize) < sizeof(AliHLTCaloRecPointDataStruct) )
\r
266 printf("Expanding buffer...\n");
\r
267 Int_t recPointOffset = reinterpret_cast<UChar_t*>(fRecPointDataPtr) - reinterpret_cast<UChar_t*>(fFirstRecPointPtr);
\r
268 fAvailableSize *= 2;
\r
269 UChar_t *tmp = new UChar_t[fAvailableSize];
\r
270 memcpy(tmp, fRecPointDataPtr, fAvailableSize/2);
\r
271 for(Int_t n = 0; n < fNRecPoints; n++)
\r
273 fRecPointArray[n] = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(reinterpret_cast<UChar_t*>(fRecPointArray[n]) - reinterpret_cast<UChar_t*>(fFirstRecPointPtr) + reinterpret_cast<UChar_t*>(tmp));
\r
275 delete fRecPointDataPtr;
\r
276 fFirstRecPointPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(tmp);
\r
277 fRecPointDataPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(tmp + recPointOffset);
\r
283 Int_t AliHLTCaloClusterizer::CheckDigits(AliHLTCaloRecPointDataStruct** recArray, AliHLTCaloDigitDataStruct** digitArray, Int_t nRP)
\r
285 AliHLTCaloRecPointDataStruct **recpoints = recArray;
\r
286 AliHLTCaloDigitDataStruct **digits = digitArray;
\r
287 Int_t nRecPoints = nRP;
\r
291 recpoints = fRecPointArray;
\r
293 if(digitArray == 0)
\r
295 digits = fDigitsPointerArray;
\r
299 nRecPoints = fNRecPoints;
\r
301 printf("CL: CheckDigits: Number of rec points: %d\n", nRecPoints);
\r
302 for(Int_t i = 0; i < nRecPoints; i++)
\r
305 AliHLTCaloRecPointDataStruct *recPoint = recpoints[i];
\r
307 //AliHLTCaloRecPointDataStruct *recPoint = fRecPointArray[0];
\r
308 Int_t multiplicity = recPoint->fMultiplicity;
\r
309 Int_t *digitIndexPtr = &(recPoint->fDigits);
\r
310 printf("CL: Rec point with energy: %f, multiplicity: %d\n", recPoint->fAmp, recPoint->fMultiplicity);
\r
311 for(Int_t j = 0; j < multiplicity; j++)
\r
313 //AliHLTCaloRecPointDataStruct *recPoint = fRecPointArray[j];
\r
314 AliHLTCaloDigitDataStruct *digit = digits[*digitIndexPtr];
\r
315 printf("CL: Digit ID: %d, energy: %f, index: %d, indexpointer: %x\n", digit->fID, digit->fEnergy, *digitIndexPtr, digitIndexPtr);
\r
317 //recPoint = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(digitIndexPtr);
\r
329 Int_t AliHLTCaloClusterizer::CheckDigits(AliHLTCaloRecPointDataStruct** recArray, AliHLTCaloDigitDataStruct* digitArray, Int_t nRP)
\r
331 AliHLTCaloRecPointDataStruct **recpoints = recArray;
\r
332 AliHLTCaloDigitDataStruct *digits = digitArray;
\r
333 Int_t nRecPoints = nRP;
\r
337 recpoints = fRecPointArray;
\r
341 nRecPoints = fNRecPoints;
\r
343 printf("CL: CheckDigits: Number of rec points: %d\n", nRecPoints);
\r
344 for(Int_t i = 0; i < nRecPoints; i++)
\r
347 AliHLTCaloRecPointDataStruct *recPoint = recpoints[i];
\r
349 //AliHLTCaloRecPointDataStruct *recPoint = fRecPointArray[0];
\r
350 Int_t multiplicity = recPoint->fMultiplicity;
\r
351 Int_t *digitIndexPtr = &(recPoint->fDigits);
\r
352 printf("CL: Rec point with energy: %f, multiplicity: %d\n", recPoint->fAmp, recPoint->fMultiplicity);
\r
353 for(Int_t j = 0; j < multiplicity; j++)
\r
355 //AliHLTCaloRecPointDataStruct *recPoint = fRecPointArray[j];
\r
356 AliHLTCaloDigitDataStruct digit = digits[*digitIndexPtr];
\r
357 printf("CL: digits: %x, recpoints: %x, digitIndexPtr: %x\n", digits, recpoints, digitIndexPtr);
\r
358 printf("CL: Digit ID: %d, energy: %f, index: %d, indexpointer: %x\n", digit.fID, digit.fEnergy, *digitIndexPtr, digitIndexPtr);
\r
360 //recPoint = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(digitIndexPtr);
\r