diff --git a/Detectors/ITSMFT/MFT/calibration/include/MFTCalibration/NoiseCalibratorSpec.h b/Detectors/ITSMFT/MFT/calibration/include/MFTCalibration/NoiseCalibratorSpec.h index c28e5d82ca46f..dee8fa4531bed 100644 --- a/Detectors/ITSMFT/MFT/calibration/include/MFTCalibration/NoiseCalibratorSpec.h +++ b/Detectors/ITSMFT/MFT/calibration/include/MFTCalibration/NoiseCalibratorSpec.h @@ -56,17 +56,17 @@ class NoiseCalibratorSpec : public Task void sendOutputCcdbMerge(DataAllocator& output); void sendOutputCcdbDcs(DataAllocator& output); void sendOutputDcs(DataAllocator& output); + void sendOutputDcsMerge(DataAllocator& output); void setOutputDcs(const o2::itsmft::NoiseMap& payload); o2::itsmft::NoiseMap mNoiseMap{936}; std::unique_ptr mCalibrator = nullptr; std::shared_ptr mCCDBRequest; std::string mPath; - std::string mPathMerge; + std::string mPathSingle; std::string mMeta; std::vector> mNoiseMapForDcs; std::string mPathDcs; - std::string mPathDcsMerge; std::string mOutputType; double mThresh; diff --git a/Detectors/ITSMFT/MFT/calibration/src/NoiseCalibratorSpec.cxx b/Detectors/ITSMFT/MFT/calibration/src/NoiseCalibratorSpec.cxx index a34d8cc5f2975..e958e6b1ba113 100644 --- a/Detectors/ITSMFT/MFT/calibration/src/NoiseCalibratorSpec.cxx +++ b/Detectors/ITSMFT/MFT/calibration/src/NoiseCalibratorSpec.cxx @@ -48,7 +48,7 @@ void NoiseCalibratorSpec::init(InitContext& ic) LOGP(info, "Setting the probability threshold to {} with relative error {}", probT, probTRelErr); mStopMeOnly = ic.options().get("stop-me-only"); mPath = ic.options().get("path-CCDB"); - mPathMerge = ic.options().get("path-CCDB-merge"); + mPathSingle = ic.options().get("path-CCDB-single"); mMeta = ic.options().get("meta"); mStart = ic.options().get("tstart"); @@ -173,7 +173,7 @@ void NoiseCalibratorSpec::sendOutputCcdbDcs(DataAllocator& output) 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); + o2::ccdb::CcdbObjectInfo info(mPathSingle, "NoiseMap", "noise.root", meta, tstart, tend); auto flName = o2::ccdb::CcdbApi::generateFileName("noise"); auto image = o2::ccdb::CcdbApi::createObjectImage(&payload, &info); info.setFileName(flName); @@ -244,7 +244,7 @@ void NoiseCalibratorSpec::sendOutputCcdb(DataAllocator& output) 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); + o2::ccdb::CcdbObjectInfo info(mPathSingle, "NoiseMap", "noise.root", meta, tstart, tend); auto flName = o2::ccdb::CcdbApi::generateFileName("noise"); auto image = o2::ccdb::CcdbApi::createObjectImage(&payload, &info); info.setFileName(flName); @@ -301,16 +301,16 @@ void NoiseCalibratorSpec::sendOutputCcdbMerge(DataAllocator& output) // const auto& payload = mCalibrator->getNoiseMap(starTF, endTF); //For TimeSlot calibration map headers; map filter; - auto* payloadPrev1 = api.retrieveFromTFileAny(mPath, filter, -1, &headers); + auto* payloadPrev1 = api.retrieveFromTFileAny(mPathSingle, filter, -1, &headers); long validtime = std::stol(headers["Valid-From"]); auto mergedPL = payload; if (validtime > 0) { validtime = validtime - 1; - auto* payloadPrev2 = api.retrieveFromTFileAny(mPath, filter, validtime, &headers); + auto* payloadPrev2 = api.retrieveFromTFileAny(mPathSingle, filter, validtime, &headers); auto bufferPL = payloadPrev2->merge(payloadPrev1); mergedPL = payload.merge(&bufferPL); } - o2::ccdb::CcdbObjectInfo info(mPathMerge, "NoiseMap", "noise.root", meta, tstart, tend); + o2::ccdb::CcdbObjectInfo info(mPath, "NoiseMap", "noise.root", meta, tstart, tend); auto flName = o2::ccdb::CcdbApi::generateFileName("noise"); auto image = o2::ccdb::CcdbApi::createObjectImage(&mergedPL, &info); info.setFileName(flName); @@ -382,6 +382,75 @@ void NoiseCalibratorSpec::sendOutputDcs(DataAllocator& output) output.snapshot(Output{clbUtilsDcs::gDataOriginCDBWrapper, "MFT_NoiseMap", 0}, infoDcs); } +void NoiseCalibratorSpec::sendOutputDcsMerge(DataAllocator& output) +{ + + LOG(info) << "DCS mode"; + + static bool done = false; + if (done) { + return; + } + done = true; + + 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; + + auto payload = mCalibrator->getNoiseMap(); + // const auto& payload = mCalibrator->getNoiseMap(starTF, endTF); //For TimeSlot calibration + + map headers; + map filter; + auto* payloadPrev1 = api.retrieveFromTFileAny(mPathSingle, filter, -1, &headers); + long validtime = std::stol(headers["Valid-From"]); + auto mergedPL = payload; + if (validtime > 0) { + validtime = validtime - 1; + auto* payloadPrev2 = api.retrieveFromTFileAny(mPathSingle, filter, validtime, &headers); + auto bufferPL = payloadPrev2->merge(payloadPrev1); + mergedPL = payload.merge(&bufferPL); + } + + setOutputDcs(mergedPL); + 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) { if (mOutputType.compare("CCDB") == 0) { @@ -390,11 +459,12 @@ void NoiseCalibratorSpec::endOfStream(o2::framework::EndOfStreamContext& ec) LOG(info) << "Sending an object to Production-CCDB-Merge"; sendOutputCcdbMerge(ec.outputs()); } else if (mOutputType.compare("DCS") == 0) { - LOG(info) << "Sending an object to DCS-CCDB"; - sendOutputDcs(ec.outputs()); + LOG(info) << "Sending an object to DCS-Merge"; + sendOutputDcsMerge(ec.outputs()); } else { - LOG(info) << "Sending an object to Production-CCDB and DCS-CCDB"; - sendOutputCcdbDcs(ec.outputs()); + LOG(info) << "Sending an object to Production-CCDB, Production-CCDB-Merge and DCS-Merge"; + sendOutputCcdb(ec.outputs()); + sendOutputDcsMerge(ec.outputs()); sendOutputCcdbMerge(ec.outputs()); } } @@ -454,7 +524,7 @@ DataProcessorSpec getNoiseCalibratorSpec(bool useDigits) {"tstart", VariantType::Int64, -1ll, {"Start of validity timestamp"}}, {"tend", VariantType::Int64, -1ll, {"End of validity timestamp"}}, {"path-CCDB", VariantType::String, "/MFT/Calib/NoiseMap", {"Path to write to in CCDB"}}, - {"path-CCDB-merge", VariantType::String, "/MFT/Calib/NoiseMapMerged", {"Path to write merged file to in CCDB"}}, + {"path-CCDB-single", VariantType::String, "/MFT/Calib/NoiseMapSingle", {"Path to write merged file to in CCDB"}}, {"path-DCS", VariantType::String, "/MFT/Config/NoiseMap", {"Path to write to in DCS"}}, {"meta", VariantType::String, "", {"meta data to write in CCDB"}}, {"send-to-server", VariantType::String, "CCDB-DCS", {"meta data to write in DCS-CCDB"}},