Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4EMDissociation Class Reference

#include <G4EMDissociation.hh>

Inheritance diagram for G4EMDissociation:

Public Member Functions

 G4EMDissociation ()
 G4EMDissociation (G4ExcitationHandler *)
 ~G4EMDissociation ()
 G4EMDissociation (const G4EMDissociation &emd)=delete
const G4EMDissociationoperator= (G4EMDissociation &right)=delete
virtual G4HadFinalStateApplyYourself (const G4HadProjectile &, G4Nucleus &)
Public Member Functions inherited from G4HadronicInteraction
 G4HadronicInteraction (const G4String &modelName="HadronicModel")
virtual ~G4HadronicInteraction ()
virtual G4double SampleInvariantT (const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)
virtual G4bool IsApplicable (const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
G4double GetMinEnergy () const
G4double GetMinEnergy (const G4Material *aMaterial, const G4Element *anElement) const
void SetMinEnergy (G4double anEnergy)
void SetMinEnergy (G4double anEnergy, const G4Element *anElement)
void SetMinEnergy (G4double anEnergy, const G4Material *aMaterial)
G4double GetMaxEnergy () const
G4double GetMaxEnergy (const G4Material *aMaterial, const G4Element *anElement) const
void SetMaxEnergy (const G4double anEnergy)
void SetMaxEnergy (G4double anEnergy, const G4Element *anElement)
void SetMaxEnergy (G4double anEnergy, const G4Material *aMaterial)
G4int GetVerboseLevel () const
void SetVerboseLevel (G4int value)
const G4StringGetModelName () const
void DeActivateFor (const G4Material *aMaterial)
void ActivateFor (const G4Material *aMaterial)
void DeActivateFor (const G4Element *anElement)
void ActivateFor (const G4Element *anElement)
G4bool IsBlocked (const G4Material *aMaterial) const
G4bool IsBlocked (const G4Element *anElement) const
void SetRecoilEnergyThreshold (G4double val)
G4double GetRecoilEnergyThreshold () const
virtual const std::pair< G4double, G4doubleGetFatalEnergyCheckLevels () const
virtual std::pair< G4double, G4doubleGetEnergyMomentumCheckLevels () const
void SetEnergyMomentumCheckLevels (G4double relativeLevel, G4double absoluteLevel)
virtual void ModelDescription (std::ostream &outFile) const
virtual void BuildPhysicsTable (const G4ParticleDefinition &)
virtual void InitialiseModel ()
 G4HadronicInteraction (const G4HadronicInteraction &right)=delete
const G4HadronicInteractionoperator= (const G4HadronicInteraction &right)=delete
G4bool operator== (const G4HadronicInteraction &right) const =delete
G4bool operator!= (const G4HadronicInteraction &right) const =delete

Additional Inherited Members

Protected Member Functions inherited from G4HadronicInteraction
void SetModelName (const G4String &nam)
G4bool IsBlocked () const
void Block ()
Protected Attributes inherited from G4HadronicInteraction
G4HadFinalState theParticleChange
G4int verboseLevel
G4double theMinEnergy
G4double theMaxEnergy
G4bool isBlocked

Detailed Description

Definition at line 78 of file G4EMDissociation.hh.

Constructor & Destructor Documentation

◆ G4EMDissociation() [1/3]

G4EMDissociation::G4EMDissociation ( )

Definition at line 79 of file G4EMDissociation.cc.

79 :
80 G4HadronicInteraction("EMDissociation"),
81 secID_projectileDissociation(-1), secID_targetDissociation(-1)
82{
83 // Send message to stdout to advise that the G4EMDissociation model is being
84 // used.
85 PrintWelcomeMessage();
86
87 // No de-excitation handler has been supplied - define the default handler.
88 theExcitationHandler = new G4ExcitationHandler;
89 theExcitationHandler->SetMinEForMultiFrag(5.0*MeV);
90 handlerDefinedInternally = true;
91
92 // This EM dissociation model needs access to the cross-sections held in
93 // G4EMDissociationCrossSection.
94 dissociationCrossSection = new G4EMDissociationCrossSection;
95 thePhotonSpectrum = new G4EMDissociationSpectrum;
96
97 // Set the minimum and maximum range for the model (despite nomanclature, this
98 // is in energy per nucleon number).
99 SetMinEnergy(100.0*MeV);
100 SetMaxEnergy(500.0*GeV);
101
102 // Set the default verbose level to 0 - no output.
103 verboseLevel = 0;
104
105 // Creator model ID for the secondaries created by this model
106 secID_projectileDissociation = G4PhysicsModelCatalog::GetModelID( "model_projectile" + GetModelName() );
107 secID_targetDissociation = G4PhysicsModelCatalog::GetModelID( "model_target" + GetModelName() );
108}
void SetMinEnergy(G4double anEnergy)
G4HadronicInteraction(const G4String &modelName="HadronicModel")
const G4String & GetModelName() const
void SetMaxEnergy(const G4double anEnergy)
static G4int GetModelID(const G4int modelIndex)

Referenced by G4EMDissociation(), and operator=().

◆ G4EMDissociation() [2/3]

G4EMDissociation::G4EMDissociation ( G4ExcitationHandler * aExcitationHandler)

Definition at line 110 of file G4EMDissociation.cc.

110 :
111 G4HadronicInteraction("EMDissociation"),
112 secID_projectileDissociation(-1), secID_targetDissociation(-1)
113{
114 // Send message to stdout to advise that the G4EMDissociation model is being
115 // used.
116 PrintWelcomeMessage();
117
118 theExcitationHandler = aExcitationHandler;
119 handlerDefinedInternally = false;
120
121 // This EM dissociation model needs access to the cross-sections held in
122 // G4EMDissociationCrossSection.
123 dissociationCrossSection = new G4EMDissociationCrossSection;
124 thePhotonSpectrum = new G4EMDissociationSpectrum;
125
126 // Set the minimum and maximum range for the model (despite nomanclature, this
127 // is in energy per nucleon number)
128 SetMinEnergy(100.0*MeV);
129 SetMaxEnergy(500.0*GeV);
130 verboseLevel = 0;
131
132 // Creator model ID for the secondaries created by this model
133 secID_projectileDissociation = G4PhysicsModelCatalog::GetModelID( "model_projectile" + GetModelName() );
134 secID_targetDissociation = G4PhysicsModelCatalog::GetModelID( "model_target" + GetModelName() );
135}

◆ ~G4EMDissociation()

G4EMDissociation::~G4EMDissociation ( )

Definition at line 138 of file G4EMDissociation.cc.

138 {
139 if (handlerDefinedInternally) delete theExcitationHandler;
140 // delete dissociationCrossSection;
141 // Cross section deleted by G4CrossSectionRegistry; don't do it here
142 // Bug reported by Gong Ding in Bug Report #1339
143 delete thePhotonSpectrum;
144}

◆ G4EMDissociation() [3/3]

G4EMDissociation::G4EMDissociation ( const G4EMDissociation & emd)
delete

Member Function Documentation

◆ ApplyYourself()

G4HadFinalState * G4EMDissociation::ApplyYourself ( const G4HadProjectile & theTrack,
G4Nucleus & theTarget )
virtual

Reimplemented from G4HadronicInteraction.

Definition at line 147 of file G4EMDissociation.cc.

149{
150 // The secondaries will be returned in G4HadFinalState &theParticleChange -
151 // initialise this.
152
153 theParticleChange.Clear();
154 theParticleChange.SetStatusChange(stopAndKill);
155
156 // Get relevant information about the projectile and target (A, Z) and
157 // energy/nuc, momentum, velocity, Lorentz factor and rest-mass of the
158 // projectile.
159
160 const G4ParticleDefinition *definitionP = theTrack.GetDefinition();
161 const G4double AP = definitionP->GetBaryonNumber();
162 const G4double ZP = definitionP->GetPDGCharge();
163 G4LorentzVector pP = theTrack.Get4Momentum();
164 G4double E = theTrack.GetKineticEnergy()/AP;
165 G4double MP = theTrack.GetTotalEnergy() - E*AP;
166 G4double b = pP.beta();
167 if (b <= DBL_MIN) { return &theParticleChange; }
168 G4double AT = theTarget.GetA_asInt();
169 G4double ZT = theTarget.GetZ_asInt();
171
172 // Depending upon the verbosity level, output the initial information on the
173 // projectile and target
174 if (verboseLevel >= 2) {
175 G4cout.precision(6);
176 G4cout <<"########################################"
177 <<"########################################"
178 <<G4endl;
179 G4cout <<"IN G4EMDissociation" <<G4endl;
180 G4cout <<"Initial projectile A=" <<AP
181 <<", Z=" <<ZP
182 <<G4endl;
183 G4cout <<"Initial target A=" <<AT
184 <<", Z=" <<ZT
185 <<G4endl;
186 G4cout <<"Projectile momentum and Energy/nuc = " <<pP <<" ," <<E <<G4endl;
187 }
188
189 // Initialise the variables which will be used with the phase-space decay and
190 // to boost the secondaries from the interaction.
191
192 G4ParticleDefinition *typeNucleon = nullptr;
193 G4ParticleDefinition *typeDaughter = nullptr;
194 G4double Eg = 0.0;
195 G4double mass = 0.0;
196 G4ThreeVector boost = G4ThreeVector(0.0, 0.0, 0.0);
197
198 // Determine the cross-sections at the giant dipole and giant quadrupole
199 // resonance energies for the projectile and then target. The information is
200 // initially provided in the G4PhysicsFreeVector individually for the E1
201 // and E2 fields. These are then summed.
202
203 G4double bmin = thePhotonSpectrum->GetClosestApproach(AP, ZP, AT, ZT, b);
204 G4PhysicsFreeVector *crossSectionP = dissociationCrossSection->
205 GetCrossSectionForProjectile(AP, ZP, AT, ZT, b, bmin);
206 G4PhysicsFreeVector *crossSectionT = dissociationCrossSection->
207 GetCrossSectionForTarget(AP, ZP, AT, ZT, b, bmin);
208
209 G4double totCrossSectionP = (*crossSectionP)[0]+(*crossSectionP)[1];
210 G4double totCrossSectionT = (*crossSectionT)[0]+(*crossSectionT)[1];
211
212 // Now sample whether the interaction involved EM dissociation of the projectile
213 // or the target.
214
215 G4int secID = -1; // Creator model ID for the secondaries
216 if (G4UniformRand() * (totCrossSectionP + totCrossSectionT) < totCrossSectionP) {
217
218 // It was the projectile which underwent EM dissociation. Define the Lorentz
219 // boost to be applied to the secondaries, and sample whether a proton or a
220 // neutron was ejected. Then determine the energy of the virtual gamma ray
221 // which passed from the target nucleus ... this will be used to define the
222 // excitation of the projectile.
223
224 secID = secID_projectileDissociation;
225 mass = MP;
226 if (G4UniformRand() < dissociationCrossSection->
227 GetWilsonProbabilityForProtonDissociation (AP, ZP))
228 {
229 if (verboseLevel >= 2)
230 G4cout <<"Projectile underwent EM dissociation producing a proton"
231 <<G4endl;
232 typeNucleon = G4Proton::ProtonDefinition();
233 typeDaughter = G4IonTable::GetIonTable()->
234 GetIon((G4int) ZP-1, (G4int) AP-1, 0.0);
235 }
236 else
237 {
238 if (verboseLevel >= 2)
239 G4cout <<"Projectile underwent EM dissociation producing a neutron"
240 <<G4endl;
241 typeNucleon = G4Neutron::NeutronDefinition();
242 typeDaughter = G4IonTable::GetIonTable()->
243 GetIon((G4int) ZP, (G4int) AP-1, 0.0);
244 }
245 if (G4UniformRand() < (*crossSectionP)[0]/totCrossSectionP)
246 {
247 Eg = crossSectionP->GetLowEdgeEnergy(0);
248 if (verboseLevel >= 2)
249 G4cout <<"Transition type was E1" <<G4endl;
250 }
251 else
252 {
253 Eg = crossSectionP->GetLowEdgeEnergy(1);
254 if (verboseLevel >= 2)
255 G4cout <<"Transition type was E2" <<G4endl;
256 }
257
258 // We need to define a Lorentz vector with the original momentum, but total
259 // energy includes the projectile and virtual gamma. This is then used
260 // to calculate the boost required for the secondaries.
261
262 pP.setE( std::sqrt( pP.vect().mag2() + (mass + Eg)*(mass + Eg) ) );
263 boost = pP.findBoostToCM();
264 }
265 else
266 {
267 // It was the target which underwent EM dissociation. Sample whether a
268 // proton or a neutron was ejected. Then determine the energy of the virtual
269 // gamma ray which passed from the projectile nucleus ... this will be used to
270 // define the excitation of the target.
271
272 secID = secID_targetDissociation;
273 mass = MT;
274 if (G4UniformRand() < dissociationCrossSection->
275 GetWilsonProbabilityForProtonDissociation (AT, ZT))
276 {
277 if (verboseLevel >= 2)
278 G4cout <<"Target underwent EM dissociation producing a proton"
279 <<G4endl;
280 typeNucleon = G4Proton::ProtonDefinition();
281 typeDaughter = G4IonTable::GetIonTable()->
282 GetIon((G4int) ZT-1, (G4int) AT-1, 0.0);
283 }
284 else
285 {
286 if (verboseLevel >= 2)
287 G4cout <<"Target underwent EM dissociation producing a neutron"
288 <<G4endl;
289 typeNucleon = G4Neutron::NeutronDefinition();
290 typeDaughter = G4IonTable::GetIonTable()->
291 GetIon((G4int) ZT, (G4int) AT-1, 0.0);
292 }
293 if (G4UniformRand() < (*crossSectionT)[0]/totCrossSectionT)
294 {
295 Eg = crossSectionT->GetLowEdgeEnergy(0);
296 if (verboseLevel >= 2)
297 G4cout <<"Transition type was E1" <<G4endl;
298 }
299 else
300 {
301 Eg = crossSectionT->GetLowEdgeEnergy(1);
302 if (verboseLevel >= 2)
303 G4cout <<"Transition type was E2" <<G4endl;
304 }
305
306 // Add the projectile to theParticleChange, less the energy of the
307 // not-so-virtual gamma-ray. Not that at the moment, no lateral momentum
308 // is transferred between the projectile and target nuclei.
309
310 G4ThreeVector v = pP.vect();
311 v.setMag(1.0);
312 G4DynamicParticle *changedP = new G4DynamicParticle (definitionP, v, E*AP-Eg);
313 theParticleChange.AddSecondary (changedP, secID);
314 if (verboseLevel >= 2)
315 {
316 G4cout <<"Projectile change:" <<G4endl;
317 changedP->DumpInfo();
318 }
319 }
320
321 // Perform a two-body decay based on the restmass energy of the parent and
322 // gamma-ray, and the masses of the daughters. In the frame of reference of
323 // the nucles, the angular distribution is sampled isotropically, but the
324 // the nucleon and secondary nucleus are boosted if they've come from the
325 // projectile.
326
327 G4double e = mass + Eg;
328 G4double mass1 = typeNucleon->GetPDGMass();
329 G4double mass2 = typeDaughter->GetPDGMass();
330 G4double pp = (e+mass1+mass2)*(e+mass1-mass2)*
331 (e-mass1+mass2)*(e-mass1-mass2)/(4.0*e*e);
332 if (pp < 0.0) {
333 pp = 1.0*eV;
334// if (verboseLevel >`= 1)
335// {
336// G4cout <<"IN G4EMDissociation::ApplyYoursef" <<G4endl;
337// G4cout <<"Error in mass of secondaries compared with primary:" <<G4endl;
338// G4cout <<"Rest mass of primary = " <<mass <<" MeV" <<G4endl;
339// G4cout <<"Virtual gamma energy = " <<Eg <<" MeV" <<G4endl;
340// G4cout <<"Rest mass of secondary #1 = " <<mass1 <<" MeV" <<G4endl;
341// G4cout <<"Rest mass of secondary #2 = " <<mass2 <<" MeV" <<G4endl;
342// }
343 }
344 else
345 pp = std::sqrt(pp);
346 G4double costheta = 2.*G4UniformRand()-1.0;
347 G4double sintheta = std::sqrt((1.0 - costheta)*(1.0 + costheta));
348 G4double phi = 2.0*pi*G4UniformRand();
349 G4ThreeVector direction(sintheta*std::cos(phi),sintheta*std::sin(phi),costheta);
350 G4DynamicParticle *dynamicNucleon =
351 new G4DynamicParticle(typeNucleon, direction*pp);
352 dynamicNucleon->Set4Momentum(dynamicNucleon->Get4Momentum().boost(-boost));
353 G4DynamicParticle *dynamicDaughter =
354 new G4DynamicParticle(typeDaughter, -direction*pp);
355 dynamicDaughter->Set4Momentum(dynamicDaughter->Get4Momentum().boost(-boost));
356
357 // The "decay" products have to be transferred to the G4HadFinalState object.
358 // Furthermore, the residual nucleus should be de-excited.
359
360 theParticleChange.AddSecondary (dynamicNucleon, secID);
361 if (verboseLevel >= 2) {
362 G4cout <<"Nucleon from the EMD process:" <<G4endl;
363 dynamicNucleon->DumpInfo();
364 }
365
366 G4Fragment* theFragment = new
367 G4Fragment(typeDaughter->GetBaryonNumber(),
368 G4lrint(typeDaughter->GetPDGCharge()/CLHEP::eplus),
369 dynamicDaughter->Get4Momentum());
370
371 if (verboseLevel >= 2) {
372 G4cout <<"Dynamic properties of the prefragment:" <<G4endl;
373 G4cout.precision(6);
374 dynamicDaughter->DumpInfo();
375 G4cout <<"Nuclear properties of the prefragment:" <<G4endl;
376 G4cout <<theFragment <<G4endl;
377 }
378
379 G4ReactionProductVector* products =
380 theExcitationHandler->BreakItUp(*theFragment);
381 delete theFragment;
382 theFragment = NULL;
383
384 G4DynamicParticle* secondary = 0;
385 G4ReactionProductVector::iterator iter;
386 for (iter = products->begin(); iter != products->end(); ++iter) {
387 secondary = new G4DynamicParticle((*iter)->GetDefinition(),
388 (*iter)->GetTotalEnergy(), (*iter)->GetMomentum());
389 theParticleChange.AddSecondary (secondary, secID);
390 }
391 delete products;
392
393 delete crossSectionP;
394 delete crossSectionT;
395
396 if (verboseLevel >= 2)
397 G4cout <<"########################################"
398 <<"########################################"
399 <<G4endl;
400
401 return &theParticleChange;
402}
@ stopAndKill
CLHEP::HepLorentzVector G4LorentzVector
std::vector< G4ReactionProduct * > G4ReactionProductVector
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition Randomize.hh:52
double mag2() const
void setMag(double)
HepLorentzVector & boost(double, double, double)
Hep3Vector vect() const
Hep3Vector findBoostToCM() const
void DumpInfo(G4int mode=0) const
G4LorentzVector Get4Momentum() const
void Set4Momentum(const G4LorentzVector &momentum)
const G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
const G4LorentzVector & Get4Momentum() const
G4double GetTotalEnergy() const
static G4IonTable * GetIonTable()
static G4Neutron * NeutronDefinition()
Definition G4Neutron.cc:96
static G4double GetNuclearMass(const G4double A, const G4double Z)
G4int GetA_asInt() const
Definition G4Nucleus.hh:78
G4int GetZ_asInt() const
Definition G4Nucleus.hh:84
G4double GetLowEdgeEnergy(const std::size_t index) const
static G4Proton * ProtonDefinition()
Definition G4Proton.cc:85
const G4double pi
int G4lrint(double ad)
Definition templates.hh:134
#define DBL_MIN
Definition templates.hh:54

◆ operator=()

const G4EMDissociation & G4EMDissociation::operator= ( G4EMDissociation & right)
delete

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