]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/CALO/AliHLTCaloClusterizer.cxx
Bastian's Task for Jet Fragmentation, to be merged with other FF tasks
[u/mrichter/AliRoot.git] / HLT / CALO / AliHLTCaloClusterizer.cxx
index a2bc5b269b35952a6a579efe28d6a68fbec46245..c07f268c7e7e0d34ca565d2351b816b49949f525 100644 (file)
@@ -40,7 +40,13 @@ ClassImp(AliHLTCaloClusterizer);
 \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
@@ -52,31 +58,25 @@ AliHLTCaloClusterizer::AliHLTCaloClusterizer(TString det):
   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
@@ -90,38 +90,38 @@ AliHLTCaloClusterizer::SetRecPointDataPtr(AliHLTCaloRecPointDataStruct* recPoint
 }\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
@@ -131,19 +131,26 @@ AliHLTCaloClusterizer::ClusterizeEvent(Int_t nDigits, UInt_t availableSize, UInt
       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
@@ -161,12 +168,28 @@ AliHLTCaloClusterizer::ScanForNeighbourDigits(Int_t index, AliHLTCaloRecPointDat
              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
@@ -174,7 +197,7 @@ AliHLTCaloClusterizer::ScanForNeighbourDigits(Int_t index, AliHLTCaloRecPointDat
            }\r
        }\r
     }\r
-  return;\r
+  return 0;\r
 }\r
 \r
 Int_t \r
@@ -184,20 +207,20 @@ AliHLTCaloClusterizer::AreNeighbours(AliHLTCaloDigitDataStruct* digit1,
   //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
@@ -209,11 +232,127 @@ AliHLTCaloClusterizer::AreNeighbours(AliHLTCaloDigitDataStruct* digit1,
              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