diff --git a/Detectors/ITSMFT/MFT/calibration/include/MFTCalibration/NoiseCalibratorSpec.h b/Detectors/ITSMFT/MFT/calibration/include/MFTCalibration/NoiseCalibratorSpec.h index e91cbe6ecffb0..484715d87e53c 100644 --- a/Detectors/ITSMFT/MFT/calibration/include/MFTCalibration/NoiseCalibratorSpec.h +++ b/Detectors/ITSMFT/MFT/calibration/include/MFTCalibration/NoiseCalibratorSpec.h @@ -48,11 +48,19 @@ class NoiseCalibratorSpec : public Task private: void updateTimeDependentParams(ProcessingContext& pc); - void sendOutput(DataAllocator& output); + void sendOutputCcdb(DataAllocator& output); + void sendOutputCcdbDcs(DataAllocator& output); + void sendOutputDcs(DataAllocator& output); + void setOutputDcs(const o2::itsmft::NoiseMap& payload); o2::itsmft::NoiseMap mNoiseMap{936}; std::unique_ptr mCalibrator = nullptr; std::string mPath; std::string mMeta; + + std::vector> mNoiseMapForDcs; + std::string mPathDcs; + std::string mOutputType; + double mThresh; int64_t mStart; int64_t mEnd; diff --git a/Detectors/ITSMFT/MFT/calibration/src/NoiseCalibratorSpec.cxx b/Detectors/ITSMFT/MFT/calibration/src/NoiseCalibratorSpec.cxx index 2bc10c9ecc977..79f785fd258cd 100644 --- a/Detectors/ITSMFT/MFT/calibration/src/NoiseCalibratorSpec.cxx +++ b/Detectors/ITSMFT/MFT/calibration/src/NoiseCalibratorSpec.cxx @@ -45,12 +45,16 @@ void NoiseCalibratorSpec::init(InitContext& ic) auto probT = ic.options().get("prob-threshold"); LOG(info) << "Setting the probability threshold to " << probT; - mPath = ic.options().get("path"); + mPath = ic.options().get("path-CCDB"); mMeta = ic.options().get("meta"); mStart = ic.options().get("tstart"); mEnd = ic.options().get("tend"); mCalibrator = std::make_unique(probT); + + mPathDcs = ic.options().get("path-DCS"); + mOutputType = ic.options().get("send-to-server"); + mNoiseMapForDcs.clear(); } void NoiseCalibratorSpec::run(ProcessingContext& pc) @@ -63,7 +67,7 @@ void NoiseCalibratorSpec::run(ProcessingContext& pc) if (mCalibrator->processTimeFrame(tfcounter, digits, rofs)) { LOG(info) << "Minimum number of noise counts has been reached !"; - sendOutput(pc.outputs()); + sendOutputCcdb(pc.outputs()); pc.services().get().readyToQuit(QuitRequest::All); } } else { @@ -74,14 +78,33 @@ void NoiseCalibratorSpec::run(ProcessingContext& pc) if (mCalibrator->processTimeFrame(tfcounter, compClusters, patterns, rofs)) { LOG(info) << "Minimum number of noise counts has been reached !"; - sendOutput(pc.outputs()); + sendOutputCcdb(pc.outputs()); pc.services().get().readyToQuit(QuitRequest::All); } } } -void NoiseCalibratorSpec::sendOutput(DataAllocator& output) +void NoiseCalibratorSpec::setOutputDcs(const o2::itsmft::NoiseMap& payload) { + for (int iChip = 0; iChip < 936; ++iChip) { + for (int iRow = 0; iRow < 512; ++iRow) { + for (int iCol = 0; iCol < 1024; ++iCol) { + + if (!payload.isNoisy(iChip, iRow, iCol)) { + continue; + } + std::array noise = {iChip, iRow, iCol, 0}; + mNoiseMapForDcs.emplace_back(noise); + } + } + } +} + +void NoiseCalibratorSpec::sendOutputCcdbDcs(DataAllocator& output) +{ + + LOG(info) << "CCDB-DCS mode"; + mCalibrator->finalize(); long tstart = mStart; @@ -125,11 +148,137 @@ void NoiseCalibratorSpec::sendOutput(DataAllocator& output) using clbUtils = o2::calibration::Utils; output.snapshot(Output{clbUtils::gDataOriginCDBPayload, "MFT_NoiseMap", 0}, *image.get()); output.snapshot(Output{clbUtils::gDataOriginCDBWrapper, "MFT_NoiseMap", 0}, info); + + setOutputDcs(payload); + + o2::ccdb::CcdbObjectInfo infoDcs(mPathDcs, "NoiseMap", "noise.root", meta, tstart, tend); + auto flNameDcs = o2::ccdb::CcdbApi::generateFileName("noise"); + auto imageDcs = o2::ccdb::CcdbApi::createObjectImage(&mNoiseMapForDcs, &infoDcs); + infoDcs.setFileName(flNameDcs); + LOG(info) << "Sending object " << infoDcs.getPath() << "/" << infoDcs.getFileName() + << " of size " << imageDcs->size() + << " bytes, valid for " << infoDcs.getStartValidityTimestamp() + << " : " << infoDcs.getEndValidityTimestamp(); + + using clbUtilsDcs = o2::calibration::Utils; + output.snapshot(Output{clbUtilsDcs::gDataOriginCDBPayload, "MFT_NoiseMap", 1}, *imageDcs.get()); + output.snapshot(Output{clbUtilsDcs::gDataOriginCDBWrapper, "MFT_NoiseMap", 1}, infoDcs); +} + +void NoiseCalibratorSpec::sendOutputCcdb(DataAllocator& output) +{ + + LOG(info) << "CCDB mode"; + + mCalibrator->finalize(); + + long tstart = mStart; + if (tstart == -1) { + tstart = o2::ccdb::getCurrentTimestamp(); + } + long tend = mEnd; + if (tend == -1) { + constexpr long SECONDSPERYEAR = 365 * 24 * 60 * 60; + tend = o2::ccdb::getFutureTimestamp(SECONDSPERYEAR); + } + + std::map meta; + auto toKeyValPairs = [&meta](std::vector const& tokens) { + for (auto& token : tokens) { + auto keyval = Str::tokenize(token, '=', false); + if (keyval.size() != 2) { + LOG(error) << "Illegal command-line key/value string: " << token; + continue; + } + Str::trim(keyval[1]); + meta[keyval[0]] = keyval[1]; + } + }; + toKeyValPairs(Str::tokenize(mMeta, ';', true)); + + long startTF, endTF; + + const auto& payload = mCalibrator->getNoiseMap(); + // const auto& payload = mCalibrator->getNoiseMap(starTF, endTF); //For TimeSlot calibration + + o2::ccdb::CcdbObjectInfo info(mPath, "NoiseMap", "noise.root", meta, tstart, tend); + auto flName = o2::ccdb::CcdbApi::generateFileName("noise"); + auto image = o2::ccdb::CcdbApi::createObjectImage(&payload, &info); + info.setFileName(flName); + LOG(info) << "Sending object " << info.getPath() << "/" << info.getFileName() + << " of size " << image->size() + << " bytes, valid for " << info.getStartValidityTimestamp() + << " : " << info.getEndValidityTimestamp(); + + using clbUtils = o2::calibration::Utils; + output.snapshot(Output{clbUtils::gDataOriginCDBPayload, "MFT_NoiseMap", 0}, *image.get()); + output.snapshot(Output{clbUtils::gDataOriginCDBWrapper, "MFT_NoiseMap", 0}, info); +} + +void NoiseCalibratorSpec::sendOutputDcs(DataAllocator& output) +{ + + LOG(info) << "DCS mode"; + + mCalibrator->finalize(); + + long tstart = mStart; + if (tstart == -1) { + tstart = o2::ccdb::getCurrentTimestamp(); + } + long tend = mEnd; + if (tend == -1) { + constexpr long SECONDSPERYEAR = 365 * 24 * 60 * 60; + tend = o2::ccdb::getFutureTimestamp(SECONDSPERYEAR); + } + + std::map meta; + auto toKeyValPairs = [&meta](std::vector const& tokens) { + for (auto& token : tokens) { + auto keyval = Str::tokenize(token, '=', false); + if (keyval.size() != 2) { + LOG(error) << "Illegal command-line key/value string: " << token; + continue; + } + Str::trim(keyval[1]); + meta[keyval[0]] = keyval[1]; + } + }; + toKeyValPairs(Str::tokenize(mMeta, ';', true)); + + long startTF, endTF; + + const auto& payload = mCalibrator->getNoiseMap(); + // const auto& payload = mCalibrator->getNoiseMap(starTF, endTF); //For TimeSlot calibration + + setOutputDcs(payload); + + o2::ccdb::CcdbObjectInfo infoDcs(mPathDcs, "NoiseMap", "noise.root", meta, tstart, tend); + auto flNameDcs = o2::ccdb::CcdbApi::generateFileName("noise"); + auto imageDcs = o2::ccdb::CcdbApi::createObjectImage(&mNoiseMapForDcs, &infoDcs); + infoDcs.setFileName(flNameDcs); + LOG(info) << "Sending object " << infoDcs.getPath() << "/" << infoDcs.getFileName() + << " of size " << imageDcs->size() + << " bytes, valid for " << infoDcs.getStartValidityTimestamp() + << " : " << infoDcs.getEndValidityTimestamp(); + + using clbUtilsDcs = o2::calibration::Utils; + output.snapshot(Output{clbUtilsDcs::gDataOriginCDBPayload, "MFT_NoiseMap", 0}, *imageDcs.get()); + output.snapshot(Output{clbUtilsDcs::gDataOriginCDBWrapper, "MFT_NoiseMap", 0}, infoDcs); } void NoiseCalibratorSpec::endOfStream(o2::framework::EndOfStreamContext& ec) { - sendOutput(ec.outputs()); + if (mOutputType.compare("CCDB") == 0) { + LOG(info) << "Sending an object to Production-CCDB"; + sendOutputCcdb(ec.outputs()); + } else if (mOutputType.compare("DCS") == 0) { + LOG(info) << "Sending an object to DCS-CCDB"; + sendOutputDcs(ec.outputs()); + } else { + LOG(info) << "Sending an object to Production-CCDB and DCS-CCDB"; + sendOutputCcdbDcs(ec.outputs()); + } } ///_______________________________________ @@ -177,8 +326,10 @@ DataProcessorSpec getNoiseCalibratorSpec(bool useDigits) {"prob-threshold", VariantType::Float, 1.e-6f, {"Probability threshold for noisy pixels"}}, {"tstart", VariantType::Int64, -1ll, {"Start of validity timestamp"}}, {"tend", VariantType::Int64, -1ll, {"End of validity timestamp"}}, - {"path", VariantType::String, "/MFT/Calib/NoiseMap", {"Path to write to in CCDB"}}, + {"path-CCDB", VariantType::String, "/MFT/Calib/NoiseMap", {"Path to write to in CCDB"}}, + {"path-DCS", VariantType::String, "/MFT/Config/NoiseMap", {"Path to write to in CCDB"}}, {"meta", VariantType::String, "", {"meta data to write in CCDB"}}, + {"send-to-server", VariantType::String, "CCDB-DCS", {"meta data to write in DCS-CCDB"}}, {"hb-per-tf", VariantType::Int, 256, {"Number of HBF per TF"}}}}; } diff --git a/Detectors/ITSMFT/MFT/condition/src/MFTConditionLinkDef.h b/Detectors/ITSMFT/MFT/condition/src/MFTConditionLinkDef.h index 0d8668725245c..a764f49811c26 100644 --- a/Detectors/ITSMFT/MFT/condition/src/MFTConditionLinkDef.h +++ b/Detectors/ITSMFT/MFT/condition/src/MFTConditionLinkDef.h @@ -20,5 +20,6 @@ #pragma link C++ class std::unordered_map < o2::dcs::DataPointIdentifier, o2::mft::MFTDCSinfo> + ; #pragma link C++ class o2::mft::DCSConfigInfo + ; #pragma link C++ class std::vector < o2::mft::DCSConfigInfo> + ; +#pragma link C++ class std::vector < std::array < int, 4>> + ; #pragma link C++ class o2::mft::DCSConfigUtils + ; #endif