diff --git a/macro/run/run_reco.C b/macro/run/run_reco.C
index 3e6bac62d04b646bc50620f4d2206e470126eddc..6260b7401e69644c4020c7336806347038c869cd 100644
--- a/macro/run/run_reco.C
+++ b/macro/run/run_reco.C
@@ -283,7 +283,7 @@ void run_reco(TString input = "", Int_t nTimeSlices = -1, Int_t firstTimeSlice =
   // ------------------------------------------------------------------------
 
   // ----------- QA for raw event builder -----------------------------------
-  if (eventBased) {
+  if (eventBased && useMC) {
     CbmBuildEventsQA* evBuildQA = new CbmBuildEventsQA();
     run->AddTask(evBuildQA);
   }
@@ -372,7 +372,7 @@ void run_reco(TString input = "", Int_t nTimeSlices = -1, Int_t firstTimeSlice =
 
   // -----   Local reconstruction in TOF   ----------------------------------
   if (useTof) {
-    CbmTofSimpClusterizer* tofCluster = new CbmTofSimpClusterizer("TOF Simple Clusterizer", 0);
+    CbmTofSimpClusterizer* tofCluster = new CbmTofSimpClusterizer("TofSimpClusterizer", 0);
     tofCluster->SetOutputBranchPersistent("TofHit", kTRUE);
     tofCluster->SetOutputBranchPersistent("TofDigiMatch", kTRUE);
     run->AddTask(tofCluster);
diff --git a/reco/detectors/psd/CbmPsdHitProducer.cxx b/reco/detectors/psd/CbmPsdHitProducer.cxx
index fe2ab8d5bda0784578ad60789895de852541e770..f65ca867e0d8f94767d4eba0c79a7e1db78459d5 100644
--- a/reco/detectors/psd/CbmPsdHitProducer.cxx
+++ b/reco/detectors/psd/CbmPsdHitProducer.cxx
@@ -27,12 +27,14 @@ using std::endl;
 using std::fixed;
 using std::left;
 using std::pair;
+using std::right;
 using std::setprecision;
 using std::setw;
+using std::stringstream;
 
 
 // -----   Default constructor   -------------------------------------------
-CbmPsdHitProducer::CbmPsdHitProducer() : FairTask("Ideal Psd Hit Producer", 1), fXi(), fYi() {}
+CbmPsdHitProducer::CbmPsdHitProducer() : FairTask("PsdHitProducer", 1), fXi(), fYi() {}
 // -------------------------------------------------------------------------
 
 
@@ -145,13 +147,14 @@ void CbmPsdHitProducer::Exec(Option_t* /*opt*/)
 
   // --- Timeslice log and statistics
   timer.Stop();
-  if (fEvents)
-    LOG(info) << std::setw(20) << std::left << GetName() << fixed << setprecision(2) << " [" << timer.RealTime() * 1000.
-              << " ms] TS " << fNofTs << ", events " << nEvents << ", digis " << nDigis << " / " << nDigisAll
-              << ", hits " << nHits;
-  else
-    LOG(info) << std::setw(20) << std::left << GetName() << fixed << setprecision(2) << " [" << timer.RealTime() * 1000.
-              << " ms] TS " << fNofTs << ", digis " << nDigis << " / " << nDigisAll << ", hits " << nHits;
+  stringstream logOut;
+  logOut << setw(20) << left << GetName() << " [";
+  logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << " ms] ";
+  logOut << "TS " << fNofTs;
+  if (fEvents) logOut << ", events " << nEvents;
+  logOut << ", digis " << nDigis << " / " << nDigisAll;
+  logOut << ", hits " << nHits;
+  LOG(info) << logOut.str();
   fNofTs++;
   fNofEvents += nEvents;
   fNofDigis += nDigis;
diff --git a/reco/detectors/rich/CbmRichHitProducer.cxx b/reco/detectors/rich/CbmRichHitProducer.cxx
index b285815a516a5a71f4f42ed6907ae7c0e7cc38c6..722670b87789c97367ba6221fc27e63ee3ba9c2c 100644
--- a/reco/detectors/rich/CbmRichHitProducer.cxx
+++ b/reco/detectors/rich/CbmRichHitProducer.cxx
@@ -19,112 +19,122 @@
 #include <Logger.h>
 
 #include "TClonesArray.h"
+#include <TStopwatch.h>
 
+#include <iomanip>
 #include <iostream>
 
 using namespace std;
 
 
-CbmRichHitProducer::CbmRichHitProducer()
-  : FairTask("CbmRichHitProducer")
-  , fDigiMan(nullptr)
-  , fRichHits(NULL)
-  , fCbmEvents(NULL)
-  , fEventNum(0)
-  , fRotationNeeded(true)
-  , fHitError(0.6 / sqrt(12.))
+CbmRichHitProducer::CbmRichHitProducer() : FairTask("CbmRichHitProducer") {}
 
-{}
-
-CbmRichHitProducer::~CbmRichHitProducer() {
+CbmRichHitProducer::~CbmRichHitProducer()
+{
   FairRootManager* manager = FairRootManager::Instance();
   manager->Write();
 }
 
 void CbmRichHitProducer::SetParContainers() {}
 
-InitStatus CbmRichHitProducer::Init() {
+InitStatus CbmRichHitProducer::Init()
+{
   FairRootManager* manager = FairRootManager::Instance();
 
   fCbmEvents = dynamic_cast<TClonesArray*>(manager->GetObject("CbmEvent"));
-  if (fCbmEvents == nullptr) {
-    LOG(info) << ": CbmEvent NOT found \n \n \n";
-  } else {
+  if (fCbmEvents == nullptr) { LOG(info) << ": CbmEvent NOT found \n \n \n"; }
+  else {
     LOG(info) << ": CbmEvent found \n \n \n";
   }
 
   fDigiMan = CbmDigiManager::Instance();
   fDigiMan->Init();
-  if (!fDigiMan->IsPresent(ECbmModuleId::kRich)) {
-    Fatal("CbmRichHitProducer::Init", "No RichDigi array!");
-  }
+  if (!fDigiMan->IsPresent(ECbmModuleId::kRich)) { Fatal("CbmRichHitProducer::Init", "No RichDigi array!"); }
 
   fRichHits = new TClonesArray("CbmRichHit");
-  manager->Register(
-    "RichHit", "RICH", fRichHits, IsOutputBranchPersistent("RichHit"));
+  manager->Register("RichHit", "RICH", fRichHits, IsOutputBranchPersistent("RichHit"));
+
+  CbmRichDigiMapManager::GetInstance();
 
   return kSUCCESS;
 }
 
-void CbmRichHitProducer::Exec(Option_t* /*option*/) {
-  fEventNum++;
-  LOG(info) << "CbmRichHitProducer Event (or TimeSlice) " << fEventNum;
+void CbmRichHitProducer::Exec(Option_t* /*option*/)
+{
 
+  TStopwatch timer;
+  timer.Start();
+  Int_t nDigisAll  = fDigiMan->GetNofDigis(ECbmModuleId::kRich);
+  Int_t nDigisUsed = 0;
+  Int_t nEvents    = 0;
+  Int_t result     = 0;
   fRichHits->Delete();
 
-  // if CbmEvent does not exist then process standard event.
-  // if CbmEvent exists then proceed all events in time slice.
-  Int_t nUnits = (fCbmEvents != nullptr) ? fCbmEvents->GetEntriesFast() : 1;
+  // Time-slice processing
+  if (fCbmEvents == nullptr) nDigisUsed = ProcessData(nullptr);
 
-  for (Int_t iUnit = 0; iUnit < nUnits; iUnit++) {
-    CbmEvent* event = (fCbmEvents != nullptr)
-                        ? static_cast<CbmEvent*>(fCbmEvents->At(iUnit))
-                        : nullptr;
-    ProcessData(event);
+  // Event processing
+  else {
+    nEvents = fCbmEvents->GetEntriesFast();
+    for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) {
+      CbmEvent* event = static_cast<CbmEvent*>(fCbmEvents->At(iEvent));
+      result          = ProcessData(event);
+      nDigisUsed += result;
+    }
   }
+
+  timer.Stop();
+  stringstream logOut;
+  logOut << setw(20) << left << GetName() << " [";
+  logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << " ms] ";
+  logOut << "TS " << fNofTs;
+  if (fCbmEvents != nullptr) logOut << ", events " << nEvents;
+  logOut << ", digis " << nDigisUsed << " / " << nDigisAll;
+  LOG(info) << logOut.str();
+  fNofTs++;
+  fNofDigisAll += nDigisAll;
+  fNofDigisUsed += nDigisUsed;
+  fTime += timer.RealTime();
 }
 
-void CbmRichHitProducer::ProcessData(CbmEvent* event) {
+Int_t CbmRichHitProducer::ProcessData(CbmEvent* event)
+{
+  Int_t nDigis = 0;
   if (event != NULL) {
-    LOG(info) << "CbmRichHitProducer CbmEvent mode. CbmEvent # "
-              << event->GetNumber();
     Int_t nofDigis = event->GetNofData(ECbmDataType::kRichDigi);
-    LOG(info) << "nofDigis: " << nofDigis;
-
+    LOG(debug) << GetName() << ": Event mode. Event # " << event->GetNumber() << ", digis: " << nofDigis;
     for (Int_t iDigi = 0; iDigi < nofDigis; iDigi++) {
       Int_t digiIndex = event->GetIndex(ECbmDataType::kRichDigi, iDigi);
       ProcessDigi(event, digiIndex);
     }
-
-  } else {
-    for (Int_t iDigi = 0; iDigi < fDigiMan->GetNofDigis(ECbmModuleId::kRich);
-         iDigi++) {
+    nDigis = nofDigis;
+  }
+  else {
+    nDigis = fDigiMan->GetNofDigis(ECbmModuleId::kRich);
+    for (Int_t iDigi = 0; iDigi < fDigiMan->GetNofDigis(ECbmModuleId::kRich); iDigi++) {
       ProcessDigi(event, iDigi);
     }
   }
+  return nDigis;
 }
 
-void CbmRichHitProducer::ProcessDigi(CbmEvent* event, Int_t digiIndex) {
+void CbmRichHitProducer::ProcessDigi(CbmEvent* event, Int_t digiIndex)
+{
   const CbmRichDigi* digi = fDigiMan->Get<CbmRichDigi>(digiIndex);
   if (digi == nullptr) return;
   if (digi->GetAddress() < 0) return;
-  CbmRichPixelData* data =
-    CbmRichDigiMapManager::GetInstance().GetPixelDataByAddress(
-      digi->GetAddress());
+  CbmRichPixelData* data = CbmRichDigiMapManager::GetInstance().GetPixelDataByAddress(digi->GetAddress());
   TVector3 posPoint;
   posPoint.SetXYZ(data->fX, data->fY, data->fZ);
   TVector3 detPoint;
 
-  CbmRichGeoManager::GetInstance().RotatePoint(
-    &posPoint, &detPoint, !fRotationNeeded);
+  CbmRichGeoManager::GetInstance().RotatePoint(&posPoint, &detPoint, !fRotationNeeded);
   AddHit(event, detPoint, digi->GetTime(), digiIndex);
 }
 
 
-void CbmRichHitProducer::AddHit(CbmEvent* event,
-                                TVector3& posHit,
-                                Double_t time,
-                                Int_t index) {
+void CbmRichHitProducer::AddHit(CbmEvent* event, TVector3& posHit, Double_t time, Int_t index)
+{
   Int_t nofHits = fRichHits->GetEntriesFast();
   new ((*fRichHits)[nofHits]) CbmRichHit();
   CbmRichHit* hit = (CbmRichHit*) fRichHits->At(nofHits);
@@ -137,7 +147,19 @@ void CbmRichHitProducer::AddHit(CbmEvent* event,
   if (event != NULL) { event->AddData(ECbmDataType::kRichHit, nofHits); }
 }
 
-void CbmRichHitProducer::Finish() { fRichHits->Clear(); }
+void CbmRichHitProducer::Finish()
+{
+  fRichHits->Clear();
+  std::cout << std::endl;
+  LOG(info) << "=====================================";
+  LOG(info) << GetName() << ": Run summary";
+  LOG(info) << "Time slices     : " << fNofTs;
+  if (fCbmEvents) LOG(info) << "Events          : " << fNofEvents;
+  LOG(info) << "Digis      / TS : " << fixed << setprecision(2) << Double_t(fNofDigisAll) / Double_t(fNofTs);
+  LOG(info) << "Used digis / TS : " << fixed << setprecision(2) << Double_t(fNofDigisUsed) / Double_t(fNofTs);
+  LOG(info) << "Time       / TS : " << fixed << setprecision(2) << 1000. * fTime / Double_t(fNofTs) << " ms";
+  LOG(info) << "=====================================\n";
+}
 
 
 ClassImp(CbmRichHitProducer)
diff --git a/reco/detectors/rich/CbmRichHitProducer.h b/reco/detectors/rich/CbmRichHitProducer.h
index b877291051a2c29128e05f8ed4262000e770c0d5..e76d660734b3f3566f80864a170cc4e026089103 100644
--- a/reco/detectors/rich/CbmRichHitProducer.h
+++ b/reco/detectors/rich/CbmRichHitProducer.h
@@ -11,6 +11,7 @@
 #define CBM_RICH_HIT_PRODUCER
 
 #include "CbmRichRecGeoPar.h"
+
 #include "FairTask.h"
 
 #include <TClonesArray.h>  // for ROOTCLING
@@ -62,7 +63,7 @@ public:
   /**
      * Processblock of data either event-by-event or CbmEvent
      */
-  void ProcessData(CbmEvent* event);
+  Int_t ProcessData(CbmEvent* event);
 
   /**
      * Process RichDigi. CbmEvent can be NULL.
@@ -73,15 +74,19 @@ public:
 
 
 private:
-  CbmDigiManager* fDigiMan;  //!
-  TClonesArray* fRichHits;   // RICH hits
-  TClonesArray* fCbmEvents;  // CbmEvent for time-based simulations
+  CbmDigiManager* fDigiMan = nullptr;  //!
+  TClonesArray* fRichHits  = nullptr;  // RICH hits
+  TClonesArray* fCbmEvents = nullptr;  // CbmEvent for time-based simulations
 
-  Int_t fEventNum;  // event number
+  Int_t fNofTs           = 0;   // number of timeslices
+  Int_t fNofEvents       = 0;   // number of events
+  Long64_t fNofDigisAll  = 0;   // all digis in input
+  Long64_t fNofDigisUsed = 0;   // digis used for hit finding
+  Double_t fTime         = 0.;  // processing time
 
-  Bool_t fRotationNeeded;
+  Bool_t fRotationNeeded = kTRUE;
 
-  Double_t fHitError;
+  Double_t fHitError = 0.6 / sqrt(12);
 
   /**
      * \brief Add hit to the output array (and) CbmEvent if it is not NULL.
diff --git a/reco/detectors/sts/CbmRecoSts.cxx b/reco/detectors/sts/CbmRecoSts.cxx
index b20235041647956889227ed1c18be5917b6c03e7..211b8746f6b4b53796b838d83151048b2ca81bba 100644
--- a/reco/detectors/sts/CbmRecoSts.cxx
+++ b/reco/detectors/sts/CbmRecoSts.cxx
@@ -32,6 +32,7 @@ using std::left;
 using std::right;
 using std::setprecision;
 using std::setw;
+using std::stringstream;
 using std::vector;
 
 
@@ -130,29 +131,69 @@ UInt_t CbmRecoSts::CreateModules()
 void CbmRecoSts::Exec(Option_t*)
 {
 
-  // --- Clear output array
+  // --- Time
+  TStopwatch timer;
+  timer.Start();
+
+  // --- Clear hit output array
   fHits->Delete();
 
-  // --- Reset output array
+  // --- Reset cluster output array
   fClusters->Delete();
 
+  // --- Local variables
+  Int_t nEvents    = 0;
+  fNofDigis        = 0;
+  fNofDigisUsed    = 0;
+  fNofDigisIgnored = 0;
+  fNofClusters     = 0;
+  fNofHits         = 0;
+  fTimeTot         = 0.;
+  fTime1           = 0.;
+  fTime2           = 0.;
+  fTime3           = 0.;
+  fTime4           = 0.;
+  CbmEvent* event  = nullptr;
+
   // --- Time-slice mode: process entire array
   if (fMode == kCbmRecoTimeslice) ProcessData(nullptr);
 
   // --- Event mode: loop over events
   else {
     assert(fEvents);
-    Int_t nEvents = fEvents->GetEntriesFast();
-    LOG(info) << setw(20) << left << GetName() << ": Processing time slice " << fNofTimeslices << " with " << nEvents
-              << (nEvents == 1 ? " event" : " events");
+    nEvents = fEvents->GetEntriesFast();
+    LOG(debug) << setw(20) << left << GetName() << ": Processing time slice " << fNofTs << " with " << nEvents
+               << (nEvents == 1 ? " event" : " events");
     for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) {
-      CbmEvent* event = dynamic_cast<CbmEvent*>(fEvents->At(iEvent));
+      event = dynamic_cast<CbmEvent*>(fEvents->At(iEvent));
       assert(event);
       ProcessData(event);
     }  //# events
   }    //? event mode
 
-  fNofTimeslices++;
+  // --- Timeslice log
+  timer.Stop();
+  stringstream logOut;
+  logOut << setw(20) << left << GetName() << " [";
+  logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << " ms] ";
+  logOut << "TS " << fNofTs;
+  if (fEvents) logOut << ", events " << nEvents;
+  logOut << ", digis " << fNofDigisUsed << " / " << fNofDigis;
+  logOut << ", clusters " << fNofClusters << ", hits " << fNofHits;
+  LOG(info) << logOut.str();
+
+  // --- Update run counters
+  fNofTs++;
+  fNofEvents += nEvents;
+  fNofDigisRun += fNofDigis;
+  fNofDigisUsedRun += fNofDigisUsed;
+  fNofClustersRun += fNofClusters;
+  fNofHitsRun += fNofHits;
+  fTimeRun += fTimeTot;
+  fTime1Run += fTime1;
+  fTime2Run += fTime2;
+  fTime3Run += fTime3;
+  fTime4Run += fTime4;
 }
 // -------------------------------------------------------------------------
 
@@ -162,47 +203,34 @@ void CbmRecoSts::Finish()
 {
 
   std::cout << std::endl;
+  Double_t digiCluster = Double_t(fNofDigisUsed) / Double_t(fNofClusters);
+  Double_t clusterHit  = Double_t(fNofClusters) / Double_t(fNofHits);
   LOG(info) << "=====================================";
   LOG(info) << GetName() << ": Run summary";
-  LOG(info) << "Time slices            : " << fNofTimeslices;
-
-  // --- Time-slice mode
-  if (fMode == kCbmRecoTimeslice) {
-    LOG(info) << "Digis / TSlice         : " << fNofDigis / Double_t(fNofTimeslices);
-    LOG(info) << "Digis used / TSlice    : " << fNofDigisUsed / Double_t(fNofTimeslices);
-    LOG(info) << "Digis ignored / TSlice : " << fNofDigisIgnored / Double_t(fNofTimeslices);
-    LOG(info) << "Clusters / TSlice      : " << fNofClusters / Double_t(fNofTimeslices);
-    LOG(info) << "Hits / TSlice          : " << fNofHits / Double_t(fNofTimeslices);
-    LOG(info) << "Digis per cluster      : " << fNofDigisUsed / fNofClusters;
-    LOG(info) << "Clusters per hit       : " << fNofClusters / fNofHits;
-    LOG(info) << "Time per TSlice        : " << fTimeTot / Double_t(fNofTimeslices) << " s ";
-
-  }  //? time-slice mode
-
-  // --- Event-by-event mode
-  else {
-    LOG(info) << "Events                : " << fNofEvents;
-    LOG(info) << "Digis / event         : " << fNofDigis / Double_t(fNofEvents);
-    LOG(info) << "Digis used / event    : " << fNofDigisUsed / Double_t(fNofEvents);
-    LOG(info) << "Digis ignored / event : " << fNofDigisIgnored / Double_t(fNofEvents);
-    LOG(info) << "Clusters / event      : " << fNofClusters / Double_t(fNofEvents);
-    LOG(info) << "Digis per cluster     : " << fNofDigisUsed / fNofClusters;
-    LOG(info) << "Time per event        : " << fTimeTot / Double_t(fNofEvents) << " s ";
-  }  //? event mode
-
-  fTimeTot /= Double_t(fNofEvents);
-  fTime1 /= Double_t(fNofEvents);
-  fTime2 /= Double_t(fNofEvents);
-  fTime3 /= Double_t(fNofEvents);
-  fTime4 /= Double_t(fNofEvents);
-  LOG(info) << "Time Reset       : " << fixed << setprecision(1) << setw(6) << 1000. * fTime1 << " ms ("
-            << setprecision(1) << setw(4) << 100. * fTime1 / fTimeTot << " %)";
-  LOG(info) << "Time Distribute  : " << fixed << setprecision(1) << setw(6) << 1000. * fTime2 << " ms ("
-            << setprecision(1) << 100. * fTime2 / fTimeTot << " %)";
-  LOG(info) << "Time Reconstruct : " << fixed << setprecision(1) << setw(6) << 1000. * fTime3 << " ms ("
-            << setprecision(1) << setw(4) << 100. * fTime3 / fTimeTot << " %)";
-  LOG(info) << "Time Output      : " << fixed << setprecision(1) << setw(6) << 1000. * fTime4 << " ms ("
-            << setprecision(1) << setw(4) << 100. * fTime4 / fTimeTot << " %)";
+  LOG(info) << "Time slices            : " << fNofTs;
+  if (fMode == kCbmRecoEvent) LOG(info) << "Events                 : " << fNofEvents;
+  LOG(info) << "Digis / TSlice         : " << fixed << setprecision(2) << fNofDigisRun / Double_t(fNofTs);
+  LOG(info) << "Digis used / TSlice    : " << fixed << setprecision(2) << fNofDigisUsed / Double_t(fNofTs);
+  LOG(info) << "Digis ignored / TSlice : " << fixed << setprecision(2) << fNofDigisIgnored / Double_t(fNofTs);
+  LOG(info) << "Clusters / TSlice      : " << fixed << setprecision(2) << fNofClusters / Double_t(fNofTs);
+  LOG(info) << "Hits / TSlice          : " << fixed << setprecision(2) << fNofHits / Double_t(fNofTs);
+  LOG(info) << "Digis per cluster      : " << fixed << setprecision(2) << digiCluster;
+  LOG(info) << "Clusters per hit       : " << fixed << setprecision(2) << clusterHit;
+  LOG(info) << "Time per TSlice        : " << fixed << setprecision(2) << 1000. * fTimeRun / Double_t(fNofTs) << " s ";
+
+  fTimeRun /= Double_t(fNofEvents);
+  fTime1Run /= Double_t(fNofEvents);
+  fTime2Run /= Double_t(fNofEvents);
+  fTime3Run /= Double_t(fNofEvents);
+  fTime4Run /= Double_t(fNofEvents);
+  LOG(info) << "Time Reset       : " << fixed << setprecision(1) << setw(6) << 1000. * fTime1Run << " ms ("
+            << setprecision(1) << setw(4) << 100. * fTime1Run / fTimeRun << " %)";
+  LOG(info) << "Time Distribute  : " << fixed << setprecision(1) << setw(6) << 1000. * fTime2Run << " ms ("
+            << setprecision(1) << 100. * fTime2Run / fTimeRun << " %)";
+  LOG(info) << "Time Reconstruct : " << fixed << setprecision(1) << setw(6) << 1000. * fTime3Run << " ms ("
+            << setprecision(1) << setw(4) << 100. * fTime3Run / fTimeRun << " %)";
+  LOG(info) << "Time Output      : " << fixed << setprecision(1) << setw(6) << 1000. * fTime4Run << " ms ("
+            << setprecision(1) << setw(4) << 100. * fTime4Run / fTimeRun << " %)";
   LOG(info) << "=====================================";
 }
 // -------------------------------------------------------------------------
@@ -320,7 +348,6 @@ void CbmRecoSts::ProcessData(CbmEvent* event)
 
   // --- Reset all modules
   fTimer.Start();
-  Int_t nDigisGood    = 0;
   Int_t nDigisIgnored = 0;
   Int_t nClusters     = 0;
   Int_t nHits         = 0;
@@ -423,9 +450,8 @@ void CbmRecoSts::ProcessData(CbmEvent* event)
 
   // --- Bookkeeping
   Double_t realTime = time1 + time2 + time3 + time4;
-  fNofEvents++;
   fNofDigis += nDigis;
-  fNofDigisUsed += nDigisGood;
+  fNofDigisUsed += nDigis - nDigisIgnored;
   fNofDigisIgnored += nDigisIgnored;
   fNofClusters += nClusters;
   fNofHits += nHits;
@@ -437,14 +463,14 @@ void CbmRecoSts::ProcessData(CbmEvent* event)
 
   // --- Screen log
   if (event) {
-    LOG(info) << setw(20) << left << GetName() << "[" << fixed << setprecision(4) << realTime << " s] : Event " << right
-              << setw(6) << event->GetNumber() << ", digis: " << nDigis << ", ignored: " << nDigisIgnored
-              << ", clusters: " << nClusters << ", hits " << nHits;
+    LOG(debug) << setw(20) << left << GetName() << "[" << fixed << setprecision(4) << realTime << " s] : Event "
+               << right << setw(6) << event->GetNumber() << ", digis: " << nDigis << ", ignored: " << nDigisIgnored
+               << ", clusters: " << nClusters << ", hits " << nHits;
   }  //? event mode
   else {
-    LOG(info) << setw(20) << left << GetName() << "[" << fixed << setprecision(4) << realTime << " s] : TSlice "
-              << right << setw(6) << fNofTimeslices << ", digis: " << nDigis << ", ignored: " << nDigisIgnored
-              << ", clusters: " << nClusters << ", hits " << nHits;
+    LOG(debug) << setw(20) << left << GetName() << "[" << fixed << setprecision(4) << realTime << " s] : TSlice "
+               << right << setw(6) << fNofTs << ", digis: " << nDigis << ", ignored: " << nDigisIgnored
+               << ", clusters: " << nClusters << ", hits " << nHits;
   }
 }
 // -------------------------------------------------------------------------
diff --git a/reco/detectors/sts/CbmRecoSts.h b/reco/detectors/sts/CbmRecoSts.h
index 2eff777971943df57e72b7bc52bd8c0542ef1630..ec71914b81e234b9a7a913361a156857e9436ce7 100644
--- a/reco/detectors/sts/CbmRecoSts.h
+++ b/reco/detectors/sts/CbmRecoSts.h
@@ -275,21 +275,34 @@ private:
   Bool_t fWriteClusters        = kFALSE;         ///< Write clusters to tree
   Bool_t fRunParallel          = kFALSE;         ///< Use OpenMP multithreading
 
-  // --- Counters
-  TStopwatch fTimer {};            //! ROOT timer
-  Int_t fNofTimeslices      = 0;   ///< Number of time slices processed
-  Int_t fNofEvents          = 0;   ///< Number of events processed
-  Double_t fNofDigis        = 0;   ///< Total number of digis processed
-  Double_t fNofDigisUsed    = 0;   ///< Total number of used digis
-  Double_t fNofDigisIgnored = 0;   ///< Total number of ignored digis
-  Double_t fNofClusters     = 0;   ///< Total number of clusters produced
-  Double_t fNofHits         = 0;   ///< Total number of clusters produced
+  // --- Timeslice counters
+  Long64_t fNofDigis        = 0;   ///< Total number of digis processed
+  Long64_t fNofDigisUsed    = 0;   ///< Total number of used digis
+  Long64_t fNofDigisIgnored = 0;   ///< Total number of ignored digis
+  Long64_t fNofClusters     = 0;   ///< Total number of clusters produced
+  Long64_t fNofHits         = 0;   ///< Total number of clusters produced
   Double_t fTimeTot         = 0.;  ///< Total execution time
   Double_t fTime1           = 0.;  ///< Time for resetting modules
   Double_t fTime2           = 0.;  ///< Time for distributing data
   Double_t fTime3           = 0.;  ///< Time for reconstruction
   Double_t fTime4           = 0.;  ///< Time for output results
 
+  // --- Run counters
+  TStopwatch fTimer {};               //! ROOT timer
+  Int_t fNofTs                 = 0;   ///< Number of time slices processed
+  Int_t fNofEvents             = 0;   ///< Number of events processed
+  Double_t fNofDigisRun        = 0;   ///< Total number of digis processed
+  Double_t fNofDigisUsedRun    = 0;   ///< Total number of used digis
+  Double_t fNofDigisIgnoredRun = 0;   ///< Total number of ignored digis
+  Double_t fNofClustersRun     = 0;   ///< Total number of clusters produced
+  Double_t fNofHitsRun         = 0;   ///< Total number of clusters produced
+  Double_t fTimeRun            = 0.;  ///< Total execution time
+  Double_t fTime1Run           = 0.;  ///< Time for resetting modules
+  Double_t fTime2Run           = 0.;  ///< Time for distributing data
+  Double_t fTime3Run           = 0.;  ///< Time for reconstruction
+  Double_t fTime4Run           = 0.;  ///< Time for output results
+
+
   // --- Reconstruction modules
   std::map<UInt_t, CbmStsRecoModule*> fModules {};  //!
   std::vector<CbmStsRecoModule*> fModuleIndex {};   //!
diff --git a/reco/detectors/sts/CbmStsFindTracksEvents.cxx b/reco/detectors/sts/CbmStsFindTracksEvents.cxx
index 8112844df55df06e0e1b21e9e6f00c827578b794..2213bbd9d2bec17c984b132a4dcd44618887e361 100644
--- a/reco/detectors/sts/CbmStsFindTracksEvents.cxx
+++ b/reco/detectors/sts/CbmStsFindTracksEvents.cxx
@@ -9,17 +9,18 @@
 #include "CbmStsFindTracksEvents.h"
 
 #include "CbmEvent.h"
-#include <cassert>
-
 #include "CbmStsHit.h"
 #include "CbmStsTrack.h"
 #include "CbmStsTrackFinderIdeal.h"
 
+#include <cassert>
+
 // Includes from base
 #include "FairField.h"
 #include "FairRootManager.h"
 #include "FairRunAna.h"
 #include "FairRuntimeDb.h"
+#include <Logger.h>
 
 // Includes from ROOT
 #include "TClonesArray.h"
@@ -32,13 +33,14 @@ using std::cout;
 using std::endl;
 using std::fixed;
 using std::left;
+using std::pair;
 using std::right;
 using std::setprecision;
 using std::setw;
+using std::stringstream;
 
 // -----   Standard constructor   ------------------------------------------
-CbmStsFindTracksEvents::CbmStsFindTracksEvents(CbmStsTrackFinder* finder,
-                                               Bool_t useMvd)
+CbmStsFindTracksEvents::CbmStsFindTracksEvents(CbmStsTrackFinder* finder, Bool_t useMvd)
   : FairTask("StsFindTracksEvents")
   , fUseMvd(useMvd)
   , fFinder(finder)
@@ -50,14 +52,16 @@ CbmStsFindTracksEvents::CbmStsFindTracksEvents(CbmStsTrackFinder* finder,
   , fNofEvents(0)
   , fNofHits(0.)
   , fNofTracks(0.)
-  , fTime(0.) {
+  , fTime(0.)
+{
   if (!finder) fFinder = new CbmStsTrackFinderIdeal();
 }
 // -------------------------------------------------------------------------
 
 
 // -----   Destructor   ----------------------------------------------------
-CbmStsFindTracksEvents::~CbmStsFindTracksEvents() {
+CbmStsFindTracksEvents::~CbmStsFindTracksEvents()
+{
   fTracks->Delete();
   if (fFinder) delete fFinder;
 }
@@ -65,30 +69,59 @@ CbmStsFindTracksEvents::~CbmStsFindTracksEvents() {
 
 
 // -----   Task execution   ------------------------------------------------
-void CbmStsFindTracksEvents::Exec(Option_t* /*opt*/) {
+void CbmStsFindTracksEvents::Exec(Option_t* /*opt*/)
+{
+
+  // --- Local variables
+  Long64_t nEvents = 0;
+  Long64_t nHits   = 0;
+  Long64_t nTracks = 0;
+  pair<UInt_t, UInt_t> result;
+  TStopwatch timer;
+  timer.Start();
 
   // --- Clear output array
   fTracks->Delete();
 
   // --- Event loop (from event objects)
   if (fEvents) {
-    Int_t nEvents = fEvents->GetEntriesFast();
-    LOG(debug) << GetName() << ": reading time slice with " << nEvents
-               << " events ";
+    nEvents = fEvents->GetEntriesFast();
+    LOG(debug) << GetName() << ": reading time slice with " << nEvents << " events ";
     for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) {
       CbmEvent* event = static_cast<CbmEvent*>(fEvents->At(iEvent));
-      ProcessEvent(event);
+      result          = ProcessEvent(event);
+      nHits += result.first;
+      nTracks += result.second;
     }  //# events
   }    //? event branch present
 
-  else  // Old event-by-event simulation without event branch
-    ProcessEvent(NULL);
+  else {  // Timeslice reconstruction without events
+    ProcessEvent(nullptr);
+    nHits   = result.first;
+    nTracks = result.second;
+  }
+
+  // --- Timeslice log and statistics
+  timer.Stop();
+  stringstream logOut;
+  logOut << setw(20) << left << GetName() << " [";
+  logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << " ms] ";
+  logOut << "TS " << fNofTs;
+  if (fEvents) logOut << ", events " << nEvents;
+  logOut << ", hits " << nHits << ", tracks " << nTracks;
+  LOG(info) << logOut.str();
+  fNofTs++;
+  fNofEvents += nEvents;
+  fNofHits += nHits;
+  fNofTracks += nTracks;
+  fTime += timer.RealTime();
 }
 // -------------------------------------------------------------------------
 
 
 // -----   Initialisation   ------------------------------------------------
-InitStatus CbmStsFindTracksEvents::Init() {
+InitStatus CbmStsFindTracksEvents::Init()
+{
 
   LOG(info) << "=====================================";
   LOG(info) << GetName() << ": initialising";
@@ -99,9 +132,7 @@ InitStatus CbmStsFindTracksEvents::Init() {
 
   // --- Get input array (Events)
   fEvents = dynamic_cast<TClonesArray*>(ioman->GetObject("CbmEvent"));
-  if (nullptr == fEvents) {
-    LOG(warn) << GetName() << ": No event array! Will process entire tree.";
-  }
+  if (nullptr == fEvents) { LOG(warn) << GetName() << ": No event array! Will process entire tree."; }
 
   // --- Get input array (StsHits)
   fStsHits = (TClonesArray*) ioman->GetObject("StsHit");
@@ -111,17 +142,16 @@ InitStatus CbmStsFindTracksEvents::Init() {
   if (fUseMvd) {
     fMvdHits = (TClonesArray*) ioman->GetObject("MvdHit");
     if (fMvdHits == nullptr) {
-      LOG(error) << GetName()
-                 << ": Use of MVD hits selected, but no hit branch present! "
+      LOG(error) << GetName() << ": Use of MVD hits selected, but no hit branch present! "
                  << "Tracking will be done without MVD hits.";
-    } else
+    }
+    else
       LOG(info) << GetName() << ": including MVD hits in tracking";
   }
 
   // Create and register output array for StsTracks
   fTracks = new TClonesArray("CbmStsTrack", 100);
-  ioman->Register(
-    "StsTrack", "STS", fTracks, IsOutputBranchPersistent("StsTrack"));
+  ioman->Register("StsTrack", "STS", fTracks, IsOutputBranchPersistent("StsTrack"));
 
   // Check for Track finder
   if (!fFinder) {
@@ -146,22 +176,29 @@ InitStatus CbmStsFindTracksEvents::Init() {
 
 
 // -----   End-of-run action   ---------------------------------------------
-void CbmStsFindTracksEvents::Finish() {
+void CbmStsFindTracksEvents::Finish()
+{
   std::cout << std::endl;
   LOG(info) << "=====================================";
   LOG(info) << GetName() << ": Run summary";
-  LOG(info) << "Events processed   : " << fNofEvents;
-  LOG(info) << "Hits / event       : " << fNofHits / Double_t(fNofEvents);
-  LOG(info) << "Tracks / event     : " << fNofTracks / Double_t(fNofEvents);
-  LOG(info) << "Hits per track     : " << fNofHits / fNofTracks;
-  LOG(info) << "Time per event     : " << fTime / Double_t(fNofEvents) << " s ";
+  LOG(info) << "Time slices      : " << fNofTs;
+  LOG(info) << "Hits   / TS      : " << fixed << setprecision(2) << Double_t(fNofHits) / Double_t(fNofTs);
+  LOG(info) << "Tracks / TS      : " << fixed << setprecision(2) << Double_t(fNofTracks) / Double_t(fNofTs);
+  LOG(info) << "Hits per track   : " << fNofHits / fNofTracks;
+  LOG(info) << "Time per TS      : " << 1000. * fTime / Double_t(fNofTs) << " ms ";
+  if (fEvents) {
+    LOG(info) << "Events processed : " << fNofEvents;
+    LOG(info) << "Hits / event     : " << fNofHits / Double_t(fNofEvents);
+    LOG(info) << "Tracks / event   : " << fNofTracks / Double_t(fNofEvents);
+  }
   LOG(info) << "=====================================";
 }
 // -------------------------------------------------------------------------
 
 
 // ------   Process one event   --------------------------------------------
-void CbmStsFindTracksEvents::ProcessEvent(CbmEvent* event) {
+pair<UInt_t, UInt_t> CbmStsFindTracksEvents::ProcessEvent(CbmEvent* event)
+{
 
   // --- Call track finder
   fTimer.Start();
@@ -170,18 +207,11 @@ void CbmStsFindTracksEvents::ProcessEvent(CbmEvent* event) {
 
   // --- Event log
   Int_t eventNumber = (event ? event->GetNumber() : fNofEvents);
-  Int_t nHits       = (event ? event->GetNofData(ECbmDataType::kStsHit)
-                       : fStsHits->GetEntriesFast());
-  LOG(info) << "+ " << setw(20) << GetName() << ": Event " << setw(6) << right
-            << eventNumber << ", real time " << fixed << setprecision(6)
-            << fTimer.RealTime() << " s, hits: " << nHits
-            << ", tracks: " << nTracks;
-
-  // --- Counters
-  fNofEvents++;
-  fNofHits += Double_t(nHits);
-  fNofTracks += Double_t(nTracks);
-  fTime += fTimer.RealTime();
+  Int_t nHits       = (event ? event->GetNofData(ECbmDataType::kStsHit) : fStsHits->GetEntriesFast());
+  LOG(debug) << "+ " << setw(20) << GetName() << ": Event " << setw(6) << right << eventNumber << ", real time "
+             << fixed << setprecision(6) << fTimer.RealTime() << " s, hits: " << nHits << ", tracks: " << nTracks;
+
+  return std::make_pair(nHits, nTracks);
 }
 // -------------------------------------------------------------------------
 
diff --git a/reco/detectors/sts/CbmStsFindTracksEvents.h b/reco/detectors/sts/CbmStsFindTracksEvents.h
index 96289fd5ef167a6d9bb254edb74132f1b26dd029..4dc04688ba177b17c90826a2db9cde7726a3bdbc 100644
--- a/reco/detectors/sts/CbmStsFindTracksEvents.h
+++ b/reco/detectors/sts/CbmStsFindTracksEvents.h
@@ -9,7 +9,9 @@
 
 
 #include "CbmStsTrackFinder.h"
+
 #include "FairTask.h"
+
 #include "TStopwatch.h"
 
 
@@ -35,8 +37,7 @@ public:
    ** @param finder  Track finder engine. Default: Ideal track finder.
    ** @param useMvd  Include MVD hits in track finding. Default kFALSE.
    **/
-  CbmStsFindTracksEvents(CbmStsTrackFinder* finder = NULL,
-                         Bool_t useMvd             = kFALSE);
+  CbmStsFindTracksEvents(CbmStsTrackFinder* finder = NULL, Bool_t useMvd = kFALSE);
 
 
   /** Destructor **/
@@ -62,7 +63,8 @@ public:
   /** Set track finding engine
    ** @param finder  Pointer to track finding engine
    **/
-  void UseFinder(CbmStsTrackFinder* finder) {
+  void UseFinder(CbmStsTrackFinder* finder)
+  {
     if (fFinder) delete fFinder;
     fFinder = finder;
   };
@@ -76,6 +78,7 @@ private:
   TClonesArray* fStsHits;      //! Input array of STS hits
   TClonesArray* fTracks;       //! Output array of CbmStsTracks
   TStopwatch fTimer;           //! Timer
+  Int_t fNofTs = 0;            ///< Number of processed timeslices
   Int_t fNofEvents;            ///< Number of events with success
   Double_t fNofHits;           ///< Number of hits
   Double_t fNofTracks;         ///< Number of tracks created
@@ -90,8 +93,11 @@ private:
   virtual void Finish();
 
 
-  /** Process one event **/
-  void ProcessEvent(CbmEvent* event);
+  /** @brief Process one event or timeslice
+   ** @param event Pointer to event object. If null, entire timeslice is processed.
+   ** @return Number of input hits and output tracks
+   **/
+  std::pair<UInt_t, UInt_t> ProcessEvent(CbmEvent* event);
 
 
   /** Prevent usage of copy constructor and assignment operator **/
diff --git a/reco/detectors/tof/CbmTofSimpClusterizer.cxx b/reco/detectors/tof/CbmTofSimpClusterizer.cxx
index 3cb93a23f7ca699cb8e2b3bdb752cc7c650cf5d1..a2e0d313c45938a4768e7e94564a535f72cbf4d3 100644
--- a/reco/detectors/tof/CbmTofSimpClusterizer.cxx
+++ b/reco/detectors/tof/CbmTofSimpClusterizer.cxx
@@ -51,12 +51,15 @@
 
 // C++ Classes and includes
 #include <iomanip>
+#include <iostream>
 
 using std::fixed;
 using std::left;
 using std::pair;
+using std::right;
 using std::setprecision;
 using std::setw;
+using std::stringstream;
 
 // const Int_t DetMask = 4194303;  (VF) not used
 const Int_t nbClWalkBinX = 20;
@@ -373,14 +376,14 @@ void CbmTofSimpClusterizer::Exec(Option_t* /*option*/)
   fTimer.Stop();
 
   // --- Timeslice log
-  if (fEvents)
-    LOG(info) << std::setw(20) << std::left << GetName() << fixed << setprecision(2) << " ["
-              << fTimer.RealTime() * 1000. << " ms] TS " << fiNofTs << ", events " << nEvents << ", digis " << nDigis
-              << " / " << nDigisAll << ", hits " << nHits;
-  else
-    LOG(info) << std::setw(20) << std::left << GetName() << fixed << setprecision(2) << " ["
-              << fTimer.RealTime() * 1000. << " ms] TS " << fiNofTs << ", digis " << nDigis << " / " << nDigisAll
-              << ", hits " << nHits;
+  stringstream logOut;
+  logOut << setw(20) << left << GetName() << " [";
+  logOut << fixed << setw(8) << setprecision(1) << right << fTimer.RealTime() * 1000. << " ms] ";
+  logOut << "TS " << fiNofTs;
+  if (fEvents) logOut << ", events " << nEvents;
+  logOut << ", digis " << nDigis << " / " << nDigisAll;
+  logOut << ", hits " << nHits;
+  LOG(info) << logOut.str();
 
 
   // --- Update Counters
diff --git a/reco/detectors/trd/CbmTrdClusterFinder.cxx b/reco/detectors/trd/CbmTrdClusterFinder.cxx
index 40a92b48c0ffcb6abe5631a37a89439ed39e0cf0..9df01ca72065cc1c6a452df8c01b969e9e2dc50d 100644
--- a/reco/detectors/trd/CbmTrdClusterFinder.cxx
+++ b/reco/detectors/trd/CbmTrdClusterFinder.cxx
@@ -35,6 +35,13 @@
 
 #include <cmath>
 
+using std::fixed;
+using std::left;
+using std::right;
+using std::setprecision;
+using std::setw;
+using std::stringstream;
+
 
 Int_t CbmTrdClusterFinder::fgConfig            = 0;
 Float_t CbmTrdClusterFinder::fgMinimumChargeTH = .5e-06;
@@ -273,7 +280,12 @@ void CbmTrdClusterFinder::Exec(Option_t* /*option*/)
   fClusters->Delete();
 
   TStopwatch timer;
-  UInt_t nDigis = 0;
+  TStopwatch timerTs;
+  timerTs.Start();
+  Long64_t nDigisAll  = CbmDigiManager::Instance()->GetNofDigis(ECbmModuleId::kTrd);
+  Long64_t nDigisUsed = 0;
+  UInt_t nDigis       = 0;
+  UInt_t nEvents      = 0;
 
   if (UseOnlyEventDigis()) {
     for (auto eventobj : *fEvents) {
@@ -282,6 +294,8 @@ void CbmTrdClusterFinder::Exec(Option_t* /*option*/)
       nDigis     = addDigisToModules(event);
       processDigisInModules(nDigis, event);
       fNrEvents++;
+      nEvents++;
+      nDigisUsed += nDigis;
       timer.Stop();
       if (DoDebugPrintouts()) {
         LOG(info) << GetName() << "::Exec : Event Nr: " << fNrEvents;
@@ -297,6 +311,7 @@ void CbmTrdClusterFinder::Exec(Option_t* /*option*/)
     nDigis = addDigisToModules();
     processDigisInModules(nDigis);
     fNrEvents++;
+    nDigisUsed = nDigis;
     timer.Stop();
     if (DoDebugPrintouts()) {
       LOG(info) << GetName() << "::Exec : Event Nr: " << fNrEvents;
@@ -305,6 +320,16 @@ void CbmTrdClusterFinder::Exec(Option_t* /*option*/)
     fProcessTime += timer.RealTime();
     timer.Reset();
   }
+
+  timerTs.Stop();
+  stringstream logOut;
+  logOut << setw(20) << left << GetName() << " [";
+  logOut << fixed << setw(8) << setprecision(1) << right << timerTs.RealTime() * 1000. << " ms] ";
+  logOut << "TS " << fNrTs;
+  if (UseOnlyEventDigis()) logOut << ", events " << nEvents;
+  logOut << ", digis " << nDigisUsed << " / " << nDigisAll;
+  LOG(info) << logOut.str();
+  fNrTs++;
 }
 
 //_____________________________________________________________________
diff --git a/reco/detectors/trd/CbmTrdClusterFinder.h b/reco/detectors/trd/CbmTrdClusterFinder.h
index 4c8ac96027375953a5637915775b5c633ad3280c..f9f30eeca1ddfbc871d92fc0357bef606f4648ef 100644
--- a/reco/detectors/trd/CbmTrdClusterFinder.h
+++ b/reco/detectors/trd/CbmTrdClusterFinder.h
@@ -205,6 +205,9 @@ private:
   CbmTrdParSetGain* fGainPar                 = nullptr;  ///< parameter list for keV->ADC gain conversion
   CbmTrdParSetGeo* fGeoPar                   = nullptr;  ///< parameter list for modules geometry
 
+  /** @brief Number of processed time slices */
+  UInt_t fNrTs = 0;
+
   /** @brief Number of processed events (without CbmEvent corresponds to nr of exec calls) */
   UInt_t fNrEvents = 0;
 
diff --git a/reco/detectors/trd/CbmTrdHitProducer.cxx b/reco/detectors/trd/CbmTrdHitProducer.cxx
index 1962f1b4ddff10756d2c627ab268607767a5be2c..5d4fc302f618012bd4311c197fd17e1517b5fff1 100644
--- a/reco/detectors/trd/CbmTrdHitProducer.cxx
+++ b/reco/detectors/trd/CbmTrdHitProducer.cxx
@@ -32,6 +32,14 @@
 
 #include <iomanip>
 #include <map>
+
+using std::fixed;
+using std::left;
+using std::right;
+using std::setprecision;
+using std::setw;
+using std::stringstream;
+
 //____________________________________________________________________________________
 CbmTrdHitProducer::CbmTrdHitProducer() : FairTask("TrdHitProducer") {}
 
@@ -262,8 +270,12 @@ void CbmTrdHitProducer::Exec(Option_t*)
   fHits->Delete();
 
   TStopwatch timer;
+  TStopwatch timerTs;
+  timerTs.Start();
 
-  UInt_t hitCounter = 0;
+  Long64_t nClusters = fClusters->GetEntriesFast();
+  UInt_t hitCounter  = 0;
+  UInt_t nEvents     = 0;
 
   if (CbmTrdClusterFinder::UseOnlyEventDigis()) {
     for (auto eventobj : *fEvents) {
@@ -273,6 +285,7 @@ void CbmTrdHitProducer::Exec(Option_t*)
       if (!event) continue;
       hitCounter += processClusters(event);
       fNrEvents++;
+      nEvents++;
       timer.Stop();
       if (CbmTrdClusterFinder::DoDebugPrintouts()) {
         LOG(info) << GetName() << "::Exec : Event Nr: " << fNrEvents;
@@ -298,9 +311,19 @@ void CbmTrdHitProducer::Exec(Option_t*)
 
 
   timer.Stop();
+  timerTs.Stop();
   if (CbmTrdClusterFinder::DoDebugPrintouts())
     LOG(info) << GetName() << "::Exec: real time=" << timer.RealTime() << " CPU time=" << timer.CpuTime();
   fProcessTime += timer.RealTime();
+
+  stringstream logOut;
+  logOut << setw(20) << left << GetName() << " [";
+  logOut << fixed << setw(8) << setprecision(1) << right << timerTs.RealTime() * 1000. << " ms] ";
+  logOut << "TS " << fNrTs;
+  if (CbmTrdClusterFinder::UseOnlyEventDigis()) logOut << ", events " << nEvents;
+  logOut << ", clusters " << nClusters << ", hits " << hitCounter;
+  LOG(info) << logOut.str();
+  fNrTs++;
 }
 
 //____________________________________________________________________________________
diff --git a/reco/detectors/trd/CbmTrdHitProducer.h b/reco/detectors/trd/CbmTrdHitProducer.h
index 670ad864ccd1284bdb4e81ed116be2fc80e88707..ac98ee4a6970f8a9e7ab814ebb3b0910d2ce13fc 100644
--- a/reco/detectors/trd/CbmTrdHitProducer.h
+++ b/reco/detectors/trd/CbmTrdHitProducer.h
@@ -117,6 +117,9 @@ private:
   CbmTrdParSetGain* fGainPar                 = nullptr;  ///< parameter list for keV->ADC gain conversion
   CbmTrdParSetGeo* fGeoPar                   = nullptr;  ///< parameter list for modules geometry
 
+  /** @brief Number of processed time slices */
+  UInt_t fNrTs = 0;
+
   /** @brief Number of processed events (without CbmEvent corresponds to nr of exec calls) */
   UInt_t fNrEvents = 0;
 
diff --git a/reco/eventbuilder/digis/CbmBuildEventsIdeal.cxx b/reco/eventbuilder/digis/CbmBuildEventsIdeal.cxx
index 3f083a5a6dfb1f716b3ffb55579d69f025bd7f72..bad5ee7ddb82ddda00f3cff5a93578960dd0ddad 100644
--- a/reco/eventbuilder/digis/CbmBuildEventsIdeal.cxx
+++ b/reco/eventbuilder/digis/CbmBuildEventsIdeal.cxx
@@ -34,7 +34,8 @@ CbmBuildEventsIdeal::~CbmBuildEventsIdeal() {}
 
 
 // =====   Number if different pairs (input,event) in a match object   =======
-UInt_t CbmBuildEventsIdeal::EventsInMatch(const CbmMatch* match) {
+UInt_t CbmBuildEventsIdeal::EventsInMatch(const CbmMatch* match)
+{
 
   // --- No or empty match object
   if (match == nullptr) return 0;
@@ -56,7 +57,8 @@ UInt_t CbmBuildEventsIdeal::EventsInMatch(const CbmMatch* match) {
 
 
 // =====   Task execution   ==================================================
-void CbmBuildEventsIdeal::Exec(Option_t*) {
+void CbmBuildEventsIdeal::Exec(Option_t*)
+{
 
   // --- Timer and counters
   TStopwatch timer;
@@ -109,58 +111,51 @@ void CbmBuildEventsIdeal::Exec(Option_t*) {
       auto it         = eventMap.find(make_pair(mcInput, mcEvent));
       if (it == eventMap.end()) {
         assert(nEvents == fEvents->GetEntriesFast());
-        event = new ((*fEvents)[nEvents]) CbmEvent(nEvents);
+        event                                 = new ((*fEvents)[nEvents]) CbmEvent(nEvents);
         eventMap[make_pair(mcInput, mcEvent)] = event;
         nEvents++;
-      } else
+      }
+      else
         event = it->second;
 
       // --- Fill digi index into event
       switch (system) {
-        case ECbmModuleId::kMvd:
-          event->AddData(ECbmDataType::kMvdDigi, iDigi);
-          break;
-        case ECbmModuleId::kSts:
-          event->AddData(ECbmDataType::kStsDigi, iDigi);
-          break;
-        case ECbmModuleId::kRich:
-          event->AddData(ECbmDataType::kRichDigi, iDigi);
-          break;
-        case ECbmModuleId::kMuch:
-          event->AddData(ECbmDataType::kMuchDigi, iDigi);
-          break;
-        case ECbmModuleId::kTrd:
-          event->AddData(ECbmDataType::kTrdDigi, iDigi);
-          break;
-        case ECbmModuleId::kTof:
-          event->AddData(ECbmDataType::kTofDigi, iDigi);
-          break;
-        case ECbmModuleId::kPsd:
-          event->AddData(ECbmDataType::kPsdDigi, iDigi);
-          break;
+        case ECbmModuleId::kMvd: event->AddData(ECbmDataType::kMvdDigi, iDigi); break;
+        case ECbmModuleId::kSts: event->AddData(ECbmDataType::kStsDigi, iDigi); break;
+        case ECbmModuleId::kRich: event->AddData(ECbmDataType::kRichDigi, iDigi); break;
+        case ECbmModuleId::kMuch: event->AddData(ECbmDataType::kMuchDigi, iDigi); break;
+        case ECbmModuleId::kTrd: event->AddData(ECbmDataType::kTrdDigi, iDigi); break;
+        case ECbmModuleId::kTof: event->AddData(ECbmDataType::kTofDigi, iDigi); break;
+        case ECbmModuleId::kPsd: event->AddData(ECbmDataType::kPsdDigi, iDigi); break;
         default: break;
       }  //? detector
 
     }  //# digis
-    LOG(info) << GetName() << ": Detector "
-              << CbmModuleList::GetModuleNameCaps(system) << ", digis "
-              << nDigis << " (" << nAmbig << " ambiguous), noise " << nNoise;
+    LOG(debug) << GetName() << ": Detector " << CbmModuleList::GetModuleNameCaps(system) << ", digis " << nDigis << " ("
+               << nAmbig << " ambiguous), noise " << nNoise;
     nDigisTot += nDigis;
     nDigisAmbig += nAmbig;
     nDigisNoise += nNoise;
 
   }  //# detector systems
 
-  timer.Stop();
   assert(nEvents == fEvents->GetEntriesFast());
 
-  // --- Execution log
-  std::cout << std::endl;
-  Double_t execTime = 1000. * timer.RealTime();
-  LOG(info) << setw(20) << left << GetName() << "[" << fixed << setprecision(4)
-            << execTime << " ms] : TSlice " << right << fNofEntries
-            << ", events: " << nEvents << ", digis: " << nDigisTot << " ("
-            << nDigisAmbig << " ambiguous), noise: " << nDigisNoise;
+  // --- Timeslice log and statistics
+  timer.Stop();
+  stringstream logOut;
+  logOut << setw(20) << left << GetName() << " [";
+  logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << "] ms: ";
+  logOut << "TS " << fNofEntries;
+  if (fEvents) logOut << ", events " << nEvents;
+  logOut << ", digis " << nDigisTot << " (" << nDigisAmbig << " ambiguous), noise: " << nDigisNoise;
+  LOG(info) << logOut.str();
+  fNofEntries++;
+  fNofEvents += nEvents;
+  fNofDigisTotal += nDigisTot;
+  fNofDigisAmbig += nDigisAmbig;
+  fNofDigisNoise += nDigisNoise;
+  fTime += timer.RealTime();
 
   // --- For debug: event info
   if (fair::Logger::Logging(fair::Severity::debug)) {
@@ -169,14 +164,33 @@ void CbmBuildEventsIdeal::Exec(Option_t*) {
       LOG(info) << event->ToString();
     }
   }
-
-  fNofEntries++;
 }
 // ===========================================================================
 
 
+// =====   End-of-timeslice action   =========================================
+void CbmBuildEventsIdeal::Finish()
+{
+
+  std::cout << std::endl;
+  LOG(info) << "=====================================";
+  LOG(info) << GetName() << ": Run summary";
+  LOG(info) << "Time slices          : " << fNofEntries;
+  LOG(info) << "All digis       / TS : " << fixed << setprecision(2) << fNofDigisTotal / Double_t(fNofEntries);
+  LOG(info) << "Ambiguous digis / TS : " << fixed << setprecision(2) << fNofDigisAmbig / Double_t(fNofEntries) << " = "
+            << 100. * fNofDigisAmbig / fNofDigisTotal << " %";
+  LOG(info) << "Noise digis     / TS : " << fixed << setprecision(2) << fNofDigisNoise / Double_t(fNofEntries) << " = "
+            << 100. * fNofDigisNoise / fNofDigisTotal << " %";
+  LOG(info) << "Events               : " << fNofEvents;
+  LOG(info) << "Time  / TS           : " << fixed << setprecision(2) << 1000. * fTime / Double_t(fNofEntries) << " ms";
+  LOG(info) << "=====================================";
+}
+// -------------------------------------------------------------------------
+
+
 // =====   Task initialisation   =============================================
-InitStatus CbmBuildEventsIdeal::Init() {
+InitStatus CbmBuildEventsIdeal::Init()
+{
 
   // --- Get FairRootManager instance
   FairRootManager* ioman = FairRootManager::Instance();
@@ -192,12 +206,9 @@ InitStatus CbmBuildEventsIdeal::Init() {
 
 
   // --- Check input data
-  for (ECbmModuleId system = ECbmModuleId::kMvd;
-       system < ECbmModuleId::kNofSystems;
-       ++system) {
+  for (ECbmModuleId system = ECbmModuleId::kMvd; system < ECbmModuleId::kNofSystems; ++system) {
     if (fDigiMan->IsMatchPresent(system)) {
-      LOG(info) << GetName() << ": Found match branch for "
-                << CbmModuleList::GetModuleNameCaps(system);
+      LOG(info) << GetName() << ": Found match branch for " << CbmModuleList::GetModuleNameCaps(system);
       fSystems.push_back(system);
     }
   }
@@ -212,8 +223,7 @@ InitStatus CbmBuildEventsIdeal::Init() {
     return kFATAL;
   }
   fEvents = new TClonesArray("CbmEvent", 100);
-  ioman->Register(
-    "CbmEvent", "Cbm_Event", fEvents, IsOutputBranchPersistent("CbmEvent"));
+  ioman->Register("CbmEvent", "Cbm_Event", fEvents, IsOutputBranchPersistent("CbmEvent"));
   if (!fEvents) {
     LOG(fatal) << GetName() << ": Output branch could not be created!";
     return kFATAL;
diff --git a/reco/eventbuilder/digis/CbmBuildEventsIdeal.h b/reco/eventbuilder/digis/CbmBuildEventsIdeal.h
index f093135592700e6fcfb6ff05108ddaffdd6beb27..7e59b2ecd4f1d226d9707e119b0e3cc9d737dcc6 100644
--- a/reco/eventbuilder/digis/CbmBuildEventsIdeal.h
+++ b/reco/eventbuilder/digis/CbmBuildEventsIdeal.h
@@ -9,7 +9,9 @@
 
 
 #include "CbmDefs.h"
+
 #include <FairTask.h>
+
 #include <vector>
 
 class TClonesArray;
@@ -46,6 +48,9 @@ public:
   /** @brief Task execution **/
   virtual void Exec(Option_t* opt);
 
+  /** @brief Finish timeslice **/
+  virtual void Finish();
+
   /** @brief Assignment operator (disabled) **/
   CbmBuildEventsIdeal& operator=(const CbmBuildEventsIdeal&) = delete;
 
@@ -62,8 +67,13 @@ private:  // methods
 private:                                  // members
   CbmDigiManager* fDigiMan = nullptr;     //!
   std::vector<ECbmModuleId> fSystems {};  //  List of detector systems
-  TClonesArray* fEvents = nullptr;        //! Output array (class CbmEvent)
-  Int_t fNofEntries     = 0;              //  Number of processed time slices
+  TClonesArray* fEvents   = nullptr;      //! Output array (class CbmEvent)
+  Int_t fNofEntries       = 0;            //  Number of processed time slices
+  Long64_t fNofEvents     = 0;
+  Double_t fNofDigisTotal = 0.;
+  Double_t fNofDigisAmbig = 0.;
+  Double_t fNofDigisNoise = 0.;
+  Double_t fTime          = 0.;
 
 
   ClassDef(CbmBuildEventsIdeal, 3);
diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
index 38ed5dae023f7643df563cc8a988da14881f993e..df10ef3f62539ada3a1077a707351c014d1b1446 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
@@ -24,7 +24,18 @@
 
 #include <iomanip>
 
-CbmTaskBuildRawEvents::CbmTaskBuildRawEvents() : FairTask("CbmTaskBuildRawEvents")
+using std::cout;
+using std::endl;
+using std::fixed;
+using std::left;
+using std::pair;
+using std::right;
+using std::setprecision;
+using std::setw;
+using std::stringstream;
+
+
+CbmTaskBuildRawEvents::CbmTaskBuildRawEvents() : FairTask("BuildRawEvents")
 {
   /// Create Algo. To be made generic/switchable when more event building algo are available!
   fpAlgo = new CbmAlgoBuildRawEvents();
@@ -169,6 +180,8 @@ InitStatus CbmTaskBuildRawEvents::ReInit() { return kSUCCESS; }
 void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
 {
   if (fTimer != nullptr) { fTimer->Start(kFALSE); }
+  TStopwatch timer;
+  timer.Start();
 
   LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Starting sequence";
   //Warning: Int_t must be used for the loop counters instead of UInt_t,
@@ -281,6 +294,18 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
   LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Done";
 
   if (fTimer != nullptr) { fTimer->Stop(); }
+
+  // --- Timeslice log and statistics
+  timer.Stop();
+  stringstream logOut;
+  logOut << setw(20) << left << GetName() << " [";
+  logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << " ms] ";
+  logOut << "TS " << fNofTs;
+  if (fEvents) logOut << ", events " << fEvents->GetEntriesFast();
+  LOG(info) << logOut.str();
+  fNofTs++;
+  fNofEvents += fEvents->GetEntriesFast();
+  fTime += timer.RealTime();
 }
 
 void CbmTaskBuildRawEvents::FillSeedTimesFromDetList()
@@ -401,6 +426,14 @@ void CbmTaskBuildRawEvents::Finish()
   fpAlgo->Finish();
   if (fbFillHistos) { SaveHistos(); }
   if (fbGetTimings) { PrintTimings(); }
+
+  std::cout << std::endl;
+  LOG(info) << "=====================================";
+  LOG(info) << GetName() << ": Run summary";
+  LOG(info) << "Time slices          : " << fNofTs;
+  LOG(info) << "Events               : " << fNofEvents;
+  LOG(info) << "Time  / TS           : " << fixed << setprecision(2) << 1000. * fTime / Double_t(fNofTs) << " ms";
+  LOG(info) << "=====================================";
 }
 
 void CbmTaskBuildRawEvents::FillOutput()
diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
index 62adf739004c26b56b3957f7f256b140ddfc3a98..e639ac3eb3d8de726dd8cf0053a8d7bf469d898f 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
@@ -167,6 +167,10 @@ private:
   /** Name of the histogram output file **/
   TString fsOutFileName {"data/HistosEvtWin.root"};
 
+  Int_t fNofTs        = 0;
+  Long64_t fNofEvents = 0;
+  Double_t fTime      = 0.;
+
   ClassDef(CbmTaskBuildRawEvents, 1);
 };
 
diff --git a/reco/global/CbmFindPrimaryVertex.cxx b/reco/global/CbmFindPrimaryVertex.cxx
index ccbba618a316b9af43b2a48d9798e0d93ef08692..e882246617303ade212926c7bc480d7c5cf83b15 100644
--- a/reco/global/CbmFindPrimaryVertex.cxx
+++ b/reco/global/CbmFindPrimaryVertex.cxx
@@ -154,13 +154,13 @@ void CbmFindPrimaryVertex::Exec(Option_t*)
 
   // Log to screen
   timer.Stop();
-  if (fEvents)
-    LOG(info) << std::setw(20) << std::left << GetName() << fixed << setprecision(2) << " [" << timer.RealTime() * 1000.
-              << " ms]: TS " << fNofTs << ", events " << nEvents << ", tracks used " << nTracksUsed << " / " << nTracks;
-  else
-    LOG(info) << std::setw(20) << std::left << GetName() << fixed << setprecision(2) << " [" << timer.RealTime() * 1000.
-              << " ms] TS " << fNofTs << ", vertex " << fPrimVert->ToString() << ", tracks used " << nTracksUsed
-              << " / " << nTracks;
+  stringstream logOut;
+  logOut << setw(20) << left << GetName() << " [";
+  logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << " ms] ";
+  logOut << "TS " << fNofTs;
+  if (fEvents) logOut << ", events " << nEvents;
+  logOut << ", tracks used " << nTracksUsed << " / " << nTracks;
+  LOG(info) << logOut.str();
 
   // Counters
   fNofTs++;
diff --git a/reco/littrack/cbm/reco/CbmLitFindGlobalTracks.cxx b/reco/littrack/cbm/reco/CbmLitFindGlobalTracks.cxx
index 685a351ded717941a7cfc90929f69924201e8a43..6a86deac90a9cee43579e4605a6f52f1b82b1209 100644
--- a/reco/littrack/cbm/reco/CbmLitFindGlobalTracks.cxx
+++ b/reco/littrack/cbm/reco/CbmLitFindGlobalTracks.cxx
@@ -5,15 +5,6 @@
  **/
 
 #include "CbmLitFindGlobalTracks.h"
-#include "base/CbmLitToolFactory.h"
-#include "base/CbmLitTrackingGeometryConstructor.h"
-#include "data/CbmLitHit.h"
-#include "data/CbmLitPixelHit.h"
-#include "data/CbmLitStripHit.h"
-#include "data/CbmLitTrack.h"
-#include "propagation/CbmLitTGeoTrackPropagator.h"
-#include "utils/CbmLitConverter.h"
-#include "utils/CbmLitMemoryManagment.h"
 
 #include "CbmGlobalTrack.h"
 #include "CbmHit.h"
@@ -25,15 +16,37 @@
 #include "CbmStsTrack.h"
 #include "CbmTofTrack.h"
 #include "CbmTrdTrack.h"
+#include "base/CbmLitToolFactory.h"
+#include "base/CbmLitTrackingGeometryConstructor.h"
+#include "data/CbmLitHit.h"
+#include "data/CbmLitPixelHit.h"
+#include "data/CbmLitStripHit.h"
+#include "data/CbmLitTrack.h"
+#include "propagation/CbmLitTGeoTrackPropagator.h"
+#include "utils/CbmLitConverter.h"
+#include "utils/CbmLitMemoryManagment.h"
+
 #include "FairRootManager.h"
 
 #include "TClonesArray.h"
 
-#include <cmath>
+#include <iomanip>
 #include <iostream>
 
+#include <cmath>
+
+using std::cout;
+using std::endl;
+using std::fixed;
+using std::left;
+using std::pair;
+using std::right;
+using std::setprecision;
+using std::setw;
+using std::stringstream;
+
 CbmLitFindGlobalTracks::CbmLitFindGlobalTracks()
-  : FairTask("CbmLitFindGlobalTracks")
+  : FairTask("LitFindGlobalTracks")
   , fDet()
   ,
 
@@ -73,11 +86,14 @@ CbmLitFindGlobalTracks::CbmLitFindGlobalTracks()
   , fMergerWatch()
   ,
 
-  fEventNo(0) {}
+  fEventNo(0)
+{
+}
 
 CbmLitFindGlobalTracks::~CbmLitFindGlobalTracks() {}
 
-InitStatus CbmLitFindGlobalTracks::Init() {
+InitStatus CbmLitFindGlobalTracks::Init()
+{
   std::cout << std::endl;
   LOG(info) << "=========================================";
   LOG(info) << GetName() << ": Initializing ";
@@ -97,16 +113,32 @@ InitStatus CbmLitFindGlobalTracks::Init() {
   return kSUCCESS;
 }
 
-void CbmLitFindGlobalTracks::Exec(Option_t* opt) {
+void CbmLitFindGlobalTracks::Exec(Option_t* opt)
+{
+
+  UInt_t nEvents    = 0;
+  UInt_t nStsTracks = 0;
+  UInt_t nMuchHits  = 0;
+  UInt_t nTrdHits   = 0;
+  UInt_t nTofHits   = 0;
+  UInt_t nGlbTracks = 0;
+
+  if (fStsTracks) nStsTracks = fStsTracks->GetEntriesFast();
+  if (fMuchPixelHits) nMuchHits = fMuchPixelHits->GetEntriesFast();
+  if (fTrdHits) nTrdHits = fTrdHits->GetEntriesFast();
+  if (fTofHits) nTofHits = fTofHits->GetEntriesFast();
+
+  TStopwatch timer;
+  timer.Start();
+
   if (fTrdTracks != NULL) fTrdTracks->Delete();
   if (fMuchTracks != NULL) fMuchTracks->Delete();
   if (fTofTracks != NULL) fTofTracks->Delete();
   fGlobalTracks->Clear();
 
   if (fEvents) {
-    Int_t nEvents = fEvents->GetEntriesFast();
-    LOG(debug) << GetName() << ": reading time slice with " << nEvents
-               << " events ";
+    nEvents = fEvents->GetEntriesFast();
+    LOG(debug) << GetName() << ": reading time slice with " << nEvents << " events ";
 
     for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) {
       CbmEvent* event = static_cast<CbmEvent*>(fEvents->At(iEvent));
@@ -116,8 +148,7 @@ void CbmLitFindGlobalTracks::Exec(Option_t* opt) {
       CalculateLength(event);
       CalculatePrimaryVertexParameters(event);
       ClearArrays();
-      std::cout << "CbmLitFindGlobalTracks::Exec event: " << event->GetNumber()
-                << std::endl;
+      LOG(debug) << "CbmLitFindGlobalTracks::Exec event: " << event->GetNumber();
     }     //# events
   }       //? event branch present
   else {  // Old event-by-event simulation without event branch
@@ -127,16 +158,59 @@ void CbmLitFindGlobalTracks::Exec(Option_t* opt) {
     CalculateLength(0);
     CalculatePrimaryVertexParameters(0);
     ClearArrays();
-    std::cout << "CbmLitFindGlobalTracks::Exec event: " << fEventNo++
-              << std::endl;
+    LOG(debug) << "CbmLitFindGlobalTracks::Exec timeslice: " << fEventNo++;
   }
+
+  // --- Timeslice log and statistics
+  timer.Stop();
+  nGlbTracks = fGlobalTracks->GetEntriesFast();
+  timer.Stop();
+  stringstream logOut;
+  logOut << setw(20) << left << GetName() << " [";
+  logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << " ms] ";
+  logOut << "TS " << fNofTs;
+  if (fEvents) logOut << ", events " << nEvents;
+  logOut << ", STS tracks " << nStsTracks << ", Hits MUCH " << nMuchHits << " TRD " << nTrdHits;
+  logOut << " TOF " << nTofHits << ", global tracks " << nGlbTracks;
+  LOG(info) << logOut.str();
+  fNofTs++;
+  fNofEvents += nEvents;
+  fNofStsTracks += nStsTracks;
+  fNofMuchHits += nMuchHits;
+  fNofTrdHits += nTrdHits;
+  fNofTofHits += nTofHits;
+  fNofGlbTracks += nGlbTracks;
+  fTime += timer.RealTime();
 }
 
+
 void CbmLitFindGlobalTracks::SetParContainers() {}
 
-void CbmLitFindGlobalTracks::Finish() { PrintStopwatchStatistics(); }
+void CbmLitFindGlobalTracks::Finish()
+{
 
-void CbmLitFindGlobalTracks::ReadInputBranches() {
+  std::cout << std::endl;
+  LOG(info) << "=====================================";
+  LOG(info) << GetName() << ": Run summary";
+  LOG(info) << "Time slices         : " << fNofTs;
+  LOG(info) << "STS tracks   / TS   : " << fixed << setprecision(2) << Double_t(fNofStsTracks) / Double_t(fNofTs);
+  LOG(info) << "MUCH hits / TS      : " << fixed << setprecision(2) << Double_t(fNofMuchHits) / Double_t(fNofTs);
+  LOG(info) << "TRD hits / TS       : " << fixed << setprecision(2) << Double_t(fNofTrdHits) / Double_t(fNofTs);
+  LOG(info) << "TOF hits / TS       : " << fixed << setprecision(2) << Double_t(fNofTofHits) / Double_t(fNofTs);
+  LOG(info) << "Global tracks / TS  : " << fixed << setprecision(2) << Double_t(fNofGlbTracks) / Double_t(fNofTs);
+  ;
+  LOG(info) << "Time per TS         : " << 1000. * fTime / Double_t(fNofTs) << " ms ";
+  if (fEvents) {
+    LOG(info) << "Events processed    : " << fNofEvents;
+    LOG(info) << "Global tracks / evt : " << Double_t(fNofGlbTracks) / Double_t(fNofEvents);
+  }
+  PrintStopwatchStatistics();
+  LOG(info) << "=====================================";
+}
+
+
+void CbmLitFindGlobalTracks::ReadInputBranches()
+{
   FairRootManager* ioman = FairRootManager::Instance();
   assert(ioman);
 
@@ -146,7 +220,8 @@ void CbmLitFindGlobalTracks::ReadInputBranches() {
     if (!fMvdHits) {
       LOG(warn) << GetName() << ": No MvdHit branch!";
       fDet.SetDet(ECbmModuleId::kMvd, false);
-    } else
+    }
+    else
       LOG(info) << GetName() << ": Found MvdHit branch";
   }  //? MVD in geometry
 
@@ -155,7 +230,8 @@ void CbmLitFindGlobalTracks::ReadInputBranches() {
   if (!fStsHits) {
     LOG(FATAL) << GetName() << ": No StsHit branch!";
     fDet.SetDet(ECbmModuleId::kSts, false);
-  } else
+  }
+  else
     LOG(INFO) << GetName() << ": Found StsHit branch";
 
   // --- STS tracks
@@ -163,19 +239,19 @@ void CbmLitFindGlobalTracks::ReadInputBranches() {
   if (!fStsTracks) {
     LOG(FATAL) << GetName() << ": No StsTrack branch!";
     fDet.SetDet(ECbmModuleId::kSts, false);
-  } else
+  }
+  else
     LOG(INFO) << GetName() << ": Found StsTrack branch";
 
   // --- MUCH hits
   if (fDet.GetDet(ECbmModuleId::kMuch)) {
-    fMuchPixelHits =
-      dynamic_cast<TClonesArray*>(ioman->GetObject("MuchPixelHit"));
+    fMuchPixelHits = dynamic_cast<TClonesArray*>(ioman->GetObject("MuchPixelHit"));
     if (!fMuchPixelHits) {
       LOG(WARNING) << GetName() << "No MuchPixelHit branch!";
       fDet.SetDet(ECbmModuleId::kMuch, false);
-    } else {
-      if (fMuchPixelHits)
-        LOG(INFO) << GetName() << ": Found MuchPixelHit branch";
+    }
+    else {
+      if (fMuchPixelHits) LOG(INFO) << GetName() << ": Found MuchPixelHit branch";
     }
   }  //? MUCH in geometry
 
@@ -195,82 +271,76 @@ void CbmLitFindGlobalTracks::ReadInputBranches() {
     if (NULL == fTofHits) {
       LOG(WARNING) << GetName() << ": No TofHit branch!";
       fDet.SetDet(ECbmModuleId::kTof, false);
-    } else
+    }
+    else
       LOG(INFO) << GetName() << ": Found TofHit branch";
   }  //? TOF in geometry
 
   // --- Events
   fEvents = dynamic_cast<TClonesArray*>(ioman->GetObject("CbmEvent"));
-  if (fEvents)
-    LOG(INFO) << GetName() << ": Found Event branch";
+  if (fEvents) LOG(INFO) << GetName() << ": Found Event branch";
   else
     LOG(INFO) << GetName() << ": No Event branch; run in time-based mode";
 
   // --- Primary vertex
   fPrimVertex = dynamic_cast<CbmVertex*>(ioman->GetObject("PrimaryVertex."));
-  if (nullptr == fPrimVertex) {
-    fPrimVertex = dynamic_cast<CbmVertex*>(ioman->GetObject("PrimaryVertex"));
-  }
-  if (nullptr == fPrimVertex)
-    LOG(WARNING) << GetName() << ": No PrimaryVertex branch!";
+  if (nullptr == fPrimVertex) { fPrimVertex = dynamic_cast<CbmVertex*>(ioman->GetObject("PrimaryVertex")); }
+  if (nullptr == fPrimVertex) LOG(WARNING) << GetName() << ": No PrimaryVertex branch!";
   else
     LOG(INFO) << GetName() << ": Found PrimaryVertex branch";
 }
 
-void CbmLitFindGlobalTracks::RegisterOutputBranches() {
+void CbmLitFindGlobalTracks::RegisterOutputBranches()
+{
   FairRootManager* ioman = FairRootManager::Instance();
   assert(ioman);
 
   // --- MuchTrack
   if (fDet.GetDet(ECbmModuleId::kMuch)) {
     fMuchTracks = new TClonesArray("CbmMuchTrack", 100);
-    ioman->Register(
-      "MuchTrack", "Much", fMuchTracks, IsOutputBranchPersistent("MuchTrack"));
+    ioman->Register("MuchTrack", "Much", fMuchTracks, IsOutputBranchPersistent("MuchTrack"));
     LOG(INFO) << GetName() << ": Register MuchTrack branch";
   }
 
   // --- TrdTrack
   if (fDet.GetDet(ECbmModuleId::kTrd)) {
     fTrdTracks = new TClonesArray("CbmTrdTrack", 100);
-    ioman->Register(
-      "TrdTrack", "Trd", fTrdTracks, IsOutputBranchPersistent("TrdTrack"));
+    ioman->Register("TrdTrack", "Trd", fTrdTracks, IsOutputBranchPersistent("TrdTrack"));
     LOG(INFO) << GetName() << ": Register TrdTrack branch";
   }
 
   // --- TofTrack
   if (fDet.GetDet(ECbmModuleId::kTof)) {
     fTofTracks = new TClonesArray("CbmTofTrack", 100);
-    ioman->Register(
-      "TofTrack", "Tof", fTofTracks, IsOutputBranchPersistent("TofTrack"));
+    ioman->Register("TofTrack", "Tof", fTofTracks, IsOutputBranchPersistent("TofTrack"));
     LOG(INFO) << GetName() << ": Register TofTrack branch";
   }
 
   // --- GlobalTrack
   fGlobalTracks = new TClonesArray("CbmGlobalTrack", 100);
-  ioman->Register("GlobalTrack",
-                  "Global",
-                  fGlobalTracks,
-                  IsOutputBranchPersistent("GlobalTrack"));
+  ioman->Register("GlobalTrack", "Global", fGlobalTracks, IsOutputBranchPersistent("GlobalTrack"));
   LOG(INFO) << GetName() << ": Register GlobalTrack branch";
 }
 
-void CbmLitFindGlobalTracks::InitTrackReconstruction() {
+void CbmLitFindGlobalTracks::InitTrackReconstruction()
+{
   if (fDet.GetElectronSetup()) {
-    if (fTrackingType == "branch" || fTrackingType == "nn"
-        || fTrackingType == "nn_parallel") {
+    if (fTrackingType == "branch" || fTrackingType == "nn" || fTrackingType == "nn_parallel") {
       std::string st("e_");
       st += fTrackingType;
       fFinder = CbmLitToolFactory::CreateTrackFinder(st);
-    } else {
+    }
+    else {
       TObject::Fatal("CbmLitFindGlobalTracks", "Tracking type not found");
     }
-  } else {
-    if (fTrackingType == "branch" || fTrackingType == "nn"
-        || fTrackingType == "nn_parallel") {
+  }
+  else {
+    if (fTrackingType == "branch" || fTrackingType == "nn" || fTrackingType == "nn_parallel") {
       std::string st("mu_");
       st += fTrackingType;
       fFinder = CbmLitToolFactory::CreateTrackFinder(st);
-    } else {
+    }
+    else {
       TObject::Fatal("CbmLitFindGlobalTracks", "Tracking type not found");
     }
   }
@@ -278,67 +348,55 @@ void CbmLitFindGlobalTracks::InitTrackReconstruction() {
   if (fDet.GetDet(ECbmModuleId::kTof)) {
     if (fMergerType == "nearest_hit" || fMergerType == "all_hits") {
       fMerger = CbmLitToolFactory::CreateHitToTrackMerger("tof_" + fMergerType);
-    } else {
+    }
+    else {
       TObject::Fatal("CbmLitFindGlobalTracks", "Merger type not found");
     }
   }
 
-  if (fFitterType == "lit_kalman") {
-    fFitter = CbmLitToolFactory::CreateTrackFitter("lit_kalman");
-  } else {
+  if (fFitterType == "lit_kalman") { fFitter = CbmLitToolFactory::CreateTrackFitter("lit_kalman"); }
+  else {
     TObject::Fatal("CbmLitFindGlobalTracks", "Fitter type not found");
   }
 
   fPropagator = CbmLitToolFactory::CreateTrackPropagator("lit");
 }
 
-void CbmLitFindGlobalTracks::ConvertInputData(CbmEvent* event) {
+void CbmLitFindGlobalTracks::ConvertInputData(CbmEvent* event)
+{
   CbmLitConverter::StsTrackArrayToTrackVector(event, fStsTracks, fLitStsTracks);
-  std::cout << "-I- CbmLitFindGlobalTracks: Number of STS tracks: "
-            << fLitStsTracks.size() << std::endl;
+  LOG(debug2) << "-I- CbmLitFindGlobalTracks: Number of STS tracks: " << fLitStsTracks.size();
 
   if (fMuchPixelHits) {
-    CbmLitConverter::HitArrayToHitVector(
-      event, ECbmDataType::kMuchPixelHit, fMuchPixelHits, fLitHits);
+    CbmLitConverter::HitArrayToHitVector(event, ECbmDataType::kMuchPixelHit, fMuchPixelHits, fLitHits);
   }
   if (fTrdHits) {
-    CbmLitConverter::HitArrayToHitVector(
-      event, ECbmDataType::kTrdHit, fTrdHits, fLitHits);
+    CbmLitConverter::HitArrayToHitVector(event, ECbmDataType::kTrdHit, fTrdHits, fLitHits);
     //If MUCH-TRD setup, than shift plane id for the TRD hits
     if (fDet.GetDet(ECbmModuleId::kMuch) && fDet.GetDet(ECbmModuleId::kTrd)) {
-      Int_t nofStations =
-        CbmLitTrackingGeometryConstructor::Instance()->GetNofMuchStations();
+      Int_t nofStations = CbmLitTrackingGeometryConstructor::Instance()->GetNofMuchStations();
       for (Int_t i = 0; i < fLitHits.size(); i++) {
         CbmLitHit* hit = fLitHits[i];
-        if (hit->GetSystem() == kLITTRD) {
-          hit->SetDetectorId(kLITTRD, hit->GetStation() + nofStations);
-        }
+        if (hit->GetSystem() == kLITTRD) { hit->SetDetectorId(kLITTRD, hit->GetStation() + nofStations); }
       }
     }
   }
-  std::cout << "-I- CbmLitFindGlobalTracks: Number of hits: " << fLitHits.size()
-            << std::endl;
+  LOG(debug2) << "-I- CbmLitFindGlobalTracks: Number of hits: " << fLitHits.size();
 
   if (fTofHits) {
-    CbmLitConverter::HitArrayToHitVector(
-      event, ECbmDataType::kTofHit, fTofHits, fLitTofHits);
-    std::cout << "-I- CbmLitFindGlobalTracks: Number of TOF hits: "
-              << fLitTofHits.size() << std::endl;
+    CbmLitConverter::HitArrayToHitVector(event, ECbmDataType::kTofHit, fTofHits, fLitTofHits);
+    LOG(debug2) << "-I- CbmLitFindGlobalTracks: Number of TOF hits: " << fLitTofHits.size();
   }
 }
 
-void CbmLitFindGlobalTracks::ConvertOutputData(CbmEvent* event) {
-  CbmLitConverter::LitTrackVectorToGlobalTrackArray(event,
-                                                    fLitOutputTracks,
-                                                    fLitOutputTofTracks,
-                                                    fGlobalTracks,
-                                                    fStsTracks,
-                                                    fTrdTracks,
-                                                    fMuchTracks,
-                                                    fTofTracks);
+void CbmLitFindGlobalTracks::ConvertOutputData(CbmEvent* event)
+{
+  CbmLitConverter::LitTrackVectorToGlobalTrackArray(event, fLitOutputTracks, fLitOutputTofTracks, fGlobalTracks,
+                                                    fStsTracks, fTrdTracks, fMuchTracks, fTofTracks);
 }
 
-void CbmLitFindGlobalTracks::CalculateLength(CbmEvent* event) {
+void CbmLitFindGlobalTracks::CalculateLength(CbmEvent* event)
+{
   if (fTofTracks == NULL || fGlobalTracks == NULL) return;
 
   CbmVertex* primVertex = event ? event->GetVertex() : fPrimVertex;
@@ -347,13 +405,11 @@ void CbmLitFindGlobalTracks::CalculateLength(CbmEvent* event) {
     * starting with (0, 0, 0) and adding all
     * distances between hits
     */
-  Int_t nofTofTracks = event ? event->GetNofData(ECbmDataType::kTofTrack)
-                             : fTofTracks->GetEntriesFast();
+  Int_t nofTofTracks = event ? event->GetNofData(ECbmDataType::kTofTrack) : fTofTracks->GetEntriesFast();
   for (Int_t i = 0; i < nofTofTracks; ++i) {
-    Int_t itt = event ? event->GetIndex(ECbmDataType::kTofTrack, i) : i;
-    CbmTofTrack* tofTrack = static_cast<CbmTofTrack*>(fTofTracks->At(itt));
-    CbmGlobalTrack* globalTrack = static_cast<CbmGlobalTrack*>(
-      fGlobalTracks->At(tofTrack->GetTrackIndex()));
+    Int_t itt                   = event ? event->GetIndex(ECbmDataType::kTofTrack, i) : i;
+    CbmTofTrack* tofTrack       = static_cast<CbmTofTrack*>(fTofTracks->At(itt));
+    CbmGlobalTrack* globalTrack = static_cast<CbmGlobalTrack*>(fGlobalTracks->At(tofTrack->GetTrackIndex()));
     if (globalTrack == NULL) { continue; }
 
     std::vector<Double_t> X, Y, Z;
@@ -361,7 +417,8 @@ void CbmLitFindGlobalTracks::CalculateLength(CbmEvent* event) {
       X.push_back(0.);
       Y.push_back(0.);
       Z.push_back(0.);
-    } else {
+    }
+    else {
       X.push_back(primVertex->GetX());
       Y.push_back(primVertex->GetY());
       Z.push_back(primVertex->GetZ());
@@ -374,9 +431,8 @@ void CbmLitFindGlobalTracks::CalculateLength(CbmEvent* event) {
     Int_t tofId  = tofTrack->GetTofHitIndex();  //globalTrack->GetTofHitIndex();
 
     if (stsId > -1) {
-      const CbmStsTrack* stsTrack =
-        static_cast<const CbmStsTrack*>(fStsTracks->At(stsId));
-      Int_t nofStsHits = stsTrack->GetNofStsHits();
+      const CbmStsTrack* stsTrack = static_cast<const CbmStsTrack*>(fStsTracks->At(stsId));
+      Int_t nofStsHits            = stsTrack->GetNofStsHits();
       for (Int_t ih = 0; ih < nofStsHits; ih++) {
         CbmStsHit* hit = (CbmStsHit*) fStsHits->At(stsTrack->GetHitIndex(ih));
         X.push_back(hit->GetX());
@@ -386,14 +442,12 @@ void CbmLitFindGlobalTracks::CalculateLength(CbmEvent* event) {
     }
 
     if (muchId > -1) {
-      const CbmTrack* muchTrack =
-        static_cast<const CbmTrack*>(fMuchTracks->At(muchId));
-      Int_t nofMuchHits = muchTrack->GetNofHits();
+      const CbmTrack* muchTrack = static_cast<const CbmTrack*>(fMuchTracks->At(muchId));
+      Int_t nofMuchHits         = muchTrack->GetNofHits();
       for (Int_t ih = 0; ih < nofMuchHits; ih++) {
         HitType hitType = muchTrack->GetHitType(ih);
         if (hitType == ToIntegralType(ECbmDataType::kMuchPixelHit)) {
-          CbmPixelHit* hit =
-            (CbmPixelHit*) fMuchPixelHits->At(muchTrack->GetHitIndex(ih));
+          CbmPixelHit* hit = (CbmPixelHit*) fMuchPixelHits->At(muchTrack->GetHitIndex(ih));
           X.push_back(hit->GetX());
           Y.push_back(hit->GetY());
           Z.push_back(hit->GetZ());
@@ -402,12 +456,10 @@ void CbmLitFindGlobalTracks::CalculateLength(CbmEvent* event) {
     }
 
     if (trdId > -1) {
-      const CbmTrack* trdTrack =
-        static_cast<const CbmTrack*>(fTrdTracks->At(trdId));
-      Int_t nofTrdHits = trdTrack->GetNofHits();
+      const CbmTrack* trdTrack = static_cast<const CbmTrack*>(fTrdTracks->At(trdId));
+      Int_t nofTrdHits         = trdTrack->GetNofHits();
       for (Int_t ih = 0; ih < nofTrdHits; ih++) {
-        CbmPixelHit* hit =
-          (CbmPixelHit*) fTrdHits->At(trdTrack->GetHitIndex(ih));
+        CbmPixelHit* hit = (CbmPixelHit*) fTrdHits->At(trdTrack->GetHitIndex(ih));
         X.push_back(hit->GetX());
         Y.push_back(hit->GetY());
         Z.push_back(hit->GetZ());
@@ -415,8 +467,7 @@ void CbmLitFindGlobalTracks::CalculateLength(CbmEvent* event) {
     }
 
     if (tofId > -1) {
-      const CbmPixelHit* hit =
-        static_cast<const CbmPixelHit*>(fTofHits->At(tofId));
+      const CbmPixelHit* hit = static_cast<const CbmPixelHit*>(fTofHits->At(tofId));
       X.push_back(hit->GetX());
       Y.push_back(hit->GetY());
       Z.push_back(hit->GetZ());
@@ -431,8 +482,7 @@ void CbmLitFindGlobalTracks::CalculateLength(CbmEvent* event) {
       length += std::sqrt(dX * dX + dY * dY + dZ * dZ);
     }
 
-    if (globalTrack->GetTofHitIndex() == tofTrack->GetTofHitIndex())
-      globalTrack->SetLength(length);
+    if (globalTrack->GetTofHitIndex() == tofTrack->GetTofHitIndex()) globalTrack->SetLength(length);
     tofTrack->SetTrackLength(length);
   }
 }
@@ -478,38 +528,36 @@ void CbmLitFindGlobalTracks::CalculateLength(CbmEvent* event) {
 //	for_each(litTracks.begin(), litTracks.end(), DeleteObject());
 //}
 
-void CbmLitFindGlobalTracks::CalculatePrimaryVertexParameters(CbmEvent* event) {
+void CbmLitFindGlobalTracks::CalculatePrimaryVertexParameters(CbmEvent* event)
+{
   if (0 == fGlobalTracks) return;
 
   CbmVertex* primVertex = event ? event->GetVertex() : fPrimVertex;
 
   if (0 == primVertex) return;
 
-  Int_t nofGlobalTracks = event ? event->GetNofData(ECbmDataType::kGlobalTrack)
-                                : fGlobalTracks->GetEntriesFast();
+  Int_t nofGlobalTracks = event ? event->GetNofData(ECbmDataType::kGlobalTrack) : fGlobalTracks->GetEntriesFast();
 
   for (Int_t i0 = 0; i0 < nofGlobalTracks; ++i0) {
-    Int_t i = event ? event->GetIndex(ECbmDataType::kGlobalTrack, i0) : i0;
-    CbmGlobalTrack* globalTrack =
-      static_cast<CbmGlobalTrack*>(fGlobalTracks->At(i));
-    Int_t stsId           = globalTrack->GetStsTrackIndex();
-    CbmStsTrack* stsTrack = static_cast<CbmStsTrack*>(fStsTracks->At(stsId));
+    Int_t i                     = event ? event->GetIndex(ECbmDataType::kGlobalTrack, i0) : i0;
+    CbmGlobalTrack* globalTrack = static_cast<CbmGlobalTrack*>(fGlobalTracks->At(i));
+    Int_t stsId                 = globalTrack->GetStsTrackIndex();
+    CbmStsTrack* stsTrack       = static_cast<CbmStsTrack*>(fStsTracks->At(stsId));
     FairTrackParam vtxTrackParam;
     float chiSqPrimary = 0.f;
-    CbmKFParticleInterface::ExtrapolateTrackToPV(
-      stsTrack, primVertex, &vtxTrackParam, chiSqPrimary);
+    CbmKFParticleInterface::ExtrapolateTrackToPV(stsTrack, primVertex, &vtxTrackParam, chiSqPrimary);
     globalTrack->SetParamPrimaryVertex(&vtxTrackParam);
   }
 }
 
-void CbmLitFindGlobalTracks::ClearArrays() {
+void CbmLitFindGlobalTracks::ClearArrays()
+{
   // Free memory
   for_each(fLitStsTracks.begin(), fLitStsTracks.end(), DeleteObject());
   for_each(fLitOutputTracks.begin(), fLitOutputTracks.end(), DeleteObject());
   for_each(fLitHits.begin(), fLitHits.end(), DeleteObject());
   for_each(fLitTofHits.begin(), fLitTofHits.end(), DeleteObject());
-  for_each(
-    fLitOutputTofTracks.begin(), fLitOutputTofTracks.end(), DeleteObject());
+  for_each(fLitOutputTofTracks.begin(), fLitOutputTofTracks.end(), DeleteObject());
   fLitStsTracks.clear();
   fLitOutputTracks.clear();
   fLitHits.clear();
@@ -517,7 +565,8 @@ void CbmLitFindGlobalTracks::ClearArrays() {
   fLitOutputTofTracks.clear();
 }
 
-void CbmLitFindGlobalTracks::RunTrackReconstruction() {
+void CbmLitFindGlobalTracks::RunTrackReconstruction()
+{
   // Track finding in TRD or MUCH
   if (fDet.GetDet(ECbmModuleId::kMuch) || fDet.GetDet(ECbmModuleId::kTrd)) {
     fTrackingWatch.Start(kFALSE);
@@ -527,23 +576,17 @@ void CbmLitFindGlobalTracks::RunTrackReconstruction() {
   // Merging of TOF hits to global tracks
   if (fDet.GetDet(ECbmModuleId::kTof)) {
     // If there are no TRD or MUCH than merge STS tracks with TOF
-    if (!(fDet.GetDet(ECbmModuleId::kMuch)
-          || fDet.GetDet(ECbmModuleId::kTrd))) {
-      for (TrackPtrIterator it = fLitStsTracks.begin();
-           it != fLitStsTracks.end();
-           it++) {
+    if (!(fDet.GetDet(ECbmModuleId::kMuch) || fDet.GetDet(ECbmModuleId::kTrd))) {
+      for (TrackPtrIterator it = fLitStsTracks.begin(); it != fLitStsTracks.end(); it++) {
         CbmLitTrack* track = new CbmLitTrack(*(*it));
         fLitOutputTracks.push_back(track);
       }
     }
 
     // Selection of tracks to be merged with TOF
-    if (fDet.GetDet(ECbmModuleId::kMuch) || fDet.GetDet(ECbmModuleId::kTrd)) {
-      SelectTracksForTofMerging();
-    } else {
-      for (TrackPtrIterator it = fLitOutputTracks.begin();
-           it != fLitOutputTracks.end();
-           it++) {
+    if (fDet.GetDet(ECbmModuleId::kMuch) || fDet.GetDet(ECbmModuleId::kTrd)) { SelectTracksForTofMerging(); }
+    else {
+      for (TrackPtrIterator it = fLitOutputTracks.begin(); it != fLitOutputTracks.end(); it++) {
         (*it)->SetQuality(kLITGOODMERGE);
       }
     }
@@ -554,30 +597,26 @@ void CbmLitFindGlobalTracks::RunTrackReconstruction() {
   }
 
   // Refit found tracks
-  for (TrackPtrIterator it = fLitOutputTracks.begin();
-       it != fLitOutputTracks.end();
-       it++) {
+  for (TrackPtrIterator it = fLitOutputTracks.begin(); it != fLitOutputTracks.end(); it++) {
     CbmLitTrack* track = *it;
     fFitter->Fit(track);
   }
 }
 
-void CbmLitFindGlobalTracks::SelectTracksForTofMerging() {
+void CbmLitFindGlobalTracks::SelectTracksForTofMerging()
+{
   // The aim of this procedure is to select only those tracks
   // which have at least one hit in the last station group.
   // Only those tracks will be propagated further and merged
   // with TOF hits.
 
-  Int_t nofStations =
-    CbmLitTrackingGeometryConstructor::Instance()->GetNofMuchTrdStations();
+  Int_t nofStations = CbmLitTrackingGeometryConstructor::Instance()->GetNofMuchTrdStations();
   //   Int_t stationCut = nofStations - 4;
   // TODO: Fix this issue in a better way. This is done only as an ugly fix
   // FU 19.09.13
   Int_t stationCut = nofStations - 3;
 
-  for (TrackPtrIterator it = fLitOutputTracks.begin();
-       it != fLitOutputTracks.end();
-       it++) {
+  for (TrackPtrIterator it = fLitOutputTracks.begin(); it != fLitOutputTracks.end(); it++) {
     CbmLitTrack* track = *it;
     if (track->GetQuality() == kLITBAD) { continue; }
     const CbmLitHit* hit = track->GetHit(track->GetNofHits() - 1);
@@ -588,18 +627,17 @@ void CbmLitFindGlobalTracks::SelectTracksForTofMerging() {
   }
 }
 
-void CbmLitFindGlobalTracks::PrintStopwatchStatistics() {
+void CbmLitFindGlobalTracks::PrintStopwatchStatistics()
+{
   std::cout << "Stopwatch: " << std::endl;
   std::cout << "tracking: counts=" << fTrackingWatch.Counter()
-            << ", real=" << fTrackingWatch.RealTime() / fTrackingWatch.Counter()
-            << "/" << fTrackingWatch.RealTime()
-            << " s, cpu=" << fTrackingWatch.CpuTime() / fTrackingWatch.Counter()
-            << "/" << fTrackingWatch.CpuTime() << std::endl;
+            << ", real=" << fTrackingWatch.RealTime() / fTrackingWatch.Counter() << "/" << fTrackingWatch.RealTime()
+            << " s, cpu=" << fTrackingWatch.CpuTime() / fTrackingWatch.Counter() << "/" << fTrackingWatch.CpuTime()
+            << std::endl;
   std::cout << "fitter: real=" << fMergerWatch.Counter()
-            << ", real=" << fMergerWatch.RealTime() / fMergerWatch.Counter()
-            << "/" << fMergerWatch.RealTime()
-            << " s, cpu=" << fMergerWatch.CpuTime() / fMergerWatch.Counter()
-            << "/" << fMergerWatch.CpuTime() << std::endl;
+            << ", real=" << fMergerWatch.RealTime() / fMergerWatch.Counter() << "/" << fMergerWatch.RealTime()
+            << " s, cpu=" << fMergerWatch.CpuTime() / fMergerWatch.Counter() << "/" << fMergerWatch.CpuTime()
+            << std::endl;
 }
 
 ClassImp(CbmLitFindGlobalTracks);
diff --git a/reco/littrack/cbm/reco/CbmLitFindGlobalTracks.h b/reco/littrack/cbm/reco/CbmLitFindGlobalTracks.h
index 5bad4abf382dba60569aa5d1f0d189cfc2f9310d..5371b1925cb6557dee5ae3c29148b67b1a4aabd7 100644
--- a/reco/littrack/cbm/reco/CbmLitFindGlobalTracks.h
+++ b/reco/littrack/cbm/reco/CbmLitFindGlobalTracks.h
@@ -17,14 +17,14 @@
 #ifndef CBMLITFINDGLOBALTRACKS_H_
 #define CBMLITFINDGLOBALTRACKS_H_
 
-#include "FairTask.h"
-
 #include "CbmVertex.h"
 #include "base/CbmLitDetectorSetup.h"
 #include "base/CbmLitPtrTypes.h"
 #include "base/CbmLitTypes.h"
 #include "data/CbmLitHit.h"
 
+#include "FairTask.h"
+
 #include "TStopwatch.h"
 
 #include <string>
@@ -69,9 +69,7 @@ public:
   virtual void SetParContainers();
 
   /* Setters */
-  void SetTrackingType(const string& trackingType) {
-    fTrackingType = trackingType;
-  }
+  void SetTrackingType(const string& trackingType) { fTrackingType = trackingType; }
   void SetMergerType(const string& mergerType) { fMergerType = mergerType; }
   void SetFitterType(const string& fitterType) { fFitterType = fitterType; }
 
@@ -184,7 +182,16 @@ private:
   TStopwatch fTrackingWatch;  // stopwatch for tracking
   TStopwatch fMergerWatch;    // stopwatch for merger
 
-  Int_t fEventNo;  // event counter
+  // counters
+  Long64_t fNofTs        = 0;   // timeslice counter
+  Long64_t fNofEvents    = 0;   // event counter
+  Long64_t fNofStsTracks = 0;   // STS tracks
+  Long64_t fNofMuchHits  = 0;   // MUCH hits
+  Long64_t fNofTrdHits   = 0;   // TRD hits
+  Long64_t fNofTofHits   = 0;   // TOF hits
+  Long64_t fNofGlbTracks = 0;   // Global tracks
+  Double_t fTime         = 0.;  // Processing time
+  Long64_t fEventNo;            // event counter (old)
 
   CbmLitFindGlobalTracks(const CbmLitFindGlobalTracks&);
   CbmLitFindGlobalTracks& operator=(const CbmLitFindGlobalTracks&);
diff --git a/reco/littrack/std/finder/CbmLitTrackFinderBranch.cxx b/reco/littrack/std/finder/CbmLitTrackFinderBranch.cxx
index a6ff28daa57dcefe9be8956c723e9d65eef91310..436f28a4a74b634ba377bb46ba7aac3d90ea1712 100644
--- a/reco/littrack/std/finder/CbmLitTrackFinderBranch.cxx
+++ b/reco/littrack/std/finder/CbmLitTrackFinderBranch.cxx
@@ -41,13 +41,14 @@ CbmLitTrackFinderBranch::CbmLitTrackFinderBranch()
   , fPDG()
   , fChiSqStripHitCut()
   , fChiSqPixelHitCut()
-  , fSigmaCoef() {}
+  , fSigmaCoef()
+{
+}
 
 CbmLitTrackFinderBranch::~CbmLitTrackFinderBranch() {}
 
-LitStatus CbmLitTrackFinderBranch::DoFind(HitPtrVector& hits,
-                                          TrackPtrVector& trackSeeds,
-                                          TrackPtrVector& tracks) {
+LitStatus CbmLitTrackFinderBranch::DoFind(HitPtrVector& hits, TrackPtrVector& trackSeeds, TrackPtrVector& tracks)
+{
   fTracks.clear();
   fUsedSeedsSet.clear();
   fUsedHitsSet.clear();
@@ -69,13 +70,12 @@ LitStatus CbmLitTrackFinderBranch::DoFind(HitPtrVector& hits,
   }
 
   static Int_t eventNo = 0;
-  std::cout << "-I- CbmLitTrackFinderBranch: " << eventNo++
-            << " events processed" << std::endl;
+  //std::cout << "-I- CbmLitTrackFinderBranch: " << eventNo++ << " events processed" << std::endl;
   return kLITSUCCESS;
 }
 
-void CbmLitTrackFinderBranch::ArrangeHits(HitPtrIterator itBegin,
-                                          HitPtrIterator itEnd) {
+void CbmLitTrackFinderBranch::ArrangeHits(HitPtrIterator itBegin, HitPtrIterator itEnd)
+{
   for (HitPtrIterator it = itBegin; it != itEnd; it++) {
     CbmLitHit* hit = *it;
     if (fUsedHitsSet.find(hit->GetRefId()) != fUsedHitsSet.end()) { continue; }
@@ -84,8 +84,8 @@ void CbmLitTrackFinderBranch::ArrangeHits(HitPtrIterator itBegin,
   fHitData.Arrange();
 }
 
-void CbmLitTrackFinderBranch::InitTrackSeeds(TrackPtrIterator itBegin,
-                                             TrackPtrIterator itEnd) {
+void CbmLitTrackFinderBranch::InitTrackSeeds(TrackPtrIterator itBegin, TrackPtrIterator itEnd)
+{
   for (TrackPtrIterator it = itBegin; it != itEnd; it++) {
     (*it)->SetQuality(kLITGOOD);
   }
@@ -95,10 +95,7 @@ void CbmLitTrackFinderBranch::InitTrackSeeds(TrackPtrIterator itBegin,
   for (TrackPtrIterator it = itBegin; it != itEnd; it++) {
     CbmLitTrack* track = *it;
     if (track->GetQuality() == kLITBAD) { continue; }
-    if (fUsedSeedsSet.find(track->GetPreviousTrackId())
-        != fUsedSeedsSet.end()) {
-      continue;
-    }
+    if (fUsedSeedsSet.find(track->GetPreviousTrackId()) != fUsedSeedsSet.end()) { continue; }
     CbmLitTrack* newTrack = new CbmLitTrack(*track);
     newTrack->SetPDG(fPDG[fIteration]);
     newTrack->SetChi2(0.);
@@ -106,8 +103,8 @@ void CbmLitTrackFinderBranch::InitTrackSeeds(TrackPtrIterator itBegin,
   }
 }
 
-void CbmLitTrackFinderBranch::FollowTracks(TrackPtrIterator itBegin,
-                                           TrackPtrIterator itEnd) {
+void CbmLitTrackFinderBranch::FollowTracks(TrackPtrIterator itBegin, TrackPtrIterator itEnd)
+{
   // Loop over the track seeds
   for (TrackPtrIterator itTrack = itBegin; itTrack != itEnd; itTrack++) {
     CbmLitTrack* track = *itTrack;
@@ -117,33 +114,26 @@ void CbmLitTrackFinderBranch::FollowTracks(TrackPtrIterator itBegin,
     // Initially start with one branch which is the same as track seed
     branches.push_back(new CbmLitTrack(*track));
 
-    for (Int_t iStation = 0; iStation < fNofStations;
-         iStation++) {  // Loop over stations
+    for (Int_t iStation = 0; iStation < fNofStations; iStation++) {  // Loop over stations
       litfloat zMin             = fHitData.GetMinZPos(iStation);
       const vector<Int_t>& bins = fHitData.GetZPosBins(iStation);
       // map<bin index, pair<track parameter for the bin, true if track was propagated correctly >>
       map<Int_t, pair<CbmLitTrackParam, Bool_t>> binParamMap;
       vector<Int_t>::const_iterator itBins;
       for (itBins = bins.begin(); itBins != bins.end(); itBins++) {
-        binParamMap[*itBins] =
-          make_pair<CbmLitTrackParam, Bool_t>(CbmLitTrackParam(), true);
+        binParamMap[*itBins] = make_pair<CbmLitTrackParam, Bool_t>(CbmLitTrackParam(), true);
       }
       // Number of branches can change in the next loop turn
       // since branches array is filled with additional track branches
       // which were created on current station
       Int_t nofBranches = branches.size();
-      for (Int_t iBranch = 0; iBranch < nofBranches;
-           iBranch++) {  // Loop over branches
+      for (Int_t iBranch = 0; iBranch < nofBranches; iBranch++) {  // Loop over branches
         CbmLitTrack* branch = branches[iBranch];
         // Check for the missing hits
-        if (branch->GetNofMissingHits() > fMaxNofMissingHits[fIteration]) {
-          continue;
-        }
+        if (branch->GetNofMissingHits() > fMaxNofMissingHits[fIteration]) { continue; }
 
         CbmLitTrackParam par(*branch->GetParamLast());
-        if (fPropagator->Propagate(&par, zMin, fPDG[fIteration]) == kLITERROR) {
-          break;
-        }
+        if (fPropagator->Propagate(&par, zMin, fPDG[fIteration]) == kLITERROR) { break; }
 
         // Extrapolate track parameters to each Z position in the map.
         // This is done to improve calculation speed.
@@ -152,10 +142,8 @@ void CbmLitTrackFinderBranch::FollowTracks(TrackPtrIterator itBegin,
         map<Int_t, pair<CbmLitTrackParam, Bool_t>>::iterator itMap;
         for (itMap = binParamMap.begin(); itMap != binParamMap.end(); itMap++) {
           (*itMap).second.first = par;
-          litfloat z = fHitData.GetZPosByBin(iStation, (*itMap).first);
-          if (fPropagator->Propagate(
-                &(*itMap).second.first, z, fPDG[fIteration])
-              == kLITERROR) {
+          litfloat z            = fHitData.GetZPosByBin(iStation, (*itMap).first);
+          if (fPropagator->Propagate(&(*itMap).second.first, z, fPDG[fIteration]) == kLITERROR) {
             (*itMap).second.second = false;
           }
         }
@@ -163,13 +151,11 @@ void CbmLitTrackFinderBranch::FollowTracks(TrackPtrIterator itBegin,
         // Loop over hits
         map<litfloat, pair<const CbmLitHit*, CbmLitTrackParam>> chiHitPar;
         const HitPtrVector& hits = fHitData.GetHits(iStation);
-        for (HitPtrConstIterator itHit = hits.begin(); itHit != hits.end();
-             itHit++) {
+        for (HitPtrConstIterator itHit = hits.begin(); itHit != hits.end(); itHit++) {
           const CbmLitHit* hit = *itHit;
           Int_t bin            = fHitData.GetBinByZPos(iStation, hit->GetZ());
           assert(binParamMap.find(bin) != binParamMap.end());
-          if (!binParamMap[bin].second)
-            continue;  // Track parameters are wrong for this propagation
+          if (!binParamMap[bin].second) continue;  // Track parameters are wrong for this propagation
           CbmLitTrackParam tpar(binParamMap[bin].first);
 
           // Check preliminary if hit is in the validation gate.
@@ -177,22 +163,15 @@ void CbmLitTrackFinderBranch::FollowTracks(TrackPtrIterator itBegin,
           // Based on the predicted track position (w/o KF update step)
           // and maximum hit position error.
           if (hit->GetType() == kLITPIXELHIT) {
-            const CbmLitPixelHit* pixelHit =
-              static_cast<const CbmLitPixelHit*>(hit);
-            litfloat maxErrX = fHitData.GetMaxErrX(iStation);
-            litfloat devX    = fSigmaCoef[fIteration]
-                            * (sqrt(tpar.GetCovariance(0) + maxErrX * maxErrX));
-            litfloat maxErrY = fHitData.GetMaxErrY(iStation);
-            litfloat devY    = fSigmaCoef[fIteration]
-                            * (sqrt(tpar.GetCovariance(6) + maxErrY * maxErrY));
-            litfloat maxErrT = fHitData.GetMaxErrT(iStation);
-            litfloat devT =
-              fSigmaCoef[fIteration]
-              * (sqrt(tpar.GetCovariance(20) + maxErrT * maxErrT));
-            bool hitInside = (pixelHit->GetX() < (tpar.GetX() + devX))
-                             && (pixelHit->GetX() > (tpar.GetX() - devX))
-                             && (pixelHit->GetY() < (tpar.GetY() + devY))
-                             && (pixelHit->GetY() > (tpar.GetY() - devY))
+            const CbmLitPixelHit* pixelHit = static_cast<const CbmLitPixelHit*>(hit);
+            litfloat maxErrX               = fHitData.GetMaxErrX(iStation);
+            litfloat devX                  = fSigmaCoef[fIteration] * (sqrt(tpar.GetCovariance(0) + maxErrX * maxErrX));
+            litfloat maxErrY               = fHitData.GetMaxErrY(iStation);
+            litfloat devY                  = fSigmaCoef[fIteration] * (sqrt(tpar.GetCovariance(6) + maxErrY * maxErrY));
+            litfloat maxErrT               = fHitData.GetMaxErrT(iStation);
+            litfloat devT  = fSigmaCoef[fIteration] * (sqrt(tpar.GetCovariance(20) + maxErrT * maxErrT));
+            bool hitInside = (pixelHit->GetX() < (tpar.GetX() + devX)) && (pixelHit->GetX() > (tpar.GetX() - devX))
+                             && (pixelHit->GetY() < (tpar.GetY() + devY)) && (pixelHit->GetY() > (tpar.GetY() - devY))
                              && (pixelHit->GetT() < (tpar.GetTime() + devT))
                              && (pixelHit->GetT() > (tpar.GetTime() - devT));
             if (!hitInside) continue;
@@ -200,11 +179,8 @@ void CbmLitTrackFinderBranch::FollowTracks(TrackPtrIterator itBegin,
 
           litfloat chi = std::numeric_limits<litfloat>::max();
           fFilter->Update(&tpar, hit, chi);
-          bool hitInValidationGate =
-            (hit->GetType() == kLITPIXELHIT
-             && chi < fChiSqPixelHitCut[fIteration])
-            || (hit->GetType() == kLITSTRIPHIT
-                && chi < fChiSqStripHitCut[fIteration]);
+          bool hitInValidationGate = (hit->GetType() == kLITPIXELHIT && chi < fChiSqPixelHitCut[fIteration])
+                                     || (hit->GetType() == kLITSTRIPHIT && chi < fChiSqStripHitCut[fIteration]);
           if (hitInValidationGate) {  // Check if hit is inside validation gate
             chiHitPar[chi] = make_pair(hit, tpar);
           }
@@ -214,25 +190,22 @@ void CbmLitTrackFinderBranch::FollowTracks(TrackPtrIterator itBegin,
         // Check if hit was added
         if (nofHitsInValidationGate == 1) {
           // Only one hit added, no additional branches are created, just update branch parameters
-          const map<litfloat,
-                    pair<const CbmLitHit*, CbmLitTrackParam>>::const_iterator
-            it = chiHitPar.begin();
+          const map<litfloat, pair<const CbmLitHit*, CbmLitTrackParam>>::const_iterator it = chiHitPar.begin();
           branch->AddHit((*it).second.first);
           branch->SetLastStationId(iStation);
           branch->SetParamLast(&(*it).second.second);
           branch->SetChi2(branch->GetChi2() + (*it).first);
           branch->SetNDF(lit::NDF(branch));
-        } else if (nofHitsInValidationGate > 1) {
+        }
+        else if (nofHitsInValidationGate > 1) {
           // If more than one hit is in the validation gate, than create additional branches.
           // For the first hit use the same branch.
           Int_t counter = 0;
           CbmLitTrack tt(*branch);
-          map<litfloat,
-              pair<const CbmLitHit*, CbmLitTrackParam>>::const_iterator it;
+          map<litfloat, pair<const CbmLitHit*, CbmLitTrackParam>>::const_iterator it;
           for (it = chiHitPar.begin(); it != chiHitPar.end(); it++) {
             // Create new branch starting with the second hit
-            CbmLitTrack* tbranch =
-              (it != chiHitPar.begin()) ? new CbmLitTrack(tt) : branch;
+            CbmLitTrack* tbranch = (it != chiHitPar.begin()) ? new CbmLitTrack(tt) : branch;
             if (it != chiHitPar.begin()) branches.push_back(tbranch);
             tbranch->AddHit((*it).second.first);
             tbranch->SetLastStationId(iStation);
@@ -248,7 +221,8 @@ void CbmLitTrackFinderBranch::FollowTracks(TrackPtrIterator itBegin,
             if (nofBranches > fMaxNofBranches) break;
             //if (branches.size() > fMaxNofBranches) break;
           }
-        } else {  // Missing hit
+        }
+        else {  // Missing hit
           branch->SetNofMissingHits(branch->GetNofMissingHits() + 1);
         }
       }  // Loop over branches
@@ -270,8 +244,8 @@ void CbmLitTrackFinderBranch::FollowTracks(TrackPtrIterator itBegin,
   }
 }
 
-void CbmLitTrackFinderBranch::RemoveHits(TrackPtrIterator itBegin,
-                                         TrackPtrIterator itEnd) {
+void CbmLitTrackFinderBranch::RemoveHits(TrackPtrIterator itBegin, TrackPtrIterator itEnd)
+{
   for (TrackPtrIterator it = itBegin; it != itEnd; it++) {
     CbmLitTrack* track = *it;
     if (track->GetQuality() == kLITBAD) { continue; }
@@ -281,9 +255,8 @@ void CbmLitTrackFinderBranch::RemoveHits(TrackPtrIterator itBegin,
   }
 }
 
-void CbmLitTrackFinderBranch::CopyToOutput(TrackPtrIterator itBegin,
-                                           TrackPtrIterator itEnd,
-                                           TrackPtrVector& tracks) {
+void CbmLitTrackFinderBranch::CopyToOutput(TrackPtrIterator itBegin, TrackPtrIterator itEnd, TrackPtrVector& tracks)
+{
   for (TrackPtrIterator it = itBegin; it != itEnd; it++) {
     CbmLitTrack* track = *it;
     if (track->GetQuality() == kLITBAD) { continue; }