Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Public Member Functions | Private Attributes | List of all members
xAODSpacePointMaker Class Reference

Creates xAOD space point containers from FPGA input and existing clusters. More...

#include <xAODSpacePointMaker.h>

Inheritance diagram for xAODSpacePointMaker:
Collaboration diagram for xAODSpacePointMaker:

Public Member Functions

StatusCode initialize () override
 Initialise the space point maker tool. More...
 
StatusCode makePixelSpacePointContainer (const EFTrackingTransient::SpacePointAuxInput &spAux, const EFTrackingTransient::Metadata *metadata, const EventContext &ctx) const
 Make the pixel space point container. More...
 
StatusCode makeStripSpacePointContainer (const EFTrackingTransient::SpacePointAuxInput &sspAux, const EFTrackingTransient::Metadata *metadata, const EventContext &ctx) const
 Make the strip space point container. More...
 

Private Attributes

SG::ReadHandleKey< xAOD::PixelClusterContainerm_pixelClusterKey
 Key for the pixel cluster container to read from. More...
 
SG::ReadHandleKey< xAOD::StripClusterContainerm_stripClusterKey
 Key for the strip cluster container to read from. More...
 
SG::WriteHandleKey< xAOD::SpacePointContainerm_pixelSpacePointsKey
 Key for the pixel space points container to be created. More...
 
SG::WriteHandleKey< xAOD::SpacePointContainerm_stripSpacePointsKey
 Key for the strip space points container to be created. More...
 

Detailed Description

Creates xAOD space point containers from FPGA input and existing clusters.

Definition at line 33 of file xAODSpacePointMaker.h.

Member Function Documentation

◆ initialize()

StatusCode xAODSpacePointMaker::initialize ( )
override

Initialise the space point maker tool.

Definition at line 20 of file xAODSpacePointMaker.cxx.

20  {
21  ATH_MSG_INFO("Initialising xAODSpacePointMaker tool");
22 
25 
26  ATH_CHECK(m_pixelSpacePointsKey.initialize());
27  ATH_CHECK(m_stripSpacePointsKey.initialize());
28 
29  return StatusCode::SUCCESS;
30 }

◆ makePixelSpacePointContainer()

StatusCode xAODSpacePointMaker::makePixelSpacePointContainer ( const EFTrackingTransient::SpacePointAuxInput spAux,
const EFTrackingTransient::Metadata metadata,
const EventContext &  ctx 
) const

Make the pixel space point container.

Parameters
spAuxInput space point data
metadataInput metadata
ctx
Returns
StatusCode

Definition at line 32 of file xAODSpacePointMaker.cxx.

35  {
36 
37  if (msgLvl(MSG::DEBUG)) {
38  ATH_MSG_DEBUG("Making xAOD::SpacePointContainer from SpacePointAuxInput");
39 
40  // debugging information about vector sizes
41  ATH_MSG_DEBUG("Metadata numOfPixelSpacePoints: " << metadata->numOfPixelSpacePoints);
42  ATH_MSG_DEBUG("spAux.elementIdList size: " << spAux.elementIdList.size());
43  ATH_MSG_DEBUG("spAux.globalPosition size: " << spAux.globalPosition.size());
44  ATH_MSG_DEBUG("spAux.measurementIndexes size: " << spAux.measurementIndexes.size());
45  ATH_MSG_DEBUG("spAux.varianceR size: " << spAux.varianceR.size());
46  ATH_MSG_DEBUG("spAux.varianceZ size: " << spAux.varianceZ.size());
47  }
48 
49  // Check for inconsistent metadata and throw an error if it is
50  if (metadata->numOfPixelSpacePoints > 0 &&
51  (spAux.elementIdList.empty() ||
52  spAux.globalPosition.empty() ||
53  spAux.measurementIndexes.empty() ||
54  spAux.varianceR.empty() ||
55  spAux.varianceZ.empty())) {
56  ATH_MSG_WARNING("Inconsistent metadata: numOfPixelSpacePoints = "
57  << metadata->numOfPixelSpacePoints
58  << " but one or more required vectors are empty");
59  return StatusCode::SUCCESS;
60  }
61 
62  if (metadata->numOfPixelSpacePoints > 0 && spAux.elementIdList.empty()) {
63  ATH_MSG_WARNING("Inconsistent metadata!");
64  }
65 
66  // Create the containers
68  ATH_CHECK(pixelSpacePointsHandle.record(
69  std::make_unique<xAOD::SpacePointContainer>(),
70  std::make_unique<xAOD::SpacePointAuxContainer>()));
71 
72  ATH_CHECK(pixelSpacePointsHandle.isValid());
73  ATH_MSG_DEBUG("Container '" << m_pixelSpacePointsKey << "' initialised");
74 
75  // Get pixel cluster container for linking
77  if (!pixelClusters.isValid()) {
78  ATH_MSG_ERROR("Could not retrieve pixel cluster container");
79  return StatusCode::FAILURE;
80  }
81 
82  // Create spacepoints
83  for (unsigned int i = 0; i < metadata->numOfPixelSpacePoints; i++) {
84  // Add bounds checking for all vector accesses
85  if (i >= spAux.elementIdList.size()) {
86  ATH_MSG_ERROR("Index out of bounds: i=" << i
87  << " >= elementIdList.size()=" << spAux.elementIdList.size());
88  return StatusCode::FAILURE;
89  }
90 
91  if (i >= spAux.varianceR.size()) {
92  ATH_MSG_ERROR("Index out of bounds: i=" << i
93  << " >= varianceR.size()=" << spAux.varianceR.size());
94  return StatusCode::FAILURE;
95  }
96 
97  if (i >= spAux.varianceZ.size()) {
98  ATH_MSG_ERROR("Index out of bounds: i=" << i
99  << " >= varianceZ.size()=" << spAux.varianceZ.size());
100  return StatusCode::FAILURE;
101  }
102 
103  if (i >= spAux.measurementIndexes.size()) {
104  ATH_MSG_ERROR("Index out of bounds: i=" << i
105  << " >= measurementIndexes.size()=" << spAux.measurementIndexes.size());
106  return StatusCode::FAILURE;
107  }
108 
109  if (i*3+2 >= spAux.globalPosition.size()) {
110  ATH_MSG_ERROR("Index out of bounds: i*3+2=" << (i*3+2)
111  << " >= globalPosition.size()=" << spAux.globalPosition.size());
112  return StatusCode::FAILURE;
113  }
114 
115  // use unique_ptr to avoid memory leak
116  auto sp = pixelSpacePointsHandle->push_back(std::make_unique<xAOD::SpacePoint>());
117 
118  // Create position vector
119  Eigen::Matrix<float, 3, 1> globalPosition(
120  spAux.globalPosition.at(i * 3),
121  spAux.globalPosition.at(i * 3 + 1),
122  spAux.globalPosition.at(i * 3 + 2));
123 
124  // Get the measurement index
125  const int measIdx = spAux.measurementIndexes.at(i);
126 
127  // Create the spacepoint with empty measurements vector
128  sp->setSpacePoint(
129  spAux.elementIdList[i],
130  globalPosition,
131  spAux.varianceR[i],
132  spAux.varianceZ[i],
133  std::vector<const xAOD::UncalibratedMeasurement*>()); // Empty vector
134 
135  // Create ElementLink to the pixel cluster
136  if (measIdx >= 0 && static_cast<size_t>(measIdx) < pixelClusters->size()) {
137  ElementLink<xAOD::PixelClusterContainer> link(*pixelClusters, measIdx);
138  SG::Decorator<ElementLink<xAOD::PixelClusterContainer>> dec("fpgaPixelClusterLink");
139  dec(*sp) = link;
140  }
141  }
142 
143  // After creating all spacepoints print the number of spacepoints created in debug stream
144  ATH_MSG_DEBUG("Created " << pixelSpacePointsHandle->size() << " pixel spacepoints");
145 
146  return StatusCode::SUCCESS;
147 }

◆ makeStripSpacePointContainer()

StatusCode xAODSpacePointMaker::makeStripSpacePointContainer ( const EFTrackingTransient::SpacePointAuxInput sspAux,
const EFTrackingTransient::Metadata metadata,
const EventContext &  ctx 
) const

Make the strip space point container.

Parameters
sspAuxInput space point data
metadataInput metadata
ctx
Returns
StatusCode

Definition at line 149 of file xAODSpacePointMaker.cxx.

152  {
153  ATH_MSG_DEBUG("Making xAOD::SpacePointContainer from SpacePointAuxInput");
154 
155  // debug stream for information about vector sizes
156  ATH_MSG_DEBUG("Metadata numOfStripSpacePoints: " << metadata->numOfStripSpacePoints);
157  ATH_MSG_DEBUG("sspAux.elementIdList size: " << sspAux.elementIdList.size());
158  ATH_MSG_DEBUG("sspAux.globalPosition size: " << sspAux.globalPosition.size());
159  ATH_MSG_DEBUG("sspAux.measurementIndexes size: " << sspAux.measurementIndexes.size());
160  ATH_MSG_DEBUG("sspAux.varianceR size: " << sspAux.varianceR.size());
161  ATH_MSG_DEBUG("sspAux.varianceZ size: " << sspAux.varianceZ.size());
162 
163  // Check for inconsistent metadata and throw an error if it is
164  if (metadata->numOfStripSpacePoints > 0 &&
165  (sspAux.elementIdList.empty() ||
166  sspAux.globalPosition.empty() ||
167  sspAux.measurementIndexes.empty() ||
168  sspAux.varianceR.empty() ||
169  sspAux.varianceZ.empty())) {
170  ATH_MSG_ERROR("Inconsistent metadata: numOfStripSpacePoints = "
171  << metadata->numOfStripSpacePoints
172  << " but one or more required vectors are empty");
173  return StatusCode::FAILURE;
174  }
175 
176  if (metadata->numOfStripSpacePoints > 0 && sspAux.elementIdList.empty()) {
177  ATH_MSG_WARNING("Inconsistent metadata!");
178  }
179 
180  // create the containers
182  ATH_CHECK(stripSpacePointsHandle.record(
183  std::make_unique<xAOD::SpacePointContainer>(),
184  std::make_unique<xAOD::SpacePointAuxContainer>()));
185 
186  ATH_CHECK(stripSpacePointsHandle.isValid());
187  ATH_MSG_DEBUG("Container '" << m_stripSpacePointsKey << "' initialised");
188 
189  // get the strip cluster container for linking
191  if (!stripClusters.isValid()) {
192  ATH_MSG_ERROR("Could not retrieve strip cluster container");
193  return StatusCode::FAILURE;
194  }
195 
196  // create the spacepoints
197  for (unsigned int i = 0; i < metadata->numOfStripSpacePoints; i++) {
198  // add bounds checking for all vector accesses
199  if (i >= sspAux.elementIdList.size()) {
200  ATH_MSG_ERROR("Index out of bounds: i=" << i
201  << " >= elementIdList.size()=" << sspAux.elementIdList.size());
202  return StatusCode::FAILURE;
203  }
204 
205  if (i >= sspAux.varianceR.size()) {
206  ATH_MSG_ERROR("Index out of bounds: i=" << i
207  << " >= varianceR.size()=" << sspAux.varianceR.size());
208  return StatusCode::FAILURE;
209  }
210 
211  if (i >= sspAux.varianceZ.size()) {
212  ATH_MSG_ERROR("Index out of bounds: i=" << i
213  << " >= varianceZ.size()=" << sspAux.varianceZ.size());
214  return StatusCode::FAILURE;
215  }
216 
217  if (i*2+1 >= sspAux.measurementIndexes.size()) {
218  ATH_MSG_ERROR("Index out of bounds: i*2+1=" << (i*2+1)
219  << " >= measurementIndexes.size()=" << sspAux.measurementIndexes.size());
220  return StatusCode::FAILURE;
221  }
222 
223  if (i*3+2 >= sspAux.globalPosition.size()) {
224  ATH_MSG_ERROR("Index out of bounds: i*3+2=" << (i*3+2)
225  << " >= globalPosition.size()=" << sspAux.globalPosition.size());
226  return StatusCode::FAILURE;
227  }
228 
229  // use unique_ptr here to avoid any memory leaks
230  auto ssp = stripSpacePointsHandle->push_back(std::make_unique<xAOD::SpacePoint>());
231 
232  // Create position vector
233  Eigen::Matrix<float, 3, 1> globalPosition(
234  sspAux.globalPosition.at(i * 3),
235  sspAux.globalPosition.at(i * 3 + 1),
236  sspAux.globalPosition.at(i * 3 + 2));
237 
238  // Get the measurement index
239  const int meas_idx1 = sspAux.measurementIndexes.at(i * 2);
240  const int meas_idx2 = sspAux.measurementIndexes.at(i * 2 + 1);
241 
242  // For strip spacepoints, we need to use the version with two element IDs!
243  std::vector<xAOD::DetectorIDHashType> elementIds;
244  elementIds.push_back(sspAux.elementIdList.at(i * 2));
245  elementIds.push_back(sspAux.elementIdList.at(i * 2 + 1));
246 
247  // Create empty measurements vector
248  std::vector<const xAOD::UncalibratedMeasurement*> strip_meas;
249 
250  // Get strip-specific properties
251  float topHalfStripLength = 0.0f;
252  float bottomHalfStripLength = 0.0f;
253 
254  if (i < sspAux.topHalfStripLength.size()) {
255  topHalfStripLength = sspAux.topHalfStripLength.at(i);
256  }
257 
258  if (i < sspAux.bottomHalfStripLength.size()) {
259  bottomHalfStripLength = sspAux.bottomHalfStripLength.at(i);
260  }
261 
262  // Create direction vectors
263  Eigen::Matrix<float, 3, 1> topStripDirection = Eigen::Matrix<float, 3, 1>::Zero();
264  if (i * 3 + 2 < sspAux.topStripDirection.size()) {
265  topStripDirection = Eigen::Matrix<float, 3, 1>(
266  sspAux.topStripDirection.at(i * 3),
267  sspAux.topStripDirection.at(i * 3 + 1),
268  sspAux.topStripDirection.at(i * 3 + 2));
269  }
270 
271  Eigen::Matrix<float, 3, 1> bottomStripDirection = Eigen::Matrix<float, 3, 1>::Zero();
272  if (i * 3 + 2 < sspAux.bottomStripDirection.size()) {
273  bottomStripDirection = Eigen::Matrix<float, 3, 1>(
274  sspAux.bottomStripDirection.at(i * 3),
275  sspAux.bottomStripDirection.at(i * 3 + 1),
276  sspAux.bottomStripDirection.at(i * 3 + 2));
277  }
278 
279  Eigen::Matrix<float, 3, 1> stripCenterDistance = Eigen::Matrix<float, 3, 1>::Zero();
280  if (i * 3 + 2 < sspAux.stripCenterDistance.size()) {
281  stripCenterDistance = Eigen::Matrix<float, 3, 1>(
282  sspAux.stripCenterDistance.at(i * 3),
283  sspAux.stripCenterDistance.at(i * 3 + 1),
284  sspAux.stripCenterDistance.at(i * 3 + 2));
285  }
286 
287  Eigen::Matrix<float, 3, 1> topStripCenter = Eigen::Matrix<float, 3, 1>::Zero();
288  if (i * 3 + 2 < sspAux.topStripCenter.size()) {
289  topStripCenter = Eigen::Matrix<float, 3, 1>(
290  sspAux.topStripCenter.at(i * 3),
291  sspAux.topStripCenter.at(i * 3 + 1),
292  sspAux.topStripCenter.at(i * 3 + 2));
293  }
294 
295  // Create the spacepoint with all required parameters
296  ssp->setSpacePoint(
297  elementIds,
298  globalPosition,
299  sspAux.varianceR.at(i),
300  sspAux.varianceZ.at(i),
301  strip_meas, // Empty vector
302  topHalfStripLength,
303  bottomHalfStripLength,
304  topStripDirection,
305  bottomStripDirection,
306  stripCenterDistance,
307  topStripCenter);
308 
309  // Instead of storing measurements directly, store ElementLinks
310  if (meas_idx1 >= 0 && static_cast<size_t>(meas_idx1) < stripClusters->size() &&
311  meas_idx2 >= 0 && static_cast<size_t>(meas_idx2) < stripClusters->size()) {
312 
313  // Create ElementLinks to the strip clusters
314  ElementLink<xAOD::StripClusterContainer> link1(*stripClusters, meas_idx1);
315  ElementLink<xAOD::StripClusterContainer> link2(*stripClusters, meas_idx2);
316 
317  // Store the links as auxiliary data
318  SG::Decorator<ElementLink<xAOD::StripClusterContainer>> dec1("fpgaStripClusterLink1");
319  SG::Decorator<ElementLink<xAOD::StripClusterContainer>> dec2("fpgaStripClusterLink2");
320  dec1(*ssp) = link1;
321  dec2(*ssp) = link2;
322  }
323 
324  // set the global position of the space point
325  ssp->globalPosition() = globalPosition;
326 
327  // validate the position of the space point
328  ATH_MSG_DEBUG("Strip Spacepoint " << i << " position: ("
329  << globalPosition(0) << ", "
330  << globalPosition(1) << ", "
331  << globalPosition(2) << ")");
332  }
333 
334  ATH_MSG_DEBUG("Created " << stripSpacePointsHandle->size() << " strip spacepoints");
335 
336  return StatusCode::SUCCESS;
337 }

Member Data Documentation

◆ m_pixelClusterKey

SG::ReadHandleKey<xAOD::PixelClusterContainer> xAODSpacePointMaker::m_pixelClusterKey
private
Initial value:
{
this, "PixelClusterContainerKey", "FPGAPixelClusters",
"Key for input pixel cluster container"}

Key for the pixel cluster container to read from.

Definition at line 68 of file xAODSpacePointMaker.h.

◆ m_pixelSpacePointsKey

SG::WriteHandleKey<xAOD::SpacePointContainer> xAODSpacePointMaker::m_pixelSpacePointsKey
private
Initial value:
{
this, "PixelSpacePointContainerKey", "FPGAPixelSpacePoints",
"Key for output pixel space point container"}

Key for the pixel space points container to be created.

Definition at line 78 of file xAODSpacePointMaker.h.

◆ m_stripClusterKey

SG::ReadHandleKey<xAOD::StripClusterContainer> xAODSpacePointMaker::m_stripClusterKey
private
Initial value:
{
this, "StripClusterContainerKey", "FPGAStripClusters",
"Key for input strip cluster container"}

Key for the strip cluster container to read from.

Definition at line 73 of file xAODSpacePointMaker.h.

◆ m_stripSpacePointsKey

SG::WriteHandleKey<xAOD::SpacePointContainer> xAODSpacePointMaker::m_stripSpacePointsKey
private
Initial value:
{
this, "StripSpacePointContainerKey", "FPGAStripSpacePoints",
"Key for output strip space point container"}

Key for the strip space points container to be created.

Definition at line 83 of file xAODSpacePointMaker.h.


The documentation for this class was generated from the following files:
xAODSpacePointMaker::m_pixelSpacePointsKey
SG::WriteHandleKey< xAOD::SpacePointContainer > m_pixelSpacePointsKey
Key for the pixel space points container to be created.
Definition: xAODSpacePointMaker.h:78
EFTrackingTransient::SpacePointAuxInput::bottomHalfStripLength
std::vector< float > bottomHalfStripLength
Definition: EFTrackingTransient.h:259
xAODSpacePointMaker::m_pixelClusterKey
SG::ReadHandleKey< xAOD::PixelClusterContainer > m_pixelClusterKey
Key for the pixel cluster container to read from.
Definition: xAODSpacePointMaker.h:68
EFTrackingTransient::SpacePointAuxInput::topStripDirection
std::vector< float > topStripDirection
Definition: EFTrackingTransient.h:260
xAODSpacePointMaker::m_stripSpacePointsKey
SG::WriteHandleKey< xAOD::SpacePointContainer > m_stripSpacePointsKey
Key for the strip space points container to be created.
Definition: xAODSpacePointMaker.h:83
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
EFTrackingTransient::SpacePointAuxInput::bottomStripDirection
std::vector< float > bottomStripDirection
Definition: EFTrackingTransient.h:261
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
EFTrackingTransient::SpacePointAuxInput::stripCenterDistance
std::vector< float > stripCenterDistance
Definition: EFTrackingTransient.h:262
xAODSpacePointMaker::m_stripClusterKey
SG::ReadHandleKey< xAOD::StripClusterContainer > m_stripClusterKey
Key for the strip cluster container to read from.
Definition: xAODSpacePointMaker.h:73
python.checkMetadata.metadata
metadata
Definition: checkMetadata.py:175
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
EFTrackingTransient::SpacePointAuxInput::topHalfStripLength
std::vector< float > topHalfStripLength
Definition: EFTrackingTransient.h:258
SG::Decorator
Helper class to provide type-safe access to aux data.
Definition: Decorator.h:59
lumiFormat.i
int i
Definition: lumiFormat.py:85
EFTrackingTransient::SpacePointAuxInput::varianceR
std::vector< float > varianceR
Definition: EFTrackingTransient.h:256
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
EFTrackingTransient::SpacePointAuxInput::globalPosition
std::vector< float > globalPosition
Definition: EFTrackingTransient.h:254
EFTrackingTransient::SpacePointAuxInput::varianceZ
std::vector< float > varianceZ
Definition: EFTrackingTransient.h:257
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
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
EFTrackingTransient::SpacePointAuxInput::measurementIndexes
std::vector< int > measurementIndexes
Definition: EFTrackingTransient.h:264
EFTrackingTransient::SpacePointAuxInput::elementIdList
std::vector< unsigned int > elementIdList
Definition: EFTrackingTransient.h:253
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:73
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
DEBUG
#define DEBUG
Definition: page_access.h:11
EFTrackingTransient::SpacePointAuxInput::topStripCenter
std::vector< float > topStripCenter
Definition: EFTrackingTransient.h:263
generate::Zero
void Zero(TH1D *hin)
Definition: generate.cxx:32