ATLAS Offline Software
McEventCollectionCnv_p5.cxx
Go to the documentation of this file.
1 
3 /*
4  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
5 */
6 
7 // McEventCollectionCnv_p5.cxx
8 // Implementation file for class McEventCollectionCnv_p5
9 // Author: S.Binet<binet@cern.ch>
11 
12 // STL includes
13 #include <utility>
14 #include <cmath>
15 #include <cfloat> // for DBL_EPSILON
16 
17 // GeneratorObjectsTPCnv includes
19 #include "HepMcDataPool.h"
22 #include "GaudiKernel/ThreadLocalContext.h"
24 
25 
27 // Constructors
29 
31  Base_t( ),
32  m_isPileup(false),m_hepMCWeightSvc("HepMCWeightSvc","McEventCollectionCnv_p5")
33 {}
34 
36  Base_t( rhs ),
37  m_isPileup(false),m_hepMCWeightSvc("HepMCWeightSvc","McEventCollectionCnv_p5")
38 {}
39 
42 {
43  if ( this != &rhs ) {
44  Base_t::operator=( rhs );
46  }
47  return *this;
48 }
49 
51 // Destructor
53 
55 = default;
56 
57 
59  McEventCollection* transObj,
60  MsgStream& msg )
61 {
62  const EventContext& ctx = Gaudi::Hive::currentContext();
63 
64  msg << MSG::DEBUG << "Loading McEventCollection from persistent state..."
65  << endmsg;
66 
67  // elements are managed by DataPool
68  if (!m_isPileup) {
69  transObj->clear(SG::VIEW_ELEMENTS);
70  }
71  HepMC::DataPool datapools;
72  const unsigned int nVertices = persObj->m_genVertices.size();
73  datapools.vtx.prepareToAdd(nVertices);
74  const unsigned int nParts = persObj->m_genParticles.size();
75  datapools.part.prepareToAdd(nParts);
76  const unsigned int nEvts = persObj->m_genEvents.size();
77  datapools.evt.prepareToAdd(nEvts);
78  transObj->reserve( nEvts );
79  for ( std::vector<GenEvent_p5>::const_iterator
80  itr = persObj->m_genEvents.begin(),
81  itrEnd = persObj->m_genEvents.end();
82  itr != itrEnd;
83  ++itr ) {
84  const GenEvent_p5& persEvt = *itr;
85  HepMC::GenEvent * genEvt(nullptr);
86  if(m_isPileup) {
87  genEvt = new HepMC::GenEvent();
88  } else {
89  genEvt = datapools.getGenEvent();
90  }
91 #ifdef HEPMC3
92  genEvt->add_attribute ("barcodes", std::make_shared<HepMC::GenEventBarcodes>());
93  genEvt->add_attribute("signal_process_id", std::make_shared<HepMC3::IntAttribute>(persEvt.m_signalProcessId));
94  genEvt->set_event_number(persEvt.m_eventNbr);
95  genEvt->add_attribute("mpi", std::make_shared<HepMC3::IntAttribute>(persEvt.m_mpi));
96  genEvt->add_attribute("event_scale", std::make_shared<HepMC3::DoubleAttribute>(persEvt.m_eventScale));
97  genEvt->add_attribute("alphaQCD", std::make_shared<HepMC3::DoubleAttribute>(persEvt.m_alphaQCD));
98  genEvt->add_attribute("alphaQED", std::make_shared<HepMC3::DoubleAttribute>(persEvt.m_alphaQED));
99  genEvt->weights()= persEvt.m_weights;
100  genEvt->add_attribute("random_states", std::make_shared<HepMC3::VectorLongIntAttribute>(persEvt.m_randomStates));
101 
102  genEvt->set_units(static_cast<HepMC3::Units::MomentumUnit>(persEvt.m_momentumUnit),
103  static_cast<HepMC3::Units::LengthUnit>(persEvt.m_lengthUnit));
104 
105  //restore weight names from the dedicated svc (which was keeping them in metadata for efficiency)
106  if(!genEvt->run_info()) genEvt->set_run_info(std::make_shared<HepMC3::GenRunInfo>());
107  genEvt->run_info()->set_weight_names(m_hepMCWeightSvc->weightNameVec(ctx));
108  // cross-section restore
109 
110  if (!persEvt.m_crossSection.empty()) {
111  auto cs = std::make_shared<HepMC3::GenCrossSection>();
112  const std::vector<double>& xsection = persEvt.m_crossSection;
113  genEvt->set_cross_section(cs);
114  if( static_cast<bool>(xsection[0]) )
115  cs->set_cross_section(xsection[2],xsection[1]);
116  else
117  cs->set_cross_section(-1.0, -1.0);
118  }
119 
120  // heavyIon restore
121  if (!persEvt.m_heavyIon.empty()) {
122  auto hi = std::make_shared<HepMC3::GenHeavyIon>();
123  const std::vector<float>& hIon = persEvt.m_heavyIon;
124  //AV NOTE THE ORDER
125  hi->set(
126  static_cast<int>(hIon[12]), // Ncoll_hard
127  static_cast<int>(hIon[11]), // Npart_proj
128  static_cast<int>(hIon[10]), // Npart_targ
129  static_cast<int>(hIon[9]), // Ncoll
130  static_cast<int>(hIon[8]), // spectator_neutrons
131  static_cast<int>(hIon[7]), // spectator_protons
132  static_cast<int>(hIon[6]), // N_Nwounded_collisions
133  static_cast<int>(hIon[5]), // Nwounded_N_collisions
134  static_cast<int>(hIon[4]), // Nwounded_Nwounded_collisions
135  hIon[3], // impact_parameter
136  hIon[2], // event_plane_angle
137  hIon[1], // eccentricity
138  hIon[0] ); // sigma_inel_NN
139  genEvt->set_heavy_ion(hi);
140  }
141 
142 
143 
144  // pdfinfo restore
145  if (!persEvt.m_pdfinfo.empty())
146  {
147  const std::vector<double>& pdf = persEvt.m_pdfinfo;
148  HepMC3::GenPdfInfoPtr pi = std::make_shared<HepMC3::GenPdfInfo>();
149  pi->set(static_cast<int>(pdf[8]), // id1
150  static_cast<int>(pdf[7]), // id2
151  pdf[4], // x1
152  pdf[3], // x2
153  pdf[2], // scalePDF
154  pdf[1], // pdf1
155  pdf[0], // pdf2
156  static_cast<int>(pdf[6]), // pdf_id1
157  static_cast<int>(pdf[5]));// pdf_id2
158  genEvt->set_pdf_info(pi);
159  }
160  transObj->push_back( genEvt );
161 
162  // create a temporary map associating the barcode of an end-vtx to its
163  // particle.
164  // As not all particles are stable (d'oh!) we take 50% of the number of
165  // particles as an initial size of the hash-map (to prevent re-hash)
166  ParticlesMap_t partToEndVtx( (persEvt.m_particlesEnd - persEvt.m_particlesBegin)/2 );
167  // This is faster than the HepMC::barcode_to_vertex
168  std::map<int, HepMC::GenVertexPtr> brc_to_vertex;
169 
170  // create the vertices
171  const unsigned int endVtx = persEvt.m_verticesEnd;
172  for ( unsigned int iVtx = persEvt.m_verticesBegin; iVtx != endVtx; ++iVtx ) {
173  auto vtx = createGenVertex( *persObj, persObj->m_genVertices[iVtx], partToEndVtx, datapools, genEvt );
174  brc_to_vertex[persObj->m_genVertices[iVtx].m_barcode] = vtx;
175  } //> end loop over vertices
176 
177  // set the signal process vertex
178  const int sigProcVtx = persEvt.m_signalProcessVtx;
179  if ( sigProcVtx != 0 && brc_to_vertex.count(sigProcVtx) ) {
180  HepMC::set_signal_process_vertex(genEvt, brc_to_vertex[sigProcVtx] );
181  }
182 
183  // connect particles to their end vertices
184  for (auto & p : partToEndVtx) {
185  if ( brc_to_vertex.count(p.second) ) {
186  auto decayVtx = brc_to_vertex[p.second];
187  decayVtx->add_particle_in( p.first );
188  } else {
189  msg << MSG::ERROR << "GenParticle points to null end vertex !!" << endmsg;
190  }
191  }
192  // set the beam particles
193  const int beamPart1 = persEvt.m_beamParticle1;
194  const int beamPart2 = persEvt.m_beamParticle2;
195  if ( beamPart1 != 0 && beamPart2 != 0 ) {
196  genEvt->set_beam_particles(HepMC::barcode_to_particle(genEvt, beamPart1),
197  HepMC::barcode_to_particle(genEvt, beamPart2));
198  }
199 
200 #else
201  genEvt->m_signal_process_id = persEvt.m_signalProcessId;
202  genEvt->m_event_number = persEvt.m_eventNbr;
203  genEvt->m_mpi = persEvt.m_mpi;
204  genEvt->m_event_scale = persEvt.m_eventScale;
205  genEvt->m_alphaQCD = persEvt.m_alphaQCD;
206  genEvt->m_alphaQED = persEvt.m_alphaQED;
207  genEvt->m_signal_process_vertex = 0;
208  genEvt->m_beam_particle_1 = 0;
209  genEvt->m_beam_particle_2 = 0;
210  genEvt->m_weights = persEvt.m_weights;
211  genEvt->m_random_states = persEvt.m_randomStates;
212  genEvt->m_vertex_barcodes.clear();
213  genEvt->m_particle_barcodes.clear();
214  genEvt->m_momentum_unit = static_cast<HepMC::Units::MomentumUnit>(persEvt.m_momentumUnit);
215  genEvt->m_position_unit = static_cast<HepMC::Units::LengthUnit>(persEvt.m_lengthUnit);
216 
217  //restore weight names from the dedicated svc (which was keeping them in metadata for efficiency)
218  genEvt->m_weights.m_names = m_hepMCWeightSvc->weightNames(ctx);
219 
220  // cross-section restore
221  if( genEvt->m_cross_section )
222  delete genEvt->m_cross_section;
223  genEvt->m_cross_section = 0;
224 
225  if (!persEvt.m_crossSection.empty()) {
226  genEvt->m_cross_section = new HepMC::GenCrossSection();
227  const std::vector<double>& xsection = persEvt.m_crossSection;
228  if( static_cast<bool>(xsection[0]) )
229  genEvt->m_cross_section->set_cross_section(xsection[2],xsection[1]);
230  }
231 
232  // heavyIon restore
233  if(genEvt->m_heavy_ion )
234  delete genEvt->m_heavy_ion;
235  genEvt->m_heavy_ion = 0;
236  if (!persEvt.m_heavyIon.empty()) {
237  const std::vector<float>& hIon = persEvt.m_heavyIon;
238  genEvt->m_heavy_ion = new HepMC::HeavyIon
239  (
240  static_cast<int>(hIon[12]), // Ncoll_hard
241  static_cast<int>(hIon[11]), // Npart_proj
242  static_cast<int>(hIon[10]), // Npart_targ
243  static_cast<int>(hIon[9]), // Ncoll
244  static_cast<int>(hIon[8]), // spectator_neutrons
245  static_cast<int>(hIon[7]), // spectator_protons
246  static_cast<int>(hIon[6]), // N_Nwounded_collisions
247  static_cast<int>(hIon[5]), // Nwounded_N_collisions
248  static_cast<int>(hIon[4]), // Nwounded_Nwounded_collisions
249  hIon[3], // impact_parameter
250  hIon[2], // event_plane_angle
251  hIon[1], // eccentricity
252  hIon[0] ); // sigma_inel_NN
253  }
254 
255 
256 
257  // pdfinfo restore
258  if(genEvt->m_pdf_info)
259  delete genEvt->m_pdf_info;
260  genEvt->m_pdf_info = 0;
261  if (!persEvt.m_pdfinfo.empty()) {
262  const std::vector<double>& pdf = persEvt.m_pdfinfo;
263  genEvt->m_pdf_info = new HepMC::PdfInfo
264  (
265  static_cast<int>(pdf[8]), // id1
266  static_cast<int>(pdf[7]), // id2
267  pdf[4], // x1
268  pdf[3], // x2
269  pdf[2], // scalePDF
270  pdf[1], // pdf1
271  pdf[0], // pdf2
272  static_cast<int>(pdf[6]), // pdf_id1
273  static_cast<int>(pdf[5]) // pdf_id2
274  );
275  }
276 
277  transObj->push_back( genEvt );
278 
279  // create a temporary map associating the barcode of an end-vtx to its
280  // particle.
281  // As not all particles are stable (d'oh!) we take 50% of the number of
282  // particles as an initial size of the hash-map (to prevent re-hash)
283  ParticlesMap_t partToEndVtx( (persEvt.m_particlesEnd-
284  persEvt.m_particlesBegin)/2 );
285 
286  // create the vertices
287  const unsigned int endVtx = persEvt.m_verticesEnd;
288  for ( unsigned int iVtx= persEvt.m_verticesBegin; iVtx != endVtx; ++iVtx ) {
289  genEvt->add_vertex( createGenVertex( *persObj,
290  persObj->m_genVertices[iVtx],
291  partToEndVtx,
292  datapools ) );
293  } //> end loop over vertices
294 
295  // set the signal process vertex
296  const int sigProcVtx = persEvt.m_signalProcessVtx;
297  if ( sigProcVtx != 0 ) {
298  genEvt->set_signal_process_vertex( genEvt->barcode_to_vertex( sigProcVtx ) );
299  }
300 
301  // connect particles to their end vertices
303  p = partToEndVtx.begin(),
304  endItr = partToEndVtx.end();
305  p != endItr;
306  ++p ) {
307  auto decayVtx = HepMC::barcode_to_vertex(genEvt, p->second );
308  if ( decayVtx ) {
309  decayVtx->add_particle_in( p->first );
310  } else {
311  msg << MSG::ERROR
312  << "GenParticle points to null end vertex !!"
313  << endmsg;
314  }
315  }
316 
317  // set the beam particles
318  const int beamPart1 = persEvt.m_beamParticle1;
319  const int beamPart2 = persEvt.m_beamParticle2;
320  if ( beamPart1 != 0 && beamPart2 !=0 ) {
321  genEvt->set_beam_particles(genEvt->barcode_to_particle(beamPart1),
322  genEvt->barcode_to_particle(beamPart2));
323  }
324 
325 #endif
326 
327  } //> end loop over m_genEvents
328 
329  msg << MSG::DEBUG << "Loaded McEventCollection from persistent state [OK]"
330  << endmsg;
331 }
332 
334  McEventCollection_p5* persObj,
335  MsgStream& msg )
336 {
337  const EventContext& ctx = Gaudi::Hive::currentContext();
338 
339  msg << MSG::DEBUG << "Creating persistent state of McEventCollection..."
340  << endmsg;
341  persObj->m_genEvents.reserve( transObj->size() );
342 
343  const std::pair<unsigned int,unsigned int> stats = nbrParticlesAndVertices( transObj );
344  persObj->m_genParticles.reserve( stats.first );
345  persObj->m_genVertices.reserve ( stats.second );
346 
347  const McEventCollection::const_iterator itrEnd = transObj->end();
348  for ( McEventCollection::const_iterator itr = transObj->begin();
349  itr != itrEnd;
350  ++itr ) {
351  const unsigned int nPersVtx = persObj->m_genVertices.size();
352  const unsigned int nPersParts = persObj->m_genParticles.size();
353  const HepMC::GenEvent* genEvt = *itr;
354 #ifdef HEPMC3
355  //save the weight names to metadata via the HepMCWeightSvc
356  if (genEvt->run_info()) {
357  if (!genEvt->run_info()->weight_names().empty()) {
358  m_hepMCWeightSvc->setWeightNames( names_to_name_index_map(genEvt->weight_names()), ctx ).ignore();
359  } else {
360  //AV : This to be decided if one would like to have default names.
361  //std::vector<std::string> names{"0"};
362  //m_hepMCWeightSvc->setWeightNames( names_to_name_index_map(names), ctx );
363  }
364  }
365 
366  auto A_mpi=genEvt->attribute<HepMC3::IntAttribute>("mpi");
367  auto A_signal_process_id=genEvt->attribute<HepMC3::IntAttribute>("signal_process_id");
368  auto A_event_scale=genEvt->attribute<HepMC3::DoubleAttribute>("event_scale");
369  auto A_alphaQCD=genEvt->attribute<HepMC3::DoubleAttribute>("alphaQCD");
370  auto A_alphaQED=genEvt->attribute<HepMC3::DoubleAttribute>("alphaQED");
372  auto A_random_states=genEvt->attribute<HepMC3::VectorLongIntAttribute>("random_states");
373  auto beams=genEvt->beams();
374  persObj->m_genEvents.
375  emplace_back(A_signal_process_id?(A_signal_process_id->value()):-1,
376  genEvt->event_number(),
377  A_mpi?(A_mpi->value()):-1,
378  A_event_scale?(A_event_scale->value()):0.0,
379  A_alphaQCD?(A_alphaQCD->value()):0.0,
380  A_alphaQED?(A_alphaQED->value()):0.0,
382  !beams.empty()?HepMC::barcode(beams[0]):0,
383  beams.size()>1?HepMC::barcode(beams[1]):0,
384  genEvt->weights(),
385  A_random_states?(A_random_states->value()):std::vector<long>(),
386  std::vector<double>(), // cross section
387  std::vector<float>(), // heavyion
388  std::vector<double>(), // pdf info
389  genEvt->momentum_unit(),
390  genEvt->length_unit(),
391  nPersVtx,
392  nPersVtx + genEvt->vertices().size(),
393  nPersParts,
394  nPersParts + genEvt->particles().size() );
395 
396 
397  //HepMC::GenCrossSection encoding
398  if (genEvt->cross_section()) {
399  auto cs=genEvt->cross_section();
400  GenEvent_p5& persEvt = persObj->m_genEvents.back();
401  std::vector<double>& crossSection = persEvt.m_crossSection;
402  crossSection.resize(3);
403  crossSection[2] = cs->xsec();
404  crossSection[1] = cs->xsec_err();
405  crossSection[0] = static_cast<double>(cs->is_valid());
408  if (crossSection[2] < 0) {
409  crossSection[2] = 0.0;
410  if (crossSection[1] < 0) {
411  crossSection[1] = 0.0;
412  }
413  crossSection[0] = 0.0;
414  }
415 
416  }
417 
418  //HepMC::HeavyIon encoding
419  if (genEvt->heavy_ion()) {
420  auto hi=genEvt->heavy_ion();
421  GenEvent_p5& persEvt = persObj->m_genEvents.back();
422  std::vector<float>& heavyIon = persEvt.m_heavyIon;
423  heavyIon.resize(13);
424  heavyIon[12] = static_cast<float>(hi->Ncoll_hard);
425  heavyIon[11] = static_cast<float>(hi->Npart_proj);
426  heavyIon[10] = static_cast<float>(hi->Npart_targ);
427  heavyIon[9] = static_cast<float>(hi->Ncoll);
428  heavyIon[8] = static_cast<float>(hi->spectator_neutrons);
429  heavyIon[7] = static_cast<float>(hi->spectator_protons);
430  heavyIon[6] = static_cast<float>(hi->N_Nwounded_collisions);
431  heavyIon[5] = static_cast<float>(hi->Nwounded_N_collisions);
432  heavyIon[4] = static_cast<float>(hi->Nwounded_Nwounded_collisions);
433  heavyIon[3] = hi->impact_parameter;
434  heavyIon[2] = hi->event_plane_angle;
435  heavyIon[1] = hi->eccentricity;
436  heavyIon[0] = hi->sigma_inel_NN;
437  }
438 
439  //PdfInfo encoding
440  if (genEvt->pdf_info()) {
441  auto pi=genEvt->pdf_info();
442  GenEvent_p5& persEvt = persObj->m_genEvents.back();
443  std::vector<double>& pdfinfo = persEvt.m_pdfinfo;
444  pdfinfo.resize(9);
445  pdfinfo[8] = static_cast<double>(pi->parton_id[0]);
446  pdfinfo[7] = static_cast<double>(pi->parton_id[1]);
447  pdfinfo[6] = static_cast<double>(pi->pdf_id[0]);
448  pdfinfo[5] = static_cast<double>(pi->pdf_id[1]);
449  pdfinfo[4] = pi->x[0];
450  pdfinfo[3] = pi->x[1];
451  pdfinfo[2] = pi->scale;
452  pdfinfo[1] = pi->xf[0];
453  pdfinfo[0] = pi->xf[1];
454  }
455 
456  // create vertices
457  for (const auto& v: genEvt->vertices()) {
458  writeGenVertex( v, *persObj );
459  }
460 #else
461  const int signalProcessVtx = genEvt->m_signal_process_vertex
462  ? genEvt->m_signal_process_vertex->barcode()
463  : 0;
464  const int beamParticle1Barcode = genEvt->m_beam_particle_1
465  ? genEvt->m_beam_particle_1->barcode()
466  : 0;
467  const int beamParticle2Barcode = genEvt->m_beam_particle_2
468  ? genEvt->m_beam_particle_2->barcode()
469  : 0;
470 
471  //save the weight names to metadata via the HepMCWeightSvc
472  m_hepMCWeightSvc->setWeightNames( genEvt->m_weights.m_names, ctx ).ignore();
473 
474 
475  persObj->m_genEvents.
476  push_back( GenEvent_p5( genEvt->m_signal_process_id,
477  genEvt->m_event_number,
478  genEvt->mpi(), // number of multi particle interactions
479  genEvt->m_event_scale,
480  genEvt->m_alphaQCD,
481  genEvt->m_alphaQED,
482  signalProcessVtx,
483  beamParticle1Barcode, // barcodes of beam particles
484  beamParticle2Barcode,
485  genEvt->m_weights.m_weights,
486  genEvt->m_random_states,
487  std::vector<double>(), // cross section
488  std::vector<float>(), // heavyion
489  std::vector<double>(), // pdf info
490  genEvt->m_momentum_unit,
491  genEvt->m_position_unit,
492  nPersVtx,
493  nPersVtx + genEvt->vertices_size(),
494  nPersParts,
495  nPersParts + genEvt->particles_size() ) );
496  //HepMC::GenCrossSection encoding
497  if (genEvt->m_cross_section) {
498  GenEvent_p5& persEvt = persObj->m_genEvents.back();
499  std::vector<double>& crossSection = persEvt.m_crossSection;
500  crossSection.resize(3);
501  crossSection[2] = genEvt->m_cross_section->m_cross_section;
502  crossSection[1] = genEvt->m_cross_section->m_cross_section_error;
503  crossSection[0] = static_cast<double>(genEvt->m_cross_section->m_is_set);
504  }
505 
506  //HepMC::HeavyIon encoding
507  if (genEvt->m_heavy_ion) {
508  GenEvent_p5& persEvt = persObj->m_genEvents.back();
509  std::vector<float>& heavyIon = persEvt.m_heavyIon;
510  heavyIon.resize(13);
511  heavyIon[12] = static_cast<float>(genEvt->m_heavy_ion->m_Ncoll_hard);
512  heavyIon[11] = static_cast<float>(genEvt->m_heavy_ion->m_Npart_proj);
513  heavyIon[10] = static_cast<float>(genEvt->m_heavy_ion->m_Npart_targ);
514  heavyIon[9] = static_cast<float>(genEvt->m_heavy_ion->m_Ncoll);
515  heavyIon[8] = static_cast<float>(genEvt->m_heavy_ion->m_spectator_neutrons);
516  heavyIon[7] = static_cast<float>(genEvt->m_heavy_ion->m_spectator_protons);
517  heavyIon[6] = static_cast<float>(genEvt->m_heavy_ion->m_N_Nwounded_collisions);
518  heavyIon[5] = static_cast<float>(genEvt->m_heavy_ion->m_Nwounded_N_collisions);
519  heavyIon[4] = static_cast<float>(genEvt->m_heavy_ion->m_Nwounded_Nwounded_collisions);
520  heavyIon[3] = genEvt->m_heavy_ion->m_impact_parameter;
521  heavyIon[2] = genEvt->m_heavy_ion->m_event_plane_angle;
522  heavyIon[1] = genEvt->m_heavy_ion->m_eccentricity;
523  heavyIon[0] = genEvt->m_heavy_ion->m_sigma_inel_NN;
524  }
525 
526  //PdfInfo encoding
527  if (genEvt->m_pdf_info) {
528  GenEvent_p5& persEvt = persObj->m_genEvents.back();
529  std::vector<double>& pdfinfo = persEvt.m_pdfinfo;
530  pdfinfo.resize(9);
531  pdfinfo[8] = static_cast<double>(genEvt->m_pdf_info->m_id1);
532  pdfinfo[7] = static_cast<double>(genEvt->m_pdf_info->m_id2);
533  pdfinfo[6] = static_cast<double>(genEvt->m_pdf_info->m_pdf_id1);
534  pdfinfo[5] = static_cast<double>(genEvt->m_pdf_info->m_pdf_id2);
535  pdfinfo[4] = genEvt->m_pdf_info->m_x1;
536  pdfinfo[3] = genEvt->m_pdf_info->m_x2;
537  pdfinfo[2] = genEvt->m_pdf_info->m_scalePDF;
538  pdfinfo[1] = genEvt->m_pdf_info->m_pdf1;
539  pdfinfo[0] = genEvt->m_pdf_info->m_pdf2;
540  }
541 
542  // create vertices
543  const HepMC::GenEvent::vertex_const_iterator endVtx=genEvt->vertices_end();
544  for ( HepMC::GenEvent::vertex_const_iterator i = genEvt->vertices_begin();
545  i != endVtx;
546  ++i ) {
547  writeGenVertex( **i, *persObj );
548  }
549 #endif
550 
551  } //> end loop over GenEvents
552 
553  msg << MSG::DEBUG << "Created persistent state of HepMC::GenEvent [OK]" << endmsg;
554 }
555 
556 
559  const GenVertex_p5& persVtx,
560  ParticlesMap_t& partToEndVtx, HepMC::DataPool& datapools
561  ,HepMC::GenEvent* parent
562  ) const
563 {
564  HepMC::GenVertexPtr vtx(nullptr);
565  if(m_isPileup) {
567  } else {
568  vtx = datapools.getGenVertex();
569  }
570  if (parent ) parent->add_vertex(vtx);
571 #ifdef HEPMC3
572  vtx->set_position(HepMC::FourVector( persVtx.m_x , persVtx.m_y , persVtx.m_z ,persVtx.m_t ));
573  //AV ID cannot be assigned in HepMC3. And its meaning in HepMC2 is not clear.
574  int persVtxStatus(persVtx.m_id);
575  // GenVertex "status" (id in HepMC2) was not set for some of
576  // MC15/MC16 due to a bug in that production release.
577  if (persVtxStatus == 0 && HepMC::BarcodeBased::is_simulation_vertex(persVtx.m_barcode)) {
578  // Status values for GenVertex objects created during simulation
579  // should have been set to 1000 + Geant4 process in the old
580  // scheme. Overriding the value to 1000, means that status-based
581  // recognition of simulated vertices will work, while still
582  // indicating that the process was not set. (ATLASSIM-6901)
583  persVtxStatus = 1000;
584  }
585  vtx->set_status(HepMC::new_vertex_status_from_old(persVtxStatus, persVtx.m_barcode)); // UPDATED STATUS VALUE TO NEW SCHEME
586  // cast from std::vector<float> to std::vector<double>
587  std::vector<double> weights( persVtx.m_weights.begin(), persVtx.m_weights.end() );
588  vtx->add_attribute("weights",std::make_shared<HepMC3::VectorDoubleAttribute>(weights));
589  HepMC::suggest_barcode(vtx,persVtx.m_barcode);
590  // handle the in-going (orphans) particles
591  const unsigned int nPartsIn = persVtx.m_particlesIn.size();
592  for ( unsigned int i = 0; i != nPartsIn; ++i ) {
593  createGenParticle( persEvt.m_genParticles[persVtx.m_particlesIn[i]], partToEndVtx, datapools, vtx, false );
594  }
595 
596  // now handle the out-going particles
597  const unsigned int nPartsOut = persVtx.m_particlesOut.size();
598  for ( unsigned int i = 0; i != nPartsOut; ++i ) {
599  createGenParticle( persEvt.m_genParticles[persVtx.m_particlesOut[i]], partToEndVtx, datapools, vtx );
600  }
601 #else
602  vtx->m_position.setX( persVtx.m_x );
603  vtx->m_position.setY( persVtx.m_y );
604  vtx->m_position.setZ( persVtx.m_z );
605  vtx->m_position.setT( persVtx.m_t );
606  vtx->m_particles_in.clear();
607  vtx->m_particles_out.clear();
608  int persVtxStatus(persVtx.m_id);
609  // GenVertex "status" (id in HepMC2) was not set for some of
610  // MC15/MC16 due to a bug in that production release.
611  if (persVtxStatus == 0 && HepMC::BarcodeBased::is_simulation_vertex(persVtx.m_barcode)) {
612  // Status values for GenVertex objects created during simulation
613  // should have been set to 1000 + Geant4 process in the old
614  // scheme. Overriding the value to 1000, means that status-based
615  // recognition of simulated vertices will work, while still
616  // indicating that the process was not set. (ATLASSIM-6901)
617  persVtxStatus = 1000;
618  }
619  vtx->m_id = HepMC::new_vertex_status_from_old(persVtxStatus, persVtx.m_barcode); // UPDATED STATUS VALUE TO NEW SCHEME
620  vtx->m_weights.m_weights.reserve( persVtx.m_weights.size() );
621  vtx->m_weights.m_weights.assign ( persVtx.m_weights.begin(),
622  persVtx.m_weights.end() );
623  vtx->m_event = 0;
624  vtx->m_barcode = persVtx.m_barcode;
625 
626  // handle the in-going (orphans) particles
627  const unsigned int nPartsIn = persVtx.m_particlesIn.size();
629  //for ( unsigned int i = 0; i != nPartsIn; ++i ) {
630  for ( int i = nPartsIn - 1; i >= 0; i-- ) {
631  createGenParticle( persEvt.m_genParticles[persVtx.m_particlesIn[i]],
632  partToEndVtx,
633  datapools );
634  }
635 
636  // now handle the out-going particles
637  const unsigned int nPartsOut = persVtx.m_particlesOut.size();
638  for ( unsigned int i = 0; i != nPartsOut; ++i ) {
639  vtx->add_particle_out( createGenParticle( persEvt.m_genParticles[persVtx.m_particlesOut[i]],
640  partToEndVtx,
641  datapools ) );
642  }
643 #endif
644 
645  return vtx;
646 }
647 
650  ParticlesMap_t& partToEndVtx, HepMC::DataPool& datapools ,const HepMC::GenVertexPtr& parent, bool add_to_output ) const
651 {
652  HepMC::GenParticlePtr p(nullptr);
653  if (m_isPileup) {
655  } else {
656  p = datapools.getGenParticle();
657  }
658  if (parent) add_to_output?parent->add_particle_out(p):parent->add_particle_in(p);
659 #ifdef HEPMC3
660  p->set_pdg_id( persPart.m_pdgId);
661  p->set_status(HepMC::new_particle_status_from_old(persPart.m_status, persPart.m_barcode)); // UPDATED STATUS VALUE TO NEW SCHEME
662  p->add_attribute("phi",std::make_shared<HepMC3::DoubleAttribute>(persPart.m_phiPolarization));
663  p->add_attribute("theta",std::make_shared<HepMC3::DoubleAttribute>(persPart.m_thetaPolarization));
665  p->set_generated_mass(persPart.m_generated_mass);
666 
667  // Note: do the E calculation in extended (long double) precision.
668  // That happens implicitly on x86 with optimization on; saying it
669  // explicitly ensures that we get the same results with and without
670  // optimization. (If this is a performance issue for platforms
671  // other than x86, one could change to double for those platforms.)
672  if ( 0 == persPart.m_recoMethod ) {
673  double temp_e = std::sqrt( (long double)(persPart.m_px)*persPart.m_px +
674  (long double)(persPart.m_py)*persPart.m_py +
675  (long double)(persPart.m_pz)*persPart.m_pz +
676  (long double)(persPart.m_m) *persPart.m_m );
677  p->set_momentum( HepMC::FourVector(persPart.m_px,persPart.m_py,persPart.m_pz,temp_e));
678  } else {
679  const int signM2 = ( persPart.m_m >= 0. ? 1 : -1 );
680  const double persPart_ene =
681  std::sqrt( std::abs((long double)(persPart.m_px)*persPart.m_px +
682  (long double)(persPart.m_py)*persPart.m_py +
683  (long double)(persPart.m_pz)*persPart.m_pz +
684  signM2* (long double)(persPart.m_m)* persPart.m_m));
685  const int signEne = ( persPart.m_recoMethod == 1 ? 1 : -1 );
686  p->set_momentum(HepMC::FourVector( persPart.m_px,
687  persPart.m_py,
688  persPart.m_pz,
689  signEne * persPart_ene ));
690  }
691 
692  // setup flow
693  std::vector<int> flows;
694  const unsigned int nFlow = persPart.m_flow.size();
695  for ( unsigned int iFlow= 0; iFlow != nFlow; ++iFlow ) {
696  flows.push_back(persPart.m_flow[iFlow].second );
697  }
698  //We construct it here as vector w/o gaps.
699  p->add_attribute("flows", std::make_shared<HepMC3::VectorIntAttribute>(flows));
700 #else
701  p->m_pdg_id = persPart.m_pdgId;
702  p->m_status = HepMC::new_particle_status_from_old(persPart.m_status, persPart.m_barcode); // UPDATED STATUS VALUE TO NEW SCHEME
703  p->m_polarization.m_theta= static_cast<double>(persPart.m_thetaPolarization);
704  p->m_polarization.m_phi = static_cast<double>(persPart.m_phiPolarization );
705  p->m_production_vertex = 0;
706  p->m_end_vertex = 0;
707  p->m_barcode = persPart.m_barcode;
708  p->m_generated_mass = static_cast<double>(persPart.m_generated_mass);
709 
710  // Note: do the E calculation in extended (long double) precision.
711  // That happens implicitly on x86 with optimization on; saying it
712  // explicitly ensures that we get the same results with and without
713  // optimization. (If this is a performance issue for platforms
714  // other than x86, one could change to double for those platforms.)
715  if ( 0 == persPart.m_recoMethod ) {
716 
717  p->m_momentum.setPx( persPart.m_px);
718  p->m_momentum.setPy( persPart.m_py);
719  p->m_momentum.setPz( persPart.m_pz);
720  double temp_e = std::sqrt( (long double)(persPart.m_px)*persPart.m_px +
721  (long double)(persPart.m_py)*persPart.m_py +
722  (long double)(persPart.m_pz)*persPart.m_pz +
723  (long double)(persPart.m_m) *persPart.m_m );
724  p->m_momentum.setE( temp_e);
725  } else {
726  const int signM2 = ( persPart.m_m >= 0. ? 1 : -1 );
727  const double persPart_ene =
728  std::sqrt( std::abs((long double)(persPart.m_px)*persPart.m_px +
729  (long double)(persPart.m_py)*persPart.m_py +
730  (long double)(persPart.m_pz)*persPart.m_pz +
731  signM2* (long double)(persPart.m_m)* persPart.m_m));
732  const int signEne = ( persPart.m_recoMethod == 1 ? 1 : -1 );
733  p->m_momentum.set( persPart.m_px,
734  persPart.m_py,
735  persPart.m_pz,
736  signEne * persPart_ene );
737  }
738 
739  // setup flow
740  const unsigned int nFlow = persPart.m_flow.size();
741  p->m_flow.clear();
742  for ( unsigned int iFlow= 0; iFlow != nFlow; ++iFlow ) {
743  p->m_flow.set_icode( persPart.m_flow[iFlow].first,
744  persPart.m_flow[iFlow].second );
745  }
746 #endif
747 
748  if ( persPart.m_endVtx != 0 ) {
749  partToEndVtx[p] = persPart.m_endVtx;
750  }
751 
752  return p;
753 }
754 
755 #ifdef HEPMC3
757  McEventCollection_p5& persEvt )
758 {
759  const HepMC::FourVector& position = vtx->position();
760  auto A_weights=vtx->attribute<HepMC3::VectorDoubleAttribute>("weights");
761  auto A_barcode=vtx->attribute<HepMC3::IntAttribute>("barcode");
762  std::vector<float> weights;
763  if (A_weights) {
764  auto weights_d = A_weights->value();
765  for (auto& w: weights_d) weights.push_back(w);
766  }
767  persEvt.m_genVertices.emplace_back( position.x(),
768  position.y(),
769  position.z(),
770  position.t(),
771  HepMC::old_vertex_status_from_new(vtx->status()), // REVERTED STATUS VALUE TO OLD SCHEME
772  weights.begin(),
773  weights.end(),
774  A_barcode?(A_barcode->value()):vtx->id() );
775  GenVertex_p5& persVtx = persEvt.m_genVertices.back();
776 
777  // we write only the orphans in-coming particles and beams
778  persVtx.m_particlesIn.reserve(vtx->particles_in().size());
779  for (const auto& p: vtx->particles_in()) {
780  if ( !p->production_vertex() || p->production_vertex()->id() == 0 ) {
781  persVtx.m_particlesIn.push_back( writeGenParticle( p, persEvt ) );
782  }
783  }
784 
785  persVtx.m_particlesOut.reserve(vtx->particles_out().size());
786  for (const auto& p: vtx->particles_out()) {
787  persVtx.m_particlesOut.push_back( writeGenParticle( p, persEvt ) );
788  }
789 
790  }
791 #else
792 void McEventCollectionCnv_p5::writeGenVertex( const HepMC::GenVertex& vtx,
793  McEventCollection_p5& persEvt ) const
794 {
795  const HepMC::FourVector& position = vtx.m_position;
796  persEvt.m_genVertices.push_back(
797  GenVertex_p5( position.x(),
798  position.y(),
799  position.z(),
800  position.t(),
801  HepMC::old_vertex_status_from_new(vtx.m_id), // REVERTED STATUS VALUE TO OLD SCHEME
802  vtx.m_weights.m_weights.begin(),
803  vtx.m_weights.m_weights.end(),
804  vtx.m_barcode ) );
805  GenVertex_p5& persVtx = persEvt.m_genVertices.back();
806 
807  // we write only the orphans in-coming particles
808  const std::vector<HepMC::GenParticlePtr>::const_iterator endInVtx = vtx.m_particles_in.end();
809  persVtx.m_particlesIn.reserve(vtx.m_particles_in.size());
810  for ( std::vector<HepMC::GenParticlePtr>::const_iterator p = vtx.m_particles_in.begin();
811  p != endInVtx;
812  ++p ) {
813  if ( 0 == (*p)->production_vertex() ) {
814  persVtx.m_particlesIn.push_back( writeGenParticle( **p, persEvt ) );
815  }
816  }
817 
818  const std::vector<HepMC::GenParticlePtr>::const_iterator endOutVtx = vtx.m_particles_out.end();
819  persVtx.m_particlesOut.reserve(vtx.m_particles_out.size());
820  for ( std::vector<HepMC::GenParticlePtr>::const_iterator p = vtx.m_particles_out.begin();
821  p != endOutVtx;
822  ++p ) {
823  persVtx.m_particlesOut.push_back( writeGenParticle( **p, persEvt ) );
824  }
825 
826  return;
827 }
828 #endif
829 
830 #ifdef HEPMC3
832  McEventCollection_p5& persEvt )
833 {
834  const HepMC::FourVector mom = p->momentum();
835  const double ene = mom.e();
836  const double m2 = mom.m2();
837 
838  // Definitions of Bool isTimeLilike, isSpacelike and isLightlike according to HepLorentzVector definition
839  const bool useP2M2 = !(m2 > 0) && // !isTimelike
840  (m2 < 0) && // isSpacelike
841  !(std::abs(m2) < 2.0*DBL_EPSILON*ene*ene); // !isLightlike
842  auto A_flows=p->attribute<HepMC3::VectorIntAttribute>("flows");
843  auto A_phi=p->attribute<HepMC3::DoubleAttribute>("phi");
844  auto A_theta=p->attribute<HepMC3::DoubleAttribute>("theta");
845 
846  const short recoMethod = ( !useP2M2 ? 0: ( ene >= 0.? 1: 2 ) );
847  persEvt.m_genParticles.
848  emplace_back( mom.px(),
849  mom.py(),
850  mom.pz(),
851  mom.m(),
852  p->pdg_id(),
853  HepMC::old_particle_status_from_new(p->status()), // REVERTED STATUS VALUE TO OLD SCHEME
854  A_flows?(A_flows->value().size()):0,
855  A_theta?(A_theta->value()):0.0,
856  A_phi?(A_phi->value()):0.0,
857  p->production_vertex()? HepMC::barcode(p->production_vertex()):0,
858  p->end_vertex()? HepMC::barcode(p->end_vertex()):0,
859  HepMC::barcode(p),
860  p->generated_mass(),
861  recoMethod );
862 
863  std::vector< std::pair<int,int> > flow_hepmc2;
864  if(A_flows) flow_hepmc2=vector_to_vector_int_int(A_flows->value());
865  persEvt.m_genParticles.back().m_flow.assign( flow_hepmc2.begin(),flow_hepmc2.end() );
866 
867  // we return the index of the particle in the big vector of particles
868  // (contained by the persistent GenEvent)
869  return (persEvt.m_genParticles.size() - 1);
870 
871 }
872 #else
874  McEventCollection_p5& persEvt ) const
875 {
876  const HepMC::FourVector& mom = p.m_momentum;
877  const double ene = mom.e();
878  const double m2 = mom.m2();
879 
880  // Definitions of Bool isTimeLilike, isSpacelike and isLightlike according to HepLorentzVector definition
881  const bool useP2M2 = !(m2 > 0) && // !isTimelike
882  (m2 < 0) && // isSpacelike
883  !(std::abs(m2) < 2.0*DBL_EPSILON*ene*ene); // !isLightlike
884 
885  const short recoMethod = ( !useP2M2
886  ? 0
887  : ( ene >= 0. //*GeV
888  ? 1
889  : 2 ) );
890 
891 
892  persEvt.m_genParticles.
893  push_back( GenParticle_p5( mom.px(),
894  mom.py(),
895  mom.pz(),
896  mom.m(),
897  p.m_pdg_id,
898  HepMC::old_particle_status_from_new(p.m_status), // REVERTED STATUS VALUE TO OLD SCHEME
899  p.m_flow.size(),
900  p.m_polarization.theta(),
901  p.m_polarization.phi(),
902  p.m_production_vertex
903  ? p.m_production_vertex->barcode()
904  : 0,
905  p.m_end_vertex
906  ? p.m_end_vertex->barcode()
907  : 0,
908  p.m_barcode,
909  p.m_generated_mass,
910  recoMethod ) );
911  persEvt.m_genParticles.back().m_flow.assign( p.m_flow.begin(),
912  p.m_flow.end() );
913 
914  // we return the index of the particle in the big vector of particles
915  // (contained by the persistent GenEvent)
916  return (persEvt.m_genParticles.size() - 1);
917 }
918 #endif
919 
921  m_isPileup = true;
922 }
DataVector::reserve
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
HepMC::GenVertexPtr
HepMC::GenVertex * GenVertexPtr
Definition: GenVertex.h:59
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
IHepMCWeightSvc.h
GenParticle_p5::m_pz
float m_pz
z-component of the 4-momentum of this particle
Definition: GenParticle_p5.h:72
HepMC::suggest_barcode
bool suggest_barcode(T &p, int i)
Definition: GenEvent.h:548
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
python.SystemOfUnits.m2
int m2
Definition: SystemOfUnits.py:92
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
NSWL1::nVertices
int nVertices(const Polygon &p)
Definition: GeoUtils.cxx:35
GenEvent_p5::m_particlesEnd
unsigned int m_particlesEnd
End position in the vector of particles composing this event.
Definition: GenEvent_p5.h:154
McEventCollectionCnv_p5::transToPers
virtual void transToPers(const McEventCollection *transObj, McEventCollection_p5 *persObj, MsgStream &log)
Method creating the persistent representation McEventCollection_p5 from its transient representation ...
Definition: McEventCollectionCnv_p5.cxx:333
GenEvent_p5::m_momentumUnit
int m_momentumUnit
HepMC::Units::MomentumUnit casted to int.
Definition: GenEvent_p5.h:134
McEventCollectionCnv_p5::~McEventCollectionCnv_p5
virtual ~McEventCollectionCnv_p5()
Destructor.
McEventCollectionCnv_p5::createGenVertex
HepMC::GenVertexPtr createGenVertex(const McEventCollection_p5 &persEvts, const GenVertex_p5 &vtx, ParticlesMap_t &bcToPart, HepMC::DataPool &datapools, HepMC::GenEvent *parent=nullptr) const
Create a transient GenVertex from a persistent one (version 1) It returns the new GenVertex.
Definition: McEventCollectionCnv_p5.cxx:558
GenVertex_p5::m_particlesOut
std::vector< int > m_particlesOut
collection of barcodes of out-going particles connected to this vertex
Definition: GenVertex_p5.h:73
HepMC::DataPool
Definition: HepMcDataPool.h:81
SG::VIEW_ELEMENTS
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
Definition: OwnershipPolicy.h:18
GenEvent_p5::m_verticesEnd
unsigned int m_verticesEnd
End position in the vector of vertices composing this event.
Definition: GenEvent_p5.h:146
GenVertex_p5::m_t
float m_t
t-coordinate of the vertex
Definition: GenVertex_p5.h:65
McEventCollectionCnv_p5::writeGenVertex
void writeGenVertex(const HepMC::GenVertex &vtx, McEventCollection_p5 &persEvt) const
Method to write a persistent GenVertex object.
Definition: McEventCollectionCnv_p5.cxx:792
GenEvent_p5::m_beamParticle1
int m_beamParticle1
Barcode of the beam particle 1.
Definition: GenEvent_p5.h:104
McEventCollectionCnv_p5::m_isPileup
bool m_isPileup
Definition: McEventCollectionCnv_p5.h:155
HepMC::GenParticlePtr
GenParticle * GenParticlePtr
Definition: GenParticle.h:37
McEventCollectionCnv_p5::persToTrans
virtual void persToTrans(const McEventCollection_p5 *persObj, McEventCollection *transObj, MsgStream &log)
Method creating the transient representation of McEventCollection from its persistent representation ...
Definition: McEventCollectionCnv_p5.cxx:58
McEventCollectionCnv_p5::McEventCollectionCnv_p5
McEventCollectionCnv_p5()
Default constructor:
Definition: McEventCollectionCnv_p5.cxx:30
GenEvent_p5::m_crossSection
std::vector< double > m_crossSection
Container of HepMC::GenCrossSection object translated to vector<double>
Definition: GenEvent_p5.h:121
TPConverterBase
Definition: TPConverter.h:738
HepMC::GenPdfInfoPtr
HepMC::PdfInfo * GenPdfInfoPtr
Definition: PdfInfo.h:17
GenParticle_p5::m_barcode
int m_barcode
barcode of this particles (uniquely identifying this particle within a given GenEvent)
Definition: GenParticle_p5.h:115
McEventCollection_p5
Definition: McEventCollection_p5.h:27
HepMcDataPool.h
GenParticle_p5::m_status
int m_status
Status of this particle, as defined for HEPEVT.
Definition: GenParticle_p5.h:84
GenEvent_p5::m_mpi
int m_mpi
Number of multi particle interactions.
Definition: GenEvent_p5.h:82
trigbs_dumpHLTContentInBS.stats
stats
Definition: trigbs_dumpHLTContentInBS.py:91
GenEvent_p5::m_beamParticle2
int m_beamParticle2
Barcode of the beam particle 2.
Definition: GenEvent_p5.h:108
McEventCollectionCnv_p5::operator=
McEventCollectionCnv_p5 & operator=(const McEventCollectionCnv_p5 &rhs)
Assignement operator.
Definition: McEventCollectionCnv_p5.cxx:41
pi
#define pi
Definition: TileMuonFitter.cxx:65
GenParticle_p5::m_endVtx
int m_endVtx
Barcode of the decay vertex of this particle.
Definition: GenParticle_p5.h:110
GenEvent_p5::m_alphaQCD
double m_alphaQCD
value of the QCD coupling.
Definition: GenEvent_p5.h:90
HepMC::DataPool::getGenParticle
HepMC::GenParticlePtr getGenParticle()
Definition: HepMcDataPool.h:160
GenVertex_p5::m_weights
std::vector< float > m_weights
Weights for this vertex.
Definition: GenVertex_p5.h:81
McEventCollectionCnv_p5::setPileup
void setPileup()
Definition: McEventCollectionCnv_p5.cxx:920
McEventCollection_p5::m_genEvents
std::vector< GenEvent_p5 > m_genEvents
The vector of persistent representation of GenEvents.
Definition: McEventCollection_p5.h:51
HepMC::set_signal_process_vertex
void set_signal_process_vertex(GenEvent *e, T v)
Definition: GenEvent.h:528
GenParticle_p5::m_thetaPolarization
float m_thetaPolarization
polarization
Definition: GenParticle_p5.h:96
GenParticle_p5
Definition: GenParticle_p5.h:22
ParticleGun_EoverP_Config.mom
mom
Definition: ParticleGun_EoverP_Config.py:63
GenEvent_p5
Definition: GenEvent_p5.h:23
HepMC::barcode_to_particle
GenParticle * barcode_to_particle(const GenEvent *e, int id)
Definition: GenEvent.h:506
McEventCollectionCnv_p5
Definition: McEventCollectionCnv_p5.h:51
HepMC::DataPool::evt
GenEvtPool_t evt
an arena of HepMC::GenEvent for efficient object instantiation
Definition: HepMcDataPool.h:140
GenEvent_p5::m_randomStates
std::vector< long int > m_randomStates
Container of random numbers for the generator states.
Definition: GenEvent_p5.h:117
HepMC::newGenVertexPtr
GenVertexPtr newGenVertexPtr(const HepMC::FourVector &pos=HepMC::FourVector(0.0, 0.0, 0.0, 0.0), const int i=0)
Definition: GenVertex.h:64
lumiFormat.i
int i
Definition: lumiFormat.py:92
McEventCollectionCnv_p5::m_hepMCWeightSvc
ServiceHandle< IHepMCWeightSvc > m_hepMCWeightSvc
Definition: McEventCollectionCnv_p5.h:156
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
GenVertex_p5::m_y
float m_y
y-coordinate of the vertex
Definition: GenVertex_p5.h:57
HepMC::barcode
int barcode(const T *p)
Definition: Barcode.h:16
GenEvent_p5::m_signalProcessId
int m_signalProcessId
Id of the processus being generated.
Definition: GenEvent_p5.h:74
GenParticle_p5::m_pdgId
int m_pdgId
identity of this particle, according to the Particle Data Group notation
Definition: GenParticle_p5.h:80
McEventCollectionCnv_p5::writeGenParticle
int writeGenParticle(const HepMC::GenParticle &p, McEventCollection_p5 &persEvt) const
Method to write a persistent GenParticle object It returns the index of the persistent GenParticle in...
Definition: McEventCollectionCnv_p5.cxx:873
test_pyathena.parent
parent
Definition: test_pyathena.py:15
GenParticle_p5::m_generated_mass
float m_generated_mass
mass of this particle when it was generated
Definition: GenParticle_p5.h:119
HepMC::new_vertex_status_from_old
int new_vertex_status_from_old(int oldStatus, int barcode)
Definition: MagicNumbers.h:351
HepMC::DataPool::vtx
GenVtxPool_t vtx
an arena of HepMC::GenVertex for efficient object instantiation
Definition: HepMcDataPool.h:144
McEventCollection
This defines the McEventCollection, which is really just an ObjectVector of McEvent objects.
Definition: McEventCollection.h:33
GenVertex_p5::m_barcode
int m_barcode
barcode of this vertex (uniquely identifying a vertex within an event)
Definition: GenVertex_p5.h:85
DataVector::clear
void clear()
Erase all the elements in the collection.
GenParticle_p5::m_recoMethod
short m_recoMethod
switch to know which method to chose to better recover the original HepLorentzVector.
Definition: GenParticle_p5.h:129
GenEvent_p5::m_alphaQED
double m_alphaQED
value of the QED coupling.
Definition: GenEvent_p5.h:94
McEventCollectionCnv_p5.h
HepMC::BarcodeBased::is_simulation_vertex
bool is_simulation_vertex(const T &v)
Method to establish if the vertex was created during simulation (only to be used in legacy TP convert...
Definition: MagicNumbers.h:207
HepMC::ConstGenParticlePtr
const GenParticle * ConstGenParticlePtr
Definition: GenParticle.h:38
McEventCollectionCnv_p5::ParticlesMap_t
std::unordered_map< HepMC::GenParticlePtr, int > ParticlesMap_t
Definition: McEventCollectionCnv_p5.h:98
McEventCollectionCnv_utils.h
GenEvent_p5::m_particlesBegin
unsigned int m_particlesBegin
Begin position in the vector of particles composing this event.
Definition: GenEvent_p5.h:150
MagicNumbers.h
GenEvent_p5::m_weights
std::vector< double > m_weights
Weights for this event.
Definition: GenEvent_p5.h:113
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.
GenParticle_p5::m_flow
std::vector< std::pair< int, int > > m_flow
Flow for this particle.
Definition: GenParticle_p5.h:88
GenEvent_p5::m_eventScale
double m_eventScale
Energy scale.
Definition: GenEvent_p5.h:86
GenEvent_p5::m_eventNbr
int m_eventNbr
Event number.
Definition: GenEvent_p5.h:78
HepMC::old_vertex_status_from_new
int old_vertex_status_from_new(int newStatus)
Definition: MagicNumbers.h:355
GenParticle_p5::m_phiPolarization
float m_phiPolarization
phi polarization
Definition: GenParticle_p5.h:100
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
python.PyAthena.v
v
Definition: PyAthena.py:157
McEventCollectionCnv_p5::createGenParticle
HepMC::GenParticlePtr createGenParticle(const GenParticle_p5 &p, ParticlesMap_t &partToEndVtx, HepMC::DataPool &datapools, const HepMC::GenVertexPtr &parent=nullptr, bool add_to_output=true) const
Create a transient GenParticle from a persistent one (vers.1) It returns the new GenParticle.
Definition: McEventCollectionCnv_p5.cxx:649
HepMC::newGenParticlePtr
GenParticlePtr newGenParticlePtr(const HepMC::FourVector &mom=HepMC::FourVector(0.0, 0.0, 0.0, 0.0), int pid=0, int status=0)
Definition: GenParticle.h:39
GenEvent_p5::m_heavyIon
std::vector< float > m_heavyIon
Container of HepMC::HeavyIon object translated to vector<double>
Definition: GenEvent_p5.h:125
GenVertex_p5::m_x
float m_x
x-coordinate of the vertex
Definition: GenVertex_p5.h:53
DEBUG
#define DEBUG
Definition: page_access.h:11
GenVertex_p5
Definition: GenVertex_p5.h:24
PowhegPythia8EvtGen_jetjet.pdf
pdf
Definition: PowhegPythia8EvtGen_jetjet.py:4
HepMC::DataPool::getGenEvent
HepMC::GenEvent * getGenEvent()
Definition: HepMcDataPool.h:150
HepMC::barcode_to_vertex
GenVertex * barcode_to_vertex(const GenEvent *e, int id)
Definition: GenEvent.h:505
GenEvent_p5::m_lengthUnit
int m_lengthUnit
HepMC::Units::LengthUnit casted to int.
Definition: GenEvent_p5.h:138
GenEvent_p5::m_verticesBegin
unsigned int m_verticesBegin
Begin position in the vector of vertices composing this event.
Definition: GenEvent_p5.h:142
HepMC::ConstGenVertexPtr
const HepMC::GenVertex * ConstGenVertexPtr
Definition: GenVertex.h:60
HepMC::old_particle_status_from_new
int old_particle_status_from_new(int newStatus)
Definition: MagicNumbers.h:349
GenEvent_p5::m_pdfinfo
std::vector< double > m_pdfinfo
Container of HepMC::PdfInfo object translated to vector<double> for simplicity.
Definition: GenEvent_p5.h:130
python.IoTestsLib.w
def w
Definition: IoTestsLib.py:200
GenVertex_p5::m_particlesIn
std::vector< int > m_particlesIn
collection of barcodes of in-going particles connected to this vertex
Definition: GenVertex_p5.h:69
HepMC::DataPool::getGenVertex
HepMC::GenVertexPtr getGenVertex()
Definition: HepMcDataPool.h:155
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
GenVertex_p5::m_id
int m_id
Id of this vertex.
Definition: GenVertex_p5.h:77
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
McEventCollection_p5::m_genParticles
std::vector< GenParticle_p5 > m_genParticles
The vector of persistent representation of GenParticles.
Definition: McEventCollection_p5.h:59
GenParticle_p5::m_px
float m_px
x-component of the 4-momentum of this particle
Definition: GenParticle_p5.h:64
GenVertex_p5::m_z
float m_z
z-coordinate of the vertex
Definition: GenVertex_p5.h:61
GenParticle_p5::m_py
float m_py
y-component of the 4-momentum of this particle
Definition: GenParticle_p5.h:68
HepMC::new_particle_status_from_old
int new_particle_status_from_old(int oldStatus, int barcode)
Functions for converting between the old and new barcode/status schemes.
Definition: MagicNumbers.h:345
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
GenParticle
@ GenParticle
Definition: TruthClasses.h:30
McEventCollection_p5::m_genVertices
std::vector< GenVertex_p5 > m_genVertices
The vector of persistent representation of GenVertices.
Definition: McEventCollection_p5.h:55
HepMC::DataPool::part
GenPartPool_t part
an arena of HepMC::GenParticle for efficient object instantiation
Definition: HepMcDataPool.h:148
GenParticle_p5::m_m
float m_m
m-component of the 4-momentum of this particle
Definition: GenParticle_p5.h:76
GenEvent_p5::m_signalProcessVtx
int m_signalProcessVtx
Barcode of the GenVertex holding the signal process.
Definition: GenEvent_p5.h:100
HepMC::signal_process_vertex
GenVertex * signal_process_vertex(const GenEvent *e)
Definition: GenEvent.h:503