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 6.2.p2)


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