Skip to content
Snippets Groups Projects
Commit b26d7f79 authored by Andre Sailer's avatar Andre Sailer
Browse files

InputHandling: Fix the order in which particles are passed to geant4

use a vector instead of a map to make the order of particles deterministic and not depend on the memory layout
This is a problem if more than one primary particle exists.
Now runs with the same randomseed will produce the same result
parent 03a6de39
No related branches found
No related tags found
No related merge requests found
......@@ -350,13 +350,13 @@ static G4PrimaryParticle* createG4Primary(const Geant4ParticleHandle p) {
return g4;
}
static map<Geant4Particle*,G4PrimaryParticle*>
static vector< pair<Geant4Particle*,G4PrimaryParticle*> >
getRelevant(set<int>& visited,
map<int,G4PrimaryParticle*>& prim,
Geant4PrimaryInteraction::ParticleMap& pm,
const Geant4ParticleHandle p)
{
typedef map<Geant4Particle*,G4PrimaryParticle*> Primaries;
typedef vector< pair<Geant4Particle*,G4PrimaryParticle*> > Primaries;
Primaries res;
visited.insert(p->id);
PropertyMask status(p->status);
......@@ -364,7 +364,7 @@ getRelevant(set<int>& visited,
if ( prim.find(p->id) == prim.end() ) {
G4PrimaryParticle* p4 = createG4Primary(p);
prim[p->id] = p4;
res.insert(make_pair(p,p4));
res.push_back(make_pair(p,p4));
}
}
else if ( p->daughters.size() > 0 ) {
......@@ -389,19 +389,19 @@ getRelevant(set<int>& visited,
for(Geant4Particle::Particles::const_iterator i=dau.begin(); i!=dau.end(); ++i) {
if ( visited.find(*i) == visited.end() ) {
Primaries tmp = getRelevant(visited,prim,pm,pm[*i]);
daughters.insert(tmp.begin(),tmp.end());
daughters.insert(daughters.end(), tmp.begin(),tmp.end());
}
}
for(Primaries::iterator i=daughters.begin(); i!=daughters.end(); ++i)
p4->SetDaughter((*i).second);
}
res.insert(make_pair(p,p4));
res.push_back(make_pair(p,p4));
}
else {
for(Geant4Particle::Particles::const_iterator i=dau.begin(); i!=dau.end(); ++i) {
if ( visited.find(*i) == visited.end() ) {
Primaries tmp = getRelevant(visited,prim,pm,pm[*i]);
res.insert(tmp.begin(),tmp.end());
res.insert(res.end(), tmp.begin(),tmp.end());
}
}
}
......@@ -414,7 +414,7 @@ int DD4hep::Simulation::generatePrimaries(const Geant4Action* caller,
const Geant4Context* context,
G4Event* event)
{
typedef map<Geant4Particle*,G4PrimaryParticle*> Primaries;
typedef vector< pair<Geant4Particle*,G4PrimaryParticle*> > Primaries;
typedef Geant4PrimaryInteraction Interaction;
Geant4PrimaryMap* primaries = context->event().extension<Geant4PrimaryMap>();
Interaction* interaction = context->event().extension<Interaction>();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment