CbmRoot
Loading...
Searching...
No Matches
sts/Unpack.cxx
Go to the documentation of this file.
1/* Copyright (C) 2024 FIAS Frankfurt Institute for Advanced Studies, Frankfurt / Main
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Felix Weiglhofer [committer], Dominik Smith */
4
5#include "Unpack.h"
6
8
9using namespace cbm::algo::sts;
10using fles::Subsystem;
11
12Unpack::Unpack(const Config& config) : fConfig(config)
13{
14 uint32_t numChansPerAsicSts = 128; // R/O channels per ASIC for STS
15 uint32_t numAsicsPerModuleSts = 16; // Number of ASICs per module for STS
16
17 constexpr u8 SystemVersion = 0x20;
18
19 auto equipIdsSts = fConfig.readout.GetEquipmentIds();
20 for (auto& equip : equipIdsSts) {
21 sts::UnpackPar par{};
23 par.fNumChansPerAsic = numChansPerAsicSts;
24 par.fNumAsicsPerModule = numAsicsPerModuleSts;
25 const size_t numElinks = fConfig.readout.GetNumElinks(equip);
26 for (size_t elink = 0; elink < numElinks; elink++) {
27 sts::UnpackElinkPar elinkPar;
28 auto mapEntry = fConfig.readout.Map(equip, elink);
29 elinkPar.fAddress = mapEntry.moduleAddress; // Module address for this elink
30 elinkPar.fAsicNr = mapEntry.asicNumber; // ASIC number within module
32 elinkPar.fAdcMinCut = fConfig.readout.AdcCutMap(equip, elink);
33 elinkPar.fAdcOffset = 1.;
34 elinkPar.fAdcGain = 1.;
35 elinkPar.fWalk = fConfig.walkMap.Get(elinkPar.fAddress, elinkPar.fAsicNr);
36 elinkPar.fChanMask = fConfig.readout.MaskMap(equip, elink);
37 // TODO: Add parameters for time and ADC calibration
38 par.fElinkParams.push_back(elinkPar);
39 }
40 auto algo = std::make_unique<UnpackMS>(par);
41 fAlgos[{equip, SystemVersion}] = std::move(algo);
42 L_(debug) << "--- Configured equipment " << equip << " with " << numElinks << " elinks";
43 } //# equipments
44
45 L_(info) << "--- Configured " << fAlgos.size() << " unpacker algorithms for STS.";
46}
47
48Unpack::Result_t Unpack::operator()(const fles::Timeslice& ts) const
49{
50
51 auto result = DoUnpack(Subsystem::STS, ts);
52 // PrintDigisPerModule(result.first);
53 return result;
54}
55
57{
58 std::map<u32, size_t> digisPerModule;
59 for (const auto& digi : digis) {
60 digisPerModule[digi.GetAddress()]++;
61 }
62 for (const auto& [module, numDigis] : digisPerModule) {
63 L_(info) << "Module " << std::hex << module << std::dec << " has " << numDigis << " digis";
64 }
65}
#define L_(level)
Result_t DoUnpack(const fles::Subsystem subsystem, const fles::Timeslice &ts) const
std::map< UnpackKey, std::unique_ptr< Unpack_t > > fAlgos
size_t GetNumElinks(u16 equipmentId)
Number of elinks of a component.
std::vector< bool > MaskMap(uint16_t equipId, uint16_t elink)
API: Mapping from component and elink to channel mask flags.
Entry Map(u16 equipId, u16 elink)
API: Mapping from component and elink to address / ASIC number + pulser flag.
std::vector< u16 > GetEquipmentIds()
Equipment in the configuration.
uint32_t AdcCutMap(uint16_t equipId, uint16_t elink)
API: Mapping from component and elink to minimum adc cut.
detail::UnpackBase::Result_t Result_t
Definition sts/Unpack.h:29
Unpack(const Config &config)
Result_t operator()(const fles::Timeslice &) const
void PrintDigisPerModule(const PODVector< CbmStsDigi > &digis) const
std::vector< double > Get(int32_t modAddress, uint16_t asic)
API: Mapping from module address and ASIC number to walk coefficients.
Definition WalkMap.cxx:11
i32 GetSystemTimeOffset()
Get system time offset.
Definition WalkMap.h:34
std::uint8_t u8
Definition Definitions.h:17
std::vector< T, PODAllocator< T > > PODVector
PODVector is a std::vector that doesn't initialize its elements.
Definition PODVector.h:17
uint64_t fTimeOffset
Time calibration parameter.
double fAdcGain
Charge calibration parameter.
int32_t fAddress
CbmStsAddress for the connected module.
double fAdcOffset
Charge calibration parameter.
uint32_t fAdcMinCut
Minimum Acd cut.
std::vector< bool > fChanMask
Channel masking flags.
std::vector< double > fWalk
Walk correction coefficients.
uint32_t fAsicNr
Number of connected ASIC within the module.
bool fWriteAux
Write auxiliary data for module.