Geant4  10.03.p03
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4CascadeRecoilMaker Class Reference

#include <G4CascadeRecoilMaker.hh>

Inheritance diagram for G4CascadeRecoilMaker:
Collaboration 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
 
- Public Member Functions inherited from G4VCascadeCollider
 G4VCascadeCollider (const G4String &name, G4int verbose=0)
 
virtual ~G4VCascadeCollider ()
 
virtual void setVerboseLevel (G4int verbose=0)
 

Protected Member Functions

void fillRecoil ()
 
G4double deltaM () const
 
- Protected Member Functions inherited from G4VCascadeCollider
virtual void setName (const G4String &name)
 

Additional Inherited Members

- Protected Attributes inherited from G4VCascadeCollider
G4String theName
 
G4int verboseLevel
 

Detailed Description

Definition at line 65 of file G4CascadeRecoilMaker.hh.

Constructor & Destructor Documentation

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

Definition at line 67 of file G4CascadeRecoilMaker.cc.

68  : G4VCascadeCollider("G4CascadeRecoilMaker"),
69  excTolerance(tolerance), inputEkin(0.),
70  recoilA(0), recoilZ(0), excitationEnergy(0.) {
71  balance = new G4CascadeCheckBalance(tolerance, tolerance, theName);
72 }
G4VCascadeCollider(const G4String &name, G4int verbose=0)
G4CascadeRecoilMaker::~G4CascadeRecoilMaker ( )
virtual

Definition at line 74 of file G4CascadeRecoilMaker.cc.

74  {
75  delete balance;
76 }

Member Function Documentation

void G4CascadeRecoilMaker::addExcitonConfiguration ( const G4ExitonConfiguration  exciton)
inline

Definition at line 89 of file G4CascadeRecoilMaker.hh.

89  {
90  theExcitons = exciton;
91  }

Here is the caller graph for this function:

void G4CascadeRecoilMaker::collide ( G4InuclParticle *  bullet,
G4InuclParticle *  target,
G4CollisionOutput &  output 
)
virtual

Implements G4VCascadeCollider.

Definition at line 81 of file G4CascadeRecoilMaker.cc.

83  {
84  if (verboseLevel > 1)
85  G4cout << " >>> G4CascadeRecoilMaker::collide" << G4endl;
86 
87  // Available energy needed for "goodNucleus()" test at end
88  inputEkin = bullet ? bullet->getKineticEnergy() : 0.;
89 
90  balance->setVerboseLevel(verboseLevel);
91  balance->collide(bullet, target, output);
92  fillRecoil();
93 }
void collide(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
virtual void setVerboseLevel(G4int verbose=0)
G4double getKineticEnergy() const
G4GLOB_DLL std::ostream G4cout
#define G4endl
Definition: G4ios.hh:61

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 97 of file G4CascadeRecoilMaker.cc.

100  {
101  if (verboseLevel > 1)
102  G4cout << " >>> G4CascadeRecoilMaker::collide(<EP>,<CP>)" << G4endl;
103 
104  // Available energy needed for "goodNucleus()" test at end
105  inputEkin = bullet ? bullet->getKineticEnergy() : 0.;
106 
107  balance->setVerboseLevel(verboseLevel);
108  balance->collide(bullet, target, output, cparticles);
109  fillRecoil();
110 }
void collide(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
virtual void setVerboseLevel(G4int verbose=0)
G4double getKineticEnergy() const
G4GLOB_DLL std::ostream G4cout
#define G4endl
Definition: G4ios.hh:61

Here is the call graph for this function:

G4double G4CascadeRecoilMaker::deltaM ( ) const
protected

Definition at line 201 of file G4CascadeRecoilMaker.cc.

201  {
202  G4double nucMass = G4InuclNuclei::getNucleiMass(recoilA,recoilZ);
203  return (recoilMomentum.m() - nucMass);
204 }
G4double getNucleiMass() const
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

void G4CascadeRecoilMaker::fillRecoil ( )
protected

Definition at line 116 of file G4CascadeRecoilMaker.cc.

116  {
117  recoilZ = -(balance->deltaQ()); // Charge "non-conservation"
118  recoilA = -(balance->deltaB()); // Baryon "non-conservation"
119  recoilMomentum = -(balance->deltaLV());
120 
121  theExcitons.clear(); // Discard previous exciton configuraiton
122 
123  // Bertini uses MeV for excitation energy
124  if (!goodFragment()) excitationEnergy = 0.;
125  else excitationEnergy = deltaM() * GeV;
126 
127  // Allow for very small negative mass difference, and round to zero
128  if (std::abs(excitationEnergy) < excTolerance) excitationEnergy = 0.;
129 
130  if (verboseLevel > 2) {
131  G4cout << " recoil px " << recoilMomentum.px()
132  << " py " << recoilMomentum.py() << " pz " << recoilMomentum.pz()
133  << " E " << recoilMomentum.e() << " baryon " << recoilA
134  << " charge " << recoilZ
135  << "\n recoil mass " << recoilMomentum.m()
136  << " 'excitation' energy " << excitationEnergy << G4endl;
137  }
138 }
G4LorentzVector deltaLV() const
G4GLOB_DLL std::ostream G4cout
double py() const
double px() const
static constexpr double GeV
Definition: G4SIunits.hh:217
double pz() const
#define G4endl
Definition: G4ios.hh:61

Here is the call graph for this function:

Here is the caller graph for this function:

G4int G4CascadeRecoilMaker::getRecoilA ( ) const
inline

Definition at line 94 of file G4CascadeRecoilMaker.hh.

94 { return recoilA; }

Here is the caller graph for this function:

G4double G4CascadeRecoilMaker::getRecoilExcitation ( ) const
inline

Definition at line 96 of file G4CascadeRecoilMaker.hh.

96 { return excitationEnergy; }

Here is the caller graph for this function:

const G4LorentzVector& G4CascadeRecoilMaker::getRecoilMomentum ( ) const
inline

Definition at line 97 of file G4CascadeRecoilMaker.hh.

97 { return recoilMomentum; }

Here is the caller graph for this function:

G4int G4CascadeRecoilMaker::getRecoilZ ( ) const
inline

Definition at line 95 of file G4CascadeRecoilMaker.hh.

95 { return recoilZ; }

Here is the caller graph for this function:

G4bool G4CascadeRecoilMaker::goodFragment ( ) const

Definition at line 209 of file G4CascadeRecoilMaker.cc.

209  {
210  return (recoilA>0 && recoilZ>=0 && recoilA >= recoilZ);
211 }

Here is the caller graph for this function:

G4bool G4CascadeRecoilMaker::goodNucleus ( ) const

Definition at line 235 of file G4CascadeRecoilMaker.cc.

235  {
236  if (verboseLevel > 2) {
237  G4cout << " >>> G4CascadeRecoilMaker::goodNucleus" << G4endl;
238  }
239 
240  const G4double minExcitation = 0.1*keV;
241  const G4double reasonableExcitation = 7.0; // Multiple of binding energy
242  const G4double fractionalExcitation = 0.2; // Fraction of input to excite
243 
244  if (!goodRecoil()) {
245  if (verboseLevel>2) {
246  if (!goodFragment()) G4cerr << " goodNucleus: invalid A/Z" << G4endl;
247  else if (excitationEnergy < -excTolerance)
248  G4cerr << " goodNucleus: negative excitation" << G4endl;
249  }
250  return false; // Not a sensible nucleus
251  }
252 
253  if (excitationEnergy <= minExcitation) return true; // Effectively zero
254 
255  // Maximum possible excitation energy determined by initial energy
256  G4double dm = bindingEnergy(recoilA,recoilZ);
257  G4double exc_max0z = fractionalExcitation * inputEkin*GeV;
258  G4double exc_dm = reasonableExcitation * dm;
259  G4double exc_max = (exc_max0z > exc_dm) ? exc_max0z : exc_dm;
260 
261  if (verboseLevel > 3) {
262  G4cout << " eexs " << excitationEnergy << " max " << exc_max
263  << " dm " << dm << G4endl;
264  }
265 
266  if (verboseLevel > 2 && excitationEnergy >= exc_max)
267  G4cerr << " goodNucleus: too much excitation" << G4endl;
268 
269  return (excitationEnergy < exc_max); // Below maximum possible
270 }
G4GLOB_DLL std::ostream G4cout
static constexpr double GeV
Definition: G4SIunits.hh:217
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
G4double bindingEnergy(G4int A, G4int Z)
static constexpr double keV
Definition: G4SIunits.hh:216
G4GLOB_DLL std::ostream G4cerr

Here is the call graph for this function:

Here is the caller graph for this function:

G4bool G4CascadeRecoilMaker::goodRecoil ( ) const

Definition at line 213 of file G4CascadeRecoilMaker.cc.

213  {
214  return (goodFragment() && excitationEnergy > -excTolerance);
215 }

Here is the call graph for this function:

Here is the caller graph for this function:

G4Fragment * G4CascadeRecoilMaker::makeRecoilFragment ( )

Definition at line 165 of file G4CascadeRecoilMaker.cc.

165  {
166  if (verboseLevel > 1)
167  G4cout << " >>> G4CascadeRecoilMaker::makeRecoilFragment" << G4endl;
168 
169  if (!goodRecoil()) {
170  if (verboseLevel > 2 && !wholeEvent())
171  G4cout << theName << ": event recoil is not a physical nucleus" << G4endl;
172 
173  return 0; // Null pointer means no fragment
174  }
175 
176  theRecoilFragment.SetZandA_asInt(recoilZ, recoilA); // Note convention!
177 
178  // User may have overridden excitation energy; force four-momentum to match
179  G4double fragMass =
180  G4InuclNuclei::getNucleiMass(recoilA,recoilZ) + excitationEnergy/GeV;
181 
182  G4LorentzVector fragMom; fragMom.setVectM(recoilMomentum.vect(), fragMass);
183  theRecoilFragment.SetMomentum(fragMom*GeV); // Bertini uses GeV!
184 
185  // Note: exciton configuration has to be set piece by piece
186  // (arguments are Ntotal,Nproton in both cases)
187  G4int nholes = theExcitons.protonHoles+theExcitons.neutronHoles;
188  theRecoilFragment.SetNumberOfHoles(nholes, theExcitons.protonHoles);
189 
190  G4int nexcit = (theExcitons.protonQuasiParticles
191  + theExcitons.neutronQuasiParticles);
192  theRecoilFragment.SetNumberOfExcitedParticle(nexcit,
193  theExcitons.protonQuasiParticles);
194 
195  return &theRecoilFragment;
196 }
void SetNumberOfHoles(G4int valueTot, G4int valueP=0)
Definition: G4Fragment.hh:375
int G4int
Definition: G4Types.hh:78
void setVectM(const Hep3Vector &spatial, double mass)
void SetNumberOfExcitedParticle(G4int valueTot, G4int valueP)
Definition: G4Fragment.hh:356
Hep3Vector vect() const
G4GLOB_DLL std::ostream G4cout
void SetMomentum(const G4LorentzVector &value)
Definition: G4Fragment.hh:312
G4double getNucleiMass() const
void SetZandA_asInt(G4int Znew, G4int Anew)
Definition: G4Fragment.hh:276
static constexpr double GeV
Definition: G4SIunits.hh:217
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 144 of file G4CascadeRecoilMaker.cc.

144  {
145  if (verboseLevel > 1)
146  G4cout << " >>> G4CascadeRecoilMaker::makeRecoilNuclei" << G4endl;
147 
148  if (!goodRecoil()) {
149  if (verboseLevel > 2 && !wholeEvent())
150  G4cout << theName << ": event recoil is not a physical nucleus" << G4endl;
151 
152  return 0; // Null pointer means no fragment
153  }
154 
155  theRecoilNuclei.fill(recoilMomentum, recoilA, recoilZ,
156  excitationEnergy, model);
157  theRecoilNuclei.setExitonConfiguration(theExcitons);
158 
159  return &theRecoilNuclei;
160 }
void fill(G4int a, G4int z, G4double exc=0., Model model=DefaultModel)
G4GLOB_DLL std::ostream G4cout
void setExitonConfiguration(const G4ExitonConfiguration &config)
#define G4endl
Definition: G4ios.hh:61
const XML_Char XML_Content * model
Definition: expat.h:151

Here is the call graph for this function:

void G4CascadeRecoilMaker::setRecoilExcitation ( G4double  Eexc)
inline

Definition at line 82 of file G4CascadeRecoilMaker.hh.

82 { excitationEnergy = Eexc; }

Here is the caller graph for this function:

void G4CascadeRecoilMaker::setTolerance ( G4double  tolerance)
inline

Definition at line 80 of file G4CascadeRecoilMaker.hh.

80 { excTolerance = tolerance; }

Here is the caller graph for this function:

G4bool G4CascadeRecoilMaker::unphysicalRecoil ( ) const
inline

Definition at line 103 of file G4CascadeRecoilMaker.hh.

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

Here is the call graph for this function:

G4bool G4CascadeRecoilMaker::wholeEvent ( ) const

Definition at line 217 of file G4CascadeRecoilMaker.cc.

217  {
218  if (verboseLevel > 2) {
219  G4cout << " >>> G4CascadeRecoilMaker::wholeEvent:"
220  << " A " << recoilA << " Z " << recoilZ
221  << " P " << recoilMomentum.rho() << " E " << recoilMomentum.e()
222  << "\n wholeEvent returns "
223  << (recoilA==0 && recoilZ==0 &&
224  recoilMomentum.rho() < excTolerance/GeV &&
225  std::abs(recoilMomentum.e()) < excTolerance/GeV) << G4endl;
226  }
227 
228  return (recoilA==0 && recoilZ==0 &&
229  recoilMomentum.rho() < excTolerance/GeV &&
230  std::abs(recoilMomentum.e()) < excTolerance/GeV);
231 }
G4GLOB_DLL std::ostream G4cout
double rho() const
static constexpr double GeV
Definition: G4SIunits.hh:217
#define G4endl
Definition: G4ios.hh:61

Here is the call graph for this function:

Here is the caller graph for this function:


The documentation for this class was generated from the following files: