ATLAS Offline Software
SCT_PrepDataToxAOD.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // SCT_PrepDataToxAOD.cxx
7 // Implementation file for class SCT_PrepDataToxAOD
9 
10 #include "SCT_PrepDataToxAOD.h"
11 
12 #include "Identifier/Identifier.h"
13 #include "InDetIdentifier/SCT_ID.h"
15 #include "InDetSimEvent/SiHit.h"
16 #include "StoreGate/ReadHandle.h"
17 #include "StoreGate/WriteHandle.h"
19 
20 #include "AtlasHepMC/GenParticle.h"
21 
22 #include "CLHEP/Geometry/Point3D.h"
23 
24 #include <cmath>
25 
26 #define AUXDATA(OBJ, TYP, NAME) \
27  static const SG::AuxElement::Accessor<TYP> acc_##NAME (#NAME); acc_##NAME(*(OBJ))
28 
30 //
31 // Constructor with parameters:
32 //
34 SCT_PrepDataToxAOD::SCT_PrepDataToxAOD(const std::string& name, ISvcLocator* pSvcLocator) :
35  AthReentrantAlgorithm(name, pSvcLocator)
36 {
37 }
38 
40 //
41 // Initialize method:
42 //
45 {
46  ATH_CHECK(detStore()->retrieve(m_SCTHelper, "SCT_ID"));
47 
48  //make sure we don't write what we don't have
49  if (not m_useTruthInfo) {
50  m_writeSDOs.set(false);
51  m_writeSiHits.set(false);
52  }
53 
59  ATH_CHECK(m_xAodContainer.initialize());
62 
64 
65  return StatusCode::SUCCESS;
66 }
67 
69 //
70 // Execute method:
71 //
73 StatusCode SCT_PrepDataToxAOD::execute(const EventContext& ctx) const
74 {
75  // the cluster ambiguity map
76  std::map<Identifier, const SCT_RDORawData*> idToRAWDataMap;
79  if (rdoContainer.isValid()) {
80  // get all the RIO_Collections in the container
81  for (const auto collection: *rdoContainer) {
82  //get all the RDOs in the collection
83  for (const auto rdo : *collection) {
84  if (rdo==nullptr) {
85  ATH_MSG_WARNING("Null SCT RDO. Skipping it");
86  continue;
87  }
88  Identifier rdoId{rdo->identify()};
89  idToRAWDataMap.insert(std::pair<Identifier, const SCT_RDORawData*>{rdoId, rdo});
90  } // collection
91  } // Have container;
92  } else if (m_firstEventWarnings) {
93  ATH_MSG_WARNING("Failed to retrieve SCT RDO container");
94  }
95  }
96  ATH_MSG_DEBUG("Size of RDO map is " << idToRAWDataMap.size());
97 
98  const PRD_MultiTruthCollection* prdmtColl{nullptr};
99  const xAODTruthParticleLinkVector *truth_particle_links{nullptr};
100  if (m_useTruthInfo) {
102  if (prdmtCollHandle.isValid()) {
103  prdmtColl = &*prdmtCollHandle;
104  }
105  if (!m_truthParticleLinks.empty()) {
107  if (truthParticleLinksHandle.isValid()) {
108  truth_particle_links = truthParticleLinksHandle.cptr();
109  }
110  }
111  }
112 
113  const InDetSimDataCollection* sdoCollection{nullptr};
114  if (m_writeSDOs) {
115  SG::ReadHandle<InDetSimDataCollection> sdoCollectionHandle{m_SDOcontainer, ctx};
116  if (sdoCollectionHandle.isValid()) {
117  sdoCollection = &*sdoCollectionHandle;
118  }
119  }
120 
121  std::vector<std::vector<const SiHit*>> siHits(m_SCTHelper->wafer_hash_max());
122  if (m_writeSiHits) {
124  if (sihitCollection.isValid()) {
125  for (const SiHit& siHit: *sihitCollection) {
126  // Check if it is an SCT hit
127  if (not siHit.isSCT()) continue;
128 
129  Identifier wafer_id{m_SCTHelper->wafer_id(siHit.getBarrelEndcap(),
130  siHit.getLayerDisk(),
131  siHit.getPhiModule(),
132  siHit.getEtaModule(),
133  siHit.getSide())};
134  IdentifierHash wafer_hash{m_SCTHelper->wafer_hash(wafer_id)};
135  siHits[wafer_hash].push_back(&siHit);
136  }
137  }
138  }
139 
140  // Mandatory. This is needed and required if this algorithm is scheduled.
142  if (not sctClusterContainer.isValid()) {
143  ATH_MSG_FATAL("Cannot retrieve SCT PrepDataContainer " << m_clustercontainer.key());
144  return StatusCode::FAILURE;
145  }
146 
147  // Create the xAOD container and its auxiliary store:
149  ATH_CHECK(xaod.record(std::make_unique<xAOD::TrackMeasurementValidationContainer>(),
150  std::make_unique<xAOD::TrackMeasurementValidationAuxContainer>()));
151 
153  ATH_CHECK(offsets.record(std::make_unique<std::vector<unsigned int>>(m_SCTHelper->wafer_hash_max(), 0)));
154 
155  unsigned int have_truth_link=0u;
156  unsigned int missing_truth_particle=0u;
157  unsigned int missing_parent_particle=0u;
158  // Loop over the container
159  unsigned int counter{0};
160  for (const auto clusterCollection: *sctClusterContainer) {
161  //Fill Offset container
162  (*offsets)[clusterCollection->identifyHash()] = counter;
163 
164  // skip empty collections
165  if (clusterCollection->empty()) continue;
166 
167  xaod->resize(counter + clusterCollection->size());
168  // loop over collection and convert to xAOD
169  for (const InDet::SCT_Cluster* prd: *clusterCollection) {
170  Identifier clusterId{prd->identify()};
171  if (not clusterId.is_valid()) {
172  ATH_MSG_WARNING("SCT cluster identifier is not valid!");
173  }
174 
175  // create and add xAOD object
177  xaod->at(counter) = xprd;
178  ++counter;
179 
180  //Set Identifier
181  xprd->setIdentifier(clusterId.get_compact());
182 
183  //Set Global Position
184  Amg::Vector3D gpos{prd->globalPosition()};
185  xprd->setGlobalPosition(gpos.x(), gpos.y(), gpos.z());
186 
187  //Set Local Position
188  const Amg::Vector2D& locpos{prd->localPosition()};
189  float locY{0.};
190  float locX{static_cast<float>(locpos.x())};
191  if ((not std::isinf(locpos.y()) or std::isnan(locpos.y()))) {
192  if (locpos.y()>=1e-07) locY = locpos.y();
193  } else {
194  locY = -9999.;
195  }
196 
197  // Set local error matrix
198  xprd->setLocalPosition(locX, locY);
199 
200  const Amg::MatrixX& localCov{prd->localCovariance()};
201  if (localCov.size() == 1) {
202  xprd->setLocalPositionError(localCov(0, 0), 0., 0.);
203  } else if (localCov.size() == 4) {
204  xprd->setLocalPositionError(localCov(0, 0), localCov(1, 1), localCov(0, 1));
205  } else {
206  xprd->setLocalPositionError(0., 0., 0.);
207  }
208 
209  // Set vector of hit identifiers
210  std::vector<uint64_t> rdoIdentifierList;
211  rdoIdentifierList.reserve(prd->rdoList().size());
212  for (const auto& hitIdentifier: prd->rdoList()) {
213  rdoIdentifierList.push_back(hitIdentifier.get_compact());
214  }
215  xprd->setRdoIdentifierList(rdoIdentifierList);
216 
217  //Add SCT specific information
218  const InDet::SiWidth cw{prd->width()};
219  AUXDATA(xprd, int, SiWidth) = static_cast<int>(cw.colRow()[0]);
220  AUXDATA(xprd, int, hitsInThirdTimeBin) = static_cast<int>(prd->hitsInThirdTimeBin());
221 
222  AUXDATA(xprd, int, bec) = m_SCTHelper->barrel_ec(clusterId);
223  AUXDATA(xprd, int, layer) = m_SCTHelper->layer_disk(clusterId);
224  AUXDATA(xprd, int, phi_module) = m_SCTHelper->phi_module(clusterId);
225  AUXDATA(xprd, int, eta_module) = m_SCTHelper->eta_module(clusterId);
226  AUXDATA(xprd, int, side) = m_SCTHelper->side(clusterId);
227 
228  // Add the Detector element ID -- not sure if needed as we have the informations above
229  const InDetDD::SiDetectorElement* de{prd->detectorElement()};
230  uint64_t detElementId{0};
231  if (de) {
232  Identifier detId{de->identify()};
233  if (detId.is_valid()) {
234  detElementId = detId.get_compact();
235  }
236  }
237  AUXDATA(xprd, uint64_t, detectorElementID) = detElementId;
238 
239  //Add details about the individual hits
240  if (m_writeRDOinformation) {
241  addRDOInformation(xprd, prd, idToRAWDataMap);
242  }
243 
244  // Use the MultiTruth Collection to get a list of all true particle contributing to the cluster
245  if (m_useTruthInfo) {
246  if (prdmtColl) {
247  auto range{prdmtColl->equal_range(clusterId)};
248  if (truth_particle_links) {
249  std::vector<unsigned int> tp_indices;
250  for (auto& i{range.first}; i!=range.second; ++i) {
251  ElementLink<xAOD::TruthParticleContainer> a_truth_particle_link = truth_particle_links->find(i->second);
252  if (a_truth_particle_link) {
253  const xAOD::TruthParticle *truth_particle = *a_truth_particle_link;
254  if (truth_particle) {
255  ++have_truth_link;
256  tp_indices.push_back(static_cast<int>(truth_particle->index()));
257  }
258  else {
259  ++missing_parent_particle;
260  }
261  }
262  else {
263  tp_indices.push_back(std::numeric_limits<unsigned int>::max());
264  ++missing_truth_particle;
265  }
266  }
267  // @TODO provide possibility to move tp_indices to its final destination
268  AUXDATA(xprd, std::vector<unsigned int>, truth_index) = tp_indices;
269  }
270  std::vector<int> barcodes; // FIXME barcode-based - requires xAOD::TrackMeasurementValidation to be migrated away from barcodes
271  for (auto& i{range.first}; i!=range.second; ++i) {
272  barcodes.push_back(HepMC::barcode(i->second));
273  }
274  // @TODO move vector
275  AUXDATA(xprd, std::vector<int>, truth_barcode) = barcodes;
276  }
277  }
278 
279  // Use the SDO Collection to get a list of all true particle contributing to the cluster per readout element
280  // Also get the energy deposited by each true particle per readout element
281  if (m_writeSDOs) {
282  if (sdoCollection) {
283  addSDOInformation(xprd, prd, sdoCollection);
284  }
285  }
286 
287  // Now Get the most detailed truth from the SiHits
288  // Note that this could get really slow if there are a lot of hits and clusters
289  if (m_writeSiHits) {
290  addSiHitInformation(xprd, prd, &siHits[prd->detectorElement()->identifyHash()]);
291  }
292  }
293  }
294  ATH_MSG_DEBUG(" recorded SCT_PrepData objects: size " << xaod->size());
295 
296  m_haveTruthLink += have_truth_link;
297  m_missingTruthParticle += missing_truth_particle;
298  m_missingParentParticle += missing_parent_particle;
299  m_firstEventWarnings = false; //disable one-time warnings
300 
301  return StatusCode::SUCCESS;
302 }
303 
305  const InDet::SCT_Cluster* prd,
306  const InDetSimDataCollection* sdoCollection) const
307 {
308  std::vector<int> sdo_word;
309  std::vector<std::vector<int>> sdo_depositsBarcode;
310  std::vector<std::vector<float>> sdo_depositsEnergy;
311  // find hit
312  for (const auto& hitIdentifier: prd->rdoList()) {
313  auto pos{sdoCollection->find(hitIdentifier)};
314  if (pos == sdoCollection->end()) continue;
315  sdo_word.push_back(pos->second.word());
316  std::vector<int> sdoDepBC(pos->second.getdeposits().size(), -1);
317  std::vector<float> sdoDepEnergy(pos->second.getdeposits().size());
318  unsigned int nDepos{0};
319  for (auto& deposit: pos->second.getdeposits()) {
320  if (deposit.first) sdoDepBC[nDepos] = HepMC::barcode(deposit.first);
321  ATH_MSG_DEBUG(" SDO Energy Deposit " << deposit.second);
322  sdoDepEnergy[nDepos] = deposit.second;
323  nDepos++;
324  }
325  sdo_depositsBarcode.push_back(sdoDepBC);
326  sdo_depositsEnergy.push_back(sdoDepEnergy);
327  }
328  AUXDATA(xprd, std::vector<int>, sdo_words) = sdo_word;
329  AUXDATA(xprd, std::vector<std::vector<int>>, sdo_depositsBarcode) = sdo_depositsBarcode;
330  AUXDATA(xprd, std::vector<std::vector<float>>, sdo_depositsEnergy) = sdo_depositsEnergy;
331 }
332 
333 
335  const InDet::SCT_Cluster* prd,
336  const std::vector<const SiHit*>* siHits) const
337 {
338  std::vector<SiHit> matchingHits;
339  findAllHitsCompatibleWithCluster(prd, siHits, matchingHits);
340 
341  long unsigned int numHits{matchingHits.size()};
342 
343  std::vector<float> sihit_energyDeposit(numHits, 0.);
344  std::vector<float> sihit_meanTime(numHits, 0.);
345  std::vector<int> sihit_barcode(numHits, 0);
346 
347  std::vector<float> sihit_startPosX(numHits, 0.);
348  std::vector<float> sihit_startPosY(numHits, 0.);
349  std::vector<float> sihit_startPosZ(numHits, 0.);
350 
351  std::vector<float> sihit_endPosX(numHits, 0);
352  std::vector<float> sihit_endPosY(numHits, 0);
353  std::vector<float> sihit_endPosZ(numHits, 0);
354 
355  int hitNumber{0};
357  if (de) {
358  for (const SiHit& sihit : matchingHits) {
359  sihit_energyDeposit[hitNumber] = sihit.energyLoss();
360  sihit_meanTime[hitNumber] = sihit.meanTime();
361  sihit_barcode[hitNumber] = HepMC::barcode(sihit.particleLink());
362 
363  // Convert Simulation frame into reco frame
364  const HepGeom::Point3D<double>& startPos{sihit.localStartPosition()};
365 
366  Amg::Vector2D pos{de->hitLocalToLocal(startPos.z(), startPos.y())};
367  sihit_startPosX[hitNumber] = pos[0];
368  sihit_startPosY[hitNumber] = pos[1];
369  sihit_startPosZ[hitNumber] = startPos.x();
370 
371  const HepGeom::Point3D<double>& endPos{sihit.localEndPosition()};
372  pos= de->hitLocalToLocal(endPos.z(), endPos.y());
373  sihit_endPosX[hitNumber] = pos[0];
374  sihit_endPosY[hitNumber] = pos[1];
375  sihit_endPosZ[hitNumber] = endPos.x();
376  ++hitNumber;
377  }
378  }
379 
380  AUXDATA(xprd, std::vector<float>, sihit_energyDeposit) = sihit_energyDeposit;
381  AUXDATA(xprd, std::vector<float>, sihit_meanTime) = sihit_meanTime;
382  AUXDATA(xprd, std::vector<int>, sihit_barcode) = sihit_barcode;
383 
384  AUXDATA(xprd, std::vector<float>, sihit_startPosX) = sihit_startPosX;
385  AUXDATA(xprd, std::vector<float>, sihit_startPosY) = sihit_startPosY;
386  AUXDATA(xprd, std::vector<float>, sihit_startPosZ) = sihit_startPosZ;
387 
388  AUXDATA(xprd, std::vector<float>, sihit_endPosX) = sihit_endPosX;
389  AUXDATA(xprd, std::vector<float>, sihit_endPosY) = sihit_endPosY;
390  AUXDATA(xprd, std::vector<float>, sihit_endPosZ) = sihit_endPosZ;
391 }
392 
394  const std::vector<const SiHit*>* siHits,
395  std::vector<SiHit>& matchingHits) const
396 {
397  ATH_MSG_VERBOSE("Got " << siHits->size() << " SiHits to look through");
398 
399  // Check if we have detector element -- needed to find the local position of the SiHits
401  if (de==nullptr) return;
402 
403  std::vector<const SiHit*> multiMatchingHits;
404 
405  for (const SiHit* siHit: *siHits) {
406  // Now we have all hits in the module that match lets check to see if they match the cluster
407  // Must be within +/- 1 hits of any hit in the cluster to be included
408 
409  HepGeom::Point3D<double> averagePosition{siHit->localStartPosition() + siHit->localEndPosition()};
410  averagePosition *= 0.5;
411  Amg::Vector2D pos{de->hitLocalToLocal(averagePosition.z(), averagePosition.y())};
412  InDetDD::SiCellId diode{de->cellIdOfPosition(pos)};
413 
414  for (const auto& hitIdentifier: prd->rdoList()) {
415  ATH_MSG_DEBUG("Truth Strip " << diode.phiIndex() << " Cluster Strip " << m_SCTHelper->strip(hitIdentifier));
416 
417  if (std::abs(static_cast<int>(diode.phiIndex()) - m_SCTHelper->strip(hitIdentifier))<=1) {
418  multiMatchingHits.push_back(siHit);
419  break;
420  }
421  }
422  }
423 
424  matchingHits.reserve(multiMatchingHits.size());
425  //Now we will now make 1 SiHit for each true particle if the SiHits "touch" other
426  std::vector<const SiHit*>::iterator siHitIter{multiMatchingHits.begin()};
427  std::vector<const SiHit*>::iterator siHitIter2{multiMatchingHits.begin()};
428  ATH_MSG_DEBUG("Found " << multiMatchingHits.size() << " SiHit ");
429  for (; siHitIter != multiMatchingHits.end(); ++siHitIter) {
430  const SiHit* lowestXPos{*siHitIter};
431  const SiHit* highestXPos{*siHitIter};
432 
433  // We will merge these hits
434  std::vector<const SiHit*> ajoiningHits;
435  ajoiningHits.push_back(*siHitIter);
436 
437  siHitIter2 = siHitIter+1;
438  auto bc = HepMC::barcode((*siHitIter)->particleLink());
439  while (siHitIter2 != multiMatchingHits.end()) {
440  // Need to come from the same truth particle
441  if ( bc != HepMC::barcode((*siHitIter2)->particleLink())) {
442  ++siHitIter2;
443  continue;
444  }
445 
446  constexpr double maxDiff = 0.00005;
447  // Check to see if the SiHits are compatible with each other.
448  if (std::abs((highestXPos->localEndPosition().x()-(*siHitIter2)->localStartPosition().x()))<maxDiff and
449  std::abs((highestXPos->localEndPosition().y()-(*siHitIter2)->localStartPosition().y()))<maxDiff and
450  std::abs((highestXPos->localEndPosition().z()-(*siHitIter2)->localStartPosition().z()))<maxDiff) {
451  highestXPos = *siHitIter2;
452  ajoiningHits.push_back(*siHitIter2);
453  // Dont use hit more than once
454  siHitIter2 = multiMatchingHits.erase(siHitIter2);
455  } else if (std::abs((lowestXPos->localStartPosition().x()-(*siHitIter2)->localEndPosition().x()))<maxDiff and
456  std::abs((lowestXPos->localStartPosition().y()-(*siHitIter2)->localEndPosition().y()))<maxDiff and
457  std::abs((lowestXPos->localStartPosition().z()-(*siHitIter2)->localEndPosition().z()))<maxDiff) {
458  lowestXPos = *siHitIter2;
459  ajoiningHits.push_back(*siHitIter2);
460  // Dont use hit more than once
461  siHitIter2 = multiMatchingHits.erase(siHitIter2);
462  } else {
463  ++siHitIter2;
464  }
465  }
466 
467  if (ajoiningHits.size()==0) {
468  ATH_MSG_ERROR("This should really never happen");
469  continue;
470  } else if (ajoiningHits.size()==1) {
471  // Copy Si Hit ready to return
472  matchingHits.emplace_back(*ajoiningHits[0]);
473  continue;
474  } else {
475  // Build new SiHit and merge information together.
476  ATH_MSG_DEBUG("Merging " << ajoiningHits.size() << " SiHits together.");
477  float energyDep{0.};
478  float time{0.};
479  for (auto& siHit: ajoiningHits) {
480  energyDep += siHit->energyLoss();
481  time += siHit->meanTime();
482  }
483  time /= static_cast<float>(ajoiningHits.size());
484  matchingHits.emplace_back(lowestXPos->localStartPosition(),
485  highestXPos->localEndPosition(),
486  energyDep,
487  time,
488  HepMC::barcode((*siHitIter)->particleLink()),
489  1, // 0 for pixel 1 for SCT
490  (*siHitIter)->getBarrelEndcap(),
491  (*siHitIter)->getLayerDisk(),
492  (*siHitIter)->getEtaModule(),
493  (*siHitIter)->getPhiModule(),
494  (*siHitIter)->getSide());
495  }
496  }
497 }
498 
500  const InDet::SCT_Cluster* prd,
501  const std::map<Identifier, const SCT_RDORawData*>& idToRAWDataMap) const {
502  std::vector<int> strip(prd->rdoList().size(), -1);
503  std::vector<int> timebin(prd->rdoList().size(), -1);
504  std::vector<int> groupsize(prd->rdoList().size(), -1);
505 
506  unsigned int nRDOs{0};
507  for (const auto& hitIdentifier: prd->rdoList()) {
508  auto result{idToRAWDataMap.find(hitIdentifier)};
509  if (result != idToRAWDataMap.end()) {
510  const SCT_RDORawData* sctRdo{result->second};
511  strip[nRDOs] = m_SCTHelper->strip(sctRdo->identify());
512  const SCT3_RawData* rdo3{dynamic_cast<const SCT3_RawData*>(sctRdo)};
513  if (rdo3) {
514  timebin[nRDOs] = rdo3->getTimeBin();
515  groupsize[nRDOs] = rdo3->getGroupSize();
516  }
517  }
518  nRDOs++;
519  }
520 
521  AUXDATA(xprd, std::vector<int>, rdo_strip) = strip;
522  AUXDATA(xprd, std::vector<int>, rdo_timebin) = timebin;
523  AUXDATA(xprd, std::vector<int>, rdo_groupsize) = groupsize;
524 }
525 
527 //
528 // Finalize method:
529 //
532 {
534  ATH_MSG_INFO("Missing truth particles " << m_missingTruthParticle << " missing parent: " << m_missingParentParticle
535  << " have " << m_haveTruthLink);
536  }
537  return StatusCode::SUCCESS;
538 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
SCT_PrepDataToxAOD::addRDOInformation
void addRDOInformation(xAOD::TrackMeasurementValidation *, const InDet::SCT_Cluster *, const std::map< Identifier, const SCT_RDORawData * > &idToRAWDataMap) const
Definition: SCT_PrepDataToxAOD.cxx:499
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
SCT_PrepDataToxAOD::m_haveTruthLink
std::atomic< unsigned int > m_haveTruthLink
Definition: SCT_PrepDataToxAOD.h:98
SCT_ID.h
This is an Identifier helper class for the SCT subdetector. This class is a factory for creating comp...
Amg::MatrixX
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Definition: EventPrimitives.h:29
SCT_PrepDataToxAOD.h
get_generator_info.result
result
Definition: get_generator_info.py:21
SiliconTech::strip
@ strip
max
#define max(a, b)
Definition: cfImp.cxx:41
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
Trk::locX
@ locX
Definition: ParamDefs.h:43
SCT_PrepDataToxAOD::m_xAodContainer
SG::WriteHandleKey< xAOD::TrackMeasurementValidationContainer > m_xAodContainer
Definition: SCT_PrepDataToxAOD.h:86
Trk::locY
@ locY
local cartesian
Definition: ParamDefs.h:44
SCT_PrepDataToxAOD::m_multiTruth
SG::ReadHandleKey< PRD_MultiTruthCollection > m_multiTruth
Definition: SCT_PrepDataToxAOD.h:81
ParticleGun_SamplingFraction.bec
int bec
Definition: ParticleGun_SamplingFraction.py:89
SiHit.h
make_unique
std::unique_ptr< T > make_unique(Args &&... args)
Definition: SkimmingToolEXOT5.cxx:23
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
TrackMeasurementValidationAuxContainer.h
xAOD::TrackMeasurementValidation
TrackMeasurementValidation_v1 TrackMeasurementValidation
Reference the current persistent version:
Definition: TrackMeasurementValidation.h:13
PRD_MultiTruthCollection
A PRD is mapped onto all contributing particles.
Definition: PRD_MultiTruthCollection.h:24
SCT_PrepDataToxAOD::m_SDOcontainer
SG::ReadHandleKey< InDetSimDataCollection > m_SDOcontainer
Definition: SCT_PrepDataToxAOD.h:79
Trk::PrepRawData::rdoList
const std::vector< Identifier > & rdoList() const
return the List of rdo identifiers (pointers)
SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster
void findAllHitsCompatibleWithCluster(const InDet::SCT_Cluster *prd, const std::vector< const SiHit * > *siHits, std::vector< SiHit > &matchingHits) const
Definition: SCT_PrepDataToxAOD.cxx:393
SCT_PrepDataToxAOD::SCT_PrepDataToxAOD
SCT_PrepDataToxAOD(const std::string &name, ISvcLocator *pSvcLocator)
Definition: SCT_PrepDataToxAOD.cxx:34
SCT_PrepDataToxAOD::m_missingTruthParticle
std::atomic< unsigned int > m_missingTruthParticle
Definition: SCT_PrepDataToxAOD.h:99
InDetSimDataCollection
Definition: InDetSimDataCollection.h:25
SCT_PrepDataToxAOD::initialize
virtual StatusCode initialize() override
Definition: SCT_PrepDataToxAOD.cxx:44
SCT_RDORawData
Definition: SCT_RDORawData.h:24
SCT_ID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: SCT_ID.h:728
SCT_ID::phi_module
int phi_module(const Identifier &id) const
Definition: SCT_ID.h:740
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
SCT_PrepDataToxAOD::m_SCTDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
Definition: SCT_PrepDataToxAOD.h:90
GenParticle.h
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:83
SCT_PrepDataToxAOD::m_xAodOffset
SG::WriteHandleKey< std::vector< unsigned int > > m_xAodOffset
Definition: SCT_PrepDataToxAOD.h:87
SCT_PrepDataToxAOD::m_rdoContainer
SG::ReadHandleKey< SCT_RDO_Container > m_rdoContainer
Definition: SCT_PrepDataToxAOD.h:85
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
SiHit
Definition: SiHit.h:19
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
TRT::Hit::side
@ side
Definition: HitInfo.h:83
xAOD::TrackMeasurementValidation_v1
Class describing a TrackMeasurementValidation.
Definition: TrackMeasurementValidation_v1.h:27
WriteHandle.h
Handle class for recording to StoreGate.
SCT_PrepDataToxAOD::finalize
virtual StatusCode finalize() override
Definition: SCT_PrepDataToxAOD.cxx:531
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
SCT_PrepDataToxAOD::m_SCTHelper
const SCT_ID * m_SCTHelper
Definition: SCT_PrepDataToxAOD.h:77
SCT_PrepDataToxAOD::m_writeSiHits
BooleanProperty m_writeSiHits
Definition: SCT_PrepDataToxAOD.h:95
python.Dumpers.barcodes
def barcodes(beg, end, sz)
Definition: Dumpers.py:2800
lumiFormat.i
int i
Definition: lumiFormat.py:92
SCT3_RawData
Definition: SCT3_RawData.h:24
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
SCT_PrepDataToxAOD::m_missingParentParticle
std::atomic< unsigned int > m_missingParentParticle
Definition: SCT_PrepDataToxAOD.h:100
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
HepMC::barcode
int barcode(const T *p)
Definition: Barcode.h:16
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:41
SCT_PrepDataToxAOD::addSDOInformation
void addSDOInformation(xAOD::TrackMeasurementValidation *xprd, const InDet::SCT_Cluster *prd, const InDetSimDataCollection *sdoCollection) const
Definition: SCT_PrepDataToxAOD.cxx:304
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
SCT_PrepDataToxAOD::m_useTruthInfo
BooleanProperty m_useTruthInfo
Definition: SCT_PrepDataToxAOD.h:92
SCT_ID::wafer_hash
IdentifierHash wafer_hash(const Identifier &wafer_id) const
wafer hash from id - optimized
Definition: SCT_ID.h:492
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
InDet::SCT_Cluster
Definition: InnerDetector/InDetRecEvent/InDetPrepRawData/InDetPrepRawData/SCT_Cluster.h:34
SG::AuxElement::index
size_t index() const
Return the index of this element within its container.
InDet::SiCluster::detectorElement
virtual const InDetDD::SiDetectorElement * detectorElement() const override final
return the detector element corresponding to this PRD The pointer will be zero if the det el is not d...
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
SCT_ID::wafer_hash_max
size_type wafer_hash_max(void) const
Definition: SCT_ID.cxx:639
SCT_PrepDataToxAOD::m_writeSDOs
BooleanProperty m_writeSDOs
Definition: SCT_PrepDataToxAOD.h:94
SCT_RDO_Collection.h
SCT_ID::layer_disk
int layer_disk(const Identifier &id) const
Definition: SCT_ID.h:734
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
SCT_PrepDataToxAOD::m_writeRDOinformation
BooleanProperty m_writeRDOinformation
Definition: SCT_PrepDataToxAOD.h:93
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
InDetDD::SiCellId
Definition: SiCellId.h:29
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
Identifier::get_compact
value_type get_compact(void) const
Get the compact id.
CaloSwCorrections.time
def time(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:242
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
SCT_ID::strip
int strip(const Identifier &id) const
Definition: SCT_ID.h:764
SCT_PrepDataToxAOD::m_clustercontainer
SG::ReadHandleKey< InDet::SCT_ClusterContainer > m_clustercontainer
Definition: SCT_PrepDataToxAOD.h:78
xAODTruthParticleLinkVector
Definition: xAODTruthParticleLink.h:26
SCT_ID::eta_module
int eta_module(const Identifier &id) const
Definition: SCT_ID.h:746
InDet::SiWidth
Definition: SiWidth.h:25
SCT_PrepDataToxAOD::m_firstEventWarnings
std::atomic_bool m_firstEventWarnings
Definition: SCT_PrepDataToxAOD.h:101
SCT_ID::side
int side(const Identifier &id) const
Definition: SCT_ID.h:752
SCT_PrepDataToxAOD::m_sihitContainer
SG::ReadHandleKey< SiHitCollection > m_sihitContainer
Definition: SCT_PrepDataToxAOD.h:80
SCT_PrepDataToxAOD::addSiHitInformation
void addSiHitInformation(xAOD::TrackMeasurementValidation *xprd, const InDet::SCT_Cluster *prd, const std::vector< const SiHit * > *siHits) const
Definition: SCT_PrepDataToxAOD.cxx:334
ReadHandle.h
Handle class for reading from StoreGate.
SCT_ID::wafer_id
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module, int side) const
For a single side of module.
Definition: SCT_ID.h:464
IdentifierHash
Definition: IdentifierHash.h:38
AUXDATA
#define AUXDATA(OBJ, TYP, NAME)
Definition: SCT_PrepDataToxAOD.cxx:26
SCT_PrepDataToxAOD::m_truthParticleLinks
SG::ReadHandleKey< xAODTruthParticleLinkVector > m_truthParticleLinks
Definition: SCT_PrepDataToxAOD.h:83
test_pyathena.counter
counter
Definition: test_pyathena.py:15
SCT_PrepDataToxAOD::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: SCT_PrepDataToxAOD.cxx:73