diff --git a/Detectors/FIT/FT0/calibration/workflow/FT0EventsPerBcProcessor-Workflow.cxx b/Detectors/FIT/FT0/calibration/workflow/FT0EventsPerBcProcessor-Workflow.cxx index 5cef707da2cca..38d634c20c828 100644 --- a/Detectors/FIT/FT0/calibration/workflow/FT0EventsPerBcProcessor-Workflow.cxx +++ b/Detectors/FIT/FT0/calibration/workflow/FT0EventsPerBcProcessor-Workflow.cxx @@ -35,6 +35,7 @@ o2::framework::WorkflowSpec defineDataProcessing(o2::framework::ConfigContext co outputs, AlgorithmSpec(adaptFromTask(ccdbRequest)), Options{ + {"save-to-file", VariantType::Bool, false, {"Save calibration object to local file"}}, {"slot-len-sec", VariantType::UInt32, 3600u, {"Duration of each slot in seconds"}}, {"one-object-per-run", VariantType::Bool, false, {"If set, workflow creates only one calibration object per run"}}, {"min-entries-number", VariantType::UInt32, 5000u, {"Minimum number of entries required for a slot to be valid"}}, @@ -45,4 +46,4 @@ o2::framework::WorkflowSpec defineDataProcessing(o2::framework::ConfigContext co WorkflowSpec workflow; workflow.emplace_back(dataProcessorSpec); return workflow; -} \ No newline at end of file +} diff --git a/Detectors/FIT/FT0/calibration/workflow/FT0EventsPerBcSpec.h b/Detectors/FIT/FT0/calibration/workflow/FT0EventsPerBcSpec.h index d493e2a606613..1d4d4a75842e8 100644 --- a/Detectors/FIT/FT0/calibration/workflow/FT0EventsPerBcSpec.h +++ b/Detectors/FIT/FT0/calibration/workflow/FT0EventsPerBcSpec.h @@ -35,6 +35,8 @@ class FT0EventsPerBcProcessor final : public o2::framework::Task void init(o2::framework::InitContext& ic) final { o2::base::GRPGeomHelper::instance().setRequest(mCCDBRequest); + mSaveToFile = ic.options().get("save-to-file"); + if (ic.options().hasOption("slot-len-sec")) { mSlotLenSec = ic.options().get("slot-len-sec"); } @@ -73,6 +75,10 @@ class FT0EventsPerBcProcessor final : public o2::framework::Task void run(o2::framework::ProcessingContext& pc) final { + const auto& tinfo = pc.services().get(); + if (tinfo.globalRunNumberChanged || mRunNoFromDH < 1) { // new run is starting + mRunNoFromDH = tinfo.runNumber; + } o2::base::GRPGeomHelper::instance().checkUpdates(pc); auto digits = pc.inputs().get>("digits"); o2::base::TFIDInfoHelper::fillTFIDInfo(pc, mCalibrator->getCurrentTFInfo()); @@ -107,6 +113,18 @@ class FT0EventsPerBcProcessor final : public o2::framework::Task << " bytes, valid for " << info->getStartValidityTimestamp() << " : " << info->getEndValidityTimestamp(); output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "EventsPerBc", idx}, *image.get()); output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "EventsPerBc", idx}, *info.get()); + if (mSaveToFile) { + std::string fnout = fmt::format("ft0eventsPerBC_run_{}_{}_{}.root", mRunNoFromDH, info->getStartValidityTimestamp(), info->getEndValidityTimestamp()); + try { + TFile flout(fnout.c_str(), "recreate"); + flout.WriteObjectAny(&payload, "o2::ft0::EventsPerBc", o2::ccdb::CcdbApi::CCDBOBJECT_ENTRY); + LOGP(info, R"(Saved to file, can upload as: o2-ccdb-upload -f {} --starttimestamp {} --endtimestamp {} -k "ccdb_object" --path {} -m "runNumber={};AdjustableEOV=true;")", + fnout, info->getStartValidityTimestamp(), info->getEndValidityTimestamp(), info->getPath(), mRunNoFromDH); + flout.Close(); + } catch (const std::exception& ex) { + LOGP(error, "failed to store object to file {}, error: {}", fnout, ex.what()); + } + } } if (tvxHists.size()) { @@ -118,6 +136,8 @@ class FT0EventsPerBcProcessor final : public o2::framework::Task std::shared_ptr mCCDBRequest; std::unique_ptr mCalibrator; bool mOneObjectPerRun; + bool mSaveToFile = false; + int mRunNoFromDH = 0; uint32_t mSlotLenSec; uint32_t mMinNumberOfEntries; int32_t mMinAmplitudeSideA; @@ -125,4 +145,4 @@ class FT0EventsPerBcProcessor final : public o2::framework::Task int32_t mMinSumOfAmplitude; }; } // namespace o2::calibration -#endif \ No newline at end of file +#endif