ATLAS Offline Software
Loading...
Searching...
No Matches
PRD_MultiTruthMaker.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Algorithm producing truth info for PrepRawData, keeping all MC particles contributed to a PRD.
6// A. Gaponenko, 2006
7
10
11#include <iterator>
12
13namespace InDet {
14
15//================================================================
16PRD_MultiTruthMaker::PRD_MultiTruthMaker(const std::string &name, ISvcLocator *pSvcLocator) :
17 AthReentrantAlgorithm(name,pSvcLocator),
18 m_PixelClustersName("PixelClusters"),
19 m_SCTClustersName("SCT_Clusters"),
20 m_TRTDriftCircleContainerName("TRT_DriftCircles"),
21 m_simDataMapNamePixel("PixelSDO_Map"),
22 m_simDataMapNameSCT("SCT_SDO_Map"),
23 m_simDataMapNameTRT("TRT_SDO_Map"),
24 m_PRDTruthNamePixel("PRD_MultiTruthPixel"),
25 m_PRDTruthNameSCT("PRD_MultiTruthSCT"),
26 m_PRDTruthNameTRT("PRD_MultiTruthTRT"),
27 m_PRDTruthTool("InDet::PRD_MultiTruthBuilder")
28{
29 declareProperty("PixelClusterContainerName", m_PixelClustersName);
30 declareProperty("SCTClusterContainerName", m_SCTClustersName);
31 declareProperty("TRTDriftCircleContainerName",m_TRTDriftCircleContainerName);
32 declareProperty("SimDataMapNamePixel", m_simDataMapNamePixel);
33 declareProperty("SimDataMapNameSCT", m_simDataMapNameSCT);
34 declareProperty("SimDataMapNameTRT", m_simDataMapNameTRT);
35 declareProperty("TruthNamePixel", m_PRDTruthNamePixel);
36 declareProperty("TruthNameSCT", m_PRDTruthNameSCT);
37 declareProperty("TruthNameTRT", m_PRDTruthNameTRT);
38 declareProperty("PRDTruthTool", m_PRDTruthTool);
39}
40
41// Initialize method
42// -----------------------------------------------------------------------------------------------------
44{
45 ATH_MSG_INFO ("PRD_MultiTruthMaker::initialize()");
46
47 if ( m_PRDTruthTool.retrieve().isFailure() ) {
48 ATH_MSG_ERROR ("Failed to retrieve tool " << m_PRDTruthTool);
49 return StatusCode::FAILURE;
50 } else {
51 ATH_MSG_INFO ("Retrieved tool " << m_PRDTruthTool);
52 }
53
54 // Read Handle Key
55 ATH_CHECK(m_PixelClustersName.initialize(not m_PixelClustersName.key().empty()));
56 ATH_CHECK(m_simDataMapNamePixel.initialize(not m_simDataMapNamePixel.key().empty()));
57 // Write Handle Key
58 ATH_CHECK(m_PRDTruthNamePixel.initialize(not m_PRDTruthNamePixel.key().empty()));
59
60 ATH_CHECK(m_SCTClustersName.initialize(not m_SCTClustersName.key().empty()));
61 ATH_CHECK(m_simDataMapNameSCT.initialize(not m_simDataMapNameSCT.key().empty()));
62 // Write Handle Key
63 ATH_CHECK(m_PRDTruthNameSCT.initialize(not m_PRDTruthNameSCT.key().empty()));
64
66 ATH_CHECK(m_simDataMapNameTRT.initialize(not m_simDataMapNameTRT.key().empty()));
67 // Write Handle Key
68 ATH_CHECK(m_PRDTruthNameTRT.initialize(not m_PRDTruthNameTRT.key().empty()));
69
70 // Read Cond Handle Key
71 ATH_CHECK(m_pixelDetEleCollKey.initialize(not m_pixelDetEleCollKey.key().empty()));
72 ATH_CHECK(m_SCTDetEleCollKey.initialize(not m_SCTDetEleCollKey.key().empty()));
73
74 return StatusCode::SUCCESS;
75}
76
77// -----------------------------------------------------------------------------------------------------
79{
80 ATH_MSG_DEBUG ("PRD_MultiTruthMaker finalized");
81 return StatusCode::SUCCESS;
82}
83
84// -----------------------------------------------------------------------------------------------------
85StatusCode PRD_MultiTruthMaker::execute(const EventContext &ctx) const {
86
87 ATH_MSG_DEBUG ("PRD_MultiTruthMaker::execute()");
88
89 // @TODO move below each to a tool just dealing with Pixel, SCT or TRT.
90 // work on Pixels
91 if(!m_PixelClustersName.key().empty() && !m_simDataMapNamePixel.key().empty() && !m_PRDTruthNamePixel.key().empty()) {
92
94 if (!prdContainer.isValid()) {
95 ATH_MSG_ERROR ("Pixel Cluster Container " << m_PixelClustersName.key() << " NOT found");
96 return StatusCode::FAILURE;
97 }
98 ATH_MSG_DEBUG("Pixel Cluster Container " << m_PixelClustersName.key() << " found");
99
100 // Retrieve the Pixel SDO map for this event
102 if (!simDataMap.isValid()) {
103 ATH_MSG_ERROR ("Could NOT find the InDetSimDataPixel " << m_simDataMapNamePixel.key() << " map.");
104 return StatusCode::FAILURE;
105 }
106 ATH_MSG_DEBUG ("Found InDetSimDataPixel " << m_simDataMapNamePixel.key() << ", do association");
107
108 // Create and fill the PRD truth structure
110 if (prdt_pixels.record(std::make_unique<PRD_MultiTruthCollection>()).isFailure()) {
111 ATH_MSG_ERROR ("PRD truth structure '" << m_PRDTruthNamePixel.key() << "' could not be registered in StoreGate !");
112 return StatusCode::FAILURE;
113 }
114 addPRDCollections(&(*prdt_pixels), prdContainer->begin(), prdContainer->end(), &(*simDataMap), true);
115 ATH_MSG_DEBUG ("PRD truth structure '" << m_PRDTruthNamePixel.key() << "' is registered in StoreGate, size="<<prdt_pixels->size());
116 }
117
118 // work on SCT
119 if(!m_SCTClustersName.key().empty() && !m_simDataMapNameSCT.key().empty() && !m_PRDTruthNameSCT.key().empty()) {
120 // Retrieve the SCT SDO map for this event
122 if (not simDataMap.isValid()) {
123 ATH_MSG_ERROR ("Could NOT find the InDetSimDataSCT " << m_simDataMapNameSCT.key() << " map");
124 return StatusCode::FAILURE;
125 }
126
127 ATH_MSG_DEBUG ("Found InDetSimDataSCT " << m_simDataMapNameSCT.key() << ", do association");
128 // retrieve SCT cluster container
130 if (not prdContainer.isValid()){
131 ATH_MSG_ERROR ("SCT Cluster Container " << m_SCTClustersName.key() << " NOT found");
132 return StatusCode::FAILURE;
133 }
134 ATH_MSG_DEBUG ("SCT Cluster Container " << m_SCTClustersName.key() << " found");
135
136 // Create and fill the PRD truth structure
138 ATH_CHECK(prdt_sct.record(std::make_unique<PRD_MultiTruthCollection>()));
139 addPRDCollections(prdt_sct.ptr(), prdContainer->begin(), prdContainer->end(), simDataMap.cptr(), false);
140 ATH_MSG_DEBUG ("PRD truth structure '" << m_PRDTruthNameSCT.key() << "' is registered in StoreGate, size="<<prdt_sct->size());
141 }
142
143 // work on TRT
144 if(!m_TRTDriftCircleContainerName.key().empty() && !m_simDataMapNameTRT.key().empty() && !m_PRDTruthNameTRT.key().empty()) {
145
147 if (!trtContainer.isValid()){
148 ATH_MSG_ERROR ("TRT DriftCircle Container " << m_TRTDriftCircleContainerName.key() << " NOT found");
149 return StatusCode::FAILURE;
150 }
151 ATH_MSG_DEBUG ("TRT DriftCirlce Container " << m_TRTDriftCircleContainerName.key() << " found");
152
153 // Retrieve the TRT SDO map for this event
155 if (!simDataMap.isValid()) {
156 ATH_MSG_ERROR ("Could NOT find the InDetSimDataTRT " << m_simDataMapNameTRT.key() << " map");
157 return StatusCode::FAILURE;
158 }
159 ATH_MSG_DEBUG ("Found InDetSimDataTRT " << m_simDataMapNameTRT.key() << " , do association");
160
161 // Fill the PRD truth structure
163 if (prdt_trt.record(std::make_unique<PRD_MultiTruthCollection>()).isFailure()) {
164 ATH_MSG_ERROR ("PRD truth structure '" << m_PRDTruthNameTRT.key() << "' could not be registered in StoreGate !");
165 return StatusCode::FAILURE;
166 }
167 addPRDCollections(&(*prdt_trt), trtContainer->begin(), trtContainer->end(), &(*simDataMap), false);
168 ATH_MSG_DEBUG ("PRD truth structure '" << m_PRDTruthNameTRT.key() << "' is registered in StoreGate, size="<<prdt_trt->size());
169 }
170
171 return StatusCode::SUCCESS;
172}
173
174// -----------------------------------------------------------------------------------------------------
175template<class PRD_Container_Iterator>
177 PRD_Container_Iterator collections_begin,
178 PRD_Container_Iterator collections_end,
179 const InDetSimDataCollection* simDataMap,
180 bool pixels) const
181{
182 for (PRD_Container_Iterator colNext=collections_begin; colNext != collections_end; ++colNext) {
183 addPRDRange(prdTruth, (*colNext)->begin(), (*colNext)->end(), simDataMap, pixels);
184 }
185}
186
187// -----------------------------------------------------------------------------------------------------
188// Adds PRDs in the range to prdTruth.
189template<class PRD_Collection_Iterator>
191 PRD_Collection_Iterator range_begin,
192 PRD_Collection_Iterator range_end,
193 const InDetSimDataCollection* simDataMap,
194 bool pixels) const
195{
196 for (PRD_Collection_Iterator nextDatum = range_begin; nextDatum != range_end; nextDatum++){
197 m_PRDTruthTool->addPrepRawDatum(prdTruth, *nextDatum, simDataMap, pixels);
198 }
199}
200
201
202} // namespace InDet
203
204//================================================================
205//EOF
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
An algorithm that can be simultaneously executed in multiple threads.
void addPRDCollections(PRD_MultiTruthCollection *prdTruth, PRD_Container_Iterator collections_begin, PRD_Container_Iterator collections_end, const InDetSimDataCollection *simDataMap, bool pixels) const
virtual StatusCode execute(const EventContext &ctx) const
SG::ReadHandleKey< InDetSimDataCollection > m_simDataMapNamePixel
SG::ReadHandleKey< InDet::SiClusterContainer > m_SCTClustersName
void addPRDRange(PRD_MultiTruthCollection *prdTruth, PRD_Collection_Iterator range_begin, PRD_Collection_Iterator range_end, const InDetSimDataCollection *simDataMap, bool pixels) const
SG::ReadHandleKey< InDet::SiClusterContainer > m_PixelClustersName
SG::ReadHandleKey< InDet::TRT_DriftCircleContainer > m_TRTDriftCircleContainerName
PRD_MultiTruthMaker(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
SG::ReadHandleKey< InDetSimDataCollection > m_simDataMapNameTRT
ToolHandle< InDet::IPRD_MultiTruthBuilder > m_PRDTruthTool
SG::WriteHandleKey< PRD_MultiTruthCollection > m_PRDTruthNameSCT
SG::ReadHandleKey< InDetSimDataCollection > m_simDataMapNameSCT
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_pixelDetEleCollKey
SG::WriteHandleKey< PRD_MultiTruthCollection > m_PRDTruthNameTRT
SG::WriteHandleKey< PRD_MultiTruthCollection > m_PRDTruthNamePixel
A PRD is mapped onto all contributing particles.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
Primary Vertex Finder.