 |
ATLAS Offline Software
|
#include <InputConverter.h>
|
const G4ParticleDefinition * | getG4ParticleDefinition (int pdgcode) const |
|
G4PrimaryParticle * | getDaughterG4PrimaryParticle (HepMC::GenParticle &gp, bool makeLinkToTruth=true) const |
|
G4PrimaryParticle * | getG4PrimaryParticle (ISF::ISFParticle &isp, bool useHepMC, HepMC::GenEvent *shadowGenEvent) const |
|
void | addG4PrimaryVertex (G4Event &g4evt, ISF::ISFParticle &isp, bool useHepMC, HepMC::GenEvent *shadowGenEvent) const |
|
void | processPredefinedDecays (const HepMC::GenParticlePtr &genpart, ISF::ISFParticle &isp, G4PrimaryParticle *g4particle, bool makeLinkToTruth=true) const |
|
bool | matchedGenParticles (const HepMC::ConstGenParticlePtr &p1, const HepMC::ConstGenParticlePtr &p2) const |
|
HepMC::GenParticlePtr | findShadowParticle (const HepMC::ConstGenParticlePtr &genParticle, HepMC::GenEvent *shadowGenEvent) const |
|
bool | isInsideG4WorldVolume (const ISF::ISFParticle &isp, const G4VSolid *worldSolid) const |
| Tests whether the given ISFParticle is within the Geant4 world volume. More...
|
|
double | getParticleMass (const HepMC::GenParticle &p) const |
| get right GenParticle mass More...
|
|
std::vector< HepMC::GenParticlePtr > | getSelectedParticles (HepMC::GenEvent &evnt, bool legacyOrdering=false) const |
| get all generator particles which pass filters More...
|
|
bool | passesFilters (const HepMC::GenParticle &p) const |
| check if the given particle passes all filters More...
|
|
ISF::ISFParticle * | convertParticle (const HepMC::GenParticlePtr &genPartPtr) const |
| convert GenParticle to ISFParticle More...
|
|
Convert simulation input collections to ISFParticles for subsequent ISF simulation.
- Author
- Elmar.Ritsch -at- cern.ch
Definition at line 48 of file InputConverter.h.
◆ InputConverter()
ISF::InputConverter::InputConverter |
( |
const std::string & |
name, |
|
|
ISvcLocator * |
svc |
|
) |
| |
Constructor.
Definition at line 51 of file InputConverter.cxx.
60 declareProperty(
"UseGeneratedParticleMass",
62 "Use particle mass assigned to GenParticle.");
64 declareProperty(
"GenParticleFilters",
66 "Tools for filtering out GenParticles.");
68 declareProperty(
"ParticlePropertyService",
70 "ParticlePropertyService to retrieve the PDT.");
◆ ~InputConverter()
ISF::InputConverter::~InputConverter |
( |
| ) |
|
|
virtual |
◆ addG4PrimaryVertex()
void ISF::InputConverter::addG4PrimaryVertex |
( |
G4Event & |
g4evt, |
|
|
ISF::ISFParticle & |
isp, |
|
|
bool |
useHepMC, |
|
|
HepMC::GenEvent * |
shadowGenEvent |
|
) |
| const |
|
private |
Definition at line 1145 of file InputConverter.cxx.
1160 ATH_MSG_ERROR(
"Failed to create G4PrimaryParticle for ISParticle (" << isp <<
")");
1165 G4PrimaryVertex *g4vertex =
new G4PrimaryVertex(isp.
position().x(),
1169 g4vertex->SetPrimary( g4particle );
1172 g4evt.AddPrimaryVertex(g4vertex);
◆ convert()
Convert selected particles from the given McEventCollection into ISFParticles and push them into the given ISFParticleContainer.
Definition at line 118 of file InputConverter.cxx.
121 for (
auto eventPtr : inputGenEvents ) {
123 if (eventPtr ==
nullptr) {
continue; }
127 " and event_number=" << eventPtr->event_number() );
130 bool legacyOrdering =
true;
137 for (
auto& genPartPtr : passedGenParticles ) {
138 ATH_MSG_VERBOSE(
"Picking up following GenParticle for conversion to ISFParticle: " << genPartPtr);
140 if (!simParticlePtr) {
141 ATH_MSG_ERROR(
"Error while trying to convert input generator particles. Aborting.");
142 return StatusCode::FAILURE;
145 simParticles.push_back(simParticlePtr);
151 ATH_MSG_DEBUG(
"Created initial simulation particle collection with size " << simParticles.size() );
153 return StatusCode::SUCCESS;
◆ convertHepMCToG4Event()
Definition at line 156 of file InputConverter.cxx.
163 std::make_move_iterator(
std::begin(simParticleList)),
164 std::make_move_iterator(
std::end(simParticleList))
166 HepMC::GenEvent* shadowGenEvent =
167 !shadowGenEvents.
empty()
168 ?
static_cast<HepMC::GenEvent*
>(shadowGenEvents.
back())
172 return StatusCode::SUCCESS;
◆ convertHepMCToG4EventLegacy()
StatusCode ISF::InputConverter::convertHepMCToG4EventLegacy |
( |
McEventCollection & |
inputGenEvents, |
|
|
G4Event & |
outputG4Event |
|
) |
| const |
|
finaloverridevirtual |
Definition at line 175 of file InputConverter.cxx.
181 std::make_move_iterator(
std::begin(simParticleList)),
182 std::make_move_iterator(
std::end(simParticleList))
186 return StatusCode::SUCCESS;
◆ convertParticle()
convert GenParticle to ISFParticle
get all generator particles which pass filters
particle origin (TODO: add proper GeoID, collision/cosmics)
Definition at line 282 of file InputConverter.cxx.
283 if (!genPartPtr) {
return nullptr; }
285 auto pVertex = genPartPtr->production_vertex();
287 ATH_MSG_ERROR(
"Unable to convert following generator particle due to missing production vertex for: " << genPartPtr);
290 auto parentEvent = genPartPtr->parent_event();
292 ATH_MSG_ERROR(
"Cannot convert a GenParticle without a parent GenEvent into an ISFParticle!!!");
296 const Amg::Vector3D pos(pVertex->position().x(), pVertex->position().y(), pVertex->position().z());
297 const auto& pMomentum(genPartPtr->momentum());
304 double e=pMomentum.e();
306 double px=pMomentum.px();
307 double py=pMomentum.py();
308 double pz=pMomentum.pz();
310 if (std::abs(
e-teste)>0.01*
e) {
311 ATH_MSG_WARNING(
"Difference in energy for: " << genPartPtr<<
" Morg="<<pMomentum.m()<<
" Mmod="<<
pMass<<
" Eorg="<<
e<<
" Emod="<<teste);
313 if (
MC::isDecayed(genPartPtr) && pVertex && genPartPtr->end_vertex()) {
314 const auto& prodVtx = genPartPtr->production_vertex()->position();
315 const auto& endVtx = genPartPtr->end_vertex()->position();
316 CLHEP::Hep3Vector dist3D(endVtx.x()-prodVtx.x(), endVtx.y()-prodVtx.y(), endVtx.z()-prodVtx.z());
319 CLHEP::HepLorentzVector
mom( pMomentum.x(), pMomentum.y(), pMomentum.z(), pMomentum.t() );
320 double gamma_org=
mom.gamma();
322 double gamma_new=
mom.gamma();
324 if (std::abs(gamma_new-gamma_org)/(gamma_new+gamma_org)>0.001) {
325 ATH_MSG_WARNING(
"Difference in boost gamma for Quasi stable particle "<<genPartPtr);
335 const int pPdgId = genPartPtr->pdg_id();
342 auto tBinding = std::make_unique<ISF::TruthBinding>(genPartPtr);
346 auto sParticle = std::make_unique<ISF::ISFParticle>( std::move(
pos),
351 genPartPtr->status(),
358 return sParticle.release();
◆ finalize()
StatusCode ISF::InputConverter::finalize |
( |
| ) |
|
|
finaloverridevirtual |
◆ findShadowParticle()
Definition at line 805 of file InputConverter.cxx.
807 if (!shadowGenEvent) {
808 ATH_MSG_FATAL (
"Found status==2 GenParticle with no end vertex and shadow GenEvent is missing - something is wrong here!");
813 const int shadowId = genParticle->attribute<HepMC3::IntAttribute>(
"ShadowParticleId")->
value();
814 for (
auto& shadowParticle : shadowGenEvent->particles()) {
815 if (shadowParticle->id() == shadowId &&
matchedGenParticles(genParticle, shadowParticle) ) {
return shadowParticle; }
817 return std::make_shared<HepMC::GenParticle>();
819 for (HepMC::GenEvent::particle_iterator pitr=shadowGenEvent->particles_begin(); pitr != shadowGenEvent->particles_end(); ++pitr) {
◆ getDaughterG4PrimaryParticle()
G4PrimaryParticle * ISF::InputConverter::getDaughterG4PrimaryParticle |
( |
HepMC::GenParticle & |
gp, |
|
|
bool |
makeLinkToTruth = true |
|
) |
| const |
|
private |
Definition at line 704 of file InputConverter.cxx.
710 if (particleDefinition==
nullptr) {
711 ATH_MSG_ERROR(
"ISF_to_G4Event particle conversion failed. ISF_Particle PDG code = " <<
genpart.pdg_id() <<
712 "\n This usually indicates a problem with the evgen step.\n" <<
713 "Please report this to the Generators group, mentioning the release and generator used for evgen and the PDG code above." );
719 auto &genpartMomentum =
genpart.momentum();
720 G4double
px = genpartMomentum.x();
721 G4double
py = genpartMomentum.y();
722 G4double
pz = genpartMomentum.z();
724 std::unique_ptr<G4PrimaryParticle> g4particle = std::make_unique<G4PrimaryParticle>(particleDefinition,
px,
py,
pz);
730 const auto& prodVtx =
genpart.production_vertex()->position();
731 const auto& endVtx =
genpart.end_vertex()->position();
737 CLHEP::Hep3Vector dist3D(endVtx.x()-prodVtx.x(), endVtx.y()-prodVtx.y(), endVtx.z()-prodVtx.z());
741 double pmag2=g4particle->GetTotalMomentum();
743 double e2=g4particle->GetTotalEnergy();
745 double beta2=pmag2/
e2;
762 for (
auto daughterIter=
genpart.end_vertex()->particles_out_const_begin();
763 daughterIter!=
genpart.end_vertex()->particles_out_const_end(); ++daughterIter ) {
765 ATH_MSG_VERBOSE (
"Attempting to add daughter particle: " << **daughterIter );
768 ATH_MSG_WARNING (
"Attempting to add daughter particle: " << **daughterIter );
771 if (!daughterG4Particle) {
772 ATH_MSG_ERROR(
"Bailing out of loop over daughters of particle due to errors - will not return G4Particle.");
775 g4particle->SetDaughter( daughterG4Particle );
779 if (makeLinkToTruth) {
781 std::unique_ptr<PrimaryParticleInformation> primaryPartInfo = std::make_unique<PrimaryParticleInformation>(&
genpart);
784 g4particle->SetUserInformation(primaryPartInfo.release());
787 return g4particle.release();
◆ getG4ParticleDefinition()
const G4ParticleDefinition * ISF::InputConverter::getG4ParticleDefinition |
( |
int |
pdgcode | ) |
const |
|
private |
Special cases for Geantinos
Standard particles
Definition at line 507 of file InputConverter.cxx.
511 return G4ChargedGeantino::Definition();
514 return G4Geantino::GeantinoDefinition();
517 G4ParticleTable *ptable = G4ParticleTable::GetParticleTable();
519 return ptable->FindParticle(pdgcode);
521 ATH_MSG_ERROR(
"getG4ParticleDefinition - Failed to retrieve G4ParticleTable!");
◆ getG4PrimaryParticle()
G4PrimaryParticle * ISF::InputConverter::getG4PrimaryParticle |
( |
ISF::ISFParticle & |
isp, |
|
|
bool |
useHepMC, |
|
|
HepMC::GenEvent * |
shadowGenEvent |
|
) |
| const |
|
private |
In the case that particles are being passed back to Geant4 then we may have particles which have already interacted, so we should set the regeneration number accordingly.
Definition at line 992 of file InputConverter.cxx.
999 description << G4String(
"getG4PrimaryParticle: ") +
"No ISF::TruthBinding associated with ISParticle (" << isp <<
")";
1000 G4Exception(
"iGeant4::TransportTool",
"NoISFTruthBinding", FatalException,
description);
1008 if (particleDefinition==
nullptr) {
1009 ATH_MSG_ERROR(
"ISF_to_G4Event particle conversion failed. ISF_Particle PDG code = " << isp.
pdgCode() <<
1010 "\n This usually indicates a problem with the evgen step.\n" <<
1011 "Please report this to the Generators group, mentioning the release and generator used for evgen and the PDG code above." );
1020 if (useHepMC && currentGenPart) {
1021 auto ¤tGenPartMomentum = currentGenPart->momentum();
1022 px = currentGenPartMomentum.x();
1023 py = currentGenPartMomentum.y();
1024 pz = currentGenPartMomentum.z();
1027 auto &ispMomentum = isp.
momentum();
1028 px = ispMomentum.x();
1029 py = ispMomentum.y();
1030 pz = ispMomentum.z();
1033 std::unique_ptr<G4PrimaryParticle> g4particle = std::make_unique<G4PrimaryParticle>(particleDefinition,
px,
py,
pz);
1035 std::unique_ptr<PrimaryParticleInformation> primaryPartInfo = std::make_unique<PrimaryParticleInformation>(primaryGenpart,&isp);
1046 if ( currentGenPart ) {
1047 if (currentGenPart->end_vertex()) {
1050 ATH_MSG_ERROR (
"getG4PrimaryParticle(): GenParticle has a valid end GenVertexPtr!" );
1051 ATH_MSG_ERROR (
"getG4PrimaryParticle(): currentGenPart: " << currentGenPart <<
", barcode: " <<
HepMC::barcode(currentGenPart) );
1052 ATH_MSG_ERROR (
"getG4PrimaryParticle(): currentGenPart->end_vertex(): " << currentGenPart->end_vertex() <<
", barcode: " <<
HepMC::barcode(currentGenPart->end_vertex()) );
1053 ATH_MSG_FATAL (
"getG4PrimaryParticle(): Passing GenParticles with a valid end GenVertexPtr as input is no longer supported." );
1057 && !currentGenPart->end_vertex()) {
1061 auto A_part = currentGenPart->attribute<HepMC::ShadowParticle>(
"ShadowParticle");
1067 ATH_MSG_FATAL (
"Found a GenParticle with no matching GenParticle in the shadowGenEvent - something is wrong here!");
1070 if (!shadowPart->end_vertex()) {
1071 ATH_MSG_FATAL (
"Found status==2 shadow GenParticle with no end vertex - something is wrong here!");
1082 const double pmass = g4particle->GetMass();
1083 CLHEP::Hep3Vector gpv = g4particle->GetMomentum();
1084 double g4px=g4particle->GetMomentum().x();
1085 double g4py=g4particle->GetMomentum().y();
1086 double g4pz=g4particle->GetMomentum().z();
1094 px=currentGenPart->momentum().px();
1095 py=currentGenPart->momentum().py();
1096 pz=currentGenPart->momentum().pz();
1113 const double pe = std::sqrt(
mag2 + pmass*pmass);
1115 double originalEnergy=currentGenPart->momentum().e();
1116 if (originalEnergy>0.01) {
1117 if ((originalEnergy-
pe)/originalEnergy>0.01) {
1118 double genpx=currentGenPart->momentum().px();
1119 double genpy=currentGenPart->momentum().py();
1120 double genpz=currentGenPart->momentum().pz();
1121 double genp=sqrt(genpx*genpx + genpy*genpy + genpz*genpz);
1122 ATH_MSG_WARNING(
"Truth change in energy for: " << currentGenPart<<
" Morg="<<currentGenPart->momentum().m()<<
" Mmod="<<pmass<<
" Eorg="<<originalEnergy<<
" Emod="<<
pe<<
" porg="<<genp<<
" pmod="<<gpv.mag());
1127 auto& currentGenPart_nc = currentGenPart;
1129 auto* currentGenPart_nc = currentGenPart;
1131 currentGenPart_nc->set_momentum(HepMC::FourVector(
px,
py,
pz,
pe));
1139 g4particle->SetUserInformation(primaryPartInfo.release());
1141 return g4particle.release();
◆ getParticleMass()
get right GenParticle mass
Definition at line 388 of file InputConverter.cxx.
391 double mass =
part.generated_mass();
396 const int absPDG = std::abs(
part.pdg_id());
401 mass = pData->mass();
405 ATH_MSG_WARNING(
"Unable to find mass of particle with PDG ID '" << absPDG <<
"' in ParticleDataTable. Will set mass to generated_mass: " <<
mass);
◆ getSelectedParticles()
std::vector< HepMC::GenParticlePtr > ISF::InputConverter::getSelectedParticles |
( |
HepMC::GenEvent & |
evnt, |
|
|
bool |
legacyOrdering = false |
|
) |
| const |
|
private |
get all generator particles which pass filters
Definition at line 244 of file InputConverter.cxx.
245 auto allGenPartBegin = evnt.particles_begin();
246 auto allGenPartEnd = evnt.particles_end();
249 std::vector<HepMC::GenParticlePtr> passedGenParticles{};
253 if (legacyOrdering) {
256 auto vtxIt = evnt.vertices_begin();
257 auto vtxItEnd = evnt.vertices_end();
258 for ( ; vtxIt != vtxItEnd; ++vtxIt ) {
259 const auto vtxPtr = *vtxIt;
262 std::back_inserter(passedGenParticles),
269 std::back_inserter(passedGenParticles),
273 passedGenParticles.shrink_to_fit();
275 return passedGenParticles;
◆ initialize()
StatusCode ISF::InputConverter::initialize |
( |
| ) |
|
|
finaloverridevirtual |
Athena algtool Hooks.
Definition at line 83 of file InputConverter.cxx.
93 return StatusCode::FAILURE;
102 return StatusCode::SUCCESS;
◆ ISF_to_G4Event()
void ISF::InputConverter::ISF_to_G4Event |
( |
G4Event & |
event, |
|
|
const std::vector< ISF::ISFParticle * > & |
isp, |
|
|
HepMC::GenEvent * |
genEvent, |
|
|
HepMC::GenEvent * |
shadowGenEvent = nullptr , |
|
|
bool |
useHepMC = false |
|
) |
| const |
|
finaloverride |
Converts vector of ISF::ISFParticles to G4Event.
Definition at line 468 of file InputConverter.cxx.
475 const G4VSolid *worldSolid = G4TransportationManager::GetTransportationManager()->GetNavigatorForTracking()->GetWorldVolume()->GetLogicalVolume()->GetSolid();
480 ATH_MSG_WARNING(
"Unable to convert ISFParticle to G4PrimaryParticle!");
484 worldSolid->DumpInfo();
497 if (!atlasG4EvtUserInfo) {
499 event.SetUserInformation(atlasG4EvtUserInfo);
◆ isInsideG4WorldVolume()
Tests whether the given ISFParticle is within the Geant4 world volume.
Definition at line 1177 of file InputConverter.cxx.
1181 const G4ThreeVector g4Pos(
pos.x(),
pos.y(),
pos.z() );
1182 EInside insideStatus = worldSolid->Inside( g4Pos );
1184 bool insideWorld = insideStatus != kOutside;
◆ matchedGenParticles()
Definition at line 792 of file InputConverter.cxx.
796 && (
p1->status() ==
p2->status())
797 && (
p1->pdg_id() ==
p2->pdg_id())
798 && ((
p1->momentum().px()) == (
p2->momentum().px()))
799 && ((
p1->momentum().py()) == (
p2->momentum().py()))
800 && ((
p1->momentum().pz()) == (
p2->momentum().pz()))
◆ passesFilters()
check if the given particle passes all filters
Definition at line 441 of file InputConverter.cxx.
449 :
"false, will remove particle."));
◆ processPredefinedDecays()
Set the lifetime appropriately - this is slow but rigorous, and we don't want to end up with something like vertex time that we have to validate for every generator on earth...
Definition at line 910 of file InputConverter.cxx.
915 const auto& prodVtx =
genpart->production_vertex()->position();
916 const auto& endVtx =
genpart->end_vertex()->position();
918 CLHEP::Hep3Vector dist3D(endVtx.x()-prodVtx.x(), endVtx.y()-prodVtx.y(), endVtx.z()-prodVtx.z());
922 double pmag2=g4particle->GetTotalMomentum();
924 double e2=g4particle->GetTotalEnergy();
926 double beta2=pmag2/
e2;
927 double mass2=g4particle->GetMass();
932 const G4LorentzVector lv0( prodVtx.x(), prodVtx.y(), prodVtx.z(), prodVtx.t() );
933 const G4LorentzVector lv1( endVtx.x(), endVtx.y(), endVtx.z(), endVtx.t() );
936 G4LorentzVector dist4D(lv1);
939 double dist4Dgamma=std::numeric_limits<double>::infinity();
940 if (dist4D.t()>0 && dist4D.mag2()>0) {
941 dist4Dgamma=dist4D.gamma();
946 G4LorentzVector fourmom(g4particle->GetMomentum(),g4particle->GetTotalEnergy());
947 double fourmomgamma=std::numeric_limits<double>::infinity();
948 if (fourmom.t()>0 && fourmom.mag2()>0) {
949 fourmomgamma=fourmom.gamma();
954 ATH_MSG_VERBOSE(
"gammaVertex="<<dist4Dgamma<<
" gammamom="<<fourmomgamma<<
" gamma(beta)="<<1/std::sqrt(1-beta2)<<
" lifetime tau(beta)="<<std::sqrt(tau2)<<
" lifetime tau="<<tau);
964 ATH_MSG_WARNING(
"Detected primary particle with end vertex. This should only be the case if" );
965 ATH_MSG_WARNING(
"you are running with quasi-stable particle simulation enabled. This is not" );
966 ATH_MSG_WARNING(
"yet validated - you'd better know what you're doing. Will add the primary" );
973 for (
auto daughter: *(
genpart->end_vertex())) {
975 ATH_MSG_VERBOSE (
"Attempting to add daughter particle: " << daughter );
978 ATH_MSG_WARNING (
"Attempting to add daughter particle: " << daughter );
985 if (!daughterG4Particle) {
986 ATH_MSG_FATAL(
"Bailing out of loop over daughters due to errors.");
988 g4particle->SetDaughter( daughterG4Particle );
◆ m_genParticleFilters
◆ m_particleDataTable
const HepPDT::ParticleDataTable* ISF::InputConverter::m_particleDataTable |
|
private |
◆ m_particlePropSvc
ServiceHandle<IPartPropSvc> ISF::InputConverter::m_particlePropSvc |
|
private |
ParticlePropertyService and ParticleDataTable.
particle properties svc to retrieve PDT
Definition at line 132 of file InputConverter.h.
◆ m_quasiStableParticlesIncluded
bool ISF::InputConverter::m_quasiStableParticlesIncluded |
|
private |
◆ m_useGeneratedParticleMass
bool ISF::InputConverter::m_useGeneratedParticleMass |
|
private |
use GenParticle::generated_mass() in simulation
Definition at line 135 of file InputConverter.h.
◆ m_useShadowEvent
BooleanProperty ISF::InputConverter::m_useShadowEvent {this, "UseShadowEvent", false, "New approach to selecting particles for simulation" } |
|
private |
The documentation for this class was generated from the following files:
std::list< ISF::ISFParticle * > ISFParticleContainer
generic ISFParticle container (not necessarily a std::list!)
std::pair< AtlasDetDescr::AtlasRegion, ISF::SimSvcID > DetRegionSvcIDPair
the datatype to be used to store each individual particle hop
void SetLastProcessedTrackID(int trackID)
record the value of G4Track::GetTrackID() for the current G4Step.
This class is attached to G4Event objects as UserInformation. It holds a pointer to the HepMC::GenEve...
void SetLastProcessedStep(int stepNumber)
record value of the G4Track::GetCurrentStepNumber() for the current G4Step.
int generations(const T &p)
Method to return how many interactions a particle has undergone during simulation based on the status...
int signal_process_id(const GenEvent &e)
void SetHepMCEvent(HepMC::GenEvent *)
set m_theEvent, the pointer to the HepMC::GenEvent used to create the G4Event.
GenParticle * GenParticlePtr
int pdgCode() const
PDG value.
int GetRegenerationNr()
return the number of times the particle represented by the G4PrimaryParticle has undergone a non-dest...
#define ATH_MSG_VERBOSE(x)
int generations(const T &p)
Method to return how many interactions a particle has undergone during simulation (only to be used in...
const Amg::Vector3D & position() const
The current position of the ISFParticle.
POOL::TEvent event(POOL::TEvent::kClassAccess)
const ISF::ISFParticle * GetISFParticle() const
return a pointer to the ISFParticle used to create the G4PrimaryParticle
std::vector< ISF::ISFParticle * > ISFParticleVector
ISFParticle vector.
Out copy_if(In first, const In &last, Out res, const Pred &p)
AthROOTErrorHandlerSvc * svc
const T * back() const
Access the last element in the collection as an rvalue.
const GenParticle * ConstGenParticlePtr
double timeStamp() const
Timestamp of the ISFParticle.
const Amg::Vector3D & momentum() const
The current momentum vector of the ISFParticle.
double charge(const T &p)
void SetRegenerationNr(int i)
update the number of times the particle represented by the G4PrimaryParticle has undergone a non-dest...
Eigen::Matrix< double, 3, 1 > Vector3D
HepMC::ConstGenParticlePtr GetHepMCParticle() const
return a pointer to the GenParticle used to create the G4PrimaryParticle
tuple genpart
Check that the actual generators, tune, and main PDF are consistent with the JO name.
double e2(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in 2nd sampling
#define ATH_MSG_WARNING(x)
bool isDecayed(const T &p)
Identify if the particle decayed.
Scalar mag2() const
mag2 method - forward to squaredNorm()
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
bool empty() const noexcept
Returns true if the collection is empty.
const TruthBinding * getTruthBinding() const
pointer to the simulation truth - optional, can be 0
std::string description
glabal timer - how long have I taken so far?
int GetParticleUniqueID() const