Changeset 1315 for trunk/source/processes/hadronic/models/de_excitation
- Timestamp:
- Jun 18, 2010, 11:42:07 AM (14 years ago)
- Location:
- trunk/source/processes/hadronic/models/de_excitation
- Files:
-
- 48 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/processes/hadronic/models/de_excitation/History
r1228 r1315 14 14 * Please list in reverse chronological order (last date on top) 15 15 --------------------------------------------------------------- 16 17 9 June 2010 Vladimir Ivanchenko (hadr-deex-V09-03-18) 18 ---------------------------------------------------------- 19 - G4Evaporation - fixed problem of isotope production for high Z 20 fragments introduced in previous tags 21 22 25 May 2010 Vladimir Ivanchenko (hadr-deex-V09-03-17) 23 ---------------------------------------------------------- 24 - G4E1Probability - added numerical protection to avoid division by zero 25 26 19 May 2010 Vladimir Ivanchenko (hadr-deex-V09-03-16) 27 ---------------------------------------------------------- 28 - G4UnstableFragmentBreakUp - fix selection of decay channel by addition of check 29 on residual fragment Z and A (addressed 30 problem reported stt for the tag 03-14) 31 32 19 May 2010 Vladimir Ivanchenko (hadr-deex-V09-03-15) 33 ---------------------------------------------------------- 34 - G4UnstableFragmentBreakUp - fixed selection of decay channel 35 - G4E1Probability - code cleanup and optimisation by usage of G4Pow, integer A 36 and introduction of const members 37 - G4GEMProbability - code cleanup and optimisation by usage of G4Pow and integer Z,A 38 - G4ExcitationHandler - forced FermiBreakUp for A < 5 39 - G4PhotonEvaporation - (F.Lei) added correction of electron state after emission 40 - G4FermiFragmentsPool - JMQ fixed fragment 111 41 42 11 May 2010 Vladimir Ivanchenko (hadr-deex-V09-03-14) 43 ---------------------------------------------------------- 44 - G4UnstableFragmentBreakUp - new class to decay exotic fragmnet (like 2n or 2p) 45 - G4Evaporation - added call to G4UnstableFragmentBreakUp if natural abandances 46 of cold fragment is zero; optimized logic of stopping of 47 evaporation loop 48 - G4PhotonEvaporation - cleanup new methods EmittedFragment and BreakUpFragment 49 - G4ExcitationHandler - use BreakUpFragment method for photon deexcitation 50 51 10 May 2010 Vladimir Ivanchenko (hadr-deex-V09-03-13) 52 ---------------------------------------------------------- 53 - G4VGammaDeexcitation - take into account bounding energy of electron 54 in the case of electron emmision; fixed kinematic 55 - G4DiscreteGammaTransition - Removed unphysical corretions of gamma energy; 56 fixed default particle as gamma; do not subtract 57 bounding energy in case of electron emmision 58 - G4ExcitationHandler - allowed emmision e- instead of gamma due to internal conversion 59 60 61 03 May 2010 Vladimir Ivanchenko (hadr-deex-V09-03-12) 62 ---------------------------------------------------------- 63 - G4Evaporation - improved condition how to stop deexcitation loop 64 - G4VGammaDeexcitation - take into account electron mass in the case of 65 electron emmision 66 - G4PhotonEvaporation - improved printout 67 - G4ExcitationHandler - disable MFM 68 - G4StatMFFragment, G4CompetitiveFission, G4EvaporationProbability, 69 G4GEMProbability - use correct header files 70 71 28 April 2010 Vladimir Ivanchenko (hadr-deex-V09-03-11) 72 ---------------------------------------------------------- 73 - G4ExcitationHandler - (JQM+VI) add check on stability of primary; 74 do evaporation if FermiBreakUp or MFM 75 cannot deexcite a fragment; 76 added SetParameters method 77 - G4Evaporation - rewrite BreakUp method; added Initialise method, where setup 78 all options and not at run time; added InitialiseEvaporation 79 method to setup decay channels; changed order of decay 80 channels - first photon evaporation, second - fision, 81 after all other channels as before 82 - virtual interfaces - moved constructors and destructors to source files 83 84 26 April 2010 Vladimir Ivanchenko (hadr-deex-V09-03-10) 85 ---------------------------------------------------------- 86 - G4FermiConfiguration - (JQM) parameter of Coulomb energy Kappa is changed 87 from 1 to 6 according to recommendation of original 88 author of the model A. Botvina 89 - G4FermiPhaseSpaceDecay - (JQM) improved model of sampling of kinetic energy; 90 - (VI) cleanup the code by using G4Pow; moved constructor 91 and destructor to the source 92 93 25 April 2010 Vladimir Ivanchenko (hadr-deex-V09-03-09) 94 ---------------------------------------------------------- 95 - G4ExcitationHandler - (JQM+VI) apply FermiBreakUp to fragments with A>1 96 (before was A>4) in order to reduce number of 97 fake gamma produced in order deexcite light 98 fragments; added parameter minExcitation = 1 keV 99 - G4VEvaporationChannel, G4PhotonEvaporation - added 2 new virtual methods 100 EmittedFragment and BreakUpFragment 101 102 23 April 2010 Vladimir Ivanchenko (hadr-deex-V09-03-08) 103 ---------------------------------------------------------- 104 - G4VGammaDeexcitation - kinematic of 2-body decay rewritten 105 - G4DiscreteGammaTransition, G4DiscreteGammaDeexcitation, 106 G4ContinuumGammaDeexcitation - set energy tolerance 1 keV; 107 set destructors to be virtual 108 109 21 April 2010 Vladimir Ivanchenko (hadr-deex-V09-03-07) 110 ---------------------------------------------------------- 111 - G4FermiFragmentsPool - (JMQ) extended list of stable fragments 112 - G4DiscreteGammaTransition - (JMQ) make transition depended on Z and A 113 (before was only Z) and added 114 energy tolerance 115 - G4ContinuumGammaDeexcitation - (JQM) more accurate Lorentz computations 116 - G4VGammaDeexcitation - (JMQ) improved Lorentz computations 117 118 20 April 2010 Vladimir Ivanchenko (hadr-deex-V09-03-06) 119 ---------------------------------------------------------- 120 - G4GEMProbability - (JQM + VI) fixed numerical problem (division by zero) 121 122 16 April 2010 Vladimir Ivanchenko (hadr-deex-V09-03-05) 123 ---------------------------------------------------------- 124 - G4ExcitationHandler - enable Multi-Fragmentation model 125 - G4StatMFMacroTemperature - cleanup logic of solving equation for 126 temperature; moved constructors and destructor to source 127 128 09 April 2010 Vladimir Ivanchenko (hadr-deex-V09-03-04) 129 ---------------------------------------------------------- 130 - G4ProtonEvaporationProbability, G4DeuteronEvaporationProbability, 131 G4TritonEvaporationProbability, G4He3EvaporationProbability, 132 G4AlphaEvaporationProbability - (JMQ) return back to published 133 variant OPT3 (Kalbach) parameterization of inverse 134 cross section 135 136 05 March 2010 Vladimir Ivanchenko (hadr-deex-V09-03-03) 137 ---------------------------------------------------------- 138 - G4Evaporation - set as a default variant evaporation combined 139 standard + GEM probabilities 140 141 17 February 2009 Vladimir Ivanchenko (hadr-deex-V09-03-02) 142 ---------------------------------------------------------- 143 - G4ExcitationHandler - deactivate Multi-Fragmentation model 144 145 05 February 2009 Vladimir Ivanchenko (hadr-deex-V09-03-01) 146 ---------------------------------------------------------- 147 - G4ExcitationHandler - activate FermiBreakUp and Multi-Fragmentation models 148 149 18 January 2010 Vladimir Ivanchenko (hadr-deex-V09-03-00) 150 ---------------------------------------------------------- 151 - Move 9.3 version to the head of cvs for following files: G4FissionBarrier.hh, 152 G4FissionBarrier.cc, G4VGammaDeexcitation.cc, G4VGammaDeexcitation.hh, 16 153 17 154 09 December 2009 Gunter Folger (hadr-deex-V09-02-23) -
trunk/source/processes/hadronic/models/de_excitation/evaporation/include/G4Evaporation.hh
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4Evaporation.hh,v 1. 7 2009/07/27 10:32:05vnivanch Exp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4Evaporation.hh,v 1.12 2010/05/11 11:34:09 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 32 32 // 33 33 // 34 // Alex Howard - added protection for negative probabilities in the sum, 14/2/07 35 // V.Ivanchenko - added Combined decay channels (default + GEM) 27/07/09 34 // 14/02/2007 Alex Howard - added protection for negative probabilities in the sum 35 // 27/07/2009 V.Ivanchenko - added Combined decay channels (default + GEM) 36 // 11/05/2010 V.Ivanchenko - rewrited technical part do not "new" and "delete" 37 // of small objects 36 38 37 39 #ifndef G4Evaporation_h … … 43 45 #include "G4VEvaporationChannel.hh" 44 46 #include "G4Fragment.hh" 47 #include "G4UnstableFragmentBreakUp.hh" 45 48 46 49 class G4VEvaporationFactory; 50 class G4NistManager; 47 51 48 52 //#define debug … … 52 56 public: 53 57 G4Evaporation(); 54 G4Evaporation(std::vector<G4VEvaporationChannel*> * aChannelsVector) : 55 theChannels(aChannelsVector), theChannelFactory(0) 56 {}; 58 G4Evaporation(std::vector<G4VEvaporationChannel*> * aChannelsVector); 57 59 58 60 virtual ~G4Evaporation(); 59 61 62 virtual void Initialise(); 63 60 64 private: 65 66 void InitialiseEvaporation(); 67 61 68 G4Evaporation(const G4Evaporation &right); 62 69 … … 66 73 67 74 public: 75 68 76 G4FragmentVector * BreakItUp(const G4Fragment &theNucleus); 69 77 … … 77 85 #endif 78 86 79 80 87 std::vector<G4VEvaporationChannel*> * theChannels; 88 std::vector<G4double> probabilities; 81 89 G4VEvaporationFactory * theChannelFactory; 82 83 84 class SumProbabilities : public std::binary_function<G4double,G4double,G4double> 85 { 86 public: 87 SumProbabilities() : total(0.0) {} 88 G4double operator() (G4double& /* probSoFar */, G4VEvaporationChannel*& frag) 89 { 90 G4double temp_prob = frag->GetEmissionProbability(); 91 if(temp_prob >= 0.0) total += temp_prob; 92 // total += frag->GetEmissionProbability(); 93 return total; 94 } 90 G4int nChannels; 91 G4double minExcitation; 92 G4NistManager* nist; 93 G4UnstableFragmentBreakUp unstableBreakUp; 95 94 96 G4double GetTotal() { return total; }97 public:98 G4double total;99 100 };101 102 95 }; 103 96 -
trunk/source/processes/hadronic/models/de_excitation/evaporation/include/G4EvaporationFactory.hh
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4EvaporationFactory.hh,v 1. 3 2006/06/29 20:09:55 gunterExp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4EvaporationFactory.hh,v 1.4 2010/04/27 11:43:16 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 41 41 { 42 42 public: 43 G4EvaporationFactory() {};44 virtual ~G4EvaporationFactory() {};43 G4EvaporationFactory(); 44 virtual ~G4EvaporationFactory(); 45 45 46 46 private: 47 G4EvaporationFactory(const G4EvaporationFactory & ) : G4VEvaporationFactory() {};47 G4EvaporationFactory(const G4EvaporationFactory & ); 48 48 const G4EvaporationFactory & operator=(const G4EvaporationFactory & val); 49 49 G4bool operator==(const G4EvaporationFactory & val) const; -
trunk/source/processes/hadronic/models/de_excitation/evaporation/include/G4VEvaporation.hh
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4VEvaporation.hh,v 1. 4 2008/09/19 13:32:54 ahowardExp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4VEvaporation.hh,v 1.6 2010/04/27 14:00:40 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 46 46 { 47 47 public: 48 G4VEvaporation() {};49 virtual ~G4VEvaporation() {}; // *48 G4VEvaporation(); 49 virtual ~G4VEvaporation(); 50 50 51 51 private: … … 57 57 58 58 public: 59 59 60 virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus) = 0; 61 62 virtual void Initialise(); 60 63 61 64 // for inverse cross section choice -
trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4AlphaEvaporationProbability.cc
r1055 r1315 225 225 ecut = (ecut-a) / (p+p); 226 226 ecut2 = ecut; 227 if (cut < 0.) ecut2 = ecut - 2.; 227 //JMQ 290310 for avoiding unphysical increase below minimum (at ecut) 228 //ecut<0 means that there is no cut with energy axis, i.e. xs is set to 0 bellow minimum 229 // if (cut < 0.) ecut2 = ecut - 2.; 230 if (cut < 0.) ecut2 = ecut; 228 231 elab = K * FragmentA / ResidualA; 229 232 sig = 0.; -
trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4DeuteronEvaporationProbability.cc
r1055 r1315 206 206 207 207 //JMQ 13/02/09 increase of reduced radius to lower the barrier 208 // ec = 1.44 * theZ * ResidualZ / (1.5*ResidualAthrd+ra); 209 ec = 1.44 * theZ * ResidualZ / (1.7*ResidualAthrd+ra); 208 // ec = 1.44 * theZ * ResidualZ / (1.5*ResidualAthrd+ra); 209 ec = 1.44 * theZ * ResidualZ / (1.7*ResidualAthrd+ra); 210 210 211 ecsq = ec * ec; 211 212 p = p0 + p1/ec + p2/ecsq; … … 225 226 ecut = (ecut-a) / (p+p); 226 227 ecut2 = ecut; 227 if (cut < 0.) ecut2 = ecut - 2.; 228 //JMQ 290310 for avoiding unphysical increase below minimum (at ecut) 229 //ecut<0 means that there is no cut with energy axis, i.e. xs is set to 0 bellow minimum 230 // if (cut < 0.) ecut2 = ecut - 2.; 231 if (cut < 0.) ecut2 = ecut; 228 232 elab = K * FragmentA / ResidualA; 229 233 sig = 0.; -
trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4Evaporation.cc
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4Evaporation.cc,v 1. 15 2009/09/16 15:32:25vnivanch Exp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4Evaporation.cc,v 1.25 2010/06/09 11:56:47 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 38 38 // superimposed Coulomb barrier (if useSICBis set true, by default is false) 39 39 // 40 // V.Ivanchenko added G4EvaporationDefaultGEMFactory option, 27/07/09 40 // V.Ivanchenko (27 July 2009) added G4EvaporationDefaultGEMFactory option 41 // V.Ivanchenko (10 May 2010) rewrited BreakItUp method: do not make new/delete 42 // photon channel first, fission second, 43 // added G4UnstableFragmentBreakUp to decay 44 // unphysical fragments (like 2n or 2p), 45 // use Z and A integer 41 46 42 47 #include "G4Evaporation.hh" … … 45 50 #include "G4EvaporationDefaultGEMFactory.hh" 46 51 #include "G4HadronicException.hh" 47 #include <numeric>52 #include "G4NistManager.hh" 48 53 49 54 G4Evaporation::G4Evaporation() 50 55 { 51 theChannelFactory = new G4EvaporationFactory(); 52 //theChannelFactory = new G4EvaporationDefaultGEMFactory(); 53 theChannels = theChannelFactory->GetChannel(); 56 //theChannelFactory = new G4EvaporationFactory(); 57 theChannelFactory = new G4EvaporationDefaultGEMFactory(); 58 InitialiseEvaporation(); 59 } 60 61 G4Evaporation::G4Evaporation(std::vector<G4VEvaporationChannel*> * aChannelsVector) 62 : theChannels(aChannelsVector), theChannelFactory(0), nChannels(0) 63 { 64 InitialiseEvaporation(); 54 65 } 55 66 56 67 G4Evaporation::~G4Evaporation() 57 68 { 58 if (theChannels != 0) theChannels = 0; 59 if (theChannelFactory != 0) delete theChannelFactory; 69 if (theChannels != 0) { theChannels = 0; } 70 if (theChannelFactory != 0) { delete theChannelFactory; } 71 } 72 73 void G4Evaporation::InitialiseEvaporation() 74 { 75 nist = G4NistManager::Instance(); 76 minExcitation = CLHEP::keV; 77 if(theChannelFactory) { theChannels = theChannelFactory->GetChannel(); } 78 nChannels = theChannels->size(); 79 probabilities.resize(nChannels, 0.0); 80 Initialise(); 81 } 82 83 void G4Evaporation::Initialise() 84 { 85 // loop over evaporation channels 86 std::vector<G4VEvaporationChannel*>::iterator i; 87 for (i=theChannels->begin(); i != theChannels->end(); ++i) 88 { 89 // for inverse cross section choice 90 (*i)->SetOPTxs(OPTxs); 91 // for superimposed Coulomb Barrier for inverse cross sections 92 (*i)->UseSICB(useSICB); 93 } 60 94 } 61 95 … … 64 98 if (theChannelFactory != 0) delete theChannelFactory; 65 99 theChannelFactory = new G4EvaporationFactory(); 66 theChannels = theChannelFactory->GetChannel();100 InitialiseEvaporation(); 67 101 } 68 102 … … 71 105 if (theChannelFactory != 0) delete theChannelFactory; 72 106 theChannelFactory = new G4EvaporationGEMFactory(); 73 theChannels = theChannelFactory->GetChannel();107 InitialiseEvaporation(); 74 108 } 75 109 … … 78 112 if (theChannelFactory != 0) delete theChannelFactory; 79 113 theChannelFactory = new G4EvaporationDefaultGEMFactory(); 80 theChannels = theChannelFactory->GetChannel(); 81 } 82 114 InitialiseEvaporation(); 115 } 83 116 84 117 G4FragmentVector * G4Evaporation::BreakItUp(const G4Fragment &theNucleus) 85 118 { 86 G4FragmentVector * theResult = new G4FragmentVector; 119 G4FragmentVector * theResult = new G4FragmentVector; 120 G4FragmentVector * theTempResult; 121 122 // The residual nucleus (after evaporation of each fragment) 123 G4Fragment* theResidualNucleus = new G4Fragment(theNucleus); 124 125 G4double totprob, prob, oldprob = 0.0; 126 G4int maxchannel, i; 127 128 G4int Amax = theResidualNucleus->GetA_asInt(); 129 130 // Starts loop over evaporated particles, loop is limited by number 131 // of nucleons 132 for(G4int ia=0; ia<Amax; ++ia) { 133 134 // g,n,p - evaporation is finished 135 G4int A = theResidualNucleus->GetA_asInt(); 136 if(1 >= A) { 137 theResult->push_back(theResidualNucleus); 138 return theResult; 139 } 140 141 // check if it is stable, then finish evaporation 142 G4int Z = theResidualNucleus->GetZ_asInt(); 143 G4double abun = nist->GetIsotopeAbundance(Z, A); 144 /* 145 G4cout << "### G4Evaporation::BreakItUp step " << ia << " Z= " << Z 146 << " A= " << A << " Eex(MeV)= " 147 << theResidualNucleus->GetExcitationEnergy() 148 << " aban= " << abun << G4endl; 149 */ 150 if(theResidualNucleus->GetExcitationEnergy() <= minExcitation && 151 (abun > 0.0)) 152 { 153 theResult->push_back(theResidualNucleus); 154 return theResult; 155 } 156 157 totprob = 0.0; 158 maxchannel = nChannels; 159 160 //G4cout << "### Evaporation loop #" << ia 161 // << " Fragment: " << theResidualNucleus << G4endl; 162 163 // loop over evaporation channels 164 for(i=0; i<nChannels; ++i) { 165 (*theChannels)[i]->Initialize(*theResidualNucleus); 166 prob = (*theChannels)[i]->GetEmissionProbability(); 167 //G4cout << " Channel# " << i << " prob= " << prob << G4endl; 168 169 //if(0 == i && 0.0 == abun) { prob = 0.0; } 170 171 totprob += prob; 172 probabilities[i] = totprob; 173 // if two recent probabilities are near zero stop computations 174 if(i>=8) { 175 if(prob <= totprob*1.e-8 && oldprob <= totprob*1.e-8) { 176 maxchannel = i+1; 177 break; 178 } 179 } 180 oldprob = prob; 181 } 182 183 // photon evaporation in the case of no other channels available 184 // do evaporation chain and reset total probability 185 if(0.0 < totprob && probabilities[0] == totprob) { 186 theTempResult = (*theChannels)[0]->BreakUpFragment(theResidualNucleus); 187 if(theTempResult) { 188 size_t nsec = theTempResult->size(); 189 for(size_t j=0; j<nsec; ++j) { 190 theResult->push_back((*theTempResult)[j]); 191 } 192 delete theTempResult; 193 } 194 totprob = 0.0; 195 } 196 197 // stable fragnent - evaporation is finished 198 if(0.0 == totprob) { 199 200 // if fragment is exotic, then try to decay it 201 if(0.0 == abun && Z < 20) { 202 //G4cout << "$$$ Decay exotic fragment" << G4endl; 203 theTempResult = unstableBreakUp.BreakUpFragment(theResidualNucleus); 204 if(theTempResult) { 205 size_t nsec = theTempResult->size(); 206 for(size_t j=0; j<nsec; ++j) { 207 theResult->push_back((*theTempResult)[j]); 208 } 209 delete theTempResult; 210 } 211 } 212 213 // save residual fragment 214 theResult->push_back(theResidualNucleus); 215 return theResult; 216 } 217 218 219 // select channel 220 totprob *= G4UniformRand(); 221 // loop over evaporation channels 222 for(i=0; i<maxchannel; ++i) { if(probabilities[i] >= totprob) { break; } } 223 224 // this should not happen 225 if(i >= nChannels) { i = nChannels - 1; } 226 227 228 // single photon evaporation, primary pointer is kept 229 if(0 == i) { 230 G4Fragment* gamma = (*theChannels)[0]->EmittedFragment(theResidualNucleus); 231 if(gamma) { theResult->push_back(gamma); } 232 233 // fission, return results to the main loop if fission is succesful 234 } else if(1 == i) { 235 theTempResult = (*theChannels)[1]->BreakUp(*theResidualNucleus); 236 if(theTempResult) { 237 size_t nsec = theTempResult->size(); 238 G4bool deletePrimary = true; 239 for(size_t j=0; j<nsec; ++j) { 240 if(theResidualNucleus == (*theTempResult)[j]) { deletePrimary = false; } 241 theResult->push_back((*theTempResult)[j]); 242 } 243 if(deletePrimary) { delete theResidualNucleus; } 244 delete theTempResult; 245 return theResult; 246 } 247 248 // other channels 249 } else { 250 theTempResult = (*theChannels)[i]->BreakUp(*theResidualNucleus); 251 if(theTempResult) { 252 size_t nsec = theTempResult->size(); 253 if(nsec > 0) { 254 --nsec; 255 for(size_t j=0; j<nsec; ++j) { 256 theResult->push_back((*theTempResult)[j]); 257 } 258 // if the residual change its pointer 259 // then delete previous residual fragment and update to the new 260 if(theResidualNucleus != (*theTempResult)[nsec] ) { 261 delete theResidualNucleus; 262 theResidualNucleus = (*theTempResult)[nsec]; 263 } 264 } 265 delete theTempResult; 266 } 267 } 268 } 269 270 // loop is stopped, save residual 271 theResult->push_back(theResidualNucleus); 272 273 #ifdef debug 274 G4cout << "======== Evaporation Conservation Test ===========\n" 275 << "==================================================\n"; 276 CheckConservation(theNucleus,theResult); 277 G4cout << "==================================================\n"; 278 #endif 279 return theResult; 280 } 281 282 /* 283 G4FragmentVector * G4Evaporation::BreakItUp(const G4Fragment &theNucleus) 284 { 285 G4FragmentVector * theResult = new G4FragmentVector; 87 286 88 287 // CHECK that Excitation Energy != 0 … … 233 432 return theResult; 234 433 } 235 434 */ 236 435 237 436 -
trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4EvaporationDefaultGEMFactory.cc
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4EvaporationDefaultGEMFactory.cc,v 1. 1 2009/07/27 10:20:13vnivanch Exp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4EvaporationDefaultGEMFactory.cc,v 1.2 2010/04/27 11:43:16 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 122 122 theChannel->reserve(68); 123 123 124 theChannel->push_back( new G4PhotonEvaporation() ); // Photon Channel 125 theChannel->push_back( new G4CompetitiveFission() ); // Fission Channel 126 124 127 // JMQ 220709 standard particle evaporation channels (Z<3,A<5) 125 128 theChannel->push_back( new G4NeutronEvaporationChannel() ); // n … … 192 195 theChannel->push_back( new G4Mg28GEMChannel() ); // Mg28 193 196 194 theChannel->push_back( new G4CompetitiveFission() ); // Fission Channel195 theChannel->push_back( new G4PhotonEvaporation() ); // Photon Channel196 197 197 return theChannel; 198 198 -
trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4EvaporationFactory.cc
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4EvaporationFactory.cc,v 1. 4 2006/06/29 20:10:29 gunterExp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4EvaporationFactory.cc,v 1.5 2010/04/27 11:43:16 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 32 32 33 33 #include "G4EvaporationFactory.hh" 34 35 34 36 35 #include "G4NeutronEvaporationChannel.hh" … … 44 43 #include "G4PhotonEvaporation.hh" 45 44 45 G4EvaporationFactory::G4EvaporationFactory() 46 {} 46 47 47 const G4EvaporationFactory & 48 G4EvaporationFactory::operator=(const G4EvaporationFactory & ) 49 { 50 throw G4HadronicException(__FILE__, __LINE__, "G4EvaporationFactory::operator= meant to not be accessable."); 51 return *this; 52 } 53 54 G4bool 55 G4EvaporationFactory::operator==(const G4EvaporationFactory & ) const 56 { 57 throw G4HadronicException(__FILE__, __LINE__, "G4EvaporationFactory::operator== meant to not be accessable."); 58 return false; 59 } 60 61 G4bool 62 G4EvaporationFactory::operator!=(const G4EvaporationFactory & ) const 63 { 64 throw G4HadronicException(__FILE__, __LINE__, "G4EvaporationFactory::operator!= meant to not be accessable."); 65 return true; 66 } 67 68 48 G4EvaporationFactory::~G4EvaporationFactory() 49 {} 69 50 70 51 std::vector<G4VEvaporationChannel*> * … … 75 56 theChannel->reserve(8); 76 57 58 theChannel->push_back( new G4PhotonEvaporation() ); // Photon Channel 59 theChannel->push_back( new G4CompetitiveFission() ); // Fission Channel 60 77 61 theChannel->push_back( new G4NeutronEvaporationChannel() ); // n 78 62 theChannel->push_back( new G4ProtonEvaporationChannel() ); // p … … 82 66 theChannel->push_back( new G4AlphaEvaporationChannel() ); // Alpha 83 67 84 theChannel->push_back( new G4CompetitiveFission() ); // Fission Channel85 theChannel->push_back( new G4PhotonEvaporation() ); // Photon Channel86 68 87 69 return theChannel; -
trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4EvaporationProbability.cc
r1055 r1315 41 41 #include "G4EvaporationProbability.hh" 42 42 #include "G4PairingCorrection.hh" 43 43 #include "G4ParticleTable.hh" 44 #include "G4IonTable.hh" 44 45 45 46 -
trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4He3EvaporationProbability.cc
r1055 r1315 221 221 ecut = (ecut-a) / (p+p); 222 222 ecut2 = ecut; 223 if (cut < 0.) ecut2 = ecut - 2.; 223 //JMQ 290310 for avoiding unphysical increase below minimum (at ecut) 224 //ecut<0 means that there is no cut with energy axis, i.e. xs is set to 0 bellow minimum 225 // if (cut < 0.) ecut2 = ecut - 2.; 226 if (cut < 0.) ecut2 = ecut; 224 227 elab = K * FragmentA / ResidualA; 225 228 sig = 0.; -
trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4ProtonEvaporationProbability.cc
r962 r1315 91 91 92 92 /////////////////////////////////////////////////////////////////////////////////// 93 //J. M. Quesada (Dec 2007-June 2008): New inverse reaction cross sections 93 //J. M. Quesada (Dec 2007-June 2008): New inverse reaction cross sections for protons 94 94 //OPT=0 Dostrovski's parameterization 95 //OPT=1,2 Chatterjee's paramaterization 96 //OPT=3,4 Kalbach's parameterization 95 //OPT=1 Chatterjee's parameterization 96 //OPT=2,4 Wellisch's parameterization 97 //OPT=3 Kalbach's parameterization 97 98 // 98 99 G4double G4ProtonEvaporationProbability::CrossSection(const G4Fragment & fragment, const G4double K) … … 110 111 FragmentAthrd=std::pow(FragmentA,0.33333); 111 112 U=fragment.GetExcitationEnergy(); 112 113 113 114 114 if (OPTxs==0) {std::ostringstream errOs; … … 223 223 // ** p from becchetti and greenlees (but modified with sub-barrier 224 224 // ** correction function and xp2 changed from -449) 225 // JMQ (june 2008) : refinement of proton cross section for light systems 226 // 225 227 226 G4double landa, landa0, landa1, mu, mu0, mu1,nu, nu0, nu1, nu2; 228 227 G4double p, p0, p1, p2; … … 279 278 ecut = (ecut-a) / (p+p); 280 279 ecut2 = ecut; 281 if (cut < 0.) ecut2 = ecut - 2.; 280 //JMQ 290310 for avoiding unphysical increase below minimum (at ecut) 281 //ecut<0 means that there is no cut with energy axis, i.e. xs is set to 0 bellow minimum 282 // if (cut < 0.) ecut2 = ecut - 2.; 283 if (cut < 0.) ecut2 = ecut; 282 284 elab = K * FragmentA / ResidualA; 283 285 sig = 0.; … … 286 288 signor2 = (ec-elab-c) / w; 287 289 signor2 = 1. + std::exp(signor2); 288 sig = sig / signor2; 289 // signor2 is empirical global corr'n at low elab for protons in PRECO, not enough for light targets 290 // refinement for proton cross section 291 if (ResidualZ<=26) 292 sig = sig*std::exp(-(a2*ResidualZ + b2)*(elab-(afit*ResidualZ+bfit)*ec)*(elab-(afit*ResidualZ+bfit)*ec)); 293 } //end for E<Ec 290 sig = sig / signor2; 291 } //end for E<=Ec 294 292 else { //start for E>Ec 295 293 sig = (landa*elab+mu+nu/elab) * signor; 296 297 // refinement for proton cross section298 if ( ResidualZ<=26 && elab <=(afit*ResidualZ+bfit)*ec)299 sig = sig*std::exp(-(a2*ResidualZ + b2)*(elab-(afit*ResidualZ+bfit)*ec)*(elab-(afit*ResidualZ+bfit)*ec));300 301 //302 294 geom = 0.; 303 295 -
trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4TritonEvaporationProbability.cc
r1055 r1315 219 219 ecut = (ecut-a) / (p+p); 220 220 ecut2 = ecut; 221 if (cut < 0.) ecut2 = ecut - 2.; 221 //JMQ 290310 for avoiding unphysical increase below minimum (at ecut) 222 //ecut<0 means that there is no cut with energy axis, i.e. xs is set to 0 bellow minimum 223 // if (cut < 0.) ecut2 = ecut - 2.; 224 if (cut < 0.) ecut2 = ecut; 222 225 elab = K * FragmentA / ResidualA; 223 226 sig = 0.; -
trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4VEvaporation.cc
r1228 r1315 24 24 // ******************************************************************** 25 25 // 26 // 27 // $Id: G4VEvaporation.cc,v 1.5 2006/06/29 20:10:49 gunter Exp $ 28 // GEANT4 tag $Name: geant4-09-03 $ 26 // $Id: G4VEvaporation.cc,v 1.7 2010/04/27 14:00:40 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 28 // 30 29 // Hadronic Process: Nuclear De-excitations … … 32 31 // 33 32 33 #include "G4VEvaporation.hh" 34 34 35 #include "G4VEvaporation.hh" 36 #include "G4HadronicException.hh" 35 G4VEvaporation::G4VEvaporation() 36 {} 37 37 38 G4VEvaporation::G4VEvaporation(const G4VEvaporation &) 39 { 40 throw G4HadronicException(__FILE__, __LINE__, "G4VEvaporation::copy_constructor meant to not be accessable"); 41 } 38 G4VEvaporation::~G4VEvaporation() 39 {} 42 40 43 44 45 46 const G4VEvaporation & G4VEvaporation::operator=(const G4VEvaporation &) 47 { 48 throw G4HadronicException(__FILE__, __LINE__, "G4VEvaporation::operator= meant to not be accessable"); 49 return *this; 50 } 51 52 53 G4bool G4VEvaporation::operator==(const G4VEvaporation &) const 54 { 55 return false; 56 } 57 58 G4bool G4VEvaporation::operator!=(const G4VEvaporation &) const 59 { 60 return true; 61 } 41 void G4VEvaporation::Initialise() 42 {} 62 43 63 44 -
trunk/source/processes/hadronic/models/de_excitation/fermi_breakup/include/G4FermiPhaseSpaceDecay.hh
r819 r1315 33 33 #include "G4LorentzVector.hh" 34 34 #include "G4ParticleMomentum.hh" 35 #include "Randomize.hh" 36 #include "G4Pow.hh" 35 37 #include <CLHEP/Random/RandGamma.h> 36 38 … … 41 43 { 42 44 public: 43 inline G4FermiPhaseSpaceDecay(); 44 inline ~G4FermiPhaseSpaceDecay(); 45 46 G4FermiPhaseSpaceDecay(); 47 ~G4FermiPhaseSpaceDecay(); 45 48 46 49 inline std::vector<G4LorentzVector*> * … … 48 51 49 52 private: 50 inline G4FermiPhaseSpaceDecay(const G4FermiPhaseSpaceDecay&); 51 inline const G4FermiPhaseSpaceDecay & operator=(const G4FermiPhaseSpaceDecay &); 52 inline G4bool operator==(const G4FermiPhaseSpaceDecay&); 53 inline G4bool operator!=(const G4FermiPhaseSpaceDecay&); 53 54 G4FermiPhaseSpaceDecay(const G4FermiPhaseSpaceDecay&); 55 const G4FermiPhaseSpaceDecay & operator=(const G4FermiPhaseSpaceDecay &); 56 G4bool operator==(const G4FermiPhaseSpaceDecay&); 57 G4bool operator!=(const G4FermiPhaseSpaceDecay&); 54 58 55 59 inline G4double PtwoBody(G4double E, G4double P1, G4double P2) const; … … 69 73 }; 70 74 71 #include "G4FermiPhaseSpaceDecay.icc" 75 inline G4double 76 G4FermiPhaseSpaceDecay::PtwoBody(G4double E, G4double P1, G4double P2) const 77 { 78 G4double res = -1.0; 79 G4double P = (E+P1+P2)*(E+P1-P2)*(E-P1+P2)*(E-P1-P2)/(4.0*E*E); 80 if (P>0.0) { res = std::sqrt(P); } 81 return res; 82 } 83 84 inline std::vector<G4LorentzVector*> * G4FermiPhaseSpaceDecay:: 85 Decay(const G4double parent_mass, const std::vector<G4double>& fragment_masses) const 86 { 87 return KopylovNBodyDecay(parent_mass,fragment_masses); 88 } 89 90 inline G4double 91 G4FermiPhaseSpaceDecay::BetaKopylov(const G4int K) const 92 { 93 //JMQ 250410 old algorithm has been commented 94 // Notice that alpha > beta always 95 // const G4double beta = 1.5; 96 // G4double alpha = 1.5*(K-1); 97 // G4double Y1 = CLHEP::RandGamma::shoot(alpha,1); 98 // G4double Y2 = CLHEP::RandGamma::shoot(beta,1); 99 100 // return Y1/(Y1+Y2); 101 102 G4Pow* g4pow = G4Pow::GetInstance(); 103 G4int N = 3*K - 5; 104 G4double xN = G4double(N); 105 G4double F; 106 //G4double Fmax = std::pow((3.*K-5.)/(3.*K-4.),(3.*K-5.)/2.)*std::sqrt(1-((3.*K-5.)/(3.*K-4.))); 107 // VI variant 108 G4double Fmax = std::sqrt(g4pow->powZ(N, xN/(xN + 1))/(xN + 1)); 109 G4double chi; 110 do 111 { 112 chi = G4UniformRand(); 113 F = std::sqrt(g4pow->powZ(N, chi)*(1-chi)); 114 } while ( Fmax*G4UniformRand() > F); 115 return chi; 116 117 } 72 118 73 119 #endif -
trunk/source/processes/hadronic/models/de_excitation/fermi_breakup/src/G4FermiConfiguration.cc
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4FermiConfiguration.cc,v 1.1 2 2009/12/16 17:51:09 gunterExp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4FermiConfiguration.cc,v 1.13 2010/04/26 11:14:28 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations 31 31 // by V. Lara (Nov 1998) 32 32 // 33 // J. M.Quesada (12 October 2009) new implementation of Gamma function in configuration weight34 33 // J. M. Quesada (12 October 2009) new implementation of Gamma function in configuration weight 34 // J. M. Quesada (09 March 2010) Kappa is set to 6. 35 35 36 36 #include "G4FermiConfiguration.hh" … … 40 40 // Kappa = V/V_0 it is used in calculation of Coulomb energy 41 41 // Kappa is adimensional 42 const G4double G4FermiConfiguration::Kappa = 1.0; 42 // JMQ 090310 according to model developer (A. Botvina) no theoretical constraint for kappa below 10 43 // kappa values larger than 1 seem to provide better results. 6 is a good choice 44 // const G4double G4FermiConfiguration::Kappa = 1.0; 45 const G4double G4FermiConfiguration::Kappa = 6.0; 43 46 44 47 // r0 is the nuclear radius -
trunk/source/processes/hadronic/models/de_excitation/fermi_breakup/src/G4FermiFragmentsPool.cc
r1196 r1315 28 28 // by V. Lara 29 29 // 30 // J.M.Quesada (JMQ)July 2009, bug fixed in excitation energies:30 // J.M.Quesada, July 2009, bug fixed in excitation energies: 31 31 // ALL of them are in MeV instead of keV (as they were expressed previously) 32 32 // source: http://www.nndc.bnl.gov/chart 33 33 // Unknown excitation energies in He5 and Li5 have been suppressed 34 34 // Long lived levels (half-lives of the order ps-fs have been included) 35 35 // 36 // J. M. Quesada, April 2010: excitation energies according to tabulated values 37 // in PhotonEvaporatoion2.0. Fake photons eliminated. 36 38 37 39 #include "G4FermiFragmentsPool.hh" … … 51 53 static const G4StableFermiFragment Fragment04( 3, 2, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment04); 52 54 static const G4StableFermiFragment Fragment05( 4, 2, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment05); 53 //JMQ 30/06/09 unknown levels have been supressed55 //JMQ 30/06/09 unknown levels have been supressed 54 56 static const G4He5FermiFragment Fragment06( 5, 2, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment06);// He5 55 57 static const G4Li5FermiFragment Fragment07( 5, 3, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment07);// Li5 56 58 static const G4StableFermiFragment Fragment08( 6, 2, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment08); 57 59 static const G4StableFermiFragment Fragment09( 6, 3, 3, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment09); 58 static const G4StableFermiFragment Fragment10( 6, 3, 1, 3.56*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment10); 60 // static const G4StableFermiFragment Fragment10( 6, 3, 1, 3.56*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment10); 61 static const G4StableFermiFragment Fragment10( 6, 3, 1, 3.562880*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment10); 59 62 static const G4StableFermiFragment Fragment11( 7, 3, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment11); 60 static const G4StableFermiFragment Fragment12( 7, 3, 2, 0.48*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment12); 63 // static const G4StableFermiFragment Fragment12( 7, 3, 2, 0.48*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment12); 64 static const G4StableFermiFragment Fragment12( 7, 3, 2, 0.4776120*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment12); 61 65 static const G4StableFermiFragment Fragment13( 7, 4, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment13); 62 static const G4StableFermiFragment Fragment14( 7, 4, 2, 0.43*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment14); 66 // static const G4StableFermiFragment Fragment14( 7, 4, 2, 0.43*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment14); 67 static const G4StableFermiFragment Fragment14( 7, 4, 2, 0.4290800*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment14); 63 68 static const G4StableFermiFragment Fragment15( 8, 3, 5, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment15); 64 static const G4StableFermiFragment Fragment16( 8, 3, 3, 0.98*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment16); 69 // static const G4StableFermiFragment Fragment16( 8, 3, 3, 0.98*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment16); 70 static const G4StableFermiFragment Fragment16( 8, 3, 3, 0.9808000*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment16); 65 71 static const G4Be8FermiFragment Fragment17( 8, 4, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment17); // Be8 66 72 static const G4StableFermiFragment Fragment18( 9, 4, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment18); 67 73 static const G4B9FermiFragment Fragment19( 9, 5, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment19); // B9 68 74 static const G4StableFermiFragment Fragment20( 10, 4, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment20); 69 static const G4StableFermiFragment Fragment21( 10, 4, 5, 3.37*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment21); 70 static const G4StableFermiFragment Fragment22( 10, 4, 8, 5.96*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment22); 71 static const G4StableFermiFragment Fragment23( 10, 4, 1, 6.18*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment23); 72 static const G4StableFermiFragment Fragment24( 10, 4, 5, 6.26*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment24); 75 // static const G4StableFermiFragment Fragment21( 10, 4, 5, 3.37*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment21); 76 static const G4StableFermiFragment Fragment21( 10, 4, 5, 3.368030*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment21); 77 // static const G4StableFermiFragment Fragment22( 10, 4, 8, 5.96*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment22); 78 static const G4StableFermiFragment Fragment22( 10, 4, 8, 5.958390*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment22); 79 // static const G4StableFermiFragment Fragment23( 10, 4, 1, 6.18*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment23); 80 static const G4StableFermiFragment Fragment23( 10, 4, 1, 6.179300*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment23); 81 // static const G4StableFermiFragment Fragment24( 10, 4, 5, 6.26*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment24); 82 static const G4StableFermiFragment Fragment24( 10, 4, 5, 6.263300*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment24); 73 83 static const G4StableFermiFragment Fragment25( 10, 5, 7, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment25); 74 static const G4StableFermiFragment Fragment26( 10, 5, 3, 0.72*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment26); 75 static const G4StableFermiFragment Fragment27( 10, 5, 1, 1.74*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment27); 76 static const G4StableFermiFragment Fragment28( 10, 5, 3, 2.15*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment28); 77 static const G4StableFermiFragment Fragment29( 10, 5, 5, 3.59*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment29); 78 84 // static const G4StableFermiFragment Fragment26( 10, 5, 3, 0.72*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment26); 85 static const G4StableFermiFragment Fragment26( 10, 5, 3, 0.7183500*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment26); 86 // static const G4StableFermiFragment Fragment27( 10, 5, 1, 1.74*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment27); 87 static const G4StableFermiFragment Fragment27( 10, 5, 1, 1.740150*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment27); 88 // static const G4StableFermiFragment Fragment28( 10, 5, 3, 2.15*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment28); 89 static const G4StableFermiFragment Fragment28( 10, 5, 3, 2.154300*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment28); 90 // static const G4StableFermiFragment Fragment29( 10, 5, 5, 3.59*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment29); 91 static const G4StableFermiFragment Fragment29( 10, 5, 5, 3.587100*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment29); 79 92 static const G4StableFermiFragment Fragment30( 10, 6, 3, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment30); 80 static const G4StableFermiFragment Fragment31( 10, 6, 5, 3.35*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment31); 93 // static const G4StableFermiFragment Fragment31( 10, 6, 5, 3.35*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment31); 94 static const G4StableFermiFragment Fragment31( 10, 6, 5, 3.353600*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment31); 81 95 static const G4StableFermiFragment Fragment32( 11, 5, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment32); 82 static const G4StableFermiFragment Fragment33( 11, 5, 2, 2.13*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment33); 83 static const G4StableFermiFragment Fragment34( 11, 5, 6, 4.44*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment34); 84 static const G4StableFermiFragment Fragment35( 11, 5, 4, 5.02*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment35); 85 static const G4StableFermiFragment Fragment36( 11, 5, 10, 6.76*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment36); 86 static const G4StableFermiFragment Fragment37( 11, 5, 6, 7.29*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment37); 87 static const G4StableFermiFragment Fragment38( 11, 5, 4, 7.98*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment38); 88 static const G4StableFermiFragment Fragment39( 11, 5, 6, 8.56*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment39); 89 90 static const G4StableFermiFragment Fragment40( 11, 6, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment40); 91 static const G4StableFermiFragment Fragment41( 11, 6, 2, 2.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment41); 92 static const G4StableFermiFragment Fragment42( 11, 6, 6, 4.32*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment42); 93 static const G4StableFermiFragment Fragment43( 11, 6, 4, 4.80*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment43); 94 static const G4StableFermiFragment Fragment44( 11, 6, 2, 6.34*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment44); 95 static const G4StableFermiFragment Fragment45( 11, 6, 8, 6.48*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment45); 96 static const G4StableFermiFragment Fragment46( 11, 6, 6, 6.90*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment46); 97 static const G4StableFermiFragment Fragment47( 11, 6, 4, 7.50*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment47); 98 static const G4StableFermiFragment Fragment48( 11, 6, 4, 8.10*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment48); 99 static const G4StableFermiFragment Fragment49( 11, 6, 6, 8.42*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment49); 100 101 static const G4StableFermiFragment Fragment50( 12, 5, 3, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment50); 102 static const G4StableFermiFragment Fragment51( 12, 5, 5, 0.95*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment51); 103 static const G4StableFermiFragment Fragment52( 12, 5, 5, 1.67*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment52); 104 static const G4StableFermiFragment Fragment53( 12, 5, 4, 2.65*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment53); 105 static const G4StableFermiFragment Fragment54( 12, 6, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment54); 106 static const G4StableFermiFragment Fragment55( 12, 6, 5, 4.44*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment55); 107 static const G4StableFermiFragment Fragment56( 13, 6, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment56); 108 static const G4StableFermiFragment Fragment57( 13, 6, 2, 3.09*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment57); 109 static const G4StableFermiFragment Fragment58( 13, 6, 4, 3.68*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment58); 110 111 static const G4StableFermiFragment Fragment59( 13, 6, 6, 3.85*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment59); 112 static const G4StableFermiFragment Fragment60( 13, 7, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment60); 113 static const G4StableFermiFragment Fragment61( 14, 6, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment61); 114 static const G4StableFermiFragment Fragment62( 14, 6, 3, 6.09*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment62); 115 // JMQ 010709 corrected excitation energies for 64-66, according to http://www.nndc.bnl.gov/chart 116 static const G4StableFermiFragment Fragment63( 14, 6, 1, 6.59*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment63); 117 static const G4StableFermiFragment Fragment64( 14, 6, 7, 6.73*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment64); 118 static const G4StableFermiFragment Fragment65( 14, 6, 1, 6.90*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment65); 119 static const G4StableFermiFragment Fragment66( 14, 6, 5, 7.01*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment66); 120 static const G4StableFermiFragment Fragment67( 14, 6, 5, 7.34*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment67); 121 122 static const G4StableFermiFragment Fragment68( 14, 7, 3, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment68); 123 static const G4StableFermiFragment Fragment69( 14, 7, 1, 2.31*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment69); 124 static const G4StableFermiFragment Fragment70( 14, 7, 3, 3.95*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment70); 125 126 static const G4StableFermiFragment Fragment71( 14, 7, 1, 4.92*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment71); 127 static const G4StableFermiFragment Fragment72( 14, 7, 5, 5.11*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment72); 128 static const G4StableFermiFragment Fragment73( 14, 7, 3, 5.69*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment73); 129 static const G4StableFermiFragment Fragment74( 14, 7, 7, 5.83*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment74); 130 static const G4StableFermiFragment Fragment75( 14, 7, 3, 6.20*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment75); 131 static const G4StableFermiFragment Fragment76( 14, 7, 7, 6.44*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment76); 132 static const G4StableFermiFragment Fragment77( 14, 7, 5, 7.03*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment77); 133 static const G4StableFermiFragment Fragment78( 15, 7, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment78); 134 // JMQ 010709 two very close levels instead of only one, with their own spins 135 static const G4StableFermiFragment Fragment79( 15, 7, 6, 5.27*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment79); 136 static const G4StableFermiFragment Fragment80( 15, 7, 2, 5.30*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment80); 137 static const G4StableFermiFragment Fragment81( 15, 7, 4, 6.32*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment81); 138 //JMQ 010709 new level and corrected energy and spins 139 static const G4StableFermiFragment Fragment82( 15, 7, 6, 7.15*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment82); 140 static const G4StableFermiFragment Fragment83( 15, 7, 4, 7.30*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment83); 141 static const G4StableFermiFragment Fragment84( 15, 7, 8, 7.57*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment84); 142 static const G4StableFermiFragment Fragment85( 15, 7, 2, 8.31*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment85); 143 static const G4StableFermiFragment Fragment86( 15, 7, 4, 8.57*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment86); 144 static const G4StableFermiFragment Fragment87( 15, 7, 2, 9.05*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment87); 145 //JMQ 010709 new levels for N15 146 static const G4StableFermiFragment Fragment88( 15, 7, 4, 9.151*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment88); 147 static const G4StableFermiFragment Fragment89( 15, 7, 6, 9.154*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment89); 148 static const G4StableFermiFragment Fragment90( 15, 7, 2, 9.22*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment90); 149 static const G4StableFermiFragment Fragment91( 15, 7, 6, 9.76*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment91); 150 static const G4StableFermiFragment Fragment92( 15, 7, 8, 9.83*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment92); 151 static const G4StableFermiFragment Fragment93( 15, 7, 4, 9.93*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment93); 152 static const G4StableFermiFragment Fragment94( 15, 7, 4, 10.07*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment94); 153 154 155 static const G4StableFermiFragment Fragment95( 15, 8, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment95); 156 //JMQ 010709 new level and spins 157 static const G4StableFermiFragment Fragment96( 15, 8, 2, 5.18*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment96); 158 static const G4StableFermiFragment Fragment97( 15, 8, 6, 5.24*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment97); 159 static const G4StableFermiFragment Fragment98( 15, 8, 4, 6.18*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment98); 160 static const G4StableFermiFragment Fragment99( 15, 8, 4, 6.79*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment99); 161 static const G4StableFermiFragment Fragment100( 15, 8, 6, 6.86*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment100); 162 static const G4StableFermiFragment Fragment101( 15, 8, 8, 7.28*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment101); 163 164 165 static const G4StableFermiFragment Fragment102( 16, 7, 5, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment102); 166 static const G4StableFermiFragment Fragment103( 16, 7, 1, 0.12*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment103); 167 static const G4StableFermiFragment Fragment104( 16, 7, 7, 0.30*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment104); 168 static const G4StableFermiFragment Fragment105( 16, 7, 3, 0.40*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment105); 169 170 //JMQ 010709 some energies and spins have been changed 171 static const G4StableFermiFragment Fragment106( 16, 8, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment106); 172 static const G4StableFermiFragment Fragment107( 16, 8, 1, 6.05*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment107); 173 static const G4StableFermiFragment Fragment108( 16, 8, 7, 6.13*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment108); 174 static const G4StableFermiFragment Fragment109( 16, 8, 5, 6.92*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment109); 175 static const G4StableFermiFragment Fragment110( 16, 8, 3, 7.12*MeV ); if(MapIsEmpty) fragment_pool.push_back 176 (&Fragment110); 96 // static const G4StableFermiFragment Fragment33( 11, 5, 2, 2.13*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment33); 97 static const G4StableFermiFragment Fragment33( 11, 5, 2, 2.124693*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment33); 98 // static const G4StableFermiFragment Fragment34( 11, 5, 6, 4.44*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment34); 99 static const G4StableFermiFragment Fragment34( 11, 5, 6, 4.444890*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment34); 100 // static const G4StableFermiFragment Fragment35( 11, 5, 4, 5.02*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment35); 101 static const G4StableFermiFragment Fragment35( 11, 5, 4, 5.020310*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment35); 102 // static const G4StableFermiFragment Fragment36( 11, 5, 10, 6.76*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment36); 103 static const G4StableFermiFragment Fragment36( 11, 5, 8, 6.742900*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment36); 104 //JMQ 190410 new level, fragment numbering shifted accordingly from here onwards 105 static const G4StableFermiFragment Fragment37( 11, 5, 2, 6.791800*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment37); 106 // static const G4StableFermiFragment Fragment37( 11, 5, 6, 7.29*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment37); 107 static const G4StableFermiFragment Fragment38( 11, 5, 6, 7.285510*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment38); 108 // static const G4StableFermiFragment Fragment38( 11, 5, 4, 7.98*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment38); 109 static const G4StableFermiFragment Fragment39( 11, 5, 4, 7.977840*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment39); 110 // static const G4StableFermiFragment Fragment39( 11, 5, 6, 8.56*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment39); 111 static const G4StableFermiFragment Fragment40( 11, 5, 6, 8.560300*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment40); 112 static const G4StableFermiFragment Fragment41( 11, 6, 4, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment41); 113 static const G4StableFermiFragment Fragment42( 11, 6, 2, 2.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment42); 114 // static const G4StableFermiFragment Fragment42( 11, 6, 6, 4.32*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment42); 115 static const G4StableFermiFragment Fragment43( 11, 6, 6, 4.318800*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment43); 116 // static const G4StableFermiFragment Fragment43( 11, 6, 4, 4.80*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment43); 117 static const G4StableFermiFragment Fragment44( 11, 6, 4, 4.804200*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment44); 118 // static const G4StableFermiFragment Fragment44( 11, 6, 2, 6.34*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment44); 119 static const G4StableFermiFragment Fragment45( 11, 6, 2, 6.339200*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment45); 120 // static const G4StableFermiFragment Fragment45( 11, 6, 8, 6.48*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment45); 121 static const G4StableFermiFragment Fragment46( 11, 6, 8, 6.478200*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment46); 122 // static const G4StableFermiFragment Fragment46( 11, 6, 6, 6.90*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment46); 123 static const G4StableFermiFragment Fragment47( 11, 6, 6, 6.904800*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment47); 124 // static const G4StableFermiFragment Fragment47( 11, 6, 4, 7.50*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment47); 125 static const G4StableFermiFragment Fragment48( 11, 6, 4, 7.499700*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment48); 126 // static const G4StableFermiFragment Fragment48( 11, 6, 4, 8.10*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment48); 127 static const G4StableFermiFragment Fragment49( 11, 6, 4, 8.104500*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment49); 128 // static const G4StableFermiFragment Fragment49( 11, 6, 6, 8.42*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment49); 129 static const G4StableFermiFragment Fragment50( 11, 6, 6, 8.420000*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment50); 130 static const G4StableFermiFragment Fragment51( 12, 5, 3, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment51); 131 // static const G4StableFermiFragment Fragment51( 12, 5, 5, 0.95*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment51); 132 static const G4StableFermiFragment Fragment52( 12, 5, 5, 0.9531400*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment52); 133 // static const G4StableFermiFragment Fragment52( 12, 5, 5, 1.67*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment52); 134 static const G4StableFermiFragment Fragment53( 12, 5, 5, 1.673650*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment53); 135 // static const G4StableFermiFragment Fragment53( 12, 5, 4, 2.65*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment53); 136 static const G4StableFermiFragment Fragment54( 12, 5, 3, 2.620800*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment54); 137 static const G4StableFermiFragment Fragment55( 12, 6, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment55); 138 // static const G4StableFermiFragment Fragment55( 12, 6, 5, 4.44*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment55); 139 static const G4StableFermiFragment Fragment56( 12, 6, 5, 4.438910*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment56); 140 static const G4StableFermiFragment Fragment57( 13, 6, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment57); 141 // static const G4StableFermiFragment Fragment57( 13, 6, 2, 3.09*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment57); 142 static const G4StableFermiFragment Fragment58( 13, 6, 2, 3.089443*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment58); 143 // static const G4StableFermiFragment Fragment58( 13, 6, 4, 3.68*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment58); 144 static const G4StableFermiFragment Fragment59( 13, 6, 4, 3.684507*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment59); 145 // static const G4StableFermiFragment Fragment59( 13, 6, 6, 3.85*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment59); 146 static const G4StableFermiFragment Fragment60( 13, 6, 6, 3.853807*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment60); 147 static const G4StableFermiFragment Fragment61( 13, 7, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment61); 148 static const G4StableFermiFragment Fragment62( 14, 6, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment62); 149 // static const G4StableFermiFragment Fragment62( 14, 6, 3, 6.09*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment62); 150 static const G4StableFermiFragment Fragment63( 14, 6, 3, 6.093800*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment63); 151 // JMQ 010709 corrected excitation energies for 64-66, according to http://www.nndc.bnl.gov/chart 152 // static const G4StableFermiFragment Fragment63( 14, 6, 1, 6.59*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment63); 153 static const G4StableFermiFragment Fragment64( 14, 6, 1, 6.589400*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment64); 154 // static const G4StableFermiFragment Fragment64( 14, 6, 7, 6.73*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment64); 155 static const G4StableFermiFragment Fragment65( 14, 6, 7, 6.728200*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment65); 156 // static const G4StableFermiFragment Fragment65( 14, 6, 1, 6.90*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment65); 157 static const G4StableFermiFragment Fragment66( 14, 6, 1, 6.902600*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment66); 158 // static const G4StableFermiFragment Fragment66( 14, 6, 5, 7.01*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment66); 159 static const G4StableFermiFragment Fragment67( 14, 6, 5, 7.012000*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment67); 160 // static const G4StableFermiFragment Fragment67( 14, 6, 5, 7.34*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment67); 161 static const G4StableFermiFragment Fragment68( 14, 6, 5, 7.341000*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment68); 162 163 static const G4StableFermiFragment Fragment69( 14, 7, 3, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment69); 164 // static const G4StableFermiFragment Fragment69( 14, 7, 1, 2.31*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment69); 165 static const G4StableFermiFragment Fragment70( 14, 7, 1, 2.312798*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment70); 166 // static const G4StableFermiFragment Fragment70( 14, 7, 3, 3.95*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment70); 167 static const G4StableFermiFragment Fragment71( 14, 7, 3, 3.948100*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment71); 168 // static const G4StableFermiFragment Fragment71( 14, 7, 1, 4.92*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment71); 169 static const G4StableFermiFragment Fragment72( 14, 7, 1, 4.915100*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment72); 170 // static const G4StableFermiFragment Fragment72( 14, 7, 5, 5.11*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment72); 171 static const G4StableFermiFragment Fragment73( 14, 7, 5, 5.105890*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment73); 172 // static const G4StableFermiFragment Fragment73( 14, 7, 3, 5.69*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment73); 173 static const G4StableFermiFragment Fragment74( 14, 7, 3, 5.691440*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment74); 174 // static const G4StableFermiFragment Fragment74( 14, 7, 7, 5.83*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment74); 175 static const G4StableFermiFragment Fragment75( 14, 7, 7, 5.834250*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment75); 176 // static const G4StableFermiFragment Fragment75( 14, 7, 3, 6.20*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment75); 177 static const G4StableFermiFragment Fragment76( 14, 7, 3, 6.203500*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment76); 178 // static const G4StableFermiFragment Fragment76( 14, 7, 7, 6.44*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment76); 179 static const G4StableFermiFragment Fragment77( 14, 7, 7, 6.446170*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment77); 180 // static const G4StableFermiFragment Fragment77( 14, 7, 5, 7.03*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment77); 181 static const G4StableFermiFragment Fragment78( 14, 7, 5, 7.029120*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment78); 182 static const G4StableFermiFragment Fragment79( 15, 7, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment79); 183 // JMQ 010709 two very close levels instead of only one, with their own spins 184 // static const G4StableFermiFragment Fragment79( 15, 7, 6, 5.27*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment79); 185 static const G4StableFermiFragment Fragment80( 15, 7, 6, 5.270155*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment80); 186 // static const G4StableFermiFragment Fragment80( 15, 7, 2, 5.30*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment80); 187 static const G4StableFermiFragment Fragment81( 15, 7, 2, 5.298822*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment81); 188 // static const G4StableFermiFragment Fragment81( 15, 7, 4, 6.32*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment81); 189 static const G4StableFermiFragment Fragment82( 15, 7, 4, 6.323780*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment82); 190 //JMQ 010709 new level and corrected energy and spins 191 // static const G4StableFermiFragment Fragment82( 15, 7, 6, 7.15*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment82); 192 static const G4StableFermiFragment Fragment83( 15, 7, 6, 7.155050*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment83); 193 // static const G4StableFermiFragment Fragment83( 15, 7, 4, 7.30*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment83); 194 static const G4StableFermiFragment Fragment84( 15, 7, 4, 7.300830*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment84); 195 // static const G4StableFermiFragment Fragment84( 15, 7, 8, 7.57*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment84); 196 static const G4StableFermiFragment Fragment85( 15, 7, 8, 7.567100*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment85); 197 // static const G4StableFermiFragment Fragment85( 15, 7, 2, 8.31*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment85); 198 static const G4StableFermiFragment Fragment86( 15, 7, 2, 8.312620*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment86); 199 // static const G4StableFermiFragment Fragment86( 15, 7, 4, 8.57*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment86); 200 static const G4StableFermiFragment Fragment87( 15, 7, 4, 8.571400*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment87); 201 // static const G4StableFermiFragment Fragment87( 15, 7, 2, 9.05*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment87); 202 static const G4StableFermiFragment Fragment88( 15, 7, 2, 9.049710*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment88); 203 //JMQ 010709 new levels for N15 204 // static const G4StableFermiFragment Fragment88( 15, 7, 4, 9.151*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment88); 205 static const G4StableFermiFragment Fragment89( 15, 7, 4, 9.151900*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment89); 206 // static const G4StableFermiFragment Fragment89( 15, 7, 6, 9.154*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment89); 207 static const G4StableFermiFragment Fragment90( 15, 7, 6, 9.154900*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment90); 208 // static const G4StableFermiFragment Fragment90( 15, 7, 2, 9.22*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment90); 209 static const G4StableFermiFragment Fragment91( 15, 7, 2, 9.222100*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment91); 210 // static const G4StableFermiFragment Fragment91( 15, 7, 6, 9.76*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment91); 211 static const G4StableFermiFragment Fragment92( 15, 7, 6, 9.760000*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment92); 212 // static const G4StableFermiFragment Fragment92( 15, 7, 8, 9.83*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment92); 213 static const G4StableFermiFragment Fragment93( 15, 7, 8, 9.829000*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment93); 214 // static const G4StableFermiFragment Fragment93( 15, 7, 4, 9.93*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment93); 215 static const G4StableFermiFragment Fragment94( 15, 7, 4, 9.925000*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment94); 216 // static const G4StableFermiFragment Fragment94( 15, 7, 4, 10.07*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment94); 217 static const G4StableFermiFragment Fragment95( 15, 7, 4, 10.06600*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment95); 218 219 static const G4StableFermiFragment Fragment96( 15, 8, 2, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment96); 220 //JMQ 010709 new level and spins 221 // static const G4StableFermiFragment Fragment96( 15, 8, 2, 5.18*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment96); 222 static const G4StableFermiFragment Fragment97( 15, 8, 2, 5.183000*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment97); 223 // static const G4StableFermiFragment Fragment97( 15, 8, 6, 5.24*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment97); 224 static const G4StableFermiFragment Fragment98( 15, 8, 6, 5.240900*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment98); 225 // static const G4StableFermiFragment Fragment98( 15, 8, 4, 6.18*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment98); 226 static const G4StableFermiFragment Fragment99( 15, 8, 4, 6.176300*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment99); 227 // static const G4StableFermiFragment Fragment99( 15, 8, 4, 6.79*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment99); 228 static const G4StableFermiFragment Fragment100( 15, 8, 4, 6.793100*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment100); 229 // static const G4StableFermiFragment Fragment100( 15, 8, 6, 6.86*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment100); 230 static const G4StableFermiFragment Fragment101( 15, 8, 6, 6.859400*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment101); 231 // static const G4StableFermiFragment Fragment101( 15, 8, 8, 7.28*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment101); 232 static const G4StableFermiFragment Fragment102( 15, 8, 8, 7.275900*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment102); 233 234 235 static const G4StableFermiFragment Fragment103( 16, 7, 5, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment103); 236 // static const G4StableFermiFragment Fragment103( 16, 7, 1, 0.12*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment103); 237 static const G4StableFermiFragment Fragment104( 16, 7, 1, 0.1204200*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment104); 238 // static const G4StableFermiFragment Fragment104( 16, 7, 7, 0.30*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment104); 239 static const G4StableFermiFragment Fragment105( 16, 7, 7, 0.2982200*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment105); 240 // static const G4StableFermiFragment Fragment105( 16, 7, 3, 0.40*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment105); 241 static const G4StableFermiFragment Fragment106( 16, 7, 3, 0.3972700*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment106); 242 243 //JMQ 010709 some energies and spins have been changed 244 static const G4StableFermiFragment Fragment107( 16, 8, 1, 0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment107); 245 // static const G4StableFermiFragment Fragment107( 16, 8, 1, 6.05*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment107); 246 static const G4StableFermiFragment Fragment108( 16, 8, 1, 6.049400*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment108); 247 // static const G4StableFermiFragment Fragment108( 16, 8, 7, 6.13*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment108); 248 static const G4StableFermiFragment Fragment109( 16, 8, 7, 6.129890*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment109); 249 // static const G4StableFermiFragment Fragment109( 16, 8, 5, 6.92*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment109); 250 static const G4StableFermiFragment Fragment110( 16, 8, 5, 6.917100*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment110); 251 // static const G4StableFermiFragment Fragment110( 16, 8, 3, 7.12*MeV ); if(MapIsEmpty) fragment_pool.push_back 252 //JMQ 180510 fixed fragment 111 253 static const G4StableFermiFragment Fragment111( 16, 8, 3, 7.116850*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment111); 177 254 178 255 static std::multimap<const std::pair<G4int,G4int>, const G4VFermiFragment* , std::less<const std::pair<G4int,G4int> > > 179 256 theMapOfFragments; 180 257 181 258 if (MapIsEmpty) 182 259 { 183 260 for(size_t i=0; i<fragment_pool.size(); i++) 184 185 186 const G4VFermiFragment* >(std::pair<G4int,G4int>(fragment_pool[i]->GetA(),261 { 262 theMapOfFragments.insert(std::pair<const std::pair<G4int,G4int>, 263 const G4VFermiFragment* >(std::pair<G4int,G4int>(fragment_pool[i]->GetA(), 187 264 fragment_pool[i]->GetZ()),fragment_pool[i])); 188 265 } 189 266 MapIsEmpty = false; 190 267 } -
trunk/source/processes/hadronic/models/de_excitation/fermi_breakup/src/G4FermiPhaseSpaceDecay.cc
r819 r1315 37 37 #include <functional> 38 38 39 G4FermiPhaseSpaceDecay::G4FermiPhaseSpaceDecay() 40 { 41 } 42 43 G4FermiPhaseSpaceDecay::~G4FermiPhaseSpaceDecay() 44 { 45 } 39 46 40 47 std::vector<G4LorentzVector*> * -
trunk/source/processes/hadronic/models/de_excitation/fission/include/G4FissionBarrier.hh
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4FissionBarrier.hh,v 1. 3 2006/06/29 20:13:21 gunterExp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4FissionBarrier.hh,v 1.5 2009/12/16 16:50:07 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations -
trunk/source/processes/hadronic/models/de_excitation/fission/src/G4CompetitiveFission.cc
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4CompetitiveFission.cc,v 1.1 1 2009/03/13 18:57:17vnivanch Exp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4CompetitiveFission.cc,v 1.12 2010/05/03 16:49:19 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 38 38 #include "G4CompetitiveFission.hh" 39 39 #include "G4PairingCorrection.hh" 40 #include "G4ParticleMomentum.hh" 40 41 41 42 G4CompetitiveFission::G4CompetitiveFission() : G4VEvaporationChannel("fission") -
trunk/source/processes/hadronic/models/de_excitation/fission/src/G4FissionBarrier.cc
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4FissionBarrier.cc,v 1. 5 2006/06/29 20:13:35 gunterExp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4FissionBarrier.cc,v 1.7 2009/12/16 16:50:07 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations -
trunk/source/processes/hadronic/models/de_excitation/gem_evaporation/include/G4EvaporationGEMFactory.hh
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4EvaporationGEMFactory.hh,v 1. 7 2009/09/15 12:54:16 vnivanch Exp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4EvaporationGEMFactory.hh,v 1.8 2010/04/27 11:43:16 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 41 41 { 42 42 public: 43 G4EvaporationGEMFactory() {}44 virtual ~G4EvaporationGEMFactory() {}43 G4EvaporationGEMFactory(); 44 virtual ~G4EvaporationGEMFactory(); 45 45 46 46 private: 47 G4EvaporationGEMFactory(const G4EvaporationGEMFactory & ) : G4VEvaporationFactory() {}47 G4EvaporationGEMFactory(const G4EvaporationGEMFactory & ); 48 48 const G4EvaporationGEMFactory & operator=(const G4EvaporationGEMFactory & val); 49 49 G4bool operator==(const G4EvaporationGEMFactory & val) const; -
trunk/source/processes/hadronic/models/de_excitation/gem_evaporation/include/G4GEMProbability.hh
r819 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4GEMProbability.hh,v 1.4 2010/05/19 10:21:16 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 28 // 29 //--------------------------------------------------------------------- 30 // 31 // Geant4 header G4GEMProbability 26 32 // 27 33 // … … 29 35 // by V. Lara (Sept 2001) 30 36 // 31 32 37 // 18.05.2010 V.Ivanchenko trying to speedup the most slow method 38 // by usage of G4Pow, integer Z and A; moved constructor, 39 // destructor and virtual functions to source 40 // 33 41 34 42 #ifndef G4GEMProbability_h … … 42 50 #include "G4PairingCorrection.hh" 43 51 52 class G4Pow; 53 44 54 class G4GEMProbability : public G4VEmissionProbability 45 55 { 46 56 public: 47 // Only available constructor 48 G4GEMProbability(const G4int anA, const G4int aZ, const G4double aSpin) : 49 theA(anA), theZ(aZ), Spin(aSpin), theCoulombBarrierPtr(0), 50 ExcitationEnergies(0), ExcitationSpins(0), ExcitationLifetimes(0), Normalization(1.0) 51 { 52 theEvapLDPptr = new G4EvaporationLevelDensityParameter; 53 } 57 58 // Default constructor - should not be used 59 G4GEMProbability(); 60 61 // Only available constructor 62 G4GEMProbability(const G4int anA, const G4int aZ, const G4double aSpin); 54 63 55 ~G4GEMProbability() 56 { 57 if (theEvapLDPptr != 0) delete theEvapLDPptr; 58 } 64 virtual ~G4GEMProbability(); 59 65 66 inline G4int GetZ_asInt(void) const { return theZ; } 67 68 inline G4int GetA_asInt(void) const { return theA;} 69 70 inline G4double GetZ(void) const { return theZ; } 71 72 inline G4double GetA(void) const { return theA;} 60 73 61 62 G4double GetZ(void) const { return theZ; } 63 64 G4double GetA(void) const { return theA;} 74 inline G4double GetSpin(void) const { return Spin; } 65 75 66 G4double GetSpin(void) const { return Spin; } 76 inline G4double GetNormalization(void) const { return Normalization; } 77 78 inline void SetCoulomBarrier(const G4VCoulombBarrier * aCoulombBarrierStrategy) 79 { 80 theCoulombBarrierPtr = aCoulombBarrierStrategy; 81 } 67 82 68 G4double GetNormalization(void) const { return Normalization; } 83 inline G4double GetCoulombBarrier(const G4Fragment& fragment) const 84 { 85 G4double res = 0.0; 86 if (theCoulombBarrierPtr) 87 { 88 G4int Acomp = fragment.GetA_asInt(); 89 G4int Zcomp = fragment.GetZ_asInt(); 90 res = theCoulombBarrierPtr->GetCoulombBarrier(Acomp-theA, Zcomp-theZ, 91 fragment.GetExcitationEnergy()-fPairCorr->GetPairingCorrection(Acomp,Zcomp)); 92 } 93 return res; 94 } 69 95 70 void SetCoulomBarrier(const G4VCoulombBarrier * aCoulombBarrierStrategy) 71 { 72 theCoulombBarrierPtr = aCoulombBarrierStrategy; 73 } 74 75 G4double GetCoulombBarrier(const G4Fragment& fragment) const 76 { 77 if (theCoulombBarrierPtr) 78 { 79 G4int Acompound = static_cast<G4int>(fragment.GetA()); 80 G4int Zcompound = static_cast<G4int>(fragment.GetZ()); 81 return theCoulombBarrierPtr->GetCoulombBarrier(Acompound-theA, Zcompound-theZ, 82 fragment.GetExcitationEnergy()- 83 G4PairingCorrection::GetInstance()-> 84 GetPairingCorrection(Acompound,Zcompound)); 85 } 86 else 87 { 88 return 0.0; 89 } 90 } 91 92 93 virtual G4double CalcAlphaParam(const G4Fragment & ) const {return 1.0;} 94 virtual G4double CalcBetaParam(const G4Fragment & ) const {return 1.0;} 96 virtual G4double CalcAlphaParam(const G4Fragment & ) const; 97 virtual G4double CalcBetaParam(const G4Fragment & ) const; 95 98 96 99 protected: 97 100 98 99 100 101 101 inline void SetExcitationEnergiesPtr(std::vector<G4double> * anExcitationEnergiesPtr) 102 { 103 ExcitationEnergies = anExcitationEnergiesPtr; 104 } 102 105 103 104 105 106 106 inline void SetExcitationSpinsPtr(std::vector<G4double> * anExcitationSpinsPtr) 107 { 108 ExcitationSpins = anExcitationSpinsPtr; 109 } 107 110 108 109 110 111 111 inline void SetExcitationLifetimesPtr(std::vector<G4double> * anExcitationLifetimesPtr) 112 { 113 ExcitationLifetimes = anExcitationLifetimesPtr; 114 } 112 115 113 114 115 116 116 inline void SetCoulombBarrierStrategy(G4VCoulombBarrier * aCoulombBarrier) 117 { 118 theCoulombBarrierPtr = aCoulombBarrier; 119 } 117 120 118 119 // Default constructor120 G4GEMProbability() {}121 121 private: 122 // Copy constructor 123 G4GEMProbability(const G4GEMProbability &right); 122 123 // Copy constructor 124 G4GEMProbability(const G4GEMProbability &right); 124 125 125 126 127 126 const G4GEMProbability & operator=(const G4GEMProbability &right); 127 G4bool operator==(const G4GEMProbability &right) const; 128 G4bool operator!=(const G4GEMProbability &right) const; 128 129 129 130 public: 130 G4double EmissionProbability(const G4Fragment & fragment, const G4double anEnergy); 131 132 G4double EmissionProbability(const G4Fragment & fragment, const G4double anEnergy); 131 133 132 134 private: 133 135 134 G4double CalcProbability(const G4Fragment & fragment, const G4double MaximalKineticEnergy, 135 const G4double V); 136 virtual G4double CCoeficient(const G4double ) const {return 0.0;}; 136 G4double CalcProbability(const G4Fragment & fragment, const G4double MaximalKineticEnergy, 137 const G4double V); 137 138 139 virtual G4double CCoeficient(const G4double ) const; 140 141 inline G4double I0(const G4double t); 142 inline G4double I1(const G4double t, const G4double tx); 143 inline G4double I2(const G4double s, const G4double sx); 144 G4double I3(const G4double s, const G4double sx); 138 145 139 G4double I0(const G4double t);140 G4double I1(const G4double t, const G4double tx); 141 G4double I2(const G4double s, const G4double sx);142 G4double I3(const G4double s, const G4double sx);146 // Data Members 147 148 G4Pow* fG4pow; 149 G4PairingCorrection* fPairCorr; 143 150 144 // Data Members 151 G4VLevelDensityParameter * theEvapLDPptr; 152 153 G4int theA; 154 G4int theZ; 145 155 146 G4VLevelDensityParameter * theEvapLDPptr; 147 148 G4int theA; 149 G4int theZ; 156 // Spin is fragment spin 157 G4double Spin; 158 159 // Coulomb Barrier 160 const G4VCoulombBarrier * theCoulombBarrierPtr; 161 162 // Resonances Energy 163 std::vector<G4double> * ExcitationEnergies; 150 164 151 // Spin is fragment spin152 G4double Spin;165 // Resonances Spin 166 std::vector<G4double> * ExcitationSpins; 153 167 154 // Coulomb Barrier155 const G4VCoulombBarrier * theCoulombBarrierPtr;168 // Resonances half lifetime 169 std::vector<G4double> * ExcitationLifetimes; 156 170 157 158 // Resonances Energy 159 std::vector<G4double> * ExcitationEnergies; 160 161 // Resonances Spin 162 std::vector<G4double> * ExcitationSpins; 163 164 // Resonances half lifetime 165 std::vector<G4double> * ExcitationLifetimes; 166 167 168 // Normalization 169 G4double Normalization; 171 // Normalization 172 G4double Normalization; 170 173 171 174 }; 172 175 176 inline G4double G4GEMProbability::I0(const G4double t) 177 { 178 return std::exp(t) - 1.0; 179 } 180 181 inline G4double G4GEMProbability::I1(const G4double t, const G4double tx) 182 { 183 return (t - tx + 1.0)*std::exp(tx) - t - 1.0; 184 } 185 186 187 inline G4double G4GEMProbability::I2(const G4double s, const G4double sx) 188 { 189 G4double S = 1.0/std::sqrt(s); 190 G4double Sx = 1.0/std::sqrt(sx); 191 192 G4double p1 = S*S*S*( 1.0 + S*S*( 1.5 + 3.75*S*S) ); 193 G4double p2 = Sx*Sx*Sx*( 1.0 + Sx*Sx*( 1.5 + 3.75*Sx*Sx) )*std::exp(sx-s); 194 195 return p1-p2; 196 } 197 173 198 174 199 #endif -
trunk/source/processes/hadronic/models/de_excitation/gem_evaporation/src/G4EvaporationGEMFactory.cc
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4EvaporationGEMFactory.cc,v 1. 9 2009/09/15 12:54:16 vnivanch Exp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4EvaporationGEMFactory.cc,v 1.10 2010/04/27 11:43:16 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 103 103 #include "G4PhotonEvaporation.hh" 104 104 105 const G4EvaporationGEMFactory & 106 G4EvaporationGEMFactory::operator=(const G4EvaporationGEMFactory & ) 107 { 108 throw G4HadronicException(__FILE__, __LINE__, "G4EvaporationGEMFactory::operator= meant to not be accessable."); 109 return *this; 110 } 111 112 G4bool 113 G4EvaporationGEMFactory::operator==(const G4EvaporationGEMFactory & ) const 114 { 115 throw G4HadronicException(__FILE__, __LINE__, "G4EvaporationGEMFactory::operator== meant to not be accessable."); 116 return false; 117 } 118 119 G4bool 120 G4EvaporationGEMFactory::operator!=(const G4EvaporationGEMFactory & ) const 121 { 122 throw G4HadronicException(__FILE__, __LINE__, "G4EvaporationGEMFactory::operator!= meant to not be accessable."); 123 return true; 124 } 105 G4EvaporationGEMFactory::G4EvaporationGEMFactory() 106 {} 107 108 G4EvaporationGEMFactory::~G4EvaporationGEMFactory() 109 {} 125 110 126 111 std::vector<G4VEvaporationChannel*> * G4EvaporationGEMFactory::CreateChannel() … … 129 114 new std::vector<G4VEvaporationChannel*>; 130 115 theChannel->reserve(68); 116 117 theChannel->push_back( new G4PhotonEvaporation() ); // Photon Channel 118 theChannel->push_back( new G4CompetitiveFission() ); // Fission Channel 131 119 132 120 theChannel->push_back( new G4NeutronGEMChannel() ); // n … … 197 185 theChannel->push_back( new G4Mg28GEMChannel() ); // Mg28 198 186 199 theChannel->push_back( new G4CompetitiveFission() ); // Fission Channel200 theChannel->push_back( new G4PhotonEvaporation() ); // Photon Channel201 202 187 return theChannel; 203 188 } -
trunk/source/processes/hadronic/models/de_excitation/gem_evaporation/src/G4GEMProbability.cc
r1196 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4GEMProbability.cc,v 1.13 2010/05/19 10:21:16 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 28 // 29 //--------------------------------------------------------------------- 30 // 31 // Geant4 class G4GEMProbability 32 // 33 // 34 // Hadronic Process: Nuclear De-excitations 35 // by V. Lara (Sept 2001) 26 36 // 27 37 // … … 35 45 // -InitialLeveldensity calculated according to the right conditions of the 36 46 // initial excited nucleus. 47 // J. M. Quesada 19/04/2010 fix in emission probability calculation. 48 // V.Ivanchenko 20/04/2010 added usage of G4Pow and use more safe computation 49 // V.Ivanchenko 18/05/2010 trying to speedup the most slow method 50 // by usage of G4Pow, integer Z and A; moved constructor, 51 // destructor and virtual functions to source 37 52 38 53 #include "G4GEMProbability.hh" 39 54 #include "G4PairingCorrection.hh" 40 41 42 43 G4GEMProbability::G4GEMProbability(const G4GEMProbability &) : G4VEmissionProbability() 44 { 45 throw G4HadronicException(__FILE__, __LINE__, "G4GEMProbability::copy_constructor meant to not be accessable"); 46 } 47 48 49 50 51 const G4GEMProbability & G4GEMProbability:: 52 operator=(const G4GEMProbability &) 53 { 54 throw G4HadronicException(__FILE__, __LINE__, "G4GEMProbability::operator= meant to not be accessable"); 55 return *this; 56 } 57 58 59 G4bool G4GEMProbability::operator==(const G4GEMProbability &) const 60 { 61 return false; 62 } 63 64 G4bool G4GEMProbability::operator!=(const G4GEMProbability &) const 65 { 66 return true; 55 #include "G4Pow.hh" 56 #include "G4IonTable.hh" 57 58 G4GEMProbability:: G4GEMProbability() : 59 theA(0), theZ(0), Spin(0.0), theCoulombBarrierPtr(0), 60 ExcitationEnergies(0), ExcitationSpins(0), ExcitationLifetimes(0), Normalization(1.0) 61 { 62 theEvapLDPptr = new G4EvaporationLevelDensityParameter; 63 fG4pow = G4Pow::GetInstance(); 64 fPairCorr = G4PairingCorrection::GetInstance(); 65 } 66 67 G4GEMProbability:: G4GEMProbability(const G4int anA, const G4int aZ, const G4double aSpin) : 68 theA(anA), theZ(aZ), Spin(aSpin), theCoulombBarrierPtr(0), 69 ExcitationEnergies(0), ExcitationSpins(0), ExcitationLifetimes(0), Normalization(1.0) 70 { 71 theEvapLDPptr = new G4EvaporationLevelDensityParameter; 72 fG4pow = G4Pow::GetInstance(); 73 fPairCorr = G4PairingCorrection::GetInstance(); 74 } 75 76 G4GEMProbability::~G4GEMProbability() 77 { 78 delete theEvapLDPptr; 79 } 80 81 G4double G4GEMProbability::CalcAlphaParam(const G4Fragment & ) const 82 { 83 return 1.0; 84 } 85 86 G4double G4GEMProbability::CalcBetaParam(const G4Fragment & ) const 87 { 88 return 1.0; 89 } 90 91 G4double G4GEMProbability::CCoeficient(const G4double ) const 92 { 93 return 0.0; 67 94 } 68 95 … … 80 107 if (ExcitationEnergies && ExcitationSpins && ExcitationLifetimes) { 81 108 G4double SavedSpin = Spin; 82 for ( unsigned int i = 0; i < ExcitationEnergies->size(); i++) {109 for (size_t i = 0; i < ExcitationEnergies->size(); ++i) { 83 110 Spin = ExcitationSpins->operator[](i); 84 111 // substract excitation energies … … 86 113 if (Tmax > 0.0) { 87 114 G4double width = CalcProbability(fragment,Tmax,CoulombBarrier); 115 //JMQ April 2010 added condition to prevent reported crash 88 116 // update probability 89 if (hbar_Planck*std::log(2.0)/width < ExcitationLifetimes->operator[](i)) { 117 if (width > 0. && 118 hbar_Planck*fG4pow->logZ(2) < width*ExcitationLifetimes->operator[](i)) { 90 119 EmissionProbability += width; 91 120 } … … 98 127 return EmissionProbability; 99 128 } 129 130 131 G4double G4GEMProbability::CalcProbability(const G4Fragment & fragment, 132 const G4double MaximalKineticEnergy, 133 const G4double V) 134 135 // Calculate integrated probability (width) for evaporation channel 136 { 137 G4int A = fragment.GetA_asInt(); 138 G4int Z = fragment.GetZ_asInt(); 139 140 G4int ResidualA = A - theA; 141 G4int ResidualZ = Z - theZ; 142 G4double U = fragment.GetExcitationEnergy(); 143 144 G4double NuclearMass = fragment.ComputeGroundStateMass(theZ, theA); 145 146 G4double Alpha = CalcAlphaParam(fragment); 147 G4double Beta = CalcBetaParam(fragment); 148 149 150 // ***RESIDUAL*** 151 //JMQ (September 2009) the following quantities refer to the RESIDUAL: 152 153 G4double delta0 = fPairCorr->GetPairingCorrection(ResidualA, ResidualZ); 154 155 G4double a = theEvapLDPptr->LevelDensityParameter(ResidualA, 156 ResidualZ,MaximalKineticEnergy+V-delta0); 157 G4double Ux = (2.5 + 150.0/G4double(ResidualA))*MeV; 158 G4double Ex = Ux + delta0; 159 G4double T = 1.0/(std::sqrt(a/Ux) - 1.5/Ux); 160 //JMQ fixed bug in units 161 G4double E0 = Ex - T*(std::log(T/MeV) - std::log(a*MeV)/4.0 - 1.25*std::log(Ux/MeV) + 2.0*std::sqrt(a*Ux)); 162 // ***end RESIDUAL *** 163 164 // ***PARENT*** 165 //JMQ (September 2009) the following quantities refer to the PARENT: 166 167 G4double deltaCN=fPairCorr->GetPairingCorrection(A, Z); 168 G4double aCN = theEvapLDPptr->LevelDensityParameter(A, Z, U-deltaCN); 169 G4double UxCN = (2.5 + 150.0/G4double(A))*MeV; 170 G4double ExCN = UxCN + deltaCN; 171 G4double TCN = 1.0/(std::sqrt(aCN/UxCN) - 1.5/UxCN); 172 //JMQ fixed bug in units 173 G4double E0CN = ExCN - TCN*(std::log(TCN/MeV) - std::log(aCN*MeV)/4.0 - 1.25*std::log(UxCN/MeV) + 2.0*std::sqrt(aCN*UxCN)); 174 // ***end PARENT*** 175 176 G4double Width; 177 G4double InitialLevelDensity; 178 G4double t = MaximalKineticEnergy/T; 179 if ( MaximalKineticEnergy < Ex ) { 180 //JMQ 190709 bug in I1 fixed (T was missing) 181 Width = (I1(t,t)*T + (Beta+V)*I0(t))/std::exp(E0/T); 182 //JMQ 160909 fix: InitialLevelDensity has been taken away 183 //(different conditions for initial CN..) 184 } else { 185 186 //VI minor speedup 187 G4double expE0T = std::exp(E0/T); 188 const G4double sqrt2 = std::sqrt(2.0); 189 190 G4double tx = Ex/T; 191 G4double s = 2.0*std::sqrt(a*(MaximalKineticEnergy-delta0)); 192 G4double sx = 2.0*std::sqrt(a*(Ex-delta0)); 193 Width = I1(t,tx)*T/expE0T + I3(s,sx)*std::exp(s)/(sqrt2*a); 194 // For charged particles (Beta+V) = 0 beacuse Beta = -V 195 if (theZ == 0) { 196 Width += (Beta+V)*(I0(tx)/expE0T + 2.0*sqrt2*I2(s,sx)*std::exp(s)); 197 } 198 } 199 200 //JMQ 14/07/2009 BIG BUG : NuclearMass is in MeV => hbarc instead of hbar_planck must be used 201 // G4double g = (2.0*Spin+1.0)*NuclearMass/(pi2* hbar_Planck*hbar_Planck); 202 G4double g = (2.0*Spin+1.0)*NuclearMass/(pi2* hbarc*hbarc); 203 204 //JMQ 190709 fix on Rb and geometrical cross sections according to Furihata's paper 205 // (JAERI-Data/Code 2001-105, p6) 206 // G4double RN = 0.0; 207 G4double Rb = 0.0; 208 if (theA > 4) 209 { 210 // G4double R1 = std::pow(ResidualA,1.0/3.0); 211 // G4double R2 = std::pow(G4double(theA),1.0/3.0); 212 G4double Ad = fG4pow->Z13(ResidualA); 213 G4double Aj = fG4pow->Z13(theA); 214 // RN = 1.12*(R1 + R2) - 0.86*((R1+R2)/(R1*R2)); 215 Rb = 1.12*(Aj + Ad) - 0.86*((Aj+Ad)/(Aj*Ad))+2.85; 216 Rb *= fermi; 217 } 218 else if (theA>1) 219 { 220 G4double Ad = fG4pow->Z13(ResidualA); 221 G4double Aj = fG4pow->Z13(theA); 222 Rb=1.5*(Aj+Ad)*fermi; 223 } 224 else 225 { 226 G4double Ad = fG4pow->Z13(ResidualA); 227 Rb = 1.5*Ad*fermi; 228 } 229 // G4double GeometricalXS = pi*RN*RN*std::pow(ResidualA,2./3.); 230 G4double GeometricalXS = pi*Rb*Rb; 231 //end of JMQ fix on Rb by 190709 232 233 234 235 //JMQ 160909 fix: initial level density must be calculated according to the 236 // conditions at the initial compound nucleus 237 // (it has been removed from previous "if" for the residual) 238 239 if ( U < ExCN ) 240 { 241 InitialLevelDensity = (pi/12.0)*std::exp((U-E0CN)/TCN)/TCN; 242 } 243 else 244 { 245 // InitialLevelDensity = (pi/12.0)*std::exp(2*std::sqrt(aCN*(U-deltaCN)))/std::pow(aCN*std::pow(U-deltaCN,5.0),1.0/4.0); 246 //VI speedup 247 G4double x = U-deltaCN; 248 G4double x2 = x*x; 249 G4double x3 = x2*x; 250 InitialLevelDensity = (pi/12.0)*std::exp(2*std::sqrt(aCN*x))/std::sqrt(std::sqrt(aCN*x2*x3)); 251 } 252 // 253 254 255 //JMQ 190709 BUG : pi instead of sqrt(pi) must be here according to Furihata's report: 256 // Width *= std::sqrt(pi)*g*GeometricalXS*Alpha/(12.0*InitialLevelDensity); 257 Width *= pi*g*GeometricalXS*Alpha/(12.0*InitialLevelDensity); 258 259 260 return Width; 261 } 262 263 /* 100 264 101 265 G4double G4GEMProbability::CalcProbability(const G4Fragment & fragment, … … 219 383 return Width; 220 384 } 221 222 223 224 225 G4double G4GEMProbability::I0(const G4double t) 226 { 227 G4double result = (std::exp(t) - 1.0); 228 return result; 229 } 230 231 G4double G4GEMProbability::I1(const G4double t, const G4double tx) 232 { 233 G4double result = t - tx + 1.0; 234 result *= std::exp(tx); 235 result -= (t + 1.0); 236 return result; 237 } 238 239 240 G4double G4GEMProbability::I2(const G4double s, const G4double sx) 241 { 242 G4double S = 1.0/std::sqrt(s); 243 G4double Sx = 1.0/std::sqrt(sx); 244 245 G4double p1 = S*S*S*( 1.0 + S*S*( 1.5 + 3.75*S*S) ); 246 G4double p2 = Sx*Sx*Sx*( 1.0 + Sx*Sx*( 1.5 + 3.75*Sx*Sx) )*std::exp(sx-s); 247 248 return p1-p2; 249 } 385 */ 250 386 251 387 G4double G4GEMProbability::I3(const G4double s, const G4double sx) -
trunk/source/processes/hadronic/models/de_excitation/handler/include/G4ExcitationHandler.hh
r1228 r1315 24 24 // ******************************************************************** 25 25 // 26 // 27 // $Id: G4ExcitationHandler.hh,v 1.10 2009/11/24 11:18:48 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-03 $ 26 // $Id: G4ExcitationHandler.hh,v 1.12 2010/04/27 14:00:23 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 28 // 30 29 // Hadronic Process: Nuclear De-excitations … … 55 54 #include "G4VEvaporation.hh" 56 55 #include "G4VPhotonEvaporation.hh" 56 #include "G4VEvaporationChannel.hh" 57 57 #include "G4Fragment.hh" 58 58 #include "G4DynamicParticle.hh" … … 68 68 #include "G4IonConstructor.hh" 69 69 70 //#define debug71 72 70 class G4ExcitationHandler 73 71 { … … 75 73 G4ExcitationHandler(); 76 74 ~G4ExcitationHandler(); 75 77 76 private: 77 78 78 G4ExcitationHandler(const G4ExcitationHandler &right); 79 80 79 const G4ExcitationHandler & operator=(const G4ExcitationHandler &right); 81 80 G4bool operator==(const G4ExcitationHandler &right) const; 82 81 G4bool operator!=(const G4ExcitationHandler &right) const; 83 82 84 85 83 public: 84 86 85 G4ReactionProductVector * BreakItUp(const G4Fragment &theInitialState) const; 87 86 … … 92 91 void SetFermiModel(G4VFermiBreakUp *const value); 93 92 94 void SetPhotonEvaporation(G4V PhotonEvaporation* const value);93 void SetPhotonEvaporation(G4VEvaporationChannel * const value); 95 94 96 95 void SetMaxZForFermiBreakUp(G4int aZ); … … 99 98 void SetMinEForMultiFrag(G4double anE); 100 99 101 // for inverse cross section choice102 inline void SetOPTxs(G4int opt) { OPTxs = opt;}103 // for superimposed Coulomb Barrir for inverse cross sections104 inline void UseSICB() {useSICB=true;}100 // for inverse cross section choice 101 inline void SetOPTxs(G4int opt); 102 // for superimposed Coulomb Barrir for inverse cross sections 103 inline void UseSICB(); 105 104 106 105 private: 107 106 107 void SetParameters(); 108 108 109 G4ReactionProductVector * Transform(G4FragmentVector * theFragmentVector) const; 109 110 … … 114 115 const G4VFermiBreakUp * GetFermiModel() const; 115 116 116 const G4V PhotonEvaporation* GetPhotonEvaporation() const;117 const G4VEvaporationChannel * GetPhotonEvaporation() const; 117 118 118 119 G4int GetMaxZ() const; … … 124 125 G4FragmentVector * Result) const; 125 126 #endif 127 126 128 private: 127 129 … … 132 134 G4VFermiBreakUp *theFermiModel; 133 135 134 G4V PhotonEvaporation* thePhotonEvaporation;136 G4VEvaporationChannel * thePhotonEvaporation; 135 137 136 138 G4int maxZForFermiBreakUp; 137 139 G4int maxAForFermiBreakUp; 138 140 G4double minEForMultiFrag; 141 G4double minExcitation; 139 142 140 143 G4ParticleTable *theTableOfParticles; … … 147 150 G4int OPTxs; 148 151 G4bool useSICB; 149 152 150 153 struct DeleteFragment 151 154 { … … 156 159 } 157 160 }; 158 159 161 160 162 }; 161 163 162 164 inline void G4ExcitationHandler::SetOPTxs(G4int opt) 165 { 166 OPTxs = opt; 167 SetParameters(); 168 } 169 170 inline void G4ExcitationHandler::UseSICB() 171 { 172 useSICB = true; 173 SetParameters(); 174 } 163 175 164 176 inline const G4VEvaporation * G4ExcitationHandler::GetEvaporation() const … … 172 184 MyOwnEvaporationClass = false; 173 185 theEvaporation = value; 186 SetParameters(); 174 187 } 175 188 … … 199 212 200 213 201 inline const G4V PhotonEvaporation* G4ExcitationHandler::GetPhotonEvaporation() const214 inline const G4VEvaporationChannel * G4ExcitationHandler::GetPhotonEvaporation() const 202 215 { 203 216 return thePhotonEvaporation; 204 217 } 205 218 206 inline void G4ExcitationHandler::SetPhotonEvaporation(G4V PhotonEvaporation*const value)219 inline void G4ExcitationHandler::SetPhotonEvaporation(G4VEvaporationChannel *const value) 207 220 { 208 221 if (thePhotonEvaporation != 0 && MyOwnPhotonEvaporationClass) delete thePhotonEvaporation; -
trunk/source/processes/hadronic/models/de_excitation/handler/src/G4ExcitationHandler.cc
r1228 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4ExcitationHandler.cc,v 1.39 2010/05/18 15:46:11 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 26 28 // 27 29 // Hadronic Process: Nuclear De-excitations … … 29 31 // 30 32 // 31 // Modif (September 2009) by J. M. Quesada: 32 // according to Igor Pshenichnov, SMM will be applied (just in case) only once . 33 // 34 // Modif (September 2008) by J. M. Quesada. External choices have been added for : 35 // -inverse cross section option (default OPTxs=3) 36 // -superimposed Coulomb barrier (if useSICB is set true, by default it is false) 37 // 38 // Modif (24 Jul 2008) by M. A. Cortes Giraldo: 39 // -Max Z,A for Fermi Break-Up turns to 9,17 by default 40 // -BreakItUp() reorganised and bug in Evaporation loop fixed 41 // -Transform() optimised 42 // Modif (30 June 1998) by V. Lara: 33 // Modified: 34 // (30 June 1998) by V. Lara: 43 35 // -Modified the Transform method for use G4ParticleTable and 44 36 // therefore G4IonTable. It makes possible to convert all kind … … 49 41 // MultiFragmentation: G4StatMF 50 42 // Fermi Breakup model: G4FermiBreakUp 43 // (24 Jul 2008) by M. A. Cortes Giraldo: 44 // -Max Z,A for Fermi Break-Up turns to 9,17 by default 45 // -BreakItUp() reorganised and bug in Evaporation loop fixed 46 // -Transform() optimised 47 // (September 2008) by J. M. Quesada. External choices have been added for : 48 // -inverse cross section option (default OPTxs=3) 49 // -superimposed Coulomb barrier (if useSICB is set true, by default it is false) 50 // (September 2009) by J. M. Quesada: 51 // -according to Igor Pshenichnov, SMM will be applied (just in case) only once. 52 // (27 Nov 2009) by V.Ivanchenko: 53 // -cleanup the logic, reduce number internal vectors, fixed memory leak. 54 // (11 May 2010) by V.Ivanchenko: 55 // -FermiBreakUp activated, used integer Z and A, used BreakUpFragment method for 56 // final photon deexcitation; used check on adundance of a fragment, decay 57 // unstable fragments with A <5 51 58 // 52 59 … … 54 61 #include "globals.hh" 55 62 #include "G4LorentzVector.hh" 63 #include "G4NistManager.hh" 56 64 #include <list> 57 58 //#define debugphoton59 60 65 61 66 G4ExcitationHandler::G4ExcitationHandler(): 62 67 // JMQ 160909 Fermi BreakUp & MultiFrag are on by default 63 68 // This is needed for activation of such models when G4BinaryLightIonReaction is used 64 // since no interface (for external activation via macro input file) is still available in this case. 65 //maxZForFermiBreakUp(9),maxAForFermiBreakUp(17),minEForMultiFrag(3.0*MeV), 66 maxZForFermiBreakUp(1),maxAForFermiBreakUp(1),minEForMultiFrag(4.0*GeV), 69 // since no interface (for external activation via macro input file) is still available. 70 maxZForFermiBreakUp(9),maxAForFermiBreakUp(17),minEForMultiFrag(4.0*GeV), 71 // maxZForFermiBreakUp(9),maxAForFermiBreakUp(17),minEForMultiFrag(3.0*MeV), 72 //maxZForFermiBreakUp(1),maxAForFermiBreakUp(1),minEForMultiFrag(4.0*GeV), 73 minExcitation(CLHEP::keV), 67 74 MyOwnEvaporationClass(true), MyOwnMultiFragmentationClass(true),MyOwnFermiBreakUpClass(true), 68 75 MyOwnPhotonEvaporationClass(true),OPTxs(3),useSICB(false) … … 74 81 theFermiModel = new G4FermiBreakUp; 75 82 thePhotonEvaporation = new G4PhotonEvaporation; 83 SetParameters(); 76 84 } 77 78 G4ExcitationHandler::G4ExcitationHandler(const G4ExcitationHandler &)79 {80 throw G4HadronicException(__FILE__, __LINE__, "G4ExcitationHandler::copy_constructor: is meant to not be accessable! ");81 }82 83 85 84 86 G4ExcitationHandler::~G4ExcitationHandler() … … 90 92 } 91 93 92 93 const G4ExcitationHandler & G4ExcitationHandler::operator=(const G4ExcitationHandler &) 94 void G4ExcitationHandler::SetParameters() 94 95 { 95 throw G4HadronicException(__FILE__, __LINE__, "G4ExcitationHandler::operator=: is meant to not be accessable! ");96 97 return *this;98 }99 100 101 G4bool G4ExcitationHandler::operator==(const G4ExcitationHandler &) const102 {103 throw G4HadronicException(__FILE__, __LINE__, "G4ExcitationHandler::operator==: is meant to not be accessable! ");104 return false;105 }106 107 G4bool G4ExcitationHandler::operator!=(const G4ExcitationHandler &) const108 {109 throw G4HadronicException(__FILE__, __LINE__, "G4ExcitationHandler::operator!=: is meant to not be accessable! ");110 return true;111 }112 113 ////////////////////////////////////////////////////////////////////////////////////////////////114 /// 25/07/08 16:45 Proposed by MAC ////////////////////////////////////////////////////////////115 ////////////////////////////////////////////////////////////////////////////////////////////////116 117 G4ReactionProductVector * G4ExcitationHandler::BreakItUp(const G4Fragment & theInitialState) const118 {119 96 //for inverse cross section choice 120 97 theEvaporation->SetOPTxs(OPTxs); 121 98 //for the choice of superimposed Coulomb Barrier for inverse cross sections 122 99 theEvaporation->UseSICB(useSICB); 123 124 // Pointer which will be used to return the final production vector 125 //G4FragmentVector * theResult = new G4FragmentVector; 100 theEvaporation->Initialise(); 101 } 102 103 G4ReactionProductVector * G4ExcitationHandler::BreakItUp(const G4Fragment & theInitialState) const 104 { 126 105 127 106 // Variables existing until end of method 128 //G4Fragment * theInitialStatePtr = const_cast<G4Fragment*>(&theInitialState);129 107 G4Fragment * theInitialStatePtr = new G4Fragment(theInitialState); 108 130 109 G4FragmentVector * theTempResult = 0; // pointer which receives temporal results 131 std::list<G4Fragment*> theEvapList; // list to apply Evaporation , SMFor Fermi Break-Up110 std::list<G4Fragment*> theEvapList; // list to apply Evaporation or Fermi Break-Up 132 111 std::list<G4Fragment*> theEvapStableList; // list to apply PhotonEvaporation 133 112 std::list<G4Fragment*> theResults; // list to store final result 134 113 std::list<G4Fragment*>::iterator iList; 135 114 // 136 //G4cout << "@@@@@@@@@@ Start G4Ex itation Handler @@@@@@@@@@@@@" << G4endl;115 //G4cout << "@@@@@@@@@@ Start G4Excitation Handler @@@@@@@@@@@@@" << G4endl; 137 116 //G4cout << theInitialState << G4endl; 138 117 139 118 // Variables to describe the excited configuration 140 119 G4double exEnergy = theInitialState.GetExcitationEnergy(); 141 G4int A = static_cast<G4int>( theInitialState.GetA() +0.5 ); 142 G4int Z = static_cast<G4int>( theInitialState.GetZ() +0.5 ); 120 G4int A = theInitialState.GetA_asInt(); 121 G4int Z = theInitialState.GetZ_asInt(); 122 123 G4NistManager* nist = G4NistManager::Instance(); 143 124 144 125 // JMQ 150909: first step in de-excitation chain (SMM will be used only here) 145 126 146 // In case A <= 4the fragment will not perform any nucleon emission147 if (A <= 4)127 // In case A <= 1 the fragment will not perform any nucleon emission 128 if (A <= 1) 148 129 { 149 // I store G4Fragment* in theEvapStableList to apply thePhotonEvaporation later 150 theEvapStableList.push_back( theInitialStatePtr ); 130 theResults.push_back( theInitialStatePtr ); 151 131 } 152 153 else // If A > 4 we try to apply theFermiModel, theMultiFragmentation or theEvaporation132 // check if a fragment is stable 133 else if(exEnergy < minExcitation && nist->GetIsotopeAbundance(Z, A) > 0.0) 154 134 { 155 135 theResults.push_back( theInitialStatePtr ); 136 } 137 else // In all cases apply once theFermiModel, theMultiFragmentation or theEvaporation 138 { 156 139 // JMQ 150909: first step in de-excitation is treated separately 157 140 // Fragments after the first step are stored in theEvapList 158 // Statistical Multifragmentation will take place (just in case) only here141 // Statistical Multifragmentation will take place only once 159 142 // 160 // Test applicability 161 // Initial State De-Excitation 162 if(A<GetMaxA()&&Z<GetMaxZ()) 143 // Fermi Break-Up always first 144 if((A < 5) || (A<GetMaxA() && Z<GetMaxZ())) 163 145 { 164 146 theTempResult = theFermiModel->BreakItUp(theInitialState); 147 // fragment was not decaied try to evaporate 148 if(1 == theTempResult->size()) { 149 if((*theTempResult)[0] != theInitialStatePtr) { 150 delete (*theTempResult)[0]; 151 } 152 delete theTempResult; 153 theTempResult = theEvaporation->BreakItUp(theInitialState); 154 } 165 155 } 166 156 else if (exEnergy>GetMinE()*A) 167 157 { 168 158 theTempResult = theMultiFragmentation->BreakItUp(theInitialState); 159 // fragment was not decaied try to evaporate 160 if(1 == theTempResult->size()) { 161 if((*theTempResult)[0] != theInitialStatePtr) { 162 delete (*theTempResult)[0]; 163 } 164 delete theTempResult; 165 theTempResult = theEvaporation->BreakItUp(theInitialState); 166 } 169 167 } 170 168 else … … 174 172 175 173 G4bool deletePrimary = true; 176 if(theTempResult->size() > 0) 174 G4int nsec=theTempResult->size(); 175 if(nsec > 0) 177 176 { 178 // S tore original state in theEvapList177 // Sort out secondary fragments 179 178 G4FragmentVector::iterator j; 180 179 for (j = theTempResult->begin(); j != theTempResult->end(); ++j) 181 180 { 182 181 if((*j) == theInitialStatePtr) { deletePrimary = false; } 183 A = static_cast<G4int>((*j)->GetA()+0.5); // +0.5 to avoid bad truncation 184 185 if(A <= 1) { theResults.push_back(*j); } // gamma, p, n 186 else if(A <= 4) { theEvapStableList.push_back(*j); } // evaporation is not possible 187 else { theEvapList.push_back(*j); } // evaporation is possible 182 A = (*j)->GetA_asInt(); 183 184 if(A <= 1) { theResults.push_back(*j); } // gamma, p, n 185 else if(1 == nsec) { theEvapStableList.push_back(*j); } // evaporation is not possible 186 else // Analyse fragment 187 { 188 G4double exEnergy = (*j)->GetExcitationEnergy(); 189 if(exEnergy < minExcitation) { 190 Z = (*j)->GetZ_asInt(); 191 if(nist->GetIsotopeAbundance(Z, A) > 0.0) { 192 theResults.push_back(*j); // stable fragment 193 } else { 194 theEvapList.push_back(*j); // unstable cold fragment 195 } 196 } else { theEvapList.push_back(*j); } // hot fragment 197 } 188 198 } 189 199 } … … 204 214 for (iList = theEvapList.begin(); iList != theEvapList.end(); ++iList) 205 215 { 206 A = static_cast<G4int>((*iList)->GetA()+0.5); // +0.5 to avoid bad truncation207 Z = static_cast<G4int>((*iList)->GetZ()+0.5);216 A = (*iList)->GetA_asInt(); 217 Z = (*iList)->GetZ_asInt(); 208 218 209 // In case A <= 4 the fragment will not perform any nucleon emission210 if ( A <= 4)219 // Fermi Break-Up 220 if ((A < 5) || (A < GetMaxA() && Z < GetMaxZ())) 211 221 { 212 // storing G4Fragment* in theEvapStableList to apply thePhotonEvaporation later 213 theEvapStableList.push_back(*iList ); 222 theTempResult = theFermiModel->BreakItUp(*(*iList)); 223 // fragment was not decaied try to evaporate 224 if(1 == theTempResult->size()) { 225 if((*theTempResult)[0] != theInitialStatePtr) { delete (*theTempResult)[0]; } 226 delete theTempResult; 227 theTempResult = theEvaporation->BreakItUp(*(*iList)); 228 } 214 229 } 215 216 else // If A > 4 we try to apply theFermiModel or theEvaporation 217 { 218 // stable fragment 219 if ((*iList)->GetExcitationEnergy() <= 0.1*eV) 220 { 221 theResults.push_back(*iList); 230 else // apply Evaporation in another case 231 { 232 theTempResult = theEvaporation->BreakItUp(*(*iList)); 233 } 234 235 G4bool deletePrimary = true; 236 G4int nsec = theTempResult->size(); 237 238 // Sort out secondary fragments 239 if ( nsec > 0 ) 240 { 241 G4FragmentVector::iterator j; 242 for (j = theTempResult->begin(); j != theTempResult->end(); ++j) 243 { 244 if((*j) == (*iList)) { deletePrimary = false; } 245 A = (*j)->GetA_asInt(); 246 247 if(A <= 1) { theResults.push_back(*j); } // gamma, p, n 248 else if(1 == nsec) { theEvapStableList.push_back(*j); } // no evaporation 249 else // Analyse fragment 250 { 251 G4double exEnergy = (*j)->GetExcitationEnergy(); 252 if(exEnergy < minExcitation) { 253 Z = (*j)->GetZ_asInt(); 254 if(nist->GetIsotopeAbundance(Z, A) > 0.0) { 255 theResults.push_back(*j); // stable fragment 256 } else { 257 theEvapList.push_back(*j); // unstable cold fragment 258 } 259 } else { theEvapList.push_back(*j); } // hot fragment 260 } 222 261 } 223 else 224 { 225 if ( A < GetMaxA() && Z < GetMaxZ() ) // if satisfied apply Fermi Break-Up 226 { 227 theTempResult = theFermiModel->BreakItUp(*(*iList)); 228 } 229 else // apply Evaporation in another case 230 { 231 theTempResult = theEvaporation->BreakItUp(*(*iList)); 232 } 233 234 // New configuration is stored in theTempResult, so we can free 235 // the memory where the previous configuration is 236 237 G4bool deletePrimary = true; 238 G4int nsec = theTempResult->size(); 239 240 // The number of secondaries tells us if the configuration has changed 241 if ( nsec > 0 ) 242 { 243 G4FragmentVector::iterator j; 244 for (j = theTempResult->begin(); j != theTempResult->end(); ++j) 245 { 246 if((*j) == (*iList)) { deletePrimary = false; } 247 A = static_cast<G4int>((*j)->GetA()+0.5); // +0.5 to avoid bad truncation 248 249 if(A <= 1) { theResults.push_back(*j); } // gamma, p, n 250 else if(A <= 4 || 1 == nsec) { theEvapStableList.push_back(*j); } // no evaporation 251 else { theEvapList.push_back(*j); } 252 } 253 } 254 if( deletePrimary ) { delete (*iList); } 255 delete theTempResult; 256 257 } 258 } // endif (A <=4) 262 } 263 if( deletePrimary ) { delete (*iList); } 264 delete theTempResult; 259 265 } // end of the loop over theEvapList 260 266 … … 267 273 // ----------------------- 268 274 275 // normally should not reach this point - it is kind of work around 269 276 for (iList = theEvapStableList.begin(); iList != theEvapStableList.end(); ++iList) 270 277 { 271 // take out stable particles and fragments272 A = static_cast<G4int>((*iList)->GetA()+0.5);273 if ( A <= 1 ) { theResults.push_back(*iList); }274 else if ((*iList)->GetExcitationEnergy() <= 0.1*eV) { theResults.push_back(*iList); } 275 276 else278 // photon-evaporation is applied 279 theTempResult = thePhotonEvaporation->BreakUpFragment(*iList); 280 G4int nsec = theTempResult->size(); 281 282 // if there is a gamma emission then 283 if (nsec > 0) 277 284 { 278 // photon-evaporation is applied 279 theTempResult = thePhotonEvaporation->BreakItUp(*(*iList)); 280 281 G4bool deletePrimary = true; 282 G4int nsec = theTempResult->size(); 283 284 // if there is a gamma emission then 285 if (nsec > 1) 285 G4FragmentVector::iterator j; 286 for (j = theTempResult->begin(); j != theTempResult->end(); ++j) 286 287 { 287 G4FragmentVector::iterator j; 288 for (j = theTempResult->begin(); j != theTempResult->end(); ++j) 289 { 290 if((*j) == (*iList)) { deletePrimary = false; } 291 A = static_cast<G4int>((*j)->GetA()+0.5); // +0.5 to avoid bad truncation 292 293 if(A <= 1) { theResults.push_back(*j); } // gamma, p, n 294 else if((*j)->GetExcitationEnergy() <= 0.1*eV) { theResults.push_back(*j); } // stable fragment 295 else { theEvapStableList.push_back(*j); } 296 } 288 theResults.push_back(*j); 297 289 } 298 299 else if(1 == nsec) 300 { 301 G4FragmentVector::iterator j = theTempResult->begin(); 302 if((*j) == (*iList)) { deletePrimary = false; } 303 // Let's create a G4Fragment pointer representing the gamma emmited 304 G4LorentzVector lv = (*j)->GetMomentum(); 305 G4double Mass = (*j)->GetGroundStateMass(); 306 G4double Ecm = lv.m(); 307 if(Ecm - Mass > 0.1*eV) 308 { 309 G4ThreeVector bst = lv.boostVector(); 310 G4double GammaEnergy = 0.5*(Ecm - Mass)*(Ecm + Mass)/Ecm; 311 G4double cosTheta = 1. - 2. * G4UniformRand(); 312 G4double sinTheta = std::sqrt(1. - cosTheta * cosTheta); 313 G4double phi = twopi * G4UniformRand(); 314 G4LorentzVector Gamma4P(GammaEnergy * sinTheta * std::cos(phi), 315 GammaEnergy * sinTheta * std::sin(phi), 316 GammaEnergy * cosTheta, 317 GammaEnergy); 318 Gamma4P.boost(bst); 319 G4Fragment * theHandlerPhoton = new G4Fragment(Gamma4P,G4Gamma::GammaDefinition()); 320 theResults.push_back(theHandlerPhoton); 321 322 // And now we update momentum and energy for the nucleus 323 lv -= Gamma4P; 324 (*j)->SetMomentum(lv); // Now this fragment has been deexcited! 325 } 326 // we store the deexcited fragment 327 theResults.push_back(*j); 328 } 329 if( deletePrimary ) { delete (*iList); } 330 delete theTempResult; 331 } 290 } 291 delete theTempResult; 292 293 // priamry fragment is kept 294 theResults.push_back(*iList); 295 332 296 } // end of photon-evaporation loop 333 297 … … 356 320 theFragmentMomentum = (*i)->GetMomentum(); 357 321 G4ParticleDefinition* theKindOfFragment = 0; 358 if (theFragmentA == 0 && theFragmentZ == 0) { // photon359 theKindOfFragment = G4Gamma::GammaDefinition();322 if (theFragmentA == 0) { // photon or e- 323 theKindOfFragment = (*i)->GetParticleDefinition(); 360 324 } else if (theFragmentA == 1 && theFragmentZ == 0) { // neutron 361 325 theKindOfFragment = G4Neutron::NeutronDefinition(); -
trunk/source/processes/hadronic/models/de_excitation/management/include/G4VEvaporationChannel.hh
r1228 r1315 24 24 // ******************************************************************** 25 25 // 26 // 27 // $Id: G4VEvaporationChannel.hh,v 1.4 2008/09/19 13:32:54 ahoward Exp $ 28 // GEANT4 tag $Name: geant4-09-03 $ 26 // $Id: G4VEvaporationChannel.hh,v 1.6 2010/05/11 11:16:04 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 28 // 30 29 // Hadronic Process: Nuclear De-excitations 31 30 // by V. Lara (Oct 1998) 32 31 // 33 // Modif (03 September 2008) by J. M. Quesada for external choice of inverse 34 // cross section option 35 // JMQ (06 September 2008) Also external choices have been added for 36 // superimposed Coulomb barrier (if useSICB is set true, by default is false) 37 38 32 // Modified: 33 // 03.09.2008 (J.M.Quesada) for external choice of inverse cross section option 34 // 06.09.2008 (J.M.Quesada) external choices have been added for superimposed 35 // Coulomb barrier (if useSICB is set true, by default is false) 36 // 24.04.2010 (V.Ivanchenko) moved constructor and destructor to source; added two 37 // new virtual methods EmittedFragment(s) to allow more optimal 38 // work with G4Fragment objects 39 // 39 40 40 41 #ifndef G4VEvaporationChannel_h … … 47 48 { 48 49 public: 49 G4VEvaporationChannel() : Name("Anonymous") {}; 50 G4VEvaporationChannel(const G4String & aName) : Name(aName) {}; 51 G4VEvaporationChannel(const G4String * aName) : Name(*aName) {}; 52 virtual ~G4VEvaporationChannel() {}; 50 51 G4VEvaporationChannel(const G4String & aName = "Anonymous"); 52 virtual ~G4VEvaporationChannel(); 53 53 54 54 private: 55 55 56 G4VEvaporationChannel(const G4VEvaporationChannel & right); 57 const G4VEvaporationChannel & operator=(const G4VEvaporationChannel & right); 56 58 57 const G4VEvaporationChannel & operator=(const G4VEvaporationChannel & right);58 59 public: 60 59 61 G4bool operator==(const G4VEvaporationChannel & right) const; 60 62 G4bool operator!=(const G4VEvaporationChannel & right) const; 61 63 62 public:63 64 virtual void Initialize(const G4Fragment & fragment) = 0; 64 65 66 // return emitted fragment, initial fragment is modified 67 // and not deleted 68 virtual G4Fragment* EmittedFragment(G4Fragment* theNucleus); 69 70 // return vector of emitted fragments, initial fragment is modified 71 // but not included in this vector 72 virtual G4FragmentVector* BreakUpFragment(G4Fragment* theNucleus); 73 74 // old method initial fragment is not modified, its copy included 75 // in the list of emitted fragments 65 76 virtual G4FragmentVector * BreakUp(const G4Fragment & theNucleus) = 0; 66 77 67 78 virtual G4double GetEmissionProbability(void) const = 0; 68 69 79 70 80 G4String GetName() const {return Name;} … … 75 85 // for superimposed Coulomb Barrier for inverse cross sections 76 86 inline void UseSICB(G4bool use) { useSICB = use; } 87 77 88 protected: 89 78 90 G4int OPTxs; 79 91 G4bool useSICB; 80 81 92 82 93 private: -
trunk/source/processes/hadronic/models/de_excitation/management/include/G4VEvaporationFactory.hh
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4VEvaporationFactory.hh,v 1. 4 2008/09/19 13:32:54 ahowardExp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4VEvaporationFactory.hh,v 1.5 2010/04/27 11:43:16 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 42 42 { 43 43 public: 44 G4VEvaporationFactory() : _channel(0) {};44 G4VEvaporationFactory(); 45 45 virtual ~G4VEvaporationFactory(); 46 46 -
trunk/source/processes/hadronic/models/de_excitation/management/src/G4VEvaporationChannel.cc
r1228 r1315 24 24 // ******************************************************************** 25 25 // 26 // 27 // $Id: G4VEvaporationChannel.cc,v 1.5 2006/06/29 20:23:55 gunter Exp $ 28 // GEANT4 tag $Name: geant4-09-03 $ 26 // $Id: G4VEvaporationChannel.cc,v 1.6 2010/04/25 18:43:08 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 28 // 30 29 // Hadronic Process: Nuclear De-excitations 31 30 // by V. Lara (Oct 1998) 32 31 // 32 // Modified: 33 // 24.04.2010 (V.Ivanchenko) moved constructor and destructor to source; added two 34 // new virtual methods EmittedFragment(s) to allow more optimal 35 // work with G4Fragment objects; removed unnecesary exceptions 33 36 34 37 #include "G4VEvaporationChannel.hh" 35 38 #include "G4HadronicException.hh" 36 39 37 G4VEvaporationChannel::G4VEvaporationChannel(const G4VEvaporationChannel &) 38 { 39 throw G4HadronicException(__FILE__, __LINE__, "G4VEvaporationChannel::copy_constructor meant to not be accessable"); 40 } 40 G4VEvaporationChannel::G4VEvaporationChannel(const G4String & aName) 41 : Name(aName) 42 {} 41 43 44 G4VEvaporationChannel::~G4VEvaporationChannel() 45 {} 42 46 43 44 45 const G4VEvaporationChannel & G4VEvaporationChannel::operator=(const G4VEvaporationChannel &) 46 { 47 throw G4HadronicException(__FILE__, __LINE__, "G4VEvaporationChannel::operator= meant to not be accessable"); 48 return *this; 49 } 50 47 //G4VEvaporationChannel::G4VEvaporationChannel(const G4VEvaporationChannel &) 48 //{ 49 // throw G4HadronicException(__FILE__, __LINE__, "G4VEvaporationChannel::copy_constructor meant to not be accessable"); 50 //} 51 //const G4VEvaporationChannel & G4VEvaporationChannel::operator=(const G4VEvaporationChannel &) 52 //{ 53 // throw G4HadronicException(__FILE__, __LINE__, "G4VEvaporationChannel::operator= meant to not be accessable"); 54 // return *this; 55 //} 51 56 52 57 G4bool G4VEvaporationChannel::operator==(const G4VEvaporationChannel &right) const 53 58 { 54 return (this == (G4VEvaporationChannel *) &right); 55 // return false; 59 return (this == (G4VEvaporationChannel *) &right); 56 60 } 57 61 58 62 G4bool G4VEvaporationChannel::operator!=(const G4VEvaporationChannel &right) const 59 63 { 60 return (this != (G4VEvaporationChannel *) &right); 61 // return true; 64 return (this != (G4VEvaporationChannel *) &right); 62 65 } 63 66 67 G4Fragment* G4VEvaporationChannel::EmittedFragment(G4Fragment*) 68 { 69 return 0; 70 } 64 71 72 G4FragmentVector* G4VEvaporationChannel::BreakUpFragment(G4Fragment*) 73 { 74 return 0; 75 } -
trunk/source/processes/hadronic/models/de_excitation/management/src/G4VEvaporationFactory.cc
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4VEvaporationFactory.cc,v 1. 6 2008/09/19 13:32:54 ahowardExp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4VEvaporationFactory.cc,v 1.7 2010/04/27 11:43:16 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 32 32 33 33 #include "G4VEvaporationFactory.hh" 34 #include "G4HadronicException.hh"35 34 36 const G4VEvaporationFactory & 37 G4VEvaporationFactory::operator=(const G4VEvaporationFactory & ) 38 { 39 throw G4HadronicException(__FILE__, __LINE__, "G4VEvaporationFactory::operator= meant to not be accessable."); 40 return *this; 41 } 42 43 G4bool 44 G4VEvaporationFactory::operator==(const G4VEvaporationFactory & ) const 45 { 46 throw G4HadronicException(__FILE__, __LINE__, "G4VEvaporationFactory::operator== meant to not be accessable."); 47 return false; 48 } 49 50 G4bool 51 G4VEvaporationFactory::operator!=(const G4VEvaporationFactory & ) const 52 { 53 throw G4HadronicException(__FILE__, __LINE__, "G4VEvaporationFactory::operator!= meant to not be accessable."); 54 return true; 55 } 56 57 58 35 G4VEvaporationFactory::G4VEvaporationFactory() : _channel(0) 36 {} 59 37 60 38 G4VEvaporationFactory::~G4VEvaporationFactory() -
trunk/source/processes/hadronic/models/de_excitation/multifragmentation/include/G4StatMFFragment.hh
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4StatMFFragment.hh,v 1. 3 2006/06/29 20:24:07 gunterExp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4StatMFFragment.hh,v 1.5 2010/05/03 16:49:19 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 36 36 #include "G4StatMFParameters.hh" 37 37 #include "G4ThreeVector.hh" 38 #include "G4ParticleTable.hh" 39 #include "G4IonTable.hh" 38 40 #include "G4Fragment.hh" 39 41 -
trunk/source/processes/hadronic/models/de_excitation/multifragmentation/include/G4StatMFMacroTemperature.hh
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4StatMFMacroTemperature.hh,v 1. 3 2006/06/29 20:24:21 gunterExp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4StatMFMacroTemperature.hh,v 1.4 2010/04/16 17:04:08 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 48 48 const G4double ExEnergy, const G4double FreeE0, 49 49 const G4double kappa, 50 std::vector<G4VStatMFMacroCluster*> * ClusterVector) : 51 theA(anA), 52 theZ(aZ), 53 _ExEnergy(ExEnergy), 54 _FreeInternalE0(FreeE0), 55 _Kappa(kappa), 56 _MeanMultiplicity(0.0), 57 _MeanTemperature(0.0), 58 _ChemPotentialMu(0.0), 59 _ChemPotentialNu(0.0), 60 _theClusters(ClusterVector) 61 {}; 50 std::vector<G4VStatMFMacroCluster*> * ClusterVector); 62 51 63 ~G4StatMFMacroTemperature() {};52 ~G4StatMFMacroTemperature(); 64 53 65 54 G4double operator()(const G4double T) … … 67 56 68 57 private: 58 69 59 // Default constructor 70 G4StatMFMacroTemperature() {};60 G4StatMFMacroTemperature(); 71 61 72 62 // copy constructor -
trunk/source/processes/hadronic/models/de_excitation/multifragmentation/src/G4StatMFMacroTemperature.cc
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4StatMFMacroTemperature.cc,v 1. 7 2008/11/19 14:33:31vnivanch Exp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4StatMFMacroTemperature.cc,v 1.8 2010/04/16 17:04:08 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 36 36 // Moscow, pshenich@fias.uni-frankfurt.de) make algorithm closer to 37 37 // original MF model 38 // 16.04.10 V.Ivanchenko improved logic of solving equation for tempetature 39 // to protect code from rare unwanted exception; moved constructor 40 // and destructor to source 38 41 39 42 #include "G4StatMFMacroTemperature.hh" 43 44 G4StatMFMacroTemperature::G4StatMFMacroTemperature(const G4double anA, const G4double aZ, 45 const G4double ExEnergy, const G4double FreeE0, const G4double kappa, 46 std::vector<G4VStatMFMacroCluster*> * ClusterVector) : 47 theA(anA), 48 theZ(aZ), 49 _ExEnergy(ExEnergy), 50 _FreeInternalE0(FreeE0), 51 _Kappa(kappa), 52 _MeanMultiplicity(0.0), 53 _MeanTemperature(0.0), 54 _ChemPotentialMu(0.0), 55 _ChemPotentialNu(0.0), 56 _theClusters(ClusterVector) 57 {} 58 59 G4StatMFMacroTemperature::G4StatMFMacroTemperature() 60 {} 61 62 G4StatMFMacroTemperature::~G4StatMFMacroTemperature() 63 {} 40 64 41 65 // operators definitions … … 82 106 83 107 G4int iterations = 0; 84 while (fTa < 0.0 && iterations++< 10) {108 while (fTa < 0.0 && ++iterations < 10) { 85 109 Ta -= 0.5*Ta; 86 110 fTa = this->operator()(Ta); … … 89 113 iterations = 0; 90 114 while (fTa*fTb > 0.0 && iterations++ < 10) { 91 Tb += 2.*std:: abs(Tb-Ta);115 Tb += 2.*std::fabs(Tb-Ta); 92 116 fTb = this->operator()(Tb); 93 117 } … … 96 120 G4cerr <<"G4StatMFMacroTemperature:"<<" Ta="<<Ta<<" Tb="<<Tb<< G4endl; 97 121 G4cerr <<"G4StatMFMacroTemperature:"<<" fTa="<<fTa<<" fTb="<<fTb<< G4endl; 98 122 throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't bracket the solution."); 99 123 } 100 124 … … 102 126 theSolver->SetIntervalLimits(Ta,Tb); 103 127 if (!theSolver->Crenshaw(*this)){ 104 G4c err<<"G4StatMFMacroTemperature, Crenshaw method failed:"<<" Ta="<<Ta<<" Tb="<<Tb<< G4endl;105 G4c err<<"G4StatMFMacroTemperature, Crenshaw method failed:"<<" fTa="<<fTa<<" fTb="<<fTb<< G4endl;128 G4cout <<"G4StatMFMacroTemperature, Crenshaw method failed:"<<" Ta="<<Ta<<" Tb="<<Tb<< G4endl; 129 G4cout <<"G4StatMFMacroTemperature, Crenshaw method failed:"<<" fTa="<<fTa<<" fTb="<<fTb<< G4endl; 106 130 } 107 131 _MeanTemperature = theSolver->GetRoot(); … … 111 135 // Verify if the root is found and it is indeed within the physical domain, 112 136 // say, between 1 and 50 MeV, otherwise try Brent method: 113 if (_MeanTemperature < 1. || _MeanTemperature > 50. || std::abs(FunctionValureAtRoot) > 5.e-2) { 114 G4cout << "Crenshaw method failed; function = " << FunctionValureAtRoot << " solution? = " << _MeanTemperature << " MeV " << G4endl; 115 G4Solver<G4StatMFMacroTemperature> * theSolverBrent = new G4Solver<G4StatMFMacroTemperature>(200,1.e-3); 116 theSolverBrent->SetIntervalLimits(Ta,Tb); 117 if (!theSolverBrent->Brent(*this)){ 118 G4cerr <<"G4StatMFMacroTemperature, Brent method failed:"<<" Ta="<<Ta<<" Tb="<<Tb<< G4endl; 119 G4cerr <<"G4StatMFMacroTemperature, Brent method failed:"<<" fTa="<<fTa<<" fTb="<<fTb<< G4endl; 137 if (std::fabs(FunctionValureAtRoot) > 5.e-2) { 138 if (_MeanTemperature < 1. || _MeanTemperature > 50.) { 139 G4cout << "Crenshaw method failed; function = " << FunctionValureAtRoot 140 << " solution? = " << _MeanTemperature << " MeV " << G4endl; 141 G4Solver<G4StatMFMacroTemperature> * theSolverBrent = new G4Solver<G4StatMFMacroTemperature>(200,1.e-3); 142 theSolverBrent->SetIntervalLimits(Ta,Tb); 143 if (!theSolverBrent->Brent(*this)){ 144 G4cout <<"G4StatMFMacroTemperature, Brent method failed:"<<" Ta="<<Ta<<" Tb="<<Tb<< G4endl; 145 G4cout <<"G4StatMFMacroTemperature, Brent method failed:"<<" fTa="<<fTa<<" fTb="<<fTb<< G4endl; 146 throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't find the root with any method."); 147 } 148 149 _MeanTemperature = theSolverBrent->GetRoot(); 150 FunctionValureAtRoot = this->operator()(_MeanTemperature); 151 delete theSolverBrent; 152 } 153 if (std::abs(FunctionValureAtRoot) > 5.e-2) { 154 //if (_MeanTemperature < 1. || _MeanTemperature > 50. || std::abs(FunctionValureAtRoot) > 5.e-2) { 155 G4cout << "Brent method failed; function = " << FunctionValureAtRoot << " solution? = " << _MeanTemperature << " MeV " << G4endl; 120 156 throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't find the root with any method."); 121 } 122 123 _MeanTemperature = theSolverBrent->GetRoot(); 124 FunctionValureAtRoot = this->operator()(_MeanTemperature); 125 delete theSolverBrent; 126 127 if (_MeanTemperature < 1. || _MeanTemperature > 50. || std::abs(FunctionValureAtRoot) > 5.e-2) { 128 G4cout << "Brent method failed; function = " << FunctionValureAtRoot << " solution? = " << _MeanTemperature << " MeV " << G4endl; 129 throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't find the root with any method."); 130 } 131 } 132 157 } 158 } 159 //G4cout << "G4StatMFMacroTemperature::CalcTemperature: function = " << FunctionValureAtRoot 160 // << " T(MeV)= " << _MeanTemperature << G4endl; 133 161 return _MeanTemperature; 134 162 } -
trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4ContinuumGammaDeexcitation.hh
r819 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4ContinuumGammaDeexcitation.hh,v 1.4 2010/04/25 18:43:21 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 26 28 // 27 29 // ------------------------------------------------------------------- … … 64 66 65 67 // Destructor 66 ~G4ContinuumGammaDeexcitation();68 virtual ~G4ContinuumGammaDeexcitation(); 67 69 68 70 // Functions … … 72 74 virtual G4VGammaTransition* CreateTransition(); 73 75 74 virtual G4bool CanDoTransition() const;76 virtual G4bool CanDoTransition(); 75 77 76 78 private: -
trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4DiscreteGammaDeexcitation.hh
r819 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4DiscreteGammaDeexcitation.hh,v 1.4 2010/04/25 18:43:21 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 26 28 // 27 29 // ------------------------------------------------------------------- … … 51 53 // ------------------------------------------------------------------- 52 54 // 55 53 56 #ifndef G4DiscreteGammaDeexcitation_hh 54 57 #define G4DiscreteGammaDeexcitation_hh … … 71 74 72 75 // Destructor 73 ~G4DiscreteGammaDeexcitation();76 virtual ~G4DiscreteGammaDeexcitation(); 74 77 75 78 // Functions … … 79 82 virtual G4VGammaTransition * CreateTransition(); 80 83 81 virtual G4bool CanDoTransition() const;84 virtual G4bool CanDoTransition(); 82 85 83 86 void SetICM(G4bool hl) { _icm = hl; }; -
trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4DiscreteGammaTransition.hh
r819 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4DiscreteGammaTransition.hh,v 1.4 2010/04/25 18:43:21 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 26 28 // 27 29 // ------------------------------------------------------------------- … … 52 54 // 15 April 1999, Alessandro Brunengo (Alessandro.Brunengo@ge.infn.it) 53 55 // Added creation time evaluation for products of evaporation 56 // 54 57 // 58 // 19 April 2010, J. M. Quesada. 59 // Corrections added for taking into account mismatch between tabulated 60 // gamma energies and level energy differences (fake photons eliminated) 61 // 55 62 // ------------------------------------------------------------------- 56 63 … … 62 69 #include "G4NuclearLevel.hh" 63 70 71 //JMQ 180410 72 class G4NuclearLevelManager; 73 64 74 class G4DiscreteGammaTransition : public G4VGammaTransition 65 75 { … … 68 78 // Constructor 69 79 G4DiscreteGammaTransition(const G4NuclearLevel& level); 70 G4DiscreteGammaTransition(const G4NuclearLevel& level, G4int Z); 80 //JMQ 180410 81 // G4DiscreteGammaTransition(const G4NuclearLevel& level, G4int Z); 82 G4DiscreteGammaTransition(const G4NuclearLevel& level, G4int Z, G4int A); 71 83 72 84 // Destructor … … 99 111 G4double _excitation; 100 112 G4double _gammaCreationTime; 113 //JMQ 180410 114 G4int _A; 115 G4int _Z; 116 G4NuclearLevelManager * _levelManager; 117 //JMQ 190410 118 G4double _tolerance; 101 119 }; 102 120 -
trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4E1Probability.hh
r819 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4E1Probability.hh,v 1.5 2010/05/19 10:21:44 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 28 // 29 //--------------------------------------------------------------------- 30 // 31 // Geant4 header G4E1Probability 32 // 33 // by V. Lara (May 2003) 34 // 35 // Modifications: 36 // 18.05.2010 V.Ivanchenko trying to speedup the most slow method 37 // by usage of G4Pow, integer A and introduction of const members 26 38 // 27 39 // … … 33 45 #include "G4VEmissionProbability.hh" 34 46 #include "G4Fragment.hh" 35 #include "G4VLevelDensityParameter.hh" 47 48 class G4Pow; 36 49 37 50 class G4E1Probability : public G4VEmissionProbability … … 40 53 public: 41 54 42 G4E1Probability() {};55 G4E1Probability(); 43 56 44 ~G4E1Probability();57 virtual ~G4E1Probability(); 45 58 46 59 G4double EmissionProbability(const G4Fragment& frag, const G4double excite); … … 48 61 49 62 private: 50 51 // G4E1Probability() {};52 63 53 64 G4E1Probability(const G4E1Probability& right); … … 58 69 59 70 // Integrator (simple Gaussian quadrature) 60 61 71 G4double EmissionIntegration(const G4Fragment& frag, const G4double excite, 62 72 const G4double lowLim, const G4double upLim, 63 73 const G4int numIters); 64 74 65 // G4VLevelDensityParameter* _levelDensity; // Don't need this 75 // members 76 G4Pow* fG4pow; 77 G4double theLevelDensityParameter; 78 G4double normC; 66 79 67 80 }; -
trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4PhotonEvaporation.hh
r962 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4PhotonEvaporation.hh,v 1.7 2010/05/11 11:22:14 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 26 28 // 27 29 // ------------------------------------------------------------------- … … 36 38 // Creation date: 23 October 1998 37 39 // 38 // 40 //Modifications: 39 41 // 40 // 42 // 18 October 2002, Fan Lei (flei@space.qinetiq.com) 41 43 // 42 44 // Implementation of Internal Convertion process in discrete deexcitation … … 54 56 // G4ElectronOccupancy _eOccupancy; 55 57 // G4int _vShellNumber; 58 // 59 // 11 May 2010, V.Ivanchenko added EmittedFragment and BreakUpFragment 60 // methods 56 61 // 57 62 // ------------------------------------------------------------------- … … 61 66 62 67 #include "globals.hh" 63 #include "G4VPhotonEvaporation.hh"64 68 #include "G4VEvaporationChannel.hh" 65 69 #include "G4VEmissionProbability.hh" … … 67 71 #include "G4ElectronOccupancy.hh" 68 72 69 //#define debug70 71 73 class G4Fragment; 72 74 73 class G4PhotonEvaporation : public G4V PhotonEvaporation, public G4VEvaporationChannel {75 class G4PhotonEvaporation : public G4VEvaporationChannel { 74 76 75 77 public: … … 79 81 virtual ~G4PhotonEvaporation(); 80 82 83 virtual void Initialize(const G4Fragment & fragment); 84 85 virtual G4Fragment* EmittedFragment(G4Fragment* theNucleus); 86 87 virtual G4FragmentVector* BreakUpFragment(G4Fragment* theNucleus); 88 81 89 virtual G4FragmentVector * BreakItUp(const G4Fragment & nucleus); 82 83 virtual void Initialize(const G4Fragment & fragment);84 90 85 91 virtual G4FragmentVector * BreakUp(const G4Fragment & nucleus); … … 99 105 void SetEOccupancy( G4ElectronOccupancy eOccupancy) ; 100 106 101 102 107 G4ElectronOccupancy GetEOccupancy () { return _eOccupancy;} ; 103 108 … … 111 116 G4VGammaDeexcitation * _discrDeexcitation; 112 117 G4VGammaDeexcitation * _contDeexcitation; 113 // G4VGammaDeexcitation * _cdDeexcitation;114 118 115 119 G4ElectronOccupancy _eOccupancy; 116 120 G4int _vShellNumber; 117 121 118 G4Fragment _nucleus;122 G4Fragment* _nucleus; 119 123 G4double _gammaE; 120 124 121 125 G4PhotonEvaporation(const G4PhotonEvaporation & right); 122 123 126 const G4PhotonEvaporation & operator = (const G4PhotonEvaporation & right); 124 127 125 // MGP - Check == and != multiple inheritance... must be a mess!126 128 G4bool operator == (const G4PhotonEvaporation & right) const; 127 129 G4bool operator != (const G4PhotonEvaporation & right) const; 128 130 129 #ifdef debug130 void CheckConservation(const G4Fragment & theInitialState, G4FragmentVector * Result) const;131 #endif131 //#ifdef debug 132 // void CheckConservation(const G4Fragment & theInitialState, G4FragmentVector * Result) const; 133 //#endif 132 134 133 135 -
trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4VGammaDeexcitation.hh
r819 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VGammaDeexcitation.hh,v 1.8 2010/04/28 14:22:40 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 26 28 // 27 29 // ------------------------------------------------------------------- … … 37 39 // 38 40 // Modifications: 41 // 42 // 15 April 1999, Alessandro Brunengo (Alessandro.Brunengo@ge.infn.it) 43 // Added creation time evaluation for products of evaporation 44 // 45 // 21 Nov 2001, Fan Lei (flei@space.qinetiq.com) 46 // Modified GenerateGamma() and UpdateUncleus() for implementation 47 // of Internal Conversion processs 48 // 49 // 8 March 2002, Fan Lei (flei@space.qinetiq.com) 50 // Added SetEO () , GetEO(), UpdateElectrons() to allow the assignment 51 // and modification of electron configuration. 39 52 // 40 53 // 18 October 2002, F. Lei … … 43 56 // Added SetVaccantSN(). It is need to to re-set _vSN after each 44 57 // IC happened. 45 //46 // 8 March 2002, Fan Lei (flei@space.qinetiq.com)47 // Added SetEO () , GetEO(), UpdateElectrons() to allow the assignment48 // and modification of electron configuration.49 //50 // 21 Nov 2001, Fan Lei (flei@space.qinetiq.com)51 // Modified GenerateGamma() and UpdateUncleus() for implementation52 // of Internal Conversion processs53 58 // 54 // 15 April 1999, Alessandro Brunengo (Alessandro.Brunengo@ge.infn.it) 55 // Added creation time evaluation for products of evaporation 59 // 28 April 2010, V.Ivanchenko cleanup methods 56 60 // 57 61 // ------------------------------------------------------------------- 62 // 58 63 59 64 #ifndef G4VGAMMADEEXCITATION_HH … … 70 75 public: 71 76 72 77 G4VGammaDeexcitation(); 73 78 74 79 virtual ~G4VGammaDeexcitation(); 75 80 76 77 virtual G4bool CanDoTransition() const= 0;81 virtual G4VGammaTransition * CreateTransition() = 0; 82 virtual G4bool CanDoTransition() = 0; 78 83 79 80 virtualG4FragmentVector * DoTransition();84 // Single gamma transition 85 G4FragmentVector * DoTransition(); 81 86 82 83 virtualG4FragmentVector * DoChain();87 // Chain of gamma transitions 88 G4FragmentVector * DoChain(); 84 89 85 virtualG4Fragment * GenerateGamma();90 G4Fragment * GenerateGamma(); 86 91 87 virtual const G4Fragment & GetNucleus() const;92 inline G4Fragment* GetNucleus(); 88 93 89 virtual void SetNucleus(const G4Fragment &nucleus);94 inline void SetNucleus(G4Fragment* nucleus); 90 95 91 virtualvoid SetVerboseLevel(G4int verbose);96 inline void SetVerboseLevel(G4int verbose); 92 97 93 void SetEO(G4ElectronOccupancy eo) { _electronO = eo; }; 94 void SetVaccantSN( G4int val ) { _vSN = val;}; 98 inline void Initialize(); 99 100 void SetEO(G4ElectronOccupancy eo) { _electronO = eo; }; 101 void SetVaccantSN( G4int val ) { _vSN = val;}; 95 102 96 G4ElectronOccupancy GetEO() { return _electronO; }; 97 G4int GetVacantSN() {return _vSN;}; 103 G4ElectronOccupancy GetEO() { return _electronO; }; 104 G4int GetVacantSN() {return _vSN;}; 105 98 106 protected: 99 107 100 void Initialize(); 101 void UpdateNucleus(const G4Fragment * gamma); 102 void UpdateElectrons (); 103 void Update(); 108 void Update(); 104 109 105 G4VGammaTransition* _transition; // Owned pointer106 110 G4VGammaTransition* _transition; // Owned pointer 111 G4int _verbose; 107 112 108 113 private: 109 114 110 G4Fragment_nucleus;111 112 115 G4Fragment* _nucleus; 116 G4ElectronOccupancy _electronO; 117 G4int _vSN; 113 118 114 G4VGammaDeexcitation(const G4VGammaDeexcitation & right); 115 116 const G4VGammaDeexcitation & operator = (const G4VGammaDeexcitation & right); 117 G4bool operator == (const G4VGammaDeexcitation & right) const; 118 G4bool operator != (const G4VGammaDeexcitation & right) const; 119 G4VGammaDeexcitation(const G4VGammaDeexcitation & right); 120 const G4VGammaDeexcitation & operator = (const G4VGammaDeexcitation & right); 121 G4bool operator == (const G4VGammaDeexcitation & right) const; 122 G4bool operator != (const G4VGammaDeexcitation & right) const; 119 123 120 124 }; 125 126 inline G4Fragment* G4VGammaDeexcitation::GetNucleus() 127 { 128 return _nucleus; 129 } 130 131 inline void G4VGammaDeexcitation::SetNucleus(G4Fragment* nucleus) 132 { 133 _nucleus = nucleus; 134 } 135 136 inline void G4VGammaDeexcitation::SetVerboseLevel(G4int verbose) 137 { 138 _verbose = verbose; 139 } 140 141 inline void G4VGammaDeexcitation::Initialize() 142 { 143 if (_transition != 0) { delete _transition; } 144 _transition = CreateTransition(); 145 if (_transition != 0) { 146 _transition->SetEnergyFrom(_nucleus->GetExcitationEnergy()); 147 } 148 } 121 149 122 150 #endif -
trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4VPhotonEvaporation.hh
r819 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VPhotonEvaporation.hh,v 1.3 2010/04/25 18:43:21 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 26 28 // 27 29 // ------------------------------------------------------------------- -
trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4ContinuumGammaDeexcitation.cc
r819 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4ContinuumGammaDeexcitation.cc,v 1.7 2010/04/30 16:08:03 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 26 28 // 27 29 // ------------------------------------------------------------------- … … 40 42 // 41 43 // 02 May 2003, Vladimir Ivanchenko change interface to G4NuclearlevelManager 44 // 45 // 19 April 2010 J. M. Quesada: smaller value of tolerance parameter 42 46 // 43 47 // ------------------------------------------------------------------- … … 61 65 // 62 66 63 G4ContinuumGammaDeexcitation::G4ContinuumGammaDeexcitation(): _nucleusZ(0), _nucleusA(0), _levelManager(0) 67 G4ContinuumGammaDeexcitation::G4ContinuumGammaDeexcitation() 68 : _nucleusZ(0), _nucleusA(0), _levelManager(0) 64 69 { } 65 70 … … 71 76 G4VGammaTransition* G4ContinuumGammaDeexcitation::CreateTransition() 72 77 { 73 G4Fragment nucleus = GetNucleus();74 G4int Z = static_cast<G4int>(nucleus .GetZ());75 G4int A = static_cast<G4int>(nucleus .GetA());76 G4double excitation = nucleus .GetExcitationEnergy();78 G4Fragment* nucleus = GetNucleus(); 79 G4int Z = static_cast<G4int>(nucleus->GetZ()); 80 G4int A = static_cast<G4int>(nucleus->GetA()); 81 G4double excitation = nucleus->GetExcitationEnergy(); 77 82 78 83 if (_nucleusA != A || _nucleusZ != Z) … … 83 88 } 84 89 85 if (_verbose > 1) 90 if (_verbose > 1) { 86 91 G4cout << "G4ContinuumGammaDeexcitation::CreateTransition - Created" << G4endl; 87 92 } 88 93 G4VGammaTransition* gt = new G4ContinuumGammaTransition(_levelManager,Z,A,excitation,_verbose ); 89 94 … … 92 97 93 98 94 G4bool G4ContinuumGammaDeexcitation::CanDoTransition() const99 G4bool G4ContinuumGammaDeexcitation::CanDoTransition() 95 100 { 96 G4bool canDo = true; 101 //JMQ: far too small, creating sometimes continuum gammas instead of the right discrete ones 102 // (when excitation energy is slightly over maximum discrete energy): changed 103 // G4double tolerance = 10*eV; 104 const G4double tolerance = CLHEP::keV; 97 105 98 106 if (_transition == 0) 99 107 { 100 canDo = false; 101 102 if (_verbose > 0) 103 G4cout 104 << "G4ContinuumGammaDeexcitation::CanDoTransition - Null transition " 105 << G4endl; 108 if (_verbose > 0) { 109 G4cout << "G4ContinuumGammaDeexcitation::CanDoTransition - Null transition " 110 << G4endl; 111 } 112 return false; 106 113 } 107 114 108 G4Fragment nucleus = GetNucleus();109 G4double excitation = nucleus .GetExcitationEnergy();115 G4Fragment* nucleus = GetNucleus(); 116 G4double excitation = nucleus->GetExcitationEnergy(); 110 117 111 G4double A = nucleus.GetA();112 G4double Z = nucleus.GetZ();113 if ( A <2 ||Z<3)118 // G4int A = (G4int)nucleus->GetA(); 119 // G4int Z = (G4int)nucleus->GetZ(); 120 if (_nucleusA<2 || _nucleusZ<3) 114 121 { 115 canDo = false;116 if (_verbose > 0) 117 G4cout118 << "G4ContinuumGammaDeexcitation::CanDoTransition - n/p/H" 119 << G4endl;122 if (_verbose > 1) { 123 G4cout << "G4ContinuumGammaDeexcitation::CanDoTransition - n/p/H" 124 << G4endl; 125 } 126 return false; 120 127 } 121 128 122 123 124 if (excitation <= 0.) 129 if (excitation <= tolerance) 125 130 { 126 canDo = false; 127 if (_verbose > 0) 128 G4cout 129 << "G4ContinuumGammaDeexcitation::CanDoTransition - Excitation <= 0" 130 << G4endl; 131 if (_verbose > 1) { 132 G4cout << "G4ContinuumGammaDeexcitation::CanDoTransition - Excitation " 133 << excitation/CLHEP::keV << " keV is too small" 134 << G4endl; 135 } 136 return false; 131 137 } 132 G4double tolerance = 10*eV;133 if (excitation <= (_levelManager->MaxLevelEnergy()+ tolerance))134 {135 canDo = false;136 if (_verbose > 0) 137 G4cout << "G4ContinuumGammaDeexcitation::CanDoTransition - Excitation " 138 << excitation << " below max discrete level " 139 << _levelManager->MaxLevelEnergy() << G4endl;138 if (excitation <= (_levelManager->MaxLevelEnergy() + tolerance)) 139 { 140 if (_verbose > 0) { 141 G4cout << "G4ContinuumGammaDeexcitation::CanDoTransition - Excitation " 142 << excitation << " below max discrete level " 143 << _levelManager->MaxLevelEnergy() << G4endl; 144 } 145 return false; 140 146 } 141 147 142 if ( canDo)143 { if (_verbose > 1)144 G4cout <<"G4ContinuumGammaDeexcitation::CanDoTransition - CanDo"145 << G4endl;146 } 147 148 return canDo;149 148 if (_verbose > 1) { 149 G4cout <<"G4ContinuumGammaDeexcitation::CanDoTransition - CanDo" 150 << " Eex(keV)= " << excitation/CLHEP::keV 151 << " Emax(keV)= " << _levelManager->MaxLevelEnergy()/CLHEP::keV 152 << " Z= " << _nucleusZ << " A= " << _nucleusA 153 << G4endl; 154 } 155 return true; 150 156 } 151 157 -
trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4DiscreteGammaDeexcitation.cc
r962 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4DiscreteGammaDeexcitation.cc,v 1.15 2010/05/10 07:20:40 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 26 28 // 27 29 // ------------------------------------------------------------------- … … 65 67 _rdm(false), _levelManager(0) 66 68 { 67 _tolerance = 0.1 * MeV;69 _tolerance = CLHEP::keV; 68 70 } 69 71 70 71 G4DiscreteGammaDeexcitation::~G4DiscreteGammaDeexcitation() {} 72 72 G4DiscreteGammaDeexcitation::~G4DiscreteGammaDeexcitation() 73 {} 73 74 74 75 G4VGammaTransition* G4DiscreteGammaDeexcitation::CreateTransition() 75 76 { 76 G4Fragment nucleus = GetNucleus(); 77 G4int A = static_cast<G4int>(nucleus.GetA()); 78 G4int Z = static_cast<G4int>(nucleus.GetZ()); 79 77 G4Fragment* nucleus = GetNucleus(); 78 G4int A = static_cast<G4int>(nucleus->GetA()); 79 G4int Z = static_cast<G4int>(nucleus->GetZ()); 80 // _verbose =2; 81 // G4cout << "G4DiscreteGammaDeexcitation::CreateTransition: " << nucleus << G4endl; 80 82 if (_nucleusA != A || _nucleusZ != Z) 81 83 { … … 84 86 _levelManager = G4NuclearLevelStore::GetInstance()->GetManager(Z,A); 85 87 } 86 87 88 88 89 89 if (_levelManager->IsValid()) … … 96 96 } 97 97 98 G4double excitation = nucleus.GetExcitationEnergy(); 99 // const G4NuclearLevel* level =_levelManager.NearestLevel(excitation, _tolerance); 98 G4double excitation = nucleus->GetExcitationEnergy(); 100 99 const G4NuclearLevel* level =_levelManager->NearestLevel(excitation); 101 100 102 101 if (level != 0) 103 102 { 104 if (_verbose > 0) 103 if (_verbose > 0) { 105 104 G4cout 106 105 << "G4DiscreteGammaDeexcitation::CreateTransition - Created from level energy " 107 106 << level->Energy() << ", excitation is " 108 107 << excitation << G4endl; 109 G4DiscreteGammaTransition* dtransit = new G4DiscreteGammaTransition(*level,Z); 108 } 109 G4DiscreteGammaTransition* dtransit = new G4DiscreteGammaTransition(*level,Z,A); 110 110 dtransit->SetICM(_icm); 111 111 return dtransit; … … 113 113 else 114 114 { 115 if (_verbose > 0) 115 if (_verbose > 0) { 116 116 G4cout 117 117 << "G4DiscreteGammaDeexcitation::CreateTransition - No transition created from " 118 118 << excitation << " within tolerance " << _tolerance << G4endl; 119 119 } 120 120 return 0; 121 121 } 122 122 } 123 elsereturn 0;123 return 0; 124 124 } 125 125 126 126 127 G4bool G4DiscreteGammaDeexcitation::CanDoTransition() const127 G4bool G4DiscreteGammaDeexcitation::CanDoTransition() 128 128 { 129 129 … … 138 138 << G4endl; 139 139 } 140 G4Fragment nucleus = GetNucleus();141 140 if (canDo) { 142 G4double A = nucleus.GetA(); 143 G4double Z = nucleus.GetZ(); 144 if (Z<2 || A<3 || Z>98) 141 if (_nucleusZ<2 || _nucleusA<3 || _nucleusZ>98) 145 142 { 146 143 canDo = false; … … 152 149 } 153 150 154 G4double excitation = nucleus.GetExcitationEnergy(); 151 G4Fragment* nucleus = GetNucleus(); 152 G4double excitation = nucleus->GetExcitationEnergy(); 153 //G4cout << "G4DiscreteGammaDeexcitation::CanDoTransition: " << nucleus << G4endl; 155 154 156 155 if (canDo) { 157 if (excitation <= 0.) {156 if (excitation <= _tolerance) { 158 157 canDo = false; 159 if (_verbose > 0) 158 if (_verbose > 0) { 160 159 G4cout 161 160 << "G4DiscreteGammaDeexcitation::CanDoTransition - Excitation <= 0" 161 << excitation << " " << excitation - _tolerance 162 162 << G4endl; 163 } 163 164 } else { 164 165 if (excitation > _levelManager->MaxLevelEnergy() + _tolerance) canDo = false; 165 if (excitation < _levelManager->MinLevelEnergy() - _tolerance) canDo = false;166 //if (excitation < _levelManager->MinLevelEnergy() - _tolerance) canDo = false; 166 167 // The following is a protection to avoid looping in case of elements with very low 167 168 // ensdf levels 168 if (excitation < _levelManager->MinLevelEnergy() * 0.9) canDo = false;169 //if (excitation < _levelManager->MinLevelEnergy() * 0.9) canDo = false; 169 170 170 171 if (_verbose > 0) { -
trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4DiscreteGammaTransition.cc
r819 r1315 37 37 // 38 38 // Modifications: 39 // 15 April 1999, Alessandro Brunengo (Alessandro.Brunengo@ge.infn.it) 40 // Added creation time evaluation for products of evaporation 41 // 42 // 21 Nov. 2001, Fan Lei (flei@space.qinetiq.com) 43 // i) added G4int _nucleusZ initialise it through the constructor 44 // ii) modified SelectGamma() to allow the generation of conversion electrons 45 // iii) added #include G4AtomicShells.hh 46 // 39 47 // 09 Sep. 2002, Fan Lei (flei@space.qinetiq.com) 40 48 // Added renormalization to determine whether transition leads to 41 49 // electron or gamma in SelectGamma() 42 50 // 43 // 21 Nov. 2001, Fan Lei (flei@space.qinetiq.com)44 // i) added G4int _nucleusZ initialise it through the constructor45 // ii) modified SelectGamma() to allow the generation of conversion electrons46 // iii) added #include G4AtomicShells.hh47 // 48 // 15 April 1999, Alessandro Brunengo (Alessandro.Brunengo@ge.infn.it)49 // Added creation time evaluation for products of evaporation51 // 19 April 2010, J. M. Quesada. 52 // Corrections added for taking into account mismatch between tabulated 53 // gamma energies and level energy differences (fake photons eliminated) 54 // 55 // 9 May 2010, V.Ivanchenko 56 // Removed unphysical corretions of gamma energy; fixed default particle 57 // as gamma; do not subtract bounding energy in case of electron emmision 50 58 // 51 59 // ------------------------------------------------------------------- … … 55 63 #include "G4RandGeneralTmp.hh" 56 64 #include "G4AtomicShells.hh" 65 //JMQ: 66 #include "G4NuclearLevelStore.hh" 67 #include "G4Pow.hh" 57 68 58 69 G4DiscreteGammaTransition::G4DiscreteGammaTransition(const G4NuclearLevel& level): … … 60 71 { } 61 72 62 G4DiscreteGammaTransition::G4DiscreteGammaTransition(const G4NuclearLevel& level, G4int Z): 73 //JMQ: now A is also needed in the constructor 74 //G4DiscreteGammaTransition::G4DiscreteGammaTransition(const G4NuclearLevel& level, G4int Z): 75 G4DiscreteGammaTransition::G4DiscreteGammaTransition(const G4NuclearLevel& level, G4int Z, G4int A): 63 76 _nucleusZ(Z), _orbitE(-1), _bondE(0.), _aGamma(true), _icm(false), _gammaEnergy(0.), 64 _level(level), _excitation(0.), _gammaCreationTime(0.) 77 _level(level), _excitation(0.), _gammaCreationTime(0.),_A(A),_Z(Z) 65 78 { 66 79 _verbose = 0; 80 //JMQ: added tolerence in the mismatch 81 _tolerance = CLHEP::keV; 67 82 } 68 83 … … 74 89 void G4DiscreteGammaTransition::SelectGamma() 75 90 { 76 91 // default gamma 92 _aGamma = true; 77 93 _gammaEnergy = 0.; 78 94 79 95 G4int nGammas = _level.NumberOfGammas(); 80 96 if (nGammas > 0) 81 97 { 82 98 G4double random = G4UniformRand(); 83 84 G4int iGamma = 0;85 for(iGamma=0; iGamma < nGammas;iGamma++)99 100 G4int iGamma; 101 for(iGamma=0; iGamma<nGammas; ++iGamma) 86 102 { 87 103 if(random <= (_level.GammaCumulativeProbabilities())[iGamma]) 88 break;104 { break; } 89 105 } 90 91 106 92 107 // Small correction due to the fact that there are mismatches between 93 108 // nominal level energies and emitted gamma energies 94 95 G4double eCorrection = _level.Energy() - _excitation;96 109 110 // 09.05.2010 VI : it is an error ? 111 G4double eCorrection = _level.Energy() - _excitation; 97 112 _gammaEnergy = (_level.GammaEnergies())[iGamma] - eCorrection; 98 113 114 //JMQ: 115 //1)If chosen gamma energy is close enough to excitation energy, the later 116 // is used instead for gamma dacey to gs (it guarantees energy conservation) 117 //2)For energy conservation, level energy differences instead of tabulated 118 // gamma energies must be used (origin of final fake photons) 119 120 if(_excitation - _gammaEnergy < _tolerance) 121 { 122 _gammaEnergy =_excitation; 123 } 124 else 125 { 126 _levelManager = G4NuclearLevelStore::GetInstance()->GetManager(_Z,_A); 127 _gammaEnergy = _excitation - 128 _levelManager->NearestLevel(_excitation - _gammaEnergy)->Energy(); 129 } 130 99 131 // Warning: the following check is needed to avoid loops: 100 132 // Due essentially to missing nuclear levels in data files, it is … … 106 138 // but this change needs a more complex revision of actual design. 107 139 // I leave this for a later revision. 108 109 if (_gammaEnergy < _level.Energy()*10e-5) _gammaEnergy = _excitation; 140 141 if (_gammaEnergy < _level.Energy()*10.e-5) _gammaEnergy = _excitation; 142 143 //G4cout << "G4DiscreteGammaTransition::SelectGamma: " << _gammaEnergy 144 // << " _icm: " << _icm << G4endl; 145 110 146 // now decide whether Internal Coversion electron should be emitted instead 111 147 if (_icm) { … … 144 180 } 145 181 } 146 if (_verbose > 0) 182 _bondE = G4AtomicShells::GetBindingEnergy(_nucleusZ, iShell); 183 if (_verbose > 0) { 147 184 G4cout << "G4DiscreteGammaTransition: _nucleusZ = " <<_nucleusZ 148 185 << " , iShell = " << iShell 149 << " , Shell binding energy = " << G4AtomicShells::GetBindingEnergy(_nucleusZ, iShell) /keV186 << " , Shell binding energy = " << _bondE/keV 150 187 << " keV " << G4endl; 151 _bondE = G4AtomicShells::GetBindingEnergy(_nucleusZ, iShell); 152 _gammaEnergy = _gammaEnergy - _bondE; 188 } 189 190 // 09.05.2010 VI : it is an error - cannot subtract bond energy from 191 // transition energy here 192 //_gammaEnergy = _gammaEnergy - _bondE; 193 //G4cout << "_gammaEnergy = " << _gammaEnergy << G4endl; 194 153 195 _orbitE = iShell; 154 196 _aGamma = false ; // emitted is not a gamma now 155 197 } 156 198 } 157 158 G4double tau = _level.HalfLife() / std::log(2.0); 159 160 G4double tMin = 0; 161 G4double tMax = 10.0 * tau; 199 200 G4double tau = _level.HalfLife() / G4Pow::GetInstance()->logZ(2); 201 202 //09.05.2010 VI rewrite samling of decay time 203 // assuming ordinary exponential low 204 _gammaCreationTime = 0.; 205 if(tau > 0.0) { _gammaCreationTime = -tau*log(G4UniformRand()); } 206 207 //G4double tMin = 0; 208 //G4double tMax = 10.0 * tau; 162 209 // Original code, not very efficent 163 210 // G4int nBins = 200; … … 172 219 // G4RandGeneralTmp randGeneral(sampleArray, nBins); 173 220 //G4double random = randGeneral.shoot(); 174 221 175 222 //_gammaCreationTime = tMin + (tMax - tMin) * random; 176 223 177 224 // new code by Fan Lei 178 225 // 226 /* 179 227 if (tau != 0 ) 180 228 { … … 186 234 // << _gammaCreationTime/second << G4endl; 187 235 } else { _gammaCreationTime=0.; } 236 */ 188 237 } 189 238 return; 190 239 } 191 240 192 193 //G4bool G4DiscreteGammaTransition::IsAGamma()194 //{195 // return _aGamma;196 //}197 198 199 241 G4double G4DiscreteGammaTransition::GetGammaEnergy() 200 242 { … … 210 252 { 211 253 _excitation = energy; 212 return; 213 } 214 215 216 217 218 219 254 } 255 256 257 258 259 260 -
trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4E1Probability.cc
r819 r1315 25 25 // 26 26 // 27 // Class G4E1Probability.cc 27 // $Id: G4E1Probability.cc,v 1.9 2010/05/25 10:47:24 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 // 30 //--------------------------------------------------------------------- 31 // 32 // Geant4 class G4E1Probability 33 // 34 // by V. Lara (May 2003) 35 // 36 // Modifications: 37 // 18.05.2010 V.Ivanchenko trying to speedup the most slow method 38 // by usage of G4Pow, integer A and introduction of const members 39 // 28 40 // 29 41 30 42 #include "G4E1Probability.hh" 31 #include "G4ConstantLevelDensityParameter.hh"43 //#include "G4ConstantLevelDensityParameter.hh" 32 44 #include "Randomize.hh" 45 #include "G4Pow.hh" 33 46 34 47 // Constructors and operators 35 48 // 36 49 37 G4E1Probability::G4E1Probability(const G4E1Probability& ) : G4VEmissionProbability() 38 { 39 40 throw G4HadronicException(__FILE__, __LINE__, "G4E1Probability::copy_constructor meant to not be accessible"); 41 42 } 43 44 const G4E1Probability& G4E1Probability:: 45 operator=(const G4E1Probability& ) 46 { 47 48 throw G4HadronicException(__FILE__, __LINE__, "G4E1Probability::operator= meant to not be accessible"); 49 return *this; 50 } 51 52 G4bool G4E1Probability::operator==(const G4E1Probability& ) const 53 { 54 55 return false; 56 57 } 58 59 G4bool G4E1Probability::operator!=(const G4E1Probability& ) const 60 { 61 62 return true; 63 64 } 50 G4E1Probability::G4E1Probability():G4VEmissionProbability() 51 { 52 G4double x = CLHEP::pi*CLHEP::hbarc; 53 normC = 1.0 / (x*x); 54 theLevelDensityParameter = 0.125/MeV; 55 fG4pow = G4Pow::GetInstance(); 56 } 57 58 G4E1Probability::~G4E1Probability() 59 {} 65 60 66 61 // Calculate the emission probability … … 68 63 69 64 G4double G4E1Probability::EmissionProbDensity(const G4Fragment& frag, 70 65 const G4double gammaE) 71 66 { 72 67 … … 76 71 // the probability density for photon evaporation from U to U - gammaE 77 72 // (U = nucleus excitation energy, gammaE = total evaporated photon 78 // energy). 79 // fragment = nuclear fragment BEFORE de-excitation 73 // energy). Fragment = nuclear fragment BEFORE de-excitation 80 74 81 75 G4double theProb = 0.0; 82 76 83 const G4double Afrag = frag.GetA(); 84 const G4double Zfrag = frag.GetZ(); 85 const G4double Uexcite = frag.GetExcitationEnergy(); 86 87 if( (Uexcite-gammaE) < 0.0 || gammaE < 0 || Uexcite <= 0) return theProb; 77 G4int Afrag = frag.GetA_asInt(); 78 G4double Uexcite = frag.GetExcitationEnergy(); 79 80 if( (Uexcite-gammaE) < 0.0 || gammaE < 0) { return theProb; } 88 81 89 82 // Need a level density parameter. … … 91 84 // nuclei). 92 85 93 static G4ConstantLevelDensityParameter a; 94 95 G4double aLevelDensityParam = a.LevelDensityParameter(static_cast<G4int>(Afrag), 96 static_cast<G4int>(Zfrag), 97 Uexcite); 98 99 G4double levelDensBef = std::exp(2.0*std::sqrt(aLevelDensityParam*Uexcite)); 100 G4double levelDensAft = std::exp(2.0*std::sqrt(aLevelDensityParam*(Uexcite-gammaE))); 101 86 G4double aLevelDensityParam = Afrag*theLevelDensityParameter; 87 88 // G4double levelDensBef = std::exp(2*std::sqrt(aLevelDensityParam*Uexcite)); 89 // G4double levelDensAft = std::exp(2*std::sqrt(aLevelDensityParam*(Uexcite-gammaE))); 90 // VI reduce number of calls to exp 91 G4double levelDens = 1.0; 92 if( aLevelDensityParam > 0.0 ) { 93 levelDens = std::exp(2*(std::sqrt(aLevelDensityParam*(Uexcite-gammaE)) 94 - std::sqrt(aLevelDensityParam*Uexcite))); 95 } 102 96 // Now form the probability density 103 97 … … 107 101 G4double sigma0 = 2.5 * Afrag * millibarn; // millibarns 108 102 109 G4double Egdp = (40.3 / std::pow(Afrag,0.2) )*MeV;103 G4double Egdp = (40.3 / fG4pow->powZ(Afrag,0.2) )*MeV; 110 104 G4double GammaR = 0.30 * Egdp; 111 105 112 static G4double normC = 1.0 / ((pi * hbarc)*(pi * hbarc));113 114 106 // CD 115 107 //cout<<" PROB TESTS "<<G4endl; … … 124 116 //cout<<" normC = "<<normC<<G4endl; 125 117 126 G4double numerator = sigma0 * gammaE*gammaE * GammaR*GammaR; 127 G4double denominator = (gammaE*gammaE - Egdp*Egdp)* 128 (gammaE*gammaE - Egdp*Egdp) + GammaR*GammaR*gammaE*gammaE; 129 130 G4double sigmaAbs = numerator/denominator; 131 132 theProb = normC * sigmaAbs * gammaE*gammaE * 133 levelDensAft/levelDensBef; 118 // VI implementation 18.05.2010 119 G4double gammaE2 = gammaE*gammaE; 120 G4double gammaR2 = gammaE2*GammaR*GammaR; 121 G4double egdp2 = gammaE2 - Egdp*Egdp; 122 G4double sigmaAbs = sigma0*gammaR2/(egdp2*egdp2 + gammaR2); 123 theProb = normC * sigmaAbs * gammaE2 * levelDens; 124 125 // old implementation 126 // G4double numerator = sigma0 * gammaE*gammaE * GammaR*GammaR; 127 // G4double denominator = (gammaE*gammaE - Egdp*Egdp)* 128 // (gammaE*gammaE - Egdp*Egdp) + GammaR*GammaR*gammaE*gammaE; 129 130 //G4double sigmaAbs = numerator/denominator; 131 //theProb = normC * sigmaAbs * gammaE2 * levelDensAft/levelDensBef; 134 132 135 133 // CD … … 211 209 } 212 210 213 G4E1Probability::~G4E1Probability() {} 214 215 211 -
trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4PhotonEvaporation.cc
r962 r1315 24 24 // ******************************************************************** 25 25 // 26 26 // $Id: G4PhotonEvaporation.cc,v 1.13 2010/05/17 11:47:43 flei Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 27 28 // 28 29 // ------------------------------------------------------------------- … … 37 38 // Creation date: 23 October 1998 38 39 // 39 // 40 // Modifications: 40 41 // 41 // 42 // 8 March 2002, Fan Lei (flei@space.qinetiq.com) 42 43 // 43 44 // Implementation of Internal Convertion process in discrete deexcitation … … 50 51 // G4ElectronOccupancy GetEOccupancy () ; 51 52 // 53 // 11 May 2010, V.Ivanchenko add implementation of EmittedFragment and 54 // BreakUpFragment methods; cleanup logic 55 // 52 56 // ------------------------------------------------------------------- 57 // 53 58 54 59 #include "G4PhotonEvaporation.hh" … … 86 91 void G4PhotonEvaporation::Initialize(const G4Fragment& fragment) 87 92 { 88 _nucleus = fragment; 89 return; 90 } 91 93 _nucleus = const_cast<G4Fragment*>(&fragment); 94 } 95 96 G4Fragment* G4PhotonEvaporation::EmittedFragment(G4Fragment* nucleus) 97 { 98 //G4cout << "G4PhotonEvaporation::EmittedFragment" << G4endl; 99 _nucleus = nucleus; 100 101 // Do one photon emission by the continues deexcitation 102 _contDeexcitation->SetNucleus(_nucleus); 103 _contDeexcitation->Initialize(); 104 105 if(_contDeexcitation->CanDoTransition()) { 106 G4Fragment* gamma = _contDeexcitation->GenerateGamma(); 107 if(gamma) { 108 if (_verbose > 0) { 109 G4cout << "G4PhotonEvaporation::EmittedFragment continium deex: " 110 << gamma << G4endl; 111 G4cout << " Residual: " << nucleus << G4endl; 112 } 113 return gamma; 114 } 115 } 116 117 // Do one photon emission by the discrete deexcitation 118 _discrDeexcitation->SetNucleus(_nucleus); 119 _discrDeexcitation->Initialize(); 120 121 if(_discrDeexcitation->CanDoTransition()) { 122 G4Fragment* gamma = _discrDeexcitation->GenerateGamma(); 123 if(gamma) { 124 if (_verbose > 0) { 125 G4cout << "G4PhotonEvaporation::EmittedFragment discrete deex: " 126 << gamma << G4endl; 127 G4cout << " Residual: " << nucleus << G4endl; 128 } 129 return gamma; 130 } 131 } 132 133 if (_verbose > 0) { 134 G4cout << "G4PhotonEvaporation unable emit gamma: " 135 << nucleus << G4endl; 136 } 137 return 0; 138 } 139 140 G4FragmentVector* G4PhotonEvaporation::BreakUpFragment(G4Fragment* nucleus) 141 { 142 //G4cout << "G4PhotonEvaporation::BreakUpFragment" << G4endl; 143 // The same pointer of primary nucleus 144 _nucleus = nucleus; 145 _contDeexcitation->SetNucleus(_nucleus); 146 _discrDeexcitation->SetNucleus(_nucleus); 147 148 // Do the whole gamma chain 149 G4FragmentVector* products = _contDeexcitation->DoChain(); 150 if( !products ) { products = new G4FragmentVector(); } 151 152 if (_verbose > 0) { 153 G4cout << "G4PhotonEvaporation::BreakUpFragment " << products->size() 154 << " gammas from ContinuumDeexcitation " << G4endl; 155 G4cout << " Residual: " << nucleus << G4endl; 156 } 157 // Products from discrete gamma transitions 158 G4FragmentVector* discrProducts = _discrDeexcitation->DoChain(); 159 if(discrProducts) { 160 _eOccupancy = _discrDeexcitation->GetEO(); 161 _vShellNumber = _discrDeexcitation->GetVacantSN(); 162 163 // not sure if the following line is needed! 164 _discrDeexcitation->SetVaccantSN(-1); 165 166 if (_verbose > 0) { 167 G4cout << "G4PhotonEvaporation::BreakUpFragment " << discrProducts->size() 168 << " gammas from DiscreteDeexcitation " << G4endl; 169 G4cout << " Residual: " << nucleus << G4endl; 170 } 171 G4FragmentVector::iterator i; 172 for (i = discrProducts->begin(); i != discrProducts->end(); ++i) 173 { 174 products->push_back(*i); 175 } 176 delete discrProducts; 177 } 178 179 if (_verbose > 0) { 180 G4cout << "*-*-* Photon evaporation: " << products->size() << G4endl; 181 } 182 return products; 183 } 92 184 93 185 G4FragmentVector* G4PhotonEvaporation::BreakUp(const G4Fragment& nucleus) 94 186 { 95 _nucleus = nucleus; 96 97 G4FragmentVector* products = new G4FragmentVector; 98 99 _contDeexcitation->SetNucleus(nucleus); 100 _discrDeexcitation->SetNucleus(nucleus); 187 //G4cout << "G4PhotonEvaporation::BreakUp" << G4endl; 188 _nucleus = new G4Fragment(nucleus); 189 190 _contDeexcitation->SetNucleus(_nucleus); 191 _discrDeexcitation->SetNucleus(_nucleus); 101 192 102 193 // Do one photon emission … … 104 195 // Products from continuum gamma transitions 105 196 106 G4FragmentVector* contProducts = _contDeexcitation->DoTransition(); 107 108 G4int nCont = 0; 109 if (contProducts != 0) nCont = contProducts->size(); 110 111 G4FragmentVector::iterator i; 112 if (nCont > 0) 113 { 114 G4Fragment modifiedNucleus = _contDeexcitation->GetNucleus(); 115 _discrDeexcitation->SetNucleus(modifiedNucleus); 116 for (i = contProducts->begin(); i != contProducts->end(); i++) 117 { 118 products->push_back(*i); 119 } 120 } 121 else 197 G4FragmentVector* products = _contDeexcitation->DoTransition(); 198 if( !products ) { products = new G4FragmentVector(); } 199 else if(_verbose > 0) { 200 G4cout << "G4PhotonEvaporation::BreakUp " << products->size() 201 << " gammas from ContinuesDeexcitation " << G4endl; 202 G4cout << " Residual: " << nucleus << G4endl; 203 } 204 205 if (0 == products->size()) 122 206 { 123 207 // Products from discrete gamma transitions 124 208 G4FragmentVector* discrProducts = _discrDeexcitation->DoTransition(); 125 126 G4int nDiscr = 0; 127 if (discrProducts != 0) nDiscr = discrProducts->size(); 128 129 if (_verbose > 0) 130 G4cout << " = BreakUp = " << nDiscr 131 << " gammas from DiscreteDeexcitation " 132 << G4endl; 133 134 for (i = discrProducts->begin(); i != discrProducts->end(); i++) 135 { 136 products->push_back(*i); 209 210 if (discrProducts) { 211 _eOccupancy = _discrDeexcitation->GetEO(); 212 _vShellNumber = _discrDeexcitation->GetVacantSN(); 213 214 // not sure if the following line is needed! 215 _discrDeexcitation->SetVaccantSN(-1); 216 // 217 if (_verbose > 0) { 218 G4cout << " = BreakUp = " << discrProducts->size() 219 << " gammas from DiscreteDeexcitation " 220 << G4endl; 221 G4cout << " Residual: " << nucleus << G4endl; 137 222 } 138 discrProducts->clear(); 139 delete discrProducts; 223 G4FragmentVector::iterator i; 224 for (i = discrProducts->begin(); i != discrProducts->end(); ++i) 225 { 226 products->push_back(*i); 227 } 228 delete discrProducts; 229 } 140 230 } 141 142 143 _gammaE = 0.; 144 if (products->size() > 0) 145 { 146 _gammaE = (*(products->begin()))->GetMomentum().e(); 147 } 148 149 contProducts->clear(); 150 delete contProducts; // delete vector, not fragments 151 231 152 232 // Add deexcited nucleus to products 153 G4Fragment* finalNucleus = new G4Fragment(_discrDeexcitation->GetNucleus()); 154 products->push_back(finalNucleus); 155 156 157 if (_verbose > 0) 233 products->push_back(_nucleus); 234 235 if (_verbose > 0) { 158 236 G4cout << "*-*-*-* Photon evaporation: " << products->size() << G4endl; 237 } 159 238 160 239 return products; 161 240 } 162 241 163 164 242 G4FragmentVector* G4PhotonEvaporation::BreakItUp(const G4Fragment& nucleus) 165 243 { 166 _nucleus = nucleus;167 168 G4FragmentVector* products = new G4FragmentVector;169 170 _contDeexcitation->SetNucleus(nucleus); 171 _discrDeexcitation->SetNucleus(nucleus);244 // The same pointer of primary nucleus 245 _nucleus = new G4Fragment(nucleus); 246 _contDeexcitation->SetNucleus(_nucleus); 247 _discrDeexcitation->SetNucleus(_nucleus); 248 249 //G4cout << "G4PhotonEvaporation::BreakItUp: " << nucleus << G4endl; 172 250 173 251 // Do the whole gamma chain 174 175 G4FragmentVector* contProducts = _contDeexcitation->DoChain();252 G4FragmentVector* products = _contDeexcitation->DoChain(); 253 if( !products ) { products = new G4FragmentVector; } 176 254 177 255 // Products from continuum gamma transitions 178 G4int nCont = 0; 179 if (contProducts != 0) nCont = contProducts->size(); 180 181 if (_verbose > 0) 182 G4cout << " = BreakItUp = " << nCont 256 if (_verbose > 0) { 257 G4cout << " = BreakItUp = " << products->size() 183 258 << " gammas from ContinuumDeexcitation " << G4endl; 184 185 G4FragmentVector::iterator i; 186 if (nCont > 0) 187 { 188 G4Fragment modifiedNucleus = _contDeexcitation->GetNucleus(); 189 _discrDeexcitation->SetNucleus(modifiedNucleus); 190 for (i = contProducts->begin(); i != contProducts->end(); i++) 191 { 192 products->push_back(*i); 193 } 194 } 259 } 195 260 196 261 // Products from discrete gamma transitions 197 262 G4FragmentVector* discrProducts = _discrDeexcitation->DoChain(); 198 _eOccupancy = _discrDeexcitation->GetEO(); 199 _vShellNumber = _discrDeexcitation->GetVacantSN(); 200 201 // not sure if the following line is needed! 202 _discrDeexcitation->SetVaccantSN(-1); 203 204 G4int nDiscr = 0; 205 if (discrProducts != 0) nDiscr = discrProducts->size(); 206 207 if (_verbose > 0) 208 G4cout << " = BreakItUp = " << nDiscr 209 << " gammas from DiscreteDeexcitation " << G4endl; 210 211 for (i = discrProducts->begin(); i != discrProducts->end(); i++) 212 { 213 products->push_back(*i); 263 if(discrProducts) { 264 _eOccupancy = _discrDeexcitation->GetEO(); 265 _vShellNumber = _discrDeexcitation->GetVacantSN(); 266 267 // not sure if the following line is needed! 268 _discrDeexcitation->SetVaccantSN(-1); 269 270 if (_verbose > 0) { 271 G4cout << " = BreakItUp = " << discrProducts->size() 272 << " gammas from DiscreteDeexcitation " << G4endl; 214 273 } 215 274 G4FragmentVector::iterator i; 275 for (i = discrProducts->begin(); i != discrProducts->end(); ++i) 276 { 277 products->push_back(*i); 278 } 279 delete discrProducts; 280 } 216 281 // Add deexcited nucleus to products 217 G4Fragment* finalNucleus = new G4Fragment(_discrDeexcitation->GetNucleus()); 218 products->push_back(finalNucleus); 219 if (_verbose > 0) 220 G4cout << " = BreakItUp = Nucleus added to products" << G4endl; 221 222 if (_verbose > 0) 282 products->push_back(_nucleus); 283 284 if (_verbose > 0) { 223 285 G4cout << "*-*-* Photon evaporation: " << products->size() << G4endl; 224 225 #ifdef debug 226 CheckConservation(nucleus,products); 227 #endif 228 contProducts->clear(); 229 discrProducts->clear(); 230 delete contProducts; // delete vector, not fragments 231 delete discrProducts; 286 } 232 287 return products; 233 288 } … … 236 291 { 237 292 G4double prob = 0.; 238 if (_probAlgorithm != 0) prob = _probAlgorithm->EmissionProbability(_nucleus,_gammaE); 293 if (_probAlgorithm != 0) { 294 prob = _probAlgorithm->EmissionProbability(*_nucleus,_gammaE); 295 } 239 296 return prob; 240 297 } -
trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4VGammaDeexcitation.cc
r819 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4VGammaDeexcitation.cc,v 1.17 2010/05/09 17:31:23 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 26 28 // 27 29 // ------------------------------------------------------------------- … … 45 47 // Added creation time evaluation for products of evaporation 46 48 // 49 // 19 April 2010, J. M. Quesada calculations in CM system 50 // pending final boost to lab system (not critical) 51 // 52 // 23 April 2010, V.Ivanchenko rewite kinematic part using PDG formula 53 // for 2-body decay 47 54 // 48 55 // ------------------------------------------------------------------- … … 64 71 #include "G4DiscreteGammaTransition.hh" 65 72 73 66 74 G4VGammaDeexcitation::G4VGammaDeexcitation(): _transition(0), _verbose(0), 67 75 _electronO (0), _vSN(-1) 68 76 { } 69 77 70 71 78 G4VGammaDeexcitation::~G4VGammaDeexcitation() 72 79 { 73 // if (_transition != 0) delete _transition; 74 } 75 80 if (_transition != 0) { delete _transition; } 81 } 76 82 77 83 G4FragmentVector* G4VGammaDeexcitation::DoTransition() 78 84 { 79 // Template method 80 81 Initialize(); 82 G4FragmentVector* products = new G4FragmentVector; 83 85 Initialize(); 86 G4FragmentVector* products = new G4FragmentVector(); 87 84 88 if (CanDoTransition()) 85 89 { 86 G4Fragment* gamma = GenerateGamma(); 87 if (gamma != 0) 88 { 89 products->push_back(gamma); 90 UpdateNucleus(gamma); 91 Update(); 92 } 93 } 94 95 if (_verbose > 1) 90 G4Fragment* gamma = GenerateGamma(); 91 if (gamma != 0) { products->push_back(gamma); } 92 } 93 94 if (_verbose > 1) { 96 95 G4cout << "G4VGammaDeexcitation::DoTransition - Transition deleted " << G4endl; 97 98 if (_transition != 0) delete _transition; 99 96 } 97 100 98 return products; 101 99 } … … 103 101 G4FragmentVector* G4VGammaDeexcitation::DoChain() 104 102 { 103 if (_verbose > 1) { G4cout << "G4VGammaDeexcitation::DoChain" << G4endl; } 104 const G4double tolerance = CLHEP::keV; 105 105 106 Initialize(); 106 G4FragmentVector* products = new G4FragmentVector ;107 107 G4FragmentVector* products = new G4FragmentVector(); 108 108 109 while (CanDoTransition()) 109 { 110 if (_verbose > 5) G4cout << "G4VGammaDeexcitation::DoChain - Looping" << G4endl; 111 110 { 111 _transition->SetEnergyFrom(_nucleus->GetExcitationEnergy()); 112 112 G4Fragment* gamma = GenerateGamma(); 113 113 if (gamma != 0) 114 114 { 115 115 products->push_back(gamma); 116 UpdateNucleus(gamma); 117 UpdateElectrons (); 116 //G4cout << "Eex(keV)= " << _nucleus->GetExcitationEnergy()/keV << G4endl; 117 if(_nucleus->GetExcitationEnergy() <= tolerance) { break; } 118 Update(); 118 119 } 119 Update();120 120 } 121 122 if (_verbose > 1) 123 G4cout << "G4VGammaDeexcitation::DoChain - Transition deleted, end of chain " << G4endl; 124 125 if (_transition != 0) delete _transition; 121 122 if (_verbose > 1) { 123 G4cout << "G4VGammaDeexcitation::DoChain - Transition deleted, end of chain " << G4endl; 124 } 126 125 127 126 return products; 128 127 } 129 128 130 131 const G4Fragment& G4VGammaDeexcitation::GetNucleus() const132 {133 return _nucleus;134 }135 136 137 void G4VGammaDeexcitation::SetNucleus(const G4Fragment& nucleus)138 {139 _nucleus = G4Fragment(nucleus);140 }141 142 143 129 G4Fragment* G4VGammaDeexcitation::GenerateGamma() 144 130 { 131 // 23/04/10 V.Ivanchenko rewrite complitely 145 132 G4double eGamma = 0.; 146 133 147 134 if (_transition != 0) { 148 135 _transition->SelectGamma(); // it can be conversion electron too 149 136 eGamma = _transition->GetGammaEnergy(); 150 } 137 if(eGamma <= 0.0) { return 0; } 138 } 139 G4double excitation = _nucleus->GetExcitationEnergy() - eGamma; 140 if(excitation < 0.0) { excitation = 0.0; } 151 141 if (_verbose > 1 && _transition != 0 ) 152 142 { 153 G4cout << "G4VGammaDeexcitation::GenerateGamma - Gamma energy" << eGamma154 << " ** New excitation " << _nucleus.GetExcitationEnergy() - eGamma143 G4cout << "G4VGammaDeexcitation::GenerateGamma - Edeexc(MeV)= " << eGamma 144 << " ** left Eexc(MeV)= " << excitation 155 145 << G4endl; 156 146 } 157 147 158 // Photon momentum isotropically generated 159 // the same for electron 160 161 if (eGamma > 0.) 162 { 163 G4double cosTheta = 1. - 2. * G4UniformRand(); 164 G4double sinTheta = std::sqrt(1. - cosTheta * cosTheta); 165 G4double phi = twopi * G4UniformRand(); 166 G4double pM = eGamma; 167 G4DiscreteGammaTransition* dtransition = 0; 168 dtransition = dynamic_cast <G4DiscreteGammaTransition*> (_transition); 169 if ( dtransition && !( dtransition->IsAGamma()) ) { 170 G4double eMass = G4Electron::ElectronDefinition()->GetPDGMass(); 171 pM =std::sqrt(eGamma*(eGamma + 2.0*eMass)); 172 eGamma = eGamma + eMass; 173 } 174 G4ThreeVector pGamma( pM * sinTheta * std::cos(phi), 175 pM * sinTheta * std::sin(phi), 176 pM * cosTheta ); 177 G4LorentzVector gamma(pGamma, eGamma); 178 // gamma.boost(_nucleus.GetMomentum().boostVector() ); 179 G4Fragment* gammaFragment ; 180 if ( dtransition && !(dtransition->IsAGamma()) ){ 181 gammaFragment = new G4Fragment(gamma,G4Electron::ElectronDefinition()); 182 } else { 183 gammaFragment = new G4Fragment(gamma,G4Gamma::GammaDefinition()); 184 } 185 G4double gammaTime = _transition->GetGammaCreationTime(); 186 gammaTime += _nucleus.GetCreationTime(); 187 gammaFragment->SetCreationTime(gammaTime); 188 189 if (_verbose > 1 && dtransition ) 190 G4cout << "G4VGammaDeexcitation::GenerateGamma - Gamma fragment generated: " 191 << (dtransition->IsAGamma() ? " Gamma" : " Electron" ) << G4endl; 192 return gammaFragment; 193 } 194 else 195 { 196 return 0; 197 } 198 } 199 200 void G4VGammaDeexcitation::UpdateNucleus(const G4Fragment* gamma) 201 { 202 G4LorentzVector p4Gamma = gamma->GetMomentum(); 203 G4ThreeVector pGamma(p4Gamma.vect()); 204 205 G4double eGamma = 0.; 206 if (_transition != 0) 207 eGamma = _transition->GetGammaEnergy(); 148 // Do complete Lorentz computation 149 150 G4LorentzVector lv = _nucleus->GetMomentum(); 151 G4double Mass = _nucleus->GetGroundStateMass() + excitation; 152 153 // select secondary 154 G4ParticleDefinition* gamma = G4Gamma::Gamma(); 155 208 156 G4DiscreteGammaTransition* dtransition = 0; 209 157 dtransition = dynamic_cast <G4DiscreteGammaTransition*> (_transition); 210 if (dtransition && !(dtransition->IsAGamma()) ) 211 eGamma += dtransition->GetBondEnergy(); 212 213 G4LorentzVector p4Nucleus(_nucleus.GetMomentum() ); 214 215 // New tetravector calculation: 216 217 // G4double Mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(_nucleus.GetZ(),_nucleus.GetA()); 218 G4double m1 = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(static_cast<G4int>(_nucleus.GetZ()), 219 static_cast<G4int>(_nucleus.GetA())); 220 G4double m2 = _nucleus.GetZ() * G4Proton::Proton()->GetPDGMass() + 221 (_nucleus.GetA()- _nucleus.GetZ())*G4Neutron::Neutron()->GetPDGMass(); 222 223 G4double Mass = std::min(m1,m2); 224 225 226 G4double newExcitation = p4Nucleus.mag() - Mass - eGamma; 227 if(newExcitation < 0) 228 newExcitation = 0; 229 230 G4ThreeVector p3Residual(p4Nucleus.vect() - pGamma); 231 G4double newEnergy = std::sqrt(p3Residual * p3Residual + 232 (Mass + newExcitation) * (Mass + newExcitation)); 233 G4LorentzVector p4Residual(p3Residual, newEnergy); 234 235 // G4LorentzVector p4Residual(-pGamma, p4Nucleus.e() - eGamma); 236 // p4Residual.boost( _nucleus.GetMomentum().boostVector() ); 237 238 // Update excited nucleus parameters 239 240 _nucleus.SetMomentum(p4Residual); 241 _nucleus.SetCreationTime(gamma->GetCreationTime()); 242 243 // if (_transition != 0) 244 // { 245 // G4double excitation =_transition->GetEnergyTo(); 246 // if (excitation < 0.) excitation = 0.0; 247 // _nucleus.SetExcitationEnergy(excitation); 248 // } 249 250 return; 251 } 252 253 void G4VGammaDeexcitation::UpdateElectrons( ) 254 { 255 G4DiscreteGammaTransition* dtransition = 0; 256 dtransition = dynamic_cast <G4DiscreteGammaTransition*> (_transition); 257 if (dtransition && !(dtransition->IsAGamma()) ) { 258 158 if ( dtransition && !( dtransition->IsAGamma()) ) { 159 gamma = G4Electron::Electron(); 259 160 _vSN = dtransition->GetOrbitNumber(); 260 161 _electronO.RemoveElectron(_vSN); 261 } 262 return; 162 lv += G4LorentzVector(0.0,0.0,0.0,CLHEP::electron_mass_c2 - dtransition->GetBondEnergy()); 163 } 164 165 // check consistency 166 G4double eMass = gamma->GetPDGMass(); 167 168 G4double Ecm = lv.mag(); 169 G4ThreeVector bst = lv.boostVector(); 170 171 G4double GammaEnergy = 0.5*((Ecm - Mass)*(Ecm + Mass) + eMass*eMass)/Ecm; 172 if(GammaEnergy <= eMass) { return 0; } 173 174 G4double cosTheta = 1. - 2. * G4UniformRand(); 175 G4double sinTheta = std::sqrt(1. - cosTheta * cosTheta); 176 G4double phi = twopi * G4UniformRand(); 177 G4double mom = sqrt((GammaEnergy - eMass)*(GammaEnergy + eMass)); 178 G4LorentzVector Gamma4P(mom * sinTheta * std::cos(phi), 179 mom * sinTheta * std::sin(phi), 180 mom * cosTheta, 181 GammaEnergy); 182 Gamma4P.boost(bst); 183 G4Fragment * thePhoton = new G4Fragment(Gamma4P,gamma); 184 185 G4double gammaTime = _nucleus->GetCreationTime() + _transition->GetGammaCreationTime(); 186 thePhoton->SetCreationTime(gammaTime); 187 188 lv -= Gamma4P; 189 _nucleus->SetMomentum(lv); 190 _nucleus->SetCreationTime(gammaTime); 191 192 //G4cout << "G4VGammaDeexcitation::GenerateGamma left nucleus: " << _nucleus << G4endl; 193 return thePhoton; 263 194 } 264 195 … … 269 200 delete _transition; 270 201 _transition = 0; 271 if (_verbose > 1) 202 if (_verbose > 1) { 272 203 G4cout << "G4VGammaDeexcitation::Update - Transition deleted " << G4endl; 273 } 274 204 } 205 } 206 275 207 _transition = CreateTransition(); 276 208 if (_transition != 0) 277 209 { 278 _transition->SetEnergyFrom(_nucleus .GetExcitationEnergy());279 // 210 _transition->SetEnergyFrom(_nucleus->GetExcitationEnergy()); 211 // if ( _vSN != -1) (dynamic_cast <G4DiscreteGammaTransition*> (_transition))->SetICM(false); 280 212 // the above line is commented out for bug fix #952. It was intruduced for reason that 281 213 // the k-shell electron is most likely one to be kicked out and there is no time for … … 283 215 // reported in #952 284 216 } 285 217 286 218 return; 287 219 } 288 289 290 void G4VGammaDeexcitation::Initialize()291 {292 _transition = CreateTransition();293 if (_transition != 0) {294 _transition->SetEnergyFrom(_nucleus.GetExcitationEnergy());295 }296 return;297 }298 299 300 void G4VGammaDeexcitation::SetVerboseLevel(G4int verbose)301 {302 _verbose = verbose;303 return;304 }305 306 307 308 309 310 -
trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4VPhotonEvaporation.cc
r819 r1315 39 39 // 40 40 // ------------------------------------------------------------------- 41 // 42 // $Id: G4VPhotonEvaporation.cc,v 1.3 2010/04/25 18:43:21 vnivanch Exp $ 43 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 41 44 42 45
Note: See TracChangeset
for help on using the changeset viewer.