Ignore:
Timestamp:
Jun 18, 2010, 11:42:07 AM (14 years ago)
Author:
garnier
Message:

update geant4-09-04-beta-cand-01 interfaces-V09-03-09 vis-V09-03-08

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  
    1414     * Please list in reverse chronological order (last date on top)
    1515     ---------------------------------------------------------------
     16
     179 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
     2225 May 2010 Vladimir Ivanchenko (hadr-deex-V09-03-17)
     23----------------------------------------------------------
     24- G4E1Probability - added numerical protection to avoid division by zero
     25
     2619 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
     3219 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
     4211 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
     5110 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
     6103 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
     7128 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
     8426 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
     9325 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
     10223 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
     10921 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
     11820 April 2010 Vladimir Ivanchenko (hadr-deex-V09-03-06)
     119----------------------------------------------------------
     120- G4GEMProbability - (JQM + VI) fixed numerical problem (division by zero)
     121
     12216 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
     12809 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
     13605 March 2010 Vladimir Ivanchenko (hadr-deex-V09-03-03)
     137----------------------------------------------------------
     138- G4Evaporation - set as a default variant evaporation combined
     139                  standard + GEM probabilities
     140
     14117 February 2009 Vladimir Ivanchenko (hadr-deex-V09-03-02)
     142----------------------------------------------------------
     143- G4ExcitationHandler - deactivate Multi-Fragmentation model
     144
     14505 February 2009 Vladimir Ivanchenko (hadr-deex-V09-03-01)
     146----------------------------------------------------------
     147- G4ExcitationHandler - activate FermiBreakUp and Multi-Fragmentation models
     148
     14918 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,
    16153
    1715409 December 2009 Gunter Folger  (hadr-deex-V09-02-23)
  • trunk/source/processes/hadronic/models/de_excitation/evaporation/include/G4Evaporation.hh

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4Evaporation.hh,v 1.7 2009/07/27 10:32:05 vnivanch Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
     
    3232//
    3333//
    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
    3638
    3739#ifndef G4Evaporation_h
     
    4345#include "G4VEvaporationChannel.hh"
    4446#include "G4Fragment.hh"
     47#include "G4UnstableFragmentBreakUp.hh"
    4548
    4649class G4VEvaporationFactory;
     50class G4NistManager;
    4751
    4852//#define debug
     
    5256public:
    5357  G4Evaporation();
    54   G4Evaporation(std::vector<G4VEvaporationChannel*> * aChannelsVector) :
    55     theChannels(aChannelsVector), theChannelFactory(0)
    56   {};
     58  G4Evaporation(std::vector<G4VEvaporationChannel*> * aChannelsVector);
    5759         
    5860  virtual ~G4Evaporation();
    5961
     62  virtual void Initialise();
     63
    6064private:
     65
     66  void InitialiseEvaporation();
     67
    6168  G4Evaporation(const G4Evaporation &right);
    6269
     
    6673
    6774public:
     75
    6876  G4FragmentVector * BreakItUp(const G4Fragment &theNucleus);
    6977
     
    7785#endif
    7886
    79 
    8087  std::vector<G4VEvaporationChannel*> * theChannels;
     88  std::vector<G4double>   probabilities;
    8189  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;
    9594   
    96     G4double GetTotal() { return total; }
    97   public:
    98     G4double total;
    99    
    100   };
    101 
    10295};
    10396
  • trunk/source/processes/hadronic/models/de_excitation/evaporation/include/G4EvaporationFactory.hh

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4EvaporationFactory.hh,v 1.3 2006/06/29 20:09:55 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
     
    4141{
    4242public:
    43   G4EvaporationFactory() {};
    44   virtual ~G4EvaporationFactory() {};
     43  G4EvaporationFactory();
     44  virtual ~G4EvaporationFactory();
    4545
    4646private:
    47   G4EvaporationFactory(const G4EvaporationFactory & ) : G4VEvaporationFactory() {};
     47  G4EvaporationFactory(const G4EvaporationFactory & );
    4848  const G4EvaporationFactory & operator=(const G4EvaporationFactory & val);
    4949  G4bool operator==(const G4EvaporationFactory & val) const;
  • trunk/source/processes/hadronic/models/de_excitation/evaporation/include/G4VEvaporation.hh

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4VEvaporation.hh,v 1.4 2008/09/19 13:32:54 ahoward Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
     
    4646{
    4747public:
    48   G4VEvaporation() {};
    49   virtual ~G4VEvaporation() {}; // *
     48  G4VEvaporation();
     49  virtual ~G4VEvaporation();
    5050
    5151private: 
     
    5757 
    5858public:
     59
    5960  virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus) = 0;
     61
     62  virtual void Initialise();
    6063
    6164  // for inverse cross section choice
  • trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4AlphaEvaporationProbability.cc

    r1055 r1315  
    225225  ecut = (ecut-a) / (p+p);
    226226  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;
    228231  elab = K * FragmentA / ResidualA;
    229232  sig = 0.;
  • trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4DeuteronEvaporationProbability.cc

    r1055 r1315  
    206206       
    207207  //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
    210211  ecsq = ec * ec;
    211212  p = p0 + p1/ec + p2/ecsq;
     
    225226  ecut = (ecut-a) / (p+p);
    226227  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;
    228232  elab = K * FragmentA / ResidualA;
    229233  sig = 0.;
  • trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4Evaporation.cc

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4Evaporation.cc,v 1.15 2009/09/16 15:32:25 vnivanch Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
     
    3838// superimposed Coulomb barrier (if useSICBis set true, by default is false)
    3939//
    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
    4146
    4247#include "G4Evaporation.hh"
     
    4550#include "G4EvaporationDefaultGEMFactory.hh"
    4651#include "G4HadronicException.hh"
    47 #include <numeric>
     52#include "G4NistManager.hh"
    4853
    4954G4Evaporation::G4Evaporation()
    5055{
    51   theChannelFactory = new G4EvaporationFactory();
    52   //theChannelFactory = new G4EvaporationDefaultGEMFactory();
    53   theChannels = theChannelFactory->GetChannel();
     56  //theChannelFactory = new G4EvaporationFactory();
     57  theChannelFactory = new G4EvaporationDefaultGEMFactory();
     58  InitialiseEvaporation();
     59}
     60
     61G4Evaporation::G4Evaporation(std::vector<G4VEvaporationChannel*> * aChannelsVector)
     62  : theChannels(aChannelsVector), theChannelFactory(0), nChannels(0)
     63{
     64  InitialiseEvaporation();
    5465}
    5566
    5667G4Evaporation::~G4Evaporation()
    5768{
    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
     73void 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
     83void 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    }
    6094}
    6195
     
    6498  if (theChannelFactory != 0) delete theChannelFactory;
    6599  theChannelFactory = new G4EvaporationFactory();
    66   theChannels = theChannelFactory->GetChannel();
     100  InitialiseEvaporation();
    67101}
    68102
     
    71105  if (theChannelFactory != 0) delete theChannelFactory;
    72106  theChannelFactory = new G4EvaporationGEMFactory();
    73   theChannels = theChannelFactory->GetChannel();
     107  InitialiseEvaporation();
    74108}
    75109
     
    78112  if (theChannelFactory != 0) delete theChannelFactory;
    79113  theChannelFactory = new G4EvaporationDefaultGEMFactory();
    80   theChannels = theChannelFactory->GetChannel();
    81 }
    82 
     114  InitialiseEvaporation();
     115}
    83116
    84117G4FragmentVector * G4Evaporation::BreakItUp(const G4Fragment &theNucleus)
    85118{
    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/*
     283G4FragmentVector * G4Evaporation::BreakItUp(const G4Fragment &theNucleus)
     284{
     285  G4FragmentVector * theResult = new G4FragmentVector;
    87286
    88287    // CHECK that Excitation Energy != 0
     
    233432    return theResult;
    234433}
    235 
     434*/
    236435
    237436
  • trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4EvaporationDefaultGEMFactory.cc

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4EvaporationDefaultGEMFactory.cc,v 1.1 2009/07/27 10:20:13 vnivanch Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
     
    122122  theChannel->reserve(68);
    123123
     124  theChannel->push_back( new G4PhotonEvaporation() );          // Photon Channel
     125  theChannel->push_back( new G4CompetitiveFission() );         // Fission Channel
     126
    124127  // JMQ 220709 standard particle evaporation channels (Z<3,A<5)
    125128  theChannel->push_back( new G4NeutronEvaporationChannel() );  // n
     
    192195  theChannel->push_back( new G4Mg28GEMChannel() );     // Mg28
    193196
    194   theChannel->push_back( new G4CompetitiveFission() );         // Fission Channel
    195   theChannel->push_back( new G4PhotonEvaporation() );          // Photon Channel
    196 
    197197  return theChannel;
    198198
  • trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4EvaporationFactory.cc

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4EvaporationFactory.cc,v 1.4 2006/06/29 20:10:29 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
     
    3232
    3333#include "G4EvaporationFactory.hh"
    34 
    3534
    3635#include "G4NeutronEvaporationChannel.hh"
     
    4443#include "G4PhotonEvaporation.hh"
    4544
     45G4EvaporationFactory::G4EvaporationFactory()
     46{}
    4647
    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 
     48G4EvaporationFactory::~G4EvaporationFactory()
     49{}
    6950
    7051std::vector<G4VEvaporationChannel*> *
     
    7556  theChannel->reserve(8);
    7657
     58  theChannel->push_back( new G4PhotonEvaporation() );          // Photon Channel
     59  theChannel->push_back( new G4CompetitiveFission() );         // Fission Channel
     60
    7761  theChannel->push_back( new G4NeutronEvaporationChannel() );  // n
    7862  theChannel->push_back( new G4ProtonEvaporationChannel() );   // p
     
    8266  theChannel->push_back( new G4AlphaEvaporationChannel() );    // Alpha
    8367
    84   theChannel->push_back( new G4CompetitiveFission() );         // Fission Channel
    85   theChannel->push_back( new G4PhotonEvaporation() );          // Photon Channel
    8668
    8769  return theChannel;
  • trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4EvaporationProbability.cc

    r1055 r1315  
    4141#include "G4EvaporationProbability.hh"
    4242#include "G4PairingCorrection.hh"
    43 
     43#include "G4ParticleTable.hh"
     44#include "G4IonTable.hh"
    4445
    4546
  • trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4He3EvaporationProbability.cc

    r1055 r1315  
    221221  ecut = (ecut-a) / (p+p);
    222222  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;
    224227  elab = K * FragmentA / ResidualA;
    225228  sig = 0.;
  • trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4ProtonEvaporationProbability.cc

    r962 r1315  
    9191
    9292///////////////////////////////////////////////////////////////////////////////////
    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
    9494//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
    9798//
    9899G4double G4ProtonEvaporationProbability::CrossSection(const  G4Fragment & fragment, const  G4double K)
     
    110111  FragmentAthrd=std::pow(FragmentA,0.33333);
    111112  U=fragment.GetExcitationEnergy();
    112 
    113113
    114114  if (OPTxs==0) {std::ostringstream errOs;
     
    223223//     ** p from  becchetti and greenlees (but modified with sub-barrier
    224224//     ** correction function and xp2 changed from -449)
    225 // JMQ (june 2008) : refinement of proton cross section for light systems
    226 //
     225
    227226  G4double landa, landa0, landa1, mu, mu0, mu1,nu, nu0, nu1, nu2;
    228227  G4double p, p0, p1, p2;
     
    279278  ecut = (ecut-a) / (p+p);
    280279  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;
    282284  elab = K * FragmentA / ResidualA;
    283285  sig = 0.;
     
    286288    signor2 = (ec-elab-c) / w;
    287289    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
    294292  else            {           //start for  E>Ec
    295293    sig = (landa*elab+mu+nu/elab) * signor;
    296 
    297     //  refinement for proton cross section
    298     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 //
    302294    geom = 0.;
    303295
  • trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4TritonEvaporationProbability.cc

    r1055 r1315  
    219219  ecut = (ecut-a) / (p+p);
    220220  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;
    222225  elab = K * FragmentA / ResidualA;
    223226  sig = 0.;
  • trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4VEvaporation.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    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 $
    2928//
    3029// Hadronic Process: Nuclear De-excitations
     
    3231//
    3332
     33#include "G4VEvaporation.hh"
    3434
    35 #include "G4VEvaporation.hh"
    36 #include "G4HadronicException.hh"
     35G4VEvaporation::G4VEvaporation()
     36{}
    3737
    38 G4VEvaporation::G4VEvaporation(const G4VEvaporation &)
    39 {
    40  throw G4HadronicException(__FILE__, __LINE__, "G4VEvaporation::copy_constructor meant to not be accessable");
    41 }
     38G4VEvaporation::~G4VEvaporation()
     39{}
    4240
    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 }
     41void G4VEvaporation::Initialise()
     42{}
    6243
    6344
  • trunk/source/processes/hadronic/models/de_excitation/fermi_breakup/include/G4FermiPhaseSpaceDecay.hh

    r819 r1315  
    3333#include "G4LorentzVector.hh"
    3434#include "G4ParticleMomentum.hh"
     35#include "Randomize.hh"
     36#include "G4Pow.hh"
    3537#include <CLHEP/Random/RandGamma.h>
    3638
     
    4143{
    4244public:
    43   inline G4FermiPhaseSpaceDecay();
    44   inline ~G4FermiPhaseSpaceDecay();
     45
     46  G4FermiPhaseSpaceDecay();
     47  ~G4FermiPhaseSpaceDecay();
    4548 
    4649  inline std::vector<G4LorentzVector*> *
     
    4851
    4952private:
    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&);
    5458
    5559  inline G4double PtwoBody(G4double E, G4double P1, G4double P2) const;
     
    6973};
    7074
    71 #include "G4FermiPhaseSpaceDecay.icc"
     75inline G4double
     76G4FermiPhaseSpaceDecay::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
     84inline std::vector<G4LorentzVector*> * G4FermiPhaseSpaceDecay::
     85Decay(const G4double parent_mass, const std::vector<G4double>& fragment_masses) const
     86{
     87  return KopylovNBodyDecay(parent_mass,fragment_masses);
     88}
     89
     90inline G4double
     91G4FermiPhaseSpaceDecay::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}
    72118
    73119#endif
  • trunk/source/processes/hadronic/models/de_excitation/fermi_breakup/src/G4FermiConfiguration.cc

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4FermiConfiguration.cc,v 1.12 2009/12/16 17:51:09 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
    3131// by V. Lara (Nov 1998)
    3232//
    33 // J.M.Quesada (12 October 2009) new implementation of Gamma function in configuration weight
    34 
     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.
    3535
    3636#include "G4FermiConfiguration.hh"
     
    4040// Kappa = V/V_0 it is used in calculation of Coulomb energy
    4141// 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;
     45const G4double G4FermiConfiguration::Kappa = 6.0;
    4346
    4447// r0 is the nuclear radius
  • trunk/source/processes/hadronic/models/de_excitation/fermi_breakup/src/G4FermiFragmentsPool.cc

    r1196 r1315  
    2828// by V. Lara
    2929//
    30 // J.M.Quesada (JMQ) July 2009, bug fixed in excitation energies:
     30// J.M.Quesada, July 2009, bug fixed in excitation energies:
    3131// ALL of them are in MeV instead of keV (as they were expressed previously)
    3232// source:  http://www.nndc.bnl.gov/chart
    3333// Unknown excitation energies in He5  and Li5 have been suppressed
    3434// 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.
    3638
    3739#include "G4FermiFragmentsPool.hh"
     
    5153  static const G4StableFermiFragment Fragment04(  3, 2,  2,  0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment04);
    5254  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 supressed
     55  //JMQ 30/06/09 unknown levels have been supressed
    5456  static const G4He5FermiFragment    Fragment06(  5, 2,  4,  0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment06);// He5
    5557  static const G4Li5FermiFragment    Fragment07(  5, 3,  4,  0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment07);// Li5
    5658  static const G4StableFermiFragment Fragment08(  6, 2,  1,  0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment08);
    5759  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);
    5962  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);
    6165  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);
    6368  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);
    6571  static const G4Be8FermiFragment    Fragment17(  8, 4,  1,  0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment17); // Be8
    6672  static const G4StableFermiFragment Fragment18(  9, 4,  4,  0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment18);
    6773  static const G4B9FermiFragment     Fragment19(  9, 5,  4,  0.00*MeV ); if(MapIsEmpty) fragment_pool.push_back(&Fragment19); // B9 
    6874  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);
    7383  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); 
    7992  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);
    8195  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);
    177254
    178255  static std::multimap<const std::pair<G4int,G4int>, const G4VFermiFragment* , std::less<const std::pair<G4int,G4int> > > 
    179256    theMapOfFragments;
    180 
     257 
    181258  if (MapIsEmpty)
    182259    {
    183260      for(size_t i=0; i<fragment_pool.size(); i++)
    184       {
    185         theMapOfFragments.insert(std::pair<const std::pair<G4int,G4int>,
    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(),
    187264                                                                                  fragment_pool[i]->GetZ()),fragment_pool[i]));
    188       }
     265        }
    189266      MapIsEmpty = false;
    190267    }
  • trunk/source/processes/hadronic/models/de_excitation/fermi_breakup/src/G4FermiPhaseSpaceDecay.cc

    r819 r1315  
    3737#include <functional>
    3838
     39G4FermiPhaseSpaceDecay::G4FermiPhaseSpaceDecay()
     40{
     41}
     42
     43G4FermiPhaseSpaceDecay::~G4FermiPhaseSpaceDecay()
     44{
     45}
    3946
    4047std::vector<G4LorentzVector*> *
  • trunk/source/processes/hadronic/models/de_excitation/fission/include/G4FissionBarrier.hh

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4FissionBarrier.hh,v 1.3 2006/06/29 20:13:21 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
  • trunk/source/processes/hadronic/models/de_excitation/fission/src/G4CompetitiveFission.cc

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4CompetitiveFission.cc,v 1.11 2009/03/13 18:57:17 vnivanch Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
     
    3838#include "G4CompetitiveFission.hh"
    3939#include "G4PairingCorrection.hh"
     40#include "G4ParticleMomentum.hh"
    4041
    4142G4CompetitiveFission::G4CompetitiveFission() : G4VEvaporationChannel("fission")
  • trunk/source/processes/hadronic/models/de_excitation/fission/src/G4FissionBarrier.cc

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4FissionBarrier.cc,v 1.5 2006/06/29 20:13:35 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
  • trunk/source/processes/hadronic/models/de_excitation/gem_evaporation/include/G4EvaporationGEMFactory.hh

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4EvaporationGEMFactory.hh,v 1.7 2009/09/15 12:54:16 vnivanch Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
     
    4141{
    4242public:
    43   G4EvaporationGEMFactory() {}
    44   virtual ~G4EvaporationGEMFactory() {}
     43  G4EvaporationGEMFactory();
     44  virtual ~G4EvaporationGEMFactory();
    4545
    4646private:
    47   G4EvaporationGEMFactory(const G4EvaporationGEMFactory & ) : G4VEvaporationFactory() {}
     47  G4EvaporationGEMFactory(const G4EvaporationGEMFactory & );
    4848  const G4EvaporationGEMFactory & operator=(const G4EvaporationGEMFactory & val);
    4949  G4bool operator==(const G4EvaporationGEMFactory & val) const;
  • trunk/source/processes/hadronic/models/de_excitation/gem_evaporation/include/G4GEMProbability.hh

    r819 r1315  
    2424// ********************************************************************
    2525//
     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
    2632//
    2733//
     
    2935// by V. Lara (Sept 2001)
    3036//
    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//
    3341
    3442#ifndef G4GEMProbability_h
     
    4250#include "G4PairingCorrection.hh"
    4351
     52class G4Pow;
     53
    4454class G4GEMProbability : public G4VEmissionProbability
    4555{
    4656public:
    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);
    5463   
    55     ~G4GEMProbability()
    56         {
    57             if (theEvapLDPptr != 0) delete theEvapLDPptr;
    58         }
     64  virtual ~G4GEMProbability();
    5965
     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;}
    6073
    61        
    62     G4double GetZ(void) const { return theZ; }
    63        
    64     G4double GetA(void) const { return theA;}
     74  inline G4double GetSpin(void) const { return Spin; }
    6575
    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  }
    6782
    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  }
    6995   
    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;
    9598   
    9699protected:
    97100 
    98     void SetExcitationEnergiesPtr(std::vector<G4double> * anExcitationEnergiesPtr)
    99         {
    100             ExcitationEnergies = anExcitationEnergiesPtr;
    101         }
     101  inline void SetExcitationEnergiesPtr(std::vector<G4double> * anExcitationEnergiesPtr)
     102  {
     103    ExcitationEnergies = anExcitationEnergiesPtr;
     104  }
    102105 
    103     void SetExcitationSpinsPtr(std::vector<G4double> * anExcitationSpinsPtr)
    104         {
    105             ExcitationSpins = anExcitationSpinsPtr;
    106         }
     106  inline void SetExcitationSpinsPtr(std::vector<G4double> * anExcitationSpinsPtr)
     107  {
     108    ExcitationSpins = anExcitationSpinsPtr;
     109  }
    107110
    108     void SetExcitationLifetimesPtr(std::vector<G4double> * anExcitationLifetimesPtr)
    109         {
    110             ExcitationLifetimes = anExcitationLifetimesPtr;
    111         }
     111  inline void SetExcitationLifetimesPtr(std::vector<G4double> * anExcitationLifetimesPtr)
     112  {
     113    ExcitationLifetimes = anExcitationLifetimesPtr;
     114  }
    112115
    113     void SetCoulombBarrierStrategy(G4VCoulombBarrier * aCoulombBarrier)
    114         {
    115             theCoulombBarrierPtr = aCoulombBarrier;
    116         }
     116  inline void SetCoulombBarrierStrategy(G4VCoulombBarrier * aCoulombBarrier)
     117  {
     118    theCoulombBarrierPtr = aCoulombBarrier;
     119  }
    117120
    118  
    119     // Default constructor
    120     G4GEMProbability() {}
    121121private:
    122     // Copy constructor
    123     G4GEMProbability(const G4GEMProbability &right);
     122
     123  // Copy constructor
     124  G4GEMProbability(const G4GEMProbability &right);
    124125   
    125     const G4GEMProbability & operator=(const G4GEMProbability &right);
    126     G4bool operator==(const G4GEMProbability &right) const;
    127     G4bool operator!=(const G4GEMProbability &right) const;
     126  const G4GEMProbability & operator=(const G4GEMProbability &right);
     127  G4bool operator==(const G4GEMProbability &right) const;
     128  G4bool operator!=(const G4GEMProbability &right) const;
    128129   
    129130public:
    130     G4double EmissionProbability(const G4Fragment & fragment, const G4double anEnergy);
     131
     132  G4double EmissionProbability(const G4Fragment & fragment, const G4double anEnergy);
    131133 
    132134private:
    133135
    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);
    137138
     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);
    138145   
    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;
    143150   
    144     // Data Members
     151  G4VLevelDensityParameter * theEvapLDPptr;
     152       
     153  G4int theA;
     154  G4int theZ;
    145155   
    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;
    150164   
    151     // Spin is fragment spin
    152     G4double Spin;
     165  // Resonances Spin
     166  std::vector<G4double> * ExcitationSpins;
    153167
    154     // Coulomb Barrier
    155     const G4VCoulombBarrier * theCoulombBarrierPtr;
     168  // Resonances half lifetime
     169  std::vector<G4double> * ExcitationLifetimes;
    156170
    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;
    170173   
    171174};
    172175
     176inline G4double G4GEMProbability::I0(const G4double t)
     177{
     178  return std::exp(t) - 1.0;
     179}
     180
     181inline 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
     187inline 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
    173198
    174199#endif
  • trunk/source/processes/hadronic/models/de_excitation/gem_evaporation/src/G4EvaporationGEMFactory.cc

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4EvaporationGEMFactory.cc,v 1.9 2009/09/15 12:54:16 vnivanch Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
     
    103103#include "G4PhotonEvaporation.hh"
    104104
    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 }
     105G4EvaporationGEMFactory::G4EvaporationGEMFactory()
     106{}
     107 
     108G4EvaporationGEMFactory::~G4EvaporationGEMFactory()
     109{}
    125110                 
    126111std::vector<G4VEvaporationChannel*> * G4EvaporationGEMFactory::CreateChannel()
     
    129114    new std::vector<G4VEvaporationChannel*>;
    130115  theChannel->reserve(68);
     116
     117  theChannel->push_back( new G4PhotonEvaporation() );  // Photon Channel
     118  theChannel->push_back( new G4CompetitiveFission() ); // Fission Channel
    131119
    132120  theChannel->push_back( new G4NeutronGEMChannel() );  // n
     
    197185  theChannel->push_back( new G4Mg28GEMChannel() );     // Mg28
    198186
    199   theChannel->push_back( new G4CompetitiveFission() ); // Fission Channel
    200   theChannel->push_back( new G4PhotonEvaporation() );  // Photon Channel
    201 
    202187  return theChannel;
    203188}
  • trunk/source/processes/hadronic/models/de_excitation/gem_evaporation/src/G4GEMProbability.cc

    r1196 r1315  
    2424// ********************************************************************
    2525//
     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)
    2636//
    2737//
     
    3545//       -InitialLeveldensity calculated according to the right conditions of the
    3646//        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
    3752
    3853#include "G4GEMProbability.hh"
    3954#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
     58G4GEMProbability:: 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
     67G4GEMProbability:: 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   
     76G4GEMProbability::~G4GEMProbability()
     77{
     78  delete theEvapLDPptr;
     79}
     80
     81G4double G4GEMProbability::CalcAlphaParam(const G4Fragment & ) const
     82{
     83  return 1.0;
     84}
     85
     86G4double G4GEMProbability::CalcBetaParam(const G4Fragment & ) const
     87{
     88  return 1.0;
     89}
     90
     91G4double G4GEMProbability::CCoeficient(const G4double ) const
     92{
     93  return 0.0;
    6794}
    6895
     
    80107    if (ExcitationEnergies  &&  ExcitationSpins && ExcitationLifetimes) {
    81108      G4double SavedSpin = Spin;
    82       for (unsigned int i = 0; i < ExcitationEnergies->size(); i++) {
     109      for (size_t i = 0; i < ExcitationEnergies->size(); ++i) {
    83110        Spin = ExcitationSpins->operator[](i);
    84111        // substract excitation energies
     
    86113        if (Tmax > 0.0) {
    87114          G4double width = CalcProbability(fragment,Tmax,CoulombBarrier);
     115          //JMQ April 2010 added condition to prevent reported crash
    88116          // 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)) {
    90119            EmissionProbability += width;
    91120          }
     
    98127  return EmissionProbability;
    99128}
     129
     130
     131G4double 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/*
    100264
    101265G4double G4GEMProbability::CalcProbability(const G4Fragment & fragment,
     
    219383  return Width;
    220384}
    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*/
    250386
    251387G4double G4GEMProbability::I3(const G4double s, const G4double sx)
  • trunk/source/processes/hadronic/models/de_excitation/handler/include/G4ExcitationHandler.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    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 $
    2928//
    3029// Hadronic Process: Nuclear De-excitations
     
    5554#include "G4VEvaporation.hh"
    5655#include "G4VPhotonEvaporation.hh"
     56#include "G4VEvaporationChannel.hh"
    5757#include "G4Fragment.hh"
    5858#include "G4DynamicParticle.hh"
     
    6868#include "G4IonConstructor.hh"
    6969
    70 //#define debug
    71 
    7270class G4ExcitationHandler
    7371{
     
    7573  G4ExcitationHandler();
    7674  ~G4ExcitationHandler();
     75
    7776private:
     77
    7878  G4ExcitationHandler(const G4ExcitationHandler &right);
    79 
    8079  const G4ExcitationHandler & operator=(const G4ExcitationHandler &right);
    8180  G4bool operator==(const G4ExcitationHandler &right) const;
    8281  G4bool operator!=(const G4ExcitationHandler &right) const;
    8382 
    84 
    8583public:
     84
    8685  G4ReactionProductVector * BreakItUp(const G4Fragment &theInitialState) const;
    8786
     
    9291  void SetFermiModel(G4VFermiBreakUp *const  value);
    9392
    94   void SetPhotonEvaporation(G4VPhotonEvaporation * const value);
     93  void SetPhotonEvaporation(G4VEvaporationChannel * const value);
    9594
    9695  void SetMaxZForFermiBreakUp(G4int aZ);
     
    9998  void SetMinEForMultiFrag(G4double anE);
    10099
    101 // for inverse cross section choice
    102   inline void SetOPTxs(G4int opt) { OPTxs = opt;}
    103 // for superimposed Coulomb Barrir for inverse cross sections
    104   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();
    105104
    106105private:
    107106
     107  void SetParameters();
     108
    108109  G4ReactionProductVector * Transform(G4FragmentVector * theFragmentVector) const;
    109110
     
    114115  const G4VFermiBreakUp * GetFermiModel() const;
    115116
    116   const G4VPhotonEvaporation * GetPhotonEvaporation() const;
     117  const G4VEvaporationChannel * GetPhotonEvaporation() const;
    117118
    118119  G4int GetMaxZ() const;
     
    124125                         G4FragmentVector * Result) const;
    125126#endif
     127
    126128private:
    127129 
     
    132134  G4VFermiBreakUp *theFermiModel;
    133135 
    134   G4VPhotonEvaporation * thePhotonEvaporation;
     136  G4VEvaporationChannel * thePhotonEvaporation;
    135137
    136138  G4int maxZForFermiBreakUp;
    137139  G4int maxAForFermiBreakUp;
    138140  G4double minEForMultiFrag;
     141  G4double minExcitation;
    139142
    140143  G4ParticleTable *theTableOfParticles;
     
    147150  G4int OPTxs;
    148151  G4bool useSICB;
    149 
     152 
    150153  struct DeleteFragment
    151154  {
     
    156159    }
    157160  };
    158 
    159 
     161 
    160162};
    161163
    162 
     164inline void G4ExcitationHandler::SetOPTxs(G4int opt)
     165{
     166  OPTxs = opt;
     167  SetParameters();
     168}
     169
     170inline void G4ExcitationHandler::UseSICB()
     171{
     172  useSICB = true;
     173  SetParameters();
     174}
    163175
    164176inline const G4VEvaporation * G4ExcitationHandler::GetEvaporation() const
     
    172184  MyOwnEvaporationClass = false;
    173185  theEvaporation = value;
     186  SetParameters();
    174187}
    175188
     
    199212
    200213
    201 inline const G4VPhotonEvaporation * G4ExcitationHandler::GetPhotonEvaporation() const
     214inline const G4VEvaporationChannel * G4ExcitationHandler::GetPhotonEvaporation() const
    202215{
    203216  return thePhotonEvaporation;
    204217}
    205218
    206 inline void G4ExcitationHandler::SetPhotonEvaporation(G4VPhotonEvaporation *const  value)
     219inline void G4ExcitationHandler::SetPhotonEvaporation(G4VEvaporationChannel *const  value)
    207220{
    208221  if (thePhotonEvaporation != 0 && MyOwnPhotonEvaporationClass) delete thePhotonEvaporation;
  • trunk/source/processes/hadronic/models/de_excitation/handler/src/G4ExcitationHandler.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
     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 $
    2628//
    2729// Hadronic Process: Nuclear De-excitations
     
    2931//
    3032//
    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:
    4335//      -Modified the Transform method for use G4ParticleTable and
    4436//       therefore G4IonTable. It makes possible to convert all kind
     
    4941//              MultiFragmentation: G4StatMF
    5042//              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
    5158//
    5259
     
    5461#include "globals.hh"
    5562#include "G4LorentzVector.hh"
     63#include "G4NistManager.hh"
    5664#include <list>
    57 
    58 //#define debugphoton
    59 
    6065
    6166G4ExcitationHandler::G4ExcitationHandler():
    6267  // JMQ 160909 Fermi BreakUp & MultiFrag are on by default
    6368  // 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),
    6774  MyOwnEvaporationClass(true), MyOwnMultiFragmentationClass(true),MyOwnFermiBreakUpClass(true),
    6875  MyOwnPhotonEvaporationClass(true),OPTxs(3),useSICB(false)
     
    7481  theFermiModel = new G4FermiBreakUp;
    7582  thePhotonEvaporation = new G4PhotonEvaporation;
     83  SetParameters();
    7684}
    77 
    78 G4ExcitationHandler::G4ExcitationHandler(const G4ExcitationHandler &)
    79 {
    80   throw G4HadronicException(__FILE__, __LINE__, "G4ExcitationHandler::copy_constructor: is meant to not be accessable! ");
    81 }
    82 
    8385
    8486G4ExcitationHandler::~G4ExcitationHandler()
     
    9092}
    9193
    92 
    93 const G4ExcitationHandler & G4ExcitationHandler::operator=(const G4ExcitationHandler &)
     94void G4ExcitationHandler::SetParameters()
    9495{
    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 &) const
    102 {
    103   throw G4HadronicException(__FILE__, __LINE__, "G4ExcitationHandler::operator==: is meant to not be accessable! ");
    104   return false;
    105 }
    106 
    107 G4bool G4ExcitationHandler::operator!=(const G4ExcitationHandler &) const
    108 {
    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) const
    118 {       
    11996  //for inverse cross section choice
    12097  theEvaporation->SetOPTxs(OPTxs);
    12198  //for the choice of superimposed Coulomb Barrier for inverse cross sections
    12299  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
     103G4ReactionProductVector * G4ExcitationHandler::BreakItUp(const G4Fragment & theInitialState) const
     104{       
    126105 
    127106  // Variables existing until end of method
    128   //G4Fragment * theInitialStatePtr = const_cast<G4Fragment*>(&theInitialState);
    129107  G4Fragment * theInitialStatePtr = new G4Fragment(theInitialState);
     108
    130109  G4FragmentVector * theTempResult = 0;      // pointer which receives temporal results
    131   std::list<G4Fragment*> theEvapList;        // list to apply Evaporation, SMF or Fermi Break-Up
     110  std::list<G4Fragment*> theEvapList;        // list to apply Evaporation or Fermi Break-Up
    132111  std::list<G4Fragment*> theEvapStableList;  // list to apply PhotonEvaporation
    133112  std::list<G4Fragment*> theResults;         // list to store final result
    134113  std::list<G4Fragment*>::iterator iList;
    135114  //
    136   //G4cout << "@@@@@@@@@@ Start G4Exitation Handler @@@@@@@@@@@@@" << G4endl; 
     115  //G4cout << "@@@@@@@@@@ Start G4Excitation Handler @@@@@@@@@@@@@" << G4endl; 
    137116  //G4cout << theInitialState << G4endl; 
    138117 
    139118  // Variables to describe the excited configuration
    140119  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();
    143124 
    144125  // JMQ 150909:  first step in de-excitation chain (SMM will be used only here)
    145126 
    146   // In case A <= 4 the fragment will not perform any nucleon emission
    147   if (A <= 4)
     127  // In case A <= 1 the fragment will not perform any nucleon emission
     128  if (A <= 1)
    148129    {
    149       // I store G4Fragment* in theEvapStableList to apply thePhotonEvaporation later     
    150       theEvapStableList.push_back( theInitialStatePtr );
     130      theResults.push_back( theInitialStatePtr );
    151131    }
    152  
    153   else  // If A > 4 we try to apply theFermiModel, theMultiFragmentation or theEvaporation
     132  // check if a fragment is stable
     133  else if(exEnergy < minExcitation && nist->GetIsotopeAbundance(Z, A) > 0.0)
    154134    {
    155      
     135      theResults.push_back( theInitialStatePtr );
     136    } 
     137  else  // In all cases apply once theFermiModel, theMultiFragmentation or theEvaporation
     138    {     
    156139      // JMQ 150909: first step in de-excitation is treated separately
    157140      // Fragments after the first step are stored in theEvapList
    158       // Statistical Multifragmentation will take place (just in case) only here
     141      // Statistical Multifragmentation will take place only once
    159142      //
    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()))
    163145        {
    164146          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          }
    165155        }
    166156      else   if (exEnergy>GetMinE()*A)
    167157        {
    168158          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          }
    169167        }
    170168      else
     
    174172     
    175173      G4bool deletePrimary = true;
    176       if(theTempResult->size() > 0)
     174      G4int nsec=theTempResult->size();
     175      if(nsec > 0)
    177176        {     
    178           // Store original state in theEvapList
     177          // Sort out secondary fragments
    179178          G4FragmentVector::iterator j;
    180179          for (j = theTempResult->begin(); j != theTempResult->end(); ++j)
    181180            { 
    182181              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                }
    188198            }
    189199        }
     
    204214  for (iList = theEvapList.begin(); iList != theEvapList.end(); ++iList)
    205215    {
    206       A = static_cast<G4int>((*iList)->GetA()+0.5);  // +0.5 to avoid bad truncation
    207       Z = static_cast<G4int>((*iList)->GetZ()+0.5);
     216      A = (*iList)->GetA_asInt();
     217      Z = (*iList)->GetZ_asInt();
    208218         
    209       // In case A <= 4 the fragment will not perform any nucleon emission
    210       if (A <= 4)
     219      // Fermi Break-Up
     220      if ((A < 5) || (A < GetMaxA() && Z < GetMaxZ()))
    211221        {
    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          }
    214229        }
    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                }
    222261            }
    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;
    259265    } // end of the loop over theEvapList
    260266
     
    267273  // -----------------------
    268274 
     275  // normally should not reach this point - it is kind of work around         
    269276  for (iList = theEvapStableList.begin(); iList != theEvapStableList.end(); ++iList)
    270277    {
    271       // take out stable particles and fragments
    272       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       else
     278      // 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)
    277284        {
    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)
    286287            {
    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);
    297289            }
    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
    332296    } // end of photon-evaporation loop
    333297
     
    356320      theFragmentMomentum = (*i)->GetMomentum();
    357321      G4ParticleDefinition* theKindOfFragment = 0;
    358       if (theFragmentA == 0 && theFragmentZ == 0) {       // photon
    359         theKindOfFragment = G4Gamma::GammaDefinition();   
     322      if (theFragmentA == 0) {       // photon or e-
     323        theKindOfFragment = (*i)->GetParticleDefinition();   
    360324      } else if (theFragmentA == 1 && theFragmentZ == 0) { // neutron
    361325        theKindOfFragment = G4Neutron::NeutronDefinition();
  • trunk/source/processes/hadronic/models/de_excitation/management/include/G4VEvaporationChannel.hh

    r1228 r1315  
    2424// ********************************************************************
    2525//
    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 $
    2928//
    3029// Hadronic Process: Nuclear De-excitations
    3130// by V. Lara (Oct 1998)
    3231//
    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//                         
    3940
    4041#ifndef G4VEvaporationChannel_h
     
    4748{
    4849public:
    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();
    5353
    5454private:
     55
    5556  G4VEvaporationChannel(const G4VEvaporationChannel & right);
     57  const G4VEvaporationChannel & operator=(const G4VEvaporationChannel & right);
    5658
    57   const G4VEvaporationChannel & operator=(const G4VEvaporationChannel & right);
    5859public:
     60
    5961  G4bool operator==(const G4VEvaporationChannel & right) const;
    6062  G4bool operator!=(const G4VEvaporationChannel & right) const;
    6163
    62 public:
    6364  virtual void Initialize(const G4Fragment & fragment) = 0;
    6465
     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
    6576  virtual G4FragmentVector * BreakUp(const G4Fragment & theNucleus) = 0;
    6677
    6778  virtual G4double GetEmissionProbability(void) const = 0;
    68 
    6979
    7080  G4String GetName() const {return Name;}
     
    7585  // for superimposed Coulomb Barrier for inverse cross sections       
    7686  inline void UseSICB(G4bool use) { useSICB = use; }   
     87
    7788protected:
     89
    7890  G4int OPTxs;
    7991  G4bool useSICB;
    80 
    8192
    8293private:
  • trunk/source/processes/hadronic/models/de_excitation/management/include/G4VEvaporationFactory.hh

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4VEvaporationFactory.hh,v 1.4 2008/09/19 13:32:54 ahoward Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
     
    4242{
    4343public:
    44   G4VEvaporationFactory() : _channel(0) {};
     44  G4VEvaporationFactory();
    4545  virtual ~G4VEvaporationFactory();
    4646
  • trunk/source/processes/hadronic/models/de_excitation/management/src/G4VEvaporationChannel.cc

    r1228 r1315  
    2424// ********************************************************************
    2525//
    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 $
    2928//
    3029// Hadronic Process: Nuclear De-excitations
    3130// by V. Lara (Oct 1998)
    3231//
     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
    3336
    3437#include "G4VEvaporationChannel.hh"
    3538#include "G4HadronicException.hh"
    3639
    37 G4VEvaporationChannel::G4VEvaporationChannel(const G4VEvaporationChannel &)
    38 {
    39  throw G4HadronicException(__FILE__, __LINE__, "G4VEvaporationChannel::copy_constructor meant to not be accessable");
    40 }
     40G4VEvaporationChannel::G4VEvaporationChannel(const G4String & aName)
     41  : Name(aName)
     42{}
    4143
     44G4VEvaporationChannel::~G4VEvaporationChannel()
     45{}
    4246
    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//}
    5156
    5257G4bool G4VEvaporationChannel::operator==(const G4VEvaporationChannel &right) const
    5358{
    54     return (this == (G4VEvaporationChannel *) &right);
    55     //  return false;
     59  return (this == (G4VEvaporationChannel *) &right);
    5660}
    5761
    5862G4bool G4VEvaporationChannel::operator!=(const G4VEvaporationChannel &right) const
    5963{
    60     return (this != (G4VEvaporationChannel *) &right);
    61     //  return true;
     64  return (this != (G4VEvaporationChannel *) &right);
    6265}
    6366
     67G4Fragment* G4VEvaporationChannel::EmittedFragment(G4Fragment*)
     68{
     69  return 0;
     70}
    6471
     72G4FragmentVector* G4VEvaporationChannel::BreakUpFragment(G4Fragment*)
     73{
     74  return 0;
     75}
  • trunk/source/processes/hadronic/models/de_excitation/management/src/G4VEvaporationFactory.cc

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4VEvaporationFactory.cc,v 1.6 2008/09/19 13:32:54 ahoward Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
     
    3232
    3333#include "G4VEvaporationFactory.hh"
    34 #include "G4HadronicException.hh"
    3534
    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 
     35G4VEvaporationFactory::G4VEvaporationFactory() : _channel(0)
     36{}
    5937
    6038G4VEvaporationFactory::~G4VEvaporationFactory()
  • trunk/source/processes/hadronic/models/de_excitation/multifragmentation/include/G4StatMFFragment.hh

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4StatMFFragment.hh,v 1.3 2006/06/29 20:24:07 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
     
    3636#include "G4StatMFParameters.hh"
    3737#include "G4ThreeVector.hh"
     38#include "G4ParticleTable.hh"
     39#include "G4IonTable.hh"
    3840#include "G4Fragment.hh"
    3941
  • trunk/source/processes/hadronic/models/de_excitation/multifragmentation/include/G4StatMFMacroTemperature.hh

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4StatMFMacroTemperature.hh,v 1.3 2006/06/29 20:24:21 gunter Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
     
    4848                             const G4double ExEnergy, const G4double FreeE0,
    4949                             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);
    6251       
    63     ~G4StatMFMacroTemperature() {};
     52    ~G4StatMFMacroTemperature();
    6453   
    6554    G4double operator()(const G4double T)
     
    6756
    6857private:
     58
    6959    // Default constructor
    70     G4StatMFMacroTemperature() {};
     60    G4StatMFMacroTemperature();
    7161
    7262    // copy constructor
  • trunk/source/processes/hadronic/models/de_excitation/multifragmentation/src/G4StatMFMacroTemperature.cc

    r1228 r1315  
    2525//
    2626//
    27 // $Id: G4StatMFMacroTemperature.cc,v 1.7 2008/11/19 14:33:31 vnivanch Exp $
    28 // GEANT4 tag $Name: geant4-09-03 $
     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 $
    2929//
    3030// Hadronic Process: Nuclear De-excitations
     
    3636//          Moscow, pshenich@fias.uni-frankfurt.de) make algorithm closer to
    3737//          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 
    3841
    3942#include "G4StatMFMacroTemperature.hh"
     43
     44G4StatMFMacroTemperature::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
     59G4StatMFMacroTemperature::G4StatMFMacroTemperature()
     60{}
     61       
     62G4StatMFMacroTemperature::~G4StatMFMacroTemperature()
     63{}
    4064
    4165// operators definitions
     
    82106
    83107    G4int iterations = 0; 
    84     while (fTa < 0.0 && iterations++ < 10) {
     108    while (fTa < 0.0 && ++iterations < 10) {
    85109        Ta -= 0.5*Ta;
    86110        fTa = this->operator()(Ta);
     
    89113    iterations = 0; 
    90114    while (fTa*fTb > 0.0 && iterations++ < 10) {
    91         Tb += 2.*std::abs(Tb-Ta);
     115        Tb += 2.*std::fabs(Tb-Ta);
    92116        fTb = this->operator()(Tb);
    93117    }
     
    96120      G4cerr <<"G4StatMFMacroTemperature:"<<" Ta="<<Ta<<" Tb="<<Tb<< G4endl;
    97121      G4cerr <<"G4StatMFMacroTemperature:"<<" fTa="<<fTa<<" fTb="<<fTb<< G4endl;
    98         throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't bracket the solution.");
     122      throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't bracket the solution.");
    99123    }
    100124
     
    102126    theSolver->SetIntervalLimits(Ta,Tb);
    103127    if (!theSolver->Crenshaw(*this)){
    104       G4cerr <<"G4StatMFMacroTemperature, Crenshaw method failed:"<<" Ta="<<Ta<<" Tb="<<Tb<< G4endl;
    105       G4cerr <<"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;
    106130    }
    107131    _MeanTemperature = theSolver->GetRoot();
     
    111135    // Verify if the root is found and it is indeed within the physical domain,
    112136    // 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;
    120156        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;
    133161    return _MeanTemperature;
    134162}
  • trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4ContinuumGammaDeexcitation.hh

    r819 r1315  
    2424// ********************************************************************
    2525//
     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 $
    2628//
    2729// -------------------------------------------------------------------
     
    6466
    6567  // Destructor
    66   ~G4ContinuumGammaDeexcitation();
     68  virtual ~G4ContinuumGammaDeexcitation();
    6769
    6870  // Functions
     
    7274  virtual G4VGammaTransition* CreateTransition();
    7375
    74   virtual G4bool CanDoTransition() const;
     76  virtual G4bool CanDoTransition();
    7577
    7678private:
  • trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4DiscreteGammaDeexcitation.hh

    r819 r1315  
    2424// ********************************************************************
    2525//
     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 $
    2628//
    2729// -------------------------------------------------------------------
     
    5153// -------------------------------------------------------------------
    5254//
     55
    5356#ifndef G4DiscreteGammaDeexcitation_hh
    5457#define G4DiscreteGammaDeexcitation_hh
     
    7174
    7275  // Destructor
    73   ~G4DiscreteGammaDeexcitation();
     76  virtual ~G4DiscreteGammaDeexcitation();
    7477
    7578  // Functions
     
    7982  virtual G4VGammaTransition * CreateTransition();
    8083
    81   virtual G4bool CanDoTransition() const;
     84  virtual G4bool CanDoTransition();
    8285
    8386  void SetICM(G4bool hl) { _icm = hl; };
  • trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4DiscreteGammaTransition.hh

    r819 r1315  
    2424// ********************************************************************
    2525//
     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 $
    2628//
    2729// -------------------------------------------------------------------
     
    5254//        15 April 1999, Alessandro Brunengo (Alessandro.Brunengo@ge.infn.it)
    5355//              Added creation time evaluation for products of evaporation
     56//
    5457//     
     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//   
    5562// -------------------------------------------------------------------
    5663
     
    6269#include "G4NuclearLevel.hh"
    6370
     71//JMQ 180410
     72class G4NuclearLevelManager;
     73
    6474class G4DiscreteGammaTransition : public G4VGammaTransition
    6575{
     
    6878  // Constructor
    6979  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);
    7183
    7284  // Destructor
     
    99111  G4double _excitation;
    100112  G4double _gammaCreationTime;
     113  //JMQ 180410
     114  G4int _A;
     115  G4int _Z;
     116  G4NuclearLevelManager * _levelManager;
     117  //JMQ 190410
     118  G4double _tolerance;
    101119};
    102120
  • trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4E1Probability.hh

    r819 r1315  
    2424// ********************************************************************
    2525//
     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
    2638//
    2739//
     
    3345#include "G4VEmissionProbability.hh"
    3446#include "G4Fragment.hh"
    35 #include "G4VLevelDensityParameter.hh"
     47
     48class G4Pow;
    3649
    3750class G4E1Probability : public G4VEmissionProbability
     
    4053public:
    4154
    42   G4E1Probability() {};
     55  G4E1Probability();
    4356
    44   ~G4E1Probability();
     57  virtual ~G4E1Probability();
    4558
    4659  G4double EmissionProbability(const G4Fragment& frag, const G4double excite);
     
    4861
    4962private:
    50 
    51   // G4E1Probability() {};
    5263
    5364  G4E1Probability(const G4E1Probability& right);
     
    5869
    5970  // Integrator (simple Gaussian quadrature)
    60 
    6171  G4double EmissionIntegration(const G4Fragment& frag, const G4double excite,
    6272                               const G4double lowLim, const G4double upLim,
    6373                               const G4int numIters);
    6474
    65   // G4VLevelDensityParameter* _levelDensity; // Don't need this
     75  // members
     76  G4Pow*   fG4pow;
     77  G4double theLevelDensityParameter;
     78  G4double normC;
    6679
    6780};
  • trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4PhotonEvaporation.hh

    r962 r1315  
    2424// ********************************************************************
    2525//
     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 $
    2628//
    2729// -------------------------------------------------------------------
     
    3638//      Creation date: 23 October 1998
    3739//
    38 //      Modifications:
     40//Modifications:
    3941//
    40 //        18 October 2002, Fan Lei (flei@space.qinetiq.com)
     42// 18 October 2002, Fan Lei (flei@space.qinetiq.com)
    4143//   
    4244//        Implementation of Internal Convertion process in discrete deexcitation
     
    5456//            G4ElectronOccupancy _eOccupancy;
    5557//            G4int _vShellNumber;
     58//
     59// 11 May 2010, V.Ivanchenko added EmittedFragment and BreakUpFragment
     60//                           methods
    5661//
    5762// -------------------------------------------------------------------
     
    6166
    6267#include "globals.hh"
    63 #include "G4VPhotonEvaporation.hh"
    6468#include "G4VEvaporationChannel.hh"
    6569#include "G4VEmissionProbability.hh"
     
    6771#include "G4ElectronOccupancy.hh"
    6872
    69 //#define debug
    70 
    7173class G4Fragment;
    7274
    73 class G4PhotonEvaporation : public G4VPhotonEvaporation, public G4VEvaporationChannel {
     75class G4PhotonEvaporation : public G4VEvaporationChannel {
    7476
    7577public:
     
    7981    virtual ~G4PhotonEvaporation();
    8082
     83    virtual void Initialize(const G4Fragment & fragment);
     84
     85    virtual G4Fragment* EmittedFragment(G4Fragment* theNucleus);
     86
     87    virtual G4FragmentVector* BreakUpFragment(G4Fragment* theNucleus);
     88
    8189    virtual G4FragmentVector * BreakItUp(const G4Fragment & nucleus);
    82 
    83     virtual void Initialize(const G4Fragment & fragment);
    8490
    8591    virtual G4FragmentVector * BreakUp(const G4Fragment & nucleus);
     
    99105    void SetEOccupancy( G4ElectronOccupancy  eOccupancy) ;
    100106
    101 
    102107    G4ElectronOccupancy GetEOccupancy () { return _eOccupancy;} ;
    103108   
     
    111116    G4VGammaDeexcitation * _discrDeexcitation;
    112117    G4VGammaDeexcitation * _contDeexcitation;
    113   //    G4VGammaDeexcitation * _cdDeexcitation;
    114118
    115119    G4ElectronOccupancy _eOccupancy;
    116120    G4int _vShellNumber;
    117121
    118     G4Fragment _nucleus;
     122    G4Fragment* _nucleus;
    119123    G4double _gammaE;
    120124
    121125    G4PhotonEvaporation(const G4PhotonEvaporation & right);
    122 
    123126    const G4PhotonEvaporation & operator = (const G4PhotonEvaporation & right);
    124127
    125     // MGP - Check == and != multiple inheritance... must be a mess!
    126128    G4bool operator == (const G4PhotonEvaporation & right) const;
    127129    G4bool operator != (const G4PhotonEvaporation & right) const;
    128130
    129 #ifdef debug
    130     void CheckConservation(const G4Fragment & theInitialState, G4FragmentVector * Result) const;
    131 #endif
     131  //#ifdef debug
     132  //  void CheckConservation(const G4Fragment & theInitialState, G4FragmentVector * Result) const;
     133  //#endif
    132134
    133135
  • trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4VGammaDeexcitation.hh

    r819 r1315  
    2424// ********************************************************************
    2525//
     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 $
    2628//
    2729// -------------------------------------------------------------------
     
    3739//
    3840//      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.
    3952//
    4053//        18 October 2002, F. Lei
     
    4356//          Added SetVaccantSN(). It is need to to re-set _vSN after each
    4457//          IC happened.
    45 //
    46 //        8 March 2002, Fan Lei (flei@space.qinetiq.com)
    47 //          Added  SetEO () , GetEO(), UpdateElectrons() to allow the assignment
    48 //          and modification of electron configuration.
    49 //         
    50 //        21 Nov 2001, Fan Lei (flei@space.qinetiq.com)
    51 //           Modified GenerateGamma() and UpdateUncleus() for implementation
    52 //           of Internal Conversion processs
    5358//
    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
    5660//
    5761// -------------------------------------------------------------------
     62//
    5863
    5964#ifndef G4VGAMMADEEXCITATION_HH
     
    7075public:
    7176
    72     G4VGammaDeexcitation();
     77  G4VGammaDeexcitation();
    7378
    74     virtual ~G4VGammaDeexcitation();
     79  virtual ~G4VGammaDeexcitation();
    7580
    76     virtual G4VGammaTransition * CreateTransition() = 0;
    77     virtual G4bool CanDoTransition() const = 0;
     81  virtual G4VGammaTransition * CreateTransition() = 0;
     82  virtual G4bool CanDoTransition() = 0;
    7883
    79     // Single gamma transition
    80     virtual G4FragmentVector * DoTransition();
     84  // Single gamma transition
     85  G4FragmentVector * DoTransition();
    8186
    82     // Chain of gamma transitions
    83     virtual G4FragmentVector * DoChain();
     87  // Chain of gamma transitions
     88  G4FragmentVector * DoChain();
    8489
    85     virtual G4Fragment * GenerateGamma();
     90  G4Fragment * GenerateGamma();
    8691
    87     virtual const G4Fragment & GetNucleus() const;
     92  inline G4Fragment* GetNucleus();
    8893
    89     virtual void SetNucleus(const G4Fragment & nucleus);
     94  inline void SetNucleus(G4Fragment* nucleus);
    9095
    91     virtual void SetVerboseLevel(G4int verbose);
     96  inline void SetVerboseLevel(G4int verbose);
    9297
    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;};
    95102 
    96     G4ElectronOccupancy GetEO() { return _electronO; };   
    97     G4int GetVacantSN() {return _vSN;};
     103  G4ElectronOccupancy GetEO() { return _electronO; };   
     104  G4int GetVacantSN() {return _vSN;};
     105
    98106protected:
    99107
    100     void Initialize();
    101     void UpdateNucleus(const G4Fragment * gamma);
    102     void UpdateElectrons ();
    103     void Update();
     108  void Update();
    104109
    105     G4VGammaTransition * _transition; // Owned pointer
    106     G4int _verbose;
     110  G4VGammaTransition* _transition; // Owned pointer
     111  G4int _verbose;
    107112
    108113private:
    109114
    110     G4Fragment _nucleus;
    111     G4ElectronOccupancy _electronO;
    112     G4int _vSN;
     115  G4Fragment* _nucleus;
     116  G4ElectronOccupancy _electronO;
     117  G4int _vSN;
    113118
    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;
    119123
    120124};
     125
     126inline G4Fragment* G4VGammaDeexcitation::GetNucleus()
     127{
     128  return _nucleus;
     129}
     130
     131inline void G4VGammaDeexcitation::SetNucleus(G4Fragment* nucleus)
     132{
     133  _nucleus = nucleus;
     134}
     135
     136inline void G4VGammaDeexcitation::SetVerboseLevel(G4int verbose)
     137{
     138  _verbose = verbose;
     139}
     140
     141inline void G4VGammaDeexcitation::Initialize()
     142{
     143  if (_transition != 0) { delete _transition; }
     144  _transition = CreateTransition();
     145  if (_transition != 0) {
     146    _transition->SetEnergyFrom(_nucleus->GetExcitationEnergy());
     147  }
     148}
    121149
    122150#endif
  • trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/include/G4VPhotonEvaporation.hh

    r819 r1315  
    2424// ********************************************************************
    2525//
     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 $
    2628//
    2729// -------------------------------------------------------------------
  • trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4ContinuumGammaDeexcitation.cc

    r819 r1315  
    2424// ********************************************************************
    2525//
     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 $
    2628//
    2729// -------------------------------------------------------------------
     
    4042//
    4143//      02 May 2003,   Vladimir Ivanchenko change interface to G4NuclearlevelManager
     44//
     45//      19 April 2010 J. M. Quesada: smaller value of tolerance parameter
    4246//     
    4347// -------------------------------------------------------------------
     
    6165//
    6266
    63 G4ContinuumGammaDeexcitation::G4ContinuumGammaDeexcitation(): _nucleusZ(0), _nucleusA(0), _levelManager(0)
     67G4ContinuumGammaDeexcitation::G4ContinuumGammaDeexcitation()
     68  : _nucleusZ(0), _nucleusA(0), _levelManager(0)
    6469{ }
    6570
     
    7176G4VGammaTransition* G4ContinuumGammaDeexcitation::CreateTransition()
    7277{
    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();
    7782
    7883  if (_nucleusA != A || _nucleusZ != Z)
     
    8388    }
    8489
    85   if (_verbose > 1)
     90  if (_verbose > 1) {
    8691    G4cout << "G4ContinuumGammaDeexcitation::CreateTransition - Created" << G4endl;
    87 
     92  }
    8893  G4VGammaTransition* gt =  new G4ContinuumGammaTransition(_levelManager,Z,A,excitation,_verbose );
    8994
     
    9297   
    9398
    94 G4bool G4ContinuumGammaDeexcitation::CanDoTransition() const
     99G4bool G4ContinuumGammaDeexcitation::CanDoTransition()
    95100{
    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;
    97105
    98106  if (_transition == 0)
    99107    {
    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;
    106113    }
    107114
    108   G4Fragment nucleus = GetNucleus();
    109   G4double excitation = nucleus.GetExcitationEnergy();
     115  G4Fragment* nucleus = GetNucleus();
     116  G4double excitation = nucleus->GetExcitationEnergy();
    110117
    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)
    114121    {
    115       canDo = false;
    116       if (_verbose > 0)
    117         G4cout
    118           << "G4ContinuumGammaDeexcitation::CanDoTransition - n/p/H"
    119           << G4endl;
     122      if (_verbose > 1) {
     123        G4cout << "G4ContinuumGammaDeexcitation::CanDoTransition - n/p/H"
     124               << G4endl;
     125      }
     126      return false;
    120127    }
    121128
    122 
    123 
    124   if (excitation <= 0.)
     129  if (excitation <= tolerance)
    125130    {
    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;
    131137    }
    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;
    140146    }
    141147 
    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;
    150156}
    151157
  • trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4DiscreteGammaDeexcitation.cc

    r962 r1315  
    2424// ********************************************************************
    2525//
     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 $
    2628//
    2729// -------------------------------------------------------------------
     
    6567  _rdm(false), _levelManager(0)
    6668{
    67   _tolerance = 0.1 * MeV;
     69  _tolerance = CLHEP::keV;
    6870}
    6971
    70 
    71 G4DiscreteGammaDeexcitation::~G4DiscreteGammaDeexcitation() {}
    72 
     72G4DiscreteGammaDeexcitation::~G4DiscreteGammaDeexcitation()
     73{}
    7374
    7475G4VGammaTransition* G4DiscreteGammaDeexcitation::CreateTransition()
    7576{
    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;
    8082  if (_nucleusA != A || _nucleusZ != Z)
    8183    {
     
    8486      _levelManager = G4NuclearLevelStore::GetInstance()->GetManager(Z,A);
    8587    }
    86 
    87 
    8888
    8989  if (_levelManager->IsValid())
     
    9696        }
    9797       
    98       G4double excitation = nucleus.GetExcitationEnergy();
    99       //      const G4NuclearLevel* level =_levelManager.NearestLevel(excitation, _tolerance);
     98      G4double excitation = nucleus->GetExcitationEnergy();
    10099      const G4NuclearLevel* level =_levelManager->NearestLevel(excitation);
    101100       
    102101      if (level != 0) 
    103102        {
    104           if (_verbose > 0)
     103          if (_verbose > 0) {
    105104            G4cout
    106105              << "G4DiscreteGammaDeexcitation::CreateTransition - Created from level energy "
    107106              << level->Energy() << ", excitation is "
    108107              << excitation << G4endl;
    109           G4DiscreteGammaTransition* dtransit = new G4DiscreteGammaTransition(*level,Z);
     108          }
     109          G4DiscreteGammaTransition* dtransit = new G4DiscreteGammaTransition(*level,Z,A);
    110110          dtransit->SetICM(_icm); 
    111111          return dtransit;
     
    113113      else
    114114        {
    115           if (_verbose > 0)
     115          if (_verbose > 0) {
    116116            G4cout
    117117              << "G4DiscreteGammaDeexcitation::CreateTransition - No transition created from "
    118118              << excitation << " within tolerance " << _tolerance << G4endl;
    119            
     119          }
    120120          return 0;
    121121        }
    122122    }
    123   else return 0;
     123  return 0;
    124124}
    125125
    126126
    127 G4bool G4DiscreteGammaDeexcitation::CanDoTransition() const
     127G4bool G4DiscreteGammaDeexcitation::CanDoTransition()
    128128{
    129129
     
    138138        << G4endl;
    139139  }
    140   G4Fragment nucleus = GetNucleus();
    141140  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)
    145142      {
    146143        canDo = false;
     
    152149  }
    153150
    154   G4double excitation = nucleus.GetExcitationEnergy();
     151  G4Fragment* nucleus = GetNucleus();
     152  G4double excitation = nucleus->GetExcitationEnergy();
     153  //G4cout << "G4DiscreteGammaDeexcitation::CanDoTransition: " << nucleus << G4endl;
    155154
    156155  if (canDo) {
    157     if (excitation <= 0.) {
     156    if (excitation <= _tolerance) {
    158157      canDo = false;
    159       if (_verbose > 0)
     158      if (_verbose > 0) {
    160159        G4cout
    161160          << "G4DiscreteGammaDeexcitation::CanDoTransition -  Excitation <= 0"
     161          << excitation << "  " << excitation - _tolerance
    162162          << G4endl;
     163      }
    163164    } else {
    164165      if (excitation > _levelManager->MaxLevelEnergy() + _tolerance) canDo = false;
    165       if (excitation < _levelManager->MinLevelEnergy() - _tolerance) canDo = false; 
     166      //if (excitation < _levelManager->MinLevelEnergy() - _tolerance) canDo = false; 
    166167      // The following is a protection to avoid looping in case of elements with very low
    167168      // ensdf levels
    168       if (excitation < _levelManager->MinLevelEnergy() * 0.9) canDo = false; 
     169      //if (excitation < _levelManager->MinLevelEnergy() * 0.9) canDo = false; 
    169170 
    170171      if (_verbose > 0) {
  • trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4DiscreteGammaTransition.cc

    r819 r1315  
    3737//
    3838//      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//     
    3947//        09 Sep. 2002, Fan Lei  (flei@space.qinetiq.com)
    4048//              Added renormalization to determine whether transition leads to
    4149//              electron or gamma in SelectGamma()
    4250//
    43 //        21 Nov. 2001, Fan Lei (flei@space.qinetiq.com)
    44 //              i) added G4int _nucleusZ initialise it through the constructor
    45 //              ii) modified SelectGamma() to allow the generation of conversion electrons     
    46 //              iii) added #include G4AtomicShells.hh
    47 //     
    48 //        15 April 1999, Alessandro Brunengo (Alessandro.Brunengo@ge.infn.it)
    49 //              Added creation time evaluation for products of evaporation
     51//        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
    5058//     
    5159// -------------------------------------------------------------------
     
    5563#include "G4RandGeneralTmp.hh"
    5664#include "G4AtomicShells.hh"
     65//JMQ:
     66#include "G4NuclearLevelStore.hh"
     67#include "G4Pow.hh"
    5768
    5869G4DiscreteGammaTransition::G4DiscreteGammaTransition(const G4NuclearLevel& level):
     
    6071{ }
    6172
    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):
     75G4DiscreteGammaTransition::G4DiscreteGammaTransition(const G4NuclearLevel& level, G4int Z, G4int A):
    6376  _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)
    6578{
    6679  _verbose = 0;
     80  //JMQ: added tolerence in the mismatch
     81  _tolerance = CLHEP::keV;
    6782}
    6883
     
    7489void G4DiscreteGammaTransition::SelectGamma()
    7590{
    76 
     91  // default gamma
     92  _aGamma = true;   
    7793  _gammaEnergy = 0.;
    78 
     94 
    7995  G4int nGammas = _level.NumberOfGammas();
    8096  if (nGammas > 0)
    8197    {
    8298      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)
    86102        {
    87103          if(random <= (_level.GammaCumulativeProbabilities())[iGamma])
    88             break;
     104            { break; }
    89105        }
    90 
    91 
     106     
    92107      // Small correction due to the fact that there are mismatches between
    93108      // 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;     
    97112      _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     
    99131      //  Warning: the following check is needed to avoid loops:
    100132      //  Due essentially to missing nuclear levels in data files, it is
     
    106138      //          but this change needs a more complex revision of actual design.
    107139      //          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
    110146      // now decide whether Internal Coversion electron should be emitted instead
    111147      if (_icm) {
     
    144180              }
    145181            }
    146             if (_verbose > 0)
     182            _bondE = G4AtomicShells::GetBindingEnergy(_nucleusZ, iShell);
     183            if (_verbose > 0) {
    147184              G4cout << "G4DiscreteGammaTransition: _nucleusZ = " <<_nucleusZ
    148185                     << " , iShell = " << iShell 
    149                      << " , Shell binding energy = " << G4AtomicShells::GetBindingEnergy(_nucleusZ, iShell) / keV
     186                     << " , Shell binding energy = " << _bondE/keV
    150187                     << " 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
    153195            _orbitE = iShell;     
    154196            _aGamma = false ;   // emitted is not a gamma now
    155197          }
    156198      }
    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;
    162209      //  Original code, not very efficent
    163210      //  G4int nBins = 200;
     
    172219      //  G4RandGeneralTmp randGeneral(sampleArray, nBins);
    173220      //G4double random = randGeneral.shoot();
    174  
     221     
    175222      //_gammaCreationTime = tMin + (tMax - tMin) * random;
    176223
    177224      // new code by Fan Lei
    178225      //
     226      /*
    179227      if (tau != 0 )
    180228      {
     
    186234          //       << _gammaCreationTime/second << G4endl;
    187235       } else { _gammaCreationTime=0.; }
     236      */
    188237    }
    189238  return;
    190239}
    191240
    192 
    193 //G4bool G4DiscreteGammaTransition::IsAGamma()
    194 //{
    195 //  return _aGamma;
    196 //}
    197 
    198 
    199241G4double G4DiscreteGammaTransition::GetGammaEnergy()
    200242{
     
    210252{
    211253  _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  
    2525//
    2626//
    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//
    2840//
    2941
    3042#include "G4E1Probability.hh"
    31 #include "G4ConstantLevelDensityParameter.hh"
     43//#include "G4ConstantLevelDensityParameter.hh"
    3244#include "Randomize.hh"
     45#include "G4Pow.hh"
    3346
    3447// Constructors and operators
    3548//
    3649
    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 }
     50G4E1Probability::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
     58G4E1Probability::~G4E1Probability()
     59{}
    6560
    6661// Calculate the emission probability
     
    6863
    6964G4double G4E1Probability::EmissionProbDensity(const G4Fragment& frag,
    70                                                  const G4double gammaE)
     65                                              const G4double gammaE)
    7166{
    7267
     
    7671  // the probability density for photon evaporation from U to U - gammaE
    7772  // (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
    8074
    8175  G4double theProb = 0.0;
    8276
    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; }
    8881
    8982  // Need a level density parameter.
     
    9184  // nuclei).
    9285
    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  }
    10296  // Now form the probability density
    10397
     
    107101  G4double sigma0 = 2.5 * Afrag * millibarn;  // millibarns
    108102
    109   G4double Egdp = (40.3 / std::pow(Afrag,0.2) )*MeV;
     103  G4double Egdp   = (40.3 / fG4pow->powZ(Afrag,0.2) )*MeV;
    110104  G4double GammaR = 0.30 * Egdp;
    111105 
    112   static G4double normC = 1.0 / ((pi * hbarc)*(pi * hbarc));
    113 
    114106  // CD
    115107  //cout<<"  PROB TESTS "<<G4endl;
     
    124116  //cout<<" normC = "<<normC<<G4endl;
    125117
    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;
    134132
    135133  // CD
     
    211209}
    212210
    213 G4E1Probability::~G4E1Probability() {}
    214 
    215 
     211
  • trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4PhotonEvaporation.cc

    r962 r1315  
    2424// ********************************************************************
    2525//
    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 $
    2728//
    2829// -------------------------------------------------------------------
     
    3738//      Creation date: 23 October 1998
    3839//
    39 //      Modifications:
     40// Modifications:
    4041//     
    41 //        8 March 2002, Fan Lei (flei@space.qinetiq.com)
     42// 8 March 2002, Fan Lei (flei@space.qinetiq.com)
    4243//   
    4344//        Implementation of Internal Convertion process in discrete deexcitation
     
    5051//       G4ElectronOccupancy GetEOccupancy () ;
    5152//
     53// 11 May 2010, V.Ivanchenko add implementation of EmittedFragment and
     54//                           BreakUpFragment methods; cleanup logic
     55//
    5256// -------------------------------------------------------------------
     57//
    5358
    5459#include "G4PhotonEvaporation.hh"
     
    8691void G4PhotonEvaporation::Initialize(const G4Fragment& fragment)
    8792{
    88   _nucleus = fragment;
    89   return;
    90 }
    91 
     93  _nucleus = const_cast<G4Fragment*>(&fragment);
     94}
     95
     96G4Fragment* 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
     140G4FragmentVector* 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}
    92184
    93185G4FragmentVector* G4PhotonEvaporation::BreakUp(const G4Fragment& nucleus)
    94186{
    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);
    101192 
    102193  // Do one photon emission
     
    104195  // Products from continuum gamma transitions
    105196
    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())
    122206    {
    123207      // Products from discrete gamma transitions
    124208      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;
    137222        }
    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      }
    140230    }
    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 
    152232  // 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) {
    158236    G4cout << "*-*-*-* Photon evaporation: " << products->size() << G4endl;
     237  }
    159238
    160239  return products;
    161240}
    162241
    163 
    164242G4FragmentVector* G4PhotonEvaporation::BreakItUp(const G4Fragment& nucleus)
    165243{
    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;
    172250
    173251  // Do the whole gamma chain
    174 
    175   G4FragmentVector* contProducts = _contDeexcitation->DoChain(); 
     252  G4FragmentVector* products = _contDeexcitation->DoChain(); 
     253  if( !products ) { products = new G4FragmentVector; }
    176254
    177255  // 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()
    183258           << " 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  }
    195260
    196261  // Products from discrete gamma transitions
    197262  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;
    214273    }
    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  }
    216281  // 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) {
    223285    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  }
    232287  return products;
    233288}
     
    236291{
    237292  G4double prob = 0.;
    238   if (_probAlgorithm != 0) prob = _probAlgorithm->EmissionProbability(_nucleus,_gammaE);
     293  if (_probAlgorithm != 0) {
     294    prob = _probAlgorithm->EmissionProbability(*_nucleus,_gammaE);
     295  }
    239296  return prob;
    240297}
  • trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4VGammaDeexcitation.cc

    r819 r1315  
    2424// ********************************************************************
    2525//
     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 $
    2628//
    2729// -------------------------------------------------------------------
     
    4547//              Added creation time evaluation for products of evaporation
    4648//
     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
    4754//
    4855// -------------------------------------------------------------------
     
    6471#include "G4DiscreteGammaTransition.hh"
    6572
     73
    6674G4VGammaDeexcitation::G4VGammaDeexcitation(): _transition(0), _verbose(0),
    6775                                              _electronO (0), _vSN(-1)
    6876{ }
    6977
    70 
    7178G4VGammaDeexcitation::~G4VGammaDeexcitation()
    7279{
    73   //  if (_transition != 0) delete _transition;
    74 }
    75 
     80  if (_transition != 0) { delete _transition; }
     81}
    7682
    7783G4FragmentVector* G4VGammaDeexcitation::DoTransition()
    7884{
    79   // Template method
    80 
    81  Initialize();
    82  G4FragmentVector* products = new G4FragmentVector;
    83  
     85  Initialize();
     86  G4FragmentVector* products = new G4FragmentVector();
     87 
    8488  if (CanDoTransition())
    8589    {
    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) {
    9695    G4cout << "G4VGammaDeexcitation::DoTransition - Transition deleted " << G4endl;
    97 
    98   if (_transition != 0) delete _transition;
    99 
     96  }
     97 
    10098  return products;
    10199}
     
    103101G4FragmentVector* G4VGammaDeexcitation::DoChain()
    104102{
     103  if (_verbose > 1) { G4cout << "G4VGammaDeexcitation::DoChain" << G4endl; }
     104  const G4double tolerance = CLHEP::keV;
     105
    105106  Initialize();
    106   G4FragmentVector* products = new G4FragmentVector;
    107 
     107  G4FragmentVector* products = new G4FragmentVector();
     108 
    108109  while (CanDoTransition())
    109     {
    110       if (_verbose > 5) G4cout << "G4VGammaDeexcitation::DoChain -  Looping" << G4endl;
    111 
     110    {     
     111      _transition->SetEnergyFrom(_nucleus->GetExcitationEnergy());
    112112      G4Fragment* gamma = GenerateGamma();
    113113      if (gamma != 0)
    114114        {
    115115          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();
    118119        }
    119      Update();
    120120    }
    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  }
    126125 
    127126  return products;
    128127}
    129128
    130 
    131 const G4Fragment& G4VGammaDeexcitation::GetNucleus() const
    132 {
    133   return _nucleus;
    134 }
    135 
    136 
    137 void G4VGammaDeexcitation::SetNucleus(const G4Fragment& nucleus)
    138 {
    139   _nucleus = G4Fragment(nucleus);
    140 }
    141 
    142 
    143129G4Fragment* G4VGammaDeexcitation::GenerateGamma()
    144130{
     131  // 23/04/10 V.Ivanchenko rewrite complitely
    145132  G4double eGamma = 0.;
    146 
     133 
    147134  if (_transition != 0) {
    148135    _transition->SelectGamma();  // it can be conversion electron too
    149136    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; }
    151141  if (_verbose > 1 && _transition != 0 )
    152142    {
    153       G4cout << "G4VGammaDeexcitation::GenerateGamma - Gamma energy " << eGamma
    154              << " ** New excitation " << _nucleus.GetExcitationEnergy() - eGamma
     143      G4cout << "G4VGammaDeexcitation::GenerateGamma - Edeexc(MeV)= " << eGamma
     144             << " ** left Eexc(MeV)= " << excitation
    155145             << G4endl;
    156146    }
    157147 
    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
    208156  G4DiscreteGammaTransition* dtransition = 0;
    209157  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();
    259160    _vSN = dtransition->GetOrbitNumber();   
    260161    _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;
    263194}
    264195
     
    269200      delete _transition;
    270201      _transition = 0;
    271       if (_verbose > 1)
     202      if (_verbose > 1) {
    272203        G4cout << "G4VGammaDeexcitation::Update - Transition deleted " << G4endl;
    273     }
    274 
     204      }
     205    }
     206 
    275207  _transition = CreateTransition();
    276208  if (_transition != 0)
    277209    {
    278       _transition->SetEnergyFrom(_nucleus.GetExcitationEnergy());
    279       //      if ( _vSN != -1) (dynamic_cast <G4DiscreteGammaTransition*> (_transition))->SetICM(false);
     210      _transition->SetEnergyFrom(_nucleus->GetExcitationEnergy());
     211      // if ( _vSN != -1) (dynamic_cast <G4DiscreteGammaTransition*> (_transition))->SetICM(false);
    280212      // the above line is commented out for bug fix #952. It was intruduced for reason that
    281213      // the k-shell electron is most likely one to be kicked out and there is no time for
     
    283215      // reported in #952
    284216    }
    285 
     217 
    286218  return;
    287219}
    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  
    3939//     
    4040// -------------------------------------------------------------------
     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 $
    4144
    4245
Note: See TracChangeset for help on using the changeset viewer.