8 #include <GeoModelKernel/throwExcept.h>
15 return StatusCode::FAILURE;
19 return StatusCode::FAILURE;
32 return StatusCode::SUCCESS;
36 unsigned int nInputEvents) {
38 ATH_MSG_DEBUG(
"prepareEvent() called for " << nInputEvents <<
" input events");
41 return StatusCode::SUCCESS;
45 for (
const auto& [timeIndex, simHitColl] : hitColl) {
46 timedHits.reserve(timedHits.capacity() + simHitColl->size());
48 timedHits.emplace_back(timeIndex.time(), timeIndex.index(), simHit, timeIndex.type());
51 std::stable_sort(timedHits.begin(), timedHits.end(),
53 if (a->identify() != b->identify()){
54 return a->identify() < b->identify();
56 if (
a.eventId() !=
b.eventId()) {
57 return a.eventId() < b.eventId();
59 return a.eventTime() <
b.eventTime();
61 return StatusCode::SUCCESS;
64 return hit.
eventTime() + hit->globalTime();
66 StatusCode MuonDigitizationTool::processAllSubEvents(
const EventContext& ctx) {
71 StatusCode MuonDigitizationTool::processAllSubEvents(
const EventContext& ctx)
const {
75 if (!m_onlyUseContainerName) {
80 ATH_CHECK(m_mergeSvc->retrieveSubEvtsData(m_inputObjectName, hitCollList));
82 ATH_CHECK(fillTimedHits(std::move(hitCollList), timedHits));
84 if (!m_sdoKey.empty()) {
86 ATH_CHECK(sdoContainer.record(std::make_unique<xAOD::MuonSimHitContainer>(),
87 std::make_unique<xAOD::MuonSimHitAuxContainer>()));
89 ATH_CHECK(digitize(ctx, timedHits, !m_sdoKey.empty() ? sdoContainer.ptr() :
nullptr));
90 return StatusCode::SUCCESS;
92 StatusCode MuonDigitizationTool::mergeEvent(
const EventContext& ctx) {
96 if (!m_sdoKey.empty()) {
98 ATH_CHECK(sdoContainer.record(std::make_unique<xAOD::MuonSimHitContainer>(),
99 std::make_unique<xAOD::MuonSimHitAuxContainer>()));
101 ATH_CHECK(digitize(ctx, m_timedHits, !m_sdoKey.empty() ? sdoContainer.ptr() :
nullptr));
104 return StatusCode::SUCCESS;
108 StatusCode MuonDigitizationTool::processBunchXing(
int bunchXing,
113 ATH_CHECK(m_mergeSvc->retrieveSubSetEvtData(m_inputObjectName, hitList, bunchXing, bSubEvents, eSubEvents));
114 ATH_MSG_VERBOSE(hitList.size() <<
" hits in xAODMuonSimHitContainer " << m_inputObjectName <<
" found");
115 for (
auto& [hitPtr, hitContainer] : hitList) {
116 auto copyContainer = std::make_unique<xAOD::MuonSimHitContainer>();
117 auto copyAuxContainer = std::make_unique<xAOD::MuonSimHitAuxContainer>();
118 copyContainer->setStore(copyAuxContainer.get());
120 (*copyContainer->push_back(std::make_unique<xAOD::MuonSimHit>())) = (*copyMe);
122 hitListPermanent.emplace_back(hitPtr, copyContainer.get());
123 m_simHits.emplace_back(std::move(copyContainer), std::move(copyAuxContainer));
125 ATH_CHECK(fillTimedHits(std::move(hitListPermanent), m_timedHits));
126 return StatusCode::SUCCESS;
129 CLHEP::HepRandomEngine* MuonDigitizationTool::getRandomEngine(
const EventContext&ctx)
const {
131 std::string rngName = m_streamName;
132 rngWrapper->
setSeed(rngName, ctx);
137 if (!
SG::get(gctx, m_geoCtxKey, ctx).isSuccess()) {
138 THROW_EXCEPTION(
"Failed to retrieve the geometry context "<<m_geoCtxKey.fullKey());
149 ATH_MSG_VERBOSE(
"Hit "<<m_idHelperSvc->toString(hit->identify())<<
" is a pile-up truth link");
152 ATH_MSG_VERBOSE(m_idHelperSvc->toString(hit->identify())<<
", pdgID: "<<hit->pdgId()<<
" genParticleLink :"<<hit->genParticleLink());
159 acc_eventTime(*sdoHit) = hit.
eventTime();
160 acc_eventID(*sdoHit) = hit.
eventId();
166 const double deadTimeWindow,
170 if (insertItr.second) {
173 if (
hitTime - insertItr.first->second < deadTimeWindow) {
177 insertItr.first->second =
hitTime;