ATLAS Offline Software
Loading...
Searching...
No Matches
CscSimDataOverlay.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include "CscSimDataOverlay.h"
8
11
12
13
14CscSimDataOverlay::CscSimDataOverlay(const std::string &name, ISvcLocator *pSvcLocator)
15 : AthReentrantAlgorithm(name, pSvcLocator) {}
16
18{
19 ATH_MSG_DEBUG("Initializing...");
20
21 if (m_signalInputKey.key().empty()) {
22 ATH_MSG_ERROR("Missing signal input SDO key.");
23 return StatusCode::FAILURE;
24 }
25
26 if (m_outputKey.key().empty()) {
27 ATH_MSG_ERROR("Missing output SDO key.");
28 return StatusCode::FAILURE;
29 }
30
31 // Check and initialize keys
32 ATH_CHECK( m_bkgInputKey.initialize(!m_bkgInputKey.key().empty()) );
33 ATH_MSG_VERBOSE("Initialized ReadHandleKey: " << m_bkgInputKey.key());
34 ATH_CHECK( m_signalInputKey.initialize() );
35 ATH_MSG_VERBOSE("Initialized ReadHandleKey: " << m_signalInputKey.key());
36 ATH_CHECK( m_outputKey.initialize() );
37 ATH_MSG_VERBOSE("Initialized WriteHandleKey: " << m_outputKey.key());
38
39 return StatusCode::SUCCESS;
40}
41
42
43StatusCode CscSimDataOverlay::execute(const EventContext& ctx) const
44{
45 ATH_MSG_DEBUG("execute() begin");
46
47 ATH_MSG_VERBOSE("Retrieving input containers");
48
49 const CscSimDataCollection *bkgContainerPtr = nullptr;
50 if (!m_bkgInputKey.key().empty()) {
52 if (!bkgContainer.isValid()) {
53 ATH_MSG_ERROR("Could not get background CscSimDataCollection container " << bkgContainer.name() << " from store " << bkgContainer.store());
54 return StatusCode::FAILURE;
55 }
56 bkgContainerPtr = bkgContainer.cptr();
57
58 ATH_MSG_DEBUG("Found background CscSimDataCollection container " << bkgContainer.name() << " in store " << bkgContainer.store());
59 }
60
62 if (!signalContainer.isValid()) {
63 ATH_MSG_ERROR("Could not get signal CscSimDataCollection container " << signalContainer.name() << " from store " << signalContainer.store());
64 return StatusCode::FAILURE;
65 }
66 ATH_MSG_DEBUG("Found signal CscSimDataCollection container " << signalContainer.name() << " in store " << signalContainer.store());
67
68 // Creating output RDO container
70 ATH_CHECK(outputContainer.record(std::make_unique<CscSimDataCollection>()));
71 if (!outputContainer.isValid()) {
72 ATH_MSG_ERROR("Could not record output CscSimDataCollection container " << outputContainer.name() << " to store " << outputContainer.store());
73 return StatusCode::FAILURE;
74 }
75 ATH_MSG_DEBUG("Recorded output CscSimDataCollection container " << outputContainer.name() << " in store " << outputContainer.store());
76
77
78 // Copy over signal SDO
79 ATH_MSG_VERBOSE("Inserting signal SDO, size = " << signalContainer->size());
80 outputContainer->insert(signalContainer->begin(), signalContainer->end());
81
82 // Merge with background
83 if (!m_bkgInputKey.key().empty()) {
84 ATH_MSG_VERBOSE("Inserting background SDO, size = " << bkgContainerPtr->size());
85
86 for (const auto &entry : *bkgContainerPtr) {
87 auto it = outputContainer->find(entry.first);
88 if (it != outputContainer->end()) {
89 // merging needed
90 const CscSimData &outSimData = it->second;
91 const std::vector<CscSimData::Deposit> &depositsBkg = entry.second.getdeposits();
92 std::vector<CscSimData::Deposit> depositsVector(outSimData.getdeposits());
93 depositsVector.insert(depositsVector.end(), depositsBkg.begin(), depositsBkg.end());
94 // fix charge
95 if (!depositsVector.empty() && !depositsBkg.empty()) {
96 depositsVector[0].second.setCharge(depositsVector[0].second.charge() + depositsBkg[0].second.charge());
97 depositsVector[outSimData.getdeposits().size()].second.setCharge(0); // clear the first bkg deposit charge
98 }
99 // set the new deposits vector
100 it->second = CscSimData(depositsVector);
101 } else {
102 outputContainer->insert(entry);
103 }
104 }
105 }
106
107 ATH_MSG_VERBOSE("Output SDO size " << outputContainer->size());
108
109 ATH_MSG_DEBUG("execute() end");
110 return StatusCode::SUCCESS;
111}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
Handle class for reading from StoreGate.
Handle class for recording to StoreGate.
An algorithm that can be simultaneously executed in multiple threads.
virtual StatusCode execute(const EventContext &ctx) const override
SG::WriteHandleKey< CscSimDataCollection > m_outputKey
CscSimDataOverlay(const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode initialize() override
SG::ReadHandleKey< CscSimDataCollection > m_signalInputKey
SG::ReadHandleKey< CscSimDataCollection > m_bkgInputKey
const std::vector< Deposit > & getdeposits() const
Definition CscSimData.h:67
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
std::string store() const
Return the name of the store holding the object we are proxying.
const std::string & name() const
Return the StoreGate ID for the referenced object.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
virtual bool isValid() override final
Can the handle be successfully dereferenced?