Index: trunk/MagicSoft/Mars/mdata/MData.cc
===================================================================
--- trunk/MagicSoft/Mars/mdata/MData.cc	(revision 1465)
+++ trunk/MagicSoft/Mars/mdata/MData.cc	(revision 1474)
@@ -50,4 +50,6 @@
 #include <fstream.h>
 
+#include "MLog.h"
+
 ClassImp(MData);
 
@@ -58,2 +60,6 @@
 }
 
+void MData::Print(Option_t *opt = "") const
+{
+    *fLog << GetRule() << flush;
+}
Index: trunk/MagicSoft/Mars/mdata/MData.h
===================================================================
--- trunk/MagicSoft/Mars/mdata/MData.h	(revision 1465)
+++ trunk/MagicSoft/Mars/mdata/MData.h	(revision 1474)
@@ -18,9 +18,11 @@
 public:
     virtual Double_t GetValue() const = 0;
-    virtual Bool_t IsValid() const = 0;
-    virtual Bool_t PreProcess(const MParList *plist) = 0;
+    virtual Bool_t   IsValid() const = 0;
+    virtual Bool_t   PreProcess(const MParList *plist) = 0;
+    virtual TString  GetRule() const = 0;
 
     Double_t operator()() { return GetValue(); }
 
+    void Print(Option_t *opt = "") const;
     Bool_t AsciiWrite(ostream &out) const;
 
Index: trunk/MagicSoft/Mars/mdata/MDataChain.cc
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataChain.cc	(revision 1465)
+++ trunk/MagicSoft/Mars/mdata/MDataChain.cc	(revision 1474)
@@ -448,6 +448,8 @@
 }
 
+    /*
 void MDataChain::Print(Option_t *opt) const
 {
+    *fLog << GetRule() << flush;
     Bool_t bracket = fOperatorType!=kENoop && !fMember->InheritsFrom(MDataList::Class());
 
@@ -483,3 +485,45 @@
     if (bracket)
         *fLog << ")" << flush;
-}
+        }
+        */
+
+TString MDataChain::GetRule() const
+{
+    TString str;
+
+    Bool_t bracket = fOperatorType!=kENoop && !fMember->InheritsFrom(MDataList::Class());
+
+    switch (fOperatorType)
+    {
+    case kEAbs:      str += "abs"   ; break;
+    case kELog:      str += "log"   ; break;
+    case kELog10:    str += "log10" ; break;
+    case kESin:      str += "sin"   ; break;
+    case kECos:      str += "cos"   ; break;
+    case kETan:      str += "tan"   ; break;
+    case kESinH:     str += "sinh"  ; break;
+    case kECosH:     str += "cosh"  ; break;
+    case kETanH:     str += "tanh"  ; break;
+    case kEASin:     str += "asin"  ; break;
+    case kEACos:     str += "acos"  ; break;
+    case kEATan:     str += "atan"  ; break;
+    case kESqrt:     str += "sqrt"  ; break;
+    case kEExp:      str += "exp"   ; break;
+    case kEPow10:    str += "pow10" ; break;
+    case kESgn:      str += "sgn"   ; break;
+    case kENegative: str += "-"     ; break;
+    case kEPositive: str += "+"     ; break;
+    case kENoop:
+        break;
+    }
+
+    if (bracket)
+        str += "(";
+
+    str += fMember->GetRule();
+
+    if (bracket)
+        str += ")";
+
+    return str;
+}
Index: trunk/MagicSoft/Mars/mdata/MDataChain.h
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataChain.h	(revision 1465)
+++ trunk/MagicSoft/Mars/mdata/MDataChain.h	(revision 1474)
@@ -63,5 +63,7 @@
     Bool_t IsReadyToSave() const;
 
-    void Print(Option_t *opt = "") const;
+//    void Print(Option_t *opt = "") const;
+
+    TString GetRule() const;
 
     ClassDef(MDataChain, 0) // A chain/concatenation of MData objects
Index: trunk/MagicSoft/Mars/mdata/MDataList.cc
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataList.cc	(revision 1465)
+++ trunk/MagicSoft/Mars/mdata/MDataList.cc	(revision 1474)
@@ -204,4 +204,5 @@
 // one the option string must conatin a "v"
 //
+/*
 void MDataList::Print(Option_t *opt) const
 {
@@ -251,4 +252,52 @@
 
     *fLog << ")" << flush;
-}
-
+    }
+    */
+
+TString MDataList::GetRule() const
+{
+    TIter Next(&fMembers);
+
+    MData *member=(MData*)Next();
+
+    //
+    // loop over all members
+    //
+    if (!member)
+        return "(<empty>)";
+
+    TString str = "(";
+
+    str += member->GetRule();
+
+    while ((member=(MData*)Next()))
+    {
+        switch (fSign)
+        {
+        case kENone:
+            break;
+
+        case kEPlus:
+            str += "+";
+            break;
+
+        case kEMinus:
+            str += "-";
+            break;
+
+        case kEMult:
+            str += "*";
+            break;
+
+        case kEDiv:
+            str += "/";
+            break;
+        }
+
+        str += member->GetRule();
+    }
+
+    str += ")";
+
+    return str;
+}
Index: trunk/MagicSoft/Mars/mdata/MDataList.h
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataList.h	(revision 1465)
+++ trunk/MagicSoft/Mars/mdata/MDataList.h	(revision 1474)
@@ -46,5 +46,6 @@
     Bool_t PreProcess(const MParList *plist);
 
-    void Print(Option_t *opt = "") const;
+//    void Print(Option_t *opt = "") const;
+    TString GetRule() const;
 
     ClassDef(MDataList, 0) // A concatenation of MData objects by one operator
Index: trunk/MagicSoft/Mars/mdata/MDataMember.cc
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataMember.cc	(revision 1465)
+++ trunk/MagicSoft/Mars/mdata/MDataMember.cc	(revision 1474)
@@ -158,7 +158,13 @@
 // Print the name of the data member without an CR.
 //
+/*
 void MDataMember::Print(Option_t *opt) const
 {
     *fLog << fName << flush;
 }
+*/
 
+TString MDataMember::GetRule() const
+{
+    return fName;
+}
Index: trunk/MagicSoft/Mars/mdata/MDataMember.h
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataMember.h	(revision 1465)
+++ trunk/MagicSoft/Mars/mdata/MDataMember.h	(revision 1474)
@@ -32,5 +32,6 @@
     Bool_t IsReadyToSave() const;
 
-    void Print(Option_t *opt = "") const;
+    //void Print(Option_t *opt = "") const;
+    TString GetRule() const;
 
     ClassDef(MDataMember, 0) // MData object corresponding to a single data member of a Mars container
Index: trunk/MagicSoft/Mars/mdata/MDataValue.cc
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataValue.cc	(revision 1465)
+++ trunk/MagicSoft/Mars/mdata/MDataValue.cc	(revision 1474)
@@ -16,5 +16,5 @@
 !
 !
-!   Author(s): Thomas Bretz  04/2002 <mailto:tbretz@uni-sw.gwdg.de>
+!   Author(s): Thomas Bretz  04/2002 <mailto:tbretz@astro.uni-wuerzburg.de>
 !
 !   Copyright: MAGIC Software Development, 2000-2002
@@ -40,9 +40,11 @@
 // --------------------------------------------------------------------------
 //
-// Print the value
+// Return the value as a string
 //
-void MDataValue::Print(Option_t *opt) const
+TString MDataValue::GetRule() const
 {
-    *fLog << fValue << flush;
+    TString str;
+    str += fValue;
+    return str.Strip(TString::kBoth);
 }
 
Index: trunk/MagicSoft/Mars/mdata/MDataValue.h
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataValue.h	(revision 1465)
+++ trunk/MagicSoft/Mars/mdata/MDataValue.h	(revision 1474)
@@ -28,5 +28,6 @@
     Bool_t IsReadyToSave() const { return kFALSE; }
 
-    void Print(Option_t *opt = "") const;
+    //void Print(Option_t *opt = "") const;
+    TString GetRule() const;
 
     ClassDef(MDataValue, 0) // MData object corresponding to a single value
