1919#include < array>
2020#include < vector>
2121#include < gsl/gsl>
22- #include " Framework/ConfigParamRegistry.h"
23- #include " Framework/ControlService.h"
24- #include " Framework/DataRefUtils.h"
2522#include " Framework/DeviceStateEnums.h"
26- #include " Framework/InputRecordWalker.h"
2723#include " Framework/InputSpec.h"
2824#include " Framework/Logger.h"
2925#include " Framework/Task.h"
26+ #include " Framework/CCDBParamSpec.h"
3027#include " DetectorsCalibration/Utils.h"
3128#include " CCDB/CcdbObjectInfo.h"
3229#include " DataFormatsMID/ColumnData.h"
@@ -71,15 +68,27 @@ class ChannelCalibratorDeviceDPL
7168
7269 void finaliseCCDB (o2::framework::ConcreteDataMatcher& matcher, void * obj)
7370 {
74- o2::base::GRPGeomHelper::instance ().finaliseCCDB (matcher, obj);
71+ if (matcher == of::ConcreteDataMatcher (header::gDataOriginMID , " FAKE_DEAD" , 0 )) {
72+ LOG (info) << " Update fake dead channels" ;
73+ auto * fakeDead = static_cast <std::vector<ColumnData>*>(obj);
74+ if (fakeDead) {
75+ mFakeDead = *fakeDead;
76+ }
77+ return ;
78+ }
79+
80+ if (o2::base::GRPGeomHelper::instance ().finaliseCCDB (matcher, obj)) {
81+ return ;
82+ }
7583 }
7684
7785 void run (of::ProcessingContext& pc)
7886 {
7987 if (mHasAlreadySent ) {
8088 return ;
8189 }
82- o2::base::GRPGeomHelper::instance ().checkUpdates (pc);
90+
91+ updateTimeDependentParams (pc);
8392
8493 std::array<gsl::span<const ColumnData>, 2 > calibData{pc.inputs ().get <gsl::span<ColumnData>>(" mid_noise" ), pc.inputs ().get <gsl::span<ColumnData>>(" mid_dead" )};
8594 auto deadRof = pc.inputs ().get <gsl::span<ROFRecord>>(" mid_dead_rof" );
@@ -121,9 +130,21 @@ class ChannelCalibratorDeviceDPL
121130 std::array<ChannelCalibrator, 2 > mCalibrators {}; // /! Channels calibrators
122131 std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest ; // /! CCDB request
123132 std::vector<ColumnData> mRefMasks {}; // /! Reference masks
133+ std::vector<ColumnData> mFakeDead {}; // /! Fake dead channels
124134 bool mHasAlreadySent = false ; // /! Flag that the object was already sent
125135 unsigned long int mNCalibTriggers = 0 ; // /! Number of calibration triggers since last send
126136
137+ void updateTimeDependentParams (o2::framework::ProcessingContext& pc)
138+ {
139+ // Triggers finalizeCCDB
140+ o2::base::GRPGeomHelper::instance ().checkUpdates (pc);
141+ static bool initOnceDone = false ;
142+ if (!initOnceDone) {
143+ initOnceDone = true ;
144+ pc.inputs ().get <std::vector<ColumnData>*>(" mid_fake_dead" );
145+ }
146+ }
147+
127148 void finalise (of::DataAllocator& output)
128149 {
129150 for (auto & calib : mCalibrators ) {
@@ -132,16 +153,34 @@ class ChannelCalibratorDeviceDPL
132153 sendOutput (output);
133154 }
134155
156+ std::vector<ColumnData> removeFakeDead (std::vector<ColumnData> dead)
157+ {
158+ ChannelMasksHandler fakeDeadHandler;
159+ for (auto & col : mFakeDead ) {
160+ fakeDeadHandler.switchOffChannels (col);
161+ }
162+ std::vector<ColumnData> realDead;
163+ for (auto & col : dead) {
164+ fakeDeadHandler.applyMask (col);
165+ if (!col.isEmpty ()) {
166+ realDead.emplace_back (col);
167+ }
168+ }
169+ return realDead;
170+ }
171+
135172 void sendOutput (of::DataAllocator& output)
136173 {
137174 // extract CCDB infos and calibration objects, convert it to TMemFile and send them to the output
138175
176+ auto dead = removeFakeDead (mCalibrators [1 ].getBadChannels ());
177+
139178 output.snapshot (of::Output{header::gDataOriginMID , " NOISY_CHANNELS" , 0 }, mCalibrators [0 ].getBadChannels ());
140- output.snapshot (of::Output{header::gDataOriginMID , " DEAD_CHANNELS" , 0 }, mCalibrators [ 1 ]. getBadChannels () );
179+ output.snapshot (of::Output{header::gDataOriginMID , " DEAD_CHANNELS" , 0 }, dead );
141180
142181 ChannelCalibratorFinalizer finalizer;
143182 finalizer.setReferenceMasks (mRefMasks );
144- finalizer.process (mCalibrators [0 ].getBadChannels (), mCalibrators [ 1 ]. getBadChannels () );
183+ finalizer.process (mCalibrators [0 ].getBadChannels (), dead );
145184 sendOutput (output, finalizer.getBadChannels (), mCalibrators [1 ].getCurrentTFInfo (), " MID/Calib/BadChannels" , 0 );
146185
147186 TObjString masks (finalizer.getMasksAsString ().c_str ());
@@ -175,6 +214,7 @@ of::DataProcessorSpec getChannelCalibratorSpec(const FEEIdConfig& feeIdConfig, c
175214 inputSpecs.emplace_back (" mid_noise_rof" , header::gDataOriginMID , " NOISEROF" );
176215 inputSpecs.emplace_back (" mid_dead" , header::gDataOriginMID , " DEAD" );
177216 inputSpecs.emplace_back (" mid_dead_rof" , header::gDataOriginMID , " DEADROF" );
217+ inputSpecs.emplace_back (" mid_fake_dead" , header::gDataOriginMID , " FAKE_DEAD" , 0 , of::Lifetime::Condition, of::ccdbParamSpec (" MID/Calib/FakeDeadChannels" ));
178218 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(true , // orbitResetTime
179219 true , // GRPECS=true
180220 false , // GRPLHCIF
0 commit comments