Index: trunk/MagicSoft/Mars/mbase/BaseIncl.h
===================================================================
--- trunk/MagicSoft/Mars/mbase/BaseIncl.h	(revision 7386)
+++ trunk/MagicSoft/Mars/mbase/BaseIncl.h	(revision 7409)
@@ -1,14 +1,6 @@
 #ifndef __CINT__
 
+#include <TArrayD.h>
 #include <TVector3.h>
 
-/*
-#include <fstream.h>
-
-#include <TFile.h>
-#include <TTree.h>
-
-#include <TGListBox.h>
-*/
-
 #endif // __CINT__
Index: trunk/MagicSoft/Mars/mbase/MLogHtml.cc
===================================================================
--- trunk/MagicSoft/Mars/mbase/MLogHtml.cc	(revision 7386)
+++ trunk/MagicSoft/Mars/mbase/MLogHtml.cc	(revision 7409)
@@ -30,4 +30,7 @@
 //////////////////////////////////////////////////////////////////////////////
 #include "MLogHtml.h"
+
+#include <string.h>  // necessary for Fedora core 2 with kernel 2.6.9-1.667 #1 and gcc 3.4.2
+#include <errno.h>   // necessary for Fedora core 2 with kernel 2.6.9-1.667 #1 and gcc 3.4.2
 
 #include <fstream>  // ofstream
Index: trunk/MagicSoft/Mars/mbase/MMath.cc
===================================================================
--- trunk/MagicSoft/Mars/mbase/MMath.cc	(revision 7386)
+++ trunk/MagicSoft/Mars/mbase/MMath.cc	(revision 7409)
@@ -36,4 +36,7 @@
 #endif
 
+#ifndef ROOT_TArrayD
+#include <TArrayD.h>
+#endif
 // --------------------------------------------------------------------------
 //
@@ -248,2 +251,140 @@
     return InterpolParabLin(vx0, vy, TMath::Cos(x));
 }
+
+// --------------------------------------------------------------------------
+//
+// Analytically calculated result of a least square fit of:
+//    y = A*e^(B*x)
+// Equal weights
+//
+// It returns TArrayD(2) = { A, B };
+//
+// see: http://mathworld.wolfram.com/LeastSquaresFittingExponential.html
+//
+TArrayD MMath::LeastSqFitExpW1(Int_t n, Double_t *x, Double_t *y)
+{
+    Double_t sumxsqy  = 0;
+    Double_t sumylny  = 0;
+    Double_t sumxy    = 0;
+    Double_t sumy     = 0;
+    Double_t sumxylny = 0;
+    for (int i=0; i<n; i++)
+    {
+        sumylny  += y[i]*TMath::Log(y[i]);
+        sumxy    += x[i]*y[i];
+        sumxsqy  += x[i]*x[i]*y[i];
+        sumxylny += x[i]*y[i]*TMath::Log(y[i]);
+        sumy     += y[i];
+    }
+
+    const Double_t dev = sumy*sumxsqy - sumxy*sumxy;
+
+    const Double_t a = (sumxsqy*sumylny - sumxy*sumxylny)/dev;
+    const Double_t b = (sumy*sumxylny - sumxy*sumylny)/dev;
+
+    TArrayD rc(2);
+    rc[0] = TMath::Exp(a);
+    rc[1] = b;
+    return rc;
+}
+
+// --------------------------------------------------------------------------
+//
+// Analytically calculated result of a least square fit of:
+//    y = A*e^(B*x)
+// Greater weights to smaller values
+//
+// It returns TArrayD(2) = { A, B };
+//
+// see: http://mathworld.wolfram.com/LeastSquaresFittingExponential.html
+//
+TArrayD MMath::LeastSqFitExp(Int_t n, Double_t *x, Double_t *y)
+{
+    // -------- Greater weights to smaller values ---------
+    Double_t sumlny  = 0;
+    Double_t sumxlny = 0;
+    Double_t sumxsq  = 0;
+    Double_t sumx    = 0;
+    for (int i=0; i<n; i++)
+    {
+        sumlny  += TMath::Log(y[i]);
+        sumxlny += x[i]*TMath::Log(y[i]);
+
+        sumxsq  += x[i]*x[i];
+        sumx    += x[i];
+    }
+
+    const Double_t dev = n*sumxsq-sumx*sumx;
+
+    const Double_t a = (sumlny*sumxsq - sumx*sumxlny)/dev;
+    const Double_t b = (n*sumxlny - sumx*sumlny)/dev;
+
+    TArrayD rc(2);
+    rc[0] = TMath::Exp(a);
+    rc[1] = b;
+    return rc;
+}
+
+// --------------------------------------------------------------------------
+//
+// Analytically calculated result of a least square fit of:
+//    y = A+B*ln(x)
+//
+// It returns TArrayD(2) = { A, B };
+//
+// see: http://mathworld.wolfram.com/LeastSquaresFittingLogarithmic.html
+//
+TArrayD LeastSqFitLog(Int_t n, Double_t *x, Double_t *y)
+{
+    Double_t sumylnx  = 0;
+    Double_t sumy     = 0;
+    Double_t sumlnx   = 0;
+    Double_t sumlnxsq = 0;
+    for (int i=0; i<n; i++)
+    {
+        sumylnx  += y[i]*TMath::Log(x[i]);
+        sumy     += y[i];
+        sumlnx   += TMath::Log(x[i]);
+        sumlnxsq += TMath::Log(x[i])*TMath::Log(x[i]);
+    }
+
+    const Double_t b = (n*sumylnx-sumy*sumlnx)/(n*sumlnxsq-sumlnx*sumlnx);
+    const Double_t a = (sumy-b*sumlnx)/n;
+
+    TArrayD rc(2);
+    rc[0] = a;
+    rc[1] = b;
+    return rc;
+}
+
+// --------------------------------------------------------------------------
+//
+// Analytically calculated result of a least square fit of:
+//    y = A*x^B
+//
+// It returns TArrayD(2) = { A, B };
+//
+// see: http://mathworld.wolfram.com/LeastSquaresFittingPowerLaw.html
+//
+TArrayD LeastSqFitPowerLaw(Int_t n, Double_t *x, Double_t *y)
+{
+    Double_t sumlnxlny  = 0;
+    Double_t sumlnx   = 0;
+    Double_t sumlny    = 0;
+    Double_t sumlnxsq   = 0;
+    for (int i=0; i<n; i++)
+    {
+        sumlnxlny  += TMath::Log(x[i])*TMath::Log(y[i]);
+        sumlnx     += TMath::Log(x[i]);
+        sumlny     += TMath::Log(y[i]);
+        sumlnxsq   += TMath::Log(x[i])*TMath::Log(x[i]);
+    }
+
+    const Double_t b = (n*sumlnxlny-sumlnx*sumlny)/(n*sumlnxsq-sumlnx*sumlnx);
+    const Double_t a = (sumlny-b*sumlnx)/n;
+
+    TArrayD rc(2);
+    rc[0] = TMath::Exp(a);
+    rc[1] = b;
+    return rc;
+}
Index: trunk/MagicSoft/Mars/mbase/MMath.h
===================================================================
--- trunk/MagicSoft/Mars/mbase/MMath.h	(revision 7386)
+++ trunk/MagicSoft/Mars/mbase/MMath.h	(revision 7409)
@@ -7,4 +7,5 @@
 
 class TVector3;
+class TArrayD;
 
 namespace MMath
@@ -31,4 +32,9 @@
     Double_t InterpolParabCos(const TVector3 &vx, const TVector3 &vy, Double_t x);
 
+    TArrayD LeastSqFitExpW1(Int_t n, Double_t *x, Double_t *y);
+    TArrayD LeastSqFitExp(Int_t n, Double_t *x, Double_t *y);
+    TArrayD LeastSqFitLog(Int_t n, Double_t *x, Double_t *y);
+    TArrayD LeastSqFitPowerLaw(Int_t n, Double_t *x, Double_t *y);
+
     inline Double_t Sgn(Double_t d) { return d<0 ? -1 : 1; }
 }
