Skip to content

Commit 8568665

Browse files
committed
TRD vDrift calib uses proper CCDB output mechanism
1 parent 6e4572b commit 8568665

File tree

4 files changed

+47
-23
lines changed

4 files changed

+47
-23
lines changed

Detectors/TRD/calibration/include/TRDCalibration/CalibratorVdExB.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#include "DetectorsCalibration/TimeSlot.h"
2121
#include "DataFormatsTRD/Constants.h"
2222
#include "DataFormatsTRD/AngularResidHistos.h"
23+
#include "CCDB/CcdbObjectInfo.h"
24+
#include "DataFormatsTRD/CalVdriftExB.h"
2325

2426
#include "Rtypes.h"
2527
#include "TProfile.h"
@@ -60,12 +62,17 @@ class CalibratorVdExB final : public o2::calibration::TimeSlotCalibration<o2::tr
6062
void finalizeSlot(Slot& slot) final;
6163
Slot& emplaceNewSlot(bool front, TFType tStart, TFType tEnd) final;
6264

65+
const std::vector<o2::trd::CalVdriftExB>& getCcdbObjectVector() const { return mObjectVector; }
66+
std::vector<o2::ccdb::CcdbObjectInfo>& getCcdbObjectInfoVector() { return mInfoVector; }
67+
6368
void initProcessing();
6469

6570
private:
6671
bool mInitDone{false}; ///< flag to avoid creating the TProfiles multiple times
6772
size_t mMinEntries; ///< minimum total number of angular deviations (on average ~3 entries per bin for each TRD chamber)
6873
FitFunctor mFitFunctor; ///< used for minimization procedure
74+
std::vector<o2::ccdb::CcdbObjectInfo> mInfoVector; ///< vector of CCDB infos; each element is filled with CCDB description of accompanying CCDB calibration object
75+
std::vector<o2::trd::CalVdriftExB> mObjectVector; ///< vector of CCDB calibration objects; the extracted vDrift and ExB per chamber for given slot
6976
ClassDefOverride(CalibratorVdExB, 1);
7077
};
7178

Detectors/TRD/calibration/src/CalibratorVdExB.cxx

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
/// \author Ole Schmidt
1515

1616
#include "TRDCalibration/CalibratorVdExB.h"
17-
#include "DataFormatsTRD/CalVdriftExB.h"
1817
#include "Fit/Fitter.h"
1918
#include "TStopwatch.h"
2019
#include "CCDB/CcdbApi.h"
@@ -23,6 +22,7 @@
2322
#include <map>
2423
#include <memory>
2524
#include "CommonUtils/NameConf.h"
25+
#include "CommonUtils/MemFileHelper.h"
2626

2727
using namespace o2::trd::constants;
2828

@@ -89,8 +89,9 @@ using Slot = o2::calibration::TimeSlot<AngularResidHistos>;
8989

9090
void CalibratorVdExB::initOutput()
9191
{
92-
// prepare output objects which will go to CCDB
93-
// nothing to be done
92+
// reset the CCDB output vectors
93+
mInfoVector.clear();
94+
mObjectVector.clear();
9495
}
9596

9697
void CalibratorVdExB::initProcessing()
@@ -153,22 +154,20 @@ void CalibratorVdExB::finalizeSlot(Slot& slot)
153154
timer.Stop();
154155
LOGF(info, "Done fitting angular residual histograms. CPU time: %f, real time: %f", timer.CpuTime(), timer.RealTime());
155156

156-
// write results to CCDB
157-
o2::ccdb::CcdbApi ccdb;
158-
ccdb.init(o2::base::NameConf::getCCDBServer());
159-
// ccdb.init("http://localhost:8080");
160-
std::map<std::string, std::string> metadata; // TODO: do we want to store any meta data?
157+
// assemble CCDB object
161158
CalVdriftExB calObject;
162159
for (int iDet = 0; iDet < MAXCHAMBER; ++iDet) {
163160
// OS: what about chambers for which we had no data in this slot? should we use the initial parameters or something else?
164161
// maybe it is better not to overwrite an older result if we don't have anything better?
165162
calObject.setVdrift(iDet, vdFitResults[iDet]);
166163
calObject.setExB(iDet, laFitResults[iDet]);
167164
}
168-
auto timeStamp = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
169-
auto timeStampEnd = timeStamp;
170-
timeStampEnd += 1e3 * 60 * 60 * 24 * 7; // set validity of 7 days
171-
ccdb.storeAsTFileAny(&calObject, "TRD/Calib/CalVdriftExB", metadata, timeStamp, timeStampEnd);
165+
auto clName = o2::utils::MemFileHelper::getClassName(calObject);
166+
auto flName = o2::ccdb::CcdbApi::generateFileName(clName);
167+
std::map<std::string, std::string> metadata; // TODO: do we want to store any meta data?
168+
long startValidity = slot.getStartTimeMS() - 10 * o2::ccdb::CcdbObjectInfo::SECOND;
169+
mInfoVector.emplace_back("TRD/Calib/CalVdriftExB", clName, flName, metadata, startValidity, startValidity + o2::ccdb::CcdbObjectInfo::HOUR);
170+
mObjectVector.push_back(calObject);
172171
}
173172

174173
Slot& CalibratorVdExB::emplaceNewSlot(bool front, TFType tStart, TFType tEnd)

Detectors/TRD/workflow/include/TRDWorkflow/VdAndExBCalibSpec.h

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ class VdAndExBCalibDevice : public o2::framework::Task
4343
{
4444
o2::base::GRPGeomHelper::instance().setRequest(mCCDBRequest);
4545
int minEnt = ic.options().get<int>("min-entries");
46-
auto slotL = ic.options().get<uint32_t>("tf-per-slot");
46+
auto slotL = ic.options().get<uint32_t>("sec-per-slot");
4747
auto delay = ic.options().get<uint32_t>("max-delay");
4848
mCalibrator = std::make_unique<o2::trd::CalibratorVdExB>(minEnt);
49-
mCalibrator->setSlotLength(slotL);
49+
mCalibrator->setSlotLengthInSeconds(slotL);
5050
mCalibrator->setMaxSlotsDelay(delay);
5151
}
5252

@@ -78,9 +78,26 @@ class VdAndExBCalibDevice : public o2::framework::Task
7878
//________________________________________________________________
7979
void sendOutput(DataAllocator& output)
8080
{
81-
// See LHCClockCalibratorSpec.h
82-
// Before this can be implemented the output CCDB objects need to be defined
83-
// and added to CalibratorVdExB
81+
// extract CCDB infos and calibration objects, convert it to TMemFile and send them to the output
82+
// TODO in principle, this routine is generic, can be moved to Utils.h
83+
84+
using clbUtils = o2::calibration::Utils;
85+
const auto& payloadVec = mCalibrator->getCcdbObjectVector();
86+
auto& infoVec = mCalibrator->getCcdbObjectInfoVector(); // use non-const version as we update it
87+
assert(payloadVec.size() == infoVec.size());
88+
89+
for (uint32_t i = 0; i < payloadVec.size(); i++) {
90+
auto& w = infoVec[i];
91+
auto image = o2::ccdb::CcdbApi::createObjectImage(&payloadVec[i], &w);
92+
LOG(info) << "Sending object " << w.getPath() << "/" << w.getFileName() << " of size " << image->size()
93+
<< " bytes, valid for " << w.getStartValidityTimestamp() << " : " << w.getEndValidityTimestamp();
94+
95+
output.snapshot(Output{clbUtils::gDataOriginCDBPayload, "VDRIFTEXB", i}, *image.get()); // vector<char>
96+
output.snapshot(Output{clbUtils::gDataOriginCDBWrapper, "VDRIFTEXB", i}, w); // root-serialized
97+
}
98+
if (payloadVec.size()) {
99+
mCalibrator->initOutput(); // reset the outputs once they are already sent
100+
}
84101
}
85102
};
86103

@@ -95,8 +112,8 @@ DataProcessorSpec getTRDVdAndExBCalibSpec()
95112
using clbUtils = o2::calibration::Utils;
96113

97114
std::vector<OutputSpec> outputs;
98-
//outputs.emplace_back(ConcreteDataTypeMatcher{clbUtils::gDataOriginCLB, clbUtils::gDataDescriptionCLBPayload});
99-
//outputs.emplace_back(ConcreteDataTypeMatcher{clbUtils::gDataOriginCLB, clbUtils::gDataDescriptionCLBInfo});
115+
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "VDRIFTEXB"}, Lifetime::Sporadic);
116+
outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "VDRIFTEXB"}, Lifetime::Sporadic);
100117
std::vector<InputSpec> inputs{{"input", "TRD", "ANGRESHISTS"}};
101118
auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(true, // orbitResetTime
102119
true, // GRPECS=true
@@ -111,9 +128,9 @@ DataProcessorSpec getTRDVdAndExBCalibSpec()
111128
outputs,
112129
AlgorithmSpec{adaptFromTask<device>(ccdbRequest)},
113130
Options{
114-
{"tf-per-slot", VariantType::UInt32, 5u, {"number of TFs per calibration time slot"}},
115-
{"max-delay", VariantType::UInt32, 90'000u, {"number of slots in past to consider"}}, // 15 minutes delay, 10ms TF
116-
{"min-entries", VariantType::Int, 500, {"minimum number of entries to fit single time slot"}}}};
131+
{"sec-per-slot", VariantType::UInt32, 900u, {"number of seconds per calibration time slot"}},
132+
{"max-delay", VariantType::UInt32, 2u, {"number of slots in past to consider"}},
133+
{"min-entries", VariantType::Int, 40'000, {"minimum number of entries to fit single time slot"}}}}; // around 3 entries per bin per chamber
117134
}
118135

119136
} // namespace framework

Detectors/TRD/workflow/src/trd-calib-workflow.cxx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ void customize(std::vector<o2::framework::ConfigParamSpec>& workflowOptions)
2020
{
2121
// option allowing to set parameters
2222
std::vector<o2::framework::ConfigParamSpec> options{
23-
{"enable-root-input", o2::framework::VariantType::Bool, false, {"enable root-files input readers"}}};
23+
{"enable-root-input", o2::framework::VariantType::Bool, false, {"enable root-files input readers"}},
24+
{"configKeyValues", VariantType::String, "", {"Semicolon separated key=value strings"}}};
2425

2526
std::swap(workflowOptions, options);
2627
}

0 commit comments

Comments
 (0)