Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4PenelopeBremsstrahlungModel.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// $Id$
27//
28// Author: Luciano Pandola
29//
30// History:
31// --------
32// 23 Nov 2010 L Pandola First complete implementation, Penelope v2008
33// 24 May 2011 L. Pandola Renamed (make default Penelope)
34// 13 Mar 2012 L. Pandola Updated the interface for the angular generator
35// 18 Jul 2012 L. Pandola Migrate to the new interface of the angular generator, which
36// now provides the G4ThreeVector and takes care of rotation
37//
38
41#include "G4SystemOfUnits.hh"
47#include "G4DynamicParticle.hh"
48#include "G4Gamma.hh"
49#include "G4Electron.hh"
50#include "G4Positron.hh"
54#include "G4PhysicsLogVector.hh"
55#include "G4PhysicsTable.hh"
56
57//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
58
60 const G4String& nam)
61 :G4VEmModel(nam),fParticleChange(0),isInitialised(false),energyGrid(0),
62 XSTableElectron(0),XSTablePositron(0)
63
64{
65 fIntrinsicLowEnergyLimit = 100.0*eV;
66 fIntrinsicHighEnergyLimit = 100.0*GeV;
67 nBins = 200;
68
69 SetHighEnergyLimit(fIntrinsicHighEnergyLimit);
70 //
72 //
73 verboseLevel= 0;
74
75 // Verbosity scale:
76 // 0 = nothing
77 // 1 = warning for energy non-conservation
78 // 2 = details of energy budget
79 // 3 = calculation of cross sections, file openings, sampling of atoms
80 // 4 = entering in methods
81
82 fPenelopeFSHelper = new G4PenelopeBremsstrahlungFS();
83 fPenelopeAngular = new G4PenelopeBremsstrahlungAngular();
84
85 // Atomic deexcitation model activated by default
87
88}
89
90//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
91
93{
94 ClearTables();
95 if (fPenelopeFSHelper)
96 delete fPenelopeFSHelper;
97 if (fPenelopeAngular)
98 delete fPenelopeAngular;
99}
100
101//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
102
104 const G4DataVector&)
105{
106 if (verboseLevel > 3)
107 G4cout << "Calling G4PenelopeBremsstrahlungModel::Initialise()" << G4endl;
108
109 //Clear and re-build the tables
110 ClearTables();
111
112 //forces the cleaning of tables, in this specific case
113 if (fPenelopeAngular)
114 fPenelopeAngular->Initialize();
115
116
117 //Set the number of bins for the tables. 20 points per decade
118 nBins = (size_t) (20*std::log10(HighEnergyLimit()/LowEnergyLimit()));
119 nBins = std::max(nBins,(size_t)100);
120 energyGrid = new G4PhysicsLogVector(LowEnergyLimit(),
122 nBins-1); //one hidden bin is added
123
124
125 XSTableElectron = new
126 std::map< std::pair<const G4Material*,G4double>, G4PenelopeCrossSection*>;
127 XSTablePositron = new
128 std::map< std::pair<const G4Material*,G4double>, G4PenelopeCrossSection*>;
129
130 if (verboseLevel > 2) {
131 G4cout << "Penelope Bremsstrahlung model v2008 is initialized " << G4endl
132 << "Energy range: "
133 << LowEnergyLimit() / keV << " keV - "
134 << HighEnergyLimit() / GeV << " GeV."
135 << G4endl;
136 }
137
138 if(isInitialised) return;
140 isInitialised = true;
141}
142
143//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
144
146 const G4ParticleDefinition* theParticle,
147 G4double energy,
148 G4double cutEnergy,
149 G4double)
150{
151 //
152 if (verboseLevel > 3)
153 G4cout << "Calling CrossSectionPerVolume() of G4PenelopeBremsstrahlungModel" << G4endl;
154
155 SetupForMaterial(theParticle, material, energy);
156
157 G4double crossPerMolecule = 0.;
158
159 G4PenelopeCrossSection* theXS = GetCrossSectionTableForCouple(theParticle,material,
160 cutEnergy);
161
162 if (theXS)
163 crossPerMolecule = theXS->GetHardCrossSection(energy);
164
165 G4double atomDensity = material->GetTotNbOfAtomsPerVolume();
166 G4double atPerMol = oscManager->GetAtomsPerMolecule(material);
167
168 if (verboseLevel > 3)
169 G4cout << "Material " << material->GetName() << " has " << atPerMol <<
170 "atoms per molecule" << G4endl;
171
172 G4double moleculeDensity = 0.;
173 if (atPerMol)
174 moleculeDensity = atomDensity/atPerMol;
175
176 G4double crossPerVolume = crossPerMolecule*moleculeDensity;
177
178 if (verboseLevel > 2)
179 {
180 G4cout << "G4PenelopeBremsstrahlungModel " << G4endl;
181 G4cout << "Mean free path for gamma emission > " << cutEnergy/keV << " keV at " <<
182 energy/keV << " keV = " << (1./crossPerVolume)/mm << " mm" << G4endl;
183 }
184
185 return crossPerVolume;
186}
187
188//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
189
190//This is a dummy method. Never inkoved by the tracking, it just issues
191//a warning if one tries to get Cross Sections per Atom via the
192//G4EmCalculator.
194 G4double,
195 G4double,
196 G4double,
197 G4double,
198 G4double)
199{
200 G4cout << "*** G4PenelopeBremsstrahlungModel -- WARNING ***" << G4endl;
201 G4cout << "Penelope Bremsstrahlung model v2008 does not calculate cross section _per atom_ " << G4endl;
202 G4cout << "so the result is always zero. For physics values, please invoke " << G4endl;
203 G4cout << "GetCrossSectionPerVolume() or GetMeanFreePath() via the G4EmCalculator" << G4endl;
204 return 0;
205}
206
207//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
208
210 const G4ParticleDefinition* theParticle,
211 G4double kineticEnergy,
212 G4double cutEnergy)
213{
214 if (verboseLevel > 3)
215 G4cout << "Calling ComputeDEDX() of G4PenelopeBremsstrahlungModel" << G4endl;
216
217 G4PenelopeCrossSection* theXS = GetCrossSectionTableForCouple(theParticle,material,
218 cutEnergy);
219 G4double sPowerPerMolecule = 0.0;
220 if (theXS)
221 sPowerPerMolecule = theXS->GetSoftStoppingPower(kineticEnergy);
222
223
224 G4double atomDensity = material->GetTotNbOfAtomsPerVolume();
225 G4double atPerMol = oscManager->GetAtomsPerMolecule(material);
226
227 G4double moleculeDensity = 0.;
228 if (atPerMol)
229 moleculeDensity = atomDensity/atPerMol;
230
231 G4double sPowerPerVolume = sPowerPerMolecule*moleculeDensity;
232
233 if (verboseLevel > 2)
234 {
235 G4cout << "G4PenelopeBremsstrahlungModel " << G4endl;
236 G4cout << "Stopping power < " << cutEnergy/keV << " keV at " <<
237 kineticEnergy/keV << " keV = " <<
238 sPowerPerVolume/(keV/mm) << " keV/mm" << G4endl;
239 }
240 return sPowerPerVolume;
241}
242
243//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
244
245void G4PenelopeBremsstrahlungModel::SampleSecondaries(std::vector<G4DynamicParticle*>*fvect,
246 const G4MaterialCutsCouple* couple,
247 const G4DynamicParticle* aDynamicParticle,
248 G4double cutG,
249 G4double)
250{
251 if (verboseLevel > 3)
252 G4cout << "Calling SampleSecondaries() of G4PenelopeBremsstrahlungModel" << G4endl;
253
254 G4double kineticEnergy = aDynamicParticle->GetKineticEnergy();
255 const G4Material* material = couple->GetMaterial();
256
257 if (kineticEnergy <= fIntrinsicLowEnergyLimit)
258 {
261 return ;
262 }
263
264 G4ParticleMomentum particleDirection0 = aDynamicParticle->GetMomentumDirection();
265 //This is the momentum
266 G4ThreeVector initialMomentum = aDynamicParticle->GetMomentum();
267
268 //Not enough energy to produce a secondary! Return with nothing happened
269 if (kineticEnergy < cutG)
270 return;
271
272 if (verboseLevel > 3)
273 G4cout << "Going to sample gamma energy for: " <<material->GetName() << " " <<
274 "energy = " << kineticEnergy/keV << ", cut = " << cutG/keV << G4endl;
275
276 //Sample gamma's energy according to the spectrum
277 G4double gammaEnergy =
278 fPenelopeFSHelper->SampleGammaEnergy(kineticEnergy,material,cutG);
279
280 if (verboseLevel > 3)
281 G4cout << "Sampled gamma energy: " << gammaEnergy/keV << " keV" << G4endl;
282
283 //Now sample the direction for the Gamma. Notice that the rotation is already done
284 //Z is unused here, I plug 0. The information is in the material pointer
285 G4ThreeVector gammaDirection1 =
286 fPenelopeAngular->SampleDirection(aDynamicParticle,gammaEnergy,0,material);
287
288 if (verboseLevel > 3)
289 G4cout << "Sampled cosTheta for e-: " << gammaDirection1.cosTheta() << G4endl;
290
291 G4double residualPrimaryEnergy = kineticEnergy-gammaEnergy;
292 if (residualPrimaryEnergy < 0)
293 {
294 //Ok we have a problem, all energy goes with the gamma
295 gammaEnergy += residualPrimaryEnergy;
296 residualPrimaryEnergy = 0.0;
297 }
298
299 //Produce final state according to momentum conservation
300 G4ThreeVector particleDirection1 = initialMomentum - gammaEnergy*gammaDirection1;
301 particleDirection1 = particleDirection1.unit(); //normalize
302
303 //Update the primary particle
304 if (residualPrimaryEnergy > 0.)
305 {
306 fParticleChange->ProposeMomentumDirection(particleDirection1);
307 fParticleChange->SetProposedKineticEnergy(residualPrimaryEnergy);
308 }
309 else
310 {
312 }
313
314 //Now produce the photon
316 gammaDirection1,
317 gammaEnergy);
318 fvect->push_back(theGamma);
319
320 if (verboseLevel > 1)
321 {
322 G4cout << "-----------------------------------------------------------" << G4endl;
323 G4cout << "Energy balance from G4PenelopeBremsstrahlung" << G4endl;
324 G4cout << "Incoming primary energy: " << kineticEnergy/keV << " keV" << G4endl;
325 G4cout << "-----------------------------------------------------------" << G4endl;
326 G4cout << "Outgoing primary energy: " << residualPrimaryEnergy/keV << " keV" << G4endl;
327 G4cout << "Bremsstrahlung photon " << gammaEnergy/keV << " keV" << G4endl;
328 G4cout << "Total final state: " << (residualPrimaryEnergy+gammaEnergy)/keV
329 << " keV" << G4endl;
330 G4cout << "-----------------------------------------------------------" << G4endl;
331 }
332
333 if (verboseLevel > 0)
334 {
335 G4double energyDiff = std::fabs(residualPrimaryEnergy+gammaEnergy-kineticEnergy);
336 if (energyDiff > 0.05*keV)
337 G4cout << "Warning from G4PenelopeBremsstrahlung: problem with energy conservation: "
338 <<
339 (residualPrimaryEnergy+gammaEnergy)/keV <<
340 " keV (final) vs. " <<
341 kineticEnergy/keV << " keV (initial)" << G4endl;
342 }
343 return;
344}
345
346//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
347
348void G4PenelopeBremsstrahlungModel::ClearTables()
349{
350 std::map< std::pair<const G4Material*,G4double>, G4PenelopeCrossSection*>::iterator i;
351 if (XSTableElectron)
352 {
353 for (i=XSTableElectron->begin(); i != XSTableElectron->end(); i++)
354 {
355 G4PenelopeCrossSection* tab = i->second;
356 delete tab;
357 }
358 delete XSTableElectron;
359 XSTableElectron = 0;
360 }
361 if (XSTablePositron)
362 {
363 for (i=XSTablePositron->begin(); i != XSTablePositron->end(); i++)
364 {
365 G4PenelopeCrossSection* tab = i->second;
366 delete tab;
367 }
368 delete XSTablePositron;
369 XSTablePositron = 0;
370 }
371
372 if (energyGrid)
373 delete energyGrid;
374
375 if (fPenelopeFSHelper)
376 fPenelopeFSHelper->ClearTables();
377
378 if (verboseLevel > 2)
379 G4cout << "G4PenelopeBremsstrahlungModel: cleared tables" << G4endl;
380
381 return;
382}
383
384//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
385
388{
389 return fIntrinsicLowEnergyLimit;
390}
391
392//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
393
394void G4PenelopeBremsstrahlungModel::BuildXSTable(const G4Material* mat,G4double cut)
395{
396//
397 //This method fills the G4PenelopeCrossSection containers for electrons or positrons
398 //and for the given material/cut couple.
399 //Equivalent of subroutines EBRaT and PINaT of Penelope
400 //
401 if (verboseLevel > 2)
402 {
403 G4cout << "G4PenelopeBremsstrahlungModel: going to build cross section table " << G4endl;
404 G4cout << "for e+/e- in " << mat->GetName() << G4endl;
405 }
406
407 //Tables have been already created (checked by GetCrossSectionTableForCouple)
408 if (energyGrid->GetVectorLength() != nBins)
409 {
411 ed << "Energy Grid looks not initialized" << G4endl;
412 ed << nBins << " " << energyGrid->GetVectorLength() << G4endl;
413 G4Exception("G4PenelopeBremsstrahlungModel::BuildXSTable()",
414 "em2016",FatalException,ed);
415 }
416
418 G4PenelopeCrossSection* XSEntry2 = new G4PenelopeCrossSection(nBins);
419
420 G4PhysicsTable* table = fPenelopeFSHelper->GetScaledXSTable(mat,cut);
421
422
423 //loop on the energy grid
424 for (size_t bin=0;bin<nBins;bin++)
425 {
426 G4double energy = energyGrid->GetLowEdgeEnergy(bin);
427 G4double XH0=0, XH1=0, XH2=0;
428 G4double XS0=0, XS1=0, XS2=0;
429
430 //Global xs factor
431 G4double fact = fPenelopeFSHelper->GetEffectiveZSquared(mat)*
432 ((energy+electron_mass_c2)*(energy+electron_mass_c2)/
433 (energy*(energy+2.0*electron_mass_c2)));
434
435 G4double restrictedCut = cut/energy;
436
437 //Now I need the dSigma/dX profile - interpolated on energy - for
438 //the 32-point x grid. Interpolation is log-log
439 size_t nBinsX = fPenelopeFSHelper->GetNBinsX();
440 G4double* tempData = new G4double[nBinsX];
441 G4double logene = std::log(energy);
442 for (size_t ix=0;ix<nBinsX;ix++)
443 {
444 //find dSigma/dx for the given E. X belongs to the 32-point grid.
445 G4double val = (*table)[ix]->Value(logene);
446 tempData[ix] = std::exp(val); //back to the real value!
447 }
448
449 G4double XH0A = 0.;
450 if (restrictedCut <= 1) //calculate only if we are above threshold!
451 XH0A = fPenelopeFSHelper->GetMomentumIntegral(tempData,1.0,-1) -
452 fPenelopeFSHelper->GetMomentumIntegral(tempData,restrictedCut,-1);
453 G4double XS1A = fPenelopeFSHelper->GetMomentumIntegral(tempData,
454 restrictedCut,0);
455 G4double XS2A = fPenelopeFSHelper->GetMomentumIntegral(tempData,
456 restrictedCut,1);
457 G4double XH1A=0, XH2A=0;
458 if (restrictedCut <=1)
459 {
460 XH1A = fPenelopeFSHelper->GetMomentumIntegral(tempData,1.0,0) -
461 XS1A;
462 XH2A = fPenelopeFSHelper->GetMomentumIntegral(tempData,1.0,1) -
463 XS2A;
464 }
465 delete[] tempData;
466
467 XH0 = XH0A*fact;
468 XS1 = XS1A*fact*energy;
469 XH1 = XH1A*fact*energy;
470 XS2 = XS2A*fact*energy*energy;
471 XH2 = XH2A*fact*energy*energy;
472
473 XSEntry->AddCrossSectionPoint(bin,energy,XH0,XH1,XH2,XS0,XS1,XS2);
474
475 //take care of positrons
476 G4double posCorrection = GetPositronXSCorrection(mat,energy);
477 XSEntry2->AddCrossSectionPoint(bin,energy,XH0*posCorrection,
478 XH1*posCorrection,
479 XH2*posCorrection,
480 XS0,
481 XS1*posCorrection,
482 XS2*posCorrection);
483 }
484
485 //Insert in the appropriate table
486 std::pair<const G4Material*,G4double> theKey = std::make_pair(mat,cut);
487 XSTableElectron->insert(std::make_pair(theKey,XSEntry));
488 XSTablePositron->insert(std::make_pair(theKey,XSEntry2));
489
490 return;
491}
492
493
494//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
495
497G4PenelopeBremsstrahlungModel::GetCrossSectionTableForCouple(const G4ParticleDefinition* part,
498 const G4Material* mat,
499 G4double cut)
500{
501 if (part != G4Electron::Electron() && part != G4Positron::Positron())
502 {
504 ed << "Invalid particle: " << part->GetParticleName() << G4endl;
505 G4Exception("G4PenelopeBremsstrahlungModel::GetCrossSectionTableForCouple()",
506 "em0001",FatalException,ed);
507 return NULL;
508 }
509
510 if (part == G4Electron::Electron())
511 {
512 if (!XSTableElectron)
513 {
514 G4String excep = "The Cross Section Table for e- was not initialized correctly!";
515 G4Exception("G4PenelopeBremsstrahlungModel::GetCrossSectionTableForCouple()",
516 "em2013",FatalException,excep);
517 return NULL;
518 }
519 std::pair<const G4Material*,G4double> theKey = std::make_pair(mat,cut);
520 if (XSTableElectron->count(theKey)) //table already built
521 return XSTableElectron->find(theKey)->second;
522 else
523 {
524 BuildXSTable(mat,cut);
525 if (XSTableElectron->count(theKey)) //now it should be ok!
526 return XSTableElectron->find(theKey)->second;
527 else
528 {
530 ed << "Unable to build e- table for " << mat->GetName() << G4endl;
531 G4Exception("G4PenelopeBremsstrahlungModel::GetCrossSectionTableForCouple()",
532 "em2009",FatalException,ed);
533 }
534 }
535 }
536 if (part == G4Positron::Positron())
537 {
538 if (!XSTablePositron)
539 {
540 G4String excep = "The Cross Section Table for e+ was not initialized correctly!";
541 G4Exception("G4PenelopeBremsstrahlungModel::GetCrossSectionTableForCouple()",
542 "em2013",FatalException,excep);
543 return NULL;
544 }
545 std::pair<const G4Material*,G4double> theKey = std::make_pair(mat,cut);
546 if (XSTablePositron->count(theKey)) //table already built
547 return XSTablePositron->find(theKey)->second;
548 else
549 {
550 BuildXSTable(mat,cut);
551 if (XSTablePositron->count(theKey)) //now it should be ok!
552 return XSTablePositron->find(theKey)->second;
553 else
554 {
556 ed << "Unable to build e+ table for " << mat->GetName() << G4endl;
557 G4Exception("G4PenelopeBremsstrahlungModel::GetCrossSectionTableForCouple()",
558 "em2009",FatalException,ed);
559 }
560 }
561 }
562 return NULL;
563}
564
565
566
567//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
568
569G4double G4PenelopeBremsstrahlungModel::GetPositronXSCorrection(const G4Material* mat,
570 G4double energy)
571{
572 //The electron-to-positron correction factor is set equal to the ratio of the
573 //radiative stopping powers for positrons and electrons, which has been calculated
574 //by Kim et al. (1986) (cf. Berger and Seltzer, 1982). Here, it is used an
575 //analytical approximation which reproduces the tabulated values with 0.5%
576 //accuracy
577 G4double t=std::log(1.0+1e6*energy/
578 (electron_mass_c2*fPenelopeFSHelper->GetEffectiveZSquared(mat)));
579 G4double corr = 1.0-std::exp(-t*(1.2359e-1-t*(6.1274e-2-t*
580 (3.1516e-2-t*(7.7446e-3-t*(1.0595e-3-t*
581 (7.0568e-5-t*
582 1.8080e-6)))))));
583 return corr;
584}
@ FatalException
double G4double
Definition: G4Types.hh:64
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
Hep3Vector unit() const
double cosTheta() const
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
G4ThreeVector GetMomentum() const
static G4Electron * Electron()
Definition: G4Electron.cc:94
static G4Gamma * Gamma()
Definition: G4Gamma.cc:86
const G4Material * GetMaterial() const
G4double GetTotNbOfAtomsPerVolume() const
Definition: G4Material.hh:208
const G4String & GetName() const
Definition: G4Material.hh:177
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
const G4String & GetParticleName() const
G4ThreeVector & SampleDirection(const G4DynamicParticle *dp, G4double out_energy, G4int Z, const G4Material *mat=0)
void Initialize()
The Initialize() method forces the cleaning of tables.
G4double GetMomentumIntegral(G4double *y, G4double up, G4int momOrder)
G4double SampleGammaEnergy(G4double energy, const G4Material *, G4double cut)
G4double GetEffectiveZSquared(const G4Material *mat)
G4PhysicsTable * GetScaledXSTable(const G4Material *, G4double cut)
virtual G4double CrossSectionPerVolume(const G4Material *material, const G4ParticleDefinition *theParticle, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy=DBL_MAX)
virtual G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy)
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
virtual G4double MinEnergyCut(const G4ParticleDefinition *, const G4MaterialCutsCouple *)
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *theParticle, G4double kinEnergy, G4double Z, G4double A=0, G4double cut=0, G4double emax=DBL_MAX)
G4PenelopeBremsstrahlungModel(const G4ParticleDefinition *p=0, const G4String &processName="PenBrem")
G4double GetSoftStoppingPower(G4double energy)
Returns the total stopping power due to soft collisions.
G4double GetHardCrossSection(G4double energy)
Returns hard cross section at the given energy.
void AddCrossSectionPoint(size_t binNumber, G4double energy, G4double XH0, G4double XH1, G4double XH2, G4double XS0, G4double XS1, G4double XS2)
G4double GetAtomsPerMolecule(const G4Material *)
Returns the total number of atoms per molecule.
static G4PenelopeOscillatorManager * GetOscillatorManager()
size_t GetVectorLength() const
virtual G4double GetLowEdgeEnergy(size_t binNumber) const
static G4Positron * Positron()
Definition: G4Positron.cc:94
void SetHighEnergyLimit(G4double)
Definition: G4VEmModel.hh:585
G4double LowEnergyLimit() const
Definition: G4VEmModel.hh:529
G4double HighEnergyLimit() const
Definition: G4VEmModel.hh:522
virtual void SetupForMaterial(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
Definition: G4VEmModel.cc:311
void SetDeexcitationFlag(G4bool val)
Definition: G4VEmModel.hh:641
G4ParticleChangeForLoss * GetParticleChangeForLoss()
Definition: G4VEmModel.cc:95
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76