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

Last change on this file since 1337 was 1337, checked in by garnier, 14 years ago

tag geant4.9.4 beta 1 + modifs locales

File size: 6.0 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.4 2009/12/16 17:51:11 gunter Exp $
27// GEANT4 tag $Name: geant4-09-04-beta-01 $
28//
29//
30// Physics model class G4NeutronRadCapture
31// Created:  31 August 2009
32// Author  V.Ivanchenko
33// 
34// Modified:
35//
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 "G4Deuteron.hh"
48#include "G4Triton.hh"
49#include "G4He3.hh"
50#include "G4Alpha.hh"
51
52G4NeutronRadCapture::G4NeutronRadCapture() 
53  : G4HadronicInteraction("nRadCapture")
54{
55  lowestEnergyLimit = 0.1*eV;
56  SetMinEnergy( 0.0*GeV );
57  SetMaxEnergy( 100.*TeV );
58  //  photonEvaporation = new G4PhotonEvaporation();
59  photonEvaporation = 0;
60}
61
62G4NeutronRadCapture::~G4NeutronRadCapture()
63{
64  delete photonEvaporation;
65}
66
67G4HadFinalState* G4NeutronRadCapture::ApplyYourself(
68                 const G4HadProjectile& aTrack, G4Nucleus& targetNucleus)
69{
70  theParticleChange.Clear();
71
72  G4int Z = static_cast<G4int>(targetNucleus.GetZ()+0.5);
73  G4int A = static_cast<G4int>(targetNucleus.GetN()+0.5);
74
75  // Create initial state
76  G4double m1 = G4NucleiProperties::GetNuclearMass(A, Z);
77  G4LorentzVector lv0(0.0,0.0,0.0,m1);   
78  G4LorentzVector lv1 = aTrack.Get4Momentum() + lv0;
79  G4ThreeVector bst = lv1.boostVector();
80  G4double M  = lv1.mag();
81
82  ++A;
83  G4double m2 = G4NucleiProperties::GetNuclearMass(A, Z);
84  if(M - m2 <= lowestEnergyLimit) {
85    return &theParticleChange;
86  }
87
88  if (verboseLevel > 1) {
89    G4cout << "G4NeutronRadCapture::DoIt: Eini(MeV)=" 
90           << aTrack.GetKineticEnergy()/MeV << "  Eexc(MeV)= " 
91           << (M - m2)/MeV
92           << "  Z= " << Z << "  A= " << A << G4endl;
93  }
94
95  G4double e1 = (M - m2)*(M + m2)/(2*M);
96  G4double cost = 2.0*G4UniformRand() - 1.0;
97  if(cost > 1.0) {cost = 1.0;}
98  else if(cost < -1.0) {cost = -1.0;}
99  G4double sint = std::sqrt((1. - cost)*(1.0 + cost));
100  G4double phi  = G4UniformRand()*CLHEP::twopi;
101  G4LorentzVector lv2(e1*sint*std::cos(phi),e1*sint*std::sin(phi),e1*cost,e1);   
102  lv2.boost(bst);
103  theParticleChange.AddSecondary(new G4DynamicParticle(G4Gamma::Gamma(), lv2));
104  G4ParticleDefinition* theDef = 0;
105
106  lv1 -= lv2; 
107  if(Z > 2 || A > 4) 
108    {
109      theDef = G4ParticleTable::GetParticleTable()->FindIon(Z,A,0,Z);
110    }
111  else 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
116  if (verboseLevel > 1) {
117    G4cout << "Gamma 4-mom: " << lv2 << "   " 
118           << theDef->GetParticleName() << "   " << lv1 << G4endl;
119  }
120  if(theDef) {
121    theParticleChange.AddSecondary(new G4DynamicParticle(theDef, lv1));
122  }
123 
124  /*
125  // Create fragment in its rest frame
126  lv1.boost(-bst);
127  G4Fragment aNucleus(A+1, Z, lv1);
128  if(aNucleus.GetExcitationEnergy() <= lowestEnergyLimit) {
129    return &theParticleChange;
130  }
131
132  if (verboseLevel > 1) {
133    G4cout << "G4NeutronRadCapture::DoIt: Eini(MeV)="
134           << aTrack.GetKineticEnergy()/MeV << "  Eexc(MeV)= "
135           << lv1.e() - G4NucleiProperties::GetNuclearMass(A+1, Z)
136           << "  Z= " << Z << "  A= " << A + 1 << G4endl;
137  }
138
139  //
140  // Sample final state
141  //
142
143  G4FragmentVector* fv = photonEvaporation->BreakItUp(aNucleus);
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    lvres.boost(bst);
153    G4int Z = G4int(f->GetZ() + 0.5);
154    G4int A = G4int(f->GetA() + 0.5);
155
156    G4ParticleDefinition* theDef = 0;
157    if(0 == Z && 0 == A) {theDef =  f->GetParticleDefinition();}
158    else if(Z > 2 || A > 4)
159      {
160        theDef = G4ParticleTable::GetParticleTable()->FindIon(Z,A,0,Z);
161      }
162    else if (Z == 1 && A == 2) {theDef = G4Deuteron::Deuteron();}
163    else if (Z == 1 && A == 3) {theDef = G4Triton::Triton();}
164    else if (Z == 2 && A == 3) {theDef = G4He3::He3();}
165    else if (Z == 2 && A == 4) {theDef = G4Alpha::Alpha();}
166
167    if (verboseLevel > 1) {
168      G4cout << i << ". " << theDef->GetParticleName()
169             << "   " << lvres << G4endl;
170    }
171    if(theDef) {
172      theParticleChange.AddSecondary(new G4DynamicParticle(theDef, lvres));
173    }
174    delete f;
175  }
176  */
177  return &theParticleChange;
178}
179
Note: See TracBrowser for help on using the repository browser.