]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - JETAN/AliKMeansClustering.cxx
First version of a class to compute the number of collisions corresponding to a data...
[u/mrichter/AliRoot.git] / JETAN / AliKMeansClustering.cxx
index 9947da755d9a074b27ab9abe99e7f4e1d7e66b3a..8941025c18328bb0511696777ac1bca9770f1532 100755 (executable)
@@ -163,7 +163,6 @@ Int_t AliKMeansClustering::SoftKMeans2(Int_t k, Int_t n, Double_t* x, Double_t*
     } // data point j
     // (3) Iterations
     Int_t nit = 0;
-    Bool_t rmovalStep = kFALSE;
 
     while(1) {
        nit++;
@@ -222,7 +221,7 @@ Int_t AliKMeansClustering::SoftKMeans2(Int_t k, Int_t n, Double_t* x, Double_t*
       // Sigma
       for (i = 0; i < k; i++) {
        sigma2[i] = 0.;
-       for (j = 1; j < n; j++) {
+       for (j = 0; j < n; j++) {
          sigma2[i] += r[j][i] * d(mx[i], my[i], x[j], y[j]);
        } // Data
        sigma2[i] /= rk[i];
@@ -291,7 +290,6 @@ Int_t AliKMeansClustering::SoftKMeans3(Int_t k, Int_t n, Double_t* x, Double_t*
     } // data point j
     // (3) Iterations
     Int_t nit = 0;
-    Bool_t rmovalStep = kFALSE;
 
     while(1) {
        nit++;
@@ -356,7 +354,7 @@ Int_t AliKMeansClustering::SoftKMeans3(Int_t k, Int_t n, Double_t* x, Double_t*
        sigmax2[i] = 0.;
        sigmay2[i] = 0.;
 
-       for (j = 1; j < n; j++) {
+       for (j = 0; j < n; j++) {
          Double_t dx = TMath::Abs(mx[i]-x[j]);
          if (dx > TMath::Pi()) dx = 2. * TMath::Pi() - dx;
          Double_t dy = TMath::Abs(my[i]-y[j]);
@@ -457,6 +455,46 @@ AliKMeansResult::AliKMeansResult(Int_t k):
 // Constructor
 }
 
+AliKMeansResult::AliKMeansResult(const AliKMeansResult &res):
+  TObject(res),
+  fK(res.GetK()),
+  fMx(0),
+  fMy(0),
+  fSigma2(0),
+  fRk(0),
+  fTarget(0),
+  fInd(0)
+{
+  // Copy constructor
+  for (Int_t i = 0; i <fK; i++) {
+    fMx[i]     = (res.GetMx())    [i];
+    fMy[i]     = (res.GetMy())    [i];
+    fSigma2[i] = (res.GetSigma2())[i];
+    fRk[i]     = (res.GetRk())    [i];
+    fTarget[i] = (res.GetTarget())[i];
+    fInd[i]    = (res.GetInd())   [i];
+  }
+}
+
+AliKMeansResult& AliKMeansResult::operator=(const AliKMeansResult& res)
+{
+  //
+  // Assignment operator
+  if (this != &res) {
+    fK = res.GetK();
+    for (Int_t i = 0; i <fK; i++) {
+      fMx[i]     = (res.GetMx())    [i];
+      fMy[i]     = (res.GetMy())    [i];
+      fSigma2[i] = (res.GetSigma2())[i];
+      fRk[i]     = (res.GetRk())    [i];
+      fTarget[i] = (res.GetTarget())[i];
+      fInd[i]    = (res.GetInd())   [i];
+    }
+  }
+  return *this;
+}
+
+
 AliKMeansResult::~AliKMeansResult()
 {
 // Destructor
@@ -470,14 +508,16 @@ AliKMeansResult::~AliKMeansResult()
 
 void AliKMeansResult::Sort()
 {
-// Sort clusters
-    for (Int_t i = 0; i < fK; i++) {
-       if (fRk[i] > 1.) fRk[i] /= fSigma2[i];
-       else fRk[i] = 0.;
+  // Build target array and sort
+  // Sort clusters
+  for (Int_t i = 0; i < fK; i++) {
+    if (fRk[i] > 2.9) {
+      fTarget[i] = fRk[i] / fSigma2[i];
     }
+    else fTarget[i] = 0.;
+  }
     
-    TMath::Sort(fK, fRk, fInd);
-    
+  TMath::Sort(fK, fTarget, fInd);
 }
 
 void AliKMeansResult::Sort(Int_t n, Double_t* x, Double_t* y)
@@ -488,10 +528,11 @@ void AliKMeansResult::Sort(Int_t n, Double_t* x, Double_t* y)
       Int_t nc = 0;
       for (Int_t j = 0; j < n; j++)
        {
-         if (2. * AliKMeansClustering::d(fMx[i], fMy[i], x[j], y[j])  <  fSigma2[i]) nc++;
+         if (2. * AliKMeansClustering::d(fMx[i], fMy[i], x[j], y[j])  <  2.28 * fSigma2[i]) nc++;
        }
-      if (nc > 1) {
-       fTarget[i] = Double_t(nc) / fSigma2[i];
+
+      if (nc > 2) {
+       fTarget[i] = Double_t(nc) / (2.28 * fSigma2[i]);
       } else {
        fTarget[i] = 0.;
       }
@@ -499,3 +540,16 @@ void AliKMeansResult::Sort(Int_t n, Double_t* x, Double_t* y)
 
   TMath::Sort(fK, fTarget, fInd);
 }
+
+void AliKMeansResult::CopyResults(AliKMeansResult* res)
+{
+  fK = res->GetK();
+  for (Int_t i = 0; i <fK; i++) {
+    fMx[i]     = (res->GetMx())    [i];
+    fMy[i]     = (res->GetMy())    [i];
+    fSigma2[i] = (res->GetSigma2())[i];
+    fRk[i]     = (res->GetRk())    [i];
+    fTarget[i] = (res->GetTarget())[i];
+    fInd[i]    = (res->GetInd())   [i];
+  }
+}