CbmRoot
Loading...
Searching...
No Matches
mvd/ReadoutConfig.cxx
Go to the documentation of this file.
1/* Copyright (C) 2025 IKF Frankfurt University, Frankfurt am Main
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Ajit Kumar [committer] */
4
5#include "ReadoutConfig.h"
6
8
9#include <bitset>
10#include <iostream>
11#include <unordered_set>
12
13using namespace std;
14
16
17namespace cbm::algo::mvd
18{
19 // --- Constructor ------------------------------------------------------------------
21 // ------------------------------------------------------------------------------------
22
23 // --- Constructor with data from YAML file -------------------------------------------
25 // ------------------------------------------------------------------------------------
26
27 // --- Equipment IDs --------------------------------------------------------------
28 std::vector<uint16_t> ReadoutConfig::GetEquipmentIds()
29 {
30 std::vector<uint16_t> result;
31 for (auto& entry : fReadoutMap)
32 result.push_back(entry.first);
33 return result;
34 }
35 // ------------------------------------------------------------------------------------
36
37 // --- Number of elinks for a component / equipment -------------------------------
38 size_t ReadoutConfig::GetNumElinks(uint16_t equipmentId)
39 {
40 size_t result = 0;
41 auto it = fReadoutMap.find(equipmentId);
42 if (it != fReadoutMap.end()) result = fReadoutMap[equipmentId].size();
43 return result;
44 }
45 // ------------------------------------------------------------------------------------
46
47 // --- Mapping (equimentId, elink) -> address[channel] ------------------------------
48 std::vector<uint32_t> ReadoutConfig::Map(uint16_t equipmentId, uint16_t elinkId)
49 {
50 std::vector<uint32_t> result;
51 auto equipIter = fReadoutMap.find(equipmentId);
52 if (equipIter != fReadoutMap.end()) {
53 if (elinkId < equipIter->second.size()) {
54 result = equipIter->second.at(elinkId);
55 }
56 }
57 return result;
58 }
59 // ------------------------------------------------------------------------------------
60
61 // --- Mapping (equimentId, elink) -> (vector of mask flags) ------------------------
62 std::vector<uint8_t> ReadoutConfig::MaskMap(uint16_t equipmentId, uint16_t elinkId)
63 {
64 std::vector<uint8_t> result;
65 auto equipIter = fMaskMap.find(equipmentId);
66 if (equipIter != fMaskMap.end()) {
67 auto elinkMap = equipIter->second;
68 auto elinkIter = elinkMap.find(elinkId);
69 if (elinkIter != elinkMap.end()) {
70 result = elinkIter->second;
71 }
72 }
73 return result;
74 }
75 // ------------------------------------------------------------------------------------
76
78 {
81
82 for (auto& comp : pars.components) {
83 fReadoutMap[comp.first].resize(comp.second.crobs.size());
84 for (size_t crob_idx = 0; crob_idx < comp.second.crobs.size(); ++crob_idx) {
85 fReadoutMap[comp.first][crob_idx].insert(fReadoutMap[comp.first][crob_idx].end(),
86 comp.second.crobs[crob_idx].sensorAddress.begin(),
87 comp.second.crobs[crob_idx].sensorAddress.end());
88 }
89 }
90 }
91
92 // ------------------------------------------------------------------------------------
93
95 {
96 // This here refers to the mCBM 2025 setup.
97
98 // Array to hold the unique IDs (equipment ID) for all MVD DPBs
99 uint16_t eqId[numComp] = {0x0000, 0x0001};
100
101 // Constructing the map (equipmentId, eLink, channel) -> (MVD address)
102 uint16_t numElinksPerComp = numCrobPerComp * numElinksPerCrob;
103
104 std::cout << " ------------- " << numComp << " " << numCrobPerComp << " " << numElinksPerCrob << std::endl;
105
106 for (uint16_t comp = 0; comp < numComp; comp++) {
107 uint16_t equipment = eqId[comp];
108 fReadoutMap[equipment].resize(numCrobPerComp);
109 for (uint16_t crob = 0; crob < numCrobPerComp; crob++) {
110 fReadoutMap[equipment][crob].resize(numElinksPerCrob);
111 for (uint16_t elink = 0; elink < numElinksPerCrob; elink++) {
112 L_(debug) << " comp id " << comp << " equipment " << equipment << " crob " << crob << " elink " << elink
113 << " number of elinks per crob " << numElinksPerComp << std::endl;
114 // fReadoutMap[equipment][elink].resize(numChanPerAsic);
115 // uint16_t elinkId = numElinksPerCrob * crob + elink; // elink within component
116
117 // Skip unconnected FEB slots
118 } //# elink
119 } //# CROB
120 } //# component
121 }
122
123
124} // namespace cbm::algo::mvd
#define L_(level)
#define CBM_YAML_INSTANTIATE(type)
Explicitly instantiate the Read and Dump functions for a type.
Definition CbmYaml.h:352
void InitHardcoded()
Initialisation of readout map from hardcoded valus, backup if YAML missing.
ReadoutConfig()
Default Constructor if no valid YAMl file available.
static constexpr uint16_t numElinksPerCrob
Number of elinks in each CROB ?
std::vector< uint16_t > GetEquipmentIds()
Equipment in the configuration.
std::vector< uint8_t > MaskMap(uint16_t equipId, uint16_t elink)
API: Mapping from component and elink to channel mask flags.
std::vector< uint32_t > Map(uint16_t equipId, uint16_t elink)
API: Mapping from component and elink to addresses per channel.
void Init(const ReadoutSetup &)
Initialisation of readout map with hardcoded values.
size_t GetNumElinks(uint16_t equipmentId)
Number of elinks of a component.
static constexpr uint16_t numCrobPerComp
Number of CROBs possible per DPB.
static constexpr uint16_t numComp
Constants used for hardcoded defaults.
std::map< uint16_t, std::vector< std::vector< uint32_t > > > fReadoutMap
std::map< uint16_t, std::map< size_t, std::vector< uint8_t > > > fMaskMap
Hash for CbmL1LinkKey.
Readout setup / Hardware cabling for MVD Used to create the hardware mapping for the MVD unpacker.
std::map< uint16_t, Component > components