Skip to content

Commit a3053ec

Browse files
pillotalcaliva
authored andcommitted
new functionalities to fill MCH status map (#12945)
1 parent 3d6b080 commit a3053ec

File tree

3 files changed

+158
-15
lines changed

3 files changed

+158
-15
lines changed

Detectors/MUON/MCH/Status/include/MCHStatus/StatusMap.h

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#define O2_MCH_CONDITIONS_STATUSMAP_H
1414

1515
#include "MCHGlobalMapping/ChannelCode.h"
16+
#include "MCHGlobalMapping/DsIndex.h"
17+
#include "MCHRawElecMap/DsDetId.h"
1618
#include "DataFormatsMCH/DsChannelId.h"
1719
#include <cstdint>
1820
#include <gsl/span>
@@ -29,12 +31,13 @@ namespace o2::mch
2931
* Each potentially bad channel is ascribed a 32-bits mask that indicate
3032
* the source of information used to incriminate it.
3133
*
32-
* So far only two sources exist :
34+
* So far only three sources exist :
3335
* - kBadPedestal : the list generated at each pedestal run at Pt2
3436
* - kRejectList : a (manual) list
37+
* - kBadHV : the list derived from the DCS HV values
3538
*
3639
* In the future (based on our experience during Run1,2), we'll most probably
37-
* need to add information from the DCS HV (and possibly LV) values as well.
40+
* need to add information from the DCS LV values as well.
3841
*
3942
*/
4043
class StatusMap
@@ -43,7 +46,8 @@ class StatusMap
4346
enum Status : uint32_t {
4447
kOK = 0,
4548
kBadPedestal = 1 << 0,
46-
kRejectList = 1 << 1
49+
kRejectList = 1 << 1,
50+
kBadHV = 1 << 2
4751
};
4852

4953
using iterator = std::map<ChannelCode, uint32_t>::iterator;
@@ -67,6 +71,24 @@ class StatusMap
6771
*/
6872
void add(gsl::span<const ChannelCode> badchannels, uint32_t mask);
6973

74+
/** add all the channels of the badDS referenced using DsIndex
75+
* to this status map, assigning them the corresponding mask.
76+
* @throw runtime_error if the mask is invalid
77+
*/
78+
void addDS(DsIndex badDS, uint32_t mask);
79+
80+
/** add all the channels of the badDS referenced using DsDetId
81+
* to this status map, assigning them the corresponding mask.
82+
* @throw runtime_error if the mask is invalid
83+
*/
84+
void addDS(raw::DsDetId badDS, uint32_t mask);
85+
86+
/** add all the channels of the badDE referenced using DE Id
87+
* to this status map, assigning them the corresponding mask.
88+
* @throw runtime_error if the mask is invalid
89+
*/
90+
void addDE(uint16_t badDE, uint32_t mask);
91+
7092
/** whether or not this statusmap contains no (potentially) bad channels */
7193
bool empty() const { return mStatus.empty(); }
7294

Detectors/MUON/MCH/Status/src/StatusMap.cxx

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@
1010
// or submit itself to any jurisdiction.
1111

1212
#include "MCHStatus/StatusMap.h"
13+
14+
#include <stdexcept>
15+
1316
#include "Framework/Logger.h"
17+
#include "MCHConstants/DetectionElements.h"
18+
#include "MCHMappingInterface/Segmentation.h"
1419

1520
#include <fmt/format.h>
1621

@@ -21,7 +26,7 @@ namespace o2::mch
2126

2227
void assertValidMask(uint32_t mask)
2328
{
24-
uint32_t maxMask = StatusMap::kBadPedestal + StatusMap::kRejectList;
29+
static constexpr uint32_t maxMask = StatusMap::kBadPedestal | StatusMap::kRejectList | StatusMap::kBadHV;
2530
if (mask > maxMask) {
2631
throw std::runtime_error(fmt::format("invalid mask {} (max allowed is {}",
2732
mask, maxMask));
@@ -36,8 +41,8 @@ void StatusMap::add(gsl::span<const DsChannelId> badchannels, uint32_t mask)
3641
ChannelCode cc(id.getSolarId(), id.getElinkId(), id.getChannel());
3742
mStatus[cc] |= mask;
3843
} catch (const std::exception& e) {
39-
// Catch exceptions thrown by the ChannelCode constructor
40-
LOGP(warning, "Error processing channel - SolarId: {} ElinkId: {} Channel: {}. Error: {}. This channel is skipped.", id.getSolarId(), id.getElinkId(), id.getChannel(), e.what());
44+
LOGP(warning, "Error processing channel - SolarId: {} ElinkId: {} Channel: {}. Error: {}. This channel is skipped.",
45+
id.getSolarId(), id.getElinkId(), id.getChannel(), e.what());
4146
}
4247
}
4348
}
@@ -50,6 +55,54 @@ void StatusMap::add(gsl::span<const ChannelCode> badchannels, uint32_t mask)
5055
}
5156
}
5257

58+
void StatusMap::addDS(DsIndex badDS, uint32_t mask)
59+
{
60+
if (badDS >= NumberOfDualSampas) {
61+
LOGP(warning, "Error processing Dual Sampa - index: {}. This DS is skipped.", badDS);
62+
return;
63+
}
64+
addDS(getDsDetId(badDS), mask);
65+
}
66+
67+
void StatusMap::addDS(raw::DsDetId badDS, uint32_t mask)
68+
{
69+
assertValidMask(mask);
70+
auto deId = badDS.deId();
71+
if (!constants::isValidDetElemId(deId)) {
72+
LOGP(warning, "Error processing Dual Sampa - {}. This DS is skipped.", raw::asString(badDS));
73+
return;
74+
}
75+
const auto& seg = mapping::segmentation(deId);
76+
seg.forEachPadInDualSampa(badDS.dsId(), [&](int dePadIndex) {
77+
try {
78+
ChannelCode cc(deId, dePadIndex);
79+
mStatus[cc] |= mask;
80+
} catch (const std::exception& e) {
81+
LOGP(warning, "Error processing channel - {} padIndex: {}. Error: {}. This channel is skipped.",
82+
raw::asString(badDS), dePadIndex, e.what());
83+
}
84+
});
85+
}
86+
87+
void StatusMap::addDE(uint16_t badDE, uint32_t mask)
88+
{
89+
assertValidMask(mask);
90+
if (!constants::isValidDetElemId(badDE)) {
91+
LOGP(warning, "Error processing DE - Id: {}. This DE is skipped.", badDE);
92+
return;
93+
}
94+
const auto& seg = mapping::segmentation(badDE);
95+
seg.forEachPad([&](int dePadIndex) {
96+
try {
97+
ChannelCode cc(badDE, dePadIndex);
98+
mStatus[cc] |= mask;
99+
} catch (const std::exception& e) {
100+
LOGP(warning, "Error processing channel - deId: {} padIndex: {}. Error: {}. This channel is skipped.",
101+
badDE, dePadIndex, e.what());
102+
}
103+
});
104+
}
105+
53106
uint32_t StatusMap::status(const ChannelCode& id) const
54107
{
55108
auto s = mStatus.find(id);

Detectors/MUON/MCH/Status/src/testStatusMap.cxx

Lines changed: 77 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <boost/test/data/monomorphic.hpp>
1919

2020
#include "MCHGlobalMapping/ChannelCode.h"
21+
#include "MCHGlobalMapping/DsIndex.h"
2122
#include "MCHStatus/StatusMap.h"
2223
#include <fmt/format.h>
2324

@@ -39,6 +40,12 @@ std::vector<o2::mch::ChannelCode> cc{
3940
{1025, 8},
4041
{515, 1863}};
4142

43+
o2::mch::DsIndex ds = 246; // 56 pads, contains chid[1]
44+
45+
uint16_t de = 1025; // 6976 pads, contains cc[2]
46+
47+
uint32_t badMask = 1 << 3;
48+
4249
BOOST_AUTO_TEST_CASE(ClearShouldGiveEmptyMap)
4350
{
4451
o2::mch::StatusMap statusMap;
@@ -50,21 +57,35 @@ BOOST_AUTO_TEST_CASE(ClearShouldGiveEmptyMap)
5057
BOOST_AUTO_TEST_CASE(AddChannelIdWithInvalidMaskShouldThrow)
5158
{
5259
o2::mch::StatusMap statusMap;
53-
BOOST_CHECK_THROW(statusMap.add(chid, 4), std::runtime_error);
60+
BOOST_CHECK_THROW(statusMap.add(chid, badMask), std::runtime_error);
5461
}
5562

5663
BOOST_AUTO_TEST_CASE(AddChannelCodeWithInvalidMaskShouldThrow)
5764
{
5865
o2::mch::StatusMap statusMap;
59-
BOOST_CHECK_THROW(statusMap.add(cc, 4), std::runtime_error);
66+
BOOST_CHECK_THROW(statusMap.add(cc, badMask), std::runtime_error);
6067
}
6168

62-
std::array<uint32_t, 3> maskList = {
69+
BOOST_AUTO_TEST_CASE(AddDSWithInvalidMaskShouldThrow)
70+
{
71+
o2::mch::StatusMap statusMap;
72+
BOOST_CHECK_THROW(statusMap.addDS(0, badMask), std::runtime_error);
73+
}
74+
75+
BOOST_AUTO_TEST_CASE(AddDEWithInvalidMaskShouldThrow)
76+
{
77+
o2::mch::StatusMap statusMap;
78+
BOOST_CHECK_THROW(statusMap.addDE(100, badMask), std::runtime_error);
79+
}
80+
81+
std::array<uint32_t, 5> maskList = {
6382
o2::mch::StatusMap::kBadPedestal,
6483
o2::mch::StatusMap::kRejectList,
65-
o2::mch::StatusMap::kRejectList + o2::mch::StatusMap::kBadPedestal};
84+
o2::mch::StatusMap::kBadHV,
85+
o2::mch::StatusMap::kBadPedestal | o2::mch::StatusMap::kBadHV,
86+
o2::mch::StatusMap::kRejectList | o2::mch::StatusMap::kBadPedestal | o2::mch::StatusMap::kBadHV};
6687

67-
BOOST_DATA_TEST_CASE(CheckAddedChannelsGetTheRightMask, bdata::xrange(maskList.size() + 1), maskIndex)
88+
BOOST_DATA_TEST_CASE(CheckAddedChannelsGetTheRightMask, bdata::xrange(maskList.size()), maskIndex)
6889
{
6990
o2::mch::StatusMap statusMap;
7091
auto mask = maskList[maskIndex];
@@ -74,15 +95,62 @@ BOOST_DATA_TEST_CASE(CheckAddedChannelsGetTheRightMask, bdata::xrange(maskList.s
7495
}
7596
}
7697

98+
BOOST_AUTO_TEST_CASE(CheckChannelStatusCombination)
99+
{
100+
auto size = [](const o2::mch::StatusMap& statusMap) {
101+
int n = 0;
102+
for (const auto& status : statusMap) {
103+
++n;
104+
}
105+
return n;
106+
};
107+
o2::mch::StatusMap statusMap;
108+
statusMap.add(cc, o2::mch::StatusMap::kBadPedestal);
109+
BOOST_CHECK_EQUAL(size(statusMap), 4);
110+
statusMap.add(chid, o2::mch::StatusMap::kRejectList);
111+
BOOST_CHECK_EQUAL(size(statusMap), 4);
112+
statusMap.addDS(ds, o2::mch::StatusMap::kBadHV);
113+
BOOST_CHECK_EQUAL(size(statusMap), 59);
114+
statusMap.addDE(de, o2::mch::StatusMap::kBadHV);
115+
BOOST_CHECK_EQUAL(size(statusMap), 7034);
116+
BOOST_CHECK_EQUAL(statusMap.status(cc[0]), o2::mch::StatusMap::kBadPedestal | o2::mch::StatusMap::kRejectList);
117+
BOOST_CHECK_EQUAL(statusMap.status(cc[1]), o2::mch::StatusMap::kBadPedestal | o2::mch::StatusMap::kRejectList | o2::mch::StatusMap::kBadHV);
118+
BOOST_CHECK_EQUAL(statusMap.status(cc[2]), o2::mch::StatusMap::kBadPedestal | o2::mch::StatusMap::kBadHV);
119+
BOOST_CHECK_EQUAL(statusMap.status(cc[3]), o2::mch::StatusMap::kBadPedestal);
120+
}
121+
77122
BOOST_AUTO_TEST_CASE(ApplyMaskShouldReturnASubsetDependingOnMask)
78123
{
124+
auto size = [](const std::map<int, std::vector<int>>& badChannels) {
125+
int n = 0;
126+
for (const auto& channels : badChannels) {
127+
n += channels.second.size();
128+
}
129+
return n;
130+
};
79131
o2::mch::StatusMap statusMap;
80132
statusMap.add(cc, o2::mch::StatusMap::kBadPedestal);
81133
statusMap.add(chid, o2::mch::StatusMap::kRejectList);
134+
statusMap.addDS(ds, o2::mch::StatusMap::kBadHV);
135+
statusMap.addDE(de, o2::mch::StatusMap::kBadHV);
82136
auto badPed = applyMask(statusMap, o2::mch::StatusMap::kBadPedestal);
83137
auto rejectList = applyMask(statusMap, o2::mch::StatusMap::kRejectList);
84-
auto all = applyMask(statusMap, o2::mch::StatusMap::kBadPedestal | o2::mch::StatusMap::kRejectList);
85-
BOOST_CHECK_EQUAL(badPed.size(), cc.size());
86-
BOOST_CHECK_EQUAL(rejectList.size(), chid.size());
87-
BOOST_CHECK_EQUAL(all.size(), 4);
138+
auto badHV = applyMask(statusMap, o2::mch::StatusMap::kBadHV);
139+
auto badHVOrRL = applyMask(statusMap, o2::mch::StatusMap::kBadHV | o2::mch::StatusMap::kRejectList);
140+
auto any = applyMask(statusMap, o2::mch::StatusMap::kBadPedestal | o2::mch::StatusMap::kRejectList | o2::mch::StatusMap::kBadHV);
141+
BOOST_CHECK_EQUAL(badPed.size(), 4);
142+
BOOST_CHECK_EQUAL(size(badPed), 4);
143+
BOOST_CHECK_EQUAL(badPed[1025][0], 8);
144+
BOOST_CHECK_EQUAL(rejectList.size(), 2);
145+
BOOST_CHECK_EQUAL(size(rejectList), 2);
146+
BOOST_CHECK_EQUAL(rejectList[100][0], 15665);
147+
BOOST_CHECK_EQUAL(badHV.size(), 2);
148+
BOOST_CHECK_EQUAL(size(badHV), 7032);
149+
BOOST_CHECK_EQUAL(badHV[1025].size(), 6976);
150+
BOOST_CHECK_EQUAL(badHVOrRL.size(), 3);
151+
BOOST_CHECK_EQUAL(size(badHVOrRL), 7033);
152+
BOOST_CHECK_EQUAL(badHVOrRL[515].size(), 0);
153+
BOOST_CHECK_EQUAL(any.size(), 4);
154+
BOOST_CHECK_EQUAL(size(any), 7034);
155+
BOOST_CHECK_EQUAL(any[302][0], 20117);
88156
}

0 commit comments

Comments
 (0)