Index: trunk/MagicSoft/Mars/Changelog
===================================================================
--- trunk/MagicSoft/Mars/Changelog	(revision 2709)
+++ trunk/MagicSoft/Mars/Changelog	(revision 2710)
@@ -25,4 +25,11 @@
      - added a first implementation to be able searching report
        files for the run number
+
+   * mdata/MDataMember.[h,cc]:
+     - implemented a way to determin whether the data member is 
+       a floating point value or an integer
+
+   * mfilter/MFDataMember.[h,cc]:
+     - use the information to treat integer values more accuratly
 
 
Index: trunk/MagicSoft/Mars/mdata/MDataMember.cc
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataMember.cc	(revision 2709)
+++ trunk/MagicSoft/Mars/mdata/MDataMember.cc	(revision 2710)
@@ -63,4 +63,9 @@
     fCall   = call;
 
+    if (fCall->ReturnType()==TMethodCall::kLong)
+        SetBit(kIsInt);
+    else
+        ResetBit(kIsInt);
+
     fDataMember = (TString)obj->GetName() + "." + call->GetName();
 }
@@ -77,4 +82,9 @@
     fObject = obj;
     fCall   = obj->GetterMethod(call);
+
+    if (fCall->ReturnType()==TMethodCall::kLong)
+        SetBit(kIsInt);
+    else
+        ResetBit(kIsInt);
 
     fDataMember = (TString)obj->GetName() + "." + call;
Index: trunk/MagicSoft/Mars/mdata/MDataMember.h
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataMember.h	(revision 2709)
+++ trunk/MagicSoft/Mars/mdata/MDataMember.h	(revision 2710)
@@ -20,4 +20,6 @@
     TMethodCall   *fCall;
 
+    enum { kIsInt = BIT(14) };
+
 public:
     MDataMember(const char *member=NULL) : fObject(NULL), fCall(NULL)
@@ -39,4 +41,6 @@
     TString GetDataMember() const;
 
+    Bool_t IsInt() const { return TestBit(kIsInt); }
+
     ClassDef(MDataMember, 1) // MData object corresponding to a single data member of a Mars container
 };
Index: trunk/MagicSoft/Mars/merpp.cc
===================================================================
--- trunk/MagicSoft/Mars/merpp.cc	(revision 2709)
+++ trunk/MagicSoft/Mars/merpp.cc	(revision 2710)
@@ -22,5 +22,4 @@
 #include "MRawCrateArray.h"
 
-#include "MFilterList.h"
 #include "MFDataMember.h"
 
@@ -225,7 +224,7 @@
     // be created by MRawFileRead::PreProcess
     //
-    MTask       *read   = 0;
-    MFilterList *filter = 0;
-    MTask       *write  = 0;
+    MTask   *read   = 0;
+    MFilter *filter = 0;
+    MTask   *write  = 0;
 
     const TString option(kUpdate ? "UPDATE" : "RECREATE");
@@ -278,9 +277,6 @@
             {
                 r->AddToList("MReportRun");
-                // FIXME: Too difficult!
-                filter = new MFilterList;
-                filter->SetOwner();
-                filter->AddToList(new MFDataMember("MReportRun.fRunNumber", '>', kRunNumber-0.5));
-                filter->AddToList(new MFDataMember("MReportRun.fRunNumber", '<', kRunNumber+0.5));
+                filter = new MFDataMember("MReportRun.fRunNumber", '=', kRunNumber-0.5);
+                filter->SetInverted();
                 w->SetFilter(filter);
             }
Index: trunk/MagicSoft/Mars/mfilter/MF.cc
===================================================================
--- trunk/MagicSoft/Mars/mfilter/MF.cc	(revision 2709)
+++ trunk/MagicSoft/Mars/mfilter/MF.cc	(revision 2710)
@@ -85,5 +85,5 @@
 #include <ctype.h>        // isalnum, ...
 #include <stdlib.h>       // strtod, ...
-#include <fstream>      // ofstream, ...
+#include <fstream>        // ofstream, ...
 
 #include <TMethodCall.h>
Index: trunk/MagicSoft/Mars/mfilter/MFDataMember.cc
===================================================================
--- trunk/MagicSoft/Mars/mfilter/MFDataMember.cc	(revision 2709)
+++ trunk/MagicSoft/Mars/mfilter/MFDataMember.cc	(revision 2710)
@@ -41,4 +41,13 @@
 //   MFDataMember filter("MHillas.fLength", '<', 150);
 //
+// You can test '<', '>' and '='. Warning: Using '=' may give strange results
+// in case you are comparing floating point values.
+//
+// In case the data member is detected to be an integer value, both
+// the data member and the val given as argument in the constructor
+// are castet to Long_t.
+//
+// To test != use the SetInverted() member function.
+//
 /////////////////////////////////////////////////////////////////////////////
 #include "MFDataMember.h"
@@ -68,8 +77,14 @@
     AddToBranchList(member);
 
-    fFilterType = (type=='<' ? kELowerThan : kEGreaterThan);
+    switch (type)
+    {
+    case '>': fFilterType = kEGreaterThan; break;
+    case '<': fFilterType = kELowerThan;   break;
+    case '=': fFilterType = kEEqual;       break;
+    default:  fFilterType = kEGreaterThan; break;
+    }
 
-    if (type!='<' && type!='>')
-        *fLog << warn << dbginf << "Warning: Neither '<' nor '>' specified... using '>'." << endl;
+    if (type!='<' && type!='=' && type!='>')
+        *fLog << warn << dbginf << "Warning: Neither '<' nor '=' nor '>' specified... using '>'." << endl;
 }
 
@@ -85,12 +100,33 @@
 Int_t MFDataMember::Process()
 {
-    switch (fFilterType)
+    if (fData.IsInt())
     {
-    case kELowerThan:
-        fResult = (fData.GetValue() < fValue);
-        return kTRUE;
-    case kEGreaterThan:
-        fResult = (fData.GetValue() > fValue);
-        return kTRUE;
+        switch (fFilterType)
+        {
+        case kELowerThan:
+            fResult = ((Long_t)fData.GetValue() < (Long_t)fValue);
+            return kTRUE;
+        case kEGreaterThan:
+            fResult = ((Long_t)fData.GetValue() > (Long_t)fValue);
+            return kTRUE;
+        case kEEqual:
+            fResult = ((Long_t)fData.GetValue() == (Long_t)fValue);
+            return kTRUE;
+        }
+    }
+    else
+    {
+        switch (fFilterType)
+        {
+        case kELowerThan:
+            fResult = (fData.GetValue() < fValue);
+            return kTRUE;
+        case kEGreaterThan:
+            fResult = (fData.GetValue() > fValue);
+            return kTRUE;
+        case kEEqual:
+            fResult = (fData.GetValue() == fValue);
+            return kTRUE;
+        }
     }
 
@@ -107,5 +143,10 @@
     out << "   MFDataMember " << GetUniqueName() << "(\"";
     out << fData.GetRule() << "\", '";
-    out << (fFilterType==kELowerThan?"<":">");
+    switch (fFilterType)
+    {
+    case kEGreaterThan: out << '>'; break;
+    case kELowerThan:   out << '<'; break;
+    case kEEqual:       out << '='; break;
+    }
     out << "', " << fValue << ");" << endl;
 }
@@ -114,5 +155,10 @@
 {
     TString ret = fData.GetRule();
-    ret += fFilterType==kELowerThan?"<":">";
+    switch (fFilterType)
+    {
+    case kEGreaterThan: ret +='>'; break;
+    case kELowerThan:   ret +='<'; break;
+    case kEEqual:       ret +='='; break;
+    }
 
     TString str;
Index: trunk/MagicSoft/Mars/mfilter/MFDataMember.h
===================================================================
--- trunk/MagicSoft/Mars/mfilter/MFDataMember.h	(revision 2709)
+++ trunk/MagicSoft/Mars/mfilter/MFDataMember.h	(revision 2710)
@@ -1,10 +1,4 @@
 #ifndef MARS_MFDataMember
 #define MARS_MFDataMember
-
-/////////////////////////////////////////////////////////////////////////////
-//                                                                         //
-// MFDataMember                                                                 //
-//                                                                         //
-/////////////////////////////////////////////////////////////////////////////
 
 #ifndef MARS_MFilter
@@ -22,5 +16,5 @@
     MDataMember fData;
 
-    typedef enum { kELowerThan, kEGreaterThan } FilterType_t;
+    typedef enum { kELowerThan, kEGreaterThan, kEEqual } FilterType_t;
     FilterType_t fFilterType;
 
@@ -34,4 +28,7 @@
 
 public:
+    enum {
+        kIsInt = BIT(14)
+    };
     MFDataMember(const char *member, const char type, const Double_t val,
                  const char *name=NULL, const char *title=NULL);
