Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/binary_cascade/src/G4BinaryCascade.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/binary_cascade/src/G4BinaryCascade.cc (Version 11.3.0) and /processes/hadronic/models/binary_cascade/src/G4BinaryCascade.cc (Version 8.3)


  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 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26                                                    26 
 27 #include "globals.hh"                              27 #include "globals.hh"
 28 #include "G4PhysicalConstants.hh"              << 
 29 #include "G4SystemOfUnits.hh"                  << 
 30 #include "G4Proton.hh"                             28 #include "G4Proton.hh"
 31 #include "G4Neutron.hh"                            29 #include "G4Neutron.hh"
 32 #include "G4LorentzRotation.hh"                    30 #include "G4LorentzRotation.hh"
 33 #include "G4BinaryCascade.hh"                      31 #include "G4BinaryCascade.hh"
 34 #include "G4KineticTrackVector.hh"                 32 #include "G4KineticTrackVector.hh"
 35 #include "G4DecayKineticTracks.hh"             << 
 36 #include "G4ReactionProductVector.hh"              33 #include "G4ReactionProductVector.hh"
 37 #include "G4Track.hh"                              34 #include "G4Track.hh"
 38 #include "G4V3DNucleus.hh"                         35 #include "G4V3DNucleus.hh"
 39 #include "G4Fancy3DNucleus.hh"                     36 #include "G4Fancy3DNucleus.hh"
 40 #include "G4Scatterer.hh"                          37 #include "G4Scatterer.hh"
 41 #include "G4MesonAbsorption.hh"                    38 #include "G4MesonAbsorption.hh"
 42 #include "G4ping.hh"                               39 #include "G4ping.hh"
 43 #include "G4Delete.hh"                             40 #include "G4Delete.hh"
 44                                                    41 
 45 #include "G4CollisionManager.hh"                   42 #include "G4CollisionManager.hh"
 46 #include "G4Absorber.hh"                           43 #include "G4Absorber.hh"
 47                                                    44 
 48 #include "G4CollisionInitialState.hh"              45 #include "G4CollisionInitialState.hh"
 49 #include "G4ListOfCollisions.hh"                   46 #include "G4ListOfCollisions.hh"
 50 #include "G4Fragment.hh"                           47 #include "G4Fragment.hh"
 51 #include "G4RKPropagation.hh"                      48 #include "G4RKPropagation.hh"
 52                                                    49 
 53 #include "G4NuclearShellModelDensity.hh"       <<  50 #include "G4NuclearShellModelDensity.hh" 
 54 #include "G4NuclearFermiDensity.hh"                51 #include "G4NuclearFermiDensity.hh"
 55 #include "G4FermiMomentum.hh"                      52 #include "G4FermiMomentum.hh"
 56                                                    53 
 57 #include "G4PreCompoundModel.hh"                   54 #include "G4PreCompoundModel.hh"
 58 #include "G4ExcitationHandler.hh"                  55 #include "G4ExcitationHandler.hh"
 59 #include "G4HadronicInteractionRegistry.hh"    << 
 60                                                    56 
 61 #include "G4FermiPhaseSpaceDecay.hh"               57 #include "G4FermiPhaseSpaceDecay.hh"
 62                                                    58 
 63 #include "G4PreCompoundModel.hh"               << 
 64 #include "G4HadronicParameters.hh"             << 
 65                                                << 
 66 #include <algorithm>                               59 #include <algorithm>
 67 #include "G4ShortLivedConstructor.hh"              60 #include "G4ShortLivedConstructor.hh"
 68 #include <typeinfo>                                61 #include <typeinfo>
 69                                                    62 
 70 #include "G4PhysicsModelCatalog.hh"            << 
 71                                                << 
 72 //   turn on general debugging info, and consi     63 //   turn on general debugging info, and consistency checks
 73                                                << 
 74 //#define debug_G4BinaryCascade 1                  64 //#define debug_G4BinaryCascade 1
 75                                                    65 
 76 //  more detailed debugging -- deprecated      <<  66 //  more detailed debugging -- deprecated  
 77 //#define debug_H1_BinaryCascade 1             <<  67 //#define debug_1_BinaryCascade 1
 78                                                    68 
 79 //  specific debugging info per method or func <<  69 //  specific debuuging info per method or functionality
 80 //#define debug_BIC_ApplyCollision 1               70 //#define debug_BIC_ApplyCollision 1
 81 //#define debug_BIC_CheckPauli 1                   71 //#define debug_BIC_CheckPauli 1
 82 //#define debug_BIC_CorrectFinalPandE 1            72 //#define debug_BIC_CorrectFinalPandE 1
 83 //#define debug_BIC_Propagate 1                    73 //#define debug_BIC_Propagate 1
 84 //#define debug_BIC_Propagate_Excitation 1         74 //#define debug_BIC_Propagate_Excitation 1
 85 //#define debug_BIC_Propagate_Collisions 1     << 
 86 //#define debug_BIC_Propagate_finals 1             75 //#define debug_BIC_Propagate_finals 1
 87 //#define debug_BIC_DoTimeStep 1                   76 //#define debug_BIC_DoTimeStep 1
 88 //#define debug_BIC_CorrectBarionsOnBoundary 1     77 //#define debug_BIC_CorrectBarionsOnBoundary 1
 89 //#define debug_BIC_GetExcitationEnergy 1          78 //#define debug_BIC_GetExcitationEnergy 1
 90 //#define debug_BIC_DeexcitationProducts 1     << 
 91 //#define debug_BIC_FinalNucleusMomentum 1         79 //#define debug_BIC_FinalNucleusMomentum 1
 92 //#define debug_BIC_Final4Momentum 1           << 
 93 //#define debug_BIC_FillVoidnucleus 1          << 
 94 //#define debug_BIC_FindFragments 1                80 //#define debug_BIC_FindFragments 1
 95 //#define debug_BIC_BuildTargetList 1          << 
 96 //#define debug_BIC_FindCollision 1            << 
 97 //#define debug_BIC_return 1                   << 
 98                                                << 
 99 //-------                                      << 
100 //#if defined(debug_G4BinaryCascade)           << 
101 #if 0                                          << 
102   #define _CheckChargeAndBaryonNumber_(val) Ch << 
103   //#define debugCheckChargeAndBaryonNumberver << 
104 #else                                          << 
105   #define _CheckChargeAndBaryonNumber_(val)    << 
106 #endif                                         << 
107 //#if defined(debug_G4BinaryCascade)           << 
108 #if 0                                          << 
109   #define _DebugEpConservation(val)  DebugEpCo << 
110   //#define debugCheckChargeAndBaryonNumberver << 
111 #else                                          << 
112   #define _DebugEpConservation(val)            << 
113 #endif                                         << 
114                                                    81 
115 G4int G4BinaryCascade::theBIC_ID = -1;         << 
116                                                    82 
117 //                                             <<  83 
118 //  C O N S T R U C T O R S   A N D   D E S T      84 //  C O N S T R U C T O R S   A N D   D E S T R U C T O R S
119 //                                                 85 //
120 G4BinaryCascade::G4BinaryCascade(G4VPreCompoun <<  86 
121 G4VIntraNuclearTransportModel("Binary Cascade" <<  87 G4BinaryCascade::G4BinaryCascade() : G4VIntraNuclearTransportModel()
122 {                                                  88 {
123     // initialise the resonance sector         <<  89   // initialise the resonance sector
124     G4ShortLivedConstructor ShortLived;        <<  90   G4ShortLivedConstructor ShortLived;
125     ShortLived.ConstructParticle();            <<  91   ShortLived.ConstructParticle();
126                                                <<  92 
127     theCollisionMgr = new G4CollisionManager;  <<  93   theCollisionMgr = new G4CollisionManager;
128     theDecay=new G4BCDecay;                    <<  94   theDecay=new G4BCDecay;
129     theImR.push_back(theDecay);                <<  95   theImR.push_back(theDecay);
130     theLateParticle= new G4BCLateParticle;     <<  96   theImR.push_back(new G4Scatterer);
131     G4MesonAbsorption * aAb=new G4MesonAbsorpt <<  97   theImR.push_back(new G4MesonAbsorption);
132     theImR.push_back(aAb);                     <<  98   thePropagator = new G4RKPropagation;
133     G4Scatterer * aSc=new G4Scatterer;         <<  99   theCurrentTime = 0.;
134     theH1Scatterer = new G4Scatterer;          << 100   theBCminP = 45*MeV;
135     theImR.push_back(aSc);                     << 101   theCutOnP = 90*MeV;
136                                                << 102   theCutOnPAbsorb= 0*MeV;
137     thePropagator = new G4RKPropagation;       << 103 //  G4ExcitationHandler *
138     theCurrentTime = 0.;                       << 104   theExcitationHandler = new G4ExcitationHandler;
139     theBCminP = 45*MeV;                        << 105   SetDeExcitation(new G4PreCompoundModel(theExcitationHandler));
140     theCutOnP = 90*MeV;                        << 106   SetMinEnergy(0.0*GeV);
141     theCutOnPAbsorb= 0*MeV;   // No Absorption << 107   SetMaxEnergy(10.1*GeV);
142                                                << 108   PrintWelcomeMessage();
143     // reuse existing pre-compound model       << 109   thePrimaryEscape = true;
144     if(!ptr) {                                 << 110   thePrimaryType = 0;
145       G4HadronicInteraction* p =               << 
146   G4HadronicInteractionRegistry::Instance()->F << 
147       G4VPreCompoundModel* pre = static_cast<G << 
148       if(!pre) { pre = new G4PreCompoundModel( << 
149       SetDeExcitation(pre);                    << 
150     }                                          << 
151     theExcitationHandler = GetDeExcitation()-> << 
152     SetMinEnergy(0.0*GeV);                     << 
153     SetMaxEnergy(10.1*GeV);                    << 
154     //PrintWelcomeMessage();                   << 
155     thePrimaryEscape = true;                   << 
156     thePrimaryType = 0;                        << 
157                                                << 
158     SetEnergyMomentumCheckLevels(1.0*perCent,  << 
159                                                << 
160     // init data members                       << 
161     currentA=currentZ=0;                       << 
162     lateA=lateZ=0;                             << 
163     initialA=initialZ=0;                       << 
164     projectileA=projectileZ=0;                 << 
165     currentInitialEnergy=initial_nuclear_mass= << 
166     massInNucleus=0.;                          << 
167     theOuterRadius=0.;                         << 
168     theBIC_ID = G4PhysicsModelCatalog::GetMode << 
169     fBCDEBUG = G4HadronicParameters::Instance( << 
170 }                                                 111 }
171                                                   112 
                                                   >> 113 
                                                   >> 114 G4BinaryCascade::G4BinaryCascade(const G4BinaryCascade& )
                                                   >> 115 : G4VIntraNuclearTransportModel()
                                                   >> 116 {
                                                   >> 117 }
                                                   >> 118 
                                                   >> 119 
172 G4BinaryCascade::~G4BinaryCascade()               120 G4BinaryCascade::~G4BinaryCascade()
173 {                                                 121 {
174     ClearAndDestroy(&theTargetList);           << 122   ClearAndDestroy(&theTargetList);
175     ClearAndDestroy(&theSecondaryList);        << 123   ClearAndDestroy(&theSecondaryList);
176     ClearAndDestroy(&theCapturedList);         << 124   ClearAndDestroy(&theCapturedList);
177     delete thePropagator;                      << 125   ClearAndDestroy(&theProjectileList);
178     delete theCollisionMgr;                    << 126   delete thePropagator;
179     for(auto & ptr : theImR) { delete ptr; }   << 127   delete theCollisionMgr;
180     theImR.clear();                            << 128   std::for_each(theImR.begin(), theImR.end(), Delete<G4BCAction>());
181     delete theLateParticle;                    << 129   delete theExcitationHandler;
182     delete theH1Scatterer;                     << 
183 }                                              << 
184                                                << 
185 void G4BinaryCascade::ModelDescription(std::os << 
186 {                                              << 
187     outFile << "G4BinaryCascade is an intra-nu << 
188             << "an incident hadron collides wi << 
189             << "final-state particles, one or  << 
190             << "The resonances then decay hadr << 
191             << "are then propagated through th << 
192             << "trajectories until they re-int << 
193             << "This model is valid for incide << 
194             << "nucleons up to 10 GeV.\n"      << 
195             << "The remaining excited nucleus  << 
196             if (theDeExcitation)               << 
197             {                                  << 
198               outFile << theDeExcitation->GetM << 
199               theDeExcitation->DeExciteModelDe << 
200             }                                  << 
201             else if (theExcitationHandler)     << 
202             {                                  << 
203                outFile << "G4ExcitationHandler << 
204                theExcitationHandler->ModelDesc << 
205             }                                  << 
206             else                               << 
207             {                                  << 
208                outFile << "void.\n";           << 
209             }                                  << 
210     outFile<< " \n";                           << 
211 }                                              << 
212 void G4BinaryCascade::PropagateModelDescriptio << 
213 {                                              << 
214     outFile << "G4BinaryCascade propagtes seco << 
215             << "energy model through the wound << 
216             << "Secondaries are followed after << 
217             << "within the nucleus are propaga << 
218             << "potential along curved traject << 
219             << "with a nucleon, decay, or leav << 
220             << "An interaction of a secondary  << 
221             << "final-state particles, one or  << 
222             << "Resonances decay hadronically  << 
223             << "are in turn propagated through << 
224             << "trajectories until they re-int << 
225             << "This model is valid for pions  << 
226             << "nucleons up to about 3.5 GeV.\ << 
227             << "The remaining excited nucleus  << 
228     if (theDeExcitation)                // pre << 
229     {                                          << 
230       outFile << theDeExcitation->GetModelName << 
231       theDeExcitation->DeExciteModelDescriptio << 
232     }                                          << 
233     else if (theExcitationHandler)    // de-ex << 
234     {                                          << 
235        outFile << "G4ExcitationHandler";    // << 
236        theExcitationHandler->ModelDescription( << 
237     }                                          << 
238     else                                       << 
239     {                                          << 
240        outFile << "void.\n";                   << 
241     }                                          << 
242 outFile<< " \n";                               << 
243 }                                                 130 }
244                                                   131 
245 //--------------------------------------------    132 //----------------------------------------------------------------------------
246                                                   133 
247 //                                                134 //
248 //      I M P L E M E N T A T I O N               135 //      I M P L E M E N T A T I O N
249 //                                                136 //
250                                                   137 
251                                                   138 
252 //--------------------------------------------    139 //----------------------------------------------------------------------------
253 G4HadFinalState * G4BinaryCascade::ApplyYourse    140 G4HadFinalState * G4BinaryCascade::ApplyYourself(const G4HadProjectile & aTrack,
254         G4Nucleus & aNucleus)                  << 
255 //--------------------------------------------    141 //----------------------------------------------------------------------------
                                                   >> 142               G4Nucleus & aNucleus)
256 {                                                 143 {
257     if(fBCDEBUG) G4cerr << " ######### Binary  << 144   static G4int eventcounter=0;
258                                                << 145   //if(eventcounter == 100*(eventcounter/100) )
259     G4LorentzVector initial4Momentum = aTrack. << 146   eventcounter++;
260     const G4ParticleDefinition * definition =  << 147   if(getenv("BCDEBUG") ) G4cerr << " ######### Binary Cascade Reaction number starts ######### "<<eventcounter<<G4endl;
261                                                << 148   G4LorentzVector initial4Momentum = aTrack.Get4Momentum();
262     if(initial4Momentum.e()-initial4Momentum.m << 149   if(initial4Momentum.e()-initial4Momentum.m()<theBCminP)
263             ( definition==G4Neutron::NeutronDe << 150   {
264     {                                          << 151     return theDeExcitation->ApplyYourself(aTrack, aNucleus);
265         return theDeExcitation->ApplyYourself( << 152   }
266     }                                          << 153 
267                                                << 154   theParticleChange.Clear();
268     theParticleChange.Clear();                 << 155 // initialize the G4V3DNucleus from G4Nucleus
269     // initialize the G4V3DNucleus from G4Nucl << 156   the3DNucleus = new G4Fancy3DNucleus;
270     the3DNucleus = new G4Fancy3DNucleus;       << 157   the3DNucleus->Init(aNucleus.GetN(), aNucleus.GetZ());
271                                                << 158 
272     // Build a KineticTrackVector with the G4T << 159   thePropagator->Init(the3DNucleus);
273     G4KineticTrackVector * secondaries;// = ne << 160 
274     G4ThreeVector initialPosition(0., 0., 0.); << 161 // Build a KineticTrackVector with the G4Track
275                                                << 162   G4KineticTrackVector * secondaries = new G4KineticTrackVector;
276     if(!fBCDEBUG)                              << 163   G4ParticleDefinition * definition = const_cast<G4ParticleDefinition *>(aTrack.GetDefinition());
277     {                                          << 164   G4ThreeVector initialPosition(0., 0., 0.); // will be set later
278         if(definition!=G4Neutron::NeutronDefin << 165 
279                 definition!=G4Proton::ProtonDe << 166   if(!getenv("I_Am_G4BinaryCascade_Developer") )
280                 definition!=G4PionPlus::PionPl << 167   {
281                 definition!=G4PionMinus::PionM << 168     if(definition!=G4Neutron::NeutronDefinition() &&
282         {                                      << 169       definition!=G4Proton::ProtonDefinition() &&
283             G4cerr << "You are trying to use G << 170       definition!=G4PionPlus::PionPlusDefinition() &&
284             G4cerr << "G4BinaryCascade should  << 171       definition!=G4PionMinus::PionMinusDefinition() )
285             G4cerr << "If you want to continue << 172     {
286             G4cerr << "setenv I_Am_G4BinaryCas << 173       G4cerr << "You are using G4BinaryCascade for projectiles other than nucleons or pions."<<G4endl;
287             throw G4HadronicException(__FILE__ << 174       G4cerr << "If you want to continue, please switch on the developer environment: "<<G4endl;
288         }                                      << 175       G4cerr << "setenv I_Am_G4BinaryCascade_Developer 1 "<<G4endl<<G4endl;
289     }                                          << 176       throw G4HadronicException(__FILE__, __LINE__, "G4BinaryCascade - used for unvalid particle type - Fatal");
290                                                << 177     }
291     // keep primary                            << 178   }
292     thePrimaryType = definition;               << 179 
293     thePrimaryEscape = false;                  << 180 // keep primary
294                                                << 181   thePrimaryType = definition;
295     G4double timePrimary=aTrack.GetGlobalTime( << 182   thePrimaryEscape = false;
296                                                << 183 
297     // try until an interaction will happen    << 184 // try untill an interaction will happen
298     G4ReactionProductVector * products = nullp << 185   G4ReactionProductVector * products = 0;
299     G4int interactionCounter = 0,collisionLoop << 186   G4double radius = the3DNucleus->GetOuterRadius()+3*fermi;
300     do                                         << 187   G4int interactionCounter = 0;
301     {                                          << 188   do
302         // reset status that could be changed  << 189   {
303         theCollisionMgr->ClearAndDestroy();    << 190 // reset status that could be changed in previous loop event
304                                                << 191     theCollisionMgr->ClearAndDestroy();
305         if(products != nullptr)                << 192     ClearAndDestroy(&theTargetList);  // clear and rebuild theTargetList
306         {  // free memory from previous loop e << 193     the3DNucleus->Init(aNucleus.GetN(), aNucleus.GetZ());
307             ClearAndDestroy(products);         << 194     BuildTargetList();
308             delete products;                   << 195     G4KineticTrack * kt = new G4KineticTrack(definition, 0., initialPosition,
309         }                                      << 196                initial4Momentum);
310                                                << 197 // Note: secondaries has been cleared by Propagate() in the previous loop event
311         G4int massNumber=aNucleus.GetA_asInt() << 198     secondaries->push_back(kt);
312         the3DNucleus->Init(massNumber, aNucleu << 199 
313         thePropagator->Init(the3DNucleus);     << 200     while(theCollisionMgr->Entries() == 0)  // until we FIND a collision...
314         G4KineticTrack * kt;                   << 201     {
315       collisionLoopMaxCount = 200;             << 202       theCurrentTime=0;
316         do                  // sample impact p << 203       initialPosition=GetSpherePoint(1.1*radius, initial4Momentum);  // get random position
317         {                                      << 204       kt->SetPosition(initialPosition);         // kt is in secondaries!!
318             theCurrentTime=0;                  << 205       kt->SetState(G4KineticTrack::outside);
319             G4double radius = the3DNucleus->Ge << 206       FindCollisions(secondaries);
320             initialPosition=GetSpherePoint(1.1 << 207     }
321             kt = new G4KineticTrack(definition << 208     if(products != NULL)
322             kt->SetState(G4KineticTrack::outsi << 209     {  // free memory from previous loop event
323             // secondaries has been cleared by << 210       ClearAndDestroy(products);
324             secondaries= new G4KineticTrackVec << 211       delete products;
325             secondaries->push_back(kt);        << 212     }
326             if(massNumber > 1) // 1H1 is speci << 213     products = Propagate(secondaries, the3DNucleus);
327             {                                  << 214 
328                 products = Propagate(secondari << 215 // --------- debug
329             } else {                           << 216 // untill Propagate will be able to return some product...
330                 products = Propagate1H1(second << 217 //  if(1)
331             }                                  << 218 //    return &theParticleChange;
332             // until we FIND a collision ... o << 219 //  --------- end debug
333         } while(! products && --collisionLoopM << 220     if(++interactionCounter>99) break;
334                                                << 221   } while(products->size() == 0);  // ...untill we find an ALLOWED collision
335         if(++interactionCounter>99) break;     << 222 
336         // ...until we find an ALLOWED collisi << 223   if(products->size()==0)
337     } while(products && products->size() == 0) << 224   {
338                                                << 225     theParticleChange.SetStatusChange(isAlive);
339     if(products && products->size()>0)         << 226     theParticleChange.SetEnergyChange(aTrack.GetKineticEnergy());
340     {                                          << 227     theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit());
341         //  G4cout << "BIC Applyyourself: numb << 228     return &theParticleChange;
342                                                << 229   }
343         // Fill the G4ParticleChange * with pr << 230 //  G4cout << "HKM Applyyourself: number of products " << products->size() << G4endl;
344         theParticleChange.SetStatusChange(stop << 
345         G4ReactionProductVector::iterator iter << 
346                                                << 
347         for(iter = products->begin(); iter !=  << 
348         {                                      << 
349           G4DynamicParticle * aNewDP =         << 
350                     new G4DynamicParticle((*it << 
351                             (*iter)->GetTotalE << 
352                             (*iter)->GetMoment << 
353           G4HadSecondary aNew = G4HadSecondary << 
354             G4double time=(*iter)->GetFormatio << 
355             if(time < 0.0) { time = 0.0; }     << 
356             aNew.SetTime(timePrimary + time);  << 
357             aNew.SetCreatorModelID((*iter)->Ge << 
358             aNew.SetParentResonanceDef((*iter) << 
359             aNew.SetParentResonanceID((*iter)- << 
360             theParticleChange.AddSecondary(aNe << 
361         }                                      << 
362                                                << 
363          //DebugFinalEpConservation(aTrack, pr << 
364                                                << 
365                                                << 
366     } else {  // no interaction, return primar << 
367         if(fBCDEBUG) G4cerr << " ######### Bin << 
368         theParticleChange.SetStatusChange(isAl << 
369         theParticleChange.SetEnergyChange(aTra << 
370         theParticleChange.SetMomentumChange(aT << 
371     }                                          << 
372                                                << 
373     if ( products )                            << 
374    {                                           << 
375       ClearAndDestroy(products);               << 
376        delete products;                        << 
377     }                                          << 
378                                                << 
379     delete the3DNucleus;                       << 
380     the3DNucleus = nullptr;                    << 
381                                                   231 
382     if(fBCDEBUG) G4cerr << " ######### Binary  << 232 // Fill the G4ParticleChange * with products
                                                   >> 233   theParticleChange.SetStatusChange(stopAndKill);
                                                   >> 234   G4ReactionProductVector::iterator iter;
                                                   >> 235   G4double Efinal=0;
                                                   >> 236     if (std::abs(theParticleChange.GetWeightChange() -1 ) > 1e-5 )
                                                   >> 237   {
                                                   >> 238      G4cout <<" BIC-weight change " << theParticleChange.GetWeightChange()<< G4endl;
                                                   >> 239   }
383                                                   240 
384     return &theParticleChange;                 << 241   for(iter = products->begin(); iter != products->end(); ++iter)
                                                   >> 242   {
                                                   >> 243     G4DynamicParticle * aNew =
                                                   >> 244       new G4DynamicParticle((*iter)->GetDefinition(),
                                                   >> 245           (*iter)->GetTotalEnergy(),
                                                   >> 246           (*iter)->GetMomentum());
                                                   >> 247     if(getenv("BCDEBUG") )
                                                   >> 248     {
                                                   >> 249       if(std::abs(aNew->GetDefinition()->GetPDGEncoding()) >100
                                                   >> 250          && std::abs(aNew->GetDefinition()->GetPDGEncoding()) < 300) G4cout << "Pion info "<<aNew->GetDefinition()->GetPDGEncoding() <<" "<<aNew->GetKineticEnergy()<<G4endl;
                                                   >> 251     }
                                                   >> 252     // FixMe: should I use "position" or "time" specifyed AddSecondary() methods?
                                                   >> 253     theParticleChange.AddSecondary(aNew);
                                                   >> 254 
                                                   >> 255 //   G4cout << " Secondary E - Ekin / p " <<
                                                   >> 256 //      (*iter)->GetDefinition()->GetParticleName() << " " <<
                                                   >> 257 //      (*iter)->GetTotalEnergy() << " - " <<
                                                   >> 258 //      (*iter)->GetKineticEnergy()<< " / " <<
                                                   >> 259 //      (*iter)->GetMomentum().x() << " " <<
                                                   >> 260 //      (*iter)->GetMomentum().y() << " " <<
                                                   >> 261 //      (*iter)->GetMomentum().z() << G4endl;
                                                   >> 262       Efinal += (*iter)->GetTotalEnergy();
                                                   >> 263   }
                                                   >> 264 
                                                   >> 265 //  G4cout << "e outgoing/ total : " << Efinal << " " << Efinal+GetFinal4Momentum().e()<< G4endl;
                                                   >> 266 
                                                   >> 267   ClearAndDestroy(products);
                                                   >> 268   delete products;
                                                   >> 269   delete secondaries;
                                                   >> 270 
                                                   >> 271   delete the3DNucleus;
                                                   >> 272   the3DNucleus = NULL;  // protect from wrong usage...
                                                   >> 273 
                                                   >> 274   if(getenv("BCDEBUG") ) G4cerr << " ######### Binary Cascade Reaction number ends ######### "<<eventcounter<<G4endl;
                                                   >> 275     if (std::abs(theParticleChange.GetWeightChange() -1 ) > 1e-5 )
                                                   >> 276   {
                                                   >> 277      G4cout <<" BIC-fin-weight change " << theParticleChange.GetWeightChange()<< G4endl;
                                                   >> 278   }
                                                   >> 279   return &theParticleChange;
385 }                                                 280 }
                                                   >> 281 
386 //--------------------------------------------    282 //----------------------------------------------------------------------------
387 G4ReactionProductVector * G4BinaryCascade::Pro    283 G4ReactionProductVector * G4BinaryCascade::Propagate(
388         G4KineticTrackVector * secondaries, G4 << 
389 //--------------------------------------------    284 //----------------------------------------------------------------------------
                                                   >> 285     G4KineticTrackVector * secondaries, G4V3DNucleus * nucleus)
390 {                                                 286 {
391     G4ping debug("debug_G4BinaryCascade");     << 287   G4ping debug("debug_G4BinaryCascade");
                                                   >> 288   debug.push_back("trial");
                                                   >> 289   debug.dump();
392 #ifdef debug_BIC_Propagate                        290 #ifdef debug_BIC_Propagate
393     G4cout << "G4BinaryCascade Propagate start << 291    G4cout << "G4BinaryCascade Propagate starting -------------------------------------------------------" <<G4endl;
394 #endif                                            292 #endif
395                                                << 293   G4ReactionProductVector * products = new G4ReactionProductVector;
396     the3DNucleus=aNucleus;                     << 294   the3DNucleus = nucleus;
397     G4ReactionProductVector * products = new G << 295   theOuterRadius = the3DNucleus->GetOuterRadius();
398     theOuterRadius = the3DNucleus->GetOuterRad << 296   theCurrentTime=0;
399     theCurrentTime=0;                          << 297 // build theSecondaryList, theProjectileList and theCapturedList
400     theProjectile4Momentum=G4LorentzVector(0,0 << 298   ClearAndDestroy(&theCapturedList);
401     theMomentumTransfer=G4ThreeVector(0,0,0);  << 299   ClearAndDestroy(&theSecondaryList);
402     // build theSecondaryList, theProjectileLi << 300   ClearAndDestroy(&theProjectileList);
403     ClearAndDestroy(&theCapturedList);         << 301   ClearAndDestroy(&theFinalState);
404     ClearAndDestroy(&theSecondaryList);        << 302   std::vector<G4KineticTrack *>::iterator iter;
405     theSecondaryList.clear();                  << 303   if(nucleus->GetMassNumber() == 1) // 1H1 is special case
406     ClearAndDestroy(&theFinalState);           << 304   {
407     std::vector<G4KineticTrack *>::iterator it << 305      return Propagate1H1(secondaries,nucleus);
408     theCollisionMgr->ClearAndDestroy();        << 306   }
409                                                << 307 
410     theCutOnP=90*MeV;                          << 308   for(iter = secondaries->begin(); iter != secondaries->end(); ++iter)
411     if(the3DNucleus->GetMass()>30) theCutOnP = << 309   {
412     if(the3DNucleus->GetMass()>60) theCutOnP = << 310     theSecondaryList.push_back(*iter);
413     if(the3DNucleus->GetMass()>120) theCutOnP  << 311     theProjectileList.push_back(new G4KineticTrack(*(*iter)));
414                                                << 312   }
415                                                << 313   secondaries->clear(); // Don't leave "G4KineticTrack *"s in two vectors
                                                   >> 314 
                                                   >> 315   thePropagator->Init(the3DNucleus);
                                                   >> 316 
                                                   >> 317 // if called stand alone, build theTargetList and find first collisions
                                                   >> 318   theCutOnP=90*MeV;
                                                   >> 319   if(nucleus->GetMass()>30) theCutOnP = 70*MeV;
                                                   >> 320   if(nucleus->GetMass()>60) theCutOnP = 50*MeV;
                                                   >> 321   if(nucleus->GetMass()>120) theCutOnP = 45*MeV;
                                                   >> 322   if(theCollisionMgr->Entries() == 0)
                                                   >> 323   {
                                                   >> 324     the3DNucleus = nucleus;
                                                   >> 325     ClearAndDestroy(&theTargetList);
416     BuildTargetList();                            326     BuildTargetList();
                                                   >> 327     FindCollisions(&theSecondaryList);
                                                   >> 328   }
417                                                   329 
418 #ifdef debug_BIC_GetExcitationEnergy           << 330 //  thePropagator->Init(the3DNucleus);
419     G4cout << "ExcitationEnergy0 " << GetExcit << 
420 #endif                                         << 
421                                                << 
422     thePropagator->Init(the3DNucleus);         << 
423                                                   331 
424     G4bool success = BuildLateParticleCollisio << 332 // end of initialization: do the job now
425     if (! success )   // fails if no excitatio << 333 // loop untill there are collisions
426     {                                          << 
427        products=HighEnergyModelFSProducts(prod << 
428        ClearAndDestroy(secondaries);           << 
429        delete secondaries;                     << 
430                                                   334 
431 #ifdef debug_G4BinaryCascade                   << 
432        G4cout << "G4BinaryCascade::Propagate:  << 
433 #endif                                         << 
434                                                   335 
435        return products;                        << 336   G4bool haveProducts = false;
                                                   >> 337   G4int collisionCount=0;
                                                   >> 338   theMomentumTransfer=0;
                                                   >> 339   while(theCollisionMgr->Entries() > 0)
                                                   >> 340   {
                                                   >> 341     // G4cout << "Propagate Captured size: " << theCapturedList.size() << G4endl;
                                                   >> 342     // FixMe: at the moment I absorb pi with mom < theCutOnp, and I capture
                                                   >> 343     //        p and n with mom < theCutOnP. What about antip, k and sigmas
                                                   >> 344     //        with mom < theCutOnP?
                                                   >> 345     if(Absorb()) {  // absorb secondaries
                                                   >> 346       haveProducts = true;
                                                   >> 347       //G4cout << "Absorb sucess " << G4endl;
436     }                                             348     }
437     // check baryon and charge ...             << 
438                                                   349 
439     _CheckChargeAndBaryonNumber_("lateparticle << 350     if(Capture()) { // capture secondaries (nucleons)
440     _DebugEpConservation(" be4 findcollisions" << 351       haveProducts = true;
441                                                << 352       //G4cout << "Capture sucess " << G4endl;
442     // if called stand alone find first collis << 
443     FindCollisions(&theSecondaryList);         << 
444                                                << 
445                                                << 
446     if(theCollisionMgr->Entries() == 0 )       << 
447     {                                          << 
448         //G4cout << " no collsions -> return 0 << 
449         delete products;                       << 
450 #ifdef debug_BIC_return                        << 
451         G4cout << "return @ begin2,  no collis << 
452 #endif                                         << 
453         return nullptr;                        << 
454     }                                             353     }
455                                                   354 
456     // end of initialization: do the job now   << 355 // propagate to the next collision if any (collisions could have been deleted
457     // loop until there are no more collisions << 356 // by previous absorption or capture)
                                                   >> 357     if(theCollisionMgr->Entries() > 0)
                                                   >> 358     {
                                                   >> 359        G4CollisionInitialState *
                                                   >> 360   nextCollision = theCollisionMgr->GetNextCollision();
458                                                   361 
                                                   >> 362        debug.push_back("======>    test 1"); debug.dump();
                                                   >> 363        if (!DoTimeStep(nextCollision->GetCollisionTime()-theCurrentTime) )
                                                   >> 364        {
                                                   >> 365      // Check if nextCollision is still valid, ie. partcile did not leave nucleus
                                                   >> 366      if (theCollisionMgr->GetNextCollision() != nextCollision )
                                                   >> 367      {
                                                   >> 368          nextCollision = 0;
                                                   >> 369      }
                                                   >> 370   }
                                                   >> 371        debug.push_back("======>    test 2"); debug.dump();
                                                   >> 372 //       G4cerr <<"post- DoTimeStep 1"<<G4endl;
459                                                   373 
460     G4bool haveProducts = false;               << 374   if( nextCollision )
461 #ifdef debug_BIC_Propagate_Collisions          << 375   {
462     G4int collisionCount=0;                    << 376 // GF for testing only, must be removed otherwise!
463 #endif                                         << 377 //        theCollisionMgr->RemoveCollision(nextCollision);
464     G4int collisionLoopMaxCount=1000000;       << 378            debug.push_back("======>    test 3"); debug.dump();
465     while(theCollisionMgr->Entries() > 0 && cu << 379      if (ApplyCollision(nextCollision))
466     {                                          << 380 // testing          if ( true ) 
467       if(Absorb()) {  // absorb secondaries, p << 381      {
468             haveProducts = true;               << 382 // apply the collision
469       }                                        << 383               //G4cerr << "ApplyCollision sucess " << G4endl;
470       if(Capture()) { // capture secondaries,  << 384         haveProducts = true;
471             haveProducts = true;               << 385         collisionCount++;
472         }                                      << 386               debug.push_back("======>    test 4.1"); debug.dump();
473                                                << 387            } else {
474         // propagate to the next collision if  << 388               //G4cerr << "ApplyCollision failure " << G4endl;
475         // by previous absorption or capture)  << 389         theCollisionMgr->RemoveCollision(nextCollision);
476         if(theCollisionMgr->Entries() > 0)     << 390               debug.push_back("======>    test 4.2"); debug.dump();
477         {                                      << 391            }
478             G4CollisionInitialState *          << 392   }
479             nextCollision = theCollisionMgr->G << 393         debug.push_back("======>    test 5"); debug.dump();
480 #ifdef debug_BIC_Propagate_Collisions          << 394 //       G4cerr <<"post-post- DoTimeStep 1"<<G4endl;
481             G4cout << " NextCollision  * , Tim << 
482                     <<nextCollision->GetCollis << 
483                     theCurrentTime<< G4endl;   << 
484 #endif                                         << 
485             if (!DoTimeStep(nextCollision->Get << 
486             {                                  << 
487                 // Check if nextCollision is s << 
488                 if (theCollisionMgr->GetNextCo << 
489                 {                              << 
490                     nextCollision = nullptr;   << 
491                 }                              << 
492             }                                  << 
493            //_DebugEpConservation("Stepped");  << 
494                                                << 
495             if( nextCollision )                << 
496             {                                  << 
497                 if (ApplyCollision(nextCollisi << 
498                 {                              << 
499                     //G4cerr << "ApplyCollisio << 
500                     haveProducts = true;       << 
501 #ifdef debug_BIC_Propagate_Collisions          << 
502                     collisionCount++;          << 
503 #endif                                         << 
504                                                << 
505                 } else {                       << 
506                     //G4cerr << "ApplyCollisio << 
507                     theCollisionMgr->RemoveCol << 
508                 }                              << 
509             }                                  << 
510         }                                      << 
511     }                                          << 
512                                                << 
513     //--------- end of on Collisions           << 
514     //G4cout << "currentZ @ end loop " << curr << 
515     G4int nProtons(0);                         << 
516     for(iter = theTargetList.begin(); iter !=  << 
517     {                                          << 
518       if ( (*iter)->GetDefinition() == G4Proto << 
519     }                                          << 
520     if ( ! theTargetList.size() || ! nProtons  << 
521         // nucleus completely destroyed, fill  << 
522        products = FillVoidNucleusProducts(prod << 
523 #ifdef debug_BIC_return                        << 
524         G4cout << "return @ Z=0 after collisio << 
525         PrintKTVector(&theSecondaryList,std::s << 
526         G4cout << "theTargetList size: " << th << 
527         PrintKTVector(&theTargetList,std::stri << 
528         PrintKTVector(&theCapturedList,std::st << 
529                                                << 
530         G4cout << " ExcitE be4 Correct : " <<G << 
531         G4cout << " Mom Transfered to nucleus  << 
532         PrintKTVector(&theFinalState,std::stri << 
533         G4cout << "returned products: " << pro << 
534         _CheckChargeAndBaryonNumber_("destroye << 
535         _DebugEpConservation("destroyed Nucleu << 
536 #endif                                         << 
537                                                << 
538         return products;                       << 
539     }                                          << 
540                                                << 
541     // No more collisions: absorb, capture and << 
542     if(Absorb()) {                             << 
543         haveProducts = true;                   << 
544         // G4cout << "Absorb sucess " << G4end << 
545     }                                          << 
546                                                << 
547     if(Capture()) {                            << 
548         haveProducts = true;                   << 
549         // G4cout << "Capture sucess " << G4en << 
550     }                                             395     }
                                                   >> 396   }
551                                                   397 
552     if(!haveProducts)  // no collisions happen << 398    debug.push_back("======>    #### through the first loop"); debug.dump();
553     {                                          << 399 // No more collisions: absorb, capture and propagate the secondaries out of the nucleus
554 #ifdef debug_BIC_return                        << 400   if(Absorb()) {
555         G4cout << "return 3, no products "<< G << 401     haveProducts = true;
556 #endif                                         << 402    // G4cout << "Absorb sucess " << G4endl;
557         return products;                       << 403   }
558     }                                          << 404 
                                                   >> 405   if(Capture()) {
                                                   >> 406     haveProducts = true;
                                                   >> 407    // G4cout << "Capture sucess " << G4endl;
                                                   >> 408   }
                                                   >> 409 
                                                   >> 410   if(!haveProducts)  // no collisions happened. Return an empty vector.
                                                   >> 411   {
                                                   >> 412     return products;
                                                   >> 413   }
559                                                   414 
560                                                   415 
561 #ifdef debug_BIC_Propagate                        416 #ifdef debug_BIC_Propagate
562     G4cout << " Momentum transfer to Nucleus " << 417    G4cout << " Momentum transfer to Nucleus " << theMomentumTransfer << " " << theMomentumTransfer.mag() << G4endl;
563     G4cout << "  Stepping particles out......  << 418    G4cout << "  Stepping particles out...... " << G4endl;
564 #endif                                            419 #endif
565                                                   420 
566     StepParticlesOut();                        << 421   StepParticlesOut();
567     _DebugEpConservation("stepped out");       << 422   
568                                                << 423   
569                                                << 424   if ( theSecondaryList.size() > 0 )
570     if ( theSecondaryList.size() > 0 )         << 425   {
571     {                                          << 
572 #ifdef debug_G4BinaryCascade                      426 #ifdef debug_G4BinaryCascade
573         G4cerr << "G4BinaryCascade: Warning, h << 427       G4cerr << "G4BinaryCascade: Warning, have active particles at end" << G4endl;
574         PrintKTVector(&theSecondaryList, "acti << 
575 #endif                                            428 #endif
576         //  add left secondaries to FinalSate  << 429 //  add left secondaries to FinalSate
577         for ( iter =theSecondaryList.begin();  << 430        std::vector<G4KineticTrack *>::iterator iter;
578         {                                      << 431        for ( iter =theSecondaryList.begin(); iter != theSecondaryList.end(); ++iter)
579             theFinalState.push_back(*iter);    << 432        {
580         }                                      << 433      theFinalState.push_back(*iter);
581         theSecondaryList.clear();              << 434        }
                                                   >> 435        theSecondaryList.clear();
582                                                   436 
583     }                                          << 437   }
584     while ( theCollisionMgr->Entries() > 0 )   << 438   while ( theCollisionMgr->Entries() > 0 )
585     {                                          << 439   {
586 #ifdef debug_G4BinaryCascade                      440 #ifdef debug_G4BinaryCascade
587         G4cerr << " Warning: remove left over  << 441      G4cerr << " Warning: remove left over collision " << G4endl;
588 #endif                                            442 #endif
589         theCollisionMgr->RemoveCollision(theCo << 443       theCollisionMgr->RemoveCollision(theCollisionMgr->GetNextCollision());
590     }                                          << 444   }
591                                                   445 
592 #ifdef debug_BIC_Propagate_Excitation             446 #ifdef debug_BIC_Propagate_Excitation
593                                                   447 
594     PrintKTVector(&theSecondaryList,std::strin << 448   PrintKTVector(&theProjectileList,std::string(" theProjectileList"));
595     G4cout << "theTargetList size: " << theTar << 449   PrintKTVector(&theSecondaryList,std::string(" theSecondaryList"));
596     //  PrintKTVector(&theTargetList,std::stri << 450   G4cout << "theTargetList size: " << theTargetList.size() << G4endl;
597     PrintKTVector(&theCapturedList,std::string << 451 //  PrintKTVector(&theTargetList,std::string(" theTargetList"));
598                                                << 452   PrintKTVector(&theCapturedList,std::string(" theCapturedList"));
599     G4cout << " ExcitE be4 Correct : " <<GetEx << 453 
600     G4cout << " Mom Transfered to nucleus : "  << 454   G4cout << " ExcitE be4 Correct : " <<GetExcitationEnergy() << G4endl;
601     PrintKTVector(&theFinalState,std::string(" << 455   G4cout << " Mom Transfered to nucleus : " << theMomentumTransfer << " " << theMomentumTransfer.mag() << G4endl;
                                                   >> 456   PrintKTVector(&theFinalState,std::string(" FinalState uncorrected"));
602 #endif                                            457 #endif
603                                                   458 
604     //                                         << 459 //
605                                                   460 
606                                                   461 
607     G4double ExcitationEnergy=GetExcitationEne << 462   G4double ExcitationEnergy=GetExcitationEnergy();
608                                                   463 
609 #ifdef debug_BIC_Propagate_finals                 464 #ifdef debug_BIC_Propagate_finals
610     PrintKTVector(&theFinalState,std::string(" << 465   PrintKTVector(&theFinalState,std::string(" FinalState be4 corr"));
611     G4cout << " Excitation Energy prefinal,  # << 466   G4cout << " Excitation Energy prefinal,  #collisions:, out, captured  "
612             << ExcitationEnergy << " "         << 467   << ExcitationEnergy << " "
613             << collisionCount << " "           << 468   << collisionCount << " "
614             << theFinalState.size() << " "     << 469   << theFinalState.size() << " "
615             << theCapturedList.size()<<G4endl; << 470   << theCapturedList.size()<<G4endl;
616 #endif                                         << 471 #endif
617                                                << 472 
618     if (ExcitationEnergy < 0 )                 << 473   if (ExcitationEnergy < 0 ) 
619     {                                          << 474   { 
620         G4int maxtry=5, ntry=0;                << 475      G4int maxtry=5, ntry=0;
621         do {                                   << 476      do {
622             CorrectFinalPandE();               << 477        CorrectFinalPandE();
623             ExcitationEnergy=GetExcitationEner << 478        ExcitationEnergy=GetExcitationEnergy();
624         } while ( ++ntry < maxtry && Excitatio << 479      } while ( ++ntry < maxtry && ExcitationEnergy < 0 );
625     }                                          << 480   }
626     _DebugEpConservation("corrected");         << 
627                                                   481 
628 #ifdef debug_BIC_Propagate_finals                 482 #ifdef debug_BIC_Propagate_finals
629     PrintKTVector(&theFinalState,std::string(" << 483   PrintKTVector(&theFinalState,std::string(" FinalState corrected"));
630     G4cout << " Excitation Energy final,  #col << 484   G4cout << " Excitation Energy final,  #collisions:, out, captured  "
631             << ExcitationEnergy << " "         << 485   << ExcitationEnergy << " "
632             << collisionCount << " "           << 486   << collisionCount << " "
633             << theFinalState.size() << " "     << 487   << theFinalState.size() << " "
634             << theCapturedList.size()<<G4endl; << 488   << theCapturedList.size()<<G4endl;
635 #endif                                            489 #endif
636                                                   490 
637                                                   491 
638     if ( ExcitationEnergy < 0. )               << 492   if ( ExcitationEnergy < 0. )
639     {                                          << 493   {
640             #ifdef debug_G4BinaryCascade       << 494 //  if ( ExcitationEnergy < 0. )
641                   G4cerr << "G4BinaryCascade-W << 495   {
642                   G4cerr <<ExcitationEnergy<<G << 496 //#ifdef debug_G4BinaryCascade
643                  PrintKTVector(&theFinalState, << 497 //      G4cerr << "G4BinaryCascade-Warning: negative excitation energy ";
644                  PrintKTVector(&theCapturedLis << 498 //      G4cerr <<ExcitationEnergy<<G4endl;
645                 G4cout << "negative ExE:Final  << 499 //     PrintKTVector(&theFinalState,std::string("FinalState"));
646                         << " "<< GetFinal4Mome << 500 //    PrintKTVector(&theCapturedList,std::string("captured"));
647                         << "negative ExE:Final << 501 //    G4cout << "negative ExE:Final 4Momentum .mag: " << GetFinal4Momentum()
648                   << " "<< GetFinalNucleusMome << 502 //            << " "<< GetFinal4Momentum().mag()<< G4endl
649             #endif                             << 503 //            << "negative ExE:FinalNucleusMom  .mag: " << GetFinalNucleusMomentum()
650             #ifdef debug_BIC_return            << 504 //      << " "<< GetFinalNucleusMomentum().mag()<< G4endl;
651                     G4cout << "  negative Exci << 505 //#endif
652                     G4cout << "return 4, excit << 506   }
653             #endif                             << 507   ClearAndDestroy(products);
654                                                << 508   return products;   // return empty products
655         ClearAndDestroy(products);             << 509   }
656         return products;   // return empty pro << 
657     }                                          << 
658                                                << 
659     G4ReactionProductVector * precompoundProdu << 
660                                                   510 
661                                                   511 
662     G4DecayKineticTracks decay(&theFinalState) << 512 // find a fragment and call the precompound model.
663     _DebugEpConservation("decayed");           << 513   G4Fragment * fragment = 0;
                                                   >> 514   G4ReactionProductVector * precompoundProducts = 0;
                                                   >> 515  
                                                   >> 516    if ( ExcitationEnergy >= 0 ) 
                                                   >> 517    {
                                                   >> 518        fragment = FindFragments();
664                                                   519 
665     products= ProductsAddFinalState(products,  << 520     //  theDeExcitation =0;
                                                   >> 521        if(fragment && fragment->GetA() >1.5) // hpw @@@@ still to add the nucleon, if one exists.
                                                   >> 522        {
                                                   >> 523    if (theDeExcitation)
                                                   >> 524    {
                                                   >> 525              precompoundProducts= theDeExcitation->DeExcite(*fragment);
                                                   >> 526              delete fragment;
                                                   >> 527              fragment=0;
                                                   >> 528    } else if (theExcitationHandler)
                                                   >> 529    {
                                                   >> 530        precompoundProducts=theExcitationHandler->BreakItUp(*fragment);
                                                   >> 531              delete fragment;
                                                   >> 532              fragment=0;
                                                   >> 533    }
                                                   >> 534        } else {
                                                   >> 535          if ( theTargetList.size() == 1 )
                                                   >> 536    {
                                                   >> 537        precompoundProducts = new G4ReactionProductVector();
                                                   >> 538        std::vector<G4KineticTrack *>::iterator i=theTargetList.begin();
                                                   >> 539        G4ReactionProduct * aNew = new G4ReactionProduct((*i)->GetDefinition());
                                                   >> 540        aNew->SetTotalEnergy((*i)->GetDefinition()->GetPDGMass());       
                                                   >> 541        aNew->SetMomentum(G4ThreeVector(0));   // see boost fro preCompoundProducts below..
                                                   >> 542        precompoundProducts->push_back(aNew);
                                                   >> 543     } else if ( theTargetList.size() > 1)
                                                   >> 544     {
                                                   >> 545        precompoundProducts = new G4ReactionProductVector();
                                                   >> 546        std::vector<G4KineticTrack *>::iterator aNuc;
                                                   >> 547        G4LorentzVector aVec;
                                                   >> 548        std::vector<G4double> masses;
                                                   >> 549        G4double sumMass(0);
                                                   >> 550        for ( aNuc=theTargetList.begin(); aNuc != theTargetList.end(); aNuc++)
                                                   >> 551        {
                                                   >> 552           G4double mass=(*aNuc)->GetDefinition()->GetPDGMass();
                                                   >> 553     masses.push_back(mass);
                                                   >> 554     sumMass += mass;
                                                   >> 555        }
                                                   >> 556        G4LorentzVector finalP=GetFinal4Momentum();
                                                   >> 557        G4FermiPhaseSpaceDecay decay;
                                                   >> 558 //       G4cout << " some neutrons? " << masses.size() <<" " << theTargetList.size()<<" "<<finalP <<" " << finalP.mag()<<G4endl;
                                                   >> 559              G4double eCMS=finalP.mag();
                                                   >> 560        if ( eCMS < sumMass )                    // @@GF --- Cheat!!
                                                   >> 561        {
                                                   >> 562           eCMS=sumMass + (2*MeV*masses.size());     
                                                   >> 563     finalP.setE(std::sqrt(finalP.vect().mag2() + sqr(eCMS)));
                                                   >> 564        }
                                                   >> 565        precompoundLorentzboost.set(finalP.boostVector());
                                                   >> 566        std::vector<G4LorentzVector*> * momenta=decay.Decay(eCMS,masses);
                                                   >> 567        std::vector<G4LorentzVector*>::iterator aMom=momenta->begin();
                                                   >> 568        for ( aNuc=theTargetList.begin(); 
                                                   >> 569             (aNuc != theTargetList.end()) && (aMom!=momenta->end()); 
                                                   >> 570       aNuc++, aMom++ )
                                                   >> 571        {
                                                   >> 572           G4ReactionProduct * aNew = new G4ReactionProduct((*aNuc)->GetDefinition());
                                                   >> 573     aNew->SetTotalEnergy((*aMom)->e());
                                                   >> 574     aNew->SetMomentum((*aMom)->vect());
                                                   >> 575     precompoundProducts->push_back(aNew);
                                                   >> 576 //    G4cout << " only neutrons? " <<  (*aNuc)->GetDefinition()->GetParticleName() << G4endl;
                                                   >> 577                 delete *aMom;
                                                   >> 578        }
                                                   >> 579        delete momenta;
                                                   >> 580     }
                                                   >> 581        }
666                                                   582 
667     products= ProductsAddPrecompound(products, << 583    } 
668                                                   584 
669 //    products=ProductsAddFakeGamma(products); << 585   {
                                                   >> 586 // fill in products the outgoing particles
                                                   >> 587      G4double Ekinout=0;
                                                   >> 588      size_t i(0);
                                                   >> 589      for(i = 0; i< theFinalState.size(); i++)
                                                   >> 590      {
                                                   >> 591        G4KineticTrack * kt = theFinalState[i];
                                                   >> 592        if(kt->GetDefinition()->IsShortLived())
                                                   >> 593        {
                                                   >> 594          G4KineticTrackVector * dec = kt->Decay();
                                                   >> 595    G4KineticTrackVector::const_iterator jter;
                                                   >> 596    for(jter=dec->begin(); jter != dec->end(); jter++)
                                                   >> 597    {
                                                   >> 598      theFinalState.push_back(*jter);
                                                   >> 599    }
                                                   >> 600    delete dec;
                                                   >> 601        }
                                                   >> 602        else
                                                   >> 603        {
                                                   >> 604    G4ReactionProduct * aNew = new G4ReactionProduct(kt->GetDefinition());
                                                   >> 605    aNew->SetMomentum(kt->Get4Momentum().vect());
                                                   >> 606    aNew->SetTotalEnergy(kt->Get4Momentum().e());
                                                   >> 607    Ekinout += aNew->GetKineticEnergy();
                                                   >> 608    if(kt->IsParticipant()) 
                                                   >> 609    {
                                                   >> 610      aNew->SetNewlyAdded(true);
                                                   >> 611    }
                                                   >> 612    else
                                                   >> 613    {
                                                   >> 614      aNew->SetNewlyAdded(false);
                                                   >> 615    }
                                                   >> 616    //G4cout << " Particle Ekin " << aNew->GetKineticEnergy() << G4endl;
                                                   >> 617    products->push_back(aNew);
670                                                   618 
                                                   >> 619    #ifdef debug_BIC_Propagate_finals
                                                   >> 620    if (! kt->GetDefinition()->GetPDGStable() )
                                                   >> 621    {
                                                   >> 622              if (kt->GetDefinition()->IsShortLived())
                                                   >> 623        {
                                                   >> 624     G4cout << "final shortlived : ";
                                                   >> 625        } else
                                                   >> 626        {
                                                   >> 627     G4cout << "final un stable : ";
                                                   >> 628        }
                                                   >> 629        G4cout <<kt->GetDefinition()->GetParticleName()<< G4endl;
                                                   >> 630    }
                                                   >> 631    #endif
                                                   >> 632        }
671                                                   633 
672     thePrimaryEscape = true;                   << 634      }
                                                   >> 635      //G4cout << " Total Ekin " << Ekinout << G4endl;
                                                   >> 636   }
                                                   >> 637 // add precompound products to products
                                                   >> 638   if ( precompoundProducts )
                                                   >> 639   {
                                                   >> 640        std::vector<G4ReactionProduct *>::iterator j;
                                                   >> 641        for(j = precompoundProducts->begin(); j != precompoundProducts->end(); ++j)
                                                   >> 642        {
                                                   >> 643 // boost back to system of moving nucleus
                                                   >> 644          G4LorentzVector pProduct((*j)->GetMomentum(),(*j)->GetTotalEnergy());
                                                   >> 645 #ifdef debug_BIC_Propagate_finals
                                                   >> 646    G4cout << " pProduct be4 boost " <<pProduct << G4endl;
                                                   >> 647 #endif
                                                   >> 648    pProduct *= precompoundLorentzboost;
                                                   >> 649 #ifdef debug_BIC_Propagate_finals
                                                   >> 650    G4cout << " pProduct aft boost " <<pProduct << G4endl;
                                                   >> 651 #endif
                                                   >> 652          (*j)->SetTotalEnergy(pProduct.e());
                                                   >> 653          (*j)->SetMomentum(pProduct.vect());
                                                   >> 654    (*j)->SetNewlyAdded(true);
                                                   >> 655    products->push_back(*j);
                                                   >> 656        }
673                                                   657 
674     #ifdef debug_BIC_return                    << 658        precompoundProducts->clear();
675     G4cout << "BIC: return @end, all ok "<< G4 << 659        delete precompoundProducts;
676     //G4cout << "  return products " << produc << 660   }
677     #endif                                     << 661   else
                                                   >> 662   {
                                                   >> 663    G4ReactionProduct * aNew=0;
                                                   >> 664 // return nucleus e and p
                                                   >> 665    if  (fragment != 0 ) {
                                                   >> 666        aNew = new G4ReactionProduct(G4Gamma::GammaDefinition());   // we only want to pass e/p
                                                   >> 667        aNew->SetMomentum(fragment->GetMomentum().vect());
                                                   >> 668        aNew->SetTotalEnergy(fragment->GetMomentum().e());
                                                   >> 669        delete fragment;
                                                   >> 670        fragment=0;
                                                   >> 671    } else if (products->size() == 0) {
                                                   >> 672    // FixMe GF: for testing without precompound, return 1 gamma of 0.01 MeV in +x
                                                   >> 673 #include "G4Gamma.hh"
                                                   >> 674        aNew = new G4ReactionProduct(G4Gamma::GammaDefinition());
                                                   >> 675        aNew->SetMomentum(G4ThreeVector(0.01*MeV,0,0));
                                                   >> 676        aNew->SetTotalEnergy(0.01*MeV);
                                                   >> 677    }
                                                   >> 678    if ( aNew != 0 ) products->push_back(aNew);
                                                   >> 679   }
678                                                   680 
679     return products;                           << 681 //  G4cerr <<"mon - end of event       "<<G4endl;
                                                   >> 682   thePrimaryEscape = true;
                                                   >> 683   return products;
680 }                                                 684 }
681                                                   685 
                                                   >> 686 
682 //--------------------------------------------    687 //----------------------------------------------------------------------------
683 G4double G4BinaryCascade::GetExcitationEnergy(    688 G4double G4BinaryCascade::GetExcitationEnergy()
684 //--------------------------------------------    689 //----------------------------------------------------------------------------
685 {                                                 690 {
686                                                   691 
687     // get A and Z for the residual nucleus    << 692   G4ping debug("debug_ExcitationEnergy");
688 #if defined(debug_G4BinaryCascade) || defined( << 693 // get A and Z for the residual nucleus
689     G4int finalA = theTargetList.size()+theCap << 694   #ifdef debug_G4BinaryCascade
690     G4int finalZ = GetTotalCharge(theTargetLis << 695   G4int finalA = theTargetList.size()+theCapturedList.size();
691     if ( (currentA - finalA) != 0 || (currentZ << 696   G4int finalZ = GetTotalCharge(theTargetList)+GetTotalCharge(theCapturedList);
692     {                                          << 697   if ( (currentA - finalA) != 0 || (currentZ - finalZ) != 0 )
693         G4cerr << "G4BIC:GetExcitationEnergy() << 698   {
694                 << "("<< currentA << "," << fi << 699      G4cerr << "G4BIC:GetExcitationEnergy(): Nucleon counting error current/final{A,Z} " 
695     }                                          << 700             << currentA << " " << finalA << " "<< currentZ << " " << finalZ << G4endl;
                                                   >> 701   }
                                                   >> 702   
                                                   >> 703   #endif
                                                   >> 704 
                                                   >> 705   G4double excitationE(0);
                                                   >> 706   G4double nucleusMass(0);
                                                   >> 707   if(currentZ>.5)
                                                   >> 708   {
                                                   >> 709      nucleusMass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(currentZ,currentA);
                                                   >> 710   } 
                                                   >> 711   else if (currentZ==0 && currentA==1 )
                                                   >> 712   {
                                                   >> 713      nucleusMass = G4Neutron::Neutron()->GetPDGMass();
                                                   >> 714   } 
                                                   >> 715   else
                                                   >> 716   {
                                                   >> 717      #ifdef debug_BinaryCascade
                                                   >> 718      G4cout << "G4BinaryCascade::GetExcitationEnergy(): Warning - invalid nucleus (A,Z)=("
                                                   >> 719       << currentA << "," << currentZ << ")" << G4endl;
                                                   >> 720      #endif
                                                   >> 721      return 0;
                                                   >> 722   }
696                                                   723 
697 #endif                                         << 724   #ifdef debug_BIC_GetExcitationEnergy
                                                   >> 725   debug.push_back("====> current A, Z");
                                                   >> 726   debug.push_back(currentZ);
                                                   >> 727   debug.push_back(currentA);
                                                   >> 728   debug.push_back(finalZ);
                                                   >> 729   debug.push_back(finalA);
                                                   >> 730   debug.push_back(nucleusMass);
                                                   >> 731   debug.push_back(GetFinalNucleusMomentum().mag());
                                                   >> 732   debug.dump();
                                                   >> 733 //  PrintKTVector(&theTargetList, std::string(" current target list info"));
                                                   >> 734   PrintKTVector(&theCapturedList, std::string(" current captured list info"));
                                                   >> 735   #endif
698                                                   736 
699     G4double excitationE(0);                   << 737   excitationE = GetFinalNucleusMomentum().mag() - nucleusMass;
700     G4double nucleusMass(0);                   << 
701     if(currentZ>.5)                            << 
702     {                                          << 
703         nucleusMass = GetIonMass(currentZ,curr << 
704     }                                          << 
705     else if (currentZ==0 )                     << 
706     {                                          << 
707         if(currentA == 1) {nucleusMass = G4Neu << 
708         else              {nucleusMass = GetFi << 
709     }                                          << 
710     else                                       << 
711     {                                          << 
712 #ifdef debug_G4BinaryCascade                   << 
713         G4cout << "G4BinaryCascade::GetExcitat << 
714                 << currentA << "," << currentZ << 
715 #endif                                         << 
716         return 0;                              << 
717     }                                          << 
718                                                   738 
719 #ifdef debug_BIC_GetExcitationEnergy              739 #ifdef debug_BIC_GetExcitationEnergy
720     G4ping debug("debug_ExcitationEnergy");    << 740 // ------ debug
721     debug.push_back("====> current A, Z");     << 741   if ( excitationE < 0 )
722     debug.push_back(currentZ);                 << 742   {
723     debug.push_back(currentA);                 << 743      G4cout << "negative ExE final Ion mass" <<nucleusMass<< G4endl;
724     debug.push_back("====> final A, Z");       << 744      G4LorentzVector Nucl_mom=GetFinalNucleusMomentum();
725     debug.push_back(finalZ);                   << 745     if(finalZ>.5) G4cout << " Final nuclmom/mass " << Nucl_mom << " " << Nucl_mom.mag()  
726     debug.push_back(finalA);                   << 746            << " (A,Z)=("<< finalA <<","<<finalZ <<")"
727     debug.push_back(nucleusMass);              << 747            << " mass " << nucleusMass << " " 
728     debug.push_back(GetFinalNucleusMomentum(). << 748                  << " excitE " << excitationE << G4endl;
729     debug.dump();                              << 
730     //  PrintKTVector(&theTargetList, std::str << 
731     //PrintKTVector(&theCapturedList, std::str << 
732 #endif                                         << 
733                                                << 
734     excitationE = GetFinalNucleusMomentum().ma << 
735                                                << 
736     //G4double exE2 = GetFinal4Momentum().mag( << 
737                                                   749 
738     //G4cout << "old/new excitE " << excitatio << 
739                                                   750 
740 #ifdef debug_BIC_GetExcitationEnergy           << 751     G4int A = the3DNucleus->GetMassNumber();
741     // ------ debug                            << 752     G4int Z = the3DNucleus->GetCharge();
742     if ( excitationE < 0 )                     << 753     G4double initialExc(0);
                                                   >> 754     if(Z>.5)
743     {                                             755     {
744         G4cout << "negative ExE final Ion mass << 756       initialExc = theInitial4Mom.mag()-
745         G4LorentzVector Nucl_mom=GetFinalNucle << 757            G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(Z, A);
746         if(finalZ>.5) G4cout << " Final nuclmo << 758      G4cout << " Initial nucleus A Z" << A << " " << Z << initialExc << G4endl; 
747                        << " (A,Z)=("<< finalA  << 
748                        << " mass " << nucleusM << 
749                        << " excitE " << excita << 
750                                                << 
751                                                << 
752         G4int A = the3DNucleus->GetMassNumber( << 
753         G4int Z = the3DNucleus->GetCharge();   << 
754         G4double initialExc(0);                << 
755         if(Z>.5)                               << 
756         {                                      << 
757             initialExc = theInitial4Mom.mag()- << 
758             G4cout << "GetExcitationEnergy: In << 
759         }                                      << 
760     }                                             759     }
                                                   >> 760   }
761                                                   761 
762 #endif                                            762 #endif
763                                                   763 
764     return excitationE;                        << 764   return excitationE;
765 }                                                 765 }
766                                                   766 
767                                                   767 
768 //--------------------------------------------    768 //----------------------------------------------------------------------------
769 //                                                769 //
770 //       P R I V A T E   M E M B E R   F U N C    770 //       P R I V A T E   M E M B E R   F U N C T I O N S
771 //                                                771 //
772 //--------------------------------------------    772 //----------------------------------------------------------------------------
773                                                   773 
774 //--------------------------------------------    774 //----------------------------------------------------------------------------
775 void G4BinaryCascade::BuildTargetList()           775 void G4BinaryCascade::BuildTargetList()
776 //--------------------------------------------    776 //----------------------------------------------------------------------------
777 {                                                 777 {
778                                                   778 
779     if(!the3DNucleus->StartLoop())             << 779   if(!the3DNucleus->StartLoop())
780     {                                          << 780   {
781         //    G4cerr << "G4BinaryCascade::Buil << 781 //    G4cerr << "G4BinaryCascade::BuildTargetList(): StartLoop() error!"
782         //     << G4endl;                      << 782 //     << G4endl;
783         return;                                << 783     return;
784     }                                          << 784   }
785                                                << 785 
786     ClearAndDestroy(&theTargetList);  // clear << 786   G4Nucleon * nucleon;
787                                                << 787   G4ParticleDefinition * definition;
788     G4Nucleon * nucleon;                       << 788   G4ThreeVector pos;
789     const G4ParticleDefinition * definition;   << 789   G4LorentzVector mom;
790     G4ThreeVector pos;                         << 790 // if there are nucleon hit by higher energy models, then SUM(momenta) != 0
791     G4LorentzVector mom;                       << 791   theInitial4Mom = G4LorentzVector(0,0,0,0);
792     // if there are nucleon hit by higher ener << 792   currentA=0;
793     initialZ=the3DNucleus->GetCharge();        << 793   currentZ=0;
794     initialA=the3DNucleus->GetMassNumber();    << 794 //  G4RKPropagation * RKprop=(G4RKPropagation *)thePropagator;
795     initial_nuclear_mass=GetIonMass(initialZ,i << 795   while((nucleon = the3DNucleus->GetNextNucleon()) != NULL)
796     theInitial4Mom = G4LorentzVector(0,0,0,ini << 796   {
797     currentA=0;                                << 797 // check if nucleon is hit by higher energy model.
798     currentZ=0;                                << 798      if ( ! nucleon->AreYouHit() )
799     while((nucleon = the3DNucleus->GetNextNucl << 799      {
800     {                                          << 800   definition = nucleon->GetDefinition();
801         // check if nucleon is hit by higher e << 801   pos = nucleon->GetPosition();
802         if ( ! nucleon->AreYouHit() )          << 802   mom = nucleon->GetMomentum();
803         {                                      << 803  //    G4cout << "Nucleus " << pos.mag()/fermi << " " << mom.e() << G4endl;
804             definition = nucleon->GetDefinitio << 804   theInitial4Mom += mom;
805             pos = nucleon->GetPosition();      << 805 //   In the kinetic Model, the potential inside the nucleus is taken into account, and nucleons
806             mom = nucleon->GetMomentum();      << 806 //    are on mass shell.
807             //    G4cout << "Nucleus " << pos. << 807   mom.setE( std::sqrt( mom.vect().mag2() + sqr(definition->GetPDGMass()) ) );
808             //theInitial4Mom += mom;           << 808   G4KineticTrack * kt = new G4KineticTrack(definition, 0., pos, mom);
809             //        the potential inside the << 809   kt->SetState(G4KineticTrack::inside);
810             mom.setE( std::sqrt( mom.vect().ma << 810   kt->SetNucleon(nucleon);
811             G4KineticTrack * kt = new G4Kineti << 811   theTargetList.push_back(kt);
812             kt->SetState(G4KineticTrack::insid << 812   ++currentA;
813             kt->SetNucleon(nucleon);           << 813   if (definition->GetPDGCharge() > .5 ) ++currentZ;
814             theTargetList.push_back(kt);       << 814      }
815             ++currentA;                        << 815   }
816             if (definition->GetPDGCharge() > . << 816   massInNucleus = 0;
817         }                                      << 817   if(currentZ>.5)
818                                                << 818   {
819 #ifdef debug_BIC_BuildTargetList               << 819      massInNucleus = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(currentZ,currentA);
820         else { G4cout << "nucleon is hit" << n << 820   } else if (currentZ==0 && currentA>=1 )
821 #endif                                         << 821   {
822     }                                          << 822      massInNucleus = currentA * G4Neutron::Neutron()->GetPDGMass();
823     massInNucleus = 0;                         << 823   } else
824     if(currentZ>.5)                            << 824   {
825     {                                          << 825      //G4cout << "G4BinaryCascade::BuildTargetList(): Warning - invalid nucleus (A,Z)=("
826         massInNucleus = GetIonMass(currentZ,cu << 826   //  << currentA << "," << currentZ << ")" << G4endl;
827     } else if (currentZ==0 && currentA>=1 )    << 827   }
828     {                                          << 828      //G4cout << "G4BinaryCascade::BuildTargetList():  nucleus (A,Z)=("
829         massInNucleus = currentA * G4Neutron:: << 829   //  << currentA << "," << currentZ << ") mass: " << massInNucleus <<
830     } else                                     << 830   //  ", theInitial4Mom " << theInitial4Mom << G4endl;
831     {                                          << 831     
832         G4cerr << "G4BinaryCascade::BuildTarge << 832   currentInitialEnergy= theInitial4Mom.e();
833                 << currentA << "," << currentZ << 833   G4KineticTrackVector::iterator i;
834         throw G4HadronicException(__FILE__, __ << 834   for(i = theProjectileList.begin() ; i != theProjectileList.end(); ++i)
835     }                                          << 835   {
836     currentInitialEnergy= theInitial4Mom.e() + << 836     currentInitialEnergy+= (*i)->GetTrackingMomentum().e();
837                                                << 837   }
838 #ifdef debug_BIC_BuildTargetList               << 838   
839     G4cout << "G4BinaryCascade::BuildTargetLis << 
840             << currentA << "," << currentZ <<  << 
841             ", theInitial4Mom " << theInitial4 << 
842             ", currentInitialEnergy " << curre << 
843 #endif                                         << 
844                                                << 
845 }                                              << 
846                                                << 
847 //-------------------------------------------- << 
848 G4bool  G4BinaryCascade::BuildLateParticleColl << 
849 //-------------------------------------------- << 
850 {                                              << 
851    G4bool success(false);                      << 
852    std::vector<G4KineticTrack *>::iterator ite << 
853                                                << 
854    lateA=lateZ=0;                              << 
855    projectileA=projectileZ=0;                  << 
856                                                << 
857    G4double StartingTime=DBL_MAX;        // Se << 
858    for(iter = secondaries->begin(); iter != se << 
859    {                                           << 
860       if((*iter)->GetFormationTime() < Startin << 
861          StartingTime = (*iter)->GetFormationT << 
862    }                                           << 
863                                                << 
864    //PrintKTVector(secondaries, "initial late  << 
865    G4LorentzVector lateParticles4Momentum(0,0, << 
866    for(iter = secondaries->begin(); iter != se << 
867    {                                           << 
868       //  G4cout << " Formation time : " << (* << 
869       //   << (*iter)->GetFormationTime() << G << 
870       G4double FormTime = (*iter)->GetFormatio << 
871       (*iter)->SetFormationTime(FormTime);     << 
872       if( (*iter)->GetState() == G4KineticTrac << 
873       {                                        << 
874          FindLateParticleCollision(*iter);     << 
875          lateParticles4Momentum += (*iter)->Ge << 
876          lateA += (*iter)->GetDefinition()->Ge << 
877          lateZ += G4lrint((*iter)->GetDefiniti << 
878          //PrintKTVector(*iter, "late particle << 
879       } else                                   << 
880       {                                        << 
881          theSecondaryList.push_back(*iter);    << 
882          //PrintKTVector(*iter, "incoming part << 
883          theProjectile4Momentum += (*iter)->Ge << 
884          projectileA += (*iter)->GetDefinition << 
885          projectileZ += G4lrint((*iter)->GetDe << 
886 #ifdef debug_BIC_Propagate                     << 
887          G4cout << " Adding initial secondary  << 
888                << " time" << (*iter)->GetForma << 
889                << ", state " << (*iter)->GetSt << 
890 #endif                                         << 
891       }                                        << 
892    }                                           << 
893    //theCollisionMgr->Print();                 << 
894    const G4HadProjectile * primary = GetPrimar << 
895                                                << 
896    if (primary){                               << 
897       G4LorentzVector mom=primary->Get4Momentu << 
898       theProjectile4Momentum += mom;           << 
899       projectileA = primary->GetDefinition()-> << 
900       projectileZ = G4lrint(primary->GetDefini << 
901       // now check if "excitation" energy left << 
902       G4double excitation= theProjectile4Momen << 
903 #ifdef debug_BIC_GetExcitationEnergy           << 
904       G4cout << "BIC: Proj.e, nucl initial, nu << 
905             << theProjectile4Momentum << ",  " << 
906             << initial_nuclear_mass<< ",  " << << 
907             << lateParticles4Momentum << G4end << 
908       G4cout << "BIC: Proj.e / initial excitat << 
909 #endif                                         << 
910       success = excitation > 0;                << 
911 #ifdef debug_G4BinaryCascade                   << 
912       if ( ! success ) {                       << 
913          G4cout << "G4BinaryCascade::BuildLate << 
914          //PrintKTVector(secondaries);         << 
915       }                                        << 
916 #endif                                         << 
917    } else {                                    << 
918       // no primary from HE model -> cascade   << 
919       success=true;                            << 
920    }                                           << 
921                                                << 
922    if (success) {                              << 
923       secondaries->clear(); // Don't leave "G4 << 
924       delete secondaries;                      << 
925    }                                           << 
926    return success;                             << 
927 }                                              << 
928                                                << 
929 //-------------------------------------------- << 
930 G4ReactionProductVector *  G4BinaryCascade::De << 
931 //-------------------------------------------- << 
932 {                                              << 
933    // find a fragment and call the precompound << 
934    G4Fragment * fragment = nullptr;            << 
935    G4ReactionProductVector * precompoundProduc << 
936                                                << 
937    G4LorentzVector pFragment(0);               << 
938    // G4cout << " final4mon " << GetFinal4Mome << 
939                                                << 
940    fragment = FindFragments();                 << 
941                                                << 
942    if(fragment)                                << 
943    {                                           << 
944       if(fragment->GetA_asInt() >1)            << 
945       {                                        << 
946          pFragment=fragment->GetMomentum();    << 
947          // G4cout << " going to preco with fr << 
948          if (theDeExcitation)                / << 
949          {                                     << 
950             precompoundProducts= theDeExcitati << 
951          }                                     << 
952          else if (theExcitationHandler)    //  << 
953          {                                     << 
954             precompoundProducts=theExcitationH << 
955          }                                     << 
956                                                << 
957       } else                                   << 
958       {                                   // f << 
959          if (theTargetList.size() + theCapture << 
960             throw G4HadronicException(__FILE__ << 
961          }                                     << 
962                                                << 
963          std::vector<G4KineticTrack *>::iterat << 
964          if ( theTargetList.size() == 1 )  {i= << 
965          if ( theCapturedList.size() == 1 ) {i << 
966          G4ReactionProduct * aNew = new G4Reac << 
967          aNew->SetTotalEnergy((*i)->GetDefinit << 
968          aNew->SetCreatorModelID(theBIC_ID);   << 
969    aNew->SetParentResonanceDef((*i)->GetParent << 
970    aNew->SetParentResonanceID((*i)->GetParentR << 
971          aNew->SetMomentum(G4ThreeVector(0));/ << 
972          precompoundProducts = new G4ReactionP << 
973          precompoundProducts->push_back(aNew); << 
974       }                            // End of f << 
975       delete fragment;                         << 
976       fragment=nullptr;                        << 
977                                                << 
978    } else                            // End of << 
979    {                                 // No fra << 
980                                                   839 
981       precompoundProducts = DecayVoidNucleus() << 
982    }                                           << 
983    #ifdef debug_BIC_DeexcitationProducts       << 
984                                                << 
985        G4LorentzVector fragment_momentum=GetFi << 
986        G4LorentzVector Preco_momentum;         << 
987        if ( precompoundProducts )              << 
988        {                                       << 
989           std::vector<G4ReactionProduct *>::it << 
990           for(j = precompoundProducts->begin() << 
991           {                                    << 
992              G4LorentzVector pProduct((*j)->Ge << 
993              Preco_momentum += pProduct;       << 
994            }                                   << 
995        }                                       << 
996        G4cout << "finalNuclMom / sum preco pro << 
997            << " delta E "<< fragment_momentum. << 
998                                                << 
999    #endif                                      << 
1000                                               << 
1001    return precompoundProducts;                << 
1002 }                                                840 }
1003                                                  841 
1004 //------------------------------------------- << 
1005 G4ReactionProductVector *  G4BinaryCascade::D << 
1006 //------------------------------------------- << 
1007 {                                             << 
1008    G4ReactionProductVector * result = nullptr << 
1009    if ( (theTargetList.size()+theCapturedList << 
1010    {                                          << 
1011       result = new G4ReactionProductVector;   << 
1012       std::vector<G4KineticTrack *>::iterator << 
1013       G4LorentzVector aVec;                   << 
1014       std::vector<G4double> masses;           << 
1015       G4double sumMass(0);                    << 
1016                                               << 
1017       if ( theTargetList.size() != 0)         << 
1018       {                                       << 
1019          for ( aNuc=theTargetList.begin(); aN << 
1020          {                                    << 
1021             G4double mass=(*aNuc)->GetDefinit << 
1022             masses.push_back(mass);           << 
1023             sumMass += mass;                  << 
1024          }                                    << 
1025       }                                       << 
1026                                               << 
1027       if ( theCapturedList.size() != 0)       << 
1028       {                                       << 
1029          for(aNuc = theCapturedList.begin();  << 
1030          {                                    << 
1031             G4double mass=(*aNuc)->GetDefinit << 
1032             masses.push_back(mass);           << 
1033             sumMass += mass;                  << 
1034          }                                    << 
1035       }                                       << 
1036                                               << 
1037       G4LorentzVector finalP=GetFinal4Momentu << 
1038       G4FermiPhaseSpaceDecay decay;           << 
1039       // G4cout << " some neutrons? " << mass << 
1040       // G4cout<< theTargetList.size()<<" "<< << 
1041                                               << 
1042       G4double eCMS=finalP.mag();             << 
1043       if ( eCMS < sumMass )                   << 
1044       {                                       << 
1045          eCMS=sumMass + 2*MeV*masses.size();  << 
1046          finalP.setE(std::sqrt(finalP.vect(). << 
1047       }                                       << 
1048                                               << 
1049       precompoundLorentzboost.set(finalP.boos << 
1050       std::vector<G4LorentzVector*> * momenta << 
1051       std::vector<G4LorentzVector*>::iterator << 
1052                                               << 
1053                                               << 
1054       if ( theTargetList.size() != 0)         << 
1055       {                                       << 
1056          for ( aNuc=theTargetList.begin();    << 
1057                (aNuc != theTargetList.end())  << 
1058                aNuc++, aMom++ )               << 
1059          {                                    << 
1060             G4ReactionProduct * aNew = new G4 << 
1061             aNew->SetTotalEnergy((*aMom)->e() << 
1062             aNew->SetMomentum((*aMom)->vect() << 
1063             aNew->SetCreatorModelID(theBIC_ID << 
1064       aNew->SetParentResonanceDef((*aNuc)->Ge << 
1065       aNew->SetParentResonanceID((*aNuc)->Get << 
1066             result->push_back(aNew);          << 
1067             delete *aMom;                     << 
1068          }                                    << 
1069       }                                       << 
1070                                               << 
1071       if ( theCapturedList.size() != 0)       << 
1072       {                                       << 
1073          for ( aNuc=theCapturedList.begin();  << 
1074                (aNuc != theCapturedList.end() << 
1075                aNuc++, aMom++ )               << 
1076          {                                    << 
1077             G4ReactionProduct * aNew = new G4 << 
1078             aNew->SetTotalEnergy((*aMom)->e() << 
1079             aNew->SetMomentum((*aMom)->vect() << 
1080             aNew->SetCreatorModelID(theBIC_ID << 
1081             aNew->SetParentResonanceDef((*aNu << 
1082             aNew->SetParentResonanceID((*aNuc << 
1083             result->push_back(aNew);          << 
1084             delete *aMom;                     << 
1085          }                                    << 
1086       }                                       << 
1087                                               << 
1088       delete momenta;                         << 
1089    }                                          << 
1090    return result;                             << 
1091 }                   // End if(!fragment)      << 
1092                                               << 
1093 //------------------------------------------- << 
1094 G4ReactionProductVector * G4BinaryCascade::Pr << 
1095 //------------------------------------------- << 
1096 {                                             << 
1097 // fill in products the outgoing particles    << 
1098     std::size_t i(0);                         << 
1099 #ifdef debug_BIC_Propagate_finals             << 
1100     G4LorentzVector mom_fs;                   << 
1101 #endif                                        << 
1102     for(i = 0; i< fs.size(); i++)             << 
1103     {                                         << 
1104         G4KineticTrack * kt = fs[i];          << 
1105         G4ReactionProduct * aNew = new G4Reac << 
1106         aNew->SetMomentum(kt->Get4Momentum(). << 
1107         aNew->SetTotalEnergy(kt->Get4Momentum << 
1108         aNew->SetNewlyAdded(kt->IsParticipant << 
1109         aNew->SetCreatorModelID(theBIC_ID);   << 
1110         aNew->SetParentResonanceDef(kt->GetPa << 
1111         aNew->SetParentResonanceID(kt->GetPar << 
1112         products->push_back(aNew);            << 
1113                                               << 
1114 #ifdef debug_BIC_Propagate_finals             << 
1115         mom_fs += kt->Get4Momentum();         << 
1116         G4cout <<kt->GetDefinition()->GetPart << 
1117         G4cout << " Particle Ekin " << aNew-> << 
1118         G4cout << ", is " << (kt->GetDefiniti << 
1119                 (kt->GetDefinition()->IsShort << 
1120         G4cout << G4endl;                     << 
1121 #endif                                        << 
1122                                               << 
1123     }                                         << 
1124 #ifdef debug_BIC_Propagate_finals             << 
1125     G4cout << " Final state momentum " << mom << 
1126 #endif                                        << 
1127                                                  842 
1128     return products;                          << 
1129 }                                             << 
1130 //-------------------------------------------    843 //----------------------------------------------------------------------------
1131 G4ReactionProductVector * G4BinaryCascade::Pr << 844 void  G4BinaryCascade::FindCollisions(G4KineticTrackVector * secondaries)
1132 //-------------------------------------------    845 //----------------------------------------------------------------------------
1133 {                                                846 {
1134    G4LorentzVector pSumPreco(0), pPreco(0);   << 847   for(std::vector<G4KineticTrack *>::iterator i = secondaries->begin();
1135                                               << 848      i != secondaries->end(); ++i)
1136    if ( precompoundProducts )                 << 849   {
1137    {                                          << 850     if ( (*i)->GetTrackingMomentum().mag2() < -1.*eV )
1138       for(auto j = precompoundProducts->cbegi << 851     {
                                                   >> 852       G4cout << "G4BinaryCascade::FindCollisions(): negative m2:" << (*i)->GetTrackingMomentum().mag2() << G4endl;
                                                   >> 853     } 
                                                   >> 854 for(std::vector<G4BCAction *>::iterator j = theImR.begin();
                                                   >> 855         j!=theImR.end(); j++)
                                                   >> 856     {
                                                   >> 857       const std::vector<G4CollisionInitialState *> & aCandList
                                                   >> 858           = (*j)->GetCollisions(*i, theTargetList, theCurrentTime);
                                                   >> 859       for(size_t count=0; count<aCandList.size(); count++)
1139       {                                          860       {
1140          // boost back to system of moving nu << 861         theCollisionMgr->AddCollision(aCandList[count]);
1141          G4LorentzVector pProduct((*j)->GetMo << 
1142          pPreco+= pProduct;                   << 
1143 #ifdef debug_BIC_Propagate_finals             << 
1144          G4cout << "BIC: pProduct be4 boost " << 
1145 #endif                                        << 
1146          pProduct *= precompoundLorentzboost; << 
1147 #ifdef debug_BIC_Propagate_finals             << 
1148          G4cout << "BIC: pProduct aft boost " << 
1149 #endif                                        << 
1150          pSumPreco += pProduct;               << 
1151          (*j)->SetTotalEnergy(pProduct.e());  << 
1152          (*j)->SetMomentum(pProduct.vect());  << 
1153          (*j)->SetNewlyAdded(true);           << 
1154          products->push_back(*j);             << 
1155       }                                          862       }
1156       // G4cout << " unboosted preco result m << 
1157       // G4cout << " preco result mom " << pS << 
1158       precompoundProducts->clear();           << 
1159       delete precompoundProducts;             << 
1160    }                                          << 
1161    return products;                           << 
1162 }                                             << 
1163 //------------------------------------------- << 
1164 void  G4BinaryCascade::FindCollisions(G4Kinet << 
1165 //------------------------------------------- << 
1166 {                                             << 
1167     for(auto i=secondaries->cbegin(); i!=seco << 
1168     {                                         << 
1169         for(auto j=theImR.cbegin(); j!=theImR << 
1170         {                                     << 
1171             //      G4cout << "G4BinaryCascad << 
1172             const std::vector<G4CollisionInit << 
1173             = (*j)->GetCollisions(*i, theTarg << 
1174             for(std::size_t count=0; count<aC << 
1175             {                                 << 
1176                 theCollisionMgr->AddCollision << 
1177                 //4cout << "================= << 
1178                 //theCollisionMgr->Print();   << 
1179             }                                 << 
1180         }                                     << 
1181     }                                            863     }
                                                   >> 864   }
1182 }                                                865 }
1183                                                  866 
1184                                               << 
1185 //-------------------------------------------    867 //----------------------------------------------------------------------------
1186 void  G4BinaryCascade::FindDecayCollision(G4K    868 void  G4BinaryCascade::FindDecayCollision(G4KineticTrack * secondary)
1187 //-------------------------------------------    869 //----------------------------------------------------------------------------
1188 {                                                870 {
1189     const auto& aCandList = theDecay->GetColl << 871     if ( secondary->GetTrackingMomentum().mag2() < -1.*eV )
1190     for(std::size_t count=0; count<aCandList. << 
1191     {                                         << 
1192         theCollisionMgr->AddCollision(aCandLi << 
1193     }                                         << 
1194 }                                             << 
1195                                               << 
1196 //------------------------------------------- << 
1197 void  G4BinaryCascade::FindLateParticleCollis << 
1198 //------------------------------------------- << 
1199 {                                             << 
1200                                               << 
1201     G4double tin=0., tout=0.;                 << 
1202     if (((G4RKPropagation*)thePropagator)->Ge << 
1203     {                                            872     {
1204         if ( tin > 0 )                        << 873       G4cout << "G4BinaryCascade::FindDecayCollision(): negative m2:" << secondary->GetTrackingMomentum().mag2() << G4endl;
1205         {                                     << 874     } 
1206             secondary->SetState(G4KineticTrac << 875     const std::vector<G4CollisionInitialState *> & aCandList
1207         } else if ( tout > 0 )                << 876         = theDecay->GetCollisions(secondary, theTargetList, theCurrentTime);
1208         {                                     << 877     for(size_t count=0; count<aCandList.size(); count++)
1209             secondary->SetState(G4KineticTrac << 
1210         } else {                              << 
1211             //G4cout << "G4BC set miss , tin, << 
1212             secondary->SetState(G4KineticTrac << 
1213         }                                     << 
1214     } else {                                  << 
1215         secondary->SetState(G4KineticTrack::m << 
1216         //G4cout << "G4BC set miss ,no inters << 
1217     }                                         << 
1218                                               << 
1219                                               << 
1220 #ifdef debug_BIC_FindCollision                << 
1221     G4cout << "FindLateP Particle, 4-mom, tim << 
1222             << secondary->GetDefinition()->Ge << 
1223             << secondary->Get4Momentum()      << 
1224             << " times " <<  tin << " " << to << 
1225             << secondary->GetState() << G4end << 
1226 #endif                                        << 
1227                                               << 
1228     const auto& aCandList = theLateParticle-> << 
1229     for(std::size_t count=0; count<aCandList. << 
1230     {                                            878     {
1231 #ifdef debug_BIC_FindCollision                << 879       theCollisionMgr->AddCollision(aCandList[count]);
1232         G4cout << " Adding a late Col : " <<  << 
1233 #endif                                        << 
1234         theCollisionMgr->AddCollision(aCandLi << 
1235     }                                            880     }
1236 }                                                881 }
1237                                                  882 
1238                                                  883 
1239 //-------------------------------------------    884 //----------------------------------------------------------------------------
1240 G4bool G4BinaryCascade::ApplyCollision(G4Coll    885 G4bool G4BinaryCascade::ApplyCollision(G4CollisionInitialState * collision)
1241 //-------------------------------------------    886 //----------------------------------------------------------------------------
1242 {                                                887 {
1243     G4KineticTrack * primary = collision->Get << 888   G4ping debug("debug_ApplyCollision");
1244                                               << 889   //G4cerr << "G4BinaryCascade::ApplyCollision start"<<G4endl;
1245 #ifdef debug_BIC_ApplyCollision               << 890   G4KineticTrack * primary = collision->GetPrimary();
1246     G4cerr << "G4BinaryCascade::ApplyCollisio << 891   if(primary->GetState() != G4KineticTrack::inside)
1247     theCollisionMgr->Print();                 << 892   {
1248     G4cout << "ApplyCollisions : projte 4mom  << 893 #ifdef debug_BinaryCascade
1249 #endif                                        << 894      G4cout << "G4BinaryCasacde::ApplyCollision(): StateError (ignored)" << primary << G4endl;
1250                                               << 895      G4KineticTrackVector debug;
1251     G4KineticTrackVector target_collection=co << 896      debug.push_back(primary);
1252     G4bool haveTarget=target_collection.size( << 897      PrintKTVector(&debug,std::string("primay- target"));
1253     if( haveTarget && (primary->GetState() != << 898      throw G4HadronicException(__FILE__, __LINE__, "G4BinaryCasacde::ApplyCollision()");
1254     {                                         << 899 #else
1255 #ifdef debug_G4BinaryCascade                  << 900      return false;
1256         G4cout << "G4BinaryCasacde::ApplyColl << 
1257         PrintKTVector(primary,std::string("pr << 
1258         PrintKTVector(&target_collection,std: << 
1259         collision->Print();                   << 
1260         G4cout << G4endl;                     << 
1261         theCollisionMgr->Print();             << 
1262         //*GF*     throw G4HadronicException( << 
1263 #endif                                           901 #endif
1264         return false;                         << 902   }
1265 //    } else {                                << 
1266 //       G4cout << "G4BinaryCasacde::ApplyCol << 
1267 //       PrintKTVector(primary,std::string("p << 
1268 //       G4double tin=0., tout=0.;            << 
1269 //       if (((G4RKPropagation*)thePropagator << 
1270 //       {                                    << 
1271 //           G4cout << "tin tout: " << tin << << 
1272 //       }                                    << 
1273                                               << 
1274     }                                         << 
1275                                               << 
1276     G4LorentzVector mom4Primary=primary->Get4 << 
1277                                               << 
1278     G4int initialBaryon(0);                   << 
1279     G4int initialCharge(0);                   << 
1280     if (primary->GetState() == G4KineticTrack << 
1281     {                                         << 
1282         initialBaryon = primary->GetDefinitio << 
1283         initialCharge = G4lrint(primary->GetD << 
1284     }                                         << 
1285                                               << 
1286     // for primary resonances, subtract neutr << 
1287     G4double initial_Efermi=CorrectShortlived << 
1288     //*************************************** << 
1289                                               << 
1290                                               << 
1291     G4KineticTrackVector * products = collisi << 
1292                                                  903 
                                                   >> 904   G4RKPropagation * RKprop=(G4RKPropagation *)thePropagator;
                                                   >> 905  
1293 #ifdef debug_BIC_ApplyCollision                  906 #ifdef debug_BIC_ApplyCollision
1294     DebugApplyCollisionFail(collision, produc << 907 //      G4cout << "ApplyCollisions : projte 4mom " << primary->GetTrackingMomentum()<< G4endl;
1295 #endif                                        << 
1296                                               << 
1297     // reset primary to initial state, in cas << 
1298     primary->Set4Momentum(mom4Primary);       << 
1299                                               << 
1300     G4bool lateParticleCollision= (!haveTarge << 
1301     G4bool decayCollision= (!haveTarget) && p << 
1302     G4bool Success(true);                     << 
1303                                               << 
1304                                               << 
1305 #ifdef debug_G4BinaryCascade                  << 
1306     G4int lateBaryon(0), lateCharge(0);       << 
1307 #endif                                        << 
1308                                               << 
1309     if ( lateParticleCollision )              << 
1310     {  // for late particles, reset charges   << 
1311         //G4cout << "lateP, initial B C state << 
1312         //        << initialCharge<< " " << p << 
1313 #ifdef debug_G4BinaryCascade                  << 
1314         lateBaryon = initialBaryon;           << 
1315         lateCharge = initialCharge;           << 
1316 #endif                                           908 #endif
1317         initialBaryon=initialCharge=0;        << 
1318         lateA -= primary->GetDefinition()->Ge << 
1319         lateZ -= G4lrint(primary->GetDefiniti << 
1320     }                                         << 
1321                                                  909 
1322     initialBaryon += collision->GetTargetBary << 910   G4int initialBaryon = primary->GetDefinition()->GetBaryonNumber();
1323     initialCharge += G4lrint(collision->GetTa << 911   G4int initialCharge(0);
1324     if (!lateParticleCollision)               << 912   initialCharge+=G4lrint(primary->GetDefinition()->GetPDGCharge());
1325     {                                         << 913 
1326        if( !products || products->size()==0 | << 914 // for primary resonances, subtract neutron ( = proton) field ( ie. add std::abs(field))
1327        {                                      << 915   G4int PDGcode=std::abs(primary->GetDefinition()->GetPDGEncoding());
1328 #ifdef debug_BIC_ApplyCollision               << 916   G4LorentzVector mom4Primary=primary->Get4Momentum();
1329           if (products) G4cout << " ======Fai << 917   G4double initial_Efermi=RKprop->GetField(primary->GetDefinition()->GetPDGEncoding(),primary->GetPosition());
1330           G4cerr << "G4BinaryCascade::ApplyCo << 918   if ( PDGcode > 1000 && PDGcode != 2112 && PDGcode != 2212 )
1331 #endif                                        << 919   {
1332           Success=false;                      << 920      initial_Efermi = RKprop->GetField(G4Neutron::Neutron()->GetPDGEncoding(),primary->GetPosition());
                                                   >> 921      primary->Update4Momentum(mom4Primary.e() - initial_Efermi);
                                                   >> 922   }
                                                   >> 923   G4KineticTrackVector target_collection=collision->GetTargetCollection();
                                                   >> 924   std::vector<G4KineticTrack *>::iterator titer;
                                                   >> 925   for ( titer=target_collection.begin() ; titer!=target_collection.end(); ++titer)
                                                   >> 926   {
                                                   >> 927      initial_Efermi+= RKprop->GetField((*titer)->GetDefinition()->GetPDGEncoding(),(*titer)->GetPosition());
                                                   >> 928   }
                                                   >> 929 
                                                   >> 930   G4KineticTrackVector * products=0;
                                                   >> 931   products = collision->GetFinalState();
                                                   >> 932   
                                                   >> 933   // reset primary to initial state
                                                   >> 934   primary->Set4Momentum(mom4Primary);
                                                   >> 935 
                                                   >> 936   initialBaryon += collision->GetTargetBaryonNumber();
                                                   >> 937   initialCharge+=G4lrint(collision->GetTargetCharge()); 
                                                   >> 938   
                                                   >> 939   if(!products || products->size()==0 || !CheckPauliPrinciple(products))
                                                   >> 940   {
                                                   >> 941    #ifdef debug_BIC_ApplyCollision
                                                   >> 942      if (products) G4cout << " ======Failed Pauli =====" << G4endl;
                                                   >> 943      G4cerr << "G4BinaryCascade::ApplyCollision blocked"<<G4endl;
                                                   >> 944    #endif
                                                   >> 945      if (products) ClearAndDestroy(products);
                                                   >> 946      if (target_collection.size() == 0 ) FindDecayCollision(primary);  // for decay, sample new decay
                                                   >> 947      delete products;
                                                   >> 948      return false;
                                                   >> 949   }
                                                   >> 950 
                                                   >> 951    G4double final_Efermi(0);
                                                   >> 952    G4KineticTrackVector resonances;
                                                   >> 953    for ( std::vector<G4KineticTrack *>::iterator i =products->begin(); i != products->end(); i++)
                                                   >> 954    {
                                                   >> 955        G4int PDGcode=std::abs((*i)->GetDefinition()->GetPDGEncoding());
                                                   >> 956        final_Efermi+=RKprop->GetField(PDGcode,(*i)->GetPosition());
                                                   >> 957        if ( PDGcode > 1000 && PDGcode != 2112 && PDGcode != 2212 )
                                                   >> 958        {  
                                                   >> 959     resonances.push_back(*i);
1333        }                                         960        }
                                                   >> 961    }  
                                                   >> 962    if ( resonances.size() > 0 ) 
                                                   >> 963    {  
                                                   >> 964       G4double delta_Fermi= (initial_Efermi-final_Efermi)/resonances.size();
                                                   >> 965       for (std::vector<G4KineticTrack *>::iterator res=resonances.begin(); res != resonances.end(); res++)
                                                   >> 966       {
                                                   >> 967     G4LorentzVector mom=(*res)->Get4Momentum();
                                                   >> 968     G4double mass2=mom.mag2();
                                                   >> 969     G4double newEnergy=mom.e() + delta_Fermi;
                                                   >> 970     G4double newEnergy2= newEnergy*newEnergy;
                                                   >> 971     if ( newEnergy2 < mass2 )
                                                   >> 972     {
                                                   >> 973              ClearAndDestroy(products);
                                                   >> 974              if (target_collection.size() == 0 ) FindDecayCollision(primary);  // for decay, sample new decay
                                                   >> 975        delete products;
                                                   >> 976        return false;
                                                   >> 977     }
                                                   >> 978 //    G4cout << " correct resonance from /to " << mom.e() << " / " << newEnergy<< G4endl;
                                                   >> 979     G4ThreeVector mom3=std::sqrt(newEnergy2 - mass2) * mom.vect().unit();
                                                   >> 980     (*res)->Set4Momentum(G4LorentzVector(mom3,newEnergy));
                                                   >> 981       }
                                                   >> 982    }
1334                                                  983 
                                                   >> 984       
1335                                                  985 
1336                                                  986 
1337        if (Success && primary->GetState() ==  << 
1338           if (! CorrectShortlivedFinalsForFer << 
1339              Success=false;                   << 
1340           }                                   << 
1341        }                                      << 
1342     }                                         << 
1343                                                  987 
                                                   >> 988 // debug block
1344 #ifdef debug_BIC_ApplyCollision                  989 #ifdef debug_BIC_ApplyCollision
1345     DebugApplyCollision(collision, products); << 990   G4KineticTrackVector debug1;
1346 #endif                                        << 991   debug1.push_back(collision->GetPrimary());
1347                                               << 992   PrintKTVector(&debug1,std::string(" Primary particle"));
1348     if ( ! Success ){                         << 993   PrintKTVector(&collision->GetTargetCollection(),std::string(" Target particles"));
1349         if (products) ClearAndDestroy(product << 994   PrintKTVector(products,std::string(" Scatterer products"));
1350         if ( decayCollision ) FindDecayCollis << 995   
1351         delete products;                      << 996   G4double thisExcitation(0);
1352         products=nullptr;                     << 997 //  excitation energy from this collision
1353         return false;                         << 998 //  initial state:
1354     }                                         << 999   G4double initial(0);
1355                                               << 1000   G4KineticTrack * kt=collision->GetPrimary();
1356     G4int finalBaryon(0);                     << 1001   initial +=  kt->Get4Momentum().e();
1357     G4int finalCharge(0);                     << 1002   
1358     G4KineticTrackVector toFinalState;        << 1003   initial +=  RKprop->GetField(kt->GetDefinition()->GetPDGEncoding(),kt->GetPosition());
1359     for(auto i=products->cbegin(); i!=product << 1004   initial -=  RKprop->GetBarrier(kt->GetDefinition()->GetPDGEncoding());
1360     {                                         << 1005   G4cout << "prim. E/field/Barr/Sum " << kt->Get4Momentum().e()
1361         if ( ! lateParticleCollision )        << 1006           << " " << RKprop->GetField(kt->GetDefinition()->GetPDGEncoding(),kt->GetPosition())
1362         {                                     << 1007           << " " << RKprop->GetBarrier(kt->GetDefinition()->GetPDGEncoding()) 
1363             (*i)->SetState(primary->GetState( << 1008     << " " << initial << G4endl;;
1364             if ( (*i)->GetState() == G4Kineti << 1009   
1365                 finalBaryon+=(*i)->GetDefinit << 1010   G4KineticTrackVector ktv=collision->GetTargetCollection();
1366                 finalCharge+=G4lrint((*i)->Ge << 1011   for ( unsigned int it=0; it < ktv.size(); it++)
1367             } else {                          << 1012   {
1368                G4double tin=0., tout=0.;      << 1013      kt=ktv[it];
1369                if (((G4RKPropagation*)theProp << 1014      initial +=  kt->Get4Momentum().e();
1370                      tin < 0 && tout > 0 )    << 1015      thisExcitation += kt->GetDefinition()->GetPDGMass() 
1371                {                              << 1016              - kt->Get4Momentum().e() 
1372                   PrintKTVector((*i),"particl << 1017          - RKprop->GetField(kt->GetDefinition()->GetPDGEncoding(),kt->GetPosition());
1373                    G4cout << "tin tout: " <<  << 1018 //     initial +=  RKprop->GetField(kt->GetDefinition()->GetPDGEncoding(),kt->GetPosition());
1374                }                              << 1019 //     initial -=  RKprop->GetBarrier(kt->GetDefinition()->GetPDGEncoding());
1375             }                                 << 1020   G4cout << "Targ. def/E/field/Barr/Sum " <<  kt->GetDefinition()->GetPDGEncoding()
1376         } else {                              << 1021       << " " << kt->Get4Momentum().e()
1377             G4double tin=0., tout=0.;         << 1022           << " " << RKprop->GetField(kt->GetDefinition()->GetPDGEncoding(),kt->GetPosition())
1378             if (((G4RKPropagation*)thePropaga << 1023           << " " << RKprop->GetBarrier(kt->GetDefinition()->GetPDGEncoding()) 
1379             {                                 << 1024     << " " << initial <<" Excit " << thisExcitation << G4endl;;
1380                 //G4cout << "tin tout: " << t << 1025   }
1381                 if ( tin > 0 )                << 1026   
1382                 {                             << 1027   G4double final(0);
1383                     (*i)->SetState(G4KineticT << 1028   G4double mass_out(0);
1384                 }                             << 1029   G4int product_barions(0);
1385                 else if ( tout > 0 )          << 1030   for ( unsigned int it=0; it < products->size(); it++)
1386                 {                             << 1031   {
1387                     (*i)->SetState(G4KineticT << 1032      kt=(*products)[it];
1388                     finalBaryon+=(*i)->GetDef << 1033      final +=  kt->Get4Momentum().e();
1389                     finalCharge+=G4lrint((*i) << 1034      final +=  RKprop->GetField(kt->GetDefinition()->GetPDGEncoding(),kt->GetPosition());
1390                 }                             << 1035      final +=  RKprop->GetBarrier(kt->GetDefinition()->GetPDGEncoding());
1391                 else                          << 1036      if ( kt->GetDefinition()->GetBaryonNumber()==1 ) product_barions++;
1392                 {                             << 1037      mass_out += kt->GetDefinition()->GetPDGMass();
1393                     (*i)->SetState(G4KineticT << 1038   G4cout << "sec. def/E/field/Barr/Sum " << kt->GetDefinition()->GetPDGEncoding()
1394                     toFinalState.push_back((* << 1039       << " " << kt->Get4Momentum().e()
1395                 }                             << 1040           << " " << RKprop->GetField(kt->GetDefinition()->GetPDGEncoding(),kt->GetPosition())
1396             } else                            << 1041           << " " << RKprop->GetBarrier(kt->GetDefinition()->GetPDGEncoding()) 
1397             {                                 << 1042     << " " << final << G4endl;;
1398                 (*i)->SetState(G4KineticTrack << 1043   }
1399                 //G4cout << " G4BC - miss -la << 1044 
1400                 toFinalState.push_back((*i)); << 1045 
1401             }                                 << 1046   G4int finalA = currentA - product_barions;
1402                                               << 1047   G4int finalZ = currentZ - GetTotalCharge(*products);
1403         }                                     << 1048   G4double delta = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(currentZ,currentA) 
1404     }                                         << 1049                    - (G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(finalZ,finalA) 
1405     if(!toFinalState.empty())                 << 1050            + mass_out); 
1406     {                                         << 1051   G4cout << " current/final a,z " << currentA << " " << currentZ << " "<< finalA<< " "<< finalZ 
1407         theFinalState.insert(theFinalState.ce << 1052         <<  " delta-mass " << delta<<G4endl;
1408                 toFinalState.cbegin(),toFinal << 1053   final+=delta;
1409         std::vector<G4KineticTrack *>::iterat << 1054     mass_out  = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(finalZ,finalA);
1410         for(auto iter1=toFinalState.cbegin(); << 1055   G4cout << " initE/ E_out/ Mfinal/ Excit " << currentInitialEnergy
1411         {                                     << 1056          << " " <<   final << " "
1412             iter2 = std::find(products->begin << 1057    <<  mass_out<<" " 
1413             if ( iter2 != products->cend() )  << 1058    <<  currentInitialEnergy - final - mass_out
1414         }                                     << 1059    << G4endl;
1415         theCollisionMgr->RemoveTracksCollisio << 1060    currentInitialEnergy-=final;  
1416     }                                         << 1061 #endif
1417                                               << 1062 
1418     //G4cout << " currentA, Z be4: " << curre << 1063   G4int finalBaryon(0);
1419     currentA += finalBaryon-initialBaryon;    << 1064   G4int finalCharge(0);
1420     currentZ += finalCharge-initialCharge;    << 1065   for(size_t ig=0;ig<products->size();ig++)
1421     //G4cout << " ApplyCollision currentA, Z  << 1066   {
1422                                               << 1067     finalBaryon+=products->operator[](ig)->GetDefinition()->GetBaryonNumber();
1423     G4KineticTrackVector oldSecondaries;      << 1068     finalCharge+=G4lrint(products->operator[](ig)->GetDefinition()->GetPDGCharge());
1424     oldSecondaries.push_back(primary);        << 1069 // secondaries are created inside nucleus
1425     primary->Hit();                           << 1070     products->operator[](ig)->SetState(G4KineticTrack::inside);
1426                                               << 1071   }
                                                   >> 1072 
                                                   >> 1073   currentA += finalBaryon-initialBaryon;
                                                   >> 1074   currentZ += finalCharge-initialCharge;
                                                   >> 1075   
                                                   >> 1076   G4KineticTrackVector oldSecondaries;
                                                   >> 1077   oldSecondaries.push_back(primary);
1427 #ifdef debug_G4BinaryCascade                     1078 #ifdef debug_G4BinaryCascade
1428     if ( (finalBaryon-initialBaryon-lateBaryo << 1079   if ( (finalBaryon-initialBaryon) != 0 || (finalCharge-initialCharge) != 0 ) 
1429     {                                         << 1080      {
1430         G4cout << "G4BinaryCascade: Error in     1081         G4cout << "G4BinaryCascade: Error in Balancing: " << G4endl;
1431         G4cout << "initial/final baryon numbe    1082         G4cout << "initial/final baryon number, initial/final Charge "
1432                 << initialBaryon <<" "<< fina << 1083             << initialBaryon <<" "<< finalBaryon <<" "
1433                 << initialCharge <<" "<< fina << 1084       << initialCharge <<" "<< finalCharge <<" "
1434                 << " in Collision type: "<< t << 1085       << " in Collision type: "<< typeid(*collision->GetGenerator()).name()
1435                 << ", with number of products << 1086       << ", with number of products: "<< products->size() <<G4endl;
1436         G4cout << G4endl<<"Initial condition  << 1087        G4cout << G4endl<<"Initial condition are these:"<<G4endl;
1437         G4cout << "proj: "<<collision->GetPri << 1088        G4cout << "proj: "<<collision->GetPrimary()->GetDefinition()->GetParticleName()<<G4endl;
1438         for(std::size_t it=0; it<collision->G << 1089        for(size_t it=0; it<collision->GetTargetCollection().size(); it++)
1439         {                                     << 1090        {
1440             G4cout << "targ: "                << 1091          G4cout << "targ: "
1441                     <<collision->GetTargetCol << 1092         <<collision->GetTargetCollection()[it]->GetDefinition()->GetParticleName()<<G4endl;
1442         }                                     << 1093        }
1443         PrintKTVector(&collision->GetTargetCo << 1094        PrintKTVector(&collision->GetTargetCollection(),std::string(" Target particles"));
1444         G4cout << G4endl<<G4endl;             << 1095        G4cout << G4endl<<G4endl;
1445     }                                         << 1096      }
1446 #endif                                        << 1097 #endif
1447                                               << 1098 
1448     G4KineticTrackVector oldTarget = collisio << 1099   G4KineticTrackVector oldTarget = collision->GetTargetCollection();
1449     for(std::size_t ii=0; ii< oldTarget.size( << 1100   primary->Hit();
1450     {                                         << 1101   for(size_t ii=0; ii< oldTarget.size(); ii++)
1451         oldTarget[ii]->Hit();                 << 1102   {
1452     }                                         << 1103     oldTarget[ii]->Hit();
1453                                               << 1104   }
1454     UpdateTracksAndCollisions(&oldSecondaries << 1105 
1455     std::for_each(oldSecondaries.cbegin(), ol << 1106   debug.push_back("=======> we have hit nucleons <=======");
1456     std::for_each(oldTarget.cbegin(), oldTarg << 1107   
                                                   >> 1108   UpdateTracksAndCollisions(&oldSecondaries, &oldTarget, products);
                                                   >> 1109   std::for_each(oldSecondaries.begin(), oldSecondaries.end(), Delete<G4KineticTrack>()); 
                                                   >> 1110   std::for_each(oldTarget.begin(), oldTarget.end(), Delete<G4KineticTrack>()); 
1457                                                  1111 
1458     delete products;                          << 1112   delete products;
1459     return true;                              << 1113   return true;
1460 }                                                1114 }
1461                                                  1115 
1462                                                  1116 
1463 //-------------------------------------------    1117 //----------------------------------------------------------------------------
1464 G4bool G4BinaryCascade::Absorb()                 1118 G4bool G4BinaryCascade::Absorb()
1465 //-------------------------------------------    1119 //----------------------------------------------------------------------------
1466 {                                                1120 {
1467     // Do it in two step: cannot change theSe << 1121 // Do it in two step: cannot change theSecondaryList inside the first loop.
1468     G4Absorber absorber(theCutOnPAbsorb);     << 1122   G4Absorber absorber(theCutOnPAbsorb);
1469                                               << 
1470     // Build the vector of G4KineticTracks th << 
1471     G4KineticTrackVector absorbList;          << 
1472     std::vector<G4KineticTrack *>::const_iter << 
1473     //  PrintKTVector(&theSecondaryList, " te << 
1474     for(iter = theSecondaryList.cbegin();     << 
1475             iter != theSecondaryList.cend();  << 
1476     {                                         << 
1477         G4KineticTrack * kt = *iter;          << 
1478         if(kt->GetState() == G4KineticTrack:: << 
1479         {                                     << 
1480             if(absorber.WillBeAbsorbed(*kt))  << 
1481             {                                 << 
1482                 absorbList.push_back(kt);     << 
1483             }                                 << 
1484         }                                     << 
1485     }                                         << 
1486                                                  1123 
1487     if(absorbList.empty())                    << 1124 // Build the vector of G4KineticTracks that must be absorbed
1488         return false;                         << 1125   G4KineticTrackVector absorbList;
1489                                               << 1126   std::vector<G4KineticTrack *>::iterator iter;
1490     G4KineticTrackVector toDelete;            << 1127   for(iter = theSecondaryList.begin();
1491     for(iter = absorbList.cbegin(); iter != a << 1128       iter != theSecondaryList.end(); ++iter)
1492     {                                         << 1129   {
1493         G4KineticTrack * kt = *iter;          << 1130      G4KineticTrack * kt = *iter;
1494         if(!absorber.FindAbsorbers(*kt, theTa << 1131      if(kt->GetState() == G4KineticTrack::inside)// absorption happens only inside the nucleus
1495             throw G4HadronicException(__FILE_ << 1132      {
                                                   >> 1133   if(absorber.WillBeAbsorbed(*kt))
                                                   >> 1134   {
                                                   >> 1135      absorbList.push_back(kt);
                                                   >> 1136   }
                                                   >> 1137      }
                                                   >> 1138   }
1496                                                  1139 
1497         if(!absorber.FindProducts(*kt))       << 1140   if(absorbList.empty())
1498             throw G4HadronicException(__FILE_ << 1141     return false;
1499                                                  1142 
1500         G4KineticTrackVector * products = abs << 1143   G4KineticTrackVector toDelete;
1501         G4int maxLoopCount = 1000;            << 1144   for(iter = absorbList.begin(); iter != absorbList.end(); ++iter)
1502         while(!CheckPauliPrinciple(products)  << 1145   {
1503         {                                     << 1146     G4KineticTrack * kt = *iter;
1504             ClearAndDestroy(products);        << 1147     if(!absorber.FindAbsorbers(*kt, theTargetList))
1505             if(!absorber.FindProducts(*kt))   << 1148       throw G4HadronicException(__FILE__, __LINE__, "G4BinaryCascade::Absorb(): Cannot absorb a particle.");
1506                 throw G4HadronicException(__F << 1149 
1507                         "G4BinaryCascade::Abs << 1150     if(!absorber.FindProducts(*kt))
1508         }                                     << 1151       throw G4HadronicException(__FILE__, __LINE__, "G4BinaryCascade::Absorb(): Cannot absorb a particle.");
1509       if ( --maxLoopCount < 0 ) throw G4Hadro << 1152 
1510         // ------ debug                       << 1153     G4KineticTrackVector * products = absorber.GetProducts();
1511         //    G4cerr << "Absorb CheckPauliPri << 1154 // ------ debug
1512         // ------ end debug                   << 1155     G4int count = 0;
1513         G4KineticTrackVector toRemove;  // bu << 1156 // ------ end debug
1514         toRemove.push_back(kt);               << 1157     while(!CheckPauliPrinciple(products))
1515         toDelete.push_back(kt);  // delete th << 1158     {
1516         G4KineticTrackVector * absorbers = ab << 1159 // ------ debug
1517         UpdateTracksAndCollisions(&toRemove,  << 1160       count++;
1518         ClearAndDestroy(absorbers);           << 1161 // ------ end debug
1519     }                                         << 1162       ClearAndDestroy(products);
1520     ClearAndDestroy(&toDelete);               << 1163       if(!absorber.FindProducts(*kt))
1521     return true;                              << 1164   throw G4HadronicException(__FILE__, __LINE__, 
                                                   >> 1165     "G4BinaryCascade::Absorb(): Cannot absorb a particle.");
                                                   >> 1166     }
                                                   >> 1167 // ------ debug
                                                   >> 1168 //    G4cerr << "Absorb CheckPauliPrinciple count= " <<  count << G4endl;
                                                   >> 1169 // ------ end debug
                                                   >> 1170     G4KineticTrackVector toRemove;  // build a vector for UpdateTrack...
                                                   >> 1171     toRemove.push_back(kt);
                                                   >> 1172     toDelete.push_back(kt);  // delete the track later
                                                   >> 1173     G4KineticTrackVector * absorbers = absorber.GetAbsorbers();
                                                   >> 1174     UpdateTracksAndCollisions(&toRemove, absorbers, products);
                                                   >> 1175     ClearAndDestroy(absorbers);
                                                   >> 1176   }
                                                   >> 1177   ClearAndDestroy(&toDelete);
                                                   >> 1178   return true;
1522 }                                                1179 }
1523                                                  1180 
1524                                                  1181 
1525                                                  1182 
1526 // Capture all p and n with Energy < theCutOn    1183 // Capture all p and n with Energy < theCutOnP
1527 //-------------------------------------------    1184 //----------------------------------------------------------------------------
1528 G4bool G4BinaryCascade::Capture(G4bool verbos    1185 G4bool G4BinaryCascade::Capture(G4bool verbose)
1529 //-------------------------------------------    1186 //----------------------------------------------------------------------------
1530 {                                                1187 {
1531     G4KineticTrackVector captured;            << 1188   G4KineticTrackVector captured;
1532     G4bool capture = false;                   << 1189   G4bool capture = false;
1533     std::vector<G4KineticTrack *>::const_iter << 1190   std::vector<G4KineticTrack *>::iterator i;
1534                                               << 1191 
1535     G4RKPropagation * RKprop=(G4RKPropagation << 1192   G4RKPropagation * RKprop=(G4RKPropagation *)thePropagator;
1536                                               << 1193 
1537     G4double capturedEnergy = 0;              << 1194   G4double capturedEnergy = 0;
1538     G4int particlesAboveCut=0;                << 1195   G4int particlesAboveCut=0;
1539     G4int particlesBelowCut=0;                << 1196   G4int particlesBelowCut=0;
1540     if ( verbose ) G4cout << " Capture: secon << 1197   if ( verbose ) G4cout << " Capture: secondaries " << theSecondaryList.size() << G4endl;
1541     for(i = theSecondaryList.cbegin(); i != t << 1198   for(i = theSecondaryList.begin(); i != theSecondaryList.end(); ++i)
1542     {                                         << 1199   {
1543         G4KineticTrack * kt = *i;             << 1200     G4KineticTrack * kt = *i;
1544         if (verbose) G4cout << "Capture posit << 1201     if (verbose) G4cout << "Capture position, radius, state " <<kt->GetPosition().mag()<<" "<<theOuterRadius<<" "<<kt->GetState()<<G4endl;
1545         if(kt->GetState() == G4KineticTrack:: << 1202     if(kt->GetState() == G4KineticTrack::inside) // capture happens only inside the nucleus
1546         {                                     << 1203     {
1547             if((kt->GetDefinition() == G4Prot << 1204       if((kt->GetDefinition() == G4Proton::Proton()) ||
1548                     (kt->GetDefinition() == G << 1205    (kt->GetDefinition() == G4Neutron::Neutron()))
1549             {                                 << 1206       {
1550                 //GF cut on kinetic energy    << 1207       //GF cut on kinetic energy    if(kt->Get4Momentum().vect().mag() >= theCutOnP)
1551                 G4double field=RKprop->GetFie << 1208          G4double field=RKprop->GetField(kt->GetDefinition()->GetPDGEncoding(),kt->GetPosition())
1552                              -RKprop->GetBarr << 1209                  -RKprop->GetBarrier(kt->GetDefinition()->GetPDGEncoding());
1553                 G4double energy= kt->Get4Mome << 1210    G4double energy= kt->Get4Momentum().e() - kt->GetActualMass() + field;
1554                 if (verbose ) G4cout << "Capt << 1211          if (verbose ) G4cout << "Capture: .e(), mass, field, energy" << kt->Get4Momentum().e() <<" "<<kt->GetActualMass()<<" "<<field<<" "<<energy<< G4endl;
1555                 //   if( energy < theCutOnP ) << 1212 //   if( energy < theCutOnP )
1556                 //   {                        << 1213 //   {
1557                 capturedEnergy+=energy;       << 1214       capturedEnergy+=energy;
1558                 ++particlesBelowCut;          << 1215       ++particlesBelowCut;
1559                 //   } else                   << 1216 //   } else
1560                 //   {                        << 1217 //   {
1561                 //      ++particlesAboveCut;  << 1218 //      ++particlesAboveCut;
1562                 //   }                        << 1219 //   }
1563             }                                 << 1220      }
1564         }                                     << 1221     }
1565     }                                         << 1222   }
1566     if (verbose) G4cout << "Capture particles << 1223   if (verbose) G4cout << "Capture particlesAboveCut,particlesBelowCut, capturedEnergy,capturedEnergy/particlesBelowCut <? 0.2*theCutOnP "
1567             << particlesAboveCut << " " << pa << 1224        << particlesAboveCut << " " << particlesBelowCut << " " << capturedEnergy
1568             << " "  << G4endl;                << 1225        << " " << capturedEnergy/particlesBelowCut << " " << 0.2*theCutOnP << G4endl;
1569 //    << " " << (particlesBelowCut>0) ? (capt << 1226 //  if(particlesAboveCut==0 && particlesBelowCut>0 && capturedEnergy/particlesBelowCut<0.2*theCutOnP)
1570     //  if(particlesAboveCut==0 && particlesB << 1227   if(particlesBelowCut>0 && capturedEnergy/particlesBelowCut<0.2*theCutOnP)
1571     if(particlesBelowCut>0 && capturedEnergy/ << 1228   {
                                                   >> 1229     capture=true;
                                                   >> 1230     for(i = theSecondaryList.begin(); i != theSecondaryList.end(); ++i)
1572     {                                            1231     {
1573         capture=true;                         << 1232       G4KineticTrack * kt = *i;
1574         for(i = theSecondaryList.cbegin(); i  << 1233       if(kt->GetState() == G4KineticTrack::inside) // capture happens only inside the nucleus
                                                   >> 1234       {
                                                   >> 1235         if((kt->GetDefinition() == G4Proton::Proton()) ||
                                                   >> 1236      (kt->GetDefinition() == G4Neutron::Neutron()))
1575         {                                        1237         {
1576             G4KineticTrack * kt = *i;         << 1238     captured.push_back(kt);
1577             if(kt->GetState() == G4KineticTra << 1239     kt->Hit();        // 
1578             {                                 << 1240     theCapturedList.push_back(kt);
1579                 if((kt->GetDefinition() == G4 << 1241   }
1580                         (kt->GetDefinition()  << 1242       }
1581                 {                             << 
1582                     captured.push_back(kt);   << 
1583                     kt->Hit();        //      << 
1584                     theCapturedList.push_back << 
1585                 }                             << 
1586             }                                 << 
1587         }                                     << 
1588         UpdateTracksAndCollisions(&captured,  << 
1589     }                                            1243     }
                                                   >> 1244     UpdateTracksAndCollisions(&captured, NULL, NULL);
                                                   >> 1245   }
1590                                                  1246 
1591     return capture;                           << 1247   return capture;
1592 }                                                1248 }
1593                                                  1249 
1594                                                  1250 
1595 //-------------------------------------------    1251 //----------------------------------------------------------------------------
1596 G4bool G4BinaryCascade::CheckPauliPrinciple(G    1252 G4bool G4BinaryCascade::CheckPauliPrinciple(G4KineticTrackVector * products)
1597 //-------------------------------------------    1253 //----------------------------------------------------------------------------
1598 {                                                1254 {
1599     G4int A = the3DNucleus->GetMassNumber();  << 1255   G4int A = the3DNucleus->GetMassNumber();
1600     G4int Z = the3DNucleus->GetCharge();      << 1256   G4int Z = the3DNucleus->GetCharge();
1601                                               << 
1602     G4FermiMomentum fermiMom;                 << 
1603     fermiMom.Init(A, Z);                      << 
1604                                                  1257 
1605     const G4VNuclearDensity * density=the3DNu << 1258   G4FermiMomentum fermiMom;
                                                   >> 1259   fermiMom.Init(A, Z);
1606                                                  1260 
1607     G4KineticTrackVector::const_iterator i;   << 1261   const G4VNuclearDensity * density=the3DNucleus->GetNuclearDensity();
1608     const G4ParticleDefinition * definition;  << 
1609                                                  1262 
1610     // ------ debug                           << 1263   G4KineticTrackVector::iterator i;
1611     G4bool myflag = true;                     << 1264   G4ParticleDefinition * definition;
1612     // ------ end debug                       << 1265 
1613     //  G4ThreeVector xpos(0);                << 1266 // ------ debug
1614     for(i = products->cbegin(); i != products << 1267   G4bool myflag = true;
1615     {                                         << 1268 // ------ end debug
1616         definition = (*i)->GetDefinition();   << 1269 //  G4ThreeVector xpos(0);
1617         if((definition == G4Proton::Proton()) << 1270   for(i = products->begin(); i != products->end(); ++i)
1618                 (definition == G4Neutron::Neu << 1271   {
1619         {                                     << 1272     definition = (*i)->GetDefinition();
1620             G4ThreeVector pos = (*i)->GetPosi << 1273     if((definition == G4Proton::Proton()) ||
1621             G4double d = density->GetDensity( << 1274        (definition == G4Neutron::Neutron()))
1622             // energy correspondiing to fermi << 1275     {
1623             G4double eFermi = std::sqrt( sqr( << 1276        G4ThreeVector pos = (*i)->GetPosition();
1624             if( definition == G4Proton::Proto << 1277        G4double d = density->GetDensity(pos);
1625             {                                 << 1278   // energy correspondiing to fermi momentum
1626                 eFermi -= the3DNucleus->Coulo << 1279        G4double eFermi = std::sqrt( sqr(fermiMom.GetFermiMomentum(d)) + (*i)->Get4Momentum().mag2() );
1627             }                                 << 1280        if( definition == G4Proton::Proton() )
1628             G4LorentzVector mom = (*i)->Get4M << 1281        {
1629             // ------ debug                   << 1282          eFermi -= the3DNucleus->CoulombBarrier();
1630             /*                                << 1283        }
1631              *        G4cout << "p:[" << (1/M << 1284        G4LorentzVector mom = (*i)->Get4Momentum();
1632              *            << (1/MeV)*mom.z()  << 1285        // ------ debug
1633              *            << (1/MeV)*mom.vect << 1286 /*
1634              *            << (1/MeV)*mom.mag( << 1287  *        G4cout << "p:[" << (1/MeV)*mom.x() << " " << (1/MeV)*mom.y() << " "
1635              *            << (1/fermi)*pos.x( << 1288  *            << (1/MeV)*mom.z() << "] |p3|:"
1636              *            << (1/fermi)*pos.z( << 1289  *            << (1/MeV)*mom.vect().mag() << " E:" << (1/MeV)*mom.t() << " ] m: "
1637              *            << (1/fermi)*(pos-x << 1290  *            << (1/MeV)*mom.mag() << "  pos["
1638              *            << (1/MeV)*p << G4e << 1291  *            << (1/fermi)*pos.x() << " "<< (1/fermi)*pos.y() << " "
1639              *         xpos=pos;              << 1292  *            << (1/fermi)*pos.z() << "] |Dpos|: "
1640              */                               << 1293  *            << (1/fermi)*(pos-xpos).mag() << " Pfermi:"
1641             // ------ end debug               << 1294  *            << (1/MeV)*p << G4endl;
1642             if(mom.e() < eFermi )             << 1295  *         xpos=pos;
1643             {                                 << 1296  */
1644                 // ------ debug               << 1297        // ------ end debug
1645                 myflag = false;               << 1298        if(mom.e() < eFermi )
1646                 // ------ end debug           << 1299        {
1647                 //      return false;         << 1300    // ------ debug
1648             }                                 << 1301    myflag = false;
1649         }                                     << 1302    // ------ end debug
1650     }                                         << 1303    //      return false;
1651 #ifdef debug_BIC_CheckPauli                   << 1304        }
1652     if ( myflag  )                            << 1305      }
1653     {                                         << 1306   }
1654         for(i = products->cbegin(); i != prod << 1307   #ifdef debug_BIC_CheckPauli
1655         {                                     << 1308   if ( myflag  )
1656             definition = (*i)->GetDefinition( << 1309   {
1657             if((definition == G4Proton::Proto << 1310   for(i = products->begin(); i != products->end(); ++i)
1658                     (definition == G4Neutron: << 1311   {
1659             {                                 << 1312     definition = (*i)->GetDefinition();
1660                 G4ThreeVector pos = (*i)->Get << 1313     if((definition == G4Proton::Proton()) ||
1661                 G4double d = density->GetDens << 1314     (definition == G4Neutron::Neutron()))
1662                 G4double pFermi = fermiMom.Ge << 1315     {
1663                 G4LorentzVector mom = (*i)->G << 1316       G4ThreeVector pos = (*i)->GetPosition();
1664                 G4double field =((G4RKPropaga << 1317       G4double d = density->GetDensity(pos);
1665                 if ( mom.e()-mom.mag()+field  << 1318       G4double pFermi = fermiMom.GetFermiMomentum(d);
1666                 {                             << 1319       G4LorentzVector mom = (*i)->Get4Momentum();
1667                     G4cout << "momentum probl << 1320       G4double field =((G4RKPropagation*)thePropagator)->GetField(definition->GetPDGEncoding(),pos);
1668                             << " mom, mom.m " << 1321               if ( mom.e()-mom.mag()+field > 160*MeV ) 
1669                             << " field " << f << 1322       {
1670                 }                             << 1323           G4cout << "momentum problem pFermi=" <<  pFermi
1671             }                                 << 1324                << " mom, mom.m " << mom << " " << mom.mag()
1672         }                                     << 1325          << " field " << field << G4endl;
1673     }                                         << 1326       }
1674 #endif                                        << 1327     }
                                                   >> 1328   }
                                                   >> 1329   }
                                                   >> 1330   #endif
1675                                                  1331 
1676     return myflag;                            << 1332   return myflag;
1677 }                                                1333 }
1678                                                  1334 
1679 //-------------------------------------------    1335 //----------------------------------------------------------------------------
1680 void G4BinaryCascade::StepParticlesOut()         1336 void G4BinaryCascade::StepParticlesOut()
1681 //-------------------------------------------    1337 //----------------------------------------------------------------------------
1682 {                                                1338 {
1683     G4int counter=0;                          << 1339   G4int counter=0;
1684     G4int countreset=0;                       << 1340   G4int countreset=0;
1685     //G4cout << " nucl. Radius " << radius << << 1341   //G4cout << " nucl. Radius " << radius << G4endl;
1686     // G4cerr <<"pre-while- theSecondaryList  << 1342   // G4cerr <<"pre-while- theSecondaryList "<<G4endl;
1687     while( theSecondaryList.size() > 0 )      << 1343   while( theSecondaryList.size() > 0 )
1688                                               << 1344   {
1689     {                                         << 1345     G4int nsec=0;
1690         G4double minTimeStep = 1.e-12*ns;   / << 1346     G4double minTimeStep = 1.e-12*ns;   // about 30*fermi/(0.1*c_light);1.e-12*ns
1691                                             / << 1347                                         // i.e. a big step
1692         for(auto i = theSecondaryList.cbegin( << 1348     std::vector<G4KineticTrack *>::iterator i;
1693         {                                     << 1349     for(i = theSecondaryList.begin(); i != theSecondaryList.end(); ++i)
1694             G4KineticTrack * kt = *i;         << 1350     {
1695             if( kt->GetState() == G4KineticTr << 1351       G4KineticTrack * kt = *i;
1696             {                                 << 1352       if( kt->GetState() == G4KineticTrack::inside ) 
1697                 G4double tStep(0), tdummy(0); << 1353       {
1698                 G4bool intersect =            << 1354     nsec++;
1699                         ((G4RKPropagation*)th << 1355     G4double tStep(0), tdummy(0); 
                                                   >> 1356     ((G4RKPropagation*)thePropagator)->GetSphereIntersectionTimes(kt,tdummy,tStep);
1700 #ifdef debug_BIC_StepParticlesOut                1357 #ifdef debug_BIC_StepParticlesOut
1701                 G4cout << " minTimeStep, tSte << 1358     G4cout << " minTimeStep, tStep Particle " <<minTimeStep << " " <<tStep
1702                         << " " <<kt->GetDefin << 1359            << " " <<kt->GetDefinition()->GetParticleName() 
1703                         << " 4mom " << kt->Ge << 1360      << " 4mom " << kt->GetTrackingMomentum()<<G4endl;
1704                 if ( ! intersect );           << 1361 #endif
1705                 {                             << 1362     if(tStep<minTimeStep && tStep> 0 )
1706                     PrintKTVector(&theSeconda << 1363     {
1707                     throw G4HadronicException << 1364       minTimeStep = tStep;
1708                 }                             << 1365     }
1709 #endif                                        << 1366       } else if ( kt->GetState() != G4KineticTrack::outside ){
1710                 if(intersect && tStep<minTime << 1367           PrintKTVector(&theSecondaryList, std::string(" state ERROR....."));
1711                 {                             << 1368           throw G4HadronicException(__FILE__, __LINE__, "G4BinaryCascade::StepParticlesOut() particle not in nucleus");
1712                     minTimeStep = tStep;      << 1369       }
1713                 }                             << 1370     }
1714             } else if ( kt->GetState() != G4K << 1371     minTimeStep *= 1.2;
1715                 PrintKTVector(&theSecondaryLi << 1372 //    G4cerr << "CaptureCount = "<<counter<<" "<<nsec<<" "<<minTimeStep<<" "<<1*ns<<G4endl;
1716                 throw G4HadronicException(__F << 1373     G4double timeToCollision=DBL_MAX;
1717             }                                 << 1374     G4CollisionInitialState * nextCollision=0;
1718         }                                     << 1375     if(theCollisionMgr->Entries() > 0)
1719         minTimeStep *= 1.2;                   << 1376     {
1720         G4double timeToCollision=DBL_MAX;     << 1377        nextCollision = theCollisionMgr->GetNextCollision();
1721         G4CollisionInitialState * nextCollisi << 1378        timeToCollision = nextCollision->GetCollisionTime()-theCurrentTime;
1722         if(theCollisionMgr->Entries() > 0)    << 1379     }
1723         {                                     << 1380     if ( timeToCollision > minTimeStep )
1724             nextCollision = theCollisionMgr-> << 1381     {
1725             timeToCollision = nextCollision-> << 1382   DoTimeStep(minTimeStep);
1726             //  G4cout << " NextCollision  *  << 1383         ++counter;
1727         }                                     << 1384     } else
1728         if ( timeToCollision > minTimeStep )  << 1385     {
1729         {                                     << 1386         if (!DoTimeStep(timeToCollision) )
1730             DoTimeStep(minTimeStep);          << 1387   {
1731             ++counter;                        << 1388      // Check if nextCollision is still valid, ie. partcile did not leave nucleus
1732         } else                                << 1389      if (theCollisionMgr->GetNextCollision() != nextCollision )
1733         {                                     << 1390      {
1734             if (!DoTimeStep(timeToCollision)  << 1391          nextCollision = 0;
1735             {                                 << 1392      }
1736                 // Check if nextCollision is  << 1393   }
1737                 if (theCollisionMgr->GetNextC << 1394        // G4cerr <<"post- DoTimeStep 3"<<G4endl;
1738                 {                             << 
1739                     nextCollision = nullptr;  << 
1740                 }                             << 
1741             }                                 << 
1742             // G4cerr <<"post- DoTimeStep 3"< << 
1743                                               << 
1744             if(nextCollision)                 << 
1745             {                                 << 
1746                 if  ( ApplyCollision(nextColl << 
1747                 {                             << 
1748                     // G4cout << "ApplyCollis << 
1749                 } else                        << 
1750                 {                             << 
1751                     theCollisionMgr->RemoveCo << 
1752                 }                             << 
1753             }                                 << 
1754         }                                     << 
1755                                                  1395 
1756         if(countreset>100)                    << 1396   if(nextCollision)
1757         {                                     << 1397   {
                                                   >> 1398      if  ( ApplyCollision(nextCollision))
                                                   >> 1399      {
                                                   >> 1400          // G4cout << "ApplyCollision sucess " << G4endl;
                                                   >> 1401            } else
                                                   >> 1402            {
                                                   >> 1403          theCollisionMgr->RemoveCollision(nextCollision);
                                                   >> 1404            }
                                                   >> 1405   }
                                                   >> 1406     }
                                                   >> 1407 
                                                   >> 1408     if(countreset>100)
                                                   >> 1409     {
1758 #ifdef debug_G4BinaryCascade                     1410 #ifdef debug_G4BinaryCascade
1759             G4cerr << "G4BinaryCascade.cc: Wa << 1411        G4cerr << "G4BinaryCascade.cc: Warning - aborting looping particle(s)" << G4endl;
1760             PrintKTVector(&theSecondaryList," << 
1761 #endif                                           1412 #endif
1762                                                  1413 
1763             //  add left secondaries to Final << 1414 //  add left secondaries to FinalSate
1764             for (auto iter=theSecondaryList.c << 1415        std::vector<G4KineticTrack *>::iterator iter;
1765             {                                 << 1416        for ( iter =theSecondaryList.begin(); iter != theSecondaryList.end(); ++iter)
1766                 theFinalState.push_back(*iter << 1417        {
1767             }                                 << 1418      theFinalState.push_back(*iter);
1768             theSecondaryList.clear();         << 1419        }
1769                                               << 1420        theSecondaryList.clear();
1770             break;                            << 
1771         }                                     << 
1772                                               << 
1773         if(Absorb())                          << 
1774         {                                     << 
1775             //       haveProducts = true;     << 
1776             // G4cout << "Absorb sucess " <<  << 
1777         }                                     << 
1778                                               << 
1779         if(Capture(false))                    << 
1780         {                                     << 
1781             //       haveProducts = true;     << 
1782 #ifdef debug_BIC_StepParticlesOut             << 
1783             G4cout << "Capture sucess " << G4 << 
1784 #endif                                        << 
1785         }                                     << 
1786         if ( counter > 100 && theCollisionMgr << 
1787         {                                     << 
1788 #ifdef debug_BIC_StepParticlesOut             << 
1789             PrintKTVector(&theSecondaryList,s << 
1790 #endif                                        << 
1791             FindCollisions(&theSecondaryList) << 
1792             counter=0;                        << 
1793             ++countreset;                     << 
1794         }                                     << 
1795         //G4cout << "currentZ @ end loop " << << 
1796         if ( ! currentZ ){                    << 
1797             // nucleus completely destroyed,  << 
1798            // products = FillVoidNucleusProdu << 
1799     #ifdef debug_BIC_return                   << 
1800             G4cout << "return @ Z=0 after col << 
1801             PrintKTVector(&theSecondaryList,s << 
1802             G4cout << "theTargetList size: "  << 
1803             PrintKTVector(&theTargetList,std: << 
1804             PrintKTVector(&theCapturedList,st << 
1805                                               << 
1806             G4cout << " ExcitE be4 Correct :  << 
1807             G4cout << " Mom Transfered to nuc << 
1808             PrintKTVector(&theFinalState,std: << 
1809           //  G4cout << "returned products: " << 
1810     #endif                                    << 
1811         }                                     << 
1812                                                  1421 
                                                   >> 1422        break;
1813     }                                            1423     }
1814     //  G4cerr <<"Finished capture loop "<<G4 << 
1815                                               << 
1816     //G4cerr <<"pre- DoTimeStep 4"<<G4endl;   << 
1817     DoTimeStep(DBL_MAX);                      << 
1818     //G4cerr <<"post- DoTimeStep 4"<<G4endl;  << 
1819 }                                             << 
1820                                                  1424 
1821 //------------------------------------------- << 1425     if(Absorb())
1822 G4double G4BinaryCascade::CorrectShortlivedPr << 1426     {
1823         G4KineticTrack* primary,G4KineticTrac << 1427 //       haveProducts = true;
1824 //------------------------------------------- << 1428       // G4cout << "Absorb sucess " << G4endl;
1825 {                                             << 
1826     G4double Efermi(0);                       << 
1827     if (primary->GetState() == G4KineticTrack << 
1828         G4int PDGcode=primary->GetDefinition( << 
1829         Efermi=((G4RKPropagation *)thePropaga << 
1830                                               << 
1831         if ( std::abs(PDGcode) > 1000 && PDGc << 
1832         {                                     << 
1833             Efermi = ((G4RKPropagation *)theP << 
1834             G4LorentzVector mom4Primary=prima << 
1835             primary->Update4Momentum(mom4Prim << 
1836         }                                     << 
1837                                               << 
1838         for (auto titer=target_collection.cbe << 
1839         {                                     << 
1840             const G4ParticleDefinition * aDef << 
1841             G4int aCode=aDef->GetPDGEncoding( << 
1842             G4ThreeVector aPos=(*titer)->GetP << 
1843             Efermi+= ((G4RKPropagation *)theP << 
1844         }                                     << 
1845     }                                            1429     }
1846     return Efermi;                            << 
1847 }                                             << 
1848                                                  1430 
1849 //------------------------------------------- << 1431     if(Capture(false))
1850 G4bool G4BinaryCascade::CorrectShortlivedFina << 
1851         G4double initial_Efermi)              << 
1852 //------------------------------------------- << 
1853 {                                             << 
1854     G4double final_Efermi(0);                 << 
1855     G4KineticTrackVector resonances;          << 
1856     for (auto i =products->cbegin(); i != pro << 
1857     {                                            1432     {
1858         G4int PDGcode=(*i)->GetDefinition()-> << 1433 //       haveProducts = true;
1859         //       G4cout << " PDGcode, state " << 1434 #ifdef debug_BIC_StepParticlesOut
1860         final_Efermi+=((G4RKPropagation *)the << 1435        G4cout << "Capture sucess " << G4endl;
1861         if ( std::abs(PDGcode) > 1000 && PDGc << 1436 #endif
1862         {                                     << 
1863             resonances.push_back(*i);         << 
1864         }                                     << 
1865     }                                            1437     }
1866     if ( resonances.size() > 0 )              << 1438     if ( counter > 100 && theCollisionMgr->Entries() == 0)   // no collision, and stepping a while....
1867     {                                            1439     {
1868         G4double delta_Fermi= (initial_Efermi << 1440         #ifdef debug_1_BinaryCascade
1869         for (auto res=resonances.cbegin(); re << 1441         PrintKTVector(&theSecondaryList,std::string("stepping 100 steps"));
1870         {                                     << 1442   #endif
1871             G4LorentzVector mom=(*res)->Get4M << 1443   FindCollisions(&theSecondaryList);
1872             G4double mass2=mom.mag2();        << 1444   counter=0;
1873             G4double newEnergy=mom.e() + delt << 1445   ++countreset;
1874             G4double newEnergy2= newEnergy*ne << 
1875             //G4cout << "mom = " << mom <<" n << 
1876             if ( newEnergy2 < mass2 )         << 
1877             {                                 << 
1878                 return false;                 << 
1879             }                                 << 
1880             G4ThreeVector mom3=std::sqrt(newE << 
1881             (*res)->Set4Momentum(G4LorentzVec << 
1882                 //G4cout << " correct resonan << 
1883                 //        " 3mom from/to " << << 
1884         }                                     << 
1885     }                                            1446     }
1886     return true;                              << 1447   }
                                                   >> 1448 //  G4cerr <<"Finished capture loop "<<G4endl;
                                                   >> 1449 
                                                   >> 1450        //G4cerr <<"pre- DoTimeStep 4"<<G4endl;
                                                   >> 1451   DoTimeStep(DBL_MAX);
                                                   >> 1452        //G4cerr <<"post- DoTimeStep 4"<<G4endl;
                                                   >> 1453 
                                                   >> 1454 
1887 }                                                1455 }
1888                                                  1456 
1889 //-------------------------------------------    1457 //----------------------------------------------------------------------------
1890 void G4BinaryCascade::CorrectFinalPandE()        1458 void G4BinaryCascade::CorrectFinalPandE()
1891 //-------------------------------------------    1459 //----------------------------------------------------------------------------
1892 //                                               1460 //
1893 //  Modify momenta of outgoing particles.     << 1461 //  Modify momenta of outgoing particles. 
1894 //   Assume two body decay, nucleus(@nominal  << 1462 //   Assume two body decay, nucleus(@nominal mass) + sum of final state particles(SFSP). 
1895 //   momentum of SFSP shall be less than mome << 1463 //   momentum of SFSP shall be less than momentum for two body decay. 
1896 //                                               1464 //
1897 {                                                1465 {
1898 #ifdef debug_BIC_CorrectFinalPandE               1466 #ifdef debug_BIC_CorrectFinalPandE
1899     G4cerr << "BIC: -CorrectFinalPandE called << 1467   G4cerr << " -CorrectFinalPandE 1" << G4endl;
1900 #endif                                           1468 #endif
1901                                                  1469 
1902     if ( theFinalState.size() == 0 ) return;  << 1470  if ( theFinalState.size() == 0 ) return;
1903                                               << 
1904     G4KineticTrackVector::const_iterator i;   << 
1905     G4LorentzVector pNucleus=GetFinal4Momentu << 
1906     if ( pNucleus.e() == 0 ) return;    // ch << 
1907 #ifdef debug_BIC_CorrectFinalPandE            << 
1908     G4cerr << " -CorrectFinalPandE 3" << G4en << 
1909 #endif                                        << 
1910     G4LorentzVector pFinals(0);               << 
1911     for(i = theFinalState.cbegin(); i != theF << 
1912     {                                         << 
1913         pFinals += (*i)->Get4Momentum();      << 
1914 #ifdef debug_BIC_CorrectFinalPandE            << 
1915         G4cout <<"CorrectFinalPandE a final " << 
1916                        << " 4mom " << (*i)->G << 
1917 #endif                                        << 
1918     }                                         << 
1919 #ifdef debug_BIC_CorrectFinalPandE            << 
1920     G4cout << "CorrectFinalPandE pN pF: " <<p << 
1921 #endif                                        << 
1922     G4LorentzVector pCM=pNucleus + pFinals;   << 
1923                                                  1471 
1924     G4LorentzRotation toCMS(-pCM.boostVector( << 
1925     pFinals *=toCMS;                          << 
1926 #ifdef debug_BIC_CorrectFinalPandE               1472 #ifdef debug_BIC_CorrectFinalPandE
1927     G4cout << "CorrectFinalPandE pCM, CMS pCM << 1473   G4cerr << " -CorrectFinalPandE 2" << G4endl;
1928     G4cout << "CorrectFinal CMS pN pF " <<toC << 
1929             <<pFinals << G4endl               << 
1930             << " nucleus initial mass : " <<G << 
1931             <<" massInNucleus m(nucleus) m(fi << 
1932             << pFinals.mag() << " " << pCM.ma << 
1933 #endif                                           1474 #endif
1934                                                  1475 
1935     G4LorentzRotation toLab = toCMS.inverse() << 1476   G4KineticTrackVector::iterator i;
1936                                               << 1477   G4LorentzVector pNucleus=GetFinal4Momentum();
1937     G4double s0 = pCM.mag2();                 << 1478   if ( pNucleus.e() == 0 ) return;    // check against explicit 0 from GetNucleus4Momentum()
1938     G4double m10 = GetIonMass(currentZ,curren << 
1939     G4double m20 = pFinals.mag();             << 
1940     if( s0-(m10+m20)*(m10+m20) < 0 )          << 
1941     {                                         << 
1942 #ifdef debug_BIC_CorrectFinalPandE               1479 #ifdef debug_BIC_CorrectFinalPandE
1943         G4cout << "G4BinaryCascade::CorrectFi << 1480   G4cerr << " -CorrectFinalPandE 3" << G4endl;
1944                                               << 
1945         G4cout << "not enough mass to correct << 
1946                 << (s0-(m10+m20)*(m10+m20)) < << 
1947                 << currentA << " " << current << 
1948                 << m10 << " " << m20          << 
1949                 << G4endl;                    << 
1950         G4cerr << " -CorrectFinalPandE 4" <<  << 
1951                                               << 
1952         PrintKTVector(&theFinalState," mass p << 
1953 #endif                                           1481 #endif
1954         return;                               << 1482   G4LorentzVector pFinals(0);
1955     }                                         << 1483   G4int nFinals(0);
                                                   >> 1484   for(i = theFinalState.begin(); i != theFinalState.end(); ++i)
                                                   >> 1485   {
                                                   >> 1486     pFinals += (*i)->Get4Momentum();
                                                   >> 1487     ++nFinals;
                                                   >> 1488     #ifdef debug_BIC_CorrectFinalPandE
                                                   >> 1489       G4cout <<"CorrectFinalPandE a final " << (*i)->GetDefinition()->GetParticleName()
                                                   >> 1490            << " 4mom " << (*i)->Get4Momentum()<< G4endl;
                                                   >> 1491     #endif
                                                   >> 1492   }
                                                   >> 1493   #ifdef debug_BIC_CorrectFinalPandE
                                                   >> 1494     G4cout << "CorrectFinalPandE pN pF: " <<pNucleus << " " <<pFinals << G4endl;
                                                   >> 1495   #endif
                                                   >> 1496   G4LorentzVector pCM=pNucleus + pFinals;
1956                                                  1497 
1957     // Three momentum in cm system            << 1498   G4LorentzRotation toCMS(-pCM.boostVector());
1958     G4double pInCM = std::sqrt((s0-(m10+m20)* << 1499   pFinals *=toCMS;
1959 #ifdef debug_BIC_CorrectFinalPandE            << 
1960     G4cout <<" CorrectFinalPandE pInCM  new,  << 
1961             << " " << (pFinals).vect().mag()< << 
1962 #endif                                        << 
1963     if ( pFinals.vect().mag() > pInCM )       << 
1964     {                                         << 
1965         G4ThreeVector p3finals=pInCM*pFinals. << 
1966                                                  1500 
1967         G4double factor=std::max(0.98,pInCM/p << 
1968         G4LorentzVector qFinals(0);           << 
1969         for(i = theFinalState.cbegin(); i !=  << 
1970         {                                     << 
1971             //      G4ThreeVector p3((toCMS*( << 
1972             G4ThreeVector p3(factor*(toCMS*(* << 
1973             G4LorentzVector p(p3,std::sqrt((* << 
1974             qFinals += p;                     << 
1975             p *= toLab;                       << 
1976 #ifdef debug_BIC_CorrectFinalPandE               1501 #ifdef debug_BIC_CorrectFinalPandE
1977             G4cout << " final p corrected: "  << 1502   G4cout << "CorrectFinalPandE pCM, CMS pCM " << pCM << " " <<toCMS*pCM<< G4endl;
1978 #endif                                        << 1503   G4cout << "CorrectFinal CMS pN pF " <<toCMS*pNucleus << " "
1979             (*i)->Set4Momentum(p);            << 1504          <<pFinals << G4endl
1980         }                                     << 1505          << " nucleus initial mass : " <<GetFinal4Momentum().mag()
1981 #ifdef debug_BIC_CorrectFinalPandE            << 1506    <<" massInNucleus m(nucleus) m(finals) std::sqrt(s): " << massInNucleus << " " <<pNucleus.mag()<< " "
1982         G4cout << "CorrectFinalPandE nucleus  << 1507    << pFinals.mag() << " " << pCM.mag() << G4endl;
1983                 <<GetFinal4Momentum().mag() < << 1508 #endif
1984                 << " CMS pFinals , mag, 3.mag << 1509 
1985         G4cerr << " -CorrectFinalPandE 5 " << << 1510   G4LorentzRotation toLab = toCMS.inverse();
1986 #endif                                        << 1511 
                                                   >> 1512   G4double s = pCM.mag2();
                                                   >> 1513 //  G4double m10 = massInNucleus; //pNucleus.mag();
                                                   >> 1514   G4double m10 = GetIonMass(currentZ,currentA);
                                                   >> 1515   G4double m20 = pFinals.mag();
                                                   >> 1516   if( s-(m10+m20)*(m10+m20) < 0 )
                                                   >> 1517   {
                                                   >> 1518        #ifdef debug_BIC_CorrectFinalPandE
                                                   >> 1519   G4cout << "G4BinaryCascade::CorrectFinalPandE() : error! " << G4endl;
                                                   >> 1520 
                                                   >> 1521   G4cout << "not enough mass to correct: mass, A,Z, mass(nucl), mass(finals) " 
                                                   >> 1522               << std::sqrt(-s+(m10+m20)*(m10+m20)) << " " 
                                                   >> 1523         << currentA << " " << currentZ << " "
                                                   >> 1524         << m10 << " " << m20 
                                                   >> 1525         << G4endl;
                                                   >> 1526   G4cerr << " -CorrectFinalPandE 4" << G4endl;
                                                   >> 1527 
                                                   >> 1528   PrintKTVector(&theFinalState," mass problem");
                                                   >> 1529        #endif
                                                   >> 1530       return;
                                                   >> 1531   }
                                                   >> 1532 
                                                   >> 1533   // Three momentum in cm system
                                                   >> 1534   G4double pInCM = std::sqrt((s-(m10+m20)*(m10+m20))*(s-(m10-m20)*(m10-m20))/(4.*s));
                                                   >> 1535     #ifdef debug_BIC_CorrectFinalPandE
                                                   >> 1536     G4cout <<" CorrectFinalPandE pInCM  new, CURRENT, ratio : " << pInCM 
                                                   >> 1537        << " " << (pFinals).vect().mag()<< " " <<  pInCM/(pFinals).vect().mag() << G4endl;
                                                   >> 1538     #endif
                                                   >> 1539   if ( pFinals.vect().mag() > pInCM )
                                                   >> 1540   {
                                                   >> 1541     G4ThreeVector p3finals=pInCM*pFinals.vect().unit();
                                                   >> 1542 
                                                   >> 1543 //    G4ThreeVector deltap=(p3finals - pFinals.vect() ) / nFinals;
                                                   >> 1544    G4double factor=std::max(0.98,pInCM/pFinals.vect().mag());   // small correction
                                                   >> 1545     G4LorentzVector qFinals(0);
                                                   >> 1546     for(i = theFinalState.begin(); i != theFinalState.end(); ++i)
                                                   >> 1547     {
                                                   >> 1548 //      G4ThreeVector p3((toCMS*(*i)->Get4Momentum()).vect() + deltap);
                                                   >> 1549       G4ThreeVector p3(factor*(toCMS*(*i)->Get4Momentum()).vect());
                                                   >> 1550       G4LorentzVector p(p3,std::sqrt((*i)->Get4Momentum().mag2() + p3.mag2()));
                                                   >> 1551       qFinals += p;
                                                   >> 1552       p *= toLab;
                                                   >> 1553         #ifdef debug_BIC_CorrectFinalPandE
                                                   >> 1554         G4cout << " final p corrected: " << p << G4endl;
                                                   >> 1555         #endif
                                                   >> 1556       (*i)->Set4Momentum(p);
1987     }                                            1557     }
1988 #ifdef debug_BIC_CorrectFinalPandE            << 1558       #ifdef debug_BIC_CorrectFinalPandE
1989     else { G4cerr << " -CorrectFinalPandE 6 - << 1559        G4cout << "CorrectFinalPandE nucleus corrected mass : " << GetFinal4Momentum() << " "
1990 #endif                                        << 1560         <<GetFinal4Momentum().mag() << G4endl
1991                                               << 1561     << " CMS pFinals , mag, 3.mag : " << qFinals << " " << qFinals.mag() << " " << qFinals.vect().mag()<< G4endl;
                                                   >> 1562        G4cerr << " -CorrectFinalPandE 5 " << factor <<  G4endl;  
                                                   >> 1563       #endif
                                                   >> 1564   }
                                                   >> 1565   #ifdef debug_BIC_CorrectFinalPandE
                                                   >> 1566    else { G4cerr << " -CorrectFinalPandE 6 - no correction done" << G4endl; }
                                                   >> 1567   #endif
                                                   >> 1568  
1992 }                                                1569 }
1993                                                  1570 
1994 //-------------------------------------------    1571 //----------------------------------------------------------------------------
1995 void G4BinaryCascade::UpdateTracksAndCollisio    1572 void G4BinaryCascade::UpdateTracksAndCollisions(
1996         //----------------------------------- << 1573 //----------------------------------------------------------------------------
1997         G4KineticTrackVector * oldSecondaries << 1574       G4KineticTrackVector * oldSecondaries,
1998         G4KineticTrackVector * oldTarget,     << 1575       G4KineticTrackVector * oldTarget,
1999         G4KineticTrackVector * newSecondaries << 1576       G4KineticTrackVector * newSecondaries)
2000 {                                             << 1577 {
2001     std::vector<G4KineticTrack *>::const_iter << 1578   // G4cout << "Entering ... "<<oldTarget<<G4endl;
2002                                               << 1579   std::vector<G4KineticTrack *>::iterator iter1, iter2;
2003     // remove old secondaries from the second << 1580 
2004     if(oldSecondaries)                        << 1581 // remove old secondaries from the secondary list
                                                   >> 1582   if(oldSecondaries)
                                                   >> 1583   {
                                                   >> 1584     if(!oldSecondaries->empty())
2005     {                                            1585     {
2006         if(!oldSecondaries->empty())          << 1586       for(iter1 = oldSecondaries->begin(); iter1 != oldSecondaries->end();
2007         {                                     << 1587     ++iter1)
2008             for(auto iter1=oldSecondaries->cb << 1588       {
2009             {                                 << 1589   iter2 = std::find(theSecondaryList.begin(), theSecondaryList.end(),
2010                 iter2 = std::find(theSecondar << 1590           *iter1);
2011                 if ( iter2 != theSecondaryLis << 1591   theSecondaryList.erase(iter2);
2012             }                                 << 1592       }
2013             theCollisionMgr->RemoveTracksColl << 1593       theCollisionMgr->RemoveTracksCollisions(oldSecondaries);
2014         }                                     << 
2015     }                                            1594     }
                                                   >> 1595   }
2016                                                  1596 
2017     // remove old target from the target list << 1597 // remove old target from the target list
2018     if(oldTarget)                             << 1598   if(oldTarget)
                                                   >> 1599   {
                                                   >> 1600     // G4cout << "################## Debugging 0 "<<G4endl;
                                                   >> 1601     if(oldTarget->size()!=0)
2019     {                                            1602     {
2020         // G4cout << "################## Debu << 1603       // G4cout << "################## Debugging 1 "<<oldTarget->size()<<G4endl;
2021         if(oldTarget->size()!=0)              << 1604       for(iter1 = oldTarget->begin(); iter1 != oldTarget->end(); ++iter1)
2022         {                                     << 1605       {
2023                                               << 1606   iter2 = std::find(theTargetList.begin(), theTargetList.end(),
2024             // G4cout << "##################  << 1607           *iter1);
2025             for(auto iter1 = oldTarget->cbegi << 1608   theTargetList.erase(iter2);
2026             {                                 << 1609       }
2027                 iter2 = std::find(theTargetLi << 1610       theCollisionMgr->RemoveTracksCollisions(oldTarget);
2028                 theTargetList.erase(iter2);   << 
2029             }                                 << 
2030             theCollisionMgr->RemoveTracksColl << 
2031         }                                     << 
2032     }                                            1611     }
                                                   >> 1612   }
2033                                                  1613 
2034     if(newSecondaries)                        << 1614   if(newSecondaries)
                                                   >> 1615   {
                                                   >> 1616     if(!newSecondaries->empty())
2035     {                                            1617     {
2036         if(!newSecondaries->empty())          << 1618       // insert new secondaries in the secondary list
2037         {                                     << 1619       for(iter1 = newSecondaries->begin(); iter1 != newSecondaries->end();
2038             // insert new secondaries in the  << 1620     ++iter1)
2039             for(auto iter1 = newSecondaries-> << 1621       {
2040             {                                 << 1622   theSecondaryList.push_back(*iter1);
2041                 theSecondaryList.push_back(*i << 1623       }
2042                 if ((*iter1)->GetState() == G << 1624       // look for collisions of new secondaries
2043                 {                             << 1625       FindCollisions(newSecondaries);
2044                    PrintKTVector(*iter1, "und << 
2045                 }                             << 
2046                                               << 
2047                                               << 
2048             }                                 << 
2049             // look for collisions of new sec << 
2050             FindCollisions(newSecondaries);   << 
2051         }                                     << 
2052     }                                            1626     }
2053     // G4cout << "Exiting ... "<<oldTarget<<G << 1627   }
                                                   >> 1628   // G4cout << "Exiting ... "<<oldTarget<<G4endl;
2054 }                                                1629 }
2055                                                  1630 
2056                                                  1631 
2057 class SelectFromKTV                              1632 class SelectFromKTV
2058 {                                                1633 {
2059 private:                                      << 1634   private:
2060     G4KineticTrackVector * ktv;               << 1635   G4KineticTrackVector * ktv;
2061     G4KineticTrack::CascadeState wanted_state << 1636     G4KineticTrack::CascadeState wanted_state;
2062 public:                                       << 1637   public:
2063     SelectFromKTV(G4KineticTrackVector * out, << 1638     SelectFromKTV(G4KineticTrackVector * out, G4KineticTrack::CascadeState astate)
2064     :                                         << 1639   :
2065         ktv(out), wanted_state(astate)        << 1640     ktv(out), wanted_state(astate)
2066     {};                                       << 1641   {};
2067     void operator() (G4KineticTrack *& kt) co << 1642   void operator() (G4KineticTrack *& kt) const 
2068     {                                         << 1643   {
2069         if ( (kt)->GetState() == wanted_state << 1644      if ( (kt)->GetState() == wanted_state ) ktv->push_back(kt);
2070     };                                        << 1645   };
2071 };                                               1646 };
2072                                               << 1647   
2073                                                  1648 
2074                                                  1649 
2075 //-------------------------------------------    1650 //----------------------------------------------------------------------------
2076 G4bool G4BinaryCascade::DoTimeStep(G4double t    1651 G4bool G4BinaryCascade::DoTimeStep(G4double theTimeStep)
2077 //-------------------------------------------    1652 //----------------------------------------------------------------------------
2078 {                                                1653 {
2079                                                  1654 
2080 #ifdef debug_BIC_DoTimeStep                      1655 #ifdef debug_BIC_DoTimeStep
2081     G4ping debug("debug_G4BinaryCascade");    << 1656   G4ping debug("debug_G4BinaryCascade");
2082     debug.push_back("======> DoTimeStep 1");  << 1657   debug.push_back("======> DoTimeStep 1"); debug.dump();
2083     G4cerr <<"G4BinaryCascade::DoTimeStep: en << 1658   G4cerr <<"G4BinaryCascade::DoTimeStep: enter "<< theTimeStep << G4endl;
2084             << " , time="<<theCurrentTime <<  << 1659   PrintKTVector(&theSecondaryList, std::string("DoTimeStep - theSecondaryList"));
2085     PrintKTVector(&theSecondaryList, std::str << 1660 //   PrintKTVector(&theTargetList, std::string("DoTimeStep - theTargetList"));
2086     //PrintKTVector(&theTargetList, std::stri << 1661 #endif
2087 #endif                                        << 1662 
2088                                               << 1663   G4bool success=true;
2089     G4bool success=true;                      << 1664   std::vector<G4KineticTrack *>::iterator iter;
2090     std::vector<G4KineticTrack *>::const_iter << 1665 // Count particles in nucleus
2091                                               << 1666   #ifdef debug_BIC_DoTimeStep
2092     G4KineticTrackVector * kt_outside = new G << 1667   G4int secondaryBarions=0;
2093     std::for_each( theSecondaryList.begin(),t << 1668   G4int secondaryCharge=0;
2094             SelectFromKTV(kt_outside,G4Kineti << 1669   G4double secondaryMass=0;
2095     //PrintKTVector(kt_outside, std::string(" << 1670   #endif
2096                                               << 1671 
2097     G4KineticTrackVector * kt_inside = new G4 << 1672   G4KineticTrackVector * kt_outside = new G4KineticTrackVector;
2098     std::for_each( theSecondaryList.begin(),t << 1673   std::for_each( theSecondaryList.begin(),theSecondaryList.end(),
2099             SelectFromKTV(kt_inside, G4Kineti << 1674            SelectFromKTV(kt_outside,G4KineticTrack::outside));
2100     //  PrintKTVector(kt_inside, std::string( << 1675 //  PrintKTVector(kt_outside, std::string("DoTimeStep - found outside"));   
2101     //-----                                   << 1676 
                                                   >> 1677   G4KineticTrackVector * kt_inside = new G4KineticTrackVector;
                                                   >> 1678   std::for_each( theSecondaryList.begin(),theSecondaryList.end(),
                                                   >> 1679            SelectFromKTV(kt_inside, G4KineticTrack::inside));
                                                   >> 1680 //  PrintKTVector(kt_inside, std::string("DoTimeStep - found inside"));   
                                                   >> 1681 //-----
2102     G4KineticTrackVector dummy;   // needed f    1682     G4KineticTrackVector dummy;   // needed for re-usability
2103 #ifdef debug_BIC_DoTimeStep                   << 1683     #ifdef debug_BIC_DoTimeStep
2104     G4cout << "NOW WE ARE ENTERING THE TRANSP    1684     G4cout << "NOW WE ARE ENTERING THE TRANSPORT"<<G4endl;
2105 #endif                                        << 1685     #endif
2106                                               << 
2107     // =================== Here we move the p << 
2108                                               << 
2109     thePropagator->Transport(theSecondaryList << 
2110                                                  1686 
2111     // =================== Here we move the p << 1687 // =================== Here we move the particles  ===================  
2112                                                  1688 
2113     //------                                  << 1689      thePropagator->Transport(theSecondaryList, dummy, theTimeStep);
                                                   >> 1690      
                                                   >> 1691 // =================== Here we move the particles  ===================  
2114                                                  1692 
2115     theMomentumTransfer += thePropagator->Get << 1693 //------
2116 #ifdef debug_BIC_DoTimeStep                      1694 #ifdef debug_BIC_DoTimeStep
2117     G4cout << "DoTimeStep : theMomentumTransf << 1695   PrintKTVector(&theSecondaryList, std::string("DoTimeStep - secondaries"));
2118     PrintKTVector(&theSecondaryList, std::str << 1696     debug.push_back("======> DoTimeStep 1.1.1"); debug.dump();
2119 #endif                                           1697 #endif
2120                                                  1698 
2121     //_DebugEpConservation(" after stepping") << 1699      theMomentumTransfer += thePropagator->GetMomentumTransfer();
2122                                               << 
2123     // Partclies which went INTO nucleus      << 
2124                                               << 
2125     G4KineticTrackVector * kt_gone_in = new G << 
2126     std::for_each( kt_outside->begin(),kt_out << 
2127             SelectFromKTV(kt_gone_in,G4Kineti << 
2128     //  PrintKTVector(kt_gone_in, std::string << 
2129                                               << 
2130                                               << 
2131     // Partclies which  went OUT OF nucleus   << 
2132     G4KineticTrackVector * kt_gone_out = new  << 
2133     std::for_each( kt_inside->begin(),kt_insi << 
2134             SelectFromKTV(kt_gone_out, G4Kine << 
2135                                               << 
2136     //  PrintKTVector(kt_gone_out, std::strin << 
2137                                               << 
2138     G4KineticTrackVector *fail=CorrectBarions << 
2139                                               << 
2140     if ( fail )                               << 
2141     {                                         << 
2142         // some particle(s) supposed to enter << 
2143         kt_gone_in->clear();                  << 
2144         std::for_each( kt_outside->begin(),kt << 
2145                 SelectFromKTV(kt_gone_in,G4Ki << 
2146                                               << 
2147         kt_gone_out->clear();                 << 
2148         std::for_each( kt_inside->begin(),kt_ << 
2149                 SelectFromKTV(kt_gone_out, G4 << 
2150                                               << 
2151 #ifdef debug_BIC_DoTimeStep                   << 
2152         PrintKTVector(fail,std::string(" Fail << 
2153         PrintKTVector(kt_gone_in, std::string << 
2154         PrintKTVector(kt_gone_out, std::strin << 
2155 #endif                                        << 
2156         delete fail;                          << 
2157     }                                         << 
2158                                               << 
2159     // Add tracks missing nucleus and tracks  << 
2160     std::for_each( kt_outside->begin(),kt_out << 
2161             SelectFromKTV(kt_gone_out,G4Kinet << 
2162     //PrintKTVector(kt_gone_out, std::string( << 
2163     std::for_each( kt_outside->begin(),kt_out << 
2164             SelectFromKTV(kt_gone_out,G4Kinet << 
2165                                               << 
2166 #ifdef debug_BIC_DoTimeStep                      1700 #ifdef debug_BIC_DoTimeStep
2167     PrintKTVector(kt_gone_out, std::string("a << 1701     G4cout << "DoTimeStep : theMomentumTransfer = " << theMomentumTransfer << G4endl;
2168 #endif                                           1702 #endif
                                                   >> 1703      
                                                   >> 1704 // Partclies which went INTO nucleus
                                                   >> 1705 
                                                   >> 1706   G4KineticTrackVector * kt_gone_in = new G4KineticTrackVector;
                                                   >> 1707   std::for_each( kt_outside->begin(),kt_outside->end(),
                                                   >> 1708            SelectFromKTV(kt_gone_in,G4KineticTrack::inside));
                                                   >> 1709 //  PrintKTVector(kt_gone_in, std::string("DoTimeStep - gone in"));   
                                                   >> 1710 
                                                   >> 1711    //PrintKTVector(&theSecondaryList,std::string("aft trsprt....."));
                                                   >> 1712 
                                                   >> 1713 // Partclies which  went OUT OF nucleus
                                                   >> 1714   G4KineticTrackVector * kt_gone_out = new G4KineticTrackVector;
                                                   >> 1715   std::for_each( kt_inside->begin(),kt_inside->end(),
                                                   >> 1716            SelectFromKTV(kt_gone_out, G4KineticTrack::gone_out));
                                                   >> 1717 
                                                   >> 1718 //  PrintKTVector(kt_gone_out, std::string("DoTimeStep - gone out"));   
                                                   >> 1719   G4KineticTrackVector *fail=CorrectBarionsOnBoundary(kt_gone_in,kt_gone_out);
                                                   >> 1720   if ( fail )
                                                   >> 1721   {
                                                   >> 1722     // some particle(s) supposed to leave was captured by the correction
                                                   >> 1723 //     PrintKTVector(fail,std::string(" Failed to go out -> captured"));
                                                   >> 1724      delete fail;
                                                   >> 1725      kt_gone_out->clear();
                                                   >> 1726      std::for_each( kt_inside->begin(),kt_inside->end(),
                                                   >> 1727            SelectFromKTV(kt_gone_out, G4KineticTrack::gone_out));
                                                   >> 1728 //    PrintKTVector(kt_gone_out, std::string("recreated kt_gone_out"));
                                                   >> 1729      
                                                   >> 1730   } 
                                                   >> 1731 
                                                   >> 1732 // Add tracks missing nucleus and tracks going straight though  to addFinals
                                                   >> 1733   std::for_each( kt_outside->begin(),kt_outside->end(),
                                                   >> 1734            SelectFromKTV(kt_gone_out,G4KineticTrack::miss_nucleus));
                                                   >> 1735   std::for_each( kt_outside->begin(),kt_outside->end(),
                                                   >> 1736            SelectFromKTV(kt_gone_out,G4KineticTrack::gone_out));
                                                   >> 1737     
                                                   >> 1738     #ifdef debug_BIC_DoTimeStep
                                                   >> 1739     PrintKTVector(kt_gone_out, std::string("append to final state.."));
                                                   >> 1740     #endif
2169                                                  1741 
2170     theFinalState.insert(theFinalState.end(), << 1742   theFinalState.insert(theFinalState.end(),
2171             kt_gone_out->begin(),kt_gone_out- << 1743       kt_gone_out->begin(),kt_gone_out->end());
2172                                                  1744 
2173     // Partclies which could not leave nucleu << 1745 // Partclies which could not leave nucleus,  captured...
2174     G4KineticTrackVector * kt_captured = new  << 1746   G4KineticTrackVector * kt_captured = new G4KineticTrackVector;
2175     std::for_each( theSecondaryList.begin(),t    1747     std::for_each( theSecondaryList.begin(),theSecondaryList.end(),
2176             SelectFromKTV(kt_captured, G4Kine << 1748            SelectFromKTV(kt_captured, G4KineticTrack::captured));
2177                                                  1749 
2178     // Check no track is part in next collisi << 1750 // Check no track is part in next collision, ie.
2179     //  this step was to far, and collisions  << 1751 //  this step was to far, and collisions should not occur any more 
2180                                                  1752 
2181     if ( theCollisionMgr->Entries()> 0 )      << 1753   if ( theCollisionMgr->Entries()> 0 )
2182     {                                         << 1754   {
2183         if (kt_gone_out->size() )             << 1755      if (kt_gone_out->size() )
2184         {                                     << 1756      {
2185             G4KineticTrack * nextPrimary = th << 1757   G4KineticTrack * nextPrimary = theCollisionMgr->GetNextCollision()->GetPrimary();
2186             iter = std::find(kt_gone_out->beg << 1758   iter = std::find(kt_gone_out->begin(),kt_gone_out->end(),nextPrimary);
2187             if ( iter !=  kt_gone_out->cend() << 1759   if ( iter !=  kt_gone_out->end() )
2188             {                                 << 1760   {
2189                 success=false;                << 1761      success=false;
2190 #ifdef debug_BIC_DoTimeStep                      1762 #ifdef debug_BIC_DoTimeStep
2191                 G4cout << " DoTimeStep - WARN << 1763      G4cout << " DoTimeStep - WARNING: deleting current collision!" << G4endl;
2192 #endif                                           1764 #endif
2193             }                                 << 1765   }
2194         }                                     << 1766      }  
2195         if ( kt_captured->size() )            << 1767      if ( kt_captured->size() )
2196         {                                     << 1768      {
2197             G4KineticTrack * nextPrimary = th << 1769   G4KineticTrack * nextPrimary = theCollisionMgr->GetNextCollision()->GetPrimary();
2198             iter = std::find(kt_captured->beg << 1770   iter = std::find(kt_captured->begin(),kt_captured->end(),nextPrimary);
2199             if ( iter !=  kt_captured->cend() << 1771   if ( iter !=  kt_captured->end() )
2200             {                                 << 1772   {
2201                 success=false;                << 1773      success=false;
2202 #ifdef debug_BIC_DoTimeStep                      1774 #ifdef debug_BIC_DoTimeStep
2203                 G4cout << " DoTimeStep - WARN << 1775      G4cout << " DoTimeStep - WARNING: deleting current collision!" << G4endl;
2204 #endif                                           1776 #endif
2205             }                                 << 1777   }
2206         }                                     << 1778      }  
2207                                               << 
2208     }                                         << 
2209     // PrintKTVector(kt_gone_out," kt_gone_ou << 
2210     UpdateTracksAndCollisions(kt_gone_out,0 , << 
2211                                               << 
2212                                               << 
2213     if ( kt_captured->size() )                << 
2214     {                                         << 
2215         theCapturedList.insert(theCapturedLis << 
2216                 kt_captured->begin(),kt_captu << 
2217         //should be      std::for_each(kt_cap << 
2218         //              std::mem_fun(&G4Kinet << 
2219         // but VC 6 requires:                 << 
2220         for(auto i_captured=kt_captured->cbeg << 
2221         {                                     << 
2222             (*i_captured)->Hit();             << 
2223         }                                     << 
2224         //     PrintKTVector(kt_captured," kt << 
2225         UpdateTracksAndCollisions(kt_captured << 
2226     }                                         << 
2227                                                  1779 
                                                   >> 1780   }
                                                   >> 1781     //G4cout << "Here we are 4 "<<kt_gone_out->size()<<G4endl;
                                                   >> 1782 //     PrintKTVector(kt_gone_out," kt_gone_out be4 updatetrack...");
                                                   >> 1783   UpdateTracksAndCollisions(kt_gone_out,0 ,0);
                                                   >> 1784     //G4cout << "Here we are 5"<<G4endl;
                                                   >> 1785 
                                                   >> 1786 
                                                   >> 1787   if ( kt_captured->size() )
                                                   >> 1788   {
                                                   >> 1789      theCapturedList.insert(theCapturedList.end(),
                                                   >> 1790                             kt_captured->begin(),kt_captured->end());
                                                   >> 1791 //should be      std::for_each(kt_captured->begin(),kt_captured->end(),
                                                   >> 1792 //              std::mem_fun(&G4KineticTrack::Hit));
                                                   >> 1793 // but VC 6 requires:
                                                   >> 1794      std::vector<G4KineticTrack *>::iterator i_captured;
                                                   >> 1795      for(i_captured=kt_captured->begin();i_captured!=kt_captured->end();i_captured++)
                                                   >> 1796      {
                                                   >> 1797         (*i_captured)->Hit();
                                                   >> 1798      }
                                                   >> 1799 //     PrintKTVector(kt_captured," kt_catured be4 updatetrack...");
                                                   >> 1800      UpdateTracksAndCollisions(kt_captured, NULL, NULL);
                                                   >> 1801   }
                                                   >> 1802   
2228 #ifdef debug_G4BinaryCascade                     1803 #ifdef debug_G4BinaryCascade
2229     delete kt_inside;                         << 1804   delete kt_inside;
2230     kt_inside = new G4KineticTrackVector;     << 1805   kt_inside = new G4KineticTrackVector;
2231     std::for_each( theSecondaryList.begin(),t << 1806   std::for_each( theSecondaryList.begin(),theSecondaryList.end(),
2232             SelectFromKTV(kt_inside, G4Kineti << 1807            SelectFromKTV(kt_inside, G4KineticTrack::inside));
2233     if ( currentZ != (GetTotalCharge(theTarge << 1808    if ( currentZ != (GetTotalCharge(theTargetList) 
2234             + GetTotalCharge(theCapturedList) << 1809                     + GetTotalCharge(theCapturedList)
2235             + GetTotalCharge(*kt_inside)) )   << 1810         + GetTotalCharge(*kt_inside)) )
2236     {                                         << 1811    {
2237         G4cout << " error-DoTimeStep aft, A,  << 1812       G4cout << " error-DoTimeStep, aft, A, Z, sec-Z,... "
2238                 << " sum(tgt,capt,active) "   << 1813        << currentA << " "
2239                 << GetTotalCharge(theTargetLi << 1814        << currentZ << " "
2240                 << " targets: "  << GetTotalC << 1815        << GetTotalCharge(theTargetList)
2241                 << " captured: " << GetTotalC << 1816           + GetTotalCharge(theCapturedList)
2242                 << " active: "   << GetTotalC << 1817           + GetTotalCharge(*kt_inside) << " "
2243                 << G4endl;                    << 1818        << GetTotalCharge(theTargetList) << " " 
2244     }                                         << 1819        << GetTotalCharge(theCapturedList) << " "
2245 #endif                                        << 1820        << GetTotalCharge(*kt_inside) << " "
2246                                               << 1821        << G4endl;
2247     delete kt_inside;                         << 1822    }    
2248     delete kt_outside;                        << 1823 #endif
2249     delete kt_captured;                       << 1824 
2250     delete kt_gone_in;                        << 1825   delete kt_inside;
2251     delete kt_gone_out;                       << 1826   delete kt_outside;
                                                   >> 1827   delete kt_captured;
                                                   >> 1828   delete kt_gone_in;
                                                   >> 1829   delete kt_gone_out;
2252                                                  1830 
2253     //  G4cerr <<"G4BinaryCascade::DoTimeStep << 1831 //  G4cerr <<"G4BinaryCascade::DoTimeStep: exit "<<G4endl;
2254     theCurrentTime += theTimeStep;            << 1832   theCurrentTime += theTimeStep;
2255                                                  1833 
2256     //debug.push_back("======> DoTimeStep 2") << 1834   //debug.push_back("======> DoTimeStep 2"); debug.dump();
2257     return success;                           << 1835   return success;
2258                                                  1836 
2259 }                                                1837 }
2260                                                  1838 
2261 //-------------------------------------------    1839 //----------------------------------------------------------------------------
2262 G4KineticTrackVector* G4BinaryCascade::Correc    1840 G4KineticTrackVector* G4BinaryCascade::CorrectBarionsOnBoundary(
2263         G4KineticTrackVector *in,             << 1841                                  G4KineticTrackVector *in, 
2264         G4KineticTrackVector *out)            << 1842                                  G4KineticTrackVector *out)
2265 //-------------------------------------------    1843 //----------------------------------------------------------------------------
2266 {                                                1844 {
2267     G4KineticTrackVector * kt_fail(nullptr);  << 1845    G4KineticTrackVector * kt_fail(0);
2268     std::vector<G4KineticTrack *>::const_iter << 1846    std::vector<G4KineticTrack *>::iterator iter;
2269     //  G4cout << "CorrectBarionsOnBoundary,c << 1847 //  G4cout << "CorrectBarionsOnBoundary,currentZ,currentA," 
2270     //         << currentZ << " "<< currentA  << 1848 //         << currentZ << " "<< currentA << G4endl;
2271     if (in->size())                           << 1849   if (in->size())
2272     {                                         << 1850   {
2273         G4int secondaries_in(0);              << 1851      G4int secondaries_in(0);
2274         G4int secondaryBarions_in(0);         << 1852      G4int secondaryBarions_in(0);
2275         G4int secondaryCharge_in(0);          << 1853      G4int secondaryCharge_in(0);
2276         G4double secondaryMass_in(0);         << 1854      G4double secondaryMass_in(0);
2277                                               << 1855 
2278         for ( iter =in->cbegin(); iter != in- << 1856      for ( iter =in->begin(); iter != in->end(); ++iter)
2279         {                                     << 1857      {
2280             ++secondaries_in;                 << 1858    ++secondaries_in;
2281             secondaryCharge_in += G4lrint((*i << 1859    secondaryCharge_in += G4lrint((*iter)->GetDefinition()->GetPDGCharge());
2282             if ((*iter)->GetDefinition()->Get << 1860    if ((*iter)->GetDefinition()->GetBaryonNumber()==1 )
2283             {                                 << 1861    {
2284                 secondaryBarions_in += (*iter << 1862       ++secondaryBarions_in;
2285                 if((*iter)->GetDefinition() = << 1863       if((*iter)->GetDefinition() == G4Neutron::Neutron() ||
2286                         (*iter)->GetDefinitio << 1864          (*iter)->GetDefinition() == G4Proton::Proton()  )
2287                 {                             << 1865       {
2288                     secondaryMass_in += (*ite << 1866          secondaryMass_in += (*iter)->GetDefinition()->GetPDGMass();
2289                 } else    {                   << 1867       } else    {
2290                     secondaryMass_in += G4Pro << 1868         secondaryMass_in += G4Proton::Proton()->GetPDGMass();
2291                 }                             << 1869       }
2292             }                                 << 1870    }
2293         }                                     << 1871      }
2294         G4double mass_initial= GetIonMass(cur << 1872      G4double mass_initial= GetIonMass(currentZ,currentA);
2295                                               << 1873           
2296         currentZ += secondaryCharge_in;       << 1874      currentZ += secondaryCharge_in;
2297         currentA += secondaryBarions_in;      << 1875      currentA += secondaryBarions_in;
2298                                               << 1876      
2299         //  G4cout << "CorrectBarionsOnBounda << 1877 //  G4cout << "CorrectBarionsOnBoundary,secondaryCharge_in, secondaryBarions_in"
2300         //         <<    secondaryCharge_in < << 1878 //         <<    secondaryCharge_in << " "<<  secondaryBarions_in << G4endl;
2301                                               << 1879      
2302         G4double mass_final= GetIonMass(curre << 1880      G4double mass_final= GetIonMass(currentZ,currentA);
2303                                               << 1881      
2304         G4double correction= secondaryMass_in << 1882      G4double correction= secondaryMass_in + mass_initial - mass_final;
2305         if (secondaries_in>1)                 << 1883      if (secondaries_in>1) 
2306         {correction /= secondaries_in;}       << 1884        {correction /= secondaries_in;}
2307                                                  1885 
2308 #ifdef debug_BIC_CorrectBarionsOnBoundary        1886 #ifdef debug_BIC_CorrectBarionsOnBoundary
2309         G4cout << "CorrectBarionsOnBoundary,c << 1887        G4cout << "CorrectBarionsOnBoundary,currentZ,currentA,"
2310                 << "secondaryCharge_in,second << 1888              << "secondaryCharge_in,secondaryBarions_in," 
2311                 << "energy correction,m_secon << 1889              << "energy correction,m_secondry,m_nucl_init,m_nucl_final "
2312                 << currentZ << " "<< currentA << 1890    << currentZ << " "<< currentA <<" "
2313                 << secondaryCharge_in<<" "<<s << 1891    << secondaryCharge_in<<" "<<secondaryBarions_in<<" "
2314                 << correction << " "          << 1892    << correction << " "
2315                 << secondaryMass_in << " "    << 1893    << secondaryMass_in << " "
2316                 << mass_initial << " "        << 1894    << mass_initial << " "
2317                 << mass_final << " "          << 1895    << mass_final << " "
2318                 << G4endl;                    << 1896    << G4endl;
2319         PrintKTVector(in,std::string("in be4  << 1897      PrintKTVector(in,std::string("in be4 correction"));
2320 #endif                                        << 1898 #endif
2321         for ( iter = in->cbegin(); iter != in << 1899  
2322         {                                     << 1900      for ( iter = in->begin(); iter != in->end(); ++iter)
2323             if ((*iter)->GetTrackingMomentum( << 1901      {
2324             {                                 << 1902   (*iter)->UpdateTrackingMomentum((*iter)->GetTrackingMomentum().e() + correction);
2325                 (*iter)->UpdateTrackingMoment << 1903      }
2326             } else {                          << 
2327                 //particle cannot go in, put  << 
2328                 G4RKPropagation * RKprop=(G4R << 
2329                 (*iter)->SetState(G4KineticTr << 
2330                 // Undo correction for Colomb << 
2331                 G4double barrier=RKprop->GetB << 
2332                 (*iter)->UpdateTrackingMoment << 
2333                 if ( ! kt_fail ) kt_fail=new  << 
2334                 kt_fail->push_back(*iter);    << 
2335                 currentZ -= G4lrint((*iter)-> << 
2336                 currentA -= (*iter)->GetDefin << 
2337                                               << 
2338             }                                 << 
2339                                               << 
2340         }                                     << 
2341 #ifdef debug_BIC_CorrectBarionsOnBoundary        1904 #ifdef debug_BIC_CorrectBarionsOnBoundary
2342         G4cout << " CorrectBarionsOnBoundary, << 1905    G4cout << " CorrectBarionsOnBoundary, aft, A, Z, sec-Z,A,m,m_in_nucleus "
2343                 << currentZ << " " << current << 1906        << currentA << " " << currentZ << " "
2344                 << secondaryCharge_in << " "  << 1907        << secondaryCharge_in << " " << secondaryBarions_in << " "
2345                 << secondaryMass_in  << " "   << 1908        << secondaryMass_in  << " "
2346                 << G4endl;                    << 1909        << G4endl;
2347         PrintKTVector(in,std::string("in AFT  << 1910      PrintKTVector(in,std::string("in AFT correction"));
2348 #endif                                        << 1911 #endif
2349                                               << 1912     
2350     }                                         << 1913   }
2351     //--------------------------------------- << 1914 //----------------------------------------------
2352     if (out->size())                          << 1915   if (out->size())
2353     {                                         << 1916   {
2354         G4int secondaries_out(0);             << 1917      G4int secondaries_out(0);
2355         G4int secondaryBarions_out(0);        << 1918      G4int secondaryBarions_out(0);
2356         G4int secondaryCharge_out(0);         << 1919      G4int secondaryCharge_out(0);
2357         G4double secondaryMass_out(0);        << 1920      G4double secondaryMass_out(0);
2358                                               << 1921 
2359         for ( iter = out->cbegin(); iter != o << 1922      for ( iter =out->begin(); iter != out->end(); ++iter)
2360         {                                     << 1923      {
2361             ++secondaries_out;                << 1924    ++secondaries_out;
2362             secondaryCharge_out += G4lrint((* << 1925    secondaryCharge_out += G4lrint((*iter)->GetDefinition()->GetPDGCharge());
2363             if ((*iter)->GetDefinition()->Get << 1926    if ((*iter)->GetDefinition()->GetBaryonNumber()==1 )
2364             {                                 << 1927    {
2365                 secondaryBarions_out += (*ite << 1928       ++secondaryBarions_out;
2366                 if((*iter)->GetDefinition() = << 1929       if((*iter)->GetDefinition() == G4Neutron::Neutron() ||
2367                         (*iter)->GetDefinitio << 1930          (*iter)->GetDefinition() == G4Proton::Proton()  ) 
2368                 {                             << 1931       {
2369                     secondaryMass_out += (*it << 1932          secondaryMass_out += (*iter)->GetDefinition()->GetPDGMass();
2370                 } else {                      << 1933       } else {
2371                     secondaryMass_out += G4Ne << 1934          secondaryMass_out += G4Neutron::Neutron()->GetPDGMass();
2372                 }                             << 1935       }
2373             }                                 << 1936    }
2374         }                                     << 1937      }
2375                                               << 1938 
2376         G4double mass_initial=  GetIonMass(cu << 1939      G4double mass_initial=  GetIonMass(currentZ,currentA);
2377         currentA -=secondaryBarions_out;      << 1940      currentA -=secondaryBarions_out;
2378         currentZ -=secondaryCharge_out;       << 1941      currentZ -=secondaryCharge_out;
2379                                               << 1942 
2380         //  G4cout << "CorrectBarionsOnBounda << 1943 //  G4cout << "CorrectBarionsOnBoundary,secondaryCharge_out, secondaryBarions_out"
2381         //         <<    secondaryCharge_out  << 1944 //         <<    secondaryCharge_out << " "<<  secondaryBarions_out << G4endl;
2382                                               << 1945 
2383         //                        a delta min << 1946 //                        a delta minus will do currentZ < 0 in light nuclei
2384         //     if (currentA < 0 || currentZ < << 1947 //     if (currentA < 0 || currentZ < 0 ) 
2385         if (currentA < 0 )                    << 1948      if (currentA < 0 ) 
2386         {                                     << 1949      {   
2387             G4cerr << "G4BinaryCascade - seco << 1950     G4cerr << "G4BinaryCascade - secondaryBarions_out,secondaryCharge_out " <<
2388                     secondaryBarions_out << " << 1951            secondaryBarions_out << " " << secondaryCharge_out << G4endl;
2389             PrintKTVector(&theTargetList,"Cor << 1952   PrintKTVector(&theTargetList,"CorrectBarionsOnBoundary Target");
2390             PrintKTVector(&theCapturedList,"C << 1953   PrintKTVector(&theCapturedList,"CorrectBarionsOnBoundary Captured");
2391             PrintKTVector(&theSecondaryList," << 1954   PrintKTVector(&theSecondaryList,"CorrectBarionsOnBoundary Secondaries");
2392             G4cerr << "G4BinaryCascade - curr << 1955         G4cerr << "G4BinaryCascade - currentA, currentZ " << currentA << " " << currentZ << G4endl; 
2393             throw G4HadronicException(__FILE_ << 1956         throw G4HadronicException(__FILE__, __LINE__, "G4BinaryCascade::CorrectBarionsOnBoundary() - fatal error");
2394         }                                     << 1957      }
2395         G4double mass_final=GetIonMass(curren << 1958      G4double mass_final=GetIonMass(currentZ,currentA);
2396         G4double correction= mass_initial - m << 1959      G4double correction= mass_initial - mass_final - secondaryMass_out;
2397         // G4cout << "G4BinaryCascade::Correc << 
2398                                                  1960 
2399         if (secondaries_out>1) correction /=  << 1961      if (secondaries_out>1) correction /= secondaries_out;
2400 #ifdef debug_BIC_CorrectBarionsOnBoundary        1962 #ifdef debug_BIC_CorrectBarionsOnBoundary
2401         G4cout << "DoTimeStep,(current Z,A)," << 1963        G4cout << "DoTimeStep,currentZ,currentA,"
2402                 << "(secondaries out,Charge,B << 1964         << "secondaries_out,"
2403                 <<"* energy correction,(m_sec << 1965               <<"secondaryCharge_out,secondaryBarions_out,"
2404                 << "("<< currentZ << ","<< cu << 1966         <<"energy correction,m_secondry,m_nucl_init,m_nucl_final "
2405                 << secondaries_out << ","     << 1967    << " "<< currentZ << " "<< currentA <<" "
2406                 << secondaryCharge_out<<","<< << 1968    << secondaries_out << " " 
2407                 << correction << " ("         << 1969    << secondaryCharge_out<<" "<<secondaryBarions_out<<" "
2408                 << secondaryMass_out << ", "  << 1970    << correction << " "
2409                 << mass_initial << ", "       << 1971    << secondaryMass_out << " "
2410                 << mass_final << ")"          << 1972    << mass_initial << " "
2411                 << G4endl;                    << 1973    << mass_final << " "
2412         PrintKTVector(out,std::string("out be << 1974    << G4endl;
2413 #endif                                        << 1975      PrintKTVector(out,std::string("out be4 correction"));
2414                                               << 1976 #endif
2415         for ( iter = out->cbegin(); iter != o << 1977  
2416         {                                     << 1978      for ( iter = out->begin(); iter != out->end(); ++iter)
2417             if ((*iter)->GetTrackingMomentum( << 1979      {
2418             {                                 << 1980         if ((*iter)->GetTrackingMomentum().e()+correction > (*iter)->GetActualMass())
2419                 (*iter)->UpdateTrackingMoment << 1981   {
2420             } else                            << 1982      (*iter)->UpdateTrackingMomentum((*iter)->GetTrackingMomentum().e() + correction);
2421             {                                 << 1983   } else
2422                 // particle cannot go out due << 1984   {
2423                 //  capture protons and neutr << 1985      // particle cannot go out due to change of nuclear potential! 
2424                 if(((*iter)->GetDefinition()  << 1986      //  capture protons and neutrons; 
2425                         ((*iter)->GetDefiniti << 1987      if(((*iter)->GetDefinition() == G4Proton::Proton()) ||
2426                 {                             << 1988      ((*iter)->GetDefinition() == G4Neutron::Neutron()))
2427                     (*iter)->SetState(G4Kinet << 1989            {
2428                     // Undo correction for Co << 1990        G4RKPropagation * RKprop=(G4RKPropagation *)thePropagator;
2429                     G4double barrier=((G4RKPr << 1991        (*iter)->SetState(G4KineticTrack::captured);
2430                     (*iter)->UpdateTrackingMo << 1992        // Undo correction for Colomb Barrier
2431                     if ( kt_fail == 0 ) kt_fa << 1993        G4double barrier=RKprop->GetBarrier((*iter)->GetDefinition()->GetPDGEncoding());
2432                     kt_fail->push_back(*iter) << 1994        (*iter)->UpdateTrackingMomentum((*iter)->GetTrackingMomentum().e() - barrier); 
2433                     currentZ += G4lrint((*ite << 1995        if ( kt_fail == 0 ) kt_fail=new G4KineticTrackVector;
2434                     currentA += (*iter)->GetD << 1996        kt_fail->push_back(*iter);   
2435                 }                             << 1997        currentZ += G4lrint((*iter)->GetDefinition()->GetPDGCharge());
                                                   >> 1998        if ((*iter)->GetDefinition()->GetBaryonNumber()==1 ) ++currentA;
                                                   >> 1999      } 
2436 #ifdef debug_BIC_CorrectBarionsOnBoundary        2000 #ifdef debug_BIC_CorrectBarionsOnBoundary
2437                 else                          << 2001      else
2438                 {                             << 2002      {
2439                     G4cout << "Not correcting << 2003         G4cout << "Not correcting outgoing " << *iter << " " 
2440                             << (*iter)->GetDe << 2004                << (*iter)->GetDefinition()->GetPDGEncoding() << " " 
2441                             << (*iter)->GetDe << 2005          << (*iter)->GetDefinition()->GetParticleName() << G4endl;
2442                     PrintKTVector(out,std::st << 2006         PrintKTVector(out,std::string("outgoing, one not corrected"));
2443                 }                             << 2007      }          
2444 #endif                                           2008 #endif
2445             }                                 << 2009   }   
2446         }                                     << 2010      }
2447                                                  2011 
2448 #ifdef debug_BIC_CorrectBarionsOnBoundary        2012 #ifdef debug_BIC_CorrectBarionsOnBoundary
2449         PrintKTVector(out,std::string("out AF << 2013      PrintKTVector(out,std::string("out AFTER correction"));
2450         G4cout << " DoTimeStep, nucl-update,  << 2014       G4cout << " DoTimeStep, nucl-update, A, Z, sec-Z,A,m,m_in_nucleus, table-mass, delta "
2451                 << currentA << " "<< currentZ << 2015         << currentA << " "<< currentZ << " "
2452                 << secondaryCharge_out << " " << 2016   << secondaryCharge_out << " "<< secondaryBarions_out << " "<<
2453                 secondaryMass_out << " "      << 2017   secondaryMass_out << " "
2454                 << massInNucleus << " "       << 2018         << massInNucleus << " "
2455                 << GetIonMass(currentZ,curren << 2019         << G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(currentZ,currentA)
2456                 << " " << massInNucleus - Get << 2020         << " " << massInNucleus -G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(currentZ,currentA)
2457                 << G4endl;                    << 2021   << G4endl;
2458 #endif                                        << 2022 #endif
2459     }                                         << 2023   }
2460                                               << 2024   
2461     return kt_fail;                           << 2025   return kt_fail;
2462 }                                                2026 }
2463                                                  2027 
2464                                               << 2028              
2465 //-------------------------------------------    2029 //----------------------------------------------------------------------------
2466                                                  2030 
2467 G4Fragment * G4BinaryCascade::FindFragments()    2031 G4Fragment * G4BinaryCascade::FindFragments()
2468 //-------------------------------------------    2032 //----------------------------------------------------------------------------
2469 {                                                2033 {
2470                                                  2034 
                                                   >> 2035   G4int a = theTargetList.size()+theCapturedList.size();
2471 #ifdef debug_BIC_FindFragments                   2036 #ifdef debug_BIC_FindFragments
2472     G4cout << "target, captured, secondary: " << 2037   G4cout << "target, captured, secondary: "
2473             << theTargetList.size() << " "    << 2038          << theTargetList.size() << " " 
2474             << theCapturedList.size()<< " "   << 2039    << theCapturedList.size()<< " "
2475             << theSecondaryList.size()        << 2040    << theSecondaryList.size()
2476             << G4endl;                        << 2041    << G4endl;
2477 #endif                                        << 2042 #endif
2478                                               << 2043   G4int zTarget = 0;
2479     G4int a = G4int(theTargetList.size()+theC << 2044   G4KineticTrackVector::iterator i;
2480     G4int zTarget = 0;                        << 2045   for(i = theTargetList.begin(); i != theTargetList.end(); ++i)
2481     for(auto i = theTargetList.cbegin(); i != << 2046   {
2482     {                                         << 2047       if((*i)->GetDefinition()->GetPDGCharge() == eplus)
2483         if(G4lrint((*i)->GetDefinition()->Get << 2048       {
2484         {                                     << 2049          zTarget++;
2485             zTarget++;                        << 2050       }
2486         }                                     << 2051   }
2487     }                                         << 
2488                                                  2052 
2489     G4int zCaptured = 0;                      << 2053   G4int zCaptured = 0;
2490     G4LorentzVector CapturedMomentum(0.,0.,0. << 2054   G4LorentzVector CapturedMomentum=0;
2491     for(auto i = theCapturedList.cbegin(); i  << 2055   for(i = theCapturedList.begin(); i != theCapturedList.end(); ++i)
2492     {                                         << 2056   {
2493         CapturedMomentum += (*i)->Get4Momentu << 2057       CapturedMomentum += (*i)->Get4Momentum();
2494         if(G4lrint((*i)->GetDefinition()->Get << 2058       if((*i)->GetDefinition()->GetPDGCharge() == eplus)
2495         {                                     << 2059       {
2496             zCaptured++;                      << 2060    zCaptured++;
2497         }                                     << 2061       }
2498     }                                         << 2062   }
2499                                                  2063 
2500     G4int z = zTarget+zCaptured;              << 2064   G4int z = zTarget+zCaptured;
2501                                                  2065 
2502 #ifdef debug_G4BinaryCascade                     2066 #ifdef debug_G4BinaryCascade
2503     if ( z != (GetTotalCharge(theTargetList)  << 2067   if ( z != (GetTotalCharge(theTargetList) + GetTotalCharge(theCapturedList)) )
2504     {                                         << 2068   {
2505         G4cout << " FindFragment Counting err << 2069       G4cout << " FindFragment Counting error z a " << z << " " <<a << " "  
2506                 << GetTotalCharge(theTargetLi << 2070       << GetTotalCharge(theTargetList) << " " <<  GetTotalCharge(theCapturedList)<<
2507                 G4endl;                       << 2071       G4endl;
2508         PrintKTVector(&theTargetList, std::st << 2072       PrintKTVector(&theTargetList, std::string("theTargetList"));
2509         PrintKTVector(&theCapturedList, std:: << 2073       PrintKTVector(&theCapturedList, std::string("theCapturedList"));
2510     }                                         << 2074   }
2511 #endif                                        << 2075 #endif
2512     //debug                                   << 2076 //debug
2513     /*                                        << 2077 /*
2514      *   G4cout << " Fragment mass table / re << 2078  *   G4cout << " Fragment mass table / real "
2515      *          << GetIonMass(z, a)           << 2079  *          << G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(z, a)
2516      *   << " / " << GetFinal4Momentum().mag( << 2080  *   << " / " << GetFinal4Momentum().mag()
2517      *   << " difference "                    << 2081  *   << " difference "
2518      *   <<  GetFinal4Momentum().mag() - GetI << 2082  *   <<  GetFinal4Momentum().mag() - G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(z, a)
2519      *   << G4endl;                           << 2083  *   << G4endl;
2520      */                                       << 2084  */
2521     //                                        << 2085 //
2522     //  if(fBCDEBUG) G4cerr << "Fragment A, Z << 2086 //  if(getenv("BCDEBUG") ) G4cerr << "Fragment A, Z "<< a <<" "<< z<<G4endl;
2523     if ( z < 1 ) return 0;                    << 2087   if ( z < 1 ) return 0;
2524                                               << 2088   G4Fragment * fragment = new G4Fragment(a,z,GetFinalNucleusMomentum());
2525     G4int holes = G4int(the3DNucleus->GetMass << 2089 
2526     G4int excitons = (G4int)theCapturedList.s << 2090   G4int holes = the3DNucleus->GetMassNumber() - theTargetList.size();
                                                   >> 2091   fragment->SetNumberOfHoles(holes);
                                                   >> 2092 
                                                   >> 2093   G4int excitons = theCapturedList.size();
                                                   >> 2094 //GF  fragment->SetNumberOfParticles(excitons-holes);
                                                   >> 2095   fragment->SetNumberOfParticles(excitons);
                                                   >> 2096   fragment->SetNumberOfCharged(zCaptured);
                                                   >> 2097   G4ParticleDefinition * aIonDefinition =
                                                   >> 2098        G4ParticleTable::GetParticleTable()->FindIon(a,z,0,z);
                                                   >> 2099   fragment->SetParticleDefinition(aIonDefinition);
2527 #ifdef debug_BIC_FindFragments                   2100 #ifdef debug_BIC_FindFragments
2528     G4cout << "Fragment: a= " << a << " z= "  << 2101    G4cout << "Fragment: a= " << a
2529             << " Charged= " << zCaptured << " << 2102    << " z= " << z
2530             << " excitE= " <<GetExcitationEne << 2103    << " particles= " <<  excitons
2531             << " Final4Momentum= " << GetFina << 2104    << " Charged= " << zCaptured
2532             << G4endl;                        << 2105    << " holes= " << holes
2533 #endif                                        << 2106    << " excitE= " <<GetExcitationEnergy()
2534                                               << 2107    << " Final4Momentum= " << GetFinalNucleusMomentum()
2535     G4Fragment * fragment = new G4Fragment(a, << 2108    << " capturMomentum= " << CapturedMomentum
2536     fragment->SetNumberOfHoles(holes);        << 2109    << G4endl;
2537                                               << 2110 #endif
2538     //GF  fragment->SetNumberOfParticles(exci << 
2539     fragment->SetNumberOfParticles(excitons); << 
2540     fragment->SetNumberOfCharged(zCaptured);  << 
2541     fragment->SetCreatorModelID(theBIC_ID);   << 
2542                                                  2111 
2543     return fragment;                          << 2112   return fragment;
2544 }                                                2113 }
2545                                                  2114 
2546 //-------------------------------------------    2115 //----------------------------------------------------------------------------
2547                                                  2116 
2548 G4LorentzVector G4BinaryCascade::GetFinal4Mom    2117 G4LorentzVector G4BinaryCascade::GetFinal4Momentum()
2549 //-------------------------------------------    2118 //----------------------------------------------------------------------------
2550 // Return momentum of reminder nulceus;       << 
2551 //  ie. difference of (initial state(primarie << 
2552 {                                                2119 {
2553     G4LorentzVector final4Momentum = theIniti << 2120 // the initial 3-momentum will differ from 0, if nucleus created by string model.
2554     G4LorentzVector finals(0,0,0,0);          << 2121   G4LorentzVector final4Momentum = theInitial4Mom;
2555     for(auto i = theFinalState.cbegin(); i != << 2122   G4KineticTrackVector::iterator i;
2556     {                                         << 2123   for(i = theProjectileList.begin() ; i != theProjectileList.end(); ++i)
2557         final4Momentum -= (*i)->Get4Momentum( << 2124   {
2558         finals       += (*i)->Get4Momentum(); << 2125     final4Momentum += (*i)->GetTrackingMomentum();
2559     }                                         << 2126     //G4cout << "Initial state: "<<(*i)->Get4Momentum()<<G4endl;
2560                                               << 2127   }
2561     if(final4Momentum.e()> 0 && (final4Moment << 2128   for(i = theFinalState.begin(); i != theFinalState.end(); ++i)
2562     {                                         << 2129   {
2563 #ifdef debug_BIC_Final4Momentum               << 2130     final4Momentum -= (*i)->Get4Momentum();
2564         G4cerr << G4endl;                     << 2131   }
2565         G4cerr << "G4BinaryCascade::GetFinal4 << 2132 
2566         G4KineticTrackVector::iterator i;     << 2133   if((final4Momentum.vect()/final4Momentum.e()).mag()>1.0 && currentA > 0)
2567         G4cerr <<"Total initial 4-momentum "  << 2134   {
2568         G4cerr <<" GetFinal4Momentum: Initial << 2135 #  ifdef debug_BIC_Final4Momentum
2569         for(i = theFinalState.begin(); i != t << 2136      G4cerr << G4endl;
2570         {                                     << 2137      G4cerr << "G4BinaryCascade::GetFinal4Momentum - Fatal"<<G4endl;
2571             G4cerr <<" Final state: "<<(*i)-> << 2138      G4KineticTrackVector::iterator i;
2572         }                                     << 2139      G4cerr <<" Initial nucleus "<<theInitial4Mom<<G4endl;
2573         G4cerr << "Sum( 4-mom ) finals " << f << 2140      for(i = theProjectileList.begin() ; i != theProjectileList.end(); ++i)
2574         G4cerr<< " Final4Momentum = "<<final4 << 2141      {
2575         G4cerr <<" current A, Z = "<< current << 2142        G4cerr << " Initial state (get4M), (trackingM): "
2576         G4cerr << G4endl;                     << 2143             <<(*i)->Get4Momentum()<<", " << (*i)->GetTrackingMomentum() <<","
2577 #endif                                        << 2144       <<(*i)->GetDefinition()->GetParticleName()<<G4endl;
2578                                               << 2145      }
2579         final4Momentum=G4LorentzVector(0,0,0, << 2146      for(i = theFinalState.begin(); i != theFinalState.end(); ++i)
2580     }                                         << 2147      {
2581     return final4Momentum;                    << 2148        G4cerr <<" Final state: "<<(*i)->Get4Momentum()<<(*i)->GetDefinition()->GetParticleName()<<G4endl;
                                                   >> 2149      }
                                                   >> 2150      G4cerr<< " Final4Momentum = "<<final4Momentum <<" "<<final4Momentum.m()<<G4endl;
                                                   >> 2151      G4cerr <<" current A, Z = "<< currentA<<", "<<currentZ<<G4endl;
                                                   >> 2152      G4cerr << G4endl;
                                                   >> 2153 #  endif
                                                   >> 2154 
                                                   >> 2155      final4Momentum=G4LorentzVector(0);
                                                   >> 2156   }
                                                   >> 2157   return final4Momentum;
2582 }                                                2158 }
2583                                                  2159 
2584 //-------------------------------------------    2160 //----------------------------------------------------------------------------
2585 G4LorentzVector G4BinaryCascade::GetFinalNucl    2161 G4LorentzVector G4BinaryCascade::GetFinalNucleusMomentum()
2586 //-------------------------------------------    2162 //----------------------------------------------------------------------------
2587 {                                                2163 {
2588     // return momentum of nucleus for use wit << 2164 // return momentum of nucleus for use with precompound model; also keep transformation to
2589     //   apply to precompoud products.        << 2165 //   apply to precompoud products.
2590                                               << 
2591     G4LorentzVector CapturedMomentum(0,0,0,0) << 
2592     //  G4cout << "GetFinalNucleusMomentum Ca << 
2593     for(auto i = theCapturedList.cbegin(); i  << 
2594     {                                         << 
2595         CapturedMomentum += (*i)->Get4Momentu << 
2596     }                                         << 
2597     //G4cout << "GetFinalNucleusMomentum Capt << 
2598     //  G4cerr << "it 9"<<G4endl;             << 
2599                                                  2166 
2600     G4LorentzVector NucleusMomentum = GetFina << 2167   G4LorentzVector CapturedMomentum=0;
2601     if ( NucleusMomentum.e() > 0 )            << 2168   G4KineticTrackVector::iterator i;
2602     {                                         << 2169 //  G4cout << "GetFinalNucleusMomentum Captured size: " <<theCapturedList.size() << G4endl;
2603         // G4cout << "GetFinalNucleusMomentum << 2170   for(i = theCapturedList.begin(); i != theCapturedList.end(); ++i)
2604         // boost nucleus to a frame such that << 2171   {
2605         G4ThreeVector boost= (NucleusMomentum << 2172       CapturedMomentum += (*i)->Get4Momentum();
2606         if(boost.mag2()>1.0)                  << 2173   }
2607         {                                     << 2174 //G4cout << "GetFinalNucleusMomentum CapturedMomentum= " <<CapturedMomentum << G4endl;
                                                   >> 2175 //  G4cerr << "it 9"<<G4endl;
                                                   >> 2176 
                                                   >> 2177   G4LorentzVector NucleusMomentum = GetFinal4Momentum();
                                                   >> 2178   if ( NucleusMomentum.e() > 0 )
                                                   >> 2179   { 
                                                   >> 2180        // G4cout << "GetFinalNucleusMomentum GetFinal4Momentum= " <<NucleusMomentum <<" "<<NucleusMomentum.mag()<<G4endl;
                                                   >> 2181     // boost nucleus to a frame such that the momentum of nucleus == momentum of Captured
                                                   >> 2182       G4ThreeVector boost= (NucleusMomentum.vect() -CapturedMomentum.vect())/NucleusMomentum.e();
                                                   >> 2183       if(boost.mag2()>1.0)
                                                   >> 2184       {
2608 #     ifdef debug_BIC_FinalNucleusMomentum       2185 #     ifdef debug_BIC_FinalNucleusMomentum
2609             G4cerr << "G4BinaryCascade::GetFi << 2186   G4cerr << "G4BinaryCascade::GetFinalNucleusMomentum - Fatal"<<G4endl;
2610             G4cerr << "it 0"<<boost <<G4endl; << 2187   G4cerr << "it 0"<<boost <<G4endl;
2611             G4cerr << "it 01"<<NucleusMomentu << 2188   G4cerr << "it 01"<<NucleusMomentum<<" "<<CapturedMomentum<<" "<<G4endl;
2612             G4cout <<" testing boost "<<boost << 2189   G4cout <<" testing boost "<<boost<<" "<<boost.mag()<<G4endl;
2613 #      endif                                     2190 #      endif
2614             boost=G4ThreeVector(0,0,0);       << 2191   boost=G4ThreeVector(0);
2615             NucleusMomentum=G4LorentzVector(0 << 2192   NucleusMomentum=G4LorentzVector(0);
2616         }                                     << 2193       }
2617         G4LorentzRotation  nucleusBoost( -boo << 2194       G4LorentzRotation  nucleusBoost( -boost );
2618         precompoundLorentzboost.set( boost ); << 2195       precompoundLorentzboost.set( boost );
2619 #ifdef debug_debug_BIC_FinalNucleusMomentum   << 2196     #ifdef debug_debug_BIC_FinalNucleusMomentum
2620         G4cout << "GetFinalNucleusMomentum be << 2197       G4cout << "GetFinalNucleusMomentum be4 boostNucleusMomentum, CapturedMomentum"<<NucleusMomentum<<" "<<CapturedMomentum<<" "<<G4endl;
2621 #endif                                        << 2198      #endif
2622         NucleusMomentum *= nucleusBoost;      << 2199      NucleusMomentum *= nucleusBoost;
2623 #ifdef debug_BIC_FinalNucleusMomentum         << 2200     #ifdef debug_BIC_FinalNucleusMomentum
2624         G4cout << "GetFinalNucleusMomentum af << 2201       G4cout << "GetFinalNucleusMomentum aft boost GetFinal4Momentum= " <<NucleusMomentum <<G4endl;
2625 #endif                                        << 2202     #endif
2626     }                                         << 2203   }
2627     return NucleusMomentum;                   << 2204   return NucleusMomentum;
2628 }                                                2205 }
2629                                                  2206 
2630 //-------------------------------------------    2207 //----------------------------------------------------------------------------
2631 G4ReactionProductVector * G4BinaryCascade::Pr    2208 G4ReactionProductVector * G4BinaryCascade::Propagate1H1(
2632         //----------------------------------- << 2209 //----------------------------------------------------------------------------
2633         G4KineticTrackVector * secondaries, G << 2210     G4KineticTrackVector * secondaries, G4V3DNucleus * nucleus)
2634 {                                                2211 {
2635     G4ReactionProductVector * products = new     2212     G4ReactionProductVector * products = new G4ReactionProductVector;
2636     const G4ParticleDefinition * aHTarg = G4P << 2213     G4ParticleDefinition * aHTarg = G4Proton::ProtonDefinition();
2637     if (nucleus->GetCharge() == 0) aHTarg = G << 
2638     G4double mass = aHTarg->GetPDGMass();        2214     G4double mass = aHTarg->GetPDGMass();
2639     G4KineticTrackVector * secs = nullptr;    << 2215     if (nucleus->GetCharge() == 0) aHTarg = G4Neutron::NeutronDefinition();
                                                   >> 2216     mass = aHTarg->GetPDGMass();
                                                   >> 2217     G4KineticTrackVector * secs = 0;
2640     G4ThreeVector pos(0,0,0);                    2218     G4ThreeVector pos(0,0,0);
2641     G4LorentzVector mom(mass);                   2219     G4LorentzVector mom(mass);
2642     G4KineticTrack aTarget(aHTarg, 0., pos, m    2220     G4KineticTrack aTarget(aHTarg, 0., pos, mom);
2643     G4bool done(false);                          2221     G4bool done(false);
2644     // data member    static G4Scatterer theH << 2222     std::vector<G4KineticTrack *>::iterator iter, jter;
2645     //G4cout << " start 1H1 for " << (*second << 2223     static G4Scatterer theScatterer;
2646     //       << " on " << aHTarg->GetParticle << 2224 //G4cout << " start 1H1 for " << (*secondaries).front()->GetDefinition()->GetParticleName()
                                                   >> 2225 //       << " on " << aHTarg->GetParticleName() << G4endl;  
2647     G4int tryCount(0);                           2226     G4int tryCount(0);
2648     while(!done && tryCount++ <200)           << 2227     while(!done && tryCount++ <200)
2649     {                                            2228     {
2650         if(secs)                              << 2229       if(secs)
2651         {                                     << 2230       {
2652             std::for_each(secs->begin(), secs << 2231        std::for_each(secs->begin(), secs->end(), DeleteKineticTrack());
2653             delete secs;                      << 2232        delete secs;
2654         }                                     << 2233       }
2655         secs = theH1Scatterer->Scatter(*(*sec << 2234       secs = theScatterer.Scatter(*(*secondaries).front(), aTarget);
2656 #ifdef debug_H1_BinaryCascade                 << 2235       for(size_t ss=0; secs && ss<secs->size(); ss++)
2657         PrintKTVector(secs," From Scatter");  << 2236       {
2658 #endif                                        << 2237 //        G4cout << "1H1 " << (*secs)[ss]->GetDefinition()->GetParticleName()
2659         for(std::size_t ss=0; secs && ss<secs << 2238 //         << ", shortlived? "<< (*secs)[ss]->GetDefinition()->IsShortLived()<< G4endl;
2660         {                                     << 2239         if((*secs)[ss]->GetDefinition()->IsShortLived()) done = true;
2661             // must have one resonance in fin << 2240       }
2662             if((*secs)[ss]->GetDefinition()-> << 2241 //    G4cout << G4endl;
2663         }                                     << 
2664     }                                            2242     }
2665                                               << 2243     size_t current(0);
2666     ClearAndDestroy(&theFinalState);          << 2244     for(current=0; current<secs->size(); current++)
2667     ClearAndDestroy(secondaries);             << 
2668     delete secondaries;                       << 
2669                                               << 
2670     for(std::size_t current=0; secs && curren << 
2671     {                                            2245     {
2672         if((*secs)[current]->GetDefinition()- << 2246       if((*secs)[current]->GetDefinition()->IsShortLived())
2673         {                                     << 2247       {
2674             done = true;  // must have one re << 2248         G4KineticTrackVector * dec = (*secs)[current]->Decay();
2675             G4KineticTrackVector * dec = (*se << 2249   for(jter=dec->begin(); jter != dec->end(); jter++)
2676             for(auto jter=dec->cbegin(); jter << 2250   {
2677             {                                 << 2251     //G4cout << "Decay"<<G4endl;
2678                 //G4cout << "Decay"<<G4endl;  << 2252     secs->push_back(*jter);
2679                 secs->push_back(*jter);       << 2253     //G4cout << "decay "<<(*jter)->GetDefinition()->GetParticleName()<<G4endl;
2680                 //G4cout << "decay "<<(*jter) << 2254   }
2681             }                                 << 2255   delete (*secs)[current];
2682             delete (*secs)[current];          << 2256   delete dec;
2683             delete dec;                       << 2257       }
2684         }                                     << 2258       else
2685         else                                  << 2259       {
2686         {                                     << 2260   //G4cout << "FS "<<G4endl;
2687             //G4cout << "FS "<<G4endl;        << 2261   //G4cout << "FS "<<(*secs)[current]->GetDefinition()->GetParticleName()<<G4endl;
2688             //G4cout << "FS "<<(*secs)[curren << 2262         theFinalState.push_back((*secs)[current]);
2689             theFinalState.push_back((*secs)[c << 2263       }
2690         }                                     << 
2691     }                                            2264     }
2692                                               << 2265     //G4cout << "Through loop"<<G4endl;
2693     delete secs;                                 2266     delete secs;
2694 #ifdef debug_H1_BinaryCascade                 << 2267     for(iter = theFinalState.begin(); iter != theFinalState.end(); ++iter)
2695     PrintKTVector(&theFinalState," FinalState << 
2696 #endif                                        << 
2697     for(auto iter = theFinalState.cbegin(); i << 
2698     {                                            2268     {
2699         G4KineticTrack * kt = *iter;          << 2269       G4KineticTrack * kt = *iter;
2700         G4ReactionProduct * aNew = new G4Reac << 2270       G4ReactionProduct * aNew = new G4ReactionProduct(kt->GetDefinition());
2701         aNew->SetMomentum(kt->Get4Momentum(). << 2271       aNew->SetMomentum(kt->Get4Momentum().vect());
2702         aNew->SetTotalEnergy(kt->Get4Momentum << 2272       aNew->SetTotalEnergy(kt->Get4Momentum().e());
2703         aNew->SetCreatorModelID(theBIC_ID);   << 2273       products->push_back(aNew);
2704         aNew->SetParentResonanceDef(kt->GetPa << 2274       #ifdef debug_1_BinaryCascade
2705         aNew->SetParentResonanceID(kt->GetPar << 2275       if (! kt->GetDefinition()->GetPDGStable() )
2706         products->push_back(aNew);            << 2276       {
2707 #ifdef debug_H1_BinaryCascade                 << 2277           if (kt->GetDefinition()->IsShortLived())
2708         if (! kt->GetDefinition()->GetPDGStab << 2278     {
2709         {                                     << 2279        G4cout << "final shortlived : ";
2710             if (kt->GetDefinition()->IsShortL << 2280     } else
2711             {                                 << 2281     {
2712                 G4cout << "final shortlived : << 2282        G4cout << "final un stable : ";
2713             } else                            << 2283     }
2714             {                                 << 2284     G4cout <<kt->GetDefinition()->GetParticleName()<< G4endl;
2715                 G4cout << "final un stable :  << 2285       }
2716             }                                 << 2286       #endif
2717             G4cout <<kt->GetDefinition()->Get << 2287       delete kt;
2718         }                                     << 
2719 #endif                                        << 
2720         delete kt;                            << 
2721     }                                            2288     }
2722     theFinalState.clear();                       2289     theFinalState.clear();
2723     return products;                             2290     return products;
2724                                                  2291 
2725 }                                                2292 }
2726                                                  2293 
2727 //-------------------------------------------    2294 //----------------------------------------------------------------------------
2728 G4ThreeVector G4BinaryCascade::GetSpherePoint    2295 G4ThreeVector G4BinaryCascade::GetSpherePoint(
2729         G4double r, const G4LorentzVector & m << 2296           G4double r, const G4LorentzVector & mom4)
2730 //-------------------------------------------    2297 //----------------------------------------------------------------------------
2731 {                                                2298 {
2732     //  Get a point outside radius.           << 2299 //  Get a point outside radius.
2733     //     point is random in plane (circle o << 2300 //     point is random in plane (circle of radius r) orthogonal to mom,
2734     //      plus -1*r*mom->vect()->unit();    << 2301 //      plus -1*r*mom->vect()->unit();
2735     G4ThreeVector o1, o2;                        2302     G4ThreeVector o1, o2;
2736     G4ThreeVector mom = mom4.vect();             2303     G4ThreeVector mom = mom4.vect();
2737                                                  2304 
2738     o1= mom.orthogonal();  // we simply need     2305     o1= mom.orthogonal();  // we simply need any vector non parallel
2739     o2= mom.cross(o1);     //  o2 is now orth    2306     o2= mom.cross(o1);     //  o2 is now orthogonal to mom and o1, ie. o1 and o2  define plane.
2740                                                  2307 
2741     G4double x2, x1;                             2308     G4double x2, x1;
2742                                                  2309 
2743     do                                           2310     do
2744     {                                            2311     {
2745         x1=(G4UniformRand()-.5)*2;            << 2312       x1=(G4UniformRand()-.5)*2;
2746         x2=(G4UniformRand()-.5)*2;            << 2313       x2=(G4UniformRand()-.5)*2;
2747     } while (sqr(x1) +sqr(x2) > 1.);          << 2314     } while (sqr(x1) +sqr(x2) > 1.);
2748                                                  2315 
2749     return G4ThreeVector(r*(x1*o1.unit() + x2    2316     return G4ThreeVector(r*(x1*o1.unit() + x2*o2.unit() - 1.5* mom.unit()));
2750                                                  2317 
2751                                                  2318 
2752                                                  2319 
2753     /*                                        << 2320 /*
2754      * // Get a point uniformly distributed o << 2321  * // Get a point uniformly distributed on the surface of a sphere,
2755      * // with z < 0.                         << 2322  * // with z < 0.
2756      *   G4double b = r*G4UniformRand();  //  << 2323  *   G4double b = r*G4UniformRand();  // impact parameter
2757      *   G4double phi = G4UniformRand()*2*pi; << 2324  *   G4double phi = G4UniformRand()*2*pi;
2758      *   G4double x = b*std::cos(phi);        << 2325  *   G4double x = b*std::cos(phi);
2759      *   G4double y = b*std::sin(phi);        << 2326  *   G4double y = b*std::sin(phi);
2760      *   G4double z = -std::sqrt(r*r-b*b);    << 2327  *   G4double z = -std::sqrt(r*r-b*b);
2761      *   z *= 1.001; // Get position a little << 2328  *   z *= 1.001; // Get position a little bit out of the sphere...
2762      *   point.setX(x);                       << 2329  *   point.setX(x);
2763      *   point.setY(y);                       << 2330  *   point.setY(y);
2764      *   point.setZ(z);                       << 2331  *   point.setZ(z);
2765      */                                       << 2332  */
2766 }                                                2333 }
2767                                                  2334 
2768 //-------------------------------------------    2335 //----------------------------------------------------------------------------
2769                                                  2336 
2770 void G4BinaryCascade::ClearAndDestroy(G4Kinet    2337 void G4BinaryCascade::ClearAndDestroy(G4KineticTrackVector * ktv)
2771 //-------------------------------------------    2338 //----------------------------------------------------------------------------
2772 {                                                2339 {
2773     for(auto i = ktv->cbegin(); i != ktv->cen << 2340   std::vector<G4KineticTrack *>::iterator i;
2774         delete (*i);                          << 2341   for(i = ktv->begin(); i != ktv->end(); ++i)
2775     ktv->clear();                             << 2342     delete (*i);
                                                   >> 2343   ktv->clear();
2776 }                                                2344 }
2777                                                  2345 
2778 //-------------------------------------------    2346 //----------------------------------------------------------------------------
2779 void G4BinaryCascade::ClearAndDestroy(G4React    2347 void G4BinaryCascade::ClearAndDestroy(G4ReactionProductVector * rpv)
2780 //-------------------------------------------    2348 //----------------------------------------------------------------------------
2781 {                                                2349 {
2782     for(auto i = rpv->cbegin(); i != rpv->cen << 2350   std::vector<G4ReactionProduct *>::iterator i;
2783         delete (*i);                          << 2351   for(i = rpv->begin(); i != rpv->end(); ++i)
2784     rpv->clear();                             << 2352     delete (*i);
                                                   >> 2353   rpv->clear();
2785 }                                                2354 }
2786                                                  2355 
2787 //-------------------------------------------    2356 //----------------------------------------------------------------------------
2788 void G4BinaryCascade::PrintKTVector(G4Kinetic    2357 void G4BinaryCascade::PrintKTVector(G4KineticTrackVector * ktv, std::string comment)
2789 //-------------------------------------------    2358 //----------------------------------------------------------------------------
2790 {                                                2359 {
2791     if (comment.size() > 0 ) G4cout << "G4Bin << 2360   if (comment.size() > 0 ) G4cout << comment << G4endl;
2792     if (ktv) {                                << 2361   G4cout << "  vector: " << ktv << ", number of tracks: " << ktv->size()
2793         G4cout << "  vector: " << ktv << ", n << 2362    << G4endl;
2794                << G4endl;                     << 2363   std::vector<G4KineticTrack *>::iterator i;
2795         std::vector<G4KineticTrack *>::const_ << 2364   G4int count;
2796         G4int count;                          << 2365 
2797                                               << 2366   for(count = 0, i = ktv->begin(); i != ktv->end(); ++i, ++count)
2798         for(count = 0, i = ktv->cbegin(); i ! << 2367   {
2799         {                                     << 2368     G4KineticTrack * kt = *i;
2800             G4KineticTrack * kt = *i;         << 2369     G4cout << "  track n. " << count << ", id: " << kt << G4endl;
2801             G4cout << "  track n. " << count; << 2370     G4ThreeVector pos = kt->GetPosition();
2802             PrintKTVector(kt);                << 2371     G4LorentzVector mom = kt->Get4Momentum();
2803         }                                     << 2372     G4LorentzVector tmom = kt->GetTrackingMomentum();
2804     } else {                                  << 2373     G4ParticleDefinition * definition = kt->GetDefinition();
2805         G4cout << "G4BinaryCascade::PrintKTVe << 2374     G4cout << "    definition: " << definition->GetPDGEncoding() << " pos: "
2806     }                                         << 2375      << 1/fermi*pos << " R: " << 1/fermi*pos.mag() << " 4mom: "
2807 }                                             << 2376      << 1/MeV*mom <<"Tr_mom" <<  1/MeV*tmom << " P: " << 1/MeV*mom.vect().mag() 
2808 //------------------------------------------- << 2377      << " M: " << 1/MeV*mom.mag() << G4endl;
2809 void G4BinaryCascade::PrintKTVector(G4Kinetic << 2378     G4cout <<"    trackstatus: "<<kt->GetState()<<G4endl;
2810 //------------------------------------------- << 2379   }
2811 {                                             << 2380 }
2812     if (comment.size() > 0 ) G4cout << "G4Bin << 2381 
2813     if ( kt ){                                << 2382 //----------------------------------------------------------------------------
2814         G4cout << ", id: " << kt << G4endl;   << 2383 G4bool G4BinaryCascade::CheckDecay(G4KineticTrackVector * products)
2815         G4ThreeVector pos = kt->GetPosition() << 2384 //----------------------------------------------------------------------------
2816         G4LorentzVector mom = kt->Get4Momentu << 2385 {
2817         G4LorentzVector tmom = kt->GetTrackin << 2386   G4int A = the3DNucleus->GetMassNumber();
2818         const G4ParticleDefinition * definiti << 2387   G4int Z = the3DNucleus->GetCharge();
2819         G4cout << "    definition: " << defin << 2388 
2820                 << 1/fermi*pos << " R: " << 1 << 2389   G4FermiMomentum fermiMom;
2821                 << 1/MeV*mom <<"Tr_mom" <<  1 << 2390   fermiMom.Init(A, Z);
2822                 << " M: " << 1/MeV*mom.mag()  << 2391 
2823         G4cout <<"    trackstatus: "<<kt->Get << 2392   const G4VNuclearDensity * density=the3DNucleus->GetNuclearDensity();
2824     } else {                                  << 2393 
2825         G4cout << "G4BinaryCascade::PrintKTVe << 2394   G4KineticTrackVector::iterator i;
2826     }                                         << 2395   G4ParticleDefinition * definition;
                                                   >> 2396 
                                                   >> 2397 // ------ debug
                                                   >> 2398   G4bool myflag = true;
                                                   >> 2399 // ------ end debug
                                                   >> 2400   for(i = products->begin(); i != products->end(); ++i)
                                                   >> 2401   {
                                                   >> 2402     definition = (*i)->GetDefinition();
                                                   >> 2403     if((definition->GetParticleName() != "delta++" )&&
                                                   >> 2404        (definition->GetParticleName() != "delta+" )&&
                                                   >> 2405        (definition->GetParticleName() != "delta0" )&&
                                                   >> 2406        (definition->GetParticleName() != "delta-" ))
                                                   >> 2407        continue;
                                                   >> 2408        G4ThreeVector pos = (*i)->GetPosition();
                                                   >> 2409        G4double d = density->GetDensity(pos);
                                                   >> 2410        G4double pFermi= fermiMom.GetFermiMomentum(d);
                                                   >> 2411        G4LorentzVector mom = (*i)->Get4Momentum();
                                                   >> 2412        G4LorentzRotation boost(mom.boostVector()); 
                                                   >> 2413        G4ThreeVector pion3(227*MeV * mom.vect().unit()); // 227 is decay product in rest frame
                                                   >> 2414        G4LorentzVector pion(pion3, std::sqrt(sqr(140*MeV) +pion3.mag()));
                                                   >> 2415      // G4cout << "pi rest " << pion << G4endl;
                                                   >> 2416        pion = boost * pion;
                                                   >> 2417      // G4cout << "pi lab  " << pion << G4endl;
                                                   >> 2418 // ------ debug
                                                   >> 2419 //     G4cout << "p:[" << (1/MeV)*pion.x() << " " << (1/MeV)*pion.y() << " "
                                                   >> 2420 //     << (1/MeV)*pion.z() << "] |p3|:"
                                                   >> 2421 //     << (1/MeV)*pion.vect().mag() << " E:" << (1/MeV)*pion.t() << " ] m: "
                                                   >> 2422 //     << (1/MeV)*pion.mag() << "  pos[" 
                                                   >> 2423 //     << (1/fermi)*pos.x() << " "<< (1/fermi)*pos.y() << " "
                                                   >> 2424 //     << (1/fermi)*pos.z() << "] |Dpos|: "
                                                   >> 2425 //     <<  " Pfermi:"
                                                   >> 2426 //     << (1/MeV)*pFermi << G4endl;   
                                                   >> 2427 // ------ end debug
                                                   >> 2428        
                                                   >> 2429      if( pion.vect().mag() < pFermi )
                                                   >> 2430      {
                                                   >> 2431 // ------ debug
                                                   >> 2432        myflag = false;
                                                   >> 2433 // ------ end debug
                                                   >> 2434     }
                                                   >> 2435   }
                                                   >> 2436   return myflag;
                                                   >> 2437 //  return true;
2827 }                                                2438 }
2828                                                  2439 
2829                                               << 
2830 //-------------------------------------------    2440 //----------------------------------------------------------------------------
2831 G4double G4BinaryCascade::GetIonMass(G4int Z,    2441 G4double G4BinaryCascade::GetIonMass(G4int Z, G4int A)
2832 //-------------------------------------------    2442 //----------------------------------------------------------------------------
2833 {                                                2443 {
2834     G4double mass(0);                         << 2444    G4double mass(0);
2835     if ( Z > 0 && A >= Z )                    << 2445    if ( Z > 0 && A >= Z ) 
2836     {                                         << 
2837         mass = G4ParticleTable::GetParticleTa << 
2838                                               << 
2839     } else if ( A > 0 && Z>0 )                << 
2840     {                                         << 
2841         // charge Z > A; will happen for ligh << 
2842         mass = G4ParticleTable::GetParticleTa << 
2843                                               << 
2844     } else if ( A >= 0 && Z<=0 )              << 
2845     {                                         << 
2846         // all neutral, or empty nucleus      << 
2847         mass = A * G4Neutron::Neutron()->GetP << 
2848                                               << 
2849     } else if ( A == 0  )                     << 
2850     {                                         << 
2851         // empty nucleus, except maybe pions  << 
2852         mass = 0;                             << 
2853                                               << 
2854     } else                                    << 
2855     {                                         << 
2856         G4cerr << "G4BinaryCascade::GetIonMas << 
2857                 << A << "," << Z << ")" <<G4e << 
2858         throw G4HadronicException(__FILE__, _ << 
2859                                               << 
2860     }                                         << 
2861    //  G4cout << "G4BinaryCascade::GetIonMass << 
2862     return mass;                              << 
2863 }                                             << 
2864 G4ReactionProductVector * G4BinaryCascade::Fi << 
2865 {                                             << 
2866     // return product when nucleus is destroy << 
2867     G4double Esecondaries(0.);                << 
2868     G4LorentzVector psecondaries;             << 
2869     std::vector<G4KineticTrack *>::const_iter << 
2870     std::vector<G4ReactionProduct *>::const_i << 
2871     decayKTV.Decay(&theFinalState);           << 
2872                                               << 
2873     for(iter = theFinalState.cbegin(); iter ! << 
2874     {                                         << 
2875         G4ReactionProduct * aNew = new G4Reac << 
2876         aNew->SetMomentum((*iter)->Get4Moment << 
2877         aNew->SetTotalEnergy((*iter)->Get4Mom << 
2878         aNew->SetCreatorModelID(theBIC_ID);   << 
2879   aNew->SetParentResonanceDef((*iter)->GetPar << 
2880   aNew->SetParentResonanceID((*iter)->GetPare << 
2881         Esecondaries +=(*iter)->Get4Momentum( << 
2882         psecondaries +=(*iter)->Get4Momentum( << 
2883         aNew->SetNewlyAdded(true);            << 
2884         //G4cout << " Particle Ekin " << aNew << 
2885         products->push_back(aNew);            << 
2886     }                                         << 
2887                                               << 
2888     // pull out late particles from collision << 
2889     //theCollisionMgr->Print();               << 
2890     while(theCollisionMgr->Entries() > 0)     << 
2891     {                                         << 
2892         G4CollisionInitialState *             << 
2893         collision = theCollisionMgr->GetNextC << 
2894                                               << 
2895         if ( ! collision->GetTargetCollection << 
2896             G4KineticTrackVector * lates = co << 
2897             if ( lates->size() == 1 ) {       << 
2898                 G4KineticTrack * atrack=*(lat << 
2899                 //PrintKTVector(atrack, " lat << 
2900                                               << 
2901                 G4ReactionProduct * aNew = ne << 
2902                 aNew->SetMomentum(atrack->Get << 
2903                 aNew->SetTotalEnergy(atrack-> << 
2904                 aNew->SetCreatorModelID(atrac << 
2905     aNew->SetParentResonanceDef(atrack->GetPa << 
2906     aNew->SetParentResonanceID(atrack->GetPar << 
2907                 Esecondaries +=atrack->Get4Mo << 
2908                 psecondaries +=atrack->Get4Mo << 
2909                 aNew->SetNewlyAdded(true);    << 
2910                 products->push_back(aNew);    << 
2911                                               << 
2912             }                                 << 
2913         }                                     << 
2914         theCollisionMgr->RemoveCollision(coll << 
2915                                               << 
2916     }                                         << 
2917                                               << 
2918     // decay must be after loop on Collisions << 
2919     //   to by Collisions.                    << 
2920     decayKTV.Decay(&theSecondaryList);        << 
2921                                               << 
2922     // Correct for momentum transfered to Nuc << 
2923     G4ThreeVector transferCorrection(0);      << 
2924     if ( (theSecondaryList.size() + theCaptur << 
2925     {                                         << 
2926       transferCorrection= theMomentumTransfer << 
2927     }                                         << 
2928                                               << 
2929     for(iter = theSecondaryList.cbegin(); ite << 
2930     {                                         << 
2931         G4ReactionProduct * aNew = new G4Reac << 
2932         (*iter)->Update4Momentum((*iter)->Get << 
2933         aNew->SetMomentum((*iter)->Get4Moment << 
2934         aNew->SetTotalEnergy((*iter)->Get4Mom << 
2935         aNew->SetCreatorModelID(theBIC_ID);   << 
2936   aNew->SetParentResonanceDef((*iter)->GetPar << 
2937   aNew->SetParentResonanceID((*iter)->GetPare << 
2938         Esecondaries +=(*iter)->Get4Momentum( << 
2939         psecondaries +=(*iter)->Get4Momentum( << 
2940         if ( (*iter)->IsParticipant() ) aNew- << 
2941         products->push_back(aNew);            << 
2942     }                                         << 
2943                                               << 
2944     for(iter = theCapturedList.cbegin(); iter << 
2945     {                                         << 
2946         G4ReactionProduct * aNew = new G4Reac << 
2947         (*iter)->Update4Momentum((*iter)->Get << 
2948         aNew->SetMomentum((*iter)->Get4Moment << 
2949         aNew->SetTotalEnergy((*iter)->Get4Mom << 
2950         aNew->SetCreatorModelID(theBIC_ID);   << 
2951   aNew->SetParentResonanceDef((*iter)->GetPar << 
2952   aNew->SetParentResonanceID((*iter)->GetPare << 
2953         Esecondaries +=(*iter)->Get4Momentum( << 
2954         psecondaries +=(*iter)->Get4Momentum( << 
2955         aNew->SetNewlyAdded(true);            << 
2956         products->push_back(aNew);            << 
2957     }                                         << 
2958                                               << 
2959     G4double SumMassNucleons(0.);             << 
2960     G4LorentzVector pNucleons(0.);            << 
2961     for(iter = theTargetList.cbegin(); iter ! << 
2962     {                                         << 
2963         SumMassNucleons += (*iter)->GetDefini << 
2964         pNucleons += (*iter)->Get4Momentum(); << 
2965     }                                         << 
2966                                               << 
2967     G4double Ekinetic=theProjectile4Momentum. << 
2968      #ifdef debug_BIC_FillVoidnucleus         << 
2969         G4LorentzVector deltaP=theProjectile4 << 
2970                         psecondaries - pNucle << 
2971         //G4cout << "BIC::FillVoidNucleus() n << 
2972       //       ", deltaP " <<  deltaP << " de << 
2973      #endif                                   << 
2974     if (Ekinetic > 0. && theTargetList.size() << 
2975         Ekinetic /= theTargetList.size();     << 
2976     } else {                                  << 
2977         G4double Ekineticrdm(0);              << 
2978         if (theTargetList.size()) Ekineticrdm << 
2979         G4double TotalEkin(Ekineticrdm);      << 
2980         for (rpiter=products->cbegin(); rpite << 
2981           TotalEkin+=(*rpiter)->GetKineticEne << 
2982         }                                     << 
2983         G4double correction(1.);              << 
2984         if ( std::abs(Ekinetic) < 20*perCent  << 
2985           correction=1. + (Ekinetic-Ekineticr << 
2986         }                                     << 
2987         #ifdef debug_G4BinaryCascade          << 
2988       else {                                  << 
2989         G4cout << "BLIC::FillVoidNucleus() fa << 
2990       }                                       << 
2991         #endif                                << 
2992                                               << 
2993         for (rpiter=products->cbegin(); rpite << 
2994         (*rpiter)->SetKineticEnergy((*rpiter) << 
2995           (*rpiter)->SetMomentum((*rpiter)->G << 
2996                                               << 
2997         }                                     << 
2998                                               << 
2999         Ekinetic=Ekineticrdm*correction;      << 
3000         if (theTargetList.size())Ekinetic /=  << 
3001                                               << 
3002   }                                           << 
3003                                               << 
3004     for(iter = theTargetList.cbegin(); iter ! << 
3005       // set Nucleon it to be hit - as it is  << 
3006       (*iter)->Hit();                         << 
3007         G4ReactionProduct * aNew = new G4Reac << 
3008         aNew->SetKineticEnergy(Ekinetic);     << 
3009         aNew->SetMomentum(aNew->GetTotalMomen << 
3010         aNew->SetNewlyAdded(true);            << 
3011         aNew->SetCreatorModelID(theBIC_ID);   << 
3012   aNew->SetParentResonanceDef((*iter)->GetPar << 
3013   aNew->SetParentResonanceID((*iter)->GetPare << 
3014         products->push_back(aNew);            << 
3015         Esecondaries += aNew->GetTotalEnergy( << 
3016         psecondaries += G4LorentzVector(aNew- << 
3017     }                                         << 
3018     psecondaries=G4LorentzVector(0);          << 
3019     for (rpiter=products->cbegin(); rpiter!=p << 
3020       psecondaries += G4LorentzVector((*rpite << 
3021     }                                         << 
3022                                               << 
3023     G4LorentzVector initial4Mom=theProjectile << 
3024                                               << 
3025     //G4cout << "::FillVoidNucleus()final e/p << 
3026     //  << " final " << psecondaries << " del << 
3027                                               << 
3028     G4ThreeVector SumMom=psecondaries.vect(); << 
3029                                               << 
3030     SumMom=initial4Mom.vect()-SumMom;         << 
3031     G4int loopcount(0);                       << 
3032                                               << 
3033     // reverse_iterator reverse - start to co << 
3034     while ( SumMom.mag() > 0.1*MeV && loopcou << 
3035     {                                         << 
3036       G4int index=(G4int)products->size();    << 
3037       for (auto reverse=products->crbegin();  << 
3038         SumMom=initial4Mom.vect();            << 
3039         for (rpiter=products->cbegin(); rpite << 
3040           SumMom-=(*rpiter)->GetMomentum();   << 
3041         }                                     << 
3042         G4double p=((*reverse)->GetMomentum() << 
3043         (*reverse)->SetMomentum(  p*(((*rever << 
3044       }                                       << 
3045     }                                         << 
3046     return products;                          << 
3047 }                                             << 
3048                                               << 
3049 G4ReactionProductVector * G4BinaryCascade::Hi << 
3050         G4KineticTrackVector * secondaries)   << 
3051 {                                             << 
3052     for(auto iter = secondaries->cbegin(); it << 
3053     {                                         << 
3054         G4ReactionProduct * aNew = new G4Reac << 
3055         aNew->SetMomentum((*iter)->Get4Moment << 
3056         aNew->SetTotalEnergy((*iter)->Get4Mom << 
3057         aNew->SetNewlyAdded(true);            << 
3058         aNew->SetCreatorModelID((*iter)->GetC << 
3059         aNew->SetParentResonanceDef((*iter)-> << 
3060         aNew->SetParentResonanceID((*iter)->G << 
3061         //G4cout << " Particle Ekin " << aNew << 
3062         products->push_back(aNew);            << 
3063     }                                         << 
3064     const G4ParticleDefinition* fragment = 0; << 
3065     if (currentA == 1 && currentZ == 0) {     << 
3066         fragment = G4Neutron::NeutronDefiniti << 
3067     } else if (currentA == 1 && currentZ == 1 << 
3068         fragment = G4Proton::ProtonDefinition << 
3069     } else if (currentA == 2 && currentZ == 1 << 
3070         fragment = G4Deuteron::DeuteronDefini << 
3071     } else if (currentA == 3 && currentZ == 1 << 
3072         fragment = G4Triton::TritonDefinition << 
3073     } else if (currentA == 3 && currentZ == 2 << 
3074         fragment = G4He3::He3Definition();    << 
3075     } else if (currentA == 4 && currentZ == 2 << 
3076         fragment = G4Alpha::AlphaDefinition() << 
3077     } else {                                  << 
3078         fragment =                            << 
3079                 G4ParticleTable::GetParticleT << 
3080     }                                         << 
3081     if (fragment != 0) {                      << 
3082         G4ReactionProduct * theNew = new G4Re << 
3083         theNew->SetMomentum(G4ThreeVector(0,0 << 
3084         theNew->SetTotalEnergy(massInNucleus) << 
3085         theNew->SetCreatorModelID(theBIC_ID); << 
3086         //theNew->SetFormationTime(??0.??);   << 
3087         //G4cout << " Nucleus (" << currentZ  << 
3088         products->push_back(theNew);          << 
3089     }                                         << 
3090     return products;                          << 
3091 }                                             << 
3092                                               << 
3093 void G4BinaryCascade::PrintWelcomeMessage()   << 
3094 {                                             << 
3095     G4cout <<"Thank you for using G4BinaryCas << 
3096 }                                             << 
3097                                               << 
3098 //------------------------------------------- << 
3099 void G4BinaryCascade::DebugApplyCollisionFail << 
3100       G4KineticTrackVector * products)        << 
3101 {                                             << 
3102    G4bool havePion=false;                     << 
3103    if (products)                              << 
3104    {                                             2446    {
3105       for ( auto i =products->cbegin(); i !=  << 2447       mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(Z,A);
3106       {                                       << 2448       
3107          G4int PDGcode=std::abs((*i)->GetDefi << 2449    } else if ( A > 0 && Z>0 )
3108          if (std::abs(PDGcode)==211 || PDGcod << 
3109       }                                       << 
3110    }                                          << 
3111    if ( !products  || havePion)               << 
3112    {                                             2450    {
3113       const G4BCAction &action= *collision->G << 2451       // charge Z > A; will happen for light nuclei with pions involved. 
3114       G4cout << " Collision " << collision << << 2452       mass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(A,A);
3115                                   << ", with  << 2453       
3116       G4cout << G4endl<<"Initial condition ar << 2454    } else if ( A >= 0 && Z<=0 )
3117       G4cout << "proj: "<<collision->GetPrima << 2455    {
3118       PrintKTVector(collision->GetPrimary()); << 2456       // all neutral, or empty nucleus 
3119       for(std::size_t it=0; it<collision->Get << 2457       mass = A * G4Neutron::Neutron()->GetPDGMass();
3120       {                                       << 2458       
3121          G4cout << "targ: "                   << 2459    } else if ( A == 0 && std::abs(Z)<2 )
3122                <<collision->GetTargetCollecti << 2460    {
3123       }                                       << 2461       // empty nucleus, except maybe pions
3124       PrintKTVector(&collision->GetTargetColl << 2462       mass = 0;
3125    }                                          << 2463       
3126    //  if ( lateParticleCollision ) G4cout << << 2464    } else
3127    //  if ( lateParticleCollision && products << 2465    {
3128 }                                             << 2466       G4cerr << "G4BinaryCascade::GetIonMass() - invalid (A,Z) = ("
3129                                               << 2467               << A << "," << Z << ")" <<G4endl;
3130 //------------------------------------------- << 2468       G4Exception("G4BinaryCascade::GetIonMass() - giving up");
3131                                               << 
3132 G4bool G4BinaryCascade::CheckChargeAndBaryonN << 
3133 {                                             << 
3134    static G4int lastdA(0), lastdZ(0);         << 
3135    G4int iStateA = the3DNucleus->GetMassNumbe << 
3136    G4int iStateZ = the3DNucleus->GetCharge()  << 
3137                                               << 
3138    G4int fStateA(0);                          << 
3139    G4int fStateZ(0);                          << 
3140                                               << 
3141    G4int CapturedA(0), CapturedZ(0);          << 
3142    G4int secsA(0), secsZ(0);                  << 
3143    for (auto i=theCapturedList.cbegin(); i!=t << 
3144       CapturedA += (*i)->GetDefinition()->Get << 
3145       CapturedZ += G4lrint((*i)->GetDefinitio << 
3146    }                                          << 
3147                                               << 
3148    for (auto i=theSecondaryList.cbegin(); i!= << 
3149       if ( (*i)->GetState() != G4KineticTrack << 
3150          secsA += (*i)->GetDefinition()->GetB << 
3151          secsZ += G4lrint((*i)->GetDefinition << 
3152       }                                       << 
3153    }                                          << 
3154                                               << 
3155    for (auto i=theFinalState.cbegin(); i!=the << 
3156       fStateA += (*i)->GetDefinition()->GetBa << 
3157       fStateZ += G4lrint((*i)->GetDefinition( << 
3158    }                                             2469    }
3159                                               << 2470    return mass;
3160    G4int deltaA= iStateA -  secsA - fStateA - << 
3161    G4int deltaZ= iStateZ -  secsZ - fStateZ - << 
3162                                               << 
3163 #ifdef debugCheckChargeAndBaryonNumberverbose << 
3164   G4cout << where <<" A: iState= "<< iStateA< << 
3165   G4cout << where <<" Z: iState= "<< iStateZ< << 
3166 #endif                                        << 
3167                                               << 
3168    if (deltaA != 0  || deltaZ!=0 ) {          << 
3169       if (deltaA != lastdA || deltaZ != lastd << 
3170          G4cout << "baryon/charge imbalance - << 
3171                << "deltaA " <<deltaA<<", iSta << 
3172                << ", fStateA "<<fStateA << ", << 
3173                << "deltaZ "<<deltaZ<<", iStat << 
3174                << ", fStateZ "<<fStateZ << ", << 
3175          lastdA=deltaA;                       << 
3176          lastdZ=deltaZ;                       << 
3177       }                                       << 
3178    } else { lastdA=lastdZ=0;}                 << 
3179                                               << 
3180    return true;                               << 
3181 }                                             << 
3182 //------------------------------------------- << 
3183 void G4BinaryCascade::DebugApplyCollision(G4C << 
3184         G4KineticTrackVector * products)      << 
3185 {                                             << 
3186                                               << 
3187     PrintKTVector(collision->GetPrimary(),std << 
3188     PrintKTVector(&collision->GetTargetCollec << 
3189     PrintKTVector(products,std::string(" Scat << 
3190                                               << 
3191 #ifdef dontUse                                << 
3192     G4double thisExcitation(0);               << 
3193     //  excitation energy from this collision << 
3194     //  initial state:                        << 
3195     G4double initial(0);                      << 
3196     G4KineticTrack * kt=collision->GetPrimary << 
3197     initial +=  kt->Get4Momentum().e();       << 
3198                                               << 
3199     G4RKPropagation * RKprop=(G4RKPropagation << 
3200                                               << 
3201     initial +=  RKprop->GetField(kt->GetDefin << 
3202     initial -=  RKprop->GetBarrier(kt->GetDef << 
3203     G4cout << "prim. E/field/Barr/Sum " << kt << 
3204                       << " " << RKprop->GetFi << 
3205                       << " " << RKprop->GetBa << 
3206                       << " " << initial << G4 << 
3207                                               << 
3208     G4KineticTrackVector ktv=collision->GetTa << 
3209     for ( unsigned int it=0; it < ktv.size(); << 
3210     {                                         << 
3211         kt=ktv[it];                           << 
3212         initial +=  kt->Get4Momentum().e();   << 
3213         thisExcitation += kt->GetDefinition() << 
3214                          - kt->Get4Momentum() << 
3215                          - RKprop->GetField(k << 
3216         //     initial +=  RKprop->GetField(k << 
3217         //     initial -=  RKprop->GetBarrier << 
3218         G4cout << "Targ. def/E/field/Barr/Sum << 
3219                   << " " << kt->Get4Momentum( << 
3220                   << " " << RKprop->GetField( << 
3221                   << " " << RKprop->GetBarrie << 
3222                   << " " << initial <<" Excit << 
3223     }                                         << 
3224                                               << 
3225     G4double fin(0);                          << 
3226     G4double mass_out(0);                     << 
3227     G4int product_barions(0);                 << 
3228     if ( products )                           << 
3229     {                                         << 
3230         for ( unsigned int it=0; it < product << 
3231         {                                     << 
3232             kt=(*products)[it];               << 
3233             fin +=  kt->Get4Momentum().e();   << 
3234             fin +=  RKprop->GetField(kt->GetD << 
3235             fin +=  RKprop->GetBarrier(kt->Ge << 
3236             if ( kt->GetDefinition()->GetBary << 
3237             mass_out += kt->GetDefinition()-> << 
3238             G4cout << "sec. def/E/field/Barr/ << 
3239                      << " " << kt->Get4Moment << 
3240                      << " " << RKprop->GetFie << 
3241                      << " " << RKprop->GetBar << 
3242                      << " " << fin << G4endl; << 
3243         }                                     << 
3244     }                                         << 
3245                                               << 
3246                                               << 
3247     G4int finalA = currentA;                  << 
3248     G4int finalZ = currentZ;                  << 
3249     if ( products )                           << 
3250     {                                         << 
3251         finalA -= product_barions;            << 
3252         finalZ -= GetTotalCharge(*products);  << 
3253     }                                         << 
3254     G4double delta = GetIonMass(currentZ,curr << 
3255     G4cout << " current/final a,z " << curren << 
3256             <<  " delta-mass " << delta<<G4en << 
3257     fin+=delta;                               << 
3258     mass_out  = GetIonMass(finalZ,finalA);    << 
3259     G4cout << " initE/ E_out/ Mfinal/ Excit " << 
3260             << " " <<   fin << " "            << 
3261             <<  mass_out<<" "                 << 
3262             <<  currentInitialEnergy - fin -  << 
3263             << G4endl;                        << 
3264     currentInitialEnergy-=fin;                << 
3265 #endif                                        << 
3266 }                                                2471 }
3267                                                  2472 
3268 //------------------------------------------- << 2473 void G4BinaryCascade::PrintWelcomeMessage()
3269 G4bool G4BinaryCascade::DebugFinalEpConservat << 
3270         G4ReactionProductVector* products)    << 
3271 //------------------------------------------- << 
3272 {                                                2474 {
3273     G4double Efinal(0);                       << 2475   G4cout <<"Thank you for using G4BinaryCascade. "<<G4endl;
3274     G4ThreeVector pFinal(0);                  << 
3275     if (std::abs(theParticleChange.GetWeightC << 
3276     {                                         << 
3277         G4cout <<" BIC-weight change " << the << 
3278     }                                         << 
3279                                               << 
3280     for(auto iter = products->cbegin(); iter  << 
3281     {                                         << 
3282                                               << 
3283         G4cout << " Secondary E - Ekin / p "  << 
3284               (*iter)->GetDefinition()->GetPa << 
3285               (*iter)->GetTotalEnergy() << "  << 
3286               (*iter)->GetKineticEnergy()<< " << 
3287               (*iter)->GetMomentum().x() << " << 
3288               (*iter)->GetMomentum().y() << " << 
3289               (*iter)->GetMomentum().z() << G << 
3290         Efinal += (*iter)->GetTotalEnergy();  << 
3291         pFinal += (*iter)->GetMomentum();     << 
3292     }                                         << 
3293                                               << 
3294       G4cout << "e outgoing/ total : " << Efi << 
3295       G4cout << "BIC E/p delta " <<           << 
3296             (aTrack.Get4Momentum().e()+theIni << 
3297             " MeV / mom " << (aTrack.Get4Mome << 
3298                                               << 
3299     return (aTrack.Get4Momentum().e() + theIn << 
3300                                               << 
3301 }                                                2476 }
3302 //------------------------------------------- << 
3303 G4bool G4BinaryCascade::DebugEpConservation(c << 
3304 //------------------------------------------- << 
3305 {                                             << 
3306     G4cout << where << G4endl;                << 
3307     G4LorentzVector psecs,    ptgts,    pcpts << 
3308     if (std::abs(theParticleChange.GetWeightC << 
3309     {                                         << 
3310         G4cout <<" BIC-weight change " << the << 
3311     }                                         << 
3312                                               << 
3313     std::vector<G4KineticTrack *>::const_iter << 
3314     for(ktiter = theSecondaryList.cbegin(); k << 
3315        {                                      << 
3316                                                  2477 
3317               G4cout << " Secondary E - Ekin  << 
3318                  (*ktiter)->GetDefinition()-> << 
3319                  (*ktiter)->Get4Momentum().e( << 
3320                  (*ktiter)->Get4Momentum().e( << 
3321                  (*ktiter)->Get4Momentum().ve << 
3322            psecs += (*ktiter)->Get4Momentum() << 
3323        }                                      << 
3324                                                  2478 
3325     for(ktiter = theTargetList.cbegin(); ktit << 
3326        {                                      << 
3327                                                  2479 
3328               G4cout << " Target E - Ekin / p << 
3329                  (*ktiter)->GetDefinition()-> << 
3330                  (*ktiter)->Get4Momentum().e( << 
3331                  (*ktiter)->Get4Momentum().e( << 
3332                  (*ktiter)->Get4Momentum().ve << 
3333            ptgts += (*ktiter)->Get4Momentum() << 
3334        }                                      << 
3335                                                  2480 
3336     for(ktiter = theCapturedList.cbegin(); kt << 
3337         {                                     << 
3338                                                  2481 
3339                G4cout << " Captured E - Ekin  << 
3340                   (*ktiter)->GetDefinition()- << 
3341                   (*ktiter)->Get4Momentum().e << 
3342                   (*ktiter)->Get4Momentum().e << 
3343                   (*ktiter)->Get4Momentum().v << 
3344             pcpts += (*ktiter)->Get4Momentum( << 
3345         }                                     << 
3346                                                  2482 
3347     for(ktiter = theFinalState.cbegin(); ktit << 
3348         {                                     << 
3349                                                  2483 
3350                G4cout << " Finals E - Ekin /  << 
3351                   (*ktiter)->GetDefinition()- << 
3352                   (*ktiter)->Get4Momentum().e << 
3353                   (*ktiter)->Get4Momentum().e << 
3354                   (*ktiter)->Get4Momentum().v << 
3355             pfins += (*ktiter)->Get4Momentum( << 
3356         }                                     << 
3357                                               << 
3358       G4cout << " Secondaries " << psecs << " << 
3359           <<" Captured    " << pcpts << ", Fi << 
3360           <<" Sum " << psecs + ptgts + pcpts  << 
3361           <<" Sum+PTransfer " << psecs + ptgt << 
3362           << G4endl<< G4endl;                 << 
3363                                               << 
3364                                               << 
3365     return true;                              << 
3366                                                  2484 
3367 }                                             << 
3368                                               << 
3369 //------------------------------------------- << 
3370 G4ReactionProductVector * G4BinaryCascade::Pr << 
3371 //------------------------------------------- << 
3372 {                                             << 
3373    //    else                                 << 
3374 //    {                                       << 
3375 //        G4ReactionProduct * aNew=0;         << 
3376 //        // return nucleus e and p           << 
3377 //        if  (fragment != 0 ) {              << 
3378 //            aNew = new G4ReactionProduct(G4 << 
3379 //            aNew->SetMomentum(fragment->Get << 
3380 //            aNew->SetTotalEnergy(fragment-> << 
3381 //            delete fragment;                << 
3382 //            fragment=0;                     << 
3383 //        } else if (products->size() == 0) { << 
3384 //            // FixMe GF: for testing withou << 
3385 //#include "G4Gamma.hh"                       << 
3386 //            aNew = new G4ReactionProduct(G4 << 
3387 //            aNew->SetMomentum(G4ThreeVector << 
3388 //            aNew->SetTotalEnergy(0.01*MeV); << 
3389 //        }                                   << 
3390 //        if ( aNew != 0 ) products->push_bac << 
3391 //    }                                       << 
3392    return products;                           << 
3393 }                                             << 
3394                                               << 
3395 //------------------------------------------- << 
3396                                                  2485