- added different sorting algorithms for the digits
[u/mrichter/AliRoot.git] / HLT / CALO / AliHLTCaloClusterizer.h
index 5c7587a36bebc3386058ba4571b61eb94a7b802e..f2d2bbbcd6ab4175c1276237959ff60a304afaaa 100644 (file)
@@ -46,6 +46,7 @@
 #include "AliHLTCaloConstantsHandler.h"\r
 \r
 //#include "AliPHOSGeometry.h"\r
+#include "AliHLTLogging.h"\r
 \r
 class TClonesArray;\r
 class TString;\r
@@ -63,7 +64,7 @@ class TString;
  */\r
 \r
 \r
-class AliHLTCaloClusterizer : public AliHLTCaloConstantsHandler\r
+class AliHLTCaloClusterizer : public AliHLTCaloConstantsHandler, public AliHLTLogging\r
 {\r
   \r
 public:\r
@@ -73,30 +74,7 @@ public:
 \r
   /** Destructor */\r
   virtual ~AliHLTCaloClusterizer();\r
-\r
-//   /** Copy constructor */  \r
-//   AliHLTCaloClusterizer(const AliHLTCaloClusterizer &) : \r
-//     //    AliHLTCaloBase(),\r
-//     AliHLTCaloConstants(NULL),\r
-//     fRecPointDataPtr(0),\r
-//     fDigitDataPtr(0),\r
-//     fEmcClusteringThreshold(0),\r
-//     fEmcMinEnergyThreshold(0),\r
-//     fEmcTimeGate(0),\r
-//     fDigitsInCluster(0),\r
-//     fDigitContainerPtr(0),\r
-//     fMaxDigitIndexDiff(2*NZROWSMOD)\r
-//   {\r
-//     //Copy constructor not implemented\r
-//   }\r
-  \r
-  /** Assignment */\r
-  AliHLTCaloClusterizer & operator = (const AliHLTCaloClusterizer)\r
-  {\r
-    //Assignment\r
-    return *this; \r
-  }\r
-\r
+  \r
   /** Set digit container */\r
   void SetDigitContainer(AliHLTCaloDigitContainerDataStruct* digitContainerPtr)\r
   { fDigitContainerPtr = digitContainerPtr; }\r
@@ -121,7 +99,7 @@ public:
   void SetEmcTimeGate(Float_t gate) { fEmcTimeGate = gate; }\r
   \r
   /** Starts clusterization of the event */ \r
-  virtual Int_t ClusterizeEvent(Int_t nDigits, UInt_t availableSize, UInt_t& totSize);\r
+  virtual Int_t ClusterizeEvent(Int_t nDigits);\r
   \r
   /**\r
    * For a given digit this digit scans for neighbouring digits which \r
@@ -130,7 +108,7 @@ public:
    * @param digIndex index of the digit in the digit container\r
    * @param recPoint pointer to the current rec point\r
    */\r
-  virtual void ScanForNeighbourDigits(Int_t digIndex, AliHLTCaloRecPointDataStruct* recPoint);\r
+  virtual Int_t ScanForNeighbourDigits(Int_t digIndex, AliHLTCaloRecPointDataStruct* recPoint);\r
 \r
   /**\r
    * Checks if two digits are neighbours\r
@@ -139,12 +117,82 @@ public:
    */\r
   virtual Int_t AreNeighbours(AliHLTCaloDigitDataStruct* d1, AliHLTCaloDigitDataStruct* d2);\r
 \r
-\r
+  /**\r
+  * Get pointer to the rec points array\r
+  */\r
+  AliHLTCaloRecPointDataStruct** GetRecPoints() const { return fRecPointArray; }\r
+\r
+  /** \r
+  * Sort the digits by energy\r
+  */\r
+  void SetSortDigitsByEnergy();\r
+  \r
+  /** \r
+  * Sort the digits by position\r
+  */\r
+  void SetSortDigitsByPosition();\r
+  \r
+  /** \r
+  * Set the sorting function (as required by stdlib's qsort) if you don't want to use the provided ones \r
+  */\r
+  void SetSortingFunction(Int_t (*compare)(const void*, const void*)) { fCompareFunction = compare; }\r
+  \r
+  \r
+  \r
 protected:\r
 \r
-  /** Pointer to the rec point output */\r
-  AliHLTCaloRecPointDataStruct *fRecPointDataPtr;              //! transient\r
+   /** \r
+   * Check the rec point buffer size and resize the buffer if necessary\r
+   */\r
+  virtual Int_t CheckBuffer(); //COMMENT\r
+  \r
+   /** \r
+   * Check the rec point array size and resize the array if necessary\r
+   */\r
+  virtual Int_t CheckArray(); //COMMENT\r
+  \r
+  /** \r
+  * Sort the digits\r
+  */\r
+  void SortDigits();\r
+\r
+  /** \r
+  * Compare digits by position\r
+  */\r
+  static Int_t CompareDigitsByPosition(const void *dig0, const void *dig);\r
+  \r
+  /** \r
+  * Compare digits by energy\r
+  */\r
+  static Int_t CompareDigitsByEnergy(const void *dig0, const void *dig);\r
+  \r
+  /** \r
+  * Pointer to the compare function for the sorting of digits\r
+  */\r
+  //Int_t (AliHLTCaloClusterizer::*fCompareFunction)(const void*, const void*);\r
+  Int_t (*fCompareFunction)(const void*, const void*);\r
+  \r
+  /** Array of pointers to the rec point output */\r
+  AliHLTCaloRecPointDataStruct **fRecPointArray; //COMMENT\r
+\r
+   /** Pointer to the rec point output */\r
+  AliHLTCaloRecPointDataStruct *fRecPointDataPtr; //COMMENT\r
+\r
+  /** The first rec point in the list */\r
+  AliHLTCaloRecPointDataStruct *fFirstRecPointPtr; //COMMENT\r
 \r
+  /** Size of the rec point array */\r
+  Int_t fArraySize;\r
+  \r
+  /** Available size for the rec point output */\r
+  Int_t fAvailableSize;\r
+\r
+  /** The used size for the rec point output */\r
+  Int_t fUsedSize;\r
+  \r
+  /** Number of rec points created so far */\r
+  Int_t fNRecPoints;\r
+  \r
   /** Pointer to the digit index array in the rec point */\r
   Int_t* fDigitIndexPtr;                                       //! transient\r
 \r
@@ -171,19 +219,28 @@ protected:
 \r
   /** Number of digits in event */\r
   Int_t fNDigits;                                              //COMMENT\r
+  \r
+  /** Are we sorting digits by position? */\r
+  Bool_t fSortedByPosition; //COMMENT\r
 \r
-private:\r
+  /** Are we sorting digits by energy? */\r
+  Bool_t fSortedByEnergy; //COMMENT\r
 \r
-  AliHLTCaloClusterizer();\r
+   /** Are we sorting at all? */\r
+   Bool_t fSortDigits; //COMMENT\r
 \r
-  AliHLTCaloClusterizer (const AliHLTCaloClusterizer &);\r
-//   AliHLTCaloClusterizer & operator = (const AliHLTCaloClusterizer &)\r
-//   {\r
-//     return *this;\r
-//   }\r
+private:\r
 \r
-  ClassDef(AliHLTCaloClusterizer, 0);\r
+  /** Default constructor, prohibited */\r
+  AliHLTCaloClusterizer();                          // COMMENT\r
+  \r
+  /** Copy constructor, prohibited */\r
+  AliHLTCaloClusterizer (const AliHLTCaloClusterizer &); //COMMENT\r
+  \r
+  /** Assignment operator, prohibited */\r
+  AliHLTCaloClusterizer & operator = (const AliHLTCaloClusterizer &); //COMMENT\r
 \r
+  ClassDef(AliHLTCaloClusterizer, 0);\r
 \r
 };\r
 \r