Index: trunk/MagicSoft/Mars/mfileio/MReadReports.cc
===================================================================
--- trunk/MagicSoft/Mars/mfileio/MReadReports.cc	(revision 8746)
+++ trunk/MagicSoft/Mars/mfileio/MReadReports.cc	(revision 8780)
@@ -317,4 +317,5 @@
 
     fPosEntry.Set(i);
+    fPosEntry.Reset();
 
     // Force that with the next call to Process the required events are read
@@ -415,4 +416,6 @@
     while (fChains->GetSize())
     {
+        // Find the next tree to read from checking the time-stamps
+        // of the next events which would be read
         const Int_t nmin=FindNext();
         if (nmin<0)
@@ -422,35 +425,42 @@
         }
 
-        TChain *chain = (TChain*)fChains->At(nmin);
-
-        MTask *task = (MTask*)fTrees->GetList()->At(nmin);
-
-        //Int_t before = chain->GetTreeNumber();
-        if (chain->GetEntry(++fPosEntry[nmin])>0)
-        {
-            const Int_t rc = task->CallProcess();
-            if (rc)
-                return rc;
-        }
-
-        *fLog << dbg << "Removing chain " << chain->GetName() << " from list" << flush;
-
-        delete *GetTime(chain);        // Delete MTime*
-        *fLog << "." << flush;
-        delete fChains->Remove(chain); // Remove chain from TList
-        *fLog << "." << flush;
-
-        // FIXME: Maybe MTaskList should have a member function to
-        //        reorder the tasks?
-
-        // Move this task to the end of the list so that nmin still
-        // corresponds to the correct task in the list.
-        const_cast<TList*>(fTrees->GetList())->Remove(task);
-        *fLog << "." << flush;
-        const_cast<TList*>(fTrees->GetList())->AddLast(task);
-        *fLog << "done." << endl;
-    }
-
-    return kFALSE; 
+        // Read the event from this tree
+        MTask *task = static_cast<MTask*>(fTrees->GetList()->At(nmin));
+        const Int_t rc = task->CallProcess();
+
+        // Read the time-stamp of the next event
+        TChain *chain = static_cast<TChain*>(fChains->At(nmin));
+        const Int_t cnt = chain->GetEntry(++fPosEntry[nmin]);
+
+        // In case there is no further time-stamp of an error reading the
+        // event we remove this time-stamp from the list of time-stamps to
+        // be checked for reading the next events, because there is none.
+        if (cnt<=0 || rc==kFALSE)
+        {
+            *fLog << dbg << "Removing chain " << chain->GetName() << " from list" << flush;
+
+            delete *GetTime(chain);        // Delete MTime*
+            *fLog << "." << flush;
+            delete fChains->Remove(chain); // Remove chain from TList
+            *fLog << "." << flush;
+
+            // FIXME: Maybe MTaskList should have a member function to
+            //        reorder the tasks?
+
+            // Move this task to the end of the list so that nmin still
+            // corresponds to the correct task in the list.
+            const_cast<TList*>(fTrees->GetList())->Remove(task);
+            *fLog << "." << flush;
+            const_cast<TList*>(fTrees->GetList())->AddLast(task);
+            *fLog << "done." << endl;
+        }
+
+        // If something else than kFALSE (means: stop reading from this
+        // tree) has happened we return the return code of the processing
+        if (rc!=kFALSE)
+            return rc;
+    }
+
+    return kFALSE;
 }
 
