Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4EmModelManager.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: G4EmModelManager
34 //
35 // Author: Vladimir Ivanchenko
36 //
37 // Creation date: 07.05.2002
38 //
39 // Modifications:
40 //
41 // 23-12-02 V.Ivanchenko change interface in order to move
42 // to cut per region
43 // 20-01-03 Migrade to cut per region (V.Ivanchenko)
44 // 24-01-03 Make models region aware (V.Ivanchenko)
45 // 13-02-03 The set of models is defined for region (V.Ivanchenko)
46 // 06-03-03 Fix in energy intervals for models (V.Ivanchenko)
47 // 13-04-03 Add startFromNull (V.Ivanchenko)
48 // 13-05-03 Add calculation of precise range (V.Ivanchenko)
49 // 16-07-03 Replace G4Material by G4MaterialCutCouple in dE/dx and CrossSection
50 // calculation (V.Ivanchenko)
51 // 21-07-03 Add UpdateEmModel method (V.Ivanchenko)
52 // 03-11-03 Substitute STL vector for G4RegionModels (V.Ivanchenko)
53 // 26-01-04 Fix in energy range conditions (V.Ivanchenko)
54 // 24-03-05 Remove check or IsInCharge (V.Ivanchenko)
55 // 08-04-05 Major optimisation of internal interfaces (V.Ivantchenko)
56 // 18-08-05 Fix cut for e+e- pair production (V.Ivanchenko)
57 // 29-11-05 Add protection for arithmetic operations with cut=DBL_MAX (V.Ivanchenko)
58 // 20-01-06 Introduce G4EmTableType and reducing number of methods (VI)
59 // 13-05-06 Add GetModel by index method (VI)
60 // 15-03-07 Add maxCutInRange (V.Ivanchenko)
61 // 12-04-07 Add verbosity at destruction (V.Ivanchenko)
62 // 08-04-08 Fixed and simplified initialisation of G4RegionModel (VI)
63 // 03-08-09 Create internal vectors only it is needed (VI)
64 // 14-07-11 Use pointer to the vector of cuts and not local copy (VI)
65 //
66 // Class Description:
67 //
68 // It is the unified energy loss process it calculates the continuous
69 // energy loss for charged particles using a set of Energy Loss
70 // models valid for different energy regions. There are a possibility
71 // to create and access to dE/dx and range tables, or to calculate
72 // that information on fly.
73 // -------------------------------------------------------------------
74 //
75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
76 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
77 
78 #include "G4EmModelManager.hh"
79 #include "G4SystemOfUnits.hh"
80 #include "G4PhysicsTable.hh"
81 #include "G4PhysicsVector.hh"
82 
83 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
84 
85 G4RegionModels::G4RegionModels(G4int nMod, std::vector<G4int>& indx,
86  G4DataVector& lowE, const G4Region* reg)
87 {
88  nModelsForRegion = nMod;
89  theListOfModelIndexes = new G4int [nModelsForRegion];
90  lowKineticEnergy = new G4double [nModelsForRegion+1];
91  for (G4int i=0; i<nModelsForRegion; ++i) {
92  theListOfModelIndexes[i] = indx[i];
93  lowKineticEnergy[i] = lowE[i];
94  }
95  lowKineticEnergy[nModelsForRegion] = lowE[nModelsForRegion];
96  theRegion = reg;
97 }
98 
99 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
100 
101 G4RegionModels::~G4RegionModels()
102 {
103  delete [] theListOfModelIndexes;
104  delete [] lowKineticEnergy;
105 }
106 
107 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
108 
109 #include "G4Step.hh"
110 #include "G4ParticleDefinition.hh"
111 #include "G4PhysicsVector.hh"
112 #include "G4Gamma.hh"
113 #include "G4Positron.hh"
114 #include "G4MaterialCutsCouple.hh"
115 #include "G4ProductionCutsTable.hh"
116 #include "G4RegionStore.hh"
117 #include "G4Gamma.hh"
118 #include "G4Positron.hh"
119 #include "G4UnitsTable.hh"
120 #include "G4DataVector.hh"
121 
122 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
123 
125  nEmModels(0),
126  nRegions(0),
127  particle(0),
128  verboseLevel(0)
129 {
130  maxSubCutInRange = 0.7*mm;
131  models.reserve(4);
132  flucModels.reserve(4);
133  regions.reserve(4);
134  orderOfModels.reserve(4);
135  isUsed.reserve(4);
136  severalModels = true;
137  fluoFlag = false;
138  currRegionModel = 0;
139  currModel = 0;
140  theCuts = 0;
141  theSubCuts = 0;
142 }
143 
144 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
145 
147 {
148  verboseLevel = 0; // no verbosity at destruction
149  Clear();
150  delete theSubCuts;
151 }
152 
153 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
154 
156 {
157  if(1 < verboseLevel) {
158  G4cout << "G4EmModelManager::Clear()" << G4endl;
159  }
160  size_t n = setOfRegionModels.size();
161  if(n > 0) {
162  for(size_t i=0; i<n; ++i) {
163  delete setOfRegionModels[i];
164  setOfRegionModels[i] = 0;
165  }
166  }
167 }
168 
169 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
170 
172  G4VEmFluctuationModel* fm, const G4Region* r)
173 {
174  if(!p) {
175  G4cout << "G4EmModelManager::AddEmModel WARNING: no model defined."
176  << G4endl;
177  return;
178  }
179  models.push_back(p);
180  flucModels.push_back(fm);
181  regions.push_back(r);
182  orderOfModels.push_back(num);
183  isUsed.push_back(0);
184  p->DefineForRegion(r);
185  ++nEmModels;
186 }
187 
188 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
189 
191  G4double emin, G4double emax)
192 {
193  if (nEmModels > 0) {
194  for(G4int i=0; i<nEmModels; ++i) {
195  if(nam == models[i]->GetName()) {
196  models[i]->SetLowEnergyLimit(emin);
197  models[i]->SetHighEnergyLimit(emax);
198  break;
199  }
200  }
201  }
202  G4cout << "G4EmModelManager::UpdateEmModel WARNING: no model <"
203  << nam << "> is found out"
204  << G4endl;
205 }
206 
207 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
208 
210 {
211  G4VEmModel* model = 0;
212  if(i >= 0 && i < nEmModels) { model = models[i]; }
213  else if(verboseLevel > 0 && ver) {
214  G4cout << "G4EmModelManager::GetModel WARNING: "
215  << "index " << i << " is wrong Nmodels= "
216  << nEmModels;
217  if(particle) G4cout << " for " << particle->GetParticleName();
218  G4cout<< G4endl;
219  }
220  return model;
221 }
222 
223 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
224 
225 const G4DataVector*
227  const G4ParticleDefinition* secondaryParticle,
228  G4double minSubRange,
229  G4int val)
230 {
231  verboseLevel = val;
232  G4String partname = p->GetParticleName();
233  if(1 < verboseLevel) {
234  G4cout << "G4EmModelManager::Initialise() for "
235  << partname << G4endl;
236  }
237  // Are models defined?
238  if(nEmModels < 1) {
240  ed << "No models found out for " << p->GetParticleName()
241  << " !" << G4endl;
242  G4Exception("G4EmModelManager::Initialise","em0002",
243  FatalException, ed);
244  }
245 
246  particle = p;
247  Clear(); // needed if run is not first
248 
249  G4RegionStore* regionStore = G4RegionStore::GetInstance();
250  const G4Region* world =
251  regionStore->GetRegion("DefaultRegionForTheWorld", false);
252 
253  // Identify the list of regions with different set of models
254  nRegions = 1;
255  std::vector<const G4Region*> setr;
256  setr.push_back(world);
257  G4bool isWorld = false;
258 
259  for (G4int ii=0; ii<nEmModels; ++ii) {
260  const G4Region* r = regions[ii];
261  if ( r == 0 || r == world) {
262  isWorld = true;
263  regions[ii] = world;
264  } else {
265  G4bool newRegion = true;
266  if (nRegions>1) {
267  for (G4int j=1; j<nRegions; ++j) {
268  if ( r == setr[j] ) newRegion = false;
269  }
270  }
271  if (newRegion) {
272  setr.push_back(r);
273  nRegions++;
274  }
275  }
276  }
277  // Are models defined?
278  if(!isWorld) {
280  ed << "No models defined for the World volume for " << p->GetParticleName()
281  << " !" << G4endl;
282  G4Exception("G4EmModelManager::Initialise","em0002",
283  FatalException, ed);
284  }
285 
286  G4ProductionCutsTable* theCoupleTable=
288  size_t numOfCouples = theCoupleTable->GetTableSize();
289 
290  // prepare vectors, shortcut for the case of only 1 model
291  if(nRegions > 1 && nEmModels > 1) {
292  if(numOfCouples > idxOfRegionModels.size()) {
293  idxOfRegionModels.resize(numOfCouples);
294  }
295  }
296  size_t nr = 1;
297  if(nEmModels > 1) { nr = nRegions; }
298  if(nr > setOfRegionModels.size()) { setOfRegionModels.resize(nr); }
299 
300  std::vector<G4int> modelAtRegion(nEmModels);
301  std::vector<G4int> modelOrd(nEmModels);
302  G4DataVector eLow(nEmModels+1);
303  G4DataVector eHigh(nEmModels);
304 
305  // Order models for regions
306  for (G4int reg=0; reg<nRegions; ++reg) {
307  const G4Region* region = setr[reg];
308  G4int n = 0;
309 
310  for (G4int ii=0; ii<nEmModels; ++ii) {
311 
312  G4VEmModel* model = models[ii];
313  if ( region == regions[ii] ) {
314 
315  G4double tmin = model->LowEnergyLimit();
316  G4double tmax = model->HighEnergyLimit();
317  G4int ord = orderOfModels[ii];
318  G4bool push = true;
319  G4bool insert = false;
320  G4int idx = n;
321 
322  if(1 < verboseLevel) {
323  G4cout << "Model #" << ii
324  << " <" << model->GetName() << "> for region <";
325  if (region) G4cout << region->GetName();
326  G4cout << "> "
327  << " tmin(MeV)= " << tmin/MeV
328  << "; tmax(MeV)= " << tmax/MeV
329  << "; order= " << ord
330  << G4endl;
331  }
332 
333  if(n > 0) {
334 
335  // extend energy range to previous models
336  tmin = std::min(tmin, eHigh[n-1]);
337  tmax = std::max(tmax, eLow[0]);
338  //G4cout << "tmin= " << tmin << " tmax= "
339  // << tmax << " ord= " << ord <<G4endl;
340  // empty energy range
341  if( tmax - tmin <= eV) push = false;
342  // low-energy model
343  else if (tmax == eLow[0]) {
344  push = false;
345  insert = true;
346  idx = 0;
347  // resolve intersections
348  } else if(tmin < eHigh[n-1]) {
349  // compare order
350  for(G4int k=0; k<n; ++k) {
351  // new model has lower application
352  if(ord >= modelOrd[k]) {
353  if(tmin < eHigh[k] && tmin >= eLow[k]) tmin = eHigh[k];
354  if(tmax <= eHigh[k] && tmax > eLow[k]) tmax = eLow[k];
355  if(tmax > eHigh[k] && tmin < eLow[k]) {
356  if(tmax - eHigh[k] > eLow[k] - tmin) tmin = eHigh[k];
357  else tmax = eLow[k];
358  }
359  if( tmax - tmin <= eV) {
360  push = false;
361  break;
362  }
363  }
364  }
365  //G4cout << "tmin= " << tmin << " tmax= "
366  // << tmax << " push= " << push << " idx= " << idx <<G4endl;
367  if(push) {
368  if (tmax == eLow[0]) {
369  push = false;
370  insert = true;
371  idx = 0;
372  // continue resolve intersections
373  } else if(tmin < eHigh[n-1]) {
374  // last energy interval
375  if(tmin > eLow[n-1] && tmax >= eHigh[n-1]) {
376  eHigh[n-1] = tmin;
377  // first energy interval
378  } else if(tmin <= eLow[0] && tmax < eHigh[0]) {
379  eLow[0] = tmax;
380  push = false;
381  insert = true;
382  idx = 0;
383  } else {
384  // find energy interval to replace
385  for(G4int k=0; k<n; ++k) {
386  if(tmin <= eLow[k] && tmax >= eHigh[k]) {
387  push = false;
388  modelAtRegion[k] = ii;
389  modelOrd[k] = ord;
390  isUsed[ii] = 1;
391  }
392  }
393  }
394  }
395  }
396  }
397  }
398  if(insert) {
399  for(G4int k=n-1; k>=idx; --k) {
400  modelAtRegion[k+1] = modelAtRegion[k];
401  modelOrd[k+1] = modelOrd[k];
402  eLow[k+1] = eLow[k];
403  eHigh[k+1] = eHigh[k];
404  }
405  }
406  //G4cout << "push= " << push << " insert= " << insert
407  //<< " idx= " << idx <<G4endl;
408  if (push || insert) {
409  ++n;
410  modelAtRegion[idx] = ii;
411  modelOrd[idx] = ord;
412  eLow[idx] = tmin;
413  eHigh[idx] = tmax;
414  isUsed[ii] = 1;
415  }
416  }
417  }
418  eLow[0] = 0.0;
419  eLow[n] = eHigh[n-1];
420 
421  if(1 < verboseLevel) {
422  G4cout << "New G4RegionModels set with " << n << " models for region <";
423  if (region) G4cout << region->GetName();
424  G4cout << "> Elow(MeV)= ";
425  for(G4int ii=0; ii<=n; ++ii) {G4cout << eLow[ii]/MeV << " ";}
426  G4cout << G4endl;
427  }
428  G4RegionModels* rm = new G4RegionModels(n, modelAtRegion, eLow, region);
429  setOfRegionModels[reg] = rm;
430  if(1 == nEmModels) { break; }
431  }
432 
433  currRegionModel = setOfRegionModels[0];
434 
435  // Access to materials and build cuts
436  size_t idx = 1;
437  if(secondaryParticle) {
438  if( secondaryParticle == G4Gamma::Gamma() ) { idx = 0; }
439  else if( secondaryParticle == G4Positron::Positron()) { idx = 2; }
440  }
441 
442  //theCuts = theCoupleTable->GetEnergyCutsVector(idx);
443  theCuts = static_cast<const G4DataVector*>(theCoupleTable->GetEnergyCutsVector(idx));
444 
445  if(minSubRange < 1.0) {
446  if( !theSubCuts ) { theSubCuts = new G4DataVector(); }
447  theSubCuts->resize(numOfCouples,DBL_MAX);
448  }
449  for(size_t i=0; i<numOfCouples; ++i) {
450 
451  const G4MaterialCutsCouple* couple =
452  theCoupleTable->GetMaterialCutsCouple(i);
453  const G4Material* material = couple->GetMaterial();
454  const G4ProductionCuts* pcuts = couple->GetProductionCuts();
455 
456  G4int reg = 0;
457  if(nRegions > 1 && nEmModels > 1) {
458  reg = nRegions;
459  do {--reg;} while (reg>0 && pcuts != (setr[reg]->GetProductionCuts()));
460  idxOfRegionModels[i] = reg;
461  }
462  if(1 < verboseLevel) {
463  G4cout << "G4EmModelManager::Initialise() for "
464  << material->GetName()
465  << " indexOfCouple= " << i
466  << " indexOfRegion= " << reg
467  << G4endl;
468  }
469 
470  G4double cut = (*theCuts)[i];
471  if(secondaryParticle) {
472 
473  // compute subcut
474  if( cut < DBL_MAX && minSubRange < 1.0) {
475  G4double subcut = minSubRange*cut;
476  G4double rcut = std::min(minSubRange*pcuts->GetProductionCut(idx),
477  maxSubCutInRange);
478  G4double tcutmax =
479  theCoupleTable->ConvertRangeToEnergy(secondaryParticle,material,rcut);
480  if(tcutmax < subcut) { subcut = tcutmax; }
481  (*theSubCuts)[i] = subcut;
482  }
483  }
484  }
485 
486  // initialize models
487  G4int nn = 0;
488  severalModels = true;
489  for(G4int jj=0; jj<nEmModels; ++jj) {
490  if(1 == isUsed[jj]) {
491  ++nn;
492  currModel = models[jj];
493  currModel->Initialise(particle, *theCuts);
494  if(flucModels[jj]) { flucModels[jj]->InitialiseMe(particle); }
495  }
496  }
497  if(1 == nn) { severalModels = false; }
498 
499  if(1 < verboseLevel) {
500  G4cout << "G4EmModelManager for " << particle->GetParticleName()
501  << " is initialised; nRegions= " << nRegions
502  << G4endl;
503  }
504 
505  return theCuts;
506 }
507 
508 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
509 
511  const G4MaterialCutsCouple* couple,
512  G4EmTableType tType)
513 {
514  size_t i = couple->GetIndex();
515  G4double cut = (*theCuts)[i];
516  G4double emin = 0.0;
517 
518  if(fTotal == tType) { cut = DBL_MAX; }
519  else if(fSubRestricted == tType) {
520  emin = cut;
521  if(theSubCuts) { emin = (*theSubCuts)[i]; }
522  }
523 
524  if(1 < verboseLevel) {
525  G4cout << "G4EmModelManager::FillDEDXVector() for "
526  << couple->GetMaterial()->GetName()
527  << " cut(MeV)= " << cut
528  << " emin(MeV)= " << emin
529  << " Type " << tType
530  << " for " << particle->GetParticleName()
531  << G4endl;
532  }
533 
534  G4int reg = 0;
535  if(nRegions > 1 && nEmModels > 1) { reg = idxOfRegionModels[i]; }
536  const G4RegionModels* regModels = setOfRegionModels[reg];
537  G4int nmod = regModels->NumberOfModels();
538 
539  // Calculate energy losses vector
540 
541  //G4cout << "nmod= " << nmod << G4endl;
542  size_t totBinsLoss = aVector->GetVectorLength();
543  G4double del = 0.0;
544  G4int k0 = 0;
545 
546  for(size_t j=0; j<totBinsLoss; ++j) {
547 
548  G4double e = aVector->Energy(j);
549 
550  // Choose a model of energy losses
551  G4int k = 0;
552  if (nmod > 1) {
553  k = nmod;
554  do {--k;} while (k>0 && e <= regModels->LowEdgeEnergy(k));
555  //G4cout << "k= " << k << G4endl;
556  if(k > 0 && k != k0) {
557  k0 = k;
558  G4double elow = regModels->LowEdgeEnergy(k);
559  G4double dedx1 = ComputeDEDX(models[regModels->ModelIndex(k-1)],
560  couple,elow,cut,emin);
561  G4double dedx2 = ComputeDEDX(models[regModels->ModelIndex(k)],
562  couple,elow,cut,emin);
563  del = 0.0;
564  if(dedx2 > 0.0) { del = (dedx1/dedx2 - 1.0)*elow; }
565  //G4cout << "elow= " << elow
566  // << " dedx1= " << dedx1 << " dedx2= " << dedx2 << G4endl;
567  }
568  }
569  G4double dedx =
570  ComputeDEDX(models[regModels->ModelIndex(k)],couple,e,cut,emin);
571  dedx *= (1.0 + del/e);
572 
573  if(2 < verboseLevel) {
574  G4cout << "Material= " << couple->GetMaterial()->GetName()
575  << " E(MeV)= " << e/MeV
576  << " dEdx(MeV/mm)= " << dedx*mm/MeV
577  << " del= " << del*mm/MeV<< " k= " << k
578  << " modelIdx= " << regModels->ModelIndex(k)
579  << G4endl;
580  }
581  if(dedx < 0.0) { dedx = 0.0; }
582  aVector->PutValue(j, dedx);
583  }
584 }
585 
586 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
587 
589  const G4MaterialCutsCouple* couple,
590  G4bool startFromNull,
591  G4EmTableType tType)
592 {
593  size_t i = couple->GetIndex();
594  G4double cut = (*theCuts)[i];
595  G4double tmax = DBL_MAX;
596  if (fSubRestricted == tType) {
597  tmax = cut;
598  if(theSubCuts) { cut = (*theSubCuts)[i]; }
599  }
600 
601  G4int reg = 0;
602  if(nRegions > 1 && nEmModels > 1) { reg = idxOfRegionModels[i]; }
603  const G4RegionModels* regModels = setOfRegionModels[reg];
604  G4int nmod = regModels->NumberOfModels();
605  if(1 < verboseLevel) {
606  G4cout << "G4EmModelManager::FillLambdaVector() for "
607  << particle->GetParticleName()
608  << " in " << couple->GetMaterial()->GetName()
609  << " Ecut(MeV)= " << cut
610  << " Emax(MeV)= " << tmax
611  << " Type " << tType
612  << " nmod= " << nmod
613  << G4endl;
614  }
615 
616  // Calculate lambda vector
617  size_t totBinsLambda = aVector->GetVectorLength();
618  G4double del = 0.0;
619  G4int k0 = 0;
620  G4int k = 0;
621  G4VEmModel* mod = models[regModels->ModelIndex(0)];
622  for(size_t j=0; j<totBinsLambda; ++j) {
623 
624  G4double e = aVector->Energy(j);
625 
626  // Choose a model
627  if (nmod > 1) {
628  k = nmod;
629  do {--k;} while (k>0 && e <= regModels->LowEdgeEnergy(k));
630  if(k > 0 && k != k0) {
631  k0 = k;
632  G4double elow = regModels->LowEdgeEnergy(k);
633  G4VEmModel* mod1 = models[regModels->ModelIndex(k-1)];
634  G4double xs1 = mod1->CrossSection(couple,particle,elow,cut,tmax);
635  mod = models[regModels->ModelIndex(k)];
636  G4double xs2 = mod->CrossSection(couple,particle,elow,cut,tmax);
637  del = 0.0;
638  if(xs2 > 0.0) { del = (xs1/xs2 - 1.0)*elow; }
639  //G4cout << "New model k=" << k << " E(MeV)= " << e/MeV
640  // << " Elow(MeV)= " << elow/MeV << " del= " << del << G4endl;
641  }
642  }
643  G4double cross = mod->CrossSection(couple,particle,e,cut,tmax);
644  cross *= (1.0 + del/e);
645  if(fIsCrossSectionPrim == tType) { cross *= e; }
646 
647  if(j==0 && startFromNull) { cross = 0.0; }
648 
649  if(2 < verboseLevel) {
650  G4cout << "FillLambdaVector: " << j << ". e(MeV)= " << e/MeV
651  << " cross(1/mm)= " << cross*mm
652  << " del= " << del*mm << " k= " << k
653  << " modelIdx= " << regModels->ModelIndex(k)
654  << G4endl;
655  }
656  if(cross < 0.0) { cross = 0.0; }
657  aVector->PutValue(j, cross);
658  }
659 }
660 
661 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
662 
664 {
665  if(verb == 0) { return; }
666  for(G4int i=0; i<nRegions; ++i) {
667  G4RegionModels* r = setOfRegionModels[i];
668  const G4Region* reg = r->Region();
669  G4int n = r->NumberOfModels();
670  if(n > 0) {
671  G4cout << " ===== EM models for the G4Region " << reg->GetName()
672  << " ======" << G4endl;;
673  for(G4int j=0; j<n; ++j) {
674  G4VEmModel* model = models[r->ModelIndex(j)];
675  G4double emin =
676  std::max(r->LowEdgeEnergy(j),model->LowEnergyActivationLimit());
677  G4double emax =
678  std::min(r->LowEdgeEnergy(j+1),model->HighEnergyActivationLimit());
679  G4cout << std::setw(20);
680  G4cout << model->GetName() << " : Emin= "
681  << std::setw(8) << G4BestUnit(emin,"Energy")
682  << " Emax= "
683  << std::setw(8) << G4BestUnit(emax,"Energy");
684  G4PhysicsTable* table = model->GetCrossSectionTable();
685  if(table) {
686  size_t kk = table->size();
687  for(size_t k=0; k<kk; ++k) {
688  G4PhysicsVector* v = (*table)[k];
689  if(v) {
690  G4int nn = v->GetVectorLength() - 1;
691  G4cout << " Table with " << nn << " bins Emin= "
692  << std::setw(6) << G4BestUnit(v->Energy(0),"Energy")
693  << " Emax= "
694  << std::setw(6) << G4BestUnit(v->Energy(nn),"Energy");
695  break;
696  }
697  }
698  }
700  if(an) { G4cout << " " << an->GetName(); }
701  if(fluoFlag && model->DeexcitationFlag()) { G4cout << " FluoActive"; }
702  G4cout << G4endl;
703  }
704  }
705  if(1 == nEmModels) { break; }
706  }
707 }
708 
709 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....