diff --git a/core/detectors/trd/CbmTrdParModAsic.cxx b/core/detectors/trd/CbmTrdParModAsic.cxx index 0834aa8b16772434e7a347b6f24f129dd05a66c5..ee911680b48a8bde645f0f4a227482c84c6e2dcc 100644 --- a/core/detectors/trd/CbmTrdParModAsic.cxx +++ b/core/detectors/trd/CbmTrdParModAsic.cxx @@ -17,7 +17,7 @@ #include <TGenericClassInfo.h> // for TGenericClassInfo #include <TObjArray.h> #include <TObjString.h> -#include <TString.h> // for Form +#include <TString.h> // for Form #include <TSystem.h> #include <utility> // for pair @@ -39,7 +39,8 @@ CbmTrdParModAsic::CbmTrdParModAsic(const char* name, const char* title) //_______________________________________________________________________________ void CbmTrdParModAsic::clear() { - for(auto asic : fModPar) delete asic.second; + for (auto asic : fModPar) + delete asic.second; fModPar.clear(); } @@ -62,7 +63,8 @@ void CbmTrdParModAsic::GetAsicAddresses(std::vector<Int_t>* a) const /** Query the ASICs in the module set for their addresses. * Returns the list of these addresses in the vector prepared by the user */ - for (auto asic : fModPar) a->push_back(asic.first); + for (auto asic : fModPar) + a->push_back(asic.first); } //_______________________________________________________________________________ @@ -83,18 +85,12 @@ CbmTrdParAsic* CbmTrdParModAsic::GetAsicPar(Int_t address) int CbmTrdParModAsic::GetNofAsics() const { switch (fType) { - case 1: - return 80; - case 3: - return 20; - case 5: - return 180; - case 7: - return 36; - case 8: - return 24; - case 9: - return 180; + case 1: return 80; + case 3: return 20; + case 5: return 180; + case 7: return 36; + case 8: return 24; + case 9: return 180; default: LOG(warn) << GetName() << "::GetNofAsics : The chamber type " << fType << " has no mapping to ASICs. Skip."; } @@ -109,22 +105,32 @@ CbmTrdDigi::eCbmTrdAsicType CbmTrdParModAsic::GetAsicType() const case 3: case 5: case 7: - case 8: - return CbmTrdDigi::eCbmTrdAsicType::kSPADIC; - case 9: - return CbmTrdDigi::eCbmTrdAsicType::kFASP; + case 8: return CbmTrdDigi::eCbmTrdAsicType::kSPADIC; + case 9: return CbmTrdDigi::eCbmTrdAsicType::kFASP; default: LOG(warn) << GetName() << "::GetAsicType : The chamber type " << fType << " has no mapping to ASICs. Skip."; } return CbmTrdDigi::eCbmTrdAsicType::kNTypes; } +//_______________________________________________________________________________ +int CbmTrdParModAsic::HasEqId(uint16_t eq) const +{ + int idx(0); + for (auto add : fCrobAdd) { + if (add == eq) return idx; + idx++; + } + return -1; +} + //_______________________________________________________________________________ void CbmTrdParModAsic::Print(Option_t* opt) const { printf(" %s Asics[%d]\n", GetName(), GetNofAsics()); if (strcmp(opt, "all") == 0) { - for (auto asic : fModPar) asic.second->Print(opt); + for (auto asic : fModPar) + asic.second->Print(opt); } } @@ -148,11 +154,10 @@ void CbmTrdParModAsic::SetCrobAddresses(int* addresses) case 3: case 5: case 7: - case 8: - fCrobAdd[0] = addresses[0]; - break; + case 8: fCrobAdd.push_back(addresses[0]); break; case 9: - for (int i(0); i < NCROBMOD; i++) fCrobAdd[i] = addresses[i]; + for (int i(0); i < NCROBMOD; i++) + fCrobAdd.push_back(addresses[i]); break; default: LOG(warn) << GetName() << "::SetCrobAddresses : The chamber type " << fType << " has no mapping to CROBs. Skip."; diff --git a/core/detectors/trd/CbmTrdParModAsic.h b/core/detectors/trd/CbmTrdParModAsic.h index 7a8e2cf5ea0ac602973ec059908a2c2f2ac065fd..68e8574476afbcfdc96b5246a7ca31507d94b25f 100644 --- a/core/detectors/trd/CbmTrdParModAsic.h +++ b/core/detectors/trd/CbmTrdParModAsic.h @@ -27,13 +27,14 @@ class FairParamList; * - chAddress : identify the read-out pad(s) connected to the ASIC. In the case of FASP it distinguish between R and T pairing **/ class CbmTrdParModAsic : public CbmTrdParMod { -friend class CbmTrdParSetAsic; + friend class CbmTrdParSetAsic; + public: /** Standard constructor **/ CbmTrdParModAsic(const char* name = "CbmTrdParModAsic", const char* title = "Generic list of ASICs for TRD modules"); /** \brief Destructor **/ - virtual ~CbmTrdParModAsic() { clear();} + virtual ~CbmTrdParModAsic() { clear(); } /** \brief Reset all parameters **/ virtual void clear(); @@ -71,6 +72,11 @@ public: /** \brief Query the type of chamber*/ virtual const int* GetCrobAddresses() const { return fCrobAdd.data(); } + /** \brief Query the existence of an equipment (CROB) by HW id on the current module params. + * \return Returns the position of the equipment (CROB) on the current module; -1 in case of failure. + */ + virtual int HasEqId(uint16_t eqid) const; + /** \brief Returns the number of INSTALLED ASICs for the current module * It applies to the list of ASICs. */ diff --git a/core/detectors/trd/CbmTrdParSetAsic.cxx b/core/detectors/trd/CbmTrdParSetAsic.cxx index 5eef369005e3b8ed54f018206d46858b6d75e29b..fc328b4145adba20221631848469e9e5670967ce 100644 --- a/core/detectors/trd/CbmTrdParSetAsic.cxx +++ b/core/detectors/trd/CbmTrdParSetAsic.cxx @@ -34,6 +34,18 @@ CbmTrdParSetAsic::CbmTrdParSetAsic(const char* name, const char* title, const ch { } +//_______________________________________________________________________________ +int CbmTrdParSetAsic::FindModuleByEqId(uint16_t eqid, uint8_t& crob_id) const +{ + for (auto mod : fModuleMap) { + int crob = ((const CbmTrdParModAsic*) mod.second)->HasEqId(eqid); + if (crob < 0) continue; + crob_id = crob; + return mod.first; + } + return -1; +} + //_______________________________________________________________________________ Bool_t CbmTrdParSetAsic::getParams(FairParamList* l) { @@ -58,16 +70,17 @@ Bool_t CbmTrdParSetAsic::getParams(FairParamList* l) for (Int_t i = 0; i < fNrOfModules; i++) { mod = new CbmTrdParModAsic(GetName(), Form("%s for Module %d", GetTitle(), moduleId[i])); mod->SetChamberType(typeAsic[i]); + mod->SetModuleId(moduleId[i]); // only for FASP if (9 == typeAsic[i]) { - TArrayI crobAddress(NCROBMOD); + TArrayI crobAddress(int(NCROBMOD)); if (!l->fill(Form("CrobInfo - Module %d", moduleId[i]), &crobAddress)) continue; mod->SetCrobAddresses(crobAddress.GetArray()); - Int_t maxValues = maxNrAsics * (NFASPPARS); + Int_t maxValues = maxNrAsics * int(NFASPPARS); TArrayI values(maxValues); if (!l->fill(Form("FaspInfo - Module %d", moduleId[i]), &values)) continue; for (Int_t iasic = 0; iasic < nAsic[i]; iasic++) { - Int_t offset = iasic * (NFASPPARS); + Int_t offset = iasic * int(NFASPPARS); address = values[offset++]; if (address == moduleId[i] * 1000 + 999) continue; asic = new CbmTrdParFasp(address); @@ -159,15 +172,15 @@ void CbmTrdParSetAsic::putParams(FairParamList* l) l->add(Form("SpadicInfo - Module %d", mapEntry.first), asicInfo); } if (mod->GetAsicType() == CbmTrdDigi::eCbmTrdAsicType::kFASP) { - TArrayI crobAddress(NCROBMOD); - crobAddress.Set(NCROBMOD, mod->GetCrobAddresses()); + TArrayI crobAddress(int(NCROBMOD)); + crobAddress.Set(int(NCROBMOD), mod->GetCrobAddresses()); l->add(Form("CrobInfo - Module %d", mapEntry.first), crobAddress); - Int_t fullSize = nAsic[idx] * NFASPPARS; + int fullSize = nAsic[idx] * int(NFASPPARS); TArrayI asicInfo(fullSize); iAsicNr = 0; for (auto iModuleIt : mod->fModPar) { - int offset = iAsicNr * NFASPPARS; + int offset = iAsicNr * int(NFASPPARS); asicInfo[offset++] = iModuleIt.first; CbmTrdParFasp* fasp = (CbmTrdParFasp*) iModuleIt.second; diff --git a/core/detectors/trd/CbmTrdParSetAsic.h b/core/detectors/trd/CbmTrdParSetAsic.h index b433124b00f04a047372399ac7e77806a8342a84..ca6d12e760c50feba3bf111313eeb108e297bc6d 100644 --- a/core/detectors/trd/CbmTrdParSetAsic.h +++ b/core/detectors/trd/CbmTrdParSetAsic.h @@ -37,6 +37,12 @@ public: /** \brief Reset all parameters **/ virtual void clear() { ; } + /** \brief Search for the module in the setup parameters by equipement id + * \param[in] eqid equipment id from HW + * \param[out] crob_id index of crob on the module + * \return module id in the setup + */ + virtual int FindModuleByEqId(uint16_t eqid, uint8_t& crob_id) const; /** \brief Build the ASICs par for the current module from the info stored in the param file * It applies to the list of ASICs. * \param module ASICs par (FASP or SPADIC) diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx index c0ba18bc928ac359919904a2ca57f968dc27b0aa..5e30aabea8fcd8c648bffc7f5bdd5215c402ec80 100644 --- a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx +++ b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.cxx @@ -52,27 +52,21 @@ CbmTrdUnpackFaspAlgo::~CbmTrdUnpackFaspAlgo() {} //_________________________________________________________________________________ Bool_t CbmTrdUnpackFaspAlgo::initParSet(FairParGenericSet* parset) { - Int_t nModules(0); + Int_t nModules(0), nAsics(0); if (strcmp(parset->ClassName(), "CbmTrdParSetAsic") == 0) { CbmTrdParSetAsic* setPar = static_cast<CbmTrdParSetAsic*>(parset); for (auto did : fModuleId) { - auto setDet = static_cast<const CbmTrdParModAsic*>(setPar->GetModulePar(did)); + auto setDet = static_cast<CbmTrdParModAsic*>(setPar->GetModulePar(did)); if (!setDet) continue; if (setDet->GetAsicType() != CbmTrdDigi::eCbmTrdAsicType::kFASP) continue; if (fMonitor) fMonitor->addParam(did, setDet); + fAsicSet.addParam(setDet); + nAsics += setDet->GetNofAsicsOnModule(); nModules++; - std::vector<Int_t> a; - setDet->GetAsicAddresses(&a); - for (auto add : a) { - CbmTrdParAsic* asic = (CbmTrdParAsic*) setDet->GetAsicPar(add); - if (asic->IsA() == CbmTrdParSpadic::Class()) continue; - fAsicSet.addParam(asic); - if (VERBOSE > 2) asic->Print(); - } } - // setPar->printParams(); + // fAsicSet.printParams(); LOG(info) << GetName() << "::initParSet - for container " << parset->ClassName() << " modules " << nModules - << " asics " << fAsicSet.GetNrOfModules(); + << " asics " << nAsics; } else if (strcmp(parset->ClassName(), "CbmTrdParSetDigi") == 0) { fDigiSet = static_cast<CbmTrdParSetDigi*>(parset); @@ -128,21 +122,6 @@ CbmTrdUnpackFaspAlgo::GetParContainerRequest(std::string geoTag, std::uint32_t r return &fParContVec; } -//_________________________________________________________________________________ -void CbmTrdUnpackFaspAlgo::SetCrobMapping(const std::map<uint32_t, uint16_t[NCROBMOD]>& map) -{ - if (fCompMap) delete fCompMap; - fCompMap = new std::map<uint16_t, std::pair<uint16_t, uint16_t>>; /// map eq_id -> (mod_id, crob_id) - - for (auto& entry : map) { - uint16_t mod_id = entry.first; - for (uint8_t crob_id = 0; crob_id < NCROBMOD; crob_id++) { - uint16_t eq_id = entry.second[crob_id]; - (*fCompMap)[eq_id] = std::make_pair(mod_id, crob_id); - } - } -} - //_________________________________________________________________________________ CbmTrdUnpackFaspAlgo::CbmTrdFaspMessageType CbmTrdUnpackFaspAlgo::mess_type(uint32_t wd) { @@ -304,8 +283,8 @@ uint32_t CbmTrdUnpackFaspAlgo::ResetTimeslice() for (auto pad_id(0); pad_id < NFASPMOD * NFASPCH; pad_id++) { if (!fDigiBuffer[pad_id].size()) continue; - LOG(warn) << fName << "::ResetTimeslice - buffered digi @ CROB=" << fCrob << " / pad=" << pad_id << " store " - << fDigiBuffer[pad_id].size() << " unprocessed digi."; + LOG(warn) << fName << "::ResetTimeslice - buffered digi pad=" << pad_id << " store " << fDigiBuffer[pad_id].size() + << " unprocessed digi."; uNbLostDigis += fDigiBuffer[pad_id].size(); fDigiBuffer[pad_id].clear(); @@ -337,11 +316,9 @@ void CbmTrdUnpackFaspAlgo::FinalizeComponent() // clear digi buffer wrt the digi which was forwarded to higher structures fDigiBuffer[ipad].clear(); if (nIncomplete > 2) { - LOG(warn) << fName << "FinalizeComponent(" << fCrob << ") skip " << nIncomplete << " incomplete digi at pad " - << ipad << ".\n"; + LOG(warn) << fName << "FinalizeComponent() skip " << nIncomplete << " incomplete digi at pad " << ipad << ".\n"; } } - fCrob = 0xffff; // reset current crob id } // ----unpack---- @@ -362,16 +339,9 @@ bool CbmTrdUnpackFaspAlgo::unpack(const fles::Timeslice* ts, std::uint16_t icomp fTime = ULong64_t((msdesc.idx - fTsStartTime - fSystemTimeOffset) / 12.5); // get MOD_id and CROB id from the equipment, using the comp map: eq_id -> (mod_id, crob_id) + uint8_t crob_id(0); const uint16_t eq_id = msdesc.eq_id; - const auto it = fCompMap->find(eq_id); - if (it == fCompMap->end() || std::find(fModuleId.begin(), fModuleId.end(), it->second.first) == fModuleId.end()) { - LOG(error) << GetName() << "::unpack - CROB eq_id=" << eq_id << " not registered in the unpacker."; - return false; - } - const uint16_t mod_id = (*fCompMap)[eq_id].first; - const uint8_t crob_id = (*fCompMap)[eq_id].second; - - if (fCrob == 0xffff) fCrob = icomp; + uint16_t mod_id = fAsicSet.FindModuleByEqId(eq_id, crob_id); // Get the µslice size in bytes to calculate the number of completed words auto mssize = msdesc.size; diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h index cb05bb7e4a1739787284b25f53b533ed1701af37..bbabbe278bfcf8e5fdcfcb82b48079b98f5da986 100644 --- a/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h +++ b/reco/detectors/trd/unpack/CbmTrdUnpackFaspAlgo.h @@ -113,9 +113,6 @@ public: */ virtual std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>* GetParContainerRequest(std::string geoTag, std::uint32_t runId); - - /** @brief Initialize CROB mapping for all modules*/ - void SetCrobMapping(const std::map<uint32_t, uint16_t[NCROBMOD]>& map); /** @brief Set a predefined monitor * @param monitor predefined unpacking monitor */ void SetMonitor(std::shared_ptr<CbmTrdUnpackFaspMonitor> monitor) { fMonitor = monitor; } @@ -205,7 +202,6 @@ private: {}}; ///> Buffered digi for each pad in CROB component /** @brief Potential (online) monitor for the unpacking process */ std::shared_ptr<CbmTrdUnpackFaspMonitor> fMonitor = nullptr; - uint16_t fCrob = 0xffff; //! current crob being processed std::vector<uint16_t> fModuleId = {}; ///> list of modules for which there is are calibration parameters CbmTrdParSetAsic fAsicSet; CbmTrdParSetDigi* fDigiSet = nullptr; diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackFaspConfig.cxx b/reco/detectors/trd/unpack/CbmTrdUnpackFaspConfig.cxx index 61bee84553d6bd20df492f35e8e87d3b9a59dd89..c551a3cac62f31d0b08ff13d96401b0a437512df 100644 --- a/reco/detectors/trd/unpack/CbmTrdUnpackFaspConfig.cxx +++ b/reco/detectors/trd/unpack/CbmTrdUnpackFaspConfig.cxx @@ -42,7 +42,6 @@ void CbmTrdUnpackFaspConfig::reset() void CbmTrdUnpackFaspConfig::InitAlgo() { if (fDoLog) LOG(info) << fName << "::InitAlgo - Setup Fasp mapping"; - fAlgo->SetCrobMapping(fCrobMap); // If we have a monitor in the config add it to the algo if (fMonitor) fAlgo->SetMonitor(fMonitor); @@ -58,10 +57,4 @@ void CbmTrdUnpackFaspConfig::InitAlgo() } } -//_____________________________________________________________________ -void CbmTrdUnpackFaspConfig::SetCrobMapping(int modAddress, uint16_t crobMap[NCROBMOD]) -{ - memcpy(fCrobMap[modAddress], crobMap, NCROBMOD * sizeof(uint16_t)); -} - ClassImp(CbmTrdUnpackFaspConfig) diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackFaspConfig.h b/reco/detectors/trd/unpack/CbmTrdUnpackFaspConfig.h index c113962944bd3eac06ce00518994d99f1e11f7e6..47d8c0ed1e4efadc47175c575a7f4141dc951d9c 100644 --- a/reco/detectors/trd/unpack/CbmTrdUnpackFaspConfig.h +++ b/reco/detectors/trd/unpack/CbmTrdUnpackFaspConfig.h @@ -64,12 +64,6 @@ public: /** @brief Initialize the algorithm, include all calibration for Trd FASP.*/ void InitAlgo(); - /** @brief define crob id mapping for each module - * @param modAddress module address according to geometry - * @param crobMap mapped ids of CROBs eq_id for module - */ - void SetCrobMapping(int modAddress, uint16_t crobMap[NFASPMOD]); - /** @brief Add a monitor to the unpacker. * @param value CbmTrdUnpackFaspMonitor */ void SetMonitor(std::shared_ptr<CbmTrdUnpackFaspMonitor> value) { fMonitor = value; } @@ -86,7 +80,6 @@ protected: virtual void reset(); private: - std::map<uint32_t, uint16_t[NCROBMOD]> fCrobMap; ///> Module address to CROB id mapping /** @brief pointer to the monitor object */ std::shared_ptr<CbmTrdUnpackFaspMonitor> fMonitor = nullptr;