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