Skip to content

Commit 7888d1a

Browse files
sevdokimshahor02
authored andcommitted
CPV: add persistent bad channels reading from CCDB
1 parent c825d65 commit 7888d1a

3 files changed

Lines changed: 81 additions & 47 deletions

File tree

Detectors/CPV/calib/include/CPVCalibration/NoiseCalibrator.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,15 @@ class NoiseCalibrator final : public o2::calibration::TimeSlotCalibration<o2::cp
4848
std::vector<o2::ccdb::CcdbObjectInfo>& getCcdbInfoBadChannelMapVector() { return mCcdbInfoBadChannelMapVec; }
4949
const std::vector<o2::cpv::BadChannelMap>& getBadChannelMapVector() const { return mBadChannelMapVec; }
5050

51-
void setPedEfficiencies(std::vector<float>* pedEffs) { mPedEfficiencies.reset(pedEffs); }
52-
void setDeadChannels(std::vector<int>* deadChs) { mDeadChannels.reset(deadChs); }
53-
void setHighPedChannels(std::vector<int>* highPeds) { mHighPedChannels.reset(highPeds); }
54-
bool isSettedPedEfficiencies() { return mPedEfficiencies.get() == nullptr ? false : true; }
55-
bool isSettedDeadChannels() { return mDeadChannels.get() == nullptr ? false : true; }
56-
bool isSettedHighPedChannels() { return mHighPedChannels.get() == nullptr ? false : true; }
51+
void setPedEfficiencies(std::vector<float>* pedEffs) { mPedEfficiencies = pedEffs; }
52+
void setDeadChannels(std::vector<int>* deadChs) { mDeadChannels = deadChs; }
53+
void setHighPedChannels(std::vector<int>* highPeds) { mHighPedChannels = highPeds; }
54+
void setPersistentBadChannels(std::vector<int>* persBadChs) { mPersistentBadChannels = persBadChs; }
55+
56+
bool isSettedPedEfficiencies() { return mPedEfficiencies == nullptr ? false : true; }
57+
bool isSettedDeadChannels() { return mDeadChannels == nullptr ? false : true; }
58+
bool isSettedHighPedChannels() { return mHighPedChannels == nullptr ? false : true; }
59+
bool isSettedPersistentBadChannels() { return mPersistentBadChannels == nullptr ? false : true; }
5760

5861
bool hasEnoughData(const NoiseTimeSlot& slot) const final
5962
{
@@ -66,9 +69,10 @@ class NoiseCalibrator final : public o2::calibration::TimeSlotCalibration<o2::cp
6669
void configParameters();
6770

6871
private:
69-
std::unique_ptr<std::vector<float>> mPedEfficiencies = nullptr;
70-
std::unique_ptr<std::vector<int>> mDeadChannels = nullptr;
71-
std::unique_ptr<std::vector<int>> mHighPedChannels = nullptr;
72+
std::vector<float>* mPedEfficiencies = nullptr;
73+
std::vector<int>* mDeadChannels = nullptr;
74+
std::vector<int>* mHighPedChannels = nullptr;
75+
std::vector<int>* mPersistentBadChannels = nullptr;
7276
uint32_t mMinEvents = 100;
7377
float mNoiseFrequencyCriteria = 0.5; // how often channel should appear to be considered as noisy
7478
float mToleratedChannelEfficiencyLow = 0.9;

Detectors/CPV/calib/src/NoiseCalibrator.cxx

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -94,50 +94,68 @@ void NoiseCalibrator::finalizeSlot(NoiseTimeSlot& slot)
9494
LOG(info) << "NoiseCalibrator::finalizeSlot() : finalizing slot "
9595
<< slot.getTFStart() << " <= TF <= " << slot.getTFEnd() << " with " << calibData->mNEvents << " events.";
9696
o2::cpv::BadChannelMap* badMap = new o2::cpv::BadChannelMap();
97-
bool badMapBool[Geometry::kNCHANNELS] = {};
97+
bool badMapBool[Geometry::kNCHANNELS] = {false};
98+
99+
// persistent bad channels from ccdb
100+
if (mPersistentBadChannels) {
101+
LOG(info) << "NoiseCalibrator::finalizeSlot() : adding " << mPersistentBadChannels->size() << " permanent bad channels";
102+
for (int i = 0; i < mPersistentBadChannels->size(); i++) {
103+
badMapBool[(*mPersistentBadChannels)[i]] = true;
104+
}
105+
}
98106

99107
// handle data from pedestal run first
100108
// check pedestal efficiencies
109+
int badEfficiencyChannels = 0;
101110
if (mPedEfficiencies) {
102-
LOG(info) << "NoiseCalibrator::finalizeSlot() : checking ped efficiencies";
111+
LOG(info) << "NoiseCalibrator::finalizeSlot() : checking ped efficiencies from pedestal run";
103112
for (int i = 0; i < Geometry::kNCHANNELS; i++) {
104-
badMapBool[i] = false;
105-
if ((*mPedEfficiencies.get())[i] > mToleratedChannelEfficiencyHigh ||
106-
(*mPedEfficiencies.get())[i] < mToleratedChannelEfficiencyLow) {
113+
if ((*mPedEfficiencies)[i] > mToleratedChannelEfficiencyHigh ||
114+
(*mPedEfficiencies)[i] < mToleratedChannelEfficiencyLow) {
107115
badMapBool[i] = true;
116+
badEfficiencyChannels++;
108117
}
109118
}
119+
LOG(info) << "NoiseCalibrator::finalizeSlot() : found " << badEfficiencyChannels << " bad ped efficiency channels";
110120
}
111121

112122
// check dead channels
113123
if (mDeadChannels) {
114-
LOG(info) << "NoiseCalibrator::finalizeSlot() : checking dead channels";
115-
for (unsigned int i = 0; i < mDeadChannels.get()->size(); i++) {
116-
badMapBool[(*mDeadChannels.get())[i]] = true;
124+
LOG(info) << "NoiseCalibrator::finalizeSlot() : adding " << mDeadChannels->size() << " dead channels from pedestal run";
125+
for (int i = 0; i < mDeadChannels->size(); i++) {
126+
badMapBool[(*mDeadChannels)[i]] = true;
117127
}
118128
}
119129

120130
// check channels with very high pedestal value (> 511)
121131
if (mHighPedChannels) {
122-
LOG(info) << "NoiseCalibrator::finalizeSlot() : checking high ped channels";
123-
for (unsigned int i = 0; i < mHighPedChannels.get()->size(); i++) {
124-
badMapBool[(*mHighPedChannels.get())[i]] = true;
132+
LOG(info) << "NoiseCalibrator::finalizeSlot() : adding " << mHighPedChannels->size() << " high ped channels from pedestal run";
133+
for (int i = 0; i < mHighPedChannels->size(); i++) {
134+
badMapBool[(*mHighPedChannels)[i]] = true;
125135
}
126136
}
127137

128138
// find noisy channels
139+
int noisyChannels = 0;
140+
LOG(info) << "NoiseCalibrator::finalizeSlot() : checking noisy channels";
129141
for (int i = 0; i < Geometry::kNCHANNELS; i++) {
130142
if (float(calibData->mOccupancyMap[i]) / calibData->mNEvents > mNoiseFrequencyCriteria) {
131143
badMapBool[i] = true;
144+
noisyChannels++;
132145
}
133146
}
147+
LOG(info) << "NoiseCalibrator::finalizeSlot() : found " << noisyChannels << " noisy channels";
134148

135149
// fill BadChannelMap and send it to output
150+
int totalBadChannels = 0;
136151
for (unsigned short i = 0; i < Geometry::kNCHANNELS; i++) {
137152
if (badMapBool[i]) {
138153
badMap->addBadChannel(i);
154+
totalBadChannels++;
139155
}
140156
}
157+
LOG(info) << "NoiseCalibrator::finalizeSlot() : created bad channel map with " << totalBadChannels << " bad channels in total";
158+
141159
mBadChannelMapVec.push_back(*badMap);
142160
// metadata for o2::cpv::BadChannelMap
143161
std::map<std::string, std::string> metaData;

Detectors/CPV/calib/testWorkflow/NoiseCalibratorSpec.h

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,34 @@ class CPVNoiseCalibratorSpec : public o2::framework::Task
5959
void finaliseCCDB(o2::framework::ConcreteDataMatcher& matcher, void* obj) final
6060
{
6161
o2::base::GRPGeomHelper::instance().finaliseCCDB(matcher, obj);
62+
if (matcher == framework::ConcreteDataMatcher("CPV", "CPV_PedEffs", 0)) {
63+
LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : accessing CPV/PedestalRun/ChannelEfficiencies";
64+
auto pedEffs = static_cast<std::vector<float>*>(obj);
65+
mCalibrator->setPedEfficiencies(pedEffs);
66+
LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : I got pedestal efficiencies vetor of size " << pedEffs->size();
67+
return;
68+
}
69+
if (matcher == framework::ConcreteDataMatcher("CPV", "CPV_DeadChnls", 0)) {
70+
LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : accessing CPV/PedestalRun/DeadChannels";
71+
auto deadChs = static_cast<std::vector<int>*>(obj);
72+
mCalibrator->setDeadChannels(deadChs);
73+
LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : I got dead channels vetor of size " << deadChs->size();
74+
return;
75+
}
76+
if (matcher == framework::ConcreteDataMatcher("CPV", "CPV_HighThrs", 0)) {
77+
LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : accessing CPV/PedestalRun/HighPedChannels";
78+
auto highPeds = static_cast<std::vector<int>*>(obj);
79+
mCalibrator->setHighPedChannels(highPeds);
80+
LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : I got high pedestals vetor of size " << highPeds->size();
81+
return;
82+
}
83+
if (matcher == framework::ConcreteDataMatcher("CPV", "CPV_PersiBads", 0)) {
84+
LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : accessing CPV/Config/PersistentBadChannels";
85+
auto persBadChs = static_cast<std::vector<int>*>(obj);
86+
mCalibrator->setPersistentBadChannels(persBadChs);
87+
LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : I got persistent bad channels vector of size " << persBadChs->size();
88+
return;
89+
}
6290
}
6391

6492
//_________________________________________________________________
@@ -68,9 +96,14 @@ class CPVNoiseCalibratorSpec : public o2::framework::Task
6896
o2::base::TFIDInfoHelper::fillTFIDInfo(pc, mCalibrator->getCurrentTFInfo());
6997
TFType tfcounter = mCalibrator->getCurrentTFInfo().startTime;
7098

71-
// update config
99+
// fetch ccdb objects
72100
static bool isConfigFetched = false;
73101
if (!isConfigFetched) {
102+
pc.inputs().get<std::vector<float>*>("pedeffs");
103+
pc.inputs().get<std::vector<int>*>("persbadchs");
104+
pc.inputs().get<std::vector<int>*>("deadchs");
105+
pc.inputs().get<std::vector<int>*>("highpeds");
106+
74107
LOG(info) << "NoiseCalibratorSpec::run() : fetching o2::cpv::CPVCalibParams from CCDB";
75108
pc.inputs().get<o2::cpv::CPVCalibParams*>("calibparams");
76109
LOG(info) << "NoiseCalibratorSpec::run() : o2::cpv::CPVCalibParams::Instance() now is following:";
@@ -79,32 +112,6 @@ class CPVNoiseCalibratorSpec : public o2::framework::Task
79112
isConfigFetched = true;
80113
}
81114

82-
// read pedestal efficiencies, dead and high ped channels from pedestal run
83-
// do it only once as they don't change during noise scan
84-
if (!mCalibrator->isSettedPedEfficiencies()) {
85-
const auto pedEffs = pc.inputs().get<std::vector<float>*>("pedeffs");
86-
if (pedEffs) {
87-
mCalibrator->setPedEfficiencies(new std::vector<float>(pedEffs->begin(), pedEffs->end()));
88-
LOG(info) << "NoiseCalibratorSpec()::run() : I got pedestal efficiencies vetor of size " << pedEffs->size();
89-
}
90-
}
91-
if (!mCalibrator->isSettedDeadChannels()) {
92-
// const auto deadChs = o2::framework::DataRefUtils::as<CCDBSerialized<std::vector<int>>>(pc.inputs().get("deadchs"));
93-
const auto deadChs = pc.inputs().get<std::vector<int>*>("deadchs");
94-
if (deadChs) {
95-
mCalibrator->setDeadChannels(new std::vector<int>(deadChs->begin(), deadChs->end()));
96-
LOG(info) << "NoiseCalibratorSpec()::run() : I got dead channels vetor of size " << deadChs->size();
97-
}
98-
}
99-
if (!mCalibrator->isSettedHighPedChannels()) {
100-
// const auto highPeds = o2::framework::DataRefUtils::as<CCDBSerialized<std::vector<int>>>(pc.inputs().get("highpeds"));
101-
const auto highPeds = pc.inputs().get<std::vector<int>*>("highpeds");
102-
if (highPeds) {
103-
mCalibrator->setHighPedChannels(new std::vector<int>(highPeds->begin(), highPeds->end()));
104-
LOG(info) << "NoiseCalibratorSpec()::run() : I got high pedestal channels vetor of size " << highPeds->size();
105-
}
106-
}
107-
108115
// process data
109116
auto&& digits = pc.inputs().get<gsl::span<o2::cpv::Digit>>("digits");
110117
auto&& trigrecs = pc.inputs().get<gsl::span<o2::cpv::TriggerRecord>>("trigrecs");
@@ -147,6 +154,9 @@ class CPVNoiseCalibratorSpec : public o2::framework::Task
147154
auto&& infoVec = mCalibrator->getCcdbInfoBadChannelMapVector(); // use non-const version as we update it
148155

149156
assert(payloadVec.size() == infoVec.size());
157+
if (payloadVec.size() == 0) { // don't need to do anything if there is nothing to send
158+
return;
159+
}
150160

151161
for (uint32_t i = 0; i < payloadVec.size(); i++) {
152162
auto& w = infoVec[i];
@@ -174,6 +184,8 @@ DataProcessorSpec getCPVNoiseCalibratorSpec()
174184
inputs.emplace_back("deadchs", "CPV", "CPV_DeadChnls", 0, Lifetime::Condition, ccdbParamSpec("CPV/PedestalRun/DeadChannels"));
175185
inputs.emplace_back("highpeds", "CPV", "CPV_HighThrs", 0, Lifetime::Condition, ccdbParamSpec("CPV/PedestalRun/HighPedChannels"));
176186
inputs.emplace_back("calibparams", "CPV", "CPV_CalibPars", 0, Lifetime::Condition, ccdbParamSpec("CPV/Config/CPVCalibParams"));
187+
inputs.emplace_back("persbadchs", "CPV", "CPV_PersiBads", 0, Lifetime::Condition, ccdbParamSpec("CPV/Config/PersistentBadChannels"));
188+
177189
auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(true, // orbitResetTime
178190
true, // GRPECS=true
179191
false, // GRPLHCIF

0 commit comments

Comments
 (0)