From 6c7c61da95d4dde8a0f9fb5116f576dc40afed0f Mon Sep 17 00:00:00 2001 From: Ole Schmidt Date: Tue, 15 Mar 2022 17:31:41 +0100 Subject: [PATCH] TrackletTransformer uses DPL CCDB mechanism --- .../include/TRDBase/TrackletTransformer.h | 18 ++++------- .../TRD/base/src/TrackletTransformer.cxx | 32 ++++--------------- .../TRDWorkflow/TRDTrackletTransformerSpec.h | 8 +++-- .../src/TRDTrackletTransformerSpec.cxx | 30 ++++++++++------- .../src/TRDTrackletTransformerWorkflow.cxx | 4 +-- 5 files changed, 38 insertions(+), 54 deletions(-) diff --git a/Detectors/TRD/base/include/TRDBase/TrackletTransformer.h b/Detectors/TRD/base/include/TRDBase/TrackletTransformer.h index 3e05a03c63b67..8c33391b19b98 100644 --- a/Detectors/TRD/base/include/TRDBase/TrackletTransformer.h +++ b/Detectors/TRD/base/include/TRDBase/TrackletTransformer.h @@ -16,7 +16,6 @@ #include "DataFormatsTRD/Tracklet64.h" #include "DataFormatsTRD/CalibratedTracklet.h" #include "DataFormatsTRD/CalVdriftExB.h" -#include "CCDB/BasicCCDBManager.h" namespace o2 { @@ -26,9 +25,11 @@ namespace trd class TrackletTransformer { public: - TrackletTransformer(); + TrackletTransformer() = default; ~TrackletTransformer() = default; + void init(); + float getXCathode() { return mXCathode; } float getXAnode() { return mXAnode; } float getXDrift() { return mXDrift; } @@ -39,12 +40,7 @@ class TrackletTransformer void setXDrift(float x) { mXDrift = x; } void setXtb0(float x) { mXtb0 = x; } - bool hasCalibration() { return mCalibration != nullptr; } - - void loadPadPlane(int hcid); - - // use 555555 for default calibration values - void loadCalibrationParameters(int timestamp); + void setCalVdriftExB(const CalVdriftExB* cal) { mCalVdriftExB = cal; }; float calculateY(int hcid, int column, int position); @@ -61,15 +57,15 @@ class TrackletTransformer double getTimebin(int detector, double x); private: - o2::trd::Geometry* mGeo; - const o2::trd::PadPlane* mPadPlane; + Geometry* mGeo{nullptr}; + const PadPlane* mPadPlane{nullptr}; float mXCathode; float mXAnode; float mXDrift; float mXtb0; - o2::trd::CalVdriftExB* mCalibration; + const CalVdriftExB* mCalVdriftExB{nullptr}; }; } // namespace trd diff --git a/Detectors/TRD/base/src/TrackletTransformer.cxx b/Detectors/TRD/base/src/TrackletTransformer.cxx index 567dfbc0b0d05..485b0e8482464 100644 --- a/Detectors/TRD/base/src/TrackletTransformer.cxx +++ b/Detectors/TRD/base/src/TrackletTransformer.cxx @@ -16,7 +16,7 @@ using namespace o2::trd; using namespace o2::trd::constants; -TrackletTransformer::TrackletTransformer() +void TrackletTransformer::init() { o2::base::GeometryManager::loadGeometry(); mGeo = Geometry::instance(); @@ -32,27 +32,6 @@ TrackletTransformer::TrackletTransformer() mXtb0 = -100; } -void TrackletTransformer::loadPadPlane(int detector) -{ - int stack = mGeo->getStack(detector); - int layer = mGeo->getLayer(detector); - mPadPlane = mGeo->getPadPlane(layer, stack); -} - -void TrackletTransformer::loadCalibrationParameters(int timestamp) -{ - LOG(info) << "loading calibration parameters with timestamp: " << timestamp; - - auto& ccdbmgr = o2::ccdb::BasicCCDBManager::instance(); - ccdbmgr.setTimestamp(timestamp); - - mCalibration = ccdbmgr.get("TRD/Calib/CalVdriftExB"); - - if (mCalibration == nullptr) { - LOG(error) << " failed to get vDrift and ExB parameters from ccdb"; - } -} - float TrackletTransformer::calculateY(int hcid, int column, int position) { double padWidth = mPadPlane->getWidthIPad(); @@ -78,8 +57,8 @@ float TrackletTransformer::calculateDy(int detector, int slope) { double padWidth = mPadPlane->getWidthIPad(); - float vDrift = mCalibration->getVdrift(detector); - float exb = mCalibration->getExB(detector); + float vDrift = mCalVdriftExB->getVdrift(detector); + float exb = mCalVdriftExB->getExB(detector); // dy = slope * nTimeBins * padWidth * GRANULARITYTRKLSLOPE; // nTimeBins should be number of timebins in drift region. 1 timebin is 100 nanosecond @@ -123,7 +102,8 @@ CalibratedTracklet TrackletTransformer::transformTracklet(Tracklet64 tracklet) auto slope = tracklet.getSlopeBinSigned(); // calculate raw local chamber space point - loadPadPlane(detector); + mPadPlane = mGeo->getPadPlane(detector); + float x = getXDrift(); float y = calculateY(hcid, column, position); float z = calculateZ(padrow); @@ -146,7 +126,7 @@ CalibratedTracklet TrackletTransformer::transformTracklet(Tracklet64 tracklet) double TrackletTransformer::getTimebin(int detector, double x) { // calculate timebin from x position within chamber - float vDrift = mCalibration->getVdrift(detector); + float vDrift = mCalVdriftExB->getVdrift(detector); double t0 = 4.0; // time (in timebins) of start of drift region double timebin; diff --git a/Detectors/TRD/workflow/include/TRDWorkflow/TRDTrackletTransformerSpec.h b/Detectors/TRD/workflow/include/TRDWorkflow/TRDTrackletTransformerSpec.h index 40b84464270c5..46880a553db8d 100644 --- a/Detectors/TRD/workflow/include/TRDWorkflow/TRDTrackletTransformerSpec.h +++ b/Detectors/TRD/workflow/include/TRDWorkflow/TRDTrackletTransformerSpec.h @@ -23,19 +23,21 @@ namespace trd class TRDTrackletTransformerSpec : public o2::framework::Task { public: - TRDTrackletTransformerSpec(std::shared_ptr dataRequest, bool trigRecFilterActive, int timestamp) : mDataRequest(dataRequest), mTrigRecFilterActive(trigRecFilterActive), mTimestamp(timestamp){}; + TRDTrackletTransformerSpec(std::shared_ptr dataRequest, bool trigRecFilterActive) : mDataRequest(dataRequest), mTrigRecFilterActive(trigRecFilterActive){}; ~TRDTrackletTransformerSpec() override = default; void init(o2::framework::InitContext& ic) override; void run(o2::framework::ProcessingContext& pc) override; + void finaliseCCDB(framework::ConcreteDataMatcher& matcher, void* obj) final; private: + void updateTimeDependentParams(framework::ProcessingContext& pc); + bool mTrigRecFilterActive; ///< if true, transform only TRD tracklets for which ITS data is available std::shared_ptr mDataRequest; - int mTimestamp; TrackletTransformer mTransformer; }; -o2::framework::DataProcessorSpec getTRDTrackletTransformerSpec(bool trigRecFilterActive, int timestamp); +o2::framework::DataProcessorSpec getTRDTrackletTransformerSpec(bool trigRecFilterActive); } // end namespace trd } // end namespace o2 diff --git a/Detectors/TRD/workflow/src/TRDTrackletTransformerSpec.cxx b/Detectors/TRD/workflow/src/TRDTrackletTransformerSpec.cxx index 9288c22b5a4d0..e30cd474427cd 100644 --- a/Detectors/TRD/workflow/src/TRDTrackletTransformerSpec.cxx +++ b/Detectors/TRD/workflow/src/TRDTrackletTransformerSpec.cxx @@ -17,6 +17,7 @@ #include "DataFormatsTRD/Tracklet64.h" #include "DataFormatsTRD/CalibratedTracklet.h" #include "CommonDataFormat/IRFrame.h" +#include "Framework/CCDBParamSpec.h" using namespace o2::framework; using namespace o2::globaltracking; @@ -28,24 +29,17 @@ namespace trd void TRDTrackletTransformerSpec::init(o2::framework::InitContext& ic) { - LOG(info) << "Initializing tracklet transformer"; - mTransformer.loadCalibrationParameters(mTimestamp); + mTransformer.init(); } void TRDTrackletTransformerSpec::run(o2::framework::ProcessingContext& pc) { LOG(info) << "Running tracklet transformer"; - if (!mTransformer.hasCalibration()) { - // ccdb object was not found for specified timestamp - return; - } + updateTimeDependentParams(pc); o2::globaltracking::RecoContainer inputData; inputData.collectData(pc, *mDataRequest); - //auto tracklets = inputData.getTRDTracklets(); - //auto trigRecs = inputData.getTRDTriggerRecords(); - auto tracklets = pc.inputs().get>("trdtracklets"); auto trigRecs = pc.inputs().get>("trdtriggerrec"); @@ -116,7 +110,20 @@ void TRDTrackletTransformerSpec::run(o2::framework::ProcessingContext& pc) pc.outputs().snapshot(Output{"TRD", "TRIGRECMASK", 0, Lifetime::Timeframe}, trigRecBitfield); } -o2::framework::DataProcessorSpec getTRDTrackletTransformerSpec(bool trigRecFilterActive, int timestamp) +void TRDTrackletTransformerSpec::updateTimeDependentParams(ProcessingContext& pc) +{ + pc.inputs().get("calvdexb"); // just to trigger the finaliseCCDB +} + +void TRDTrackletTransformerSpec::finaliseCCDB(ConcreteDataMatcher& matcher, void* obj) +{ + if (matcher == ConcreteDataMatcher("TRD", "CALVDRIFTEXB", 0)) { + LOG(info) << "CalVdriftExB object has been updated"; + mTransformer.setCalVdriftExB((const o2::trd::CalVdriftExB*)obj); + } +} + +o2::framework::DataProcessorSpec getTRDTrackletTransformerSpec(bool trigRecFilterActive) { std::shared_ptr dataRequest = std::make_shared(); if (trigRecFilterActive) { @@ -125,6 +132,7 @@ o2::framework::DataProcessorSpec getTRDTrackletTransformerSpec(bool trigRecFilte auto& inputs = dataRequest->inputs; inputs.emplace_back("trdtracklets", "TRD", "TRACKLETS", 0, Lifetime::Timeframe); inputs.emplace_back("trdtriggerrec", "TRD", "TRKTRGRD", 0, Lifetime::Timeframe); + inputs.emplace_back("calvdexb", "TRD", "CALVDRIFTEXB", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/CalVdriftExB")); std::vector outputs; outputs.emplace_back("TRD", "CTRACKLETS", 0, Lifetime::Timeframe); @@ -134,7 +142,7 @@ o2::framework::DataProcessorSpec getTRDTrackletTransformerSpec(bool trigRecFilte "TRDTRACKLETTRANSFORMER", inputs, outputs, - AlgorithmSpec{adaptFromTask(dataRequest, trigRecFilterActive, timestamp)}, + AlgorithmSpec{adaptFromTask(dataRequest, trigRecFilterActive)}, Options{}}; } diff --git a/Detectors/TRD/workflow/src/TRDTrackletTransformerWorkflow.cxx b/Detectors/TRD/workflow/src/TRDTrackletTransformerWorkflow.cxx index 5ec75e5d63161..f9faaeb2b8e30 100644 --- a/Detectors/TRD/workflow/src/TRDTrackletTransformerWorkflow.cxx +++ b/Detectors/TRD/workflow/src/TRDTrackletTransformerWorkflow.cxx @@ -25,7 +25,6 @@ void customize(std::vector& workflowOptions) {"disable-mc", o2::framework::VariantType::Bool, false, {"Disable MC labels"}}, {"disable-root-input", o2::framework::VariantType::Bool, false, {"disable root-files input reader"}}, {"disable-root-output", o2::framework::VariantType::Bool, false, {"disable root-files output writer"}}, - {"timestamp", o2::framework::VariantType::Int, 5555555, {"timestamp for CCDB calibration objects"}}, {"filter-trigrec", o2::framework::VariantType::Bool, false, {"ignore interaction records without ITS data"}}, {"configKeyValues", VariantType::String, "", {"Semicolon separated key=value strings ..."}}}; @@ -42,7 +41,6 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext) // MC labels are passed through for the global tracking downstream // in case ROOT output is requested the tracklet labels are duplicated bool useMC = !configcontext.options().get("disable-mc"); - int timestamp = configcontext.options().get("timestamp"); WorkflowSpec spec; @@ -55,7 +53,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext) o2::globaltracking::InputHelper::addInputSpecsIRFramesITS(configcontext, spec); } - spec.emplace_back(o2::trd::getTRDTrackletTransformerSpec(trigRecFilterActive, timestamp)); + spec.emplace_back(o2::trd::getTRDTrackletTransformerSpec(trigRecFilterActive)); if (!configcontext.options().get("disable-root-output")) { spec.emplace_back(o2::trd::getTRDCalibratedTrackletWriterSpec(useMC));