diff --git a/reco/detectors/tof/CbmTofEventClusterizer.cxx b/reco/detectors/tof/CbmTofEventClusterizer.cxx
index 22cab5bf42a29c0600b999804de0bcd268fdd3b3..6dcf94ae2b597421ba9c6a07fbe9909faaacfbd1 100644
--- a/reco/detectors/tof/CbmTofEventClusterizer.cxx
+++ b/reco/detectors/tof/CbmTofEventClusterizer.cxx
@@ -65,15 +65,17 @@
 #include "TROOT.h"
 #include "TRandom.h"
 #include "TRandom3.h"
+#include "TStopwatch.h"
 #include "TVector3.h"
 
 // Constants definitions
 #include "CbmTofClusterizersDef.h"
 
 // C++ Classes and includes
-// Globals
+#include <iomanip>
 #include <vector>
 
+// Globals
 static Int_t iIndexDut            = 0;
 // const  Double_t cLight=29.9792; // in cm/ns  (VF) not used
 static Int_t SelMask          = DetMask;
@@ -374,6 +376,10 @@ void CbmTofEventClusterizer::Exec(Option_t* option)
     LOG(info) << "New timeslice " << iNbTs << " with " << fEventsColl->GetEntriesFast() << " events, "
               << fDigiMan->GetNofDigis(ECbmModuleId::kTof) << " TOF digis + "
               << fDigiMan->GetNofDigis(ECbmModuleId::kT0) << " T0 digis ";
+
+    TStopwatch timerTs;
+    timerTs.Start();
+
     fiNbSkip1 = 0;
     fiNbSkip2 = 0;
     iNbTs++;
@@ -478,6 +484,23 @@ void CbmTofEventClusterizer::Exec(Option_t* option)
       //
       LOG(info) << "Total Skip2 Digi nb " << fiNbSkip2;
     }
+
+    /// PAL: add TS statistics for monitoring and perf evaluation
+    timerTs.Stop();
+    LOG(debug) << GetName() << "::Exec: real time=" << timerTs.RealTime() << " CPU time=" << timerTs.CpuTime();
+    fProcessTime += timerTs.RealTime();
+    fuNbDigis += fDigiMan->GetNofDigis(ECbmModuleId::kTof)    // TOF
+                 + fDigiMan->GetNofDigis(ECbmModuleId::kT0);  // T0
+    fuNbHits += fiHitStart;
+
+    std::stringstream logOut;
+    logOut << std::setw(20) << std::left << GetName() << " [";
+    logOut << std::fixed << std::setw(8) << std::setprecision(1) << std::right << timerTs.RealTime() * 1000. << " ms] ";
+    logOut << "TS " << iNbTs;
+    logOut << ", events " << fEventsColl->GetEntriesFast();
+    logOut << ", hits " << fiHitStart << ", time/1k-hit " << std::setprecision(4)
+           << timerTs.RealTime() * 1e6 / fiHitStart << " [ms]";
+    LOG(info) << logOut.str();
   }
   else {
     // fTofDigisColl=fTofRawDigisColl;
@@ -536,6 +559,21 @@ void CbmTofEventClusterizer::ExecEvent(Option_t* /*option*/, CbmEvent* tEvent)
 void CbmTofEventClusterizer::Finish()
 {
   LOG(info) << "Finish with " << fdEvent << " processed events";
+
+  /// PAL: add run statistics for monitoring and perf evaluation
+  LOG(info) << "=====================================";
+  LOG(info) << GetName() << ": Finish run";
+  LOG(info) << GetName() << ": Run summary ";
+  LOG(info) << GetName() << ": Processing time      : " << std::fixed << std::setprecision(3) << fProcessTime;
+  LOG(info) << GetName() << ": Nr of events         : " << fdEvent;
+  LOG(info) << GetName() << ": Nr of input digis    : " << fuNbDigis;
+  LOG(info) << GetName() << ": Nr of produced hits  : " << fuNbHits;
+  LOG(info) << GetName() << ": Nr of hits / event   : " << std::fixed << std::setprecision(2)
+            << (fdEvent > 0 ? fuNbHits / fdEvent : 0);
+  LOG(info) << GetName() << ": Nr of hits / digis   : " << std::fixed << std::setprecision(2)
+            << (fuNbDigis > 0 ? fuNbHits / (Double_t) fuNbDigis : 0);
+  LOG(info) << "=====================================";
+
   if (fdEvent < 100) return;  // don't save histos with insufficient statistics
   if (fDutId < 0) return;     // no histograms were produced
 
diff --git a/reco/detectors/tof/CbmTofEventClusterizer.h b/reco/detectors/tof/CbmTofEventClusterizer.h
index 85e01933ab06a071d375feb547df5ae501a6403c..b53f4d8aa2798e20db53d00f0c86c5147a9e07c1 100644
--- a/reco/detectors/tof/CbmTofEventClusterizer.h
+++ b/reco/detectors/tof/CbmTofEventClusterizer.h
@@ -465,6 +465,10 @@ private:
   Double_t fdEvent;
   Double_t fdStartAnalysisTime;
 
+  Double_t fProcessTime = 0.0;
+  uint64_t fuNbDigis    = 0;
+  uint64_t fuNbHits     = 0;
+
   Bool_t fbSwapChannelSides;
   Int_t fiOutputTreeEntry;
   Int_t fiFileIndex;
diff --git a/reco/tasks/CbmTaskMakeRecoEvents.cxx b/reco/tasks/CbmTaskMakeRecoEvents.cxx
index ad8503767b77852185c17a53fd54c7201ccab76b..dbfe50e11b4f33f762ec543e1152d953e9caa246 100644
--- a/reco/tasks/CbmTaskMakeRecoEvents.cxx
+++ b/reco/tasks/CbmTaskMakeRecoEvents.cxx
@@ -94,7 +94,7 @@ void CbmTaskMakeRecoEvents::Exec(Option_t*)
   logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << " ms] ";
   logOut << "TS " << fNumTs << ", events " << fDigiEvents->size() << ", Digis: T0 " << fT0Digis->size() << " STS "
          << fStsDigis->size() << " RICH " << fRichDigis->size() << " MUCH " << fMuchDigis->size() << " TRD "
-         << fTrdDigis->size() << " TOF " << fTofDigis->size() << " PSD" << fPsdDigis->size();
+         << fTrdDigis->size() << " TOF " << fTofDigis->size() << " PSD " << fPsdDigis->size();
   LOG(info) << logOut.str();
 
   // --- Run statistics