From 482bd4ad84f0a4f3e05abd4da43f00c62b21ab4f Mon Sep 17 00:00:00 2001
From: "Adrian A. Weber" <adrian.a.weber@physik.uni-giessen.de>
Date: Wed, 22 Dec 2021 20:01:21 +0000
Subject: [PATCH] corrected handling of subtriggers and MsDescriptor idx in
 RICH Unpacker 2022.

---
 .../rich/unpack/CbmRichUnpackAlgo2022.cxx     | 78 ++++++++-----------
 .../rich/unpack/CbmRichUnpackAlgo2022.h       | 14 +---
 2 files changed, 33 insertions(+), 59 deletions(-)

diff --git a/reco/detectors/rich/unpack/CbmRichUnpackAlgo2022.cxx b/reco/detectors/rich/unpack/CbmRichUnpackAlgo2022.cxx
index 2b91a3a958..bc61e93105 100644
--- a/reco/detectors/rich/unpack/CbmRichUnpackAlgo2022.cxx
+++ b/reco/detectors/rich/unpack/CbmRichUnpackAlgo2022.cxx
@@ -24,13 +24,16 @@ bool CbmRichUnpackAlgo2022::unpack(const fles::Timeslice* ts, std::uint16_t icom
 
   const fles::MicrosliceView mv            = ts->get_microslice(icomp, imslice);
   const fles::MicrosliceDescriptor& msDesc = mv.desc();
-  //std::cout<< "startMS"<<std::endl;
+
+  // Clear CbmTime of MS. Used to get time offset of subtriggers to MS start
+  fCbmTimeMS = 0;
+
   CbmRichUnpackAlgoMicrosliceReader reader;
   reader.SetData(mv.content(), msDesc.size);
 
   auto mstime = msDesc.idx;
-  fMsRefTime  = mstime - fTsStartTime;
-  //std::cout<< fMsRefTime <<"  "<< fTsStartTime << std::endl;
+  fMsRefTime  = (mstime - fTsStartTime) * 25;  // msDesc.idx is in cnt, not in ns. (40MHz clk -> 25ns)
+
   // There are a lot of MS  with 8 bytes size
   // Does one need these MS?
   if (reader.GetSize() <= 8) return true;
@@ -70,6 +73,7 @@ void CbmRichUnpackAlgo2022::processHubBlock(CbmRichUnpackAlgoMicrosliceReader& r
   size_t counter      = 0;
   size_t totalSize    = 0;
   fCurrentSubSubEvent = 1;
+
   while (!isLast) {
     word                     = reader.NextWord();
     uint32_t subSubEventId   = word & 0xffff;                              // 16 bits
@@ -242,8 +246,18 @@ void CbmRichUnpackAlgo2022::processTrbPacket(CbmRichUnpackAlgoMicrosliceReader&
 {
   processCBMtime(reader);
   uint32_t trigNum_this = reader.NextWord() & 0xFFFFFF;
-  for (auto l = 0; l < 5; ++l)
-    reader.NextWord();
+  reader.NextWord();  // reserved
+
+  for (auto l = 0; l < 2; ++l) {
+    uint32_t wordEpoch = reader.NextWord();
+    //uint32_t epoch     = CbmRichUnpackAlgoTdcWordReader::ProcessEpoch(wordEpoch);
+    uint32_t wordTime = reader.NextWord();
+    //CbmRichUnpackAlgoTdcTimeData td;
+    //CbmRichUnpackAlgoTdcWordReader::ProcessTimeData(wordTime, td);
+
+    //if (l == 0) fCtsCh0_cur = calculateTime(epoch, td.fCoarse, td.fFine);
+    //if (l == 1) fCtsCh1_cur = calculateTime(epoch, td.fCoarse, td.fFine);
+  }
 
   //prev CBM time (64bit)
   uint32_t cbmtime0           = reader.NextWord();  // CBM 63:32
@@ -253,8 +267,7 @@ void CbmRichUnpackAlgo2022::processTrbPacket(CbmRichUnpackAlgoMicrosliceReader&
   uint32_t trigNum_prevMes = reader.NextWord() & 0xFFFFFF;
 
   reader.NextWord();  // reserved
-  //std::cout<<"trigNum:  "<<std::hex<< trigNum_this <<std::dec  << "    trigNum_prev:  " <<std::hex<< trigNum_prevMes <<std::dec<<std::endl;
-  //std::cout<<"CBM time: "<<std::hex<< fCbmTimePacket <<std::dec<< "    CBM time prev: " <<std::hex<< CbmTimePacket_prev <<std::dec<<std::endl;
+
   for (auto l = 0; l < 14; ++l) {
     uint32_t wordEpoch = reader.NextWord();
     uint32_t epoch     = CbmRichUnpackAlgoTdcWordReader::ProcessEpoch(wordEpoch);
@@ -271,8 +284,6 @@ void CbmRichUnpackAlgo2022::processTrbPacket(CbmRichUnpackAlgoMicrosliceReader&
     if (l == 1) fMbsPrevTimeCh1 = fullTime;
     if (l > 1) fPrevLastCh0ReTime[l - 1] = fullTime;
   }
-  //processMbs(reader, false);  // Current MBS
-  //processMbs(reader, true);   // Previous MBS
 
   uint32_t trbNum = reader.NextWord();  // TRB trigger number
   if (isLog()) LOG(debug4) << getLogHeader(reader) << "TRB Num:" << reader.GetWordAsHexString(trbNum);
@@ -284,39 +295,10 @@ void CbmRichUnpackAlgo2022::processCBMtime(CbmRichUnpackAlgoMicrosliceReader& re
 {
   uint32_t word_MSB = reader.NextWord();  // CBM 63:32
   uint32_t word_LSB = reader.NextWord();  // CBM 31: 0
-  //fCbmTimePacket = 0;
-  //fCbmTimePacket = (uint64_t) word_MSB<<32 | word_LSB;
-}
-
-void CbmRichUnpackAlgo2022::processMbs(CbmRichUnpackAlgoMicrosliceReader& reader, bool isPrev)
-{
-  uint32_t word     = reader.NextWord();
-  uint32_t mbsNum   = word & 0xffffff;      //24 bits
-  uint32_t nofCtsCh = (word >> 24) & 0xff;  // 8 bits
-  if (isLog())
-    LOG(debug4) << getLogHeader(reader) << "MBS mbsNum:0x" << std::hex << mbsNum << std::dec
-                << " nofCtsCh:" << nofCtsCh;
-
-  for (uint32_t i = 0; i < nofCtsCh; i++) {
-    uint32_t wordEpoch = reader.NextWord();
-    uint32_t epoch     = CbmRichUnpackAlgoTdcWordReader::ProcessEpoch(wordEpoch);
-    if (isLog()) LOG(debug4) << getLogHeader(reader) << "MBS ch:" << i << " epoch:" << epoch;
-
-    uint32_t wordTime = reader.NextWord();
-    CbmRichUnpackAlgoTdcTimeData td;
-    CbmRichUnpackAlgoTdcWordReader::ProcessTimeData(wordTime, td);
-    if (isLog()) LOG(debug4) << getLogHeader(reader) << "MBS ch:" << i << " " << td.ToString();
-
-    double fullTime = calculateTime(epoch, td.fCoarse, td.fFine);
 
-    if (isPrev && td.fChannel == 0) fMbsPrevTimeCh0 = fullTime;
-    if (isPrev && td.fChannel == 1) fMbsPrevTimeCh1 = fullTime;
-  }
-
-  double mbsCorr = fMbsPrevTimeCh1 - fMbsPrevTimeCh0;
-  if (isLog())
-    LOG(debug4) << getLogHeader(reader) << "MBS Prev ch1:" << std::setprecision(15) << fMbsPrevTimeCh1
-                << " ch0:" << fMbsPrevTimeCh0 << " corr:" << mbsCorr;
+  fCbmTimePacket = 0;
+  fCbmTimePacket = (uint64_t) word_MSB << 32 | word_LSB;
+  if (fCbmTimeMS == 0) fCbmTimeMS = fCbmTimePacket;
 }
 
 // ---- processTimeDataWord ----
@@ -339,17 +321,21 @@ void CbmRichUnpackAlgo2022::processTimeDataWord(CbmRichUnpackAlgoMicrosliceReade
     }
   }
   else {
-    double dT           = fullTime - fPrevLastCh0ReTime[fCurrentSubSubEvent];
-    double mbsCorr      = fMbsPrevTimeCh1 - fMbsPrevTimeCh0;
-    double fullTimeCorr = dT - mbsCorr;
+    double dT            = fullTime - fPrevLastCh0ReTime[fCurrentSubSubEvent];
+    double mbsCorr       = fMbsPrevTimeCh1 - fMbsPrevTimeCh0;
+    double subtrigOffset = (fCbmTimePacket - fCbmTimeMS) * 25.0;  // offset of SubTrigger to MS start in ns
+    double fullTimeCorr  = dT - mbsCorr + subtrigOffset;
 
-    // std::cout<< dT <<"  "
+    // if ((subSubEventId >> 12 ) == 0x7)
+    //   std::cout<< dT <<"  "
     //          << fullTimeCorr <<"  "<< std::setprecision(15)
     //          << fullTime <<"  "
     //          << fPrevLastCh0ReTime[fCurrentSubSubEvent] <<"  "
     //          << mbsCorr <<"  "
+    //          << subtrigOffset <<"  "
     //          << fCurrentSubSubEvent <<"  " <<std::hex
     //          << subSubEventId << std::dec <<std::endl;
+
     if (isLog())
       LOG(debug4) << getLogHeader(reader) << "SubSubEv[" << iTdc << "] " << td.ToString()
                   << " time:" << std::setprecision(15) << fullTime << " fullTimeCorr:" << fullTimeCorr;
@@ -398,8 +384,6 @@ void CbmRichUnpackAlgo2022::writeOutputDigi(Int_t fpgaID, Int_t channel, Double_
   Int_t pixelUID   = this->getPixelUID(fpgaID, channel);
   //check ordering
   Double_t finalTime = time + (Double_t) fMsRefTime - fSystemTimeOffset;
-  //printf("time: %.3f  %.3f %d\n",finalTime, time, fSystemTimeOffset);
-  //   Double_t finalTime = time - fSystemTimeOffset - fTsStartTime;
 
   fOutputVec.emplace_back(pixelUID, finalTime, tot - ToTcorr);
 }
diff --git a/reco/detectors/rich/unpack/CbmRichUnpackAlgo2022.h b/reco/detectors/rich/unpack/CbmRichUnpackAlgo2022.h
index 7eaaa8ef7e..bc2483e3f3 100644
--- a/reco/detectors/rich/unpack/CbmRichUnpackAlgo2022.h
+++ b/reco/detectors/rich/unpack/CbmRichUnpackAlgo2022.h
@@ -57,8 +57,6 @@ protected:
 
   void processTrbPacket(CbmRichUnpackAlgoMicrosliceReader& reader);
 
-  void processMbs(CbmRichUnpackAlgoMicrosliceReader& reader, bool isPrev);
-
   void processHubBlock(CbmRichUnpackAlgoMicrosliceReader& reader);
 
   void processCtsSubSubEvent(CbmRichUnpackAlgoMicrosliceReader& reader, uint32_t subSubEventSize,
@@ -93,23 +91,15 @@ protected:
   /** @brief Parameters for the unpacking */
   //CbmMcbm2018RichPar fUnpackPar;
 
-  //std::vector<Int_t>* fMaskedDiRICHes = nullptr;
-
   double fMbsPrevTimeCh0 = 0.;
   double fMbsPrevTimeCh1 = 0.;
 
-  //size_t fMsRefTime = 0;
-
-  //double fToTMin = -20.;
-  //double fToTMax = 100.;
-
-  //uint64_t fCbmTimePacket = 0;
+  uint64_t fCbmTimeMS;
+  uint64_t fCbmTimePacket;
 
   double fPrevLastCh0ReTime[13];  // 12 DiRICHes chnl0 + 1 CTS chnl0
   int fCurrentSubSubEvent = 0;
 
-  //Bool_t fbDoToTCorr = true;  // kTRUE activates ToT correction from Parameterfile
-
 private:
   ClassDef(CbmRichUnpackAlgo2022, 2)
 };
-- 
GitLab