26#include "GaudiKernel/ThreadLocalContext.h"
49 Base_t::operator=( rhs );
70 const EventContext& ctx = Gaudi::Hive::currentContext();
72 msg << MSG::DEBUG <<
"Loading McEventCollection from persistent state..."
85 const unsigned int nEvts = persObj->
m_genEvents.size();
89 for ( std::vector<GenEvent_p4>::const_iterator
96 HepMC::GenEvent * genEvt(
nullptr);
99 genEvt =
new HepMC::GenEvent();
106 genEvt->add_attribute (barcodesStr, std::make_shared<HepMC::GenEventBarcodes>());
107 genEvt->add_attribute(signalProcessIdStr, std::make_shared<HepMC3::IntAttribute>(persEvt.
m_signalProcessId));
109 genEvt->add_attribute(eventScaleStr, std::make_shared<HepMC3::DoubleAttribute>(persEvt.
m_eventScale));
110 genEvt->add_attribute(alphaQcdStr, std::make_shared<HepMC3::DoubleAttribute>(persEvt.
m_alphaQCD));
111 genEvt->add_attribute(alphaQedStr, std::make_shared<HepMC3::DoubleAttribute>(persEvt.
m_alphaQED));
113 genEvt->add_attribute(randomStatesStr, std::make_shared<HepMC3::VectorLongIntAttribute>(persEvt.
m_randomStates));
115 if(!genEvt->run_info()) genEvt->set_run_info(std::make_shared<HepMC3::GenRunInfo>());
116 if(genEvt->run_info()) genEvt->run_info()->set_weight_names(
m_hepMCWeightSvc->weightNameVec(ctx));
122 const std::vector<double>& pdf = persEvt.
m_pdfinfo;
123 HepMC3::GenPdfInfoPtr
pi = std::make_shared<HepMC3::GenPdfInfo>();
125 static_cast<int>(pdf[6]),
126 static_cast<int>(pdf[5]),
132 genEvt->set_pdf_info(std::move(
pi));
143 std::map<int, HepMC::GenVertexPtr> brc_to_vertex;
146 for (
unsigned int iVtx= persEvt.
m_verticesBegin; iVtx != endVtx; ++iVtx )
149 brc_to_vertex[persObj->
m_genVertices[iVtx].m_barcode] = std::move(vtx);
154 if ( sigProcVtx != 0 && brc_to_vertex.count(sigProcVtx) ) {
159 for (
auto & p : partToEndVtx) {
160 if ( brc_to_vertex.count(p.second) ) {
161 auto decayVtx = brc_to_vertex[p.second];
162 decayVtx->add_particle_in( p.first );
164 msg << MSG::ERROR <<
"GenParticle points to null end vertex !!" <<
endmsg;
173 genEvt->m_signal_process_vertex = 0;
176 genEvt->m_vertex_barcodes.clear();
177 genEvt->m_particle_barcodes.clear();
182 delete genEvt->m_pdf_info; genEvt->m_pdf_info = 0;
185 const std::vector<double>& pdf = persEvt.
m_pdfinfo;
186 genEvt->m_pdf_info =
new HepMC::PdfInfo
187 (
static_cast<int>(pdf[6]),
188 static_cast<int>(pdf[5]),
208 for (
unsigned int iVtx= persEvt.
m_verticesBegin; iVtx != endVtx; ++iVtx )
218 if ( sigProcVtx != 0 )
225 for ( ParticlesMap_t::iterator
226 p = partToEndVtx.begin(),
227 endItr = partToEndVtx.end();
234 decayVtx->add_particle_in( p->first );
239 <<
"GenParticle points to null end vertex !!"
247 msg << MSG::DEBUG <<
"Loaded McEventCollection from persistent state [OK]"
255 const EventContext& ctx = Gaudi::Hive::currentContext();
257 msg << MSG::DEBUG <<
"Creating persistent state of McEventCollection..."
261 const std::pair<unsigned int,unsigned int> stats = nbrParticlesAndVertices( transObj );
273 const HepMC::GenEvent* genEvt = *itr;
275 if (genEvt->run_info()) {
276 if (!genEvt->run_info()->weight_names().empty()) {
277 m_hepMCWeightSvc->setWeightNames( names_to_name_index_map(genEvt->weight_names()), ctx ).ignore();
284 auto A_signal_process_id=genEvt->attribute<HepMC3::IntAttribute>(signalProcessIdStr);
285 auto A_event_scale=genEvt->attribute<HepMC3::DoubleAttribute>(eventScaleStr);
286 auto A_alphaQCD=genEvt->attribute<HepMC3::DoubleAttribute>(alphaQcdStr);
287 auto A_alphaQED=genEvt->attribute<HepMC3::DoubleAttribute>(alphaQedStr);
289 auto A_random_states=genEvt->attribute<HepMC3::VectorLongIntAttribute>(randomStatesStr);
292 emplace_back( A_signal_process_id?(A_signal_process_id->value()):0,
293 genEvt->event_number(),
294 A_event_scale?(A_event_scale->value()):0.0,
295 A_alphaQCD?(A_alphaQCD->value()):0.0,
296 A_alphaQED?(A_alphaQED->value()):0.0,
299 std::vector<double>(),
300 A_random_states?(A_random_states->value()):std::vector<long>(),
302 nPersVtx + genEvt->vertices().size(),
304 nPersParts + genEvt->particles().size() );
307 if (genEvt->pdf_info())
309 auto pi=genEvt->pdf_info();
311 std::vector<double>& pdfinfo = persEvt.
m_pdfinfo;
313 pdfinfo[6] =
static_cast<double>(
pi->parton_id[0]);
314 pdfinfo[5] =
static_cast<double>(
pi->parton_id[1]);
315 pdfinfo[4] =
pi->x[0];
316 pdfinfo[3] =
pi->x[1];
317 pdfinfo[2] =
pi->scale;
318 pdfinfo[1] =
pi->xf[0];
319 pdfinfo[0] =
pi->xf[1];
322 for (
const auto& v: genEvt->vertices())
330 const HepMC::GenEvent* genEvt = *itr;
331 const int signalProcessVtx = genEvt->m_signal_process_vertex
332 ? genEvt->m_signal_process_vertex->barcode()
335 m_hepMCWeightSvc->setWeightNames( genEvt->m_weights.m_names, ctx ).ignore();
337 push_back(
GenEvent_p4( genEvt->m_signal_process_id,
338 genEvt->m_event_number,
339 genEvt->m_event_scale,
343 genEvt->m_weights.m_weights,
344 std::vector<double>(),
345 genEvt->m_random_states,
347 nPersVtx + genEvt->vertices_size(),
349 nPersParts + genEvt->particles_size() ) );
351 if (genEvt->m_pdf_info)
354 std::vector<double>& pdfinfo = persEvt.
m_pdfinfo;
356 pdfinfo[6] =
static_cast<double>(genEvt->m_pdf_info->m_id1);
357 pdfinfo[5] =
static_cast<double>(genEvt->m_pdf_info->m_id2);
358 pdfinfo[4] = genEvt->m_pdf_info->m_x1;
359 pdfinfo[3] = genEvt->m_pdf_info->m_x2;
360 pdfinfo[2] = genEvt->m_pdf_info->m_scalePDF;
361 pdfinfo[1] = genEvt->m_pdf_info->m_pdf1;
362 pdfinfo[0] = genEvt->m_pdf_info->m_pdf2;
366 const HepMC::GenEvent::vertex_const_iterator endVtx=genEvt->vertices_end();
367 for ( HepMC::GenEvent::vertex_const_iterator i = genEvt->vertices_begin();
377 msg << MSG::DEBUG <<
"Created persistent state of HepMC::GenEvent [OK]"
397 if (parent) parent->add_vertex(vtx);
399 vtx->set_position(HepMC::FourVector( persVtx.
m_x , persVtx.
m_y , persVtx.
m_z ,persVtx.
m_t ));
403 vtx->add_attribute(
"weights",std::make_shared<HepMC3::VectorDoubleAttribute>(
weights));
409 for (
unsigned int i = 0; i != nPartsIn; ++i )
416 for (
unsigned int i = 0; i != nPartsOut; ++i )
421 vtx->m_position.setX( persVtx.
m_x );
422 vtx->m_position.setY( persVtx.
m_y );
423 vtx->m_position.setZ( persVtx.
m_z );
424 vtx->m_position.setT( persVtx.
m_t );
425 vtx->m_particles_in.clear();
426 vtx->m_particles_out.clear();
428 vtx->m_weights.m_weights.reserve( persVtx.
m_weights.size() );
429 vtx->m_weights.m_weights.assign ( persVtx.
m_weights.begin(),
436 for (
unsigned int i = 0; i != nPartsIn; ++i )
445 for (
unsigned int i = 0; i != nPartsOut; ++i )
470 if (parent) add_to_output?parent->add_particle_out(p):parent->add_particle_in(p);
472 p->set_pdg_id( persPart.
m_pdgId);
474 p->add_attribute(
"phi",std::make_shared<HepMC3::DoubleAttribute>(persPart.
m_phiPolarization));
475 p->add_attribute(
"theta",std::make_shared<HepMC3::DoubleAttribute>(persPart.
m_thetaPolarization));
485 double temp_e = std::sqrt( (
long double)(persPart.
m_px)*persPart.
m_px +
486 (
long double)(persPart.
m_py)*persPart.
m_py +
487 (
long double)(persPart.
m_pz)*persPart.
m_pz +
488 (
long double)(persPart.
m_m) *persPart.
m_m );
489 p->set_momentum( HepMC::FourVector(persPart.
m_px,persPart.
m_py,persPart.
m_pz,temp_e));
493 const int signM2 = ( persPart.
m_m >= 0. ? 1 : -1 );
494 const double persPart_ene =
495 std::sqrt( std::abs((
long double)(persPart.
m_px)*persPart.
m_px +
496 (
long double)(persPart.
m_py)*persPart.
m_py +
497 (
long double)(persPart.
m_pz)*persPart.
m_pz +
498 signM2* (
long double)(persPart.
m_m)* persPart.
m_m));
499 const int signEne = ( persPart.
m_recoMethod == 1 ? 1 : -1 );
500 p->set_momentum( HepMC::FourVector( persPart.
m_px,
503 signEne * persPart_ene ));
507 std::vector<int> flows;
508 const unsigned int nFlow = persPart.
m_flow.size();
509 for (
unsigned int iFlow= 0; iFlow != nFlow; ++iFlow ) {
510 flows.push_back(persPart.
m_flow[iFlow].second );
513 p->add_attribute(
"flows", std::make_shared<HepMC3::VectorIntAttribute>(flows));
515 p->m_pdg_id = persPart.
m_pdgId;
519 p->m_production_vertex = 0;
531 p->m_momentum.setPx( persPart.
m_px);
532 p->m_momentum.setPy( persPart.
m_py);
533 p->m_momentum.setPz( persPart.
m_pz);
534 double temp_e = std::sqrt( (
long double)(persPart.
m_px)*persPart.
m_px +
535 (
long double)(persPart.
m_py)*persPart.
m_py +
536 (
long double)(persPart.
m_pz)*persPart.
m_pz +
537 (
long double)(persPart.
m_m) *persPart.
m_m );
538 p->m_momentum.setE( temp_e);
542 const int signM2 = ( persPart.
m_m >= 0. ? 1 : -1 );
543 const double persPart_ene =
544 std::sqrt( std::abs((
long double)(persPart.
m_px)*persPart.
m_px +
545 (
long double)(persPart.
m_py)*persPart.
m_py +
546 (
long double)(persPart.
m_pz)*persPart.
m_pz +
547 signM2* (
long double)(persPart.
m_m)* persPart.
m_m));
548 const int signEne = ( persPart.
m_recoMethod == 1 ? 1 : -1 );
549 p->m_momentum.set( persPart.
m_px,
552 signEne * persPart_ene );
556 const unsigned int nFlow = persPart.
m_flow.size();
558 for (
unsigned int iFlow= 0; iFlow != nFlow; ++iFlow )
560 p->m_flow.set_icode( persPart.
m_flow[iFlow].first,
561 persPart.
m_flow[iFlow].second );
567 partToEndVtx[p] = persPart.
m_endVtx;
577 const HepMC::FourVector& position = vtx->position();
578 auto A_weights=vtx->attribute<HepMC3::VectorDoubleAttribute>(
"weights");
579 auto A_barcode=vtx->attribute<HepMC3::IntAttribute>(
"barcode");
582 auto weights_d = A_weights->value();
583 for (
auto& w: weights_d)
weights.push_back(w);
592 A_barcode?(A_barcode->value()):vtx->id()
597 for (
const auto& p: vtx->particles_in())
599 if ( !
p->production_vertex() ||
p->production_vertex()->id() == 0 )
605 for (
const auto& p: vtx->particles_out())
614 const HepMC::FourVector& position = vtx.m_position;
621 vtx.m_weights.m_weights.begin(),
622 vtx.m_weights.m_weights.end(),
627 const std::vector<HepMC::GenParticlePtr>::const_iterator endInVtx = vtx.m_particles_in.end();
629 for ( std::vector<HepMC::GenParticlePtr>::const_iterator p = vtx.m_particles_in.begin();
633 if ( 0 == (*p)->production_vertex() )
639 const std::vector<HepMC::GenParticlePtr>::const_iterator endOutVtx = vtx.m_particles_out.end();
641 for ( std::vector<HepMC::GenParticlePtr>::const_iterator p = vtx.m_particles_out.begin();
656 const HepMC::FourVector& mom = p->momentum();
657 const double ene = mom.e();
658 const double m2 = mom.m2();
661 const bool useP2M2 = !(m2 > 0) &&
663 !(std::abs(m2) < 2.0*DBL_EPSILON*ene*ene);
665 const short recoMethod = ( !useP2M2 ? 0: ( ene >= 0. ? 1 : 2 ) );
666 auto A_theta=p->attribute<HepMC3::DoubleAttribute>(
"theta");
667 auto A_phi=p->attribute<HepMC3::DoubleAttribute>(
"phi");
668 auto A_flows=p->attribute<HepMC3::VectorIntAttribute>(
"flows");
677 A_flows?(A_flows->value().size()):0,
678 A_theta?(A_theta->value()):0.0,
679 A_phi?(A_phi->value()):0.0,
680 p->production_vertex()?(
HepMC::barcode(p->production_vertex())):0,
685 std::vector< std::pair<int,int> > flow_hepmc2;
686 if(A_flows) flow_hepmc2=vector_to_vector_int_int(A_flows->value());
687 persEvt.
m_genParticles.back().m_flow.assign( flow_hepmc2.begin(),flow_hepmc2.end() );
696 const HepMC::FourVector& mom = p.m_momentum;
697 const double ene = mom.e();
698 const double m2 = mom.m2();
701 const bool useP2M2 = !(m2 > 0) &&
703 !(std::abs(m2) < 2.0*DBL_EPSILON*ene*ene);
705 const short recoMethod = ( !useP2M2
719 p.m_polarization.theta(),
720 p.m_polarization.phi(),
721 p.m_production_vertex
722 ? p.m_production_vertex->barcode()
725 ? p.m_end_vertex->barcode()
void prepareToAdd(unsigned int size)
Prepare to add cached elements.
DataModel_detail::const_iterator< DataVector > const_iterator
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.
double m_alphaQED
value of the QED coupling.
double m_alphaQCD
value of the QCD coupling.
double m_eventScale
Energy scale.
std::vector< double > m_weights
Weights for this event.
int m_signalProcessId
Id of the processus being generated.
int m_eventNbr
Event number.
std::vector< double > m_pdfinfo
Container of HepMC::PdfInfo object translated to vector<double> for simplicity.
unsigned int m_verticesEnd
End position in the vector of vertices composing this event.
unsigned int m_particlesEnd
End position in the vector of particles composing this event.
unsigned int m_verticesBegin
Begin position in the vector of vertices composing this event.
unsigned int m_particlesBegin
Begin position in the vector of particles composing this event.
int m_signalProcessVtx
Barcode of the GenVertex holding the signal process.
std::vector< long int > m_randomStates
Container of random numbers for the generator states.
float m_px
x-component of the 4-momentum of this particle
float m_m
m-component of the 4-momentum of this particle
float m_py
y-component of the 4-momentum of this particle
short m_recoMethod
switch to know which method to chose to better recover the original HepLorentzVector.
int m_pdgId
identity of this particle, according to the Particle Data Group notation
std::vector< std::pair< int, int > > m_flow
Flow for this particle.
float m_phiPolarization
phi polarization
float m_pz
z-component of the 4-momentum of this particle
float m_thetaPolarization
polarization
int m_endVtx
Barcode of the decay vertex of this particle.
int m_status
Status of this particle, as defined for HEPEVT.
int m_barcode
barcode of this particles (uniquely identifying this particle within a given GenEvent)
float m_x
x-coordinate of the vertex
float m_t
t-coordinate of the vertex
std::vector< int > m_particlesIn
collection of barcodes of in-going particles connected to this vertex
float m_y
y-coordinate of the vertex
std::vector< float > m_weights
Weights for this vertex.
float m_z
z-coordinate of the vertex
int m_barcode
barcode of this vertex (uniquely identifying a vertex within an event)
std::vector< int > m_particlesOut
collection of barcodes of out-going particles connected to this vertex
int m_id
Id of this vertex.
void writeGenVertex(const HepMC::GenVertex &vtx, McEventCollection_p4 &persEvt) const
Method to write a persistent GenVertex object.
virtual void persToTrans(const McEventCollection_p4 *persObj, McEventCollection *transObj, MsgStream &log)
Method creating the transient representation of McEventCollection from its persistent representation ...
HepMC::GenParticlePtr createGenParticle(const GenParticle_p4 &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.
McEventCollectionCnv_p4 & operator=(const McEventCollectionCnv_p4 &rhs)
Assignement operator.
virtual ~McEventCollectionCnv_p4()
Destructor.
McEventCollectionCnv_p4()
Default constructor:
int writeGenParticle(const HepMC::GenParticle &p, McEventCollection_p4 &persEvt) const
Method to write a persistent GenParticle object It returns the index of the persistent GenParticle in...
virtual void transToPers(const McEventCollection *transObj, McEventCollection_p4 *persObj, MsgStream &log)
Method creating the persistent representation McEventCollection_p4 from its transient representation ...
T_AthenaPoolTPCnvBase< McEventCollection, McEventCollection_p4 > Base_t
std::unordered_map< HepMC::GenParticlePtr, int > ParticlesMap_t
HepMC::GenVertexPtr createGenVertex(const McEventCollection_p4 &persEvts, const GenVertex_p4 &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.
ServiceHandle< IHepMCWeightSvc > m_hepMCWeightSvc
std::vector< GenParticle_p4 > m_genParticles
The vector of persistent representation of GenParticles.
std::vector< GenVertex_p4 > m_genVertices
The vector of persistent representation of GenVertices.
std::vector< GenEvent_p4 > m_genEvents
The vector of persistent representation of GenEvents.
This defines the McEventCollection, which is really just an ObjectVector of McEvent objectsFile: Gene...
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)
GenVertexPtr newGenVertexPtr(const HepMC::FourVector &pos=HepMC::FourVector(0.0, 0.0, 0.0, 0.0), const int i=0)
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)
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
const GenParticle * ConstGenParticlePtr
GenVertex * signal_process_vertex(const GenEvent *e)
const HepMC::GenVertex * ConstGenVertexPtr
@ 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