13#include "GaudiKernel/MsgStream.h"
37 HepMC::GenEvent* transObj,
40 msg << MSG::DEBUG <<
"Loading HepMC::GenEvent from persistent state..."
45 <<
"This instance of GenEventCnv_p1 has a null pointer to "
46 <<
"HepMC::DataPool !" <<
endmsg
47 <<
"This probably means the T/P converter (McEventCollectionCnv_pX) "
48 <<
"is misconfigured !!"
50 throw std::runtime_error(
"Null pointer to HepMC::DataPool !!");
53 const unsigned int nVertices = persObj->
m_vertices.size();
54 if (
m_pool->vtx.capacity() -
m_pool->vtx.allocated() < nVertices ) {
55 m_pool->vtx.reserve(
m_pool->vtx.allocated() + nVertices );
57 const unsigned int nParts = persObj->
m_particles.size();
58 if (
m_pool->part.capacity() -
m_pool->part.allocated() < nParts ) {
59 m_pool->part.reserve(
m_pool->part.allocated() + nParts );
63 transObj->add_attribute (
"barcodes", std::make_shared<HepMC::GenEventBarcodes>());
64 transObj->add_attribute(
"signal_process_id",std::make_shared<HepMC3::IntAttribute>(persObj->
m_signalProcessId ));
65 transObj->set_event_number(persObj->
m_eventNbr);
66 transObj->add_attribute(
"event_scale",std::make_shared<HepMC3::DoubleAttribute>(persObj->
m_eventScale));
67 transObj->add_attribute(
"alphaQCD",std::make_shared<HepMC3::DoubleAttribute>(persObj->
m_alphaQCD));
68 transObj->add_attribute(
"alphaQED",std::make_shared<HepMC3::DoubleAttribute>(persObj->
m_alphaQED));
70 transObj->add_attribute(
"random_states",std::make_shared<HepMC3::VectorLongIntAttribute>(persObj->
m_randomStates));
74 transObj->set_event_number( persObj->
m_eventNbr );
76 transObj->set_alphaQCD ( persObj->
m_alphaQCD );
77 transObj->set_alphaQED ( persObj->
m_alphaQED );
84 transObj->m_vertex_barcodes.clear();
85 transObj->m_particle_barcodes.clear();
87 transObj->m_pdf_info = 0;
97 for (
unsigned int iVtx = 0; iVtx != nVertices; ++iVtx ) {
104 if ( sigProcVtx != 0 ) {
110 const ParticlesMap_t::iterator endItr= partToEndVtx.end();
111 for ( ParticlesMap_t::iterator p = partToEndVtx.begin();
116 decayVtx->add_particle_in( p->first );
119 <<
"GenParticle points to null end vertex !!"
124 msg << MSG::DEBUG <<
"Loaded HepMC::GenEvent from persistent state [OK]"
132 msg << MSG::DEBUG <<
"Creating persistent state of HepMC::GenEvent..."
136 <<
"This transient-to-persistent converter method has been RETIRED !!"
138 <<
"You are not supposed to end-up here ! Go away !"
141 throw std::runtime_error(
"Retired GenEventCnv_p1::transToPers() !!" );
155 if (parent) parent->add_vertex(vtx);
157 vtx->set_position( HepMC::FourVector(persVtx.
m_x,persVtx.
m_y,persVtx.
m_z,persVtx.
m_t) );
158 vtx->add_attribute(
"weights",std::make_shared<HepMC3::VectorDoubleAttribute>(persVtx.
m_weights));
163 for (
unsigned int i = 0; i != nPartsIn; ++i ) {
168 for (
unsigned int i = 0; i != nPartsOut; ++i ) {
173 vtx->m_position.setX( persVtx.
m_x );
174 vtx->m_position.setY( persVtx.
m_y );
175 vtx->m_position.setZ( persVtx.
m_z );
176 vtx->m_position.setT( persVtx.
m_t );
177 vtx->m_particles_in.clear();
178 vtx->m_particles_out.clear();
179 vtx->m_id = persVtx.
m_id;
187 for (
unsigned int i = 0; i != nPartsIn; ++i ) {
195 for (
unsigned int i = 0; i != nPartsOut; ++i ) {
210 if (parent) parent->add_particle_out(p);
212 p->set_momentum( HepMC::FourVector(persPart.
m_px,persPart.
m_py,persPart.
m_pz,persPart.
m_ene));
213 p->set_pdg_id(persPart.
m_pdgId);
215 p->add_attribute(
"phi",std::make_shared<HepMC3::DoubleAttribute>(persPart.
m_phiPolarization));
216 p->add_attribute(
"theta",std::make_shared<HepMC3::DoubleAttribute>(persPart.
m_thetaPolarization));
219 std::vector<int> flows;
220 const unsigned int nFlow = persPart.
m_flow.size();
221 for (
unsigned int iFlow= 0; iFlow != nFlow; ++iFlow ) {
222 flows.push_back(persPart.
m_flow[iFlow].second );
225 p->add_attribute(
"flows", std::make_shared<HepMC3::VectorIntAttribute>(flows));
229 p->m_momentum.setPx( persPart.
m_px );
230 p->m_momentum.setPy( persPart.
m_py );
231 p->m_momentum.setPz( persPart.
m_pz );
232 p->m_momentum.setE ( persPart.
m_ene );
233 p->m_pdg_id = persPart.
m_pdgId;
237 p->m_production_vertex = 0;
242 const unsigned int nFlow = persPart.
m_flow.size();
243 for (
unsigned int iFlow= 0; iFlow != nFlow; ++iFlow ) {
244 p->m_flow.set_icode( persPart.
m_flow[iFlow].first, persPart.
m_flow[iFlow].second );
249 partToEndVtx[p] = persPart.
m_endVtx;
virtual void transToPers(const HepMC::GenEvent *transObj, GenEvent_p1 *persObj, MsgStream &msg)
Method creating the persistent representation GenEvent_p1 from its transient representation HepMC::Ge...
HepMC::DataPool * m_pool
a PIMPL idiom to hide the DataPools (and their specialized destructors) from the outside world
static HepMC::GenParticlePtr createGenParticle(const GenParticle_p1 &p, ParticlesMap_t &partToEndVtx, HepMC::DataPool &datapools, const HepMC::GenVertexPtr &parent=nullptr)
Create a transient GenParticle from a persistent one (vers.1) It returns the new GenParticle.
static HepMC::GenVertexPtr createGenVertex(const GenEvent_p1 &persEvt, const GenVertex_p1 &vtx, ParticlesMap_t &bcToPart, HepMC::DataPool &datapools, HepMC::GenEvent *parent=nullptr)
Create a transient GenVertex from a persistent one (version 1) It returns the new GenVertex.
virtual void persToTrans(const GenEvent_p1 *persObj, HepMC::GenEvent *transObj, MsgStream &msg)
Destructor:
void setDataPool(HepMC::DataPool *pool)
reset the @ HepMC::DataPool pointer
std::unordered_map< HepMC::GenParticlePtr, int > ParticlesMap_t
GenEventCnv_p1(HepMC::DataPool *pool=0)
constructor:
int m_eventNbr
Event number.
double m_alphaQCD
value of the QCD coupling.
std::vector< long int > m_randomStates
Container of random numbers for the generator states.
std::vector< GenVertex_p1 > m_vertices
Vector of vertices composing this event.
double m_eventScale
Energy scale.
double m_alphaQED
value of the QED coupling.
int m_signalProcessId
Id of the processus being generated.
std::vector< GenParticle_p1 > m_particles
Vector of particles composing this event.
int m_signalProcessVtx
Barcode of the GenVertex holding the signal process.
std::vector< double > m_weights
Weights for this event.
double m_phiPolarization
phi polarization
double m_px
x-component of the 4-momentum of this particle
int m_pdgId
identity of this particle, according to the Particle Data Group notation
double m_thetaPolarization
polarization
double m_py
y-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.
int m_endVtx
Barcode of the decay vertex of this particle.
double m_pz
z-component of the 4-momentum of this particle
double m_ene
e-component of the 4-momentum of this particle
std::vector< std::pair< int, int > > m_flow
Flow for this particle.
std::vector< int > m_particlesOut
collection of barcodes of out-going particles connected to this vertex
double m_t
t-coordinate of the vertex
std::vector< int > m_particlesIn
collection of barcodes of in-going particles connected to this vertex
int m_id
Id of this vertex.
std::vector< double > m_weights
Weights for this vertex.
int m_barcode
barcode of this vertex (uniquely identifying a vertex within an event)
double m_x
x-coordinate of the vertex
double m_z
z-coordinate of the vertex
double m_y
y-coordinate of the vertex
void set_signal_process_vertex(GenEvent *e, T v)
GenVertex * barcode_to_vertex(const GenEvent *e, int id)
HepMC::GenVertex * GenVertexPtr
bool suggest_barcode(T &p, int i)
GenParticle * GenParticlePtr
A namespace for all vertexing packages and related stuff.
HepMC::GenParticlePtr getGenParticle()
HepMC::GenVertexPtr getGenVertex()