diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx index c299bcfab4587a0b886ad942cf820feab6c5ab85..a36cc09809adf9e88293e07f2dc182c6d2f546d1 100644 --- a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx +++ b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx @@ -51,7 +51,6 @@ CbmTrdUnpackFaspAlgo::~CbmTrdUnpackFaspAlgo() {} //_________________________________________________________________________________ Bool_t CbmTrdUnpackFaspAlgo::initParSet(FairParGenericSet* parset) { - FairParamList parList; Int_t nModules(0); if (strcmp(parset->ClassName(), "CbmTrdParSetAsic") == 0) { CbmTrdParSetAsic* setPar = static_cast<CbmTrdParSetAsic*>(parset); @@ -229,20 +228,20 @@ void CbmTrdUnpackFaspAlgo::mess_prt(CbmTrdFaspMessage* mess) } //_________________________________________________________________________________ -bool CbmTrdUnpackFaspAlgo::pushDigis(std::vector<CbmTrdUnpackFaspAlgo::CbmTrdFaspMessage> messes) +bool CbmTrdUnpackFaspAlgo::pushDigis(std::vector<CbmTrdUnpackFaspAlgo::CbmTrdFaspMessage> messes, const uint16_t mod_id) { const UChar_t lFasp = messes[0].fasp; - const CbmTrdParFasp* faspPar = (CbmTrdParFasp*) fAsicPar.GetAsicPar(fMod * 1000 + lFasp); - const CbmTrdParModDigi* digiPar = (CbmTrdParModDigi*) fDigiSet->GetModulePar(fMod); + const CbmTrdParFasp* faspPar = (CbmTrdParFasp*) fAsicPar.GetAsicPar(mod_id * 1000 + lFasp); + const CbmTrdParModDigi* digiPar = (CbmTrdParModDigi*) fDigiSet->GetModulePar(mod_id); // link data to the position on the padplane if (!faspPar) { - LOG(error) << GetName() << "::pushDigis - Par for FASP " << (int) lFasp << " in module " << fMod + LOG(error) << GetName() << "::pushDigis - Par for FASP " << (int) lFasp << " in module " << mod_id << " missing. Skip."; return false; } if (!digiPar) { - LOG(error) << GetName() << "::pushDigis - DIGI par for module " << fMod << " missing. Skip."; + LOG(error) << GetName() << "::pushDigis - DIGI par for module " << mod_id << " missing. Skip."; return false; } @@ -271,7 +270,7 @@ bool CbmTrdUnpackFaspAlgo::pushDigis(std::vector<CbmTrdUnpackFaspAlgo::CbmTrdFas if (digiBuffer.size() == 0) { // init pad position in map and build digi for message digiBuffer.emplace_back(pad, lchT, lchR, lTime); - digiBuffer.back().SetAddressModule(fMod); + digiBuffer.back().SetAddressModule(mod_id); continue; } @@ -299,7 +298,7 @@ bool CbmTrdUnpackFaspAlgo::pushDigis(std::vector<CbmTrdUnpackFaspAlgo::CbmTrdFas // build digi for message when update failed if (!use) { digiBuffer.emplace_back(pad, lchT, lchR, lTime); - digiBuffer.back().SetAddressModule(fMod); + digiBuffer.back().SetAddressModule(mod_id); id = digiBuffer.rbegin(); } @@ -396,12 +395,9 @@ bool CbmTrdUnpackFaspAlgo::unpack(const fles::Timeslice* ts, std::uint16_t icomp LOG(error) << GetName() << "::unpack - CROB eq_id=" << eq_id << " not registered in the unpacker."; return false; } - fMod = (*fCompMap)[eq_id].first; + const uint16_t mod_id = (*fCompMap)[eq_id].first; const uint8_t crob_id = (*fCompMap)[eq_id].second; - - ///////// To do: Make fMod a local variable - if (fCrob == 0xffff) fCrob = icomp; // Get the µslice size in bytes to calculate the number of completed words @@ -441,7 +437,7 @@ bool CbmTrdUnpackFaspAlgo::unpack(const fles::Timeslice* ts, std::uint16_t icomp if (isaux) { if (!ch_id) { // clear buffer - if (vMess.size()) { pushDigis(vMess); } + if (vMess.size()) { pushDigis(vMess, mod_id); } vMess.clear(); if (VERBOSE) @@ -454,30 +450,30 @@ bool CbmTrdUnpackFaspAlgo::unpack(const fles::Timeslice* ts, std::uint16_t icomp else if (ch_id == 1) { if (VERBOSE) cout << boost::format(" PAUSE: fasp_id=%02d\n") % static_cast<unsigned int>(fasp_id); } + continue; } - else { - if (fFaspMap) fasp_id = ((*fFaspMap)[fMod])[fasp_id]; - if (lFaspOld != fasp_id) { - // push - if (vMess.size()) { pushDigis(vMess); } - vMess.clear(); - lFaspOld = fasp_id; - } - if (data & 0x1) { - LOG(warn) << GetName() << "::unpack - Data corrupted : detect end bit set."; - continue; - } - if (VERBOSE) - cout << boost::format(" DD : fasp_id=%02d ch_id=%02d slice=%03d data=%4d\n") - % static_cast<unsigned int>(fasp_id) % static_cast<unsigned int>(ch_id) - % static_cast<unsigned int>(slice) % static_cast<unsigned int>(data >> 1); - if (data & 0x2000) { - LOG(debug) << GetName() << "::unpack - Self-triggered data."; - data &= 0x1fff; - } - vMess.emplace_back(ch_id, kData, slice, data >> 1, crob_id, lFaspOld); + if (fFaspMap) fasp_id = ((*fFaspMap)[mod_id])[fasp_id]; + + if (lFaspOld != fasp_id) { + // push + if (vMess.size()) { pushDigis(vMess, mod_id); } + vMess.clear(); + lFaspOld = fasp_id; + } + if (data & 0x1) { + LOG(warn) << GetName() << "::unpack - Data corrupted : detect end bit set."; + continue; + } + if (VERBOSE) + cout << boost::format(" DD : fasp_id=%02d ch_id=%02d slice=%03d data=%4d\n") + % static_cast<unsigned int>(fasp_id) % static_cast<unsigned int>(ch_id) + % static_cast<unsigned int>(slice) % static_cast<unsigned int>(data >> 1); + if (data & 0x2000) { + LOG(debug) << GetName() << "::unpack - Self-triggered data."; + data &= 0x1fff; } + vMess.emplace_back(ch_id, kData, slice, data >> 1, crob_id, lFaspOld); //prt_wd(*wd); } return unpackOk; diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h index bbd864af5dda4db06d10371ef40d5332b8f284f6..7ace5f14057be0429ca8e6f1a275c0fb199e7079 100644 --- a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h +++ b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h @@ -134,7 +134,7 @@ protected: void mess_readEW(uint32_t wd, CbmTrdFaspMessage* mess); /** @brief Print FASP message */ void mess_prt(CbmTrdFaspMessage* mess); - bool pushDigis(std::vector<CbmTrdUnpackFaspAlgo::CbmTrdFaspMessage> messages); + bool pushDigis(std::vector<CbmTrdUnpackFaspAlgo::CbmTrdFaspMessage> messages, const uint16_t mod_id); /** @brief Time offset for digi wrt the TS start, expressed in 80 MHz clks. It contains: * - relative offset of the MS wrt the TS * - FASP epoch offset for current CROB @@ -209,7 +209,6 @@ private: /** @brief Potential (online) monitor for the unpacking process */ std::shared_ptr<CbmTrdUnpackFaspMonitor> fMonitor = nullptr; uint16_t fCrob = 0xffff; //! current crob being processed - uint16_t fMod = 0xffff; //! current module being processed std::vector<uint16_t> fModuleId = {}; ///> list of modules for which there is are calibration parameters CbmTrdParSetAsic fAsicPar; CbmTrdParSetDigi* fDigiSet = nullptr;