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 {
434 return (DetID == o2::detectors::DetID::FDD) || (DetID == o2::detectors::DetID::FT0) || (DetID == o2::detectors::DetID::FV0);
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
unsigned short int uint16_t
Timeframe settings Average distance in cm of events merged into Randomize distance around average distance of merged events Simulate correct bunch interactions instead of placing only the average number of events A value[n] sets TFlen for[n] collisions in Number of bunches per trainsort Number of bunch trains Instantaneous interaction rate Do not simulate border Total number of collisions to be placed in the interior of all time Do not select random but walk over array of events in stride steps h Event generator settings h configStandalone Use CPU for GPU Force usage of the specified GPU device no CPU fallback Continue processing after an error First event to Number of events to Number of iterations to Number of iterations to Number of initial iterations excluded from const char Directory with events to Events directory is and not inside events Show standalone event Run event generator maximum time bin of continuous for triggered for automatic continuous for automatic continuous triggered uint64_t
std::string ccdbPath(const std::string badChannelType)
Definition of the Names Generator class.
static std::string getCCDBServer()
Definition NameConf.cxx:123
Static class with identifiers, bitmasks and names for ALICE detectors.
Definition DetID.h:60
static constexpr const char * getName(ID id)
names of defined detectors
Definition DetID.h:148
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"