12#include "CoralBase/Attribute.h"
13#include "CoralBase/AttributeListSpecification.h"
19#include <CoralBase/Blob.h>
30 const bool initCondKey =
m_mezzJSON.value().empty() &&
36 return StatusCode::SUCCESS;
45 <<
". In theory this should not be called, but may happen"
46 <<
" if multiple concurrent events are being processed out of order.");
47 return StatusCode::SUCCESS;
51 std::unique_ptr<MuonMDT_CablingMap> writeCdo{std::make_unique<MuonMDT_CablingMap>()};
55 if (!writeCdo->finalize_init(msgStream()))
return StatusCode::FAILURE;
58 ATH_MSG_INFO(
"recorded new " << writeHandle.
key() <<
" with range " << writeHandle.
getRange() <<
" into Conditions Store");
59 return StatusCode::SUCCESS;
64 itr != readHandle->end(); ++itr) {
65 const coral::AttributeList& atr = itr->second;
67 if (atr[
"data"].specification().
type() ==
typeid(coral::Blob)) {
72 return StatusCode::FAILURE;
75 data = *(
static_cast<const std::string*
>((atr[
"data"]).addressOfData()));
79 return StatusCode::SUCCESS;
87 if (!in_json.good()) {
89 return StatusCode::FAILURE;
91 nlohmann::json payload{};
94 return StatusCode::SUCCESS;
99 return StatusCode::FAILURE;
104 <<
" readCdoMap->size()= " << readHandleMap->size());
106 ATH_MSG_VERBOSE(
"Collection CondAttrListCollection CLID " << readHandleMap->clID());
111 return StatusCode::SUCCESS;
115 for (itrMap = readHandleMap->begin(); itrMap != readHandleMap->end(); ++itrMap) {
116 const coral::AttributeList& atr = itrMap->second;
121 constexpr std::string_view delimiter{
","};
122 const std::string
map = *(
static_cast<const std::string*
>((atr[
"Map"]).addressOfData()));
129 if (!cabling_map.
addMezzanine(map_data, DataSource::LegacyCOOL, msgStream())) {
131 return StatusCode::FAILURE;
138 ATH_MSG_INFO(
"Found a round 3 setup. Will add the cabling for BIS78 manually");
139 const int BIS_stat =
m_idHelperSvc->mdtIdHelper().stationNameIndex(
"BIS");
140 constexpr int eta_index = 7;
141 for (
unsigned int sector = 1; sector <= 8; ++sector) {
142 int is_biy{0}, tdcId{0};
143 auto increment_tdc = [&is_biy, &tdcId]() {
145 constexpr int tdcMax = 17;
146 if (tdcId > tdcMax) {
151 constexpr int tubesPerCsm = 54;
152 bool added_tdc =
true;
155 for (
int ml = 1; ml <= 2; ++ml) {
157 const int tubes_per_layer =
m_idHelperSvc->mdtIdHelper().tubeMax(layer_id);
159 const int first_tube = 6 * (1 + tdcId / 2) + tubesPerCsm * is_biy;
160 const bool valid_tube = (first_tube <= tubes_per_layer);
161 added_tdc |= valid_tube;
170 bis78_data.
eta = eta_index;
171 bis78_data.
phi = sector;
174 bis78_data.
mrod = (is_biy ? -1 : 7) + sector;
175 bis78_data.
csm = is_biy ? 5 : 0;
181 <<
m_idHelperSvc->mdtIdHelper().tubeMax(layer_id) <<
" tdcId: "
182 << tdcId <<
" is_Biy: " << is_biy <<
" first_tube: " << first_tube);
184 std::vector<std::string> db_coding{std::to_string(tdcId),
"0", std::to_string(tube_coding)};
188 if (!cabling_map.
addMezzanine(bis78_data, DataSource::LegacyCOOL, msgStream())) {
189 ATH_MSG_ERROR(
"Failed to add mezzanine card " << bis78_data);
190 return StatusCode::FAILURE;
193 if (bis78_data.
tube != first_tube) {
194 ATH_MSG_ERROR(
"BIS78 data tube encoding failed. Expected " << first_tube <<
" got " << bis78_data.
tube <<
".");
195 return StatusCode::FAILURE;
198 return StatusCode::FAILURE;
205 return StatusCode::SUCCESS;
209 map_data.
eta = *(
static_cast<const int*
>((atr[
"Eta"]).addressOfData()));
210 map_data.
phi = *(
static_cast<const int*
>((atr[
"Phi"]).addressOfData()));
211 map_data.
mrod = *(
static_cast<const int*
>((atr[
"MROD"]).addressOfData()));
212 map_data.
csm = *(
static_cast<const int*
>((atr[
"CSM"]).addressOfData()));
213 map_data.
channelId = *(
static_cast<const int*
>((atr[
"Chan"]).addressOfData()));
214 map_data.
mezzanine_type = *(
static_cast<const int*
>((atr[
"Mezzanine_Type"]).addressOfData()));
216 const std::string chamber_name = *(
static_cast<const std::string*
>((atr[
"Chamber_Name"]).addressOfData()));
217 const std::string subdetector_id = *(
static_cast<const std::string*
>((atr[
"SubDet_Id"]).addressOfData()));
220 std::string stationNameString = chamber_name.substr(0, 3);
222 if (stationNameString ==
"BOE") { stationNameString =
"BOL"; }
224 if (stationNameString ==
"BIX" || stationNameString ==
"BIY") {
225 stationNameString =
"BIS";
226 static std::atomic<bool> sInfoPrinted{
false};
228 ATH_MSG_INFO(
"Found an entry concerning the new BIS78 chambers. Will increase the number of tube per layer to "
237 if ((stationNameString ==
"EIS" && (!
m_idHelperSvc->hasCSC() || chamber_name.find(
'A') != std::string::npos)) ||
238 chamber_name.find(
"BIS7A") != std::string::npos) {
239 ATH_MSG_VERBOSE(
"It's sooo sad but the chamber " << chamber_name <<
" is no longer with us");
248 ATH_MSG_VERBOSE(
"Data load is chamber_Name = " << chamber_name <<
" translated to "<<map_data<<
" FINISHED HERE ");
251 static std::atomic<bool> stWarningPrinted{
false};
252 if (!stWarningPrinted) {
254 <<
" which is not reasonable, maybe related to ATLASRECTS-5961, continuing...");
255 stWarningPrinted =
true;
264 constexpr unsigned int coding_block_size = 3;
265 const unsigned int n = info_map.size() >= coding_block_size ? coding_block_size : info_map.size();
266 bool decoded_full_block{
false};
267 for (
unsigned int i = 0; i < n; ++i) {
272 map_data.
tdcId = info;
284 decoded_full_block =
true;
289 if (decoded_full_block) info_map.erase(info_map.begin(), info_map.begin() + coding_block_size);
290 return decoded_full_block;
297 if (!in_json.good()) {
299 return StatusCode::FAILURE;
301 nlohmann::json payload{};
304 return StatusCode::SUCCESS;
309 if (!readHandleMez.
isValid()) {
311 return StatusCode::FAILURE;
316 <<
" readCdoMez->size()= " << readHandleMez->size());
322 return StatusCode::SUCCESS;
325 for (itrMez = readHandleMez->begin(); itrMez != readHandleMez->end(); ++itrMez) {
326 const coral::AttributeList& atr = itrMez->second;
327 int sequence{0}, layer{0}, mezzanine_type{0};
329 mezzanine_type = *(
static_cast<const int*
>((atr[
"Mezzanine_Type"]).addressOfData()));
330 layer = *(
static_cast<const int*
>((atr[
"Layer"]).addressOfData()));
331 sequence = *(
static_cast<const int*
>((atr[
"Sequence"]).addressOfData()));
332 ATH_MSG_VERBOSE(
"Sequence load is " << sequence <<
" for the mezzanine type = " << mezzanine_type
333 <<
" for the layer number = " << layer);
336 if (!cabling_map.
addMezzanineLine(mezzanine_type, layer, sequence, msgStream())) {
337 ATH_MSG_ERROR(
"Could not add the mezzanine sequence to the map ");
338 return StatusCode::FAILURE;
343 return StatusCode::SUCCESS;
347 for (
const auto &cabl_chan : payload.items()) {
348 nlohmann::json mezz_payload = cabl_chan.value();
349 const uint8_t
id = mezz_payload[
"mezzId"];
350 const uint8_t nLay = mezz_payload[
"nTubeLayer"];
351 const MezzMapping mapping = mezz_payload[
"tdcToTubeMap"];
352 if(!cabling_map.
addMezanineLayout(std::make_unique<MdtMezzanineCard>(mapping, nLay,
id),
353 msgStream()))
return StatusCode::FAILURE;
355 return StatusCode::SUCCESS;
359 for (
const auto &db_channel : payload.items()) {
360 nlohmann::json ms_payload = db_channel.value();
363 ms_channel.
eta = ms_payload[
"eta"];
364 ms_channel.
phi = ms_payload[
"phi"];
368 ms_channel.
csm = ms_payload[
"csm"];
369 ms_channel.
mrod = ms_payload[
"mrod"];
372 ms_channel.
tdcId = ms_payload[
"tdcId"];
373 ms_channel.
tube = ms_payload[
"tubeZero"];
375 ms_channel.
layer = 1;
377 ms_channel.
channelId = hedgeHogCard ? (*std::min_element(
380 if (!cabling_map.
addMezzanine(std::move(ms_channel), DataSource::JSON, msgStream()))
return StatusCode::FAILURE;
382 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
char data[hepevt_bytes_allocation_ATLAS]
MuonMDT_CablingMap::DataSource DataSource
Base class for conditions algorithms.
ChanAttrListMap::const_iterator const_iterator
static EventIDRange infiniteRunLB()
Produces an EventIDRange that is infinite in RunLumi and invalid in Time.
static constexpr int maxNTubesPerLayer
The maxNTubesPerLayer represents the absolute maximum of tubes which are built into a single multilay...
const Mapping & tubeToTdcMap() const
Returns the underlying Tube -> Tdc conversion map.
std::shared_ptr< const MdtMezzanineCard > MezzCardPtr
std::array< uint8_t, 24 > Mapping
int stationNameIndex(const std::string &name) const
Gaudi::Property< bool > m_useJSONFormat
StatusCode loadCablingSchema(const EventContext &ctx, SG::WriteCondHandle< MuonMDT_CablingMap > &writeHandle, MuonMDT_CablingMap &cabling_map) const
Load the cabling schema of the tubes.
StatusCode dbPayloadToJson(SG::ReadCondHandle< CondAttrListCollection > &readHandle, nlohmann::json &json) const
StatusCode loadCablingSchemaFromJSON(nlohmann::json &&payload, MuonMDT_CablingMap &cabling_map) const
SG::WriteCondHandleKey< MuonMDT_CablingMap > m_writeKey
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
virtual StatusCode execute(const EventContext &ctx) const override
StatusCode loadMezzanineSchema(const EventContext &ctx, SG::WriteCondHandle< MuonMDT_CablingMap > &writeHandle, MuonMDT_CablingMap &cabling_map) const
Load the mezzanine schema into the cabling.
Gaudi::Property< bool > m_isRun3
bool extractStationInfo(const coral::AttributeList &atr, CablingData &map_data) const
Retrieves the general MDT station info from the coral attribute.
MuonMDT_CablingAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadCondHandleKey< CondAttrListCollection > m_readKeyMap
Gaudi::Property< std::string > m_chambJSON
StatusCode loadMezzanineFromJSON(nlohmann::json &&payload, MuonMDT_CablingMap &cabling_map) const
bool extractLayerInfo(std::vector< std::string > &, CablingData &map_data) const
Retrieves the channel info from the coral attribute.
SG::ReadCondHandleKey< CondAttrListCollection > m_readKeyMez
MuonMDT_CablingMap::CablingData CablingData
Gaudi::Property< std::string > m_mezzJSON
virtual StatusCode initialize() override
MezzCardPtr getHedgeHogMapping(uint8_t mezzCardId) const
bool addMezanineLayout(std::unique_ptr< MdtMezzanineCard > card, MsgStream &log)
Adds a new mezzanine card mapping.
bool addMezzanine(CablingData cabling_data, DataSource source, MsgStream &log)
Add a new fully configured mezzanine card.
bool addMezzanineLine(const int type, const int layer, const int sequence, MsgStream &log)
Add a new line describing a mezzanine type.
const DataObjID & fullKey() const
const std::string & key() const
void addDependency(const EventIDRange &range)
const EventIDRange & getRange() const
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
const DataObjID & fullKey() const
bool readBlobAsString(const coral::Blob &, std::string &)
std::vector< std::string > tokenize(const std::string &the_str, std::string_view delimiters)
Splits the string into smaller substrings.
int atoi(std::string_view str)
Helper functions to unpack numbers decoded in string into integers and doubles The strings are requir...
uint8_t tdcId
Mezzanine type.
int tubes_per_layer
Helper constants to extract tube,layer, multilayer information.
uint8_t mezzanine_type
Tube number in the layer.
int tube
Layer inside the multilayer.
uint8_t channelId
Identifier of the corresponding tdc.
int8_t & multilayer
Phi sector of the MDT station.
int8_t & eta
Station of the chamber (i.e, BIL,BIS,etc.)
int8_t & phi
Eta of the MDT station.
uint8_t & subdetectorId
CSM number.
uint8_t & csm
MROD number.