22#include <fmt/format.h>
23#include <fmt/chrono.h>
47 std::unique_ptr<
char,
void (*)(
void*)>
res{abi::__cxa_demangle(
name.data(),
nullptr,
nullptr, &status), std::free};
48 return (status == 0) ?
res.get() :
name.data();
52CDBInterface::CDBInterface()
55 mDeadChannelMapCreator.
init(cdb.getURL());
62 if (mPedestalNoiseFileName.size()) {
64 loadNoiseAndPedestalFromFile();
66 }
else if (mUseDefaults) {
68 createDefaultPedestals();
76 LOG(fatal) <<
"No valid pedestal object was loaded";
86 if (mFEEParamFileName.size()) {
88 loadFEEParamsFromFile();
90 }
else if (mUseDefaults) {
92 createDefaultPedestals();
100 LOG(fatal) <<
"No valid pedestal CRU object was loaded";
103 return *mPedestalsCRU;
110 if (mPedestalNoiseFileName.size()) {
112 loadNoiseAndPedestalFromFile();
114 }
else if (mUseDefaults) {
116 createDefaultNoise();
124 LOG(fatal) <<
"No valid noise object was loaded";
134 if (mFEEParamFileName.size()) {
135 if (!mZeroSuppression) {
136 loadFEEParamsFromFile();
138 }
else if (mUseDefaults) {
139 if (!mZeroSuppression) {
140 createDefaultZeroSuppression();
147 if (!mZeroSuppression) {
148 LOG(fatal) <<
"No valid zero suppression object was loaded";
151 return *mZeroSuppression;
158 if (mGainMapFileName.size()) {
160 loadGainMapFromFile();
162 }
else if (mUseDefaults) {
164 createDefaultGainMap();
172 LOG(fatal) <<
"No valid gain object was loaded";
182 if (mFEEParamFileName.size()) {
184 loadFEEParamsFromFile();
186 }
else if (mUseDefaults) {
188 createDefaultIonTailParams();
196 LOG(fatal) <<
"No valid ion tail fraction parameters were loaded";
206 if (mFEEParamFileName.size()) {
208 loadFEEParamsFromFile();
210 }
else if (mUseDefaults) {
212 createDefaultIonTailParams();
220 LOG(fatal) <<
"No valid ion tail slope (expLamda) parameters were loaded";
223 return *mITExpLambda;
230 if (mFEEParamFileName.size()) {
232 loadFEEParamsFromFile();
234 }
else if (mUseDefaults) {
236 createDefaultCMParams();
244 LOG(fatal) <<
"No valid ion tail slope (expLamda) parameters were loaded";
255 createDefaultPadFlags();
263 LOG(fatal) <<
"No valid IDC PadFlags were loaded";
286 const auto feeConfig = mDeadChannelMapCreator.
getFEEConfig();
287 if (feeConfig !=
nullptr) {
291 LOGP(warning,
"Could not retrieve FEEConfig");
345 return getSpecificObjectFromCDB<CalPad>(
path);
349void CDBInterface::loadNoiseAndPedestalFromFile()
351 std::unique_ptr<TFile>
file(TFile::Open(mPedestalNoiseFileName.data()));
352 CalPad* pedestals{
nullptr};
354 file->GetObject(
"Pedestals", pedestals);
355 file->GetObject(
"Noise", noise);
358 LOG(fatal) <<
"No valid pedestal object was loaded";
362 LOG(fatal) <<
"No valid noise object was loaded";
365 mPedestals.reset(pedestals);
368 LOG(info) <<
"Loaded Noise and pedestal from file '" << mPedestalNoiseFileName <<
"'";
372void CDBInterface::loadGainMapFromFile()
374 std::unique_ptr<TFile>
file(TFile::Open(mGainMapFileName.data()));
376 file->GetObject(
"GainMap", gain);
379 LOG(fatal) <<
"No valid gain map object was loaded";
382 mGainMap.reset(gain);
384 LOG(info) <<
"Loaded gain map from file '" << mGainMapFileName <<
"'";
388void CDBInterface::loadFEEParamsFromFile()
390 if (mFEEParamFileName.empty() || !std::filesystem::exists(mFEEParamFileName)) {
391 LOGP(fatal,
"Could not find IF param file {}", mFEEParamFileName);
394 const std::string_view calDetNames =
"ITfraction,ITexpLambda,ThresholdMap,Pedestals,CMkValues";
397 for (
size_t iCalDet = 0; iCalDet < calDetNamesVec.size(); ++iCalDet) {
398 if (!calDets[iCalDet]) {
399 LOGP(fatal,
"Could not read '{}' object from file {}", calDetNamesVec[iCalDet], mFEEParamFileName);
403 mITFraction.reset(calDets[0]);
404 mITExpLambda.reset(calDets[1]);
405 mZeroSuppression.reset(calDets[2]);
406 mPedestalsCRU.reset(calDets[3]);
407 mCMkValues.reset(calDets[4]);
409 LOGP(info,
"Loaded FEE parameters {} from file {}", calDetNames, mFEEParamFileName);
413void CDBInterface::createDefaultPedestals()
416 mPedestals = std::make_unique<CalPad>(
"Pedestals");
419 const float meanPedestal = 72.5;
420 const float sigmaPedestal = 9.0;
423 const float minPedestal = meanPedestal - 4 * sigmaPedestal;
424 const float maxPedestal = meanPedestal + 4 * sigmaPedestal;
426 for (
auto& calArray : mPedestals->
getData()) {
428 float random = gRandom->Gaus(meanPedestal, sigmaPedestal);
429 if (random < minPedestal) {
430 random = minPedestal;
432 if (random > maxPedestal) {
433 random = maxPedestal;
440 mPedestalsCRU = std::make_unique<CalPad>(*mPedestals);
444void CDBInterface::createDefaultNoise()
447 mNoise = std::make_unique<CalPad>(
"Noise");
450 const float meanNoise = 1.0;
451 const float sigmaNoise = 0.05;
454 const float minNoise = meanNoise - 4 * sigmaNoise;
455 const float maxNoise = meanNoise + 8 * sigmaNoise;
457 for (
auto& calArray : mNoise->
getData()) {
459 float random = gRandom->Gaus(meanNoise, sigmaNoise);
460 if (random < minNoise) {
463 if (random > maxNoise) {
470 LOGP(info,
"created default noise map");
474void CDBInterface::createDefaultZeroSuppression()
477 mZeroSuppression = std::unique_ptr<CalPad>(
new CalPad(
getNoise()));
478 mZeroSuppression->setName(
"ThresholdMap");
480 const auto zsSigma = mDefaultZSsigma;
481 for (
auto& calArray : mZeroSuppression->
getData()) {
482 auto&
data = calArray.getData();
483 std::transform(
data.begin(),
data.end(),
data.begin(), [zsSigma](
const auto value) { return zsSigma * value; });
486 LOGP(info,
"created default threshold map");
490void CDBInterface::createDefaultGainMap()
493 mGainMap = std::make_unique<CalPad>(
"Gain");
496 const float meanGain = 1.0;
497 const float sigmaGain = 0.12;
500 const float minGain = meanGain - 4 * sigmaGain;
501 const float maxGain = meanGain + 8 * sigmaGain;
503 for (
auto& calArray : mGainMap->
getData()) {
505 float random = gRandom->Gaus(meanGain, sigmaGain);
506 if (random < minGain) {
509 if (random > maxGain) {
515 LOGP(info,
"created default gain map");
519void CDBInterface::createDefaultIonTailParams()
521 mITFraction = std::make_unique<CalPad>(
"ITfraction");
522 mITExpLambda = std::make_unique<CalPad>(
"ITexpLambda");
524 *mITFraction += 0.1276;
525 *mITExpLambda += std::exp(-0.0515);
527 LOGP(info,
"created default ion tail per-pad parameters");
531void CDBInterface::createDefaultCMParams()
533 mCMkValues = std::make_unique<CalPad>(
"CMkValues");
537 LOGP(info,
"created default ion tail per-pad parameters");
541void CDBInterface::createDefaultPadFlags()
543 mPadFlags = std::make_unique<CalPadFlagType>(
"CMkValues");
547 LOGP(info,
"created default pad flags");
551void CDBInterface::createFEEConfig()
558 LOGP(info,
"trying to load default FEEConfig");
565 LOGP(info,
"creating best guess FEEConfig");
573 auto& maps = feeConfig->padMaps;
581 mFEEConfig.reset(feeConfig);
585bool CDBStorage::checkMetaData(MetaData_t metaData)
const
587 if (!metaData.size()) {
588 LOGP(error,
"no meta data set");
591 const std::array<std::string_view, 3> requirements{
596 const std::array<std::vector<std::string_view>, 3> tests{{
597 {
"Responsible",
"Reason",
"Intervention"},
602 std::array<int, 3> counts{};
604 for (
size_t i = 0;
i < requirements.size(); ++
i) {
605 for (
const auto&
test : tests[
i]) {
606 if (!metaData[
test.data()].size()) {
607 const auto message = fmt::format(
"{} field {} not set in meta data", requirements[
i],
test);
617 LOGP(
debug,
"{} field '{}' set to '{}'", requirements[
i],
test, metaData[
test.data()]);
622 return counts[0] == 0;
628 std::string metaDataString;
629 return metaDataString;
635 std::unique_ptr<TFile>
file(TFile::Open(fileName.data()));
636 CalPad* pedestals{
nullptr};
638 file->GetObject(
"Pedestals", pedestals);
639 file->GetObject(
"Noise", noise);
642 LOGP(fatal,
"No valid pedestal object was loaded from file {}", fileName);
646 LOGP(fatal,
"No valid noise object was loaded from file {}", fileName);
651 calib[
"Pedestals"] = *pedestals;
652 calib[
"Noise"] = *noise;
660 std::unique_ptr<TFile>
file(TFile::Open(fileName.data()));
662 file->GetObject(
"GainMap", gain);
665 LOG(fatal) <<
"No valid gain map object was loaded";
676 if (calPads.size() != 3) {
677 LOGP(fatal,
"Missing pulser object in file {}", fileName);
679 auto t0 = calPads[0];
680 auto width = calPads[1];
681 auto qtot = calPads[2];
683 std::unordered_map<std::string, CalDet<float>> pulserCalib;
684 pulserCalib[
"T0"] = *
t0;
685 pulserCalib[
"Width"] = *
width;
686 pulserCalib[
"Qtot"] = *qtot;
696 if (calPads.size() != 1) {
697 LOGP(fatal,
"Missing pulser object in file {}", fileName);
699 auto thresholdMap = calPads[0];
701 std::unordered_map<std::string, CalDet<float>> feeConfigPad;
702 feeConfigPad[
"ThresholdMap"] = *thresholdMap;
710 std::unique_ptr<TFile>
file(TFile::Open(fileName.data()));
714 LOGP(fatal,
"No valid timeGain object found in {}", fileName);
721void CDBStorage::printObjectSummary(std::string_view
name,
CDBType const type, MetaData_t
const& metadata,
long start,
long end)
const
723 std::time_t tstart(
start / 1000);
724 std::time_t tend(
end / 1000);
725 auto tstartms =
start % 1000;
726 auto tendms =
end % 1000;
729 fmt::format(
" to storage '{}'\n", mCCDB.
getURL()) +
731 fmt::format(
" with validity [{}, {}] :",
start,
end) +
732 fmt::format(
" [{:%d.%m.%Y %H:%M:%S}.{:03d}, {:%d.%m.%Y %H:%M:%S}.{:03d}]\n", fmt::localtime(tstart), tstartms, fmt::localtime(tend), tendms) +
733 std::string(
" Meta data:\n");
735 for (
const auto& [
key,
value] : metadata) {
Simple interface to the CDB manager.
Definition of the parameter class for the detector.
Definition of the parameter class for the detector electronics.
Definition of the parameter class for the GEM stack.
Definition of the parameter class for the detector gas.
static BasicCCDBManager & instance()
std::string const & getURL() const
static const ParameterDetector & Instance()
const CalDet< bool > & getDeadChannelMap()
Dead channel map.
const CalPad & getCMkValues()
std::unordered_map< std::string, CalPad > CalPadMapType
const CalPad & getITFraction()
const ParameterDetector & getParameterDetector()
const CalPad & getPedestals()
const CalPad & getZeroSuppressionThreshold()
Return the zero suppression threshold map.
const CalPad & getNoise()
const CalPad & getITExpLambda()
const ParameterElectronics & getParameterElectronics()
const ParameterGas & getParameterGas()
const ParameterGEM & getParameterGEM()
const CalPadFlagType & getPadFlags()
Pad status flags from IDCs.
const CalPad & getCalPad(const std::string_view path)
const CalPad & getGainMap()
const CalPad & getPedestalsCRU()
const FEEConfig & getFEEConfig()
Return FEEConfig.
void uploadTimeGain(std::string_view fileName, long first=-1, long last=o2::ccdb::CcdbObjectInfo::INFINITE_TIMESTAMP)
void uploadFEEConfigPad(std::string_view fileName, long first=-1, long last=o2::ccdb::CcdbObjectInfo::INFINITE_TIMESTAMP)
std::string getMetaDataString() const
void uploadPulserOrCEData(CDBType type, std::string_view fileName, long first=-1, long last=o2::ccdb::CcdbObjectInfo::INFINITE_TIMESTAMP)
void uploadNoiseAndPedestal(std::string_view fileName, long first=-1, long last=o2::ccdb::CcdbObjectInfo::INFINITE_TIMESTAMP)
void storeObject(T *obj, CDBType const type, MetaData_t const &metadata, long start, long end)
void uploadGainMap(std::string_view fileName, bool isFull=true, long first=-1, long last=o2::ccdb::CcdbObjectInfo::INFINITE_TIMESTAMP)
void setDeadChannelMapIDCPadStatus(const CalDetFlag_t &padStatusMap, PadFlags mask=PadFlags::flagAllNoneGood)
void init(std::string_view url="")
void loadFEEConfig(long timeStamp=-1)
void finalizeDeadChannelMap()
void loadFEEConfigViaRunInfoTS(long timeStamp)
const FEEConfig * getFEEConfig() const
const CalDet< bool > & getDeadChannelMap() const
GLuint const GLchar * name
GLsizei const GLfloat * value
GLint GLint GLsizei GLint GLenum GLenum type
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLsizei const GLchar *const * path
GLuint GLsizei const GLchar * message
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t0
std::string demangle(const char *name)
utility function to demangle cxx type names
const std::vector< std::string > tokenize(const std::string_view input, const std::string_view pattern)
std::vector< CalPad * > readCalPads(const std::string_view fileName, const std::vector< std::string > &calPadNames)
Global TPC definitions and constants.
const std::unordered_map< CDBType, const std::string > CDBTypeMap
Storage name in CCDB for each calibration and parameter type.
@ flagGoodPad
flag for a good pad binary 0001
CDBType
Calibration and parameter types for CCDB.
@ CalIDCPadStatusMapA
Status map of the pads (dead etc. obatined from CalIDC0)
@ ParDetector
Parameter for Detector.
@ ParElectronics
Parameter for Electronics.
@ CalPedestalNoise
Pedestal and Noise calibration.
@ CalPadGainFull
Full pad gain calibration.
@ ConfigFEEPad
FEE pad-by-pad configuration map.
@ ParGas
Parameter for Gas.
@ CalPadGainResidual
ResidualpPad gain calibration (e.g. from tracks)
@ CalTimeGain
Gain variation over time.
FIXME: do not use data model tables.
@ Physics30sigma
Physics configuration with 3.0 sigma thresholds.
const CalPad & getPadMap(PadConfig config) const
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"