\r
AliHLTCaloClusterizer::AliHLTCaloClusterizer(TString det):\r
AliHLTCaloConstantsHandler(det),\r
+ fRecPointArray(0),\r
fRecPointDataPtr(0),\r
+ fFirstRecPointPtr(0),\r
+ fArraySize(0),\r
+ fAvailableSize(0),\r
+ fUsedSize(0),\r
+ fNRecPoints(0),\r
fDigitIndexPtr(0),\r
fEmcClusteringThreshold(0),\r
fEmcMinEnergyThreshold(0),\r
fNDigits(0)\r
{\r
//See header file for documentation\r
- fEmcClusteringThreshold = 0.2;\r
- fEmcMinEnergyThreshold = 0.03;\r
+ //fEmcClusteringThreshold = 0.2;\r
+ //fEmcMinEnergyThreshold = 0.03;\r
+\r
+ fEmcClusteringThreshold = 0.1;\r
+ fEmcMinEnergyThreshold = 0.01;\r
fEmcTimeGate = 1.e-6 ;\r
\r
fMaxDigitIndexDiff = 2*fCaloConstants->GetNZROWSMOD();\r
+ \r
+ \r
+ fArraySize = 10;\r
+ fRecPointArray = new AliHLTCaloRecPointDataStruct*[fArraySize];\r
+ \r
+ fAvailableSize = sizeof(AliHLTCaloRecPointDataStruct) * 20;\r
+ fFirstRecPointPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(new UChar_t[fAvailableSize]);\r
+ fRecPointDataPtr = fFirstRecPointPtr; \r
\r
}//end\r
\r
-\r
-//BALLE how do you set the right detector?\r
-// AliHLTCaloClusterizer::AliHLTCaloClusterizer(const AliHLTCaloClusterizer &) :\r
-// AliHLTCaloConstantsHandler("BALLE"),\r
-// fRecPointDataPtr(0),\r
-// fDigitDataPtr(0),\r
-// fEmcClusteringThreshold(0),\r
-// fEmcMinEnergyThreshold(0),\r
-// fEmcTimeGate(0),\r
-// fDigitsInCluster(0),\r
-// fDigitContainerPtr(0),\r
-// fMaxDigitIndexDiff(0)\r
-// {\r
-// // dummy copy constructor\r
-// }//end\r
-\r
-\r
AliHLTCaloClusterizer::~AliHLTCaloClusterizer() \r
{\r
//See header file for documentation\r
}\r
\r
Int_t \r
-AliHLTCaloClusterizer::ClusterizeEvent(Int_t nDigits, UInt_t availableSize, UInt_t& totSize)\r
+AliHLTCaloClusterizer::ClusterizeEvent(Int_t nDigits)\r
{\r
//see header file for documentation\r
Int_t nRecPoints = 0;\r
-\r
+ fNRecPoints = 0;\r
+ fUsedSize = 0;\r
fNDigits = nDigits;\r
-\r
- UInt_t maxRecPointSize = sizeof(AliHLTCaloRecPointDataStruct) + (sizeof(AliHLTCaloDigitDataStruct) << 7); //Reasonable estimate... \r
+ fRecPointDataPtr = fFirstRecPointPtr;\r
\r
//Clusterization starts\r
for(Int_t i = 0; i < nDigits; i++)\r
{ \r
fDigitsInCluster = 0;\r
- // printf("ENERGY: %f\n", fDigitsPointerArray[i]->fEnergy);\r
+\r
if(fDigitsPointerArray[i]->fEnergy < fEmcClusteringThreshold)\r
{\r
continue;\r
}\r
- if(availableSize < (totSize + maxRecPointSize)) \r
- {\r
- return -1; //Might get out of buffer, exiting\r
- }\r
- // printf("cluster candidate!\n");\r
+ CheckArray();\r
+ CheckBuffer();\r
+\r
// First digit is placed at the fDigits member variable in the recpoint\r
fDigitIndexPtr = &(fRecPointDataPtr->fDigits);\r
-\r
+ //fUsedSize += sizeof(AliHLTCaloRecPointDataStruct);\r
+ \r
fRecPointDataPtr->fAmp = 0;\r
fRecPointDataPtr->fModule = fDigitsPointerArray[i]->fModule;\r
\r
// Assigning the digit to this rec point\r
fRecPointDataPtr->fDigits = i;\r
-\r
+ fUsedSize += sizeof(AliHLTCaloRecPointDataStruct);\r
+ \r
// Incrementing the pointer to be ready for new entry\r
fDigitIndexPtr++;\r
\r
nRecPoints++;\r
\r
// Scanning for the neighbours\r
- ScanForNeighbourDigits(i, fRecPointDataPtr);\r
+ if(ScanForNeighbourDigits(i, fRecPointDataPtr) != 0)\r
+ {\r
+ return -1;\r
+ }\r
\r
- totSize += sizeof(AliHLTCaloRecPointDataStruct) + (fDigitsInCluster-1)*sizeof(AliHLTCaloDigitDataStruct); \r
+ //fUsedSize += sizeof(AliHLTCaloRecPointDataStruct) + (fDigitsInCluster-1)*sizeof(AliHLTCaloDigitDataStruct); \r
+ \r
fRecPointDataPtr->fMultiplicity = fDigitsInCluster; \r
- // printf("Rec point energy: %f\n", fRecPointDataPtr->fAmp);\r
+ fRecPointArray[fNRecPoints] = fRecPointDataPtr; \r
+ \r
fRecPointDataPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(fDigitIndexPtr);\r
\r
+ fNRecPoints++;\r
+ \r
}//end of clusterization\r
\r
- return nRecPoints;\r
+ return nRecPoints;\r
}\r
\r
-void\r
+Int_t\r
AliHLTCaloClusterizer::ScanForNeighbourDigits(Int_t index, AliHLTCaloRecPointDataStruct* recPoint)\r
{\r
//see header file for documentation\r
if(AreNeighbours(fDigitsPointerArray[index],\r
fDigitsPointerArray[j]))\r
{\r
- // Assigning value to digit ptr\r
+// if((fAvailableSize - fUsedSize) < sizeof(Int_t))\r
+// {\r
+// UChar_t *tmp = new UChar_t[fAvailableSize*2];\r
+// memcpy(tmp, fRecPointDataPtr, fAvailableSize);\r
+// for(Int_t n = 0; n < fNRecPoints; n++)\r
+// {\r
+// fRecPointArray[n] = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(reinterpret_cast<UChar_t*>(fRecPointArray[n]) - reinterpret_cast<UChar_t*>(fFirstRecPointPtr) + reinterpret_cast<UChar_t*>(tmp));\r
+// }\r
+// fRecPointDataPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(tmp);\r
+// fFirstRecPointPtr = fRecPointDataPtr;\r
+// fUsedSize = 0;\r
+// } \r
+ CheckBuffer();\r
+ \r
+ // Assigning index to digit\r
*fDigitIndexPtr = j;\r
+ fUsedSize += sizeof(Int_t);\r
+ \r
// Incrementing digit pointer to be ready for new entry\r
fDigitIndexPtr++;\r
-\r
- recPoint->fAmp += fDigitsPointerArray[j]->fEnergy;\r
+ \r
+ fRecPointDataPtr->fAmp += fDigitsPointerArray[j]->fEnergy;\r
fDigitsPointerArray[j]->fEnergy = 0; \r
fDigitsInCluster++;\r
ScanForNeighbourDigits(j, recPoint);\r
}\r
}\r
}\r
- return;\r
+ return 0;\r
}\r
\r
Int_t \r
//see header file for documentation\r
if ( (digit1->fModule == digit2->fModule) /*&& (coord1[1]==coord2[1])*/ ) // inside the same PHOS module\r
{ \r
-// Int_t rowdiff = TMath::Abs( digit1->fZ - digit2->fZ ); \r
-// Int_t coldiff = TMath::Abs( digit1->fX - digit2->fX ); \r
-// if (( coldiff <= 1 && rowdiff == 0 ) || ( coldiff == 0 && rowdiff <= 1 ))\r
-// {\r
-// cout << "Are neighbours: digit (E = " << digit1->fEnergy << ") with x = " << digit1->fX << " and z = " << digit1->fZ << \r
-// " is neighbour with digit (E = " << digit2->fEnergy << ") with x = " << digit2->fX << " and z = " << digit2->fZ << endl;\r
-\r
-// if(TMath::Abs(digit1->fTime - digit2->fTime ) < fEmcTimeGate)\r
-// {\r
-// return 1; \r
-// }\r
-// }\r
-\r
- Float_t rowdiff = TMath::Abs( digit1->fZ - digit2->fZ ); \r
+ Int_t rowdiff = TMath::Abs( digit1->fZ - digit2->fZ ); \r
+ Int_t coldiff = TMath::Abs( digit1->fX - digit2->fX ); \r
+ if (( coldiff <= 1 && rowdiff == 0 ) || ( coldiff == 0 && rowdiff <= 1 ))\r
+ {\r
+// cout << "Are neighbours: digit (E = " << digit1->fEnergy << ") with x = " << digit1->fX << " and z = " << digit1->fZ << \r
+// " is neighbour with digit (E = " << digit2->fEnergy << ") with x = " << digit2->fX << " and z = " << digit2->fZ << endl;\r
+\r
+ if(TMath::Abs(digit1->fTime - digit2->fTime ) < fEmcTimeGate)\r
+ {\r
+ return 1; \r
+ }\r
+ }\r
+\r
+ /* Float_t rowdiff = TMath::Abs( digit1->fZ - digit2->fZ ); \r
Float_t coldiff = TMath::Abs( digit1->fX - digit2->fX ); \r
if (( coldiff <= 2.4 && rowdiff < 0.4 ) || ( coldiff < 0.4 && rowdiff <= 2.4 ))\r
{\r
return 1; \r
}\r
}\r
+ */\r
else\r
{\r
- // cout << "Not neighbours: digit (E = " << digit1->fEnergy << ") with x = " << digit1->fX << " and z = " << digit1->fZ << \r
- // " is not neighbour with digit (E = " << digit2->fEnergy << ") with x = " << digit2->fX << " and z = " << digit2->fZ << endl;\r
+// cout << "Not neighbours: digit (E = " << digit1->fEnergy << ") with x = " << digit1->fX << " and z = " << digit1->fZ << \r
+// " is not neighbour with digit (E = " << digit2->fEnergy << ") with x = " << digit2->fX << " and z = " << digit2->fZ << endl;\r
}\r
}\r
return 0;\r
}\r
+\r
+\r
+\r
+Int_t AliHLTCaloClusterizer::CheckArray()\r
+{\r
+ if(fArraySize == fNRecPoints)\r
+ {\r
+ fArraySize *= 2;\r
+ AliHLTCaloRecPointDataStruct **tmp = new AliHLTCaloRecPointDataStruct*[fArraySize];\r
+ memcpy(tmp, fRecPointArray, fArraySize/2 * sizeof(AliHLTCaloRecPointDataStruct*));\r
+ delete [] fRecPointArray;\r
+ fRecPointArray = tmp;\r
+ //fRecPointArray[fNRecPoints-1] = fRecPointDataPtr;\r
+ //Int_t recPointOffset = reinterpret_cast<UChar_t*>(fRecPointDataPtr) - reinterpret_cast<UChar_t*>(fFirstRecPointPtr);\r
+ //fRecPointDataPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(reinterpret_cast<UChar_t*>(tmp) + recPointOffset);\r
+ \r
+ }\r
+ return 0;\r
+}\r
+\r
+Int_t AliHLTCaloClusterizer::CheckBuffer()\r
+{\r
+ // See header file for class documentation \r
+ if((fAvailableSize - fUsedSize) < (Int_t)sizeof(AliHLTCaloRecPointDataStruct))\r
+ {\r
+ Int_t recPointOffset = reinterpret_cast<UChar_t*>(fRecPointDataPtr) - reinterpret_cast<UChar_t*>(fFirstRecPointPtr);\r
+ Int_t digitIndexOffset = reinterpret_cast<UChar_t*>(fDigitIndexPtr) - reinterpret_cast<UChar_t*>(fRecPointDataPtr);\r
+ UChar_t *tmp = new UChar_t[fAvailableSize*2];\r
+\r
+ memcpy(tmp, fFirstRecPointPtr, fUsedSize);\r
+ fAvailableSize *= 2;\r
+ for(Int_t n = 0; n < fNRecPoints; n++)\r
+ {\r
+ fRecPointArray[n] = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(reinterpret_cast<UChar_t*>(fRecPointArray[n]) - reinterpret_cast<UChar_t*>(fFirstRecPointPtr) + reinterpret_cast<UChar_t*>(tmp));\r
+ }\r
+ delete [] fFirstRecPointPtr;\r
+ fFirstRecPointPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(tmp);\r
+ fRecPointDataPtr = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(tmp + recPointOffset);\r
+ fDigitIndexPtr = reinterpret_cast<Int_t*>(reinterpret_cast<UChar_t*>(fRecPointDataPtr) + digitIndexOffset);\r
+ //fUsedSize = 0;\r
+ }\r
+ return 0;\r
+}\r
+\r
+Int_t AliHLTCaloClusterizer::CheckDigits(AliHLTCaloRecPointDataStruct** recArray, AliHLTCaloDigitDataStruct** digitArray, Int_t nRP)\r
+{\r
+ AliHLTCaloRecPointDataStruct **recpoints = recArray;\r
+ AliHLTCaloDigitDataStruct **digits = digitArray;\r
+ Int_t nRecPoints = nRP;\r
+ \r
+ if(recArray == 0)\r
+ {\r
+ recpoints = fRecPointArray;\r
+ }\r
+ if(digitArray == 0)\r
+ {\r
+ digits = fDigitsPointerArray;\r
+ }\r
+ if(nRP == 0)\r
+ {\r
+ nRecPoints = fNRecPoints;\r
+ }\r
+ for(Int_t i = 0; i < nRecPoints; i++)\r
+ {\r
+ \r
+ AliHLTCaloRecPointDataStruct *recPoint = recpoints[i];\r
+\r
+ //AliHLTCaloRecPointDataStruct *recPoint = fRecPointArray[0];\r
+ Int_t multiplicity = recPoint->fMultiplicity;\r
+ Int_t *digitIndexPtr = &(recPoint->fDigits);\r
+ for(Int_t j = 0; j < multiplicity; j++)\r
+ {\r
+ //AliHLTCaloRecPointDataStruct *recPoint = fRecPointArray[j];\r
+// AliHLTCaloDigitDataStruct *digit = digits[*digitIndexPtr];\r
+ digitIndexPtr++;\r
+ //recPoint = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(digitIndexPtr);\r
+ }\r
+ }\r
+ \r
+ return 0;\r
+}\r
+\r
+Int_t AliHLTCaloClusterizer::CheckDigits(AliHLTCaloRecPointDataStruct** recArray, AliHLTCaloDigitDataStruct* digitArray, Int_t nRP)\r
+{\r
+ AliHLTCaloRecPointDataStruct **recpoints = recArray;\r
+ AliHLTCaloDigitDataStruct *digits = digitArray;\r
+ Int_t nRecPoints = nRP;\r
+ \r
+ if(recArray == 0)\r
+ {\r
+ recpoints = fRecPointArray;\r
+ }\r
+ if(nRP == 0)\r
+ {\r
+ nRecPoints = fNRecPoints;\r
+ }\r
+ for(Int_t i = 0; i < nRecPoints; i++)\r
+ {\r
+ \r
+ AliHLTCaloRecPointDataStruct *recPoint = recpoints[i];\r
+\r
+ //AliHLTCaloRecPointDataStruct *recPoint = fRecPointArray[0];\r
+ Int_t multiplicity = recPoint->fMultiplicity;\r
+ Int_t *digitIndexPtr = &(recPoint->fDigits);\r
+ for(Int_t j = 0; j < multiplicity; j++)\r
+ {\r
+ //AliHLTCaloRecPointDataStruct *recPoint = fRecPointArray[j];\r
+ AliHLTCaloDigitDataStruct digit = digits[*digitIndexPtr];\r
+ digitIndexPtr++;\r
+ //recPoint = reinterpret_cast<AliHLTCaloRecPointDataStruct*>(digitIndexPtr);\r
+ }\r
+ }\r
+ return 0;\r
+ \r
+}\r