Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/de_excitation/ablation/src/G4WilsonAblationModel.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /processes/hadronic/models/de_excitation/ablation/src/G4WilsonAblationModel.cc (Version 11.3.0) and /processes/hadronic/models/de_excitation/ablation/src/G4WilsonAblationModel.cc (Version 9.4.p2)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // *                                               20 // *                                                                  *
 21 // * Parts of this code which have been  devel     21 // * Parts of this code which have been  developed by QinetiQ Ltd     *
 22 // * under contract to the European Space Agen     22 // * under contract to the European Space Agency (ESA) are the        *
 23 // * intellectual property of ESA. Rights to u     23 // * intellectual property of ESA. Rights to use, copy, modify and    *
 24 // * redistribute this software for general pu     24 // * redistribute this software for general public use are granted    *
 25 // * in compliance with any licensing, distrib     25 // * in compliance with any licensing, distribution and development   *
 26 // * policy adopted by the Geant4 Collaboratio     26 // * policy adopted by the Geant4 Collaboration. This code has been   *
 27 // * written by QinetiQ Ltd for the European S     27 // * written by QinetiQ Ltd for the European Space Agency, under ESA  *
 28 // * contract 17191/03/NL/LvH (Aurora Programm     28 // * contract 17191/03/NL/LvH (Aurora Programme).                     *
 29 // *                                               29 // *                                                                  *
 30 // * By using,  copying,  modifying or  distri     30 // * By using,  copying,  modifying or  distributing the software (or *
 31 // * any work based  on the software)  you  ag     31 // * any work based  on the software)  you  agree  to acknowledge its *
 32 // * use  in  resulting  scientific  publicati     32 // * use  in  resulting  scientific  publications,  and indicate your *
 33 // * acceptance of all terms of the Geant4 Sof     33 // * acceptance of all terms of the Geant4 Software license.          *
 34 // *******************************************     34 // ********************************************************************
 35 //                                                 35 //
 36 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     36 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 37 //                                                 37 //
 38 // MODULE:              G4WilsonAblationModel.     38 // MODULE:              G4WilsonAblationModel.cc
 39 //                                                 39 //
 40 // Version:   1.0                                  40 // Version:   1.0
 41 // Date:    08/12/2009                             41 // Date:    08/12/2009
 42 // Author:    P R Truscott                         42 // Author:    P R Truscott
 43 // Organisation:  QinetiQ Ltd, UK                  43 // Organisation:  QinetiQ Ltd, UK
 44 // Customer:    ESA/ESTEC, NOORDWIJK               44 // Customer:    ESA/ESTEC, NOORDWIJK
 45 // Contract:    17191/03/NL/LvH                    45 // Contract:    17191/03/NL/LvH
 46 //                                                 46 //
 47 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     47 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 48 //                                                 48 //
 49 // CHANGE HISTORY                                  49 // CHANGE HISTORY
 50 // --------------                                  50 // --------------
 51 //                                                 51 //
 52 // 6 October 2003, P R Truscott, QinetiQ Ltd,      52 // 6 October 2003, P R Truscott, QinetiQ Ltd, UK
 53 // Created.                                        53 // Created.
 54 //                                                 54 //
 55 // 15 March 2004, P R Truscott, QinetiQ Ltd, U     55 // 15 March 2004, P R Truscott, QinetiQ Ltd, UK
 56 // Beta release                                    56 // Beta release
 57 //                                                 57 //
 58 // 08 December 2009, P R Truscott, QinetiQ Ltd     58 // 08 December 2009, P R Truscott, QinetiQ Ltd, UK
 59 // Ver 1.0                                         59 // Ver 1.0
 60 // Updated as a result of changes in the G4Eva     60 // Updated as a result of changes in the G4Evaporation classes.  These changes
 61 // affect mostly SelectSecondariesByEvaporatio     61 // affect mostly SelectSecondariesByEvaporation, and now you have variables
 62 // associated with the evaporation model which     62 // associated with the evaporation model which can be changed:
 63 //    OPTxs to select the inverse cross-sectio     63 //    OPTxs to select the inverse cross-section
 64 //    OPTxs = 0      => Dostrovski's parameter     64 //    OPTxs = 0      => Dostrovski's parameterization
 65 //    OPTxs = 1 or 2 => Chatterjee's paramater     65 //    OPTxs = 1 or 2 => Chatterjee's paramaterization
 66 //    OPTxs = 3 or 4 => Kalbach's parameteriza     66 //    OPTxs = 3 or 4 => Kalbach's parameterization
 67 //    useSICB        => use superimposed Coulo     67 //    useSICB        => use superimposed Coulomb Barrier for inverse cross
 68 //                      sections                   68 //                      sections
 69 // Other problem found with G4Fragment definit     69 // Other problem found with G4Fragment definition using Lorentz vector and
 70 // **G4ParticleDefinition**.  This does not al     70 // **G4ParticleDefinition**.  This does not allow A and Z to be defined for the
 71 // fragment for some reason.  Now the fragment     71 // fragment for some reason.  Now the fragment is defined more explicitly:
 72 //    G4Fragment *fragment = new G4Fragment(A,     72 //    G4Fragment *fragment = new G4Fragment(A, Z, lorentzVector);
 73 // to avoid this quirk.  Bug found in SelectSe     73 // to avoid this quirk.  Bug found in SelectSecondariesByDefault: *type is now
 74 // equated to evapType[i] whereas previously i     74 // equated to evapType[i] whereas previously it was equated to fragType[i].
 75 //                                                 75 // 
 76 // 06 August 2015, A. Ribon, CERN              << 
 77 // Migrated std::exp and std::pow to the faste << 
 78 //                                             << 
 79 // 09 June 2017, C. Mancini Terracciano, INFN  << 
 80 // Fixed bug on the initialization of Photon E << 
 81 //                                             << 
 82 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     76 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 83 //////////////////////////////////////////////     77 ////////////////////////////////////////////////////////////////////////////////
 84 //                                                 78 //
 85 #include <iomanip>                             << 
 86 #include <numeric>                             << 
 87                                                << 
 88 #include "G4WilsonAblationModel.hh"                79 #include "G4WilsonAblationModel.hh"
 89 #include "G4PhysicalConstants.hh"              << 
 90 #include "G4SystemOfUnits.hh"                  << 
 91 #include "Randomize.hh"                            80 #include "Randomize.hh"
 92 #include "G4ParticleTable.hh"                      81 #include "G4ParticleTable.hh"
 93 #include "G4IonTable.hh"                           82 #include "G4IonTable.hh"
 94 #include "G4Alpha.hh"                              83 #include "G4Alpha.hh"
 95 #include "G4He3.hh"                                84 #include "G4He3.hh"
 96 #include "G4Triton.hh"                             85 #include "G4Triton.hh"
 97 #include "G4Deuteron.hh"                           86 #include "G4Deuteron.hh"
 98 #include "G4Proton.hh"                             87 #include "G4Proton.hh"
 99 #include "G4Neutron.hh"                            88 #include "G4Neutron.hh"
100 #include "G4AlphaEvaporationChannel.hh"            89 #include "G4AlphaEvaporationChannel.hh"
101 #include "G4He3EvaporationChannel.hh"              90 #include "G4He3EvaporationChannel.hh"
102 #include "G4TritonEvaporationChannel.hh"           91 #include "G4TritonEvaporationChannel.hh"
103 #include "G4DeuteronEvaporationChannel.hh"         92 #include "G4DeuteronEvaporationChannel.hh"
104 #include "G4ProtonEvaporationChannel.hh"           93 #include "G4ProtonEvaporationChannel.hh"
105 #include "G4NeutronEvaporationChannel.hh"          94 #include "G4NeutronEvaporationChannel.hh"
106 #include "G4PhotonEvaporation.hh"              << 
107 #include "G4LorentzVector.hh"                      95 #include "G4LorentzVector.hh"
108 #include "G4VEvaporationChannel.hh"                96 #include "G4VEvaporationChannel.hh"
109                                                    97 
110 #include "G4Exp.hh"                            <<  98 #include <iomanip>
111 #include "G4Pow.hh"                            <<  99 #include <numeric>
112                                                << 
113 #include "G4PhysicsModelCatalog.hh"            << 
114                                                << 
115 //////////////////////////////////////////////    100 ////////////////////////////////////////////////////////////////////////////////
116 //                                                101 //
117 G4WilsonAblationModel::G4WilsonAblationModel()    102 G4WilsonAblationModel::G4WilsonAblationModel()
118 {                                                 103 {
119 //                                                104 //
120 //                                                105 //
121 // Send message to stdout to advise that the G    106 // Send message to stdout to advise that the G4Abrasion model is being used.
122 //                                                107 //
123   PrintWelcomeMessage();                          108   PrintWelcomeMessage();
124 //                                                109 //
125 //                                                110 //
126 // Set the default verbose level to 0 - no out    111 // Set the default verbose level to 0 - no output.
127 //                                                112 //
128   verboseLevel = 0;                               113   verboseLevel = 0;  
129 //                                                114 //
130 //                                                115 //
131 // Set the binding energy per nucleon .... did    116 // Set the binding energy per nucleon .... did I mention that this is a crude
132 // model for nuclear de-excitation?               117 // model for nuclear de-excitation?
133 //                                                118 //
134   B = 10.0 * MeV;                                 119   B = 10.0 * MeV;
135 //                                                120 //
136 //                                                121 //
137 // It is possuble to switch off secondary part    122 // It is possuble to switch off secondary particle production (other than the
138 // final nuclear fragment).  The default is on    123 // final nuclear fragment).  The default is on.
139 //                                                124 //
140   produceSecondaries = true;                      125   produceSecondaries = true;
141 //                                                126 //
142 //                                                127 //
143 // Now we need to define the decay modes.  We'    128 // Now we need to define the decay modes.  We're using the G4Evaporation model
144 // to help determine the kinematics of the dec    129 // to help determine the kinematics of the decay.
145 //                                                130 //
146   nFragTypes  = 6;                                131   nFragTypes  = 6;
147   fragType[0] = G4Alpha::Alpha();                 132   fragType[0] = G4Alpha::Alpha();
148   fragType[1] = G4He3::He3();                     133   fragType[1] = G4He3::He3();
149   fragType[2] = G4Triton::Triton();               134   fragType[2] = G4Triton::Triton();
150   fragType[3] = G4Deuteron::Deuteron();           135   fragType[3] = G4Deuteron::Deuteron();
151   fragType[4] = G4Proton::Proton();               136   fragType[4] = G4Proton::Proton();
152   fragType[5] = G4Neutron::Neutron();             137   fragType[5] = G4Neutron::Neutron();
153   for(G4int i=0; i<200; ++i) { fSig[i] = 0.0;  << 
154 //                                                138 //
155 //                                                139 //
156 // Set verboseLevel default to no output.         140 // Set verboseLevel default to no output.
157 //                                                141 //
158   verboseLevel = 0;                               142   verboseLevel = 0;
159   theChannelFactory = new G4EvaporationFactory << 143   theChannelFactory = new G4EvaporationFactory();
160   theChannels = theChannelFactory->GetChannel(    144   theChannels = theChannelFactory->GetChannel();
161 //                                                145 //
162 //                                                146 //
163 // Set defaults for evaporation classes.  Thes    147 // Set defaults for evaporation classes.  These can be overridden by user
164 // "set" methods.                                 148 // "set" methods.
165 //                                                149 //
166   OPTxs   = 3;                                    150   OPTxs   = 3;
167   useSICB = false;                                151   useSICB = false;
168   fragmentVector = 0;                             152   fragmentVector = 0;
169                                                << 
170   secID = G4PhysicsModelCatalog::GetModelID("m << 
171 }                                                 153 }
172 //////////////////////////////////////////////    154 ////////////////////////////////////////////////////////////////////////////////
173 //                                                155 //
174 G4WilsonAblationModel::~G4WilsonAblationModel(    156 G4WilsonAblationModel::~G4WilsonAblationModel()
175 {}                                             << 157 {
176                                                << 158   if (theChannels != 0) theChannels = 0;
                                                   >> 159   if (theChannelFactory != 0) delete theChannelFactory;
                                                   >> 160 }
177 //////////////////////////////////////////////    161 ////////////////////////////////////////////////////////////////////////////////
178 //                                                162 //
179 G4FragmentVector *G4WilsonAblationModel::Break    163 G4FragmentVector *G4WilsonAblationModel::BreakItUp
180   (const G4Fragment &theNucleus)                  164   (const G4Fragment &theNucleus)
181 {                                                 165 {
182 //                                                166 //
183 //                                                167 //
184 // Initilise the pointer to the G4FragmentVect    168 // Initilise the pointer to the G4FragmentVector used to return the information
185 // about the breakup.                             169 // about the breakup.
186 //                                                170 //
187   fragmentVector = new G4FragmentVector;          171   fragmentVector = new G4FragmentVector;
188   fragmentVector->clear();                        172   fragmentVector->clear();
189 //                                                173 //
190 //                                                174 //
191 // Get the A, Z and excitation of the nucleus.    175 // Get the A, Z and excitation of the nucleus.
192 //                                                176 //
193   G4int A     = theNucleus.GetA_asInt();       << 177   G4int A     = (G4int) theNucleus.GetA();
194   G4int Z     = theNucleus.GetZ_asInt();       << 178   G4int Z     = (G4int) theNucleus.GetZ();
195   G4double ex = theNucleus.GetExcitationEnergy    179   G4double ex = theNucleus.GetExcitationEnergy();
196   if (verboseLevel >= 2)                          180   if (verboseLevel >= 2)
197   {                                               181   {
198     G4cout <<"oooooooooooooooooooooooooooooooo    182     G4cout <<"oooooooooooooooooooooooooooooooooooooooo"
199            <<"oooooooooooooooooooooooooooooooo    183            <<"oooooooooooooooooooooooooooooooooooooooo"
200            <<G4endl;                              184            <<G4endl;
201     G4cout.precision(6);                          185     G4cout.precision(6);
202     G4cout <<"IN G4WilsonAblationModel" <<G4en    186     G4cout <<"IN G4WilsonAblationModel" <<G4endl;
203     G4cout <<"Initial prefragment A=" <<A         187     G4cout <<"Initial prefragment A=" <<A
204            <<", Z=" <<Z                           188            <<", Z=" <<Z
205            <<", excitation energy = " <<ex/MeV    189            <<", excitation energy = " <<ex/MeV <<" MeV"
206            <<G4endl;                              190            <<G4endl; 
207   }                                               191   }
208 //                                                192 //
209 //                                                193 //
210 // Check that there is a nucleus to speak of.     194 // Check that there is a nucleus to speak of.  It's possible there isn't one
211 // or its just a proton or neutron.  In either    195 // or its just a proton or neutron.  In either case, the excitation energy
212 // (from the Lorentz vector) is not used.         196 // (from the Lorentz vector) is not used.
213 //                                                197 //
214   if (A == 0)                                     198   if (A == 0)
215   {                                               199   {
216     if (verboseLevel >= 2)                        200     if (verboseLevel >= 2)
217     {                                             201     {
218       G4cout <<"No nucleus to decay" <<G4endl;    202       G4cout <<"No nucleus to decay" <<G4endl;
219       G4cout <<"oooooooooooooooooooooooooooooo    203       G4cout <<"oooooooooooooooooooooooooooooooooooooooo"
220              <<"oooooooooooooooooooooooooooooo    204              <<"oooooooooooooooooooooooooooooooooooooooo"
221              <<G4endl;                            205              <<G4endl;
222     }                                             206     }
223     return fragmentVector;                        207     return fragmentVector;
224   }                                               208   }
225   else if (A == 1)                                209   else if (A == 1)
226   {                                               210   {
227     G4LorentzVector lorentzVector = theNucleus    211     G4LorentzVector lorentzVector = theNucleus.GetMomentum();
228     lorentzVector.setE(lorentzVector.e()-ex+10    212     lorentzVector.setE(lorentzVector.e()-ex+10.0*eV);
229     if (Z == 0)                                   213     if (Z == 0)
230     {                                             214     {
231       G4Fragment *fragment = new G4Fragment(lo    215       G4Fragment *fragment = new G4Fragment(lorentzVector,G4Neutron::Neutron());
232       if (fragment != nullptr) { fragment->Set << 
233       fragmentVector->push_back(fragment);        216       fragmentVector->push_back(fragment);
234     }                                             217     }
235     else                                          218     else
236     {                                             219     {
237       G4Fragment *fragment = new G4Fragment(lo    220       G4Fragment *fragment = new G4Fragment(lorentzVector,G4Proton::Proton());
238       if (fragment != nullptr) { fragment->Set << 
239       fragmentVector->push_back(fragment);        221       fragmentVector->push_back(fragment);
240     }                                             222     }
241     if (verboseLevel >= 2)                        223     if (verboseLevel >= 2)
242     {                                             224     {
243       G4cout <<"Final fragment is in fact only    225       G4cout <<"Final fragment is in fact only a nucleon) :" <<G4endl;
244       G4cout <<(*fragmentVector)[0] <<G4endl;     226       G4cout <<(*fragmentVector)[0] <<G4endl;
245       G4cout <<"oooooooooooooooooooooooooooooo    227       G4cout <<"oooooooooooooooooooooooooooooooooooooooo"
246              <<"oooooooooooooooooooooooooooooo    228              <<"oooooooooooooooooooooooooooooooooooooooo"
247              <<G4endl;                            229              <<G4endl;
248     }                                             230     }
249     return fragmentVector;                        231     return fragmentVector;
250   }                                               232   }
251 //                                                233 //
252 //                                                234 //
253 // Then the number of nucleons ablated (either    235 // Then the number of nucleons ablated (either as nucleons or light nuclear
254 // fragments) is based on a simple argument fo    236 // fragments) is based on a simple argument for the binding energy per nucleon.
255 //                                                237 //
256   G4int DAabl = (G4int) (ex / B);                 238   G4int DAabl = (G4int) (ex / B);
257   if (DAabl > A) DAabl = A;                       239   if (DAabl > A) DAabl = A;
258 // The following lines are no longer accurate     240 // The following lines are no longer accurate given we now treat the final fragment
259 //  if (verboseLevel >= 2)                        241 //  if (verboseLevel >= 2)
260 //    G4cout <<"Number of nucleons ejected = "    242 //    G4cout <<"Number of nucleons ejected = " <<DAabl <<G4endl;
261                                                   243 
262 //                                                244 //
263 //                                                245 //
264 // Determine the nuclear fragment from the abl    246 // Determine the nuclear fragment from the ablation process by sampling the
265 // Rudstam equation.                              247 // Rudstam equation.
266 //                                                248 //
267   G4int AF = A - DAabl;                           249   G4int AF = A - DAabl;
268   G4int ZF = 0;                                   250   G4int ZF = 0;
269                                                << 
270   if (AF > 0)                                     251   if (AF > 0)
271   {                                               252   {
272     G4Pow* g4calc = G4Pow::GetInstance();      << 
273     G4double AFd = (G4double) AF;                 253     G4double AFd = (G4double) AF;
274     G4double R = 11.8 / g4calc->powZ(AF, 0.45) << 254     G4double R = 11.8 / std::pow(AFd, 0.45);
275     G4int minZ = std::max(1, Z - DAabl);       << 255     G4int minZ = Z - DAabl;
                                                   >> 256     if (minZ <= 0) minZ = 1;
276 //                                                257 //
277 //                                                258 //
278 // Here we define an integral probability dist    259 // Here we define an integral probability distribution based on the Rudstam
279 // equation assuming a constant AF.               260 // equation assuming a constant AF.
280 //                                                261 //    
281     G4int zmax = std::min(199, Z);             << 262     G4double sig[100];
282     G4double sum = 0.0;                           263     G4double sum = 0.0;
283     for (ZF=minZ; ZF<=zmax; ++ZF)              << 264     for (G4int ii=minZ; ii<= Z; ii++)
284     {                                             265     {
285       sum += G4Exp(-R*g4calc->powA(std::abs(ZF << 266       sum   += std::exp(-R*std::pow(std::abs(ii - 0.486*AFd + 3.8E-04*AFd*AFd),1.5));
286       fSig[ZF] = sum;                          << 267       sig[ii] = sum;
287     }                                             268     }
288 //                                                269 //
289 //                                                270 //
290 // Now sample that distribution to determine a    271 // Now sample that distribution to determine a value for ZF.
291 //                                                272 //
292     sum *= G4UniformRand();                    << 273     G4double xi  = G4UniformRand();
293     for (ZF=minZ; ZF<=zmax; ++ZF) {            << 274     G4int iz     = minZ;
294       if(sum <= fSig[ZF]) { break; }           << 275     G4bool found = false;
295     }                                          << 276     while (iz <= Z && !found)
                                                   >> 277     {
                                                   >> 278       found = (xi <= sig[iz]/sum);
                                                   >> 279       if (!found) iz++;
                                                   >> 280     }
                                                   >> 281     if (iz > Z)
                                                   >> 282       ZF = Z;
                                                   >> 283     else
                                                   >> 284       ZF = iz;
296   }                                               285   }
297   G4int DZabl = Z - ZF;                           286   G4int DZabl = Z - ZF;
298 //                                                287 //
299 //                                                288 //
300 // Now determine the nucleons or nuclei which     289 // Now determine the nucleons or nuclei which have bee ablated.  The preference
301 // is for the production of alphas, then other    290 // is for the production of alphas, then other nuclei in order of decreasing
302 // binding energy. The energies assigned to th    291 // binding energy. The energies assigned to the products of the decay are
303 // provisional for the moment (the 10eV is jus    292 // provisional for the moment (the 10eV is just to avoid errors with negative
304 // excitation energies due to rounding).          293 // excitation energies due to rounding).
305 //                                                294 //
306   G4double totalEpost = 0.0;                      295   G4double totalEpost = 0.0;
307   evapType.clear();                               296   evapType.clear();
308   for (G4int ift=0; ift<nFragTypes; ift++)        297   for (G4int ift=0; ift<nFragTypes; ift++)
309   {                                               298   {
310     G4ParticleDefinition *type = fragType[ift]    299     G4ParticleDefinition *type = fragType[ift];
311     G4double n  = std::floor((G4double) DAabl     300     G4double n  = std::floor((G4double) DAabl / type->GetBaryonNumber() + 1.0E-10);
312     G4double n1 = 1.0E+10;                        301     G4double n1 = 1.0E+10;
313     if (fragType[ift]->GetPDGCharge() > 0.0)      302     if (fragType[ift]->GetPDGCharge() > 0.0)
314       n1 = std::floor((G4double) DZabl / type-    303       n1 = std::floor((G4double) DZabl / type->GetPDGCharge() + 1.0E-10);
315     if (n > n1) n = n1;                           304     if (n > n1) n = n1;
316     if (n > 0.0)                                  305     if (n > 0.0)
317     {                                             306     {
318       G4double mass = type->GetPDGMass();         307       G4double mass = type->GetPDGMass();
319       for (G4int j=0; j<(G4int) n; j++)           308       for (G4int j=0; j<(G4int) n; j++)
320       {                                           309       {
321         totalEpost += mass;                       310         totalEpost += mass;
322         evapType.push_back(type);                 311         evapType.push_back(type);
323       }                                           312       }
324       DAabl -= (G4int) (n * type->GetBaryonNum    313       DAabl -= (G4int) (n * type->GetBaryonNumber() + 1.0E-10);
325       DZabl -= (G4int) (n * type->GetPDGCharge    314       DZabl -= (G4int) (n * type->GetPDGCharge() + 1.0E-10);
326     }                                             315     }
327   }                                               316   }
328 //                                                317 //
329 //                                                318 //
330 // Determine the properties of the final nucle    319 // Determine the properties of the final nuclear fragment.  Note that if
331 // the final fragment is predicted to have a n    320 // the final fragment is predicted to have a nucleon number of zero, then
332 // really it's the particle last in the vector    321 // really it's the particle last in the vector evapType which becomes the
333 // final fragment.  Therefore delete this from    322 // final fragment.  Therefore delete this from the vector if this is the
334 // case.                                          323 // case.
335 //                                                324 //
336   G4double massFinalFrag = 0.0;                   325   G4double massFinalFrag = 0.0;
337   if (AF > 0)                                     326   if (AF > 0)
338     massFinalFrag = G4ParticleTable::GetPartic    327     massFinalFrag = G4ParticleTable::GetParticleTable()->GetIonTable()->
339       GetIonMass(ZF,AF);                          328       GetIonMass(ZF,AF);
340   else                                            329   else
341   {                                               330   {
342     G4ParticleDefinition *type = evapType[evap    331     G4ParticleDefinition *type = evapType[evapType.size()-1];
343     AF                         = type->GetBary    332     AF                         = type->GetBaryonNumber();
344     ZF                         = (G4int) (type    333     ZF                         = (G4int) (type->GetPDGCharge() + 1.0E-10);
345     evapType.erase(evapType.end()-1);             334     evapType.erase(evapType.end()-1);
346   }                                               335   }
347   totalEpost   += massFinalFrag;                  336   totalEpost   += massFinalFrag;
348 //                                                337 //
349 //                                                338 //
350 // Provide verbose output on the nuclear fragm    339 // Provide verbose output on the nuclear fragment if requested.
351 //                                                340 //
352   if (verboseLevel >= 2)                          341   if (verboseLevel >= 2)
353   {                                               342   {
354     G4cout <<"Final fragment      A=" <<AF        343     G4cout <<"Final fragment      A=" <<AF
355            <<", Z=" <<ZF                          344            <<", Z=" <<ZF
356            <<G4endl;                              345            <<G4endl;
357     for (G4int ift=0; ift<nFragTypes; ift++)      346     for (G4int ift=0; ift<nFragTypes; ift++)
358     {                                             347     {
359       G4ParticleDefinition *type = fragType[if    348       G4ParticleDefinition *type = fragType[ift];
360       G4long n = std::count(evapType.cbegin(), << 349       G4int n                    = std::count(evapType.begin(),evapType.end(),type);
361       if (n > 0)                                  350       if (n > 0) 
362         G4cout <<"Particle type: " <<std::setw    351         G4cout <<"Particle type: " <<std::setw(10) <<type->GetParticleName()
363                <<", number of particles emitte    352                <<", number of particles emitted = " <<n <<G4endl;
364     }                                             353     }
365   }                                               354   }
366 //                                                355 //
367 // Add the total energy from the fragment.  No    356 // Add the total energy from the fragment.  Note that the fragment is assumed
368 // to be de-excited and does not undergo photo    357 // to be de-excited and does not undergo photo-evaporation .... I did mention
369 // this is a bit of a crude model?                358 // this is a bit of a crude model?
370 //                                                359 //
371   G4double massPreFrag      = theNucleus.GetGr    360   G4double massPreFrag      = theNucleus.GetGroundStateMass();
372   G4double totalEpre        = massPreFrag + ex    361   G4double totalEpre        = massPreFrag + ex;
373   G4double excess           = totalEpre - tota    362   G4double excess           = totalEpre - totalEpost;
374 //  G4Fragment *resultNucleus(theNucleus);        363 //  G4Fragment *resultNucleus(theNucleus);
375   G4Fragment *resultNucleus = new G4Fragment(A    364   G4Fragment *resultNucleus = new G4Fragment(A, Z, theNucleus.GetMomentum());
376   G4ThreeVector boost(0.0,0.0,0.0);               365   G4ThreeVector boost(0.0,0.0,0.0);
377   std::size_t nEvap = 0;                       << 366   G4int nEvap = 0;
378   if (produceSecondaries && evapType.size()>0)    367   if (produceSecondaries && evapType.size()>0)
379   {                                               368   {
380     if (excess > 0.0)                             369     if (excess > 0.0)
381     {                                             370     {
382       SelectSecondariesByEvaporation (resultNu    371       SelectSecondariesByEvaporation (resultNucleus);
383       nEvap = fragmentVector->size();             372       nEvap = fragmentVector->size();
384       boost = resultNucleus->GetMomentum().fin    373       boost = resultNucleus->GetMomentum().findBoostToCM();
385       if (evapType.size() > 0)                    374       if (evapType.size() > 0)
386         SelectSecondariesByDefault (boost);       375         SelectSecondariesByDefault (boost);
387     }                                             376     }
388     else                                          377     else
389       SelectSecondariesByDefault(G4ThreeVector    378       SelectSecondariesByDefault(G4ThreeVector(0.0,0.0,0.0));
390   }                                               379   }
391                                                   380 
392   if (AF > 0)                                     381   if (AF > 0)
393   {                                               382   {
394     G4double mass = G4ParticleTable::GetPartic    383     G4double mass = G4ParticleTable::GetParticleTable()->GetIonTable()->
395       GetIonMass(ZF,AF);                          384       GetIonMass(ZF,AF);
396     G4double e    = mass + 10.0*eV;               385     G4double e    = mass + 10.0*eV;
397     G4double p    = std::sqrt(e*e-mass*mass);     386     G4double p    = std::sqrt(e*e-mass*mass);
398     G4ThreeVector direction(0.0,0.0,1.0);         387     G4ThreeVector direction(0.0,0.0,1.0);
399     G4LorentzVector lorentzVector = G4LorentzV    388     G4LorentzVector lorentzVector = G4LorentzVector(direction*p, e);
400     lorentzVector.boost(-boost);                  389     lorentzVector.boost(-boost);
401     G4Fragment* frag = new G4Fragment(AF, ZF,  << 390     *resultNucleus = G4Fragment(AF, ZF, lorentzVector);
402     if (frag != nullptr) { frag->SetCreatorMod << 391     fragmentVector->push_back(resultNucleus);
403     fragmentVector->push_back(frag);           << 
404   }                                               392   }
405   delete resultNucleus;                        << 
406 //                                                393 //
407 //                                                394 //
408 // Provide verbose output on the ablation prod    395 // Provide verbose output on the ablation products if requested.
409 //                                                396 //
410   if (verboseLevel >= 2)                          397   if (verboseLevel >= 2)
411   {                                               398   {
412     if (nEvap > 0)                                399     if (nEvap > 0)
413     {                                             400     {
414       G4cout <<"----------------------" <<G4en    401       G4cout <<"----------------------" <<G4endl;
415       G4cout <<"Evaporated particles :" <<G4en    402       G4cout <<"Evaporated particles :" <<G4endl;
416       G4cout <<"----------------------" <<G4en    403       G4cout <<"----------------------" <<G4endl;
417     }                                             404     }
418     std::size_t ie = 0;                        << 405     G4int ie = 0;
419     for (auto iter = fragmentVector->cbegin(); << 406     G4FragmentVector::iterator iter;
420               iter != fragmentVector->cend();  << 407     for (iter = fragmentVector->begin(); iter != fragmentVector->end(); iter++)
421     {                                             408     {
422       if (ie == nEvap)                            409       if (ie == nEvap)
423       {                                           410       {
424 //        G4cout <<*iter  <<G4endl;               411 //        G4cout <<*iter  <<G4endl;
425         G4cout <<"----------------------------    412         G4cout <<"---------------------------------" <<G4endl;
426         G4cout <<"Particles from default emiss    413         G4cout <<"Particles from default emission :" <<G4endl;
427         G4cout <<"----------------------------    414         G4cout <<"---------------------------------" <<G4endl;
428       }                                           415       }
429       G4cout <<*iter <<G4endl;                    416       G4cout <<*iter <<G4endl;
430     }                                             417     }
431     G4cout <<"oooooooooooooooooooooooooooooooo    418     G4cout <<"oooooooooooooooooooooooooooooooooooooooo"
432            <<"oooooooooooooooooooooooooooooooo    419            <<"oooooooooooooooooooooooooooooooooooooooo"
433            <<G4endl;                              420            <<G4endl;
434   }                                               421   }
435                                                   422 
436   return fragmentVector;                          423   return fragmentVector;    
437 }                                                 424 }
438 //////////////////////////////////////////////    425 ////////////////////////////////////////////////////////////////////////////////
439 //                                                426 //
440 void G4WilsonAblationModel::SelectSecondariesB    427 void G4WilsonAblationModel::SelectSecondariesByEvaporation
441   (G4Fragment *intermediateNucleus)               428   (G4Fragment *intermediateNucleus)
442 {                                                 429 {
443   G4Fragment theResidualNucleus = *intermediat    430   G4Fragment theResidualNucleus = *intermediateNucleus;
444   G4bool evaporate = true;                        431   G4bool evaporate = true;
445   // Loop checking, 05-Aug-2015, Vladimir Ivan << 
446   while (evaporate && evapType.size() != 0)       432   while (evaporate && evapType.size() != 0)
447   {                                               433   {
448 //                                                434 //
449 //                                                435 //
450 // Here's the cheaky bit.  We're hijacking the    436 // Here's the cheaky bit.  We're hijacking the G4Evaporation model, in order to
451 // more accurately sample to kinematics, but t    437 // more accurately sample to kinematics, but the species of the nuclear
452 // fragments will be the ones of our choosing     438 // fragments will be the ones of our choosing as above.
453 //                                                439 //
454     std::vector <G4VEvaporationChannel*>  theC << 440     std::vector <G4VEvaporationChannel*>  theChannels;
455     theChannels1.clear();                      << 441     theChannels.clear();
456     std::vector <G4VEvaporationChannel*>::iter    442     std::vector <G4VEvaporationChannel*>::iterator i;
457     VectorOfFragmentTypes::iterator iter;         443     VectorOfFragmentTypes::iterator iter;
458     std::vector <VectorOfFragmentTypes::iterat    444     std::vector <VectorOfFragmentTypes::iterator> iters;
459     iters.clear();                                445     iters.clear();
460     iter = std::find(evapType.begin(), evapTyp    446     iter = std::find(evapType.begin(), evapType.end(), G4Alpha::Alpha());
461     if (iter != evapType.end())                   447     if (iter != evapType.end())
462     {                                             448     {
463       theChannels1.push_back(new G4AlphaEvapor << 449       theChannels.push_back(new G4AlphaEvaporationChannel);
464       i = theChannels1.end() - 1;              << 450       i = theChannels.end() - 1;
465       (*i)->SetOPTxs(OPTxs);                      451       (*i)->SetOPTxs(OPTxs);
466       (*i)->UseSICB(useSICB);                     452       (*i)->UseSICB(useSICB);
467 //      (*i)->Initialize(theResidualNucleus);     453 //      (*i)->Initialize(theResidualNucleus);
468       iters.push_back(iter);                      454       iters.push_back(iter);
469     }                                             455     }
470     iter = std::find(evapType.begin(), evapTyp    456     iter = std::find(evapType.begin(), evapType.end(), G4He3::He3());
471     if (iter != evapType.end())                   457     if (iter != evapType.end())
472     {                                             458     {
473       theChannels1.push_back(new G4He3Evaporat << 459       theChannels.push_back(new G4He3EvaporationChannel);
474       i = theChannels1.end() - 1;              << 460       i = theChannels.end() - 1;
475       (*i)->SetOPTxs(OPTxs);                      461       (*i)->SetOPTxs(OPTxs);
476       (*i)->UseSICB(useSICB);                     462       (*i)->UseSICB(useSICB);
477 //      (*i)->Initialize(theResidualNucleus);     463 //      (*i)->Initialize(theResidualNucleus);
478       iters.push_back(iter);                      464       iters.push_back(iter);
479     }                                             465     }
480     iter = std::find(evapType.begin(), evapTyp    466     iter = std::find(evapType.begin(), evapType.end(), G4Triton::Triton());
481     if (iter != evapType.end())                   467     if (iter != evapType.end())
482     {                                             468     {
483       theChannels1.push_back(new G4TritonEvapo << 469       theChannels.push_back(new G4TritonEvaporationChannel);
484       i = theChannels1.end() - 1;              << 470       i = theChannels.end() - 1;
485       (*i)->SetOPTxs(OPTxs);                      471       (*i)->SetOPTxs(OPTxs);
486       (*i)->UseSICB(useSICB);                     472       (*i)->UseSICB(useSICB);
487 //      (*i)->Initialize(theResidualNucleus);     473 //      (*i)->Initialize(theResidualNucleus);
488       iters.push_back(iter);                      474       iters.push_back(iter);
489     }                                             475     }
490     iter = std::find(evapType.begin(), evapTyp    476     iter = std::find(evapType.begin(), evapType.end(), G4Deuteron::Deuteron());
491     if (iter != evapType.end())                   477     if (iter != evapType.end())
492     {                                             478     {
493       theChannels1.push_back(new G4DeuteronEva << 479       theChannels.push_back(new G4DeuteronEvaporationChannel);
494       i = theChannels1.end() - 1;              << 480       i = theChannels.end() - 1;
495       (*i)->SetOPTxs(OPTxs);                      481       (*i)->SetOPTxs(OPTxs);
496       (*i)->UseSICB(useSICB);                     482       (*i)->UseSICB(useSICB);
497 //      (*i)->Initialize(theResidualNucleus);     483 //      (*i)->Initialize(theResidualNucleus);
498       iters.push_back(iter);                      484       iters.push_back(iter);
499     }                                             485     }
500     iter = std::find(evapType.begin(), evapTyp    486     iter = std::find(evapType.begin(), evapType.end(), G4Proton::Proton());
501     if (iter != evapType.end())                   487     if (iter != evapType.end())
502     {                                             488     {
503       theChannels1.push_back(new G4ProtonEvapo << 489       theChannels.push_back(new G4ProtonEvaporationChannel);
504       i = theChannels1.end() - 1;              << 490       i = theChannels.end() - 1;
505       (*i)->SetOPTxs(OPTxs);                      491       (*i)->SetOPTxs(OPTxs);
506       (*i)->UseSICB(useSICB);                     492       (*i)->UseSICB(useSICB);
507 //      (*i)->Initialize(theResidualNucleus);     493 //      (*i)->Initialize(theResidualNucleus);
508       iters.push_back(iter);                      494       iters.push_back(iter);
509     }                                             495     }
510     iter = std::find(evapType.begin(), evapTyp    496     iter = std::find(evapType.begin(), evapType.end(), G4Neutron::Neutron());
511     if (iter != evapType.end())                   497     if (iter != evapType.end())
512     {                                             498     {
513       theChannels1.push_back(new G4NeutronEvap << 499       theChannels.push_back(new G4NeutronEvaporationChannel);
514       i = theChannels1.end() - 1;              << 500       i = theChannels.end() - 1;
515       (*i)->SetOPTxs(OPTxs);                      501       (*i)->SetOPTxs(OPTxs);
516       (*i)->UseSICB(useSICB);                     502       (*i)->UseSICB(useSICB);
517 //      (*i)->Initialize(theResidualNucleus);     503 //      (*i)->Initialize(theResidualNucleus);
518       iters.push_back(iter);                      504       iters.push_back(iter);
519     }                                             505     }
520     std::size_t nChannels = theChannels1.size( << 506     G4int nChannels = theChannels.size();
521                                                   507 
522     G4double totalProb = 0.0;                  << 508     std::vector<G4VEvaporationChannel*>::iterator iterEv;
523     G4int ich = 0;                             << 509     for (iterEv=theChannels.begin(); iterEv!=theChannels.end(); iterEv++)
524     G4double probEvapType[6] = {0.0};          << 510       (*iterEv)->Initialize(*intermediateNucleus);
525     for (auto iterEv=theChannels1.cbegin();    << 511     G4double totalProb = std::accumulate(theChannels.begin(),
526               iterEv!=theChannels1.cend(); ++i << 512       theChannels.end(), 0.0, SumProbabilities());
527       totalProb += (*iterEv)->GetEmissionProba << 513     if (totalProb > 0.0)
528       probEvapType[ich] = totalProb;           << 514     {
529       ++ich;                                   << 
530     }                                          << 
531     if (totalProb > 0.0) {                     << 
532 //                                                515 //
533 //                                                516 //
534 // The emission probability for at least one o    517 // The emission probability for at least one of the evaporation channels is
535 // positive, therefore work out which one shou    518 // positive, therefore work out which one should be selected and decay
536 // the nucleus.                                   519 // the nucleus.
537 //                                                520 //
538       G4double xi = totalProb*G4UniformRand(); << 521       G4double totalProb1      = 0.0;
539       std::size_t ii = 0;                      << 522       G4double probEvapType[6] = {0.0};
540       for (ii=0; ii<nChannels; ++ii)           << 523       for (G4int ich=0; ich<nChannels; ich++)
541       {                                        << 
542         if (xi < probEvapType[ii]) { break; }  << 
543       }                                        << 
544       if (ii >= nChannels) { ii = nChannels -  << 
545       G4FragmentVector *evaporationResult = th << 
546         BreakUpFragment(intermediateNucleus);  << 
547       if ((*evaporationResult)[0] != nullptr)  << 
548       {                                           524       {
549         (*evaporationResult)[0]->SetCreatorMod << 525         totalProb1      += theChannels[ich]->GetEmissionProbability();
                                                   >> 526         probEvapType[ich]  = totalProb1 / totalProb;
550       }                                           527       }
                                                   >> 528       G4double xi = G4UniformRand();
                                                   >> 529       G4int i     = 0;
                                                   >> 530       for (i=0; i<nChannels; i++)
                                                   >> 531         if (xi < probEvapType[i]) break;
                                                   >> 532       if (i > nChannels) i = nChannels - 1;
                                                   >> 533       G4FragmentVector *evaporationResult = theChannels[i]->
                                                   >> 534         BreakUp(*intermediateNucleus);
551       fragmentVector->push_back((*evaporationR    535       fragmentVector->push_back((*evaporationResult)[0]);
552       intermediateNucleus = (*evaporationResul << 536       *intermediateNucleus = *(*evaporationResult)[1];
                                                   >> 537       delete evaporationResult->back();
553       delete evaporationResult;                   538       delete evaporationResult;
                                                   >> 539       evapType.erase(iters[i]);
554     }                                             540     }
555     else                                          541     else
556     {                                             542     {
557 //                                                543 //
558 //                                                544 //
559 // Probability for further evaporation is nil     545 // Probability for further evaporation is nil so have to escape from this
560 // routine and set the energies of the seconda    546 // routine and set the energies of the secondaries to 10eV.
561 //                                                547 //
562       evaporate = false;                          548       evaporate = false;
563     }                                             549     }
564   }                                               550   }
565                                                   551   
566   return;                                         552   return;
567 }                                                 553 }
568 //////////////////////////////////////////////    554 ////////////////////////////////////////////////////////////////////////////////
569 //                                                555 //
570 void G4WilsonAblationModel::SelectSecondariesB    556 void G4WilsonAblationModel::SelectSecondariesByDefault (G4ThreeVector boost)
571 {                                                 557 {
572   for (std::size_t i=0; i<evapType.size(); ++i << 558   for (unsigned i=0; i<evapType.size(); i++)
573   {                                               559   {
574     G4ParticleDefinition *type = evapType[i];     560     G4ParticleDefinition *type = evapType[i];
575     G4double mass              = type->GetPDGM    561     G4double mass              = type->GetPDGMass();
576     G4double e                 = mass + 10.0*e    562     G4double e                 = mass + 10.0*eV;
577     G4double p                 = std::sqrt(e*e    563     G4double p                 = std::sqrt(e*e-mass*mass);
578     G4double costheta          = 2.0*G4Uniform    564     G4double costheta          = 2.0*G4UniformRand() - 1.0;
579     G4double sintheta          = std::sqrt((1.    565     G4double sintheta          = std::sqrt((1.0 - costheta)*(1.0 + costheta));
580     G4double phi               = twopi * G4Uni    566     G4double phi               = twopi * G4UniformRand() * rad;
581     G4ThreeVector direction(sintheta*std::cos(    567     G4ThreeVector direction(sintheta*std::cos(phi),sintheta*std::sin(phi),costheta);
582     G4LorentzVector lorentzVector = G4LorentzV    568     G4LorentzVector lorentzVector = G4LorentzVector(direction*p, e);
583     lorentzVector.boost(-boost);                  569     lorentzVector.boost(-boost);
584 // Possibility that the following line is not     570 // Possibility that the following line is not correctly carrying over A and Z
585 // from particle definition.  Force values.  P    571 // from particle definition.  Force values.  PRT 03/12/2009.
586 //    G4Fragment *fragment          =             572 //    G4Fragment *fragment          = 
587 //      new G4Fragment(lorentzVector, type);      573 //      new G4Fragment(lorentzVector, type);
588     G4int A = type->GetBaryonNumber();            574     G4int A = type->GetBaryonNumber();
589     G4int Z = (G4int) (type->GetPDGCharge() +     575     G4int Z = (G4int) (type->GetPDGCharge() + 1.0E-10);
590     G4Fragment *fragment          =               576     G4Fragment *fragment          = 
591       new G4Fragment(A, Z, lorentzVector);        577       new G4Fragment(A, Z, lorentzVector);
592     if (fragment != nullptr) { fragment->SetCr << 578 
593     fragmentVector->push_back(fragment);          579     fragmentVector->push_back(fragment);
594   }                                               580   }
595 }                                                 581 }
596 //////////////////////////////////////////////    582 ////////////////////////////////////////////////////////////////////////////////
597 //                                                583 //
598 void G4WilsonAblationModel::PrintWelcomeMessag    584 void G4WilsonAblationModel::PrintWelcomeMessage ()
599 {                                                 585 {
600   G4cout <<G4endl;                                586   G4cout <<G4endl;
601   G4cout <<" *********************************    587   G4cout <<" *****************************************************************"
602          <<G4endl;                                588          <<G4endl;
603   G4cout <<" Nuclear ablation model for nuclea    589   G4cout <<" Nuclear ablation model for nuclear-nuclear interactions activated"
604          <<G4endl;                                590          <<G4endl;
605   G4cout <<" (Written by QinetiQ Ltd for the E    591   G4cout <<" (Written by QinetiQ Ltd for the European Space Agency)"
606          <<G4endl;                             << 
607   G4cout <<" !!! WARNING: This model is not we << 
608          <<G4endl;                                592          <<G4endl;
609   G4cout <<" *********************************    593   G4cout <<" *****************************************************************"
610          <<G4endl;                                594          <<G4endl;
611   G4cout << G4endl;                               595   G4cout << G4endl;
612                                                   596 
613   return;                                         597   return;
614 }                                                 598 }
615 //////////////////////////////////////////////    599 ////////////////////////////////////////////////////////////////////////////////
616 //                                                600 //
617                                                   601