Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // INCL++ intra-nuclear cascade model 27 // Alain Boudard, CEA-Saclay, France 28 // Joseph Cugnon, University of Liege, Belgium 29 // Jean-Christophe David, CEA-Saclay, France 30 // Pekka Kaitaniemi, CEA-Saclay, France, and Helsinki Institute of Physics, Finland 31 // Sylvie Leray, CEA-Saclay, France 32 // Davide Mancusi, CEA-Saclay, France 33 // 34 #define INCLXX_IN_GEANT4_MODE 1 35 36 #include "globals.hh" 37 38 /* 39 * StandardPropagationModel.hh 40 * 41 * \date 4 June 2009 42 * \author Pekka Kaitaniemi 43 */ 44 45 #ifndef G4INCLStandardPropagationModel_hh 46 #define G4INCLStandardPropagationModel_hh 1 47 48 #include "G4INCLNucleus.hh" 49 #include "G4INCLIPropagationModel.hh" 50 #include "G4INCLIAvatar.hh" 51 #include "G4INCLConfigEnums.hh" 52 53 #include <iterator> 54 55 namespace G4INCL { 56 57 /** 58 * Standard INCL4 particle propagation and avatar prediction 59 * 60 * This class implements the standard INCL4 avatar prediction and particle 61 * propagation logic. The main idea is to predict all collisions between particles 62 * and their reflections from the potential wall. After this we select the avatar 63 * with the smallest time, propagate all particles to their positions at that time 64 * and return the avatar to the INCL kernel @see G4INCL::Kernel. 65 * 66 * The particle trajectories in this propagation model are straight lines and all 67 * particles are assumed to move with constant velocity. 68 */ 69 class StandardPropagationModel: public G4INCL::IPropagationModel { 70 public: 71 StandardPropagationModel(LocalEnergyType localEnergyType, LocalEnergyType localEnergyDeltaType, const G4double hTime = 0.0); 72 virtual ~StandardPropagationModel(); 73 74 G4double getCurrentTime(); 75 /** 76 * Set the nucleus for this propagation model. 77 */ 78 void setNucleus(G4INCL::Nucleus *nucleus); 79 80 /** 81 * Get the nucleus. 82 */ 83 G4INCL::Nucleus* getNucleus(); 84 85 G4double shoot(ParticleSpecies const &projectileSpecies, const G4double kineticEnergy, const G4double impactParameter, const G4double phi); 86 G4double shootParticle(ParticleType const t, const G4double kineticEnergy, const G4double impactParameter, const G4double phi); 87 G4double shootComposite(ParticleSpecies const &s, const G4double kineticEnergy, const G4double impactParameter, const G4double phi); 88 G4double shootAtrest(ParticleType const t, const G4double kineticEnergy); 89 90 /** 91 * Set the stopping time of the simulation. 92 */ 93 void setStoppingTime(G4double); 94 95 /** 96 * Get the current stopping time. 97 */ 98 G4double getStoppingTime(); 99 100 /** 101 * Add an avatar to the storage. 102 */ 103 void registerAvatar(G4INCL::IAvatar *anAvatar); 104 105 /** \brief Generate a two-particle avatar. 106 * 107 * Generate a two-particle avatar, if all the appropriate conditions are 108 * met. 109 */ 110 IAvatar *generateBinaryCollisionAvatar(Particle * const p1, Particle * const p2); 111 112 /** \brief Get the reflection time. 113 * 114 * Returns the reflection time of a particle on the potential wall. 115 * 116 * \param aParticle pointer to the particle 117 */ 118 G4double getReflectionTime(G4INCL::Particle const * const aParticle); 119 120 /** 121 * Get the predicted time of the collision between two particles. 122 */ 123 G4double getTime(G4INCL::Particle const * const particleA, 124 G4INCL::Particle const * const particleB, G4double *minDistOfApproach) const; 125 126 /** \brief Generate and register collisions between a list of updated particles and all the other particles. 127 * 128 * This method does not generate collisions among the particles in 129 * updatedParticles; in other words, it generates a collision between one 130 * of the updatedParticles and one of the particles ONLY IF the latter 131 * does not belong to updatedParticles. 132 * 133 * If you intend to generate all possible collisions among particles in a 134 * list, use generateCollisions(). 135 * 136 * \param updatedParticles list of updated particles 137 * \param particles list of particles 138 */ 139 void generateUpdatedCollisions(const ParticleList &updatedParticles, const ParticleList &particles); 140 141 /** \brief Generate and register collisions among particles in a list, except between those in another list. 142 * 143 * This method generates all possible collisions among the particles. 144 * Each collision is generated only once. 145 * 146 * \param particles list of particles 147 */ 148 void generateCollisions(const ParticleList &particles); 149 150 /** \brief Generate and register collisions among particles in a list, except between those in another list. 151 * 152 * This method generates all possible collisions among the particles. 153 * Each collision is generated only once. The collision is NOT generated 154 * if BOTH collision partners belong to the except list. 155 * 156 * You should pass an empty list as the except parameter if you want to 157 * generate all possible collisions among particles. 158 * 159 * \param particles list of particles 160 * \param except list of excluded particles 161 */ 162 void generateCollisions(const ParticleList &particles, const ParticleList &except); 163 164 /** \brief Generate decays for particles that can decay. 165 * 166 * The list of particles given as an argument is allowed to contain also 167 * stable particles. 168 * 169 * \param particles list of particles to (possibly) generate decays for 170 */ 171 void generateDecays(const ParticleList &particles); 172 173 /** 174 * Update all avatars related to a particle. 175 */ 176 void updateAvatars(const ParticleList &particles); 177 178 /// \brief (Re)Generate all possible avatars. 179 void generateAllAvatars(); 180 181 #ifdef INCL_REGENERATE_AVATARS 182 /** \brief (Re)Generate all possible avatars. 183 * 184 * This method excludes collision avatars between updated particles. 185 */ 186 void generateAllAvatarsExceptUpdated(FinalState const * const fs); 187 #endif 188 189 /** 190 * Propagate all particles and return the first avatar. 191 */ 192 G4INCL::IAvatar* propagate(FinalState const * const fs); 193 194 private: 195 G4INCL::Nucleus *theNucleus; 196 G4double maximumTime; 197 G4double currentTime; 198 G4double hadronizationTime; 199 G4bool firstAvatar; 200 LocalEnergyType theLocalEnergyType, theLocalEnergyDeltaType; 201 Particle backupParticle1, backupParticle2; 202 }; 203 204 } 205 206 207 #endif 208