Index: trunk/MagicSoft/Mars/Changelog
===================================================================
--- trunk/MagicSoft/Mars/Changelog	(revision 4957)
+++ trunk/MagicSoft/Mars/Changelog	(revision 4958)
@@ -37,4 +37,10 @@
      - added functions ProjectArray(MArrayD,...) 
        and ProjectArray(MArrayF,...)
+
+   * mtools/MFFT.[h,cc]
+     - added functions:
+	  MArrayF* PowerSpectrumDensity(const MArrayI *array);  
+	  MArrayF* PowerSpectrumDensity(const MArrayF *array);
+	  MArrayD* PowerSpectrumDensity(const MArrayD *array);
 
    * mbadpixels/MBadPixelsIntensityCam.[h,cc]
Index: trunk/MagicSoft/Mars/mbase/MArrayD.h
===================================================================
--- trunk/MagicSoft/Mars/mbase/MArrayD.h	(revision 4957)
+++ trunk/MagicSoft/Mars/mbase/MArrayD.h	(revision 4958)
@@ -81,5 +81,5 @@
     }
 
-    Double_t     At(UInt_t i)
+    Double_t     At(UInt_t i) const
     {
         return fArray[i];
Index: trunk/MagicSoft/Mars/mbase/MArrayF.h
===================================================================
--- trunk/MagicSoft/Mars/mbase/MArrayF.h	(revision 4957)
+++ trunk/MagicSoft/Mars/mbase/MArrayF.h	(revision 4958)
@@ -81,5 +81,5 @@
     }
 
-    Float_t     At(UInt_t i)
+    Float_t     At(UInt_t i) const 
     {
         return fArray[i];
Index: trunk/MagicSoft/Mars/mbase/MArrayI.h
===================================================================
--- trunk/MagicSoft/Mars/mbase/MArrayI.h	(revision 4957)
+++ trunk/MagicSoft/Mars/mbase/MArrayI.h	(revision 4958)
@@ -80,5 +80,5 @@
     }
 
-    Int_t     At(UInt_t i)
+    Int_t     At(UInt_t i) const
     {
         return fArray[i];
Index: trunk/MagicSoft/Mars/mtools/MFFT.cc
===================================================================
--- trunk/MagicSoft/Mars/mtools/MFFT.cc	(revision 4957)
+++ trunk/MagicSoft/Mars/mtools/MFFT.cc	(revision 4958)
@@ -103,4 +103,8 @@
 #include "MLogManip.h"
 
+#include "MArrayD.h"
+#include "MArrayF.h"
+#include "MArrayI.h"
+
 ClassImp(MFFT);
 
@@ -628,5 +632,5 @@
 }
 
-
+//----------------------------------------------------------
 //
 // Power Spectrum Density Calculation
@@ -678,4 +682,5 @@
 }
 
+// -------------------------------------------------
 //
 // Power Spectrum Density calculation for TArrayF
@@ -710,5 +715,5 @@
   //
   c02 = (fDataF[0]*fDataF[0]);
-  //  newarray->AddAt(c02/dim2,0);
+  newarray->AddAt(c02/dim2,0);
   //
   // 2) P(k) = 1/(N*N) (|C(k)|*|C(k)|))
@@ -724,10 +729,10 @@
   //
   cn2 = (fDataF[1]*fDataF[1]);
-  //  newarray->AddAt(cn2,dim05-1);
+  newarray->AddAt(cn2,dim05-1);
   
   return newarray;
 }
 
-
+// -------------------------------------------------
 //
 // Power Spectrum Density calculation for TArrayI
@@ -762,5 +767,5 @@
   //
   c02 = (fDataF[0]*fDataF[0]);
-  //  newarray->AddAt(c02/dim2,0);
+  newarray->AddAt(c02/dim2,0);
   //
   // 2) P(k) = 1/(N*N) (|C(k)|*|C(k)|))
@@ -776,5 +781,5 @@
   //
   cn2 = (fDataF[1]*fDataF[1]);
-  //  newarray->AddAt(cn2,dim05-1);
+  newarray->AddAt(cn2,dim05-1);
   
   return newarray;
@@ -782,4 +787,8 @@
 
 
+// -------------------------------------------------
+//
+// Power Spectrum Density calculation for TArrayD
+//
 TArrayD* MFFT::PowerSpectrumDensity(const TArrayD *array)
 {
@@ -811,5 +820,5 @@
   //
   c02 = (fDataD[0]*fDataD[0]);
-  //  newarray->AddAt(c02/dim2,0);
+  newarray->AddAt(c02/dim2,0);
   //
   // 2) P(k) = 1/(N*N) (|C(k)|*|C(k)|))
@@ -825,4 +834,57 @@
   //
   cn2 = (fDataD[1]*fDataD[1]);
+  newarray->AddAt(cn2,dim05-1);
+  
+  return newarray;
+}
+
+// -------------------------------------------------
+//
+// Power Spectrum Density calculation for MArrayF
+// The difference to the TArrayF versions is that 
+// the resulting array has two entries less, namely 
+// the first and last one are skipped!
+//
+MArrayF* MFFT::PowerSpectrumDensity(const MArrayF *array)
+{
+
+  fDim = array->GetSize();
+  CheckDim(fDim);
+
+  fDataF.Set(fDim);
+  //
+  // Copy the hist into an array
+  //
+  for (Int_t i=0;i<fDim;i++)
+    fDataF[i] = array->At(i);
+
+  RealFTF(1);
+
+  const Int_t dim2  = fDim*fDim;
+  const Int_t dim05 = fDim/2;
+  Float_t ck2;
+  
+  MArrayF *newarray = new MArrayF(dim05-2);
+
+  //
+  // Fill the new histogram: 
+  //
+  // 1) P(0) = 1/(N*N) |C(0)|*|C(0)|
+  //
+  //  c02 = (fDataF[0]*fDataF[0]);
+  //  newarray->AddAt(c02/dim2,0);
+  //
+  // 2) P(k) = 1/(N*N) (|C(k)|*|C(k)|))
+  //
+  for (Int_t k=1;k<dim05-1;k++)
+    {
+      const Int_t k2 = k+k;
+      ck2 = (fDataF[k2]*fDataF[k2] + fDataF[k2+1]*fDataF[k2+1]);
+      newarray->AddAt(ck2/dim2,k-1);
+    }
+  //
+  // 3) P(N) = 1/(N*N) (|C(n/2)|*|C(n/2)|)
+  //
+  //  cn2 = (fDataF[1]*fDataF[1]);
   //  newarray->AddAt(cn2,dim05-1);
   
@@ -830,5 +892,111 @@
 }
 
-
+//-----------------------------------------------------
+//
+// Power Spectrum Density calculation for MArrayI
+// The difference to the TArrayI versions is that 
+// the resulting array has two entries less, namely 
+// the first and last one are skipped!
+//
+MArrayF* MFFT::PowerSpectrumDensity(const MArrayI *array)
+{
+
+  fDim = array->GetSize();
+  CheckDim(fDim);
+
+  fDataF.Set(fDim);
+  //
+  // Copy the hist into an array
+  //
+  for (Int_t i=0;i<fDim;i++)
+    fDataF[i] = (Float_t)array->At(i);
+
+  RealFTF(1);
+
+  const Int_t dim2  = fDim*fDim;
+  const Int_t dim05 = fDim/2;
+  Float_t ck2;
+  
+  MArrayF *newarray = new MArrayF(dim05-2);
+
+  //
+  // Fill the new histogram: 
+  //
+  // 1) P(0) = 1/(N*N) |C(0)|*|C(0)|
+  //
+  //  c02 = (fDataF[0]*fDataF[0]);
+  //  newarray->AddAt(c02/dim2,0);
+  //
+  // 2) P(k) = 1/(N*N) (|C(k)|*|C(k)|))
+  //
+  for (Int_t k=1;k<dim05-1;k++)
+    {
+      const Int_t k2 = k+k;
+      ck2 = (fDataF[k2]*fDataF[k2] + fDataF[k2+1]*fDataF[k2+1]);
+      newarray->AddAt(ck2/dim2,k-1);
+    }
+  //
+  // 3) P(N) = 1/(N*N) (|C(n/2)|*|C(n/2)|)
+  //
+  //  cn2 = (fDataF[1]*fDataF[1]);
+  //  newarray->AddAt(cn2,dim05-1);
+  
+  return newarray;
+}
+
+// -------------------------------------------------
+//
+// Power Spectrum Density calculation for MArrayD
+// The difference to the TArrayI versions is that 
+// the resulting array has two entries less, namely 
+// the first and last one are skipped!
+//
+MArrayD* MFFT::PowerSpectrumDensity(const MArrayD *array)
+{
+  
+  fDim = array->GetSize();
+  CheckDim(fDim);
+
+  fDataD.Set(fDim);
+  //
+  // Copy the hist into an array
+  //
+  for (Int_t i=0;i<fDim;i++)
+    fDataD[i] = array->At(i);
+
+  RealFTD(1);
+
+  const Int_t dim2  = fDim*fDim;
+  const Int_t dim05 = fDim/2;
+  Float_t ck2;
+  
+  MArrayD *newarray = new MArrayD(dim05-2);
+
+  //
+  // Fill the new histogram: 
+  //
+  // 1) P(0) = 1/(N*N) |C(0)|*|C(0)|
+  //
+  //  c02 = (fDataD[0]*fDataD[0]);
+  //  newarray->AddAt(c02/dim2,0);
+  //
+  // 2) P(k) = 1/(N*N) (|C(k)|*|C(k)|))
+  //
+  for (Int_t k=1;k<dim05-1;k++)
+    {
+      const Int_t k2 = k+k;
+      ck2 = (fDataD[k2]*fDataD[k2] + fDataD[k2+1]*fDataD[k2+1]);
+      newarray->AddAt(ck2/dim2,k-1);
+    }
+  //
+  // 3) P(N) = 1/(N*N) (|C(n/2)|*|C(n/2)|)
+  //
+  //  cn2 = (fDataD[1]*fDataD[1]);
+  //  newarray->AddAt(cn2,dim05-1);
+  
+  return newarray;
+}
+
+// -----------------------------------------------
 //
 // Power Spectrum Density calculation for TH1
Index: trunk/MagicSoft/Mars/mtools/MFFT.h
===================================================================
--- trunk/MagicSoft/Mars/mtools/MFFT.h	(revision 4957)
+++ trunk/MagicSoft/Mars/mtools/MFFT.h	(revision 4958)
@@ -22,4 +22,7 @@
 #endif
 
+class MArrayI;
+class MArrayD;
+class MArrayF;
 class MFFT : public TObject
 {
@@ -78,4 +81,8 @@
   TArrayD* PowerSpectrumDensity(const TArrayD *array);
 
+  MArrayF* PowerSpectrumDensity(const MArrayI *array);  
+  MArrayF* PowerSpectrumDensity(const MArrayF *array);
+  MArrayD* PowerSpectrumDensity(const MArrayD *array);
+
   TArrayF*  RealFunctionSpectrum(const TArrayF *data);
   
