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 10.0.p1)


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