source: trunk/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4NeutronRadCapture.cc @ 1347

Last change on this file since 1347 was 1347, checked in by garnier, 13 years ago

geant4 tag 9.4

File size: 5.7 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26// $Id: G4NeutronRadCapture.cc,v 1.6 2010/11/17 16:21:32 vnivanch Exp $
27// GEANT4 tag $Name: geant4-09-04-ref-00 $
28//
29//
30// Physics model class G4NeutronRadCapture
31// Created:  31 August 2009
32// Author  V.Ivanchenko
33// 
34// Modified:
35// 09.09.2010 V.Ivanchenko added usage of G4PhotonEvaporation
36//
37
38#include "G4NeutronRadCapture.hh"
39#include "G4ParticleDefinition.hh"
40#include "G4Fragment.hh"
41#include "G4FragmentVector.hh"
42#include "G4NucleiProperties.hh"
43#include "G4PhotonEvaporation.hh"
44#include "G4DynamicParticle.hh"
45#include "G4ParticleDefinition.hh"
46#include "G4ParticleTable.hh"
47#include "G4IonTable.hh"
48#include "G4Deuteron.hh"
49#include "G4Triton.hh"
50#include "G4He3.hh"
51#include "G4Alpha.hh"
52
53G4NeutronRadCapture::G4NeutronRadCapture() 
54  : G4HadronicInteraction("nRadCapture")
55{
56  lowestEnergyLimit = 0.1*eV;
57  SetMinEnergy( 0.0*GeV );
58  SetMaxEnergy( 100.*TeV );
59  photonEvaporation = new G4PhotonEvaporation();
60  //photonEvaporation = 0;
61}
62
63G4NeutronRadCapture::~G4NeutronRadCapture()
64{
65  delete photonEvaporation;
66}
67
68G4HadFinalState* G4NeutronRadCapture::ApplyYourself(
69                 const G4HadProjectile& aTrack, G4Nucleus& theNucleus)
70{
71  theParticleChange.Clear();
72
73  G4int A = theNucleus.GetA_asInt();
74  G4int Z = theNucleus.GetZ_asInt();
75
76  // Create initial state
77  G4double m1 = G4NucleiProperties::GetNuclearMass(A, Z);
78  G4LorentzVector lv0(0.0,0.0,0.0,m1);   
79  G4LorentzVector lv1 = aTrack.Get4Momentum() + lv0;
80
81  // simplified method of 1 gamma emission
82  if(A <= 3) {
83
84    G4ThreeVector bst = lv1.boostVector();
85    G4double M  = lv1.mag();
86
87    ++A;
88    G4double m2 = G4NucleiProperties::GetNuclearMass(A, Z);
89    if(M - m2 <= lowestEnergyLimit) {
90      return &theParticleChange;
91    }
92 
93    if (verboseLevel > 1) {
94      G4cout << "G4NeutronRadCapture::DoIt: Eini(MeV)=" 
95             << aTrack.GetKineticEnergy()/MeV << "  Eexc(MeV)= " 
96             << (M - m2)/MeV
97             << "  Z= " << Z << "  A= " << A << G4endl;
98    }
99    G4double e1 = (M - m2)*(M + m2)/(2*M);
100    G4double cost = 2.0*G4UniformRand() - 1.0;
101    if(cost > 1.0) {cost = 1.0;}
102    else if(cost < -1.0) {cost = -1.0;}
103    G4double sint = std::sqrt((1. - cost)*(1.0 + cost));
104    G4double phi  = G4UniformRand()*CLHEP::twopi;
105    G4LorentzVector lv2(e1*sint*std::cos(phi),e1*sint*std::sin(phi),e1*cost,e1);
106    lv2.boost(bst);
107    theParticleChange.AddSecondary(new G4DynamicParticle(G4Gamma::Gamma(), lv2));
108    G4ParticleDefinition* theDef = 0;
109
110    lv1 -= lv2; 
111    if      (Z == 1 && A == 2) {theDef = G4Deuteron::Deuteron();}
112    else if (Z == 1 && A == 3) {theDef = G4Triton::Triton();}
113    else if (Z == 2 && A == 3) {theDef = G4He3::He3();}
114    else if (Z == 2 && A == 4) {theDef = G4Alpha::Alpha();}
115    else 
116      {
117        theDef = 
118          G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon(Z,A,0.0);
119      }
120
121    if (verboseLevel > 1) {
122      G4cout << "Gamma 4-mom: " << lv2 << "   " 
123             << theDef->GetParticleName() << "   " << lv1 << G4endl;
124    }
125    if(theDef) {
126      theParticleChange.AddSecondary(new G4DynamicParticle(theDef, lv1));
127    }
128 
129  // Use photon evaporation 
130  } else {
131 
132    G4Fragment aFragment(A+1, Z, lv1);
133
134    if (verboseLevel > 1) {
135      G4cout << "G4NeutronRadCapture::ApplyYourself initial G4Fragmet:" << G4endl;
136      G4cout << aFragment << G4endl;
137    }
138
139    //
140    // Sample final state
141    //
142    G4FragmentVector* fv = photonEvaporation->BreakUpFragment(&aFragment);
143    if(fv) {
144      size_t n = fv->size();
145
146      if (verboseLevel > 1) {
147        G4cout << "G4NeutronRadCapture: " << n << " final particle" << G4endl;
148      }
149      for(size_t i=0; i<n; ++i) {
150        G4Fragment* f = (*fv)[i];   
151        G4LorentzVector lvres = f->GetMomentum();   
152        Z = f->GetZ_asInt();
153        A = f->GetA_asInt();
154
155        G4ParticleDefinition* theDef = 0;
156        if(0 == Z && 0 == A) {theDef =  f->GetParticleDefinition();}
157        else
158          {
159            theDef = 
160              G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon(Z,A,0.0);
161          }
162
163        if (verboseLevel > 1) {
164          G4cout << i << ". " << theDef->GetParticleName()
165                 << "   " << lvres << G4endl;
166        }
167        if(theDef) {
168          theParticleChange.AddSecondary(new G4DynamicParticle(theDef, lvres));
169        }
170        delete f;
171      }
172      delete fv;
173    }
174  }
175  return &theParticleChange;
176}
177
Note: See TracBrowser for help on using the repository browser.