22 #include "GaudiKernel/ThreadLocalContext.h"
32 m_isPileup(false),m_hepMCWeightSvc(
"HepMCWeightSvc",
"McEventCollectionCnv_p5")
37 m_isPileup(false),m_hepMCWeightSvc(
"HepMCWeightSvc",
"McEventCollectionCnv_p5")
44 Base_t::operator=( rhs );
62 const EventContext& ctx = Gaudi::Hive::currentContext();
64 msg <<
MSG::DEBUG <<
"Loading McEventCollection from persistent state..."
75 datapools.
part.prepareToAdd(nParts);
76 const unsigned int nEvts = persObj->
m_genEvents.size();
77 datapools.
evt.prepareToAdd(nEvts);
79 for ( std::vector<GenEvent_p5>::const_iterator
85 HepMC::GenEvent * genEvt(
nullptr);
87 genEvt =
new HepMC::GenEvent();
92 genEvt->add_attribute (
"barcodes", std::make_shared<HepMC::GenEventBarcodes>());
93 genEvt->add_attribute(
"signal_process_id", std::make_shared<HepMC3::IntAttribute>(persEvt.
m_signalProcessId));
95 genEvt->add_attribute(
"mpi", std::make_shared<HepMC3::IntAttribute>(persEvt.
m_mpi));
96 genEvt->add_attribute(
"event_scale", std::make_shared<HepMC3::DoubleAttribute>(persEvt.
m_eventScale));
97 genEvt->add_attribute(
"alphaQCD", std::make_shared<HepMC3::DoubleAttribute>(persEvt.
m_alphaQCD));
98 genEvt->add_attribute(
"alphaQED", std::make_shared<HepMC3::DoubleAttribute>(persEvt.
m_alphaQED));
100 genEvt->add_attribute(
"random_states", std::make_shared<HepMC3::VectorLongIntAttribute>(persEvt.
m_randomStates));
102 genEvt->set_units(
static_cast<HepMC3::Units::MomentumUnit
>(persEvt.
m_momentumUnit),
103 static_cast<HepMC3::Units::LengthUnit
>(persEvt.
m_lengthUnit));
106 if(!genEvt->run_info()) genEvt->set_run_info(std::make_shared<HepMC3::GenRunInfo>());
111 auto cs = std::make_shared<HepMC3::GenCrossSection>();
113 genEvt->set_cross_section(cs);
114 if(
static_cast<bool>(xsection[0]) )
115 cs->set_cross_section(xsection[2],xsection[1]);
117 cs->set_cross_section(-1.0, -1.0);
122 auto hi = std::make_shared<HepMC3::GenHeavyIon>();
123 const std::vector<float>& hIon = persEvt.
m_heavyIon;
126 static_cast<int>(hIon[12]),
127 static_cast<int>(hIon[11]),
128 static_cast<int>(hIon[10]),
129 static_cast<int>(hIon[9]),
130 static_cast<int>(hIon[8]),
131 static_cast<int>(hIon[7]),
132 static_cast<int>(hIon[6]),
133 static_cast<int>(hIon[5]),
134 static_cast<int>(hIon[4]),
139 genEvt->set_heavy_ion(hi);
149 pi->set(
static_cast<int>(
pdf[8]),
150 static_cast<int>(
pdf[7]),
156 static_cast<int>(
pdf[6]),
157 static_cast<int>(
pdf[5]));
158 genEvt->set_pdf_info(
pi);
168 std::map<int, HepMC::GenVertexPtr> brc_to_vertex;
172 for (
unsigned int iVtx = persEvt.
m_verticesBegin; iVtx != endVtx; ++iVtx ) {
179 if ( sigProcVtx != 0 && brc_to_vertex.count(sigProcVtx) ) {
184 for (
auto &
p : partToEndVtx) {
185 if ( brc_to_vertex.count(
p.second) ) {
186 auto decayVtx = brc_to_vertex[
p.second];
187 decayVtx->add_particle_in(
p.first );
189 msg << MSG::ERROR <<
"GenParticle points to null end vertex !!" <<
endmsg;
195 if ( beamPart1 != 0 && beamPart2 != 0 ) {
203 genEvt->m_mpi = persEvt.
m_mpi;
207 genEvt->m_signal_process_vertex = 0;
208 genEvt->m_beam_particle_1 = 0;
209 genEvt->m_beam_particle_2 = 0;
212 genEvt->m_vertex_barcodes.clear();
213 genEvt->m_particle_barcodes.clear();
214 genEvt->m_momentum_unit =
static_cast<HepMC::Units::MomentumUnit
>(persEvt.
m_momentumUnit);
215 genEvt->m_position_unit =
static_cast<HepMC::Units::LengthUnit
>(persEvt.
m_lengthUnit);
221 if( genEvt->m_cross_section )
222 delete genEvt->m_cross_section;
223 genEvt->m_cross_section = 0;
226 genEvt->m_cross_section =
new HepMC::GenCrossSection();
228 if(
static_cast<bool>(xsection[0]) )
229 genEvt->m_cross_section->set_cross_section(xsection[2],xsection[1]);
233 if(genEvt->m_heavy_ion )
234 delete genEvt->m_heavy_ion;
235 genEvt->m_heavy_ion = 0;
237 const std::vector<float>& hIon = persEvt.
m_heavyIon;
238 genEvt->m_heavy_ion =
new HepMC::HeavyIon
240 static_cast<int>(hIon[12]),
241 static_cast<int>(hIon[11]),
242 static_cast<int>(hIon[10]),
243 static_cast<int>(hIon[9]),
244 static_cast<int>(hIon[8]),
245 static_cast<int>(hIon[7]),
246 static_cast<int>(hIon[6]),
247 static_cast<int>(hIon[5]),
248 static_cast<int>(hIon[4]),
258 if(genEvt->m_pdf_info)
259 delete genEvt->m_pdf_info;
260 genEvt->m_pdf_info = 0;
263 genEvt->m_pdf_info =
new HepMC::PdfInfo
265 static_cast<int>(
pdf[8]),
266 static_cast<int>(
pdf[7]),
272 static_cast<int>(
pdf[6]),
273 static_cast<int>(
pdf[5])
288 for (
unsigned int iVtx= persEvt.
m_verticesBegin; iVtx != endVtx; ++iVtx ) {
297 if ( sigProcVtx != 0 ) {
298 genEvt->set_signal_process_vertex( genEvt->barcode_to_vertex( sigProcVtx ) );
303 p = partToEndVtx.begin(),
304 endItr = partToEndVtx.end();
309 decayVtx->add_particle_in(
p->first );
312 <<
"GenParticle points to null end vertex !!"
320 if ( beamPart1 != 0 && beamPart2 !=0 ) {
321 genEvt->set_beam_particles(genEvt->barcode_to_particle(beamPart1),
322 genEvt->barcode_to_particle(beamPart2));
329 msg <<
MSG::DEBUG <<
"Loaded McEventCollection from persistent state [OK]"
337 const EventContext& ctx = Gaudi::Hive::currentContext();
339 msg <<
MSG::DEBUG <<
"Creating persistent state of McEventCollection..."
343 const std::pair<unsigned int,unsigned int>
stats = nbrParticlesAndVertices( transObj );
353 const HepMC::GenEvent* genEvt = *itr;
356 if (genEvt->run_info()) {
357 if (!genEvt->run_info()->weight_names().empty()) {
358 m_hepMCWeightSvc->setWeightNames( names_to_name_index_map(genEvt->weight_names()), ctx ).ignore();
366 auto A_mpi=genEvt->attribute<HepMC3::IntAttribute>(
"mpi");
367 auto A_signal_process_id=genEvt->attribute<HepMC3::IntAttribute>(
"signal_process_id");
368 auto A_event_scale=genEvt->attribute<HepMC3::DoubleAttribute>(
"event_scale");
369 auto A_alphaQCD=genEvt->attribute<HepMC3::DoubleAttribute>(
"alphaQCD");
370 auto A_alphaQED=genEvt->attribute<HepMC3::DoubleAttribute>(
"alphaQED");
372 auto A_random_states=genEvt->attribute<HepMC3::VectorLongIntAttribute>(
"random_states");
373 auto beams=genEvt->beams();
375 emplace_back(A_signal_process_id?(A_signal_process_id->value()):-1,
376 genEvt->event_number(),
377 A_mpi?(A_mpi->value()):-1,
378 A_event_scale?(A_event_scale->value()):0.0,
379 A_alphaQCD?(A_alphaQCD->value()):0.0,
380 A_alphaQED?(A_alphaQED->value()):0.0,
385 A_random_states?(A_random_states->value()):std::vector<long>(),
386 std::vector<double>(),
387 std::vector<float>(),
388 std::vector<double>(),
389 genEvt->momentum_unit(),
390 genEvt->length_unit(),
392 nPersVtx + genEvt->vertices().size(),
394 nPersParts + genEvt->particles().size() );
398 if (genEvt->cross_section()) {
399 auto cs=genEvt->cross_section();
419 if (genEvt->heavy_ion()) {
420 auto hi=genEvt->heavy_ion();
422 std::vector<float>& heavyIon = persEvt.
m_heavyIon;
424 heavyIon[12] =
static_cast<float>(hi->Ncoll_hard);
425 heavyIon[11] =
static_cast<float>(hi->Npart_proj);
426 heavyIon[10] =
static_cast<float>(hi->Npart_targ);
427 heavyIon[9] =
static_cast<float>(hi->Ncoll);
428 heavyIon[8] =
static_cast<float>(hi->spectator_neutrons);
429 heavyIon[7] =
static_cast<float>(hi->spectator_protons);
430 heavyIon[6] =
static_cast<float>(hi->N_Nwounded_collisions);
431 heavyIon[5] =
static_cast<float>(hi->Nwounded_N_collisions);
432 heavyIon[4] =
static_cast<float>(hi->Nwounded_Nwounded_collisions);
433 heavyIon[3] = hi->impact_parameter;
434 heavyIon[2] = hi->event_plane_angle;
435 heavyIon[1] = hi->eccentricity;
436 heavyIon[0] = hi->sigma_inel_NN;
440 if (genEvt->pdf_info()) {
441 auto pi=genEvt->pdf_info();
443 std::vector<double>& pdfinfo = persEvt.
m_pdfinfo;
445 pdfinfo[8] =
static_cast<double>(
pi->parton_id[0]);
446 pdfinfo[7] =
static_cast<double>(
pi->parton_id[1]);
447 pdfinfo[6] =
static_cast<double>(
pi->pdf_id[0]);
448 pdfinfo[5] =
static_cast<double>(
pi->pdf_id[1]);
449 pdfinfo[4] =
pi->x[0];
450 pdfinfo[3] =
pi->x[1];
451 pdfinfo[2] =
pi->scale;
452 pdfinfo[1] =
pi->xf[0];
453 pdfinfo[0] =
pi->xf[1];
457 for (
const auto&
v: genEvt->vertices()) {
461 const int signalProcessVtx = genEvt->m_signal_process_vertex
462 ? genEvt->m_signal_process_vertex->barcode()
464 const int beamParticle1Barcode = genEvt->m_beam_particle_1
465 ? genEvt->m_beam_particle_1->barcode()
467 const int beamParticle2Barcode = genEvt->m_beam_particle_2
468 ? genEvt->m_beam_particle_2->barcode()
472 m_hepMCWeightSvc->setWeightNames( genEvt->m_weights.m_names, ctx ).ignore();
476 push_back(
GenEvent_p5( genEvt->m_signal_process_id,
477 genEvt->m_event_number,
479 genEvt->m_event_scale,
483 beamParticle1Barcode,
484 beamParticle2Barcode,
485 genEvt->m_weights.m_weights,
486 genEvt->m_random_states,
487 std::vector<double>(),
488 std::vector<float>(),
489 std::vector<double>(),
490 genEvt->m_momentum_unit,
491 genEvt->m_position_unit,
493 nPersVtx + genEvt->vertices_size(),
495 nPersParts + genEvt->particles_size() ) );
497 if (genEvt->m_cross_section) {
501 crossSection[2] = genEvt->m_cross_section->m_cross_section;
502 crossSection[1] = genEvt->m_cross_section->m_cross_section_error;
503 crossSection[0] =
static_cast<double>(genEvt->m_cross_section->m_is_set);
507 if (genEvt->m_heavy_ion) {
509 std::vector<float>& heavyIon = persEvt.
m_heavyIon;
511 heavyIon[12] =
static_cast<float>(genEvt->m_heavy_ion->m_Ncoll_hard);
512 heavyIon[11] =
static_cast<float>(genEvt->m_heavy_ion->m_Npart_proj);
513 heavyIon[10] =
static_cast<float>(genEvt->m_heavy_ion->m_Npart_targ);
514 heavyIon[9] =
static_cast<float>(genEvt->m_heavy_ion->m_Ncoll);
515 heavyIon[8] =
static_cast<float>(genEvt->m_heavy_ion->m_spectator_neutrons);
516 heavyIon[7] =
static_cast<float>(genEvt->m_heavy_ion->m_spectator_protons);
517 heavyIon[6] =
static_cast<float>(genEvt->m_heavy_ion->m_N_Nwounded_collisions);
518 heavyIon[5] =
static_cast<float>(genEvt->m_heavy_ion->m_Nwounded_N_collisions);
519 heavyIon[4] =
static_cast<float>(genEvt->m_heavy_ion->m_Nwounded_Nwounded_collisions);
520 heavyIon[3] = genEvt->m_heavy_ion->m_impact_parameter;
521 heavyIon[2] = genEvt->m_heavy_ion->m_event_plane_angle;
522 heavyIon[1] = genEvt->m_heavy_ion->m_eccentricity;
523 heavyIon[0] = genEvt->m_heavy_ion->m_sigma_inel_NN;
527 if (genEvt->m_pdf_info) {
529 std::vector<double>& pdfinfo = persEvt.
m_pdfinfo;
531 pdfinfo[8] =
static_cast<double>(genEvt->m_pdf_info->m_id1);
532 pdfinfo[7] =
static_cast<double>(genEvt->m_pdf_info->m_id2);
533 pdfinfo[6] =
static_cast<double>(genEvt->m_pdf_info->m_pdf_id1);
534 pdfinfo[5] =
static_cast<double>(genEvt->m_pdf_info->m_pdf_id2);
535 pdfinfo[4] = genEvt->m_pdf_info->m_x1;
536 pdfinfo[3] = genEvt->m_pdf_info->m_x2;
537 pdfinfo[2] = genEvt->m_pdf_info->m_scalePDF;
538 pdfinfo[1] = genEvt->m_pdf_info->m_pdf1;
539 pdfinfo[0] = genEvt->m_pdf_info->m_pdf2;
543 const HepMC::GenEvent::vertex_const_iterator endVtx=genEvt->vertices_end();
544 for ( HepMC::GenEvent::vertex_const_iterator
i = genEvt->vertices_begin();
572 vtx->set_position(HepMC::FourVector( persVtx.
m_x , persVtx.
m_y , persVtx.
m_z ,persVtx.
m_t ));
574 int persVtxStatus(persVtx.
m_id);
583 persVtxStatus = 1000;
588 vtx->add_attribute(
"weights",std::make_shared<HepMC3::VectorDoubleAttribute>(
weights));
592 for (
unsigned int i = 0;
i != nPartsIn; ++
i ) {
598 for (
unsigned int i = 0;
i != nPartsOut; ++
i ) {
602 vtx->m_position.setX( persVtx.
m_x );
603 vtx->m_position.setY( persVtx.
m_y );
604 vtx->m_position.setZ( persVtx.
m_z );
605 vtx->m_position.setT( persVtx.
m_t );
606 vtx->m_particles_in.clear();
607 vtx->m_particles_out.clear();
608 int persVtxStatus(persVtx.
m_id);
617 persVtxStatus = 1000;
620 vtx->m_weights.m_weights.reserve( persVtx.
m_weights.size() );
621 vtx->m_weights.m_weights.assign ( persVtx.
m_weights.begin(),
630 for (
int i = nPartsIn - 1;
i >= 0;
i-- ) {
638 for (
unsigned int i = 0;
i != nPartsOut; ++
i ) {
662 p->add_attribute(
"phi",std::make_shared<HepMC3::DoubleAttribute>(persPart.
m_phiPolarization));
663 p->add_attribute(
"theta",std::make_shared<HepMC3::DoubleAttribute>(persPart.
m_thetaPolarization));
673 double temp_e = std::sqrt( (
long double)(persPart.
m_px)*persPart.
m_px +
674 (
long double)(persPart.
m_py)*persPart.
m_py +
675 (
long double)(persPart.
m_pz)*persPart.
m_pz +
676 (
long double)(persPart.
m_m) *persPart.
m_m );
677 p->set_momentum( HepMC::FourVector(persPart.
m_px,persPart.
m_py,persPart.
m_pz,temp_e));
679 const int signM2 = ( persPart.
m_m >= 0. ? 1 : -1 );
680 const double persPart_ene =
681 std::sqrt( std::abs((
long double)(persPart.
m_px)*persPart.
m_px +
682 (
long double)(persPart.
m_py)*persPart.
m_py +
683 (
long double)(persPart.
m_pz)*persPart.
m_pz +
684 signM2* (
long double)(persPart.
m_m)* persPart.
m_m));
685 const int signEne = ( persPart.
m_recoMethod == 1 ? 1 : -1 );
686 p->set_momentum(HepMC::FourVector( persPart.
m_px,
689 signEne * persPart_ene ));
693 std::vector<int> flows;
694 const unsigned int nFlow = persPart.
m_flow.size();
695 for (
unsigned int iFlow= 0; iFlow != nFlow; ++iFlow ) {
696 flows.push_back(persPart.
m_flow[iFlow].second );
699 p->add_attribute(
"flows", std::make_shared<HepMC3::VectorIntAttribute>(flows));
705 p->m_production_vertex = 0;
717 p->m_momentum.setPx( persPart.
m_px);
718 p->m_momentum.setPy( persPart.
m_py);
719 p->m_momentum.setPz( persPart.
m_pz);
720 double temp_e = std::sqrt( (
long double)(persPart.
m_px)*persPart.
m_px +
721 (
long double)(persPart.
m_py)*persPart.
m_py +
722 (
long double)(persPart.
m_pz)*persPart.
m_pz +
723 (
long double)(persPart.
m_m) *persPart.
m_m );
724 p->m_momentum.setE( temp_e);
726 const int signM2 = ( persPart.
m_m >= 0. ? 1 : -1 );
727 const double persPart_ene =
728 std::sqrt( std::abs((
long double)(persPart.
m_px)*persPart.
m_px +
729 (
long double)(persPart.
m_py)*persPart.
m_py +
730 (
long double)(persPart.
m_pz)*persPart.
m_pz +
731 signM2* (
long double)(persPart.
m_m)* persPart.
m_m));
732 const int signEne = ( persPart.
m_recoMethod == 1 ? 1 : -1 );
733 p->m_momentum.set( persPart.
m_px,
736 signEne * persPart_ene );
740 const unsigned int nFlow = persPart.
m_flow.size();
742 for (
unsigned int iFlow= 0; iFlow != nFlow; ++iFlow ) {
743 p->m_flow.set_icode( persPart.
m_flow[iFlow].first,
744 persPart.
m_flow[iFlow].second );
759 const HepMC::FourVector& position = vtx->position();
760 auto A_weights=vtx->attribute<HepMC3::VectorDoubleAttribute>(
"weights");
761 auto A_barcode=vtx->attribute<HepMC3::IntAttribute>(
"barcode");
764 auto weights_d = A_weights->value();
765 for (
auto&
w: weights_d)
weights.push_back(
w);
774 A_barcode?(A_barcode->value()):vtx->id() );
779 for (
const auto&
p: vtx->particles_in()) {
780 if ( !
p->production_vertex() ||
p->production_vertex()->id() == 0 ) {
786 for (
const auto&
p: vtx->particles_out()) {
795 const HepMC::FourVector& position = vtx.m_position;
802 vtx.m_weights.m_weights.begin(),
803 vtx.m_weights.m_weights.end(),
808 const std::vector<HepMC::GenParticlePtr>::const_iterator endInVtx = vtx.m_particles_in.end();
810 for ( std::vector<HepMC::GenParticlePtr>::const_iterator
p = vtx.m_particles_in.begin();
813 if ( 0 == (*p)->production_vertex() ) {
818 const std::vector<HepMC::GenParticlePtr>::const_iterator endOutVtx = vtx.m_particles_out.end();
820 for ( std::vector<HepMC::GenParticlePtr>::const_iterator
p = vtx.m_particles_out.begin();
834 const HepMC::FourVector
mom =
p->momentum();
835 const double ene =
mom.e();
836 const double m2 =
mom.m2();
839 const bool useP2M2 = !(
m2 > 0) &&
841 !(std::abs(
m2) < 2.0*DBL_EPSILON*ene*ene);
842 auto A_flows=
p->attribute<HepMC3::VectorIntAttribute>(
"flows");
843 auto A_phi=
p->attribute<HepMC3::DoubleAttribute>(
"phi");
844 auto A_theta=
p->attribute<HepMC3::DoubleAttribute>(
"theta");
846 const short recoMethod = ( !useP2M2 ? 0: ( ene >= 0.? 1: 2 ) );
848 emplace_back(
mom.px(),
854 A_flows?(A_flows->value().size()):0,
855 A_theta?(A_theta->value()):0.0,
856 A_phi?(A_phi->value()):0.0,
863 std::vector< std::pair<int,int> > flow_hepmc2;
864 if(A_flows) flow_hepmc2=vector_to_vector_int_int(A_flows->value());
865 persEvt.
m_genParticles.back().m_flow.assign( flow_hepmc2.begin(),flow_hepmc2.end() );
876 const HepMC::FourVector&
mom =
p.m_momentum;
877 const double ene =
mom.e();
878 const double m2 =
mom.m2();
881 const bool useP2M2 = !(
m2 > 0) &&
883 !(std::abs(
m2) < 2.0*DBL_EPSILON*ene*ene);
885 const short recoMethod = ( !useP2M2
900 p.m_polarization.theta(),
901 p.m_polarization.phi(),
902 p.m_production_vertex
903 ?
p.m_production_vertex->barcode()
906 ?
p.m_end_vertex->barcode()