25 std::atomic<bool> bmgWarningPrinted =
false;
48 return StatusCode::SUCCESS;
64 return StatusCode::SUCCESS;
72 return StatusCode::FAILURE;
79 return StatusCode::FAILURE;
83 std::vector<std::unique_ptr<MdtCsm>> csm_cache{};
87 const Identifier chid1 = mdtCollection->identify();
89 if (!condtionsPtr->
isGood(chid1))
continue;
92 if (!cabling_ptr->
convert(chid1, cabling_data)) {
94 return StatusCode::FAILURE;
98 for (
const MdtDigit* mdtDigit : *mdtCollection) {
99 const Identifier channelId = mdtDigit->identify();
101 if (!id_helper.
valid(channelId) || !cabling_ptr->
convert(channelId, cabling_data)) {
107 bool cabling = cabling_ptr->
getOnlineId(cabling_data, msgStream());
111 if (!bmgWarningPrinted) {
112 ATH_MSG_WARNING(
"Apparently BMG chambers are disconnected to the cabling. "
113 <<
"This has been checked to only appear in mc16a-like setups as the chambers were installed in "
114 "the end-of-the-year shutdown 2016. "
115 <<
"In any other case, be despaired in facing the villian and check what has gone wrong");
116 bmgWarningPrinted =
true;
120 ATH_MSG_ERROR(
"MDTcabling can't return an online ID for the channel : " << cabling_data);
121 return StatusCode::FAILURE;
125 auto amtHit = std::make_unique<MdtAmtHit>(cabling_data.tdcId, cabling_data.channelId, mdtDigit->isMasked());
127 int tdc_counts = mdtDigit->tdc();
129 uint16_t coarse = (tdc_counts >> 5) & 0xfff;
130 uint16_t fine = tdc_counts & 0x1f;
131 uint16_t
width = mdtDigit->adc();
133 amtHit->setValues(coarse, fine,
width);
136 ATH_MSG_DEBUG(
" Coarse time : " << coarse <<
" Fine time : " << fine <<
" Width : " <<
width);
142 if (!cabling_ptr->
getMultiLayerCode(cabling_data, csmId, csm_hash, msgStream())) {
143 ATH_MSG_ERROR(
"Hash generation failed for " << cabling_data);
144 return StatusCode::FAILURE;
148 std::unique_ptr<MdtCsm>& mdtCsm = csm_cache[csm_hash];
151 mdtCsm = std::make_unique<MdtCsm>(csmId, csm_hash, cabling_data.subdetectorId, cabling_data.mrod, cabling_data.csm);
154 if (cabling_data.csm != mdtCsm->CsmId() || cabling_data.subdetectorId != mdtCsm->SubDetId() || cabling_data.mrod != mdtCsm->MrodId()) {
156 wrongCsm.
csm = mdtCsm->CsmId();
157 wrongCsm.
mrod = mdtCsm->MrodId();
164 cabling_ptr->
convert(wrongCsm,wrongId);
168 return StatusCode::FAILURE;
171 mdtCsm->push_back(std::move(amtHit));
175 for (
unsigned int hash= 0; hash < csm_cache.size(); ++hash) {
176 if (!csm_cache[hash])
continue;
177 ATH_CHECK(csmContainer->addCollection(csm_cache[hash].release(), hash));
179 return StatusCode::SUCCESS;
187 if (tagInfoMgr.retrieve().isFailure()) {
return StatusCode::FAILURE; }
189 std::string cablingType =
"NewMDT_Cabling";
190 StatusCode
sc = tagInfoMgr->addTag(
"MDT_CablingType", cablingType);
192 if (
sc.isFailure()) {
193 ATH_MSG_WARNING(
"MDT_CablingType " << cablingType <<
" not added to TagInfo ");
196 ATH_MSG_DEBUG(
"MDT_CablingType " << cablingType <<
" is Added TagInfo ");
199 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
An algorithm that can be simultaneously executed in multiple threads.
This is a "hash" representation of an Identifier.
bool isGood(const Identifier &Id) const
Returns if the identifier (tube/multiLayer/chamber) is masked in the conditions database.
virtual StatusCode execute(const EventContext &ctx) const override final
SG::ReadCondHandleKey< MdtCondDbData > m_condKey
SG::ReadCondHandleKey< MuonMDT_CablingMap > m_cablingKey
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
MdtDigitToMdtRDO(const std::string &name, ISvcLocator *pSvcLocator)
SG::WriteHandleKey< MdtCsmContainer > m_csmContainerKey
SG::ReadHandleKey< MdtDigitContainer > m_digitContainerKey
StatusCode fillTagInfo() const
virtual StatusCode initialize() override final
bool valid(const Identifier &id) const
Public validation of levels.
size_type detectorElement_hash_max() const
MdtCablingData CablingData
bool getOnlineId(CablingData &cabling_data, MsgStream &log) const
return the online id given the offline id
bool getOfflineId(CablingData &cabling_data, MsgStream &log) const
return the offline id given the online id
bool convert(const CablingData &cabling_data, Identifier &id, bool check_valid=true) const
converts the cabling data into an identifier.
bool getMultiLayerCode(const CablingData &map_data, Identifier &multiLayer, IdentifierHash &mdtHashId, MsgStream &log) const
Transforms the identifier to an IdentifierHash corresponding to the multilayer In this case,...
const DataObjID & fullKey() const
Return the key as a DataObjID.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
uint8_t tdcId
Mezzanine type.
uint8_t channelId
Identifier of the corresponding tdc.
uint8_t & subdetectorId
CSM number.
uint8_t & csm
MROD number.