#include <G4CascadeRecoilMaker.hh>
Inheritance diagram for G4CascadeRecoilMaker:
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) |
G4InuclNuclei * | makeRecoilNuclei (G4InuclParticle::Model model=G4InuclParticle::DefaultModel) |
G4Fragment * | makeRecoilFragment () |
void | addExcitonConfiguration (const G4ExitonConfiguration exciton) |
G4int | getRecoilA () const |
G4int | getRecoilZ () const |
G4double | getRecoilExcitation () const |
const G4LorentzVector & | getRecoilMomentum () const |
G4bool | goodFragment () const |
G4bool | goodRecoil () const |
G4bool | wholeEvent () const |
G4bool | unphysicalRecoil () const |
G4bool | goodNucleus () const |
Protected Member Functions | |
void | fillRecoil () |
G4double | deltaM () const |
Definition at line 64 of file G4CascadeRecoilMaker.hh.
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] |
void G4CascadeRecoilMaker::addExcitonConfiguration | ( | const G4ExitonConfiguration | exciton | ) | [inline] |
Definition at line 88 of file G4CascadeRecoilMaker.hh.
Referenced by G4IntraNucleiCascader::finishCascade().
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().
G4double G4CascadeRecoilMaker::getRecoilExcitation | ( | ) | const [inline] |
Definition at line 95 of file G4CascadeRecoilMaker.hh.
Referenced by G4IntraNucleiCascader::finishCascade().
const G4LorentzVector& G4CascadeRecoilMaker::getRecoilMomentum | ( | ) | const [inline] |
Definition at line 96 of file G4CascadeRecoilMaker.hh.
Referenced by G4IntraNucleiCascader::finishCascade().
G4int G4CascadeRecoilMaker::getRecoilZ | ( | ) | const [inline] |
Definition at line 94 of file G4CascadeRecoilMaker.hh.
Referenced by G4IntraNucleiCascader::finishCascade().
G4bool G4CascadeRecoilMaker::goodFragment | ( | ) | const |
Definition at line 209 of file G4CascadeRecoilMaker.cc.
Referenced by fillRecoil(), G4IntraNucleiCascader::finishCascade(), goodNucleus(), and goodRecoil().
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().
void G4CascadeRecoilMaker::setTolerance | ( | G4double | tolerance | ) | [inline] |
Definition at line 79 of file G4CascadeRecoilMaker.hh.
Referenced by G4IntraNucleiCascader::initialize().
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 }