Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4LossTableManager.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: G4LossTableManager
34//
35// Author: Vladimir Ivanchenko
36//
37// Creation date: 03.01.2002
38//
39// Modifications:
40//
41// 20-01-03 Migrade to cut per region (V.Ivanchenko)
42// 15-02-03 Lambda table can be scaled (V.Ivanchenko)
43// 17-02-03 Fix problem of store/restore tables (V.Ivanchenko)
44// 10-03-03 Add Ion registration (V.Ivanchenko)
45// 25-03-03 Add deregistration (V.Ivanchenko)
46// 02-04-03 Change messenger (V.Ivanchenko)
47// 26-04-03 Fix retrieve tables (V.Ivanchenko)
48// 13-05-03 Add calculation of precise range (V.Ivanchenko)
49// 23-07-03 Add exchange with G4EnergyLossTables (V.Ivanchenko)
50// 05-10-03 Add G4VEmProcesses registration and Verbose command (V.Ivanchenko)
51// 17-10-03 Add SetParameters method (V.Ivanchenko)
52// 23-10-03 Add control on inactive processes (V.Ivanchenko)
53// 04-11-03 Add checks in RetrievePhysicsTable (V.Ivanchenko)
54// 12-11-03 G4EnergyLossSTD -> G4EnergyLossProcess (V.Ivanchenko)
55// 14-01-04 Activate precise range calculation (V.Ivanchenko)
56// 10-03-04 Fix a problem of Precise Range table (V.Ivanchenko)
57// 08-11-04 Migration to new interface of Store/Retrieve tables (V.Ivanchenko)
58// 13-01-04 Fix problem which takes place for inactivate eIoni (V.Ivanchenko)
59// 25-01-04 Fix initialisation problem for ions (V.Ivanchenko)
60// 11-03-05 Shift verbose level by 1 (V.Ivantchenko)
61// 10-01-06 PreciseRange -> CSDARange (V.Ivantchenko)
62// 20-01-06 Introduce G4EmTableType to remove repeating code (VI)
63// 23-03-06 Set flag isIonisation (VI)
64// 10-05-06 Add methods SetMscStepLimitation, FacRange and MscFlag (VI)
65// 22-05-06 Add methods Set/Get bremsTh (VI)
66// 05-06-06 Do not clear loss_table map between runs (VI)
67// 16-01-07 Create new energy loss table for e+,e-,mu+,mu- and
68// left ionisation table for further usage (VI)
69// 12-02-07 Add SetSkin, SetLinearLossLimit (V.Ivanchenko)
70// 18-06-07 Move definition of msc parameters to G4EmProcessOptions (V.Ivanchenko)
71// 21-02-08 Added G4EmSaturation (V.Ivanchenko)
72// 12-04-10 Added PreparePhsyicsTables and BuildPhysicsTables entries (V.Ivanchenko)
73//
74// Class Description:
75//
76// -------------------------------------------------------------------
77//
78//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
79//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
80
81#include "G4LossTableManager.hh"
82#include "G4SystemOfUnits.hh"
84#include "G4PhysicsTable.hh"
87#include "G4ProcessManager.hh"
88#include "G4Electron.hh"
89#include "G4Proton.hh"
91#include "G4VEmProcess.hh"
94#include "G4EmCorrections.hh"
95#include "G4EmSaturation.hh"
96#include "G4EmConfigurator.hh"
97#include "G4ElectronIonPair.hh"
98#include "G4EmTableType.hh"
99#include "G4LossTableBuilder.hh"
100#include "G4VAtomDeexcitation.hh"
101#include "G4Region.hh"
102
103G4LossTableManager* G4LossTableManager::theInstance = 0;
104
105//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
106
108{
109 if(0 == theInstance) {
110 static G4LossTableManager manager;
111 theInstance = &manager;
112 }
113 return theInstance;
114}
115
116//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
117
119{
120 for (G4int i=0; i<n_loss; ++i) {
121 if( loss_vector[i] ) { delete loss_vector[i]; }
122 }
123 size_t msc = msc_vector.size();
124 for (size_t j=0; j<msc; ++j) {
125 if( msc_vector[j] ) { delete msc_vector[j]; }
126 }
127 size_t emp = emp_vector.size();
128 for (size_t k=0; k<emp; ++k) {
129 if( emp_vector[k] ) { delete emp_vector[k]; }
130 }
131 size_t mod = mod_vector.size();
132 for (size_t a=0; a<mod; ++a) {
133 if( mod_vector[a] ) { delete mod_vector[a]; }
134 }
135 size_t fmod = fmod_vector.size();
136 for (size_t b=0; b<fmod; ++b) {
137 if( fmod_vector[b] ) { delete fmod_vector[b]; }
138 }
139 Clear();
140 delete theMessenger;
141 delete tableBuilder;
142 delete emCorrections;
143 delete emSaturation;
144 delete emConfigurator;
145 delete emElectronIonPair;
146 delete atomDeexcitation;
147}
148
149//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
150
151G4LossTableManager::G4LossTableManager()
152{
153 n_loss = 0;
154 run = 0;
155 startInitialisation = false;
156 all_tables_are_built = false;
157 currentLoss = 0;
158 currentParticle = 0;
159 firstParticle = 0;
160 lossFluctuationFlag = true;
161 subCutoffFlag = false;
162 rndmStepFlag = false;
163 minSubRange = 0.0;
164 maxRangeVariation = 1.0;
165 maxFinalStep = 0.0;
166 minKinEnergy = 0.1*keV;
167 maxKinEnergy = 10.0*TeV;
168 nbinsLambda = 77;
169 nbinsPerDecade = 7;
170 maxKinEnergyForMuons = 10.*TeV;
171 integral = true;
172 integralActive = false;
173 buildCSDARange = false;
174 minEnergyActive = false;
175 maxEnergyActive = false;
176 maxEnergyForMuonsActive = false;
177 stepFunctionActive = false;
178 flagLPM = true;
179 splineFlag = true;
180 bremsTh = DBL_MAX;
181 factorForAngleLimit = 1.0;
182 verbose = 1;
183 theMessenger = new G4EnergyLossMessenger();
184 theElectron = G4Electron::Electron();
185 tableBuilder = new G4LossTableBuilder();
186 emCorrections= new G4EmCorrections();
187 emSaturation = new G4EmSaturation();
188 emConfigurator = new G4EmConfigurator(verbose);
189 emElectronIonPair = new G4ElectronIonPair();
190 tableBuilder->SetSplineFlag(splineFlag);
191 atomDeexcitation = 0;
192}
193
194//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
195
197{
198 all_tables_are_built = false;
199 currentLoss = 0;
200 currentParticle = 0;
201 if(n_loss)
202 {
203 dedx_vector.clear();
204 range_vector.clear();
205 inv_range_vector.clear();
206 loss_map.clear();
207 loss_vector.clear();
208 part_vector.clear();
209 base_part_vector.clear();
210 tables_are_built.clear();
211 isActive.clear();
212 n_loss = 0;
213 }
214}
215
216//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
217
219{
220 if(!p) { return; }
221 for (G4int i=0; i<n_loss; ++i) {
222 if(loss_vector[i] == p) { return; }
223 }
224 if(verbose > 1) {
225 G4cout << "G4LossTableManager::Register G4VEnergyLossProcess : "
226 << p->GetProcessName() << " idx= " << n_loss << G4endl;
227 }
228 ++n_loss;
229 loss_vector.push_back(p);
230 part_vector.push_back(0);
231 base_part_vector.push_back(0);
232 dedx_vector.push_back(0);
233 range_vector.push_back(0);
234 inv_range_vector.push_back(0);
235 tables_are_built.push_back(false);
236 isActive.push_back(true);
237 all_tables_are_built = false;
238 if(!lossFluctuationFlag) { p->SetLossFluctuations(false); }
239 if(subCutoffFlag) { p->ActivateSubCutoff(true); }
240 if(rndmStepFlag) { p->SetRandomStep(true); }
241 if(stepFunctionActive) { p->SetStepFunction(maxRangeVariation, maxFinalStep); }
242 if(integralActive) { p->SetIntegral(integral); }
243 if(minEnergyActive) { p->SetMinKinEnergy(minKinEnergy); }
244 if(maxEnergyActive) { p->SetMaxKinEnergy(maxKinEnergy); }
245}
246
247//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
248
250{
251 if(!p) { return; }
252 for (G4int i=0; i<n_loss; ++i) {
253 if(loss_vector[i] == p) { loss_vector[i] = 0; }
254 }
255}
256
257//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
258
260{
261 if(!p) { return; }
262 G4int n = msc_vector.size();
263 for (G4int i=0; i<n; ++i) {
264 if(msc_vector[i] == p) { return; }
265 }
266 if(verbose > 1) {
267 G4cout << "G4LossTableManager::Register G4VMultipleScattering : "
268 << p->GetProcessName() << " idx= " << msc_vector.size() << G4endl;
269 }
270 msc_vector.push_back(p);
271}
272
273//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
274
276{
277 if(!p) { return; }
278 size_t msc = msc_vector.size();
279 for (size_t i=0; i<msc; ++i) {
280 if(msc_vector[i] == p) { msc_vector[i] = 0; }
281 }
282}
283
284//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
285
287{
288 if(!p) { return; }
289 G4int n = emp_vector.size();
290 for (G4int i=0; i<n; ++i) {
291 if(emp_vector[i] == p) { return; }
292 }
293 if(verbose > 1) {
294 G4cout << "G4LossTableManager::Register G4VEmProcess : "
295 << p->GetProcessName() << " idx= " << emp_vector.size() << G4endl;
296 }
297 emp_vector.push_back(p);
298}
299
300//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
301
303{
304 if(!p) { return; }
305 size_t emp = emp_vector.size();
306 for (size_t i=0; i<emp; ++i) {
307 if(emp_vector[i] == p) { emp_vector[i] = 0; }
308 }
309}
310
311//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
312
314{
315 mod_vector.push_back(p);
316 if(verbose > 1) {
317 G4cout << "G4LossTableManager::Register G4VEmModel : "
318 << p->GetName() << G4endl;
319 }
320}
321
322//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
323
325{
326 size_t n = mod_vector.size();
327 for (size_t i=0; i<n; ++i) {
328 if(mod_vector[i] == p) { mod_vector[i] = 0; }
329 }
330}
331
332//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
333
335{
336 fmod_vector.push_back(p);
337 if(verbose > 1) {
338 G4cout << "G4LossTableManager::Register G4VEmFluctuationModel : "
339 << p->GetName() << G4endl;
340 }
341}
342
343//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
344
346{
347 size_t n = fmod_vector.size();
348 for (size_t i=0; i<n; ++i) {
349 if(fmod_vector[i] == p) { fmod_vector[i] = 0; }
350 }
351}
352
353//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
354
357{
358 loss_map[ion] = p;
359}
360
361//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
362
364 const G4ParticleDefinition* part,
366{
367 if(!p || !part) { return; }
368 for (G4int i=0; i<n_loss; ++i) {
369 if(loss_vector[i] == p) { return; }
370 }
371 if(verbose > 1) {
372 G4cout << "G4LossTableManager::RegisterExtraParticle "
373 << part->GetParticleName() << " G4VEnergyLossProcess : "
374 << p->GetProcessName() << " idx= " << n_loss << G4endl;
375 }
376 ++n_loss;
377 loss_vector.push_back(p);
378 part_vector.push_back(part);
379 base_part_vector.push_back(p->BaseParticle());
380 dedx_vector.push_back(0);
381 range_vector.push_back(0);
382 inv_range_vector.push_back(0);
383 tables_are_built.push_back(false);
384 all_tables_are_built = false;
385}
386
387//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
388
389void
392{
393 if (1 < verbose) {
394 G4cout << "G4LossTableManager::PreparePhysicsTable for "
395 << particle->GetParticleName()
396 << " and " << p->GetProcessName() << " run= " << run
397 << " loss_vector " << loss_vector.size() << G4endl;
398 }
399 if(!startInitialisation) { tableBuilder->SetInitialisationFlag(false); }
400
401 // start initialisation for the first run
402 startInitialisation = true;
403
404 if( 0 == run ) {
405 emConfigurator->PrepareModels(particle, p);
406
407 // initialise particles for given process
408 for (G4int j=0; j<n_loss; ++j) {
409 if (p == loss_vector[j]) {
410 if (!part_vector[j]) { part_vector[j] = particle; }
411 }
412 }
413 }
414}
415
416//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
417
418void
420 G4VEmProcess* p)
421{
422 if (1 < verbose) {
423 G4cout << "G4LossTableManager::PreparePhysicsTable for "
424 << particle->GetParticleName()
425 << " and " << p->GetProcessName() << G4endl;
426 }
427 if(!startInitialisation) { tableBuilder->SetInitialisationFlag(false); }
428
429 // start initialisation for the first run
430 if( 0 == run ) {
431 emConfigurator->PrepareModels(particle, p);
432 }
433 startInitialisation = true;
434}
435
436//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
437
438void
441{
442 if (1 < verbose) {
443 G4cout << "G4LossTableManager::PreparePhysicsTable for "
444 << particle->GetParticleName()
445 << " and " << p->GetProcessName() << G4endl;
446 }
447 if(!startInitialisation) { tableBuilder->SetInitialisationFlag(false); }
448
449 // start initialisation for the first run
450 if( 0 == run ) {
451 emConfigurator->PrepareModels(particle, p);
452 }
453}
454
455//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
456
457void
459{
460 if(0 == run && startInitialisation) {
461 emConfigurator->Clear();
462 }
463}
464
465//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
466
468 const G4ParticleDefinition* aParticle,
470{
471 if(1 < verbose) {
472 G4cout << "### G4LossTableManager::BuildDEDXTable() is requested for "
473 << aParticle->GetParticleName()
474 << " and process " << p->GetProcessName() << G4endl;
475 }
476 // clear configurator
477 if(0 == run && startInitialisation) {
478 emConfigurator->Clear();
479 firstParticle = aParticle;
480 }
481 if(startInitialisation && atomDeexcitation) {
482 atomDeexcitation->InitialiseAtomicDeexcitation();
483 }
484 startInitialisation = false;
485
486 // initialisation before any table is built
487 if ( aParticle == firstParticle ) {
488 all_tables_are_built = true;
489
490 if(1 < verbose) {
491 G4cout << "### G4LossTableManager start initilisation for first particle "
492 << firstParticle->GetParticleName()
493 << G4endl;
494 }
495 for (G4int i=0; i<n_loss; ++i) {
496 G4VEnergyLossProcess* el = loss_vector[i];
497
498 if(el) {
499 const G4ProcessManager* pm = el->GetProcessManager();
500 isActive[i] = false;
501 if(pm) { isActive[i] = pm->GetProcessActivation(el); }
502 if(0 == run) { base_part_vector[i] = el->BaseParticle(); }
503 tables_are_built[i] = false;
504 all_tables_are_built= false;
505 if(!isActive[i]) { el->SetIonisation(false); }
506
507 if(1 < verbose) {
508 G4cout << i <<". "<< el->GetProcessName();
509 if(el->Particle()) {
510 G4cout << " for " << el->Particle()->GetParticleName();
511 }
512 G4cout << " active= " << isActive[i]
513 << " table= " << tables_are_built[i]
514 << " isIonisation= " << el->IsIonisationProcess();
515 if(base_part_vector[i]) {
516 G4cout << " base particle " << base_part_vector[i]->GetParticleName();
517 }
518 G4cout << G4endl;
519 }
520 } else {
521 tables_are_built[i] = true;
522 part_vector[i] = 0;
523 }
524 }
525 ++run;
526 currentParticle = 0;
527 }
528
529 // Set run time parameters
530 SetParameters(aParticle, p);
531
532 if (all_tables_are_built) { return; }
533
534 // Build tables for given particle
535 all_tables_are_built = true;
536
537 for(G4int i=0; i<n_loss; ++i) {
538 if(p == loss_vector[i] && !tables_are_built[i] && !base_part_vector[i]) {
539 const G4ParticleDefinition* curr_part = part_vector[i];
540 if(1 < verbose) {
541 G4cout << "### BuildPhysicsTable for " << p->GetProcessName()
542 << " and " << curr_part->GetParticleName()
543 << " start BuildTable " << G4endl;
544 }
545 G4VEnergyLossProcess* curr_proc = BuildTables(curr_part);
546 if(curr_proc) { CopyTables(curr_part, curr_proc); }
547 }
548 if ( !tables_are_built[i] ) { all_tables_are_built = false; }
549 }
550
551 if(1 < verbose) {
552 G4cout << "### G4LossTableManager::BuildDEDXTable end: "
553 << "all_tables_are_built= " << all_tables_are_built
554 << G4endl;
555
556 if(all_tables_are_built) {
557 G4cout << "### All dEdx and Range tables are built #####" << G4endl;
558 }
559 }
560}
561
562//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
563
564void G4LossTableManager::CopyTables(const G4ParticleDefinition* part,
565 G4VEnergyLossProcess* base_proc)
566{
567 for (G4int j=0; j<n_loss; ++j) {
568
569 G4VEnergyLossProcess* proc = loss_vector[j];
570 //if(proc == base_proc || proc->Particle() == part)
571 // tables_are_built[j] = true;
572
573 if (!tables_are_built[j] && part == base_part_vector[j]) {
574 tables_are_built[j] = true;
575 proc->SetDEDXTable(base_proc->DEDXTable(),fRestricted);
577 proc->SetDEDXTable(base_proc->DEDXunRestrictedTable(),fTotal);
578 proc->SetCSDARangeTable(base_proc->CSDARangeTable());
579 proc->SetRangeTableForLoss(base_proc->RangeTableForLoss());
580 proc->SetInverseRangeTable(base_proc->InverseRangeTable());
581 proc->SetLambdaTable(base_proc->LambdaTable());
582 proc->SetSubLambdaTable(base_proc->SubLambdaTable());
583 proc->SetIonisation(base_proc->IsIonisationProcess());
584 loss_map[part_vector[j]] = proc;
585 if (1 < verbose) {
586 G4cout << "For " << proc->GetProcessName()
587 << " for " << part_vector[j]->GetParticleName()
588 << " base_part= " << part->GetParticleName()
589 << " tables are assigned "
590 << G4endl;
591 }
592 }
593
594 if (theElectron == part && theElectron == proc->SecondaryParticle() ) {
595 proc->SetSecondaryRangeTable(base_proc->RangeTableForLoss());
596 }
597 }
598}
599
600//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
601
602G4VEnergyLossProcess* G4LossTableManager::BuildTables(
603 const G4ParticleDefinition* aParticle)
604{
605 if(1 < verbose) {
606 G4cout << "G4LossTableManager::BuildTables() for "
607 << aParticle->GetParticleName() << G4endl;
608 }
609
610 std::vector<G4PhysicsTable*> t_list;
611 std::vector<G4VEnergyLossProcess*> loss_list;
612 loss_list.clear();
613 G4VEnergyLossProcess* em = 0;
615 G4int iem = 0;
616 G4PhysicsTable* dedx = 0;
617 G4int i;
618
619 for (i=0; i<n_loss; ++i) {
620 p = loss_vector[i];
621 if (p && aParticle == part_vector[i] && !tables_are_built[i]) {
622 if ((p->IsIonisationProcess() && isActive[i]) ||
623 !em || (em && !isActive[iem]) ) {
624 em = p;
625 iem= i;
626 }
627 dedx = p->BuildDEDXTable(fRestricted);
628 // G4cout << "Build DEDX table for " << aParticle->GetParticleName()
629 // << " " << dedx << " " << dedx->length() << G4endl;
630 p->SetDEDXTable(dedx,fRestricted);
631 t_list.push_back(dedx);
632 loss_list.push_back(p);
633 tables_are_built[i] = true;
634 }
635 }
636
637 G4int n_dedx = t_list.size();
638 if (0 == n_dedx || !em) {
639 G4cout << "G4LossTableManager WARNING: no DEDX processes for "
640 << aParticle->GetParticleName() << G4endl;
641 return 0;
642 }
643 G4int nSubRegions = em->NumberOfSubCutoffRegions();
644
645 if (1 < verbose) {
646 G4cout << "G4LossTableManager::BuildTables() start to build range tables"
647 << " and the sum of " << n_dedx << " processes"
648 << " iem= " << iem << " em= " << em->GetProcessName()
649 << " buildCSDARange= " << buildCSDARange
650 << " nSubRegions= " << nSubRegions
651 << G4endl;
652 }
653
654 dedx = em->IonisationTable();
655 if (1 < n_dedx) {
656 em->SetDEDXTable(dedx, fIsIonisation);
657 dedx = 0;
659 tableBuilder->BuildDEDXTable(dedx, t_list);
660 em->SetDEDXTable(dedx, fRestricted);
661 }
662 dedx_vector[iem] = dedx;
663
664 G4PhysicsTable* range = em->RangeTableForLoss();
665 if(!range) range = G4PhysicsTableHelper::PreparePhysicsTable(range);
666 range_vector[iem] = range;
667
668 G4PhysicsTable* invrange = em->InverseRangeTable();
669 if(!invrange) invrange = G4PhysicsTableHelper::PreparePhysicsTable(invrange);
670 inv_range_vector[iem] = invrange;
671
672 G4bool flag = em->IsIonisationProcess();
673 tableBuilder->BuildRangeTable(dedx, range, flag);
674 tableBuilder->BuildInverseRangeTable(range, invrange, flag);
675
676 // if(1<verbose) G4cout << *dedx << G4endl;
677
678 em->SetRangeTableForLoss(range);
679 em->SetInverseRangeTable(invrange);
680
681 // if(1<verbose) G4cout << *range << G4endl;
682
683 std::vector<G4PhysicsTable*> listSub;
684 std::vector<G4PhysicsTable*> listCSDA;
685
686 for (i=0; i<n_dedx; ++i) {
687 p = loss_list[i];
688 p->SetIonisation(false);
690 if (0 < nSubRegions) {
693 listSub.push_back(dedx);
695 if(p != em) em->AddCollaborativeProcess(p);
696 }
697 if(buildCSDARange) {
698 dedx = p->BuildDEDXTable(fTotal);
699 p->SetDEDXTable(dedx,fTotal);
700 listCSDA.push_back(dedx);
701 }
702 }
703
704 if (0 < nSubRegions) {
706 if (1 < listSub.size()) {
707 em->SetDEDXTable(dedxSub, fIsSubIonisation);
708 dedxSub = 0;
710 tableBuilder->BuildDEDXTable(dedxSub, listSub);
711 em->SetDEDXTable(dedxSub, fSubRestricted);
712 }
713 }
714 if(buildCSDARange) {
715 G4PhysicsTable* dedxCSDA = em->DEDXunRestrictedTable();
716 if (1 < n_dedx) {
717 dedxCSDA = 0;
719 tableBuilder->BuildDEDXTable(dedxCSDA, listCSDA);
720 em->SetDEDXTable(dedxCSDA,fTotal);
721 }
722 G4PhysicsTable* rCSDA = em->CSDARangeTable();
723 if(!rCSDA) rCSDA = G4PhysicsTableHelper::PreparePhysicsTable(rCSDA);
724 tableBuilder->BuildRangeTable(dedxCSDA, rCSDA, flag);
725 em->SetCSDARangeTable(rCSDA);
726 }
727
728 em->SetIonisation(true);
729 loss_map[aParticle] = em;
730
731 if (1 < verbose) {
732 G4cout << "G4LossTableManager::BuildTables: Tables are built for "
733 << aParticle->GetParticleName()
734 << "; ionisation process: " << em->GetProcessName()
735 << G4endl;
736 }
737 return em;
738}
739
740//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
741
743{
744 return theMessenger;
745}
746
747//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
748
749void G4LossTableManager::ParticleHaveNoLoss(
750 const G4ParticleDefinition* aParticle)
751{
753 ed << "Energy loss process not found for " << aParticle->GetParticleName()
754 << " !" << G4endl;
755 G4Exception("G4LossTableManager::ParticleHaveNoLoss", "em0001",
756 FatalException, ed);
757
758}
759
760//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
761
763{
764 return buildCSDARange;
765}
766
767//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
768
770{
771 lossFluctuationFlag = val;
772 for(G4int i=0; i<n_loss; ++i) {
773 if(loss_vector[i]) { loss_vector[i]->SetLossFluctuations(val); }
774 }
775}
776
777//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
778
780{
781 subCutoffFlag = val;
782 for(G4int i=0; i<n_loss; ++i) {
783 if(loss_vector[i]) { loss_vector[i]->ActivateSubCutoff(val, r); }
784 }
785}
786
787//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
788
790{
791 integral = val;
792 integralActive = true;
793 for(G4int i=0; i<n_loss; ++i) {
794 if(loss_vector[i]) { loss_vector[i]->SetIntegral(val); }
795 }
796 size_t emp = emp_vector.size();
797 for (size_t k=0; k<emp; ++k) {
798 if(emp_vector[k]) { emp_vector[k]->SetIntegral(val); }
799 }
800}
801
802//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
803
805{
806 minSubRange = val;
807 for(G4int i=0; i<n_loss; ++i) {
808 if(loss_vector[i]) { loss_vector[i]->SetMinSubRange(val); }
809 }
810}
811
812//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
813
815{
816 rndmStepFlag = val;
817 for(G4int i=0; i<n_loss; ++i) {
818 if(loss_vector[i]) { loss_vector[i]->SetRandomStep(val); }
819 }
820}
821
822//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
823
825{
826 minEnergyActive = true;
827 minKinEnergy = val;
828 for(G4int i=0; i<n_loss; ++i) {
829 if(loss_vector[i]) { loss_vector[i]->SetMinKinEnergy(val); }
830 }
831 size_t emp = emp_vector.size();
832 for (size_t k=0; k<emp; ++k) {
833 if(emp_vector[k]) { emp_vector[k]->SetMinKinEnergy(val); }
834 }
835}
836
837//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
838
840{
841 maxEnergyActive = true;
842 maxKinEnergy = val;
843 for(G4int i=0; i<n_loss; ++i) {
844 if(loss_vector[i]) { loss_vector[i]->SetMaxKinEnergy(val); }
845 }
846 size_t emp = emp_vector.size();
847 for (size_t k=0; k<emp; ++k) {
848 if(emp_vector[k]) { emp_vector[k]->SetMaxKinEnergy(val); }
849 }
850}
851
852//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
853
855{
856 for(G4int i=0; i<n_loss; ++i) {
857 if(loss_vector[i]) { loss_vector[i]->SetMaxKinEnergyForCSDARange(val); }
858 }
859}
860
861//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
862
864{
865 maxEnergyForMuonsActive = true;
866 maxKinEnergyForMuons = val;
867}
868
869//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
870
872{
873 for(G4int i=0; i<n_loss; ++i) {
874 if(loss_vector[i]) { loss_vector[i]->SetDEDXBinning(val); }
875 }
876}
877
878//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
879
881{
882 for(G4int i=0; i<n_loss; ++i) {
883 if(loss_vector[i]) { loss_vector[i]->SetDEDXBinningForCSDARange(val); }
884 }
885}
886
887//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
888
890{
891 G4int n = val/G4int(std::log10(maxKinEnergy/minKinEnergy) + 0.5);
892 if(n < 5) {
893 G4cout << "G4LossTableManager::SetLambdaBinning WARNING "
894 << "too small number of bins " << val << " ignored"
895 << G4endl;
896 return;
897 }
898 nbinsLambda = val;
899 nbinsPerDecade = n;
900 size_t emp = emp_vector.size();
901 for (size_t k=0; k<emp; ++k) {
902 if(emp_vector[k]) { emp_vector[k]->SetLambdaBinning(val); }
903 }
904}
905
906//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
907
909{
910 return nbinsPerDecade;
911}
912
913//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
914
916{
917 verbose = val;
918 for(G4int i=0; i<n_loss; ++i) {
919 if(loss_vector[i]) { loss_vector[i]->SetVerboseLevel(val); }
920 }
921 size_t msc = msc_vector.size();
922 for (size_t j=0; j<msc; ++j) {
923 if(msc_vector[j]) { msc_vector[j]->SetVerboseLevel(val); }
924 }
925 size_t emp = emp_vector.size();
926 for (size_t k=0; k<emp; ++k) {
927 if(emp_vector[k]) { emp_vector[k]->SetVerboseLevel(val); }
928 }
929 emConfigurator->SetVerbose(val);
930 //tableBuilder->SetVerbose(val);
931 //emCorrections->SetVerbose(val);
932 emSaturation->SetVerbose(val);
933 emElectronIonPair->SetVerbose(val);
934 if(atomDeexcitation) { atomDeexcitation->SetVerboseLevel(val); }
935}
936
937//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
938
940{
941 stepFunctionActive = true;
942 maxRangeVariation = v1;
943 maxFinalStep = v2;
944 for(G4int i=0; i<n_loss; ++i) {
945 if(loss_vector[i]) { loss_vector[i]->SetStepFunction(v1, v2); }
946 }
947}
948
949//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
950
952{
953 for(G4int i=0; i<n_loss; ++i) {
954 if(loss_vector[i]) { loss_vector[i]->SetLinearLossLimit(val); }
955 }
956}
957
958//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
959
961{
962 buildCSDARange = val;
963}
964
965//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
966
967void
968G4LossTableManager::SetParameters(const G4ParticleDefinition* aParticle,
970{
971 if(stepFunctionActive) { p->SetStepFunction(maxRangeVariation, maxFinalStep); }
972 if(integralActive) { p->SetIntegral(integral); }
973 if(minEnergyActive) { p->SetMinKinEnergy(minKinEnergy); }
974 if(maxEnergyActive) { p->SetMaxKinEnergy(maxKinEnergy); }
975 p->SetVerboseLevel(verbose);
976 if(maxEnergyForMuonsActive) {
977 G4double dm = std::abs(aParticle->GetPDGMass() - 105.7*MeV);
978 if(dm < 5.*MeV) { p->SetMaxKinEnergy(maxKinEnergyForMuons); }
979 }
980}
981
982//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
983
984const std::vector<G4VEnergyLossProcess*>&
986{
987 return loss_vector;
988}
989
990//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
991
992const std::vector<G4VEmProcess*>& G4LossTableManager::GetEmProcessVector()
993{
994 return emp_vector;
995}
996
997//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
998
999const std::vector<G4VMultipleScattering*>&
1001{
1002 return msc_vector;
1003}
1004
1005//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
1006
1008{
1009 flagLPM = val;
1010}
1011
1012//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
1013
1015{
1016 return flagLPM;
1017}
1018
1019//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
1020
1022{
1023 splineFlag = val;
1024 tableBuilder->SetSplineFlag(splineFlag);
1025}
1026
1027//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
1028
1030{
1031 return splineFlag;
1032}
1033
1034//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1035
1037{
1038 bremsTh = val;
1039}
1040
1041//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1042
1044{
1045 return bremsTh;
1046}
1047
1048//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1049
1051{
1052 if(val > 0.0) { factorForAngleLimit = val; }
1053}
1054
1055//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1056
1058{
1059 return factorForAngleLimit;
1060}
1061
1062//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
1063
1065{
1066 return minKinEnergy;
1067}
1068
1069//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
1070
1072{
1073 return maxKinEnergy;
1074}
1075
1076//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
1077
1079{
1080 return emCorrections;
1081}
1082
1083//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
1084
1086{
1087 return emSaturation;
1088}
1089
1090//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
1091
1093{
1094 return emConfigurator;
1095}
1096
1097//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
1098
1100{
1101 return emElectronIonPair;
1102}
1103
1104//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1105
1107{
1108 return atomDeexcitation;
1109}
1110
1111//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1112
1114{
1115 return tableBuilder;
1116}
1117
1118//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1119
1121{
1122 atomDeexcitation = p;
1123}
1124
1125//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
1126
1129{
1130 if(aParticle != currentParticle) {
1131 currentParticle = aParticle;
1132 std::map<PD,G4VEnergyLossProcess*,std::less<PD> >::const_iterator pos;
1133 if ((pos = loss_map.find(aParticle)) != loss_map.end()) {
1134 currentLoss = (*pos).second;
1135 } else {
1136 currentLoss = 0;
1137 //ParticleHaveNoLoss(aParticle);
1138 }
1139 }
1140 return currentLoss;
1141}
1142
1143//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
1144
1146 G4double kineticEnergy,
1147 const G4MaterialCutsCouple *couple)
1148{
1149 if(aParticle != currentParticle) { GetEnergyLossProcess(aParticle); }
1150 G4double x = 0.0;
1151 if(currentLoss) { x = currentLoss->GetDEDX(kineticEnergy, couple); }
1152 else { x = G4EnergyLossTables::GetDEDX(currentParticle,
1153 kineticEnergy,couple,false); }
1154 return x;
1155}
1156
1157//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
1158
1160 G4double kineticEnergy,
1161 const G4MaterialCutsCouple *couple)
1162{
1163 if(aParticle != currentParticle) { GetEnergyLossProcess(aParticle); }
1164 G4double x = 0.0;
1165 if(currentLoss) { x = currentLoss->GetDEDXForSubsec(kineticEnergy, couple); }
1166 return x;
1167}
1168
1169//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
1170
1172 G4double kineticEnergy,
1173 const G4MaterialCutsCouple *couple)
1174{
1175 if(aParticle != currentParticle) { GetEnergyLossProcess(aParticle); }
1176 G4double x = DBL_MAX;
1177 if(currentLoss) { x = currentLoss->GetCSDARange(kineticEnergy, couple); }
1178 return x;
1179}
1180
1181//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
1182
1183G4double
1185 G4double kineticEnergy,
1186 const G4MaterialCutsCouple *couple)
1187{
1188 if(aParticle != currentParticle) { GetEnergyLossProcess(aParticle); }
1189 G4double x;
1190 if(currentLoss) { x = currentLoss->GetRangeForLoss(kineticEnergy, couple); }
1191 else { x = G4EnergyLossTables::GetRange(currentParticle,kineticEnergy,
1192 couple,false); }
1193 return x;
1194}
1195
1196//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
1197
1199 G4double kineticEnergy,
1200 const G4MaterialCutsCouple *couple)
1201{
1202 if(aParticle != currentParticle) { GetEnergyLossProcess(aParticle); }
1203 G4double x;
1204 if(currentLoss) { x = currentLoss->GetRange(kineticEnergy, couple); }
1205 else { x = G4EnergyLossTables::GetRange(currentParticle,kineticEnergy,
1206 couple,false); }
1207 return x;
1208}
1209
1210//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
1211
1213 G4double range,
1214 const G4MaterialCutsCouple *couple)
1215{
1216 if(aParticle != currentParticle) { GetEnergyLossProcess(aParticle); }
1217 G4double x;
1218 if(currentLoss) { x = currentLoss->GetKineticEnergy(range, couple); }
1219 else { x = G4EnergyLossTables::GetPreciseEnergyFromRange(currentParticle,range,
1220 couple,false); }
1221 return x;
1222}
1223
1224//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
1225
1227 const G4DynamicParticle* dp,
1228 G4double& length)
1229{
1230 const G4ParticleDefinition* aParticle = dp->GetParticleDefinition();
1231 if(aParticle != currentParticle) { GetEnergyLossProcess(aParticle); }
1232 G4double x = 0.0;
1233 if(currentLoss) { currentLoss->GetDEDXDispersion(couple, dp, length); }
1234 return x;
1235}
1236
1237//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
@ fSubRestricted
@ fTotal
@ fIsSubIonisation
@ fRestricted
@ fIsIonisation
@ FatalException
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
const G4ParticleDefinition * GetParticleDefinition() const
static G4Electron * Electron()
Definition: G4Electron.cc:94
void SetVerbose(G4int value)
void PrepareModels(const G4ParticleDefinition *aParticle, G4VEnergyLossProcess *p)
void SetVerbose(G4int)
static G4double GetRange(const G4ParticleDefinition *aParticle, G4double KineticEnergy, const G4Material *aMaterial)
static G4double GetDEDX(const G4ParticleDefinition *aParticle, G4double KineticEnergy, const G4Material *aMaterial)
static G4double GetPreciseEnergyFromRange(const G4ParticleDefinition *aParticle, G4double range, const G4Material *aMaterial)
void BuildDEDXTable(G4PhysicsTable *dedxTable, const std::vector< G4PhysicsTable * > &)
void BuildRangeTable(const G4PhysicsTable *dedxTable, G4PhysicsTable *rangeTable, G4bool isIonisation=false)
void SetSplineFlag(G4bool flag)
void SetInitialisationFlag(G4bool flag)
void BuildInverseRangeTable(const G4PhysicsTable *rangeTable, G4PhysicsTable *invRangeTable, G4bool isIonisation=false)
void RegisterIon(const G4ParticleDefinition *aParticle, G4VEnergyLossProcess *p)
void SetAtomDeexcitation(G4VAtomDeexcitation *)
void SetLinearLossLimit(G4double val)
void SetFactorForAngleLimit(G4double val)
void SetSplineFlag(G4bool val)
G4double MinKinEnergy() const
void SetMaxEnergy(G4double val)
static G4LossTableManager * Instance()
const std::vector< G4VEmProcess * > & GetEmProcessVector()
G4double GetCSDARange(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
G4double FactorForAngleLimit() const
void SetSubCutoff(G4bool val, const G4Region *r=0)
G4VEnergyLossProcess * GetEnergyLossProcess(const G4ParticleDefinition *)
G4LossTableBuilder * GetTableBuilder()
G4double GetSubDEDX(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
void SetIntegral(G4bool val)
G4double MaxKinEnergy() const
void SetBremsstrahlungTh(G4double val)
void BuildPhysicsTable(const G4ParticleDefinition *aParticle)
G4int GetNumberOfBinsPerDecade() const
G4double BremsstrahlungTh() const
void SetMaxEnergyForCSDARange(G4double val)
G4double GetEnergy(const G4ParticleDefinition *aParticle, G4double range, const G4MaterialCutsCouple *couple)
const std::vector< G4VMultipleScattering * > & GetMultipleScatteringVector()
void SetVerbose(G4int val)
void DeRegister(G4VEnergyLossProcess *p)
void SetBuildCSDARange(G4bool val)
void SetMinEnergy(G4double val)
G4EmConfigurator * EmConfigurator()
void Register(G4VEnergyLossProcess *p)
G4ElectronIonPair * ElectronIonPair()
G4EmSaturation * EmSaturation()
const std::vector< G4VEnergyLossProcess * > & GetEnergyLossProcessVector()
G4bool BuildCSDARange() const
G4VAtomDeexcitation * AtomDeexcitation()
void SetRandomStep(G4bool val)
G4double GetRangeFromRestricteDEDX(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
void SetDEDXBinning(G4int val)
void PreparePhysicsTable(const G4ParticleDefinition *aParticle, G4VEnergyLossProcess *p)
void SetStepFunction(G4double v1, G4double v2)
G4EmCorrections * EmCorrections()
void SetLossFluctuations(G4bool val)
G4double GetDEDXDispersion(const G4MaterialCutsCouple *couple, const G4DynamicParticle *dp, G4double &length)
void SetMaxEnergyForMuons(G4double val)
void SetLambdaBinning(G4int val)
void RegisterExtraParticle(const G4ParticleDefinition *aParticle, G4VEnergyLossProcess *p)
G4double GetRange(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
void SetLPMFlag(G4bool val)
void SetMinSubRange(G4double val)
G4EnergyLossMessenger * GetMessenger()
G4double GetDEDX(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
void SetDEDXBinningForCSDARange(G4int val)
const G4String & GetParticleName() const
static G4PhysicsTable * PreparePhysicsTable(G4PhysicsTable *physTable)
G4bool GetProcessActivation(G4VProcess *aProcess) const
const G4String & GetName() const
Definition: G4VEmModel.hh:655
const G4ParticleDefinition * BaseParticle() const
G4PhysicsTable * RangeTableForLoss() const
void SetRandomStep(G4bool val)
void SetMaxKinEnergy(G4double e)
G4PhysicsTable * LambdaTable()
G4PhysicsTable * InverseRangeTable() const
G4PhysicsTable * CSDARangeTable() const
G4double GetCSDARange(G4double &kineticEnergy, const G4MaterialCutsCouple *)
void SetRangeTableForLoss(G4PhysicsTable *p)
G4int NumberOfSubCutoffRegions() const
G4double GetRangeForLoss(G4double &kineticEnergy, const G4MaterialCutsCouple *)
G4double GetKineticEnergy(G4double &range, const G4MaterialCutsCouple *)
G4PhysicsTable * BuildDEDXTable(G4EmTableType tType=fRestricted)
void AddCollaborativeProcess(G4VEnergyLossProcess *)
void ActivateSubCutoff(G4bool val, const G4Region *region=0)
G4PhysicsTable * SubLambdaTable()
G4double GetDEDXForSubsec(G4double &kineticEnergy, const G4MaterialCutsCouple *)
void SetStepFunction(G4double v1, G4double v2)
G4PhysicsTable * DEDXTableForSubsec() const
G4PhysicsTable * IonisationTableForSubsec() const
void SetLossFluctuations(G4bool val)
const G4ParticleDefinition * Particle() const
void SetInverseRangeTable(G4PhysicsTable *p)
G4bool IsIonisationProcess() const
void SetDEDXTable(G4PhysicsTable *p, G4EmTableType tType)
void SetSecondaryRangeTable(G4PhysicsTable *p)
G4PhysicsTable * BuildLambdaTable(G4EmTableType tType=fRestricted)
G4double GetDEDX(G4double &kineticEnergy, const G4MaterialCutsCouple *)
void SetIonisation(G4bool val)
void SetSubLambdaTable(G4PhysicsTable *p)
G4double GetRange(G4double &kineticEnergy, const G4MaterialCutsCouple *)
void SetLambdaTable(G4PhysicsTable *p)
G4double GetDEDXDispersion(const G4MaterialCutsCouple *couple, const G4DynamicParticle *dp, G4double length)
G4PhysicsTable * IonisationTable() const
void SetCSDARangeTable(G4PhysicsTable *pRange)
G4PhysicsTable * DEDXunRestrictedTable() const
void SetIntegral(G4bool val)
G4PhysicsTable * DEDXTable() const
void SetMinKinEnergy(G4double e)
const G4ParticleDefinition * SecondaryParticle() const
void SetVerboseLevel(G4int value)
Definition: G4VProcess.hh:408
virtual const G4ProcessManager * GetProcessManager()
Definition: G4VProcess.hh:485
const G4String & GetProcessName() const
Definition: G4VProcess.hh:379
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76
#define DBL_MAX
Definition: templates.hh:83