ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4GEMChannel.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4GEMChannel.cc
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 //
27 // Hadronic Process: Nuclear De-excitations
28 // by V. Lara (Oct 1998)
29 //
30 // J. M. Quesada (September 2009) bugs fixed in probability distribution for kinetic
31 // energy sampling:
32 // -hbarc instead of hbar_Planck (BIG BUG)
33 // -quantities for initial nucleus and residual are calculated separately
34 // V.Ivanchenko (September 2009) Added proper protection for unphysical final state
35 // J. M. Quesada (October 2009) fixed bug in CoulombBarrier calculation
36 
37 #include "G4GEMChannel.hh"
38 #include "G4VCoulombBarrier.hh"
39 #include "G4GEMCoulombBarrier.hh"
40 #include "G4PairingCorrection.hh"
41 #include "G4PhysicalConstants.hh"
42 #include "G4SystemOfUnits.hh"
43 #include "G4Pow.hh"
44 #include "G4Log.hh"
45 #include "G4Exp.hh"
46 #include "G4RandomDirection.hh"
47 
48 G4GEMChannel::G4GEMChannel(G4int theA, G4int theZ, const G4String & aName,
49  G4GEMProbability * aEmissionStrategy) :
50  G4VEvaporationChannel(aName),
51  A(theA),
52  Z(theZ),
53  EmissionProbability(0.0),
54  MaximalKineticEnergy(-CLHEP::GeV),
55  theEvaporationProbabilityPtr(aEmissionStrategy)
56 {
57  theCoulombBarrierPtr = new G4GEMCoulombBarrier(theA, theZ);
60  MyOwnLevelDensity = true;
64  ResidualZ = ResidualA = 0;
66 }
67 
69 {
70  if (MyOwnLevelDensity) { delete theLevelDensityPtr; }
71  delete theCoulombBarrierPtr;
72 }
73 
75 {
76  G4int anA = fragment->GetA_asInt();
77  G4int aZ = fragment->GetZ_asInt();
78  ResidualA = anA - A;
79  ResidualZ = aZ - Z;
80  /*
81  G4cout << "G4GEMChannel: Z= " << Z << " A= " << A
82  << " FragmentZ= " << aZ << " FragmentA= " << anA
83  << " Zres= " << ResidualZ << " Ares= " << ResidualA
84  << G4endl;
85  */
86  // We only take into account channels which are physically allowed
87  EmissionProbability = 0.0;
88 
89  // Only channels which are physically allowed are taken into account
90  if (ResidualA >= ResidualZ && ResidualZ >= 0 && ResidualA >= A) {
91 
92  //Effective excitation energy
93  G4double ExEnergy = fragment->GetExcitationEnergy()
94  - fNucData->GetPairingCorrection(aZ, anA);
95  if(ExEnergy > 0.0) {
97  G4double FragmentMass = fragment->GetGroundStateMass();
98  G4double Etot = FragmentMass + ExEnergy;
99  // Coulomb Barrier calculation
100  CoulombBarrier =
102  /*
103  G4cout << "Eexc(MeV)= " << ExEnergy/MeV
104  << " CoulBarrier(MeV)= " << CoulombBarrier/MeV << G4endl;
105  */
107 
108  // Maximal Kinetic Energy
110  + EvaporatedMass*EvaporatedMass)/(2.0*Etot)
112 
113  //G4cout << "CBarrier(MeV)= " << CoulombBarrier/MeV << G4endl;
114 
115  if (MaximalKineticEnergy > 0.0) {
116  // Total emission probability for this channel
119  }
120  }
121  }
122  }
123  //G4cout << "Prob= " << EmissionProbability << G4endl;
124  return EmissionProbability;
125 }
126 
128 {
129  G4Fragment* evFragment = 0;
130  G4double evEnergy = SampleKineticEnergy(*theNucleus) + EvaporatedMass;
131 
133  std::sqrt((evEnergy - EvaporatedMass)*(evEnergy + EvaporatedMass));
134 
135  G4LorentzVector EvaporatedMomentum(momentum, evEnergy);
136  G4LorentzVector ResidualMomentum = theNucleus->GetMomentum();
137  EvaporatedMomentum.boost(ResidualMomentum.boostVector());
138 
139  evFragment = new G4Fragment(A, Z, EvaporatedMomentum);
140  ResidualMomentum -= EvaporatedMomentum;
141  theNucleus->SetZandA_asInt(ResidualZ, ResidualA);
142  theNucleus->SetMomentum(ResidualMomentum);
143 
144  return evFragment;
145 }
146 
148 // Samples fragment kinetic energy.
149 {
150  G4double U = fragment.GetExcitationEnergy();
151 
154 
155  // ***RESIDUAL***
156  //JMQ (September 2009) the following quantities refer to the RESIDUAL:
158  G4double Ux = (2.5 + 150.0/ResidualA)*MeV;
159  G4double Ex = Ux + delta0;
160  G4double InitialLevelDensity;
161  // ***end RESIDUAL ***
162 
163  // ***PARENT***
164  //JMQ (September 2009) the following quantities refer to the PARENT:
165 
166  G4double deltaCN = fNucData->GetPairingCorrection(fragment.GetZ_asInt(),
167  fragment.GetA_asInt());
169  fragment.GetZ_asInt(),
170  U-deltaCN);
171  G4double UxCN = (2.5 + 150.0/G4double(fragment.GetA_asInt()))*MeV;
172  G4double ExCN = UxCN + deltaCN;
173  G4double TCN = 1.0/(std::sqrt(aCN/UxCN) - 1.5/UxCN);
174  // ***end PARENT***
175 
176  //JMQ quantities calculated for CN in InitialLevelDensity
177  if ( U < ExCN )
178  {
179  G4double E0CN = ExCN - TCN*(G4Log(TCN/MeV) - G4Log(aCN*MeV)/4.0
180  - 1.25*G4Log(UxCN/MeV) + 2.0*std::sqrt(aCN*UxCN));
181  InitialLevelDensity = (pi/12.0)*G4Exp((U-E0CN)/TCN)/TCN;
182  }
183  else
184  {
185  G4double x = U-deltaCN;
186  G4double x1 = std::sqrt(aCN*x);
187  InitialLevelDensity = (pi/12.0)*G4Exp(2*x1)/(x*std::sqrt(x1));
188  }
189 
191  //JMQ BIG BUG fixed: hbarc instead of hbar_Planck !!!!
192  // it was also fixed in total probability
193  G4double gg = (2.0*Spin+1.0)*EvaporatedMass/(pi2* hbarc*hbarc);
194  //
195  //JMQ fix on Rb and geometrical cross sections according to Furihata's paper
196  // (JAERI-Data/Code 2001-105, p6)
197  G4double Rb = 0.0;
198  if (A > 4)
199  {
200  G4double Ad = fG4pow->Z13(ResidualA);
201  G4double Aj = fG4pow->Z13(A);
202  Rb = (1.12*(Aj + Ad) - 0.86*((Aj+Ad)/(Aj*Ad))+2.85)*fermi;
203  }
204  else if (A>1)
205  {
206  G4double Ad = fG4pow->Z13(ResidualA);
207  G4double Aj = fG4pow->Z13(A);
208  Rb=1.5*(Aj+Ad)*fermi;
209  }
210  else
211  {
212  G4double Ad = fG4pow->Z13(ResidualA);
213  Rb = 1.5*Ad*fermi;
214  }
215  G4double GeometricalXS = pi*Rb*Rb;
216 
217  G4double ConstantFactor = gg*GeometricalXS*Alpha*pi/(InitialLevelDensity*12);
218  //JMQ : this is the assimptotic maximal kinetic energy of the ejectile
219  // (obtained by energy-momentum conservation).
220  // In general smaller than U-theSeparationEnergy
222  G4double KineticEnergy;
223  G4double Probability;
224 
225  for(G4int i=0; i<100; ++i) {
226  KineticEnergy = CoulombBarrier + G4UniformRand()*(MaximalKineticEnergy);
227  G4double edelta = theEnergy-KineticEnergy-delta0;
228  Probability = ConstantFactor*(KineticEnergy + Beta);
229  G4double a =
231  G4double T = 1.0/(std::sqrt(a/Ux) - 1.5/Ux);
232  //JMQ fix in units
233 
234  if (theEnergy - KineticEnergy < Ex) {
235  G4double E0 = Ex - T*(G4Log(T) - G4Log(a)*0.25
236  - 1.25*G4Log(Ux) + 2.0*std::sqrt(a*Ux));
237  Probability *= G4Exp((theEnergy-KineticEnergy-E0)/T)/T;
238  } else {
239  G4double e2 = edelta*edelta;
240  Probability *=
241  G4Exp(2*std::sqrt(a*edelta) - 0.25*G4Log(a*edelta*e2*e2));
242  }
243  if(EmissionProbability*G4UniformRand() <= Probability) { break; }
244  }
245 
246  return KineticEnergy;
247 }
248 
249 void G4GEMChannel::Dump() const
250 {
252 }
253 
254 
255