G4CascadeRecoilMaker Class Reference

#include <G4CascadeRecoilMaker.hh>

Inheritance diagram for G4CascadeRecoilMaker:

G4VCascadeCollider

Public Member Functions

 G4CascadeRecoilMaker (G4double tolerance=0.001 *CLHEP::MeV)
virtual ~G4CascadeRecoilMaker ()
void collide (G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
void collide (G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output, const std::vector< G4CascadParticle > &cparticles)
void setTolerance (G4double tolerance)
void setRecoilExcitation (G4double Eexc)
G4InuclNucleimakeRecoilNuclei (G4InuclParticle::Model model=G4InuclParticle::DefaultModel)
G4FragmentmakeRecoilFragment ()
void addExcitonConfiguration (const G4ExitonConfiguration exciton)
G4int getRecoilA () const
G4int getRecoilZ () const
G4double getRecoilExcitation () const
const G4LorentzVectorgetRecoilMomentum () const
G4bool goodFragment () const
G4bool goodRecoil () const
G4bool wholeEvent () const
G4bool unphysicalRecoil () const
G4bool goodNucleus () const

Protected Member Functions

void fillRecoil ()
G4double deltaM () const

Detailed Description

Definition at line 64 of file G4CascadeRecoilMaker.hh.


Constructor & Destructor Documentation

G4CascadeRecoilMaker::G4CascadeRecoilMaker ( G4double  tolerance = 0.001 *CLHEP::MeV  )  [explicit]

Definition at line 67 of file G4CascadeRecoilMaker.cc.

References G4VCascadeCollider::theName.

00068   : G4VCascadeCollider("G4CascadeRecoilMaker"),
00069     excTolerance(tolerance), inputEkin(0.),
00070     recoilA(0), recoilZ(0), excitationEnergy(0.) {
00071   balance = new G4CascadeCheckBalance(tolerance, tolerance, theName);
00072 }

G4CascadeRecoilMaker::~G4CascadeRecoilMaker (  )  [virtual]

Definition at line 74 of file G4CascadeRecoilMaker.cc.

00074                                             {
00075   delete balance;
00076 }


Member Function Documentation

void G4CascadeRecoilMaker::addExcitonConfiguration ( const G4ExitonConfiguration  exciton  )  [inline]

Definition at line 88 of file G4CascadeRecoilMaker.hh.

Referenced by G4IntraNucleiCascader::finishCascade().

00088                                                                     {
00089     theExcitons = exciton;
00090   }

void G4CascadeRecoilMaker::collide ( G4InuclParticle bullet,
G4InuclParticle target,
G4CollisionOutput output,
const std::vector< G4CascadParticle > &  cparticles 
)

Definition at line 97 of file G4CascadeRecoilMaker.cc.

References G4CascadeCheckBalance::collide(), fillRecoil(), G4cout, G4endl, G4InuclParticle::getKineticEnergy(), G4VCascadeCollider::setVerboseLevel(), and G4VCascadeCollider::verboseLevel.

00100                                                             {
00101   if (verboseLevel > 1)
00102     G4cout << " >>> G4CascadeRecoilMaker::collide(<EP>,<CP>)" << G4endl;
00103 
00104   // Available energy needed for "goodNucleus()" test at end
00105   inputEkin = bullet ? bullet->getKineticEnergy() : 0.;
00106 
00107   balance->setVerboseLevel(verboseLevel);
00108   balance->collide(bullet, target, output, cparticles);
00109   fillRecoil();
00110 }

void G4CascadeRecoilMaker::collide ( G4InuclParticle bullet,
G4InuclParticle target,
G4CollisionOutput output 
) [virtual]

Implements G4VCascadeCollider.

Definition at line 81 of file G4CascadeRecoilMaker.cc.

References G4CascadeCheckBalance::collide(), fillRecoil(), G4cout, G4endl, G4InuclParticle::getKineticEnergy(), G4VCascadeCollider::setVerboseLevel(), and G4VCascadeCollider::verboseLevel.

Referenced by G4IntraNucleiCascader::finishCascade(), and G4IntraNucleiCascader::generateCascade().

00083                                                                {
00084   if (verboseLevel > 1)
00085     G4cout << " >>> G4CascadeRecoilMaker::collide" << G4endl;
00086 
00087   // Available energy needed for "goodNucleus()" test at end
00088   inputEkin = bullet ? bullet->getKineticEnergy() : 0.;
00089 
00090   balance->setVerboseLevel(verboseLevel);
00091   balance->collide(bullet, target, output);
00092   fillRecoil();
00093 }

G4double G4CascadeRecoilMaker::deltaM (  )  const [protected]

Definition at line 201 of file G4CascadeRecoilMaker.cc.

References G4InuclNuclei::getNucleiMass().

Referenced by fillRecoil().

00201                                             {
00202   G4double nucMass = G4InuclNuclei::getNucleiMass(recoilA,recoilZ);
00203   return (recoilMomentum.m() - nucMass);
00204 }

void G4CascadeRecoilMaker::fillRecoil (  )  [protected]

Definition at line 116 of file G4CascadeRecoilMaker.cc.

References G4ExitonConfiguration::clear(), G4CascadeCheckBalance::deltaB(), G4CascadeCheckBalance::deltaLV(), deltaM(), G4CascadeCheckBalance::deltaQ(), G4cout, G4endl, goodFragment(), and G4VCascadeCollider::verboseLevel.

Referenced by collide().

00116                                       {
00117   recoilZ = -(balance->deltaQ());               // Charge "non-conservation"
00118   recoilA = -(balance->deltaB());               // Baryon "non-conservation"
00119   recoilMomentum = -(balance->deltaLV());
00120 
00121   theExcitons.clear();          // Discard previous exciton configuraiton
00122 
00123   // Bertini uses MeV for excitation energy
00124   if (!goodFragment()) excitationEnergy = 0.;
00125   else excitationEnergy = deltaM() * GeV;
00126 
00127   // Allow for very small negative mass difference, and round to zero
00128   if (std::abs(excitationEnergy) < excTolerance) excitationEnergy = 0.;
00129 
00130   if (verboseLevel > 2) {
00131     G4cout << "  recoil px " << recoilMomentum.px()
00132            << " py " << recoilMomentum.py() << " pz " << recoilMomentum.pz()
00133            << " E " << recoilMomentum.e() << " baryon " << recoilA
00134            << " charge " << recoilZ
00135            << "\n  recoil mass " << recoilMomentum.m()
00136            << " 'excitation' energy " << excitationEnergy << G4endl;
00137   }
00138 }

G4int G4CascadeRecoilMaker::getRecoilA (  )  const [inline]

Definition at line 93 of file G4CascadeRecoilMaker.hh.

Referenced by G4IntraNucleiCascader::finishCascade(), and G4IntraNucleiCascader::generateCascade().

00093 { return recoilA; }

G4double G4CascadeRecoilMaker::getRecoilExcitation (  )  const [inline]

Definition at line 95 of file G4CascadeRecoilMaker.hh.

Referenced by G4IntraNucleiCascader::finishCascade().

00095 { return excitationEnergy; }

const G4LorentzVector& G4CascadeRecoilMaker::getRecoilMomentum (  )  const [inline]

Definition at line 96 of file G4CascadeRecoilMaker.hh.

Referenced by G4IntraNucleiCascader::finishCascade().

00096 { return recoilMomentum; }

G4int G4CascadeRecoilMaker::getRecoilZ (  )  const [inline]

Definition at line 94 of file G4CascadeRecoilMaker.hh.

Referenced by G4IntraNucleiCascader::finishCascade().

00094 { return recoilZ; }

G4bool G4CascadeRecoilMaker::goodFragment (  )  const

Definition at line 209 of file G4CascadeRecoilMaker.cc.

Referenced by fillRecoil(), G4IntraNucleiCascader::finishCascade(), goodNucleus(), and goodRecoil().

00209                                                 {
00210   return (recoilA>0 && recoilZ>=0 && recoilA >= recoilZ);
00211 }

G4bool G4CascadeRecoilMaker::goodNucleus (  )  const

Definition at line 235 of file G4CascadeRecoilMaker.cc.

References G4InuclSpecialFunctions::bindingEnergy(), G4cerr, G4cout, G4endl, goodFragment(), goodRecoil(), and G4VCascadeCollider::verboseLevel.

Referenced by G4IntraNucleiCascader::finishCascade().

00235                                                {
00236   if (verboseLevel > 2) {
00237     G4cout << " >>> G4CascadeRecoilMaker::goodNucleus" << G4endl;
00238   }
00239 
00240   const G4double minExcitation = 0.1*keV;
00241   const G4double reasonableExcitation = 7.0;    // Multiple of binding energy
00242   const G4double fractionalExcitation = 0.2;    // Fraction of input to excite
00243 
00244   if (!goodRecoil()) {
00245     if (verboseLevel>2) {
00246       if (!goodFragment()) G4cerr << " goodNucleus: invalid A/Z" << G4endl;
00247       else if (excitationEnergy < -excTolerance) 
00248         G4cerr << " goodNucleus: negative excitation" << G4endl;
00249     }
00250     return false;                               // Not a sensible nucleus
00251   }
00252 
00253   if (excitationEnergy <= minExcitation) return true;   // Effectively zero
00254 
00255   // Maximum possible excitation energy determined by initial energy
00256   G4double dm = bindingEnergy(recoilA,recoilZ);
00257   G4double exc_max0z = fractionalExcitation * inputEkin*GeV;
00258   G4double exc_dm    = reasonableExcitation * dm;
00259   G4double exc_max = (exc_max0z > exc_dm) ? exc_max0z : exc_dm;
00260   
00261   if (verboseLevel > 3) {
00262     G4cout << " eexs " << excitationEnergy << " max " << exc_max
00263            << " dm " << dm << G4endl;
00264   }
00265 
00266   if (verboseLevel > 2 && excitationEnergy >= exc_max)
00267     G4cerr << " goodNucleus: too much excitation" << G4endl;
00268 
00269   return (excitationEnergy < exc_max);          // Below maximum possible
00270 }

G4bool G4CascadeRecoilMaker::goodRecoil (  )  const

Definition at line 213 of file G4CascadeRecoilMaker.cc.

References goodFragment().

Referenced by goodNucleus(), makeRecoilFragment(), makeRecoilNuclei(), and unphysicalRecoil().

00213                                               {
00214   return (goodFragment() && excitationEnergy > -excTolerance);
00215 }

G4Fragment * G4CascadeRecoilMaker::makeRecoilFragment (  ) 

Definition at line 165 of file G4CascadeRecoilMaker.cc.

References G4cout, G4endl, G4InuclNuclei::getNucleiMass(), goodRecoil(), G4ExitonConfiguration::neutronHoles, G4ExitonConfiguration::neutronQuasiParticles, G4ExitonConfiguration::protonHoles, G4ExitonConfiguration::protonQuasiParticles, G4Fragment::SetMomentum(), G4Fragment::SetNumberOfExcitedParticle(), G4Fragment::SetNumberOfHoles(), G4Fragment::SetZandA_asInt(), G4VCascadeCollider::theName, G4VCascadeCollider::verboseLevel, and wholeEvent().

Referenced by G4IntraNucleiCascader::finishCascade().

00165                                                      {
00166   if (verboseLevel > 1) 
00167     G4cout << " >>> G4CascadeRecoilMaker::makeRecoilFragment" << G4endl;
00168 
00169   if (!goodRecoil()) {
00170     if (verboseLevel > 2 && !wholeEvent())
00171       G4cout << theName << ": event recoil is not a physical nucleus" << G4endl;
00172 
00173     return 0;           // Null pointer means no fragment
00174   }
00175 
00176   theRecoilFragment.SetZandA_asInt(recoilZ, recoilA);   // Note convention!
00177 
00178   // User may have overridden excitation energy; force four-momentum to match
00179   G4double fragMass = 
00180     G4InuclNuclei::getNucleiMass(recoilA,recoilZ) + excitationEnergy/GeV;
00181 
00182   G4LorentzVector fragMom; fragMom.setVectM(recoilMomentum.vect(), fragMass);
00183   theRecoilFragment.SetMomentum(fragMom*GeV);   // Bertini uses GeV!
00184 
00185   // Note:  exciton configuration has to be set piece by piece
00186   //            (arguments are Ntotal,Nproton in both cases)
00187   G4int nholes = theExcitons.protonHoles+theExcitons.neutronHoles;
00188   theRecoilFragment.SetNumberOfHoles(nholes, theExcitons.protonHoles);
00189 
00190   G4int nexcit = (theExcitons.protonQuasiParticles
00191                   + theExcitons.neutronQuasiParticles);
00192   theRecoilFragment.SetNumberOfExcitedParticle(nexcit,
00193                                     theExcitons.protonQuasiParticles);
00194 
00195   return &theRecoilFragment;
00196 }

G4InuclNuclei * G4CascadeRecoilMaker::makeRecoilNuclei ( G4InuclParticle::Model  model = G4InuclParticle::DefaultModel  ) 

Definition at line 144 of file G4CascadeRecoilMaker.cc.

References G4InuclNuclei::fill(), G4cout, G4endl, goodRecoil(), G4InuclNuclei::setExitonConfiguration(), G4VCascadeCollider::theName, G4VCascadeCollider::verboseLevel, and wholeEvent().

00144                                                                  {
00145   if (verboseLevel > 1) 
00146     G4cout << " >>> G4CascadeRecoilMaker::makeRecoilNuclei" << G4endl;
00147 
00148   if (!goodRecoil()) {
00149     if (verboseLevel > 2 && !wholeEvent())
00150       G4cout << theName << ": event recoil is not a physical nucleus" << G4endl;
00151 
00152     return 0;           // Null pointer means no fragment
00153   }
00154 
00155   theRecoilNuclei.fill(recoilMomentum, recoilA, recoilZ,
00156                        excitationEnergy, model);
00157   theRecoilNuclei.setExitonConfiguration(theExcitons);
00158 
00159   return &theRecoilNuclei;
00160 }

void G4CascadeRecoilMaker::setRecoilExcitation ( G4double  Eexc  )  [inline]

Definition at line 81 of file G4CascadeRecoilMaker.hh.

Referenced by G4IntraNucleiCascader::finishCascade().

00081 { excitationEnergy = Eexc; }

void G4CascadeRecoilMaker::setTolerance ( G4double  tolerance  )  [inline]

Definition at line 79 of file G4CascadeRecoilMaker.hh.

Referenced by G4IntraNucleiCascader::initialize().

00079 { excTolerance = tolerance; }

G4bool G4CascadeRecoilMaker::unphysicalRecoil (  )  const [inline]

Definition at line 102 of file G4CascadeRecoilMaker.hh.

References goodRecoil(), and wholeEvent().

00102 { return !wholeEvent() && !goodRecoil(); }

G4bool G4CascadeRecoilMaker::wholeEvent (  )  const

Definition at line 217 of file G4CascadeRecoilMaker.cc.

References G4cout, G4endl, and G4VCascadeCollider::verboseLevel.

Referenced by G4IntraNucleiCascader::finishCascade(), makeRecoilFragment(), makeRecoilNuclei(), and unphysicalRecoil().

00217                                               {
00218   if (verboseLevel > 2) {
00219     G4cout << " >>> G4CascadeRecoilMaker::wholeEvent:"
00220            << " A " << recoilA << " Z " << recoilZ
00221            << " P " << recoilMomentum.rho() << " E " << recoilMomentum.e()
00222            << "\n wholeEvent returns "
00223            << (recoilA==0 && recoilZ==0 && 
00224                recoilMomentum.rho() < excTolerance/GeV &&
00225                std::abs(recoilMomentum.e()) < excTolerance/GeV) << G4endl;
00226   }
00227 
00228   return (recoilA==0 && recoilZ==0 && 
00229           recoilMomentum.rho() < excTolerance/GeV &&
00230           std::abs(recoilMomentum.e()) < excTolerance/GeV);
00231 }


The documentation for this class was generated from the following files:
Generated on Mon May 27 17:51:36 2013 for Geant4 by  doxygen 1.4.7