Project
Loading...
Searching...
No Matches
LookUpTable.h
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
12#ifndef ALICEO2_FIT_LOOKUPTABLE_H_
13#define ALICEO2_FIT_LOOKUPTABLE_H_
15// Look Up Table FIT
17
20#include "Framework/Logger.h"
21#define BOOST_BIND_GLOBAL_PLACEHOLDERS
22#include <boost/property_tree/ptree.hpp>
23#include <boost/property_tree/json_parser.hpp>
24#include <Rtypes.h>
25#include <iostream>
26#include <tuple>
27#include <TString.h>
28#include <TSystem.h>
29#include <map>
30#include <string>
31#include <vector>
32#include <istream>
33#include <ostream>
34#include <algorithm>
35namespace o2
36{
37namespace fit
38{
39struct EntryCRU { // This is specific struct for CRU entry
42 int mCRUID;
43 int mFEEID;
44 friend std::ostream& operator<<(std::ostream& os, const EntryCRU& entryCRU)
45 {
46 os << "LinkID: " << entryCRU.mLinkID << "|";
47 os << "EndPointID: " << entryCRU.mEndPointID << "|";
48 os << "CRUID: " << entryCRU.mCRUID << "|";
49 os << "FEEID: " << entryCRU.mFEEID;
50 return os;
51 }
52 void parse(const boost::property_tree::ptree& propertyTree)
53 {
54 mLinkID = propertyTree.get<int>("LinkID");
55 mEndPointID = propertyTree.get<int>("EndPointID");
56 mCRUID = propertyTree.get<int>("CRUID");
57 mFEEID = propertyTree.get<int>("FEEID");
58 }
60};
61
62struct HasherCRU {
63 // Hash-function without any collisions due to technical bit size of fields:
64 // RDH::EndPointID : 4 bits
65 // RDH::LinkID : 8 bits
66 std::size_t operator()(const EntryCRU& entryCRU) const
67 {
68 return (entryCRU.mLinkID << 4) | entryCRU.mEndPointID;
69 }
70};
71
73 bool operator()(const EntryCRU& entry1, const EntryCRU& entry2) const
74 {
75 return ((entry1.mLinkID << 4) | entry1.mEndPointID) == ((entry2.mLinkID << 4) | entry2.mEndPointID);
76 }
77};
78
79struct EntryPM {
82 friend std::ostream& operator<<(std::ostream& os, const EntryPM& entryPM)
83 {
84 os << entryPM.mEntryCRU << "|";
85 os << "LocalChID: " << entryPM.mLocalChannelID;
86 return os;
87 }
89};
90
91inline bool operator<(EntryPM const& entryPM1, EntryPM const& entryPM2)
92{
93 auto comparer = [](const EntryPM& entryPM) -> decltype(auto) { return std::tie(entryPM.mEntryCRU.mEndPointID, entryPM.mEntryCRU.mLinkID, entryPM.mLocalChannelID); };
94 return comparer(entryPM1) < comparer(entryPM2);
95}
96
97struct HasherPM {
98 // Hash-function without any collisions due to technical bit size of fields:
99 // RDH::EndPointID : 4 bits
100 // EventData::ChannelID : 4 bits
101 // RDH::LinkID : 8 bits
102 std::size_t operator()(const EntryPM& entryPM) const
103 {
104 return (entryPM.mEntryCRU.mLinkID << 8) | (entryPM.mLocalChannelID << 4) | (entryPM.mEntryCRU.mEndPointID);
105 }
106};
107
109 // Always true due to perfect hasher
110 bool operator()(const EntryPM& entry1, const EntryPM& entry2) const
111 {
112 return ((entry1.mEntryCRU.mLinkID << 8) | (entry1.mLocalChannelID << 4) | (entry1.mEntryCRU.mEndPointID)) == ((entry2.mEntryCRU.mLinkID << 8) | (entry2.mLocalChannelID << 4) | (entry2.mEntryCRU.mEndPointID));
113 }
114};
115
116struct EntryFEE {
118 std::string mChannelID; // ChannelID, string type because some entries containes N/A
119 std::string mLocalChannelID; // Local channelID, string type because some entries containes N/A
120 std::string mModuleType; // PM, PM-LCS, TCM
121 std::string mModuleName;
122 std::string mBoardHV;
123 std::string mChannelHV;
124 std::string mSerialNumberMCP;
125 std::string mCableHV;
126 std::string mCableSignal;
127 friend std::ostream& operator<<(std::ostream& os, const EntryFEE& entryFEE)
128 {
129 os << entryFEE.mEntryCRU << "|";
130 os << "ChannelID: " << entryFEE.mChannelID << "|";
131 os << "LocalChannelID: " << entryFEE.mLocalChannelID << "|";
132 os << "ModuleType: " << entryFEE.mModuleType << "|";
133 os << "ModuleName: " << entryFEE.mModuleName << "|";
134 os << "HV board: " << entryFEE.mBoardHV << "|";
135 os << "HV channel: " << entryFEE.mChannelHV << "|";
136 os << "MCP S/N: " << entryFEE.mSerialNumberMCP << "|";
137 os << "HV cable: " << entryFEE.mCableHV << "|";
138 os << "signal cable: " << entryFEE.mCableSignal << "|";
139 return os;
140 }
141
142 void parse(const boost::property_tree::ptree& propertyTree)
143 {
144 mEntryCRU.parse(propertyTree);
145 mChannelID = propertyTree.get<std::string>("channel #");
146 mLocalChannelID = propertyTree.get<std::string>("LocalChannelID");
147 mModuleType = propertyTree.get<std::string>("ModuleType");
148 mModuleName = propertyTree.get<std::string>("Module");
149 mBoardHV = propertyTree.get<std::string>("HV board");
150 mChannelHV = propertyTree.get<std::string>("HV channel");
151 mSerialNumberMCP = propertyTree.get<std::string>("MCP S/N");
152 mCableHV = propertyTree.get<std::string>("HV cable");
153 mCableSignal = propertyTree.get<std::string>("signal cable");
154 }
156};
157enum class EModuleType : int { kUnknown,
158 kPM,
159 kPM_LCS,
160 kTCM };
161
162template <typename MapEntryCRU2ModuleType = std::unordered_map<EntryCRU, EModuleType, HasherCRU, ComparerCRU>,
163 typename MapEntryPM2ChannelID = std::unordered_map<EntryPM, int, HasherPM, ComparerPM>>
165{
166 public:
167 typedef std::vector<EntryFEE> Table_t;
168 typedef MapEntryPM2ChannelID MapEntryPM2ChannelID_t;
169 typedef MapEntryCRU2ModuleType MapEntryCRU2ModuleType_t;
170 typedef typename MapEntryPM2ChannelID_t::key_type EntryPM_t;
171 typedef typename MapEntryCRU2ModuleType_t::key_type EntryCRU_t;
172 typedef typename MapEntryPM2ChannelID_t::mapped_type ChannelID_t;
173 typedef std::map<ChannelID_t, EntryPM_t> MapChannelID2EntryPM_t; // for digit2raw
174 typedef std::map<EModuleType, EntryCRU_t> MapModuleType2EntryCRU; // for digit2raw
175 typedef EntryPM_t Topo_t; // temporary for common interface
176
177 LookupTableBase() = default;
178 LookupTableBase(const Table_t* vecEntryFEE) { initFromTable(vecEntryFEE); }
179 LookupTableBase(const std::string& pathToFile) { initFromFile(pathToFile); }
180 LookupTableBase(const std::string& urlCCDB, const std::string& pathToStorageInCCDB, long timestamp = -1) { initCCDB(urlCCDB, pathToStorageInCCDB, timestamp); }
181 // Map of str module names -> enum types
182 const std::map<std::string, EModuleType> mMapModuleTypeStr2Enum = {{"PM", EModuleType::kPM}, {"PM-LCS", EModuleType::kPM_LCS}, {"TCM", EModuleType::kTCM}};
183 // Warning! To exclude double mapping do not use isTCM and isPM in the same time
184 bool isTCM(int linkID, int epID) const
185 {
186 return mEntryCRU_TCM.mLinkID == linkID && mEntryCRU_TCM.mEndPointID == epID;
187 }
188
189 bool isPM(int linkID, int epID) const
190 {
191 return isPM(EntryCRU_t{linkID, epID});
192 }
193
194 bool isTCM(const EntryCRU_t& entryCRU) const
195 {
196 if (getModuleType(entryCRU) == EModuleType::kTCM) {
197 return true;
198 } else {
199 return false;
200 }
201 }
202 bool isPM(const EntryCRU_t& entryCRU) const
203 {
204 if (getModuleType(entryCRU) == EModuleType::kPM || getModuleType(entryCRU) == EModuleType::kPM_LCS) {
205 return true;
206 } else {
207 return false;
208 }
209 }
210 EModuleType getModuleType(const EntryCRU_t& entryCRU) const
211 {
212 const auto& mapEntries = getMapEntryCRU2ModuleType();
213 const auto& it = mapEntries.find(entryCRU);
214 if (it != mapEntries.end()) {
215 return it->second;
216 } else {
218 }
219 }
220 EModuleType getModuleType(const std::string& moduleType)
221 {
222 const auto& it = mMapModuleTypeStr2Enum.find(moduleType);
223 if (it != mMapModuleTypeStr2Enum.end()) {
224 return it->second;
225 } else {
227 }
228 }
229 void initFromFile(const std::string& pathToFile)
230 {
231 std::string filepath{};
232 if (pathToFile == "") {
233 std::string inputDir;
234 const char* aliceO2env = std::getenv("O2_ROOT");
235 if (aliceO2env) {
236 inputDir = aliceO2env;
237 }
238 inputDir += "/share/Detectors/FT0/files/";
239 filepath = inputDir + "LookupTable_FT0.json";
240 TString expandedFilepath = filepath;
241 gSystem->ExpandPathName(expandedFilepath); // Expand $(ALICE_ROOT) into real system path
242 filepath = expandedFilepath.Data();
243 } else {
244 filepath = pathToFile;
245 }
246 prepareEntriesFEE(filepath);
247 prepareLUT();
248 }
249 void initCCDB(const std::string& urlCCDB, const std::string& pathToStorageInCCDB, long timestamp = -1);
250 void initFromTable(const Table_t* vecEntryFEE)
251 {
252 mVecEntryFEE = *vecEntryFEE;
253 prepareLUT();
254 }
255 ChannelID_t getGlobalChannelID(const EntryPM_t& entryPM, bool& isValid) const
256 {
257 const auto& it = mMapEntryPM2ChannelID.find(entryPM);
258 if (it != mMapEntryPM2ChannelID.end()) {
259 isValid = true;
260 return it->second;
261 } else {
262 isValid = false;
263 return -1;
264 }
265 }
266 ChannelID_t getChannel(int linkID, int chID, int ep = 0)
267 {
268 return mMapEntryPM2ChannelID.find(std::move(EntryPM_t{EntryCRU_t{linkID, ep, 0, 0}, chID}))->second;
269 }
270 ChannelID_t getChannel(int linkID, int ep, int chID, bool& isValid)
271 {
272 const auto& it = mMapEntryPM2ChannelID.find(std::move(EntryPM_t{EntryCRU_t{linkID, ep, 0, 0}, chID}));
273 if (it != mMapEntryPM2ChannelID.end()) {
274 isValid = true;
275 return it->second;
276 } else {
277 isValid = false;
278 return -1;
279 }
280 }
281 void prepareEntriesFEE(const std::string& pathToConfigFile)
282 {
283 boost::property_tree::ptree propertyTree;
284 boost::property_tree::read_json(pathToConfigFile.c_str(), propertyTree);
285 mVecEntryFEE = prepareEntriesFEE(propertyTree);
286 }
287 Table_t prepareEntriesFEE(const boost::property_tree::ptree& propertyTree)
288 {
289 Table_t vecEntryFEE;
290 for (const auto& pairEntry : propertyTree) {
291 const auto& propertyTreeSingle = pairEntry.second;
292 EntryFEE entryFEE{};
293 entryFEE.parse(propertyTreeSingle);
294 vecEntryFEE.push_back(entryFEE);
295 }
296 return vecEntryFEE;
297 }
298
300 {
301 mMapEntryCRU2ModuleType.clear();
302 mMapEntryPM2ChannelID.clear();
303 const auto& vecEntryFEE = getVecMetadataFEE();
304 for (const auto entryFEE : vecEntryFEE) {
305 EntryCRU_t entryCRU = entryFEE.mEntryCRU;
306 std::string strModuleType = entryFEE.mModuleType;
307 EModuleType moduleType = getModuleType(strModuleType);
308 if (moduleType != EModuleType::kUnknown) {
309 mMapEntryCRU2ModuleType.insert({entryCRU, moduleType});
310 }
311 if (moduleType == EModuleType::kPM || moduleType == EModuleType::kPM_LCS) {
312 const std::string& strChannelID = entryFEE.mChannelID;
313 const std::string& strLocalChannelID = entryFEE.mLocalChannelID;
314 EntryPM_t entryPM{entryCRU, std::stoi(strLocalChannelID)};
315 mMapEntryPM2ChannelID.insert({entryPM, std::stoi(strChannelID)});
316 }
317 if (moduleType == EModuleType::kTCM) {
318 mEntryCRU_TCM = entryCRU;
319 }
320 }
321 }
322 void printFullMap() const
323 {
324 for (const auto& entry : mVecEntryFEE) {
325 LOG(info) << entry;
326 }
327 /*
328 std::cout<<std::endl<<"------------------------------------------------------------------------------"<<std::endl;
329 for(const auto &entry:mMapEntryPM2ChannelID) {
330 std::cout<<entry.first<<"| GlChID: "<<entry.second<<std::endl;
331 }
332 std::cout<<std::endl<<"------------------------------------------------------------------------------"<<std::endl;
333 for(const auto &entry:mMapEntryCRU2ModuleType) {
334 std::cout<<entry.first<<"| ModuleType: "<<static_cast<int>(entry.second)<<std::endl;
335 }
336 */
337 }
338 const Table_t& getVecMetadataFEE() const { return mVecEntryFEE; }
339 const MapEntryCRU2ModuleType_t& getMapEntryCRU2ModuleType() const { return mMapEntryCRU2ModuleType; }
340 const MapEntryPM2ChannelID_t& getMapEntryPM2ChannelID() const { return mMapEntryPM2ChannelID; }
341 const EntryCRU_t& getEntryCRU_TCM() const { return mEntryCRU_TCM; }
342 // Temporary
343 // Making topo for FEE recognizing(Local channelID is supressed)
344 static Topo_t makeGlobalTopo(const Topo_t& topo)
345 {
346 return Topo_t{topo.mEntryCRU, 0};
347 }
348 static int getLocalChannelID(const Topo_t& topo)
349 {
350 return topo.mLocalChannelID;
351 }
352 Topo_t getTopoPM(int globalChannelID) const
353 {
354 const auto& mapChannels = getMapEntryPM2ChannelID();
355 auto findResult = std::find_if(mapChannels.begin(), mapChannels.end(), [&](const auto& pairEntry) {
356 return pairEntry.second == globalChannelID;
357 });
358 return findResult->first;
359 }
361 {
362 const auto& mapModuleType = getMapEntryCRU2ModuleType();
363 auto findResult = std::find_if(mapModuleType.begin(), mapModuleType.end(), [&](const auto& pairEntry) {
364 return pairEntry.second == EModuleType::kTCM;
365 });
366 return Topo_t{findResult->first, 0};
367 }
368 // Prepare full map for FEE metadata(for digit2raw convertion)
369 template <typename RDHtype, typename RDHhelper = void>
370 auto makeMapFEEmetadata() -> std::map<Topo_t, RDHtype>
371 {
372 std::map<Topo_t, RDHtype> mapResult;
373 const uint16_t cruID = 0; // constant
374 uint64_t feeID = 0; // increments
375 const auto& mapEntryPM2ChannelID = getMapEntryPM2ChannelID();
376 // Temporary for sorting FEEIDs without using them from LUT(for digit2raw convertion), and by using GlobalChannelID
377 std::map<int, Topo_t> mapBuf;
378 for (const auto& entry : mapEntryPM2ChannelID) {
379 mapBuf.insert({entry.second, entry.first});
380 }
381 const auto& cru_tcm = getEntryCRU_TCM();
382
383 // FIXME: quick fix for to get the TCM into the right channel
384 // mapBuf.insert({static_cast<int>(mapBuf.size()), Topo_t{cru_tcm, 0}});
385 mapBuf.insert({1 + static_cast<int>((--mapBuf.end())->first), Topo_t{cru_tcm, 0}});
386 //
387 for (const auto& pairEntry : mapBuf) {
388 auto en = pairEntry.second;
389 auto pairInserted = mapResult.insert({makeGlobalTopo(en), RDHtype{}});
390 if (pairInserted.second) {
391 auto& rdhObj = pairInserted.first->second;
392 const auto& topoObj = pairInserted.first->first;
393 if constexpr (std::is_same<RDHhelper, void>::value) {
394 rdhObj.linkID = topoObj.mEntryCRU.mLinkID;
395 rdhObj.endPointID = topoObj.mEntryCRU.mEndPointID;
396 rdhObj.feeId = feeID;
397 rdhObj.cruID = cruID;
398 } else // Using RDHUtils
399 {
400 RDHhelper::setLinkID(&rdhObj, topoObj.mEntryCRU.mLinkID);
401 RDHhelper::setEndPointID(&rdhObj, topoObj.mEntryCRU.mEndPointID);
402 RDHhelper::setFEEID(&rdhObj, feeID);
403 RDHhelper::setCRUID(&rdhObj, cruID);
404 }
405 feeID++;
406 }
407 }
408 for (const auto& entry : mapResult) {
409 std::cout << "\nTEST: " << entry.first << std::endl;
410 }
411 return mapResult;
412 }
413
414 private:
415 EntryCRU_t mEntryCRU_TCM;
416 Table_t mVecEntryFEE;
417 MapEntryCRU2ModuleType_t mMapEntryCRU2ModuleType;
418 MapEntryPM2ChannelID_t mMapEntryPM2ChannelID;
419 typedef std::enable_if_t<std::is_integral<typename MapEntryPM2ChannelID::mapped_type>::value> CheckChannelIDtype; // should be integral
420};
421
422// Singleton for LookUpTable, coomon for all three FIT detectors
423template <o2::detectors::DetID::ID DetID, typename LUT>
424class SingleLUT : public LUT
425{
426 private:
427 SingleLUT() = default;
428 SingleLUT(const std::string& ccdbPath, const std::string& ccdbPathToLUT) : LUT(ccdbPath, ccdbPathToLUT) {}
429 SingleLUT(const std::string& pathToFile) : LUT(pathToFile) {}
430 SingleLUT(const SingleLUT&) = delete;
431 SingleLUT& operator=(SingleLUT&) = delete;
432 constexpr static bool isValidDet()
433 {
435 }
436
437 public:
439 typedef typename LookupTable_t::Table_t Table_t;
440
441 constexpr static const char* getObjectPath()
442 {
443 static_assert(isValidDet(), "Invalid detector type(o2::detectors::DetID::ID)! Should be one of the FIT detector!");
444 if constexpr (DetID == o2::detectors::DetID::FDD) {
445 return "FDD/Config/LookupTable";
446 } else if constexpr (DetID == o2::detectors::DetID::FT0) {
447 return "FT0/Config/LookupTable";
448 } else if constexpr (DetID == o2::detectors::DetID::FV0) {
449 return "FV0/Config/LookupTable";
450 }
451 return "";
452 }
454 static constexpr const char* sDetectorName = o2::detectors::DetID::getName(DetID);
455 static constexpr const char* sDefaultLUTpath = getObjectPath();
456 static constexpr const char sObjectName[] = "LookupTable";
457 inline static std::string sCurrentCCDBpath = "";
458 inline static std::string sCurrentLUTpath = sDefaultLUTpath;
459 // Before instance() call, setup url and path
460 static void setCCDBurl(const std::string& url) { sCurrentCCDBpath = url; }
461 static void setLUTpath(const std::string& path) { sCurrentLUTpath = path; }
462 bool mFirstUpdate{true}; // option in case if LUT should be updated during workflow initialization
463 static SingleLUT& Instance(const Table_t* table = nullptr, long timestamp = -1)
464 {
465 if (sCurrentCCDBpath == "") {
467 }
468 static SingleLUT instanceLUT;
469 if (table != nullptr) {
470 instanceLUT.initFromTable(table);
471 instanceLUT.mFirstUpdate = false;
472 } else if (instanceLUT.mFirstUpdate) {
473 instanceLUT.initCCDB(sCurrentCCDBpath, sCurrentLUTpath, timestamp);
474 instanceLUT.mFirstUpdate = false;
475 }
476 return instanceLUT;
477 }
478};
479
480} // namespace fit
481} // namespace o2
482
483#endif
std::string url
std::string ccdbPath(const std::string badChannelType)
Definition of the Names Generator class.
static std::string getCCDBServer()
Definition NameConf.cxx:115
Static class with identifiers, bitmasks and names for ALICE detectors.
Definition DetID.h:58
static constexpr const char * getName(ID id)
names of defined detectors
Definition DetID.h:146
static constexpr ID FV0
Definition DetID.h:76
static constexpr ID FT0
Definition DetID.h:75
static constexpr ID FDD
Definition DetID.h:77
void initFromTable(const Table_t *vecEntryFEE)
EModuleType getModuleType(const EntryCRU_t &entryCRU) const
bool isPM(const EntryCRU_t &entryCRU) const
MapEntryPM2ChannelID MapEntryPM2ChannelID_t
const std::map< std::string, EModuleType > mMapModuleTypeStr2Enum
auto makeMapFEEmetadata() -> std::map< Topo_t, RDHtype >
Topo_t getTopoTCM() const
ChannelID_t getChannel(int linkID, int chID, int ep=0)
ChannelID_t getGlobalChannelID(const EntryPM_t &entryPM, bool &isValid) const
const MapEntryCRU2ModuleType_t & getMapEntryCRU2ModuleType() const
bool isTCM(int linkID, int epID) const
MapEntryCRU2ModuleType_t::key_type EntryCRU_t
void initFromFile(const std::string &pathToFile)
MapEntryPM2ChannelID_t::key_type EntryPM_t
MapEntryCRU2ModuleType MapEntryCRU2ModuleType_t
LookupTableBase(const std::string &pathToFile)
std::map< EModuleType, EntryCRU_t > MapModuleType2EntryCRU
const MapEntryPM2ChannelID_t & getMapEntryPM2ChannelID() const
const EntryCRU_t & getEntryCRU_TCM() const
std::vector< EntryFEE > Table_t
LookupTableBase(const std::string &urlCCDB, const std::string &pathToStorageInCCDB, long timestamp=-1)
bool isPM(int linkID, int epID) const
Table_t prepareEntriesFEE(const boost::property_tree::ptree &propertyTree)
void prepareEntriesFEE(const std::string &pathToConfigFile)
MapEntryPM2ChannelID_t::mapped_type ChannelID_t
static Topo_t makeGlobalTopo(const Topo_t &topo)
std::map< ChannelID_t, EntryPM_t > MapChannelID2EntryPM_t
Topo_t getTopoPM(int globalChannelID) const
static int getLocalChannelID(const Topo_t &topo)
bool isTCM(const EntryCRU_t &entryCRU) const
LookupTableBase(const Table_t *vecEntryFEE)
const Table_t & getVecMetadataFEE() const
ChannelID_t getChannel(int linkID, int ep, int chID, bool &isValid)
void initCCDB(const std::string &urlCCDB, const std::string &pathToStorageInCCDB, long timestamp=-1)
EModuleType getModuleType(const std::string &moduleType)
static constexpr o2::detectors::DetID sDetID
static SingleLUT & Instance(const Table_t *table=nullptr, long timestamp=-1)
LookupTable_t::Table_t Table_t
static std::string sCurrentCCDBpath
static constexpr const char * getObjectPath()
static constexpr const char sObjectName[]
static void setLUTpath(const std::string &path)
static void setCCDBurl(const std::string &url)
static constexpr const char * sDetectorName
static std::string sCurrentLUTpath
static constexpr const char * sDefaultLUTpath
GLuint entry
Definition glcorearb.h:5735
GLsizei const GLchar *const * path
Definition glcorearb.h:3591
bool operator<(EntryPM const &entryPM1, EntryPM const &entryPM2)
Definition LookUpTable.h:91
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
bool isValid(std::string alias)
bool operator()(const EntryCRU &entry1, const EntryCRU &entry2) const
Definition LookUpTable.h:73
bool operator()(const EntryPM &entry1, const EntryPM &entry2) const
ClassDefNV(EntryCRU, 1)
friend std::ostream & operator<<(std::ostream &os, const EntryCRU &entryCRU)
Definition LookUpTable.h:44
void parse(const boost::property_tree::ptree &propertyTree)
Definition LookUpTable.h:52
std::string mCableHV
std::string mBoardHV
std::string mCableSignal
void parse(const boost::property_tree::ptree &propertyTree)
friend std::ostream & operator<<(std::ostream &os, const EntryFEE &entryFEE)
std::string mChannelHV
ClassDefNV(EntryFEE, 1)
std::string mModuleName
std::string mModuleType
std::string mLocalChannelID
std::string mChannelID
std::string mSerialNumberMCP
EntryCRU mEntryCRU
Definition LookUpTable.h:80
friend std::ostream & operator<<(std::ostream &os, const EntryPM &entryPM)
Definition LookUpTable.h:82
ClassDefNV(EntryPM, 1)
std::size_t operator()(const EntryCRU &entryCRU) const
Definition LookUpTable.h:66
std::size_t operator()(const EntryPM &entryPM) const
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"