ROOT logo
#ifndef ALIKMEANSCLUSTERING_H
#define ALIKMEANSCLUSTERING_H
 
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

// Implemenatation of the K-Means Clustering Algorithm
// http://en.wikipedia.org/wiki/K-means_clustering
// This particular implementation is the so called Soft K-means algorithm.
// It has been modified to work on the cylindrical topology in eta-phi space.
//
// Author: Andreas Morsch (CERN)
// andreas.morsch@cern.ch

#include <TObject.h>
 
class AliKMeansClustering : public TObject
{
 public:
  AliKMeansClustering()          {}
  virtual ~AliKMeansClustering() {}
  
  static Int_t SoftKMeans (Int_t k, Int_t n, const Double_t* x, const Double_t* y, Double_t* mx, Double_t* my , Double_t* rk );
  static Int_t SoftKMeans2(Int_t k, Int_t n, Double_t* x, Double_t* y, Double_t* mx, Double_t* my , Double_t* sigma2, 
			  Double_t* rk );
  static Int_t SoftKMeans3(Int_t k, Int_t n, Double_t* x, Double_t* y, Double_t* mx, Double_t* my , 
			   Double_t* sigmax2, Double_t* sigmay2, Double_t* rk );
  static void  OptimalInit(Int_t k, Int_t n, const Double_t* x, const Double_t* y, Double_t* mx, Double_t* my);
  static void  SetBeta(Double_t beta) {fBeta = beta;}
  static Double_t d(Double_t mx, Double_t my, Double_t x, Double_t y);
protected:
  static Double_t fBeta; // beta parameter
  
  ClassDef(AliKMeansClustering, 1)
};

class AliKMeansResult : public TObject
{
 public:
  AliKMeansResult(Int_t k);
  AliKMeansResult(const AliKMeansResult &res);
  AliKMeansResult& operator=(const AliKMeansResult& trclass);

  virtual ~AliKMeansResult();
  Int_t      GetK()      const  {return fK;}
  Double_t*  GetMx()     const  {return fMx;}
  Double_t*  GetMy()     const  {return fMy;}
  Double_t*  GetSigma2() const  {return fSigma2;}
  Double_t*  GetRk()     const  {return fRk;}
  Int_t*     GetInd()    const  {return fInd;}
  Double_t*  GetTarget() const  {return fTarget;}
  void       CopyResults(const AliKMeansResult* res);
  void       Sort();
  void       Sort(Int_t n, const Double_t* x, const Double_t* y);  
protected:
  Int_t        fK;        //! Number of clusters
  Double_t*    fMx;       //! Position x
  Double_t*    fMy;       //! Position y
  Double_t*    fSigma2;   //! Sigma2
  Double_t*    fRk;       //! Responsibility
  Double_t*    fTarget;   //! Target for sorting
  Int_t*       fInd;      //! Index for sorting
 
  ClassDef(AliKMeansResult, 1)
};

#endif
 AliKMeansClustering.h:1
 AliKMeansClustering.h:2
 AliKMeansClustering.h:3
 AliKMeansClustering.h:4
 AliKMeansClustering.h:5
 AliKMeansClustering.h:6
 AliKMeansClustering.h:7
 AliKMeansClustering.h:8
 AliKMeansClustering.h:9
 AliKMeansClustering.h:10
 AliKMeansClustering.h:11
 AliKMeansClustering.h:12
 AliKMeansClustering.h:13
 AliKMeansClustering.h:14
 AliKMeansClustering.h:15
 AliKMeansClustering.h:16
 AliKMeansClustering.h:17
 AliKMeansClustering.h:18
 AliKMeansClustering.h:19
 AliKMeansClustering.h:20
 AliKMeansClustering.h:21
 AliKMeansClustering.h:22
 AliKMeansClustering.h:23
 AliKMeansClustering.h:24
 AliKMeansClustering.h:25
 AliKMeansClustering.h:26
 AliKMeansClustering.h:27
 AliKMeansClustering.h:28
 AliKMeansClustering.h:29
 AliKMeansClustering.h:30
 AliKMeansClustering.h:31
 AliKMeansClustering.h:32
 AliKMeansClustering.h:33
 AliKMeansClustering.h:34
 AliKMeansClustering.h:35
 AliKMeansClustering.h:36
 AliKMeansClustering.h:37
 AliKMeansClustering.h:38
 AliKMeansClustering.h:39
 AliKMeansClustering.h:40
 AliKMeansClustering.h:41
 AliKMeansClustering.h:42
 AliKMeansClustering.h:43
 AliKMeansClustering.h:44
 AliKMeansClustering.h:45
 AliKMeansClustering.h:46
 AliKMeansClustering.h:47
 AliKMeansClustering.h:48
 AliKMeansClustering.h:49
 AliKMeansClustering.h:50
 AliKMeansClustering.h:51
 AliKMeansClustering.h:52
 AliKMeansClustering.h:53
 AliKMeansClustering.h:54
 AliKMeansClustering.h:55
 AliKMeansClustering.h:56
 AliKMeansClustering.h:57
 AliKMeansClustering.h:58
 AliKMeansClustering.h:59
 AliKMeansClustering.h:60
 AliKMeansClustering.h:61
 AliKMeansClustering.h:62
 AliKMeansClustering.h:63
 AliKMeansClustering.h:64
 AliKMeansClustering.h:65
 AliKMeansClustering.h:66
 AliKMeansClustering.h:67