diff --git a/macro/beamtime/mcbm2020/mcbm_build_and_reco_kronos.C b/macro/beamtime/mcbm2020/mcbm_build_and_reco_kronos.C
index e585a1efbe598dd0222b5747673fa3b95e9c6d80..9cb360c56aa28a9b70447b4d4bb3296bbd89fda1 100644
--- a/macro/beamtime/mcbm2020/mcbm_build_and_reco_kronos.C
+++ b/macro/beamtime/mcbm2020/mcbm_build_and_reco_kronos.C
@@ -1,16 +1,18 @@
 // --------------------------------------------------------------------------
 //
 // Macro for reconstruction of mcbm data (2020)
-// Combined reconstruction (Event building + cluster + hit finder) for different subsystems.
+// Combined event based reconstruction (Event building + cluster + hit finder)
+// for different subsystems.
 //
 // --------------------------------------------------------------------------
 
 
 void mcbm_build_and_reco_kronos(UInt_t uRunIdx = 28,
-                                Int_t nEvents  = 300,
+                                Int_t nTimeslices  = 300,
                                 TString outDir = "data/") {
   UInt_t uRunId    = 0;
-  TString fileName = "data/unp_mcbm_0.root";
+  TString inFile = "./data/unp_mcbm_0.root";
+  TString parFileIn = "./data/unp_mcbm_params_0.root";
   if (99999 != uRunIdx) {
     std::vector<UInt_t> vuListRunId = {
       692, 698, 702, 704, 705, 706, 707,            //  7 =>  0 -  6
@@ -33,9 +35,12 @@ void mcbm_build_and_reco_kronos(UInt_t uRunIdx = 28,
     };
     if (vuListRunId.size() <= uRunIdx) return kFALSE;
     uRunId = vuListRunId[uRunIdx];
-    //fileName = Form("data/unp_mcbm_%03u.root", uRunId);
-    fileName = Form("/lustre/cbm/users/ploizeau/mcbm2020/"
-                    "unp_evt_data_7f229b3f_20201103/unp_mcbm_%i.root",
+
+    inFile = Form("/lustre/cbm/users/ploizeau/mcbm2020/"
+                    "unp_evt_data_7f229b3f_20201103/unp_mcbm_%u.root",
+                    uRunId);
+    parFileIn = Form("/lustre/cbm/users/ploizeau/mcbm2020/
+                      "unp_evt_data_7f229b3f_20201103/unp_mcbm_params_%u.root",
                     uRunId);
   }  // if( 99999 != uRunIdx )
 
@@ -45,44 +50,56 @@ void mcbm_build_and_reco_kronos(UInt_t uRunIdx = 28,
   // ========================================================================
   //          Adjust this part according to your requirements
 
-  // Verbosity level (0=quiet, 1=event level, 2=track level, 3=debug)
-  //  Int_t iVerbose = 1;
-
-  // --- Set log output levels
-  FairLogger::GetLogger();
-  gLogger->SetLogScreenLevel("INFO");
-  //  gLogger->SetLogScreenLevel("DEBUG");
-  gLogger->SetLogVerbosityLevel("MEDIUM");
+  // --- Logger settings ----------------------------------------------------
+  TString logLevel     = "INFO";
+  TString logVerbosity = "LOW";
+  // ------------------------------------------------------------------------
 
-  // MC file
 
-  TString srcDir   = gSystem->Getenv("VMCWORKDIR");
+  // -----   Environment   --------------------------------------------------
+  TString myName   = "mcbm_reco";  // this macro's name for screen output
+  TString srcDir   = gSystem->Getenv("VMCWORKDIR");  // top source directory
   TString paramDir = srcDir + "/macro/beamtime/mcbm2020/";
+  //    ------------------------------------------------------------------------
+
+
+  // -----   In- and output file names   ------------------------------------
+  TString geoFile = paramDir + "mcbm2020_reco.geo.root";  // Created in sim. run
+  TString parFileOut = Form("./data/reco_mcbm_evt_win_params_%u.root", uRunId);
+  TString outFile = Form("./data/reco_mcbm_evt_win_%u.root", uRunId);
+  // ------------------------------------------------------------------------
+
+
   // -----   Timer   --------------------------------------------------------
   TStopwatch timer;
   timer.Start();
   // ------------------------------------------------------------------------
 
-  // -----  Analysis run   --------------------------------------------------
-  //  FairRunOnline *fRun= new FairRunOnline();
-  FairRunAna* fRun = new FairRunAna();
-  fRun->SetEventHeaderPersistence(kFALSE);
 
-  FairFileSource* inputSource = new FairFileSource(fileName);
-  fRun->SetSource(inputSource);
+  // -----   FairRunAna   ---------------------------------------------------
+  FairRunAna* run = new FairRunAna();
+  run->SetEventHeaderPersistence(kFALSE);
+
+  FairFileSource* inputSource = new FairFileSource(inFile);
+  run->SetSource(inputSource);
 
-  TString runId                = TString::Format("%03u", uRunId);
-  TString outFile              = outDir + "/events_win_" + runId + ".root";
   FairRootFileSink* outputSink = new FairRootFileSink(outFile);
-  fRun->SetSink(outputSink);
+  run->SetSink(outputSink);
+  run->SetGeomFile(geoFile);
 
   // Define output file for FairMonitor histograms
-  //  TString monitorFile{outFile};
-  //  monitorFile.ReplaceAll("qa","qa.monitor");
-  FairMonitor::GetMonitor()->EnableMonitor(kTRUE);
-  //  FairMonitor::GetMonitor()->EnableMonitor(kFALSE);
+  TString monitorFile {outFile};
+  monitorFile.ReplaceAll("rec", "rec.monitor");
+  FairMonitor::GetMonitor()->EnableMonitor(kTRUE, monitorFile);
   // ------------------------------------------------------------------------
 
+
+  // -----   Logger settings   ----------------------------------------------
+  FairLogger::GetLogger()->SetLogScreenLevel(logLevel.Data());
+  FairLogger::GetLogger()->SetLogVerbosityLevel(logVerbosity.Data());
+  // ------------------------------------------------------------------------
+
+  //-------- Event builder --------------------------------------------------
   //  CbmMcbm2019TimeWinEventBuilder* eventBuilder = new CbmMcbm2019TimeWinEventBuilder();
   CbmMcbm2019TimeWinEventBuilderTask* eventBuilder =
     new CbmMcbm2019TimeWinEventBuilderTask();
@@ -154,37 +171,15 @@ void mcbm_build_and_reco_kronos(UInt_t uRunIdx = 28,
     eventBuilder->SetOutFilename(
       Form("%sHistosEvtWin_%03u.root", outDir.Data(), uRunId));
 
-  fRun->AddTask(eventBuilder);
-
-  // -----  Parameter database   --------------------------------------------
-
-  TString parFileIn =
-    Form("/lustre/cbm/users/ploizeau/mcbm2020/unp_evt_data_7f229b3f_20201103/"
-         "unp_mcbm_params_%i.root",
-         uRunId);
-  TString parFileOut = Form("reco_mcbm_params_%i.root", uRunId);
-
-
-  FairRuntimeDb* rtdb       = fRun->GetRuntimeDb();
-  FairParRootFileIo* parIo1 = new FairParRootFileIo();
-  FairParRootFileIo* parIo3 = new FairParRootFileIo();
-  parIo1->open(parFileIn.Data(), "READ");
-  parIo3->open(parFileOut.Data(), "RECREATE");
-  rtdb->setFirstInput(parIo1);
-  rtdb->setOutput(parIo3);
-
-  //----------------------------------Reconstruction-------------------------------------
+  run->AddTask(eventBuilder);
+  // ------------------------------------------------------------------------
 
 
-  // ------------------------------------------------------------------------
-  TString geoFileSts = paramDir + "mcbm2020_reco.geo.root";
-  //TString geoFileSts =
-  //  "/lustre/cbm/users/alberica/cbmroot/macro/beamtime/mcbm2020/data/test.geo.root";  // to be created by a simulation run
-  fRun->SetGeomFile(geoFileSts);
+  // -----   Reconstruction tasks   -----------------------------------------
 
   // -----   Local reconstruction in STS   ----------------------------------
   CbmRecoSts* recoSts = new CbmRecoSts();
-  //  recoSts->SetMode(kCbmRecoEvent);
+  recoSts->SetMode(kCbmRecoEvent);
 
   //recoSts->SetTimeCutDigisAbs( 20 );// cluster finder: time cut in ns
   //recoSts->SetTimeCutClustersAbs(20.); // hit finder: time cut in ns
@@ -218,7 +213,7 @@ void mcbm_build_and_reco_kronos(UInt_t uRunIdx = 28,
   auto sensorCond = new CbmStsParSensorCond(70., 140., 268., 17.5, 1.);
   recoSts->UseSensorCond(sensorCond);
 
-  fRun->AddTask(recoSts);
+  run->AddTask(recoSts);
   std::cout << "-I- : Added task " << recoSts->GetName() << std::endl;
   // ------------------------------------------------------------------------
 
@@ -232,54 +227,108 @@ void mcbm_build_and_reco_kronos(UInt_t uRunIdx = 28,
   CbmMuchFindHitsGem* muchFindHits =
     new CbmMuchFindHitsGem(muchDigiFile.Data(), flag);
   muchFindHits->SetBeamTimeDigi(kTRUE);
-  fRun->AddTask(muchFindHits);
+  run->AddTask(muchFindHits);
   std::cout << "-I- : Added task " << muchFindHits->GetName() << std::endl;
+  // ------------------------------------------------------------------------
 
-  //--------------------------------------------------------
 
+  // -----   Local reconstruction in TRD   ----------------------------------
+  // ------------------------------------------------------------------------
+
+
+  // -----   Local reconstruction in TOF   ----------------------------------
+  // ------------------------------------------------------------------------
+
+
+  // -----   Local reconstruction of RICH Hits ------------------------------
+  CbmRichMCbmHitProducer* hitProdRich = new CbmRichMCbmHitProducer();
+  hitProdRich->setToTLimits(23.7, 30.0);
+  hitProdRich->applyToTCut();
+  TString sRichMapFile =
+    srcDir + "/macro/rich/mcbm/beamtime/mRICH_Mapping_vert_20190318_elView.geo";
+  hitProdRich->SetMappingFile(sRichMapFile.Data());
+  run->AddTask(hitProdRich);
+  // ------------------------------------------------------------------------
+
+  // -----   Local reconstruction in RICh -> Finding of Rings ---------------
+  CbmRichReconstruction* richReco = new CbmRichReconstruction();
+  richReco->UseMCbmSetup();
+  run->AddTask(richReco);
+  // ------------------------------------------------------------------------
+
+
+  // -----  Psd hit producer   ----------------------------------------------
+  CbmPsdMCbmHitProducer* hitProdPsd = new CbmPsdMCbmHitProducer();
+  run->AddTask(hitProdPsd);
+  // ------------------------------------------------------------------------
+
+
+  // -----  Parameter database   --------------------------------------------
+  std::cout << std::endl << std::endl;
+  std::cout << "-I- " << myName << ": Set runtime DB" << std::endl;
+  FairRuntimeDb* rtdb       = run->GetRuntimeDb();
+  FairParRootFileIo* parIo1 = new FairParRootFileIo();
+  FairParAsciiFileIo* parIo2 = new FairParAsciiFileIo();
+  FairParRootFileIo* parIo3 = new FairParRootFileIo();
+  parIo1->open(parFileIn.Data(), "READ");
+  parIo3->open(parFileOut.Data(), "RECREATE");
+  rtdb->setFirstInput(parIo1);
+  // ------------------------------------------------------------------------
 
-  // -----   Intialise and run   --------------------------------------------
-  fRun->Init();
 
-  //  rtdb->setOutput(parIo1);
-  //  rtdb->saveOutput();
-  //  rtdb->print();
+  // -----   Run initialisation   -------------------------------------------
+  std::cout << std::endl;
+  std::cout << "-I- " << myName << ": Initialise run" << std::endl;
+  run->Init();
+  rtdb->setOutput(parIo3);
+  rtdb->saveOutput();
+  rtdb->print();
+  // ------------------------------------------------------------------------
 
-  cout << "Starting run" << endl;
-  if (0 == nEvents) {
-    fRun->Run(0, 0);  // run until end of input file
-  } else {
-    fRun->Run(0, nEvents);  // process  N Events
-  }
+
+  // -----   Start run   ----------------------------------------------------
+  std::cout << std::endl << std::endl;
+  std::cout << "-I- " << myName << ": Starting run" << std::endl;
+  run->Run(0, nTimeslices);
   // ------------------------------------------------------------------------
 
 
   // -----   Finish   -------------------------------------------------------
   timer.Stop();
+  FairMonitor::GetMonitor()->Print();
   Double_t rtime = timer.RealTime();
   Double_t ctime = timer.CpuTime();
-  cout << endl << endl;
-  cout << "Macro finished succesfully." << endl;
-  cout << "Real time " << rtime << " s, CPU time " << ctime << " s" << endl;
-  cout << endl;
+  std::cout << std::endl << std::endl;
+  std::cout << "Macro finished successfully." << std::endl;
+  std::cout << "Output file is " << outFile << std::endl;
+  std::cout << "Parameter file is " << parFileOut << std::endl;
+  std::cout << "Real time " << rtime << " s, CPU time " << ctime << " s"
+            << std::endl;
+  std::cout << std::endl;
   // ------------------------------------------------------------------------
 
+
+  // -----   Resource monitoring   ------------------------------------------
   // Extract the maximal used memory an add is as Dart measurement
   // This line is filtered by CTest and the value send to CDash
   FairSystemInfo sysInfo;
   Float_t maxMemory = sysInfo.GetMaxMemory();
-  cout << "<DartMeasurement name=\"MaxMemory\" type=\"numeric/double\">";
-  cout << maxMemory;
-  cout << "</DartMeasurement>" << endl;
+  std::cout << "<DartMeasurement name=\"MaxMemory\" type=\"numeric/double\">";
+  std::cout << maxMemory;
+  std::cout << "</DartMeasurement>" << std::endl;
 
   Float_t cpuUsage = ctime / rtime;
-  cout << "<DartMeasurement name=\"CpuLoad\" type=\"numeric/double\">";
-  cout << cpuUsage;
-  cout << "</DartMeasurement>" << endl;
+  std::cout << "<DartMeasurement name=\"CpuLoad\" type=\"numeric/double\">";
+  std::cout << cpuUsage;
+  std::cout << "</DartMeasurement>" << std::endl;
+  // ------------------------------------------------------------------------
+
 
-  FairMonitor* tempMon = FairMonitor::GetMonitor();
-  tempMon->Print();
+  // -----   Function needed for CTest runtime dependency   -----------------
+  //  RemoveGeoManager();
+  // ------------------------------------------------------------------------
 
-  cout << " Test passed" << endl;
-  cout << " All ok " << endl;
+  /// --- Screen output for automatic tests
+  std::cout << " Test passed" << std::endl;
+  std::cout << " All ok " << std::endl;
 }
diff --git a/macro/beamtime/mcbm2020/mcbm_event_reco.C b/macro/beamtime/mcbm2020/mcbm_event_reco.C
index c74da1f94476df9af5276555bc2f1c3863734490..00553c221caeb4830fdb8c666d7eeefa0fada438 100644
--- a/macro/beamtime/mcbm2020/mcbm_event_reco.C
+++ b/macro/beamtime/mcbm2020/mcbm_event_reco.C
@@ -1,197 +1,227 @@
-// --------------------------------------------------------------------------
-//
-// Macro for reconstruction of mcbm data (2020)
-// MUCH STS  local reconstruction (Event Building (Florian one) + cluster + hit finder) for the time being
-//
-// --------------------------------------------------------------------------
-
-void mcbm_event_reco(Int_t runId = 831, Int_t nTimeslices = 300) {
-
-  // --- Logger settings ----------------------------------------------------
-  TString logLevel     = "INFO";
-  TString logVerbosity = "LOW";
-  // ------------------------------------------------------------------------
-
-
-  // -----   Environment   --------------------------------------------------
-  TString myName   = "mcbm_reco";  // this macro's name for screen output
-  TString srcDir   = gSystem->Getenv("VMCWORKDIR");  // top source directory
-  TString paramDir = srcDir + "/macro/beamtime/mcbm2020/";
-  // TString srcDir1 = gSystem->Getenv("SLURM_INDEX");  // ------------------------------------------------------------------------
-
-
-  // -----   In- and output file names   ------------------------------------
-  TString inFile  = Form("./data/unp_mcbm_%i.root", runId);
-  TString parFile = Form("./data/unp_mcbm_params_%i.root", runId);
-  TString geoFile = paramDir + "mcbm2020_reco.geo.root";  // Created in sim. run
-  TString outFile = Form("./data/reco_mcbm_%i.root", runId);
-  // ------------------------------------------------------------------------
-
-
-  // ------------------------------------------------------------------------
-  TString parDir =
-    TString(gSystem->Getenv("VMCWORKDIR")) + TString("/parameters");
-  TString muchDigiFile(
-    parDir + "/much/much_v19c_mcbm_digi_sector.root");  // MUCH digi file
-
-  // -----   Timer   --------------------------------------------------------
-  TStopwatch timer;
-  timer.Start();
-  // ------------------------------------------------------------------------
-
-
-  // ----    Debug option   -------------------------------------------------
-  gDebug = 0;
-  // ------------------------------------------------------------------------
-
-
-  // -----   FairRunAna   ---------------------------------------------------
-  FairRunAna* run             = new FairRunAna();
-  FairFileSource* inputSource = new FairFileSource(inFile);
-  run->SetSource(inputSource);
-
-  run->SetOutputFile(outFile);
-  //run->SetGenerateRunInfo(kTRUE);
-  run->SetGeomFile(geoFile);
-
-  TString monitorFile {outFile};
-  monitorFile.ReplaceAll("rec", "rec.monitor");
-  FairMonitor::GetMonitor()->EnableMonitor(kTRUE, monitorFile);
-  // -----------------------------------------------------------------------
-
-
-  // -----   Logger settings   ----------------------------------------------
-  FairLogger::GetLogger()->SetLogScreenLevel(logLevel.Data());
-  FairLogger::GetLogger()->SetLogVerbosityLevel(logVerbosity.Data());
-  // ------------------------------------------------------------------------
-
-  //--------------------event builder-------------------//
-  CbmMcbm2018EventBuilder* eventBuilder = new CbmMcbm2018EventBuilder();
-  // eventBuilder->SetEventBuilderAlgo(EventBuilderAlgo::MaximumTimeGap);
-  //eventBuilder->SetMaximumTimeGap(50.);
-  eventBuilder->SetEventBuilderAlgo(EventBuilderAlgo::FixedTimeWindow);
-  eventBuilder->SetFixedTimeWindow(200.);
-  eventBuilder->SetTriggerMinNumberT0(1);
-  //eventBuilder->SetTriggerMinNumberSts(0);
-  eventBuilder->SetTriggerMinNumberMuch(1);
-  eventBuilder->SetTriggerMinNumberTof(10);
-  run->AddTask(eventBuilder);
-
-  // -----   Reconstruction tasks   -----------------------------------------
-
-  // ------------------------------------------------------------------------
-  Int_t flag = 1;
-  CbmMuchFindHitsGem* muchFindHits =
-    new CbmMuchFindHitsGem(muchDigiFile.Data(), flag);
-  muchFindHits->SetBeamTimeDigi(kTRUE);
-  run->AddTask(muchFindHits);
-  std::cout << "-I- : Added task " << muchFindHits->GetName() << std::endl;
-  //-------------------------------------------------------------------------------
-
-
-  // -----   Local reconstruction in STS   ----------------------------------
-  CbmRecoSts* recoSts = new CbmRecoSts();
-  //  recoSts->SetMode(kCbmRecoEvent);
-
-  //recoSts->SetTimeCutDigisAbs( 20 );// cluster finder: time cut in ns
-  //recoSts->SetTimeCutClustersAbs(20.); // hit finder: time cut in ns
-
-  // ASIC params: #ADC channels, dyn. range, threshold, time resol., dead time,
-  // noise RMS, zero-threshold crossing rate
-  auto parAsic =
-    new CbmStsParAsic(32, 75000., 3000., 5., 800., 1000., 3.9789e-3);
-
-  // Module params: number of channels, number of channels per ASIC
-  auto parMod = new CbmStsParModule(2048, 128);
-  parMod->SetAllAsics(*parAsic);
-  recoSts->UseModulePar(parMod);
-
-  // Sensor params
-  auto sensorPar = new CbmStsParSensor(CbmStsSensorClass::kDssdStereo);
-  sensorPar->SetPar(0, 6.2092);  // Extension in x
-  sensorPar->SetPar(1, 6.2);     // Extension in y
-  sensorPar->SetPar(2, 0.03);    // Extension in z
-  sensorPar->SetPar(3, 5.9692);  // Active size in y
-  sensorPar->SetPar(4, 1024.);   // Number of strips front side
-  sensorPar->SetPar(5, 1024.);   // Number of strips back side
-  sensorPar->SetPar(6, 0.0058);  // Strip pitch front side
-  sensorPar->SetPar(7, 0.0058);  // Strip pitch back side
-  sensorPar->SetPar(8, 7.5);     // Stereo angle front side
-  sensorPar->SetPar(9, 0.0);     // Stereo angle back side
-  recoSts->UseSensorPar(sensorPar);
-
-  // Sensor conditions: full depletion voltage, bias voltage, temperature,
-  // coupling capacitance, inter-strip capacitance
-  auto sensorCond = new CbmStsParSensorCond(70., 140., 268., 17.5, 1.);
-  recoSts->UseSensorCond(sensorCond);
-
-  fRun->AddTask(recoSts);
-  std::cout << "-I- : Added task " << recoSts->GetName() << std::endl;
-  // ------------------------------------------------------------------------
-
-
-  // -----  Parameter database   --------------------------------------------
-  std::cout << std::endl << std::endl;
-  std::cout << "-I- " << myName << ": Set runtime DB" << std::endl;
-  FairRuntimeDb* rtdb        = run->GetRuntimeDb();
-  FairParRootFileIo* parIo1  = new FairParRootFileIo();
-  FairParAsciiFileIo* parIo2 = new FairParAsciiFileIo();
-  parIo1->open(parFile.Data(), "UPDATE");
-  rtdb->setFirstInput(parIo1);
-  // ------------------------------------------------------------------------
-
-
-  // -----   Run initialisation   -------------------------------------------
-  std::cout << std::endl;
-  std::cout << "-I- " << myName << ": Initialise run" << std::endl;
-  run->Init();
-  rtdb->setOutput(parIo1);
-  rtdb->saveOutput();
-  rtdb->print();
-  // ------------------------------------------------------------------------
-
-
-  // -----   Start run   ----------------------------------------------------
-  std::cout << std::endl << std::endl;
-  std::cout << "-I- " << myName << ": Starting run" << std::endl;
-  run->Run(0, nTimeslices);
-  // ------------------------------------------------------------------------
-
-
-  // -----   Finish   -------------------------------------------------------
-  timer.Stop();
-  FairMonitor::GetMonitor()->Print();
-  Double_t rtime = timer.RealTime();
-  Double_t ctime = timer.CpuTime();
-  std::cout << std::endl << std::endl;
-  std::cout << "Macro finished successfully." << std::endl;
-  std::cout << "Output file is " << outFile << std::endl;
-  std::cout << "Parameter file is " << parFileOut << std::endl;
-  std::cout << "Real time " << rtime << " s, CPU time " << ctime << " s"
-            << std::endl;
-  std::cout << std::endl;
-  std::cout << " Test passed" << std::endl;
-  std::cout << " All ok " << std::endl;
-  // ------------------------------------------------------------------------
-
-
-  // -----   Resource monitoring   ------------------------------------------
-  // Extract the maximal used memory an add is as Dart measurement
-  // This line is filtered by CTest and the value send to CDash
-  FairSystemInfo sysInfo;
-  Float_t maxMemory = sysInfo.GetMaxMemory();
-  std::cout << "<DartMeasurement name=\"MaxMemory\" type=\"numeric/double\">";
-  std::cout << maxMemory;
-  std::cout << "</DartMeasurement>" << std::endl;
-
-  Float_t cpuUsage = ctime / rtime;
-  std::cout << "<DartMeasurement name=\"CpuLoad\" type=\"numeric/double\">";
-  std::cout << cpuUsage;
-  std::cout << "</DartMeasurement>" << std::endl;
-  // ------------------------------------------------------------------------
-
-
-  // -----   Function needed for CTest runtime dependency   -----------------
-  //  RemoveGeoManager();
-  // ------------------------------------------------------------------------
-}
+// --------------------------------------------------------------------------
+//
+// Macro for reconstruction of mcbm data (2020)
+// Combined Event based local reconstruction (Event Building (Florian one) +
+// cluster + hit finder) for different subsystems.
+//
+// --------------------------------------------------------------------------
+
+void mcbm_event_reco(Int_t runId = 831, Int_t nTimeslices = 300) {
+
+  // --- Logger settings ----------------------------------------------------
+  TString logLevel     = "INFO";
+  TString logVerbosity = "LOW";
+  // ------------------------------------------------------------------------
+
+
+  // -----   Environment   --------------------------------------------------
+  TString myName   = "mcbm_reco";  // this macro's name for screen output
+  TString srcDir   = gSystem->Getenv("VMCWORKDIR");  // top source directory
+  TString paramDir = srcDir + "/macro/beamtime/mcbm2020/";
+  // ------------------------------------------------------------------------
+
+
+  // -----   In- and output file names   ------------------------------------
+  TString inFile  = Form("./data/unp_mcbm_%i.root", runId);
+  TString parFile = Form("./data/unp_mcbm_params_%i.root", runId);
+  TString geoFile = paramDir + "mcbm2020_reco.geo.root";  // Created in sim. run
+  TString outFile = Form("./data/reco_mcbm_%i.root", runId);
+  // ------------------------------------------------------------------------
+
+
+  // -----   Timer   --------------------------------------------------------
+  TStopwatch timer;
+  timer.Start();
+  // ------------------------------------------------------------------------
+
+
+  // -----   FairRunAna   ---------------------------------------------------
+  FairRunAna* run             = new FairRunAna();
+  FairFileSource* inputSource = new FairFileSource(inFile);
+  run->SetSource(inputSource);
+
+  FairRootFileSink* outputSink = new FairRootFileSink(outFile);
+  run->SetSink(outputSink);
+  run->SetGeomFile(geoFile);
+
+  // Define output file for FairMonitor histograms
+  TString monitorFile {outFile};
+  monitorFile.ReplaceAll("rec", "rec.monitor");
+  FairMonitor::GetMonitor()->EnableMonitor(kTRUE, monitorFile);
+  // ------------------------------------------------------------------------
+
+
+  // -----   Logger settings   ----------------------------------------------
+  FairLogger::GetLogger()->SetLogScreenLevel(logLevel.Data());
+  FairLogger::GetLogger()->SetLogVerbosityLevel(logVerbosity.Data());
+  // ------------------------------------------------------------------------
+
+  //--------------------event builder-------------------//
+  CbmMcbm2018EventBuilder* eventBuilder = new CbmMcbm2018EventBuilder();
+  // eventBuilder->SetEventBuilderAlgo(EventBuilderAlgo::MaximumTimeGap);
+  //eventBuilder->SetMaximumTimeGap(50.);
+  eventBuilder->SetEventBuilderAlgo(EventBuilderAlgo::FixedTimeWindow);
+  eventBuilder->SetFixedTimeWindow(200.);
+  eventBuilder->SetTriggerMinNumberT0(1);
+  //eventBuilder->SetTriggerMinNumberSts(0);
+  eventBuilder->SetTriggerMinNumberMuch(1);
+  eventBuilder->SetTriggerMinNumberTof(10);
+  run->AddTask(eventBuilder);
+  // ------------------------------------------------------------------------
+
+
+  // -----   Reconstruction tasks   -----------------------------------------
+
+  // -----   Local reconstruction in MUCH   ---------------------------------
+  Int_t flag = 1;
+  TString parDir =
+    TString(gSystem->Getenv("VMCWORKDIR")) + TString("/parameters");
+  TString muchDigiFile(
+    parDir + "/much/much_v19c_mcbm_digi_sector.root");  // MUCH digi file
+  CbmMuchFindHitsGem* muchFindHits =
+    new CbmMuchFindHitsGem(muchDigiFile.Data(), flag);
+  muchFindHits->SetBeamTimeDigi(kTRUE);
+  run->AddTask(muchFindHits);
+  std::cout << "-I- : Added task " << muchFindHits->GetName() << std::endl;
+  //-------------------------------------------------------------------------------
+
+
+  // -----   Local reconstruction in STS   ----------------------------------
+  CbmRecoSts* recoSts = new CbmRecoSts();
+  recoSts->SetMode(kCbmRecoEvent);
+
+  //recoSts->SetTimeCutDigisAbs( 20 );// cluster finder: time cut in ns
+  //recoSts->SetTimeCutClustersAbs(20.); // hit finder: time cut in ns
+
+  // ASIC params: #ADC channels, dyn. range, threshold, time resol., dead time,
+  // noise RMS, zero-threshold crossing rate
+  auto parAsic =
+    new CbmStsParAsic(32, 75000., 3000., 5., 800., 1000., 3.9789e-3);
+
+  // Module params: number of channels, number of channels per ASIC
+  auto parMod = new CbmStsParModule(2048, 128);
+  parMod->SetAllAsics(*parAsic);
+  recoSts->UseModulePar(parMod);
+
+  // Sensor params
+  auto sensorPar = new CbmStsParSensor(CbmStsSensorClass::kDssdStereo);
+  sensorPar->SetPar(0, 6.2092);  // Extension in x
+  sensorPar->SetPar(1, 6.2);     // Extension in y
+  sensorPar->SetPar(2, 0.03);    // Extension in z
+  sensorPar->SetPar(3, 5.9692);  // Active size in y
+  sensorPar->SetPar(4, 1024.);   // Number of strips front side
+  sensorPar->SetPar(5, 1024.);   // Number of strips back side
+  sensorPar->SetPar(6, 0.0058);  // Strip pitch front side
+  sensorPar->SetPar(7, 0.0058);  // Strip pitch back side
+  sensorPar->SetPar(8, 7.5);     // Stereo angle front side
+  sensorPar->SetPar(9, 0.0);     // Stereo angle back side
+  recoSts->UseSensorPar(sensorPar);
+
+  // Sensor conditions: full depletion voltage, bias voltage, temperature,
+  // coupling capacitance, inter-strip capacitance
+  auto sensorCond = new CbmStsParSensorCond(70., 140., 268., 17.5, 1.);
+  recoSts->UseSensorCond(sensorCond);
+
+  run->AddTask(recoSts);
+  std::cout << "-I- : Added task " << recoSts->GetName() << std::endl;
+  // ------------------------------------------------------------------------
+
+
+  // -----   Local reconstruction in TRD   ----------------------------------
+  // ------------------------------------------------------------------------
+
+
+  // -----   Local reconstruction in TOF   ----------------------------------
+  // ------------------------------------------------------------------------
+
+
+  // -----   Local reconstruction of RICH Hits ------------------------------
+  CbmRichMCbmHitProducer* hitProdRich = new CbmRichMCbmHitProducer();
+  hitProdRich->setToTLimits(23.7, 30.0);
+  hitProdRich->applyToTCut();
+  TString sRichMapFile =
+    srcDir + "/macro/rich/mcbm/beamtime/mRICH_Mapping_vert_20190318_elView.geo";
+  hitProdRich->SetMappingFile(sRichMapFile.Data());
+  run->AddTask(hitProdRich);
+  // ------------------------------------------------------------------------
+
+  // -----   Local reconstruction in RICh -> Finding of Rings ---------------
+  CbmRichReconstruction* richReco = new CbmRichReconstruction();
+  richReco->UseMCbmSetup();
+  run->AddTask(richReco);
+  // ------------------------------------------------------------------------
+
+
+  // -----  Psd hit producer   ----------------------------------------------
+  CbmPsdMCbmHitProducer* hitProdPsd = new CbmPsdMCbmHitProducer();
+  run->AddTask(hitProdPsd);
+  // ------------------------------------------------------------------------
+
+
+  // -----  Parameter database   --------------------------------------------
+  std::cout << std::endl << std::endl;
+  std::cout << "-I- " << myName << ": Set runtime DB" << std::endl;
+  FairRuntimeDb* rtdb        = run->GetRuntimeDb();
+  FairParRootFileIo* parIo1  = new FairParRootFileIo();
+  FairParAsciiFileIo* parIo2 = new FairParAsciiFileIo();
+  parIo1->open(parFile.Data(), "UPDATE");
+  rtdb->setFirstInput(parIo1);
+  // ------------------------------------------------------------------------
+
+
+  // -----   Run initialisation   -------------------------------------------
+  std::cout << std::endl;
+  std::cout << "-I- " << myName << ": Initialise run" << std::endl;
+  run->Init();
+  rtdb->setOutput(parIo1);
+  rtdb->saveOutput();
+  rtdb->print();
+  // ------------------------------------------------------------------------
+
+
+  // -----   Start run   ----------------------------------------------------
+  std::cout << std::endl << std::endl;
+  std::cout << "-I- " << myName << ": Starting run" << std::endl;
+  run->Run(0, nTimeslices);
+  // ------------------------------------------------------------------------
+
+
+  // -----   Finish   -------------------------------------------------------
+  timer.Stop();
+  FairMonitor::GetMonitor()->Print();
+  Double_t rtime = timer.RealTime();
+  Double_t ctime = timer.CpuTime();
+  std::cout << std::endl << std::endl;
+  std::cout << "Macro finished successfully." << std::endl;
+  std::cout << "Output file is " << outFile << std::endl;
+  std::cout << "Parameter file is " << parFileOut << std::endl;
+  std::cout << "Real time " << rtime << " s, CPU time " << ctime << " s"
+            << std::endl;
+  std::cout << std::endl;
+  // ------------------------------------------------------------------------
+
+
+  // -----   Resource monitoring   ------------------------------------------
+  // Extract the maximal used memory an add is as Dart measurement
+  // This line is filtered by CTest and the value send to CDash
+  FairSystemInfo sysInfo;
+  Float_t maxMemory = sysInfo.GetMaxMemory();
+  std::cout << "<DartMeasurement name=\"MaxMemory\" type=\"numeric/double\">";
+  std::cout << maxMemory;
+  std::cout << "</DartMeasurement>" << std::endl;
+
+  Float_t cpuUsage = ctime / rtime;
+  std::cout << "<DartMeasurement name=\"CpuLoad\" type=\"numeric/double\">";
+  std::cout << cpuUsage;
+  std::cout << "</DartMeasurement>" << std::endl;
+  // ------------------------------------------------------------------------
+
+
+  // -----   Function needed for CTest runtime dependency   -----------------
+  //  RemoveGeoManager();
+  // ------------------------------------------------------------------------
+
+  /// --- Screen output for automatic tests
+  std::cout << " Test passed" << std::endl;
+  std::cout << " All ok " << std::endl;
+}
diff --git a/macro/beamtime/mcbm2020/mcbm_reco.C b/macro/beamtime/mcbm2020/mcbm_reco.C
index 67a450068f61854b61587da3d0bceae7da534d9b..c3d5a98522b6ed67573ad8dc91bbc57932faf9ec 100644
--- a/macro/beamtime/mcbm2020/mcbm_reco.C
+++ b/macro/beamtime/mcbm2020/mcbm_reco.C
@@ -35,24 +35,20 @@ void mcbm_reco(Int_t runId = 831, Int_t nTimeslices = 0) {
   // ------------------------------------------------------------------------
 
 
-  // ----    Debug option   -------------------------------------------------
-  gDebug = 0;
-  // ------------------------------------------------------------------------
-
-
   // -----   FairRunAna   ---------------------------------------------------
   FairRunAna* run             = new FairRunAna();
   FairFileSource* inputSource = new FairFileSource(inFile);
   run->SetSource(inputSource);
 
-  run->SetOutputFile(outFile);
-  //  run->SetGenerateRunInfo(kTRUE);
+  FairRootFileSink* outputSink = new FairRootFileSink(outFile);
+  run->SetSink(outputSink);
   run->SetGeomFile(geoFile);
 
+  // Define output file for FairMonitor histograms
   TString monitorFile {outFile};
   monitorFile.ReplaceAll("rec", "rec.monitor");
   FairMonitor::GetMonitor()->EnableMonitor(kTRUE, monitorFile);
-  // -----------------------------------------------------------------------
+  // ------------------------------------------------------------------------
 
 
   // -----   Logger settings   ----------------------------------------------
@@ -78,8 +74,9 @@ void mcbm_reco(Int_t runId = 831, Int_t nTimeslices = 0) {
 
   // -----   Local reconstruction in STS   ----------------------------------
   CbmRecoSts* recoSts = new CbmRecoSts();
-  //recoSts->SetTimeCutDigisAbs( 100 );// cluster finder: time cut in ns
-  //recoSts->SetTimeCutClustersAbs(100.); // hit finder: time cut in ns
+
+  //recoSts->SetTimeCutDigisAbs( 20 );// cluster finder: time cut in ns
+  //recoSts->SetTimeCutClustersAbs(20.); // hit finder: time cut in ns
 
   // ASIC params: #ADC channels, dyn. range, threshold, time resol., dead time,
   // noise RMS, zero-threshold crossing rate
@@ -115,9 +112,6 @@ void mcbm_reco(Int_t runId = 831, Int_t nTimeslices = 0) {
   // ------------------------------------------------------------------------
 
 
-  // ------------------------------------------------------------------------
-
-
   // -----   Local reconstruction in TRD   ----------------------------------
   // ------------------------------------------------------------------------
 
@@ -148,6 +142,7 @@ void mcbm_reco(Int_t runId = 831, Int_t nTimeslices = 0) {
   run->AddTask(hitProdPsd);
   // ------------------------------------------------------------------------
 
+
   // -----  Parameter database   --------------------------------------------
   std::cout << std::endl << std::endl;
   std::cout << "-I- " << myName << ": Set runtime DB" << std::endl;
@@ -156,7 +151,6 @@ void mcbm_reco(Int_t runId = 831, Int_t nTimeslices = 0) {
   FairParAsciiFileIo* parIo2 = new FairParAsciiFileIo();
   parIo1->open(parFile.Data(), "UPDATE");
   rtdb->setFirstInput(parIo1);
-
   // ------------------------------------------------------------------------
 
 
diff --git a/macro/beamtime/mcbm2020/mcbm_reco_kronos.C b/macro/beamtime/mcbm2020/mcbm_reco_kronos.C
index acfee88579ccf43dcca219c448fedf52e23543c6..5c9147d045a6bf7b0c0f6fd7db4d87ad80a42754 100644
--- a/macro/beamtime/mcbm2020/mcbm_reco_kronos.C
+++ b/macro/beamtime/mcbm2020/mcbm_reco_kronos.C
@@ -17,7 +17,6 @@ void mcbm_reco_kronos(Int_t runId = 831, Int_t nTimeslices = 0) {
   TString myName   = "mcbm_reco";  // this macro's name for screen output
   TString srcDir   = gSystem->Getenv("VMCWORKDIR");  // top source directory
   TString paramDir = srcDir + "/macro/beamtime/mcbm2020/";
-  // TString srcDir1 = gSystem->Getenv("SLURM_INDEX");
   //    ------------------------------------------------------------------------
 
 
@@ -29,8 +28,8 @@ void mcbm_reco_kronos(Int_t runId = 831, Int_t nTimeslices = 0) {
     Form("/lustre/cbm/users/ploizeau/mcbm2020/unp_evt_data_7f229b3f_20201103/"
          "unp_mcbm_params_%i.root",
          runId);
-  TString parFileOut = Form("reco_mcbm_params_%i.root", runId);
   TString geoFile = paramDir + "mcbm2020_reco.geo.root";  // Created in sim. run
+  TString parFileOut = Form("./data/reco_mcbm_params_%i.root", runId);
   TString outFile = Form("./data/reco_mcbm_%i.root", runId);
   // ------------------------------------------------------------------------
 
@@ -41,24 +40,20 @@ void mcbm_reco_kronos(Int_t runId = 831, Int_t nTimeslices = 0) {
   // ------------------------------------------------------------------------
 
 
-  // ----    Debug option   -------------------------------------------------
-  gDebug = 0;
-  // ------------------------------------------------------------------------
-
-
   // -----   FairRunAna   ---------------------------------------------------
   FairRunAna* run             = new FairRunAna();
   FairFileSource* inputSource = new FairFileSource(inFile);
   run->SetSource(inputSource);
 
-  run->SetOutputFile(outFile);
-  //run->SetGenerateRunInfo(kTRUE);
+  FairRootFileSink* outputSink = new FairRootFileSink(outFile);
+  run->SetSink(outputSink);
   run->SetGeomFile(geoFile);
 
+  // Define output file for FairMonitor histograms
   TString monitorFile {outFile};
   monitorFile.ReplaceAll("rec", "rec.monitor");
   FairMonitor::GetMonitor()->EnableMonitor(kTRUE, monitorFile);
-  // -----------------------------------------------------------------------
+  // ------------------------------------------------------------------------
 
 
   // -----   Logger settings   ----------------------------------------------
@@ -80,13 +75,13 @@ void mcbm_reco_kronos(Int_t runId = 831, Int_t nTimeslices = 0) {
   muchFindHits->SetBeamTimeDigi(kTRUE);
   run->AddTask(muchFindHits);
   std::cout << "-I- : Added task " << muchFindHits->GetName() << std::endl;
-
   //--------------------------------------------------------
 
   // -----   Local reconstruction in STS   ----------------------------------
   CbmRecoSts* recoSts = new CbmRecoSts();
-  //recoSts->SetTimeCutDigisAbs( 100 );// cluster finder: time cut in ns
-  //recoSts->SetTimeCutClustersAbs(100.); // hit finder: time cut in ns
+
+  //recoSts->SetTimeCutDigisAbs( 20 );// cluster finder: time cut in ns
+  //recoSts->SetTimeCutClustersAbs(20.); // hit finder: time cut in ns
 
   // ASIC params: #ADC channels, dyn. range, threshold, time resol., dead time,
   // noise RMS, zero-threshold crossing rate
@@ -152,27 +147,25 @@ void mcbm_reco_kronos(Int_t runId = 831, Int_t nTimeslices = 0) {
   run->AddTask(hitProdPsd);
   // ------------------------------------------------------------------------
 
+
   // -----  Parameter database   --------------------------------------------
   std::cout << std::endl << std::endl;
   std::cout << "-I- " << myName << ": Set runtime DB" << std::endl;
   FairRuntimeDb* rtdb        = run->GetRuntimeDb();
   FairParRootFileIo* parIo1  = new FairParRootFileIo();
   FairParAsciiFileIo* parIo2 = new FairParAsciiFileIo();
-  // ------------------------------------------------------------------------
-
   FairParRootFileIo* parIo3 = new FairParRootFileIo();
   parIo1->open(parFileIn.Data(), "READ");
   parIo3->open(parFileOut.Data(), "RECREATE");
   rtdb->setFirstInput(parIo1);
-  rtdb->setOutput(parIo3);
+  // ------------------------------------------------------------------------
 
-  //--------------------------------------------------------------------------
 
   // -----   Run initialisation   -------------------------------------------
   std::cout << std::endl;
   std::cout << "-I- " << myName << ": Initialise run" << std::endl;
   run->Init();
-  rtdb->setOutput(parIo1);
+  rtdb->setOutput(parIo3);
   rtdb->saveOutput();
   rtdb->print();
   // ------------------------------------------------------------------------