Project
Loading...
Searching...
No Matches
FEEIdConfig.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
16
17#include "MIDRaw/FEEIdConfig.h"
18
19#include <iostream>
20#include <fstream>
21#include <sstream>
22#include <string>
23#include <algorithm>
24#include "Framework/Logger.h"
26
27namespace o2
28{
29namespace mid
30{
31FEEIdConfig::FEEIdConfig() : mLinkUniqueIdToGBTUniqueId(), mGBTUniqueIdToFeeId(), mGBTUniqueIdsInLink()
32{
34 for (uint16_t icru = 0; icru < 2; ++icru) {
35 uint16_t offset = 16 * icru;
36 add(offset + 0, 6, 0, icru);
37 add(offset + 1, 7, 0, icru);
38 add(offset + 2, 4, 0, icru);
39 add(offset + 3, 5, 0, icru);
40 add(offset + 8, 2, 0, icru);
41 add(offset + 9, 3, 0, icru);
42 add(offset + 10, 0, 0, icru);
43 add(offset + 11, 1, 0, icru);
44
45 add(offset + 4, 0, 1, icru);
46 add(offset + 5, 1, 1, icru);
47 add(offset + 6, 2, 1, icru);
48 add(offset + 7, 3, 1, icru);
49 add(offset + 12, 6, 1, icru);
50 add(offset + 13, 7, 1, icru);
51 add(offset + 14, 4, 1, icru);
52 add(offset + 15, 5, 1, icru);
53 }
54}
55
56FEEIdConfig::FEEIdConfig(const char* filename) : mLinkUniqueIdToGBTUniqueId()
57{
59 load(filename);
60}
61
62void FEEIdConfig::add(uint16_t gbtUniqueId, uint8_t linkId, uint8_t epId, uint16_t cruId, uint16_t feeId)
63{
65 mLinkUniqueIdToGBTUniqueId[getLinkUniqueId(linkId, epId, cruId)] = gbtUniqueId;
66 mGBTUniqueIdToFeeId[gbtUniqueId] = feeId;
67 mGBTUniqueIdsInLink[feeId].emplace_back(gbtUniqueId);
68}
69
70void FEEIdConfig::add(uint16_t gbtUniqueId, uint8_t linkId, uint8_t epId, uint16_t cruId)
71{
73 add(gbtUniqueId, linkId, epId, cruId, 2 * cruId + epId);
74}
75
76uint16_t FEEIdConfig::getGBTUniqueId(uint32_t linkUniqueId) const
77{
79 auto feeId = mLinkUniqueIdToGBTUniqueId.find(linkUniqueId);
80 if (feeId == mLinkUniqueIdToGBTUniqueId.end()) {
81 LOGF(error, "No FeeId found for: CRUId: %i LinkId: %i EndPointId: %i", getCRUId(linkUniqueId), getLinkId(linkUniqueId), getEndPointId(linkUniqueId));
82 return 0xFFFF;
83 }
84 return feeId->second;
85}
86
87std::vector<uint16_t> FEEIdConfig::getConfiguredGBTUniqueIDs() const
88{
90 std::vector<uint16_t> configIds;
91 for (auto& item : mLinkUniqueIdToGBTUniqueId) {
92 configIds.emplace_back(item.second);
93 }
94 std::sort(configIds.begin(), configIds.end());
95 return configIds;
96}
97
98std::vector<uint32_t> FEEIdConfig::getConfiguredLinkUniqueIDs() const
99{
101 std::vector<uint32_t> configIds;
102 for (auto& item : mLinkUniqueIdToGBTUniqueId) {
103 configIds.emplace_back(item.first);
104 }
105 std::sort(configIds.begin(), configIds.end());
106 return configIds;
107}
108
109std::vector<uint16_t> FEEIdConfig::getConfiguredFEEIDs() const
110{
112 std::vector<uint16_t> configIds;
113 for (auto& item : mGBTUniqueIdsInLink) {
114 configIds.emplace_back(item.first);
115 }
116 std::sort(configIds.begin(), configIds.end());
117 return configIds;
118}
119
120bool FEEIdConfig::load(const char* filename)
121{
126
127 mLinkUniqueIdToGBTUniqueId.clear();
128 mGBTUniqueIdToFeeId.clear();
129 mGBTUniqueIdsInLink.clear();
130 std::ifstream inFile(filename);
131 if (!inFile.is_open()) {
132 return false;
133 }
134 std::string line, token;
135 while (std::getline(inFile, line)) {
136 int nSpaces = std::count(line.begin(), line.end(), ' ');
137 if (nSpaces < 3) {
138 continue;
139 }
140 if (line.find('#') < line.find(' ')) {
141 continue;
142 }
143 std::stringstream ss;
144 ss << line;
145 std::getline(ss, token, ' ');
146 uint16_t gbtUniqueId = std::atoi(token.c_str());
147 std::getline(ss, token, ' ');
148 uint8_t linkId = std::atoi(token.c_str());
149 std::getline(ss, token, ' ');
150 uint8_t epId = std::atoi(token.c_str());
151 std::getline(ss, token, ' ');
152 uint16_t cruId = std::atoi(token.c_str());
153 std::getline(ss, token, ' ');
154 if (nSpaces > 3) {
155 uint16_t feeId = std::atoi(token.c_str());
156 add(gbtUniqueId, linkId, epId, cruId, feeId);
157 } else {
158 add(gbtUniqueId, linkId, epId, cruId);
159 }
160 }
161 inFile.close();
162 return true;
163}
164
165uint16_t FEEIdConfig::getFEEId(uint16_t gbtUniqueId) const
166{
167 auto feeId = mGBTUniqueIdToFeeId.find(gbtUniqueId);
168 if (feeId == mGBTUniqueIdToFeeId.end()) {
169 std::cout << "Error: GBT ID " << gbtUniqueId << "not found" << std::endl;
170 return 0;
171 }
172 return feeId->second;
173}
174
175void FEEIdConfig::write(const char* filename) const
176{
178 std::ofstream outFile(filename);
179 for (auto& id : mLinkUniqueIdToGBTUniqueId) {
180 outFile << id.second << " " << getLinkId(id.first) << " " << getEndPointId(id.first) << " " << getCRUId(id.first) << " " << mGBTUniqueIdToFeeId.find(id.second)->second << std::endl;
181 }
182 outFile.close();
183}
184
185} // namespace mid
186} // namespace o2
MID RO crate parameters.
Hardware Id to FeeId mapper.
uint16_t getFEEId(uint16_t gbtUniqueId) const
Gets the FEE ID from the GBT unique ID.
std::vector< uint32_t > getConfiguredLinkUniqueIDs() const
std::vector< uint16_t > getConfiguredGBTUniqueIDs() const
uint32_t getLinkUniqueId(uint8_t linkId, uint8_t endPointId, uint16_t cruId) const
Gets a uniqueID from the combination of linkId, endPointId and cruId;.
Definition FEEIdConfig.h:42
void write(const char *filename) const
uint16_t getCRUId(uint32_t linkUniqueId) const
Gets the CRU ID.
Definition FEEIdConfig.h:45
uint16_t getGBTUniqueId(uint32_t linkUniqueId) const
uint8_t getEndPointId(uint32_t linkUniqueId) const
Gets the end point id.
Definition FEEIdConfig.h:47
uint8_t getLinkId(uint32_t linkUniqueId) const
Gets the Link ID.
Definition FEEIdConfig.h:49
std::vector< uint16_t > getConfiguredFEEIDs() const
GLintptr offset
Definition glcorearb.h:660
uint8_t itsSharedClusterMap uint8_t
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string filename()