Index: trunk/MagicSoft/Mars/Changelog
===================================================================
--- trunk/MagicSoft/Mars/Changelog	(revision 755)
+++ trunk/MagicSoft/Mars/Changelog	(revision 756)
@@ -5,5 +5,10 @@
    * mbase/MParList.cc:
      - added stripping of the string after last semicolon (classname)
-     
+
+   * mbase/MReadTree.cc:
+     - added Veto funtionality to PreProcess
+     - added HasVeto
+     - added fVetoList
+     - added VetoBranch
 
 
Index: trunk/MagicSoft/Mars/mbase/MReadTree.cc
===================================================================
--- trunk/MagicSoft/Mars/mbase/MReadTree.cc	(revision 755)
+++ trunk/MagicSoft/Mars/mbase/MReadTree.cc	(revision 756)
@@ -43,4 +43,5 @@
 #include <TFile.h>
 #include <TChain.h>
+#include <TArrayC.h>
 #include <TObjArray.h>
 
@@ -60,4 +61,5 @@
     *fTitle = title ? title : "Task to loop over all events in one single tree";
 
+    fVetoList = new TArrayC;
     //
     // open the input stream
@@ -73,4 +75,5 @@
 {
     delete fChain;
+    delete fVetoList;
 }
 
@@ -129,5 +132,11 @@
         // Get Name of Branch
         //
-        const char *name = branch->GetName();
+        const char *name  = branch->GetName();
+
+        //
+        // Check if enabeling the branch is allowed
+        //
+        if (HasVeto(name))
+            continue;
 
         //
@@ -258,2 +267,95 @@
 }
 
+// --------------------------------------------------------------------------
+//
+// This function checks if the Branch Name is part of the Veto List.
+// This means, that the preprocess doesn't enable the branch.
+//
+Bool_t MReadTree::HasVeto(const char *name) const
+{
+    const size_t nlen = strlen(name)+1;
+
+    char  *pos = fVetoList->GetArray();
+    size_t len = fVetoList->GetSize();
+
+    //
+    // now we compare the 'strings' in the list word by word
+    // (string or word in this context means a zero terminated
+    // array of chars
+    //
+
+    for (;;)
+    {
+        //
+        // Search for the first byte of the name
+        //
+        char *c = (char*)memchr(pos, name[0], len);
+
+        //
+        // if we don't find the first byte, the list cannot contain 'name'
+        //
+        if (!c)
+            return kFALSE;
+
+        //
+        // calculate and check how many bytes remains in the list
+        //
+        len -= c-pos;
+
+        //
+        // if there are not enough bytes to match the query we are done
+        //
+        if (len<nlen)
+            return kFALSE;
+
+        //
+        // check if the next 'nlen' byte (including the trailing '\0'
+        // are matching
+        //
+        if (!memcmp(c, name, nlen))
+            return kTRUE;
+
+        //
+        // we didn't find the string, goto the next 'string'
+        //
+        pos = (char*)memchr(c, '\0', len);
+
+        //
+        // check if there is a 'next' string really
+        //
+        if (!pos)
+            return kFALSE;
+
+        //
+        // calculate the remaining length
+        //
+        len -= pos-c;
+
+        //
+        // if there are not enough bytes to match the query we are done
+        //
+        if (len<nlen)
+            return kFALSE;
+    }
+}
+
+
+// --------------------------------------------------------------------------
+//
+// If you don't want that a branch is enabled within the PreProcess you
+// can set a veto for enabeling the branch. (This means also the
+// corresponding object won't be created automatically)
+//
+void MReadTree::VetoBranch(const char *name)
+{
+    //
+    // Add this file as the last entry of the list
+    // (including the trailing '\0')
+    //
+    const int sz  = fVetoList->GetSize();
+    const int tsz = strlen(name)+1;
+
+    fVetoList->Set(sz+tsz);
+
+    memcpy(fVetoList->GetArray()+sz, name, tsz);
+}
