Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/de_excitation/handler/src/G4ExcitationHandler.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/handler/src/G4ExcitationHandler.cc (Version 11.3.0) and /processes/hadronic/models/de_excitation/handler/src/G4ExcitationHandler.cc (Version 6.2)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                    <<   3 // * DISCLAIMER                                                       *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th <<   5 // * The following disclaimer summarizes all the specific disclaimers *
  6 // * the Geant4 Collaboration.  It is provided <<   6 // * of contributors to this software. The specific disclaimers,which *
  7 // * conditions of the Geant4 Software License <<   7 // * govern, are listed with their locations in:                      *
  8 // * LICENSE and available at  http://cern.ch/ <<   8 // *   http://cern.ch/geant4/license                                  *
  9 // * include a list of copyright holders.      << 
 10 // *                                                9 // *                                                                  *
 11 // * Neither the authors of this software syst     10 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     11 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     12 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     13 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  <<  14 // * use.                                                             *
 16 // * for the full disclaimer and the limitatio << 
 17 // *                                               15 // *                                                                  *
 18 // * This  code  implementation is the result  <<  16 // * This  code  implementation is the  intellectual property  of the *
 19 // * technical work of the GEANT4 collaboratio <<  17 // * GEANT4 collaboration.                                            *
 20 // * By using,  copying,  modifying or  distri <<  18 // * By copying,  distributing  or modifying the Program (or any work *
 21 // * any work based  on the software)  you  ag <<  19 // * based  on  the Program)  you indicate  your  acceptance of  this *
 22 // * use  in  resulting  scientific  publicati <<  20 // * statement, and all its terms.                                    *
 23 // * acceptance of all terms of the Geant4 Sof << 
 24 // *******************************************     21 // ********************************************************************
 25 //                                                 22 //
                                                   >>  23 //
 26 // Hadronic Process: Nuclear De-excitations        24 // Hadronic Process: Nuclear De-excitations
 27 // by V. Lara (May 1998)                           25 // by V. Lara (May 1998)
 28 //                                             <<  26 // Modif (30 June 1998) by V. Lara:
 29 //                                             << 
 30 // Modified:                                   << 
 31 // 30 June 1998 by V. Lara:                    << 
 32 //      -Modified the Transform method for use     27 //      -Modified the Transform method for use G4ParticleTable and 
 33 //       therefore G4IonTable. It makes possib     28 //       therefore G4IonTable. It makes possible to convert all kind 
 34 //       of fragments (G4Fragment) produced in     29 //       of fragments (G4Fragment) produced in deexcitation to 
 35 //       G4DynamicParticle                         30 //       G4DynamicParticle
 36 //      -It uses default algorithms for:           31 //      -It uses default algorithms for:
 37 //              Evaporation: G4Evaporation     <<  32 //              Evaporation: G4StatEvaporation
 38 //              MultiFragmentation: G4StatMF   <<  33 //              MultiFragmentation: G4DummyMF (a dummy one)
 39 //              Fermi Breakup model: G4FermiBr <<  34 //              Fermi Breakup model: G4StatFermiBreakUp
 40 // 24 Jul 2008 by M. A. Cortes Giraldo:        <<  35 
 41 //      -Max Z,A for Fermi Break-Up turns to 9 << 
 42 //      -BreakItUp() reorganised and bug in Ev << 
 43 //      -Transform() optimised                 << 
 44 // (September 2008) by J. M. Quesada. External << 
 45 //      -inverse cross section option (default << 
 46 //      -superimposed Coulomb barrier (if useS << 
 47 // September 2009 by J. M. Quesada:            << 
 48 //      -according to Igor Pshenichnov, SMM wi << 
 49 // 27 Nov 2009 by V.Ivanchenko:                << 
 50 //      -cleanup the logic, reduce number inte << 
 51 // 11 May 2010 by V.Ivanchenko:                << 
 52 //      -FermiBreakUp activated, used integer  << 
 53 //       final photon deexcitation; used check << 
 54 //       unstable fragments with A <5          << 
 55 // 22 March 2011 by V.Ivanchenko: general clea << 
 56 //       products of Fermi Break Up cannot be  << 
 57 // 30 March 2011 by V.Ivanchenko removed priva << 
 58 //       to the source                         << 
 59 // 23 January 2012 by V.Ivanchenko general cle << 
 60 //    objects, propagate G4PhotonEvaporation p << 
 61 //    not delete it here                       << 
 62                                                    36 
 63 #include "G4ExcitationHandler.hh"                  37 #include "G4ExcitationHandler.hh"
 64 #include "G4SystemOfUnits.hh"                  <<  38 #include <list>
 65 #include "G4LorentzVector.hh"                  << 
 66 #include "G4ThreeVector.hh"                    << 
 67 #include "G4ParticleTable.hh"                  << 
 68 #include "G4ParticleTypes.hh"                  << 
 69 #include "G4Ions.hh"                           << 
 70 #include "G4Electron.hh"                       << 
 71 #include "G4Lambda.hh"                         << 
 72                                                << 
 73 #include "G4VMultiFragmentation.hh"            << 
 74 #include "G4VFermiBreakUp.hh"                  << 
 75 #include "G4Element.hh"                        << 
 76 #include "G4ElementTable.hh"                   << 
 77                                                << 
 78 #include "G4VEvaporation.hh"                   << 
 79 #include "G4VEvaporationChannel.hh"            << 
 80 #include "G4Evaporation.hh"                    << 
 81 #include "G4PhotonEvaporation.hh"              << 
 82 #include "G4StatMF.hh"                         << 
 83 #include "G4FermiBreakUpVI.hh"                 << 
 84 #include "G4NuclearLevelData.hh"               << 
 85 #include "G4PhysicsModelCatalog.hh"            << 
 86                                                << 
 87 G4ExcitationHandler::G4ExcitationHandler()     << 
 88   : minEForMultiFrag(1.*CLHEP::TeV), minExcita << 
 89     maxExcitation(100.*CLHEP::MeV)             << 
 90 {                                              << 
 91   thePartTable = G4ParticleTable::GetParticleT << 
 92   theTableOfIons = thePartTable->GetIonTable() << 
 93   nist = G4NistManager::Instance();            << 
 94                                                << 
 95   theMultiFragmentation = new G4StatMF();      << 
 96   theFermiModel = new G4FermiBreakUpVI();      << 
 97   thePhotonEvaporation = new G4PhotonEvaporati << 
 98   SetEvaporation(new G4Evaporation(thePhotonEv << 
 99   theResults.reserve(60);                      << 
100   results.reserve(30);                         << 
101   theEvapList.reserve(30);                     << 
102                                                << 
103   theElectron = G4Electron::Electron();        << 
104   theNeutron = G4Neutron::NeutronDefinition(); << 
105   theProton = G4Proton::ProtonDefinition();    << 
106   theDeuteron = G4Deuteron::DeuteronDefinition << 
107   theTriton = G4Triton::TritonDefinition();    << 
108   theHe3 = G4He3::He3Definition();             << 
109   theAlpha = G4Alpha::AlphaDefinition();       << 
110   theLambda = G4Lambda::Lambda();              << 
111                                                    39 
112   fLambdaMass = theLambda->GetPDGMass();       <<  40 //#define debugphoton
113                                                    41 
114   if(fVerbose > 1) { G4cout << "### New handle << 
115 }                                              << 
116                                                    42 
117 G4ExcitationHandler::~G4ExcitationHandler()    <<  43 G4ExcitationHandler::G4ExcitationHandler():
118 {                                              <<  44   maxZForFermiBreakUp(1),maxAForFermiBreakUp(1),minEForMultiFrag(4.0*GeV),
119   delete theMultiFragmentation;                <<  45   MyOwnEvaporationClass(true), MyOwnMultiFragmentationClass(true),MyOwnFermiBreakUpClass(true),
120   delete theFermiModel;                        <<  46   MyOwnPhotonEvaporationClass(true)
121   if(isEvapLocal) { delete theEvaporation; }   <<  47 {                                                                          
                                                   >>  48   theTableOfParticles = G4ParticleTable::GetParticleTable();
                                                   >>  49   
                                                   >>  50   theEvaporation = new G4Evaporation;
                                                   >>  51   theMultiFragmentation = new G4StatMF;
                                                   >>  52   theFermiModel = new G4FermiBreakUp;
                                                   >>  53   thePhotonEvaporation = new G4PhotonEvaporation;
122 }                                                  54 }
123                                                    55 
124 void G4ExcitationHandler::SetParameters()      <<  56 G4ExcitationHandler::G4ExcitationHandler(const G4ExcitationHandler &)
125 {                                                  57 {
126   G4NuclearLevelData* ndata = G4NuclearLevelDa <<  58   throw G4HadronicException(__FILE__, __LINE__, "G4ExcitationHandler::copy_constructor: is meant to not be accessable! ");
127   auto param = ndata->GetParameters();         << 
128   isActive = true;                             << 
129   // check if de-excitation is needed          << 
130   if (fDummy == param->GetDeexChannelsType())  << 
131     isActive = false;                          << 
132   } else {                                     << 
133     // upload data for elements used in geomet << 
134     G4int Zmax = 20;                           << 
135     const G4ElementTable* table = G4Element::G << 
136     for (auto const & elm : *table) { Zmax = s << 
137     ndata->UploadNuclearLevelData(Zmax+1);     << 
138   }                                            << 
139   minEForMultiFrag = param->GetMinExPerNucleou << 
140   minExcitation = param->GetMinExcitation();   << 
141   maxExcitation = param->GetPrecoHighEnergy(); << 
142                                                << 
143   // allowing local debug printout             << 
144   fVerbose = std::max(fVerbose, param->GetVerb << 
145   if (isActive) {                              << 
146     if (nullptr == thePhotonEvaporation) {     << 
147       SetPhotonEvaporation(new G4PhotonEvapora << 
148     }                                          << 
149     if (nullptr == theFermiModel) {            << 
150       SetFermiModel(new G4FermiBreakUpVI());   << 
151     }                                          << 
152     if (nullptr == theMultiFragmentation) {    << 
153       SetMultiFragmentation(new G4StatMF());   << 
154     }                                          << 
155     if (nullptr == theEvaporation) {           << 
156       SetEvaporation(new G4Evaporation(thePhot << 
157     }                                          << 
158   }                                            << 
159   theFermiModel->SetVerbose(fVerbose);         << 
160   if(fVerbose > 1) {                           << 
161     G4cout << "G4ExcitationHandler::SetParamet << 
162   }                                            << 
163 }                                                  59 }
164                                                    60 
165 void G4ExcitationHandler::Initialise()         << 
166 {                                              << 
167   if(isInitialised) { return; }                << 
168   if(fVerbose > 1) {                           << 
169     G4cout << "G4ExcitationHandler::Initialise << 
170   }                                            << 
171   G4DeexPrecoParameters* param =               << 
172     G4NuclearLevelData::GetInstance()->GetPara << 
173   isInitialised = true;                        << 
174   SetParameters();                             << 
175   if(isActive) {                               << 
176     theFermiModel->Initialise();               << 
177     theEvaporation->InitialiseChannels();      << 
178   }                                            << 
179   // dump level is controlled by parameter cla << 
180   param->Dump();                               << 
181 }                                              << 
182                                                    61 
183 void G4ExcitationHandler::SetEvaporation(G4VEv <<  62 G4ExcitationHandler::~G4ExcitationHandler()
184 {                                                  63 {
185   if(nullptr != ptr && ptr != theEvaporation)  <<  64   if (MyOwnEvaporationClass) delete theEvaporation;
186     theEvaporation = ptr;                      <<  65   if (MyOwnMultiFragmentationClass) delete theMultiFragmentation;
187     theEvaporation->SetPhotonEvaporation(thePh <<  66   if (MyOwnFermiBreakUpClass) delete theFermiModel;
188     theEvaporation->SetFermiBreakUp(theFermiMo <<  67   if (MyOwnPhotonEvaporationClass) delete thePhotonEvaporation;
189     isEvapLocal = flag;                        << 
190     if(fVerbose > 1) {                         << 
191       G4cout << "G4ExcitationHandler::SetEvapo << 
192     }                                          << 
193   }                                            << 
194 }                                                  68 }
195                                                    69 
196 void                                           << 
197 G4ExcitationHandler::SetMultiFragmentation(G4V << 
198 {                                              << 
199   if(nullptr != ptr && ptr != theMultiFragment << 
200     delete theMultiFragmentation;              << 
201     theMultiFragmentation = ptr;               << 
202   }                                            << 
203 }                                              << 
204                                                    70 
205 void G4ExcitationHandler::SetFermiModel(G4VFer <<  71 const G4ExcitationHandler & G4ExcitationHandler::operator=(const G4ExcitationHandler &)
206 {                                                  72 {
207   if(nullptr != ptr && ptr != theFermiModel) { <<  73   throw G4HadronicException(__FILE__, __LINE__, "G4ExcitationHandler::operator=: is meant to not be accessable! ");
208     delete theFermiModel;                      << 
209     theFermiModel = ptr;                       << 
210     if(nullptr != theEvaporation) {            << 
211       theEvaporation->SetFermiBreakUp(theFermi << 
212     }                                          << 
213   }                                            << 
214 }                                              << 
215                                                    74 
216 void                                           <<  75   return *this;
217 G4ExcitationHandler::SetPhotonEvaporation(G4VE << 
218 {                                              << 
219   if(nullptr != ptr && ptr != thePhotonEvapora << 
220     delete thePhotonEvaporation;               << 
221     thePhotonEvaporation = ptr;                << 
222     if(nullptr != theEvaporation) {            << 
223       theEvaporation->SetPhotonEvaporation(ptr << 
224     }                                          << 
225     if(fVerbose > 1) {                         << 
226       G4cout << "G4ExcitationHandler::SetPhoto << 
227              << " for handler " << this << G4e << 
228     }                                          << 
229   }                                            << 
230 }                                              << 
231                                                << 
232 void G4ExcitationHandler::SetDeexChannelsType( << 
233 {                                              << 
234   G4Evaporation* evap = static_cast<G4Evaporat << 
235   if(fVerbose > 1) {                           << 
236     G4cout << "G4ExcitationHandler::SetDeexCha << 
237      << " for " << this << G4endl;             << 
238   }                                            << 
239   if(val == fDummy) {                          << 
240     isActive = false;                          << 
241     return;                                    << 
242   }                                            << 
243   if (nullptr == evap) { return; }             << 
244   if (val == fEvaporation) {                   << 
245     evap->SetDefaultChannel();                 << 
246   } else if (val == fCombined) {               << 
247     evap->SetCombinedChannel();                << 
248   } else if (val == fGEM) {                    << 
249     evap->SetGEMChannel();                     << 
250   } else if (val == fGEMVI) {                  << 
251     evap->SetGEMVIChannel();                   << 
252   }                                            << 
253   evap->InitialiseChannels();                  << 
254   if (fVerbose > 1) {                          << 
255     if (G4Threading::IsMasterThread()) {       << 
256       G4cout << "Number of de-excitation chann << 
257        << theEvaporation->GetNumberOfChannels( << 
258       G4cout << " " << this;                   << 
259     }                                          << 
260     G4cout << G4endl;                          << 
261   }                                            << 
262 }                                                  76 }
263                                                    77 
264 G4VEvaporation* G4ExcitationHandler::GetEvapor << 
265 {                                              << 
266   if (nullptr != theEvaporation) { SetParamete << 
267   return theEvaporation;                       << 
268 }                                              << 
269                                                    78 
270 G4VMultiFragmentation* G4ExcitationHandler::Ge <<  79 G4bool G4ExcitationHandler::operator==(const G4ExcitationHandler &) const
271 {                                                  80 {
272   if (nullptr != theMultiFragmentation) { SetP <<  81   throw G4HadronicException(__FILE__, __LINE__, "G4ExcitationHandler::operator==: is meant to not be accessable! ");
273   return theMultiFragmentation;                <<  82   return false;
274 }                                              <<  83 } 
275                                                    84 
276 G4VFermiBreakUp* G4ExcitationHandler::GetFermi <<  85 G4bool G4ExcitationHandler::operator!=(const G4ExcitationHandler &) const
277 {                                                  86 {
278   if (nullptr != theFermiModel) { SetParameter <<  87   throw G4HadronicException(__FILE__, __LINE__, "G4ExcitationHandler::operator!=: is meant to not be accessable! ");
279   return theFermiModel;                        <<  88   return true;
280 }                                                  89 }
281                                                    90 
282 G4VEvaporationChannel* G4ExcitationHandler::Ge << 
283 {                                              << 
284   if(nullptr != thePhotonEvaporation) { SetPar << 
285   return thePhotonEvaporation;                 << 
286 }                                              << 
287                                                    91 
288 G4ReactionProductVector *                      <<  92 G4ReactionProductVector * G4ExcitationHandler::BreakItUp(const G4Fragment &theInitialState) const
289 G4ExcitationHandler::BreakItUp(const G4Fragmen << 
290 {                                                  93 {
291   // Variables existing until end of method    << 
292   G4Fragment * theInitialStatePtr = new G4Frag << 
293   if (fVerbose > 1) {                          << 
294     G4cout << "@@@@@@@@@@ Start G4Excitation H << 
295     G4cout << theInitialState << G4endl;       << 
296   }                                            << 
297   if (!isInitialised) { Initialise(); }        << 
298                                                << 
299   // pointer to fragment vector which receives << 
300   G4FragmentVector * theTempResult = nullptr;  << 
301                                                    94 
302   theResults.clear();                          <<  95   G4FragmentVector * theResult = 0; 
303   theEvapList.clear();                         << 
304                                                << 
305   // Variables to describe the excited configu << 
306   G4double exEnergy = theInitialState.GetExcit     96   G4double exEnergy = theInitialState.GetExcitationEnergy();
307   G4int A = theInitialState.GetA_asInt();      <<  97   G4double A = theInitialState.GetA();
308   G4int Z = theInitialState.GetZ_asInt();      <<  98   G4int Z = static_cast<G4int>(theInitialState.GetZ());
309   G4int nL = theInitialState.GetNumberOfLambda <<  99   G4FragmentVector* theTempResult = 0; 
310                                                << 100   G4Fragment theExcitedNucleus;
311   // too much excitation                       << 101 
312   if (exEnergy > A*maxExcitation && A > 0) {   << 102   // Test applicability
313     ++fWarnings;                               << 103   if (A > 4) 
314     if(fWarnings < 0) {                        << 104     {
315       G4ExceptionDescription ed;               << 105       // Initial State De-Excitation 
316       ed << "High excitation Fragment Z= " <<  << 106       if(A<GetMaxA()&&Z<GetMaxZ()) 
317    << " Eex/A(MeV)= " << exEnergy/A;           << 107         //     && exEnergy>G4NucleiPropertiesTable::GetBindingEnergy(Z,A)) {
318       G4Exception("G4ExcitationHandler::BreakI << 108         {
319     }                                          << 109           theResult = theFermiModel->BreakItUp(theInitialState);
320   }                                            << 110         }
321                                                << 111       else   if (exEnergy>GetMinE()*A) 
322   // for hyper-nuclei subtract lambdas from th << 112         {
323   G4double lambdaF = 0.0;                      << 113           theResult = theMultiFragmentation->BreakItUp(theInitialState);
324   G4LorentzVector lambdaLV = theInitialStatePt << 114         }
325   if (0 < nL) {                                << 115       else 
326                                                << 116         {
327     // is it a stable hyper-nuclei?            << 117           theResult = theEvaporation->BreakItUp(theInitialState);
328     if(A >= 3 && A <= 5 && nL <= 2) {          << 118         }
329       G4int pdg = 0;                           << 119     
330       if(3 == A && 1 == nL) {                  << 120 
331         pdg = 1010010030;                      << 121 
332       } else if(5 == A && 2 == Z && 1 == nL) { << 122 
333         pdg = 1010020050;                      << 123       // De-Excitation loop
334       } else if(4 == A) {                      << 124       // ------------------
335   if(1 == Z && 1 == nL) {                      << 125       // Check if there are excited fragments
336     pdg = 1010010040;                          << 126       std::list<G4Fragment*> theResultList;
337   } else if(2 == Z && 1 == nL) {               << 127       G4FragmentVector::iterator j;
338     pdg = 1010020040;                          << 128       std::list<G4Fragment*>::iterator i;
339   } else if(0 == Z && 2 == nL) {               << 129       for (j = theResult->begin(); j != theResult->end();j++) 
340     pdg = 1020000040;                          << 130         {
341   } else if(1 == Z && 2 == nL) {               << 131           theResultList.push_back(*j);
342     pdg = 1020010040;                          << 132         }
343   }                                            << 133       theResult->clear();
344       }                                        << 134       for (i = theResultList.begin(); i != theResultList.end(); i++) 
345       // initial state is one of hyper-nuclei  << 135         {
346       if (0 < pdg) {                           << 136           exEnergy = (*i)->GetExcitationEnergy();
347   const G4ParticleDefinition* part = thePartTa << 137           if (exEnergy > 0.0) 
348         if(nullptr != part) {                  << 138             {
349     G4ReactionProduct* theNew = new G4Reaction << 139               A = (*i)->GetA();
350     G4ThreeVector dir = G4ThreeVector( 0.0, 0. << 140               Z = static_cast<G4int>((*i)->GetZ());
351           if ( lambdaLV.vect().mag() > CLHEP:: << 141               theExcitedNucleus = *(*i);
352       dir = lambdaLV.vect().unit();            << 142               // try to de-excite this fragment
353           }                                    << 143               if( A < GetMaxA() && Z < GetMaxZ() )
354     G4double mass = part->GetPDGMass();        << 144                 // && exEnergy>G4NucleiPropertiesTable::GetBindingEnergy(Z,A)) 
355     G4double etot = std::max(lambdaLV.e(), mas << 145                 {
356           dir *= std::sqrt((etot - mass)*(etot << 146                   // Fermi Breakup
357     theNew->SetMomentum(dir);                  << 147                   theTempResult = theFermiModel->BreakItUp(theExcitedNucleus);
358     theNew->SetTotalEnergy(etot);              << 148                   if (theTempResult->size() == 1)
359     theNew->SetFormationTime(theInitialState.G << 149                     {
360     theNew->SetCreatorModelID(theInitialState. << 150                       std::for_each(theTempResult->begin(),theTempResult->end(),DeleteFragment());
361     G4ReactionProductVector* v = new G4Reactio << 151                       delete theTempResult;
362           v->push_back(theNew);                << 152                     }
363     return v;                                  << 153                   theTempResult = theEvaporation->BreakItUp(theExcitedNucleus);
364   }                                            << 154                 } 
365       }                                        << 155               else 
                                                   >> 156                 {
                                                   >> 157                   // Evaporation
                                                   >> 158                   theTempResult = theEvaporation->BreakItUp(theExcitedNucleus);
                                                   >> 159                 }
                                                   >> 160               // The Nucleus has been fragmented?
                                                   >> 161               if (theTempResult->size() > 1) 
                                                   >> 162                 // If so :
                                                   >> 163                 {
                                                   >> 164                   // Remove excited fragment from the result 
                                                   >> 165                   //  delete theResult->removeAt(i--);
                                                   >> 166                   delete (*i);
                                                   >> 167                   i = theResultList.erase(i);
                                                   >> 168                   // and add theTempResult elements to theResult
                                                   >> 169                   for (G4FragmentVector::reverse_iterator ri = theTempResult->rbegin();
                                                   >> 170                        ri != theTempResult->rend(); ++ri)
                                                   >> 171                     {
                                                   >> 172                       theResultList.push_back(*ri);
                                                   >> 173                     }
                                                   >> 174                   delete theTempResult;
                                                   >> 175                 } 
                                                   >> 176               else 
                                                   >> 177                 // If not :
                                                   >> 178                 {
                                                   >> 179                   // it doesn't matter, we Follow with the next fragment but
                                                   >> 180                   // I have to clean up
                                                   >> 181                   std::for_each(theTempResult->begin(),theTempResult->end(),DeleteFragment());
                                                   >> 182                   delete theTempResult;
                                                   >> 183                 }
                                                   >> 184             }
                                                   >> 185         }
                                                   >> 186       for (i = theResultList.begin(); i != theResultList.end(); i++)
                                                   >> 187         {
                                                   >> 188           theResult->push_back(*i);
                                                   >> 189         }
                                                   >> 190       theResultList.clear();
                                                   >> 191     }
                                                   >> 192   else   // if A > 4
                                                   >> 193     {
                                                   >> 194       theResult = new G4FragmentVector();
                                                   >> 195       theResult->push_back(new G4Fragment(theInitialState));
366     }                                             196     }
367     G4double mass = theInitialStatePtr->GetGro << 
368     lambdaF = nL*(fLambdaMass - CLHEP::neutron << 
369                                                << 
370     // de-excitation with neutrons instead of  << 
371     theInitialStatePtr->SetZAandMomentum(lambd << 
372                                                << 
373     // 4-momentum not used in de-excitation    << 
374     lambdaLV *= lambdaF;                       << 
375   } else if (0 > nL) {                         << 
376     ++fWarnings;                               << 
377     if(fWarnings < 0) {                        << 
378       G4ExceptionDescription ed;               << 
379       ed << "Fragment with negative L: Z=" <<  << 
380    << " Eex/A(MeV)= " << exEnergy/A;           << 
381       G4Exception("G4ExcitationHandler::BreakI << 
382     }                                          << 
383   }                                            << 
384                                                << 
385   // In case A <= 1 the fragment will not perf << 
386   if (A <= 1 || !isActive) {                   << 
387     theResults.push_back( theInitialStatePtr ) << 
388                                                << 
389     // check if a fragment is stable           << 
390   } else if (exEnergy < minExcitation && nist- << 
391     theResults.push_back( theInitialStatePtr ) << 
392                                                << 
393     // JMQ 150909: first step in de-excitation << 
394     // Fragments after the first step are stor << 
395   } else {                                     << 
396     if ((A<maxAForFermiBreakUp && Z<maxZForFer << 
397   || exEnergy <= minEForMultiFrag*A) {         << 
398       theEvapList.push_back(theInitialStatePtr << 
399                                                   197 
400     // Statistical Multifragmentation will tak << 198   // Now we try to deexcite by means of PhotonEvaporation those fragments
401     } else {                                   << 199   // which are excited.
402       theTempResult = theMultiFragmentation->B << 200   
403       if (nullptr == theTempResult) {          << 201   theTempResult = 0;
404   theEvapList.push_back(theInitialStatePtr);   << 202   std::list<G4Fragment*> theResultList;
405       } else {                                 << 203   std::list<G4Fragment*>::iterator j;
406   std::size_t nsec = theTempResult->size();    << 204   G4FragmentVector::iterator i;
407                                                << 205   for (i = theResult->begin(); i != theResult->end();i++) 
408   // no fragmentation                          << 206     {
409   if (0 == nsec) {                             << 207       theResultList.push_back(*i);
410     theEvapList.push_back(theInitialStatePtr); << 
411                                                << 
412     // secondary are produced - sort out secon << 
413   } else {                                     << 
414     G4bool deletePrimary = true;               << 
415     for (auto const & ptr : *theTempResult) {  << 
416       if (ptr == theInitialStatePtr) { deleteP << 
417       SortSecondaryFragment(ptr);              << 
418     }                                          << 
419     if (deletePrimary) { delete theInitialStat << 
420   }                                            << 
421   delete theTempResult; // end multifragmentat << 
422       }                                        << 
423     }                                          << 
424   }                                            << 
425   if (fVerbose > 2) {                          << 
426     G4cout << "## After first step of handler  << 
427            << " for evap;  "                   << 
428      << theResults.size() << " results. " << G << 
429   }                                            << 
430   // -----------------------------------       << 
431   // FermiBreakUp and De-excitation loop       << 
432   // -----------------------------------       << 
433                                                << 
434   static const G4int countmax = 1000;          << 
435   std::size_t kk;                              << 
436   for (kk=0; kk<theEvapList.size(); ++kk) {    << 
437     G4Fragment* frag = theEvapList[kk];        << 
438     if (fVerbose > 3) {                        << 
439       G4cout << "Next evaporate: " << G4endl;  << 
440       G4cout << *frag << G4endl;               << 
441     }                                          << 
442     if (kk >= countmax) {                      << 
443       G4ExceptionDescription ed;               << 
444       ed << "Infinite loop in the de-excitatio << 
445    << " iterations \n"                         << 
446    << "      Initial fragment: \n" << theIniti << 
447    << "\n      Current fragment: \n" << *frag; << 
448       G4Exception("G4ExcitationHandler::BreakI << 
449       ed,"Stop execution");                    << 
450                                                << 
451     }                                          << 
452     A = frag->GetA_asInt();                    << 
453     Z = frag->GetZ_asInt();                    << 
454     results.clear();                           << 
455     if (fVerbose > 2) {                        << 
456       G4cout << "G4ExcitationHandler# " << kk  << 
457              << " Eex(MeV)= " << frag->GetExci << 
458     }                                          << 
459     // Fermi Break-Up                          << 
460     if (theFermiModel->IsApplicable(Z, A, frag << 
461       theFermiModel->BreakFragment(&results, f << 
462       std::size_t nsec = results.size();       << 
463       if (fVerbose > 2) { G4cout << "FermiBrea << 
464                                                << 
465       // FBU takes care to delete input fragme << 
466       // The secondary may be excited - photo- << 
467       if (1 < nsec) {                          << 
468   for (auto const & res : results) {           << 
469     SortSecondaryFragment(res);                << 
470   }                                            << 
471   continue;                                    << 
472       }                                        << 
473       // evaporation will be applied           << 
474     }                                          << 
475     // apply Evaporation, residual nucleus is  << 
476     // photon evaporation is possible          << 
477     theEvaporation->BreakFragment(&results, fr << 
478     if (fVerbose > 3) {                        << 
479       G4cout << "Evaporation Nsec= " << result << 
480     }                                          << 
481     if (0 == results.size()) {                 << 
482       theResults.push_back(frag);              << 
483     } else {                                   << 
484       SortSecondaryFragment(frag);             << 
485     }                                          << 
486                                                << 
487     // Sort out secondary fragments            << 
488     for (auto const & res : results) {         << 
489       if(fVerbose > 4) {                       << 
490   G4cout << "Evaporated product #" << *res <<  << 
491       }                                        << 
492       SortSecondaryFragment(res);              << 
493     } // end of loop on secondary              << 
494   } // end of the loop over theEvapList        << 
495   if (fVerbose > 2) {                          << 
496     G4cout << "## After 2nd step of handler "  << 
497            << " was evap;  "                   << 
498      << theResults.size() << " results. " << G << 
499   }                                            << 
500   G4ReactionProductVector * theReactionProduct << 
501     new G4ReactionProductVector();             << 
502                                                << 
503   // MAC (24/07/08)                            << 
504   // To optimise the storing speed, we reserve << 
505   // in memory for the vector                  << 
506   theReactionProductVector->reserve( theResult << 
507                                                << 
508   if (fVerbose > 1) {                          << 
509     G4cout << "### ExcitationHandler provides  << 
510      << " evaporated products:" << G4endl;     << 
511   }                                            << 
512   G4LorentzVector partOfLambdaLV;              << 
513   if ( nL > 0 ) partOfLambdaLV = lambdaLV/(G4d << 
514   for (auto const & frag : theResults) {       << 
515     G4LorentzVector lv0 = frag->GetMomentum(); << 
516     G4double etot = lv0.e();                   << 
517                                                << 
518     // in the case of dummy de-excitation, exc << 
519     // into kinetic energy of output ion       << 
520     if (!isActive) {                           << 
521       G4double mass = frag->GetGroundStateMass << 
522       G4double ptot = lv0.vect().mag();        << 
523       G4double fac  = (etot <= mass || 0.0 ==  << 
524   : std::sqrt((etot - mass)*(etot + mass))/pto << 
525       G4LorentzVector lv((frag->GetMomentum()) << 
526        (frag->GetMomentum()).py()*fac,         << 
527        (frag->GetMomentum()).pz()*fac, etot);  << 
528       frag->SetMomentum(lv);                   << 
529     }                                             208     }
530     if (fVerbose > 3) {                        << 209   theResult->clear();
531       G4cout << *frag;                         << 210   
532       if (frag->NuclearPolarization()) {       << 211   for (j = theResultList.begin(); j != theResultList.end(); j++) 
533   G4cout << "  " << frag->NuclearPolarization( << 212     {
534       }                                        << 213       if ((*j)->GetA() > 1 && (*j)->GetExcitationEnergy() > 0.1*eV) 
535       G4cout << G4endl;                        << 214         {
                                                   >> 215           theExcitedNucleus = *(*j);
                                                   >> 216           theTempResult = thePhotonEvaporation->BreakItUp(theExcitedNucleus);
                                                   >> 217           // If Gamma Evaporation has succeed then
                                                   >> 218           if (theTempResult->size() > 1) 
                                                   >> 219             {
                                                   >> 220               // Remove excited fragment from the result 
                                                   >> 221               delete (*j);
                                                   >> 222               theResultList.erase(j--);
                                                   >> 223               // and add theTempResult elements to theResult
                                                   >> 224               for (G4FragmentVector::reverse_iterator ri = theTempResult->rbegin();
                                                   >> 225                    ri != theTempResult->rend(); ++ri)
                                                   >> 226                 {
                                                   >> 227 #ifdef PRECOMPOUND_TEST
                                                   >> 228                   if ((*ri)->GetA() == 0)
                                                   >> 229                     (*ri)->SetCreatorModel(G4String("G4PhotonEvaporation"));
                                                   >> 230                   else
                                                   >> 231                     (*ri)->SetCreatorModel(G4String("ResidualNucleus"));
                                                   >> 232 #endif
                                                   >> 233                   theResultList.push_back(*ri);
                                                   >> 234                 }
                                                   >> 235               delete theTempResult;
                                                   >> 236             }
                                                   >> 237           // In other case, just clean theTempResult and continue
                                                   >> 238           else 
                                                   >> 239             {
                                                   >> 240               std::for_each(theTempResult->begin(), theTempResult->end(), DeleteFragment());
                                                   >> 241               delete theTempResult;
                                                   >> 242 #ifdef debugphoton
                                                   >> 243               G4cout << "G4ExcitationHandler: Gamma Evaporation could not deexcite the nucleus: \n"
                                                   >> 244                      << "-----------------------------------------------------------------------\n"
                                                   >> 245                      << theExcitedNucleus << '\n'
                                                   >> 246                      << "-----------------------------------------------------------------------\n";
                                                   >> 247 #endif
                                                   >> 248               G4double GammaEnergy = (*j)->GetExcitationEnergy();
                                                   >> 249               G4double cosTheta = 1. - 2. * G4UniformRand();
                                                   >> 250               G4double sinTheta = sqrt(1. - cosTheta * cosTheta);
                                                   >> 251               G4double phi = twopi * G4UniformRand();
                                                   >> 252               G4ThreeVector GammaP(GammaEnergy * sinTheta * cos(phi),
                                                   >> 253                                    GammaEnergy * sinTheta * sin(phi),
                                                   >> 254                                    GammaEnergy * cosTheta );
                                                   >> 255               G4LorentzVector Gamma4P(GammaP,GammaEnergy);
                                                   >> 256               G4Fragment * theHandlerPhoton = new G4Fragment(Gamma4P,G4Gamma::GammaDefinition());
                                                   >> 257               
                                                   >> 258               
                                                   >> 259               
                                                   >> 260               G4double Mass = (*j)->GetGroundStateMass();
                                                   >> 261               G4ThreeVector ResidualP((*j)->GetMomentum().vect() - GammaP);
                                                   >> 262               G4double ResidualE = sqrt(ResidualP*ResidualP + Mass*Mass);
                                                   >> 263               G4LorentzVector Residual4P(ResidualP,ResidualE);
                                                   >> 264               (*j)->SetMomentum(Residual4P);
                                                   >> 265               
                                                   >> 266               
                                                   >> 267   
                                                   >> 268 #ifdef PRECOMPOUND_TEST
                                                   >> 269               theHandlerPhoton->SetCreatorModel("G4ExcitationHandler");
                                                   >> 270 #endif
                                                   >> 271               theResultList.push_back( theHandlerPhoton );
                                                   >> 272 #ifdef debugphoton
                                                   >> 273               G4cout << "Emmited photon:\n"
                                                   >> 274                      << theResultList.back() << '\n'
                                                   >> 275                      << "Residual nucleus after photon emission:\n"
                                                   >> 276                      << *(*j) << '\n'
                                                   >> 277                      << "-----------------------------------------------------------------------\n";
                                                   >> 278 #endif
                                                   >> 279             } 
                                                   >> 280         } 
                                                   >> 281     }
                                                   >> 282   for (j = theResultList.begin(); j != theResultList.end(); j++)
                                                   >> 283     {
                                                   >> 284       theResult->push_back(*j);
536     }                                             285     }
                                                   >> 286   theResultList.clear();
                                                   >> 287   
                                                   >> 288   
                                                   >> 289 #ifdef debug
                                                   >> 290   CheckConservation(theInitialState,theResult);
                                                   >> 291 #endif
                                                   >> 292   // Change G4FragmentVector by G4DynamicParticle
                                                   >> 293   return Transform(theResult);
                                                   >> 294 }
537                                                   295 
538     G4int fragmentA = frag->GetA_asInt();      << 296 G4ReactionProductVector * 
539     G4int fragmentZ = frag->GetZ_asInt();      << 297 G4ExcitationHandler::Transform(G4FragmentVector * theFragmentVector) const
540     G4double eexc = 0.0;                       << 298 {
541     const G4ParticleDefinition* theKindOfFragm << 299   if (theFragmentVector == 0) return 0;
542     G4bool isHyperN = false;                   << 300   
543     if (fragmentA == 0) {       // photon or e << 301   // Conversion from G4FragmentVector to G4ReactionProductVector
544       theKindOfFragment = frag->GetParticleDef << 302   G4ParticleDefinition *theGamma = G4Gamma::GammaDefinition();
545     } else if (fragmentA == 1 && fragmentZ ==  << 303   G4ParticleDefinition *theNeutron = G4Neutron::NeutronDefinition();
                                                   >> 304   G4ParticleDefinition *theProton = G4Proton::ProtonDefinition();   
                                                   >> 305   G4ParticleDefinition *theDeuteron = G4Deuteron::DeuteronDefinition();
                                                   >> 306   G4ParticleDefinition *theTriton = G4Triton::TritonDefinition();
                                                   >> 307   G4ParticleDefinition *theHelium3 = G4He3::He3Definition();
                                                   >> 308   G4ParticleDefinition *theAlpha = G4Alpha::AlphaDefinition();
                                                   >> 309   G4ParticleDefinition *theKindOfFragment = 0;
                                                   >> 310   theNeutron->SetVerboseLevel(2);
                                                   >> 311   G4ReactionProductVector * theReactionProductVector = new G4ReactionProductVector;
                                                   >> 312   G4int theFragmentA, theFragmentZ;
                                                   >> 313   G4LorentzVector theFragmentMomentum;
                                                   >> 314 
                                                   >> 315   G4FragmentVector::iterator i;
                                                   >> 316   for (i = theFragmentVector->begin(); i != theFragmentVector->end(); i++) {
                                                   >> 317     //    std::cout << (*i) <<'\n';
                                                   >> 318     theFragmentA = static_cast<G4int>((*i)->GetA());
                                                   >> 319     theFragmentZ = static_cast<G4int>((*i)->GetZ());
                                                   >> 320     theFragmentMomentum = (*i)->GetMomentum();
                                                   >> 321     theKindOfFragment = 0;
                                                   >> 322     if (theFragmentA == 0 && theFragmentZ == 0) {       // photon
                                                   >> 323       theKindOfFragment = theGamma;      
                                                   >> 324     } else if (theFragmentA == 1 && theFragmentZ == 0) { // neutron
546       theKindOfFragment = theNeutron;             325       theKindOfFragment = theNeutron;
547     } else if (fragmentA == 1 && fragmentZ ==  << 326     } else if (theFragmentA == 1 && theFragmentZ == 1) { // proton
548       theKindOfFragment = theProton;              327       theKindOfFragment = theProton;
549     } else if (fragmentA == 2 && fragmentZ ==  << 328     } else if (theFragmentA == 2 && theFragmentZ == 1) { // deuteron
550       theKindOfFragment = theDeuteron;            329       theKindOfFragment = theDeuteron;
551     } else if (fragmentA == 3 && fragmentZ ==  << 330     } else if (theFragmentA == 3 && theFragmentZ == 1) { // triton
552       theKindOfFragment = theTriton;              331       theKindOfFragment = theTriton;
553       if(0 < nL) {                             << 332     } else if (theFragmentA == 3 && theFragmentZ == 2) { // helium3
554         const G4ParticleDefinition* p = thePar << 333       theKindOfFragment = theHelium3;
555         if(nullptr != p) {                     << 334     } else if (theFragmentA == 4 && theFragmentZ == 2) { // alpha
556     theKindOfFragment = p;                     << 
557     isHyperN = true;                           << 
558     --nL;                                      << 
559   }                                            << 
560       }                                        << 
561     } else if (fragmentA == 3 && fragmentZ ==  << 
562       theKindOfFragment = theHe3;              << 
563     } else if (fragmentA == 4 && fragmentZ ==  << 
564       theKindOfFragment = theAlpha;               335       theKindOfFragment = theAlpha;
565       if (0 < nL) {                            << 
566         const G4ParticleDefinition* p = thePar << 
567         if(nullptr != p) {                     << 
568     theKindOfFragment = p;                     << 
569     isHyperN = true;                           << 
570     --nL;                                      << 
571   }                                            << 
572       }                                        << 
573     } else {                                      336     } else {
574                                                << 337       theKindOfFragment = theTableOfParticles->FindIon(theFragmentZ,theFragmentA,0,theFragmentZ);
575       // fragment                              << 
576       eexc = frag->GetExcitationEnergy();      << 
577       G4int idxf = frag->GetFloatingLevelNumbe << 
578       if (eexc < minExcitation) {              << 
579   eexc = 0.0;                                  << 
580         idxf = 0;                              << 
581       }                                        << 
582                                                << 
583       theKindOfFragment = theTableOfIons->GetI << 
584                                                << 
585       if (fVerbose > 3) {                      << 
586   G4cout << "### EXCH: Find ion Z= " << fragme << 
587                << " A= " << fragmentA          << 
588          << " Eexc(MeV)= " << eexc/MeV << " id << 
589          << " " << theKindOfFragment->GetParti << 
590          << G4endl;                            << 
591       }                                        << 
592     }                                             338     }
593     // fragment identified                     << 339     if (theKindOfFragment != 0) 
594     if (nullptr != theKindOfFragment) {        << 340       {
595       G4ReactionProduct * theNew = new G4React << 
596       if (isHyperN) {                          << 
597         G4LorentzVector lv = lv0 + partOfLambd << 
598   G4ThreeVector dir = lv.vect().unit();        << 
599         G4double mass = theKindOfFragment->Get << 
600         etot = std::max(lv.e(), mass);         << 
601         G4double ptot = std::sqrt((etot - mass << 
602         dir *= ptot;                           << 
603   theNew->SetMomentum(dir);                    << 
604   // remaining not compensated 4-momentum      << 
605         lambdaLV += (lv0 - G4LorentzVector(dir << 
606       } else {                                 << 
607   theNew->SetMomentum(lv0.vect());             << 
608       }                                        << 
609       theNew->SetTotalEnergy(etot);            << 
610       theNew->SetFormationTime(frag->GetCreati << 
611       theNew->SetCreatorModelID(frag->GetCreat << 
612       theReactionProductVector->push_back(theN << 
613                                                << 
614       // fragment not found out ground state i << 
615     } else {                                   << 
616       theKindOfFragment =                      << 
617   theTableOfIons->GetIon(fragmentZ,fragmentA,0 << 
618       if (theKindOfFragment) {                 << 
619   G4ThreeVector mom(0.0,0.0,0.0);              << 
620   G4double ionmass = theKindOfFragment->GetPDG << 
621   if (etot <= ionmass) {                       << 
622     etot = ionmass;                            << 
623   } else {                                     << 
624     G4double ptot = std::sqrt((etot - ionmass) << 
625     mom = (frag->GetMomentum().vect().unit())* << 
626   }                                            << 
627   G4ReactionProduct * theNew = new G4ReactionP    341   G4ReactionProduct * theNew = new G4ReactionProduct(theKindOfFragment);
628   theNew->SetMomentum(mom);                    << 342   theNew->SetMomentum(theFragmentMomentum.vect());
629   theNew->SetTotalEnergy(etot);                << 343   theNew->SetTotalEnergy(theFragmentMomentum.e());
630   theNew->SetFormationTime(frag->GetCreationTi << 344   theNew->SetFormationTime((*i)->GetCreationTime());
631   theNew->SetCreatorModelID(frag->GetCreatorMo << 345 #ifdef PRECOMPOUND_TEST
                                                   >> 346   theNew->SetCreatorModel((*i)->GetCreatorModel());
                                                   >> 347 #endif
632   theReactionProductVector->push_back(theNew);    348   theReactionProductVector->push_back(theNew);
633   if (fVerbose > 3) {                          << 
634     G4cout << "          ground state, energy  << 
635                  << etot << G4endl;            << 
636   }                                            << 
637       }                                           349       }
638     }                                          << 
639     delete frag;                               << 
640   }                                               350   }
641   // remaining lambdas are free; conserve quan << 351   if (theFragmentVector != 0)
642   // not 4-momentum                            << 352     { 
643   if (0 < nL) {                                << 353       std::for_each(theFragmentVector->begin(), theFragmentVector->end(), DeleteFragment());
644     G4ThreeVector dir = G4ThreeVector(0.0, 0.0 << 354       delete theFragmentVector;
645     if (lambdaLV.vect().mag() > CLHEP::eV) {   << 355     }
646       dir = lambdaLV.vect().unit();            << 356   G4ReactionProductVector::iterator debugit;
647     }                                          << 357   for(debugit=theReactionProductVector->begin(); 
648     G4double etot = std::max(lambdaLV.e()/(G4d << 358       debugit!=theReactionProductVector->end(); debugit++)
649     dir *= std::sqrt((etot - fLambdaMass)*(eto << 359     {
650     for (G4int i=0; i<nL; ++i) {               << 360     if((*debugit)->GetTotalEnergy()<1.*eV)
651       G4ReactionProduct* theNew = new G4Reacti << 361       {
652       theNew->SetMomentum(dir);                << 362   if(getenv("G4DebugPhotonevaporationData"))
653       theNew->SetTotalEnergy(etot);            << 363     {
654       theNew->SetFormationTime(theInitialState << 364       G4cerr << "G4ExcitationHandler: Warning: Photonevaporation data not exact."<<G4endl;
655       theNew->SetCreatorModelID(theInitialStat << 365       G4cerr << "G4ExcitationHandler: Warning: Found gamma with energy = "
656       theReactionProductVector->push_back(theN << 366        << (*debugit)->GetTotalEnergy()/MeV << "MeV"
657     }                                          << 367        << G4endl;
658   }                                            << 368     }
659   if (fVerbose > 3) {                          << 369   delete (*debugit);
660     G4cout << "@@@@@@@@@@ End G4Excitation Han << 370   *debugit = 0;
                                                   >> 371       }
661   }                                               372   }
                                                   >> 373   G4ReactionProduct* tmpPtr=0;
                                                   >> 374   theReactionProductVector->erase(std::remove_if(theReactionProductVector->begin(),
                                                   >> 375                                                  theReactionProductVector->end(),
                                                   >> 376                                                  std::bind2nd(std::equal_to<G4ReactionProduct*>(),
                                                   >> 377                                                               tmpPtr)),
                                                   >> 378           theReactionProductVector->end());
662   return theReactionProductVector;                379   return theReactionProductVector;
663 }                                                 380 }
664                                                   381 
665 void G4ExcitationHandler::ModelDescription(std << 382 
666 {                                              << 383 #ifdef debug
667   outFile << "G4ExcitationHandler description\ << 384 void G4ExcitationHandler::CheckConservation(const G4Fragment & theInitialState,
668     << "This class samples de-excitation of ex << 385               G4FragmentVector * Result) const
669     << "Fermi Break-up model for light fragmen << 386 {
670     << "evaporation, fission, and photo-evapor << 387   G4double ProductsEnergy =0;
671     << "particle may be proton, neutron, and o << 388   G4ThreeVector ProductsMomentum;
672     << "(Z < 13, A < 29). During photon evapor << 389   G4int ProductsA = 0;
673     << "or electrons due to internal conversio << 390   G4int ProductsZ = 0;
                                                   >> 391   G4FragmentVector::iterator h;
                                                   >> 392   for (h = Result->begin(); h != Result->end(); h++) {
                                                   >> 393     G4LorentzVector tmp = (*h)->GetMomentum();
                                                   >> 394     ProductsEnergy += tmp.e();
                                                   >> 395     ProductsMomentum += tmp.vect();
                                                   >> 396     ProductsA += static_cast<G4int>((*h)->GetA());
                                                   >> 397     ProductsZ += static_cast<G4int>((*h)->GetZ());
                                                   >> 398   }
                                                   >> 399   
                                                   >> 400   if (ProductsA != theInitialState.GetA()) {
                                                   >> 401     G4cout << "!!!!!!!!!! Baryonic Number Conservation Violation !!!!!!!!!!" << G4endl;
                                                   >> 402     G4cout << "G4ExcitationHandler.cc: Barionic Number Conservation test for deexcitation fragments" 
                                                   >> 403      << G4endl; 
                                                   >> 404     G4cout << "Initial A = " << theInitialState.GetA() 
                                                   >> 405      << "   Fragments A = " << ProductsA << "   Diference --> " 
                                                   >> 406      << theInitialState.GetA() - ProductsA << G4endl;
                                                   >> 407   }
                                                   >> 408   if (ProductsZ != theInitialState.GetZ()) {
                                                   >> 409     G4cout << "!!!!!!!!!! Charge Conservation Violation !!!!!!!!!!" << G4endl;
                                                   >> 410     G4cout << "G4ExcitationHandler.cc: Charge Conservation test for deexcitation fragments" 
                                                   >> 411      << G4endl; 
                                                   >> 412     G4cout << "Initial Z = " << theInitialState.GetZ() 
                                                   >> 413      << "   Fragments Z = " << ProductsZ << "   Diference --> " 
                                                   >> 414      << theInitialState.GetZ() - ProductsZ << G4endl;
                                                   >> 415   }
                                                   >> 416   if (abs(ProductsEnergy-theInitialState.GetMomentum().e()) > 1.0*keV) {
                                                   >> 417     G4cout << "!!!!!!!!!! Energy Conservation Violation !!!!!!!!!!" << G4endl;
                                                   >> 418     G4cout << "G4ExcitationHandler.cc: Energy Conservation test for deexcitation fragments" 
                                                   >> 419      << G4endl; 
                                                   >> 420     G4cout << "Initial E = " << theInitialState.GetMomentum().e()/MeV << " MeV"
                                                   >> 421      << "   Fragments E = " << ProductsEnergy/MeV  << " MeV   Diference --> " 
                                                   >> 422      << (theInitialState.GetMomentum().e() - ProductsEnergy)/MeV << " MeV" << G4endl;
                                                   >> 423   } 
                                                   >> 424   if (abs(ProductsMomentum.x()-theInitialState.GetMomentum().x()) > 1.0*keV || 
                                                   >> 425       abs(ProductsMomentum.y()-theInitialState.GetMomentum().y()) > 1.0*keV ||
                                                   >> 426       abs(ProductsMomentum.z()-theInitialState.GetMomentum().z()) > 1.0*keV) {
                                                   >> 427     G4cout << "!!!!!!!!!! Momentum Conservation Violation !!!!!!!!!!" << G4endl;
                                                   >> 428     G4cout << "G4ExcitationHandler.cc: Momentum Conservation test for deexcitation fragments" 
                                                   >> 429      << G4endl; 
                                                   >> 430     G4cout << "Initial P = " << theInitialState.GetMomentum().vect() << " MeV"
                                                   >> 431      << "   Fragments P = " << ProductsMomentum  << " MeV   Diference --> " 
                                                   >> 432      << theInitialState.GetMomentum().vect() - ProductsMomentum << " MeV" << G4endl;
                                                   >> 433   }
                                                   >> 434   return;
674 }                                                 435 }
                                                   >> 436 #endif
                                                   >> 437 
675                                                   438 
676                                                   439 
677                                                   440 
678                                                   441