Index: trunk/MagicSoft/Mars/mbase/MDirIter.cc
===================================================================
--- trunk/MagicSoft/Mars/mbase/MDirIter.cc	(revision 4964)
+++ trunk/MagicSoft/Mars/mbase/MDirIter.cc	(revision 4966)
@@ -244,5 +244,5 @@
 //  - have read permission
 //
-Bool_t MDirIter::Check(const TString n) const
+Bool_t MDirIter::CheckEntry(const TString n) const
 {
     // Check . and ..
@@ -298,5 +298,5 @@
     const char *n = gSystem->GetDirEntry(fDirPtr);
     if (n)
-        return nocheck || Check(n) ? ConcatFileName(fCurrentPath->GetName(), n) : Next();
+        return nocheck || CheckEntry(n) ? ConcatFileName(fCurrentPath->GetName(), n) : Next();
 
     // Otherwise close directory and try to get next entry
Index: trunk/MagicSoft/Mars/mbase/MDirIter.h
===================================================================
--- trunk/MagicSoft/Mars/mbase/MDirIter.h	(revision 4964)
+++ trunk/MagicSoft/Mars/mbase/MDirIter.h	(revision 4966)
@@ -18,5 +18,5 @@
     void   *Open();
     void    Close();
-    Bool_t  Check(const TString n) const;
+    Bool_t  CheckEntry(const TString n) const;
     Int_t   IsDir(const char *dir) const;
     Bool_t  MatchFilter(const TString &name, const TString &filter) const;
Index: trunk/MagicSoft/Mars/mbase/MMath.cc
===================================================================
--- trunk/MagicSoft/Mars/mbase/MMath.cc	(revision 4964)
+++ trunk/MagicSoft/Mars/mbase/MMath.cc	(revision 4966)
@@ -117,2 +117,55 @@
 }
 
+// -------------------------------------------------------------------------
+//
+// Quadratic interpolation
+//
+// calculate the parameters of a parabula such that
+//    y(i) = a + b*x(i) + c*x(i)^2
+//
+// If the determinant==0 an empty TVector3 is returned.
+//
+TVector3 MMath::GetParab(const TVector3 &x, const TVector3 &y)
+{
+    const TVector3 sq(x(0)*x(0), x(1)*x(1), x(2)*x(2));
+
+    const TVector3 ai2 = sq.Cross(sq);
+
+    const Double_t det = x.Dot(ai2);
+    if (det==0)
+        return TVector3();
+
+    const TVector3 ai1 = x.Cross(sq);
+    const TVector3 ai3 = x.Cross(x);
+
+    TVector3 res(y.Dot(ai1), y.Dot(ai2), y.Dot(ai3));
+    res *= 1./det;
+
+    return res;
+}
+
+Double_t MMath::InterpolParabLin(const TVector3 &vx, const TVector3 &vy, Double_t x)
+{
+    const TVector3 c = GetParab(vx, vy);
+    return c(0) + c(1)*x + c(2)*x*x;
+}
+
+Double_t MMath::InterpolParabLog(const TVector3 &vx, const TVector3 &vy, Double_t x)
+{
+    const Double_t l0 = TMath::Log10(vx(0));
+    const Double_t l1 = TMath::Log10(vx(1));
+    const Double_t l2 = TMath::Log10(vx(2));
+
+    const TVector3 vx0(l0, l1, l2);
+    return pow(10, InterpolParabLin(vx0, vy, TMath::Log10(x)));
+}
+
+Double_t MMath::InterpolParabCos(const TVector3 &vx, const TVector3 &vy, Double_t x)
+{
+    const Double_t l0 = TMath::Cos(vx(0));
+    const Double_t l1 = TMath::Cos(vx(1));
+    const Double_t l2 = TMath::Cos(vx(2));
+
+    const TVector3 vx0(l0, l1, l2);
+    return TMath::ACos(InterpolParabLin(vx0, vy, TMath::Cos(x)));
+}
Index: trunk/MagicSoft/Mars/mbase/MMath.h
===================================================================
--- trunk/MagicSoft/Mars/mbase/MMath.h	(revision 4964)
+++ trunk/MagicSoft/Mars/mbase/MMath.h	(revision 4966)
@@ -4,4 +4,7 @@
 #ifndef ROOT_TMath
 #include <TMath.h>
+#endif
+#ifndef ROOT_TVector3
+#include <TVector3.h>
 #endif
 
@@ -16,4 +19,9 @@
     static Double_t SignificanceLiMaSigned(Double_t s, Double_t b, Double_t alpha=1);
 
+    static TVector3 GetParab(const TVector3 &x, const TVector3 &y);
+    static Double_t InterpolParabLin(const TVector3 &vx, const TVector3 &vy, Double_t x);
+    static Double_t InterpolParabLog(const TVector3 &vx, const TVector3 &vy, Double_t x);
+    static Double_t InterpolParabCos(const TVector3 &vx, const TVector3 &vy, Double_t x);
+
     ClassDef(MMath, 0)
 };
Index: trunk/MagicSoft/Mars/mbase/MStatusArray.cc
===================================================================
--- trunk/MagicSoft/Mars/mbase/MStatusArray.cc	(revision 4964)
+++ trunk/MagicSoft/Mars/mbase/MStatusArray.cc	(revision 4966)
@@ -32,4 +32,10 @@
 #include "MStatusArray.h"
 
+#include <TClass.h>
+#include <TCanvas.h>
+
+#include "MLog.h"
+#include "MLogManip.h"
+
 #include "MStatusDisplay.h"
 
@@ -56,2 +62,122 @@
     return 0;
 }
+
+TCanvas *MStatusArray::FindCanvas(const char *name) const
+{
+    TObject *o = TObjArray::FindObject(name);
+    return o->InheritsFrom(TCanvas::Class()) ? (TCanvas*)o : 0;
+}
+
+TObject *MStatusArray::FindObjectInPad(TVirtualPad *pad, const char *object, TClass *cls) const
+{
+    TObject *o = pad->FindObject(object);
+    if (o && o->InheritsFrom(cls))
+        return o;
+
+    TIter Next(pad->GetListOfPrimitives());
+    while ((o=Next()))
+    {
+        if (o==pad || !o->InheritsFrom(TVirtualPad::Class()))
+            continue;
+
+        if ((o = FindObjectInPad((TVirtualPad*)o, object, cls)))
+            if (o->InheritsFrom(cls))
+                return o;
+    }
+    return 0;
+}
+
+// FIXME: Move to a general class MMARS (TROOT) and unify with MParContainer
+TClass *MStatusArray::GetClass(const char *name) const
+{
+    TClass *cls = gROOT->GetClass(name);
+    Int_t rc = 0;
+    if (!cls)
+        rc =1;
+    else
+    {
+        if (!cls->Property())
+            rc = 5;
+        if (!cls->Size())
+            rc = 4;
+        if (!cls->IsLoaded())
+            rc = 3;
+        if (!cls->HasDefaultConstructor())
+            rc = 2;
+    }
+
+    if (rc==0)
+        return cls;
+
+    gLog << err << dbginf << "Class '" << name << "' not in dictionary: ";
+    switch (rc)
+    {
+    case 1:
+        gLog << "gROOT->GetClass() returned NULL." << endl;
+        return NULL;
+    case 2:
+        gLog << "no default constructor." << endl;
+        return NULL;
+    case 3:
+        gLog << "not loaded." << endl;
+        return NULL;
+    case 4:
+        gLog << "zero size." << endl;
+        return NULL;
+    case 5:
+        gLog << "no property." << endl;
+        return NULL;
+    }
+
+    gLog << "THIS SHOULD NEVER HAPPEN!" << endl;
+
+    return 0;
+}
+
+TObject *MStatusArray::FindObjectInCanvas(const char *object, const char *base, const char *canvas) const
+{
+    TClass *cls = GetClass(base);
+    if (!cls)
+        return 0;
+
+    TCanvas *c = canvas ? FindCanvas(canvas) : 0;
+    if (canvas)
+    {
+        if (!c)
+            return 0;
+
+        TObject *o = FindObjectInPad(c, object, cls);
+        if (!o)
+            return 0;
+
+        return o->InheritsFrom(cls) ? o : 0;
+    }
+
+    TObject *o=0;
+    TIter Next(this);
+    while ((o=Next()))
+    {
+        if (!o->InheritsFrom(TVirtualPad::Class()))
+            continue;
+
+        if ((o=FindObjectInPad((TVirtualPad*)c, object, cls)))
+            return o;
+    }
+
+    return NULL;
+}
+
+TObject *MStatusArray::FindObjectInCanvas(const char *object, const char *canvas) const
+{
+    return FindObjectInCanvas(object, object, canvas);
+}
+
+TObject *MStatusArray::FindObject(const char *object, const char *base) const
+{
+    return FindObjectInCanvas(object, base, 0);
+}
+
+TObject *MStatusArray::FindObject(const char *object) const
+{
+    return FindObjectInCanvas(object, object, 0);
+}
Index: trunk/MagicSoft/Mars/mbase/MStatusArray.h
===================================================================
--- trunk/MagicSoft/Mars/mbase/MStatusArray.h	(revision 4964)
+++ trunk/MagicSoft/Mars/mbase/MStatusArray.h	(revision 4966)
@@ -6,9 +6,26 @@
 #endif
 
+class TClass;
+class TCanvas;
+class TVirtualPad;
+
 class MStatusArray : public TObjArray
 {
+private:
+    TObject *FindObjectInPad(TVirtualPad *pad, const char *object, TClass *base) const;
+    TClass  *GetClass(const char *name) const;
+
 public:
     TObject *DisplayIn(Option_t *o=0) const;         // *MENU*
     TObject *Display() const { return DisplayIn(); } // *MENU*
+
+    TCanvas *FindCanvas(const char *name) const;
+
+    TObject *FindObjectInCanvas(const char *object, const char *base, const char *canvas) const;
+    TObject *FindObjectInCanvas(const char *object, const char *canvas) const;
+
+    TObject *FindObject(const char *object, const char *base) const;
+    TObject *FindObject(const char *object) const;
+    TObject *FindObject(const TObject *o) const { return 0; }
 
     ClassDef(MStatusArray, 0) // Helper class for status display
