From 4d8d31f5e7fd94c0eebcb79ef62ff0a273381d70 Mon Sep 17 00:00:00 2001
From: P-A Loizeau <p.-a.loizeau@gsi.de>
Date: Thu, 2 Jul 2020 17:03:26 +0200
Subject: [PATCH] mCBM 2020: add CDASH test if tsa files present +
 corresponding changes/fixes in tested macros

---
 macro/beamtime/CMakeLists.txt                 | 129 +++-
 .../beamtime/mcbm2020/Dart_mcbm_mcbmop01.cfg  |  22 +
 macro/beamtime/mcbm2020/MonitorPsd.C          |   6 +-
 macro/beamtime/mcbm2020/MonitorTof.C          |   4 +-
 macro/beamtime/mcbm2020/MonitorTrd.C          |  21 +-
 macro/beamtime/mcbm2020/build_event_win.C     | 132 ++++
 .../mcbm2020/build_event_win_kronos.C         | 159 +++++
 macro/beamtime/mcbm2020/build_events.C        |   3 +
 macro/beamtime/mcbm2020/check_events.C        |  68 +-
 .../mcbm2020/unpack_check_time_mcbm_kronos.C  | 619 ++++++++++++++++++
 10 files changed, 1133 insertions(+), 30 deletions(-)
 create mode 100644 macro/beamtime/mcbm2020/Dart_mcbm_mcbmop01.cfg
 create mode 100644 macro/beamtime/mcbm2020/build_event_win.C
 create mode 100644 macro/beamtime/mcbm2020/build_event_win_kronos.C
 create mode 100644 macro/beamtime/mcbm2020/unpack_check_time_mcbm_kronos.C

diff --git a/macro/beamtime/CMakeLists.txt b/macro/beamtime/CMakeLists.txt
index 5eb7c3330d..030a76672b 100644
--- a/macro/beamtime/CMakeLists.txt
+++ b/macro/beamtime/CMakeLists.txt
@@ -97,7 +97,7 @@ Set(fixture_built_evt fixture_done_${testname})
 set_tests_properties(${testname} PROPERTIES FIXTURES_SETUP ${fixture_built_evt})
 
 Set(testname mcbm_check_event_2019)
-Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2019/build_events.sh \"data/unp_mcbm_399.root\" 399 )
+Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2019/check_events.sh 99999 399 )
 Set_Tests_Properties(${testname} PROPERTIES TIMEOUT "600")
 Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Test Passed;All ok")
 set_tests_properties(${testname} PROPERTIES FIXTURES_REQUIRED ${fixture_built_evt})
@@ -141,5 +141,132 @@ set_tests_properties(${testname} PROPERTIES DEPENDS mcbm_monirich_2019)
 
 #####################
 
+##### mCBM 2020 tests: only if test TSA files for "typical runs" present
+If(DEFINED ENV{RAW_DATA_PATH} )
+  SET( RAW_DATA_PATH $ENV{RAW_DATA_PATH} )
+
+  Message( STATUS "Raw data path provided => Performing mCBM 2020 tests using tsa files in ${RAW_DATA_PATH}" )
+
+  ## Generate scripts
+  GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/beamtime/mcbm2020/unpack_tsa_mcbm.C )  # Unpackers
+  GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/beamtime/mcbm2020/check_timing.C )     # CbmCheckTiming.h
+  GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/beamtime/mcbm2020/check_pulser.C )     # CbmMcbm2019CheckPulser.h
+  GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/beamtime/mcbm2020/build_events.C )     # CbmMcbm2018EventBuilder.h
+  GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/beamtime/mcbm2020/check_events.C )     # CbmCheckEvents.h
+  GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/beamtime/mcbm2020/build_event_win.C )  # CbmMcbm2019TimeWinEventBuilderTask.h + CbmMcbm2019TimeWinEventBuilderAlgo.h
+  GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/beamtime/mcbm2020/MonitorT0.C )        # CbmMcbm2018MonitorTaskT0 + CbmMcbm2018MonitorAlgoT0
+  GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/beamtime/mcbm2020/MonitorSts.C )       # CbmMcbm2018MonitorSts.h
+  GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/beamtime/mcbm2020/MonitorMuch.C )      # CbmMcbm2018MonitorMuchLite.h
+  GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/beamtime/mcbm2020/MonitorTrd.C )       # CbmMcbm2018UnpackerTaskTrd.h in monitor mode
+  GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/beamtime/mcbm2020/MonitorTof.C )       # CbmMcbm2018MonitorTaskTof + CbmMcbm2018MonitorAlgoTof
+  GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/beamtime/mcbm2020/MonitorRich.C )      # CbmMcbm2018UnpackerTaskRich.h in monitor mode
+  GENERATE_ROOT_TEST_SCRIPT(${CBMROOT_SOURCE_DIR}/macro/beamtime/mcbm2020/MonitorPsd.C )       # CbmMcbm2018MonitorTaskPsd + CbmMcbm2018MonitorAlgoPsd
+
+  ## Run only if raw data files present
+  ForEach(RUN 759 760 761 762 811 812 819 824 831 856 )
+    Message( STATUS "Checking if raw data file exists: ${RAW_DATA_PATH}/${RUN}_first20Ts.tsa" )
+    If(EXISTS ${RAW_DATA_PATH}/${RUN}_first20Ts.tsa)
+      Message( STATUS "Raw data file found, tests will be performed for mCBM run ${RUN}" )
+
+      ## Define tests + dependencies
+      Set(testname mcbm_unpack_2020_${RUN})
+      Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2020/unpack_tsa_mcbm.sh \"${RAW_DATA_PATH}/${RUN}_first20Ts.tsa\" ${RUN} )
+      Set_Tests_Properties(${testname} PROPERTIES TIMEOUT "600")
+      Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Test Passed;All ok")
+      Set(fixture_unpacked_${RUN} fixture_done_${testname})
+      set_tests_properties(${testname} PROPERTIES FIXTURES_SETUP ${fixture_unpacked_${RUN}})
+
+      Set(testname mcbm_check_timing_2020_${RUN})
+      Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2020/check_timing.sh \"data/unp_mcbm_${RUN}.root\" ${RUN} )
+      Set_Tests_Properties(${testname} PROPERTIES TIMEOUT "600")
+  #    Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Total number of T0 digis: 18")
+  #    Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Total number of Sts digis: 1061912")
+  #    Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Total number of Much digis: 319732")
+  #    Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Total number of Tof digis: 246711")
+  #    Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Total number of Rich digis: 5359")
+  #    Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Total number of Psd digis: 0")
+      Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Test Passed;All ok")
+      set_tests_properties(${testname} PROPERTIES FIXTURES_REQUIRED ${fixture_unpacked_${RUN}})
+      ### Make this test run alone to try to avoid memory errors on test machines
+      set_tests_properties(${testname} PROPERTIES RUN_SERIAL true )
+
+      Set(testname mcbm_check_pulser_2020_${RUN})
+      Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2020/check_pulser.sh ${RUN} )
+      Set_Tests_Properties(${testname} PROPERTIES TIMEOUT "300")
+      Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Test Passed;All ok")
+      set_tests_properties(${testname} PROPERTIES FIXTURES_REQUIRED ${fixture_unpacked_${RUN}})
+      set_tests_properties(${testname} PROPERTIES DEPENDS mcbm_check_timing_2020_${RUN})
+
+      Set(testname mcbm_build_event_2020_${RUN})
+      Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2020/build_events.sh \"data/unp_mcbm_${RUN}.root\" ${RUN} )
+      Set_Tests_Properties(${testname} PROPERTIES TIMEOUT "600")
+      Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Test Passed;All ok")
+      set_tests_properties(${testname} PROPERTIES FIXTURES_REQUIRED ${fixture_unpacked_${RUN}})
+      set_tests_properties(${testname} PROPERTIES DEPENDS mcbm_check_pulser_2020_${RUN})
+      Set(fixture_built_evt_${RUN} fixture_done_${testname})
+      set_tests_properties(${testname} PROPERTIES FIXTURES_SETUP ${fixture_built_evt_${RUN}})
+
+      Set(testname mcbm_check_event_2020_${RUN})
+      Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2020/check_events.sh 99999 ${RUN} )
+      Set_Tests_Properties(${testname} PROPERTIES TIMEOUT "600")
+      Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Test Passed;All ok")
+      set_tests_properties(${testname} PROPERTIES FIXTURES_REQUIRED ${fixture_built_evt_${RUN}})
+      set_tests_properties(${testname} PROPERTIES DEPENDS mcbm_build_event_2020_${RUN})
+
+      Set(testname mcbm_build_event_win_2020_${RUN})
+      Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2020/build_event_win.sh ${RUN} )
+      Set_Tests_Properties(${testname} PROPERTIES TIMEOUT "600")
+      Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Test Passed;All ok")
+      set_tests_properties(${testname} PROPERTIES FIXTURES_REQUIRED ${fixture_unpacked_${RUN}})
+      set_tests_properties(${testname} PROPERTIES DEPENDS mcbm_check_event_2020_${RUN})
+      Set(fixture_built_evt_win_${RUN} fixture_done_${testname})
+      set_tests_properties(${testname} PROPERTIES FIXTURES_SETUP ${fixture_built_evt_win_${RUN}})
+
+      Set(testname mcbm_monit0_2020_${RUN})
+      Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2020/MonitorT0.sh \"${RAW_DATA_PATH}/${RUN}_first20Ts.tsa\" )
+      Set_Tests_Properties(${testname} PROPERTIES TIMEOUT "300")
+      Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Test Passed;All ok")
+      set_tests_properties(${testname} PROPERTIES DEPENDS mcbm_build_event_win_2020_${RUN})
+
+      Set(testname mcbm_monists_2020_${RUN})
+      Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2020/MonitorSts.sh \"${RAW_DATA_PATH}/${RUN}_first20Ts.tsa\" \"\" ${RUN} )
+      Set_Tests_Properties(${testname} PROPERTIES TIMEOUT "300")
+      Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Test Passed;All ok")
+      set_tests_properties(${testname} PROPERTIES DEPENDS mcbm_monit0_2020_${RUN})
+
+      Set(testname mcbm_monimuch_2020_${RUN})
+      Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2020/MonitorMuch.sh \"${RAW_DATA_PATH}/${RUN}_first20Ts.tsa\" \"\" ${RUN} )
+      Set_Tests_Properties(${testname} PROPERTIES TIMEOUT "300")
+      Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Test Passed;All ok")
+      set_tests_properties(${testname} PROPERTIES DEPENDS mcbm_monists_2020_${RUN})
+
+      Set(testname mcbm_monitrd_2020_${RUN})
+      Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2020/MonitorTrd.sh \"${RAW_DATA_PATH}/${RUN}_first20Ts.tsa\" )
+      Set_Tests_Properties(${testname} PROPERTIES TIMEOUT "300")
+      Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Test Passed;All ok")
+      set_tests_properties(${testname} PROPERTIES DEPENDS mcbm_monimuch_2020_${RUN})
+
+      Set(testname mcbm_monitof_2020_${RUN})
+      Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2020/MonitorTof.sh \"${RAW_DATA_PATH}/${RUN}_first20Ts.tsa\" )
+      Set_Tests_Properties(${testname} PROPERTIES TIMEOUT "300")
+      Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Test Passed;All ok")
+      set_tests_properties(${testname} PROPERTIES DEPENDS mcbm_monitrd_2020_${RUN})
+
+      Set(testname mcbm_monirich_2020_${RUN})
+      Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2020/MonitorRich.sh \"${RAW_DATA_PATH}/${RUN}_first20Ts.tsa\" )
+      Set_Tests_Properties(${testname} PROPERTIES TIMEOUT "300")
+      Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Test Passed;All ok")
+      set_tests_properties(${testname} PROPERTIES DEPENDS mcbm_monitof_2020_${RUN})
+
+      Set(testname mcbm_monipsd_2020_${RUN})
+      Add_Test(${testname} ${CBMROOT_BINARY_DIR}/macro/beamtime/mcbm2020/MonitorPsd.sh \"${RAW_DATA_PATH}/${RUN}_first20Ts.tsa\" )
+      Set_Tests_Properties(${testname} PROPERTIES TIMEOUT "300")
+      Set_Tests_Properties(${testname} PROPERTIES PASS_REGULAR_EXPRESSION "Test Passed;All ok")
+      set_tests_properties(${testname} PROPERTIES DEPENDS mcbm_monirich_2020_${RUN})
+    EndIf() # If(EXISTS ${RAW_DATA_PATH}/${RUN}_first20Ts.tsa))
+  EndForEach() # ForEach(RUN 759 760 761 762 811 812 819 824 856 )
+EndIf() # If(DEFINED ENV{RAW_DATA_PATH} )
+#####################
+
 ### Copy beamtime folder to allow execution of tasks on batch farm after installation
 Install(DIRECTORY cern2016 DESTINATION share/cbmroot/macro/beamtime)
diff --git a/macro/beamtime/mcbm2020/Dart_mcbm_mcbmop01.cfg b/macro/beamtime/mcbm2020/Dart_mcbm_mcbmop01.cfg
new file mode 100644
index 0000000000..4e1f39fffc
--- /dev/null
+++ b/macro/beamtime/mcbm2020/Dart_mcbm_mcbmop01.cfg
@@ -0,0 +1,22 @@
+# Set FairRoot and FairSoft info
+export FAIRSOFT_VERSION=jun19p2
+export FAIRROOT_VERSION=v18.2.1
+export SIMPATH=/opt/cbm/fairsoft_${FAIRSOFT_VERSION}_root6/installation
+export FAIRROOTPATH=/opt/cbm/fairroot_${FAIRROOT_VERSION}-fairsoft_${FAIRSOFT_VERSION}_root6
+
+#for cmake
+export PATH=${SIMPATH}/bin:${PATH}
+
+# info for Dart/CDash
+export BUILDDIR=/opt/cbm/cdash//build_mcbm2020_${FAIRROOT_VERSION}_${FAIRSOFT_VERSION}
+export SOURCEDIR=/opt/cbm/cdash/cbmroot_mcbm2020
+
+FLAV=`cat /etc/debian_version`
+export LINUX_FLAVOUR=Debian-$FLAV
+# or using `lsb_release -d -s`
+
+export RAW_DATA_PATH=/opt/cbm/cdash/raw
+export EXTRA_FLAGS="-DUSE_PATH_INFO=TRUE"
+
+# To prevent the CDASH tasks from spoiling my ROOT history file
+export ROOT_HIST=0
diff --git a/macro/beamtime/mcbm2020/MonitorPsd.C b/macro/beamtime/mcbm2020/MonitorPsd.C
index eeb42fba48..c218f127a1 100644
--- a/macro/beamtime/mcbm2020/MonitorPsd.C
+++ b/macro/beamtime/mcbm2020/MonitorPsd.C
@@ -51,11 +51,11 @@ void MonitorPsd( TString inFile = "", TString sHostname = "localhost",
   CbmMcbm2018MonitorTaskPsd  * monitor_psd  = new CbmMcbm2018MonitorTaskPsd();
 
   monitor_psd->SetIgnoreOverlapMs();
-  monitor_psd->SetHistoryHistoSize( 1000 );
+  monitor_psd->SetHistoryHistoSize( 3600 );
   monitor_psd->SetHistoFilename( outFileNameHistos );
 
-  std::vector< Int_t > fviHistoChargeArgs{500,0,40000};
-  std::vector< Int_t > fviHistoAmplArgs{100,0,3000};
+  std::vector< Int_t > fviHistoChargeArgs{500,0,5000};
+  std::vector< Int_t > fviHistoAmplArgs{100,0,500};
   std::vector< Int_t > fviHistoZLArgs{9000,0,9000};
   monitor_psd->SetChargeHistoArgs( fviHistoChargeArgs );
   monitor_psd->SetAmplHistoArgs( fviHistoAmplArgs );
diff --git a/macro/beamtime/mcbm2020/MonitorTof.C b/macro/beamtime/mcbm2020/MonitorTof.C
index 61d222f1cb..5c2df8ba80 100644
--- a/macro/beamtime/mcbm2020/MonitorTof.C
+++ b/macro/beamtime/mcbm2020/MonitorTof.C
@@ -32,8 +32,8 @@ void MonitorTof(TString inFile = "", TString sHostname = "localhost",
 
   // --- Define parameter files
   TList *parFileList = new TList();
-  //TString paramDir = srcDir + "/macro/beamtime/mcbm2020/";
-  TString paramDir = "/scratch/cbmroot_macro/macro/beamtime/mcbm2020/";
+  TString paramDir = srcDir + "/macro/beamtime/mcbm2020/";
+  //TString paramDir = "/scratch/cbmroot_macro/macro/beamtime/mcbm2020/";
 
   TString paramFileTof = paramDir + "mTofPar.par";
   TObjString* parTofFileName = new TObjString(paramFileTof);
diff --git a/macro/beamtime/mcbm2020/MonitorTrd.C b/macro/beamtime/mcbm2020/MonitorTrd.C
index 9e463fb8fe..229cec13dd 100644
--- a/macro/beamtime/mcbm2020/MonitorTrd.C
+++ b/macro/beamtime/mcbm2020/MonitorTrd.C
@@ -1,5 +1,5 @@
 /*
- * File: /unpack_trd_mcbm2020.C
+ * File: /MonitorTrd.C
  * Created Date: Wednesday March 25th 2020
  * Author: Pascal Raisig -- praisig@ikf.uni-frankfurt.de
  * -----
@@ -41,9 +41,10 @@ void MonitorTrd(TString inFile = "", TString sHostname = "localhost",
 
   // inFile = "/home/praisig/CBM/software/testEnv/data/desy2019/r0070_20190831_0159_0000.tsa"; // FIXME: This is just for testing smarter solution needed! One can probably iterate over files via SetInputDir and the code behind it.
   // inFile = "/home/dspicker/desy2019/r0004_20200220_1951_0000.tsa";
-  inFile = "/local/dschmidt/tsa/pulser07.tsa";    // long pulser file
+  if( "" == inFile && "" == sHostname )
+    inFile = "/local/dschmidt/tsa/pulser07.tsa";    // long pulser file
   // outDir = "/home/praisig/CBM/software/testEnv/data/desy2019/data/";
-  outDir = "output";
+  //outDir = "output";
 
   TString srcDir = gSystem->Getenv("VMCWORKDIR");
 
@@ -53,8 +54,6 @@ void MonitorTrd(TString inFile = "", TString sHostname = "localhost",
 
   // --- Specify output file name (this is just an example)
   TString runId = TString::Format("%u", uRunId);
-  TString outFile = outDir + "/unp_mcbm_" + runId + ".root";
-  TString parFile = outDir + "/unp_mcbm_params_" + runId + ".root";
 
   // --- Set log output levels
   FairLogger::GetLogger();
@@ -85,12 +84,11 @@ void MonitorTrd(TString inFile = "", TString sHostname = "localhost",
   gDebug = 0;
 
   std::cout << std::endl;
-  std::cout << ">>> unpack_tsa: output file is " << outFile << std::endl;
 
   // ========================================================================
   // ========================================================================
   std::cout << std::endl;
-  std::cout << ">>> unpack_tsa: Initialising..." << std::endl;
+  std::cout << ">>> MonitorTrd: Initialising..." << std::endl;
 
   CbmMcbm2018UnpackerTaskTrdR * unpacker_trdR = new CbmMcbm2018UnpackerTaskTrdR();
 
@@ -123,7 +121,7 @@ void MonitorTrd(TString inFile = "", TString sHostname = "localhost",
 //   // --- Source task
   CbmMcbm2018Source* source = new CbmMcbm2018Source();
 
-  if( 0 < uRunId )
+  if( 0 < uRunId || "" != inFile )
   {
     source->SetFileName(inFile);
   } // if( "" != inFile )
@@ -170,7 +168,7 @@ void MonitorTrd(TString inFile = "", TString sHostname = "localhost",
   // --- Start run
   TStopwatch timer;
   timer.Start();
-  std::cout << ">>> unpack_tsa_mcbm: Starting run..." << std::endl;
+  std::cout << ">>> MonitorTrd: Starting run..." << std::endl;
   if ( 0 == nrEvents) {
     run->Run(nEvents, 0); // run until end of input file
   } else {
@@ -187,9 +185,8 @@ void MonitorTrd(TString inFile = "", TString sHostname = "localhost",
   Double_t rtime = timer.RealTime();
   Double_t ctime = timer.CpuTime();
   std::cout << std::endl << std::endl;
-  std::cout << ">>> unpack_tsa_mcbm: Macro finished successfully." << std::endl;
-  std::cout << ">>> unpack_tsa_mcbm: Output file is " << outFile << std::endl;
-  std::cout << ">>> unpack_tsa_mcbm: Real time " << rtime << " s, CPU time "
+  std::cout << ">>> MonitorTrd: Macro finished successfully." << std::endl;
+  std::cout << ">>> MonitorTrd: Real time " << rtime << " s, CPU time "
 	    << ctime << " s" << std::endl;
   std::cout << std::endl;
 
diff --git a/macro/beamtime/mcbm2020/build_event_win.C b/macro/beamtime/mcbm2020/build_event_win.C
new file mode 100644
index 0000000000..f7bf55c9ea
--- /dev/null
+++ b/macro/beamtime/mcbm2020/build_event_win.C
@@ -0,0 +1,132 @@
+void build_event_win( UInt_t uRunId = 0, Int_t nEvents = 0, TString outDir="data/")
+{
+  TString fileName = Form( "data/unp_mcbm_%03u.root", uRunId );
+
+  if( uRunId < 692 )
+    return kFALSE;
+
+
+  // ========================================================================
+  //          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");
+
+  // MC file
+
+  TString srcDir = gSystem->Getenv("VMCWORKDIR");
+
+  // -----   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);
+
+  TString runId = TString::Format("%03u", uRunId);
+  TString outFile = outDir + "/events_win_" + runId + ".root";
+  FairRootFileSink* outputSink = new FairRootFileSink(outFile);
+  fRun->SetSink(outputSink);
+
+  // Define output file for FairMonitor histograms
+//  TString monitorFile{outFile};
+//  monitorFile.ReplaceAll("qa","qa.monitor");
+  FairMonitor::GetMonitor()->EnableMonitor(kTRUE);
+//  FairMonitor::GetMonitor()->EnableMonitor(kFALSE);
+  // ------------------------------------------------------------------------
+
+//  CbmMcbm2019TimeWinEventBuilder* eventBuilder = new CbmMcbm2019TimeWinEventBuilder();
+  CbmMcbm2019TimeWinEventBuilderTask* eventBuilder = new CbmMcbm2019TimeWinEventBuilderTask();
+
+  eventBuilder->SetFillHistos( kTRUE );
+
+  eventBuilder->SetEventOverlapMode( EOverlapMode::NoOverlap );
+
+  eventBuilder->SetTriggerWindow( ECbmModuleId::kSts,   -50, 100 );
+  eventBuilder->SetTriggerWindow( ECbmModuleId::kMuch, -150,  50 );
+  eventBuilder->SetTriggerWindow( ECbmModuleId::kTrd,  -250, 100 );
+  eventBuilder->SetTriggerWindow( ECbmModuleId::kTof,  -150,  10 );
+  eventBuilder->SetTriggerWindow( ECbmModuleId::kRich, -150,  20 );
+  eventBuilder->SetTriggerWindow( ECbmModuleId::kPsd,   -50,  10 );
+//  eventBuilder->SetT0PulserTotLimits(   185, 191 );
+  eventBuilder->SetTriggerMinNumberT0(1);
+  eventBuilder->SetTriggerMinNumberSts(0);
+  eventBuilder->SetTriggerMinNumberMuch(0);
+  eventBuilder->SetTriggerMinNumberTrd(0);
+  eventBuilder->SetTriggerMinNumberTof(10);
+  eventBuilder->SetTriggerMinNumberRich(0);
+  eventBuilder->SetTriggerMinNumberPsd(0);
+  if( 0 < uRunId )
+    eventBuilder->SetOutFilename( Form( "%sHistosEvtWin_%03u.root", outDir.Data(), uRunId ) );
+
+  // To get T0 Digis (seed + close digis) in the event
+  eventBuilder->SetTriggerWindow( ECbmModuleId::kT0,   -1, 10 );
+
+  fRun->AddTask(eventBuilder);
+
+  // -----  Parameter database   --------------------------------------------
+//  FairRuntimeDb* rtdb = fRun->GetRuntimeDb();
+//  FairParRootFileIo* parIo1 = new FairParRootFileIo();
+//  parIo1->open(parFile.Data(),"UPDATE");
+//  rtdb->setFirstInput(parIo1);
+  // ------------------------------------------------------------------------
+
+
+  // -----   Intialise and run   --------------------------------------------
+  fRun->Init();
+
+//  rtdb->setOutput(parIo1);
+//  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
+  }
+  // ------------------------------------------------------------------------
+
+
+
+  // -----   Finish   -------------------------------------------------------
+  timer.Stop();
+  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;
+  // ------------------------------------------------------------------------
+
+  // 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;
+
+  Float_t cpuUsage=ctime/rtime;
+  cout << "<DartMeasurement name=\"CpuLoad\" type=\"numeric/double\">";
+  cout << cpuUsage;
+  cout << "</DartMeasurement>" << endl;
+
+  FairMonitor* tempMon = FairMonitor::GetMonitor();
+  tempMon->Print();
+
+  cout << " Test passed" << endl;
+  cout << " All ok " << endl;
+}
diff --git a/macro/beamtime/mcbm2020/build_event_win_kronos.C b/macro/beamtime/mcbm2020/build_event_win_kronos.C
new file mode 100644
index 0000000000..1b436c4082
--- /dev/null
+++ b/macro/beamtime/mcbm2020/build_event_win_kronos.C
@@ -0,0 +1,159 @@
+void build_event_win_kronos( UInt_t uRunIdx = 0, Int_t nEvents = 0, TString outDir="data/")
+{
+  UInt_t uRunId = 0;
+  TString fileName = "data/unp_mcbm_0.root";
+  if( 99999 != uRunIdx )
+  {
+      std::vector< UInt_t > vuListRunId = {
+             692, 698, 702, 704, 705, 706, 707,                //  7 =>  0 -  6
+             744, 750, 759, 760, 761, 762, 799,                //  7 =>  7 - 13
+             811, 812, 816, 817, 819,                     //  5 => 14 - 18
+             820, 821, 822, 824, 826, 827, 828, 829,      //  8 => 19 - 26
+             830, 831, 836,                               //  3 => 27 - 29
+             841, 846, 849,                               //  3 => 30 - 32
+             850, 851, 852, 854, 855, 856, 857, 858, 859, //  9 => 33 - 41
+             860, 861, 862, 863, 864, 865, 866            //  7 => 42 - 48
+/*
+ /// With runs < 1 min due to missmatch!
+             811, 812, 816, 817, 818, 819,                     //  6 => 14 - 19
+             820, 821, 822, 824, 826, 827, 828, 829,           //  8 => 20 - 27
+             830, 831, 836, 839,                               //  4 => 28 - 31
+             840, 841, 842, 844, 845, 846, 848, 849,           //  8 => 32 - 39
+             850, 851, 852, 854, 855, 856, 857, 858, 859,      //  9 => 40 - 48
+             860, 861, 862, 863, 864, 865, 866                 //  7 => 49 - 55
+*/
+         };
+      if( vuListRunId.size() <= uRunIdx )
+         return kFALSE;
+      uRunId = vuListRunId[ uRunIdx ];
+      fileName = Form( "data/unp_mcbm_%03u.root", uRunId );
+  } // if( 99999 != uRunIdx )
+
+  if( uRunId < 692 && 0 != uRunId )
+    return kFALSE;
+
+
+  // ========================================================================
+  //          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");
+
+  // MC file
+
+  TString srcDir = gSystem->Getenv("VMCWORKDIR");
+
+  // -----   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);
+
+  TString runId = TString::Format("%03u", uRunId);
+  TString outFile = outDir + "/events_win_" + runId + ".root";
+  FairRootFileSink* outputSink = new FairRootFileSink(outFile);
+  fRun->SetSink(outputSink);
+
+  // Define output file for FairMonitor histograms
+//  TString monitorFile{outFile};
+//  monitorFile.ReplaceAll("qa","qa.monitor");
+  FairMonitor::GetMonitor()->EnableMonitor(kTRUE);
+//  FairMonitor::GetMonitor()->EnableMonitor(kFALSE);
+  // ------------------------------------------------------------------------
+
+//  CbmMcbm2019TimeWinEventBuilder* eventBuilder = new CbmMcbm2019TimeWinEventBuilder();
+  CbmMcbm2019TimeWinEventBuilderTask* eventBuilder = new CbmMcbm2019TimeWinEventBuilderTask();
+
+  eventBuilder->SetFillHistos( kTRUE );
+
+  eventBuilder->SetEventOverlapMode( EOverlapMode::NoOverlap );
+
+  eventBuilder->SetTriggerWindow( ECbmModuleId::kSts,   -50, 100 );
+  eventBuilder->SetTriggerWindow( ECbmModuleId::kMuch, -150,  50 );
+  eventBuilder->SetTriggerWindow( ECbmModuleId::kTrd,  -250, 100 );
+  eventBuilder->SetTriggerWindow( ECbmModuleId::kTof,  -150,  10 );
+  eventBuilder->SetTriggerWindow( ECbmModuleId::kRich, -150,  20 );
+  eventBuilder->SetTriggerWindow( ECbmModuleId::kPsd,   -50,  10 );
+//  eventBuilder->SetT0PulserTotLimits(   185, 191 );
+  eventBuilder->SetTriggerMinNumberT0(1);
+  eventBuilder->SetTriggerMinNumberSts(0);
+  eventBuilder->SetTriggerMinNumberMuch(0);
+  eventBuilder->SetTriggerMinNumberTrd(0);
+  eventBuilder->SetTriggerMinNumberTof(10);
+  eventBuilder->SetTriggerMinNumberRich(0);
+  eventBuilder->SetTriggerMinNumberPsd(0);
+  if( 0 < uRunId )
+    eventBuilder->SetOutFilename( Form( "%sHistosEvtWin_%03u.root", outDir.Data(), uRunId ) );
+
+  // To get T0 Digis (seed + close digis) in the event
+  eventBuilder->SetTriggerWindow( ECbmModuleId::kT0,   -1, 10 );
+
+  fRun->AddTask(eventBuilder);
+
+  // -----  Parameter database   --------------------------------------------
+//  FairRuntimeDb* rtdb = fRun->GetRuntimeDb();
+//  FairParRootFileIo* parIo1 = new FairParRootFileIo();
+//  parIo1->open(parFile.Data(),"UPDATE");
+//  rtdb->setFirstInput(parIo1);
+  // ------------------------------------------------------------------------
+
+
+  // -----   Intialise and run   --------------------------------------------
+  fRun->Init();
+
+//  rtdb->setOutput(parIo1);
+//  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
+  }
+  // ------------------------------------------------------------------------
+
+
+
+  // -----   Finish   -------------------------------------------------------
+  timer.Stop();
+  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;
+  // ------------------------------------------------------------------------
+
+  // 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;
+
+  Float_t cpuUsage=ctime/rtime;
+  cout << "<DartMeasurement name=\"CpuLoad\" type=\"numeric/double\">";
+  cout << cpuUsage;
+  cout << "</DartMeasurement>" << endl;
+
+  FairMonitor* tempMon = FairMonitor::GetMonitor();
+  tempMon->Print();
+
+  cout << " Test passed" << endl;
+  cout << " All ok " << endl;
+}
diff --git a/macro/beamtime/mcbm2020/build_events.C b/macro/beamtime/mcbm2020/build_events.C
index 7fe271f65d..84c59b6d33 100644
--- a/macro/beamtime/mcbm2020/build_events.C
+++ b/macro/beamtime/mcbm2020/build_events.C
@@ -49,6 +49,9 @@ void build_events( TString fileName, UInt_t uRunId = 0, Int_t nEvents = 0, TStri
   eventBuilder->SetTriggerMinNumberSts(0);
   eventBuilder->SetTriggerMinNumberMuch(0);
   eventBuilder->SetTriggerMinNumberTof(1);
+  eventBuilder->SetFillHistos( kTRUE );
+  if( 0 < uRunId )
+    eventBuilder->SetOutFilename( Form( "%sHistosEventBuilder_%03u.root", outDir.Data(), uRunId ) );
   fRun->AddTask(eventBuilder);
 
   // -----  Parameter database   --------------------------------------------
diff --git a/macro/beamtime/mcbm2020/check_events.C b/macro/beamtime/mcbm2020/check_events.C
index cb9680267a..e214b14d20 100644
--- a/macro/beamtime/mcbm2020/check_events.C
+++ b/macro/beamtime/mcbm2020/check_events.C
@@ -1,4 +1,4 @@
-void check_events(Int_t nEvents = 10, UInt_t uRunId=0, TString inDir="data/", TString friendFile="", TString inFile="") 
+void check_events(Int_t nEvents = 10, UInt_t uRunId=0, TString inDir="data/", TString friendFile="", TString inFile="")
 {
   Int_t iVerbose = 1;
   Int_t iBugCor=0;
@@ -13,46 +13,61 @@ void check_events(Int_t nEvents = 10, UInt_t uRunId=0, TString inDir="data/", TS
   FairLogger::GetLogger();
   gLogger->SetLogScreenLevel(logLevel);
   gLogger->SetLogVerbosityLevel("VERYHIGH");
-  
+
   TString workDir    = gSystem->Getenv("VMCWORKDIR");
 
-  TString runId = TString::Format("%u", uRunId);
+  TString runId = TString::Format("%03u", uRunId);
 
   TString ParFile    = inDir + "/unp_mcbm_params_" + runId + ".root";
 
   TString InputFile  = inDir + "/unp_mcbm_" + runId + ".root";
   TString InputFileEvent="";
-  if (friendFile.Length() > 0) {
-    InputFileEvent  = inDir + friendFile;
-  }
+  if( "" == friendFile )
+  {
+    InputFileEvent = inDir + "/events_" + runId + ".root";
+  } // if( "" == friendFile )
+    else
+    {
+      InputFileEvent  = inDir + friendFile;
+    } // else of if( "" == friendFile )
+
    TString OutputFile = inDir + "/test_" + runId + ".out.root";
 
    TList *parFileList = new TList();
 
+  // -----   Timer   --------------------------------------------------------
+  TStopwatch timer;
+  timer.Start();
+  // ------------------------------------------------------------------------
+
   // -----   Reconstruction run   -------------------------------------------
   FairRunAna *run= new FairRunAna();
 
   FairFileSource* inputSource = new FairFileSource(InputFile);
-  if (friendFile.Length() > 0) { 
-    inputSource->AddFriend(InputFileEvent);
-  }
+  inputSource->AddFriend(InputFileEvent);
+
   run->SetSource(inputSource);
   run->SetOutputFile(OutputFile);
 
   run->SetEventHeaderPersistence(kFALSE);
 
+  // ------------------------------------------------------------------------
+  // Enable FairMonitor
+  FairMonitor::GetMonitor()->EnableMonitor(kFALSE);
+  // ------------------------------------------------------------------------
+
   CbmCheckEvents* checker = new CbmCheckEvents();
   run->AddTask(checker);
 
   // -----  Parameter database   --------------------------------------------
- 
+
    FairRuntimeDb* rtdb = run->GetRuntimeDb();
    Bool_t kParameterMerged = kTRUE;
    FairParRootFileIo* parIo2 = new FairParRootFileIo(kParameterMerged);
    parIo2->open(ParFile.Data(), "UPDATE");
    parIo2->print();
    rtdb->setFirstInput(parIo2);
-  
+
    FairParAsciiFileIo* parIo1 = new FairParAsciiFileIo();
    parIo1->open(parFileList, "in");
    parIo1->print();
@@ -70,5 +85,34 @@ void check_events(Int_t nEvents = 10, UInt_t uRunId=0, TString inDir="data/", TS
   run->Run(0, nEvents);
   //tofClust->Finish();
   // ------------------------------------------------------------------------
-  // default display 
+  // default display
+
+  // -----   Finish   -------------------------------------------------------
+  timer.Stop();
+  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;
+  // ------------------------------------------------------------------------
+  // 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;
+
+  Float_t cpuUsage=ctime/rtime;
+  cout << "<DartMeasurement name=\"CpuLoad\" type=\"numeric/double\">";
+  cout << cpuUsage;
+  cout << "</DartMeasurement>" << endl;
+
+  FairMonitor* tempMon = FairMonitor::GetMonitor();
+  tempMon->Print();
+
+//  RemoveGeoManager();
+  cout << " Test passed" << endl;
+  cout << " All ok " << endl;
 }
diff --git a/macro/beamtime/mcbm2020/unpack_check_time_mcbm_kronos.C b/macro/beamtime/mcbm2020/unpack_check_time_mcbm_kronos.C
new file mode 100644
index 0000000000..12fd90cfe7
--- /dev/null
+++ b/macro/beamtime/mcbm2020/unpack_check_time_mcbm_kronos.C
@@ -0,0 +1,619 @@
+/** @file MCBM DATA unpacking
+ ** @author Florian Uhlig <f.uhlig@gsi.de>
+ ** @date 20.06.2016
+ ** Modified by P.-A. Loizeau
+ ** @date 30.01.2019
+ ** ROOT macro to read tsa files which have been produced with the new data transport
+ ** Convert data into cbmroot format.
+ ** Uses CbmMcbm2018Source as source task.
+ */
+// In order to call later Finish, we make this global
+FairRunOnline *run = NULL;
+
+void unpack_check_time_mcbm_kronos( UInt_t uRunIdx = 99999, UInt_t nrEvents=0, TString outDir="data")
+{
+  UInt_t uRunId = 0;
+  if( 99999 != uRunIdx )
+  {
+      std::vector< UInt_t > vuListRunId = {
+             692, 698, 702, 704, 705, 706, 707,                //  7 =>  0 -  6
+             744, 750, 759, 760, 761, 762, 799,                //  7 =>  7 - 13
+             811, 812, 816, 817, 819,                     //  5 => 14 - 18
+             820, 821, 822, 824, 826, 827, 828, 829,      //  8 => 19 - 26
+             830, 831, 836,                               //  3 => 27 - 29
+             841, 846, 849,                               //  3 => 30 - 32
+             850, 851, 852, 854, 855, 856, 857, 858, 859, //  9 => 33 - 41
+             860, 861, 862, 863, 864, 865, 866            //  7 => 42 - 48
+/*
+ /// With runs < 1 min due to missmatch!
+             811, 812, 816, 817, 818, 819,                     //  6 => 14 - 19
+             820, 821, 822, 824, 826, 827, 828, 829,           //  8 => 20 - 27
+             830, 831, 836, 839,                               //  4 => 28 - 31
+             840, 841, 842, 844, 845, 846, 848, 849,           //  8 => 32 - 39
+             850, 851, 852, 854, 855, 856, 857, 858, 859,      //  9 => 40 - 48
+             860, 861, 862, 863, 864, 865, 866                 //  7 => 49 - 55
+*/
+         };
+      if( vuListRunId.size() <= uRunIdx )
+         return kFALSE;
+      uRunId = vuListRunId[ uRunIdx ];
+  } // if( 99999 != uRunIdx )
+
+  if( uRunId < 692 && 0 != uRunId )
+    return kFALSE;
+
+  TString srcDir = gSystem->Getenv("VMCWORKDIR");
+
+  // --- Specify number of events to be produced.
+  // --- -1 means run until the end of the input file.
+  Int_t nEvents=-1;
+  // --- Specify output file name (this is just an example)
+  TString runId = TString::Format("%03u", uRunId);
+  TString outFile = outDir + "/unp_mcbm_" + runId + ".root";
+  TString parFile = outDir + "/unp_mcbm_params_" + runId + ".root";
+
+  // --- Set log output levels
+  FairLogger::GetLogger();
+  gLogger->SetLogScreenLevel("INFO");
+  //gLogger->SetLogScreenLevel("DEBUG4");
+  gLogger->SetLogVerbosityLevel("MEDIUM");
+  //gLogger->SetLogVerbosityLevel("LOW");
+
+  // --- Define parameter files
+  TList *parFileList = new TList();
+  TString paramDir = srcDir + "/macro/beamtime/mcbm2020/";
+
+  TString paramFileSts = paramDir + "mStsPar.par";
+  TObjString* parStsFileName = new TObjString(paramFileSts);
+  parFileList->Add(parStsFileName);
+
+  TString paramFileMuch = paramDir + "mMuchPar.par";
+  TObjString* parMuchFileName = new TObjString(paramFileMuch);
+  parFileList->Add(parMuchFileName);
+
+  TString geoTagTrd = "v18q_mcbm";
+  // parFileList->Add(new TObjString(Form("%s.asic.par", paramDirTrd.Data())));
+  // if ( geoSetup->GetGeoTag(ECbmModuleId::kTrd, geoTag) ) // this would be nice to have already here
+  // {
+  TString paramFilesTrd(Form("%s/parameters/trd/trd_%s", srcDir.Data(), geoTagTrd.Data()));
+  std::vector<TString> paramFilesTrdVec = {"asic", "digi", "gas", "gain"};
+  for (auto parIt : paramFilesTrdVec)
+  {
+    parFileList->Add(new TObjString(Form("%s.%s.par", paramFilesTrd.Data(), parIt.Data())));
+  }  
+  // }
+
+  TString paramFileTof = paramDir + "mTofPar.par";
+  TObjString* parTofFileName = new TObjString(paramFileTof);
+  parFileList->Add(parTofFileName);
+
+  TString paramFileRich = paramDir + "mRichPar.par";
+  if (uRunId > 698) paramFileRich = paramDir + "mRichPar_70.par";
+  TObjString* parRichFileName = new TObjString(paramFileRich);
+  parFileList->Add(parRichFileName);
+
+  TString paramFilePsd = paramDir + "mPsdPar.par";
+  TObjString* parPsdFileName = new TObjString(paramFilePsd);
+  parFileList->Add(parPsdFileName);
+
+  // --- Set debug level
+  gDebug = 0;
+
+  std::cout << std::endl;
+  std::cout << ">>> unpack_check_time_mcbm_kronos: output file is " << outFile << std::endl;
+
+  // ========================================================================
+  // ========================================================================
+  std::cout << std::endl;
+  std::cout << ">>> unpack_tsa: Initialising..." << std::endl;
+
+  CbmMcbm2018UnpackerTaskSts  * unpacker_sts  = new CbmMcbm2018UnpackerTaskSts();
+  CbmMcbm2018UnpackerTaskMuch * unpacker_much = new CbmMcbm2018UnpackerTaskMuch();
+  CbmMcbm2018UnpackerTaskTrdR * unpacker_trdR = new CbmMcbm2018UnpackerTaskTrdR();
+  CbmMcbm2018UnpackerTaskTof  * unpacker_tof  = new CbmMcbm2018UnpackerTaskTof();
+  CbmMcbm2018UnpackerTaskRich * unpacker_rich = new CbmMcbm2018UnpackerTaskRich();
+  CbmMcbm2018UnpackerTaskPsd * unpacker_psd = new CbmMcbm2018UnpackerTaskPsd();
+
+/*
+ * Do not generate plots by default
+  unpacker_sts ->SetMonitorMode();
+  unpacker_much->SetMonitorMode();
+  unpacker_trdR->SetMonitorMode(); // Assume histo server present, not like other unpackers
+  unpacker_tof ->SetMonitorMode();
+  unpacker_rich->SetMonitorMode();
+  unpacker_psd->SetMonitorMode();
+*/
+
+  unpacker_sts ->SetIgnoreOverlapMs();
+  unpacker_much->SetIgnoreOverlapMs();
+//  unpacker_trdR ->SetIgnoreOverlapMs(); /// Default is kTRUE
+  unpacker_tof ->SetIgnoreOverlapMs();
+  unpacker_rich->SetIgnoreOverlapMs();
+  unpacker_psd ->SetIgnoreOverlapMs();
+
+  /// Starting from first run on Tuesday 28/04/2020, STS uses bin sorter FW
+  if( 692 <= uRunId )
+    unpacker_sts ->SetBinningFwFlag( kTRUE );
+  /// Starting from first run on Monday 04/05/2020, MUCH uses bin sorter FW
+  if( 811 <= uRunId )
+    unpacker_much->SetBinningFwFlag( kTRUE );
+
+  /// Try to cut Noise and reduce walk effect in STS and MUCH
+  unpacker_sts ->SetAdcCut( 20 );
+  unpacker_much->SetAdcCut( 20 );
+
+  unpacker_tof ->SetSeparateArrayT0();
+
+  unpacker_sts ->SetWriteOutputFlag( kFALSE );
+  unpacker_much->SetWriteOutputFlag( kFALSE );
+  unpacker_trdR->SetWriteOutput( kFALSE );
+  unpacker_tof ->SetWriteOutputFlag( kFALSE );
+  unpacker_rich->SetWriteOutputFlag( kFALSE );
+  unpacker_psd ->SetWriteOutputFlag( kFALSE );
+
+
+  // ------------------------------ //
+  // Enable Asic type for MUCH data.
+  // fFlag = 0 ==> Asic type 2.0 (20) ---> December 2018 and March 2019 Data
+  // fFlag = 1 ==> Asic type 2.1 (21) ---> December 2019 Data
+  // This is to correct the channel fliping problem in smx 2.1 chip
+  Int_t fFlag = 1;
+  unpacker_much->EnableAsicType(fFlag);
+  // ------------------------------ //
+  /// General System offsets (= offsets between sub-systems)
+  unpacker_sts ->SetTimeOffsetNs( -985 ); // Run 811-866
+  unpacker_much->SetTimeOffsetNs( -885 ); // Run 811-866
+  unpacker_trdR->SetTimeOffsetNs(    0 ); // Run 811-866
+  unpacker_tof ->SetTimeOffsetNs(   25 ); // Run 811-866
+  unpacker_rich->SetTimeOffsetNs( -310 ); // Run 811-866
+  unpacker_psd ->SetTimeOffsetNs( -240 ); // Run 811-866
+
+  switch( uRunId )
+  {
+     case 707:
+     {
+        /// General System offsets (= offsets between sub-systems)
+        //unpacker_sts ->SetTimeOffsetNs( -1750 ); // Run 707
+        //unpacker_much->SetTimeOffsetNs( -1750 ); // Run 707
+
+        /// ASIC specific offsets (= offsets inside sub-system)
+        unpacker_much->SetTimeOffsetNsAsic(  0,       0.0 ); // Run 707, DPB 0 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic(  1,       0.0 ); // Run 707, DPB 0 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic(  2,       0.0 ); // Run 707, DPB 0 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic(  3,       0.0 ); // Run 707, DPB 0 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic(  4,       0.0 ); // Run 707, DPB 0 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic(  5,       0.0 ); // Run 707, DPB 0 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic(  6,       0.0 ); // Run 707, DPB 1 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic(  7,       0.0 ); // Run 707, DPB 1 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic(  8,       0.0 ); // Run 707, DPB 1 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic(  9,       0.0 ); // Run 707, DPB 1 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 10,       0.0 ); // Run 707, DPB 1 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 11,       0.0 ); // Run 707, DPB 1 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 12,       0.0 ); // Run 707, DPB 2 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 13,       0.0 ); // Run 707, DPB 2 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 14,       0.0 ); // Run 707, DPB 2 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 15,       0.0 ); // Run 707, DPB 2 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 16,       0.0 ); // Run 707, DPB 2 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 17,       0.0 ); // Run 707, DPB 2 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 18,    9590.0 ); // Run 707, DPB 3 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 19,    9590.0 ); // Run 707, DPB 3 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 20,    9630.0 ); // Run 707, DPB 3 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 21,    9590.0 ); // Run 707, DPB 3 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 22,       0.0 ); // Run 707, DPB 3 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 23,       0.0 ); // Run 707, DPB 3 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 24,       0.0 ); // Run 707, DPB 4 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 25,       0.0 ); // Run 707, DPB 4 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 26,       0.0 ); // Run 707, DPB 4 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 27,       0.0 ); // Run 707, DPB 4 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 28,       0.0 ); // Run 707, DPB 4 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 29,       0.0 ); // Run 707, DPB 4 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 30,       0.0 ); // Run 707, DPB 5 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 31,       0.0 ); // Run 707, DPB 5 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 32,    7170.0 ); // Run 707, DPB 5 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 33,    7170.0 ); // Run 707, DPB 5 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 34,       0.0 ); // Run 707, DPB 5 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 35,       0.0 ); // Run 707, DPB 5 ASIC 5
+        break;
+     } // 707
+     case 750:
+     {
+        /// General System offsets (= offsets between sub-systems)
+        //unpacker_sts ->SetTimeOffsetNs( -1750 ); // Run 750
+        //unpacker_much->SetTimeOffsetNs( -1750 ); // Run 750
+
+        /// ASIC specific offsets (= offsets inside sub-system)
+        unpacker_much->SetTimeOffsetNsAsic(  0,       0.0 ); // Run 750, DPB 0 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic(  1,       0.0 ); // Run 750, DPB 0 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic(  2,       0.0 ); // Run 750, DPB 0 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic(  3,       0.0 ); // Run 750, DPB 0 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic(  4,       0.0 ); // Run 750, DPB 0 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic(  5,       0.0 ); // Run 750, DPB 0 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic(  6,       0.0 ); // Run 750, DPB 1 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic(  7,       0.0 ); // Run 750, DPB 1 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic(  8,       0.0 ); // Run 750, DPB 1 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic(  9,       0.0 ); // Run 750, DPB 1 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 10,       0.0 ); // Run 750, DPB 1 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 11,       0.0 ); // Run 750, DPB 1 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 12,       0.0 ); // Run 750, DPB 2 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 13,       0.0 ); // Run 750, DPB 2 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 14,       0.0 ); // Run 750, DPB 2 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 15,       0.0 ); // Run 750, DPB 2 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 16,       0.0 ); // Run 750, DPB 2 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 17,       0.0 ); // Run 750, DPB 2 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 18,    6400.0 ); // Run 750, DPB 3 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 19,    6400.0 ); // Run 750, DPB 3 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 20,    6400.0 ); // Run 750, DPB 3 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 21,    6400.0 ); // Run 750, DPB 3 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 22,       0.0 ); // Run 750, DPB 3 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 23,       0.0 ); // Run 750, DPB 3 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 24,       0.0 ); // Run 750, DPB 4 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 25,       0.0 ); // Run 750, DPB 4 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 26,       0.0 ); // Run 750, DPB 4 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 27,       0.0 ); // Run 750, DPB 4 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 28,       0.0 ); // Run 750, DPB 4 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 29,       0.0 ); // Run 750, DPB 4 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 30,       0.0 ); // Run 750, DPB 5 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 31,       0.0 ); // Run 750, DPB 5 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 32,    3170.0 ); // Run 750, DPB 5 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 33,    3170.0 ); // Run 750, DPB 5 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 34,       0.0 ); // Run 750, DPB 5 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 35,       0.0 ); // Run 750, DPB 5 ASIC 5
+        break;
+     } // 750
+     case 759:
+     {
+        /// General System offsets (= offsets between sub-systems)
+        //unpacker_sts ->SetTimeOffsetNs( -1759 ); // Run 759
+        //unpacker_much->SetTimeOffsetNs( -1759 ); // Run 759
+        unpacker_trdR->SetTimeOffsetNs(   190 ); // Run 759
+
+        /// ASIC specific offsets (= offsets inside sub-system)
+        unpacker_much->SetTimeOffsetNsAsic(  0,       0.0 ); // Run 759, DPB 0 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic(  1,       0.0 ); // Run 759, DPB 0 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic(  2,       0.0 ); // Run 759, DPB 0 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic(  3,       0.0 ); // Run 759, DPB 0 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic(  4,       0.0 ); // Run 759, DPB 0 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic(  5,       0.0 ); // Run 759, DPB 0 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic(  6,       0.0 ); // Run 759, DPB 1 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic(  7,       0.0 ); // Run 759, DPB 1 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic(  8,       0.0 ); // Run 759, DPB 1 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic(  9,       0.0 ); // Run 759, DPB 1 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 10,       0.0 ); // Run 759, DPB 1 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 11,       0.0 ); // Run 759, DPB 1 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 12,       0.0 ); // Run 759, DPB 2 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 13,       0.0 ); // Run 759, DPB 2 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 14,       0.0 ); // Run 759, DPB 2 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 15,       0.0 ); // Run 759, DPB 2 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 16,       0.0 ); // Run 759, DPB 2 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 17,       0.0 ); // Run 759, DPB 2 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 18,    3200.0 ); // Run 759, DPB 3 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 19,    3200.0 ); // Run 759, DPB 3 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 20,    3200.0 ); // Run 759, DPB 3 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 21,    3200.0 ); // Run 759, DPB 3 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 22,       0.0 ); // Run 759, DPB 3 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 23,       0.0 ); // Run 759, DPB 3 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 24,    3200.0 ); // Run 759, DPB 4 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 25,    3200.0 ); // Run 759, DPB 4 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 26,    3200.0 ); // Run 759, DPB 4 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 27,       0.0 ); // Run 759, DPB 4 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 28,       0.0 ); // Run 759, DPB 4 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 29,       0.0 ); // Run 759, DPB 4 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 30,       0.0 ); // Run 759, DPB 5 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 31,       0.0 ); // Run 759, DPB 5 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 32,     -30.0 ); // Run 759, DPB 5 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 33,     -30.0 ); // Run 759, DPB 5 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 34,       0.0 ); // Run 759, DPB 5 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 35,       0.0 ); // Run 759, DPB 5 ASIC 5
+        break;
+     } // 759
+     case 760:
+     {
+        /// General System offsets (= offsets between sub-systems)
+        //unpacker_sts ->SetTimeOffsetNs( -1760 ); // Run 760
+        //unpacker_much->SetTimeOffsetNs( -1760 ); // Run 760
+        unpacker_trdR->SetTimeOffsetNs(   -75 ); // Run 760
+
+        /// ASIC specific offsets (= offsets inside sub-system)
+        unpacker_much->SetTimeOffsetNsAsic(  0,       0.0 ); // Run 760, DPB 0 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic(  1,       0.0 ); // Run 760, DPB 0 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic(  2,       0.0 ); // Run 760, DPB 0 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic(  3,       0.0 ); // Run 760, DPB 0 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic(  4,       0.0 ); // Run 760, DPB 0 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic(  5,       0.0 ); // Run 760, DPB 0 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic(  6,       0.0 ); // Run 760, DPB 1 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic(  7,       0.0 ); // Run 760, DPB 1 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic(  8,       0.0 ); // Run 760, DPB 1 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic(  9,       0.0 ); // Run 760, DPB 1 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 10,       0.0 ); // Run 760, DPB 1 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 11,       0.0 ); // Run 760, DPB 1 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 12,       0.0 ); // Run 760, DPB 2 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 13,       0.0 ); // Run 760, DPB 2 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 14,       0.0 ); // Run 760, DPB 2 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 15,       0.0 ); // Run 760, DPB 2 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 16,       0.0 ); // Run 760, DPB 2 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 17,       0.0 ); // Run 760, DPB 2 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 18,       0.0 ); // Run 760, DPB 3 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 19,       0.0 ); // Run 760, DPB 3 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 20,       0.0 ); // Run 760, DPB 3 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 21,       0.0 ); // Run 760, DPB 3 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 22,       0.0 ); // Run 760, DPB 3 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 23,       0.0 ); // Run 760, DPB 3 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 24,    3160.0 ); // Run 760, DPB 4 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 25,    3160.0 ); // Run 760, DPB 4 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 26,    3160.0 ); // Run 760, DPB 4 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 27,       0.0 ); // Run 760, DPB 4 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 28,       0.0 ); // Run 760, DPB 4 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 29,       0.0 ); // Run 760, DPB 4 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 30,       0.0 ); // Run 760, DPB 5 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 31,       0.0 ); // Run 760, DPB 5 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 32,     -30.0 ); // Run 760, DPB 5 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 33,     -30.0 ); // Run 760, DPB 5 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 34,       0.0 ); // Run 760, DPB 5 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 35,       0.0 ); // Run 760, DPB 5 ASIC 5
+        break;
+     } // 760
+     case 761:
+     {
+        /// General System offsets (= offsets between sub-systems)
+        //unpacker_sts ->SetTimeOffsetNs( -1761 ); // Run 761
+        //unpacker_much->SetTimeOffsetNs( -1761 ); // Run 761
+        unpacker_trdR->SetTimeOffsetNs(    90 ); // Run 761
+
+        /// ASIC specific offsets (= offsets inside sub-system)
+        unpacker_much->SetTimeOffsetNsAsic(  0,       0.0 ); // Run 761, DPB 0 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic(  1,       0.0 ); // Run 761, DPB 0 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic(  2,       0.0 ); // Run 761, DPB 0 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic(  3,       0.0 ); // Run 761, DPB 0 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic(  4,       0.0 ); // Run 761, DPB 0 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic(  5,       0.0 ); // Run 761, DPB 0 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic(  6,       0.0 ); // Run 761, DPB 1 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic(  7,       0.0 ); // Run 761, DPB 1 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic(  8,       0.0 ); // Run 761, DPB 1 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic(  9,       0.0 ); // Run 761, DPB 1 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 10,       0.0 ); // Run 761, DPB 1 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 11,       0.0 ); // Run 761, DPB 1 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 12,       0.0 ); // Run 761, DPB 2 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 13,       0.0 ); // Run 761, DPB 2 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 14,       0.0 ); // Run 761, DPB 2 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 15,       0.0 ); // Run 761, DPB 2 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 16,       0.0 ); // Run 761, DPB 2 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 17,       0.0 ); // Run 761, DPB 2 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 18,    3200.0 ); // Run 761, DPB 3 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 19,    3200.0 ); // Run 761, DPB 3 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 20,    3200.0 ); // Run 761, DPB 3 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 21,    3200.0 ); // Run 761, DPB 3 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 22,       0.0 ); // Run 761, DPB 3 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 23,       0.0 ); // Run 761, DPB 3 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 24,    6360.0 ); // Run 761, DPB 4 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 25,    6360.0 ); // Run 761, DPB 4 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 26,    6360.0 ); // Run 761, DPB 4 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 27,       0.0 ); // Run 761, DPB 4 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 28,       0.0 ); // Run 761, DPB 4 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 29,       0.0 ); // Run 761, DPB 4 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 30,       0.0 ); // Run 761, DPB 5 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 31,       0.0 ); // Run 761, DPB 5 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 32,    6360.0 ); // Run 761, DPB 5 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 33,    6360.0 ); // Run 761, DPB 5 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 34,       0.0 ); // Run 761, DPB 5 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 35,       0.0 ); // Run 761, DPB 5 ASIC 5
+        break;
+     } // 761
+     case 762:
+     {
+        /// General System offsets (= offsets between sub-systems)
+        //unpacker_sts ->SetTimeOffsetNs( -1762 ); // Run 762
+        //unpacker_much->SetTimeOffsetNs( -1762 ); // Run 762
+        unpacker_trdR->SetTimeOffsetNs(    60 ); // Run 762
+
+        /// ASIC specific offsets (= offsets inside sub-system)
+        unpacker_much->SetTimeOffsetNsAsic(  0,       0.0 ); // Run 762, DPB 0 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic(  1,       0.0 ); // Run 762, DPB 0 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic(  2,       0.0 ); // Run 762, DPB 0 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic(  3,       0.0 ); // Run 762, DPB 0 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic(  4,       0.0 ); // Run 762, DPB 0 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic(  5,       0.0 ); // Run 762, DPB 0 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic(  6,       0.0 ); // Run 762, DPB 1 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic(  7,       0.0 ); // Run 762, DPB 1 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic(  8,       0.0 ); // Run 762, DPB 1 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic(  9,       0.0 ); // Run 762, DPB 1 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 10,       0.0 ); // Run 762, DPB 1 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 11,       0.0 ); // Run 762, DPB 1 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 12,       0.0 ); // Run 762, DPB 2 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 13,       0.0 ); // Run 762, DPB 2 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 14,       0.0 ); // Run 762, DPB 2 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 15,       0.0 ); // Run 762, DPB 2 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 16,       0.0 ); // Run 762, DPB 2 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 17,       0.0 ); // Run 762, DPB 2 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 18,    4800.0 ); // Run 762, DPB 3 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 19,    4800.0 ); // Run 762, DPB 3 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 20,    4800.0 ); // Run 762, DPB 3 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 21,    4800.0 ); // Run 762, DPB 3 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 22,       0.0 ); // Run 762, DPB 3 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 23,       0.0 ); // Run 762, DPB 3 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 24,    9550.0 ); // Run 762, DPB 4 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 25,    9550.0 ); // Run 762, DPB 4 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 26,    9550.0 ); // Run 762, DPB 4 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 27,       0.0 ); // Run 762, DPB 4 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 28,       0.0 ); // Run 762, DPB 4 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 29,       0.0 ); // Run 762, DPB 4 ASIC 5
+        unpacker_much->SetTimeOffsetNsAsic( 30,       0.0 ); // Run 762, DPB 5 ASIC 0
+        unpacker_much->SetTimeOffsetNsAsic( 31,       0.0 ); // Run 762, DPB 5 ASIC 1
+        unpacker_much->SetTimeOffsetNsAsic( 32,     -30.0 ); // Run 762, DPB 5 ASIC 2
+        unpacker_much->SetTimeOffsetNsAsic( 33,     -30.0 ); // Run 762, DPB 5 ASIC 3
+        unpacker_much->SetTimeOffsetNsAsic( 34,       0.0 ); // Run 762, DPB 5 ASIC 4
+        unpacker_much->SetTimeOffsetNsAsic( 35,       0.0 ); // Run 762, DPB 5 ASIC 5
+        break;
+     } // 762
+     case 811:
+     {
+         unpacker_trdR->SetTimeOffsetNs(  84.38 );
+         break;
+     } // 811
+     case 812:
+     {
+         unpacker_trdR->SetTimeOffsetNs(  165.62 );
+         break;
+     } // 812
+     case 816  :
+     {
+         unpacker_trdR->SetTimeOffsetNs( -9.38 );
+         break;
+     } // 816
+     case 819:
+     {
+         unpacker_trdR->SetTimeOffsetNs( -140.62 );
+         break;
+     } // 819
+     case 820:
+     {
+         unpacker_trdR->SetTimeOffsetNs(  109.38 );
+         break;
+     } // 820
+     case 821:
+     {
+         unpacker_trdR->SetTimeOffsetNs(  -65.62 );
+         break;
+     } // 821
+     case 822:
+     {
+         unpacker_trdR->SetTimeOffsetNs(   59.38 );
+         break;
+     } // 822
+     case 824:
+     {
+         unpacker_trdR->SetTimeOffsetNs( -165.62 );
+         break;
+     } // 824
+     case 826:
+     {
+         unpacker_trdR->SetTimeOffsetNs(   59.38 );
+         break;
+     } // 826
+     case 827:
+     {
+         unpacker_trdR->SetTimeOffsetNs(  -15.62 );
+         break;
+     } // 827
+     case 828:
+     {
+         unpacker_trdR->SetTimeOffsetNs( -109.38 );
+         break;
+     } // 828
+     case 830:
+     {
+         unpacker_trdR->SetTimeOffsetNs(   15.62 );
+         break;
+     } // 830
+     case 831:
+     {
+//         unpacker_trdR->SetTimeOffsetNs(   70.00 );
+         unpacker_trdR->SetTimeOffsetNs(  -25.00 );
+         break;
+     } // 831
+     case 836:
+     {
+         unpacker_trdR->SetTimeOffsetNs(  -40.62);
+         break;
+     } // 836
+     default:
+        break;
+  } // switch( uRunId )
+
+  // --- Source task
+  CbmMcbm2018Source* source = new CbmMcbm2018Source();
+  source->SetWriteOutputFlag( kTRUE ); // For writing TS metadata
+
+  TString inFile = Form( "/lustre/cbm/users/ploizeau/mcbm2020/data/%3u_pn02_*.tsa;", uRunId );
+  inFile += Form( "/lustre/cbm/users/ploizeau/mcbm2020/data/%3u_pn04_*.tsa;", uRunId );
+  inFile += Form( "/lustre/cbm/users/ploizeau/mcbm2020/data/%3u_pn05_*.tsa;", uRunId );
+  inFile += Form( "/lustre/cbm/users/ploizeau/mcbm2020/data/%3u_pn06_*.tsa;", uRunId );
+  inFile += Form( "/lustre/cbm/users/ploizeau/mcbm2020/data/%3u_pn08_*.tsa;", uRunId );
+  inFile += Form( "/lustre/cbm/users/ploizeau/mcbm2020/data/%3u_pn10_*.tsa;", uRunId );
+  inFile += Form( "/lustre/cbm/users/ploizeau/mcbm2020/data/%3u_pn11_*.tsa;", uRunId );
+  inFile += Form( "/lustre/cbm/users/ploizeau/mcbm2020/data/%3u_pn12_*.tsa;", uRunId );
+  inFile += Form( "/lustre/cbm/users/ploizeau/mcbm2020/data/%3u_pn13_*.tsa;", uRunId );
+  inFile += Form( "/lustre/cbm/users/ploizeau/mcbm2020/data/%3u_pn15_*.tsa", uRunId );
+
+  source->SetFileName(inFile);
+
+  source->AddUnpacker(unpacker_sts,  0x10, ECbmModuleId::kSts  );//STS xyter
+  source->AddUnpacker(unpacker_much, 0x50, ECbmModuleId::kMuch );//MUCH xyter
+  source->AddUnpacker(unpacker_trdR, 0x40, ECbmModuleId::kTrd  );// Trd
+  source->AddUnpacker(unpacker_tof,  0x60, ECbmModuleId::kTof  );//gDPB A & B & C
+  source->AddUnpacker(unpacker_tof,  0x90, ECbmModuleId::kTof  );//gDPB T0 A & B
+  source->AddUnpacker(unpacker_rich, 0x30, ECbmModuleId::kRich );//RICH trb
+  source->AddUnpacker(unpacker_psd,  0x80, ECbmModuleId::kPsd  );//PSD
+
+  // --- Event header
+//  FairEventHeader* event = new FairEventHeader();
+//  event->SetRunId(uRunId);
+
+  // --- RootFileSink
+  // --- Open next outputfile after 4GB
+//  FairRootFileSink* sink = new FairRootFileSink(outFile);
+//  sink->GetOutTree()->SetMaxTreeSize(4294967295LL);
+
+  // --- Run
+  run = new FairRunOnline(source);
+/*
+  run->SetSink(sink);
+  run->SetEventHeader(event);
+*/
+  run->SetAutoFinish(kFALSE);
+
+
+  CbmCheckTiming* timeChecker = new CbmCheckTiming();
+  timeChecker->SetCheckInterSystemOffset(kTRUE);
+  timeChecker->SetCheckTimeOrder(kTRUE);
+  timeChecker->SetStsOffsetSearchRange(  10000);
+  timeChecker->SetMuchOffsetSearchRange( 10000);
+  timeChecker->SetTrdOffsetSearchRange(  10000 );
+  timeChecker->SetTofOffsetSearchRange(  10000);
+  timeChecker->SetRichOffsetSearchRange( 10000);
+  timeChecker->SetPsdOffsetSearchRange(  10000 );
+  timeChecker->SetT0PulserTotLimits(   185, 191 );
+  if( 0 < uRunId )
+    timeChecker->SetOutFilename( Form( "%s/HistosTimeCheck_%03u.root", outDir.Data(), uRunId ) );
+  run->AddTask(timeChecker);
+
+  // -----   Runtime database   ---------------------------------------------
+  FairRuntimeDb* rtdb = run->GetRuntimeDb();
+  Bool_t kParameterMerged = kTRUE;
+//  FairParRootFileIo* parOut = new FairParRootFileIo(kParameterMerged);
+  FairParAsciiFileIo* parIn = new FairParAsciiFileIo();
+//  parOut->open(parFile.Data());
+  parIn->open(parFileList, "in");
+  rtdb->setFirstInput(parIn);
+//  rtdb->setOutput(parOut);
+
+  run->Init();
+
+  // --- Start run
+  TStopwatch timer;
+  timer.Start();
+  std::cout << ">>> unpack_check_time_mcbm_kronos: Starting run..." << std::endl;
+  if ( 0 == nrEvents) {
+    run->Run(nEvents, 0); // run until end of input file
+  } else {
+    run->Run(0, nrEvents); // process  N Events
+  }
+  run->Finish();
+
+  timer.Stop();
+
+  std::cout << "Processed " << std::dec << source->GetTsCount() << " timeslices" << std::endl;
+
+  // --- End-of-run info
+  Double_t rtime = timer.RealTime();
+  Double_t ctime = timer.CpuTime();
+  std::cout << std::endl << std::endl;
+  std::cout << ">>> unpack_check_time_mcbm_kronos: Macro finished successfully." << std::endl;
+  std::cout << ">>> unpack_check_time_mcbm_kronos: Output file is " << outFile << std::endl;
+  std::cout << ">>> unpack_check_time_mcbm_kronos: Real time " << rtime << " s, CPU time "
+	    << ctime << " s" << std::endl;
+  std::cout << std::endl;
+
+  /// --- Screen output for automatic tests
+  std::cout << " Test passed" << std::endl;
+  std::cout << " All ok " << std::endl;
+}
-- 
GitLab