74 : CaptureThreshold(10*
MeV)
108 #define exactExcitationEnergy
123 G4int numberOfEx = 0;
124 G4int numberOfCh = 0;
125 G4int numberOfHoles = 0;
133 #ifdef exactExcitationEnergy
136 G4KineticTrackVector::iterator iter;
137 for(iter=theSecondaries->begin(); iter !=theSecondaries->end(); ++iter)
140 G4double e = (*iter)->Get4Momentum().e();
141 G4double mass = (*iter)->Get4Momentum().mag();
145 ((*iter)->GetPosition().mag() > R)) {
149 theTotalResult->push_back(theNew);
150 #ifdef exactExcitationEnergy
151 secondary4Momemtum += (*iter)->Get4Momentum();
161 captured3Momentum += mom;
162 exEnergy += (e - mass);
166 delete theSecondaries;
171 while(theCurrentNucleon) {
177 wounded3Momentum += theCurrentNucleon->
Get4Momentum().vect();
183 exciton3Momentum = captured3Momentum - wounded3Momentum;
185 if(anA == 0)
return theTotalResult;
191 #ifdef exactExcitationEnergy
198 G4double Efinal = std::sqrt(exciton3Momentum.mag2() + fMass*fMass)
199 + secondary4Momemtum.e();
200 if ( (Einitial - Efinal) > 0 ) {
208 exEnergy=(PrimMom - secondary4Momemtum).mag() - fMass;
219 if(exEnergy < 0.) exEnergy=0.;
224 secondary4Momemtum.vect() - exciton3Momentum;
226 #ifdef G4GPI_debug_excitation
227 G4cout <<
"momentum balance" << balance
228 <<
" value " << balance.mag() <<
G4endl
230 <<
"secondary "<< secondary4Momemtum <<
G4endl
231 <<
"captured "<< captured3Momentum <<
G4endl
232 <<
"wounded "<< wounded3Momentum <<
G4endl
233 <<
"exciton "<< exciton3Momentum <<
G4endl
234 <<
"second + exciton"
235 << secondary4Momemtum.vect() + exciton3Momentum <<
G4endl;
243 std::sqrt(exciton3Momentum.mag2() + fMass*fMass));
247 G4Fragment anInitialState(anA, aZ, exciton4Momentum);
255 theTotalResult->insert(theTotalResult->end(),aPrecoResult->begin(),
256 aPrecoResult->end() );
260 return theTotalResult;
266 G4cout <<
"G4GeneratorPrecompoundInterface: ApplyYourself interface called stand-allone."
268 G4cout <<
"This class is only a mediator between generator and precompound"<<
G4endl;
269 G4cout <<
"Please remove from your physics list."<<
G4endl;
270 throw G4HadronicException(__FILE__, __LINE__,
"SEVERE: G4GeneratorPrecompoundInterface model interface called stand-allone.");
275 outFile <<
"G4GeneratorPrecompoundInterface interfaces a high\n"
276 <<
"energy model through the wounded nucleus to precompound de-excition.\n"
277 <<
"Low energy protons and neutron present among secondaries produced by \n"
278 <<
"the high energy generator and within the nucleus are captured. The wounded\n"
279 <<
"nucleus and the captured particles form an excited nuclear fragment. This\n"
280 <<
"fragment is passed to the Geant4 pre-compound model for de-excitation.\n"
281 <<
"Nuclear de-excitation:\n";
292 G4cout<<
"G4GeneratorPrecompoundInterface::PropagateNuclNucl "<<
G4endl;
300 G4int numberOfEx = 0;
301 G4int numberOfCh = 0;
302 G4int numberOfHoles = 0;
314 while(theCurrentNucleon) {
328 G4cout<<
"Residual Target A Z E* 4mom "<<anA<<
" "<<aZ<<
" "<<exEnergy<<
" "
329 <<Target4Momentum<<
G4endl;
334 G4cout<<
"Primary BaryonNumber "
338 G4bool ProjectileIsAntiNucleus=
345 G4int numberOfExB = 0;
346 G4int numberOfChB = 0;
347 G4int numberOfHolesB = 0;
359 while(theCurrentNucleon) {
364 if(!ProjectileIsAntiNucleus) {
372 Projectile4Momentum -=theCurrentNucleon->
Get4Momentum();
378 0.3*
G4double (numberOfHoles + anA);
380 0.3*
G4double (numberOfHolesB + anAb);
383 G4cout<<
"Projectile residual A Z E* 4mom "<<anAb<<
" "<<aZb<<
" "<<exEnergyB<<
" "
384 <<Projectile4Momentum<<
G4endl;
385 G4cout<<
" ExistTargetRemnant ExistProjectileRemnant "
386 <<ExistTargetRemnant<<
" "<< ExistProjectileRemnant<<
G4endl;
398 G4KineticTrackVector::iterator iter;
399 for(iter=theSecondaries->begin(); iter !=theSecondaries->end(); ++iter)
405 (part !=
ANTIproton && ProjectileIsAntiNucleus) &&
411 theTotalResult->push_back(theNew);
414 secondary4Momemtum += (*iter)->Get4Momentum();
415 G4cout<<
"Secondary "<<SecondrNum<<
" "
417 <<secondary4Momemtum<<
G4endl;
423 G4bool CanBeCapturedByTarget =
false;
426 CanBeCapturedByTarget = ExistTargetRemnant &&
428 (aTrack4Momentum + Target4Momentum).mag() -
429 aTrack4Momentum.mag() - Target4Momentum.mag()) &&
430 ((*iter)->GetPosition().mag() < R);
434 (*iter)->GetFormationTime());
437 G4bool CanBeCapturedByProjectile =
false;
439 if( !ProjectileIsAntiNucleus &&
442 CanBeCapturedByProjectile = ExistProjectileRemnant &&
444 (aTrack4Momentum + Projectile4Momentum).mag() -
445 aTrack4Momentum.mag() - Projectile4Momentum.mag()) &&
446 (Position.vect().mag() < Rb);
449 if( ProjectileIsAntiNucleus &&
452 CanBeCapturedByProjectile = ExistProjectileRemnant &&
454 (aTrack4Momentum + Projectile4Momentum).mag() -
455 aTrack4Momentum.mag() - Projectile4Momentum.mag()) &&
456 (Position.vect().mag() < Rb);
459 if(CanBeCapturedByTarget && CanBeCapturedByProjectile)
462 { CanBeCapturedByTarget =
true; CanBeCapturedByProjectile =
false;}
464 { CanBeCapturedByTarget =
false; CanBeCapturedByProjectile =
true;}
467 if(CanBeCapturedByTarget)
473 G4cout<<
"Track is CapturedByTarget "<<
" "
474 <<aTrack4Momentum<<
" "<<aTrack4Momentum.mag()<<
G4endl;
481 Target4Momentum +=aTrack4Momentum;
483 }
else if(CanBeCapturedByProjectile)
489 G4cout<<
"Track is CapturedByProjectile"<<
" "
490 <<aTrack4Momentum<<
" "<<aTrack4Momentum.mag()<<
G4endl;
495 if( ProjectileIsAntiNucleus ) Z=-Z;
498 Projectile4Momentum +=aTrack4Momentum;
505 theTotalResult->push_back(theNew);
509 secondary4Momemtum += (*iter)->Get4Momentum();
510 G4cout<<
"Secondary "<<SecondrNum<<
" "
512 <<secondary4Momemtum<<
G4endl;
518 delete theSecondaries;
522 G4cout<<
"Final target residual A Z E* 4mom "<<anA<<
" "<<aZ<<
" "
523 <<exEnergy<<
" "<<Target4Momentum<<
G4endl;
531 {Target4Momentum.setE(fMass);}
533 G4double RemnMass=Target4Momentum.mag();
536 RemnMass=fMass + exEnergy;
537 Target4Momentum.setE(std::sqrt(Target4Momentum.vect().mag2() +
540 { exEnergy=RemnMass-fMass;}
542 if( exEnergy < 0.) exEnergy=0.;
545 G4Fragment anInitialState(anA, aZ, Target4Momentum);
554 for(
unsigned int ll=0; ll<aPrecoResult->size(); ++ll)
556 theTotalResult->push_back(aPrecoResult->operator[](ll));
558 G4cout<<
"Tr frag "<<aPrecoResult->operator[](ll)->GetDefinition()->GetParticleName()
559 <<
" "<<aPrecoResult->operator[](ll)->GetMomentum()<<
G4endl;
566 if((anAb == theProjectileNucleus->
GetMassNumber())&& (exEnergyB <= 0.))
570 G4cout<<
"Final projectile residual A Z E* Pmom "<<anAb<<
" "<<aZb<<
" "
571 <<exEnergyB<<
" "<<Projectile4Momentum<<
G4endl;
577 G4double RemnMass=Projectile4Momentum.mag();
581 RemnMass=fMass + exEnergyB;
582 Projectile4Momentum.setE(std::sqrt(Projectile4Momentum.vect().mag2() +
585 { exEnergyB=RemnMass-fMass;}
587 if( exEnergyB < 0.) exEnergyB=0.;
590 G4Fragment anInitialState(anAb, aZb, Projectile4Momentum);
599 for(
unsigned int ll=0; ll<aPrecoResult->size(); ++ll)
601 if(ProjectileIsAntiNucleus)
605 G4cout<<
"aPrecoRes "<<aPrecoResult->operator[](ll)->GetDefinition()->GetParticleName()
606 <<
" "<<aPrecoResult->operator[](ll)->GetMomentum()
607 <<
" "<<aPrecoResult->operator[](ll)->GetTotalEnergy()
608 <<
" "<<aPrecoResult->operator[](ll)->GetMass()<<
G4endl;
621 aPrecoResult->operator[](ll)->SetDefinitionAndUpdateE(LastFragment);
625 G4cout<<
"aPrecoResA "<<aPrecoResult->operator[](ll)->GetDefinition()->GetParticleName()
626 <<
" "<<aPrecoResult->operator[](ll)->GetMomentum()
627 <<
" "<<aPrecoResult->operator[](ll)->GetTotalEnergy()
628 <<
" "<<aPrecoResult->operator[](ll)->GetMass()<<
G4endl;
630 theTotalResult->push_back(aPrecoResult->operator[](ll));
636 return theTotalResult;
static G4AntiTriton * AntiTritonDefinition()
const G4ParticleDefinition * proton
static G4AntiHe3 * AntiHe3()
static G4double GetNuclearMass(const G4double A, const G4double Z)
G4GeneratorPrecompoundInterface(G4VPreCompoundModel *p=0)
virtual G4int GetCharge()=0
CLHEP::Hep3Vector G4ThreeVector
const G4ParticleDefinition * He3
const G4HadProjectile * GetPrimaryProjectile() const
const G4ParticleDefinition * deuteron
virtual G4ReactionProductVector * DeExcite(G4Fragment &aFragment)=0
virtual G4double GetNuclearRadius()=0
virtual G4ReactionProductVector * Propagate(G4KineticTrackVector *theSecondaries, G4V3DNucleus *theNucleus)
virtual G4bool StartLoop()=0
const G4ParticleDefinition * He4
static G4AntiDeuteron * AntiDeuteron()
void SetMomentum(const G4double x, const G4double y, const G4double z)
virtual G4int GetMassNumber()=0
virtual void PropagateModelDescription(std::ostream &) const
const G4ParticleDefinition * ANTItriton
void SetNumberOfHoles(G4int valueTot, G4int valueP=0)
const G4ParticleDefinition * neutron
static G4AntiDeuteron * AntiDeuteronDefinition()
virtual const G4LorentzVector & Get4Momentum() const
const G4ParticleDefinition * triton
virtual G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
static G4AntiAlpha * AntiAlpha()
static G4AntiProton * AntiProtonDefinition()
static G4AntiNeutron * AntiNeutronDefinition()
const G4String & GetParticleName() const
virtual const G4ParticleDefinition * GetDefinition() const
std::vector< G4ReactionProduct * > G4ReactionProductVector
const G4ParticleDefinition * GetDefinition() const
const G4ParticleDefinition * ANTIdeuteron
G4GLOB_DLL std::ostream G4cout
ParticleList decay(Cluster *const c)
Carries out a cluster decay.
const G4ParticleDefinition * GetDefinition() const
static G4AntiProton * AntiProton()
const G4ParticleDefinition * ANTIHe3
void SetTotalEnergy(const G4double en)
static G4Triton * Triton()
static G4Proton * Proton()
static G4Neutron * Neutron()
void SetNumberOfParticles(G4int value)
virtual G4ReactionProductVector * PropagateNuclNucl(G4KineticTrackVector *theSecondaries, G4V3DNucleus *theNucleus, G4V3DNucleus *theProjectileNucleus)
const G4LorentzVector & Get4Momentum() const
static G4Deuteron * Deuteron()
static G4AntiHe3 * AntiHe3Definition()
G4HadronicInteraction * FindModel(const G4String &name)
static G4HadronicInteractionRegistry * Instance()
G4VPreCompoundModel * theDeExcitation
void SetDeExcitation(G4VPreCompoundModel *ptr)
static G4AntiAlpha * AntiAlphaDefinition()
const G4ParticleDefinition * ANTIHe4
virtual G4Nucleon * GetNextNucleon()=0
virtual ~G4GeneratorPrecompoundInterface()
void SetNumberOfCharged(G4int value)
const G4ParticleDefinition * ANTIneutron
static G4AntiTriton * AntiTriton()
static const double eplus
G4double GetPDGCharge() const
const G4ParticleDefinition * ANTIproton
G4double GetBindingEnergy() const
G4double CaptureThreshold
static G4AntiNeutron * AntiNeutron()
G4int GetBaryonNumber() const
CLHEP::HepLorentzVector G4LorentzVector