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