101 #define _CheckChargeAndBaryonNumber_(val) CheckChargeAndBaryonNumber(val)
104 #define _CheckChargeAndBaryonNumber_(val)
108 #define _DebugEpConservation(val) DebugEpConservation(val)
111 #define _DebugEpConservation(val)
177 for(
auto & ptr :
theImR) {
delete ptr; }
185 outFile <<
"G4BinaryCascade is an intra-nuclear cascade model in which\n"
186 <<
"an incident hadron collides with a nucleon, forming two\n"
187 <<
"final-state particles, one or both of which may be resonances.\n"
188 <<
"The resonances then decay hadronically and the decay products\n"
189 <<
"are then propagated through the nuclear potential along curved\n"
190 <<
"trajectories until they re-interact or leave the nucleus.\n"
191 <<
"This model is valid for incident pions up to 1.5 GeV and\n"
192 <<
"nucleons up to 10 GeV.\n"
193 <<
"The remaining excited nucleus is handed on to ";
201 outFile <<
"G4ExcitationHandler";
206 outFile <<
"void.\n";
212 outFile <<
"G4BinaryCascade propagtes secondaries produced by a high\n"
213 <<
"energy model through the wounded nucleus.\n"
214 <<
"Secondaries are followed after the formation time and if\n"
215 <<
"within the nucleus are propagated through the nuclear\n"
216 <<
"potential along curved trajectories until they interact\n"
217 <<
"with a nucleon, decay, or leave the nucleus.\n"
218 <<
"An interaction of a secondary with a nucleon produces two\n"
219 <<
"final-state particles, one or both of which may be resonances.\n"
220 <<
"Resonances decay hadronically and the decay products\n"
221 <<
"are in turn propagated through the nuclear potential along curved\n"
222 <<
"trajectories until they re-interact or leave the nucleus.\n"
223 <<
"This model is valid for pions up to 1.5 GeV and\n"
224 <<
"nucleons up to about 3.5 GeV.\n"
225 <<
"The remaining excited nucleus is handed on to ";
233 outFile <<
"G4ExcitationHandler";
238 outFile <<
"void.\n";
255 if(std::getenv(
"BCDEBUG") )
G4cerr <<
" ######### Binary Cascade Reaction starts ######### "<<
G4endl;
260 if(initial4Momentum.
e()-initial4Momentum.
m()<
theBCminP &&
274 if(!std::getenv(
"I_Am_G4BinaryCascade_Developer") )
282 G4cerr <<
"G4BinaryCascade should not be used for projectiles other than nucleons or pions."<<
G4endl;
283 G4cerr <<
"If you want to continue, please switch on the developer environment: "<<
G4endl;
285 throw G4HadronicException(__FILE__, __LINE__,
"G4BinaryCascade - used for unvalid particle type - Fatal");
297 G4int interactionCounter = 0,collisionLoopMaxCount;
314 collisionLoopMaxCount = 200;
320 kt =
new G4KineticTrack(definition, 0., initialPosition, initial4Momentum);
324 secondaries->push_back(kt);
332 }
while(! products && --collisionLoopMaxCount>0);
334 if(++interactionCounter>99)
break;
336 }
while(products && products->size() == 0);
338 if(products && products->size()>0)
344 G4ReactionProductVector::iterator iter;
346 for(iter = products->begin(); iter != products->end(); ++iter)
350 (*iter)->GetTotalEnergy(),
351 (*iter)->GetMomentum());
353 G4double time=(*iter)->GetFormationTime();
354 if(time < 0.0) { time = 0.0; }
355 aNew.
SetTime(timePrimary + time);
364 if(std::getenv(
"BCDEBUG") )
G4cerr <<
" ######### Binary Cascade Reaction void, return initial state ######### "<<
G4endl;
379 if(std::getenv(
"BCDEBUG") )
G4cerr <<
" ######### Binary Cascade Reaction ends ######### "<<
G4endl;
389#ifdef debug_BIC_Propagate
390 G4cout <<
"G4BinaryCascade Propagate starting -------------------------------------------------------" <<
G4endl;
404 std::vector<G4KineticTrack *>::iterator iter;
415#ifdef debug_BIC_GetExcitationEnergy
428#ifdef debug_G4BinaryCascade
429 G4cout <<
"G4BinaryCascade::Propagate: warning - high energy model failed energy conservation, returning unchanged high energy final state" <<
G4endl;
447#ifdef debug_BIC_return
457 G4bool haveProducts =
false;
458 G4int collisionCount=0;
459 G4int collisionLoopMaxCount=1000000;
475#ifdef debug_BIC_Propagate_Collisions
476 G4cout <<
" NextCollision * , Time, curtime = " << nextCollision <<
" "
518#ifdef debug_BIC_return
519 G4cout <<
"return @ Z=0 after collision loop "<<
G4endl;
528 G4cout <<
"returned products: " << products->size() <<
G4endl;
549#ifdef debug_BIC_return
556#ifdef debug_BIC_Propagate
567#ifdef debug_G4BinaryCascade
568 G4cerr <<
"G4BinaryCascade: Warning, have active particles at end" <<
G4endl;
581#ifdef debug_G4BinaryCascade
582 G4cerr <<
" Warning: remove left over collision(s) " <<
G4endl;
587#ifdef debug_BIC_Propagate_Excitation
604#ifdef debug_BIC_Propagate_finals
606 G4cout <<
" Excitation Energy prefinal, #collisions:, out, captured "
607 << ExcitationEnergy <<
" "
608 << collisionCount <<
" "
613 if (ExcitationEnergy < 0 )
615 G4int maxtry=5, ntry=0;
619 }
while ( ++ntry < maxtry && ExcitationEnergy < 0 );
623#ifdef debug_BIC_Propagate_finals
625 G4cout <<
" Excitation Energy final, #collisions:, out, captured "
626 << ExcitationEnergy <<
" "
627 << collisionCount <<
" "
633 if ( ExcitationEnergy < 0. )
635 #ifdef debug_G4BinaryCascade
636 G4cerr <<
"G4BinaryCascade-Warning: negative excitation energy ";
645 #ifdef debug_BIC_return
646 G4cout <<
" negative Excitation E return empty products " << products <<
G4endl;
669 #ifdef debug_BIC_return
683#if defined(debug_G4BinaryCascade) || defined(debug_BIC_GetExcitationEnergy)
688 G4cerr <<
"G4BIC:GetExcitationEnergy(): Nucleon counting error current/final{A,Z} "
708#ifdef debug_G4BinaryCascade
709 G4cout <<
"G4BinaryCascade::GetExcitationEnergy(): Warning - invalid nucleus (A,Z)=("
715#ifdef debug_BIC_GetExcitationEnergy
717 debug.push_back(
"====> current A, Z");
720 debug.push_back(
"====> final A, Z");
721 debug.push_back(finalZ);
722 debug.push_back(finalA);
723 debug.push_back(nucleusMass);
736#ifdef debug_BIC_GetExcitationEnergy
738 if ( excitationE < 0 )
740 G4cout <<
"negative ExE final Ion mass " <<nucleusMass<<
G4endl;
742 if(finalZ>.5)
G4cout <<
" Final nuclmom/mass " << Nucl_mom <<
" " << Nucl_mom.
mag()
743 <<
" (A,Z)=("<< finalA <<
","<<finalZ <<
")"
744 <<
" mass " << nucleusMass <<
" "
745 <<
" excitE " << excitationE <<
G4endl;
754 G4cout <<
"GetExcitationEnergy: Initial nucleus A Z " <<
A <<
" " <<
Z <<
" " << initialExc <<
G4endl;
800 definition =
nucleon->GetDefinition();
815#ifdef debug_BIC_BuildTargetList
828 G4cerr <<
"G4BinaryCascade::BuildTargetList(): Fatal Error - invalid nucleus (A,Z)=("
834#ifdef debug_BIC_BuildTargetList
835 G4cout <<
"G4BinaryCascade::BuildTargetList(): nucleus (A,Z)=("
848 std::vector<G4KineticTrack *>::iterator iter;
854 for(iter = secondaries->begin(); iter != secondaries->end(); ++iter)
856 if((*iter)->GetFormationTime() < StartingTime)
857 StartingTime = (*iter)->GetFormationTime();
862 for(iter = secondaries->begin(); iter != secondaries->end(); ++iter)
866 G4double FormTime = (*iter)->GetFormationTime() - StartingTime;
867 (*iter)->SetFormationTime(FormTime);
871 lateParticles4Momentum += (*iter)->GetTrackingMomentum();
872 lateA += (*iter)->GetDefinition()->GetBaryonNumber();
880 projectileA += (*iter)->GetDefinition()->GetBaryonNumber();
882#ifdef debug_BIC_Propagate
883 G4cout <<
" Adding initial secondary " << *iter
884 <<
" time" << (*iter)->GetFormationTime()
885 <<
", state " << (*iter)->GetState() <<
G4endl;
899#ifdef debug_BIC_GetExcitationEnergy
900 G4cout <<
"BIC: Proj.e, nucl initial, nucl final, lateParticles"
903 << lateParticles4Momentum <<
G4endl;
906 success = excitation > 0;
907#ifdef debug_G4BinaryCascade
919 secondaries->clear();
962 std::vector<G4KineticTrack *>::iterator i;
970 precompoundProducts->push_back(aNew);
980 #ifdef debug_BIC_DeexcitationProducts
984 if ( precompoundProducts )
986 std::vector<G4ReactionProduct *>::iterator j;
987 for(j = precompoundProducts->begin(); j != precompoundProducts->end(); ++j)
990 Preco_momentum += pProduct;
993 G4cout <<
"finalNuclMom / sum preco products" << fragment_momentum <<
" / " << Preco_momentum
994 <<
" delta E "<< fragment_momentum.
e() - Preco_momentum.
e() <<
G4endl;
998 return precompoundProducts;
1009 std::vector<G4KineticTrack *>::iterator aNuc;
1011 std::vector<G4double> masses;
1018 G4double mass=(*aNuc)->GetDefinition()->GetPDGMass();
1019 masses.push_back(mass);
1029 G4double mass=(*aNuc)->GetDefinition()->GetPDGMass();
1030 masses.push_back(mass);
1041 if ( eCMS < sumMass )
1043 eCMS=sumMass + 2*
MeV*masses.size();
1048 std::vector<G4LorentzVector*> * momenta=
decay.Decay(eCMS,masses);
1049 std::vector<G4LorentzVector*>::iterator aMom=momenta->begin();
1062 result->push_back(aNew);
1075 (*aNuc)->GetDefinition());
1079 result->push_back(aNew);
1095#ifdef debug_BIC_Propagate_finals
1098 for(i = 0; i< fs.size(); i++)
1106 products->push_back(aNew);
1108#ifdef debug_BIC_Propagate_finals
1118#ifdef debug_BIC_Propagate_finals
1119 G4cout <<
" Final state momentum " << mom_fs <<
G4endl;
1130 if ( precompoundProducts )
1132 std::vector<G4ReactionProduct *>::iterator j;
1133 for(j = precompoundProducts->begin(); j != precompoundProducts->end(); ++j)
1138#ifdef debug_BIC_Propagate_finals
1139 G4cout <<
"BIC: pProduct be4 boost " <<pProduct <<
G4endl;
1142#ifdef debug_BIC_Propagate_finals
1143 G4cout <<
"BIC: pProduct aft boost " <<pProduct <<
G4endl;
1145 pSumPreco += pProduct;
1146 (*j)->SetTotalEnergy(pProduct.
e());
1147 (*j)->SetMomentum(pProduct.
vect());
1148 (*j)->SetNewlyAdded(
true);
1149 products->push_back(*j);
1153 precompoundProducts->clear();
1154 delete precompoundProducts;
1162 for(std::vector<G4KineticTrack *>::iterator i = secondaries->begin();
1163 i != secondaries->end(); ++i)
1165 for(std::vector<G4BCAction *>::iterator j =
theImR.begin();
1169 const std::vector<G4CollisionInitialState *> & aCandList
1171 for(
size_t count=0; count<aCandList.size(); count++)
1186 const std::vector<G4CollisionInitialState *> & aCandList
1188 for(
size_t count=0; count<aCandList.size(); count++)
1205 }
else if ( tout > 0 )
1218#ifdef debug_BIC_FindCollision
1219 G4cout <<
"FindLateP Particle, 4-mom, times newState "
1222 <<
" times " << tin <<
" " << tout <<
" "
1226 const std::vector<G4CollisionInitialState *> & aCandList
1228 for(
size_t count=0; count<aCandList.size(); count++)
1230#ifdef debug_BIC_FindCollision
1231 G4cout <<
" Adding a late Col : " << aCandList[count] <<
G4endl;
1244#ifdef debug_BIC_ApplyCollision
1245 G4cerr <<
"G4BinaryCascade::ApplyCollision start"<<
G4endl;
1251 G4bool haveTarget=target_collection.size()>0;
1254#ifdef debug_G4BinaryCascade
1255 G4cout <<
"G4BinaryCasacde::ApplyCollision(): StateError " << primary <<
G4endl;
1257 PrintKTVector(&target_collection,std::string(
"... targets"));
1277 G4int initialBaryon(0);
1278 G4int initialCharge(0);
1292#ifdef debug_BIC_ApplyCollision
1299 G4bool lateParticleCollision= (!haveTarget) && products && products->size() == 1;
1300 G4bool decayCollision= (!haveTarget) && products && products->size() > 1;
1304#ifdef debug_G4BinaryCascade
1305 G4int lateBaryon(0), lateCharge(0);
1308 if ( lateParticleCollision )
1312#ifdef debug_G4BinaryCascade
1313 lateBaryon = initialBaryon;
1314 lateCharge = initialCharge;
1316 initialBaryon=initialCharge=0;
1323 if (!lateParticleCollision)
1327#ifdef debug_BIC_ApplyCollision
1328 if (products)
G4cout <<
" ======Failed Pauli =====" <<
G4endl;
1329 G4cerr <<
"G4BinaryCascade::ApplyCollision blocked"<<
G4endl;
1343#ifdef debug_BIC_ApplyCollision
1355 G4int finalBaryon(0);
1356 G4int finalCharge(0);
1358 for(std::vector<G4KineticTrack *>::iterator i =products->begin(); i != products->end(); i++)
1360 if ( ! lateParticleCollision )
1362 (*i)->SetState(primary->
GetState());
1364 finalBaryon+=(*i)->GetDefinition()->GetBaryonNumber();
1365 finalCharge+=
G4lrint((*i)->GetDefinition()->GetPDGCharge()/
eplus);
1369 tin < 0 && tout > 0 )
1372 G4cout <<
"tin tout: " << tin <<
" " << tout <<
G4endl;
1384 else if ( tout > 0 )
1387 finalBaryon+=(*i)->GetDefinition()->GetBaryonNumber();
1388 finalCharge+=
G4lrint((*i)->GetDefinition()->GetPDGCharge()/
eplus);
1393 toFinalState.push_back((*i));
1399 toFinalState.push_back((*i));
1404 if(!toFinalState.empty())
1407 toFinalState.begin(),toFinalState.end());
1408 std::vector<G4KineticTrack *>::iterator iter1, iter2;
1409 for(iter1 = toFinalState.begin(); iter1 != toFinalState.end();
1412 iter2 = std::find(products->begin(), products->end(),
1414 if ( iter2 != products->end() ) products->erase(iter2);
1420 currentA += finalBaryon-initialBaryon;
1421 currentZ += finalCharge-initialCharge;
1425 oldSecondaries.push_back(primary);
1428#ifdef debug_G4BinaryCascade
1429 if ( (finalBaryon-initialBaryon-lateBaryon) != 0 || (finalCharge-initialCharge-lateCharge) != 0 )
1431 G4cout <<
"G4BinaryCascade: Error in Balancing: " <<
G4endl;
1432 G4cout <<
"initial/final baryon number, initial/final Charge "
1433 << initialBaryon <<
" "<< finalBaryon <<
" "
1434 << initialCharge <<
" "<< finalCharge <<
" "
1436 <<
", with number of products: "<< products->size() <<
G4endl;
1450 for(
size_t ii=0; ii< oldTarget.size(); ii++)
1452 oldTarget[ii]->Hit();
1473 std::vector<G4KineticTrack *>::iterator iter;
1483 absorbList.push_back(kt);
1488 if(absorbList.empty())
1492 for(iter = absorbList.begin(); iter != absorbList.end(); ++iter)
1496 throw G4HadronicException(__FILE__, __LINE__,
"G4BinaryCascade::Absorb(): Cannot absorb a particle.");
1499 throw G4HadronicException(__FILE__, __LINE__,
"G4BinaryCascade::Absorb(): Cannot absorb a particle.");
1502 G4int maxLoopCount = 1000;
1508 "G4BinaryCascade::Absorb(): Cannot absorb a particle.");
1510 if ( --maxLoopCount < 0 )
throw G4HadronicException(__FILE__, __LINE__,
"G4BinaryCascade::Absorb(): Cannot absorb a particle.");
1515 toRemove.push_back(kt);
1516 toDelete.push_back(kt);
1534 std::vector<G4KineticTrack *>::iterator i;
1539 G4int particlesAboveCut=0;
1540 G4int particlesBelowCut=0;
1559 ++particlesBelowCut;
1567 if (verbose)
G4cout <<
"Capture particlesAboveCut,particlesBelowCut, capturedEnergy,capturedEnergy/particlesBelowCut <? 0.2*theCutOnP "
1568 << particlesAboveCut <<
" " << particlesBelowCut <<
" " << capturedEnergy
1572 if(particlesBelowCut>0 && capturedEnergy/particlesBelowCut<0.2*
theCutOnP)
1583 captured.push_back(kt);
1608 G4KineticTrackVector::iterator i;
1615 for(i = products->begin(); i != products->end(); ++i)
1617 definition = (*i)->GetDefinition();
1643 if(mom.
e() < eFermi )
1652#ifdef debug_BIC_CheckPauli
1655 for(i = products->begin(); i != products->end(); ++i)
1657 definition = (*i)->GetDefinition();
1666 if ( mom.
e()-mom.
mag()+field > 160*
MeV )
1668 G4cout <<
"momentum problem pFermi=" << pFermi
1669 <<
" mom, mom.m " << mom <<
" " << mom.
mag()
1670 <<
" field " << field <<
G4endl;
1694 std::vector<G4KineticTrack *>::iterator i;
1704#ifdef debug_BIC_StepParticlesOut
1705 G4cout <<
" minTimeStep, tStep Particle " <<minTimeStep <<
" " <<tStep
1711 throw G4HadronicException(__FILE__, __LINE__,
"G4BinaryCascade::StepParticlesOut() particle not in nucleus");
1714 if(intersect && tStep<minTimeStep && tStep> 0 )
1716 minTimeStep = tStep;
1720 throw G4HadronicException(__FILE__, __LINE__,
"G4BinaryCascade::StepParticlesOut() particle not in nucleus");
1733 if ( timeToCollision > minTimeStep )
1763#ifdef debug_G4BinaryCascade
1764 G4cerr <<
"G4BinaryCascade.cc: Warning - aborting looping particle(s)" <<
G4endl;
1769 std::vector<G4KineticTrack *>::iterator iter;
1788#ifdef debug_BIC_StepParticlesOut
1794#ifdef debug_BIC_StepParticlesOut
1805 #ifdef debug_BIC_return
1806 G4cout <<
"return @ Z=0 after collision loop "<<
G4endl;
1839 if ( std::abs(PDGcode) > 1000 && PDGcode != 2112 && PDGcode != 2212 )
1846 std::vector<G4KineticTrack *>::iterator titer;
1847 for ( titer=target_collection.begin() ; titer!=target_collection.end(); ++titer)
1865 for ( std::vector<G4KineticTrack *>::iterator i =products->begin(); i != products->end(); i++)
1867 G4int PDGcode=(*i)->GetDefinition()->GetPDGEncoding();
1870 if ( std::abs(PDGcode) > 1000 && PDGcode != 2112 && PDGcode != 2212 )
1872 resonances.push_back(*i);
1875 if ( resonances.size() > 0 )
1877 G4double delta_Fermi= (initial_Efermi-final_Efermi)/resonances.size();
1878 for (std::vector<G4KineticTrack *>::iterator res=resonances.begin(); res != resonances.end(); res++)
1882 G4double newEnergy=mom.
e() + delta_Fermi;
1883 G4double newEnergy2= newEnergy*newEnergy;
1885 if ( newEnergy2 < mass2 )
1907#ifdef debug_BIC_CorrectFinalPandE
1913 G4KineticTrackVector::iterator i;
1915 if ( pNucleus.
e() == 0 )
return;
1916#ifdef debug_BIC_CorrectFinalPandE
1923 pFinals += (*i)->Get4Momentum();
1925#ifdef debug_BIC_CorrectFinalPandE
1926 G4cout <<
"CorrectFinalPandE a final " << (*i)->GetDefinition()->GetParticleName()
1927 <<
" 4mom " << (*i)->Get4Momentum()<<
G4endl;
1930#ifdef debug_BIC_CorrectFinalPandE
1931 G4cout <<
"CorrectFinalPandE pN pF: " <<pNucleus <<
" " <<pFinals <<
G4endl;
1937#ifdef debug_BIC_CorrectFinalPandE
1938 G4cout <<
"CorrectFinalPandE pCM, CMS pCM " << pCM <<
" " <<toCMS*pCM<<
G4endl;
1939 G4cout <<
"CorrectFinal CMS pN pF " <<toCMS*pNucleus <<
" "
1942 <<
" massInNucleus m(nucleus) m(finals) std::sqrt(s): " <<
massInNucleus <<
" " <<pNucleus.
mag()<<
" "
1951 if(
s0-(m10+m20)*(m10+m20) < 0 )
1953#ifdef debug_BIC_CorrectFinalPandE
1954 G4cout <<
"G4BinaryCascade::CorrectFinalPandE() : error! " <<
G4endl;
1956 G4cout <<
"not enough mass to correct: mass^2, A,Z, mass(nucl), mass(finals) "
1957 << (
s0-(m10+m20)*(m10+m20)) <<
" "
1959 << m10 <<
" " << m20
1969 G4double pInCM = std::sqrt((
s0-(m10+m20)*(m10+m20))*(
s0-(m10-m20)*(m10-m20))/(4.*
s0));
1970#ifdef debug_BIC_CorrectFinalPandE
1971 G4cout <<
" CorrectFinalPandE pInCM new, CURRENT, ratio : " << pInCM
1972 <<
" " << (pFinals).vect().mag()<<
" " << pInCM/(pFinals).vect().mag() <<
G4endl;
1974 if ( pFinals.
vect().
mag() > pInCM )
1984 G4ThreeVector p3(factor*(toCMS*(*i)->Get4Momentum()).vect());
1988#ifdef debug_BIC_CorrectFinalPandE
1991 (*i)->Set4Momentum(p);
1993#ifdef debug_BIC_CorrectFinalPandE
1996 <<
" CMS pFinals , mag, 3.mag : " << qFinals <<
" " << qFinals.
mag() <<
" " << qFinals.
vect().
mag()<<
G4endl;
1997 G4cerr <<
" -CorrectFinalPandE 5 " << factor <<
G4endl;
2000#ifdef debug_BIC_CorrectFinalPandE
2001 else {
G4cerr <<
" -CorrectFinalPandE 6 - no correction done" <<
G4endl; }
2013 std::vector<G4KineticTrack *>::iterator iter1, iter2;
2018 if(!oldSecondaries->empty())
2020 for(iter1 = oldSecondaries->begin(); iter1 != oldSecondaries->end();
2035 if(oldTarget->size()!=0)
2039 for(iter1 = oldTarget->begin(); iter1 != oldTarget->end(); ++iter1)
2051 if(!newSecondaries->empty())
2054 for(iter1 = newSecondaries->begin(); iter1 != newSecondaries->end();
2096#ifdef debug_BIC_DoTimeStep
2098 debug.push_back(
"======> DoTimeStep 1");
debug.dump();
2099 G4cerr <<
"G4BinaryCascade::DoTimeStep: enter step="<< theTimeStep
2106 std::vector<G4KineticTrack *>::iterator iter;
2119#ifdef debug_BIC_DoTimeStep
2132#ifdef debug_BIC_DoTimeStep
2142 std::for_each( kt_outside->begin(),kt_outside->end(),
2149 std::for_each( kt_inside->begin(),kt_inside->end(),
2159 kt_gone_in->clear();
2160 std::for_each( kt_outside->begin(),kt_outside->end(),
2163 kt_gone_out->clear();
2164 std::for_each( kt_inside->begin(),kt_inside->end(),
2167#ifdef debug_BIC_DoTimeStep
2168 PrintKTVector(
fail,std::string(
" Failed to go in/out -> miss_nucleus/captured"));
2169 PrintKTVector(kt_gone_in, std::string(
"recreated kt_gone_in"));
2170 PrintKTVector(kt_gone_out, std::string(
"recreated kt_gone_out"));
2176 std::for_each( kt_outside->begin(),kt_outside->end(),
2179 std::for_each( kt_outside->begin(),kt_outside->end(),
2182#ifdef debug_BIC_DoTimeStep
2183 PrintKTVector(kt_gone_out, std::string(
"append gone_outs to final state.. theFinalState"));
2187 kt_gone_out->begin(),kt_gone_out->end());
2199 if (kt_gone_out->size() )
2202 iter = std::find(kt_gone_out->begin(),kt_gone_out->end(),nextPrimary);
2203 if ( iter != kt_gone_out->end() )
2206#ifdef debug_BIC_DoTimeStep
2207 G4cout <<
" DoTimeStep - WARNING: deleting current collision!" <<
G4endl;
2211 if ( kt_captured->size() )
2214 iter = std::find(kt_captured->begin(),kt_captured->end(),nextPrimary);
2215 if ( iter != kt_captured->end() )
2218#ifdef debug_BIC_DoTimeStep
2219 G4cout <<
" DoTimeStep - WARNING: deleting current collision!" <<
G4endl;
2229 if ( kt_captured->size() )
2232 kt_captured->begin(),kt_captured->end());
2236 std::vector<G4KineticTrack *>::iterator i_captured;
2237 for(i_captured=kt_captured->begin();i_captured!=kt_captured->end();i_captured++)
2239 (*i_captured)->Hit();
2245#ifdef debug_G4BinaryCascade
2255 <<
" sum(tgt,capt,active) "
2285 std::vector<G4KineticTrack *>::iterator iter;
2290 G4int secondaries_in(0);
2291 G4int secondaryBarions_in(0);
2292 G4int secondaryCharge_in(0);
2295 for ( iter =in->begin(); iter != in->end(); ++iter)
2298 secondaryCharge_in +=
G4lrint((*iter)->GetDefinition()->GetPDGCharge()/
eplus);
2299 if ((*iter)->GetDefinition()->GetBaryonNumber()!=0 )
2301 secondaryBarions_in += (*iter)->GetDefinition()->GetBaryonNumber();
2305 secondaryMass_in += (*iter)->GetDefinition()->GetPDGMass();
2321 G4double correction= secondaryMass_in + mass_initial - mass_final;
2322 if (secondaries_in>1)
2323 {correction /= secondaries_in;}
2325#ifdef debug_BIC_CorrectBarionsOnBoundary
2326 G4cout <<
"CorrectBarionsOnBoundary,currentZ,currentA,"
2327 <<
"secondaryCharge_in,secondaryBarions_in,"
2328 <<
"energy correction,m_secondry,m_nucl_init,m_nucl_final "
2330 << secondaryCharge_in<<
" "<<secondaryBarions_in<<
" "
2331 << correction <<
" "
2332 << secondaryMass_in <<
" "
2333 << mass_initial <<
" "
2334 << mass_final <<
" "
2338 for ( iter = in->begin(); iter != in->end(); ++iter)
2340 if ((*iter)->GetTrackingMomentum().e()+correction > (*iter)->GetActualMass())
2342 (*iter)->UpdateTrackingMomentum((*iter)->GetTrackingMomentum().e() + correction);
2349 (*iter)->UpdateTrackingMomentum((*iter)->GetTrackingMomentum().e() + barrier);
2351 kt_fail->push_back(*iter);
2353 currentA -= (*iter)->GetDefinition()->GetBaryonNumber();
2358#ifdef debug_BIC_CorrectBarionsOnBoundary
2359 G4cout <<
" CorrectBarionsOnBoundary, aft, Z, A, sec-Z,A,m,m_in_nucleus "
2361 << secondaryCharge_in <<
" " << secondaryBarions_in <<
" "
2362 << secondaryMass_in <<
" "
2371 G4int secondaries_out(0);
2372 G4int secondaryBarions_out(0);
2373 G4int secondaryCharge_out(0);
2376 for ( iter =out->begin(); iter != out->end(); ++iter)
2379 secondaryCharge_out +=
G4lrint((*iter)->GetDefinition()->GetPDGCharge()/
eplus);
2380 if ((*iter)->GetDefinition()->GetBaryonNumber() !=0 )
2382 secondaryBarions_out += (*iter)->GetDefinition()->GetBaryonNumber();
2386 secondaryMass_out += (*iter)->GetDefinition()->GetPDGMass();
2404 G4cerr <<
"G4BinaryCascade - secondaryBarions_out,secondaryCharge_out " <<
2405 secondaryBarions_out <<
" " << secondaryCharge_out <<
G4endl;
2410 throw G4HadronicException(__FILE__, __LINE__,
"G4BinaryCascade::CorrectBarionsOnBoundary() - fatal error");
2413 G4double correction= mass_initial - mass_final - secondaryMass_out;
2416 if (secondaries_out>1) correction /= secondaries_out;
2417#ifdef debug_BIC_CorrectBarionsOnBoundary
2418 G4cout <<
"DoTimeStep,(current Z,A),"
2419 <<
"(secondaries out,Charge,Barions),"
2420 <<
"* energy correction,(m_secondry,m_nucl_init,m_nucl_final) "
2422 << secondaries_out <<
","
2423 << secondaryCharge_out<<
","<<secondaryBarions_out<<
") * "
2424 << correction <<
" ("
2425 << secondaryMass_out <<
", "
2426 << mass_initial <<
", "
2427 << mass_final <<
")"
2432 for ( iter = out->begin(); iter != out->end(); ++iter)
2434 if ((*iter)->GetTrackingMomentum().e()+correction > (*iter)->GetActualMass())
2436 (*iter)->UpdateTrackingMomentum((*iter)->GetTrackingMomentum().e() + correction);
2447 (*iter)->UpdateTrackingMomentum((*iter)->GetTrackingMomentum().e() - barrier);
2449 kt_fail->push_back(*iter);
2451 currentA += (*iter)->GetDefinition()->GetBaryonNumber();
2453#ifdef debug_BIC_CorrectBarionsOnBoundary
2456 G4cout <<
"Not correcting outgoing " << *iter <<
" "
2457 << (*iter)->GetDefinition()->GetPDGEncoding() <<
" "
2458 << (*iter)->GetDefinition()->GetParticleName() <<
G4endl;
2459 PrintKTVector(out,std::string(
"outgoing, one not corrected"));
2465#ifdef debug_BIC_CorrectBarionsOnBoundary
2467 G4cout <<
" DoTimeStep, nucl-update, A, Z, sec-Z,A,m,m_in_nucleus, table-mass, delta "
2469 << secondaryCharge_out <<
" "<< secondaryBarions_out <<
" "<<
2470 secondaryMass_out <<
" "
2488#ifdef debug_BIC_FindFragments
2489 G4cout <<
"target, captured, secondary: "
2498 G4KineticTrackVector::iterator i;
2501 if(
G4lrint((*i)->GetDefinition()->GetPDGCharge()/
eplus) == 1 )
2507 G4int zCaptured = 0;
2511 CapturedMomentum += (*i)->Get4Momentum();
2512 if(
G4lrint((*i)->GetDefinition()->GetPDGCharge()/
eplus) == 1 )
2518 G4int z = zTarget+zCaptured;
2520#ifdef debug_G4BinaryCascade
2523 G4cout <<
" FindFragment Counting error z a " << z <<
" " <<a <<
" "
2541 if ( z < 1 )
return 0;
2545#ifdef debug_BIC_FindFragments
2546 G4cout <<
"Fragment: a= " << a <<
" z= " << z <<
" particles= " << excitons
2547 <<
" Charged= " << zCaptured <<
" holes= " << holes
2575 final4Momentum -= (*i)->Get4Momentum();
2576 finals += (*i)->Get4Momentum();
2579 if(final4Momentum.
e()> 0 && (final4Momentum.
vect()/final4Momentum.
e()).mag()>1.0 &&
currentA > 0)
2581#ifdef debug_BIC_Final4Momentum
2583 G4cerr <<
"G4BinaryCascade::GetFinal4Momentum - Fatal"<<
G4endl;
2584 G4KineticTrackVector::iterator i;
2589 G4cerr <<
" Final state: "<<(*i)->Get4Momentum()<<(*i)->GetDefinition()->GetParticleName()<<
G4endl;
2592 G4cerr<<
" Final4Momentum = "<<final4Momentum <<
" "<<final4Momentum.
m()<<
G4endl;
2599 return final4Momentum;
2610 G4KineticTrackVector::iterator i;
2614 CapturedMomentum += (*i)->Get4Momentum();
2620 if ( NucleusMomentum.
e() > 0 )
2625 if(boost.
mag2()>1.0)
2627# ifdef debug_BIC_FinalNucleusMomentum
2628 G4cerr <<
"G4BinaryCascade::GetFinalNucleusMomentum - Fatal"<<
G4endl;
2630 G4cerr <<
"it 01"<<NucleusMomentum<<
" "<<CapturedMomentum<<
" "<<
G4endl;
2638#ifdef debug_debug_BIC_FinalNucleusMomentum
2639 G4cout <<
"GetFinalNucleusMomentum be4 boostNucleusMomentum, CapturedMomentum"<<NucleusMomentum<<
" "<<CapturedMomentum<<
" "<<
G4endl;
2641 NucleusMomentum *= nucleusBoost;
2642#ifdef debug_BIC_FinalNucleusMomentum
2643 G4cout <<
"GetFinalNucleusMomentum aft boost GetFinal4Momentum= " <<NucleusMomentum <<
G4endl;
2646 return NucleusMomentum;
2663 std::vector<G4KineticTrack *>::iterator iter, jter;
2668 while(!done && tryCount++ <200)
2676#ifdef debug_H1_BinaryCascade
2679 for(
size_t ss=0; secs && ss<secs->size(); ss++)
2682 if((*secs)[ss]->GetDefinition()->IsShortLived()) done =
true;
2690 for(
size_t current=0; secs && current<secs->size(); current++)
2692 if((*secs)[current]->GetDefinition()->IsShortLived())
2696 for(jter=dec->begin(); jter != dec->end(); jter++)
2699 secs->push_back(*jter);
2702 delete (*secs)[current];
2714#ifdef debug_H1_BinaryCascade
2724 products->push_back(aNew);
2725#ifdef debug_H1_BinaryCascade
2730 G4cout <<
"final shortlived : ";
2733 G4cout <<
"final un stable : ";
2765 }
while (
sqr(x1) +
sqr(x2) > 1.);
2791 std::vector<G4KineticTrack *>::iterator i;
2792 for(i = ktv->begin(); i != ktv->end(); ++i)
2801 std::vector<G4ReactionProduct *>::iterator i;
2802 for(i = rpv->begin(); i != rpv->end(); ++i)
2811 if (comment.size() > 0 )
G4cout <<
"G4BinaryCascade::PrintKTVector() " << comment <<
G4endl;
2813 G4cout <<
" vector: " << ktv <<
", number of tracks: " << ktv->size()
2815 std::vector<G4KineticTrack *>::iterator i;
2818 for(count = 0, i = ktv->begin(); i != ktv->end(); ++i, ++count)
2821 G4cout <<
" track n. " << count;
2825 G4cout <<
"G4BinaryCascade::PrintKTVector():No KineticTrackVector given " <<
G4endl;
2832 if (comment.size() > 0 )
G4cout <<
"G4BinaryCascade::PrintKTVector() "<< comment <<
G4endl;
2845 G4cout <<
"G4BinaryCascade::PrintKTVector(): No Kinetictrack given" <<
G4endl;
2855 if (
Z > 0 &&
A >=
Z )
2859 }
else if (
A > 0 &&
Z>0 )
2864 }
else if (
A >= 0 &&
Z<=0 )
2869 }
else if (
A == 0 )
2876 G4cerr <<
"G4BinaryCascade::GetIonMass() - invalid (A,Z) = ("
2878 throw G4HadronicException(__FILE__, __LINE__,
"G4BinaryCascade::GetIonMass() - giving up");
2889 std::vector<G4KineticTrack *>::iterator iter;
2890 std::vector<G4ReactionProduct *>::iterator rpiter;
2896 aNew->
SetMomentum((*iter)->Get4Momentum().vect());
2899 Esecondaries +=(*iter)->Get4Momentum().e();
2900 psecondaries +=(*iter)->Get4Momentum();
2903 products->push_back(aNew);
2915 if ( lates->size() == 1 ) {
2926 products->push_back(aNew);
2948 (*iter)->Update4Momentum((*iter)->Get4Momentum().vect()+transferCorrection);
2949 aNew->
SetMomentum((*iter)->Get4Momentum().vect());
2952 Esecondaries +=(*iter)->Get4Momentum().e();
2953 psecondaries +=(*iter)->Get4Momentum();
2955 products->push_back(aNew);
2962 (*iter)->Update4Momentum((*iter)->Get4Momentum().vect()+transferCorrection);
2963 aNew->
SetMomentum((*iter)->Get4Momentum().vect());
2966 Esecondaries +=(*iter)->Get4Momentum().e();
2967 psecondaries +=(*iter)->Get4Momentum();
2969 products->push_back(aNew);
2976 SumMassNucleons += (*iter)->GetDefinition()->GetPDGMass();
2977 pNucleons += (*iter)->Get4Momentum();
2981 #ifdef debug_BIC_FillVoidnucleus
2983 psecondaries - pNucleons;
2993 for (rpiter=products->begin(); rpiter!=products->end(); ++rpiter){
2994 TotalEkin+=(*rpiter)->GetKineticEnergy();
2997 if ( std::abs(Ekinetic) < 20*
perCent * TotalEkin ){
2998 correction=1. + (Ekinetic-Ekineticrdm)/TotalEkin;
3000 #ifdef debug_G4BinaryCascade
3002 G4cout <<
"BLIC::FillVoidNucleus() fail correction, Ekinetic, TotalEkin " << Ekinetic <<
""<< TotalEkin <<
G4endl;
3006 for (rpiter=products->begin(); rpiter!=products->end(); ++rpiter){
3007 (*rpiter)->SetKineticEnergy((*rpiter)->GetKineticEnergy()*correction);
3008 (*rpiter)->SetMomentum((*rpiter)->GetTotalMomentum() * (*rpiter)->GetMomentum().unit());
3012 Ekinetic=Ekineticrdm*correction;
3025 products->push_back(aNew);
3030 for (rpiter=products->begin(); rpiter!=products->end(); ++rpiter){
3031 psecondaries +=
G4LorentzVector((*rpiter)->GetMomentum(),(*rpiter)->GetTotalEnergy() );
3043 SumMom=initial4Mom.
vect()-SumMom;
3046 std::vector<G4ReactionProduct *>::reverse_iterator reverse;
3047 while ( SumMom.
mag() > 0.1*
MeV && loopcount++ < 10)
3049 G4int index=products->size();
3050 for (reverse=products->rbegin(); reverse!=products->rend(); ++reverse, --index){
3051 SumMom=initial4Mom.
vect();
3052 for (rpiter=products->begin(); rpiter!=products->end(); ++rpiter){
3053 SumMom-=(*rpiter)->GetMomentum();
3056 G4double p=((*reverse)->GetMomentum()).mag();
3057 (*reverse)->SetMomentum( p*(((*reverse)->GetMomentum()+SumMom).unit()));
3068 std::vector<G4KineticTrack *>::iterator iter;
3069 for(iter = secondaries->begin(); iter != secondaries->end(); ++iter)
3072 aNew->
SetMomentum((*iter)->Get4Momentum().vect());
3077 products->push_back(aNew);
3096 if (fragment != 0) {
3103 products->push_back(theNew);
3110 G4cout <<
"Thank you for using G4BinaryCascade. "<<
G4endl;
3120 for ( std::vector<G4KineticTrack *>::iterator i =products->begin(); i != products->end(); i++)
3122 G4int PDGcode=std::abs((*i)->GetDefinition()->GetPDGEncoding());
3123 if (std::abs(PDGcode)==211 || PDGcode==111 ) havePion=
true;
3126 if ( !products || havePion)
3130 <<
", with NO products! " <<
G4endl;
3149 static G4int lastdA(0), lastdZ(0);
3156 std::vector<G4KineticTrack *>::iterator i;
3157 G4int CapturedA(0), CapturedZ(0);
3158 G4int secsA(0), secsZ(0);
3160 CapturedA += (*i)->GetDefinition()->GetBaryonNumber();
3161 CapturedZ +=
G4lrint((*i)->GetDefinition()->GetPDGCharge()/
eplus);
3166 secsA += (*i)->GetDefinition()->GetBaryonNumber();
3167 secsZ +=
G4lrint((*i)->GetDefinition()->GetPDGCharge()/
eplus);
3172 fStateA += (*i)->GetDefinition()->GetBaryonNumber();
3173 fStateZ +=
G4lrint((*i)->GetDefinition()->GetPDGCharge()/
eplus);
3179#ifdef debugCheckChargeAndBaryonNumberverbose
3180 G4cout << where <<
" A: iState= "<< iStateA<<
", secs= "<< secsA<<
", fState= "<< fStateA<<
", current= "<<
currentA<<
", late= " <<
lateA <<
G4endl;
3181 G4cout << where <<
" Z: iState= "<< iStateZ<<
", secs= "<< secsZ<<
", fState= "<< fStateZ<<
", current= "<<
currentZ<<
", late= " <<
lateZ <<
G4endl;
3184 if (deltaA != 0 || deltaZ!=0 ) {
3185 if (deltaA != lastdA || deltaZ != lastdZ ) {
3186 G4cout <<
"baryon/charge imbalance - " << where <<
G4endl
3187 <<
"deltaA " <<deltaA<<
", iStateA "<<iStateA<<
", CapturedA "<<CapturedA <<
", secsA "<<secsA
3189 <<
"deltaZ "<<deltaZ<<
", iStateZ "<<iStateZ<<
", CapturedZ "<<CapturedZ <<
", secsZ "<<secsZ
3194 }
else { lastdA=lastdZ=0;}
3225 for (
unsigned int it=0; it < ktv.size(); it++)
3243 G4int product_barions(0);
3246 for (
unsigned int it=0; it < products->size(); it++)
3258 <<
" " <<
final <<
G4endl;;
3267 finalA -= product_barions;
3272 <<
" delta-mass " << delta<<
G4endl;
3276 <<
" " <<
final <<
" "
3289 G4ReactionProductVector::iterator iter;
3297 for(iter = products->begin(); iter != products->end(); ++iter)
3300 G4cout <<
" Secondary E - Ekin / p " <<
3301 (*iter)->GetDefinition()->GetParticleName() <<
" " <<
3302 (*iter)->GetTotalEnergy() <<
" - " <<
3303 (*iter)->GetKineticEnergy()<<
" / " <<
3304 (*iter)->GetMomentum().x() <<
" " <<
3305 (*iter)->GetMomentum().y() <<
" " <<
3306 (*iter)->GetMomentum().z() <<
G4endl;
3307 Efinal += (*iter)->GetTotalEnergy();
3308 pFinal += (*iter)->GetMomentum();
3312 G4cout <<
"BIC E/p delta " <<
3330 std::vector<G4KineticTrack *>::iterator ktiter;
3334 G4cout <<
" Secondary E - Ekin / p " <<
3335 (*ktiter)->GetDefinition()->GetParticleName() <<
" " <<
3336 (*ktiter)->Get4Momentum().e() <<
" - " <<
3337 (*ktiter)->Get4Momentum().e() - (*ktiter)->Get4Momentum().mag() <<
" / " <<
3338 (*ktiter)->Get4Momentum().vect() <<
G4endl;
3339 psecs += (*ktiter)->Get4Momentum();
3345 G4cout <<
" Target E - Ekin / p " <<
3346 (*ktiter)->GetDefinition()->GetParticleName() <<
" " <<
3347 (*ktiter)->Get4Momentum().e() <<
" - " <<
3348 (*ktiter)->Get4Momentum().e() - (*ktiter)->Get4Momentum().mag() <<
" / " <<
3349 (*ktiter)->Get4Momentum().vect() <<
G4endl;
3350 ptgts += (*ktiter)->Get4Momentum();
3356 G4cout <<
" Captured E - Ekin / p " <<
3357 (*ktiter)->GetDefinition()->GetParticleName() <<
" " <<
3358 (*ktiter)->Get4Momentum().e() <<
" - " <<
3359 (*ktiter)->Get4Momentum().e() - (*ktiter)->Get4Momentum().mag() <<
" / " <<
3360 (*ktiter)->Get4Momentum().vect() <<
G4endl;
3361 pcpts += (*ktiter)->Get4Momentum();
3367 G4cout <<
" Finals E - Ekin / p " <<
3368 (*ktiter)->GetDefinition()->GetParticleName() <<
" " <<
3369 (*ktiter)->Get4Momentum().e() <<
" - " <<
3370 (*ktiter)->Get4Momentum().e() - (*ktiter)->Get4Momentum().mag() <<
" / " <<
3371 (*ktiter)->Get4Momentum().vect() <<
G4endl;
3372 pfins += (*ktiter)->Get4Momentum();
3375 G4cout <<
" Secondaries " << psecs <<
", Targets " << ptgts <<
G4endl
3376 <<
" Captured " << pcpts <<
", Finals " << pfins <<
G4endl
#define _CheckChargeAndBaryonNumber_(val)
#define _DebugEpConservation(val)
const G4DNABoundingBox initial
static const G4double pos
CLHEP::HepLorentzVector G4LorentzVector
std::vector< G4ReactionProduct * > G4ReactionProductVector
static constexpr double perCent
static constexpr double eplus
static constexpr double fermi
static constexpr double GeV
static constexpr double MeV
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cerr
G4GLOB_DLL std::ostream G4cout
Hep3Vector orthogonal() const
Hep3Vector cross(const Hep3Vector &) const
HepLorentzRotation inverse() const
HepLorentzRotation & set(double bx, double by, double bz)
Hep3Vector boostVector() const
G4bool FindAbsorbers(G4KineticTrack &kt, G4KineticTrackVector &tgt)
G4bool WillBeAbsorbed(const G4KineticTrack &kt)
G4bool FindProducts(G4KineticTrack &kt)
G4KineticTrackVector * GetAbsorbers()
G4KineticTrackVector * GetProducts()
static G4Alpha * AlphaDefinition()
virtual const std::vector< G4CollisionInitialState * > & GetCollisions(G4KineticTrack *aProjectile, std::vector< G4KineticTrack * > &, G4double theCurrentTime)
virtual const std::vector< G4CollisionInitialState * > & GetCollisions(G4KineticTrack *aProjectile, std::vector< G4KineticTrack * > &, G4double theCurrentTime)
G4KineticTrackVector theSecondaryList
G4Fragment * FindFragments()
G4bool Capture(G4bool verbose=false)
void FindLateParticleCollision(G4KineticTrack *)
G4bool CorrectShortlivedFinalsForFermi(G4KineticTrackVector *products, G4double initial_Efermi)
void PrintKTVector(G4KineticTrackVector *ktv, std::string comment=std::string(""))
G4ReactionProductVector * ProductsAddPrecompound(G4ReactionProductVector *products, G4ReactionProductVector *preco)
void UpdateTracksAndCollisions(G4KineticTrackVector *oldSecondaries, G4KineticTrackVector *oldTarget, G4KineticTrackVector *newSecondaries)
G4VFieldPropagation * thePropagator
virtual void PropagateModelDescription(std::ostream &) const
G4int GetTotalCharge(std::vector< G4KineticTrack * > &aV)
G4LorentzVector theInitial4Mom
G4bool DoTimeStep(G4double timeStep)
G4KineticTrackVector theCapturedList
G4bool ApplyCollision(G4CollisionInitialState *)
G4double GetIonMass(G4int Z, G4int A)
G4ReactionProductVector * DecayVoidNucleus()
G4bool CheckPauliPrinciple(G4KineticTrackVector *)
G4ReactionProductVector * Propagate1H1(G4KineticTrackVector *, G4V3DNucleus *)
G4double CorrectShortlivedPrimaryForFermi(G4KineticTrack *primary, G4KineticTrackVector target_collection)
G4double currentInitialEnergy
G4ReactionProductVector * ProductsAddFakeGamma(G4ReactionProductVector *products)
const G4ParticleDefinition * thePrimaryType
G4ThreeVector theMomentumTransfer
G4KineticTrackVector * CorrectBarionsOnBoundary(G4KineticTrackVector *in, G4KineticTrackVector *out)
G4bool DebugFinalEpConservation(const G4HadProjectile &aTrack, G4ReactionProductVector *products)
G4LorentzVector theProjectile4Momentum
G4CollisionManager * theCollisionMgr
void ClearAndDestroy(G4KineticTrackVector *ktv)
G4KineticTrackVector theTargetList
G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &theNucleus)
void DebugApplyCollision(G4CollisionInitialState *collision, G4KineticTrackVector *products)
virtual G4ReactionProductVector * Propagate(G4KineticTrackVector *, G4V3DNucleus *)
G4ExcitationHandler * theExcitationHandler
G4ReactionProductVector * DeExcite()
G4LorentzRotation precompoundLorentzboost
G4LorentzVector GetFinalNucleusMomentum()
void PrintWelcomeMessage()
G4bool BuildLateParticleCollisions(G4KineticTrackVector *secondaries)
G4double initial_nuclear_mass
void DebugApplyCollisionFail(G4CollisionInitialState *collision, G4KineticTrackVector *products)
void FindCollisions(G4KineticTrackVector *)
G4ReactionProductVector * ProductsAddFinalState(G4ReactionProductVector *products, G4KineticTrackVector &finalState)
G4bool CheckChargeAndBaryonNumber(G4String where)
G4DecayKineticTracks decayKTV
G4bool DebugEpConservation(const G4String where)
void FindDecayCollision(G4KineticTrack *)
G4ReactionProductVector * HighEnergyModelFSProducts(G4ReactionProductVector *, G4KineticTrackVector *secondaries)
G4ThreeVector GetSpherePoint(G4double r, const G4LorentzVector &momentumdirection)
G4LorentzVector GetFinal4Momentum()
G4BinaryCascade(G4VPreCompoundModel *ptr=0)
std::vector< G4BCAction * > theImR
G4KineticTrackVector theFinalState
G4Scatterer * theH1Scatterer
virtual void ModelDescription(std::ostream &) const
G4double GetExcitationEnergy()
G4BCLateParticle * theLateParticle
virtual ~G4BinaryCascade()
G4ReactionProductVector * FillVoidNucleusProducts(G4ReactionProductVector *)
G4KineticTrackVector & GetTargetCollection(void)
G4KineticTrackVector * GetFinalState()
const G4BCAction * GetGenerator()
G4int GetTargetBaryonNumber()
G4double GetCollisionTime(void)
G4KineticTrack * GetPrimary(void)
void RemoveCollision(G4CollisionInitialState *collision)
void RemoveTracksCollisions(G4KineticTrackVector *ktv)
void AddCollision(G4double time, G4KineticTrack *proj, G4KineticTrack *target=NULL)
G4CollisionInitialState * GetNextCollision()
void Decay(G4KineticTrackVector *tracks) const
static G4Deuteron * DeuteronDefinition()
void ModelDescription(std::ostream &outFile) const
G4ReactionProductVector * BreakItUp(const G4Fragment &theInitialState)
G4double GetFermiMomentum(G4double density)
void Init(G4int anA, G4int aZ)
void SetNumberOfCharged(G4int value)
const G4LorentzVector & GetMomentum() const
void SetCreatorModelID(G4int value)
void SetNumberOfHoles(G4int valueTot, G4int valueP=0)
void SetNumberOfParticles(G4int value)
void SetStatusChange(G4HadFinalStateStatus aS)
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
void SetEnergyChange(G4double anEnergy)
void SetMomentumChange(const G4ThreeVector &aV)
G4double GetWeightChange() const
const G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
const G4LorentzVector & Get4Momentum() const
G4double GetGlobalTime() const
void SetTime(G4double aT)
void SetCreatorModelID(G4int id)
G4HadronicInteraction * FindModel(const G4String &name)
static G4HadronicInteractionRegistry * Instance()
virtual G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
G4HadFinalState theParticleChange
void SetMinEnergy(G4double anEnergy)
const G4String & GetModelName() const
void SetEnergyMomentumCheckLevels(G4double relativeLevel, G4double absoluteLevel)
void SetMaxEnergy(const G4double anEnergy)
static G4He3 * He3Definition()
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
G4double GetIonMass(G4int Z, G4int A, G4int nL=0, G4int lvl=0) const
CascadeState SetState(const CascadeState new_state)
G4int GetCreatorModelID() const
CascadeState GetState() const
void SetNucleon(G4Nucleon *aN)
void Set4Momentum(const G4LorentzVector &a4Momentum)
const G4ThreeVector & GetPosition() const
const G4ParticleDefinition * GetDefinition() const
G4bool IsParticipant() const
const G4LorentzVector & GetTrackingMomentum() const
void Update4Momentum(G4double aEnergy)
const G4LorentzVector & Get4Momentum() const
G4double GetActualMass() const
static G4Neutron * NeutronDefinition()
static G4Neutron * Neutron()
G4bool GetPDGStable() const
G4bool IsShortLived() const
G4double GetPDGMass() const
G4int GetPDGEncoding() const
G4double GetPDGCharge() const
G4int GetBaryonNumber() const
const G4String & GetParticleName() const
G4IonTable * GetIonTable() const
static G4ParticleTable * GetParticleTable()
static G4int GetModelID(const G4int modelIndex)
static G4PionMinus * PionMinusDefinition()
static G4PionPlus * PionPlusDefinition()
static G4Proton * ProtonDefinition()
static G4Proton * Proton()
G4double GetField(G4int encoding, G4ThreeVector pos)
G4double GetBarrier(G4int encoding)
void SetMomentum(const G4double x, const G4double y, const G4double z)
void SetTotalEnergy(const G4double en)
G4double GetTotalMomentum() const
G4double GetKineticEnergy() const
G4double GetTotalEnergy() const
void SetCreatorModelID(const G4int mod)
void SetNewlyAdded(const G4bool f)
G4ThreeVector GetMomentum() const
void SetKineticEnergy(const G4double en)
virtual G4KineticTrackVector * Scatter(const G4KineticTrack &trk1, const G4KineticTrack &trk2) const
static void ConstructParticle()
static G4Triton * TritonDefinition()
virtual G4double CoulombBarrier()=0
virtual G4double GetOuterRadius()=0
virtual const G4VNuclearDensity * GetNuclearDensity() const =0
virtual G4Nucleon * GetNextNucleon()=0
virtual G4int GetCharge()=0
virtual G4bool StartLoop()=0
virtual G4double GetMass()=0
virtual void Init(G4int theA, G4int theZ, G4int numberOfLambdas=0)=0
virtual G4int GetMassNumber()=0
virtual void Init(G4V3DNucleus *theNucleus)=0
virtual void Transport(G4KineticTrackVector &theActive, const G4KineticTrackVector &theSpectators, G4double theTimeStep)=0
virtual G4ThreeVector GetMomentumTransfer() const =0
G4VPreCompoundModel * theDeExcitation
G4V3DNucleus * the3DNucleus
G4VPreCompoundModel * GetDeExcitation() const
const G4HadProjectile * GetPrimaryProjectile() const
void SetDeExcitation(G4VPreCompoundModel *ptr)
G4double GetDensity(const G4ThreeVector &aPosition) const
virtual void DeExciteModelDescription(std::ostream &outFile) const =0
virtual G4ReactionProductVector * DeExcite(G4Fragment &aFragment)=0
G4ExcitationHandler * GetExcitationHandler() const
G4KineticTrack::CascadeState wanted_state
SelectFromKTV(G4KineticTrackVector *out, G4KineticTrack::CascadeState astate)
void operator()(G4KineticTrack *&kt) const
G4KineticTrackVector * ktv
ParticleList decay(Cluster *const c)
Carries out a cluster decay.
G4double energy(const ThreeVector &p, const G4double m)
T max(const T t1, const T t2)
brief Return the largest of the two arguments
const char * name(G4int ptype)
G4bool nucleon(G4int ityp)
static void fail(const std::string &_prefix, const std::string &_name, const std::set< std::string > &_opts, G4int _num)