11 #include "GaudiKernel/IPartPropSvc.h"
12 #include "GaudiKernel/PhysicalConstants.h"
28 #include "G4PrimaryParticle.hh"
30 #include "G4Geantino.hh"
31 #include "G4ChargedGeantino.hh"
32 #include "G4ParticleTable.hh"
33 #include "G4LorentzVector.hh"
34 #include "G4TransportationManager.hh"
40 #include "CLHEP/Geometry/Point3D.h"
41 #include "CLHEP/Geometry/Vector3D.h"
42 #include "CLHEP/Units/SystemOfUnits.h"
44 #include "HepPDT/ParticleID.hh"
45 #include "HepPDT/DecayData.hh"
46 #include "HepPDT/ParticleDataTable.hh"
52 , m_particlePropSvc(
"PartPropSvc",
name)
53 , m_particleDataTable(nullptr)
54 , m_useGeneratedParticleMass(false)
55 , m_genParticleFilters(this)
56 , m_quasiStableParticlesIncluded(false)
59 declareProperty(
"UseGeneratedParticleMass",
61 "Use particle mass assigned to GenParticle.");
63 declareProperty(
"GenParticleFilters",
65 "Tools for filtering out GenParticles.");
67 declareProperty(
"ParticlePropertyService",
69 "ParticlePropertyService to retrieve the PDT.");
87 if (!m_useGeneratedParticleMass) {
89 m_particleDataTable = m_particlePropSvc->PDT();
90 if (!m_particleDataTable) {
91 ATH_MSG_FATAL(
"Could not get ParticleDataTable from " << m_particlePropSvc <<
". Abort" );
92 return StatusCode::FAILURE;
96 if (!m_genParticleFilters.empty()) {
97 ATH_CHECK(m_genParticleFilters.retrieve());
101 return StatusCode::SUCCESS;
110 return StatusCode::SUCCESS;
120 for (
auto eventPtr : inputGenEvents ) {
122 if (eventPtr ==
nullptr) {
continue; }
126 " and event_number=" << eventPtr->event_number() );
129 bool legacyOrdering =
true;
136 for (
auto& genPartPtr : passedGenParticles ) {
137 ATH_MSG_VERBOSE(
"Picking up following GenParticle for conversion to ISFParticle: " << genPartPtr);
138 auto simParticlePtr = convertParticle(genPartPtr);
139 if (!simParticlePtr) {
140 ATH_MSG_ERROR(
"Error while trying to convert input generator particles. Aborting.");
141 return StatusCode::FAILURE;
144 simParticles.push_back(simParticlePtr);
150 ATH_MSG_DEBUG(
"Created initial simulation particle collection with size " << simParticles.size() );
152 return StatusCode::SUCCESS;
162 std::make_move_iterator(
std::begin(simParticleList)),
163 std::make_move_iterator(
std::end(simParticleList))
165 if (!shadowGenEvents.
empty()) {
166 outputG4Event = this->ISF_to_G4Event(ctx, simParticleVector, inputGenEvents.
back(), shadowGenEvents.
back());
169 outputG4Event = this->ISF_to_G4Event(ctx, simParticleVector, inputGenEvents.
back(),
nullptr);
171 return StatusCode::SUCCESS;
176 G4Event*& outputG4Event)
const
182 std::make_move_iterator(
std::begin(simParticleList)),
183 std::make_move_iterator(
std::end(simParticleList))
185 outputG4Event = this->ISF_to_G4Event(ctx, simParticleVector, inputGenEvents.
back(),
nullptr);
186 return StatusCode::SUCCESS;
192 std::vector<HepMC::GenParticlePtr>
194 auto allGenPartBegin = evnt.particles().begin();
195 auto allGenPartEnd = evnt.particles().end();
198 std::vector<HepMC::GenParticlePtr> passedGenParticles{};
202 if (m_useShadowEvent) {
203 if (legacyOrdering) {
206 for (
auto vtx: evnt.vertices() ) {
208 vtx->particles_out().end(),
209 std::back_inserter(passedGenParticles),
216 std::back_inserter(passedGenParticles),
221 if (legacyOrdering) {
224 for (
auto vtx: evnt.vertices() ) {
226 vtx->particles_out().end(),
227 std::back_inserter(passedGenParticles),
228 [
this](
HepMC::GenParticlePtr p){return this->passesFilters(std::const_pointer_cast<const HepMC3::GenParticle>(p));});
234 std::back_inserter(passedGenParticles),
235 [
this](
HepMC::GenParticlePtr p){
return this->passesFilters(std::const_pointer_cast<const HepMC3::GenParticle>(
p));});
239 passedGenParticles.shrink_to_fit();
241 return passedGenParticles;
244 std::vector<HepMC::GenParticlePtr>
246 auto allGenPartBegin = evnt.particles_begin();
247 auto allGenPartEnd = evnt.particles_end();
250 std::vector<HepMC::GenParticlePtr> passedGenParticles{};
254 if (legacyOrdering) {
257 auto vtxIt = evnt.vertices_begin();
258 auto vtxItEnd = evnt.vertices_end();
259 for ( ; vtxIt != vtxItEnd; ++vtxIt ) {
260 const auto vtxPtr = *vtxIt;
263 std::back_inserter(passedGenParticles),
270 std::back_inserter(passedGenParticles),
274 passedGenParticles.shrink_to_fit();
276 return passedGenParticles;
284 if (!genPartPtr) {
return nullptr; }
286 auto pVertex = genPartPtr->production_vertex();
288 ATH_MSG_ERROR(
"Unable to convert following generator particle due to missing production vertex for: " << genPartPtr);
291 auto parentEvent = genPartPtr->parent_event();
293 ATH_MSG_ERROR(
"Cannot convert a GenParticle without a parent GenEvent into an ISFParticle!!!");
297 const Amg::Vector3D pos(pVertex->position().x(), pVertex->position().y(), pVertex->position().z());
298 const auto& pMomentum(genPartPtr->momentum());
301 const double pMass = this->getParticleMass(genPartPtr);
303 const double pMass = this->getParticleMass(*genPartPtr);
305 double e=pMomentum.e();
307 double px=pMomentum.px();
308 double py=pMomentum.py();
309 double pz=pMomentum.pz();
311 if (std::abs(
e-teste)>0.01*
e) {
312 ATH_MSG_WARNING(
"Difference in energy for: " << genPartPtr<<
" Morg="<<pMomentum.m()<<
" Mmod="<<
pMass<<
" Eorg="<<
e<<
" Emod="<<teste);
314 if (
MC::isDecayed(genPartPtr) && pVertex && genPartPtr->end_vertex()) {
315 const auto& prodVtx = genPartPtr->production_vertex()->position();
316 const auto& endVtx = genPartPtr->end_vertex()->position();
317 CLHEP::Hep3Vector dist3D(endVtx.x()-prodVtx.x(), endVtx.y()-prodVtx.y(), endVtx.z()-prodVtx.z());
320 CLHEP::HepLorentzVector
mom( pMomentum.x(), pMomentum.y(), pMomentum.z(), pMomentum.t() );
321 double gamma_org=
mom.gamma();
323 double gamma_new=
mom.gamma();
325 if (std::abs(gamma_new-gamma_org)/(gamma_new+gamma_org)>0.001) {
326 ATH_MSG_WARNING(
"Difference in boost gamma for Quasi stable particle "<<genPartPtr);
336 const int pPdgId = genPartPtr->pdg_id();
343 auto tBinding = std::make_unique<ISF::TruthBinding>(genPartPtr);
347 auto sParticle = std::make_unique<ISF::ISFParticle>( std::move(
pos),
352 genPartPtr->status(),
359 return sParticle.release();
368 double mass =
part->generated_mass();
372 if ( !m_useGeneratedParticleMass ) {
373 const int absPDG = std::abs(
part->pdg_id());
374 HepPDT::ParticleData
const *pData = (m_particleDataTable)
375 ? m_particleDataTable->particle(absPDG)
378 mass = pData->mass();
382 ATH_MSG_WARNING(
"Unable to find mass of particle with PDG ID '" << absPDG <<
"' in ParticleDataTable. Will set mass to generated_mass: " <<
mass);
392 double mass =
part.generated_mass();
396 if ( !m_useGeneratedParticleMass ) {
397 const int absPDG = std::abs(
part.pdg_id());
398 HepPDT::ParticleData
const *pData = (m_particleDataTable)
399 ? m_particleDataTable->particle(absPDG)
402 mass = pData->mass();
406 ATH_MSG_WARNING(
"Unable to find mass of particle with PDG ID '" << absPDG <<
"' in ParticleDataTable. Will set mass to generated_mass: " <<
mass);
420 for (
const auto&
filter : m_genParticleFilters ) {
425 :
"false, will remove particle."));
445 for (
const auto&
filter : m_genParticleFilters ) {
450 :
"false, will remove particle."));
471 G4Event *g4evt =
new G4Event(ctx.eventID().event_number());
474 const G4VSolid *worldSolid = G4TransportationManager::GetTransportationManager()->GetNavigatorForTracking()->GetWorldVolume()->GetLogicalVolume()->GetSolid();
478 if ( !isInsideG4WorldVolume(isp, worldSolid) ) {
479 ATH_MSG_WARNING(
"Unable to convert ISFParticle to G4PrimaryParticle!");
483 worldSolid->DumpInfo();
491 this->addG4PrimaryVertex(g4evt,isp,useHepMC,shadowGenEvent);
498 g4evt->SetUserInformation(atlasG4EvtUserInfo);
508 return G4ChargedGeantino::Definition();
511 return G4Geantino::GeantinoDefinition();
514 G4ParticleTable *ptable = G4ParticleTable::GetParticleTable();
516 return ptable->FindParticle(pdgcode);
518 ATH_MSG_ERROR(
"getG4ParticleDefinition - Failed to retrieve G4ParticleTable!");
528 const double p2=
std::pow(g4particle.GetTotalMomentum(),2);
529 const double m2=
std::pow(g4particle.GetMass(),2);
530 const double l2=
std::pow(GeneratorDecayLength,2);
532 const double tau=std::sqrt(tau2);
533 g4particle.SetProperTime( tau );
542 const G4ParticleDefinition *particleDefinition = this->getG4ParticleDefinition(
genpart->pdg_id());
544 if (particleDefinition==
nullptr) {
545 ATH_MSG_ERROR(
"ISF_to_G4Event particle conversion failed. ISF_Particle PDG code = " <<
genpart->pdg_id() <<
546 "\n This usually indicates a problem with the evgen step.\n" <<
547 "Please report this to the Generators group, mentioning the release and generator used for evgen and the PDG code above." );
553 auto &genpartMomentum =
genpart->momentum();
554 G4double
px = genpartMomentum.x();
555 G4double
py = genpartMomentum.y();
556 G4double
pz = genpartMomentum.z();
558 std::unique_ptr<G4PrimaryParticle> g4particle = std::make_unique<G4PrimaryParticle>(particleDefinition,
px,
py,
pz);
564 const auto& prodVtx =
genpart->production_vertex()->position();
565 const auto& endVtx =
genpart->end_vertex()->position();
571 CLHEP::Hep3Vector dist3D(endVtx.x()-prodVtx.x(), endVtx.y()-prodVtx.y(), endVtx.z()-prodVtx.z());
575 double pmag2=g4particle->GetTotalMomentum();
577 double e2=g4particle->GetTotalEnergy();
579 double beta2=pmag2/
e2;
583 if (m_quasiStableParticlesIncluded) {
596 for (
auto daughter:
genpart->end_vertex()->particles_out() ) {
597 if (m_quasiStableParticlesIncluded) {
598 ATH_MSG_VERBOSE (
"Attempting to add daughter particle : " << daughter );
601 ATH_MSG_WARNING (
"Attempting to add daughter particle: " << daughter );
603 G4PrimaryParticle *daughterG4Particle = this->getDaughterG4PrimaryParticle( daughter, makeLinkToTruth );
604 if (!daughterG4Particle) {
605 ATH_MSG_ERROR(
"Bailing out of loop over daughters of particle: "<<
606 " due to errors - will not return G4Particle.");
609 g4particle->SetDaughter( daughterG4Particle );
613 if (makeLinkToTruth) {
615 std::unique_ptr<PrimaryParticleInformation> primaryPartInfo = std::make_unique<PrimaryParticleInformation>(
genpart);
618 g4particle->SetUserInformation(primaryPartInfo.release());
621 return g4particle.release();
628 const G4ParticleDefinition *particleDefinition = this->getG4ParticleDefinition(
genpart->pdg_id());
630 if (particleDefinition==
nullptr) {
631 ATH_MSG_ERROR(
"ISF_to_G4Event particle conversion failed. ISF_Particle PDG code = " <<
genpart->pdg_id() <<
632 "\n This usually indicates a problem with the evgen step.\n" <<
633 "Please report this to the Generators group, mentioning the release and generator used for evgen and the PDG code above." );
639 auto &genpartMomentum =
genpart->momentum();
640 G4double
px = genpartMomentum.x();
641 G4double
py = genpartMomentum.y();
642 G4double
pz = genpartMomentum.z();
644 std::unique_ptr<G4PrimaryParticle> g4particle = std::make_unique<G4PrimaryParticle>(particleDefinition,
px,
py,
pz);
650 const auto& prodVtx =
genpart->production_vertex()->position();
651 const auto& endVtx =
genpart->end_vertex()->position();
657 CLHEP::Hep3Vector dist3D(endVtx.x()-prodVtx.x(), endVtx.y()-prodVtx.y(), endVtx.z()-prodVtx.z());
661 double pmag2=g4particle->GetTotalMomentum();
663 double e2=g4particle->GetTotalEnergy();
665 double beta2=pmag2/
e2;
669 if (m_quasiStableParticlesIncluded) {
682 for (
auto daughter:
genpart->end_vertex()->particles_out() ) {
683 if (m_quasiStableParticlesIncluded) {
684 ATH_MSG_VERBOSE (
"Attempting to add daughter particle: " << daughter );
687 ATH_MSG_WARNING (
"Attempting to add daughter particle: " << daughter );
689 G4PrimaryParticle *daughterG4Particle = this->getDaughterG4PrimaryParticle( daughter );
690 if (!daughterG4Particle) {
691 ATH_MSG_ERROR(
"Bailing out of loop over daughters of particle due to errors - will not return G4Particle.");
694 g4particle->SetDaughter( daughterG4Particle );
698 return g4particle.release();
705 const G4ParticleDefinition *particleDefinition = this->getG4ParticleDefinition(
genpart.pdg_id());
707 if (particleDefinition==
nullptr) {
708 ATH_MSG_ERROR(
"ISF_to_G4Event particle conversion failed. ISF_Particle PDG code = " <<
genpart.pdg_id() <<
709 "\n This usually indicates a problem with the evgen step.\n" <<
710 "Please report this to the Generators group, mentioning the release and generator used for evgen and the PDG code above." );
716 auto &genpartMomentum =
genpart.momentum();
717 G4double
px = genpartMomentum.x();
718 G4double
py = genpartMomentum.y();
719 G4double
pz = genpartMomentum.z();
721 std::unique_ptr<G4PrimaryParticle> g4particle = std::make_unique<G4PrimaryParticle>(particleDefinition,
px,
py,
pz);
727 const auto& prodVtx =
genpart.production_vertex()->position();
728 const auto& endVtx =
genpart.end_vertex()->position();
734 CLHEP::Hep3Vector dist3D(endVtx.x()-prodVtx.x(), endVtx.y()-prodVtx.y(), endVtx.z()-prodVtx.z());
738 double pmag2=g4particle->GetTotalMomentum();
740 double e2=g4particle->GetTotalEnergy();
742 double beta2=pmag2/
e2;
746 if (m_quasiStableParticlesIncluded) {
759 for (
auto daughterIter=
genpart.end_vertex()->particles_out_const_begin();
760 daughterIter!=
genpart.end_vertex()->particles_out_const_end(); ++daughterIter ) {
761 if (m_quasiStableParticlesIncluded) {
762 ATH_MSG_VERBOSE (
"Attempting to add daughter particle: " << **daughterIter );
765 ATH_MSG_WARNING (
"Attempting to add daughter particle: " << **daughterIter );
767 G4PrimaryParticle *daughterG4Particle = this->getDaughterG4PrimaryParticle( **daughterIter, makeLinkToTruth );
768 if (!daughterG4Particle) {
769 ATH_MSG_ERROR(
"Bailing out of loop over daughters of particle due to errors - will not return G4Particle.");
772 g4particle->SetDaughter( daughterG4Particle );
776 if (makeLinkToTruth) {
778 std::unique_ptr<PrimaryParticleInformation> primaryPartInfo = std::make_unique<PrimaryParticleInformation>(&
genpart);
780 g4particle->SetUserInformation(primaryPartInfo.release());
784 return g4particle.release();
793 && (
p1->status() ==
p2->status())
794 && (
p1->pdg_id() ==
p2->pdg_id())
795 && ((
p1->momentum().px()) == (
p2->momentum().px()))
796 && ((
p1->momentum().py()) == (
p2->momentum().py()))
797 && ((
p1->momentum().pz()) == (
p2->momentum().pz()))
804 if (!shadowGenEvent) {
805 ATH_MSG_FATAL (
"Found status==2 GenParticle with no end vertex and shadow GenEvent is missing - something is wrong here!");
810 const int shadowId = genParticle->attribute<HepMC3::IntAttribute>(
"ShadowParticleId")->
value();
811 for (
auto& shadowParticle : shadowGenEvent->particles()) {
812 if (shadowParticle->id() == shadowId && matchedGenParticles(genParticle, shadowParticle) ) {
return shadowParticle; }
814 return std::make_shared<HepMC::GenParticle>();
816 for (HepMC::GenEvent::particle_iterator pitr=shadowGenEvent->particles_begin(); pitr != shadowGenEvent->particles_end(); ++pitr) {
818 if (matchedGenParticles(genParticle, shadowParticle) ) {
return shadowParticle; }
832 const auto& prodVtx =
genpart->production_vertex()->position();
833 const auto& endVtx =
genpart->end_vertex()->position();
835 CLHEP::Hep3Vector dist3D(endVtx.x()-prodVtx.x(), endVtx.y()-prodVtx.y(), endVtx.z()-prodVtx.z());
839 double pmag2=g4particle->GetTotalMomentum();
841 double e2=g4particle->GetTotalEnergy();
843 double beta2=pmag2/
e2;
844 double mass2=g4particle->GetMass();
849 const G4LorentzVector lv0( prodVtx.x(), prodVtx.y(), prodVtx.z(), prodVtx.t() );
850 const G4LorentzVector lv1( endVtx.x(), endVtx.y(), endVtx.z(), endVtx.t() );
853 G4LorentzVector dist4D(lv1);
856 double dist4Dgamma=std::numeric_limits<double>::infinity();
857 if (dist4D.t()>0 && dist4D.mag2()>0) {
858 dist4Dgamma=dist4D.gamma();
863 G4LorentzVector fourmom(g4particle->GetMomentum(),g4particle->GetTotalEnergy());
864 double fourmomgamma=std::numeric_limits<double>::infinity();
865 if (fourmom.t()>0 && fourmom.mag2()>0) {
866 fourmomgamma=fourmom.gamma();
871 ATH_MSG_VERBOSE(
"gammaVertex="<<dist4Dgamma<<
" gammamom="<<fourmomgamma<<
" gamma(beta)="<<1/std::sqrt(1-beta2)<<
" lifetime tau(beta)="<<std::sqrt(tau2)<<
" lifetime tau="<<tau);
873 if (m_quasiStableParticlesIncluded) {
881 ATH_MSG_WARNING(
"Detected primary particle with end vertex. This should only be the case if" );
882 ATH_MSG_WARNING(
"you are running with quasi-stable particle simulation enabled. This is not" );
883 ATH_MSG_WARNING(
"yet validated - you'd better know what you're doing. Will add the primary" );
890 for (
auto daughter: *(
genpart->end_vertex())) {
891 if (m_quasiStableParticlesIncluded) {
895 ATH_MSG_WARNING (
"Attempting to add daughter particle: " << daughter );
897 G4PrimaryParticle *daughterG4Particle = this->getDaughterG4PrimaryParticle( daughter );
898 if (!daughterG4Particle) {
899 ATH_MSG_FATAL(
"Bailing out of loop over daughters due to errors.");
901 g4particle->SetDaughter( daughterG4Particle );
912 const auto& prodVtx =
genpart->production_vertex()->position();
913 const auto& endVtx =
genpart->end_vertex()->position();
915 CLHEP::Hep3Vector dist3D(endVtx.x()-prodVtx.x(), endVtx.y()-prodVtx.y(), endVtx.z()-prodVtx.z());
919 double pmag2=g4particle->GetTotalMomentum();
921 double e2=g4particle->GetTotalEnergy();
923 double beta2=pmag2/
e2;
924 double mass2=g4particle->GetMass();
929 const G4LorentzVector lv0( prodVtx.x(), prodVtx.y(), prodVtx.z(), prodVtx.t() );
930 const G4LorentzVector lv1( endVtx.x(), endVtx.y(), endVtx.z(), endVtx.t() );
933 G4LorentzVector dist4D(lv1);
936 double dist4Dgamma=std::numeric_limits<double>::infinity();
937 if (dist4D.t()>0 && dist4D.mag2()>0) {
938 dist4Dgamma=dist4D.gamma();
943 G4LorentzVector fourmom(g4particle->GetMomentum(),g4particle->GetTotalEnergy());
944 double fourmomgamma=std::numeric_limits<double>::infinity();
945 if (fourmom.t()>0 && fourmom.mag2()>0) {
946 fourmomgamma=fourmom.gamma();
951 ATH_MSG_VERBOSE(
"gammaVertex="<<dist4Dgamma<<
" gammamom="<<fourmomgamma<<
" gamma(beta)="<<1/std::sqrt(1-beta2)<<
" lifetime tau(beta)="<<std::sqrt(tau2)<<
" lifetime tau="<<tau);
953 if (m_quasiStableParticlesIncluded) {
961 ATH_MSG_WARNING(
"Detected primary particle with end vertex. This should only be the case if" );
962 ATH_MSG_WARNING(
"you are running with quasi-stable particle simulation enabled. This is not" );
963 ATH_MSG_WARNING(
"yet validated - you'd better know what you're doing. Will add the primary" );
970 for (
auto daughter: *(
genpart->end_vertex())) {
971 if (m_quasiStableParticlesIncluded) {
972 ATH_MSG_VERBOSE (
"Attempting to add daughter particle: " << daughter );
975 ATH_MSG_WARNING (
"Attempting to add daughter particle: " << daughter );
978 G4PrimaryParticle *daughterG4Particle = this->getDaughterG4PrimaryParticle( daughter, makeLinkToTruth );
980 G4PrimaryParticle *daughterG4Particle = this->getDaughterG4PrimaryParticle( *daughter, makeLinkToTruth );
982 if (!daughterG4Particle) {
983 ATH_MSG_FATAL(
"Bailing out of loop over daughters due to errors.");
985 g4particle->SetDaughter( daughterG4Particle );
996 description << G4String(
"getG4PrimaryParticle: ") +
"No ISF::TruthBinding associated with ISParticle (" << isp <<
")";
997 G4Exception(
"iGeant4::TransportTool",
"NoISFTruthBinding", FatalException,
description);
1003 const G4ParticleDefinition *particleDefinition = this->getG4ParticleDefinition(isp.
pdgCode());
1005 if (particleDefinition==
nullptr) {
1006 ATH_MSG_ERROR(
"ISF_to_G4Event particle conversion failed. ISF_Particle PDG code = " << isp.
pdgCode() <<
1007 "\n This usually indicates a problem with the evgen step.\n" <<
1008 "Please report this to the Generators group, mentioning the release and generator used for evgen and the PDG code above." );
1017 if (useHepMC && currentGenPart) {
1018 auto ¤tGenPartMomentum = currentGenPart->momentum();
1019 px = currentGenPartMomentum.x();
1020 py = currentGenPartMomentum.y();
1021 pz = currentGenPartMomentum.z();
1024 auto &ispMomentum = isp.
momentum();
1025 px = ispMomentum.x();
1026 py = ispMomentum.y();
1027 pz = ispMomentum.z();
1030 std::unique_ptr<G4PrimaryParticle> g4particle = std::make_unique<G4PrimaryParticle>(particleDefinition,
px,
py,
pz);
1032 std::unique_ptr<PrimaryParticleInformation> primaryPartInfo = std::make_unique<PrimaryParticleInformation>(primaryGenpart,&isp);
1043 if ( currentGenPart ) {
1044 if (currentGenPart->end_vertex()) {
1047 ATH_MSG_ERROR (
"getG4PrimaryParticle(): GenParticle has a valid end GenVertexPtr!" );
1048 ATH_MSG_ERROR (
"getG4PrimaryParticle(): currentGenPart: " << currentGenPart <<
", barcode: " <<
HepMC::barcode(currentGenPart) );
1049 ATH_MSG_ERROR (
"getG4PrimaryParticle(): currentGenPart->end_vertex(): " << currentGenPart->end_vertex() <<
", barcode: " <<
HepMC::barcode(currentGenPart->end_vertex()) );
1050 ATH_MSG_FATAL (
"getG4PrimaryParticle(): Passing GenParticles with a valid end GenVertexPtr as input is no longer supported." );
1054 && !currentGenPart->end_vertex()) {
1058 auto A_part = currentGenPart->attribute<HepMC::ShadowParticle>(
"ShadowParticle");
1064 ATH_MSG_FATAL (
"Found a GenParticle with no matching GenParticle in the shadowGenEvent - something is wrong here!");
1067 if (!shadowPart->end_vertex()) {
1068 ATH_MSG_FATAL (
"Found status==2 shadow GenParticle with no end vertex - something is wrong here!");
1072 processPredefinedDecays(shadowPart, isp, g4particle.get());
1074 processPredefinedDecays(shadowPart, isp, g4particle.get(),
false);
1079 const double pmass = g4particle->GetMass();
1080 CLHEP::Hep3Vector gpv = g4particle->GetMomentum();
1081 double g4px=g4particle->GetMomentum().x();
1082 double g4py=g4particle->GetMomentum().y();
1083 double g4pz=g4particle->GetMomentum().z();
1091 px=currentGenPart->momentum().px();
1092 py=currentGenPart->momentum().py();
1093 pz=currentGenPart->momentum().pz();
1110 const double pe = std::sqrt(
mag2 + pmass*pmass);
1112 double originalEnergy=currentGenPart->momentum().e();
1113 if (originalEnergy>0.01) {
1114 if ((originalEnergy-
pe)/originalEnergy>0.01) {
1115 double genpx=currentGenPart->momentum().px();
1116 double genpy=currentGenPart->momentum().py();
1117 double genpz=currentGenPart->momentum().pz();
1118 double genp=sqrt(genpx*genpx + genpy*genpy + genpz*genpz);
1119 ATH_MSG_WARNING(
"Truth change in energy for: " << currentGenPart<<
" Morg="<<currentGenPart->momentum().m()<<
" Mmod="<<pmass<<
" Eorg="<<originalEnergy<<
" Emod="<<
pe<<
" porg="<<genp<<
" pmod="<<gpv.mag());
1124 auto& currentGenPart_nc = currentGenPart;
1126 auto* currentGenPart_nc = currentGenPart;
1128 currentGenPart_nc->set_momentum(HepMC::FourVector(
px,
py,
pz,
pe));
1136 g4particle->SetUserInformation(primaryPartInfo.release());
1138 return g4particle.release();
1154 G4PrimaryParticle *g4particle = this->getG4PrimaryParticle( isp, useHepMC, shadowGenEvent );
1156 ATH_MSG_ERROR(
"Failed to create G4PrimaryParticle for ISParticle (" << isp <<
")");
1161 G4PrimaryVertex *g4vertex =
new G4PrimaryVertex(isp.
position().x(),
1165 g4vertex->SetPrimary( g4particle );
1168 g4evt->AddPrimaryVertex( g4vertex );
1177 const G4ThreeVector g4Pos(
pos.x(),
pos.y(),
pos.z() );
1178 EInside insideStatus = worldSolid->Inside( g4Pos );
1180 bool insideWorld = insideStatus != kOutside;