34 #define INCLXX_IN_GEANT4_MODE 1 
   48     loadedStoppingTime(0.),
 
   63     inside.insert(inside.end(), pL.begin(), pL.end());
 
   68     avatarList.push_back(a);
 
   71     for(
ParticleIter i=pList.begin(), e=pList.end(); i!=e; ++i) {
 
   74       connectAvatarToParticle(a, *i);
 
   79     for(
IAvatarIter a=al.begin(), e=al.end(); a!=e; ++a)
 
   85     avatarList.push_back(a);
 
   88     for(
ParticleIter i=pList.begin(), e=pList.end(); i!=e; ++i) {
 
   90       connectAvatarToParticle(a, *i);
 
   96     incoming.push_back(p);
 
  100     particleAvatarConnections.insert(PAPair(p,a));
 
  103   void Store::disconnectAvatarFromParticle(IAvatar * 
const a, Particle * 
const p) {
 
  104     PAIterPair iterPair = particleAvatarConnections.equal_range(p);
 
  105     for(PAIter i=iterPair.first, last=iterPair.second; i!=last; ++i) {
 
  107         particleAvatarConnections.erase(i);
 
  111     INCL_WARN(
"Loop in Store::disconnectAvatarFromParticle fell through." << std::endl
 
  112               << 
"This indicates an inconsistent state of the particleAvatarConnections map." << std::endl);
 
  115   void Store::removeAvatar(IAvatar * 
const avatar) {
 
  117     ParticleList particlesRelatedToAvatar = avatar->getParticles();
 
  118     for(
ParticleIter particleIter = particlesRelatedToAvatar.begin(), e = particlesRelatedToAvatar.end();
 
  119         particleIter != e; ++particleIter) {
 
  120       disconnectAvatarFromParticle(avatar, *particleIter);
 
  124     avatarList.
remove(avatar);
 
  128     PAIterPair iterPair = particleAvatarConnections.equal_range(particle);
 
  129     for(PAIter i=iterPair.first, last=iterPair.second; i!=last; ++i) {
 
  130       avatarsToBeRemoved.insert(i->second);
 
  135     for(ASIter a=avatarsToBeRemoved.begin(), e=avatarsToBeRemoved.end(); a!=e; ++a) {
 
  139     avatarsToBeRemoved.clear();
 
  143     if(avatarList.empty()) 
return NULL;
 
  145 #ifdef INCL_AVATAR_SEARCH_FullSort 
  152     IAvatar *avatar = avatarList.front();
 
  154 #elif defined(INCL_AVATAR_SEARCH_MinElement) 
  157     IAvatar *avatar = *(std::min_element(avatarList.begin(), avatarList.end(),
 
  161 #error Unrecognized INCL_AVATAR_SEARCH. Allowed values are: FullSort, MinElement. 
  164     removeAvatar(avatar);
 
  169     for(
ParticleIter particleIter = inside.begin(), particleEnd=inside.end();
 
  170     particleIter != particleEnd; ++particleIter) {
 
  171       (*particleIter)->propagate(step);
 
  194     for(
IAvatarIter iter = avatarList.begin(), e = avatarList.end(); iter != e; ++iter) {
 
  198     particleAvatarConnections.clear();
 
  200     avatarsToBeRemoved.clear();
 
  209     if( incoming.size() != 0 ) {
 
  210       INCL_WARN(
"Incoming list is not empty when Store::clear() is called" << 
'\n');
 
  217     for(
ParticleIter iter=inside.begin(), e=inside.end(); iter!=e; ++iter) {
 
  224     for(
ParticleIter iter=outgoing.begin(), e=outgoing.end(); iter!=e; ++iter) {
 
  225       if((*iter)->isCluster()) {
 
  228 #ifdef INCLXX_IN_GEANT4_MODE 
  241     G4int projectileA, projectileZ, 
A, 
Z;
 
  243     G4int ID, type, isParticipant;
 
  247     std::ifstream in(filename.c_str());
 
  248     in >> projectileA >> projectileZ >> A >> Z >> stoppingTime >> cutNN;
 
  251     loadedStoppingTime = stoppingTime;
 
  256       in >> ID >> type >> isParticipant >> x >> y >> z >> px >> py >> pz >> E >> v;
 
  257       if(!in.good()) 
break;
 
  264       else if(type == -1) {
 
  269         INCL_FATAL(
"Unrecognized particle type while loading particles; type=" << type << 
'\n');
 
  276       if(isParticipant == 1) {
 
  287     std::stringstream ss;
 
  289     for(
ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i) {
 
  290       if((*i)->getType() == 
Proton) {
 
  294       if((*i)->getType() == 
Neutron) {
 
  300     ss << 
"0 0 " << A << 
" " << 
Z << 
" " 
  304     for(
ParticleIter i=inside.begin(), e=inside.end(); i!=e; ++i) {
 
  305       G4int ID = (*i)->getID();
 
  307       if((*i)->getType() == 
Proton) {
 
  310       if((*i)->getType() == 
Neutron) {
 
  314       G4int isParticipant = 0;
 
  315       if((*i)->isParticipant()) {
 
  319       G4double x = (*i)->getPosition().getX();
 
  320       G4double y = (*i)->getPosition().getY();
 
  321       G4double z = (*i)->getPosition().getZ();
 
  323       G4double px = (*i)->getMomentum().getX();
 
  324       G4double py = (*i)->getMomentum().getY();
 
  325       G4double pz = (*i)->getMomentum().getZ();
 
  326       G4double V = (*i)->getPotentialEnergy();
 
  328       ss << ID << 
" " << type << 
" " << isParticipant << 
" " 
  329         << x << 
" " << y << 
" " << z << 
" " 
  330         << px << 
" " << py << 
" " << pz << 
" " 
  331      << E << 
" " << V << 
'\n';
 
  338     std::ofstream out(filename.c_str());
 
  344     std::stringstream ss;
 
  345     for(
IAvatarIter i = avatarList.begin(), e = avatarList.end(); i != e; ++i) {
 
  346       ss << (*i)->toString() << 
'\n';
 
  352     for(
IAvatarIter i = avatarList.begin(), e = avatarList.end(); i != e; ++i)
 
std::string printParticleConfiguration()
 
static G4bool avatarComparisonPredicate(IAvatar *lhs, IAvatar *rhs)
Comparison predicate for avatars. 
 
std::string printAvatars()
 
G4bool containsCollisions() const 
 
UnorderedVector< IAvatar * >::const_iterator IAvatarIter
 
IAvatar * findSmallestTime()
 
Store(Config const *const config)
 
void addParticleEntryAvatars(IAvatarList const &al)
Add one ParticleEntry avatar. 
 
void removeScheduledAvatars()
Remove avatars that have been scheduled. 
 
double A(double temperature)
 
void particleHasBeenDestroyed(Particle *const)
 
void particleHasBeenEjected(Particle *const)
 
void loadParticles(std::string const &filename)
 
virtual ParticleList getParticles() const =0
 
void setPotentialEnergy(G4double v)
Set the particle potential energy. 
 
void incrementCascading()
 
void addParticleEntryAvatar(IAvatar *a)
Add one ParticleEntry avatar. 
 
void particleHasBeenUpdated(Particle *const)
Notify the Store about a particle update. 
 
void addIncomingParticle(Particle *const p)
 
void writeParticles(std::string const &filename)
 
virtual void makeParticipant()
 
void timeStep(G4double step)
 
ParticleList::const_iterator ParticleIter
 
void removeFromIncoming(Particle *const p)
 
void particleHasEntered(Particle *const particle)
Move a particle from incoming to inside.