-
Pierre-Alain Loizeau authoredPierre-Alain Loizeau authored
Unpack.cxx 2.48 KiB
/* Copyright (C) 2024 FIAS Frankfurt Institute for Advanced Studies, Frankfurt / Main
SPDX-License-Identifier: GPL-3.0-only
Authors: Felix Weiglhofer [committer], Dominik Smith */
#include "Unpack.h"
#include "AlgoFairloggerCompat.h"
using namespace cbm::algo::sts;
using fles::Subsystem;
Unpack::Unpack(const Config& config) : fConfig(config)
{
uint32_t numChansPerAsicSts = 128; // R/O channels per ASIC for STS
uint32_t numAsicsPerModuleSts = 16; // Number of ASICs per module for STS
constexpr u8 SystemVersion = 0x20;
auto equipIdsSts = fConfig.readout.GetEquipmentIds();
for (auto& equip : equipIdsSts) {
sts::UnpackPar par{};
par.fWriteAux = fConfig.bCollectAuxData;
par.fNumChansPerAsic = numChansPerAsicSts;
par.fNumAsicsPerModule = numAsicsPerModuleSts;
const size_t numElinks = fConfig.readout.GetNumElinks(equip);
for (size_t elink = 0; elink < numElinks; elink++) {
sts::UnpackElinkPar elinkPar;
auto mapEntry = fConfig.readout.Map(equip, elink);
elinkPar.fAddress = mapEntry.moduleAddress; // Module address for this elink
elinkPar.fAsicNr = mapEntry.asicNumber; // ASIC number within module
elinkPar.fTimeOffset = fConfig.walkMap.GetSystemTimeOffset();
elinkPar.fAdcMinCut = fConfig.readout.AdcCutMap(equip, elink);
elinkPar.fAdcOffset = 1.;
elinkPar.fAdcGain = 1.;
elinkPar.fWalk = fConfig.walkMap.Get(elinkPar.fAddress, elinkPar.fAsicNr);
elinkPar.fChanMask = fConfig.readout.MaskMap(equip, elink);
// TODO: Add parameters for time and ADC calibration
par.fElinkParams.push_back(elinkPar);
}
auto algo = std::make_unique<UnpackMS>(par);
fAlgos[{equip, SystemVersion}] = std::move(algo);
L_(debug) << "--- Configured equipment " << equip << " with " << numElinks << " elinks";
} //# equipments
L_(info) << "--- Configured " << fAlgos.size() << " unpacker algorithms for STS.";
}
Unpack::Result_t Unpack::operator()(const fles::Timeslice& ts) const
{
auto result = DoUnpack(Subsystem::STS, ts);
// PrintDigisPerModule(result.first);
return result;
}
void Unpack::PrintDigisPerModule(const PODVector<CbmStsDigi>& digis) const
{
std::map<u32, size_t> digisPerModule;
for (const auto& digi : digis) {
digisPerModule[digi.GetAddress()]++;
}
for (const auto& [module, numDigis] : digisPerModule) {
L_(info) << "Module " << std::hex << module << std::dec << " has " << numDigis << " digis";
}
}