Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4LowEIonFragmentation.cc
Go to the documentation of this file.
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$
27 //
28 //---------------------------------------------------------------------------
29 //
30 // ClassName: G4LowEIonFragmentation
31 //
32 // Author: H.P. Wellisch
33 //
34 // Modified:
35 // 02 Jun 2010 M. A. Cortes Giraldo fix: particlesFromTarget must be
36 // accounted for as particles of initial compound nucleus
37 // 28 Oct 2010 V.Ivanchenko complete migration to integer Z and A;
38 // use updated G4Fragment methods
39 
40 #include <algorithm>
41 
43 #include "G4PhysicalConstants.hh"
44 #include "G4SystemOfUnits.hh"
45 #include "G4Fancy3DNucleus.hh"
46 #include "G4Proton.hh"
47 #include "G4NucleiProperties.hh"
48 
49 G4int G4LowEIonFragmentation::hits = 0;
50 G4int G4LowEIonFragmentation::totalTries = 0;
51 G4double G4LowEIonFragmentation::area = 0;
52 
54 {
55  theHandler = value;
56  theModel = new G4PreCompoundModel(theHandler);
57  proton = G4Proton::Proton();
58 }
59 
61 {
62  theHandler = new G4ExcitationHandler;
63  theModel = new G4PreCompoundModel(theHandler);
64  proton = G4Proton::Proton();
65 }
66 
68 {
69  delete theModel;
70 }
71 
73 ApplyYourself(const G4HadProjectile & thePrimary, G4Nucleus & theNucleus)
74 {
75  area = 0;
76  // initialize the particle change
77  theResult.Clear();
78  theResult.SetStatusChange( stopAndKill );
79  theResult.SetEnergyChange( 0.0 );
80 
81  // Get Target A, Z
82  G4int aTargetA = theNucleus.GetA_asInt();
83  G4int aTargetZ = theNucleus.GetZ_asInt();
84 
85  // Get Projectile A, Z
86  G4int aProjectileA = thePrimary.GetDefinition()->GetBaryonNumber();
87  G4int aProjectileZ = G4lrint(thePrimary.GetDefinition()->GetPDGCharge()/eplus);
88 
89  // Get Maximum radius of both
90 
91  G4Fancy3DNucleus aPrim;
92  aPrim.Init(aProjectileA, aProjectileZ);
93  G4double projectileOuterRadius = aPrim.GetOuterRadius();
94 
95  G4Fancy3DNucleus aTarg;
96  aTarg.Init(aTargetA, aTargetZ);
97  G4double targetOuterRadius = aTarg.GetOuterRadius();
98 
99  // Get the Impact parameter
100  G4int particlesFromProjectile = 0;
101  G4int chargedFromProjectile = 0;
102  G4double impactParameter = 0;
103  G4double x,y;
104  G4Nucleon * pNucleon;
105  // need at lease one particle from the projectile model beyond the
106  // projectileHorizon.
107  while(0==particlesFromProjectile)
108  {
109  do
110  {
111  x = 2*G4UniformRand() - 1;
112  y = 2*G4UniformRand() - 1;
113  }
114  while(x*x + y*y > 1);
115  impactParameter = std::sqrt(x*x+y*y)*(targetOuterRadius+projectileOuterRadius);
116  ++totalTries;
117  area = pi*(targetOuterRadius+projectileOuterRadius)*
118  (targetOuterRadius+projectileOuterRadius);
119  G4double projectileHorizon = impactParameter-targetOuterRadius;
120 
121  // Empirical boundary transparency.
122  G4double empirical = G4UniformRand();
123  if(projectileHorizon > empirical*projectileOuterRadius) { continue; }
124 
125  // Calculate the number of nucleons involved in collision
126  // From projectile
127  aPrim.StartLoop();
128  while((pNucleon = aPrim.GetNextNucleon()))
129  {
130  if(pNucleon->GetPosition().y()>projectileHorizon)
131  {
132  // We have one
133  ++particlesFromProjectile;
134  if(pNucleon->GetParticleType() == proton)
135  {
136  ++chargedFromProjectile;
137  }
138  }
139  }
140  }
141  ++hits;
142 
143  // From target:
144  G4double targetHorizon = impactParameter-projectileOuterRadius;
145  G4int chargedFromTarget = 0;
146  G4int particlesFromTarget = 0;
147  aTarg.StartLoop();
148  while((pNucleon = aTarg.GetNextNucleon()))
149  {
150  if(pNucleon->GetPosition().y()>targetHorizon)
151  {
152  // We have one
153  ++particlesFromTarget;
154  if(pNucleon->GetParticleType() == proton)
155  {
156  ++chargedFromTarget;
157  }
158  }
159  }
160 
161  // Energy sharing between projectile and target.
162  // Note that this is a quite simplistic kinetically.
163  G4ThreeVector momentum = thePrimary.Get4Momentum().vect();
164  G4double w = (G4double)particlesFromProjectile/(G4double)aProjectileA;
165 
166  G4double projTotEnergy = thePrimary.GetTotalEnergy();
167  G4double targetMass = G4NucleiProperties::GetNuclearMass(aTargetA, aTargetZ);
168  G4LorentzVector fragment4Momentum(momentum*w, projTotEnergy*w + targetMass);
169 
170  // take the nucleons and fill the Fragments
171  G4Fragment anInitialState(aTargetA+particlesFromProjectile,
172  aTargetZ+chargedFromProjectile,
173  fragment4Momentum);
174  // M.A. Cortes fix
175  //anInitialState.SetNumberOfParticles(particlesFromProjectile);
176  anInitialState.SetNumberOfExcitedParticle(particlesFromProjectile+particlesFromTarget,
177  chargedFromProjectile + chargedFromTarget);
178  anInitialState.SetNumberOfHoles(particlesFromProjectile+particlesFromTarget,
179  chargedFromProjectile + chargedFromTarget);
180  G4double time = thePrimary.GetGlobalTime();
181  anInitialState.SetCreationTime(time);
182 
183  // Fragment the Fragment using Pre-compound
184  G4ReactionProductVector* thePreCompoundResult = theModel->DeExcite(anInitialState);
185 
186  // De-excite the projectile using ExcitationHandler
187  G4ReactionProductVector * theExcitationResult = 0;
188  if(particlesFromProjectile < aProjectileA)
189  {
190  G4LorentzVector residual4Momentum(momentum*(1.0-w), projTotEnergy*(1.0-w));
191 
192  G4Fragment initialState2(aProjectileA-particlesFromProjectile,
193  aProjectileZ-chargedFromProjectile,
194  residual4Momentum );
195 
196  // half of particles are excited (?!)
197  G4int pinit = (aProjectileA-particlesFromProjectile)/2;
198  G4int cinit = (aProjectileZ-chargedFromProjectile)/2;
199 
200  initialState2.SetNumberOfExcitedParticle(pinit,cinit);
201  initialState2.SetNumberOfHoles(pinit,cinit);
202  initialState2.SetCreationTime(time);
203 
204  theExcitationResult = theHandler->BreakItUp(initialState2);
205  }
206 
207  // Fill the particle change and clear intermediate vectors
208  G4int nexc = 0;
209  G4int npre = 0;
210  if(theExcitationResult) { nexc = theExcitationResult->size(); }
211  if(thePreCompoundResult) { npre = thePreCompoundResult->size();}
212 
213  if(nexc > 0) {
214  for(G4int k=0; k<nexc; ++k) {
215  G4ReactionProduct* p = (*theExcitationResult)[k];
216  theResult.AddSecondary(new G4DynamicParticle(p->GetDefinition(),p->GetMomentum()));
217  delete p;
218  }
219  }
220 
221  if(npre > 0) {
222  for(G4int k=0; k<npre; ++k) {
223  G4ReactionProduct* p = (*thePreCompoundResult)[k];
224  theResult.AddSecondary(new G4DynamicParticle(p->GetDefinition(),p->GetMomentum()));
225  delete p;
226  }
227  }
228 
229  delete thePreCompoundResult;
230  delete theExcitationResult;
231 
232  // return the particle change
233  return &theResult;
234 
235 }