diff --git a/macro/beamtime/mcbm2022/pulser_dt.C b/macro/beamtime/mcbm2022/pulser_dt.C
new file mode 100644
index 0000000000000000000000000000000000000000..596a0920e126c5d8130c3d0134121c475e291240
--- /dev/null
+++ b/macro/beamtime/mcbm2022/pulser_dt.C
@@ -0,0 +1,495 @@
+/* Copyright (C) 2022 Facility for Antiproton and Ion Research in Europe, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Pierre-Alain Loizeau [committer] */
+
+void pulser_dt(TString filename = "1935.digi.root", uint32_t uNbTs = 0)
+{
+
+  gROOT->cd();
+  TFile* file = new TFile(filename, "READ");
+  TTree* tree = (TTree*) (file->Get("cbmsim"));
+
+  std::vector<CbmStsDigi>* vDigisSts   = new std::vector<CbmStsDigi>();
+  std::vector<CbmTrdDigi>* vDigisTrd   = new std::vector<CbmTrdDigi>();
+  std::vector<CbmTofDigi>* vDigisTof   = new std::vector<CbmTofDigi>();
+  std::vector<CbmRichDigi>* vDigisRich = new std::vector<CbmRichDigi>();
+
+  std::vector<CbmStsDigi> vPulserDigisSts {};
+  std::vector<CbmTrdDigi> vPulserDigisTrd1d {};
+  std::vector<CbmTrdDigi> vPulserDigisTrd2d {};
+  std::vector<CbmTofDigi> vPulserDigisTof {};
+  std::vector<CbmRichDigi> vPulserDigisRich {};
+
+  std::vector<CbmStsDigi> vNotPulserDigisSts {};
+  std::vector<CbmTrdDigi> vNotPulserDigisTrd1d {};
+  std::vector<CbmTrdDigi> vNotPulserDigisTrd2d {};
+  std::vector<CbmTofDigi> vNotPulserDigisTof {};
+  std::vector<CbmRichDigi> vNotPulserDigisRich {};
+
+  // tree->SetBranchAddress( "StsDigi", &vDigisSts );
+  tree->SetBranchAddress("StsDigiPulser", &vDigisSts);
+  tree->SetBranchAddress("TrdDigi", &vDigisTrd);
+  tree->SetBranchAddress("TofDigi", &vDigisTof);
+  tree->SetBranchAddress("RichDigi", &vDigisRich);
+
+  uint32_t nentries = tree->GetEntries();
+  cout << "Entries: " << nentries << endl;
+  nentries = (uNbTs && uNbTs < nentries ? uNbTs : nentries);
+
+  double_t dHistoRange = 6000.;
+  // clang-format off
+  TH1F *fPulserTofStsDt       = new TH1F("fPulserTofStsDt",
+                                         "Sts-Tof;time diff [ns];Counts",
+                                         dHistoRange/3.125, dHistoRange, dHistoRange);
+  TH1F *fPulserStsStsDt       = new TH1F("fPulserStsStsDt",
+                                         "Sts-Sts;time diff [ns];Counts",
+                                         5001,     -5000, 50005000);
+  TH2F *fPulserTofStsDtAdc    = new TH2F("fPulserTofStsDtAdc",
+                                         "Sts-Tof;time diff [ns];Counts",
+                                         dHistoRange/3.125, dHistoRange, dHistoRange,
+                                         32, 0, 32);
+  TH1F *fPulserTofTrd1dDt     = new TH1F("fPulserTofTrd1dDt",
+                                         "Trd1d-Tof;time diff [ns];Counts",
+                                         2*dHistoRange/60, -dHistoRange, dHistoRange);
+  TH1F *fPulserTofTrd1dMainDt = new TH1F("fPulserTofTrd1dMainDt",
+                                         "Trd1d-Tof;time diff [ns];Counts",
+                                         2*dHistoRange/60, -dHistoRange, dHistoRange);
+  TH1F *fPulserTofTrd2dDt     = new TH1F("fPulserTofTrd2dDt",
+                                         "Trd2d-Tof;time diff [ns];Counts",
+                                         2*dHistoRange/60, -dHistoRange, dHistoRange);
+  TH1F *fPulserTofRichDt      = new TH1F("fPulserTofRichDt",
+                                         "Rich-Tof;time diff [ns];Counts",
+                                         2*dHistoRange, -dHistoRange, dHistoRange);
+  TH1F *fPulserTofTofDt       = new TH1F("fPulserTofTofDt",
+                                         "Tof-Tof;time diff [ns];Counts",
+                                          5001,     -5000, 50005000);
+
+  TH1F *fTofStsDt   = new TH1F("fTofStsDt",
+                               "Sts-Tof;time diff [ns];Counts",
+                               2*dHistoRange/3.125, -dHistoRange, dHistoRange);
+  TH1F *fTofTrd1dDt = new TH1F("fTofTrd1dDt",
+                               "Trd1d-Tof;time diff [ns];Counts",
+                               2*dHistoRange/60, -dHistoRange, dHistoRange);
+  TH1F *fTofTrd2dDt = new TH1F("fTofTrd2dDt",
+                               "Trd2d-Tof;time diff [ns];Counts",
+                               2*dHistoRange/60, -dHistoRange, dHistoRange);
+  TH1F *fTofRichDt  = new TH1F("fTofRichDt",
+                               "Rich-Tof;time diff [ns];Counts",
+                               2*dHistoRange, -dHistoRange, dHistoRange);
+  TH1F *fTofTofDt   = new TH1F("fTofTofDt",
+                               "Tof-Tof;time diff [ns];Counts",
+                               5001,     -5000, 50005000);
+  // clang-format on
+
+  std::map<uint32_t, uint32_t> mStsModules;
+  std::map<uint32_t, uint32_t> mTrdModules;
+  std::map<uint32_t, uint32_t> mTrdPad;
+  uint32_t uAddressFirstTof = 0;
+  for (Int_t iEntry = 0; iEntry < nentries; iEntry++) {
+    //if (iEntry % 10 == 0 ) std::cout << "Entry " << iEntry << " / " << nentries << std::endl;
+
+    tree->GetEntry(iEntry);
+    uint32_t nDigisSts  = vDigisSts->size();
+    uint32_t nDigisTrd  = vDigisTrd->size();
+    uint32_t nDigisTof  = vDigisTof->size();
+    uint32_t nDigisRich = vDigisRich->size();
+
+    if (iEntry % 10 == 0) {
+      std::cout << "STS  Digis: " << nDigisSts << std::endl;
+      std::cout << "TRD  Digis: " << nDigisTrd << std::endl;
+      std::cout << "TOF  Digis: " << nDigisTof << std::endl;
+      std::cout << "RICH Digis: " << nDigisRich << std::endl;
+    }
+
+    // STS
+    for (uint32_t uDigiSts = 0; uDigiSts < nDigisSts; ++uDigiSts) {
+
+      CbmStsDigi& pDigi = vDigisSts->at(uDigiSts);
+
+      uint32_t uAddr = pDigi.GetAddress();
+      if (mStsModules.find(uAddr) == mStsModules.end()) {  //
+        mStsModules[uAddr] = 1;
+      }
+      else
+        mStsModules[uAddr]++;
+
+      if ((uAddr == 0x10107C02 || uAddr == 0x101FFC02) && 5 < pDigi.GetCharge()) {  //
+        vPulserDigisSts.push_back(pDigi);
+      }  // feb condition
+      else {
+        // vNotPulserDigisSts.push_back( pDigi );
+      }  // feb condition
+    }
+    // TRD
+    for (uint32_t uDigiTrd = 0; uDigiTrd < nDigisTrd; ++uDigiTrd) {
+
+      CbmTrdDigi& pDigi = vDigisTrd->at(uDigiTrd);
+
+      if (pDigi.GetType() == CbmTrdDigi::eCbmTrdAsicType::kSPADIC) {
+        uint32_t uAddr = pDigi.GetAddress();
+        uint32_t uMod  = CbmTrdAddress::GetModuleId(uAddr);
+        if (mTrdModules.find(uMod) == mTrdModules.end()) {  //
+          mTrdModules[uMod] = 1;
+        }
+        else
+          mTrdModules[uMod]++;
+
+        if (mTrdPad.find(uAddr) == mTrdPad.end()) {  //
+          mTrdPad[uAddr] = 1;
+        }
+        else
+          mTrdPad[uAddr]++;
+
+        // if (0x0008007b == uAddr ) { //
+        if (0x80070 <= uAddr && uAddr <= 0x800ff) {  //
+          vPulserDigisTrd1d.push_back(pDigi);
+        }
+        else {
+          vNotPulserDigisTrd1d.push_back(pDigi);
+        }
+      }
+      else if (pDigi.GetType() == CbmTrdDigi::eCbmTrdAsicType::kFASP) {
+        vNotPulserDigisTrd2d.push_back(pDigi);
+      }
+    }
+    // TOF
+    double_t dLatPulsTime = 0;
+    for (uint32_t uDigiTof = 0; uDigiTof < nDigisTof; ++uDigiTof) {
+
+      CbmTofDigi& pDigi = vDigisTof->at(uDigiTof);
+
+      if ((0 == uAddressFirstTof || uAddressFirstTof == pDigi.GetAddress())
+          && (0 == pDigi.GetChannel() || 32 == pDigi.GetChannel())
+          && (88 < pDigi.GetCharge() && pDigi.GetCharge() < 91)) {
+        if (0 == uAddressFirstTof) {  //
+          uAddressFirstTof = pDigi.GetAddress();
+        }
+        if (uAddressFirstTof == pDigi.GetAddress()) {
+          vPulserDigisTof.push_back(pDigi);
+          dLatPulsTime = pDigi.GetTime();
+        }
+      }  // feb condition
+      else {
+        if (400 < pDigi.GetTime() - dLatPulsTime) {  //
+          vNotPulserDigisTof.push_back(pDigi);
+        }
+      }
+    }
+    // Rich
+    for (uint32_t uDigiRich = 0; uDigiRich < nDigisRich; ++uDigiRich) {
+
+      CbmRichDigi& pDigi = vDigisRich->at(uDigiRich);
+
+      // if (pDigi.GetAddress()==0x10107C02 || pDigi.GetAddress()==0x101FFC02) { //
+      vPulserDigisRich.push_back(pDigi);
+      // } // feb condition
+      // else {
+      vNotPulserDigisRich.push_back(pDigi);
+      // }
+    }
+
+    /*
+    vPulserDigisSts.clear();
+    vPulserDigisTrd.clear();
+    vPulserDigisTof.clear();
+    vPulserDigisRich.clear();
+    */
+  }
+  /*
+  std::sort( vPulserDigisSts );
+  std::sort( vPulserDigisTrd );
+  std::sort( vPulserDigisTof );
+  std::sort( sPulserDigisRich );
+  */
+
+  /// ***************************************************************************************************************///
+  std::cout << "STS   Pulser Digis: " << vPulserDigisSts.size() << std::endl;
+  std::cout << "TRD1D Pulser Digis: " << vPulserDigisTrd1d.size() << std::endl;
+  std::cout << "TRD2D Pulser Digis: " << vPulserDigisTrd2d.size() << std::endl;
+  std::cout << "TOF   Pulser Digis: " << vPulserDigisTof.size() << std::endl;
+  std::cout << "RICH  Pulser Digis: " << vPulserDigisRich.size() << std::endl;
+  /// ***************************************************************************************************************///
+  std::cout << "STS   Non-Pulser Digis: " << vNotPulserDigisSts.size() << std::endl;
+  std::cout << "TRD1D Non-Pulser Digis: " << vNotPulserDigisTrd1d.size() << std::endl;
+  std::cout << "TRD2D Non-Pulser Digis: " << vNotPulserDigisTrd2d.size() << std::endl;
+  std::cout << "TOF   Non-Pulser Digis: " << vNotPulserDigisTof.size() << std::endl;
+  std::cout << "RICH  Non-Pulser Digis: " << vNotPulserDigisRich.size() << std::endl;
+  /// ***************************************************************************************************************///
+  for (auto& stsModcCn : mStsModules) {
+    std::cout << "STS module 0x" << std::hex << std::setw(8) << stsModcCn.first << std::dec << " had " << std::setw(8)
+              << stsModcCn.second << " digis" << std::endl;
+  }
+  /// ***************************************************************************************************************///
+  for (auto& trdModcCn : mTrdModules) {
+    std::cout << "TRD module 0x" << std::hex << std::setw(8) << trdModcCn.first << std::dec << " had " << std::setw(8)
+              << trdModcCn.second << " digis" << std::endl;
+  }
+  /// ***************************************************************************************************************///
+  /*
+  for (auto& trdPadcCn : mTrdPad) {
+     std::cout << "TRD Pad 0x" << std::hex << std::setw(8) << trdPadcCn.first << std::dec
+               << " had " << std::setw(8) << trdPadcCn.second << " digis" << std::endl;
+  }
+  */
+  /// ***************************************************************************************************************///
+
+  /// Timesort
+  /*
+  std::sort(vPulserDigisTrd.begin(), vPulserDigisTrd.end(),
+            [](const CbmTrdDigi& a, const CbmTrdDigi& b) -> bool { return a.GetTime() < b.GetTime(); });
+  */
+
+  /// PULSER ********************************************************************************************************///
+  double_t dLastStsTime         = 0;
+  double_t dLastTofTime         = 0;
+  uint32_t uLastFirstMatchSts   = 0;
+  uint32_t uLastFirstMatchTrd1d = 0;
+  uint32_t uLastFirstMatchTrd2d = 0;
+  uint32_t uLastFirstMatchRich  = 0;
+  for (uint32_t uPulsStsIdx = 0; uPulsStsIdx < vPulserDigisSts.size(); ++uPulsStsIdx) {
+    double_t dStsTime = vPulserDigisSts[uPulsStsIdx].GetTime();
+    if (0 < uPulsStsIdx) {  //
+      fPulserStsStsDt->Fill(dStsTime - dLastStsTime);
+    }  // if 0 < uPulsTofIdx )
+    dLastStsTime = dStsTime;
+  }
+
+  for (uint32_t uPulsTofIdx = 0; uPulsTofIdx < vPulserDigisTof.size(); ++uPulsTofIdx) {
+    double_t dTofTime = vPulserDigisTof[uPulsTofIdx].GetTime();
+    if (0 < uPulsTofIdx) {  //
+      fPulserTofTofDt->Fill(dTofTime - dLastTofTime);
+    }  // if 0 < uPulsTofIdx )
+    dLastTofTime = dTofTime;
+
+    /// STS - TOF
+    for (uint32_t uPulsStsIdx = uLastFirstMatchSts; uPulsStsIdx < vPulserDigisSts.size(); ++uPulsStsIdx) {
+      double_t dStsTime = vPulserDigisSts[uPulsStsIdx].GetTime();
+      double_t dStsDt   = dStsTime - dTofTime + 15000;
+      //double_t dStsDt = dStsTime - dTofTime;
+
+      // Find beginning of match window (assume both vectors are fully time sorted)
+      if (dStsDt < -dHistoRange) {  //
+        uLastFirstMatchSts = uPulsStsIdx;
+      }
+      else if (dStsDt <= dHistoRange) {
+        fPulserTofStsDt->Fill(dStsDt);
+        fPulserTofStsDtAdc->Fill(dStsDt, vPulserDigisSts[uPulsStsIdx].GetCharge());
+      }
+      else
+        break;
+    }  // for( uint32_t uPulsStsIdx = uLastFirstMatchSts; uPulsStsIdx < vPulserDigisSts.size(); ++uPulsStsIdx)
+
+    /// TRD1D - TOF
+    for (uint32_t uPulsTrdIdx = uLastFirstMatchTrd1d; uPulsTrdIdx < vPulserDigisTrd1d.size(); ++uPulsTrdIdx) {
+      double_t dTrdTime = vPulserDigisTrd1d[uPulsTrdIdx].GetTime();
+      double_t dTrdDt   = dTrdTime - dTofTime;
+
+      // Find beginning of match window (assume both vectors are fully time sorted)
+      if (dTrdDt < -dHistoRange) {  //
+        uLastFirstMatchTrd1d = uPulsTrdIdx;
+      }
+      else if (dTrdDt <= dHistoRange) {
+        if (0x0008007b == vPulserDigisTrd1d[uPulsTrdIdx].GetAddress()) {  //
+          fPulserTofTrd1dMainDt->Fill(dTrdDt);
+        }
+        else {
+          fPulserTofTrd1dDt->Fill(dTrdDt);
+        }
+      }
+      else
+        break;
+    }  // for( uint32_t uPulsTrdIdx = uLastFirstMatchTrd1d; uPulsTrdIdx < vPulserDigisTrd1d.size(); ++uPulsTrdIdx)
+
+    /// TRD2D - TOF
+    for (uint32_t uPulsTrdIdx = uLastFirstMatchTrd2d; uPulsTrdIdx < vPulserDigisTrd2d.size(); ++uPulsTrdIdx) {
+      double_t dTrdTime = vPulserDigisTrd2d[uPulsTrdIdx].GetTime();
+      double_t dTrdDt   = dTrdTime - dTofTime;
+
+      // Find beginning of match window (assume both vectors are fully time sorted)
+      if (dTrdDt < -dHistoRange) {  //
+        uLastFirstMatchTrd2d = uPulsTrdIdx;
+      }
+      else if (dTrdDt <= dHistoRange) {
+        fPulserTofTrd2dDt->Fill(dTrdDt);
+      }
+      else
+        break;
+    }  // for( uint32_t uPulsTrdIdx = uLastFirstMatchTrd2d; uPulsTrdIdx < vPulserDigisTrd2d.size(); ++uPulsTrdIdx)
+
+    /// RICH - TOF
+    for (uint32_t uPulsRichIdx = uLastFirstMatchRich; uPulsRichIdx < vPulserDigisRich.size(); ++uPulsRichIdx) {
+      double_t dRichTime = vPulserDigisRich[uPulsRichIdx].GetTime();
+      double_t dRichDt   = dRichTime - dTofTime;
+
+      // Find beginning of match window (assume both vectors are fully time sorted)
+      if (dRichDt < -dHistoRange) {  //
+        uLastFirstMatchRich = uPulsRichIdx;
+      }
+      else if (dRichDt <= dHistoRange) {
+        fPulserTofRichDt->Fill(dRichDt);
+      }
+      else
+        break;
+    }  // for( uint32_t uPulsRichIdx = uLastFirstMatchRich; uPulsRichIdx < vPulserDigisRich.size(); ++uPulsRichIdx)
+  }
+
+  /// ***************************************************************************************************************///
+  /// NOT PULSER ****************************************************************************************************///
+  dLastTofTime         = 0;
+  uLastFirstMatchSts   = 0;
+  uLastFirstMatchTrd1d = 0;
+  uLastFirstMatchTrd2d = 0;
+  uLastFirstMatchRich  = 0;
+  for (uint32_t uTofIdx = 0; uTofIdx < vNotPulserDigisTof.size(); ++uTofIdx) {
+    double_t dTofTime = vNotPulserDigisTof[uTofIdx].GetTime();
+    if (0 < uTofIdx) {  //
+      fTofTofDt->Fill(dTofTime - dLastTofTime);
+    }  // if 0 < uTofIdx )
+    dLastTofTime = dTofTime;
+
+    /// STS - TOF
+    for (uint32_t uStsIdx = uLastFirstMatchSts; uStsIdx < vNotPulserDigisSts.size(); ++uStsIdx) {
+      double_t dStsTime = vNotPulserDigisSts[uStsIdx].GetTime();
+      double_t dStsDt   = dStsTime - dTofTime;
+
+      // Find beginning of match window (assume both vectors are fully time sorted)
+      if (dStsDt < -dHistoRange) {  //
+        uLastFirstMatchSts = uStsIdx;
+      }
+      else if (dStsDt <= dHistoRange) {
+        fTofStsDt->Fill(dStsDt);
+      }
+      else
+        break;
+    }  // for( uint32_t uStsIdx = uLastFirstMatchSts; uStsIdx < vNotPulserDigisSts.size(); ++uStsIdx)
+
+    /// Trd 1d - TOF
+    for (uint32_t uTrdIdx = uLastFirstMatchTrd1d; uTrdIdx < vNotPulserDigisTrd1d.size(); ++uTrdIdx) {
+      double_t dTrdTime = vNotPulserDigisTrd1d[uTrdIdx].GetTime();
+      double_t dTrdDt   = dTrdTime - dTofTime;
+
+      // Find beginning of match window (assume both vectors are fully time sorted)
+      if (dTrdDt < -dHistoRange) {  //
+        uLastFirstMatchTrd1d = uTrdIdx;
+      }
+      else if (dTrdDt <= dHistoRange) {
+        fTofTrd1dDt->Fill(dTrdDt);
+      }
+      else
+        break;
+    }  // for( uint32_t uTrdIdx = uLastFirstMatchTrd1d; uTrdIdx < vNotPulserDigisTrd1d.size(); ++uTrdIdx)
+
+    /// Trd 2d - TOF
+    for (uint32_t uTrdIdx = uLastFirstMatchTrd2d; uTrdIdx < vNotPulserDigisTrd2d.size(); ++uTrdIdx) {
+      double_t dTrdTime = vNotPulserDigisTrd2d[uTrdIdx].GetTime();
+      double_t dTrdDt   = dTrdTime - dTofTime;
+
+      // Find beginning of match window (assume both vectors are fully time sorted)
+      if (dTrdDt < -dHistoRange) {  //
+        uLastFirstMatchTrd2d = uTrdIdx;
+      }
+      else if (dTrdDt <= dHistoRange) {
+        fTofTrd2dDt->Fill(dTrdDt);
+      }
+      else
+        break;
+    }  // for( uint32_t uTrdIdx = uLastFirstMatchTrd2d; uTrdIdx < vNotPulserDigisTrd2d.size(); ++uTrdIdx)
+
+    /// RICH - TOF
+    for (uint32_t uRichIdx = uLastFirstMatchRich; uRichIdx < vNotPulserDigisRich.size(); ++uRichIdx) {
+      double_t dRichTime = vNotPulserDigisRich[uRichIdx].GetTime();
+      double_t dRichDt   = dRichTime - dTofTime;
+
+      // Find beginning of match window (assume both vectors are fully time sorted)
+      if (dRichDt < -dHistoRange) {  //
+        uLastFirstMatchRich = uRichIdx;
+      }
+      else if (dRichDt <= dHistoRange) {
+        fTofRichDt->Fill(dRichDt);
+      }
+      else
+        break;
+    }  // for( uint32_t uRichIdx = uLastFirstMatchRich; uRichIdx < vNotPulserDigisRich.size(); ++vNotPulserDigisRich)
+  }
+  /// ***************************************************************************************************************///
+
+  TCanvas* pCanv = new TCanvas("canv", "Pulser diff to TOF");
+  pCanv->Divide(3, 2);
+
+  pCanv->cd(1);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fPulserTofStsDt->Draw();
+
+  pCanv->cd(2);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fPulserTofTrd1dDt->Draw();
+
+  pCanv->cd(3);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fPulserTofTrd1dMainDt->Draw();
+
+  pCanv->cd(4);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fPulserTofRichDt->Draw();
+
+  pCanv->cd(5);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  // fPulserStsStsDt->Draw();
+  fPulserTofStsDtAdc->Draw("colz");
+
+
+  pCanv->cd(6);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fPulserTofTofDt->Draw();
+
+  TCanvas* pCanvNot = new TCanvas("canvNot", "Not Pulser diff to TOF");
+  pCanvNot->Divide(3, 2);
+
+  pCanvNot->cd(1);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fTofStsDt->Draw();
+
+  pCanvNot->cd(2);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fTofTrd1dDt->Draw();
+
+  pCanvNot->cd(3);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fTofTrd2dDt->Draw();
+
+  pCanvNot->cd(4);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fTofRichDt->Draw();
+
+  pCanvNot->cd(6);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fTofTofDt->Draw();
+
+  vPulserDigisSts.clear();
+  vPulserDigisTrd1d.clear();
+  vPulserDigisTrd2d.clear();
+  vPulserDigisTof.clear();
+  vPulserDigisRich.clear();
+}
diff --git a/macro/beamtime/mcbm2022/pulser_dt_full.C b/macro/beamtime/mcbm2022/pulser_dt_full.C
new file mode 100644
index 0000000000000000000000000000000000000000..a15a293a7b9a4b07b44cc6e810841614dc8f3f8b
--- /dev/null
+++ b/macro/beamtime/mcbm2022/pulser_dt_full.C
@@ -0,0 +1,635 @@
+/* Copyright (C) 2022 Facility for Antiproton and Ion Research in Europe, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Pierre-Alain Loizeau [committer] */
+
+void pulser_dt_full(TString filename = "1935.digi.root", uint32_t uNbTs = 10)
+{
+
+  gROOT->cd();
+  TFile* file = new TFile(filename, "READ");
+  TTree* tree = (TTree*) (file->Get("cbmsim"));
+
+  std::vector<CbmTofDigi>* vDigisBmon  = new std::vector<CbmTofDigi>();
+  std::vector<CbmStsDigi>* vDigisSts   = new std::vector<CbmStsDigi>();
+  std::vector<CbmStsDigi>* vDigisStsP  = new std::vector<CbmStsDigi>();
+  std::vector<CbmMuchDigi>* vDigisMuch = new std::vector<CbmMuchDigi>();
+  std::vector<CbmTrdDigi>* vDigisTrd   = new std::vector<CbmTrdDigi>();
+  std::vector<CbmTofDigi>* vDigisTof   = new std::vector<CbmTofDigi>();
+  std::vector<CbmRichDigi>* vDigisRich = new std::vector<CbmRichDigi>();
+
+  std::vector<CbmTofDigi> vPulserDigisBmon {};
+  std::vector<CbmStsDigi> vPulserDigisSts {};
+  std::vector<CbmMuchDigi> vPulserDigisMuch {};
+  std::vector<CbmTrdDigi> vPulserDigisTrd1d {};
+  std::vector<CbmTrdDigi> vPulserDigisTrd2d {};
+  std::vector<CbmTofDigi> vPulserDigisTof {};
+  std::vector<CbmRichDigi> vPulserDigisRich {};
+
+  std::vector<CbmTofDigi> vNotPulserDigisBmon {};
+  std::vector<CbmStsDigi> vNotPulserDigisSts {};
+  std::vector<CbmMuchDigi> vNotPulserDigisMuch {};
+  std::vector<CbmTrdDigi> vNotPulserDigisTrd1d {};
+  std::vector<CbmTrdDigi> vNotPulserDigisTrd2d {};
+  std::vector<CbmTofDigi> vNotPulserDigisTof {};
+  std::vector<CbmRichDigi> vNotPulserDigisRich {};
+
+  tree->SetBranchAddress("T0Digi", &vDigisBmon);
+  tree->SetBranchAddress("StsDigi", &vDigisSts);
+  tree->SetBranchAddress("StsDigiPulser", &vDigisStsP);
+  tree->SetBranchAddress("MuchDigi", &vDigisMuch);
+  tree->SetBranchAddress("TrdDigi", &vDigisTrd);
+  tree->SetBranchAddress("TofDigi", &vDigisTof);
+  tree->SetBranchAddress("RichDigi", &vDigisRich);
+
+  uint32_t nentries = tree->GetEntries();
+  cout << "Entries: " << nentries << endl;
+  nentries = (uNbTs && uNbTs < nentries ? uNbTs : nentries);
+
+  double_t dHistoRange = 6000.;
+  // clang-format off
+  TH1F *fPulserTofBmonDt      = new TH1F("fPulserTofBmonDt",
+                                         "Bmon-Tof;time diff [ns];Counts",
+                                         2*dHistoRange, -dHistoRange, dHistoRange);
+  TH1F *fPulserTofStsDt       = new TH1F("fPulserTofStsDt",
+                                         "Sts-Tof;time diff [ns];Counts",
+                                         dHistoRange/3.125, -dHistoRange, dHistoRange);
+  TH1F *fPulserStsStsDt       = new TH1F("fPulserStsStsDt",
+                                         "Sts-Sts;time diff [ns];Counts",
+                                         5001,     -5000, 50005000);
+  TH2F *fPulserTofStsDtAdc    = new TH2F("fPulserTofStsDtAdc",
+                                         "Sts-Tof;time diff [ns];Counts",
+                                         dHistoRange/3.125, -dHistoRange, dHistoRange,
+                                         32, 0, 32);
+  TH1F *fPulserTofMuchDt      = new TH1F("fPulserTofMuchDt",
+                                         "Much-Tof;time diff [ns];Counts",
+                                         2*dHistoRange/3.125, -dHistoRange, dHistoRange);
+  TH1F *fPulserTofTrd1dDt     = new TH1F("fPulserTofTrd1dDt",
+                                         "Trd1d-Tof;time diff [ns];Counts",
+                                         2*dHistoRange/60, -dHistoRange, dHistoRange);
+  TH1F *fPulserTofTrd1dMainDt = new TH1F("fPulserTofTrd1dMainDt",
+                                         "Trd1d-Tof;time diff [ns];Counts",
+                                         2*dHistoRange/60, -dHistoRange, dHistoRange);
+  TH1F *fPulserTofTrd2dDt     = new TH1F("fPulserTofTrd2dDt",
+                                         "Trd2d-Tof;time diff [ns];Counts",
+                                         2*dHistoRange/60, -dHistoRange, dHistoRange);
+  TH1F *fPulserTofRichDt      = new TH1F("fPulserTofRichDt",
+                                         "Rich-Tof;time diff [ns];Counts",
+                                         2*dHistoRange, -dHistoRange, dHistoRange);
+  TH1F *fPulserTofTofDt       = new TH1F("fPulserTofTofDt",
+                                         "Tof-Tof;time diff [ns];Counts",
+                                         5001,     -5000, 50005000);
+
+  TH1F *fTofBmonDt  = new TH1F("fTofBmonDt",
+                               "Bmon-Tof;time diff [ns];Counts",
+                               2*dHistoRange, -dHistoRange, dHistoRange);
+  TH1F *fTofStsDt   = new TH1F("fTofStsDt",
+                               "Sts-Tof;time diff [ns];Counts",
+                               2*dHistoRange/3.125, -dHistoRange, dHistoRange);
+  TH1F *fTofMuchDt  = new TH1F("fTofMuchDt",
+                               "Much-Tof;time diff [ns];Counts",
+                               2*dHistoRange/3.125, -dHistoRange, dHistoRange);
+  TH1F *fTofTrd1dDt = new TH1F("fTofTrd1dDt",
+                               "Trd1d-Tof;time diff [ns];Counts",
+                               2*dHistoRange/60, -dHistoRange, dHistoRange);
+  TH1F *fTofTrd2dDt = new TH1F("fTofTrd2dDt",
+                               "Trd2d-Tof;time diff [ns];Counts",
+                               2*dHistoRange/60, -dHistoRange, dHistoRange);
+  TH1F *fTofRichDt  = new TH1F("fTofRichDt",
+                               "Rich-Tof;time diff [ns];Counts",
+                               2*dHistoRange, -dHistoRange, dHistoRange);
+  TH1F *fTofTofDt   = new TH1F("fTofTofDt",
+                               "Tof-Tof;time diff [ns];Counts",
+                               5001,     -5000, 50005000);
+  // clang-format on
+
+  std::map<uint32_t, uint32_t> mTrdModules;
+  std::map<uint32_t, uint32_t> mTrdPad;
+  uint32_t uAddressFirstTof = 0;
+  for (Int_t iEntry = 0; iEntry < nentries; iEntry++) {
+    //if (iEntry % 10 == 0 ) std::cout << "Entry " << iEntry << " / " << nentries << std::endl;
+
+    tree->GetEntry(iEntry);
+    uint32_t nDigisBmon = vDigisBmon->size();
+    uint32_t nDigisSts  = vDigisSts->size();
+    uint32_t nDigisStsP = vDigisStsP->size();
+    uint32_t nDigisMuch = vDigisMuch->size();
+    uint32_t nDigisTrd  = vDigisTrd->size();
+    uint32_t nDigisTof  = vDigisTof->size();
+    uint32_t nDigisRich = vDigisRich->size();
+
+    if (iEntry % 10 == 0) {
+      std::cout << "BMON  Digis: " << nDigisBmon << std::endl;
+      std::cout << "STS   Digis: " << nDigisSts << std::endl;
+      std::cout << "STS P Digis: " << nDigisStsP << std::endl;
+      std::cout << "MUCH  Digis: " << nDigisMuch << std::endl;
+      std::cout << "TRD   Digis: " << nDigisTrd << std::endl;
+      std::cout << "TOF   Digis: " << nDigisTof << std::endl;
+      std::cout << "RICH  Digis: " << nDigisRich << std::endl;
+    }
+
+    // Bmon
+    // double_t dLatPulsTime = 0;
+    for (uint32_t uDigiBmon = 0; uDigiBmon < nDigisBmon; ++uDigiBmon) {
+
+      CbmTofDigi& pDigi = vDigisBmon->at(uDigiBmon);
+
+      // if ( (0 == pDigi.GetChannel() || 32 == pDigi.GetChannel())
+      //      && (185 < pDigi.GetCharge() && pDigi.GetCharge() < 189) ) {
+      if ((185 < pDigi.GetCharge() && pDigi.GetCharge() < 189)) {  //
+        vPulserDigisBmon.push_back(pDigi);
+      }  // feb condition
+      else {
+        //   if( 400 < pDigi.GetTime() - dLatPulsTime ) {
+        vNotPulserDigisBmon.push_back(pDigi);
+        // }
+      }
+    }
+    // STS
+    for (uint32_t uDigiSts = 0; uDigiSts < nDigisStsP; ++uDigiSts) {
+
+      CbmStsDigi& pDigi = vDigisStsP->at(uDigiSts);
+
+      uint32_t uAddr = pDigi.GetAddress();
+      if ((uAddr == 0x10107C02 || uAddr == 0x101FFC02) && 5 < pDigi.GetCharge()) {  //
+        vPulserDigisSts.push_back(pDigi);
+      }  // feb condition
+    }
+    for (uint32_t uDigiSts = 0; uDigiSts < nDigisSts; ++uDigiSts) {
+
+      CbmStsDigi& pDigi = vDigisSts->at(uDigiSts);
+
+      if (3 < pDigi.GetCharge()) {  //
+        vNotPulserDigisSts.push_back(pDigi);
+      }  // feb condition
+    }
+    // Much
+    for (uint32_t uDigiMuch = 0; uDigiMuch < nDigisMuch; ++uDigiMuch) {
+
+      CbmMuchDigi& pDigi = vDigisMuch->at(uDigiMuch);
+
+      if (2 < pDigi.GetCharge()) {
+        // if (pDigi.GetAddress()==0x10107C02 || pDigi.GetAddress()==0x101FFC02) { //
+        vPulserDigisMuch.push_back(pDigi);
+        // } // feb condition
+        // else {
+        vNotPulserDigisMuch.push_back(pDigi);
+        // }
+      }
+    }
+    // TRD
+    for (uint32_t uDigiTrd = 0; uDigiTrd < nDigisTrd; ++uDigiTrd) {
+
+      CbmTrdDigi& pDigi = vDigisTrd->at(uDigiTrd);
+
+      if (pDigi.GetType() == CbmTrdDigi::eCbmTrdAsicType::kSPADIC) {
+        uint32_t uAddr = pDigi.GetAddress();
+        uint32_t uMod  = CbmTrdAddress::GetModuleId(uAddr);
+        if (mTrdModules.find(uMod) == mTrdModules.end()) {  //
+          mTrdModules[uMod] = 1;
+        }
+        else
+          mTrdModules[uMod]++;
+
+        if (mTrdPad.find(uAddr) == mTrdPad.end()) {  //
+          mTrdPad[uAddr] = 1;
+        }
+        else
+          mTrdPad[uAddr]++;
+
+        // if (0x0008007b == uAddr ) { //
+        if (0x80070 <= uAddr && uAddr <= 0x800ff) {  //
+          vPulserDigisTrd1d.push_back(pDigi);
+        }
+        else {
+          vNotPulserDigisTrd1d.push_back(pDigi);
+        }
+      }
+      else if (pDigi.GetType() == CbmTrdDigi::eCbmTrdAsicType::kFASP) {
+        vNotPulserDigisTrd2d.push_back(pDigi);
+      }
+    }
+    // TOF
+    double_t dLatPulsTime = 0;
+    for (uint32_t uDigiTof = 0; uDigiTof < nDigisTof; ++uDigiTof) {
+
+      CbmTofDigi& pDigi = vDigisTof->at(uDigiTof);
+
+      // if ( (0 == uAddressFirstTof || uAddressFirstTof == pDigi.GetAddress() )
+      if (true  //
+          && (0 == pDigi.GetChannel() || 32 == pDigi.GetChannel())
+          && (185 < pDigi.GetCharge() && pDigi.GetCharge() < 189)) {
+        if (0 == uAddressFirstTof) {  //
+          uAddressFirstTof = pDigi.GetAddress();
+        }
+        if (uAddressFirstTof == pDigi.GetAddress()) {
+          vPulserDigisTof.push_back(pDigi);
+          dLatPulsTime = pDigi.GetTime();
+        }
+      }  // feb condition
+      else {
+        if (400 < pDigi.GetTime() - dLatPulsTime) {  //
+          vNotPulserDigisTof.push_back(pDigi);
+        }
+      }
+    }
+    // Rich
+    for (uint32_t uDigiRich = 0; uDigiRich < nDigisRich; ++uDigiRich) {
+
+      CbmRichDigi& pDigi = vDigisRich->at(uDigiRich);
+
+      // if (pDigi.GetAddress()==0x10107C02 || pDigi.GetAddress()==0x101FFC02) { //
+      vPulserDigisRich.push_back(pDigi);
+      // } // feb condition
+      // else {
+      vNotPulserDigisRich.push_back(pDigi);
+      // }
+    }
+
+    /// PULSER ********************************************************************************************************///
+    double_t dLastStsTime         = 0;
+    double_t dLastTofTime         = 0;
+    uint32_t uLastFirstMatchBmon  = 0;
+    uint32_t uLastFirstMatchSts   = 0;
+    uint32_t uLastFirstMatchMuch  = 0;
+    uint32_t uLastFirstMatchTrd1d = 0;
+    uint32_t uLastFirstMatchTrd2d = 0;
+    uint32_t uLastFirstMatchRich  = 0;
+    for (uint32_t uPulsStsIdx = 0; uPulsStsIdx < vPulserDigisSts.size(); ++uPulsStsIdx) {
+      double_t dStsTime = vPulserDigisSts[uPulsStsIdx].GetTime();
+      if (0 < uPulsStsIdx) {  //
+        fPulserStsStsDt->Fill(dStsTime - dLastStsTime);
+      }  // if 0 < uPulsTofIdx )
+      dLastStsTime = dStsTime;
+    }
+
+    for (uint32_t uPulsTofIdx = 0; uPulsTofIdx < vPulserDigisTof.size(); ++uPulsTofIdx) {
+      double_t dTofTime = vPulserDigisTof[uPulsTofIdx].GetTime();
+      if (0 < uPulsTofIdx) {  //
+        fPulserTofTofDt->Fill(dTofTime - dLastTofTime);
+      }  // if 0 < uPulsTofIdx )
+      dLastTofTime = dTofTime;
+
+      /// Bmon - TOF
+      for (uint32_t uPulsBmonIdx = uLastFirstMatchBmon; uPulsBmonIdx < vPulserDigisBmon.size(); ++uPulsBmonIdx) {
+        double_t dBmonTime = vPulserDigisBmon[uPulsBmonIdx].GetTime();
+        double_t dBmonDt   = dBmonTime - dTofTime;
+
+        // Find beginning of match window (assume both vectors are fully time sorted)
+        if (dBmonDt < -dHistoRange) {  //
+          uLastFirstMatchBmon = uPulsBmonIdx;
+        }
+        else if (dBmonDt <= dHistoRange) {
+          fPulserTofBmonDt->Fill(dBmonDt);
+        }
+        else
+          break;
+      }  // for( uint32_t uPulsBmonIdx = uLastFirstMatchBmon; uPulsBmonIdx < vPulserDigisBmon.size(); ++uPulsBmonIdx)
+
+      /// STS - TOF
+      for (uint32_t uPulsStsIdx = uLastFirstMatchSts; uPulsStsIdx < vPulserDigisSts.size(); ++uPulsStsIdx) {
+        double_t dStsTime = vPulserDigisSts[uPulsStsIdx].GetTime();
+        double_t dStsDt   = dStsTime - dTofTime;
+
+        // Find beginning of match window (assume both vectors are fully time sorted)
+        if (dStsDt < -dHistoRange) {  //
+          uLastFirstMatchSts = uPulsStsIdx;
+        }
+        else if (dStsDt <= dHistoRange) {
+          fPulserTofStsDt->Fill(dStsDt);
+          fPulserTofStsDtAdc->Fill(dStsDt, vPulserDigisSts[uPulsStsIdx].GetCharge());
+        }
+        else
+          break;
+      }  // for( uint32_t uPulsStsIdx = uLastFirstMatchSts; uPulsStsIdx < vPulserDigisSts.size(); ++uPulsStsIdx)
+
+      /// Much - TOF
+      for (uint32_t uPulsMuchIdx = uLastFirstMatchMuch; uPulsMuchIdx < vPulserDigisMuch.size(); ++uPulsMuchIdx) {
+        double_t dMuchTime = vPulserDigisMuch[uPulsMuchIdx].GetTime();
+        double_t dMuchDt   = dMuchTime - dTofTime;
+
+        // Find beginning of match window (assume both vectors are fully time sorted)
+        if (dMuchDt < -dHistoRange) {  //
+          uLastFirstMatchMuch = uPulsMuchIdx;
+        }
+        else if (dMuchDt <= dHistoRange) {
+          fPulserTofMuchDt->Fill(dMuchDt);
+        }
+        else
+          break;
+      }  // for( uint32_t uPulsMuchIdx = uLastFirstMatchMuch; uPulsMuchIdx < vPulserDigisMuch.size(); ++uPulsMuchIdx)
+
+      /// TRD1D - TOF
+      for (uint32_t uPulsTrdIdx = uLastFirstMatchTrd1d; uPulsTrdIdx < vPulserDigisTrd1d.size(); ++uPulsTrdIdx) {
+        double_t dTrdTime = vPulserDigisTrd1d[uPulsTrdIdx].GetTime();
+        double_t dTrdDt   = dTrdTime - dTofTime;
+
+        // Find beginning of match window (assume both vectors are fully time sorted)
+        if (dTrdDt < -dHistoRange) {  //
+          uLastFirstMatchTrd1d = uPulsTrdIdx;
+        }
+        else if (dTrdDt <= dHistoRange) {
+          if (0x0008007b == vPulserDigisTrd1d[uPulsTrdIdx].GetAddress()) {  //
+            fPulserTofTrd1dMainDt->Fill(dTrdDt);
+          }
+          else {
+            fPulserTofTrd1dDt->Fill(dTrdDt);
+          }
+        }
+        else
+          break;
+      }  // for( uint32_t uPulsTrdIdx = uLastFirstMatchTrd1d; uPulsTrdIdx < vPulserDigisTrd1d.size(); ++uPulsTrdIdx)
+
+      /// TRD2D - TOF
+      for (uint32_t uPulsTrdIdx = uLastFirstMatchTrd2d; uPulsTrdIdx < vPulserDigisTrd2d.size(); ++uPulsTrdIdx) {
+        double_t dTrdTime = vPulserDigisTrd2d[uPulsTrdIdx].GetTime();
+        double_t dTrdDt   = dTrdTime - dTofTime;
+
+        // Find beginning of match window (assume both vectors are fully time sorted)
+        if (dTrdDt < -dHistoRange) {  //
+          uLastFirstMatchTrd2d = uPulsTrdIdx;
+        }
+        else if (dTrdDt <= dHistoRange) {
+          fPulserTofTrd2dDt->Fill(dTrdDt);
+        }
+        else
+          break;
+      }  // for( uint32_t uPulsTrdIdx = uLastFirstMatchTrd2d; uPulsTrdIdx < vPulserDigisTrd2d.size(); ++uPulsTrdIdx)
+
+      /// RICH - TOF
+      for (uint32_t uPulsRichIdx = uLastFirstMatchRich; uPulsRichIdx < vPulserDigisRich.size(); ++uPulsRichIdx) {
+        double_t dRichTime = vPulserDigisRich[uPulsRichIdx].GetTime();
+        double_t dRichDt   = dRichTime - dTofTime;
+
+        // Find beginning of match window (assume both vectors are fully time sorted)
+        if (dRichDt < -dHistoRange) {  //
+          uLastFirstMatchRich = uPulsRichIdx;
+        }
+        else if (dRichDt <= dHistoRange) {
+          fPulserTofRichDt->Fill(dRichDt);
+        }
+        else
+          break;
+      }  // for( uint32_t uPulsRichIdx = uLastFirstMatchRich; uPulsRichIdx < vPulserDigisRich.size(); ++uPulsRichIdx)
+    }
+    /// ***************************************************************************************************************///
+
+    /// NOT PULSER ****************************************************************************************************///
+    dLastTofTime         = 0;
+    uLastFirstMatchBmon  = 0;
+    uLastFirstMatchSts   = 0;
+    uLastFirstMatchMuch  = 0;
+    uLastFirstMatchTrd1d = 0;
+    uLastFirstMatchTrd2d = 0;
+    uLastFirstMatchRich  = 0;
+    for (uint32_t uTofIdx = 0; uTofIdx < vNotPulserDigisTof.size(); ++uTofIdx) {
+      double_t dTofTime = vNotPulserDigisTof[uTofIdx].GetTime();
+      if (0 < uTofIdx) {  //
+        fTofTofDt->Fill(dTofTime - dLastTofTime);
+      }  // if 0 < uTofIdx )
+      dLastTofTime = dTofTime;
+
+      /// Bmon - TOF
+      for (uint32_t uBmonIdx = uLastFirstMatchBmon; uBmonIdx < vNotPulserDigisBmon.size(); ++uBmonIdx) {
+        double_t dBmonTime = vNotPulserDigisBmon[uBmonIdx].GetTime();
+        double_t dBmonDt   = dBmonTime - dTofTime;
+
+        // Find beginning of match window (assume both vectors are fully time sorted)
+        if (dBmonDt < -dHistoRange) {  //
+          uLastFirstMatchBmon = uBmonIdx;
+        }
+        else if (dBmonDt <= dHistoRange) {
+          fTofBmonDt->Fill(dBmonDt);
+        }
+        else
+          break;
+      }  // for( uint32_t uBmonIdx = uLastFirstMatchBmon; uBmonIdx < vNotPulserDigisBmon.size(); ++uBmonIdx)
+
+      /// STS - TOF
+      for (uint32_t uStsIdx = uLastFirstMatchSts; uStsIdx < vNotPulserDigisSts.size(); ++uStsIdx) {
+        double_t dStsTime = vNotPulserDigisSts[uStsIdx].GetTime();
+        double_t dStsDt   = dStsTime - dTofTime;
+
+        // Find beginning of match window (assume both vectors are fully time sorted)
+        if (dStsDt < -dHistoRange) {  //
+          uLastFirstMatchSts = uStsIdx;
+        }
+        else if (dStsDt <= dHistoRange) {
+          fTofStsDt->Fill(dStsDt);
+        }
+        else
+          break;
+      }  // for( uint32_t uStsIdx = uLastFirstMatchSts; uStsIdx < vNotPulserDigisSts.size(); ++uStsIdx)
+
+      /// Much - TOF
+      for (uint32_t uMuchIdx = uLastFirstMatchMuch; uMuchIdx < vNotPulserDigisMuch.size(); ++uMuchIdx) {
+        double_t dMuchTime = vNotPulserDigisMuch[uMuchIdx].GetTime();
+        double_t dMuchDt   = dMuchTime - dTofTime;
+
+        // Find beginning of match window (assume both vectors are fully time sorted)
+        if (dMuchDt < -dHistoRange) {  //
+          uLastFirstMatchMuch = uMuchIdx;
+        }
+        else if (dMuchDt <= dHistoRange) {
+          fTofMuchDt->Fill(dMuchDt);
+        }
+        else
+          break;
+      }  // for( uint32_t uMuchIdx = uLastFirstMatchMuch; uMuchIdx < vNotPulserDigisMuch.size(); ++uMuchIdx)
+
+      /// Trd 1d - TOF
+      for (uint32_t uTrdIdx = uLastFirstMatchTrd1d; uTrdIdx < vNotPulserDigisTrd1d.size(); ++uTrdIdx) {
+        double_t dTrdTime = vNotPulserDigisTrd1d[uTrdIdx].GetTime();
+        double_t dTrdDt   = dTrdTime - dTofTime;
+
+        // Find beginning of match window (assume both vectors are fully time sorted)
+        if (dTrdDt < -dHistoRange) {  //
+          uLastFirstMatchTrd1d = uTrdIdx;
+        }
+        else if (dTrdDt <= dHistoRange) {
+          fTofTrd1dDt->Fill(dTrdDt);
+        }
+        else
+          break;
+      }  // for( uint32_t uTrdIdx = uLastFirstMatchTrd1d; uTrdIdx < vNotPulserDigisTrd1d.size(); ++uTrdIdx)
+
+      /// Trd 2d - TOF
+      for (uint32_t uTrdIdx = uLastFirstMatchTrd2d; uTrdIdx < vNotPulserDigisTrd2d.size(); ++uTrdIdx) {
+        double_t dTrdTime = vNotPulserDigisTrd2d[uTrdIdx].GetTime();
+        double_t dTrdDt   = dTrdTime - dTofTime;
+
+        // Find beginning of match window (assume both vectors are fully time sorted)
+        if (dTrdDt < -dHistoRange) {  //
+          uLastFirstMatchTrd2d = uTrdIdx;
+        }
+        else if (dTrdDt <= dHistoRange) {
+          fTofTrd2dDt->Fill(dTrdDt);
+        }
+        else
+          break;
+      }  // for( uint32_t uTrdIdx = uLastFirstMatchTrd2d; uTrdIdx < vNotPulserDigisTrd2d.size(); ++uTrdIdx)
+
+      /// RICH - TOF
+      for (uint32_t uRichIdx = uLastFirstMatchRich; uRichIdx < vNotPulserDigisRich.size(); ++uRichIdx) {
+        double_t dRichTime = vNotPulserDigisRich[uRichIdx].GetTime();
+        double_t dRichDt   = dRichTime - dTofTime;
+
+        // Find beginning of match window (assume both vectors are fully time sorted)
+        if (dRichDt < -dHistoRange) {  //
+          uLastFirstMatchRich = uRichIdx;
+        }
+        else if (dRichDt <= dHistoRange) {
+          fTofRichDt->Fill(dRichDt);
+        }
+        else
+          break;
+      }  // for( uint32_t uRichIdx = uLastFirstMatchRich; uRichIdx < vNotPulserDigisRich.size(); ++vNotPulserDigisRich)
+    }
+
+    /// ***************************************************************************************************************///
+    std::cout << "BMON  Pulser Digis: " << vPulserDigisBmon.size() << std::endl;
+    std::cout << "STS   Pulser Digis: " << vPulserDigisSts.size() << std::endl;
+    std::cout << "MUCH  Pulser Digis: " << vPulserDigisMuch.size() << std::endl;
+    std::cout << "TRD1D Pulser Digis: " << vPulserDigisTrd1d.size() << std::endl;
+    std::cout << "TRD2D Pulser Digis: " << vPulserDigisTrd2d.size() << std::endl;
+    std::cout << "TOF   Pulser Digis: " << vPulserDigisTof.size() << std::endl;
+    std::cout << "RICH  Pulser Digis: " << vPulserDigisRich.size() << std::endl;
+    /// ***************************************************************************************************************///
+    std::cout << "BMON  Non-Pulser Digis: " << vNotPulserDigisBmon.size() << std::endl;
+    std::cout << "STS   Non-Pulser Digis: " << vNotPulserDigisSts.size() << std::endl;
+    std::cout << "MUCH  Non-Pulser Digis: " << vNotPulserDigisMuch.size() << std::endl;
+    std::cout << "TRD1D Non-Pulser Digis: " << vNotPulserDigisTrd1d.size() << std::endl;
+    std::cout << "TRD2D Non-Pulser Digis: " << vNotPulserDigisTrd2d.size() << std::endl;
+    std::cout << "TOF   Non-Pulser Digis: " << vNotPulserDigisTof.size() << std::endl;
+    std::cout << "RICH  Non-Pulser Digis: " << vNotPulserDigisRich.size() << std::endl;
+    /// ***************************************************************************************************************///
+
+    vPulserDigisBmon.clear();
+    vPulserDigisSts.clear();
+    vPulserDigisMuch.clear();
+    vPulserDigisTrd1d.clear();
+    vPulserDigisTrd2d.clear();
+    vPulserDigisTof.clear();
+    vPulserDigisRich.clear();
+
+    vNotPulserDigisBmon.clear();
+    vNotPulserDigisSts.clear();
+    vNotPulserDigisMuch.clear();
+    vNotPulserDigisTrd1d.clear();
+    vNotPulserDigisTrd1d.clear();
+    vNotPulserDigisTof.clear();
+    vNotPulserDigisRich.clear();
+  }
+  /// ***************************************************************************************************************///
+  /*
+  for (auto& stsModcCn : mStsModules) {
+     std::cout << "STS module 0x" << std::hex << std::setw(8) << stsModcCn.first << std::dec
+               << " had " << std::setw(8) << stsModcCn.second << " digis" << std::endl;
+  }
+  */
+  /// ***************************************************************************************************************///
+  /*
+  for (auto& trdModcCn : mTrdModules) {
+     std::cout << "TRD module 0x" << std::hex << std::setw(8) << trdModcCn.first << std::dec
+               << " had " << std::setw(8) << trdModcCn.second << " digis" << std::endl;
+  }
+  */
+  /// ***************************************************************************************************************///
+  /*
+  for (auto& trdPadcCn : mTrdPad) {
+     std::cout << "TRD Pad 0x" << std::hex << std::setw(8) << trdPadcCn.first << std::dec
+               << " had " << std::setw(8) << trdPadcCn.second << " digis" << std::endl;
+  }
+  */
+  /// ***************************************************************************************************************///
+
+  /// Timesort
+  /*
+  std::sort(vPulserDigisTrd.begin(), vPulserDigisTrd.end(),
+            [](const CbmTrdDigi& a, const CbmTrdDigi& b) -> bool { return a.GetTime() < b.GetTime(); });
+  */
+
+
+  TCanvas* pCanv = new TCanvas("canv", "Pulser diff to TOF");
+  pCanv->Divide(3, 2);
+
+  pCanv->cd(1);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fPulserTofBmonDt->Draw();
+
+  pCanv->cd(2);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fPulserTofStsDt->Draw();
+
+  pCanv->cd(3);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fPulserTofMuchDt->Draw();
+
+  pCanv->cd(4);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fPulserTofTrd1dDt->Draw();
+
+  pCanv->cd(5);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fPulserTofRichDt->Draw();
+
+  pCanv->cd(6);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fPulserTofTofDt->Draw();
+
+  TCanvas* pCanvNot = new TCanvas("canvNot", "Not Pulser diff to TOF");
+  pCanvNot->Divide(4, 2);
+
+  pCanvNot->cd(1);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fTofBmonDt->Draw();
+
+  pCanvNot->cd(2);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fTofStsDt->Draw();
+
+  pCanvNot->cd(3);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fTofMuchDt->Draw();
+
+  pCanvNot->cd(4);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fTofTrd1dDt->Draw();
+
+  pCanvNot->cd(5);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fTofTrd2dDt->Draw();
+
+  pCanvNot->cd(6);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fTofRichDt->Draw();
+
+  pCanvNot->cd(7);
+  gPad->SetGridx();
+  gPad->SetGridy();
+  gPad->SetLogy();
+  fTofTofDt->Draw();
+}
diff --git a/macro/run/run_unpack_tsa.C b/macro/run/run_unpack_tsa.C
index 0ee6ccefb5e353a6d9230e80c9e4e8acc62a3148..28d7bf7713df7e904834f15ea85291a5885c157d 100644
--- a/macro/run/run_unpack_tsa.C
+++ b/macro/run/run_unpack_tsa.C
@@ -123,6 +123,9 @@ void run_unpack_tsa(std::vector<std::string> infile = {"test.tsa"}, UInt_t runid
     richconfig->SetParFilesBasePath(parfilesbasepathRich);
     richconfig->SetSystemTimeOffset(256000 - 1200);  // [ns] 1 MS and additional correction
     if (1904 < runid) richconfig->SetSystemTimeOffset(-1200);
+    if (2160 <= runid) {
+      richconfig->SetSystemTimeOffset(50);  // [ns] value to be updated
+    }
     if (runid == 1588) richconfig->MaskDiRICH(0x7150);
   }
   // -------------
@@ -146,6 +149,9 @@ void run_unpack_tsa(std::vector<std::string> infile = {"test.tsa"}, UInt_t runid
     /// Enable Monitor plots
     //stsconfig->SetMonitor(GetStsMonitor(outfilename, true));
     stsconfig->SetSystemTimeOffset(-2221);  // [ns] value to be updated
+    if (2160 <= runid) {
+      stsconfig->SetSystemTimeOffset(-1075);  // [ns] value to be updated
+    }
 
     stsconfig->SetMinAdcCut(1, 1);
     stsconfig->SetMinAdcCut(2, 1);
@@ -211,6 +217,9 @@ void run_unpack_tsa(std::vector<std::string> infile = {"test.tsa"}, UInt_t runid
     /// Enable Monitor plots
     //muchconfig->SetMonitor(GetMuchMonitor(outfilename, true));
     muchconfig->SetSystemTimeOffset(-2221);  // [ns] value to be updated
+    if (2160 <= runid) {
+      muchconfig->SetSystemTimeOffset(-1020);  // [ns] value to be updated
+    }
 
     // muchconfig->SetMinAdcCut(1, 1);
 
@@ -238,6 +247,9 @@ void run_unpack_tsa(std::vector<std::string> infile = {"test.tsa"}, UInt_t runid
     // Get the spadic configuration true = avg baseline active / false plain sample 0
     trd1Dconfig->SetSpadicObject(GetTrdSpadic(true));
     trd1Dconfig->SetSystemTimeOffset(0);  // [ns] value to be updated
+    if (2160 <= runid) {
+      trd1Dconfig->SetSystemTimeOffset(1140);  // [ns] value to be updated
+    }
   }
   // -------------
 
@@ -263,6 +275,9 @@ void run_unpack_tsa(std::vector<std::string> infile = {"test.tsa"}, UInt_t runid
     std::string parfilesbasepathTrdfasp2d = Form("%s/parameters/trd", srcDir.Data());
     trdfasp2dconfig->SetParFilesBasePath(parfilesbasepathTrdfasp2d);
     trdfasp2dconfig->SetSystemTimeOffset(-1800);  // [ns] value to be updated
+    if (2160 <= runid) {
+      trdfasp2dconfig->SetSystemTimeOffset(-680);  // [ns] value to be updated
+    }
     // trdfasp2dconfig->SetMonitor(dynamic_pointer_cast<CbmTrdUnpackFaspMonitor>(GetTrdMonitor(outfilename, 1)));
   }
   // -------------
@@ -282,6 +297,9 @@ void run_unpack_tsa(std::vector<std::string> infile = {"test.tsa"}, UInt_t runid
     }
     tofconfig->SetParFilesBasePath(parfilesbasepathTof);
     tofconfig->SetSystemTimeOffset(-1220);  // [ns] value to be updated
+    if (2160 <= runid) {
+      tofconfig->SetSystemTimeOffset(0);  // [ns] value to be updated
+    }
     if (runid <= 1659) {
       /// Switch ON the -4 offset in epoch count (hack for Spring-Summer 2021)
       tofconfig->SetFlagEpochCountHack2021();
@@ -303,6 +321,9 @@ void run_unpack_tsa(std::vector<std::string> infile = {"test.tsa"}, UInt_t runid
     bmonconfig->SetParFilesBasePath(parfilesbasepathBmon);
     bmonconfig->SetParFileName("mBmonCriPar.par");
     bmonconfig->SetSystemTimeOffset(-1220);  // [ns] value to be updated
+    if (2160 <= runid) {
+      bmonconfig->SetSystemTimeOffset(-80);  // [ns] value to be updated
+    }
     /// Enable Monitor plots
     // bmonconfig->SetMonitor(GetTofMonitor(outfilename, true));
   }