ATLAS Offline Software
MdtDigitToMdtRDO.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "MdtDigitToMdtRDO.h"
6 
7 #include <algorithm>
8 #include <atomic>
9 #include <cmath>
10 
15 #include "MuonRDO/MdtCsm.h"
17 #include "MuonRDO/MdtCsmIdHash.h"
18 
21 namespace {
25  std::atomic<bool> bmgWarningPrinted = false;
26 
27 } // namespace
28 
29 MdtDigitToMdtRDO::MdtDigitToMdtRDO(const std::string& name, ISvcLocator* pSvcLocator) : AthReentrantAlgorithm(name, pSvcLocator) {}
30 
31 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
32 
34  ATH_MSG_DEBUG(" in initialize()");
37  ATH_CHECK(m_idHelperSvc.retrieve());
40 
41  if (fillTagInfo().isFailure()) { ATH_MSG_WARNING("Could not fill the tagInfo for MDT cabling"); }
42 
43  m_BMG_station_name = m_idHelperSvc->mdtIdHelper().stationNameIndex("BMG");
45  if (m_BMGpresent) {
46  ATH_MSG_DEBUG("Processing configuration for layouts with BME chambers (stationID: " << m_BMG_station_name << ").");
47  }
48  return StatusCode::SUCCESS;
49 }
50 
51 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
52 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
53 
54 StatusCode MdtDigitToMdtRDO::execute(const EventContext& ctx) const {
55  ATH_MSG_DEBUG("in execute() : fill_MDTdata");
56  // create an empty pad container and record it
58  ATH_CHECK(csmContainer.record(std::make_unique<MdtCsmContainer>()));
59  ATH_MSG_DEBUG("Recorded MdtCsmContainer called " << csmContainer.fullKey());
60 
62  if (!container.isValid()) {
63  ATH_MSG_ERROR("Could not find MdtDigitContainer called " << container.fullKey());
64  return StatusCode::SUCCESS;
65  }
66  ATH_MSG_DEBUG("Found MdtDigitContainer called " << container.fullKey());
67 
69  const MuonMDT_CablingMap* cabling_ptr{*readHandle_Cabling};
70  if (!cabling_ptr) {
71  ATH_MSG_ERROR("Null pointer to the read conditions object");
72  return StatusCode::FAILURE;
73  }
74 
75  SG::ReadCondHandle<MdtCondDbData> readHandle_Conditions{m_condKey, ctx};
76  const MdtCondDbData* condtionsPtr{*readHandle_Conditions};
77  if (!condtionsPtr) {
78  ATH_MSG_ERROR("Null pointer to the read conditions object");
79  return StatusCode::FAILURE;
80  }
81  const MdtIdHelper& id_helper = m_idHelperSvc->mdtIdHelper();
83  std::vector<std::unique_ptr<MdtCsm>> csm_cache{};
84  csm_cache.resize(id_helper.detectorElement_hash_max());
85  // Iterate on the collections
86  for (const MdtDigitCollection* mdtCollection : *container) {
87  const Identifier chid1 = mdtCollection->identify();
89  if (!condtionsPtr->isGood(chid1)) continue;
90 
92  if (!cabling_ptr->convert(chid1, cabling_data)) {
93  ATH_MSG_FATAL("Found a non mdt identifier " << m_idHelperSvc->toString(chid1));
94  return StatusCode::FAILURE;
95  }
96 
98  for (const MdtDigit* mdtDigit : *mdtCollection) {
99  const Identifier channelId = mdtDigit->identify();
100 
101  if (!id_helper.valid(channelId) || !cabling_ptr->convert(channelId, cabling_data)) {
102  ATH_MSG_DEBUG("Found invalid mdt identifier " << channelId);
103  continue;
104  }
105 
107  bool cabling = cabling_ptr->getOnlineId(cabling_data, msgStream());
108 
109  if (!cabling) {
110  if (cabling_data.stationIndex == m_BMG_station_name) {
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;
117  }
118  continue;
119  }
120  ATH_MSG_ERROR("MDTcabling can't return an online ID for the channel : " << cabling_data);
121  return StatusCode::FAILURE;
122  }
123 
124  // Create the new AMT hit
125  auto amtHit = std::make_unique<MdtAmtHit>(cabling_data.tdcId, cabling_data.channelId, mdtDigit->isMasked());
126  // Get coarse time and fine time
127  int tdc_counts = mdtDigit->tdc();
128 
129  uint16_t coarse = (tdc_counts >> 5) & 0xfff;
130  uint16_t fine = tdc_counts & 0x1f;
131  uint16_t width = mdtDigit->adc();
132 
133  amtHit->setValues(coarse, fine, width);
134 
135  ATH_MSG_DEBUG("Adding a new AmtHit -- " << cabling_data);
136  ATH_MSG_DEBUG(" Coarse time : " << coarse << " Fine time : " << fine << " Width : " << width);
137 
139  IdentifierHash csm_hash{0};
140  Identifier csmId{0};
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;
145  }
146 
148  std::unique_ptr<MdtCsm>& mdtCsm = csm_cache[csm_hash];
149  if (!mdtCsm) {
150  ATH_MSG_DEBUG("Insert new CSM module using " << cabling_data << " " << m_idHelperSvc->toString(csmId));
151  mdtCsm = std::make_unique<MdtCsm>(csmId, csm_hash, cabling_data.subdetectorId, cabling_data.mrod, cabling_data.csm);
152  }
153  // Check that the CSM is correct
154  if (cabling_data.csm != mdtCsm->CsmId() || cabling_data.subdetectorId != mdtCsm->SubDetId() || cabling_data.mrod != mdtCsm->MrodId()) {
155  MdtCablingData wrongCsm{};
156  wrongCsm.csm = mdtCsm->CsmId();
157  wrongCsm.mrod = mdtCsm->MrodId();
158  wrongCsm.subdetectorId = mdtCsm->SubDetId();
159  wrongCsm.channelId =0;
160  wrongCsm.tdcId =0;
161 
162  cabling_ptr->getOfflineId(wrongCsm, msgStream());
163  Identifier wrongId{};
164  cabling_ptr->convert(wrongCsm,wrongId);
165 
166  ATH_MSG_FATAL("CSM collection "<<static_cast<const MdtCablingOnData&>(wrongCsm) <<" ("<<m_idHelperSvc->toStringDetEl(wrongId)
167  <<") does not match with " <<static_cast<const MdtCablingOnData&>(cabling_data)<<" ("<<m_idHelperSvc->toStringDetEl(chid1)<<")");
168  return StatusCode::FAILURE;
169  }
170  // Add the digit to the CSM
171  mdtCsm->push_back(std::move(amtHit));
172  }
173  }
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));
178  }
179  return StatusCode::SUCCESS;
180 }
181 
182 // NOTE: although this function has no clients in release 22, currently the Run2 trigger simulation is still run in
183 // release 21 on RDOs produced in release 22. Since release 21 accesses the TagInfo, it needs to be written to the
184 // RDOs produced in release 22. The fillTagInfo() function thus needs to stay in release 22 until the workflow changes
186  ServiceHandle<ITagInfoMgr> tagInfoMgr("TagInfoMgr", name());
187  if (tagInfoMgr.retrieve().isFailure()) { return StatusCode::FAILURE; }
188 
189  std::string cablingType = "NewMDT_Cabling"; // everything starting from Run2 should be 'New'
190  StatusCode sc = tagInfoMgr->addTag("MDT_CablingType", cablingType);
191 
192  if (sc.isFailure()) {
193  ATH_MSG_WARNING("MDT_CablingType " << cablingType << " not added to TagInfo ");
194  return sc;
195  } else {
196  ATH_MSG_DEBUG("MDT_CablingType " << cablingType << " is Added TagInfo ");
197  }
198 
199  return StatusCode::SUCCESS;
200 }
MdtCsm::CsmId
uint16_t CsmId() const
Returns the CSM online id (online identifier inside a MROD)
Definition: MdtCsm.h:61
MdtDigitToMdtRDO::m_BMG_station_name
int m_BMG_station_name
Definition: MdtDigitToMdtRDO.h:34
MdtDigitCollection.h
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
MdtDigitToMdtRDO::m_csmContainerKey
SG::WriteHandleKey< MdtCsmContainer > m_csmContainerKey
Definition: MdtDigitToMdtRDO.h:36
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
IdentifiableContainerMT::addCollection
virtual StatusCode addCollection(const T *coll, IdentifierHash hashId) override final
insert collection into container with id hash if IDC should not take ownership of collection,...
Definition: IdentifiableContainerMT.h:300
MdtCablingOnData
Definition: MdtCablingData.h:50
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
MdtDigit
Definition: MdtDigit.h:19
MuonIdHelper::detectorElement_hash_max
size_type detectorElement_hash_max() const
Definition: MuonIdHelper.h:186
MdtDigitToMdtRDO.h
ITagInfoMgr.h
MdtDigitToMdtRDO::m_cablingKey
SG::ReadCondHandleKey< MuonMDT_CablingMap > m_cablingKey
Definition: MdtDigitToMdtRDO.h:39
ReadCellNoiseFromCool.cabling
cabling
Definition: ReadCellNoiseFromCool.py:154
MdtDigitToMdtRDO::MdtDigitToMdtRDO
MdtDigitToMdtRDO(const std::string &name, ISvcLocator *pSvcLocator)
Definition: MdtDigitToMdtRDO.cxx:29
MdtCsm::SubDetId
uint16_t SubDetId() const
Returns the sub-detector Id.
Definition: MdtCsm.h:57
createCablingJSON.cabling_data
dictionary cabling_data
Definition: createCablingJSON.py:18
MdtDigit.h
MdtCondDbData
Definition: MdtCondDbData.h:21
MdtCsmContainer.h
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
MdtCsmIdHash.h
MdtCsm::MrodId
uint16_t MrodId() const
Returns the MROD id from the CSM header.
Definition: MdtCsm.h:59
MuonMDT_CablingMap
Definition: MuonMDT_CablingMap.h:28
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
MdtDigitToMdtRDO::fillTagInfo
StatusCode fillTagInfo() const
Definition: MdtDigitToMdtRDO.cxx:185
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
MdtDigitToMdtRDO::execute
virtual StatusCode execute(const EventContext &ctx) const override final
Definition: MdtDigitToMdtRDO.cxx:54
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
MdtIdHelper
Definition: MdtIdHelper.h:61
MdtDigitToMdtRDO::m_condKey
SG::ReadCondHandleKey< MdtCondDbData > m_condKey
Definition: MdtDigitToMdtRDO.h:40
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MdtCablingData
Definition: MdtCablingData.h:82
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
CaloCondBlobAlgs_fillNoiseFromASCII.channelId
channelId
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:122
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
MdtDigitCollection
Definition: MdtDigitCollection.h:18
MdtCsm.h
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
MdtDigitToMdtRDO::initialize
virtual StatusCode initialize() override final
Definition: MdtDigitToMdtRDO.cxx:33
MdtCablingOnData::csm
uint8_t & csm
MROD number.
Definition: MdtCablingData.h:53
MdtDigitToMdtRDO::m_BMGpresent
bool m_BMGpresent
Definition: MdtDigitToMdtRDO.h:33
MdtIdHelper::valid
bool valid(const Identifier &id) const
Public validation of levels.
Definition: MdtIdHelper.cxx:531
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
SG::VarHandleBase::fullKey
const DataObjID & fullKey() const
Return the key as a DataObjID.
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
Base_Fragment.width
width
Definition: Sherpa_i/share/common/Base_Fragment.py:59
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:109
MdtDigitContainer.h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
MdtDigitToMdtRDO::m_digitContainerKey
SG::ReadHandleKey< MdtDigitContainer > m_digitContainerKey
Definition: MdtDigitToMdtRDO.h:37
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
MdtDigitToMdtRDO::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: MdtDigitToMdtRDO.h:35
ServiceHandle< ITagInfoMgr >
Identifier
Definition: IdentifierFieldParser.cxx:14