89 coulomb_collision_gamma_proj = 0.0;
90 coulomb_collision_rx_proj = 0.0;
91 coulomb_collision_rz_proj = 0.0;
92 coulomb_collision_px_proj = 0.0;
93 coulomb_collision_pz_proj = 0.0;
95 coulomb_collision_gamma_targ = 0.0;
96 coulomb_collision_rx_targ = 0.0;
97 coulomb_collision_rz_targ = 0.0;
98 coulomb_collision_px_targ = 0.0;
99 coulomb_collision_pz_targ = 0.0;
108 delete excitationHandler;
168 G4double bmax_0 = std::sqrt( xs_0 / pi );
175 std::vector< G4QMDNucleus* > nucleuses;
184 G4double e1 = std::sqrt( p1*p1 + m1*m1 );
190 G4double beta_nncm = ( - boostLABtoCM.
beta() + boostLABtoNN.
beta() ) / ( 1 - boostLABtoCM.
beta() * boostLABtoNN.
beta() ) ;
198 boostToReac = boostLABtoNN;
199 boostBackToLAB = -boostLABtoNN;
204 G4int icounter_max = 1024;
208 if ( icounter > icounter_max ) {
209 G4cout <<
"Loop-counter exceeded the threshold value at " << __LINE__ <<
"th line of " << __FILE__ <<
"." <<
G4endl;
215 G4double bmax = envelopF*(bmax_0/fermi);
227 calcOffSetOfCollision( b , proj_pd , targ_pd , plab , elab , bmax , boostCMtoNN );
277 , p0.
z() * coulomb_collision_gamma_targ + coulomb_collision_pz_targ );
281 , r0.
z() / coulomb_collision_gamma_targ + coulomb_collision_rz_targ );
307 , p0.
z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj );
311 , r0.
z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj );
335 , p0.
z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj );
339 , r0.
z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj );
358 for (
G4int i = 0 ; i < maxTime ; i++ )
365 if ( i / 10 * 10 == i )
390 if ( numberOfSecondary == 2 )
393 G4bool elasticLike_system =
false;
394 if ( nucleuses.size() == 2 )
398 sec_a_A = nucleuses[0]->GetMassNumber();
399 sec_b_Z = nucleuses[1]->GetAtomicNumber();
400 sec_b_A = nucleuses[1]->GetMassNumber();
402 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_Z == targ_Z && sec_b_A == targ_A )
403 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_Z == proj_Z && sec_b_A == proj_A ) )
405 elasticLike_system =
true;
409 else if ( nucleuses.size() == 1 )
412 sec_a_Z = nucleuses[0]->GetAtomicNumber();
413 sec_a_A = nucleuses[0]->GetMassNumber();
416 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_pd == targ_pd )
417 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_pd == proj_pd ) )
419 elasticLike_system =
true;
429 if ( ( sec_a_pd == proj_pd && sec_b_pd == targ_pd )
430 || ( sec_a_pd == targ_pd && sec_b_pd == proj_pd ) )
432 elasticLike_system =
true;
437 if ( elasticLike_system ==
true )
440 G4bool elasticLike_energy =
true;
442 for (
G4int i = 0 ; i < int ( nucleuses.size() ) ; i++ )
450 if ( nucleuses[i]->GetExcitationEnergy()*GeV > 1.0*MeV ) elasticLike_energy =
false;
455 G4bool withCollision =
true;
467 if ( elasticLike_energy ==
false ) elastic =
false;
469 if ( elasticLike_energy ==
false && withCollision ==
true ) elastic =
false;
486 if ( elastic ==
true )
489 for ( std::vector< G4QMDNucleus* >::iterator
490 it = nucleuses.begin() ; it != nucleuses.end() ; it++ )
502 for ( std::vector< G4QMDNucleus* >::iterator it
503 = nucleuses.begin() ; it != nucleuses.end() ; it++ )
524 if ( (*it)->GetAtomicNumber() == 0
525 || (*it)->GetAtomicNumber() == (*it)->GetMassNumber() )
528 for (
G4int i = 0 ; i < (*it)->GetTotalNumberOfParticipant() ; i++ )
530 G4QMDParticipant* aP =
new G4QMDParticipant( ( (*it)->GetParticipant( i ) )->GetDefinition() , ( (*it)->GetParticipant( i ) )->GetMomentum() , ( (*it)->GetParticipant( i ) )->GetPosition() );
537 G4LorentzVector nucleus_p4CM ( (*it)->Get4Momentum().vect() , nucleus_e );
541 G4int ia = (*it)->GetMassNumber();
542 G4int iz = (*it)->GetAtomicNumber();
549 rv = excitationHandler->
BreakItUp( *aFragment );
551 for ( G4ReactionProductVector::iterator itt
552 = rv->begin() ; itt != rv->end() ; itt++ )
559 G4LorentzVector p4 ( (*itt)->GetMomentum()/GeV , (*itt)->GetTotalEnergy()/GeV );
576 randomized_direction = randomized_direction.
unit();
625 if ( notBreak ==
true )
637 for ( G4ReactionProductVector::iterator itt
638 = rv->begin() ; itt != rv->end() ; itt++ )
670 for ( std::vector< G4QMDNucleus* >::iterator it
671 = nucleuses.begin() ; it != nucleuses.end() ; it++ )
696void G4QMDReaction::calcOffSetOfCollision(
G4double b ,
705 G4double stot = std::sqrt ( etot*etot - ptot*ptot );
707 G4double pstt = std::sqrt ( ( stot*stot - ( mass_proj + mass_targ ) * ( mass_proj + mass_targ )
708 ) * ( stot*stot - ( mass_proj - mass_targ ) * ( mass_proj - mass_targ ) ) )
712 G4double eccm = stot - ( mass_proj + mass_targ );
736 G4double rmax = std::sqrt( rmax0*rmax0 + b*b );
739 G4double pcca = 1.0 - double ( zp * zt ) * ccoul / eccm / rmax - ( b / rmax )*( b / rmax );
749 G4double aas = 2.0 * eccm * b / double ( zp * zt ) / ccoul;
750 bbs = 1.0 / std::sqrt ( 1.0 + aas*aas );
751 aas1 = ( 1.0 + aas * b / rmax ) * bbs;
758 if ( 1.0 - aas1*aas1 <= 0 || 1.0 - bbs*bbs <= 0.0 )
765 G4double aat1 = aas1 / std::sqrt ( 1.0 - aas1*aas1 );
766 G4double aat2 = bbs / std::sqrt ( 1.0 - bbs*bbs );
768 thet1 = std::atan ( aat1 );
769 thet2 = std::atan ( aat2 );
773 cost = std::cos( theta );
774 sint = std::sin( theta );
777 G4double rzpr = -rmax * cost * ( mass_targ ) / ( mass_proj + mass_targ );
778 G4double rzta = rmax * cost * ( mass_proj ) / ( mass_proj + mass_targ );
785 G4double pzpc = pzcc * ( cost * pccf + sint * b / rmax );
786 G4double pxpr = pzcc * ( -sint * pccf + cost * b / rmax );
791 G4double epc = std::sqrt ( pzpc*pzpc + pxpr*pxpr + mass_proj*mass_proj );
792 G4double etc = std::sqrt ( pztc*pztc + pxta*pxta + mass_targ*mass_targ );
803 pzpr = pzpc + betacm * gammacm * ( gammacm / ( 1. + gammacm ) * pzpc * betacm + epc );
804 pzta = pztc + betacm * gammacm * ( gammacm / ( 1. + gammacm ) * pztc * betacm + etc );
805 epr = gammacm * ( epc + betacm * pzpc );
806 eta = gammacm * ( etc + betacm * pztc );
811 G4double gammpr = epr / ( mass_proj );
812 G4double gammta = eta / ( mass_targ );
814 pzta = pzta / double ( at );
815 pxta = pxta / double ( at );
817 pzpr = pzpr / double ( ap );
818 pxpr = pxpr / double ( ap );
826 coulomb_collision_gamma_proj = gammpr;
827 coulomb_collision_rx_proj = rxpr;
828 coulomb_collision_rz_proj = rzpr;
829 coulomb_collision_px_proj = pxpr;
830 coulomb_collision_pz_proj = pzpr;
832 coulomb_collision_gamma_targ = gammta;
833 coulomb_collision_rx_targ = rxta;
834 coulomb_collision_rz_targ = rzta;
835 coulomb_collision_px_targ = pxta;
836 coulomb_collision_pz_targ = pzta;
842void G4QMDReaction::setEvaporationCh()
854 outFile <<
"Lorentz covarianted Quantum Molecular Dynamics model for nucleus (particle) vs nucleus reactions\n";
std::vector< G4ReactionProduct * > G4ReactionProductVector
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cout
Hep3Vector findBoostToCM() const
G4double GetElementCrossSection(const G4DynamicParticle *, G4int Z, const G4Material *mat) final
void BuildPhysicsTable(const G4ParticleDefinition &) final
void BuildPhysicsTable(const G4ParticleDefinition &) final
G4double GetElementCrossSection(const G4DynamicParticle *, G4int Z, const G4Material *mat) final
G4ParticleDefinition * GetDefinition() const
G4LorentzVector Get4Momentum() const
G4ThreeVector GetMomentum() const
void SetEvaporation(G4VEvaporation *ptr, G4bool isLocal=false)
G4ReactionProductVector * BreakItUp(const G4Fragment &theInitialState)
void SetDeexChannelsType(G4DeexChannelType val)
void SetStatusChange(G4HadFinalStateStatus aS)
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
std::size_t GetNumberOfSecondaries() const
G4HadSecondary * GetSecondary(size_t i)
const G4Material * GetMaterial() const
G4double GetTotalMomentum() const
const G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
const G4LorentzVector & Get4Momentum() const
void SetCreatorModelID(G4int id)
G4HadFinalState theParticleChange
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
static G4IonTable * GetIonTable()
G4double GetIonMass(G4int Z, G4int A, G4int nL=0, G4int lvl=0) const
G4int GetAtomicNumber() const
const G4String & GetParticleType() const
G4double GetPDGMass() const
G4int GetAtomicMass() const
G4double GetPDGCharge() const
const G4String & GetParticleName() const
static G4int GetModelID(const G4int modelIndex)
static G4PionMinus * PionMinus()
static G4PionPlus * PionPlus()
static G4Pow * GetInstance()
G4double powN(G4double x, G4int n) const
void SetMeanField(G4QMDMeanField *meanfield)
void CalKinematicsOfBinaryCollisions(G4double)
G4double GetTotalPotential()
void SetNucleus(G4QMDNucleus *aSystem)
void DoPropagation(G4double)
std::vector< G4QMDNucleus * > DoClusterJudgment()
void SetSystem(G4QMDSystem *aSystem)
void SetTotalPotential(G4double x)
void CalEnergyAndAngularMomentumInCM()
G4ThreeVector GetPosition()
const G4ParticleDefinition * GetDefinition()
G4LorentzVector Get4Momentum()
G4ThreeVector GetMomentum()
G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
virtual void ModelDescription(std::ostream &outFile) const
G4QMDParticipant * GetParticipant(G4int i)
G4int GetTotalNumberOfParticipant()
void SetParticipant(G4QMDParticipant *particle)
virtual G4double GetElementCrossSection(const G4DynamicParticle *, G4int Z, const G4Material *mat=nullptr)
HepLorentzVector boostOf(const HepLorentzVector &vec, const Hep3Vector &betaVector)