diff --git a/algo/detectors/much/MuchReadoutConfig.cxx b/algo/detectors/much/MuchReadoutConfig.cxx index 08336576d88166e472b0709efc56eb8104c7701f..3bbf3f42b5a51790699d5257f98fd628f404f5d2 100644 --- a/algo/detectors/much/MuchReadoutConfig.cxx +++ b/algo/detectors/much/MuchReadoutConfig.cxx @@ -105,10 +105,15 @@ void MuchReadoutConfig::putParams(FairParamList* l) for (uint16_t crob = 0; crob < numCrobPerComp; crob++) { for (uint16_t elink = 0; elink < numElinksPerCrob; elink++) { fReadoutMap[equipment][elink].resize(numChanPerAsic); - for (uint16_t channel = 0; channel < numChanPerAsic; channel++) { + uint16_t elinkId = numElinksPerCrob * crob + elink; // elink within component + uint32_t febInCrob = elink2Feb[elinkId]; // FEB within CROB + uint32_t feb = comp * GetFebsPerComp() + febInCrob; // global FEB index + int32_t febId = GetFebId(feb); // FEB Id in MUCH addressing scheme - fReadoutMap[equipment][elink][channel] = 0; + for (uint16_t chanInAsic = 0; chanInAsic < numChanPerAsic; chanInAsic++) { + uint32_t channel = chanInAsic + numChanPerAsic * (feb % kuNbAsicsPerFeb); + fReadoutMap[equipment][elink][channel] = CreateMuchAddress(comp, febId, channel); } //# channel } //# elink } //# CROB @@ -230,20 +235,6 @@ void MuchReadoutConfig::putParams(FairParamList* l) return address; } - - // ------------------------------------------------------------------------- - /* - int16_t MuchReadoutConfig::ElinkIdxToFebIdx(uint16_t uElink) - { - if (uElink < numElinksPerCrob) return kiCrobMapElinkFebIdx[uElink]; - else { - LOG(warning) << "MuchReadoutConfig::ElinkIdxToFebIdx => Index out of bound, " - << "Elink is " << uElink << " returning crazy value!"; - return -1; - } - } - */ - bool MuchReadoutConfig::IsCrobActive(uint16_t uDpbIdx, uint16_t uCrobIdx) { if (uDpbIdx < numComp) { diff --git a/algo/detectors/much/MuchReadoutConfig.h b/algo/detectors/much/MuchReadoutConfig.h index 50f309fd6b0c97c10a91306da4f99f22547c45a2..72dd97f9904ce83465d323e1e4565f868f4114b4 100644 --- a/algo/detectors/much/MuchReadoutConfig.h +++ b/algo/detectors/much/MuchReadoutConfig.h @@ -44,6 +44,7 @@ namespace cbm::algo */ std::vector<uint32_t> Map(uint16_t equipId, uint16_t elink); + uint16_t GetFebsPerComp() { return numCrobPerComp * kuNbFebsPerCrob; } uint16_t GetNrOfCrobs() { return numComp * numCrobPerComp; } uint16_t GetNrOfFebs() { return GetNrOfCrobs() * kuNbFebsPerCrob; } uint16_t GetNrOfFebsInGemA() { return fuFebsInGemA; } diff --git a/algo/detectors/much/UnpackMuch.cxx b/algo/detectors/much/UnpackMuch.cxx index 9f0937facc365059b63e8da4ff0bfe8e3809fe51..6fe439a9f6513fd010cd96a7ea32bdcfe45ababb 100644 --- a/algo/detectors/much/UnpackMuch.cxx +++ b/algo/detectors/much/UnpackMuch.cxx @@ -95,7 +95,6 @@ namespace cbm::algo inline void UnpackMuch::ProcessHitMessage(const stsxyter::Message& message, vector<CbmMuchDigi>& digiVec, UnpackMuchMonitorData& monitor) const { - /* STS version // --- Check eLink and get parameters uint16_t elink = message.GetLinkIndexHitBinning(); if (elink >= fParams.fElinkParams.size()) { @@ -103,18 +102,9 @@ namespace cbm::algo return; } const UnpackMuchElinkPar& elinkPar = fParams.fElinkParams.at(elink); - uint32_t asicNr = elinkPar.fAsicNr; - - // --- Hardware-to-software address - uint32_t numChansPerModule = fParams.fNumAsicsPerModule * fParams.fNumChansPerAsic; - uint32_t address = elinkPar.fAddress; - uint32_t channel = 0; - if (asicNr < fParams.fNumAsicsPerModule / 2) { // front side (n side) - channel = message.GetHitChannel() + fParams.fNumChansPerAsic * asicNr; - } - else { // back side (p side) - channel = numChansPerModule - message.GetHitChannel() + 1; - } + + uint16_t channel = message.GetHitChannel(); + uint32_t address = (elinkPar.fAddress)[channel]; // --- Expand time stamp to time within timeslice (in clock cycle) uint64_t messageTime = message.GetHitTimeBinning() + fCurrentEpochTime; @@ -124,14 +114,12 @@ namespace cbm::algo // --- Correct ASIC-wise offsets messageTime -= elinkPar.fTimeOffset; - // --- TODO: Add walk correction (depends on ADC) // --- Charge - double charge = elinkPar.fAdcOffset + (message.GetHitAdc() - 1) * elinkPar.fAdcGain; + double charge = message.GetHitAdc(); // --- Create output digi - digiVec.emplace_back(address, channel, messageTime, charge); -*/ + digiVec.emplace_back(address, charge, messageTime); } // --------------------------------------------------------------------------