Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4VEmModel.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// -------------------------------------------------------------------
29//
30// GEANT4 Class file
31//
32//
33// File name: G4VEmModel
34//
35// Author: Vladimir Ivanchenko
36//
37// Creation date: 25.07.2005
38//
39// Modifications:
40// 25.10.2005 Set default highLimit=100.TeV (V.Ivanchenko)
41// 06.02.2006 add method ComputeMeanFreePath() (mma)
42// 16.02.2009 Move implementations of virtual methods to source (VI)
43//
44//
45// Class Description:
46//
47// Abstract interface to energy loss models
48
49// -------------------------------------------------------------------
50//
51
52#include "G4VEmModel.hh"
53#include "G4LossTableManager.hh"
57
58//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
59//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
60
62 flucModel(0),anglModel(0), name(nam), lowLimit(0.1*CLHEP::keV),
63 highLimit(100.0*CLHEP::TeV),eMinActive(0.0),eMaxActive(DBL_MAX),
64 polarAngleLimit(CLHEP::pi),secondaryThreshold(DBL_MAX),
65 theLPMflag(false),flagDeexcitation(false),flagForceBuildTable(false),
66 pParticleChange(0),xSectionTable(0),theDensityFactor(0),theDensityIdx(0),
67 fCurrentCouple(0),fCurrentElement(0),
68 nsec(5)
69{
70 xsec.resize(nsec);
71 nSelectors = 0;
73}
74
75//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
76
78{
80 G4int n = elmSelectors.size();
81 if(n > 0) {
82 for(G4int i=0; i<n; ++i) {
83 delete elmSelectors[i];
84 }
85 }
86 delete anglModel;
87 if(xSectionTable) {
89 delete xSectionTable;
90 }
91}
92
93//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
94
96{
98 if (pParticleChange) {
100 } else {
101 p = new G4ParticleChangeForLoss();
102 pParticleChange = p;
103 }
104 return p;
105}
106
107//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
108
110{
112 if (pParticleChange) {
113 p = static_cast<G4ParticleChangeForGamma*>(pParticleChange);
114 } else {
115 p = new G4ParticleChangeForGamma();
116 pParticleChange = p;
117 }
118 return p;
119}
120
121//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
122
124 const G4DataVector& cuts)
125{
126 // initialise before run
128
129 // using spline for element selectors should be investigated in details
130 // because small number of points may provide biased results
131 // large number of points requires significant increase of memory
132 //G4bool spline = man->SplineFlag();
133 G4bool spline = false;
134
135 //G4cout << "IES: for " << GetName() << " Emin(MeV)= " << lowLimit/MeV
136 // << " Emax(MeV)= " << highLimit/MeV << G4endl;
137
138 // two times less bins because probability functon is normalized
139 // so correspondingly is more smooth
141 * std::log10(highLimit/lowLimit) / 6.0);
142 if(nbins < 5) { nbins = 5; }
143
144 G4ProductionCutsTable* theCoupleTable=
146 G4int numOfCouples = theCoupleTable->GetTableSize();
147
148 // prepare vector
149 if(numOfCouples > nSelectors) {
150 elmSelectors.resize(numOfCouples,0);
151 nSelectors = numOfCouples;
152 }
153
154 // initialise vector
155 for(G4int i=0; i<numOfCouples; ++i) {
156 fCurrentCouple = theCoupleTable->GetMaterialCutsCouple(i);
157 const G4Material* material = fCurrentCouple->GetMaterial();
158 G4int idx = fCurrentCouple->GetIndex();
159
160 // selector already exist check if should be deleted
161 G4bool create = true;
162 if(elmSelectors[i]) {
163 if(material == elmSelectors[i]->GetMaterial()) { create = false; }
164 else { delete elmSelectors[i]; }
165 }
166 if(create) {
167 elmSelectors[i] = new G4EmElementSelector(this,material,nbins,
168 lowLimit,highLimit,spline);
169 }
170 elmSelectors[i]->Initialise(p, cuts[idx]);
171 //elmSelectors[i]->Dump(p);
172 }
173}
174
175//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
176
180{
181 return 0.0;
182}
183
184//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
185
187 const G4ParticleDefinition* p,
188 G4double ekin,
189 G4double emin,
190 G4double emax)
191{
192 SetupForMaterial(p, material, ekin);
193 G4double cross = 0.0;
194 const G4ElementVector* theElementVector = material->GetElementVector();
195 const G4double* theAtomNumDensityVector = material->GetVecNbOfAtomsPerVolume();
196 G4int nelm = material->GetNumberOfElements();
197 if(nelm > nsec) {
198 xsec.resize(nelm);
199 nsec = nelm;
200 }
201 for (G4int i=0; i<nelm; i++) {
202 cross += theAtomNumDensityVector[i]*
203 ComputeCrossSectionPerAtom(p,(*theElementVector)[i],ekin,emin,emax);
204 xsec[i] = cross;
205 }
206 return cross;
207}
208
209//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
210
212{}
213
214//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
215
217 const G4ParticleDefinition* pd,
218 G4double kinEnergy,
219 G4double tcut,
220 G4double tmax)
221{
222 const G4ElementVector* theElementVector = material->GetElementVector();
223 G4int n = material->GetNumberOfElements() - 1;
224 fCurrentElement = (*theElementVector)[n];
225 if (n > 0) {
227 G4VEmModel::CrossSectionPerVolume(material,pd,kinEnergy,tcut,tmax);
228 for(G4int i=0; i<n; ++i) {
229 if (x <= xsec[i]) {
230 fCurrentElement = (*theElementVector)[i];
231 break;
232 }
233 }
234 }
235 return fCurrentElement;
236}
237
238//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
239
243{
244 return 0.0;
245}
246
247//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
248
250{}
251
252//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
253
255{
257 track.GetMaterial(), track.GetKineticEnergy());
258}
259
260//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
261
263 const G4Material*, G4double)
264{
265 G4double q = p->GetPDGCharge()/CLHEP::eplus;
266 return q*q;
267}
268
269//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
270
272 const G4Material*, G4double)
273{
274 return p->GetPDGCharge();
275}
276
277//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
278
280 const G4DynamicParticle*,
282{}
283
284//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
285
287 const G4ParticleDefinition* p, G4double e)
288{
289 fCurrentCouple = couple;
290 return e*e*CrossSectionPerVolume(couple->GetMaterial(),p,e,0.0,DBL_MAX);
291}
292
293//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
294
297{
298 return 0.0;
299}
300
301//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
302
304 G4double kineticEnergy)
305{
306 return kineticEnergy;
307}
308
309//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
310
312 const G4Material*, G4double)
313{}
314
315//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
316
317void
319{
320 if(p && pParticleChange != p) { pParticleChange = p; }
321 flucModel = f;
322}
323
324//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
325
327{
328 if(p != xSectionTable) {
329 if(xSectionTable) {
331 delete xSectionTable;
332 }
333 xSectionTable = p;
334 }
335}
336
337//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
std::vector< G4Element * > G4ElementVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4UniformRand()
Definition: Randomize.hh:53
static G4LossTableManager * Instance()
G4int GetNumberOfBinsPerDecade() const
void DeRegister(G4VEnergyLossProcess *p)
void Register(G4VEnergyLossProcess *p)
const G4Material * GetMaterial() const
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:189
size_t GetNumberOfElements() const
Definition: G4Material.hh:185
const G4double * GetVecNbOfAtomsPerVolume() const
Definition: G4Material.hh:205
G4double GetPDGCharge() const
void clearAndDestroy()
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
static G4ProductionCutsTable * GetProductionCutsTable()
const G4ParticleDefinition * GetParticleDefinition() const
G4Material * GetMaterial() const
G4double GetKineticEnergy() const
G4PhysicsTable * xSectionTable
Definition: G4VEmModel.hh:352
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.cc:240
virtual void CorrectionsAlongStep(const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double &eloss, G4double &niel, G4double length)
Definition: G4VEmModel.cc:279
virtual G4double GetParticleCharge(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
Definition: G4VEmModel.cc:271
G4ParticleChangeForGamma * GetParticleChangeForGamma()
Definition: G4VEmModel.cc:109
virtual G4double CrossSectionPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.cc:186
virtual G4double Value(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy)
Definition: G4VEmModel.cc:286
void SetParticleChange(G4VParticleChange *, G4VEmFluctuationModel *f=0)
Definition: G4VEmModel.cc:318
G4VParticleChange * pParticleChange
Definition: G4VEmModel.hh:351
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.hh:459
virtual void DefineForRegion(const G4Region *)
Definition: G4VEmModel.cc:249
virtual G4double MinPrimaryEnergy(const G4Material *, const G4ParticleDefinition *)
Definition: G4VEmModel.cc:295
virtual void SetupForMaterial(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
Definition: G4VEmModel.cc:311
G4VEmModel(const G4String &nam)
Definition: G4VEmModel.cc:61
virtual G4double GetChargeSquareRatio(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
Definition: G4VEmModel.cc:262
virtual G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=DBL_MAX)
Definition: G4VEmModel.cc:177
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
Definition: G4VEmModel.cc:123
void SetCrossSectionTable(G4PhysicsTable *)
Definition: G4VEmModel.cc:326
virtual ~G4VEmModel()
Definition: G4VEmModel.cc:77
virtual void StartTracking(G4Track *)
Definition: G4VEmModel.cc:211
virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition *, G4double kineticEnergy)
Definition: G4VEmModel.cc:303
virtual G4double ChargeSquareRatio(const G4Track &)
Definition: G4VEmModel.cc:254
G4ParticleChangeForLoss * GetParticleChangeForLoss()
Definition: G4VEmModel.cc:95
Definition: DoubConv.h:17
#define DBL_MAX
Definition: templates.hh:83