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