diff --git a/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.cxx b/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.cxx
index 212bb070463305a98603adf7df9b30962ecc2378..a9ed0943548a38dd076d8f5dd14b9a12691872b6 100644
--- a/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.cxx
+++ b/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.cxx
@@ -4,6 +4,7 @@
 
 #include "CbmSeedFinderSlidingWindow.h"
 
+#include "CbmMCEventList.h"
 #include "CbmMatch.h"
 #include "CbmMuchBeamTimeDigi.h"
 #include "CbmMuchDigi.h"
@@ -14,6 +15,9 @@
 #include "CbmTofDigi.h"
 #include "CbmTrdDigi.h"
 
+#include "FairRootManager.h"
+#include <Logger.h>
+
 CbmSeedFinderSlidingWindow::~CbmSeedFinderSlidingWindow()
 {
   if (fQa != nullptr) { delete fQa; }
@@ -25,13 +29,41 @@ double CbmSeedFinderSlidingWindow::GetTime(const std::vector<double>* vIn, int32
 template<class inType>
 void CbmSeedFinderSlidingWindow::FillSeedTimes(const std::vector<inType>* vIn, const std::vector<CbmMatch>* vDigiMatch)
 {
+  // Reset output array
+  fvSeedTimes->clear();
+
+  // Ideal mode ignores digi input and copies MC event list
+  if (fbIdealMode) {
+
+    std::vector<CbmMatch> eventMatches;
+
+    for (uint32_t i = 0; i < fEventList->GetNofEvents(); i++) {
+
+      if (fIdealModeFileId != -1 && fEventList->GetFileIdByIndex(i) != fIdealModeFileId) { continue; }
+      const double seedTime = fEventList->GetEventTimeByIndex(i);
+      fvSeedTimes->push_back(seedTime);
+
+      if (fQa) {
+        const uint32_t eventId = fEventList->GetEventIdByIndex(i);
+        const uint32_t fileId  = fEventList->GetFileIdByIndex(i);
+        CbmMatch eventMatch;
+        eventMatch.AddLink(1.0, 0, eventId, fileId);
+        eventMatches.push_back(eventMatch);
+      }
+    }
+    if (fQa) {
+      for (uint32_t i = 0; i < fvSeedTimes->size(); i++) {
+        fQa->FillQaInfo(i, i, &eventMatches, fvSeedTimes->at(i));
+      }
+    }
+    return;
+  }
+
   const int32_t nDigisTot = vIn->size();
   int32_t nDigisWin       = 0;
   int32_t winStartN       = 0;
   double winStartT        = -1111;
 
-  // Reset output array
-  fvSeedTimes->clear();
   //LOG(debug) << "CbmTaskBuildRawEvents::FillSeedTimesSlidingWindow:  digis in slice " << nDigisTot;
 
   for (int32_t i = 0; i < nDigisTot; i++) {
@@ -129,6 +161,14 @@ void CbmSeedFinderSlidingWindow::SetQa(bool doQA)
 void CbmSeedFinderSlidingWindow::Init()
 {
   if (fQa) { fQa->Init(); }
+
+  if (fbIdealMode) {
+    if (!FairRootManager::Instance() || !FairRootManager::Instance()->GetObject("MCEventList.")) {
+      LOG(error) << "No MC event list found";
+      return;
+    }
+    fEventList = (CbmMCEventList*) FairRootManager::Instance()->GetObject("MCEventList.");
+  }
 }
 
 void CbmSeedFinderSlidingWindow::OutputQa()
diff --git a/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.h b/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.h
index 9da592f29f31a711dcefcac5474ae3959537e2d3..e85bf76969b60489d02f1eeabfe7f216e9b9b262 100644
--- a/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.h
+++ b/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.h
@@ -26,6 +26,7 @@
 #include <vector>
 
 class CbmMatch;
+class CbmMCEventList;
 class CbmSeedFinderQa;
 
 class CbmSeedFinderSlidingWindow {
@@ -67,6 +68,15 @@ public:
    **/
   void SetOffset(double offset) { fdOffset = offset; }
 
+  /** @brief Switches to ``ideal mode'' in which event times from MC data are used as triggers
+   *  (no algorithm is run in this case)
+   **/
+  void SetIdealMode(const int32_t fileId = -1)
+  {
+    fbIdealMode      = true;
+    fIdealModeFileId = fileId;
+  }
+
   /** @brief Returns number of seed times currently stored in buffer. */
   size_t GetNofSeeds() { return fvSeedTimes->size(); }
 
@@ -90,6 +100,15 @@ private:
   /** @brief Global time offset which is applied to each trigger time. */
   double fdOffset = 0.;
 
+  /** @brief ``ideal mode'' uses MC truth as trigger times. */
+  bool fbIdealMode = false;
+
+  /** @brief If only a single file is to be used in ``ideal mode'' (-1 = all files). */
+  int32_t fIdealModeFileId = -1;
+
+  /** @brief To access MC truth in ``ideal mode''. */
+  CbmMCEventList* fEventList = nullptr;
+
   /** @brief Fetches time at position i of either a digi vector or vector of times. */
   template<class inType>
   double GetTime(const std::vector<inType>* vIn, int32_t i);
diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
index ff3447e72b9321f8cf935cfa228368d91122c8e3..658e741aeecf57d816f2c6210a4e30f327d27929 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
@@ -47,6 +47,12 @@ void CbmTaskBuildRawEvents::AddSeedTimeFillerToList(RawEventBuilderDetector seed
   fpAlgo->SetSeedTimes(fSeedTimes);
 }
 
+void CbmTaskBuildRawEvents::SetIdealSeedFinder(const int32_t fileId)
+{
+  SetSlidingWindowSeedFinder(1, 0.0, 0.0, 0.0);
+  fSeedFinderSlidingWindow->SetIdealMode(fileId);
+}
+
 void CbmTaskBuildRawEvents::SetSlidingWindowSeedFinder(int32_t minDigis, double dWindDur, double dDeadT, double dOffset)
 {
   if (fSeedFinderSlidingWindow) {
diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
index 4cc55893db5b80b3eb114298d229eb6d4be1357d..54c8b536767711e947ad0dc48dfac186b85b358d 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
@@ -123,6 +123,7 @@ public:
   void PrintTimings();
   void AddSeedTimeFillerToList(RawEventBuilderDetector seedDet);
   void SetSlidingWindowSeedFinder(int32_t minDigis, double dWindDur, double dDeadT, double dOffset = 0.0);
+  void SetIdealSeedFinder(const int32_t fileId = -1);
 
   void DumpSeedTimesFromDetList();
   void SetSeedTimeWindow(Double_t beg, Double_t end) { fpAlgo->SetSeedTimeWindow(beg, end); }