Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4EmCalculator.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: G4EmCalculator
34//
35// Author: Vladimir Ivanchenko
36//
37// Creation date: 28.06.2004
38//
39// Modifications:
40// 12.09.2004 Add verbosity (V.Ivanchenko)
41// 17.11.2004 Change signature of methods, add new methods (V.Ivanchenko)
42// 08.04.2005 Major optimisation of internal interfaces (V.Ivantchenko)
43// 08.05.2005 Use updated interfaces (V.Ivantchenko)
44// 23.10.2005 Fix computations for ions (V.Ivantchenko)
45// 11.01.2006 Add GetCSDARange (V.Ivantchenko)
46// 26.01.2006 Rename GetRange -> GetRangeFromRestricteDEDX (V.Ivanchenko)
47// 14.03.2006 correction in GetCrossSectionPerVolume (mma)
48// suppress GetCrossSectionPerAtom
49// elm->GetA() in ComputeCrossSectionPerAtom
50// 22.03.2006 Add ComputeElectronicDEDX and ComputeTotalDEDX (V.Ivanchenko)
51// 13.05.2006 Add Corrections for ion stopping (V.Ivanchenko)
52// 29.09.2006 Uncomment computation of smoothing factor (V.Ivanchenko)
53// 27.10.2006 Change test energy to access lowEnergy model from
54// 10 keV to 1 keV (V. Ivanchenko)
55// 15.03.2007 Add ComputeEnergyCutFromRangeCut methods (V.Ivanchenko)
56// 21.04.2008 Updated computations for ions (V.Ivanchenko)
57//
58// Class Description:
59//
60// -------------------------------------------------------------------
61//
62//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
63//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
64
65#include "G4EmCalculator.hh"
66#include "G4SystemOfUnits.hh"
67#include "G4LossTableManager.hh"
68#include "G4VEmProcess.hh"
71#include "G4Material.hh"
74#include "G4ParticleTable.hh"
75#include "G4PhysicsTable.hh"
77#include "G4ProcessManager.hh"
79#include "G4RegionStore.hh"
80#include "G4Element.hh"
81#include "G4EmCorrections.hh"
82#include "G4GenericIon.hh"
83#include "G4ProcessVector.hh"
84#include "G4Gamma.hh"
85
86//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
87
89{
91 corr = manager->EmCorrections();
92 nLocalMaterials = 0;
93 verbose = 0;
94 currentCoupleIndex = 0;
95 currentCouple = 0;
96 currentMaterial = 0;
97 currentParticle = 0;
98 lambdaParticle = 0;
99 baseParticle = 0;
100 currentLambda = 0;
101 currentModel = 0;
102 currentProcess = 0;
103 loweModel = 0;
104 chargeSquare = 1.0;
105 massRatio = 1.0;
106 mass = 0.0;
107 currentCut = 0.0;
108 currentParticleName= "";
109 currentMaterialName= "";
110 currentName = "";
111 lambdaName = "";
112 theGenericIon = G4GenericIon::GenericIon();
113 ionEffCharge = new G4ionEffectiveCharge();
114 isIon = false;
115 isApplicable = false;
116}
117
118//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
119
121{
122 delete ionEffCharge;
123 for (G4int i=0; i<nLocalMaterials; ++i) {
124 delete localCouples[i];
125 }
126}
127
128//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
129
131 const G4Material* mat, const G4Region* region)
132{
133 G4double res = 0.0;
134 const G4MaterialCutsCouple* couple = FindCouple(mat, region);
135 if(couple && UpdateParticle(p, kinEnergy) ) {
136 res = manager->GetDEDX(p, kinEnergy, couple);
137
138 if(isIon) {
139 if(FindEmModel(p, currentProcessName, kinEnergy)) {
140 G4double length = CLHEP::nm;
141 G4double eloss = res*length;
142 //G4cout << "### GetDEDX: E= " << kinEnergy << " dedx0= " << res
143 // << " de= " << eloss << G4endl;;
144 G4double niel = 0.0;
145 dynParticle.SetKineticEnergy(kinEnergy);
146 currentModel->GetChargeSquareRatio(p, mat, kinEnergy);
147 currentModel->CorrectionsAlongStep(couple,&dynParticle,eloss,niel,length);
148 res = eloss/length;
149 //G4cout << " de1= " << eloss << " res1= " << res
150 // << " " << p->GetParticleName() <<G4endl;;
151 }
152 }
153
154 if(verbose>0) {
155 G4cout << "G4EmCalculator::GetDEDX: E(MeV)= " << kinEnergy/MeV
156 << " DEDX(MeV/mm)= " << res*mm/MeV
157 << " DEDX(MeV*cm^2/g)= " << res*gram/(MeV*cm2*mat->GetDensity())
158 << " " << p->GetParticleName()
159 << " in " << mat->GetName()
160 << " isIon= " << isIon
161 << G4endl;
162 }
163 }
164 return res;
165}
166
167//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
168
170 const G4String& material, const G4String& reg)
171{
172 return GetDEDX(kinEnergy,FindParticle(particle),
173 FindMaterial(material),FindRegion(reg));
174}
175
176//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
177
179 const G4ParticleDefinition* p,
180 const G4Material* mat,
181 const G4Region* region)
182{
183 G4double res = 0.0;
184 const G4MaterialCutsCouple* couple = FindCouple(mat,region);
185 if(couple && UpdateParticle(p, kinEnergy)) {
186 res = manager->GetRangeFromRestricteDEDX(p, kinEnergy, couple);
187 if(verbose>0) {
188 G4cout << "G4EmCalculator::GetRange: E(MeV)= " << kinEnergy/MeV
189 << " range(mm)= " << res/mm
190 << " " << p->GetParticleName()
191 << " in " << mat->GetName()
192 << G4endl;
193 }
194 }
195 return res;
196}
197
198//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
199
201 const G4ParticleDefinition* p,
202 const G4Material* mat,
203 const G4Region* region)
204{
205 G4double res = 0.0;
206 const G4MaterialCutsCouple* couple = FindCouple(mat,region);
207 if(couple && UpdateParticle(p, kinEnergy)) {
208 res = manager->GetCSDARange(p, kinEnergy, couple);
209 if(verbose>0) {
210 G4cout << "G4EmCalculator::GetRange: E(MeV)= " << kinEnergy/MeV
211 << " range(mm)= " << res/mm
212 << " " << p->GetParticleName()
213 << " in " << mat->GetName()
214 << G4endl;
215 }
216 }
217 return res;
218}
219
220//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
221
223 const G4ParticleDefinition* p,
224 const G4Material* mat,
225 const G4Region* region)
226{
227 G4double res = 0.0;
228 const G4MaterialCutsCouple* couple = FindCouple(mat,region);
229 if(couple && UpdateParticle(p, kinEnergy)) {
230 res = manager->GetRange(p, kinEnergy, couple);
231 if(verbose>0) {
232 G4cout << "G4EmCalculator::GetRange: E(MeV)= " << kinEnergy/MeV
233 << " range(mm)= " << res/mm
234 << " " << p->GetParticleName()
235 << " in " << mat->GetName()
236 << G4endl;
237 }
238 }
239 return res;
240}
241
242//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
243
245 const G4String& particle,
246 const G4String& material,
247 const G4String& reg)
248{
249 return GetRangeFromRestricteDEDX(kinEnergy,FindParticle(particle),
250 FindMaterial(material),FindRegion(reg));
251}
252
253//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
254
256 const G4String& particle,
257 const G4String& material,
258 const G4String& reg)
259{
260 return GetCSDARange(kinEnergy,FindParticle(particle),
261 FindMaterial(material),FindRegion(reg));
262}
263
264//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
265
267 const G4String& particle,
268 const G4String& material,
269 const G4String& reg)
270{
271 return GetRange(kinEnergy,FindParticle(particle),
272 FindMaterial(material),FindRegion(reg));
273}
274
275//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
276
278 const G4ParticleDefinition* p,
279 const G4Material* mat,
280 const G4Region* region)
281{
282 G4double res = 0.0;
283 const G4MaterialCutsCouple* couple = FindCouple(mat,region);
284 if(couple && UpdateParticle(p, 1.0*GeV)) {
285 res = manager->GetEnergy(p, range, couple);
286 if(verbose>0) {
287 G4cout << "G4EmCalculator::GetKinEnergy: Range(mm)= " << range/mm
288 << " KinE(MeV)= " << res/MeV
289 << " " << p->GetParticleName()
290 << " in " << mat->GetName()
291 << G4endl;
292 }
293 }
294 return res;
295}
296
297//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
298
300 const G4String& material, const G4String& reg)
301{
302 return GetKinEnergy(range,FindParticle(particle),
303 FindMaterial(material),FindRegion(reg));
304}
305
306//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
307
309 const G4ParticleDefinition* p,
310 const G4String& processName,
311 const G4Material* mat,
312 const G4Region* region)
313{
314 G4double res = 0.0;
315 const G4MaterialCutsCouple* couple = FindCouple(mat,region);
316
317 if(couple && UpdateParticle(p, kinEnergy)) {
318 G4int idx = couple->GetIndex();
319 FindLambdaTable(p, processName, kinEnergy);
320
321 if(currentLambda) {
322 G4double e = kinEnergy*massRatio;
323 res = (((*currentLambda)[idx])->Value(e))*chargeSquare;
324 } else {
325 res = ComputeCrossSectionPerVolume(kinEnergy, p, processName, mat,
326 kinEnergy);
327 }
328 if(verbose>0) {
329 G4cout << "G4EmCalculator::GetXSPerVolume: E(MeV)= " << kinEnergy/MeV
330 << " cross(cm-1)= " << res*cm
331 << " " << p->GetParticleName()
332 << " in " << mat->GetName();
333 if(verbose>1)
334 G4cout << " idx= " << idx << " Escaled((MeV)= "
335 << kinEnergy*massRatio
336 << " q2= " << chargeSquare;
337 G4cout << G4endl;
338 }
339 }
340 return res;
341}
342
343//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
344
346 const G4String& particle,
347 const G4String& processName,
348 const G4String& material,
349 const G4String& reg)
350{
351 return GetCrossSectionPerVolume(kinEnergy,FindParticle(particle),processName,
352 FindMaterial(material),FindRegion(reg));
353}
354
355//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
356
358 const G4String& particle,
359 G4int Z,
361 G4double kinEnergy)
362{
363 G4double res = 0.0;
364 const G4ParticleDefinition* p = FindParticle(particle);
365 G4VAtomDeexcitation* ad = manager->AtomDeexcitation();
366 if(p && ad) {
367 res = ad->GetShellIonisationCrossSectionPerAtom(p, Z, shell, kinEnergy);
368 }
369 return res;
370}
371
372//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
373
375 const G4ParticleDefinition* p,
376 const G4String& processName,
377 const G4Material* mat,
378 const G4Region* region)
379{
380 G4double res = DBL_MAX;
381 G4double x = GetCrossSectionPerVolume(kinEnergy,p, processName, mat,region);
382 if(x > 0.0) { res = 1.0/x; }
383 if(verbose>1) {
384 G4cout << "G4EmCalculator::GetMeanFreePath: E(MeV)= " << kinEnergy/MeV
385 << " MFP(mm)= " << res/mm
386 << " " << p->GetParticleName()
387 << " in " << mat->GetName()
388 << G4endl;
389 }
390 return res;
391}
392
393//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
394
396 const G4String& particle,
397 const G4String& processName,
398 const G4String& material,
399 const G4String& reg)
400{
401 return GetMeanFreePath(kinEnergy,FindParticle(particle),processName,
402 FindMaterial(material),FindRegion(reg));
403}
404
405//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
406
408{
409 const G4VEnergyLossProcess* elp = FindEnergyLossProcess(p);
410 G4cout << "##### DEDX Table for " << p->GetParticleName() << G4endl;
411 if(elp) G4cout << *(elp->DEDXTable()) << G4endl;
412}
413
414//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
415
417{
418 const G4VEnergyLossProcess* elp = FindEnergyLossProcess(p);
419 G4cout << "##### Range Table for " << p->GetParticleName() << G4endl;
420 if(elp) G4cout << *(elp->RangeTableForLoss()) << G4endl;
421}
422
423//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
424
426{
427 const G4VEnergyLossProcess* elp = FindEnergyLossProcess(p);
428 G4cout << "### G4EmCalculator: Inverse Range Table for "
429 << p->GetParticleName() << G4endl;
430 if(elp) G4cout << *(elp->InverseRangeTable()) << G4endl;
431}
432
433//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
434
436 const G4ParticleDefinition* p,
437 const G4String& processName,
438 const G4Material* mat,
439 G4double cut)
440{
441 currentMaterial = mat;
442 currentMaterialName = mat->GetName();
443 G4double res = 0.0;
444 if(verbose > 1) {
445 G4cout << "### G4EmCalculator::ComputeDEDX: " << p->GetParticleName()
446 << " in " << currentMaterialName
447 << " e(MeV)= " << kinEnergy/MeV << " cut(MeV)= " << cut/MeV
448 << G4endl;
449 }
450 if(UpdateParticle(p, kinEnergy)) {
451 if(FindEmModel(p, processName, kinEnergy)) {
452 G4double escaled = kinEnergy*massRatio;
453 if(baseParticle) {
454 res = currentModel->ComputeDEDXPerVolume(
455 mat, baseParticle, escaled, cut) * chargeSquare;
456 if(verbose > 1) {
457 G4cout << baseParticle->GetParticleName()
458 << " Escaled(MeV)= " << escaled;
459 }
460 } else {
461 res = currentModel->ComputeDEDXPerVolume(mat, p, kinEnergy, cut);
462 if(verbose > 1) { G4cout << " no basePart E(MeV)= " << kinEnergy << " "; }
463 }
464 if(verbose > 1) {
465 G4cout << currentModel->GetName() << ": DEDX(MeV/mm)= " << res*mm/MeV
466 << " DEDX(MeV*cm^2/g)= "
467 << res*gram/(MeV*cm2*mat->GetDensity())
468 << G4endl;
469 }
470
471 // emulate smoothing procedure
472 G4double eth = currentModel->LowEnergyLimit();
473 // G4cout << "massRatio= " << massRatio << " eth= " << eth << G4endl;
474 if(loweModel) {
475 G4double res0 = 0.0;
476 G4double res1 = 0.0;
477 if(baseParticle) {
478 res1 = currentModel->ComputeDEDXPerVolume(mat, baseParticle, eth, cut)
479 * chargeSquare;
480 res0 = loweModel->ComputeDEDXPerVolume(mat, baseParticle, eth, cut)
481 * chargeSquare;
482 } else {
483 res1 = currentModel->ComputeDEDXPerVolume(mat, p, eth, cut);
484 res0 = loweModel->ComputeDEDXPerVolume(mat, p, eth, cut);
485 }
486 if(verbose > 1) {
487 G4cout << "At boundary energy(MeV)= " << eth/MeV
488 << " DEDX(MeV/mm)= " << res1*mm/MeV
489 << G4endl;
490 }
491
492 //G4cout << "eth= " << eth << " escaled= " << escaled
493 // << " res0= " << res0 << " res1= "
494 // << res1 << " q2= " << chargeSquare << G4endl;
495
496 if(res1 > 0.0 && escaled > 0.0) {
497 res *= (1.0 + (res0/res1 - 1.0)*eth/escaled);
498 }
499 }
500
501 // low energy correction for ions
502 if(isIon) {
503 G4double length = CLHEP::nm;
504 const G4Region* r = 0;
505 const G4MaterialCutsCouple* couple = FindCouple(mat, r);
506 G4double eloss = res*length;
507 G4double niel = 0.0;
508 dynParticle.SetKineticEnergy(kinEnergy);
509 currentModel->GetChargeSquareRatio(p, mat, kinEnergy);
510 currentModel->CorrectionsAlongStep(couple,&dynParticle,eloss,niel,length);
511 res = eloss/length;
512
513 if(verbose > 1) {
514 G4cout << "After Corrections: DEDX(MeV/mm)= " << res*mm/MeV
515 << " DEDX(MeV*cm^2/g)= " << res*gram/(MeV*cm2*mat->GetDensity())
516 << G4endl;
517 }
518 }
519 }
520
521 if(verbose > 0) {
522 G4cout << "Sum: E(MeV)= " << kinEnergy/MeV
523 << " DEDX(MeV/mm)= " << res*mm/MeV
524 << " DEDX(MeV*cm^2/g)= " << res*gram/(MeV*cm2*mat->GetDensity())
525 << " cut(MeV)= " << cut/MeV
526 << " " << p->GetParticleName()
527 << " in " << currentMaterialName
528 << " Zi^2= " << chargeSquare
529 << " isIon=" << isIon
530 << G4endl;
531 }
532 }
533 return res;
534}
535
536//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
537
539 const G4ParticleDefinition* part,
540 const G4Material* mat,
541 G4double cut)
542{
543 currentMaterial = mat;
544 currentMaterialName = mat->GetName();
545 G4double dedx = 0.0;
546 if(UpdateParticle(part, kinEnergy)) {
547
549 const std::vector<G4VEnergyLossProcess*> vel =
550 lManager->GetEnergyLossProcessVector();
551 G4int n = vel.size();
552
553 //G4cout << "ComputeElectronicDEDX for " << part->GetParticleName()
554 // << " n= " << n << G4endl;
555
556 for(G4int i=0; i<n; ++i) {
557 if(vel[i]) {
558 G4VProcess* p = reinterpret_cast<G4VProcess*>(vel[i]);
559 if(ActiveForParticle(part, p)) {
560 //G4cout << "idx= " << i << " " << (vel[i])->GetProcessName()
561 // << " " << (vel[i])->Particle()->GetParticleName() << G4endl;
562 dedx += ComputeDEDX(kinEnergy,part,(vel[i])->GetProcessName(),mat,cut);
563 }
564 }
565 }
566 }
567 return dedx;
568}
569
570//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
571
573 const G4String& mat, G4double cut)
574{
575 return ComputeElectronicDEDX(kinEnergy,FindParticle(part),FindMaterial(mat),cut);
576}
577
578//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
579
581 const G4ParticleDefinition* part,
582 const G4Material* mat,
583 G4double cut)
584{
585 G4double dedx = ComputeElectronicDEDX(kinEnergy,part,mat,cut);
586 if(mass > 700.*MeV) { dedx += ComputeNuclearDEDX(kinEnergy,part,mat); }
587 return dedx;
588}
589
590//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
591
593 const G4String& part,
594 const G4String& mat,
595 G4double cut)
596{
597 return ComputeTotalDEDX(kinEnergy,FindParticle(part),FindMaterial(mat),cut);
598}
599
600//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
601
603 const G4String& particle,
604 const G4String& processName,
605 const G4String& material,
606 G4double cut)
607{
608 return ComputeDEDX(kinEnergy,FindParticle(particle),processName,
609 FindMaterial(material),cut);
610}
611
612//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
613
615 const G4ParticleDefinition* p,
616 const G4Material* mat)
617{
618
619 G4double res = corr->NuclearDEDX(p, mat, kinEnergy, false);
620
621 if(verbose > 1) {
622 G4cout << p->GetParticleName() << " E(MeV)= " << kinEnergy/MeV
623 << " NuclearDEDX(MeV/mm)= " << res*mm/MeV
624 << " NuclearDEDX(MeV*cm^2/g)= "
625 << res*gram/(MeV*cm2*mat->GetDensity())
626 << G4endl;
627 }
628 return res;
629}
630
631//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
632
634 const G4String& particle,
635 const G4String& material)
636{
637 return ComputeNuclearDEDX(kinEnergy,FindParticle(particle),
638 FindMaterial(material));
639}
640
641//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
642
644 G4double kinEnergy,
645 const G4ParticleDefinition* p,
646 const G4String& processName,
647 const G4Material* mat,
648 G4double cut)
649{
650 currentMaterial = mat;
651 currentMaterialName = mat->GetName();
652 G4double res = 0.0;
653 if(UpdateParticle(p, kinEnergy)) {
654 if(FindEmModel(p, processName, kinEnergy)) {
655 G4double e = kinEnergy;
656 if(baseParticle) {
657 e *= kinEnergy*massRatio;
658 res = currentModel->CrossSectionPerVolume(
659 mat, baseParticle, e, cut, e) * chargeSquare;
660 } else {
661 res = currentModel->CrossSectionPerVolume(mat, p, e, cut, e);
662 }
663 if(verbose>0) {
664 G4cout << "G4EmCalculator::ComputeXSPerVolume: E(MeV)= " << kinEnergy/MeV
665 << " cross(cm-1)= " << res*cm
666 << " cut(keV)= " << cut/keV
667 << " " << p->GetParticleName()
668 << " in " << mat->GetName()
669 << G4endl;
670 }
671 }
672 }
673 return res;
674}
675
676//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
677
679 G4double kinEnergy,
680 const G4String& particle,
681 const G4String& processName,
682 const G4String& material,
683 G4double cut)
684{
685 return ComputeCrossSectionPerVolume(kinEnergy,FindParticle(particle),
686 processName,
687 FindMaterial(material),cut);
688}
689
690//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
691
693 G4double kinEnergy,
694 const G4ParticleDefinition* p,
695 const G4String& processName,
696 G4double Z, G4double A,
697 G4double cut)
698{
699 G4double res = 0.0;
700 if(UpdateParticle(p, kinEnergy)) {
701 if(FindEmModel(p, processName, kinEnergy)) {
702 G4double e = kinEnergy;
703 if(baseParticle) {
704 e *= kinEnergy*massRatio;
705 res = currentModel->ComputeCrossSectionPerAtom(
706 baseParticle, e, Z, A, cut) * chargeSquare;
707 } else {
708 res = currentModel->ComputeCrossSectionPerAtom(p, e, Z, A, cut);
709 }
710 if(verbose>0) {
711 G4cout << "E(MeV)= " << kinEnergy/MeV
712 << " cross(barn)= " << res/barn
713 << " " << p->GetParticleName()
714 << " Z= " << Z << " A= " << A/(g/mole) << " g/mole"
715 << G4endl;
716 }
717 }
718 }
719 return res;
720}
721
722//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
723
725 const G4String& particle,
726 const G4String& processName,
727 const G4Element* elm,
728 G4double cut)
729{
730 return ComputeCrossSectionPerAtom(kinEnergy,FindParticle(particle),
731 processName,
732 elm->GetZ(),elm->GetN(),cut);
733}
734
735//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
736
739 const G4Material* mat)
740{
741 G4double res = 0.0;
742 const G4ParticleDefinition* gamma = G4Gamma::Gamma();
743 res += ComputeCrossSectionPerVolume(kinEnergy, gamma, "conv", mat, 0.0);
744 res += ComputeCrossSectionPerVolume(kinEnergy, gamma, "compt", mat, 0.0);
745 res += ComputeCrossSectionPerVolume(kinEnergy, gamma, "phot", mat, 0.0);
746 res += ComputeCrossSectionPerVolume(kinEnergy, gamma, "Rayl", mat, 0.0);
747 if(res > 0.0) { res = 1.0/res; }
748 return res;
749}
750
751//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
752
754 const G4String& particle,
755 G4int Z,
757 G4double kinEnergy,
758 const G4Material* mat)
759{
760 G4double res = 0.0;
761 const G4ParticleDefinition* p = FindParticle(particle);
762 G4VAtomDeexcitation* ad = manager->AtomDeexcitation();
763 if(p && ad) {
764 res = ad->ComputeShellIonisationCrossSectionPerAtom(p, Z, shell,
765 kinEnergy, mat);
766 }
767 return res;
768}
769
770//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
771
773 const G4ParticleDefinition* p,
774 const G4String& processName,
775 const G4Material* mat,
776 G4double cut)
777{
778 G4double mfp = DBL_MAX;
779 G4double x = ComputeCrossSectionPerVolume(kinEnergy, p, processName, mat, cut);
780 if(x > 0.0) { mfp = 1.0/x; }
781 if(verbose>1) {
782 G4cout << "E(MeV)= " << kinEnergy/MeV
783 << " MFP(mm)= " << mfp/mm
784 << " " << p->GetParticleName()
785 << " in " << mat->GetName()
786 << G4endl;
787 }
788 return mfp;
789}
790
791//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
792
794 const G4String& particle,
795 const G4String& processName,
796 const G4String& material,
797 G4double cut)
798{
799 return ComputeMeanFreePath(kinEnergy,FindParticle(particle),processName,
800 FindMaterial(material),cut);
801}
802
803//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
804
806 G4double range,
807 const G4ParticleDefinition* part,
808 const G4Material* mat)
809{
811 ConvertRangeToEnergy(part, mat, range);
812}
813
814//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
815
817 G4double range,
818 const G4String& particle,
819 const G4String& material)
820{
821 return ComputeEnergyCutFromRangeCut(range,FindParticle(particle),
822 FindMaterial(material));
823}
824
825
826//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
827
828G4bool G4EmCalculator::UpdateParticle(const G4ParticleDefinition* p,
829 G4double kinEnergy)
830{
831 if(p != currentParticle) {
832
833 // new particle
834 currentParticle = p;
835 dynParticle.SetDefinition(const_cast<G4ParticleDefinition*>(p));
836 dynParticle.SetKineticEnergy(kinEnergy);
837 baseParticle = 0;
838 currentParticleName = p->GetParticleName();
839 massRatio = 1.0;
840 mass = p->GetPDGMass();
841 chargeSquare = 1.0;
842 currentProcess = FindEnergyLossProcess(p);
843 currentProcessName = "";
844 isIon = false;
845
846 // ionisation process exist
847 if(currentProcess) {
848 currentProcessName = currentProcess->GetProcessName();
849 baseParticle = currentProcess->BaseParticle();
850
851 // base particle is used
852 if(baseParticle) {
853 massRatio = baseParticle->GetPDGMass()/p->GetPDGMass();
854 G4double q = p->GetPDGCharge()/baseParticle->GetPDGCharge();
855 chargeSquare = q*q;
856 }
857
858 if(p->GetParticleType() == "nucleus"
859 && currentParticleName != "deuteron"
860 && currentParticleName != "triton"
861 && currentParticleName != "alpha+"
862 && currentParticleName != "helium"
863 && currentParticleName != "hydrogen"
864 ) {
865 isIon = true;
866 massRatio = theGenericIon->GetPDGMass()/p->GetPDGMass();
867 baseParticle = theGenericIon;
868 // G4cout << p->GetParticleName()
869 // << " in " << currentMaterial->GetName()
870 // << " e= " << kinEnergy << G4endl;
871 }
872 }
873 }
874
875 // Effective charge for ions
876 if(isIon) {
877 chargeSquare =
878 corr->EffectiveChargeSquareRatio(p, currentMaterial, kinEnergy)
879 * corr->EffectiveChargeCorrection(p,currentMaterial,kinEnergy);
880 if(currentProcess) {
881 currentProcess->SetDynamicMassCharge(massRatio,chargeSquare);
882 //G4cout << "NewP: massR= " << massRatio << " q2= " << chargeSquare << G4endl;
883 }
884 }
885 return true;
886}
887
888//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
889
891{
892 const G4ParticleDefinition* p = 0;
893 if(name != currentParticleName) {
895 if(!p) {
896 G4cout << "### WARNING: G4EmCalculator::FindParticle fails to find "
897 << name << G4endl;
898 }
899 } else {
900 p = currentParticle;
901 }
902 return p;
903}
904
905//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
906
908{
909 const G4ParticleDefinition* p =
911 return p;
912}
913
914//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
915
917{
918 if(name != currentMaterialName) {
919 currentMaterial = G4Material::GetMaterial(name);
920 currentMaterialName = name;
921 if(!currentMaterial)
922 G4cout << "### WARNING: G4EmCalculator::FindMaterial fails to find "
923 << name << G4endl;
924 }
925 return currentMaterial;
926}
927
928//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
929
931{
932 const G4Region* r = 0;
933 if(reg != "" && reg != "world") {
935 } else {
936 r = G4RegionStore::GetInstance()->GetRegion("DefaultRegionForTheWorld");
937 }
938 return r;
939}
940
941//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
942
944 const G4Material* material,
945 const G4Region* region)
946{
947 if(!material) return 0;
948 currentMaterial = material;
949 currentMaterialName = material->GetName();
950 // Access to materials
951 const G4ProductionCutsTable* theCoupleTable=
953 const G4Region* r = region;
954 if(!r) {
955 r = G4RegionStore::GetInstance()->GetRegion("DefaultRegionForTheWorld");
956 }
957 return theCoupleTable->GetMaterialCutsCouple(material,r->GetProductionCuts());
958
959}
960
961//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
962
963G4bool G4EmCalculator::UpdateCouple(const G4Material* material, G4double cut)
964{
965 if(!material) return false;
966 currentMaterial = material;
967 currentMaterialName = material->GetName();
968 for (G4int i=0; i<nLocalMaterials; ++i) {
969 if(material == localMaterials[i] && cut == localCuts[i]) {
970 currentCouple = localCouples[i];
971 currentCoupleIndex = currentCouple->GetIndex();
972 currentCut = cut;
973 return true;
974 }
975 }
976 const G4MaterialCutsCouple* cc = new G4MaterialCutsCouple(material);
977 localMaterials.push_back(material);
978 localCouples.push_back(cc);
979 localCuts.push_back(cut);
980 nLocalMaterials++;
981 currentCouple = cc;
982 currentCoupleIndex = currentCouple->GetIndex();
983 currentCut = cut;
984 return true;
985}
986
987//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
988
989void G4EmCalculator::FindLambdaTable(const G4ParticleDefinition* p,
990 const G4String& processName,
991 G4double kinEnergy)
992{
993 // Search for the process
994 if (!currentLambda || p != lambdaParticle || processName != lambdaName) {
995 lambdaName = processName;
996 currentLambda = 0;
997 lambdaParticle = p;
998
999 const G4ParticleDefinition* part = p;
1000 if(isIon) { part = theGenericIon; }
1001
1002 // Search for energy loss process
1003 currentName = processName;
1004 currentModel = 0;
1005 loweModel = 0;
1006
1007 G4VEnergyLossProcess* elproc = FindEnLossProcess(part, processName);
1008 if(elproc) {
1009 currentLambda = elproc->LambdaTable();
1010 if(currentLambda) {
1011 isApplicable = true;
1012 if(verbose>1) {
1013 G4cout << "G4VEnergyLossProcess is found out: " << currentName
1014 << G4endl;
1015 }
1016 }
1017 return;
1018 }
1019
1020 // Search for discrete process
1021 G4VEmProcess* proc = FindDiscreteProcess(part, processName);
1022 if(proc) {
1023 currentLambda = proc->LambdaTable();
1024 if(currentLambda) {
1025 isApplicable = true;
1026 if(verbose>1) {
1027 G4cout << "G4VEmProcess is found out: " << currentName << G4endl;
1028 }
1029 }
1030 return;
1031 }
1032
1033 // Search for msc process
1034 G4VMultipleScattering* msc = FindMscProcess(part, processName);
1035 if(msc) {
1036 currentModel = msc->SelectModel(kinEnergy,0);
1037 /*
1038 if(currentModel) {
1039 currentLambda = currentModel->GetCrossSectionTable();
1040 if(currentLambda) {
1041 isApplicable = true;
1042 if(verbose>1) {
1043 G4cout << "G4VMultipleScattering is found out: " << currentName
1044 << G4endl;
1045 }
1046 }
1047 }
1048 */
1049 }
1050 }
1051}
1052
1053//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1054
1055G4bool G4EmCalculator::FindEmModel(const G4ParticleDefinition* p,
1056 const G4String& processName,
1057 G4double kinEnergy)
1058{
1059 isApplicable = false;
1060 if(!p) {
1061 G4cout << "G4EmCalculator::FindEmModel WARNING: no particle defined"
1062 << G4endl;
1063 return isApplicable;
1064 }
1065 G4String partname = p->GetParticleName();
1066 const G4ParticleDefinition* part = p;
1067 G4double scaledEnergy = kinEnergy*massRatio;
1068 if(isIon) { part = theGenericIon; }
1069
1070 if(verbose > 1) {
1071 G4cout << "## G4EmCalculator::FindEmModel for " << partname
1072 << " (type= " << p->GetParticleType()
1073 << ") and " << processName << " at E(MeV)= " << scaledEnergy
1074 << G4endl;
1075 if(p != part) { G4cout << " GenericIon is the base particle" << G4endl; }
1076 }
1077
1078 // Search for energy loss process
1079 currentName = processName;
1080 currentModel = 0;
1081 loweModel = 0;
1082 size_t idx = 0;
1083
1084 G4VEnergyLossProcess* elproc = FindEnLossProcess(part, processName);
1085 if(elproc) {
1086 currentModel = elproc->SelectModelForMaterial(scaledEnergy, idx);
1087 G4double eth = currentModel->LowEnergyLimit();
1088 if(eth > 0.0) {
1089 loweModel = elproc->SelectModelForMaterial(eth - CLHEP::eV, idx);
1090 if(loweModel == currentModel) { loweModel = 0; }
1091 }
1092 }
1093
1094 // Search for discrete process
1095 if(!currentModel) {
1096 G4VEmProcess* proc = FindDiscreteProcess(part, processName);
1097 if(proc) {
1098 currentModel = proc->SelectModelForMaterial(kinEnergy, idx);
1099 G4double eth = currentModel->LowEnergyLimit();
1100 if(eth > 0.0) {
1101 loweModel = proc->SelectModelForMaterial(eth - CLHEP::eV, idx);
1102 if(loweModel == currentModel) { loweModel = 0; }
1103 }
1104 }
1105 }
1106
1107 // Search for msc process
1108 if(!currentModel) {
1109 G4VMultipleScattering* proc = FindMscProcess(part, processName);
1110 if(proc) {
1111 currentModel = proc->SelectModel(kinEnergy, idx);
1112 loweModel = 0;
1113 }
1114 }
1115 if(currentModel) {
1116 if(loweModel == currentModel) { loweModel = 0; }
1117 isApplicable = true;
1118 if(verbose > 1) {
1119 G4cout << " Model <" << currentModel->GetName()
1120 << "> Emin(MeV)= " << currentModel->LowEnergyLimit()/MeV
1121 << " for " << part->GetParticleName();
1122 if(elproc) {
1123 G4cout << " and " << elproc->GetProcessName() << " " << elproc
1124 << G4endl;
1125 }
1126 if(loweModel) {
1127 G4cout << " LowEnergy model <" << loweModel->GetName() << ">";
1128 }
1129 G4cout << G4endl;
1130 }
1131 }
1132 return isApplicable;
1133}
1134
1135//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1136
1137G4VEnergyLossProcess* G4EmCalculator::FindEnergyLossProcess(
1138 const G4ParticleDefinition* p)
1139{
1140 G4VEnergyLossProcess* elp = 0;
1141 G4String partname = p->GetParticleName();
1142 const G4ParticleDefinition* part = p;
1143
1144 if(p->GetParticleType() == "nucleus"
1145 && currentParticleName != "deuteron"
1146 && currentParticleName != "triton"
1147 && currentParticleName != "alpha+"
1148 && currentParticleName != "helium"
1149 && currentParticleName != "hydrogen"
1150 ) { part = theGenericIon; }
1151
1153 return elp;
1154}
1155
1156//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1157
1159G4EmCalculator::FindEnLossProcess(const G4ParticleDefinition* part,
1160 const G4String& processName)
1161{
1162 G4VEnergyLossProcess* proc = 0;
1163 const std::vector<G4VEnergyLossProcess*> v =
1165 G4int n = v.size();
1166 for(G4int i=0; i<n; ++i) {
1167 if((v[i])->GetProcessName() == processName) {
1168 G4VProcess* p = reinterpret_cast<G4VProcess*>(v[i]);
1169 if(ActiveForParticle(part, p)) {
1170 proc = v[i];
1171 break;
1172 }
1173 }
1174 }
1175 return proc;
1176}
1177
1178//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1179
1181G4EmCalculator::FindDiscreteProcess(const G4ParticleDefinition* part,
1182 const G4String& processName)
1183{
1184 G4VEmProcess* proc = 0;
1185 const std::vector<G4VEmProcess*> v =
1187 G4int n = v.size();
1188 for(G4int i=0; i<n; ++i) {
1189 if((v[i])->GetProcessName() == processName) {
1190 G4VProcess* p = reinterpret_cast<G4VProcess*>(v[i]);
1191 if(ActiveForParticle(part, p)) {
1192 proc = v[i];
1193 break;
1194 }
1195 }
1196 }
1197 return proc;
1198}
1199
1200//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1201
1203G4EmCalculator::FindMscProcess(const G4ParticleDefinition* part,
1204 const G4String& processName)
1205{
1206 G4VMultipleScattering* proc = 0;
1207 const std::vector<G4VMultipleScattering*> v =
1209 G4int n = v.size();
1210 for(G4int i=0; i<n; ++i) {
1211 if((v[i])->GetProcessName() == processName) {
1212 G4VProcess* p = reinterpret_cast<G4VProcess*>(v[i]);
1213 if(ActiveForParticle(part, p)) {
1214 proc = v[i];
1215 break;
1216 }
1217 }
1218 }
1219 return proc;
1220}
1221
1222//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1223
1224G4bool G4EmCalculator::ActiveForParticle(const G4ParticleDefinition* part,
1225 G4VProcess* proc)
1226{
1227 G4ProcessManager* pm = part->GetProcessManager();
1228 G4ProcessVector* pv = pm->GetProcessList();
1229 G4int n = pv->size();
1230 G4bool res = false;
1231 for(G4int i=0; i<n; ++i) {
1232 if((*pv)[i] == proc) {
1233 if(pm->GetProcessActivation(i)) { res = true; }
1234 break;
1235 }
1236 }
1237 return res;
1238}
1239
1240//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1241
1243{
1244 verbose = verb;
1245}
1246
1247//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1248
G4AtomicShellEnumerator
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
void SetKineticEnergy(G4double aEnergy)
G4double GetZ() const
Definition: G4Element.hh:131
G4double GetN() const
Definition: G4Element.hh:134
const G4ParticleDefinition * FindParticle(const G4String &)
G4double ComputeMeanFreePath(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=0.0)
G4double GetShellIonisationCrossSectionPerAtom(const G4String &part, G4int Z, G4AtomicShellEnumerator shell, G4double kinEnergy)
G4double GetRangeFromRestricteDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=0)
G4double ComputeTotalDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, G4double cut=DBL_MAX)
G4double ComputeNuclearDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *)
const G4ParticleDefinition * FindIon(G4int Z, G4int A)
G4double ComputeGammaAttenuationLength(G4double kinEnergy, const G4Material *)
G4double ComputeDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=DBL_MAX)
void SetVerbose(G4int val)
G4double ComputeEnergyCutFromRangeCut(G4double range, const G4ParticleDefinition *, const G4Material *)
const G4MaterialCutsCouple * FindCouple(const G4Material *, const G4Region *r=0)
G4double ComputeCrossSectionPerVolume(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=0.0)
G4double ComputeCrossSectionPerAtom(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, G4double Z, G4double A, G4double cut=0.0)
G4double GetCrossSectionPerVolume(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, const G4Region *r=0)
void PrintDEDXTable(const G4ParticleDefinition *)
const G4Region * FindRegion(const G4String &)
G4double GetCSDARange(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=0)
G4double GetKinEnergy(G4double range, const G4ParticleDefinition *, const G4Material *, const G4Region *r=0)
G4double ComputeShellIonisationCrossSectionPerAtom(const G4String &part, G4int Z, G4AtomicShellEnumerator shell, G4double kinEnergy, const G4Material *mat=0)
G4double GetDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=0)
void PrintRangeTable(const G4ParticleDefinition *)
void PrintInverseRangeTable(const G4ParticleDefinition *)
G4double GetMeanFreePath(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, const G4Region *r=0)
G4double GetRange(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=0)
G4double ComputeElectronicDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *mat, G4double cut=DBL_MAX)
const G4Material * FindMaterial(const G4String &)
G4double EffectiveChargeSquareRatio(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double NuclearDEDX(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy, G4bool fluct=true)
G4double EffectiveChargeCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
static G4Gamma * Gamma()
Definition: G4Gamma.cc:86
static G4GenericIon * GenericIon()
Definition: G4GenericIon.cc:92
static G4LossTableManager * Instance()
const std::vector< G4VEmProcess * > & GetEmProcessVector()
G4double GetCSDARange(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
G4VEnergyLossProcess * GetEnergyLossProcess(const G4ParticleDefinition *)
G4double GetEnergy(const G4ParticleDefinition *aParticle, G4double range, const G4MaterialCutsCouple *couple)
const std::vector< G4VMultipleScattering * > & GetMultipleScatteringVector()
const std::vector< G4VEnergyLossProcess * > & GetEnergyLossProcessVector()
G4VAtomDeexcitation * AtomDeexcitation()
G4double GetRangeFromRestricteDEDX(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
G4EmCorrections * EmCorrections()
G4double GetRange(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
G4double GetDEDX(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
G4double GetDensity() const
Definition: G4Material.hh:179
const G4String & GetName() const
Definition: G4Material.hh:177
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
Definition: G4Material.cc:576
G4ProcessManager * GetProcessManager() const
const G4String & GetParticleType() const
G4double GetPDGCharge() const
const G4String & GetParticleName() const
G4ParticleDefinition * FindIon(G4int atomicNumber, G4int atomicMass, G4double excitationEnergy)
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
G4bool GetProcessActivation(G4VProcess *aProcess) const
G4ProcessVector * GetProcessList() const
G4int size() const
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
static G4ProductionCutsTable * GetProductionCutsTable()
static G4RegionStore * GetInstance()
G4Region * GetRegion(const G4String &name, G4bool verbose=true) const
G4ProductionCuts * GetProductionCuts() const
virtual G4double ComputeShellIonisationCrossSectionPerAtom(const G4ParticleDefinition *, G4int Z, G4AtomicShellEnumerator shell, G4double kinE, const G4Material *mat=0)=0
virtual G4double GetShellIonisationCrossSectionPerAtom(const G4ParticleDefinition *, G4int Z, G4AtomicShellEnumerator shell, G4double kinE, const G4Material *mat=0)=0
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
G4double LowEnergyLimit() const
Definition: G4VEmModel.hh:529
virtual G4double CrossSectionPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.cc:186
virtual G4double GetChargeSquareRatio(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
Definition: G4VEmModel.cc:262
const G4String & GetName() const
Definition: G4VEmModel.hh:655
virtual G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=DBL_MAX)
Definition: G4VEmModel.cc:177
G4VEmModel * SelectModelForMaterial(G4double kinEnergy, size_t &idxRegion) const
const G4PhysicsTable * LambdaTable() const
const G4ParticleDefinition * BaseParticle() const
G4PhysicsTable * RangeTableForLoss() const
G4PhysicsTable * LambdaTable()
G4PhysicsTable * InverseRangeTable() const
G4VEmModel * SelectModelForMaterial(G4double kinEnergy, size_t &idx) const
void SetDynamicMassCharge(G4double massratio, G4double charge2ratio)
G4PhysicsTable * DEDXTable() const
G4VEmModel * SelectModel(G4double kinEnergy, size_t idx)
const G4String & GetProcessName() const
Definition: G4VProcess.hh:379
#define DBL_MAX
Definition: templates.hh:83