ATLAS Offline Software
xAODTruthCnvAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 #include "xAODTruthCnvAlg.h"
5 
7 #include "AthLinks/ElementLink.h"
8 
9 #include "GaudiKernel/MsgStream.h"
10 #include "GaudiKernel/DataSvc.h"
11 #include "GaudiKernel/PhysicalConstants.h"
12 #include "StoreGate/ReadHandle.h"
13 #include "StoreGate/WriteHandle.h"
14 
15 #include "xAODTruth/TruthEvent.h"
18 
22 
26 
27 #include "xAODTruth/TruthVertex.h"
30 
33 
36 
37 #include "AtlasHepMC/GenVertex.h"
38 #include "AtlasHepMC/GenParticle.h"
40 
41 bool isSeparatorGenEvent(const HepMC::GenEvent *genEvt) {
42  // Separator defined by pid==0 and eventNumber==-1 as per
43  // https://twiki.cern.ch/twiki/bin/viewauth/AtlasComputing/PileupDigitization#Arrangement_of_Truth_Information
44  const int pid = HepMC::signal_process_id(genEvt);
45  const int eventNumber = genEvt->event_number();
46  return (pid==0 && eventNumber==-1);
47 }
48 
49 using namespace std;
50 
51 namespace xAODMaker {
52 
53 
54  xAODTruthCnvAlg::xAODTruthCnvAlg( const string& name, ISvcLocator* svcLoc )
55  : AthReentrantAlgorithm( name, svcLoc )
56  , m_metaStore( "MetaDataStore", name )
57  , m_firstBeginRun(true)
58  {
59  // leaving metadata alone for now--to be updated
60  declareProperty( "MetaObjectName", m_metaName = "TruthMetaData" );
61  declareProperty( "MetaDataStore", m_metaStore );
62  }
63 
64 
67  ATH_MSG_FATAL( "Contradictory xAOD truth pile-up setting: all pile-up AND in-time alone requested simultaneously. Check settings." );
68  return StatusCode::FAILURE;
69  }
70 
71  if (m_writeMetaData) {
72  ATH_CHECK( m_meta.initialize (m_metaStore, m_metaName) );
73  }
74 
75  // initialize handles
77 
78  // only if doing full truth
84 
86 
87  ServiceHandle<IIncidentSvc> incSvc("IncidentSvc", name());
88  ATH_CHECK(incSvc.retrieve());
89  incSvc->addListener( this, "BeginRun", 10);
90 
91  ATH_MSG_DEBUG("AODContainerName = " << m_aodContainerKey.key() );
92  ATH_MSG_DEBUG("xAOD TruthEventContainer name = " << m_xaodTruthEventContainerKey.key() );
93  ATH_MSG_DEBUG("xAOD TruthPileupEventContainer name = " << m_xaodTruthPUEventContainerKey.key());
94  ATH_MSG_DEBUG("xAOD TruthParticleContainer name = " << m_xaodTruthParticleContainerKey.key() );
95  ATH_MSG_DEBUG("xAOD TruthVertexContainer name = " << m_xaodTruthVertexContainerKey.key() );
96 
97  if (m_doAllPileUp) ATH_MSG_INFO( "All pile-up truth (including out-of-time) will be written" );
98  if (m_doInTimePileUp) ATH_MSG_INFO( "In-time pile-up truth (but not out-of-time) will be written" );
99  if (!m_doAllPileUp && !m_doInTimePileUp) ATH_MSG_INFO( "No pile-up truth will be written" );
100 
101  return StatusCode::SUCCESS;
102  }
103 
104 
105  StatusCode xAODTruthCnvAlg::execute (const EventContext& ctx) const {
106 
108  ATH_CHECK(truthLinkVec.record(std::make_unique<xAODTruthParticleLinkVector>()));
109 
110  // Retrieve the HepMC truth:
112  // validity check is only really needed for serial running. Remove when MT is only way.
113  if (!mcColl.isValid()) {
114  ATH_MSG_ERROR("Could not retrieve HepMC with key:" << m_aodContainerKey.key());
115  return StatusCode::FAILURE;
116  } else {
117  ATH_MSG_DEBUG( "Retrieved HepMC with key: " << m_aodContainerKey.key() );
118  }
119 
120  // **************************************************************
121  // Create the xAOD containers and their auxiliary stores:
122  // **************************************************************
123  // Signal event
125  ATH_CHECK(xTruthEventContainer.record(std::make_unique<xAOD::TruthEventContainer>(),
126  std::make_unique<xAOD::TruthEventAuxContainer>()));
127  ATH_MSG_DEBUG( "Recorded TruthEventContainer with key: " << m_xaodTruthEventContainerKey.key() );
128 
129  // Pile-up events
130  SG::WriteHandle<xAOD::TruthPileupEventContainer> xTruthPileupEventContainer;
133  ATH_CHECK(xTruthPileupEventContainer.record(std::make_unique<xAOD::TruthPileupEventContainer>(),
134  std::make_unique<xAOD::TruthPileupEventAuxContainer>()));
135  ATH_MSG_DEBUG( "Recorded TruthPileupEventContainer with key: " << m_xaodTruthPUEventContainerKey.key() );
136  }
137 
138  // Particles
140  ATH_CHECK(xTruthParticleContainer.record(std::make_unique<xAOD::TruthParticleContainer>(),
141  std::make_unique<xAOD::TruthParticleAuxContainer>()));
142  ATH_MSG_DEBUG( "Recorded TruthParticleContainer with key: " << m_xaodTruthParticleContainerKey.key() );
143  // Vertices
145  ATH_CHECK(xTruthVertexContainer.record(std::make_unique<xAOD::TruthVertexContainer>(),
146  std::make_unique<xAOD::TruthVertexAuxContainer>()));
147  ATH_MSG_DEBUG( "Recorded TruthVertexContainer with key: " << m_xaodTruthVertexContainerKey.key() );
148 
149  // ***********************************************************************************
150  // Create the xAOD objects
151  // This consists of three parts:
152  // (1) For each Athena event, loop over the GenEvents and build TruthEvent collections
153  // In principle there can be more than one GenEvent per event
154  // (2) For each GenEvent, loop over the GenParticles. For each GenParticle:
155  // (a) Create a TruthParticle.
156  // (b) Call fillParticle
157  // (c) Add the TruthParticle to the TruthParticle container, and add
158  // an EL to this TruthParticle to the truthParticles in TruthEvent
159  // (call this EL eltp)
160  // (d) For the GenVertex * that's this particle's production vertex,
161  // (i) see if it is in tempMap. If not, add it.
162  // (ii) add a copy of eltp (the EL to this truth particle) to map[gv].second
163  // (e) For the GenVertex * that's this particle's decay vertex,
164  // (i) see if it is in tempMap. If not, add it.
165  // (ii) add a copy of eltp (the EL to this truth particle) to map[gv].first
166  // (3) Iterate over tempMap. For each GenVertex *:
167  // (a) Create a TruthVertex
168  // (b) Call fillVertex
169  // (c) Add the TruthVertex to the TruthTruth container, and add an EL to this TruthVertex
170  // to the truthVertices in TruthEvent. (call this EL eltv)
171  // (d) call tv->setIncomingParticles(mapiter.second.first) <- I think mapiter.second.first is the first of the pair
172  // (e) call tv->setOutgoingParticles(mapiter.second.second)
173  // (f) Iterate through the incomingParticles, and set the decay vertex EL as eltv.
174  // (g) Iterate through the outgoingParticles, and set the incoming vertex EL as eltv.
175  //
176  // Comment lines below follow this recipe
177  // ************************************************************************************
178 
179  // (1) Build TruthEvents
180  ATH_MSG_DEBUG("Number of GenEvents in this Athena event = " << mcColl->size());
181 #ifdef HEPMC3
182  bool newAttributesPresent(false);
183 #endif
184  for (unsigned int cntr = 0; cntr < mcColl->size(); ++cntr) {
185  const HepMC::GenEvent* genEvt = (*mcColl)[cntr];
186  bool isSignalProcess(false);
187  if (cntr==0) {
188  isSignalProcess=true;
189 #ifdef HEPMC3
190  auto bunchCrossingTime = genEvt->attribute<HepMC3::IntAttribute>("BunchCrossingTime");
191  if (bunchCrossingTime) {
192  newAttributesPresent = true;
193  ATH_MSG_VERBOSE("New attributes present.");
194  }
195  else {
196  ATH_MSG_VERBOSE("New attributes missing.");
197  }
198 #else
199  ATH_MSG_VERBOSE("New attributes missing.");
200 #endif
201  }
202  if (cntr>0) {
203  // Handle pile-up events
204  if (!m_doInTimePileUp && !m_doAllPileUp) break;
205  isSignalProcess=false;
206 #ifdef HEPMC3
207  auto bunchCrossingTime = genEvt->attribute<HepMC3::IntAttribute>("BunchCrossingTime");
208  if (bunchCrossingTime) {
209  // New approach based on checking the bunch crossing
210  // time directly.
211  if (m_doInTimePileUp && std::abs(bunchCrossingTime->value()) > 0) {
212  // Skip out-of-time pile-up events
213  continue;
214  }
215  }
216  else {
217  // Old approach based on McEventCollection structure. If
218  // in-time pileup only is requested, loop stops when the
219  // separator GenEvent between out-of-time and in-time is
220  // reached
221  if (m_doInTimePileUp && isSeparatorGenEvent(genEvt)) {
222  if (newAttributesPresent) {
223  // Old structure with new Attributes?! Check all
224  // GenEvents just in case.
225  ATH_MSG_VERBOSE("New-style, but seeing separator GenEvents");
226  continue;
227  }
228  // Old structure - stop at the first separator
229  // GenEvent.
230  break;
231  }
232  }
233 #else
234  // Old approach based on McEventCollection structure. If
235  // in-time pileup only is requested, loop stops when the
236  // separator GenEvent between out-of-time and in-time is
237  // reached
238  if (m_doInTimePileUp && isSeparatorGenEvent(genEvt)) {
239  // Old structure - stop at the first separator
240  // GenEvent.
241  break;
242  }
243 #endif
244  }
245 
246  xAOD::TruthEvent* xTruthEvent = new xAOD::TruthEvent();
247  xAOD::TruthPileupEvent* xTruthPileupEvent = new xAOD::TruthPileupEvent();
248 
249 
250  if (isSignalProcess) {
251  xTruthEventContainer->push_back( xTruthEvent );
252  // Cross-section
253  auto crossSection = genEvt->cross_section();
254 #ifdef HEPMC3
255  xTruthEvent->setCrossSection(crossSection ? (float)crossSection->xsec() : -1);
256  xTruthEvent->setCrossSectionError(crossSection ? (float)crossSection->xsec_err() : -1);
257 #else
258  xTruthEvent->setCrossSection(crossSection ? (float)crossSection->cross_section() : -1);
259  xTruthEvent->setCrossSectionError(crossSection ? (float)crossSection->cross_section_error() : -1);
260 #endif
261 
262  if (m_writeMetaData) {
263  //The mcChannelNumber is used as a unique identifier for which truth meta data belongs to
266  if (evtInfo.isValid()) {
267  mcChannelNumber = evtInfo->mcChannelNumber();
268  if (mcChannelNumber==0) mcChannelNumber = evtInfo->runNumber();
269  }
270  else {
271  ATH_MSG_FATAL("Faied to retrieve EventInfo");
272  return StatusCode::FAILURE;
273  }
274 
275  ATH_CHECK( m_meta.maybeWrite (mcChannelNumber, *genEvt, m_metaFields) );
276  }
277  // Event weights
278  vector<float> weights;
279  for (const double& w : genEvt->weights()) weights.push_back((float)(w));
280  //AV This to be decided. It is always a good idea to have a default weight 1.0.
281  //if (weights.empty()) weights.push_back(1.0);
282  xTruthEvent->setWeights(weights);
283 
284  // Heavy ion info
285  auto const hiInfo = genEvt->heavy_ion();
286  if (hiInfo) {
287 #ifdef HEPMC3
288  /* Please note HepMC3 as well as more recent HePMC2 versions have more Hi parameters */
289  xTruthEvent->setHeavyIonParameter(hiInfo->Ncoll_hard, xAOD::TruthEvent::NCOLLHARD);
290  xTruthEvent->setHeavyIonParameter(hiInfo->Npart_proj, xAOD::TruthEvent::NPARTPROJ);
291  xTruthEvent->setHeavyIonParameter(hiInfo->Npart_targ, xAOD::TruthEvent::NPARTTARG);
292  xTruthEvent->setHeavyIonParameter(hiInfo->Ncoll, xAOD::TruthEvent::NCOLL);
293  xTruthEvent->setHeavyIonParameter(hiInfo->spectator_neutrons, xAOD::TruthEvent::SPECTATORNEUTRONS);
294  xTruthEvent->setHeavyIonParameter(hiInfo->spectator_protons, xAOD::TruthEvent::SPECTATORPROTONS);
295  xTruthEvent->setHeavyIonParameter(hiInfo->N_Nwounded_collisions, xAOD::TruthEvent::NNWOUNDEDCOLLISIONS);
296  xTruthEvent->setHeavyIonParameter(hiInfo->Nwounded_N_collisions, xAOD::TruthEvent::NWOUNDEDNCOLLISIONS);
297  xTruthEvent->setHeavyIonParameter(hiInfo->Nwounded_Nwounded_collisions, xAOD::TruthEvent::NWOUNDEDNWOUNDEDCOLLISIONS);
298  xTruthEvent->setHeavyIonParameter((float)hiInfo->impact_parameter, xAOD::TruthEvent::IMPACTPARAMETER);
299  xTruthEvent->setHeavyIonParameter((float)hiInfo->event_plane_angle, xAOD::TruthEvent::EVENTPLANEANGLE);
300  xTruthEvent->setHeavyIonParameter((float)hiInfo->eccentricity, xAOD::TruthEvent::ECCENTRICITY);
301  xTruthEvent->setHeavyIonParameter((float)hiInfo->sigma_inel_NN, xAOD::TruthEvent::SIGMAINELNN);
302 #else
303  xTruthEvent->setHeavyIonParameter(hiInfo->Ncoll_hard(), xAOD::TruthEvent::NCOLLHARD);
304  xTruthEvent->setHeavyIonParameter(hiInfo->Npart_proj(), xAOD::TruthEvent::NPARTPROJ);
305  xTruthEvent->setHeavyIonParameter(hiInfo->Npart_targ(), xAOD::TruthEvent::NPARTTARG);
306  xTruthEvent->setHeavyIonParameter(hiInfo->Ncoll(), xAOD::TruthEvent::NCOLL);
307  xTruthEvent->setHeavyIonParameter(hiInfo->spectator_neutrons(), xAOD::TruthEvent::SPECTATORNEUTRONS);
308  xTruthEvent->setHeavyIonParameter(hiInfo->spectator_protons(), xAOD::TruthEvent::SPECTATORPROTONS);
309  xTruthEvent->setHeavyIonParameter(hiInfo->N_Nwounded_collisions(), xAOD::TruthEvent::NNWOUNDEDCOLLISIONS);
310  xTruthEvent->setHeavyIonParameter(hiInfo->Nwounded_N_collisions(), xAOD::TruthEvent::NWOUNDEDNCOLLISIONS);
311  xTruthEvent->setHeavyIonParameter(hiInfo->Nwounded_Nwounded_collisions(), xAOD::TruthEvent::NWOUNDEDNWOUNDEDCOLLISIONS);
312  xTruthEvent->setHeavyIonParameter(hiInfo->impact_parameter(), xAOD::TruthEvent::IMPACTPARAMETER);
313  xTruthEvent->setHeavyIonParameter(hiInfo->event_plane_angle(), xAOD::TruthEvent::EVENTPLANEANGLE);
314  xTruthEvent->setHeavyIonParameter(hiInfo->eccentricity(), xAOD::TruthEvent::ECCENTRICITY);
315  xTruthEvent->setHeavyIonParameter(hiInfo->sigma_inel_NN(), xAOD::TruthEvent::SIGMAINELNN);
316 #endif
317  // This doesn't yet exist in our version of HepMC
318  // xTruthEvent->setHeavyIonParameter(hiInfo->centrality(),xAOD::TruthEvent::CENTRALITY);
319  }
320 
321  // Parton density info
322  // This will exist 99% of the time, except for e.g. cosmic or particle gun simulation
323  auto const pdfInfo = genEvt->pdf_info();
324  if (pdfInfo) {
325 #ifdef HEPMC3
326  xTruthEvent->setPdfInfoParameter(pdfInfo->parton_id[0], xAOD::TruthEvent::PDGID1);
327  xTruthEvent->setPdfInfoParameter(pdfInfo->parton_id[1], xAOD::TruthEvent::PDGID2);
328  xTruthEvent->setPdfInfoParameter(pdfInfo->pdf_id[1], xAOD::TruthEvent::PDFID1);
329  xTruthEvent->setPdfInfoParameter(pdfInfo->pdf_id[1], xAOD::TruthEvent::PDFID2);
330 
331  xTruthEvent->setPdfInfoParameter((float)pdfInfo->x[0], xAOD::TruthEvent::X1);
332  xTruthEvent->setPdfInfoParameter((float)pdfInfo->x[1], xAOD::TruthEvent::X2);
333  xTruthEvent->setPdfInfoParameter((float)pdfInfo->scale, xAOD::TruthEvent::Q);
334  xTruthEvent->setPdfInfoParameter((float)pdfInfo->xf[0], xAOD::TruthEvent::XF1);
335  xTruthEvent->setPdfInfoParameter((float)pdfInfo->xf[1], xAOD::TruthEvent::XF2);
336 #else
337  xTruthEvent->setPdfInfoParameter(pdfInfo->id1(), xAOD::TruthEvent::PDGID1);
338  xTruthEvent->setPdfInfoParameter(pdfInfo->id2(), xAOD::TruthEvent::PDGID2);
339  xTruthEvent->setPdfInfoParameter(pdfInfo->pdf_id1(), xAOD::TruthEvent::PDFID1);
340  xTruthEvent->setPdfInfoParameter(pdfInfo->pdf_id2(), xAOD::TruthEvent::PDFID2);
341 
342  xTruthEvent->setPdfInfoParameter((float)pdfInfo->x1(), xAOD::TruthEvent::X1);
343  xTruthEvent->setPdfInfoParameter((float)pdfInfo->x2(), xAOD::TruthEvent::X2);
344  xTruthEvent->setPdfInfoParameter((float)pdfInfo->scalePDF(), xAOD::TruthEvent::Q);
345  xTruthEvent->setPdfInfoParameter((float)pdfInfo->pdf1(), xAOD::TruthEvent::XF1);
346  xTruthEvent->setPdfInfoParameter((float)pdfInfo->pdf2(), xAOD::TruthEvent::XF2);
347 #endif
348  }
349  }else{//not isSignalProcess
350  xTruthPileupEventContainer->push_back( xTruthPileupEvent );
351  }
352 
353  // (2) Build particles and vertices
354  // Map for building associations between particles and vertices
355  // The pair in the map is the (incomingParticles . outgoingParticles) of the given vertex
356  // If signal process vertex is a disconnected vertex (no incoming/outgoing particles), add it manually
357  VertexMap vertexMap;
358  VertexMap::iterator mapItr;
359  vector<HepMC::ConstGenVertexPtr> vertices;
360 
361  // Check signal process vertex
362  // If this is a disconnected vertex, add it manually or won't be added from the loop over particles below.
363  auto disconnectedSignalProcessVtx = HepMC::signal_process_vertex(genEvt); // Get the signal process vertex
364  if (disconnectedSignalProcessVtx) {
365  if (disconnectedSignalProcessVtx->particles_in_size() == 0 && disconnectedSignalProcessVtx->particles_out_size() == 0 ) {
366  //This is a disconnected vertex, add it manually
367  vertices.push_back (disconnectedSignalProcessVtx);
368  }
369  } else {
370  ATH_MSG_WARNING("Signal process vertex pointer not valid in HepMC Collection for GenEvent #" << cntr << " / " << mcColl->size());
371  }
372 
373  // Get the beam particles
374  pair<HepMC::ConstGenParticlePtr,HepMC::ConstGenParticlePtr> beamParticles;
375  bool genEvt_valid_beam_particles=false;
376 #ifdef HEPMC3
377  auto beamParticles_vec = genEvt->beams();
378  genEvt_valid_beam_particles=(beamParticles_vec.size()>1);
379  if (genEvt_valid_beam_particles){beamParticles.first=beamParticles_vec[0]; beamParticles.second=beamParticles_vec[1]; }
380  // We want to process particles in barcode order.
381  auto bcmapatt = genEvt->attribute<HepMC::GenEventBarcodes>("barcodes"); // FIXME barcode-based
382  if (!bcmapatt) ATH_MSG_ERROR("TruthParticleCnvTool.cxx: Event does not contain barcodes attribute");
383  std::map<int, HepMC3::ConstGenParticlePtr> bcmap = bcmapatt->barcode_to_particle_map();
384  xTruthParticleContainer->reserve(bcmap.size());
385  for (const auto &[genPartBarcode,part]: bcmap) {
386 #else
387  genEvt_valid_beam_particles=genEvt->valid_beam_particles();
388  if ( genEvt_valid_beam_particles ) beamParticles = genEvt->beam_particles();
389  xTruthParticleContainer->reserve(genEvt->particles_size());
390  for (auto part: *genEvt) {
391  int genPartBarcode = HepMC::barcode(part); // FIXME barcode-based
392 #endif
393  // (a) create TruthParticle
394  xAOD::TruthParticle* xTruthParticle = new xAOD::TruthParticle();
395  // (b) Put particle into container;
396  xTruthParticleContainer->push_back( xTruthParticle );
397  fillParticle(xTruthParticle, part); // (c) Copy HepMC info into the new particle
398  // (d) Build Event<->Particle element link
399  const ElementLink<xAOD::TruthParticleContainer> eltp(*xTruthParticleContainer, xTruthParticleContainer->size()-1);
400  if (isSignalProcess) xTruthEvent->addTruthParticleLink(eltp);
401  if (!isSignalProcess) xTruthPileupEvent->addTruthParticleLink(eltp);
402 
403  // Create link between HepMC and xAOD truth
404  if (isSignalProcess) truthLinkVec->push_back(new xAODTruthParticleLink(HepMcParticleLink(genPartBarcode,0,HepMcParticleLink::IS_POSITION, HepMcParticleLink::IS_BARCODE), eltp)); // FIXME barcode-based
405  if (!isSignalProcess) truthLinkVec->push_back(new xAODTruthParticleLink(HepMcParticleLink(genPartBarcode,genEvt->event_number(), HepMcParticleLink::IS_EVENTNUM, HepMcParticleLink::IS_BARCODE), eltp)); // FIXME barcode-based
406 
407  // Is this one of the beam particles?
408  if (genEvt_valid_beam_particles) {
409  if (isSignalProcess) {
410  if (part == beamParticles.first) xTruthEvent->setBeamParticle1Link(eltp);
411  if (part == beamParticles.second) xTruthEvent->setBeamParticle2Link(eltp);
412  }
413  }
414  // (e) Particle's production vertex
415  auto productionVertex = part->production_vertex();
416  // Skip the dummy vertex that HepMC3 adds
417  // Can distinguish it from real vertices because it has
418  // a null event pointer.
419  if (productionVertex && productionVertex->parent_event() != nullptr) {
420  VertexParticles& parts = vertexMap[productionVertex];
421  if (parts.incoming.empty() && parts.outgoing.empty())
422  vertices.push_back (productionVertex);
423  parts.outgoingEL.push_back(eltp);
424  parts.outgoing.push_back(xTruthParticle);
425  }
426  //
427  // else maybe want to keep track that this is the production vertex
428  //
429  // (f) Particle's decay vertex
430  auto decayVertex = part->end_vertex();
431  if (decayVertex) {
432  VertexParticles& parts = vertexMap[decayVertex];
433  if (parts.incoming.empty() && parts.outgoing.empty())
434  vertices.push_back (decayVertex);
435  parts.incomingEL.push_back(eltp);
436  parts.incoming.push_back(xTruthParticle);
437  }
438 
439  } // end of loop over particles
440 
441  // (3) Loop over the map
442  auto signalProcessVtx = HepMC::signal_process_vertex(genEvt); // Get the signal process vertex
443  xTruthVertexContainer->reserve(vertices.size());
444  for (const auto& vertex : vertices) {
445  const auto& parts = vertexMap[vertex];
446  // (a) create TruthVertex
447  xAOD::TruthVertex* xTruthVertex = new xAOD::TruthVertex();
448  // (b) Put particle into container (so has store)
449  xTruthVertexContainer->push_back( xTruthVertex );
450  fillVertex(xTruthVertex, vertex); // (c) Copy HepMC info into the new vertex
451  // (d) Build Event<->Vertex element link
452  ElementLink<xAOD::TruthVertexContainer> eltv(*xTruthVertexContainer, xTruthVertexContainer->size()-1);
453  // Mark if this is the signal process vertex
454  if (vertex == signalProcessVtx && isSignalProcess) xTruthEvent->setSignalProcessVertexLink(eltv);
455  if (isSignalProcess) xTruthEvent->addTruthVertexLink(eltv);
456  if (!isSignalProcess) xTruthPileupEvent->addTruthVertexLink(eltv);
457  // (e) Assign incoming particles to the vertex, from the map
458  xTruthVertex->setIncomingParticleLinks( parts.incomingEL );
459  // (f) Assign outgoing particles to the vertex, from the map
460  xTruthVertex->setOutgoingParticleLinks( parts.outgoingEL );
461  // (g) Set Particle<->Vertex links for incoming particles
462  for (xAOD::TruthParticle* p : parts.incoming) p->setDecayVtxLink(eltv);
463  // (h) Set Particle<->Vertex links for incoming particles
464  for (xAOD::TruthParticle* p : parts.outgoing) p->setProdVtxLink(eltv);
465  } //end of loop over vertices
466 
467  // Delete the event that wasn't used
468  if (isSignalProcess) delete xTruthPileupEvent;
469  if (!isSignalProcess) delete xTruthEvent;
470 
471  } // end of loop over McEventCollection
472 
473 
474  std::stable_sort(truthLinkVec->begin(), truthLinkVec->end(), SortTruthParticleLink());
475  ATH_MSG_VERBOSE("Summarizing truth link size: " << truthLinkVec->size() );
476 
477  return StatusCode::SUCCESS;
478  }
479 
480  void xAODTruthCnvAlg::handle(const Incident& incident) {
481  if (m_firstBeginRun && incident.type()==IncidentType::BeginRun) {
482  m_firstBeginRun = false;
483  ServiceHandle<StoreGateSvc> inputStore("StoreGateSvc/InputMetaDataStore", name());
484  if(inputStore.retrieve().isFailure()) {
485  ATH_MSG_ERROR("Failed to retrieve Input Metadata Store");
486  return;
487  }
488  const IOVMetaDataContainer* tagInfo{nullptr};
489  if(inputStore->retrieve(tagInfo,"/TagInfo").isFailure()) {
490  ATH_MSG_WARNING("Failed to retrieve /TagInfo metadata from the input store");
491  return;
492  }
493  if(tagInfo->payloadContainer()->size()>0) {
494  CondAttrListCollection* tagInfoPayload = tagInfo->payloadContainer()->at(0);
495  if(tagInfoPayload->size()>0) {
496  const CondAttrListCollection::AttributeList& al = tagInfoPayload->attributeList(0);
497  if (al.exists("lhefGenerator")){
498  m_metaFields.lhefGenerator = al["lhefGenerator"].data<std::string>();
499  }
500 
501  if (al.exists("generators")){
502  m_metaFields.generators = al["generators"].data<std::string>();
503  }
504 
505  if (al.exists("evgenProcess")){
506  m_metaFields.evgenProcess = al["evgenProcess"].data<std::string>();
507  }
508 
509  if (al.exists("evgenTune")){
510  m_metaFields.evgenTune = al["evgenTune"].data<std::string>();
511  }
512 
513  if (al.exists("hardPDF")){
514  m_metaFields.hardPDF = al["hardPDF"].data<std::string>();
515  }
516 
517  if (al.exists("softPDF")){
518  m_metaFields.softPDF = al["softPDF"].data<std::string>();
519  }
520  }
521  }
522  else {
523  ATH_MSG_WARNING("Empty Tag Info metadata!");
524  }
525  }
526  }
527 
528 
529  // A helper to set up a TruthVertex (without filling the ELs)
531  // id was renamed to status in HepMC3.
532  tv->setId(HepMC::old_vertex_status_from_new(HepMC::status(gv))); // For now convert the status back to the old scheme
533  tv->setBarcode(HepMC::barcode(gv)); // FIXME barcode-based
534  tv->setX(gv->position().x());
535  tv->setY(gv->position().y());
536  tv->setZ(gv->position().z());
537  tv->setT(gv->position().t());
538  }
539 
540 
541  // A helper to set up a TruthParticle (without filling the ELs)
543  tp->setPdgId(gp->pdg_id());
544  tp->setBarcode(HepMC::barcode(gp)); // FIXME barcode-based
545  tp->setStatus(HepMC::old_particle_status_from_new(HepMC::status(gp))); // For now convert the status back to the old scheme
546 
547  auto pol = HepMC::polarization(gp);
548  if (pol.is_defined()) {
549  tp->setPolarizationParameter(pol.theta(), xAOD::TruthParticle::polarizationTheta);
550  tp->setPolarizationParameter(pol.phi(), xAOD::TruthParticle::polarizationPhi);
551  }
552 
553  tp->setM(gp->generated_mass());
554  tp->setPx(gp->momentum().px());
555  tp->setPy(gp->momentum().py());
556  tp->setPz(gp->momentum().pz());
557  tp->setE(gp->momentum().e());
558  }
559 
560 
561  StatusCode
563  const std::string& metaName)
564  {
565  ATH_CHECK( metaStore.retrieve() );
566 
567  auto md = std::make_unique<xAOD::TruthMetaDataContainer>();
568  m_tmd = md.get();
569 
570  auto aux = std::make_unique<xAOD::TruthMetaDataAuxContainer>();
571  md->setStore( aux.get() );
572 
573  // Record the trigger configuration metadata into it:
574  CHECK( metaStore->record( std::move (aux), metaName + "Aux." ) );
575  CHECK( metaStore->record( std::move (md), metaName ) );
576  return StatusCode::SUCCESS;
577  }
578 
579 
580  StatusCode
582  const HepMC::GenEvent& genEvt,
583  const MetadataFields& metaFields)
584  {
585  // This bit needs to be serialized.
586  lock_t lock (m_mutex);
587 
588  //Inserting in a (unordered_)set returns an <iterator, boolean> pair, where the boolean
589  //is used to check if the key already exists (returns false in the case it exists)
590  if( m_existingMetaDataChan.insert(mcChannelNumber).second ) {
591  m_tmd->push_back (std::make_unique <xAOD::TruthMetaData>());
592  xAOD::TruthMetaData* md = m_tmd->back();
593 
594 #ifdef HEPMC3
597  std::vector<std::string> orderedWeightNameVec;
598  if (!genEvt.run_info()) {
599  for (size_t i=0; i<genEvt.weights().size();i++) orderedWeightNameVec.push_back(std::to_string(i));
600  } else {
601  if (!genEvt.run_info()->weight_names().empty()) {
602  orderedWeightNameVec = genEvt.weight_names();
603  } else {
604  //AV This to be decided. It is always a good idea to have a default weight 1.0.
605  //orderedWeightNameVec.push_back("0");
606  }
607  }
608  md->setWeightNames(orderedWeightNameVec);
609 #else
610  // FIXME: class member protection violation here.
611  // This appears to be because WeightContainer has no public methods
612  // to get information about the weight names.
613  const auto& weightNameMap = genEvt.weights().m_names;
614  std::vector<std::string> orderedWeightNameVec;
615  orderedWeightNameVec.reserve( weightNameMap.size() );
616  for (const auto& entry: weightNameMap) {
617  orderedWeightNameVec.push_back(entry.first);
618  }
619 
620  //The map from the HepMC record pairs the weight names with a corresponding index,
621  //it is not guaranteed that the indices are ascending when iterating over the map
622  std::sort(orderedWeightNameVec.begin(), orderedWeightNameVec.end(),
623  [&](const std::string& i, const std::string& j){return weightNameMap.at(i) < weightNameMap.at(j);});
624 
626  md->setWeightNames( orderedWeightNameVec );
627 #endif
628 
629  if(!metaFields.lhefGenerator.empty()) {
630  md->setLhefGenerator(metaFields.lhefGenerator);
631  }
632  if(!metaFields.generators.empty()) {
633  md->setGenerators(metaFields.generators);
634  }
635  if(!metaFields.evgenProcess.empty()) {
636  md->setEvgenProcess(metaFields.evgenProcess);
637  }
638  if(!metaFields.evgenTune.empty()) {
639  md->setEvgenTune(metaFields.evgenTune);
640  }
641  if(!metaFields.hardPDF.empty()) {
642  md->setHardPDF(metaFields.hardPDF);
643  }
644  if(!metaFields.softPDF.empty()) {
645  md->setSoftPDF(metaFields.softPDF);
646  }
647  }
648 
649  return StatusCode::SUCCESS;
650  }
651 
652 
653 
654 } // namespace xAODMaker
DataVector::reserve
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
LArG4FSStartPointFilter.part
part
Definition: LArG4FSStartPointFilter.py:21
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
xAOD::TruthEvent_v1::X2
@ X2
[float]
Definition: TruthEvent_v1.h:80
xAOD::TruthEvent_v1::setCrossSection
void setCrossSection(float value)
Set the cross-section.
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
xAODMaker::xAODTruthCnvAlg::m_xaodTruthParticleContainerKey
SG::WriteHandleKey< xAOD::TruthParticleContainer > m_xaodTruthParticleContainerKey
Definition: xAODTruthCnvAlg.h:138
xAOD::TruthEvent_v1::XF2
@ XF2
[float]
Definition: TruthEvent_v1.h:86
xAOD::TruthEvent_v1::setSignalProcessVertexLink
void setSignalProcessVertexLink(const TruthVertexLink_t &link)
Set pointer to a vertex representing the primary beam interaction point.
IOVMetaDataContainer
This class is a container for conditions data. It is intended to be used to store conditions data fro...
Definition: IOVMetaDataContainer.h:37
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
xAOD::TruthEvent_v1::ECCENTRICITY
@ ECCENTRICITY
[float]
Definition: TruthEvent_v1.h:142
HepMC::polarization
Polarization polarization(const T &a)
Definition: Polarization.h:47
CondAttrListCollection.h
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
xAOD::TruthEvent_v1::setWeights
void setWeights(const std::vector< float > &weights)
Set the event weights.
xAOD::TruthEvent_v1::NPARTPROJ
@ NPARTPROJ
[int]
Definition: TruthEvent_v1.h:132
xAODMaker::xAODTruthCnvAlg::m_xaodTruthEventContainerKey
SG::WriteHandleKey< xAOD::TruthEventContainer > m_xaodTruthEventContainerKey
The key for the output xAOD truth containers.
Definition: xAODTruthCnvAlg.h:134
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
SG::ReadHandle< McEventCollection >
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
HepMC::signal_process_id
int signal_process_id(const GenEvent &e)
Definition: GenEvent.h:513
TruthVertexContainer.h
TruthParticleContainer.h
xAOD::TruthMetaData_v1::setSoftPDF
void setSoftPDF(const std::string &value)
GenVertex.h
xAOD::TruthEvent
TruthEvent_v1 TruthEvent
Typedef to implementation.
Definition: TruthEvent.h:17
xAOD::TruthEvent_v1::PDFID2
@ PDFID2
[int]
Definition: TruthEvent_v1.h:78
xAOD::TruthEvent_v1::setBeamParticle2Link
void setBeamParticle2Link(const TruthParticleLink_t &pcl2)
Set one incoming beam particle.
xAODMaker::xAODTruthCnvAlg::MetadataFields::lhefGenerator
std::string lhefGenerator
Definition: xAODTruthCnvAlg.h:84
TruthPileupEvent.h
xAOD::TruthEvent_v1::setHeavyIonParameter
bool setHeavyIonParameter(int value, HIParam parameter)
Set an integer HI parameter.
Definition: TruthEvent_v1.cxx:162
xAOD::TruthEvent_v1::IMPACTPARAMETER
@ IMPACTPARAMETER
[float]
Definition: TruthEvent_v1.h:140
xAOD::TruthVertex_v1::setT
void setT(float value)
Set the vertex time.
ParticleTest.tp
tp
Definition: ParticleTest.py:25
xAOD::TruthPileupEvent_v1
Class describing a pile-up truth event in the MC record.
Definition: TruthPileupEvent_v1.h:23
xAOD::TruthVertex_v1::setIncomingParticleLinks
void setIncomingParticleLinks(const TPLinks_t &links)
Set all the incoming particles.
xAODMaker::xAODTruthCnvAlg::MetadataFields
Definition: xAODTruthCnvAlg.h:83
xAOD::TruthEvent_v1::NWOUNDEDNWOUNDEDCOLLISIONS
@ NWOUNDEDNWOUNDEDCOLLISIONS
[int]
Definition: TruthEvent_v1.h:139
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
xAODMaker
Definition: StoreGateSvc.h:72
xAODMaker::xAODTruthCnvAlg::m_metaName
std::string m_metaName
SG key and name for meta data.
Definition: xAODTruthCnvAlg.h:157
xAODMaker::xAODTruthCnvAlg::MetaDataWriter::lock_t
std::lock_guard< std::mutex > lock_t
Definition: xAODTruthCnvAlg.h:106
xAOD::TruthVertex_v1::setY
void setY(float value)
Set the y displacement of the vertex.
CondAttrListCollection
This class is a collection of AttributeLists where each one is associated with a channel number....
Definition: CondAttrListCollection.h:52
TruthPileupEventContainer.h
xAOD::mcChannelNumber
mcChannelNumber
Definition: EventInfo_v1.cxx:197
xAOD::TruthVertex_v1::setOutgoingParticleLinks
void setOutgoingParticleLinks(const TPLinks_t &links)
Set all the outgoing particles.
GenParticle.h
std::stable_sort
void stable_sort(std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, std::reverse_iterator< DataModel_detail::iterator< DVL > > end, Compare comp)
Specialization of stable_sort for DataVector/List.
Definition: DVL_algorithms.h:711
xAOD::EventInfo_v1::runNumber
uint32_t runNumber() const
The current event's run number.
xAODMaker::xAODTruthCnvAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Function executing the algorithm.
Definition: xAODTruthCnvAlg.cxx:105
xAODMaker::xAODTruthCnvAlg::fillParticle
static void fillParticle(xAOD::TruthParticle *tp, const HepMC::ConstGenParticlePtr &gp)
Definition: xAODTruthCnvAlg.cxx:542
TruthMetaData.h
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
xAOD::TruthEventBase_v1::addTruthParticleLink
void addTruthParticleLink(const TruthParticleLink_t &plink)
Add one truth particle.
Definition: TruthEventBase_v1.cxx:68
xAOD::TruthMetaData_v1::setWeightNames
void setWeightNames(const std::vector< std::string > &value)
xAODMaker::xAODTruthCnvAlg::m_doInTimePileUp
Gaudi::Property< bool > m_doInTimePileUp
Definition: xAODTruthCnvAlg.h:147
TruthParticleAuxContainer.h
xAOD::EventInfo_v1::mcChannelNumber
uint32_t mcChannelNumber() const
The MC generator's channel number.
xAODMaker::xAODTruthCnvAlg::MetadataFields::generators
std::string generators
Definition: xAODTruthCnvAlg.h:85
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
WriteHandle.h
Handle class for recording to StoreGate.
xAOD::TruthEvent_v1::NPARTTARG
@ NPARTTARG
[int]
Definition: TruthEvent_v1.h:133
xAODMaker::xAODTruthCnvAlg::fillVertex
static void fillVertex(xAOD::TruthVertex *tv, const HepMC::ConstGenVertexPtr &gv)
These functions do not set up ELs, just the other variables.
Definition: xAODTruthCnvAlg.cxx:530
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
xAOD::TruthEvent_v1::NNWOUNDEDCOLLISIONS
@ NNWOUNDEDCOLLISIONS
[int]
Definition: TruthEvent_v1.h:137
xAODMaker::xAODTruthCnvAlg::m_firstBeginRun
bool m_firstBeginRun
Tag Info.
Definition: xAODTruthCnvAlg.h:166
lumiFormat.i
int i
Definition: lumiFormat.py:92
xAOD::TruthMetaData_v1::setMcChannelNumber
void setMcChannelNumber(uint32_t value)
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
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:41
TruthMetaDataAuxContainer.h
xAODMaker::xAODTruthCnvAlg::MetaDataWriter::maybeWrite
StatusCode maybeWrite(uint32_t mcChannelNumber, const HepMC::GenEvent &genEvt, const MetadataFields &metaFields)
Definition: xAODTruthCnvAlg.cxx:581
xAODMaker::xAODTruthCnvAlg::m_xaodTruthPUEventContainerKey
SG::WriteHandleKey< xAOD::TruthPileupEventContainer > m_xaodTruthPUEventContainerKey
Definition: xAODTruthCnvAlg.h:136
xAOD::TruthEvent_v1::setPdfInfoParameter
bool setPdfInfoParameter(int value, PdfParam parameter)
Set an integer PDF info parameter.
Definition: TruthEvent_v1.cxx:75
xAOD::TruthEvent_v1::SIGMAINELNN
@ SIGMAINELNN
[float]
Definition: TruthEvent_v1.h:143
xAODMaker::xAODTruthCnvAlg::MetadataFields::evgenTune
std::string evgenTune
Definition: xAODTruthCnvAlg.h:87
xAOD::TruthParticle
TruthParticle_v1 TruthParticle
Typedef to implementation.
Definition: Event/xAOD/xAODTruth/xAODTruth/TruthParticle.h:15
xAODMaker::xAODTruthCnvAlg::MetadataFields::softPDF
std::string softPDF
Definition: xAODTruthCnvAlg.h:89
ParticleGun_EoverP_Config.pid
pid
Definition: ParticleGun_EoverP_Config.py:62
xAODMaker::xAODTruthCnvAlg::handle
virtual void handle(const Incident &incident) override
Incident handler.
Definition: xAODTruthCnvAlg.cxx:480
xAOD::TruthEvent_v1
Class describing a signal truth event in the MC record.
Definition: TruthEvent_v1.h:35
xAODMaker::xAODTruthCnvAlg::m_aodContainerKey
SG::ReadHandleKey< McEventCollection > m_aodContainerKey
The key of the input AOD truth container.
Definition: xAODTruthCnvAlg.h:130
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAOD::TruthPileupEvent
TruthPileupEvent_v1 TruthPileupEvent
Typedef to implementation.
Definition: TruthPileupEvent.h:15
xAOD::TruthEvent_v1::setCrossSectionError
void setCrossSectionError(float value)
Set the cross-section error.
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
xAOD::eventNumber
eventNumber
Definition: EventInfo_v1.cxx:124
CondAttrListCollection::attributeList
const AttributeList & attributeList(ChanNum chanNum) const
attribute list for a given channel number
Definition: CondAttrListCollection.h:401
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
xAOD::TruthVertex
TruthVertex_v1 TruthVertex
Typedef to implementation.
Definition: TruthVertex.h:15
xAODMaker::xAODTruthCnvAlg::initialize
virtual StatusCode initialize() override
Function initialising the algorithm.
Definition: xAODTruthCnvAlg.cxx:65
xAOD::TruthEvent_v1::SPECTATORNEUTRONS
@ SPECTATORNEUTRONS
[int]
Definition: TruthEvent_v1.h:135
xAOD::TruthEvent_v1::XF1
@ XF1
[float]
Definition: TruthEvent_v1.h:85
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
xAODMaker::xAODTruthCnvAlg::MetadataFields::evgenProcess
std::string evgenProcess
Definition: xAODTruthCnvAlg.h:86
xAODMaker::xAODTruthCnvAlg::m_xaodTruthVertexContainerKey
SG::WriteHandleKey< xAOD::TruthVertexContainer > m_xaodTruthVertexContainerKey
Definition: xAODTruthCnvAlg.h:140
xAOD::TruthMetaData_v1::setGenerators
void setGenerators(const std::string &value)
xAODMaker::xAODTruthCnvAlg::m_metaFields
MetadataFields m_metaFields
Definition: xAODTruthCnvAlg.h:167
TruthVertex.h
IOVMetaDataContainer.h
This class is a container for conditions data. It is intended to be used to store conditions data fro...
TruthVertexAuxContainer.h
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
xAOD::TruthMetaData_v1
Class describing meta data for truth records.
Definition: TruthMetaData_v1.h:28
HepMC::ConstGenParticlePtr
const GenParticle * ConstGenParticlePtr
Definition: GenParticle.h:38
xAOD::TruthVertex_v1
Class describing a truth vertex in the MC record.
Definition: TruthVertex_v1.h:41
xAODMaker::xAODTruthCnvAlg::m_evtInfo
SG::ReadHandleKey< xAOD::EventInfo > m_evtInfo
Event Info.
Definition: xAODTruthCnvAlg.h:163
xAOD::TruthEvent_v1::EVENTPLANEANGLE
@ EVENTPLANEANGLE
[float]
Definition: TruthEvent_v1.h:141
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
MagicNumbers.h
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
xAOD::TruthEvent_v1::PDGID1
@ PDGID1
[int]
Definition: TruthEvent_v1.h:75
xAODMaker::xAODTruthCnvAlg::MetadataFields::hardPDF
std::string hardPDF
Definition: xAODTruthCnvAlg.h:88
errorcheck.h
Helpers for checking error return status codes and reporting errors.
xAOD::crossSection
crossSection
Definition: TruthEvent_v1.cxx:33
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
xAODMaker::xAODTruthCnvAlg::VertexParticles
Type for tracking particles connected to a single vertex.
Definition: xAODTruthCnvAlg.h:116
xAOD::TruthEvent_v1::SPECTATORPROTONS
@ SPECTATORPROTONS
[int]
Definition: TruthEvent_v1.h:136
xAOD::TruthVertex_v1::setId
void setId(int value)
Obsolete function Set vertex ID code HepMC2 id == HepMC3 status, i.e.
xAOD::TruthMetaData_v1::setHardPDF
void setHardPDF(const std::string &value)
xAOD::TruthEvent_v1::NCOLL
@ NCOLL
[int]
Definition: TruthEvent_v1.h:134
xAODTruthCnvAlg.h
xAODMaker::xAODTruthCnvAlg::m_truthLinkContainerKey
SG::WriteHandleKey< xAODTruthParticleLinkVector > m_truthLinkContainerKey
Definition: xAODTruthCnvAlg.h:142
xAODMaker::xAODTruthCnvAlg::VertexMap
std::map< HepMC::ConstGenVertexPtr, VertexParticles > VertexMap
Convenience handle for a map of vtx ptrs -> connected particles.
Definition: xAODTruthCnvAlg.h:123
CondAttrListCollection::size
size_type size() const
number of Chan/AttributeList pairs
Definition: CondAttrListCollection.h:322
HepMC::old_vertex_status_from_new
int old_vertex_status_from_new(int newStatus)
Definition: MagicNumbers.h:355
xAODMaker::xAODTruthCnvAlg::m_writeMetaData
Gaudi::Property< bool > m_writeMetaData
option to disable writing of metadata (e.g. if running a filter on xAOD in generators)
Definition: xAODTruthCnvAlg.h:160
xAOD::TruthEvent_v1::X1
@ X1
[float]
Definition: TruthEvent_v1.h:79
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
xAOD::TruthVertex_v1::setZ
void setZ(float value)
Set the vertex's longitudinal distance from the origin.
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
Trk::vertex
@ vertex
Definition: MeasurementType.h:21
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
xAOD::TruthVertex_v1::setBarcode
void setBarcode(int value)
Set barcode.
xAOD::TruthEvent_v1::PDGID2
@ PDGID2
[int]
Definition: TruthEvent_v1.h:76
xAOD::TruthParticle_v1::polarizationTheta
@ polarizationTheta
Polarization in ( )
Definition: TruthParticle_v1.h:323
std::sort
void sort(typename std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, typename std::reverse_iterator< DataModel_detail::iterator< DVL > > end, const Compare &comp)
Specialization of sort for DataVector/List.
Definition: DVL_algorithms.h:623
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
xAODMaker::xAODTruthCnvAlg::MetaDataWriter::initialize
StatusCode initialize(ServiceHandle< StoreGateSvc > &metaStore, const std::string &metaName)
Definition: xAODTruthCnvAlg.cxx:562
xAOD::TruthParticle_v1::polarizationPhi
@ polarizationPhi
Polarization in ( )
Definition: TruthParticle_v1.h:322
TruthEventAuxContainer.h
xAODMaker::xAODTruthCnvAlg::m_metaStore
ServiceHandle< StoreGateSvc > m_metaStore
Connection to the metadata store.
Definition: xAODTruthCnvAlg.h:155
doL1CaloHVCorrections.parts
parts
Definition: doL1CaloHVCorrections.py:334
TruthPileupEventAuxContainer.h
xAODMaker::xAODTruthCnvAlg::m_doAllPileUp
Gaudi::Property< bool > m_doAllPileUp
Pile-up options.
Definition: xAODTruthCnvAlg.h:146
HepMC::ConstGenVertexPtr
const HepMC::GenVertex * ConstGenVertexPtr
Definition: GenVertex.h:60
CondAttrListCollection::AttributeList
coral::AttributeList AttributeList
Definition: CondAttrListCollection.h:56
HepMC::old_particle_status_from_new
int old_particle_status_from_new(int newStatus)
Definition: MagicNumbers.h:349
ReadHandle.h
Handle class for reading from StoreGate.
xAOD::TruthMetaData_v1::setLhefGenerator
void setLhefGenerator(const std::string &value)
xAOD::TruthMetaData_v1::setEvgenTune
void setEvgenTune(const std::string &value)
python.IoTestsLib.w
def w
Definition: IoTestsLib.py:200
HepMC::status
int status(const T &p)
Definition: MagicNumbers.h:130
TruthParticle.h
TruthEventContainer.h
isSeparatorGenEvent
bool isSeparatorGenEvent(const HepMC::GenEvent *genEvt)
Definition: xAODTruthCnvAlg.cxx:41
xAOD::TruthEvent_v1::Q
@ Q
[float]
Definition: TruthEvent_v1.h:82
xAOD::TruthEvent_v1::PDFID1
@ PDFID1
[int]
Definition: TruthEvent_v1.h:77
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
xAOD::TruthEventBase_v1::addTruthVertexLink
void addTruthVertexLink(const TruthVertexLink_t &vlink)
Add one truth vertex.
Definition: TruthEventBase_v1.cxx:129
xAOD::TruthMetaData_v1::setEvgenProcess
void setEvgenProcess(const std::string &value)
xAOD::TruthEvent_v1::NWOUNDEDNCOLLISIONS
@ NWOUNDEDNCOLLISIONS
[int]
Definition: TruthEvent_v1.h:138
TruthEvent.h
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
xAOD::TruthEvent_v1::setBeamParticle1Link
void setBeamParticle1Link(const TruthParticleLink_t &pcl1)
Set one incoming beam particle.
xAOD::TruthVertex_v1::setX
void setX(float value)
Set the x displacement of the vertex.
ServiceHandle< IIncidentSvc >
xAOD::TruthEvent_v1::NCOLLHARD
@ NCOLLHARD
[int]
Definition: TruthEvent_v1.h:131
HepMC::signal_process_vertex
GenVertex * signal_process_vertex(const GenEvent *e)
Definition: GenEvent.h:503